ZGlmZiAtLWdpdCBhL0NSRURJVFMgYi9DUkVESVRTCmluZGV4IDliZjcxNGEuLjg1YzdjNzBiNyAxMDA2NDQKLS0tIGEvQ1JFRElUUworKysgYi9DUkVESVRTCkBAIC0yNCw2ICsyNCwxMSBAQAogUzogSWFzaSA2NjAwCiBTOiBSb21hbmlhCiAKK046IE1hcmsgQWRsZXIKK0U6IG1hZGxlckBhbHVtbmkuY2FsdGVjaC5lZHUKK1c6IGh0dHA6Ly9hbHVtbnVzLmNhbHRlY2guZWR1L35tYWRsZXIvCitEOiB6bGliIGRlY29tcHJlc3Npb24KKwogTjogTW9uYWxpc2EgQWdyYXdhbAogRTogbWFncmF3YWxAbm9ydGVsbmV0d29ya3MuY29tCiBEOiBCYXNpYyBJbnRlcnBoYXNlIDU1NzUgZHJpdmVyIHdpdGggVUJSIGFuZCBBQlIgc3VwcG9ydC4KQEAgLTE1NzMsMTIgKzE1NzgsOCBAQAogUzogQ3plY2ggUmVwdWJsaWMKIAogTjogTmllbHMgS3Jpc3RpYW4gQmVjaCBKZW5zZW4KLUU6IG5rYmpAaW1hZ2UuZGsKLVc6IGh0dHA6Ly93d3cuaW1hZ2UuZGsvfm5rYmoKK0U6IG5rYmoxOTcwQGhvdG1haWwuY29tCiBEOiBNaXNjZWxsYW5lb3VzIGtlcm5lbCB1cGRhdGVzIGFuZCBmaXhlcy4KLVM6IERyLiBIb2xzdHMgVmVqIDM0LCBsZWpsLiAxNjQKLVM6IERLLTgyMzAgxWJ5aPhqCi1TOiBEZW5tYXJrCiAKIE46IE1pY2hhZWwgSy4gSm9obnNvbgogRTogam9obnNvbm1AcmVkaGF0LmNvbQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2tlcm5lbC1hcGkudG1wbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9rZXJuZWwtYXBpLnRtcGwKaW5kZXggMzFiNzI3Yy4uMzYzMGEwZCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2tlcm5lbC1hcGkudG1wbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2sva2VybmVsLWFwaS50bXBsCkBAIC02Miw2ICs2Miw4IEBACiAgICAgIDxzZWN0MT48dGl0bGU+SW50ZXJuYWwgRnVuY3Rpb25zPC90aXRsZT4KICFJa2VybmVsL2V4aXQuYwogIUlrZXJuZWwvc2lnbmFsLmMKKyFJaW5jbHVkZS9saW51eC9rdGhyZWFkLmgKKyFFa2VybmVsL2t0aHJlYWQuYwogICAgICA8L3NlY3QxPgogCiAgICAgIDxzZWN0MT48dGl0bGU+S2VybmVsIG9iamVjdHMgbWFuaXB1bGF0aW9uPC90aXRsZT4KQEAgLTExNCw2ICsxMTYsMjkgQEAKICAgICAgPC9zZWN0MT4KICAgPC9jaGFwdGVyPgogCisgIDxjaGFwdGVyIGlkPSJrZXJuZWwtbGliIj4KKyAgICAgPHRpdGxlPkJhc2ljIEtlcm5lbCBMaWJyYXJ5IEZ1bmN0aW9uczwvdGl0bGU+CisKKyAgICAgPHBhcmE+CisgICAgICAgVGhlIExpbnV4IGtlcm5lbCBwcm92aWRlcyBtb3JlIGJhc2ljIHV0aWxpdHkgZnVuY3Rpb25zLgorICAgICA8L3BhcmE+CisKKyAgICAgPHNlY3QxPjx0aXRsZT5CaXRtYXAgT3BlcmF0aW9uczwvdGl0bGU+CishRWxpYi9iaXRtYXAuYworIUlsaWIvYml0bWFwLmMKKyAgICAgPC9zZWN0MT4KKworICAgICA8c2VjdDE+PHRpdGxlPkNvbW1hbmQtbGluZSBQYXJzaW5nPC90aXRsZT4KKyFFbGliL2NtZGxpbmUuYworICAgICA8L3NlY3QxPgorCisgICAgIDxzZWN0MT48dGl0bGU+Q1JDIEZ1bmN0aW9uczwvdGl0bGU+CishRWxpYi9jcmMxNi5jCishRWxpYi9jcmMzMi5jCishRWxpYi9jcmMtY2NpdHQuYworICAgICA8L3NlY3QxPgorICA8L2NoYXB0ZXI+CisKICAgPGNoYXB0ZXIgaWQ9Im1tIj4KICAgICAgPHRpdGxlPk1lbW9yeSBNYW5hZ2VtZW50IGluIExpbnV4PC90aXRsZT4KICAgICAgPHNlY3QxPjx0aXRsZT5UaGUgU2xhYiBDYWNoZTwvdGl0bGU+CkBAIC0yODEsMTIgKzMwNiwxMyBAQAogICAgICA8c2VjdDE+PHRpdGxlPk1UUlIgSGFuZGxpbmc8L3RpdGxlPgogIUVhcmNoL2kzODYva2VybmVsL2NwdS9tdHJyL21haW4uYwogICAgICA8L3NlY3QxPgorCiAgICAgIDxzZWN0MT48dGl0bGU+UENJIFN1cHBvcnQgTGlicmFyeTwvdGl0bGU+CiAhRWRyaXZlcnMvcGNpL3BjaS5jCiAhRWRyaXZlcnMvcGNpL3BjaS1kcml2ZXIuYwogIUVkcml2ZXJzL3BjaS9yZW1vdmUuYwogIUVkcml2ZXJzL3BjaS9wY2ktYWNwaS5jCi08IS0tIGtlcm5lbGRvYyBkb2VzIG5vdCB1bmRlcnN0YW5kIHRvIF9fZGV2aW5pdAorPCEtLSBrZXJuZWxkb2MgZG9lcyBub3QgdW5kZXJzdGFuZCBfX2RldmluaXQKIFghRWRyaXZlcnMvcGNpL3NlYXJjaC5jCiAgLS0+CiAhRWRyaXZlcnMvcGNpL21zaS5jCkBAIC0zMTUsNiArMzQxLDEzIEBACiAgICAgIDwvc2VjdDE+CiAgIDwvY2hhcHRlcj4KIAorICA8Y2hhcHRlciBpZD0iZmlybXdhcmUiPgorICAgICA8dGl0bGU+RmlybXdhcmUgSW50ZXJmYWNlczwvdGl0bGU+CisgICAgIDxzZWN0MT48dGl0bGU+RE1JIEludGVyZmFjZXM8L3RpdGxlPgorIUVkcml2ZXJzL2Zpcm13YXJlL2RtaV9zY2FuLmMKKyAgICAgPC9zZWN0MT4KKyAgPC9jaGFwdGVyPgorCiAgIDxjaGFwdGVyIGlkPSJkZXZmcyI+CiAgICAgIDx0aXRsZT5UaGUgRGV2aWNlIEZpbGUgU3lzdGVtPC90aXRsZT4KICFFZnMvZGV2ZnMvYmFzZS5jCkBAIC00MDMsNyArNDM2LDYgQEAKICAgICAgPC9zZWN0MT4KICAgPC9jaGFwdGVyPgogCi0KICAgPGNoYXB0ZXIgaWQ9ImJsa2RldiI+CiAgICAgIDx0aXRsZT5CbG9jayBEZXZpY2VzPC90aXRsZT4KICFFYmxvY2svbGxfcndfYmxrLmMKQEAgLTQxNCw2ICs0NDYsMTQgQEAKICFFZHJpdmVycy9jaGFyL21pc2MuYwogICA8L2NoYXB0ZXI+CiAKKyAgPGNoYXB0ZXIgaWQ9InBhcnBvcnRkZXYiPgorICAgICA8dGl0bGU+UGFyYWxsZWwgUG9ydCBEZXZpY2VzPC90aXRsZT4KKyFJaW5jbHVkZS9saW51eC9wYXJwb3J0LmgKKyFFZHJpdmVycy9wYXJwb3J0L2llZWUxMjg0LmMKKyFFZHJpdmVycy9wYXJwb3J0L3NoYXJlLmMKKyFJZHJpdmVycy9wYXJwb3J0L2RhaXN5LmMKKyAgPC9jaGFwdGVyPgorCiAgIDxjaGFwdGVyIGlkPSJ2aWRkZXYiPgogICAgICA8dGl0bGU+VmlkZW80TGludXg8L3RpdGxlPgogIUVkcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvZGV2LmMKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9rZXJuZWwtbG9ja2luZy50bXBsIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2tlcm5lbC1sb2NraW5nLnRtcGwKaW5kZXggMTU4ZmZlOS4uNjQ0YzM4OCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2tlcm5lbC1sb2NraW5nLnRtcGwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2tlcm5lbC1sb2NraW5nLnRtcGwKQEAgLTE1OTAsNyArMTU5MCw3IEBACiAgICAgPHBhcmE+CiAgICAgICBPdXIgZmluYWwgZGlsZW1tYSBpcyB0aGlzOiB3aGVuIGNhbiB3ZSBhY3R1YWxseSBkZXN0cm95IHRoZQogICAgICAgcmVtb3ZlZCBlbGVtZW50PyAgUmVtZW1iZXIsIGEgcmVhZGVyIG1pZ2h0IGJlIHN0ZXBwaW5nIHRocm91Z2gKLSAgICAgIHRoaXMgZWxlbWVudCBpbiB0aGUgbGlzdCByaWdodCBub3c6IGl0IHdlIGZyZWUgdGhpcyBlbGVtZW50IGFuZAorICAgICAgdGhpcyBlbGVtZW50IGluIHRoZSBsaXN0IHJpZ2h0IG5vdzogaWYgd2UgZnJlZSB0aGlzIGVsZW1lbnQgYW5kCiAgICAgICB0aGUgPHN5bWJvbD5uZXh0PC9zeW1ib2w+IHBvaW50ZXIgY2hhbmdlcywgdGhlIHJlYWRlciB3aWxsIGp1bXAKICAgICAgIG9mZiBpbnRvIGdhcmJhZ2UgYW5kIGNyYXNoLiAgV2UgbmVlZCB0byB3YWl0IHVudGlsIHdlIGtub3cgdGhhdAogICAgICAgYWxsIHRoZSByZWFkZXJzIHdobyB3ZXJlIHRyYXZlcnNpbmcgdGhlIGxpc3Qgd2hlbiB3ZSBkZWxldGVkIHRoZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9SQ1UvY2hlY2tsaXN0LnR4dCBiL0RvY3VtZW50YXRpb24vUkNVL2NoZWNrbGlzdC50eHQKaW5kZXggNDllMjdjYy4uMWQ1MGNmMCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9SQ1UvY2hlY2tsaXN0LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL1JDVS9jaGVja2xpc3QudHh0CkBAIC0xNDQsOSArMTQ0LDQ3IEBACiAJd2hldGhlciB0aGUgaW5jcmVhc2VkIHNwZWVkIGlzIHdvcnRoIGl0LgogCiA4LglBbHRob3VnaCBzeW5jaHJvbml6ZV9yY3UoKSBpcyBhIGJpdCBzbG93ZXIgdGhhbiBpcyBjYWxsX3JjdSgpLAotCWl0IHVzdWFsbHkgcmVzdWx0cyBpbiBzaW1wbGVyIGNvZGUuICBTbywgdW5sZXNzIHVwZGF0ZSBwZXJmb3JtYW5jZQotCWlzIGltcG9ydGFudCBvciB0aGUgdXBkYXRlcnMgY2Fubm90IGJsb2NrLCBzeW5jaHJvbml6ZV9yY3UoKQotCXNob3VsZCBiZSB1c2VkIGluIHByZWZlcmVuY2UgdG8gY2FsbF9yY3UoKS4KKwlpdCB1c3VhbGx5IHJlc3VsdHMgaW4gc2ltcGxlciBjb2RlLiAgU28sIHVubGVzcyB1cGRhdGUKKwlwZXJmb3JtYW5jZSBpcyBjcml0aWNhbGx5IGltcG9ydGFudCBvciB0aGUgdXBkYXRlcnMgY2Fubm90IGJsb2NrLAorCXN5bmNocm9uaXplX3JjdSgpIHNob3VsZCBiZSB1c2VkIGluIHByZWZlcmVuY2UgdG8gY2FsbF9yY3UoKS4KKworCUFuIGVzcGVjaWFsbHkgaW1wb3J0YW50IHByb3BlcnR5IG9mIHRoZSBzeW5jaHJvbml6ZV9yY3UoKQorCXByaW1pdGl2ZSBpcyB0aGF0IGl0IGF1dG9tYXRpY2FsbHkgc2VsZi1saW1pdHM6IGlmIGdyYWNlIHBlcmlvZHMKKwlhcmUgZGVsYXllZCBmb3Igd2hhdGV2ZXIgcmVhc29uLCB0aGVuIHRoZSBzeW5jaHJvbml6ZV9yY3UoKQorCXByaW1pdGl2ZSB3aWxsIGNvcnJlc3BvbmRpbmdseSBkZWxheSB1cGRhdGVzLiAgSW4gY29udHJhc3QsCisJY29kZSB1c2luZyBjYWxsX3JjdSgpIHNob3VsZCBleHBsaWNpdGx5IGxpbWl0IHVwZGF0ZSByYXRlIGluCisJY2FzZXMgd2hlcmUgZ3JhY2UgcGVyaW9kcyBhcmUgZGVsYXllZCwgYXMgZmFpbGluZyB0byBkbyBzbyBjYW4KKwlyZXN1bHQgaW4gZXhjZXNzaXZlIHJlYWx0aW1lIGxhdGVuY2llcyBvciBldmVuIE9PTSBjb25kaXRpb25zLgorCisJV2F5cyBvZiBnYWluaW5nIHRoaXMgc2VsZi1saW1pdGluZyBwcm9wZXJ0eSB3aGVuIHVzaW5nIGNhbGxfcmN1KCkKKwlpbmNsdWRlOgorCisJYS4JS2VlcGluZyBhIGNvdW50IG9mIHRoZSBudW1iZXIgb2YgZGF0YS1zdHJ1Y3R1cmUgZWxlbWVudHMKKwkJdXNlZCBieSB0aGUgUkNVLXByb3RlY3RlZCBkYXRhIHN0cnVjdHVyZSwgaW5jbHVkaW5nIHRob3NlCisJCXdhaXRpbmcgZm9yIGEgZ3JhY2UgcGVyaW9kIHRvIGVsYXBzZS4gIEVuZm9yY2UgYSBsaW1pdAorCQlvbiB0aGlzIG51bWJlciwgc3RhbGxpbmcgdXBkYXRlcyBhcyBuZWVkZWQgdG8gYWxsb3cKKwkJcHJldmlvdXNseSBkZWZlcnJlZCBmcmVlcyB0byBjb21wbGV0ZS4KKworCQlBbHRlcm5hdGl2ZWx5LCBsaW1pdCBvbmx5IHRoZSBudW1iZXIgYXdhaXRpbmcgZGVmZXJyZWQKKwkJZnJlZSByYXRoZXIgdGhhbiB0aGUgdG90YWwgbnVtYmVyIG9mIGVsZW1lbnRzLgorCisJYi4JTGltaXRpbmcgdXBkYXRlIHJhdGUuICBGb3IgZXhhbXBsZSwgaWYgdXBkYXRlcyBvY2N1ciBvbmx5CisJCW9uY2UgcGVyIGhvdXIsIHRoZW4gbm8gZXhwbGljaXQgcmF0ZSBsaW1pdGluZyBpcyByZXF1aXJlZCwKKwkJdW5sZXNzIHlvdXIgc3lzdGVtIGlzIGFscmVhZHkgYmFkbHkgYnJva2VuLiAgVGhlIGRjYWNoZQorCQlzdWJzeXN0ZW0gdGFrZXMgdGhpcyBhcHByb2FjaCAtLSB1cGRhdGVzIGFyZSBndWFyZGVkCisJCWJ5IGEgZ2xvYmFsIGxvY2ssIGxpbWl0aW5nIHRoZWlyIHJhdGUuCisKKwljLglUcnVzdGVkIHVwZGF0ZSAtLSBpZiB1cGRhdGVzIGNhbiBvbmx5IGJlIGRvbmUgbWFudWFsbHkgYnkKKwkJc3VwZXJ1c2VyIG9yIHNvbWUgb3RoZXIgdHJ1c3RlZCB1c2VyLCB0aGVuIGl0IG1pZ2h0IG5vdAorCQliZSBuZWNlc3NhcnkgdG8gYXV0b21hdGljYWxseSBsaW1pdCB0aGVtLiAgVGhlIHRoZW9yeQorCQloZXJlIGlzIHRoYXQgc3VwZXJ1c2VyIGFscmVhZHkgaGFzIGxvdHMgb2Ygd2F5cyB0byBjcmFzaAorCQl0aGUgbWFjaGluZS4KKworCWQuCVVzZSBjYWxsX3JjdV9iaCgpIHJhdGhlciB0aGFuIGNhbGxfcmN1KCksIGluIG9yZGVyIHRvIHRha2UKKwkJYWR2YW50YWdlIG9mIGNhbGxfcmN1X2JoKCkncyBmYXN0ZXIgZ3JhY2UgcGVyaW9kcy4KKworCWUuCVBlcmlvZGljYWxseSBpbnZva2Ugc3luY2hyb25pemVfcmN1KCksIHBlcm1pdHRpbmcgYSBsaW1pdGVkCisJCW51bWJlciBvZiB1cGRhdGVzIHBlciBncmFjZSBwZXJpb2QuCiAKIDkuCUFsbCBSQ1UgbGlzdC10cmF2ZXJzYWwgcHJpbWl0aXZlcywgd2hpY2ggaW5jbHVkZQogCWxpc3RfZm9yX2VhY2hfcmN1KCksIGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KCksCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL1JDVS93aGF0aXNSQ1UudHh0IGIvRG9jdW1lbnRhdGlvbi9SQ1Uvd2hhdGlzUkNVLnR4dAppbmRleCA2ZTQ1OTQyLi40ZjQxYTYwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL1JDVS93aGF0aXNSQ1UudHh0CisrKyBiL0RvY3VtZW50YXRpb24vUkNVL3doYXRpc1JDVS50eHQKQEAgLTE4NCw3ICsxODQsMTcgQEAKIAlibG9ja2luZywgaXQgcmVnaXN0ZXJzIGEgZnVuY3Rpb24gYW5kIGFyZ3VtZW50IHdoaWNoIGFyZSBpbnZva2VkCiAJYWZ0ZXIgYWxsIG9uZ29pbmcgUkNVIHJlYWQtc2lkZSBjcml0aWNhbCBzZWN0aW9ucyBoYXZlIGNvbXBsZXRlZC4KIAlUaGlzIGNhbGxiYWNrIHZhcmlhbnQgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCBpbiBzaXR1YXRpb25zIHdoZXJlCi0JaXQgaXMgaWxsZWdhbCB0byBibG9jay4KKwlpdCBpcyBpbGxlZ2FsIHRvIGJsb2NrIG9yIHdoZXJlIHVwZGF0ZS1zaWRlIHBlcmZvcm1hbmNlIGlzCisJY3JpdGljYWxseSBpbXBvcnRhbnQuCisKKwlIb3dldmVyLCB0aGUgY2FsbF9yY3UoKSBBUEkgc2hvdWxkIG5vdCBiZSB1c2VkIGxpZ2h0bHksIGFzIHVzZQorCW9mIHRoZSBzeW5jaHJvbml6ZV9yY3UoKSBBUEkgZ2VuZXJhbGx5IHJlc3VsdHMgaW4gc2ltcGxlciBjb2RlLgorCUluIGFkZGl0aW9uLCB0aGUgc3luY2hyb25pemVfcmN1KCkgQVBJIGhhcyB0aGUgbmljZSBwcm9wZXJ0eQorCW9mIGF1dG9tYXRpY2FsbHkgbGltaXRpbmcgdXBkYXRlIHJhdGUgc2hvdWxkIGdyYWNlIHBlcmlvZHMKKwliZSBkZWxheWVkLiAgVGhpcyBwcm9wZXJ0eSByZXN1bHRzIGluIHN5c3RlbSByZXNpbGllbmNlIGluIGZhY2UKKwlvZiBkZW5pYWwtb2Ytc2VydmljZSBhdHRhY2tzLiAgQ29kZSB1c2luZyBjYWxsX3JjdSgpIHNob3VsZCBsaW1pdAorCXVwZGF0ZSByYXRlIGluIG9yZGVyIHRvIGdhaW4gdGhpcyBzYW1lIHNvcnQgb2YgcmVzaWxpZW5jZS4gIFNlZQorCWNoZWNrbGlzdC50eHQgZm9yIHNvbWUgYXBwcm9hY2hlcyB0byBsaW1pdGluZyB0aGUgdXBkYXRlIHJhdGUuCiAKIHJjdV9hc3NpZ25fcG9pbnRlcigpCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYXRvbWljX29wcy50eHQgYi9Eb2N1bWVudGF0aW9uL2F0b21pY19vcHMudHh0CmluZGV4IDIzYTFjMjQuLjJhNjNkNTYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vYXRvbWljX29wcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9hdG9taWNfb3BzLnR4dApAQCAtMTU3LDEzICsxNTcsMTMgQEAKIAlzbXBfbWJfX2JlZm9yZV9hdG9taWNfZGVjKCk7CiAJYXRvbWljX2RlYygmb2JqLT5yZWZfY291bnQpOwogCi1JdCBtYWtlcyBzdXJlIHRoYXQgYWxsIG1lbW9yeSBvcGVyYXRpb25zIHByZWNlZWRpbmcgdGhlIGF0b21pY19kZWMoKQorSXQgbWFrZXMgc3VyZSB0aGF0IGFsbCBtZW1vcnkgb3BlcmF0aW9ucyBwcmVjZWRpbmcgdGhlIGF0b21pY19kZWMoKQogY2FsbCBhcmUgc3Ryb25nbHkgb3JkZXJlZCB3aXRoIHJlc3BlY3QgdG8gdGhlIGF0b21pYyBjb3VudGVyCi1vcGVyYXRpb24uICBJbiB0aGUgYWJvdmUgZXhhbXBsZSwgaXQgZ3VhcmVudGVlcyB0aGF0IHRoZSBhc3NpZ25tZW50IG9mCitvcGVyYXRpb24uICBJbiB0aGUgYWJvdmUgZXhhbXBsZSwgaXQgZ3VhcmFudGVlcyB0aGF0IHRoZSBhc3NpZ25tZW50IG9mCiAiMSIgdG8gb2JqLT5kZWFkIHdpbGwgYmUgZ2xvYmFsbHkgdmlzaWJsZSB0byBvdGhlciBjcHVzIGJlZm9yZSB0aGUKIGF0b21pYyBjb3VudGVyIGRlY3JlbWVudC4KIAotV2l0aG91dCB0aGUgZXhwbGljaXRsIHNtcF9tYl9fYmVmb3JlX2F0b21pY19kZWMoKSBjYWxsLCB0aGUKK1dpdGhvdXQgdGhlIGV4cGxpY2l0IHNtcF9tYl9fYmVmb3JlX2F0b21pY19kZWMoKSBjYWxsLCB0aGUKIGltcGxlbWVudGF0aW9uIGNvdWxkIGxlZ2FsbHkgYWxsb3cgdGhlIGF0b21pYyBjb3VudGVyIHVwZGF0ZSB2aXNpYmxlCiB0byBvdGhlciBjcHVzIGJlZm9yZSB0aGUgIm9iai0+ZGVhZCA9IDE7IiBhc3NpZ25tZW50LgogCkBAIC0xNzMsMTEgKzE3MywxMSBAQAogKHNtcF9tYl9fe2JlZm9yZSxhZnRlcn1fYXRvbWljX2luYygpKS4KIAogQSBtaXNzaW5nIG1lbW9yeSBiYXJyaWVyIGluIHRoZSBjYXNlcyB3aGVyZSB0aGV5IGFyZSByZXF1aXJlZCBieSB0aGUKLWF0b21pY190IGltcGxlbWVudGF0aW9uIGFib3ZlIGNhbiBoYXZlIGRpc2FzdGVyb3VzIHJlc3VsdHMuICBIZXJlIGlzCi1hbiBleGFtcGxlLCB3aGljaCBmb2xsb3dzIGEgcGF0dGVybiBvY2N1cmluZyBmcmVxdWVudGx5IGluIHRoZSBMaW51eAorYXRvbWljX3QgaW1wbGVtZW50YXRpb24gYWJvdmUgY2FuIGhhdmUgZGlzYXN0cm91cyByZXN1bHRzLiAgSGVyZSBpcworYW4gZXhhbXBsZSwgd2hpY2ggZm9sbG93cyBhIHBhdHRlcm4gb2NjdXJyaW5nIGZyZXF1ZW50bHkgaW4gdGhlIExpbnV4CiBrZXJuZWwuICBJdCBpcyB0aGUgdXNlIG9mIGF0b21pYyBjb3VudGVycyB0byBpbXBsZW1lbnQgcmVmZXJlbmNlCiBjb3VudGluZywgYW5kIGl0IHdvcmtzIHN1Y2ggdGhhdCBvbmNlIHRoZSBjb3VudGVyIGZhbGxzIHRvIHplcm8gaXQgY2FuCi1iZSBndWFyZW50ZWVkIHRoYXQgbm8gb3RoZXIgZW50aXR5IGNhbiBiZSBhY2Nlc3NpbmcgdGhlIG9iamVjdDoKK2JlIGd1YXJhbnRlZWQgdGhhdCBubyBvdGhlciBlbnRpdHkgY2FuIGJlIGFjY2Vzc2luZyB0aGUgb2JqZWN0OgogCiBzdGF0aWMgdm9pZCBvYmpfbGlzdF9hZGQoc3RydWN0IG9iaiAqb2JqKQogewpAQCAtMjkxLDkgKzI5MSw5IEBACiBzaXplLiAgVGhlIGVuZGlhbm5lc3Mgb2YgdGhlIGJpdHMgd2l0aGluIGVhY2ggInVuc2lnbmVkIGxvbmciIGFyZSB0aGUKIG5hdGl2ZSBlbmRpYW5uZXNzIG9mIHRoZSBjcHUuCiAKLQl2b2lkIHNldF9iaXQodW5zaWduZWQgbG9uZyBuciwgdm9sYXRpbHMgdW5zaWduZWQgbG9uZyAqYWRkcik7Ci0Jdm9pZCBjbGVhcl9iaXQodW5zaWduZWQgbG9uZyBuciwgdm9sYXRpbHMgdW5zaWduZWQgbG9uZyAqYWRkcik7Ci0Jdm9pZCBjaGFuZ2VfYml0KHVuc2lnbmVkIGxvbmcgbnIsIHZvbGF0aWxzIHVuc2lnbmVkIGxvbmcgKmFkZHIpOworCXZvaWQgc2V0X2JpdCh1bnNpZ25lZCBsb25nIG5yLCB2b2xhdGlsZSB1bnNpZ25lZCBsb25nICphZGRyKTsKKwl2b2lkIGNsZWFyX2JpdCh1bnNpZ25lZCBsb25nIG5yLCB2b2xhdGlsZSB1bnNpZ25lZCBsb25nICphZGRyKTsKKwl2b2lkIGNoYW5nZV9iaXQodW5zaWduZWQgbG9uZyBuciwgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqYWRkcik7CiAKIFRoZXNlIHJvdXRpbmVzIHNldCwgY2xlYXIsIGFuZCBjaGFuZ2UsIHJlc3BlY3RpdmVseSwgdGhlIGJpdCBudW1iZXIKIGluZGljYXRlZCBieSAibnIiIG9uIHRoZSBiaXQgbWFzayBwb2ludGVkIHRvIGJ5ICJBRERSIi4KQEAgLTMwMSw5ICszMDEsOSBAQAogVGhleSBtdXN0IGV4ZWN1dGUgYXRvbWljYWxseSwgeWV0IHRoZXJlIGFyZSBubyBpbXBsaWNpdCBtZW1vcnkgYmFycmllcgogc2VtYW50aWNzIHJlcXVpcmVkIG9mIHRoZXNlIGludGVyZmFjZXMuCiAKLQlpbnQgdGVzdF9hbmRfc2V0X2JpdCh1bnNpZ25lZCBsb25nIG5yLCB2b2xhdGlscyB1bnNpZ25lZCBsb25nICphZGRyKTsKLQlpbnQgdGVzdF9hbmRfY2xlYXJfYml0KHVuc2lnbmVkIGxvbmcgbnIsIHZvbGF0aWxzIHVuc2lnbmVkIGxvbmcgKmFkZHIpOwotCWludCB0ZXN0X2FuZF9jaGFuZ2VfYml0KHVuc2lnbmVkIGxvbmcgbnIsIHZvbGF0aWxzIHVuc2lnbmVkIGxvbmcgKmFkZHIpOworCWludCB0ZXN0X2FuZF9zZXRfYml0KHVuc2lnbmVkIGxvbmcgbnIsIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmFkZHIpOworCWludCB0ZXN0X2FuZF9jbGVhcl9iaXQodW5zaWduZWQgbG9uZyBuciwgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqYWRkcik7CisJaW50IHRlc3RfYW5kX2NoYW5nZV9iaXQodW5zaWduZWQgbG9uZyBuciwgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqYWRkcik7CiAKIExpa2UgdGhlIGFib3ZlLCBleGNlcHQgdGhhdCB0aGVzZSByb3V0aW5lcyByZXR1cm4gYSBib29sZWFuIHdoaWNoCiBpbmRpY2F0ZXMgd2hldGhlciB0aGUgY2hhbmdlZCBiaXQgd2FzIHNldCBfQkVGT1JFXyB0aGUgYXRvbWljIGJpdApAQCAtMzM1LDcgKzMzNSw3IEBACiAJCS8qIC4uLiAqLzsKIAlvYmotPmtpbGxlZCA9IDE7CiAKLVRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0ZXN0X2FuZF9zZXRfYml0KCkgbXVzdCBndWFyZW50ZWUgdGhhdAorVGhlIGltcGxlbWVudGF0aW9uIG9mIHRlc3RfYW5kX3NldF9iaXQoKSBtdXN0IGd1YXJhbnRlZSB0aGF0CiAib2JqLT5kZWFkID0gMTsiIGlzIHZpc2libGUgdG8gY3B1cyBiZWZvcmUgdGhlIGF0b21pYyBtZW1vcnkgb3BlcmF0aW9uCiBkb25lIGJ5IHRlc3RfYW5kX3NldF9iaXQoKSBiZWNvbWVzIHZpc2libGUuICBMaWtld2lzZSwgdGhlIGF0b21pYwogbWVtb3J5IG9wZXJhdGlvbiBkb25lIGJ5IHRlc3RfYW5kX3NldF9iaXQoKSBtdXN0IGJlY29tZSB2aXNpYmxlIGJlZm9yZQpAQCAtNDc0LDcgKzQ3NCw3IEBACiBzdHJpY3RseSBvcmRlcnMgYWxsIHN1YnNlcXVlbnQgbWVtb3J5IG9wZXJhdGlvbnMgKGluY2x1ZGluZwogdGhlIGNhcygpKSB3aXRoIHJlc3BlY3QgdG8gaXRzZWxmLCB0aGluZ3Mgd2lsbCBiZSBmaW5lLgogCi1TYWlkIGFub3RoZXIgd2F5LCBfYXRvbWljX2RlY19hbmRfbG9jaygpIG11c3QgZ3VhcmVudGVlIHRoYXQKK1NhaWQgYW5vdGhlciB3YXksIF9hdG9taWNfZGVjX2FuZF9sb2NrKCkgbXVzdCBndWFyYW50ZWUgdGhhdAogYSBjb3VudGVyIGRyb3BwaW5nIHRvIHplcm8gaXMgbmV2ZXIgbWFkZSB2aXNpYmxlIGJlZm9yZSB0aGUKIHNwaW5sb2NrIGJlaW5nIGFjcXVpcmVkLgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2NvbnNvbGUvY29uc29sZS50eHQgYi9Eb2N1bWVudGF0aW9uL2NvbnNvbGUvY29uc29sZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNlMTc0NAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vY29uc29sZS9jb25zb2xlLnR4dApAQCAtMCwwICsxLDE0NCBAQAorQ29uc29sZSBEcml2ZXJzCis9PT09PT09PT09PT09PT0KKworVGhlIGxpbnV4IGtlcm5lbCBoYXMgMiBnZW5lcmFsIHR5cGVzIG9mIGNvbnNvbGUgZHJpdmVycy4gIFRoZSBmaXJzdCB0eXBlIGlzCithc3NpZ25lZCBieSB0aGUga2VybmVsIHRvIGFsbCB0aGUgdmlydHVhbCBjb25zb2xlcyBkdXJpbmcgdGhlIGJvb3QgcHJvY2Vzcy4KK1RoaXMgdHlwZSB3aWxsIGJlIGNhbGxlZCAnc3lzdGVtIGRyaXZlcicsIGFuZCBvbmx5IG9uZSBzeXN0ZW0gZHJpdmVyIGlzIGFsbG93ZWQKK3RvIGV4aXN0LiBUaGUgc3lzdGVtIGRyaXZlciBpcyBwZXJzaXN0ZW50IGFuZCBpdCBjYW4gbmV2ZXIgYmUgdW5sb2FkZWQsIHRob3VnaAoraXQgbWF5IGJlY29tZSBpbmFjdGl2ZS4KKworVGhlIHNlY29uZCB0eXBlIGhhcyB0byBiZSBleHBsaWNpdGx5IGxvYWRlZCBhbmQgdW5sb2FkZWQuIFRoaXMgd2lsbCBiZSBjYWxsZWQKKydtb2R1bGFyIGRyaXZlcicgYnkgdGhpcyBkb2N1bWVudC4gTXVsdGlwbGUgbW9kdWxhciBkcml2ZXJzIGNhbiBjb2V4aXN0IGF0CithbnkgdGltZSB3aXRoIGVhY2ggZHJpdmVyIHNoYXJpbmcgdGhlIGNvbnNvbGUgd2l0aCBvdGhlciBkcml2ZXJzIGluY2x1ZGluZwordGhlIHN5c3RlbSBkcml2ZXIuIEhvd2V2ZXIsIG1vZHVsYXIgZHJpdmVycyBjYW5ub3QgdGFrZSBvdmVyIHRoZSBjb25zb2xlCit0aGF0IGlzIGN1cnJlbnRseSBvY2N1cGllZCBieSBhbm90aGVyIG1vZHVsYXIgZHJpdmVyLiAoRXhjZXB0aW9uOiBEcml2ZXJzIHRoYXQKK2NhbGwgdGFrZV9vdmVyX2NvbnNvbGUoKSB3aWxsIHN1Y2NlZWQgaW4gdGhlIHRha2VvdmVyIHJlZ2FyZGxlc3Mgb2YgdGhlIHR5cGUKK29mIGRyaXZlciBvY2N1cHlpbmcgdGhlIGNvbnNvbGVzLikgVGhleSBjYW4gb25seSB0YWtlIG92ZXIgdGhlIGNvbnNvbGUgdGhhdCBpcworb2NjdXBpZWQgYnkgdGhlIHN5c3RlbSBkcml2ZXIuIEluIHRoZSBzYW1lIHRva2VuLCBpZiB0aGUgbW9kdWxhciBkcml2ZXIgaXMKK3JlbGVhc2VkIGJ5IHRoZSBjb25zb2xlLCB0aGUgc3lzdGVtIGRyaXZlciB3aWxsIHRha2Ugb3Zlci4KKworTW9kdWxhciBkcml2ZXJzLCBmcm9tIHRoZSBwcm9ncmFtbWVyJ3MgcG9pbnQgb2YgdmlldywgaGFzIHRvIGNhbGw6CisKKwkgdGFrZV9vdmVyX2NvbnNvbGUoKSAtIGxvYWQgYW5kIGJpbmQgZHJpdmVyIHRvIGNvbnNvbGUgbGF5ZXIKKwkgZ2l2ZV91cF9jb25zb2xlKCkgLSB1bmJpbmQgYW5kIHVubG9hZCBkcml2ZXIKKworSW4gbmV3ZXIga2VybmVscywgdGhlIGZvbGxvd2luZyBhcmUgYWxzbyBhdmFpbGFibGU6CisKKwkgcmVnaXN0ZXJfY29uX2RyaXZlcigpCisJIHVucmVnaXN0ZXJfY29uX2RyaXZlcigpCisKK0lmIHN5c2ZzIGlzIGVuYWJsZWQsIHRoZSBjb250ZW50cyBvZiAvc3lzL2NsYXNzL3Z0Y29uc29sZSBjYW4gYmUKK2V4YW1pbmVkLiBUaGlzIHNob3dzIHRoZSBjb25zb2xlIGJhY2tlbmRzIGN1cnJlbnRseSByZWdpc3RlcmVkIGJ5IHRoZQorc3lzdGVtIHdoaWNoIGFyZSBuYW1lZCB2dGNvbjxuPiB3aGVyZSA8bj4gaXMgYW4gaW50ZWdlciBmcm8gMCB0byAxNS4gVGh1czoKKworICAgICAgIGxzIC9zeXMvY2xhc3MvdnRjb25zb2xlCisgICAgICAgLiAgLi4gIHZ0Y29uMCAgdnRjb24xCisKK0VhY2ggZGlyZWN0b3J5IGluIC9zeXMvY2xhc3MvdnRjb25zb2xlIGhhcyAzIGZpbGVzOgorCisgICAgIGxzIC9zeXMvY2xhc3MvdnRjb25zb2xlL3Z0Y29uMAorICAgICAuICAuLiAgYmluZCAgbmFtZSAgdWV2ZW50CisKK1doYXQgZG8gdGhlc2UgZmlsZXMgc2lnbmlmeT8KKworICAgICAxLiBiaW5kIC0gdGhpcyBpcyBhIHJlYWQvd3JpdGUgZmlsZS4gSXQgc2hvd3MgdGhlIHN0YXR1cyBvZiB0aGUgZHJpdmVyIGlmCisgICAgICAgIHJlYWQsIG9yIGFjdHMgdG8gYmluZCBvciB1bmJpbmQgdGhlIGRyaXZlciB0byB0aGUgdmlydHVhbCBjb25zb2xlcworICAgICAgICB3aGVuIHdyaXR0ZW4gdG8uIFRoZSBwb3NzaWJsZSB2YWx1ZXMgYXJlOgorCisJMCAtIG1lYW5zIHRoZSBkcml2ZXIgaXMgbm90IGJvdW5kIGFuZCBpZiBlY2hvJ2VkLCBjb21tYW5kcyB0aGUgZHJpdmVyCisJICAgIHRvIHVuYmluZAorCisgICAgICAgIDEgLSBtZWFucyB0aGUgZHJpdmVyIGlzIGJvdW5kIGFuZCBpZiBlY2hvJ2VkLCBjb21tYW5kcyB0aGUgZHJpdmVyIHRvCisJICAgIGJpbmQKKworICAgICAyLiBuYW1lIC0gcmVhZC1vbmx5IGZpbGUuIFNob3dzIHRoZSBuYW1lIG9mIHRoZSBkcml2ZXIgaW4gdGhpcyBmb3JtYXQ6CisKKwljYXQgL3N5cy9jbGFzcy92dGNvbnNvbGUvdnRjb24wL25hbWUKKwkoUykgVkdBKworCisJICAgICcoUyknIHN0YW5kcyBmb3IgYSAoUyl5c3RlbSBkcml2ZXIsIGllLCBpdCBjYW5ub3QgYmUgZGlyZWN0bHkKKwkgICAgY29tbWFuZGVkIHRvIGJpbmQgb3IgdW5iaW5kCisKKwkgICAgJ1ZHQSsnIGlzIHRoZSBuYW1lIG9mIHRoZSBkcml2ZXIKKworCWNhdCAvc3lzL2NsYXNzL3Z0Y29uc29sZS92dGNvbjEvbmFtZQorCShNKSBmcmFtZSBidWZmZXIgZGV2aWNlCisKKwkgICAgSW4gdGhpcyBjYXNlLCAnKE0pJyBzdGFuZHMgZm9yIGEgKE0pb2R1bGFyIGRyaXZlciwgb25lIHRoYXQgY2FuIGJlCisJICAgIGRpcmVjdGx5IGNvbW1hbmRlZCB0byBiaW5kIG9yIHVuYmluZC4KKworICAgICAzLiB1ZXZlbnQgLSBpZ25vcmUgdGhpcyBmaWxlCisKK1doZW4gdW5iaW5kaW5nLCB0aGUgbW9kdWxhciBkcml2ZXIgaXMgZGV0YWNoZWQgZmlyc3QsIGFuZCB0aGVuIHRoZSBzeXN0ZW0KK2RyaXZlciB0YWtlcyBvdmVyIHRoZSBjb25zb2xlcyB2YWNhdGVkIGJ5IHRoZSBkcml2ZXIuIEJpbmRpbmcsIG9uIHRoZSBvdGhlcgoraGFuZCwgd2lsbCBiaW5kIHRoZSBkcml2ZXIgdG8gdGhlIGNvbnNvbGVzIHRoYXQgYXJlIGN1cnJlbnRseSBvY2N1cGllZCBieSBhCitzeXN0ZW0gZHJpdmVyLgorCitOT1RFMTogQmluZGluZyBhbmQgYmluZGluZyBtdXN0IGJlIHNlbGVjdGVkIGluIEtjb25maWcuIEl0J3MgdW5kZXI6CisKK0RldmljZSBEcml2ZXJzIC0+IENoYXJhY3RlciBkZXZpY2VzIC0+IFN1cHBvcnQgZm9yIGJpbmRpbmcgYW5kIHVuYmluZGluZworY29uc29sZSBkcml2ZXJzCisKK05PVEUyOiBJZiBhbnkgb2YgdGhlIHZpcnR1YWwgY29uc29sZXMgYXJlIGluIEtEX0dSQVBISUNTIG1vZGUsIHRoZW4gYmluZGluZyBvcgordW5iaW5kaW5nIHdpbGwgbm90IHN1Y2NlZWQuIEFuIGV4YW1wbGUgb2YgYW4gYXBwbGljYXRpb24gdGhhdCBzZXRzIHRoZSBjb25zb2xlCit0byBLRF9HUkFQSElDUyBpcyBYLgorCitIb3cgdXNlZnVsIGlzIHRoaXMgZmVhdHVyZT8gVGhpcyBpcyB2ZXJ5IHVzZWZ1bCBmb3IgY29uc29sZSBkcml2ZXIKK2RldmVsb3BlcnMuIEJ5IHVuYmluZGluZyB0aGUgZHJpdmVyIGZyb20gdGhlIGNvbnNvbGUgbGF5ZXIsIG9uZSBjYW4gdW5sb2FkIHRoZQorZHJpdmVyLCBtYWtlIGNoYW5nZXMsIHJlY29tcGlsZSwgcmVsb2FkIGFuZCByZWJpbmQgdGhlIGRyaXZlciB3aXRob3V0IGFueSBuZWVkCitmb3IgcmVib290aW5nIHRoZSBrZXJuZWwuIEZvciByZWd1bGFyIHVzZXJzIHdobyBtYXkgd2FudCB0byBzd2l0Y2ggZnJvbQorZnJhbWVidWZmZXIgY29uc29sZSB0byBWR0EgY29uc29sZSBhbmQgdmljZSB2ZXJzYSwgdGhpcyBmZWF0dXJlIGFsc28gbWFrZXMKK3RoaXMgcG9zc2libGUuIChOT1RFIE5PVEUgTk9URTogUGxlYXNlIHJlYWQgZmJjb24udHh0IHVuZGVyIERvY3VtZW50YXRpb24vZmIKK2ZvciBtb3JlIGRldGFpbHMpLgorCitOb3RlcyBmb3IgZGV2ZWxvcGVyczoKKz09PT09PT09PT09PT09PT09PT09PQorCit0YWtlX292ZXJfY29uc29sZSgpIGlzIG5vdyBicm9rZW4gdXAgaW50bzoKKworICAgICByZWdpc3Rlcl9jb25fZHJpdmVyKCkKKyAgICAgYmluZF9jb25fZHJpdmVyKCkgLSBwcml2YXRlIGZ1bmN0aW9uCisKK2dpdmVfdXBfY29uc29sZSgpIGlzIGEgd3JhcHBlciB0byB1bnJlZ2lzdGVyX2Nvbl9kcml2ZXIoKSwgYW5kIGEgZHJpdmVyIG11c3QKK2JlIGZ1bGx5IHVuYm91bmQgZm9yIHRoaXMgY2FsbCB0byBzdWNjZWVkLiBjb25faXNfYm91bmQoKSB3aWxsIGNoZWNrIGlmIHRoZQorZHJpdmVyIGlzIGJvdW5kIG9yIG5vdC4KKworR3VpZGVsaW5lcyBmb3IgY29uc29sZSBkcml2ZXIgd3JpdGVyczoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworSW4gb3JkZXIgZm9yIGJpbmRpbmcgdG8gYW5kIHVuYmluZGluZyBmcm9tIHRoZSBjb25zb2xlIHRvIHByb3Blcmx5IHdvcmssCitjb25zb2xlIGRyaXZlcnMgbXVzdCBmb2xsb3cgdGhlc2UgZ3VpZGVsaW5lczoKKworMS4gQWxsIGRyaXZlcnMsIGV4Y2VwdCBzeXN0ZW0gZHJpdmVycywgbXVzdCBjYWxsIGVpdGhlciByZWdpc3Rlcl9jb25fZHJpdmVyKCkKKyAgIG9yIHRha2Vfb3Zlcl9jb25zb2xlKCkuIHJlZ2lzdGVyX2Nvbl9kcml2ZXIoKSB3aWxsIGp1c3QgYWRkIHRoZSBkcml2ZXIgdG8KKyAgIHRoZSBjb25zb2xlJ3MgaW50ZXJuYWwgbGlzdC4gSXQgd29uJ3QgdGFrZSBvdmVyIHRoZQorICAgY29uc29sZS4gdGFrZV9vdmVyX2NvbnNvbGUoKSwgYXMgaXQgbmFtZSBpbXBsaWVzLCB3aWxsIGFsc28gdGFrZSBvdmVyIChvcgorICAgYmluZCB0bykgdGhlIGNvbnNvbGUuCisKKzIuIEFsbCByZXNvdXJjZXMgYWxsb2NhdGVkIGR1cmluZyBjb24tPmNvbl9pbml0KCkgbXVzdCBiZSByZWxlYXNlZCBpbgorICAgY29uLT5jb25fZGVpbml0KCkuCisKKzMuIEFsbCByZXNvdXJjZXMgYWxsb2NhdGVkIGluIGNvbi0+Y29uX3N0YXJ0dXAoKSBtdXN0IGJlIHJlbGVhc2VkIHdoZW4gdGhlCisgICBkcml2ZXIsIHdoaWNoIHdhcyBwcmV2aW91c2x5IGJvdW5kLCBiZWNvbWVzIHVuYm91bmQuICBUaGUgY29uc29sZSBsYXllcgorICAgZG9lcyBub3QgaGF2ZSBhIGNvbXBsZW1lbnRhcnkgY2FsbCB0byBjb24tPmNvbl9zdGFydHVwKCkgc28gaXQncyB1cCB0byB0aGUKKyAgIGRyaXZlciB0byBjaGVjayB3aGVuIGl0J3MgbGVnYWwgdG8gcmVsZWFzZSB0aGVzZSByZXNvdXJjZXMuIENhbGxpbmcKKyAgIGNvbl9pc19ib3VuZCgpIGluIGNvbi0+Y29uX2RlaW5pdCgpIHdpbGwgaGVscC4gIElmIHRoZSBjYWxsIHJldHVybmVkCisgICBmYWxzZSgpLCB0aGVuIGl0J3Mgc2FmZSB0byByZWxlYXNlIHRoZSByZXNvdXJjZXMuICBUaGlzIGJhbGFuY2UgaGFzIHRvIGJlCisgICBlbnN1cmVkIGJlY2F1c2UgY29uLT5jb25fc3RhcnR1cCgpIGNhbiBiZSBjYWxsZWQgYWdhaW4gd2hlbiBhIHJlcXVlc3QgdG8KKyAgIHJlYmluZCB0aGUgZHJpdmVyIHRvIHRoZSBjb25zb2xlIGFycml2ZXMuCisKKzQuIFVwb24gZXhpdCBvZiB0aGUgZHJpdmVyLCBlbnN1cmUgdGhhdCB0aGUgZHJpdmVyIGlzIHRvdGFsbHkgdW5ib3VuZC4gSWYgdGhlCisgICBjb25kaXRpb24gaXMgc2F0aXNmaWVkLCB0aGVuIHRoZSBkcml2ZXIgbXVzdCBjYWxsIHVucmVnaXN0ZXJfY29uX2RyaXZlcigpCisgICBvciBnaXZlX3VwX2NvbnNvbGUoKS4KKworNS4gdW5yZWdpc3Rlcl9jb25fZHJpdmVyKCkgY2FuIGFsc28gYmUgY2FsbGVkIG9uIGNvbmRpdGlvbnMgd2hpY2ggbWFrZSBpdAorICAgaW1wb3NzaWJsZSBmb3IgdGhlIGRyaXZlciB0byBzZXJ2aWNlIGNvbnNvbGUgcmVxdWVzdHMuICBUaGlzIGNhbiBoYXBwZW4KKyAgIHdpdGggdGhlIGZyYW1lYnVmZmVyIGNvbnNvbGUgdGhhdCBzdWRkZW5seSBsb3N0IGFsbCBvZiBpdHMgZHJpdmVycy4KKworVGhlIGN1cnJlbnQgY3JvcCBvZiBjb25zb2xlIGRyaXZlcnMgc2hvdWxkIHN0aWxsIHdvcmsgY29ycmVjdGx5LCBidXQgYmluZGluZworYW5kIHVuYmluZGluZyB0aGVtIG1heSBjYXVzZSBwcm9ibGVtcy4gV2l0aCBtaW5pbWFsIGZpeGVzLCB0aGVzZSBkcml2ZXJzIGNhbgorYmUgbWFkZSB0byB3b3JrIGNvcnJlY3RseS4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT0KK0FudG9uaW5vIERhcGxhcyA8YWRhcGxhc0Bwb2wubmV0PgorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXMudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2VzLnR4dAppbmRleCBiMmY1OTNmLi40YWFmNjhmIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNlcy50eHQKQEAgLTMsNyArMyw3IEBACiAKIAkgICAgIE1haW50YWluZWQgYnkgVG9yYmVuIE1hdGhpYXNlbiA8ZGV2aWNlQGxhbmFuYS5vcmc+CiAKLQkJICAgICAgTGFzdCByZXZpc2VkOiAwMSBNYXJjaCAyMDA2CisJCSAgICAgIExhc3QgcmV2aXNlZDogMTUgTWF5IDIwMDYKIAogVGhpcyBsaXN0IGlzIHRoZSBMaW51eCBEZXZpY2UgTGlzdCwgdGhlIG9mZmljaWFsIHJlZ2lzdHJ5IG9mIGFsbG9jYXRlZAogZGV2aWNlIG51bWJlcnMgYW5kIC9kZXYgZGlyZWN0b3J5IG5vZGVzIGZvciB0aGUgTGludXggb3BlcmF0aW5nCkBAIC0yNzkxLDYgKzI3OTEsNyBAQAogCQkgMTcwID0gL2Rldi90dHlOWDAJCUhpbHNjaGVyIG5ldFggc2VyaWFsIHBvcnQgMAogCQkgICAgLi4uCiAJCSAxODUgPSAvZGV2L3R0eU5YMTUJCUhpbHNjaGVyIG5ldFggc2VyaWFsIHBvcnQgMTUKKwkJIDE4NiA9IC9kZXYvdHR5SjAJCUpUQUcxIERDQyBwcm90b2NvbCBiYXNlZCBzZXJpYWwgcG9ydCBlbXVsYXRpb24KIAogMjA1IGNoYXIJTG93LWRlbnNpdHkgc2VyaWFsIHBvcnRzIChhbHRlcm5hdGUgZGV2aWNlKQogCQkgIDAgPSAvZGV2L2N1bHUwCQlDYWxsb3V0IGRldmljZSBmb3IgdHR5TFUwCkBAIC0zMTA4LDYgKzMxMDksMTAgQEAKIAkJICAuLi4KIAkJMjQwID0gL2Rldi9yZmRwCQkxNnRoIFJGRCBGVEwgbGF5ZXIKIAorMjU3IGNoYXIJUGhvZW5peCBUZWNobm9sb2dpZXMgQ3J5cHRvZ3JhcGhpYyBTZXJ2aWNlcyBEcml2ZXIKKwkJICAwID0gL2Rldi9wdGxzZWMJQ3J5cHRvIFNlcnZpY2VzIERyaXZlcgorCisKIAogICoqKioJQURESVRJT05BTCAvZGV2IERJUkVDVE9SWSBFTlRSSUVTCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZHJpdmVyLW1vZGVsL292ZXJ2aWV3LnR4dCBiL0RvY3VtZW50YXRpb24vZHJpdmVyLW1vZGVsL292ZXJ2aWV3LnR4dAppbmRleCBhYzRhN2E3Li4yMDUwYzlmIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RyaXZlci1tb2RlbC9vdmVydmlldy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kcml2ZXItbW9kZWwvb3ZlcnZpZXcudHh0CkBAIC0xOCw3ICsxOCw3IEBACiAoc29tZXRpbWVzIGp1c3QgYSBsaXN0KSBmb3IgdGhlIGRldmljZXMgdGhleSBjb250cm9sLiBUaGVyZSB3YXNuJ3QgYW55CiB1bmlmb3JtaXR5IGFjcm9zcyB0aGUgZGlmZmVyZW50IGJ1cyB0eXBlcy4KIAotVGhlIGN1cnJlbnQgZHJpdmVyIG1vZGVsIHByb3ZpZGVzIGEgY29tb24sIHVuaWZvcm0gZGF0YSBtb2RlbCBmb3IgZGVzY3JpYmluZworVGhlIGN1cnJlbnQgZHJpdmVyIG1vZGVsIHByb3ZpZGVzIGEgY29tbW9uLCB1bmlmb3JtIGRhdGEgbW9kZWwgZm9yIGRlc2NyaWJpbmcKIGEgYnVzIGFuZCB0aGUgZGV2aWNlcyB0aGF0IGNhbiBhcHBlYXIgdW5kZXIgdGhlIGJ1cy4gVGhlIHVuaWZpZWQgYnVzCiBtb2RlbCBpbmNsdWRlcyBhIHNldCBvZiBjb21tb24gYXR0cmlidXRlcyB3aGljaCBhbGwgYnVzc2VzIGNhcnJ5LCBhbmQgYSBzZXQKIG9mIGNvbW1vbiBjYWxsYmFja3MsIHN1Y2ggYXMgZGV2aWNlIGRpc2NvdmVyeSBkdXJpbmcgYnVzIHByb2JpbmcsIGJ1cwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9mYi9mYmNvbi50eHQgYi9Eb2N1bWVudGF0aW9uL2ZiL2ZiY29uLnR4dAppbmRleCAwOGRjZTBmLi5mMzczZGYxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZiL2ZiY29uLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ZiL2ZiY29uLnR4dApAQCAtMTM1LDEwICsxMzUsMTAgQEAKIAogCVRoZSBhbmdsZSBjYW4gYmUgY2hhbmdlZCBhbnl0aW1lIGFmdGVyd2FyZHMgYnkgJ2VjaG9pbmcnIHRoZSBzYW1lCiAJbnVtYmVycyB0byBhbnkgb25lIG9mIHRoZSAyIGF0dHJpYnV0ZXMgZm91bmQgaW4KLQkvc3lzL2NsYXNzL2dyYXBoaWNzL2Zie3h9CisJIC9zeXMvY2xhc3MvZ3JhcGhpY3MvZmJjb24KIAotCQljb25fcm90YXRlICAgICAtIHJvdGF0ZSB0aGUgZGlzcGxheSBvZiB0aGUgYWN0aXZlIGNvbnNvbGUKLQkJY29uX3JvdGF0ZV9hbGwgLSByb3RhdGUgdGhlIGRpc3BsYXkgb2YgYWxsIGNvbnNvbGVzCisJCXJvdGF0ZSAgICAgLSByb3RhdGUgdGhlIGRpc3BsYXkgb2YgdGhlIGFjdGl2ZSBjb25zb2xlCisJCXJvdGF0ZV9hbGwgLSByb3RhdGUgdGhlIGRpc3BsYXkgb2YgYWxsIGNvbnNvbGVzCiAKIAlDb25zb2xlIHJvdGF0aW9uIHdpbGwgb25seSBiZWNvbWUgYXZhaWxhYmxlIGlmIENvbnNvbGUgUm90YXRpb24KIAlTdXBwb3J0IGlzIGNvbXBpbGVkIGluIHlvdXIga2VybmVsLgpAQCAtMTQ4LDUgKzE0OCwxNzcgQEAKIAlBY3R1YWxseSwgdGhlIHVuZGVybHlpbmcgZmIgZHJpdmVyIGlzIHRvdGFsbHkgaWdub3JhbnQgb2YgY29uc29sZQogCXJvdGF0aW9uLgogCi0tLS0KK0MuIEF0dGFjaGluZywgRGV0YWNoaW5nIGFuZCBVbmxvYWRpbmcKKworQmVmb3JlIGdvaW5nIG9uIG9uIGhvdyB0byBhdHRhY2gsIGRldGFjaCBhbmQgdW5sb2FkIHRoZSBmcmFtZWJ1ZmZlciBjb25zb2xlLCBhbgoraWxsdXN0cmF0aW9uIG9mIHRoZSBkZXBlbmRlbmNpZXMgbWF5IGhlbHAuCisKK1RoZSBjb25zb2xlIGxheWVyLCBhcyB3aXRoIG1vc3Qgc3Vic3lzdGVtcywgbmVlZHMgYSBkcml2ZXIgdGhhdCBpbnRlcmZhY2VzIHdpdGgKK3RoZSBoYXJkd2FyZS4gVGh1cywgaW4gYSBWR0EgY29uc29sZToKKworY29uc29sZSAtLS0+IFZHQSBkcml2ZXIgLS0tPiBoYXJkd2FyZS4KKworQXNzdW1pbmcgdGhlIFZHQSBkcml2ZXIgY2FuIGJlIHVubG9hZGVkLCBvbmUgbXVzdCBmaXJzdCB1bmJpbmQgdGhlIFZHQSBkcml2ZXIKK2Zyb20gdGhlIGNvbnNvbGUgbGF5ZXIgYmVmb3JlIHVubG9hZGluZyB0aGUgZHJpdmVyLiAgVGhlIFZHQSBkcml2ZXIgY2Fubm90IGJlCit1bmxvYWRlZCBpZiBpdCBpcyBzdGlsbCBib3VuZCB0byB0aGUgY29uc29sZSBsYXllci4gKFNlZQorRG9jdW1lbnRhdGlvbi9jb25zb2xlL2NvbnNvbGUudHh0IGZvciBtb3JlIGluZm9ybWF0aW9uKS4KKworVGhpcyBpcyBtb3JlIGNvbXBsaWNhdGVkIGluIHRoZSBjYXNlIG9mIHRoZSB0aGUgZnJhbWVidWZmZXIgY29uc29sZSAoZmJjb24pLAorYmVjYXVzZSBmYmNvbiBpcyBhbiBpbnRlcm1lZGlhdGUgbGF5ZXIgYmV0d2VlbiB0aGUgY29uc29sZSBhbmQgdGhlIGRyaXZlcnM6CisKK2NvbnNvbGUgLS0tPiBmYmNvbiAtLS0+IGZiZGV2IGRyaXZlcnMgLS0tPiBoYXJkd2FyZQorCitUaGUgZmJkZXYgZHJpdmVycyBjYW5ub3QgYmUgdW5sb2FkZWQgaWYgaXQncyBib3VuZCB0byBmYmNvbiwgYW5kIGZiY29uIGNhbm5vdAorYmUgdW5sb2FkZWQgaWYgaXQncyBib3VuZCB0byB0aGUgY29uc29sZSBsYXllci4KKworU28gdG8gdW5sb2FkIHRoZSBmYmRldiBkcml2ZXJzLCBvbmUgbXVzdCBmaXJzdCB1bmJpbmQgZmJjb24gZnJvbSB0aGUgY29uc29sZSwKK3RoZW4gdW5iaW5kIHRoZSBmYmRldiBkcml2ZXJzIGZyb20gZmJjb24uICBGb3J0dW5hdGVseSwgdW5iaW5kaW5nIGZiY29uIGZyb20KK3RoZSBjb25zb2xlIGxheWVyIHdpbGwgYXV0b21hdGljYWxseSB1bmJpbmQgZnJhbWVidWZmZXIgZHJpdmVycyBmcm9tCitmYmNvbi4gVGh1cywgdGhlcmUgaXMgbm8gbmVlZCB0byBleHBsaWNpdGx5IHVuYmluZCB0aGUgZmJkZXYgZHJpdmVycyBmcm9tCitmYmNvbi4KKworU28sIGhvdyBkbyB3ZSB1bmJpbmQgZmJjb24gZnJvbSB0aGUgY29uc29sZT8gUGFydCBvZiB0aGUgYW5zd2VyIGlzIGluCitEb2N1bWVudGF0aW9uL2NvbnNvbGUvY29uc29sZS50eHQuIFRvIHN1bW1hcml6ZToKKworRWNobyBhIHZhbHVlIHRvIHRoZSBiaW5kIGZpbGUgdGhhdCByZXByZXNlbnRzIHRoZSBmcmFtZWJ1ZmZlciBjb25zb2xlCitkcml2ZXIuIFNvIGFzc3VtaW5nIHZ0Y29uMSByZXByZXNlbnRzIGZiY29uLCB0aGVuOgorCitlY2hvIDEgPiBzeXMvY2xhc3MvdnRjb25zb2xlL3Z0Y29uMS9iaW5kIC0gYXR0YWNoIGZyYW1lYnVmZmVyIGNvbnNvbGUgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlIGxheWVyCitlY2hvIDAgPiBzeXMvY2xhc3MvdnRjb25zb2xlL3Z0Y29uMS9iaW5kIC0gZGV0YWNoIGZyYW1lYnVmZmVyIGNvbnNvbGUgZnJvbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUgbGF5ZXIKKworSWYgZmJjb24gaXMgZGV0YWNoZWQgZnJvbSB0aGUgY29uc29sZSBsYXllciwgeW91ciBib290IGNvbnNvbGUgZHJpdmVyICh3aGljaCBpcwordXN1YWxseSBWR0EgdGV4dCBtb2RlKSB3aWxsIHRha2Ugb3Zlci4gIEEgZmV3IGRyaXZlcnMgKHJpdmFmYiBhbmQgaTgxMGZiKSB3aWxsCityZXN0b3JlIFZHQSB0ZXh0IG1vZGUgZm9yIHlvdS4gIFdpdGggdGhlIHJlc3QsIGJlZm9yZSBkZXRhY2hpbmcgZmJjb24sIHlvdQorbXVzdCB0YWtlIGEgZmV3IGFkZGl0aW9uYWwgc3RlcHMgdG8gbWFrZSBzdXJlIHRoYXQgeW91ciBWR0EgdGV4dCBtb2RlIGlzCityZXN0b3JlZCBwcm9wZXJseS4gVGhlIGZvbGxvd2luZyBpcyBvbmUgb2YgdGhlIHNldmVyYWwgbWV0aG9kcyB0aGF0IHlvdSBjYW4gZG86CisKKzEuIERvd25sb2FkIG9yIGluc3RhbGwgdmJldG9vbC4gIFRoaXMgdXRpbGl0eSBpcyBpbmNsdWRlZCB3aXRoIG1vc3QKKyAgIGRpc3RyaWJ1dGlvbnMgbm93YWRheXMsIGFuZCBpcyB1c3VhbGx5IHBhcnQgb2YgdGhlIHN1c3BlbmQvcmVzdW1lIHRvb2wuCisKKzIuIEluIHlvdXIga2VybmVsIGNvbmZpZ3VyYXRpb24sIGVuc3VyZSB0aGF0IENPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xFIGlzIHNldAorICAgdG8gJ3knIG9yICdtJy4gRW5hYmxlIG9uZSBvciBtb3JlIG9mIHlvdXIgZmF2b3JpdGUgZnJhbWVidWZmZXIgZHJpdmVycy4KKworMy4gQm9vdCBpbnRvIHRleHQgbW9kZSBhbmQgYXMgcm9vdCBydW46CisKKwl2YmV0b29sIHZiZXN0YXRlIHNhdmUgPiA8dmdhIHN0YXRlIGZpbGU+CisKKwlUaGUgYWJvdmUgY29tbWFuZCBzYXZlcyB0aGUgcmVnaXN0ZXIgY29udGVudHMgb2YgeW91ciBncmFwaGljcworCWhhcmR3YXJlIHRvIDx2Z2Egc3RhdGUgZmlsZT4uICBZb3UgbmVlZCB0byBkbyB0aGlzIHN0ZXAgb25seSBvbmNlIGFzCisJdGhlIHN0YXRlIGZpbGUgY2FuIGJlIHJldXNlZC4KKworNC4gSWYgZmJjb24gaXMgY29tcGlsZWQgYXMgYSBtb2R1bGUsIGxvYWQgZmJjb24gYnkgZG9pbmc6CisKKyAgICAgICBtb2Rwcm9iZSBmYmNvbgorCis1LiBOb3cgdG8gZGV0YWNoIGZiY29uOgorCisgICAgICAgdmJldG9vbCB2YmVzdGF0ZSByZXN0b3JlIDwgPHZnYSBzdGF0ZSBmaWxlPiAmJiBcCisgICAgICAgZWNobyAwID4gL3N5cy9jbGFzcy92dGNvbnNvbGUvdnRjb24xL2JpbmQKKworNi4gVGhhdCdzIGl0LCB5b3UncmUgYmFjayB0byBWR0EgbW9kZS4gQW5kIGlmIHlvdSBjb21waWxlZCBmYmNvbiBhcyBhIG1vZHVsZSwKKyAgIHlvdSBjYW4gdW5sb2FkIGl0IGJ5ICdybW1vZCBmYmNvbicKKworNy4gVG8gcmVhdHRhY2ggZmJjb246CisKKyAgICAgICBlY2hvIDEgPiAvc3lzL2NsYXNzL3Z0Y29uc29sZS92dGNvbjEvYmluZAorCis4LiBPbmNlIGZiY29uIGlzIHVuYm91bmQsIGFsbCBkcml2ZXJzIHJlZ2lzdGVyZWQgdG8gdGhlIHN5c3RlbSB3aWxsIGFsc28KK2JlY29tZSB1bmJvdW5kLiAgVGhpcyBtZWFucyB0aGF0IGZiY29uIGFuZCBpbmRpdmlkdWFsIGZyYW1lYnVmZmVyIGRyaXZlcnMKK2NhbiBiZSB1bmxvYWRlZCBvciByZWxvYWRlZCBhdCB3aWxsLiBSZWxvYWRpbmcgdGhlIGRyaXZlcnMgb3IgZmJjb24gd2lsbAorYXV0b21hdGljYWxseSBiaW5kIHRoZSBjb25zb2xlLCBmYmNvbiBhbmQgdGhlIGRyaXZlcnMgdG9nZXRoZXIuIFVubG9hZGluZworYWxsIHRoZSBkcml2ZXJzIHdpdGhvdXQgdW5sb2FkaW5nIGZiY29uIHdpbGwgbWFrZSBpdCBpbXBvc3NpYmxlIGZvciB0aGUKK2NvbnNvbGUgdG8gYmluZCBmYmNvbi4KKworTm90ZXMgZm9yIHZlc2FmYiB1c2VyczoKKz09PT09PT09PT09PT09PT09PT09PT09CisKK1VuZm9ydHVuYXRlbHksIGlmIHlvdXIgYm9vdGxpbmUgaW5jbHVkZXMgYSB2Z2E9eHh4IHBhcmFtZXRlciB0aGF0IHNldHMgdGhlCitoYXJkd2FyZSBpbiBncmFwaGljcyBtb2RlLCBzdWNoIGFzIHdoZW4gbG9hZGluZyB2ZXNhZmIsIHZnYWNvbiB3aWxsIG5vdCBsb2FkLgorSW5zdGVhZCwgdmdhY29uIHdpbGwgcmVwbGFjZSB0aGUgZGVmYXVsdCBib290IGNvbnNvbGUgd2l0aCBkdW1teWNvbiwgYW5kIHlvdQord29uJ3QgZ2V0IGFueSBkaXNwbGF5IGFmdGVyIGRldGFjaGluZyBmYmNvbi4gWW91ciBtYWNoaW5lIGlzIHN0aWxsIGFsaXZlLCBzbworeW91IGNhbiByZWF0dGFjaCB2ZXNhZmIuIEhvd2V2ZXIsIHRvIHJlYXR0YWNoIHZlc2FmYiwgeW91IG5lZWQgdG8gZG8gb25lIG9mCit0aGUgZm9sbG93aW5nOgorCitWYXJpYXRpb24gMToKKworICAgIGEuIEJlZm9yZSBkZXRhY2hpbmcgZmJjb24sIGRvCisKKyAgICAgICB2YmV0b29sIHZiZW1vZGUgc2F2ZSA+IDx2ZXNhIHN0YXRlIGZpbGU+ICMgZG8gb25jZSBmb3IgZWFjaCB2ZXNhZmIgbW9kZSwKKwkJCQkJCSMgdGhlIGZpbGUgY2FuIGJlIHJldXNlZAorCisgICAgYi4gRGV0YWNoIGZiY29uIGFzIGluIHN0ZXAgNS4KKworICAgIGMuIEF0dGFjaCBmYmNvbgorCisgICAgICAgIHZiZXRvb2wgdmJlc3RhdGUgcmVzdG9yZSA8IDx2ZXNhIHN0YXRlIGZpbGU+ICYmIFwKKwllY2hvIDEgPiAvc3lzL2NsYXNzL3Z0Y29uc29sZS92dGNvbjEvYmluZAorCitWYXJpYXRpb24gMjoKKworICAgIGEuIEJlZm9yZSBkZXRhY2hpbmcgZmJjb24sIGRvOgorCWVjaG8gPElEPiA+IC9zeXMvY2xhc3MvdHR5L2NvbnNvbGUvYmluZAorCisKKyAgICAgICB2YmV0b29sIHZiZW1vZGUgZ2V0CisKKyAgICBiLiBUYWtlIG5vdGUgb2YgdGhlIG1vZGUgbnVtYmVyCisKKyAgICBiLiBEZXRhY2ggZmJjb24gYXMgaW4gc3RlcCA1LgorCisgICAgYy4gQXR0YWNoIGZiY29uOgorCisgICAgICAgdmJldG9vbCB2YmVtb2RlIHNldCA8bW9kZSBudW1iZXI+ICYmIFwKKyAgICAgICBlY2hvIDEgPiAvc3lzL2NsYXNzL3Z0Y29uc29sZS92dGNvbjEvYmluZAorCitTYW1wbGVzOgorPT09PT09PT0KKworSGVyZSBhcmUgMiBzYW1wbGUgYmFzaCBzY3JpcHRzIHRoYXQgeW91IGNhbiB1c2UgdG8gYmluZCBvciB1bmJpbmQgdGhlCitmcmFtZWJ1ZmZlciBjb25zb2xlIGRyaXZlciBpZiB5b3UgYXJlIGluIGFuIFg4NiBib3g6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyEvYmluL2Jhc2gKKyMgVW5iaW5kIGZiY29uCisKKyMgQ2hhbmdlIHRoaXMgdG8gd2hlcmUgeW91ciBhY3R1YWwgdmdhc3RhdGUgZmlsZSBpcyBsb2NhdGVkCisjIE9yIFVzZSBWR0FTVEFURT0kMSB0byBpbmRpY2F0ZSB0aGUgc3RhdGUgZmlsZSBhdCBydW50aW1lCitWR0FTVEFURT0vdG1wL3ZnYXN0YXRlCisKKyMgcGF0aCB0byB2YmV0b29sCitWQkVUT09MPS91c3IvbG9jYWwvYmluCisKKworZm9yICgoIGkgPSAwOyBpIDwgMTY7IGkrKykpCitkbworICBpZiB0ZXN0IC14IC9zeXMvY2xhc3MvdnRjb25zb2xlL3Z0Y29uJGk7IHRoZW4KKyAgICAgIGlmIFsgYGNhdCAvc3lzL2NsYXNzL3Z0Y29uc29sZS92dGNvbiRpL25hbWUgfCBncmVwIC1jICJmcmFtZSBidWZmZXIiYCBcCisgICAgICAgICAgID0gMSBdOyB0aGVuCisJICAgIGlmIHRlc3QgLXggJFZCRVRPT0wvdmJldG9vbDsgdGhlbgorCSAgICAgICBlY2hvIFVuYmluZGluZyB2dGNvbiRpCisJICAgICAgICRWQkVUT09ML3ZiZXRvb2wgdmJlc3RhdGUgcmVzdG9yZSA8ICRWR0FTVEFURQorCSAgICAgICBlY2hvIDAgPiAvc3lzL2NsYXNzL3Z0Y29uc29sZS92dGNvbiRpL2JpbmQKKwkgICAgZmkKKyAgICAgIGZpCisgIGZpCitkb25lCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyEvYmluL2Jhc2gKKyMgQmluZCBmYmNvbgorCitmb3IgKCggaSA9IDA7IGkgPCAxNjsgaSsrKSkKK2RvCisgIGlmIHRlc3QgLXggL3N5cy9jbGFzcy92dGNvbnNvbGUvdnRjb24kaTsgdGhlbgorICAgICAgaWYgWyBgY2F0IC9zeXMvY2xhc3MvdnRjb25zb2xlL3Z0Y29uJGkvbmFtZSB8IGdyZXAgLWMgImZyYW1lIGJ1ZmZlciJgIFwKKyAgICAgICAgICAgPSAxIF07IHRoZW4KKwkgIGVjaG8gVW5iaW5kaW5nIHZ0Y29uJGkKKwkgIGVjaG8gMSA+IC9zeXMvY2xhc3MvdnRjb25zb2xlL3Z0Y29uJGkvYmluZAorICAgICAgZmkKKyAgZmkKK2RvbmUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistLQogQW50b25pbm8gRGFwbGFzIDxhZGFwbGFzQHBvbC5uZXQ+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2F1dG9tb3VudC1zdXBwb3J0LnR4dCBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvYXV0b21vdW50LXN1cHBvcnQudHh0CmluZGV4IDU4YzY1YTEuLjdjYWMyMDAgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvYXV0b21vdW50LXN1cHBvcnQudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvYXV0b21vdW50LXN1cHBvcnQudHh0CkBAIC0xOSw3ICsxOSw3IEBACiAKICAoMikgSGF2ZSB0aGUgZm9sbG93X2xpbmsoKSBvcCBkbyB0aGUgZm9sbG93aW5nIHN0ZXBzOgogCi0gICAgIChhKSBDYWxsIGRvX2tlcm5fbW91bnQoKSB0byBjYWxsIHRoZSBhcHByb3ByaWF0ZSBmaWxlc3lzdGVtIHRvIHNldCB1cCBhCisgICAgIChhKSBDYWxsIHZmc19rZXJuX21vdW50KCkgdG8gY2FsbCB0aGUgYXBwcm9wcmlhdGUgZmlsZXN5c3RlbSB0byBzZXQgdXAgYQogICAgICAgICAgc3VwZXJibG9jayBhbmQgZ2FpbiBhIHZmc21vdW50IHN0cnVjdHVyZSByZXByZXNlbnRpbmcgaXQuCiAKICAgICAgKGIpIENvcHkgdGhlIG5hbWVpZGF0YSBwcm92aWRlZCBhcyBhbiBhcmd1bWVudCBhbmQgc3Vic3RpdHV0ZSB0aGUgZGVudHJ5CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2V4dDMudHh0IGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9leHQzLnR4dAppbmRleCBhZmIxMzM1Li40YWVjYzliIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2V4dDMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvZXh0My50eHQKQEAgLTExMyw2ICsxMTMsMTQgQEAKIGdycHF1b3RhCiB1c3JxdW90YQogCitiaAkJKCopCWV4dDMgYXNzb2NpYXRlcyBidWZmZXIgaGVhZHMgdG8gZGF0YSBwYWdlcyB0bworbm9iaAkJCShhKSBjYWNoZSBkaXNrIGJsb2NrIG1hcHBpbmcgaW5mb3JtYXRpb24KKwkJCShiKSBsaW5rIHBhZ2VzIGludG8gdHJhbnNhY3Rpb24gdG8gcHJvdmlkZQorCQkJICAgIG9yZGVyaW5nIGd1YXJhbnRlZXMuCisJCQkiYmgiIG9wdGlvbiBmb3JjZXMgdXNlIG9mIGJ1ZmZlciBoZWFkcy4KKwkJCSJub2JoIiBvcHRpb24gdHJpZXMgdG8gYXZvaWQgYXNzb2NpYXRpbmcgYnVmZmVyCisJCQloZWFkcyAoc3VwcG9ydGVkIG9ubHkgZm9yICJ3cml0ZWJhY2siIG1vZGUpLgorCiAKIFNwZWNpZmljYXRpb24KID09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvZnVzZS50eHQgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2Z1c2UudHh0CmluZGV4IDMzZjc0MzEuLmE1ODRmMDUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvZnVzZS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9mdXNlLnR4dApAQCAtMTgsNiArMTgsMTQgQEAKICAgdXNlci4gIE5PVEU6IHRoaXMgaXMgbm90IHRoZSBzYW1lIGFzIG1vdW50cyBhbGxvd2VkIHdpdGggdGhlICJ1c2VyIgogICBvcHRpb24gaW4gL2V0Yy9mc3RhYiwgd2hpY2ggaXMgbm90IGRpc2N1c3NlZCBoZXJlLgogCitGaWxlc3lzdGVtIGNvbm5lY3Rpb246CisKKyAgQSBjb25uZWN0aW9uIGJldHdlZW4gdGhlIGZpbGVzeXN0ZW0gZGFlbW9uIGFuZCB0aGUga2VybmVsLiAgVGhlCisgIGNvbm5lY3Rpb24gZXhpc3RzIHVudGlsIGVpdGhlciB0aGUgZGFlbW9uIGRpZXMsIG9yIHRoZSBmaWxlc3lzdGVtIGlzCisgIHVtb3VudGVkLiAgTm90ZSB0aGF0IGRldGFjaGluZyAob3IgbGF6eSB1bW91bnRpbmcpIHRoZSBmaWxlc3lzdGVtCisgIGRvZXMgX25vdF8gYnJlYWsgdGhlIGNvbm5lY3Rpb24sIGluIHRoaXMgY2FzZSBpdCB3aWxsIGV4aXN0IHVudGlsCisgIHRoZSBsYXN0IHJlZmVyZW5jZSB0byB0aGUgZmlsZXN5c3RlbSBpcyByZWxlYXNlZC4KKwogTW91bnQgb3duZXI6CiAKICAgVGhlIHVzZXIgd2hvIGRvZXMgdGhlIG1vdW50aW5nLgpAQCAtODYsMTYgKzk0LDIwIEBACiAgIFRoZSBkZWZhdWx0IGlzIGluZmluaXRlLiAgTm90ZSB0aGF0IHRoZSBzaXplIG9mIHJlYWQgcmVxdWVzdHMgaXMKICAgbGltaXRlZCBhbnl3YXkgdG8gMzIgcGFnZXMgKHdoaWNoIGlzIDEyOGtieXRlIG9uIGkzODYpLgogCi1TeXNmcwotfn5+fn4KK0NvbnRyb2wgZmlsZXN5c3RlbQorfn5+fn5+fn5+fn5+fn5+fn5+CiAKLUZVU0Ugc2V0cyB1cCB0aGUgZm9sbG93aW5nIGhpZXJhcmNoeSBpbiBzeXNmczoKK1RoZXJlJ3MgYSBjb250cm9sIGZpbGVzeXN0ZW0gZm9yIEZVU0UsIHdoaWNoIGNhbiBiZSBtb3VudGVkIGJ5OgogCi0gIC9zeXMvZnMvZnVzZS9jb25uZWN0aW9ucy9OLworICBtb3VudCAtdCBmdXNlY3RsIG5vbmUgL3N5cy9mcy9mdXNlL2Nvbm5lY3Rpb25zCiAKLXdoZXJlIE4gaXMgYW4gaW5jcmVhc2luZyBudW1iZXIgYWxsb2NhdGVkIHRvIGVhY2ggbmV3IGNvbm5lY3Rpb24uCitNb3VudGluZyBpdCB1bmRlciB0aGUgJy9zeXMvZnMvZnVzZS9jb25uZWN0aW9ucycgZGlyZWN0b3J5IG1ha2VzIGl0CitiYWNrd2FyZHMgY29tcGF0aWJsZSB3aXRoIGVhcmxpZXIgdmVyc2lvbnMuCiAKLUZvciBlYWNoIGNvbm5lY3Rpb24gdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIGFyZSBkZWZpbmVkOgorVW5kZXIgdGhlIGZ1c2UgY29udHJvbCBmaWxlc3lzdGVtIGVhY2ggY29ubmVjdGlvbiBoYXMgYSBkaXJlY3RvcnkKK25hbWVkIGJ5IGEgdW5pcXVlIG51bWJlci4KKworRm9yIGVhY2ggY29ubmVjdGlvbiB0aGUgZm9sbG93aW5nIGZpbGVzIGV4aXN0IHdpdGhpbiB0aGlzIGRpcmVjdG9yeToKIAogICd3YWl0aW5nJwogCkBAIC0xMTAsNyArMTIyLDQ3IEBACiAgIGNvbm5lY3Rpb24uICBUaGlzIG1lYW5zIHRoYXQgYWxsIHdhaXRpbmcgcmVxdWVzdHMgd2lsbCBiZSBhYm9ydGVkIGFuCiAgIGVycm9yIHJldHVybmVkIGZvciBhbGwgYWJvcnRlZCBhbmQgbmV3IHJlcXVlc3RzLgogCi1Pbmx5IGEgcHJpdmlsZWdlZCB1c2VyIG1heSByZWFkIG9yIHdyaXRlIHRoZXNlIGF0dHJpYnV0ZXMuCitPbmx5IHRoZSBvd25lciBvZiB0aGUgbW91bnQgbWF5IHJlYWQgb3Igd3JpdGUgdGhlc2UgZmlsZXMuCisKK0ludGVycnVwdGluZyBmaWxlc3lzdGVtIG9wZXJhdGlvbnMKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworSWYgYSBwcm9jZXNzIGlzc3VpbmcgYSBGVVNFIGZpbGVzeXN0ZW0gcmVxdWVzdCBpcyBpbnRlcnJ1cHRlZCwgdGhlCitmb2xsb3dpbmcgd2lsbCBoYXBwZW46CisKKyAgMSkgSWYgdGhlIHJlcXVlc3QgaXMgbm90IHlldCBzZW50IHRvIHVzZXJzcGFjZSBBTkQgdGhlIHNpZ25hbCBpcworICAgICBmYXRhbCAoU0lHS0lMTCBvciB1bmhhbmRsZWQgZmF0YWwgc2lnbmFsKSwgdGhlbiB0aGUgcmVxdWVzdCBpcworICAgICBkZXF1ZXVlZCBhbmQgcmV0dXJucyBpbW1lZGlhdGVseS4KKworICAyKSBJZiB0aGUgcmVxdWVzdCBpcyBub3QgeWV0IHNlbnQgdG8gdXNlcnNwYWNlIEFORCB0aGUgc2lnbmFsIGlzIG5vdAorICAgICBmYXRhbCwgdGhlbiBhbiAnaW50ZXJydXB0ZWQnIGZsYWcgaXMgc2V0IGZvciB0aGUgcmVxdWVzdC4gIFdoZW4KKyAgICAgdGhlIHJlcXVlc3QgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHRyYW5zZmVyZWQgdG8gdXNlcnNwYWNlIGFuZAorICAgICB0aGlzIGZsYWcgaXMgc2V0LCBhbiBJTlRFUlJVUFQgcmVxdWVzdCBpcyBxdWV1ZWQuCisKKyAgMykgSWYgdGhlIHJlcXVlc3QgaXMgYWxyZWFkeSBzZW50IHRvIHVzZXJzcGFjZSwgdGhlbiBhbiBJTlRFUlJVUFQKKyAgICAgcmVxdWVzdCBpcyBxdWV1ZWQuCisKK0lOVEVSUlVQVCByZXF1ZXN0cyB0YWtlIHByZWNlZGVuY2Ugb3ZlciBvdGhlciByZXF1ZXN0cywgc28gdGhlCit1c2Vyc3BhY2UgZmlsZXN5c3RlbSB3aWxsIHJlY2VpdmUgcXVldWVkIElOVEVSUlVQVHMgYmVmb3JlIGFueSBvdGhlcnMuCisKK1RoZSB1c2Vyc3BhY2UgZmlsZXN5c3RlbSBtYXkgaWdub3JlIHRoZSBJTlRFUlJVUFQgcmVxdWVzdHMgZW50aXJlbHksCitvciBtYXkgaG9ub3IgdGhlbSBieSBzZW5kaW5nIGEgcmVwbHkgdG8gdGhlIF9vcmlnaW5hbF8gcmVxdWVzdCwgd2l0aAordGhlIGVycm9yIHNldCB0byBFSU5UUi4KKworSXQgaXMgYWxzbyBwb3NzaWJsZSB0aGF0IHRoZXJlJ3MgYSByYWNlIGJldHdlZW4gcHJvY2Vzc2luZyB0aGUKK29yaWdpbmFsIHJlcXVlc3QgYW5kIGl0J3MgSU5URVJSVVBUIHJlcXVlc3QuICBUaGVyZSBhcmUgdHdvIHBvc3NpYmlsaXRpZXM6CisKKyAgMSkgVGhlIElOVEVSUlVQVCByZXF1ZXN0IGlzIHByb2Nlc3NlZCBiZWZvcmUgdGhlIG9yaWdpbmFsIHJlcXVlc3QgaXMKKyAgICAgcHJvY2Vzc2VkCisKKyAgMikgVGhlIElOVEVSUlVQVCByZXF1ZXN0IGlzIHByb2Nlc3NlZCBhZnRlciB0aGUgb3JpZ2luYWwgcmVxdWVzdCBoYXMKKyAgICAgYmVlbiBhbnN3ZXJlZAorCitJZiB0aGUgZmlsZXN5c3RlbSBjYW5ub3QgZmluZCB0aGUgb3JpZ2luYWwgcmVxdWVzdCwgaXQgc2hvdWxkIHdhaXQgZm9yCitzb21lIHRpbWVvdXQgYW5kL29yIGEgbnVtYmVyIG9mIG5ldyByZXF1ZXN0cyB0byBhcnJpdmUsIGFmdGVyIHdoaWNoIGl0CitzaG91bGQgcmVwbHkgdG8gdGhlIElOVEVSUlVQVCByZXF1ZXN0IHdpdGggYW4gRUFHQUlOIGVycm9yLiAgSW4gY2FzZQorMSkgdGhlIElOVEVSUlVQVCByZXF1ZXN0IHdpbGwgYmUgcmVxdWV1ZWQuICBJbiBjYXNlIDIpIHRoZSBJTlRFUlJVUFQKK3JlcGx5IHdpbGwgYmUgaWdub3JlZC4KIAogQWJvcnRpbmcgYSBmaWxlc3lzdGVtIGNvbm5lY3Rpb24KIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CkBAIC0xMzksOCArMTkxLDggQEAKICAgLSBVc2UgZm9yY2VkIHVtb3VudCAodW1vdW50IC1mKS4gIFdvcmtzIGluIGFsbCBjYXNlcyBidXQgb25seSBpZgogICAgIGZpbGVzeXN0ZW0gaXMgc3RpbGwgYXR0YWNoZWQgKGl0IGhhc24ndCBiZWVuIGxhenkgdW5tb3VudGVkKQogCi0gIC0gQWJvcnQgZmlsZXN5c3RlbSB0aHJvdWdoIHRoZSBzeXNmcyBpbnRlcmZhY2UuICBNb3N0IHBvd2VyZnVsCi0gICAgbWV0aG9kLCBhbHdheXMgd29ya3MuCisgIC0gQWJvcnQgZmlsZXN5c3RlbSB0aHJvdWdoIHRoZSBGVVNFIGNvbnRyb2wgZmlsZXN5c3RlbS4gIE1vc3QKKyAgICBwb3dlcmZ1bCBtZXRob2QsIGFsd2F5cyB3b3Jrcy4KIAogSG93IGRvIG5vbi1wcml2aWxlZ2VkIG1vdW50cyB3b3JrPwogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgpAQCAtMzA0LDI1ICszNTYsNyBAQAogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICBmb3IgImZpbGUiXQogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICpERUFETE9DSyoKIAotVGhlIHNvbHV0aW9uIGZvciB0aGlzIGlzIHRvIGFsbG93IHJlcXVlc3RzIHRvIGJlIGludGVycnVwdGVkIHdoaWxlCi10aGV5IGFyZSBpbiB1c2Vyc3BhY2U6Ci0KLSB8ICAgICAgW2ludGVycnVwdGVkIGJ5IHNpZ25hbF0gICAgICAgfAotIHwgICAgPGZ1c2VfdW5saW5rKCkgICAgICAgICAgICAgICAgICB8Ci0gfCAgICBbcmVsZWFzZSBzZW1hcGhvcmVdICAgICAgICAgICAgIHwgICAgW3NlbWFwaG9yZSBhY3F1aXJlZF0KLSB8ICA8c3lzX3VubGluaygpICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgID5mdXNlX3VubGluaygpCi0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICBbcXVldWUgcmVxIG9uIGZjLT5wZW5kaW5nXQotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgW3dha2UgdXAgZmMtPndhaXRxXQotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgW3NsZWVwIG9uIHJlcS0+d2FpdHFdCi0KLUlmIHRoZSBmaWxlc3lzdGVtIGRhZW1vbiB3YXMgc2luZ2xlIHRocmVhZGVkLCB0aGlzIHdpbGwgc3RvcCBoZXJlLAotc2luY2UgdGhlcmUncyBubyBvdGhlciB0aHJlYWQgdG8gZGVxdWV1ZSBhbmQgZXhlY3V0ZSB0aGUgcmVxdWVzdC4KLUluIHRoaXMgY2FzZSB0aGUgc29sdXRpb24gaXMgdG8ga2lsbCB0aGUgRlVTRSBkYWVtb24gYXMgd2VsbC4gIElmCi10aGVyZSBhcmUgbXVsdGlwbGUgc2VydmluZyB0aHJlYWRzLCB5b3UganVzdCBoYXZlIHRvIGtpbGwgdGhlbSBhcwotbG9uZyBhcyBhbnkgcmVtYWluLgotCi1Nb3JhbDogYSBmaWxlc3lzdGVtIHdoaWNoIGRlYWRsb2NrcywgY2FuIHNvb24gZmluZCBpdHNlbGYgZGVhZC4KK1RoZSBzb2x1dGlvbiBmb3IgdGhpcyBpcyB0byBhbGxvdyB0aGUgZmlsZXN5c3RlbSB0byBiZSBhYm9ydGVkLgogCiBTY2VuYXJpbyAyIC0gVHJpY2t5IGRlYWRsb2NrCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0zNTUsMjQgKzM4OSwxNCBAQAogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICBbbG9jayBwYWdlXQogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAqIERFQURMT0NLICoKIAotU29sdXRpb24gaXMgYWdhaW4gdG8gbGV0IHRoZSB0aGUgcmVxdWVzdCBiZSBpbnRlcnJ1cHRlZCAobm90Ci1lbGFib3JhdGVkIGZ1cnRoZXIpLgorU29sdXRpb24gaXMgYmFzaWNhbGx5IHRoZSBzYW1lIGFzIGFib3ZlLgogCi1BbiBhZGRpdGlvbmFsIHByb2JsZW0gaXMgdGhhdCB3aGlsZSB0aGUgd3JpdGUgYnVmZmVyIGlzIGJlaW5nCi1jb3BpZWQgdG8gdGhlIHJlcXVlc3QsIHRoZSByZXF1ZXN0IG11c3Qgbm90IGJlIGludGVycnVwdGVkLiAgVGhpcwotaXMgYmVjYXVzZSB0aGUgZGVzdGluYXRpb24gYWRkcmVzcyBvZiB0aGUgY29weSBtYXkgbm90IGJlIHZhbGlkCi1hZnRlciB0aGUgcmVxdWVzdCBpcyBpbnRlcnJ1cHRlZC4KK0FuIGFkZGl0aW9uYWwgcHJvYmxlbSBpcyB0aGF0IHdoaWxlIHRoZSB3cml0ZSBidWZmZXIgaXMgYmVpbmcgY29waWVkCit0byB0aGUgcmVxdWVzdCwgdGhlIHJlcXVlc3QgbXVzdCBub3QgYmUgaW50ZXJydXB0ZWQvYWJvcnRlZC4gIFRoaXMgaXMKK2JlY2F1c2UgdGhlIGRlc3RpbmF0aW9uIGFkZHJlc3Mgb2YgdGhlIGNvcHkgbWF5IG5vdCBiZSB2YWxpZCBhZnRlciB0aGUKK3JlcXVlc3QgaGFzIHJldHVybmVkLgogCi1UaGlzIGlzIHNvbHZlZCB3aXRoIGRvaW5nIHRoZSBjb3B5IGF0b21pY2FsbHksIGFuZCBhbGxvd2luZwotaW50ZXJydXB0aW9uIHdoaWxlIHRoZSBwYWdlKHMpIGJlbG9uZ2luZyB0byB0aGUgd3JpdGUgYnVmZmVyIGFyZQotZmF1bHRlZCB3aXRoIGdldF91c2VyX3BhZ2VzKCkuICBUaGUgJ3JlcS0+bG9ja2VkJyBmbGFnIGluZGljYXRlcwotd2hlbiB0aGUgY29weSBpcyB0YWtpbmcgcGxhY2UsIGFuZCBpbnRlcnJ1cHRpb24gaXMgZGVsYXllZCB1bnRpbAotdGhpcyBmbGFnIGlzIHVuc2V0LgotCi1TY2VuYXJpbyAzIC0gVHJpY2t5IGRlYWRsb2NrIHdpdGggYXN5bmNocm9ub3VzIHJlYWQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1UaGUgc2FtZSBzaXR1YXRpb24gYXMgYWJvdmUsIGV4Y2VwdCB0aHJlYWQtMSB3aWxsIHdhaXQgb24gcGFnZSBsb2NrCi1hbmQgaGVuY2UgaXQgd2lsbCBiZSB1bmludGVycnVwdGlibGUgYXMgd2VsbC4gIFRoZSBzb2x1dGlvbiBpcyB0bwotYWJvcnQgdGhlIGNvbm5lY3Rpb24gd2l0aCBmb3JjZWQgdW1vdW50IChpZiBtb3VudCBpcyBhdHRhY2hlZCkgb3IKLXRocm91Z2ggdGhlIGFib3J0IGF0dHJpYnV0ZSBpbiBzeXNmcy4KK1RoaXMgaXMgc29sdmVkIHdpdGggZG9pbmcgdGhlIGNvcHkgYXRvbWljYWxseSwgYW5kIGFsbG93aW5nIGFib3J0Cit3aGlsZSB0aGUgcGFnZShzKSBiZWxvbmdpbmcgdG8gdGhlIHdyaXRlIGJ1ZmZlciBhcmUgZmF1bHRlZCB3aXRoCitnZXRfdXNlcl9wYWdlcygpLiAgVGhlICdyZXEtPmxvY2tlZCcgZmxhZyBpbmRpY2F0ZXMgd2hlbiB0aGUgY29weSBpcwordGFraW5nIHBsYWNlLCBhbmQgYWJvcnQgaXMgZGVsYXllZCB1bnRpbCB0aGlzIGZsYWcgaXMgdW5zZXQuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3JhbWZzLXJvb3Rmcy1pbml0cmFtZnMudHh0IGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9yYW1mcy1yb290ZnMtaW5pdHJhbWZzLnR4dAppbmRleCA2MGFiNjFlLi4yNTk4MWUyIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3JhbWZzLXJvb3Rmcy1pbml0cmFtZnMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcmFtZnMtcm9vdGZzLWluaXRyYW1mcy50eHQKQEAgLTcwLDExICs3MCwxMyBAQAogV2hhdCBpcyByb290ZnM/CiAtLS0tLS0tLS0tLS0tLS0KIAotUm9vdGZzIGlzIGEgc3BlY2lhbCBpbnN0YW5jZSBvZiByYW1mcywgd2hpY2ggaXMgYWx3YXlzIHByZXNlbnQgaW4gMi42IHN5c3RlbXMuCi0oSXQncyB1c2VkIGludGVybmFsbHkgYXMgdGhlIHN0YXJ0aW5nIGFuZCBzdG9wcGluZyBwb2ludCBmb3Igc2VhcmNoZXMgb2YgdGhlCi1rZXJuZWwncyBkb3VibHktbGlua2VkIGxpc3Qgb2YgbW91bnQgcG9pbnRzLikKK1Jvb3RmcyBpcyBhIHNwZWNpYWwgaW5zdGFuY2Ugb2YgcmFtZnMgKG9yIHRtcGZzLCBpZiB0aGF0J3MgZW5hYmxlZCksIHdoaWNoIGlzCithbHdheXMgcHJlc2VudCBpbiAyLjYgc3lzdGVtcy4gIFlvdSBjYW4ndCB1bm1vdW50IHJvb3RmcyBmb3IgYXBwcm94aW1hdGVseSB0aGUKK3NhbWUgcmVhc29uIHlvdSBjYW4ndCBraWxsIHRoZSBpbml0IHByb2Nlc3M7IHJhdGhlciB0aGFuIGhhdmluZyBzcGVjaWFsIGNvZGUKK3RvIGNoZWNrIGZvciBhbmQgaGFuZGxlIGFuIGVtcHR5IGxpc3QsIGl0J3Mgc21hbGxlciBhbmQgc2ltcGxlciBmb3IgdGhlIGtlcm5lbAordG8ganVzdCBtYWtlIHN1cmUgY2VydGFpbiBsaXN0cyBjYW4ndCBiZWNvbWUgZW1wdHkuCiAKLU1vc3Qgc3lzdGVtcyBqdXN0IG1vdW50IGFub3RoZXIgZmlsZXN5c3RlbSBvdmVyIGl0IGFuZCBpZ25vcmUgaXQuICBUaGUKK01vc3Qgc3lzdGVtcyBqdXN0IG1vdW50IGFub3RoZXIgZmlsZXN5c3RlbSBvdmVyIHJvb3RmcyBhbmQgaWdub3JlIGl0LiAgVGhlCiBhbW91bnQgb2Ygc3BhY2UgYW4gZW1wdHkgaW5zdGFuY2Ugb2YgcmFtZnMgdGFrZXMgdXAgaXMgdGlueS4KIAogV2hhdCBpcyBpbml0cmFtZnM/CkBAIC05MiwxNCArOTQsMTYgQEAKIAogQWxsIHRoaXMgZGlmZmVycyBmcm9tIHRoZSBvbGQgaW5pdHJkIGluIHNldmVyYWwgd2F5czoKIAotICAtIFRoZSBvbGQgaW5pdHJkIHdhcyBhIHNlcGFyYXRlIGZpbGUsIHdoaWxlIHRoZSBpbml0cmFtZnMgYXJjaGl2ZSBpcyBsaW5rZWQKLSAgICBpbnRvIHRoZSBsaW51eCBrZXJuZWwgaW1hZ2UuICAoVGhlIGRpcmVjdG9yeSBsaW51eC0qL3VzciBpcyBkZXZvdGVkIHRvCi0gICAgZ2VuZXJhdGluZyB0aGlzIGFyY2hpdmUgZHVyaW5nIHRoZSBidWlsZC4pCisgIC0gVGhlIG9sZCBpbml0cmQgd2FzIGFsd2F5cyBhIHNlcGFyYXRlIGZpbGUsIHdoaWxlIHRoZSBpbml0cmFtZnMgYXJjaGl2ZSBpcworICAgIGxpbmtlZCBpbnRvIHRoZSBsaW51eCBrZXJuZWwgaW1hZ2UuICAoVGhlIGRpcmVjdG9yeSBsaW51eC0qL3VzciBpcyBkZXZvdGVkCisgICAgdG8gZ2VuZXJhdGluZyB0aGlzIGFyY2hpdmUgZHVyaW5nIHRoZSBidWlsZC4pCiAKICAgLSBUaGUgb2xkIGluaXRyZCBmaWxlIHdhcyBhIGd6aXBwZWQgZmlsZXN5c3RlbSBpbWFnZSAoaW4gc29tZSBmaWxlIGZvcm1hdCwKLSAgICBzdWNoIGFzIGV4dDIsIHRoYXQgaGFkIHRvIGJlIGJ1aWx0IGludG8gdGhlIGtlcm5lbCksIHdoaWxlIHRoZSBuZXcKKyAgICBzdWNoIGFzIGV4dDIsIHRoYXQgbmVlZGVkIGEgZHJpdmVyIGJ1aWx0IGludG8gdGhlIGtlcm5lbCksIHdoaWxlIHRoZSBuZXcKICAgICBpbml0cmFtZnMgYXJjaGl2ZSBpcyBhIGd6aXBwZWQgY3BpbyBhcmNoaXZlIChsaWtlIHRhciBvbmx5IHNpbXBsZXIsCi0gICAgc2VlIGNwaW8oMSkgYW5kIERvY3VtZW50YXRpb24vZWFybHktdXNlcnNwYWNlL2J1ZmZlci1mb3JtYXQudHh0KS4KKyAgICBzZWUgY3BpbygxKSBhbmQgRG9jdW1lbnRhdGlvbi9lYXJseS11c2Vyc3BhY2UvYnVmZmVyLWZvcm1hdC50eHQpLiAgVGhlCisgICAga2VybmVsJ3MgY3BpbyBleHRyYWN0aW9uIGNvZGUgaXMgbm90IG9ubHkgZXh0cmVtZWx5IHNtYWxsLCBpdCdzIGFsc28KKyAgICBfX2luaXQgZGF0YSB0aGF0IGNhbiBiZSBkaXNjYXJkZWQgZHVyaW5nIHRoZSBib290IHByb2Nlc3MuCiAKICAgLSBUaGUgcHJvZ3JhbSBydW4gYnkgdGhlIG9sZCBpbml0cmQgKHdoaWNoIHdhcyBjYWxsZWQgL2luaXRyZCwgbm90IC9pbml0KSBkaWQKICAgICBzb21lIHNldHVwIGFuZCB0aGVuIHJldHVybmVkIHRvIHRoZSBrZXJuZWwsIHdoaWxlIHRoZSBpbml0IHByb2dyYW0gZnJvbQpAQCAtMTI0LDEzICsxMjgsMTQgQEAKIAogVGhlIDIuNiBrZXJuZWwgYnVpbGQgcHJvY2VzcyBhbHdheXMgY3JlYXRlcyBhIGd6aXBwZWQgY3BpbyBmb3JtYXQgaW5pdHJhbWZzCiBhcmNoaXZlIGFuZCBsaW5rcyBpdCBpbnRvIHRoZSByZXN1bHRpbmcga2VybmVsIGJpbmFyeS4gIEJ5IGRlZmF1bHQsIHRoaXMKLWFyY2hpdmUgaXMgZW1wdHkgKGNvbnN1bWluZyAxMzQgYnl0ZXMgb24geDg2KS4gIFRoZSBjb25maWcgb3B0aW9uCi1DT05GSUdfSU5JVFJBTUZTX1NPVVJDRSAoZm9yIHNvbWUgcmVhc29uIGJ1cmllZCB1bmRlciBkZXZpY2VzLT5ibG9jayBkZXZpY2VzCi1pbiBtZW51Y29uZmlnLCBhbmQgbGl2aW5nIGluIHVzci9LY29uZmlnKSBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgc291cmNlIGZvcgotdGhlIGluaXRyYW1mcyBhcmNoaXZlLCB3aGljaCB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgaW5jb3Jwb3JhdGVkIGludG8gdGhlCi1yZXN1bHRpbmcgYmluYXJ5LiAgVGhpcyBvcHRpb24gY2FuIHBvaW50IHRvIGFuIGV4aXN0aW5nIGd6aXBwZWQgY3BpbyBhcmNoaXZlLCBhCi1kaXJlY3RvcnkgY29udGFpbmluZyBmaWxlcyB0byBiZSBhcmNoaXZlZCwgb3IgYSB0ZXh0IGZpbGUgc3BlY2lmaWNhdGlvbiBzdWNoCi1hcyB0aGUgZm9sbG93aW5nIGV4YW1wbGU6CithcmNoaXZlIGlzIGVtcHR5IChjb25zdW1pbmcgMTM0IGJ5dGVzIG9uIHg4NikuCisKK1RoZSBjb25maWcgb3B0aW9uIENPTkZJR19JTklUUkFNRlNfU09VUkNFIChmb3Igc29tZSByZWFzb24gYnVyaWVkIHVuZGVyCitkZXZpY2VzLT5ibG9jayBkZXZpY2VzIGluIG1lbnVjb25maWcsIGFuZCBsaXZpbmcgaW4gdXNyL0tjb25maWcpIGNhbiBiZSB1c2VkCit0byBzcGVjaWZ5IGEgc291cmNlIGZvciB0aGUgaW5pdHJhbWZzIGFyY2hpdmUsIHdoaWNoIHdpbGwgYXV0b21hdGljYWxseSBiZQoraW5jb3Jwb3JhdGVkIGludG8gdGhlIHJlc3VsdGluZyBiaW5hcnkuICBUaGlzIG9wdGlvbiBjYW4gcG9pbnQgdG8gYW4gZXhpc3RpbmcKK2d6aXBwZWQgY3BpbyBhcmNoaXZlLCBhIGRpcmVjdG9yeSBjb250YWluaW5nIGZpbGVzIHRvIGJlIGFyY2hpdmVkLCBvciBhIHRleHQKK2ZpbGUgc3BlY2lmaWNhdGlvbiBzdWNoIGFzIHRoZSBmb2xsb3dpbmcgZXhhbXBsZToKIAogICBkaXIgL2RldiA3NTUgMCAwCiAgIG5vZCAvZGV2L2NvbnNvbGUgNjQ0IDAgMCBjIDUgMQpAQCAtMTQ2LDIzICsxNTEsODQgQEAKIFJ1biAidXNyL2dlbl9pbml0X2NwaW8iIChhZnRlciB0aGUga2VybmVsIGJ1aWxkKSB0byBnZXQgYSB1c2FnZSBtZXNzYWdlCiBkb2N1bWVudGluZyB0aGUgYWJvdmUgZmlsZSBmb3JtYXQuCiAKLU9uZSBhZHZhbnRhZ2Ugb2YgdGhlIHRleHQgZmlsZSBpcyB0aGF0IHJvb3QgYWNjZXNzIGlzIG5vdCByZXF1aXJlZCB0bworT25lIGFkdmFudGFnZSBvZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlIGlzIHRoYXQgcm9vdCBhY2Nlc3MgaXMgbm90IHJlcXVpcmVkIHRvCiBzZXQgcGVybWlzc2lvbnMgb3IgY3JlYXRlIGRldmljZSBub2RlcyBpbiB0aGUgbmV3IGFyY2hpdmUuICAoTm90ZSB0aGF0IHRob3NlCiB0d28gZXhhbXBsZSAiZmlsZSIgZW50cmllcyBleHBlY3QgdG8gZmluZCBmaWxlcyBuYW1lZCAiaW5pdC5zaCIgYW5kICJidXN5Ym94IiBpbgogYSBkaXJlY3RvcnkgY2FsbGVkICJpbml0cmFtZnMiLCB1bmRlciB0aGUgbGludXgtMi42LiogZGlyZWN0b3J5LiAgU2VlCiBEb2N1bWVudGF0aW9uL2Vhcmx5LXVzZXJzcGFjZS9SRUFETUUgZm9yIG1vcmUgZGV0YWlscy4pCiAKLVRoZSBrZXJuZWwgZG9lcyBub3QgZGVwZW5kIG9uIGV4dGVybmFsIGNwaW8gdG9vbHMsIGdlbl9pbml0X2NwaW8gaXMgY3JlYXRlZAotZnJvbSB1c3IvZ2VuX2luaXRfY3Bpby5jIHdoaWNoIGlzIGVudGlyZWx5IHNlbGYtY29udGFpbmVkLCBhbmQgdGhlIGtlcm5lbCdzCi1ib290LXRpbWUgZXh0cmFjdG9yIGlzIGFsc28gKG9idmlvdXNseSkgc2VsZi1jb250YWluZWQuICBIb3dldmVyLCBpZiB5b3UgX2RvXwotaGFwcGVuIHRvIGhhdmUgY3BpbyBpbnN0YWxsZWQsIHRoZSBmb2xsb3dpbmcgY29tbWFuZCBsaW5lIGNhbiBleHRyYWN0IHRoZQotZ2VuZXJhdGVkIGNwaW8gaW1hZ2UgYmFjayBpbnRvIGl0cyBjb21wb25lbnQgZmlsZXM6CitUaGUga2VybmVsIGRvZXMgbm90IGRlcGVuZCBvbiBleHRlcm5hbCBjcGlvIHRvb2xzLiAgSWYgeW91IHNwZWNpZnkgYQorZGlyZWN0b3J5IGluc3RlYWQgb2YgYSBjb25maWd1cmF0aW9uIGZpbGUsIHRoZSBrZXJuZWwncyBidWlsZCBpbmZyYXN0cnVjdHVyZQorY3JlYXRlcyBhIGNvbmZpZ3VyYXRpb24gZmlsZSBmcm9tIHRoYXQgZGlyZWN0b3J5ICh1c3IvTWFrZWZpbGUgY2FsbHMKK3NjcmlwdHMvZ2VuX2luaXRyYW1mc19saXN0LnNoKSwgYW5kIHByb2NlZWRzIHRvIHBhY2thZ2UgdXAgdGhhdCBkaXJlY3RvcnkKK3VzaW5nIHRoZSBjb25maWcgZmlsZSAoYnkgZmVlZGluZyBpdCB0byB1c3IvZ2VuX2luaXRfY3Bpbywgd2hpY2ggaXMgY3JlYXRlZAorZnJvbSB1c3IvZ2VuX2luaXRfY3Bpby5jKS4gIFRoZSBrZXJuZWwncyBidWlsZC10aW1lIGNwaW8gY3JlYXRpb24gY29kZSBpcworZW50aXJlbHkgc2VsZi1jb250YWluZWQsIGFuZCB0aGUga2VybmVsJ3MgYm9vdC10aW1lIGV4dHJhY3RvciBpcyBhbHNvCisob2J2aW91c2x5KSBzZWxmLWNvbnRhaW5lZC4KKworVGhlIG9uZSB0aGluZyB5b3UgbWlnaHQgbmVlZCBleHRlcm5hbCBjcGlvIHV0aWxpdGllcyBpbnN0YWxsZWQgZm9yIGlzIGNyZWF0aW5nCitvciBleHRyYWN0aW5nIHlvdXIgb3duIHByZXByZXBhcmVkIGNwaW8gZmlsZXMgdG8gZmVlZCB0byB0aGUga2VybmVsIGJ1aWxkCisoaW5zdGVhZCBvZiBhIGNvbmZpZyBmaWxlIG9yIGRpcmVjdG9yeSkuCisKK1RoZSBmb2xsb3dpbmcgY29tbWFuZCBsaW5lIGNhbiBleHRyYWN0IGEgY3BpbyBpbWFnZSAoZWl0aGVyIGJ5IHRoZSBhYm92ZSBzY3JpcHQKK29yIGJ5IHRoZSBrZXJuZWwgYnVpbGQpIGJhY2sgaW50byBpdHMgY29tcG9uZW50IGZpbGVzOgogCiAgIGNwaW8gLWkgLWQgLUggbmV3YyAtRiBpbml0cmFtZnNfZGF0YS5jcGlvIC0tbm8tYWJzb2x1dGUtZmlsZW5hbWVzCiAKK1RoZSBmb2xsb3dpbmcgc2hlbGwgc2NyaXB0IGNhbiBjcmVhdGUgYSBwcmVidWlsdCBjcGlvIGFyY2hpdmUgeW91IGNhbgordXNlIGluIHBsYWNlIG9mIHRoZSBhYm92ZSBjb25maWcgZmlsZToKKworICAjIS9iaW4vc2gKKworICAjIENvcHlyaWdodCAyMDA2IFJvYiBMYW5kbGV5IDxyb2JAbGFuZGxleS5uZXQ+IGFuZCBUaW1lU3lzIENvcnBvcmF0aW9uLgorICAjIExpY2Vuc2VkIHVuZGVyIEdQTCB2ZXJzaW9uIDIKKworICBpZiBbICQjIC1uZSAyIF0KKyAgdGhlbgorICAgIGVjaG8gInVzYWdlOiBta2luaXRyYW1mcyBkaXJlY3RvcnkgaW1hZ2VuYW1lLmNwaW8uZ3oiCisgICAgZXhpdCAxCisgIGZpCisKKyAgaWYgWyAtZCAiJDEiIF0KKyAgdGhlbgorICAgIGVjaG8gImNyZWF0aW5nICQyIGZyb20gJDEiCisgICAgKGNkICIkMSI7IGZpbmQgLiB8IGNwaW8gLW8gLUggbmV3YyB8IGd6aXApID4gIiQyIgorICBlbHNlCisgICAgZWNobyAiRmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIGRpcmVjdG9yeSIKKyAgICBleGl0IDEKKyAgZmkKKworTm90ZTogVGhlIGNwaW8gbWFuIHBhZ2UgY29udGFpbnMgc29tZSBiYWQgYWR2aWNlIHRoYXQgd2lsbCBicmVhayB5b3VyIGluaXRyYW1mcworYXJjaGl2ZSBpZiB5b3UgZm9sbG93IGl0LiAgSXQgc2F5cyAiQSB0eXBpY2FsIHdheSB0byBnZW5lcmF0ZSB0aGUgbGlzdAorb2YgZmlsZW5hbWVzIGlzIHdpdGggdGhlIGZpbmQgY29tbWFuZDsgeW91IHNob3VsZCBnaXZlIGZpbmQgdGhlIC1kZXB0aCBvcHRpb24KK3RvIG1pbmltaXplIHByb2JsZW1zIHdpdGggcGVybWlzc2lvbnMgb24gZGlyZWN0b3JpZXMgdGhhdCBhcmUgdW53cml0YWJsZSBvciBub3QKK3NlYXJjaGFibGUuIiAgRG9uJ3QgZG8gdGhpcyB3aGVuIGNyZWF0aW5nIGluaXRyYW1mcy5jcGlvLmd6IGltYWdlcywgaXQgd29uJ3QKK3dvcmsuICBUaGUgTGludXgga2VybmVsIGNwaW8gZXh0cmFjdG9yIHdvbid0IGNyZWF0ZSBmaWxlcyBpbiBhIGRpcmVjdG9yeSB0aGF0Citkb2Vzbid0IGV4aXN0LCBzbyB0aGUgZGlyZWN0b3J5IGVudHJpZXMgbXVzdCBnbyBiZWZvcmUgdGhlIGZpbGVzIHRoYXQgZ28gaW4KK3Rob3NlIGRpcmVjdG9yaWVzLiAgVGhlIGFib3ZlIHNjcmlwdCBnZXRzIHRoZW0gaW4gdGhlIHJpZ2h0IG9yZGVyLgorCitFeHRlcm5hbCBpbml0cmFtZnMgaW1hZ2VzOgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSWYgdGhlIGtlcm5lbCBoYXMgaW5pdHJkIHN1cHBvcnQgZW5hYmxlZCwgYW4gZXh0ZXJuYWwgY3Bpby5neiBhcmNoaXZlIGNhbiBhbHNvCitiZSBwYXNzZWQgaW50byBhIDIuNiBrZXJuZWwgaW4gcGxhY2Ugb2YgYW4gaW5pdHJkLiAgSW4gdGhpcyBjYXNlLCB0aGUga2VybmVsCit3aWxsIGF1dG9kZXRlY3QgdGhlIHR5cGUgKGluaXRyYW1mcywgbm90IGluaXRyZCkgYW5kIGV4dHJhY3QgdGhlIGV4dGVybmFsIGNwaW8KK2FyY2hpdmUgaW50byByb290ZnMgYmVmb3JlIHRyeWluZyB0byBydW4gL2luaXQuCisKK1RoaXMgaGFzIHRoZSBtZW1vcnkgZWZmaWNpZW5jeSBhZHZhbnRhZ2VzIG9mIGluaXRyYW1mcyAobm8gcmFtZGlzayBibG9jaworZGV2aWNlKSBidXQgdGhlIHNlcGFyYXRlIHBhY2thZ2luZyBvZiBpbml0cmQgKHdoaWNoIGlzIG5pY2UgaWYgeW91IGhhdmUKK25vbi1HUEwgY29kZSB5b3UnZCBsaWtlIHRvIHJ1biBmcm9tIGluaXRyYW1mcywgd2l0aG91dCBjb25mbGF0aW5nIGl0IHdpdGgKK3RoZSBHUEwgbGljZW5zZWQgTGludXgga2VybmVsIGJpbmFyeSkuCisKK0l0IGNhbiBhbHNvIGJlIHVzZWQgdG8gc3VwcGxlbWVudCB0aGUga2VybmVsJ3MgYnVpbHQtaW4gaW5pdGFtZnMgaW1hZ2UuICBUaGUKK2ZpbGVzIGluIHRoZSBleHRlcm5hbCBhcmNoaXZlIHdpbGwgb3ZlcndyaXRlIGFueSBjb25mbGljdGluZyBmaWxlcyBpbgordGhlIGJ1aWx0LWluIGluaXRyYW1mcyBhcmNoaXZlLiAgU29tZSBkaXN0cmlidXRvcnMgYWxzbyBwcmVmZXIgdG8gY3VzdG9taXplCithIHNpbmdsZSBrZXJuZWwgaW1hZ2Ugd2l0aCB0YXNrLXNwZWNpZmljIGluaXRyYW1mcyBpbWFnZXMsIHdpdGhvdXQgcmVjb21waWxpbmcuCisKIENvbnRlbnRzIG9mIGluaXRyYW1mczoKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAorQW4gaW5pdHJhbWZzIGFyY2hpdmUgaXMgYSBjb21wbGV0ZSBzZWxmLWNvbnRhaW5lZCByb290IGZpbGVzeXN0ZW0gZm9yIExpbnV4LgogSWYgeW91IGRvbid0IGFscmVhZHkgdW5kZXJzdGFuZCB3aGF0IHNoYXJlZCBsaWJyYXJpZXMsIGRldmljZXMsIGFuZCBwYXRocwogeW91IG5lZWQgdG8gZ2V0IGEgbWluaW1hbCByb290IGZpbGVzeXN0ZW0gdXAgYW5kIHJ1bm5pbmcsIGhlcmUgYXJlIHNvbWUKIHJlZmVyZW5jZXM6CkBAIC0xNzYsMTMgKzI0MiwzNiBAQAogCiBJIHVzZSB1Q2xpYmMgKGh0dHA6Ly93d3cudWNsaWJjLm9yZykgYW5kIGJ1c3lib3ggKGh0dHA6Ly93d3cuYnVzeWJveC5uZXQpCiBteXNlbGYuICBUaGVzZSBhcmUgTEdQTCBhbmQgR1BMLCByZXNwZWN0aXZlbHkuICAoQSBzZWxmLWNvbnRhaW5lZCBpbml0cmFtZnMKLXBhY2thZ2UgaXMgcGxhbm5lZCBmb3IgdGhlIGJ1c3lib3ggMS4yIHJlbGVhc2UuKQorcGFja2FnZSBpcyBwbGFubmVkIGZvciB0aGUgYnVzeWJveCAxLjMgcmVsZWFzZS4pCiAKIEluIHRoZW9yeSB5b3UgY291bGQgdXNlIGdsaWJjLCBidXQgdGhhdCdzIG5vdCB3ZWxsIHN1aXRlZCBmb3Igc21hbGwgZW1iZWRkZWQKIHVzZXMgbGlrZSB0aGlzLiAgKEEgImhlbGxvIHdvcmxkIiBwcm9ncmFtIHN0YXRpY2FsbHkgbGlua2VkIGFnYWluc3QgZ2xpYmMgaXMKIG92ZXIgNDAway4gIFdpdGggdUNsaWJjIGl0J3MgN2suICBBbHNvIG5vdGUgdGhhdCBnbGliYyBkbG9wZW5zIGxpYm5zcyB0byBkbwogbmFtZSBsb29rdXBzLCBldmVuIHdoZW4gb3RoZXJ3aXNlIHN0YXRpY2FsbHkgbGlua2VkLikKIAorQSBnb29kIGZpcnN0IHN0ZXAgaXMgdG8gZ2V0IGluaXRyYW1mcyB0byBydW4gYSBzdGF0aWNhbGx5IGxpbmtlZCAiaGVsbG8gd29ybGQiCitwcm9ncmFtIGFzIGluaXQsIGFuZCB0ZXN0IGl0IHVuZGVyIGFuIGVtdWxhdG9yIGxpa2UgcWVtdSAod3d3LnFlbXUub3JnKSBvcgorVXNlciBNb2RlIExpbnV4LCBsaWtlIHNvOgorCisgIGNhdCA+IGhlbGxvLmMgPDwgRU9GCisgICNpbmNsdWRlIDxzdGRpby5oPgorICAjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKKyAgeworICAgIHByaW50ZigiSGVsbG8gd29ybGQhXG4iKTsKKyAgICBzbGVlcCg5OTk5OTk5OTkpOworICB9CisgIEVPRgorICBnY2MgLXN0YXRpYyBoZWxsbzIuYyAtbyBpbml0CisgIGVjaG8gaW5pdCB8IGNwaW8gLW8gLUggbmV3YyB8IGd6aXAgPiB0ZXN0LmNwaW8uZ3oKKyAgIyBUZXN0aW5nIGV4dGVybmFsIGluaXRyYW1mcyB1c2luZyB0aGUgaW5pdHJkIGxvYWRpbmcgbWVjaGFuaXNtLgorICBxZW11IC1rZXJuZWwgL2Jvb3Qvdm1saW51eiAtaW5pdHJkIHRlc3QuY3Bpby5neiAvZGV2L3plcm8KKworV2hlbiBkZWJ1Z2dpbmcgYSBub3JtYWwgcm9vdCBmaWxlc3lzdGVtLCBpdCdzIG5pY2UgdG8gYmUgYWJsZSB0byBib290IHdpdGgKKyJpbml0PS9iaW4vc2giLiAgVGhlIGluaXRyYW1mcyBlcXVpdmFsZW50IGlzICJyZGluaXQ9L2Jpbi9zaCIsIGFuZCBpdCdzCitqdXN0IGFzIHVzZWZ1bC4KKwogV2h5IGNwaW8gcmF0aGVyIHRoYW4gdGFyPwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC0yNDEsNyArMzMwLDcgQEAKIEZ1dHVyZSBkaXJlY3Rpb25zOgogLS0tLS0tLS0tLS0tLS0tLS0tCiAKLVRvZGF5ICgyLjYuMTQpLCBpbml0cmFtZnMgaXMgYWx3YXlzIGNvbXBpbGVkIGluLCBidXQgbm90IGFsd2F5cyB1c2VkLiAgVGhlCitUb2RheSAoMi42LjE2KSwgaW5pdHJhbWZzIGlzIGFsd2F5cyBjb21waWxlZCBpbiwgYnV0IG5vdCBhbHdheXMgdXNlZC4gIFRoZQoga2VybmVsIGZhbGxzIGJhY2sgdG8gbGVnYWN5IGJvb3QgY29kZSB0aGF0IGlzIHJlYWNoZWQgb25seSBpZiBpbml0cmFtZnMgZG9lcwogbm90IGNvbnRhaW4gYW4gL2luaXQgcHJvZ3JhbS4gIFRoZSBmYWxsYmFjayBpcyBsZWdhY3kgY29kZSwgdGhlcmUgdG8gZW5zdXJlIGEKIHNtb290aCB0cmFuc2l0aW9uIGFuZCBhbGxvd2luZyBlYXJseSBib290IGZ1bmN0aW9uYWxpdHkgdG8gZ3JhZHVhbGx5IG1vdmUgdG8KQEAgLTI1OCw4ICszNDcsOSBAQAogCiBUaGlzIGtpbmQgb2YgY29tcGxleGl0eSAod2hpY2ggaW5ldml0YWJseSBpbmNsdWRlcyBwb2xpY3kpIGlzIHJpZ2h0bHkgaGFuZGxlZAogaW4gdXNlcnNwYWNlLiAgQm90aCBrbGliYyBhbmQgYnVzeWJveC91Q2xpYmMgYXJlIHdvcmtpbmcgb24gc2ltcGxlIGluaXRyYW1mcwotcGFja2FnZXMgdG8gZHJvcCBpbnRvIGEga2VybmVsIGJ1aWxkLCBhbmQgd2hlbiBzdGFuZGFyZCBzb2x1dGlvbnMgYXJlIHJlYWR5Ci1hbmQgd2lkZWx5IGRlcGxveWVkLCB0aGUga2VybmVsJ3MgbGVnYWN5IGVhcmx5IGJvb3QgY29kZSB3aWxsIGJlY29tZSBvYnNvbGV0ZQotYW5kIGEgY2FuZGlkYXRlIGZvciB0aGUgZmVhdHVyZSByZW1vdmFsIHNjaGVkdWxlLgorcGFja2FnZXMgdG8gZHJvcCBpbnRvIGEga2VybmVsIGJ1aWxkLgogCi1CdXQgdGhhdCdzIGEgd2hpbGUgb2ZmIHlldC4KK1RoZSBrbGliYyBwYWNrYWdlIGhhcyBub3cgYmVlbiBhY2NlcHRlZCBpbnRvIEFuZHJldyBNb3J0b24ncyAyLjYuMTctbW0gdHJlZS4KK1RoZSBrZXJuZWwncyBjdXJyZW50IGVhcmx5IGJvb3QgY29kZSAocGFydGl0aW9uIGRldGVjdGlvbiwgZXRjKSB3aWxsIHByb2JhYmx5CitiZSBtaWdyYXRlZCBpbnRvIGEgZGVmYXVsdCBpbml0cmFtZnMsIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBhbmQgdXNlZCBieSB0aGUKK2tlcm5lbCBidWlsZC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24va2J1aWxkL21ha2VmaWxlcy50eHQgYi9Eb2N1bWVudGF0aW9uL2tidWlsZC9tYWtlZmlsZXMudHh0CmluZGV4IGE5YzAwZmEuLjE0ZWYzODY4IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2tidWlsZC9tYWtlZmlsZXMudHh0CisrKyBiL0RvY3VtZW50YXRpb24va2J1aWxkL21ha2VmaWxlcy50eHQKQEAgLTExMjMsNiArMTEyMywxNCBAQAogCSQoSU5TVEFMTF9NT0RfUEFUSCkvbGliL21vZHVsZXMvJChLRVJORUxSRUxFQVNFKS4gIFRoZSB1c2VyIG1heQogCW92ZXJyaWRlIHRoaXMgdmFsdWUgb24gdGhlIGNvbW1hbmQgbGluZSBpZiBkZXNpcmVkLgogCisgICAgSU5TVEFMTF9NT0RfU1RSSVAKKworCUlmIHRoaXMgdmFyaWFibGUgaXMgc3BlY2lmaWVkLCB3aWxsIGNhdXNlIG1vZHVsZXMgdG8gYmUgc3RyaXBwZWQKKwlhZnRlciB0aGV5IGFyZSBpbnN0YWxsZWQuICBJZiBJTlNUQUxMX01PRF9TVFJJUCBpcyAnMScsIHRoZW4gdGhlCisJZGVmYXVsdCBvcHRpb24gLS1zdHJpcC1kZWJ1ZyB3aWxsIGJlIHVzZWQuICBPdGhlcndpc2UsCisJSU5TVEFMTF9NT0RfU1RSSVAgd2lsbCB1c2VkIGFzIHRoZSBvcHRpb24ocykgdG8gdGhlIHN0cmlwIGNvbW1hbmQuCisKKwogPT09IDggTWFrZWZpbGUgbGFuZ3VhZ2UKIAogVGhlIGtlcm5lbCBNYWtlZmlsZXMgYXJlIGRlc2lnbmVkIHRvIHJ1biB3aXRoIEdOVSBNYWtlLiAgVGhlIE1ha2VmaWxlcwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9rZHVtcC9nZGJtYWNyb3MudHh0IGIvRG9jdW1lbnRhdGlvbi9rZHVtcC9nZGJtYWNyb3MudHh0CmluZGV4IGRjZjU1ODAuLjliOWI0NTQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24va2R1bXAvZ2RibWFjcm9zLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2tkdW1wL2dkYm1hY3Jvcy50eHQKQEAgLTE3NSw3ICsxNzUsNyBAQAogZG9jdW1lbnQgdHJhcGluZm8KIAlSdW4gaW5mbyB0aHJlYWRzIGFuZCBsb29rdXAgcGlkIG9mIHRocmVhZCAjMQogCSd0cmFwaW5mbyA8cGlkPicgd2lsbCB0ZWxsIHlvdSBieSB3aGljaCB0cmFwICYgcG9zc2libHkKLQlhZGRyZXN0aGUga2VybmVsIHBhbmljZWQuCisJYWRkcmVzcyB0aGUga2VybmVsIHBhbmlja2VkLgogZW5kCiAKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9rZHVtcC9rZHVtcC50eHQgYi9Eb2N1bWVudGF0aW9uL2tkdW1wL2tkdW1wLnR4dAppbmRleCAyMTJjZjNjLi4wOGJhZmE4IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2tkdW1wL2tkdW1wLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2tkdW1wL2tkdW1wLnR4dApAQCAtMSwxNTUgKzEsMzI1IEBACi1Eb2N1bWVudGF0aW9uIGZvciBrZHVtcCAtIHRoZSBrZXhlYy1iYXNlZCBjcmFzaCBkdW1waW5nIHNvbHV0aW9uCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitEb2N1bWVudGF0aW9uIGZvciBLZHVtcCAtIFRoZSBrZXhlYy1iYXNlZCBDcmFzaCBEdW1waW5nIFNvbHV0aW9uCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLURFU0lHTgotPT09PT09CitUaGlzIGRvY3VtZW50IGluY2x1ZGVzIG92ZXJ2aWV3LCBzZXR1cCBhbmQgaW5zdGFsbGF0aW9uLCBhbmQgYW5hbHlzaXMKK2luZm9ybWF0aW9uLgogCi1LZHVtcCB1c2VzIGtleGVjIHRvIHJlYm9vdCB0byBhIHNlY29uZCBrZXJuZWwgd2hlbmV2ZXIgYSBkdW1wIG5lZWRzIHRvIGJlCi10YWtlbi4gVGhpcyBzZWNvbmQga2VybmVsIGlzIGJvb3RlZCB3aXRoIHZlcnkgbGl0dGxlIG1lbW9yeS4gVGhlIGZpcnN0IGtlcm5lbAotcmVzZXJ2ZXMgdGhlIHNlY3Rpb24gb2YgbWVtb3J5IHRoYXQgdGhlIHNlY29uZCBrZXJuZWwgdXNlcy4gVGhpcyBlbnN1cmVzIHRoYXQKLW9uLWdvaW5nIERNQSBmcm9tIHRoZSBmaXJzdCBrZXJuZWwgZG9lcyBub3QgY29ycnVwdCB0aGUgc2Vjb25kIGtlcm5lbC4KK092ZXJ2aWV3Cis9PT09PT09PQogCi1BbGwgdGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBhYm91dCBDb3JlIGltYWdlIGlzIGVuY29kZWQgaW4gRUxGIGZvcm1hdCBhbmQKLXN0b3JlZCBpbiByZXNlcnZlZCBhcmVhIG9mIG1lbW9yeSBiZWZvcmUgY3Jhc2guIFBoeXNpY2FsIGFkZHJlc3Mgb2Ygc3RhcnQgb2YKLUVMRiBoZWFkZXIgaXMgcGFzc2VkIHRvIG5ldyBrZXJuZWwgdGhyb3VnaCBjb21tYW5kIGxpbmUgcGFyYW1ldGVyIGVsZmNvcmVoZHI9LgorS2R1bXAgdXNlcyBrZXhlYyB0byBxdWlja2x5IGJvb3QgdG8gYSBkdW1wLWNhcHR1cmUga2VybmVsIHdoZW5ldmVyIGEKK2R1bXAgb2YgdGhlIHN5c3RlbSBrZXJuZWwncyBtZW1vcnkgbmVlZHMgdG8gYmUgdGFrZW4gKGZvciBleGFtcGxlLCB3aGVuCit0aGUgc3lzdGVtIHBhbmljcykuIFRoZSBzeXN0ZW0ga2VybmVsJ3MgbWVtb3J5IGltYWdlIGlzIHByZXNlcnZlZCBhY3Jvc3MKK3RoZSByZWJvb3QgYW5kIGlzIGFjY2Vzc2libGUgdG8gdGhlIGR1bXAtY2FwdHVyZSBrZXJuZWwuCiAKLU9uIGkzODYsIHRoZSBmaXJzdCA2NDAgS0Igb2YgcGh5c2ljYWwgbWVtb3J5IGlzIG5lZWRlZCB0byBib290LCBpcnJlc3BlY3RpdmUKLW9mIHdoZXJlIHRoZSBrZXJuZWwgbG9hZHMuIEhlbmNlLCB0aGlzIHJlZ2lvbiBpcyBiYWNrZWQgdXAgYnkga2V4ZWMganVzdCBiZWZvcmUKLXJlYm9vdGluZyBpbnRvIHRoZSBuZXcga2VybmVsLgorWW91IGNhbiB1c2UgY29tbW9uIExpbnV4IGNvbW1hbmRzLCBzdWNoIGFzIGNwIGFuZCBzY3AsIHRvIGNvcHkgdGhlCittZW1vcnkgaW1hZ2UgdG8gYSBkdW1wIGZpbGUgb24gdGhlIGxvY2FsIGRpc2ssIG9yIGFjcm9zcyB0aGUgbmV0d29yayB0bworYSByZW1vdGUgc3lzdGVtLgogCi1JbiB0aGUgc2Vjb25kIGtlcm5lbCwgIm9sZCBtZW1vcnkiIGNhbiBiZSBhY2Nlc3NlZCBpbiB0d28gd2F5cy4KK0tkdW1wIGFuZCBrZXhlYyBhcmUgY3VycmVudGx5IHN1cHBvcnRlZCBvbiB0aGUgeDg2LCB4ODZfNjQsIGFuZCBwcGM2NAorYXJjaGl0ZWN0dXJlcy4KIAotLSBUaGUgZmlyc3Qgb25lIGlzIHRocm91Z2ggYSAvZGV2L29sZG1lbSBkZXZpY2UgaW50ZXJmYWNlLiBBIGNhcHR1cmUgdXRpbGl0eQotICBjYW4gcmVhZCB0aGUgZGV2aWNlIGZpbGUgYW5kIHdyaXRlIG91dCB0aGUgbWVtb3J5IGluIHJhdyBmb3JtYXQuIFRoaXMgaXMgcmF3Ci0gIGR1bXAgb2YgbWVtb3J5IGFuZCBhbmFseXNpcy9jYXB0dXJlIHRvb2wgc2hvdWxkIGJlIGludGVsbGlnZW50IGVub3VnaCB0bwotICBkZXRlcm1pbmUgd2hlcmUgdG8gbG9vayBmb3IgdGhlIHJpZ2h0IGluZm9ybWF0aW9uLiBFTEYgaGVhZGVycyAoZWxmY29yZWhkcj0pCi0gIGNhbiBiZWNvbWUgaGFuZHkgaGVyZS4KK1doZW4gdGhlIHN5c3RlbSBrZXJuZWwgYm9vdHMsIGl0IHJlc2VydmVzIGEgc21hbGwgc2VjdGlvbiBvZiBtZW1vcnkgZm9yCit0aGUgZHVtcC1jYXB0dXJlIGtlcm5lbC4gVGhpcyBlbnN1cmVzIHRoYXQgb25nb2luZyBEaXJlY3QgTWVtb3J5IEFjY2VzcworKERNQSkgZnJvbSB0aGUgc3lzdGVtIGtlcm5lbCBkb2VzIG5vdCBjb3JydXB0IHRoZSBkdW1wLWNhcHR1cmUga2VybmVsLgorVGhlIGtleGVjIC1wIGNvbW1hbmQgbG9hZHMgdGhlIGR1bXAtY2FwdHVyZSBrZXJuZWwgaW50byB0aGlzIHJlc2VydmVkCittZW1vcnkuCiAKLS0gVGhlIHNlY29uZCBpbnRlcmZhY2UgaXMgdGhyb3VnaCAvcHJvYy92bWNvcmUuIFRoaXMgZXhwb3J0cyB0aGUgZHVtcCBhcyBhbiBFTEYKLSAgZm9ybWF0IGZpbGUgd2hpY2ggY2FuIGJlIHdyaXR0ZW4gb3V0IHVzaW5nIGFueSBmaWxlIGNvcHkgY29tbWFuZAotICAoY3AsIHNjcCwgZXRjKS4gRnVydGhlciwgZ2RiIGNhbiBiZSB1c2VkIHRvIHBlcmZvcm0gbGltaXRlZCBkZWJ1Z2dpbmcgb24KLSAgdGhlIGR1bXAgZmlsZS4gVGhpcyBtZXRob2QgZW5zdXJlcyBtZXRob2RzIGVuc3VyZSB0aGF0IHRoZXJlIGlzIGNvcnJlY3QKLSAgb3JkZXJpbmcgb2YgdGhlIGR1bXAgcGFnZXMgKGNvcnJlc3BvbmRpbmcgdG8gdGhlIGZpcnN0IDY0MCBLQiB0aGF0IGhhcyBiZWVuCi0gIHJlbG9jYXRlZCkuCitPbiB4ODYgbWFjaGluZXMsIHRoZSBmaXJzdCA2NDAgS0Igb2YgcGh5c2ljYWwgbWVtb3J5IGlzIG5lZWRlZCB0byBib290LAorcmVnYXJkbGVzcyBvZiB3aGVyZSB0aGUga2VybmVsIGxvYWRzLiBUaGVyZWZvcmUsIGtleGVjIGJhY2tzIHVwIHRoaXMKK3JlZ2lvbiBqdXN0IGJlZm9yZSByZWJvb3RpbmcgaW50byB0aGUgZHVtcC1jYXB0dXJlIGtlcm5lbC4KIAotU0VUVVAKLT09PT09CitBbGwgb2YgdGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3lzdGVtIGtlcm5lbCdzIGNvcmUgaW1hZ2UgaXMKK2VuY29kZWQgaW4gdGhlIEVMRiBmb3JtYXQsIGFuZCBzdG9yZWQgaW4gYSByZXNlcnZlZCBhcmVhIG9mIG1lbW9yeQorYmVmb3JlIGEgY3Jhc2guIFRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBzdGFydCBvZiB0aGUgRUxGIGhlYWRlciBpcworcGFzc2VkIHRvIHRoZSBkdW1wLWNhcHR1cmUga2VybmVsIHRocm91Z2ggdGhlIGVsZmNvcmVoZHI9IGJvb3QKK3BhcmFtZXRlci4KIAotMSkgRG93bmxvYWQgdGhlIHVwc3RyZWFtIGtleGVjLXRvb2xzIHVzZXJzcGFjZSBwYWNrYWdlIGZyb20KLSAgIGh0dHA6Ly93d3cueG1pc3Npb24uY29tL35lYmllZGVybS9maWxlcy9rZXhlYy9rZXhlYy10b29scy0xLjEwMS50YXIuZ3ouCitXaXRoIHRoZSBkdW1wLWNhcHR1cmUga2VybmVsLCB5b3UgY2FuIGFjY2VzcyB0aGUgbWVtb3J5IGltYWdlLCBvciAib2xkCittZW1vcnksIiBpbiB0d28gd2F5czoKIAotICAgQXBwbHkgdGhlIGxhdGVzdCBjb25zb2xpZGF0ZWQga2R1bXAgcGF0Y2ggb24gdG9wIG9mIGtleGVjLXRvb2xzLTEuMTAxCi0gICBmcm9tIGh0dHA6Ly9sc2Uuc291cmNlZm9yZ2UubmV0L2tkdW1wLy4gVGhpcyBhcnJhbmdtZW50IGhhcyBiZWVuIG1hZGUKLSAgIHRpbGwgYWxsIHRoZSB1c2Vyc3BhY2UgcGF0Y2hlcyBzdXBwb3J0aW5nIGtkdW1wIGFyZSBpbnRlZ3JhdGVkIHdpdGgKLSAgIHVwc3RyZWFtIGtleGVjLXRvb2xzIHVzZXJzcGFjZS4KKy0gVGhyb3VnaCBhIC9kZXYvb2xkbWVtIGRldmljZSBpbnRlcmZhY2UuIEEgY2FwdHVyZSB1dGlsaXR5IGNhbiByZWFkIHRoZQorICBkZXZpY2UgZmlsZSBhbmQgd3JpdGUgb3V0IHRoZSBtZW1vcnkgaW4gcmF3IGZvcm1hdC4gVGhpcyBpcyBhIHJhdyBkdW1wCisgIG9mIG1lbW9yeS4gQW5hbHlzaXMgYW5kIGNhcHR1cmUgdG9vbHMgbXVzdCBiZSBpbnRlbGxpZ2VudCBlbm91Z2ggdG8KKyAgZGV0ZXJtaW5lIHdoZXJlIHRvIGxvb2sgZm9yIHRoZSByaWdodCBpbmZvcm1hdGlvbi4KIAotMikgRG93bmxvYWQgYW5kIGJ1aWxkIHRoZSBhcHByb3ByaWF0ZSAoMi42LjEzLXJjMSBvbndhcmRzKSB2YW5pbGxhIGtlcm5lbHMuCi0gICBUd28ga2VybmVscyBuZWVkIHRvIGJlIGJ1aWx0IGluIG9yZGVyIHRvIGdldCB0aGlzIGZlYXR1cmUgd29ya2luZy4KLSAgIEZvbGxvd2luZyBhcmUgdGhlIHN0ZXBzIHRvIHByb3Blcmx5IGNvbmZpZ3VyZSB0aGUgdHdvIGtlcm5lbHMgc3BlY2lmaWMKLSAgIHRvIGtleGVjIGFuZCBrZHVtcCBmZWF0dXJlczoKLQotICBBKSBGaXJzdCBrZXJuZWwgb3IgcmVndWxhciBrZXJuZWw6Ci0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgIGEpIEVuYWJsZSAia2V4ZWMgc3lzdGVtIGNhbGwiIGZlYXR1cmUgKGluIFByb2Nlc3NvciB0eXBlIGFuZCBmZWF0dXJlcykuCi0gICAgICBDT05GSUdfS0VYRUM9eQotICAgYikgRW5hYmxlICJzeXNmcyBmaWxlIHN5c3RlbSBzdXBwb3J0IiAoaW4gUHNldWRvIGZpbGVzeXN0ZW1zKS4KLSAgICAgIENPTkZJR19TWVNGUz15Ci0gICBjKSBtYWtlCi0gICBkKSBCb290IGludG8gZmlyc3Qga2VybmVsIHdpdGggdGhlIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXIgImNyYXNoa2VybmVsPVlAWCIuCi0gICAgICBVc2UgYXBwcm9wcmlhdGUgdmFsdWVzIGZvciBYIGFuZCBZLiBZIGRlbm90ZXMgaG93IG11Y2ggbWVtb3J5IHRvIHJlc2VydmUKLSAgICAgIGZvciB0aGUgc2Vjb25kIGtlcm5lbCwgYW5kIFggZGVub3RlcyBhdCB3aGF0IHBoeXNpY2FsIGFkZHJlc3MgdGhlCi0gICAgICByZXNlcnZlZCBtZW1vcnkgc2VjdGlvbiBzdGFydHMuIEZvciBleGFtcGxlOiAiY3Jhc2hrZXJuZWw9NjRNQDE2TSIuCistIFRocm91Z2ggL3Byb2Mvdm1jb3JlLiBUaGlzIGV4cG9ydHMgdGhlIGR1bXAgYXMgYW4gRUxGLWZvcm1hdCBmaWxlIHRoYXQKKyAgeW91IGNhbiB3cml0ZSBvdXQgdXNpbmcgZmlsZSBjb3B5IGNvbW1hbmRzIHN1Y2ggYXMgY3Agb3Igc2NwLiBGdXJ0aGVyLAorICB5b3UgY2FuIHVzZSBhbmFseXNpcyB0b29scyBzdWNoIGFzIHRoZSBHTlUgRGVidWdnZXIgKEdEQikgYW5kIHRoZSBDcmFzaAorICB0b29sIHRvIGRlYnVnIHRoZSBkdW1wIGZpbGUuIFRoaXMgbWV0aG9kIGVuc3VyZXMgdGhhdCB0aGUgZHVtcCBwYWdlcyBhcmUKKyAgY29ycmVjdGx5IG9yZGVyZWQuCiAKIAotICBCKSBTZWNvbmQga2VybmVsIG9yIGR1bXAgY2FwdHVyZSBrZXJuZWw6Ci0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgYSkgRm9yIGkzODYgYXJjaGl0ZWN0dXJlIGVuYWJsZSBIaWdobWVtIHN1cHBvcnQKLSAgICAgIENPTkZJR19ISUdITUVNPXkKLSAgIGIpIEVuYWJsZSAia2VybmVsIGNyYXNoIGR1bXBzIiBmZWF0dXJlICh1bmRlciAiUHJvY2Vzc29yIHR5cGUgYW5kIGZlYXR1cmVzIikKLSAgICAgIENPTkZJR19DUkFTSF9EVU1QPXkKLSAgIGMpIE1ha2Ugc3VyZSBhIHN1aXRhYmxlIHZhbHVlIGZvciAiUGh5c2ljYWwgYWRkcmVzcyB3aGVyZSB0aGUga2VybmVsIGlzCi0gICAgICBsb2FkZWQiICh1bmRlciAiUHJvY2Vzc29yIHR5cGUgYW5kIGZlYXR1cmVzIikuIEJ5IGRlZmF1bHQgdGhpcyB2YWx1ZQotICAgICAgaXMgMHgxMDAwMDAwICgxNk1CKSBhbmQgaXQgc2hvdWxkIGJlIHNhbWUgYXMgWCAoU2VlIG9wdGlvbiBkIGFib3ZlKSwKLSAgICAgIGUuZy4sIDE2IE1CIG9yIDB4MTAwMDAwMC4KLSAgICAgIENPTkZJR19QSFlTSUNBTF9TVEFSVD0weDEwMDAwMDAKLSAgIGQpIEVuYWJsZSAiL3Byb2Mvdm1jb3JlIHN1cHBvcnQiIChPcHRpb25hbCwgdW5kZXIgIlBzZXVkbyBmaWxlc3lzdGVtcyIpLgotICAgICAgQ09ORklHX1BST0NfVk1DT1JFPXkKK1NldHVwIGFuZCBJbnN0YWxsYXRpb24KKz09PT09PT09PT09PT09PT09PT09PT0KIAotMykgQWZ0ZXIgYm9vdGluZyB0byByZWd1bGFyIGtlcm5lbCBvciBmaXJzdCBrZXJuZWwsIGxvYWQgdGhlIHNlY29uZCBrZXJuZWwKLSAgIHVzaW5nIHRoZSBmb2xsb3dpbmcgY29tbWFuZDoKK0luc3RhbGwga2V4ZWMtdG9vbHMgYW5kIHRoZSBLZHVtcCBwYXRjaAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLSAgIGtleGVjIC1wIDxzZWNvbmQta2VybmVsPiAtLWFyZ3MtbGludXggLS1lbGYzMi1jb3JlLWhlYWRlcnMKLSAgIC0tYXBwZW5kPSJyb290PTxyb290LWRldj4gaW5pdCAxIGlycXBvbGwgbWF4Y3B1cz0xIgorMSkgTG9naW4gYXMgdGhlIHJvb3QgdXNlci4KIAotICAgTm90ZXM6Ci0gICA9PT09PT0KLSAgICAgaSkgPHNlY29uZC1rZXJuZWw+IGhhcyB0byBiZSBhIHZtbGludXggaW1hZ2UgaWUgdW5jb21wcmVzc2VkIGVsZiBpbWFnZS4KLSAgICAgICAgYnpJbWFnZSB3aWxsIG5vdCB3b3JrLCBhcyBvZiBub3cuCi0gICAgaWkpIC0tYXJncy1saW51eCBoYXMgdG8gYmUgc3BlaWNmaWVkIGFzIGlmIGtleGVjIGl0IGxvYWRpbmcgYW4gZWxmIGltYWdlLAotICAgICAgICBpdCBuZWVkcyB0byBrbm93IHRoYXQgdGhlIGFyZ3VtZW50cyBzdXBwbGllZCBhcmUgb2YgbGludXggdHlwZS4KLSAgIGlpaSkgQnkgZGVmYXVsdCBFTEYgaGVhZGVycyBhcmUgc3RvcmVkIGluIEVMRjY0IGZvcm1hdCB0byBzdXBwb3J0IHN5c3RlbXMKLSAgICAgICAgd2l0aCBtb3JlIHRoYW4gNEdCIG1lbW9yeS4gT3B0aW9uIC0tZWxmMzItY29yZS1oZWFkZXJzIGZvcmNlcyBnZW5lcmF0aW9uCi0gICAgICAgIG9mIEVMRjMyIGhlYWRlcnMuIFRoZSByZWFzb24gZm9yIHRoaXMgb3B0aW9uIGJlaW5nLCBhcyBvZiBub3cgZ2RiIGNhbgotICAgICAgICBub3Qgb3BlbiB2bWNvcmUgZmlsZSB3aXRoIEVMRjY0IGhlYWRlcnMgb24gYSAzMiBiaXQgc3lzdGVtcy4gU28gRUxGMzIKLSAgICAgICAgaGVhZGVycyBjYW4gYmUgdXNlZCBpZiBvbmUgaGFzIG5vbi1QQUUgc3lzdGVtcyBhbmQgaGVuY2UgbWVtb3J5IGxlc3MKLSAgICAgICAgdGhhbiA0R0IuCi0gICAgaXYpIFNwZWNpZnkgImlycXBvbGwiIGFzIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXIuIFRoaXMgcmVkdWNlcyBkcml2ZXIKLSAgICAgICAgIGluaXRpYWxpemF0aW9uIGZhaWx1cmVzIGluIHNlY29uZCBrZXJuZWwgZHVlIHRvIHNoYXJlZCBpbnRlcnJ1cHRzLgotICAgICB2KSA8cm9vdC1kZXY+IG5lZWRzIHRvIGJlIHNwZWNpZmllZCBpbiBhIGZvcm1hdCBjb3JyZXNwb25kaW5nIHRvIHRoZSByb290Ci0gICAgICAgIGRldmljZSBuYW1lIGluIHRoZSBvdXRwdXQgb2YgbW91bnQgY29tbWFuZC4KLSAgICB2aSkgSWYgeW91IGhhdmUgYnVpbHQgdGhlIGRyaXZlcnMgcmVxdWlyZWQgdG8gbW91bnQgcm9vdCBmaWxlIHN5c3RlbSBhcwotICAgICAgICBtb2R1bGVzIGluIDxzZWNvbmQta2VybmVsPiwgdGhlbiwgc3BlY2lmeQotICAgICAgICAtLWluaXRyZD08aW5pdHJkLWZvci1zZWNvbmQta2VybmVsPi4KLSAgIHZpaSkgU3BlY2lmeSBtYXhjcHVzPTEgYXMsIGlmIGR1cmluZyBmaXJzdCBrZXJuZWwgcnVuLCBpZiBwYW5pYyBoYXBwZW5zIG9uCi0gICAgICAgIG5vbi1ib290IGNwdXMsIHNlY29uZCBrZXJuZWwgZG9lc24ndCBzZWVtIHRvIGJlIGJvb3QgdXAgYWxsIHRoZSBjcHVzLgotICAgICAgICBUaGUgb3RoZXIgb3B0aW9uIGlzIHRvIGFsd2F5cyBidWlsdCB0aGUgc2Vjb25kIGtlcm5lbCB3aXRob3V0IFNNUAotICAgICAgICBzdXBwb3J0IGllIENPTkZJR19TTVA9bgorMikgRG93bmxvYWQgdGhlIGtleGVjLXRvb2xzIHVzZXItc3BhY2UgcGFja2FnZSBmcm9tIHRoZSBmb2xsb3dpbmcgVVJMOgogCi00KSBBZnRlciBzdWNjZXNzZnVsbHkgbG9hZGluZyB0aGUgc2Vjb25kIGtlcm5lbCBhcyBhYm92ZSwgaWYgYSBwYW5pYyBvY2N1cnMKLSAgIHN5c3RlbSByZWJvb3RzIGludG8gdGhlIHNlY29uZCBrZXJuZWwuIEEgbW9kdWxlIGNhbiBiZSB3cml0dGVuIHRvIGZvcmNlCi0gICB0aGUgcGFuaWMgb3IgIkFMVC1TeXNScS1jIiBjYW4gYmUgdXNlZCBpbml0aWF0ZSBhIGNyYXNoIGR1bXAgZm9yIHRlc3RpbmcKLSAgIHB1cnBvc2VzLgorICAgaHR0cDovL3d3dy54bWlzc2lvbi5jb20vfmViaWVkZXJtL2ZpbGVzL2tleGVjL2tleGVjLXRvb2xzLTEuMTAxLnRhci5negogCi01KSBPbmNlIHRoZSBzZWNvbmQga2VybmVsIGhhcyBib290ZWQsIHdyaXRlIG91dCB0aGUgZHVtcCBmaWxlIHVzaW5nCiszKSBVbnBhY2sgdGhlIHRhcmJhbGwgd2l0aCB0aGUgdGFyIGNvbW1hbmQsIGFzIGZvbGxvd3M6CisKKyAgIHRhciB4dnB6ZiBrZXhlYy10b29scy0xLjEwMS50YXIuZ3oKKworNCkgRG93bmxvYWQgdGhlIGxhdGVzdCBjb25zb2xpZGF0ZWQgS2R1bXAgcGF0Y2ggZnJvbSB0aGUgZm9sbG93aW5nIFVSTDoKKworICAgaHR0cDovL2xzZS5zb3VyY2Vmb3JnZS5uZXQva2R1bXAvCisKKyAgIChUaGlzIGxvY2F0aW9uIGlzIGJlaW5nIHVzZWQgdW50aWwgYWxsIHRoZSB1c2VyLXNwYWNlIEtkdW1wIHBhdGNoZXMKKyAgIGFyZSBpbnRlZ3JhdGVkIHdpdGggdGhlIGtleGVjLXRvb2xzIHBhY2thZ2UuKQorCis1KSBDaGFuZ2UgdG8gdGhlIGtleGVjLXRvb2xzLTEuMTAxIGRpcmVjdG9yeSwgYXMgZm9sbG93czoKKworICAgY2Qga2V4ZWMtdG9vbHMtMS4xMDEKKworNikgQXBwbHkgdGhlIGNvbnNvbGlkYXRlZCBwYXRjaCB0byB0aGUga2V4ZWMtdG9vbHMtMS4xMDEgc291cmNlIHRyZWUKKyAgIHdpdGggdGhlIHBhdGNoIGNvbW1hbmQsIGFzIGZvbGxvd3MuIChNb2RpZnkgdGhlIHBhdGggdG8gdGhlIGRvd25sb2FkZWQKKyAgIHBhdGNoIGFzIG5lY2Vzc2FyeS4pCisKKyAgIHBhdGNoIC1wMSA8IC9wYXRoLXRvLWtkdW1wLXBhdGNoL2tleGVjLXRvb2xzLTEuMTAxLWtkdW1wLnBhdGNoCisKKzcpIENvbmZpZ3VyZSB0aGUgcGFja2FnZSwgYXMgZm9sbG93czoKKworICAgLi9jb25maWd1cmUKKworOCkgQ29tcGlsZSB0aGUgcGFja2FnZSwgYXMgZm9sbG93czoKKworICAgbWFrZQorCis5KSBJbnN0YWxsIHRoZSBwYWNrYWdlLCBhcyBmb2xsb3dzOgorCisgICBtYWtlIGluc3RhbGwKKworCitEb3dubG9hZCBhbmQgYnVpbGQgdGhlIHN5c3RlbSBhbmQgZHVtcC1jYXB0dXJlIGtlcm5lbHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitEb3dubG9hZCB0aGUgbWFpbmxpbmUgKHZhbmlsbGEpIGtlcm5lbCBzb3VyY2UgY29kZSAoMi42LjEzLXJjMSBvciBuZXdlcikKK2Zyb20gaHR0cDovL3d3dy5rZXJuZWwub3JnLiBUd28ga2VybmVscyBtdXN0IGJlIGJ1aWx0OiBhIHN5c3RlbSBrZXJuZWwKK2FuZCBhIGR1bXAtY2FwdHVyZSBrZXJuZWwuIFVzZSB0aGUgZm9sbG93aW5nIHN0ZXBzIHRvIGNvbmZpZ3VyZSB0aGVzZQora2VybmVscyB3aXRoIHRoZSBuZWNlc3Nhcnkga2V4ZWMgYW5kIEtkdW1wIGZlYXR1cmVzOgorCitTeXN0ZW0ga2VybmVsCistLS0tLS0tLS0tLS0tCisKKzEpIEVuYWJsZSAia2V4ZWMgc3lzdGVtIGNhbGwiIGluICJQcm9jZXNzb3IgdHlwZSBhbmQgZmVhdHVyZXMuIgorCisgICBDT05GSUdfS0VYRUM9eQorCisyKSBFbmFibGUgInN5c2ZzIGZpbGUgc3lzdGVtIHN1cHBvcnQiIGluICJGaWxlc3lzdGVtIiAtPiAiUHNldWRvCisgICBmaWxlc3lzdGVtcy4iIFRoaXMgaXMgdXN1YWxseSBlbmFibGVkIGJ5IGRlZmF1bHQuCisKKyAgIENPTkZJR19TWVNGUz15CisKKyAgIE5vdGUgdGhhdCAic3lzZnMgZmlsZSBzeXN0ZW0gc3VwcG9ydCIgbWlnaHQgbm90IGFwcGVhciBpbiB0aGUgIlBzZXVkbworICAgZmlsZXN5c3RlbXMiIG1lbnUgaWYgIkNvbmZpZ3VyZSBzdGFuZGFyZCBrZXJuZWwgZmVhdHVyZXMgKGZvciBzbWFsbAorICAgc3lzdGVtcykiIGlzIG5vdCBlbmFibGVkIGluICJHZW5lcmFsIFNldHVwLiIgSW4gdGhpcyBjYXNlLCBjaGVjayB0aGUKKyAgIC5jb25maWcgZmlsZSBpdHNlbGYgdG8gZW5zdXJlIHRoYXQgc3lzZnMgaXMgdHVybmVkIG9uLCBhcyBmb2xsb3dzOgorCisgICBncmVwICdDT05GSUdfU1lTRlMnIC5jb25maWcKKworMykgRW5hYmxlICJDb21waWxlIHRoZSBrZXJuZWwgd2l0aCBkZWJ1ZyBpbmZvIiBpbiAiS2VybmVsIGhhY2tpbmcuIgorCisgICBDT05GSUdfREVCVUdfSU5GTz1ZCisKKyAgIFRoaXMgY2F1c2VzIHRoZSBrZXJuZWwgdG8gYmUgYnVpbHQgd2l0aCBkZWJ1ZyBzeW1ib2xzLiBUaGUgZHVtcAorICAgYW5hbHlzaXMgdG9vbHMgcmVxdWlyZSBhIHZtbGludXggd2l0aCBkZWJ1ZyBzeW1ib2xzIGluIG9yZGVyIHRvIHJlYWQKKyAgIGFuZCBhbmFseXplIGEgZHVtcCBmaWxlLgorCis0KSBNYWtlIGFuZCBpbnN0YWxsIHRoZSBrZXJuZWwgYW5kIGl0cyBtb2R1bGVzLiBVcGRhdGUgdGhlIGJvb3QgbG9hZGVyCisgICAoc3VjaCBhcyBncnViLCB5YWJvb3QsIG9yIGxpbG8pIGNvbmZpZ3VyYXRpb24gZmlsZXMgYXMgbmVjZXNzYXJ5LgorCis1KSBCb290IHRoZSBzeXN0ZW0ga2VybmVsIHdpdGggdGhlIGJvb3QgcGFyYW1ldGVyICJjcmFzaGtlcm5lbD1ZQFgiLAorICAgd2hlcmUgWSBzcGVjaWZpZXMgaG93IG11Y2ggbWVtb3J5IHRvIHJlc2VydmUgZm9yIHRoZSBkdW1wLWNhcHR1cmUga2VybmVsCisgICBhbmQgWCBzcGVjaWZpZXMgdGhlIGJlZ2lubmluZyBvZiB0aGlzIHJlc2VydmVkIG1lbW9yeS4gRm9yIGV4YW1wbGUsCisgICAiY3Jhc2hrZXJuZWw9NjRNQDE2TSIgdGVsbHMgdGhlIHN5c3RlbSBrZXJuZWwgdG8gcmVzZXJ2ZSA2NCBNQiBvZiBtZW1vcnkKKyAgIHN0YXJ0aW5nIGF0IHBoeXNpY2FsIGFkZHJlc3MgMHgwMTAwMDAwMCBmb3IgdGhlIGR1bXAtY2FwdHVyZSBrZXJuZWwuCisKKyAgIE9uIHg4NiBhbmQgeDg2XzY0LCB1c2UgImNyYXNoa2VybmVsPTY0TUAxNk0iLgorCisgICBPbiBwcGM2NCwgdXNlICJjcmFzaGtlcm5lbD0xMjhNQDMyTSIuCisKKworVGhlIGR1bXAtY2FwdHVyZSBrZXJuZWwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKzEpIFVuZGVyICJHZW5lcmFsIHNldHVwLCIgYXBwZW5kICIta2R1bXAiIHRvIHRoZSBjdXJyZW50IHN0cmluZyBpbgorICAgIkxvY2FsIHZlcnNpb24uIgorCisyKSBPbiB4ODYsIGVuYWJsZSBoaWdoIG1lbW9yeSBzdXBwb3J0IHVuZGVyICJQcm9jZXNzb3IgdHlwZSBhbmQKKyAgIGZlYXR1cmVzIjoKKworICAgQ09ORklHX0hJR0hNRU02NEc9eQorICAgb3IKKyAgIENPTkZJR19ISUdITUVNNEcKKworMykgT24geDg2IGFuZCB4ODZfNjQsIGRpc2FibGUgc3ltbWV0cmljIG11bHRpLXByb2Nlc3Npbmcgc3VwcG9ydAorICAgdW5kZXIgIlByb2Nlc3NvciB0eXBlIGFuZCBmZWF0dXJlcyI6CisKKyAgIENPTkZJR19TTVA9bgorICAgKElmIENPTkZJR19TTVA9eSwgdGhlbiBzcGVjaWZ5IG1heGNwdXM9MSBvbiB0aGUga2VybmVsIGNvbW1hbmQgbGluZQorICAgd2hlbiBsb2FkaW5nIHRoZSBkdW1wLWNhcHR1cmUga2VybmVsLCBzZWUgc2VjdGlvbiAiTG9hZCB0aGUgRHVtcC1jYXB0dXJlCisgICBLZXJuZWwiLikKKworNCkgT24gcHBjNjQsIGRpc2FibGUgTlVNQSBzdXBwb3J0IGFuZCBlbmFibGUgRU1CRURERUQgc3VwcG9ydDoKKworICAgQ09ORklHX05VTUE9bgorICAgQ09ORklHX0VNQkVEREVEPXkKKyAgIENPTkZJR19FRUg9TiBmb3IgdGhlIGR1bXAtY2FwdHVyZSBrZXJuZWwKKworNSkgRW5hYmxlICJrZXJuZWwgY3Jhc2ggZHVtcHMiIHN1cHBvcnQgdW5kZXIgIlByb2Nlc3NvciB0eXBlIGFuZAorICAgZmVhdHVyZXMiOgorCisgICBDT05GSUdfQ1JBU0hfRFVNUD15CisKKzYpIFVzZSBhIHN1aXRhYmxlIHZhbHVlIGZvciAiUGh5c2ljYWwgYWRkcmVzcyB3aGVyZSB0aGUga2VybmVsIGlzCisgICBsb2FkZWQiICh1bmRlciAiUHJvY2Vzc29yIHR5cGUgYW5kIGZlYXR1cmVzIikuIFRoaXMgb25seSBhcHBlYXJzIHdoZW4KKyAgICJrZXJuZWwgY3Jhc2ggZHVtcHMiIGlzIGVuYWJsZWQuIEJ5IGRlZmF1bHQgdGhpcyB2YWx1ZSBpcyAweDEwMDAwMDAKKyAgICgxNk1CKS4gSXQgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIFggaW4gdGhlICJjcmFzaGtlcm5lbD1ZQFgiIGJvb3QKKyAgIHBhcmFtZXRlciBkaXNjdXNzZWQgYWJvdmUuCisKKyAgIE9uIHg4NiBhbmQgeDg2XzY0LCB1c2UgIkNPTkZJR19QSFlTSUNBTF9TVEFSVD0weDEwMDAwMDAiLgorCisgICBPbiBwcGM2NCB0aGUgdmFsdWUgaXMgYXV0b21hdGljYWxseSBzZXQgYXQgMzJNQiB3aGVuCisgICBDT05GSUdfQ1JBU0hfRFVNUCBpcyBzZXQuCisKKzYpIE9wdGlvbmFsbHkgZW5hYmxlICIvcHJvYy92bWNvcmUgc3VwcG9ydCIgdW5kZXIgIkZpbGVzeXN0ZW1zIiAtPgorICAgIlBzZXVkbyBmaWxlc3lzdGVtcyIuCisKKyAgIENPTkZJR19QUk9DX1ZNQ09SRT15CisgICAoQ09ORklHX1BST0NfVk1DT1JFIGlzIHNldCBieSBkZWZhdWx0IHdoZW4gQ09ORklHX0NSQVNIX0RVTVAgaXMgc2VsZWN0ZWQuKQorCis3KSBNYWtlIGFuZCBpbnN0YWxsIHRoZSBrZXJuZWwgYW5kIGl0cyBtb2R1bGVzLiBETyBOT1QgYWRkIHRoaXMga2VybmVsCisgICB0byB0aGUgYm9vdCBsb2FkZXIgY29uZmlndXJhdGlvbiBmaWxlcy4KKworCitMb2FkIHRoZSBEdW1wLWNhcHR1cmUgS2VybmVsCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0FmdGVyIGJvb3RpbmcgdG8gdGhlIHN5c3RlbSBrZXJuZWwsIGxvYWQgdGhlIGR1bXAtY2FwdHVyZSBrZXJuZWwgdXNpbmcKK3RoZSBmb2xsb3dpbmcgY29tbWFuZDoKKworICAga2V4ZWMgLXAgPGR1bXAtY2FwdHVyZS1rZXJuZWw+IFwKKyAgIC0taW5pdHJkPTxpbml0cmQtZm9yLWR1bXAtY2FwdHVyZS1rZXJuZWw+IC0tYXJncy1saW51eCBcCisgICAtLWFwcGVuZD0icm9vdD08cm9vdC1kZXY+IGluaXQgMSBpcnFwb2xsIgorCisKK05vdGVzIG9uIGxvYWRpbmcgdGhlIGR1bXAtY2FwdHVyZSBrZXJuZWw6CisKKyogPGR1bXAtY2FwdHVyZS1rZXJuZWw+IG11c3QgYmUgYSB2bWxpbnV4IGltYWdlICh0aGF0IGlzLCBhbgorICB1bmNvbXByZXNzZWQgRUxGIGltYWdlKS4gYnpJbWFnZSBkb2VzIG5vdCB3b3JrIGF0IHRoaXMgdGltZS4KKworKiBCeSBkZWZhdWx0LCB0aGUgRUxGIGhlYWRlcnMgYXJlIHN0b3JlZCBpbiBFTEY2NCBmb3JtYXQgdG8gc3VwcG9ydAorICBzeXN0ZW1zIHdpdGggbW9yZSB0aGFuIDRHQiBtZW1vcnkuIFRoZSAtLWVsZjMyLWNvcmUtaGVhZGVycyBvcHRpb24gY2FuCisgIGJlIHVzZWQgdG8gZm9yY2UgdGhlIGdlbmVyYXRpb24gb2YgRUxGMzIgaGVhZGVycy4gVGhpcyBpcyBuZWNlc3NhcnkKKyAgYmVjYXVzZSBHREIgY3VycmVudGx5IGNhbm5vdCBvcGVuIHZtY29yZSBmaWxlcyB3aXRoIEVMRjY0IGhlYWRlcnMgb24KKyAgMzItYml0IHN5c3RlbXMuIEVMRjMyIGhlYWRlcnMgY2FuIGJlIHVzZWQgb24gbm9uLVBBRSBzeXN0ZW1zICh0aGF0IGlzLAorICBsZXNzIHRoYW4gNEdCIG9mIG1lbW9yeSkuCisKKyogVGhlICJpcnFwb2xsIiBib290IHBhcmFtZXRlciByZWR1Y2VzIGRyaXZlciBpbml0aWFsaXphdGlvbiBmYWlsdXJlcworICBkdWUgdG8gc2hhcmVkIGludGVycnVwdHMgaW4gdGhlIGR1bXAtY2FwdHVyZSBrZXJuZWwuCisKKyogWW91IG11c3Qgc3BlY2lmeSA8cm9vdC1kZXY+IGluIHRoZSBmb3JtYXQgY29ycmVzcG9uZGluZyB0byB0aGUgcm9vdAorICBkZXZpY2UgbmFtZSBpbiB0aGUgb3V0cHV0IG9mIG1vdW50IGNvbW1hbmQuCisKKyogImluaXQgMSIgYm9vdHMgdGhlIGR1bXAtY2FwdHVyZSBrZXJuZWwgaW50byBzaW5nbGUtdXNlciBtb2RlIHdpdGhvdXQKKyAgbmV0d29ya2luZy4gSWYgeW91IHdhbnQgbmV0d29ya2luZywgdXNlICJpbml0IDMuIgorCisKK0tlcm5lbCBQYW5pYworPT09PT09PT09PT09CisKK0FmdGVyIHN1Y2Nlc3NmdWxseSBsb2FkaW5nIHRoZSBkdW1wLWNhcHR1cmUga2VybmVsIGFzIHByZXZpb3VzbHkKK2Rlc2NyaWJlZCwgdGhlIHN5c3RlbSB3aWxsIHJlYm9vdCBpbnRvIHRoZSBkdW1wLWNhcHR1cmUga2VybmVsIGlmIGEKK3N5c3RlbSBjcmFzaCBpcyB0cmlnZ2VyZWQuICBUcmlnZ2VyIHBvaW50cyBhcmUgbG9jYXRlZCBpbiBwYW5pYygpLAorZGllKCksIGRpZV9ubWkoKSBhbmQgaW4gdGhlIHN5c3JxIGhhbmRsZXIgKEFMVC1TeXNScS1jKS4KKworVGhlIGZvbGxvd2luZyBjb25kaXRpb25zIHdpbGwgZXhlY3V0ZSBhIGNyYXNoIHRyaWdnZXIgcG9pbnQ6CisKK0lmIGEgaGFyZCBsb2NrdXAgaXMgZGV0ZWN0ZWQgYW5kICJOTUkgd2F0Y2hkb2ciIGlzIGNvbmZpZ3VyZWQsIHRoZSBzeXN0ZW0KK3dpbGwgYm9vdCBpbnRvIHRoZSBkdW1wLWNhcHR1cmUga2VybmVsICggZGllX25taSgpICkuCisKK0lmIGRpZSgpIGlzIGNhbGxlZCwgYW5kIGl0IGhhcHBlbnMgdG8gYmUgYSB0aHJlYWQgd2l0aCBwaWQgMCBvciAxLCBvciBkaWUoKQoraXMgY2FsbGVkIGluc2lkZSBpbnRlcnJ1cHQgY29udGV4dCBvciBkaWUoKSBpcyBjYWxsZWQgYW5kIHBhbmljX29uX29vcHMgaXMgc2V0LAordGhlIHN5c3RlbSB3aWxsIGJvb3QgaW50byB0aGUgZHVtcC1jYXB0dXJlIGtlcm5lbC4KKworT24gcG93ZXJlcnBjIHN5c3RlbXMgd2hlbiBhIHNvZnQtcmVzZXQgaXMgZ2VuZXJhdGVkLCBkaWUoKSBpcyBjYWxsZWQgYnkgYWxsIGNwdXMgYW5kIHRoZSBzeXN0ZW0gc3lzdGVtIHdpbGwgYm9vdCBpbnRvIHRoZSBkdW1wLWNhcHR1cmUga2VybmVsLgorCitGb3IgdGVzdGluZyBwdXJwb3NlcywgeW91IGNhbiB0cmlnZ2VyIGEgY3Jhc2ggYnkgdXNpbmcgIkFMVC1TeXNScS1jIiwKKyJlY2hvIGMgPiAvcHJvYy9zeXNycS10cmlnZ2VyIG9yIHdyaXRlIGEgbW9kdWxlIHRvIGZvcmNlIHRoZSBwYW5pYy4KKworV3JpdGUgT3V0IHRoZSBEdW1wIEZpbGUKKz09PT09PT09PT09PT09PT09PT09PT09CisKK0FmdGVyIHRoZSBkdW1wLWNhcHR1cmUga2VybmVsIGlzIGJvb3RlZCwgd3JpdGUgb3V0IHRoZSBkdW1wIGZpbGUgd2l0aAordGhlIGZvbGxvd2luZyBjb21tYW5kOgogCiAgICBjcCAvcHJvYy92bWNvcmUgPGR1bXAtZmlsZT4KIAotICAgRHVtcCBtZW1vcnkgY2FuIGFsc28gYmUgYWNjZXNzZWQgYXMgYSAvZGV2L29sZG1lbSBkZXZpY2UgZm9yIGEgbGluZWFyL3JhdwotICAgdmlldy4gIFRvIGNyZWF0ZSB0aGUgZGV2aWNlLCB0eXBlOgorWW91IGNhbiBhbHNvIGFjY2VzcyBkdW1wZWQgbWVtb3J5IGFzIGEgL2Rldi9vbGRtZW0gZGV2aWNlIGZvciBhIGxpbmVhcgorYW5kIHJhdyB2aWV3LiBUbyBjcmVhdGUgdGhlIGRldmljZSwgdXNlIHRoZSBmb2xsb3dpbmcgY29tbWFuZDoKIAotICAgbWtub2QgL2Rldi9vbGRtZW0gYyAxIDEyCisgICAgbWtub2QgL2Rldi9vbGRtZW0gYyAxIDEyCiAKLSAgIFVzZSAiZGQiIHdpdGggc3VpdGFibGUgb3B0aW9ucyBmb3IgY291bnQsIGJzIGFuZCBza2lwIHRvIGFjY2VzcyBzcGVjaWZpYwotICAgcG9ydGlvbnMgb2YgdGhlIGR1bXAuCitVc2UgdGhlIGRkIGNvbW1hbmQgd2l0aCBzdWl0YWJsZSBvcHRpb25zIGZvciBjb3VudCwgYnMsIGFuZCBza2lwIHRvCithY2Nlc3Mgc3BlY2lmaWMgcG9ydGlvbnMgb2YgdGhlIGR1bXAuCiAKLSAgIEVudGlyZSBtZW1vcnk6ICBkZCBpZj0vZGV2L29sZG1lbSBvZj1vbGRtZW0uMDAxCitUbyBzZWUgdGhlIGVudGlyZSBtZW1vcnksIHVzZSB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6CisKKyAgIGRkIGlmPS9kZXYvb2xkbWVtIG9mPW9sZG1lbS4wMDEKIAogCi1BTkFMWVNJUworQW5hbHlzaXMKID09PT09PT09Ci1MaW1pdGVkIGFuYWx5c2lzIGNhbiBiZSBkb25lIHVzaW5nIGdkYiBvbiB0aGUgZHVtcCBmaWxlIGNvcGllZCBvdXQgb2YKLS9wcm9jL3ZtY29yZS4gVXNlIHZtbGludXggYnVpbHQgd2l0aCAtZyBhbmQgcnVuCiAKLSAgZ2RiIHZtbGludXggPGR1bXAtZmlsZT4KK0JlZm9yZSBhbmFseXppbmcgdGhlIGR1bXAgaW1hZ2UsIHlvdSBzaG91bGQgcmVib290IGludG8gYSBzdGFibGUga2VybmVsLgogCi1TdGFjayB0cmFjZSBmb3IgdGhlIHRhc2sgb24gcHJvY2Vzc29yIDAsIHJlZ2lzdGVyIGRpc3BsYXksIG1lbW9yeSBkaXNwbGF5Ci13b3JrIGZpbmUuCitZb3UgY2FuIGRvIGxpbWl0ZWQgYW5hbHlzaXMgdXNpbmcgR0RCIG9uIHRoZSBkdW1wIGZpbGUgY29waWVkIG91dCBvZgorL3Byb2Mvdm1jb3JlLiBVc2UgdGhlIGRlYnVnIHZtbGludXggYnVpbHQgd2l0aCAtZyBhbmQgcnVuIHRoZSBmb2xsb3dpbmcKK2NvbW1hbmQ6CiAKLU5vdGU6IGdkYiBjYW5ub3QgYW5hbHlzZSBjb3JlIGZpbGVzIGdlbmVyYXRlZCBpbiBFTEY2NCBmb3JtYXQgZm9yIGkzODYuCisgICBnZGIgdm1saW51eCA8ZHVtcC1maWxlPgogCi1MYXRlc3QgImNyYXNoIiAoY3Jhc2gtNC4wLTIuMTgpIGFzIGF2YWlsYWJsZSBvbiBEYXZlIEFuZGVyc29uJ3Mgc2l0ZQotaHR0cDovL3Blb3BsZS5yZWRoYXQuY29tL35hbmRlcnNvbi8gd29ya3Mgd2VsbCB3aXRoIGtkdW1wIGZvcm1hdC4KK1N0YWNrIHRyYWNlIGZvciB0aGUgdGFzayBvbiBwcm9jZXNzb3IgMCwgcmVnaXN0ZXIgZGlzcGxheSwgYW5kIG1lbW9yeQorZGlzcGxheSB3b3JrIGZpbmUuCisKK05vdGU6IEdEQiBjYW5ub3QgYW5hbHl6ZSBjb3JlIGZpbGVzIGdlbmVyYXRlZCBpbiBFTEY2NCBmb3JtYXQgZm9yIHg4Ni4KK09uIHN5c3RlbXMgd2l0aCBhIG1heGltdW0gb2YgNEdCIG9mIG1lbW9yeSwgeW91IGNhbiBnZW5lcmF0ZQorRUxGMzItZm9ybWF0IGhlYWRlcnMgdXNpbmcgdGhlIC0tZWxmMzItY29yZS1oZWFkZXJzIGtlcm5lbCBvcHRpb24gb24gdGhlCitkdW1wIGtlcm5lbC4KKworWW91IGNhbiBhbHNvIHVzZSB0aGUgQ3Jhc2ggdXRpbGl0eSB0byBhbmFseXplIGR1bXAgZmlsZXMgaW4gS2R1bXAKK2Zvcm1hdC4gQ3Jhc2ggaXMgYXZhaWxhYmxlIG9uIERhdmUgQW5kZXJzb24ncyBzaXRlIGF0IHRoZSBmb2xsb3dpbmcgVVJMOgorCisgICBodHRwOi8vcGVvcGxlLnJlZGhhdC5jb20vfmFuZGVyc29uLwogCiAKLVRPRE8KLT09PT0KLTEpIFByb3ZpZGUgYSBrZXJuZWwgcGFnZXMgZmlsdGVyaW5nIG1lY2hhbmlzbSBzbyB0aGF0IGNvcmUgZmlsZSBzaXplIGlzIG5vdAotICAgaW5zYW5lIG9uIHN5c3RlbXMgaGF2aW5nIGh1Z2UgbWVtb3J5IGJhbmtzLgotMikgUmVsb2NhdGFibGUga2VybmVsIGNhbiBoZWxwIGluIG1haW50YWluaW5nIG11bHRpcGxlIGtlcm5lbHMgZm9yIGNyYXNoZHVtcAotICAgYW5kIHNhbWUga2VybmVsIGFzIHRoZSBmaXJzdCBrZXJuZWwgY2FuIGJlIHVzZWQgdG8gY2FwdHVyZSB0aGUgZHVtcC4KK1RvIERvCis9PT09PQorCisxKSBQcm92aWRlIGEga2VybmVsIHBhZ2VzIGZpbHRlcmluZyBtZWNoYW5pc20sIHNvIGNvcmUgZmlsZSBzaXplIGlzIG5vdAorICAgZXh0cmVtZSBvbiBzeXN0ZW1zIHdpdGggaHVnZSBtZW1vcnkgYmFua3MuCisKKzIpIFJlbG9jYXRhYmxlIGtlcm5lbCBjYW4gaGVscCBpbiBtYWludGFpbmluZyBtdWx0aXBsZSBrZXJuZWxzIGZvcgorICAgY3Jhc2hfZHVtcCwgYW5kIHRoZSBzYW1lIGtlcm5lbCBhcyB0aGUgc3lzdGVtIGtlcm5lbCBjYW4gYmUgdXNlZCB0bworICAgY2FwdHVyZSB0aGUgZHVtcC4KIAogCi1DT05UQUNUCitDb250YWN0CiA9PT09PT09CisKIFZpdmVrIEdveWFsICh2Z295YWxAaW4uaWJtLmNvbSkKIE1hbmVlc2ggU29uaSAobWFuZWVzaEBpbi5pYm0uY29tKQorCisKK1RyYWRlbWFyaworPT09PT09PT09CisKK0xpbnV4IGlzIGEgdHJhZGVtYXJrIG9mIExpbnVzIFRvcnZhbGRzIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlcgorY291bnRyaWVzLCBvciBib3RoLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQgYi9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dAppbmRleCBiY2E2ZjM4Li4yZTM1MmE2IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dApAQCAtNjEsNiArNjEsNyBAQAogCU1URAlNVEQgc3VwcG9ydCBpcyBlbmFibGVkLgogCU5FVAlBcHByb3ByaWF0ZSBuZXR3b3JrIHN1cHBvcnQgaXMgZW5hYmxlZC4KIAlOVU1BCU5VTUEgc3VwcG9ydCBpcyBlbmFibGVkLgorCUdFTkVSSUNfVElNRSBUaGUgZ2VuZXJpYyB0aW1lb2ZkYXkgY29kZSBpcyBlbmFibGVkLgogCU5GUwlBcHByb3ByaWF0ZSBORlMgc3VwcG9ydCBpcyBlbmFibGVkLgogCU9TUwlPU1Mgc291bmQgc3VwcG9ydCBpcyBlbmFibGVkLgogCVBBUklERQlUaGUgUGFySURFIHN1YnN5c3RlbSBpcyBlbmFibGVkLgpAQCAtMTc5LDYgKzE4MCwxMSBAQAogCQkJb3ZlcnJpZGUgcGxhdGZvcm0gc3BlY2lmaWMgZHJpdmVyLgogCQkJU2VlIGFsc28gRG9jdW1lbnRhdGlvbi9hY3BpLWhvdGtleS50eHQuCiAKKwlhY3BpX3BtX2dvb2QJW0lBLTMyLFg4Ni02NF0KKwkJCU92ZXJyaWRlIHRoZSBwbXRpbWVyIGJ1ZyBkZXRlY3Rpb246IGZvcmNlIHRoZSBrZXJuZWwKKwkJCXRvIGFzc3VtZSB0aGF0IHRoaXMgbWFjaGluZSdzIHBtdGltZXIgbGF0Y2hlcyBpdHMgdmFsdWUKKwkJCWFuZCBhbHdheXMgcmV0dXJucyBnb29kIHZhbHVlcy4KKwogCWVuYWJsZV90aW1lcl9waW5fMSBbaTM4Nix4ODYtNjRdCiAJCQlFbmFibGUgUElOIDEgb2YgQVBJQyB0aW1lcgogCQkJQ2FuIGJlIHVzZWZ1bCB0byB3b3JrIGFyb3VuZCBjaGlwc2V0IGJ1Z3MKQEAgLTM0MSwxMCArMzQ3LDExIEBACiAJCQlWYWx1ZSBjYW4gYmUgY2hhbmdlZCBhdCBydW50aW1lIHZpYQogCQkJCS9zZWxpbnV4L2NoZWNrcmVxcHJvdC4KIAotIAljbG9jaz0JCVtCVUdTPUlBLTMyLEhXXSBnZXR0aW1lb2ZkYXkgdGltZXNvdXJjZSBvdmVycmlkZS4KLQkJCUZvcmNlcyBzcGVjaWZpZWQgdGltZXNvdXJjZSAoaWYgYXZhbGlhYmxlKSB0byBiZSB1c2VkCi0JCQl3aGVuIGNhbGN1bGF0aW5nIGdldHRpbWVvZmRheSgpLiBJZiBzcGVjaWNpZmllZAotCQkJdGltZXNvdXJjZSBpcyBub3QgYXZhbGlibGUsIGl0IGRlZmF1bHRzIHRvIFBJVC4KKwljbG9jaz0JCVtCVUdTPUlBLTMyLCBIV10gZ2V0dGltZW9mZGF5IGNsb2Nrc291cmNlIG92ZXJyaWRlLgorCQkJW0RlcHJlY2F0ZWRdCisJCQlGb3JjZXMgc3BlY2lmaWVkIGNsb2Nrc291cmNlIChpZiBhdmFsaWFibGUpIHRvIGJlIHVzZWQKKwkJCXdoZW4gY2FsY3VsYXRpbmcgZ2V0dGltZW9mZGF5KCkuIElmIHNwZWNpZmllZAorCQkJY2xvY2tzb3VyY2UgaXMgbm90IGF2YWxpYmxlLCBpdCBkZWZhdWx0cyB0byBQSVQuCiAJCQlGb3JtYXQ6IHsgcGl0IHwgdHNjIHwgY3ljbG9uZSB8IHBtdG1yIH0KIAogCWRpc2FibGVfODI1NF90aW1lcgpAQCAtMTYxNyw2ICsxNjI0LDEwIEBACiAKIAl0aW1lCQlTaG93IHRpbWluZyBkYXRhIHByZWZpeGVkIHRvIGVhY2ggcHJpbnRrIG1lc3NhZ2UgbGluZQogCisJY2xvY2tzb3VyY2U9CVtHRU5FUklDX1RJTUVdIE92ZXJyaWRlIHRoZSBkZWZhdWx0IGNsb2Nrc291cmNlCisJCQlPdmVycmlkZSB0aGUgZGVmYXVsdCBjbG9ja3NvdXJjZSBhbmQgdXNlIHRoZSBjbG9ja3NvdXJjZQorCQkJd2l0aCB0aGUgbmFtZSBzcGVjaWZpZWQuCisKIAl0aXBhci50aW1lb3V0PQlbSFcsUFBUXQogCQkJU2V0IGNvbW11bmljYXRpb25zIHRpbWVvdXQgaW4gdGVudGhzIG9mIGEgc2Vjb25kCiAJCQkoZGVmYXVsdCAxNSkuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2tleXMudHh0IGIvRG9jdW1lbnRhdGlvbi9rZXlzLnR4dAppbmRleCAzYmJlMTU3Li42MWMwZmFkIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2tleXMudHh0CisrKyBiL0RvY3VtZW50YXRpb24va2V5cy50eHQKQEAgLTI0MSwyNSArMjQxLDMwIEBACiBjb250cm9scyBjYW4gYmUgYXBwbGllZCB0byBrZXlzIGNyZWF0ZWQgd2l0aGluIHZhcmlvdXMgY29udGV4dHMuICBUaGlzIHN1cHBvcnQKIGlzIHByZWxpbWluYXJ5LCBhbmQgaXMgbGlrZWx5IHRvIGNoYW5nZSBxdWl0ZSBzaWduaWZpY2FudGx5IGluIHRoZSBuZWFyIGZ1dHVyZS4KIEN1cnJlbnRseSwgYWxsIG9mIHRoZSBiYXNpYyBwZXJtaXNzaW9ucyBleHBsYWluZWQgYWJvdmUgYXJlIHByb3ZpZGVkIGluIFNFTGludXgKLWFzIHdlbGw7IFNFIExpbnV4IGlzIHNpbXBseSBpbnZva2VkIGFmdGVyIGFsbCBiYXNpYyBwZXJtaXNzaW9uIGNoZWNrcyBoYXZlIGJlZW4KK2FzIHdlbGw7IFNFTGludXggaXMgc2ltcGx5IGludm9rZWQgYWZ0ZXIgYWxsIGJhc2ljIHBlcm1pc3Npb24gY2hlY2tzIGhhdmUgYmVlbgogcGVyZm9ybWVkLgogCi1FYWNoIGtleSBpcyBsYWJlbGVkIHdpdGggdGhlIHNhbWUgY29udGV4dCBhcyB0aGUgdGFzayB0byB3aGljaCBpdCBiZWxvbmdzLgotVHlwaWNhbGx5LCB0aGlzIGlzIHRoZSBzYW1lIHRhc2sgdGhhdCB3YXMgcnVubmluZyB3aGVuIHRoZSBrZXkgd2FzIGNyZWF0ZWQuCi1UaGUgZGVmYXVsdCBrZXlyaW5ncyBhcmUgaGFuZGxlZCBkaWZmZXJlbnRseSwgYnV0IGluIGEgd2F5IHRoYXQgaXMgdmVyeQotaW50dWl0aXZlOgorVGhlIHZhbHVlIG9mIHRoZSBmaWxlIC9wcm9jL3NlbGYvYXR0ci9rZXljcmVhdGUgaW5mbHVlbmNlcyB0aGUgbGFiZWxpbmcgb2YKK25ld2x5LWNyZWF0ZWQga2V5cy4gIElmIHRoZSBjb250ZW50cyBvZiB0aGF0IGZpbGUgY29ycmVzcG9uZCB0byBhbiBTRUxpbnV4CitzZWN1cml0eSBjb250ZXh0LCB0aGVuIHRoZSBrZXkgd2lsbCBiZSBhc3NpZ25lZCB0aGF0IGNvbnRleHQuICBPdGhlcndpc2UsIHRoZQora2V5IHdpbGwgYmUgYXNzaWduZWQgdGhlIGN1cnJlbnQgY29udGV4dCBvZiB0aGUgdGFzayB0aGF0IGludm9rZWQgdGhlIGtleQorY3JlYXRpb24gcmVxdWVzdC4gIFRhc2tzIG11c3QgYmUgZ3JhbnRlZCBleHBsaWNpdCBwZXJtaXNzaW9uIHRvIGFzc2lnbiBhCitwYXJ0aWN1bGFyIGNvbnRleHQgdG8gbmV3bHktY3JlYXRlZCBrZXlzLCB1c2luZyB0aGUgImNyZWF0ZSIgcGVybWlzc2lvbiBpbiB0aGUKK2tleSBzZWN1cml0eSBjbGFzcy4KIAotICgqKSBUaGUgdXNlciBhbmQgdXNlciBzZXNzaW9uIGtleXJpbmdzIHRoYXQgYXJlIGNyZWF0ZWQgd2hlbiB0aGUgdXNlciBsb2dzIGluCi0gICAgIGFyZSBjdXJyZW50bHkgbGFiZWxlZCB3aXRoIHRoZSBjb250ZXh0IG9mIHRoZSBsb2dpbiBtYW5hZ2VyLgotCi0gKCopIFRoZSBrZXlyaW5ncyBhc3NvY2lhdGVkIHdpdGggbmV3IHRocmVhZHMgYXJlIGVhY2ggbGFiZWxlZCB3aXRoIHRoZSBjb250ZXh0Ci0gICAgIG9mIHRoZWlyIGFzc29jaWF0ZWQgdGhyZWFkLCBhbmQgYm90aCBzZXNzaW9uIGFuZCBwcm9jZXNzIGtleXJpbmdzIGFyZQotICAgICBoYW5kbGVkIHNpbWlsYXJseS4KK1RoZSBkZWZhdWx0IGtleXJpbmdzIGFzc29jaWF0ZWQgd2l0aCB1c2VycyB3aWxsIGJlIGxhYmVsZWQgd2l0aCB0aGUgZGVmYXVsdAorY29udGV4dCBvZiB0aGUgdXNlciBpZiBhbmQgb25seSBpZiB0aGUgbG9naW4gcHJvZ3JhbXMgaGF2ZSBiZWVuIGluc3RydW1lbnRlZCB0bworcHJvcGVybHkgaW5pdGlhbGl6ZSBrZXljcmVhdGUgZHVyaW5nIHRoZSBsb2dpbiBwcm9jZXNzLiAgT3RoZXJ3aXNlLCB0aGV5IHdpbGwKK2JlIGxhYmVsZWQgd2l0aCB0aGUgY29udGV4dCBvZiB0aGUgbG9naW4gcHJvZ3JhbSBpdHNlbGYuCiAKIE5vdGUsIGhvd2V2ZXIsIHRoYXQgdGhlIGRlZmF1bHQga2V5cmluZ3MgYXNzb2NpYXRlZCB3aXRoIHRoZSByb290IHVzZXIgYXJlCiBsYWJlbGVkIHdpdGggdGhlIGRlZmF1bHQga2VybmVsIGNvbnRleHQsIHNpbmNlIHRoZXkgYXJlIGNyZWF0ZWQgZWFybHkgaW4gdGhlCiBib290IHByb2Nlc3MsIGJlZm9yZSByb290IGhhcyBhIGNoYW5jZSB0byBsb2cgaW4uCiAKK1RoZSBrZXlyaW5ncyBhc3NvY2lhdGVkIHdpdGggbmV3IHRocmVhZHMgYXJlIGVhY2ggbGFiZWxlZCB3aXRoIHRoZSBjb250ZXh0IG9mCit0aGVpciBhc3NvY2lhdGVkIHRocmVhZCwgYW5kIGJvdGggc2Vzc2lvbiBhbmQgcHJvY2VzcyBrZXlyaW5ncyBhcmUgaGFuZGxlZAorc2ltaWxhcmx5LgorCiAKID09PT09PT09PT09PT09PT0KIE5FVyBQUk9DRlMgRklMRVMKQEAgLTI3MCw5ICsyNzUsMTcgQEAKIAogICgqKSAvcHJvYy9rZXlzCiAKLSAgICAgVGhpcyBsaXN0cyBhbGwgdGhlIGtleXMgb24gdGhlIHN5c3RlbSwgZ2l2aW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZWlyCi0gICAgIHR5cGUsIGRlc2NyaXB0aW9uIGFuZCBwZXJtaXNzaW9ucy4gVGhlIHBheWxvYWQgb2YgdGhlIGtleSBpcyBub3QgYXZhaWxhYmxlCi0gICAgIHRoaXMgd2F5OgorICAgICBUaGlzIGxpc3RzIHRoZSBrZXlzIHRoYXQgYXJlIGN1cnJlbnRseSB2aWV3YWJsZSBieSB0aGUgdGFzayByZWFkaW5nIHRoZQorICAgICBmaWxlLCBnaXZpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlaXIgdHlwZSwgZGVzY3JpcHRpb24gYW5kIHBlcm1pc3Npb25zLgorICAgICBJdCBpcyBub3QgcG9zc2libGUgdG8gdmlldyB0aGUgcGF5bG9hZCBvZiB0aGUga2V5IHRoaXMgd2F5LCB0aG91Z2ggc29tZQorICAgICBpbmZvcm1hdGlvbiBhYm91dCBpdCBtYXkgYmUgZ2l2ZW4uCisKKyAgICAgVGhlIG9ubHkga2V5cyBpbmNsdWRlZCBpbiB0aGUgbGlzdCBhcmUgdGhvc2UgdGhhdCBncmFudCBWaWV3IHBlcm1pc3Npb24gdG8KKyAgICAgdGhlIHJlYWRpbmcgcHJvY2VzcyB3aGV0aGVyIG9yIG5vdCBpdCBwb3NzZXNzZXMgdGhlbS4gIE5vdGUgdGhhdCBMU00KKyAgICAgc2VjdXJpdHkgY2hlY2tzIGFyZSBzdGlsbCBwZXJmb3JtZWQsIGFuZCBtYXkgZnVydGhlciBmaWx0ZXIgb3V0IGtleXMgdGhhdAorICAgICB0aGUgY3VycmVudCBwcm9jZXNzIGlzIG5vdCBhdXRob3Jpc2VkIHRvIHZpZXcuCisKKyAgICAgVGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlIGxvb2sgbGlrZSB0aGlzOgogCiAJU0VSSUFMICAgRkxBR1MgIFVTQUdFIEVYUFkgUEVSTSAgICAgVUlEICAgR0lEICAgVFlQRSAgICAgIERFU0NSSVBUSU9OOiBTVU1NQVJZCiAJMDAwMDAwMDEgSS0tLS0tICAgIDM5IHBlcm0gMWYzZjAwMDAgICAgIDAgICAgIDAga2V5cmluZyAgIF91aWRfc2VzLjA6IDEvNApAQCAtMzAwLDcgKzMxMyw3IEBACiAgKCopIC9wcm9jL2tleS11c2VycwogCiAgICAgIFRoaXMgZmlsZSBsaXN0cyB0aGUgdHJhY2tpbmcgZGF0YSBmb3IgZWFjaCB1c2VyIHRoYXQgaGFzIGF0IGxlYXN0IG9uZSBrZXkKLSAgICAgb24gdGhlIHN5c3RlbS4gU3VjaCBkYXRhIGluY2x1ZGVzIHF1b3RhIGluZm9ybWF0aW9uIGFuZCBzdGF0aXN0aWNzOgorICAgICBvbiB0aGUgc3lzdGVtLiAgU3VjaCBkYXRhIGluY2x1ZGVzIHF1b3RhIGluZm9ybWF0aW9uIGFuZCBzdGF0aXN0aWNzOgogCiAJW3Jvb3RAYW5kcm9tZWRhIHJvb3RdIyBjYXQgL3Byb2Mva2V5LXVzZXJzCiAJMDogICAgIDQ2IDQ1LzQ1IDEvMTAwIDEzLzEwMDAwCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL21kLnR4dCBiL0RvY3VtZW50YXRpb24vbWQudHh0CmluZGV4IDAzYTEzYzQuLjA2NjhmOWQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbWQudHh0CisrKyBiL0RvY3VtZW50YXRpb24vbWQudHh0CkBAIC0yMDAsNiArMjAwLDE3IEBACiAgICAgIFRoaXMgY2FuIGJlIHdyaXR0ZW4gb25seSB3aGlsZSB0aGUgYXJyYXkgaXMgYmVpbmcgYXNzZW1ibGVkLCBub3QKICAgICAgYWZ0ZXIgaXQgaXMgc3RhcnRlZC4KIAorICBsYXlvdXQKKyAgICAgVGhlICJsYXlvdXQiIGZvciB0aGUgYXJyYXkgZm9yIHRoZSBwYXJ0aWN1bGFyIGxldmVsLiAgVGhpcyBpcworICAgICBzaW1wbHkgYSBudW1iZXIgdGhhdCBpcyBpbnRlcnByZXR0ZWQgZGlmZmVyZW50bHkgYnkgZGlmZmVyZW50CisgICAgIGxldmVscy4gIEl0IGNhbiBiZSB3cml0dGVuIHdoaWxlIGFzc2VtYmxpbmcgYW4gYXJyYXkuCisKKyAgcmVzeW5jX3N0YXJ0CisgICAgIFRoZSBwb2ludCBhdCB3aGljaCByZXN5bmMgc2hvdWxkIHN0YXJ0LiAgSWYgbm8gcmVzeW5jIGlzIG5lZWRlZCwKKyAgICAgdGhpcyB3aWxsIGJlIGEgdmVyeSBsYXJnZSBudW1iZXIuICBBdCBhcnJheSBjcmVhdGlvbiBpdCB3aWxsCisgICAgIGRlZmF1bHQgdG8gMCwgdGhvdWdoIHN0YXJ0aW5nIHRoZSBhcnJheSBhcyAnY2xlYW4nIHdpbGwKKyAgICAgc2V0IGl0IG11Y2ggbGFyZ2VyLgorCiAgICBuZXdfZGV2CiAgICAgIFRoaXMgZmlsZSBjYW4gYmUgd3JpdHRlbiBidXQgbm90IHJlYWQuICBUaGUgdmFsdWUgd3JpdHRlbiBzaG91bGQKICAgICAgYmUgYSBibG9jayBkZXZpY2UgbnVtYmVyIGFzIG1ham9yOm1pbm9yLiAgZS5nLiA4OjAKQEAgLTIwNyw2ICsyMTgsNTQgQEAKICAgICAgYXZhaWxhYmxlLiAgSXQgd2lsbCB0aGVuIGFwcGVhciBhdCBtZC9kZXYtWFhYIChkZXBlbmRpbmcgb24gdGhlCiAgICAgIG5hbWUgb2YgdGhlIGRldmljZSkgYW5kIGZ1cnRoZXIgY29uZmlndXJhdGlvbiBpcyB0aGVuIHBvc3NpYmxlLgogCisgICBzYWZlX21vZGVfZGVsYXkKKyAgICAgV2hlbiBhbiBtZCBhcnJheSBoYXMgc2VlbiBubyB3cml0ZSByZXF1ZXN0cyBmb3IgYSBjZXJ0YWluIHBlcmlvZAorICAgICBvZiB0aW1lLCBpdCB3aWxsIGJlIG1hcmtlZCBhcyAnY2xlYW4nLiAgV2hlbiBhbm90aGVyIHdyaXRlCisgICAgIHJlcXVlc3QgYXJyaXZlLCB0aGUgYXJyYXkgaXMgbWFya2VkIGFzICdkaXJ0eScgYmVmb3JlIHRoZSB3cml0ZQorICAgICBjb21tZW5zZXMuICBUaGlzIGlzIGtub3duIGFzICdzYWZlX21vZGUnLgorICAgICBUaGUgJ2NlcnRhaW4gcGVyaW9kJyBpcyBjb250cm9sbGVkIGJ5IHRoaXMgZmlsZSB3aGljaCBzdG9yZXMgdGhlCisgICAgIHBlcmlvZCBhcyBhIG51bWJlciBvZiBzZWNvbmRzLiAgVGhlIGRlZmF1bHQgaXMgMjAwbXNlYyAoMC4yMDApLgorICAgICBXcml0aW5nIGEgdmFsdWUgb2YgMCBkaXNhYmxlcyBzYWZlbW9kZS4KKworICAgYXJyYXlfc3RhdGUKKyAgICAgVGhpcyBmaWxlIGNvbnRhaW5zIGEgc2luZ2xlIHdvcmQgd2hpY2ggZGVzY3JpYmVzIHRoZSBjdXJyZW50CisgICAgIHN0YXRlIG9mIHRoZSBhcnJheS4gIEluIG1hbnkgY2FzZXMsIHRoZSBzdGF0ZSBjYW4gYmUgc2V0IGJ5CisgICAgIHdyaXRpbmcgdGhlIHdvcmQgZm9yIHRoZSBkZXNpcmVkIHN0YXRlLCBob3dldmVyIHNvbWUgc3RhdGVzCisgICAgIGNhbm5vdCBiZSBleHBsaWNpdGx5IHNldCwgYW5kIHNvbWUgdHJhbnNpdGlvbnMgYXJlIG5vdCBhbGxvd2VkLgorCisgICAgIGNsZWFyCisgICAgICAgICBObyBkZXZpY2VzLCBubyBzaXplLCBubyBsZXZlbAorICAgICAgICAgV3JpdGluZyBpcyBlcXVpdmFsZW50IHRvIFNUT1BfQVJSQVkgaW9jdGwKKyAgICAgaW5hY3RpdmUKKyAgICAgICAgIE1heSBoYXZlIHNvbWUgc2V0dGluZ3MsIGJ1dCBhcnJheSBpcyBub3QgYWN0aXZlCisgICAgICAgICAgICBhbGwgSU8gcmVzdWx0cyBpbiBlcnJvcgorICAgICAgICAgV2hlbiB3cml0dGVuLCBkb2Vzbid0IHRlYXIgZG93biBhcnJheSwgYnV0IGp1c3Qgc3RvcHMgaXQKKyAgICAgc3VzcGVuZGVkIChub3Qgc3VwcG9ydGVkIHlldCkKKyAgICAgICAgIEFsbCBJTyByZXF1ZXN0cyB3aWxsIGJsb2NrLiBUaGUgYXJyYXkgY2FuIGJlIHJlY29uZmlndXJlZC4KKyAgICAgICAgIFdyaXRpbmcgdGhpcywgaWYgYWNjZXB0ZWQsIHdpbGwgYmxvY2sgdW50aWwgYXJyYXkgaXMgcXVpZXNzZW50CisgICAgIHJlYWRvbmx5CisgICAgICAgICBubyByZXN5bmMgY2FuIGhhcHBlbi4gIG5vIHN1cGVyYmxvY2tzIGdldCB3cml0dGVuLgorICAgICAgICAgd3JpdGUgcmVxdWVzdHMgZmFpbAorICAgICByZWFkLWF1dG8KKyAgICAgICAgIGxpa2UgcmVhZG9ubHksIGJ1dCBiZWhhdmVzIGxpa2UgJ2NsZWFuJyBvbiBhIHdyaXRlIHJlcXVlc3QuCisKKyAgICAgY2xlYW4gLSBubyBwZW5kaW5nIHdyaXRlcywgYnV0IG90aGVyd2lzZSBhY3RpdmUuCisgICAgICAgICBXaGVuIHdyaXR0ZW4gdG8gaW5hY3RpdmUgYXJyYXksIHN0YXJ0cyB3aXRob3V0IHJlc3luYworICAgICAgICAgSWYgYSB3cml0ZSByZXF1ZXN0IGFycml2ZXMgdGhlbgorICAgICAgICAgICBpZiBtZXRhZGF0YSBpcyBrbm93biwgbWFyayAnZGlydHknIGFuZCBzd2l0Y2ggdG8gJ2FjdGl2ZScuCisgICAgICAgICAgIGlmIG5vdCBrbm93biwgYmxvY2sgYW5kIHN3aXRjaCB0byB3cml0ZS1wZW5kaW5nCisgICAgICAgICBJZiB3cml0dGVuIHRvIGFuIGFjdGl2ZSBhcnJheSB0aGF0IGhhcyBwZW5kaW5nIHdyaXRlcywgdGhlbiBmYWlscy4KKyAgICAgYWN0aXZlCisgICAgICAgICBmdWxseSBhY3RpdmU6IElPIGFuZCByZXN5bmMgY2FuIGJlIGhhcHBlbmluZy4KKyAgICAgICAgIFdoZW4gd3JpdHRlbiB0byBpbmFjdGl2ZSBhcnJheSwgc3RhcnRzIHdpdGggcmVzeW5jCisKKyAgICAgd3JpdGUtcGVuZGluZworICAgICAgICAgY2xlYW4sIGJ1dCB3cml0ZXMgYXJlIGJsb2NrZWQgd2FpdGluZyBmb3IgJ2FjdGl2ZScgdG8gYmUgd3JpdHRlbi4KKworICAgICBhY3RpdmUtaWRsZQorICAgICAgICAgbGlrZSBhY3RpdmUsIGJ1dCBubyB3cml0ZXMgaGF2ZSBiZWVuIHNlZW4gZm9yIGEgd2hpbGUgKHNhZmVfbW9kZV9kZWxheSkuCisKKwogICAgc3luY19zcGVlZF9taW4KICAgIHN5bmNfc3BlZWRfbWF4CiAgICAgIFRoaXMgYXJlIHNpbWlsYXIgdG8gL3Byb2Mvc3lzL2Rldi9yYWlkL3NwZWVkX2xpbWl0X3ttaW4sbWF4fQpAQCAtMjUwLDEwICszMDksMTggQEAKIAkgICAgICBmYXVsdHkgICAtIGRldmljZSBoYXMgYmVlbiBraWNrZWQgZnJvbSBhY3RpdmUgdXNlIGR1ZSB0bwogICAgICAgICAgICAgICAgICAgICAgICAgIGEgZGV0ZWN0ZWQgZmF1bHQKIAkgICAgICBpbl9zeW5jICAtIGRldmljZSBpcyBhIGZ1bGx5IGluLXN5bmMgbWVtYmVyIG9mIHRoZSBhcnJheQorCSAgICAgIHdyaXRlbW9zdGx5IC0gZGV2aWNlIHdpbGwgb25seSBiZSBzdWJqZWN0IHRvIHJlYWQKKwkJICAgICAgICAgcmVxdWVzdHMgaWYgdGhlcmUgYXJlIG5vIG90aGVyIG9wdGlvbnMuCisJCQkgVGhpcyBhcHBsaWVzIG9ubHkgdG8gcmFpZDEgYXJyYXlzLgogCSAgICAgIHNwYXJlICAgIC0gZGV2aWNlIGlzIHdvcmtpbmcsIGJ1dCBub3QgYSBmdWxsIG1lbWJlci4KIAkJCSBUaGlzIGluY2x1ZGVzIHNwYXJlcyB0aGF0IGFyZSBpbiB0aGUgcHJvY2VzcwogCQkJIG9mIGJlaW5nIHJlY292ZXJyZWQgdG8KIAlUaGlzIGxpc3QgbWFrZSBncm93IGluIGZ1dHVyZS4KKwlUaGlzIGNhbiBiZSB3cml0dGVuIHRvLgorCVdyaXRpbmcgImZhdWx0eSIgIHNpbXVsYXRlcyBhIGZhaWx1cmUgb24gdGhlIGRldmljZS4KKwlXcml0aW5nICJyZW1vdmUiIHJlbW92ZXMgdGhlIGRldmljZSBmcm9tIHRoZSBhcnJheS4KKwlXcml0aW5nICJ3cml0ZW1vc3RseSIgc2V0cyB0aGUgd3JpdGVtb3N0bHkgZmxhZy4KKwlXcml0aW5nICItd3JpdGVtb3N0bHkiIGNsZWFycyB0aGUgd3JpdGVtb3N0bHkgZmxhZy4KIAogICAgICAgZXJyb3JzCiAJQW4gYXBwcm94aW1hdGUgY291bnQgb2YgcmVhZCBlcnJvcnMgdGhhdCBoYXZlIGJlZW4gZGV0ZWN0ZWQgb24KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbWVtb3J5LWJhcnJpZXJzLnR4dCBiL0RvY3VtZW50YXRpb24vbWVtb3J5LWJhcnJpZXJzLnR4dAppbmRleCA0NzEwODQ1Li5jZjBkNTQxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL21lbW9yeS1iYXJyaWVycy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9tZW1vcnktYmFycmllcnMudHh0CkBAIC0yNjIsOSArMjYyLDE0IEBACiBDUFUgdG8gcmVzdHJpY3QgdGhlIG9yZGVyLgogCiBNZW1vcnkgYmFycmllcnMgYXJlIHN1Y2ggaW50ZXJ2ZW50aW9ucy4gIFRoZXkgaW1wb3NlIGEgcGVyY2VpdmVkIHBhcnRpYWwKLW9yZGVyaW5nIGJldHdlZW4gdGhlIG1lbW9yeSBvcGVyYXRpb25zIHNwZWNpZmllZCBvbiBlaXRoZXIgc2lkZSBvZiB0aGUgYmFycmllci4KLVRoZXkgcmVxdWVzdCB0aGF0IHRoZSBzZXF1ZW5jZSBvZiBtZW1vcnkgZXZlbnRzIGdlbmVyYXRlZCBhcHBlYXJzIHRvIG90aGVyCi1wYXJ0cyBvZiB0aGUgc3lzdGVtIGFzIGlmIHRoZSBiYXJyaWVyIGlzIGVmZmVjdGl2ZSBvbiB0aGF0IENQVS4KK29yZGVyaW5nIG92ZXIgdGhlIG1lbW9yeSBvcGVyYXRpb25zIG9uIGVpdGhlciBzaWRlIG9mIHRoZSBiYXJyaWVyLgorCitTdWNoIGVuZm9yY2VtZW50IGlzIGltcG9ydGFudCBiZWNhdXNlIHRoZSBDUFVzIGFuZCBvdGhlciBkZXZpY2VzIGluIGEgc3lzdGVtCitjYW4gdXNlIGEgdmFyaWV0eSBvZiB0cmlja3MgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZSAtIGluY2x1ZGluZyByZW9yZGVyaW5nLAorZGVmZXJyYWwgYW5kIGNvbWJpbmF0aW9uIG9mIG1lbW9yeSBvcGVyYXRpb25zOyBzcGVjdWxhdGl2ZSBsb2Fkczsgc3BlY3VsYXRpdmUKK2JyYW5jaCBwcmVkaWN0aW9uIGFuZCB2YXJpb3VzIHR5cGVzIG9mIGNhY2hpbmcuICBNZW1vcnkgYmFycmllcnMgYXJlIHVzZWQgdG8KK292ZXJyaWRlIG9yIHN1cHByZXNzIHRoZXNlIHRyaWNrcywgYWxsb3dpbmcgdGhlIGNvZGUgdG8gc2FuZWx5IGNvbnRyb2wgdGhlCitpbnRlcmFjdGlvbiBvZiBtdWx0aXBsZSBDUFVzIGFuZC9vciBkZXZpY2VzLgogCiAKIFZBUklFVElFUyBPRiBNRU1PUlkgQkFSUklFUgpAQCAtMjgyLDcgKzI4Nyw3IEBACiAgICAgIEEgd3JpdGUgYmFycmllciBpcyBhIHBhcnRpYWwgb3JkZXJpbmcgb24gc3RvcmVzIG9ubHk7IGl0IGlzIG5vdCByZXF1aXJlZAogICAgICB0byBoYXZlIGFueSBlZmZlY3Qgb24gbG9hZHMuCiAKLSAgICAgQSBDUFUgY2FuIGJlIHZpZXdlZCBhcyBhcyBjb21taXRpbmcgYSBzZXF1ZW5jZSBvZiBzdG9yZSBvcGVyYXRpb25zIHRvIHRoZQorICAgICBBIENQVSBjYW4gYmUgdmlld2VkIGFzIGNvbW1pdHRpbmcgYSBzZXF1ZW5jZSBvZiBzdG9yZSBvcGVyYXRpb25zIHRvIHRoZQogICAgICBtZW1vcnkgc3lzdGVtIGFzIHRpbWUgcHJvZ3Jlc3Nlcy4gIEFsbCBzdG9yZXMgYmVmb3JlIGEgd3JpdGUgYmFycmllciB3aWxsCiAgICAgIG9jY3VyIGluIHRoZSBzZXF1ZW5jZSBfYmVmb3JlXyBhbGwgdGhlIHN0b3JlcyBhZnRlciB0aGUgd3JpdGUgYmFycmllci4KIApAQCAtNDEzLDcgKzQxOCw3IEBACiAgICAgIGluZGlyZWN0IGVmZmVjdCB3aWxsIGJlIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgc2Vjb25kIENQVSBzZWVzIHRoZSBlZmZlY3RzCiAgICAgIG9mIHRoZSBmaXJzdCBDUFUncyBhY2Nlc3NlcyBvY2N1ciwgYnV0IHNlZSB0aGUgbmV4dCBwb2ludDoKIAotICgqKSBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCB0aGUgYSBDUFUgd2lsbCBzZWUgdGhlIGNvcnJlY3Qgb3JkZXIgb2YgZWZmZWN0cworICgqKSBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBhIENQVSB3aWxsIHNlZSB0aGUgY29ycmVjdCBvcmRlciBvZiBlZmZlY3RzCiAgICAgIGZyb20gYSBzZWNvbmQgQ1BVJ3MgYWNjZXNzZXMsIGV2ZW4gX2lmXyB0aGUgc2Vjb25kIENQVSB1c2VzIGEgbWVtb3J5CiAgICAgIGJhcnJpZXIsIHVubGVzcyB0aGUgZmlyc3QgQ1BVIF9hbHNvXyB1c2VzIGEgbWF0Y2hpbmcgbWVtb3J5IGJhcnJpZXIgKHNlZQogICAgICB0aGUgc3Vic2VjdGlvbiBvbiAiU01QIEJhcnJpZXIgUGFpcmluZyIpLgpAQCAtNDYxLDggKzQ2Niw4IEBACiBpc24ndCwgYW5kIHRoaXMgYmVoYXZpb3VyIGNhbiBiZSBvYnNlcnZlZCBvbiBjZXJ0YWluIHJlYWwgQ1BVcyAoc3VjaCBhcyB0aGUgREVDCiBBbHBoYSkuCiAKLVRvIGRlYWwgd2l0aCB0aGlzLCBhIGRhdGEgZGVwZW5kZW5jeSBiYXJyaWVyIG11c3QgYmUgaW5zZXJ0ZWQgYmV0d2VlbiB0aGUKLWFkZHJlc3MgbG9hZCBhbmQgdGhlIGRhdGEgbG9hZDoKK1RvIGRlYWwgd2l0aCB0aGlzLCBhIGRhdGEgZGVwZW5kZW5jeSBiYXJyaWVyIG9yIGJldHRlciBtdXN0IGJlIGluc2VydGVkCitiZXR3ZWVuIHRoZSBhZGRyZXNzIGxvYWQgYW5kIHRoZSBkYXRhIGxvYWQ6CiAKIAlDUFUgMQkJQ1BVIDIKIAk9PT09PT09PT09PT09PT0JPT09PT09PT09PT09PT09CkBAIC00ODQsNyArNDg5LDcgQEAKIHZhcmlhYmxlIEIgbWlnaHQgYmUgc3RvcmVkIGluIGFuIGV2ZW4tbnVtYmVyZWQgY2FjaGUgbGluZS4gIFRoZW4sIGlmIHRoZQogZXZlbi1udW1iZXJlZCBiYW5rIG9mIHRoZSByZWFkaW5nIENQVSdzIGNhY2hlIGlzIGV4dHJlbWVseSBidXN5IHdoaWxlIHRoZQogb2RkLW51bWJlcmVkIGJhbmsgaXMgaWRsZSwgb25lIGNhbiBzZWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgcG9pbnRlciBQICgmQiksCi1idXQgdGhlIG9sZCB2YWx1ZSBvZiB0aGUgdmFyaWFibGUgQiAoMSkuCitidXQgdGhlIG9sZCB2YWx1ZSBvZiB0aGUgdmFyaWFibGUgQiAoMikuCiAKIAogQW5vdGhlciBleGFtcGxlIG9mIHdoZXJlIGRhdGEgZGVwZW5kZW5jeSBiYXJyaWVycyBtaWdodCBieSByZXF1aXJlZCBpcyB3aGVyZSBhCkBAIC03NDQsNyArNzQ5LDcgQEAKIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICAgICA6CiAKIAotSWYsIGhvd2V2ZXIsIGEgcmVhZCBiYXJyaWVyIHdlcmUgdG8gYmUgcGxhY2VkIGJldHdlZW4gdGhlIGxvYWQgb2YgRSBhbmQgdGhlCitJZiwgaG93ZXZlciwgYSByZWFkIGJhcnJpZXIgd2VyZSB0byBiZSBwbGFjZWQgYmV0d2VlbiB0aGUgbG9hZCBvZiBCIGFuZCB0aGUKIGxvYWQgb2YgQSBvbiBDUFUgMjoKIAogCUNQVSAxCQkJQ1BVIDIKQEAgLTE0NjEsOSArMTQ2Niw4IEBACiAKIE9uIGEgVVAgc3lzdGVtIC0gd2hlcmUgdGhpcyB3b3VsZG4ndCBiZSBhIHByb2JsZW0gLSB0aGUgc21wX21iKCkgaXMganVzdCBhCiBjb21waWxlciBiYXJyaWVyLCB0aHVzIG1ha2luZyBzdXJlIHRoZSBjb21waWxlciBlbWl0cyB0aGUgaW5zdHJ1Y3Rpb25zIGluIHRoZQotcmlnaHQgb3JkZXIgd2l0aG91dCBhY3R1YWxseSBpbnRlcnZlbmluZyBpbiB0aGUgQ1BVLiAgU2luY2UgdGhlcmUgdGhlcmUncyBvbmx5Ci1vbmUgQ1BVLCB0aGF0IENQVSdzIGRlcGVuZGVuY3kgb3JkZXJpbmcgbG9naWMgd2lsbCB0YWtlIGNhcmUgb2YgZXZlcnl0aGluZwotZWxzZS4KK3JpZ2h0IG9yZGVyIHdpdGhvdXQgYWN0dWFsbHkgaW50ZXJ2ZW5pbmcgaW4gdGhlIENQVS4gIFNpbmNlIHRoZXJlJ3Mgb25seSBvbmUKK0NQVSwgdGhhdCBDUFUncyBkZXBlbmRlbmN5IG9yZGVyaW5nIGxvZ2ljIHdpbGwgdGFrZSBjYXJlIG9mIGV2ZXJ5dGhpbmcgZWxzZS4KIAogCiBBVE9NSUMgT1BFUkFUSU9OUwpAQCAtMTY0MCw5ICsxNjQ0LDkgQEAKIAogICAgICBUaGUgUENJIGJ1cywgYW1vbmdzdCBvdGhlcnMsIGRlZmluZXMgYW4gSS9PIHNwYWNlIGNvbmNlcHQgLSB3aGljaCBvbiBzdWNoCiAgICAgIENQVXMgYXMgaTM4NiBhbmQgeDg2XzY0IGNwdXMgcmVhZGlseSBtYXBzIHRvIHRoZSBDUFUncyBjb25jZXB0IG9mIEkvTwotICAgICBzcGFjZS4gIEhvd2V2ZXIsIGl0IG1heSBhbHNvIG1hcHBlZCBhcyBhIHZpcnR1YWwgSS9PIHNwYWNlIGluIHRoZSBDUFUncwotICAgICBtZW1vcnkgbWFwLCBwYXJ0aWN1bGFybHkgb24gdGhvc2UgQ1BVcyB0aGF0IGRvbid0IHN1cHBvcnQgYWx0ZXJuYXRlCi0gICAgIEkvTyBzcGFjZXMuCisgICAgIHNwYWNlLiAgSG93ZXZlciwgaXQgbWF5IGFsc28gYmUgbWFwcGVkIGFzIGEgdmlydHVhbCBJL08gc3BhY2UgaW4gdGhlIENQVSdzCisgICAgIG1lbW9yeSBtYXAsIHBhcnRpY3VsYXJseSBvbiB0aG9zZSBDUFVzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBhbHRlcm5hdGUgSS9PCisgICAgIHNwYWNlcy4KIAogICAgICBBY2Nlc3NlcyB0byB0aGlzIHNwYWNlIG1heSBiZSBmdWxseSBzeW5jaHJvbm91cyAoYXMgb24gaTM4NiksIGJ1dAogICAgICBpbnRlcm1lZGlhcnkgYnJpZGdlcyAoc3VjaCBhcyB0aGUgUENJIGhvc3QgYnJpZGdlKSBtYXkgbm90IGZ1bGx5IGhvbm91cgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9ydGMudHh0IGIvRG9jdW1lbnRhdGlvbi9ydGMudHh0CmluZGV4IDk1ZDE3YjMuLjJhNThmOTggMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vcnRjLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3J0Yy50eHQKQEAgLTQ0LDggKzQ0LDEwIEBACiBQcm9ncmFtbWluZyBhbmQvb3IgZW5hYmxpbmcgaW50ZXJydXB0IGZyZXF1ZW5jaWVzIGdyZWF0ZXIgdGhhbiA2NEh6IGlzCiBvbmx5IGFsbG93ZWQgYnkgcm9vdC4gVGhpcyBpcyBwZXJoYXBzIGEgYml0IGNvbnNlcnZhdGl2ZSwgYnV0IHdlIGRvbid0IHdhbnQKIGFuIGV2aWwgdXNlciBnZW5lcmF0aW5nIGxvdHMgb2YgSVJRcyBvbiBhIHNsb3cgMzg2c3gtMTYsIHdoZXJlIGl0IG1pZ2h0IGhhdmUKLWEgbmVnYXRpdmUgaW1wYWN0IG9uIHBlcmZvcm1hbmNlLiAgTm90ZSB0aGF0IHRoZSBpbnRlcnJ1cHQgaGFuZGxlciBpcyBvbmx5Ci1hIGZldyBsaW5lcyBvZiBjb2RlIHRvIG1pbmltaXplIGFueSBwb3NzaWJpbGl0eSBvZiB0aGlzIGVmZmVjdC4KK2EgbmVnYXRpdmUgaW1wYWN0IG9uIHBlcmZvcm1hbmNlLiBUaGlzIDY0SHogbGltaXQgY2FuIGJlIGNoYW5nZWQgYnkgd3JpdGluZworYSBkaWZmZXJlbnQgdmFsdWUgdG8gL3Byb2Mvc3lzL2Rldi9ydGMvbWF4LXVzZXItZnJlcS4gTm90ZSB0aGF0IHRoZQoraW50ZXJydXB0IGhhbmRsZXIgaXMgb25seSBhIGZldyBsaW5lcyBvZiBjb2RlIHRvIG1pbmltaXplIGFueSBwb3NzaWJpbGl0eQorb2YgdGhpcyBlZmZlY3QuCiAKIEFsc28sIGlmIHRoZSBrZXJuZWwgdGltZSBpcyBzeW5jaHJvbml6ZWQgd2l0aCBhbiBleHRlcm5hbCBzb3VyY2UsIHRoZSAKIGtlcm5lbCB3aWxsIHdyaXRlIHRoZSB0aW1lIGJhY2sgdG8gdGhlIENNT1MgY2xvY2sgZXZlcnkgMTEgbWludXRlcy4gSW4gCkBAIC04MSw2ICs4Myw3IEBACiAgKi8KIAogI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8bGludXgvcnRjLmg+CiAjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CiAjaW5jbHVkZSA8c3lzL3RpbWUuaD4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc2NzaS9wcGEudHh0IGIvRG9jdW1lbnRhdGlvbi9zY3NpL3BwYS50eHQKaW5kZXggMGRhYzg4ZC4uNWQ5MjIzYiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zY3NpL3BwYS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9zY3NpL3BwYS50eHQKQEAgLTEyLDUgKzEyLDMgQEAKIEVtYWlsIGxpc3QgZm9yIExpbnV4IFBhcnBvcnQKIGxpbnV4LXBhcnBvcnRAdG9ycXVlLm5ldAogCi1FbWFpbCBmb3IgcHJvYmxlbXMgd2l0aCBaSVAgb3IgWklQIFBsdXMgZHJpdmVycwotY2FtcGJlbGxAdG9ycXVlLm5ldApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zeXNycS50eHQgYi9Eb2N1bWVudGF0aW9uL3N5c3JxLnR4dAppbmRleCBhZDBiZWRmLi5lMDE4OGEyIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3N5c3JxLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3N5c3JxLnR4dApAQCAtMTE1LDggKzExNSw5IEBACiB3aGVuIHlvdSB3b3VsZCB0cnkgdG8gbG9naW4uIEl0IHdpbGwga2lsbCBhbGwgcHJvZ3JhbXMgb24gZ2l2ZW4gY29uc29sZQogYW5kIHRodXMgbGV0dGluZyB5b3UgbWFrZSBzdXJlIHRoYXQgdGhlIGxvZ2luIHByb21wdCB5b3Ugc2VlIGlzIGFjdHVhbGx5CiB0aGUgb25lIGZyb20gaW5pdCwgbm90IHNvbWUgdHJvamFuIHByb2dyYW0uCi1JTVBPUlRBTlQ6SW4gaXRzIHRydWUgZm9ybSBpdCBpcyBub3QgYSB0cnVlIFNBSyBsaWtlIHRoZSBvbmUgaW4gICA6SU1QT1JUQU5UCi1JTVBPUlRBTlQ6YzIgY29tcGxpYW50IHN5c3RlbXMsIGFuZCBpdCBzaG91bGQgYmUgbWlzdG9vayBhcyBzdWNoLiA6SU1QT1JUQU5UCitJTVBPUlRBTlQ6IEluIGl0cyB0cnVlIGZvcm0gaXQgaXMgbm90IGEgdHJ1ZSBTQUsgbGlrZSB0aGUgb25lIGluIGEgOklNUE9SVEFOVAorSU1QT1JUQU5UOiBjMiBjb21wbGlhbnQgc3lzdGVtLCBhbmQgaXQgc2hvdWxkIG5vdCBiZSBtaXN0YWtlbiBhcyAgIDpJTVBPUlRBTlQKK0lNUE9SVEFOVDogc3VjaC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6SU1QT1JUQU5UCiAgICAgICAgSXQgc2VlbXMgb3RoZXIgZmluZCBpdCB1c2VmdWwgYXMgKFN5c3RlbSBBdHRlbnRpb24gS2V5KSB3aGljaCBpcwogdXNlZnVsIHdoZW4geW91IHdhbnQgdG8gZXhpdCBhIHByb2dyYW0gdGhhdCB3aWxsIG5vdCBsZXQgeW91IHN3aXRjaCBjb25zb2xlcy4KIChGb3IgZXhhbXBsZSwgWCBvciBhIHN2Z2FsaWIgcHJvZ3JhbS4pCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3R0eS50eHQgYi9Eb2N1bWVudGF0aW9uL3R0eS50eHQKaW5kZXggOGZmN2JjMi4uZGFiNTY2MCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi90dHkudHh0CisrKyBiL0RvY3VtZW50YXRpb24vdHR5LnR4dApAQCAtODAsMTMgKzgwLDYgQEAKIAkJCWZvciBwcm9jZXNzaW5nLiBTZW1hbnRpY3MgY3VycmVudGx5IHJhdGhlcgogCQkJbXlzdGVyaW91cyA4KAogCi1yZWNlaXZlX3Jvb20oKQktCUNhbiBiZSBjYWxsZWQgYnkgdGhlIGRyaXZlciBsYXllciBhdCBhbnkgdGltZSB3aGVuCi0JCQl0aGUgbGRpc2MgaXMgb3BlbmVkLiBUaGUgbGRpc2MgbXVzdCBiZSBhYmxlIHRvCi0JCQloYW5kbGUgdGhlIHJlcG9ydGVkIGFtb3VudCBvZiBkYXRhIGF0IHRoYXQgaW5zdGFudC4KLQkJCVN5bmNocm9uaXphdGlvbiBiZXR3ZWVuIGFjdGl2ZSByZWNlaXZlX2J1ZiBhbmQKLQkJCXJlY2VpdmVfcm9vbSBjYWxscyBpcyBkb3duIHRvIHRoZSBkcml2ZXIgbm90IHRoZQotCQkJbGRpc2MuIE11c3Qgbm90IHNsZWVwLgotCiB3cml0ZV93YWtldXAoKQktCU1heSBiZSBjYWxsZWQgYXQgYW55IHBvaW50IGJldHdlZW4gb3BlbiBhbmQgY2xvc2UuCiAJCQlUaGUgVFRZX0RPX1dSSVRFX1dBS0VVUCBmbGFnIGluZGljYXRlcyBpZiBhIGNhbGwKIAkJCWlzIG5lZWRlZCBidXQgYWx3YXlzIHJhY2VzIHZlcnN1cyBjYWxscy4gVGh1cyB0aGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1QuYnR0diBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1QuYnR0dgppbmRleCBiNzI3MDZjLi40ZWZhNDY0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULmJ0dHYKKysrIGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5idHR2CkBAIC04Nyw3ICs4Nyw3IEBACiAgODYgLT4gT3NwcmV5IDEwMS8xNTEgdy8gc3ZpZAogIDg3IC0+IE9zcHJleSAyMDAvMjAxLzI1MC8yNTEKICA4OCAtPiBPc3ByZXkgMjAwLzI1MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzAwNzA6ZmYwMV0KLSA4OSAtPiBPc3ByZXkgMjEwLzIyMAorIDg5IC0+IE9zcHJleSAyMTAvMjIwLzIzMAogIDkwIC0+IE9zcHJleSA1MDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMDA3MDpmZjAyXQogIDkxIC0+IE9zcHJleSA1NDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMDA3MDpmZjA0XQogIDkyIC0+IE9zcHJleSAyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMDA3MDpmZjAzXQpAQCAtMTExLDcgKzExMSw3IEBACiAxMTAgLT4gSVZDLTEwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmZjAwOmExMzJdCiAxMTEgLT4gSVZDLTEyMEcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmZjAwOmExODIsZmYwMTphMTgyLGZmMDI6YTE4MixmZjAzOmExODIsZmYwNDphMTgyLGZmMDU6YTE4MixmZjA2OmExODIsZmYwNzphMTgyLGZmMDg6YTE4MixmZjA5OmExODIsZmYwYTphMTgyLGZmMGI6YTE4MixmZjBjOmExODIsZmYwZDphMTgyLGZmMGU6YTE4MixmZjBmOmExODJdCiAxMTIgLT4gcGNIRFRWIEhELTIwMDAgVFYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFs3MDYzOjIwMDBdCi0xMTMgLT4gVHdpbmhhbiBEU1QgKyBjbG9uZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsxMWJkOjAwMjYsMTgyMjowMDAxLDI3MGY6ZmMwMF0KKzExMyAtPiBUd2luaGFuIERTVCArIGNsb25lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzExYmQ6MDAyNiwxODIyOjAwMDEsMjcwZjpmYzAwLDE4MjI6MDAyNl0KIDExNCAtPiBXaW5mYXN0IFZDMTAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzEwN2Q6NjYwN10KIDExNSAtPiBUZXBwcm8gVEVWLTU2MC9JbnRlclZpc2lvbiBJVi01NjAKIDExNiAtPiBTSU1VUyBHVkMxMTAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FhNmE6ODJiMl0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1QuY3g4OCBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1QuY3g4OAppbmRleCAzYjM5YTkxLi42Y2I2M2RkIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULmN4ODgKKysrIGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5jeDg4CkBAIC0xNSw3ICsxNSw3IEBACiAgMTQgLT4gS1dvcmxkL1ZTdHJlYW0gWFBlcnQgRFZCLVQgICAgICAgICAgICAgICAgICAgICAgICAgIFsxN2RlOjA4YTZdCiAgMTUgLT4gRFZpQ08gRnVzaW9uSERUViBEVkItVDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsxOGFjOmRiMDBdCiAgMTYgLT4gS1dvcmxkIExUVjg4M1JGCi0gMTcgLT4gRFZpQ08gRnVzaW9uSERUViAzIEdvbGQtUSAgICAgICAgICAgICAgICAgICAgICAgICAgIFsxOGFjOmQ4MTBdCisgMTcgLT4gRFZpQ08gRnVzaW9uSERUViAzIEdvbGQtUSAgICAgICAgICAgICAgICAgICAgICAgICAgIFsxOGFjOmQ4MTAsMThhYzpkODAwXQogIDE4IC0+IEhhdXBwYXVnZSBOb3ZhLVQgRFZCLVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMDA3MDo5MDAyLDAwNzA6OTAwMV0KICAxOSAtPiBDb25leGFudCBEVkItVCByZWZlcmVuY2UgZGVzaWduICAgICAgICAgICAgICAgICAgICAgWzE0ZjE6MDE4N10KICAyMCAtPiBQcm92aWRlbyBQVjI1OSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzE1NDA6MjU4MF0KQEAgLTQwLDggKzQwLDEzIEBACiAgMzkgLT4gS1dvcmxkIERWQi1TIDEwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsxN2RlOjA4YjJdCiAgNDAgLT4gSGF1cHBhdWdlIFdpblRWLUhWUjExMDAgRFZCLVQvSHlicmlkICAgICAgICAgICAgICAgIFswMDcwOjk0MDAsMDA3MDo5NDAyXQogIDQxIC0+IEhhdXBwYXVnZSBXaW5UVi1IVlIxMTAwIERWQi1UL0h5YnJpZCAoTG93IFByb2ZpbGUpICBbMDA3MDo5ODAwLDAwNzA6OTgwMl0KLSA0MiAtPiBkaWdpdGFsbm93IEROVFYgTGl2ZSEgRFZCLVQgUHJvICAgICAgICAgICAgICAgICAgICAgWzE4MjI6MDAyNV0KKyA0MiAtPiBkaWdpdGFsbm93IEROVFYgTGl2ZSEgRFZCLVQgUHJvICAgICAgICAgICAgICAgICAgICAgWzE4MjI6MDAyNSwxODIyOjAwMTldCiAgNDMgLT4gS1dvcmxkL1ZTdHJlYW0gWFBlcnQgRFZCLVQgd2l0aCBjeDIyNzAyICAgICAgICAgICAgIFsxN2RlOjA4YTFdCiAgNDQgLT4gRFZpQ08gRnVzaW9uSERUViBEVkItVCBEdWFsIERpZ2l0YWwgICAgICAgICAgICAgICAgIFsxOGFjOmRiNTAsMThhYzpkYjU0XQogIDQ1IC0+IEtXb3JsZCBIYXJkd2FyZU1wZWdUViBYUGVydCAgICAgICAgICAgICAgICAgICAgICAgICBbMTdkZTowODQwXQogIDQ2IC0+IERWaUNPIEZ1c2lvbkhEVFYgRFZCLVQgSHlicmlkICAgICAgICAgICAgICAgICAgICAgICBbMThhYzpkYjQwLDE4YWM6ZGI0NF0KKyA0NyAtPiBwY0hEVFYgSEQ1NTAwIEhEVFYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzcwNjM6NTUwMF0KKyA0OCAtPiBLd29ybGQgTUNFIDIwMCBEZWx1eGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzE3ZGU6MDg0MV0KKyA0OSAtPiBQaXhlbFZpZXcgUGxheVRWIFA3MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzE1NTQ6NDgxM10KKyA1MCAtPiBOUEcgVGVjaCBSZWFsIFRWIEZNIFRvcCAxMCAgICAgICAgICAgICAgICAgICAgICAgICAgWzE0ZjE6MDg0Ml0KKyA1MSAtPiBXaW5GYXN0IERUVjIwMDAgSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzEwN2Q6NjY1ZV0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1Quc2FhNzEzNCBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1Quc2FhNzEzNAppbmRleCBiY2E1MDkwLi45MDY4YjY2IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULnNhYTcxMzQKKysrIGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5zYWE3MTM0CkBAIC05MywzICs5Myw0IEBACiAgOTIgLT4gQVZlck1lZGlhIEExNjkgQjEgICAgICAgICAgICAgICAgICAgICAgICBbMTQ2MTo2MzYwXQogIDkzIC0+IE1lZGlvbiA3MTM0IEJyaWRnZSAjMiAgICAgICAgICAgICAgICAgICAgWzE2YmU6MDAwNV0KICA5NCAtPiBMaWZlVmlldyBGbHlEVkItVCBIeWJyaWQgQ2FyZGJ1cyAgICAgICAgIFs1MTY4OjMzMDYsNTE2ODozNTAyXQorIDk1IC0+IExpZmVWaWV3IEZseVZJREVPMzAwMCAoTlRTQykgICAgICAgICAgICAgWzUxNjk6MDEzOF0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1QudHVuZXIgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULnR1bmVyCmluZGV4IDFiY2RhYzYuLjQ0MTM0ZjAgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1QudHVuZXIKKysrIGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC50dW5lcgpAQCAtNjIsNyArNjIsNyBAQAogdHVuZXI9NjEgLSBUZW5hIFRORjk1MzMtRC9JRi9UTkY5NTMzLUIvREYKIHR1bmVyPTYyIC0gUGhpbGlwcyBURUE1NzY3SE4gRk0gUmFkaW8KIHR1bmVyPTYzIC0gUGhpbGlwcyBGTUQxMjE2TUUgTUszIEh5YnJpZCBUdW5lcgotdHVuZXI9NjQgLSBMRyBURFZTLUgwNjJGL1RVQTYwMzQKK3R1bmVyPTY0IC0gTEcgVERWUy1IMDZ4RgogdHVuZXI9NjUgLSBZbWVjIFRWRjY2VDUtQi9ERkYKIHR1bmVyPTY2IC0gTEcgVEFMTiBzZXJpZXMKIHR1bmVyPTY3IC0gUGhpbGlwcyBURDEzMTYgSHlicmlkIFR1bmVyCkBAIC03MSwzICs3MSw0IEBACiB0dW5lcj03MCAtIFNhbXN1bmcgVENQTiAyMTIxUDMwQQogdHVuZXI9NzEgLSBYY2VpdmUgeGMzMDI4CiB0dW5lcj03MiAtIFRob21zb24gRkU2NjAwCit0dW5lcj03MyAtIFNhbXN1bmcgVENQRyA2MTIxUDMwQQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DUWNhbS50eHQgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NRY2FtLnR4dAppbmRleCA0NjRlNGNlLi5hZGU4NjUxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NRY2FtLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NRY2FtLnR4dApAQCAtMTg1LDIwNyArMTg1LDEwIEBACiAKIDkuMCAtLS0gQSBzYW1wbGUgcHJvZ3JhbSB1c2luZyB2NGxncmFiYmVyLAogCi1UaGlzIHByb2dyYW0gaXMgYSBzaW1wbGUgaW1hZ2UgZ3JhYmJlciB0aGF0IHdpbGwgY29weSBhIGZyYW1lIGZyb20gdGhlCit2NGxncmFiIGlzIGEgc2ltcGxlIGltYWdlIGdyYWJiZXIgdGhhdCB3aWxsIGNvcHkgYSBmcmFtZSBmcm9tIHRoZQogZmlyc3QgdmlkZW8gZGV2aWNlLCAvZGV2L3ZpZGVvMCB0byBzdGFuZGFyZCBvdXRwdXQgaW4gcG9ydGFibGUgcGl4bWFwCi1mb3JtYXQgKC5wcG0pICBVc2luZyB0aGlzIGxpa2U6ICd2NGxncmFiIHwgY29udmVydCAtIGMtcWNhbS5qcGcnCi1wcm9kdWNlZCB0aGlzIHBpY3R1cmUgb2YgbWUgYXQKLSAgICBodHRwOi8vbXVnLnN5cy52aXJnaW5pYS5lZHUvfmRyZjVuL2V4dHJhcy9jLXFjYW0uanBnCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tIDg8IC0tLS0tLS0tLS0tLS0tLS0gODwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLyogU2ltcGxlIFZpZGVvNExpbnV4IGltYWdlIGdyYWJiZXIuICovCi0vKgotICoJVmlkZW80TGludXggRHJpdmVyIFRlc3QvRXhhbXBsZSBGcmFtZWdyYWJiaW5nIFByb2dyYW0KLSAqCi0gKglDb21waWxlIHdpdGg6Ci0gKgkJZ2NjIC1zIC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgdjRsZ3JhYi5jIC1vIHY0bGdyYWIKLSAqICAgICAgVXNlIGFzOgotICogICAgICAgICAgICAgIHY0bGdyYWIgPmltYWdlLnBwbQotICoKLSAqCUNvcHlyaWdodCAoQykgMTk5OC0wNS0wMywgUGhpbCBCbHVuZGVsbCA8cGhpbGJAZ251Lm9yZz4KLSAqICAgICAgQ29waWVkIGZyb20gaHR0cDovL3d3dy50YXplbmRhLmRlbW9uLmNvLnVrL3BoaWwvdmdyYWJiZXIuYwotICogICAgICB3aXRoIG1pbm9yIG1vZGlmaWNhdGlvbnMgKERhdmUgRm9ycmVzdCwgZHJmNW5AdmlyZ2luaWEuZWR1KS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgotCi0jZGVmaW5lIEZJTEUgIi9kZXYvdmlkZW8wIgotCi0vKiBTdG9sZSB0aGlzIGZyb20gdHZzZXQuYyAqLwotCi0jZGVmaW5lIFJFQURfVklERU9fUElYRUwoYnVmLCBmb3JtYXQsIGRlcHRoLCByLCBnLCBiKSAgICAgICAgICAgICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0Jc3dpdGNoIChmb3JtYXQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQljYXNlIFZJREVPX1BBTEVUVEVfR1JFWTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCXN3aXRjaCAoZGVwdGgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCQljYXNlIDQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJCWNhc2UgNjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQkJY2FzZSA4OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCQkJKHIpID0gKGcpID0gKGIpID0gKCpidWYrKyA8PCA4KTtcCi0JCQkJCWJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJCQkJCQkJXAotCQkJCWNhc2UgMTY6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQkJCShyKSA9IChnKSA9IChiKSA9ICAgICAgICAgICAgICAgXAotCQkJCQkJKigodW5zaWduZWQgc2hvcnQgKikgYnVmKTsgICAgICBcCi0JCQkJCWJ1ZiArPSAyOyAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJCQlicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCWJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCQkJCQkJCVwKLQkJCQkJCQkJCVwKLQkJY2FzZSBWSURFT19QQUxFVFRFX1JHQjU2NTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJdW5zaWduZWQgc2hvcnQgdG1wID0gKih1bnNpZ25lZCBzaG9ydCAqKWJ1ZjsgICAgXAotCQkJKHIpID0gdG1wJjB4RjgwMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJKGcpID0gKHRtcDw8NSkmMHhGQzAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJKGIpID0gKHRtcDw8MTEpJjB4RjgwMDsgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJYnVmICs9IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQkJCQkJCQlcCi0JCWNhc2UgVklERU9fUEFMRVRURV9SR0I1NTU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJKHIpID0gKGJ1ZlswXSYweEY4KTw8ODsgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJKGcpID0gKChidWZbMF0gPDwgNSB8IGJ1ZlsxXSA+PiAzKSYweEY4KTw8ODsgICAgXAotCQkJKGIpID0gKChidWZbMV0gPDwgMiApICYgMHhGOCk8PDg7ICAgICAgICAgICAgICAgXAotCQkJYnVmICs9IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJCQkJCQkJXAotCQljYXNlIFZJREVPX1BBTEVUVEVfUkdCMjQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCShyKSA9IGJ1ZlswXSA8PCA4OyAoZykgPSBidWZbMV0gPDwgODsgICAgICAgICAgIFwKLQkJCShiKSA9IGJ1ZlsyXSA8PCA4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCWJ1ZiArPSAzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCWJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCQkJCQkJCVwKLQkJZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQlmcHJpbnRmKHN0ZGVyciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQkJIkZvcm1hdCAlZCBub3QgeWV0IHN1cHBvcnRlZFxuIiwgICAgICAgIFwKLQkJCQlmb3JtYXQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLWludCBnZXRfYnJpZ2h0bmVzc19hZGoodW5zaWduZWQgY2hhciAqaW1hZ2UsIGxvbmcgc2l6ZSwgaW50ICpicmlnaHRuZXNzKSB7Ci0gIGxvbmcgaSwgdG90ID0gMDsKLSAgZm9yIChpPTA7aTxzaXplKjM7aSsrKQotICAgIHRvdCArPSBpbWFnZVtpXTsKLSAgKmJyaWdodG5lc3MgPSAoMTI4IC0gdG90LyhzaXplKjMpKS8zOwotICByZXR1cm4gISgodG90LyhzaXplKjMpKSA+PSAxMjYgJiYgKHRvdC8oc2l6ZSozKSkgPD0gMTMwKTsKLX0KLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiogYXJndikKLXsKLSAgaW50IGZkID0gb3BlbihGSUxFLCBPX1JET05MWSksIGY7Ci0gIHN0cnVjdCB2aWRlb19jYXBhYmlsaXR5IGNhcDsKLSAgc3RydWN0IHZpZGVvX3dpbmRvdyB3aW47Ci0gIHN0cnVjdCB2aWRlb19waWN0dXJlIHZwaWM7Ci0KLSAgdW5zaWduZWQgY2hhciAqYnVmZmVyLCAqc3JjOwotICBpbnQgYnBwID0gMjQsIHIsIGcsIGI7Ci0gIHVuc2lnbmVkIGludCBpLCBzcmNfZGVwdGg7Ci0KLSAgaWYgKGZkIDwgMCkgewotICAgIHBlcnJvcihGSUxFKTsKLSAgICBleGl0KDEpOwotICB9Ci0KLSAgaWYgKGlvY3RsKGZkLCBWSURJT0NHQ0FQLCAmY2FwKSA8IDApIHsKLSAgICBwZXJyb3IoIlZJRElPR0NBUCIpOwotICAgIGZwcmludGYoc3RkZXJyLCAiKCIgRklMRSAiIG5vdCBhIHZpZGVvNGxpbnV4IGRldmljZT8pXG4iKTsKLSAgICBjbG9zZShmZCk7Ci0gICAgZXhpdCgxKTsKLSAgfQotCi0gIGlmIChpb2N0bChmZCwgVklESU9DR1dJTiwgJndpbikgPCAwKSB7Ci0gICAgcGVycm9yKCJWSURJT0NHV0lOIik7Ci0gICAgY2xvc2UoZmQpOwotICAgIGV4aXQoMSk7Ci0gIH0KLQotICBpZiAoaW9jdGwoZmQsIFZJRElPQ0dQSUNULCAmdnBpYykgPCAwKSB7Ci0gICAgcGVycm9yKCJWSURJT0NHUElDVCIpOwotICAgIGNsb3NlKGZkKTsKLSAgICBleGl0KDEpOwotICB9Ci0KLSAgaWYgKGNhcC50eXBlICYgVklEX1RZUEVfTU9OT0NIUk9NRSkgewotICAgIHZwaWMuZGVwdGg9ODsKLSAgICB2cGljLnBhbGV0dGU9VklERU9fUEFMRVRURV9HUkVZOyAgICAvKiA4Yml0IGdyZXkgKi8KLSAgICBpZihpb2N0bChmZCwgVklESU9DU1BJQ1QsICZ2cGljKSA8IDApIHsKLSAgICAgIHZwaWMuZGVwdGg9NjsKLSAgICAgIGlmKGlvY3RsKGZkLCBWSURJT0NTUElDVCwgJnZwaWMpIDwgMCkgewotCXZwaWMuZGVwdGg9NDsKLQlpZihpb2N0bChmZCwgVklESU9DU1BJQ1QsICZ2cGljKSA8IDApIHsKLQkgIGZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIGZpbmQgYSBzdXBwb3J0ZWQgY2FwdHVyZSBmb3JtYXQuXG4iKTsKLQkgIGNsb3NlKGZkKTsKLQkgIGV4aXQoMSk7Ci0JfQotICAgICAgfQotICAgIH0KLSAgfSBlbHNlIHsKLSAgICB2cGljLmRlcHRoPTI0OwotICAgIHZwaWMucGFsZXR0ZT1WSURFT19QQUxFVFRFX1JHQjI0OwotCi0gICAgaWYoaW9jdGwoZmQsIFZJRElPQ1NQSUNULCAmdnBpYykgPCAwKSB7Ci0gICAgICB2cGljLnBhbGV0dGU9VklERU9fUEFMRVRURV9SR0I1NjU7Ci0gICAgICB2cGljLmRlcHRoPTE2OwotCi0gICAgICBpZihpb2N0bChmZCwgVklESU9DU1BJQ1QsICZ2cGljKT09LTEpIHsKLQl2cGljLnBhbGV0dGU9VklERU9fUEFMRVRURV9SR0I1NTU7Ci0JdnBpYy5kZXB0aD0xNTsKLQotCWlmKGlvY3RsKGZkLCBWSURJT0NTUElDVCwgJnZwaWMpPT0tMSkgewotCSAgZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gZmluZCBhIHN1cHBvcnRlZCBjYXB0dXJlIGZvcm1hdC5cbiIpOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBidWZmZXIgPSBtYWxsb2Mod2luLndpZHRoICogd2luLmhlaWdodCAqIGJwcCk7Ci0gIGlmICghYnVmZmVyKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJPdXQgb2YgbWVtb3J5LlxuIik7Ci0gICAgZXhpdCgxKTsKLSAgfQotCi0gIGRvIHsKLSAgICBpbnQgbmV3YnJpZ2h0OwotICAgIHJlYWQoZmQsIGJ1ZmZlciwgd2luLndpZHRoICogd2luLmhlaWdodCAqIGJwcCk7Ci0gICAgZiA9IGdldF9icmlnaHRuZXNzX2FkaihidWZmZXIsIHdpbi53aWR0aCAqIHdpbi5oZWlnaHQsICZuZXdicmlnaHQpOwotICAgIGlmIChmKSB7Ci0gICAgICB2cGljLmJyaWdodG5lc3MgKz0gKG5ld2JyaWdodCA8PCA4KTsKLSAgICAgIGlmKGlvY3RsKGZkLCBWSURJT0NTUElDVCwgJnZwaWMpPT0tMSkgewotCXBlcnJvcigiVklESU9TUElDVCIpOwotCWJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfSB3aGlsZSAoZik7Ci0KLSAgZnByaW50ZihzdGRvdXQsICJQNlxuJWQgJWQgMjU1XG4iLCB3aW4ud2lkdGgsIHdpbi5oZWlnaHQpOwotCi0gIHNyYyA9IGJ1ZmZlcjsKLQotICBmb3IgKGkgPSAwOyBpIDwgd2luLndpZHRoICogd2luLmhlaWdodDsgaSsrKSB7Ci0gICAgUkVBRF9WSURFT19QSVhFTChzcmMsIHZwaWMucGFsZXR0ZSwgc3JjX2RlcHRoLCByLCBnLCBiKTsKLSAgICBmcHV0YyhyPj44LCBzdGRvdXQpOwotICAgIGZwdXRjKGc+PjgsIHN0ZG91dCk7Ci0gICAgZnB1dGMoYj4+OCwgc3Rkb3V0KTsKLSAgfQotCi0gIGNsb3NlKGZkKTsKLSAgcmV0dXJuIDA7Ci19Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLSA4PCAtLS0tLS0tLS0tLS0tLS0tIDg8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitmb3JtYXQgKC5wcG0pICBUbyBwcm9kdWNlIC5qcGcgb3V0cHV0LCB5b3UgY2FuIHVzZSBpdCBsaWtlIHRoaXM6CisndjRsZ3JhYiB8IGNvbnZlcnQgLSBjLXFjYW0uanBnJwogCiAKIDEwLjAgLS0tIE90aGVyIEluZm9ybWF0aW9uCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L1pvcmFuIGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9ab3JhbgppbmRleCBiZTlmMjFiLi4wNDBhMmM4IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L1pvcmFuCisrKyBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvWm9yYW4KQEAgLTMzLDYgKzMzLDIxIEBACiBOb3JtczogUEFMLCBTRUNBTSAoNzIweDU3NiBAIDI1IGZwcyksIE5UU0MgKDcyMHg0ODAgQCAyOS45NyBmcHMpCiBDYXJkIG51bWJlcjogNwogCitBdmVyTWVkaWEgNiBFeWVzIEFWUzZFWUVTOgorKiBab3JhbiB6cjM2MDY3IFBDSSBjb250cm9sbGVyCisqIFpvcmFuIHpyMzYwNjAgTUpQRUcgY29kZWMKKyogU2Ftc3VuZyBrczAxMjcgVFYgZGVjb2RlcgorKiBDb25leGFudCBidDg2NiAgVFYgZW5jb2RlcgorRHJpdmVycyB0byB1c2U6IHZpZGVvZGV2LCBpMmMtY29yZSwgaTJjLWFsZ28tYml0LAorCQl2aWRlb2NvZGVjLCBrczAxMjcsIGJ0ODY2LCB6cjM2MDYwLCB6cjM2MDY3CitJbnB1dHMvb3V0cHV0czogU2l4IHBoeXNpY2FsIGlucHV0cy4gMS02IGFyZSBjb21wb3NpdGUsCisJCTEtMiwgMy00LCA1LTYgZG91YmxlcyBhcyBTLXZpZGVvLAorCQkxLTMgdHJpcGxlcyBhcyBjb21wb25lbnQuCisJCU9uZSBjb21wb3NpdGUgb3V0cHV0LgorTm9ybXM6IFBBTCwgU0VDQU0gKDcyMHg1NzYgQCAyNSBmcHMpLCBOVFNDICg3MjB4NDgwIEAgMjkuOTcgZnBzKQorQ2FyZCBudW1iZXI6IDgKK05vdCBhdXRvZGV0ZWN0ZWQsIGNhcmQ9OCBpcyBuZWNlc3NhcnkuCisKIExpbnV4IE1lZGlhIExhYnMgTE1MMzM6CiAqIFpvcmFuIHpyMzYwNjcgUENJIGNvbnRyb2xsZXIKICogWm9yYW4genIzNjA2MCBNSlBFRyBjb2RlYwpAQCAtMTkyLDYgKzIwNywxMCBAQAogd2FzIGludHJvZHVjZWQgaW4gMTk5NiwgaXMgdXNlZCBpbiB0aGUgREMzMCBhbmQgREMzMCsgYW5kCiBjYW4gaGFuZGxlOiBQQUwgQi9HL0gvSSwgUEFMIE4sIFBBTCBNLCBOVFNDIE0sIE5UU0MgNDQsIFBBTCA2MCwgU0VDQU0sTlRTQyBDb21iCiAKK1NhbXN1bmcga3MwMTI3IFRWIGRlY29kZXIKK2lzIHVzZWQgaW4gdGhlIEFWUzZFWUVTIGNhcmQgYW5kCitjYW4gaGFuZGxlOiBOVFNDLU0vTi80NCwgUEFMLU0vTi9CL0cvSC9JL0QvSy9MIGFuZCBTRUNBTQorCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAogMS4yIFdoYXQgdGhlIFRWIGVuY29kZXIgY2FuIGRvIGFuIHdoYXQgbm90CkBAIC0yMjEsNiArMjQwLDEwIEBACiB3YXMgaW50cm9kdWNlZCBpbiAxOTkxLCBpcyB1c2VkIGluIHRoZSBEQzEwIG9sZAogY2FuIGdlbmVyYXRlOiBQQUwgLCBOVFNDICwgU0VDQU0KIAorQ29uZXhhbnQgYnQ4NjYgVFYgZW5jb2RlcgoraXMgdXNlZCBpbiBBVlM2RVlFUywgYW5kCitjYW4gZ2VuZXJhdGU6IE5UU0MvUEFMLCBQQUytTSwgUEFMrU4KKwogVGhlIGFkdjcxN3gsIHNob3VsZCBiZSBhYmxlIHRvIHByb2R1Y2UgUEFMIE4uIEJ1dCB5b3UgZmluZCBub3RoaW5nIFBBTCBOCiBzcGVjaWZpYyBpbiB0aGUgcmVnaXN0ZXJzLiBTZWVtIHRoYXQgeW91IGhhdmUgdG8gcmV1c2UgYSBvdGhlciBzdGFuZGFyZAogdG8gZ2VuZXJhdGUgUEFMIE4sIG1heWJlIGl0IHdvdWxkIHdvcmsgaWYgeW91IHVzZSB0aGUgUEFMIE0gc2V0dGluZ3MuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L2J0dHYvQ09OVFJJQlVUT1JTIGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9idHR2L0NPTlRSSUJVVE9SUwppbmRleCBhZWY0OWRiLi44YWFkNmRkIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L2J0dHYvQ09OVFJJQlVUT1JTCisrKyBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvYnR0di9DT05UUklCVVRPUlMKQEAgLTEsNCArMSw0IEBACi1Db250cmlidXRvcnMgdG8gYnR0djogCitDb250cmlidXRvcnMgdG8gYnR0djoKIAogTWljaGFlbCBDaHUgPG1tY2h1QHBvYm94LmNvbT4KICAgQXZlck1lZGlhIGZpeCBhbmQgbW9yZSBmbGV4aWJsZSBjYXJkIHJlY29nbml0aW9uCkBAIC04LDggKzgsOCBAQAogCiBDaHJpcyBLbGVpdHNjaAogICBIYXJkd2FyZSBJMkMKLSAgCi1HZXJkIEtub3JyIDxrcmF4ZWxAY3MudHUtYmVybGluLmRlPiAKKworR2VyZCBLbm9yciA8a3JheGVsQGNzLnR1LWJlcmxpbi5kZT4KICAgUmFkaW8gY2FyZCAoSVRUIHNvdW5kIHByb2Nlc3NvcikKIAogYmlnZm9vdCA8YmlnZm9vdEBuZXQtd2F5Lm5ldD4KQEAgLTE4LDcgKzE4LDcgQEAKIAogCiArIG1hbnkgbW9yZSAocGxlYXNlIG1haWwgbWUgaWYgeW91IGFyZSBtaXNzaW5nIGluIHRoaXMgbGlzdCBhbmQgd291bGQKLSAgICAgICAgICAgICBsaWtlIHRvIGJlIG1lbnRpb25lZCkKKwkgICAgIGxpa2UgdG8gYmUgbWVudGlvbmVkKQogCiAKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9jeDIzNDF4L2Z3LWNhbGxpbmcudHh0IGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9jeDIzNDF4L2Z3LWNhbGxpbmcudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkMjExODEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L2N4MjM0MXgvZnctY2FsbGluZy50eHQKQEAgLTAsMCArMSw2OSBAQAorVGhpcyBwYWdlIGRlc2NyaWJlcyBob3cgdG8gbWFrZSBjYWxscyB0byB0aGUgZmlybXdhcmUgYXBpLgorCitIb3cgdG8gY2FsbAorPT09PT09PT09PT0KKworVGhlIHByZWZlcnJlZCBjYWxsaW5nIGNvbnZlbnRpb24gaXMga25vd24gYXMgdGhlIGZpcm13YXJlIG1haWxib3guIFRoZQorbWFpbGJveGVzIGFyZSBiYXNpY2FsbHkgYSBmaXhlZCBsZW5ndGggYXJyYXkgdGhhdCBzZXJ2ZXMgYXMgdGhlIGNhbGwtc3RhY2suCisKK0Zpcm13YXJlIG1haWxib3hlcyBjYW4gYmUgbG9jYXRlZCBieSBzZWFyY2hpbmcgdGhlIGVuY29kZXIgYW5kIGRlY29kZXIgbWVtb3J5Citmb3IgYSAxNiBieXRlIHNpZ25hdHVyZS4gVGhhdCBzaWduYXR1cmUgd2lsbCBiZSBsb2NhdGVkIG9uIGEgMjU2LWJ5dGUgYm91bmRhcnkuCisKK1NpZ25hdHVyZToKKzB4NzgsIDB4NTYsIDB4MzQsIDB4MTIsIDB4MTIsIDB4NzgsIDB4NTYsIDB4MzQsCisweDM0LCAweDEyLCAweDc4LCAweDU2LCAweDU2LCAweDM0LCAweDEyLCAweDc4CisKK1RoZSBmaXJtd2FyZSBpbXBsZW1lbnRzIDIwIG1haWxib3hlcyBvZiAyMCAzMi1iaXQgd29yZHMuIFRoZSBmaXJzdCAxMCBhcmUKK3Jlc2VydmVkIGZvciBBUEkgY2FsbHMuIFRoZSBzZWNvbmQgMTAgYXJlIHVzZWQgYnkgdGhlIGZpcm13YXJlIGZvciBldmVudAorbm90aWZpY2F0aW9uLgorCisgIEluZGV4ICBOYW1lCisgIC0tLS0tICAtLS0tCisgIDAgICAgICBGbGFncworICAxICAgICAgQ29tbWFuZAorICAyICAgICAgUmV0dXJuIHZhbHVlCisgIDMgICAgICBUaW1lb3V0CisgIDQtMTkgICBQYXJhbWV0ZXIvUmVzdWx0CisKKworVGhlIGZsYWdzIGFyZSBkZWZpbmVkIGluIHRoZSBmb2xsb3dpbmcgdGFibGUuIFRoZSBkaXJlY3Rpb24gaXMgZnJvbSB0aGUKK3BlcnNwZWN0aXZlIG9mIHRoZSBmaXJtd2FyZS4KKworICBCaXQgIERpcmVjdGlvbiAgUHVycG9zZQorICAtLS0gIC0tLS0tLS0tLSAgLS0tLS0tLQorICAyICAgIE8gICAgICAgICAgRmlybXdhcmUgaGFzIHByb2Nlc3NlZCB0aGUgY29tbWFuZC4KKyAgMSAgICBJICAgICAgICAgIERyaXZlciBoYXMgZmluaXNoZWQgc2V0dGluZyB0aGUgcGFyYW1ldGVycy4KKyAgMCAgICBJICAgICAgICAgIERyaXZlciBpcyB1c2luZyB0aGlzIG1haWxib3guCisKKworVGhlIGNvbW1hbmQgaXMgYSAzMi1iaXQgZW51bWVyYXRvci4gVGhlIEFQSSBzcGVjaWZpY3MgbWF5IGJlIGZvdW5kIGluIHRoZQorZnctKi1hcGkudHh0IGRvY3VtZW50cy4KKworVGhlIHJldHVybiB2YWx1ZSBpcyBhIDMyLWJpdCBlbnVtZXJhdG9yLiBPbmx5IHR3byB2YWx1ZXMgYXJlIGN1cnJlbnRseSBkZWZpbmVkOgorMD1zdWNjZXNzIGFuZCAtMT1jb21tYW5kIHVuZGVmaW5lZC4KKworVGhlcmUgYXJlIDE2IHBhcmFtZXRlcnMvcmVzdWx0cyAzMi1iaXQgZmllbGRzLiBUaGUgZHJpdmVyIHBvcHVsYXRlcyB0aGVzZSBmaWVsZHMKK3dpdGggdmFsdWVzIGZvciBhbGwgdGhlIHBhcmFtZXRlcnMgcmVxdWlyZWQgYnkgdGhlIGNhbGwuIFRoZSBkcml2ZXIgb3ZlcndyaXRlcwordGhlc2UgZmllbGRzIHdpdGggcmVzdWx0IHZhbHVlcyByZXR1cm5lZCBieSB0aGUgY2FsbC4gVGhlIEFQSSBzcGVjaWZpY3MgbWF5IGJlCitmb3VuZCBpbiB0aGUgZnctKi1hcGkudHh0IGRvY3VtZW50cy4KKworVGhlIHRpbWVvdXQgdmFsdWUgcHJvdGVjdHMgdGhlIGNhcmQgZnJvbSBhIGh1bmcgZHJpdmVyIHRocmVhZC4gSWYgdGhlIGRyaXZlcgorZG9lc24ndCBoYW5kbGUgdGhlIGNvbXBsZXRlZCBjYWxsIHdpdGhpbiB0aGUgdGltZW91dCBzcGVjaWZpZWQsIHRoZSBmaXJtd2FyZQord2lsbCByZXNldCB0aGF0IG1haWxib3guCisKK1RvIG1ha2UgYW4gQVBJIGNhbGwsIHRoZSBkcml2ZXIgaXRlcmF0ZXMgb3ZlciBlYWNoIG1haWxib3ggbG9va2luZyBmb3IgdGhlCitmaXJzdCBvbmUgYXZhaWxhYmxlIChiaXQgMCBoYXMgYmVlbiBjbGVhcmVkKS4gVGhlIGRyaXZlciBzZXRzIHRoYXQgYml0LCBmaWxscworaW4gdGhlIGNvbW1hbmQgZW51bWVyYXRvciwgdGhlIHRpbWVvdXQgdmFsdWUgYW5kIGFueSByZXF1aXJlZCBwYXJhbWV0ZXJzLiBUaGUKK2RyaXZlciB0aGVuIHNldHMgdGhlIHBhcmFtZXRlciByZWFkeSBiaXQgKGJpdCAxKS4gVGhlIGZpcm13YXJlIHNjYW5zIHRoZQorbWFpbGJveGVzIGZvciBwZW5kaW5nIGNvbW1hbmRzLCBwcm9jZXNzZXMgdGhlbSwgc2V0cyB0aGUgcmVzdWx0IGNvZGUsIHBvcHVsYXRlcwordGhlIHJlc3VsdCB2YWx1ZSBhcnJheSB3aXRoIHRoYXQgY2FsbCdzIHJldHVybiB2YWx1ZXMgYW5kIHNldHMgdGhlIGNhbGwKK2NvbXBsZXRlIGJpdCAoYml0IDIpLiBPbmNlIGJpdCAyIGlzIHNldCwgdGhlIGRyaXZlciBzaG91bGQgcmV0cmlldmUgdGhlIHJlc3VsdHMKK2FuZCBjbGVhciBhbGwgdGhlIGZsYWdzLiBJZiB0aGUgZHJpdmVyIGRvZXMgbm90IHBlcmZvcm0gdGhpcyB0YXNrIHdpdGhpbiB0aGUKK3RpbWUgc2V0IGluIHRoZSB0aW1lb3V0IHJlZ2lzdGVyLCB0aGUgZmlybXdhcmUgd2lsbCByZXNldCB0aGF0IG1haWxib3guCisKK0V2ZW50IG5vdGlmaWNhdGlvbnMgYXJlIHNlbnQgZnJvbSB0aGUgZmlybXdhcmUgdG8gdGhlIGhvc3QuIFRoZSBob3N0IHRlbGxzIHRoZQorZmlybXdhcmUgd2hpY2ggZXZlbnRzIGl0IGlzIGludGVyZXN0ZWQgaW4gdmlhIGFuIEFQSSBjYWxsLiBUaGF0IGNhbGwgdGVsbHMgdGhlCitmaXJtd2FyZSB3aGljaCBub3RpZmljYXRpb24gbWFpbGJveCB0byB1c2UuIFRoZSBmaXJtd2FyZSBzaWduYWxzIHRoZSBob3N0IHZpYQorYW4gaW50ZXJydXB0LiBPbmx5IHRoZSAxNiBSZXN1bHRzIGZpZWxkcyBhcmUgdXNlZCwgdGhlIEZsYWdzLCBDb21tYW5kLCBSZXR1cm4KK3ZhbHVlIGFuZCBUaW1lb3V0IHdvcmRzIGFyZSBub3QgdXNlZC4KKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9jeDIzNDF4L2Z3LWRlY29kZXItYXBpLnR4dCBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvY3gyMzQxeC9mdy1kZWNvZGVyLWFwaS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRmNGZiMwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvY3gyMzQxeC9mdy1kZWNvZGVyLWFwaS50eHQKQEAgLTAsMCArMSwzMTkgQEAKK0RlY29kZXIgZmlybXdhcmUgQVBJIGRlc2NyaXB0aW9uCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitOb3RlOiB0aGlzIEFQSSBpcyBwYXJ0IG9mIHRoZSBkZWNvZGVyIGZpcm13YXJlLCBzbyBpdCdzIGN4MjM0MTUgb25seS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOYW1lIAlDWDIzNDFYX0RFQ19QSU5HX0ZXCitFbnVtIAkwLzB4MDAKK0Rlc2NyaXB0aW9uCisJVGhpcyBBUEkgY2FsbCBkb2VzIG5vdGhpbmcuIEl0IG1heSBiZSB1c2VkIHRvIGNoZWNrIGlmIHRoZSBmaXJtd2FyZQorCWlzIHJlc3BvbmRpbmcuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTmFtZSAJQ1gyMzQxWF9ERUNfU1RBUlRfUExBWUJBQ0sKK0VudW0gCTEvMHgwMQorRGVzY3JpcHRpb24KKwlCZWdpbiBvciByZXN1bWUgcGxheWJhY2suCitQYXJhbVswXQorCTAgYmFzZWQgZnJhbWUgbnVtYmVyIGluIEdPUCB0byBiZWdpbiBwbGF5YmFjayBmcm9tLgorUGFyYW1bMV0KKwlTcGVjaWZpZXMgdGhlIG51bWJlciBvZiBtdXRlZCBhdWRpbyBmcmFtZXMgdG8gcGxheSBiZWZvcmUgbm9ybWFsCisJYXVkaW8gcmVzdW1lcy4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOYW1lIAlDWDIzNDFYX0RFQ19TVE9QX1BMQVlCQUNLCitFbnVtIAkyLzB4MDIKK0Rlc2NyaXB0aW9uCisJRW5kcyBwbGF5YmFjayBhbmQgY2xlYXJzIGFsbCBkZWNvZGVyIGJ1ZmZlcnMuIElmIFBUUyBpcyBub3QgemVybywKKwlwbGF5YmFjayBzdG9wcyBhdCBzcGVjaWZpZWQgUFRTLgorUGFyYW1bMF0KKwlEaXNwbGF5IDA9bGFzdCBmcmFtZSwgMT1ibGFjaworUGFyYW1bMV0KKwlQVFMgbG93CitQYXJhbVsyXQorCVBUUyBoaWdoCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTmFtZSAJQ1gyMzQxWF9ERUNfU0VUX1BMQVlCQUNLX1NQRUVECitFbnVtIAkzLzB4MDMKK0Rlc2NyaXB0aW9uCisJUGxheWJhY2sgc3RyZWFtIGF0IHNwZWVkIG90aGVyIHRoYW4gbm9ybWFsLiBUaGVyZSBhcmUgdHdvIG1vZGVzIG9mCisJb3BlcmF0aW9uOgorCSAgICBTbW9vdGg6IGhvc3QgdHJhbnNmZXJzIGVudGlyZSBzdHJlYW0gYW5kIGZpcm13YXJlIGRyb3BzIHVudXNlZAorCQkgICAgZnJhbWVzLgorCSAgICBDb2Fyc2U6IGhvc3QgZHJvcHMgZnJhbWVzIGJhc2VkIG9uIGluZGV4aW5nIGFzIHJlcXVpcmVkIHRvIGFjaGlldmUKKwkJICAgIGRlc2lyZWQgc3BlZWQuCitQYXJhbVswXQorCUJpdG1hcDoKKwkgICAgMDo3ICAwIG5vcm1hbAorCQkgMSBmYXN0IG9ubHkgIjEuNSB0aW1lcyIKKwkJIG4gblggZmFzdCwgMS9uWCBzbG93CisJICAgIDMwICAgRnJhbWVkcm9wOgorCQkgICAgICcwJyBkdXJpbmcgMS41IHRpbWVzIHBsYXksIGV2ZXJ5IG90aGVyIEIgZnJhbWUgaXMgZHJvcHBlZAorCQkgICAgICcxJyBkdXJpbmcgMS41IHRpbWVzIHBsYXksIHN0cmVhbSBpcyB1bmNoYW5nZWQgKGJpdHJhdGUKKwkJCSBtdXN0IG5vdCBleGNlZWQgOG1icHMpCisJICAgIDMxICAgU3BlZWQ6CisJCSAgICAgJzAnIHNsb3cKKwkJICAgICAnMScgZmFzdAorUGFyYW1bMV0KKwlEaXJlY3Rpb246IDA9Zm9yd2FyZCwgMT1yZXZlcnNlCitQYXJhbVsyXQorCVBpY3R1cmUgbWFzazoKKwkgICAgMT1JIGZyYW1lcworCSAgICAzPUksIFAgZnJhbWVzCisJICAgIDc9SSwgUCwgQiBmcmFtZXMKK1BhcmFtWzNdCisJQiBmcmFtZXMgcGVyIEdPUCAoZm9yIHJldmVyc2UgcGxheSBvbmx5KQorUGFyYW1bNF0KKwlNdXRlIGF1ZGlvOiAwPWRpc2FibGUsIDE9ZW5hYmxlCitQYXJhbVs1XQorCURpc3BsYXkgMD1mcmFtZSwgMT1maWVsZAorUGFyYW1bNl0KKwlTcGVjaWZpZXMgdGhlIG51bWJlciBvZiBtdXRlZCBhdWRpbyBmcmFtZXMgdG8gcGxheSBiZWZvcmUgbm9ybWFsIGF1ZGlvCisJcmVzdW1lcy4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOYW1lIAlDWDIzNDFYX0RFQ19TVEVQX1ZJREVPCitFbnVtIAk1LzB4MDUKK0Rlc2NyaXB0aW9uCisJRWFjaCBjYWxsIHRvIHRoaXMgQVBJIHN0ZXBzIHRoZSBwbGF5YmFjayB0byB0aGUgbmV4dCB1bml0IGRlZmluZWQgYmVsb3cKKwlpbiB0aGUgY3VycmVudCBwbGF5YmFjayBkaXJlY3Rpb24uCitQYXJhbVswXQorCTA9ZnJhbWUsIDE9dG9wIGZpZWxkLCAyPWJvdHRvbSBmaWVsZAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05hbWUgCUNYMjM0MVhfREVDX1NFVF9ETUFfQkxPQ0tfU0laRQorRW51bSAJOC8weDA4CitEZXNjcmlwdGlvbgorCVNldCBETUEgdHJhbnNmZXIgYmxvY2sgc2l6ZS4gQ291bnRlcnBhcnQgdG8gQVBJIDB4QzkKK1BhcmFtWzBdCisJRE1BIHRyYW5zZmVyIGJsb2NrIHNpemUgaW4gYnl0ZXMuIEEgZGlmZmVyZW50IHNpemUgbWF5IGJlIHNwZWNpZmllZAorCXdoZW4gaXNzdWluZyB0aGUgRE1BIHRyYW5zZmVyIGNvbW1hbmQuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTmFtZSAJQ1gyMzQxWF9ERUNfR0VUX1hGRVJfSU5GTworRW51bSAJOS8weDA5CitEZXNjcmlwdGlvbgorCVRoaXMgQVBJIGNhbGwgbWF5IGJlIHVzZWQgdG8gZGV0ZWN0IGFuIGVuZCBvZiBzdHJlYW0gY29uZHRpb24uCitSZXN1bHRbMF0KKwlTdHJlYW0gdHlwZQorUmVzdWx0WzFdCisJQWRkcmVzcyBvZmZzZXQKK1Jlc3VsdFsyXQorCU1heGltdW0gYnl0ZXMgdG8gdHJhbnNmZXIKK1Jlc3VsdFszXQorCUJ1ZmZlciBmdWxsbmVzcworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05hbWUgCUNYMjM0MVhfREVDX0dFVF9ETUFfU1RBVFVTCitFbnVtIAkxMC8weDBBCitEZXNjcmlwdGlvbgorCVN0YXR1cyBvZiB0aGUgbGFzdCBETUEgdHJhbnNmZXIKK1Jlc3VsdFswXQorCUJpdCAxIHNldCBtZWFucyB0cmFuc2ZlciBjb21wbGV0ZQorCUJpdCAyIHNldCBtZWFucyBETUEgZXJyb3IKKwlCaXQgMyBzZXQgbWVhbnMgbGlua2VkIGxpc3QgZXJyb3IKK1Jlc3VsdFsxXQorCURNQSB0eXBlOiAwPU1QRUcsIDE9T1NELCAyPVlVVgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05hbWUgCUNYMjM0MVhfREVDX1NDSEVEX0RNQV9GUk9NX0hPU1QKK0VudW0gCTExLzB4MEIKK0Rlc2NyaXB0aW9uCisJU2V0dXAgRE1BIGZyb20gaG9zdCBvcGVyYXRpb24uIENvdW50ZXJwYXJ0IHRvIEFQSSAweENDCitQYXJhbVswXQorCU1lbW9yeSBhZGRyZXNzIG9mIGxpbmsgbGlzdAorUGFyYW1bMV0KKwlUb3RhbCAjIG9mIGJ5dGVzIHRvIHRyYW5zZmVyCitQYXJhbVsyXQorCURNQSB0eXBlICgwPU1QRUcsIDE9T1NELCAyPVlVVikKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOYW1lIAlDWDIzNDFYX0RFQ19QQVVTRV9QTEFZQkFDSworRW51bSAJMTMvMHgwRAorRGVzY3JpcHRpb24KKwlGcmVlemUgcGxheWJhY2sgaW1tZWRpYXRlbHkuIEluIHRoaXMgbW9kZSwgd2hlbiBpbnRlcm5hbCBidWZmZXJzIGFyZQorCWZ1bGwsIG5vIG1vcmUgZGF0YSB3aWxsIGJlIGFjY2VwdGVkIGFuZCBkYXRhIHJlcXVlc3QgSVJRcyB3aWxsIGJlCisJbWFza2VkLgorUGFyYW1bMF0KKwlEaXNwbGF5OiAwPWxhc3QgZnJhbWUsIDE9YmxhY2sKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOYW1lIAlDWDIzNDFYX0RFQ19IQUxUX0ZXCitFbnVtIAkxNC8weDBFCitEZXNjcmlwdGlvbgorCVRoZSBmaXJtd2FyZSBpcyBoYWx0ZWQgYW5kIG5vIGZ1cnRoZXIgQVBJIGNhbGxzIGFyZSBzZXJ2aWNlZCB1bnRpbAorCXRoZSBmaXJtd2FyZSBpcyB1cGxvYWRlZCBhZ2Fpbi4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOYW1lIAlDWDIzNDFYX0RFQ19TRVRfU1RBTkRBUkQKK0VudW0gCTE2LzB4MTAKK0Rlc2NyaXB0aW9uCisJU2VsZWN0cyBkaXNwbGF5IHN0YW5kYXJkCitQYXJhbVswXQorCTA9TlRTQywgMT1QQUwKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOYW1lIAlDWDIzNDFYX0RFQ19HRVRfVkVSU0lPTgorRW51bSAJMTcvMHgxMQorRGVzY3JpcHRpb24KKwlSZXR1cm5zIGRlY29kZXIgZmlybXdhcmUgdmVyc2lvbiBpbmZvcm1hdGlvbgorUmVzdWx0WzBdCisJVmVyc2lvbiBiaXRtYXNrOgorCSAgICBCaXRzICAwOjE1IGJ1aWxkCisJICAgIEJpdHMgMTY6MjMgbWlub3IKKwkgICAgQml0cyAyNDozMSBtYWpvcgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05hbWUgCUNYMjM0MVhfREVDX1NFVF9TVFJFQU1fSU5QVVQKK0VudW0gCTIwLzB4MTQKK0Rlc2NyaXB0aW9uCisJU2VsZWN0IGRlY29kZXIgc3RyZWFtIGlucHV0IHBvcnQKK1BhcmFtWzBdCisJMD1tZW1vcnkgKGRlZmF1bHQpLCAxPXN0cmVhbWluZworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05hbWUgCUNYMjM0MVhfREVDX0dFVF9USU1JTkdfSU5GTworRW51bSAJMjEvMHgxNQorRGVzY3JpcHRpb24KKwlSZXR1cm5zIHRpbWluZyBpbmZvcm1hdGlvbiBmcm9tIHN0YXJ0IG9mIHBsYXliYWNrCitSZXN1bHRbMF0KKwlGcmFtZSBjb3VudCBieSBkZWNvZGUgb3JkZXIKK1Jlc3VsdFsxXQorCVZpZGVvIFBUUyBiaXRzIDA6MzEgYnkgZGlzcGxheSBvcmRlcgorUmVzdWx0WzJdCisJVmlkZW8gUFRTIGJpdCAzMiBieSBkaXNwbGF5IG9yZGVyCitSZXN1bHRbM10KKwlTQ1IgYml0cyAwOjMxIGJ5IGRpc3BsYXkgb3JkZXIKK1Jlc3VsdFs0XQorCVNDUiBiaXQgMzIgYnkgZGlzcGxheSBvcmRlcgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05hbWUgCUNYMjM0MVhfREVDX1NFVF9BVURJT19NT0RFCitFbnVtIAkyMi8weDE2CitEZXNjcmlwdGlvbgorCVNlbGVjdCBhdWRpbyBtb2RlCitQYXJhbVswXQorCUR1YWwgbW9ubyBtb2RlIGFjdGlvbgorUGFyYW1bMV0KKwlTdGVyZW8gbW9kZSBhY3Rpb246CisJICAgIDA9U3RlcmVvLCAxPUxlZnQsIDI9UmlnaHQsIDM9TW9ubywgND1Td2FwLCAtMT1VbmNoYW5nZWQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOYW1lIAlDWDIzNDFYX0RFQ19TRVRfRVZFTlRfTk9USUZJQ0FUSU9OCitFbnVtIAkyMy8weDE3CitEZXNjcmlwdGlvbgorCVNldHVwIGZpcm13YXJlIHRvIG5vdGlmeSB0aGUgaG9zdCBhYm91dCBhIHBhcnRpY3VsYXIgZXZlbnQuCisJQ291bnRlcnBhcnQgdG8gQVBJIDB4RDUKK1BhcmFtWzBdCisJRXZlbnQ6IDA9QXVkaW8gbW9kZSBjaGFuZ2UgYmV0d2VlbiBzdGVyZW8gYW5kIGR1YWwgY2hhbm5lbAorUGFyYW1bMV0KKwlOb3RpZmljYXRpb24gMD1kaXNhYmxlZCwgMT1lbmFibGVkCitQYXJhbVsyXQorCUludGVycnVwdCBiaXQKK1BhcmFtWzNdCisJTWFpbGJveCBzbG90LCAtMSBpZiBubyBtYWlsYm94IHJlcXVpcmVkLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05hbWUgCUNYMjM0MVhfREVDX1NFVF9ESVNQTEFZX0JVRkZFUlMKK0VudW0gCTI0LzB4MTgKK0Rlc2NyaXB0aW9uCisJTnVtYmVyIG9mIGRpc3BsYXkgYnVmZmVycy4gVG8gZGVjb2RlIGFsbCBmcmFtZXMgaW4gcmV2ZXJzZSBwbGF5YmFjayB5b3UKKwltdXN0IHVzZSBuaW5lIGJ1ZmZlcnMuCitQYXJhbVswXQorCTA9c2l4IGJ1ZmZlcnMsIDE9bmluZSBidWZmZXJzCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTmFtZSAJQ1gyMzQxWF9ERUNfRVhUUkFDVF9WQkkKK0VudW0gCTI1LzB4MTkKK0Rlc2NyaXB0aW9uCisJRXh0cmFjdHMgVkJJIGRhdGEKK1BhcmFtWzBdCisJMD1leHRyYWN0IGZyb20gZXh0ZW5zaW9uICYgdXNlciBkYXRhLCAxPWV4dHJhY3QgZnJvbSBwcml2YXRlIHBhY2tldHMKK1Jlc3VsdFswXQorCVZCSSB0YWJsZSBsb2NhdGlvbgorUmVzdWx0WzFdCisJVkJJIHRhYmxlIHNpemUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOYW1lIAlDWDIzNDFYX0RFQ19TRVRfREVDT0RFUl9TT1VSQ0UKK0VudW0gCTI2LzB4MUEKK0Rlc2NyaXB0aW9uCisJU2VsZWN0cyBkZWNvZGVyIHNvdXJjZS4gRW5zdXJlIHRoYXQgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIHRoaXMKKwlBUEkgbWF0Y2ggdGhlIGVuY29kZXIgc2V0dGluZ3MuCitQYXJhbVswXQorCU1vZGU6IDA9TVBFRyBmcm9tIGhvc3QsIDE9WVVWIGZyb20gZW5jb2RlciwgMj1ZVVYgZnJvbSBob3N0CitQYXJhbVsxXQorCVlVViBwaWN0dXJlIHdpZHRoCitQYXJhbVsyXQorCVlVViBwaWN0dXJlIGhlaWdodAorUGFyYW1bM10KKwlCaXRtYXA6IHNlZSBQYXJhbVswXSBvZiBBUEkgMHhCRAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05hbWUgCUNYMjM0MVhfREVDX1NFVF9BVURJT19PVVRQVVQKK0VudW0gCTI3LzB4MUIKK0Rlc2NyaXB0aW9uCisJU2VsZWN0IGF1ZGlvIG91dHB1dCBmb3JtYXQKK1BhcmFtWzBdCisJQml0bWFzazoKKwkgICAgIDA6MSAgRGF0YSBzaXplOgorCQkgICAgICAnMDAnIDE2IGJpdAorCQkgICAgICAnMDEnIDIwIGJpdAorCQkgICAgICAnMTAnIDI0IGJpdAorCSAgICAgMjo3ICBVbnVzZWQKKwkgICAgIDg6OSAgTW9kZToKKwkJICAgICAgJzAwJyAyIGNoYW5uZWxzCisJCSAgICAgICcwMScgNCBjaGFubmVscworCQkgICAgICAnMTAnIDYgY2hhbm5lbHMKKwkJICAgICAgJzExJyA2IGNoYW5uZWxzIHdpdGggb25lIGxpbmUgZGF0YSBtb2RlCisJCQkgICAoZm9yIGxlZnQganVzdGlmaWVkIE1TQiBmaXJzdCBtb2RlLCAyMCBiaXQgb25seSkKKwkgICAgMTA6MTEgVW51c2VkCisJICAgIDEyOjEzIENoYW5uZWwgZm9ybWF0OgorCQkgICAgICAnMDAnIHJpZ2h0IGp1c3RpZmllZCBNU0IgZmlyc3QgbW9kZQorCQkgICAgICAnMDEnIGxlZnQganVzdGlmaWVkIE1TQiBmaXJzdCBtb2RlCisJCSAgICAgICcxMCcgSTJTIG1vZGUKKwkgICAgMTQ6MTUgVW51c2VkCisJICAgIDE2OjIxIFJpZ2h0IGp1c3RpZnkgYml0IGNvdW50CisJICAgIDIyOjMxIFVudXNlZAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05hbWUgCUNYMjM0MVhfREVDX1NFVF9BVl9ERUxBWQorRW51bSAJMjgvMHgxQworRGVzY3JpcHRpb24KKwlTZXQgYXVkaW8vdmlkZW8gZGVsYXkgaW4gOTBLaHogdGlja3MKK1BhcmFtWzBdCisJMD1BL1YgaW4gc3luYywgbmVnYXRpdmU9YXVkaW8gbGFncywgcG9zaXRpdmU9dmlkZW8gbGFncworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05hbWUgCUNYMjM0MVhfREVDX1NFVF9QUkVCVUZGRVJJTkcKK0VudW0gCTMwLzB4MUUKK0Rlc2NyaXB0aW9uCisJRGVjb2RlciBwcmVidWZmZXJpbmcsIHdoZW4gZW5hYmxlZCB1cCB0byAxMjhLQiBhcmUgYnVmZmVyZWQgZm9yCisJc3RyZWFtcyA8OG1wYnMgb3IgNjQwS0IgZm9yIHN0cmVhbXMgPjhtYnBzCitQYXJhbVswXQorCTA9b2ZmLCAxPW9uCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L2N4MjM0MXgvZnctZG1hLnR4dCBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvY3gyMzQxeC9mdy1kbWEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxMjNlMjYKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L2N4MjM0MXgvZnctZG1hLnR4dApAQCAtMCwwICsxLDk0IEBACitUaGlzIHBhZ2UgZGVzY3JpYmVzIHRoZSBzdHJ1Y3R1cmVzIGFuZCBwcm9jZWR1cmVzIHVzZWQgYnkgdGhlIGN4MjM0MXggRE1BCitlbmdpbmUuCisKK0ludHJvZHVjdGlvbgorPT09PT09PT09PT09CisKK1RoZSBjeDIzNDF4IFBDSSBpbnRlcmZhY2UgaXMgYnVzbWFzdGVyIGNhcGFibGUuIFRoaXMgbWVhbnMgaXQgaGFzIGEgRE1BCitlbmdpbmUgdG8gZWZmaWNpZW50bHkgdHJhbnNmZXIgbGFyZ2Ugdm9sdW1lcyBvZiBkYXRhIGJldHdlZW4gdGhlIGNhcmQgYW5kIG1haW4KK21lbW9yeSB3aXRob3V0IHJlcXVpcmluZyBoZWxwIGZyb20gYSBDUFUuIExpa2UgbW9zdCBoYXJkd2FyZSwgaXQgbXVzdCBvcGVyYXRlCitvbiBjb250aWd1b3VzIHBoeXNpY2FsIG1lbW9yeS4gVGhpcyBpcyBkaWZmaWN1bHQgdG8gY29tZSBieSBpbiBsYXJnZSBxdWFudGl0aWVzCitvbiB2aXJ0dWFsIG1lbW9yeSBtYWNoaW5lcy4KKworVGhlcmVmb3JlLCBpdCBhbHNvIHN1cHBvcnRzIGEgdGVjaG5pcXVlIGNhbGxlZCAic2NhdHRlci1nYXRoZXIiLiBUaGUgY2FyZCBjYW4KK3RyYW5zZmVyIG11bHRpcGxlIGJ1ZmZlcnMgaW4gb25lIG9wZXJhdGlvbi4gSW5zdGVhZCBvZiBhbGxvY2F0aW5nIG9uZSBsYXJnZQorY29udGlndW91cyBidWZmZXIsIHRoZSBkcml2ZXIgY2FuIGFsbG9jYXRlIHNldmVyYWwgc21hbGxlciBidWZmZXJzLgorCitJbiBwcmFjdGljZSwgSSd2ZSBzZWVuIHRoZSBhdmVyYWdlIHRyYW5zZmVyIHRvIGJlIHJvdWdobHkgODBLLCBidXQgdHJhbnNmZXJzCithYm92ZSAxMjhLIHdlcmUgbm90IHVuY29tbW9uLCBwYXJ0aWN1bGFybHkgYXQgc3RhcnR1cC4gVGhlIDEyOEsgZmlndXJlIGlzCitpbXBvcnRhbnQsIGJlY2F1c2UgdGhhdCBpcyB0aGUgbGFyZ2VzdCBibG9jayB0aGF0IHRoZSBrZXJuZWwgY2FuIG5vcm1hbGx5CithbGxvY2F0ZS4gRXZlbiBzdGlsbCwgMTI4SyBibG9ja3MgYXJlIGhhcmQgdG8gY29tZSBieSwgc28gdGhlIGRyaXZlciB3cml0ZXIgaXMKK3VyZ2VkIHRvIGNob29zZSBhIHNtYWxsZXIgYmxvY2sgc2l6ZSBhbmQgbGVhcm4gdGhlIHNjYXR0ZXItZ2F0aGVyIHRlY2huaXF1ZS4KKworTWFpbGJveCAjMTAgaXMgcmVzZXJ2ZWQgZm9yIERNQSB0cmFuc2ZlciBpbmZvcm1hdGlvbi4KKworRmxvdworPT09PQorCitUaGlzIHNlY3Rpb24gZGVzY3JpYmVzLCBpbiBnZW5lcmFsLCB0aGUgb3JkZXIgb2YgZXZlbnRzIHdoZW4gaGFuZGxpbmcgRE1BCit0cmFuc2ZlcnMuIERldGFpbGVkIGluZm9ybWF0aW9uIGZvbGxvd3MgdGhpcyBzZWN0aW9uLgorCistIFRoZSBjYXJkIHJhaXNlcyB0aGUgRW5jb2RlciBpbnRlcnJ1cHQuCistIFRoZSBkcml2ZXIgcmVhZHMgdGhlIHRyYW5zZmVyIHR5cGUsIG9mZnNldCBhbmQgc2l6ZSBmcm9tIE1haWxib3ggIzEwLgorLSBUaGUgZHJpdmVyIGNvbnN0cnVjdHMgdGhlIHNjYXR0ZXItZ2F0aGVyIGFycmF5IGZyb20gZW5vdWdoIGZyZWUgZG1hIGJ1ZmZlcnMKKyAgdG8gY292ZXIgdGhlIHNpemUuCistIFRoZSBkcml2ZXIgc2NoZWR1bGVzIHRoZSBETUEgdHJhbnNmZXIgdmlhIHRoZSBTY2hlZHVsZURNQXRvSG9zdCBBUEkgY2FsbC4KKy0gVGhlIGNhcmQgcmFpc2VzIHRoZSBETUEgQ29tcGxldGUgaW50ZXJydXB0LgorLSBUaGUgZHJpdmVyIGNoZWNrcyB0aGUgRE1BIHN0YXR1cyByZWdpc3RlciBmb3IgYW55IGVycm9ycy4KKy0gVGhlIGRyaXZlciBwb3N0LXByb2Nlc3NlcyB0aGUgbmV3bHkgdHJhbnNmZXJyZWQgYnVmZmVycy4KKworTk9URSEgSXQgaXMgcG9zc2libGUgdGhhdCB0aGUgRW5jb2RlciBhbmQgRE1BIENvbXBsZXRlIGludGVycnVwdHMgZ2V0IHJhaXNlZAorc2ltdWx0YW5lb3VzbHkuIChFbmQgb2YgdGhlIGxhc3QsIHN0YXJ0IG9mIHRoZSBuZXh0LCBldGMuKQorCitNYWlsYm94ICMxMAorPT09PT09PT09PT0KKworVGhlIEZsYWdzLCBDb21tYW5kLCBSZXR1cm4gVmFsdWUgYW5kIFRpbWVvdXQgZmllbGRzIGFyZSBpZ25vcmVkLgorCitOYW1lOiAgICAgICBNYWlsYm94ICMxMAorUmVzdWx0c1swXTogVHlwZTogMDogTVBFRy4KK1Jlc3VsdHNbMV06IE9mZnNldDogVGhlIHBvc2l0aW9uIHJlbGF0aXZlIHRvIHRoZSBjYXJkJ3MgbWVtb3J5IHNwYWNlLgorUmVzdWx0c1syXTogU2l6ZTogVGhlIGV4YWN0IG51bWJlciBvZiBieXRlcyB0byB0cmFuc2Zlci4KKworTXkgc3BlY3VsYXRpb24gaXMgdGhhdCBzaW5jZSB0aGUgU3RhcnRDYXB0dXJlIEFQSSBoYXMgYSBjYXB0dXJlIHR5cGUgb2YgIlJBVyIKK2F2YWlsYWJsZSwgdGhhdCB0aGUgdHlwZSBmaWVsZCB3aWxsIGhhdmUgb3RoZXIgdmFsdWVzIHRoYXQgY29ycmVzcG9uZCB0byBZVVYKK2FuZCBQQ00gZGF0YS4KKworU2NhdHRlci1HYXRoZXIgQXJyYXkKKz09PT09PT09PT09PT09PT09PT09CisKK1RoZSBzY2F0dGVyLWdhdGhlciBhcnJheSBpcyBhIGNvbnRpZ3VvdXNseSBhbGxvY2F0ZWQgYmxvY2sgb2YgbWVtb3J5IHRoYXQKK3RlbGxzIHRoZSBjYXJkIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIG9mIGVhY2ggZGF0YS1ibG9jayB0byB0cmFuc2Zlci4KK0NhcmQgImFkZHJlc3NlcyIgYXJlIGRlcml2ZWQgZnJvbSB0aGUgb2Zmc2V0IHN1cHBsaWVkIGJ5IE1haWxib3ggIzEwLiBIb3N0CithZGRyZXNzZXMgYXJlIHRoZSBwaHlzaWNhbCBtZW1vcnkgbG9jYXRpb24gb2YgdGhlIHRhcmdldCBETUEgYnVmZmVyLgorCitFYWNoIFMtRyBhcnJheSBlbGVtZW50IGlzIGEgc3RydWN0IG9mIHRocmVlIDMyLWJpdCB3b3Jkcy4gVGhlIGZpcnN0IHdvcmQgaXMKK3RoZSBzb3VyY2UgYWRkcmVzcywgdGhlIHNlY29uZCBpcyB0aGUgZGVzdGluYXRpb24gYWRkcmVzcy4gQm90aCB0YWtlIHVwIHRoZQorZW50aXJlIDMyIGJpdHMuIFRoZSBsb3dlc3QgMTYgYml0cyBvZiB0aGUgdGhpcmQgd29yZCBpcyB0aGUgdHJhbnNmZXIgYnl0ZQorY291bnQuIFRoZSBoaWdoLWJpdCBvZiB0aGUgdGhpcmQgd29yZCBpcyB0aGUgImxhc3QiIGZsYWcuIFRoZSBsYXN0LWZsYWcgdGVsbHMKK3RoZSBjYXJkIHRvIHJhaXNlIHRoZSBETUFfRE9ORSBpbnRlcnJ1cHQuIEZyb20gaGFyZCBwZXJzb25hbCBleHBlcmllbmNlLCBpZgoreW91IGZvcmdldCB0byBzZXQgdGhpcyBiaXQsIHRoZSBjYXJkIHdpbGwgc3RpbGwgIndvcmsiIGJ1dCB0aGUgc3RyZWFtIHdpbGwKK21vc3QgbGlrZWx5IGdldCBjb3JydXB0ZWQuCisKK1RoZSB0cmFuc2ZlciBjb3VudCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMjU2LiBUaGVyZWZvcmUsIHRoZSBkcml2ZXIgd2lsbCBuZWVkCit0byB0cmFjayBob3cgbXVjaCBkYXRhIGluIHRoZSB0YXJnZXQgYnVmZmVyIGlzIHZhbGlkIGFuZCBkZWFsIHdpdGggaXQKK2FjY29yZGluZ2x5LgorCitBcnJheSBFbGVtZW50OgorCistIDMyLWJpdCBTb3VyY2UgQWRkcmVzcworLSAzMi1iaXQgRGVzdGluYXRpb24gQWRkcmVzcworLSAxNi1iaXQgcmVzZXJ2ZWQgKGhpZ2ggYml0IGlzIHRoZSBsYXN0IGZsYWcpCistIDE2LWJpdCBieXRlIGNvdW50CisKK0RNQSBUcmFuc2ZlciBTdGF0dXMKKz09PT09PT09PT09PT09PT09PT0KKworUmVnaXN0ZXIgMHgwMDA0IGhvbGRzIHRoZSBETUEgVHJhbnNmZXIgU3RhdHVzOgorCitCaXQKKzQgICBTY2F0dGVyLUdhdGhlciBhcnJheSBlcnJvcgorMyAgIERNQSB3cml0ZSBlcnJvcgorMiAgIERNQSByZWFkIGVycm9yCisxICAgd3JpdGUgY29tcGxldGVkCiswICAgcmVhZCBjb21wbGV0ZWQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvY3gyMzQxeC9mdy1lbmNvZGVyLWFwaS50eHQgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L2N4MjM0MXgvZnctZW5jb2Rlci1hcGkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwMWM2ODYKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L2N4MjM0MXgvZnctZW5jb2Rlci1hcGkudHh0CkBAIC0wLDAgKzEsNjk0IEBACitFbmNvZGVyIGZpcm13YXJlIEFQSSBkZXNjcmlwdGlvbgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOYW1lIAlDWDIzNDFYX0VOQ19QSU5HX0ZXCitFbnVtIAkxMjgvMHg4MAorRGVzY3JpcHRpb24KKwlEb2VzIG5vdGhpbmcuIENhbiBiZSB1c2VkIHRvIGNoZWNrIGlmIHRoZSBmaXJtd2FyZSBpcyByZXNwb25kaW5nLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05hbWUgCUNYMjM0MVhfRU5DX1NUQVJUX0NBUFRVUkUKK0VudW0gCTEyOS8weDgxCitEZXNjcmlwdGlvbgorCUNvbW1lbmNlcyB0aGUgY2FwdHVyZSBvZiB2aWRlbywgYXVkaW8gYW5kL29yIFZCSSBkYXRhLiBBbGwgZW5jb2RpbmcKKwlwYXJhbWV0ZXJzIG11c3QgYmUgaW5pdGlhbGl6ZWQgcHJpb3IgdG8gdGhpcyBBUEkgY2FsbC4gQ2FwdHVyZXMgZnJhbWVzCisJY29udGludW91c2x5IG9yIHVudGlsIGEgcHJlZGVmaW5lZCBudW1iZXIgb2YgZnJhbWVzIGhhdmUgYmVlbiBjYXB0dXJlZC4KK1BhcmFtWzBdCisJQ2FwdHVyZSBzdHJlYW0gdHlwZToKKwkgICAgMD1NUEVHCisJICAgIDE9UmF3CisJICAgIDI9UmF3IHBhc3N0aHJvdWdoCisJICAgIDM9VkJJCisKK1BhcmFtWzFdCisJQml0bWFzazoKKwkgICAgQml0IDAgd2hlbiBzZXQsIGNhcHR1cmVzIFlVVgorCSAgICBCaXQgMSB3aGVuIHNldCwgY2FwdHVyZXMgUENNIGF1ZGlvCisJICAgIEJpdCAyIHdoZW4gc2V0LCBjYXB0dXJlcyBWQkkgKHNhbWUgYXMgcGFyYW1bMF09MykKKwkgICAgQml0IDMgd2hlbiBzZXQsIHRoZSBjYXB0dXJlIGRlc3RpbmF0aW9uIGlzIHRoZSBkZWNvZGVyCisJCShzYW1lIGFzIHBhcmFtWzBdPTIpCisJICAgIEJpdCA0IHdoZW4gc2V0LCB0aGUgY2FwdHVyZSBkZXN0aW5hdGlvbiBpcyB0aGUgaG9zdAorCU5vdGU6IHRoaXMgcGFyYW1ldGVyIGlzIG9ubHkgbWVhbmluZ2Z1bCBmb3IgUkFXIGNhcHR1cmUgdHlwZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOYW1lIAlDWDIzNDFYX0VOQ19TVE9QX0NBUFRVUkUKK0VudW0gCTEzMC8weDgyCitEZXNjcmlwdGlvbgorCUVuZHMgYSBjYXB0dXJlIGluIHByb2dyZXNzCitQYXJhbVswXQorCTA9c3RvcCBhdCBlbmQgb2YgR09QIChnZW5lcmF0ZXMgSVJRKQorCTE9c3RvcCBpbW1lZGlhdGUgKG5vIElSUSkKK1BhcmFtWzFdCisJU3RyZWFtIHR5cGUgdG8gc3RvcCwgc2VlIHBhcmFtWzBdIG9mIEFQSSAweDgxCitQYXJhbVsyXQorCVN1YnR5cGUsIHNlZSBwYXJhbVsxXSBvZiBBUEkgMHg4MQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05hbWUgCUNYMjM0MVhfRU5DX1NFVF9BVURJT19JRAorRW51bSAJMTM3LzB4ODkKK0Rlc2NyaXB0aW9uCisJQXNzaWducyB0aGUgdHJhbnNwb3J0IHN0cmVhbSBJRCBvZiB0aGUgZW5jb2RlZCBhdWRpbyBzdHJlYW0KK1BhcmFtWzBdCisJQXVkaW8gU3RyZWFtIElECisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTmFtZSAJQ1gyMzQxWF9FTkNfU0VUX1ZJREVPX0lECitFbnVtIAkxMzkvMHg4QgorRGVzY3JpcHRpb24KKwlTZXQgdmlkZW8gdHJhbnNwb3J0IHN0cmVhbSBJRAorUGFyYW1bMF0KKwlWaWRlbyBzdHJlYW0gSUQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOYW1lIAlDWDIzNDFYX0VOQ19TRVRfUENSX0lECitFbnVtIAkxNDEvMHg4RAorRGVzY3JpcHRpb24KKwlBc3NpZ25zIHRoZSB0cmFuc3BvcnQgc3RyZWFtIElEIGZvciBQQ1IgcGFja2V0cworUGFyYW1bMF0KKwlQQ1IgU3RyZWFtIElECisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTmFtZSAJQ1gyMzQxWF9FTkNfU0VUX0ZSQU1FX1JBVEUKK0VudW0gCTE0My8weDhGCitEZXNjcmlwdGlvbgorCVNldCB2aWRlbyBmcmFtZXMgcGVyIHNlY29uZC4gQ2hhbmdlIG9jY3VycyBhdCBzdGFydCBvZiBuZXcgR09QLgorUGFyYW1bMF0KKwkwPTMwZnBzCisJMT0yNWZwcworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05hbWUgCUNYMjM0MVhfRU5DX1NFVF9GUkFNRV9TSVpFCitFbnVtIAkxNDUvMHg5MQorRGVzY3JpcHRpb24KKwlTZWxlY3QgdmlkZW8gc3RyZWFtIGVuY29kaW5nIHJlc29sdXRpb24uCitQYXJhbVswXQorCUhlaWdodCBpbiBsaW5lcy4gRGVmYXVsdCA0ODAKK1BhcmFtWzFdCisJV2lkdGggaW4gcGl4ZWxzLiBEZWZhdWx0IDcyMAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05hbWUgCUNYMjM0MVhfRU5DX1NFVF9CSVRfUkFURQorRW51bSAJMTQ5LzB4OTUKK0Rlc2NyaXB0aW9uCisJQXNzaWduIGF2ZXJhZ2UgdmlkZW8gc3RyZWFtIGJpdHJhdGUuIE5vdGUgb24gdGhlIGxhc3QgdGhyZWUgcGFyYW1zOgorCVBhcmFtWzNdIGFuZCBbNF0gc2VlbSB0byBiZSBhbHdheXMgMCwgcGFyYW0gWzVdIGRvZXNuJ3Qgc2VlbSB0byBiZSB1c2VkLgorUGFyYW1bMF0KKwkwPXZhcmlhYmxlIGJpdHJhdGUsIDE9Y29uc3RhbnQgYml0cmF0ZQorUGFyYW1bMV0KKwliaXRyYXRlIGluIGJpdHMgcGVyIHNlY29uZAorUGFyYW1bMl0KKwlwZWFrIGJpdHJhdGUgaW4gYml0cyBwZXIgc2Vjb25kLCBkaXZpZGVkIGJ5IDQwMAorUGFyYW1bM10KKwlNdXggYml0cmF0ZSBpbiBiaXRzIHBlciBzZWNvbmQsIGRpdmlkZWQgYnkgNDAwLiBNYXkgYmUgMCAoZGVmYXVsdCkuCitQYXJhbVs0XQorCVJhdGUgQ29udHJvbCBWQlIgUGFkZGluZworUGFyYW1bNV0KKwlWQlYgQnVmZmVyIHVzZWQgYnkgZW5jb2RlcgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05hbWUgCUNYMjM0MVhfRU5DX1NFVF9HT1BfUFJPUEVSVElFUworRW51bSAJMTUxLzB4OTcKK0Rlc2NyaXB0aW9uCisJU2V0dXAgdGhlIEdPUCBzdHJ1Y3R1cmUKK1BhcmFtWzBdCisJR09QIHNpemUgKG1heGltdW0gaXMgMzQpCitQYXJhbVsxXQorCU51bWJlciBvZiBCIGZyYW1lcyBiZXR3ZWVuIHRoZSBJIGFuZCBQIGZyYW1lLCBwbHVzIDEuCisJRm9yIGV4YW1wbGU6IElCQlBCQlBCQlBCQiAtLT4gR09QIHNpemU6IDEyLCBudW1iZXIgb2YgQiBmcmFtZXM6IDIrMSA9IDMKKwlOb3RlIHRoYXQgR09QIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIChCLWZyYW1lcyArIDEpLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05hbWUgCUNYMjM0MVhfRU5DX1NFVF9BU1BFQ1RfUkFUSU8KK0VudW0gCTE1My8weDk5CitEZXNjcmlwdGlvbgorCVNldHMgdGhlIGVuY29kaW5nIGFzcGVjdCByYXRpby4gQ2hhbmdlcyBpbiB0aGUgYXNwZWN0IHJhdGlvIHRha2UgZWZmZWN0CisJYXQgdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IEdPUC4KK1BhcmFtWzBdCisJJzAwMDAnIGZvcmJpZGRlbgorCScwMDAxJyAxOjEgc3F1YXJlCisJJzAwMTAnIDQ6MworCScwMDExJyAxNjo5CisJJzAxMDAnIDIuMjE6MQorCScwMTAxJyByZXNlcnZlZAorCSAuLi4uCisJJzExMTEnIHJlc2VydmVkCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTmFtZSAJQ1gyMzQxWF9FTkNfU0VUX0ROUl9GSUxURVJfTU9ERQorRW51bSAJMTU1LzB4OUIKK0Rlc2NyaXB0aW9uCisJQXNzaWduIER5bmFtaWMgTm9pc2UgUmVkdWN0aW9uIG9wZXJhdGluZyBtb2RlCitQYXJhbVswXQorCUJpdDA6IFNwYXRpYWwgZmlsdGVyLCBzZXQ9YXV0bywgY2xlYXI9bWFudWFsCisJQml0MTogVGVtcG9yYWwgZmlsdGVyLCBzZXQ9YXV0bywgY2xlYXI9bWFudWFsCitQYXJhbVsxXQorCU1lZGlhbiBmaWx0ZXI6CisJICAgIDA9RGlzYWJsZWQKKwkgICAgMT1Ib3Jpem9udGFsCisJICAgIDI9VmVydGljYWwKKwkgICAgMz1Ib3Jpei9WZXJ0CisJICAgIDQ9RGlhZ29uYWwKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOYW1lIAlDWDIzNDFYX0VOQ19TRVRfRE5SX0ZJTFRFUl9QUk9QUworRW51bSAJMTU3LzB4OUQKK0Rlc2NyaXB0aW9uCisJVGhlc2UgRHluYW1pYyBOb2lzZSBSZWR1Y3Rpb24gZmlsdGVyIHZhbHVlcyBhcmUgb25seSBtZWFuaW5nZnVsIHdoZW4KKwl0aGUgcmVzcGVjdGl2ZSBmaWx0ZXIgaXMgc2V0IHRvICJtYW51YWwiIChTZWUgQVBJIDB4OUIpCitQYXJhbVswXQorCVNwYXRpYWwgZmlsdGVyOiBkZWZhdWx0IDAsIHJhbmdlIDA6MTUKK1BhcmFtWzFdCisJVGVtcG9yYWwgZmlsdGVyOiBkZWZhdWx0IDAsIHJhbmdlIDA6MzEKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOYW1lIAlDWDIzNDFYX0VOQ19TRVRfQ09SSU5HX0xFVkVMUworRW51bSAJMTU5LzB4OUYKK0Rlc2NyaXB0aW9uCisJQXNzaWduIER5bmFtaWMgTm9pc2UgUmVkdWN0aW9uIG1lZGlhbiBmaWx0ZXIgcHJvcGVydGllcy4KK1BhcmFtWzBdCisJVGhyZXNob2xkIGFib3ZlIHdoaWNoIHRoZSBsdW1pbmFuY2UgbWVkaWFuIGZpbHRlciBpcyBlbmFibGVkLgorCURlZmF1bHQ6IDAsIHJhbmdlIDA6MjU1CitQYXJhbVsxXQorCVRocmVzaG9sZCBiZWxvdyB3aGljaCB0aGUgbHVtaW5hbmNlIG1lZGlhbiBmaWx0ZXIgaXMgZW5hYmxlZC4KKwlEZWZhdWx0OiAyNTUsIHJhbmdlIDA6MjU1CitQYXJhbVsyXQorCVRocmVzaG9sZCBhYm92ZSB3aGljaCB0aGUgY2hyb21pbmFuY2UgbWVkaWFuIGZpbHRlciBpcyBlbmFibGVkLgorCURlZmF1bHQ6IDAsIHJhbmdlIDA6MjU1CitQYXJhbVszXQorCVRocmVzaG9sZCBiZWxvdyB3aGljaCB0aGUgY2hyb21pbmFuY2UgbWVkaWFuIGZpbHRlciBpcyBlbmFibGVkLgorCURlZmF1bHQ6IDI1NSwgcmFuZ2UgMDoyNTUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOYW1lIAlDWDIzNDFYX0VOQ19TRVRfU1BBVElBTF9GSUxURVJfVFlQRQorRW51bSAJMTYxLzB4QTEKK0Rlc2NyaXB0aW9uCisJQXNzaWduIHNwYXRpYWwgcHJlZmlsdGVyIHBhcmFtZXRlcnMKK1BhcmFtWzBdCisJTHVtaW5hbmNlIGZpbHRlcgorCSAgICAwPU9mZgorCSAgICAxPTFEIEhvcml6b250YWwKKwkgICAgMj0xRCBWZXJ0aWNhbAorCSAgICAzPTJEIEgvViBTZXBhcmFibGUgKGRlZmF1bHQpCisJICAgIDQ9MkQgU3ltbWV0cmljIG5vbi1zZXBhcmFibGUKK1BhcmFtWzFdCisJQ2hyb21pbmFuY2UgZmlsdGVyCisJICAgIDA9T2ZmCisJICAgIDE9MUQgSG9yaXpvbnRhbCAoZGVmYXVsdCkKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOYW1lIAlDWDIzNDFYX0VOQ19TRVRfM18yX1BVTExET1dOCitFbnVtIAkxNzcvMHhCMQorRGVzY3JpcHRpb24KKwkzOjIgcHVsbGRvd24gcHJvcGVydGllcworUGFyYW1bMF0KKwkwPWVuYWJsZWQKKwkxPWRpc2FibGVkCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTmFtZSAJQ1gyMzQxWF9FTkNfU0VUX1ZCSV9MSU5FCitFbnVtIAkxODMvMHhCNworRGVzY3JpcHRpb24KKwlTZWxlY3RzIFZCSSBsaW5lIG51bWJlci4KK1BhcmFtWzBdCisJQml0cyAwOjQgCWxpbmUgbnVtYmVyCisJQml0ICAzMQkJMD10b3BfZmllbGQsIDE9Ym90dG9tX2ZpZWxkCisJQml0cyAwOjMxIAlhbGwgc2V0IHNwZWNpZmllcyAiYWxsIGxpbmVzIgorUGFyYW1bMV0KKwlWQkkgbGluZSBpbmZvcm1hdGlvbiBmZWF0dXJlczogMD1kaXNhYmxlZCwgMT1lbmFibGVkCitQYXJhbVsyXQorCVNsaWNpbmc6IDA9Tm9uZSwgMT1DbG9zZWQgQ2FwdGlvbgorCUFsbW9zdCBjZXJ0YWlubHkgbm90IGltcGxlbWVudGVkLiBTZXQgdG8gMC4KK1BhcmFtWzNdCisJTHVtaW5hbmNlIHNhbXBsZXMgaW4gdGhpcyBsaW5lLgorCUFsbW9zdCBjZXJ0YWlubHkgbm90IGltcGxlbWVudGVkLiBTZXQgdG8gMC4KK1BhcmFtWzRdCisJQ2hyb21pbmFuY2Ugc2FtcGxlcyBpbiB0aGlzIGxpbmUKKwlBbG1vc3QgY2VydGFpbmx5IG5vdCBpbXBsZW1lbnRlZC4gU2V0IHRvIDAuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTmFtZSAJQ1gyMzQxWF9FTkNfU0VUX1NUUkVBTV9UWVBFCitFbnVtIAkxODUvMHhCOQorRGVzY3JpcHRpb24KKwlBc3NpZ24gc3RyZWFtIHR5cGUKKwlOb3RlOiBUcmFuc3BvcnQgc3RyZWFtIGlzIG5vdCB3b3JraW5nIGluIHJlY2VudCBmaXJtd2FyZXMuCisJQW5kIGluIG9sZGVyIGZpcm13YXJlcyB0aGUgdGltZXN0YW1wcyBpbiB0aGUgVFMgc2VlbSB0byBiZQorCXVucmVsaWFibGUuCitQYXJhbVswXQorCSAwPVByb2dyYW0gc3RyZWFtCisJIDE9VHJhbnNwb3J0IHN0cmVhbQorCSAyPU1QRUcxIHN0cmVhbQorCSAzPVBFUyBBL1Ygc3RyZWFtCisJIDU9UEVTIFZpZGVvIHN0cmVhbQorCSA3PVBFUyBBdWRpbyBzdHJlYW0KKwkxMD1EVkQgc3RyZWFtCisJMTE9VkNEIHN0cmVhbQorCTEyPVNWQ0Qgc3RyZWFtCisJMTM9RFZEX1MxIHN0cmVhbQorCTE0PURWRF9TMiBzdHJlYW0KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOYW1lIAlDWDIzNDFYX0VOQ19TRVRfT1VUUFVUX1BPUlQKK0VudW0gCTE4Ny8weEJCCitEZXNjcmlwdGlvbgorCUFzc2lnbiBzdHJlYW0gb3V0cHV0IHBvcnQuIE5vcm1hbGx5IDAgd2hlbiB0aGUgZGF0YSBpcyBjb3BpZWQgdGhyb3VnaAorCXRoZSBQQ0kgYnVzIChETUEpLCBhbmQgMSB3aGVuIHRoZSBkYXRhIGlzIHN0cmVhbWVkIHRvIGFub3RoZXIgY2hpcAorCShwdnJ1c2IgYW5kIGN4ODgtYmxhY2tiaXJkKS4KK1BhcmFtWzBdCisJMD1NZW1vcnkgKGRlZmF1bHQpCisJMT1TdHJlYW1pbmcKKwkyPVNlcmlhbAorUGFyYW1bMV0KKwlVbmtub3duLCBidXQgbGVhdmluZyB0aGlzIHRvIDAgc2VlbXMgdG8gd29yayBiZXN0LiBJbmRpY2F0aW9ucyBhcmUgdGhhdAorCXRoaXMgbWlnaHQgaGF2ZSB0byBkbyB3aXRoIFVTQiBzdXBwb3J0LCBhbHRob3VnaCBwYXNzaW5nIGFueXRoaW5nIGJ1dCAwCisJb25sIGJyZWFrcyB0aGluZ3MuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTmFtZSAJQ1gyMzQxWF9FTkNfU0VUX0FVRElPX1BST1BFUlRJRVMKK0VudW0gCTE4OS8weEJECitEZXNjcmlwdGlvbgorCVNldCBhdWRpbyBzdHJlYW0gcHJvcGVydGllcywgbWF5IGJlIGNhbGxlZCB3aGlsZSBlbmNvZGluZyBpcyBpbiBwcm9ncmVzcy4KKwlOb3RlOiBhbGwgYml0ZmllbGRzIGFyZSBjb25zaXN0ZW50IHdpdGggSVNPMTExNzIgZG9jdW1lbnRhdGlvbiBleGNlcHQKKwliaXRzIDI6MyB3aGljaCBJU08gZG9jcyBkZWZpbmUgYXM6CisJCScxMScgTGF5ZXIgSQorCQknMTAnIExheWVyIElJCisJCScwMScgTGF5ZXIgSUlJCisJCScwMCcgVW5kZWZpbmVkCisJVGhpcyBkaXNjcmVwYW5jeSBtYXkgaW5kaWNhdGUgYSBwb3NzaWJsZSBlcnJvciBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKwlUZXN0aW5nIGluZGljYXRlZCB0aGF0IG9ubHkgTGF5ZXIgSUkgaXMgYWN0dWFsbHkgd29ya2luZywgYW5kIHRoYXQKKwl0aGUgbWluaW11bSBiaXRyYXRlIHNob3VsZCBiZSAxOTIga2Jwcy4KK1BhcmFtWzBdCisJQml0bWFzazoKKwkgICAwOjEgICcwMCcgNDQuMUtoegorCQknMDEnIDQ4S2h6CisJCScxMCcgMzJLaHoKKwkJJzExJyByZXNlcnZlZAorCisJICAgMjozICAnMDEnPUxheWVyIEkKKwkJJzEwJz1MYXllciBJSQorCisJICAgNDo3ICBCaXRyYXRlOgorCQkgICAgIEluZGV4IHwgTGF5ZXIgSSAgICAgfCBMYXllciBJSQorCQkgICAgIC0tLS0tLSstLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLQorCQkgICAgJzAwMDAnIHwgZnJlZSBmb3JtYXQgfCBmcmVlIGZvcm1hdAorCQkgICAgJzAwMDEnIHwgIDMyIGtiaXQvcyAgfCAgMzIga2JpdC9zCisJCSAgICAnMDAxMCcgfCAgNjQga2JpdC9zICB8ICA0OCBrYml0L3MKKwkJICAgICcwMDExJyB8ICA5NiBrYml0L3MgIHwgIDU2IGtiaXQvcworCQkgICAgJzAxMDAnIHwgMTI4IGtiaXQvcyAgfCAgNjQga2JpdC9zCisJCSAgICAnMDEwMScgfCAxNjAga2JpdC9zICB8ICA4MCBrYml0L3MKKwkJICAgICcwMTEwJyB8IDE5MiBrYml0L3MgIHwgIDk2IGtiaXQvcworCQkgICAgJzAxMTEnIHwgMjI0IGtiaXQvcyAgfCAxMTIga2JpdC9zCisJCSAgICAnMTAwMCcgfCAyNTYga2JpdC9zICB8IDEyOCBrYml0L3MKKwkJICAgICcxMDAxJyB8IDI4OCBrYml0L3MgIHwgMTYwIGtiaXQvcworCQkgICAgJzEwMTAnIHwgMzIwIGtiaXQvcyAgfCAxOTIga2JpdC9zCisJCSAgICAnMTAxMScgfCAzNTIga2JpdC9zICB8IDIyNCBrYml0L3MKKwkJICAgICcxMTAwJyB8IDM4NCBrYml0L3MgIHwgMjU2IGtiaXQvcworCQkgICAgJzExMDEnIHwgNDE2IGtiaXQvcyAgfCAzMjAga2JpdC9zCisJCSAgICAnMTExMCcgfCA0NDgga2JpdC9zICB8IDM4NCBrYml0L3MKKwkJTm90ZTogRm9yIExheWVyIElJLCBub3QgYWxsIGNvbWJpbmF0aW9ucyBvZiB0b3RhbCBiaXRyYXRlCisJCWFuZCBtb2RlIGFyZSBhbGxvd2VkLiBTZWUgSVNPMTExNzItMyAzLUFubmV4IEIsIFRhYmxlIDMtQi4yCisKKwkgICA4OjkgICcwMCc9U3RlcmVvCisJCScwMSc9Sm9pbnRTdGVyZW8KKwkJJzEwJz1EdWFsCisJCScxMSc9TW9ubworCQlOb3RlOiB0ZXN0aW5nIHNlZW1zIHRvIGluZGljYXRlIHRoYXQgTW9ubyBhbmQgcG9zc2libHkKKwkJSm9pbnRTdGVyZW8gYXJlIG5vdCB3b3JraW5nIChkZWZhdWx0IHRvIHN0ZXJlbykuCisJCUR1YWwgZG9lcyB3b3JrLCB0aG91Z2guCisKKwkgIDEwOjExIE1vZGUgRXh0ZW5zaW9uIHVzZWQgaW4gam9pbnRfc3RlcmVvIG1vZGUuCisJCUluIExheWVyIEkgYW5kIElJIHRoZXkgaW5kaWNhdGUgd2hpY2ggc3ViYmFuZHMgYXJlIGluCisJCWludGVuc2l0eV9zdGVyZW8uIEFsbCBvdGhlciBzdWJiYW5kcyBhcmUgY29kZWQgaW4gc3RlcmVvLgorCQkgICAgJzAwJyBzdWJiYW5kcyA0LTMxIGluIGludGVuc2l0eV9zdGVyZW8sIGJvdW5kPT00CisJCSAgICAnMDEnIHN1YmJhbmRzIDgtMzEgaW4gaW50ZW5zaXR5X3N0ZXJlbywgYm91bmQ9PTgKKwkJICAgICcxMCcgc3ViYmFuZHMgMTItMzEgaW4gaW50ZW5zaXR5X3N0ZXJlbywgYm91bmQ9PTEyCisJCSAgICAnMTEnIHN1YmJhbmRzIDE2LTMxIGluIGludGVuc2l0eV9zdGVyZW8sIGJvdW5kPT0xNgorCisJICAxMjoxMyBFbXBoYXNpczoKKwkJICAgICcwMCcgTm9uZQorCQkgICAgJzAxJyA1MC8xNXVTCisJCSAgICAnMTAnIHJlc2VydmVkCisJCSAgICAnMTEnIENDSVRUIEouMTcKKworCSAgMTQgCUNSQzoKKwkJICAgICcwJyBvZmYKKwkJICAgICcxJyBvbgorCisJICAxNSAgICBDb3B5cmlnaHQ6CisJCSAgICAnMCcgb2ZmCisJCSAgICAnMScgb24KKworCSAgMTYgICAgR2VuZXJhdGlvbjoKKwkJICAgICcwJyBjb3B5CisJCSAgICAnMScgb3JpZ2luYWwKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOYW1lIAlDWDIzNDFYX0VOQ19IQUxUX0ZXCitFbnVtIAkxOTUvMHhDMworRGVzY3JpcHRpb24KKwlUaGUgZmlybXdhcmUgaXMgaGFsdGVkIGFuZCBubyBmdXJ0aGVyIEFQSSBjYWxscyBhcmUgc2VydmljZWQgdW50aWwgdGhlCisJZmlybXdhcmUgaXMgdXBsb2FkZWQgYWdhaW4uCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTmFtZSAJQ1gyMzQxWF9FTkNfR0VUX1ZFUlNJT04KK0VudW0gCTE5Ni8weEM0CitEZXNjcmlwdGlvbgorCVJldHVybnMgdGhlIHZlcnNpb24gb2YgdGhlIGVuY29kZXIgZmlybXdhcmUuCitSZXN1bHRbMF0KKwlWZXJzaW9uIGJpdG1hc2s6CisJICAgIEJpdHMgIDA6MTUgYnVpbGQKKwkgICAgQml0cyAxNjoyMyBtaW5vcgorCSAgICBCaXRzIDI0OjMxIG1ham9yCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTmFtZSAJQ1gyMzQxWF9FTkNfU0VUX0dPUF9DTE9TVVJFCitFbnVtIAkxOTcvMHhDNQorRGVzY3JpcHRpb24KKwlBc3NpZ25zIHRoZSBHT1Agb3Blbi9jbG9zZSBwcm9wZXJ0eS4KK1BhcmFtWzBdCisJMD1PcGVuCisJMT1DbG9zZWQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOYW1lIAlDWDIzNDFYX0VOQ19HRVRfU0VRX0VORAorRW51bSAJMTk4LzB4QzYKK0Rlc2NyaXB0aW9uCisJT2J0YWlucyB0aGUgc2VxdWVuY2UgZW5kIGNvZGUgb2YgdGhlIGVuY29kZXIncyBidWZmZXIuIFdoZW4gYSBjYXB0dXJlCisJaXMgc3RhcnRlZCBhIG51bWJlciBvZiBpbnRlcnJ1cHRzIGFyZSBzdGlsbCBnZW5lcmF0ZWQsIHRoZSBsYXN0IG9mCisJd2hpY2ggd2lsbCBoYXZlIFJlc3VsdFswXSBzZXQgdG8gMSBhbmQgUmVzdWx0WzFdIHdpbGwgY29udGFpbiB0aGUgc2l6ZQorCW9mIHRoZSBidWZmZXIuCitSZXN1bHRbMF0KKwlTdGF0ZSBvZiB0aGUgdHJhbnNmZXIgKDEgaWYgbGFzdCBidWZmZXIpCitSZXN1bHRbMV0KKwlJZiBSZXN1bHRbMF0gaXMgMSwgdGhpcyBjb250YWlucyB0aGUgc2l6ZSBvZiB0aGUgbGFzdCBidWZmZXIsIHVuZGVmaW5lZAorCW90aGVyd2lzZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOYW1lIAlDWDIzNDFYX0VOQ19TRVRfUEdNX0lOREVYX0lORk8KK0VudW0gCTE5OS8weEM3CitEZXNjcmlwdGlvbgorCVNldHMgdGhlIFByb2dyYW0gSW5kZXggSW5mb3JtYXRpb24uCitQYXJhbVswXQorCVBpY3R1cmUgTWFzazoKKwkgICAgMD1ObyBpbmRleCBjYXB0dXJlCisJICAgIDE9SSBmcmFtZXMKKwkgICAgMz1JLFAgZnJhbWVzCisJICAgIDc9SSxQLEIgZnJhbWVzCitQYXJhbVsxXQorCUVsZW1lbnRzIHJlcXVlc3RlZCAodXAgdG8gNDAwKQorUmVzdWx0WzBdCisJT2Zmc2V0IGluIFNERiBtZW1vcnkgb2YgdGhlIHRhYmxlLgorUmVzdWx0WzFdCisJTnVtYmVyIG9mIGFsbG9jYXRlZCBlbGVtZW50cyB1cCB0byBhIG1heGltdW0gb2YgUGFyYW1bMV0KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOYW1lIAlDWDIzNDFYX0VOQ19TRVRfVkJJX0NPTkZJRworRW51bSAJMjAwLzB4QzgKK0Rlc2NyaXB0aW9uCisJQ29uZmlndXJlIFZCSSBzZXR0aW5ncworUGFyYW1bMF0KKwlCaXRtYXA6CisJICAgIDAgICAgTW9kZSAnMCcgU2xpY2VkLCAnMScgUmF3CisJICAgIDE6MyAgSW5zZXJ0aW9uOgorCQkgICAgICcwMDAnIGluc2VydCBpbiBleHRlbnNpb24gJiB1c2VyIGRhdGEKKwkJICAgICAnMDAxJyBpbnNlcnQgaW4gcHJpdmF0ZSBwYWNrZXRzCisJCSAgICAgJzAxMCcgc2VwYXJhdGUgc3RyZWFtIGFuZCB1c2VyIGRhdGEKKwkJICAgICAnMTExJyBzZXBhcmF0ZSBzdHJlYW0gYW5kIHByaXZhdGUgZGF0YQorCSAgICA4OjE1IFN0cmVhbSBJRCAobm9ybWFsbHkgMHhCRCkKK1BhcmFtWzFdCisJRnJhbWVzIHBlciBpbnRlcnJ1cHQgKG1heCA4KS4gT25seSB2YWxpZCBpbiByYXcgbW9kZS4KK1BhcmFtWzJdCisJVG90YWwgcmF3IFZCSSBmcmFtZXMuIE9ubHkgdmFsaWQgaW4gcmF3IG1vZGUuCitQYXJhbVszXQorCVN0YXJ0IGNvZGVzCitQYXJhbVs0XQorCVN0b3AgY29kZXMKK1BhcmFtWzVdCisJTGluZXMgcGVyIGZyYW1lCitQYXJhbVs2XQorCUJ5dGUgcGVyIGxpbmUKK1Jlc3VsdFswXQorCU9ic2VydmVkIGZyYW1lcyBwZXIgaW50ZXJydXB0IGluIHJhdyBtb2RlIG9ubHkuIFJhZ2UgMSB0byBQYXJhbVsxXQorUmVzdWx0WzFdCisJT2JzZXJ2ZWQgbnVtYmVyIG9mIGZyYW1lcyBpbiByYXcgbW9kZS4gUmFuZ2UgMSB0byBQYXJhbVsyXQorUmVzdWx0WzJdCisJTWVtb3J5IG9mZnNldCB0byBzdGFydCBvciByYXcgVkJJIGRhdGEKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOYW1lIAlDWDIzNDFYX0VOQ19TRVRfRE1BX0JMT0NLX1NJWkUKK0VudW0gCTIwMS8weEM5CitEZXNjcmlwdGlvbgorCVNldCBETUEgdHJhbnNmZXIgYmxvY2sgc2l6ZQorUGFyYW1bMF0KKwlETUEgdHJhbnNmZXIgYmxvY2sgc2l6ZSBpbiBieXRlcyBvciBmcmFtZXMuIFdoZW4gdW5pdCBpcyBieXRlcywKKwlzdXBwb3J0ZWQgYmxvY2sgc2l6ZXMgYXJlIDJeNywgMl44IGFuZCAyXjkgYnl0ZXMuCitQYXJhbVsxXQorCVVuaXQ6IDA9Ynl0ZXMsIDE9ZnJhbWVzCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTmFtZSAJQ1gyMzQxWF9FTkNfR0VUX1BSRVZfRE1BX0lORk9fTUJfMTAKK0VudW0gCTIwMi8weENBCitEZXNjcmlwdGlvbgorCVJldHVybnMgaW5mb3JtYXRpb24gb24gdGhlIHByZXZpb3VzIERNQSB0cmFuc2ZlciBpbiBjb25qdW5jdGlvbiB3aXRoCisJYml0IDI3IG9mIHRoZSBpbnRlcnJ1cHQgbWFzay4gVXNlcyBtYWlsYm94IDEwLgorUmVzdWx0WzBdCisJVHlwZSBvZiBzdHJlYW0KK1Jlc3VsdFsxXQorCUFkZHJlc3MgT2Zmc2V0CitSZXN1bHRbMl0KKwlNYXhpbXVtIHNpemUgb2YgdHJhbnNmZXIKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOYW1lIAlDWDIzNDFYX0VOQ19HRVRfUFJFVl9ETUFfSU5GT19NQl85CitFbnVtIAkyMDMvMHhDQgorRGVzY3JpcHRpb24KKwlSZXR1cm5zIGluZm9ybWF0aW9uIG9uIHRoZSBwcmV2aW91cyBETUEgdHJhbnNmZXIgaW4gY29uanVuY3Rpb24gd2l0aAorCWJpdCAyNyBvZiB0aGUgaW50ZXJydXB0IG1hc2suIFVzZXMgbWFpbGJveCA5LgorUmVzdWx0WzBdCisJU3RhdHVzIGJpdHM6CisJICAgIEJpdCAwIHNldCBpbmRpY2F0ZXMgdHJhbnNmZXIgY29tcGxldGUKKwkgICAgQml0IDIgc2V0IGluZGljYXRlcyB0cmFuc2ZlciBlcnJvcgorCSAgICBCaXQgNCBzZXQgaW5kaWNhdGVzIGxpbmtlZCBsaXN0IGVycm9yCitSZXN1bHRbMV0KKwlETUEgdHlwZQorUmVzdWx0WzJdCisJUHJlc2VudGF0aW9uIFRpbWUgU3RhbXAgYml0cyAwLi4zMQorUmVzdWx0WzNdCisJUHJlc2VudGF0aW9uIFRpbWUgU3RhbXAgYml0IDMyCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTmFtZSAJQ1gyMzQxWF9FTkNfU0NIRURfRE1BX1RPX0hPU1QKK0VudW0gCTIwNC8weENDCitEZXNjcmlwdGlvbgorCVNldHVwIERNQSB0byBob3N0IG9wZXJhdGlvbgorUGFyYW1bMF0KKwlNZW1vcnkgYWRkcmVzcyBvZiBsaW5rIGxpc3QKK1BhcmFtWzFdCisJTGVuZ3RoIG9mIGxpbmsgbGlzdCAod3RmOiB3aGF0IHVuaXRzID8/PykKK1BhcmFtWzJdCisJRE1BIHR5cGUgKDA9TVBFRykKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOYW1lIAlDWDIzNDFYX0VOQ19JTklUSUFMSVpFX0lOUFVUCitFbnVtIAkyMDUvMHhDRAorRGVzY3JpcHRpb24KKwlJbml0aWFsaXplcyB0aGUgdmlkZW8gaW5wdXQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOYW1lIAlDWDIzNDFYX0VOQ19TRVRfRlJBTUVfRFJPUF9SQVRFCitFbnVtIAkyMDgvMHhEMAorRGVzY3JpcHRpb24KKwlGb3IgZWFjaCBmcmFtZSBjYXB0dXJlZCwgc2tpcCBzcGVjaWZpZWQgbnVtYmVyIG9mIGZyYW1lcy4KK1BhcmFtWzBdCisJTnVtYmVyIG9mIGZyYW1lcyB0byBza2lwCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTmFtZSAJQ1gyMzQxWF9FTkNfUEFVU0VfRU5DT0RFUgorRW51bSAJMjEwLzB4RDIKK0Rlc2NyaXB0aW9uCisJRHVyaW5nIGEgcGF1c2UgY29uZGl0aW9uLCBhbGwgZnJhbWVzIGFyZSBkcm9wcGVkIGluc3RlYWQgb2YgYmVpbmcgZW5jb2RlZC4KK1BhcmFtWzBdCisJMD1QYXVzZSBlbmNvZGluZworCTE9Q29udGludWUgZW5jb2RpbmcKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOYW1lIAlDWDIzNDFYX0VOQ19SRUZSRVNIX0lOUFVUCitFbnVtIAkyMTEvMHhEMworRGVzY3JpcHRpb24KKwlSZWZyZXNoZXMgdGhlIHZpZGVvIGlucHV0CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTmFtZSAJQ1gyMzQxWF9FTkNfU0VUX0NPUFlSSUdIVAorRW51bSAJMjEyLzB4RDQKK0Rlc2NyaXB0aW9uCisJU2V0cyBzdHJlYW0gY29weXJpZ2h0IHByb3BlcnR5CitQYXJhbVswXQorCTA9U3RyZWFtIGlzIG5vdCBjb3B5cmlnaHRlZAorCTE9U3RyZWFtIGlzIGNvcHlyaWdodGVkCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTmFtZSAJQ1gyMzQxWF9FTkNfU0VUX0VWRU5UX05PVElGSUNBVElPTgorRW51bSAJMjEzLzB4RDUKK0Rlc2NyaXB0aW9uCisJU2V0dXAgZmlybXdhcmUgdG8gbm90aWZ5IHRoZSBob3N0IGFib3V0IGEgcGFydGljdWxhciBldmVudC4gSG9zdCBtdXN0CisJdW5tYXNrIHRoZSBpbnRlcnJ1cHQgYml0LgorUGFyYW1bMF0KKwlFdmVudCAoMD1yZWZyZXNoIGVuY29kZXIgaW5wdXQpCitQYXJhbVsxXQorCU5vdGlmaWNhdGlvbiAwPWRpc2FibGVkIDE9ZW5hYmxlZAorUGFyYW1bMl0KKwlJbnRlcnJ1cHQgYml0CitQYXJhbVszXQorCU1haWxib3ggc2xvdCwgLTEgaWYgbm8gbWFpbGJveCByZXF1aXJlZC4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOYW1lIAlDWDIzNDFYX0VOQ19TRVRfTlVNX1ZTWU5DX0xJTkVTCitFbnVtIAkyMTQvMHhENgorRGVzY3JpcHRpb24KKwlEZXBlbmRpbmcgb24gdGhlIGFuYWxvZyB2aWRlbyBkZWNvZGVyIHVzZWQsIHRoaXMgYXNzaWducyB0aGUgbnVtYmVyCisJb2YgbGluZXMgZm9yIGZpZWxkIDEgYW5kIDIuCitQYXJhbVswXQorCUZpZWxkIDEgbnVtYmVyIG9mIGxpbmVzOgorCSAgICAweDAwRUYgZm9yIFNBQTcxMTQKKwkgICAgMHgwMEYwIGZvciBTQUE3MTE1CisJICAgIDB4MDEwNSBmb3IgTWljcm9uYXMKK1BhcmFtWzFdCisJRmllbGQgMiBudW1iZXIgb2YgbGluZXM6CisJICAgIDB4MDBFRiBmb3IgU0FBNzExNAorCSAgICAweDAwRjAgZm9yIFNBQTcxMTUKKwkgICAgMHgwMTA2IGZvciBNaWNyb25hcworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05hbWUgCUNYMjM0MVhfRU5DX1NFVF9QTEFDRUhPTERFUgorRW51bSAJMjE1LzB4RDcKK0Rlc2NyaXB0aW9uCisJUHJvdmlkZXMgYSBtZWNoYW5pc20gb2YgaW5zZXJ0aW5nIGN1c3RvbSB1c2VyIGRhdGEgaW4gdGhlIE1QRUcgc3RyZWFtLgorUGFyYW1bMF0KKwkwPWV4dGVuc2lvbiAmIHVzZXIgZGF0YQorCTE9cHJpdmF0ZSBwYWNrZXQgd2l0aCBzdHJlYW0gSUQgMHhCRAorUGFyYW1bMV0KKwlSYXRlIGF0IHdoaWNoIHRvIGluc2VydCBkYXRhLCBpbiB1bml0cyBvZiBmcmFtZXMgKGZvciBwcml2YXRlIHBhY2tldCkKKwlvciBHT1BzIChmb3IgZXh0LiAmIHVzZXIgZGF0YSkKK1BhcmFtWzJdCisJTnVtYmVyIG9mIGRhdGEgRFdPUkRzIChiZWxvdykgdG8gaW5zZXJ0CitQYXJhbVszXQorCUN1c3RvbSBkYXRhIDAKK1BhcmFtWzRdCisJQ3VzdG9tIGRhdGEgMQorUGFyYW1bNV0KKwlDdXN0b20gZGF0YSAyCitQYXJhbVs2XQorCUN1c3RvbSBkYXRhIDMKK1BhcmFtWzddCisJQ3VzdG9tIGRhdGEgNAorUGFyYW1bOF0KKwlDdXN0b20gZGF0YSA1CitQYXJhbVs5XQorCUN1c3RvbSBkYXRhIDYKK1BhcmFtWzEwXQorCUN1c3RvbSBkYXRhIDcKK1BhcmFtWzExXQorCUN1c3RvbSBkYXRhIDgKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOYW1lIAlDWDIzNDFYX0VOQ19NVVRFX1ZJREVPCitFbnVtIAkyMTcvMHhEOQorRGVzY3JpcHRpb24KKwlWaWRlbyBtdXRpbmcKK1BhcmFtWzBdCisJQml0IHVzYWdlOgorCSAwICAgIAknMCc9dmlkZW8gbm90IG11dGVkCisJCScxJz12aWRlbyBtdXRlZCwgY3JlYXRlcyBmcmFtZXMgd2l0aCB0aGUgWVVWIGNvbG9yIGRlZmluZWQgYmVsb3cKKwkgMTo3ICAJVW51c2VkCisJIDg6MTUgCVYgY2hyb21pbmFuY2UgaW5mb3JtYXRpb24KKwkxNjoyMyAJVSBjaHJvbWluYW5jZSBpbmZvcm1hdGlvbgorCTI0OjMxIAlZIGx1bWluYW5jZSBpbmZvcm1hdGlvbgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05hbWUgCUNYMjM0MVhfRU5DX01VVEVfQVVESU8KK0VudW0gCTIxOC8weERBCitEZXNjcmlwdGlvbgorCUF1ZGlvIG11dGluZworUGFyYW1bMF0KKwkwPWF1ZGlvIG5vdCBtdXRlZAorCTE9YXVkaW8gbXV0ZWQgKHByb2R1Y2VzIHNpbGVudCBtcGVnIGF1ZGlvIHN0cmVhbSkKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOYW1lIAlDWDIzNDFYX0VOQ19VTktOT1dOCitFbnVtIAkyMTkvMHhEQgorRGVzY3JpcHRpb24KKwlVbmtub3duIEFQSSwgaXQncyB1c2VkIGJ5IEhhdXBwYXVnZSB0aG91Z2guCitQYXJhbVswXQorCTAgVGhpcyBpcyB0aGUgdmFsdWUgSGF1cHBhdWdlIHVzZXMsIFVua25vd24gd2hhdCBpdCBtZWFucy4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOYW1lIAlDWDIzNDFYX0VOQ19NSVNDCitFbnVtIAkyMjAvMHhEQworRGVzY3JpcHRpb24KKwlNaXNjZWxsYW5lb3VzIGFjdGlvbnMuIE5vdCBrbm93biBmb3IgMTAwJSB3aGF0IGl0IGRvZXMuIEl0J3MgcmVhbGx5IGEKKwlzb3J0IG9mIGlvY3RsIGNhbGwuIFRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgYSBjb21tYW5kIG51bWJlciwgdGhlIHNlY29uZAorCXRoZSB2YWx1ZS4KK1BhcmFtWzBdCisJQ29tbWFuZCBudW1iZXI6CisJIDE9c2V0IGluaXRpYWwgU0NSIHZhbHVlIHdoZW4gc3RhcnRpbmcgZW5jb2RpbmcuCisJIDI9c2V0IHF1YWxpdHkgbW9kZSAoYXBwYXJlbnRseSBzb21lIHRlc3Qgc2V0dGluZykuCisJIDM9c2V0dXAgYWR2YW5jZWQgVklNIHByb3RlY3Rpb24gaGFuZGxpbmcgKHN1cHBvc2VkbHkgb25seSBmb3IgdGhlIGN4MjM0MTYKKwkgICBmb3IgcmF3IFlVVikuCisJICAgQWN0dWFsbHkgaXQgbG9va3MgbGlrZSB0aGlzIHNob3VsZCBiZSAwIGZvciBzYWE3MTE0LzUgYmFzZWQgY2FyZCBhbmQgMQorCSAgIGZvciBjeDI1ODQwIGJhc2VkIGNhcmRzLgorCSA0PWdlbmVyYXRlIGFydGlmaWNpYWwgUFRTIHRpbWVzdGFtcHMKKwkgNT1VU0IgZmx1c2ggbW9kZQorCSA2PXNvbWV0aGluZyB0byBkbyB3aXRoIHRoZSBxdWFudGl6YXRpb24gbWF0cml4CisJIDc9c2V0IG5hdmlnYXRpb24gcGFjayBpbnNlcnRpb24gZm9yIERWRAorCSA4PWVuYWJsZSBzY2VuZSBjaGFuZ2UgZGV0ZWN0aW9uIChzZWVtcyB0byBiZSBhIGZhaWx1cmUpCisJIDk9c2V0IGhpc3RvcnkgcGFyYW1ldGVycyBvZiB0aGUgdmlkZW8gaW5wdXQgbW9kdWxlCisJMTA9c2V0IGlucHV0IGZpZWxkIG9yZGVyIG9mIFZJTQorCTExPXNldCBxdWFudGl6YXRpb24gbWF0cml4CisJMTI9cmVzZXQgYXVkaW8gaW50ZXJmYWNlCisJMTM9c2V0IGF1ZGlvIHZvbHVtZSBkZWxheQorCTE0PXNldCBhdWRpbyBkZWxheQorCitQYXJhbVsxXQorCUNvbW1hbmQgdmFsdWUuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L2N4MjM0MXgvZnctbWVtb3J5LnR4dCBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvY3gyMzQxeC9mdy1tZW1vcnkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMGFhZDMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L2N4MjM0MXgvZnctbWVtb3J5LnR4dApAQCAtMCwwICsxLDE0MSBAQAorVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIGN4MjM0MXggbWVtb3J5IG1hcCBhbmQgZG9jdW1lbnRzIHNvbWUgb2YgdGhlIHJlZ2lzdGVyCitzcGFjZS4KKworV2FybmluZyEgVGhpcyBpbmZvcm1hdGlvbiB3YXMgZmlndXJlZCBvdXQgZnJvbSBzZWFyY2hpbmcgdGhyb3VnaCB0aGUgbWVtb3J5IGFuZAorcmVnaXN0ZXJzLCB0aGlzIGluZm9ybWF0aW9uIG1heSBub3QgYmUgY29ycmVjdCBhbmQgaXMgY2VydGFpbmx5IG5vdCBjb21wbGV0ZSwgYW5kCit3YXMgbm90IGRlcml2ZWQgZnJvbSBhbnl0aGluZyBtb3JlIHRoYW4gc2VhcmNoaW5nIHRocm91Z2ggdGhlIG1lbW9yeSBzcGFjZSB3aXRoCitjb21tYW5kcyBsaWtlOgorCisJaXZ0dmN0bCAtTyBtaW49MHgwMjAwMDAwMCxtYXg9MHgwMjAwMDBmZgorCitTbyB0YWtlIHRoaXMgYXMgaXMsIEknbSBhbHdheXMgc2VhcmNoaW5nIGZvciBtb3JlIHN0dWZmLCBpdCdzIGEgbGFyZ2UKK3JlZ2lzdGVyIHNwYWNlIDotKS4KKworTWVtb3J5IE1hcAorPT09PT09PT09PQorCitUaGUgY3gyMzQxeCBleHBvc2VzIGl0cyBlbnRpcmUgNjRNIG1lbW9yeSBzcGFjZSB0byB0aGUgUENJIGhvc3QgdmlhIHRoZSBQQ0kgQkFSMAorKEJhc2UgQWRkcmVzcyBSZWdpc3RlciAwKS4gVGhlIGFkZHJlc3NlcyBoZXJlIGFyZSBvZmZzZXRzIHJlbGF0aXZlIHRvIHRoZQorYWRkcmVzcyBoZWxkIGluIEJBUjAuCisKKzB4MDAwMDAwMDAtMHgwMGZmZmZmZiBFbmNvZGVyIG1lbW9yeSBzcGFjZQorMHgwMDAwMDAwMC0weDAwMDNmZmZmIEVuY29kZS5yb20KKyAgICAgID8/Py0/Pz8gICAgICAgICBNUEVHIGJ1ZmZlcihzKQorICAgICAgPz8/LT8/PyAgICAgICAgIFJhdyB2aWRlbyBjYXB0dXJlIGJ1ZmZlcihzKQorICAgICAgPz8/LT8/PyAgICAgICAgIFJhdyBhdWRpbyBjYXB0dXJlIGJ1ZmZlcihzKQorICAgICAgPz8/LT8/PyAgICAgICAgIERpc3BsYXkgYnVmZmVycyAoNiBvciA5KQorCisweDAxMDAwMDAwLTB4MDFmZmZmZmYgRGVjb2RlciBtZW1vcnkgc3BhY2UKKzB4MDEwMDAwMDAtMHgwMTAzZmZmZiBEZWNvZGUucm9tCisgICAgICA/Pz8tPz8/ICAgICAgICAgTVBFRyBidWZmZXJzKHMpCisweDAxMTRiMDAwLTB4MDExNWFmZmYgQXVkaW8ucm9tIChkZXByZWNhdGVkPykKKworMHgwMjAwMDAwMC0weDAyMDBmZmZmIFJlZ2lzdGVyIFNwYWNlCisKK1JlZ2lzdGVycworPT09PT09PT09CisKK1RoZSByZWdpc3RlcnMgb2NjdXB5IHRoZSA2NGsgc3BhY2Ugc3RhcnRpbmcgYXQgdGhlIDB4MDIwMDAwMDAgb2Zmc2V0IGZyb20gQkFSMC4KK0FsbCBvZiB0aGVzZSByZWdpc3RlcnMgYXJlIDMyIGJpdHMgd2lkZS4KKworRE1BIFJlZ2lzdGVycyAweDAwMC0weGZmOgorCisgMHgwMCAtIENvbnRyb2w6CisJMD1yZXNldC9jYW5jZWwsIDE9cmVhZCwgMj13cml0ZSwgND1zdG9wCisgMHgwNCAtIERNQSBzdGF0dXM6CisJMT1yZWFkIGJ1c3ksIDI9d3JpdGUgYnVzeSwgND1yZWFkIGVycm9yLCA4PXdyaXRlIGVycm9yLCAxNj1saW5rIGxpc3QgZXJyb3IKKyAweDA4IC0gcGNpIERNQSBwb2ludGVyIGZvciByZWFkIGxpbmsgbGlzdAorIDB4MGMgLSBwY2kgRE1BIHBvaW50ZXIgZm9yIHdyaXRlIGxpbmsgbGlzdAorIDB4MTAgLSByZWFkL3dyaXRlIERNQSBlbmFibGU6CisJMT1yZWFkIGVuYWJsZSwgMj13cml0ZSBlbmFibGUKKyAweDE0IC0gYWx3YXlzIDB4ZmZmZmZmZmYsIGlmIHNldCBhbnkgbG93ZXIgaW5zdGFiaWxpdHkgb2NjdXJzLCAweDAwIGNyYXNoZXMKKyAweDE4IC0gPz8KKyAweDFjIC0gYWx3YXlzIDB4MjAgb3IgMzIsIHNtYWxsZXIgdmFsdWVzIHNsb3cgZG93biBETUEgdHJhbnNhY3Rpb25zCisgMHgyMCAtIGFsd2F5cyB2YWx1ZSBvZiAweDc4MGEwMTBhCisgMHgyNC0weDNjIC0gdXN1YWxseSBqdXN0IHJhbmRvbSB2YWx1ZXM/Pz8KKyAweDQwIC0gSW50ZXJydXB0IHN0YXR1cworIDB4NDQgLSBXcml0ZSBhIGJpdCBoZXJlIGFuZCBzaG93cyB1cCBpbiBJbnRlcnJ1cHQgc3RhdHVzIDB4NDAKKyAweDQ4IC0gSW50ZXJydXB0IE1hc2sKKyAweDRDIC0gYWx3YXlzIHZhbHVlIG9mIDB4ZmZmZGZmZmYsCisJaWYgY2hhbmdlZCB0byAweGZmZmZmZmZmIERNQSB3cml0ZSBpbnRlcnJ1cHRzIGJyZWFrLgorIDB4NTAgLSBhbHdheXMgMHhmZmZmZmZmZgorIDB4NTQgLSBhbHdheXMgMHhmZmZmZmZmZiAoMHg0YywgMHg1MCwgMHg1NCBzZWVtIGxpa2UgaW50ZXJydXB0IG1hc2tzLCBhcmUKKwkzIHByb2Nlc3NvcnMgb24gY2hpcCwgSmF2YSBvbmVzLCBWUFUsIFNQVSwgQVBVLCBtYXliZSB0aGVzZSBhcmUgdGhlCisJaW50ZXJydXB0IG1hc2tzPz8/KS4KKyAweDYwLTB4N0MgLSByYW5kb20gdmFsdWVzCisgMHg4MCAtIGZpcnN0IHdyaXRlIGxpbmtlZCBsaXN0IHJlZywgZm9yIEVuY29kZXIgTWVtb3J5IGFkZHIKKyAweDg0IC0gZmlyc3Qgd3JpdGUgbGlua2VkIGxpc3QgcmVnLCBmb3IgcGNpIG1lbW9yeSBhZGRyCisgMHg4OCAtIGZpcnN0IHdyaXRlIGxpbmtlZCBsaXN0IHJlZywgZm9yIGxlbmd0aCBvZiBidWZmZXIgaW4gbWVtb3J5IGFkZHIKKwkofDB4ODAwMDAwMDAgb3IgdGhpcyBmb3IgbGFzdCBsaW5rKQorIDB4OGMtMHhjYyAtIHJlc3Qgb2Ygd3JpdGUgbGlua2VkIGxpc3QgcmVnLCA4IHNldHMgb2YgMyB0b3RhbCwgRE1BIGdvZXMgaGVyZQorCWZyb20gbGlua2VkIGxpc3QgYWRkciBpbiByZWcgMHgwYywgZmlybXdhcmUgbXVzdCBwdXNoIHRocm91Z2ggb3IKKwlzb21ldGhpbmcuCisgMHhlMCAtIGZpcnN0IChhbmQgb25seSkgcmVhZCBsaW5rZWQgbGlzdCByZWcsIGZvciBwY2kgbWVtb3J5IGFkZHIKKyAweGU0IC0gZmlyc3QgKGFuZCBvbmx5KSByZWFkIGxpbmtlZCBsaXN0IHJlZywgZm9yIERlY29kZXIgbWVtb3J5IGFkZHIKKyAweGU4IC0gZmlyc3QgKGFuZCBvbmx5KSByZWFkIGxpbmtlZCBsaXN0IHJlZywgZm9yIGxlbmd0aCBvZiBidWZmZXIKKyAweGVjLTB4ZmYgLSBOb3RoaW5nIHNlZW1zIHRvIGJlIGluIHRoZXNlIHJlZ2lzdGVycywgMHhlYy1mNCBhcmUgMHgwMDAwMDAwMC4KKworTWVtb3J5IGxvY2F0aW9ucyBmb3IgRW5jb2RlciBCdWZmZXJzIDB4NzAwLTB4N2ZmOgorCitUaGVzZSByZWdpc3RlcnMgc2hvdyBvZmZzZXRzIG9mIG1lbW9yeSBsb2NhdGlvbnMgcGVydGFpbmluZyB0byBlYWNoCitidWZmZXIgYXJlYSB1c2VkIGZvciBlbmNvZGluZywgaGF2ZSB0byBzaGlmdCB0aGVtIGJ5IDw8MSBmaXJzdC4KKworMHgwN0Y4OiBFbmNvZGVyIFNEUkFNIHJlZnJlc2gKKzB4MDdGQzogRW5jb2RlciBTRFJBTSBwcmUtY2hhcmdlCisKK01lbW9yeSBsb2NhdGlvbnMgZm9yIERlY29kZXIgQnVmZmVycyAweDgwMC0weDhmZjoKKworVGhlc2UgcmVnaXN0ZXJzIHNob3cgb2Zmc2V0cyBvZiBtZW1vcnkgbG9jYXRpb25zIHBlcnRhaW5pbmcgdG8gZWFjaAorYnVmZmVyIGFyZWEgdXNlZCBmb3IgZGVjb2RpbmcsIGhhdmUgdG8gc2hpZnQgdGhlbSBieSA8PDEgZmlyc3QuCisKKzB4MDhGODogRGVjb2RlciBTRFJBTSByZWZyZXNoCisweDA4RkM6IERlY29kZXIgU0RSQU0gcHJlLWNoYXJnZQorCitPdGhlciBtZW1vcnkgbG9jYXRpb25zOgorCisweDI4MDA6IFZpZGVvIERpc3BsYXkgTW9kdWxlIGNvbnRyb2wKKzB4MkQwMDogQU8gKGF1ZGlvIG91dHB1dD8pIGNvbnRyb2wKKzB4MkQyNDogQnl0ZXMgRmx1c2hlZAorMHg3MDAwOiBMU0IgSTJDIHdyaXRlIGNsb2NrIGJpdCAoaW52ZXJ0ZWQpCisweDcwMDQ6IExTQiBJMkMgd3JpdGUgZGF0YSBiaXQgKGludmVydGVkKQorMHg3MDA4OiBMU0IgSTJDIHJlYWQgY2xvY2sgYml0CisweDcwMGM6IExTQiBJMkMgcmVhZCBkYXRhIGJpdAorMHg5MDA4OiBHUElPIGdldCBpbnB1dCBzdGF0ZQorMHg5MDBjOiBHUElPIHNldCBvdXRwdXQgc3RhdGUKKzB4OTAyMDogR1BJTyBkaXJlY3Rpb24gKEJpdDcgKEdQSU8gMC4uNykgLSAwOmlucHV0LCAxOm91dHB1dCkKKzB4OTA1MDogU1BVIGNvbnRyb2wKKzB4OTA1NDogUmVzZXQgSFcgYmxvY2tzCisweDkwNTg6IFZQVSBjb250cm9sCisweEEwMTg6IEJpdDY6IGludGVycnVwdCBwZW5kaW5nPworMHhBMDY0OiBBUFUgY29tbWFuZAorCisKK0ludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIKKz09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhlIGRlZmluaXRpb24gb2YgdGhlIGJpdHMgaW4gdGhlIGludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXIgMHgwMDQwLCBhbmQgdGhlCitpbnRlcnJ1cHQgbWFzayAweDAwNDguIElmIGEgYml0IGlzIGNsZWFyZWQgaW4gdGhlIG1hc2ssIHRoZW4gd2Ugd2FudCBvdXIgSVNSIHRvCitleGVjdXRlLgorCitCaXQKKzMxIEVuY29kZXIgU3RhcnQgQ2FwdHVyZQorMzAgRW5jb2RlciBFT1MKKzI5IEVuY29kZXIgVkJJIGNhcHR1cmUKKzI4IEVuY29kZXIgVmlkZW8gSW5wdXQgTW9kdWxlIHJlc2V0IGV2ZW50CisyNyBFbmNvZGVyIERNQSBjb21wbGV0ZQorMjYKKzI1IERlY29kZXIgY29weSBwcm90ZWN0IGRldGVjdGlvbiBldmVudAorMjQgRGVjb2RlciBhdWRpbyBtb2RlIGNoYW5nZSBkZXRlY3Rpb24gZXZlbnQKKzIzCisyMiBEZWNvZGVyIGRhdGEgcmVxdWVzdAorMjEgRGVjb2RlciBJLUZyYW1lPyBkb25lCisyMCBEZWNvZGVyIERNQSBjb21wbGV0ZQorMTkgRGVjb2RlciBWQkkgcmUtaW5zZXJ0aW9uCisxOCBEZWNvZGVyIERNQSBlcnIgKGxpbmtlZC1saXN0IGJhZCkKKworTWlzc2luZworRW5jb2RlciBBUEkgY2FsbCBjb21wbGV0ZWQKK0RlY29kZXIgQVBJIGNhbGwgY29tcGxldGVkCitFbmNvZGVyIEFQSSBwb3N0KD8pCitEZWNvZGVyIEFQSSBwb3N0KD8pCitEZWNvZGVyIFZUUkFDRSBldmVudApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9jeDIzNDF4L2Z3LW9zZC1hcGkudHh0IGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9jeDIzNDF4L2Z3LW9zZC1hcGkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhOThhZTMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L2N4MjM0MXgvZnctb3NkLWFwaS50eHQKQEAgLTAsMCArMSwzNDIgQEAKK09TRCBmaXJtd2FyZSBBUEkgZGVzY3JpcHRpb24KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworTm90ZTogdGhpcyBBUEkgaXMgcGFydCBvZiB0aGUgZGVjb2RlciBmaXJtd2FyZSwgc28gaXQncyBjeDIzNDE1IG9ubHkuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTmFtZSAJQ1gyMzQxWF9PU0RfR0VUX0ZSQU1FQlVGRkVSCitFbnVtIAk2NS8weDQxCitEZXNjcmlwdGlvbgorCVJldHVybiBiYXNlIGFuZCBsZW5ndGggb2YgY29udGlndW91cyBPU0QgbWVtb3J5LgorUmVzdWx0WzBdCisJT1NEIGJhc2UgYWRkcmVzcworUmVzdWx0WzFdCisJT1NEIGxlbmd0aAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05hbWUgCUNYMjM0MVhfT1NEX0dFVF9QSVhFTF9GT1JNQVQKK0VudW0gCTY2LzB4NDIKK0Rlc2NyaXB0aW9uCisJUXVlcnkgT1NEIGZvcm1hdAorUmVzdWx0WzBdCisJMD04Yml0IGluZGV4LCA0PUFscGhhUkdCIDg6ODo4OjgKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOYW1lIAlDWDIzNDFYX09TRF9TRVRfUElYRUxfRk9STUFUCitFbnVtIAk2Ny8weDQzCitEZXNjcmlwdGlvbgorCUFzc2lnbiBwaXhlbCBmb3JtYXQKK1BhcmFtWzBdCisJMD04Yml0IGluZGV4LCA0PUFscGhhUkdCIDg6ODo4OjgKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOYW1lIAlDWDIzNDFYX09TRF9HRVRfU1RBVEUKK0VudW0gCTY4LzB4NDQKK0Rlc2NyaXB0aW9uCisJUXVlcnkgT1NEIHN0YXRlCitSZXN1bHRbMF0KKwlCaXQgIDAgICAwPW9mZiwgMT1vbgorCUJpdHMgMToyIGFscGhhIGNvbnRyb2wKKwlCaXRzIDM6NSBwaXhlbCBmb3JtYXQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOYW1lIAlDWDIzNDFYX09TRF9TRVRfU1RBVEUKK0VudW0gCTY5LzB4NDUKK0Rlc2NyaXB0aW9uCisJT1NEIHN3aXRjaAorUGFyYW1bMF0KKwkwPW9mZiwgMT1vbgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05hbWUgCUNYMjM0MVhfT1NEX0dFVF9PU0RfQ09PUkRTCitFbnVtIAk3MC8weDQ2CitEZXNjcmlwdGlvbgorCVJldHJpZXZlIGNvb3JkaW5hdGVzIG9mIE9TRCBhcmVhIGJsZW5kZWQgd2l0aCB2aWRlbworUmVzdWx0WzBdCisJT1NEIGJ1ZmZlciBhZGRyZXNzCitSZXN1bHRbMV0KKwlTdHJpZGUgaW4gcGl4ZWxzCitSZXN1bHRbMl0KKwlMaW5lcyBpbiBPU0QgYnVmZmVyCitSZXN1bHRbM10KKwlIb3Jpem9udGFsIG9mZnNldCBpbiBidWZmZXIKK1Jlc3VsdFs0XQorCVZlcnRpY2FsIG9mZnNldCBpbiBidWZmZXIKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOYW1lIAlDWDIzNDFYX09TRF9TRVRfT1NEX0NPT1JEUworRW51bSAJNzEvMHg0NworRGVzY3JpcHRpb24KKwlBc3NpZ24gdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBPU0QgYXJlYSB0byBibGVuZCB3aXRoIHZpZGVvCitQYXJhbVswXQorCWJ1ZmZlciBhZGRyZXNzCitQYXJhbVsxXQorCWJ1ZmZlciBzdHJpZGUgaW4gcGl4ZWxzCitQYXJhbVsyXQorCWxpbmVzIGluIGJ1ZmZlcgorUGFyYW1bM10KKwlob3Jpem9udGFsIG9mZnNldAorUGFyYW1bNF0KKwl2ZXJ0aWNhbCBvZmZzZXQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOYW1lIAlDWDIzNDFYX09TRF9HRVRfU0NSRUVOX0NPT1JEUworRW51bSAJNzIvMHg0OAorRGVzY3JpcHRpb24KKwlSZXRyaWV2ZSBPU0Qgc2NyZWVuIGFyZWEgY29vcmRpbmF0ZXMKK1Jlc3VsdFswXQorCXRvcCBsZWZ0IGhvcml6b250YWwgb2Zmc2V0CitSZXN1bHRbMV0KKwl0b3AgbGVmdCB2ZXJ0aWNhbCBvZmZzZXQKK1Jlc3VsdFsyXQorCWJvdHRvbSByaWdodCBob3Rpem9udGFsIG9mZnNldAorUmVzdWx0WzNdCisJYm90dG9tIHJpZ2h0IHZlcnRpY2FsIG9mZnNldAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05hbWUgCUNYMjM0MVhfT1NEX1NFVF9TQ1JFRU5fQ09PUkRTCitFbnVtIAk3My8weDQ5CitEZXNjcmlwdGlvbgorCUFzc2lnbiB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIHNjcmVlbiBhcmVhIHRvIGJsZW5kIHdpdGggdmlkZW8KK1BhcmFtWzBdCisJdG9wIGxlZnQgaG9yaXpvbnRhbCBvZmZzZXQKK1BhcmFtWzFdCisJdG9wIGxlZnQgdmVydGljYWwgb2Zmc2V0CitQYXJhbVsyXQorCWJvdHRvbSBsZWZ0IGhvcml6b250YWwgb2Zmc2V0CitQYXJhbVszXQorCWJvdHRvbSBsZWZ0IHZlcnRpY2FsIG9mZnNldAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05hbWUgCUNYMjM0MVhfT1NEX0dFVF9HTE9CQUxfQUxQSEEKK0VudW0gCTc0LzB4NEEKK0Rlc2NyaXB0aW9uCisJUmV0cmlldmUgT1NEIGdsb2JhbCBhbHBoYQorUmVzdWx0WzBdCisJZ2xvYmFsIGFscGhhOiAwPW9mZiwgMT1vbgorUmVzdWx0WzFdCisJYml0cyAwOjcgZ2xvYmFsIGFscGhhCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTmFtZSAJQ1gyMzQxWF9PU0RfU0VUX0dMT0JBTF9BTFBIQQorRW51bSAJNzUvMHg0QgorRGVzY3JpcHRpb24KKwlVcGRhdGUgZ2xvYmFsIGFscGhhCitQYXJhbVswXQorCWdsb2JhbCBhbHBoYTogMD1vZmYsIDE9b24KK1BhcmFtWzFdCisJZ2xvYmFsIGFscGhhICg4IGJpdHMpCitQYXJhbVsyXQorCWxvY2FsIGFscGhhOiAwPW9uLCAxPW9mZgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05hbWUgCUNYMjM0MVhfT1NEX1NFVF9CTEVORF9DT09SRFMKK0VudW0gCTc4LzB4NEMKK0Rlc2NyaXB0aW9uCisJTW92ZSBzdGFydCBvZiBibGVuZGluZyBhcmVhIHdpdGhpbiBkaXNwbGF5IGJ1ZmZlcgorUGFyYW1bMF0KKwlob3Jpem9udGFsIG9mZnNldCBpbiBidWZmZXIKK1BhcmFtWzFdCisJdmVydGljYWwgb2Zmc2V0IGluIGJ1ZmZlcgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05hbWUgCUNYMjM0MVhfT1NEX0dFVF9GTElDS0VSX1NUQVRFCitFbnVtIAk3OS8weDRGCitEZXNjcmlwdGlvbgorCVJldHJpZXZlIGZsaWNrZXIgcmVkdWN0aW9uIG1vZHVsZSBzdGF0ZQorUmVzdWx0WzBdCisJZmxpY2tlciBzdGF0ZTogMD1vZmYsIDE9b24KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOYW1lIAlDWDIzNDFYX09TRF9TRVRfRkxJQ0tFUl9TVEFURQorRW51bSAJODAvMHg1MAorRGVzY3JpcHRpb24KKwlTZXQgZmxpY2tlciByZWR1Y3Rpb24gbW9kdWxlIHN0YXRlCitQYXJhbVswXQorCVN0YXRlOiAwPW9mZiwgMT1vbgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05hbWUgCUNYMjM0MVhfT1NEX0JMVF9DT1BZCitFbnVtIAk4Mi8weDUyCitEZXNjcmlwdGlvbgorCUJMVCBjb3B5CitQYXJhbVswXQorJzAwMDAnICB6ZXJvCisnMDAwMScgfmRlc3RpbmF0aW9uIEFORCB+c291cmNlCisnMDAxMCcgfmRlc3RpbmF0aW9uIEFORCAgc291cmNlCisnMDAxMScgfmRlc3RpbmF0aW9uCisnMDEwMCcgIGRlc3RpbmF0aW9uIEFORCB+c291cmNlCisnMDEwMScgICAgICAgICAgICAgICAgICB+c291cmNlCisnMDExMCcgIGRlc3RpbmF0aW9uIFhPUiAgc291cmNlCisnMDExMScgfmRlc3RpbmF0aW9uIE9SICB+c291cmNlCisnMTAwMCcgfmRlc3RpbmF0aW9uIEFORCB+c291cmNlCisnMTAwMScgIGRlc3RpbmF0aW9uIFhOT1Igc291cmNlCisnMTAxMCcgICAgICAgICAgICAgICAgICAgc291cmNlCisnMTAxMScgfmRlc3RpbmF0aW9uIE9SICAgc291cmNlCisnMTEwMCcgIGRlc3RpbmF0aW9uCisnMTEwMScgIGRlc3RpbmF0aW9uIE9SICB+c291cmNlCisnMTExMCcgIGRlc3RpbmF0aW9uIE9SICAgc291cmNlCisnMTExMScgIG9uZQorCitQYXJhbVsxXQorCVJlc3VsdGluZyBhbHBoYSBibGVuZGluZworCSAgICAnMDEnIHNvdXJjZV9hbHBoYQorCSAgICAnMTAnIGRlc3RpbmF0aW9uX2FscGhhCisJICAgICcxMScgc291cmNlX2FscGhhKmRlc3RpbmF0aW9uX2FscGhhKzEKKwkJICh6ZXJvIGlmIGJvdGggc291cmNlIGFuZCBkZXN0aW5hdGlvbiBhbHBoYSBhcmUgemVybykKK1BhcmFtWzJdCisJJzAwJyBvdXRwdXRfcGl4ZWwgPSBzb3VyY2VfcGl4ZWwKKworCScwMScgaWYgc291cmNlX2FscGhhPTA6CisJCSBvdXRwdXRfcGl4ZWwgPSBkZXN0aW5hdGlvbl9waXhlbAorCSAgICAgaWYgMjU2ID4gc291cmNlX2FscGhhID4gMToKKwkJIG91dHB1dF9waXhlbCA9ICgoc291cmNlX2FscGhhICsgMSkqc291cmNlX3BpeGVsICsKKwkJCQkgKDI1NSAtIHNvdXJjZV9hbHBoYSkqZGVzdGluYXRpb25fcGl4ZWwpLzI1NgorCisJJzEwJyBpZiBkZXN0aW5hdGlvbl9hbHBoYT0wOgorCQkgb3V0cHV0X3BpeGVsID0gc291cmNlX3BpeGVsCisJICAgICAgaWYgMjU1ID4gZGVzdGluYXRpb25fYWxwaGEgPiAwOgorCQkgb3V0cHV0X3BpeGVsID0gKCgyNTUgLSBkZXN0aW5hdGlvbl9hbHBoYSkqc291cmNlX3BpeGVsICsKKwkJCQkgKGRlc3RpbmF0aW9uX2FscGhhICsgMSkqZGVzdGluYXRpb25fcGl4ZWwpLzI1NgorCisJJzExJyBpZiBzb3VyY2VfYWxwaGE9MDoKKwkJIHNvdXJjZV90ZW1wID0gMAorCSAgICAgaWYgc291cmNlX2FscGhhPTI1NToKKwkJIHNvdXJjZV90ZW1wID0gc291cmNlX3BpeGVsKjI1NgorCSAgICAgaWYgMjU1ID4gc291cmNlX2FscGhhID4gMDoKKwkJIHNvdXJjZV90ZW1wID0gc291cmNlX3BpeGVsKihzb3VyY2VfYWxwaGEgKyAxKQorCSAgICAgaWYgZGVzdGluYXRpb25fYWxwaGE9MDoKKwkJIGRlc3RpbmF0aW9uX3RlbXAgPSAwCisJICAgICBpZiBkZXN0aW5hdGlvbl9hbHBoYT0yNTU6CisJCSBkZXN0aW5hdGlvbl90ZW1wID0gZGVzdGluYXRpb25fcGl4ZWwqMjU2CisJICAgICBpZiAyNTUgPiBkZXN0aW5hdGlvbl9hbHBoYSA+IDA6CisJCSBkZXN0aW5hdGlvbl90ZW1wID0gZGVzdGluYXRpb25fcGl4ZWwqKGRlc3RpbmF0aW9uX2FscGhhICsgMSkKKwkgICAgIG91dHB1dF9waXhlbCA9IChzb3VyY2VfdGVtcCArIGRlc3RpbmF0aW9uX3RlbXApLzI1NgorUGFyYW1bM10KKwl3aWR0aAorUGFyYW1bNF0KKwloZWlnaHQKK1BhcmFtWzVdCisJZGVzdGluYXRpb24gcGl4ZWwgbWFzaworUGFyYW1bNl0KKwlkZXN0aW5hdGlvbiByZWN0YW5nbGUgc3RhcnQgYWRkcmVzcworUGFyYW1bN10KKwlkZXN0aW5hdGlvbiBzdHJpZGUgaW4gZHdvcmRzCitQYXJhbVs4XQorCXNvdXJjZSBzdHJpZGUgaW4gZHdvcmRzCitQYXJhbVs5XQorCXNvdXJjZSByZWN0YW5nbGUgc3RhcnQgYWRkcmVzcworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05hbWUgCUNYMjM0MVhfT1NEX0JMVF9GSUxMCitFbnVtIAk4My8weDUzCitEZXNjcmlwdGlvbgorCUJMVCBmaWxsIGNvbG9yCitQYXJhbVswXQorCVNhbWUgYXMgUGFyYW1bMF0gb24gQVBJIDB4NTIKK1BhcmFtWzFdCisJU2FtZSBhcyBQYXJhbVsxXSBvbiBBUEkgMHg1MgorUGFyYW1bMl0KKwlTYW1lIGFzIFBhcmFtWzJdIG9uIEFQSSAweDUyCitQYXJhbVszXQorCXdpZHRoCitQYXJhbVs0XQorCWhlaWdodAorUGFyYW1bNV0KKwlkZXN0aW5hdGlvbiBwaXhlbCBtYXNrCitQYXJhbVs2XQorCWRlc3RpbmF0aW9uIHJlY3RhbmdsZSBzdGFydCBhZGRyZXNzCitQYXJhbVs3XQorCWRlc3RpbmF0aW9uIHN0cmlkZSBpbiBkd29yZHMKK1BhcmFtWzhdCisJY29sb3IgZmlsbCB2YWx1ZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05hbWUgCUNYMjM0MVhfT1NEX0JMVF9URVhUCitFbnVtIAk4NC8weDU0CitEZXNjcmlwdGlvbgorCUJMVCBmb3IgOCBiaXQgYWxwaGEgdGV4dCBzb3VyY2UKK1BhcmFtWzBdCisJU2FtZSBhcyBQYXJhbVswXSBvbiBBUEkgMHg1MgorUGFyYW1bMV0KKwlTYW1lIGFzIFBhcmFtWzFdIG9uIEFQSSAweDUyCitQYXJhbVsyXQorCVNhbWUgYXMgUGFyYW1bMl0gb24gQVBJIDB4NTIKK1BhcmFtWzNdCisJd2lkdGgKK1BhcmFtWzRdCisJaGVpZ2h0CitQYXJhbVs1XQorCWRlc3RpbmF0aW9uIHBpeGVsIG1hc2sKK1BhcmFtWzZdCisJZGVzdGluYXRpb24gcmVjdGFuZ2xlIHN0YXJ0IGFkZHJlc3MKK1BhcmFtWzddCisJZGVzdGluYXRpb24gc3RyaWRlIGluIGR3b3JkcworUGFyYW1bOF0KKwlzb3VyY2Ugc3RyaWRlIGluIGR3b3JkcworUGFyYW1bOV0KKwlzb3VyY2UgcmVjdGFuZ2xlIHN0YXJ0IGFkZHJlc3MKK1BhcmFtWzEwXQorCWNvbG9yIGZpbGwgdmFsdWUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOYW1lIAlDWDIzNDFYX09TRF9TRVRfRlJBTUVCVUZGRVJfV0lORE9XCitFbnVtIAk4Ni8weDU2CitEZXNjcmlwdGlvbgorCVBvc2l0aW9ucyB0aGUgbWFpbiBvdXRwdXQgd2luZG93IG9uIHRoZSBzY3JlZW4uIFRoZSBjb29yZGluYXRlcyBtdXN0IGJlCisJc3VjaCB0aGF0IHRoZSBlbnRpcmUgd2luZG93IGZpdHMgb24gdGhlIHNjcmVlbi4KK1BhcmFtWzBdCisJd2luZG93IHdpZHRoCitQYXJhbVsxXQorCXdpbmRvdyBoZWlnaHQKK1BhcmFtWzJdCisJdG9wIGxlZnQgd2luZG93IGNvcm5lciBob3Jpem9udGFsIG9mZnNldAorUGFyYW1bM10KKwl0b3AgbGVmdCB3aW5kb3cgY29ybmVyIHZlcnRpY2FsIG9mZnNldAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05hbWUgCUNYMjM0MVhfT1NEX1NFVF9DSFJPTUFfS0VZCitFbnVtIAk5Ni8weDYwCitEZXNjcmlwdGlvbgorCUNocm9tYSBrZXkgc3dpdGNoIGFuZCBjb2xvcgorUGFyYW1bMF0KKwlzdGF0ZTogMD1vZmYsIDE9b24KK1BhcmFtWzFdCisJY29sb3IKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOYW1lIAlDWDIzNDFYX09TRF9HRVRfQUxQSEFfQ09OVEVOVF9JTkRFWAorRW51bSAJOTcvMHg2MQorRGVzY3JpcHRpb24KKwlSZXRyaWV2ZSBhbHBoYSBjb250ZW50IGluZGV4CitSZXN1bHRbMF0KKwlhbHBoYSBjb250ZW50IGluZGV4LCBSYW5nZSAwOjE1CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTmFtZSAJQ1gyMzQxWF9PU0RfU0VUX0FMUEhBX0NPTlRFTlRfSU5ERVgKK0VudW0gCTk4LzB4NjIKK0Rlc2NyaXB0aW9uCisJQXNzaWduIGFscGhhIGNvbnRlbnQgaW5kZXgKK1BhcmFtWzBdCisJYWxwaGEgY29udGVudCBpbmRleCwgcmFuZ2UgMDoxNQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9jeDIzNDF4L2Z3LXVwbG9hZC50eHQgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L2N4MjM0MXgvZnctdXBsb2FkLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGM1MDJjCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9jeDIzNDF4L2Z3LXVwbG9hZC50eHQKQEAgLTAsMCArMSw0OSBAQAorVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgaG93IHRvIHVwbG9hZCB0aGUgY3gyMzQxeCBmaXJtd2FyZSB0byB0aGUgY2FyZC4KKworSG93IHRvIGZpbmQKKz09PT09PT09PT09CisKK1NlZSB0aGUgd2ViIHBhZ2VzIG9mIHRoZSB2YXJpb3VzIHByb2plY3RzIHRoYXQgdXNlcyB0aGlzIGNoaXAgZm9yIGluZm9ybWF0aW9uCitvbiBob3cgdG8gb2J0YWluIHRoZSBmaXJtd2FyZS4KKworVGhlIGZpcm13YXJlIHN0b3JlZCBpbiBhIFdpbmRvd3MgZHJpdmVyIGNhbiBiZSBkZXRlY3RlZCBhcyBmb2xsb3dzOgorCistIEVhY2ggZmlybXdhcmUgaW1hZ2UgaXMgMjU2ayBieXRlcy4KKy0gVGhlIDFzdCAzMi1iaXQgd29yZCBvZiB0aGUgRW5jb2RlciBpbWFnZSBpcyAweDAwMDBkYTcKKy0gVGhlIDFzdCAzMi1iaXQgd29yZCBvZiB0aGUgRGVjb2RlciBpbWFnZSBpcyAweDAwMDAzYTcKKy0gVGhlIDJuZCAzMi1iaXQgd29yZCBvZiBib3RoIGltYWdlcyBpcyAweGFhNTViYjY2CisKK0hvdyB0byBsb2FkCis9PT09PT09PT09PQorCistIElzc3VlIHRoZSBGV2FwaSBjb21tYW5kIHRvIHN0b3AgdGhlIGVuY29kZXIgaWYgaXQgaXMgcnVubmluZy4gV2FpdCBmb3IgdGhlCisgIGNvbW1hbmQgdG8gY29tcGxldGUuCistIElzc3VlIHRoZSBGV2FwaSBjb21tYW5kIHRvIHN0b3AgdGhlIGRlY29kZXIgaWYgaXQgaXMgcnVubmluZy4gV2FpdCBmb3IgdGhlCisgIGNvbW1hbmQgdG8gY29tcGxldGUuCistIElzc3VlIHRoZSBJMkMgY29tbWFuZCB0byB0aGUgZGlnaXRpemVyIHRvIHN0b3AgZW1pdHRpbmcgVlNZTkMgZXZlbnRzLgorLSBJc3N1ZSB0aGUgRldhcGkgY29tbWFuZCB0byBoYWx0IHRoZSBlbmNvZGVyJ3MgZmlybXdhcmUuCistIFNsZWVwIGZvciAxMG1zLgorLSBJc3N1ZSB0aGUgRldhcGkgY29tbWFuZCB0byBoYWx0IHRoZSBkZWNvZGVyJ3MgZmlybXdhcmUuCistIFNsZWVwIGZvciAxMG1zLgorLSBXcml0ZSAweDAwMDAwMDAwIHRvIHJlZ2lzdGVyIDB4MjgwMCB0byBzdG9wIHRoZSBWaWRlbyBEaXNwbGF5IE1vZHVsZS4KKy0gV3JpdGUgMHgwMDAwMDAwNSB0byByZWdpc3RlciAweDJEMDAgdG8gc3RvcCB0aGUgQU8gKGF1ZGlvIG91dHB1dD8pLgorLSBXcml0ZSAweDAwMDAwMDAwIHRvIHJlZ2lzdGVyIDB4QTA2NCB0byBwaW5nPyB0aGUgQVBVLgorLSBXcml0ZSAweEZGRkZGRkZFIHRvIHJlZ2lzdGVyIDB4OTA1OCB0byBzdG9wIHRoZSBWUFUuCistIFdyaXRlIDB4RkZGRkZGRkYgdG8gcmVnaXN0ZXIgMHg5MDU0IHRvIHJlc2V0IHRoZSBIVyBibG9ja3MuCistIFdyaXRlIDB4MDAwMDAwMDEgdG8gcmVnaXN0ZXIgMHg5MDUwIHRvIHN0b3AgdGhlIFNQVS4KKy0gU2xlZXAgZm9yIDEwbXMuCistIFdyaXRlIDB4MDAwMDAwMUEgdG8gcmVnaXN0ZXIgMHgwN0ZDIHRvIGluaXQgdGhlIEVuY29kZXIgU0RSQU0ncyBwcmUtY2hhcmdlLgorLSBXcml0ZSAweDgwMDAwNjQwIHRvIHJlZ2lzdGVyIDB4MDdGOCB0byBpbml0IHRoZSBFbmNvZGVyIFNEUkFNJ3MgcmVmcmVzaCB0byAxdXMuCistIFdyaXRlIDB4MDAwMDAwMUEgdG8gcmVnaXN0ZXIgMHgwOEZDIHRvIGluaXQgdGhlIERlY29kZXIgU0RSQU0ncyBwcmUtY2hhcmdlLgorLSBXcml0ZSAweDgwMDAwNjQwIHRvIHJlZ2lzdGVyIDB4MDhGOCB0byBpbml0IHRoZSBEZWNvZGVyIFNEUkFNJ3MgcmVmcmVzaCB0byAxdXMuCistIFNsZWVwIGZvciA1MTJtcy4gKDYwMG1zIGlzIHJlY29tbWVuZGVkKQorLSBUcmFuc2ZlciB0aGUgZW5jb2RlcidzIGZpcm13YXJlIGltYWdlIHRvIG9mZnNldCAwIGluIEVuY29kZXIgbWVtb3J5IHNwYWNlLgorLSBUcmFuc2ZlciB0aGUgZGVjb2RlcidzIGZpcm13YXJlIGltYWdlIHRvIG9mZnNldCAwIGluIERlY29kZXIgbWVtb3J5IHNwYWNlLgorLSBVc2UgYSByZWFkLW1vZGlmeS13cml0ZSBvcGVyYXRpb24gdG8gQ2xlYXIgYml0IDAgb2YgcmVnaXN0ZXIgMHg5MDUwIHRvCisgIHJlLWVuYWJsZSB0aGUgU1BVLgorLSBTbGVlcCBmb3IgMSBzZWNvbmQuCistIFVzZSBhIHJlYWQtbW9kaWZ5LXdyaXRlIG9wZXJhdGlvbiB0byBDbGVhciBiaXRzIDMgYW5kIDAgb2YgcmVnaXN0ZXIgMHg5MDU4CisgIHRvIHJlLWVuYWJsZSB0aGUgVlBVLgorLSBTbGVlcCBmb3IgMSBzZWNvbmQuCistIElzc3VlIHN0YXR1cyBBUEkgY29tbWFuZHMgdG8gYm90aCBmaXJtd2FyZSBpbWFnZXMgdG8gdmVyaWZ5LgorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L2N4ODgvaGF1cHBhdWdlLXdpbnR2LWN4ODgtaXIudHh0IGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9jeDg4L2hhdXBwYXVnZS13aW50di1jeDg4LWlyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2ZlYzMyCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9jeDg4L2hhdXBwYXVnZS13aW50di1jeDg4LWlyLnR4dApAQCAtMCwwICsxLDU0IEBACitUaGUgY29udHJvbHMgZm9yIHRoZSBtdXggYXJlIEdQSU8gWzAsMV0gZm9yIHNvdXJjZSwgYW5kIEdQSU8gMiBmb3IgbXV0aW5nLgorCitHUElPMCAgR1BJTzEKKyAgMCAgICAgICAgMCAgICBUViBBdWRpbworICAxICAgICAgICAwICAgIEZNIHJhZGlvCisgIDAgICAgICAgIDEgICAgTGluZS1JbgorICAxICAgICAgICAxICAgIE1vbm8gdHVuZXIgYnlwYXNzIG9yIENEIHBhc3N0aHJ1ICh0dW5lciBzcGVjaWZpYykKKworR1BJTyAxNihpIGJlbGlldmUpIGlzIHRpZWQgdG8gdGhlIElSIHBvcnQgKGlmIHByZXNlbnQpLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworPkZyb20gdGhlIGRhdGEgc2hlZXQ6CisgUmVnaXN0ZXIgMjQnaDIwMDA0ICBQQ0kgSW50ZXJydXB0IFN0YXR1cworICBiaXQgWzE4XSAgSVJfU01QX0lOVCBTZXQgd2hlbiAzMiBpbnB1dCBzYW1wbGVzIGhhdmUgYmVlbiBjb2xsZWN0ZWQgb3ZlcgorICBncGlvWzE2XSBwaW4gaW50byBHUF9TQU1QTEUgcmVnaXN0ZXIuCisKK1doYXQncyBtaXNzaW5nIGZyb20gdGhlIGRhdGEgc2hlZXQ6CisKK1NldHVwIDRLSHogc2FtcGxpbmcgcmF0ZSAocm91Z2hseSAyeCBvdmVyc2FtcGxlZDsgZ29vZCBlbm91Z2ggZm9yIG91ciBSQzUKK2NvbXBhdCByZW1vdGUpCitzZXQgcmVnaXN0ZXIgMHgzNUMwNTAgdG8gIDB4YTgwYTgwCisKK2VuYWJsZSBzYW1wbGluZworc2V0IHJlZ2lzdGVyIDB4MzVDMDU0IHRvIDB4NQorCitPZiBjb3Vyc2UsIGVuYWJsZSB0aGUgSVJRIGJpdCAxOCBpbiB0aGUgaW50ZXJydXB0IG1hc2sgcmVnaXN0ZXIgLihhbmQKK3Byb3ZpZGUgZm9yIGEgaGFuZGxlcikKKworR1BfU0FNUExFIHJlZ2lzdGVyIGlzIGF0IDB4MzVDMDU4CisKK0JpdHMgYXJlIHRoZW4gcmlnaHQgc2hpZnRlZCBpbnRvIHRoZSBHUF9TQU1QTEUgcmVnaXN0ZXIgYXQgdGhlIHNwZWNpZmllZAorcmF0ZTsgeW91IGdldCBhbiBpbnRlcnJ1cHQgd2hlbiBhIGZ1bGwgRFdPUkQgaXMgcmVjaWV2ZWQuCitZb3UgbmVlZCB0byByZWNvdmVyIHRoZSBhY3R1YWwgUkM1IGJpdHMgb3V0IG9mIHRoZSAob3ZlcnNhbXBsZWQpIElSIHNlbnNvcgorYml0cy4gKEhpbnQ6IGxvb2sgZm9yIHRoZSAwLzFhbmQgMS8wIGNyb3NzaW5ncyBvZiB0aGUgUkM1IGJpLXBoYXNlIGRhdGEpICBBbgorYWN0dWFsIHJhdyBSQzUgY29kZSB3aWxsIHNwYW4gMi0zIERXT1JEUywgZGVwZW5kaW5nIG9uIHRoZSBhY3R1YWwgYWxpZ25tZW50LgorCitJJ20gcHJldHR5IHN1cmUgd2hlbiBubyBJUiBzaWduYWwgaXMgcHJlc2VudCB0aGUgcmVjZWl2ZXIgaXMgYWx3YXlzIGluIGEKK21hcmtpbmcgc3RhdGUoMSk7IGJ1dCBzdHJheSBsaWdodCwgZXRjIGNhbiBjYXVzZSBpbnRlcm1pdHRlbnQgbm9pc2UgdmFsdWVzCithcyB3ZWxsLiAgUmVtZW1iZXIsIHRoaXMgaXMgYSBmcmVlIHJ1bm5pbmcgc2FtcGxlIG9mIHRoZSBJUiByZWNlaXZlciBzdGF0ZQorb3ZlciB0aW1lLCBzbyBkb24ndCBhc3N1bWUgYW55IHNhbXBsZSBzdGFydHMgYXQgYW55IHBhcnRpY3VsYXIgcGxhY2UuCisKK2h0dHA6Ly93d3cuYXRtZWwuY29tL2R5bi9yZXNvdXJjZXMvcHJvZF9kb2N1bWVudHMvZG9jMjgxNy5wZGYKK1RoaXMgZGF0YSBzaGVldCAoZ29vZ2xlIHNlYXJjaCkgc2VlbXMgdG8gaGF2ZSBhIGxvdmVseSBkZXNjcmlwdGlvbiBvZiB0aGUKK1JDNSBiYXNpY3MKKworaHR0cDovL3VzZXJzLnBhbmRvcmEuYmUvbmVueWEvZWxlY3Ryb25pY3MvcmM1LyAgYW5kIG1vcmUgZGF0YQorCitodHRwOi8vd3d3LmVlLndhc2hpbmd0b24uZWR1L2NpcmN1aXRfYXJjaGl2ZS90ZXh0L2lyX2RlY29kZS50eHQKK2FuZCBldmVuIGEgcmVmZXJlbmNlIHRvIGhvdyB0byBkZWNvZGUgYSBiaS1waGFzZSBkYXRhIHN0cmVhbS4KKworaHR0cDovL3d3dy54czRhbGwubmwvfnNicC9rbm93bGVkZ2UvaXIvcmM1Lmh0bQorc3RpbGwgbW9yZSBpbmZvCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvZXQ2MXgyNTEudHh0IGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9ldDYxeDI1MS50eHQKaW5kZXggMjkzNDAyOC4uY2Q1ODRmMiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9ldDYxeDI1MS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9ldDYxeDI1MS50eHQKQEAgLTEsOSArMSw5IEBACiAKLSAgICAgICAgICAgICAgICAgICAgICAgRVQ2MVhbMTJdNTEgUEMgQ2FtZXJhIENvbnRyb2xsZXJzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERyaXZlciBmb3IgTGludXgKLSAgICAgICAgICAgICAgICAgICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCSAgICAgICBFVDYxWFsxMl01MSBQQyBDYW1lcmEgQ29udHJvbGxlcnMKKwkJCQlEcml2ZXIgZm9yIExpbnV4CisJCSAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gRG9jdW1lbnRhdGlvbiAtCisJCQkgICAgICAgLSBEb2N1bWVudGF0aW9uIC0KIAogCiBJbmRleApAQCAtMTU2LDQ2ICsxNTYsNDYgQEAKIFR5cGU6ICAgICAgICAgICBzaG9ydCBhcnJheSAobWluID0gMCwgbWF4ID0gNjQpCiBTeW50YXg6ICAgICAgICAgPC0xfG5bLC4uLl0+CiBEZXNjcmlwdGlvbjogICAgU3BlY2lmeSBWNEwyIG1pbm9yIG1vZGUgbnVtYmVyOgotICAgICAgICAgICAgICAgIC0xID0gdXNlIG5leHQgYXZhaWxhYmxlCi0gICAgICAgICAgICAgICAgIG4gPSB1c2UgbWlub3IgbnVtYmVyIG4KLSAgICAgICAgICAgICAgICBZb3UgY2FuIHNwZWNpZnkgdXAgdG8gNjQgY2FtZXJhcyB0aGlzIHdheS4KLSAgICAgICAgICAgICAgICBGb3IgZXhhbXBsZToKLSAgICAgICAgICAgICAgICB2aWRlb19ucj0tMSwyLC0xIHdvdWxkIGFzc2lnbiBtaW5vciBudW1iZXIgMiB0byB0aGUgc2Vjb25kCi0gICAgICAgICAgICAgICAgcmVnaXN0ZXJlZCBjYW1lcmEgYW5kIHVzZSBhdXRvIGZvciB0aGUgZmlyc3Qgb25lIGFuZCBmb3IgZXZlcnkKLSAgICAgICAgICAgICAgICBvdGhlciBjYW1lcmEuCisJCS0xID0gdXNlIG5leHQgYXZhaWxhYmxlCisJCSBuID0gdXNlIG1pbm9yIG51bWJlciBuCisJCVlvdSBjYW4gc3BlY2lmeSB1cCB0byA2NCBjYW1lcmFzIHRoaXMgd2F5LgorCQlGb3IgZXhhbXBsZToKKwkJdmlkZW9fbnI9LTEsMiwtMSB3b3VsZCBhc3NpZ24gbWlub3IgbnVtYmVyIDIgdG8gdGhlIHNlY29uZAorCQlyZWdpc3RlcmVkIGNhbWVyYSBhbmQgdXNlIGF1dG8gZm9yIHRoZSBmaXJzdCBvbmUgYW5kIGZvciBldmVyeQorCQlvdGhlciBjYW1lcmEuCiBEZWZhdWx0OiAgICAgICAgLTEKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIE5hbWU6ICAgICAgICAgICBmb3JjZV9tdW5tYXAKIFR5cGU6ICAgICAgICAgICBib29sIGFycmF5IChtaW4gPSAwLCBtYXggPSA2NCkKIFN5bnRheDogICAgICAgICA8MHwxWywuLi5dPgogRGVzY3JpcHRpb246ICAgIEZvcmNlIHRoZSBhcHBsaWNhdGlvbiB0byB1bm1hcCBwcmV2aW91c2x5IG1hcHBlZCBidWZmZXIgbWVtb3J5Ci0gICAgICAgICAgICAgICAgYmVmb3JlIGNhbGxpbmcgYW55IFZJRElPQ19TX0NST1Agb3IgVklESU9DX1NfRk1UIGlvY3RsJ3MuIE5vdAotICAgICAgICAgICAgICAgIGFsbCB0aGUgYXBwbGljYXRpb25zIHN1cHBvcnQgdGhpcyBmZWF0dXJlLiBUaGlzIHBhcmFtZXRlciBpcwotICAgICAgICAgICAgICAgIHNwZWNpZmljIGZvciBlYWNoIGRldGVjdGVkIGNhbWVyYS4KLSAgICAgICAgICAgICAgICAwID0gZG8gbm90IGZvcmNlIG1lbW9yeSB1bm1hcHBpbmcKLSAgICAgICAgICAgICAgICAxID0gZm9yY2UgbWVtb3J5IHVubWFwcGluZyAoc2F2ZSBtZW1vcnkpCisJCWJlZm9yZSBjYWxsaW5nIGFueSBWSURJT0NfU19DUk9QIG9yIFZJRElPQ19TX0ZNVCBpb2N0bCdzLiBOb3QKKwkJYWxsIHRoZSBhcHBsaWNhdGlvbnMgc3VwcG9ydCB0aGlzIGZlYXR1cmUuIFRoaXMgcGFyYW1ldGVyIGlzCisJCXNwZWNpZmljIGZvciBlYWNoIGRldGVjdGVkIGNhbWVyYS4KKwkJMCA9IGRvIG5vdCBmb3JjZSBtZW1vcnkgdW5tYXBwaW5nCisJCTEgPSBmb3JjZSBtZW1vcnkgdW5tYXBwaW5nIChzYXZlIG1lbW9yeSkKIERlZmF1bHQ6ICAgICAgICAwCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBOYW1lOiAgICAgICAgICAgZnJhbWVfdGltZW91dAogVHlwZTogICAgICAgICAgIHVpbnQgYXJyYXkgKG1pbiA9IDAsIG1heCA9IDY0KQogU3ludGF4OiAgICAgICAgIDxuWywuLi5dPgogRGVzY3JpcHRpb246ICAgIFRpbWVvdXQgZm9yIGEgdmlkZW8gZnJhbWUgaW4gc2Vjb25kcy4gVGhpcyBwYXJhbWV0ZXIgaXMKLSAgICAgICAgICAgICAgICBzcGVjaWZpYyBmb3IgZWFjaCBkZXRlY3RlZCBjYW1lcmEuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZQotICAgICAgICAgICAgICAgIGNoYW5nZWQgYXQgcnVudGltZSB0aGFua3MgdG8gdGhlIC9zeXMgZmlsZXN5c3RlbSBpbnRlcmZhY2UuCisJCXNwZWNpZmljIGZvciBlYWNoIGRldGVjdGVkIGNhbWVyYS4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlCisJCWNoYW5nZWQgYXQgcnVudGltZSB0aGFua3MgdG8gdGhlIC9zeXMgZmlsZXN5c3RlbSBpbnRlcmZhY2UuCiBEZWZhdWx0OiAgICAgICAgMgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogTmFtZTogICAgICAgICAgIGRlYnVnCiBUeXBlOiAgICAgICAgICAgdXNob3J0CiBTeW50YXg6ICAgICAgICAgPG4+CiBEZXNjcmlwdGlvbjogICAgRGVidWdnaW5nIGluZm9ybWF0aW9uIGxldmVsLCBmcm9tIDAgdG8gMzoKLSAgICAgICAgICAgICAgICAwID0gbm9uZSAodXNlIGNhcmVmdWxseSkKLSAgICAgICAgICAgICAgICAxID0gY3JpdGljYWwgZXJyb3JzCi0gICAgICAgICAgICAgICAgMiA9IHNpZ25pZmljYW50IGluZm9ybWF0aW9ucwotICAgICAgICAgICAgICAgIDMgPSBtb3JlIHZlcmJvc2UgbWVzc2FnZXMKLSAgICAgICAgICAgICAgICBMZXZlbCAzIGlzIHVzZWZ1bCBmb3IgdGVzdGluZyBvbmx5LCB3aGVuIG9ubHkgb25lIGRldmljZQotICAgICAgICAgICAgICAgIGlzIHVzZWQgYXQgdGhlIHNhbWUgdGltZS4gSXQgYWxzbyBzaG93cyBzb21lIG1vcmUgaW5mb3JtYXRpb25zCi0gICAgICAgICAgICAgICAgYWJvdXQgdGhlIGhhcmR3YXJlIGJlaW5nIGRldGVjdGVkLiBUaGlzIG1vZHVsZSBwYXJhbWV0ZXIgY2FuIGJlCi0gICAgICAgICAgICAgICAgY2hhbmdlZCBhdCBydW50aW1lIHRoYW5rcyB0byB0aGUgL3N5cyBmaWxlc3lzdGVtIGludGVyZmFjZS4KKwkJMCA9IG5vbmUgKHVzZSBjYXJlZnVsbHkpCisJCTEgPSBjcml0aWNhbCBlcnJvcnMKKwkJMiA9IHNpZ25pZmljYW50IGluZm9ybWF0aW9ucworCQkzID0gbW9yZSB2ZXJib3NlIG1lc3NhZ2VzCisJCUxldmVsIDMgaXMgdXNlZnVsIGZvciB0ZXN0aW5nIG9ubHksIHdoZW4gb25seSBvbmUgZGV2aWNlCisJCWlzIHVzZWQgYXQgdGhlIHNhbWUgdGltZS4gSXQgYWxzbyBzaG93cyBzb21lIG1vcmUgaW5mb3JtYXRpb25zCisJCWFib3V0IHRoZSBoYXJkd2FyZSBiZWluZyBkZXRlY3RlZC4gVGhpcyBtb2R1bGUgcGFyYW1ldGVyIGNhbiBiZQorCQljaGFuZ2VkIGF0IHJ1bnRpbWUgdGhhbmtzIHRvIHRoZSAvc3lzIGZpbGVzeXN0ZW0gaW50ZXJmYWNlLgogRGVmYXVsdDogICAgICAgIDIKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9pYm1jYW0udHh0IGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9pYm1jYW0udHh0CmluZGV4IDRhNDBhMmUuLjM5N2E5NGUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvaWJtY2FtLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L2libWNhbS50eHQKQEAgLTIxLDcgKzIxLDcgQEAKIFN1cHBvcnRlZCBjb250cm9sczoKIC0gYnkgVjRMOiBDb250cmFzdCwgIEJyaWdodG5lc3MsIENvbG9yLCBIdWUKIC0gYnkgZHJpdmVyIG9wdGlvbnM6IGZyYW1lIHJhdGUsIGxpZ2h0aW5nIGNvbmRpdGlvbnMsIHZpZGVvIGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgcGljdHVyZSBzZXR0aW5ncywgc2hhcnBuZXNzLgorCQkgICAgIGRlZmF1bHQgcGljdHVyZSBzZXR0aW5ncywgc2hhcnBuZXNzLgogCiBTVVBQT1JURUQgQ0FNRVJBUzoKIApAQCAtMTkxLDY2ICsxOTEsNjYgQEAKIGluaXRfbW9kZWwyX3liICBJbnRlZ2VyICAgICAgICAgMC4uMjU1IFsweGEwXSAgIGluaXRfbW9kZWwyX3liPTIwMAogCiBkZWJ1ZyAgICAgICAgICAgWW91IGRvbid0IG5lZWQgdGhpcyBvcHRpb24gdW5sZXNzIHlvdSBhcmUgYSBkZXZlbG9wZXIuCi0gICAgICAgICAgICAgICAgSWYgeW91IGFyZSBhIGRldmVsb3BlciB0aGVuIHlvdSB3aWxsIHNlZSBpbiB0aGUgY29kZQotICAgICAgICAgICAgICAgIHdoYXQgdmFsdWVzIGRvIHdoYXQuIDA9b2ZmLgorCQlJZiB5b3UgYXJlIGEgZGV2ZWxvcGVyIHRoZW4geW91IHdpbGwgc2VlIGluIHRoZSBjb2RlCisJCXdoYXQgdmFsdWVzIGRvIHdoYXQuIDA9b2ZmLgogCiBmbGFncyAgICAgICAgICAgVGhpcyBpcyBhIGJpdCBtYXNrLCBhbmQgeW91IGNhbiBjb21iaW5lIGFueSBudW1iZXIgb2YKLSAgICAgICAgICAgICAgICBiaXRzIHRvIHByb2R1Y2Ugd2hhdCB5b3Ugd2FudC4gVXN1YWxseSB5b3UgZG9uJ3Qgd2FudAotICAgICAgICAgICAgICAgIGFueSBvZiBleHRyYSBmZWF0dXJlcyB0aGlzIG9wdGlvbiBwcm92aWRlczoKKwkJYml0cyB0byBwcm9kdWNlIHdoYXQgeW91IHdhbnQuIFVzdWFsbHkgeW91IGRvbid0IHdhbnQKKwkJYW55IG9mIGV4dHJhIGZlYXR1cmVzIHRoaXMgb3B0aW9uIHByb3ZpZGVzOgogCi0gICAgICAgICAgICAgICAgRkxBR1NfUkVUUllfVklESU9DU1lOQyAgMSAgVGhpcyBiaXQgYWxsb3dzIHRvIHJldHJ5IGZhaWxlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZJRElPQ1NZTkMgaW9jdGxzIHdpdGhvdXQgZmFpbGluZy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWxsIHdvcmsgd2l0aCB4YXd0diwgd2lsbCBub3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHhyZWFscHJvZHVjZXIuIERlZmF1bHQgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3Qgc2V0LgotICAgICAgICAgICAgICAgIEZMQUdTX01PTk9DSFJPTUUgICAgICAgIDIgIEFjdGl2YXRlcyBtb25vY2hyb21lIChiL3cpIG1vZGUuCi0gICAgICAgICAgICAgICAgRkxBR1NfRElTUExBWV9ISU5UUyAgICAgNCAgU2hvd3MgY29sb3JlZCBwaXhlbHMgd2hpY2ggaGF2ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hZ2ljIG1lYW5pbmcgdG8gZGV2ZWxvcGVycy4KLSAgICAgICAgICAgICAgICBGTEFHU19PVkVSTEFZX1NUQVRTICAgICA4ICBTaG93cyB0aW55IG51bWJlcnMgb24gc2NyZWVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWZ1bCBvbmx5IGZvciBkZWJ1Z2dpbmcuCi0gICAgICAgICAgICAgICAgRkxBR1NfRk9SQ0VfVEVTVFBBVFRFUk4gMTYgU2hvd3MgYmx1ZSBzY3JlZW4gd2l0aCBudW1iZXJzLgotICAgICAgICAgICAgICAgIEZMQUdTX1NFUEFSQVRFX0ZSQU1FUyAgIDMyIFNob3dzIGVhY2ggZnJhbWUgc2VwYXJhdGVseSwgYXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdCB3YXMgcmVjZWl2ZWQgZnJvbSB0aGUgY2FtZXJhLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQgKG5vdCBzZXQpIGlzIHRvIG1peCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjZWRpbmcgZnJhbWUgaW4gdG8gY29tcGVuc2F0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBvY2Nhc2lvbmFsIGxvc3Mgb2YgSXNvYyBkYXRhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb24gaGlnaCBmcmFtZSByYXRlcy4KLSAgICAgICAgICAgICAgICBGTEFHU19DTEVBTl9GUkFNRVMgICAgICA2NCBGb3JjZXMgImNsZWFudXAiIG9mIGVhY2ggZnJhbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmlvciB0byB1c2U7IHJlbGV2YW50IG9ubHkgaWYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTEFHU19TRVBBUkFURV9GUkFNRVMgaXMgc2V0LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQgaXMgbm90IHRvIGNsZWFuIGZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGlzIGEgbGl0dGxlIGZhc3RlciBidXQgbWF5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjZSBmbGlja2VyIGlmIGZyYW1lIHJhdGUgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b28gaGlnaCBhbmQgSXNvYyBkYXRhIGdldHMgbG9zdC4KLSAgICAgICAgICAgICAgICBGTEFHU19OT19ERUNPRElORyAgICAgIDEyOCBUaGlzIGZsYWcgdHVybnMgdGhlIHZpZGVvIHN0cmVhbQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXIgb2ZmLCBhbmQgZHVtcHMgdGhlIHJhdwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElzb2MgZGF0YSBmcm9tIHRoZSBjYW1lcmEgaW50bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSByZWFkaW5nIHByb2Nlc3MuIFVzZWZ1bCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmVsb3BlcnMsIGJ1dCBub3QgdG8gdXNlcnMuCisJCUZMQUdTX1JFVFJZX1ZJRElPQ1NZTkMgIDEgIFRoaXMgYml0IGFsbG93cyB0byByZXRyeSBmYWlsZWQKKwkJCQkJICAgVklESU9DU1lOQyBpb2N0bHMgd2l0aG91dCBmYWlsaW5nLgorCQkJCQkgICBXaWxsIHdvcmsgd2l0aCB4YXd0diwgd2lsbCBub3QKKwkJCQkJICAgd2l0aCB4cmVhbHByb2R1Y2VyLiBEZWZhdWx0IGlzCisJCQkJCSAgIG5vdCBzZXQuCisJCUZMQUdTX01PTk9DSFJPTUUgICAgICAgIDIgIEFjdGl2YXRlcyBtb25vY2hyb21lIChiL3cpIG1vZGUuCisJCUZMQUdTX0RJU1BMQVlfSElOVFMgICAgIDQgIFNob3dzIGNvbG9yZWQgcGl4ZWxzIHdoaWNoIGhhdmUKKwkJCQkJICAgbWFnaWMgbWVhbmluZyB0byBkZXZlbG9wZXJzLgorCQlGTEFHU19PVkVSTEFZX1NUQVRTICAgICA4ICBTaG93cyB0aW55IG51bWJlcnMgb24gc2NyZWVuLAorCQkJCQkgICB1c2VmdWwgb25seSBmb3IgZGVidWdnaW5nLgorCQlGTEFHU19GT1JDRV9URVNUUEFUVEVSTiAxNiBTaG93cyBibHVlIHNjcmVlbiB3aXRoIG51bWJlcnMuCisJCUZMQUdTX1NFUEFSQVRFX0ZSQU1FUyAgIDMyIFNob3dzIGVhY2ggZnJhbWUgc2VwYXJhdGVseSwgYXMKKwkJCQkJICAgaXQgd2FzIHJlY2VpdmVkIGZyb20gdGhlIGNhbWVyYS4KKwkJCQkJICAgRGVmYXVsdCAobm90IHNldCkgaXMgdG8gbWl4IHRoZQorCQkJCQkgICBwcmVjZWRpbmcgZnJhbWUgaW4gdG8gY29tcGVuc2F0ZQorCQkJCQkgICBmb3Igb2NjYXNpb25hbCBsb3NzIG9mIElzb2MgZGF0YQorCQkJCQkgICBvbiBoaWdoIGZyYW1lIHJhdGVzLgorCQlGTEFHU19DTEVBTl9GUkFNRVMgICAgICA2NCBGb3JjZXMgImNsZWFudXAiIG9mIGVhY2ggZnJhbWUKKwkJCQkJICAgcHJpb3IgdG8gdXNlOyByZWxldmFudCBvbmx5IGlmCisJCQkJCSAgIEZMQUdTX1NFUEFSQVRFX0ZSQU1FUyBpcyBzZXQuCisJCQkJCSAgIERlZmF1bHQgaXMgbm90IHRvIGNsZWFuIGZyYW1lcywKKwkJCQkJICAgdGhpcyBpcyBhIGxpdHRsZSBmYXN0ZXIgYnV0IG1heQorCQkJCQkgICBwcm9kdWNlIGZsaWNrZXIgaWYgZnJhbWUgcmF0ZSBpcworCQkJCQkgICB0b28gaGlnaCBhbmQgSXNvYyBkYXRhIGdldHMgbG9zdC4KKwkJRkxBR1NfTk9fREVDT0RJTkcgICAgICAxMjggVGhpcyBmbGFnIHR1cm5zIHRoZSB2aWRlbyBzdHJlYW0KKwkJCQkJICAgZGVjb2RlciBvZmYsIGFuZCBkdW1wcyB0aGUgcmF3CisJCQkJCSAgIElzb2MgZGF0YSBmcm9tIHRoZSBjYW1lcmEgaW50bworCQkJCQkgICB0aGUgcmVhZGluZyBwcm9jZXNzLiBVc2VmdWwgdG8KKwkJCQkJICAgZGV2ZWxvcGVycywgYnV0IG5vdCB0byB1c2Vycy4KIAogZnJhbWVyYXRlICAgICAgIFRoaXMgc2V0dGluZyBjb250cm9scyBmcmFtZSByYXRlIG9mIHRoZSBjYW1lcmEuIFRoaXMgaXMKLSAgICAgICAgICAgICAgICBhbiBhcHByb3hpbWF0ZSBzZXR0aW5nIChpbiB0ZXJtcyBvZiAid29yc3QiIC4uLiAiYmVzdCIpCi0gICAgICAgICAgICAgICAgYmVjYXVzZSBjYW1lcmEgY2hhbmdlcyBmcmFtZSByYXRlIGRlcGVuZGluZyBvbiBhbW91bnQKLSAgICAgICAgICAgICAgICBvZiBsaWdodCBhdmFpbGFibGUuIFNldHRpbmcgMCBpcyBzbG93ZXN0LCA2IGlzIGZhc3Rlc3QuCi0gICAgICAgICAgICAgICAgQmV3YXJlIC0gZmFzdCBzZXR0aW5ncyBhcmUgdmVyeSBkZW1hbmRpbmcgYW5kIG1heSBub3QKLSAgICAgICAgICAgICAgICB3b3JrIHdlbGwgd2l0aCBhbGwgdmlkZW8gc2l6ZXMuIEJlIGNvbnNlcnZhdGl2ZS4KKwkJYW4gYXBwcm94aW1hdGUgc2V0dGluZyAoaW4gdGVybXMgb2YgIndvcnN0IiAuLi4gImJlc3QiKQorCQliZWNhdXNlIGNhbWVyYSBjaGFuZ2VzIGZyYW1lIHJhdGUgZGVwZW5kaW5nIG9uIGFtb3VudAorCQlvZiBsaWdodCBhdmFpbGFibGUuIFNldHRpbmcgMCBpcyBzbG93ZXN0LCA2IGlzIGZhc3Rlc3QuCisJCUJld2FyZSAtIGZhc3Qgc2V0dGluZ3MgYXJlIHZlcnkgZGVtYW5kaW5nIGFuZCBtYXkgbm90CisJCXdvcmsgd2VsbCB3aXRoIGFsbCB2aWRlbyBzaXplcy4gQmUgY29uc2VydmF0aXZlLgogCiBodWVfY29ycmVjdGlvbiAgVGhpcyBoaWdobHkgb3B0aW9uYWwgc2V0dGluZyBhbGxvd3MgdG8gYWRqdXN0IHRoZQotICAgICAgICAgICAgICAgIGh1ZSBvZiB0aGUgaW1hZ2UgaW4gYSB3YXkgc2xpZ2h0bHkgZGlmZmVyZW50IGZyb20KLSAgICAgICAgICAgICAgICB3aGF0IHVzdWFsICJodWUiIGNvbnRyb2wgZG9lcy4gQm90aCBjb250cm9scyBhZmZlY3QKLSAgICAgICAgICAgICAgICBZVVYgY29sb3JzcGFjZTogcmVndWxhciAiaHVlIiBjb250cm9sIGFkanVzdHMgb25seQotICAgICAgICAgICAgICAgIFUgY29tcG9uZW50LCBhbmQgdGhpcyAiaHVlX2NvcnJlY3Rpb24iIG9wdGlvbiBzaW1pbGFybHkKLSAgICAgICAgICAgICAgICBhZGp1c3RzIG9ubHkgViBjb21wb25lbnQuIEhvd2V2ZXIgdXN1YWxseSBpdCBpcyBlbm91Z2gKLSAgICAgICAgICAgICAgICB0byB0d2VhayBvbmx5IFUgb3IgViB0byBjb21wZW5zYXRlIGZvciBjb2xvcmVkIGxpZ2h0IG9yCi0gICAgICAgICAgICAgICAgY29sb3IgdGVtcGVyYXR1cmU7IHRoaXMgb3B0aW9uIHNpbXBseSBhbGxvd3MgbW9yZQotICAgICAgICAgICAgICAgIGNvbXBsaWNhdGVkIGNvcnJlY3Rpb24gd2hlbiBhbmQgaWYgaXQgaXMgbmVjZXNzYXJ5LgorCQlodWUgb2YgdGhlIGltYWdlIGluIGEgd2F5IHNsaWdodGx5IGRpZmZlcmVudCBmcm9tCisJCXdoYXQgdXN1YWwgImh1ZSIgY29udHJvbCBkb2VzLiBCb3RoIGNvbnRyb2xzIGFmZmVjdAorCQlZVVYgY29sb3JzcGFjZTogcmVndWxhciAiaHVlIiBjb250cm9sIGFkanVzdHMgb25seQorCQlVIGNvbXBvbmVudCwgYW5kIHRoaXMgImh1ZV9jb3JyZWN0aW9uIiBvcHRpb24gc2ltaWxhcmx5CisJCWFkanVzdHMgb25seSBWIGNvbXBvbmVudC4gSG93ZXZlciB1c3VhbGx5IGl0IGlzIGVub3VnaAorCQl0byB0d2VhayBvbmx5IFUgb3IgViB0byBjb21wZW5zYXRlIGZvciBjb2xvcmVkIGxpZ2h0IG9yCisJCWNvbG9yIHRlbXBlcmF0dXJlOyB0aGlzIG9wdGlvbiBzaW1wbHkgYWxsb3dzIG1vcmUKKwkJY29tcGxpY2F0ZWQgY29ycmVjdGlvbiB3aGVuIGFuZCBpZiBpdCBpcyBuZWNlc3NhcnkuCiAKIGluaXRfYnJpZ2h0bmVzcyBUaGVzZSBzZXR0aW5ncyBzcGVjaWZ5IF9pbml0aWFsXyB2YWx1ZXMgd2hpY2ggd2lsbCBiZQogaW5pdF9jb250cmFzdCAgIHVzZWQgdG8gc2V0IHVwIHRoZSBjYW1lcmEuIElmIHlvdXIgVjRMIGFwcGxpY2F0aW9uIGhhcwogaW5pdF9jb2xvciAgICAgIGl0cyBvd24gY29udHJvbHMgdG8gYWRqdXN0IHRoZSBwaWN0dXJlIHRoZW4gdGhlc2UKIGluaXRfaHVlICAgICAgICBjb250cm9scyB3aWxsIGJlIHVzZWQgdG9vLiBUaGVzZSBvcHRpb25zIGFsbG93IHlvdSB0bwotICAgICAgICAgICAgICAgIHByZWNvbmZpZ3VyZSB0aGUgY2FtZXJhIHdoZW4gaXQgZ2V0cyBjb25uZWN0ZWQsIGJlZm9yZQotICAgICAgICAgICAgICAgIGFueSBWNEwgYXBwbGljYXRpb24gY29ubmVjdHMgdG8gaXQuIEdvb2QgZm9yIHdlYmNhbXMuCisJCXByZWNvbmZpZ3VyZSB0aGUgY2FtZXJhIHdoZW4gaXQgZ2V0cyBjb25uZWN0ZWQsIGJlZm9yZQorCQlhbnkgVjRMIGFwcGxpY2F0aW9uIGNvbm5lY3RzIHRvIGl0LiBHb29kIGZvciB3ZWJjYW1zLgogCiBpbml0X21vZGVsMl9yZyAgVGhlc2UgaW5pdGlhbCBzZXR0aW5ncyBhbHRlciBjb2xvciBiYWxhbmNlIG9mIHRoZQogaW5pdF9tb2RlbDJfcmcyIGNhbWVyYSBvbiBoYXJkd2FyZSBsZXZlbC4gQWxsIGZvdXIgc2V0dGluZ3MgbWF5IGJlIHVzZWQKQEAgLTI1OCw0NyArMjU4LDQ3IEBACiBpbml0X21vZGVsMl95YiAgc2V0dGluZ3Mgb25seSBhcHBseSB0byBNb2RlbCAyIGNhbWVyYXMuCiAKIGxpZ2h0aW5nICAgICAgICBUaGlzIG9wdGlvbiBzZWxlY3RzIG9uZSBvZiB0aHJlZSBoYXJkd2FyZS1kZWZpbmVkCi0gICAgICAgICAgICAgICAgcGhvdG9zZW5zaXRpdml0eSBzZXR0aW5ncyBvZiB0aGUgY2FtZXJhLiAwPWJyaWdodCBsaWdodCwKLSAgICAgICAgICAgICAgICAxPU1lZGl1bSAoZGVmYXVsdCksIDI9TG93IGxpZ2h0LiBUaGlzIHNldHRpbmcgYWZmZWN0cwotICAgICAgICAgICAgICAgIGZyYW1lIHJhdGU6IHRoZSBkaW1tZXIgdGhlIGxpZ2h0aW5nIHRoZSBsb3dlciB0aGUgZnJhbWUKLSAgICAgICAgICAgICAgICByYXRlIChiZWNhdXNlIGxvbmdlciBleHBvc2l0aW9uIHRpbWUgaXMgbmVlZGVkKS4gVGhlCi0gICAgICAgICAgICAgICAgTW9kZWwgMiBjYW1lcmFzIGFsbG93IHZhbHVlcyBtb3JlIHRoYW4gMiBmb3IgdGhpcyBvcHRpb24sCi0gICAgICAgICAgICAgICAgdGh1cyBlbmFibGluZyBleHRyZW1lbHkgaGlnaCBzZW5zaXRpdml0eSBhdCBjb3N0IG9mIGZyYW1lCi0gICAgICAgICAgICAgICAgcmF0ZSwgY29sb3Igc2F0dXJhdGlvbiBhbmQgaW1hZ2luZyBzZW5zb3Igbm9pc2UuCisJCXBob3Rvc2Vuc2l0aXZpdHkgc2V0dGluZ3Mgb2YgdGhlIGNhbWVyYS4gMD1icmlnaHQgbGlnaHQsCisJCTE9TWVkaXVtIChkZWZhdWx0KSwgMj1Mb3cgbGlnaHQuIFRoaXMgc2V0dGluZyBhZmZlY3RzCisJCWZyYW1lIHJhdGU6IHRoZSBkaW1tZXIgdGhlIGxpZ2h0aW5nIHRoZSBsb3dlciB0aGUgZnJhbWUKKwkJcmF0ZSAoYmVjYXVzZSBsb25nZXIgZXhwb3NpdGlvbiB0aW1lIGlzIG5lZWRlZCkuIFRoZQorCQlNb2RlbCAyIGNhbWVyYXMgYWxsb3cgdmFsdWVzIG1vcmUgdGhhbiAyIGZvciB0aGlzIG9wdGlvbiwKKwkJdGh1cyBlbmFibGluZyBleHRyZW1lbHkgaGlnaCBzZW5zaXRpdml0eSBhdCBjb3N0IG9mIGZyYW1lCisJCXJhdGUsIGNvbG9yIHNhdHVyYXRpb24gYW5kIGltYWdpbmcgc2Vuc29yIG5vaXNlLgogCiBzaGFycG5lc3MgICAgICAgVGhpcyBvcHRpb24gY29udHJvbHMgc21vb3RoaW5nIChub2lzZSByZWR1Y3Rpb24pCi0gICAgICAgICAgICAgICAgbWFkZSBieSBjYW1lcmEuIFNldHRpbmcgMCBpcyBtb3N0IHNtb290aCwgc2V0dGluZyA2Ci0gICAgICAgICAgICAgICAgaXMgbW9zdCBzaGFycC4gQmUgYXdhcmUgdGhhdCBDTU9TIHNlbnNvciB1c2VkIGluIHRoZQotICAgICAgICAgICAgICAgIGNhbWVyYSBpcyBwcmV0dHkgbm9pc3ksIHNvIGlmIHlvdSBjaG9vc2UgNiB5b3Ugd2lsbAotICAgICAgICAgICAgICAgIGJlIGdyZWV0ZWQgd2l0aCAic25vd3kiIGltYWdlLiBEZWZhdWx0IGlzIDQuIE1vZGVsIDIKLSAgICAgICAgICAgICAgICBjYW1lcmFzIGRvIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZS4KKwkJbWFkZSBieSBjYW1lcmEuIFNldHRpbmcgMCBpcyBtb3N0IHNtb290aCwgc2V0dGluZyA2CisJCWlzIG1vc3Qgc2hhcnAuIEJlIGF3YXJlIHRoYXQgQ01PUyBzZW5zb3IgdXNlZCBpbiB0aGUKKwkJY2FtZXJhIGlzIHByZXR0eSBub2lzeSwgc28gaWYgeW91IGNob29zZSA2IHlvdSB3aWxsCisJCWJlIGdyZWV0ZWQgd2l0aCAic25vd3kiIGltYWdlLiBEZWZhdWx0IGlzIDQuIE1vZGVsIDIKKwkJY2FtZXJhcyBkbyBub3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUuCiAKIHNpemUgICAgICAgICAgICBUaGlzIHNldHRpbmcgY2hvb3NlcyBvbmUgb2Ygc2V2ZXJhbCBpbWFnZSBzaXplcyB0aGF0IGFyZQotICAgICAgICAgICAgICAgIHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlci4gQ2FtZXJhcyBtYXkgc3VwcG9ydCBtb3JlLCBidXQKLSAgICAgICAgICAgICAgICBpdCdzIGRpZmZpY3VsdCB0byByZXZlcnNlLWVuZ2luZWVyIGFsbCBmb3JtYXRzLgotICAgICAgICAgICAgICAgIEZvbGxvd2luZyB2aWRlbyBzaXplcyBhcmUgc3VwcG9ydGVkOgorCQlzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXIuIENhbWVyYXMgbWF5IHN1cHBvcnQgbW9yZSwgYnV0CisJCWl0J3MgZGlmZmljdWx0IHRvIHJldmVyc2UtZW5naW5lZXIgYWxsIGZvcm1hdHMuCisJCUZvbGxvd2luZyB2aWRlbyBzaXplcyBhcmUgc3VwcG9ydGVkOgogCi0gICAgICAgICAgICAgICAgc2l6ZT0wICAgICAxMjh4OTYgIChNb2RlbCAxIG9ubHkpCi0gICAgICAgICAgICAgICAgc2l6ZT0xICAgICAxNjB4MTIwCi0gICAgICAgICAgICAgICAgc2l6ZT0yICAgICAxNzZ4MTQ0Ci0gICAgICAgICAgICAgICAgc2l6ZT0zICAgICAzMjB4MjQwIChNb2RlbCAyIG9ubHkpCi0gICAgICAgICAgICAgICAgc2l6ZT00ICAgICAzNTJ4MjQwIChNb2RlbCAyIG9ubHkpCi0gICAgICAgICAgICAgICAgc2l6ZT01ICAgICAzNTJ4Mjg4Ci0gICAgICAgICAgICAgICAgc2l6ZT02ICAgICA2NDB4NDgwIChNb2RlbCAzIG9ubHkpCisJCXNpemU9MCAgICAgMTI4eDk2ICAoTW9kZWwgMSBvbmx5KQorCQlzaXplPTEgICAgIDE2MHgxMjAKKwkJc2l6ZT0yICAgICAxNzZ4MTQ0CisJCXNpemU9MyAgICAgMzIweDI0MCAoTW9kZWwgMiBvbmx5KQorCQlzaXplPTQgICAgIDM1MngyNDAgKE1vZGVsIDIgb25seSkKKwkJc2l6ZT01ICAgICAzNTJ4Mjg4CisJCXNpemU9NiAgICAgNjQweDQ4MCAoTW9kZWwgMyBvbmx5KQogCi0gICAgICAgICAgICAgICAgVGhlIDM1MngyODggaXMgdGhlIG5hdGl2ZSBzaXplIG9mIHRoZSBNb2RlbCAxIHNlbnNvcgotICAgICAgICAgICAgICAgIGFycmF5LCBzbyBpdCdzIHRoZSBiZXN0IHJlc29sdXRpb24gdGhlIGNhbWVyYSBjYW4KLSAgICAgICAgICAgICAgICB5aWVsZC4gVGhlIGJlc3QgcmVzb2x1dGlvbiBvZiBNb2RlbCAyIGlzIDE3NngxNDQsIGFuZAotICAgICAgICAgICAgICAgIGxhcmdlciBpbWFnZXMgYXJlIHByb2R1Y2VkIGJ5IHN0cmV0Y2hpbmcgdGhlIGJpdG1hcC4KLSAgICAgICAgICAgICAgICBNb2RlbCAzIGhhcyBzZW5zb3Igd2l0aCA2NDB4NDgwIGdyaWQsIGFuZCBpdCB3b3JrcyB0b28sCi0gICAgICAgICAgICAgICAgYnV0IHRoZSBmcmFtZSByYXRlIHdpbGwgYmUgZXhjZXB0aW9uYWxseSBsb3cgKDEtMiBGUFMpOwotICAgICAgICAgICAgICAgIGl0IG1heSBiZSBzdGlsbCBPSyBmb3Igc29tZSBhcHBsaWNhdGlvbnMsIGxpa2Ugc2VjdXJpdHkuCi0gICAgICAgICAgICAgICAgQ2hvb3NlIHRoZSBpbWFnZSBzaXplIHlvdSBuZWVkLiBUaGUgc21hbGxlciBpbWFnZSBjYW4KLSAgICAgICAgICAgICAgICBzdXBwb3J0IGZhc3RlciBmcmFtZSByYXRlLiBEZWZhdWx0IGlzIDM1MngyODguCisJCVRoZSAzNTJ4Mjg4IGlzIHRoZSBuYXRpdmUgc2l6ZSBvZiB0aGUgTW9kZWwgMSBzZW5zb3IKKwkJYXJyYXksIHNvIGl0J3MgdGhlIGJlc3QgcmVzb2x1dGlvbiB0aGUgY2FtZXJhIGNhbgorCQl5aWVsZC4gVGhlIGJlc3QgcmVzb2x1dGlvbiBvZiBNb2RlbCAyIGlzIDE3NngxNDQsIGFuZAorCQlsYXJnZXIgaW1hZ2VzIGFyZSBwcm9kdWNlZCBieSBzdHJldGNoaW5nIHRoZSBiaXRtYXAuCisJCU1vZGVsIDMgaGFzIHNlbnNvciB3aXRoIDY0MHg0ODAgZ3JpZCwgYW5kIGl0IHdvcmtzIHRvbywKKwkJYnV0IHRoZSBmcmFtZSByYXRlIHdpbGwgYmUgZXhjZXB0aW9uYWxseSBsb3cgKDEtMiBGUFMpOworCQlpdCBtYXkgYmUgc3RpbGwgT0sgZm9yIHNvbWUgYXBwbGljYXRpb25zLCBsaWtlIHNlY3VyaXR5LgorCQlDaG9vc2UgdGhlIGltYWdlIHNpemUgeW91IG5lZWQuIFRoZSBzbWFsbGVyIGltYWdlIGNhbgorCQlzdXBwb3J0IGZhc3RlciBmcmFtZSByYXRlLiBEZWZhdWx0IGlzIDM1MngyODguCiAKIEZvciBtb3JlIGluZm9ybWF0aW9uIGFuZCB0aGUgVHJvdWJsZXNob290aW5nIEZBUSB2aXNpdCB0aGlzIFVSTDoKIAotICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cubGludXgtdXNiLm9yZy9pYm1jYW0vCisJCWh0dHA6Ly93d3cubGludXgtdXNiLm9yZy9pYm1jYW0vCiAKIFdIQVQgTkVFRFMgVE8gQkUgRE9ORToKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9vdjUxMS50eHQgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L292NTExLnR4dAppbmRleCAxNDI3NDFlLi43OWFmNjEwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L292NTExLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L292NTExLnR4dApAQCAtODEsNyArODEsNyBAQAogICBUWVBFOiBpbnRlZ2VyIChCb29sZWFuKQogICBERUZBVUxUOiAxCiAgIERFU0M6IEJyaWdodG5lc3MgaXMgbm9ybWFsbHkgdW5kZXIgYXV0b21hdGljIGNvbnRyb2wgYW5kIGNhbid0IGJlIHNldAotICAgICAgICBtYW51YWxseSBieSB0aGUgdmlkZW8gYXBwLiBTZXQgdG8gMCBmb3IgbWFudWFsIGNvbnRyb2wuCisJbWFudWFsbHkgYnkgdGhlIHZpZGVvIGFwcC4gU2V0IHRvIDAgZm9yIG1hbnVhbCBjb250cm9sLgogCiAgIE5BTUU6IGF1dG9nYWluCiAgIFRZUEU6IGludGVnZXIgKEJvb2xlYW4pCkBAIC05NywxMyArOTcsMTMgQEAKICAgVFlQRTogaW50ZWdlciAoMC02KQogICBERUZBVUxUOiAzCiAgIERFU0M6IFNldHMgdGhlIHRocmVzaG9sZCBmb3IgcHJpbnRpbmcgZGVidWcgbWVzc2FnZXMuIFRoZSBoaWdoZXIgdGhlIHZhbHVlLAotICAgICAgICB0aGUgbW9yZSBpcyBwcmludGVkLiBUaGUgbGV2ZWxzIGFyZSBjdW11bGF0aXZlLCBhbmQgYXJlIGFzIGZvbGxvd3M6Ci0gICAgICAgICAgMD1ubyBkZWJ1ZyBtZXNzYWdlcwotICAgICAgICAgIDE9aW5pdC9kZXRlY3Rpb24vdW5sb2FkIGFuZCBvdGhlciBzaWduaWZpY2FudCBtZXNzYWdlcwotICAgICAgICAgIDI9c29tZSB3YXJuaW5nIG1lc3NhZ2VzCi0gICAgICAgICAgMz1jb25maWcvY29udHJvbCBmdW5jdGlvbiBjYWxscwotICAgICAgICAgIDQ9bW9zdCBmdW5jdGlvbiBjYWxscyBhbmQgZGF0YSBwYXJzaW5nIG1lc3NhZ2VzCi0gICAgICAgICAgNT1oaWdobHkgcmVwZXRpdGl2ZSBtZXNncworCXRoZSBtb3JlIGlzIHByaW50ZWQuIFRoZSBsZXZlbHMgYXJlIGN1bXVsYXRpdmUsIGFuZCBhcmUgYXMgZm9sbG93czoKKwkgIDA9bm8gZGVidWcgbWVzc2FnZXMKKwkgIDE9aW5pdC9kZXRlY3Rpb24vdW5sb2FkIGFuZCBvdGhlciBzaWduaWZpY2FudCBtZXNzYWdlcworCSAgMj1zb21lIHdhcm5pbmcgbWVzc2FnZXMKKwkgIDM9Y29uZmlnL2NvbnRyb2wgZnVuY3Rpb24gY2FsbHMKKwkgIDQ9bW9zdCBmdW5jdGlvbiBjYWxscyBhbmQgZGF0YSBwYXJzaW5nIG1lc3NhZ2VzCisJICA1PWhpZ2hseSByZXBldGl0aXZlIG1lc2dzCiAKICAgTkFNRTogc25hcHNob3QKICAgVFlQRTogaW50ZWdlciAoQm9vbGVhbikKQEAgLTExNiwyNCArMTE2LDI0IEBACiAgIFRZUEU6IGludGVnZXIgKDEtNCBmb3IgT1Y1MTEsIDEtMzEgZm9yIE9WNTExKykKICAgREVGQVVMVDogMQogICBERVNDOiBOdW1iZXIgb2YgY2FtZXJhcyBhbGxvd2VkIHRvIHN0cmVhbSBzaW11bHRhbmVvdXNseSBvbiBhIHNpbmdsZSBidXMuCi0gICAgICAgIFZhbHVlcyBoaWdoZXIgdGhhbiAxIHJlZHVjZSB0aGUgZGF0YSByYXRlIG9mIGVhY2ggY2FtZXJhLCBhbGxvd2luZyB0d28KLSAgICAgICAgb3IgbW9yZSB0byBiZSB1c2VkIGF0IG9uY2UuIElmIHlvdSBoYXZlIGEgY29tcGxpY2F0ZWQgc2V0dXAgaW52b2x2aW5nCi0gICAgICAgIGJvdGggT1Y1MTEgYW5kIE9WNTExKyBjYW1lcmFzLCB0cmlhbC1hbmQtZXJyb3IgbWF5IGJlIG5lY2Vzc2FyeSBmb3IKLSAgICAgICAgZmluZGluZyB0aGUgb3B0aW11bSBzZXR0aW5nLgorCVZhbHVlcyBoaWdoZXIgdGhhbiAxIHJlZHVjZSB0aGUgZGF0YSByYXRlIG9mIGVhY2ggY2FtZXJhLCBhbGxvd2luZyB0d28KKwlvciBtb3JlIHRvIGJlIHVzZWQgYXQgb25jZS4gSWYgeW91IGhhdmUgYSBjb21wbGljYXRlZCBzZXR1cCBpbnZvbHZpbmcKKwlib3RoIE9WNTExIGFuZCBPVjUxMSsgY2FtZXJhcywgdHJpYWwtYW5kLWVycm9yIG1heSBiZSBuZWNlc3NhcnkgZm9yCisJZmluZGluZyB0aGUgb3B0aW11bSBzZXR0aW5nLgogCiAgIE5BTUU6IGNvbXByZXNzCiAgIFRZUEU6IGludGVnZXIgKEJvb2xlYW4pCiAgIERFRkFVTFQ6IDAKICAgREVTQzogU2V0IHRoaXMgdG8gMSB0byB0dXJuIG9uIHRoZSBjYW1lcmEncyBjb21wcmVzc2lvbiBlbmdpbmUuIFRoaXMgY2FuCi0gICAgICAgIHBvdGVudGlhbGx5IGluY3JlYXNlIHRoZSBmcmFtZSByYXRlIGF0IHRoZSBleHBlbnNlIG9mIHF1YWxpdHksIGlmIHlvdQotICAgICAgICBoYXZlIGEgZmFzdCBDUFUuIFlvdSBtdXN0IGxvYWQgdGhlIHByb3BlciBjb21wcmVzc2lvbiBtb2R1bGUgZm9yIHlvdXIKLSAgICAgICAgY2FtZXJhIGJlZm9yZSBzdGFydGluZyB5b3VyIGFwcGxpY2F0aW9uIChvdjUxMV9kZWNvbXAgb3Igb3Y1MThfZGVjb21wKS4KKwlwb3RlbnRpYWxseSBpbmNyZWFzZSB0aGUgZnJhbWUgcmF0ZSBhdCB0aGUgZXhwZW5zZSBvZiBxdWFsaXR5LCBpZiB5b3UKKwloYXZlIGEgZmFzdCBDUFUuIFlvdSBtdXN0IGxvYWQgdGhlIHByb3BlciBjb21wcmVzc2lvbiBtb2R1bGUgZm9yIHlvdXIKKwljYW1lcmEgYmVmb3JlIHN0YXJ0aW5nIHlvdXIgYXBwbGljYXRpb24gKG92NTExX2RlY29tcCBvciBvdjUxOF9kZWNvbXApLgogCiAgIE5BTUU6IHRlc3RwYXQKICAgVFlQRTogaW50ZWdlciAoQm9vbGVhbikKICAgREVGQVVMVDogMAogICBERVNDOiBUaGlzIGNvbmZpZ3VyZXMgdGhlIGNhbWVyYSdzIHNlbnNvciB0byB0cmFuc21pdCBhIGNvbG9yZWQgdGVzdC1wYXR0ZXJuCi0gICAgICAgIGluc3RlYWQgb2YgYW4gaW1hZ2UuIFRoaXMgZG9lcyBub3Qgd29yayBjb3JyZWN0bHkgeWV0LgorCWluc3RlYWQgb2YgYW4gaW1hZ2UuIFRoaXMgZG9lcyBub3Qgd29yayBjb3JyZWN0bHkgeWV0LgogCiAgIE5BTUU6IGR1bXBwaXgKICAgVFlQRTogaW50ZWdlciAoMC0yKQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9zbjljMTAyLnR4dCBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvc245YzEwMi50eHQKaW5kZXggMTQyOTIwYi4uMWQyMDg5NSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9zbjljMTAyLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L3NuOWMxMDIudHh0CkBAIC0xLDkgKzEsOSBAQAogCi0gICAgICAgICAgICAgICAgICAgICAgICAgU045QzEweCBQQyBDYW1lcmEgQ29udHJvbGxlcnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJpdmVyIGZvciBMaW51eAotICAgICAgICAgICAgICAgICAgICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCQkgU045QzEweCBQQyBDYW1lcmEgQ29udHJvbGxlcnMKKwkJCQlEcml2ZXIgZm9yIExpbnV4CisJCQkgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gRG9jdW1lbnRhdGlvbiAtCisJCQkgICAgICAgLSBEb2N1bWVudGF0aW9uIC0KIAogCiBJbmRleApAQCAtMTc2LDQ2ICsxNzYsNDYgQEAKIFR5cGU6ICAgICAgICAgICBzaG9ydCBhcnJheSAobWluID0gMCwgbWF4ID0gNjQpCiBTeW50YXg6ICAgICAgICAgPC0xfG5bLC4uLl0+CiBEZXNjcmlwdGlvbjogICAgU3BlY2lmeSBWNEwyIG1pbm9yIG1vZGUgbnVtYmVyOgotICAgICAgICAgICAgICAgIC0xID0gdXNlIG5leHQgYXZhaWxhYmxlCi0gICAgICAgICAgICAgICAgIG4gPSB1c2UgbWlub3IgbnVtYmVyIG4KLSAgICAgICAgICAgICAgICBZb3UgY2FuIHNwZWNpZnkgdXAgdG8gNjQgY2FtZXJhcyB0aGlzIHdheS4KLSAgICAgICAgICAgICAgICBGb3IgZXhhbXBsZToKLSAgICAgICAgICAgICAgICB2aWRlb19ucj0tMSwyLC0xIHdvdWxkIGFzc2lnbiBtaW5vciBudW1iZXIgMiB0byB0aGUgc2Vjb25kCi0gICAgICAgICAgICAgICAgcmVjb2duaXplZCBjYW1lcmEgYW5kIHVzZSBhdXRvIGZvciB0aGUgZmlyc3Qgb25lIGFuZCBmb3IgZXZlcnkKLSAgICAgICAgICAgICAgICBvdGhlciBjYW1lcmEuCisJCS0xID0gdXNlIG5leHQgYXZhaWxhYmxlCisJCSBuID0gdXNlIG1pbm9yIG51bWJlciBuCisJCVlvdSBjYW4gc3BlY2lmeSB1cCB0byA2NCBjYW1lcmFzIHRoaXMgd2F5LgorCQlGb3IgZXhhbXBsZToKKwkJdmlkZW9fbnI9LTEsMiwtMSB3b3VsZCBhc3NpZ24gbWlub3IgbnVtYmVyIDIgdG8gdGhlIHNlY29uZAorCQlyZWNvZ25pemVkIGNhbWVyYSBhbmQgdXNlIGF1dG8gZm9yIHRoZSBmaXJzdCBvbmUgYW5kIGZvciBldmVyeQorCQlvdGhlciBjYW1lcmEuCiBEZWZhdWx0OiAgICAgICAgLTEKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIE5hbWU6ICAgICAgICAgICBmb3JjZV9tdW5tYXAKIFR5cGU6ICAgICAgICAgICBib29sIGFycmF5IChtaW4gPSAwLCBtYXggPSA2NCkKIFN5bnRheDogICAgICAgICA8MHwxWywuLi5dPgogRGVzY3JpcHRpb246ICAgIEZvcmNlIHRoZSBhcHBsaWNhdGlvbiB0byB1bm1hcCBwcmV2aW91c2x5IG1hcHBlZCBidWZmZXIgbWVtb3J5Ci0gICAgICAgICAgICAgICAgYmVmb3JlIGNhbGxpbmcgYW55IFZJRElPQ19TX0NST1Agb3IgVklESU9DX1NfRk1UIGlvY3RsJ3MuIE5vdAotICAgICAgICAgICAgICAgIGFsbCB0aGUgYXBwbGljYXRpb25zIHN1cHBvcnQgdGhpcyBmZWF0dXJlLiBUaGlzIHBhcmFtZXRlciBpcwotICAgICAgICAgICAgICAgIHNwZWNpZmljIGZvciBlYWNoIGRldGVjdGVkIGNhbWVyYS4KLSAgICAgICAgICAgICAgICAwID0gZG8gbm90IGZvcmNlIG1lbW9yeSB1bm1hcHBpbmcKLSAgICAgICAgICAgICAgICAxID0gZm9yY2UgbWVtb3J5IHVubWFwcGluZyAoc2F2ZSBtZW1vcnkpCisJCWJlZm9yZSBjYWxsaW5nIGFueSBWSURJT0NfU19DUk9QIG9yIFZJRElPQ19TX0ZNVCBpb2N0bCdzLiBOb3QKKwkJYWxsIHRoZSBhcHBsaWNhdGlvbnMgc3VwcG9ydCB0aGlzIGZlYXR1cmUuIFRoaXMgcGFyYW1ldGVyIGlzCisJCXNwZWNpZmljIGZvciBlYWNoIGRldGVjdGVkIGNhbWVyYS4KKwkJMCA9IGRvIG5vdCBmb3JjZSBtZW1vcnkgdW5tYXBwaW5nCisJCTEgPSBmb3JjZSBtZW1vcnkgdW5tYXBwaW5nIChzYXZlIG1lbW9yeSkKIERlZmF1bHQ6ICAgICAgICAwCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBOYW1lOiAgICAgICAgICAgZnJhbWVfdGltZW91dAogVHlwZTogICAgICAgICAgIHVpbnQgYXJyYXkgKG1pbiA9IDAsIG1heCA9IDY0KQogU3ludGF4OiAgICAgICAgIDxuWywuLi5dPgogRGVzY3JpcHRpb246ICAgIFRpbWVvdXQgZm9yIGEgdmlkZW8gZnJhbWUgaW4gc2Vjb25kcy4gVGhpcyBwYXJhbWV0ZXIgaXMKLSAgICAgICAgICAgICAgICBzcGVjaWZpYyBmb3IgZWFjaCBkZXRlY3RlZCBjYW1lcmEuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZQotICAgICAgICAgICAgICAgIGNoYW5nZWQgYXQgcnVudGltZSB0aGFua3MgdG8gdGhlIC9zeXMgZmlsZXN5c3RlbSBpbnRlcmZhY2UuCisJCXNwZWNpZmljIGZvciBlYWNoIGRldGVjdGVkIGNhbWVyYS4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlCisJCWNoYW5nZWQgYXQgcnVudGltZSB0aGFua3MgdG8gdGhlIC9zeXMgZmlsZXN5c3RlbSBpbnRlcmZhY2UuCiBEZWZhdWx0OiAgICAgICAgMgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogTmFtZTogICAgICAgICAgIGRlYnVnCiBUeXBlOiAgICAgICAgICAgdXNob3J0CiBTeW50YXg6ICAgICAgICAgPG4+CiBEZXNjcmlwdGlvbjogICAgRGVidWdnaW5nIGluZm9ybWF0aW9uIGxldmVsLCBmcm9tIDAgdG8gMzoKLSAgICAgICAgICAgICAgICAwID0gbm9uZSAodXNlIGNhcmVmdWxseSkKLSAgICAgICAgICAgICAgICAxID0gY3JpdGljYWwgZXJyb3JzCi0gICAgICAgICAgICAgICAgMiA9IHNpZ25pZmljYW50IGluZm9ybWF0aW9ucwotICAgICAgICAgICAgICAgIDMgPSBtb3JlIHZlcmJvc2UgbWVzc2FnZXMKLSAgICAgICAgICAgICAgICBMZXZlbCAzIGlzIHVzZWZ1bCBmb3IgdGVzdGluZyBvbmx5LCB3aGVuIG9ubHkgb25lIGRldmljZQotICAgICAgICAgICAgICAgIGlzIHVzZWQuIEl0IGFsc28gc2hvd3Mgc29tZSBtb3JlIGluZm9ybWF0aW9ucyBhYm91dCB0aGUKLSAgICAgICAgICAgICAgICBoYXJkd2FyZSBiZWluZyBkZXRlY3RlZC4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGNoYW5nZWQgYXQKLSAgICAgICAgICAgICAgICBydW50aW1lIHRoYW5rcyB0byB0aGUgL3N5cyBmaWxlc3lzdGVtIGludGVyZmFjZS4KKwkJMCA9IG5vbmUgKHVzZSBjYXJlZnVsbHkpCisJCTEgPSBjcml0aWNhbCBlcnJvcnMKKwkJMiA9IHNpZ25pZmljYW50IGluZm9ybWF0aW9ucworCQkzID0gbW9yZSB2ZXJib3NlIG1lc3NhZ2VzCisJCUxldmVsIDMgaXMgdXNlZnVsIGZvciB0ZXN0aW5nIG9ubHksIHdoZW4gb25seSBvbmUgZGV2aWNlCisJCWlzIHVzZWQuIEl0IGFsc28gc2hvd3Mgc29tZSBtb3JlIGluZm9ybWF0aW9ucyBhYm91dCB0aGUKKwkJaGFyZHdhcmUgYmVpbmcgZGV0ZWN0ZWQuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBjaGFuZ2VkIGF0CisJCXJ1bnRpbWUgdGhhbmtzIHRvIHRoZSAvc3lzIGZpbGVzeXN0ZW0gaW50ZXJmYWNlLgogRGVmYXVsdDogICAgICAgIDIKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApAQCAtMjgwLDI0ICsyODAsMjQgQEAKIDB4MDQgICAgMHhDNCAgICAgICAgICBGcmFtZSBzeW5jaHJvbmlzYXRpb24gcGF0dGVybi4KIDB4MDUgICAgMHg5NiAgICAgICAgICBGcmFtZSBzeW5jaHJvbmlzYXRpb24gcGF0dGVybi4KIDB4MDYgICAgMHhYWCAgICAgICAgICBVbmtub3duIG1lYW5pbmcuIFRoZSBleGFjdCB2YWx1ZSBkZXBlbmRzIG9uIHRoZSBjaGlwOwotICAgICAgICAgICAgICAgICAgICAgIHBvc3NpYmxlIHZhbHVlcyBhcmUgMHgwMCwgMHgwMSBhbmQgMHgyMC4KKwkJICAgICAgcG9zc2libGUgdmFsdWVzIGFyZSAweDAwLCAweDAxIGFuZCAweDIwLgogMHgwNyAgICAweFhYICAgICAgICAgIFZhcmlhYmxlIHZhbHVlLCB3aG9zZSBiaXRzIGFyZSBmZjAwdXp6Yywgd2hlcmUgZmYgaXMgYQotICAgICAgICAgICAgICAgICAgICAgIGZyYW1lIGNvdW50ZXIsIHUgaXMgdW5rbm93biwgenogaXMgYSBzaXplIGluZGljYXRvcgotICAgICAgICAgICAgICAgICAgICAgICgwMCA9IFZHQSwgMDEgPSBTSUYsIDEwID0gUVNJRikgYW5kIGMgc3RhbmRzIGZvcgotICAgICAgICAgICAgICAgICAgICAgICJjb21wcmVzc2lvbiBlbmFibGVkIiAoMSA9IHllcywgMCA9IG5vKS4KKwkJICAgICAgZnJhbWUgY291bnRlciwgdSBpcyB1bmtub3duLCB6eiBpcyBhIHNpemUgaW5kaWNhdG9yCisJCSAgICAgICgwMCA9IFZHQSwgMDEgPSBTSUYsIDEwID0gUVNJRikgYW5kIGMgc3RhbmRzIGZvcgorCQkgICAgICAiY29tcHJlc3Npb24gZW5hYmxlZCIgKDEgPSB5ZXMsIDAgPSBubykuCiAweDA4ICAgIDB4WFggICAgICAgICAgQnJpZ2h0bmVzcyBzdW0gaW5zaWRlIEF1dG8tRXhwb3N1cmUgYXJlYSAobG93LWJ5dGUpLgogMHgwOSAgICAweFhYICAgICAgICAgIEJyaWdodG5lc3Mgc3VtIGluc2lkZSBBdXRvLUV4cG9zdXJlIGFyZWEgKGhpZ2gtYnl0ZSkuCi0gICAgICAgICAgICAgICAgICAgICAgRm9yIGEgcHVyZSB3aGl0ZSBpbWFnZSwgdGhpcyBudW1iZXIgd2lsbCBiZSBlcXVhbCB0byA1MDAKLSAgICAgICAgICAgICAgICAgICAgICB0aW1lcyB0aGUgYXJlYSBvZiB0aGUgc3BlY2lmaWVkIEFFIGFyZWEuIEZvciBpbWFnZXMKLSAgICAgICAgICAgICAgICAgICAgICB0aGF0IGFyZSBub3QgcHVyZSB3aGl0ZSwgdGhlIHZhbHVlIHNjYWxlcyBkb3duIGFjY29yZGluZwotICAgICAgICAgICAgICAgICAgICAgIHRvIHJlbGF0aXZlIHdoaXRlbmVzcy4KKwkJICAgICAgRm9yIGEgcHVyZSB3aGl0ZSBpbWFnZSwgdGhpcyBudW1iZXIgd2lsbCBiZSBlcXVhbCB0byA1MDAKKwkJICAgICAgdGltZXMgdGhlIGFyZWEgb2YgdGhlIHNwZWNpZmllZCBBRSBhcmVhLiBGb3IgaW1hZ2VzCisJCSAgICAgIHRoYXQgYXJlIG5vdCBwdXJlIHdoaXRlLCB0aGUgdmFsdWUgc2NhbGVzIGRvd24gYWNjb3JkaW5nCisJCSAgICAgIHRvIHJlbGF0aXZlIHdoaXRlbmVzcy4KIDB4MEEgICAgMHhYWCAgICAgICAgICBCcmlnaHRuZXNzIHN1bSBvdXRzaWRlIEF1dG8tRXhwb3N1cmUgYXJlYSAobG93LWJ5dGUpLgogMHgwQiAgICAweFhYICAgICAgICAgIEJyaWdodG5lc3Mgc3VtIG91dHNpZGUgQXV0by1FeHBvc3VyZSBhcmVhIChoaWdoLWJ5dGUpLgotICAgICAgICAgICAgICAgICAgICAgIEZvciBhIHB1cmUgd2hpdGUgaW1hZ2UsIHRoaXMgbnVtYmVyIHdpbGwgYmUgZXF1YWwgdG8gMTI1Ci0gICAgICAgICAgICAgICAgICAgICAgdGltZXMgdGhlIGFyZWEgb3V0c2lkZSBvZiB0aGUgc3BlY2lmaWVkIEFFIGFyZWEuIEZvcgotICAgICAgICAgICAgICAgICAgICAgIGltYWdlcyB0aGF0IGFyZSBub3QgcHVyZSB3aGl0ZSwgdGhlIHZhbHVlIHNjYWxlcyBkb3duCi0gICAgICAgICAgICAgICAgICAgICAgYWNjb3JkaW5nIHRvIHJlbGF0aXZlIHdoaXRlbmVzcy4KLSAgICAgICAgICAgICAgICAgICAgICBhY2NvcmRpbmcgdG8gcmVsYXRpdmUgd2hpdGVuZXNzLgorCQkgICAgICBGb3IgYSBwdXJlIHdoaXRlIGltYWdlLCB0aGlzIG51bWJlciB3aWxsIGJlIGVxdWFsIHRvIDEyNQorCQkgICAgICB0aW1lcyB0aGUgYXJlYSBvdXRzaWRlIG9mIHRoZSBzcGVjaWZpZWQgQUUgYXJlYS4gRm9yCisJCSAgICAgIGltYWdlcyB0aGF0IGFyZSBub3QgcHVyZSB3aGl0ZSwgdGhlIHZhbHVlIHNjYWxlcyBkb3duCisJCSAgICAgIGFjY29yZGluZyB0byByZWxhdGl2ZSB3aGl0ZW5lc3MuCisJCSAgICAgIGFjY29yZGluZyB0byByZWxhdGl2ZSB3aGl0ZW5lc3MuCiAKIFRoZSBmb2xsb3dpbmcgYnl0ZXMgYXJlIHVzZWQgYnkgdGhlIFNOOUMxMDMgYnJpZGdlIG9ubHk6CiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvdjRsZ3JhYi5jIGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC92NGxncmFiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc5YjYyOAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvdjRsZ3JhYi5jCkBAIC0wLDAgKzEsMTkyIEBACisvKiBTaW1wbGUgVmlkZW80TGludXggaW1hZ2UgZ3JhYmJlci4gKi8KKy8qCisgKglWaWRlbzRMaW51eCBEcml2ZXIgVGVzdC9FeGFtcGxlIEZyYW1lZ3JhYmJpbmcgUHJvZ3JhbQorICoKKyAqCUNvbXBpbGUgd2l0aDoKKyAqCQlnY2MgLXMgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyB2NGxncmFiLmMgLW8gdjRsZ3JhYgorICogICAgICBVc2UgYXM6CisgKiAgICAgICAgICAgICAgdjRsZ3JhYiA+aW1hZ2UucHBtCisgKgorICoJQ29weXJpZ2h0IChDKSAxOTk4LTA1LTAzLCBQaGlsIEJsdW5kZWxsIDxwaGlsYkBnbnUub3JnPgorICogICAgICBDb3BpZWQgZnJvbSBodHRwOi8vd3d3LnRhemVuZGEuZGVtb24uY28udWsvcGhpbC92Z3JhYmJlci5jCisgKiAgICAgIHdpdGggbWlub3IgbW9kaWZpY2F0aW9ucyAoRGF2ZSBGb3JyZXN0LCBkcmY1bkB2aXJnaW5pYS5lZHUpLgorICoKKyAqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CisKKyNkZWZpbmUgRklMRSAiL2Rldi92aWRlbzAiCisKKy8qIFN0b2xlIHRoaXMgZnJvbSB0dnNldC5jICovCisKKyNkZWZpbmUgUkVBRF9WSURFT19QSVhFTChidWYsIGZvcm1hdCwgZGVwdGgsIHIsIGcsIGIpICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlzd2l0Y2ggKGZvcm1hdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCWNhc2UgVklERU9fUEFMRVRURV9HUkVZOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJc3dpdGNoIChkZXB0aCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJCWNhc2UgNDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQkJY2FzZSA2OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCQljYXNlIDg6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJCQkocikgPSAoZykgPSAoYikgPSAoKmJ1ZisrIDw8IDgpO1wKKwkJCQkJYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQkJCQkJCQlcCisJCQkJY2FzZSAxNjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCQkJKHIpID0gKGcpID0gKGIpID0gICAgICAgICAgICAgICBcCisJCQkJCQkqKCh1bnNpZ25lZCBzaG9ydCAqKSBidWYpOyAgICAgIFwKKwkJCQkJYnVmICs9IDI7ICAgICAgICAgICAgICAgICAgICAgICBcCisJCQkJCWJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJCQkJCQkJXAorCQkJCQkJCQkJXAorCQljYXNlIFZJREVPX1BBTEVUVEVfUkdCNTY1OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQl1bnNpZ25lZCBzaG9ydCB0bXAgPSAqKHVuc2lnbmVkIHNob3J0ICopYnVmOyAgICBcCisJCQkocikgPSB0bXAmMHhGODAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQkoZykgPSAodG1wPDw1KSYweEZDMDA7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQkoYikgPSAodG1wPDwxMSkmMHhGODAwOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQlidWYgKz0gMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCQkJCQkJCVwKKwkJY2FzZSBWSURFT19QQUxFVFRFX1JHQjU1NTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQkocikgPSAoYnVmWzBdJjB4RjgpPDw4OyAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQkoZykgPSAoKGJ1ZlswXSA8PCA1IHwgYnVmWzFdID4+IDMpJjB4RjgpPDw4OyAgICBcCisJCQkoYikgPSAoKGJ1ZlsxXSA8PCAyICkgJiAweEY4KTw8ODsgICAgICAgICAgICAgICBcCisJCQlidWYgKz0gMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQlicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQkJCQkJCQlcCisJCWNhc2UgVklERU9fUEFMRVRURV9SR0IyNDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJKHIpID0gYnVmWzBdIDw8IDg7IChnKSA9IGJ1ZlsxXSA8PCA4OyAgICAgICAgICAgXAorCQkJKGIpID0gYnVmWzJdIDw8IDg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJYnVmICs9IDM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJCQkJCQkJXAorCQlkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCWZwcmludGYoc3RkZXJyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCQkiRm9ybWF0ICVkIG5vdCB5ZXQgc3VwcG9ydGVkXG4iLCAgICAgICAgXAorCQkJCWZvcm1hdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworaW50IGdldF9icmlnaHRuZXNzX2Fkaih1bnNpZ25lZCBjaGFyICppbWFnZSwgbG9uZyBzaXplLCBpbnQgKmJyaWdodG5lc3MpIHsKKyAgbG9uZyBpLCB0b3QgPSAwOworICBmb3IgKGk9MDtpPHNpemUqMztpKyspCisgICAgdG90ICs9IGltYWdlW2ldOworICAqYnJpZ2h0bmVzcyA9ICgxMjggLSB0b3QvKHNpemUqMykpLzM7CisgIHJldHVybiAhKCh0b3QvKHNpemUqMykpID49IDEyNiAmJiAodG90LyhzaXplKjMpKSA8PSAxMzApOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKiBhcmd2KQoreworICBpbnQgZmQgPSBvcGVuKEZJTEUsIE9fUkRPTkxZKSwgZjsKKyAgc3RydWN0IHZpZGVvX2NhcGFiaWxpdHkgY2FwOworICBzdHJ1Y3QgdmlkZW9fd2luZG93IHdpbjsKKyAgc3RydWN0IHZpZGVvX3BpY3R1cmUgdnBpYzsKKworICB1bnNpZ25lZCBjaGFyICpidWZmZXIsICpzcmM7CisgIGludCBicHAgPSAyNCwgciwgZywgYjsKKyAgdW5zaWduZWQgaW50IGksIHNyY19kZXB0aDsKKworICBpZiAoZmQgPCAwKSB7CisgICAgcGVycm9yKEZJTEUpOworICAgIGV4aXQoMSk7CisgIH0KKworICBpZiAoaW9jdGwoZmQsIFZJRElPQ0dDQVAsICZjYXApIDwgMCkgeworICAgIHBlcnJvcigiVklESU9HQ0FQIik7CisgICAgZnByaW50ZihzdGRlcnIsICIoIiBGSUxFICIgbm90IGEgdmlkZW80bGludXggZGV2aWNlPylcbiIpOworICAgIGNsb3NlKGZkKTsKKyAgICBleGl0KDEpOworICB9CisKKyAgaWYgKGlvY3RsKGZkLCBWSURJT0NHV0lOLCAmd2luKSA8IDApIHsKKyAgICBwZXJyb3IoIlZJRElPQ0dXSU4iKTsKKyAgICBjbG9zZShmZCk7CisgICAgZXhpdCgxKTsKKyAgfQorCisgIGlmIChpb2N0bChmZCwgVklESU9DR1BJQ1QsICZ2cGljKSA8IDApIHsKKyAgICBwZXJyb3IoIlZJRElPQ0dQSUNUIik7CisgICAgY2xvc2UoZmQpOworICAgIGV4aXQoMSk7CisgIH0KKworICBpZiAoY2FwLnR5cGUgJiBWSURfVFlQRV9NT05PQ0hST01FKSB7CisgICAgdnBpYy5kZXB0aD04OworICAgIHZwaWMucGFsZXR0ZT1WSURFT19QQUxFVFRFX0dSRVk7ICAgIC8qIDhiaXQgZ3JleSAqLworICAgIGlmKGlvY3RsKGZkLCBWSURJT0NTUElDVCwgJnZwaWMpIDwgMCkgeworICAgICAgdnBpYy5kZXB0aD02OworICAgICAgaWYoaW9jdGwoZmQsIFZJRElPQ1NQSUNULCAmdnBpYykgPCAwKSB7CisJdnBpYy5kZXB0aD00OworCWlmKGlvY3RsKGZkLCBWSURJT0NTUElDVCwgJnZwaWMpIDwgMCkgeworCSAgZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gZmluZCBhIHN1cHBvcnRlZCBjYXB0dXJlIGZvcm1hdC5cbiIpOworCSAgY2xvc2UoZmQpOworCSAgZXhpdCgxKTsKKwl9CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIHZwaWMuZGVwdGg9MjQ7CisgICAgdnBpYy5wYWxldHRlPVZJREVPX1BBTEVUVEVfUkdCMjQ7CisKKyAgICBpZihpb2N0bChmZCwgVklESU9DU1BJQ1QsICZ2cGljKSA8IDApIHsKKyAgICAgIHZwaWMucGFsZXR0ZT1WSURFT19QQUxFVFRFX1JHQjU2NTsKKyAgICAgIHZwaWMuZGVwdGg9MTY7CisKKyAgICAgIGlmKGlvY3RsKGZkLCBWSURJT0NTUElDVCwgJnZwaWMpPT0tMSkgeworCXZwaWMucGFsZXR0ZT1WSURFT19QQUxFVFRFX1JHQjU1NTsKKwl2cGljLmRlcHRoPTE1OworCisJaWYoaW9jdGwoZmQsIFZJRElPQ1NQSUNULCAmdnBpYyk9PS0xKSB7CisJICBmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBmaW5kIGEgc3VwcG9ydGVkIGNhcHR1cmUgZm9ybWF0LlxuIik7CisJICByZXR1cm4gLTE7CisJfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIGJ1ZmZlciA9IG1hbGxvYyh3aW4ud2lkdGggKiB3aW4uaGVpZ2h0ICogYnBwKTsKKyAgaWYgKCFidWZmZXIpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIk91dCBvZiBtZW1vcnkuXG4iKTsKKyAgICBleGl0KDEpOworICB9CisKKyAgZG8geworICAgIGludCBuZXdicmlnaHQ7CisgICAgcmVhZChmZCwgYnVmZmVyLCB3aW4ud2lkdGggKiB3aW4uaGVpZ2h0ICogYnBwKTsKKyAgICBmID0gZ2V0X2JyaWdodG5lc3NfYWRqKGJ1ZmZlciwgd2luLndpZHRoICogd2luLmhlaWdodCwgJm5ld2JyaWdodCk7CisgICAgaWYgKGYpIHsKKyAgICAgIHZwaWMuYnJpZ2h0bmVzcyArPSAobmV3YnJpZ2h0IDw8IDgpOworICAgICAgaWYoaW9jdGwoZmQsIFZJRElPQ1NQSUNULCAmdnBpYyk9PS0xKSB7CisJcGVycm9yKCJWSURJT1NQSUNUIik7CisJYnJlYWs7CisgICAgICB9CisgICAgfQorICB9IHdoaWxlIChmKTsKKworICBmcHJpbnRmKHN0ZG91dCwgIlA2XG4lZCAlZCAyNTVcbiIsIHdpbi53aWR0aCwgd2luLmhlaWdodCk7CisKKyAgc3JjID0gYnVmZmVyOworCisgIGZvciAoaSA9IDA7IGkgPCB3aW4ud2lkdGggKiB3aW4uaGVpZ2h0OyBpKyspIHsKKyAgICBSRUFEX1ZJREVPX1BJWEVMKHNyYywgdnBpYy5wYWxldHRlLCBzcmNfZGVwdGgsIHIsIGcsIGIpOworICAgIGZwdXRjKHI+PjgsIHN0ZG91dCk7CisgICAgZnB1dGMoZz4+OCwgc3Rkb3V0KTsKKyAgICBmcHV0YyhiPj44LCBzdGRvdXQpOworICB9CisKKyAgY2xvc2UoZmQpOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvdzk5NjhjZi50eHQgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L3c5OTY4Y2YudHh0CmluZGV4IDNiNzA0ZjIuLjBkNTNjZTcgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvdzk5NjhjZi50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC93OTk2OGNmLnR4dApAQCAtMSw5ICsxLDkgQEAKIAotICAgICAgICAgICAgICAgICAgIFc5OTZbODddQ0YgSlBFRyBVU0IgRHVhbCBNb2RlIENhbWVyYSBDaGlwCi0gICAgICAgICAgICAgICAgICAgICBEcml2ZXIgZm9yIExpbnV4IDIuNiAoYmFzaWMgdmVyc2lvbikKLSAgICAgICAgICAgICAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQkgICBXOTk2Wzg3XUNGIEpQRUcgVVNCIER1YWwgTW9kZSBDYW1lcmEgQ2hpcAorCQkgICAgIERyaXZlciBmb3IgTGludXggMi42IChiYXNpYyB2ZXJzaW9uKQorCQkgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBEb2N1bWVudGF0aW9uIC0KKwkJCSAgICAgICAtIERvY3VtZW50YXRpb24gLQogCiAKIEluZGV4CkBAIC0xODgsNTcgKzE4OCw1NyBAQAogVHlwZTogICAgICAgICAgICBib29sCiBTeW50YXg6ICAgICAgICAgIDwwfDE+CiBEZXNjcmlwdGlvbjogICAgIEF1dG9tYXRpYyAnb3ZjYW1jaGlwJyBtb2R1bGUgbG9hZGluZzogMCBkaXNhYmxlZCwgMSBlbmFibGVkLgotICAgICAgICAgICAgICAgICBJZiBlbmFibGVkLCAnaW5zbW9kJyBzZWFyY2hlcyBmb3IgdGhlIHJlcXVpcmVkICdvdmNhbWNoaXAnCi0gICAgICAgICAgICAgICAgIG1vZHVsZSBpbiB0aGUgc3lzdGVtLCBhY2NvcmRpbmcgdG8gaXRzIGNvbmZpZ3VyYXRpb24sIGFuZAotICAgICAgICAgICAgICAgICBsb2FkcyB0aGF0IG1vZHVsZSBhdXRvbWF0aWNhbGx5LiBUaGlzIGFjdGlvbiBpcyBwZXJmb3JtZWQgYXMKLSAgICAgICAgICAgICAgICAgb25jZSBzb29uIGFzIHRoZSAndzk5NjhjZicgbW9kdWxlIGlzIGxvYWRlZCBpbnRvIG1lbW9yeS4KKwkJIElmIGVuYWJsZWQsICdpbnNtb2QnIHNlYXJjaGVzIGZvciB0aGUgcmVxdWlyZWQgJ292Y2FtY2hpcCcKKwkJIG1vZHVsZSBpbiB0aGUgc3lzdGVtLCBhY2NvcmRpbmcgdG8gaXRzIGNvbmZpZ3VyYXRpb24sIGFuZAorCQkgbG9hZHMgdGhhdCBtb2R1bGUgYXV0b21hdGljYWxseS4gVGhpcyBhY3Rpb24gaXMgcGVyZm9ybWVkIGFzCisJCSBvbmNlIHNvb24gYXMgdGhlICd3OTk2OGNmJyBtb2R1bGUgaXMgbG9hZGVkIGludG8gbWVtb3J5LgogRGVmYXVsdDogICAgICAgICAxCiBOb3RlOiAgICAgICAgICAgIFRoZSBrZXJuZWwgbXVzdCBiZSBjb21waWxlZCB3aXRoIHRoZSBDT05GSUdfS01PRCBvcHRpb24KLSAgICAgICAgICAgICAgICAgZW5hYmxlZCBmb3IgdGhlICdvdmNhbWNoaXAnIG1vZHVsZSB0byBiZSBsb2FkZWQgYW5kIGZvcgotICAgICAgICAgICAgICAgICB0aGlzIHBhcmFtZXRlciB0byBiZSBwcmVzZW50LgorCQkgZW5hYmxlZCBmb3IgdGhlICdvdmNhbWNoaXAnIG1vZHVsZSB0byBiZSBsb2FkZWQgYW5kIGZvcgorCQkgdGhpcyBwYXJhbWV0ZXIgdG8gYmUgcHJlc2VudC4KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIE5hbWU6ICAgICAgICAgICBzaW1jYW1zCiBUeXBlOiAgICAgICAgICAgaW50CiBTeW50YXg6ICAgICAgICAgPG4+CiBEZXNjcmlwdGlvbjogICAgTnVtYmVyIG9mIGNhbWVyYXMgYWxsb3dlZCB0byBzdHJlYW0gc2ltdWx0YW5lb3VzbHkuCi0gICAgICAgICAgICAgICAgbiBtYXkgdmFyeSBmcm9tIDAgdG8gMzIuCisJCW4gbWF5IHZhcnkgZnJvbSAwIHRvIDMyLgogRGVmYXVsdDogICAgICAgIDMyCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBOYW1lOiAgICAgICAgICAgdmlkZW9fbnIKIFR5cGU6ICAgICAgICAgICBpbnQgYXJyYXkgKG1pbiA9IDAsIG1heCA9IDMyKQogU3ludGF4OiAgICAgICAgIDwtMXxuWywuLi5dPgogRGVzY3JpcHRpb246ICAgIFNwZWNpZnkgVjRMIG1pbm9yIG1vZGUgbnVtYmVyLgotICAgICAgICAgICAgICAgIC0xID0gdXNlIG5leHQgYXZhaWxhYmxlCi0gICAgICAgICAgICAgICAgIG4gPSB1c2UgbWlub3IgbnVtYmVyIG4KLSAgICAgICAgICAgICAgICBZb3UgY2FuIHNwZWNpZnkgdXAgdG8gMzIgY2FtZXJhcyB0aGlzIHdheS4KLSAgICAgICAgICAgICAgICBGb3IgZXhhbXBsZToKLSAgICAgICAgICAgICAgICB2aWRlb19ucj0tMSwyLC0xIHdvdWxkIGFzc2lnbiBtaW5vciBudW1iZXIgMiB0byB0aGUgc2Vjb25kCi0gICAgICAgICAgICAgICAgcmVjb2duaXplZCBjYW1lcmEgYW5kIHVzZSBhdXRvIGZvciB0aGUgZmlyc3Qgb25lIGFuZCBmb3IgZXZlcnkKLSAgICAgICAgICAgICAgICBvdGhlciBjYW1lcmEuCisJCS0xID0gdXNlIG5leHQgYXZhaWxhYmxlCisJCSBuID0gdXNlIG1pbm9yIG51bWJlciBuCisJCVlvdSBjYW4gc3BlY2lmeSB1cCB0byAzMiBjYW1lcmFzIHRoaXMgd2F5LgorCQlGb3IgZXhhbXBsZToKKwkJdmlkZW9fbnI9LTEsMiwtMSB3b3VsZCBhc3NpZ24gbWlub3IgbnVtYmVyIDIgdG8gdGhlIHNlY29uZAorCQlyZWNvZ25pemVkIGNhbWVyYSBhbmQgdXNlIGF1dG8gZm9yIHRoZSBmaXJzdCBvbmUgYW5kIGZvciBldmVyeQorCQlvdGhlciBjYW1lcmEuCiBEZWZhdWx0OiAgICAgICAgLTEKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIE5hbWU6ICAgICAgICAgICBwYWNrZXRfc2l6ZQogVHlwZTogICAgICAgICAgIGludCBhcnJheSAobWluID0gMCwgbWF4ID0gMzIpCiBTeW50YXg6ICAgICAgICAgPG5bLC4uLl0+CiBEZXNjcmlwdGlvbjogICAgU3BlY2lmeSB0aGUgbWF4aW11bSBkYXRhIHBheWxvYWQgc2l6ZSBpbiBieXRlcyBmb3IgYWx0ZXJuYXRlCi0gICAgICAgICAgICAgICAgc2V0dGluZ3MsIGZvciBlYWNoIGRldmljZS4gbiBpcyBzY2FsZWQgYmV0d2VlbiA2MyBhbmQgMTAyMy4KKwkJc2V0dGluZ3MsIGZvciBlYWNoIGRldmljZS4gbiBpcyBzY2FsZWQgYmV0d2VlbiA2MyBhbmQgMTAyMy4KIERlZmF1bHQ6ICAgICAgICAxMDIzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBOYW1lOiAgICAgICAgICAgbWF4X2J1ZmZlcnMKIFR5cGU6ICAgICAgICAgICBpbnQgYXJyYXkgKG1pbiA9IDAsIG1heCA9IDMyKQogU3ludGF4OiAgICAgICAgIDxuWywuLi5dPgogRGVzY3JpcHRpb246ICAgIEZvciBhZHZhbmNlZCB1c2Vycy4KLSAgICAgICAgICAgICAgICBTcGVjaWZ5IHRoZSBtYXhpbXVtIG51bWJlciBvZiB2aWRlbyBmcmFtZSBidWZmZXJzIHRvIGFsbG9jYXRlCi0gICAgICAgICAgICAgICAgZm9yIGVhY2ggZGV2aWNlLCBmcm9tIDIgdG8gMzIuCisJCVNwZWNpZnkgdGhlIG1heGltdW0gbnVtYmVyIG9mIHZpZGVvIGZyYW1lIGJ1ZmZlcnMgdG8gYWxsb2NhdGUKKwkJZm9yIGVhY2ggZGV2aWNlLCBmcm9tIDIgdG8gMzIuCiBEZWZhdWx0OiAgICAgICAgMgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogTmFtZTogICAgICAgICAgIGRvdWJsZV9idWZmZXIKIFR5cGU6ICAgICAgICAgICBib29sIGFycmF5IChtaW4gPSAwLCBtYXggPSAzMikKIFN5bnRheDogICAgICAgICA8MHwxWywuLi5dPgogRGVzY3JpcHRpb246ICAgIEhhcmR3YXJlIGRvdWJsZSBidWZmZXJpbmc6IDAgZGlzYWJsZWQsIDEgZW5hYmxlZC4KLSAgICAgICAgICAgICAgICBJdCBzaG91bGQgYmUgZW5hYmxlZCBpZiB5b3Ugd2FudCBzbW9vdGggdmlkZW8gb3V0cHV0OiBpZiB5b3UKLSAgICAgICAgICAgICAgICBvYnRhaW4gb3V0IG9mIHN5bmMuIHZpZGVvLCBkaXNhYmxlIGl0LCBvciB0cnkgdG8KLSAgICAgICAgICAgICAgICBkZWNyZWFzZSB0aGUgJ2Nsb2NrZGl2JyBtb2R1bGUgcGFyYW1ldGVyIHZhbHVlLgorCQlJdCBzaG91bGQgYmUgZW5hYmxlZCBpZiB5b3Ugd2FudCBzbW9vdGggdmlkZW8gb3V0cHV0OiBpZiB5b3UKKwkJb2J0YWluIG91dCBvZiBzeW5jLiB2aWRlbywgZGlzYWJsZSBpdCwgb3IgdHJ5IHRvCisJCWRlY3JlYXNlIHRoZSAnY2xvY2tkaXYnIG1vZHVsZSBwYXJhbWV0ZXIgdmFsdWUuCiBEZWZhdWx0OiAgICAgICAgMSBmb3IgZXZlcnkgZGV2aWNlLgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogTmFtZTogICAgICAgICAgIGNsYW1waW5nCkBAIC0yNTEsOSArMjUxLDkgQEAKIFR5cGU6ICAgICAgICAgICBpbnQgYXJyYXkgKG1pbiA9IDAsIG1heCA9IDMyKQogU3ludGF4OiAgICAgICAgIDwwfDF8MlssLi4uXT4KIERlc2NyaXB0aW9uOiAgICBWaWRlbyBmaWx0ZXIgdHlwZS4KLSAgICAgICAgICAgICAgICAwIG5vbmUsIDEgKDEtMi0xKSAzLXRhcCBmaWx0ZXIsIDIgKDItMy02LTMtMikgNS10YXAgZmlsdGVyLgotICAgICAgICAgICAgICAgIFRoZSBmaWx0ZXIgaXMgdXNlZCB0byByZWR1Y2Ugbm9pc2UgYW5kIGFsaWFzaW5nIGFydGlmYWN0cwotICAgICAgICAgICAgICAgIHByb2R1Y2VkIGJ5IHRoZSBDQ0Qgb3IgQ01PUyBpbWFnZSBzZW5zb3IuCisJCTAgbm9uZSwgMSAoMS0yLTEpIDMtdGFwIGZpbHRlciwgMiAoMi0zLTYtMy0yKSA1LXRhcCBmaWx0ZXIuCisJCVRoZSBmaWx0ZXIgaXMgdXNlZCB0byByZWR1Y2Ugbm9pc2UgYW5kIGFsaWFzaW5nIGFydGlmYWN0cworCQlwcm9kdWNlZCBieSB0aGUgQ0NEIG9yIENNT1MgaW1hZ2Ugc2Vuc29yLgogRGVmYXVsdDogICAgICAgIDAgZm9yIGV2ZXJ5IGRldmljZS4KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIE5hbWU6ICAgICAgICAgICBsYXJnZXZpZXcKQEAgLTI2Niw5ICsyNjYsOSBAQAogVHlwZTogICAgICAgICAgIGJvb2wgYXJyYXkgKG1pbiA9IDAsIG1heCA9IDMyKQogU3ludGF4OiAgICAgICAgIDwwfDFbLC4uLl0+CiBEZXNjcmlwdGlvbjogICAgU29mdHdhcmUgc2NhbGluZyAoZm9yIG5vbi1jb21wcmVzc2VkIHZpZGVvIG9ubHkpOgotICAgICAgICAgICAgICAgIDAgZGlzYWJsZWQsIDEgZW5hYmxlZC4KLSAgICAgICAgICAgICAgICBEaXNhYmxlIGl0IGlmIHlvdSBoYXZlIGEgc2xvdyBDUFUgb3IgeW91IGRvbid0IGhhdmUgZW5vdWdoCi0gICAgICAgICAgICAgICAgbWVtb3J5LgorCQkwIGRpc2FibGVkLCAxIGVuYWJsZWQuCisJCURpc2FibGUgaXQgaWYgeW91IGhhdmUgYSBzbG93IENQVSBvciB5b3UgZG9uJ3QgaGF2ZSBlbm91Z2gKKwkJbWVtb3J5LgogRGVmYXVsdDogICAgICAgIDAgZm9yIGV2ZXJ5IGRldmljZS4KIE5vdGU6ICAgICAgICAgICBJZiAndzk5NjhjZi12cHAnIGlzIG5vdCBwcmVzZW50LCB0aGlzIHBhcmFtZXRlciBpcyBzZXQgdG8gMC4KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTI3NiwzNiArMjc2LDM2IEBACiBUeXBlOiAgICAgICAgICAgaW50IGFycmF5IChtaW4gPSAwLCBtYXggPSAzMikKIFN5bnRheDogICAgICAgICA8MHwxfDJbLC4uLl0+CiBEZXNjcmlwdGlvbjogICAgU29mdHdhcmUgdmlkZW8gZGVjb21wcmVzc2lvbjoKLSAgICAgICAgICAgICAgICAwID0gZGlzYWJsZXMgZGVjb21wcmVzc2lvbgotICAgICAgICAgICAgICAgICAgICAoZG9lc24ndCBhbGxvdyBmb3JtYXRzIG5lZWRpbmcgZGVjb21wcmVzc2lvbikuCi0gICAgICAgICAgICAgICAgMSA9IGZvcmNlcyBkZWNvbXByZXNzaW9uCi0gICAgICAgICAgICAgICAgICAgIChhbGxvd3MgZm9ybWF0cyBuZWVkaW5nIGRlY29tcHJlc3Npb24gb25seSkuCi0gICAgICAgICAgICAgICAgMiA9IGFsbG93cyBhbnkgcGVybWl0dGVkIGZvcm1hdHMuCi0gICAgICAgICAgICAgICAgRm9ybWF0cyBzdXBwb3J0aW5nIChkZSljb21wcmVzc2VkIHZpZGVvIGFyZSBZVVY0MjJQIGFuZAotICAgICAgICAgICAgICAgIFlVVjQyMFAvWVVWNDIwIGluIGFueSByZXNvbHV0aW9ucyB3aGVyZSB3aWR0aCBhbmQgaGVpZ2h0IGFyZQotICAgICAgICAgICAgICAgIG11bHRpcGxlcyBvZiAxNi4KKwkJMCA9IGRpc2FibGVzIGRlY29tcHJlc3Npb24KKwkJICAgIChkb2Vzbid0IGFsbG93IGZvcm1hdHMgbmVlZGluZyBkZWNvbXByZXNzaW9uKS4KKwkJMSA9IGZvcmNlcyBkZWNvbXByZXNzaW9uCisJCSAgICAoYWxsb3dzIGZvcm1hdHMgbmVlZGluZyBkZWNvbXByZXNzaW9uIG9ubHkpLgorCQkyID0gYWxsb3dzIGFueSBwZXJtaXR0ZWQgZm9ybWF0cy4KKwkJRm9ybWF0cyBzdXBwb3J0aW5nIChkZSljb21wcmVzc2VkIHZpZGVvIGFyZSBZVVY0MjJQIGFuZAorCQlZVVY0MjBQL1lVVjQyMCBpbiBhbnkgcmVzb2x1dGlvbnMgd2hlcmUgd2lkdGggYW5kIGhlaWdodCBhcmUKKwkJbXVsdGlwbGVzIG9mIDE2LgogRGVmYXVsdDogICAgICAgIDIgZm9yIGV2ZXJ5IGRldmljZS4KIE5vdGU6ICAgICAgICAgICBJZiAndzk5NjhjZi12cHAnIGlzIG5vdCBwcmVzZW50LCBmb3JjaW5nIGRlY29tcHJlc3Npb24gaXMgbm90Ci0gICAgICAgICAgICAgICAgYWxsb3dlZDsgaW4gdGhpcyBjYXNlIHRoaXMgcGFyYW1ldGVyIGlzIHNldCB0byAyLgorCQlhbGxvd2VkOyBpbiB0aGlzIGNhc2UgdGhpcyBwYXJhbWV0ZXIgaXMgc2V0IHRvIDIuCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBOYW1lOiAgICAgICAgICAgZm9yY2VfcGFsZXR0ZQogVHlwZTogICAgICAgICAgIGludCBhcnJheSAobWluID0gMCwgbWF4ID0gMzIpCiBTeW50YXg6ICAgICAgICAgPDB8OXwxMHwxM3wxNXw4fDd8MXw2fDN8NHw1WywuLi5dPgogRGVzY3JpcHRpb246ICAgIEZvcmNlIHBpY3R1cmUgcGFsZXR0ZS4KLSAgICAgICAgICAgICAgICBJbiBvcmRlcjoKLSAgICAgICAgICAgICAgICAgMCA9IE9mZiAtIGFsbG93cyBhbnkgb2YgdGhlIGZvbGxvd2luZyBmb3JtYXRzOgotICAgICAgICAgICAgICAgICA5ID0gVVlWWSAgICAxNiBicHAgLSBPcmlnaW5hbCB2aWRlbywgY29tcHJlc3Npb24gZGlzYWJsZWQKLSAgICAgICAgICAgICAgICAxMCA9IFlVVjQyMCAgMTIgYnBwIC0gT3JpZ2luYWwgdmlkZW8sIGNvbXByZXNzaW9uIGVuYWJsZWQKLSAgICAgICAgICAgICAgICAxMyA9IFlVVjQyMlAgMTYgYnBwIC0gT3JpZ2luYWwgdmlkZW8sIGNvbXByZXNzaW9uIGVuYWJsZWQKLSAgICAgICAgICAgICAgICAxNSA9IFlVVjQyMFAgMTIgYnBwIC0gT3JpZ2luYWwgdmlkZW8sIGNvbXByZXNzaW9uIGVuYWJsZWQKLSAgICAgICAgICAgICAgICAgOCA9IFlVVlkgICAgMTYgYnBwIC0gU29mdHdhcmUgY29udmVyc2lvbiBmcm9tIFVZVlkKLSAgICAgICAgICAgICAgICAgNyA9IFlVVjQyMiAgMTYgYnBwIC0gU29mdHdhcmUgY29udmVyc2lvbiBmcm9tIFVZVlkKLSAgICAgICAgICAgICAgICAgMSA9IEdSRVkgICAgIDggYnBwIC0gU29mdHdhcmUgY29udmVyc2lvbiBmcm9tIFVZVlkKLSAgICAgICAgICAgICAgICAgNiA9IFJHQjU1NSAgMTYgYnBwIC0gU29mdHdhcmUgY29udmVyc2lvbiBmcm9tIFVZVlkKLSAgICAgICAgICAgICAgICAgMyA9IFJHQjU2NSAgMTYgYnBwIC0gU29mdHdhcmUgY29udmVyc2lvbiBmcm9tIFVZVlkKLSAgICAgICAgICAgICAgICAgNCA9IFJHQjI0ICAgMjQgYnBwIC0gU29mdHdhcmUgY29udmVyc2lvbiBmcm9tIFVZVlkKLSAgICAgICAgICAgICAgICAgNSA9IFJHQjMyICAgMzIgYnBwIC0gU29mdHdhcmUgY29udmVyc2lvbiBmcm9tIFVZVlkKLSAgICAgICAgICAgICAgICBXaGVuIG5vdCAwLCB0aGlzIHBhcmFtZXRlciB3aWxsIG92ZXJyaWRlICdkZWNvbXByZXNzaW9uJy4KKwkJSW4gb3JkZXI6CisJCSAwID0gT2ZmIC0gYWxsb3dzIGFueSBvZiB0aGUgZm9sbG93aW5nIGZvcm1hdHM6CisJCSA5ID0gVVlWWSAgICAxNiBicHAgLSBPcmlnaW5hbCB2aWRlbywgY29tcHJlc3Npb24gZGlzYWJsZWQKKwkJMTAgPSBZVVY0MjAgIDEyIGJwcCAtIE9yaWdpbmFsIHZpZGVvLCBjb21wcmVzc2lvbiBlbmFibGVkCisJCTEzID0gWVVWNDIyUCAxNiBicHAgLSBPcmlnaW5hbCB2aWRlbywgY29tcHJlc3Npb24gZW5hYmxlZAorCQkxNSA9IFlVVjQyMFAgMTIgYnBwIC0gT3JpZ2luYWwgdmlkZW8sIGNvbXByZXNzaW9uIGVuYWJsZWQKKwkJIDggPSBZVVZZICAgIDE2IGJwcCAtIFNvZnR3YXJlIGNvbnZlcnNpb24gZnJvbSBVWVZZCisJCSA3ID0gWVVWNDIyICAxNiBicHAgLSBTb2Z0d2FyZSBjb252ZXJzaW9uIGZyb20gVVlWWQorCQkgMSA9IEdSRVkgICAgIDggYnBwIC0gU29mdHdhcmUgY29udmVyc2lvbiBmcm9tIFVZVlkKKwkJIDYgPSBSR0I1NTUgIDE2IGJwcCAtIFNvZnR3YXJlIGNvbnZlcnNpb24gZnJvbSBVWVZZCisJCSAzID0gUkdCNTY1ICAxNiBicHAgLSBTb2Z0d2FyZSBjb252ZXJzaW9uIGZyb20gVVlWWQorCQkgNCA9IFJHQjI0ICAgMjQgYnBwIC0gU29mdHdhcmUgY29udmVyc2lvbiBmcm9tIFVZVlkKKwkJIDUgPSBSR0IzMiAgIDMyIGJwcCAtIFNvZnR3YXJlIGNvbnZlcnNpb24gZnJvbSBVWVZZCisJCVdoZW4gbm90IDAsIHRoaXMgcGFyYW1ldGVyIHdpbGwgb3ZlcnJpZGUgJ2RlY29tcHJlc3Npb24nLgogRGVmYXVsdDogICAgICAgIDAgZm9yIGV2ZXJ5IGRldmljZS4gSW5pdGlhbCBwYWxldHRlIGlzIDkgKFVZVlkpLgogTm90ZTogICAgICAgICAgIElmICd3OTk2OGNmLXZwcCcgaXMgbm90IHByZXNlbnQsIHRoaXMgcGFyYW1ldGVyIGlzIHNldCB0byA5LgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMzEzLDc3ICszMTMsNzcgQEAKIFR5cGU6ICAgICAgICAgICBib29sIGFycmF5IChtaW4gPSAwLCBtYXggPSAzMikKIFN5bnRheDogICAgICAgICA8MHwxWywuLi5dPgogRGVzY3JpcHRpb246ICAgIFJlYWQgUkdCIHZpZGVvIGRhdGEgaW5zdGVhZCBvZiBCR1I6Ci0gICAgICAgICAgICAgICAgMSA9IHVzZSBSR0IgY29tcG9uZW50IG9yZGVyaW5nLgotICAgICAgICAgICAgICAgIDAgPSB1c2UgQkdSIGNvbXBvbmVudCBvcmRlcmluZy4KLSAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBoYXMgZWZmZWN0IHdoZW4gdXNpbmcgUkdCWCBwYWxldHRlcyBvbmx5LgorCQkxID0gdXNlIFJHQiBjb21wb25lbnQgb3JkZXJpbmcuCisJCTAgPSB1c2UgQkdSIGNvbXBvbmVudCBvcmRlcmluZy4KKwkJVGhpcyBwYXJhbWV0ZXIgaGFzIGVmZmVjdCB3aGVuIHVzaW5nIFJHQlggcGFsZXR0ZXMgb25seS4KIERlZmF1bHQ6ICAgICAgICAwIGZvciBldmVyeSBkZXZpY2UuCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBOYW1lOiAgICAgICAgICAgYXV0b2JyaWdodAogVHlwZTogICAgICAgICAgIGJvb2wgYXJyYXkgKG1pbiA9IDAsIG1heCA9IDMyKQogU3ludGF4OiAgICAgICAgIDwwfDFbLC4uLl0+CiBEZXNjcmlwdGlvbjogICAgSW1hZ2Ugc2Vuc29yIGF1dG9tYXRpY2FsbHkgY2hhbmdlcyBicmlnaHRuZXNzOgotICAgICAgICAgICAgICAgIDAgPSBubywgMSA9IHllcworCQkwID0gbm8sIDEgPSB5ZXMKIERlZmF1bHQ6ICAgICAgICAwIGZvciBldmVyeSBkZXZpY2UuCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBOYW1lOiAgICAgICAgICAgYXV0b2V4cAogVHlwZTogICAgICAgICAgIGJvb2wgYXJyYXkgKG1pbiA9IDAsIG1heCA9IDMyKQogU3ludGF4OiAgICAgICAgIDwwfDFbLC4uLl0+CiBEZXNjcmlwdGlvbjogICAgSW1hZ2Ugc2Vuc29yIGF1dG9tYXRpY2FsbHkgY2hhbmdlcyBleHBvc3VyZToKLSAgICAgICAgICAgICAgICAwID0gbm8sIDEgPSB5ZXMKKwkJMCA9IG5vLCAxID0geWVzCiBEZWZhdWx0OiAgICAgICAgMSBmb3IgZXZlcnkgZGV2aWNlLgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogTmFtZTogICAgICAgICAgIGxpZ2h0ZnJlcQogVHlwZTogICAgICAgICAgIGludCBhcnJheSAobWluID0gMCwgbWF4ID0gMzIpCiBTeW50YXg6ICAgICAgICAgPDUwfDYwWywuLi5dPgogRGVzY3JpcHRpb246ICAgIExpZ2h0IGZyZXF1ZW5jeSBpbiBIejoKLSAgICAgICAgICAgICAgICA1MCBmb3IgRXVyb3BlYW4gYW5kIEFzaWFuIGxpZ2h0aW5nLCA2MCBmb3IgQW1lcmljYW4gbGlnaHRpbmcuCisJCTUwIGZvciBFdXJvcGVhbiBhbmQgQXNpYW4gbGlnaHRpbmcsIDYwIGZvciBBbWVyaWNhbiBsaWdodGluZy4KIERlZmF1bHQ6ICAgICAgICA1MCBmb3IgZXZlcnkgZGV2aWNlLgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogTmFtZTogICAgICAgICAgIGJhbmRpbmdmaWx0ZXIKIFR5cGU6ICAgICAgICAgICBib29sIGFycmF5IChtaW4gPSAwLCBtYXggPSAzMikKIFN5bnRheDogICAgICAgICA8MHwxWywuLi5dPgogRGVzY3JpcHRpb246ICAgIEJhbmRpbmcgZmlsdGVyIHRvIHJlZHVjZSBlZmZlY3RzIG9mIGZsdW9yZXNjZW50Ci0gICAgICAgICAgICAgICAgbGlnaHRpbmc6Ci0gICAgICAgICAgICAgICAgMCBkaXNhYmxlZCwgMSBlbmFibGVkLgotICAgICAgICAgICAgICAgIFRoaXMgZmlsdGVyIHRyaWVzIHRvIHJlZHVjZSB0aGUgcGF0dGVybiBvZiBob3Jpem9udGFsCi0gICAgICAgICAgICAgICAgbGlnaHQvZGFyayBiYW5kcyBjYXVzZWQgYnkgc29tZSAodXN1YWxseSBmbHVvcmVzY2VudCkgbGlnaHRpbmcuCisJCWxpZ2h0aW5nOgorCQkwIGRpc2FibGVkLCAxIGVuYWJsZWQuCisJCVRoaXMgZmlsdGVyIHRyaWVzIHRvIHJlZHVjZSB0aGUgcGF0dGVybiBvZiBob3Jpem9udGFsCisJCWxpZ2h0L2RhcmsgYmFuZHMgY2F1c2VkIGJ5IHNvbWUgKHVzdWFsbHkgZmx1b3Jlc2NlbnQpIGxpZ2h0aW5nLgogRGVmYXVsdDogICAgICAgIDAgZm9yIGV2ZXJ5IGRldmljZS4KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIE5hbWU6ICAgICAgICAgICBjbG9ja2RpdgogVHlwZTogICAgICAgICAgIGludCBhcnJheSAobWluID0gMCwgbWF4ID0gMzIpCiBTeW50YXg6ICAgICAgICAgPC0xfG5bLC4uLl0+CiBEZXNjcmlwdGlvbjogICAgRm9yY2UgcGl4ZWwgY2xvY2sgZGl2aXNvciB0byBhIHNwZWNpZmljIHZhbHVlIChmb3IgZXhwZXJ0cyk6Ci0gICAgICAgICAgICAgICAgbiBtYXkgdmFyeSBmcm9tIDAgdG8gMTI3LgotICAgICAgICAgICAgICAgIC0xIGZvciBhdXRvbWF0aWMgdmFsdWUuCi0gICAgICAgICAgICAgICAgU2VlIGFsc28gdGhlICdkb3VibGVfYnVmZmVyJyBtb2R1bGUgcGFyYW1ldGVyLgorCQluIG1heSB2YXJ5IGZyb20gMCB0byAxMjcuCisJCS0xIGZvciBhdXRvbWF0aWMgdmFsdWUuCisJCVNlZSBhbHNvIHRoZSAnZG91YmxlX2J1ZmZlcicgbW9kdWxlIHBhcmFtZXRlci4KIERlZmF1bHQ6ICAgICAgICAtMSBmb3IgZXZlcnkgZGV2aWNlLgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogTmFtZTogICAgICAgICAgIGJhY2tsaWdodAogVHlwZTogICAgICAgICAgIGJvb2wgYXJyYXkgKG1pbiA9IDAsIG1heCA9IDMyKQogU3ludGF4OiAgICAgICAgIDwwfDFbLC4uLl0+CiBEZXNjcmlwdGlvbjogICAgT2JqZWN0cyBhcmUgbGl0IGZyb20gYmVoaW5kOgotICAgICAgICAgICAgICAgIDAgPSBubywgMSA9IHllcworCQkwID0gbm8sIDEgPSB5ZXMKIERlZmF1bHQ6ICAgICAgICAwIGZvciBldmVyeSBkZXZpY2UuCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBOYW1lOiAgICAgICAgICAgbWlycm9yCiBUeXBlOiAgICAgICAgICAgYm9vbCBhcnJheSAobWluID0gMCwgbWF4ID0gMzIpCiBTeW50YXg6ICAgICAgICAgPDB8MVssLi4uXT4KIERlc2NyaXB0aW9uOiAgICBSZXZlcnNlIGltYWdlIGhvcml6b250YWxseToKLSAgICAgICAgICAgICAgICAwID0gbm8sIDEgPSB5ZXMKKwkJMCA9IG5vLCAxID0geWVzCiBEZWZhdWx0OiAgICAgICAgMCBmb3IgZXZlcnkgZGV2aWNlLgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogTmFtZTogICAgICAgICAgIG1vbm9jaHJvbWUKIFR5cGU6ICAgICAgICAgICBib29sIGFycmF5IChtaW4gPSAwLCBtYXggPSAzMikKIFN5bnRheDogICAgICAgICA8MHwxWywuLi5dPgogRGVzY3JpcHRpb246ICAgIFRoZSBpbWFnZSBzZW5zb3IgaXMgbW9ub2Nocm9tZToKLSAgICAgICAgICAgICAgICAwID0gbm8sIDEgPSB5ZXMKKwkJMCA9IG5vLCAxID0geWVzCiBEZWZhdWx0OiAgICAgICAgMCBmb3IgZXZlcnkgZGV2aWNlLgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogTmFtZTogICAgICAgICAgIGJyaWdodG5lc3MKIFR5cGU6ICAgICAgICAgICBsb25nIGFycmF5IChtaW4gPSAwLCBtYXggPSAzMikKIFN5bnRheDogICAgICAgICA8blssLi4uXT4KIERlc2NyaXB0aW9uOiAgICBTZXQgcGljdHVyZSBicmlnaHRuZXNzICgwLTY1NTM1KS4KLSAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBoYXMgbm8gZWZmZWN0IGlmICdhdXRvYnJpZ2h0JyBpcyBlbmFibGVkLgorCQlUaGlzIHBhcmFtZXRlciBoYXMgbm8gZWZmZWN0IGlmICdhdXRvYnJpZ2h0JyBpcyBlbmFibGVkLgogRGVmYXVsdDogICAgICAgIDMxMDAwIGZvciBldmVyeSBkZXZpY2UuCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBOYW1lOiAgICAgICAgICAgaHVlCkBAIC00MTQsMjMgKzQxNCwyMyBAQAogVHlwZTogICAgICAgICAgIGludAogU3ludGF4OiAgICAgICAgIDxuPgogRGVzY3JpcHRpb246ICAgIERlYnVnZ2luZyBpbmZvcm1hdGlvbiBsZXZlbCwgZnJvbSAwIHRvIDY6Ci0gICAgICAgICAgICAgICAgMCA9IG5vbmUgKHVzZSBjYXJlZnVsbHkpCi0gICAgICAgICAgICAgICAgMSA9IGNyaXRpY2FsIGVycm9ycwotICAgICAgICAgICAgICAgIDIgPSBzaWduaWZpY2FudCBpbmZvcm1hdGlvbnMKLSAgICAgICAgICAgICAgICAzID0gY29uZmlndXJhdGlvbiBvciBnZW5lcmFsIG1lc3NhZ2VzCi0gICAgICAgICAgICAgICAgNCA9IHdhcm5pbmdzCi0gICAgICAgICAgICAgICAgNSA9IGNhbGxlZCBmdW5jdGlvbnMKLSAgICAgICAgICAgICAgICA2ID0gZnVuY3Rpb24gaW50ZXJuYWxzCi0gICAgICAgICAgICAgICAgTGV2ZWwgNSBhbmQgNiBhcmUgdXNlZnVsIGZvciB0ZXN0aW5nIG9ubHksIHdoZW4gb25seSBvbmUKLSAgICAgICAgICAgICAgICBkZXZpY2UgaXMgdXNlZC4KKwkJMCA9IG5vbmUgKHVzZSBjYXJlZnVsbHkpCisJCTEgPSBjcml0aWNhbCBlcnJvcnMKKwkJMiA9IHNpZ25pZmljYW50IGluZm9ybWF0aW9ucworCQkzID0gY29uZmlndXJhdGlvbiBvciBnZW5lcmFsIG1lc3NhZ2VzCisJCTQgPSB3YXJuaW5ncworCQk1ID0gY2FsbGVkIGZ1bmN0aW9ucworCQk2ID0gZnVuY3Rpb24gaW50ZXJuYWxzCisJCUxldmVsIDUgYW5kIDYgYXJlIHVzZWZ1bCBmb3IgdGVzdGluZyBvbmx5LCB3aGVuIG9ubHkgb25lCisJCWRldmljZSBpcyB1c2VkLgogRGVmYXVsdDogICAgICAgIDIKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIE5hbWU6ICAgICAgICAgICBzcGVjaWZpY19kZWJ1ZwogVHlwZTogICAgICAgICAgIGJvb2wKIFN5bnRheDogICAgICAgICA8MHwxPgogRGVzY3JpcHRpb246ICAgIEVuYWJsZSBvciBkaXNhYmxlIHNwZWNpZmljIGRlYnVnZ2luZyBtZXNzYWdlczoKLSAgICAgICAgICAgICAgICAwID0gcHJpbnQgbWVzc2FnZXMgY29uY2VybmluZyBldmVyeSBsZXZlbCA8PSAnZGVidWcnIGxldmVsLgotICAgICAgICAgICAgICAgIDEgPSBwcmludCBtZXNzYWdlcyBjb25jZXJuaW5nIHRoZSBsZXZlbCBpbmRpY2F0ZWQgYnkgJ2RlYnVnJy4KKwkJMCA9IHByaW50IG1lc3NhZ2VzIGNvbmNlcm5pbmcgZXZlcnkgbGV2ZWwgPD0gJ2RlYnVnJyBsZXZlbC4KKwkJMSA9IHByaW50IG1lc3NhZ2VzIGNvbmNlcm5pbmcgdGhlIGxldmVsIGluZGljYXRlZCBieSAnZGVidWcnLgogRGVmYXVsdDogICAgICAgIDAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC96YzAzMDEudHh0IGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC96YzAzMDEudHh0CmluZGV4IGY1NTI2MmMuLmY0MDZmNWUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvemMwMzAxLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L3pjMDMwMS50eHQKQEAgLTEsOSArMSw5IEBACiAKLSAgICAgICAgICAgICAgICAgICAgWkMwMzAxIEltYWdlIFByb2Nlc3NvciBhbmQgQ29udHJvbCBDaGlwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERyaXZlciBmb3IgTGludXgKLSAgICAgICAgICAgICAgICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJICAgICAgWkMwMzAxIGFuZCBaQzAzMDFQIEltYWdlIFByb2Nlc3NvciBhbmQgQ29udHJvbCBDaGlwCisJCQkJRHJpdmVyIGZvciBMaW51eAorCSAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBEb2N1bWVudGF0aW9uIC0KKwkJCSAgICAgICAtIERvY3VtZW50YXRpb24gLQogCiAKIEluZGV4CkBAIC01MSwxMyArNTEsMTMgQEAKIAogNC4gT3ZlcnZpZXcgYW5kIGZlYXR1cmVzCiA9PT09PT09PT09PT09PT09PT09PT09PT0KLVRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSB2aWRlbyBpbnRlcmZhY2Ugb2YgdGhlIGRldmljZXMgbW91bnRpbmcgdGhlIFpDMDMwMQotSW1hZ2UgUHJvY2Vzc29yIGFuZCBDb250cm9sIENoaXAuCitUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgdmlkZW8gaW50ZXJmYWNlIG9mIHRoZSBkZXZpY2VzIG1vdW50aW5nIHRoZSBaQzAzMDEgb3IKK1pDMDMwMVAgSW1hZ2UgUHJvY2Vzc29ycyBhbmQgQ29udHJvbCBDaGlwcy4KIAogVGhlIGRyaXZlciByZWxpZXMgb24gdGhlIFZpZGVvNExpbnV4MiBhbmQgVVNCIGNvcmUgbW9kdWxlcy4gSXQgaGFzIGJlZW4KIGRlc2lnbmVkIHRvIHJ1biBwcm9wZXJseSBvbiBTTVAgc3lzdGVtcyBhcyB3ZWxsLgogCi1UaGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhlIFpDMDMwMSBkcml2ZXIgY2FuIGJlIGZvdW5kIGF0IHRoZSBmb2xsb3dpbmcgVVJMOgorVGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoZSBaQzAzMDFbUF0gZHJpdmVyIGNhbiBiZSBmb3VuZCBhdCB0aGUgZm9sbG93aW5nIFVSTDoKIGh0dHA6Ly93d3cubGludXgtcHJvamVjdHMub3JnLwogCiBTb21lIG9mIHRoZSBmZWF0dXJlcyBvZiB0aGUgZHJpdmVyIGFyZToKQEAgLTExNyw3ICsxMTcsNyBAQAogCiBBbmQgZmluYWxseToKIAotCSMgVVNCIE11bHRpbWVkaWEgZGV2aWNlcworCSMgVjRMIFVTQiBkZXZpY2VzCiAJIwogCUNPTkZJR19VU0JfWkMwMzAxPW0KIApAQCAtMTQ2LDQ2ICsxNDYsNDYgQEAKIFR5cGU6ICAgICAgICAgICBzaG9ydCBhcnJheSAobWluID0gMCwgbWF4ID0gNjQpCiBTeW50YXg6ICAgICAgICAgPC0xfG5bLC4uLl0+CiBEZXNjcmlwdGlvbjogICAgU3BlY2lmeSBWNEwyIG1pbm9yIG1vZGUgbnVtYmVyOgotICAgICAgICAgICAgICAgIC0xID0gdXNlIG5leHQgYXZhaWxhYmxlCi0gICAgICAgICAgICAgICAgIG4gPSB1c2UgbWlub3IgbnVtYmVyIG4KLSAgICAgICAgICAgICAgICBZb3UgY2FuIHNwZWNpZnkgdXAgdG8gNjQgY2FtZXJhcyB0aGlzIHdheS4KLSAgICAgICAgICAgICAgICBGb3IgZXhhbXBsZToKLSAgICAgICAgICAgICAgICB2aWRlb19ucj0tMSwyLC0xIHdvdWxkIGFzc2lnbiBtaW5vciBudW1iZXIgMiB0byB0aGUgc2Vjb25kCi0gICAgICAgICAgICAgICAgcmVnaXN0ZXJlZCBjYW1lcmEgYW5kIHVzZSBhdXRvIGZvciB0aGUgZmlyc3Qgb25lIGFuZCBmb3IgZXZlcnkKLSAgICAgICAgICAgICAgICBvdGhlciBjYW1lcmEuCisJCS0xID0gdXNlIG5leHQgYXZhaWxhYmxlCisJCSBuID0gdXNlIG1pbm9yIG51bWJlciBuCisJCVlvdSBjYW4gc3BlY2lmeSB1cCB0byA2NCBjYW1lcmFzIHRoaXMgd2F5LgorCQlGb3IgZXhhbXBsZToKKwkJdmlkZW9fbnI9LTEsMiwtMSB3b3VsZCBhc3NpZ24gbWlub3IgbnVtYmVyIDIgdG8gdGhlIHNlY29uZAorCQlyZWdpc3RlcmVkIGNhbWVyYSBhbmQgdXNlIGF1dG8gZm9yIHRoZSBmaXJzdCBvbmUgYW5kIGZvciBldmVyeQorCQlvdGhlciBjYW1lcmEuCiBEZWZhdWx0OiAgICAgICAgLTEKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIE5hbWU6ICAgICAgICAgICBmb3JjZV9tdW5tYXAKIFR5cGU6ICAgICAgICAgICBib29sIGFycmF5IChtaW4gPSAwLCBtYXggPSA2NCkKIFN5bnRheDogICAgICAgICA8MHwxWywuLi5dPgogRGVzY3JpcHRpb246ICAgIEZvcmNlIHRoZSBhcHBsaWNhdGlvbiB0byB1bm1hcCBwcmV2aW91c2x5IG1hcHBlZCBidWZmZXIgbWVtb3J5Ci0gICAgICAgICAgICAgICAgYmVmb3JlIGNhbGxpbmcgYW55IFZJRElPQ19TX0NST1Agb3IgVklESU9DX1NfRk1UIGlvY3RsJ3MuIE5vdAotICAgICAgICAgICAgICAgIGFsbCB0aGUgYXBwbGljYXRpb25zIHN1cHBvcnQgdGhpcyBmZWF0dXJlLiBUaGlzIHBhcmFtZXRlciBpcwotICAgICAgICAgICAgICAgIHNwZWNpZmljIGZvciBlYWNoIGRldGVjdGVkIGNhbWVyYS4KLSAgICAgICAgICAgICAgICAwID0gZG8gbm90IGZvcmNlIG1lbW9yeSB1bm1hcHBpbmcKLSAgICAgICAgICAgICAgICAxID0gZm9yY2UgbWVtb3J5IHVubWFwcGluZyAoc2F2ZSBtZW1vcnkpCisJCWJlZm9yZSBjYWxsaW5nIGFueSBWSURJT0NfU19DUk9QIG9yIFZJRElPQ19TX0ZNVCBpb2N0bCdzLiBOb3QKKwkJYWxsIHRoZSBhcHBsaWNhdGlvbnMgc3VwcG9ydCB0aGlzIGZlYXR1cmUuIFRoaXMgcGFyYW1ldGVyIGlzCisJCXNwZWNpZmljIGZvciBlYWNoIGRldGVjdGVkIGNhbWVyYS4KKwkJMCA9IGRvIG5vdCBmb3JjZSBtZW1vcnkgdW5tYXBwaW5nCisJCTEgPSBmb3JjZSBtZW1vcnkgdW5tYXBwaW5nIChzYXZlIG1lbW9yeSkKIERlZmF1bHQ6ICAgICAgICAwCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBOYW1lOiAgICAgICAgICAgZnJhbWVfdGltZW91dAogVHlwZTogICAgICAgICAgIHVpbnQgYXJyYXkgKG1pbiA9IDAsIG1heCA9IDY0KQogU3ludGF4OiAgICAgICAgIDxuWywuLi5dPgogRGVzY3JpcHRpb246ICAgIFRpbWVvdXQgZm9yIGEgdmlkZW8gZnJhbWUgaW4gc2Vjb25kcy4gVGhpcyBwYXJhbWV0ZXIgaXMKLSAgICAgICAgICAgICAgICBzcGVjaWZpYyBmb3IgZWFjaCBkZXRlY3RlZCBjYW1lcmEuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZQotICAgICAgICAgICAgICAgIGNoYW5nZWQgYXQgcnVudGltZSB0aGFua3MgdG8gdGhlIC9zeXMgZmlsZXN5c3RlbSBpbnRlcmZhY2UuCisJCXNwZWNpZmljIGZvciBlYWNoIGRldGVjdGVkIGNhbWVyYS4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlCisJCWNoYW5nZWQgYXQgcnVudGltZSB0aGFua3MgdG8gdGhlIC9zeXMgZmlsZXN5c3RlbSBpbnRlcmZhY2UuCiBEZWZhdWx0OiAgICAgICAgMgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogTmFtZTogICAgICAgICAgIGRlYnVnCiBUeXBlOiAgICAgICAgICAgdXNob3J0CiBTeW50YXg6ICAgICAgICAgPG4+CiBEZXNjcmlwdGlvbjogICAgRGVidWdnaW5nIGluZm9ybWF0aW9uIGxldmVsLCBmcm9tIDAgdG8gMzoKLSAgICAgICAgICAgICAgICAwID0gbm9uZSAodXNlIGNhcmVmdWxseSkKLSAgICAgICAgICAgICAgICAxID0gY3JpdGljYWwgZXJyb3JzCi0gICAgICAgICAgICAgICAgMiA9IHNpZ25pZmljYW50IGluZm9ybWF0aW9ucwotICAgICAgICAgICAgICAgIDMgPSBtb3JlIHZlcmJvc2UgbWVzc2FnZXMKLSAgICAgICAgICAgICAgICBMZXZlbCAzIGlzIHVzZWZ1bCBmb3IgdGVzdGluZyBvbmx5LCB3aGVuIG9ubHkgb25lIGRldmljZQotICAgICAgICAgICAgICAgIGlzIHVzZWQgYXQgdGhlIHNhbWUgdGltZS4gSXQgYWxzbyBzaG93cyBzb21lIG1vcmUgaW5mb3JtYXRpb25zCi0gICAgICAgICAgICAgICAgYWJvdXQgdGhlIGhhcmR3YXJlIGJlaW5nIGRldGVjdGVkLiBUaGlzIG1vZHVsZSBwYXJhbWV0ZXIgY2FuIGJlCi0gICAgICAgICAgICAgICAgY2hhbmdlZCBhdCBydW50aW1lIHRoYW5rcyB0byB0aGUgL3N5cyBmaWxlc3lzdGVtIGludGVyZmFjZS4KKwkJMCA9IG5vbmUgKHVzZSBjYXJlZnVsbHkpCisJCTEgPSBjcml0aWNhbCBlcnJvcnMKKwkJMiA9IHNpZ25pZmljYW50IGluZm9ybWF0aW9ucworCQkzID0gbW9yZSB2ZXJib3NlIG1lc3NhZ2VzCisJCUxldmVsIDMgaXMgdXNlZnVsIGZvciB0ZXN0aW5nIG9ubHksIHdoZW4gb25seSBvbmUgZGV2aWNlCisJCWlzIHVzZWQgYXQgdGhlIHNhbWUgdGltZS4gSXQgYWxzbyBzaG93cyBzb21lIG1vcmUgaW5mb3JtYXRpb25zCisJCWFib3V0IHRoZSBoYXJkd2FyZSBiZWluZyBkZXRlY3RlZC4gVGhpcyBtb2R1bGUgcGFyYW1ldGVyIGNhbiBiZQorCQljaGFuZ2VkIGF0IHJ1bnRpbWUgdGhhbmtzIHRvIHRoZSAvc3lzIGZpbGVzeXN0ZW0gaW50ZXJmYWNlLgogRGVmYXVsdDogICAgICAgIDIKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApAQCAtMjA0LDExICsyMDQsMjUgQEAKIDB4MDQxZSAgICAgMHg0MDE3CiAweDA0MWUgICAgIDB4NDAxYwogMHgwNDFlICAgICAweDQwMWUKKzB4MDQxZSAgICAgMHg0MDFmCisweDA0MWUgICAgIDB4NDAyMgogMHgwNDFlICAgICAweDQwMzQKIDB4MDQxZSAgICAgMHg0MDM1CisweDA0MWUgICAgIDB4NDAzNgorMHgwNDFlICAgICAweDQwM2EKKzB4MDQ1OCAgICAgMHg3MDA3CisweDA0NTggICAgIDB4NzAwQworMHgwNDU4ICAgICAweDcwMGYKKzB4MDQ2ZCAgICAgMHgwOGFlCisweDA1NWYgICAgIDB4ZDAwMworMHgwNTVmICAgICAweGQwMDQKIDB4MDQ2ZCAgICAgMHgwOGFlCiAweDBhYzggICAgIDB4MDMwMQorMHgwYWM4ICAgICAweDMwMWIKKzB4MGFjOCAgICAgMHgzMDNiCisweDEwZmQgICAgIDB4MDEyOAogMHgxMGZkICAgICAweDgwNTAKKzB4MTBmZCAgICAgMHg4MDRlCiAKIFRoZSBsaXN0IGFib3ZlIGRvZXMgbm90IGltcGx5IHRoYXQgYWxsIHRob3NlIGRldmljZXMgd29yayB3aXRoIHRoaXMgZHJpdmVyOiB1cAogdW50aWwgbm93IG9ubHkgdGhlIG9uZXMgdGhhdCBtb3VudCB0aGUgZm9sbG93aW5nIGltYWdlIHNlbnNvcnMgYXJlIHN1cHBvcnRlZDsKQEAgLTIxNyw2ICsyMzEsNyBAQAogTW9kZWwgICAgICAgTWFudWZhY3R1cmVyCiAtLS0tLSAgICAgICAtLS0tLS0tLS0tLS0KIFBBUzIwMkJDQiAgIFBpeEFydCBJbWFnaW5nLCBJbmMuCitQQi0wMzMwICAgICBQaG90b2JpdCBDb3Jwb3JhdGlvbgogCiAKIDkuIE5vdGVzIGZvciBWNEwyIGFwcGxpY2F0aW9uIGRldmVsb3BlcnMKQEAgLTI1MCw1ICsyNjUsNiBAQAogICBiZWVuIHRha2VuIGZyb20gdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIFpDMDMweCBWaWRlbzRMaW51eDEgZHJpdmVyIHdyaXR0ZW4KICAgYnkgQW5kcmV3IEJpcmtldHQgPGFuZHlAbm9idWdzLm9yZz47CiAtIFRoZSBpbml0aWFsaXphdGlvbiB2YWx1ZXMgb2YgdGhlIFpDMDMwMSBjb250cm9sbGVyIGNvbm5lY3RlZCB0byB0aGUgUEFTMjAyQkNCCi0gIGltYWdlIHNlbnNvciBoYXZlIGJlZW4gdGFrZW4gZnJvbSB0aGUgU1BDQTVYWCBkcml2ZXIgbWFpbnRhaW5lZCBieQotICBNaWNoZWwgWGhhYXJkIDxteGhhYXJkQG1hZ2ljLmZyPi4KKyAgYW5kIFBCLTAzMzAgaW1hZ2Ugc2Vuc29ycyBoYXZlIGJlZW4gdGFrZW4gZnJvbSB0aGUgU1BDQTVYWCBkcml2ZXIgbWFpbnRhaW5lZAorICBieSBNaWNoZWwgWGhhYXJkIDxteGhhYXJkQG1hZ2ljLmZyPjsKKy0gU3RhbmlzbGF2IExlY2hldiBkb25hdGVkIG9uZSBjYW1lcmEuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3g4Nl82NC9ib290LW9wdGlvbnMudHh0IGIvRG9jdW1lbnRhdGlvbi94ODZfNjQvYm9vdC1vcHRpb25zLnR4dAppbmRleCBmMmNkNmVmLi42ODg3ZDQ0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3g4Nl82NC9ib290LW9wdGlvbnMudHh0CisrKyBiL0RvY3VtZW50YXRpb24veDg2XzY0L2Jvb3Qtb3B0aW9ucy50eHQKQEAgLTIwNSw2ICsyMDUsMjcgQEAKICAgcGFnZXMgIFByZXJlc2VydmUgdGhhdCBtYW55IDEyOEsgcGFnZXMgZm9yIHRoZSBzb2Z0d2FyZSBJTyBib3VuY2UgYnVmZmVyaW5nLgogICBmb3JjZSAgRm9yY2UgYWxsIElPIHRocm91Z2ggdGhlIHNvZnR3YXJlIFRMQi4KIAorICBjYWxnYXJ5PVs2NGssMTI4aywyNTZrLDUxMmssMU0sMk0sNE0sOE1dCisgIGNhbGdhcnk9W3RyYW5zbGF0ZV9lbXB0eV9zbG90c10KKyAgY2FsZ2FyeT1bZGlzYWJsZT08UENJIGJ1cyBudW1iZXI+XQorCisgICAgNjRrLC4uLiw4TSAtIFNldCB0aGUgc2l6ZSBvZiBlYWNoIFBDSSBzbG90J3MgdHJhbnNsYXRpb24gdGFibGUKKyAgICB3aGVuIHVzaW5nIHRoZSBDYWxnYXJ5IElPTU1VLiBUaGlzIGlzIHRoZSBzaXplIG9mIHRoZSB0cmFuc2xhdGlvbgorICAgIHRhYmxlIGl0c2VsZiBpbiBtYWluIG1lbW9yeS4gVGhlIHNtYWxsZXN0IHRhYmxlLCA2NGssIGNvdmVycyBhbiBJTworICAgIHNwYWNlIG9mIDMyTUI7IHRoZSBsYXJnZXN0LCA4TUIgdGFibGUsIGNhbiBjb3ZlciBhbiBJTyBzcGFjZSBvZgorICAgIDRHQi4gTm9ybWFsbHkgdGhlIGtlcm5lbCB3aWxsIG1ha2UgdGhlIHJpZ2h0IGNob2ljZSBieSBpdHNlbGYuCisKKyAgICB0cmFuc2xhdGVfZW1wdHlfc2xvdHMgLSBFbmFibGUgdHJhbnNsYXRpb24gZXZlbiBvbiBzbG90cyB0aGF0IGhhdmUKKyAgICBubyBkZXZpY2VzIGF0dGFjaGVkIHRvIHRoZW0sIGluIGNhc2UgYSBkZXZpY2Ugd2lsbCBiZSBob3RwbHVnZ2VkCisgICAgaW4gdGhlIGZ1dHVyZS4KKworICAgIGRpc2FibGU9PFBDSSBidXMgbnVtYmVyPiAtIERpc2FibGUgdHJhbnNsYXRpb24gb24gYSBnaXZlbiBQSEIuIEZvcgorICAgIGV4YW1wbGUsIHRoZSBidWlsdC1pbiBncmFwaGljcyBhZGFwdGVyIHJlc2lkZXMgb24gdGhlIGZpcnN0IGJyaWRnZQorICAgIChQQ0kgYnVzIG51bWJlciAwKTsgaWYgdHJhbnNsYXRpb24gKGlzb2xhdGlvbikgaXMgZW5hYmxlZCBvbiB0aGlzCisgICAgYnJpZGdlLCBYIHNlcnZlcnMgdGhhdCBhY2Nlc3MgdGhlIGhhcmR3YXJlIGRpcmVjdGx5IGZyb20gdXNlcgorICAgIHNwYWNlIG1pZ2h0IHN0b3Agd29ya2luZy4gVXNlIHRoaXMgb3B0aW9uIGlmIHlvdSBoYXZlIGRldmljZXMgdGhhdAorICAgIGFyZSBhY2Nlc3NlZCBmcm9tIHVzZXJzcGFjZSBkaXJlY3RseSBvbiBzb21lIFBDSSBob3N0IGJyaWRnZS4KKwogRGVidWdnaW5nCiAKICAgb29wcz1wYW5pYyBBbHdheXMgcGFuaWMgb24gb29wc2VzLiBEZWZhdWx0IGlzIHRvIGp1c3Qga2lsbCB0aGUgcHJvY2VzcywKZGlmZiAtLWdpdCBhL01BSU5UQUlORVJTIGIvTUFJTlRBSU5FUlMKaW5kZXggNGRjZDJmMS4uMzFhMTM3MiAxMDA2NDQKLS0tIGEvTUFJTlRBSU5FUlMKKysrIGIvTUFJTlRBSU5FUlMKQEAgLTExMTgsNiArMTExOCwxMSBAQAogVzoJaHR0cDovL3d3dy5sbS1zZW5zb3JzLm51LwogUzoJTWFpbnRhaW5lZAogCitIQVJEV0FSRSBSQU5ET00gTlVNQkVSIEdFTkVSQVRPUiBDT1JFCitQOglNaWNoYWVsIEJ1ZXNjaAorTToJbWJAYnUzc2NoLmRlCitTOglNYWludGFpbmVkCisKIEhBUkQgRFJJVkUgQUNUSVZFIFBST1RFQ1RJT04gU1lTVEVNIChIREFQUykgRFJJVkVSCiBQOglSb2JlcnQgTG92ZQogTToJcmxvdmVAcmxvdmUub3JnCkBAIC0xMzk2LDcgKzE0MDEsOCBAQAogCiBJTlBVVCAoS0VZQk9BUkQsIE1PVVNFLCBKT1lTVElDSykgRFJJVkVSUwogUDoJRG1pdHJ5IFRvcm9raG92Ci1NOglkdG9yX2NvcmVAYW1lcml0ZWNoLm5ldAorTToJZG1pdHJ5LnRvcm9raG92QGdtYWlsLmNvbQorTToJZHRvckBtYWlsLnJ1CiBMOglsaW51eC1pbnB1dEBhdHJleS5rYXJsaW4ubWZmLmN1bmkuY3oKIEw6CWxpbnV4LWpveXN0aWNrQGF0cmV5Lmthcmxpbi5tZmYuY3VuaS5jegogVDoJZ2l0IGtlcm5lbC5vcmc6L3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9kdG9yL2lucHV0LmdpdApAQCAtMTQzNiw2ICsxNDQyLDExIEBACiBNOgl0aWdyYW5AdmVyaXRhcy5jb20KIFM6CU1haW50YWluZWQKIAorSU5URUwgSVhQNFhYIFJBTkRPTSBOVU1CRVIgR0VORVJBVE9SIFNVUFBPUlQKK1A6CURlZXBhayBTYXhlbmEKK006CWRzYXhlbmFAcGxleGl0eS5uZXQKK1M6CU1haW50YWluZWQKKwogSU5URUwgUFJPLzEwMCBFVEhFUk5FVCBTVVBQT1JUCiBQOglKb2huIFJvbmNpYWsKIE06CWpvaG4ucm9uY2lha0BpbnRlbC5jb20KQEAgLTI3MjUsNiArMjczNiwxMSBAQAogTToJaGNoQGluZnJhZGVhZC5vcmcKIFM6CU1haW50YWluZWQKIAorVEkgT01BUCBSQU5ET00gTlVNQkVSIEdFTkVSQVRPUiBTVVBQT1JUCitQOglEZWVwYWsgU2F4ZW5hCitNOglkc2F4ZW5hQHBsZXhpdHkubmV0CitTOglNYWludGFpbmVkCisKIFRJIFBBUkFMTEVMIExJTksgQ0FCTEUgRFJJVkVSCiBQOiAgICAgUm9tYWluIExpZXZpbgogTTogICAgIHJvbXNAbHBnLnRpY2FsYy5vcmcKZGlmZiAtLWdpdCBhL01ha2VmaWxlIGIvTWFrZWZpbGUKaW5kZXggMTcwMGQzZi4uZTk1NjBjNiAxMDA2NDQKLS0tIGEvTWFrZWZpbGUKKysrIGIvTWFrZWZpbGUKQEAgLTcxLDcgKzcxLDcgQEAKICMgSW4gYm90aCBjYXNlcyB0aGUgd29ya2luZyBkaXJlY3RvcnkgbXVzdCBiZSB0aGUgcm9vdCBvZiB0aGUga2VybmVsIHNyYy4KICMgMSkgTz0KICMgVXNlICJtYWtlIE89ZGlyL3RvL3N0b3JlL291dHB1dC9maWxlcy8iCi0jIAorIwogIyAyKSBTZXQgS0JVSUxEX09VVFBVVAogIyBTZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIEtCVUlMRF9PVVRQVVQgdG8gcG9pbnQgdG8gdGhlIGRpcmVjdG9yeQogIyB3aGVyZSB0aGUgb3V0cHV0IGZpbGVzIHNoYWxsIGJlIHBsYWNlZC4KQEAgLTE3OCwxOCArMTc4LDIwIEBACiAjIEFyY2hpdGVjdHVyZSBhcyBwcmVzZW50IGluIGNvbXBpbGUuaAogVVRTX01BQ0hJTkUgOj0gJChBUkNIKQogCitLQ09ORklHX0NPTkZJRwk/PSAuY29uZmlnCisKICMgU0hFTEwgdXNlZCBieSBrYnVpbGQKIENPTkZJR19TSEVMTCA6PSAkKHNoZWxsIGlmIFsgLXggIiQkQkFTSCIgXTsgdGhlbiBlY2hvICQkQkFTSDsgXAogCSAgZWxzZSBpZiBbIC14IC9iaW4vYmFzaCBdOyB0aGVuIGVjaG8gL2Jpbi9iYXNoOyBcCiAJICBlbHNlIGVjaG8gc2g7IGZpIDsgZmkpCiAKLUhPU1RDQyAgCT0gZ2NjCi1IT1NUQ1hYICAJPSBnKysKLUhPU1RDRkxBR1MJPSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1PMiAtZm9taXQtZnJhbWUtcG9pbnRlcgotSE9TVENYWEZMQUdTCT0gLU8yCitIT1NUQ0MgICAgICAgPSBnY2MKK0hPU1RDWFggICAgICA9IGcrKworSE9TVENGTEFHUyAgID0gLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtTzIgLWZvbWl0LWZyYW1lLXBvaW50ZXIKK0hPU1RDWFhGTEFHUyA9IC1PMgogCi0jIAlEZWNpZGUgd2hldGhlciB0byBidWlsZCBidWlsdC1pbiwgbW9kdWxhciwgb3IgYm90aC4KLSMJTm9ybWFsbHksIGp1c3QgZG8gYnVpbHQtaW4uCisjIERlY2lkZSB3aGV0aGVyIHRvIGJ1aWxkIGJ1aWx0LWluLCBtb2R1bGFyLCBvciBib3RoLgorIyBOb3JtYWxseSwganVzdCBkbyBidWlsdC1pbi4KIAogS0JVSUxEX01PRFVMRVMgOj0KIEtCVUlMRF9CVUlMVElOIDo9IDEKQEAgLTE5Nyw3ICsxOTksNyBAQAogIwlJZiB3ZSBoYXZlIG9ubHkgIm1ha2UgbW9kdWxlcyIsIGRvbid0IGNvbXBpbGUgYnVpbHQtaW4gb2JqZWN0cy4KICMJV2hlbiB3ZSdyZSBidWlsZGluZyBtb2R1bGVzIHdpdGggbW9kdmVyc2lvbnMsIHdlIG5lZWQgdG8gY29uc2lkZXIKICMJdGhlIGJ1aWx0LWluIG9iamVjdHMgZHVyaW5nIHRoZSBkZXNjZW5kIGFzIHdlbGwsIGluIG9yZGVyIHRvCi0jCW1ha2Ugc3VyZSB0aGUgY2hlY2tzdW1zIGFyZSB1cHRvZGF0ZSBiZWZvcmUgd2UgcmVjb3JkIHRoZW0uCisjCW1ha2Ugc3VyZSB0aGUgY2hlY2tzdW1zIGFyZSB1cCB0byBkYXRlIGJlZm9yZSB3ZSByZWNvcmQgdGhlbS4KIAogaWZlcSAoJChNQUtFQ01ER09BTFMpLG1vZHVsZXMpCiAgIEtCVUlMRF9CVUlMVElOIDo9ICQoaWYgJChDT05GSUdfTU9EVkVSU0lPTlMpLDEpCkBAIC0yMzAsNyArMjMyLDcgQEAKICMKICMgSWYgJChxdWlldCkgaXMgZW1wdHksIHRoZSB3aG9sZSBjb21tYW5kIHdpbGwgYmUgcHJpbnRlZC4KICMgSWYgaXQgaXMgc2V0IHRvICJxdWlldF8iLCBvbmx5IHRoZSBzaG9ydCB2ZXJzaW9uIHdpbGwgYmUgcHJpbnRlZC4gCi0jIElmIGl0IGlzIHNldCB0byAic2lsZW50XyIsIG5vdGhpbmcgd2lsIGJlIHByaW50ZWQgYXQgYWxsLCBzaW5jZQorIyBJZiBpdCBpcyBzZXQgdG8gInNpbGVudF8iLCBub3RoaW5nIHdpbGwgYmUgcHJpbnRlZCBhdCBhbGwsIHNpbmNlCiAjIHRoZSB2YXJpYWJsZSAkKHNpbGVudF9jbWRfY2Nfb19jKSBkb2Vzbid0IGV4aXN0LgogIwogIyBBIHNpbXBsZSB2YXJpYW50IGlzIHRvIHByZWZpeCBjb21tYW5kcyB3aXRoICQoUSkgLSB0aGF0J3MgdXNlZnVsCkBAIC0yNjUsMTAgKzI2Nyw5IEBACiAjIFdlIG5lZWQgc29tZSBnZW5lcmljIGRlZmluaXRpb25zCiBpbmNsdWRlICAkKHNyY3RyZWUpL3NjcmlwdHMvS2J1aWxkLmluY2x1ZGUKIAotIyBGb3IgbWF4aW11bSBwZXJmb3JtYW5jZSAoKyBwb3NzaWJseSByYW5kb20gYnJlYWthZ2UsIHVuY29tbWVudAotIyB0aGUgZm9sbG93aW5nKQotCi0jTUFLRUZMQUdTICs9IC1yUgorIyBEbyBub3QgdXNlIG1ha2UncyBidWlsdC1pbiBydWxlcyBhbmQgdmFyaWFibGVzCisjIFRoaXMgaW5jcmVhc2VzIHBlcmZvcm1hbmNlIGFuZCBhdm9pZCBoYXJkLXRvLWRlYnVnIGJlaGF2b3VyCitNQUtFRkxBR1MgKz0gLXJSCiAKICMgTWFrZSB2YXJpYWJsZXMgKENDLCBldGMuLi4pCiAKQEAgLTMwNSwyMSArMzA2LDIxIEBACiAKIENQUEZMQUdTICAgICAgICA6PSAtRF9fS0VSTkVMX18gJChMSU5VWElOQ0xVREUpCiAKLUNGTEFHUyAJCTo9IC1XYWxsIC1XdW5kZWYgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXRyaWdyYXBocyBcCi0JICAJICAgLWZuby1zdHJpY3QtYWxpYXNpbmcgLWZuby1jb21tb24KLUFGTEFHUwkJOj0gLURfX0FTU0VNQkxZX18KK0NGTEFHUyAgICAgICAgICA6PSAtV2FsbCAtV3VuZGVmIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby10cmlncmFwaHMgXAorICAgICAgICAgICAgICAgICAgIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1mbm8tY29tbW9uCitBRkxBR1MgICAgICAgICAgOj0gLURfX0FTU0VNQkxZX18KIAotIyBSZWFkIEtFUk5FTFJFTEVBU0UgZnJvbSAua2VybmVscmVsZWFzZSAoaWYgaXQgZXhpc3RzKQotS0VSTkVMUkVMRUFTRSA9ICQoc2hlbGwgY2F0IC5rZXJuZWxyZWxlYXNlIDI+IC9kZXYvbnVsbCkKKyMgUmVhZCBLRVJORUxSRUxFQVNFIGZyb20gaW5jbHVkZS9jb25maWcva2VybmVsLnJlbGVhc2UgKGlmIGl0IGV4aXN0cykKK0tFUk5FTFJFTEVBU0UgPSAkKHNoZWxsIGNhdCBpbmNsdWRlL2NvbmZpZy9rZXJuZWwucmVsZWFzZSAyPiAvZGV2L251bGwpCiBLRVJORUxWRVJTSU9OID0gJChWRVJTSU9OKS4kKFBBVENITEVWRUwpLiQoU1VCTEVWRUwpJChFWFRSQVZFUlNJT04pCiAKLWV4cG9ydAlWRVJTSU9OIFBBVENITEVWRUwgU1VCTEVWRUwgS0VSTkVMUkVMRUFTRSBLRVJORUxWRVJTSU9OIFwKLQlBUkNIIENPTkZJR19TSEVMTCBIT1NUQ0MgSE9TVENGTEFHUyBDUk9TU19DT01QSUxFIEFTIExEIENDIFwKLQlDUFAgQVIgTk0gU1RSSVAgT0JKQ09QWSBPQkpEVU1QIE1BS0UgQVdLIEdFTktTWU1TIFBFUkwgVVRTX01BQ0hJTkUgXAotCUhPU1RDWFggSE9TVENYWEZMQUdTIExERkxBR1NfTU9EVUxFIENIRUNLIENIRUNLRkxBR1MKK2V4cG9ydCBWRVJTSU9OIFBBVENITEVWRUwgU1VCTEVWRUwgS0VSTkVMUkVMRUFTRSBLRVJORUxWRVJTSU9OCitleHBvcnQgQVJDSCBDT05GSUdfU0hFTEwgSE9TVENDIEhPU1RDRkxBR1MgQ1JPU1NfQ09NUElMRSBBUyBMRCBDQworZXhwb3J0IENQUCBBUiBOTSBTVFJJUCBPQkpDT1BZIE9CSkRVTVAgTUFLRSBBV0sgR0VOS1NZTVMgUEVSTCBVVFNfTUFDSElORQorZXhwb3J0IEhPU1RDWFggSE9TVENYWEZMQUdTIExERkxBR1NfTU9EVUxFIENIRUNLIENIRUNLRkxBR1MKIAogZXhwb3J0IENQUEZMQUdTIE5PU1RESU5DX0ZMQUdTIExJTlVYSU5DTFVERSBPQkpDT1BZRkxBR1MgTERGTEFHUwotZXhwb3J0IENGTEFHUyBDRkxBR1NfS0VSTkVMIENGTEFHU19NT0RVTEUgCitleHBvcnQgQ0ZMQUdTIENGTEFHU19LRVJORUwgQ0ZMQUdTX01PRFVMRQogZXhwb3J0IEFGTEFHUyBBRkxBR1NfS0VSTkVMIEFGTEFHU19NT0RVTEUKIAogIyBXaGVuIGNvbXBpbGluZyBvdXQtb2YtdHJlZSBtb2R1bGVzLCBwdXQgTU9EVkVSRElSIGluIHRoZSBtb2R1bGUKQEAgLTM1NywxMiArMzU4LDEzIEBACiAjIGNhdGNoIHRoZW0gZWFybHksIGFuZCBoYW5kIHRoZW0gb3ZlciB0byBzY3JpcHRzL2tjb25maWcvTWFrZWZpbGUKICMgSXQgaXMgYWxsb3dlZCB0byBzcGVjaWZ5IG1vcmUgdGFyZ2V0cyB3aGVuIGNhbGxpbmcgbWFrZSwgaW5jbHVkaW5nCiAjIG1peGluZyAqY29uZmlnIHRhcmdldHMgYW5kIGJ1aWxkIHRhcmdldHMuCi0jIEZvciBleGFtcGxlICdtYWtlIG9sZGNvbmZpZyBhbGwnLiAKKyMgRm9yIGV4YW1wbGUgJ21ha2Ugb2xkY29uZmlnIGFsbCcuCiAjIERldGVjdCB3aGVuIG1peGVkIHRhcmdldHMgaXMgc3BlY2lmaWVkLCBhbmQgbWFrZSBhIHNlY29uZCBpbnZvY2F0aW9uCiAjIG9mIG1ha2Ugc28gLmNvbmZpZyBpcyBub3QgaW5jbHVkZWQgaW4gdGhpcyBjYXNlIGVpdGhlciAoZm9yICpjb25maWcpLgogCiBuby1kb3QtY29uZmlnLXRhcmdldHMgOj0gY2xlYW4gbXJwcm9wZXIgZGlzdGNsZWFuIFwKLQkJCSBjc2NvcGUgVEFHUyB0YWdzIGhlbHAgJWRvY3MgY2hlY2slCisJCQkgY3Njb3BlIFRBR1MgdGFncyBoZWxwICVkb2NzIGNoZWNrJSBcCisJCQkga2VybmVscmVsZWFzZSBrZXJuZWx2ZXJzaW9uCiAKIGNvbmZpZy10YXJnZXRzIDo9IDAKIG1peGVkLXRhcmdldHMgIDo9IDAKQEAgLTQwNCw5ICs0MDYsOCBAQAogZXhwb3J0IEtCVUlMRF9ERUZDT05GSUcKIAogY29uZmlnICVjb25maWc6IHNjcmlwdHNfYmFzaWMgb3V0cHV0bWFrZWZpbGUgRk9SQ0UKLQkkKFEpbWtkaXIgLXAgaW5jbHVkZS9saW51eAorCSQoUSlta2RpciAtcCBpbmNsdWRlL2xpbnV4IGluY2x1ZGUvY29uZmlnCiAJJChRKSQoTUFLRSkgJChidWlsZCk9c2NyaXB0cy9rY29uZmlnICRACi0JJChRKSQoTUFLRSkgLUMgJChzcmN0cmVlKSBLQlVJTERfU1JDPSAua2VybmVscmVsZWFzZQogCiBlbHNlCiAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtNDE2LDEzICs0MTcsMTEgQEAKIGlmZXEgKCQoS0JVSUxEX0VYVE1PRCksKQogIyBBZGRpdGlvbmFsIGhlbHBlcnMgYnVpbHQgaW4gc2NyaXB0cy8KICMgQ2FyZWZ1bGx5IGxpc3QgZGVwZW5kZW5jaWVzIHNvIHdlIGRvIG5vdCB0cnkgdG8gYnVpbGQgc2NyaXB0cyB0d2ljZQotIyBpbiBwYXJyYWxsZWwKKyMgaW4gcGFyYWxsZWwKIFBIT05ZICs9IHNjcmlwdHMKLXNjcmlwdHM6IHNjcmlwdHNfYmFzaWMgaW5jbHVkZS9jb25maWcvTUFSS0VSCitzY3JpcHRzOiBzY3JpcHRzX2Jhc2ljIGluY2x1ZGUvY29uZmlnL2F1dG8uY29uZgogCSQoUSkkKE1BS0UpICQoYnVpbGQpPSQoQCkKIAotc2NyaXB0c19iYXNpYzogaW5jbHVkZS9saW51eC9hdXRvY29uZi5oCi0KICMgT2JqZWN0cyB3ZSB3aWxsIGxpbmsgaW50byB2bWxpbnV4IC8gc3ViZGlycyB3ZSBuZWVkIHRvIHZpc2l0CiBpbml0LXkJCTo9IGluaXQvCiBkcml2ZXJzLXkJOj0gZHJpdmVycy8gc291bmQvCkBAIC00MzYsMzEgKzQzNSwzMiBAQAogCiAjIFJlYWQgaW4gZGVwZW5kZW5jaWVzIHRvIGFsbCBLY29uZmlnKiBmaWxlcywgbWFrZSBzdXJlIHRvIHJ1bgogIyBvbGRjb25maWcgaWYgY2hhbmdlcyBhcmUgZGV0ZWN0ZWQuCi0taW5jbHVkZSAua2NvbmZpZy5kCistaW5jbHVkZSBpbmNsdWRlL2NvbmZpZy9hdXRvLmNvbmYuY21kCistaW5jbHVkZSBpbmNsdWRlL2NvbmZpZy9hdXRvLmNvbmYKIAotaW5jbHVkZSAuY29uZmlnCi0KLSMgSWYgLmNvbmZpZyBuZWVkcyB0byBiZSB1cGRhdGVkLCBpdCB3aWxsIGJlIGRvbmUgdmlhIHRoZSBkZXBlbmRlbmN5Ci0jIHRoYXQgYXV0b2NvbmYgaGFzIG9uIC5jb25maWcuCiAjIFRvIGF2b2lkIGFueSBpbXBsaWNpdCBydWxlIHRvIGtpY2sgaW4sIGRlZmluZSBhbiBlbXB0eSBjb21tYW5kCi0uY29uZmlnIC5rY29uZmlnLmQ6IDsKKyQoS0NPTkZJR19DT05GSUcpIGluY2x1ZGUvY29uZmlnL2F1dG8uY29uZi5jbWQ6IDsKIAotIyBJZiAuY29uZmlnIGlzIG5ld2VyIHRoYW4gaW5jbHVkZS9saW51eC9hdXRvY29uZi5oLCBzb21lb25lIHRpbmtlcmVkCisjIElmIC5jb25maWcgaXMgbmV3ZXIgdGhhbiBpbmNsdWRlL2NvbmZpZy9hdXRvLmNvbmYsIHNvbWVvbmUgdGlua2VyZWQKICMgd2l0aCBpdCBhbmQgZm9yZ290IHRvIHJ1biBtYWtlIG9sZGNvbmZpZy4KLSMgSWYga2NvbmZpZy5kIGlzIG1pc3NpbmcgdGhlbiB3ZSBhcmUgcHJvYmFybHkgaW4gYSBjbGVhbmVkIHRyZWUgc28KKyMgaWYgYXV0by5jb25mLmNtZCBpcyBtaXNzaW5nIHRoZW4gd2UgYXJlIHByb2JhYmx5IGluIGEgY2xlYW5lZCB0cmVlIHNvCiAjIHdlIGV4ZWN1dGUgdGhlIGNvbmZpZyBzdGVwIHRvIGJlIHN1cmUgdG8gY2F0Y2ggdXBkYXRlZCBLY29uZmlnIGZpbGVzCi1pbmNsdWRlL2xpbnV4L2F1dG9jb25mLmg6IC5rY29uZmlnLmQgLmNvbmZpZwotCSQoUSlta2RpciAtcCBpbmNsdWRlL2xpbnV4CitpbmNsdWRlL2NvbmZpZy9hdXRvLmNvbmY6ICQoS0NPTkZJR19DT05GSUcpIGluY2x1ZGUvY29uZmlnL2F1dG8uY29uZi5jbWQKK2lmZXEgKCQoS0JVSUxEX0VYVE1PRCksKQogCSQoUSkkKE1BS0UpIC1mICQoc3JjdHJlZSkvTWFrZWZpbGUgc2lsZW50b2xkY29uZmlnCiBlbHNlCisJJChlcnJvciBrZXJuZWwgY29uZmlndXJhdGlvbiBub3QgdmFsaWQgLSBydW4gJ21ha2UgcHJlcGFyZScgaW4gJChzcmN0cmVlKSB0byB1cGRhdGUgaXQpCitlbmRpZgorCitlbHNlCiAjIER1bW15IHRhcmdldCBuZWVkZWQsIGJlY2F1c2UgdXNlZCBhcyBwcmVyZXF1aXNpdGUKLWluY2x1ZGUvbGludXgvYXV0b2NvbmYuaDogOworaW5jbHVkZS9jb25maWcvYXV0by5jb25mOiA7CiBlbmRpZgogCiAjIFRoZSBhbGw6IHRhcmdldCBpcyB0aGUgZGVmYXVsdCB3aGVuIG5vIHRhcmdldCBpcyBnaXZlbiBvbiB0aGUKICMgY29tbWFuZCBsaW5lLgogIyBUaGlzIGFsbG93IGEgdXNlciB0byBpc3N1ZSBvbmx5ICdtYWtlJyB0byBidWlsZCBhIGtlcm5lbCBpbmNsdWRpbmcgbW9kdWxlcwotIyBEZWZhdWx0cyB2bWxpbnV4IGJ1dCBpdCBpcyB1c3VhbGx5IG92ZXJyaWRlbiBpbiB0aGUgYXJjaCBtYWtlZmlsZQorIyBEZWZhdWx0cyB2bWxpbnV4IGJ1dCBpdCBpcyB1c3VhbGx5IG92ZXJyaWRkZW4gaW4gdGhlIGFyY2ggbWFrZWZpbGUKIGFsbDogdm1saW51eAogCiBpZmRlZiBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkUKQEAgLTQ5MiwxMSArNDkyLDExIEBACiAjIHdhcm4gYWJvdXQgQzk5IGRlY2xhcmF0aW9uIGFmdGVyIHN0YXRlbWVudAogQ0ZMQUdTICs9ICQoY2FsbCBjYy1vcHRpb24sLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQsKQogCi0jIGRpc2FibGUgcG9pbnRlciBzaWduZWRuZXNzIHdhcm5pbmdzIGluIGdjYyA0LjAKKyMgZGlzYWJsZSBwb2ludGVyIHNpZ25lZCAvIHVuc2lnbmVkIHdhcm5pbmdzIGluIGdjYyA0LjAKIENGTEFHUyArPSAkKGNhbGwgY2Mtb3B0aW9uLC1Xbm8tcG9pbnRlci1zaWduLCkKIAogIyBEZWZhdWx0IGtlcm5lbCBpbWFnZSB0byBidWlsZCB3aGVuIG5vIHNwZWNpZmljIHRhcmdldCBpcyBnaXZlbi4KLSMgS0JVSUxEX0lNQUdFIG1heSBiZSBvdmVycnVsZWQgb24gdGhlIGNvbW1hbmRsaW5lIG9yCisjIEtCVUlMRF9JTUFHRSBtYXkgYmUgb3ZlcnJ1bGVkIG9uIHRoZSBjb21tYW5kIGxpbmUgb3IKICMgc2V0IGluIHRoZSBlbnZpcm9ubWVudAogIyBBbHNvIGFueSBhc3NpZ25tZW50cyBpbiBhcmNoLyQoQVJDSCkvTWFrZWZpbGUgdGFrZSBwcmVjZWRlbmNlIG92ZXIKICMgdGhpcyBkZWZhdWx0IHZhbHVlCkBAIC01MTAsMTIgKzUxMCwyOSBAQAogIwogIyBJTlNUQUxMX01PRF9QQVRIIHNwZWNpZmllcyBhIHByZWZpeCB0byBNT0RMSUIgZm9yIG1vZHVsZSBkaXJlY3RvcnkKICMgcmVsb2NhdGlvbnMgcmVxdWlyZWQgYnkgYnVpbGQgcm9vdHMuICBUaGlzIGlzIG5vdCBkZWZpbmVkIGluIHRoZQotIyBtYWtlZmlsZSBidXQgdGhlIGFyZ3VlbWVudCBjYW4gYmUgcGFzc2VkIHRvIG1ha2UgaWYgbmVlZGVkLgorIyBtYWtlZmlsZSBidXQgdGhlIGFyZ3VtZW50IGNhbiBiZSBwYXNzZWQgdG8gbWFrZSBpZiBuZWVkZWQuCiAjCiAKIE1PRExJQgk9ICQoSU5TVEFMTF9NT0RfUEFUSCkvbGliL21vZHVsZXMvJChLRVJORUxSRUxFQVNFKQogZXhwb3J0IE1PRExJQgogCisjCisjICBJTlNUQUxMX01PRF9TVFJJUCwgaWYgZGVmaW5lZCwgd2lsbCBjYXVzZSBtb2R1bGVzIHRvIGJlCisjICBzdHJpcHBlZCBhZnRlciB0aGV5IGFyZSBpbnN0YWxsZWQuICBJZiBJTlNUQUxMX01PRF9TVFJJUCBpcyAnMScsIHRoZW4KKyMgIHRoZSBkZWZhdWx0IG9wdGlvbiAtLXN0cmlwLWRlYnVnIHdpbGwgYmUgdXNlZC4gIE90aGVyd2lzZSwKKyMgIElOU1RBTExfTU9EX1NUUklQIHdpbGwgdXNlZCBhcyB0aGUgb3B0aW9ucyB0byB0aGUgc3RyaXAgY29tbWFuZC4KKworaWZkZWYgSU5TVEFMTF9NT0RfU1RSSVAKK2lmZXEgKCQoSU5TVEFMTF9NT0RfU1RSSVApLDEpCittb2Rfc3RyaXBfY21kID0gJFNUUklQKSAtLXN0cmlwLWRlYnVnCitlbHNlCittb2Rfc3RyaXBfY21kID0gJChTVFJJUCkgJChJTlNUQUxMX01PRF9TVFJJUCkKK2VuZGlmICMgSU5TVEFMTF9NT0RfU1RSSVA9MQorZWxzZQorbW9kX3N0cmlwX2NtZCA9IHRydWUKK2VuZGlmICMgSU5TVEFMTF9NT0RfU1RSSVAKK2V4cG9ydCBtb2Rfc3RyaXBfY21kCisKIAogaWZlcSAoJChLQlVJTERfRVhUTU9EKSwpCiBjb3JlLXkJCSs9IGtlcm5lbC8gbW0vIGZzLyBpcGMvIHNlY3VyaXR5LyBjcnlwdG8vIGJsb2NrLwpAQCAtNTM5LDcgKzU1Niw3IEBACiAKICMgQnVpbGQgdm1saW51eAogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgdm1saW51eCBpcyBidWlsZCBmcm9tIHRoZSBvYmplY3RzIHNlbGVjdGVkIGJ5ICQodm1saW51eC1pbml0KSBhbmQKKyMgdm1saW51eCBpcyBidWlsdCBmcm9tIHRoZSBvYmplY3RzIHNlbGVjdGVkIGJ5ICQodm1saW51eC1pbml0KSBhbmQKICMgJCh2bWxpbnV4LW1haW4pLiBNb3N0IGFyZSBidWlsdC1pbi5vIGZpbGVzIGZyb20gdG9wLWxldmVsIGRpcmVjdG9yaWVzCiAjIGluIHRoZSBrZXJuZWwgdHJlZSwgb3RoZXJzIGFyZSBzcGVjaWZpZWQgaW4gYXJjaC8kKEFSQ0gpTWFrZWZpbGUuCiAjIE9yZGVyaW5nIHdoZW4gbGlua2luZyBpcyBpbXBvcnRhbnQsIGFuZCAkKHZtbGludXgtaW5pdCkgbXVzdCBiZSBmaXJzdC4KQEAgLTU5MCw3ICs2MDcsNyBAQAogCSQoTUFLRSkgJChidWlsZCk9aW5pdAogCiAjIEdlbmVyYXRlIFN5c3RlbS5tYXAKLXF1aWV0X2NtZF9zeXNtYXAgPSBTWVNNQVAgCitxdWlldF9jbWRfc3lzbWFwID0gU1lTTUFQCiAgICAgICBjbWRfc3lzbWFwID0gJChDT05GSUdfU0hFTEwpICQoc3JjdHJlZSkvc2NyaXB0cy9ta3N5c21hcAogCiAjIExpbmsgb2Ygdm1saW51eApAQCAtNzE5LDcgKzczNiw3IEBACiAJJChRKSQoTUFLRSkgJChidWlsZCk9JEAKIAogIyBCdWlsZCB0aGUga2VybmVsIHJlbGVhc2Ugc3RyaW5nCi0jIFRoZSBLRVJORUxSRUxFQVNFIGlzIHN0b3JlZCBpbiBhIGZpbGUgbmFtZWQgLmtlcm5lbHJlbGVhc2UKKyMgVGhlIEtFUk5FTFJFTEVBU0UgaXMgc3RvcmVkIGluIGEgZmlsZSBuYW1lZCBpbmNsdWRlL2NvbmZpZy9rZXJuZWwucmVsZWFzZQogIyB0byBiZSB1c2VkIHdoZW4gZXhlY3V0aW5nIGZvciBleGFtcGxlIG1ha2UgaW5zdGFsbCBvciBtYWtlIG1vZHVsZXNfaW5zdGFsbAogIwogIyBUYWtlIHRoZSBjb250ZW50cyBvZiBhbnkgZmlsZXMgY2FsbGVkIGxvY2FsdmVyc2lvbiogYW5kIHRoZSBjb25maWcKQEAgLTczNywxMCArNzU0LDEwIEBACiBsb2NhbHZlciA9ICQoc3Vic3QgJChzcGFjZSksLCBcCiAJICAgJChzaGVsbCBjYXQgL2Rldi9udWxsICQoX2xvY2FsdmVyKSkgXAogCSAgICQocGF0c3Vic3QgIiUiLCUsJChDT05GSUdfTE9DQUxWRVJTSU9OKSkpCi0JICAgICAgIAorCiAjIElmIENPTkZJR19MT0NBTFZFUlNJT05fQVVUTyBpcyBzZXQgc2NyaXB0cy9zZXRsb2NhbHZlcnNpb24gaXMgY2FsbGVkCiAjIGFuZCBpZiB0aGUgU0NNIGlzIGtub3cgYSB0YWcgZnJvbSB0aGUgU0NNIGlzIGFwcGVuZGVkLgotIyBUaGUgYXBwZW5kZWQgdGFnIGlzIGRldGVybWluZGVkIGJ5IHRoZSBTQ00gdXNlZC4KKyMgVGhlIGFwcGVuZGVkIHRhZyBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBTQ00gdXNlZC4KICMKICMgQ3VycmVudGx5LCBvbmx5IGdpdCBpcyBzdXBwb3J0ZWQuCiAjIE90aGVyIFNDTXMgY2FuIGVkaXQgc2NyaXB0cy9zZXRsb2NhbHZlcnNpb24gYW5kIGFkZCB0aGUgYXBwcm9wcmlhdGUKQEAgLTc1Myw5ICs3NzAsOSBAQAogCiBsb2NhbHZlci1mdWxsID0gJChsb2NhbHZlcikkKGxvY2FsdmVyLWF1dG8pCiAKLSMgU3RvcmUgKG5ldykgS0VSTkVMUkVMQVNFIHN0cmluZyBpbiAua2VybmVscmVsZWFzZQorIyBTdG9yZSAobmV3KSBLRVJORUxSRUxBU0Ugc3RyaW5nIGluIGluY2x1ZGUvY29uZmlnL2tlcm5lbC5yZWxlYXNlCiBrZXJuZWxyZWxlYXNlID0gJChLRVJORUxWRVJTSU9OKSQobG9jYWx2ZXItZnVsbCkKLS5rZXJuZWxyZWxlYXNlOiBGT1JDRQoraW5jbHVkZS9jb25maWcva2VybmVsLnJlbGVhc2U6IGluY2x1ZGUvY29uZmlnL2F1dG8uY29uZiBGT1JDRQogCSQoUSlybSAtZiAkQAogCSQoUSllY2hvICQoa2VybmVscmVsZWFzZSkgPiAkQAogCkBAIC03NzYsMTAgKzc5MywxMCBAQAogIyBhbmQgaWYgc28gZG86CiAjIDEpIENoZWNrIHRoYXQgbWFrZSBoYXMgbm90IGJlZW4gZXhlY3V0ZWQgaW4gdGhlIGtlcm5lbCBzcmMgJChzcmN0cmVlKQogIyAyKSBDcmVhdGUgdGhlIGluY2x1ZGUyIGRpcmVjdG9yeSwgdXNlZCBmb3IgdGhlIHNlY29uZCBhc20gc3ltbGluawotcHJlcGFyZTM6IC5rZXJuZWxyZWxlYXNlCitwcmVwYXJlMzogaW5jbHVkZS9jb25maWcva2VybmVsLnJlbGVhc2UKIGlmbmVxICgkKEtCVUlMRF9TUkMpLCkKIAlAZWNobyAnICBVc2luZyAkKHNyY3RyZWUpIGFzIHNvdXJjZSBmb3Iga2VybmVsJwotCSQoUSlpZiBbIC1mICQoc3JjdHJlZSkvLmNvbmZpZyBdOyB0aGVuIFwKKwkkKFEpaWYgWyAtZiAkKHNyY3RyZWUpLy5jb25maWcgLW8gLWQgJChzcmN0cmVlKS9pbmNsdWRlL2NvbmZpZyBdOyB0aGVuIFwKIAkJZWNobyAiICAkKHNyY3RyZWUpIGlzIG5vdCBjbGVhbiwgcGxlYXNlIHJ1biAnbWFrZSBtcnByb3BlciciO1wKIAkJZWNobyAiICBpbiB0aGUgJyQoc3JjdHJlZSknIGRpcmVjdG9yeS4iO1wKIAkJL2Jpbi9mYWxzZTsgXApAQCAtNzkyLDcgKzgwOSw3IEBACiBwcmVwYXJlMjogcHJlcGFyZTMgb3V0cHV0bWFrZWZpbGUKIAogcHJlcGFyZTE6IHByZXBhcmUyIGluY2x1ZGUvbGludXgvdmVyc2lvbi5oIGluY2x1ZGUvYXNtIFwKLSAgICAgICAgICAgICAgICAgICBpbmNsdWRlL2NvbmZpZy9NQVJLRVIKKyAgICAgICAgICAgICAgICAgICBpbmNsdWRlL2NvbmZpZy9hdXRvLmNvbmYKIGlmbmVxICgkKEtCVUlMRF9NT0RVTEVTKSwpCiAJJChRKW1rZGlyIC1wICQoTU9EVkVSRElSKQogCSQoUSlybSAtZiAkKE1PRFZFUkRJUikvKgpAQCAtODA2LDI3ICs4MjMsMjAgQEAKICMgQWxsIHRoZSBwcmVwYXJpbmcuLgogcHJlcGFyZSBwcmVwYXJlLWFsbDogcHJlcGFyZTAKIAotIwlMZWF2ZSB0aGlzIGFzIGRlZmF1bHQgZm9yIHByZXByb2Nlc3Npbmcgdm1saW51eC5sZHMuUywgd2hpY2ggaXMgbm93Ci0jCWRvbmUgaW4gYXJjaC8kKEFSQ0gpL2tlcm5lbC9NYWtlZmlsZQorIyBMZWF2ZSB0aGlzIGFzIGRlZmF1bHQgZm9yIHByZXByb2Nlc3Npbmcgdm1saW51eC5sZHMuUywgd2hpY2ggaXMgbm93CisjIGRvbmUgaW4gYXJjaC8kKEFSQ0gpL2tlcm5lbC9NYWtlZmlsZQogCiBleHBvcnQgQ1BQRkxBR1Nfdm1saW51eC5sZHMgKz0gLVAgLUMgLVUkKEFSQ0gpCiAKLSMgCUZJWE1FOiBUaGUgYXNtIHN5bWxpbmsgY2hhbmdlcyB3aGVuICQoQVJDSCkgY2hhbmdlcy4gVGhhdCdzCi0jCWhhcmQgdG8gZGV0ZWN0LCBidXQgSSBzdXBwb3NlICJtYWtlIG1ycHJvcGVyIiBpcyBhIGdvb2QgaWRlYQotIwliZWZvcmUgc3dpdGNoaW5nIGJldHdlZW4gYXJjaHMgYW55d2F5LgorIyBGSVhNRTogVGhlIGFzbSBzeW1saW5rIGNoYW5nZXMgd2hlbiAkKEFSQ0gpIGNoYW5nZXMuIFRoYXQncworIyBoYXJkIHRvIGRldGVjdCwgYnV0IEkgc3VwcG9zZSAibWFrZSBtcnByb3BlciIgaXMgYSBnb29kIGlkZWEKKyMgYmVmb3JlIHN3aXRjaGluZyBiZXR3ZWVuIGFyY2hzIGFueXdheS4KIAogaW5jbHVkZS9hc206CiAJQGVjaG8gJyAgU1lNTElOSyAkQCAtPiBpbmNsdWRlL2FzbS0kKEFSQ0gpJwogCSQoUSlpZiBbICEgLWQgaW5jbHVkZSBdOyB0aGVuIG1rZGlyIC1wIGluY2x1ZGU7IGZpOwogCUBsbiAtZnNuIGFzbS0kKEFSQ0gpICRACiAKLSMgCVNwbGl0IGF1dG9jb25mLmggaW50byBpbmNsdWRlL2xpbnV4L2NvbmZpZy8qCi0KLWluY2x1ZGUvY29uZmlnL01BUktFUjogc2NyaXB0cy9iYXNpYy9zcGxpdC1pbmNsdWRlIGluY2x1ZGUvbGludXgvYXV0b2NvbmYuaAotCUBlY2hvICcgIFNQTElUICAgaW5jbHVkZS9saW51eC9hdXRvY29uZi5oIC0+IGluY2x1ZGUvY29uZmlnLyonCi0JQHNjcmlwdHMvYmFzaWMvc3BsaXQtaW5jbHVkZSBpbmNsdWRlL2xpbnV4L2F1dG9jb25mLmggaW5jbHVkZS9jb25maWcKLQlAdG91Y2ggJEAKLQogIyBHZW5lcmF0ZSBzb21lIGZpbGVzCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC04NDYsNyArODU2LDcgQEAKIAkpCiBlbmRlZgogCi1pbmNsdWRlL2xpbnV4L3ZlcnNpb24uaDogJChzcmN0cmVlKS9NYWtlZmlsZSAuY29uZmlnIC5rZXJuZWxyZWxlYXNlIEZPUkNFCitpbmNsdWRlL2xpbnV4L3ZlcnNpb24uaDogJChzcmN0cmVlKS9NYWtlZmlsZSBpbmNsdWRlL2NvbmZpZy9rZXJuZWwucmVsZWFzZSBGT1JDRQogCSQoY2FsbCBmaWxlY2hrLHZlcnNpb24uaCkKIAogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTg2MCw3ICs4NzAsNyBAQAogCiBpZmRlZiBDT05GSUdfTU9EVUxFUwogCi0jIAlCeSBkZWZhdWx0LCBidWlsZCBtb2R1bGVzIGFzIHdlbGwKKyMgQnkgZGVmYXVsdCwgYnVpbGQgbW9kdWxlcyBhcyB3ZWxsCiAKIGFsbDogbW9kdWxlcwogCkBAIC05NDIsNyArOTUyLDcgQEAKIE1SUFJPUEVSX0RJUlMgICs9IGluY2x1ZGUvY29uZmlnIGluY2x1ZGUyCiBNUlBST1BFUl9GSUxFUyArPSAuY29uZmlnIC5jb25maWcub2xkIGluY2x1ZGUvYXNtIC52ZXJzaW9uIC5vbGRfdmVyc2lvbiBcCiAgICAgICAgICAgICAgICAgICBpbmNsdWRlL2xpbnV4L2F1dG9jb25mLmggaW5jbHVkZS9saW51eC92ZXJzaW9uLmggXAotCQkgIC5rZXJuZWxyZWxlYXNlIE1vZHVsZS5zeW12ZXJzIHRhZ3MgVEFHUyBjc2NvcGUqCisJCSAgTW9kdWxlLnN5bXZlcnMgdGFncyBUQUdTIGNzY29wZSoKIAogIyBjbGVhbiAtIERlbGV0ZSBtb3N0LCBidXQgbGVhdmUgZW5vdWdoIHRvIGJ1aWxkIGV4dGVybmFsIG1vZHVsZXMKICMKQEAgLTk1OCw4ICs5NjgsOSBAQAogCSQoY2FsbCBjbWQscm1kaXJzKQogCSQoY2FsbCBjbWQscm1maWxlcykKIAlAZmluZCAuICQoUkNTX0ZJTkRfSUdOT1JFKSBcCi0JIAlcKCAtbmFtZSAnKi5bb2FzXScgLW8gLW5hbWUgJyoua28nIC1vIC1uYW1lICcuKi5jbWQnIFwKLQkJLW8gLW5hbWUgJy4qLmQnIC1vIC1uYW1lICcuKi50bXAnIC1vIC1uYW1lICcqLm1vZC5jJyBcKSBcCisJCVwoIC1uYW1lICcqLltvYXNdJyAtbyAtbmFtZSAnKi5rbycgLW8gLW5hbWUgJy4qLmNtZCcgXAorCQktbyAtbmFtZSAnLiouZCcgLW8gLW5hbWUgJy4qLnRtcCcgLW8gLW5hbWUgJyoubW9kLmMnIFwKKwkJLW8gLW5hbWUgJyouc3ltdHlwZXMnIFwpIFwKIAkJLXR5cGUgZiAtcHJpbnQgfCB4YXJncyBybSAtZgogCiAjIG1ycHJvcGVyIC0gRGVsZXRlIGFsbCBnZW5lcmF0ZWQgZmlsZXMsIGluY2x1ZGluZyAuY29uZmlnCkBAIC05ODIsOSArOTkzLDkgQEAKIAogZGlzdGNsZWFuOiBtcnByb3BlcgogCUBmaW5kICQoc3JjdHJlZSkgJChSQ1NfRklORF9JR05PUkUpIFwKLQkgCVwoIC1uYW1lICcqLm9yaWcnIC1vIC1uYW1lICcqLnJlaicgLW8gLW5hbWUgJyp+JyBcCisJCVwoIC1uYW1lICcqLm9yaWcnIC1vIC1uYW1lICcqLnJlaicgLW8gLW5hbWUgJyp+JyBcCiAJCS1vIC1uYW1lICcqLmJhaycgLW8gLW5hbWUgJyMqIycgLW8gLW5hbWUgJy4qLm9yaWcnIFwKLQkgCS1vIC1uYW1lICcuKi5yZWonIC1vIC1zaXplIDAgXAorCQktbyAtbmFtZSAnLioucmVqJyAtbyAtc2l6ZSAwIFwKIAkJLW8gLW5hbWUgJyolJyAtbyAtbmFtZSAnLiouY21kJyAtbyAtbmFtZSAnY29yZScgXCkgXAogCQktdHlwZSBmIC1wcmludCB8IHhhcmdzIHJtIC1mCiAKQEAgLTk5NCw5ICsxMDA1LDkgQEAKICMgcnBtIHRhcmdldCBrZXB0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CiBwYWNrYWdlLWRpcgk6PSAkKHNyY3RyZWUpL3NjcmlwdHMvcGFja2FnZQogCi0lcGtnOiBGT1JDRQorJXBrZzogaW5jbHVkZS9jb25maWcva2VybmVsLnJlbGVhc2UgRk9SQ0UKIAkkKFEpJChNQUtFKSAkKGJ1aWxkKT0kKHBhY2thZ2UtZGlyKSAkQAotcnBtOiBGT1JDRQorcnBtOiBpbmNsdWRlL2NvbmZpZy9rZXJuZWwucmVsZWFzZSBGT1JDRQogCSQoUSkkKE1BS0UpICQoYnVpbGQpPSQocGFja2FnZS1kaXIpICRACiAKIApAQCAtMTA3Nyw3ICsxMDg4LDcgQEAKICMgbWFrZSBNPWRpciBtb2R1bGVzICAgTWFrZSBhbGwgbW9kdWxlcyBpbiBzcGVjaWZpZWQgZGlyCiAjIG1ha2UgTT1kaXIJICAgICAgIFNhbWUgYXMgJ21ha2UgTT1kaXIgbW9kdWxlcycKICMgbWFrZSBNPWRpciBtb2R1bGVzX2luc3RhbGwKLSMgICAgICAgICAgICAgICAgICAgICAgSW5zdGFsbCB0aGUgbW9kdWxlcyBidWlsZCBpbiB0aGUgbW9kdWxlIGRpcmVjdG9yeQorIyAgICAgICAgICAgICAgICAgICAgICBJbnN0YWxsIHRoZSBtb2R1bGVzIGJ1aWx0IGluIHRoZSBtb2R1bGUgZGlyZWN0b3J5CiAjICAgICAgICAgICAgICAgICAgICAgIEFzc3VtZXMgaW5zdGFsbCBkaXJlY3RvcnkgaXMgYWxyZWFkeSBjcmVhdGVkCiAKICMgV2UgYXJlIGFsd2F5cyBidWlsZGluZyBtb2R1bGVzCkBAIC0xMTM2LDcgKzExNDcsNyBAQAogY2xlYW46ICQoY2xlYW4tZGlycykKIAkkKGNhbGwgY21kLHJtZGlycykKIAlAZmluZCAkKEtCVUlMRF9FWFRNT0QpICQoUkNTX0ZJTkRfSUdOT1JFKSBcCi0JIAlcKCAtbmFtZSAnKi5bb2FzXScgLW8gLW5hbWUgJyoua28nIC1vIC1uYW1lICcuKi5jbWQnIFwKKwkJXCggLW5hbWUgJyouW29hc10nIC1vIC1uYW1lICcqLmtvJyAtbyAtbmFtZSAnLiouY21kJyBcCiAJCS1vIC1uYW1lICcuKi5kJyAtbyAtbmFtZSAnLioudG1wJyAtbyAtbmFtZSAnKi5tb2QuYycgXCkgXAogCQktdHlwZSBmIC1wcmludCB8IHhhcmdzIHJtIC1mCiAKQEAgLTExNzUsMzEgKzExODYsNDEgQEAKIEFMTElOQ0xVREVfQVJDSFMgOj0gJChBUkNIKQogZW5kaWYKIGVsc2UKLSNBbGxvdyB1c2VyIHRvIHNwZWNpZnkgb25seSBBTExTT1VSQ0VfUEFUSFMgb24gdGhlIGNvbW1hbmQgbGluZSwga2VlcGluZyBleGlzdGluZyBiZWhhdmlvdXIuCisjQWxsb3cgdXNlciB0byBzcGVjaWZ5IG9ubHkgQUxMU09VUkNFX1BBVEhTIG9uIHRoZSBjb21tYW5kIGxpbmUsIGtlZXBpbmcgZXhpc3RpbmcgYmVoYXZvdXIuCiBBTExJTkNMVURFX0FSQ0hTIDo9ICQoQUxMU09VUkNFX0FSQ0hTKQogZW5kaWYKIAogQUxMU09VUkNFX0FSQ0hTIDo9ICQoQVJDSCkKIAotZGVmaW5lIGFsbC1zb3VyY2VzCi0JKCBmaW5kICQoX19zcmN0cmVlKSAkKFJDU19GSU5EX0lHTk9SRSkgXAorZGVmaW5lIGZpbmQtc291cmNlcworICAgICAgICAoIGZpbmQgJChfX3NyY3RyZWUpICQoUkNTX0ZJTkRfSUdOT1JFKSBcCiAJICAgICAgIFwoIC1uYW1lIGluY2x1ZGUgLW8gLW5hbWUgYXJjaCBcKSAtcHJ1bmUgLW8gXAotCSAgICAgICAtbmFtZSAnKi5bY2hTXScgLXByaW50OyBcCisJICAgICAgIC1uYW1lICQxIC1wcmludDsgXAogCSAgZm9yIEFSQ0ggaW4gJChBTExTT1VSQ0VfQVJDSFMpIDsgZG8gXAogCSAgICAgICBmaW5kICQoX19zcmN0cmVlKWFyY2gvJCR7QVJDSH0gJChSQ1NfRklORF9JR05PUkUpIFwKLQkgICAgICAgICAgICAtbmFtZSAnKi5bY2hTXScgLXByaW50OyBcCisJICAgICAgICAgICAgLW5hbWUgJDEgLXByaW50OyBcCiAJICBkb25lIDsgXAogCSAgZmluZCAkKF9fc3JjdHJlZSlzZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUgJChSQ1NfRklORF9JR05PUkUpIFwKLQkgICAgICAgLW5hbWUgJyouW2NoU10nIC1wcmludDsgXAorCSAgICAgICAtbmFtZSAkMSAtcHJpbnQ7IFwKIAkgIGZpbmQgJChfX3NyY3RyZWUpaW5jbHVkZSAkKFJDU19GSU5EX0lHTk9SRSkgXAogCSAgICAgICBcKCAtbmFtZSBjb25maWcgLW8gLW5hbWUgJ2FzbS0qJyBcKSAtcHJ1bmUgXAotCSAgICAgICAtbyAtbmFtZSAnKi5bY2hTXScgLXByaW50OyBcCisJICAgICAgIC1vIC1uYW1lICQxIC1wcmludDsgXAogCSAgZm9yIEFSQ0ggaW4gJChBTExJTkNMVURFX0FSQ0hTKSA7IGRvIFwKIAkgICAgICAgZmluZCAkKF9fc3JjdHJlZSlpbmNsdWRlL2FzbS0kJHtBUkNIfSAkKFJDU19GSU5EX0lHTk9SRSkgXAotCSAgICAgICAgICAgIC1uYW1lICcqLltjaFNdJyAtcHJpbnQ7IFwKKwkgICAgICAgICAgICAtbmFtZSAkMSAtcHJpbnQ7IFwKIAkgIGRvbmUgOyBcCiAJICBmaW5kICQoX19zcmN0cmVlKWluY2x1ZGUvYXNtLWdlbmVyaWMgJChSQ1NfRklORF9JR05PUkUpIFwKLQkgICAgICAgLW5hbWUgJyouW2NoU10nIC1wcmludCApCisJICAgICAgIC1uYW1lICQxIC1wcmludCApCitlbmRlZgorCitkZWZpbmUgYWxsLXNvdXJjZXMKKwkkKGNhbGwgZmluZC1zb3VyY2VzLCcqLltjaFNdJykKK2VuZGVmCitkZWZpbmUgYWxsLWtjb25maWdzCisJJChjYWxsIGZpbmQtc291cmNlcywnS2NvbmZpZyonKQorZW5kZWYKK2RlZmluZSBhbGwtZGVmY29uZmlncworCSQoY2FsbCBmaW5kLXNvdXJjZXMsJ2RlZmNvbmZpZycpCiBlbmRlZgogCiBxdWlldF9jbWRfY3Njb3BlLWZpbGUgPSBGSUxFTFNUIGNzY29wZS5maWxlcwpAQCAtMTIxOSw3ICsxMjQwLDEzIEBACiAgICAgICAgICAgICAgICAgZWNobyAiLUkgX19pbml0ZGF0YSxfX2V4aXRkYXRhLF9fYWNxdWlyZXMsX19yZWxlYXNlcyAgXAogICAgICAgICAgICAgICAgICAgICAgIC1JIEVYUE9SVF9TWU1CT0wsRVhQT1JUX1NZTUJPTF9HUEwgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAtLWV4dHJhPStmIC0tYy1raW5kcz0rcHgiYDsgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgJChhbGwtc291cmNlcykgfCB4YXJncyBldGFncyAkJEVUQUdTRiAtYQorICAgICAgICAgICAgICAgICQoYWxsLXNvdXJjZXMpIHwgeGFyZ3MgZXRhZ3MgJCRFVEFHU0YgLWE7ICAgICAgICAgICAgIFwKKwlpZiB0ZXN0ICJ4JCRFVEFHU0YiID0geDsgdGhlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJJChhbGwta2NvbmZpZ3MpIHwgeGFyZ3MgZXRhZ3MgLWEgICAgICAgICAgICAgICAgICAgICAgXAorCQktLXJlZ2V4PScvXmNvbmZpZ1sgXHRdK1woW2EtekEtWjAtOV9dK1wpL1wxLyc7ICAgICAgICBcCisJCSQoYWxsLWRlZmNvbmZpZ3MpIHwgeGFyZ3MgZXRhZ3MgLWEgICAgICAgICAgICAgICAgICAgIFwKKwkJLS1yZWdleD0nL14jP1sgXHRdP1woQ09ORklHX1thLXpBLVowLTlfXStcKS9cMS8nOyAgICAgXAorCWZpCiBlbmRlZgogCiBUQUdTOiBGT1JDRQpAQCAtMTI1OSwxNCArMTI4NiwxNCBAQAogZW5kaWYgI2lmZXEgKCQoY29uZmlnLXRhcmdldHMpLDEpCiBlbmRpZiAjaWZlcSAoJChtaXhlZC10YXJnZXRzKSwxKQogCi1QSE9OWSArPSBjaGVja3N0YWNrCitQSE9OWSArPSBjaGVja3N0YWNrIGtlcm5lbHJlbGVhc2Uga2VybmVsdmVyc2lvbgogY2hlY2tzdGFjazoKIAkkKE9CSkRVTVApIC1kIHZtbGludXggJCQoZmluZCAuIC1uYW1lICcqLmtvJykgfCBcCiAJJChQRVJMKSAkKHNyYykvc2NyaXB0cy9jaGVja3N0YWNrLnBsICQoQVJDSCkKIAoga2VybmVscmVsZWFzZToKLQkkKGlmICQod2lsZGNhcmQgLmtlcm5lbHJlbGVhc2UpLCAkKFEpZWNobyAkKEtFUk5FTFJFTEVBU0UpLCBcCi0JJChlcnJvciBrZXJuZWxyZWxlYXNlIG5vdCB2YWxpZCAtIHJ1biAnbWFrZSAqY29uZmlnJyB0byB1cGRhdGUgaXQpKQorCSQoaWYgJCh3aWxkY2FyZCBpbmNsdWRlL2NvbmZpZy9rZXJuZWwucmVsZWFzZSksICQoUSllY2hvICQoS0VSTkVMUkVMRUFTRSksIFwKKwkkKGVycm9yIGtlcm5lbHJlbGVhc2Ugbm90IHZhbGlkIC0gcnVuICdtYWtlIHByZXBhcmUnIHRvIHVwZGF0ZSBpdCkpCiBrZXJuZWx2ZXJzaW9uOgogCUBlY2hvICQoS0VSTkVMVkVSU0lPTikKIApAQCAtMTMwMSw2ICsxMzI4LDggQEAKIAkkKFEpJChNQUtFKSAkKGJ1aWxkKT0kKGJ1aWxkLWRpcikgJCh0YXJnZXQtZGlyKSQobm90ZGlyICRAKQogJS5vOiAlLlMgcHJlcGFyZSBzY3JpcHRzIEZPUkNFCiAJJChRKSQoTUFLRSkgJChidWlsZCk9JChidWlsZC1kaXIpICQodGFyZ2V0LWRpcikkKG5vdGRpciAkQCkKKyUuc3ltdHlwZXM6ICUuYyBwcmVwYXJlIHNjcmlwdHMgRk9SQ0UKKwkkKFEpJChNQUtFKSAkKGJ1aWxkKT0kKGJ1aWxkLWRpcikgJCh0YXJnZXQtZGlyKSQobm90ZGlyICRAKQogCiAjIE1vZHVsZXMKIC8gJS86IHByZXBhcmUgc2NyaXB0cyBGT1JDRQpkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9vcHJvZmlsZS9jb21tb24uYyBiL2FyY2gvYWxwaGEvb3Byb2ZpbGUvY29tbW9uLmMKaW5kZXggYmE3ODhjZi4uOWZjMGVlYiAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9vcHJvZmlsZS9jb21tb24uYworKysgYi9hcmNoL2FscGhhL29wcm9maWxlL2NvbW1vbi5jCkBAIC0xMTIsNyArMTEyLDcgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBtb2RlbC0+bnVtX2NvdW50ZXJzOyArK2kpIHsKIAkJc3RydWN0IGRlbnRyeSAqZGlyOwotCQljaGFyIGJ1ZlszXTsKKwkJY2hhciBidWZbNF07CiAKIAkJc25wcmludGYoYnVmLCBzaXplb2YgYnVmLCAiJWQiLCBpKTsKIAkJZGlyID0gb3Byb2ZpbGVmc19ta2RpcihzYiwgcm9vdCwgYnVmKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL01ha2VmaWxlIGIvYXJjaC9hcm0vTWFrZWZpbGUKaW5kZXggMjgyYjE0ZS4uYTNiYmFhZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vTWFrZWZpbGUKQEAgLTE3Nyw3ICsxNzcsNyBAQAogIwl0aGVtIGNoYW5nZWQuICBXZSB1c2UgLmFyY2ggdG8gaW5kaWNhdGUgd2hlbiB0aGV5IHdlcmUgdXBkYXRlZAogIwlsYXN0LCBvdGhlcndpc2UgbWFrZSB1c2VzIHRoZSB0YXJnZXQgZGlyZWN0b3J5IG10aW1lLgogCi1pbmNsdWRlL2FzbS1hcm0vLmFyY2g6ICQod2lsZGNhcmQgaW5jbHVkZS9jb25maWcvYXJjaC8qLmgpIGluY2x1ZGUvY29uZmlnL01BUktFUgoraW5jbHVkZS9hc20tYXJtLy5hcmNoOiAkKHdpbGRjYXJkIGluY2x1ZGUvY29uZmlnL2FyY2gvKi5oKSBpbmNsdWRlL2NvbmZpZy9hdXRvLmNvbmYKIAlAZWNobyAnICBTWU1MSU5LIGluY2x1ZGUvYXNtLWFybS9hcmNoIC0+IGluY2x1ZGUvYXNtLWFybS8kKElOQ0RJUiknCiBpZm5lcSAoJChLQlVJTERfU1JDKSwpCiAJJChRKW1rZGlyIC1wIGluY2x1ZGUvYXNtLWFybQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29tbW9uL2xvY29tby5jIGIvYXJjaC9hcm0vY29tbW9uL2xvY29tby5jCmluZGV4IGE3ZGMxMzcuLjBkYWZiYTMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbW1vbi9sb2NvbW8uYworKysgYi9hcmNoL2FybS9jb21tb24vbG9jb21vLmMKQEAgLTYyOSwyMSArNjI5LDYgQEAKICNlbmRpZgogCiAKLSNkZWZpbmUgTENNX0FMQ19FTgkweDgwMDAKLQotdm9pZCBmcm9udGxpZ2h0X3NldChzdHJ1Y3QgbG9jb21vICpsY2hpcCwgaW50IGR1dHksIGludCB2ciwgaW50IGJwd2YpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZsY2hpcC0+bG9jaywgZmxhZ3MpOwotCWxvY29tb193cml0ZWwoYnB3ZiwgbGNoaXAtPmJhc2UgKyBMT0NPTU9fRlJPTlRMSUdIVCArIExPQ09NT19BTFMpOwotCXVkZWxheSgxMDApOwotCWxvY29tb193cml0ZWwoZHV0eSwgbGNoaXAtPmJhc2UgKyBMT0NPTU9fRlJPTlRMSUdIVCArIExPQ09NT19BTEQpOwotCWxvY29tb193cml0ZWwoYnB3ZiB8IExDTV9BTENfRU4sIGxjaGlwLT5iYXNlICsgTE9DT01PX0ZST05UTElHSFQgKyBMT0NPTU9fQUxTKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsY2hpcC0+bG9jaywgZmxhZ3MpOwotfQotCi0KIC8qKgogICoJbG9jb21vX3Byb2JlIC0gcHJvYmUgZm9yIGEgc2luZ2xlIExvQ29NbyBjaGlwLgogICoJQHBoeXNfYWRkcjogcGh5c2ljYWwgYWRkcmVzcyBvZiBkZXZpY2UuCkBAIC02OTgsMTQgKzY4MywxMCBAQAogCQkJLCBsY2hpcC0+YmFzZSArIExPQ09NT19HUEQpOwogCWxvY29tb193cml0ZWwoMCwgbGNoaXAtPmJhc2UgKyBMT0NPTU9fR0lFKTsKIAotCS8qIEZyb250TGlnaHQgKi8KKwkvKiBGcm9udGxpZ2h0ICovCiAJbG9jb21vX3dyaXRlbCgwLCBsY2hpcC0+YmFzZSArIExPQ09NT19GUk9OVExJR0hUICsgTE9DT01PX0FMUyk7CiAJbG9jb21vX3dyaXRlbCgwLCBsY2hpcC0+YmFzZSArIExPQ09NT19GUk9OVExJR0hUICsgTE9DT01PX0FMRCk7CiAKLQkvKiBTYW1lIGNvbnN0YW50cyBjYW4gYmUgdXNlZCBmb3IgY29sbGllIGFuZCBwb29kbGUKLQkgICAoZGVwZW5kaW5nIG9uIENPTkZJRyBvcHRpb25zIGluIG9yaWdpbmFsIHNoYXJwIGNvZGUpPyAqLwotCWZyb250bGlnaHRfc2V0KGxjaGlwLCAxNjMsIDAsIDE0OCk7Ci0KIAkvKiBMb25ndGltZSB0aW1lciAqLwogCWxvY29tb193cml0ZWwoMCwgbGNoaXAtPmJhc2UgKyBMT0NPTU9fTFRJTlQpOwogCS8qIFNQSSAqLwpAQCAtMTA2Myw2ICsxMDQ0LDMwIEBACiB9CiAKIC8qCisgKglGcm9udGxpZ2h0IGNvbnRyb2wKKyAqLworCitzdGF0aWMgc3RydWN0IGxvY29tbyAqbG9jb21vX2NoaXBfZHJpdmVyKHN0cnVjdCBsb2NvbW9fZGV2ICpsZGV2KTsKKwordm9pZCBsb2NvbW9fZnJvbnRsaWdodF9zZXQoc3RydWN0IGxvY29tb19kZXYgKmRldiwgaW50IGR1dHksIGludCB2ciwgaW50IGJwd2YpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgbG9jb21vICpsY2hpcCA9IGxvY29tb19jaGlwX2RyaXZlcihkZXYpOworCisJaWYgKHZyKQorCQlsb2NvbW9fZ3Bpb193cml0ZShkZXYsIExPQ09NT19HUElPX0ZMX1ZSLCAxKTsKKwllbHNlCisJCWxvY29tb19ncGlvX3dyaXRlKGRldiwgTE9DT01PX0dQSU9fRkxfVlIsIDApOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxjaGlwLT5sb2NrLCBmbGFncyk7CisJbG9jb21vX3dyaXRlbChicHdmLCBsY2hpcC0+YmFzZSArIExPQ09NT19GUk9OVExJR0hUICsgTE9DT01PX0FMUyk7CisJdWRlbGF5KDEwMCk7CisJbG9jb21vX3dyaXRlbChkdXR5LCBsY2hpcC0+YmFzZSArIExPQ09NT19GUk9OVExJR0hUICsgTE9DT01PX0FMRCk7CisJbG9jb21vX3dyaXRlbChicHdmIHwgTE9DT01PX0FMQ19FTiwgbGNoaXAtPmJhc2UgKyBMT0NPTU9fRlJPTlRMSUdIVCArIExPQ09NT19BTFMpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxjaGlwLT5sb2NrLCBmbGFncyk7Cit9CisKKy8qCiAgKglMb0NvTW8gIlJlZ2lzdGVyIEFjY2VzcyBCdXMuIgogICoKICAqCVdlIG1vZGVsIHRoaXMgYXMgYSByZWd1bGFyIGJ1cyB0eXBlLCBhbmQgaGFuZyBkZXZpY2VzIGRpcmVjdGx5CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvYmlvczMyLmMgYi9hcmNoL2FybS9rZXJuZWwvYmlvczMyLmMKaW5kZXggZGU2MDZkZi4uMzAyZmMxNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL2Jpb3MzMi5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9iaW9zMzIuYwpAQCAtNzAyLDcgKzcwMiw2IEBACiAJLyoKIAkgKiBNYXJrIHRoaXMgYXMgSU8KIAkgKi8KLQl2bWEtPnZtX2ZsYWdzIHw9IFZNX1NITSB8IFZNX0xPQ0tFRCB8IFZNX0lPOwogCXZtYS0+dm1fcGFnZV9wcm90ID0gcGdwcm90X25vbmNhY2hlZCh2bWEtPnZtX3BhZ2VfcHJvdCk7CiAKIAlpZiAocmVtYXBfcGZuX3JhbmdlKHZtYSwgdm1hLT52bV9zdGFydCwgcGh5cywKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L25hczEwMGQtcG93ZXIuYyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L25hczEwMGQtcG93ZXIuYwppbmRleCA5OWQzMzNkLi5hMzc0NWVkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9uYXMxMDBkLXBvd2VyLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvbmFzMTAwZC1wb3dlci5jCkBAIC0yMCwxMSArMjAsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAKLWV4dGVybiB2b2lkIGN0cmxfYWx0X2RlbCh2b2lkKTsKLQogc3RhdGljIGlycXJldHVybl90IG5hczEwMGRfcmVzZXRfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCS8qIFNpZ25hbCBpbml0IHRvIGRvIHRoZSBjdHJsYWx0ZGVsIGFjdGlvbiwgdGhpcyB3aWxsIGJ5cGFzcyBpbml0IGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9uc2x1Mi1wb3dlci5jIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvbnNsdTItcG93ZXIuYwppbmRleCBkODBjMzYyLi42ZDM4ZTk3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9uc2x1Mi1wb3dlci5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L25zbHUyLXBvd2VyLmMKQEAgLTIwLDExICsyMCwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KIAotZXh0ZXJuIHZvaWQgY3RybF9hbHRfZGVsKHZvaWQpOwotCiBzdGF0aWMgaXJxcmV0dXJuX3QgbnNsdTJfcG93ZXJfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCS8qIFNpZ25hbCBpbml0IHRvIGRvIHRoZSBjdHJsYWx0ZGVsIGFjdGlvbiwgdGhpcyB3aWxsIGJ5cGFzcyBpbml0IGlmCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MzIvZHJpdmVycy9wY2kvYmlvcy5jIGIvYXJjaC9jcmlzL2FyY2gtdjMyL2RyaXZlcnMvcGNpL2Jpb3MuYwppbmRleCAyNGJjMTQ5Li4xZTlkMDYyIDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvYXJjaC12MzIvZHJpdmVycy9wY2kvYmlvcy5jCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL3BjaS9iaW9zLmMKQEAgLTI3LDggKzI3LDYgQEAKIAkvKiBMZWF2ZSB2bV9wZ29mZiBhcy1pcywgdGhlIFBDSSBzcGFjZSBhZGRyZXNzIGlzIHRoZSBwaHlzaWNhbAogCSAqIGFkZHJlc3Mgb24gdGhpcyBwbGF0Zm9ybS4KIAkgKi8KLQl2bWEtPnZtX2ZsYWdzIHw9IChWTV9TSE0gfCBWTV9MT0NLRUQgfCBWTV9JTyk7Ci0KIAlwcm90ID0gcGdwcm90X3ZhbCh2bWEtPnZtX3BhZ2VfcHJvdCk7CiAJdm1hLT52bV9wYWdlX3Byb3QgPSBfX3BncHJvdChwcm90KTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L0tjb25maWcgYi9hcmNoL2kzODYvS2NvbmZpZwppbmRleCAxNTk2MTAxLi40N2MwOGJjIDEwMDY0NAotLS0gYS9hcmNoL2kzODYvS2NvbmZpZworKysgYi9hcmNoL2kzODYvS2NvbmZpZwpAQCAtMTQsNiArMTQsMTAgQEAKIAkgIDQ4NiwgNTg2LCBQZW50aXVtcywgYW5kIHZhcmlvdXMgaW5zdHJ1Y3Rpb24tc2V0LWNvbXBhdGlibGUgY2hpcHMgYnkKIAkgIEFNRCwgQ3lyaXgsIGFuZCBvdGhlcnMuCiAKK2NvbmZpZyBHRU5FUklDX1RJTUUKKwlib29sCisJZGVmYXVsdCB5CisKIGNvbmZpZyBTRU1BUEhPUkVfU0xFRVBFUlMKIAlib29sCiAJZGVmYXVsdCB5CkBAIC0zMjQsNiArMzI4LDE1IEBACiAJICBFbmFibGluZyB0aGlzIGZlYXR1cmUgd2lsbCBjYXVzZSBhIG1lc3NhZ2UgdG8gYmUgcHJpbnRlZCB3aGVuIHRoZSBQNAogCSAgZW50ZXJzIHRoZXJtYWwgdGhyb3R0bGluZy4KIAorY29uZmlnIFZNODYKKwlkZWZhdWx0IHkKKwlib29sICJFbmFibGUgVk04NiBzdXBwb3J0IiBpZiBFTUJFRERFRAorCWhlbHAKKyAgICAgICAgICBUaGlzIG9wdGlvbiBpcyByZXF1aXJlZCBieSBwcm9ncmFtcyBsaWtlIERPU0VNVSB0byBydW4gMTYtYml0IGxlZ2FjeQorCSAgY29kZSBvbiBYODYgcHJvY2Vzc29ycy4gSXQgYWxzbyBtYXkgYmUgbmVlZGVkIGJ5IHNvZnR3YXJlIGxpa2UKKyAgICAgICAgICBYRnJlZTg2IHRvIGluaXRpYWxpemUgc29tZSB2aWRlbyBjYXJkcyB2aWEgQklPUy4gRGlzYWJsaW5nIHRoaXMKKyAgICAgICAgICBvcHRpb24gc2F2ZXMgYWJvdXQgNmsuCisKIGNvbmZpZyBUT1NISUJBCiAJdHJpc3RhdGUgIlRvc2hpYmEgTGFwdG9wIHN1cHBvcnQiCiAJLS0taGVscC0tLQpAQCAtNzIxLDcgKzczNCw3IEBACiAJaGVscAogCSAga2V4ZWMgaXMgYSBzeXN0ZW0gY2FsbCB0aGF0IGltcGxlbWVudHMgdGhlIGFiaWxpdHkgdG8gc2h1dGRvd24geW91cgogCSAgY3VycmVudCBrZXJuZWwsIGFuZCB0byBzdGFydCBhbm90aGVyIGtlcm5lbC4gIEl0IGlzIGxpa2UgYSByZWJvb3QKLQkgIGJ1dCBpdCBpcyBpbmRlcGVkZW50IG9mIHRoZSBzeXN0ZW0gZmlybXdhcmUuICAgQW5kIGxpa2UgYSByZWJvb3QKKwkgIGJ1dCBpdCBpcyBpbmRlcGVuZGVudCBvZiB0aGUgc3lzdGVtIGZpcm13YXJlLiAgIEFuZCBsaWtlIGEgcmVib290CiAJICB5b3UgY2FuIHN0YXJ0IGFueSBrZXJuZWwgd2l0aCBpdCwgbm90IGp1c3QgTGludXguCiAKIAkgIFRoZSBuYW1lIGNvbWVzIGZyb20gdGhlIHNpbWlsaWFyaXR5IHRvIHRoZSBleGVjIHN5c3RlbSBjYWxsLgpAQCAtMTA0NiwxMyArMTA1OSwyNyBAQAogCXRyaXN0YXRlICJOYXRTZW1pIFNDeDIwMCBzdXBwb3J0IgogCWRlcGVuZHMgb24gIVg4Nl9WT1lBR0VSCiAJaGVscAotCSAgVGhpcyBwcm92aWRlcyBiYXNpYyBzdXBwb3J0IGZvciB0aGUgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBTQ3gyMDAKLQkgIHByb2Nlc3Nvci4gIFJpZ2h0IG5vdyB0aGlzIGlzIGp1c3QgYSBkcml2ZXIgZm9yIHRoZSBHUElPIHBpbnMuCisJICBUaGlzIHByb3ZpZGVzIGJhc2ljIHN1cHBvcnQgZm9yIE5hdGlvbmFsIFNlbWljb25kdWN0b3IncworCSAgKG5vdyBBTUQncykgR2VvZGUgcHJvY2Vzc29ycy4gIFRoZSBkcml2ZXIgcHJvYmVzIGZvciB0aGUKKwkgIFBDSS1JRHMgb2Ygc2V2ZXJhbCBvbi1jaGlwIGRldmljZXMsIHNvIGl0cyBhIGdvb2QgZGVwZW5kZW5jeQorCSAgZm9yIG90aGVyIHNjeDIwMF8qIGRyaXZlcnMuCiAKLQkgIElmIHlvdSBkb24ndCBrbm93IHdoYXQgdG8gZG8gaGVyZSwgc2F5IE4uCisJICBJZiBjb21waWxlZCBhcyBhIG1vZHVsZSwgdGhlIGRyaXZlciBpcyBuYW1lZCBzY3gyMDAuCiAKLQkgIFRoaXMgc3VwcG9ydCBpcyBhbHNvIGF2YWlsYWJsZSBhcyBhIG1vZHVsZS4gIElmIGNvbXBpbGVkIGFzIGEKLQkgIG1vZHVsZSwgaXQgd2lsbCBiZSBjYWxsZWQgc2N4MjAwLgorY29uZmlnIFNDeDIwMEhSX1RJTUVSCisJdHJpc3RhdGUgIk5hdFNlbWkgU0N4MjAwIDI3TUh6IEhpZ2gtUmVzb2x1dGlvbiBUaW1lciBTdXBwb3J0IgorCWRlcGVuZHMgb24gU0N4MjAwICYmIEdFTkVSSUNfVElNRQorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFRoaXMgZHJpdmVyIHByb3ZpZGVzIGEgY2xvY2tzb3VyY2UgYnVpbHQgdXBvbiB0aGUgb24tY2hpcAorCSAgMjdNSHogaGlnaC1yZXNvbHV0aW9uIHRpbWVyLiAgSXRzIGFsc28gYSB3b3JrYXJvdW5kIGZvcgorCSAgTlNDIEdlb2RlIFNDLTExMDAncyBidWdneSBUU0MsIHdoaWNoIGxvc2VzIHRpbWUgd2hlbiB0aGUKKwkgIHByb2Nlc3NvciBnb2VzIGlkbGUgKGFzIGlzIGRvbmUgYnkgdGhlIHNjaGVkdWxlcikuICBUaGUKKwkgIG90aGVyIHdvcmthcm91bmQgaXMgaWRsZT1wb2xsIGJvb3Qgb3B0aW9uLgorCitjb25maWcgSzhfTkIKKwlkZWZfYm9vbCB5CisJZGVwZW5kcyBvbiBBR1BfQU1ENjQKIAogc291cmNlICJkcml2ZXJzL3BjbWNpYS9LY29uZmlnIgogCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvS2NvbmZpZy5jcHUgYi9hcmNoL2kzODYvS2NvbmZpZy5jcHUKaW5kZXggZWIxMzA0OC4uMjFjOWE0ZSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L0tjb25maWcuY3B1CisrKyBiL2FyY2gvaTM4Ni9LY29uZmlnLmNwdQpAQCAtNDEsNyArNDEsNyBAQAogCSAgLSAiR2VvZGVHWDEiIGZvciBHZW9kZSBHWDEgKEN5cml4IE1lZGlhR1gpLgogCSAgLSAiR2VvZGUgR1gvTFgiIEZvciBBTUQgR2VvZGUgR1ggYW5kIExYIHByb2Nlc3NvcnMuCiAJICAtICJDeXJpeElJSS9WSUEgQzMiIGZvciBWSUEgQ3lyaXggSUlJIG9yIFZJQSBDMy4KLQkgIC0gIlZJQSBDMy0yIGZvciBWSUEgQzMtMiAiTmVoZW1pYWgiIChtb2RlbCA5IGFuZCBhYm92ZSkuCisJICAtICJWSUEgQzMtMiIgZm9yIFZJQSBDMy0yICJOZWhlbWlhaCIgKG1vZGVsIDkgYW5kIGFib3ZlKS4KIAogCSAgSWYgeW91IGRvbid0IGtub3cgd2hhdCB0byBkbywgY2hvb3NlICIzODYiLgogCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvYm9vdC9NYWtlZmlsZSBiL2FyY2gvaTM4Ni9ib290L01ha2VmaWxlCmluZGV4IDMzZTU1NDcuLmU5Nzk0NjYgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9ib290L01ha2VmaWxlCisrKyBiL2FyY2gvaTM4Ni9ib290L01ha2VmaWxlCkBAIC0xMDksOCArMTA5LDEzIEBACiBpc29pbWFnZTogJChCT09USU1BR0UpCiAJLXJtIC1yZiAkKG9iaikvaXNvaW1hZ2UKIAlta2RpciAkKG9iaikvaXNvaW1hZ2UKLQljcCBgZWNobyAvdXNyL2xpYiovc3lzbGludXgvaXNvbGludXguYmluIHwgYXdrICd7IHByaW50ICQxOyB9J2AgXAotCQkkKG9iaikvaXNvaW1hZ2UKKwlmb3IgaSBpbiBsaWIgbGliNjQgc2hhcmUgZW5kIDsgZG8gXAorCQlpZiBbIC1mIC91c3IvJCRpL3N5c2xpbnV4L2lzb2xpbnV4LmJpbiBdIDsgdGhlbiBcCisJCQljcCAvdXNyLyQkaS9zeXNsaW51eC9pc29saW51eC5iaW4gJChvYmopL2lzb2ltYWdlIDsgXAorCQkJYnJlYWsgOyBcCisJCWZpIDsgXAorCQlpZiBbICQkaSA9IGVuZCBdIDsgdGhlbiBleGl0IDEgOyBmaSA7IFwKKwlkb25lCiAJY3AgJChCT09USU1BR0UpICQob2JqKS9pc29pbWFnZS9saW51eAogCWVjaG8gJyQoaW1hZ2VfY21kbGluZSknID4gJChvYmopL2lzb2ltYWdlL2lzb2xpbnV4LmNmZwogCWlmIFsgLWYgJyQoRkRJTklUUkQpJyBdIDsgdGhlbiBcCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvYm9vdC9jb21wcmVzc2VkL21pc2MuYyBiL2FyY2gvaTM4Ni9ib290L2NvbXByZXNzZWQvbWlzYy5jCmluZGV4IGYxOWYzYTcuLmIyY2NkNTQgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9ib290L2NvbXByZXNzZWQvbWlzYy5jCisrKyBiL2FyY2gvaTM4Ni9ib290L2NvbXByZXNzZWQvbWlzYy5jCkBAIC0yNCwxNCArMjQsNiBAQAogCiAjdW5kZWYgbWVtc2V0CiAjdW5kZWYgbWVtY3B5Ci0KLS8qCi0gKiBXaHkgZG8gd2UgZG8gdGhpcz8gRG9uJ3QgYXNrIG1lLi4KLSAqCi0gKiBJbmNvbXByZWhlbnNpYmxlIGFyZSB0aGUgd2F5cyBvZiBib290bG9hZGVycy4KLSAqLwotc3RhdGljIHZvaWQqIG1lbXNldCh2b2lkICosIGludCwgc2l6ZV90KTsKLXN0YXRpYyB2b2lkKiBtZW1jcHkodm9pZCAqLCBfX2NvbnN0IHZvaWQgKiwgc2l6ZV90KTsKICNkZWZpbmUgbWVtemVybyhzLCBuKSAgICAgbWVtc2V0ICgocyksIDAsIChuKSkKIAogdHlwZWRlZiB1bnNpZ25lZCBjaGFyICB1Y2g7CkBAIC05Myw3ICs4NSw3IEBACiAjZW5kaWYKICNkZWZpbmUgUk1fU0NSRUVOX0lORk8gKCooc3RydWN0IHNjcmVlbl9pbmZvICopKHJlYWxfbW9kZSswKSkKIAotZXh0ZXJuIGNoYXIgaW5wdXRfZGF0YVtdOworZXh0ZXJuIHVuc2lnbmVkIGNoYXIgaW5wdXRfZGF0YVtdOwogZXh0ZXJuIGludCBpbnB1dF9sZW47CiAKIHN0YXRpYyBsb25nIGJ5dGVzX291dCA9IDA7CkBAIC0xMDMsNiArOTUsOSBAQAogc3RhdGljIHZvaWQgKm1hbGxvYyhpbnQgc2l6ZSk7CiBzdGF0aWMgdm9pZCBmcmVlKHZvaWQgKndoZXJlKTsKIAorc3RhdGljIHZvaWQgKm1lbXNldCh2b2lkICpzLCBpbnQgYywgdW5zaWduZWQgbik7CitzdGF0aWMgdm9pZCAqbWVtY3B5KHZvaWQgKmRlc3QsIGNvbnN0IHZvaWQgKnNyYywgdW5zaWduZWQgbik7CisKIHN0YXRpYyB2b2lkIHB1dHN0cihjb25zdCBjaGFyICopOwogCiBleHRlcm4gaW50IGVuZDsKQEAgLTIwNSw3ICsyMDAsNyBAQAogCW91dGJfcCgweGZmICYgKHBvcyA+PiAxKSwgdmlkcG9ydCsxKTsKIH0KIAotc3RhdGljIHZvaWQqIG1lbXNldCh2b2lkKiBzLCBpbnQgYywgc2l6ZV90IG4pCitzdGF0aWMgdm9pZCogbWVtc2V0KHZvaWQqIHMsIGludCBjLCB1bnNpZ25lZCBuKQogewogCWludCBpOwogCWNoYXIgKnNzID0gKGNoYXIqKXM7CkBAIC0yMTQsMTQgKzIwOSwxMyBAQAogCXJldHVybiBzOwogfQogCi1zdGF0aWMgdm9pZCogbWVtY3B5KHZvaWQqIF9fZGVzdCwgX19jb25zdCB2b2lkKiBfX3NyYywKLQkJCSAgICBzaXplX3QgX19uKQorc3RhdGljIHZvaWQqIG1lbWNweSh2b2lkKiBkZXN0LCBjb25zdCB2b2lkKiBzcmMsIHVuc2lnbmVkIG4pCiB7CiAJaW50IGk7Ci0JY2hhciAqZCA9IChjaGFyICopX19kZXN0LCAqcyA9IChjaGFyICopX19zcmM7CisJY2hhciAqZCA9IChjaGFyICopZGVzdCwgKnMgPSAoY2hhciAqKXNyYzsKIAotCWZvciAoaT0wO2k8X19uO2krKykgZFtpXSA9IHNbaV07Ci0JcmV0dXJuIF9fZGVzdDsKKwlmb3IgKGk9MDtpPG47aSsrKSBkW2ldID0gc1tpXTsKKwlyZXR1cm4gZGVzdDsKIH0KIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC0zMDksNyArMzAzLDcgQEAKICNlbHNlCiAJaWYgKChSTV9BTFRfTUVNX0sgPiBSTV9FWFRfTUVNX0sgPyBSTV9BTFRfTUVNX0sgOiBSTV9FWFRfTUVNX0spIDwgMTAyNCkgZXJyb3IoIkxlc3MgdGhhbiAyTUIgb2YgbWVtb3J5Iik7CiAjZW5kaWYKLQlvdXRwdXRfZGF0YSA9IChjaGFyICopX19QSFlTSUNBTF9TVEFSVDsgLyogTm9ybWFsbHkgUG9pbnRzIHRvIDFNICovCisJb3V0cHV0X2RhdGEgPSAodW5zaWduZWQgY2hhciAqKV9fUEhZU0lDQUxfU1RBUlQ7IC8qIE5vcm1hbGx5IFBvaW50cyB0byAxTSAqLwogCWZyZWVfbWVtX2VuZF9wdHIgPSAobG9uZylyZWFsX21vZGU7CiB9CiAKQEAgLTMyNCwxMSArMzE4LDkgQEAKICNpZmRlZiBTVEFOREFSRF9NRU1PUllfQklPU19DQUxMCiAJaWYgKFJNX0VYVF9NRU1fSyA8ICgzKjEwMjQpKSBlcnJvcigiTGVzcyB0aGFuIDRNQiBvZiBtZW1vcnkiKTsKICNlbHNlCi0JaWYgKChSTV9BTFRfTUVNX0sgPiBSTV9FWFRfTUVNX0sgPyBSTV9BTFRfTUVNX0sgOiBSTV9FWFRfTUVNX0spIDwKLQkJCSgzKjEwMjQpKQotCQllcnJvcigiTGVzcyB0aGFuIDRNQiBvZiBtZW1vcnkiKTsKKwlpZiAoKFJNX0FMVF9NRU1fSyA+IFJNX0VYVF9NRU1fSyA/IFJNX0FMVF9NRU1fSyA6IFJNX0VYVF9NRU1fSykgPCAoMyoxMDI0KSkgZXJyb3IoIkxlc3MgdGhhbiA0TUIgb2YgbWVtb3J5Iik7CiAjZW5kaWYJCi0JbXYtPmxvd19idWZmZXJfc3RhcnQgPSBvdXRwdXRfZGF0YSA9IChjaGFyICopTE9XX0JVRkZFUl9TVEFSVDsKKwltdi0+bG93X2J1ZmZlcl9zdGFydCA9IG91dHB1dF9kYXRhID0gKHVuc2lnbmVkIGNoYXIgKilMT1dfQlVGRkVSX1NUQVJUOwogCWxvd19idWZmZXJfZW5kID0gKCh1bnNpZ25lZCBpbnQpcmVhbF9tb2RlID4gTE9XX0JVRkZFUl9NQVgKIAkgID8gTE9XX0JVRkZFUl9NQVggOiAodW5zaWduZWQgaW50KXJlYWxfbW9kZSkgJiB+MHhmZmY7CiAJbG93X2J1ZmZlcl9zaXplID0gbG93X2J1ZmZlcl9lbmQgLSBMT1dfQlVGRkVSX1NUQVJUOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2Jvb3QvdmlkZW8uUyBiL2FyY2gvaTM4Ni9ib290L3ZpZGVvLlMKaW5kZXggYzkzNDNjMy4uOGMyYTZmYSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2Jvb3QvdmlkZW8uUworKysgYi9hcmNoL2kzODYvYm9vdC92aWRlby5TCkBAIC0xOTI5LDcgKzE5MjksNyBAQAogCXJldAogCiBzdG9yZV9lZGlkOgotI2lmZGVmIENPTkZJR19GQl9GSVJNV0FSRV9FRElECisjaWZkZWYgQ09ORklHX0ZJUk1XQVJFX0VESUQKIAlwdXNodwklZXMJCQkJIyBqdXN0IHNhdmUgYWxsIHJlZ2lzdGVycwogCXB1c2h3CSVheAogCXB1c2h3CSVieApAQCAtMTk0Nyw2ICsxOTQ3LDIyIEBACiAJcmVwCiAJc3Rvc2wKIAorCXB1c2h3ICAgJWVzCQkJCSMgc2F2ZSBFUworCXhvcncgICAgJWRpLCAlZGkgICAgICAgICAgICAgICAgICAgICAgICAjIFJlcG9ydCBDYXBhYmlsaXR5CisJcHVzaHcgICAlZGkKKwlwb3B3ICAgICVlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBFUzpESSBtdXN0IGJlIDA6MAorCW1vdncJJDB4NGYxNSwgJWF4CisJeG9ydwklYngsICVieAorCXhvcncJJWN4LCAlY3gKKwlpbnQJJDB4MTAKKwlwb3B3ICAgICVlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyByZXN0b3JlIEVTCisKKwljbXBiICAgICQweDAwLCAlYWggICAgICAgICAgICAgICAgICAgICAgIyBjYWxsIHN1Y2Nlc3NmdWwKKwlqbmUgICAgIG5vX2VkaWQKKworCWNtcGIgICAgJDB4NGYsICVhbCAgICAgICAgICAgICAgICAgICAgICAjIGZ1bmN0aW9uIHN1cHBvcnRlZAorCWpuZSAgICAgbm9fZWRpZAorCiAJbW92dwkkMHg0ZjE1LCAlYXggICAgICAgICAgICAgICAgICAgICMgZG8gVkJFL0REQwogCW1vdncJJDB4MDEsICVieAogCW1vdncJJDB4MDAsICVjeApAQCAtMTk1NCw2ICsxOTcwLDcgQEAKIAltb3Z3CSQweDE0MCwgJWRpCiAJaW50CSQweDEwCiAKK25vX2VkaWQ6CiAJcG9wdwklZGkJCQkJIyByZXN0b3JlIGFsbCByZWdpc3RlcnMKIAlwb3B3CSVkeAogCXBvcHcJJWN4CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvY3J5cHRvL2Flcy1pNTg2LWFzbS5TIGIvYXJjaC9pMzg2L2NyeXB0by9hZXMtaTU4Ni1hc20uUwppbmRleCA5MTFiMTUzLi5mOTQyZjBjIDEwMDY0NAotLS0gYS9hcmNoL2kzODYvY3J5cHRvL2Flcy1pNTg2LWFzbS5TCisrKyBiL2FyY2gvaTM4Ni9jcnlwdG8vYWVzLWk1ODYtYXNtLlMKQEAgLTM2LDIyICszNiwxOSBAQAogLmZpbGUgImFlcy1pNTg2LWFzbS5TIgogLnRleHQKIAotLy8gYWVzX3J2YWwgYWVzX2VuY19ibGsoY29uc3QgdW5zaWduZWQgY2hhciBpbl9ibGtbXSwgdW5zaWduZWQgY2hhciBvdXRfYmxrW10sIGNvbnN0IGFlc19jdHggY3hbMV0pLy8KLS8vIGFlc19ydmFsIGFlc19kZWNfYmxrKGNvbnN0IHVuc2lnbmVkIGNoYXIgaW5fYmxrW10sIHVuc2lnbmVkIGNoYXIgb3V0X2Jsa1tdLCBjb25zdCBhZXNfY3R4IGN4WzFdKS8vCi0JCisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CisKICNkZWZpbmUgdGxlbiAxMDI0ICAgLy8gbGVuZ3RoIG9mIGVhY2ggb2YgNCAneG9yJyBhcnJheXMgKDI1NiAzMi1iaXQgd29yZHMpCiAKLS8vIG9mZnNldHMgdG8gcGFyYW1ldGVycyB3aXRoIG9uZSByZWdpc3RlciBwdXNoZWQgb250byBzdGFjaworLyogb2Zmc2V0cyB0byBwYXJhbWV0ZXJzIHdpdGggb25lIHJlZ2lzdGVyIHB1c2hlZCBvbnRvIHN0YWNrICovCisjZGVmaW5lIHRmbSA4CisjZGVmaW5lIG91dF9ibGsgMTIKKyNkZWZpbmUgaW5fYmxrIDE2CiAKLSNkZWZpbmUgaW5fYmxrICAgIDggIC8vIGlucHV0IGJ5dGUgYXJyYXkgYWRkcmVzcyBwYXJhbWV0ZXIKLSNkZWZpbmUgb3V0X2JsayAgMTIgIC8vIG91dHB1dCBieXRlIGFycmF5IGFkZHJlc3MgcGFyYW1ldGVyCi0jZGVmaW5lIGN0eCAgICAgIDE2ICAvLyBBRVMgY29udGV4dCBzdHJ1Y3R1cmUKLQotLy8gb2Zmc2V0cyBpbiBjb250ZXh0IHN0cnVjdHVyZQotCi0jZGVmaW5lIGVrZXkgICAgIDAgICAvLyBlbmNyeXB0aW9uIGtleSBzY2hlZHVsZSBiYXNlIGFkZHJlc3MKLSNkZWZpbmUgbnJuZCAgIDI1NiAgIC8vIG51bWJlciBvZiByb3VuZHMKLSNkZWZpbmUgZGtleSAgIDI2MCAgIC8vIGRlY3J5cHRpb24ga2V5IHNjaGVkdWxlIGJhc2UgYWRkcmVzcworLyogb2Zmc2V0cyBpbiBjcnlwdG9fdGZtIHN0cnVjdHVyZSAqLworI2RlZmluZSBla2V5IChjcnlwdG9fdGZtX2N0eF9vZmZzZXQgKyAwKQorI2RlZmluZSBucm5kIChjcnlwdG9fdGZtX2N0eF9vZmZzZXQgKyAyNTYpCisjZGVmaW5lIGRrZXkgKGNyeXB0b190Zm1fY3R4X29mZnNldCArIDI2MCkKIAogLy8gcmVnaXN0ZXIgbWFwcGluZyBmb3IgZW5jcnlwdCBhbmQgZGVjcnlwdCBzdWJyb3V0aW5lcwogCkBAIC0yMjAsNiArMjE3LDcgQEAKIAlkb19jb2wgKHRhYmxlLCByNSxyMCxyMSxyNCwgcjIscjMpOwkJLyogaWR4PXI1ICovCiAKIC8vIEFFUyAoUmlqbmRhZWwpIEVuY3J5cHRpb24gU3Vicm91dGluZQorLyogdm9pZCBhZXNfZW5jX2JsayhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqb3V0X2JsaywgY29uc3QgdTggKmluX2JsaykgKi8KIAogLmdsb2JhbCAgYWVzX2VuY19ibGsKIApAQCAtMjMwLDcgKzIyOCw3IEBACiAKIGFlc19lbmNfYmxrOgogCXB1c2ggICAgJWVicAotCW1vdiAgICAgY3R4KCVlc3ApLCVlYnAgICAgICAvLyBwb2ludGVyIHRvIGNvbnRleHQKKwltb3YgICAgIHRmbSglZXNwKSwlZWJwCiAKIC8vIENBVVRJT046IHRoZSBvcmRlciBhbmQgdGhlIHZhbHVlcyB1c2VkIGluIHRoZXNlIGFzc2lnbnMgCiAvLyByZWx5IG9uIHRoZSByZWdpc3RlciBtYXBwaW5ncwpAQCAtMjk1LDYgKzI5Myw3IEBACiAJcmV0CiAKIC8vIEFFUyAoUmlqbmRhZWwpIERlY3J5cHRpb24gU3Vicm91dGluZQorLyogdm9pZCBhZXNfZGVjX2JsayhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqb3V0X2JsaywgY29uc3QgdTggKmluX2JsaykgKi8KIAogLmdsb2JhbCAgYWVzX2RlY19ibGsKIApAQCAtMzA1LDcgKzMwNCw3IEBACiAKIGFlc19kZWNfYmxrOgogCXB1c2ggICAgJWVicAotCW1vdiAgICAgY3R4KCVlc3ApLCVlYnAgICAgICAgLy8gcG9pbnRlciB0byBjb250ZXh0CisJbW92ICAgICB0Zm0oJWVzcCksJWVicAogCiAvLyBDQVVUSU9OOiB0aGUgb3JkZXIgYW5kIHRoZSB2YWx1ZXMgdXNlZCBpbiB0aGVzZSBhc3NpZ25zIAogLy8gcmVseSBvbiB0aGUgcmVnaXN0ZXIgbWFwcGluZ3MKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9jcnlwdG8vYWVzLmMgYi9hcmNoL2kzODYvY3J5cHRvL2Flcy5jCmluZGV4IGE1MDM5N2IuLmQzODA2ZGEgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9jcnlwdG8vYWVzLmMKKysrIGIvYXJjaC9pMzg2L2NyeXB0by9hZXMuYwpAQCAtNDUsOCArNDUsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KIAotYXNtbGlua2FnZSB2b2lkIGFlc19lbmNfYmxrKGNvbnN0IHU4ICpzcmMsIHU4ICpkc3QsIHZvaWQgKmN0eCk7Ci1hc21saW5rYWdlIHZvaWQgYWVzX2RlY19ibGsoY29uc3QgdTggKnNyYywgdTggKmRzdCwgdm9pZCAqY3R4KTsKK2FzbWxpbmthZ2Ugdm9pZCBhZXNfZW5jX2JsayhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqZHN0LCBjb25zdCB1OCAqc3JjKTsKK2FzbWxpbmthZ2Ugdm9pZCBhZXNfZGVjX2JsayhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqZHN0LCBjb25zdCB1OCAqc3JjKTsKIAogI2RlZmluZSBBRVNfTUlOX0tFWV9TSVpFCTE2CiAjZGVmaW5lIEFFU19NQVhfS0VZX1NJWkUJMzIKQEAgLTM3OCwxMiArMzc4LDEyIEBACiAJa1s4KihpKSsxMV0gPSBzc1szXTsJCQkJCQlcCiB9CiAKLXN0YXRpYyBpbnQKLWFlc19zZXRfa2V5KHZvaWQgKmN0eF9hcmcsIGNvbnN0IHU4ICppbl9rZXksIHVuc2lnbmVkIGludCBrZXlfbGVuLCB1MzIgKmZsYWdzKQorc3RhdGljIGludCBhZXNfc2V0X2tleShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCBjb25zdCB1OCAqaW5fa2V5LAorCQkgICAgICAgdW5zaWduZWQgaW50IGtleV9sZW4sIHUzMiAqZmxhZ3MpCiB7CiAJaW50IGk7CiAJdTMyIHNzWzhdOwotCXN0cnVjdCBhZXNfY3R4ICpjdHggPSBjdHhfYXJnOworCXN0cnVjdCBhZXNfY3R4ICpjdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOwogCWNvbnN0IF9fbGUzMiAqa2V5ID0gKGNvbnN0IF9fbGUzMiAqKWluX2tleTsKIAogCS8qIGVuY3J5cHRpb24gc2NoZWR1bGUgKi8KQEAgLTQ2NCwxNSArNDY0LDE1IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBhZXNfZW5jcnlwdCh2b2lkICpjdHgsIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpCitzdGF0aWMgdm9pZCBhZXNfZW5jcnlwdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqZHN0LCBjb25zdCB1OCAqc3JjKQogewotCWFlc19lbmNfYmxrKHNyYywgZHN0LCBjdHgpOwotfQotc3RhdGljIGlubGluZSB2b2lkIGFlc19kZWNyeXB0KHZvaWQgKmN0eCwgdTggKmRzdCwgY29uc3QgdTggKnNyYykKLXsKLQlhZXNfZGVjX2JsayhzcmMsIGRzdCwgY3R4KTsKKwlhZXNfZW5jX2Jsayh0Zm0sIGRzdCwgc3JjKTsKIH0KIAorc3RhdGljIHZvaWQgYWVzX2RlY3J5cHQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKmRzdCwgY29uc3QgdTggKnNyYykKK3sKKwlhZXNfZGVjX2Jsayh0Zm0sIGRzdCwgc3JjKTsKK30KIAogc3RhdGljIHN0cnVjdCBjcnlwdG9fYWxnIGFlc19hbGcgPSB7CiAJLmNyYV9uYW1lCQk9CSJhZXMiLApkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9NYWtlZmlsZSBiL2FyY2gvaTM4Ni9rZXJuZWwvTWFrZWZpbGUKaW5kZXggOTZmYjhhMC4uNWU3MGMyZiAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9NYWtlZmlsZQorKysgYi9hcmNoL2kzODYva2VybmVsL01ha2VmaWxlCkBAIC03LDEwICs3LDkgQEAKIG9iai15CTo9IHByb2Nlc3MubyBzZW1hcGhvcmUubyBzaWduYWwubyBlbnRyeS5vIHRyYXBzLm8gaXJxLm8gXAogCQlwdHJhY2UubyB0aW1lLm8gaW9wb3J0Lm8gbGR0Lm8gc2V0dXAubyBpODI1OS5vIHN5c19pMzg2Lm8gXAogCQlwY2ktZG1hLm8gaTM4Nl9rc3ltcy5vIGkzODcubyBib290ZmxhZy5vIFwKLQkJcXVpcmtzLm8gaTgyMzcubyB0b3BvbG9neS5vIGFsdGVybmF0aXZlLm8KKwkJcXVpcmtzLm8gaTgyMzcubyB0b3BvbG9neS5vIGFsdGVybmF0aXZlLm8gaTgyNTMubyB0c2MubwogCiBvYmoteQkJCQkrPSBjcHUvCi1vYmoteQkJCQkrPSB0aW1lcnMvCiBvYmoteQkJCQkrPSBhY3BpLwogb2JqLSQoQ09ORklHX1g4Nl9CSU9TX1JFQk9PVCkJKz0gcmVib290Lm8KIG9iai0kKENPTkZJR19NQ0EpCQkrPSBtY2EubwpAQCAtMzcsNiArMzYsOCBAQAogb2JqLSQoQ09ORklHX0RPVUJMRUZBVUxUKSAJKz0gZG91YmxlZmF1bHQubwogb2JqLSQoQ09ORklHX1ZNODYpCQkrPSB2bTg2Lm8KIG9iai0kKENPTkZJR19FQVJMWV9QUklOVEspCSs9IGVhcmx5X3ByaW50ay5vCitvYmotJChDT05GSUdfSFBFVF9USU1FUikgCSs9IGhwZXQubworb2JqLSQoQ09ORklHX0s4X05CKQkJKz0gazgubwogCiBFWFRSQV9BRkxBR1MgICA6PSAtdHJhZGl0aW9uYWwKIApAQCAtNzYsMyArNzcsNiBAQAogJChvYmopL3ZzeXNjYWxsLXN5bXMubzogJChzcmMpL3ZzeXNjYWxsLmxkcyBcCiAJCQkkKG9iaikvdnN5c2NhbGwtc3lzZW50ZXIubyAkKG9iaikvdnN5c2NhbGwtbm90ZS5vIEZPUkNFCiAJJChjYWxsIGlmX2NoYW5nZWQsc3lzY2FsbCkKKworazgteSAgICAgICAgICAgICAgICAgICAgICArPSAuLi8uLi94ODZfNjQva2VybmVsL2s4Lm8KKwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9hbHRlcm5hdGl2ZS5jIGIvYXJjaC9pMzg2L2tlcm5lbC9hbHRlcm5hdGl2ZS5jCmluZGV4IDVjYmQ2ZjkuLjUwZWIwZTAgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvYWx0ZXJuYXRpdmUuYworKysgYi9hcmNoL2kzODYva2VybmVsL2FsdGVybmF0aXZlLmMKQEAgLTQsMjcgKzQsNDEgQEAKICNpbmNsdWRlIDxhc20vYWx0ZXJuYXRpdmUuaD4KICNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KIAotI2RlZmluZSBERUJVRyAwCi0jaWYgREVCVUcKLSMgZGVmaW5lIERQUklOVEsoZm10LCBhcmdzLi4uKSBwcmludGsoZm10LCBhcmdzKQotI2Vsc2UKLSMgZGVmaW5lIERQUklOVEsoZm10LCBhcmdzLi4uKQotI2VuZGlmCitzdGF0aWMgaW50IG5vX3JlcGxhY2VtZW50ICAgID0gMDsKK3N0YXRpYyBpbnQgc21wX2FsdF9vbmNlICAgICAgPSAwOworc3RhdGljIGludCBkZWJ1Z19hbHRlcm5hdGl2ZSA9IDA7CiAKK3N0YXRpYyBpbnQgX19pbml0IG5vcmVwbGFjZW1lbnRfc2V0dXAoY2hhciAqcykKK3sKKwlub19yZXBsYWNlbWVudCA9IDE7CisJcmV0dXJuIDE7Cit9CitzdGF0aWMgaW50IF9faW5pdCBib290b25seShjaGFyICpzdHIpCit7CisJc21wX2FsdF9vbmNlID0gMTsKKwlyZXR1cm4gMTsKK30KK3N0YXRpYyBpbnQgX19pbml0IGRlYnVnX2FsdChjaGFyICpzdHIpCit7CisJZGVidWdfYWx0ZXJuYXRpdmUgPSAxOworCXJldHVybiAxOworfQorCitfX3NldHVwKCJub3JlcGxhY2VtZW50Iiwgbm9yZXBsYWNlbWVudF9zZXR1cCk7CitfX3NldHVwKCJzbXAtYWx0LWJvb3QiLCBib290b25seSk7CitfX3NldHVwKCJkZWJ1Zy1hbHRlcm5hdGl2ZSIsIGRlYnVnX2FsdCk7CisKKyNkZWZpbmUgRFBSSU5USyhmbXQsIGFyZ3MuLi4pIGlmIChkZWJ1Z19hbHRlcm5hdGl2ZSkgXAorCXByaW50ayhLRVJOX0RFQlVHIGZtdCwgYXJncykKKworI2lmZGVmIEdFTkVSSUNfTk9QMQogLyogVXNlIGlubGluZSBhc3NlbWJseSB0byBkZWZpbmUgdGhpcyBiZWNhdXNlIHRoZSBub3BzIGFyZSBkZWZpbmVkCiAgICBhcyBpbmxpbmUgYXNzZW1ibHkgc3RyaW5ncyBpbiB0aGUgaW5jbHVkZSBmaWxlcyBhbmQgd2UgY2Fubm90CiAgICBnZXQgdGhlbSBlYXNpbHkgaW50byBzdHJpbmdzLiAqLwogYXNtKCJcdC5kYXRhXG5pbnRlbG5vcHM6ICIKIAlHRU5FUklDX05PUDEgR0VORVJJQ19OT1AyIEdFTkVSSUNfTk9QMyBHRU5FUklDX05PUDQgR0VORVJJQ19OT1A1IEdFTkVSSUNfTk9QNgogCUdFTkVSSUNfTk9QNyBHRU5FUklDX05PUDgpOwotYXNtKCJcdC5kYXRhXG5rOG5vcHM6ICIKLQlLOF9OT1AxIEs4X05PUDIgSzhfTk9QMyBLOF9OT1A0IEs4X05PUDUgSzhfTk9QNgotCUs4X05PUDcgSzhfTk9QOCk7Ci1hc20oIlx0LmRhdGFcbms3bm9wczogIgotCUs3X05PUDEgSzdfTk9QMiBLN19OT1AzIEs3X05PUDQgSzdfTk9QNSBLN19OT1A2Ci0JSzdfTk9QNyBLN19OT1A4KTsKLQotZXh0ZXJuIHVuc2lnbmVkIGNoYXIgaW50ZWxub3BzW10sIGs4bm9wc1tdLCBrN25vcHNbXTsKK2V4dGVybiB1bnNpZ25lZCBjaGFyIGludGVsbm9wc1tdOwogc3RhdGljIHVuc2lnbmVkIGNoYXIgKmludGVsX25vcHNbQVNNX05PUF9NQVgrMV0gPSB7CiAJTlVMTCwKIAlpbnRlbG5vcHMsCkBAIC0zNiw2ICs1MCwxMyBAQAogCWludGVsbm9wcyArIDEgKyAyICsgMyArIDQgKyA1ICsgNiwKIAlpbnRlbG5vcHMgKyAxICsgMiArIDMgKyA0ICsgNSArIDYgKyA3LAogfTsKKyNlbmRpZgorCisjaWZkZWYgSzhfTk9QMQorYXNtKCJcdC5kYXRhXG5rOG5vcHM6ICIKKwlLOF9OT1AxIEs4X05PUDIgSzhfTk9QMyBLOF9OT1A0IEs4X05PUDUgSzhfTk9QNgorCUs4X05PUDcgSzhfTk9QOCk7CitleHRlcm4gdW5zaWduZWQgY2hhciBrOG5vcHNbXTsKIHN0YXRpYyB1bnNpZ25lZCBjaGFyICprOF9ub3BzW0FTTV9OT1BfTUFYKzFdID0gewogCU5VTEwsCiAJazhub3BzLApAQCAtNDcsNiArNjgsMTMgQEAKIAlrOG5vcHMgKyAxICsgMiArIDMgKyA0ICsgNSArIDYsCiAJazhub3BzICsgMSArIDIgKyAzICsgNCArIDUgKyA2ICsgNywKIH07CisjZW5kaWYKKworI2lmZGVmIEs3X05PUDEKK2FzbSgiXHQuZGF0YVxuazdub3BzOiAiCisJSzdfTk9QMSBLN19OT1AyIEs3X05PUDMgSzdfTk9QNCBLN19OT1A1IEs3X05PUDYKKwlLN19OT1A3IEs3X05PUDgpOworZXh0ZXJuIHVuc2lnbmVkIGNoYXIgazdub3BzW107CiBzdGF0aWMgdW5zaWduZWQgY2hhciAqazdfbm9wc1tBU01fTk9QX01BWCsxXSA9IHsKIAlOVUxMLAogCWs3bm9wcywKQEAgLTU4LDYgKzg2LDE4IEBACiAJazdub3BzICsgMSArIDIgKyAzICsgNCArIDUgKyA2LAogCWs3bm9wcyArIDEgKyAyICsgMyArIDQgKyA1ICsgNiArIDcsCiB9OworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfWDg2XzY0CisKK2V4dGVybiBjaGFyIF9fdnN5c2NhbGxfMDsKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhcioqIGZpbmRfbm9wX3RhYmxlKHZvaWQpCit7CisJcmV0dXJuIGs4X25vcHM7Cit9CisKKyNlbHNlIC8qIENPTkZJR19YODZfNjQgKi8KKwogc3RhdGljIHN0cnVjdCBub3AgewogCWludCBjcHVpZDsKIAl1bnNpZ25lZCBjaGFyICoqbm9wdGFibGU7CkBAIC02NywxNCArMTA3LDYgQEAKIAl7IC0xLCBOVUxMIH0KIH07CiAKLQotZXh0ZXJuIHN0cnVjdCBhbHRfaW5zdHIgX19hbHRfaW5zdHJ1Y3Rpb25zW10sIF9fYWx0X2luc3RydWN0aW9uc19lbmRbXTsKLWV4dGVybiBzdHJ1Y3QgYWx0X2luc3RyIF9fc21wX2FsdF9pbnN0cnVjdGlvbnNbXSwgX19zbXBfYWx0X2luc3RydWN0aW9uc19lbmRbXTsKLWV4dGVybiB1OCAqX19zbXBfbG9ja3NbXSwgKl9fc21wX2xvY2tzX2VuZFtdOwotCi1leHRlcm4gdTggX19zbXBfYWx0X2JlZ2luW10sIF9fc21wX2FsdF9lbmRbXTsKLQotCiBzdGF0aWMgdW5zaWduZWQgY2hhcioqIGZpbmRfbm9wX3RhYmxlKHZvaWQpCiB7CiAJdW5zaWduZWQgY2hhciAqKm5vcHRhYmxlID0gaW50ZWxfbm9wczsKQEAgLTg5LDYgKzEyMSwxNCBAQAogCXJldHVybiBub3B0YWJsZTsKIH0KIAorI2VuZGlmIC8qIENPTkZJR19YODZfNjQgKi8KKworZXh0ZXJuIHN0cnVjdCBhbHRfaW5zdHIgX19hbHRfaW5zdHJ1Y3Rpb25zW10sIF9fYWx0X2luc3RydWN0aW9uc19lbmRbXTsKK2V4dGVybiBzdHJ1Y3QgYWx0X2luc3RyIF9fc21wX2FsdF9pbnN0cnVjdGlvbnNbXSwgX19zbXBfYWx0X2luc3RydWN0aW9uc19lbmRbXTsKK2V4dGVybiB1OCAqX19zbXBfbG9ja3NbXSwgKl9fc21wX2xvY2tzX2VuZFtdOworCitleHRlcm4gdTggX19zbXBfYWx0X2JlZ2luW10sIF9fc21wX2FsdF9lbmRbXTsKKwogLyogUmVwbGFjZSBpbnN0cnVjdGlvbnMgd2l0aCBiZXR0ZXIgYWx0ZXJuYXRpdmVzIGZvciB0aGlzIENQVSB0eXBlLgogICAgVGhpcyBydW5zIGJlZm9yZSBTTVAgaXMgaW5pdGlhbGl6ZWQgdG8gYXZvaWQgU01QIHByb2JsZW1zIHdpdGgKICAgIHNlbGYgbW9kaWZ5aW5nIGNvZGUuIFRoaXMgaW1wbGllcyB0aGF0IGFzc3ltZXRyaWMgc3lzdGVtcyB3aGVyZQpAQCAtOTksNiArMTM5LDcgQEAKIHsKIAl1bnNpZ25lZCBjaGFyICoqbm9wdGFibGUgPSBmaW5kX25vcF90YWJsZSgpOwogCXN0cnVjdCBhbHRfaW5zdHIgKmE7CisJdTggKmluc3RyOwogCWludCBkaWZmLCBpLCBrOwogCiAJRFBSSU5USygiJXM6IGFsdCB0YWJsZSAlcCAtPiAlcFxuIiwgX19GVU5DVElPTl9fLCBzdGFydCwgZW5kKTsKQEAgLTEwNiw3ICsxNDcsMTYgQEAKIAkJQlVHX09OKGEtPnJlcGxhY2VtZW50bGVuID4gYS0+aW5zdHJsZW4pOwogCQlpZiAoIWJvb3RfY3B1X2hhcyhhLT5jcHVpZCkpCiAJCQljb250aW51ZTsKLQkJbWVtY3B5KGEtPmluc3RyLCBhLT5yZXBsYWNlbWVudCwgYS0+cmVwbGFjZW1lbnRsZW4pOworCQlpbnN0ciA9IGEtPmluc3RyOworI2lmZGVmIENPTkZJR19YODZfNjQKKwkJLyogdnN5c2NhbGwgY29kZSBpcyBub3QgbWFwcGVkIHlldC4gcmVzb2x2ZSBpdCBtYW51YWxseS4gKi8KKwkJaWYgKGluc3RyID49ICh1OCAqKVZTWVNDQUxMX1NUQVJUICYmIGluc3RyIDwgKHU4KilWU1lTQ0FMTF9FTkQpIHsKKwkJCWluc3RyID0gX192YShpbnN0ciAtICh1OCopVlNZU0NBTExfU1RBUlQgKyAodTgqKV9fcGFfc3ltYm9sKCZfX3ZzeXNjYWxsXzApKTsKKwkJCURQUklOVEsoIiVzOiB2c3lzY2FsbCBmaXh1cDogJXAgPT4gJXBcbiIsCisJCQkJX19GVU5DVElPTl9fLCBhLT5pbnN0ciwgaW5zdHIpOworCQl9CisjZW5kaWYKKwkJbWVtY3B5KGluc3RyLCBhLT5yZXBsYWNlbWVudCwgYS0+cmVwbGFjZW1lbnRsZW4pOwogCQlkaWZmID0gYS0+aW5zdHJsZW4gLSBhLT5yZXBsYWNlbWVudGxlbjsKIAkJLyogUGFkIHRoZSByZXN0IHdpdGggbm9wcyAqLwogCQlmb3IgKGkgPSBhLT5yZXBsYWNlbWVudGxlbjsgZGlmZiA+IDA7IGRpZmYgLT0gaywgaSArPSBrKSB7CkBAIC0xODYsMTQgKzIzNiw2IEBACiBzdGF0aWMgTElTVF9IRUFEKHNtcF9hbHRfbW9kdWxlcyk7CiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHNtcF9hbHQpOwogCi1zdGF0aWMgaW50IHNtcF9hbHRfb25jZSA9IDA7Ci1zdGF0aWMgaW50IF9faW5pdCBib290b25seShjaGFyICpzdHIpCi17Ci0Jc21wX2FsdF9vbmNlID0gMTsKLQlyZXR1cm4gMTsKLX0KLV9fc2V0dXAoInNtcC1hbHQtYm9vdCIsIGJvb3Rvbmx5KTsKLQogdm9pZCBhbHRlcm5hdGl2ZXNfc21wX21vZHVsZV9hZGQoc3RydWN0IG1vZHVsZSAqbW9kLCBjaGFyICpuYW1lLAogCQkJCSB2b2lkICpsb2Nrcywgdm9pZCAqbG9ja3NfZW5kLAogCQkJCSB2b2lkICp0ZXh0LCAgdm9pZCAqdGV4dF9lbmQpCkBAIC0yMDEsNiArMjQzLDkgQEAKIAlzdHJ1Y3Qgc21wX2FsdF9tb2R1bGUgKnNtcDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCisJaWYgKG5vX3JlcGxhY2VtZW50KQorCQlyZXR1cm47CisKIAlpZiAoc21wX2FsdF9vbmNlKSB7CiAJCWlmIChib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfVVApKQogCQkJYWx0ZXJuYXRpdmVzX3NtcF91bmxvY2sobG9ja3MsIGxvY2tzX2VuZCwKQEAgLTIzNSw3ICsyODAsNyBAQAogCXN0cnVjdCBzbXBfYWx0X21vZHVsZSAqaXRlbTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JaWYgKHNtcF9hbHRfb25jZSkKKwlpZiAobm9fcmVwbGFjZW1lbnQgfHwgc21wX2FsdF9vbmNlKQogCQlyZXR1cm47CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmc21wX2FsdCwgZmxhZ3MpOwpAQCAtMjU2LDcgKzMwMSw3IEBACiAJc3RydWN0IHNtcF9hbHRfbW9kdWxlICptb2Q7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWlmIChzbXBfYWx0X29uY2UpCisJaWYgKG5vX3JlcGxhY2VtZW50IHx8IHNtcF9hbHRfb25jZSkKIAkJcmV0dXJuOwogCUJVR19PTighc21wICYmIChudW1fb25saW5lX2NwdXMoKSA+IDEpKTsKIApAQCAtMjg1LDYgKzMzMCwxMyBAQAogCiB2b2lkIF9faW5pdCBhbHRlcm5hdGl2ZV9pbnN0cnVjdGlvbnModm9pZCkKIHsKKwlpZiAobm9fcmVwbGFjZW1lbnQpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiKFNNUC0pYWx0ZXJuYXRpdmVzIHR1cm5lZCBvZmZcbiIpOworCQlmcmVlX2luaXRfcGFnZXMoIlNNUCBhbHRlcm5hdGl2ZXMiLAorCQkJCSh1bnNpZ25lZCBsb25nKV9fc21wX2FsdF9iZWdpbiwKKwkJCQkodW5zaWduZWQgbG9uZylfX3NtcF9hbHRfZW5kKTsKKwkJcmV0dXJuOworCX0KIAlhcHBseV9hbHRlcm5hdGl2ZXMoX19hbHRfaW5zdHJ1Y3Rpb25zLCBfX2FsdF9pbnN0cnVjdGlvbnNfZW5kKTsKIAogCS8qIHN3aXRjaCB0byBwYXRjaC1vbmNlLWF0LWJvb3R0aW1lLW9ubHkgbW9kZSBhbmQgZnJlZSB0aGUKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvYXBpYy5jIGIvYXJjaC9pMzg2L2tlcm5lbC9hcGljLmMKaW5kZXggNWFiNTljMS4uN2NlMDk0OSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9hcGljLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9hcGljLmMKQEAgLTM2LDYgKzM2LDcgQEAKICNpbmNsdWRlIDxhc20vYXJjaF9ob29rcy5oPgogI2luY2x1ZGUgPGFzbS9ocGV0Lmg+CiAjaW5jbHVkZSA8YXNtL2k4MjUzLmg+CisjaW5jbHVkZSA8YXNtL25taS5oPgogCiAjaW5jbHVkZSA8bWFjaF9hcGljLmg+CiAjaW5jbHVkZSA8bWFjaF9hcGljZGVmLmg+CkBAIC0xNTYsNyArMTU3LDcgQEAKIAltYXhsdnQgPSBnZXRfbWF4bHZ0KCk7CiAKIAkvKgotCSAqIE1hc2tpbmcgYW4gTFZUIGVudHJ5IG9uIGEgUDYgY2FuIHRyaWdnZXIgYSBsb2NhbCBBUElDIGVycm9yCisJICogTWFza2luZyBhbiBMVlQgZW50cnkgY2FuIHRyaWdnZXIgYSBsb2NhbCBBUElDIGVycm9yCiAJICogaWYgdGhlIHZlY3RvciBpcyB6ZXJvLiBNYXNrIExWVEVSUiBmaXJzdCB0byBwcmV2ZW50IHRoaXMuCiAJICovCiAJaWYgKG1heGx2dCA+PSAzKSB7CkBAIC0xMTE3LDcgKzExMTgsMTggQEAKIAkJdW5zaWduZWQgbG9uZyB2OwogCiAJCXYgPSBhcGljX3JlYWQoQVBJQ19MVlRUKTsKLQkJYXBpY193cml0ZV9hcm91bmQoQVBJQ19MVlRULCB2IHwgQVBJQ19MVlRfTUFTS0VEKTsKKwkJLyoKKwkJICogV2hlbiBhbiBpbGxlZ2FsIHZlY3RvciB2YWx1ZSAoMC0xNSkgaXMgd3JpdHRlbiB0byBhbiBMVlQKKwkJICogZW50cnkgYW5kIGRlbGl2ZXJ5IG1vZGUgaXMgRml4ZWQsIHRoZSBBUElDIG1heSBzaWduYWwgYW4KKwkJICogaWxsZWdhbCB2ZWN0b3IgZXJyb3IsIHdpdGggb3V0IHJlZ2FyZCB0byB3aGV0aGVyIHRoZSBtYXNrCisJCSAqIGJpdCBpcyBzZXQgb3Igd2hldGhlciBhbiBpbnRlcnJ1cHQgaXMgYWN0dWFsbHkgc2VlbiBvbiBpbnB1dC4KKwkJICoKKwkJICogQm9vdCBzZXF1ZW5jZSBtaWdodCBjYWxsIHRoaXMgZnVuY3Rpb24gd2hlbiB0aGUgTFZUVCBoYXMKKwkJICogJzAnIHZlY3RvciB2YWx1ZS4gU28gbWFrZSBzdXJlIHZlY3RvciBmaWVsZCBpcyBzZXQgdG8KKwkJICogdmFsaWQgdmFsdWUuCisJCSAqLworCQl2IHw9IChBUElDX0xWVF9NQVNLRUQgfCBMT0NBTF9USU1FUl9WRUNUT1IpOworCQlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0xWVFQsIHYpOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9hcG0uYyBiL2FyY2gvaTM4Ni9rZXJuZWwvYXBtLmMKaW5kZXggOWU4MTllYi4uN2M1NzI5ZCAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9hcG0uYworKysgYi9hcmNoL2kzODYva2VybmVsL2FwbS5jCkBAIC03NjQsOSArNzY0LDkgQEAKIAlpbnQJaWRsZWQgPSAwOwogCWludAlwb2xsaW5nOwogCi0JcG9sbGluZyA9IHRlc3RfdGhyZWFkX2ZsYWcoVElGX1BPTExJTkdfTlJGTEFHKTsKKwlwb2xsaW5nID0gISEoY3VycmVudF90aHJlYWRfaW5mbygpLT5zdGF0dXMgJiBUU19QT0xMSU5HKTsKIAlpZiAocG9sbGluZykgewotCQljbGVhcl90aHJlYWRfZmxhZyhUSUZfUE9MTElOR19OUkZMQUcpOworCQljdXJyZW50X3RocmVhZF9pbmZvKCktPnN0YXR1cyAmPSB+VFNfUE9MTElORzsKIAkJc21wX21iX19hZnRlcl9jbGVhcl9iaXQoKTsKIAl9CiAJaWYgKCFuZWVkX3Jlc2NoZWQoKSkgewpAQCAtNzc0LDcgKzc3NCw3IEBACiAJCXJldCA9IGFwbV9iaW9zX2NhbGxfc2ltcGxlKEFQTV9GVU5DX0lETEUsIDAsIDAsICZlYXgpOwogCX0KIAlpZiAocG9sbGluZykKLQkJc2V0X3RocmVhZF9mbGFnKFRJRl9QT0xMSU5HX05SRkxBRyk7CisJCWN1cnJlbnRfdGhyZWFkX2luZm8oKS0+c3RhdHVzIHw9IFRTX1BPTExJTkc7CiAKIAlpZiAoIWlkbGVkKQogCQlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvYXNtLW9mZnNldHMuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvYXNtLW9mZnNldHMuYwppbmRleCAzNmQ2NmUyLi4xYzNhODA5IDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2FzbS1vZmZzZXRzLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9hc20tb2Zmc2V0cy5jCkBAIC00LDYgKzQsNyBAQAogICogdG8gZXh0cmFjdCBhbmQgZm9ybWF0IHRoZSByZXF1aXJlZCBkYXRhLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgogI2luY2x1ZGUgPGxpbnV4L3BlcnNvbmFsaXR5Lmg+CkBAIC02OSw0ICs3MCw2IEBACiAKIAlERUZJTkUoUEFHRV9TSVpFX2FzbSwgUEFHRV9TSVpFKTsKIAlERUZJTkUoVlNZU0NBTExfQkFTRSwgX19maXhfdG9fdmlydChGSVhfVlNZU0NBTEwpKTsKKworCU9GRlNFVChjcnlwdG9fdGZtX2N0eF9vZmZzZXQsIGNyeXB0b190Zm0sIF9fY3J0X2N0eCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9hbWQuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2FtZC5jCmluZGV4IDc4NmQxYTUuLmZkMDQ1N2MgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2FtZC5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2FtZC5jCkBAIC0yMjQsMTUgKzIyNCwxNyBAQAogCiAjaWZkZWYgQ09ORklHX1g4Nl9IVAogCS8qCi0JICogT24gYSBBTUQgZHVhbCBjb3JlIHNldHVwIHRoZSBsb3dlciBiaXRzIG9mIHRoZSBBUElDIGlkCi0JICogZGlzdGluZ3VzaCB0aGUgY29yZXMuICBBc3N1bWVzIG51bWJlciBvZiBjb3JlcyBpcyBhIHBvd2VyCi0JICogb2YgdHdvLgorCSAqIE9uIGEgQU1EIG11bHRpIGNvcmUgc2V0dXAgdGhlIGxvd2VyIGJpdHMgb2YgdGhlIEFQSUMgaWQKKwkgKiBkaXN0aW5ndXNoIHRoZSBjb3Jlcy4KIAkgKi8KIAlpZiAoYy0+eDg2X21heF9jb3JlcyA+IDEpIHsKIAkJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQkJdW5zaWduZWQgYml0cyA9IDA7Ci0JCXdoaWxlICgoMSA8PCBiaXRzKSA8IGMtPng4Nl9tYXhfY29yZXMpCi0JCQliaXRzKys7CisJCXVuc2lnbmVkIGJpdHMgPSAoY3B1aWRfZWN4KDB4ODAwMDAwMDgpID4+IDEyKSAmIDB4ZjsKKworCQlpZiAoYml0cyA9PSAwKSB7CisJCQl3aGlsZSAoKDEgPDwgYml0cykgPCBjLT54ODZfbWF4X2NvcmVzKQorCQkJCWJpdHMrKzsKKwkJfQogCQljcHVfY29yZV9pZFtjcHVdID0gcGh5c19wcm9jX2lkW2NwdV0gJiAoKDE8PGJpdHMpLTEpOwogCQlwaHlzX3Byb2NfaWRbY3B1XSA+Pj0gYml0czsKIAkJcHJpbnRrKEtFUk5fSU5GTyAiQ1BVICVkKCVkKSAtPiBDb3JlICVkXG4iLApAQCAtMjQwLDYgKzI0Miw4IEBACiAJfQogI2VuZGlmCiAKKwlpZiAoY3B1aWRfZWF4KDB4ODAwMDAwMDApID49IDB4ODAwMDAwMDYpCisJCW51bV9jYWNoZV9sZWF2ZXMgPSAzOwogfQogCiBzdGF0aWMgdW5zaWduZWQgaW50IGFtZF9zaXplX2NhY2hlKHN0cnVjdCBjcHVpbmZvX3g4NiAqIGMsIHVuc2lnbmVkIGludCBzaXplKQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9hY3BpLWNwdWZyZXEuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvYWNwaS1jcHVmcmVxLmMKaW5kZXggMDU2NjhlMy4uNWZkNjUzMiAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9hY3BpLWNwdWZyZXEuYworKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL2FjcGktY3B1ZnJlcS5jCkBAIC0zNzEsMTEgKzM3MSwxMSBAQAogCiAJZHByaW50aygiYWNwaV9jcHVmcmVxX2Vhcmx5X2luaXRcbiIpOwogCi0JZm9yX2VhY2hfY3B1KGkpIHsKKwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkgewogCQlkYXRhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFjcGlfcHJvY2Vzc29yX3BlcmZvcm1hbmNlKSwgCiAJCQlHRlBfS0VSTkVMKTsKIAkJaWYgKCFkYXRhKSB7Ci0JCQlmb3JfZWFjaF9jcHUoaikgeworCQkJZm9yX2VhY2hfcG9zc2libGVfY3B1KGopIHsKIAkJCQlrZnJlZShhY3BpX3BlcmZfZGF0YVtqXSk7CiAJCQkJYWNwaV9wZXJmX2RhdGFbal0gPSBOVUxMOwogCQkJfQpAQCAtNTg0LDcgKzU4NCw3IEBACiAKIAljcHVmcmVxX3VucmVnaXN0ZXJfZHJpdmVyKCZhY3BpX2NwdWZyZXFfZHJpdmVyKTsKIAotCWZvcl9lYWNoX2NwdShpKSB7CisJZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpIHsKIAkJa2ZyZWUoYWNwaV9wZXJmX2RhdGFbaV0pOwogCQlhY3BpX3BlcmZfZGF0YVtpXSA9IE5VTEw7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtY2VudHJpbm8uYyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvc3BlZWRzdGVwLWNlbnRyaW5vLmMKaW5kZXggMzFjM2E1Yi4uZjdlNDM1NiAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtY2VudHJpbm8uYworKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL3NwZWVkc3RlcC1jZW50cmluby5jCkBAIC0zNjEsMTEgKzM2MSwxMSBAQAogCXVuc2lnbmVkIGludAlpLCBqOwogCXN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9wZXJmb3JtYW5jZQkqZGF0YTsKIAotCWZvcl9lYWNoX2NwdShpKSB7CisJZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpIHsKIAkJZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9wZXJmb3JtYW5jZSksIAogCQkJCUdGUF9LRVJORUwpOwogCQlpZiAoIWRhdGEpIHsKLQkJCWZvcl9lYWNoX2NwdShqKSB7CisJCQlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaikgewogCQkJCWtmcmVlKGFjcGlfcGVyZl9kYXRhW2pdKTsKIAkJCQlhY3BpX3BlcmZfZGF0YVtqXSA9IE5VTEw7CiAJCQl9CkBAIC04MDUsNyArODA1LDcgQEAKIAljcHVmcmVxX3VucmVnaXN0ZXJfZHJpdmVyKCZjZW50cmlub19kcml2ZXIpOwogCiAjaWZkZWYgQ09ORklHX1g4Nl9TUEVFRFNURVBfQ0VOVFJJTk9fQUNQSQotCWZvcl9lYWNoX2NwdShqKSB7CisJZm9yX2VhY2hfcG9zc2libGVfY3B1KGopIHsKIAkJa2ZyZWUoYWNwaV9wZXJmX2RhdGFbal0pOwogCQlhY3BpX3BlcmZfZGF0YVtqXSA9IE5VTEw7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3lyaXguYyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2N5cml4LmMKaW5kZXggZmMzMmM4MC4uZjAzYjdmOSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3lyaXguYworKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jeXJpeC5jCkBAIC0zNTQsNyArMzU0LDcgQEAKIAkgKiBUaGlzIGZ1bmN0aW9uIG9ubHkgaGFuZGxlcyB0aGUgR1ggcHJvY2Vzc29yLCBhbmQga2lja3MgZXZlcnkKIAkgKiB0aGluZyBlbHNlIHRvIHRoZSBDeXJpeCBpbml0IGZ1bmN0aW9uIGFib3ZlIC0gdGhhdCBzaG91bGQKIAkgKiBjb3ZlciBhbnkgcHJvY2Vzc29ycyB0aGF0IG1pZ2h0IGhhdmUgYmVlbiBicmFuZGVkIGRpZmZlcmVudGx5Ci0JICogYWZ0ZXIgTlNDIGFxdWlyZWQgQ3lyaXguCisJICogYWZ0ZXIgTlNDIGFjcXVpcmVkIEN5cml4LgogCSAqCiAJICogSWYgdGhpcyBicmVha3MgeW91ciBHWDEgaG9ycmlibHksIHBsZWFzZSBlLW1haWwKIAkgKiBpbmZvLWxpbnV4QGxkY21haWwuYW1kLmNvbSB0byB0ZWxsIHVzLgpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvaW50ZWwuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2ludGVsLmMKaW5kZXggNTM4NmIyOS4uMTBhZmM2NCAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvaW50ZWwuYworKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9pbnRlbC5jCkBAIC0xMjIsNiArMTIyLDEyIEBACiAKIAlzZWxlY3RfaWRsZV9yb3V0aW5lKGMpOwogCWwyID0gaW5pdF9pbnRlbF9jYWNoZWluZm8oYyk7CisJaWYgKGMtPmNwdWlkX2xldmVsID4gOSApIHsKKwkJdW5zaWduZWQgZWF4ID0gY3B1aWRfZWF4KDEwKTsKKwkJLyogQ2hlY2sgZm9yIHZlcnNpb24gYW5kIHRoZSBudW1iZXIgb2YgY291bnRlcnMgKi8KKwkJaWYgKChlYXggJiAweGZmKSAmJiAoKChlYXg+PjgpICYgMHhmZikgPiAxKSkKKwkJCXNldF9iaXQoWDg2X0ZFQVRVUkVfQVJDSF9QRVJGTU9OLCBjLT54ODZfY2FwYWJpbGl0eSk7CisJfQogCiAJLyogU0VQIENQVUlEIGJ1ZzogUGVudGl1bSBQcm8gcmVwb3J0cyBTRVAgYnV0IGRvZXNuJ3QgaGF2ZSBpdCB1bnRpbCBtb2RlbCAzIG1hc2sgMyAqLwogCWlmICgoYy0+eDg2PDw4IHwgYy0+eDg2X21vZGVsPDw0IHwgYy0+eDg2X21hc2spIDwgMHg2MzMpCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9pbnRlbF9jYWNoZWluZm8uYyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2ludGVsX2NhY2hlaW5mby5jCmluZGV4IGM4NTQ3YTYuLjZjMzdiNGYgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2ludGVsX2NhY2hlaW5mby5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2ludGVsX2NhY2hlaW5mby5jCkBAIC00LDYgKzQsNyBAQAogICogICAgICBDaGFuZ2VzOgogICogICAgICBWZW5rYXRlc2ggUGFsbGlwYWRpCTogQWRkaW5nIGNhY2hlIGlkZW50aWZpY2F0aW9uIHRocm91Z2ggY3B1aWQoNCkKICAqCQlBc2hvayBSYWogPGFzaG9rLnJhakBpbnRlbC5jb20+OiBXb3JrIHdpdGggQ1BVIGhvdHBsdWcgaW5mcmFzdHJ1Y3R1cmUuCisgKglBbmRpIEtsZWVuCQk6IENQVUlENCBlbXVsYXRpb24gb24gQU1ELgogICovCiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CkBAIC0xMzAsMjUgKzEzMSwxMTEgQEAKIAljcHVtYXNrX3Qgc2hhcmVkX2NwdV9tYXA7CiB9OwogCi1zdGF0aWMgdW5zaWduZWQgc2hvcnQJCQludW1fY2FjaGVfbGVhdmVzOwordW5zaWduZWQgc2hvcnQJCQludW1fY2FjaGVfbGVhdmVzOworCisvKiBBTUQgZG9lc24ndCBoYXZlIENQVUlENC4gRW11bGF0ZSBpdCBoZXJlIHRvIHJlcG9ydCB0aGUgc2FtZQorICAgaW5mb3JtYXRpb24gdG8gdGhlIHVzZXIuICBUaGlzIG1ha2VzIHNvbWUgYXNzdW1wdGlvbnMgYWJvdXQgdGhlIG1hY2hpbmU6CisgICBObyBMMywgTDIgbm90IHNoYXJlZCwgbm8gU01UIGV0Yy4gdGhhdCBpcyBjdXJyZW50bHkgdHJ1ZSBvbiBBTUQgQ1BVcy4KKworICAgSW4gdGhlb3J5IHRoZSBUTEJzIGNvdWxkIGJlIHJlcG9ydGVkIGFzIGZha2UgdHlwZSAodGhleSBhcmUgaW4gImR1bW15IikuCisgICBNYXliZSBsYXRlciAqLwordW5pb24gbDFfY2FjaGUgeworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGxpbmVfc2l6ZSA6IDg7CisJCXVuc2lnbmVkIGxpbmVzX3Blcl90YWcgOiA4OworCQl1bnNpZ25lZCBhc3NvYyA6IDg7CisJCXVuc2lnbmVkIHNpemVfaW5fa2IgOiA4OworCX07CisJdW5zaWduZWQgdmFsOworfTsKKwordW5pb24gbDJfY2FjaGUgeworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGxpbmVfc2l6ZSA6IDg7CisJCXVuc2lnbmVkIGxpbmVzX3Blcl90YWcgOiA0OworCQl1bnNpZ25lZCBhc3NvYyA6IDQ7CisJCXVuc2lnbmVkIHNpemVfaW5fa2IgOiAxNjsKKwl9OworCXVuc2lnbmVkIHZhbDsKK307CisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBhc3NvY3NbXSA9IHsKKwlbMV0gPSAxLCBbMl0gPSAyLCBbNF0gPSA0LCBbNl0gPSA4LAorCVs4XSA9IDE2LAorCVsweGZdID0gMHhmZmZmIC8vID8/CisJfTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGxldmVsc1tdID0geyAxLCAxLCAyIH07CitzdGF0aWMgdW5zaWduZWQgY2hhciB0eXBlc1tdID0geyAxLCAyLCAzIH07CisKK3N0YXRpYyB2b2lkIF9fY3B1aW5pdCBhbWRfY3B1aWQ0KGludCBsZWFmLCB1bmlvbiBfY3B1aWQ0X2xlYWZfZWF4ICplYXgsCisJCSAgICAgICB1bmlvbiBfY3B1aWQ0X2xlYWZfZWJ4ICplYngsCisJCSAgICAgICB1bmlvbiBfY3B1aWQ0X2xlYWZfZWN4ICplY3gpCit7CisJdW5zaWduZWQgZHVtbXk7CisJdW5zaWduZWQgbGluZV9zaXplLCBsaW5lc19wZXJfdGFnLCBhc3NvYywgc2l6ZV9pbl9rYjsKKwl1bmlvbiBsMV9jYWNoZSBsMWksIGwxZDsKKwl1bmlvbiBsMl9jYWNoZSBsMjsKKworCWVheC0+ZnVsbCA9IDA7CisJZWJ4LT5mdWxsID0gMDsKKwllY3gtPmZ1bGwgPSAwOworCisJY3B1aWQoMHg4MDAwMDAwNSwgJmR1bW15LCAmZHVtbXksICZsMWQudmFsLCAmbDFpLnZhbCk7CisJY3B1aWQoMHg4MDAwMDAwNiwgJmR1bW15LCAmZHVtbXksICZsMi52YWwsICZkdW1teSk7CisKKwlpZiAobGVhZiA+IDIgfHwgIWwxZC52YWwgfHwgIWwxaS52YWwgfHwgIWwyLnZhbCkKKwkJcmV0dXJuOworCisJZWF4LT5zcGxpdC5pc19zZWxmX2luaXRpYWxpemluZyA9IDE7CisJZWF4LT5zcGxpdC50eXBlID0gdHlwZXNbbGVhZl07CisJZWF4LT5zcGxpdC5sZXZlbCA9IGxldmVsc1tsZWFmXTsKKwllYXgtPnNwbGl0Lm51bV90aHJlYWRzX3NoYXJpbmcgPSAwOworCWVheC0+c3BsaXQubnVtX2NvcmVzX29uX2RpZSA9IGN1cnJlbnRfY3B1X2RhdGEueDg2X21heF9jb3JlcyAtIDE7CisKKwlpZiAobGVhZiA8PSAxKSB7CisJCXVuaW9uIGwxX2NhY2hlICpsMSA9IGxlYWYgPT0gMCA/ICZsMWQgOiAmbDFpOworCQlhc3NvYyA9IGwxLT5hc3NvYzsKKwkJbGluZV9zaXplID0gbDEtPmxpbmVfc2l6ZTsKKwkJbGluZXNfcGVyX3RhZyA9IGwxLT5saW5lc19wZXJfdGFnOworCQlzaXplX2luX2tiID0gbDEtPnNpemVfaW5fa2I7CisJfSBlbHNlIHsKKwkJYXNzb2MgPSBsMi5hc3NvYzsKKwkJbGluZV9zaXplID0gbDIubGluZV9zaXplOworCQlsaW5lc19wZXJfdGFnID0gbDIubGluZXNfcGVyX3RhZzsKKwkJLyogY3B1X2RhdGEgaGFzIGVycmF0YSBjb3JyZWN0aW9ucyBmb3IgSzcgYXBwbGllZCAqLworCQlzaXplX2luX2tiID0gY3VycmVudF9jcHVfZGF0YS54ODZfY2FjaGVfc2l6ZTsKKwl9CisKKwlpZiAoYXNzb2MgPT0gMHhmKQorCQllYXgtPnNwbGl0LmlzX2Z1bGx5X2Fzc29jaWF0aXZlID0gMTsKKwllYngtPnNwbGl0LmNvaGVyZW5jeV9saW5lX3NpemUgPSBsaW5lX3NpemUgLSAxOworCWVieC0+c3BsaXQud2F5c19vZl9hc3NvY2lhdGl2aXR5ID0gYXNzb2NzW2Fzc29jXSAtIDE7CisJZWJ4LT5zcGxpdC5waHlzaWNhbF9saW5lX3BhcnRpdGlvbiA9IGxpbmVzX3Blcl90YWcgLSAxOworCWVjeC0+c3BsaXQubnVtYmVyX29mX3NldHMgPSAoc2l6ZV9pbl9rYiAqIDEwMjQpIC8gbGluZV9zaXplIC8KKwkJKGVieC0+c3BsaXQud2F5c19vZl9hc3NvY2lhdGl2aXR5ICsgMSkgLSAxOworfQogCiBzdGF0aWMgaW50IF9fY3B1aW5pdCBjcHVpZDRfY2FjaGVfbG9va3VwKGludCBpbmRleCwgc3RydWN0IF9jcHVpZDRfaW5mbyAqdGhpc19sZWFmKQogewotCXVuc2lnbmVkIGludAkJZWF4LCBlYngsIGVjeCwgZWR4OwotCXVuaW9uIF9jcHVpZDRfbGVhZl9lYXgJY2FjaGVfZWF4OworCXVuaW9uIF9jcHVpZDRfbGVhZl9lYXggCWVheDsKKwl1bmlvbiBfY3B1aWQ0X2xlYWZfZWJ4IAllYng7CisJdW5pb24gX2NwdWlkNF9sZWFmX2VjeCAJZWN4OworCXVuc2lnbmVkCQllZHg7CiAKLQljcHVpZF9jb3VudCg0LCBpbmRleCwgJmVheCwgJmVieCwgJmVjeCwgJmVkeCk7Ci0JY2FjaGVfZWF4LmZ1bGwgPSBlYXg7Ci0JaWYgKGNhY2hlX2VheC5zcGxpdC50eXBlID09IENBQ0hFX1RZUEVfTlVMTCkKKwlpZiAoYm9vdF9jcHVfZGF0YS54ODZfdmVuZG9yID09IFg4Nl9WRU5ET1JfQU1EKQorCQlhbWRfY3B1aWQ0KGluZGV4LCAmZWF4LCAmZWJ4LCAmZWN4KTsKKwllbHNlCisJCWNwdWlkX2NvdW50KDQsIGluZGV4LCAmZWF4LmZ1bGwsICZlYnguZnVsbCwgJmVjeC5mdWxsLCAgJmVkeCk7CisJaWYgKGVheC5zcGxpdC50eXBlID09IENBQ0hFX1RZUEVfTlVMTCkKIAkJcmV0dXJuIC1FSU87IC8qIGJldHRlciBlcnJvciA/ICovCiAKLQl0aGlzX2xlYWYtPmVheC5mdWxsID0gZWF4OwotCXRoaXNfbGVhZi0+ZWJ4LmZ1bGwgPSBlYng7Ci0JdGhpc19sZWFmLT5lY3guZnVsbCA9IGVjeDsKLQl0aGlzX2xlYWYtPnNpemUgPSAodGhpc19sZWFmLT5lY3guc3BsaXQubnVtYmVyX29mX3NldHMgKyAxKSAqCi0JCSh0aGlzX2xlYWYtPmVieC5zcGxpdC5jb2hlcmVuY3lfbGluZV9zaXplICsgMSkgKgotCQkodGhpc19sZWFmLT5lYnguc3BsaXQucGh5c2ljYWxfbGluZV9wYXJ0aXRpb24gKyAxKSAqCi0JCSh0aGlzX2xlYWYtPmVieC5zcGxpdC53YXlzX29mX2Fzc29jaWF0aXZpdHkgKyAxKTsKKwl0aGlzX2xlYWYtPmVheCA9IGVheDsKKwl0aGlzX2xlYWYtPmVieCA9IGVieDsKKwl0aGlzX2xlYWYtPmVjeCA9IGVjeDsKKwl0aGlzX2xlYWYtPnNpemUgPSAoZWN4LnNwbGl0Lm51bWJlcl9vZl9zZXRzICsgMSkgKgorCQkoZWJ4LnNwbGl0LmNvaGVyZW5jeV9saW5lX3NpemUgKyAxKSAqCisJCShlYnguc3BsaXQucGh5c2ljYWxfbGluZV9wYXJ0aXRpb24gKyAxKSAqCisJCShlYnguc3BsaXQud2F5c19vZl9hc3NvY2lhdGl2aXR5ICsgMSk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3Jhc2guYyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3Jhc2guYwppbmRleCAyYjBjZmNlLi40OGYwZjYyIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2NyYXNoLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcmFzaC5jCkBAIC0xMTQsMTkgKzExNCwxNSBAQAogCWF0b21pY19kZWMoJndhaXRpbmdfZm9yX2NyYXNoX2lwaSk7CiAJLyogQXNzdW1lIGhsdCB3b3JrcyAqLwogCWhhbHQoKTsKLQlmb3IoOzspOworCWZvciAoOzspCisJCWNwdV9yZWxheCgpOwogCiAJcmV0dXJuIDE7CiB9CiAKLS8qCi0gKiBCeSB1c2luZyB0aGUgTk1JIGNvZGUgaW5zdGVhZCBvZiBhIHZlY3RvciB3ZSBqdXN0IHNuZWFrIHRocnUgdGhlCi0gKiB3b3JkIGdlbmVyYXRvciBjb21pbmcgb3V0IHdpdGgganVzdCB3aGF0IHdlIHdhbnQuICBBTkQgaXQgZG9lcwotICogbm90IG1hdHRlciBpZiBjbHVzdGVyZWRfYXBpY19tb2RlIGlzIHNldCBvciBub3QuCi0gKi8KIHN0YXRpYyB2b2lkIHNtcF9zZW5kX25taV9hbGxidXRzZWxmKHZvaWQpCiB7Ci0Jc2VuZF9JUElfYWxsYnV0c2VsZihBUElDX0RNX05NSSk7CisJc2VuZF9JUElfYWxsYnV0c2VsZihOTUlfVkVDVE9SKTsKIH0KIAogc3RhdGljIHZvaWQgbm1pX3Nob290ZG93bl9jcHVzKHZvaWQpCkBAIC0xNjIsNyArMTU4LDcgQEAKIHZvaWQgbWFjaGluZV9jcmFzaF9zaHV0ZG93bihzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAkvKiBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIGFmdGVyIHRoZSBzeXN0ZW0KLQkgKiBoYXMgcGFuaWNlZCBvciBpcyBvdGhlcndpc2UgaW4gYSBjcml0aWNhbCBzdGF0ZS4KKwkgKiBoYXMgcGFuaWNrZWQgb3IgaXMgb3RoZXJ3aXNlIGluIGEgY3JpdGljYWwgc3RhdGUuCiAJICogVGhlIG1pbmltdW0gYW1vdW50IG9mIGNvZGUgdG8gYWxsb3cgYSBrZXhlYydkIGtlcm5lbAogCSAqIHRvIHJ1biBzdWNjZXNzZnVsbHkgbmVlZHMgdG8gaGFwcGVuIGhlcmUuCiAJICoKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvZG91YmxlZmF1bHQuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvZG91YmxlZmF1bHQuYwppbmRleCA1ZWRiMWQzLi5iNGQxNGMyIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2RvdWJsZWZhdWx0LmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9kb3VibGVmYXVsdC5jCkBAIC00NCw3ICs0NCw4IEBACiAJCX0KIAl9CiAKLQlmb3IgKDs7KSAvKiBub3RoaW5nICovOworCWZvciAoOzspCisJCWNwdV9yZWxheCgpOwogfQogCiBzdHJ1Y3QgdHNzX3N0cnVjdCBkb3VibGVmYXVsdF90c3MgX19jYWNoZWxpbmVfYWxpZ25lZCA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvZW50cnkuUyBiL2FyY2gvaTM4Ni9rZXJuZWwvZW50cnkuUwppbmRleCBjZmM2ODNmLi5lNmU0NTA2IDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2VudHJ5LlMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9lbnRyeS5TCkBAIC00OCw2ICs0OCw3IEBACiAjaW5jbHVkZSA8YXNtL3NtcC5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8YXNtL2Rlc2MuaD4KKyNpbmNsdWRlIDxhc20vZHdhcmYyLmg+CiAjaW5jbHVkZSAiaXJxX3ZlY3RvcnMuaCIKIAogI2RlZmluZSBucl9zeXNjYWxscyAoKHN5c2NhbGxfdGFibGVfc2l6ZSkvNCkKQEAgLTg1LDMxICs4Niw2NyBAQAogI2RlZmluZSBTQVZFX0FMTCBcCiAJY2xkOyBcCiAJcHVzaGwgJWVzOyBcCisJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIDQ7XAorCS8qQ0ZJX1JFTF9PRkZTRVQgZXMsIDA7Ki9cCiAJcHVzaGwgJWRzOyBcCisJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIDQ7XAorCS8qQ0ZJX1JFTF9PRkZTRVQgZHMsIDA7Ki9cCiAJcHVzaGwgJWVheDsgXAorCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCA0O1wKKwlDRklfUkVMX09GRlNFVCBlYXgsIDA7XAogCXB1c2hsICVlYnA7IFwKKwlDRklfQURKVVNUX0NGQV9PRkZTRVQgNDtcCisJQ0ZJX1JFTF9PRkZTRVQgZWJwLCAwO1wKIAlwdXNobCAlZWRpOyBcCisJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIDQ7XAorCUNGSV9SRUxfT0ZGU0VUIGVkaSwgMDtcCiAJcHVzaGwgJWVzaTsgXAorCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCA0O1wKKwlDRklfUkVMX09GRlNFVCBlc2ksIDA7XAogCXB1c2hsICVlZHg7IFwKKwlDRklfQURKVVNUX0NGQV9PRkZTRVQgNDtcCisJQ0ZJX1JFTF9PRkZTRVQgZWR4LCAwO1wKIAlwdXNobCAlZWN4OyBcCisJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIDQ7XAorCUNGSV9SRUxfT0ZGU0VUIGVjeCwgMDtcCiAJcHVzaGwgJWVieDsgXAorCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCA0O1wKKwlDRklfUkVMX09GRlNFVCBlYngsIDA7XAogCW1vdmwgJChfX1VTRVJfRFMpLCAlZWR4OyBcCiAJbW92bCAlZWR4LCAlZHM7IFwKIAltb3ZsICVlZHgsICVlczsKIAogI2RlZmluZSBSRVNUT1JFX0lOVF9SRUdTIFwKIAlwb3BsICVlYng7CVwKKwlDRklfQURKVVNUX0NGQV9PRkZTRVQgLTQ7XAorCUNGSV9SRVNUT1JFIGVieDtcCiAJcG9wbCAlZWN4OwlcCisJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIC00O1wKKwlDRklfUkVTVE9SRSBlY3g7XAogCXBvcGwgJWVkeDsJXAorCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCAtNDtcCisJQ0ZJX1JFU1RPUkUgZWR4O1wKIAlwb3BsICVlc2k7CVwKKwlDRklfQURKVVNUX0NGQV9PRkZTRVQgLTQ7XAorCUNGSV9SRVNUT1JFIGVzaTtcCiAJcG9wbCAlZWRpOwlcCisJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIC00O1wKKwlDRklfUkVTVE9SRSBlZGk7XAogCXBvcGwgJWVicDsJXAotCXBvcGwgJWVheAorCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCAtNDtcCisJQ0ZJX1JFU1RPUkUgZWJwO1wKKwlwb3BsICVlYXg7CVwKKwlDRklfQURKVVNUX0NGQV9PRkZTRVQgLTQ7XAorCUNGSV9SRVNUT1JFIGVheAogCiAjZGVmaW5lIFJFU1RPUkVfUkVHUwlcCiAJUkVTVE9SRV9JTlRfUkVHUzsgXAogMToJcG9wbCAlZHM7CVwKKwlDRklfQURKVVNUX0NGQV9PRkZTRVQgLTQ7XAorCS8qQ0ZJX1JFU1RPUkUgZHM7Ki9cCiAyOglwb3BsICVlczsJXAorCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCAtNDtcCisJLypDRklfUkVTVE9SRSBlczsqL1wKIC5zZWN0aW9uIC5maXh1cCwiYXgiOwlcCiAzOgltb3ZsICQwLCglZXNwKTsJXAogCWptcCAxYjsJCVwKQEAgLTEyMiwxMyArMTU5LDQzIEBACiAJLmxvbmcgMmIsNGI7CVwKIC5wcmV2aW91cwogCisjZGVmaW5lIFJJTkcwX0lOVF9GUkFNRSBcCisJQ0ZJX1NUQVJUUFJPQyBzaW1wbGU7XAorCUNGSV9ERUZfQ0ZBIGVzcCwgMyo0O1wKKwkvKkNGSV9PRkZTRVQgY3MsIC0yKjQ7Ki9cCisJQ0ZJX09GRlNFVCBlaXAsIC0zKjQKKworI2RlZmluZSBSSU5HMF9FQ19GUkFNRSBcCisJQ0ZJX1NUQVJUUFJPQyBzaW1wbGU7XAorCUNGSV9ERUZfQ0ZBIGVzcCwgNCo0O1wKKwkvKkNGSV9PRkZTRVQgY3MsIC0yKjQ7Ki9cCisJQ0ZJX09GRlNFVCBlaXAsIC0zKjQKKworI2RlZmluZSBSSU5HMF9QVFJFR1NfRlJBTUUgXAorCUNGSV9TVEFSVFBST0Mgc2ltcGxlO1wKKwlDRklfREVGX0NGQSBlc3AsIE9MREVTUC1FQlg7XAorCS8qQ0ZJX09GRlNFVCBjcywgQ1MtT0xERVNQOyovXAorCUNGSV9PRkZTRVQgZWlwLCBFSVAtT0xERVNQO1wKKwkvKkNGSV9PRkZTRVQgZXMsIEVTLU9MREVTUDsqL1wKKwkvKkNGSV9PRkZTRVQgZHMsIERTLU9MREVTUDsqL1wKKwlDRklfT0ZGU0VUIGVheCwgRUFYLU9MREVTUDtcCisJQ0ZJX09GRlNFVCBlYnAsIEVCUC1PTERFU1A7XAorCUNGSV9PRkZTRVQgZWRpLCBFREktT0xERVNQO1wKKwlDRklfT0ZGU0VUIGVzaSwgRVNJLU9MREVTUDtcCisJQ0ZJX09GRlNFVCBlZHgsIEVEWC1PTERFU1A7XAorCUNGSV9PRkZTRVQgZWN4LCBFQ1gtT0xERVNQO1wKKwlDRklfT0ZGU0VUIGVieCwgRUJYLU9MREVTUAogCiBFTlRSWShyZXRfZnJvbV9mb3JrKQorCUNGSV9TVEFSVFBST0MKIAlwdXNobCAlZWF4CisJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIC00CiAJY2FsbCBzY2hlZHVsZV90YWlsCiAJR0VUX1RIUkVBRF9JTkZPKCVlYnApCiAJcG9wbCAlZWF4CisJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIC00CiAJam1wIHN5c2NhbGxfZXhpdAorCUNGSV9FTkRQUk9DCiAKIC8qCiAgKiBSZXR1cm4gdG8gdXNlciBtb2RlIGlzIG5vdCBhcyBjb21wbGV4IGFzIGFsbCB0aGlzIGxvb2tzLApAQCAtMTM5LDYgKzIwNiw3IEBACiAKIAkjIHVzZXJzcGFjZSByZXN1bXB0aW9uIHN0dWIgYnlwYXNzaW5nIHN5c2NhbGwgZXhpdCB0cmFjaW5nCiAJQUxJR04KKwlSSU5HMF9QVFJFR1NfRlJBTUUKIHJldF9mcm9tX2V4Y2VwdGlvbjoKIAlwcmVlbXB0X3N0b3AKIHJldF9mcm9tX2ludHI6CkBAIC0xNzEsMjAgKzIzOSwzMyBAQAogCWNhbGwgcHJlZW1wdF9zY2hlZHVsZV9pcnEKIAlqbXAgbmVlZF9yZXNjaGVkCiAjZW5kaWYKKwlDRklfRU5EUFJPQwogCiAvKiBTWVNFTlRFUl9SRVRVUk4gcG9pbnRzIHRvIGFmdGVyIHRoZSAic3lzZW50ZXIiIGluc3RydWN0aW9uIGluCiAgICB0aGUgdnN5c2NhbGwgcGFnZS4gIFNlZSB2c3lzY2FsbC1zeXNlbnRyeS5TLCB3aGljaCBkZWZpbmVzIHRoZSBzeW1ib2wuICAqLwogCiAJIyBzeXNlbnRlciBjYWxsIGhhbmRsZXIgc3R1YgogRU5UUlkoc3lzZW50ZXJfZW50cnkpCisJQ0ZJX1NUQVJUUFJPQyBzaW1wbGUKKwlDRklfREVGX0NGQSBlc3AsIDAKKwlDRklfUkVHSVNURVIgZXNwLCBlYnAKIAltb3ZsIFRTU19zeXNlbnRlcl9lc3AwKCVlc3ApLCVlc3AKIHN5c2VudGVyX3Bhc3RfZXNwOgogCXN0aQogCXB1c2hsICQoX19VU0VSX0RTKQorCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCA0CisJLypDRklfUkVMX09GRlNFVCBzcywgMCovCiAJcHVzaGwgJWVicAorCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCA0CisJQ0ZJX1JFTF9PRkZTRVQgZXNwLCAwCiAJcHVzaGZsCisJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIDQKIAlwdXNobCAkKF9fVVNFUl9DUykKKwlDRklfQURKVVNUX0NGQV9PRkZTRVQgNAorCS8qQ0ZJX1JFTF9PRkZTRVQgY3MsIDAqLwogCXB1c2hsICRTWVNFTlRFUl9SRVRVUk4KKwlDRklfQURKVVNUX0NGQV9PRkZTRVQgNAorCUNGSV9SRUxfT0ZGU0VUIGVpcCwgMAogCiAvKgogICogTG9hZCB0aGUgcG90ZW50aWFsIHNpeHRoIGFyZ3VtZW50IGZyb20gdXNlciBzdGFjay4KQEAgLTE5OSw2ICsyODAsNyBAQAogLnByZXZpb3VzCiAKIAlwdXNobCAlZWF4CisJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIDQKIAlTQVZFX0FMTAogCUdFVF9USFJFQURfSU5GTyglZWJwKQogCkBAIC0yMTksMTEgKzMwMSwxNCBAQAogCXhvcmwgJWVicCwlZWJwCiAJc3RpCiAJc3lzZXhpdAorCUNGSV9FTkRQUk9DCiAKIAogCSMgc3lzdGVtIGNhbGwgaGFuZGxlciBzdHViCiBFTlRSWShzeXN0ZW1fY2FsbCkKKwlSSU5HMF9JTlRfRlJBTUUJCQkjIGNhbid0IHVud2luZCBpbnRvIHVzZXIgc3BhY2UgYW55d2F5CiAJcHVzaGwgJWVheAkJCSMgc2F2ZSBvcmlnX2VheAorCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCA0CiAJU0FWRV9BTEwKIAlHRVRfVEhSRUFEX0lORk8oJWVicCkKIAl0ZXN0bCAkVEZfTUFTSyxFRkxBR1MoJWVzcCkKQEAgLTI1NiwxMCArMzQxLDEyIEBACiAJbW92YiBDUyglZXNwKSwgJWFsCiAJYW5kbCAkKFZNX01BU0sgfCAoNCA8PCA4KSB8IDMpLCAlZWF4CiAJY21wbCAkKCg0IDw8IDgpIHwgMyksICVlYXgKKwlDRklfUkVNRU1CRVJfU1RBVEUKIAlqZSBsZHRfc3MJCQkjIHJldHVybmluZyB0byB1c2VyLXNwYWNlIHdpdGggTERUIFNTCiByZXN0b3JlX25vY2hlY2s6CiAJUkVTVE9SRV9SRUdTCiAJYWRkbCAkNCwgJWVzcAorCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCAtNAogMToJaXJldAogLnNlY3Rpb24gLmZpeHVwLCJheCIKIGlyZXRfZXhjOgpAQCAtMjczLDYgKzM2MCw3IEBACiAJLmxvbmcgMWIsaXJldF9leGMKIC5wcmV2aW91cwogCisJQ0ZJX1JFU1RPUkVfU1RBVEUKIGxkdF9zczoKIAlsYXJsIE9MRFNTKCVlc3ApLCAlZWF4CiAJam56IHJlc3RvcmVfbm9jaGVjawpAQCAtMjg1LDExICszNzMsMTMgQEAKIAkgKiBDUFVzLCB3aGljaCB3ZSBjYW4gdHJ5IHRvIHdvcmsgYXJvdW5kIHRvIG1ha2UKIAkgKiBkb3NlbXUgYW5kIHdpbmUgaGFwcHkuICovCiAJc3VibCAkOCwgJWVzcAkJIyByZXNlcnZlIHNwYWNlIGZvciBzd2l0Y2gxNiBwb2ludGVyCisJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIDgKIAljbGkKIAltb3ZsICVlc3AsICVlYXgKIAkvKiBTZXQgdXAgdGhlIDE2Yml0IHN0YWNrIGZyYW1lIHdpdGggc3dpdGNoMzIgcG9pbnRlciBvbiB0b3AsCiAJICogYW5kIGEgc3dpdGNoMTYgcG9pbnRlciBvbiB0b3Agb2YgdGhlIGN1cnJlbnQgZnJhbWUuICovCiAJY2FsbCBzZXR1cF94ODZfYm9ndXNfc3RhY2sKKwlDRklfQURKVVNUX0NGQV9PRkZTRVQgLTgJIyBmcmFtZSBoYXMgbW92ZWQKIAlSRVNUT1JFX1JFR1MKIAlsc3MgMjArNCglZXNwKSwgJWVzcAkjIHN3aXRjaCB0byAxNmJpdCBzdGFjawogMToJaXJldApAQCAtMjk3LDkgKzM4NywxMSBAQAogCS5hbGlnbiA0CiAJLmxvbmcgMWIsaXJldF9leGMKIC5wcmV2aW91cworCUNGSV9FTkRQUk9DCiAKIAkjIHBlcmZvcm0gd29yayB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgaW1tZWRpYXRlbHkgYmVmb3JlIHJlc3VtcHRpb24KIAlBTElHTgorCVJJTkcwX1BUUkVHU19GUkFNRQkJIyBjYW4ndCB1bndpbmQgaW50byB1c2VyIHNwYWNlIGFueXdheQogd29ya19wZW5kaW5nOgogCXRlc3RiICRfVElGX05FRURfUkVTQ0hFRCwgJWNsCiAJanogd29ya19ub3RpZnlzaWcKQEAgLTMyOSw4ICs0MjEsMTAgQEAKIHdvcmtfbm90aWZ5c2lnX3Y4NjoKICNpZmRlZiBDT05GSUdfVk04NgogCXB1c2hsICVlY3gJCQkjIHNhdmUgdGlfZmxhZ3MgZm9yIGRvX25vdGlmeV9yZXN1bWUKKwlDRklfQURKVVNUX0NGQV9PRkZTRVQgNAogCWNhbGwgc2F2ZV92ODZfc3RhdGUJCSMgJWVheCBjb250YWlucyBwdF9yZWdzIHBvaW50ZXIKIAlwb3BsICVlY3gKKwlDRklfQURKVVNUX0NGQV9PRkZTRVQgLTQKIAltb3ZsICVlYXgsICVlc3AKIAl4b3JsICVlZHgsICVlZHgKIAljYWxsIGRvX25vdGlmeV9yZXN1bWUKQEAgLTM2MywxOSArNDU3LDIxIEBACiAJbW92bCAkMSwgJWVkeAogCWNhbGwgZG9fc3lzY2FsbF90cmFjZQogCWptcCByZXN1bWVfdXNlcnNwYWNlCisJQ0ZJX0VORFBST0MKIAotCUFMSUdOCisJUklORzBfSU5UX0ZSQU1FCQkJIyBjYW4ndCB1bndpbmQgaW50byB1c2VyIHNwYWNlIGFueXdheQogc3lzY2FsbF9mYXVsdDoKIAlwdXNobCAlZWF4CQkJIyBzYXZlIG9yaWdfZWF4CisJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIDQKIAlTQVZFX0FMTAogCUdFVF9USFJFQURfSU5GTyglZWJwKQogCW1vdmwgJC1FRkFVTFQsRUFYKCVlc3ApCiAJam1wIHJlc3VtZV91c2Vyc3BhY2UKIAotCUFMSUdOCiBzeXNjYWxsX2JhZHN5czoKIAltb3ZsICQtRU5PU1lTLEVBWCglZXNwKQogCWptcCByZXN1bWVfdXNlcnNwYWNlCisJQ0ZJX0VORFBST0MKIAogI2RlZmluZSBGSVhVUF9FU1BGSVhfU1RBQ0sgXAogCW1vdmwgJWVzcCwgJWVheDsgXApAQCAtMzg3LDE2ICs0ODMsMjEgQEAKIAltb3ZsICVlYXgsICVlc3A7CiAjZGVmaW5lIFVOV0lORF9FU1BGSVhfU1RBQ0sgXAogCXB1c2hsICVlYXg7IFwKKwlDRklfQURKVVNUX0NGQV9PRkZTRVQgNDsgXAogCW1vdmwgJXNzLCAlZWF4OyBcCiAJLyogc2VlIGlmIG9uIDE2Yml0IHN0YWNrICovIFwKIAljbXB3ICRfX0VTUEZJWF9TUywgJWF4OyBcCi0Jam5lIDI4ZjsgXAotCW1vdmwgJF9fS0VSTkVMX0RTLCAlZWR4OyBcCi0JbW92bCAlZWR4LCAlZHM7IFwKLQltb3ZsICVlZHgsICVlczsgXAorCWplIDI4ZjsgXAorMjc6CXBvcGwgJWVheDsgXAorCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCAtNDsgXAorLnNlY3Rpb24gLmZpeHVwLCJheCI7IFwKKzI4Ogltb3ZsICRfX0tFUk5FTF9EUywgJWVheDsgXAorCW1vdmwgJWVheCwgJWRzOyBcCisJbW92bCAlZWF4LCAlZXM7IFwKIAkvKiBzd2l0Y2ggdG8gMzJiaXQgc3RhY2sgKi8gXAotCUZJWFVQX0VTUEZJWF9TVEFDSyBcCi0yODoJcG9wbCAlZWF4OworCUZJWFVQX0VTUEZJWF9TVEFDSzsgXAorCWptcCAyN2I7IFwKKy5wcmV2aW91cwogCiAvKgogICogQnVpbGQgdGhlIGVudHJ5IHN0dWJzIGFuZCBwb2ludGVyIHRhYmxlIHdpdGgKQEAgLTQwOCw5ICs1MDksMTQgQEAKIAogdmVjdG9yPTAKIEVOVFJZKGlycV9lbnRyaWVzX3N0YXJ0KQorCVJJTkcwX0lOVF9GUkFNRQogLnJlcHQgTlJfSVJRUwogCUFMSUdOCisgLmlmIHZlY3RvcgorCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCAtNAorIC5lbmRpZgogMToJcHVzaGwgJHZlY3Rvci0yNTYKKwlDRklfQURKVVNUX0NGQV9PRkZTRVQgNAogCWptcCBjb21tb25faW50ZXJydXB0CiAuZGF0YQogCS5sb25nIDFiCkBAIC00MjQsNjAgKzUzMCw5OSBAQAogCW1vdmwgJWVzcCwlZWF4CiAJY2FsbCBkb19JUlEKIAlqbXAgcmV0X2Zyb21faW50cgorCUNGSV9FTkRQUk9DCiAKICNkZWZpbmUgQlVJTERfSU5URVJSVVBUKG5hbWUsIG5yKQlcCiBFTlRSWShuYW1lKQkJCQlcCisJUklORzBfSU5UX0ZSQU1FOwkJXAogCXB1c2hsICRuci0yNTY7CQkJXAotCVNBVkVfQUxMCQkJXAorCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCA0OwlcCisJU0FWRV9BTEw7CQkJXAogCW1vdmwgJWVzcCwlZWF4OwkJCVwKIAljYWxsIHNtcF8vKiovbmFtZTsJCVwKLQlqbXAgcmV0X2Zyb21faW50cjsKKwlqbXAgcmV0X2Zyb21faW50cjsJXAorCUNGSV9FTkRQUk9DCiAKIC8qIFRoZSBpbmNsdWRlIGlzIHdoZXJlIGFsbCBvZiB0aGUgU01QIGV0Yy4gaW50ZXJydXB0cyBjb21lIGZyb20gKi8KICNpbmNsdWRlICJlbnRyeV9hcmNoLmgiCiAKIEVOVFJZKGRpdmlkZV9lcnJvcikKKwlSSU5HMF9JTlRfRlJBTUUKIAlwdXNobCAkMAkJCSMgbm8gZXJyb3IgY29kZQorCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCA0CiAJcHVzaGwgJGRvX2RpdmlkZV9lcnJvcgorCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCA0CiAJQUxJR04KIGVycm9yX2NvZGU6CiAJcHVzaGwgJWRzCisJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIDQKKwkvKkNGSV9SRUxfT0ZGU0VUIGRzLCAwKi8KIAlwdXNobCAlZWF4CisJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIDQKKwlDRklfUkVMX09GRlNFVCBlYXgsIDAKIAl4b3JsICVlYXgsICVlYXgKIAlwdXNobCAlZWJwCisJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIDQKKwlDRklfUkVMX09GRlNFVCBlYnAsIDAKIAlwdXNobCAlZWRpCisJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIDQKKwlDRklfUkVMX09GRlNFVCBlZGksIDAKIAlwdXNobCAlZXNpCisJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIDQKKwlDRklfUkVMX09GRlNFVCBlc2ksIDAKIAlwdXNobCAlZWR4CisJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIDQKKwlDRklfUkVMX09GRlNFVCBlZHgsIDAKIAlkZWNsICVlYXgJCQkjIGVheCA9IC0xCiAJcHVzaGwgJWVjeAorCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCA0CisJQ0ZJX1JFTF9PRkZTRVQgZWN4LCAwCiAJcHVzaGwgJWVieAorCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCA0CisJQ0ZJX1JFTF9PRkZTRVQgZWJ4LCAwCiAJY2xkCiAJcHVzaGwgJWVzCisJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIDQKKwkvKkNGSV9SRUxfT0ZGU0VUIGVzLCAwKi8KIAlVTldJTkRfRVNQRklYX1NUQUNLCiAJcG9wbCAlZWN4CisJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIC00CisJLypDRklfUkVHSVNURVIgZXMsIGVjeCovCiAJbW92bCBFUyglZXNwKSwgJWVkaQkJIyBnZXQgdGhlIGZ1bmN0aW9uIGFkZHJlc3MKIAltb3ZsIE9SSUdfRUFYKCVlc3ApLCAlZWR4CSMgZ2V0IHRoZSBlcnJvciBjb2RlCiAJbW92bCAlZWF4LCBPUklHX0VBWCglZXNwKQogCW1vdmwgJWVjeCwgRVMoJWVzcCkKKwkvKkNGSV9SRUxfT0ZGU0VUIGVzLCBFUyovCiAJbW92bCAkKF9fVVNFUl9EUyksICVlY3gKIAltb3ZsICVlY3gsICVkcwogCW1vdmwgJWVjeCwgJWVzCiAJbW92bCAlZXNwLCVlYXgJCQkjIHB0X3JlZ3MgcG9pbnRlcgogCWNhbGwgKiVlZGkKIAlqbXAgcmV0X2Zyb21fZXhjZXB0aW9uCisJQ0ZJX0VORFBST0MKIAogRU5UUlkoY29wcm9jZXNzb3JfZXJyb3IpCisJUklORzBfSU5UX0ZSQU1FCiAJcHVzaGwgJDAKKwlDRklfQURKVVNUX0NGQV9PRkZTRVQgNAogCXB1c2hsICRkb19jb3Byb2Nlc3Nvcl9lcnJvcgorCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCA0CiAJam1wIGVycm9yX2NvZGUKKwlDRklfRU5EUFJPQwogCiBFTlRSWShzaW1kX2NvcHJvY2Vzc29yX2Vycm9yKQorCVJJTkcwX0lOVF9GUkFNRQogCXB1c2hsICQwCisJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIDQKIAlwdXNobCAkZG9fc2ltZF9jb3Byb2Nlc3Nvcl9lcnJvcgorCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCA0CiAJam1wIGVycm9yX2NvZGUKKwlDRklfRU5EUFJPQwogCiBFTlRSWShkZXZpY2Vfbm90X2F2YWlsYWJsZSkKKwlSSU5HMF9JTlRfRlJBTUUKIAlwdXNobCAkLTEJCQkjIG1hcmsgdGhpcyBhcyBhbiBpbnQKKwlDRklfQURKVVNUX0NGQV9PRkZTRVQgNAogCVNBVkVfQUxMCiAJbW92bCAlY3IwLCAlZWF4CiAJdGVzdGwgJDB4NCwgJWVheAkJIyBFTSAobWF0aCBlbXVsYXRpb24gYml0KQpAQCAtNDg3LDkgKzYzMiwxMiBAQAogCWptcCByZXRfZnJvbV9leGNlcHRpb24KIGRldmljZV9ub3RfYXZhaWxhYmxlX2VtdWxhdGU6CiAJcHVzaGwgJDAJCQkjIHRlbXBvcmFyeSBzdG9yYWdlIGZvciBPUklHX0VJUAorCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCA0CiAJY2FsbCBtYXRoX2VtdWxhdGUKIAlhZGRsICQ0LCAlZXNwCisJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIC00CiAJam1wIHJldF9mcm9tX2V4Y2VwdGlvbgorCUNGSV9FTkRQUk9DCiAKIC8qCiAgKiBEZWJ1ZyB0cmFwcyBhbmQgTk1JIGNhbiBoYXBwZW4gYXQgdGhlIG9uZSBTWVNFTlRFUiBpbnN0cnVjdGlvbgpAQCAtNTE0LDE2ICs2NjIsMTkgQEAKIAlwdXNobCAkc3lzZW50ZXJfcGFzdF9lc3AKIAogS1BST0JFX0VOVFJZKGRlYnVnKQorCVJJTkcwX0lOVF9GUkFNRQogCWNtcGwgJHN5c2VudGVyX2VudHJ5LCglZXNwKQogCWpuZSBkZWJ1Z19zdGFja19jb3JyZWN0CiAJRklYX1NUQUNLKDEyLCBkZWJ1Z19zdGFja19jb3JyZWN0LCBkZWJ1Z19lc3BfZml4X2luc24pCiBkZWJ1Z19zdGFja19jb3JyZWN0OgogCXB1c2hsICQtMQkJCSMgbWFyayB0aGlzIGFzIGFuIGludAorCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCA0CiAJU0FWRV9BTEwKIAl4b3JsICVlZHgsJWVkeAkJCSMgZXJyb3IgY29kZSAwCiAJbW92bCAlZXNwLCVlYXgJCQkjIHB0X3JlZ3MgcG9pbnRlcgogCWNhbGwgZG9fZGVidWcKIAlqbXAgcmV0X2Zyb21fZXhjZXB0aW9uCisJQ0ZJX0VORFBST0MKIAkucHJldmlvdXMgLnRleHQKIC8qCiAgKiBOTUkgaXMgZG91Ymx5IG5hc3R5LiBJdCBjYW4gaGFwcGVuIF93aGlsZV8gd2UncmUgaGFuZGxpbmcKQEAgLTUzNCwxNCArNjg1LDE4IEBACiAgKiBmYXVsdCBoYXBwZW5lZCBvbiB0aGUgc3lzZW50ZXIgcGF0aC4KICAqLwogRU5UUlkobm1pKQorCVJJTkcwX0lOVF9GUkFNRQogCXB1c2hsICVlYXgKKwlDRklfQURKVVNUX0NGQV9PRkZTRVQgNAogCW1vdmwgJXNzLCAlZWF4CiAJY21wdyAkX19FU1BGSVhfU1MsICVheAogCXBvcGwgJWVheAorCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCAtNAogCWplIG5taV8xNmJpdF9zdGFjawogCWNtcGwgJHN5c2VudGVyX2VudHJ5LCglZXNwKQogCWplIG5taV9zdGFja19maXh1cAogCXB1c2hsICVlYXgKKwlDRklfQURKVVNUX0NGQV9PRkZTRVQgNAogCW1vdmwgJWVzcCwlZWF4CiAJLyogRG8gbm90IGFjY2VzcyBtZW1vcnkgYWJvdmUgdGhlIGVuZCBvZiBvdXIgc3RhY2sgcGFnZSwKIAkgKiBpdCBtaWdodCBub3QgZXhpc3QuCkBAIC01NDksMTYgKzcwNCwxOSBAQAogCWFuZGwgJChUSFJFQURfU0laRS0xKSwlZWF4CiAJY21wbCAkKFRIUkVBRF9TSVpFLTIwKSwlZWF4CiAJcG9wbCAlZWF4CisJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIC00CiAJamFlIG5taV9zdGFja19jb3JyZWN0CiAJY21wbCAkc3lzZW50ZXJfZW50cnksMTIoJWVzcCkKIAlqZSBubWlfZGVidWdfc3RhY2tfY2hlY2sKIG5taV9zdGFja19jb3JyZWN0OgogCXB1c2hsICVlYXgKKwlDRklfQURKVVNUX0NGQV9PRkZTRVQgNAogCVNBVkVfQUxMCiAJeG9ybCAlZWR4LCVlZHgJCSMgemVybyBlcnJvciBjb2RlCiAJbW92bCAlZXNwLCVlYXgJCSMgcHRfcmVncyBwb2ludGVyCiAJY2FsbCBkb19ubWkKIAlqbXAgcmVzdG9yZV9hbGwKKwlDRklfRU5EUFJPQwogCiBubWlfc3RhY2tfZml4dXA6CiAJRklYX1NUQUNLKDEyLG5taV9zdGFja19jb3JyZWN0LCAxKQpAQCAtNTc0LDk0ICs3MzIsMTc3IEBACiAJam1wIG5taV9zdGFja19jb3JyZWN0CiAKIG5taV8xNmJpdF9zdGFjazoKKwlSSU5HMF9JTlRfRlJBTUUKIAkvKiBjcmVhdGUgdGhlIHBvaW50ZXIgdG8gbHNzIGJhY2sgKi8KIAlwdXNobCAlc3MKKwlDRklfQURKVVNUX0NGQV9PRkZTRVQgNAogCXB1c2hsICVlc3AKKwlDRklfQURKVVNUX0NGQV9PRkZTRVQgNAogCW1vdnp3bCAlc3AsICVlc3AKIAlhZGR3ICQ0LCAoJWVzcCkKIAkvKiBjb3B5IHRoZSBpcmV0IGZyYW1lIG9mIDEyIGJ5dGVzICovCiAJLnJlcHQgMwogCXB1c2hsIDE2KCVlc3ApCisJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIDQKIAkuZW5kcgogCXB1c2hsICVlYXgKKwlDRklfQURKVVNUX0NGQV9PRkZTRVQgNAogCVNBVkVfQUxMCiAJRklYVVBfRVNQRklYX1NUQUNLCQkjICVlYXggPT0gJWVzcAorCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCAtMjAJIyB0aGUgZnJhbWUgaGFzIG5vdyBtb3ZlZAogCXhvcmwgJWVkeCwlZWR4CQkJIyB6ZXJvIGVycm9yIGNvZGUKIAljYWxsIGRvX25taQogCVJFU1RPUkVfUkVHUwogCWxzcyAxMis0KCVlc3ApLCAlZXNwCQkjIGJhY2sgdG8gMTZiaXQgc3RhY2sKIDE6CWlyZXQKKwlDRklfRU5EUFJPQwogLnNlY3Rpb24gX19leF90YWJsZSwiYSIKIAkuYWxpZ24gNAogCS5sb25nIDFiLGlyZXRfZXhjCiAucHJldmlvdXMKIAogS1BST0JFX0VOVFJZKGludDMpCisJUklORzBfSU5UX0ZSQU1FCiAJcHVzaGwgJC0xCQkJIyBtYXJrIHRoaXMgYXMgYW4gaW50CisJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIDQKIAlTQVZFX0FMTAogCXhvcmwgJWVkeCwlZWR4CQkjIHplcm8gZXJyb3IgY29kZQogCW1vdmwgJWVzcCwlZWF4CQkjIHB0X3JlZ3MgcG9pbnRlcgogCWNhbGwgZG9faW50MwogCWptcCByZXRfZnJvbV9leGNlcHRpb24KKwlDRklfRU5EUFJPQwogCS5wcmV2aW91cyAudGV4dAogCiBFTlRSWShvdmVyZmxvdykKKwlSSU5HMF9JTlRfRlJBTUUKIAlwdXNobCAkMAorCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCA0CiAJcHVzaGwgJGRvX292ZXJmbG93CisJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIDQKIAlqbXAgZXJyb3JfY29kZQorCUNGSV9FTkRQUk9DCiAKIEVOVFJZKGJvdW5kcykKKwlSSU5HMF9JTlRfRlJBTUUKIAlwdXNobCAkMAorCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCA0CiAJcHVzaGwgJGRvX2JvdW5kcworCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCA0CiAJam1wIGVycm9yX2NvZGUKKwlDRklfRU5EUFJPQwogCiBFTlRSWShpbnZhbGlkX29wKQorCVJJTkcwX0lOVF9GUkFNRQogCXB1c2hsICQwCisJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIDQKIAlwdXNobCAkZG9faW52YWxpZF9vcAorCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCA0CiAJam1wIGVycm9yX2NvZGUKKwlDRklfRU5EUFJPQwogCiBFTlRSWShjb3Byb2Nlc3Nvcl9zZWdtZW50X292ZXJydW4pCisJUklORzBfSU5UX0ZSQU1FCiAJcHVzaGwgJDAKKwlDRklfQURKVVNUX0NGQV9PRkZTRVQgNAogCXB1c2hsICRkb19jb3Byb2Nlc3Nvcl9zZWdtZW50X292ZXJydW4KKwlDRklfQURKVVNUX0NGQV9PRkZTRVQgNAogCWptcCBlcnJvcl9jb2RlCisJQ0ZJX0VORFBST0MKIAogRU5UUlkoaW52YWxpZF9UU1MpCisJUklORzBfRUNfRlJBTUUKIAlwdXNobCAkZG9faW52YWxpZF9UU1MKKwlDRklfQURKVVNUX0NGQV9PRkZTRVQgNAogCWptcCBlcnJvcl9jb2RlCisJQ0ZJX0VORFBST0MKIAogRU5UUlkoc2VnbWVudF9ub3RfcHJlc2VudCkKKwlSSU5HMF9FQ19GUkFNRQogCXB1c2hsICRkb19zZWdtZW50X25vdF9wcmVzZW50CisJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIDQKIAlqbXAgZXJyb3JfY29kZQorCUNGSV9FTkRQUk9DCiAKIEVOVFJZKHN0YWNrX3NlZ21lbnQpCisJUklORzBfRUNfRlJBTUUKIAlwdXNobCAkZG9fc3RhY2tfc2VnbWVudAorCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCA0CiAJam1wIGVycm9yX2NvZGUKKwlDRklfRU5EUFJPQwogCiBLUFJPQkVfRU5UUlkoZ2VuZXJhbF9wcm90ZWN0aW9uKQorCVJJTkcwX0VDX0ZSQU1FCiAJcHVzaGwgJGRvX2dlbmVyYWxfcHJvdGVjdGlvbgorCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCA0CiAJam1wIGVycm9yX2NvZGUKKwlDRklfRU5EUFJPQwogCS5wcmV2aW91cyAudGV4dAogCiBFTlRSWShhbGlnbm1lbnRfY2hlY2spCisJUklORzBfRUNfRlJBTUUKIAlwdXNobCAkZG9fYWxpZ25tZW50X2NoZWNrCisJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIDQKIAlqbXAgZXJyb3JfY29kZQorCUNGSV9FTkRQUk9DCiAKIEtQUk9CRV9FTlRSWShwYWdlX2ZhdWx0KQorCVJJTkcwX0VDX0ZSQU1FCiAJcHVzaGwgJGRvX3BhZ2VfZmF1bHQKKwlDRklfQURKVVNUX0NGQV9PRkZTRVQgNAogCWptcCBlcnJvcl9jb2RlCisJQ0ZJX0VORFBST0MKIAkucHJldmlvdXMgLnRleHQKIAogI2lmZGVmIENPTkZJR19YODZfTUNFCiBFTlRSWShtYWNoaW5lX2NoZWNrKQorCVJJTkcwX0lOVF9GUkFNRQogCXB1c2hsICQwCisJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIDQKIAlwdXNobCBtYWNoaW5lX2NoZWNrX3ZlY3RvcgorCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCA0CiAJam1wIGVycm9yX2NvZGUKKwlDRklfRU5EUFJPQwogI2VuZGlmCiAKIEVOVFJZKHNwdXJpb3VzX2ludGVycnVwdF9idWcpCisJUklORzBfSU5UX0ZSQU1FCiAJcHVzaGwgJDAKKwlDRklfQURKVVNUX0NGQV9PRkZTRVQgNAogCXB1c2hsICRkb19zcHVyaW91c19pbnRlcnJ1cHRfYnVnCisJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIDQKIAlqbXAgZXJyb3JfY29kZQorCUNGSV9FTkRQUk9DCisKKyNpZmRlZiBDT05GSUdfU1RBQ0tfVU5XSU5ECitFTlRSWShhcmNoX3Vud2luZF9pbml0X3J1bm5pbmcpCisJQ0ZJX1NUQVJUUFJPQworCW1vdmwJNCglZXNwKSwgJWVkeAorCW1vdmwJKCVlc3ApLCAlZWN4CisJbGVhbAk0KCVlc3ApLCAlZWF4CisJbW92bAklZWJ4LCBFQlgoJWVkeCkKKwl4b3JsCSVlYngsICVlYngKKwltb3ZsCSVlYngsIEVDWCglZWR4KQorCW1vdmwJJWVieCwgRURYKCVlZHgpCisJbW92bAklZXNpLCBFU0koJWVkeCkKKwltb3ZsCSVlZGksIEVESSglZWR4KQorCW1vdmwJJWVicCwgRUJQKCVlZHgpCisJbW92bAklZWJ4LCBFQVgoJWVkeCkKKwltb3ZsCSRfX1VTRVJfRFMsIERTKCVlZHgpCisJbW92bAkkX19VU0VSX0RTLCBFUyglZWR4KQorCW1vdmwJJWVieCwgT1JJR19FQVgoJWVkeCkKKwltb3ZsCSVlY3gsIEVJUCglZWR4KQorCW1vdmwJMTIoJWVzcCksICVlY3gKKwltb3ZsCSRfX0tFUk5FTF9DUywgQ1MoJWVkeCkKKwltb3ZsCSVlYngsIEVGTEFHUyglZWR4KQorCW1vdmwJJWVheCwgT0xERVNQKCVlZHgpCisJbW92bAk4KCVlc3ApLCAlZWF4CisJbW92bAklZWN4LCA4KCVlc3ApCisJbW92bAlFQlgoJWVkeCksICVlYngKKwltb3ZsCSRfX0tFUk5FTF9EUywgT0xEU1MoJWVkeCkKKwlqbXBsCSolZWF4CisJQ0ZJX0VORFBST0MKK0VORFBST0MoYXJjaF91bndpbmRfaW5pdF9ydW5uaW5nKQorI2VuZGlmCiAKIC5zZWN0aW9uIC5yb2RhdGEsImEiCiAjaW5jbHVkZSAic3lzY2FsbF90YWJsZS5TIgpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9ocGV0LmMgYi9hcmNoL2kzODYva2VybmVsL2hwZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjczN2MzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9ocGV0LmMKQEAgLTAsMCArMSw2NyBAQAorI2luY2x1ZGUgPGxpbnV4L2Nsb2Nrc291cmNlLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9ocGV0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8YXNtL2hwZXQuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2RlZmluZSBIUEVUX01BU0sJQ0xPQ0tTT1VSQ0VfTUFTSygzMikKKyNkZWZpbmUgSFBFVF9TSElGVAkyMgorCisvKiBGU0VDID0gMTBeLTE1IE5TRUMgPSAxMF4tOSAqLworI2RlZmluZSBGU0VDX1BFUl9OU0VDCTEwMDAwMDAKKworc3RhdGljIHZvaWQgKmhwZXRfcHRyOworCitzdGF0aWMgY3ljbGVfdCByZWFkX2hwZXQodm9pZCkKK3sKKwlyZXR1cm4gKGN5Y2xlX3QpcmVhZGwoaHBldF9wdHIpOworfQorCitzdGF0aWMgc3RydWN0IGNsb2Nrc291cmNlIGNsb2Nrc291cmNlX2hwZXQgPSB7CisJLm5hbWUJCT0gImhwZXQiLAorCS5yYXRpbmcJCT0gMjUwLAorCS5yZWFkCQk9IHJlYWRfaHBldCwKKwkubWFzawkJPSBIUEVUX01BU0ssCisJLm11bHQJCT0gMCwgLyogc2V0IGJlbG93ICovCisJLnNoaWZ0CQk9IEhQRVRfU0hJRlQsCisJLmlzX2NvbnRpbnVvdXMJPSAxLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9ocGV0X2Nsb2Nrc291cmNlKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBocGV0X3BlcmlvZDsKKwl2b2lkIF9faW9tZW0qIGhwZXRfYmFzZTsKKwl1NjQgdG1wOworCisJaWYgKCFocGV0X2FkZHJlc3MpCisJCXJldHVybiAtRU5PREVWOworCisJLyogY2FsY3VsYXRlIHRoZSBocGV0IGFkZHJlc3M6ICovCisJaHBldF9iYXNlID0KKwkJKHZvaWQgX19pb21lbSopaW9yZW1hcF9ub2NhY2hlKGhwZXRfYWRkcmVzcywgSFBFVF9NTUFQX1NJWkUpOworCWhwZXRfcHRyID0gaHBldF9iYXNlICsgSFBFVF9DT1VOVEVSOworCisJLyogY2FsY3VsYXRlIHRoZSBmcmVxdWVuY3k6ICovCisJaHBldF9wZXJpb2QgPSByZWFkbChocGV0X2Jhc2UgKyBIUEVUX1BFUklPRCk7CisKKwkvKgorCSAqIGhwZXQgcGVyaW9kIGlzIGluIGZlbXRvIHNlY29uZHMgcGVyIGN5Y2xlCisJICogc28gd2UgbmVlZCB0byBjb252ZXJ0IHRoaXMgdG8gbnMvY3ljIHVuaXRzCisJICogYXByb3hpbWF0ZWQgYnkgbXVsdC8yXnNoaWZ0CisJICoKKwkgKiAgZnNlYy9jeWMgKiAxbnNlYy8xMDAwMDAwZnNlYyA9IG5zZWMvY3ljID0gbXVsdC8yXnNoaWZ0CisJICogIGZzZWMvY3ljICogMW5zLzEwMDAwMDBmc2VjICogMl5zaGlmdCA9IG11bHQKKwkgKiAgZnNlYy9jeWMgKiAyXnNoaWZ0ICogMW5zZWMvMTAwMDAwMGZzZWMgPSBtdWx0CisJICogIChmc2VjL2N5YyA8PCBzaGlmdCkvMTAwMDAwMCA9IG11bHQKKwkgKiAgKGhwZXRfcGVyaW9kIDw8IHNoaWZ0KS9GU0VDX1BFUl9OU0VDID0gbXVsdAorCSAqLworCXRtcCA9ICh1NjQpaHBldF9wZXJpb2QgPDwgSFBFVF9TSElGVDsKKwlkb19kaXYodG1wLCBGU0VDX1BFUl9OU0VDKTsKKwljbG9ja3NvdXJjZV9ocGV0Lm11bHQgPSAodTMyKXRtcDsKKworCXJldHVybiBjbG9ja3NvdXJjZV9yZWdpc3RlcigmY2xvY2tzb3VyY2VfaHBldCk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfaHBldF9jbG9ja3NvdXJjZSk7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2k4MjUzLmMgYi9hcmNoL2kzODYva2VybmVsL2k4MjUzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc3YjI0ZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvaTgyNTMuYwpAQCAtMCwwICsxLDExOCBAQAorLyoKKyAqIGk4MjUzLmMgIDgyNTMvUElUIGZ1bmN0aW9ucworICoKKyAqLworI2luY2x1ZGUgPGxpbnV4L2Nsb2Nrc291cmNlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8YXNtL3NtcC5oPgorI2luY2x1ZGUgPGFzbS9kZWxheS5oPgorI2luY2x1ZGUgPGFzbS9pODI1My5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSAiaW9fcG9ydHMuaCIKKworREVGSU5FX1NQSU5MT0NLKGk4MjUzX2xvY2spOworRVhQT1JUX1NZTUJPTChpODI1M19sb2NrKTsKKwordm9pZCBzZXR1cF9waXRfdGltZXIodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmk4MjUzX2xvY2ssIGZsYWdzKTsKKwlvdXRiX3AoMHgzNCxQSVRfTU9ERSk7CQkvKiBiaW5hcnksIG1vZGUgMiwgTFNCL01TQiwgY2ggMCAqLworCXVkZWxheSgxMCk7CisJb3V0Yl9wKExBVENIICYgMHhmZiAsIFBJVF9DSDApOwkvKiBMU0IgKi8KKwl1ZGVsYXkoMTApOworCW91dGIoTEFUQ0ggPj4gOCAsIFBJVF9DSDApOwkvKiBNU0IgKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpODI1M19sb2NrLCBmbGFncyk7Cit9CisKKy8qCisgKiBTaW5jZSB0aGUgUElUIG92ZXJmbG93cyBldmVyeSB0aWNrLCBpdHMgbm90IHZlcnkgdXNlZnVsCisgKiB0byBqdXN0IHJlYWQgYnkgaXRzZWxmLiBTbyB1c2UgamlmZmllcyB0byBlbXVsYXRlIGEgZnJlZQorICogcnVubmluZyBjb3VudGVyOgorICovCitzdGF0aWMgY3ljbGVfdCBwaXRfcmVhZCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGNvdW50OworCXUzMiBqaWZzOworCXN0YXRpYyBpbnQgb2xkX2NvdW50OworCXN0YXRpYyB1MzIgb2xkX2ppZnM7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaTgyNTNfbG9jaywgZmxhZ3MpOworICAgICAgICAvKgorCSAqIEFsdGhvdWdoIG91ciBjYWxsZXIgbWF5IGhhdmUgdGhlIHJlYWQgc2lkZSBvZiB4dGltZV9sb2NrLAorCSAqIHRoaXMgaXMgbm93IGEgc2VxbG9jaywgYW5kIHdlIGFyZSBjaGVhdGluZyBpbiB0aGlzIHJvdXRpbmUKKwkgKiBieSBoYXZpbmcgc2lkZSBlZmZlY3RzIG9uIHN0YXRlIHRoYXQgd2UgY2Fubm90IHVuZG8gaWYKKwkgKiB0aGVyZSBpcyBhIGNvbGxpc2lvbiBvbiB0aGUgc2VxbG9jayBhbmQgb3VyIGNhbGxlciBoYXMgdG8KKwkgKiByZXRyeS4gIChOYW1lbHksIG9sZF9qaWZzIGFuZCBvbGRfY291bnQuKSAgU28gd2UgbXVzdCB0cmVhdAorCSAqIGppZmZpZXMgYXMgdm9sYXRpbGUgZGVzcGl0ZSB0aGUgbG9jay4gIFdlIHJlYWQgamlmZmllcworCSAqIGJlZm9yZSBsYXRjaGluZyB0aGUgdGltZXIgY291bnQgdG8gZ3VhcmFudGVlIHRoYXQgYWx0aG91Z2gKKwkgKiB0aGUgamlmZmllcyB2YWx1ZSBtaWdodCBiZSBvbGRlciB0aGFuIHRoZSBjb3VudCAodGhhdCBpcywKKwkgKiB0aGUgY291bnRlciBtYXkgdW5kZXJmbG93IGJldHdlZW4gdGhlIGxhc3QgcG9pbnQgd2hlcmUKKwkgKiBqaWZmaWVzIHdhcyBpbmNyZW1lbnRlZCBhbmQgdGhlIHBvaW50IHdoZXJlIHdlIGxhdGNoIHRoZQorCSAqIGNvdW50KSwgaXQgY2Fubm90IGJlIG5ld2VyLgorCSAqLworCWppZnMgPSBqaWZmaWVzOworCW91dGJfcCgweDAwLCBQSVRfTU9ERSk7CS8qIGxhdGNoIHRoZSBjb3VudCBBU0FQICovCisJY291bnQgPSBpbmJfcChQSVRfQ0gwKTsJLyogcmVhZCB0aGUgbGF0Y2hlZCBjb3VudCAqLworCWNvdW50IHw9IGluYl9wKFBJVF9DSDApIDw8IDg7CisKKwkvKiBWSUE2ODZhIHRlc3QgY29kZS4uLiByZXNldCB0aGUgbGF0Y2ggaWYgY291bnQgPiBtYXggKyAxICovCisJaWYgKGNvdW50ID4gTEFUQ0gpIHsKKwkJb3V0Yl9wKDB4MzQsIFBJVF9NT0RFKTsKKwkJb3V0Yl9wKExBVENIICYgMHhmZiwgUElUX0NIMCk7CisJCW91dGIoTEFUQ0ggPj4gOCwgUElUX0NIMCk7CisJCWNvdW50ID0gTEFUQ0ggLSAxOworCX0KKworCS8qCisJICogSXQncyBwb3NzaWJsZSBmb3IgY291bnQgdG8gYXBwZWFyIHRvIGdvIHRoZSB3cm9uZyB3YXkgZm9yIGEKKwkgKiBjb3VwbGUgb2YgcmVhc29uczoKKwkgKgorCSAqICAxLiBUaGUgdGltZXIgY291bnRlciB1bmRlcmZsb3dzLCBidXQgd2UgaGF2ZW4ndCBoYW5kbGVkIHRoZQorCSAqICAgICByZXN1bHRpbmcgaW50ZXJydXB0IGFuZCBpbmNyZW1lbnRlZCBqaWZmaWVzIHlldC4KKwkgKiAgMi4gSGFyZHdhcmUgcHJvYmxlbSB3aXRoIHRoZSB0aW1lciwgbm90IGdpdmluZyB1cyBjb250aW51b3VzIHRpbWUsCisJICogICAgIHRoZSBjb3VudGVyIGRvZXMgc21hbGwgImp1bXBzIiB1cHdhcmRzIG9uIHNvbWUgUGVudGl1bSBzeXN0ZW1zLAorCSAqICAgICAoc2VlIGMndCA5NS8xMCBwYWdlIDMzNSBmb3IgTmVwdHVuIGJ1Zy4pCisJICoKKwkgKiBQcmV2aW91cyBhdHRlbXB0cyB0byBoYW5kbGUgdGhlc2UgY2FzZXMgaW50ZWxsaWdlbnRseSB3ZXJlCisJICogYnVnZ3ksIHNvIHdlIGp1c3QgZG8gdGhlIHNpbXBsZSB0aGluZyBub3cuCisJICovCisJaWYgKGNvdW50ID4gb2xkX2NvdW50ICYmIGppZnMgPT0gb2xkX2ppZnMpIHsKKwkJY291bnQgPSBvbGRfY291bnQ7CisJfQorCW9sZF9jb3VudCA9IGNvdW50OworCW9sZF9qaWZzID0gamlmczsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmk4MjUzX2xvY2ssIGZsYWdzKTsKKworCWNvdW50ID0gKExBVENIIC0gMSkgLSBjb3VudDsKKworCXJldHVybiAoY3ljbGVfdCkoamlmcyAqIExBVENIKSArIGNvdW50OworfQorCitzdGF0aWMgc3RydWN0IGNsb2Nrc291cmNlIGNsb2Nrc291cmNlX3BpdCA9IHsKKwkubmFtZQk9ICJwaXQiLAorCS5yYXRpbmcgPSAxMTAsCisJLnJlYWQJPSBwaXRfcmVhZCwKKwkubWFzawk9IENMT0NLU09VUkNFX01BU0soMzIpLAorCS5tdWx0CT0gMCwKKwkuc2hpZnQJPSAyMCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfcGl0X2Nsb2Nrc291cmNlKHZvaWQpCit7CisJaWYgKG51bV9wb3NzaWJsZV9jcHVzKCkgPiA0KSAvKiBQSVQgZG9lcyBub3Qgc2NhbGUhICovCisJCXJldHVybiAwOworCisJY2xvY2tzb3VyY2VfcGl0Lm11bHQgPSBjbG9ja3NvdXJjZV9oejJtdWx0KENMT0NLX1RJQ0tfUkFURSwgMjApOworCXJldHVybiBjbG9ja3NvdXJjZV9yZWdpc3RlcigmY2xvY2tzb3VyY2VfcGl0KTsKK30KK21vZHVsZV9pbml0KGluaXRfcGl0X2Nsb2Nrc291cmNlKTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvaTgyNTkuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvaTgyNTkuYwppbmRleCBiNzYzNmI5Li5jMWE0MmZlIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2k4MjU5LmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9pODI1OS5jCkBAIC0xNzUsNyArMTc1LDcgQEAKIAkgKiBMaWdodHdlaWdodCBzcHVyaW91cyBJUlEgZGV0ZWN0aW9uLiBXZSBkbyBub3Qgd2FudAogCSAqIHRvIG92ZXJkbyBzcHVyaW91cyBJUlEgaGFuZGxpbmcgLSBpdCdzIHVzdWFsbHkgYSBzaWduCiAJICogb2YgaGFyZHdhcmUgcHJvYmxlbXMsIHNvIHdlIG9ubHkgZG8gdGhlIGNoZWNrcyB3ZSBjYW4KLQkgKiBkbyB3aXRob3V0IHNsb3dpbmcgZG93biBnb29kIGhhcmR3YXJlIHVubmVjZXNzZXJpbHkuCisJICogZG8gd2l0aG91dCBzbG93aW5nIGRvd24gZ29vZCBoYXJkd2FyZSB1bm5lY2Vzc2FyaWx5LgogCSAqCiAJICogTm90ZSB0aGF0IElSUTcgYW5kIElSUTE1ICh0aGUgdHdvIHNwdXJpb3VzIElSUXMKIAkgKiB1c3VhbGx5IHJlc3VsdGluZyBmcm9tIHRoZSA4MjU5QS0xfDIgUElDcykgb2NjdXIKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvaW9fYXBpYy5jIGIvYXJjaC9pMzg2L2tlcm5lbC9pb19hcGljLmMKaW5kZXggYTYyZGYzZS4uNzJhZTQxNCAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9pb19hcGljLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9pb19hcGljLmMKQEAgLTM4LDYgKzM4LDcgQEAKICNpbmNsdWRlIDxhc20vZGVzYy5oPgogI2luY2x1ZGUgPGFzbS90aW1lci5oPgogI2luY2x1ZGUgPGFzbS9pODI1OS5oPgorI2luY2x1ZGUgPGFzbS9ubWkuaD4KIAogI2luY2x1ZGUgPG1hY2hfYXBpYy5oPgogCkBAIC01MCw2ICs1MSw3IEBACiBzdGF0aWMgc3RydWN0IHsgaW50IHBpbiwgYXBpYzsgfSBpb2FwaWNfaTgyNTkgPSB7IC0xLCAtMSB9OwogCiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGlvYXBpY19sb2NrKTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sodmVjdG9yX2xvY2spOwogCiBpbnQgdGltZXJfb3Zlcl84MjU0IF9faW5pdGRhdGEgPSAxOwogCkBAIC0xMTYxLDEwICsxMTYzLDE3IEBACiBpbnQgYXNzaWduX2lycV92ZWN0b3IoaW50IGlycSkKIHsKIAlzdGF0aWMgaW50IGN1cnJlbnRfdmVjdG9yID0gRklSU1RfREVWSUNFX1ZFQ1RPUiwgb2Zmc2V0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCB2ZWN0b3I7CiAKLQlCVUdfT04oaXJxID49IE5SX0lSUV9WRUNUT1JTKTsKLQlpZiAoaXJxICE9IEFVVE9fQVNTSUdOICYmIElPX0FQSUNfVkVDVE9SKGlycSkgPiAwKQorCUJVR19PTihpcnEgIT0gQVVUT19BU1NJR04gJiYgKHVuc2lnbmVkKWlycSA+PSBOUl9JUlFfVkVDVE9SUyk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdmVjdG9yX2xvY2ssIGZsYWdzKTsKKworCWlmIChpcnEgIT0gQVVUT19BU1NJR04gJiYgSU9fQVBJQ19WRUNUT1IoaXJxKSA+IDApIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmVjdG9yX2xvY2ssIGZsYWdzKTsKIAkJcmV0dXJuIElPX0FQSUNfVkVDVE9SKGlycSk7CisJfQogbmV4dDoKIAljdXJyZW50X3ZlY3RvciArPSA4OwogCWlmIChjdXJyZW50X3ZlY3RvciA9PSBTWVNDQUxMX1ZFQ1RPUikKQEAgLTExNzIsMTYgKzExODEsMjEgQEAKIAogCWlmIChjdXJyZW50X3ZlY3RvciA+PSBGSVJTVF9TWVNURU1fVkVDVE9SKSB7CiAJCW9mZnNldCsrOwotCQlpZiAoIShvZmZzZXQlOCkpCisJCWlmICghKG9mZnNldCU4KSkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmVjdG9yX2xvY2ssIGZsYWdzKTsKIAkJCXJldHVybiAtRU5PU1BDOworCQl9CiAJCWN1cnJlbnRfdmVjdG9yID0gRklSU1RfREVWSUNFX1ZFQ1RPUiArIG9mZnNldDsKIAl9CiAKLQl2ZWN0b3JfaXJxW2N1cnJlbnRfdmVjdG9yXSA9IGlycTsKKwl2ZWN0b3IgPSBjdXJyZW50X3ZlY3RvcjsKKwl2ZWN0b3JfaXJxW3ZlY3Rvcl0gPSBpcnE7CiAJaWYgKGlycSAhPSBBVVRPX0FTU0lHTikKLQkJSU9fQVBJQ19WRUNUT1IoaXJxKSA9IGN1cnJlbnRfdmVjdG9yOworCQlJT19BUElDX1ZFQ1RPUihpcnEpID0gdmVjdG9yOwogCi0JcmV0dXJuIGN1cnJlbnRfdmVjdG9yOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZlY3Rvcl9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gdmVjdG9yOwogfQogCiBzdGF0aWMgc3RydWN0IGh3X2ludGVycnVwdF90eXBlIGlvYXBpY19sZXZlbF90eXBlOwpAQCAtMTE5MywyMSArMTIwNywxNCBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgaW9hcGljX3JlZ2lzdGVyX2ludHIoaW50IGlycSwgaW50IHZlY3RvciwgdW5zaWduZWQgbG9uZyB0cmlnZ2VyKQogewotCWlmICh1c2VfcGNpX3ZlY3RvcigpICYmICFwbGF0Zm9ybV9sZWdhY3lfaXJxKGlycSkpIHsKLQkJaWYgKCh0cmlnZ2VyID09IElPQVBJQ19BVVRPICYmIElPX0FQSUNfaXJxX3RyaWdnZXIoaXJxKSkgfHwKLQkJCQl0cmlnZ2VyID09IElPQVBJQ19MRVZFTCkKLQkJCWlycV9kZXNjW3ZlY3Rvcl0uaGFuZGxlciA9ICZpb2FwaWNfbGV2ZWxfdHlwZTsKLQkJZWxzZQotCQkJaXJxX2Rlc2NbdmVjdG9yXS5oYW5kbGVyID0gJmlvYXBpY19lZGdlX3R5cGU7Ci0JCXNldF9pbnRyX2dhdGUodmVjdG9yLCBpbnRlcnJ1cHRbdmVjdG9yXSk7Ci0JfSBlbHNlCXsKLQkJaWYgKCh0cmlnZ2VyID09IElPQVBJQ19BVVRPICYmIElPX0FQSUNfaXJxX3RyaWdnZXIoaXJxKSkgfHwKLQkJCQl0cmlnZ2VyID09IElPQVBJQ19MRVZFTCkKLQkJCWlycV9kZXNjW2lycV0uaGFuZGxlciA9ICZpb2FwaWNfbGV2ZWxfdHlwZTsKLQkJZWxzZQotCQkJaXJxX2Rlc2NbaXJxXS5oYW5kbGVyID0gJmlvYXBpY19lZGdlX3R5cGU7Ci0JCXNldF9pbnRyX2dhdGUodmVjdG9yLCBpbnRlcnJ1cHRbaXJxXSk7Ci0JfQorCXVuc2lnbmVkIGlkeCA9IHVzZV9wY2lfdmVjdG9yKCkgJiYgIXBsYXRmb3JtX2xlZ2FjeV9pcnEoaXJxKSA/IHZlY3RvciA6IGlycTsKKworCWlmICgodHJpZ2dlciA9PSBJT0FQSUNfQVVUTyAmJiBJT19BUElDX2lycV90cmlnZ2VyKGlycSkpIHx8CisJCQl0cmlnZ2VyID09IElPQVBJQ19MRVZFTCkKKwkJaXJxX2Rlc2NbaWR4XS5oYW5kbGVyID0gJmlvYXBpY19sZXZlbF90eXBlOworCWVsc2UKKwkJaXJxX2Rlc2NbaWR4XS5oYW5kbGVyID0gJmlvYXBpY19lZGdlX3R5cGU7CisJc2V0X2ludHJfZ2F0ZSh2ZWN0b3IsIGludGVycnVwdFtpZHhdKTsKIH0KIAogc3RhdGljIHZvaWQgX19pbml0IHNldHVwX0lPX0FQSUNfaXJxcyh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9pcnEuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvaXJxLmMKaW5kZXggMjQ4ZTkyMi4uMDYxNTMzZSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9pcnEuYworKysgYi9hcmNoL2kzODYva2VybmVsL2lycS5jCkBAIC05NSw2ICs5NSwxNCBAQAogCQlpcnFjdHgtPnRpbmZvLnRhc2sgPSBjdXJjdHgtPnRpbmZvLnRhc2s7CiAJCWlycWN0eC0+dGluZm8ucHJldmlvdXNfZXNwID0gY3VycmVudF9zdGFja19wb2ludGVyOwogCisJCS8qCisJCSAqIENvcHkgdGhlIHNvZnRpcnEgYml0cyBpbiBwcmVlbXB0X2NvdW50IHNvIHRoYXQgdGhlCisJCSAqIHNvZnRpcnEgY2hlY2tzIHdvcmsgaW4gdGhlIGhhcmRpcnEgY29udGV4dC4KKwkJICovCisJCWlycWN0eC0+dGluZm8ucHJlZW1wdF9jb3VudCA9CisJCQlpcnFjdHgtPnRpbmZvLnByZWVtcHRfY291bnQgJiB+U09GVElSUV9NQVNLIHwKKwkJCWN1cmN0eC0+dGluZm8ucHJlZW1wdF9jb3VudCAmIFNPRlRJUlFfTUFTSzsKKwogCQlhc20gdm9sYXRpbGUoCiAJCQkiICAgICAgIHhjaGdsICAgJSVlYngsJSVlc3AgICAgICBcbiIKIAkJCSIgICAgICAgY2FsbCAgICBfX2RvX0lSUSAgICAgICAgIFxuIgpAQCAtMjE5LDcgKzIyNyw3IEBACiAJaWYgKGkgPT0gMCkgewogCQlzZXFfcHJpbnRmKHAsICIgICAgICAgICAgICIpOwogCQlmb3JfZWFjaF9vbmxpbmVfY3B1KGopCi0JCQlzZXFfcHJpbnRmKHAsICJDUFUlZCAgICAgICAiLGopOworCQkJc2VxX3ByaW50ZihwLCAiQ1BVJS04ZCIsaik7CiAJCXNlcV9wdXRjKHAsICdcbicpOwogCX0KIApkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9rcHJvYmVzLmMgYi9hcmNoL2kzODYva2VybmVsL2twcm9iZXMuYwppbmRleCAzOTVhOWE2Li43MjdlNDE5IDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2twcm9iZXMuYworKysgYi9hcmNoL2kzODYva2VybmVsL2twcm9iZXMuYwpAQCAtNTcsMzQgKzU3LDg1IEBACiAvKgogICogcmV0dXJucyBub24temVybyBpZiBvcGNvZGVzIGNhbiBiZSBib29zdGVkLgogICovCi1zdGF0aWMgX19hbHdheXNfaW5saW5lIGludCBjYW5fYm9vc3Qoa3Byb2JlX29wY29kZV90IG9wY29kZSkKK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgaW50IGNhbl9ib29zdChrcHJvYmVfb3Bjb2RlX3QgKm9wY29kZXMpCiB7Ci0Jc3dpdGNoIChvcGNvZGUgJiAweGYwICkgeworI2RlZmluZSBXKHJvdyxiMCxiMSxiMixiMyxiNCxiNSxiNixiNyxiOCxiOSxiYSxiYixiYyxiZCxiZSxiZikJCSAgICAgIFwKKwkoKChiMCMjVUwgPDwgMHgwKXwoYjEjI1VMIDw8IDB4MSl8KGIyIyNVTCA8PCAweDIpfChiMyMjVUwgPDwgMHgzKSB8ICAgXAorCSAgKGI0IyNVTCA8PCAweDQpfChiNSMjVUwgPDwgMHg1KXwoYjYjI1VMIDw8IDB4Nil8KGI3IyNVTCA8PCAweDcpIHwgICBcCisJICAoYjgjI1VMIDw8IDB4OCl8KGI5IyNVTCA8PCAweDkpfChiYSMjVUwgPDwgMHhhKXwoYmIjI1VMIDw8IDB4YikgfCAgIFwKKwkgIChiYyMjVUwgPDwgMHhjKXwoYmQjI1VMIDw8IDB4ZCl8KGJlIyNVTCA8PCAweGUpfChiZiMjVUwgPDwgMHhmKSkgICAgXAorCSA8PCAocm93ICUgMzIpKQorCS8qCisJICogVW5kZWZpbmVkL3Jlc2VydmVkIG9wY29kZXMsIGNvbmRpdGlvbmFsIGp1bXAsIE9wY29kZSBFeHRlbnNpb24KKwkgKiBHcm91cHMsIGFuZCBzb21lIHNwZWNpYWwgb3Bjb2RlcyBjYW4gbm90IGJlIGJvb3N0LgorCSAqLworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIHR3b2J5dGVfaXNfYm9vc3RhYmxlWzI1NiAvIDMyXSA9IHsKKwkJLyogICAgICAwIDEgMiAzIDQgNSA2IDcgOCA5IGEgYiBjIGQgZSBmICAgICAgICAgKi8KKwkJLyogICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAgKi8KKwkJVygweDAwLCAwLDAsMSwxLDAsMCwxLDAsMSwxLDAsMCwwLDAsMCwwKXwgLyogMDAgKi8KKwkJVygweDEwLCAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwKSwgLyogMTAgKi8KKwkJVygweDIwLCAxLDEsMSwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwKXwgLyogMjAgKi8KKwkJVygweDMwLCAwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwKSwgLyogMzAgKi8KKwkJVygweDQwLCAxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxKXwgLyogNDAgKi8KKwkJVygweDUwLCAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwKSwgLyogNTAgKi8KKwkJVygweDYwLCAxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwwLDAsMSwxKXwgLyogNjAgKi8KKwkJVygweDcwLCAwLDAsMCwwLDEsMSwxLDEsMCwwLDAsMCwwLDAsMSwxKSwgLyogNzAgKi8KKwkJVygweDgwLCAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwKXwgLyogODAgKi8KKwkJVygweDkwLCAxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxKSwgLyogOTAgKi8KKwkJVygweGEwLCAxLDEsMCwxLDEsMSwwLDAsMSwxLDAsMSwxLDEsMCwxKXwgLyogYTAgKi8KKwkJVygweGIwLCAxLDEsMSwxLDEsMSwxLDEsMCwwLDAsMSwxLDEsMSwxKSwgLyogYjAgKi8KKwkJVygweGMwLCAxLDEsMCwwLDAsMCwwLDAsMSwxLDEsMSwxLDEsMSwxKXwgLyogYzAgKi8KKwkJVygweGQwLCAwLDEsMSwxLDAsMSwwLDAsMSwxLDAsMSwxLDEsMCwxKSwgLyogZDAgKi8KKwkJVygweGUwLCAwLDEsMSwwLDAsMSwwLDAsMSwxLDAsMSwxLDEsMCwxKXwgLyogZTAgKi8KKwkJVygweGYwLCAwLDEsMSwxLDAsMSwwLDAsMSwxLDEsMCwxLDEsMSwwKSAgLyogZjAgKi8KKwkJLyogICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAgKi8KKwkJLyogICAgICAwIDEgMiAzIDQgNSA2IDcgOCA5IGEgYiBjIGQgZSBmICAgICAgICAgKi8KKwl9OworI3VuZGVmIFcKKwlrcHJvYmVfb3Bjb2RlX3Qgb3Bjb2RlOworCWtwcm9iZV9vcGNvZGVfdCAqb3JpZ19vcGNvZGVzID0gb3Bjb2RlczsKK3JldHJ5OgorCWlmIChvcGNvZGVzIC0gb3JpZ19vcGNvZGVzID4gTUFYX0lOU05fU0laRSAtIDEpCisJCXJldHVybiAwOworCW9wY29kZSA9ICoob3Bjb2RlcysrKTsKKworCS8qIDJuZC1ieXRlIG9wY29kZSAqLworCWlmIChvcGNvZGUgPT0gMHgwZikgeworCQlpZiAob3Bjb2RlcyAtIG9yaWdfb3Bjb2RlcyA+IE1BWF9JTlNOX1NJWkUgLSAxKQorCQkJcmV0dXJuIDA7CisJCXJldHVybiB0ZXN0X2JpdCgqb3Bjb2RlcywgdHdvYnl0ZV9pc19ib29zdGFibGUpOworCX0KKworCXN3aXRjaCAob3Bjb2RlICYgMHhmMCkgeworCWNhc2UgMHg2MDoKKwkJaWYgKDB4NjMgPCBvcGNvZGUgJiYgb3Bjb2RlIDwgMHg2NykKKwkJCWdvdG8gcmV0cnk7IC8qIHByZWZpeGVzICovCisJCS8qIGNhbid0IGJvb3N0IEFkZHJlc3Mtc2l6ZSBvdmVycmlkZSBhbmQgYm91bmQgKi8KKwkJcmV0dXJuIChvcGNvZGUgIT0gMHg2MiAmJiBvcGNvZGUgIT0gMHg2Nyk7CiAJY2FzZSAweDcwOgogCQlyZXR1cm4gMDsgLyogY2FuJ3QgYm9vc3QgY29uZGl0aW9uYWwganVtcCAqLwotCWNhc2UgMHg5MDoKLQkJLyogY2FuJ3QgYm9vc3QgY2FsbCBhbmQgcHVzaGYgKi8KLQkJcmV0dXJuIG9wY29kZSAhPSAweDlhICYmIG9wY29kZSAhPSAweDljOwogCWNhc2UgMHhjMDoKLQkJLyogY2FuJ3QgYm9vc3QgdW5kZWZpbmVkIG9wY29kZXMgYW5kIHNvZnQtaW50ZXJydXB0aW9ucyAqLwotCQlyZXR1cm4gKDB4YzEgPCBvcGNvZGUgJiYgb3Bjb2RlIDwgMHhjNikgfHwKLQkJCSgweGM3IDwgb3Bjb2RlICYmIG9wY29kZSA8IDB4Y2MpIHx8IG9wY29kZSA9PSAweGNmOworCQkvKiBjYW4ndCBib29zdCBzb2Z0d2FyZS1pbnRlcnJ1cHRpb25zICovCisJCXJldHVybiAoMHhjMSA8IG9wY29kZSAmJiBvcGNvZGUgPCAweGNjKSB8fCBvcGNvZGUgPT0gMHhjZjsKIAljYXNlIDB4ZDA6CiAJCS8qIGNhbiBib29zdCBBQSogYW5kIFhMQVQgKi8KIAkJcmV0dXJuIChvcGNvZGUgPT0gMHhkNCB8fCBvcGNvZGUgPT0gMHhkNSB8fCBvcGNvZGUgPT0gMHhkNyk7CiAJY2FzZSAweGUwOgotCQkvKiBjYW4gYm9vc3QgaW4vb3V0IGFuZCAobWF5IGJlKSBqbXBzICovCi0JCXJldHVybiAoMHhlMyA8IG9wY29kZSAmJiBvcGNvZGUgIT0gMHhlOCk7CisJCS8qIGNhbiBib29zdCBpbi9vdXQgYW5kIGFic29sdXRlIGptcHMgKi8KKwkJcmV0dXJuICgob3Bjb2RlICYgMHgwNCkgfHwgb3Bjb2RlID09IDB4ZWEpOwogCWNhc2UgMHhmMDoKKwkJaWYgKChvcGNvZGUgJiAweDBjKSA9PSAwICYmIG9wY29kZSAhPSAweGYxKQorCQkJZ290byByZXRyeTsgLyogbG9jay9yZXAobmUpIHByZWZpeCAqLwogCQkvKiBjbGVhciBhbmQgc2V0IGZsYWdzIGNhbiBiZSBib29zdCAqLwogCQlyZXR1cm4gKG9wY29kZSA9PSAweGY1IHx8ICgweGY3IDwgb3Bjb2RlICYmIG9wY29kZSA8IDB4ZmUpKTsKIAlkZWZhdWx0OgotCQkvKiBjdXJyZW50bHksIGNhbid0IGJvb3N0IDIgYnl0ZXMgb3Bjb2RlcyAqLwotCQlyZXR1cm4gb3Bjb2RlICE9IDB4MGY7CisJCWlmIChvcGNvZGUgPT0gMHgyNiB8fCBvcGNvZGUgPT0gMHgzNiB8fCBvcGNvZGUgPT0gMHgzZSkKKwkJCWdvdG8gcmV0cnk7IC8qIHByZWZpeGVzICovCisJCS8qIGNhbid0IGJvb3N0IENTIG92ZXJyaWRlIGFuZCBjYWxsICovCisJCXJldHVybiAob3Bjb2RlICE9IDB4MmUgJiYgb3Bjb2RlICE9IDB4OWEpOwogCX0KIH0KIAotCiAvKgogICogcmV0dXJucyBub24temVybyBpZiBvcGNvZGUgbW9kaWZpZXMgdGhlIGludGVycnVwdCBmbGFnLgogICovCkBAIC0xMDksNyArMTYwLDcgQEAKIAogCW1lbWNweShwLT5haW5zbi5pbnNuLCBwLT5hZGRyLCBNQVhfSU5TTl9TSVpFICogc2l6ZW9mKGtwcm9iZV9vcGNvZGVfdCkpOwogCXAtPm9wY29kZSA9ICpwLT5hZGRyOwotCWlmIChjYW5fYm9vc3QocC0+b3Bjb2RlKSkgeworCWlmIChjYW5fYm9vc3QocC0+YWRkcikpIHsKIAkJcC0+YWluc24uYm9vc3RhYmxlID0gMDsKIAl9IGVsc2UgewogCQlwLT5haW5zbi5ib29zdGFibGUgPSAtMTsKQEAgLTIwOCw3ICsyNTksOSBAQAogCXN0cnVjdCBrcHJvYmVfY3RsYmxrICprY2I7CiAjaWZkZWYgQ09ORklHX1BSRUVNUFQKIAl1bnNpZ25lZCBwcmVfcHJlZW1wdF9jb3VudCA9IHByZWVtcHRfY291bnQoKTsKLSNlbmRpZiAvKiBDT05GSUdfUFJFRU1QVCAqLworI2Vsc2UKKwl1bnNpZ25lZCBwcmVfcHJlZW1wdF9jb3VudCA9IDE7CisjZW5kaWYKIAogCWFkZHIgPSAoa3Byb2JlX29wY29kZV90ICopKHJlZ3MtPmVpcCAtIHNpemVvZihrcHJvYmVfb3Bjb2RlX3QpKTsKIApAQCAtMjg1LDIyICszMzgsMTQgQEAKIAkJLyogaGFuZGxlciBoYXMgYWxyZWFkeSBzZXQgdGhpbmdzIHVwLCBzbyBza2lwIHNzIHNldHVwICovCiAJCXJldHVybiAxOwogCi0JaWYgKHAtPmFpbnNuLmJvb3N0YWJsZSA9PSAxICYmCi0jaWZkZWYgQ09ORklHX1BSRUVNUFQKLQkgICAgIShwcmVfcHJlZW1wdF9jb3VudCkgJiYgLyoKLQkJCQkgICAgICAgKiBUaGlzIGVuYWJsZXMgYm9vc3RlciB3aGVuIHRoZSBkaXJlY3QKLQkJCQkgICAgICAgKiBleGVjdXRpb24gcGF0aCBhcmVuJ3QgcHJlZW1wdGVkLgotCQkJCSAgICAgICAqLwotI2VuZGlmIC8qIENPTkZJR19QUkVFTVBUICovCi0JICAgICFwLT5wb3N0X2hhbmRsZXIgJiYgIXAtPmJyZWFrX2hhbmRsZXIgKSB7Citzc19wcm9iZToKKwlpZiAocHJlX3ByZWVtcHRfY291bnQgJiYgcC0+YWluc24uYm9vc3RhYmxlID09IDEgJiYgIXAtPnBvc3RfaGFuZGxlcil7CiAJCS8qIEJvb3N0IHVwIC0tIHdlIGNhbiBleGVjdXRlIGNvcGllZCBpbnN0cnVjdGlvbnMgZGlyZWN0bHkgKi8KIAkJcmVzZXRfY3VycmVudF9rcHJvYmUoKTsKIAkJcmVncy0+ZWlwID0gKHVuc2lnbmVkIGxvbmcpcC0+YWluc24uaW5zbjsKIAkJcHJlZW1wdF9lbmFibGVfbm9fcmVzY2hlZCgpOwogCQlyZXR1cm4gMTsKIAl9Ci0KLXNzX3Byb2JlOgogCXByZXBhcmVfc2luZ2xlc3RlcChwLCByZWdzKTsKIAlrY2ItPmtwcm9iZV9zdGF0dXMgPSBLUFJPQkVfSElUX1NTOwogCXJldHVybiAxOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9tYWNoaW5lX2tleGVjLmMgYi9hcmNoL2kzODYva2VybmVsL21hY2hpbmVfa2V4ZWMuYwppbmRleCBmNzNkNzM3Li41MTFhYmU1IDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL21hY2hpbmVfa2V4ZWMuYworKysgYi9hcmNoL2kzODYva2VybmVsL21hY2hpbmVfa2V4ZWMuYwpAQCAtMTMzLDkgKzEzMyw5IEBACiAJCQkJCXVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkcmVzcywKIAkJCQkJdW5zaWduZWQgaW50IGhhc19wYWUpIEFUVFJJQl9OT1JFVDsKIAotY29uc3QgZXh0ZXJuIHVuc2lnbmVkIGNoYXIgcmVsb2NhdGVfbmV3X2tlcm5lbFtdOworZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgcmVsb2NhdGVfbmV3X2tlcm5lbFtdOwogZXh0ZXJuIHZvaWQgcmVsb2NhdGVfbmV3X2tlcm5lbF9lbmQodm9pZCk7Ci1jb25zdCBleHRlcm4gdW5zaWduZWQgaW50IHJlbG9jYXRlX25ld19rZXJuZWxfc2l6ZTsKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBpbnQgcmVsb2NhdGVfbmV3X2tlcm5lbF9zaXplOwogCiAvKgogICogQSBhcmNoaXRlY3R1cmUgaG9vayBjYWxsZWQgdG8gdmFsaWRhdGUgdGhlCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL25taS5jIGIvYXJjaC9pMzg2L2tlcm5lbC9ubWkuYwppbmRleCBkNDNiNDk4Li5hNzZlOTMxIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL25taS5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvbm1pLmMKQEAgLTE0LDIxICsxNCwxNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbWMxNDY4MThydGMuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L25taS5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgogCiAjaW5jbHVkZSA8YXNtL3NtcC5oPgotI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgogI2luY2x1ZGUgPGFzbS9ubWkuaD4KKyNpbmNsdWRlIDxhc20vaW50ZWxfYXJjaF9wZXJmbW9uLmg+CiAKICNpbmNsdWRlICJtYWNoX3RyYXBzLmgiCiAKQEAgLTEwMCw2ICs5Niw5IEBACiAJKFA0X0NDQ1JfT1ZGX1BNSTB8UDRfQ0NDUl9USFJFU0hPTEQoMTUpfFA0X0NDQ1JfQ09NUExFTUVOVHwJXAogCSBQNF9DQ0NSX0NPTVBBUkV8UDRfQ0NDUl9SRVFVSVJFRHxQNF9DQ0NSX0VTQ1JfU0VMRUNUKDQpfFA0X0NDQ1JfRU5BQkxFKQogCisjZGVmaW5lIEFSQ0hfUEVSRk1PTl9OTUlfRVZFTlRfU0VMCUFSQ0hfUEVSRk1PTl9VTkhBTFRFRF9DT1JFX0NZQ0xFU19TRUwKKyNkZWZpbmUgQVJDSF9QRVJGTU9OX05NSV9FVkVOVF9VTUFTSwlBUkNIX1BFUkZNT05fVU5IQUxURURfQ09SRV9DWUNMRVNfVU1BU0sKKwogI2lmZGVmIENPTkZJR19TTVAKIC8qIFRoZSBwZXJmb3JtYW5jZSBjb3VudGVycyB1c2VkIGJ5IE5NSV9MT0NBTF9BUElDIGRvbid0IHRyaWdnZXIgd2hlbgogICogdGhlIENQVSBpcyBpZGxlLiBUbyBtYWtlIHN1cmUgdGhlIE5NSSB3YXRjaGRvZyByZWFsbHkgdGlja3Mgb24gYWxsCkBAIC0yMTIsNiArMjExLDggQEAKIAogX19zZXR1cCgibm1pX3dhdGNoZG9nPSIsIHNldHVwX25taV93YXRjaGRvZyk7CiAKK3N0YXRpYyB2b2lkIGRpc2FibGVfaW50ZWxfYXJjaF93YXRjaGRvZyh2b2lkKTsKKwogc3RhdGljIHZvaWQgZGlzYWJsZV9sYXBpY19ubWlfd2F0Y2hkb2codm9pZCkKIHsKIAlpZiAobm1pX2FjdGl2ZSA8PSAwKQpAQCAtMjIxLDYgKzIyMiwxMCBAQAogCQl3cm1zcihNU1JfSzdfRVZOVFNFTDAsIDAsIDApOwogCQlicmVhazsKIAljYXNlIFg4Nl9WRU5ET1JfSU5URUw6CisJCWlmIChjcHVfaGFzKCZib290X2NwdV9kYXRhLCBYODZfRkVBVFVSRV9BUkNIX1BFUkZNT04pKSB7CisJCQlkaXNhYmxlX2ludGVsX2FyY2hfd2F0Y2hkb2coKTsKKwkJCWJyZWFrOworCQl9CiAJCXN3aXRjaCAoYm9vdF9jcHVfZGF0YS54ODYpIHsKIAkJY2FzZSA2OgogCQkJaWYgKGJvb3RfY3B1X2RhdGEueDg2X21vZGVsID4gMHhkKQpAQCAtNDQ5LDYgKzQ1NCw1MyBAQAogCXJldHVybiAxOwogfQogCitzdGF0aWMgdm9pZCBkaXNhYmxlX2ludGVsX2FyY2hfd2F0Y2hkb2codm9pZCkKK3sKKwl1bnNpZ25lZCBlYng7CisKKwkvKgorCSAqIENoZWNrIHdoZXRoZXIgdGhlIEFyY2hpdGVjdHVyYWwgUGVyZk1vbiBzdXBwb3J0cworCSAqIFVuaGFsdGVkIENvcmUgQ3ljbGVzIEV2ZW50IG9yIG5vdC4KKwkgKiBOT1RFOiBDb3JyZXNwb25kaW5nIGJpdCA9IDAgaW4gZWJwIGluZGljYXRlcyBldmVudCBwcmVzZW50LgorCSAqLworCWVieCA9IGNwdWlkX2VieCgxMCk7CisJaWYgKCEoZWJ4ICYgQVJDSF9QRVJGTU9OX1VOSEFMVEVEX0NPUkVfQ1lDTEVTX1BSRVNFTlQpKQorCQl3cm1zcihNU1JfQVJDSF9QRVJGTU9OX0VWRU5UU0VMMCwgMCwgMCk7Cit9CisKK3N0YXRpYyBpbnQgc2V0dXBfaW50ZWxfYXJjaF93YXRjaGRvZyh2b2lkKQoreworCXVuc2lnbmVkIGludCBldm50c2VsOworCXVuc2lnbmVkIGVieDsKKworCS8qCisJICogQ2hlY2sgd2hldGhlciB0aGUgQXJjaGl0ZWN0dXJhbCBQZXJmTW9uIHN1cHBvcnRzCisJICogVW5oYWx0ZWQgQ29yZSBDeWNsZXMgRXZlbnQgb3Igbm90LgorCSAqIE5PVEU6IENvcnJlc3BvbmRpbmcgYml0ID0gMCBpbiBlYnAgaW5kaWNhdGVzIGV2ZW50IHByZXNlbnQuCisJICovCisJZWJ4ID0gY3B1aWRfZWJ4KDEwKTsKKwlpZiAoKGVieCAmIEFSQ0hfUEVSRk1PTl9VTkhBTFRFRF9DT1JFX0NZQ0xFU19QUkVTRU5UKSkKKwkJcmV0dXJuIDA7CisKKwlubWlfcGVyZmN0cl9tc3IgPSBNU1JfQVJDSF9QRVJGTU9OX1BFUkZDVFIwOworCisJY2xlYXJfbXNyX3JhbmdlKE1TUl9BUkNIX1BFUkZNT05fRVZFTlRTRUwwLCAyKTsKKwljbGVhcl9tc3JfcmFuZ2UoTVNSX0FSQ0hfUEVSRk1PTl9QRVJGQ1RSMCwgMik7CisKKwlldm50c2VsID0gQVJDSF9QRVJGTU9OX0VWRU5UU0VMX0lOVAorCQl8IEFSQ0hfUEVSRk1PTl9FVkVOVFNFTF9PUworCQl8IEFSQ0hfUEVSRk1PTl9FVkVOVFNFTF9VU1IKKwkJfCBBUkNIX1BFUkZNT05fTk1JX0VWRU5UX1NFTAorCQl8IEFSQ0hfUEVSRk1PTl9OTUlfRVZFTlRfVU1BU0s7CisKKwl3cm1zcihNU1JfQVJDSF9QRVJGTU9OX0VWRU5UU0VMMCwgZXZudHNlbCwgMCk7CisJd3JpdGVfd2F0Y2hkb2dfY291bnRlcigiSU5URUxfQVJDSF9QRVJGQ1RSMCIpOworCWFwaWNfd3JpdGUoQVBJQ19MVlRQQywgQVBJQ19ETV9OTUkpOworCWV2bnRzZWwgfD0gQVJDSF9QRVJGTU9OX0VWRU5UU0VMMF9FTkFCTEU7CisJd3Jtc3IoTVNSX0FSQ0hfUEVSRk1PTl9FVkVOVFNFTDAsIGV2bnRzZWwsIDApOworCXJldHVybiAxOworfQorCiB2b2lkIHNldHVwX2FwaWNfbm1pX3dhdGNoZG9nICh2b2lkKQogewogCXN3aXRjaCAoYm9vdF9jcHVfZGF0YS54ODZfdmVuZG9yKSB7CkBAIC00NTgsNiArNTEwLDExIEBACiAJCXNldHVwX2s3X3dhdGNoZG9nKCk7CiAJCWJyZWFrOwogCWNhc2UgWDg2X1ZFTkRPUl9JTlRFTDoKKwkJaWYgKGNwdV9oYXMoJmJvb3RfY3B1X2RhdGEsIFg4Nl9GRUFUVVJFX0FSQ0hfUEVSRk1PTikpIHsKKwkJCWlmICghc2V0dXBfaW50ZWxfYXJjaF93YXRjaGRvZygpKQorCQkJCXJldHVybjsKKwkJCWJyZWFrOworCQl9CiAJCXN3aXRjaCAoYm9vdF9jcHVfZGF0YS54ODYpIHsKIAkJY2FzZSA2OgogCQkJaWYgKGJvb3RfY3B1X2RhdGEueDg2X21vZGVsID4gMHhkKQpAQCAtNTYxLDcgKzYxOCw4IEBACiAJCQl3cm1zcihNU1JfUDRfSVFfQ0NDUjAsIG5taV9wNF9jY2NyX3ZhbCwgMCk7CiAJCQlhcGljX3dyaXRlKEFQSUNfTFZUUEMsIEFQSUNfRE1fTk1JKTsKIAkJfQotCQllbHNlIGlmIChubWlfcGVyZmN0cl9tc3IgPT0gTVNSX1A2X1BFUkZDVFIwKSB7CisJCWVsc2UgaWYgKG5taV9wZXJmY3RyX21zciA9PSBNU1JfUDZfUEVSRkNUUjAgfHwKKwkJICAgICAgICAgbm1pX3BlcmZjdHJfbXNyID09IE1TUl9BUkNIX1BFUkZNT05fUEVSRkNUUjApIHsKIAkJCS8qIE9ubHkgUDYgYmFzZWQgUGVudGl1bSBNIG5lZWQgdG8gcmUtdW5tYXNrCiAJCQkgKiB0aGUgYXBpYyB2ZWN0b3IgYnV0IGl0IGRvZXNuJ3QgaHVydAogCQkJICogb3RoZXIgUDYgdmFyaWFudCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9udW1hcS5jIGIvYXJjaC9pMzg2L2tlcm5lbC9udW1hcS5jCmluZGV4IDVmNWIwNzUuLjBjYWYxNDYgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvbnVtYXEuYworKysgYi9hcmNoL2kzODYva2VybmVsL251bWFxLmMKQEAgLTc5LDEwICs3OSwxMiBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCBudW1hcV9kc2NfZGlzYWJsZSh2b2lkKQorc3RhdGljIGludCBfX2luaXQgbnVtYXFfdHNjX2Rpc2FibGUodm9pZCkKIHsKLQlwcmludGsoS0VSTl9ERUJVRyAiTlVNQVE6IGRpc2FibGluZyBUU0NcbiIpOwotCXRzY19kaXNhYmxlID0gMTsKKwlpZiAobnVtX29ubGluZV9ub2RlcygpID4gMSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiTlVNQVE6IGRpc2FibGluZyBUU0NcbiIpOworCQl0c2NfZGlzYWJsZSA9IDE7CisJfQogCXJldHVybiAwOwogfQotY29yZV9pbml0Y2FsbChudW1hcV9kc2NfZGlzYWJsZSk7CithcmNoX2luaXRjYWxsKG51bWFxX3RzY19kaXNhYmxlKTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9pMzg2L2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggNjI1OWFmZS4uNjk0NmIwNmUgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvcHJvY2Vzcy5jCkBAIC0xMDIsNyArMTAyLDcgQEAKIAlsb2NhbF9pcnFfZW5hYmxlKCk7CiAKIAlpZiAoIWhsdF9jb3VudGVyICYmIGJvb3RfY3B1X2RhdGEuaGx0X3dvcmtzX29rKSB7Ci0JCWNsZWFyX3RocmVhZF9mbGFnKFRJRl9QT0xMSU5HX05SRkxBRyk7CisJCWN1cnJlbnRfdGhyZWFkX2luZm8oKS0+c3RhdHVzICY9IH5UU19QT0xMSU5HOwogCQlzbXBfbWJfX2FmdGVyX2NsZWFyX2JpdCgpOwogCQl3aGlsZSAoIW5lZWRfcmVzY2hlZCgpKSB7CiAJCQlsb2NhbF9pcnFfZGlzYWJsZSgpOwpAQCAtMTExLDcgKzExMSw3IEBACiAJCQllbHNlCiAJCQkJbG9jYWxfaXJxX2VuYWJsZSgpOwogCQl9Ci0JCXNldF90aHJlYWRfZmxhZyhUSUZfUE9MTElOR19OUkZMQUcpOworCQljdXJyZW50X3RocmVhZF9pbmZvKCktPnN0YXR1cyB8PSBUU19QT0xMSU5HOwogCX0gZWxzZSB7CiAJCXdoaWxlICghbmVlZF9yZXNjaGVkKCkpCiAJCQljcHVfcmVsYXgoKTsKQEAgLTE3NCw3ICsxNzQsNyBAQAogewogCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAKLQlzZXRfdGhyZWFkX2ZsYWcoVElGX1BPTExJTkdfTlJGTEFHKTsKKwljdXJyZW50X3RocmVhZF9pbmZvKCktPnN0YXR1cyB8PSBUU19QT0xMSU5HOwogCiAJLyogZW5kbGVzcyBpZGxlIGxvb3Agd2l0aCBubyBwcmlvcml0eSBhdCBhbGwgKi8KIAl3aGlsZSAoMSkgewpAQCAtMzEyLDcgKzMxMiw3IEBACiAJY3IzID0gcmVhZF9jcjMoKTsKIAljcjQgPSByZWFkX2NyNF9zYWZlKCk7CiAJcHJpbnRrKCJDUjA6ICUwOGx4IENSMjogJTA4bHggQ1IzOiAlMDhseCBDUjQ6ICUwOGx4XG4iLCBjcjAsIGNyMiwgY3IzLCBjcjQpOwotCXNob3dfdHJhY2UoTlVMTCwgJnJlZ3MtPmVzcCk7CisJc2hvd190cmFjZShOVUxMLCByZWdzLCAmcmVncy0+ZXNwKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvc2V0dXAuYwppbmRleCBlNjAyMzk3Li40YTY1MDQwIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9zZXR1cC5jCkBAIC00OCw3ICs0OCw2IEBACiAjaW5jbHVkZSA8bGludXgvY3Jhc2hfZHVtcC5oPgogI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgogI2luY2x1ZGUgPGxpbnV4L3Bmbi5oPgotI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KIAogI2luY2x1ZGUgPHZpZGVvL2VkaWQuaD4KIApAQCAtNjEsNyArNjAsNyBAQAogI2luY2x1ZGUgPGFzbS9pb19hcGljLmg+CiAjaW5jbHVkZSA8YXNtL2lzdC5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgInNldHVwX2FyY2hfcHJlLmgiCisjaW5jbHVkZSA8c2V0dXBfYXJjaC5oPgogI2luY2x1ZGUgPGJpb3NfZWJkYS5oPgogCiAvKiBGb3J3YXJkIERlY2xhcmF0aW9uLiAqLwpAQCAtNDExLDggKzQxMCw4IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgYWRkX21lbW9yeV9yZWdpb24odW5zaWduZWQgbG9uZyBsb25nIHN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBzaXplLCBpbnQgdHlwZSkKK3ZvaWQgX19pbml0IGFkZF9tZW1vcnlfcmVnaW9uKHVuc2lnbmVkIGxvbmcgbG9uZyBzdGFydCwKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBzaXplLCBpbnQgdHlwZSkKIHsKIAlpbnQgeDsKIApAQCAtNDc1LDcgKzQ3NCw3IEBACiBzdGF0aWMgc3RydWN0IGU4MjBlbnRyeSAqb3ZlcmxhcF9saXN0W0U4MjBNQVhdIF9faW5pdGRhdGE7CiBzdGF0aWMgc3RydWN0IGU4MjBlbnRyeSBuZXdfYmlvc1tFODIwTUFYXSBfX2luaXRkYXRhOwogCi1zdGF0aWMgaW50IF9faW5pdCBzYW5pdGl6ZV9lODIwX21hcChzdHJ1Y3QgZTgyMGVudHJ5ICogYmlvc21hcCwgY2hhciAqIHBucl9tYXApCitpbnQgX19pbml0IHNhbml0aXplX2U4MjBfbWFwKHN0cnVjdCBlODIwZW50cnkgKiBiaW9zbWFwLCBjaGFyICogcG5yX21hcCkKIHsKIAlzdHJ1Y3QgY2hhbmdlX21lbWJlciAqY2hhbmdlX3RtcDsKIAl1bnNpZ25lZCBsb25nIGN1cnJlbnRfdHlwZSwgbGFzdF90eXBlOwpAQCAtNjQ0LDcgKzY0Myw3IEBACiAgKiB0aGlua3BhZCA1NjB4LCBmb3IgZXhhbXBsZSwgZG9lcyBub3QgY29vcGVyYXRlIHdpdGggdGhlIG1lbW9yeQogICogZGV0ZWN0aW9uIGNvZGUuKQogICovCi1zdGF0aWMgaW50IF9faW5pdCBjb3B5X2U4MjBfbWFwKHN0cnVjdCBlODIwZW50cnkgKiBiaW9zbWFwLCBpbnQgbnJfbWFwKQoraW50IF9faW5pdCBjb3B5X2U4MjBfbWFwKHN0cnVjdCBlODIwZW50cnkgKiBiaW9zbWFwLCBpbnQgbnJfbWFwKQogewogCS8qIE9ubHkgb25lIG1lbW9yeSByZWdpb24gKG9yIG5lZ2F0aXZlKT8gSWdub3JlIGl0ICovCiAJaWYgKG5yX21hcCA8IDIpCkBAIC03MDIsMTIgKzcwMSw2IEBACiB9CiAjZW5kaWYKIAotLyoKLSAqIERvIE5PVCBFVkVSIGxvb2sgYXQgdGhlIEJJT1MgbWVtb3J5IHNpemUgbG9jYXRpb24uCi0gKiBJdCBkb2VzIG5vdCB3b3JrIG9uIG1hbnkgbWFjaGluZXMuCi0gKi8KLSNkZWZpbmUgTE9XTUVNU0laRSgpCSgweDlmMDAwKQotCiBzdGF0aWMgdm9pZCBfX2luaXQgcGFyc2VfY21kbGluZV9lYXJseSAoY2hhciAqKiBjbWRsaW5lX3ApCiB7CiAJY2hhciBjID0gJyAnLCAqdG8gPSBjb21tYW5kX2xpbmUsICpmcm9tID0gc2F2ZWRfY29tbWFuZF9saW5lOwpAQCAtMTQyNCw4ICsxNDE3LDYgQEAKIAkJcGNpX21lbV9zdGFydCwgZ2Fwc3RhcnQsIGdhcHNpemUpOwogfQogCi1zdGF0aWMgY2hhciAqIF9faW5pdCBtYWNoaW5lX3NwZWNpZmljX21lbW9yeV9zZXR1cCh2b2lkKTsKLQogI2lmZGVmIENPTkZJR19NQ0EKIHN0YXRpYyB2b2lkIHNldF9tY2FfYnVzKGludCB4KQogewpAQCAtMTQzNSwxMTEgKzE0MjYsNiBAQAogc3RhdGljIHZvaWQgc2V0X21jYV9idXMoaW50IHgpIHsgfQogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfU09GVFdBUkVfU1VTUEVORAotc3RhdGljIHZvaWQgX19pbml0IG1hcmtfbm9zYXZlX3BhZ2VfcmFuZ2UodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCi17Ci0Jc3RydWN0IHBhZ2UgKnBhZ2U7Ci0Jd2hpbGUgKHN0YXJ0IDw9IGVuZCkgewotCQlwYWdlID0gcGZuX3RvX3BhZ2Uoc3RhcnQpOwotCQlTZXRQYWdlTm9zYXZlKHBhZ2UpOwotCQlzdGFydCsrOwotCX0KLX0KLQotc3RhdGljIHZvaWQgX19pbml0IGU4MjBfbm9zYXZlX3Jlc2VydmVkX3BhZ2VzKHZvaWQpCi17Ci0JaW50IGk7Ci0JdW5zaWduZWQgbG9uZyByX3N0YXJ0ID0gMCwgcl9lbmQgPSAwOwotCi0JLyogQXNzdW1lIGU4MjAgbWFwIGlzIHNvcnRlZCAqLwotCWZvciAoaSA9IDA7IGkgPCBlODIwLm5yX21hcDsgaSsrKSB7Ci0JCXN0cnVjdCBlODIwZW50cnkgKmVpID0gJmU4MjAubWFwW2ldOwotCQl1bnNpZ25lZCBsb25nIHN0YXJ0LCBlbmQ7Ci0KLQkJc3RhcnQgPSBQRk5fRE9XTihlaS0+YWRkcik7Ci0JCWVuZCA9IFBGTl9VUChlaS0+YWRkciArIGVpLT5zaXplKTsKLQkJaWYgKHN0YXJ0ID49IGVuZCkKLQkJCWNvbnRpbnVlOwotCQlpZiAoZWktPnR5cGUgPT0gRTgyMF9SRVNFUlZFRCkKLQkJCWNvbnRpbnVlOwotCQlyX2VuZCA9IHN0YXJ0OwotCQkvKgotCQkgKiBIaWdobWVtICdSZXNlcnZlZCcgcGFnZXMgYXJlIG1hcmtlZCBhcyByZXNlcnZlZCwgc3dzdXNwCi0JCSAqIHdpbGwgbm90IHNhdmUvcmVzdG9yZSB0aGVtLCBzbyB3ZSBpZ25vcmUgdGhlc2UgcGFnZXMgaGVyZS4KLQkJICovCi0JCWlmIChyX2VuZCA+IG1heF9sb3dfcGZuKQotCQkJcl9lbmQgPSBtYXhfbG93X3BmbjsKLQkJaWYgKHJfZW5kID4gcl9zdGFydCkKLQkJCW1hcmtfbm9zYXZlX3BhZ2VfcmFuZ2Uocl9zdGFydCwgcl9lbmQtMSk7Ci0JCWlmIChyX2VuZCA+PSBtYXhfbG93X3BmbikKLQkJCWJyZWFrOwotCQlyX3N0YXJ0ID0gZW5kOwotCX0KLX0KLQotc3RhdGljIHZvaWQgX19pbml0IGU4MjBfc2F2ZV9hY3BpX3BhZ2VzKHZvaWQpCi17Ci0JaW50IGk7Ci0KLQkvKiBBc3N1bWUgZTgyMCBtYXAgaXMgc29ydGVkICovCi0JZm9yIChpID0gMDsgaSA8IGU4MjAubnJfbWFwOyBpKyspIHsKLQkJc3RydWN0IGU4MjBlbnRyeSAqZWkgPSAmZTgyMC5tYXBbaV07Ci0JCXVuc2lnbmVkIGxvbmcgc3RhcnQsIGVuZDsKLQotCQlzdGFydCA9IGVpLT5hZGRyOwotCQllbmQgPSBlaS0+YWRkciArIGVpLT5zaXplOwotCQlpZiAoc3RhcnQgPj0gZW5kKQotCQkJY29udGludWU7Ci0JCWlmIChlaS0+dHlwZSAhPSBFODIwX0FDUEkgJiYgZWktPnR5cGUgIT0gRTgyMF9OVlMpCi0JCQljb250aW51ZTsKLQkJLyoKLQkJICogSWYgdGhlIHJlZ2lvbiBpcyBiZWxvdyBtYXhfbG93X3BmbiwgaXQgd2lsbCBiZQotCQkgKiBzYXZlZC9yZXN0b3JlZCBieSBzd3N1c3AgZm9sbG93ICdSQU0nIHR5cGUuCi0JCSAqLwotCQlpZiAoc3RhcnQgPCAobWF4X2xvd19wZm4gPDwgUEFHRV9TSElGVCkpCi0JCQlzdGFydCA9IG1heF9sb3dfcGZuIDw8IFBBR0VfU0hJRlQ7Ci0JCS8qCi0JCSAqIEhpZ2htZW0gcGFnZXMgKEFDUEkgTlZTL0RhdGEpIGFyZSByZXNlcnZlZCwgYnV0IHN3c3VzcAotCQkgKiBoaWdobWVtIHNhdmUvcmVzdG9yZSB3aWxsIG5vdCBzYXZlL3Jlc3RvcmUgdGhlbS4gV2UgbWFya2VkCi0JCSAqIHRoZW0gYXMgYXJjaCBzYXZlYWJsZSBwYWdlcyBoZXJlCi0JCSAqLwotCQlpZiAoZW5kID4gc3RhcnQpCi0JCQlzd3N1c3BfYWRkX2FyY2hfcGFnZXMoc3RhcnQsIGVuZCk7Ci0JfQotfQotCi1leHRlcm4gY2hhciBfX3N0YXJ0X3JvZGF0YSwgX19lbmRfcm9kYXRhOwotLyoKLSAqIEJJT1MgcmVzZXJ2ZWQgcmVnaW9uL2hvbGUgLSBubyBzYXZlL3Jlc3RvcmUKLSAqIEFDUEkgTlZTIC0gc2F2ZS9yZXN0b3JlCi0gKiBBQ1BJIERhdGEgLSB0aGlzIGlzIGEgbGl0dGxlIHRyaWNreSwgdGhlIG1lbSBjb3VsZCBiZSB1c2VkIGJ5IE9TIGFmdGVyIE9TCi0gKiByZWFkcyB0YWJsZXMgZnJvbSB0aGUgcmVnaW9uLCBidXQgYW55d2F5IHNhdmUvcmVzdG9yZSB0aGUgbWVtb3J5IGhhc24ndCBhbnkKLSAqIHNpZGUgZWZmZWN0IGFuZCBMaW51eCBydW50aW1lIG1vZHVsZSBsb2FkL3VubG9hZCBtaWdodCB1c2UgaXQuCi0gKiBrZXJuZWwgcm9kYXRhIC0gbm8gc2F2ZS9yZXN0b3JlIChrZXJuZWwgcm9kYXRhIGlzbid0IGNoYW5nZWQpCi0gKi8KLXN0YXRpYyBpbnQgX19pbml0IG1hcmtfbm9zYXZlX3BhZ2VzKHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyBwZm5fc3RhcnQsIHBmbl9lbmQ7Ci0KLQkvKiBGSVhNRTogcHJvdmlkZSBhIHZlcnNpb24gZm9yIGVmaSBCSU9TICovCi0JaWYgKGVmaV9lbmFibGVkKQotCQlyZXR1cm4gMDsKLQkvKiBCSU9TIHJlc2VydmVkIHJlZ2lvbnMgJiBob2xlcyAqLwotCWU4MjBfbm9zYXZlX3Jlc2VydmVkX3BhZ2VzKCk7Ci0KLQkvKiBrZXJuZWwgcm9kYXRhICovCi0JcGZuX3N0YXJ0ID0gUEZOX1VQKHZpcnRfdG9fcGh5cygmX19zdGFydF9yb2RhdGEpKTsKLQlwZm5fZW5kID0gUEZOX0RPV04odmlydF90b19waHlzKCZfX2VuZF9yb2RhdGEpKTsKLQltYXJrX25vc2F2ZV9wYWdlX3JhbmdlKHBmbl9zdGFydCwgcGZuX2VuZC0xKTsKLQotCS8qIHJlY29yZCBBQ1BJIERhdGEvTlZTIGFzIHNhdmVhYmxlICovCi0JZTgyMF9zYXZlX2FjcGlfcGFnZXMoKTsKLQotCXJldHVybiAwOwotfQotY29yZV9pbml0Y2FsbChtYXJrX25vc2F2ZV9wYWdlcyk7Ci0jZW5kaWYKLQogLyoKICAqIERldGVybWluZSBpZiB3ZSB3ZXJlIGxvYWRlZCBieSBhbiBFRkkgbG9hZGVyLiAgSWYgc28sIHRoZW4gd2UgaGF2ZSBhbHNvIGJlZW4KICAqIHBhc3NlZCB0aGUgZWZpIG1lbW1hcCwgc3lzdGFiLCBldGMuLCBzbyB3ZSBzaG91bGQgdXNlIHRoZXNlIGRhdGEgc3RydWN0dXJlcwpAQCAtMTY4OSw2ICsxNTc1LDcgQEAKIAljb25zd2l0Y2hwID0gJmR1bW15X2NvbjsKICNlbmRpZgogI2VuZGlmCisJdHNjX2luaXQoKTsKIH0KIAogc3RhdGljIF9faW5pdCBpbnQgYWRkX3Bjc3Brcih2b2lkKQpAQCAtMTcwOCw3ICsxNTk1LDYgQEAKIH0KIGRldmljZV9pbml0Y2FsbChhZGRfcGNzcGtyKTsKIAotI2luY2x1ZGUgInNldHVwX2FyY2hfcG9zdC5oIgogLyoKICAqIExvY2FsIFZhcmlhYmxlczoKICAqIG1vZGU6YwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9zbXAuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvc21wLmMKaW5kZXggZDEzNGU5Ni4uYzEwNzg5ZCAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9zbXAuYworKysgYi9hcmNoL2kzODYva2VybmVsL3NtcC5jCkBAIC0xMTQsNyArMTE0LDE3IEBACiAKIHN0YXRpYyBpbmxpbmUgaW50IF9fcHJlcGFyZV9JQ1IgKHVuc2lnbmVkIGludCBzaG9ydGN1dCwgaW50IHZlY3RvcikKIHsKLQlyZXR1cm4gQVBJQ19ETV9GSVhFRCB8IHNob3J0Y3V0IHwgdmVjdG9yIHwgQVBJQ19ERVNUX0xPR0lDQUw7CisJdW5zaWduZWQgaW50IGljciA9IHNob3J0Y3V0IHwgQVBJQ19ERVNUX0xPR0lDQUw7CisKKwlzd2l0Y2ggKHZlY3RvcikgeworCWRlZmF1bHQ6CisJCWljciB8PSBBUElDX0RNX0ZJWEVEIHwgdmVjdG9yOworCQlicmVhazsKKwljYXNlIE5NSV9WRUNUT1I6CisJCWljciB8PSBBUElDX0RNX05NSTsKKwkJYnJlYWs7CisJfQorCXJldHVybiBpY3I7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IF9fcHJlcGFyZV9JQ1IyICh1bnNpZ25lZCBpbnQgbWFzaykKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvc21wYm9vdC5jIGIvYXJjaC9pMzg2L2tlcm5lbC9zbXBib290LmMKaW5kZXggODI1YjJiNC4uYmNlNTQ3MCAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9zbXBib290LmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9zbXBib290LmMKQEAgLTUyLDYgKzUyLDcgQEAKICNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KICNpbmNsdWRlIDxhc20vZGVzYy5oPgogI2luY2x1ZGUgPGFzbS9hcmNoX2hvb2tzLmg+CisjaW5jbHVkZSA8YXNtL25taS5oPgogCiAjaW5jbHVkZSA8bWFjaF9hcGljLmg+CiAjaW5jbHVkZSA8bWFjaF93YWtlY3B1Lmg+CkBAIC0yNTcsNyArMjU4LDcgQEAKIAkJICogYWxsIEFQcyBzeW5jaHJvbml6ZSBidXQgdGhleSBsb29wIG9uICc9PSBudW1fY3B1cycKIAkJICovCiAJCXdoaWxlIChhdG9taWNfcmVhZCgmdHNjX2NvdW50X3N0YXJ0KSAhPSBudW1fYm9vdGluZ19jcHVzKCktMSkKLQkJCW1iKCk7CisJCQljcHVfcmVsYXgoKTsKIAkJYXRvbWljX3NldCgmdHNjX2NvdW50X3N0b3AsIDApOwogCQl3bWIoKTsKIAkJLyoKQEAgLTI3Niw3ICsyNzcsNyBAQAogCQkgKiBXYWl0IGZvciBhbGwgQVBzIHRvIGxlYXZlIHRoZSBzeW5jaHJvbml6YXRpb24gcG9pbnQ6CiAJCSAqLwogCQl3aGlsZSAoYXRvbWljX3JlYWQoJnRzY19jb3VudF9zdG9wKSAhPSBudW1fYm9vdGluZ19jcHVzKCktMSkKLQkJCW1iKCk7CisJCQljcHVfcmVsYXgoKTsKIAkJYXRvbWljX3NldCgmdHNjX2NvdW50X3N0YXJ0LCAwKTsKIAkJd21iKCk7CiAJCWF0b21pY19pbmMoJnRzY19jb3VudF9zdG9wKTsKQEAgLTMzMywxOSArMzM0LDIxIEBACiAJICogdGhpcyBnZXRzIGNhbGxlZCwgc28gd2UgZmlyc3Qgd2FpdCBmb3IgdGhlIEJQIHRvCiAJICogZmluaXNoIFNNUCBpbml0aWFsaXphdGlvbjoKIAkgKi8KLQl3aGlsZSAoIWF0b21pY19yZWFkKCZ0c2Nfc3RhcnRfZmxhZykpIG1iKCk7CisJd2hpbGUgKCFhdG9taWNfcmVhZCgmdHNjX3N0YXJ0X2ZsYWcpKQorCQljcHVfcmVsYXgoKTsKIAogCWZvciAoaSA9IDA7IGkgPCBOUl9MT09QUzsgaSsrKSB7CiAJCWF0b21pY19pbmMoJnRzY19jb3VudF9zdGFydCk7CiAJCXdoaWxlIChhdG9taWNfcmVhZCgmdHNjX2NvdW50X3N0YXJ0KSAhPSBudW1fYm9vdGluZ19jcHVzKCkpCi0JCQltYigpOworCQkJY3B1X3JlbGF4KCk7CiAKIAkJcmR0c2NsbCh0c2NfdmFsdWVzW3NtcF9wcm9jZXNzb3JfaWQoKV0pOwogCQlpZiAoaSA9PSBOUl9MT09QUy0xKQogCQkJd3JpdGVfdHNjKDAsIDApOwogCiAJCWF0b21pY19pbmMoJnRzY19jb3VudF9zdG9wKTsKLQkJd2hpbGUgKGF0b21pY19yZWFkKCZ0c2NfY291bnRfc3RvcCkgIT0gbnVtX2Jvb3RpbmdfY3B1cygpKSBtYigpOworCQl3aGlsZSAoYXRvbWljX3JlYWQoJnRzY19jb3VudF9zdG9wKSAhPSBudW1fYm9vdGluZ19jcHVzKCkpCisJCQljcHVfcmVsYXgoKTsKIAl9CiB9CiAjdW5kZWYgTlJfTE9PUFMKQEAgLTE0MzMsNyArMTQzNiw3IEBACiAJLyogVW5sZWFzaCB0aGUgQ1BVISAqLwogCWNwdV9zZXQoY3B1LCBzbXBfY29tbWVuY2VkX21hc2spOwogCXdoaWxlICghY3B1X2lzc2V0KGNwdSwgY3B1X29ubGluZV9tYXApKQotCQltYigpOworCQljcHVfcmVsYXgoKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC90aW1lLmMgYi9hcmNoL2kzODYva2VybmVsL3RpbWUuYwppbmRleCA5ZDMwNzQ3Li41ZjQzZDA0IDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL3RpbWUuYworKysgYi9hcmNoL2kzODYva2VybmVsL3RpbWUuYwpAQCAtODIsMTMgKzgyLDYgQEAKIERFRklORV9TUElOTE9DSyhydGNfbG9jayk7CiBFWFBPUlRfU1lNQk9MKHJ0Y19sb2NrKTsKIAotI2luY2x1ZGUgPGFzbS9pODI1My5oPgotCi1ERUZJTkVfU1BJTkxPQ0soaTgyNTNfbG9jayk7Ci1FWFBPUlRfU1lNQk9MKGk4MjUzX2xvY2spOwotCi1zdHJ1Y3QgdGltZXJfb3B0cyAqY3VyX3RpbWVyIF9fcmVhZF9tb3N0bHkgPSAmdGltZXJfbm9uZTsKLQogLyoKICAqIFRoaXMgaXMgYSBzcGVjaWFsIGxvY2sgdGhhdCBpcyBvd25lZCBieSB0aGUgQ1BVIGFuZCBob2xkcyB0aGUgaW5kZXgKICAqIHJlZ2lzdGVyIHdlIGFyZSB3b3JraW5nIHdpdGguICBJdCBpcyByZXF1aXJlZCBmb3IgTk1JIGFjY2VzcyB0byB0aGUKQEAgLTExOCw5OSArMTExLDE5IEBACiB9CiBFWFBPUlRfU1lNQk9MKHJ0Y19jbW9zX3dyaXRlKTsKIAotLyoKLSAqIFRoaXMgdmVyc2lvbiBvZiBnZXR0aW1lb2ZkYXkgaGFzIG1pY3Jvc2Vjb25kIHJlc29sdXRpb24KLSAqIGFuZCBiZXR0ZXIgdGhhbiBtaWNyb3NlY29uZCBwcmVjaXNpb24gb24gZmFzdCB4ODYgbWFjaGluZXMgd2l0aCBUU0MuCi0gKi8KLXZvaWQgZG9fZ2V0dGltZW9mZGF5KHN0cnVjdCB0aW1ldmFsICp0dikKLXsKLQl1bnNpZ25lZCBsb25nIHNlcTsKLQl1bnNpZ25lZCBsb25nIHVzZWMsIHNlYzsKLQl1bnNpZ25lZCBsb25nIG1heF9udHBfdGljazsKLQotCWRvIHsKLQkJdW5zaWduZWQgbG9uZyBsb3N0OwotCi0JCXNlcSA9IHJlYWRfc2VxYmVnaW4oJnh0aW1lX2xvY2spOwotCi0JCXVzZWMgPSBjdXJfdGltZXItPmdldF9vZmZzZXQoKTsKLQkJbG9zdCA9IGppZmZpZXMgLSB3YWxsX2ppZmZpZXM7Ci0KLQkJLyoKLQkJICogSWYgdGltZV9hZGp1c3QgaXMgbmVnYXRpdmUgdGhlbiBOVFAgaXMgc2xvd2luZyB0aGUgY2xvY2sKLQkJICogc28gbWFrZSBzdXJlIG5vdCB0byBnbyBpbnRvIG5leHQgcG9zc2libGUgaW50ZXJ2YWwuCi0JCSAqIEJldHRlciB0byBsb3NlIHNvbWUgYWNjdXJhY3kgdGhhbiBoYXZlIHRpbWUgZ28gYmFja3dhcmRzLi4KLQkJICovCi0JCWlmICh1bmxpa2VseSh0aW1lX2FkanVzdCA8IDApKSB7Ci0JCQltYXhfbnRwX3RpY2sgPSAoVVNFQ19QRVJfU0VDIC8gSFopIC0gdGlja2FkajsKLQkJCXVzZWMgPSBtaW4odXNlYywgbWF4X250cF90aWNrKTsKLQotCQkJaWYgKGxvc3QpCi0JCQkJdXNlYyArPSBsb3N0ICogbWF4X250cF90aWNrOwotCQl9Ci0JCWVsc2UgaWYgKHVubGlrZWx5KGxvc3QpKQotCQkJdXNlYyArPSBsb3N0ICogKFVTRUNfUEVSX1NFQyAvIEhaKTsKLQotCQlzZWMgPSB4dGltZS50dl9zZWM7Ci0JCXVzZWMgKz0gKHh0aW1lLnR2X25zZWMgLyAxMDAwKTsKLQl9IHdoaWxlIChyZWFkX3NlcXJldHJ5KCZ4dGltZV9sb2NrLCBzZXEpKTsKLQotCXdoaWxlICh1c2VjID49IDEwMDAwMDApIHsKLQkJdXNlYyAtPSAxMDAwMDAwOwotCQlzZWMrKzsKLQl9Ci0KLQl0di0+dHZfc2VjID0gc2VjOwotCXR2LT50dl91c2VjID0gdXNlYzsKLX0KLQotRVhQT1JUX1NZTUJPTChkb19nZXR0aW1lb2ZkYXkpOwotCi1pbnQgZG9fc2V0dGltZW9mZGF5KHN0cnVjdCB0aW1lc3BlYyAqdHYpCi17Ci0JdGltZV90IHd0bV9zZWMsIHNlYyA9IHR2LT50dl9zZWM7Ci0JbG9uZyB3dG1fbnNlYywgbnNlYyA9IHR2LT50dl9uc2VjOwotCi0JaWYgKCh1bnNpZ25lZCBsb25nKXR2LT50dl9uc2VjID49IE5TRUNfUEVSX1NFQykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQl3cml0ZV9zZXFsb2NrX2lycSgmeHRpbWVfbG9jayk7Ci0JLyoKLQkgKiBUaGlzIGlzIHJldm9sdGluZy4gV2UgbmVlZCB0byBzZXQgInh0aW1lIiBjb3JyZWN0bHkuIEhvd2V2ZXIsIHRoZQotCSAqIHZhbHVlIGluIHRoaXMgbG9jYXRpb24gaXMgdGhlIHZhbHVlIGF0IHRoZSBtb3N0IHJlY2VudCB1cGRhdGUgb2YKLQkgKiB3YWxsIHRpbWUuICBEaXNjb3ZlciB3aGF0IGNvcnJlY3Rpb24gZ2V0dGltZW9mZGF5KCkgd291bGQgaGF2ZQotCSAqIG1hZGUsIGFuZCB0aGVuIHVuZG8gaXQhCi0JICovCi0JbnNlYyAtPSBjdXJfdGltZXItPmdldF9vZmZzZXQoKSAqIE5TRUNfUEVSX1VTRUM7Ci0JbnNlYyAtPSAoamlmZmllcyAtIHdhbGxfamlmZmllcykgKiBUSUNLX05TRUM7Ci0KLQl3dG1fc2VjICA9IHdhbGxfdG9fbW9ub3RvbmljLnR2X3NlYyArICh4dGltZS50dl9zZWMgLSBzZWMpOwotCXd0bV9uc2VjID0gd2FsbF90b19tb25vdG9uaWMudHZfbnNlYyArICh4dGltZS50dl9uc2VjIC0gbnNlYyk7Ci0KLQlzZXRfbm9ybWFsaXplZF90aW1lc3BlYygmeHRpbWUsIHNlYywgbnNlYyk7Ci0Jc2V0X25vcm1hbGl6ZWRfdGltZXNwZWMoJndhbGxfdG9fbW9ub3RvbmljLCB3dG1fc2VjLCB3dG1fbnNlYyk7Ci0KLQludHBfY2xlYXIoKTsKLQl3cml0ZV9zZXF1bmxvY2tfaXJxKCZ4dGltZV9sb2NrKTsKLQljbG9ja193YXNfc2V0KCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLUVYUE9SVF9TWU1CT0woZG9fc2V0dGltZW9mZGF5KTsKLQogc3RhdGljIGludCBzZXRfcnRjX21tc3ModW5zaWduZWQgbG9uZyBub3d0aW1lKQogewogCWludCByZXR2YWw7Ci0KLQlXQVJOX09OKGlycXNfZGlzYWJsZWQoKSk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCS8qIGdldHMgcmVjYWxsZWQgd2l0aCBpcnEgbG9jYWxseSBkaXNhYmxlZCAqLwotCXNwaW5fbG9ja19pcnEoJnJ0Y19sb2NrKTsKKwkvKiBYWFggLSBkb2VzIGlycXNhdmUgcmVzb2x2ZSB0aGlzPyAtam9obnN0dWwgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmcnRjX2xvY2ssIGZsYWdzKTsKIAlpZiAoZWZpX2VuYWJsZWQpCiAJCXJldHZhbCA9IGVmaV9zZXRfcnRjX21tc3Mobm93dGltZSk7CiAJZWxzZQogCQlyZXR2YWwgPSBtYWNoX3NldF9ydGNfbW1zcyhub3d0aW1lKTsKLQlzcGluX3VubG9ja19pcnEoJnJ0Y19sb2NrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydGNfbG9jaywgZmxhZ3MpOwogCiAJcmV0dXJuIHJldHZhbDsKIH0KQEAgLTIxOCwxNiArMTMxLDYgQEAKIAogaW50IHRpbWVyX2FjazsKIAotLyogbW9ub3RvbmljX2Nsb2NrKCk6IHJldHVybnMgIyBvZiBuYW5vc2Vjb25kcyBwYXNzZWQgc2luY2UgdGltZV9pbml0KCkKLSAqCQlOb3RlOiBUaGlzIGZ1bmN0aW9uIGlzIHJlcXVpcmVkIHRvIHJldHVybiBhY2N1cmF0ZQotICoJCXRpbWUgZXZlbiBpbiB0aGUgYWJzZW5jZSBvZiBtdWx0aXBsZSB0aW1lciB0aWNrcy4KLSAqLwotdW5zaWduZWQgbG9uZyBsb25nIG1vbm90b25pY19jbG9jayh2b2lkKQotewotCXJldHVybiBjdXJfdGltZXItPm1vbm90b25pY19jbG9jaygpOwotfQotRVhQT1JUX1NZTUJPTChtb25vdG9uaWNfY2xvY2spOwotCiAjaWYgZGVmaW5lZChDT05GSUdfU01QKSAmJiBkZWZpbmVkKENPTkZJR19GUkFNRV9QT0lOVEVSKQogdW5zaWduZWQgbG9uZyBwcm9maWxlX3BjKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewpAQCAtMjQyLDExICsxNDUsMjEgQEAKICNlbmRpZgogCiAvKgotICogdGltZXJfaW50ZXJydXB0KCkgbmVlZHMgdG8ga2VlcCB1cCB0aGUgcmVhbC10aW1lIGNsb2NrLAotICogYXMgd2VsbCBhcyBjYWxsIHRoZSAiZG9fdGltZXIoKSIgcm91dGluZSBldmVyeSBjbG9ja3RpY2sKKyAqIFRoaXMgaXMgdGhlIHNhbWUgYXMgdGhlIGFib3ZlLCBleGNlcHQgd2UgX2Fsc29fIHNhdmUgdGhlIGN1cnJlbnQKKyAqIFRpbWUgU3RhbXAgQ291bnRlciB2YWx1ZSBhdCB0aGUgdGltZSBvZiB0aGUgdGltZXIgaW50ZXJydXB0LCBzbyB0aGF0CisgKiB3ZSBsYXRlciBvbiBjYW4gZXN0aW1hdGUgdGhlIHRpbWUgb2YgZGF5IG1vcmUgZXhhY3RseS4KICAqLwotc3RhdGljIGlubGluZSB2b2lkIGRvX3RpbWVyX2ludGVycnVwdChpbnQgaXJxLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK2lycXJldHVybl90IHRpbWVyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogeworCS8qCisJICogSGVyZSB3ZSBhcmUgaW4gdGhlIHRpbWVyIGlycSBoYW5kbGVyLiBXZSBqdXN0IGhhdmUgaXJxcyBsb2NhbGx5CisJICogZGlzYWJsZWQgYnV0IHdlIGRvbid0IGtub3cgaWYgdGhlIHRpbWVyX2JoIGlzIHJ1bm5pbmcgb24gdGhlIG90aGVyCisJICogQ1BVLiBXZSBuZWVkIHRvIGF2b2lkIHRvIFNNUCByYWNlIHdpdGggaXQuIE5PVEU6IHdlIGRvbicgdCBuZWVkCisJICogdGhlIGlycSB2ZXJzaW9uIG9mIHdyaXRlX2xvY2sgYmVjYXVzZSBhcyBqdXN0IHNhaWQgd2UgaGF2ZSBpcnEKKwkgKiBsb2NhbGx5IGRpc2FibGVkLiAtYXJjYQorCSAqLworCXdyaXRlX3NlcWxvY2soJnh0aW1lX2xvY2spOworCiAjaWZkZWYgQ09ORklHX1g4Nl9JT19BUElDCiAJaWYgKHRpbWVyX2FjaykgewogCQkvKgpAQCAtMjc5LDI3ICsxOTIsNiBAQAogCQlpcnEgPSBpbmJfcCggMHg2MSApOwkvKiByZWFkIHRoZSBjdXJyZW50IHN0YXRlICovCiAJCW91dGJfcCggaXJxfDB4ODAsIDB4NjEgKTsJLyogcmVzZXQgdGhlIElSUSAqLwogCX0KLX0KLQotLyoKLSAqIFRoaXMgaXMgdGhlIHNhbWUgYXMgdGhlIGFib3ZlLCBleGNlcHQgd2UgX2Fsc29fIHNhdmUgdGhlIGN1cnJlbnQKLSAqIFRpbWUgU3RhbXAgQ291bnRlciB2YWx1ZSBhdCB0aGUgdGltZSBvZiB0aGUgdGltZXIgaW50ZXJydXB0LCBzbyB0aGF0Ci0gKiB3ZSBsYXRlciBvbiBjYW4gZXN0aW1hdGUgdGhlIHRpbWUgb2YgZGF5IG1vcmUgZXhhY3RseS4KLSAqLwotaXJxcmV0dXJuX3QgdGltZXJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0JLyoKLQkgKiBIZXJlIHdlIGFyZSBpbiB0aGUgdGltZXIgaXJxIGhhbmRsZXIuIFdlIGp1c3QgaGF2ZSBpcnFzIGxvY2FsbHkKLQkgKiBkaXNhYmxlZCBidXQgd2UgZG9uJ3Qga25vdyBpZiB0aGUgdGltZXJfYmggaXMgcnVubmluZyBvbiB0aGUgb3RoZXIKLQkgKiBDUFUuIFdlIG5lZWQgdG8gYXZvaWQgdG8gU01QIHJhY2Ugd2l0aCBpdC4gTk9URTogd2UgZG9uJyB0IG5lZWQKLQkgKiB0aGUgaXJxIHZlcnNpb24gb2Ygd3JpdGVfbG9jayBiZWNhdXNlIGFzIGp1c3Qgc2FpZCB3ZSBoYXZlIGlycQotCSAqIGxvY2FsbHkgZGlzYWJsZWQuIC1hcmNhCi0JICovCi0Jd3JpdGVfc2VxbG9jaygmeHRpbWVfbG9jayk7Ci0KLQljdXJfdGltZXItPm1hcmtfb2Zmc2V0KCk7Ci0gCi0JZG9fdGltZXJfaW50ZXJydXB0KGlycSwgcmVncyk7CiAKIAl3cml0ZV9zZXF1bmxvY2soJnh0aW1lX2xvY2spOwogCkBAIC0zODAsNyArMjcyLDYgQEAKIAogc3RhdGljIGxvbmcgY2xvY2tfY21vc19kaWZmLCBzbGVlcF9zdGFydDsKIAotc3RhdGljIHN0cnVjdCB0aW1lcl9vcHRzICpsYXN0X3RpbWVyOwogc3RhdGljIGludCB0aW1lcl9zdXNwZW5kKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKIHsKIAkvKgpAQCAtMzg5LDEwICsyODAsNiBAQAogCWNsb2NrX2Ntb3NfZGlmZiA9IC1nZXRfY21vc190aW1lKCk7CiAJY2xvY2tfY21vc19kaWZmICs9IGdldF9zZWNvbmRzKCk7CiAJc2xlZXBfc3RhcnQgPSBnZXRfY21vc190aW1lKCk7Ci0JbGFzdF90aW1lciA9IGN1cl90aW1lcjsKLQljdXJfdGltZXIgPSAmdGltZXJfbm9uZTsKLQlpZiAobGFzdF90aW1lci0+c3VzcGVuZCkKLQkJbGFzdF90aW1lci0+c3VzcGVuZChzdGF0ZSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQxNSwxMCArMzAyLDYgQEAKIAlqaWZmaWVzXzY0ICs9IHNsZWVwX2xlbmd0aDsKIAl3YWxsX2ppZmZpZXMgKz0gc2xlZXBfbGVuZ3RoOwogCXdyaXRlX3NlcXVubG9ja19pcnFyZXN0b3JlKCZ4dGltZV9sb2NrLCBmbGFncyk7Ci0JaWYgKGxhc3RfdGltZXItPnJlc3VtZSkKLQkJbGFzdF90aW1lci0+cmVzdW1lKCk7Ci0JY3VyX3RpbWVyID0gbGFzdF90aW1lcjsKLQlsYXN0X3RpbWVyID0gTlVMTDsKIAl0b3VjaF9zb2Z0bG9ja3VwX3dhdGNoZG9nKCk7CiAJcmV0dXJuIDA7CiB9CkBAIC00NjAsOSArMzQzLDYgQEAKIAkJcHJpbnRrKCJVc2luZyBIUEVUIGZvciBiYXNlLXRpbWVyXG4iKTsKIAl9CiAKLQljdXJfdGltZXIgPSBzZWxlY3RfdGltZXIoKTsKLQlwcmludGsoS0VSTl9JTkZPICJVc2luZyAlcyBmb3IgaGlnaC1yZXMgdGltZXNvdXJjZVxuIixjdXJfdGltZXItPm5hbWUpOwotCiAJdGltZV9pbml0X2hvb2soKTsKIH0KICNlbmRpZgpAQCAtNDg0LDggKzM2NCw1IEBACiAJc2V0X25vcm1hbGl6ZWRfdGltZXNwZWMoJndhbGxfdG9fbW9ub3RvbmljLAogCQkteHRpbWUudHZfc2VjLCAteHRpbWUudHZfbnNlYyk7CiAKLQljdXJfdGltZXIgPSBzZWxlY3RfdGltZXIoKTsKLQlwcmludGsoS0VSTl9JTkZPICJVc2luZyAlcyBmb3IgaGlnaC1yZXMgdGltZXNvdXJjZVxuIixjdXJfdGltZXItPm5hbWUpOwotCiAJdGltZV9pbml0X2hvb2soKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvdGltZXJzL01ha2VmaWxlIGIvYXJjaC9pMzg2L2tlcm5lbC90aW1lcnMvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYTEyYmUuLjAwMDAwMDAKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC90aW1lcnMvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLSMKLSMgTWFrZWZpbGUgZm9yIHg4NiB0aW1lcnMKLSMKLQotb2JqLXkgOj0gdGltZXIubyB0aW1lcl9ub25lLm8gdGltZXJfdHNjLm8gdGltZXJfcGl0Lm8gY29tbW9uLm8KLQotb2JqLSQoQ09ORklHX1g4Nl9DWUNMT05FX1RJTUVSKQkrPSB0aW1lcl9jeWNsb25lLm8KLW9iai0kKENPTkZJR19IUEVUX1RJTUVSKQkrPSB0aW1lcl9ocGV0Lm8KLW9iai0kKENPTkZJR19YODZfUE1fVElNRVIpCSs9IHRpbWVyX3BtLm8KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvdGltZXJzL2NvbW1vbi5jIGIvYXJjaC9pMzg2L2tlcm5lbC90aW1lcnMvY29tbW9uLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNjNmZTAuLjAwMDAwMDAKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC90aW1lcnMvY29tbW9uLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoKLSAqCUNvbW1vbiBmdW5jdGlvbnMgdXNlZCBhY3Jvc3MgdGhlIHRpbWVycyBnbyBoZXJlCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC90aW1leC5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotCi0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL3RpbWVyLmg+Ci0jaW5jbHVkZSA8YXNtL2hwZXQuaD4KLQotI2luY2x1ZGUgIm1hY2hfdGltZXIuaCIKLQotLyogLS0tLS0tIENhbGlicmF0ZSB0aGUgVFNDIC0tLS0tLS0KLSAqIFJldHVybiAyXjMyICogKDEgLyAoVFNDIGNsb2NrcyBwZXIgdXNlYykpIGZvciBkb19mYXN0X2dldHRpbWVvZmZzZXQoKS4KLSAqIFRvbyBtdWNoIDY0LWJpdCBhcml0aG1ldGljIGhlcmUgdG8gZG8gdGhpcyBjbGVhbmx5IGluIEMsIGFuZCBmb3IKLSAqIGFjY3VyYWN5J3Mgc2FrZSB3ZSB3YW50IHRvIGtlZXAgdGhlIG92ZXJoZWFkIG9uIHRoZSBDVEMgc3BlYWtlciAoY2hhbm5lbCAyKQotICogb3V0cHV0IGJ1c3kgbG9vcCBhcyBsb3cgYXMgcG9zc2libGUuIFdlIGF2b2lkIHJlYWRpbmcgdGhlIENUQyByZWdpc3RlcnMKLSAqIGRpcmVjdGx5IGJlY2F1c2Ugb2YgdGhlIGF3a3dhcmQgOC1iaXQgYWNjZXNzIG1lY2hhbmlzbSBvZiB0aGUgODJDNTQKLSAqIGRldmljZS4KLSAqLwotCi0jZGVmaW5lIENBTElCUkFURV9USU1FCSg1ICogMTAwMDAyMC9IWikKLQotdW5zaWduZWQgbG9uZyBjYWxpYnJhdGVfdHNjKHZvaWQpCi17Ci0JbWFjaF9wcmVwYXJlX2NvdW50ZXIoKTsKLQotCXsKLQkJdW5zaWduZWQgbG9uZyBzdGFydGxvdywgc3RhcnRoaWdoOwotCQl1bnNpZ25lZCBsb25nIGVuZGxvdywgZW5kaGlnaDsKLQkJdW5zaWduZWQgbG9uZyBjb3VudDsKLQotCQlyZHRzYyhzdGFydGxvdyxzdGFydGhpZ2gpOwotCQltYWNoX2NvdW50dXAoJmNvdW50KTsKLQkJcmR0c2MoZW5kbG93LGVuZGhpZ2gpOwotCi0KLQkJLyogRXJyb3I6IEVDVENORVZFUlNFVCAqLwotCQlpZiAoY291bnQgPD0gMSkKLQkJCWdvdG8gYmFkX2N0YzsKLQotCQkvKiA2NC1iaXQgc3VidHJhY3QgLSBnY2MganVzdCBtZXNzZXMgdXAgd2l0aCBsb25nIGxvbmdzICovCi0JCV9fYXNtX18oInN1YmwgJTIsJTBcblx0IgotCQkJInNiYmwgJTMsJTEiCi0JCQk6Ij1hIiAoZW5kbG93KSwgIj1kIiAoZW5kaGlnaCkKLQkJCToiZyIgKHN0YXJ0bG93KSwgImciIChzdGFydGhpZ2gpLAotCQkJICIwIiAoZW5kbG93KSwgIjEiIChlbmRoaWdoKSk7Ci0KLQkJLyogRXJyb3I6IEVDUFVUT09GQVNUICovCi0JCWlmIChlbmRoaWdoKQotCQkJZ290byBiYWRfY3RjOwotCi0JCS8qIEVycm9yOiBFQ1BVVE9PU0xPVyAqLwotCQlpZiAoZW5kbG93IDw9IENBTElCUkFURV9USU1FKQotCQkJZ290byBiYWRfY3RjOwotCi0JCV9fYXNtX18oImRpdmwgJTIiCi0JCQk6Ij1hIiAoZW5kbG93KSwgIj1kIiAoZW5kaGlnaCkKLQkJCToiciIgKGVuZGxvdyksICIwIiAoMCksICIxIiAoQ0FMSUJSQVRFX1RJTUUpKTsKLQotCQlyZXR1cm4gZW5kbG93OwotCX0KLQotCS8qCi0JICogVGhlIENUQyB3YXNuJ3QgcmVsaWFibGU6IHdlIGdvdCBhIGhpdCBvbiB0aGUgdmVyeSBmaXJzdCByZWFkLAotCSAqIG9yIHRoZSBDUFUgd2FzIHNvIGZhc3Qvc2xvdyB0aGF0IHRoZSBxdW90aWVudCB3b3VsZG4ndCBmaXQgaW4KLQkgKiAzMiBiaXRzLi4KLQkgKi8KLWJhZF9jdGM6Ci0JcmV0dXJuIDA7Ci19Ci0KLSNpZmRlZiBDT05GSUdfSFBFVF9USU1FUgotLyogLS0tLS0tIENhbGlicmF0ZSB0aGUgVFNDIHVzaW5nIEhQRVQgLS0tLS0tLQotICogUmV0dXJuIDJeMzIgKiAoMSAvIChUU0MgY2xvY2tzIHBlciB1c2VjKSkgZm9yIGdldHRpbmcgdGhlIENQVSBmcmVxLgotICogU2Vjb25kIG91dHB1dCBpcyBwYXJhbWV0ZXIgMSAod2hlbiBub24gTlVMTCkKLSAqIFNldCAyXjMyICogKDEgLyAodHNjIHBlciBIUEVUIGNsaykpIGZvciBkZWxheV9ocGV0KCkuCi0gKiBjYWxpYnJhdGVfdHNjKCkgY2FsaWJyYXRlcyB0aGUgcHJvY2Vzc29yIFRTQyBieSBjb21wYXJpbmcKLSAqIGl0IHRvIHRoZSBIUEVUIHRpbWVyIG9mIGtub3duIGZyZXF1ZW5jeS4KLSAqIFRvbyBtdWNoIDY0LWJpdCBhcml0aG1ldGljIGhlcmUgdG8gZG8gdGhpcyBjbGVhbmx5IGluIEMKLSAqLwotI2RlZmluZSBDQUxJQlJBVEVfQ05UX0hQRVQgCSg1ICogaHBldF90aWNrKQotI2RlZmluZSBDQUxJQlJBVEVfVElNRV9IUEVUIAkoNSAqIEtFUk5FTF9USUNLX1VTRUMpCi0KLXVuc2lnbmVkIGxvbmcgX19kZXZpbml0IGNhbGlicmF0ZV90c2NfaHBldCh1bnNpZ25lZCBsb25nICp0c2NfaHBldF9xdW90aWVudF9wdHIpCi17Ci0JdW5zaWduZWQgbG9uZyB0c2Nfc3RhcnRsb3csIHRzY19zdGFydGhpZ2g7Ci0JdW5zaWduZWQgbG9uZyB0c2NfZW5kbG93LCB0c2NfZW5kaGlnaDsKLQl1bnNpZ25lZCBsb25nIGhwZXRfc3RhcnQsIGhwZXRfZW5kOwotCXVuc2lnbmVkIGxvbmcgcmVzdWx0LCByZW1haW47Ci0KLQlocGV0X3N0YXJ0ID0gaHBldF9yZWFkbChIUEVUX0NPVU5URVIpOwotCXJkdHNjKHRzY19zdGFydGxvdywgdHNjX3N0YXJ0aGlnaCk7Ci0JZG8gewotCQlocGV0X2VuZCA9IGhwZXRfcmVhZGwoSFBFVF9DT1VOVEVSKTsKLQl9IHdoaWxlICgoaHBldF9lbmQgLSBocGV0X3N0YXJ0KSA8IENBTElCUkFURV9DTlRfSFBFVCk7Ci0JcmR0c2ModHNjX2VuZGxvdywgdHNjX2VuZGhpZ2gpOwotCi0JLyogNjQtYml0IHN1YnRyYWN0IC0gZ2NjIGp1c3QgbWVzc2VzIHVwIHdpdGggbG9uZyBsb25ncyAqLwotCV9fYXNtX18oInN1YmwgJTIsJTBcblx0IgotCQkic2JibCAlMywlMSIKLQkJOiI9YSIgKHRzY19lbmRsb3cpLCAiPWQiICh0c2NfZW5kaGlnaCkKLQkJOiJnIiAodHNjX3N0YXJ0bG93KSwgImciICh0c2Nfc3RhcnRoaWdoKSwKLQkJICIwIiAodHNjX2VuZGxvdyksICIxIiAodHNjX2VuZGhpZ2gpKTsKLQotCS8qIEVycm9yOiBFQ1BVVE9PRkFTVCAqLwotCWlmICh0c2NfZW5kaGlnaCkKLQkJZ290byBiYWRfY2FsaWJyYXRpb247Ci0KLQkvKiBFcnJvcjogRUNQVVRPT1NMT1cgKi8KLQlpZiAodHNjX2VuZGxvdyA8PSBDQUxJQlJBVEVfVElNRV9IUEVUKQotCQlnb3RvIGJhZF9jYWxpYnJhdGlvbjsKLQotCUFTTV9ESVY2NF9SRUcocmVzdWx0LCByZW1haW4sIHRzY19lbmRsb3csIDAsIENBTElCUkFURV9USU1FX0hQRVQpOwotCWlmIChyZW1haW4gPiAodHNjX2VuZGxvdyA+PiAxKSkKLQkJcmVzdWx0Kys7IC8qIHJvdW5kaW5nIHRoZSByZXN1bHQgKi8KLQotCWlmICh0c2NfaHBldF9xdW90aWVudF9wdHIpIHsKLQkJdW5zaWduZWQgbG9uZyB0c2NfaHBldF9xdW90aWVudDsKLQotCQlBU01fRElWNjRfUkVHKHRzY19ocGV0X3F1b3RpZW50LCByZW1haW4sIHRzY19lbmRsb3csIDAsCi0JCQlDQUxJQlJBVEVfQ05UX0hQRVQpOwotCQlpZiAocmVtYWluID4gKHRzY19lbmRsb3cgPj4gMSkpCi0JCQl0c2NfaHBldF9xdW90aWVudCsrOyAvKiByb3VuZGluZyB0aGUgcmVzdWx0ICovCi0JCSp0c2NfaHBldF9xdW90aWVudF9wdHIgPSB0c2NfaHBldF9xdW90aWVudDsKLQl9Ci0KLQlyZXR1cm4gcmVzdWx0OwotYmFkX2NhbGlicmF0aW9uOgotCS8qCi0JICogdGhlIENQVSB3YXMgc28gZmFzdC9zbG93IHRoYXQgdGhlIHF1b3RpZW50IHdvdWxkbid0IGZpdCBpbgotCSAqIDMyIGJpdHMuLgotCSAqLwotCXJldHVybiAwOwotfQotI2VuZGlmCi0KLQotdW5zaWduZWQgbG9uZyByZWFkX3RpbWVyX3RzYyh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgcmV0dmFsOwotCXJkdHNjbChyZXR2YWwpOwotCXJldHVybiByZXR2YWw7Ci19Ci0KLQotLyogY2FsY3VsYXRlIGNwdV9raHogKi8KLXZvaWQgaW5pdF9jcHVfa2h6KHZvaWQpCi17Ci0JaWYgKGNwdV9oYXNfdHNjKSB7Ci0JCXVuc2lnbmVkIGxvbmcgdHNjX3F1b3RpZW50ID0gY2FsaWJyYXRlX3RzYygpOwotCQlpZiAodHNjX3F1b3RpZW50KSB7Ci0JCQkvKiByZXBvcnQgQ1BVIGNsb2NrIHJhdGUgaW4gSHouCi0JCQkgKiBUaGUgZm9ybXVsYSBpcyAoMTBeNiAqIDJeMzIpIC8gKDJeMzIgKiAxIC8gKGNsb2Nrcy91cykpID0KLQkJCSAqIGNsb2NrL3NlY29uZC4gT3VyIHByZWNpc2lvbiBpcyBhYm91dCAxMDAgcHBtLgotCQkJICovCi0JCQl7CXVuc2lnbmVkIGxvbmcgZWF4PTAsIGVkeD0xMDAwOwotCQkJCV9fYXNtX18oImRpdmwgJTIiCi0JCSAgICAgICAJCToiPWEiIChjcHVfa2h6KSwgIj1kIiAoZWR4KQotICAgICAgICAJICAgICAgIAkJOiJyIiAodHNjX3F1b3RpZW50KSwKLQkgICAgICAgICAgICAgICAgCSIwIiAoZWF4KSwgIjEiIChlZHgpKTsKLQkJCQlwcmludGsoIkRldGVjdGVkICV1LiUwM3UgTUh6IHByb2Nlc3Nvci5cbiIsCi0JCQkJCWNwdV9raHogLyAxMDAwLCBjcHVfa2h6ICUgMTAwMCk7Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvdGltZXJzL3RpbWVyLmMgYi9hcmNoL2kzODYva2VybmVsL3RpbWVycy90aW1lci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTM5ZWQ4Li4wMDAwMDAwCi0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvdGltZXJzL3RpbWVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGFzbS90aW1lci5oPgotCi0jaWZkZWYgQ09ORklHX0hQRVRfVElNRVIKLS8qCi0gKiBIUEVUIG1lbW9yeSByZWFkIGlzIHNsb3dlciB0aGFuIHRzYyByZWFkcywgYnV0IGlzIG1vcmUgZGVwZW5kYWJsZSBhcyBpdAotICogYWx3YXlzIHJ1bnMgYXQgY29uc3RhbnQgZnJlcXVlbmN5IGFuZCByZWR1Y2VzIGNvbXBsZXhpdHkgZHVlIHRvCi0gKiBjcHVmcmVxLiBTbywgd2UgcHJlZmVyIEhQRVQgdGltZXIgdG8gdHNjIGJhc2VkIG9uZS4gQWxzbywgd2UgY2Fubm90IHVzZQotICogdGltZXJfcGl0IHdoZW4gSFBFVCBpcyBhY3RpdmUuIFNvLCB3ZSBkZWZhdWx0IHRvIHRpbWVyX3RzYy4KLSAqLwotI2VuZGlmCi0vKiBsaXN0IG9mIHRpbWVycywgb3JkZXJlZCBieSBwcmVmZXJlbmNlLCBOVUxMIHRlcm1pbmF0ZWQgKi8KLXN0YXRpYyBzdHJ1Y3QgaW5pdF90aW1lcl9vcHRzKiBfX2luaXRkYXRhIHRpbWVyc1tdID0gewotI2lmZGVmIENPTkZJR19YODZfQ1lDTE9ORV9USU1FUgotCSZ0aW1lcl9jeWNsb25lX2luaXQsCi0jZW5kaWYKLSNpZmRlZiBDT05GSUdfSFBFVF9USU1FUgotCSZ0aW1lcl9ocGV0X2luaXQsCi0jZW5kaWYKLSNpZmRlZiBDT05GSUdfWDg2X1BNX1RJTUVSCi0JJnRpbWVyX3BtdG1yX2luaXQsCi0jZW5kaWYKLQkmdGltZXJfdHNjX2luaXQsCi0JJnRpbWVyX3BpdF9pbml0LAotCU5VTEwsCi19OwotCi1zdGF0aWMgY2hhciBjbG9ja19vdmVycmlkZVsxMF0gX19pbml0ZGF0YTsKLQotc3RhdGljIGludCBfX2luaXQgY2xvY2tfc2V0dXAoY2hhciogc3RyKQotewotCWlmIChzdHIpCi0JCXN0cmxjcHkoY2xvY2tfb3ZlcnJpZGUsIHN0ciwgc2l6ZW9mKGNsb2NrX292ZXJyaWRlKSk7Ci0JcmV0dXJuIDE7Ci19Ci1fX3NldHVwKCJjbG9jaz0iLCBjbG9ja19zZXR1cCk7Ci0KLQotLyogVGhlIGNob3NlbiB0aW1lc291cmNlIGhhcyBiZWVuIGZvdW5kIHRvIGJlIGJhZC4KLSAqIEZhbGwgYmFjayB0byBhIGtub3duIGdvb2QgdGltZXNvdXJjZSAodGhlIFBJVCkKLSAqLwotdm9pZCBjbG9ja19mYWxsYmFjayh2b2lkKQotewotCWN1cl90aW1lciA9ICZ0aW1lcl9waXQ7Ci19Ci0KLS8qIGl0ZXJhdGVzIHRocm91Z2ggdGhlIGxpc3Qgb2YgdGltZXJzLCByZXR1cm5pbmcgdGhlIGZpcnN0IAotICogb25lIHRoYXQgaW5pdGlhbGl6ZXMgc3VjY2Vzc2Z1bGx5LgotICovCi1zdHJ1Y3QgdGltZXJfb3B0cyogX19pbml0IHNlbGVjdF90aW1lcih2b2lkKQotewotCWludCBpID0gMDsKLQkKLQkvKiBmaW5kIG1vc3QgcHJlZmVycmVkIHdvcmtpbmcgdGltZXIgKi8KLQl3aGlsZSAodGltZXJzW2ldKSB7Ci0JCWlmICh0aW1lcnNbaV0tPmluaXQpCi0JCQlpZiAodGltZXJzW2ldLT5pbml0KGNsb2NrX292ZXJyaWRlKSA9PSAwKQotCQkJCXJldHVybiB0aW1lcnNbaV0tPm9wdHM7Ci0JCSsraTsKLQl9Ci0JCQotCXBhbmljKCJzZWxlY3RfdGltZXI6IENhbm5vdCBmaW5kIGEgc3VpdGFibGUgdGltZXJcbiIpOwotCXJldHVybiBOVUxMOwotfQotCi1pbnQgcmVhZF9jdXJyZW50X3RpbWVyKHVuc2lnbmVkIGxvbmcgKnRpbWVyX3ZhbCkKLXsKLQlpZiAoY3VyX3RpbWVyLT5yZWFkX3RpbWVyKSB7Ci0JCSp0aW1lcl92YWwgPSBjdXJfdGltZXItPnJlYWRfdGltZXIoKTsKLQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAtMTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvdGltZXJzL3RpbWVyX2N5Y2xvbmUuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvdGltZXJzL3RpbWVyX2N5Y2xvbmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM4OTJhNi4uMDAwMDAwMAotLS0gYS9hcmNoL2kzODYva2VybmVsL3RpbWVycy90aW1lcl9jeWNsb25lLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTkgKzAsMCBAQAotLyoJQ3ljbG9uZS10aW1lcjogCi0gKgkJVGhpcyBjb2RlIGltcGxlbWVudHMgdGltZXJfb3BzIGZvciB0aGUgY3ljbG9uZSBjb3VudGVyIGZvdW5kCi0gKgkJb24gSUJNIHg0NDAsIHgzNjAsIGFuZCBvdGhlciBTdW1taXQgYmFzZWQgc3lzdGVtcy4KLSAqCi0gKglDb3B5cmlnaHQgKEMpIDIwMDIgSUJNLCBKb2huIFN0dWx0eiAoam9obnN0dWxAdXMuaWJtLmNvbSkKLSAqLwotCi0KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC90aW1leC5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgotCi0jaW5jbHVkZSA8YXNtL3RpbWVyLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KLSNpbmNsdWRlIDxhc20vZml4bWFwLmg+Ci0jaW5jbHVkZSA8YXNtL2k4MjUzLmg+Ci0KLSNpbmNsdWRlICJpb19wb3J0cy5oIgotCi0vKiBOdW1iZXIgb2YgdXNlY3MgdGhhdCB0aGUgbGFzdCBpbnRlcnJ1cHQgd2FzIGRlbGF5ZWQgKi8KLXN0YXRpYyBpbnQgZGVsYXlfYXRfbGFzdF9pbnRlcnJ1cHQ7Ci0KLSNkZWZpbmUgQ1lDTE9ORV9DQkFSX0FERFIgMHhGRUIwMENEMAotI2RlZmluZSBDWUNMT05FX1BNQ0NfT0ZGU0VUIDB4NTFBMAotI2RlZmluZSBDWUNMT05FX01QTUNfT0ZGU0VUIDB4NTFEMAotI2RlZmluZSBDWUNMT05FX01QQ1NfT0ZGU0VUIDB4NTFBOAotI2RlZmluZSBDWUNMT05FX1RJTUVSX0ZSRVEgMTAwMDAwMDAwCi0jZGVmaW5lIENZQ0xPTkVfVElNRVJfTUFTSyAoKCh1NjQpMTw8NDApLTEpIC8qIDQwIGJpdCBtYXNrICovCi1pbnQgdXNlX2N5Y2xvbmUgPSAwOwotCi1zdGF0aWMgdTMyKiB2b2xhdGlsZSBjeWNsb25lX3RpbWVyOwkvKiBDeWNsb25lIE1QTUMwIHJlZ2lzdGVyICovCi1zdGF0aWMgdTMyIGxhc3RfY3ljbG9uZV9sb3c7Ci1zdGF0aWMgdTMyIGxhc3RfY3ljbG9uZV9oaWdoOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyBtb25vdG9uaWNfYmFzZTsKLXN0YXRpYyBzZXFsb2NrX3QgbW9ub3RvbmljX2xvY2sgPSBTRVFMT0NLX1VOTE9DS0VEOwotCi0vKiBoZWxwZXIgbWFjcm8gdG8gYXRvbWljYWxseSByZWFkIGJvdGggY3ljbG9uZSBjb3VudGVyIHJlZ2lzdGVycyAqLwotI2RlZmluZSByZWFkX2N5Y2xvbmVfY291bnRlcihsb3csaGlnaCkgXAotCWRveyBcCi0JCWhpZ2ggPSBjeWNsb25lX3RpbWVyWzFdOyBsb3cgPSBjeWNsb25lX3RpbWVyWzBdOyBcCi0JfSB3aGlsZSAoaGlnaCAhPSBjeWNsb25lX3RpbWVyWzFdKTsKLQotCi1zdGF0aWMgdm9pZCBtYXJrX29mZnNldF9jeWNsb25lKHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyBsb3N0LCBkZWxheTsKLQl1bnNpZ25lZCBsb25nIGRlbHRhID0gbGFzdF9jeWNsb25lX2xvdzsKLQlpbnQgY291bnQ7Ci0JdW5zaWduZWQgbG9uZyBsb25nIHRoaXNfb2Zmc2V0LCBsYXN0X29mZnNldDsKLQotCXdyaXRlX3NlcWxvY2soJm1vbm90b25pY19sb2NrKTsKLQlsYXN0X29mZnNldCA9ICgodW5zaWduZWQgbG9uZyBsb25nKWxhc3RfY3ljbG9uZV9oaWdoPDwzMil8bGFzdF9jeWNsb25lX2xvdzsKLQkKLQlzcGluX2xvY2soJmk4MjUzX2xvY2spOwotCXJlYWRfY3ljbG9uZV9jb3VudGVyKGxhc3RfY3ljbG9uZV9sb3csbGFzdF9jeWNsb25lX2hpZ2gpOwotCi0JLyogcmVhZCB2YWx1ZXMgZm9yIGRlbGF5X2F0X2xhc3RfaW50ZXJydXB0ICovCi0Jb3V0Yl9wKDB4MDAsIDB4NDMpOyAgICAgLyogbGF0Y2ggdGhlIGNvdW50IEFTQVAgKi8KLQotCWNvdW50ID0gaW5iX3AoMHg0MCk7ICAgIC8qIHJlYWQgdGhlIGxhdGNoZWQgY291bnQgKi8KLQljb3VudCB8PSBpbmIoMHg0MCkgPDwgODsKLQotCS8qCi0JICogVklBNjg2YSB0ZXN0IGNvZGUuLi4gcmVzZXQgdGhlIGxhdGNoIGlmIGNvdW50ID4gbWF4ICsgMQotCSAqIGZyb20gdGltZXJfcGl0LmMgLSBjamIKLQkgKi8KLQlpZiAoY291bnQgPiBMQVRDSCkgewotCQlvdXRiX3AoMHgzNCwgUElUX01PREUpOwotCQlvdXRiX3AoTEFUQ0ggJiAweGZmLCBQSVRfQ0gwKTsKLQkJb3V0YihMQVRDSCA+PiA4LCBQSVRfQ0gwKTsKLQkJY291bnQgPSBMQVRDSCAtIDE7Ci0JfQotCXNwaW5fdW5sb2NrKCZpODI1M19sb2NrKTsKLQotCS8qIGxvc3QgdGljayBjb21wZW5zYXRpb24gKi8KLQlkZWx0YSA9IGxhc3RfY3ljbG9uZV9sb3cgLSBkZWx0YTsJCi0JZGVsdGEgLz0gKENZQ0xPTkVfVElNRVJfRlJFUS8xMDAwMDAwKTsKLQlkZWx0YSArPSBkZWxheV9hdF9sYXN0X2ludGVycnVwdDsKLQlsb3N0ID0gZGVsdGEvKDEwMDAwMDAvSFopOwotCWRlbGF5ID0gZGVsdGElKDEwMDAwMDAvSFopOwotCWlmIChsb3N0ID49IDIpCi0JCWppZmZpZXNfNjQgKz0gbG9zdC0xOwotCQotCS8qIHVwZGF0ZSB0aGUgbW9ub3RvbmljIGJhc2UgdmFsdWUgKi8KLQl0aGlzX29mZnNldCA9ICgodW5zaWduZWQgbG9uZyBsb25nKWxhc3RfY3ljbG9uZV9oaWdoPDwzMil8bGFzdF9jeWNsb25lX2xvdzsKLQltb25vdG9uaWNfYmFzZSArPSAodGhpc19vZmZzZXQgLSBsYXN0X29mZnNldCkgJiBDWUNMT05FX1RJTUVSX01BU0s7Ci0Jd3JpdGVfc2VxdW5sb2NrKCZtb25vdG9uaWNfbG9jayk7Ci0KLQkvKiBjYWxjdWxhdGUgZGVsYXlfYXRfbGFzdF9pbnRlcnJ1cHQgKi8KLQljb3VudCA9ICgoTEFUQ0gtMSkgLSBjb3VudCkgKiBUSUNLX1NJWkU7Ci0JZGVsYXlfYXRfbGFzdF9pbnRlcnJ1cHQgPSAoY291bnQgKyBMQVRDSC8yKSAvIExBVENIOwotCi0KLQkvKiBjYXRjaCBjb3JuZXIgY2FzZSB3aGVyZSB0aWNrIHJvbGxvdmVyIG9jY3VyZWQgCi0JICogYmV0d2VlbiBjeWNsb25lIGFuZCBwaXQgcmVhZHMgKGFzIG5vdGVkIHdoZW4gCi0JICogdXNlYyBkZWx0YSBpcyA+IDkwJSAjIG9mIHVzZWNzL3RpY2spCi0JICovCi0JaWYgKGxvc3QgJiYgYWJzKGRlbGF5IC0gZGVsYXlfYXRfbGFzdF9pbnRlcnJ1cHQpID4gKDkwMDAwMC9IWikpCi0JCWppZmZpZXNfNjQrKzsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2V0X29mZnNldF9jeWNsb25lKHZvaWQpCi17Ci0JdTMyIG9mZnNldDsKLQotCWlmKCFjeWNsb25lX3RpbWVyKQotCQlyZXR1cm4gZGVsYXlfYXRfbGFzdF9pbnRlcnJ1cHQ7Ci0KLQkvKiBSZWFkIHRoZSBjeWNsb25lIHRpbWVyICovCi0Jb2Zmc2V0ID0gY3ljbG9uZV90aW1lclswXTsKLQotCS8qIC4uIHJlbGF0aXZlIHRvIHByZXZpb3VzIGppZmZ5ICovCi0Jb2Zmc2V0ID0gb2Zmc2V0IC0gbGFzdF9jeWNsb25lX2xvdzsKLQotCS8qIGNvbnZlcnQgY3ljbG9uZSB0aWNrcyB0byBtaWNyb3NlY29uZHMgKi8JCi0JLyogWFhYIHNsb3csIGNhbiB3ZSBzcGVlZCB0aGlzIHVwPyAqLwotCW9mZnNldCA9IG9mZnNldC8oQ1lDTE9ORV9USU1FUl9GUkVRLzEwMDAwMDApOwotCi0JLyogb3VyIGFkanVzdGVkIHRpbWUgb2Zmc2V0IGluIG1pY3Jvc2Vjb25kcyAqLwotCXJldHVybiBkZWxheV9hdF9sYXN0X2ludGVycnVwdCArIG9mZnNldDsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyBtb25vdG9uaWNfY2xvY2tfY3ljbG9uZSh2b2lkKQotewotCXUzMiBub3dfbG93LCBub3dfaGlnaDsKLQl1bnNpZ25lZCBsb25nIGxvbmcgbGFzdF9vZmZzZXQsIHRoaXNfb2Zmc2V0LCBiYXNlOwotCXVuc2lnbmVkIGxvbmcgbG9uZyByZXQ7Ci0JdW5zaWduZWQgc2VxOwotCi0JLyogYXRvbWljYWxseSByZWFkIG1vbm90b25pYyBiYXNlICYgbGFzdF9vZmZzZXQgKi8KLQlkbyB7Ci0JCXNlcSA9IHJlYWRfc2VxYmVnaW4oJm1vbm90b25pY19sb2NrKTsKLQkJbGFzdF9vZmZzZXQgPSAoKHVuc2lnbmVkIGxvbmcgbG9uZylsYXN0X2N5Y2xvbmVfaGlnaDw8MzIpfGxhc3RfY3ljbG9uZV9sb3c7Ci0JCWJhc2UgPSBtb25vdG9uaWNfYmFzZTsKLQl9IHdoaWxlIChyZWFkX3NlcXJldHJ5KCZtb25vdG9uaWNfbG9jaywgc2VxKSk7Ci0KLQotCS8qIFJlYWQgdGhlIGN5Y2xvbmUgY291bnRlciAqLwotCXJlYWRfY3ljbG9uZV9jb3VudGVyKG5vd19sb3csbm93X2hpZ2gpOwotCXRoaXNfb2Zmc2V0ID0gKCh1bnNpZ25lZCBsb25nIGxvbmcpbm93X2hpZ2g8PDMyKXxub3dfbG93OwotCi0JLyogY29udmVydCB0byBuYW5vc2Vjb25kcyAqLwotCXJldCA9IGJhc2UgKyAoKHRoaXNfb2Zmc2V0IC0gbGFzdF9vZmZzZXQpJkNZQ0xPTkVfVElNRVJfTUFTSyk7Ci0JcmV0dXJuIHJldCAqICgxMDAwMDAwMDAwIC8gQ1lDTE9ORV9USU1FUl9GUkVRKTsKLX0KLQotc3RhdGljIGludCBfX2luaXQgaW5pdF9jeWNsb25lKGNoYXIqIG92ZXJyaWRlKQotewotCXUzMiogcmVnOwkKLQl1MzIgYmFzZTsJCS8qIHNhdmVkIGN5Y2xvbmUgYmFzZSBhZGRyZXNzICovCi0JdTMyIHBhZ2VhZGRyOwkvKiBwYWdlIHRoYXQgY29udGFpbnMgY3ljbG9uZV90aW1lciByZWdpc3RlciAqLwotCXUzMiBvZmZzZXQ7CQkvKiBvZmZzZXQgZnJvbSBwYWdlYWRkciB0byBjeWNsb25lX3RpbWVyIHJlZ2lzdGVyICovCi0JaW50IGk7Ci0JCi0JLyogY2hlY2sgY2xvY2sgb3ZlcnJpZGUgKi8KLQlpZiAob3ZlcnJpZGVbMF0gJiYgc3RybmNtcChvdmVycmlkZSwiY3ljbG9uZSIsNykpCi0JCQlyZXR1cm4gLUVOT0RFVjsKLQotCS8qbWFrZSBzdXJlIHdlJ3JlIG9uIGEgc3VtbWl0IGJveCovCi0JaWYoIXVzZV9jeWNsb25lKSByZXR1cm4gLUVOT0RFVjsgCi0JCi0JcHJpbnRrKEtFUk5fSU5GTyAiU3VtbWl0IGNoaXBzZXQ6IFN0YXJ0aW5nIEN5Y2xvbmUgQ291bnRlci5cbiIpOwotCi0JLyogZmluZCBiYXNlIGFkZHJlc3MgKi8KLQlwYWdlYWRkciA9IChDWUNMT05FX0NCQVJfQUREUikmUEFHRV9NQVNLOwotCW9mZnNldCA9IChDWUNMT05FX0NCQVJfQUREUikmKH5QQUdFX01BU0spOwotCXNldF9maXhtYXBfbm9jYWNoZShGSVhfQ1lDTE9ORV9USU1FUiwgcGFnZWFkZHIpOwotCXJlZyA9ICh1MzIqKShmaXhfdG9fdmlydChGSVhfQ1lDTE9ORV9USU1FUikgKyBvZmZzZXQpOwotCWlmKCFyZWcpewotCQlwcmludGsoS0VSTl9FUlIgIlN1bW1pdCBjaGlwc2V0OiBDb3VsZCBub3QgZmluZCB2YWxpZCBDQkFSIHJlZ2lzdGVyLlxuIik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQliYXNlID0gKnJlZzsJCi0JaWYoIWJhc2UpewotCQlwcmludGsoS0VSTl9FUlIgIlN1bW1pdCBjaGlwc2V0OiBDb3VsZCBub3QgZmluZCB2YWxpZCBDQkFSIHZhbHVlLlxuIik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQkKLQkvKiBzZXR1cCBQTUNDICovCi0JcGFnZWFkZHIgPSAoYmFzZSArIENZQ0xPTkVfUE1DQ19PRkZTRVQpJlBBR0VfTUFTSzsKLQlvZmZzZXQgPSAoYmFzZSArIENZQ0xPTkVfUE1DQ19PRkZTRVQpJih+UEFHRV9NQVNLKTsKLQlzZXRfZml4bWFwX25vY2FjaGUoRklYX0NZQ0xPTkVfVElNRVIsIHBhZ2VhZGRyKTsKLQlyZWcgPSAodTMyKikoZml4X3RvX3ZpcnQoRklYX0NZQ0xPTkVfVElNRVIpICsgb2Zmc2V0KTsKLQlpZighcmVnKXsKLQkJcHJpbnRrKEtFUk5fRVJSICJTdW1taXQgY2hpcHNldDogQ291bGQgbm90IGZpbmQgdmFsaWQgUE1DQyByZWdpc3Rlci5cbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0JcmVnWzBdID0gMHgwMDAwMDAwMTsKLQotCS8qIHNldHVwIE1QQ1MgKi8KLQlwYWdlYWRkciA9IChiYXNlICsgQ1lDTE9ORV9NUENTX09GRlNFVCkmUEFHRV9NQVNLOwotCW9mZnNldCA9IChiYXNlICsgQ1lDTE9ORV9NUENTX09GRlNFVCkmKH5QQUdFX01BU0spOwotCXNldF9maXhtYXBfbm9jYWNoZShGSVhfQ1lDTE9ORV9USU1FUiwgcGFnZWFkZHIpOwotCXJlZyA9ICh1MzIqKShmaXhfdG9fdmlydChGSVhfQ1lDTE9ORV9USU1FUikgKyBvZmZzZXQpOwotCWlmKCFyZWcpewotCQlwcmludGsoS0VSTl9FUlIgIlN1bW1pdCBjaGlwc2V0OiBDb3VsZCBub3QgZmluZCB2YWxpZCBNUENTIHJlZ2lzdGVyLlxuIik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQlyZWdbMF0gPSAweDAwMDAwMDAxOwotCi0JLyogbWFwIGluIGN5Y2xvbmVfdGltZXIgKi8KLQlwYWdlYWRkciA9IChiYXNlICsgQ1lDTE9ORV9NUE1DX09GRlNFVCkmUEFHRV9NQVNLOwotCW9mZnNldCA9IChiYXNlICsgQ1lDTE9ORV9NUE1DX09GRlNFVCkmKH5QQUdFX01BU0spOwotCXNldF9maXhtYXBfbm9jYWNoZShGSVhfQ1lDTE9ORV9USU1FUiwgcGFnZWFkZHIpOwotCWN5Y2xvbmVfdGltZXIgPSAodTMyKikoZml4X3RvX3ZpcnQoRklYX0NZQ0xPTkVfVElNRVIpICsgb2Zmc2V0KTsKLQlpZighY3ljbG9uZV90aW1lcil7Ci0JCXByaW50ayhLRVJOX0VSUiAiU3VtbWl0IGNoaXBzZXQ6IENvdWxkIG5vdCBmaW5kIHZhbGlkIE1QTUMgcmVnaXN0ZXIuXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JLypxdWljayB0ZXN0IHRvIG1ha2Ugc3VyZSBpdHMgdGlja2luZyovCi0JZm9yKGk9MDsgaTwzOyBpKyspewotCQl1MzIgb2xkID0gY3ljbG9uZV90aW1lclswXTsKLQkJaW50IHN0YWxsID0gMTAwOwotCQl3aGlsZShzdGFsbC0tKSBiYXJyaWVyKCk7Ci0JCWlmKGN5Y2xvbmVfdGltZXJbMF0gPT0gb2xkKXsKLQkJCXByaW50ayhLRVJOX0VSUiAiU3VtbWl0IGNoaXBzZXQ6IENvdW50ZXIgbm90IGNvdW50aW5nISBESVNBQkxFRFxuIik7Ci0JCQljeWNsb25lX3RpbWVyID0gMDsKLQkJCXJldHVybiAtRU5PREVWOwotCQl9Ci0JfQotCi0JaW5pdF9jcHVfa2h6KCk7Ci0KLQkvKiBFdmVyeXRoaW5nIGxvb2tzIGdvb2QhICovCi0JcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIHZvaWQgZGVsYXlfY3ljbG9uZSh1bnNpZ25lZCBsb25nIGxvb3BzKQotewotCXVuc2lnbmVkIGxvbmcgYmNsb2NrLCBub3c7Ci0JaWYoIWN5Y2xvbmVfdGltZXIpCi0JCXJldHVybjsKLQliY2xvY2sgPSBjeWNsb25lX3RpbWVyWzBdOwotCWRvIHsKLQkJcmVwX25vcCgpOwotCQlub3cgPSBjeWNsb25lX3RpbWVyWzBdOwotCX0gd2hpbGUgKChub3ctYmNsb2NrKSA8IGxvb3BzKTsKLX0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIGN5Y2xvbmUgdGltZXJfb3B0cyBzdHJ1Y3QgKi8KLXN0YXRpYyBzdHJ1Y3QgdGltZXJfb3B0cyB0aW1lcl9jeWNsb25lID0gewotCS5uYW1lID0gImN5Y2xvbmUiLAotCS5tYXJrX29mZnNldCA9IG1hcmtfb2Zmc2V0X2N5Y2xvbmUsIAotCS5nZXRfb2Zmc2V0ID0gZ2V0X29mZnNldF9jeWNsb25lLAotCS5tb25vdG9uaWNfY2xvY2sgPQltb25vdG9uaWNfY2xvY2tfY3ljbG9uZSwKLQkuZGVsYXkgPSBkZWxheV9jeWNsb25lLAotfTsKLQotc3RydWN0IGluaXRfdGltZXJfb3B0cyBfX2luaXRkYXRhIHRpbWVyX2N5Y2xvbmVfaW5pdCA9IHsKLQkuaW5pdCA9IGluaXRfY3ljbG9uZSwKLQkub3B0cyA9ICZ0aW1lcl9jeWNsb25lLAotfTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvdGltZXJzL3RpbWVyX2hwZXQuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvdGltZXJzL3RpbWVyX2hwZXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdhNmZlNy4uMDAwMDAwMAotLS0gYS9hcmNoL2kzODYva2VybmVsL3RpbWVycy90aW1lcl9ocGV0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotLyoKLSAqIFRoaXMgY29kZSBsYXJnZWx5IG1vdmVkIGZyb20gYXJjaC9pMzg2L2tlcm5lbC90aW1lLmMuCi0gKiBTZWUgY29tbWVudHMgdGhlcmUgZm9yIHByb3BlciBjcmVkaXRzLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC90aW1leC5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgotCi0jaW5jbHVkZSA8YXNtL3RpbWVyLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgotCi0jaW5jbHVkZSAiaW9fcG9ydHMuaCIKLSNpbmNsdWRlICJtYWNoX3RpbWVyLmgiCi0jaW5jbHVkZSA8YXNtL2hwZXQuaD4KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgaHBldF91c2VjX3F1b3RpZW50IF9fcmVhZF9tb3N0bHk7CS8qIGNvbnZlcnQgaHBldCBjbGtzIHRvIHVzZWMgKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHRzY19ocGV0X3F1b3RpZW50IF9fcmVhZF9tb3N0bHk7CS8qIGNvbnZlcnQgdHNjIHRvIGhwZXQgY2xrcyAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgaHBldF9sYXN0OyAJLyogaHBldCBjb3VudGVyIHZhbHVlIGF0IGxhc3QgdGljayovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBsYXN0X3RzY19sb3c7CS8qIGxzYiAzMiBiaXRzIG9mIFRpbWUgU3RhbXAgQ291bnRlciAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgbGFzdF90c2NfaGlnaDsgCS8qIG1zYiAzMiBiaXRzIG9mIFRpbWUgU3RhbXAgQ291bnRlciAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyBtb25vdG9uaWNfYmFzZTsKLXN0YXRpYyBzZXFsb2NrX3QgbW9ub3RvbmljX2xvY2sgPSBTRVFMT0NLX1VOTE9DS0VEOwotCi0vKiBjb252ZXJ0IGZyb20gY3ljbGVzKDY0Yml0cykgPT4gbmFub3NlY29uZHMgKDY0Yml0cykKLSAqICBiYXNpYyBlcXVhdGlvbjoKLSAqCQlucyA9IGN5Y2xlcyAvIChmcmVxIC8gbnNfcGVyX3NlYykKLSAqCQlucyA9IGN5Y2xlcyAqIChuc19wZXJfc2VjIC8gZnJlcSkKLSAqCQlucyA9IGN5Y2xlcyAqICgxMF45IC8gKGNwdV9raHogKiAxMF4zKSkKLSAqCQlucyA9IGN5Y2xlcyAqICgxMF42IC8gY3B1X2toeikKLSAqCi0gKglUaGVuIHdlIHVzZSBzY2FsaW5nIG1hdGggKHN1Z2dlc3RlZCBieSBnZW9yZ2VAbXZpc3RhLmNvbSkgdG8gZ2V0OgotICoJCW5zID0gY3ljbGVzICogKDEwXjYgKiBTQyAvIGNwdV9raHopIC8gU0MKLSAqCQlucyA9IGN5Y2xlcyAqIGN5YzJuc19zY2FsZSAvIFNDCi0gKgotICoJQW5kIHNpbmNlIFNDIGlzIGEgY29uc3RhbnQgcG93ZXIgb2YgdHdvLCB3ZSBjYW4gY29udmVydCB0aGUgZGl2Ci0gKiAgaW50byBhIHNoaWZ0LgotICoKLSAqICBXZSBjYW4gdXNlIGtoeiBkaXZpc29yIGluc3RlYWQgb2YgbWh6IHRvIGtlZXAgYSBiZXR0ZXIgcGVyY2lzaW9uLCBzaW5jZQotICogIGN5YzJuc19zY2FsZSBpcyBsaW1pdGVkIHRvIDEwXjYgKiAyXjEwLCB3aGljaCBmaXRzIGluIDMyIGJpdHMuCi0gKiAgKG1hdGhpZXUuZGVzbm95ZXJzQHBvbHltdGwuY2EpCi0gKgotICoJCQktam9obnN0dWxAdXMuaWJtLmNvbSAibWF0aCBpcyBoYXJkLCBsZXRzIGdvIHNob3BwaW5nISIKLSAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgY3ljMm5zX3NjYWxlIF9fcmVhZF9tb3N0bHk7Ci0jZGVmaW5lIENZQzJOU19TQ0FMRV9GQUNUT1IgMTAgLyogMl4xMCwgY2FyZWZ1bGx5IGNob3NlbiAqLwotCi1zdGF0aWMgaW5saW5lIHZvaWQgc2V0X2N5YzJuc19zY2FsZSh1bnNpZ25lZCBsb25nIGNwdV9raHopCi17Ci0JY3ljMm5zX3NjYWxlID0gKDEwMDAwMDAgPDwgQ1lDMk5TX1NDQUxFX0ZBQ1RPUikvY3B1X2toejsKLX0KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGxvbmcgY3ljbGVzXzJfbnModW5zaWduZWQgbG9uZyBsb25nIGN5YykKLXsKLQlyZXR1cm4gKGN5YyAqIGN5YzJuc19zY2FsZSkgPj4gQ1lDMk5TX1NDQUxFX0ZBQ1RPUjsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyBtb25vdG9uaWNfY2xvY2tfaHBldCh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgbG9uZyBsYXN0X29mZnNldCwgdGhpc19vZmZzZXQsIGJhc2U7Ci0JdW5zaWduZWQgc2VxOwotCi0JLyogYXRvbWljYWxseSByZWFkIG1vbm90b25pYyBiYXNlICYgbGFzdF9vZmZzZXQgKi8KLQlkbyB7Ci0JCXNlcSA9IHJlYWRfc2VxYmVnaW4oJm1vbm90b25pY19sb2NrKTsKLQkJbGFzdF9vZmZzZXQgPSAoKHVuc2lnbmVkIGxvbmcgbG9uZylsYXN0X3RzY19oaWdoPDwzMil8bGFzdF90c2NfbG93OwotCQliYXNlID0gbW9ub3RvbmljX2Jhc2U7Ci0JfSB3aGlsZSAocmVhZF9zZXFyZXRyeSgmbW9ub3RvbmljX2xvY2ssIHNlcSkpOwotCi0JLyogUmVhZCB0aGUgVGltZSBTdGFtcCBDb3VudGVyICovCi0JcmR0c2NsbCh0aGlzX29mZnNldCk7Ci0KLQkvKiByZXR1cm4gdGhlIHZhbHVlIGluIG5zICovCi0JcmV0dXJuIGJhc2UgKyBjeWNsZXNfMl9ucyh0aGlzX29mZnNldCAtIGxhc3Rfb2Zmc2V0KTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2V0X29mZnNldF9ocGV0KHZvaWQpCi17Ci0JcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBlYXgsIGVkeDsKLQotCWVheCA9IGhwZXRfcmVhZGwoSFBFVF9DT1VOVEVSKTsKLQllYXggLT0gaHBldF9sYXN0OwkvKiBocGV0IGRlbHRhICovCi0JZWF4ID0gbWluKGhwZXRfdGljaywgZWF4KTsKLQkvKgotICAgICAgICAgKiBUaW1lIG9mZnNldCA9IChocGV0IGRlbHRhKSAqICggdXNlY3MgcGVyIEhQRVQgY2xvY2sgKQotCSAqICAgICAgICAgICAgID0gKGhwZXQgZGVsdGEpICogKCB1c2VjcyBwZXIgdGljayAvIEhQRVQgY2xvY2tzIHBlciB0aWNrKQotCSAqICAgICAgICAgICAgID0gKGhwZXQgZGVsdGEpICogKCBocGV0X3VzZWNfcXVvdGllbnQgKSAvICgyXjMyKQotCSAqCi0JICogV2hlcmUsCi0JICogaHBldF91c2VjX3F1b3RpZW50ID0gKDJeMzIgKiB1c2VjcyBwZXIgdGljaykvSFBFVCBjbG9ja3MgcGVyIHRpY2sKLQkgKgotCSAqIFVzaW5nIGEgbXVsbCBpbnN0ZWFkIG9mIGEgZGl2bCBzYXZlcyBzb21lIGN5Y2xlcyBpbiBjcml0aWNhbCBwYXRoLgotICAgICAgICAgKi8KLQlBU01fTVVMNjRfUkVHKGVheCwgZWR4LCBocGV0X3VzZWNfcXVvdGllbnQsIGVheCk7Ci0KLQkvKiBvdXIgYWRqdXN0ZWQgdGltZSBvZmZzZXQgaW4gbWljcm9zZWNvbmRzICovCi0JcmV0dXJuIGVkeDsKLX0KLQotc3RhdGljIHZvaWQgbWFya19vZmZzZXRfaHBldCh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgbG9uZyB0aGlzX29mZnNldCwgbGFzdF9vZmZzZXQ7Ci0JdW5zaWduZWQgbG9uZyBvZmZzZXQ7Ci0KLQl3cml0ZV9zZXFsb2NrKCZtb25vdG9uaWNfbG9jayk7Ci0JbGFzdF9vZmZzZXQgPSAoKHVuc2lnbmVkIGxvbmcgbG9uZylsYXN0X3RzY19oaWdoPDwzMil8bGFzdF90c2NfbG93OwotCXJkdHNjKGxhc3RfdHNjX2xvdywgbGFzdF90c2NfaGlnaCk7Ci0KLQlpZiAoaHBldF91c2VfdGltZXIpCi0JCW9mZnNldCA9IGhwZXRfcmVhZGwoSFBFVF9UMF9DTVApIC0gaHBldF90aWNrOwotCWVsc2UKLQkJb2Zmc2V0ID0gaHBldF9yZWFkbChIUEVUX0NPVU5URVIpOwotCWlmICh1bmxpa2VseSgoKG9mZnNldCAtIGhwZXRfbGFzdCkgPj0gKDIqaHBldF90aWNrKSkgJiYgKGhwZXRfbGFzdCAhPSAwKSkpIHsKLQkJaW50IGxvc3RfdGlja3MgPSAoKG9mZnNldCAtIGhwZXRfbGFzdCkgLyBocGV0X3RpY2spIC0gMTsKLQkJamlmZmllc182NCArPSBsb3N0X3RpY2tzOwotCX0KLQlocGV0X2xhc3QgPSBvZmZzZXQ7Ci0KLQkvKiB1cGRhdGUgdGhlIG1vbm90b25pYyBiYXNlIHZhbHVlICovCi0JdGhpc19vZmZzZXQgPSAoKHVuc2lnbmVkIGxvbmcgbG9uZylsYXN0X3RzY19oaWdoPDwzMil8bGFzdF90c2NfbG93OwotCW1vbm90b25pY19iYXNlICs9IGN5Y2xlc18yX25zKHRoaXNfb2Zmc2V0IC0gbGFzdF9vZmZzZXQpOwotCXdyaXRlX3NlcXVubG9jaygmbW9ub3RvbmljX2xvY2spOwotfQotCi1zdGF0aWMgdm9pZCBkZWxheV9ocGV0KHVuc2lnbmVkIGxvbmcgbG9vcHMpCi17Ci0JdW5zaWduZWQgbG9uZyBocGV0X3N0YXJ0LCBocGV0X2VuZDsKLQl1bnNpZ25lZCBsb25nIGVheDsKLQotCS8qIGxvb3BzIGlzIHRoZSBudW1iZXIgb2YgY3B1IGN5Y2xlcy4gQ29udmVydCBpdCB0byBocGV0IGNsb2NrcyAqLwotCUFTTV9NVUw2NF9SRUcoZWF4LCBsb29wcywgdHNjX2hwZXRfcXVvdGllbnQsIGxvb3BzKTsKLQotCWhwZXRfc3RhcnQgPSBocGV0X3JlYWRsKEhQRVRfQ09VTlRFUik7Ci0JZG8gewotCQlyZXBfbm9wKCk7Ci0JCWhwZXRfZW5kID0gaHBldF9yZWFkbChIUEVUX0NPVU5URVIpOwotCX0gd2hpbGUgKChocGV0X2VuZCAtIGhwZXRfc3RhcnQpIDwgKGxvb3BzKSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgdGltZXJfb3B0cyB0aW1lcl9ocGV0OwotCi1zdGF0aWMgaW50IF9faW5pdCBpbml0X2hwZXQoY2hhciogb3ZlcnJpZGUpCi17Ci0JdW5zaWduZWQgbG9uZyByZXN1bHQsIHJlbWFpbjsKLQotCS8qIGNoZWNrIGNsb2NrIG92ZXJyaWRlICovCi0JaWYgKG92ZXJyaWRlWzBdICYmIHN0cm5jbXAob3ZlcnJpZGUsImhwZXQiLDQpKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWlmICghaXNfaHBldF9lbmFibGVkKCkpCi0JCXJldHVybiAtRU5PREVWOwotCi0JcHJpbnRrKCJVc2luZyBIUEVUIGZvciBnZXR0aW1lb2ZkYXlcbiIpOwotCWlmIChjcHVfaGFzX3RzYykgewotCQl1bnNpZ25lZCBsb25nIHRzY19xdW90aWVudCA9IGNhbGlicmF0ZV90c2NfaHBldCgmdHNjX2hwZXRfcXVvdGllbnQpOwotCQlpZiAodHNjX3F1b3RpZW50KSB7Ci0JCQkvKiByZXBvcnQgQ1BVIGNsb2NrIHJhdGUgaW4gSHouCi0JCQkgKiBUaGUgZm9ybXVsYSBpcyAoMTBeNiAqIDJeMzIpIC8gKDJeMzIgKiAxIC8gKGNsb2Nrcy91cykpID0KLQkJCSAqIGNsb2NrL3NlY29uZC4gT3VyIHByZWNpc2lvbiBpcyBhYm91dCAxMDAgcHBtLgotCQkJICovCi0JCQl7CXVuc2lnbmVkIGxvbmcgZWF4PTAsIGVkeD0xMDAwOwotCQkJCUFTTV9ESVY2NF9SRUcoY3B1X2toeiwgZWR4LCB0c2NfcXVvdGllbnQsCi0JCQkJCQllYXgsIGVkeCk7Ci0JCQkJcHJpbnRrKCJEZXRlY3RlZCAldS4lMDN1IE1IeiBwcm9jZXNzb3IuXG4iLAotCQkJCQljcHVfa2h6IC8gMTAwMCwgY3B1X2toeiAlIDEwMDApOwotCQkJfQotCQkJc2V0X2N5YzJuc19zY2FsZShjcHVfa2h6KTsKLQkJfQotCQkvKiBzZXQgdGhpcyBvbmx5IHdoZW4gY3B1X2hhc190c2MgKi8KLQkJdGltZXJfaHBldC5yZWFkX3RpbWVyID0gcmVhZF90aW1lcl90c2M7Ci0JfQotCi0JLyoKLQkgKiBNYXRoIHRvIGNhbGN1bGF0ZSBocGV0IHRvIHVzZWMgbXVsdGlwbGllcgotCSAqIExvb2sgZm9yIHRoZSBjb21tZW50cyBhdCBnZXRfb2Zmc2V0X2hwZXQoKQotCSAqLwotCUFTTV9ESVY2NF9SRUcocmVzdWx0LCByZW1haW4sIGhwZXRfdGljaywgMCwgS0VSTkVMX1RJQ0tfVVNFQyk7Ci0JaWYgKHJlbWFpbiA+IChocGV0X3RpY2sgPj4gMSkpCi0JCXJlc3VsdCsrOyAvKiByb3VuZGluZyB0aGUgcmVzdWx0ICovCi0JaHBldF91c2VjX3F1b3RpZW50ID0gcmVzdWx0OwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgaHBldF9yZXN1bWUodm9pZCkKLXsKLQl3cml0ZV9zZXFsb2NrKCZtb25vdG9uaWNfbG9jayk7Ci0JLyogQXNzdW1lIHRoaXMgaXMgdGhlIGxhc3QgbWFyayBvZmZzZXQgdGltZSAqLwotCXJkdHNjKGxhc3RfdHNjX2xvdywgbGFzdF90c2NfaGlnaCk7Ci0KLQlpZiAoaHBldF91c2VfdGltZXIpCi0JCWhwZXRfbGFzdCA9IGhwZXRfcmVhZGwoSFBFVF9UMF9DTVApIC0gaHBldF90aWNrOwotCWVsc2UKLQkJaHBldF9sYXN0ID0gaHBldF9yZWFkbChIUEVUX0NPVU5URVIpOwotCXdyaXRlX3NlcXVubG9jaygmbW9ub3RvbmljX2xvY2spOwotCXJldHVybiAwOwotfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogdHNjIHRpbWVyX29wdHMgc3RydWN0ICovCi1zdGF0aWMgc3RydWN0IHRpbWVyX29wdHMgdGltZXJfaHBldCBfX3JlYWRfbW9zdGx5ID0gewotCS5uYW1lID0gCQkiaHBldCIsCi0JLm1hcmtfb2Zmc2V0ID0JCW1hcmtfb2Zmc2V0X2hwZXQsCi0JLmdldF9vZmZzZXQgPQkJZ2V0X29mZnNldF9ocGV0LAotCS5tb25vdG9uaWNfY2xvY2sgPQltb25vdG9uaWNfY2xvY2tfaHBldCwKLQkuZGVsYXkgPSAJCWRlbGF5X2hwZXQsCi0JLnJlc3VtZQk9CQlocGV0X3Jlc3VtZSwKLX07Ci0KLXN0cnVjdCBpbml0X3RpbWVyX29wdHMgX19pbml0ZGF0YSB0aW1lcl9ocGV0X2luaXQgPSB7Ci0JLmluaXQgPQlpbml0X2hwZXQsCi0JLm9wdHMgPSAmdGltZXJfaHBldCwKLX07CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3RpbWVycy90aW1lcl9ub25lLmMgYi9hcmNoL2kzODYva2VybmVsL3RpbWVycy90aW1lcl9ub25lLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlYTJmNDEuLjAwMDAwMDAKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC90aW1lcnMvdGltZXJfbm9uZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxhc20vdGltZXIuaD4KLQotc3RhdGljIHZvaWQgbWFya19vZmZzZXRfbm9uZSh2b2lkKQotewotCS8qIG5vdGhpbmcgbmVlZGVkICovCi19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGdldF9vZmZzZXRfbm9uZSh2b2lkKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIG1vbm90b25pY19jbG9ja19ub25lKHZvaWQpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGRlbGF5X25vbmUodW5zaWduZWQgbG9uZyBsb29wcykKLXsKLQlpbnQgZDA7Ci0JX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCSJcdGptcCAxZlxuIgotCQkiLmFsaWduIDE2XG4iCi0JCSIxOlx0am1wIDJmXG4iCi0JCSIuYWxpZ24gMTZcbiIKLQkJIjI6XHRkZWNsICUwXG5cdGpucyAyYiIKLQkJOiI9JmEiIChkMCkKLQkJOiIwIiAobG9vcHMpKTsKLX0KLQotLyogbm9uZSB0aW1lcl9vcHRzIHN0cnVjdCAqLwotc3RydWN0IHRpbWVyX29wdHMgdGltZXJfbm9uZSA9IHsKLQkubmFtZSA9IAkibm9uZSIsCi0JLm1hcmtfb2Zmc2V0ID0JbWFya19vZmZzZXRfbm9uZSwgCi0JLmdldF9vZmZzZXQgPQlnZXRfb2Zmc2V0X25vbmUsCi0JLm1vbm90b25pY19jbG9jayA9CW1vbm90b25pY19jbG9ja19ub25lLAotCS5kZWxheSA9IGRlbGF5X25vbmUsCi19OwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC90aW1lcnMvdGltZXJfcGl0LmMgYi9hcmNoL2kzODYva2VybmVsL3RpbWVycy90aW1lcl9waXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjliNmJkNS4uMDAwMDAwMAotLS0gYS9hcmNoL2kzODYva2VybmVsL3RpbWVycy90aW1lcl9waXQuYworKysgL2Rldi9udWxsCkBAIC0xLDE3NyArMCwwIEBACi0vKgotICogVGhpcyBjb2RlIGxhcmdlbHkgbW92ZWQgZnJvbSBhcmNoL2kzODYva2VybmVsL3RpbWUuYy4KLSAqIFNlZSBjb21tZW50cyB0aGVyZSBmb3IgcHJvcGVyIGNyZWRpdHMuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+Ci0jaW5jbHVkZSA8bGludXgvdGltZXguaD4KLSNpbmNsdWRlIDxhc20vZGVsYXkuaD4KLSNpbmNsdWRlIDxhc20vbXBzcGVjLmg+Ci0jaW5jbHVkZSA8YXNtL3RpbWVyLmg+Ci0jaW5jbHVkZSA8YXNtL3NtcC5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9hcmNoX2hvb2tzLmg+Ci0jaW5jbHVkZSA8YXNtL2k4MjUzLmg+Ci0KLSNpbmNsdWRlICJkb190aW1lci5oIgotI2luY2x1ZGUgImlvX3BvcnRzLmgiCi0KLXN0YXRpYyBpbnQgY291bnRfcDsgLyogY291bnRlciBpbiBnZXRfb2Zmc2V0X3BpdCgpICovCi0KLXN0YXRpYyBpbnQgX19pbml0IGluaXRfcGl0KGNoYXIqIG92ZXJyaWRlKQotewotIAkvKiBjaGVjayBjbG9jayBvdmVycmlkZSAqLwotIAlpZiAob3ZlcnJpZGVbMF0gJiYgc3RybmNtcChvdmVycmlkZSwicGl0IiwzKSkKLSAJCXByaW50ayhLRVJOX0VSUiAiV2FybmluZzogY2xvY2s9IG92ZXJyaWRlIGZhaWxlZC4gRGVmYXVsdGluZyAiCi0JCQkJInRvIFBJVFxuIik7Ci0gCWluaXRfY3B1X2toeigpOwotCWNvdW50X3AgPSBMQVRDSDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgbWFya19vZmZzZXRfcGl0KHZvaWQpCi17Ci0JLyogbm90aGluZyBuZWVkZWQgKi8KLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyBtb25vdG9uaWNfY2xvY2tfcGl0KHZvaWQpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGRlbGF5X3BpdCh1bnNpZ25lZCBsb25nIGxvb3BzKQotewotCWludCBkMDsKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkJIlx0am1wIDFmXG4iCi0JCSIuYWxpZ24gMTZcbiIKLQkJIjE6XHRqbXAgMmZcbiIKLQkJIi5hbGlnbiAxNlxuIgotCQkiMjpcdGRlY2wgJTBcblx0am5zIDJiIgotCQk6Ij0mYSIgKGQwKQotCQk6IjAiIChsb29wcykpOwotfQotCi0KLS8qIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgd2l0aCB4dGltZV9sb2NrIGhlbGQuCi0gKiBJdCB3YXMgaW5zcGlyZWQgYnkgU3RldmUgTWNDYW5uZSdzIG1pY3JvdGltZS1pMzg2IGZvciBCU0QuICAtLSBqcnMKLSAqIAotICogSG93ZXZlciwgdGhlIHBjLWF1ZGlvIHNwZWFrZXIgZHJpdmVyIGNoYW5nZXMgdGhlIGRpdmlzb3Igc28gdGhhdAotICogaXQgZ2V0cyBpbnRlcnJ1cHRlZCByYXRoZXIgbW9yZSBvZnRlbiAtIGl0IGxvYWRzIDY0IGludG8gdGhlCi0gKiBjb3VudGVyIHJhdGhlciB0aGFuIDExOTMyISBUaGlzIGhhcyBhbiBhZHZlcnNlIGltcGFjdCBvbgotICogZG9fZ2V0dGltZW9mZnNldCgpIC0tIGl0IHN0b3BzIHdvcmtpbmchIFdoYXQgaXMgYWxzbyBub3QKLSAqIGdvb2QgaXMgdGhhdCB0aGUgaW50ZXJ2YWwgdGhhdCBvdXIgdGltZXIgZnVuY3Rpb24gZ2V0cyBjYWxsZWQKLSAqIGlzIG5vIGxvbmdlciAxMC4wMDAyIG1zLCBidXQgOS45NzY3IG1zLiBUbyBnZXQgYXJvdW5kIHRoaXMKLSAqIHdvdWxkIHJlcXVpcmUgdXNpbmcgYSBkaWZmZXJlbnQgdGltaW5nIHNvdXJjZS4gTWF5YmUgc29tZW9uZQotICogY291bGQgdXNlIHRoZSBSVEMgLSBJIGtub3cgdGhhdCB0aGlzIGNhbiBpbnRlcnJ1cHQgYXQgZnJlcXVlbmNpZXMKLSAqIHJhbmdpbmcgZnJvbSA4MTkySHogdG8gMkh6LiBJZiBJIGhhZCB0aGUgZW5lcmd5LCBJJ2Qgc29tZWhvdyBmaXgKLSAqIGl0IHNvIHRoYXQgYXQgc3RhcnR1cCwgdGhlIHRpbWVyIGNvZGUgaW4gc2NoZWQuYyB3b3VsZCBzZWxlY3QKLSAqIHVzaW5nIGVpdGhlciB0aGUgUlRDIG9yIHRoZSA4MjUzIHRpbWVyLiBUaGUgZGVjaXNpb24gd291bGQgYmUKLSAqIGJhc2VkIG9uIHdoZXRoZXIgdGhlcmUgd2FzIGFueSBvdGhlciBkZXZpY2UgYXJvdW5kIHRoYXQgbmVlZGVkCi0gKiB0byB0cmFtcGxlIG9uIHRoZSA4MjUzLiBJJ2Qgc2V0IHVwIHRoZSBSVEMgdG8gaW50ZXJydXB0IGF0IDEwMjQgSHosCi0gKiBhbmQgdGhlbiBkbyBzb21lIGppZ2dlcnkgdG8gaGF2ZSBhIHZlcnNpb24gb2YgZG9fdGltZXIgdGhhdCAKLSAqIGFkdmFuY2VkIHRoZSBjbG9jayBieSAxLzEwMjQgcy4gRXZlcnkgdGltZSB0aGF0IHJlYWNoZWQgb3ZlciAxLzEwMAotICogb2YgYSBzZWNvbmQsIHRoZW4gZG8gYWxsIHRoZSBvbGQgY29kZS4gSWYgdGhlIHRpbWUgd2FzIGtlcHQgY29ycmVjdAotICogdGhlbiBkb19nZXR0aW1lb2Zmc2V0IGNvdWxkIGp1c3QgcmV0dXJuIDAgLSB0aGVyZSBpcyBubyBsb3cgb3JkZXIKLSAqIGRpdmlkZXIgdGhhdCBjYW4gYmUgYWNjZXNzZWQuCi0gKgotICogSWRlYWxseSwgeW91IHdvdWxkIGJlIGFibGUgdG8gdXNlIHRoZSBSVEMgZm9yIHRoZSBzcGVha2VyIGRyaXZlciwKLSAqIGJ1dCBpdCBhcHBlYXJzIHRoYXQgdGhlIHNwZWFrZXIgZHJpdmVyIHJlYWxseSBuZWVkcyBpbnRlcnJ1cHQgbW9yZQotICogb2Z0ZW4gdGhhbiBldmVyeSAxMjAgdXMgb3Igc28uCi0gKgotICogQW55d2F5LCB0aGlzIG5lZWRzIG1vcmUgdGhvdWdodC4uLi4JCXBqc2cgKDE5OTMtMDgtMjgpCi0gKiAKLSAqIElmIHlvdSBhcmUgcmVhbGx5IHRoYXQgaW50ZXJlc3RlZCwgeW91IHNob3VsZCBiZSByZWFkaW5nCi0gKiBjb21wLnByb3RvY29scy50aW1lLm50cCEKLSAqLwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBnZXRfb2Zmc2V0X3BpdCh2b2lkKQotewotCWludCBjb3VudDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0YXRpYyB1bnNpZ25lZCBsb25nIGppZmZpZXNfcCA9IDA7Ci0KLQkvKgotCSAqIGNhY2hlIHZvbGF0aWxlIGppZmZpZXMgdGVtcG9yYXJpbHk7IHdlIGhhdmUgeHRpbWVfbG9jay4gCi0JICovCi0JdW5zaWduZWQgbG9uZyBqaWZmaWVzX3Q7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaTgyNTNfbG9jaywgZmxhZ3MpOwotCS8qIHRpbWVyIGNvdW50IG1heSB1bmRlcmZsb3cgcmlnaHQgaGVyZSAqLwotCW91dGJfcCgweDAwLCBQSVRfTU9ERSk7CS8qIGxhdGNoIHRoZSBjb3VudCBBU0FQICovCi0KLQljb3VudCA9IGluYl9wKFBJVF9DSDApOwkvKiByZWFkIHRoZSBsYXRjaGVkIGNvdW50ICovCi0KLQkvKgotCSAqIFdlIGRvIHRoaXMgZ3VhcmFudGVlZCBkb3VibGUgbWVtb3J5IGFjY2VzcyBpbnN0ZWFkIG9mIGEgX3AgCi0JICogcG9zdGZpeCBpbiB0aGUgcHJldmlvdXMgcG9ydCBhY2Nlc3MuIFdoZWVlLCBoYWNrYWR5IGhhY2sKLQkgKi8KLSAJamlmZmllc190ID0gamlmZmllczsKLQotCWNvdW50IHw9IGluYl9wKFBJVF9DSDApIDw8IDg7Ci0JCi0gICAgICAgIC8qIFZJQTY4NmEgdGVzdCBjb2RlLi4uIHJlc2V0IHRoZSBsYXRjaCBpZiBjb3VudCA+IG1heCArIDEgKi8KLSAgICAgICAgaWYgKGNvdW50ID4gTEFUQ0gpIHsKLSAgICAgICAgICAgICAgICBvdXRiX3AoMHgzNCwgUElUX01PREUpOwotICAgICAgICAgICAgICAgIG91dGJfcChMQVRDSCAmIDB4ZmYsIFBJVF9DSDApOwotICAgICAgICAgICAgICAgIG91dGIoTEFUQ0ggPj4gOCwgUElUX0NIMCk7Ci0gICAgICAgICAgICAgICAgY291bnQgPSBMQVRDSCAtIDE7Ci0gICAgICAgIH0KLQkKLQkvKgotCSAqIGF2b2lkaW5nIHRpbWVyIGluY29uc2lzdGVuY2llcyAodGhleSBhcmUgcmFyZSwgYnV0IHRoZXkgaGFwcGVuKS4uLgotCSAqIHRoZXJlIGFyZSB0d28ga2luZHMgb2YgcHJvYmxlbXMgdGhhdCBtdXN0IGJlIGF2b2lkZWQgaGVyZToKLQkgKiAgMS4gdGhlIHRpbWVyIGNvdW50ZXIgdW5kZXJmbG93cwotCSAqICAyLiBoYXJkd2FyZSBwcm9ibGVtIHdpdGggdGhlIHRpbWVyLCBub3QgZ2l2aW5nIHVzIGNvbnRpbnVvdXMgdGltZSwKLQkgKiAgICAgdGhlIGNvdW50ZXIgZG9lcyBzbWFsbCAianVtcHMiIHVwd2FyZHMgb24gc29tZSBQZW50aXVtIHN5c3RlbXMsCi0JICogICAgIChzZWUgYyd0IDk1LzEwIHBhZ2UgMzM1IGZvciBOZXB0dW4gYnVnLikKLQkgKi8KLQotCWlmKCBqaWZmaWVzX3QgPT0gamlmZmllc19wICkgewotCQlpZiggY291bnQgPiBjb3VudF9wICkgewotCQkJLyogdGhlIG51dGNhc2UgKi8KLQkJCWNvdW50ID0gZG9fdGltZXJfb3ZlcmZsb3coY291bnQpOwotCQl9Ci0JfSBlbHNlCi0JCWppZmZpZXNfcCA9IGppZmZpZXNfdDsKLQotCWNvdW50X3AgPSBjb3VudDsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmk4MjUzX2xvY2ssIGZsYWdzKTsKLQotCWNvdW50ID0gKChMQVRDSC0xKSAtIGNvdW50KSAqIFRJQ0tfU0laRTsKLQljb3VudCA9IChjb3VudCArIExBVENILzIpIC8gTEFUQ0g7Ci0KLQlyZXR1cm4gY291bnQ7Ci19Ci0KLQotLyogdHNjIHRpbWVyX29wdHMgc3RydWN0ICovCi1zdHJ1Y3QgdGltZXJfb3B0cyB0aW1lcl9waXQgPSB7Ci0JLm5hbWUgPSAicGl0IiwKLQkubWFya19vZmZzZXQgPSBtYXJrX29mZnNldF9waXQsIAotCS5nZXRfb2Zmc2V0ID0gZ2V0X29mZnNldF9waXQsCi0JLm1vbm90b25pY19jbG9jayA9IG1vbm90b25pY19jbG9ja19waXQsCi0JLmRlbGF5ID0gZGVsYXlfcGl0LAotfTsKLQotc3RydWN0IGluaXRfdGltZXJfb3B0cyBfX2luaXRkYXRhIHRpbWVyX3BpdF9pbml0ID0gewotCS5pbml0ID0gaW5pdF9waXQsIAotCS5vcHRzID0gJnRpbWVyX3BpdCwKLX07Ci0KLXZvaWQgc2V0dXBfcGl0X3RpbWVyKHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZpODI1M19sb2NrLCBmbGFncyk7Ci0Jb3V0Yl9wKDB4MzQsUElUX01PREUpOwkJLyogYmluYXJ5LCBtb2RlIDIsIExTQi9NU0IsIGNoIDAgKi8KLQl1ZGVsYXkoMTApOwotCW91dGJfcChMQVRDSCAmIDB4ZmYgLCBQSVRfQ0gwKTsJLyogTFNCICovCi0JdWRlbGF5KDEwKTsKLQlvdXRiKExBVENIID4+IDggLCBQSVRfQ0gwKTsJLyogTVNCICovCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaTgyNTNfbG9jaywgZmxhZ3MpOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC90aW1lcnMvdGltZXJfcG0uYyBiL2FyY2gvaTM4Ni9rZXJuZWwvdGltZXJzL3RpbWVyX3BtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0NGU5NGEuLjAwMDAwMDAKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC90aW1lcnMvdGltZXJfcG0uYworKysgL2Rldi9udWxsCkBAIC0xLDM0MiArMCwwIEBACi0vKgotICogKEMpIERvbWluaWsgQnJvZG93c2tpIDxsaW51eEBicm9kby5kZT4gMjAwMwotICoKLSAqIERyaXZlciB0byB1c2UgdGhlIFBvd2VyIE1hbmFnZW1lbnQgVGltZXIgKFBNVE1SKSBhdmFpbGFibGUgaW4gc29tZQotICogc291dGhicmlkZ2VzIGFzIHByaW1hcnkgdGltaW5nIHNvdXJjZSBmb3IgdGhlIExpbnV4IGtlcm5lbC4KLSAqCi0gKiBCYXNlZCBvbiBwYXJ0cyBvZiBsaW51eC9kcml2ZXJzL2FjcGkvaGFyZHdhcmUvaHd0aW1lci5jLCB0aW1lcl9waXQuYywKLSAqIHRpbWVyX2hwZXQuYywgYW5kIG9uIEFyamFuIHZhbiBkZSBWZW4ncyBpbXBsZW1lbnRhdGlvbiBmb3IgMi40LgotICoKLSAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR1BMIHYyLgotICovCi0KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxhc20vdHlwZXMuaD4KLSNpbmNsdWRlIDxhc20vdGltZXIuaD4KLSNpbmNsdWRlIDxhc20vc21wLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL2FyY2hfaG9va3MuaD4KLQotI2luY2x1ZGUgPGxpbnV4L3RpbWV4Lmg+Ci0jaW5jbHVkZSAibWFjaF90aW1lci5oIgotCi0vKiBOdW1iZXIgb2YgUE1UTVIgdGlja3MgZXhwZWN0ZWQgZHVyaW5nIGNhbGlicmF0aW9uIHJ1biAqLwotI2RlZmluZSBQTVRNUl9USUNLU19QRVJfU0VDIDM1Nzk1NDUKLSNkZWZpbmUgUE1UTVJfRVhQRUNURURfUkFURSBcCi0gICgoQ0FMSUJSQVRFX0xBVENIICogKFBNVE1SX1RJQ0tTX1BFUl9TRUMgPj4gMTApKSAvIChDTE9DS19USUNLX1JBVEU+PjEwKSkKLQotCi0vKiBUaGUgSS9PIHBvcnQgdGhlIFBNVE1SIHJlc2lkZXMgYXQuCi0gKiBUaGUgbG9jYXRpb24gaXMgZGV0ZWN0ZWQgZHVyaW5nIHNldHVwX2FyY2goKSwKLSAqIGluIGFyY2gvaTM4Ni9hY3BpL2Jvb3QuYyAqLwotdTMyIHBtdG1yX2lvcG9ydCA9IDA7Ci0KLQotLyogdmFsdWUgb2YgdGhlIFBvd2VyIHRpbWVyIGF0IGxhc3QgdGltZXIgaW50ZXJydXB0ICovCi1zdGF0aWMgdTMyIG9mZnNldF90aWNrOwotc3RhdGljIHUzMiBvZmZzZXRfZGVsYXk7Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgbW9ub3RvbmljX2Jhc2U7Ci1zdGF0aWMgc2VxbG9ja190IG1vbm90b25pY19sb2NrID0gU0VRTE9DS19VTkxPQ0tFRDsKLQotI2RlZmluZSBBQ1BJX1BNX01BU0sgMHhGRkZGRkYgLyogbGltaXQgaXQgdG8gMjQgYml0cyAqLwotCi1zdGF0aWMgaW50IHBtdG1yX25lZWRfd29ya2Fyb3VuZCBfX3JlYWRfbW9zdGx5ID0gMTsKLQotLypoZWxwZXIgZnVuY3Rpb24gdG8gc2FmZWx5IHJlYWQgYWNwaSBwbSB0aW1lc291cmNlKi8KLXN0YXRpYyBpbmxpbmUgdTMyIHJlYWRfcG10bXIodm9pZCkKLXsKLQlpZiAocG10bXJfbmVlZF93b3JrYXJvdW5kKSB7Ci0JCXUzMiB2MSwgdjIsIHYzOwotCi0JCS8qIEl0IGhhcyBiZWVuIHJlcG9ydGVkIHRoYXQgYmVjYXVzZSBvZiB2YXJpb3VzIGJyb2tlbgotCQkgKiBjaGlwc2V0cyAoSUNINCwgUElJWDQgYW5kIFBJSVg0RSkgd2hlcmUgdGhlIEFDUEkgUE0gdGltZQotCQkgKiBzb3VyY2UgaXMgbm90IGxhdGNoZWQsIHNvIHlvdSBtdXN0IHJlYWQgaXQgbXVsdGlwbGUKLQkJICogdGltZXMgdG8gaW5zdXJlIGEgc2FmZSB2YWx1ZSBpcyByZWFkLgotCQkgKi8KLQkJZG8gewotCQkJdjEgPSBpbmwocG10bXJfaW9wb3J0KTsKLQkJCXYyID0gaW5sKHBtdG1yX2lvcG9ydCk7Ci0JCQl2MyA9IGlubChwbXRtcl9pb3BvcnQpOwotCQl9IHdoaWxlICgodjEgPiB2MiAmJiB2MSA8IHYzKSB8fCAodjIgPiB2MyAmJiB2MiA8IHYxKQotCQkJIHx8ICh2MyA+IHYxICYmIHYzIDwgdjIpKTsKLQotCQkvKiBtYXNrIHRoZSBvdXRwdXQgdG8gMjQgYml0cyAqLwotCQlyZXR1cm4gdjIgJiBBQ1BJX1BNX01BU0s7Ci0JfQotCi0JcmV0dXJuIGlubChwbXRtcl9pb3BvcnQpICYgQUNQSV9QTV9NQVNLOwotfQotCi0KLS8qCi0gKiBTb21lIGJvYXJkcyBoYXZlIHRoZSBQTVRNUiBydW5uaW5nIHdheSB0b28gZmFzdC4gV2UgY2hlY2sKLSAqIHRoZSBQTVRNUiByYXRlIGFnYWluc3QgUElUIGNoYW5uZWwgMiB0byBjYXRjaCB0aGVzZSBjYXNlcy4KLSAqLwotc3RhdGljIGludCB2ZXJpZnlfcG10bXJfcmF0ZSh2b2lkKQotewotCXUzMiB2YWx1ZTEsIHZhbHVlMjsKLQl1bnNpZ25lZCBsb25nIGNvdW50LCBkZWx0YTsKLQotCW1hY2hfcHJlcGFyZV9jb3VudGVyKCk7Ci0JdmFsdWUxID0gcmVhZF9wbXRtcigpOwotCW1hY2hfY291bnR1cCgmY291bnQpOwotCXZhbHVlMiA9IHJlYWRfcG10bXIoKTsKLQlkZWx0YSA9ICh2YWx1ZTIgLSB2YWx1ZTEpICYgQUNQSV9QTV9NQVNLOwotCi0JLyogQ2hlY2sgdGhhdCB0aGUgUE1UTVIgZGVsdGEgaXMgd2l0aGluIDUlIG9mIHdoYXQgd2UgZXhwZWN0ICovCi0JaWYgKGRlbHRhIDwgKFBNVE1SX0VYUEVDVEVEX1JBVEUgKiAxOSkgLyAyMCB8fAotCSAgICBkZWx0YSA+IChQTVRNUl9FWFBFQ1RFRF9SQVRFICogMjEpIC8gMjApIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiUE0tVGltZXIgcnVubmluZyBhdCBpbnZhbGlkIHJhdGU6ICVsdSUlIG9mIG5vcm1hbCAtIGFib3J0aW5nLlxuIiwgMTAwVUwgKiBkZWx0YSAvIFBNVE1SX0VYUEVDVEVEX1JBVEUpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIGludCBpbml0X3BtdG1yKGNoYXIqIG92ZXJyaWRlKQotewotCXUzMiB2YWx1ZTEsIHZhbHVlMjsKLQl1bnNpZ25lZCBpbnQgaTsKLQotIAlpZiAob3ZlcnJpZGVbMF0gJiYgc3RybmNtcChvdmVycmlkZSwicG10bXIiLDUpKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWlmICghcG10bXJfaW9wb3J0KQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCS8qIHdlIHVzZSB0aGUgVFNDIGZvciBkZWxheV9wbXRtciwgc28gbWFrZSBzdXJlIGl0IGV4aXN0cyAqLwotCWlmICghY3B1X2hhc190c2MpCi0JCXJldHVybiAtRU5PREVWOwotCi0JLyogInZlcmlmeSIgdGhpcyB0aW1pbmcgc291cmNlICovCi0JdmFsdWUxID0gcmVhZF9wbXRtcigpOwotCWZvciAoaSA9IDA7IGkgPCAxMDAwMDsgaSsrKSB7Ci0JCXZhbHVlMiA9IHJlYWRfcG10bXIoKTsKLQkJaWYgKHZhbHVlMiA9PSB2YWx1ZTEpCi0JCQljb250aW51ZTsKLQkJaWYgKHZhbHVlMiA+IHZhbHVlMSkKLQkJCWdvdG8gcG1fZ29vZDsKLQkJaWYgKCh2YWx1ZTIgPCB2YWx1ZTEpICYmICgodmFsdWUyKSA8IDB4RkZGKSkKLQkJCWdvdG8gcG1fZ29vZDsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiUE0tVGltZXIgaGFkIGluY29uc2lzdGVudCByZXN1bHRzOiAweCUjeCwgMHglI3ggLSBhYm9ydGluZy5cbiIsIHZhbHVlMSwgdmFsdWUyKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXByaW50ayhLRVJOX0lORk8gIlBNLVRpbWVyIGhhZCBubyByZWFzb25hYmxlIHJlc3VsdDogMHglI3ggLSBhYm9ydGluZy5cbiIsIHZhbHVlMSk7Ci0JcmV0dXJuIC1FTk9ERVY7Ci0KLXBtX2dvb2Q6Ci0JaWYgKHZlcmlmeV9wbXRtcl9yYXRlKCkgIT0gMCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlpbml0X2NwdV9raHooKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGlubGluZSB1MzIgY3ljMnVzKHUzMiBjeWNsZXMpCi17Ci0JLyogVGhlIFBvd2VyIE1hbmFnZW1lbnQgVGltZXIgdGlja3MgYXQgMy41Nzk1NDUgdGlja3MgcGVyIG1pY3Jvc2Vjb25kLgotCSAqIDEgLyBQTV9USU1FUl9GUkVRVUVOQ1kgPT0gMC4yNzkzNjUxMSA9fiAyODYvMTAyNCBbZXJyb3I6IDAuMDI0JV0KLQkgKgotCSAqIEV2ZW4gd2l0aCBIWiA9IDEwMCwgZGVsdGEgaXMgYXQgbWF4aW11bSAzNTc5NiB0aWNrcywgc28gaXQgY2FuCi0JICogZWFzaWx5IGJlIG11bHRpcGxpZWQgd2l0aCAyODYgKD0weDExRSkgd2l0aG91dCBoYXZpbmcgdG8gZmVhcgotCSAqIHUzMiBvdmVyZmxvd3MuCi0JICovCi0JY3ljbGVzICo9IDI4NjsKLQlyZXR1cm4gKGN5Y2xlcyA+PiAxMCk7Ci19Ci0KLS8qCi0gKiB0aGlzIGdldHMgY2FsbGVkIGR1cmluZyBlYWNoIHRpbWVyIGludGVycnVwdAotICogICAtIENhbGxlZCB3aGlsZSBob2xkaW5nIHRoZSB3cml0ZXIgeHRpbWVfbG9jawotICovCi1zdGF0aWMgdm9pZCBtYXJrX29mZnNldF9wbXRtcih2b2lkKQotewotCXUzMiBsb3N0LCBkZWx0YSwgbGFzdF9vZmZzZXQ7Ci0Jc3RhdGljIGludCBmaXJzdF9ydW4gPSAxOwotCWxhc3Rfb2Zmc2V0ID0gb2Zmc2V0X3RpY2s7Ci0KLQl3cml0ZV9zZXFsb2NrKCZtb25vdG9uaWNfbG9jayk7Ci0KLQlvZmZzZXRfdGljayA9IHJlYWRfcG10bXIoKTsKLQotCS8qIGNhbGN1bGF0ZSB0aWNrIGludGVydmFsICovCi0JZGVsdGEgPSAob2Zmc2V0X3RpY2sgLSBsYXN0X29mZnNldCkgJiBBQ1BJX1BNX01BU0s7Ci0KLQkvKiBjb252ZXJ0IHRvIHVzZWNzICovCi0JZGVsdGEgPSBjeWMydXMoZGVsdGEpOwotCi0JLyogdXBkYXRlIHRoZSBtb25vdG9uaWMgYmFzZSB2YWx1ZSAqLwotCW1vbm90b25pY19iYXNlICs9IGRlbHRhICogTlNFQ19QRVJfVVNFQzsKLQl3cml0ZV9zZXF1bmxvY2soJm1vbm90b25pY19sb2NrKTsKLQotCS8qIGNvbnZlcnQgdG8gdGlja3MgKi8KLQlkZWx0YSArPSBvZmZzZXRfZGVsYXk7Ci0JbG9zdCA9IGRlbHRhIC8gKFVTRUNfUEVSX1NFQyAvIEhaKTsKLQlvZmZzZXRfZGVsYXkgPSBkZWx0YSAlIChVU0VDX1BFUl9TRUMgLyBIWik7Ci0KLQotCS8qIGNvbXBlbnNhdGUgZm9yIGxvc3QgdGlja3MgKi8KLQlpZiAobG9zdCA+PSAyKQotCQlqaWZmaWVzXzY0ICs9IGxvc3QgLSAxOwotCi0JLyogZG9uJ3QgY2FsY3VsYXRlIGRlbGF5IGZvciBmaXJzdCBydW4sCi0JICAgb3IgaWYgd2UndmUgZ290IGxlc3MgdGhlbiBhIHRpY2sgKi8KLQlpZiAoZmlyc3RfcnVuIHx8IChsb3N0IDwgMSkpIHsKLQkJZmlyc3RfcnVuID0gMDsKLQkJb2Zmc2V0X2RlbGF5ID0gMDsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgcG10bXJfcmVzdW1lKHZvaWQpCi17Ci0Jd3JpdGVfc2VxbG9jaygmbW9ub3RvbmljX2xvY2spOwotCS8qIEFzc3VtZSB0aGlzIGlzIHRoZSBsYXN0IG1hcmsgb2Zmc2V0IHRpbWUgKi8KLQlvZmZzZXRfdGljayA9IHJlYWRfcG10bXIoKTsKLQl3cml0ZV9zZXF1bmxvY2soJm1vbm90b25pY19sb2NrKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyBtb25vdG9uaWNfY2xvY2tfcG10bXIodm9pZCkKLXsKLQl1MzIgbGFzdF9vZmZzZXQsIHRoaXNfb2Zmc2V0OwotCXVuc2lnbmVkIGxvbmcgbG9uZyBiYXNlLCByZXQ7Ci0JdW5zaWduZWQgc2VxOwotCi0KLQkvKiBhdG9taWNhbGx5IHJlYWQgbW9ub3RvbmljIGJhc2UgJiBsYXN0X29mZnNldCAqLwotCWRvIHsKLQkJc2VxID0gcmVhZF9zZXFiZWdpbigmbW9ub3RvbmljX2xvY2spOwotCQlsYXN0X29mZnNldCA9IG9mZnNldF90aWNrOwotCQliYXNlID0gbW9ub3RvbmljX2Jhc2U7Ci0JfSB3aGlsZSAocmVhZF9zZXFyZXRyeSgmbW9ub3RvbmljX2xvY2ssIHNlcSkpOwotCi0JLyogUmVhZCB0aGUgcG10bXIgKi8KLQl0aGlzX29mZnNldCA9ICByZWFkX3BtdG1yKCk7Ci0KLQkvKiBjb252ZXJ0IHRvIG5hbm9zZWNvbmRzICovCi0JcmV0ID0gKHRoaXNfb2Zmc2V0IC0gbGFzdF9vZmZzZXQpICYgQUNQSV9QTV9NQVNLOwotCXJldCA9IGJhc2UgKyAoY3ljMnVzKHJldCkgKiBOU0VDX1BFUl9VU0VDKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBkZWxheV9wbXRtcih1bnNpZ25lZCBsb25nIGxvb3BzKQotewotCXVuc2lnbmVkIGxvbmcgYmNsb2NrLCBub3c7Ci0KLQlyZHRzY2woYmNsb2NrKTsKLQlkbwotCXsKLQkJcmVwX25vcCgpOwotCQlyZHRzY2wobm93KTsKLQl9IHdoaWxlICgobm93LWJjbG9jaykgPCBsb29wcyk7Ci19Ci0KLQotLyoKLSAqIGdldCB0aGUgb2Zmc2V0IChpbiBtaWNyb3NlY29uZHMpIGZyb20gdGhlIGxhc3QgY2FsbCB0byBtYXJrX29mZnNldCgpCi0gKgktIENhbGxlZCBob2xkaW5nIGEgcmVhZGVyIHh0aW1lX2xvY2sKLSAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2V0X29mZnNldF9wbXRtcih2b2lkKQotewotCXUzMiBub3csIG9mZnNldCwgZGVsdGEgPSAwOwotCi0Jb2Zmc2V0ID0gb2Zmc2V0X3RpY2s7Ci0Jbm93ID0gcmVhZF9wbXRtcigpOwotCWRlbHRhID0gKG5vdyAtIG9mZnNldCkmQUNQSV9QTV9NQVNLOwotCi0JcmV0dXJuICh1bnNpZ25lZCBsb25nKSBvZmZzZXRfZGVsYXkgKyBjeWMydXMoZGVsdGEpOwotfQotCi0KLS8qIGFjcGkgdGltZXJfb3B0cyBzdHJ1Y3QgKi8KLXN0YXRpYyBzdHJ1Y3QgdGltZXJfb3B0cyB0aW1lcl9wbXRtciA9IHsKLQkubmFtZQkJCT0gInBtdG1yIiwKLQkubWFya19vZmZzZXQJCT0gbWFya19vZmZzZXRfcG10bXIsCi0JLmdldF9vZmZzZXQJCT0gZ2V0X29mZnNldF9wbXRtciwKLQkubW9ub3RvbmljX2Nsb2NrIAk9IG1vbm90b25pY19jbG9ja19wbXRtciwKLQkuZGVsYXkgCQkJPSBkZWxheV9wbXRtciwKLQkucmVhZF90aW1lciAJCT0gcmVhZF90aW1lcl90c2MsCi0JLnJlc3VtZQkJCT0gcG10bXJfcmVzdW1lLAotfTsKLQotc3RydWN0IGluaXRfdGltZXJfb3B0cyBfX2luaXRkYXRhIHRpbWVyX3BtdG1yX2luaXQgPSB7Ci0JLmluaXQgPSBpbml0X3BtdG1yLAotCS5vcHRzID0gJnRpbWVyX3BtdG1yLAotfTsKLQotI2lmZGVmIENPTkZJR19QQ0kKLS8qCi0gKiBQSUlYNCBFcnJhdGE6Ci0gKgotICogVGhlIHBvd2VyIG1hbmFnZW1lbnQgdGltZXIgbWF5IHJldHVybiBpbXByb3BlciByZXN1bHRzIHdoZW4gcmVhZC4KLSAqIEFsdGhvdWdoIHRoZSB0aW1lciB2YWx1ZSBzZXR0bGVzIHByb3Blcmx5IGFmdGVyIGluY3JlbWVudGluZywKLSAqIHdoaWxlIGluY3JlbWVudGluZyB0aGVyZSBpcyBhIDMgbnMgd2luZG93IGV2ZXJ5IDY5LjggbnMgd2hlcmUgdGhlCi0gKiB0aW1lciB2YWx1ZSBpcyBpbmRldGVybWluYXRlIChhIDQuMiUgY2hhbmNlIHRoYXQgdGhlIGRhdGEgd2lsbCBiZQotICogaW5jb3JyZWN0IHdoZW4gcmVhZCkuIEFzIGEgcmVzdWx0LCB0aGUgQUNQSSBmcmVlIHJ1bm5pbmcgY291bnQgdXAKLSAqIHRpbWVyIHNwZWNpZmljYXRpb24gaXMgdmlvbGF0ZWQgZHVlIHRvIGVycm9uZW91cyByZWFkcy4KLSAqLwotc3RhdGljIGludCBfX2luaXQgcG10bXJfYnVnX2NoZWNrKHZvaWQpCi17Ci0Jc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGdyYXlfbGlzdFtdIF9faW5pdGRhdGEgPSB7Ci0JCS8qIHRoZXNlIGNoaXBzZXRzIG1heSBoYXZlIGJ1Zy4gKi8KLQkJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSU5URUwsCi0JCQkJUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMURCXzApIH0sCi0JCXsgfSwKLQl9OwotCXN0cnVjdCBwY2lfZGV2ICpkZXY7Ci0JaW50IHBtdG1yX2hhc19idWcgPSAwOwotCXU4IHJldjsKLQotCWlmIChjdXJfdGltZXIgIT0gJnRpbWVyX3BtdG1yIHx8ICFwbXRtcl9uZWVkX3dvcmthcm91bmQpCi0JCXJldHVybiAwOwotCi0JZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9JTlRFTCwKLQkJCSAgICAgUENJX0RFVklDRV9JRF9JTlRFTF84MjM3MUFCXzMsIE5VTEwpOwotCWlmIChkZXYpIHsKLQkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBQQ0lfUkVWSVNJT05fSUQsICZyZXYpOwotCQkvKiB0aGUgYnVnIGhhcyBiZWVuIGZpeGVkIGluIFBJSVg0TSAqLwotCQlpZiAocmV2IDwgMykgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiKiBGb3VuZCBQTS1UaW1lciBCdWcgb24gdGhpcyAiCi0JCQkJImNoaXBzZXQuIER1ZSB0byB3b3JrYXJvdW5kcyBmb3IgYSBidWcsXG4iCi0JCQkJIiogdGhpcyB0aW1lIHNvdXJjZSBpcyBzbG93LiAgQ29uc2lkZXIgdHJ5aW5nICIKLQkJCQkib3RoZXIgdGltZSBzb3VyY2VzIChjbG9jaz0pXG4iKTsKLQkJCXBtdG1yX2hhc19idWcgPSAxOwotCQl9Ci0JCXBjaV9kZXZfcHV0KGRldik7Ci0JfQotCi0JaWYgKHBjaV9kZXZfcHJlc2VudChncmF5X2xpc3QpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIiogVGhpcyBjaGlwc2V0IG1heSBoYXZlIFBNLVRpbWVyIEJ1Zy4gIER1ZSIKLQkJCSIgdG8gd29ya2Fyb3VuZHMgZm9yIGEgYnVnLFxuIgotCQkJIiogdGhpcyB0aW1lIHNvdXJjZSBpcyBzbG93LiBJZiB5b3UgYXJlIHN1cmUgeW91ciB0aW1lciIKLQkJCSIgZG9lcyBub3QgaGF2ZVxuIgotCQkJIiogdGhpcyBidWcsIHBsZWFzZSB1c2UgXCJwbXRtcl9nb29kXCIgdG8gZGlzYWJsZSB0aGUgIgotCQkJIndvcmthcm91bmRcbiIpOwotCQlwbXRtcl9oYXNfYnVnID0gMTsKLQl9Ci0KLQlpZiAoIXBtdG1yX2hhc19idWcpCi0JCXBtdG1yX25lZWRfd29ya2Fyb3VuZCA9IDA7Ci0KLQlyZXR1cm4gMDsKLX0KLWRldmljZV9pbml0Y2FsbChwbXRtcl9idWdfY2hlY2spOwotI2VuZGlmCi0KLXN0YXRpYyBpbnQgX19pbml0IHBtdHJfZ29vZF9zZXR1cChjaGFyICpfX3N0cikKLXsKLQlwbXRtcl9uZWVkX3dvcmthcm91bmQgPSAwOwotCXJldHVybiAxOwotfQotX19zZXR1cCgicG10bXJfZ29vZCIsIHBtdHJfZ29vZF9zZXR1cCk7Ci0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9BVVRIT1IoIkRvbWluaWsgQnJvZG93c2tpIDxsaW51eEBicm9kby5kZT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiUG93ZXIgTWFuYWdlbWVudCBUaW1lciAoUE1UTVIpIGFzIHByaW1hcnkgdGltaW5nIHNvdXJjZSBmb3IgeDg2Iik7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3RpbWVycy90aW1lcl90c2MuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvdGltZXJzL3RpbWVyX3RzYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTE4N2RkLi4wMDAwMDAwCi0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvdGltZXJzL3RpbWVyX3RzYy5jCisrKyAvZGV2L251bGwKQEAgLTEsNjE3ICswLDAgQEAKLS8qCi0gKiBUaGlzIGNvZGUgbGFyZ2VseSBtb3ZlZCBmcm9tIGFyY2gvaTM4Ni9rZXJuZWwvdGltZS5jLgotICogU2VlIGNvbW1lbnRzIHRoZXJlIGZvciBwcm9wZXIgY3JlZGl0cy4KLSAqCi0gKiAyMDA0LTA2LTI1ICAgIEplc3BlciBKdWhsCi0gKiAgICAgIG1vdmVkIG1hcmtfb2Zmc2V0X3RzYyBiZWxvdyBjcHVmcmVxX2RlbGF5ZWRfZ2V0IHRvIGF2b2lkIGdjYyAzLjQKLSAqICAgICAgZmFpbGluZyB0byBpbmxpbmUuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9jcHVmcmVxLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgotCi0jaW5jbHVkZSA8YXNtL3RpbWVyLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0vKiBwcm9jZXNzb3IuaCBmb3IgZGlzdGFibGVfdHNjIGZsYWcgKi8KLSNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+Ci0KLSNpbmNsdWRlICJpb19wb3J0cy5oIgotI2luY2x1ZGUgIm1hY2hfdGltZXIuaCIKLQotI2luY2x1ZGUgPGFzbS9ocGV0Lmg+Ci0jaW5jbHVkZSA8YXNtL2k4MjUzLmg+Ci0KLSNpZmRlZiBDT05GSUdfSFBFVF9USU1FUgotc3RhdGljIHVuc2lnbmVkIGxvbmcgaHBldF91c2VjX3F1b3RpZW50Owotc3RhdGljIHVuc2lnbmVkIGxvbmcgaHBldF9sYXN0Owotc3RhdGljIHN0cnVjdCB0aW1lcl9vcHRzIHRpbWVyX3RzYzsKLSNlbmRpZgotCi1zdGF0aWMgaW5saW5lIHZvaWQgY3B1ZnJlcV9kZWxheWVkX2dldCh2b2lkKTsKLQotaW50IHRzY19kaXNhYmxlIF9fZGV2aW5pdGRhdGEgPSAwOwotCi1zdGF0aWMgaW50IHVzZV90c2M7Ci0vKiBOdW1iZXIgb2YgdXNlY3MgdGhhdCB0aGUgbGFzdCBpbnRlcnJ1cHQgd2FzIGRlbGF5ZWQgKi8KLXN0YXRpYyBpbnQgZGVsYXlfYXRfbGFzdF9pbnRlcnJ1cHQ7Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGxhc3RfdHNjX2xvdzsgLyogbHNiIDMyIGJpdHMgb2YgVGltZSBTdGFtcCBDb3VudGVyICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBsYXN0X3RzY19oaWdoOyAvKiBtc2IgMzIgYml0cyBvZiBUaW1lIFN0YW1wIENvdW50ZXIgKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgbW9ub3RvbmljX2Jhc2U7Ci1zdGF0aWMgc2VxbG9ja190IG1vbm90b25pY19sb2NrID0gU0VRTE9DS19VTkxPQ0tFRDsKLQotLyogQXZvaWQgY29tcGVuc2F0aW5nIGZvciBsb3N0IHRpY2tzIGJlZm9yZSBUU0NzIGFyZSBzeW5jaGVkICovCi1zdGF0aWMgaW50IGRldGVjdF9sb3N0X3RpY2tzOwotc3RhdGljIGludCBfX2luaXQgc3RhcnRfbG9zdF90aWNrX2NvbXBlbnNhdGlvbih2b2lkKQotewotCWRldGVjdF9sb3N0X3RpY2tzID0gMTsKLQlyZXR1cm4gMDsKLX0KLWxhdGVfaW5pdGNhbGwoc3RhcnRfbG9zdF90aWNrX2NvbXBlbnNhdGlvbik7Ci0KLS8qIGNvbnZlcnQgZnJvbSBjeWNsZXMoNjRiaXRzKSA9PiBuYW5vc2Vjb25kcyAoNjRiaXRzKQotICogIGJhc2ljIGVxdWF0aW9uOgotICoJCW5zID0gY3ljbGVzIC8gKGZyZXEgLyBuc19wZXJfc2VjKQotICoJCW5zID0gY3ljbGVzICogKG5zX3Blcl9zZWMgLyBmcmVxKQotICoJCW5zID0gY3ljbGVzICogKDEwXjkgLyAoY3B1X2toeiAqIDEwXjMpKQotICoJCW5zID0gY3ljbGVzICogKDEwXjYgLyBjcHVfa2h6KQotICoKLSAqCVRoZW4gd2UgdXNlIHNjYWxpbmcgbWF0aCAoc3VnZ2VzdGVkIGJ5IGdlb3JnZUBtdmlzdGEuY29tKSB0byBnZXQ6Ci0gKgkJbnMgPSBjeWNsZXMgKiAoMTBeNiAqIFNDIC8gY3B1X2toeikgLyBTQwotICoJCW5zID0gY3ljbGVzICogY3ljMm5zX3NjYWxlIC8gU0MKLSAqCi0gKglBbmQgc2luY2UgU0MgaXMgYSBjb25zdGFudCBwb3dlciBvZiB0d28sIHdlIGNhbiBjb252ZXJ0IHRoZSBkaXYKLSAqICBpbnRvIGEgc2hpZnQuCi0gKgotICogIFdlIGNhbiB1c2Uga2h6IGRpdmlzb3IgaW5zdGVhZCBvZiBtaHogdG8ga2VlcCBhIGJldHRlciBwZXJjaXNpb24sIHNpbmNlCi0gKiAgY3ljMm5zX3NjYWxlIGlzIGxpbWl0ZWQgdG8gMTBeNiAqIDJeMTAsIHdoaWNoIGZpdHMgaW4gMzIgYml0cy4KLSAqICAobWF0aGlldS5kZXNub3llcnNAcG9seW10bC5jYSkKLSAqCi0gKgkJCS1qb2huc3R1bEB1cy5pYm0uY29tICJtYXRoIGlzIGhhcmQsIGxldHMgZ28gc2hvcHBpbmchIgotICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBjeWMybnNfc2NhbGUgX19yZWFkX21vc3RseTsKLSNkZWZpbmUgQ1lDMk5TX1NDQUxFX0ZBQ1RPUiAxMCAvKiAyXjEwLCBjYXJlZnVsbHkgY2hvc2VuICovCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfY3ljMm5zX3NjYWxlKHVuc2lnbmVkIGxvbmcgY3B1X2toeikKLXsKLQljeWMybnNfc2NhbGUgPSAoMTAwMDAwMCA8PCBDWUMyTlNfU0NBTEVfRkFDVE9SKS9jcHVfa2h6OwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbG9uZyBjeWNsZXNfMl9ucyh1bnNpZ25lZCBsb25nIGxvbmcgY3ljKQotewotCXJldHVybiAoY3ljICogY3ljMm5zX3NjYWxlKSA+PiBDWUMyTlNfU0NBTEVfRkFDVE9SOwotfQotCi1zdGF0aWMgaW50IGNvdW50MjsgLyogY291bnRlciBmb3IgbWFya19vZmZzZXRfdHNjKCkgKi8KLQotLyogQ2FjaGVkICptdWx0aXBsaWVyKiB0byBjb252ZXJ0IFRTQyBjb3VudHMgdG8gbWljcm9zZWNvbmRzLgotICogKHNlZSB0aGUgZXF1YXRpb24gYmVsb3cpLgotICogRXF1YWwgdG8gMl4zMiAqICgxIC8gKGNsb2NrcyBwZXIgdXNlYykgKS4KLSAqIEluaXRpYWxpemVkIGluIHRpbWVfaW5pdC4KLSAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgZmFzdF9nZXR0aW1lb2Zmc2V0X3F1b3RpZW50OwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBnZXRfb2Zmc2V0X3RzYyh2b2lkKQotewotCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgZWF4LCBlZHg7Ci0KLQkvKiBSZWFkIHRoZSBUaW1lIFN0YW1wIENvdW50ZXIgKi8KLQotCXJkdHNjKGVheCxlZHgpOwotCi0JLyogLi4gcmVsYXRpdmUgdG8gcHJldmlvdXMgamlmZnkgKDMyIGJpdHMgaXMgZW5vdWdoKSAqLwotCWVheCAtPSBsYXN0X3RzY19sb3c7CS8qIHRzY19sb3cgZGVsdGEgKi8KLQotCS8qCi0gICAgICAgICAqIFRpbWUgb2Zmc2V0ID0gKHRzY19sb3cgZGVsdGEpICogZmFzdF9nZXR0aW1lb2Zmc2V0X3F1b3RpZW50Ci0gICAgICAgICAqICAgICAgICAgICAgID0gKHRzY19sb3cgZGVsdGEpICogKHVzZWNzX3Blcl9jbG9jaykKLSAgICAgICAgICogICAgICAgICAgICAgPSAodHNjX2xvdyBkZWx0YSkgKiAodXNlY3NfcGVyX2ppZmZ5IC8gY2xvY2tzX3Blcl9qaWZmeSkKLQkgKgotCSAqIFVzaW5nIGEgbXVsbCBpbnN0ZWFkIG9mIGEgZGl2bCBzYXZlcyB1cCB0byAzMSBjbG9jayBjeWNsZXMKLQkgKiBpbiB0aGUgY3JpdGljYWwgcGF0aC4KLSAgICAgICAgICovCi0KLQlfX2FzbV9fKCJtdWxsICUyIgotCQk6Ij1hIiAoZWF4KSwgIj1kIiAoZWR4KQotCQk6InJtIiAoZmFzdF9nZXR0aW1lb2Zmc2V0X3F1b3RpZW50KSwKLQkJICIwIiAoZWF4KSk7Ci0KLQkvKiBvdXIgYWRqdXN0ZWQgdGltZSBvZmZzZXQgaW4gbWljcm9zZWNvbmRzICovCi0JcmV0dXJuIGRlbGF5X2F0X2xhc3RfaW50ZXJydXB0ICsgZWR4OwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIG1vbm90b25pY19jbG9ja190c2Modm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIGxvbmcgbGFzdF9vZmZzZXQsIHRoaXNfb2Zmc2V0LCBiYXNlOwotCXVuc2lnbmVkIHNlcTsKLQkKLQkvKiBhdG9taWNhbGx5IHJlYWQgbW9ub3RvbmljIGJhc2UgJiBsYXN0X29mZnNldCAqLwotCWRvIHsKLQkJc2VxID0gcmVhZF9zZXFiZWdpbigmbW9ub3RvbmljX2xvY2spOwotCQlsYXN0X29mZnNldCA9ICgodW5zaWduZWQgbG9uZyBsb25nKWxhc3RfdHNjX2hpZ2g8PDMyKXxsYXN0X3RzY19sb3c7Ci0JCWJhc2UgPSBtb25vdG9uaWNfYmFzZTsKLQl9IHdoaWxlIChyZWFkX3NlcXJldHJ5KCZtb25vdG9uaWNfbG9jaywgc2VxKSk7Ci0KLQkvKiBSZWFkIHRoZSBUaW1lIFN0YW1wIENvdW50ZXIgKi8KLQlyZHRzY2xsKHRoaXNfb2Zmc2V0KTsKLQotCS8qIHJldHVybiB0aGUgdmFsdWUgaW4gbnMgKi8KLQlyZXR1cm4gYmFzZSArIGN5Y2xlc18yX25zKHRoaXNfb2Zmc2V0IC0gbGFzdF9vZmZzZXQpOwotfQotCi0vKgotICogU2NoZWR1bGVyIGNsb2NrIC0gcmV0dXJucyBjdXJyZW50IHRpbWUgaW4gbmFub3NlYyB1bml0cy4KLSAqLwotdW5zaWduZWQgbG9uZyBsb25nIHNjaGVkX2Nsb2NrKHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyBsb25nIHRoaXNfb2Zmc2V0OwotCi0JLyoKLQkgKiBJbiB0aGUgTlVNQSBjYXNlIHdlIGRvbnQgdXNlIHRoZSBUU0MgYXMgdGhleSBhcmUgbm90Ci0JICogc3luY2hyb25pemVkIGFjcm9zcyBhbGwgQ1BVcy4KLQkgKi8KLSNpZm5kZWYgQ09ORklHX05VTUEKLQlpZiAoIXVzZV90c2MpCi0jZW5kaWYKLQkJLyogbm8gbG9ja2luZyBidXQgYSByYXJlIHdyb25nIHZhbHVlIGlzIG5vdCBhIGJpZyBkZWFsICovCi0JCXJldHVybiBqaWZmaWVzXzY0ICogKDEwMDAwMDAwMDAgLyBIWik7Ci0KLQkvKiBSZWFkIHRoZSBUaW1lIFN0YW1wIENvdW50ZXIgKi8KLQlyZHRzY2xsKHRoaXNfb2Zmc2V0KTsKLQotCS8qIHJldHVybiB0aGUgdmFsdWUgaW4gbnMgKi8KLQlyZXR1cm4gY3ljbGVzXzJfbnModGhpc19vZmZzZXQpOwotfQotCi1zdGF0aWMgdm9pZCBkZWxheV90c2ModW5zaWduZWQgbG9uZyBsb29wcykKLXsKLQl1bnNpZ25lZCBsb25nIGJjbG9jaywgbm93OwotCQotCXJkdHNjbChiY2xvY2spOwotCWRvCi0JewotCQlyZXBfbm9wKCk7Ci0JCXJkdHNjbChub3cpOwotCX0gd2hpbGUgKChub3ctYmNsb2NrKSA8IGxvb3BzKTsKLX0KLQotI2lmZGVmIENPTkZJR19IUEVUX1RJTUVSCi1zdGF0aWMgdm9pZCBtYXJrX29mZnNldF90c2NfaHBldCh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgbG9uZyB0aGlzX29mZnNldCwgbGFzdF9vZmZzZXQ7Ci0gCXVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB0ZW1wLCBocGV0X2N1cnJlbnQ7Ci0KLQl3cml0ZV9zZXFsb2NrKCZtb25vdG9uaWNfbG9jayk7Ci0JbGFzdF9vZmZzZXQgPSAoKHVuc2lnbmVkIGxvbmcgbG9uZylsYXN0X3RzY19oaWdoPDwzMil8bGFzdF90c2NfbG93OwotCS8qCi0JICogSXQgaXMgaW1wb3J0YW50IHRoYXQgdGhlc2UgdHdvIG9wZXJhdGlvbnMgaGFwcGVuIGFsbW9zdCBhdAotCSAqIHRoZSBzYW1lIHRpbWUuIFdlIGRvIHRoZSBSRFRTQyBzdHVmZiBmaXJzdCwgc2luY2UgaXQncwotCSAqIGZhc3Rlci4gVG8gYXZvaWQgYW55IGluY29uc2lzdGVuY2llcywgd2UgbmVlZCBpbnRlcnJ1cHRzCi0JICogZGlzYWJsZWQgbG9jYWxseS4KLQkgKi8KLQkvKgotCSAqIEludGVycnVwdHMgYXJlIGp1c3QgZGlzYWJsZWQgbG9jYWxseSBzaW5jZSB0aGUgdGltZXIgaXJxCi0JICogaGFzIHRoZSBTQV9JTlRFUlJVUFQgZmxhZyBzZXQuIC1hcmNhCi0JICovCi0JLyogcmVhZCBQZW50aXVtIGN5Y2xlIGNvdW50ZXIgKi8KLQotCWhwZXRfY3VycmVudCA9IGhwZXRfcmVhZGwoSFBFVF9DT1VOVEVSKTsKLQlyZHRzYyhsYXN0X3RzY19sb3csIGxhc3RfdHNjX2hpZ2gpOwotCi0JLyogbG9zdCB0aWNrIGNvbXBlbnNhdGlvbiAqLwotCW9mZnNldCA9IGhwZXRfcmVhZGwoSFBFVF9UMF9DTVApIC0gaHBldF90aWNrOwotCWlmICh1bmxpa2VseSgoKG9mZnNldCAtIGhwZXRfbGFzdCkgPiBocGV0X3RpY2spICYmIChocGV0X2xhc3QgIT0gMCkpCi0JCQkJCSYmIGRldGVjdF9sb3N0X3RpY2tzKSB7Ci0JCWludCBsb3N0X3RpY2tzID0gKG9mZnNldCAtIGhwZXRfbGFzdCkgLyBocGV0X3RpY2s7Ci0JCWppZmZpZXNfNjQgKz0gbG9zdF90aWNrczsKLQl9Ci0JaHBldF9sYXN0ID0gaHBldF9jdXJyZW50OwotCi0JLyogdXBkYXRlIHRoZSBtb25vdG9uaWMgYmFzZSB2YWx1ZSAqLwotCXRoaXNfb2Zmc2V0ID0gKCh1bnNpZ25lZCBsb25nIGxvbmcpbGFzdF90c2NfaGlnaDw8MzIpfGxhc3RfdHNjX2xvdzsKLQltb25vdG9uaWNfYmFzZSArPSBjeWNsZXNfMl9ucyh0aGlzX29mZnNldCAtIGxhc3Rfb2Zmc2V0KTsKLQl3cml0ZV9zZXF1bmxvY2soJm1vbm90b25pY19sb2NrKTsKLQotCS8qIGNhbGN1bGF0ZSBkZWxheV9hdF9sYXN0X2ludGVycnVwdCAqLwotCS8qCi0JICogVGltZSBvZmZzZXQgPSAoaHBldCBkZWx0YSkgKiAoIHVzZWNzIHBlciBIUEVUIGNsb2NrICkKLQkgKiAgICAgICAgICAgICA9IChocGV0IGRlbHRhKSAqICggdXNlY3MgcGVyIHRpY2sgLyBIUEVUIGNsb2NrcyBwZXIgdGljaykKLQkgKiAgICAgICAgICAgICA9IChocGV0IGRlbHRhKSAqICggaHBldF91c2VjX3F1b3RpZW50ICkgLyAoMl4zMikKLQkgKiBXaGVyZSwKLQkgKiBocGV0X3VzZWNfcXVvdGllbnQgPSAoMl4zMiAqIHVzZWNzIHBlciB0aWNrKS9IUEVUIGNsb2NrcyBwZXIgdGljawotCSAqLwotCWRlbGF5X2F0X2xhc3RfaW50ZXJydXB0ID0gaHBldF9jdXJyZW50IC0gb2Zmc2V0OwotCUFTTV9NVUw2NF9SRUcodGVtcCwgZGVsYXlfYXRfbGFzdF9pbnRlcnJ1cHQsCi0JCQlocGV0X3VzZWNfcXVvdGllbnQsIGRlbGF5X2F0X2xhc3RfaW50ZXJydXB0KTsKLX0KLSNlbmRpZgotCi0KLSNpZmRlZiBDT05GSUdfQ1BVX0ZSRVEKLSNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KLQotc3RhdGljIHVuc2lnbmVkIGludCBjcHVmcmVxX2RlbGF5ZWRfaXNzY2hlZCA9IDA7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGNwdWZyZXFfaW5pdCA9IDA7Ci1zdGF0aWMgc3RydWN0IHdvcmtfc3RydWN0IGNwdWZyZXFfZGVsYXllZF9nZXRfd29yazsKLQotc3RhdGljIHZvaWQgaGFuZGxlX2NwdWZyZXFfZGVsYXllZF9nZXQodm9pZCAqdikKLXsKLQl1bnNpZ25lZCBpbnQgY3B1OwotCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KSB7Ci0JCWNwdWZyZXFfZ2V0KGNwdSk7Ci0JfQotCWNwdWZyZXFfZGVsYXllZF9pc3NjaGVkID0gMDsKLX0KLQotLyogaWYgd2Ugbm90aWNlIGxvc3QgdGlja3MsIHNjaGVkdWxlIGEgY2FsbCB0byBjcHVmcmVxX2dldCgpIGFzIGl0IHRyaWVzCi0gKiB0byB2ZXJpZnkgdGhlIENQVSBmcmVxdWVuY3kgdGhlIHRpbWluZyBjb3JlIHRoaW5rcyB0aGUgQ1BVIGlzIHJ1bm5pbmcKLSAqIGF0IGlzIHN0aWxsIGNvcnJlY3QuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBjcHVmcmVxX2RlbGF5ZWRfZ2V0KHZvaWQpIAotewotCWlmIChjcHVmcmVxX2luaXQgJiYgIWNwdWZyZXFfZGVsYXllZF9pc3NjaGVkKSB7Ci0JCWNwdWZyZXFfZGVsYXllZF9pc3NjaGVkID0gMTsKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkxvc2luZyBzb21lIHRpY2tzLi4uIGNoZWNraW5nIGlmIENQVSBmcmVxdWVuY3kgY2hhbmdlZC5cbiIpOwotCQlzY2hlZHVsZV93b3JrKCZjcHVmcmVxX2RlbGF5ZWRfZ2V0X3dvcmspOwotCX0KLX0KLQotLyogSWYgdGhlIENQVSBmcmVxdWVuY3kgaXMgc2NhbGVkLCBUU0MtYmFzZWQgZGVsYXlzIHdpbGwgbmVlZCBhIGRpZmZlcmVudAotICogbG9vcHNfcGVyX2ppZmZ5IHZhbHVlIHRvIGZ1bmN0aW9uIHByb3Blcmx5LgotICovCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgIHJlZl9mcmVxID0gMDsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGxvb3BzX3Blcl9qaWZmeV9yZWYgPSAwOwotCi0jaWZuZGVmIENPTkZJR19TTVAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGZhc3RfZ2V0dGltZW9mZnNldF9yZWYgPSAwOwotc3RhdGljIHVuc2lnbmVkIGludCBjcHVfa2h6X3JlZiA9IDA7Ci0jZW5kaWYKLQotc3RhdGljIGludAotdGltZV9jcHVmcmVxX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsIHVuc2lnbmVkIGxvbmcgdmFsLAotCQkgICAgICAgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgY3B1ZnJlcV9mcmVxcyAqZnJlcSA9IGRhdGE7Ci0KLQlpZiAodmFsICE9IENQVUZSRVFfUkVTVU1FQ0hBTkdFICYmIHZhbCAhPSBDUFVGUkVRX1NVU1BFTkRDSEFOR0UpCi0JCXdyaXRlX3NlcWxvY2tfaXJxKCZ4dGltZV9sb2NrKTsKLQlpZiAoIXJlZl9mcmVxKSB7Ci0JCWlmICghZnJlcS0+b2xkKXsKLQkJCXJlZl9mcmVxID0gZnJlcS0+bmV3OwotCQkJZ290byBlbmQ7Ci0JCX0KLQkJcmVmX2ZyZXEgPSBmcmVxLT5vbGQ7Ci0JCWxvb3BzX3Blcl9qaWZmeV9yZWYgPSBjcHVfZGF0YVtmcmVxLT5jcHVdLmxvb3BzX3Blcl9qaWZmeTsKLSNpZm5kZWYgQ09ORklHX1NNUAotCQlmYXN0X2dldHRpbWVvZmZzZXRfcmVmID0gZmFzdF9nZXR0aW1lb2Zmc2V0X3F1b3RpZW50OwotCQljcHVfa2h6X3JlZiA9IGNwdV9raHo7Ci0jZW5kaWYKLQl9Ci0KLQlpZiAoKHZhbCA9PSBDUFVGUkVRX1BSRUNIQU5HRSAgJiYgZnJlcS0+b2xkIDwgZnJlcS0+bmV3KSB8fAotCSAgICAodmFsID09IENQVUZSRVFfUE9TVENIQU5HRSAmJiBmcmVxLT5vbGQgPiBmcmVxLT5uZXcpIHx8Ci0JICAgICh2YWwgPT0gQ1BVRlJFUV9SRVNVTUVDSEFOR0UpKSB7Ci0JCWlmICghKGZyZXEtPmZsYWdzICYgQ1BVRlJFUV9DT05TVF9MT09QUykpCi0JCQljcHVfZGF0YVtmcmVxLT5jcHVdLmxvb3BzX3Blcl9qaWZmeSA9IGNwdWZyZXFfc2NhbGUobG9vcHNfcGVyX2ppZmZ5X3JlZiwgcmVmX2ZyZXEsIGZyZXEtPm5ldyk7Ci0jaWZuZGVmIENPTkZJR19TTVAKLQkJaWYgKGNwdV9raHopCi0JCQljcHVfa2h6ID0gY3B1ZnJlcV9zY2FsZShjcHVfa2h6X3JlZiwgcmVmX2ZyZXEsIGZyZXEtPm5ldyk7Ci0JCWlmICh1c2VfdHNjKSB7Ci0JCQlpZiAoIShmcmVxLT5mbGFncyAmIENQVUZSRVFfQ09OU1RfTE9PUFMpKSB7Ci0JCQkJZmFzdF9nZXR0aW1lb2Zmc2V0X3F1b3RpZW50ID0gY3B1ZnJlcV9zY2FsZShmYXN0X2dldHRpbWVvZmZzZXRfcmVmLCBmcmVxLT5uZXcsIHJlZl9mcmVxKTsKLQkJCQlzZXRfY3ljMm5zX3NjYWxlKGNwdV9raHopOwotCQkJfQotCQl9Ci0jZW5kaWYKLQl9Ci0KLWVuZDoKLQlpZiAodmFsICE9IENQVUZSRVFfUkVTVU1FQ0hBTkdFICYmIHZhbCAhPSBDUFVGUkVRX1NVU1BFTkRDSEFOR0UpCi0JCXdyaXRlX3NlcXVubG9ja19pcnEoJnh0aW1lX2xvY2spOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgdGltZV9jcHVmcmVxX25vdGlmaWVyX2Jsb2NrID0gewotCS5ub3RpZmllcl9jYWxsCT0gdGltZV9jcHVmcmVxX25vdGlmaWVyCi19OwotCi0KLXN0YXRpYyBpbnQgX19pbml0IGNwdWZyZXFfdHNjKHZvaWQpCi17Ci0JaW50IHJldDsKLQlJTklUX1dPUksoJmNwdWZyZXFfZGVsYXllZF9nZXRfd29yaywgaGFuZGxlX2NwdWZyZXFfZGVsYXllZF9nZXQsIE5VTEwpOwotCXJldCA9IGNwdWZyZXFfcmVnaXN0ZXJfbm90aWZpZXIoJnRpbWVfY3B1ZnJlcV9ub3RpZmllcl9ibG9jaywKLQkJCQkJQ1BVRlJFUV9UUkFOU0lUSU9OX05PVElGSUVSKTsKLQlpZiAoIXJldCkKLQkJY3B1ZnJlcV9pbml0ID0gMTsKLQlyZXR1cm4gcmV0OwotfQotY29yZV9pbml0Y2FsbChjcHVmcmVxX3RzYyk7Ci0KLSNlbHNlIC8qIENPTkZJR19DUFVfRlJFUSAqLwotc3RhdGljIGlubGluZSB2b2lkIGNwdWZyZXFfZGVsYXllZF9nZXQodm9pZCkgeyByZXR1cm47IH0KLSNlbmRpZiAKLQotaW50IHJlY2FsaWJyYXRlX2NwdV9raHoodm9pZCkKLXsKLSNpZm5kZWYgQ09ORklHX1NNUAotCXVuc2lnbmVkIGludCBjcHVfa2h6X29sZCA9IGNwdV9raHo7Ci0KLQlpZiAoY3B1X2hhc190c2MpIHsKLQkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKLQkJaW5pdF9jcHVfa2h6KCk7Ci0JCWxvY2FsX2lycV9lbmFibGUoKTsKLQkJY3B1X2RhdGFbMF0ubG9vcHNfcGVyX2ppZmZ5ID0KLQkJICAgIGNwdWZyZXFfc2NhbGUoY3B1X2RhdGFbMF0ubG9vcHNfcGVyX2ppZmZ5LAotCQkJICAgICAgICAgIGNwdV9raHpfb2xkLAotCQkJCSAgY3B1X2toeik7Ci0JCXJldHVybiAwOwotCX0gZWxzZQotCQlyZXR1cm4gLUVOT0RFVjsKLSNlbHNlCi0JcmV0dXJuIC1FTk9ERVY7Ci0jZW5kaWYKLX0KLUVYUE9SVF9TWU1CT0wocmVjYWxpYnJhdGVfY3B1X2toeik7Ci0KLXN0YXRpYyB2b2lkIG1hcmtfb2Zmc2V0X3RzYyh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgbG9zdCxkZWxheTsKLQl1bnNpZ25lZCBsb25nIGRlbHRhID0gbGFzdF90c2NfbG93OwotCWludCBjb3VudDsKLQlpbnQgY291bnRtcDsKLQlzdGF0aWMgaW50IGNvdW50MSA9IDA7Ci0JdW5zaWduZWQgbG9uZyBsb25nIHRoaXNfb2Zmc2V0LCBsYXN0X29mZnNldDsKLQlzdGF0aWMgaW50IGxvc3RfY291bnQgPSAwOwotCi0Jd3JpdGVfc2VxbG9jaygmbW9ub3RvbmljX2xvY2spOwotCWxhc3Rfb2Zmc2V0ID0gKCh1bnNpZ25lZCBsb25nIGxvbmcpbGFzdF90c2NfaGlnaDw8MzIpfGxhc3RfdHNjX2xvdzsKLQkvKgotCSAqIEl0IGlzIGltcG9ydGFudCB0aGF0IHRoZXNlIHR3byBvcGVyYXRpb25zIGhhcHBlbiBhbG1vc3QgYXQKLQkgKiB0aGUgc2FtZSB0aW1lLiBXZSBkbyB0aGUgUkRUU0Mgc3R1ZmYgZmlyc3QsIHNpbmNlIGl0J3MKLQkgKiBmYXN0ZXIuIFRvIGF2b2lkIGFueSBpbmNvbnNpc3RlbmNpZXMsIHdlIG5lZWQgaW50ZXJydXB0cwotCSAqIGRpc2FibGVkIGxvY2FsbHkuCi0JICovCi0KLQkvKgotCSAqIEludGVycnVwdHMgYXJlIGp1c3QgZGlzYWJsZWQgbG9jYWxseSBzaW5jZSB0aGUgdGltZXIgaXJxCi0JICogaGFzIHRoZSBTQV9JTlRFUlJVUFQgZmxhZyBzZXQuIC1hcmNhCi0JICovCi0KLQkvKiByZWFkIFBlbnRpdW0gY3ljbGUgY291bnRlciAqLwotCi0JcmR0c2MobGFzdF90c2NfbG93LCBsYXN0X3RzY19oaWdoKTsKLQotCXNwaW5fbG9jaygmaTgyNTNfbG9jayk7Ci0Jb3V0Yl9wKDB4MDAsIFBJVF9NT0RFKTsgICAgIC8qIGxhdGNoIHRoZSBjb3VudCBBU0FQICovCi0KLQljb3VudCA9IGluYl9wKFBJVF9DSDApOyAgICAvKiByZWFkIHRoZSBsYXRjaGVkIGNvdW50ICovCi0JY291bnQgfD0gaW5iKFBJVF9DSDApIDw8IDg7Ci0KLQkvKgotCSAqIFZJQTY4NmEgdGVzdCBjb2RlLi4uIHJlc2V0IHRoZSBsYXRjaCBpZiBjb3VudCA+IG1heCArIDEKLQkgKiBmcm9tIHRpbWVyX3BpdC5jIC0gY2piCi0JICovCi0JaWYgKGNvdW50ID4gTEFUQ0gpIHsKLQkJb3V0Yl9wKDB4MzQsIFBJVF9NT0RFKTsKLQkJb3V0Yl9wKExBVENIICYgMHhmZiwgUElUX0NIMCk7Ci0JCW91dGIoTEFUQ0ggPj4gOCwgUElUX0NIMCk7Ci0JCWNvdW50ID0gTEFUQ0ggLSAxOwotCX0KLQotCXNwaW5fdW5sb2NrKCZpODI1M19sb2NrKTsKLQotCWlmIChwaXRfbGF0Y2hfYnVnZ3kpIHsKLQkJLyogZ2V0IGNlbnRlciB2YWx1ZSBvZiBsYXN0IDMgdGltZSBsdXRjaCAqLwotCQlpZiAoKGNvdW50MiA+PSBjb3VudCAmJiBjb3VudCA+PSBjb3VudDEpCi0JCSAgICB8fCAoY291bnQxID49IGNvdW50ICYmIGNvdW50ID49IGNvdW50MikpIHsKLQkJCWNvdW50MiA9IGNvdW50MTsgY291bnQxID0gY291bnQ7Ci0JCX0gZWxzZSBpZiAoKGNvdW50MSA+PSBjb3VudDIgJiYgY291bnQyID49IGNvdW50KQotCQkJICAgfHwgKGNvdW50ID49IGNvdW50MiAmJiBjb3VudDIgPj0gY291bnQxKSkgewotCQkJY291bnRtcCA9IGNvdW50O2NvdW50ID0gY291bnQyOwotCQkJY291bnQyID0gY291bnQxO2NvdW50MSA9IGNvdW50bXA7Ci0JCX0gZWxzZSB7Ci0JCQljb3VudDIgPSBjb3VudDE7IGNvdW50MSA9IGNvdW50OyBjb3VudCA9IGNvdW50MTsKLQkJfQotCX0KLQotCS8qIGxvc3QgdGljayBjb21wZW5zYXRpb24gKi8KLQlkZWx0YSA9IGxhc3RfdHNjX2xvdyAtIGRlbHRhOwotCXsKLQkJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBlYXgsIGVkeDsKLQkJZWF4ID0gZGVsdGE7Ci0JCV9fYXNtX18oIm11bGwgJTIiCi0JCToiPWEiIChlYXgpLCAiPWQiIChlZHgpCi0JCToicm0iIChmYXN0X2dldHRpbWVvZmZzZXRfcXVvdGllbnQpLAotCQkgIjAiIChlYXgpKTsKLQkJZGVsdGEgPSBlZHg7Ci0JfQotCWRlbHRhICs9IGRlbGF5X2F0X2xhc3RfaW50ZXJydXB0OwotCWxvc3QgPSBkZWx0YS8oMTAwMDAwMC9IWik7Ci0JZGVsYXkgPSBkZWx0YSUoMTAwMDAwMC9IWik7Ci0JaWYgKGxvc3QgPj0gMiAmJiBkZXRlY3RfbG9zdF90aWNrcykgewotCQlqaWZmaWVzXzY0ICs9IGxvc3QtMTsKLQotCQkvKiBzYW5pdHkgY2hlY2sgdG8gZW5zdXJlIHdlJ3JlIG5vdCBhbHdheXMgbG9zaW5nIHRpY2tzICovCi0JCWlmIChsb3N0X2NvdW50KysgPiAxMDApIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkxvc2luZyB0b28gbWFueSB0aWNrcyFcbiIpOwotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiVFNDIGNhbm5vdCBiZSB1c2VkIGFzIGEgdGltZXNvdXJjZS4gIFxuIik7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJQb3NzaWJsZSByZWFzb25zIGZvciB0aGlzIGFyZTpcbiIpOwotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiICBZb3UncmUgcnVubmluZyB3aXRoIFNwZWVkc3RlcCxcbiIpOwotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiICBZb3UgZG9uJ3QgaGF2ZSBETUEgZW5hYmxlZCBmb3IgeW91ciBoYXJkIGRpc2sgKHNlZSBoZHBhcm0pLFxuIik7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICIgIEluY29ycmVjdCBUU0Mgc3luY2hyb25pemF0aW9uIG9uIGFuIFNNUCBzeXN0ZW0gKHNlZSBkbWVzZykuXG4iKTsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkZhbGxpbmcgYmFjayB0byBhIHNhbmUgdGltZXNvdXJjZSBub3cuXG4iKTsKLQotCQkJY2xvY2tfZmFsbGJhY2soKTsKLQkJfQotCQkvKiAuLi4gYnV0IGdpdmUgdGhlIFRTQyBhIGZhaXIgY2hhbmNlICovCi0JCWlmIChsb3N0X2NvdW50ID4gMjUpCi0JCQljcHVmcmVxX2RlbGF5ZWRfZ2V0KCk7Ci0JfSBlbHNlCi0JCWxvc3RfY291bnQgPSAwOwotCS8qIHVwZGF0ZSB0aGUgbW9ub3RvbmljIGJhc2UgdmFsdWUgKi8KLQl0aGlzX29mZnNldCA9ICgodW5zaWduZWQgbG9uZyBsb25nKWxhc3RfdHNjX2hpZ2g8PDMyKXxsYXN0X3RzY19sb3c7Ci0JbW9ub3RvbmljX2Jhc2UgKz0gY3ljbGVzXzJfbnModGhpc19vZmZzZXQgLSBsYXN0X29mZnNldCk7Ci0Jd3JpdGVfc2VxdW5sb2NrKCZtb25vdG9uaWNfbG9jayk7Ci0KLQkvKiBjYWxjdWxhdGUgZGVsYXlfYXRfbGFzdF9pbnRlcnJ1cHQgKi8KLQljb3VudCA9ICgoTEFUQ0gtMSkgLSBjb3VudCkgKiBUSUNLX1NJWkU7Ci0JZGVsYXlfYXRfbGFzdF9pbnRlcnJ1cHQgPSAoY291bnQgKyBMQVRDSC8yKSAvIExBVENIOwotCi0JLyogY2F0Y2ggY29ybmVyIGNhc2Ugd2hlcmUgdGljayByb2xsb3ZlciBvY2N1cmVkCi0JICogYmV0d2VlbiB0c2MgYW5kIHBpdCByZWFkcyAoYXMgbm90ZWQgd2hlbgotCSAqIHVzZWMgZGVsdGEgaXMgPiA5MCUgIyBvZiB1c2Vjcy90aWNrKQotCSAqLwotCWlmIChsb3N0ICYmIGFicyhkZWxheSAtIGRlbGF5X2F0X2xhc3RfaW50ZXJydXB0KSA+ICg5MDAwMDAvSFopKQotCQlqaWZmaWVzXzY0Kys7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IGluaXRfdHNjKGNoYXIqIG92ZXJyaWRlKQotewotCi0JLyogY2hlY2sgY2xvY2sgb3ZlcnJpZGUgKi8KLQlpZiAob3ZlcnJpZGVbMF0gJiYgc3RybmNtcChvdmVycmlkZSwidHNjIiwzKSkgewotI2lmZGVmIENPTkZJR19IUEVUX1RJTUVSCi0JCWlmIChpc19ocGV0X2VuYWJsZWQoKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJXYXJuaW5nOiBjbG9jaz0gb3ZlcnJpZGUgZmFpbGVkLiBEZWZhdWx0aW5nIHRvIHRzY1xuIik7Ci0JCX0gZWxzZQotI2VuZGlmCi0JCXsKLQkJCXJldHVybiAtRU5PREVWOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBJZiB3ZSBoYXZlIEFQTSBlbmFibGVkIG9yIHRoZSBDUFUgY2xvY2sgc3BlZWQgaXMgdmFyaWFibGUKLQkgKiAoQ1BVIHN0b3BzIGNsb2NrIG9uIEhMVCBvciBzbG93cyBjbG9jayB0byBzYXZlIHBvd2VyKQotCSAqIHRoZW4gdGhlIFRTQyB0aW1lc3RhbXBzIG1heSBkaXZlcmdlIGJ5IHVwIHRvIDEgamlmZnkgZnJvbQotCSAqICdyZWFsIHRpbWUnIGJ1dCBub3RoaW5nIHdpbGwgYnJlYWsuCi0JICogVGhlIG1vc3QgZnJlcXVlbnQgY2FzZSBpcyB0aGF0IHRoZSBDUFUgaXMgIndva2VuIiBmcm9tIGEgaGFsdAotCSAqIHN0YXRlIGJ5IHRoZSB0aW1lciBpbnRlcnJ1cHQgaXRzZWxmLCBzbyB3ZSBnZXQgMCBlcnJvci4gSW4gdGhlCi0JICogcmFyZSBjYXNlcyB3aGVyZSBhIGRyaXZlciB3b3VsZCAid2FrZSIgdGhlIENQVSBhbmQgcmVxdWVzdCBhCi0JICogdGltZXN0YW1wLCB0aGUgbWF4aW11bSBlcnJvciBpcyA8IDEgamlmZnkuIEJ1dCB0aW1lc3RhbXBzIGFyZQotCSAqIHN0aWxsIHBlcmZlY3RseSBvcmRlcmVkLgotCSAqIE5vdGUgdGhhdCB0aGUgVFNDIGNvdW50ZXIgd2lsbCBiZSByZXNldCBpZiBBUE0gc3VzcGVuZHMKLQkgKiB0byBkaXNrOyB0aGlzIHdvbid0IGJyZWFrIHRoZSBrZXJuZWwsIHRob3VnaCwgJ2N1eiB3ZSdyZQotCSAqIHNtYXJ0LiAgU2VlIGFyY2gvaTM4Ni9rZXJuZWwvYXBtLmMuCi0JICovCi0gCS8qCi0gCSAqCUZpcnN0bHkgd2UgaGF2ZSB0byBkbyBhIENQVSBjaGVjayBmb3IgY2hpcHMgd2l0aAotIAkgKiAJYSBwb3RlbnRpYWxseSBidWdneSBUU0MuIEF0IHRoaXMgcG9pbnQgd2UgaGF2ZW4ndCBydW4KLSAJICoJdGhlIGlkZW50L2J1Z3MgY2hlY2tzIHNvIHdlIG11c3QgcnVuIHRoaXMgaG9vayBhcyBpdAotIAkgKgltYXkgdHVybiBvZmYgdGhlIFRTQyBmbGFnLgotIAkgKgotIAkgKglOT1RFOiB0aGlzIGRvZXNuJ3QgeWV0IGhhbmRsZSBTTVAgNDg2IG1hY2hpbmVzIHdoZXJlIG9ubHkKLSAJICoJc29tZSBDUFUncyBoYXZlIGEgVFNDLiBUaGF0cyBuZXZlciB3b3JrZWQgYW5kIG5vYm9keSBoYXMKLSAJICoJbW9hbmVkIGlmIHlvdSBoYXZlIHRoZSBvbmx5IG9uZSBpbiB0aGUgd29ybGQgLSB5b3UgZml4IGl0IQotIAkgKi8KLQotCWNvdW50MiA9IExBVENIOyAvKiBpbml0aWFsaXplIGNvdW50ZXIgZm9yIG1hcmtfb2Zmc2V0X3RzYygpICovCi0KLQlpZiAoY3B1X2hhc190c2MpIHsKLQkJdW5zaWduZWQgbG9uZyB0c2NfcXVvdGllbnQ7Ci0jaWZkZWYgQ09ORklHX0hQRVRfVElNRVIKLQkJaWYgKGlzX2hwZXRfZW5hYmxlZCgpICYmIGhwZXRfdXNlX3RpbWVyKSB7Ci0JCQl1bnNpZ25lZCBsb25nIHJlc3VsdCwgcmVtYWluOwotCQkJcHJpbnRrKCJVc2luZyBUU0MgZm9yIGdldHRpbWVvZmRheVxuIik7Ci0JCQl0c2NfcXVvdGllbnQgPSBjYWxpYnJhdGVfdHNjX2hwZXQoTlVMTCk7Ci0JCQl0aW1lcl90c2MubWFya19vZmZzZXQgPSAmbWFya19vZmZzZXRfdHNjX2hwZXQ7Ci0JCQkvKgotCQkJICogTWF0aCB0byBjYWxjdWxhdGUgaHBldCB0byB1c2VjIG11bHRpcGxpZXIKLQkJCSAqIExvb2sgZm9yIHRoZSBjb21tZW50cyBhdCBnZXRfb2Zmc2V0X3RzY19ocGV0KCkKLQkJCSAqLwotCQkJQVNNX0RJVjY0X1JFRyhyZXN1bHQsIHJlbWFpbiwgaHBldF90aWNrLAotCQkJCQkwLCBLRVJORUxfVElDS19VU0VDKTsKLQkJCWlmIChyZW1haW4gPiAoaHBldF90aWNrID4+IDEpKQotCQkJCXJlc3VsdCsrOyAvKiByb3VuZGluZyB0aGUgcmVzdWx0ICovCi0KLQkJCWhwZXRfdXNlY19xdW90aWVudCA9IHJlc3VsdDsKLQkJfSBlbHNlCi0jZW5kaWYKLQkJewotCQkJdHNjX3F1b3RpZW50ID0gY2FsaWJyYXRlX3RzYygpOwotCQl9Ci0KLQkJaWYgKHRzY19xdW90aWVudCkgewotCQkJZmFzdF9nZXR0aW1lb2Zmc2V0X3F1b3RpZW50ID0gdHNjX3F1b3RpZW50OwotCQkJdXNlX3RzYyA9IDE7Ci0JCQkvKgotCQkJICoJV2UgY291bGQgYmUgbW9yZSBzZWxlY3RpdmUgaGVyZSBJIHN1c3BlY3QKLQkJCSAqCWFuZCBqdXN0IGVuYWJsZSB0aGlzIGZvciB0aGUgbmV4dCBpbnRlbCBjaGlwcyA/Ci0JCQkgKi8KLQkJCS8qIHJlcG9ydCBDUFUgY2xvY2sgcmF0ZSBpbiBIei4KLQkJCSAqIFRoZSBmb3JtdWxhIGlzICgxMF42ICogMl4zMikgLyAoMl4zMiAqIDEgLyAoY2xvY2tzL3VzKSkgPQotCQkJICogY2xvY2svc2Vjb25kLiBPdXIgcHJlY2lzaW9uIGlzIGFib3V0IDEwMCBwcG0uCi0JCQkgKi8KLQkJCXsJdW5zaWduZWQgbG9uZyBlYXg9MCwgZWR4PTEwMDA7Ci0JCQkJX19hc21fXygiZGl2bCAlMiIKLQkJICAgICAgIAkJOiI9YSIgKGNwdV9raHopLCAiPWQiIChlZHgpCi0gICAgICAgIAkgICAgICAgCQk6InIiICh0c2NfcXVvdGllbnQpLAotCSAgICAgICAgICAgICAgICAJIjAiIChlYXgpLCAiMSIgKGVkeCkpOwotCQkJCXByaW50aygiRGV0ZWN0ZWQgJXUuJTAzdSBNSHogcHJvY2Vzc29yLlxuIiwKLQkJCQkJY3B1X2toeiAvIDEwMDAsIGNwdV9raHogJSAxMDAwKTsKLQkJCX0KLQkJCXNldF9jeWMybnNfc2NhbGUoY3B1X2toeik7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQlyZXR1cm4gLUVOT0RFVjsKLX0KLQotc3RhdGljIGludCB0c2NfcmVzdW1lKHZvaWQpCi17Ci0Jd3JpdGVfc2VxbG9jaygmbW9ub3RvbmljX2xvY2spOwotCS8qIEFzc3VtZSB0aGlzIGlzIHRoZSBsYXN0IG1hcmsgb2Zmc2V0IHRpbWUgKi8KLQlyZHRzYyhsYXN0X3RzY19sb3csIGxhc3RfdHNjX2hpZ2gpOwotI2lmZGVmIENPTkZJR19IUEVUX1RJTUVSCi0JaWYgKGlzX2hwZXRfZW5hYmxlZCgpICYmIGhwZXRfdXNlX3RpbWVyKQotCQlocGV0X2xhc3QgPSBocGV0X3JlYWRsKEhQRVRfQ09VTlRFUik7Ci0jZW5kaWYKLQl3cml0ZV9zZXF1bmxvY2soJm1vbm90b25pY19sb2NrKTsKLQlyZXR1cm4gMDsKLX0KLQotI2lmbmRlZiBDT05GSUdfWDg2X1RTQwotLyogZGlzYWJsZSBmbGFnIGZvciB0c2MuICBUYWtlcyBlZmZlY3QgYnkgY2xlYXJpbmcgdGhlIFRTQyBjcHUgZmxhZwotICogaW4gY3B1L2NvbW1vbi5jICovCi1zdGF0aWMgaW50IF9faW5pdCB0c2Nfc2V0dXAoY2hhciAqc3RyKQotewotCXRzY19kaXNhYmxlID0gMTsKLQlyZXR1cm4gMTsKLX0KLSNlbHNlCi1zdGF0aWMgaW50IF9faW5pdCB0c2Nfc2V0dXAoY2hhciAqc3RyKQotewotCXByaW50ayhLRVJOX1dBUk5JTkcgIm5vdHNjOiBLZXJuZWwgY29tcGlsZWQgd2l0aCBDT05GSUdfWDg2X1RTQywgIgotCQkJCSJjYW5ub3QgZGlzYWJsZSBUU0MuXG4iKTsKLQlyZXR1cm4gMTsKLX0KLSNlbmRpZgotX19zZXR1cCgibm90c2MiLCB0c2Nfc2V0dXApOwotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogdHNjIHRpbWVyX29wdHMgc3RydWN0ICovCi1zdGF0aWMgc3RydWN0IHRpbWVyX29wdHMgdGltZXJfdHNjID0gewotCS5uYW1lID0gInRzYyIsCi0JLm1hcmtfb2Zmc2V0ID0gbWFya19vZmZzZXRfdHNjLCAKLQkuZ2V0X29mZnNldCA9IGdldF9vZmZzZXRfdHNjLAotCS5tb25vdG9uaWNfY2xvY2sgPSBtb25vdG9uaWNfY2xvY2tfdHNjLAotCS5kZWxheSA9IGRlbGF5X3RzYywKLQkucmVhZF90aW1lciA9IHJlYWRfdGltZXJfdHNjLAotCS5yZXN1bWUJPSB0c2NfcmVzdW1lLAotfTsKLQotc3RydWN0IGluaXRfdGltZXJfb3B0cyBfX2luaXRkYXRhIHRpbWVyX3RzY19pbml0ID0gewotCS5pbml0ID0gaW5pdF90c2MsCi0JLm9wdHMgPSAmdGltZXJfdHNjLAotfTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvdHJhcHMuYwppbmRleCBkY2MxNDQ3Li43ODQ2NDA5IDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC90cmFwcy5jCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgogI2luY2x1ZGUgPGxpbnV4L2twcm9iZXMuaD4KICNpbmNsdWRlIDxsaW51eC9rZXhlYy5oPgorI2luY2x1ZGUgPGxpbnV4L3Vud2luZC5oPgogCiAjaWZkZWYgQ09ORklHX0VJU0EKICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KQEAgLTQ3LDcgKzQ4LDcgQEAKICNpbmNsdWRlIDxhc20vZGVzYy5oPgogI2luY2x1ZGUgPGFzbS9pMzg3Lmg+CiAjaW5jbHVkZSA8YXNtL25taS5oPgotCisjaW5jbHVkZSA8YXNtL3Vud2luZC5oPgogI2luY2x1ZGUgPGFzbS9zbXAuaD4KICNpbmNsdWRlIDxhc20vYXJjaF9ob29rcy5oPgogI2luY2x1ZGUgPGFzbS9rZGVidWcuaD4KQEAgLTkyLDYgKzkzLDcgQEAKIGFzbWxpbmthZ2Ugdm9pZCBtYWNoaW5lX2NoZWNrKHZvaWQpOwogCiBzdGF0aWMgaW50IGtzdGFja19kZXB0aF90b19wcmludCA9IDI0Oworc3RhdGljIGludCBjYWxsX3RyYWNlID0gMTsKIEFUT01JQ19OT1RJRklFUl9IRUFEKGkzODZkaWVfY2hhaW4pOwogCiBpbnQgcmVnaXN0ZXJfZGllX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpCkBAIC0xNzAsNyArMTcyLDIzIEBACiAJcmV0dXJuIGVicDsKIH0KIAotc3RhdGljIHZvaWQgc2hvd190cmFjZV9sb2dfbHZsKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKK3N0YXRpYyBhc21saW5rYWdlIGludCBzaG93X3RyYWNlX3Vud2luZChzdHJ1Y3QgdW53aW5kX2ZyYW1lX2luZm8gKmluZm8sIHZvaWQgKmxvZ19sdmwpCit7CisJaW50IG4gPSAwOworCWludCBwcmludGVkID0gMDsgLyogbnIgb2YgZW50cmllcyBhbHJlYWR5IHByaW50ZWQgb24gY3VycmVudCBsaW5lICovCisKKwl3aGlsZSAodW53aW5kKGluZm8pID09IDAgJiYgVU5XX1BDKGluZm8pKSB7CisJCSsrbjsKKwkJcHJpbnRlZCA9IHByaW50X2FkZHJfYW5kX3N5bWJvbChVTldfUEMoaW5mbyksIGxvZ19sdmwsIHByaW50ZWQpOworCQlpZiAoYXJjaF91bndfdXNlcl9tb2RlKGluZm8pKQorCQkJYnJlYWs7CisJfQorCWlmIChwcmludGVkKQorCQlwcmludGsoIlxuIik7CisJcmV0dXJuIG47Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfdHJhY2VfbG9nX2x2bChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHN0cnVjdCBwdF9yZWdzICpyZWdzLAogCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgKnN0YWNrLCBjaGFyICpsb2dfbHZsKQogewogCXVuc2lnbmVkIGxvbmcgZWJwOwpAQCAtMTc4LDYgKzE5NiwyNiBAQAogCWlmICghdGFzaykKIAkJdGFzayA9IGN1cnJlbnQ7CiAKKwlpZiAoY2FsbF90cmFjZSA+PSAwKSB7CisJCWludCB1bndfcmV0ID0gMDsKKwkJc3RydWN0IHVud2luZF9mcmFtZV9pbmZvIGluZm87CisKKwkJaWYgKHJlZ3MpIHsKKwkJCWlmICh1bndpbmRfaW5pdF9mcmFtZV9pbmZvKCZpbmZvLCB0YXNrLCByZWdzKSA9PSAwKQorCQkJCXVud19yZXQgPSBzaG93X3RyYWNlX3Vud2luZCgmaW5mbywgbG9nX2x2bCk7CisJCX0gZWxzZSBpZiAodGFzayA9PSBjdXJyZW50KQorCQkJdW53X3JldCA9IHVud2luZF9pbml0X3J1bm5pbmcoJmluZm8sIHNob3dfdHJhY2VfdW53aW5kLCBsb2dfbHZsKTsKKwkJZWxzZSB7CisJCQlpZiAodW53aW5kX2luaXRfYmxvY2tlZCgmaW5mbywgdGFzaykgPT0gMCkKKwkJCQl1bndfcmV0ID0gc2hvd190cmFjZV91bndpbmQoJmluZm8sIGxvZ19sdmwpOworCQl9CisJCWlmICh1bndfcmV0ID4gMCkgeworCQkJaWYgKGNhbGxfdHJhY2UgPiAwKQorCQkJCXJldHVybjsKKwkJCXByaW50aygiJXNMZWdhY3kgY2FsbCB0cmFjZTpcbiIsIGxvZ19sdmwpOworCQl9CisJfQorCiAJaWYgKHRhc2sgPT0gY3VycmVudCkgewogCQkvKiBHcmFiIGVicCByaWdodCBmcm9tIG91ciByZWdzICovCiAJCWFzbSAoIm1vdmwgJSVlYnAsICUwIiA6ICI9ciIgKGVicCkgOiApOwpAQCAtMTk4LDEzICsyMzYsMTMgQEAKIAl9CiB9CiAKLXZvaWQgc2hvd190cmFjZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHVuc2lnbmVkIGxvbmcgKiBzdGFjaykKK3ZvaWQgc2hvd190cmFjZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBsb25nICogc3RhY2spCiB7Ci0Jc2hvd190cmFjZV9sb2dfbHZsKHRhc2ssIHN0YWNrLCAiIik7CisJc2hvd190cmFjZV9sb2dfbHZsKHRhc2ssIHJlZ3MsIHN0YWNrLCAiIik7CiB9CiAKLXN0YXRpYyB2b2lkIHNob3dfc3RhY2tfbG9nX2x2bChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHVuc2lnbmVkIGxvbmcgKmVzcCwKLQkJCSAgICAgICBjaGFyICpsb2dfbHZsKQorc3RhdGljIHZvaWQgc2hvd19zdGFja19sb2dfbHZsKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyAqZXNwLCBjaGFyICpsb2dfbHZsKQogewogCXVuc2lnbmVkIGxvbmcgKnN0YWNrOwogCWludCBpOwpAQCAtMjI1LDEzICsyNjMsMTMgQEAKIAkJcHJpbnRrKCIlMDhseCAiLCAqc3RhY2srKyk7CiAJfQogCXByaW50aygiXG4lc0NhbGwgVHJhY2U6XG4iLCBsb2dfbHZsKTsKLQlzaG93X3RyYWNlX2xvZ19sdmwodGFzaywgZXNwLCBsb2dfbHZsKTsKKwlzaG93X3RyYWNlX2xvZ19sdmwodGFzaywgcmVncywgZXNwLCBsb2dfbHZsKTsKIH0KIAogdm9pZCBzaG93X3N0YWNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgdW5zaWduZWQgbG9uZyAqZXNwKQogewogCXByaW50aygiICAgICAgICIpOwotCXNob3dfc3RhY2tfbG9nX2x2bCh0YXNrLCBlc3AsICIiKTsKKwlzaG93X3N0YWNrX2xvZ19sdmwodGFzaywgTlVMTCwgZXNwLCAiIik7CiB9CiAKIC8qCkBAIC0yNDEsNyArMjc5LDcgQEAKIHsKIAl1bnNpZ25lZCBsb25nIHN0YWNrOwogCi0Jc2hvd190cmFjZShjdXJyZW50LCAmc3RhY2spOworCXNob3dfdHJhY2UoY3VycmVudCwgTlVMTCwgJnN0YWNrKTsKIH0KIAogRVhQT1JUX1NZTUJPTChkdW1wX3N0YWNrKTsKQEAgLTI4NSw3ICszMjMsNyBAQAogCQl1OCBfX3VzZXIgKmVpcDsKIAogCQlwcmludGsoIlxuIiBLRVJOX0VNRVJHICJTdGFjazogIik7Ci0JCXNob3dfc3RhY2tfbG9nX2x2bChOVUxMLCAodW5zaWduZWQgbG9uZyAqKWVzcCwgS0VSTl9FTUVSRyk7CisJCXNob3dfc3RhY2tfbG9nX2x2bChOVUxMLCByZWdzLCAodW5zaWduZWQgbG9uZyAqKWVzcCwgS0VSTl9FTUVSRyk7CiAKIAkJcHJpbnRrKEtFUk5fRU1FUkcgIkNvZGU6ICIpOwogCkBAIC0xMjE1LDMgKzEyNTMsMTUgQEAKIAlyZXR1cm4gMTsKIH0KIF9fc2V0dXAoImtzdGFjaz0iLCBrc3RhY2tfc2V0dXApOworCitzdGF0aWMgaW50IF9faW5pdCBjYWxsX3RyYWNlX3NldHVwKGNoYXIgKnMpCit7CisJaWYgKHN0cmNtcChzLCAib2xkIikgPT0gMCkKKwkJY2FsbF90cmFjZSA9IC0xOworCWVsc2UgaWYgKHN0cmNtcChzLCAiYm90aCIpID09IDApCisJCWNhbGxfdHJhY2UgPSAwOworCWVsc2UgaWYgKHN0cmNtcChzLCAibmV3IikgPT0gMCkKKwkJY2FsbF90cmFjZSA9IDE7CisJcmV0dXJuIDE7Cit9CitfX3NldHVwKCJjYWxsX3RyYWNlPSIsIGNhbGxfdHJhY2Vfc2V0dXApOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC90c2MuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvdHNjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2UwZDhkYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvdHNjLmMKQEAgLTAsMCArMSw0NzggQEAKKy8qCisgKiBUaGlzIGNvZGUgbGFyZ2VseSBtb3ZlZCBmcm9tIGFyY2gvaTM4Ni9rZXJuZWwvdGltZXIvdGltZXJfdHNjLmMKKyAqIHdoaWNoIHdhcyBvcmlnaW5hbGx5IG1vdmVkIGZyb20gYXJjaC9pMzg2L2tlcm5lbC90aW1lLmMuCisgKiBTZWUgY29tbWVudHMgdGhlcmUgZm9yIHByb3BlciBjcmVkaXRzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jbG9ja3NvdXJjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdWZyZXEuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgorCisjaW5jbHVkZSA8YXNtL2RlbGF5Lmg+CisjaW5jbHVkZSA8YXNtL3RzYy5oPgorI2luY2x1ZGUgPGFzbS9kZWxheS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSAibWFjaF90aW1lci5oIgorCisvKgorICogT24gc29tZSBzeXN0ZW1zIHRoZSBUU0MgZnJlcXVlbmN5IGRvZXMgbm90CisgKiBjaGFuZ2Ugd2l0aCB0aGUgY3B1IGZyZXF1ZW5jeS4gU28gd2UgbmVlZAorICogYW4gZXh0cmEgdmFsdWUgdG8gc3RvcmUgdGhlIFRTQyBmcmVxCisgKi8KK3Vuc2lnbmVkIGludCB0c2Nfa2h6OworCitpbnQgdHNjX2Rpc2FibGUgX19jcHVpbml0ZGF0YSA9IDA7CisKKyNpZmRlZiBDT05GSUdfWDg2X1RTQworc3RhdGljIGludCBfX2luaXQgdHNjX3NldHVwKGNoYXIgKnN0cikKK3sKKwlwcmludGsoS0VSTl9XQVJOSU5HICJub3RzYzogS2VybmVsIGNvbXBpbGVkIHdpdGggQ09ORklHX1g4Nl9UU0MsICIKKwkJCQkiY2Fubm90IGRpc2FibGUgVFNDLlxuIik7CisJcmV0dXJuIDE7Cit9CisjZWxzZQorLyoKKyAqIGRpc2FibGUgZmxhZyBmb3IgdHNjLiBUYWtlcyBlZmZlY3QgYnkgY2xlYXJpbmcgdGhlIFRTQyBjcHUgZmxhZworICogaW4gY3B1L2NvbW1vbi5jCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHRzY19zZXR1cChjaGFyICpzdHIpCit7CisJdHNjX2Rpc2FibGUgPSAxOworCisJcmV0dXJuIDE7Cit9CisjZW5kaWYKKworX19zZXR1cCgibm90c2MiLCB0c2Nfc2V0dXApOworCisvKgorICogY29kZSB0byBtYXJrIGFuZCBjaGVjayBpZiB0aGUgVFNDIGlzIHVuc3RhYmxlCisgKiBkdWUgdG8gY3B1ZnJlcSBvciBkdWUgdG8gdW5zeW5jZWQgVFNDcworICovCitzdGF0aWMgaW50IHRzY191bnN0YWJsZTsKKworc3RhdGljIGlubGluZSBpbnQgY2hlY2tfdHNjX3Vuc3RhYmxlKHZvaWQpCit7CisJcmV0dXJuIHRzY191bnN0YWJsZTsKK30KKwordm9pZCBtYXJrX3RzY191bnN0YWJsZSh2b2lkKQoreworCXRzY191bnN0YWJsZSA9IDE7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChtYXJrX3RzY191bnN0YWJsZSk7CisKKy8qIEFjY2VsbGVyYXRvcnMgZm9yIHNjaGVkX2Nsb2NrKCkKKyAqIGNvbnZlcnQgZnJvbSBjeWNsZXMoNjRiaXRzKSA9PiBuYW5vc2Vjb25kcyAoNjRiaXRzKQorICogIGJhc2ljIGVxdWF0aW9uOgorICoJCW5zID0gY3ljbGVzIC8gKGZyZXEgLyBuc19wZXJfc2VjKQorICoJCW5zID0gY3ljbGVzICogKG5zX3Blcl9zZWMgLyBmcmVxKQorICoJCW5zID0gY3ljbGVzICogKDEwXjkgLyAoY3B1X2toeiAqIDEwXjMpKQorICoJCW5zID0gY3ljbGVzICogKDEwXjYgLyBjcHVfa2h6KQorICoKKyAqCVRoZW4gd2UgdXNlIHNjYWxpbmcgbWF0aCAoc3VnZ2VzdGVkIGJ5IGdlb3JnZUBtdmlzdGEuY29tKSB0byBnZXQ6CisgKgkJbnMgPSBjeWNsZXMgKiAoMTBeNiAqIFNDIC8gY3B1X2toeikgLyBTQworICoJCW5zID0gY3ljbGVzICogY3ljMm5zX3NjYWxlIC8gU0MKKyAqCisgKglBbmQgc2luY2UgU0MgaXMgYSBjb25zdGFudCBwb3dlciBvZiB0d28sIHdlIGNhbiBjb252ZXJ0IHRoZSBkaXYKKyAqICBpbnRvIGEgc2hpZnQuCisgKgorICogIFdlIGNhbiB1c2Uga2h6IGRpdmlzb3IgaW5zdGVhZCBvZiBtaHogdG8ga2VlcCBhIGJldHRlciBwZXJjaXNpb24sIHNpbmNlCisgKiAgY3ljMm5zX3NjYWxlIGlzIGxpbWl0ZWQgdG8gMTBeNiAqIDJeMTAsIHdoaWNoIGZpdHMgaW4gMzIgYml0cy4KKyAqICAobWF0aGlldS5kZXNub3llcnNAcG9seW10bC5jYSkKKyAqCisgKgkJCS1qb2huc3R1bEB1cy5pYm0uY29tICJtYXRoIGlzIGhhcmQsIGxldHMgZ28gc2hvcHBpbmchIgorICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBjeWMybnNfc2NhbGUgX19yZWFkX21vc3RseTsKKworI2RlZmluZSBDWUMyTlNfU0NBTEVfRkFDVE9SIDEwIC8qIDJeMTAsIGNhcmVmdWxseSBjaG9zZW4gKi8KKworc3RhdGljIGlubGluZSB2b2lkIHNldF9jeWMybnNfc2NhbGUodW5zaWduZWQgbG9uZyBjcHVfa2h6KQoreworCWN5YzJuc19zY2FsZSA9ICgxMDAwMDAwIDw8IENZQzJOU19TQ0FMRV9GQUNUT1IpL2NwdV9raHo7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBsb25nIGN5Y2xlc18yX25zKHVuc2lnbmVkIGxvbmcgbG9uZyBjeWMpCit7CisJcmV0dXJuIChjeWMgKiBjeWMybnNfc2NhbGUpID4+IENZQzJOU19TQ0FMRV9GQUNUT1I7Cit9CisKKy8qCisgKiBTY2hlZHVsZXIgY2xvY2sgLSByZXR1cm5zIGN1cnJlbnQgdGltZSBpbiBuYW5vc2VjIHVuaXRzLgorICovCit1bnNpZ25lZCBsb25nIGxvbmcgc2NoZWRfY2xvY2sodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgdGhpc19vZmZzZXQ7CisKKwkvKgorCSAqIGluIHRoZSBOVU1BIGNhc2Ugd2UgZG9udCB1c2UgdGhlIFRTQyBhcyB0aGV5IGFyZSBub3QKKwkgKiBzeW5jaHJvbml6ZWQgYWNyb3NzIGFsbCBDUFVzLgorCSAqLworI2lmbmRlZiBDT05GSUdfTlVNQQorCWlmICghY3B1X2toeiB8fCBjaGVja190c2NfdW5zdGFibGUoKSkKKyNlbmRpZgorCQkvKiBubyBsb2NraW5nIGJ1dCBhIHJhcmUgd3JvbmcgdmFsdWUgaXMgbm90IGEgYmlnIGRlYWwgKi8KKwkJcmV0dXJuIChqaWZmaWVzXzY0IC0gSU5JVElBTF9KSUZGSUVTKSAqICgxMDAwMDAwMDAwIC8gSFopOworCisJLyogcmVhZCB0aGUgVGltZSBTdGFtcCBDb3VudGVyOiAqLworCXJkdHNjbGwodGhpc19vZmZzZXQpOworCisJLyogcmV0dXJuIHRoZSB2YWx1ZSBpbiBucyAqLworCXJldHVybiBjeWNsZXNfMl9ucyh0aGlzX29mZnNldCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGNhbGN1bGF0ZV9jcHVfa2h6KHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIHN0YXJ0LCBlbmQ7CisJdW5zaWduZWQgbG9uZyBjb3VudDsKKwl1NjQgZGVsdGE2NDsKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJLyogcnVuIDMgdGltZXMgdG8gZW5zdXJlIHRoZSBjYWNoZSBpcyB3YXJtICovCisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQltYWNoX3ByZXBhcmVfY291bnRlcigpOworCQlyZHRzY2xsKHN0YXJ0KTsKKwkJbWFjaF9jb3VudHVwKCZjb3VudCk7CisJCXJkdHNjbGwoZW5kKTsKKwl9CisJLyoKKwkgKiBFcnJvcjogRUNUQ05FVkVSU0VUCisJICogVGhlIENUQyB3YXNuJ3QgcmVsaWFibGU6IHdlIGdvdCBhIGhpdCBvbiB0aGUgdmVyeSBmaXJzdCByZWFkLAorCSAqIG9yIHRoZSBDUFUgd2FzIHNvIGZhc3Qvc2xvdyB0aGF0IHRoZSBxdW90aWVudCB3b3VsZG4ndCBmaXQgaW4KKwkgKiAzMiBiaXRzLi4KKwkgKi8KKwlpZiAoY291bnQgPD0gMSkKKwkJZ290byBlcnI7CisKKwlkZWx0YTY0ID0gZW5kIC0gc3RhcnQ7CisKKwkvKiBjcHUgZnJlcSB0b28gZmFzdDogKi8KKwlpZiAoZGVsdGE2NCA+ICgxVUxMPDwzMikpCisJCWdvdG8gZXJyOworCisJLyogY3B1IGZyZXEgdG9vIHNsb3c6ICovCisJaWYgKGRlbHRhNjQgPD0gQ0FMSUJSQVRFX1RJTUVfTVNFQykKKwkJZ290byBlcnI7CisKKwlkZWx0YTY0ICs9IENBTElCUkFURV9USU1FX01TRUMvMjsgLyogcm91bmQgZm9yIGRvX2RpdiAqLworCWRvX2RpdihkZWx0YTY0LENBTElCUkFURV9USU1FX01TRUMpOworCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCXJldHVybiAodW5zaWduZWQgbG9uZylkZWx0YTY0OworZXJyOgorCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworaW50IHJlY2FsaWJyYXRlX2NwdV9raHoodm9pZCkKK3sKKyNpZm5kZWYgQ09ORklHX1NNUAorCXVuc2lnbmVkIGxvbmcgY3B1X2toel9vbGQgPSBjcHVfa2h6OworCisJaWYgKGNwdV9oYXNfdHNjKSB7CisJCWNwdV9raHogPSBjYWxjdWxhdGVfY3B1X2toeigpOworCQl0c2Nfa2h6ID0gY3B1X2toejsKKwkJY3B1X2RhdGFbMF0ubG9vcHNfcGVyX2ppZmZ5ID0KKwkJCWNwdWZyZXFfc2NhbGUoY3B1X2RhdGFbMF0ubG9vcHNfcGVyX2ppZmZ5LAorCQkJCQljcHVfa2h6X29sZCwgY3B1X2toeik7CisJCXJldHVybiAwOworCX0gZWxzZQorCQlyZXR1cm4gLUVOT0RFVjsKKyNlbHNlCisJcmV0dXJuIC1FTk9ERVY7CisjZW5kaWYKK30KKworRVhQT1JUX1NZTUJPTChyZWNhbGlicmF0ZV9jcHVfa2h6KTsKKwordm9pZCB0c2NfaW5pdCh2b2lkKQoreworCWlmICghY3B1X2hhc190c2MgfHwgdHNjX2Rpc2FibGUpCisJCXJldHVybjsKKworCWNwdV9raHogPSBjYWxjdWxhdGVfY3B1X2toeigpOworCXRzY19raHogPSBjcHVfa2h6OworCisJaWYgKCFjcHVfa2h6KQorCQlyZXR1cm47CisKKwlwcmludGsoIkRldGVjdGVkICVsdS4lMDNsdSBNSHogcHJvY2Vzc29yLlxuIiwKKwkJCQkodW5zaWduZWQgbG9uZyljcHVfa2h6IC8gMTAwMCwKKwkJCQkodW5zaWduZWQgbG9uZyljcHVfa2h6ICUgMTAwMCk7CisKKwlzZXRfY3ljMm5zX3NjYWxlKGNwdV9raHopOworCXVzZV90c2NfZGVsYXkoKTsKK30KKworI2lmZGVmIENPTkZJR19DUFVfRlJFUQorCitzdGF0aWMgdW5zaWduZWQgaW50IGNwdWZyZXFfZGVsYXllZF9pc3NjaGVkID0gMDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY3B1ZnJlcV9pbml0ID0gMDsKK3N0YXRpYyBzdHJ1Y3Qgd29ya19zdHJ1Y3QgY3B1ZnJlcV9kZWxheWVkX2dldF93b3JrOworCitzdGF0aWMgdm9pZCBoYW5kbGVfY3B1ZnJlcV9kZWxheWVkX2dldCh2b2lkICp2KQoreworCXVuc2lnbmVkIGludCBjcHU7CisKKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkKKwkJY3B1ZnJlcV9nZXQoY3B1KTsKKworCWNwdWZyZXFfZGVsYXllZF9pc3NjaGVkID0gMDsKK30KKworLyoKKyAqIGlmIHdlIG5vdGljZSBjcHVmcmVxIG9kZG5lc3MsIHNjaGVkdWxlIGEgY2FsbCB0byBjcHVmcmVxX2dldCgpIGFzIGl0IHRyaWVzCisgKiB0byB2ZXJpZnkgdGhlIENQVSBmcmVxdWVuY3kgdGhlIHRpbWluZyBjb3JlIHRoaW5rcyB0aGUgQ1BVIGlzIHJ1bm5pbmcKKyAqIGF0IGlzIHN0aWxsIGNvcnJlY3QuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBjcHVmcmVxX2RlbGF5ZWRfZ2V0KHZvaWQpCit7CisJaWYgKGNwdWZyZXFfaW5pdCAmJiAhY3B1ZnJlcV9kZWxheWVkX2lzc2NoZWQpIHsKKwkJY3B1ZnJlcV9kZWxheWVkX2lzc2NoZWQgPSAxOworCQlwcmludGsoS0VSTl9ERUJVRyAiQ2hlY2tpbmcgaWYgQ1BVIGZyZXF1ZW5jeSBjaGFuZ2VkLlxuIik7CisJCXNjaGVkdWxlX3dvcmsoJmNwdWZyZXFfZGVsYXllZF9nZXRfd29yayk7CisJfQorfQorCisvKgorICogaWYgdGhlIENQVSBmcmVxdWVuY3kgaXMgc2NhbGVkLCBUU0MtYmFzZWQgZGVsYXlzIHdpbGwgbmVlZCBhIGRpZmZlcmVudAorICogbG9vcHNfcGVyX2ppZmZ5IHZhbHVlIHRvIGZ1bmN0aW9uIHByb3Blcmx5LgorICovCitzdGF0aWMgdW5zaWduZWQgaW50IHJlZl9mcmVxID0gMDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvb3BzX3Blcl9qaWZmeV9yZWYgPSAwOworc3RhdGljIHVuc2lnbmVkIGxvbmcgY3B1X2toel9yZWYgPSAwOworCitzdGF0aWMgaW50Cit0aW1lX2NwdWZyZXFfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwgdW5zaWduZWQgbG9uZyB2YWwsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGNwdWZyZXFfZnJlcXMgKmZyZXEgPSBkYXRhOworCisJaWYgKHZhbCAhPSBDUFVGUkVRX1JFU1VNRUNIQU5HRSAmJiB2YWwgIT0gQ1BVRlJFUV9TVVNQRU5EQ0hBTkdFKQorCQl3cml0ZV9zZXFsb2NrX2lycSgmeHRpbWVfbG9jayk7CisKKwlpZiAoIXJlZl9mcmVxKSB7CisJCWlmICghZnJlcS0+b2xkKXsKKwkJCXJlZl9mcmVxID0gZnJlcS0+bmV3OworCQkJZ290byBlbmQ7CisJCX0KKwkJcmVmX2ZyZXEgPSBmcmVxLT5vbGQ7CisJCWxvb3BzX3Blcl9qaWZmeV9yZWYgPSBjcHVfZGF0YVtmcmVxLT5jcHVdLmxvb3BzX3Blcl9qaWZmeTsKKwkJY3B1X2toel9yZWYgPSBjcHVfa2h6OworCX0KKworCWlmICgodmFsID09IENQVUZSRVFfUFJFQ0hBTkdFICAmJiBmcmVxLT5vbGQgPCBmcmVxLT5uZXcpIHx8CisJICAgICh2YWwgPT0gQ1BVRlJFUV9QT1NUQ0hBTkdFICYmIGZyZXEtPm9sZCA+IGZyZXEtPm5ldykgfHwKKwkgICAgKHZhbCA9PSBDUFVGUkVRX1JFU1VNRUNIQU5HRSkpIHsKKwkJaWYgKCEoZnJlcS0+ZmxhZ3MgJiBDUFVGUkVRX0NPTlNUX0xPT1BTKSkKKwkJCWNwdV9kYXRhW2ZyZXEtPmNwdV0ubG9vcHNfcGVyX2ppZmZ5ID0KKwkJCQljcHVmcmVxX3NjYWxlKGxvb3BzX3Blcl9qaWZmeV9yZWYsCisJCQkJCQlyZWZfZnJlcSwgZnJlcS0+bmV3KTsKKworCQlpZiAoY3B1X2toeikgeworCisJCQlpZiAobnVtX29ubGluZV9jcHVzKCkgPT0gMSkKKwkJCQljcHVfa2h6ID0gY3B1ZnJlcV9zY2FsZShjcHVfa2h6X3JlZiwKKwkJCQkJCXJlZl9mcmVxLCBmcmVxLT5uZXcpOworCQkJaWYgKCEoZnJlcS0+ZmxhZ3MgJiBDUFVGUkVRX0NPTlNUX0xPT1BTKSkgeworCQkJCXRzY19raHogPSBjcHVfa2h6OworCQkJCXNldF9jeWMybnNfc2NhbGUoY3B1X2toeik7CisJCQkJLyoKKwkJCQkgKiBUU0MgYmFzZWQgc2NoZWRfY2xvY2sgdHVybnMKKwkJCQkgKiB0byBqdW5rIHcvIGNwdWZyZXEKKwkJCQkgKi8KKwkJCQltYXJrX3RzY191bnN0YWJsZSgpOworCQkJfQorCQl9CisJfQorZW5kOgorCWlmICh2YWwgIT0gQ1BVRlJFUV9SRVNVTUVDSEFOR0UgJiYgdmFsICE9IENQVUZSRVFfU1VTUEVORENIQU5HRSkKKwkJd3JpdGVfc2VxdW5sb2NrX2lycSgmeHRpbWVfbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayB0aW1lX2NwdWZyZXFfbm90aWZpZXJfYmxvY2sgPSB7CisJLm5vdGlmaWVyX2NhbGwJPSB0aW1lX2NwdWZyZXFfbm90aWZpZXIKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGNwdWZyZXFfdHNjKHZvaWQpCit7CisJaW50IHJldDsKKworCUlOSVRfV09SSygmY3B1ZnJlcV9kZWxheWVkX2dldF93b3JrLCBoYW5kbGVfY3B1ZnJlcV9kZWxheWVkX2dldCwgTlVMTCk7CisJcmV0ID0gY3B1ZnJlcV9yZWdpc3Rlcl9ub3RpZmllcigmdGltZV9jcHVmcmVxX25vdGlmaWVyX2Jsb2NrLAorCQkJCQlDUFVGUkVRX1RSQU5TSVRJT05fTk9USUZJRVIpOworCWlmICghcmV0KQorCQljcHVmcmVxX2luaXQgPSAxOworCisJcmV0dXJuIHJldDsKK30KKworY29yZV9pbml0Y2FsbChjcHVmcmVxX3RzYyk7CisKKyNlbmRpZgorCisvKiBjbG9jayBzb3VyY2UgY29kZSAqLworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBjdXJyZW50X3RzY19raHogPSAwOworc3RhdGljIGludCB0c2NfdXBkYXRlX2NhbGxiYWNrKHZvaWQpOworCitzdGF0aWMgY3ljbGVfdCByZWFkX3RzYyh2b2lkKQoreworCWN5Y2xlX3QgcmV0OworCisJcmR0c2NsbChyZXQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBjbG9ja3NvdXJjZSBjbG9ja3NvdXJjZV90c2MgPSB7CisJLm5hbWUJCQk9ICJ0c2MiLAorCS5yYXRpbmcJCQk9IDMwMCwKKwkucmVhZAkJCT0gcmVhZF90c2MsCisJLm1hc2sJCQk9IENMT0NLU09VUkNFX01BU0soNjQpLAorCS5tdWx0CQkJPSAwLCAvKiB0byBiZSBzZXQgKi8KKwkuc2hpZnQJCQk9IDIyLAorCS51cGRhdGVfY2FsbGJhY2sJPSB0c2NfdXBkYXRlX2NhbGxiYWNrLAorCS5pc19jb250aW51b3VzCQk9IDEsCit9OworCitzdGF0aWMgaW50IHRzY191cGRhdGVfY2FsbGJhY2sodm9pZCkKK3sKKwlpbnQgY2hhbmdlID0gMDsKKworCS8qIGNoZWNrIHRvIHNlZSBpZiB3ZSBzaG91bGQgc3dpdGNoIHRvIHRoZSBzYWZlIGNsb2Nrc291cmNlOiAqLworCWlmIChjbG9ja3NvdXJjZV90c2MucmF0aW5nICE9IDUwICYmIGNoZWNrX3RzY191bnN0YWJsZSgpKSB7CisJCWNsb2Nrc291cmNlX3RzYy5yYXRpbmcgPSA1MDsKKwkJY2xvY2tzb3VyY2VfcmVzZWxlY3QoKTsKKwkJY2hhbmdlID0gMTsKKwl9CisKKwkvKiBvbmx5IHVwZGF0ZSBpZiB0c2Nfa2h6IGhhcyBjaGFuZ2VkOiAqLworCWlmIChjdXJyZW50X3RzY19raHogIT0gdHNjX2toeikgeworCQljdXJyZW50X3RzY19raHogPSB0c2Nfa2h6OworCQljbG9ja3NvdXJjZV90c2MubXVsdCA9IGNsb2Nrc291cmNlX2toejJtdWx0KGN1cnJlbnRfdHNjX2toeiwKKwkJCQkJCQljbG9ja3NvdXJjZV90c2Muc2hpZnQpOworCQljaGFuZ2UgPSAxOworCX0KKworCXJldHVybiBjaGFuZ2U7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGRtaV9tYXJrX3RzY191bnN0YWJsZShzdHJ1Y3QgZG1pX3N5c3RlbV9pZCAqZCkKK3sKKwlwcmludGsoS0VSTl9OT1RJQ0UgIiVzIGRldGVjdGVkOiBtYXJraW5nIFRTQyB1bnN0YWJsZS5cbiIsCisJCSAgICAgICBkLT5pZGVudCk7CisJbWFya190c2NfdW5zdGFibGUoKTsKKwlyZXR1cm4gMDsKK30KKworLyogTGlzdCBvZiBzeXN0ZW1zIHRoYXQgaGF2ZSBrbm93biBUU0MgcHJvYmxlbXMgKi8KK3N0YXRpYyBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCBfX2luaXRkYXRhIGJhZF90c2NfZG1pX3RhYmxlW10gPSB7CisJeworCSAuY2FsbGJhY2sgPSBkbWlfbWFya190c2NfdW5zdGFibGUsCisJIC5pZGVudCA9ICJJQk0gVGhpbmtwYWQgMzgwWEQiLAorCSAubWF0Y2hlcyA9IHsKKwkJICAgICBETUlfTUFUQ0goRE1JX0JPQVJEX1ZFTkRPUiwgIklCTSIpLAorCQkgICAgIERNSV9NQVRDSChETUlfQk9BUkRfTkFNRSwgIjI2MzVGQTAiKSwKKwkJICAgICB9LAorCSB9LAorCSB7fQorfTsKKworI2RlZmluZSBUU0NfRlJFUV9DSEVDS19JTlRFUlZBTCAoMTAqTVNFQ19QRVJfU0VDKSAvKiAxMHNlYyBpbiBNUyAqLworc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IHZlcmlmeV90c2NfZnJlcV90aW1lcjsKKworLyogWFhYIC0gUHJvYmFibHkgc2hvdWxkIGFkZCBsb2NraW5nICovCitzdGF0aWMgdm9pZCB2ZXJpZnlfdHNjX2ZyZXEodW5zaWduZWQgbG9uZyB1bnVzZWQpCit7CisJc3RhdGljIHU2NCBsYXN0X3RzYzsKKwlzdGF0aWMgdW5zaWduZWQgbG9uZyBsYXN0X2ppZmZpZXM7CisKKwl1NjQgbm93X3RzYywgaW50ZXJ2YWxfdHNjOworCXVuc2lnbmVkIGxvbmcgbm93X2ppZmZpZXMsIGludGVydmFsX2ppZmZpZXM7CisKKworCWlmIChjaGVja190c2NfdW5zdGFibGUoKSkKKwkJcmV0dXJuOworCisJcmR0c2NsbChub3dfdHNjKTsKKwlub3dfamlmZmllcyA9IGppZmZpZXM7CisKKwlpZiAoIWxhc3RfamlmZmllcykgeworCQlnb3RvIG91dDsKKwl9CisKKwlpbnRlcnZhbF9qaWZmaWVzID0gbm93X2ppZmZpZXMgLSBsYXN0X2ppZmZpZXM7CisJaW50ZXJ2YWxfdHNjID0gbm93X3RzYyAtIGxhc3RfdHNjOworCWludGVydmFsX3RzYyAqPSBIWjsKKwlkb19kaXYoaW50ZXJ2YWxfdHNjLCBjcHVfa2h6KjEwMDApOworCisJaWYgKGludGVydmFsX3RzYyA8IChpbnRlcnZhbF9qaWZmaWVzICogMyAvIDQpKSB7CisJCXByaW50aygiVFNDIGFwcGVhcnMgdG8gYmUgcnVubmluZyBzbG93bHkuICIKKwkJCSJNYXJraW5nIGl0IGFzIHVuc3RhYmxlXG4iKTsKKwkJbWFya190c2NfdW5zdGFibGUoKTsKKwkJcmV0dXJuOworCX0KKworb3V0OgorCWxhc3RfdHNjID0gbm93X3RzYzsKKwlsYXN0X2ppZmZpZXMgPSBub3dfamlmZmllczsKKwkvKiBzZXQgdXMgdXAgdG8gZ28gb2ZmIG9uIHRoZSBuZXh0IGludGVydmFsOiAqLworCW1vZF90aW1lcigmdmVyaWZ5X3RzY19mcmVxX3RpbWVyLAorCQlqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhUU0NfRlJFUV9DSEVDS19JTlRFUlZBTCkpOworfQorCisvKgorICogTWFrZSBhbiBlZHVjYXRlZCBndWVzcyBpZiB0aGUgVFNDIGlzIHRydXN0d29ydGh5IGFuZCBzeW5jaHJvbml6ZWQKKyAqIG92ZXIgYWxsIENQVXMuCisgKi8KK3N0YXRpYyBfX2luaXQgaW50IHVuc3luY2hyb25pemVkX3RzYyh2b2lkKQoreworCS8qCisJICogSW50ZWwgc3lzdGVtcyBhcmUgbm9ybWFsbHkgYWxsIHN5bmNocm9uaXplZC4KKwkgKiBFeGNlcHRpb25zIG11c3QgbWFyayBUU0MgYXMgdW5zdGFibGU6CisJICovCisJaWYgKGJvb3RfY3B1X2RhdGEueDg2X3ZlbmRvciA9PSBYODZfVkVORE9SX0lOVEVMKQorIAkJcmV0dXJuIDA7CisKKwkvKiBhc3N1bWUgbXVsdGkgc29ja2V0IHN5c3RlbXMgYXJlIG5vdCBzeW5jaHJvbml6ZWQ6ICovCisgCXJldHVybiBudW1fcG9zc2libGVfY3B1cygpID4gMTsKK30KKworc3RhdGljIGludCBfX2luaXQgaW5pdF90c2NfY2xvY2tzb3VyY2Uodm9pZCkKK3sKKworCWlmIChjcHVfaGFzX3RzYyAmJiB0c2Nfa2h6ICYmICF0c2NfZGlzYWJsZSkgeworCQkvKiBjaGVjayBibGFja2xpc3QgKi8KKwkJZG1pX2NoZWNrX3N5c3RlbShiYWRfdHNjX2RtaV90YWJsZSk7CisKKwkJaWYgKHVuc3luY2hyb25pemVkX3RzYygpKSAvKiBtYXJrIHVuc3RhYmxlIGlmIHVuc3luY2VkICovCisJCQltYXJrX3RzY191bnN0YWJsZSgpOworCQljdXJyZW50X3RzY19raHogPSB0c2Nfa2h6OworCQljbG9ja3NvdXJjZV90c2MubXVsdCA9IGNsb2Nrc291cmNlX2toejJtdWx0KGN1cnJlbnRfdHNjX2toeiwKKwkJCQkJCQljbG9ja3NvdXJjZV90c2Muc2hpZnQpOworCQkvKiBsb3dlciB0aGUgcmF0aW5nIGlmIHdlIGFscmVhZHkga25vdyBpdHMgdW5zdGFibGU6ICovCisJCWlmIChjaGVja190c2NfdW5zdGFibGUoKSkKKwkJCWNsb2Nrc291cmNlX3RzYy5yYXRpbmcgPSA1MDsKKworCQlpbml0X3RpbWVyKCZ2ZXJpZnlfdHNjX2ZyZXFfdGltZXIpOworCQl2ZXJpZnlfdHNjX2ZyZXFfdGltZXIuZnVuY3Rpb24gPSB2ZXJpZnlfdHNjX2ZyZXE7CisJCXZlcmlmeV90c2NfZnJlcV90aW1lci5leHBpcmVzID0KKwkJCWppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKFRTQ19GUkVRX0NIRUNLX0lOVEVSVkFMKTsKKwkJYWRkX3RpbWVyKCZ2ZXJpZnlfdHNjX2ZyZXFfdGltZXIpOworCisJCXJldHVybiBjbG9ja3NvdXJjZV9yZWdpc3RlcigmY2xvY2tzb3VyY2VfdHNjKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworbW9kdWxlX2luaXQoaW5pdF90c2NfY2xvY2tzb3VyY2UpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC92bWxpbnV4Lmxkcy5TIGIvYXJjaC9pMzg2L2tlcm5lbC92bWxpbnV4Lmxkcy5TCmluZGV4IDc1MTJmMzkuLjJkNGYxMzggMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvdm1saW51eC5sZHMuUworKysgYi9hcmNoL2kzODYva2VybmVsL3ZtbGludXgubGRzLlMKQEAgLTcxLDYgKzcxLDE1IEBACiAgIC5kYXRhLnJlYWRfbW9zdGx5IDogQVQoQUREUiguZGF0YS5yZWFkX21vc3RseSkgLSBMT0FEX09GRlNFVCkgeyAqKC5kYXRhLnJlYWRfbW9zdGx5KSB9CiAgIF9lZGF0YSA9IC47CQkJLyogRW5kIG9mIGRhdGEgc2VjdGlvbiAqLwogCisjaWZkZWYgQ09ORklHX1NUQUNLX1VOV0lORAorICAuID0gQUxJR04oNCk7CisgIC5laF9mcmFtZSA6IEFUKEFERFIoLmVoX2ZyYW1lKSAtIExPQURfT0ZGU0VUKSB7CisJX19zdGFydF91bndpbmQgPSAuOworICAJKiguZWhfZnJhbWUpCisJX19lbmRfdW53aW5kID0gLjsKKyAgfQorI2VuZGlmCisKICAgLiA9IEFMSUdOKFRIUkVBRF9TSVpFKTsJLyogaW5pdF90YXNrICovCiAgIC5kYXRhLmluaXRfdGFzayA6IEFUKEFERFIoLmRhdGEuaW5pdF90YXNrKSAtIExPQURfT0ZGU0VUKSB7CiAJKiguZGF0YS5pbml0X3Rhc2spCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbGliL2RlbGF5LmMgYi9hcmNoL2kzODYvbGliL2RlbGF5LmMKaW5kZXggYzQ5YTZhYy4uM2MwNzE0YyAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2xpYi9kZWxheS5jCisrKyBiL2FyY2gvaTM4Ni9saWIvZGVsYXkuYwpAQCAtMTAsNDMgKzEwLDkyIEBACiAgKgl3ZSBoYXZlIHRvIHdvcnJ5IGFib3V0LgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8YXNtL2RlbGF5Lmg+CiAjaW5jbHVkZSA8YXNtL3RpbWVyLmg+CiAKICNpZmRlZiBDT05GSUdfU01QCi0jaW5jbHVkZSA8YXNtL3NtcC5oPgorIyBpbmNsdWRlIDxhc20vc21wLmg+CiAjZW5kaWYKIAotZXh0ZXJuIHN0cnVjdCB0aW1lcl9vcHRzKiB0aW1lcjsKKy8qIHNpbXBsZSBsb29wIGJhc2VkIGRlbGF5OiAqLworc3RhdGljIHZvaWQgZGVsYXlfbG9vcCh1bnNpZ25lZCBsb25nIGxvb3BzKQoreworCWludCBkMDsKKworCV9fYXNtX18gX192b2xhdGlsZV9fKAorCQkiXHRqbXAgMWZcbiIKKwkJIi5hbGlnbiAxNlxuIgorCQkiMTpcdGptcCAyZlxuIgorCQkiLmFsaWduIDE2XG4iCisJCSIyOlx0ZGVjbCAlMFxuXHRqbnMgMmIiCisJCToiPSZhIiAoZDApCisJCToiMCIgKGxvb3BzKSk7Cit9CisKKy8qIFRTQyBiYXNlZCBkZWxheTogKi8KK3N0YXRpYyB2b2lkIGRlbGF5X3RzYyh1bnNpZ25lZCBsb25nIGxvb3BzKQoreworCXVuc2lnbmVkIGxvbmcgYmNsb2NrLCBub3c7CisKKwlyZHRzY2woYmNsb2NrKTsKKwlkbyB7CisJCXJlcF9ub3AoKTsKKwkJcmR0c2NsKG5vdyk7CisJfSB3aGlsZSAoKG5vdy1iY2xvY2spIDwgbG9vcHMpOworfQorCisvKgorICogU2luY2Ugd2UgY2FsaWJyYXRlIG9ubHkgb25jZSBhdCBib290LCB0aGlzCisgKiBmdW5jdGlvbiBzaG91bGQgYmUgc2V0IG9uY2UgYXQgYm9vdCBhbmQgbm90IGNoYW5nZWQKKyAqLworc3RhdGljIHZvaWQgKCpkZWxheV9mbikodW5zaWduZWQgbG9uZykgPSBkZWxheV9sb29wOworCit2b2lkIHVzZV90c2NfZGVsYXkodm9pZCkKK3sKKwlkZWxheV9mbiA9IGRlbGF5X3RzYzsKK30KKworaW50IHJlYWRfY3VycmVudF90aW1lcih1bnNpZ25lZCBsb25nICp0aW1lcl92YWwpCit7CisJaWYgKGRlbGF5X2ZuID09IGRlbGF5X3RzYykgeworCQlyZHRzY2woKnRpbWVyX3ZhbCk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gLTE7Cit9CiAKIHZvaWQgX19kZWxheSh1bnNpZ25lZCBsb25nIGxvb3BzKQogewotCWN1cl90aW1lci0+ZGVsYXkobG9vcHMpOworCWRlbGF5X2ZuKGxvb3BzKTsKIH0KIAogaW5saW5lIHZvaWQgX19jb25zdF91ZGVsYXkodW5zaWduZWQgbG9uZyB4bG9vcHMpCiB7CiAJaW50IGQwOworCiAJeGxvb3BzICo9IDQ7CiAJX19hc21fXygibXVsbCAlMCIKIAkJOiI9ZCIgKHhsb29wcyksICI9JmEiIChkMCkKLQkJOiIxIiAoeGxvb3BzKSwiMCIgKGNwdV9kYXRhW3Jhd19zbXBfcHJvY2Vzc29yX2lkKCldLmxvb3BzX3Blcl9qaWZmeSAqIChIWi80KSkpOwotICAgICAgICBfX2RlbGF5KCsreGxvb3BzKTsKKwkJOiIxIiAoeGxvb3BzKSwgIjAiCisJCShjcHVfZGF0YVtyYXdfc21wX3Byb2Nlc3Nvcl9pZCgpXS5sb29wc19wZXJfamlmZnkgKiAoSFovNCkpKTsKKworCV9fZGVsYXkoKyt4bG9vcHMpOwogfQogCiB2b2lkIF9fdWRlbGF5KHVuc2lnbmVkIGxvbmcgdXNlY3MpCiB7Ci0JX19jb25zdF91ZGVsYXkodXNlY3MgKiAweDAwMDAxMGM3KTsgIC8qIDIqKjMyIC8gMTAwMDAwMCAocm91bmRlZCB1cCkgKi8KKwlfX2NvbnN0X3VkZWxheSh1c2VjcyAqIDB4MDAwMDEwYzcpOyAvKiAyKiozMiAvIDEwMDAwMDAgKHJvdW5kZWQgdXApICovCiB9CiAKIHZvaWQgX19uZGVsYXkodW5zaWduZWQgbG9uZyBuc2VjcykKIHsKLQlfX2NvbnN0X3VkZWxheShuc2VjcyAqIDB4MDAwMDUpOyAgLyogMioqMzIgLyAxMDAwMDAwMDAwIChyb3VuZGVkIHVwKSAqLworCV9fY29uc3RfdWRlbGF5KG5zZWNzICogMHgwMDAwNSk7IC8qIDIqKjMyIC8gMTAwMDAwMDAwMCAocm91bmRlZCB1cCkgKi8KIH0KIAogRVhQT1JUX1NZTUJPTChfX2RlbGF5KTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9saWIvdXNlcmNvcHkuYyBiL2FyY2gvaTM4Ni9saWIvdXNlcmNvcHkuYwppbmRleCA2OTc5Mjk3Li5jNWFhNjVmIDEwMDY0NAotLS0gYS9hcmNoL2kzODYvbGliL3VzZXJjb3B5LmMKKysrIGIvYXJjaC9pMzg2L2xpYi91c2VyY29weS5jCkBAIC01MjgsNiArNTI4LDk3IEBACiAJcmV0dXJuIHNpemU7CiB9CiAKK3N0YXRpYyB1bnNpZ25lZCBsb25nIF9fY29weV91c2VyX2ludGVsX25vY2FjaGUodm9pZCAqdG8sCisJCQkJY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKyAgICAgICAgaW50IGQwLCBkMTsKKworCV9fYXNtX18gX192b2xhdGlsZV9fKAorCSAgICAgICAiICAgICAgICAuYWxpZ24gMiwweDkwXG4iCisJICAgICAgICIwOiAgICAgIG1vdmwgMzIoJTQpLCAlJWVheFxuIgorCSAgICAgICAiICAgICAgICBjbXBsICQ2NywgJTBcbiIKKwkgICAgICAgIiAgICAgICAgamJlIDJmXG4iCisJICAgICAgICIxOiAgICAgIG1vdmwgNjQoJTQpLCAlJWVheFxuIgorCSAgICAgICAiICAgICAgICAuYWxpZ24gMiwweDkwXG4iCisJICAgICAgICIyOiAgICAgIG1vdmwgMCglNCksICUlZWF4XG4iCisJICAgICAgICIyMTogICAgIG1vdmwgNCglNCksICUlZWR4XG4iCisJICAgICAgICIgICAgICAgIG1vdm50aSAlJWVheCwgMCglMylcbiIKKwkgICAgICAgIiAgICAgICAgbW92bnRpICUlZWR4LCA0KCUzKVxuIgorCSAgICAgICAiMzogICAgICBtb3ZsIDgoJTQpLCAlJWVheFxuIgorCSAgICAgICAiMzE6ICAgICBtb3ZsIDEyKCU0KSwlJWVkeFxuIgorCSAgICAgICAiICAgICAgICBtb3ZudGkgJSVlYXgsIDgoJTMpXG4iCisJICAgICAgICIgICAgICAgIG1vdm50aSAlJWVkeCwgMTIoJTMpXG4iCisJICAgICAgICI0OiAgICAgIG1vdmwgMTYoJTQpLCAlJWVheFxuIgorCSAgICAgICAiNDE6ICAgICBtb3ZsIDIwKCU0KSwgJSVlZHhcbiIKKwkgICAgICAgIiAgICAgICAgbW92bnRpICUlZWF4LCAxNiglMylcbiIKKwkgICAgICAgIiAgICAgICAgbW92bnRpICUlZWR4LCAyMCglMylcbiIKKwkgICAgICAgIjEwOiAgICAgbW92bCAyNCglNCksICUlZWF4XG4iCisJICAgICAgICI1MTogICAgIG1vdmwgMjgoJTQpLCAlJWVkeFxuIgorCSAgICAgICAiICAgICAgICBtb3ZudGkgJSVlYXgsIDI0KCUzKVxuIgorCSAgICAgICAiICAgICAgICBtb3ZudGkgJSVlZHgsIDI4KCUzKVxuIgorCSAgICAgICAiMTE6ICAgICBtb3ZsIDMyKCU0KSwgJSVlYXhcbiIKKwkgICAgICAgIjYxOiAgICAgbW92bCAzNiglNCksICUlZWR4XG4iCisJICAgICAgICIgICAgICAgIG1vdm50aSAlJWVheCwgMzIoJTMpXG4iCisJICAgICAgICIgICAgICAgIG1vdm50aSAlJWVkeCwgMzYoJTMpXG4iCisJICAgICAgICIxMjogICAgIG1vdmwgNDAoJTQpLCAlJWVheFxuIgorCSAgICAgICAiNzE6ICAgICBtb3ZsIDQ0KCU0KSwgJSVlZHhcbiIKKwkgICAgICAgIiAgICAgICAgbW92bnRpICUlZWF4LCA0MCglMylcbiIKKwkgICAgICAgIiAgICAgICAgbW92bnRpICUlZWR4LCA0NCglMylcbiIKKwkgICAgICAgIjEzOiAgICAgbW92bCA0OCglNCksICUlZWF4XG4iCisJICAgICAgICI4MTogICAgIG1vdmwgNTIoJTQpLCAlJWVkeFxuIgorCSAgICAgICAiICAgICAgICBtb3ZudGkgJSVlYXgsIDQ4KCUzKVxuIgorCSAgICAgICAiICAgICAgICBtb3ZudGkgJSVlZHgsIDUyKCUzKVxuIgorCSAgICAgICAiMTQ6ICAgICBtb3ZsIDU2KCU0KSwgJSVlYXhcbiIKKwkgICAgICAgIjkxOiAgICAgbW92bCA2MCglNCksICUlZWR4XG4iCisJICAgICAgICIgICAgICAgIG1vdm50aSAlJWVheCwgNTYoJTMpXG4iCisJICAgICAgICIgICAgICAgIG1vdm50aSAlJWVkeCwgNjAoJTMpXG4iCisJICAgICAgICIgICAgICAgIGFkZGwgJC02NCwgJTBcbiIKKwkgICAgICAgIiAgICAgICAgYWRkbCAkNjQsICU0XG4iCisJICAgICAgICIgICAgICAgIGFkZGwgJDY0LCAlM1xuIgorCSAgICAgICAiICAgICAgICBjbXBsICQ2MywgJTBcbiIKKwkgICAgICAgIiAgICAgICAgamEgIDBiXG4iCisJICAgICAgICIgICAgICAgIHNmZW5jZSBcbiIKKwkgICAgICAgIjU6ICAgICAgbW92bCAgJTAsICUlZWF4XG4iCisJICAgICAgICIgICAgICAgIHNocmwgICQyLCAlMFxuIgorCSAgICAgICAiICAgICAgICBhbmRsICQzLCAlJWVheFxuIgorCSAgICAgICAiICAgICAgICBjbGRcbiIKKwkgICAgICAgIjY6ICAgICAgcmVwOyBtb3ZzbFxuIgorCSAgICAgICAiICAgICAgICBtb3ZsICUlZWF4LCUwXG4iCisJICAgICAgICI3OiAgICAgIHJlcDsgbW92c2JcbiIKKwkgICAgICAgIjg6XG4iCisJICAgICAgICIuc2VjdGlvbiAuZml4dXAsXCJheFwiXG4iCisJICAgICAgICI5OiAgICAgIGxlYSAwKCUlZWF4LCUwLDQpLCUwXG4iCisJICAgICAgICIxNjogICAgIGptcCA4YlxuIgorCSAgICAgICAiLnByZXZpb3VzXG4iCisJICAgICAgICIuc2VjdGlvbiBfX2V4X3RhYmxlLFwiYVwiXG4iCisJICAgICAgICIJLmFsaWduIDRcbiIKKwkgICAgICAgIgkubG9uZyAwYiwxNmJcbiIKKwkgICAgICAgIgkubG9uZyAxYiwxNmJcbiIKKwkgICAgICAgIgkubG9uZyAyYiwxNmJcbiIKKwkgICAgICAgIgkubG9uZyAyMWIsMTZiXG4iCisJICAgICAgICIJLmxvbmcgM2IsMTZiXG4iCisJICAgICAgICIJLmxvbmcgMzFiLDE2YlxuIgorCSAgICAgICAiCS5sb25nIDRiLDE2YlxuIgorCSAgICAgICAiCS5sb25nIDQxYiwxNmJcbiIKKwkgICAgICAgIgkubG9uZyAxMGIsMTZiXG4iCisJICAgICAgICIJLmxvbmcgNTFiLDE2YlxuIgorCSAgICAgICAiCS5sb25nIDExYiwxNmJcbiIKKwkgICAgICAgIgkubG9uZyA2MWIsMTZiXG4iCisJICAgICAgICIJLmxvbmcgMTJiLDE2YlxuIgorCSAgICAgICAiCS5sb25nIDcxYiwxNmJcbiIKKwkgICAgICAgIgkubG9uZyAxM2IsMTZiXG4iCisJICAgICAgICIJLmxvbmcgODFiLDE2YlxuIgorCSAgICAgICAiCS5sb25nIDE0YiwxNmJcbiIKKwkgICAgICAgIgkubG9uZyA5MWIsMTZiXG4iCisJICAgICAgICIJLmxvbmcgNmIsOWJcbiIKKwkgICAgICAgIiAgICAgICAgLmxvbmcgN2IsMTZiXG4iCisJICAgICAgICIucHJldmlvdXMiCisJICAgICAgIDogIj0mYyIoc2l6ZSksICI9JkQiIChkMCksICI9JlMiIChkMSkKKwkgICAgICAgOiAgIjEiKHRvKSwgIjIiKGZyb20pLCAiMCIoc2l6ZSkKKwkgICAgICAgOiAiZWF4IiwgImVkeCIsICJtZW1vcnkiKTsKKwlyZXR1cm4gc2l6ZTsKK30KKwogI2Vsc2UKIAogLyoKQEAgLTY5NCw2ICs3ODUsMTkgQEAKIH0KIEVYUE9SVF9TWU1CT0woX19jb3B5X2Zyb21fdXNlcl9sbCk7CiAKK3Vuc2lnbmVkIGxvbmcgX19jb3B5X2Zyb21fdXNlcl9sbF9ub3plcm8odm9pZCAqdG8sIGNvbnN0IHZvaWQgX191c2VyICpmcm9tLAorCQkJCQkgdW5zaWduZWQgbG9uZyBuKQoreworCUJVR19PTigobG9uZyluIDwgMCk7CisJaWYgKG1vdnNsX2lzX29rKHRvLCBmcm9tLCBuKSkKKwkJX19jb3B5X3VzZXIodG8sIGZyb20sIG4pOworCWVsc2UKKwkJbiA9IF9fY29weV91c2VyX2ludGVsKCh2b2lkIF9fdXNlciAqKXRvLAorCQkJCSAgICAgIChjb25zdCB2b2lkICopZnJvbSwgbik7CisJcmV0dXJuIG47Cit9CitFWFBPUlRfU1lNQk9MKF9fY29weV9mcm9tX3VzZXJfbGxfbm96ZXJvKTsKKwogdW5zaWduZWQgbG9uZyBfX2NvcHlfZnJvbV91c2VyX2xsX25vY2FjaGUodm9pZCAqdG8sIGNvbnN0IHZvaWQgX191c2VyICpmcm9tLAogCQkJCQl1bnNpZ25lZCBsb25nIG4pCiB7CkBAIC03MDksNiArODEzLDIxIEBACiAJcmV0dXJuIG47CiB9CiAKK3Vuc2lnbmVkIGxvbmcgX19jb3B5X2Zyb21fdXNlcl9sbF9ub2NhY2hlX25vemVybyh2b2lkICp0bywgY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sCisJCQkJCXVuc2lnbmVkIGxvbmcgbikKK3sKKwlCVUdfT04oKGxvbmcpbiA8IDApOworI2lmZGVmIENPTkZJR19YODZfSU5URUxfVVNFUkNPUFkKKwlpZiAoIG4gPiA2NCAmJiBjcHVfaGFzX3htbTIpCisgICAgICAgICAgICAgICAgbiA9IF9fY29weV91c2VyX2ludGVsX25vY2FjaGUodG8sIGZyb20sIG4pOworCWVsc2UKKwkJX19jb3B5X3VzZXIodG8sIGZyb20sIG4pOworI2Vsc2UKKyAgICAgICAgX19jb3B5X3VzZXIodG8sIGZyb20sIG4pOworI2VuZGlmCisJcmV0dXJuIG47Cit9CisKIC8qKgogICogY29weV90b191c2VyOiAtIENvcHkgYSBibG9jayBvZiBkYXRhIGludG8gdXNlciBzcGFjZS4KICAqIEB0bzogICBEZXN0aW5hdGlvbiBhZGRyZXNzLCBpbiB1c2VyIHNwYWNlLgpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21hY2gtZGVmYXVsdC9zZXR1cC5jIGIvYXJjaC9pMzg2L21hY2gtZGVmYXVsdC9zZXR1cC5jCmluZGV4IGI0YTc0NTUuLjAwNDgzN2MgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9tYWNoLWRlZmF1bHQvc2V0dXAuYworKysgYi9hcmNoL2kzODYvbWFjaC1kZWZhdWx0L3NldHVwLmMKQEAgLTgsNiArOCw4IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8YXNtL2FjcGkuaD4KICNpbmNsdWRlIDxhc20vYXJjaF9ob29rcy5oPgorI2luY2x1ZGUgPGFzbS9lODIwLmg+CisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAKICNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKICNkZWZpbmUgREVGQVVMVF9TRU5EX0lQSQkoMSkKQEAgLTEzMCwzICsxMzIsNDQgQEAKIH0KIAogbGF0ZV9pbml0Y2FsbChwcmludF9pcGlfbW9kZSk7CisKKy8qKgorICogbWFjaGluZV9zcGVjaWZpY19tZW1vcnlfc2V0dXAgLSBIb29rIGZvciBtYWNoaW5lIHNwZWNpZmljIG1lbW9yeSBzZXR1cC4KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgaXMgaW5jbHVkZWQgbGF0ZSBpbiBrZXJuZWwvc2V0dXAuYyBzbyB0aGF0IGl0IGNhbiBtYWtlCisgKgl1c2Ugb2YgYWxsIG9mIHRoZSBzdGF0aWMgZnVuY3Rpb25zLgorICoqLworCitjaGFyICogX19pbml0IG1hY2hpbmVfc3BlY2lmaWNfbWVtb3J5X3NldHVwKHZvaWQpCit7CisJY2hhciAqd2hvOworCisKKwl3aG8gPSAiQklPUy1lODIwIjsKKworCS8qCisJICogVHJ5IHRvIGNvcHkgdGhlIEJJT1Mtc3VwcGxpZWQgRTgyMC1tYXAuCisJICoKKwkgKiBPdGhlcndpc2UgZmFrZSBhIG1lbW9yeSBtYXA7IG9uZSBzZWN0aW9uIGZyb20gMGstPjY0MGssCisJICogdGhlIG5leHQgc2VjdGlvbiBmcm9tIDFtYi0+YXBwcm9wcmlhdGVfbWVtX2sKKwkgKi8KKwlzYW5pdGl6ZV9lODIwX21hcChFODIwX01BUCwgJkU4MjBfTUFQX05SKTsKKwlpZiAoY29weV9lODIwX21hcChFODIwX01BUCwgRTgyMF9NQVBfTlIpIDwgMCkgeworCQl1bnNpZ25lZCBsb25nIG1lbV9zaXplOworCisJCS8qIGNvbXBhcmUgcmVzdWx0cyBmcm9tIG90aGVyIG1ldGhvZHMgYW5kIHRha2UgdGhlIGdyZWF0ZXIgKi8KKwkJaWYgKEFMVF9NRU1fSyA8IEVYVF9NRU1fSykgeworCQkJbWVtX3NpemUgPSBFWFRfTUVNX0s7CisJCQl3aG8gPSAiQklPUy04OCI7CisJCX0gZWxzZSB7CisJCQltZW1fc2l6ZSA9IEFMVF9NRU1fSzsKKwkJCXdobyA9ICJCSU9TLWU4MDEiOworCQl9CisKKwkJZTgyMC5ucl9tYXAgPSAwOworCQlhZGRfbWVtb3J5X3JlZ2lvbigwLCBMT1dNRU1TSVpFKCksIEU4MjBfUkFNKTsKKwkJYWRkX21lbW9yeV9yZWdpb24oSElHSF9NRU1PUlksIG1lbV9zaXplIDw8IDEwLCBFODIwX1JBTSk7CisgIAl9CisJcmV0dXJuIHdobzsKK30KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tYWNoLXZpc3dzL3NldHVwLmMgYi9hcmNoL2kzODYvbWFjaC12aXN3cy9zZXR1cC5jCmluZGV4IDA3ZmFjN2UuLjhhOWUxYTYgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9tYWNoLXZpc3dzL3NldHVwLmMKKysrIGIvYXJjaC9pMzg2L21hY2gtdmlzd3Mvc2V0dXAuYwpAQCAtMTAsNiArMTAsOCBAQAogI2luY2x1ZGUgPGFzbS9maXhtYXAuaD4KICNpbmNsdWRlIDxhc20vYXJjaF9ob29rcy5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9lODIwLmg+CisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAjaW5jbHVkZSAiY29iYWx0LmgiCiAjaW5jbHVkZSAicGlpeDQuaCIKIApAQCAtMTMzLDMgKzEzNSw1MCBAQAogCS8qIFdpcmUgY3B1IElEVCBlbnRyeSB0byBzL3cgaGFuZGxlciAoYW5kIENvYmFsdCBBUElDIHRvIElEVCkgKi8KIAlzZXR1cF9pcnEoMCwgJmlycTApOwogfQorCisvKiBIb29rIGZvciBtYWNoaW5lIHNwZWNpZmljIG1lbW9yeSBzZXR1cC4gKi8KKworI2RlZmluZSBNQiAoMTAyNCAqIDEwMjQpCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHNnaXZ3ZmJfbWVtX3BoeXM7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBzZ2l2d2ZiX21lbV9zaXplOworCitsb25nIGxvbmcgbWVtX3NpemUgX19pbml0ZGF0YSA9IDA7CisKK2NoYXIgKiBfX2luaXQgbWFjaGluZV9zcGVjaWZpY19tZW1vcnlfc2V0dXAodm9pZCkKK3sKKwlsb25nIGxvbmcgZ2Z4X21lbV9zaXplID0gOCAqIE1COworCisJbWVtX3NpemUgPSBBTFRfTUVNX0s7CisKKwlpZiAoIW1lbV9zaXplKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkJvb3Rsb2FkZXIgZGlkbid0IHNldCBtZW1vcnkgc2l6ZSwgdXBncmFkZSBpdCAhXG4iKTsKKwkJbWVtX3NpemUgPSAxMjggKiBNQjsKKwl9CisKKwkvKgorCSAqIHRoaXMgaGFyZGNvZGVzIHRoZSBncmFwaGljcyBtZW1vcnkgdG8gOCBNQgorCSAqIGl0IHJlYWxseSBzaG91bGQgYmUgc2l6ZWQgZHluYW1pY2FsbHkgKG9yIGF0IGxlYXN0CisJICogc2V0IGFzIGEgYm9vdCBwYXJhbSkKKwkgKi8KKwlpZiAoIXNnaXZ3ZmJfbWVtX3NpemUpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiRGVmYXVsdGluZyB0byA4IE1CIGZyYW1lYnVmZmVyIHNpemVcbiIpOworCQlzZ2l2d2ZiX21lbV9zaXplID0gOCAqIE1COworCX0KKworCS8qCisJICogVHJpbSB0byBuZWFyZXN0IE1CCisJICovCisJc2dpdndmYl9tZW1fc2l6ZSAmPSB+KCgxIDw8IDIwKSAtIDEpOworCXNnaXZ3ZmJfbWVtX3BoeXMgPSBtZW1fc2l6ZSAtIGdmeF9tZW1fc2l6ZTsKKworCWFkZF9tZW1vcnlfcmVnaW9uKDAsIExPV01FTVNJWkUoKSwgRTgyMF9SQU0pOworCWFkZF9tZW1vcnlfcmVnaW9uKEhJR0hfTUVNT1JZLCBtZW1fc2l6ZSAtIHNnaXZ3ZmJfbWVtX3NpemUgLSBISUdIX01FTU9SWSwgRTgyMF9SQU0pOworCWFkZF9tZW1vcnlfcmVnaW9uKHNnaXZ3ZmJfbWVtX3BoeXMsIHNnaXZ3ZmJfbWVtX3NpemUsIEU4MjBfUkVTRVJWRUQpOworCisJcmV0dXJuICJQUk9NIjsKKworCS8qIFJlbW92ZSBnY2Mgd2FybmluZ3MgKi8KKwkodm9pZCkgc2FuaXRpemVfZTgyMF9tYXAoTlVMTCwgTlVMTCk7CisJKHZvaWQpIGNvcHlfZTgyMF9tYXAoTlVMTCwgMCk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbWFjaC12b3lhZ2VyL3NldHVwLmMgYi9hcmNoL2kzODYvbWFjaC12b3lhZ2VyL3NldHVwLmMKaW5kZXggN2Q4YTNhYy4uMGUyMjUwNSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L21hY2gtdm95YWdlci9zZXR1cC5jCisrKyBiL2FyY2gvaTM4Ni9tYWNoLXZveWFnZXIvc2V0dXAuYwpAQCAtNyw2ICs3LDkgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxhc20vYWNwaS5oPgogI2luY2x1ZGUgPGFzbS9hcmNoX2hvb2tzLmg+CisjaW5jbHVkZSA8YXNtL3ZveWFnZXIuaD4KKyNpbmNsdWRlIDxhc20vZTgyMC5oPgorI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgogCiB2b2lkIF9faW5pdCBwcmVfaW50cl9pbml0X2hvb2sodm9pZCkKIHsKQEAgLTQ1LDMgKzQ4LDc0IEBACiB7CiAJc2V0dXBfaXJxKDAsICZpcnEwKTsKIH0KKworLyogSG9vayBmb3IgbWFjaGluZSBzcGVjaWZpYyBtZW1vcnkgc2V0dXAuICovCisKK2NoYXIgKiBfX2luaXQgbWFjaGluZV9zcGVjaWZpY19tZW1vcnlfc2V0dXAodm9pZCkKK3sKKwljaGFyICp3aG87CisKKwl3aG8gPSAiTk9UIFZPWUFHRVIiOworCisJaWYodm95YWdlcl9sZXZlbCA9PSA1KSB7CisJCV9fdTMyIGFkZHIsIGxlbmd0aDsKKwkJaW50IGk7CisKKwkJd2hvID0gIlZveWFnZXItU1VTIjsKKworCQllODIwLm5yX21hcCA9IDA7CisJCWZvcihpPTA7IHZveWFnZXJfbWVtb3J5X2RldGVjdChpLCAmYWRkciwgJmxlbmd0aCk7IGkrKykgeworCQkJYWRkX21lbW9yeV9yZWdpb24oYWRkciwgbGVuZ3RoLCBFODIwX1JBTSk7CisJCX0KKwkJcmV0dXJuIHdobzsKKwl9IGVsc2UgaWYodm95YWdlcl9sZXZlbCA9PSA0KSB7CisJCV9fdTMyIHRvbTsKKwkJX191MTYgY2F0YmFzZSA9IGluYihWT1lBR0VSX1NTUEJfUkVMT0NBVElPTl9QT1JUKTw8ODsKKwkJLyogc2VsZWN0IHRoZSBESU5PIGNvbmZpZyBzcGFjZSAqLworCQlvdXRiKFZPWUFHRVJfRElOTywgVk9ZQUdFUl9DQVRfQ09ORklHX1BPUlQpOworCQkvKiBSZWFkIERJTk8gdG9wIG9mIG1lbW9yeSByZWdpc3RlciAqLworCQl0b20gPSAoKGluYihjYXRiYXNlICsgMHg0KSAmIDB4ZjApIDw8IDE2KQorCQkJKyAoKGluYihjYXRiYXNlICsgMHg1KSAmIDB4N2YpIDw8IDI0KTsKKworCQlpZihpbmIoY2F0YmFzZSkgIT0gVk9ZQUdFUl9ESU5PKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIlZveWFnZXI6IEZhaWxlZCB0byBnZXQgRElOTyBmb3IgTDQsIHNldHRpbmcgdG9tIHRvIEVYVF9NRU1fS1xuIik7CisJCQl0b20gPSAoRVhUX01FTV9LKTw8MTA7CisJCX0KKwkJd2hvID0gIlZveWFnZXItVE9NIjsKKwkJYWRkX21lbW9yeV9yZWdpb24oMCwgMHg5ZjAwMCwgRTgyMF9SQU0pOworCQkvKiBtYXAgZnJvbSAxTSB0byB0b3Agb2YgbWVtb3J5ICovCisJCWFkZF9tZW1vcnlfcmVnaW9uKDEqMTAyNCoxMDI0LCB0b20gLSAxKjEwMjQqMTAyNCwgRTgyMF9SQU0pOworCQkvKiBGSVhNRTogU2hvdWxkIGNoZWNrIHRoZSBBU0lDcyB0byBzZWUgaWYgSSBuZWVkIHRvCisJCSAqIHRha2Ugb3V0IHRoZSA4TSB3aW5kb3cuICBKdXN0IGRvIGl0IGF0IHRoZSBtb21lbnQKKwkJICogKi8KKwkJYWRkX21lbW9yeV9yZWdpb24oOCoxMDI0KjEwMjQsIDgqMTAyNCoxMDI0LCBFODIwX1JFU0VSVkVEKTsKKwkJcmV0dXJuIHdobzsKKwl9CisKKwl3aG8gPSAiQklPUy1lODIwIjsKKworCS8qCisJICogVHJ5IHRvIGNvcHkgdGhlIEJJT1Mtc3VwcGxpZWQgRTgyMC1tYXAuCisJICoKKwkgKiBPdGhlcndpc2UgZmFrZSBhIG1lbW9yeSBtYXA7IG9uZSBzZWN0aW9uIGZyb20gMGstPjY0MGssCisJICogdGhlIG5leHQgc2VjdGlvbiBmcm9tIDFtYi0+YXBwcm9wcmlhdGVfbWVtX2sKKwkgKi8KKwlzYW5pdGl6ZV9lODIwX21hcChFODIwX01BUCwgJkU4MjBfTUFQX05SKTsKKwlpZiAoY29weV9lODIwX21hcChFODIwX01BUCwgRTgyMF9NQVBfTlIpIDwgMCkgeworCQl1bnNpZ25lZCBsb25nIG1lbV9zaXplOworCisJCS8qIGNvbXBhcmUgcmVzdWx0cyBmcm9tIG90aGVyIG1ldGhvZHMgYW5kIHRha2UgdGhlIGdyZWF0ZXIgKi8KKwkJaWYgKEFMVF9NRU1fSyA8IEVYVF9NRU1fSykgeworCQkJbWVtX3NpemUgPSBFWFRfTUVNX0s7CisJCQl3aG8gPSAiQklPUy04OCI7CisJCX0gZWxzZSB7CisJCQltZW1fc2l6ZSA9IEFMVF9NRU1fSzsKKwkJCXdobyA9ICJCSU9TLWU4MDEiOworCQl9CisKKwkJZTgyMC5ucl9tYXAgPSAwOworCQlhZGRfbWVtb3J5X3JlZ2lvbigwLCBMT1dNRU1TSVpFKCksIEU4MjBfUkFNKTsKKwkJYWRkX21lbW9yeV9yZWdpb24oSElHSF9NRU1PUlksIG1lbV9zaXplIDw8IDEwLCBFODIwX1JBTSk7CisgIAl9CisJcmV0dXJuIHdobzsKK30KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tbS9mYXVsdC5jIGIvYXJjaC9pMzg2L21tL2ZhdWx0LmMKaW5kZXggYmQ2ZmU5Ni4uNmVlN2ZhYSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L21tL2ZhdWx0LmMKKysrIGIvYXJjaC9pMzg2L21tL2ZhdWx0LmMKQEAgLTMwLDYgKzMwLDQwIEBACiAKIGV4dGVybiB2b2lkIGRpZShjb25zdCBjaGFyICosc3RydWN0IHB0X3JlZ3MgKixsb25nKTsKIAorI2lmZGVmIENPTkZJR19LUFJPQkVTCitBVE9NSUNfTk9USUZJRVJfSEVBRChub3RpZnlfcGFnZV9mYXVsdF9jaGFpbik7CitpbnQgcmVnaXN0ZXJfcGFnZV9mYXVsdF9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKQoreworCXZtYWxsb2Nfc3luY19hbGwoKTsKKwlyZXR1cm4gYXRvbWljX25vdGlmaWVyX2NoYWluX3JlZ2lzdGVyKCZub3RpZnlfcGFnZV9mYXVsdF9jaGFpbiwgbmIpOworfQorCitpbnQgdW5yZWdpc3Rlcl9wYWdlX2ZhdWx0X25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpCit7CisJcmV0dXJuIGF0b21pY19ub3RpZmllcl9jaGFpbl91bnJlZ2lzdGVyKCZub3RpZnlfcGFnZV9mYXVsdF9jaGFpbiwgbmIpOworfQorCitzdGF0aWMgaW5saW5lIGludCBub3RpZnlfcGFnZV9mYXVsdChlbnVtIGRpZV92YWwgdmFsLCBjb25zdCBjaGFyICpzdHIsCisJCQlzdHJ1Y3QgcHRfcmVncyAqcmVncywgbG9uZyBlcnIsIGludCB0cmFwLCBpbnQgc2lnKQoreworCXN0cnVjdCBkaWVfYXJncyBhcmdzID0geworCQkucmVncyA9IHJlZ3MsCisJCS5zdHIgPSBzdHIsCisJCS5lcnIgPSBlcnIsCisJCS50cmFwbnIgPSB0cmFwLAorCQkuc2lnbnIgPSBzaWcKKwl9OworCXJldHVybiBhdG9taWNfbm90aWZpZXJfY2FsbF9jaGFpbigmbm90aWZ5X3BhZ2VfZmF1bHRfY2hhaW4sIHZhbCwgJmFyZ3MpOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IG5vdGlmeV9wYWdlX2ZhdWx0KGVudW0gZGllX3ZhbCB2YWwsIGNvbnN0IGNoYXIgKnN0ciwKKwkJCXN0cnVjdCBwdF9yZWdzICpyZWdzLCBsb25nIGVyciwgaW50IHRyYXAsIGludCBzaWcpCit7CisJcmV0dXJuIE5PVElGWV9ET05FOworfQorI2VuZGlmCisKKwogLyoKICAqIFVubG9jayBhbnkgc3BpbmxvY2tzIHdoaWNoIHdpbGwgcHJldmVudCB1cyBmcm9tIGdldHRpbmcgdGhlCiAgKiBtZXNzYWdlIG91dCAKQEAgLTMyNCw3ICszNTgsNyBAQAogCWlmICh1bmxpa2VseShhZGRyZXNzID49IFRBU0tfU0laRSkpIHsKIAkJaWYgKCEoZXJyb3JfY29kZSAmIDB4MDAwMDAwMGQpICYmIHZtYWxsb2NfZmF1bHQoYWRkcmVzcykgPj0gMCkKIAkJCXJldHVybjsKLQkJaWYgKG5vdGlmeV9kaWUoRElFX1BBR0VfRkFVTFQsICJwYWdlIGZhdWx0IiwgcmVncywgZXJyb3JfY29kZSwgMTQsCisJCWlmIChub3RpZnlfcGFnZV9mYXVsdChESUVfUEFHRV9GQVVMVCwgInBhZ2UgZmF1bHQiLCByZWdzLCBlcnJvcl9jb2RlLCAxNCwKIAkJCQkJCVNJR1NFR1YpID09IE5PVElGWV9TVE9QKQogCQkJcmV0dXJuOwogCQkvKgpAQCAtMzM0LDcgKzM2OCw3IEBACiAJCWdvdG8gYmFkX2FyZWFfbm9zZW1hcGhvcmU7CiAJfQogCi0JaWYgKG5vdGlmeV9kaWUoRElFX1BBR0VfRkFVTFQsICJwYWdlIGZhdWx0IiwgcmVncywgZXJyb3JfY29kZSwgMTQsCisJaWYgKG5vdGlmeV9wYWdlX2ZhdWx0KERJRV9QQUdFX0ZBVUxULCAicGFnZSBmYXVsdCIsIHJlZ3MsIGVycm9yX2NvZGUsIDE0LAogCQkJCQlTSUdTRUdWKSA9PSBOT1RJRllfU1RPUCkKIAkJcmV0dXJuOwogCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvb3Byb2ZpbGUvbm1pX2ludC5jIGIvYXJjaC9pMzg2L29wcm9maWxlL25taV9pbnQuYwppbmRleCBlYzBmZDNjLi5mYThhMzdiIDEwMDY0NAotLS0gYS9hcmNoL2kzODYvb3Byb2ZpbGUvbm1pX2ludC5jCisrKyBiL2FyY2gvaTM4Ni9vcHJvZmlsZS9ubWlfaW50LmMKQEAgLTI4MSw5ICsyODEsOSBAQAogCiAJZm9yIChpID0gMDsgaSA8IG1vZGVsLT5udW1fY291bnRlcnM7ICsraSkgewogCQlzdHJ1Y3QgZGVudHJ5ICogZGlyOwotCQljaGFyIGJ1ZlsyXTsKKwkJY2hhciBidWZbNF07CiAgCi0JCXNucHJpbnRmKGJ1ZiwgMiwgIiVkIiwgaSk7CisJCXNucHJpbnRmKGJ1ZiwgIHNpemVvZihidWYpLCAiJWQiLCBpKTsKIAkJZGlyID0gb3Byb2ZpbGVmc19ta2RpcihzYiwgcm9vdCwgYnVmKTsKIAkJb3Byb2ZpbGVmc19jcmVhdGVfdWxvbmcoc2IsIGRpciwgImVuYWJsZWQiLCAmY291bnRlcl9jb25maWdbaV0uZW5hYmxlZCk7IAogCQlvcHJvZmlsZWZzX2NyZWF0ZV91bG9uZyhzYiwgZGlyLCAiZXZlbnQiLCAmY291bnRlcl9jb25maWdbaV0uZXZlbnQpOyAKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9vcHJvZmlsZS9vcF9tb2RlbF9hdGhsb24uYyBiL2FyY2gvaTM4Ni9vcHJvZmlsZS9vcF9tb2RlbF9hdGhsb24uYwppbmRleCAzYWQ5YTcyLi42OTNiZGVhIDEwMDY0NAotLS0gYS9hcmNoL2kzODYvb3Byb2ZpbGUvb3BfbW9kZWxfYXRobG9uLmMKKysrIGIvYXJjaC9pMzg2L29wcm9maWxlL29wX21vZGVsX2F0aGxvbi5jCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgvb3Byb2ZpbGUuaD4KICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CiAjaW5jbHVkZSA8YXNtL21zci5oPgorI2luY2x1ZGUgPGFzbS9ubWkuaD4KICAKICNpbmNsdWRlICJvcF94ODZfbW9kZWwuaCIKICNpbmNsdWRlICJvcF9jb3VudGVyLmgiCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvb3Byb2ZpbGUvb3BfbW9kZWxfcDQuYyBiL2FyY2gvaTM4Ni9vcHJvZmlsZS9vcF9tb2RlbF9wNC5jCmluZGV4IGFjOGEwNjYuLjdjNjFkMzUgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9vcHJvZmlsZS9vcF9tb2RlbF9wNC5jCisrKyBiL2FyY2gvaTM4Ni9vcHJvZmlsZS9vcF9tb2RlbF9wNC5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgogI2luY2x1ZGUgPGFzbS9maXhtYXAuaD4KICNpbmNsdWRlIDxhc20vYXBpYy5oPgorI2luY2x1ZGUgPGFzbS9ubWkuaD4KIAogI2luY2x1ZGUgIm9wX3g4Nl9tb2RlbC5oIgogI2luY2x1ZGUgIm9wX2NvdW50ZXIuaCIKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9vcHJvZmlsZS9vcF9tb2RlbF9wcHJvLmMgYi9hcmNoL2kzODYvb3Byb2ZpbGUvb3BfbW9kZWxfcHByby5jCmluZGV4IGQ3MTkwMTUuLjVjM2FiNGIgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9vcHJvZmlsZS9vcF9tb2RlbF9wcHJvLmMKKysrIGIvYXJjaC9pMzg2L29wcm9maWxlL29wX21vZGVsX3Bwcm8uYwpAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KICNpbmNsdWRlIDxhc20vbXNyLmg+CiAjaW5jbHVkZSA8YXNtL2FwaWMuaD4KKyNpbmNsdWRlIDxhc20vbm1pLmg+CiAgCiAjaW5jbHVkZSAib3BfeDg2X21vZGVsLmgiCiAjaW5jbHVkZSAib3BfY291bnRlci5oIgpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L3BjaS9pMzg2LmMgYi9hcmNoL2kzODYvcGNpL2kzODYuYwppbmRleCA3ODUyODI3Li5hMTUxZjdhIDEwMDY0NAotLS0gYS9hcmNoL2kzODYvcGNpL2kzODYuYworKysgYi9hcmNoL2kzODYvcGNpL2kzODYuYwpAQCAtMjg1LDggKzI4NSw2IEBACiAJLyogTGVhdmUgdm1fcGdvZmYgYXMtaXMsIHRoZSBQQ0kgc3BhY2UgYWRkcmVzcyBpcyB0aGUgcGh5c2ljYWwKIAkgKiBhZGRyZXNzIG9uIHRoaXMgcGxhdGZvcm0uCiAJICovCi0Jdm1hLT52bV9mbGFncyB8PSAoVk1fU0hNIHwgVk1fTE9DS0VEIHwgVk1fSU8pOwotCiAJcHJvdCA9IHBncHJvdF92YWwodm1hLT52bV9wYWdlX3Byb3QpOwogCWlmIChib290X2NwdV9kYXRhLng4NiA+IDMpCiAJCXByb3QgfD0gX1BBR0VfUENEIHwgX1BBR0VfUFdUOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L3BjaS9wY2Jpb3MuYyBiL2FyY2gvaTM4Ni9wY2kvcGNiaW9zLmMKaW5kZXggMWVlYzA4Ni4uZWQxNTEyYSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L3BjaS9wY2Jpb3MuYworKysgYi9hcmNoL2kzODYvcGNpL3BjYmlvcy5jCkBAIC0zNzEsOCArMzcxLDcgQEAKIAkJCWxpc3RfZm9yX2VhY2gobG4sICZwY2lfZGV2aWNlcykgewogCQkJCWQgPSBwY2lfZGV2X2cobG4pOwogCQkJCWlmIChkLT5idXMtPm51bWJlciA9PSBidXMgJiYgZC0+ZGV2Zm4gPT0gZGV2Zm4pIHsKLQkJCQkJbGlzdF9kZWwoJmQtPmdsb2JhbF9saXN0KTsKLQkJCQkJbGlzdF9hZGRfdGFpbCgmZC0+Z2xvYmFsX2xpc3QsICZzb3J0ZWRfZGV2aWNlcyk7CisJCQkJCWxpc3RfbW92ZV90YWlsKCZkLT5nbG9iYWxfbGlzdCwgJnNvcnRlZF9kZXZpY2VzKTsKIAkJCQkJaWYgKGQgPT0gZGV2KQogCQkJCQkJZm91bmQgPSAxOwogCQkJCQlicmVhazsKQEAgLTM5MCw4ICszODksNyBAQAogCQlpZiAoIWZvdW5kKSB7CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICJQQ0k6IERldmljZSAlcyBub3QgZm91bmQgYnkgQklPU1xuIiwKIAkJCQlwY2lfbmFtZShkZXYpKTsKLQkJCWxpc3RfZGVsKCZkZXYtPmdsb2JhbF9saXN0KTsKLQkJCWxpc3RfYWRkX3RhaWwoJmRldi0+Z2xvYmFsX2xpc3QsICZzb3J0ZWRfZGV2aWNlcyk7CisJCQlsaXN0X21vdmVfdGFpbCgmZGV2LT5nbG9iYWxfbGlzdCwgJnNvcnRlZF9kZXZpY2VzKTsKIAkJfQogCX0KIAlsaXN0X3NwbGljZSgmc29ydGVkX2RldmljZXMsICZwY2lfZGV2aWNlcyk7CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvaWE2NC9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IDM1NWQ1NzkuLmIwNDVjMjcgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvcHJvY2Vzcy5jCkBAIC0yNzIsOSArMjcyLDkgQEAKIAkvKiBlbmRsZXNzIGlkbGUgbG9vcCB3aXRoIG5vIHByaW9yaXR5IGF0IGFsbCAqLwogCXdoaWxlICgxKSB7CiAJCWlmIChjYW5fZG9fcGFsX2hhbHQpCi0JCQljbGVhcl90aHJlYWRfZmxhZyhUSUZfUE9MTElOR19OUkZMQUcpOworCQkJY3VycmVudF90aHJlYWRfaW5mbygpLT5zdGF0dXMgJj0gflRTX1BPTExJTkc7CiAJCWVsc2UKLQkJCXNldF90aHJlYWRfZmxhZyhUSUZfUE9MTElOR19OUkZMQUcpOworCQkJY3VycmVudF90aHJlYWRfaW5mbygpLT5zdGF0dXMgfD0gVFNfUE9MTElORzsKIAogCQlpZiAoIW5lZWRfcmVzY2hlZCgpKSB7CiAJCQl2b2lkICgqaWRsZSkodm9pZCk7CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL3RvcG9sb2d5LmMgYi9hcmNoL2lhNjQva2VybmVsL3RvcG9sb2d5LmMKaW5kZXggNGYzYTE2Yi4uODc5ZWRiNSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC90b3BvbG9neS5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvdG9wb2xvZ3kuYwpAQCAtMTY2LDcgKzE2Niw3IEBACiAKIAludW1fc2hhcmVkID0gKGludCkgY3NpLm51bV9zaGFyZWQ7CiAJZG8gewotCQlmb3JfZWFjaF9jcHUoaikKKwkJZm9yX2VhY2hfcG9zc2libGVfY3B1KGopCiAJCQlpZiAoY3B1X2RhdGEoY3B1KS0+c29ja2V0X2lkID09IGNwdV9kYXRhKGopLT5zb2NrZXRfaWQKIAkJCQkmJiBjcHVfZGF0YShqKS0+Y29yZV9pZCA9PSBjc2kubG9nMV9jaWQKIAkJCQkmJiBjcHVfZGF0YShqKS0+dGhyZWFkX2lkID09IGNzaS5sb2cxX3RpZCkKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9tbS9mYXVsdC5jIGIvYXJjaC9pYTY0L21tL2ZhdWx0LmMKaW5kZXggZDk4ZWM0OS4uMTRlZjdjYyAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L21tL2ZhdWx0LmMKKysrIGIvYXJjaC9pYTY0L21tL2ZhdWx0LmMKQEAgLTE5LDYgKzE5LDQwIEBACiAKIGV4dGVybiB2b2lkIGRpZSAoY2hhciAqLCBzdHJ1Y3QgcHRfcmVncyAqLCBsb25nKTsKIAorI2lmZGVmIENPTkZJR19LUFJPQkVTCitBVE9NSUNfTk9USUZJRVJfSEVBRChub3RpZnlfcGFnZV9mYXVsdF9jaGFpbik7CisKKy8qIEhvb2sgdG8gcmVnaXN0ZXIgZm9yIHBhZ2UgZmF1bHQgbm90aWZpY2F0aW9ucyAqLworaW50IHJlZ2lzdGVyX3BhZ2VfZmF1bHRfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKK3sKKwlyZXR1cm4gYXRvbWljX25vdGlmaWVyX2NoYWluX3JlZ2lzdGVyKCZub3RpZnlfcGFnZV9mYXVsdF9jaGFpbiwgbmIpOworfQorCitpbnQgdW5yZWdpc3Rlcl9wYWdlX2ZhdWx0X25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpCit7CisJcmV0dXJuIGF0b21pY19ub3RpZmllcl9jaGFpbl91bnJlZ2lzdGVyKCZub3RpZnlfcGFnZV9mYXVsdF9jaGFpbiwgbmIpOworfQorCitzdGF0aWMgaW5saW5lIGludCBub3RpZnlfcGFnZV9mYXVsdChlbnVtIGRpZV92YWwgdmFsLCBjb25zdCBjaGFyICpzdHIsCisJCQlzdHJ1Y3QgcHRfcmVncyAqcmVncywgbG9uZyBlcnIsIGludCB0cmFwLCBpbnQgc2lnKQoreworCXN0cnVjdCBkaWVfYXJncyBhcmdzID0geworCQkucmVncyA9IHJlZ3MsCisJCS5zdHIgPSBzdHIsCisJCS5lcnIgPSBlcnIsCisJCS50cmFwbnIgPSB0cmFwLAorCQkuc2lnbnIgPSBzaWcKKwl9OworCXJldHVybiBhdG9taWNfbm90aWZpZXJfY2FsbF9jaGFpbigmbm90aWZ5X3BhZ2VfZmF1bHRfY2hhaW4sIHZhbCwgJmFyZ3MpOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IG5vdGlmeV9wYWdlX2ZhdWx0KGVudW0gZGllX3ZhbCB2YWwsIGNvbnN0IGNoYXIgKnN0ciwKKwkJCXN0cnVjdCBwdF9yZWdzICpyZWdzLCBsb25nIGVyciwgaW50IHRyYXAsIGludCBzaWcpCit7CisJcmV0dXJuIE5PVElGWV9ET05FOworfQorI2VuZGlmCisKIC8qCiAgKiBSZXR1cm4gVFJVRSBpZiBBRERSRVNTIHBvaW50cyBhdCBhIHBhZ2UgaW4gdGhlIGtlcm5lbCdzIG1hcHBlZCBzZWdtZW50CiAgKiAoaW5zaWRlIHJlZ2lvbiA1LCBvbiBpYTY0KSBhbmQgdGhhdCBwYWdlIGlzIHByZXNlbnQuCkBAIC04NCw3ICsxMTgsNyBAQAogCS8qCiAJICogVGhpcyBpcyB0byBoYW5kbGUgdGhlIGtwcm9iZXMgb24gdXNlciBzcGFjZSBhY2Nlc3MgaW5zdHJ1Y3Rpb25zCiAJICovCi0JaWYgKG5vdGlmeV9kaWUoRElFX1BBR0VfRkFVTFQsICJwYWdlIGZhdWx0IiwgcmVncywgY29kZSwgVFJBUF9CUktQVCwKKwlpZiAobm90aWZ5X3BhZ2VfZmF1bHQoRElFX1BBR0VfRkFVTFQsICJwYWdlIGZhdWx0IiwgcmVncywgY29kZSwgVFJBUF9CUktQVCwKIAkJCQkJU0lHU0VHVikgPT0gTk9USUZZX1NUT1ApCiAJCXJldHVybjsKIApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3BjaS9wY2kuYyBiL2FyY2gvaWE2NC9wY2kvcGNpLmMKaW5kZXggNjFkZDg2MC4uNzczNzVhNSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3BjaS9wY2kuYworKysgYi9hcmNoL2lhNjQvcGNpL3BjaS5jCkBAIC02MDIsOCArNjAyLDYgQEAKIAkgKiBMZWF2ZSB2bV9wZ29mZiBhcy1pcywgdGhlIFBDSSBzcGFjZSBhZGRyZXNzIGlzIHRoZSBwaHlzaWNhbAogCSAqIGFkZHJlc3Mgb24gdGhpcyBwbGF0Zm9ybS4KIAkgKi8KLQl2bWEtPnZtX2ZsYWdzIHw9IChWTV9TSE0gfCBWTV9SRVNFUlZFRCB8IFZNX0lPKTsKLQogCWlmICh3cml0ZV9jb21iaW5lICYmIGVmaV9yYW5nZV9pc193Yyh2bWEtPnZtX3N0YXJ0LAogCQkJCQkgICAgIHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCkpCiAJCXZtYS0+dm1fcGFnZV9wcm90ID0gcGdwcm90X3dyaXRlY29tYmluZSh2bWEtPnZtX3BhZ2VfcHJvdCk7CkBAIC02NjYsNyArNjY0LDYgQEAKIAogCXZtYS0+dm1fcGdvZmYgKz0gKHVuc2lnbmVkIGxvbmcpYWRkciA+PiBQQUdFX1NISUZUOwogCXZtYS0+dm1fcGFnZV9wcm90ID0gcHJvdDsKLQl2bWEtPnZtX2ZsYWdzIHw9IChWTV9TSE0gfCBWTV9SRVNFUlZFRCB8IFZNX0lPKTsKIAogCWlmIChyZW1hcF9wZm5fcmFuZ2Uodm1hLCB2bWEtPnZtX3N0YXJ0LCB2bWEtPnZtX3Bnb2ZmLAogCQkJICAgIHNpemUsIHZtYS0+dm1fcGFnZV9wcm90KSkKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9hbWlnYS9hbWlnYV9rc3ltcy5jIGIvYXJjaC9tNjhrL2FtaWdhL2FtaWdhX2tzeW1zLmMKaW5kZXggYjdiZDg0Yy4uOGYyZTA1OCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2FtaWdhL2FtaWdhX2tzeW1zLmMKKysrIGIvYXJjaC9tNjhrL2FtaWdhL2FtaWdhX2tzeW1zLmMKQEAgLTIzLDggKzIzLDYgQEAKIEVYUE9SVF9TWU1CT0woYW1pZ2FfY2hpcF9zaXplKTsKIEVYUE9SVF9TWU1CT0woYW1pZ2FfYXVkaW9fcGVyaW9kKTsKIEVYUE9SVF9TWU1CT0woYW1pZ2FfYXVkaW9fbWluX3BlcmlvZCk7Ci1FWFBPUlRfU1lNQk9MKGFtaWdhX2RvX2lycSk7Ci1FWFBPUlRfU1lNQk9MKGFtaWdhX2RvX2lycV9saXN0KTsKIAogI2lmZGVmIENPTkZJR19BTUlHQV9QQ01DSUEKICAgRVhQT1JUX1NZTUJPTChwY21jaWFfcmVzZXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2FtaWdhL2FtaWludHMuYyBiL2FyY2gvbTY4ay9hbWlnYS9hbWlpbnRzLmMKaW5kZXggYjBhYTYxYi4uZjk0MDNmNCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2FtaWdhL2FtaWludHMuYworKysgYi9hcmNoL202OGsvYW1pZ2EvYW1paW50cy5jCkBAIC0zNSw2MCArMzUsMjkgQEAKICAqICAgICAgICAgICAvSmVzCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAKLSNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS90cmFwcy5oPgogI2luY2x1ZGUgPGFzbS9hbWlnYWh3Lmg+CiAjaW5jbHVkZSA8YXNtL2FtaWdhaW50cy5oPgogI2luY2x1ZGUgPGFzbS9hbWlwY21jaWEuaD4KIAotZXh0ZXJuIGludCBjaWFfcmVxdWVzdF9pcnEoc3RydWN0IGNpYWJhc2UgKmJhc2UsaW50IGlycSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGlycXJldHVybl90ICgqaGFuZGxlcikoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFncywgY29uc3QgY2hhciAqZGV2bmFtZSwgdm9pZCAqZGV2X2lkKTsKLWV4dGVybiB2b2lkIGNpYV9mcmVlX2lycShzdHJ1Y3QgY2lhYmFzZSAqYmFzZSwgdW5zaWduZWQgaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKLWV4dGVybiB2b2lkIGNpYV9pbml0X0lSUShzdHJ1Y3QgY2lhYmFzZSAqYmFzZSk7Ci1leHRlcm4gaW50IGNpYV9nZXRfaXJxX2xpc3Qoc3RydWN0IGNpYWJhc2UgKmJhc2UsIHN0cnVjdCBzZXFfZmlsZSAqcCk7CitzdGF0aWMgdm9pZCBhbWlnYV9lbmFibGVfaXJxKHVuc2lnbmVkIGludCBpcnEpOworc3RhdGljIHZvaWQgYW1pZ2FfZGlzYWJsZV9pcnEodW5zaWduZWQgaW50IGlycSk7CitzdGF0aWMgaXJxcmV0dXJuX3QgYW1pX2ludDEoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqZnApOworc3RhdGljIGlycXJldHVybl90IGFtaV9pbnQzKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKmZwKTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBhbWlfaW50NChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpmcCk7CitzdGF0aWMgaXJxcmV0dXJuX3QgYW1pX2ludDUoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqZnApOwogCi0vKiBpcnEgbm9kZSB2YXJpYWJsZXMgZm9yIGFtaWdhIGludGVycnVwdCBzb3VyY2VzICovCi1zdGF0aWMgaXJxX25vZGVfdCAqYW1pX2lycV9saXN0W0FNSV9TVERfSVJRU107Ci0KLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCBhbWlnYV9pbnRlbmFfdmFsc1tBTUlfU1REX0lSUVNdID0gewotCVtJUlFfQU1JR0FfVkVSVEJdCT0gSUZfVkVSVEIsCi0JW0lSUV9BTUlHQV9DT1BQRVJdCT0gSUZfQ09QRVIsCi0JW0lSUV9BTUlHQV9BVUQwXQk9IElGX0FVRDAsCi0JW0lSUV9BTUlHQV9BVUQxXQk9IElGX0FVRDEsCi0JW0lSUV9BTUlHQV9BVUQyXQk9IElGX0FVRDIsCi0JW0lSUV9BTUlHQV9BVUQzXQk9IElGX0FVRDMsCi0JW0lSUV9BTUlHQV9CTElUXQk9IElGX0JMSVQsCi0JW0lSUV9BTUlHQV9EU0tTWU5dCT0gSUZfRFNLU1lOLAotCVtJUlFfQU1JR0FfRFNLQkxLXQk9IElGX0RTS0JMSywKLQlbSVJRX0FNSUdBX1JCRl0JCT0gSUZfUkJGLAotCVtJUlFfQU1JR0FfVEJFXQkJPSBJRl9UQkUsCi0JW0lSUV9BTUlHQV9TT0ZUXQk9IElGX1NPRlQsCi0JW0lSUV9BTUlHQV9QT1JUU10JPSBJRl9QT1JUUywKLQlbSVJRX0FNSUdBX0VYVEVSXQk9IElGX0VYVEVSCitzdGF0aWMgc3RydWN0IGlycV9jb250cm9sbGVyIGFtaWdhX2lycV9jb250cm9sbGVyID0geworCS5uYW1lCQk9ICJhbWlnYSIsCisJLmxvY2sJCT0gU1BJTl9MT0NLX1VOTE9DS0VELAorCS5lbmFibGUJCT0gYW1pZ2FfZW5hYmxlX2lycSwKKwkuZGlzYWJsZQk9IGFtaWdhX2Rpc2FibGVfaXJxLAogfTsKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGFtaV9zZXJ2ZXJzW0FNSV9TVERfSVJRU10gPSB7Ci0JW0lSUV9BTUlHQV9WRVJUQl0JPSAxLAotCVtJUlFfQU1JR0FfUE9SVFNdCT0gMSwKLQlbSVJRX0FNSUdBX0VYVEVSXQk9IDEKLX07Ci0KLXN0YXRpYyBzaG9ydCBhbWlfYWJsZWNvdW50W0FNSV9JUlFTXTsKLQotc3RhdGljIGlycXJldHVybl90IGFtaV9iYWRpbnQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqZnApCi17Ci0JbnVtX3NwdXJpb3VzICs9IDE7Ci0JcmV0dXJuIElSUV9OT05FOwotfQogCiAvKgogICogdm9pZCBhbWlnYV9pbml0X0lSUSh2b2lkKQpAQCAtMTAzLDIzICs3MiwxMiBAQAogCiB2b2lkIF9faW5pdCBhbWlnYV9pbml0X0lSUSh2b2lkKQogewotCWludCBpOworCXJlcXVlc3RfaXJxKElSUV9BVVRPXzEsIGFtaV9pbnQxLCAwLCAiaW50MSIsIE5VTEwpOworCXJlcXVlc3RfaXJxKElSUV9BVVRPXzMsIGFtaV9pbnQzLCAwLCAiaW50MyIsIE5VTEwpOworCXJlcXVlc3RfaXJxKElSUV9BVVRPXzQsIGFtaV9pbnQ0LCAwLCAiaW50NCIsIE5VTEwpOworCXJlcXVlc3RfaXJxKElSUV9BVVRPXzUsIGFtaV9pbnQ1LCAwLCAiaW50NSIsIE5VTEwpOwogCi0JLyogaW5pdGlhbGl6ZSBoYW5kbGVycyAqLwotCWZvciAoaSA9IDA7IGkgPCBBTUlfU1REX0lSUVM7IGkrKykgewotCQlpZiAoYW1pX3NlcnZlcnNbaV0pIHsKLQkJCWFtaV9pcnFfbGlzdFtpXSA9IE5VTEw7Ci0JCX0gZWxzZSB7Ci0JCQlhbWlfaXJxX2xpc3RbaV0gPSBuZXdfaXJxX25vZGUoKTsKLQkJCWFtaV9pcnFfbGlzdFtpXS0+aGFuZGxlciA9IGFtaV9iYWRpbnQ7Ci0JCQlhbWlfaXJxX2xpc3RbaV0tPmZsYWdzICAgPSAwOwotCQkJYW1pX2lycV9saXN0W2ldLT5kZXZfaWQgID0gTlVMTDsKLQkJCWFtaV9pcnFfbGlzdFtpXS0+ZGV2bmFtZSA9IE5VTEw7Ci0JCQlhbWlfaXJxX2xpc3RbaV0tPm5leHQgICAgPSBOVUxMOwotCQl9Ci0JfQotCWZvciAoaSA9IDA7IGkgPCBBTUlfSVJRUzsgaSsrKQotCQlhbWlfYWJsZWNvdW50W2ldID0gMDsKKwltNjhrX3NldHVwX2lycV9jb250cm9sbGVyKCZhbWlnYV9pcnFfY29udHJvbGxlciwgSVJRX1VTRVIsIEFNSV9TVERfSVJRUyk7CiAKIAkvKiB0dXJuIG9mZiBQQ01DSUEgaW50ZXJydXB0cyAqLwogCWlmIChBTUlHQUhXX1BSRVNFTlQoUENNQ0lBKSkKQEAgLTEzNCwyNDkgKzkyLDIxIEBACiAJY2lhX2luaXRfSVJRKCZjaWFiX2Jhc2UpOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBhbWlnYV9pbnNlcnRfaXJxKGlycV9ub2RlX3QgKipsaXN0LCBpcnFfbm9kZV90ICpub2RlKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaXJxX25vZGVfdCAqY3VyOwotCi0JaWYgKCFub2RlLT5kZXZfaWQpCi0JCXByaW50aygiJXM6IFdhcm5pbmc6IGRldl9pZCBvZiAlcyBpcyB6ZXJvXG4iLAotCQkgICAgICAgX19GVU5DVElPTl9fLCBub2RlLT5kZXZuYW1lKTsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQotCWN1ciA9ICpsaXN0OwotCi0JaWYgKG5vZGUtPmZsYWdzICYgU0FfSU5URVJSVVBUKSB7Ci0JCWlmIChub2RlLT5mbGFncyAmIFNBX1NISVJRKQotCQkJcmV0dXJuIC1FQlVTWTsKLQkJLyoKLQkJICogVGhlcmUgc2hvdWxkIG5ldmVyIGJlIG1vcmUgdGhhbiBvbmUKLQkJICovCi0JCXdoaWxlIChjdXIgJiYgY3VyLT5mbGFncyAmIFNBX0lOVEVSUlVQVCkgewotCQkJbGlzdCA9ICZjdXItPm5leHQ7Ci0JCQljdXIgPSBjdXItPm5leHQ7Ci0JCX0KLQl9IGVsc2UgewotCQl3aGlsZSAoY3VyKSB7Ci0JCQlsaXN0ID0gJmN1ci0+bmV4dDsKLQkJCWN1ciA9IGN1ci0+bmV4dDsKLQkJfQotCX0KLQotCW5vZGUtPm5leHQgPSBjdXI7Ci0JKmxpc3QgPSBub2RlOwotCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgYW1pZ2FfZGVsZXRlX2lycShpcnFfbm9kZV90ICoqbGlzdCwgdm9pZCAqZGV2X2lkKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaXJxX25vZGVfdCAqbm9kZTsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQotCWZvciAobm9kZSA9ICpsaXN0OyBub2RlOyBsaXN0ID0gJm5vZGUtPm5leHQsIG5vZGUgPSAqbGlzdCkgewotCQlpZiAobm9kZS0+ZGV2X2lkID09IGRldl9pZCkgewotCQkJKmxpc3QgPSBub2RlLT5uZXh0OwotCQkJLyogTWFyayBpdCBhcyBmcmVlLiAqLwotCQkJbm9kZS0+aGFuZGxlciA9IE5VTEw7Ci0JCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCXByaW50ayAoIiVzOiB0cmllZCB0byByZW1vdmUgaW52YWxpZCBpcnFcbiIsIF9fRlVOQ1RJT05fXyk7Ci19Ci0KLS8qCi0gKiBhbWlnYV9yZXF1ZXN0X2lycSA6IGFkZCBhbiBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lIGZvciBhIHBhcnRpY3VsYXIKLSAqICAgICAgICAgICAgICAgICAgICAgbWFjaGluZSBzcGVjaWZpYyBpbnRlcnJ1cHQgc291cmNlLgotICogICAgICAgICAgICAgICAgICAgICBJZiB0aGUgYWRkaXRpb24gd2FzIHN1Y2Nlc3NmdWwsIGl0IHJldHVybnMgMC4KLSAqLwotCi1pbnQgYW1pZ2FfcmVxdWVzdF9pcnEodW5zaWduZWQgaW50IGlycSwKLQkJICAgICAgaXJxcmV0dXJuX3QgKCpoYW5kbGVyKShpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKiksCi0gICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFncywgY29uc3QgY2hhciAqZGV2bmFtZSwgdm9pZCAqZGV2X2lkKQotewotCWlycV9ub2RlX3QgKm5vZGU7Ci0JaW50IGVycm9yID0gMDsKLQotCWlmIChpcnEgPj0gQU1JX0lSUVMpIHsKLQkJcHJpbnRrICgiJXM6IFVua25vd24gSVJRICVkIGZyb20gJXNcbiIsIF9fRlVOQ1RJT05fXywKLQkJCWlycSwgZGV2bmFtZSk7Ci0JCXJldHVybiAtRU5YSU87Ci0JfQotCi0JaWYgKGlycSA+PSBJUlFfQU1JR0FfQVVUTykKLQkJcmV0dXJuIGNwdV9yZXF1ZXN0X2lycShpcnEgLSBJUlFfQU1JR0FfQVVUTywgaGFuZGxlciwKLQkJICAgICAgICAgICAgICAgICAgICAgICBmbGFncywgZGV2bmFtZSwgZGV2X2lkKTsKLQotCWlmIChpcnEgPj0gSVJRX0FNSUdBX0NJQUIpCi0JCXJldHVybiBjaWFfcmVxdWVzdF9pcnEoJmNpYWJfYmFzZSwgaXJxIC0gSVJRX0FNSUdBX0NJQUIsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlciwgZmxhZ3MsIGRldm5hbWUsIGRldl9pZCk7Ci0KLQlpZiAoaXJxID49IElSUV9BTUlHQV9DSUFBKQotCQlyZXR1cm4gY2lhX3JlcXVlc3RfaXJxKCZjaWFhX2Jhc2UsIGlycSAtIElSUV9BTUlHQV9DSUFBLAotCQkgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIsIGZsYWdzLCBkZXZuYW1lLCBkZXZfaWQpOwotCi0JLyoKLQkgKiBJUlFfQU1JR0FfUE9SVFMgJiBJUlFfQU1JR0FfRVhURVIgZGVmYXVsdHMgdG8gc2hhcmVkLAotCSAqIHdlIGNvdWxkIGFkZCBhIGNoZWNrIGhlcmUgZm9yIHRoZSBTQV9TSElSUSBmbGFnIGJ1dCBhbGwgZHJpdmVycwotCSAqIHNob3VsZCBiZSBhd2FyZSBvZiBzaGFyaW5nIGFueXdheS4KLQkgKi8KLQlpZiAoYW1pX3NlcnZlcnNbaXJxXSkgewotCQlpZiAoIShub2RlID0gbmV3X2lycV9ub2RlKCkpKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCW5vZGUtPmhhbmRsZXIgPSBoYW5kbGVyOwotCQlub2RlLT5mbGFncyAgID0gZmxhZ3M7Ci0JCW5vZGUtPmRldl9pZCAgPSBkZXZfaWQ7Ci0JCW5vZGUtPmRldm5hbWUgPSBkZXZuYW1lOwotCQlub2RlLT5uZXh0ICAgID0gTlVMTDsKLQkJZXJyb3IgPSBhbWlnYV9pbnNlcnRfaXJxKCZhbWlfaXJxX2xpc3RbaXJxXSwgbm9kZSk7Ci0JfSBlbHNlIHsKLQkJYW1pX2lycV9saXN0W2lycV0tPmhhbmRsZXIgPSBoYW5kbGVyOwotCQlhbWlfaXJxX2xpc3RbaXJxXS0+ZmxhZ3MgICA9IGZsYWdzOwotCQlhbWlfaXJxX2xpc3RbaXJxXS0+ZGV2X2lkICA9IGRldl9pZDsKLQkJYW1pX2lycV9saXN0W2lycV0tPmRldm5hbWUgPSBkZXZuYW1lOwotCX0KLQotCS8qIGVuYWJsZSB0aGUgaW50ZXJydXB0ICovCi0JaWYgKGlycSA8IElSUV9BTUlHQV9QT1JUUyAmJiAhYW1pX2FibGVjb3VudFtpcnFdKQotCQlhbWlnYV9jdXN0b20uaW50ZW5hID0gSUZfU0VUQ0xSIHwgYW1pZ2FfaW50ZW5hX3ZhbHNbaXJxXTsKLQotCXJldHVybiBlcnJvcjsKLX0KLQotdm9pZCBhbWlnYV9mcmVlX2lycSh1bnNpZ25lZCBpbnQgaXJxLCB2b2lkICpkZXZfaWQpCi17Ci0JaWYgKGlycSA+PSBBTUlfSVJRUykgewotCQlwcmludGsgKCIlczogVW5rbm93biBJUlEgJWRcbiIsIF9fRlVOQ1RJT05fXywgaXJxKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChpcnEgPj0gSVJRX0FNSUdBX0FVVE8pCi0JCWNwdV9mcmVlX2lycShpcnEgLSBJUlFfQU1JR0FfQVVUTywgZGV2X2lkKTsKLQotCWlmIChpcnEgPj0gSVJRX0FNSUdBX0NJQUIpIHsKLQkJY2lhX2ZyZWVfaXJxKCZjaWFiX2Jhc2UsIGlycSAtIElSUV9BTUlHQV9DSUFCLCBkZXZfaWQpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKGlycSA+PSBJUlFfQU1JR0FfQ0lBQSkgewotCQljaWFfZnJlZV9pcnEoJmNpYWFfYmFzZSwgaXJxIC0gSVJRX0FNSUdBX0NJQUEsIGRldl9pZCk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoYW1pX3NlcnZlcnNbaXJxXSkgewotCQlhbWlnYV9kZWxldGVfaXJxKCZhbWlfaXJxX2xpc3RbaXJxXSwgZGV2X2lkKTsKLQkJLyogaWYgc2VydmVyIGxpc3QgZW1wdHksIGRpc2FibGUgdGhlIGludGVycnVwdCAqLwotCQlpZiAoIWFtaV9pcnFfbGlzdFtpcnFdICYmIGlycSA8IElSUV9BTUlHQV9QT1JUUykKLQkJCWFtaWdhX2N1c3RvbS5pbnRlbmEgPSBhbWlnYV9pbnRlbmFfdmFsc1tpcnFdOwotCX0gZWxzZSB7Ci0JCWlmIChhbWlfaXJxX2xpc3RbaXJxXS0+ZGV2X2lkICE9IGRldl9pZCkKLQkJCXByaW50aygiJXM6IHJlbW92aW5nIHByb2JhYmx5IHdyb25nIElSUSAlZCBmcm9tICVzXG4iLAotCQkJICAgICAgIF9fRlVOQ1RJT05fXywgaXJxLCBhbWlfaXJxX2xpc3RbaXJxXS0+ZGV2bmFtZSk7Ci0JCWFtaV9pcnFfbGlzdFtpcnFdLT5oYW5kbGVyID0gYW1pX2JhZGludDsKLQkJYW1pX2lycV9saXN0W2lycV0tPmZsYWdzICAgPSAwOwotCQlhbWlfaXJxX2xpc3RbaXJxXS0+ZGV2X2lkICA9IE5VTEw7Ci0JCWFtaV9pcnFfbGlzdFtpcnFdLT5kZXZuYW1lID0gTlVMTDsKLQkJYW1pZ2FfY3VzdG9tLmludGVuYSA9IGFtaWdhX2ludGVuYV92YWxzW2lycV07Ci0JfQotfQotCiAvKgogICogRW5hYmxlL2Rpc2FibGUgYSBwYXJ0aWN1bGFyIG1hY2hpbmUgc3BlY2lmaWMgaW50ZXJydXB0IHNvdXJjZS4KICAqIE5vdGUgdGhhdCB0aGlzIG1heSBhZmZlY3Qgb3RoZXIgaW50ZXJydXB0cyBpbiBjYXNlIG9mIGEgc2hhcmVkIGludGVycnVwdC4KICAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGZvciBhIF92ZXJ5XyBzaG9ydCB0aW1lIHRvIGNoYW5nZSBzb21lCiAgKiBpbnRlcm5hbCBkYXRhLCB0aGF0IG1heSBub3QgYmUgY2hhbmdlZCBieSB0aGUgaW50ZXJydXB0IGF0IHRoZSBzYW1lIHRpbWUuCi0gKiBhbWlfKGVuYWJsZXxkaXNhYmxlKV9pcnEgY2FsbHMgbWF5IGFsc28gYmUgbmVzdGVkLgogICovCiAKLXZvaWQgYW1pZ2FfZW5hYmxlX2lycSh1bnNpZ25lZCBpbnQgaXJxKQorc3RhdGljIHZvaWQgYW1pZ2FfZW5hYmxlX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewotCWlmIChpcnEgPj0gQU1JX0lSUVMpIHsKLQkJcHJpbnRrKCIlczogVW5rbm93biBJUlEgJWRcbiIsIF9fRlVOQ1RJT05fXywgaXJxKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmICgtLWFtaV9hYmxlY291bnRbaXJxXSkKLQkJcmV0dXJuOwotCi0JLyogTm8gYWN0aW9uIGZvciBhdXRvLXZlY3RvciBpbnRlcnJ1cHRzICovCi0JaWYgKGlycSA+PSBJUlFfQU1JR0FfQVVUTyl7Ci0JCXByaW50aygiJXM6IFRyeWluZyB0byBlbmFibGUgYXV0by12ZWN0b3IgSVJRICVpXG4iLAotCQkgICAgICAgX19GVU5DVElPTl9fLCBpcnEgLSBJUlFfQU1JR0FfQVVUTyk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoaXJxID49IElSUV9BTUlHQV9DSUFCKSB7Ci0JCWNpYV9zZXRfaXJxKCZjaWFiX2Jhc2UsICgxIDw8IChpcnEgLSBJUlFfQU1JR0FfQ0lBQikpKTsKLQkJY2lhX2FibGVfaXJxKCZjaWFiX2Jhc2UsIENJQV9JQ1JfU0VUQ0xSIHwKLQkJICAgICAgICAgICAgICgxIDw8IChpcnEgLSBJUlFfQU1JR0FfQ0lBQikpKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChpcnEgPj0gSVJRX0FNSUdBX0NJQUEpIHsKLQkJY2lhX3NldF9pcnEoJmNpYWFfYmFzZSwgKDEgPDwgKGlycSAtIElSUV9BTUlHQV9DSUFBKSkpOwotCQljaWFfYWJsZV9pcnEoJmNpYWFfYmFzZSwgQ0lBX0lDUl9TRVRDTFIgfAotCQkgICAgICAgICAgICAgKDEgPDwgKGlycSAtIElSUV9BTUlHQV9DSUFBKSkpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogZW5hYmxlIHRoZSBpbnRlcnJ1cHQgKi8KLQlhbWlnYV9jdXN0b20uaW50ZW5hID0gSUZfU0VUQ0xSIHwgYW1pZ2FfaW50ZW5hX3ZhbHNbaXJxXTsKKwlhbWlnYV9jdXN0b20uaW50ZW5hID0gSUZfU0VUQ0xSIHwgKDEgPDwgKGlycSAtIElSUV9VU0VSKSk7CiB9CiAKLXZvaWQgYW1pZ2FfZGlzYWJsZV9pcnEodW5zaWduZWQgaW50IGlycSkKK3N0YXRpYyB2b2lkIGFtaWdhX2Rpc2FibGVfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0JaWYgKGlycSA+PSBBTUlfSVJRUykgewotCQlwcmludGsoIiVzOiBVbmtub3duIElSUSAlZFxuIiwgX19GVU5DVElPTl9fLCBpcnEpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKGFtaV9hYmxlY291bnRbaXJxXSsrKQotCQlyZXR1cm47Ci0KLQkvKiBObyBhY3Rpb24gZm9yIGF1dG8tdmVjdG9yIGludGVycnVwdHMgKi8KLQlpZiAoaXJxID49IElSUV9BTUlHQV9BVVRPKSB7Ci0JCXByaW50aygiJXM6IFRyeWluZyB0byBkaXNhYmxlIGF1dG8tdmVjdG9yIElSUSAlaVxuIiwKLQkJICAgICAgIF9fRlVOQ1RJT05fXywgaXJxIC0gSVJRX0FNSUdBX0FVVE8pOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKGlycSA+PSBJUlFfQU1JR0FfQ0lBQikgewotCQljaWFfYWJsZV9pcnEoJmNpYWJfYmFzZSwgMSA8PCAoaXJxIC0gSVJRX0FNSUdBX0NJQUIpKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChpcnEgPj0gSVJRX0FNSUdBX0NJQUEpIHsKLQkJY2lhX2FibGVfaXJxKCZjaWFhX2Jhc2UsIDEgPDwgKGlycSAtIElSUV9BTUlHQV9DSUFBKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBkaXNhYmxlIHRoZSBpbnRlcnJ1cHQgKi8KLQlhbWlnYV9jdXN0b20uaW50ZW5hID0gYW1pZ2FfaW50ZW5hX3ZhbHNbaXJxXTsKLX0KLQotaW5saW5lIHZvaWQgYW1pZ2FfZG9faXJxKGludCBpcnEsIHN0cnVjdCBwdF9yZWdzICpmcCkKLXsKLQlrc3RhdF9jcHUoMCkuaXJxc1tTWVNfSVJRUyArIGlycV0rKzsKLQlhbWlfaXJxX2xpc3RbaXJxXS0+aGFuZGxlcihpcnEsIGFtaV9pcnFfbGlzdFtpcnFdLT5kZXZfaWQsIGZwKTsKLX0KLQotdm9pZCBhbWlnYV9kb19pcnFfbGlzdChpbnQgaXJxLCBzdHJ1Y3QgcHRfcmVncyAqZnApCi17Ci0JaXJxX25vZGVfdCAqbm9kZTsKLQotCWtzdGF0X2NwdSgwKS5pcnFzW1NZU19JUlFTICsgaXJxXSsrOwotCi0JYW1pZ2FfY3VzdG9tLmludHJlcSA9IGFtaWdhX2ludGVuYV92YWxzW2lycV07Ci0KLQlmb3IgKG5vZGUgPSBhbWlfaXJxX2xpc3RbaXJxXTsgbm9kZTsgbm9kZSA9IG5vZGUtPm5leHQpCi0JCW5vZGUtPmhhbmRsZXIoaXJxLCBub2RlLT5kZXZfaWQsIGZwKTsKKwlhbWlnYV9jdXN0b20uaW50ZW5hID0gMSA8PCAoaXJxIC0gSVJRX1VTRVIpOwogfQogCiAvKgpAQCAtMzkwLDE5ICsxMjAsMTkgQEAKIAkvKiBpZiBzZXJpYWwgdHJhbnNtaXQgYnVmZmVyIGVtcHR5LCBpbnRlcnJ1cHQgKi8KIAlpZiAoaW50cyAmIElGX1RCRSkgewogCQlhbWlnYV9jdXN0b20uaW50cmVxID0gSUZfVEJFOwotCQlhbWlnYV9kb19pcnEoSVJRX0FNSUdBX1RCRSwgZnApOworCQltNjhrX2hhbmRsZV9pbnQoSVJRX0FNSUdBX1RCRSwgZnApOwogCX0KIAogCS8qIGlmIGZsb3BweSBkaXNrIHRyYW5zZmVyIGNvbXBsZXRlLCBpbnRlcnJ1cHQgKi8KIAlpZiAoaW50cyAmIElGX0RTS0JMSykgewogCQlhbWlnYV9jdXN0b20uaW50cmVxID0gSUZfRFNLQkxLOwotCQlhbWlnYV9kb19pcnEoSVJRX0FNSUdBX0RTS0JMSywgZnApOworCQltNjhrX2hhbmRsZV9pbnQoSVJRX0FNSUdBX0RTS0JMSywgZnApOwogCX0KIAogCS8qIGlmIHNvZnR3YXJlIGludGVycnVwdCBzZXQsIGludGVycnVwdCAqLwogCWlmIChpbnRzICYgSUZfU09GVCkgewogCQlhbWlnYV9jdXN0b20uaW50cmVxID0gSUZfU09GVDsKLQkJYW1pZ2FfZG9faXJxKElSUV9BTUlHQV9TT0ZULCBmcCk7CisJCW02OGtfaGFuZGxlX2ludChJUlFfQU1JR0FfU09GVCwgZnApOwogCX0KIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CkBAIC00MTQsMTggKzE0NCwyMCBAQAogCS8qIGlmIGEgYmxpdHRlciBpbnRlcnJ1cHQgKi8KIAlpZiAoaW50cyAmIElGX0JMSVQpIHsKIAkJYW1pZ2FfY3VzdG9tLmludHJlcSA9IElGX0JMSVQ7Ci0JCWFtaWdhX2RvX2lycShJUlFfQU1JR0FfQkxJVCwgZnApOworCQltNjhrX2hhbmRsZV9pbnQoSVJRX0FNSUdBX0JMSVQsIGZwKTsKIAl9CiAKIAkvKiBpZiBhIGNvcHBlciBpbnRlcnJ1cHQgKi8KIAlpZiAoaW50cyAmIElGX0NPUEVSKSB7CiAJCWFtaWdhX2N1c3RvbS5pbnRyZXEgPSBJRl9DT1BFUjsKLQkJYW1pZ2FfZG9faXJxKElSUV9BTUlHQV9DT1BQRVIsIGZwKTsKKwkJbTY4a19oYW5kbGVfaW50KElSUV9BTUlHQV9DT1BQRVIsIGZwKTsKIAl9CiAKIAkvKiBpZiBhIHZlcnRpY2FsIGJsYW5rIGludGVycnVwdCAqLwotCWlmIChpbnRzICYgSUZfVkVSVEIpCi0JCWFtaWdhX2RvX2lycV9saXN0KElSUV9BTUlHQV9WRVJUQiwgZnApOworCWlmIChpbnRzICYgSUZfVkVSVEIpIHsKKwkJYW1pZ2FfY3VzdG9tLmludHJlcSA9IElGX1ZFUlRCOworCQltNjhrX2hhbmRsZV9pbnQoSVJRX0FNSUdBX1ZFUlRCLCBmcCk7CisJfQogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIApAQCAtNDM2LDI1ICsxNjgsMjUgQEAKIAkvKiBpZiBhdWRpbyAwIGludGVycnVwdCAqLwogCWlmIChpbnRzICYgSUZfQVVEMCkgewogCQlhbWlnYV9jdXN0b20uaW50cmVxID0gSUZfQVVEMDsKLQkJYW1pZ2FfZG9faXJxKElSUV9BTUlHQV9BVUQwLCBmcCk7CisJCW02OGtfaGFuZGxlX2ludChJUlFfQU1JR0FfQVVEMCwgZnApOwogCX0KIAogCS8qIGlmIGF1ZGlvIDEgaW50ZXJydXB0ICovCiAJaWYgKGludHMgJiBJRl9BVUQxKSB7CiAJCWFtaWdhX2N1c3RvbS5pbnRyZXEgPSBJRl9BVUQxOwotCQlhbWlnYV9kb19pcnEoSVJRX0FNSUdBX0FVRDEsIGZwKTsKKwkJbTY4a19oYW5kbGVfaW50KElSUV9BTUlHQV9BVUQxLCBmcCk7CiAJfQogCiAJLyogaWYgYXVkaW8gMiBpbnRlcnJ1cHQgKi8KIAlpZiAoaW50cyAmIElGX0FVRDIpIHsKIAkJYW1pZ2FfY3VzdG9tLmludHJlcSA9IElGX0FVRDI7Ci0JCWFtaWdhX2RvX2lycShJUlFfQU1JR0FfQVVEMiwgZnApOworCQltNjhrX2hhbmRsZV9pbnQoSVJRX0FNSUdBX0FVRDIsIGZwKTsKIAl9CiAKIAkvKiBpZiBhdWRpbyAzIGludGVycnVwdCAqLwogCWlmIChpbnRzICYgSUZfQVVEMykgewogCQlhbWlnYV9jdXN0b20uaW50cmVxID0gSUZfQVVEMzsKLQkJYW1pZ2FfZG9faXJxKElSUV9BTUlHQV9BVUQzLCBmcCk7CisJCW02OGtfaGFuZGxlX2ludChJUlFfQU1JR0FfQVVEMywgZnApOwogCX0KIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CkBAIC00NjYsNTUgKzE5OCwxMyBAQAogCS8qIGlmIHNlcmlhbCByZWNlaXZlIGJ1ZmZlciBmdWxsIGludGVycnVwdCAqLwogCWlmIChpbnRzICYgSUZfUkJGKSB7CiAJCS8qIGFja25vd2xlZGdlIG9mIElGX1JCRiBtdXN0IGJlIGRvbmUgYnkgdGhlIHNlcmlhbCBpbnRlcnJ1cHQgKi8KLQkJYW1pZ2FfZG9faXJxKElSUV9BTUlHQV9SQkYsIGZwKTsKKwkJbTY4a19oYW5kbGVfaW50KElSUV9BTUlHQV9SQkYsIGZwKTsKIAl9CiAKIAkvKiBpZiBhIGRpc2sgc3luYyBpbnRlcnJ1cHQgKi8KIAlpZiAoaW50cyAmIElGX0RTS1NZTikgewogCQlhbWlnYV9jdXN0b20uaW50cmVxID0gSUZfRFNLU1lOOwotCQlhbWlnYV9kb19pcnEoSVJRX0FNSUdBX0RTS1NZTiwgZnApOworCQltNjhrX2hhbmRsZV9pbnQoSVJRX0FNSUdBX0RTS1NZTiwgZnApOwogCX0KIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCBhbWlfaW50NyhpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpmcCkKLXsKLQlwYW5pYyAoImxldmVsIDcgaW50ZXJydXB0IHJlY2VpdmVkXG4iKTsKLX0KLQotaXJxcmV0dXJuX3QgKCphbWlnYV9kZWZhdWx0X2hhbmRsZXJbU1lTX0lSUVNdKShpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKikgPSB7Ci0JWzBdID0gYW1pX2JhZGludCwKLQlbMV0gPSBhbWlfaW50MSwKLQlbMl0gPSBhbWlfYmFkaW50LAotCVszXSA9IGFtaV9pbnQzLAotCVs0XSA9IGFtaV9pbnQ0LAotCVs1XSA9IGFtaV9pbnQ1LAotCVs2XSA9IGFtaV9iYWRpbnQsCi0JWzddID0gYW1pX2ludDcKLX07Ci0KLWludCBzaG93X2FtaWdhX2ludGVycnVwdHMoc3RydWN0IHNlcV9maWxlICpwLCB2b2lkICp2KQotewotCWludCBpOwotCWlycV9ub2RlX3QgKm5vZGU7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQU1JX1NURF9JUlFTOyBpKyspIHsKLQkJaWYgKCEobm9kZSA9IGFtaV9pcnFfbGlzdFtpXSkpCi0JCQljb250aW51ZTsKLQkJc2VxX3ByaW50ZihwLCAiYW1pICAlMmQ6ICUxMHUgIiwgaSwKLQkJICAgICAgICAgICAgICAga3N0YXRfY3B1KDApLmlycXNbU1lTX0lSUVMgKyBpXSk7Ci0JCWRvIHsKLQkJCWlmIChub2RlLT5mbGFncyAmIFNBX0lOVEVSUlVQVCkKLQkJCQlzZXFfcHV0cyhwLCAiRiAiKTsKLQkJCWVsc2UKLQkJCQlzZXFfcHV0cyhwLCAiICAiKTsKLQkJCXNlcV9wcmludGYocCwgIiVzXG4iLCBub2RlLT5kZXZuYW1lKTsKLQkJCWlmICgobm9kZSA9IG5vZGUtPm5leHQpKQotCQkJCXNlcV9wdXRzKHAsICIgICAgICAgICAgICAgICAgICAgICIpOwotCQl9IHdoaWxlIChub2RlKTsKLQl9Ci0KLQljaWFfZ2V0X2lycV9saXN0KCZjaWFhX2Jhc2UsIHApOwotCWNpYV9nZXRfaXJxX2xpc3QoJmNpYWJfYmFzZSwgcCk7Ci0JcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9hcmNoL202OGsvYW1pZ2EvY2lhLmMgYi9hcmNoL202OGsvYW1pZ2EvY2lhLmMKaW5kZXggOTQ3NmViOS4uMDk1NmU0NSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2FtaWdhL2NpYS5jCisrKyBiL2FyY2gvbTY4ay9hbWlnYS9jaWEuYwpAQCAtMjksMjEgKzI5LDE4IEBACiAJdW5zaWduZWQgc2hvcnQgaW50X21hc2s7CiAJaW50IGhhbmRsZXJfaXJxLCBjaWFfaXJxLCBzZXJ2ZXJfaXJxOwogCWNoYXIgKm5hbWU7Ci0JaXJxX2hhbmRsZXJfdCBpcnFfbGlzdFtDSUFfSVJRU107CiB9IGNpYWFfYmFzZSA9IHsKIAkuY2lhCQk9ICZjaWFhLAogCS5pbnRfbWFzawk9IElGX1BPUlRTLAotCS5oYW5kbGVyX2lycQk9IElSUV9BTUlHQV9BVVRPXzIsCisJLmhhbmRsZXJfaXJxCT0gSVJRX0FNSUdBX1BPUlRTLAogCS5jaWFfaXJxCT0gSVJRX0FNSUdBX0NJQUEsCi0JLnNlcnZlcl9pcnEJPSBJUlFfQU1JR0FfUE9SVFMsCi0JLm5hbWUJCT0gIkNJQUEgaGFuZGxlciIKKwkubmFtZQkJPSAiQ0lBQSIKIH0sIGNpYWJfYmFzZSA9IHsKIAkuY2lhCQk9ICZjaWFiLAogCS5pbnRfbWFzawk9IElGX0VYVEVSLAotCS5oYW5kbGVyX2lycQk9IElSUV9BTUlHQV9BVVRPXzYsCisJLmhhbmRsZXJfaXJxCT0gSVJRX0FNSUdBX0VYVEVSLAogCS5jaWFfaXJxCT0gSVJRX0FNSUdBX0NJQUIsCi0JLnNlcnZlcl9pcnEJPSBJUlFfQU1JR0FfRVhURVIsCi0JLm5hbWUJCT0gIkNJQUIgaGFuZGxlciIKKwkubmFtZQkJPSAiQ0lBQiIKIH07CiAKIC8qCkBAIC02NiwxMyArNjMsMTEgQEAKIAogLyoKICAqICBFbmFibGUgb3IgZGlzYWJsZSBDSUEgaW50ZXJydXB0cywgcmV0dXJuIG9sZCBpbnRlcnJ1cHQgbWFzaywKLSAqICBpbnRlcnJ1cHRzIHdpbGwgb25seSBiZSBlbmFibGVkIGlmIGEgaGFuZGxlciBleGlzdHMKICAqLwogCiB1bnNpZ25lZCBjaGFyIGNpYV9hYmxlX2lycShzdHJ1Y3QgY2lhYmFzZSAqYmFzZSwgdW5zaWduZWQgY2hhciBtYXNrKQogewotCXVuc2lnbmVkIGNoYXIgb2xkLCB0bXA7Ci0JaW50IGk7CisJdW5zaWduZWQgY2hhciBvbGQ7CiAKIAlvbGQgPSBiYXNlLT5pY3JfbWFzazsKIAliYXNlLT5pY3JfZGF0YSB8PSBiYXNlLT5jaWEtPmljcjsKQEAgLTgyLDk5ICs3NywxMDQgQEAKIAllbHNlCiAJCWJhc2UtPmljcl9tYXNrICY9IH5tYXNrOwogCWJhc2UtPmljcl9tYXNrICY9IENJQV9JQ1JfQUxMOwotCWZvciAoaSA9IDAsIHRtcCA9IDE7IGkgPCBDSUFfSVJRUzsgaSsrLCB0bXAgPDw9IDEpIHsKLQkJaWYgKCh0bXAgJiBiYXNlLT5pY3JfbWFzaykgJiYgIWJhc2UtPmlycV9saXN0W2ldLmhhbmRsZXIpIHsKLQkJCWJhc2UtPmljcl9tYXNrICY9IH50bXA7Ci0JCQliYXNlLT5jaWEtPmljciA9IHRtcDsKLQkJfQotCX0KIAlpZiAoYmFzZS0+aWNyX2RhdGEgJiBiYXNlLT5pY3JfbWFzaykKIAkJYW1pZ2FfY3VzdG9tLmludHJlcSA9IElGX1NFVENMUiB8IGJhc2UtPmludF9tYXNrOwogCXJldHVybiBvbGQ7CiB9CiAKLWludCBjaWFfcmVxdWVzdF9pcnEoc3RydWN0IGNpYWJhc2UgKmJhc2UsIHVuc2lnbmVkIGludCBpcnEsCi0gICAgICAgICAgICAgICAgICAgIGlycXJldHVybl90ICgqaGFuZGxlcikoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopLAotICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzLCBjb25zdCBjaGFyICpkZXZuYW1lLCB2b2lkICpkZXZfaWQpCi17Ci0JdW5zaWduZWQgY2hhciBtYXNrOwotCi0JYmFzZS0+aXJxX2xpc3RbaXJxXS5oYW5kbGVyID0gaGFuZGxlcjsKLQliYXNlLT5pcnFfbGlzdFtpcnFdLmZsYWdzICAgPSBmbGFnczsKLQliYXNlLT5pcnFfbGlzdFtpcnFdLmRldl9pZCAgPSBkZXZfaWQ7Ci0JYmFzZS0+aXJxX2xpc3RbaXJxXS5kZXZuYW1lID0gZGV2bmFtZTsKLQotCS8qIGVuYWJsZSB0aGUgaW50ZXJydXB0ICovCi0JbWFzayA9IDEgPDwgaXJxOwotCWNpYV9zZXRfaXJxKGJhc2UsIG1hc2spOwotCWNpYV9hYmxlX2lycShiYXNlLCBDSUFfSUNSX1NFVENMUiB8IG1hc2spOwotCXJldHVybiAwOwotfQotCi12b2lkIGNpYV9mcmVlX2lycShzdHJ1Y3QgY2lhYmFzZSAqYmFzZSwgdW5zaWduZWQgaW50IGlycSwgdm9pZCAqZGV2X2lkKQotewotCWlmIChiYXNlLT5pcnFfbGlzdFtpcnFdLmRldl9pZCAhPSBkZXZfaWQpCi0JCXByaW50aygiJXM6IHJlbW92aW5nIHByb2JhYmx5IHdyb25nIElSUSAlaSBmcm9tICVzXG4iLAotCQkgICAgICAgX19GVU5DVElPTl9fLCBiYXNlLT5jaWFfaXJxICsgaXJxLAotCQkgICAgICAgYmFzZS0+aXJxX2xpc3RbaXJxXS5kZXZuYW1lKTsKLQotCWJhc2UtPmlycV9saXN0W2lycV0uaGFuZGxlciA9IE5VTEw7Ci0JYmFzZS0+aXJxX2xpc3RbaXJxXS5mbGFncyAgID0gMDsKLQotCWNpYV9hYmxlX2lycShiYXNlLCAxIDw8IGlycSk7Ci19Ci0KIHN0YXRpYyBpcnFyZXR1cm5fdCBjaWFfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpmcCkKIHsKIAlzdHJ1Y3QgY2lhYmFzZSAqYmFzZSA9IChzdHJ1Y3QgY2lhYmFzZSAqKWRldl9pZDsKLQlpbnQgbWFjaF9pcnEsIGk7CisJaW50IG1hY2hfaXJxOwogCXVuc2lnbmVkIGNoYXIgaW50czsKIAogCW1hY2hfaXJxID0gYmFzZS0+Y2lhX2lycTsKLQlpcnEgPSBTWVNfSVJRUyArIG1hY2hfaXJxOwogCWludHMgPSBjaWFfc2V0X2lycShiYXNlLCBDSUFfSUNSX0FMTCk7CiAJYW1pZ2FfY3VzdG9tLmludHJlcSA9IGJhc2UtPmludF9tYXNrOwotCWZvciAoaSA9IDA7IGkgPCBDSUFfSVJRUzsgaSsrLCBpcnErKywgbWFjaF9pcnErKykgewotCQlpZiAoaW50cyAmIDEpIHsKLQkJCWtzdGF0X2NwdSgwKS5pcnFzW2lycV0rKzsKLQkJCWJhc2UtPmlycV9saXN0W2ldLmhhbmRsZXIobWFjaF9pcnEsIGJhc2UtPmlycV9saXN0W2ldLmRldl9pZCwgZnApOwotCQl9Ci0JCWludHMgPj49IDE7CisJZm9yICg7IGludHM7IG1hY2hfaXJxKyssIGludHMgPj49IDEpIHsKKwkJaWYgKGludHMgJiAxKQorCQkJbTY4a19oYW5kbGVfaW50KG1hY2hfaXJxLCBmcCk7CiAJfQotCWFtaWdhX2RvX2lycV9saXN0KGJhc2UtPnNlcnZlcl9pcnEsIGZwKTsKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKK3N0YXRpYyB2b2lkIGNpYV9lbmFibGVfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJdW5zaWduZWQgY2hhciBtYXNrOworCisJaWYgKGlycSA+PSBJUlFfQU1JR0FfQ0lBQikgeworCQltYXNrID0gMSA8PCAoaXJxIC0gSVJRX0FNSUdBX0NJQUIpOworCQljaWFfc2V0X2lycSgmY2lhYl9iYXNlLCBtYXNrKTsKKwkJY2lhX2FibGVfaXJxKCZjaWFiX2Jhc2UsIENJQV9JQ1JfU0VUQ0xSIHwgbWFzayk7CisJfSBlbHNlIHsKKwkJbWFzayA9IDEgPDwgKGlycSAtIElSUV9BTUlHQV9DSUFBKTsKKwkJY2lhX3NldF9pcnEoJmNpYWFfYmFzZSwgbWFzayk7CisJCWNpYV9hYmxlX2lycSgmY2lhYV9iYXNlLCBDSUFfSUNSX1NFVENMUiB8IG1hc2spOworCX0KK30KKworc3RhdGljIHZvaWQgY2lhX2Rpc2FibGVfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJaWYgKGlycSA+PSBJUlFfQU1JR0FfQ0lBQikKKwkJY2lhX2FibGVfaXJxKCZjaWFiX2Jhc2UsIDEgPDwgKGlycSAtIElSUV9BTUlHQV9DSUFCKSk7CisJZWxzZQorCQljaWFfYWJsZV9pcnEoJmNpYWFfYmFzZSwgMSA8PCAoaXJxIC0gSVJRX0FNSUdBX0NJQUEpKTsKK30KKworc3RhdGljIHN0cnVjdCBpcnFfY29udHJvbGxlciBjaWFfaXJxX2NvbnRyb2xsZXIgPSB7CisJLm5hbWUJCT0gImNpYSIsCisJLmxvY2sJCT0gU1BJTl9MT0NLX1VOTE9DS0VELAorCS5lbmFibGUJCT0gY2lhX2VuYWJsZV9pcnEsCisJLmRpc2FibGUJPSBjaWFfZGlzYWJsZV9pcnEsCit9OworCisvKgorICogT3ZlcnJpZGUgYXV0byBpcnEgMiAmIDYgYW5kIHVzZSB0aGVtIGFzIGdlbmVyYWwgY2hhaW4KKyAqIGZvciBleHRlcm5hbCBpbnRlcnJ1cHRzLCB3ZSBsaW5rIHRoZSBDSUEgaW50ZXJydXB0IHNvdXJjZXMKKyAqIGludG8gdGhpcyBjaGFpbi4KKyAqLworCitzdGF0aWMgdm9pZCBhdXRvX2VuYWJsZV9pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwlzd2l0Y2ggKGlycSkgeworCWNhc2UgSVJRX0FVVE9fMjoKKwkJYW1pZ2FfY3VzdG9tLmludGVuYSA9IElGX1NFVENMUiB8IElGX1BPUlRTOworCQlicmVhazsKKwljYXNlIElSUV9BVVRPXzY6CisJCWFtaWdhX2N1c3RvbS5pbnRlbmEgPSBJRl9TRVRDTFIgfCBJRl9FWFRFUjsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBhdXRvX2Rpc2FibGVfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJc3dpdGNoIChpcnEpIHsKKwljYXNlIElSUV9BVVRPXzI6CisJCWFtaWdhX2N1c3RvbS5pbnRlbmEgPSBJRl9QT1JUUzsKKwkJYnJlYWs7CisJY2FzZSBJUlFfQVVUT182OgorCQlhbWlnYV9jdXN0b20uaW50ZW5hID0gSUZfRVhURVI7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHN0cnVjdCBpcnFfY29udHJvbGxlciBhdXRvX2lycV9jb250cm9sbGVyID0geworCS5uYW1lCQk9ICJhdXRvIiwKKwkubG9jawkJPSBTUElOX0xPQ0tfVU5MT0NLRUQsCisJLmVuYWJsZQkJPSBhdXRvX2VuYWJsZV9pcnEsCisJLmRpc2FibGUJPSBhdXRvX2Rpc2FibGVfaXJxLAorfTsKKwogdm9pZCBfX2luaXQgY2lhX2luaXRfSVJRKHN0cnVjdCBjaWFiYXNlICpiYXNlKQogewotCWludCBpOwotCi0JLyogaW5pdCBpc3IgaGFuZGxlcnMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgQ0lBX0lSUVM7IGkrKykgewotCQliYXNlLT5pcnFfbGlzdFtpXS5oYW5kbGVyID0gTlVMTDsKLQkJYmFzZS0+aXJxX2xpc3RbaV0uZmxhZ3MgICA9IDA7Ci0JfQorCW02OGtfc2V0dXBfaXJxX2NvbnRyb2xsZXIoJmNpYV9pcnFfY29udHJvbGxlciwgYmFzZS0+Y2lhX2lycSwgQ0lBX0lSUVMpOwogCiAJLyogY2xlYXIgYW55IHBlbmRpbmcgaW50ZXJydXB0IGFuZCB0dXJuIG9mZiBhbGwgaW50ZXJydXB0cyAqLwogCWNpYV9zZXRfaXJxKGJhc2UsIENJQV9JQ1JfQUxMKTsKIAljaWFfYWJsZV9pcnEoYmFzZSwgQ0lBX0lDUl9BTEwpOwogCi0JLyogaW5zdGFsbCBDSUEgaGFuZGxlciAqLwotCXJlcXVlc3RfaXJxKGJhc2UtPmhhbmRsZXJfaXJxLCBjaWFfaGFuZGxlciwgMCwgYmFzZS0+bmFtZSwgYmFzZSk7Ci0KLQlhbWlnYV9jdXN0b20uaW50ZW5hID0gSUZfU0VUQ0xSIHwgYmFzZS0+aW50X21hc2s7Ci19Ci0KLWludCBjaWFfZ2V0X2lycV9saXN0KHN0cnVjdCBjaWFiYXNlICpiYXNlLCBzdHJ1Y3Qgc2VxX2ZpbGUgKnApCi17Ci0JaW50IGksIGo7Ci0KLQlqID0gYmFzZS0+Y2lhX2lycTsKLQlmb3IgKGkgPSAwOyBpIDwgQ0lBX0lSUVM7IGkrKykgewotCQlzZXFfcHJpbnRmKHAsICJjaWEgICUyZDogJTEwZCAiLCBqICsgaSwKLQkJCSAgICAgICBrc3RhdF9jcHUoMCkuaXJxc1tTWVNfSVJRUyArIGogKyBpXSk7Ci0JCXNlcV9wdXRzKHAsICIgICIpOwotCQlzZXFfcHJpbnRmKHAsICIlc1xuIiwgYmFzZS0+aXJxX2xpc3RbaV0uZGV2bmFtZSk7Ci0JfQotCXJldHVybiAwOworCS8qIG92ZXJyaWRlIGF1dG8gaW50IGFuZCBpbnN0YWxsIENJQSBoYW5kbGVyICovCisJbTY4a19zZXR1cF9pcnFfY29udHJvbGxlcigmYXV0b19pcnFfY29udHJvbGxlciwgYmFzZS0+aGFuZGxlcl9pcnEsIDEpOworCW02OGtfaXJxX3N0YXJ0dXAoYmFzZS0+aGFuZGxlcl9pcnEpOworCXJlcXVlc3RfaXJxKGJhc2UtPmhhbmRsZXJfaXJxLCBjaWFfaGFuZGxlciwgU0FfU0hJUlEsIGJhc2UtPm5hbWUsIGJhc2UpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2FtaWdhL2NvbmZpZy5jIGIvYXJjaC9tNjhrL2FtaWdhL2NvbmZpZy5jCmluZGV4IDEyZTM3MDYuLmI1YjhhNDEgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9hbWlnYS9jb25maWcuYworKysgYi9hcmNoL202OGsvYW1pZ2EvY29uZmlnLmMKQEAgLTg3LDE3ICs4Nyw4IEBACiBzdGF0aWMgdm9pZCBhbWlnYV9zY2hlZF9pbml0KGlycXJldHVybl90ICgqaGFuZGxlcikoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopKTsKIC8qIGFtaWdhIHNwZWNpZmljIGlycSBmdW5jdGlvbnMgKi8KIGV4dGVybiB2b2lkIGFtaWdhX2luaXRfSVJRICh2b2lkKTsKLWV4dGVybiBpcnFyZXR1cm5fdCAoKmFtaWdhX2RlZmF1bHRfaGFuZGxlcltdKSAoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopOwotZXh0ZXJuIGludCBhbWlnYV9yZXF1ZXN0X2lycSAodW5zaWduZWQgaW50IGlycSwKLQkJCSAgICAgIGlycXJldHVybl90ICgqaGFuZGxlcikoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFncywgY29uc3QgY2hhciAqZGV2bmFtZSwKLQkJCSAgICAgIHZvaWQgKmRldl9pZCk7Ci1leHRlcm4gdm9pZCBhbWlnYV9mcmVlX2lycSAodW5zaWduZWQgaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKLWV4dGVybiB2b2lkIGFtaWdhX2VuYWJsZV9pcnEgKHVuc2lnbmVkIGludCk7Ci1leHRlcm4gdm9pZCBhbWlnYV9kaXNhYmxlX2lycSAodW5zaWduZWQgaW50KTsKIHN0YXRpYyB2b2lkIGFtaWdhX2dldF9tb2RlbChjaGFyICptb2RlbCk7CiBzdGF0aWMgaW50IGFtaWdhX2dldF9oYXJkd2FyZV9saXN0KGNoYXIgKmJ1ZmZlcik7Ci1leHRlcm4gaW50IHNob3dfYW1pZ2FfaW50ZXJydXB0cyAoc3RydWN0IHNlcV9maWxlICosIHZvaWQgKik7CiAvKiBhbWlnYSBzcGVjaWZpYyB0aW1lciBmdW5jdGlvbnMgKi8KIHN0YXRpYyB1bnNpZ25lZCBsb25nIGFtaWdhX2dldHRpbWVvZmZzZXQgKHZvaWQpOwogc3RhdGljIGludCBhMzAwMF9od2NsayAoaW50LCBzdHJ1Y3QgcnRjX3RpbWUgKik7CkBAIC0zOTIsMTQgKzM4Myw4IEBACiAKICAgbWFjaF9zY2hlZF9pbml0ICAgICAgPSBhbWlnYV9zY2hlZF9pbml0OwogICBtYWNoX2luaXRfSVJRICAgICAgICA9IGFtaWdhX2luaXRfSVJROwotICBtYWNoX2RlZmF1bHRfaGFuZGxlciA9ICZhbWlnYV9kZWZhdWx0X2hhbmRsZXI7Ci0gIG1hY2hfcmVxdWVzdF9pcnEgICAgID0gYW1pZ2FfcmVxdWVzdF9pcnE7Ci0gIG1hY2hfZnJlZV9pcnEgICAgICAgID0gYW1pZ2FfZnJlZV9pcnE7Ci0gIGVuYWJsZV9pcnEgICAgICAgICAgID0gYW1pZ2FfZW5hYmxlX2lycTsKLSAgZGlzYWJsZV9pcnEgICAgICAgICAgPSBhbWlnYV9kaXNhYmxlX2lycTsKICAgbWFjaF9nZXRfbW9kZWwgICAgICAgPSBhbWlnYV9nZXRfbW9kZWw7CiAgIG1hY2hfZ2V0X2hhcmR3YXJlX2xpc3QgPSBhbWlnYV9nZXRfaGFyZHdhcmVfbGlzdDsKLSAgbWFjaF9nZXRfaXJxX2xpc3QgICAgPSBzaG93X2FtaWdhX2ludGVycnVwdHM7CiAgIG1hY2hfZ2V0dGltZW9mZnNldCAgID0gYW1pZ2FfZ2V0dGltZW9mZnNldDsKICAgaWYgKEFNSUdBSFdfUFJFU0VOVChBMzAwMF9DTEspKXsKICAgICBtYWNoX2h3Y2xrICAgICAgICAgPSBhMzAwMF9od2NsazsKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9hcG9sbG8vTWFrZWZpbGUgYi9hcmNoL202OGsvYXBvbGxvL01ha2VmaWxlCmluZGV4IDM5MjY0ZjMuLjc2YTA1NzkgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9hcG9sbG8vTWFrZWZpbGUKKysrIGIvYXJjaC9tNjhrL2Fwb2xsby9NYWtlZmlsZQpAQCAtMiw0ICsyLDQgQEAKICMgTWFrZWZpbGUgZm9yIExpbnV4IGFyY2gvbTY4ay9hbWlnYSBzb3VyY2UgZGlyZWN0b3J5CiAjCiAKLW9iai15CQk6PSBjb25maWcubyBkbl9pbnRzLm8gZG1hLm8KK29iai15CQk6PSBjb25maWcubyBkbl9pbnRzLm8KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9hcG9sbG8vY29uZmlnLmMgYi9hcmNoL202OGsvYXBvbGxvL2NvbmZpZy5jCmluZGV4IGQ0MDE5NjIuLjk5YzcwOTcgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9hcG9sbG8vY29uZmlnLmMKKysrIGIvYXJjaC9tNjhrL2Fwb2xsby9jb25maWcuYwpAQCAtMjgsMTEgKzI4LDYgQEAKIAogZXh0ZXJuIHZvaWQgZG5fc2NoZWRfaW5pdChpcnFyZXR1cm5fdCAoKmhhbmRsZXIpKGludCx2b2lkICosc3RydWN0IHB0X3JlZ3MgKikpOwogZXh0ZXJuIHZvaWQgZG5faW5pdF9JUlEodm9pZCk7Ci1leHRlcm4gaW50IGRuX3JlcXVlc3RfaXJxKHVuc2lnbmVkIGludCBpcnEsIGlycXJldHVybl90ICgqaGFuZGxlcikoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopLCB1bnNpZ25lZCBsb25nIGZsYWdzLCBjb25zdCBjaGFyICpkZXZuYW1lLCB2b2lkICpkZXZfaWQpOwotZXh0ZXJuIHZvaWQgZG5fZnJlZV9pcnEodW5zaWduZWQgaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKLWV4dGVybiB2b2lkIGRuX2VuYWJsZV9pcnEodW5zaWduZWQgaW50KTsKLWV4dGVybiB2b2lkIGRuX2Rpc2FibGVfaXJxKHVuc2lnbmVkIGludCk7Ci1leHRlcm4gaW50IHNob3dfZG5faW50ZXJydXB0cyhzdHJ1Y3Qgc2VxX2ZpbGUgKiwgdm9pZCAqKTsKIGV4dGVybiB1bnNpZ25lZCBsb25nIGRuX2dldHRpbWVvZmZzZXQodm9pZCk7CiBleHRlcm4gaW50IGRuX2R1bW15X2h3Y2xrKGludCwgc3RydWN0IHJ0Y190aW1lICopOwogZXh0ZXJuIGludCBkbl9kdW1teV9zZXRfY2xvY2tfbW1zcyh1bnNpZ25lZCBsb25nKTsKQEAgLTQwLDEzICszNSwxMSBAQAogZXh0ZXJuIHZvaWQgZG5fZHVtbXlfd2FpdGJ1dCh2b2lkKTsKIGV4dGVybiBzdHJ1Y3QgZmJfaW5mbyAqZG5fZmJfaW5pdChsb25nICopOwogZXh0ZXJuIHZvaWQgZG5fZHVtbXlfZGVidWdfaW5pdCh2b2lkKTsKLWV4dGVybiB2b2lkIGRuX2R1bW15X3ZpZGVvX3NldHVwKGNoYXIgKixpbnQgKik7CiBleHRlcm4gaXJxcmV0dXJuX3QgZG5fcHJvY2Vzc19pbnQoaW50IGlycSwgc3RydWN0IHB0X3JlZ3MgKmZwKTsKICNpZmRlZiBDT05GSUdfSEVBUlRCRUFUCiBzdGF0aWMgdm9pZCBkbl9oZWFydGJlYXQoaW50IG9uKTsKICNlbmRpZgogc3RhdGljIGlycXJldHVybl90IGRuX3RpbWVyX2ludChpbnQgaXJxLHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik7Ci1zdGF0aWMgaXJxcmV0dXJuX3QgKCpzY2hlZF90aW1lcl9oYW5kbGVyKShpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik9TlVMTDsKIHN0YXRpYyB2b2lkIGRuX2dldF9tb2RlbChjaGFyICptb2RlbCk7CiBzdGF0aWMgY29uc3QgY2hhciAqYXBvbGxvX21vZGVsc1tdID0gewogCVtBUE9MTE9fRE4zMDAwLUFQT0xMT19ETjMwMDBdID0gIkROMzAwMCAoT3R0ZXIpIiwKQEAgLTE2NCwxNyArMTU3LDEwIEBACiAKIAltYWNoX3NjaGVkX2luaXQ9ZG5fc2NoZWRfaW5pdDsgLyogKi8KIAltYWNoX2luaXRfSVJRPWRuX2luaXRfSVJROwotCW1hY2hfZGVmYXVsdF9oYW5kbGVyPU5VTEw7Ci0JbWFjaF9yZXF1ZXN0X2lycSAgICAgPSBkbl9yZXF1ZXN0X2lycTsKLQltYWNoX2ZyZWVfaXJxICAgICAgICA9IGRuX2ZyZWVfaXJxOwotCWVuYWJsZV9pcnEgICAgICA9IGRuX2VuYWJsZV9pcnE7Ci0JZGlzYWJsZV9pcnEgICAgID0gZG5fZGlzYWJsZV9pcnE7Ci0JbWFjaF9nZXRfaXJxX2xpc3QgICAgPSBzaG93X2RuX2ludGVycnVwdHM7CiAJbWFjaF9nZXR0aW1lb2Zmc2V0ICAgPSBkbl9nZXR0aW1lb2Zmc2V0OwogCW1hY2hfbWF4X2RtYV9hZGRyZXNzID0gMHhmZmZmZmZmZjsKIAltYWNoX2h3Y2xrICAgICAgICAgICA9IGRuX2R1bW15X2h3Y2xrOyAvKiAqLwogCW1hY2hfc2V0X2Nsb2NrX21tc3MgID0gZG5fZHVtbXlfc2V0X2Nsb2NrX21tc3M7IC8qICovCi0JbWFjaF9wcm9jZXNzX2ludCAgICAgPSBkbl9wcm9jZXNzX2ludDsKIAltYWNoX3Jlc2V0CSAgICAgPSBkbl9kdW1teV9yZXNldDsgIC8qICovCiAjaWZkZWYgQ09ORklHX0hFQVJUQkVBVAogCW1hY2hfaGVhcnRiZWF0ID0gZG5faGVhcnRiZWF0OwpAQCAtMTg5LDExICsxNzUsMTMgQEAKIAogfQogCi1pcnFyZXR1cm5fdCBkbl90aW1lcl9pbnQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqZnApIHsKK2lycXJldHVybl90IGRuX3RpbWVyX2ludChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpmcCkKK3sKKwlpcnFyZXR1cm5fdCAoKnRpbWVyX2hhbmRsZXIpKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKSA9IGRldl9pZDsKIAogCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgeDsKIAotCXNjaGVkX3RpbWVyX2hhbmRsZXIoaXJxLGRldl9pZCxmcCk7CisJdGltZXJfaGFuZGxlcihpcnEsIGRldl9pZCwgZnApOwogCiAJeD0qKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikodGltZXIrMyk7CiAJeD0qKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikodGltZXIrNSk7CkBAIC0yMTcsOSArMjA1LDcgQEAKIAlwcmludGsoIiooMHgxMDgwMykgJTAyeFxuIiwqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikodGltZXIrMHgzKSk7CiAjZW5kaWYKIAotCXNjaGVkX3RpbWVyX2hhbmRsZXI9dGltZXJfcm91dGluZTsKLQlyZXF1ZXN0X2lycSgwLGRuX3RpbWVyX2ludCwwLE5VTEwsTlVMTCk7Ci0KKwlyZXF1ZXN0X2lycShJUlFfQVBPTExPLCBkbl90aW1lcl9pbnQsIDAsICJ0aW1lIiwgdGltZXJfcm91dGluZSk7CiB9CiAKIHVuc2lnbmVkIGxvbmcgZG5fZ2V0dGltZW9mZnNldCh2b2lkKSB7CmRpZmYgLS1naXQgYS9hcmNoL202OGsvYXBvbGxvL2RuX2ludHMuYyBiL2FyY2gvbTY4ay9hcG9sbG8vZG5faW50cy5jCmluZGV4IGEzMTI1OTMuLjlmZTA3ODAgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9hcG9sbG8vZG5faW50cy5jCisrKyBiL2FyY2gvbTY4ay9hcG9sbG8vZG5faW50cy5jCkBAIC0xLDEyNSArMSw0NCBAQAotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+Ci0jaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KIAotI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL3RyYXBzLmg+Ci0jaW5jbHVkZSA8YXNtL3BhZ2UuaD4KLSNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgogI2luY2x1ZGUgPGFzbS9hcG9sbG9ody5oPgotI2luY2x1ZGUgPGFzbS9lcnJuby5oPgogCi1zdGF0aWMgaXJxX2hhbmRsZXJfdCBkbl9pcnFzWzE2XTsKLQotaXJxcmV0dXJuX3QgZG5fcHJvY2Vzc19pbnQoaW50IGlycSwgc3RydWN0IHB0X3JlZ3MgKmZwKQordm9pZCBkbl9wcm9jZXNzX2ludCh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgcHRfcmVncyAqZnApCiB7Ci0gIGlycXJldHVybl90IHJlcyA9IElSUV9OT05FOworCW02OGtfaGFuZGxlX2ludChpcnEsIGZwKTsKIAotICBpZihkbl9pcnFzW2lycS0xNjBdLmhhbmRsZXIpIHsKLSAgICByZXMgPSBkbl9pcnFzW2lycS0xNjBdLmhhbmRsZXIoaXJxLGRuX2lycXNbaXJxLTE2MF0uZGV2X2lkLGZwKTsKLSAgfSBlbHNlIHsKLSAgICBwcmludGsoInNwdXJpb3VzIGlycSAlZCBvY2N1cnJlZFxuIixpcnEpOwotICB9Ci0KLSAgKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopKHBpY2EpPTB4MjA7Ci0gICoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKShwaWNiKT0weDIwOwotCi0gIHJldHVybiByZXM7CisJKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopKHBpY2EpPTB4MjA7CisJKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopKHBpY2IpPTB4MjA7CiB9CiAKLXZvaWQgZG5faW5pdF9JUlEodm9pZCkgewotCi0gIGludCBpOwotCi0gIGZvcihpPTA7aTwxNjtpKyspIHsKLSAgICBkbl9pcnFzW2ldLmhhbmRsZXI9TlVMTDsKLSAgICBkbl9pcnFzW2ldLmZsYWdzPUlSUV9GTEdfU1REOwotICAgIGRuX2lycXNbaV0uZGV2X2lkPU5VTEw7Ci0gICAgZG5faXJxc1tpXS5kZXZuYW1lPU5VTEw7Ci0gIH0KLQoraW50IGFwb2xsb19pcnFfc3RhcnR1cCh1bnNpZ25lZCBpbnQgaXJxKQoreworCWlmIChpcnEgPCA4KQorCQkqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikocGljYSsxKSAmPSB+KDEgPDwgaXJxKTsKKwllbHNlCisJCSoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKShwaWNiKzEpICY9IH4oMSA8PCAoaXJxIC0gOCkpOworCXJldHVybiAwOwogfQogCi1pbnQgZG5fcmVxdWVzdF9pcnEodW5zaWduZWQgaW50IGlycSwgaXJxcmV0dXJuX3QgKCpoYW5kbGVyKShpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKiksIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldm5hbWUsIHZvaWQgKmRldl9pZCkgewotCi0gIGlmKChpcnE8MCkgfHwgKGlycT4xNSkpIHsKLSAgICBwcmludGsoIlRyeWluZyB0byByZXF1ZXN0IGludmFsaWQgSVJRXG4iKTsKLSAgICByZXR1cm4gLUVOWElPOwotICB9Ci0KLSAgaWYoIWRuX2lycXNbaXJxXS5oYW5kbGVyKSB7Ci0gICAgZG5faXJxc1tpcnFdLmhhbmRsZXI9aGFuZGxlcjsKLSAgICBkbl9pcnFzW2lycV0uZmxhZ3M9SVJRX0ZMR19TVEQ7Ci0gICAgZG5faXJxc1tpcnFdLmRldl9pZD1kZXZfaWQ7Ci0gICAgZG5faXJxc1tpcnFdLmRldm5hbWU9ZGV2bmFtZTsKLSAgICBpZihpcnE8OCkKLSAgICAgICoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKShwaWNhKzEpJj1+KDE8PGlycSk7Ci0gICAgZWxzZQotICAgICAgKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopKHBpY2IrMSkmPX4oMTw8KGlycS04KSk7Ci0KLSAgICByZXR1cm4gMDsKLSAgfQotICBlbHNlIHsKLSAgICBwcmludGsoIlRyeWluZyB0byByZXF1ZXN0IGFscmVhZHkgYXNzaWduZWQgaXJxICVkXG4iLGlycSk7Ci0gICAgcmV0dXJuIC1FTlhJTzsKLSAgfQotCit2b2lkIGFwb2xsb19pcnFfc2h1dGRvd24odW5zaWduZWQgaW50IGlycSkKK3sKKwlpZiAoaXJxIDwgOCkKKwkJKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopKHBpY2ErMSkgfD0gKDEgPDwgaXJxKTsKKwllbHNlCisJCSoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKShwaWNiKzEpIHw9ICgxIDw8IChpcnEgLSA4KSk7CiB9CiAKLXZvaWQgZG5fZnJlZV9pcnEodW5zaWduZWQgaW50IGlycSwgdm9pZCAqZGV2X2lkKSB7CitzdGF0aWMgc3RydWN0IGlycV9jb250cm9sbGVyIGFwb2xsb19pcnFfY29udHJvbGxlciA9IHsKKwkubmFtZSAgICAgICAgICAgPSAiYXBvbGxvIiwKKwkubG9jayAgICAgICAgICAgPSBTUElOX0xPQ0tfVU5MT0NLRUQsCisJLnN0YXJ0dXAgICAgICAgID0gYXBvbGxvX2lycV9zdGFydHVwLAorCS5zaHV0ZG93biAgICAgICA9IGFwb2xsb19pcnFfc2h1dGRvd24sCit9OwogCi0gIGlmKChpcnE8MCkgfHwgKGlycT4xNSkpIHsKLSAgICBwcmludGsoIlRyeWluZyB0byBmcmVlIGludmFsaWQgSVJRXG4iKTsKLSAgICByZXR1cm4gOwotICB9CiAKLSAgaWYoaXJxPDgpCi0gICAgKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopKHBpY2ErMSl8PSgxPDxpcnEpOwotICBlbHNlCi0gICAgKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopKHBpY2IrMSl8PSgxPDwoaXJxLTgpKTsKLQotICBkbl9pcnFzW2lycV0uaGFuZGxlcj1OVUxMOwotICBkbl9pcnFzW2lycV0uZmxhZ3M9SVJRX0ZMR19TVEQ7Ci0gIGRuX2lycXNbaXJxXS5kZXZfaWQ9TlVMTDsKLSAgZG5faXJxc1tpcnFdLmRldm5hbWU9TlVMTDsKLQotICByZXR1cm4gOwotCi19Ci0KLXZvaWQgZG5fZW5hYmxlX2lycSh1bnNpZ25lZCBpbnQgaXJxKSB7Ci0KLSAgcHJpbnRrKCJkbiBlbmFibGUgaXJxXG4iKTsKLQotfQotCi12b2lkIGRuX2Rpc2FibGVfaXJxKHVuc2lnbmVkIGludCBpcnEpIHsKLQotICBwcmludGsoImRuIGRpc2FibGUgaXJxXG4iKTsKLQotfQotCi1pbnQgc2hvd19kbl9pbnRlcnJ1cHRzKHN0cnVjdCBzZXFfZmlsZSAqcCwgdm9pZCAqdikgewotCi0gIHByaW50aygiZG4gZ2V0IGlycSBsaXN0XG4iKTsKLQotICByZXR1cm4gMDsKLQotfQotCi1zdHJ1Y3QgZmJfaW5mbyAqZG5fZHVtbXlfZmJfaW5pdChsb25nICptZW1fc3RhcnQpIHsKLQotICBwcmludGsoImZiIGluaXRcbiIpOwotCi0gIHJldHVybiBOVUxMOwotCi19Ci0KLXZvaWQgZG5fZHVtbXlfdmlkZW9fc2V0dXAoY2hhciAqb3B0aW9ucyxpbnQgKmludHMpIHsKLQotICBwcmludGsoIm5vIHZpZGVvIHlldFxuIik7Ci0KK3ZvaWQgZG5faW5pdF9JUlEodm9pZCkKK3sKKwltNjhrX3NldHVwX3VzZXJfaW50ZXJydXB0KFZFQ19VU0VSICsgOTYsIDE2LCBkbl9wcm9jZXNzX2ludCk7CisJbTY4a19zZXR1cF9pcnFfY29udHJvbGxlcigmYXBvbGxvX2lycV9jb250cm9sbGVyLCBJUlFfQVBPTExPLCAxNik7CiB9CmRpZmYgLS1naXQgYS9hcmNoL202OGsvYXRhcmkvYXRhaW50cy5jIGIvYXJjaC9tNjhrL2F0YXJpL2F0YWludHMuYwppbmRleCAwNzZmNDc5Li5lY2UxM2NiIDEwMDY0NAotLS0gYS9hcmNoL202OGsvYXRhcmkvYXRhaW50cy5jCisrKyBiL2FyY2gvbTY4ay9hdGFyaS9hdGFpbnRzLmMKQEAgLTEwNCw2ICsxMDQsNyBAQAogICogdGhlIHNyIGNvcHkgaW4gdGhlIGZyYW1lLgogICovCiAKKyNpZiAwCiAKICNkZWZpbmUJTlVNX0lOVF9TT1VSQ0VTCSg4ICsgTlVNX0FUQVJJX1NPVVJDRVMpCiAKQEAgLTEzMywxMyArMTM0LDYgQEAKICAqLwogc3RhdGljIHN0cnVjdCBpcnFwYXJhbSBpcnFfcGFyYW1bTlVNX0lOVF9TT1VSQ0VTXTsKIAotLyoKLSAqIEJpdG1hcCBmb3IgZnJlZSBpbnRlcnJ1cHQgdmVjdG9yIG51bWJlcnMKLSAqIChuZXcgdmVjdG9ycyBzdGFydGluZyBmcm9tIDB4NzAgY2FuIGJlIGFsbG9jYXRlZCBieQotICogYXRhcmlfcmVnaXN0ZXJfdm1lX2ludCgpKQotICovCi1zdGF0aWMgaW50IGZyZWVfdm1lX3ZlY19iaXRtYXA7Ci0KIC8qIGNoZWNrIGZvciB2YWxpZCBpbnQgbnVtYmVyIChjb21wbGV4LCBzaWdoLi4uKSAqLwogI2RlZmluZQlJU19WQUxJRF9JTlROTyhuKQkJCQkJCQkJCQkJXAogCSgobikgPiAwICYmCQkJCQkJCQkJCQkJCQlcCkBAIC0zMDEsNiArMjk1LDE0IEBACiApOwogCWZvciAoOzspOwogfQorI2VuZGlmCisKKy8qCisgKiBCaXRtYXAgZm9yIGZyZWUgaW50ZXJydXB0IHZlY3RvciBudW1iZXJzCisgKiAobmV3IHZlY3RvcnMgc3RhcnRpbmcgZnJvbSAweDcwIGNhbiBiZSBhbGxvY2F0ZWQgYnkKKyAqIGF0YXJpX3JlZ2lzdGVyX3ZtZV9pbnQoKSkKKyAqLworc3RhdGljIGludCBmcmVlX3ZtZV92ZWNfYml0bWFwOwogCiAvKiBHSzoKICAqIEhCTCBJUlEgaGFuZGxlciBmb3IgRmFsY29uLiBOb2JvZHkgbmVlZHMgaXQgOi0pCkBAIC0zMTMsMTMgKzMxNSwzNCBAQAogCSJvcncJIzB4MjAwLCVzcEBcblx0IgkvKiBzZXQgc2F2ZWQgaXBsIHRvIDIgKi8KIAkicnRlIik7CiAKLS8qIERlZmluZWQgaW4gZW50cnkuUzsgb25seSBpbmNyZW1lbnRzICdudW1fc3B1cmlvdXMnICovCi1hc21saW5rYWdlIHZvaWQgYmFkX2ludGVycnVwdCh2b2lkKTsKLQotZXh0ZXJuIHZvaWQgYXRhcmlfbWljcm93aXJlX2NtZCggaW50IGNtZCApOworZXh0ZXJuIHZvaWQgYXRhcmlfbWljcm93aXJlX2NtZChpbnQgY21kKTsKIAogZXh0ZXJuIGludCBhdGFyaV9TQ0NfcmVzZXRfZG9uZTsKIAorc3RhdGljIGludCBhdGFyaV9zdGFydHVwX2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCW02OGtfaXJxX3N0YXJ0dXAoaXJxKTsKKwlhdGFyaV90dXJub25faXJxKGlycSk7CisJYXRhcmlfZW5hYmxlX2lycShpcnEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhdGFyaV9zaHV0ZG93bl9pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwlhdGFyaV9kaXNhYmxlX2lycShpcnEpOworCWF0YXJpX3R1cm5vZmZfaXJxKGlycSk7CisJbTY4a19pcnFfc2h1dGRvd24oaXJxKTsKK30KKworc3RhdGljIHN0cnVjdCBpcnFfY29udHJvbGxlciBhdGFyaV9pcnFfY29udHJvbGxlciA9IHsKKwkubmFtZQkJPSAiYXRhcmkiLAorCS5sb2NrCQk9IFNQSU5fTE9DS19VTkxPQ0tFRCwKKwkuc3RhcnR1cAk9IGF0YXJpX3N0YXJ0dXBfaXJxLAorCS5zaHV0ZG93bgk9IGF0YXJpX3NodXRkb3duX2lycSwKKwkuZW5hYmxlCQk9IGF0YXJpX2VuYWJsZV9pcnEsCisJLmRpc2FibGUJPSBhdGFyaV9kaXNhYmxlX2lycSwKK307CisKIC8qCiAgKiB2b2lkIGF0YXJpX2luaXRfSVJRICh2b2lkKQogICoKQEAgLTMzMywxMiArMzU2LDggQEAKIAogdm9pZCBfX2luaXQgYXRhcmlfaW5pdF9JUlEodm9pZCkKIHsKLQlpbnQgaTsKLQotCS8qIGluaXRpYWxpemUgdGhlIHZlY3RvciB0YWJsZSAqLwotCWZvciAoaSA9IDA7IGkgPCBOVU1fSU5UX1NPVVJDRVM7ICsraSkgewotCQl2ZWN0b3JzW0lSUV9TT1VSQ0VfVE9fVkVDVE9SKGkpXSA9IGJhZF9pbnRlcnJ1cHQ7Ci0JfQorCW02OGtfc2V0dXBfdXNlcl9pbnRlcnJ1cHQoVkVDX1VTRVIsIDE5MiwgTlVMTCk7CisJbTY4a19zZXR1cF9pcnFfY29udHJvbGxlcigmYXRhcmlfaXJxX2NvbnRyb2xsZXIsIDEsIE5VTV9BVEFSSV9TT1VSQ0VTIC0gMSk7CiAKIAkvKiBJbml0aWFsaXplIHRoZSBNRlAocykgKi8KIApAQCAtMzc4LDggKzM5Nyw3IEBACiAJCQkJCQkJCQkgKiBlbmFibGVkIGluIFZNRSBtYXNrCiAJCQkJCQkJCQkgKi8KIAkJdHRfc2N1LnZtZV9tYXNrID0gMHg2MDsJCS8qIGVuYWJsZSBNRlAgYW5kIFNDQyBpbnRzICovCi0JfQotCWVsc2UgeworCX0gZWxzZSB7CiAJCS8qIElmIG5vIFNDVSBhbmQgbm8gSGFkZXMsIHRoZSBIU1lOQyBpbnRlcnJ1cHQgbmVlZHMgdG8gYmUKIAkJICogZGlzYWJsZWQgdGhpcyB3YXkuIChFbHNlIF9pbnRoYW5kbGVyIGluIGtlcm5lbC9zeXNfY2FsbC5TCiAJCSAqIGdldHMgb3ZlcnJ1bnMpCkBAIC00MDQsMTg0ICs0MjIsNiBAQAogfQogCiAKLXN0YXRpYyBpcnFyZXR1cm5fdCBhdGFyaV9jYWxsX2lycV9saXN0KCBpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpmcCApCi17Ci0JaXJxX25vZGVfdCAqbm9kZTsKLQotCWZvciAobm9kZSA9IChpcnFfbm9kZV90ICopZGV2X2lkOyBub2RlOyBub2RlID0gbm9kZS0+bmV4dCkKLQkJbm9kZS0+aGFuZGxlcihpcnEsIG5vZGUtPmRldl9pZCwgZnApOwotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotCi0vKgotICogYXRhcmlfcmVxdWVzdF9pcnEgOiBhZGQgYW4gaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSBmb3IgYSBwYXJ0aWN1bGFyCi0gKiAgICAgICAgICAgICAgICAgICAgIG1hY2hpbmUgc3BlY2lmaWMgaW50ZXJydXB0IHNvdXJjZS4KLSAqICAgICAgICAgICAgICAgICAgICAgSWYgdGhlIGFkZGl0aW9uIHdhcyBzdWNjZXNzZnVsLCBpdCByZXR1cm5zIDAuCi0gKi8KLQotaW50IGF0YXJpX3JlcXVlc3RfaXJxKHVuc2lnbmVkIGludCBpcnEsIGlycXJldHVybl90ICgqaGFuZGxlcikoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopLAotICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldm5hbWUsIHZvaWQgKmRldl9pZCkKLXsKLQlpbnQgdmVjdG9yOwotCXVuc2lnbmVkIGxvbmcgb2ZsYWdzID0gZmxhZ3M7Ci0KLQkvKgotCSAqIFRoZSBmb2xsb3dpbmcgaXMgYSBoYWNrIHRvIG1ha2Ugc29tZSBQQ0kgY2FyZCBkcml2ZXJzIHdvcmssCi0JICogd2hpY2ggc2V0IHRoZSBTQV9TSElSUSBmbGFnLgotCSAqLwotCi0JZmxhZ3MgJj0gflNBX1NISVJROwotCi0JaWYgKGZsYWdzID09IFNBX0lOVEVSUlVQVCkgewotCQlwcmludGsgKCIlczogU0FfSU5URVJSVVBUIGNoYW5nZWQgdG8gSVJRX1RZUEVfU0xPVyBmb3IgJXNcbiIsCi0JCQlfX0ZVTkNUSU9OX18sIGRldm5hbWUpOwotCQlmbGFncyA9IElSUV9UWVBFX1NMT1c7Ci0JfQotCWlmIChmbGFncyA8IElSUV9UWVBFX1NMT1cgfHwgZmxhZ3MgPiBJUlFfVFlQRV9QUklPKSB7Ci0JCXByaW50ayAoIiVzOiBCYWQgaXJxIHR5cGUgMHglbHggPDB4JWx4PiByZXF1ZXN0ZWQgZnJvbSAlc1xuIiwKLQkJICAgICAgICBfX0ZVTkNUSU9OX18sIGZsYWdzLCBvZmxhZ3MsIGRldm5hbWUpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JaWYgKCFJU19WQUxJRF9JTlROTyhpcnEpKSB7Ci0JCXByaW50ayAoIiVzOiBVbmtub3duIGlycSAlZCByZXF1ZXN0ZWQgZnJvbSAlc1xuIiwKLQkJICAgICAgICBfX0ZVTkNUSU9OX18sIGlycSwgZGV2bmFtZSk7Ci0JCXJldHVybiAtRU5YSU87Ci0JfQotCXZlY3RvciA9IElSUV9TT1VSQ0VfVE9fVkVDVE9SKGlycSk7Ci0KLQkvKgotCSAqIENoZWNrIHR5cGUvc291cmNlIGNvbWJpbmF0aW9uOiBzbG93IGludHMgYXJlIChjdXJyZW50bHkpCi0JICogb25seSBwb3NzaWJsZSBmb3IgTUZQLWludGVycnVwdHMuCi0JICovCi0JaWYgKGZsYWdzID09IElSUV9UWVBFX1NMT1cgJiYKLQkJKGlycSA8IFNUTUZQX1NPVVJDRV9CQVNFIHx8IGlycSA+PSBTQ0NfU09VUkNFX0JBU0UpKSB7Ci0JCXByaW50ayAoIiVzOiBTbG93IGlycSByZXF1ZXN0ZWQgZm9yIG5vbi1NRlAgc291cmNlICVkIGZyb20gJXNcbiIsCi0JCSAgICAgICAgX19GVU5DVElPTl9fLCBpcnEsIGRldm5hbWUpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAodmVjdG9yc1t2ZWN0b3JdID09IGJhZF9pbnRlcnJ1cHQpIHsKLQkJLyogaW50IGhhcyBubyBoYW5kbGVyIHlldCAqLwotCQlpcnFfaGFuZGxlcltpcnFdLmhhbmRsZXIgPSBoYW5kbGVyOwotCQlpcnFfaGFuZGxlcltpcnFdLmRldl9pZCAgPSBkZXZfaWQ7Ci0JCWlycV9wYXJhbVtpcnFdLmZsYWdzICAgPSBmbGFnczsKLQkJaXJxX3BhcmFtW2lycV0uZGV2bmFtZSA9IGRldm5hbWU7Ci0JCXZlY3RvcnNbdmVjdG9yXSA9Ci0JCQkoZmxhZ3MgPT0gSVJRX1RZUEVfU0xPVykgPyBzbG93X2hhbmRsZXJzW2lycS1TVE1GUF9TT1VSQ0VfQkFTRV0gOgotCQkJKGZsYWdzID09IElSUV9UWVBFX0ZBU1QpID8gYXRhcmlfZmFzdF9pcnFfaGFuZGxlciA6Ci0JCQkgICAgICAgICAgICAgICAgICAgICAgICAgIGF0YXJpX3ByaW9faXJxX2hhbmRsZXI7Ci0JCS8qIElmIE1GUCBpbnQsIGFsc28gZW5hYmxlIGFuZCB1bWFzayBpdCAqLwotCQlhdGFyaV90dXJub25faXJxKGlycSk7Ci0JCWF0YXJpX2VuYWJsZV9pcnEoaXJxKTsKLQotCQlyZXR1cm4gMDsKLQl9Ci0JZWxzZSBpZiAoaXJxX3BhcmFtW2lycV0uZmxhZ3MgPT0gZmxhZ3MpIHsKLQkJLyogb2xkIGhhbmRsZXIgaXMgb2Ygc2FtZSB0eXBlIC0+IGhhbmRsZXJzIGNhbiBiZSBjaGFpbmVkICovCi0JCWlycV9ub2RlX3QgKm5vZGU7Ci0JCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCi0JCWlmIChpcnFfaGFuZGxlcltpcnFdLmhhbmRsZXIgIT0gYXRhcmlfY2FsbF9pcnFfbGlzdCkgewotCQkJLyogT25seSBvbmUgaGFuZGxlciB5ZXQsIG1ha2UgYSBub2RlIGZvciB0aGlzIGZpcnN0IG9uZSAqLwotCQkJaWYgKCEobm9kZSA9IG5ld19pcnFfbm9kZSgpKSkKLQkJCQlyZXR1cm4gLUVOT01FTTsKLQkJCW5vZGUtPmhhbmRsZXIgPSBpcnFfaGFuZGxlcltpcnFdLmhhbmRsZXI7Ci0JCQlub2RlLT5kZXZfaWQgID0gaXJxX2hhbmRsZXJbaXJxXS5kZXZfaWQ7Ci0JCQlub2RlLT5kZXZuYW1lID0gaXJxX3BhcmFtW2lycV0uZGV2bmFtZTsKLQkJCW5vZGUtPm5leHQgPSBOVUxMOwotCi0JCQlpcnFfaGFuZGxlcltpcnFdLmhhbmRsZXIgPSBhdGFyaV9jYWxsX2lycV9saXN0OwotCQkJaXJxX2hhbmRsZXJbaXJxXS5kZXZfaWQgID0gbm9kZTsKLQkJCWlycV9wYXJhbVtpcnFdLmRldm5hbWUgICA9ICJjaGFpbmVkIjsKLQkJfQotCi0JCWlmICghKG5vZGUgPSBuZXdfaXJxX25vZGUoKSkpCi0JCQlyZXR1cm4gLUVOT01FTTsKLQkJbm9kZS0+aGFuZGxlciA9IGhhbmRsZXI7Ci0JCW5vZGUtPmRldl9pZCAgPSBkZXZfaWQ7Ci0JCW5vZGUtPmRldm5hbWUgPSBkZXZuYW1lOwotCQkvKiBuZXcgaGFuZGxlcnMgYXJlIHB1dCBpbiBmcm9udCBvZiB0aGUgcXVldWUgKi8KLQkJbm9kZS0+bmV4dCA9IGlycV9oYW5kbGVyW2lycV0uZGV2X2lkOwotCQlpcnFfaGFuZGxlcltpcnFdLmRldl9pZCA9IG5vZGU7Ci0KLQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCQlyZXR1cm4gMDsKLQl9IGVsc2UgewotCQlwcmludGsgKCIlczogSXJxICVkIGFsbG9jYXRlZCBieSBvdGhlciB0eXBlIGludCAoY2FsbCBmcm9tICVzKVxuIiwKLQkJICAgICAgICBfX0ZVTkNUSU9OX18sIGlycSwgZGV2bmFtZSk7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfQotfQotCi12b2lkIGF0YXJpX2ZyZWVfaXJxKHVuc2lnbmVkIGludCBpcnEsIHZvaWQgKmRldl9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCB2ZWN0b3I7Ci0JaXJxX25vZGVfdCAqKmxpc3QsICpub2RlOwotCi0JaWYgKCFJU19WQUxJRF9JTlROTyhpcnEpKSB7Ci0JCXByaW50aygiJXM6IFVua25vd24gaXJxICVkXG4iLCBfX0ZVTkNUSU9OX18sIGlycSk7Ci0JCXJldHVybjsKLQl9Ci0KLQl2ZWN0b3IgPSBJUlFfU09VUkNFX1RPX1ZFQ1RPUihpcnEpOwotCWlmICh2ZWN0b3JzW3ZlY3Rvcl0gPT0gYmFkX2ludGVycnVwdCkKLQkJZ290byBub3RfZm91bmQ7Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0KLQlpZiAoaXJxX2hhbmRsZXJbaXJxXS5oYW5kbGVyICE9IGF0YXJpX2NhbGxfaXJxX2xpc3QpIHsKLQkJLyogSXQncyB0aGUgb25seSBoYW5kbGVyIGZvciB0aGUgaW50ZXJydXB0ICovCi0JCWlmIChpcnFfaGFuZGxlcltpcnFdLmRldl9pZCAhPSBkZXZfaWQpIHsKLQkJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQkJCWdvdG8gbm90X2ZvdW5kOwotCQl9Ci0JCWlycV9oYW5kbGVyW2lycV0uaGFuZGxlciA9IE5VTEw7Ci0JCWlycV9oYW5kbGVyW2lycV0uZGV2X2lkICA9IE5VTEw7Ci0JCWlycV9wYXJhbVtpcnFdLmRldm5hbWUgICA9IE5VTEw7Ci0JCXZlY3RvcnNbdmVjdG9yXSA9IGJhZF9pbnRlcnJ1cHQ7Ci0JCS8qIElmIE1GUCBpbnQsIGFsc28gZGlzYWJsZSBpdCAqLwotCQlhdGFyaV9kaXNhYmxlX2lycShpcnEpOwotCQlhdGFyaV90dXJub2ZmX2lycShpcnEpOwotCi0JCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIFRoZSBpbnRlcnJ1cHQgaXMgY2hhaW5lZCwgZmluZCB0aGUgaXJxIG9uIHRoZSBsaXN0ICovCi0JZm9yKGxpc3QgPSAoaXJxX25vZGVfdCAqKikmaXJxX2hhbmRsZXJbaXJxXS5kZXZfaWQ7ICpsaXN0OyBsaXN0ID0gJigqbGlzdCktPm5leHQpIHsKLQkJaWYgKCgqbGlzdCktPmRldl9pZCA9PSBkZXZfaWQpIGJyZWFrOwotCX0KLQlpZiAoISpsaXN0KSB7Ci0JCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQkJZ290byBub3RfZm91bmQ7Ci0JfQotCi0JKCpsaXN0KS0+aGFuZGxlciA9IE5VTEw7IC8qIE1hcmsgaXQgYXMgZnJlZSBmb3IgcmVhbGxvY2F0aW9uICovCi0JKmxpc3QgPSAoKmxpc3QpLT5uZXh0OwotCi0JLyogSWYgdGhlcmUncyBub3cgb25seSBvbmUgaGFuZGxlciwgdW5jaGFpbiB0aGUgaW50ZXJydXB0LCBpLmUuIHBsdWcgaW4KLQkgKiB0aGUgaGFuZGxlciBkaXJlY3RseSBhZ2FpbiBhbmQgb21pdCBhdGFyaV9jYWxsX2lycV9saXN0ICovCi0Jbm9kZSA9IChpcnFfbm9kZV90ICopaXJxX2hhbmRsZXJbaXJxXS5kZXZfaWQ7Ci0JaWYgKG5vZGUgJiYgIW5vZGUtPm5leHQpIHsKLQkJaXJxX2hhbmRsZXJbaXJxXS5oYW5kbGVyID0gbm9kZS0+aGFuZGxlcjsKLQkJaXJxX2hhbmRsZXJbaXJxXS5kZXZfaWQgID0gbm9kZS0+ZGV2X2lkOwotCQlpcnFfcGFyYW1baXJxXS5kZXZuYW1lICAgPSBub2RlLT5kZXZuYW1lOwotCQlub2RlLT5oYW5kbGVyID0gTlVMTDsgLyogTWFyayBpdCBhcyBmcmVlIGZvciByZWFsbG9jYXRpb24gKi8KLQl9Ci0KLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0JcmV0dXJuOwotCi1ub3RfZm91bmQ6Ci0JcHJpbnRrKCIlczogdHJpZWQgdG8gcmVtb3ZlIGludmFsaWQgaXJxXG4iLCBfX0ZVTkNUSU9OX18pOwotCXJldHVybjsKLX0KLQotCiAvKgogICogYXRhcmlfcmVnaXN0ZXJfdm1lX2ludCgpIHJldHVybnMgdGhlIG51bWJlciBvZiBhIGZyZWUgaW50ZXJydXB0IHZlY3RvciBmb3IKICAqIGhhcmR3YXJlIHdpdGggYSBwcm9ncmFtbWFibGUgaW50IHZlY3RvciAocHJvYmFibHkgYSBWTUUgYm9hcmQpLgpAQCAtNTkxLDU4ICs0MzEsMjQgQEAKIHsKIAlpbnQgaTsKIAotCWZvcihpID0gMDsgaSA8IDMyOyBpKyspCi0JCWlmKChmcmVlX3ZtZV92ZWNfYml0bWFwICYgKDEgPDwgaSkpID09IDApCisJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspCisJCWlmICgoZnJlZV92bWVfdmVjX2JpdG1hcCAmICgxIDw8IGkpKSA9PSAwKQogCQkJYnJlYWs7CiAKLQlpZihpID09IDE2KQorCWlmIChpID09IDE2KQogCQlyZXR1cm4gMDsKIAogCWZyZWVfdm1lX3ZlY19iaXRtYXAgfD0gMSA8PCBpOwotCXJldHVybiAoVk1FX1NPVVJDRV9CQVNFICsgaSk7CisJcmV0dXJuIFZNRV9TT1VSQ0VfQkFTRSArIGk7CiB9CiAKIAogdm9pZCBhdGFyaV91bnJlZ2lzdGVyX3ZtZV9pbnQodW5zaWduZWQgbG9uZyBpcnEpCiB7Ci0JaWYoaXJxID49IFZNRV9TT1VSQ0VfQkFTRSAmJiBpcnEgPCBWTUVfU09VUkNFX0JBU0UgKyBWTUVfTUFYX1NPVVJDRVMpIHsKKwlpZiAoaXJxID49IFZNRV9TT1VSQ0VfQkFTRSAmJiBpcnEgPCBWTUVfU09VUkNFX0JBU0UgKyBWTUVfTUFYX1NPVVJDRVMpIHsKIAkJaXJxIC09IFZNRV9TT1VSQ0VfQkFTRTsKIAkJZnJlZV92bWVfdmVjX2JpdG1hcCAmPSB+KDEgPDwgaXJxKTsKIAl9CiB9CiAKIAotaW50IHNob3dfYXRhcmlfaW50ZXJydXB0cyhzdHJ1Y3Qgc2VxX2ZpbGUgKnAsIHZvaWQgKnYpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTlVNX0lOVF9TT1VSQ0VTOyArK2kpIHsKLQkJaWYgKHZlY3RvcnNbSVJRX1NPVVJDRV9UT19WRUNUT1IoaSldID09IGJhZF9pbnRlcnJ1cHQpCi0JCQljb250aW51ZTsKLQkJaWYgKGkgPCBTVE1GUF9TT1VSQ0VfQkFTRSkKLQkJCXNlcV9wcmludGYocCwgImF1dG8gJTJkOiAlMTB1ICIsCi0JCQkJICAgICAgIGksIGtzdGF0X2NwdSgwKS5pcnFzW2ldKTsKLQkJZWxzZQotCQkJc2VxX3ByaW50ZihwLCAidmVjICQlMDJ4OiAlMTB1ICIsCi0JCQkJICAgICAgIElSUV9TT1VSQ0VfVE9fVkVDVE9SKGkpLAotCQkJCSAgICAgICBrc3RhdF9jcHUoMCkuaXJxc1tpXSk7Ci0KLQkJaWYgKGlycV9oYW5kbGVyW2ldLmhhbmRsZXIgIT0gYXRhcmlfY2FsbF9pcnFfbGlzdCkgewotCQkJc2VxX3ByaW50ZihwLCAiJXNcbiIsIGlycV9wYXJhbVtpXS5kZXZuYW1lKTsKLQkJfQotCQllbHNlIHsKLQkJCWlycV9ub2RlX3QgKm47Ci0JCQlmb3IoIG4gPSAoaXJxX25vZGVfdCAqKWlycV9oYW5kbGVyW2ldLmRldl9pZDsgbjsgbiA9IG4tPm5leHQgKSB7Ci0JCQkJc2VxX3ByaW50ZihwLCAiJXNcbiIsIG4tPmRldm5hbWUpOwotCQkJCWlmIChuLT5uZXh0KQotCQkJCQlzZXFfcHV0cyhwLCAiICAgICAgICAgICAgICAgICAgICAiICk7Ci0JCQl9Ci0JCX0KLQl9Ci0JaWYgKG51bV9zcHVyaW91cykKLQkJc2VxX3ByaW50ZihwLCAic3B1cmlvLjogJTEwdVxuIiwgbnVtX3NwdXJpb3VzKTsKLQotCXJldHVybiAwOwotfQotCi0KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9hdGFyaS9jb25maWcuYyBiL2FyY2gvbTY4ay9hdGFyaS9jb25maWcuYwppbmRleCAxMDEyYjA4Li43MjcyODlhIDEwMDY0NAotLS0gYS9hcmNoL202OGsvYXRhcmkvY29uZmlnLmMKKysrIGIvYXJjaC9tNjhrL2F0YXJpL2NvbmZpZy5jCkBAIC01NywxMiArNTcsNiBAQAogCiAvKiBhdGFyaSBzcGVjaWZpYyBpcnEgZnVuY3Rpb25zICovCiBleHRlcm4gdm9pZCBhdGFyaV9pbml0X0lSUSAodm9pZCk7Ci1leHRlcm4gaW50IGF0YXJpX3JlcXVlc3RfaXJxICh1bnNpZ25lZCBpbnQgaXJxLCBpcnFyZXR1cm5fdCAoKmhhbmRsZXIpKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldm5hbWUsIHZvaWQgKmRldl9pZCk7Ci1leHRlcm4gdm9pZCBhdGFyaV9mcmVlX2lycSAodW5zaWduZWQgaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKLWV4dGVybiB2b2lkIGF0YXJpX2VuYWJsZV9pcnEgKHVuc2lnbmVkIGludCk7Ci1leHRlcm4gdm9pZCBhdGFyaV9kaXNhYmxlX2lycSAodW5zaWduZWQgaW50KTsKLWV4dGVybiBpbnQgc2hvd19hdGFyaV9pbnRlcnJ1cHRzIChzdHJ1Y3Qgc2VxX2ZpbGUgKiwgdm9pZCAqKTsKIGV4dGVybiB2b2lkIGF0YXJpX21rc291bmQoIHVuc2lnbmVkIGludCBjb3VudCwgdW5zaWduZWQgaW50IHRpY2tzICk7CiAjaWZkZWYgQ09ORklHX0hFQVJUQkVBVAogc3RhdGljIHZvaWQgYXRhcmlfaGVhcnRiZWF0KCBpbnQgb24gKTsKQEAgLTIzMiwxMyArMjI2LDggQEAKIAogICAgIG1hY2hfc2NoZWRfaW5pdCAgICAgID0gYXRhcmlfc2NoZWRfaW5pdDsKICAgICBtYWNoX2luaXRfSVJRICAgICAgICA9IGF0YXJpX2luaXRfSVJROwotICAgIG1hY2hfcmVxdWVzdF9pcnEgICAgID0gYXRhcmlfcmVxdWVzdF9pcnE7Ci0gICAgbWFjaF9mcmVlX2lycSAgICAgICAgPSBhdGFyaV9mcmVlX2lycTsKLSAgICBlbmFibGVfaXJxICAgICAgICAgICA9IGF0YXJpX2VuYWJsZV9pcnE7Ci0gICAgZGlzYWJsZV9pcnEgICAgICAgICAgPSBhdGFyaV9kaXNhYmxlX2lycTsKICAgICBtYWNoX2dldF9tb2RlbAkgPSBhdGFyaV9nZXRfbW9kZWw7CiAgICAgbWFjaF9nZXRfaGFyZHdhcmVfbGlzdCA9IGF0YXJpX2dldF9oYXJkd2FyZV9saXN0OwotICAgIG1hY2hfZ2V0X2lycV9saXN0CSA9IHNob3dfYXRhcmlfaW50ZXJydXB0czsKICAgICBtYWNoX2dldHRpbWVvZmZzZXQgICA9IGF0YXJpX2dldHRpbWVvZmZzZXQ7CiAgICAgbWFjaF9yZXNldCAgICAgICAgICAgPSBhdGFyaV9yZXNldDsKICAgICBtYWNoX21heF9kbWFfYWRkcmVzcyA9IDB4ZmZmZmZmOwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2J2bWU2MDAwL01ha2VmaWxlIGIvYXJjaC9tNjhrL2J2bWU2MDAwL01ha2VmaWxlCmluZGV4IDIzNDhlNmMuLmQ4MTc0MDAgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9idm1lNjAwMC9NYWtlZmlsZQorKysgYi9hcmNoL202OGsvYnZtZTYwMDAvTWFrZWZpbGUKQEAgLTIsNCArMiw0IEBACiAjIE1ha2VmaWxlIGZvciBMaW51eCBhcmNoL202OGsvYnZtZTYwMDAgc291cmNlIGRpcmVjdG9yeQogIwogCi1vYmoteQkJOj0gY29uZmlnLm8gYnZtZWludHMubyBydGMubworb2JqLXkJCTo9IGNvbmZpZy5vIHJ0Yy5vCmRpZmYgLS1naXQgYS9hcmNoL202OGsvYnZtZTYwMDAvYnZtZWludHMuYyBiL2FyY2gvbTY4ay9idm1lNjAwMC9idm1laW50cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOThhOGRmLi4wMDAwMDAwCi0tLSBhL2FyY2gvbTY4ay9idm1lNjAwMC9idm1laW50cy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8qCi0gKiBhcmNoL202OGsvYnZtZTYwMDAvYnZtZWludHMuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NyBSaWNoYXJkIEhpcnN0IFtyaWNoYXJkQHNsZWVwaWUuZGVtb24uY28udWtdCi0gKgotICogYmFzZWQgb24gYW1paW50cy5jIC0tIEFtaWdhIExpbnV4IGludGVycnVwdCBoYW5kbGluZyBjb2RlCi0gKgotICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgUkVBRE1FLmxlZ2FsIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKLSAqIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KLQotI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KLSNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci0jaW5jbHVkZSA8YXNtL2lycS5oPgotI2luY2x1ZGUgPGFzbS90cmFwcy5oPgotCi1zdGF0aWMgaXJxcmV0dXJuX3QgYnZtZTYwMDBfZGVmaGFuZCAoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqZnApOwotCi0vKgotICogVGhpcyBzaG91bGQgaWRlYWxseSBiZSA0IGVsZW1lbnRzIG9ubHksIGZvciBzcGVlZC4KLSAqLwotCi1zdGF0aWMgc3RydWN0IHsKLQlpcnFyZXR1cm5fdAkoKmhhbmRsZXIpKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKTsKLQl1bnNpZ25lZCBsb25nCWZsYWdzOwotCXZvaWQJCSpkZXZfaWQ7Ci0JY29uc3QgY2hhcgkqZGV2bmFtZTsKLQl1bnNpZ25lZAljb3VudDsKLX0gaXJxX3RhYlsyNTZdOwotCi0vKgotICogdm9pZCBidm1lNjAwMF9pbml0X0lSUSAodm9pZCkKLSAqCi0gKiBQYXJhbWV0ZXJzOglOb25lCi0gKgotICogUmV0dXJuczoJTm90aGluZwotICoKLSAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGR1cmluZyBrZXJuZWwgc3RhcnR1cCB0byBpbml0aWFsaXplCi0gKiB0aGUgYnZtZTYwMDAgSVJRIGhhbmRsaW5nIHJvdXRpbmVzLgotICovCi0KLXZvaWQgYnZtZTYwMDBfaW5pdF9JUlEgKHZvaWQpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKLQkJaXJxX3RhYltpXS5oYW5kbGVyID0gYnZtZTYwMDBfZGVmaGFuZDsKLQkJaXJxX3RhYltpXS5mbGFncyA9IElSUV9GTEdfU1REOwotCQlpcnFfdGFiW2ldLmRldl9pZCA9IE5VTEw7Ci0JCWlycV90YWJbaV0uZGV2bmFtZSA9IE5VTEw7Ci0JCWlycV90YWJbaV0uY291bnQgPSAwOwotCX0KLX0KLQotaW50IGJ2bWU2MDAwX3JlcXVlc3RfaXJxKHVuc2lnbmVkIGludCBpcnEsCi0JCWlycXJldHVybl90ICgqaGFuZGxlcikoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopLAotICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldm5hbWUsIHZvaWQgKmRldl9pZCkKLXsKLQlpZiAoaXJxID4gMjU1KSB7Ci0JCXByaW50aygiJXM6IEluY29ycmVjdCBJUlEgJWQgZnJvbSAlc1xuIiwgX19GVU5DVElPTl9fLCBpcnEsIGRldm5hbWUpOwotCQlyZXR1cm4gLUVOWElPOwotCX0KLSNpZiAwCi0JLyogTm90aGluZyBzcGVjaWFsIGFib3V0IGF1dG8tdmVjdG9yZWQgZGV2aWNlcyBmb3IgdGhlIEJWTUU2MDAwLAotCSAqIGJ1dCB0cmVhdCBpdCBzcGVjaWFsbHkgdG8gYXZvaWQgY2hhbmdlcyBlbHNld2hlcmUuCi0JICovCi0KLQlpZiAoaXJxID49IFZFQ19JTlQxICYmIGlycSA8PSBWRUNfSU5UNykKLQkJcmV0dXJuIGNwdV9yZXF1ZXN0X2lycShpcnEgLSBWRUNfU1BVUiwgaGFuZGxlciwgZmxhZ3MsCi0JCQkJCQlkZXZuYW1lLCBkZXZfaWQpOwotI2VuZGlmCi0JaWYgKCEoaXJxX3RhYltpcnFdLmZsYWdzICYgSVJRX0ZMR19TVEQpKSB7Ci0JCWlmIChpcnFfdGFiW2lycV0uZmxhZ3MgJiBJUlFfRkxHX0xPQ0spIHsKLQkJCXByaW50aygiJXM6IElSUSAlZCBmcm9tICVzIGlzIG5vdCByZXBsYWNlYWJsZVxuIiwKLQkJCSAgICAgICBfX0ZVTkNUSU9OX18sIGlycSwgaXJxX3RhYltpcnFdLmRldm5hbWUpOwotCQkJcmV0dXJuIC1FQlVTWTsKLQkJfQotCQlpZiAoZmxhZ3MgJiBJUlFfRkxHX1JFUExBQ0UpIHsKLQkJCXByaW50aygiJXM6ICVzIGNhbid0IHJlcGxhY2UgSVJRICVkIGZyb20gJXNcbiIsCi0JCQkgICAgICAgX19GVU5DVElPTl9fLCBkZXZuYW1lLCBpcnEsIGlycV90YWJbaXJxXS5kZXZuYW1lKTsKLQkJCXJldHVybiAtRUJVU1k7Ci0JCX0KLQl9Ci0JaXJxX3RhYltpcnFdLmhhbmRsZXIgPSBoYW5kbGVyOwotCWlycV90YWJbaXJxXS5mbGFncyAgID0gZmxhZ3M7Ci0JaXJxX3RhYltpcnFdLmRldl9pZCAgPSBkZXZfaWQ7Ci0JaXJxX3RhYltpcnFdLmRldm5hbWUgPSBkZXZuYW1lOwotCXJldHVybiAwOwotfQotCi12b2lkIGJ2bWU2MDAwX2ZyZWVfaXJxKHVuc2lnbmVkIGludCBpcnEsIHZvaWQgKmRldl9pZCkKLXsKLQlpZiAoaXJxID4gMjU1KSB7Ci0JCXByaW50aygiJXM6IEluY29ycmVjdCBJUlEgJWRcbiIsIF9fRlVOQ1RJT05fXywgaXJxKTsKLQkJcmV0dXJuOwotCX0KLSNpZiAwCi0JaWYgKGlycSA+PSBWRUNfSU5UMSAmJiBpcnEgPD0gVkVDX0lOVDcpIHsKLQkJY3B1X2ZyZWVfaXJxKGlycSAtIFZFQ19TUFVSLCBkZXZfaWQpOwotCQlyZXR1cm47Ci0JfQotI2VuZGlmCi0JaWYgKGlycV90YWJbaXJxXS5kZXZfaWQgIT0gZGV2X2lkKQotCQlwcmludGsoIiVzOiBSZW1vdmluZyBwcm9iYWJseSB3cm9uZyBJUlEgJWQgZnJvbSAlc1xuIiwKLQkJICAgICAgIF9fRlVOQ1RJT05fXywgaXJxLCBpcnFfdGFiW2lycV0uZGV2bmFtZSk7Ci0KLQlpcnFfdGFiW2lycV0uaGFuZGxlciA9IGJ2bWU2MDAwX2RlZmhhbmQ7Ci0JaXJxX3RhYltpcnFdLmZsYWdzICAgPSBJUlFfRkxHX1NURDsKLQlpcnFfdGFiW2lycV0uZGV2X2lkICA9IE5VTEw7Ci0JaXJxX3RhYltpcnFdLmRldm5hbWUgPSBOVUxMOwotfQotCi1pcnFyZXR1cm5fdCBidm1lNjAwMF9wcm9jZXNzX2ludCAodW5zaWduZWQgbG9uZyB2ZWMsIHN0cnVjdCBwdF9yZWdzICpmcCkKLXsKLQlpZiAodmVjID4gMjU1KSB7Ci0JCXByaW50ayAoImJ2bWU2MDAwX3Byb2Nlc3NfaW50OiBJbGxlZ2FsIHZlY3RvciAlbGQiLCB2ZWMpOwotCQlyZXR1cm4gSVJRX05PTkU7Ci0JfSBlbHNlIHsKLQkJaXJxX3RhYlt2ZWNdLmNvdW50Kys7Ci0JCWlycV90YWJbdmVjXS5oYW5kbGVyKHZlYywgaXJxX3RhYlt2ZWNdLmRldl9pZCwgZnApOwotCQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci0JfQotfQotCi1pbnQgc2hvd19idm1lNjAwMF9pbnRlcnJ1cHRzKHN0cnVjdCBzZXFfZmlsZSAqcCwgdm9pZCAqdikKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgewotCQlpZiAoaXJxX3RhYltpXS5jb3VudCkKLQkJCXNlcV9wcmludGYocCwgIlZlYyAweCUwMng6ICU4ZCAgJXNcbiIsCi0JCQkgICAgaSwgaXJxX3RhYltpXS5jb3VudCwKLQkJCSAgICBpcnFfdGFiW2ldLmRldm5hbWUgPyBpcnFfdGFiW2ldLmRldm5hbWUgOiAiZnJlZSIpOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgaXJxcmV0dXJuX3QgYnZtZTYwMDBfZGVmaGFuZCAoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqZnApCi17Ci0JcHJpbnRrICgiVW5rbm93biBpbnRlcnJ1cHQgMHglMDJ4XG4iLCBpcnEpOwotCXJldHVybiBJUlFfTk9ORTsKLX0KLQotdm9pZCBidm1lNjAwMF9lbmFibGVfaXJxICh1bnNpZ25lZCBpbnQgaXJxKQotewotfQotCi0KLXZvaWQgYnZtZTYwMDBfZGlzYWJsZV9pcnEgKHVuc2lnbmVkIGludCBpcnEpCi17Ci19Ci0KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9idm1lNjAwMC9jb25maWcuYyBiL2FyY2gvbTY4ay9idm1lNjAwMC9jb25maWcuYwppbmRleCBjOTBjYjVmLi5kMWU5MTZhIDEwMDY0NAotLS0gYS9hcmNoL202OGsvYnZtZTYwMDAvY29uZmlnLmMKKysrIGIvYXJjaC9tNjhrL2J2bWU2MDAwL2NvbmZpZy5jCkBAIC0zNiwxNSArMzYsOCBAQAogI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CiAjaW5jbHVkZSA8YXNtL2J2bWU2MDAwaHcuaD4KIAotZXh0ZXJuIGlycXJldHVybl90IGJ2bWU2MDAwX3Byb2Nlc3NfaW50IChpbnQgbGV2ZWwsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKLWV4dGVybiB2b2lkIGJ2bWU2MDAwX2luaXRfSVJRICh2b2lkKTsKLWV4dGVybiB2b2lkIGJ2bWU2MDAwX2ZyZWVfaXJxICh1bnNpZ25lZCBpbnQsIHZvaWQgKik7Ci1leHRlcm4gaW50ICBzaG93X2J2bWU2MDAwX2ludGVycnVwdHMoc3RydWN0IHNlcV9maWxlICosIHZvaWQgKik7Ci1leHRlcm4gdm9pZCBidm1lNjAwMF9lbmFibGVfaXJxICh1bnNpZ25lZCBpbnQpOwotZXh0ZXJuIHZvaWQgYnZtZTYwMDBfZGlzYWJsZV9pcnEgKHVuc2lnbmVkIGludCk7CiBzdGF0aWMgdm9pZCBidm1lNjAwMF9nZXRfbW9kZWwoY2hhciAqbW9kZWwpOwogc3RhdGljIGludCAgYnZtZTYwMDBfZ2V0X2hhcmR3YXJlX2xpc3QoY2hhciAqYnVmZmVyKTsKLWV4dGVybiBpbnQgIGJ2bWU2MDAwX3JlcXVlc3RfaXJxKHVuc2lnbmVkIGludCBpcnEsIGlycXJldHVybl90ICgqaGFuZGxlcikoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopLCB1bnNpZ25lZCBsb25nIGZsYWdzLCBjb25zdCBjaGFyICpkZXZuYW1lLCB2b2lkICpkZXZfaWQpOwogZXh0ZXJuIHZvaWQgYnZtZTYwMDBfc2NoZWRfaW5pdChpcnFyZXR1cm5fdCAoKmhhbmRsZXIpKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKSk7CiBleHRlcm4gdW5zaWduZWQgbG9uZyBidm1lNjAwMF9nZXR0aW1lb2Zmc2V0ICh2b2lkKTsKIGV4dGVybiBpbnQgYnZtZTYwMDBfaHdjbGsgKGludCwgc3RydWN0IHJ0Y190aW1lICopOwpAQCAtMTAwLDYgKzkzLDE0IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBkdXJpbmcga2VybmVsIHN0YXJ0dXAgdG8gaW5pdGlhbGl6ZQorICogdGhlIGJ2bWU2MDAwIElSUSBoYW5kbGluZyByb3V0aW5lcy4KKyAqLworc3RhdGljIHZvaWQgYnZtZTYwMDBfaW5pdF9JUlEodm9pZCkKK3sKKwltNjhrX3NldHVwX3VzZXJfaW50ZXJydXB0KFZFQ19VU0VSLCAxOTIsIE5VTEwpOworfQogCiB2b2lkIF9faW5pdCBjb25maWdfYnZtZTYwMDAodm9pZCkKIHsKQEAgLTEyNywxMiArMTI4LDYgQEAKICAgICBtYWNoX2h3Y2xrICAgICAgICAgICA9IGJ2bWU2MDAwX2h3Y2xrOwogICAgIG1hY2hfc2V0X2Nsb2NrX21tc3MJID0gYnZtZTYwMDBfc2V0X2Nsb2NrX21tc3M7CiAgICAgbWFjaF9yZXNldAkJID0gYnZtZTYwMDBfcmVzZXQ7Ci0gICAgbWFjaF9mcmVlX2lycQkgPSBidm1lNjAwMF9mcmVlX2lycTsKLSAgICBtYWNoX3Byb2Nlc3NfaW50CSA9IGJ2bWU2MDAwX3Byb2Nlc3NfaW50OwotICAgIG1hY2hfZ2V0X2lycV9saXN0CSA9IHNob3dfYnZtZTYwMDBfaW50ZXJydXB0czsKLSAgICBtYWNoX3JlcXVlc3RfaXJxCSA9IGJ2bWU2MDAwX3JlcXVlc3RfaXJxOwotICAgIGVuYWJsZV9pcnEJCSA9IGJ2bWU2MDAwX2VuYWJsZV9pcnE7Ci0gICAgZGlzYWJsZV9pcnEgICAgICAgICAgPSBidm1lNjAwMF9kaXNhYmxlX2lycTsKICAgICBtYWNoX2dldF9tb2RlbCAgICAgICA9IGJ2bWU2MDAwX2dldF9tb2RlbDsKICAgICBtYWNoX2dldF9oYXJkd2FyZV9saXN0ID0gYnZtZTYwMDBfZ2V0X2hhcmR3YXJlX2xpc3Q7CiAKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9ocDMwMC9NYWtlZmlsZSBiL2FyY2gvbTY4ay9ocDMwMC9NYWtlZmlsZQppbmRleCA4OWI2MzE3Li4yODhiOWM2IDEwMDY0NAotLS0gYS9hcmNoL202OGsvaHAzMDAvTWFrZWZpbGUKKysrIGIvYXJjaC9tNjhrL2hwMzAwL01ha2VmaWxlCkBAIC0yLDQgKzIsNCBAQAogIyBNYWtlZmlsZSBmb3IgTGludXggYXJjaC9tNjhrL2hwMzAwIHNvdXJjZSBkaXJlY3RvcnkKICMKIAotb2JqLXkJCTo9IGtzeW1zLm8gY29uZmlnLm8gaW50cy5vIHRpbWUubyByZWJvb3Qubworb2JqLXkJCTo9IGtzeW1zLm8gY29uZmlnLm8gdGltZS5vIHJlYm9vdC5vCmRpZmYgLS1naXQgYS9hcmNoL202OGsvaHAzMDAvY29uZmlnLmMgYi9hcmNoL202OGsvaHAzMDAvY29uZmlnLmMKaW5kZXggNmQxMjllZS4uMmVmMjcxYyAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2hwMzAwL2NvbmZpZy5jCisrKyBiL2FyY2gvbTY4ay9ocDMwMC9jb25maWcuYwpAQCAtMjEsNyArMjEsNiBAQAogI2luY2x1ZGUgPGFzbS9ocDMwMGh3Lmg+CiAjaW5jbHVkZSA8YXNtL3J0Yy5oPgogCi0jaW5jbHVkZSAiaW50cy5oIgogI2luY2x1ZGUgInRpbWUuaCIKIAogdW5zaWduZWQgbG9uZyBocDMwMF9tb2RlbDsKQEAgLTY0LDggKzYzLDYgQEAKIHN0YXRpYyBjaGFyIGhwMzAwX21vZGVsX25hbWVbMTNdID0gIkhQOTAwMC8iOwogCiBleHRlcm4gdm9pZCBocDMwMF9yZXNldCh2b2lkKTsKLWV4dGVybiBpcnFyZXR1cm5fdCAoKmhwMzAwX2RlZmF1bHRfaGFuZGxlcltdKShpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik7Ci1leHRlcm4gaW50IHNob3dfaHAzMDBfaW50ZXJydXB0cyhzdHJ1Y3Qgc2VxX2ZpbGUgKiwgdm9pZCAqKTsKICNpZmRlZiBDT05GSUdfU0VSSUFMXzgyNTBfQ09OU09MRQogZXh0ZXJuIGludCBocDMwMF9zZXR1cF9zZXJpYWxfY29uc29sZSh2b2lkKSBfX2luaXQ7CiAjZW5kaWYKQEAgLTI0NSwxNiArMjQyLDE2IEBACiAJCWhwMzAwX3J0Y19yZWFkKFJUQ19SRUdfU0VDMik7CiB9CiAKK3N0YXRpYyB2b2lkIF9faW5pdCBocDMwMF9pbml0X0lSUSh2b2lkKQoreworfQorCiB2b2lkIF9faW5pdCBjb25maWdfaHAzMDAodm9pZCkKIHsKIAltYWNoX3NjaGVkX2luaXQgICAgICA9IGhwMzAwX3NjaGVkX2luaXQ7CiAJbWFjaF9pbml0X0lSUSAgICAgICAgPSBocDMwMF9pbml0X0lSUTsKLQltYWNoX3JlcXVlc3RfaXJxICAgICA9IGhwMzAwX3JlcXVlc3RfaXJxOwotCW1hY2hfZnJlZV9pcnEgICAgICAgID0gaHAzMDBfZnJlZV9pcnE7CiAJbWFjaF9nZXRfbW9kZWwgICAgICAgPSBocDMwMF9nZXRfbW9kZWw7Ci0JbWFjaF9nZXRfaXJxX2xpc3QgICAgPSBzaG93X2hwMzAwX2ludGVycnVwdHM7CiAJbWFjaF9nZXR0aW1lb2Zmc2V0ICAgPSBocDMwMF9nZXR0aW1lb2Zmc2V0OwotCW1hY2hfZGVmYXVsdF9oYW5kbGVyID0gJmhwMzAwX2RlZmF1bHRfaGFuZGxlcjsKIAltYWNoX2h3Y2xrCSAgICAgPSBocDMwMF9od2NsazsKIAltYWNoX2dldF9zcwkgICAgID0gaHAzMDBfZ2V0X3NzOwogCW1hY2hfcmVzZXQgICAgICAgICAgID0gaHAzMDBfcmVzZXQ7CmRpZmYgLS1naXQgYS9hcmNoL202OGsvaHAzMDAvaW50cy5jIGIvYXJjaC9tNjhrL2hwMzAwL2ludHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM1YmI0MC4uMDAwMDAwMAotLS0gYS9hcmNoL202OGsvaHAzMDAvaW50cy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8qCi0gKiAgbGludXgvYXJjaC9tNjhrL2hwMzAwL2ludHMuYwotICoKLSAqICBDb3B5cmlnaHQgKEMpIDE5OTggUGhpbGlwIEJsdW5kZWxsIDxwaGlsYkBnbnUub3JnPgotICoKLSAqICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIEhQMzAwLXNwZWNpZmljIGludGVycnVwdCBoYW5kbGluZy4KLSAqICBXZSBvbmx5IHVzZSB0aGUgYXV0b3ZlY3RvciBpbnRlcnJ1cHRzLCBhbmQgdGhlcmVmb3JlIHdlIG5lZWQgdG8KLSAqICBtYWludGFpbiBsaXN0cyBvZiBkZXZpY2VzIHNoYXJpbmcgZWFjaCBpcGwuCi0gKiAgW2lwbCBsaXN0IGNvZGUgYWRkZWQgYnkgUGV0ZXIgTWF5ZGVsbCA8cG1heWRlbGxAY2hpYXJrLmdyZWVuZW5kLm9yZy51az4gMDYvMTk5OF0KLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotI2luY2x1ZGUgPGFzbS90cmFwcy5oPgotI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KLSNpbmNsdWRlIDxhc20vZXJybm8uaD4KLSNpbmNsdWRlICJpbnRzLmgiCi0KLS8qIEVhY2ggaXBsIGhhcyBhIGxpbmtlZCBsaXN0IG9mIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmVzLgotICogU2VydmljZSByb3V0aW5lcyBhcmUgYWRkZWQgdmlhIGhwMzAwX3JlcXVlc3RfaXJxKCkgYW5kIHJlbW92ZWQKLSAqIHZpYSBocDMwMF9mcmVlX2lycSgpLiBUaGUgZGV2aWNlIGRyaXZlciBzaG91bGQgc2V0IElSUV9GTEdfRkFTVAotICogaWYgaXQgbmVlZHMgdG8gYmUgc2VydmljZWQgZWFybHkgKGVnIEZJRk9sZXNzIFVBUlRzKTsgdGhpcyB3aWxsCi0gKiBjYXVzZSBpdCB0byBiZSBhZGRlZCBhdCB0aGUgZnJvbnQgb2YgdGhlIHF1ZXVlIHJhdGhlciB0aGFuCi0gKiB0aGUgYmFjay4KLSAqIEN1cnJlbnRseSBJUlFfRkxHX1NMT1cgYW5kIGZsYWdzPTAgYXJlIHRyZWF0ZWQgaWRlbnRpY2FsbHk7IGlmCi0gKiB3ZSBuZWVkZWQgdGhyZWUgbGV2ZWxzIG9mIHByaW9yaXR5IHdlIGNvdWxkIGRpc3Rpbmd1aXNoIHRoZW0KLSAqIGJ1dCB0aGlzIHN0cmlrZXMgbWUgYXMgbWlsZGx5IHVnbHkuLi4KLSAqLwotCi0vKiB3ZSBzdGFydCB3aXRoIG5vIGVudHJpZXMgaW4gYW55IGxpc3QgKi8KLXN0YXRpYyBpcnFfbm9kZV90ICpocDMwMF9pcnFfbGlzdFtIUDMwMF9OVU1fSVJRU107Ci0KLXN0YXRpYyBzcGlubG9ja190IGlycWxpc3RfbG9jazsKLQotLyogVGhpcyBoYW5kbGVyIHJlY2VpdmVzIGFsbCBpbnRlcnJ1cHRzLCBkaXNwYXRjaGluZyB0aGVtIHRvIHRoZSByZWdpc3RlcmVkIGhhbmRsZXJzICovCi1zdGF0aWMgaXJxcmV0dXJuX3QgaHAzMDBfaW50X2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqZnApCi17Ci0gICAgICAgIGlycV9ub2RlX3QgKnQ7Ci0gICAgICAgIC8qIFdlIGp1c3QgZ2l2ZSBldmVyeSBoYW5kbGVyIG9uIHRoZSBjaGFpbiBhbiBvcHBvcnR1bml0eSB0byBoYW5kbGUKLSAgICAgICAgICogdGhlIGludGVycnVwdCwgaW4gcHJpb3JpdHkgb3JkZXIuCi0gICAgICAgICAqLwotICAgICAgICBmb3IodCA9IGhwMzAwX2lycV9saXN0W2lycV07IHQ7IHQ9dC0+bmV4dCkKLSAgICAgICAgICAgICAgICB0LT5oYW5kbGVyKGlycSwgdC0+ZGV2X2lkLCBmcCk7Ci0gICAgICAgIC8qIFdlIGNvdWxkIHB1dCBpbiBzb21lIGFjY291bnRpbmcgcm91dGluZXMsIGNoZWNrcyBmb3Igc3RyYXkgaW50ZXJydXB0cywKLSAgICAgICAgICogZXRjLCBpbiBoZXJlLiBOb3RlIHRoYXQgY3VycmVudGx5IHdlIGNhbid0IHRlbGwgd2hldGhlciBvciBub3QKLSAgICAgICAgICogYSBoYW5kbGVyIGhhbmRsZXMgdGhlIGludGVycnVwdCwgdGhvdWdoLgotICAgICAgICAgKi8KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCBocDMwMF9iYWRpbnQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqZnApCi17Ci0JbnVtX3NwdXJpb3VzICs9IDE7Ci0JcmV0dXJuIElSUV9OT05FOwotfQotCi1pcnFyZXR1cm5fdCAoKmhwMzAwX2RlZmF1bHRfaGFuZGxlcltTWVNfSVJRU10pKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKSA9IHsKLQlbMF0gPSBocDMwMF9iYWRpbnQsCi0JWzFdID0gaHAzMDBfaW50X2hhbmRsZXIsCi0JWzJdID0gaHAzMDBfaW50X2hhbmRsZXIsCi0JWzNdID0gaHAzMDBfaW50X2hhbmRsZXIsCi0JWzRdID0gaHAzMDBfaW50X2hhbmRsZXIsCi0JWzVdID0gaHAzMDBfaW50X2hhbmRsZXIsCi0JWzZdID0gaHAzMDBfaW50X2hhbmRsZXIsCi0JWzddID0gaHAzMDBfaW50X2hhbmRsZXIKLX07Ci0KLS8qIGRldl9pZCBoYWQgYmV0dGVyIGJlIHVuaXF1ZSB0byBlYWNoIGhhbmRsZXIgYmVjYXVzZSBpdCdzIHRoZSBvbmx5IHdheSB3ZSBoYXZlCi0gKiB0byBkaXN0aW5ndWlzaCBoYW5kbGVycyB3aGVuIHJlbW92aW5nIHRoZW0uLi4KLSAqCi0gKiBJdCB3b3VsZCBiZSBwcmV0dHkgZWFzeSB0byBzdXBwb3J0IElSUV9GTEdfTE9DSyAoaGFuZGxlciBpcyBub3QgcmVwbGFjYWJsZSkKLSAqIGFuZCBJUlFfRkxHX1JFUExBQ0UgKGhhbmRsZXIgcmVwbGFjZXMgZXhpc3Rpbmcgb25lIHdpdGggdGhpcyBkZXZfaWQpCi0gKiBpZiB3ZSB3YW50ZWQgdG8uIElSUV9GTEdfRkFTVCBpcyBuZWVkZWQgZm9yIGRldmljZXMgd2hlcmUgaW50ZXJydXB0IGxhdGVuY3kKLSAqIG1hdHRlcnMgKGVnIHRoZSBkcmVhZGVkIEZJRk9sZXNzIFVBUlQuLi4pCi0gKi8KLWludCBocDMwMF9yZXF1ZXN0X2lycSh1bnNpZ25lZCBpbnQgaXJxLAotICAgICAgICAgICAgICAgICAgICAgIGlycXJldHVybl90ICgqaGFuZGxlcikgKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKSwKLSAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzLCBjb25zdCBjaGFyICpkZXZuYW1lLCB2b2lkICpkZXZfaWQpCi17Ci0gICAgICAgIGlycV9ub2RlX3QgKnQsICpuID0gbmV3X2lycV9ub2RlKCk7Ci0KLSAgICAgICAgaWYgKCFuKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb29wcywgbm8gZnJlZSBub2RlcyAqLwotICAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmlycWxpc3RfbG9jaywgZmxhZ3MpOwotCi0gICAgICAgIGlmICghaHAzMDBfaXJxX2xpc3RbaXJxXSkgewotICAgICAgICAgICAgICAgIC8qIG5vIGxpc3QgeWV0ICovCi0gICAgICAgICAgICAgICAgaHAzMDBfaXJxX2xpc3RbaXJxXSA9IG47Ci0gICAgICAgICAgICAgICAgbi0+bmV4dCA9IE5VTEw7Ci0gICAgICAgIH0gZWxzZSBpZiAoZmxhZ3MgJiBJUlFfRkxHX0ZBU1QpIHsKLSAgICAgICAgICAgICAgICAvKiBpbnNlcnQgYXQgaGVhZCBvZiBsaXN0ICovCi0gICAgICAgICAgICAgICAgbi0+bmV4dCA9IGhwMzAwX2lycV9saXN0W2lycV07Ci0gICAgICAgICAgICAgICAgaHAzMDBfaXJxX2xpc3RbaXJxXSA9IG47Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLyogaW5zZXJ0IGF0IGVuZCBvZiBsaXN0ICovCi0gICAgICAgICAgICAgICAgZm9yKHQgPSBocDMwMF9pcnFfbGlzdFtpcnFdOyB0LT5uZXh0OyB0ID0gdC0+bmV4dCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvIG5vdGhpbmcgKi87Ci0gICAgICAgICAgICAgICAgbi0+bmV4dCA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgdC0+bmV4dCA9IG47Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBGaWxsIGluIG4gYXBwcm9wcmlhdGVseSAqLwotICAgICAgICBuLT5oYW5kbGVyID0gaGFuZGxlcjsKLSAgICAgICAgbi0+ZmxhZ3MgPSBmbGFnczsKLSAgICAgICAgbi0+ZGV2X2lkID0gZGV2X2lkOwotICAgICAgICBuLT5kZXZuYW1lID0gZGV2bmFtZTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcnFsaXN0X2xvY2ssIGZsYWdzKTsKLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBocDMwMF9mcmVlX2lycSh1bnNpZ25lZCBpbnQgaXJxLCB2b2lkICpkZXZfaWQpCi17Ci0gICAgICAgIGlycV9ub2RlX3QgKnQ7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLSAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmlycWxpc3RfbG9jaywgZmxhZ3MpOwotCi0gICAgICAgIHQgPSBocDMwMF9pcnFfbGlzdFtpcnFdOwotICAgICAgICBpZiAoIXQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBubyBoYW5kbGVycyBhdCBhbGwgZm9yIHRoYXQgSVJRICovCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgImhwMzAwX2ZyZWVfaXJxOiBhdHRlbXB0IHRvIHJlbW92ZSBub25leGlzdGVudCBoYW5kbGVyIGZvciBJUlEgJWRcbiIsIGlycSk7Ci0gICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXJxbGlzdF9sb2NrLCBmbGFncyk7Ci0JCXJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh0LT5kZXZfaWQgPT0gZGV2X2lkKQotICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZW1vdmluZyBmaXJzdCBoYW5kbGVyIG9uIGNoYWluICovCi0gICAgICAgICAgICAgICAgdC0+ZmxhZ3MgPSBJUlFfRkxHX1NURDsgICAgICAgICAgIC8qIHdlIHByb2JhYmx5IGRvbid0IHJlYWxseSBuZWVkIHRoZXNlICovCi0gICAgICAgICAgICAgICAgdC0+ZGV2X2lkID0gTlVMTDsKLSAgICAgICAgICAgICAgICB0LT5kZXZuYW1lID0gTlVMTDsKLSAgICAgICAgICAgICAgICB0LT5oYW5kbGVyID0gTlVMTDsgICAgICAgICAgICAgICAgLyogZnJlZXMgdGhpcyBpcnFfbm9kZV90ICovCi0gICAgICAgICAgICAgICAgaHAzMDBfaXJxX2xpc3RbaXJxXSA9IHQtPm5leHQ7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlycWxpc3RfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBPSywgbXVzdCBiZSByZW1vdmluZyBmcm9tIG1pZGRsZSBvZiB0aGUgY2hhaW4gKi8KLQotICAgICAgICBmb3IgKHQgPSBocDMwMF9pcnFfbGlzdFtpcnFdOyB0LT5uZXh0ICYmIHQtPm5leHQtPmRldl9pZCAhPSBkZXZfaWQ7IHQgPSB0LT5uZXh0KQotICAgICAgICAgICAgICAgIC8qIGRvIG5vdGhpbmcgKi87Ci0gICAgICAgIGlmICghdC0+bmV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiaHAzMDBfZnJlZV9pcnE6IGF0dGVtcHQgdG8gcmVtb3ZlIG5vbmV4aXN0ZW50IGhhbmRsZXIgZm9yIElSUSAlZFxuIiwgaXJxKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXJxbGlzdF9sb2NrLCBmbGFncyk7Ci0JCXJldHVybjsKLSAgICAgICAgfQotICAgICAgICAvKiByZW1vdmUgdGhlIGVudHJ5IGFmdGVyIHQ6ICovCi0gICAgICAgIHQtPm5leHQtPmZsYWdzID0gSVJRX0ZMR19TVEQ7Ci0gICAgICAgIHQtPm5leHQtPmRldl9pZCA9IE5VTEw7Ci0JdC0+bmV4dC0+ZGV2bmFtZSA9IE5VTEw7Ci0JdC0+bmV4dC0+aGFuZGxlciA9IE5VTEw7Ci0gICAgICAgIHQtPm5leHQgPSB0LT5uZXh0LT5uZXh0OwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXJxbGlzdF9sb2NrLCBmbGFncyk7Ci19Ci0KLWludCBzaG93X2hwMzAwX2ludGVycnVwdHMoc3RydWN0IHNlcV9maWxlICpwLCB2b2lkICp2KQotewotCXJldHVybiAwOwotfQotCi12b2lkIF9faW5pdCBocDMwMF9pbml0X0lSUSh2b2lkKQotewotCXNwaW5fbG9ja19pbml0KCZpcnFsaXN0X2xvY2spOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2hwMzAwL2ludHMuaCBiL2FyY2gvbTY4ay9ocDMwMC9pbnRzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjZmFiZTIuLjAwMDAwMDAKLS0tIGEvYXJjaC9tNjhrL2hwMzAwL2ludHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotZXh0ZXJuIHZvaWQgaHAzMDBfaW5pdF9JUlEodm9pZCk7Ci1leHRlcm4gdm9pZCAoKmhwMzAwX2hhbmRsZXJzWzhdKShpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik7Ci1leHRlcm4gdm9pZCBocDMwMF9mcmVlX2lycSh1bnNpZ25lZCBpbnQgaXJxLCB2b2lkICpkZXZfaWQpOwotZXh0ZXJuIGludCBocDMwMF9yZXF1ZXN0X2lycSh1bnNpZ25lZCBpbnQgaXJxLAotCQlpcnFyZXR1cm5fdCAoKmhhbmRsZXIpIChpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKiksCi0JCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldm5hbWUsIHZvaWQgKmRldl9pZCk7Ci0KLS8qIG51bWJlciBvZiBpbnRlcnJ1cHRzLCBpbmNsdWRlcyAwICh3aGF0J3MgdGhhdD8pICovCi0jZGVmaW5lIEhQMzAwX05VTV9JUlFTIDgKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9ocDMwMC90aW1lLmMgYi9hcmNoL202OGsvaHAzMDAvdGltZS5jCmluZGV4IDhkYTViMWIuLjdkZjA1NjYgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9ocDMwMC90aW1lLmMKKysrIGIvYXJjaC9tNjhrL2hwMzAwL3RpbWUuYwpAQCAtMTgsNyArMTgsNiBAQAogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vdHJhcHMuaD4KICNpbmNsdWRlIDxhc20vYmxpbmtlbi5oPgotI2luY2x1ZGUgImludHMuaCIKIAogLyogQ2xvY2sgaGFyZHdhcmUgZGVmaW5pdGlvbnMgKi8KIApAQCAtNzEsNyArNzAsNyBAQAogCiAgIGFzbSB2b2xhdGlsZSgiIG1vdnB3ICUwLCUxQCg1KSIgOiA6ICJkIiAoSU5UVkFMKSwgImEiIChDTE9DS0JBU0UpKTsKIAotICBjcHVfcmVxdWVzdF9pcnEoNiwgaHAzMDBfdGljaywgSVJRX0ZMR19TVEQsICJ0aW1lciB0aWNrIiwgdmVjdG9yKTsKKyAgcmVxdWVzdF9pcnEoSVJRX0FVVE9fNiwgaHAzMDBfdGljaywgSVJRX0ZMR19TVEQsICJ0aW1lciB0aWNrIiwgdmVjdG9yKTsKIAogICBvdXRfOChDTE9DS0JBU0UgKyBDTEtDUjIsIDB4MSk7CQkvKiBzZWxlY3QgQ1IxICovCiAgIG91dF84KENMT0NLQkFTRSArIENMS0NSMSwgMHg0MCk7CQkvKiBlbmFibGUgaXJxICovCmRpZmYgLS1naXQgYS9hcmNoL202OGsva2VybmVsL01ha2VmaWxlIGIvYXJjaC9tNjhrL2tlcm5lbC9NYWtlZmlsZQppbmRleCA0NTg5MjVjLi5kYWU2MDk3IDEwMDY0NAotLS0gYS9hcmNoL202OGsva2VybmVsL01ha2VmaWxlCisrKyBiL2FyY2gvbTY4ay9rZXJuZWwvTWFrZWZpbGUKQEAgLTksOCArOSw4IEBACiBlbmRpZgogZXh0cmEteQkrPSB2bWxpbnV4LmxkcwogCi1vYmoteQkJOj0gZW50cnkubyBwcm9jZXNzLm8gdHJhcHMubyBpbnRzLm8gc2lnbmFsLm8gcHRyYWNlLm8gXAotCQkJc3lzX202OGsubyB0aW1lLm8gc2VtYXBob3JlLm8gc2V0dXAubyBtNjhrX2tzeW1zLm8KK29iai15CTo9IGVudHJ5Lm8gcHJvY2Vzcy5vIHRyYXBzLm8gaW50cy5vIGRtYS5vIHNpZ25hbC5vIHB0cmFjZS5vIFwKKwkgICBzeXNfbTY4ay5vIHRpbWUubyBzZW1hcGhvcmUubyBzZXR1cC5vIG02OGtfa3N5bXMubwogCiBvYmotJChDT05GSUdfUENJKQkrPSBiaW9zMzIubwogb2JqLSQoQ09ORklHX01PRFVMRVMpCSs9IG1vZHVsZS5vCmRpZmYgLS1naXQgYS9hcmNoL202OGsva2VybmVsL2RtYS5jIGIvYXJjaC9tNjhrL2tlcm5lbC9kbWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzQ0OWY4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9tNjhrL2tlcm5lbC9kbWEuYwpAQCAtMCwwICsxLDEyOSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjdW5kZWYgREVCVUcKKworI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorCisjaW5jbHVkZSA8YXNtL3BnYWxsb2MuaD4KKyNpbmNsdWRlIDxhc20vc2NhdHRlcmxpc3QuaD4KKwordm9pZCAqZG1hX2FsbG9jX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsCisJCQkgZG1hX2FkZHJfdCAqaGFuZGxlLCBpbnQgZmxhZykKK3sKKwlzdHJ1Y3QgcGFnZSAqcGFnZSwgKiptYXA7CisJcGdwcm90X3QgcGdwcm90OworCXZvaWQgKmFkZHI7CisJaW50IGksIG9yZGVyOworCisJcHJfZGVidWcoImRtYV9hbGxvY19jb2hlcmVudDogJWQsJXhcbiIsIHNpemUsIGZsYWcpOworCisJc2l6ZSA9IFBBR0VfQUxJR04oc2l6ZSk7CisJb3JkZXIgPSBnZXRfb3JkZXIoc2l6ZSk7CisKKwlwYWdlID0gYWxsb2NfcGFnZXMoZmxhZywgb3JkZXIpOworCWlmICghcGFnZSkKKwkJcmV0dXJuIE5VTEw7CisKKwkqaGFuZGxlID0gcGFnZV90b19waHlzKHBhZ2UpOworCW1hcCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwYWdlICopIDw8IG9yZGVyLCBmbGFnICYgfl9fR0ZQX0RNQSk7CisJaWYgKCFtYXApIHsKKwkJX19mcmVlX3BhZ2VzKHBhZ2UsIG9yZGVyKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXNwbGl0X3BhZ2UocGFnZSwgb3JkZXIpOworCisJb3JkZXIgPSAxIDw8IG9yZGVyOworCXNpemUgPj49IFBBR0VfU0hJRlQ7CisJbWFwWzBdID0gcGFnZTsKKwlmb3IgKGkgPSAxOyBpIDwgc2l6ZTsgaSsrKQorCQltYXBbaV0gPSBwYWdlICsgaTsKKwlmb3IgKDsgaSA8IG9yZGVyOyBpKyspCisJCV9fZnJlZV9wYWdlKHBhZ2UgKyBpKTsKKwlwZ3Byb3QgPSBfX3BncHJvdChfUEFHRV9QUkVTRU5UIHwgX1BBR0VfQUNDRVNTRUQgfCBfUEFHRV9ESVJUWSk7CisJaWYgKENQVV9JU18wNDBfT1JfMDYwKQorCQlwZ3Byb3RfdmFsKHBncHJvdCkgfD0gX1BBR0VfR0xPQkFMMDQwIHwgX1BBR0VfTk9DQUNIRV9TOworCWVsc2UKKwkJcGdwcm90X3ZhbChwZ3Byb3QpIHw9IF9QQUdFX05PQ0FDSEUwMzA7CisJYWRkciA9IHZtYXAobWFwLCBzaXplLCBmbGFnLCBwZ3Byb3QpOworCWtmcmVlKG1hcCk7CisKKwlyZXR1cm4gYWRkcjsKK30KK0VYUE9SVF9TWU1CT0woZG1hX2FsbG9jX2NvaGVyZW50KTsKKwordm9pZCBkbWFfZnJlZV9jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLAorCQkgICAgICAgdm9pZCAqYWRkciwgZG1hX2FkZHJfdCBoYW5kbGUpCit7CisJcHJfZGVidWcoImRtYV9mcmVlX2NvaGVyZW50OiAlcCwgJXhcbiIsIGFkZHIsIGhhbmRsZSk7CisJdmZyZWUoYWRkcik7Cit9CitFWFBPUlRfU1lNQk9MKGRtYV9mcmVlX2NvaGVyZW50KTsKKworaW5saW5lIHZvaWQgZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGhhbmRsZSwgc2l6ZV90IHNpemUsCisJCQkJICAgICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcikKK3sKKwlzd2l0Y2ggKGRpcikgeworCWNhc2UgRE1BX1RPX0RFVklDRToKKwkJY2FjaGVfcHVzaChoYW5kbGUsIHNpemUpOworCQlicmVhazsKKwljYXNlIERNQV9GUk9NX0RFVklDRToKKwkJY2FjaGVfY2xlYXIoaGFuZGxlLCBzaXplKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJaWYgKHByaW50a19yYXRlbGltaXQoKSkKKwkJCXByaW50aygiZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2U6IHVuc3VwcG9ydGVkIGRpciAldVxuIiwgZGlyKTsKKwkJYnJlYWs7CisJfQorfQorRVhQT1JUX1NZTUJPTChkbWFfc3luY19zaW5nbGVfZm9yX2RldmljZSk7CisKK3ZvaWQgZG1hX3N5bmNfc2dfZm9yX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBuZW50cywKKwkJCSAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbmVudHM7IHNnKyssIGkrKykKKwkJZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UoZGV2LCBzZy0+ZG1hX2FkZHJlc3MsIHNnLT5sZW5ndGgsIGRpcik7Cit9CitFWFBPUlRfU1lNQk9MKGRtYV9zeW5jX3NnX2Zvcl9kZXZpY2UpOworCitkbWFfYWRkcl90IGRtYV9tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqYWRkciwgc2l6ZV90IHNpemUsCisJCQkgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcikKK3sKKwlkbWFfYWRkcl90IGhhbmRsZSA9IHZpcnRfdG9fYnVzKGFkZHIpOworCisJZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UoZGV2LCBoYW5kbGUsIHNpemUsIGRpcik7CisJcmV0dXJuIGhhbmRsZTsKK30KK0VYUE9SVF9TWU1CT0woZG1hX21hcF9zaW5nbGUpOworCitkbWFfYWRkcl90IGRtYV9tYXBfcGFnZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBwYWdlICpwYWdlLAorCQkJdW5zaWduZWQgbG9uZyBvZmZzZXQsIHNpemVfdCBzaXplLAorCQkJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQoreworCWRtYV9hZGRyX3QgaGFuZGxlID0gcGFnZV90b19waHlzKHBhZ2UpICsgb2Zmc2V0OworCisJZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UoZGV2LCBoYW5kbGUsIHNpemUsIGRpcik7CisJcmV0dXJuIGhhbmRsZTsKK30KK0VYUE9SVF9TWU1CT0woZG1hX21hcF9wYWdlKTsKKworaW50IGRtYV9tYXBfc2coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCBpbnQgbmVudHMsCisJICAgICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBuZW50czsgc2crKywgaSsrKSB7CisJCXNnLT5kbWFfYWRkcmVzcyA9IHBhZ2VfdG9fcGh5cyhzZy0+cGFnZSkgKyBzZy0+b2Zmc2V0OworCQlkbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShkZXYsIHNnLT5kbWFfYWRkcmVzcywgc2ctPmxlbmd0aCwgZGlyKTsKKwl9CisJcmV0dXJuIG5lbnRzOworfQorRVhQT1JUX1NZTUJPTChkbWFfbWFwX3NnKTsKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9rZXJuZWwvZW50cnkuUyBiL2FyY2gvbTY4ay9rZXJuZWwvZW50cnkuUwppbmRleCA1MjIwNzlmLi40NDliNjJiIDEwMDY0NAotLS0gYS9hcmNoL202OGsva2VybmVsL2VudHJ5LlMKKysrIGIvYXJjaC9tNjhrL2tlcm5lbC9lbnRyeS5TCkBAIC00NSw5ICs0NSwxMSBAQAogI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogCiAuZ2xvYmwgc3lzdGVtX2NhbGwsIGJ1c2VyciwgdHJhcCwgcmVzdW1lCi0uZ2xvYmwgaW50aGFuZGxlciwgc3lzX2NhbGxfdGFibGUKKy5nbG9ibCBzeXNfY2FsbF90YWJsZQogLmdsb2JsIHN5c19mb3JrLCBzeXNfY2xvbmUsIHN5c192Zm9yawogLmdsb2JsIHJldF9mcm9tX2ludGVycnVwdCwgYmFkX2ludGVycnVwdAorLmdsb2JsIGF1dG9faXJxaGFuZGxlcl9maXh1cAorLmdsb2JsIHVzZXJfaXJxdmVjX2ZpeHVwLCB1c2VyX2lycWhhbmRsZXJfZml4dXAKIAogLnRleHQKIEVOVFJZKGJ1c2VycikKQEAgLTE5MSw2NSArMTkzLDI5IEBACiAJamJyYQlyZXN1bWVfdXNlcnNwYWNlCiAKIAotI2lmIDAKLSNpZmRlZiBDT05GSUdfQU1JR0EKLWFtaV9pbnRoYW5kbGVyOgotCWFkZHFsCSMxLGlycV9zdGF0K0NQVVNUQVRfTE9DQUxfSVJRX0NPVU5UCi0JU0FWRV9BTExfSU5UCi0JR0VUX0NVUlJFTlQoJWQwKQorLyogVGhpcyBpcyB0aGUgbWFpbiBpbnRlcnJ1cHQgaGFuZGxlciBmb3IgYXV0b3ZlY3RvciBpbnRlcnJ1cHRzICovCiAKLQliZmV4dHUJJXNwQChQVF9WRUNUT1IpeyM0LCMxMn0sJWQwCi0JbW92ZWwJJWQwLCVhMAotCWFkZHFsCSMxLCVhMEAoa3N0YXQrU1RBVF9JUlEtVkVDT0ZGKFZFQ19TUFVSKSkKLQltb3ZlbAklYTBAKGF1dG9pcnFfbGlzdC1WRUNPRkYoVkVDX1NQVVIpKSwlYTAKLQotfCBhbWlnYSB2ZWN0b3IgaW50IGhhbmRsZXIgZ2V0IHRoZSByZXEgbWFzayBpbnN0ZWFkIG9mIGlycSB2ZWN0b3IKLQlsZWEJQ1VTVE9NQkFTRSwlYTEKLQltb3ZldwklYTFAKENfSU5UUkVRUiksJWQwCi0JYW5kdwklYTFAKENfSU5URU5BUiksJWQwCi0KLXwgcHJlcGFyZSBzdGFjayAocHVzaCBmcmFtZSBwb2ludGVyLCBkZXZfaWQgJiByZXEgbWFzaykKLQlwZWEJJXNwQAotCW1vdmVsCSVhMEAoSVJRX0RFVklEKSwlc3BALQotCW1vdmVsCSVkMCwlc3BALQotCXBlYQklcGNAKHJldF9mcm9tX2ludGVycnVwdDp3KQotCWpicmEJQChJUlFfSEFORExFUiwlYTApQCgwKQotCi1FTlRSWShubWlfaGFuZGxlcikKLQlydGUKLSNlbmRpZgotI2VuZGlmCi0KLS8qCi0qKiBUaGlzIGlzIHRoZSBtYWluIGludGVycnVwdCBoYW5kbGVyLCByZXNwb25zaWJsZSBmb3IgY2FsbGluZyBwcm9jZXNzX2ludCgpCi0qLwotaW50aGFuZGxlcjoKK0VOVFJZKGF1dG9faW50aGFuZGxlcikKIAlTQVZFX0FMTF9JTlQKIAlHRVRfQ1VSUkVOVCglZDApCiAJYWRkcWIJIzEsJWN1cnB0ckAoVEFTS19JTkZPK1RJTkZPX1BSRUVNUFQrMSkKIAkJCQkJfCAgcHV0IGV4Y2VwdGlvbiAjIGluIGQwCi0JYmZleHR1ICVzcEAoUFRfVkVDVE9SKXsjNCwjMTB9LCVkMAorCWJmZXh0dQklc3BAKFBUX1ZFQ1RPUil7IzQsIzEwfSwlZDAKKwlzdWJ3CSNWRUNfU1BVUiwlZDAKIAogCW1vdmVsCSVzcCwlc3BALQogCW1vdmVsCSVkMCwlc3BALQkJfCAgcHV0IHZlY3RvciAjIG9uIHN0YWNrCi0jaWYgZGVmaW5lZChNQUNIX1E0MF9PTkxZKSAmJiBkZWZpbmVkKENPTkZJR19CTEtfREVWX0ZEKQotCWJ0c3RiCSM0LDB4ZmYwMDAwMDAJCXwgUTQwIGZsb3BweSBuZWVkcyB2ZXJ5IHNwZWNpYWwgdHJlYXRtZW50IC4uLgotCWpiZXEJMWYKLQlidHN0YgkjMywweGZmMDAwMDA0Ci0JamJlcQkxZgotCWpic3IJZmxvcHB5X2hhcmRpbnQKLQlqYnJhCTNmCi0xOgotI2VuZGlmCi0JamJzcglwcm9jZXNzX2ludAkJfCAgcHJvY2VzcyB0aGUgSVJRCi0zOglhZGRxbAkjOCwlc3AJCQl8ICBwb3AgcGFyYW1ldGVycyBvZmYgc3RhY2sKK2F1dG9faXJxaGFuZGxlcl9maXh1cCA9IC4gKyAyCisJanNyCW02OGtfaGFuZGxlX2ludAkJfCAgcHJvY2VzcyB0aGUgSVJRCisJYWRkcWwJIzgsJXNwCQkJfCAgcG9wIHBhcmFtZXRlcnMgb2ZmIHN0YWNrCiAKIHJldF9mcm9tX2ludGVycnVwdDoKIAlzdWJxYgkjMSwlY3VycHRyQChUQVNLX0lORk8rVElORk9fUFJFRU1QVCsxKQotCWplcQkxZgotMjoKLQlSRVNUT1JFX0FMTAotMToKKwlqZXEJcmV0X2Zyb21fbGFzdF9pbnRlcnJ1cHQKKzI6CVJFU1RPUkVfQUxMCisKKwlBTElHTgorcmV0X2Zyb21fbGFzdF9pbnRlcnJ1cHQ6CiAJbW92ZXEJIyh+QUxMT1dJTlQ+PjgpJjB4ZmYsJWQwCiAJYW5kYgklc3BAKFBUX1NSKSwlZDAKIAlqbmUJMmIKQEAgLTI2MCwxMiArMjI2LDQyIEBACiAJcGVhCXJldF9mcm9tX2V4Y2VwdGlvbgogCWpyYQlkb19zb2Z0aXJxCiAKKy8qIEhhbmRsZXIgZm9yIHVzZXIgZGVmaW5lZCBpbnRlcnJ1cHQgdmVjdG9ycyAqLworCitFTlRSWSh1c2VyX2ludGhhbmRsZXIpCisJU0FWRV9BTExfSU5UCisJR0VUX0NVUlJFTlQoJWQwKQorCWFkZHFiCSMxLCVjdXJwdHJAKFRBU0tfSU5GTytUSU5GT19QUkVFTVBUKzEpCisJCQkJCXwgIHB1dCBleGNlcHRpb24gIyBpbiBkMAorCWJmZXh0dQklc3BAKFBUX1ZFQ1RPUil7IzQsIzEwfSwlZDAKK3VzZXJfaXJxdmVjX2ZpeHVwID0gLiArIDIKKwlzdWJ3CSNWRUNfVVNFUiwlZDAKKworCW1vdmVsCSVzcCwlc3BALQorCW1vdmVsCSVkMCwlc3BALQkJfCAgcHV0IHZlY3RvciAjIG9uIHN0YWNrCit1c2VyX2lycWhhbmRsZXJfZml4dXAgPSAuICsgMgorCWpzcgltNjhrX2hhbmRsZV9pbnQJCXwgIHByb2Nlc3MgdGhlIElSUQorCWFkZHFsCSM4LCVzcAkJCXwgIHBvcCBwYXJhbWV0ZXJzIG9mZiBzdGFjaworCisJc3VicWIJIzEsJWN1cnB0ckAoVEFTS19JTkZPK1RJTkZPX1BSRUVNUFQrMSkKKwlqZXEJcmV0X2Zyb21fbGFzdF9pbnRlcnJ1cHQKKwlSRVNUT1JFX0FMTAogCiAvKiBIYW5kbGVyIGZvciB1bmluaXRpYWxpemVkIGFuZCBzcHVyaW91cyBpbnRlcnJ1cHRzICovCiAKLWJhZF9pbnRlcnJ1cHQ6Ci0JYWRkcWwJIzEsbnVtX3NwdXJpb3VzCi0JcnRlCitFTlRSWShiYWRfaW50aGFuZGxlcikKKwlTQVZFX0FMTF9JTlQKKwlHRVRfQ1VSUkVOVCglZDApCisJYWRkcWIJIzEsJWN1cnB0ckAoVEFTS19JTkZPK1RJTkZPX1BSRUVNUFQrMSkKKworCW1vdmVsCSVzcCwlc3BALQorCWpzcgloYW5kbGVfYmFkaW50CisJYWRkcWwJIzQsJXNwCisKKwlzdWJxYgkjMSwlY3VycHRyQChUQVNLX0lORk8rVElORk9fUFJFRU1QVCsxKQorCWplcQlyZXRfZnJvbV9sYXN0X2ludGVycnVwdAorCVJFU1RPUkVfQUxMCisKIAogRU5UUlkoc3lzX2ZvcmspCiAJU0FWRV9TV0lUQ0hfU1RBQ0sKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9rZXJuZWwvaW50cy5jIGIvYXJjaC9tNjhrL2tlcm5lbC9pbnRzLmMKaW5kZXggNGI4NTUxNC4uNWE4MzQ0YiAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2tlcm5lbC9pbnRzLmMKKysrIGIvYXJjaC9tNjhrL2tlcm5lbC9pbnRzLmMKQEAgLTM5LDQ3ICszOSw0MCBAQAogI2luY2x1ZGUgPGFzbS90cmFwcy5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KKyNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgogCiAjaWZkZWYgQ09ORklHX1E0MAogI2luY2x1ZGUgPGFzbS9xNDBpbnRzLmg+CiAjZW5kaWYKIAotLyogdGFibGUgZm9yIHN5c3RlbSBpbnRlcnJ1cHQgaGFuZGxlcnMgKi8KLXN0YXRpYyBpcnFfaGFuZGxlcl90IGlycV9saXN0W1NZU19JUlFTXTsKK2V4dGVybiB1MzIgYXV0b19pcnFoYW5kbGVyX2ZpeHVwW107CitleHRlcm4gdTMyIHVzZXJfaXJxaGFuZGxlcl9maXh1cFtdOworZXh0ZXJuIHUxNiB1c2VyX2lycXZlY19maXh1cFtdOwogCi1zdGF0aWMgY29uc3QgY2hhciAqZGVmYXVsdF9uYW1lc1tTWVNfSVJRU10gPSB7Ci0JWzBdID0gInNwdXJpb3VzIGludCIsCi0JWzFdID0gImludDEgaGFuZGxlciIsCi0JWzJdID0gImludDIgaGFuZGxlciIsCi0JWzNdID0gImludDMgaGFuZGxlciIsCi0JWzRdID0gImludDQgaGFuZGxlciIsCi0JWzVdID0gImludDUgaGFuZGxlciIsCi0JWzZdID0gImludDYgaGFuZGxlciIsCi0JWzddID0gImludDcgaGFuZGxlciIKKy8qIHRhYmxlIGZvciBzeXN0ZW0gaW50ZXJydXB0IGhhbmRsZXJzICovCitzdGF0aWMgc3RydWN0IGlycV9ub2RlICppcnFfbGlzdFtOUl9JUlFTXTsKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NvbnRyb2xsZXIgKmlycV9jb250cm9sbGVyW05SX0lSUVNdOworc3RhdGljIGludCBpcnFfZGVwdGhbTlJfSVJRU107CisKK3N0YXRpYyBpbnQgbTY4a19maXJzdF91c2VyX3ZlYzsKKworc3RhdGljIHN0cnVjdCBpcnFfY29udHJvbGxlciBhdXRvX2lycV9jb250cm9sbGVyID0geworCS5uYW1lCQk9ICJhdXRvIiwKKwkubG9jawkJPSBTUElOX0xPQ0tfVU5MT0NLRUQsCisJLnN0YXJ0dXAJPSBtNjhrX2lycV9zdGFydHVwLAorCS5zaHV0ZG93bgk9IG02OGtfaXJxX3NodXRkb3duLAogfTsKIAotLyogVGhlIG51bWJlciBvZiBzcHVyaW91cyBpbnRlcnJ1cHRzICovCi12b2xhdGlsZSB1bnNpZ25lZCBpbnQgbnVtX3NwdXJpb3VzOworc3RhdGljIHN0cnVjdCBpcnFfY29udHJvbGxlciB1c2VyX2lycV9jb250cm9sbGVyID0geworCS5uYW1lCQk9ICJ1c2VyIiwKKwkubG9jawkJPSBTUElOX0xPQ0tfVU5MT0NLRUQsCisJLnN0YXJ0dXAJPSBtNjhrX2lycV9zdGFydHVwLAorCS5zaHV0ZG93bgk9IG02OGtfaXJxX3NodXRkb3duLAorfTsKIAogI2RlZmluZSBOVU1fSVJRX05PREVTIDEwMAogc3RhdGljIGlycV9ub2RlX3Qgbm9kZXNbTlVNX0lSUV9OT0RFU107CiAKLXN0YXRpYyB2b2lkIGR1bW15X2VuYWJsZV9pcnEodW5zaWduZWQgaW50IGlycSk7Ci1zdGF0aWMgdm9pZCBkdW1teV9kaXNhYmxlX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKLXN0YXRpYyBpbnQgZHVtbXlfcmVxdWVzdF9pcnEodW5zaWduZWQgaW50IGlycSwKLQkJaXJxcmV0dXJuX3QgKCpoYW5kbGVyKSAoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopLAotCQl1bnNpZ25lZCBsb25nIGZsYWdzLCBjb25zdCBjaGFyICpkZXZuYW1lLCB2b2lkICpkZXZfaWQpOwotc3RhdGljIHZvaWQgZHVtbXlfZnJlZV9pcnEodW5zaWduZWQgaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKLQotdm9pZCAoKmVuYWJsZV9pcnEpICh1bnNpZ25lZCBpbnQpID0gZHVtbXlfZW5hYmxlX2lycTsKLXZvaWQgKCpkaXNhYmxlX2lycSkgKHVuc2lnbmVkIGludCkgPSBkdW1teV9kaXNhYmxlX2lycTsKLQotaW50ICgqbWFjaF9yZXF1ZXN0X2lycSkgKHVuc2lnbmVkIGludCwgaXJxcmV0dXJuX3QgKCopKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKSwKLSAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nLCBjb25zdCBjaGFyICosIHZvaWQgKikgPSBkdW1teV9yZXF1ZXN0X2lycTsKLXZvaWQgKCptYWNoX2ZyZWVfaXJxKSAodW5zaWduZWQgaW50LCB2b2lkICopID0gZHVtbXlfZnJlZV9pcnE7Ci0KLXZvaWQgaW5pdF9pcnFfcHJvYyh2b2lkKTsKLQogLyoKICAqIHZvaWQgaW5pdF9JUlEodm9pZCkKICAqCkBAIC0xMDEsMTggKzk0LDcwIEBACiAJCWhhcmRpcnFfbWFza19pc19icm9rZW4oKTsKIAl9CiAKLQlmb3IgKGkgPSAwOyBpIDwgU1lTX0lSUVM7IGkrKykgewotCQlpZiAobWFjaF9kZWZhdWx0X2hhbmRsZXIpCi0JCQlpcnFfbGlzdFtpXS5oYW5kbGVyID0gKCptYWNoX2RlZmF1bHRfaGFuZGxlcilbaV07Ci0JCWlycV9saXN0W2ldLmZsYWdzICAgPSAwOwotCQlpcnFfbGlzdFtpXS5kZXZfaWQgID0gTlVMTDsKLQkJaXJxX2xpc3RbaV0uZGV2bmFtZSA9IGRlZmF1bHRfbmFtZXNbaV07Ci0JfQorCWZvciAoaSA9IElSUV9BVVRPXzE7IGkgPD0gSVJRX0FVVE9fNzsgaSsrKQorCQlpcnFfY29udHJvbGxlcltpXSA9ICZhdXRvX2lycV9jb250cm9sbGVyOwogCi0JZm9yIChpID0gMDsgaSA8IE5VTV9JUlFfTk9ERVM7IGkrKykKLQkJbm9kZXNbaV0uaGFuZGxlciA9IE5VTEw7CisJbWFjaF9pbml0X0lSUSgpOworfQogCi0JbWFjaF9pbml0X0lSUSAoKTsKKy8qKgorICogbTY4a19zZXR1cF9hdXRvX2ludGVycnVwdAorICogQGhhbmRsZXI6IGNhbGxlZCBmcm9tIGF1dG8gdmVjdG9yIGludGVycnVwdHMKKyAqCisgKiBzZXR1cCB0aGUgaGFuZGxlciB0byBiZSBjYWxsZWQgZnJvbSBhdXRvIHZlY3RvciBpbnRlcnJ1cHRzIGluc3RlYWQgb2YgdGhlCisgKiBzdGFuZGFyZCBtNjhrX2hhbmRsZV9pbnQoKSwgaXQgd2lsbCBiZSBjYWxsZWQgd2l0aCBpcnEgbnVtYmVycyBpbiB0aGUgcmFuZ2UKKyAqIGZyb20gSVJRX0FVVE9fMSAtIElSUV9BVVRPXzcuCisgKi8KK3ZvaWQgX19pbml0IG02OGtfc2V0dXBfYXV0b19pbnRlcnJ1cHQodm9pZCAoKmhhbmRsZXIpKHVuc2lnbmVkIGludCwgc3RydWN0IHB0X3JlZ3MgKikpCit7CisJaWYgKGhhbmRsZXIpCisJCSphdXRvX2lycWhhbmRsZXJfZml4dXAgPSAodTMyKWhhbmRsZXI7CisJZmx1c2hfaWNhY2hlKCk7Cit9CisKKy8qKgorICogbTY4a19zZXR1cF91c2VyX2ludGVycnVwdAorICogQHZlYzogZmlyc3QgdXNlciB2ZWN0b3IgaW50ZXJydXB0IHRvIGhhbmRsZQorICogQGNudDogbnVtYmVyIG9mIGFjdGl2ZSB1c2VyIHZlY3RvciBpbnRlcnJ1cHRzCisgKiBAaGFuZGxlcjogY2FsbGVkIGZyb20gdXNlciB2ZWN0b3IgaW50ZXJydXB0cworICoKKyAqIHNldHVwIHVzZXIgdmVjdG9yIGludGVycnVwdHMsIHRoaXMgaW5jbHVkZXMgYWN0aXZhdGluZyB0aGUgc3BlY2lmaWVkIHJhbmdlCisgKiBvZiBpbnRlcnJ1cHRzLCBvbmx5IHRoZW4gdGhlc2UgaW50ZXJydXB0cyBjYW4gYmUgcmVxdWVzdGVkIChub3RlOiB0aGlzIGlzCisgKiBkaWZmZXJlbnQgZnJvbSBhdXRvIHZlY3RvciBpbnRlcnJ1cHRzKS4gQW4gb3B0aW9uYWwgaGFuZGxlciBjYW4gYmUgaW5zdGFsbGVkCisgKiB0byBiZSBjYWxsZWQgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCBtNjhrX2hhbmRsZV9pbnQoKSwgaXQgd2lsbCBiZSBjYWxsZWQKKyAqIHdpdGggaXJxIG51bWJlcnMgc3RhcnRpbmcgZnJvbSBJUlFfVVNFUi4KKyAqLwordm9pZCBfX2luaXQgbTY4a19zZXR1cF91c2VyX2ludGVycnVwdCh1bnNpZ25lZCBpbnQgdmVjLCB1bnNpZ25lZCBpbnQgY250LAorCQkJCSAgICAgIHZvaWQgKCpoYW5kbGVyKSh1bnNpZ25lZCBpbnQsIHN0cnVjdCBwdF9yZWdzICopKQoreworCWludCBpOworCisJbTY4a19maXJzdF91c2VyX3ZlYyA9IHZlYzsKKwlmb3IgKGkgPSAwOyBpIDwgY250OyBpKyspCisJCWlycV9jb250cm9sbGVyW0lSUV9VU0VSICsgaV0gPSAmdXNlcl9pcnFfY29udHJvbGxlcjsKKwkqdXNlcl9pcnF2ZWNfZml4dXAgPSB2ZWMgLSBJUlFfVVNFUjsKKwlpZiAoaGFuZGxlcikKKwkJKnVzZXJfaXJxaGFuZGxlcl9maXh1cCA9ICh1MzIpaGFuZGxlcjsKKwlmbHVzaF9pY2FjaGUoKTsKK30KKworLyoqCisgKiBtNjhrX3NldHVwX2lycV9jb250cm9sbGVyCisgKiBAY29udHI6IGlycSBjb250cm9sbGVyIHdoaWNoIGNvbnRyb2xzIHNwZWNpZmllZCBpcnEKKyAqIEBpcnE6IGZpcnN0IGlycSB0byBiZSBtYW5hZ2VkIGJ5IHRoZSBjb250cm9sbGVyCisgKgorICogQ2hhbmdlIHRoZSBjb250cm9sbGVyIGZvciB0aGUgc3BlY2lmaWVkIHJhbmdlIG9mIGlycSwgd2hpY2ggd2lsbCBiZSB1c2VkIHRvCisgKiBtYW5hZ2UgdGhlc2UgaXJxLiBhdXRvL3VzZXIgaXJxIGFscmVhZHkgaGF2ZSBhIGRlZmF1bHQgY29udHJvbGxlciwgd2hpY2ggY2FuCisgKiBiZSBjaGFuZ2VkIGFzIHdlbGwsIGJ1dCB0aGUgY29udHJvbGxlciBwcm9iYWJseSBzaG91bGQgdXNlIG02OGtfaXJxX3N0YXJ0dXAvCisgKiBtNjhrX2lycV9zaHV0ZG93bi4KKyAqLwordm9pZCBtNjhrX3NldHVwX2lycV9jb250cm9sbGVyKHN0cnVjdCBpcnFfY29udHJvbGxlciAqY29udHIsIHVuc2lnbmVkIGludCBpcnEsCisJCQkgICAgICAgdW5zaWduZWQgaW50IGNudCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBjbnQ7IGkrKykKKwkJaXJxX2NvbnRyb2xsZXJbaXJxICsgaV0gPSBjb250cjsKIH0KIAogaXJxX25vZGVfdCAqbmV3X2lycV9ub2RlKHZvaWQpCkBAIC0xMjAsODQgKzE2NSwxODMgQEAKIAlpcnFfbm9kZV90ICpub2RlOwogCXNob3J0IGk7CiAKLQlmb3IgKG5vZGUgPSBub2RlcywgaSA9IE5VTV9JUlFfTk9ERVMtMTsgaSA+PSAwOyBub2RlKyssIGktLSkKLQkJaWYgKCFub2RlLT5oYW5kbGVyKQorCWZvciAobm9kZSA9IG5vZGVzLCBpID0gTlVNX0lSUV9OT0RFUy0xOyBpID49IDA7IG5vZGUrKywgaS0tKSB7CisJCWlmICghbm9kZS0+aGFuZGxlcikgeworCQkJbWVtc2V0KG5vZGUsIDAsIHNpemVvZigqbm9kZSkpOwogCQkJcmV0dXJuIG5vZGU7CisJCX0KKwl9CiAKIAlwcmludGsgKCJuZXdfaXJxX25vZGU6IG91dCBvZiBub2Rlc1xuIik7CiAJcmV0dXJuIE5VTEw7CiB9CiAKLS8qCi0gKiBXZSB3aWxsIGtlZXAgdGhlc2UgZnVuY3Rpb25zIHVudGlsIEkgaGF2ZSBjb252aW5jZWQgTGludXMgdG8gbW92ZQotICogdGhlIGRlY2xhcmF0aW9uIG9mIHRoZW0gZnJvbSBpbmNsdWRlL2xpbnV4L3NjaGVkLmggdG8KLSAqIGluY2x1ZGUvYXNtL2lycS5oLgotICovCitpbnQgc2V0dXBfaXJxKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfbm9kZSAqbm9kZSkKK3sKKwlzdHJ1Y3QgaXJxX2NvbnRyb2xsZXIgKmNvbnRyOworCXN0cnVjdCBpcnFfbm9kZSAqKnByZXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChpcnEgPj0gTlJfSVJRUyB8fCAhKGNvbnRyID0gaXJxX2NvbnRyb2xsZXJbaXJxXSkpIHsKKwkJcHJpbnRrKCIlczogSW5jb3JyZWN0IElSUSAlZCBmcm9tICVzXG4iLAorCQkgICAgICAgX19GVU5DVElPTl9fLCBpcnEsIG5vZGUtPmRldm5hbWUpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZjb250ci0+bG9jaywgZmxhZ3MpOworCisJcHJldiA9IGlycV9saXN0ICsgaXJxOworCWlmICgqcHJldikgeworCQkvKiBDYW4ndCBzaGFyZSBpbnRlcnJ1cHRzIHVubGVzcyBib3RoIGFncmVlIHRvICovCisJCWlmICghKCgqcHJldiktPmZsYWdzICYgbm9kZS0+ZmxhZ3MgJiBTQV9TSElSUSkpIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvbnRyLT5sb2NrLCBmbGFncyk7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisJCXdoaWxlICgqcHJldikKKwkJCXByZXYgPSAmKCpwcmV2KS0+bmV4dDsKKwl9CisKKwlpZiAoIWlycV9saXN0W2lycV0pIHsKKwkJaWYgKGNvbnRyLT5zdGFydHVwKQorCQkJY29udHItPnN0YXJ0dXAoaXJxKTsKKwkJZWxzZQorCQkJY29udHItPmVuYWJsZShpcnEpOworCX0KKwlub2RlLT5uZXh0ID0gTlVMTDsKKwkqcHJldiA9IG5vZGU7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb250ci0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKIGludCByZXF1ZXN0X2lycSh1bnNpZ25lZCBpbnQgaXJxLAogCQlpcnFyZXR1cm5fdCAoKmhhbmRsZXIpIChpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKiksCiAJCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldm5hbWUsIHZvaWQgKmRldl9pZCkKIHsKLQlyZXR1cm4gbWFjaF9yZXF1ZXN0X2lycShpcnEsIGhhbmRsZXIsIGZsYWdzLCBkZXZuYW1lLCBkZXZfaWQpOworCXN0cnVjdCBpcnFfbm9kZSAqbm9kZTsKKwlpbnQgcmVzOworCisJbm9kZSA9IG5ld19pcnFfbm9kZSgpOworCWlmICghbm9kZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlub2RlLT5oYW5kbGVyID0gaGFuZGxlcjsKKwlub2RlLT5mbGFncyAgID0gZmxhZ3M7CisJbm9kZS0+ZGV2X2lkICA9IGRldl9pZDsKKwlub2RlLT5kZXZuYW1lID0gZGV2bmFtZTsKKworCXJlcyA9IHNldHVwX2lycShpcnEsIG5vZGUpOworCWlmIChyZXMpCisJCW5vZGUtPmhhbmRsZXIgPSBOVUxMOworCisJcmV0dXJuIHJlczsKIH0KIAogRVhQT1JUX1NZTUJPTChyZXF1ZXN0X2lycSk7CiAKIHZvaWQgZnJlZV9pcnEodW5zaWduZWQgaW50IGlycSwgdm9pZCAqZGV2X2lkKQogewotCW1hY2hfZnJlZV9pcnEoaXJxLCBkZXZfaWQpOwotfQorCXN0cnVjdCBpcnFfY29udHJvbGxlciAqY29udHI7CisJc3RydWN0IGlycV9ub2RlICoqcCwgKm5vZGU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotRVhQT1JUX1NZTUJPTChmcmVlX2lycSk7Ci0KLWludCBjcHVfcmVxdWVzdF9pcnEodW5zaWduZWQgaW50IGlycSwKLSAgICAgICAgICAgICAgICAgICAgaXJxcmV0dXJuX3QgKCpoYW5kbGVyKShpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKiksCi0gICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldm5hbWUsIHZvaWQgKmRldl9pZCkKLXsKLQlpZiAoaXJxIDwgSVJRMSB8fCBpcnEgPiBJUlE3KSB7Ci0JCXByaW50aygiJXM6IEluY29ycmVjdCBJUlEgJWQgZnJvbSAlc1xuIiwKLQkJICAgICAgIF9fRlVOQ1RJT05fXywgaXJxLCBkZXZuYW1lKTsKLQkJcmV0dXJuIC1FTlhJTzsKLQl9Ci0KLSNpZiAwCi0JaWYgKCEoaXJxX2xpc3RbaXJxXS5mbGFncyAmIElSUV9GTEdfU1REKSkgewotCQlpZiAoaXJxX2xpc3RbaXJxXS5mbGFncyAmIElSUV9GTEdfTE9DSykgewotCQkJcHJpbnRrKCIlczogSVJRICVkIGZyb20gJXMgaXMgbm90IHJlcGxhY2VhYmxlXG4iLAotCQkJICAgICAgIF9fRlVOQ1RJT05fXywgaXJxLCBpcnFfbGlzdFtpcnFdLmRldm5hbWUpOwotCQkJcmV0dXJuIC1FQlVTWTsKLQkJfQotCQlpZiAoIShmbGFncyAmIElSUV9GTEdfUkVQTEFDRSkpIHsKLQkJCXByaW50aygiJXM6ICVzIGNhbid0IHJlcGxhY2UgSVJRICVkIGZyb20gJXNcbiIsCi0JCQkgICAgICAgX19GVU5DVElPTl9fLCBkZXZuYW1lLCBpcnEsIGlycV9saXN0W2lycV0uZGV2bmFtZSk7Ci0JCQlyZXR1cm4gLUVCVVNZOwotCQl9Ci0JfQotI2VuZGlmCi0KLQlpcnFfbGlzdFtpcnFdLmhhbmRsZXIgPSBoYW5kbGVyOwotCWlycV9saXN0W2lycV0uZmxhZ3MgICA9IGZsYWdzOwotCWlycV9saXN0W2lycV0uZGV2X2lkICA9IGRldl9pZDsKLQlpcnFfbGlzdFtpcnFdLmRldm5hbWUgPSBkZXZuYW1lOwotCXJldHVybiAwOwotfQotCi12b2lkIGNwdV9mcmVlX2lycSh1bnNpZ25lZCBpbnQgaXJxLCB2b2lkICpkZXZfaWQpCi17Ci0JaWYgKGlycSA8IElSUTEgfHwgaXJxID4gSVJRNykgeworCWlmIChpcnEgPj0gTlJfSVJRUyB8fCAhKGNvbnRyID0gaXJxX2NvbnRyb2xsZXJbaXJxXSkpIHsKIAkJcHJpbnRrKCIlczogSW5jb3JyZWN0IElSUSAlZFxuIiwgX19GVU5DVElPTl9fLCBpcnEpOwogCQlyZXR1cm47CiAJfQogCi0JaWYgKGlycV9saXN0W2lycV0uZGV2X2lkICE9IGRldl9pZCkKLQkJcHJpbnRrKCIlczogUmVtb3ZpbmcgcHJvYmFibHkgd3JvbmcgSVJRICVkIGZyb20gJXNcbiIsCi0JCSAgICAgICBfX0ZVTkNUSU9OX18sIGlycSwgaXJxX2xpc3RbaXJxXS5kZXZuYW1lKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY29udHItPmxvY2ssIGZsYWdzKTsKIAotCWlycV9saXN0W2lycV0uaGFuZGxlciA9ICgqbWFjaF9kZWZhdWx0X2hhbmRsZXIpW2lycV07Ci0JaXJxX2xpc3RbaXJxXS5mbGFncyAgID0gMDsKLQlpcnFfbGlzdFtpcnFdLmRldl9pZCAgPSBOVUxMOwotCWlycV9saXN0W2lycV0uZGV2bmFtZSA9IGRlZmF1bHRfbmFtZXNbaXJxXTsKKwlwID0gaXJxX2xpc3QgKyBpcnE7CisJd2hpbGUgKChub2RlID0gKnApKSB7CisJCWlmIChub2RlLT5kZXZfaWQgPT0gZGV2X2lkKQorCQkJYnJlYWs7CisJCXAgPSAmbm9kZS0+bmV4dDsKKwl9CisKKwlpZiAobm9kZSkgeworCQkqcCA9IG5vZGUtPm5leHQ7CisJCW5vZGUtPmhhbmRsZXIgPSBOVUxMOworCX0gZWxzZQorCQlwcmludGsoIiVzOiBSZW1vdmluZyBwcm9iYWJseSB3cm9uZyBJUlEgJWRcbiIsCisJCSAgICAgICBfX0ZVTkNUSU9OX18sIGlycSk7CisKKwlpZiAoIWlycV9saXN0W2lycV0pIHsKKwkJaWYgKGNvbnRyLT5zaHV0ZG93bikKKwkJCWNvbnRyLT5zaHV0ZG93bihpcnEpOworCQllbHNlCisJCQljb250ci0+ZGlzYWJsZShpcnEpOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvbnRyLT5sb2NrLCBmbGFncyk7CiB9CiAKK0VYUE9SVF9TWU1CT0woZnJlZV9pcnEpOworCit2b2lkIGVuYWJsZV9pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwlzdHJ1Y3QgaXJxX2NvbnRyb2xsZXIgKmNvbnRyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoaXJxID49IE5SX0lSUVMgfHwgIShjb250ciA9IGlycV9jb250cm9sbGVyW2lycV0pKSB7CisJCXByaW50aygiJXM6IEluY29ycmVjdCBJUlEgJWRcbiIsCisJCSAgICAgICBfX0ZVTkNUSU9OX18sIGlycSk7CisJCXJldHVybjsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY29udHItPmxvY2ssIGZsYWdzKTsKKwlpZiAoaXJxX2RlcHRoW2lycV0pIHsKKwkJaWYgKCEtLWlycV9kZXB0aFtpcnFdKSB7CisJCQlpZiAoY29udHItPmVuYWJsZSkKKwkJCQljb250ci0+ZW5hYmxlKGlycSk7CisJCX0KKwl9IGVsc2UKKwkJV0FSTl9PTigxKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb250ci0+bG9jaywgZmxhZ3MpOworfQorCitFWFBPUlRfU1lNQk9MKGVuYWJsZV9pcnEpOworCit2b2lkIGRpc2FibGVfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJc3RydWN0IGlycV9jb250cm9sbGVyICpjb250cjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGlycSA+PSBOUl9JUlFTIHx8ICEoY29udHIgPSBpcnFfY29udHJvbGxlcltpcnFdKSkgeworCQlwcmludGsoIiVzOiBJbmNvcnJlY3QgSVJRICVkXG4iLAorCQkgICAgICAgX19GVU5DVElPTl9fLCBpcnEpOworCQlyZXR1cm47CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNvbnRyLT5sb2NrLCBmbGFncyk7CisJaWYgKCFpcnFfZGVwdGhbaXJxXSsrKSB7CisJCWlmIChjb250ci0+ZGlzYWJsZSkKKwkJCWNvbnRyLT5kaXNhYmxlKGlycSk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvbnRyLT5sb2NrLCBmbGFncyk7Cit9CisKK0VYUE9SVF9TWU1CT0woZGlzYWJsZV9pcnEpOworCitpbnQgbTY4a19pcnFfc3RhcnR1cCh1bnNpZ25lZCBpbnQgaXJxKQoreworCWlmIChpcnEgPD0gSVJRX0FVVE9fNykKKwkJdmVjdG9yc1tWRUNfU1BVUiArIGlycV0gPSBhdXRvX2ludGhhbmRsZXI7CisJZWxzZQorCQl2ZWN0b3JzW202OGtfZmlyc3RfdXNlcl92ZWMgKyBpcnEgLSBJUlFfVVNFUl0gPSB1c2VyX2ludGhhbmRsZXI7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgbTY4a19pcnFfc2h1dGRvd24odW5zaWduZWQgaW50IGlycSkKK3sKKwlpZiAoaXJxIDw9IElSUV9BVVRPXzcpCisJCXZlY3RvcnNbVkVDX1NQVVIgKyBpcnFdID0gYmFkX2ludGhhbmRsZXI7CisJZWxzZQorCQl2ZWN0b3JzW202OGtfZmlyc3RfdXNlcl92ZWMgKyBpcnEgLSBJUlFfVVNFUl0gPSBiYWRfaW50aGFuZGxlcjsKK30KKworCiAvKgogICogRG8gd2UgbmVlZCB0aGVzZSBwcm9iZSBmdW5jdGlvbnMgb24gdGhlIG02OGs/CiAgKgpAQCAtMjI1LDU4ICszNjksNTAgQEAKIAogRVhQT1JUX1NZTUJPTChwcm9iZV9pcnFfb2ZmKTsKIAotc3RhdGljIHZvaWQgZHVtbXlfZW5hYmxlX2lycSh1bnNpZ25lZCBpbnQgaXJxKQordW5zaWduZWQgaW50IGlycV9jYW5vbmljYWxpemUodW5zaWduZWQgaW50IGlycSkKIHsKLQlwcmludGsoImNhbGxpbmcgdW5pbml0aWFsaXplZCBlbmFibGVfaXJxKClcbiIpOworI2lmZGVmIENPTkZJR19RNDAKKwlpZiAoTUFDSF9JU19RNDAgJiYgaXJxID09IDExKQorCQlpcnEgPSAxMDsKKyNlbmRpZgorCXJldHVybiBpcnE7CiB9CiAKLXN0YXRpYyB2b2lkIGR1bW15X2Rpc2FibGVfaXJxKHVuc2lnbmVkIGludCBpcnEpCitFWFBPUlRfU1lNQk9MKGlycV9jYW5vbmljYWxpemUpOworCithc21saW5rYWdlIHZvaWQgbTY4a19oYW5kbGVfaW50KHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCXByaW50aygiY2FsbGluZyB1bmluaXRpYWxpemVkIGRpc2FibGVfaXJxKClcbiIpOworCXN0cnVjdCBpcnFfbm9kZSAqbm9kZTsKKworCWtzdGF0X2NwdSgwKS5pcnFzW2lycV0rKzsKKwlub2RlID0gaXJxX2xpc3RbaXJxXTsKKwlkbyB7CisJCW5vZGUtPmhhbmRsZXIoaXJxLCBub2RlLT5kZXZfaWQsIHJlZ3MpOworCQlub2RlID0gbm9kZS0+bmV4dDsKKwl9IHdoaWxlIChub2RlKTsKIH0KIAotc3RhdGljIGludCBkdW1teV9yZXF1ZXN0X2lycSh1bnNpZ25lZCBpbnQgaXJxLAotCQlpcnFyZXR1cm5fdCAoKmhhbmRsZXIpIChpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKiksCi0JCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldm5hbWUsIHZvaWQgKmRldl9pZCkKK2FzbWxpbmthZ2Ugdm9pZCBoYW5kbGVfYmFkaW50KHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCXByaW50aygiY2FsbGluZyB1bmluaXRpYWxpemVkIHJlcXVlc3RfaXJxKClcbiIpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBkdW1teV9mcmVlX2lycSh1bnNpZ25lZCBpbnQgaXJxLCB2b2lkICpkZXZfaWQpCi17Ci0JcHJpbnRrKCJjYWxsaW5nIHVuaW5pdGlhbGl6ZWQgZGlzYWJsZV9pcnEoKVxuIik7Ci19Ci0KLWFzbWxpbmthZ2Ugdm9pZCBwcm9jZXNzX2ludCh1bnNpZ25lZCBsb25nIHZlYywgc3RydWN0IHB0X3JlZ3MgKmZwKQotewotCWlmICh2ZWMgPj0gVkVDX0lOVDEgJiYgdmVjIDw9IFZFQ19JTlQ3ICYmICFNQUNIX0lTX0JWTUU2MDAwKSB7Ci0JCXZlYyAtPSBWRUNfU1BVUjsKLQkJa3N0YXRfY3B1KDApLmlycXNbdmVjXSsrOwotCQlpcnFfbGlzdFt2ZWNdLmhhbmRsZXIodmVjLCBpcnFfbGlzdFt2ZWNdLmRldl9pZCwgZnApOwotCX0gZWxzZSB7Ci0JCWlmIChtYWNoX3Byb2Nlc3NfaW50KQotCQkJbWFjaF9wcm9jZXNzX2ludCh2ZWMsIGZwKTsKLQkJZWxzZQotCQkJcGFuaWMoIkNhbid0IHByb2Nlc3MgaW50ZXJydXB0IHZlY3RvciAlbGRcbiIsIHZlYyk7Ci0JCXJldHVybjsKLQl9CisJa3N0YXRfY3B1KDApLmlycXNbMF0rKzsKKwlwcmludGsoInVuZXhwZWN0ZWQgaW50ZXJydXB0IGZyb20gJXVcbiIsIHJlZ3MtPnZlY3Rvcik7CiB9CiAKIGludCBzaG93X2ludGVycnVwdHMoc3RydWN0IHNlcV9maWxlICpwLCB2b2lkICp2KQogeworCXN0cnVjdCBpcnFfY29udHJvbGxlciAqY29udHI7CisJc3RydWN0IGlycV9ub2RlICpub2RlOwogCWludCBpID0gKihsb2ZmX3QgKikgdjsKIAogCS8qIGF1dG92ZWN0b3IgaW50ZXJydXB0cyAqLwotCWlmIChpIDwgU1lTX0lSUVMpIHsKLQkJaWYgKG1hY2hfZGVmYXVsdF9oYW5kbGVyKSB7Ci0JCQlzZXFfcHJpbnRmKHAsICJhdXRvICUyZDogJTEwdSAiLCBpLAotCQkJICAgICAgICAgICAgICAgaSA/IGtzdGF0X2NwdSgwKS5pcnFzW2ldIDogbnVtX3NwdXJpb3VzKTsKLQkJCXNlcV9wdXRzKHAsICIgICIpOwotCQkJc2VxX3ByaW50ZihwLCAiJXNcbiIsIGlycV9saXN0W2ldLmRldm5hbWUpOwotCQl9Ci0JfSBlbHNlIGlmIChpID09IFNZU19JUlFTKQotCQltYWNoX2dldF9pcnFfbGlzdChwLCB2KTsKKwlpZiAoaXJxX2xpc3RbaV0pIHsKKwkJY29udHIgPSBpcnFfY29udHJvbGxlcltpXTsKKwkJbm9kZSA9IGlycV9saXN0W2ldOworCQlzZXFfcHJpbnRmKHAsICIlLThzICUzdTogJTEwdSAlcyIsIGNvbnRyLT5uYW1lLCBpLCBrc3RhdF9jcHUoMCkuaXJxc1tpXSwgbm9kZS0+ZGV2bmFtZSk7CisJCXdoaWxlICgobm9kZSA9IG5vZGUtPm5leHQpKQorCQkJc2VxX3ByaW50ZihwLCAiLCAlcyIsIG5vZGUtPmRldm5hbWUpOworCQlzZXFfcHV0cyhwLCAiXG4iKTsKKwl9CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9rZXJuZWwvbTY4a19rc3ltcy5jIGIvYXJjaC9tNjhrL2tlcm5lbC9tNjhrX2tzeW1zLmMKaW5kZXggNWI3OTUyZS4uMWY1ZTFiNSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2tlcm5lbC9tNjhrX2tzeW1zLmMKKysrIGIvYXJjaC9tNjhrL2tlcm5lbC9tNjhrX2tzeW1zLmMKQEAgLTU3LDggKzU3LDYgQEAKIEVYUE9SVF9TWU1CT0woc3Rybmxlbik7CiBFWFBPUlRfU1lNQk9MKHN0cnJjaHIpOwogRVhQT1JUX1NZTUJPTChzdHJzdHIpOwotRVhQT1JUX1NZTUJPTChlbmFibGVfaXJxKTsKLUVYUE9SVF9TWU1CT0woZGlzYWJsZV9pcnEpOwogRVhQT1JUX1NZTUJPTChrZXJuZWxfdGhyZWFkKTsKICNpZmRlZiBDT05GSUdfVk1FCiBFWFBPUlRfU1lNQk9MKHZtZV9icmR0eXBlKTsKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvbTY4ay9rZXJuZWwvc2V0dXAuYwppbmRleCA3NTBkNWIzLi4yMTRhOTVmIDEwMDY0NAotLS0gYS9hcmNoL202OGsva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9tNjhrL2tlcm5lbC9zZXR1cC5jCkBAIC02OCwxMSArNjgsOCBAQAogdm9pZCAoKm1hY2hfc2NoZWRfaW5pdCkgKGlycXJldHVybl90ICgqaGFuZGxlcikoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopKSBfX2luaXRkYXRhID0gTlVMTDsKIC8qIG1hY2hpbmUgZGVwZW5kZW50IGlycSBmdW5jdGlvbnMgKi8KIHZvaWQgKCptYWNoX2luaXRfSVJRKSAodm9pZCkgX19pbml0ZGF0YSA9IE5VTEw7Ci1pcnFyZXR1cm5fdCAoKigqbWFjaF9kZWZhdWx0X2hhbmRsZXIpW10pIChpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik7CiB2b2lkICgqbWFjaF9nZXRfbW9kZWwpIChjaGFyICptb2RlbCk7CiBpbnQgKCptYWNoX2dldF9oYXJkd2FyZV9saXN0KSAoY2hhciAqYnVmZmVyKTsKLWludCAoKm1hY2hfZ2V0X2lycV9saXN0KSAoc3RydWN0IHNlcV9maWxlICosIHZvaWQgKik7Ci1pcnFyZXR1cm5fdCAoKm1hY2hfcHJvY2Vzc19pbnQpIChpbnQsIHN0cnVjdCBwdF9yZWdzICopOwogLyogbWFjaGluZSBkZXBlbmRlbnQgdGltZXIgZnVuY3Rpb25zICovCiB1bnNpZ25lZCBsb25nICgqbWFjaF9nZXR0aW1lb2Zmc2V0KSAodm9pZCk7CiBpbnQgKCptYWNoX2h3Y2xrKSAoaW50LCBzdHJ1Y3QgcnRjX3RpbWUqKTsKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvbTY4ay9rZXJuZWwvdHJhcHMuYwppbmRleCA4MzdhODg3Li5lODZkZTdiIDEwMDY0NAotLS0gYS9hcmNoL202OGsva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9tNjhrL2tlcm5lbC90cmFwcy5jCkBAIC00NSw3ICs0NSw2IEBACiBhc21saW5rYWdlIHZvaWQgc3lzdGVtX2NhbGwodm9pZCk7CiBhc21saW5rYWdlIHZvaWQgYnVzZXJyKHZvaWQpOwogYXNtbGlua2FnZSB2b2lkIHRyYXAodm9pZCk7Ci1hc21saW5rYWdlIHZvaWQgaW50aGFuZGxlcih2b2lkKTsKIGFzbWxpbmthZ2Ugdm9pZCBubWloYW5kbGVyKHZvaWQpOwogI2lmZGVmIENPTkZJR19NNjhLRlBVX0VNVQogYXNtbGlua2FnZSB2b2lkIGZwdV9lbXUodm9pZCk7CkBAIC01Myw1MSArNTIsNyBAQAogCiBlX3ZlY3RvciB2ZWN0b3JzWzI1Nl0gPSB7CiAJW1ZFQ19CVVNFUlJdCT0gYnVzZXJyLAotCVtWRUNfQUREUkVSUl0JPSB0cmFwLAotCVtWRUNfSUxMRUdBTF0JPSB0cmFwLAotCVtWRUNfWkVST0RJVl0JPSB0cmFwLAotCVtWRUNfQ0hLXQk9IHRyYXAsCi0JW1ZFQ19UUkFQXQk9IHRyYXAsCi0JW1ZFQ19QUklWXQk9IHRyYXAsCi0JW1ZFQ19UUkFDRV0JPSB0cmFwLAotCVtWRUNfTElORTEwXQk9IHRyYXAsCi0JW1ZFQ19MSU5FMTFdCT0gdHJhcCwKLQlbVkVDX1JFU1YxMl0JPSB0cmFwLAotCVtWRUNfQ09QUk9DXQk9IHRyYXAsCi0JW1ZFQ19GT1JNQVRdCT0gdHJhcCwKLQlbVkVDX1VOSU5UXQk9IHRyYXAsCi0JW1ZFQ19SRVNWMTZdCT0gdHJhcCwKLQlbVkVDX1JFU1YxN10JPSB0cmFwLAotCVtWRUNfUkVTVjE4XQk9IHRyYXAsCi0JW1ZFQ19SRVNWMTldCT0gdHJhcCwKLQlbVkVDX1JFU1YyMF0JPSB0cmFwLAotCVtWRUNfUkVTVjIxXQk9IHRyYXAsCi0JW1ZFQ19SRVNWMjJdCT0gdHJhcCwKLQlbVkVDX1JFU1YyM10JPSB0cmFwLAotCVtWRUNfU1BVUl0JPSBpbnRoYW5kbGVyLAotCVtWRUNfSU5UMV0JPSBpbnRoYW5kbGVyLAotCVtWRUNfSU5UMl0JPSBpbnRoYW5kbGVyLAotCVtWRUNfSU5UM10JPSBpbnRoYW5kbGVyLAotCVtWRUNfSU5UNF0JPSBpbnRoYW5kbGVyLAotCVtWRUNfSU5UNV0JPSBpbnRoYW5kbGVyLAotCVtWRUNfSU5UNl0JPSBpbnRoYW5kbGVyLAotCVtWRUNfSU5UN10JPSBpbnRoYW5kbGVyLAogCVtWRUNfU1lTXQk9IHN5c3RlbV9jYWxsLAotCVtWRUNfVFJBUDFdCT0gdHJhcCwKLQlbVkVDX1RSQVAyXQk9IHRyYXAsCi0JW1ZFQ19UUkFQM10JPSB0cmFwLAotCVtWRUNfVFJBUDRdCT0gdHJhcCwKLQlbVkVDX1RSQVA1XQk9IHRyYXAsCi0JW1ZFQ19UUkFQNl0JPSB0cmFwLAotCVtWRUNfVFJBUDddCT0gdHJhcCwKLQlbVkVDX1RSQVA4XQk9IHRyYXAsCi0JW1ZFQ19UUkFQOV0JPSB0cmFwLAotCVtWRUNfVFJBUDEwXQk9IHRyYXAsCi0JW1ZFQ19UUkFQMTFdCT0gdHJhcCwKLQlbVkVDX1RSQVAxMl0JPSB0cmFwLAotCVtWRUNfVFJBUDEzXQk9IHRyYXAsCi0JW1ZFQ19UUkFQMTRdCT0gdHJhcCwKLQlbVkVDX1RSQVAxNV0JPSB0cmFwLAogfTsKIAogLyogbm1pIGhhbmRsZXIgZm9yIHRoZSBBbWlnYSAqLwpAQCAtMTMyLDEyICs4NywxNSBAQAogewogCWludCBpOwogCi0JZm9yIChpID0gNDg7IGkgPCA2NDsgaSsrKQorCWZvciAoaSA9IFZFQ19TUFVSOyBpIDw9IFZFQ19JTlQ3OyBpKyspCisJCXZlY3RvcnNbaV0gPSBiYWRfaW50aGFuZGxlcjsKKworCWZvciAoaSA9IDA7IGkgPCBWRUNfVVNFUjsgaSsrKQogCQlpZiAoIXZlY3RvcnNbaV0pCiAJCQl2ZWN0b3JzW2ldID0gdHJhcDsKIAotCWZvciAoaSA9IDY0OyBpIDwgMjU2OyBpKyspCi0JCXZlY3RvcnNbaV0gPSBpbnRoYW5kbGVyOworCWZvciAoaSA9IFZFQ19VU0VSOyBpIDwgMjU2OyBpKyspCisJCXZlY3RvcnNbaV0gPSBiYWRfaW50aGFuZGxlcjsKIAogI2lmZGVmIENPTkZJR19NNjhLRlBVX0VNVQogCWlmIChGUFVfSVNfRU1VKQpAQCAtOTI3LDY2ICs4ODUsODggQEAKIHZvaWQgc2hvd19yZWdpc3RlcnMoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJc3RydWN0IGZyYW1lICpmcCA9IChzdHJ1Y3QgZnJhbWUgKilyZWdzOworCW1tX3NlZ21lbnRfdCBvbGRfZnMgPSBnZXRfZnMoKTsKKwl1MTYgYywgKmNwOwogCXVuc2lnbmVkIGxvbmcgYWRkcjsKIAlpbnQgaTsKIAorCXByaW50X21vZHVsZXMoKTsKKwlwcmludGsoIlBDOiBbPCUwOGx4Pl0iLHJlZ3MtPnBjKTsKKwlwcmludF9zeW1ib2woIiAlcyIsIHJlZ3MtPnBjKTsKKwlwcmludGsoIlxuU1I6ICUwNHggIFNQOiAlcCAgYTI6ICUwOGx4XG4iLAorCSAgICAgICByZWdzLT5zciwgcmVncywgcmVncy0+YTIpOworCXByaW50aygiZDA6ICUwOGx4ICAgIGQxOiAlMDhseCAgICBkMjogJTA4bHggICAgZDM6ICUwOGx4XG4iLAorCSAgICAgICByZWdzLT5kMCwgcmVncy0+ZDEsIHJlZ3MtPmQyLCByZWdzLT5kMyk7CisJcHJpbnRrKCJkNDogJTA4bHggICAgZDU6ICUwOGx4ICAgIGEwOiAlMDhseCAgICBhMTogJTA4bHhcbiIsCisJICAgICAgIHJlZ3MtPmQ0LCByZWdzLT5kNSwgcmVncy0+YTAsIHJlZ3MtPmExKTsKKworCXByaW50aygiUHJvY2VzcyAlcyAocGlkOiAlZCwgdGFzaz0lcClcbiIsCisJCWN1cnJlbnQtPmNvbW0sIGN1cnJlbnQtPnBpZCwgY3VycmVudCk7CiAJYWRkciA9ICh1bnNpZ25lZCBsb25nKSZmcC0+dW47Ci0JcHJpbnRrKCJGcmFtZSBmb3JtYXQ9JVggIiwgZnAtPnB0cmVncy5mb3JtYXQpOwotCXN3aXRjaCAoZnAtPnB0cmVncy5mb3JtYXQpIHsKKwlwcmludGsoIkZyYW1lIGZvcm1hdD0lWCAiLCByZWdzLT5mb3JtYXQpOworCXN3aXRjaCAocmVncy0+Zm9ybWF0KSB7CiAJY2FzZSAweDI6Ci0JICAgIHByaW50aygiaW5zdHIgYWRkcj0lMDhseFxuIiwgZnAtPnVuLmZtdDIuaWFkZHIpOwotCSAgICBhZGRyICs9IHNpemVvZihmcC0+dW4uZm10Mik7Ci0JICAgIGJyZWFrOworCQlwcmludGsoImluc3RyIGFkZHI9JTA4bHhcbiIsIGZwLT51bi5mbXQyLmlhZGRyKTsKKwkJYWRkciArPSBzaXplb2YoZnAtPnVuLmZtdDIpOworCQlicmVhazsKIAljYXNlIDB4MzoKLQkgICAgcHJpbnRrKCJlZmYgYWRkcj0lMDhseFxuIiwgZnAtPnVuLmZtdDMuZWZmYWRkcik7Ci0JICAgIGFkZHIgKz0gc2l6ZW9mKGZwLT51bi5mbXQzKTsKLQkgICAgYnJlYWs7CisJCXByaW50aygiZWZmIGFkZHI9JTA4bHhcbiIsIGZwLT51bi5mbXQzLmVmZmFkZHIpOworCQlhZGRyICs9IHNpemVvZihmcC0+dW4uZm10Myk7CisJCWJyZWFrOwogCWNhc2UgMHg0OgotCSAgICBwcmludGsoKENQVV9JU18wNjAgPyAiZmF1bHQgYWRkcj0lMDhseCBmc2x3PSUwOGx4XG4iCi0JCSAgICA6ICJlZmYgYWRkcj0lMDhseCBwYz0lMDhseFxuIiksCi0JCSAgIGZwLT51bi5mbXQ0LmVmZmFkZHIsIGZwLT51bi5mbXQ0LnBjKTsKLQkgICAgYWRkciArPSBzaXplb2YoZnAtPnVuLmZtdDQpOwotCSAgICBicmVhazsKKwkJcHJpbnRrKChDUFVfSVNfMDYwID8gImZhdWx0IGFkZHI9JTA4bHggZnNsdz0lMDhseFxuIgorCQkJOiAiZWZmIGFkZHI9JTA4bHggcGM9JTA4bHhcbiIpLAorCQkJZnAtPnVuLmZtdDQuZWZmYWRkciwgZnAtPnVuLmZtdDQucGMpOworCQlhZGRyICs9IHNpemVvZihmcC0+dW4uZm10NCk7CisJCWJyZWFrOwogCWNhc2UgMHg3OgotCSAgICBwcmludGsoImVmZiBhZGRyPSUwOGx4IHNzdz0lMDR4IGZhZGRyPSUwOGx4XG4iLAotCQkgICBmcC0+dW4uZm10Ny5lZmZhZGRyLCBmcC0+dW4uZm10Ny5zc3csIGZwLT51bi5mbXQ3LmZhZGRyKTsKLQkgICAgcHJpbnRrKCJ3YiAxIHN0YXQvYWRkci9kYXRhOiAlMDR4ICUwOGx4ICUwOGx4XG4iLAotCQkgICBmcC0+dW4uZm10Ny53YjFzLCBmcC0+dW4uZm10Ny53YjFhLCBmcC0+dW4uZm10Ny53YjFkcGQwKTsKLQkgICAgcHJpbnRrKCJ3YiAyIHN0YXQvYWRkci9kYXRhOiAlMDR4ICUwOGx4ICUwOGx4XG4iLAotCQkgICBmcC0+dW4uZm10Ny53YjJzLCBmcC0+dW4uZm10Ny53YjJhLCBmcC0+dW4uZm10Ny53YjJkKTsKLQkgICAgcHJpbnRrKCJ3YiAzIHN0YXQvYWRkci9kYXRhOiAlMDR4ICUwOGx4ICUwOGx4XG4iLAotCQkgICBmcC0+dW4uZm10Ny53YjNzLCBmcC0+dW4uZm10Ny53YjNhLCBmcC0+dW4uZm10Ny53YjNkKTsKLQkgICAgcHJpbnRrKCJwdXNoIGRhdGE6ICUwOGx4ICUwOGx4ICUwOGx4ICUwOGx4XG4iLAotCQkgICBmcC0+dW4uZm10Ny53YjFkcGQwLCBmcC0+dW4uZm10Ny5wZDEsIGZwLT51bi5mbXQ3LnBkMiwKLQkJICAgZnAtPnVuLmZtdDcucGQzKTsKLQkgICAgYWRkciArPSBzaXplb2YoZnAtPnVuLmZtdDcpOwotCSAgICBicmVhazsKKwkJcHJpbnRrKCJlZmYgYWRkcj0lMDhseCBzc3c9JTA0eCBmYWRkcj0lMDhseFxuIiwKKwkJCWZwLT51bi5mbXQ3LmVmZmFkZHIsIGZwLT51bi5mbXQ3LnNzdywgZnAtPnVuLmZtdDcuZmFkZHIpOworCQlwcmludGsoIndiIDEgc3RhdC9hZGRyL2RhdGE6ICUwNHggJTA4bHggJTA4bHhcbiIsCisJCQlmcC0+dW4uZm10Ny53YjFzLCBmcC0+dW4uZm10Ny53YjFhLCBmcC0+dW4uZm10Ny53YjFkcGQwKTsKKwkJcHJpbnRrKCJ3YiAyIHN0YXQvYWRkci9kYXRhOiAlMDR4ICUwOGx4ICUwOGx4XG4iLAorCQkJZnAtPnVuLmZtdDcud2IycywgZnAtPnVuLmZtdDcud2IyYSwgZnAtPnVuLmZtdDcud2IyZCk7CisJCXByaW50aygid2IgMyBzdGF0L2FkZHIvZGF0YTogJTA0eCAlMDhseCAlMDhseFxuIiwKKwkJCWZwLT51bi5mbXQ3LndiM3MsIGZwLT51bi5mbXQ3LndiM2EsIGZwLT51bi5mbXQ3LndiM2QpOworCQlwcmludGsoInB1c2ggZGF0YTogJTA4bHggJTA4bHggJTA4bHggJTA4bHhcbiIsCisJCQlmcC0+dW4uZm10Ny53YjFkcGQwLCBmcC0+dW4uZm10Ny5wZDEsIGZwLT51bi5mbXQ3LnBkMiwKKwkJCWZwLT51bi5mbXQ3LnBkMyk7CisJCWFkZHIgKz0gc2l6ZW9mKGZwLT51bi5mbXQ3KTsKKwkJYnJlYWs7CiAJY2FzZSAweDk6Ci0JICAgIHByaW50aygiaW5zdHIgYWRkcj0lMDhseFxuIiwgZnAtPnVuLmZtdDkuaWFkZHIpOwotCSAgICBhZGRyICs9IHNpemVvZihmcC0+dW4uZm10OSk7Ci0JICAgIGJyZWFrOworCQlwcmludGsoImluc3RyIGFkZHI9JTA4bHhcbiIsIGZwLT51bi5mbXQ5LmlhZGRyKTsKKwkJYWRkciArPSBzaXplb2YoZnAtPnVuLmZtdDkpOworCQlicmVhazsKIAljYXNlIDB4YToKLQkgICAgcHJpbnRrKCJzc3c9JTA0eCBpc2M9JTA0eCBpc2I9JTA0eCBkYWRkcj0lMDhseCBkb2J1Zj0lMDhseFxuIiwKLQkJICAgZnAtPnVuLmZtdGEuc3N3LCBmcC0+dW4uZm10YS5pc2MsIGZwLT51bi5mbXRhLmlzYiwKLQkJICAgZnAtPnVuLmZtdGEuZGFkZHIsIGZwLT51bi5mbXRhLmRvYnVmKTsKLQkgICAgYWRkciArPSBzaXplb2YoZnAtPnVuLmZtdGEpOwotCSAgICBicmVhazsKKwkJcHJpbnRrKCJzc3c9JTA0eCBpc2M9JTA0eCBpc2I9JTA0eCBkYWRkcj0lMDhseCBkb2J1Zj0lMDhseFxuIiwKKwkJCWZwLT51bi5mbXRhLnNzdywgZnAtPnVuLmZtdGEuaXNjLCBmcC0+dW4uZm10YS5pc2IsCisJCQlmcC0+dW4uZm10YS5kYWRkciwgZnAtPnVuLmZtdGEuZG9idWYpOworCQlhZGRyICs9IHNpemVvZihmcC0+dW4uZm10YSk7CisJCWJyZWFrOwogCWNhc2UgMHhiOgotCSAgICBwcmludGsoInNzdz0lMDR4IGlzYz0lMDR4IGlzYj0lMDR4IGRhZGRyPSUwOGx4IGRvYnVmPSUwOGx4XG4iLAotCQkgICBmcC0+dW4uZm10Yi5zc3csIGZwLT51bi5mbXRiLmlzYywgZnAtPnVuLmZtdGIuaXNiLAotCQkgICBmcC0+dW4uZm10Yi5kYWRkciwgZnAtPnVuLmZtdGIuZG9idWYpOwotCSAgICBwcmludGsoImJhZGRyPSUwOGx4IGRpYnVmPSUwOGx4IHZlcj0leFxuIiwKLQkJICAgZnAtPnVuLmZtdGIuYmFkZHIsIGZwLT51bi5mbXRiLmRpYnVmLCBmcC0+dW4uZm10Yi52ZXIpOwotCSAgICBhZGRyICs9IHNpemVvZihmcC0+dW4uZm10Yik7Ci0JICAgIGJyZWFrOworCQlwcmludGsoInNzdz0lMDR4IGlzYz0lMDR4IGlzYj0lMDR4IGRhZGRyPSUwOGx4IGRvYnVmPSUwOGx4XG4iLAorCQkJZnAtPnVuLmZtdGIuc3N3LCBmcC0+dW4uZm10Yi5pc2MsIGZwLT51bi5mbXRiLmlzYiwKKwkJCWZwLT51bi5mbXRiLmRhZGRyLCBmcC0+dW4uZm10Yi5kb2J1Zik7CisJCXByaW50aygiYmFkZHI9JTA4bHggZGlidWY9JTA4bHggdmVyPSV4XG4iLAorCQkJZnAtPnVuLmZtdGIuYmFkZHIsIGZwLT51bi5mbXRiLmRpYnVmLCBmcC0+dW4uZm10Yi52ZXIpOworCQlhZGRyICs9IHNpemVvZihmcC0+dW4uZm10Yik7CisJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JICAgIHByaW50aygiXG4iKTsKKwkJcHJpbnRrKCJcbiIpOwogCX0KIAlzaG93X3N0YWNrKE5VTEwsICh1bnNpZ25lZCBsb25nICopYWRkcik7CiAKLQlwcmludGsoIkNvZGU6ICIpOwotCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKQotCQlwcmludGsoIiUwNHggIiwgMHhmZmZmICYgKChzaG9ydCAqKSBmcC0+cHRyZWdzLnBjKVtpXSk7CisJcHJpbnRrKCJDb2RlOiIpOworCXNldF9mcyhLRVJORUxfRFMpOworCWNwID0gKHUxNiAqKXJlZ3MtPnBjOworCWZvciAoaSA9IC04OyBpIDwgMTY7IGkrKykgeworCQlpZiAoZ2V0X3VzZXIoYywgY3AgKyBpKSAmJiBpID49IDApIHsKKwkJCXByaW50aygiIEJhZCBQQyB2YWx1ZS4iKTsKKwkJCWJyZWFrOworCQl9CisJCXByaW50ayhpID8gIiAlMDR4IiA6ICIgPCUwNHg+IiwgYyk7CisJfQorCXNldF9mcyhvbGRfZnMpOwogCXByaW50ayAoIlxuIik7CiB9CiAKQEAgLTExOTAsMTkgKzExNzAsNyBAQAogCiAJY29uc29sZV92ZXJib3NlKCk7CiAJcHJpbnRrKCIlczogJTA4eFxuIixzdHIsbnIpOwotCXByaW50X21vZHVsZXMoKTsKLQlwcmludGsoIlBDOiBbPCUwOGx4Pl0iLGZwLT5wYyk7Ci0JcHJpbnRfc3ltYm9sKCIgJXNcbiIsIGZwLT5wYyk7Ci0JcHJpbnRrKCJcblNSOiAlMDR4ICBTUDogJXAgIGEyOiAlMDhseFxuIiwKLQkgICAgICAgZnAtPnNyLCBmcCwgZnAtPmEyKTsKLQlwcmludGsoImQwOiAlMDhseCAgICBkMTogJTA4bHggICAgZDI6ICUwOGx4ICAgIGQzOiAlMDhseFxuIiwKLQkgICAgICAgZnAtPmQwLCBmcC0+ZDEsIGZwLT5kMiwgZnAtPmQzKTsKLQlwcmludGsoImQ0OiAlMDhseCAgICBkNTogJTA4bHggICAgYTA6ICUwOGx4ICAgIGExOiAlMDhseFxuIiwKLQkgICAgICAgZnAtPmQ0LCBmcC0+ZDUsIGZwLT5hMCwgZnAtPmExKTsKLQotCXByaW50aygiUHJvY2VzcyAlcyAocGlkOiAlZCwgc3RhY2twYWdlPSUwOGx4KVxuIiwKLQkJY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkLCBQQUdFX1NJWkUrKHVuc2lnbmVkIGxvbmcpY3VycmVudCk7Ci0Jc2hvd19zdGFjayhOVUxMLCAodW5zaWduZWQgbG9uZyAqKWZwKTsKKwlzaG93X3JlZ2lzdGVycyhmcCk7CiAJZG9fZXhpdChTSUdTRUdWKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL21hYy9iYWJvb24uYyBiL2FyY2gvbTY4ay9tYWMvYmFib29uLmMKaW5kZXggYjE5YjdkZC4uNmVhYTg4MSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL21hYy9iYWJvb24uYworKysgYi9hcmNoL202OGsvbWFjL2JhYm9vbi5jCkBAIC04MSw3ICs4MSw3IEBACiAJZm9yIChpID0gMCwgaXJxX2JpdCA9IDEgOyBpIDwgMyA7IGkrKywgaXJxX2JpdCA8PD0gMSkgewogCSAgICAgICAgaWYgKGV2ZW50cyAmIGlycV9iaXQvKiAmIGJhYm9vbl9hY3RpdmUqLykgewogCQkJYmFib29uX2FjdGl2ZSAmPSB+aXJxX2JpdDsKLQkJCW1hY19kb19pcnFfbGlzdChJUlFfQkFCT09OXzAgKyBpLCByZWdzKTsKKwkJCW02OGtfaGFuZGxlX2ludChJUlFfQkFCT09OXzAgKyBpLCByZWdzKTsKIAkJCWJhYm9vbl9hY3RpdmUgfD0gaXJxX2JpdDsKIAkJCWJhYm9vbi0+bWJfaWZyICY9IH5pcnFfYml0OwogCQl9CmRpZmYgLS1naXQgYS9hcmNoL202OGsvbWFjL2NvbmZpZy5jIGIvYXJjaC9tNjhrL21hYy9jb25maWcuYwppbmRleCAxOWRjZTc1Li41YTk5OTBlIDEwMDY0NAotLS0gYS9hcmNoL202OGsvbWFjL2NvbmZpZy5jCisrKyBiL2FyY2gvbTY4ay9tYWMvY29uZmlnLmMKQEAgLTk0LDIwICs5NCw2IEBACiAJdmlhX2luaXRfY2xvY2sodmVjdG9yKTsKIH0KIAotZXh0ZXJuIGlycXJldHVybl90IG1hY19kZWZhdWx0X2hhbmRsZXIoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopOwotCi1pcnFyZXR1cm5fdCAoKm1hY19oYW5kbGVyc1s4XSkoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopPQotewotCW1hY19kZWZhdWx0X2hhbmRsZXIsCi0JbWFjX2RlZmF1bHRfaGFuZGxlciwKLQltYWNfZGVmYXVsdF9oYW5kbGVyLAotCW1hY19kZWZhdWx0X2hhbmRsZXIsCi0JbWFjX2RlZmF1bHRfaGFuZGxlciwKLQltYWNfZGVmYXVsdF9oYW5kbGVyLAotCW1hY19kZWZhdWx0X2hhbmRsZXIsCi0JbWFjX2RlZmF1bHRfaGFuZGxlcgotfTsKLQogLyoKICAqIFBhcnNlIGEgTWFjaW50b3NoLXNwZWNpZmljIHJlY29yZCBpbiB0aGUgYm9vdGluZm8KICAqLwpAQCAtMTgzLDEzICsxNjksNyBAQAogCiAJbWFjaF9zY2hlZF9pbml0ICAgICAgPSBtYWNfc2NoZWRfaW5pdDsKIAltYWNoX2luaXRfSVJRICAgICAgICA9IG1hY19pbml0X0lSUTsKLQltYWNoX3JlcXVlc3RfaXJxICAgICA9IG1hY19yZXF1ZXN0X2lycTsKLQltYWNoX2ZyZWVfaXJxICAgICAgICA9IG1hY19mcmVlX2lycTsKLQllbmFibGVfaXJxICAgICAgICAgICA9IG1hY19lbmFibGVfaXJxOwotCWRpc2FibGVfaXJxICAgICAgICAgID0gbWFjX2Rpc2FibGVfaXJxOwogCW1hY2hfZ2V0X21vZGVsCSA9IG1hY19nZXRfbW9kZWw7Ci0JbWFjaF9kZWZhdWx0X2hhbmRsZXIgPSAmbWFjX2hhbmRsZXJzOwotCW1hY2hfZ2V0X2lycV9saXN0ICAgID0gc2hvd19tYWNfaW50ZXJydXB0czsKIAltYWNoX2dldHRpbWVvZmZzZXQgICA9IG1hY19nZXR0aW1lb2Zmc2V0OwogI3dhcm5pbmcgbW92ZSB0byBhZGIvdmlhIGluaXQKICNpZiAwCmRpZmYgLS1naXQgYS9hcmNoL202OGsvbWFjL2lvcC5jIGIvYXJjaC9tNjhrL21hYy9pb3AuYwppbmRleCA5MTc5YTM3Li40YzhlY2U3IDEwMDY0NAotLS0gYS9hcmNoL202OGsvbWFjL2lvcC5jCisrKyBiL2FyY2gvbTY4ay9tYWMvaW9wLmMKQEAgLTMxNyw3ICszMTcsNyBAQAogewogCWlmIChpb3BfaXNtX3ByZXNlbnQpIHsKIAkJaWYgKG9zc19wcmVzZW50KSB7Ci0JCQljcHVfcmVxdWVzdF9pcnEoT1NTX0lSUUxFVl9JT1BJU00sIGlvcF9pc21faXJxLAorCQkJcmVxdWVzdF9pcnEoT1NTX0lSUUxFVl9JT1BJU00sIGlvcF9pc21faXJxLAogCQkJCQlJUlFfRkxHX0xPQ0ssICJJU00gSU9QIiwKIAkJCQkJKHZvaWQgKikgSU9QX05VTV9JU00pOwogCQkJb3NzX2lycV9lbmFibGUoSVJRX01BQ19BREIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL21hYy9tYWNpbnRzLmMgYi9hcmNoL202OGsvbWFjL21hY2ludHMuYwppbmRleCA3YTE2MDBiLi42OTRiMTRiIDEwMDY0NAotLS0gYS9hcmNoL202OGsvbWFjL21hY2ludHMuYworKysgYi9hcmNoL202OGsvbWFjL21hY2ludHMuYwpAQCAtMTM3LDE0ICsxMzcsNiBAQAogI2RlZmluZSBERUJVR19TUFVSSU9VUwogI2RlZmluZSBTSFVUVVBfU09OSUMKIAotLyoKLSAqIFRoZSBtYWNfaXJxX2xpc3QgYXJyYXkgaXMgYW4gYXJyYXkgb2YgbGlua2VkIGxpc3RzIG9mIGlycV9ub2RlX3Qgbm9kZXMuCi0gKiBFYWNoIG5vZGUgY29udGFpbnMgb25lIGhhbmRsZXIgdG8gYmUgY2FsbGVkIHdoZW5ldmVyIHRoZSBpbnRlcnJ1cHQKLSAqIG9jY3Vycywgd2l0aCBmYXN0IGhhbmRsZXJzIGxpc3RlZCBiZWZvcmUgc2xvdyBoYW5kbGVycy4KLSAqLwotCi1pcnFfbm9kZV90ICptYWNfaXJxX2xpc3RbTlVNX01BQ19TT1VSQ0VTXTsKLQogLyogU0NDIGludGVycnVwdCBtYXNrICovCiAKIHN0YXRpYyBpbnQgc2NjX21hc2s7CkBAIC0yMDksOCArMjAxLDggQEAKICAqIFNDQyBpbnRlcnJ1cHQgcm91dGluZXMKICAqLwogCi1zdGF0aWMgdm9pZCBzY2NfaXJxX2VuYWJsZShpbnQpOwotc3RhdGljIHZvaWQgc2NjX2lycV9kaXNhYmxlKGludCk7CitzdGF0aWMgdm9pZCBzY2NfaXJxX2VuYWJsZSh1bnNpZ25lZCBpbnQpOworc3RhdGljIHZvaWQgc2NjX2lycV9kaXNhYmxlKHVuc2lnbmVkIGludCk7CiAKIC8qCiAgKiBjb25zb2xlX2xvZ2xldmVsIGRldGVybWluZXMgTk1JIGhhbmRsZXIgZnVuY3Rpb24KQEAgLTIyMSwyMSArMjEzLDI1IEBACiAKIC8qICNkZWZpbmUgREVCVUdfTUFDSU5UUyAqLwogCitzdGF0aWMgdm9pZCBtYWNfZW5hYmxlX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKK3N0YXRpYyB2b2lkIG1hY19kaXNhYmxlX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKKworc3RhdGljIHN0cnVjdCBpcnFfY29udHJvbGxlciBtYWNfaXJxX2NvbnRyb2xsZXIgPSB7CisJLm5hbWUJCT0gIm1hYyIsCisJLmxvY2sJCT0gU1BJTl9MT0NLX1VOTE9DS0VELAorCS5lbmFibGUJCT0gbWFjX2VuYWJsZV9pcnEsCisJLmRpc2FibGUJPSBtYWNfZGlzYWJsZV9pcnEsCit9OworCiB2b2lkIG1hY19pbml0X0lSUSh2b2lkKQogewotICAgICAgICBpbnQgaTsKLQogI2lmZGVmIERFQlVHX01BQ0lOVFMKIAlwcmludGsoIm1hY19pbml0X0lSUSgpOiBTZXR0aW5nIHRoaW5ncyB1cC4uLlxuIik7CiAjZW5kaWYKLQkvKiBJbml0aWFsaXplIHRoZSBJUlEgaGFuZGxlciBsaXN0cy4gSW5pdGlhbGx5IGVhY2ggbGlzdCBpcyBlbXB0eSwgKi8KLQotCWZvciAoaSA9IDA7IGkgPCBOVU1fTUFDX1NPVVJDRVM7IGkrKykgewotCQltYWNfaXJxX2xpc3RbaV0gPSBOVUxMOwotCX0KLQogCXNjY19tYXNrID0gMDsKIAorCW02OGtfc2V0dXBfaXJxX2NvbnRyb2xsZXIoJm1hY19pcnFfY29udHJvbGxlciwgSVJRX1VTRVIsCisJCQkJICBOVU1fTUFDX1NPVVJDRVMgLSBJUlFfVVNFUik7CiAJLyogTWFrZSBzdXJlIHRoZSBTT05JQyBpbnRlcnJ1cHQgaXMgY2xlYXJlZCBvciB0aGluZ3MgZ2V0IHVnbHkgKi8KICNpZmRlZiBTSFVUVVBfU09OSUMKIAlwcmludGsoIktpbGxpbmcgb25ib2FyZCBzb25pYy4uLiAiKTsKQEAgLTI1MiwxNSArMjQ4LDE2IEBACiAJICogYXQgbGV2ZWxzIDEtNy4gTW9zdCBvZiB0aGUgd29yayBpcyBkb25lIGVsc2V3aGVyZS4KIAkgKi8KIAotCWlmIChvc3NfcHJlc2VudCkgeworCWlmIChvc3NfcHJlc2VudCkKIAkJb3NzX3JlZ2lzdGVyX2ludGVycnVwdHMoKTsKLQl9IGVsc2UgeworCWVsc2UKIAkJdmlhX3JlZ2lzdGVyX2ludGVycnVwdHMoKTsKLQl9Ci0JaWYgKHBzY19wcmVzZW50KSBwc2NfcmVnaXN0ZXJfaW50ZXJydXB0cygpOwotCWlmIChiYWJvb25fcHJlc2VudCkgYmFib29uX3JlZ2lzdGVyX2ludGVycnVwdHMoKTsKKwlpZiAocHNjX3ByZXNlbnQpCisJCXBzY19yZWdpc3Rlcl9pbnRlcnJ1cHRzKCk7CisJaWYgKGJhYm9vbl9wcmVzZW50KQorCQliYWJvb25fcmVnaXN0ZXJfaW50ZXJydXB0cygpOwogCWlvcF9yZWdpc3Rlcl9pbnRlcnJ1cHRzKCk7Ci0JY3B1X3JlcXVlc3RfaXJxKDcsIG1hY19ubWlfaGFuZGxlciwgSVJRX0ZMR19MT0NLLCAiTk1JIiwKKwlyZXF1ZXN0X2lycShJUlFfQVVUT183LCBtYWNfbm1pX2hhbmRsZXIsIDAsICJOTUkiLAogCQkJbWFjX25taV9oYW5kbGVyKTsKICNpZmRlZiBERUJVR19NQUNJTlRTCiAJcHJpbnRrKCJtYWNfaW5pdF9JUlEoKTogRG9uZSFcbiIpOwpAQCAtMjY4LDEwNCArMjY1LDYgQEAKIH0KIAogLyoKLSAqIFJvdXRpbmVzIHRvIHdvcmsgd2l0aCBpcnFfbm9kZV90J3Mgb24gbGlua2VkIGxpc3RzIGxpZnRlZCBmcm9tCi0gKiB0aGUgQW1pZ2EgY29kZSB3cml0dGVuIGJ5IFJvbWFuIFppcHBlbC4KLSAqLwotCi1zdGF0aWMgaW5saW5lIHZvaWQgbWFjX2luc2VydF9pcnEoaXJxX25vZGVfdCAqKmxpc3QsIGlycV9ub2RlX3QgKm5vZGUpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpcnFfbm9kZV90ICpjdXI7Ci0KLQlpZiAoIW5vZGUtPmRldl9pZCkKLQkJcHJpbnRrKCIlczogV2FybmluZzogZGV2X2lkIG9mICVzIGlzIHplcm9cbiIsCi0JCSAgICAgICBfX0ZVTkNUSU9OX18sIG5vZGUtPmRldm5hbWUpOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCi0JY3VyID0gKmxpc3Q7Ci0KLQlpZiAobm9kZS0+ZmxhZ3MgJiBJUlFfRkxHX0ZBU1QpIHsKLQkJbm9kZS0+ZmxhZ3MgJj0gfklSUV9GTEdfU0xPVzsKLQkJd2hpbGUgKGN1ciAmJiBjdXItPmZsYWdzICYgSVJRX0ZMR19GQVNUKSB7Ci0JCQlsaXN0ID0gJmN1ci0+bmV4dDsKLQkJCWN1ciA9IGN1ci0+bmV4dDsKLQkJfQotCX0gZWxzZSBpZiAobm9kZS0+ZmxhZ3MgJiBJUlFfRkxHX1NMT1cpIHsKLQkJd2hpbGUgKGN1cikgewotCQkJbGlzdCA9ICZjdXItPm5leHQ7Ci0JCQljdXIgPSBjdXItPm5leHQ7Ci0JCX0KLQl9IGVsc2UgewotCQl3aGlsZSAoY3VyICYmICEoY3VyLT5mbGFncyAmIElSUV9GTEdfU0xPVykpIHsKLQkJCWxpc3QgPSAmY3VyLT5uZXh0OwotCQkJY3VyID0gY3VyLT5uZXh0OwotCQl9Ci0JfQotCi0Jbm9kZS0+bmV4dCA9IGN1cjsKLQkqbGlzdCA9IG5vZGU7Ci0KLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBtYWNfZGVsZXRlX2lycShpcnFfbm9kZV90ICoqbGlzdCwgdm9pZCAqZGV2X2lkKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaXJxX25vZGVfdCAqbm9kZTsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQotCWZvciAobm9kZSA9ICpsaXN0OyBub2RlOyBsaXN0ID0gJm5vZGUtPm5leHQsIG5vZGUgPSAqbGlzdCkgewotCQlpZiAobm9kZS0+ZGV2X2lkID09IGRldl9pZCkgewotCQkJKmxpc3QgPSBub2RlLT5uZXh0OwotCQkJLyogTWFyayBpdCBhcyBmcmVlLiAqLwotCQkJbm9kZS0+aGFuZGxlciA9IE5VTEw7Ci0JCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCXByaW50ayAoIiVzOiB0cmllZCB0byByZW1vdmUgaW52YWxpZCBpcnFcbiIsIF9fRlVOQ1RJT05fXyk7Ci19Ci0KLS8qCi0gKiBDYWxsIGFsbCB0aGUgaGFuZGxlcnMgZm9yIGEgZ2l2ZW4gaW50ZXJydXB0LiBGYXN0IGhhbmRsZXJzIGFyZSBjYWxsZWQKLSAqIGZpcnN0IGZvbGxvd2VkIGJ5IHNsb3cgaGFuZGxlcnMuCi0gKgotICogVGhpcyBjb2RlIHRha2VuIGZyb20gdGhlIG9yaWdpbmFsIEFtaWdhIGNvZGUgd3JpdHRlbiBieSBSb21hbiBaaXBwZWwuCi0gKi8KLQotdm9pZCBtYWNfZG9faXJxX2xpc3QoaW50IGlycSwgc3RydWN0IHB0X3JlZ3MgKmZwKQotewotCWlycV9ub2RlX3QgKm5vZGUsICpzbG93X25vZGVzOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlrc3RhdF9jcHUoMCkuaXJxc1tpcnFdKys7Ci0KLSNpZmRlZiBERUJVR19TUFVSSU9VUwotCWlmICghbWFjX2lycV9saXN0W2lycV0gJiYgKGNvbnNvbGVfbG9nbGV2ZWwgPiA3KSkgewotCQlwcmludGsoIm1hY19kb19pcnFfbGlzdDogc3B1cmlvdXMgaW50ZXJydXB0ICVkIVxuIiwgaXJxKTsKLQkJcmV0dXJuOwotCX0KLSNlbmRpZgotCi0JLyogc2VydmUgZmlyc3QgZmFzdCBhbmQgbm9ybWFsIGhhbmRsZXJzICovCi0JZm9yIChub2RlID0gbWFjX2lycV9saXN0W2lycV07Ci0JICAgICBub2RlICYmICghKG5vZGUtPmZsYWdzICYgSVJRX0ZMR19TTE9XKSk7Ci0JICAgICBub2RlID0gbm9kZS0+bmV4dCkKLQkJbm9kZS0+aGFuZGxlcihpcnEsIG5vZGUtPmRldl9pZCwgZnApOwotCWlmICghbm9kZSkgcmV0dXJuOwotCWxvY2FsX3NhdmVfZmxhZ3MoZmxhZ3MpOwotCWxvY2FsX2lycV9yZXN0b3JlKChmbGFncyAmIH4weDA3MDApIHwgKGZwLT5zciAmIDB4MDcwMCkpOwotCS8qIGlmIHNsb3cgaGFuZGxlcnMgZXhpc3RzLCBzZXJ2ZSB0aGVtIG5vdyAqLwotCXNsb3dfbm9kZXMgPSBub2RlOwotCWZvciAoOyBub2RlOyBub2RlID0gbm9kZS0+bmV4dCkgewotCQlub2RlLT5oYW5kbGVyKGlycSwgbm9kZS0+ZGV2X2lkLCBmcCk7Ci0JfQotfQotCi0vKgogICogIG1hY19lbmFibGVfaXJxIC0gZW5hYmxlIGFuIGludGVycnVwdCBzb3VyY2UKICAqIG1hY19kaXNhYmxlX2lycSAtIGRpc2FibGUgYW4gaW50ZXJydXB0IHNvdXJjZQogICogICBtYWNfY2xlYXJfaXJxIC0gY2xlYXJzIGEgcGVuZGluZyBpbnRlcnJ1cHQKQEAgLTM3NCwyNzYgKzI3MywxMjQgQEAKICAqIFRoZXNlIHJvdXRpbmVzIGFyZSBqdXN0IGRpc3BhdGNoZXJzIHRvIHRoZSBWSUEvT1NTL1BTQyByb3V0aW5lcy4KICAqLwogCi12b2lkIG1hY19lbmFibGVfaXJxICh1bnNpZ25lZCBpbnQgaXJxKQorc3RhdGljIHZvaWQgbWFjX2VuYWJsZV9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKLQlpbnQgaXJxX3NyYwk9IElSUV9TUkMoaXJxKTsKKwlpbnQgaXJxX3NyYyA9IElSUV9TUkMoaXJxKTsKIAogCXN3aXRjaChpcnFfc3JjKSB7Ci0JCWNhc2UgMTogdmlhX2lycV9lbmFibGUoaXJxKTsKLQkJCWJyZWFrOwotCQljYXNlIDI6Ci0JCWNhc2UgNzogaWYgKG9zc19wcmVzZW50KSB7Ci0JCQkJb3NzX2lycV9lbmFibGUoaXJxKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdmlhX2lycV9lbmFibGUoaXJxKTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIDM6Ci0JCWNhc2UgNDoKLQkJY2FzZSA1OgotCQljYXNlIDY6IGlmIChwc2NfcHJlc2VudCkgewotCQkJCXBzY19pcnFfZW5hYmxlKGlycSk7Ci0JCQl9IGVsc2UgaWYgKG9zc19wcmVzZW50KSB7Ci0JCQkJb3NzX2lycV9lbmFibGUoaXJxKTsKLQkJCX0gZWxzZSBpZiAoaXJxX3NyYyA9PSA0KSB7Ci0JCQkJc2NjX2lycV9lbmFibGUoaXJxKTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIDg6IGlmIChiYWJvb25fcHJlc2VudCkgewotCQkJCWJhYm9vbl9pcnFfZW5hYmxlKGlycSk7Ci0JCQl9Ci0JCQlicmVhazsKKwljYXNlIDE6CisJCXZpYV9pcnFfZW5hYmxlKGlycSk7CisJCWJyZWFrOworCWNhc2UgMjoKKwljYXNlIDc6CisJCWlmIChvc3NfcHJlc2VudCkKKwkJCW9zc19pcnFfZW5hYmxlKGlycSk7CisJCWVsc2UKKwkJCXZpYV9pcnFfZW5hYmxlKGlycSk7CisJCWJyZWFrOworCWNhc2UgMzoKKwljYXNlIDQ6CisJY2FzZSA1OgorCWNhc2UgNjoKKwkJaWYgKHBzY19wcmVzZW50KQorCQkJcHNjX2lycV9lbmFibGUoaXJxKTsKKwkJZWxzZSBpZiAob3NzX3ByZXNlbnQpCisJCQlvc3NfaXJxX2VuYWJsZShpcnEpOworCQllbHNlIGlmIChpcnFfc3JjID09IDQpCisJCQlzY2NfaXJxX2VuYWJsZShpcnEpOworCQlicmVhazsKKwljYXNlIDg6CisJCWlmIChiYWJvb25fcHJlc2VudCkKKwkJCWJhYm9vbl9pcnFfZW5hYmxlKGlycSk7CisJCWJyZWFrOwogCX0KIH0KIAotdm9pZCBtYWNfZGlzYWJsZV9pcnEgKHVuc2lnbmVkIGludCBpcnEpCitzdGF0aWMgdm9pZCBtYWNfZGlzYWJsZV9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKLQlpbnQgaXJxX3NyYwk9IElSUV9TUkMoaXJxKTsKKwlpbnQgaXJxX3NyYyA9IElSUV9TUkMoaXJxKTsKIAogCXN3aXRjaChpcnFfc3JjKSB7Ci0JCWNhc2UgMTogdmlhX2lycV9kaXNhYmxlKGlycSk7Ci0JCQlicmVhazsKLQkJY2FzZSAyOgotCQljYXNlIDc6IGlmIChvc3NfcHJlc2VudCkgewotCQkJCW9zc19pcnFfZGlzYWJsZShpcnEpOwotCQkJfSBlbHNlIHsKLQkJCQl2aWFfaXJxX2Rpc2FibGUoaXJxKTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIDM6Ci0JCWNhc2UgNDoKLQkJY2FzZSA1OgotCQljYXNlIDY6IGlmIChwc2NfcHJlc2VudCkgewotCQkJCXBzY19pcnFfZGlzYWJsZShpcnEpOwotCQkJfSBlbHNlIGlmIChvc3NfcHJlc2VudCkgewotCQkJCW9zc19pcnFfZGlzYWJsZShpcnEpOwotCQkJfSBlbHNlIGlmIChpcnFfc3JjID09IDQpIHsKLQkJCQlzY2NfaXJxX2Rpc2FibGUoaXJxKTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIDg6IGlmIChiYWJvb25fcHJlc2VudCkgewotCQkJCWJhYm9vbl9pcnFfZGlzYWJsZShpcnEpOwotCQkJfQotCQkJYnJlYWs7CisJY2FzZSAxOgorCQl2aWFfaXJxX2Rpc2FibGUoaXJxKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCWNhc2UgNzoKKwkJaWYgKG9zc19wcmVzZW50KQorCQkJb3NzX2lycV9kaXNhYmxlKGlycSk7CisJCWVsc2UKKwkJCXZpYV9pcnFfZGlzYWJsZShpcnEpOworCQlicmVhazsKKwljYXNlIDM6CisJY2FzZSA0OgorCWNhc2UgNToKKwljYXNlIDY6CisJCWlmIChwc2NfcHJlc2VudCkKKwkJCXBzY19pcnFfZGlzYWJsZShpcnEpOworCQllbHNlIGlmIChvc3NfcHJlc2VudCkKKwkJCW9zc19pcnFfZGlzYWJsZShpcnEpOworCQllbHNlIGlmIChpcnFfc3JjID09IDQpCisJCQlzY2NfaXJxX2Rpc2FibGUoaXJxKTsKKwkJYnJlYWs7CisJY2FzZSA4OgorCQlpZiAoYmFib29uX3ByZXNlbnQpCisJCQliYWJvb25faXJxX2Rpc2FibGUoaXJxKTsKKwkJYnJlYWs7CiAJfQogfQogCi12b2lkIG1hY19jbGVhcl9pcnEoIHVuc2lnbmVkIGludCBpcnEgKQordm9pZCBtYWNfY2xlYXJfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7CiAJc3dpdGNoKElSUV9TUkMoaXJxKSkgewotCQljYXNlIDE6IHZpYV9pcnFfY2xlYXIoaXJxKTsKLQkJCWJyZWFrOwotCQljYXNlIDI6Ci0JCWNhc2UgNzogaWYgKG9zc19wcmVzZW50KSB7Ci0JCQkJb3NzX2lycV9jbGVhcihpcnEpOwotCQkJfSBlbHNlIHsKLQkJCQl2aWFfaXJxX2NsZWFyKGlycSk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSAzOgotCQljYXNlIDQ6Ci0JCWNhc2UgNToKLQkJY2FzZSA2OiBpZiAocHNjX3ByZXNlbnQpIHsKLQkJCQlwc2NfaXJxX2NsZWFyKGlycSk7Ci0JCQl9IGVsc2UgaWYgKG9zc19wcmVzZW50KSB7Ci0JCQkJb3NzX2lycV9jbGVhcihpcnEpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgODogaWYgKGJhYm9vbl9wcmVzZW50KSB7Ci0JCQkJYmFib29uX2lycV9jbGVhcihpcnEpOwotCQkJfQotCQkJYnJlYWs7CisJY2FzZSAxOgorCQl2aWFfaXJxX2NsZWFyKGlycSk7CisJCWJyZWFrOworCWNhc2UgMjoKKwljYXNlIDc6CisJCWlmIChvc3NfcHJlc2VudCkKKwkJCW9zc19pcnFfY2xlYXIoaXJxKTsKKwkJZWxzZQorCQkJdmlhX2lycV9jbGVhcihpcnEpOworCQlicmVhazsKKwljYXNlIDM6CisJY2FzZSA0OgorCWNhc2UgNToKKwljYXNlIDY6CisJCWlmIChwc2NfcHJlc2VudCkKKwkJCXBzY19pcnFfY2xlYXIoaXJxKTsKKwkJZWxzZSBpZiAob3NzX3ByZXNlbnQpCisJCQlvc3NfaXJxX2NsZWFyKGlycSk7CisJCWJyZWFrOworCWNhc2UgODoKKwkJaWYgKGJhYm9vbl9wcmVzZW50KQorCQkJYmFib29uX2lycV9jbGVhcihpcnEpOworCQlicmVhazsKIAl9CiB9CiAKLWludCBtYWNfaXJxX3BlbmRpbmcoIHVuc2lnbmVkIGludCBpcnEgKQoraW50IG1hY19pcnFfcGVuZGluZyh1bnNpZ25lZCBpbnQgaXJxKQogewogCXN3aXRjaChJUlFfU1JDKGlycSkpIHsKLQkJY2FzZSAxOiByZXR1cm4gdmlhX2lycV9wZW5kaW5nKGlycSk7Ci0JCWNhc2UgMjoKLQkJY2FzZSA3OiBpZiAob3NzX3ByZXNlbnQpIHsKLQkJCQlyZXR1cm4gb3NzX2lycV9wZW5kaW5nKGlycSk7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiB2aWFfaXJxX3BlbmRpbmcoaXJxKTsKLQkJCX0KLQkJY2FzZSAzOgotCQljYXNlIDQ6Ci0JCWNhc2UgNToKLQkJY2FzZSA2OiBpZiAocHNjX3ByZXNlbnQpIHsKLQkJCQlyZXR1cm4gcHNjX2lycV9wZW5kaW5nKGlycSk7Ci0JCQl9IGVsc2UgaWYgKG9zc19wcmVzZW50KSB7Ci0JCQkJcmV0dXJuIG9zc19pcnFfcGVuZGluZyhpcnEpOwotCQkJfQorCWNhc2UgMToKKwkJcmV0dXJuIHZpYV9pcnFfcGVuZGluZyhpcnEpOworCWNhc2UgMjoKKwljYXNlIDc6CisJCWlmIChvc3NfcHJlc2VudCkKKwkJCXJldHVybiBvc3NfaXJxX3BlbmRpbmcoaXJxKTsKKwkJZWxzZQorCQkJcmV0dXJuIHZpYV9pcnFfcGVuZGluZyhpcnEpOworCWNhc2UgMzoKKwljYXNlIDQ6CisJY2FzZSA1OgorCWNhc2UgNjoKKwkJaWYgKHBzY19wcmVzZW50KQorCQkJcmV0dXJuIHBzY19pcnFfcGVuZGluZyhpcnEpOworCQllbHNlIGlmIChvc3NfcHJlc2VudCkKKwkJCXJldHVybiBvc3NfaXJxX3BlbmRpbmcoaXJxKTsKIAl9CiAJcmV0dXJuIDA7CiB9CiAKLS8qCi0gKiBBZGQgYW4gaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSB0byBhbiBpbnRlcnJ1cHQgc291cmNlLgotICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MuCi0gKgotICogRklYTUU6IFlvdSBjYW4gcmVnaXN0ZXIgaW50ZXJydXB0cyBvbiBub25leGlzdGVudCBzb3VyY2UgKGllIFBTQzQgb24gYQotICogICAgICAgIG5vbi1QU0MgbWFjaGluZSkuIFdlIHNob3VsZCByZXR1cm4gLUVJTlZBTCBpbiB0aG9zZSBjYXNlcy4KLSAqLwotCi1pbnQgbWFjX3JlcXVlc3RfaXJxKHVuc2lnbmVkIGludCBpcnEsCi0JCSAgICBpcnFyZXR1cm5fdCAoKmhhbmRsZXIpKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKSwKLQkJICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldm5hbWUsIHZvaWQgKmRldl9pZCkKLXsKLQlpcnFfbm9kZV90ICpub2RlOwotCi0jaWZkZWYgREVCVUdfTUFDSU5UUwotCXByaW50ayAoIiVzOiBpcnEgJWQgcmVxdWVzdGVkIGZvciAlc1xuIiwgX19GVU5DVElPTl9fLCBpcnEsIGRldm5hbWUpOwotI2VuZGlmCi0KLQlpZiAoaXJxIDwgVklBMV9TT1VSQ0VfQkFTRSkgewotCQlyZXR1cm4gY3B1X3JlcXVlc3RfaXJxKGlycSwgaGFuZGxlciwgZmxhZ3MsIGRldm5hbWUsIGRldl9pZCk7Ci0JfQotCi0JaWYgKGlycSA+PSBOVU1fTUFDX1NPVVJDRVMpIHsKLQkJcHJpbnRrICgiJXM6IHVua25vd24gaXJxICVkIHJlcXVlc3RlZCBieSAlc1xuIiwKLQkJICAgICAgICBfX0ZVTkNUSU9OX18sIGlycSwgZGV2bmFtZSk7Ci0JfQotCi0JLyogR2V0IGEgbm9kZSBhbmQgc3RpY2sgaXQgb250byB0aGUgcmlnaHQgbGlzdCAqLwotCi0JaWYgKCEobm9kZSA9IG5ld19pcnFfbm9kZSgpKSkgcmV0dXJuIC1FTk9NRU07Ci0KLQlub2RlLT5oYW5kbGVyCT0gaGFuZGxlcjsKLQlub2RlLT5mbGFncwk9IGZsYWdzOwotCW5vZGUtPmRldl9pZAk9IGRldl9pZDsKLQlub2RlLT5kZXZuYW1lCT0gZGV2bmFtZTsKLQlub2RlLT5uZXh0CT0gTlVMTDsKLQltYWNfaW5zZXJ0X2lycSgmbWFjX2lycV9saXN0W2lycV0sIG5vZGUpOwotCi0JLyogTm93IGVuYWJsZSB0aGUgSVJRIHNvdXJjZSAqLwotCi0JbWFjX2VuYWJsZV9pcnEoaXJxKTsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogUmVtb3ZlcyBhbiBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lIGZyb20gYW4gaW50ZXJydXB0IHNvdXJjZS4KLSAqLwotCi12b2lkIG1hY19mcmVlX2lycSh1bnNpZ25lZCBpbnQgaXJxLCB2b2lkICpkZXZfaWQpCi17Ci0jaWZkZWYgREVCVUdfTUFDSU5UUwotCXByaW50ayAoIiVzOiBpcnEgJWQgZnJlZWQgYnkgJXBcbiIsIF9fRlVOQ1RJT05fXywgaXJxLCBkZXZfaWQpOwotI2VuZGlmCi0KLQlpZiAoaXJxIDwgVklBMV9TT1VSQ0VfQkFTRSkgewotCQljcHVfZnJlZV9pcnEoaXJxLCBkZXZfaWQpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKGlycSA+PSBOVU1fTUFDX1NPVVJDRVMpIHsKLQkJcHJpbnRrICgiJXM6IHVua25vd24gaXJxICVkIGZyZWVkXG4iLAotCQkgICAgICAgIF9fRlVOQ1RJT05fXywgaXJxKTsKLQkJcmV0dXJuOwotCX0KLQotCW1hY19kZWxldGVfaXJxKCZtYWNfaXJxX2xpc3RbaXJxXSwgZGV2X2lkKTsKLQotCS8qIElmIHRoZSBsaXN0IGZvciB0aGlzIGludGVycnVwdCBpcyAqLwotCS8qIGVtcHR5IHRoZW4gZGlzYWJsZSB0aGUgc291cmNlLiAgICAqLwotCi0JaWYgKCFtYWNfaXJxX2xpc3RbaXJxXSkgewotCQltYWNfZGlzYWJsZV9pcnEoaXJxKTsKLQl9Ci19Ci0KLS8qCi0gKiBHZW5lcmF0ZSBhIHByZXR0eSBsaXN0aW5nIGZvciAvcHJvYy9pbnRlcnJ1cHRzCi0gKgotICogQnkgdGhlIHRpbWUgd2UncmUgY2FsbGVkIHRoZSBhdXRvdmVjdG9yIGludGVycnVwdCBsaXN0IGhhcyBhbHJlYWR5IGJlZW4KLSAqIGdlbmVyYXRlZCwgc28gd2UganVzdCBuZWVkIHRvIGRvIHRoZSBtYWNoc3BlYyBpbnRlcnJ1cHRzLgotICoKLSAqIDk5MDUwNiAoam10KSAtIHJld3JpdHRlbiB0byBoYW5kbGUgY2hhaW5lZCBtYWNoc3BlYyBpbnRlcnJ1cHQgaGFuZGxlcnMuCi0gKiAgICAgICAgICAgICAgICBBbHNvIHJlbW92ZWQgZGlzcGxheSBvZiBudW1fc3B1cmlvdXMgaXQgaXMgYWxyZWFkeQotICoJCSAgZGlzcGxheWVkIGZvciB1cyBhcyBhdXRvdmVjdG9yIGlycSAwLgotICovCi0KLWludCBzaG93X21hY19pbnRlcnJ1cHRzKHN0cnVjdCBzZXFfZmlsZSAqcCwgdm9pZCAqdikKLXsKLQlpbnQgaTsKLQlpcnFfbm9kZV90ICpub2RlOwotCWNoYXIgKmJhc2U7Ci0KLQkvKiBEb24ndCBkbyBOdWJ1cyBpbnRlcnJ1cHRzIGluIHRoaXMgbG9vcDsgd2UgZG8gdGhlbSBzZXBhcmF0ZWx5ICAqLwotCS8qIGJlbG93IHNvIHRoYXQgd2UgY2FuIHByaW50IHNsb3QgbnVtYmVycyBpbnN0ZWFkIG9mIElSUSBudW1iZXJzICovCi0KLQlmb3IgKGkgPSBWSUExX1NPVVJDRV9CQVNFIDsgaSA8IE5VTV9NQUNfU09VUkNFUyA7ICsraSkgewotCi0JCS8qIE5vbmV4aXN0YW50IGludGVycnVwdCBvciBub3RoaW5nIHJlZ2lzdGVyZWQ7IHNraXAgaXQuICovCi0KLQkJaWYgKChub2RlID0gbWFjX2lycV9saXN0W2ldKSA9PSBOVUxMKSBjb250aW51ZTsKLQkJaWYgKG5vZGUtPmZsYWdzICYgSVJRX0ZMR19TVEQpIGNvbnRpbnVlOwotCi0JCWJhc2UgPSAiIjsKLQkJc3dpdGNoKElSUV9TUkMoaSkpIHsKLQkJCWNhc2UgMTogYmFzZSA9ICJ2aWExIjsKLQkJCQlicmVhazsKLQkJCWNhc2UgMjogaWYgKG9zc19wcmVzZW50KSB7Ci0JCQkJCWJhc2UgPSAib3NzIjsKLQkJCQl9IGVsc2UgewotCQkJCQliYXNlID0gInZpYTIiOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgMzoKLQkJCWNhc2UgNDoKLQkJCWNhc2UgNToKLQkJCWNhc2UgNjogaWYgKHBzY19wcmVzZW50KSB7Ci0JCQkJCWJhc2UgPSAicHNjIjsKLQkJCQl9IGVsc2UgaWYgKG9zc19wcmVzZW50KSB7Ci0JCQkJCWJhc2UgPSAib3NzIjsKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAoSVJRX1NSQyhpKSA9PSA0KSBiYXNlID0gInNjYyI7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSA3OiBiYXNlID0gIm5idXMiOwotCQkJCWJyZWFrOwotCQkJY2FzZSA4OiBiYXNlID0gImJibiI7Ci0JCQkJYnJlYWs7Ci0JCX0KLQkJc2VxX3ByaW50ZihwLCAiJTRzICUyZDogJTEwdSAiLCBiYXNlLCBpLCBrc3RhdF9jcHUoMCkuaXJxc1tpXSk7Ci0KLQkJZG8gewotCQkJaWYgKG5vZGUtPmZsYWdzICYgSVJRX0ZMR19GQVNUKSB7Ci0JCQkJc2VxX3B1dHMocCwgIkYgIik7Ci0JCQl9IGVsc2UgaWYgKG5vZGUtPmZsYWdzICYgSVJRX0ZMR19TTE9XKSB7Ci0JCQkJc2VxX3B1dHMocCwgIlMgIik7Ci0JCQl9IGVsc2UgewotCQkJCXNlcV9wdXRzKHAsICIgICIpOwotCQkJfQotCQkJc2VxX3ByaW50ZihwLCAiJXNcbiIsIG5vZGUtPmRldm5hbWUpOwotCQkJaWYgKChub2RlID0gbm9kZS0+bmV4dCkpIHsKLQkJCQlzZXFfcHV0cyhwLCAiICAgICAgICAgICAgICAgICAgICAiKTsKLQkJCX0KLQkJfSB3aGlsZShub2RlKTsKLQotCX0KLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBtYWNfZGVmYXVsdF9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0jaWZkZWYgREVCVUdfU1BVUklPVVMKLQlwcmludGsoIlVuZXhwZWN0ZWQgSVJRICVkIG9uIGRldmljZSAlcFxuIiwgaXJxLCBkZXZfaWQpOwotI2VuZGlmCi19Ci0KIHN0YXRpYyBpbnQgbnVtX2RlYnVnWzhdOwogCiBpcnFyZXR1cm5fdCBtYWNfZGVidWdfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQpAQCAtNjgzLDcgKzQzMCw3IEBACiAJd2hpbGUgKG5taV9ob2xkID09IDEpCiAJCXVkZWxheSgxMDAwKTsKIAotCWlmICggY29uc29sZV9sb2dsZXZlbCA+PSA4ICkgeworCWlmIChjb25zb2xlX2xvZ2xldmVsID49IDgpIHsKICNpZiAwCiAJCXNob3dfc3RhdGUoKTsKIAkJcHJpbnRrKCJQQzogJTA4bHhcblNSOiAlMDR4ICBTUDogJXBcbiIsIGZwLT5wYywgZnAtPnNyLCBmcCk7CkBAIC03MTIsMTQgKzQ1OSwxNiBAQAogICogZG9uZSBpbiBoYXJkd2FyZSAob25seSB0aGUgUFNDIGNhbiBkbyB0aGF0LikKICAqLwogCi1zdGF0aWMgdm9pZCBzY2NfaXJxX2VuYWJsZShpbnQgaXJxKSB7Ci0JaW50IGlycV9pZHggICAgID0gSVJRX0lEWChpcnEpOworc3RhdGljIHZvaWQgc2NjX2lycV9lbmFibGUodW5zaWduZWQgaW50IGlycSkKK3sKKwlpbnQgaXJxX2lkeCA9IElSUV9JRFgoaXJxKTsKIAogCXNjY19tYXNrIHw9ICgxIDw8IGlycV9pZHgpOwogfQogCi1zdGF0aWMgdm9pZCBzY2NfaXJxX2Rpc2FibGUoaW50IGlycSkgewotCWludCBpcnFfaWR4ICAgICA9IElSUV9JRFgoaXJxKTsKK3N0YXRpYyB2b2lkIHNjY19pcnFfZGlzYWJsZSh1bnNpZ25lZCBpbnQgaXJxKQoreworCWludCBpcnFfaWR4ID0gSVJRX0lEWChpcnEpOwogCiAJc2NjX21hc2sgJj0gfigxIDw8IGlycV9pZHgpOwogfQpAQCAtNzU0LDYgKzUwMyw4IEBACiAJLyogYW5kIHNpbmNlIHRoZXkncmUgYXV0b3ZlY3RvciBpbnRlcnJ1cHRzIHRoZXkgKi8KIAkvKiBwcmV0dHkgbXVjaCBraWxsIHRoZSBzeXN0ZW0uICAgICAgICAgICAgICAgICAqLwogCi0JaWYgKHJlZyAmIDB4MzgpIG1hY19kb19pcnFfbGlzdChJUlFfU0NDQSwgcmVncyk7Ci0JaWYgKHJlZyAmIDB4MDcpIG1hY19kb19pcnFfbGlzdChJUlFfU0NDQiwgcmVncyk7CisJaWYgKHJlZyAmIDB4MzgpCisJCW02OGtfaGFuZGxlX2ludChJUlFfU0NDQSwgcmVncyk7CisJaWYgKHJlZyAmIDB4MDcpCisJCW02OGtfaGFuZGxlX2ludChJUlFfU0NDQiwgcmVncyk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL202OGsvbWFjL29zcy5jIGIvYXJjaC9tNjhrL21hYy9vc3MuYwppbmRleCAzMzM1NDc2Li42M2UwNDM2IDEwMDY0NAotLS0gYS9hcmNoL202OGsvbWFjL29zcy5jCisrKyBiL2FyY2gvbTY4ay9tYWMvb3NzLmMKQEAgLTY3LDE1ICs2NywxNSBAQAogCiB2b2lkIF9faW5pdCBvc3NfcmVnaXN0ZXJfaW50ZXJydXB0cyh2b2lkKQogewotCWNwdV9yZXF1ZXN0X2lycShPU1NfSVJRTEVWX1NDU0ksIG9zc19pcnEsIElSUV9GTEdfTE9DSywKKwlyZXF1ZXN0X2lycShPU1NfSVJRTEVWX1NDU0ksIG9zc19pcnEsIElSUV9GTEdfTE9DSywKIAkJCSJzY3NpIiwgKHZvaWQgKikgb3NzKTsKLQljcHVfcmVxdWVzdF9pcnEoT1NTX0lSUUxFVl9JT1BTQ0MsIG1hY19zY2NfZGlzcGF0Y2gsIElSUV9GTEdfTE9DSywKKwlyZXF1ZXN0X2lycShPU1NfSVJRTEVWX0lPUFNDQywgbWFjX3NjY19kaXNwYXRjaCwgSVJRX0ZMR19MT0NLLAogCQkJInNjYyIsIG1hY19zY2NfZGlzcGF0Y2gpOwotCWNwdV9yZXF1ZXN0X2lycShPU1NfSVJRTEVWX05VQlVTLCBvc3NfbnVidXNfaXJxLCBJUlFfRkxHX0xPQ0ssCisJcmVxdWVzdF9pcnEoT1NTX0lSUUxFVl9OVUJVUywgb3NzX251YnVzX2lycSwgSVJRX0ZMR19MT0NLLAogCQkJIm51YnVzIiwgKHZvaWQgKikgb3NzKTsKLQljcHVfcmVxdWVzdF9pcnEoT1NTX0lSUUxFVl9TT1VORCwgb3NzX2lycSwgSVJRX0ZMR19MT0NLLAorCXJlcXVlc3RfaXJxKE9TU19JUlFMRVZfU09VTkQsIG9zc19pcnEsIElSUV9GTEdfTE9DSywKIAkJCSJzb3VuZCIsICh2b2lkICopIG9zcyk7Ci0JY3B1X3JlcXVlc3RfaXJxKE9TU19JUlFMRVZfVklBMSwgdmlhMV9pcnEsIElSUV9GTEdfTE9DSywKKwlyZXF1ZXN0X2lycShPU1NfSVJRTEVWX1ZJQTEsIHZpYTFfaXJxLCBJUlFfRkxHX0xPQ0ssCiAJCQkidmlhMSIsICh2b2lkICopIHZpYTEpOwogfQogCkBAIC0xMTMsNyArMTEzLDcgQEAKIAkJb3NzLT5pcnFfcGVuZGluZyAmPSB+T1NTX0lQX1NPVU5EOwogCX0gZWxzZSBpZiAoZXZlbnRzICYgT1NTX0lQX1NDU0kpIHsKIAkJb3NzLT5pcnFfbGV2ZWxbT1NTX1NDU0ldID0gT1NTX0lSUUxFVl9ESVNBQkxFRDsKLQkJbWFjX2RvX2lycV9saXN0KElSUV9NQUNfU0NTSSwgcmVncyk7CisJCW02OGtfaGFuZGxlX2ludChJUlFfTUFDX1NDU0ksIHJlZ3MpOwogCQlvc3MtPmlycV9wZW5kaW5nICY9IH5PU1NfSVBfU0NTSTsKIAkJb3NzLT5pcnFfbGV2ZWxbT1NTX1NDU0ldID0gT1NTX0lSUUxFVl9TQ1NJOwogCX0gZWxzZSB7CkBAIC0xNDYsNyArMTQ2LDcgQEAKIAlmb3IgKGkgPSAwLCBpcnFfYml0ID0gMSA7IGkgPCA2IDsgaSsrLCBpcnFfYml0IDw8PSAxKSB7CiAJCWlmIChldmVudHMgJiBpcnFfYml0KSB7CiAJCQlvc3MtPmlycV9sZXZlbFtpXSA9IE9TU19JUlFMRVZfRElTQUJMRUQ7Ci0JCQltYWNfZG9faXJxX2xpc3QoTlVCVVNfU09VUkNFX0JBU0UgKyBpLCByZWdzKTsKKwkJCW02OGtfaGFuZGxlX2ludChOVUJVU19TT1VSQ0VfQkFTRSArIGksIHJlZ3MpOwogCQkJb3NzLT5pcnFfcGVuZGluZyAmPSB+aXJxX2JpdDsKIAkJCW9zcy0+aXJxX2xldmVsW2ldID0gT1NTX0lSUUxFVl9OVUJVUzsKIAkJfQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL21hYy9wc2MuYyBiL2FyY2gvbTY4ay9tYWMvcHNjLmMKaW5kZXggZTcyMzg0ZS4uZTI2MjE4MCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL21hYy9wc2MuYworKysgYi9hcmNoL202OGsvbWFjL3BzYy5jCkBAIC0xMTcsMTAgKzExNywxMCBAQAogCiB2b2lkIF9faW5pdCBwc2NfcmVnaXN0ZXJfaW50ZXJydXB0cyh2b2lkKQogewotCWNwdV9yZXF1ZXN0X2lycSgzLCBwc2NfaXJxLCBJUlFfRkxHX0xPQ0ssICJwc2MzIiwgKHZvaWQgKikgMHgzMCk7Ci0JY3B1X3JlcXVlc3RfaXJxKDQsIHBzY19pcnEsIElSUV9GTEdfTE9DSywgInBzYzQiLCAodm9pZCAqKSAweDQwKTsKLQljcHVfcmVxdWVzdF9pcnEoNSwgcHNjX2lycSwgSVJRX0ZMR19MT0NLLCAicHNjNSIsICh2b2lkICopIDB4NTApOwotCWNwdV9yZXF1ZXN0X2lycSg2LCBwc2NfaXJxLCBJUlFfRkxHX0xPQ0ssICJwc2M2IiwgKHZvaWQgKikgMHg2MCk7CisJcmVxdWVzdF9pcnEoSVJRX0FVVE9fMywgcHNjX2lycSwgMCwgInBzYzMiLCAodm9pZCAqKSAweDMwKTsKKwlyZXF1ZXN0X2lycShJUlFfQVVUT180LCBwc2NfaXJxLCAwLCAicHNjNCIsICh2b2lkICopIDB4NDApOworCXJlcXVlc3RfaXJxKElSUV9BVVRPXzUsIHBzY19pcnEsIDAsICJwc2M1IiwgKHZvaWQgKikgMHg1MCk7CisJcmVxdWVzdF9pcnEoSVJRX0FVVE9fNiwgcHNjX2lycSwgMCwgInBzYzYiLCAodm9pZCAqKSAweDYwKTsKIH0KIAogLyoKQEAgLTE0OSw3ICsxNDksNyBAQAogCWZvciAoaSA9IDAsIGlycV9iaXQgPSAxIDsgaSA8IDQgOyBpKyssIGlycV9iaXQgPDw9IDEpIHsKIAkgICAgICAgIGlmIChldmVudHMgJiBpcnFfYml0KSB7CiAJCQlwc2Nfd3JpdGVfYnl0ZShwSUVSLCBpcnFfYml0KTsKLQkJCW1hY19kb19pcnFfbGlzdChiYXNlX2lycSArIGksIHJlZ3MpOworCQkJbTY4a19oYW5kbGVfaW50KGJhc2VfaXJxICsgaSwgcmVncyk7CiAJCQlwc2Nfd3JpdGVfYnl0ZShwSUZSLCBpcnFfYml0KTsKIAkJCXBzY193cml0ZV9ieXRlKHBJRVIsIGlycV9iaXQgfCAweDgwKTsKIAkJfQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL21hYy92aWEuYyBiL2FyY2gvbTY4ay9tYWMvdmlhLmMKaW5kZXggYTZlMzgxNC4uYzRhYTM0NSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL21hYy92aWEuYworKysgYi9hcmNoL202OGsvbWFjL3ZpYS5jCkBAIC0yNTMsMjEgKzI1MywyMSBAQAogdm9pZCBfX2luaXQgdmlhX3JlZ2lzdGVyX2ludGVycnVwdHModm9pZCkKIHsKIAlpZiAodmlhX2FsdF9tYXBwaW5nKSB7Ci0JCWNwdV9yZXF1ZXN0X2lycShJUlFfQVVUT18xLCB2aWExX2lycSwKKwkJcmVxdWVzdF9pcnEoSVJRX0FVVE9fMSwgdmlhMV9pcnEsCiAJCQkJSVJRX0ZMR19MT0NLfElSUV9GTEdfRkFTVCwgInNvZnR3YXJlIiwKIAkJCQkodm9pZCAqKSB2aWExKTsKLQkJY3B1X3JlcXVlc3RfaXJxKElSUV9BVVRPXzYsIHZpYTFfaXJxLAorCQlyZXF1ZXN0X2lycShJUlFfQVVUT182LCB2aWExX2lycSwKIAkJCQlJUlFfRkxHX0xPQ0t8SVJRX0ZMR19GQVNULCAidmlhMSIsCiAJCQkJKHZvaWQgKikgdmlhMSk7CiAJfSBlbHNlIHsKLQkJY3B1X3JlcXVlc3RfaXJxKElSUV9BVVRPXzEsIHZpYTFfaXJxLAorCQlyZXF1ZXN0X2lycShJUlFfQVVUT18xLCB2aWExX2lycSwKIAkJCQlJUlFfRkxHX0xPQ0t8SVJRX0ZMR19GQVNULCAidmlhMSIsCiAJCQkJKHZvaWQgKikgdmlhMSk7CiAJfQotCWNwdV9yZXF1ZXN0X2lycShJUlFfQVVUT18yLCB2aWEyX2lycSwgSVJRX0ZMR19MT0NLfElSUV9GTEdfRkFTVCwKKwlyZXF1ZXN0X2lycShJUlFfQVVUT18yLCB2aWEyX2lycSwgSVJRX0ZMR19MT0NLfElSUV9GTEdfRkFTVCwKIAkJCSJ2aWEyIiwgKHZvaWQgKikgdmlhMik7CiAJaWYgKCFwc2NfcHJlc2VudCkgewotCQljcHVfcmVxdWVzdF9pcnEoSVJRX0FVVE9fNCwgbWFjX3NjY19kaXNwYXRjaCwgSVJRX0ZMR19MT0NLLAorCQlyZXF1ZXN0X2lycShJUlFfQVVUT180LCBtYWNfc2NjX2Rpc3BhdGNoLCBJUlFfRkxHX0xPQ0ssCiAJCQkJInNjYyIsIG1hY19zY2NfZGlzcGF0Y2gpOwogCX0KIAlyZXF1ZXN0X2lycShJUlFfTUFDX05VQlVTLCB2aWFfbnVidXNfaXJxLCBJUlFfRkxHX0xPQ0t8SVJRX0ZMR19GQVNULApAQCAtNDI0LDcgKzQyNCw3IEBACiAJZm9yIChpID0gMCwgaXJxX2JpdCA9IDEgOyBpIDwgNyA7IGkrKywgaXJxX2JpdCA8PD0gMSkKIAkJaWYgKGV2ZW50cyAmIGlycV9iaXQpIHsKIAkJCXZpYTFbdklFUl0gPSBpcnFfYml0OwotCQkJbWFjX2RvX2lycV9saXN0KFZJQTFfU09VUkNFX0JBU0UgKyBpLCByZWdzKTsKKwkJCW02OGtfaGFuZGxlX2ludChWSUExX1NPVVJDRV9CQVNFICsgaSwgcmVncyk7CiAJCQl2aWExW3ZJRlJdID0gaXJxX2JpdDsKIAkJCXZpYTFbdklFUl0gPSBpcnFfYml0IHwgMHg4MDsKIAkJfQpAQCAtNDM5LDcgKzQzOSw3IEBACiAJCS8qIE5vLCBpdCB3b24ndCBiZSBzZXQuIHRoYXQncyB3aHkgd2UncmUgZG9pbmcgdGhpcy4gKi8KIAkJdmlhX2lycV9kaXNhYmxlKElSUV9NQUNfTlVCVVMpOwogCQl2aWFfaXJxX2NsZWFyKElSUV9NQUNfTlVCVVMpOwotCQltYWNfZG9faXJxX2xpc3QoSVJRX01BQ19OVUJVUywgcmVncyk7CisJCW02OGtfaGFuZGxlX2ludChJUlFfTUFDX05VQlVTLCByZWdzKTsKIAkJdmlhX2lycV9lbmFibGUoSVJRX01BQ19OVUJVUyk7CiAJfQogI2VuZGlmCkBAIC00NTksNyArNDU5LDcgQEAKIAkJaWYgKGV2ZW50cyAmIGlycV9iaXQpIHsKIAkJCXZpYTJbZ0lFUl0gPSBpcnFfYml0OwogCQkJdmlhMltnSUZSXSA9IGlycV9iaXQgfCByYnZfY2xlYXI7Ci0JCQltYWNfZG9faXJxX2xpc3QoVklBMl9TT1VSQ0VfQkFTRSArIGksIHJlZ3MpOworCQkJbTY4a19oYW5kbGVfaW50KFZJQTJfU09VUkNFX0JBU0UgKyBpLCByZWdzKTsKIAkJCXZpYTJbZ0lFUl0gPSBpcnFfYml0IHwgMHg4MDsKIAkJfQogCXJldHVybiBJUlFfSEFORExFRDsKQEAgLTQ4MSw3ICs0ODEsNyBAQAogCWZvciAoaSA9IDAsIGlycV9iaXQgPSAxIDsgaSA8IDcgOyBpKyssIGlycV9iaXQgPDw9IDEpIHsKIAkJaWYgKGV2ZW50cyAmIGlycV9iaXQpIHsKIAkJCXZpYV9pcnFfZGlzYWJsZShOVUJVU19TT1VSQ0VfQkFTRSArIGkpOwotCQkJbWFjX2RvX2lycV9saXN0KE5VQlVTX1NPVVJDRV9CQVNFICsgaSwgcmVncyk7CisJCQltNjhrX2hhbmRsZV9pbnQoTlVCVVNfU09VUkNFX0JBU0UgKyBpLCByZWdzKTsKIAkJCXZpYV9pcnFfZW5hYmxlKE5VQlVTX1NPVVJDRV9CQVNFICsgaSk7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9hcmNoL202OGsvbW0va21hcC5jIGIvYXJjaC9tNjhrL21tL2ttYXAuYwppbmRleCA4NWFkMTlhLi40M2ZmYWIwIDEwMDY0NAotLS0gYS9hcmNoL202OGsvbW0va21hcC5jCisrKyBiL2FyY2gvbTY4ay9tbS9rbWFwLmMKQEAgLTI1OSwxMyArMjU5LDE1IEBACiAKIAkJaWYgKENQVV9JU18wMjBfT1JfMDMwKSB7CiAJCQlpbnQgcG1kX29mZiA9ICh2aXJ0YWRkci9QVFJUUkVFU0laRSkgJiAxNTsKKwkJCWludCBwbWRfdHlwZSA9IHBtZF9kaXItPnBtZFtwbWRfb2ZmXSAmIF9ERVNDVFlQRV9NQVNLOwogCi0JCQlpZiAoKHBtZF9kaXItPnBtZFtwbWRfb2ZmXSAmIF9ERVNDVFlQRV9NQVNLKSA9PSBfUEFHRV9QUkVTRU5UKSB7CisJCQlpZiAocG1kX3R5cGUgPT0gX1BBR0VfUFJFU0VOVCkgewogCQkJCXBtZF9kaXItPnBtZFtwbWRfb2ZmXSA9IDA7CiAJCQkJdmlydGFkZHIgKz0gUFRSVFJFRVNJWkU7CiAJCQkJc2l6ZSAtPSBQVFJUUkVFU0laRTsKIAkJCQljb250aW51ZTsKLQkJCX0KKwkJCX0gZWxzZSBpZiAocG1kX3R5cGUgPT0gMCkKKwkJCQljb250aW51ZTsKIAkJfQogCiAJCWlmIChwbWRfYmFkKCpwbWRfZGlyKSkgewpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL21tL21lbW9yeS5jIGIvYXJjaC9tNjhrL21tL21lbW9yeS5jCmluZGV4IGQ2ZDU4MmEuLmEyMjY2NjggMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9tbS9tZW1vcnkuYworKysgYi9hcmNoL202OGsvbW0vbWVtb3J5LmMKQEAgLTk0LDggKzk0LDcgQEAKIAlQRF9NQVJLQklUUyhkcCkgPSBtYXNrICYgfnRtcDsKIAlpZiAoIVBEX01BUktCSVRTKGRwKSkgewogCQkvKiBtb3ZlIHRvIGVuZCBvZiBsaXN0ICovCi0JCWxpc3RfZGVsKGRwKTsKLQkJbGlzdF9hZGRfdGFpbChkcCwgJnB0YWJsZV9saXN0KTsKKwkJbGlzdF9tb3ZlX3RhaWwoZHAsICZwdGFibGVfbGlzdCk7CiAJfQogCXJldHVybiAocG1kX3QgKikgKHBhZ2VfYWRkcmVzcyhQRF9QQUdFKGRwKSkgKyBvZmYpOwogfQpAQCAtMTIzLDggKzEyMiw3IEBACiAJCSAqIG1vdmUgdGhpcyBkZXNjcmlwdG9yIHRvIHRoZSBmcm9udCBvZiB0aGUgbGlzdCwgc2luY2UKIAkJICogaXQgaGFzIG9uZSBvciBtb3JlIGZyZWUgdGFibGVzLgogCQkgKi8KLQkJbGlzdF9kZWwoZHApOwotCQlsaXN0X2FkZChkcCwgJnB0YWJsZV9saXN0KTsKKwkJbGlzdF9tb3ZlKGRwLCAmcHRhYmxlX2xpc3QpOwogCX0KIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9tdm1lMTQ3LzE0N2ludHMuYyBiL2FyY2gvbTY4ay9tdm1lMTQ3LzE0N2ludHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjlhNzQ0ZS4uMDAwMDAwMAotLS0gYS9hcmNoL202OGsvbXZtZTE0Ny8xNDdpbnRzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLyoKLSAqIGFyY2gvbTY4ay9tdm1lMTQ3LzE0N2ludHMuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NyBSaWNoYXJkIEhpcnN0IFtyaWNoYXJkQHNsZWVwaWUuZGVtb24uY28udWtdCi0gKgotICogYmFzZWQgb24gYW1paW50cy5jIC0tIEFtaWdhIExpbnV4IGludGVycnVwdCBoYW5kbGluZyBjb2RlCi0gKgotICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgUkVBRE1FLmxlZ2FsIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKLSAqIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KLQotI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KLSNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci0jaW5jbHVkZSA8YXNtL2lycS5oPgotI2luY2x1ZGUgPGFzbS90cmFwcy5oPgotCi1zdGF0aWMgaXJxcmV0dXJuX3QgbXZtZTE0N19kZWZoYW5kIChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpmcCk7Ci0KLS8qCi0gKiBUaGlzIHNob3VsZCBpZGVhbGx5IGJlIDQgZWxlbWVudHMgb25seSwgZm9yIHNwZWVkLgotICovCi0KLXN0YXRpYyBzdHJ1Y3QgewotCWlycXJldHVybl90CSgqaGFuZGxlcikoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopOwotCXVuc2lnbmVkIGxvbmcJZmxhZ3M7Ci0Jdm9pZAkJKmRldl9pZDsKLQljb25zdCBjaGFyCSpkZXZuYW1lOwotCXVuc2lnbmVkCWNvdW50OwotfSBpcnFfdGFiWzI1Nl07Ci0KLS8qCi0gKiB2b2lkIG12bWUxNDdfaW5pdF9JUlEgKHZvaWQpCi0gKgotICogUGFyYW1ldGVyczoJTm9uZQotICoKLSAqIFJldHVybnM6CU5vdGhpbmcKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBkdXJpbmcga2VybmVsIHN0YXJ0dXAgdG8gaW5pdGlhbGl6ZQotICogdGhlIG12bWUxNDcgSVJRIGhhbmRsaW5nIHJvdXRpbmVzLgotICovCi0KLXZvaWQgbXZtZTE0N19pbml0X0lSUSAodm9pZCkKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgewotCQlpcnFfdGFiW2ldLmhhbmRsZXIgPSBtdm1lMTQ3X2RlZmhhbmQ7Ci0JCWlycV90YWJbaV0uZmxhZ3MgPSBJUlFfRkxHX1NURDsKLQkJaXJxX3RhYltpXS5kZXZfaWQgPSBOVUxMOwotCQlpcnFfdGFiW2ldLmRldm5hbWUgPSBOVUxMOwotCQlpcnFfdGFiW2ldLmNvdW50ID0gMDsKLQl9Ci19Ci0KLWludCBtdm1lMTQ3X3JlcXVlc3RfaXJxKHVuc2lnbmVkIGludCBpcnEsCi0JCWlycXJldHVybl90ICgqaGFuZGxlcikoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopLAotICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldm5hbWUsIHZvaWQgKmRldl9pZCkKLXsKLQlpZiAoaXJxID4gMjU1KSB7Ci0JCXByaW50aygiJXM6IEluY29ycmVjdCBJUlEgJWQgZnJvbSAlc1xuIiwgX19GVU5DVElPTl9fLCBpcnEsIGRldm5hbWUpOwotCQlyZXR1cm4gLUVOWElPOwotCX0KLQlpZiAoIShpcnFfdGFiW2lycV0uZmxhZ3MgJiBJUlFfRkxHX1NURCkpIHsKLQkJaWYgKGlycV90YWJbaXJxXS5mbGFncyAmIElSUV9GTEdfTE9DSykgewotCQkJcHJpbnRrKCIlczogSVJRICVkIGZyb20gJXMgaXMgbm90IHJlcGxhY2VhYmxlXG4iLAotCQkJICAgICAgIF9fRlVOQ1RJT05fXywgaXJxLCBpcnFfdGFiW2lycV0uZGV2bmFtZSk7Ci0JCQlyZXR1cm4gLUVCVVNZOwotCQl9Ci0JCWlmIChmbGFncyAmIElSUV9GTEdfUkVQTEFDRSkgewotCQkJcHJpbnRrKCIlczogJXMgY2FuJ3QgcmVwbGFjZSBJUlEgJWQgZnJvbSAlc1xuIiwKLQkJCSAgICAgICBfX0ZVTkNUSU9OX18sIGRldm5hbWUsIGlycSwgaXJxX3RhYltpcnFdLmRldm5hbWUpOwotCQkJcmV0dXJuIC1FQlVTWTsKLQkJfQotCX0KLQlpcnFfdGFiW2lycV0uaGFuZGxlciA9IGhhbmRsZXI7Ci0JaXJxX3RhYltpcnFdLmZsYWdzICAgPSBmbGFnczsKLQlpcnFfdGFiW2lycV0uZGV2X2lkICA9IGRldl9pZDsKLQlpcnFfdGFiW2lycV0uZGV2bmFtZSA9IGRldm5hbWU7Ci0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgbXZtZTE0N19mcmVlX2lycSh1bnNpZ25lZCBpbnQgaXJxLCB2b2lkICpkZXZfaWQpCi17Ci0JaWYgKGlycSA+IDI1NSkgewotCQlwcmludGsoIiVzOiBJbmNvcnJlY3QgSVJRICVkXG4iLCBfX0ZVTkNUSU9OX18sIGlycSk7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKGlycV90YWJbaXJxXS5kZXZfaWQgIT0gZGV2X2lkKQotCQlwcmludGsoIiVzOiBSZW1vdmluZyBwcm9iYWJseSB3cm9uZyBJUlEgJWQgZnJvbSAlc1xuIiwKLQkJICAgICAgIF9fRlVOQ1RJT05fXywgaXJxLCBpcnFfdGFiW2lycV0uZGV2bmFtZSk7Ci0KLQlpcnFfdGFiW2lycV0uaGFuZGxlciA9IG12bWUxNDdfZGVmaGFuZDsKLQlpcnFfdGFiW2lycV0uZmxhZ3MgICA9IElSUV9GTEdfU1REOwotCWlycV90YWJbaXJxXS5kZXZfaWQgID0gTlVMTDsKLQlpcnFfdGFiW2lycV0uZGV2bmFtZSA9IE5VTEw7Ci19Ci0KLWlycXJldHVybl90IG12bWUxNDdfcHJvY2Vzc19pbnQgKHVuc2lnbmVkIGxvbmcgdmVjLCBzdHJ1Y3QgcHRfcmVncyAqZnApCi17Ci0JaWYgKHZlYyA+IDI1NSkgewotCQlwcmludGsgKCJtdm1lMTQ3X3Byb2Nlc3NfaW50OiBJbGxlZ2FsIHZlY3RvciAlbGRcbiIsIHZlYyk7Ci0JCXJldHVybiBJUlFfTk9ORTsKLQl9IGVsc2UgewotCQlpcnFfdGFiW3ZlY10uY291bnQrKzsKLQkJaXJxX3RhYlt2ZWNdLmhhbmRsZXIodmVjLCBpcnFfdGFiW3ZlY10uZGV2X2lkLCBmcCk7Ci0JCXJldHVybiBJUlFfSEFORExFRDsKLQl9Ci19Ci0KLWludCBzaG93X212bWUxNDdfaW50ZXJydXB0cyAoc3RydWN0IHNlcV9maWxlICpwLCB2b2lkICp2KQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7Ci0JCWlmIChpcnFfdGFiW2ldLmNvdW50KQotCQkJc2VxX3ByaW50ZihwLCAiVmVjIDB4JTAyeDogJThkICAlc1xuIiwKLQkJCSAgICBpLCBpcnFfdGFiW2ldLmNvdW50LAotCQkJICAgIGlycV90YWJbaV0uZGV2bmFtZSA/IGlycV90YWJbaV0uZGV2bmFtZSA6ICJmcmVlIik7Ci0JfQotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpcnFyZXR1cm5fdCBtdm1lMTQ3X2RlZmhhbmQgKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKmZwKQotewotCXByaW50ayAoIlVua25vd24gaW50ZXJydXB0IDB4JTAyeFxuIiwgaXJxKTsKLQlyZXR1cm4gSVJRX05PTkU7Ci19Ci0KLXZvaWQgbXZtZTE0N19lbmFibGVfaXJxICh1bnNpZ25lZCBpbnQgaXJxKQotewotfQotCi0KLXZvaWQgbXZtZTE0N19kaXNhYmxlX2lycSAodW5zaWduZWQgaW50IGlycSkKLXsKLX0KLQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL212bWUxNDcvTWFrZWZpbGUgYi9hcmNoL202OGsvbXZtZTE0Ny9NYWtlZmlsZQppbmRleCBmMDE1M2VkLi5hMzZkMzhkIDEwMDY0NAotLS0gYS9hcmNoL202OGsvbXZtZTE0Ny9NYWtlZmlsZQorKysgYi9hcmNoL202OGsvbXZtZTE0Ny9NYWtlZmlsZQpAQCAtMiw0ICsyLDQgQEAKICMgTWFrZWZpbGUgZm9yIExpbnV4IGFyY2gvbTY4ay9tdm1lMTQ3IHNvdXJjZSBkaXJlY3RvcnkKICMKIAotb2JqLXkJCTo9IGNvbmZpZy5vIDE0N2ludHMubworb2JqLXkJCTo9IGNvbmZpZy5vCmRpZmYgLS1naXQgYS9hcmNoL202OGsvbXZtZTE0Ny9jb25maWcuYyBiL2FyY2gvbTY4ay9tdm1lMTQ3L2NvbmZpZy5jCmluZGV4IDBmY2Y5NzIuLjBjZDBlNWIgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9tdm1lMTQ3L2NvbmZpZy5jCisrKyBiL2FyY2gvbTY4ay9tdm1lMTQ3L2NvbmZpZy5jCkBAIC0zNiwxNSArMzYsOCBAQAogI2luY2x1ZGUgPGFzbS9tdm1lMTQ3aHcuaD4KIAogCi1leHRlcm4gaXJxcmV0dXJuX3QgbXZtZTE0N19wcm9jZXNzX2ludCAoaW50IGxldmVsLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7Ci1leHRlcm4gdm9pZCBtdm1lMTQ3X2luaXRfSVJRICh2b2lkKTsKLWV4dGVybiB2b2lkIG12bWUxNDdfZnJlZV9pcnEgKHVuc2lnbmVkIGludCwgdm9pZCAqKTsKLWV4dGVybiBpbnQgIHNob3dfbXZtZTE0N19pbnRlcnJ1cHRzIChzdHJ1Y3Qgc2VxX2ZpbGUgKiwgdm9pZCAqKTsKLWV4dGVybiB2b2lkIG12bWUxNDdfZW5hYmxlX2lycSAodW5zaWduZWQgaW50KTsKLWV4dGVybiB2b2lkIG12bWUxNDdfZGlzYWJsZV9pcnEgKHVuc2lnbmVkIGludCk7CiBzdGF0aWMgdm9pZCBtdm1lMTQ3X2dldF9tb2RlbChjaGFyICptb2RlbCk7CiBzdGF0aWMgaW50ICBtdm1lMTQ3X2dldF9oYXJkd2FyZV9saXN0KGNoYXIgKmJ1ZmZlcik7Ci1leHRlcm4gaW50IG12bWUxNDdfcmVxdWVzdF9pcnEgKHVuc2lnbmVkIGludCBpcnEsIGlycXJldHVybl90ICgqaGFuZGxlcikoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopLCB1bnNpZ25lZCBsb25nIGZsYWdzLCBjb25zdCBjaGFyICpkZXZuYW1lLCB2b2lkICpkZXZfaWQpOwogZXh0ZXJuIHZvaWQgbXZtZTE0N19zY2hlZF9pbml0KGlycXJldHVybl90ICgqaGFuZGxlcikoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopKTsKIGV4dGVybiB1bnNpZ25lZCBsb25nIG12bWUxNDdfZ2V0dGltZW9mZnNldCAodm9pZCk7CiBleHRlcm4gaW50IG12bWUxNDdfaHdjbGsgKGludCwgc3RydWN0IHJ0Y190aW1lICopOwpAQCAtOTEsNiArODQsMTUgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGR1cmluZyBrZXJuZWwgc3RhcnR1cCB0byBpbml0aWFsaXplCisgKiB0aGUgbXZtZTE0NyBJUlEgaGFuZGxpbmcgcm91dGluZXMuCisgKi8KKwordm9pZCBtdm1lMTQ3X2luaXRfSVJRKHZvaWQpCit7CisJbTY4a19zZXR1cF91c2VyX2ludGVycnVwdChWRUNfVVNFUiwgMTkyLCBOVUxMKTsKK30KIAogdm9pZCBfX2luaXQgY29uZmlnX212bWUxNDcodm9pZCkKIHsKQEAgLTEwMSwxMiArMTAzLDYgQEAKIAltYWNoX2h3Y2xrCQk9IG12bWUxNDdfaHdjbGs7CiAJbWFjaF9zZXRfY2xvY2tfbW1zcwk9IG12bWUxNDdfc2V0X2Nsb2NrX21tc3M7CiAJbWFjaF9yZXNldAkJPSBtdm1lMTQ3X3Jlc2V0OwotCW1hY2hfZnJlZV9pcnEJCT0gbXZtZTE0N19mcmVlX2lycTsKLQltYWNoX3Byb2Nlc3NfaW50CT0gbXZtZTE0N19wcm9jZXNzX2ludDsKLQltYWNoX2dldF9pcnFfbGlzdAk9IHNob3dfbXZtZTE0N19pbnRlcnJ1cHRzOwotCW1hY2hfcmVxdWVzdF9pcnEJPSBtdm1lMTQ3X3JlcXVlc3RfaXJxOwotCWVuYWJsZV9pcnEJCT0gbXZtZTE0N19lbmFibGVfaXJxOwotCWRpc2FibGVfaXJxCQk9IG12bWUxNDdfZGlzYWJsZV9pcnE7CiAJbWFjaF9nZXRfbW9kZWwJCT0gbXZtZTE0N19nZXRfbW9kZWw7CiAJbWFjaF9nZXRfaGFyZHdhcmVfbGlzdAk9IG12bWUxNDdfZ2V0X2hhcmR3YXJlX2xpc3Q7CiAKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9tdm1lMTZ4LzE2eGludHMuYyBiL2FyY2gvbTY4ay9tdm1lMTZ4LzE2eGludHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkzZWY3My4uMDAwMDAwMAotLS0gYS9hcmNoL202OGsvbXZtZTE2eC8xNnhpbnRzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoKLSAqIGFyY2gvbTY4ay9tdm1lMTZ4LzE2eGludHMuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NSBSaWNoYXJkIEhpcnN0IFtyaWNoYXJkQHNsZWVwaWUuZGVtb24uY28udWtdCi0gKgotICogYmFzZWQgb24gYW1paW50cy5jIC0tIEFtaWdhIExpbnV4IGludGVycnVwdCBoYW5kbGluZyBjb2RlCi0gKgotICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgUkVBRE1FLmxlZ2FsIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKLSAqIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KLQotI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxhc20vcHRyYWNlLmg+Ci0jaW5jbHVkZSA8YXNtL2lycS5oPgotCi1zdGF0aWMgaXJxcmV0dXJuX3QgbXZtZTE2eF9kZWZoYW5kIChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpmcCk7Ci0KLS8qCi0gKiBUaGlzIHNob3VsZCBpZGVhbGx5IGJlIDQgZWxlbWVudHMgb25seSwgZm9yIHNwZWVkLgotICovCi0KLXN0YXRpYyBzdHJ1Y3QgewotCWlycXJldHVybl90CSgqaGFuZGxlcikoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopOwotCXVuc2lnbmVkIGxvbmcJZmxhZ3M7Ci0Jdm9pZAkJKmRldl9pZDsKLQljb25zdCBjaGFyCSpkZXZuYW1lOwotCXVuc2lnbmVkCWNvdW50OwotfSBpcnFfdGFiWzE5Ml07Ci0KLS8qCi0gKiB2b2lkIG12bWUxNnhfaW5pdF9JUlEgKHZvaWQpCi0gKgotICogUGFyYW1ldGVyczoJTm9uZQotICoKLSAqIFJldHVybnM6CU5vdGhpbmcKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBkdXJpbmcga2VybmVsIHN0YXJ0dXAgdG8gaW5pdGlhbGl6ZQotICogdGhlIG12bWUxNnggSVJRIGhhbmRsaW5nIHJvdXRpbmVzLiAgU2hvdWxkIHByb2JhYmx5IGVuc3VyZQotICogdGhhdCB0aGUgYmFzZSB2ZWN0b3JzIGZvciB0aGUgVk1FQ2hpcDIgYW5kIFBDQ0NoaXAyIGFyZSB2YWxpZC4KLSAqLwotCi12b2lkIG12bWUxNnhfaW5pdF9JUlEgKHZvaWQpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgMTkyOyBpKyspIHsKLQkJaXJxX3RhYltpXS5oYW5kbGVyID0gbXZtZTE2eF9kZWZoYW5kOwotCQlpcnFfdGFiW2ldLmZsYWdzID0gSVJRX0ZMR19TVEQ7Ci0JCWlycV90YWJbaV0uZGV2X2lkID0gTlVMTDsKLQkJaXJxX3RhYltpXS5kZXZuYW1lID0gTlVMTDsKLQkJaXJxX3RhYltpXS5jb3VudCA9IDA7Ci0JfQotfQotCi1pbnQgbXZtZTE2eF9yZXF1ZXN0X2lycSh1bnNpZ25lZCBpbnQgaXJxLAotCQlpcnFyZXR1cm5fdCAoKmhhbmRsZXIpKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKSwKLSAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzLCBjb25zdCBjaGFyICpkZXZuYW1lLCB2b2lkICpkZXZfaWQpCi17Ci0JaWYgKGlycSA8IDY0IHx8IGlycSA+IDI1NSkgewotCQlwcmludGsoIiVzOiBJbmNvcnJlY3QgSVJRICVkIGZyb20gJXNcbiIsIF9fRlVOQ1RJT05fXywgaXJxLCBkZXZuYW1lKTsKLQkJcmV0dXJuIC1FTlhJTzsKLQl9Ci0KLQlpZiAoIShpcnFfdGFiW2lycS02NF0uZmxhZ3MgJiBJUlFfRkxHX1NURCkpIHsKLQkJaWYgKGlycV90YWJbaXJxLTY0XS5mbGFncyAmIElSUV9GTEdfTE9DSykgewotCQkJcHJpbnRrKCIlczogSVJRICVkIGZyb20gJXMgaXMgbm90IHJlcGxhY2VhYmxlXG4iLAotCQkJICAgICAgIF9fRlVOQ1RJT05fXywgaXJxLCBpcnFfdGFiW2lycS02NF0uZGV2bmFtZSk7Ci0JCQlyZXR1cm4gLUVCVVNZOwotCQl9Ci0JCWlmIChmbGFncyAmIElSUV9GTEdfUkVQTEFDRSkgewotCQkJcHJpbnRrKCIlczogJXMgY2FuJ3QgcmVwbGFjZSBJUlEgJWQgZnJvbSAlc1xuIiwKLQkJCSAgICAgICBfX0ZVTkNUSU9OX18sIGRldm5hbWUsIGlycSwgaXJxX3RhYltpcnEtNjRdLmRldm5hbWUpOwotCQkJcmV0dXJuIC1FQlVTWTsKLQkJfQotCX0KLQlpcnFfdGFiW2lycS02NF0uaGFuZGxlciA9IGhhbmRsZXI7Ci0JaXJxX3RhYltpcnEtNjRdLmZsYWdzICAgPSBmbGFnczsKLQlpcnFfdGFiW2lycS02NF0uZGV2X2lkICA9IGRldl9pZDsKLQlpcnFfdGFiW2lycS02NF0uZGV2bmFtZSA9IGRldm5hbWU7Ci0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgbXZtZTE2eF9mcmVlX2lycSh1bnNpZ25lZCBpbnQgaXJxLCB2b2lkICpkZXZfaWQpCi17Ci0JaWYgKGlycSA8IDY0IHx8IGlycSA+IDI1NSkgewotCQlwcmludGsoIiVzOiBJbmNvcnJlY3QgSVJRICVkXG4iLCBfX0ZVTkNUSU9OX18sIGlycSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoaXJxX3RhYltpcnEtNjRdLmRldl9pZCAhPSBkZXZfaWQpCi0JCXByaW50aygiJXM6IFJlbW92aW5nIHByb2JhYmx5IHdyb25nIElSUSAlZCBmcm9tICVzXG4iLAotCQkgICAgICAgX19GVU5DVElPTl9fLCBpcnEsIGlycV90YWJbaXJxLTY0XS5kZXZuYW1lKTsKLQotCWlycV90YWJbaXJxLTY0XS5oYW5kbGVyID0gbXZtZTE2eF9kZWZoYW5kOwotCWlycV90YWJbaXJxLTY0XS5mbGFncyAgID0gSVJRX0ZMR19TVEQ7Ci0JaXJxX3RhYltpcnEtNjRdLmRldl9pZCAgPSBOVUxMOwotCWlycV90YWJbaXJxLTY0XS5kZXZuYW1lID0gTlVMTDsKLX0KLQotaXJxcmV0dXJuX3QgbXZtZTE2eF9wcm9jZXNzX2ludCAodW5zaWduZWQgbG9uZyB2ZWMsIHN0cnVjdCBwdF9yZWdzICpmcCkKLXsKLQlpZiAodmVjIDwgNjQgfHwgdmVjID4gMjU1KSB7Ci0JCXByaW50ayAoIm12bWUxNnhfcHJvY2Vzc19pbnQ6IElsbGVnYWwgdmVjdG9yICVsZCIsIHZlYyk7Ci0JCXJldHVybiBJUlFfTk9ORTsKLQl9IGVsc2UgewotCQlpcnFfdGFiW3ZlYy02NF0uY291bnQrKzsKLQkJaXJxX3RhYlt2ZWMtNjRdLmhhbmRsZXIodmVjLCBpcnFfdGFiW3ZlYy02NF0uZGV2X2lkLCBmcCk7Ci0JCXJldHVybiBJUlFfSEFORExFRDsKLQl9Ci19Ci0KLWludCBzaG93X212bWUxNnhfaW50ZXJydXB0cyAoc3RydWN0IHNlcV9maWxlICpwLCB2b2lkICp2KQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IDE5MjsgaSsrKSB7Ci0JCWlmIChpcnFfdGFiW2ldLmNvdW50KQotCQkJc2VxX3ByaW50ZihwLCAiVmVjIDB4JTAyeDogJThkICAlc1xuIiwKLQkJCSAgICBpKzY0LCBpcnFfdGFiW2ldLmNvdW50LAotCQkJICAgIGlycV90YWJbaV0uZGV2bmFtZSA/IGlycV90YWJbaV0uZGV2bmFtZSA6ICJmcmVlIik7Ci0JfQotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpcnFyZXR1cm5fdCBtdm1lMTZ4X2RlZmhhbmQgKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKmZwKQotewotCXByaW50ayAoIlVua25vd24gaW50ZXJydXB0IDB4JTAyeFxuIiwgaXJxKTsKLQlyZXR1cm4gSVJRX05PTkU7Ci19Ci0KLQotdm9pZCBtdm1lMTZ4X2VuYWJsZV9pcnEgKHVuc2lnbmVkIGludCBpcnEpCi17Ci19Ci0KLQotdm9pZCBtdm1lMTZ4X2Rpc2FibGVfaXJxICh1bnNpZ25lZCBpbnQgaXJxKQotewotfQotCi0KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9tdm1lMTZ4L01ha2VmaWxlIGIvYXJjaC9tNjhrL212bWUxNngvTWFrZWZpbGUKaW5kZXggNTEyOWY1Ni4uOTUwZTgyZiAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL212bWUxNngvTWFrZWZpbGUKKysrIGIvYXJjaC9tNjhrL212bWUxNngvTWFrZWZpbGUKQEAgLTIsNCArMiw0IEBACiAjIE1ha2VmaWxlIGZvciBMaW51eCBhcmNoL202OGsvbXZtZTE2eCBzb3VyY2UgZGlyZWN0b3J5CiAjCiAKLW9iai15CQk6PSBjb25maWcubyAxNnhpbnRzLm8gcnRjLm8gbXZtZTE2eF9rc3ltcy5vCitvYmoteQkJOj0gY29uZmlnLm8gcnRjLm8gbXZtZTE2eF9rc3ltcy5vCmRpZmYgLS1naXQgYS9hcmNoL202OGsvbXZtZTE2eC9jb25maWcuYyBiL2FyY2gvbTY4ay9tdm1lMTZ4L2NvbmZpZy5jCmluZGV4IDI2Y2U4MWMuLmNlMjcyN2UgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9tdm1lMTZ4L2NvbmZpZy5jCisrKyBiL2FyY2gvbTY4ay9tdm1lMTZ4L2NvbmZpZy5jCkBAIC00MCwxNSArNDAsOCBAQAogCiBzdGF0aWMgTUs0OFQwOHB0cl90IHZvbGF0aWxlIHJ0YyA9IChNSzQ4VDA4cHRyX3QpTVZNRV9SVENfQkFTRTsKIAotZXh0ZXJuIGlycXJldHVybl90IG12bWUxNnhfcHJvY2Vzc19pbnQgKGludCBsZXZlbCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwotZXh0ZXJuIHZvaWQgbXZtZTE2eF9pbml0X0lSUSAodm9pZCk7Ci1leHRlcm4gdm9pZCBtdm1lMTZ4X2ZyZWVfaXJxICh1bnNpZ25lZCBpbnQsIHZvaWQgKik7Ci1leHRlcm4gaW50IHNob3dfbXZtZTE2eF9pbnRlcnJ1cHRzIChzdHJ1Y3Qgc2VxX2ZpbGUgKiwgdm9pZCAqKTsKLWV4dGVybiB2b2lkIG12bWUxNnhfZW5hYmxlX2lycSAodW5zaWduZWQgaW50KTsKLWV4dGVybiB2b2lkIG12bWUxNnhfZGlzYWJsZV9pcnEgKHVuc2lnbmVkIGludCk7CiBzdGF0aWMgdm9pZCBtdm1lMTZ4X2dldF9tb2RlbChjaGFyICptb2RlbCk7CiBzdGF0aWMgaW50ICBtdm1lMTZ4X2dldF9oYXJkd2FyZV9saXN0KGNoYXIgKmJ1ZmZlcik7Ci1leHRlcm4gaW50ICBtdm1lMTZ4X3JlcXVlc3RfaXJxKHVuc2lnbmVkIGludCBpcnEsIGlycXJldHVybl90ICgqaGFuZGxlcikoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopLCB1bnNpZ25lZCBsb25nIGZsYWdzLCBjb25zdCBjaGFyICpkZXZuYW1lLCB2b2lkICpkZXZfaWQpOwogZXh0ZXJuIHZvaWQgbXZtZTE2eF9zY2hlZF9pbml0KGlycXJldHVybl90ICgqaGFuZGxlcikoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopKTsKIGV4dGVybiB1bnNpZ25lZCBsb25nIG12bWUxNnhfZ2V0dGltZW9mZnNldCAodm9pZCk7CiBleHRlcm4gaW50IG12bWUxNnhfaHdjbGsgKGludCwgc3RydWN0IHJ0Y190aW1lICopOwpAQCAtMTIwLDYgKzExMywxNiBAQAogICAgIHJldHVybiAobGVuKTsKIH0KIAorLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGR1cmluZyBrZXJuZWwgc3RhcnR1cCB0byBpbml0aWFsaXplCisgKiB0aGUgbXZtZTE2eCBJUlEgaGFuZGxpbmcgcm91dGluZXMuICBTaG91bGQgcHJvYmFibHkgZW5zdXJlCisgKiB0aGF0IHRoZSBiYXNlIHZlY3RvcnMgZm9yIHRoZSBWTUVDaGlwMiBhbmQgUENDQ2hpcDIgYXJlIHZhbGlkLgorICovCisKK3N0YXRpYyB2b2lkIG12bWUxNnhfaW5pdF9JUlEgKHZvaWQpCit7CisJbTY4a19zZXR1cF91c2VyX2ludGVycnVwdChWRUNfVVNFUiwgMTkyLCBOVUxMKTsKK30KIAogI2RlZmluZSBwY2MyY2hpcAkoKHZvbGF0aWxlIHVfY2hhciAqKTB4ZmZmNDIwMDApCiAjZGVmaW5lIFBjY1NDQ01JQ1IJMHgxZApAQCAtMTM4LDEyICsxNDEsNiBAQAogICAgIG1hY2hfaHdjbGsgICAgICAgICAgID0gbXZtZTE2eF9od2NsazsKICAgICBtYWNoX3NldF9jbG9ja19tbXNzCSA9IG12bWUxNnhfc2V0X2Nsb2NrX21tc3M7CiAgICAgbWFjaF9yZXNldAkJID0gbXZtZTE2eF9yZXNldDsKLSAgICBtYWNoX2ZyZWVfaXJxCSA9IG12bWUxNnhfZnJlZV9pcnE7Ci0gICAgbWFjaF9wcm9jZXNzX2ludAkgPSBtdm1lMTZ4X3Byb2Nlc3NfaW50OwotICAgIG1hY2hfZ2V0X2lycV9saXN0CSA9IHNob3dfbXZtZTE2eF9pbnRlcnJ1cHRzOwotICAgIG1hY2hfcmVxdWVzdF9pcnEJID0gbXZtZTE2eF9yZXF1ZXN0X2lycTsKLSAgICBlbmFibGVfaXJxICAgICAgICAgICA9IG12bWUxNnhfZW5hYmxlX2lycTsKLSAgICBkaXNhYmxlX2lycSAgICAgICAgICA9IG12bWUxNnhfZGlzYWJsZV9pcnE7CiAgICAgbWFjaF9nZXRfbW9kZWwgICAgICAgPSBtdm1lMTZ4X2dldF9tb2RlbDsKICAgICBtYWNoX2dldF9oYXJkd2FyZV9saXN0ID0gbXZtZTE2eF9nZXRfaGFyZHdhcmVfbGlzdDsKIApkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL3E0MC9jb25maWcuYyBiL2FyY2gvbTY4ay9xNDAvY29uZmlnLmMKaW5kZXggNWUwZjliMC4uZWZhNTJkMyAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL3E0MC9jb25maWcuYworKysgYi9hcmNoL202OGsvcTQwL2NvbmZpZy5jCkBAIC0zNywxNSArMzcsOSBAQAogI2luY2x1ZGUgPGFzbS9xNDBfbWFzdGVyLmg+CiAKIGV4dGVybiBpcnFyZXR1cm5fdCBxNDBfcHJvY2Vzc19pbnQgKGludCBsZXZlbCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwotZXh0ZXJuIGlycXJldHVybl90ICgqcTQwX2RlZmF1bHRfaGFuZGxlcltdKSAoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopOyAgLyogYWRkZWQganVzdCBmb3IgZGVidWdnaW5nICovCiBleHRlcm4gdm9pZCBxNDBfaW5pdF9JUlEgKHZvaWQpOwotZXh0ZXJuIHZvaWQgcTQwX2ZyZWVfaXJxICh1bnNpZ25lZCBpbnQsIHZvaWQgKik7Ci1leHRlcm4gaW50ICBzaG93X3E0MF9pbnRlcnJ1cHRzIChzdHJ1Y3Qgc2VxX2ZpbGUgKiwgdm9pZCAqKTsKLWV4dGVybiB2b2lkIHE0MF9lbmFibGVfaXJxICh1bnNpZ25lZCBpbnQpOwotZXh0ZXJuIHZvaWQgcTQwX2Rpc2FibGVfaXJxICh1bnNpZ25lZCBpbnQpOwogc3RhdGljIHZvaWQgcTQwX2dldF9tb2RlbChjaGFyICptb2RlbCk7CiBzdGF0aWMgaW50ICBxNDBfZ2V0X2hhcmR3YXJlX2xpc3QoY2hhciAqYnVmZmVyKTsKLWV4dGVybiBpbnQgIHE0MF9yZXF1ZXN0X2lycSh1bnNpZ25lZCBpbnQgaXJxLCBpcnFyZXR1cm5fdCAoKmhhbmRsZXIpKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKSwgdW5zaWduZWQgbG9uZyBmbGFncywgY29uc3QgY2hhciAqZGV2bmFtZSwgdm9pZCAqZGV2X2lkKTsKIGV4dGVybiB2b2lkIHE0MF9zY2hlZF9pbml0KGlycXJldHVybl90ICgqaGFuZGxlcikoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopKTsKIAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcTQwX2dldHRpbWVvZmZzZXQgKHZvaWQpOwpAQCAtMTc1LDEzICsxNjksNiBAQAogICAgIG1hY2hfc2V0X2Nsb2NrX21tc3MJID0gcTQwX3NldF9jbG9ja19tbXNzOwogCiAgICAgbWFjaF9yZXNldAkJID0gcTQwX3Jlc2V0OwotICAgIG1hY2hfZnJlZV9pcnEJID0gcTQwX2ZyZWVfaXJxOwotICAgIG1hY2hfcHJvY2Vzc19pbnQJID0gcTQwX3Byb2Nlc3NfaW50OwotICAgIG1hY2hfZ2V0X2lycV9saXN0CSA9IHNob3dfcTQwX2ludGVycnVwdHM7Ci0gICAgbWFjaF9yZXF1ZXN0X2lycQkgPSBxNDBfcmVxdWVzdF9pcnE7Ci0gICAgZW5hYmxlX2lycQkJID0gcTQwX2VuYWJsZV9pcnE7Ci0gICAgZGlzYWJsZV9pcnEgICAgICAgICAgPSBxNDBfZGlzYWJsZV9pcnE7Ci0gICAgbWFjaF9kZWZhdWx0X2hhbmRsZXIgPSAmcTQwX2RlZmF1bHRfaGFuZGxlcjsKICAgICBtYWNoX2dldF9tb2RlbCAgICAgICA9IHE0MF9nZXRfbW9kZWw7CiAgICAgbWFjaF9nZXRfaGFyZHdhcmVfbGlzdCA9IHE0MF9nZXRfaGFyZHdhcmVfbGlzdDsKIApkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL3E0MC9xNDBpbnRzLmMgYi9hcmNoL202OGsvcTQwL3E0MGludHMuYwppbmRleCBmOGVjYzI2Li40NzJmNDFjIDEwMDY0NAotLS0gYS9hcmNoL202OGsvcTQwL3E0MGludHMuYworKysgYi9hcmNoL202OGsvcTQwL3E0MGludHMuYwpAQCAtMTQsMTMgKzE0LDggQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2hhcmRpcnEuaD4KIAotI2luY2x1ZGUgPGFzbS9ydGMuaD4KICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KQEAgLTM5LDI5ICszNCwzNyBAQAogICoKICovCiAKLWV4dGVybiBpbnQgaW50c19pbml0ZWQ7CitzdGF0aWMgdm9pZCBxNDBfaXJxX2hhbmRsZXIodW5zaWduZWQgaW50LCBzdHJ1Y3QgcHRfcmVncyAqZnApOworc3RhdGljIHZvaWQgcTQwX2VuYWJsZV9pcnEodW5zaWduZWQgaW50KTsKK3N0YXRpYyB2b2lkIHE0MF9kaXNhYmxlX2lycSh1bnNpZ25lZCBpbnQpOwogCit1bnNpZ25lZCBzaG9ydCBxNDBfYWJsZWNvdW50WzM1XTsKK3Vuc2lnbmVkIHNob3J0IHE0MF9zdGF0ZVszNV07CiAKLWlycXJldHVybl90IHE0MF9pcnEyX2hhbmRsZXIgKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqZnApOworc3RhdGljIGludCBxNDBfaXJxX3N0YXJ0dXAodW5zaWduZWQgaW50IGlycSkKK3sKKwkvKiB0ZXN0IGZvciBJU0EgaW50cyBub3QgaW1wbGVtZW50ZWQgYnkgSFcgKi8KKwlzd2l0Y2ggKGlycSkgeworCWNhc2UgMTogY2FzZSAyOiBjYXNlIDg6IGNhc2UgOToKKwljYXNlIDExOiBjYXNlIDEyOiBjYXNlIDEzOgorCQlwcmludGsoIiVzOiBJU0EgSVJRICVkIG5vdCBpbXBsZW1lbnRlZCBieSBIV1xuIiwgX19GVU5DVElPTl9fLCBpcnEpOworCQlyZXR1cm4gLUVOWElPOworCX0KKwlyZXR1cm4gMDsKK30KIAorc3RhdGljIHZvaWQgcTQwX2lycV9zaHV0ZG93bih1bnNpZ25lZCBpbnQgaXJxKQoreworfQogCi1zdGF0aWMgaXJxcmV0dXJuX3QgcTQwX2RlZmhhbmQgKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKmZwKTsKLXN0YXRpYyBpcnFyZXR1cm5fdCBkZWZhdWx0X2hhbmRsZXIoaW50IGxldiwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7Ci0KLQotI2RlZmluZSBERVZOQU1FX1NJWkUgMjQKLQotc3RhdGljIHN0cnVjdCBxNDBfaXJxX25vZGUgewotCWlycXJldHVybl90CSgqaGFuZGxlcikoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopOwotCXVuc2lnbmVkIGxvbmcJZmxhZ3M7Ci0Jdm9pZAkJKmRldl9pZDsKLSAgLyogICAgICAgIHN0cnVjdCBxNDBfaXJxX25vZGUgKm5leHQ7Ki8KLSAgICAgICAgY2hhcgkgICAgICAgIGRldm5hbWVbREVWTkFNRV9TSVpFXTsKLQl1bnNpZ25lZAljb3VudDsKLSAgICAgICAgdW5zaWduZWQgc2hvcnQgIHN0YXRlOwotfSBpcnFfdGFiW1E0MF9JUlFfTUFYKzFdOwotCi1zaG9ydCB1bnNpZ25lZCBxNDBfYWJsZWNvdW50W1E0MF9JUlFfTUFYKzFdOworc3RhdGljIHN0cnVjdCBpcnFfY29udHJvbGxlciBxNDBfaXJxX2NvbnRyb2xsZXIgPSB7CisJLm5hbWUJCT0gInE0MCIsCisJLmxvY2sJCT0gU1BJTl9MT0NLX1VOTE9DS0VELAorCS5zdGFydHVwCT0gcTQwX2lycV9zdGFydHVwLAorCS5zaHV0ZG93bgk9IHE0MF9pcnFfc2h1dGRvd24sCisJLmVuYWJsZQkJPSBxNDBfZW5hYmxlX2lycSwKKwkuZGlzYWJsZQk9IHE0MF9kaXNhYmxlX2lycSwKK307CiAKIC8qCiAgKiB2b2lkIHE0MF9pbml0X0lSUSAodm9pZCkKQEAgLTc0LDEzOSArNzcsMjkgQEAKICAqIHRoZSBxNDAgSVJRIGhhbmRsaW5nIHJvdXRpbmVzLgogICovCiAKLXN0YXRpYyBpbnQgZGlzYWJsZWQ9MDsKK3N0YXRpYyBpbnQgZGlzYWJsZWQ7CiAKLXZvaWQgcTQwX2luaXRfSVJRICh2b2lkKQordm9pZCBxNDBfaW5pdF9JUlEodm9pZCkKIHsKLQlpbnQgaTsKLQotCWRpc2FibGVkPTA7Ci0JZm9yIChpID0gMDsgaSA8PSBRNDBfSVJRX01BWDsgaSsrKSB7Ci0JCWlycV90YWJbaV0uaGFuZGxlciA9IHE0MF9kZWZoYW5kOwotCQlpcnFfdGFiW2ldLmZsYWdzID0gMDsKLQkJaXJxX3RhYltpXS5kZXZfaWQgPSBOVUxMOwotCQkvKgkJaXJxX3RhYltpXS5uZXh0ID0gTlVMTDsqLwotCQlpcnFfdGFiW2ldLmRldm5hbWVbMF0gPSAwOwotCQlpcnFfdGFiW2ldLmNvdW50ID0gMDsKLQkJaXJxX3RhYltpXS5zdGF0ZSA9MDsKLQkJcTQwX2FibGVjb3VudFtpXT0wOyAgIC8qIGFsbCBlbmFibGVkICovCi0JfQorCW02OGtfc2V0dXBfaXJxX2NvbnRyb2xsZXIoJnE0MF9pcnFfY29udHJvbGxlciwgMSwgUTQwX0lSUV9NQVgpOwogCiAJLyogc2V0dXAgaGFuZGxlciBmb3IgSVNBIGludHMgKi8KLQljcHVfcmVxdWVzdF9pcnEoSVJRMiwgcTQwX2lycTJfaGFuZGxlciwgMCwgInE0MCBJU0EgYW5kIG1hc3RlciBjaGlwIiwKLQkJCU5VTEwpOworCW02OGtfc2V0dXBfYXV0b19pbnRlcnJ1cHQocTQwX2lycV9oYW5kbGVyKTsKKworCW02OGtfaXJxX3N0YXJ0dXAoSVJRX0FVVE9fMik7CisJbTY4a19pcnFfc3RhcnR1cChJUlFfQVVUT180KTsKIAogCS8qIG5vdyBlbmFibGUgc29tZSBpbnRzLi4gKi8KLQltYXN0ZXJfb3V0YigxLEVYVF9FTkFCTEVfUkVHKTsgIC8qIElTQSBJUlEgNS0xNSAqLworCW1hc3Rlcl9vdXRiKDEsIEVYVF9FTkFCTEVfUkVHKTsgIC8qIElTQSBJUlEgNS0xNSAqLwogCiAJLyogbWFrZSBzdXJlIGtleWJvYXJkIElSUSBpcyBkaXNhYmxlZCAqLwotCW1hc3Rlcl9vdXRiKDAsS0VZX0lSUV9FTkFCTEVfUkVHKTsKKwltYXN0ZXJfb3V0YigwLCBLRVlfSVJRX0VOQUJMRV9SRUcpOwogfQogCi1pbnQgcTQwX3JlcXVlc3RfaXJxKHVuc2lnbmVkIGludCBpcnEsCi0JCWlycXJldHVybl90ICgqaGFuZGxlcikoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopLAotICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldm5hbWUsIHZvaWQgKmRldl9pZCkKLXsKLSAgLypwcmludGsoInE0MF9yZXF1ZXN0X2lycSAlZCwgJXNcbiIsaXJxLGRldm5hbWUpOyovCi0KLQlpZiAoaXJxID4gUTQwX0lSUV9NQVggfHwgKGlycT4xNSAmJiBpcnE8MzIpKSB7Ci0JCXByaW50aygiJXM6IEluY29ycmVjdCBJUlEgJWQgZnJvbSAlc1xuIiwgX19GVU5DVElPTl9fLCBpcnEsIGRldm5hbWUpOwotCQlyZXR1cm4gLUVOWElPOwotCX0KLQotCS8qIHRlc3QgZm9yIElTQSBpbnRzIG5vdCBpbXBsZW1lbnRlZCBieSBIVyAqLwotCXN3aXRjaCAoaXJxKQotCSAgewotCSAgY2FzZSAxOiBjYXNlIDI6IGNhc2UgODogY2FzZSA5OgotCSAgY2FzZSAxMjogY2FzZSAxMzoKLQkgICAgcHJpbnRrKCIlczogSVNBIElSUSAlZCBmcm9tICVzIG5vdCBpbXBsZW1lbnRlZCBieSBIV1xuIiwgX19GVU5DVElPTl9fLCBpcnEsIGRldm5hbWUpOwotCSAgICByZXR1cm4gLUVOWElPOwotCSAgY2FzZSAxMToKLQkgICAgcHJpbnRrKCJ3YXJuaW5nIElSUSAxMCBhbmQgMTEgbm90IGRpc3Rpbmd1aXNoYWJsZVxuIik7Ci0JICAgIGlycT0xMDsKLQkgIGRlZmF1bHQ6Ci0JICAgIDsKLQkgIH0KLQotCWlmIChpcnE8UTQwX0lSUV9TQU1QTEUpCi0JICB7Ci0JICAgIGlmIChpcnFfdGFiW2lycV0uZGV2X2lkICE9IE5VTEwpCi0JCSAgewotCQkgICAgcHJpbnRrKCIlczogSVJRICVkIGZyb20gJXMgaXMgbm90IHJlcGxhY2VhYmxlXG4iLAotCQkJICAgX19GVU5DVElPTl9fLCBpcnEsIGlycV90YWJbaXJxXS5kZXZuYW1lKTsKLQkJICAgIHJldHVybiAtRUJVU1k7Ci0JCSAgfQotCSAgICAvKnByaW50aygiSVJRICVkIHNldCB0byBoYW5kbGVyICVwXG4iLGlycSxoYW5kbGVyKTsqLwotCSAgICBpZiAoZGV2X2lkPT1OVUxMKQotCQkgIHsKLQkJcHJpbnRrKCJXQVJOSU5HOiBkZXZfaWQgPT0gTlVMTCBpbiByZXF1ZXN0X2lycVxuIik7Ci0JCWRldl9pZD0odm9pZCopMTsKLQkgICAgICB9Ci0JICAgIGlycV90YWJbaXJxXS5oYW5kbGVyID0gaGFuZGxlcjsKLQkgICAgaXJxX3RhYltpcnFdLmZsYWdzICAgPSBmbGFnczsKLQkgICAgaXJxX3RhYltpcnFdLmRldl9pZCAgPSBkZXZfaWQ7Ci0JICAgIHN0cmxjcHkoaXJxX3RhYltpcnFdLmRldm5hbWUsZGV2bmFtZSxzaXplb2YoaXJxX3RhYltpcnFdLmRldm5hbWUpKTsKLQkgICAgaXJxX3RhYltpcnFdLnN0YXRlID0gMDsKLQkgICAgcmV0dXJuIDA7Ci0JICB9Ci0JZWxzZSB7Ci0JICAvKiBRNDBfSVJRX1NBTVBMRSA6c29tZXdoYXQgc3BlY2lhbCBhY3Rpb25zIHJlcXVpcmVkIGhlcmUgLi4qLwotCSAgY3B1X3JlcXVlc3RfaXJxKDQsIGhhbmRsZXIsIGZsYWdzLCBkZXZuYW1lLCBkZXZfaWQpOwotCSAgY3B1X3JlcXVlc3RfaXJxKDYsIGhhbmRsZXIsIGZsYWdzLCBkZXZuYW1lLCBkZXZfaWQpOwotCSAgcmV0dXJuIDA7Ci0JfQotfQotCi12b2lkIHE0MF9mcmVlX2lycSh1bnNpZ25lZCBpbnQgaXJxLCB2b2lkICpkZXZfaWQpCi17Ci0JaWYgKGlycSA+IFE0MF9JUlFfTUFYIHx8IChpcnE+MTUgJiYgaXJxPDMyKSkgewotCQlwcmludGsoIiVzOiBJbmNvcnJlY3QgSVJRICVkLCBkZXZfaWQgJXggXG4iLCBfX0ZVTkNUSU9OX18sIGlycSwgKHVuc2lnbmVkKWRldl9pZCk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiB0ZXN0IGZvciBJU0EgaW50cyBub3QgaW1wbGVtZW50ZWQgYnkgSFcgKi8KLQlzd2l0Y2ggKGlycSkKLQkgIHsKLQkgIGNhc2UgMTogY2FzZSAyOiBjYXNlIDg6IGNhc2UgOToKLQkgIGNhc2UgMTI6IGNhc2UgMTM6Ci0JICAgIHByaW50aygiJXM6IElTQSBJUlEgJWQgZnJvbSAleCBpbnZhbGlkXG4iLCBfX0ZVTkNUSU9OX18sIGlycSwgKHVuc2lnbmVkKWRldl9pZCk7Ci0JICAgIHJldHVybjsKLQkgIGNhc2UgMTE6IGlycT0xMDsKLQkgIGRlZmF1bHQ6Ci0JICAgIDsKLQkgIH0KLQotCWlmIChpcnE8UTQwX0lSUV9TQU1QTEUpCi0JICB7Ci0JICAgIGlmIChpcnFfdGFiW2lycV0uZGV2X2lkICE9IGRldl9pZCkKLQkgICAgICBwcmludGsoIiVzOiBSZW1vdmluZyBwcm9iYWJseSB3cm9uZyBJUlEgJWQgZnJvbSAlc1xuIiwKLQkJICAgICBfX0ZVTkNUSU9OX18sIGlycSwgaXJxX3RhYltpcnFdLmRldm5hbWUpOwotCi0JICAgIGlycV90YWJbaXJxXS5oYW5kbGVyID0gcTQwX2RlZmhhbmQ7Ci0JICAgIGlycV90YWJbaXJxXS5mbGFncyAgID0gMDsKLQkgICAgaXJxX3RhYltpcnFdLmRldl9pZCAgPSBOVUxMOwotCSAgICAvKiBpcnFfdGFiW2lycV0uZGV2bmFtZSA9IE5VTEw7ICovCi0JICAgIC8qIGRvIG5vdCByZXNldCBzdGF0ZSAhISAqLwotCSAgfQotCWVsc2UKLQkgIHsgLyogPT0gUTQwX0lSUV9TQU1QTEUgKi8KLQkgICAgY3B1X2ZyZWVfaXJxKDQsIGRldl9pZCk7Ci0JICAgIGNwdV9mcmVlX2lycSg2LCBkZXZfaWQpOwotCSAgfQotfQotCi0KLWlycXJldHVybl90IHE0MF9wcm9jZXNzX2ludCAoaW50IGxldmVsLCBzdHJ1Y3QgcHRfcmVncyAqZnApCi17Ci0gIHByaW50aygidW5leHBlY3RlZCBpbnRlcnJ1cHQgdmVjPSV4LCBwYz0lbHgsIGQwPSVseCwgZDBfb3JpZz0lbHgsIGQxPSVseCwgZDI9JWx4XG4iLAotICAgICAgICAgIGxldmVsLCBmcC0+cGMsIGZwLT5kMCwgZnAtPm9yaWdfZDAsIGZwLT5kMSwgZnAtPmQyKTsKLSAgcHJpbnRrKCJcdElJUlFfUkVHID0gJXgsIEVJUlFfUkVHID0gJXhcbiIsbWFzdGVyX2luYihJSVJRX1JFRyksbWFzdGVyX2luYihFSVJRX1JFRykpOwotICByZXR1cm4gSVJRX0hBTkRMRUQ7Ci19CiAKIC8qCiAgKiB0aGlzIHN0dWZmIGRvZXNuJ3QgcmVhbGx5IGJlbG9uZyBoZXJlLi4KLSovCisgKi8KIAogaW50IHFsX3RpY2tzOyAgICAgICAgICAgICAgLyogMjAwSHogdGlja3Mgc2luY2UgbGFzdCBqaWZmaWUgKi8KIHN0YXRpYyBpbnQgc291bmRfdGlja3M7CkBAIC0yMTUsNTQgKzEwOCw1MyBAQAogCiB2b2lkIHE0MF9ta3NvdW5kKHVuc2lnbmVkIGludCBoeiwgdW5zaWduZWQgaW50IHRpY2tzKQogewotICAvKiBmb3Igbm93IGlnbm9yZSBoeiwgZXhjZXB0IHRoYXQgaHo9PTAgc3dpdGNoZXMgb2ZmIHNvdW5kICovCi0gIC8qIHNpbXBseSBhbHRlcm5hdGUgdGhlIGFtcGwgKDEyOC1TVk9MKS0oMTI4K1NWT0wpLS4uLS4uIGF0IDIwMEh6ICovCi0gIGlmIChoej09MCkKLSAgICB7Ci0gICAgICBpZiAoc291bmRfdGlja3MpCi0Jc291bmRfdGlja3M9MTsKKwkvKiBmb3Igbm93IGlnbm9yZSBoeiwgZXhjZXB0IHRoYXQgaHo9PTAgc3dpdGNoZXMgb2ZmIHNvdW5kICovCisJLyogc2ltcGx5IGFsdGVybmF0ZSB0aGUgYW1wbCAoMTI4LVNWT0wpLSgxMjgrU1ZPTCktLi4tLi4gYXQgMjAwSHogKi8KKwlpZiAoaHogPT0gMCkgeworCQlpZiAoc291bmRfdGlja3MpCisJCQlzb3VuZF90aWNrcyA9IDE7CiAKLSAgICAgICpEQUNfTEVGVD0xMjg7Ci0gICAgICAqREFDX1JJR0hUPTEyODsKKwkJKkRBQ19MRUZUID0gMTI4OworCQkqREFDX1JJR0hUID0gMTI4OwogCi0gICAgICByZXR1cm47Ci0gICAgfQotICAvKiBzb3VuZCBpdHNlbGYgaXMgZG9uZSBpbiBxNDBfdGltZXJfaW50ICovCi0gIGlmIChzb3VuZF90aWNrcyA9PSAwKSBzb3VuZF90aWNrcz0xMDAwOyAvKiBwcmV0dHkgbG9uZyBiZWVwICovCi0gIHNvdW5kX3RpY2tzPXRpY2tzPDwxOworCQlyZXR1cm47CisJfQorCS8qIHNvdW5kIGl0c2VsZiBpcyBkb25lIGluIHE0MF90aW1lcl9pbnQgKi8KKwlpZiAoc291bmRfdGlja3MgPT0gMCkKKwkJc291bmRfdGlja3MgPSAxMDAwOyAvKiBwcmV0dHkgbG9uZyBiZWVwICovCisJc291bmRfdGlja3MgPSB0aWNrcyA8PCAxOwogfQogCiBzdGF0aWMgaXJxcmV0dXJuX3QgKCpxNDBfdGltZXJfcm91dGluZSkoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopOwogCiBzdGF0aWMgaXJxcmV0dXJuX3QgcTQwX3RpbWVyX2ludCAoaW50IGlycSwgdm9pZCAqIGRldiwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKQogewotICAgIHFsX3RpY2tzID0gcWxfdGlja3MgPyAwIDogMTsKLSAgICBpZiAoc291bmRfdGlja3MpCi0gICAgICB7Ci0JdW5zaWduZWQgY2hhciBzdmFsPShzb3VuZF90aWNrcyAmIDEpID8gMTI4LVNWT0wgOiAxMjgrU1ZPTDsKLQlzb3VuZF90aWNrcy0tOwotCSpEQUNfTEVGVD1zdmFsOwotCSpEQUNfUklHSFQ9c3ZhbDsKLSAgICAgIH0KKwlxbF90aWNrcyA9IHFsX3RpY2tzID8gMCA6IDE7CisJaWYgKHNvdW5kX3RpY2tzKSB7CisJCXVuc2lnbmVkIGNoYXIgc3ZhbD0oc291bmRfdGlja3MgJiAxKSA/IDEyOC1TVk9MIDogMTI4K1NWT0w7CisJCXNvdW5kX3RpY2tzLS07CisJCSpEQUNfTEVGVD1zdmFsOworCQkqREFDX1JJR0hUPXN2YWw7CisJfQogCi0gICAgaWYgKCFxbF90aWNrcykKLQlxNDBfdGltZXJfcm91dGluZShpcnEsIGRldiwgcmVncyk7Ci0gICAgcmV0dXJuIElSUV9IQU5ETEVEOworCWlmICghcWxfdGlja3MpCisJCXE0MF90aW1lcl9yb3V0aW5lKGlycSwgZGV2LCByZWdzKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKIHZvaWQgcTQwX3NjaGVkX2luaXQgKGlycXJldHVybl90ICgqdGltZXJfcm91dGluZSkoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopKQogewotICAgIGludCB0aW1lcl9pcnE7CisJaW50IHRpbWVyX2lycTsKIAotICAgIHE0MF90aW1lcl9yb3V0aW5lID0gdGltZXJfcm91dGluZTsKLSAgICB0aW1lcl9pcnE9UTQwX0lSUV9GUkFNRTsKKwlxNDBfdGltZXJfcm91dGluZSA9IHRpbWVyX3JvdXRpbmU7CisJdGltZXJfaXJxID0gUTQwX0lSUV9GUkFNRTsKIAotICAgIGlmIChyZXF1ZXN0X2lycSh0aW1lcl9pcnEsIHE0MF90aW1lcl9pbnQsIDAsCisJaWYgKHJlcXVlc3RfaXJxKHRpbWVyX2lycSwgcTQwX3RpbWVyX2ludCwgMCwKIAkJCQkidGltZXIiLCBxNDBfdGltZXJfaW50KSkKLQlwYW5pYyAoIkNvdWxkbid0IHJlZ2lzdGVyIHRpbWVyIGludCIpOworCQlwYW5pYygiQ291bGRuJ3QgcmVnaXN0ZXIgdGltZXIgaW50Iik7CiAKLSAgICBtYXN0ZXJfb3V0YigtMSxGUkFNRV9DTEVBUl9SRUcpOwotICAgIG1hc3Rlcl9vdXRiKCAxLEZSQU1FX1JBVEVfUkVHKTsKKwltYXN0ZXJfb3V0YigtMSwgRlJBTUVfQ0xFQVJfUkVHKTsKKwltYXN0ZXJfb3V0YiggMSwgRlJBTUVfUkFURV9SRUcpOwogfQogCiAKQEAgLTMwOCwxNjkgKzIwMCwxMzIgQEAKIHN0YXRpYyBpbnQgYWxpYXNlZF9pcnE9MDsgIC8qIGhvdyBtYW55IHRpbWVzIGluc2lkZSBoYW5kbGVyID8qLwogCiAKLS8qIGdvdCBsZXZlbCAyIGludGVycnVwdCwgZGlzcGF0Y2ggdG8gSVNBIG9yIGtleWJvYXJkL3RpbWVyIElSUXMgKi8KLWlycXJldHVybl90IHE0MF9pcnEyX2hhbmRsZXIgKGludCB2ZWMsIHZvaWQgKmRldm5hbWUsIHN0cnVjdCBwdF9yZWdzICpmcCkKKy8qIGdvdCBpbnRlcnJ1cHQsIGRpc3BhdGNoIHRvIElTQSBvciBrZXlib2FyZC90aW1lciBJUlFzICovCitzdGF0aWMgdm9pZCBxNDBfaXJxX2hhbmRsZXIodW5zaWduZWQgaW50IGlycSwgc3RydWN0IHB0X3JlZ3MgKmZwKQogewotICB1bnNpZ25lZCBtaXIsIG1lcjsKLSAgaW50IGlycSxpOworCXVuc2lnbmVkIG1pciwgbWVyOworCWludCBpOwogCiAvL3JlcGVhdDoKLSAgbWlyPW1hc3Rlcl9pbmIoSUlSUV9SRUcpOwotICBpZiAobWlyJlE0MF9JUlFfRlJBTUVfTUFTSykgewotCSAgaXJxX3RhYltRNDBfSVJRX0ZSQU1FXS5jb3VudCsrOwotCSAgaXJxX3RhYltRNDBfSVJRX0ZSQU1FXS5oYW5kbGVyKFE0MF9JUlFfRlJBTUUsaXJxX3RhYltRNDBfSVJRX0ZSQU1FXS5kZXZfaWQsZnApOwotCSAgbWFzdGVyX291dGIoLTEsRlJBTUVfQ0xFQVJfUkVHKTsKLSAgfQotICBpZiAoKG1pciZRNDBfSVJRX1NFUl9NQVNLKSB8fCAobWlyJlE0MF9JUlFfRVhUX01BU0spKSB7Ci0JICBtZXI9bWFzdGVyX2luYihFSVJRX1JFRyk7Ci0JICBmb3IgKGk9MDsgZWlycXNbaV0ubWFzazsgaSsrKSB7Ci0JCSAgaWYgKG1lciYoZWlycXNbaV0ubWFzaykpIHsKLQkJCSAgaXJxPWVpcnFzW2ldLmlycTsKKwltaXIgPSBtYXN0ZXJfaW5iKElJUlFfUkVHKTsKKyNpZmRlZiBDT05GSUdfQkxLX0RFVl9GRAorCWlmICgobWlyICYgUTQwX0lSUV9FWFRfTUFTSykgJiYKKwkgICAgKG1hc3Rlcl9pbmIoRUlSUV9SRUcpICYgUTQwX0lSUTZfTUFTSykpIHsKKwkJZmxvcHB5X2hhcmRpbnQoKTsKKwkJcmV0dXJuOworCX0KKyNlbmRpZgorCXN3aXRjaCAoaXJxKSB7CisJY2FzZSA0OgorCWNhc2UgNjoKKwkJbTY4a19oYW5kbGVfaW50KFE0MF9JUlFfU0FNUExFLCBmcCk7CisJCXJldHVybjsKKwl9CisJaWYgKG1pciAmIFE0MF9JUlFfRlJBTUVfTUFTSykgeworCQltNjhrX2hhbmRsZV9pbnQoUTQwX0lSUV9GUkFNRSwgZnApOworCQltYXN0ZXJfb3V0YigtMSwgRlJBTUVfQ0xFQVJfUkVHKTsKKwl9CisJaWYgKChtaXIgJiBRNDBfSVJRX1NFUl9NQVNLKSB8fCAobWlyICYgUTQwX0lSUV9FWFRfTUFTSykpIHsKKwkJbWVyID0gbWFzdGVyX2luYihFSVJRX1JFRyk7CisJCWZvciAoaSA9IDA7IGVpcnFzW2ldLm1hc2s7IGkrKykgeworCQkJaWYgKG1lciAmIGVpcnFzW2ldLm1hc2spIHsKKwkJCQlpcnEgPSBlaXJxc1tpXS5pcnE7CiAvKgogICogVGhlcmUgaXMgYSBsaXR0bGUgbWVzcyB3cnQgd2hpY2ggSVJRIHJlYWxseSBjYXVzZWQgdGhpcyBpcnEgcmVxdWVzdC4gVGhlCiAgKiBtYWluIHByb2JsZW0gaXMgdGhhdCBJSVJRX1JFRyBhbmQgRUlSUV9SRUcgcmVmbGVjdCB0aGUgc3RhdGUgd2hlbiB0aGV5CiAgKiBhcmUgcmVhZCAtIHdoaWNoIGlzIGxvbmcgYWZ0ZXIgdGhlIHJlcXVlc3QgY2FtZSBpbi4gSW4gdGhlb3J5IElSUXMgc2hvdWxkCiAgKiBub3QganVzdCBnbyBhd2F5IGJ1dCB0aGV5IG9jY2Fzc2lvbmFsbHkgZG8KICAqLwotCQkJICBpZiAoaXJxPjQgJiYgaXJxPD0xNSAmJiBtZXh0X2Rpc2FibGVkKSB7Ci0JCQkJICAvKmFsaWFzZWRfaXJxKys7Ki8KLQkJCQkgIGdvdG8gaWlycTsKLQkJCSAgfQotCQkJICBpZiAoaXJxX3RhYltpcnFdLmhhbmRsZXIgPT0gcTQwX2RlZmhhbmQgKSB7Ci0JCQkJICBwcmludGsoImhhbmRsZXIgZm9yIElSUSAlZCBub3QgZGVmaW5lZFxuIixpcnEpOwotCQkJCSAgY29udGludWU7IC8qIGlnbm9yZSB1bmluaXRlZCBJTlRzIDotKCAqLwotCQkJICB9Ci0JCQkgIGlmICggaXJxX3RhYltpcnFdLnN0YXRlICYgSVJRX0lOUFJPR1JFU1MgKSB7Ci0JCQkJICAvKiBzb21lIGhhbmRsZXJzIGRvIGxvY2FsX2lycV9lbmFibGUoKSBmb3IgaXJxIGxhdGVuY3kgcmVhc29ucywgKi8KLQkJCQkgIC8qIGhvd2V2ZXIgcmVlbnRlcmluZyBhbiBhY3RpdmUgaXJxIGhhbmRsZXIgaXMgbm90IHBlcm1pdHRlZCAqLworCQkJCWlmIChpcnEgPiA0ICYmIGlycSA8PSAxNSAmJiBtZXh0X2Rpc2FibGVkKSB7CisJCQkJCS8qYWxpYXNlZF9pcnErKzsqLworCQkJCQlnb3RvIGlpcnE7CisJCQkJfQorCQkJCWlmIChxNDBfc3RhdGVbaXJxXSAmIElSUV9JTlBST0dSRVNTKSB7CisJCQkJCS8qIHNvbWUgaGFuZGxlcnMgZG8gbG9jYWxfaXJxX2VuYWJsZSgpIGZvciBpcnEgbGF0ZW5jeSByZWFzb25zLCAqLworCQkJCQkvKiBob3dldmVyIHJlZW50ZXJpbmcgYW4gYWN0aXZlIGlycSBoYW5kbGVyIGlzIG5vdCBwZXJtaXR0ZWQgKi8KICNpZmRlZiBJUF9VU0VfRElTQUJMRQotCQkJCSAgLyogaW4gdGhlb3J5IHRoaXMgaXMgdGhlIGJldHRlciB3YXkgdG8gZG8gaXQgYmVjYXVzZSBpdCBzdGlsbCAqLwotCQkJCSAgLyogbGV0cyB0aHJvdWdoIGVnIHRoZSBzZXJpYWwgaXJxcywgdW5mb3J0dW5hdGVseSBpdCBjcmFzaGVzICovCi0JCQkJICBkaXNhYmxlX2lycShpcnEpOwotCQkJCSAgZGlzYWJsZWQ9MTsKKwkJCQkJLyogaW4gdGhlb3J5IHRoaXMgaXMgdGhlIGJldHRlciB3YXkgdG8gZG8gaXQgYmVjYXVzZSBpdCBzdGlsbCAqLworCQkJCQkvKiBsZXRzIHRocm91Z2ggZWcgdGhlIHNlcmlhbCBpcnFzLCB1bmZvcnR1bmF0ZWx5IGl0IGNyYXNoZXMgKi8KKwkJCQkJZGlzYWJsZV9pcnEoaXJxKTsKKwkJCQkJZGlzYWJsZWQgPSAxOwogI2Vsc2UKLQkJCQkgIC8qcHJpbnRrKCJJUlFfSU5QUk9HUkVTUyBkZXRlY3RlZCBmb3IgaXJxICVkLCBkaXNhYmxpbmcgLSAlcyBkaXNhYmxlZFxuIixpcnEsZGlzYWJsZWQgPyAiYWxyZWFkeSIgOiAibm90IHlldCIpOyAqLwotCQkJCSAgZnAtPnNyID0gKCgoZnAtPnNyKSAmICh+MHg3MDApKSsweDIwMCk7Ci0JCQkJICBkaXNhYmxlZD0xOworCQkJCQkvKnByaW50aygiSVJRX0lOUFJPR1JFU1MgZGV0ZWN0ZWQgZm9yIGlycSAlZCwgZGlzYWJsaW5nIC0gJXMgZGlzYWJsZWRcbiIsCisJCQkJCQlpcnEsIGRpc2FibGVkID8gImFscmVhZHkiIDogIm5vdCB5ZXQiKTsgKi8KKwkJCQkJZnAtPnNyID0gKCgoZnAtPnNyKSAmICh+MHg3MDApKSsweDIwMCk7CisJCQkJCWRpc2FibGVkID0gMTsKICNlbmRpZgotCQkJCSAgZ290byBpaXJxOwotCQkJICB9Ci0JCQkgIGlycV90YWJbaXJxXS5jb3VudCsrOwotCQkJICBpcnFfdGFiW2lycV0uc3RhdGUgfD0gSVJRX0lOUFJPR1JFU1M7Ci0JCQkgIGlycV90YWJbaXJxXS5oYW5kbGVyKGlycSxpcnFfdGFiW2lycV0uZGV2X2lkLGZwKTsKLQkJCSAgaXJxX3RhYltpcnFdLnN0YXRlICY9IH5JUlFfSU5QUk9HUkVTUzsKKwkJCQkJZ290byBpaXJxOworCQkJCX0KKwkJCQlxNDBfc3RhdGVbaXJxXSB8PSBJUlFfSU5QUk9HUkVTUzsKKwkJCQltNjhrX2hhbmRsZV9pbnQoaXJxLCBmcCk7CisJCQkJcTQwX3N0YXRlW2lycV0gJj0gfklSUV9JTlBST0dSRVNTOwogCi0JCQkgIC8qIG5haXZlbHkgZW5hYmxlIGV2ZXJ5dGhpbmcsIGlmIHRoYXQgZmFpbHMgdGhhbiAgICAqLwotCQkJICAvKiB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgcmVlbnRlcmVkIGltbWVkaWF0ZWx5IHRodXMgKi8KLQkJCSAgLyogZ2V0dGluZyBhbm90aGVyIGNoYW5jZSB0byBkaXNhYmxlIHRoZSBJUlEgICAgICAgICovCisJCQkJLyogbmFpdmVseSBlbmFibGUgZXZlcnl0aGluZywgaWYgdGhhdCBmYWlscyB0aGFuICAgICovCisJCQkJLyogdGhpcyBmdW5jdGlvbiB3aWxsIGJlIHJlZW50ZXJlZCBpbW1lZGlhdGVseSB0aHVzICovCisJCQkJLyogZ2V0dGluZyBhbm90aGVyIGNoYW5jZSB0byBkaXNhYmxlIHRoZSBJUlEgICAgICAgICovCiAKLQkJCSAgaWYgKCBkaXNhYmxlZCApIHsKKwkJCQlpZiAoZGlzYWJsZWQpIHsKICNpZmRlZiBJUF9VU0VfRElTQUJMRQotCQkJCSAgaWYgKGlycT40KXsKLQkJCQkJICBkaXNhYmxlZD0wOwotCQkJCQkgIGVuYWJsZV9pcnEoaXJxKTt9CisJCQkJCWlmIChpcnEgPiA0KSB7CisJCQkJCQlkaXNhYmxlZCA9IDA7CisJCQkJCQllbmFibGVfaXJxKGlycSk7CisJCQkJCX0KICNlbHNlCi0JCQkJICBkaXNhYmxlZD0wOwotCQkJCSAgLypwcmludGsoInJlZW5hYmxpbmcgaXJxICVkXG4iLGlycSk7ICovCisJCQkJCWRpc2FibGVkID0gMDsKKwkJCQkJLypwcmludGsoInJlZW5hYmxpbmcgaXJxICVkXG4iLCBpcnEpOyAqLwogI2VuZGlmCi0JCQkgIH0KKwkJCQl9CiAvLyB1c2VkIHRvIGRvICdnb3RvIHJlcGVhdDsnIGhlcmUsIHRoaXMgZGVsYXllZCBiaCBwcm9jZXNzaW5nIHRvbyBsb25nCi0JCQkgIHJldHVybiBJUlFfSEFORExFRDsKLQkJICB9Ci0JICB9Ci0JICBpZiAobWVyICYmIGNjbGVpcnE+MCAmJiAhYWxpYXNlZF9pcnEpCi0JCSAgcHJpbnRrKCJJU0EgaW50ZXJydXB0IGZyb20gdW5rbm93biBzb3VyY2U/IEVJUlFfUkVHID0gJXhcbiIsbWVyKSxjY2xlaXJxLS07Ci0gIH0KLSBpaXJxOgotICBtaXI9bWFzdGVyX2luYihJSVJRX1JFRyk7Ci0gIC8qIHNob3VsZCB0ZXN0IHdoZXRoZXIga2V5Ym9hcmQgaXJxIGlzIHJlYWxseSBlbmFibGVkLCBkb2luZyBpdCBpbiBkZWZoYW5kICovCi0gIGlmIChtaXImUTQwX0lSUV9LRVlCX01BU0spIHsKLQkgIGlycV90YWJbUTQwX0lSUV9LRVlCT0FSRF0uY291bnQrKzsKLQkgIGlycV90YWJbUTQwX0lSUV9LRVlCT0FSRF0uaGFuZGxlcihRNDBfSVJRX0tFWUJPQVJELGlycV90YWJbUTQwX0lSUV9LRVlCT0FSRF0uZGV2X2lkLGZwKTsKLSAgfQotICByZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLWludCBzaG93X3E0MF9pbnRlcnJ1cHRzIChzdHJ1Y3Qgc2VxX2ZpbGUgKnAsIHZvaWQgKnYpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDw9IFE0MF9JUlFfTUFYOyBpKyspIHsKLQkJaWYgKGlycV90YWJbaV0uY291bnQpCi0JCSAgICAgIHNlcV9wcmludGYocCwgIiVzSVJRICUwMmQ6ICU4ZCAgJXMlc1xuIiwKLQkJCSAgICAgIChpPD0xNSkgPyAiSVNBLSIgOiAiICAgICIgLAotCQkJICAgIGksIGlycV90YWJbaV0uY291bnQsCi0JCQkgICAgaXJxX3RhYltpXS5kZXZuYW1lWzBdID8gaXJxX3RhYltpXS5kZXZuYW1lIDogIj8iLAotCQkJICAgIGlycV90YWJbaV0uaGFuZGxlciA9PSBxNDBfZGVmaGFuZCA/Ci0JCQkJCSIgKG5vdyB1bmFzc2lnbmVkKSIgOiAiIik7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisJCWlmIChtZXIgJiYgY2NsZWlycSA+IDAgJiYgIWFsaWFzZWRfaXJxKSB7CisJCQlwcmludGsoIklTQSBpbnRlcnJ1cHQgZnJvbSB1bmtub3duIHNvdXJjZT8gRUlSUV9SRUcgPSAleFxuIixtZXIpOworCQkJY2NsZWlycS0tOworCQl9CiAJfQotCXJldHVybiAwOworIGlpcnE6CisJbWlyID0gbWFzdGVyX2luYihJSVJRX1JFRyk7CisJLyogc2hvdWxkIHRlc3Qgd2hldGhlciBrZXlib2FyZCBpcnEgaXMgcmVhbGx5IGVuYWJsZWQsIGRvaW5nIGl0IGluIGRlZmhhbmQgKi8KKwlpZiAobWlyICYgUTQwX0lSUV9LRVlCX01BU0spCisJCW02OGtfaGFuZGxlX2ludChRNDBfSVJRX0tFWUJPQVJELCBmcCk7CisKKwlyZXR1cm47CiB9CiAKLQotc3RhdGljIGlycXJldHVybl90IHE0MF9kZWZoYW5kIChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpmcCkKK3ZvaWQgcTQwX2VuYWJsZV9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKLSAgICAgICAgaWYgKGlycSE9UTQwX0lSUV9LRVlCT0FSRCkKLQkgICAgIHByaW50ayAoIlVua25vd24gcTQwIGludGVycnVwdCAlZFxuIiwgaXJxKTsKLQllbHNlIG1hc3Rlcl9vdXRiKC0xLEtFWUJPQVJEX1VOTE9DS19SRUcpOwotCXJldHVybiBJUlFfTk9ORTsKKwlpZiAoaXJxID49IDUgJiYgaXJxIDw9IDE1KSB7CisJCW1leHRfZGlzYWJsZWQtLTsKKwkJaWYgKG1leHRfZGlzYWJsZWQgPiAwKQorCQkJcHJpbnRrKCJxNDBfZW5hYmxlX2lycSA6IG5lc3RlZCBkaXNhYmxlL2VuYWJsZVxuIik7CisJCWlmIChtZXh0X2Rpc2FibGVkID09IDApCisJCQltYXN0ZXJfb3V0YigxLCBFWFRfRU5BQkxFX1JFRyk7CisJfQogfQotc3RhdGljIGlycXJldHVybl90IGRlZmF1bHRfaGFuZGxlcihpbnQgbGV2LCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQorCisKK3ZvaWQgcTQwX2Rpc2FibGVfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0JcHJpbnRrICgiVW5pbml0aWFsaXNlZCBpbnRlcnJ1cHQgbGV2ZWwgJWRcbiIsIGxldik7Ci0JcmV0dXJuIElSUV9OT05FOworCS8qIGRpc2FibGUgSVNBIGlxcyA6IG9ubHkgZG8gc29tZXRoaW5nIGlmIHRoZSBkcml2ZXIgaGFzIGJlZW4KKwkgKiB2ZXJpZmllZCB0byBiZSBRNDAgImNvbXBhdGlibGUiIC0gcmlnaHQgbm93IElERSwgTkUySworCSAqIEFueSBkcml2ZXIgc2hvdWxkIG5vdCBhdHRlbXB0IHRvIHNsZWVwIGFjcm9zcyBkaXNhYmxlX2lycSAhIQorCSAqLworCisJaWYgKGlycSA+PSA1ICYmIGlycSA8PSAxNSkgeworCQltYXN0ZXJfb3V0YigwLCBFWFRfRU5BQkxFX1JFRyk7CisJCW1leHRfZGlzYWJsZWQrKzsKKwkJaWYgKG1leHRfZGlzYWJsZWQgPiAxKQorCQkJcHJpbnRrKCJkaXNhYmxlX2lycSBuZXN0aW5nIGNvdW50ICVkXG4iLG1leHRfZGlzYWJsZWQpOworCX0KIH0KIAotaXJxcmV0dXJuX3QgKCpxNDBfZGVmYXVsdF9oYW5kbGVyW1NZU19JUlFTXSkoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopID0gewotCSBbMF0gPSBkZWZhdWx0X2hhbmRsZXIsCi0JIFsxXSA9IGRlZmF1bHRfaGFuZGxlciwKLQkgWzJdID0gZGVmYXVsdF9oYW5kbGVyLAotCSBbM10gPSBkZWZhdWx0X2hhbmRsZXIsCi0JIFs0XSA9IGRlZmF1bHRfaGFuZGxlciwKLQkgWzVdID0gZGVmYXVsdF9oYW5kbGVyLAotCSBbNl0gPSBkZWZhdWx0X2hhbmRsZXIsCi0JIFs3XSA9IGRlZmF1bHRfaGFuZGxlcgotfTsKLQotCi12b2lkIHE0MF9lbmFibGVfaXJxICh1bnNpZ25lZCBpbnQgaXJxKQordW5zaWduZWQgbG9uZyBxNDBfcHJvYmVfaXJxX29uKHZvaWQpCiB7Ci0gIGlmICggaXJxPj01ICYmIGlycTw9MTUgKQotICB7Ci0gICAgbWV4dF9kaXNhYmxlZC0tOwotICAgIGlmIChtZXh0X2Rpc2FibGVkPjApCi0JICBwcmludGsoInE0MF9lbmFibGVfaXJxIDogbmVzdGVkIGRpc2FibGUvZW5hYmxlXG4iKTsKLSAgICBpZiAobWV4dF9kaXNhYmxlZD09MCkKLSAgICBtYXN0ZXJfb3V0YigxLEVYVF9FTkFCTEVfUkVHKTsKLSAgICB9CisJcHJpbnRrKCJpcnEgcHJvYmluZyBub3Qgd29ya2luZyAtIHJlY29uZmlndXJlIHRoZSBkcml2ZXIgdG8gYXZvaWQgdGhpc1xuIik7CisJcmV0dXJuIC0xOwogfQotCi0KLXZvaWQgcTQwX2Rpc2FibGVfaXJxICh1bnNpZ25lZCBpbnQgaXJxKQoraW50IHE0MF9wcm9iZV9pcnFfb2ZmKHVuc2lnbmVkIGxvbmcgaXJxcykKIHsKLSAgLyogZGlzYWJsZSBJU0EgaXFzIDogb25seSBkbyBzb21ldGhpbmcgaWYgdGhlIGRyaXZlciBoYXMgYmVlbgotICAgKiB2ZXJpZmllZCB0byBiZSBRNDAgImNvbXBhdGlibGUiIC0gcmlnaHQgbm93IElERSwgTkUySwotICAgKiBBbnkgZHJpdmVyIHNob3VsZCBub3QgYXR0ZW1wdCB0byBzbGVlcCBhY3Jvc3MgZGlzYWJsZV9pcnEgISEKLSAgICovCi0KLSAgaWYgKCBpcnE+PTUgJiYgaXJxPD0xNSApIHsKLSAgICBtYXN0ZXJfb3V0YigwLEVYVF9FTkFCTEVfUkVHKTsKLSAgICBtZXh0X2Rpc2FibGVkKys7Ci0gICAgaWYgKG1leHRfZGlzYWJsZWQ+MSkgcHJpbnRrKCJkaXNhYmxlX2lycSBuZXN0aW5nIGNvdW50ICVkXG4iLG1leHRfZGlzYWJsZWQpOwotICB9CisJcmV0dXJuIC0xOwogfQotCi11bnNpZ25lZCBsb25nIHE0MF9wcm9iZV9pcnFfb24gKHZvaWQpCi17Ci0gIHByaW50aygiaXJxIHByb2Jpbmcgbm90IHdvcmtpbmcgLSByZWNvbmZpZ3VyZSB0aGUgZHJpdmVyIHRvIGF2b2lkIHRoaXNcbiIpOwotICByZXR1cm4gLTE7Ci19Ci1pbnQgcTQwX3Byb2JlX2lycV9vZmYgKHVuc2lnbmVkIGxvbmcgaXJxcykKLXsKLSAgcmV0dXJuIC0xOwotfQotLyoKLSAqIExvY2FsIHZhcmlhYmxlczoKLSAqIGNvbXBpbGUtY29tbWFuZDogIm02OGstbGludXgtZ2NjIC1EX19LRVJORUxfXyAtSS9ob21lL3J6L2x4L2xpbnV4LTIuMi42L2luY2x1ZGUgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtTzIgLWZvbWl0LWZyYW1lLXBvaW50ZXIgLXBpcGUgLWZuby1zdHJlbmd0aC1yZWR1Y2UgLWZmaXhlZC1hMiAtbTY4MDQwICAgLWMgLW8gcTQwaW50cy5vIHE0MGludHMuYyIKLSAqIEVuZDoKLSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL3N1bjMvY29uZmlnLmMgYi9hcmNoL202OGsvc3VuMy9jb25maWcuYwppbmRleCBmMWNhMGRmLi41NTNjMzA0IDEwMDY0NAotLS0gYS9hcmNoL202OGsvc3VuMy9jb25maWcuYworKysgYi9hcmNoL202OGsvc3VuMy9jb25maWcuYwpAQCAtMzYsNyArMzYsNiBAQAogY2hhciBzdW4zX3Jlc2VydmVkX3BtZWdbU1VOM19QTUVHU19OVU1dOwogCiBleHRlcm4gdW5zaWduZWQgbG9uZyBzdW4zX2dldHRpbWVvZmZzZXQodm9pZCk7Ci1leHRlcm4gaW50IHNob3dfc3VuM19pbnRlcnJ1cHRzIChzdHJ1Y3Qgc2VxX2ZpbGUgKiwgdm9pZCAqKTsKIGV4dGVybiB2b2lkIHN1bjNfc2NoZWRfaW5pdChpcnFyZXR1cm5fdCAoKmhhbmRsZXIpKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKSk7CiBleHRlcm4gdm9pZCBzdW4zX2dldF9tb2RlbCAoY2hhciogbW9kZWwpOwogZXh0ZXJuIHZvaWQgaWRwcm9tX2luaXQgKHZvaWQpOwpAQCAtMTQ3LDEzICsxNDYsNiBAQAogCiAgICAgICAgIG1hY2hfc2NoZWRfaW5pdCAgICAgID0gIHN1bjNfc2NoZWRfaW5pdDsKICAgICAgICAgbWFjaF9pbml0X0lSUSAgICAgICAgPSAgc3VuM19pbml0X0lSUTsKLSAgICAgICAgbWFjaF9kZWZhdWx0X2hhbmRsZXIgPSAmc3VuM19kZWZhdWx0X2hhbmRsZXI7Ci0gICAgICAgIG1hY2hfcmVxdWVzdF9pcnEgICAgID0gIHN1bjNfcmVxdWVzdF9pcnE7Ci0gICAgICAgIG1hY2hfZnJlZV9pcnEgICAgICAgID0gIHN1bjNfZnJlZV9pcnE7Ci0JZW5hYmxlX2lycQkgICAgID0gIHN1bjNfZW5hYmxlX2lycTsKLSAgICAgICAgZGlzYWJsZV9pcnEJICAgICA9ICBzdW4zX2Rpc2FibGVfaXJxOwotCW1hY2hfcHJvY2Vzc19pbnQgICAgID0gIHN1bjNfcHJvY2Vzc19pbnQ7Ci0gICAgICAgIG1hY2hfZ2V0X2lycV9saXN0ICAgID0gIHNob3dfc3VuM19pbnRlcnJ1cHRzOwogICAgICAgICBtYWNoX3Jlc2V0ICAgICAgICAgICA9ICBzdW4zX3JlYm9vdDsKIAltYWNoX2dldHRpbWVvZmZzZXQgICA9ICBzdW4zX2dldHRpbWVvZmZzZXQ7CiAJbWFjaF9nZXRfbW9kZWwJICAgICA9ICBzdW4zX2dldF9tb2RlbDsKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9zdW4zL3N1bjNkdm1hLmMgYi9hcmNoL202OGsvc3VuMy9zdW4zZHZtYS5jCmluZGV4IGYwNGExZDIuLjk3YzdiZmQgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9zdW4zL3N1bjNkdm1hLmMKKysrIGIvYXJjaC9tNjhrL3N1bjMvc3VuM2R2bWEuYwpAQCAtMTE5LDggKzExOSw3IEBACiAJCWlmKGhvbGUtPmVuZCA9PSBwcmV2LT5zdGFydCkgewogCQkJaG9sZS0+c2l6ZSArPSBwcmV2LT5zaXplOwogCQkJaG9sZS0+ZW5kID0gcHJldi0+ZW5kOwotCQkJbGlzdF9kZWwoJihwcmV2LT5saXN0KSk7Ci0JCQlsaXN0X2FkZCgmKHByZXYtPmxpc3QpLCAmaG9sZV9jYWNoZSk7CisJCQlsaXN0X21vdmUoJihwcmV2LT5saXN0KSwgJmhvbGVfY2FjaGUpOwogCQkJcmV0Kys7CiAJCX0KIApAQCAtMTgyLDggKzE4MSw3IEBACiAjZW5kaWYKIAkJCXJldHVybiBob2xlLT5lbmQ7CiAJCX0gZWxzZSBpZihob2xlLT5zaXplID09IG5ld2xlbikgewotCQkJbGlzdF9kZWwoJihob2xlLT5saXN0KSk7Ci0JCQlsaXN0X2FkZCgmKGhvbGUtPmxpc3QpLCAmaG9sZV9jYWNoZSk7CisJCQlsaXN0X21vdmUoJihob2xlLT5saXN0KSwgJmhvbGVfY2FjaGUpOwogCQkJZHZtYV9lbnRyeV91c2UoaG9sZS0+c3RhcnQpID0gbmV3bGVuOwogI2lmZGVmIERWTUFfREVCVUcKIAkJCWR2bWFfYWxsb2NzKys7CmRpZmYgLS1naXQgYS9hcmNoL202OGsvc3VuMy9zdW4zaW50cy5jIGIvYXJjaC9tNjhrL3N1bjMvc3VuM2ludHMuYwppbmRleCBlNjJhMDMzLi4wOTEyNDM1IDEwMDY0NAotLS0gYS9hcmNoL202OGsvc3VuMy9zdW4zaW50cy5jCisrKyBiL2FyY2gvbTY4ay9zdW4zL3N1bjNpbnRzLmMKQEAgLTE5LDcgKzE5LDYgQEAKICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogCiBleHRlcm4gdm9pZCBzdW4zX2xlZHMgKHVuc2lnbmVkIGNoYXIpOwotc3RhdGljIGlycXJldHVybl90IHN1bjNfaW50aGFuZGxlKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKmZwKTsKIAogdm9pZCBzdW4zX2Rpc2FibGVfaW50ZXJydXB0cyh2b2lkKQogewpAQCAtNDAsNDggKzM5LDMwIEBACiAKIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIqIHN1bjNfaW50cmVnOwogCi12b2lkIHN1bjNfaW5zZXJ0X2lycShpcnFfbm9kZV90ICoqbGlzdCwgaXJxX25vZGVfdCAqbm9kZSkKLXsKLX0KLQotdm9pZCBzdW4zX2RlbGV0ZV9pcnEoaXJxX25vZGVfdCAqKmxpc3QsIHZvaWQgKmRldl9pZCkKLXsKLX0KLQogdm9pZCBzdW4zX2VuYWJsZV9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKLQkqc3VuM19pbnRyZWcgfD0gICgxPDxpcnEpOworCSpzdW4zX2ludHJlZyB8PSAgKDEgPDwgaXJxKTsKIH0KIAogdm9pZCBzdW4zX2Rpc2FibGVfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0JKnN1bjNfaW50cmVnICY9IH4oMTw8aXJxKTsKLX0KLQotaW5saW5lIHZvaWQgc3VuM19kb19pcnEoaW50IGlycSwgc3RydWN0IHB0X3JlZ3MgKmZwKQotewotCWtzdGF0X2NwdSgwKS5pcnFzW1NZU19JUlFTICsgaXJxXSsrOwotCSpzdW4zX2ludHJlZyAmPSB+KDE8PGlycSk7Ci0JKnN1bjNfaW50cmVnIHw9ICAoMTw8aXJxKTsKKwkqc3VuM19pbnRyZWcgJj0gfigxIDw8IGlycSk7CiB9CiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBzdW4zX2ludDcoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqZnApCiB7Ci0Jc3VuM19kb19pcnEoaXJxLGZwKTsKLQlpZighKGtzdGF0X2NwdSgwKS5pcnFzW1NZU19JUlFTICsgaXJxXSAlIDIwMDApKQotCQlzdW4zX2xlZHMobGVkX3BhdHRlcm5bKGtzdGF0X2NwdSgwKS5pcnFzW1NZU19JUlFTK2lycV0lMTYwMDApCi0JCQkgIC8yMDAwXSk7CisJKnN1bjNfaW50cmVnIHw9ICAoMSA8PCBpcnEpOworCWlmICghKGtzdGF0X2NwdSgwKS5pcnFzW2lycV0gJSAyMDAwKSkKKwkJc3VuM19sZWRzKGxlZF9wYXR0ZXJuWyhrc3RhdF9jcHUoMCkuaXJxc1tpcnFdICUgMTYwMDApIC8gMjAwMF0pOwogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAogc3RhdGljIGlycXJldHVybl90IHN1bjNfaW50NShpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpmcCkKIHsKLSAgICAgICAga3N0YXRfY3B1KDApLmlycXNbU1lTX0lSUVMgKyBpcnFdKys7CiAjaWZkZWYgQ09ORklHX1NVTjMKIAlpbnRlcnNpbF9jbGVhcigpOwogI2VuZGlmCi0gICAgICAgICpzdW4zX2ludHJlZyAmPSB+KDE8PGlycSk7Ci0gICAgICAgICpzdW4zX2ludHJlZyB8PSAgKDE8PGlycSk7CisgICAgICAgICpzdW4zX2ludHJlZyB8PSAgKDEgPDwgaXJxKTsKICNpZmRlZiBDT05GSUdfU1VOMwogCWludGVyc2lsX2NsZWFyKCk7CiAjZW5kaWYKQEAgLTg5LDY1ICs3MCw4IEBACiAjaWZuZGVmIENPTkZJR19TTVAKIAl1cGRhdGVfcHJvY2Vzc190aW1lcyh1c2VyX21vZGUoZnApKTsKICNlbmRpZgotICAgICAgICBpZighKGtzdGF0X2NwdSgwKS5pcnFzW1NZU19JUlFTICsgaXJxXSAlIDIwKSkKLSAgICAgICAgICAgICAgICBzdW4zX2xlZHMobGVkX3BhdHRlcm5bKGtzdGF0X2NwdSgwKS5pcnFzW1NZU19JUlFTK2lycV0lMTYwKQotICAgICAgICAgICAgICAgIC8yMF0pOwotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotLyogaGFuZGxlIHJlcXVlc3RlZCBpbnRzLCBleGNlcHRpbmcgNSBhbmQgNywgd2hpY2ggYWx3YXlzIGRvIHRoZSBzYW1lCi0gICB0aGluZyAqLwotaXJxcmV0dXJuX3QgKCpzdW4zX2RlZmF1bHRfaGFuZGxlcltTWVNfSVJRU10pKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKSA9IHsKLQlbMF0gPSBzdW4zX2ludGhhbmRsZSwKLQlbMV0gPSBzdW4zX2ludGhhbmRsZSwKLQlbMl0gPSBzdW4zX2ludGhhbmRsZSwKLQlbM10gPSBzdW4zX2ludGhhbmRsZSwKLQlbNF0gPSBzdW4zX2ludGhhbmRsZSwKLQlbNV0gPSBzdW4zX2ludDUsCi0JWzZdID0gc3VuM19pbnRoYW5kbGUsCi0JWzddID0gc3VuM19pbnQ3Ci19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqZGV2X25hbWVzW1NZU19JUlFTXSA9IHsKLQlbNV0gPSAidGltZXIiLAotCVs3XSA9ICJpbnQ3IGhhbmRsZXIiCi19Owotc3RhdGljIHZvaWQgKmRldl9pZHNbU1lTX0lSUVNdOwotc3RhdGljIGlycXJldHVybl90ICgqc3VuM19pbnRoYW5kbGVyW1NZU19JUlFTXSkoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopID0gewotCVs1XSA9IHN1bjNfaW50NSwKLQlbN10gPSBzdW4zX2ludDcKLX07Ci1zdGF0aWMgaXJxcmV0dXJuX3QgKCpzdW4zX3ZlY2hhbmRsZXJbU1VOM19JTlRfVkVDU10pKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKTsKLXN0YXRpYyB2b2lkICp2ZWNfaWRzW1NVTjNfSU5UX1ZFQ1NdOwotc3RhdGljIGNvbnN0IGNoYXIgKnZlY19uYW1lc1tTVU4zX0lOVF9WRUNTXTsKLXN0YXRpYyBpbnQgdmVjX2ludHNbU1VOM19JTlRfVkVDU107Ci0KLQotaW50IHNob3dfc3VuM19pbnRlcnJ1cHRzKHN0cnVjdCBzZXFfZmlsZSAqcCwgdm9pZCAqdikKLXsKLQlpbnQgaTsKLQotCWZvcihpID0gMDsgaSA8IChTVU4zX0lOVF9WRUNTLTEpOyBpKyspIHsKLQkJaWYoc3VuM192ZWNoYW5kbGVyW2ldICE9IE5VTEwpIHsKLQkJCXNlcV9wcmludGYocCwgInZlYyAlM2Q6ICUxMHUgJXNcbiIsIGkrNjQsCi0JCQkJICAgdmVjX2ludHNbaV0sCi0JCQkJICAgKHZlY19uYW1lc1tpXSkgPyB2ZWNfbmFtZXNbaV0gOgotCQkJCSAgICJzdW4zX3ZlY2hhbmRsZXIiKTsKLQkJfQotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaXJxcmV0dXJuX3Qgc3VuM19pbnRoYW5kbGUoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqZnApCi17Ci0JaWYoc3VuM19pbnRoYW5kbGVyW2lycV0gPT0gTlVMTCkKLQkJcGFuaWMgKCJiYWQgaW50ZXJydXB0ICVkIHJlY2VpdmVkIChpZCAlcClcbiIsaXJxLCBkZXZfaWQpOwotCi0gICAgICAgIGtzdGF0X2NwdSgwKS5pcnFzW1NZU19JUlFTICsgaXJxXSsrOwotICAgICAgICAqc3VuM19pbnRyZWcgJj0gfigxPDxpcnEpOwotCi0Jc3VuM19pbnRoYW5kbGVyW2lycV0oaXJxLCBkZXZfaWRzW2lycV0sIGZwKTsKKyAgICAgICAgaWYgKCEoa3N0YXRfY3B1KDApLmlycXNbaXJxXSAlIDIwKSkKKyAgICAgICAgICAgICAgICBzdW4zX2xlZHMobGVkX3BhdHRlcm5bKGtzdGF0X2NwdSgwKS5pcnFzW2lycV0gJSAxNjApIC8gMjBdKTsKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKQEAgLTE1NywxMDkgKzgxLDMxIEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCitzdGF0aWMgdm9pZCBzdW4zX2ludGhhbmRsZSh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgcHRfcmVncyAqZnApCit7CisgICAgICAgICpzdW4zX2ludHJlZyAmPSB+KDEgPDwgaXJxKTsKKworCW02OGtfaGFuZGxlX2ludChpcnEsIGZwKTsKK30KKworc3RhdGljIHN0cnVjdCBpcnFfY29udHJvbGxlciBzdW4zX2lycV9jb250cm9sbGVyID0geworCS5uYW1lCQk9ICJzdW4zIiwKKwkubG9jawkJPSBTUElOX0xPQ0tfVU5MT0NLRUQsCisJLnN0YXJ0dXAJPSBtNjhrX2lycV9zdGFydHVwLAorCS5zaHV0ZG93bgk9IG02OGtfaXJxX3NodXRkb3duLAorCS5lbmFibGUJCT0gc3VuM19lbmFibGVfaXJxLAorCS5kaXNhYmxlCT0gc3VuM19kaXNhYmxlX2lycSwKK307CisKIHZvaWQgc3VuM19pbml0X0lSUSh2b2lkKQogewotCWludCBpOwotCiAJKnN1bjNfaW50cmVnID0gMTsKIAotCWZvcihpID0gMDsgaSA8IFNZU19JUlFTOyBpKyspCi0JewotCQlpZihkZXZfbmFtZXNbaV0pCi0JCQljcHVfcmVxdWVzdF9pcnEoaSwgc3VuM19kZWZhdWx0X2hhbmRsZXJbaV0sIDAsCi0JCQkJCWRldl9uYW1lc1tpXSwgTlVMTCk7Ci0JfQorCW02OGtfc2V0dXBfYXV0b19pbnRlcnJ1cHQoc3VuM19pbnRoYW5kbGUpOworCW02OGtfc2V0dXBfaXJxX2NvbnRyb2xsZXIoJnN1bjNfaXJxX2NvbnRyb2xsZXIsIElSUV9BVVRPXzEsIDcpOworCW02OGtfc2V0dXBfdXNlcl9pbnRlcnJ1cHQoVkVDX1VTRVIsIDE5MiwgTlVMTCk7CiAKLQlmb3IoaSA9IDA7IGkgPCAxOTI7IGkrKykKLQkJc3VuM192ZWNoYW5kbGVyW2ldID0gTlVMTDsKLQotCXN1bjNfdmVjaGFuZGxlclsxOTFdID0gc3VuM192ZWMyNTU7Ci19Ci0KLWludCBzdW4zX3JlcXVlc3RfaXJxKHVuc2lnbmVkIGludCBpcnEsIGlycXJldHVybl90ICgqaGFuZGxlcikoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopLAotICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldm5hbWUsIHZvaWQgKmRldl9pZCkKLXsKLQotCWlmKGlycSA8IFNZU19JUlFTKSB7Ci0JCWlmKHN1bjNfaW50aGFuZGxlcltpcnFdICE9IE5VTEwpIHsKLQkJCXByaW50aygic3VuM19yZXF1ZXN0X2lycTogcmVxdWVzdCBmb3IgaXJxICVkIC0tIGFscmVhZHkgdGFrZW4hXG4iLCBpcnEpOwotCQkJcmV0dXJuIDE7Ci0JCX0KLQotCQlzdW4zX2ludGhhbmRsZXJbaXJxXSA9IGhhbmRsZXI7Ci0JCWRldl9pZHNbaXJxXSA9IGRldl9pZDsKLQkJZGV2X25hbWVzW2lycV0gPSBkZXZuYW1lOwotCi0JCS8qIHNldHRpbmcgZGV2bmFtZSB3b3VsZCBiZSBuaWNlICovCi0JCWNwdV9yZXF1ZXN0X2lycShpcnEsIHN1bjNfZGVmYXVsdF9oYW5kbGVyW2lycV0sIDAsIGRldm5hbWUsCi0JCQkJTlVMTCk7Ci0KLQkJcmV0dXJuIDA7Ci0JfSBlbHNlIHsKLQkJaWYoKGlycSA+PSA2NCkgJiYgKGlycSA8PSAyNTUpKSB7Ci0JCSAgICAgICAgaW50IHZlYzsKLQotCQkJdmVjID0gaXJxIC0gNjQ7Ci0JCQlpZihzdW4zX3ZlY2hhbmRsZXJbdmVjXSAhPSBOVUxMKSB7Ci0JCQkJcHJpbnRrKCJzdW4zX3JlcXVlc3RfaXJxOiByZXF1ZXN0IGZvciB2ZWMgJWQgLS0gYWxyZWFkeSB0YWtlbiFcbiIsIGlycSk7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0KLQkJCXN1bjNfdmVjaGFuZGxlclt2ZWNdID0gaGFuZGxlcjsKLQkJCXZlY19pZHNbdmVjXSA9IGRldl9pZDsKLQkJCXZlY19uYW1lc1t2ZWNdID0gZGV2bmFtZTsKLQkJCXZlY19pbnRzW3ZlY10gPSAwOwotCi0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQotCXByaW50aygic3VuM19yZXF1ZXN0X2lycTogaW52YWxpZCBpcnEgJWRcbiIsIGlycSk7Ci0JcmV0dXJuIDE7Ci0KLX0KLQotdm9pZCBzdW4zX2ZyZWVfaXJxKHVuc2lnbmVkIGludCBpcnEsIHZvaWQgKmRldl9pZCkKLXsKLQotCWlmKGlycSA8IFNZU19JUlFTKSB7Ci0JCWlmKHN1bjNfaW50aGFuZGxlcltpcnFdID09IE5VTEwpCi0JCQlwYW5pYygic3VuM19mcmVlX2ludDogYXR0ZW1wdCB0byBmcmVlIHVudXNlZCBpcnEgJWRcbiIsIGlycSk7Ci0JCWlmKGRldl9pZHNbaXJxXSAhPSBkZXZfaWQpCi0JCQlwYW5pYygic3VuM19mcmVlX2ludDogaW5jb3JyZWN0IGRldl9pZCBmb3IgaXJxICVkXG4iLCBpcnEpOwotCi0JCXN1bjNfaW50aGFuZGxlcltpcnFdID0gTlVMTDsKLQkJcmV0dXJuOwotCX0gZWxzZSBpZigoaXJxID49IDY0KSAmJiAoaXJxIDw9IDI1NSkpIHsKLQkJaW50IHZlYzsKLQotCQl2ZWMgPSBpcnEgLSA2NDsKLQkJaWYoc3VuM192ZWNoYW5kbGVyW3ZlY10gPT0gTlVMTCkKLQkJCXBhbmljKCJzdW4zX2ZyZWVfaW50OiBhdHRlbXB0IHRvIGZyZWUgdW51c2VkIHZlY3RvciAlZFxuIiwgaXJxKTsKLQkJaWYodmVjX2lkc1tpcnFdICE9IGRldl9pZCkKLQkJCXBhbmljKCJzdW4zX2ZyZWVfaW50OiBpbmNvcnJlY3QgZGV2X2lkIGZvciB2ZWMgJWRcbiIsIGlycSk7Ci0KLQkJc3VuM192ZWNoYW5kbGVyW3ZlY10gPSBOVUxMOwotCQlyZXR1cm47Ci0JfSBlbHNlIHsKLQkJcGFuaWMoInN1bjNfZnJlZV9pcnE6IGludmFsaWQgaXJxICVkXG4iLCBpcnEpOwotCX0KLX0KLQotaXJxcmV0dXJuX3Qgc3VuM19wcm9jZXNzX2ludChpbnQgaXJxLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQotCWlmKChpcnEgPj0gNjQpICYmIChpcnEgPD0gMjU1KSkgewotCQlpbnQgdmVjOwotCi0JCXZlYyA9IGlycSAtIDY0OwotCQlpZihzdW4zX3ZlY2hhbmRsZXJbdmVjXSA9PSBOVUxMKQotCQkJcGFuaWMgKCJiYWQgaW50ZXJydXB0IHZlY3RvciAlZCByZWNlaXZlZFxuIixpcnEpOwotCi0JCXZlY19pbnRzW3ZlY10rKzsKLQkJcmV0dXJuIHN1bjNfdmVjaGFuZGxlclt2ZWNdKGlycSwgdmVjX2lkc1t2ZWNdLCByZWdzKTsKLQl9IGVsc2UgewotCQlwYW5pYygic3VuM19wcm9jZXNzX2ludDogdW5hYmxlIHRvIGhhbmRsZSBpbnRlcnJ1cHQgdmVjdG9yICVkXG4iLAotCQkgICAgICBpcnEpOwotCX0KKwlyZXF1ZXN0X2lycShJUlFfQVVUT181LCBzdW4zX2ludDUsIDAsICJpbnQ1IiwgTlVMTCk7CisJcmVxdWVzdF9pcnEoSVJRX0FVVE9fNywgc3VuM19pbnQ3LCAwLCAiaW50NyIsIE5VTEwpOworCXJlcXVlc3RfaXJxKElSUV9VU0VSKzEyNywgc3VuM192ZWMyNTUsIDAsICJ2ZWMyNTUiLCBOVUxMKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9zdW4zeC9jb25maWcuYyBiL2FyY2gvbTY4ay9zdW4zeC9jb25maWcuYwppbmRleCAwOTIwZjVkLi41MmZiMTc0IDEwMDY0NAotLS0gYS9hcmNoL202OGsvc3VuM3gvY29uZmlnLmMKKysrIGIvYXJjaC9tNjhrL3N1bjN4L2NvbmZpZy5jCkBAIC01MiwxNyArNTIsMTAgQEAKIAogCXN1bjN4X3Byb21faW5pdCgpOwogCi0JbWFjaF9nZXRfaXJxX2xpc3QJID0gc2hvd19zdW4zX2ludGVycnVwdHM7CiAJbWFjaF9tYXhfZG1hX2FkZHJlc3MgPSAweGZmZmZmZmZmOyAvKiB3ZSBjYW4gRE1BIGFueXdoZXJlLCB3aGVlICovCiAKLQltYWNoX2RlZmF1bHRfaGFuZGxlciA9ICZzdW4zX2RlZmF1bHRfaGFuZGxlcjsKIAltYWNoX3NjaGVkX2luaXQgICAgICA9IHN1bjN4X3NjaGVkX2luaXQ7CiAJbWFjaF9pbml0X0lSUSAgICAgICAgPSBzdW4zX2luaXRfSVJROwotCWVuYWJsZV9pcnEgICAgICAgICAgID0gc3VuM19lbmFibGVfaXJxOwotCWRpc2FibGVfaXJxICAgICAgICAgID0gc3VuM19kaXNhYmxlX2lycTsKLQltYWNoX3JlcXVlc3RfaXJxICAgICA9IHN1bjNfcmVxdWVzdF9pcnE7Ci0JbWFjaF9mcmVlX2lycSAgICAgICAgPSBzdW4zX2ZyZWVfaXJxOwotCW1hY2hfcHJvY2Vzc19pbnQgICAgID0gc3VuM19wcm9jZXNzX2ludDsKIAogCW1hY2hfZ2V0dGltZW9mZnNldCAgID0gc3VuM3hfZ2V0dGltZW9mZnNldDsKIAltYWNoX3Jlc2V0ICAgICAgICAgICA9IHN1bjN4X3JlYm9vdDsKZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L0tjb25maWcgYi9hcmNoL202OGtub21tdS9LY29uZmlnCmluZGV4IDNjZGU2ODIuLjhiNmU3MjMgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4a25vbW11L0tjb25maWcKKysrIGIvYXJjaC9tNjhrbm9tbXUvS2NvbmZpZwpAQCAtNSw3ICs1LDcgQEAKIAogbWFpbm1lbnUgInVDbGludXgvNjhrICh3L28gTU1VKSBLZXJuZWwgQ29uZmlndXJhdGlvbiIKIAotY29uZmlnIE02OEtOT01NVQorY29uZmlnIE02OEsKIAlib29sCiAJZGVmYXVsdCB5CiAKQEAgLTExOSw2ICsxMTksMTEgQEAKIAloZWxwCiAJICBNb3Rvcm9sYSBDb2xkRmlyZSA1MzA3IHByb2Nlc3NvciBzdXBwb3J0LgogCitjb25maWcgTTUzMngKKwlib29sICJNQ0Y1MzJ4IgorCWhlbHAKKwkgIEZyZWVzY2FsZSAoTW90b3JvbGEpIENvbGRGaXJlIDUzMnggcHJvY2Vzc29yIHN1cHBvcnQuCisKIGNvbmZpZyBNNTQwNwogCWJvb2wgIk1DRjU0MDciCiAJaGVscApAQCAtMTMzLDEyNSArMTM4LDQzIEBACiAKIGNvbmZpZyBDT0xERklSRQogCWJvb2wKLQlkZXBlbmRzIG9uIChNNTIwNiB8fCBNNTIwNmUgfHwgTTUyMHggfHwgTTUyM3ggfHwgTTUyNDkgfHwgTTUyN3ggfHwgTTUyNzIgfHwgTTUyOHggfHwgTTUzMDcgfHwgTTU0MDcpCisJZGVwZW5kcyBvbiAoTTUyMDYgfHwgTTUyMDZlIHx8IE01MjB4IHx8IE01MjN4IHx8IE01MjQ5IHx8IE01Mjd4IHx8IE01MjcyIHx8IE01Mjh4IHx8IE01MzA3IHx8IE01MzJ4IHx8IE01NDA3KQogCWRlZmF1bHQgeQogCi1jaG9pY2UKLQlwcm9tcHQgIkNQVSBDTE9DSyBGcmVxdWVuY3kiCi0JZGVmYXVsdCBBVVRPCi0KLWNvbmZpZyBDTE9DS19BVVRPCi0JYm9vbCAiQVVUTyIKLQktLS1oZWxwLS0tCi0JICBEZWZpbmUgdGhlIENQVSBjbG9jayBmcmVxdWVuY3kgaW4gdXNlLiBPbiBtYW55IGJvYXJkcyB5b3UgZG9uJ3QKLQkgIHJlYWxseSBuZWVkIHRvIGtub3csIHNvIHlvdSBjYW4gc2VsZWN0IHRoZSBBVVRPIG9wdGlvbi4gT24gc29tZQotCSAgYm9hcmRzIHlvdSBuZWVkIHRvIGtub3cgdGhlIHJlYWwgY2xvY2sgZnJlcXVlbmN5IHRvIGRldGVybWluZSBvdGhlcgotCSAgc3lzdGVtIHRpbWluZyAoZm9yIGV4YW1wbGUgYmF1ZCByYXRlIGRpdmlkb3JzLCBldGMpLiBTb21lIHByb2Nlc3NvcnMKLQkgIGhhdmUgYW4gaW50ZXJuYWwgUExMIGFuZCB5b3UgY2FuIHNlbGVjdCBhIGZyZXF1ZW5jeSB0byBydW4gYXQuCi0JICBZb3UgbmVlZCB0byBrbm93IGEgbGl0dGxlIGFib3V0IHRoZSBpbnRlcm5hbHMgb2YgeW91ciBwcm9jZXNzb3IgdG8KLQkgIHNldCB0aGlzLiBJZiBpbiBkb3VidCBjaG9vc2UgdGhlIEFVVE8gb3B0aW9uLgotCi1jb25maWcgQ0xPQ0tfMTFNSHoKLQlib29sICIxMU1IeiIKK2NvbmZpZyBDTE9DS19TRVQKKwlib29sICJFbmFibGUgc2V0dGluZyB0aGUgQ1BVIGNsb2NrIGZyZXF1ZW5jeSIKKwlkZWZhdWx0IG4KIAloZWxwCi0JICBTZWxlY3QgYSAxMU1IeiBDUFUgY2xvY2sgZnJlcXVlbmN5LgorCSAgT24gc29tZSBDUFUncyB5b3UgZG8gbm90IG5lZWQgdG8ga25vdyB3aGF0IHRoZSBjb3JlIENQVSBjbG9jaworCSAgZnJlcXVlbmN5IGlzLiBPbiB0aGVzZSB5b3UgY2FuIGRpc2FibGUgY2xvY2sgc2V0dGluZy4gT24gc29tZQorCSAgdHJhZGl0aW9uYWwgNjhLIHBhcnRzLCBhbmQgb24gYWxsIENvbGRGaXJlIHBhcnRzIHlvdSBuZWVkIHRvIHNldAorCSAgdGhlIGFwcHJvcHJpYXRlIENQVSBjbG9jayBmcmVxdWVuY3kuIE9uIHRoZXNlIGRldmljZXMgbWFueSBvZiB0aGUKKwkgIG9uYm9hcmQgcGVyaXBoZXJhbHMgZGVyaXZlIHRoZWlyIHRpbWluZyBmcm9tIHRoZSBtYXN0ZXIgQ1BVIGNsb2NrCisJICBmcmVxdWVuY3kuCiAKLWNvbmZpZyBDTE9DS18xNk1IegotCWJvb2wgIjE2TUh6IgorY29uZmlnIENMT0NLX0ZSRVEKKwlpbnQgIlNldCB0aGUgY29yZSBjbG9jayBmcmVxdWVuY3kiCisJZGVmYXVsdCAiNjY2NjY2NjYiCisJZGVwZW5kcyBvbiBDTE9DS19TRVQKIAloZWxwCi0JICBTZWxlY3QgYSAxNk1IeiBDUFUgY2xvY2sgZnJlcXVlbmN5LgorCSAgRGVmaW5lIHRoZSBDUFUgY2xvY2sgZnJlcXVlbmN5IGluIHVzZS4gVGhpcyBpcyB0aGUgY29yZSBjbG9jaworCSAgZnJlcXVlbmN5LCBpdCBtYXkgb3IgbWF5IG5vdCBiZSB0aGUgc2FtZSBhcyB0aGUgZXh0ZXJuYWwgY2xvY2sKKwkgIGNyeXN0YWwgZml0dGVkIHRvIHlvdXIgYm9hcmQuIFNvbWUgcHJvY2Vzc29ycyBoYXZlIGFuIGludGVybmFsCisJICBQTEwgYW5kIGNhbiBoYXZlIHRoZWlyIGZyZXF1ZW5jeSBwcm9ncmFtbWVkIGF0IHJ1biB0aW1lLCBvdGhlcnMKKwkgIHVzZSBpbnRlcm5hbCBkaXZpZGVycy4gSW4gZ2VybmFsIHRoZSBrZXJuZWwgd29uJ3Qgc2V0dXAgYSBQTEwKKwkgIGlmIGl0IGlzIGZpdHRlZCAodGhlcmUgYXJlIHNvbWUgZXhwZWN0aW9ucykuIFRoaXMgdmFsdWUgd2lsbCBiZQorCSAgc3BlY2lmaWMgdG8gdGhlIGV4YWN0IENQVSB0aGF0IHlvdSBhcmUgdXNpbmcuCiAKLWNvbmZpZyBDTE9DS18yME1IegotCWJvb2wgIjIwTUh6IgorY29uZmlnIENMT0NLX0RJVgorCWludCAiU2V0IHRoZSBjb3JlL2J1cyBjbG9jayBkaXZpZGUgcmF0aW8iCisJZGVmYXVsdCAiMSIKKwlkZXBlbmRzIG9uIENMT0NLX1NFVAogCWhlbHAKLQkgIFNlbGVjdCBhIDIwTUh6IENQVSBjbG9jayBmcmVxdWVuY3kuCi0KLWNvbmZpZyBDTE9DS18yNE1IegotCWJvb2wgIjI0TUh6IgotCWhlbHAKLQkgIFNlbGVjdCBhIDI0TUh6IENQVSBjbG9jayBmcmVxdWVuY3kuCi0KLWNvbmZpZyBDTE9DS18yNU1IegotCWJvb2wgIjI1TUh6IgotCWhlbHAKLQkgIFNlbGVjdCBhIDI1TUh6IENQVSBjbG9jayBmcmVxdWVuY3kuCi0KLWNvbmZpZyBDTE9DS18zM01IegotCWJvb2wgIjMzTUh6IgotCWhlbHAKLQkgIFNlbGVjdCBhIDMzTUh6IENQVSBjbG9jayBmcmVxdWVuY3kuCi0KLWNvbmZpZyBDTE9DS180ME1IegotCWJvb2wgIjQwTUh6IgotCWhlbHAKLQkgIFNlbGVjdCBhIDQwTUh6IENQVSBjbG9jayBmcmVxdWVuY3kuCi0KLWNvbmZpZyBDTE9DS180NU1IegotCWJvb2wgIjQ1TUh6IgotCWhlbHAKLQkgIFNlbGVjdCBhIDQ1TUh6IENQVSBjbG9jayBmcmVxdWVuY3kuCi0KLWNvbmZpZyBDTE9DS180OE1IegotCWJvb2wgIjQ4TUh6IgotCWhlbHAKLQkgIFNlbGVjdCBhIDQ4TUh6IENQVSBjbG9jayBmcmVxdWVuY3kuCi0KLWNvbmZpZyBDTE9DS181ME1IegotCWJvb2wgIjUwTUh6IgotCWhlbHAKLQkgIFNlbGVjdCBhIDUwTUh6IENQVSBjbG9jayBmcmVxdWVuY3kuCi0KLWNvbmZpZyBDTE9DS181NE1IegotCWJvb2wgIjU0TUh6IgotCWhlbHAKLQkgIFNlbGVjdCBhIDU0TUh6IENQVSBjbG9jayBmcmVxdWVuY3kuCi0KLWNvbmZpZyBDTE9DS182ME1IegotCWJvb2wgIjYwTUh6IgotCWhlbHAKLQkgIFNlbGVjdCBhIDYwTUh6IENQVSBjbG9jayBmcmVxdWVuY3kuCi0KLWNvbmZpZyBDTE9DS182Ml81TUh6Ci0JYm9vbCAiNjIuNU1IeiIKLQloZWxwCi0JICBTZWxlY3QgYSA2Mi41TUh6IENQVSBjbG9jayBmcmVxdWVuY3kuCi0KLWNvbmZpZyBDTE9DS182NE1IegotCWJvb2wgIjY0TUh6IgotCWhlbHAKLQkgIFNlbGVjdCBhIDY0TUh6IENQVSBjbG9jayBmcmVxdWVuY3kuCi0KLWNvbmZpZyBDTE9DS182Nk1IegotCWJvb2wgIjY2TUh6IgotCWhlbHAKLQkgIFNlbGVjdCBhIDY2TUh6IENQVSBjbG9jayBmcmVxdWVuY3kuCi0KLWNvbmZpZyBDTE9DS183ME1IegotCWJvb2wgIjcwTUh6IgotCWhlbHAKLQkgIFNlbGVjdCBhIDcwTUh6IENQVSBjbG9jayBmcmVxdWVuY3kuCi0KLWNvbmZpZyBDTE9DS18xMDBNSHoKLQlib29sICIxMDBNSHoiCi0JaGVscAotCSAgU2VsZWN0IGEgMTAwTUh6IENQVSBjbG9jayBmcmVxdWVuY3kuCi0KLWNvbmZpZyBDTE9DS18xNDBNSHoKLQlib29sICIxNDBNSHoiCi0JaGVscAotCSAgU2VsZWN0IGEgMTQwTUh6IENQVSBjbG9jayBmcmVxdWVuY3kuCi0KLWNvbmZpZyBDTE9DS18xNTBNSHoKLQlib29sICIxNTBNSHoiCi0JaGVscAotCSAgU2VsZWN0IGEgMTUwTUh6IENQVSBjbG9jayBmcmVxdWVuY3kuCi0KLWNvbmZpZyBDTE9DS18xNjZNSHoKLQlib29sICIxNjZNSHoiCi0JaGVscAotCSAgU2VsZWN0IGEgMTY2TUh6IENQVSBjbG9jayBmcmVxdWVuY3kuCi0KLWVuZGNob2ljZQorCSAgT24gbWFueSBTb0Mgc3R5bGUgQ1BVcyB0aGUgbWFzdGVyIENQVSBjbG9jayBpcyBhbHNvIHVzZWQgdG8gZHJpdmUgCisJICBvbi1jaGlwIHBlcmlwaGVyYWxzLiBUaGUgY2xvY2sgdGhhdCBpcyBkaXN0cmlidXRlZCB0byB0aGVzZQorCSAgcGVyaXBoZXJhbHMgaXMgc29tZXRpbWVzIGEgZml4ZWQgcmF0aW8gb2YgdGhlIG1hc3RlciBjbG9jaworCSAgZnJlcXVlbmN5LiBJZiBzbyB0aGVuIHNldCB0aGlzIHRvIHRoZSBkaXZpZGVyIHJhdGlvbiBvZiB0aGUKKwkgIG1hc3RlciBjbG9jayB0byB0aGUgcGVyaXBoZXJhbCBjbG9jay4gSWYgbm90IHN1cmUgdGhlbiBzZWxlY3QgMS4KIAogY29uZmlnIE9MRE1BU0sKIAlib29sICJPbGQgbWFzayA1MzA3ICgxSDU1Sikgc2lsaWNvbiIKQEAgLTM3Nyw2ICszMDAsMTIgQEAKIAloZWxwCiAJICBTdXBwb3J0IGZvciB0aGUgc2VuVGVjIENPQlJBNTI3MiBib2FyZC4KIAorY29uZmlnIEFWTkVUNTI4MgorCWJvb2wgIkF2bmV0IDUyODIgYm9hcmQgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE01Mjh4CisJaGVscAorCSAgU3VwcG9ydCBmb3IgdGhlIEF2bmV0IDUyODIgYm9hcmQuICAKKwkgIAogY29uZmlnIE01MjgyRVZCCiAJYm9vbCAiTW90b3JvbGEgTTUyODJFVkIgYm9hcmQgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIE01Mjh4CkBAIC00MTksNiArMzQ4LDE4IEBACiAJaGVscAogCSAgU3VwcG9ydCBmb3IgdGhlIFNuYXBHZWFyIFNlY3VyZUVkZ2UvTVAzIHBsYXRmb3JtLgogCitjb25maWcgTTUzMjlFVkIKKwlib29sICJGcmVlc2NhbGUgKE1vdG9yb2xhKSBNNTMyOUVWQiBib2FyZCBzdXBwb3J0IgorCWRlcGVuZHMgb24gTTUzMngKKwloZWxwCisJICBTdXBwb3J0IGZvciB0aGUgRnJlZXNjYWxlIChNb3Rvcm9sYSkgTTUzMjlFVkIgYm9hcmQuCisKK2NvbmZpZyBDT0JSQTUzMjkKKwlib29sICJzZW5UZWMgQ09CUkE1MzI5IGJvYXJkIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBNNTMyeAorCWhlbHAKKwkgIFN1cHBvcnQgZm9yIHRoZSBzZW5UZWMgQ09CUkE1MzI5IGJvYXJkLgorCiBjb25maWcgTTU0MDdDMwogCWJvb2wgIk1vdG9yb2xhIE01NDA3QzMgYm9hcmQgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIE01NDA3CkBAIC00ODcsNyArNDI4LDcgQEAKIGNvbmZpZyBGUkVFU0NBTEUKIAlib29sCiAJZGVmYXVsdCB5Ci0JZGVwZW5kcyBvbiAoTTUyMDZlQzMgfHwgTTUyMDhFVkIgfHwgTTUyMzVFVkIgfHwgTTUyNDlDMyB8fCBNNTI3MUVWQiB8fCBNNTI3MkMzIHx8IE01Mjc1RVZCIHx8IE01MjgyRVZCIHx8IE01MzA3QzMgfHwgTTU0MDdDMykKKwlkZXBlbmRzIG9uIChNNTIwNmVDMyB8fCBNNTIwOEVWQiB8fCBNNTIzNUVWQiB8fCBNNTI0OUMzIHx8IE01MjcxRVZCIHx8IE01MjcyQzMgfHwgTTUyNzVFVkIgfHwgTTUyODJFVkIgfHwgTTUzMDdDMyB8fCBNNTMyOUVWQiB8fCBNNTQwN0MzKQogCiBjb25maWcgSFdfRkVJVEgKIAlib29sCkBAIC01MDgsNiArNDQ5LDExIEBACiAgICAgICAgIGJvb2wKIAlkZWZhdWx0IHkKIAlkZXBlbmRzIG9uIENQVTE2QgorCQorY29uZmlnIEFWTkVUCisJYm9vbAorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gKEFWTkVUNTI4MikKIAogY29uZmlnIExBUkdFX0FMTE9DUwogCWJvb2wgIkFsbG93IGFsbG9jYXRpbmcgbGFyZ2UgYmxvY2tzICg+IDFNQikgb2YgbWVtb3J5IgpAQCAtNTI2LDM4ICs0NzIsNDYgQEAKIAkgIHJ1bm5pbmcgbW9yZSB0aHJlYWRzIG9uIGEgc3lzdGVtIGFuZCBhbHNvIHJlZHVjZXMgdGhlIHByZXNzdXJlCiAJICBvbiB0aGUgVk0gc3Vic3lzdGVtIGZvciBoaWdoZXIgb3JkZXIgYWxsb2NhdGlvbnMuCiAKLWNob2ljZQotCXByb21wdCAiUkFNIHNpemUiCi0JZGVmYXVsdCBBVVRPCitjb21tZW50ICJSQU0gY29uZmlndXJhdGlvbiIKIAotY29uZmlnIFJBTUFVVE8KLQlib29sICJBVVRPIgotCS0tLWhlbHAtLS0KLQkgIENvbmZpZ3VyZSB0aGUgUkFNIHNpemUgb24geW91ciBwbGF0Zm9ybS4gTWFueSBwbGF0Zm9ybXMgY2FuIGF1dG8KLQkgIGRldGVjdCB0aGlzLCBvbiB0aG9zZSBjaG9vc2UgdGhlIEFVVE8gb3B0aW9uLiBPdGhlcndpc2Ugc2V0IHRoZQotCSAgUkFNIHNpemUgeW91IGludGVuZCB1c2luZy4KLQotY29uZmlnIFJBTTRNQgotCWJvb2wgIjRNaUIiCitjb25maWcgUkFNQkFTRQorCWhleCAiQWRkcmVzcyBvZiB0aGUgYmFzZSBvZiBSQU0iCisJZGVmYXVsdCAiMCIKIAloZWxwCi0JICBTZXQgUkFNIHNpemUgdG8gYmUgNE1pQi4KKwkgIERlZmluZSB0aGUgYWRkcmVzcyB0aGF0IFJBTSBzdGFydHMgYXQuIE9uIG1hbnkgcGxhdGZvcm1zIHRoaXMgaXMKKwkgIDAsIHRoZSBiYXNlIG9mIHRoZSBhZGRyZXNzIHNwYWNlLiBBbmQgdGhpcyBpcyB0aGUgZGVmYXVsdC4gU29tZQorCSAgcGxhdGZvcm1zIGNob29zZSB0byBzZXR1cCB0aGVpciBSQU0gYXQgb3RoZXIgYWRkcmVzc2VzIHdpdGhpbiB0aGUKKwkgIHByb2Nlc3NvciBhZGRyZXNzIHNwYWNlLgogCi1jb25maWcgUkFNOE1CCi0JYm9vbCAiOE1pQiIKK2NvbmZpZyBSQU1TSVpFCisJaGV4ICJTaXplIG9mIFJBTSAoaW4gYnl0ZXMpIgorCWRlZmF1bHQgIjB4NDAwMDAwIgogCWhlbHAKLQkgIFNldCBSQU0gc2l6ZSB0byBiZSA4TWlCLgorCSAgRGVmaW5lIHRoZSBzaXplIG9mIHRoZSBzeXN0ZW0gUkFNLiBJZiB5b3Ugc2VsZWN0IDAgdGhlbiB0aGUKKwkgIGtlcm5lbCB3aWxsIHRyeSB0byBwcm9iZSB0aGUgUkFNIHNpemUgYXQgcnVudGltZS4gVGhpcyBpcyBub3QKKwkgIHN1cHBvcnRlZCBvbiBhbGwgQ1BVIHR5cGVzLgogCi1jb25maWcgUkFNMTZNQgotCWJvb2wgIjE2TWlCIgorY29uZmlnIFZFQ1RPUkJBU0UKKwloZXggIkFkZHJlc3Mgb2YgdGhlIGJhc2Ugb2Ygc3lzdGVtIHZlY3RvcnMiCisJZGVmYXVsdCAiMCIKIAloZWxwCi0JICBTZXQgUkFNIHNpemUgdG8gYmUgMTZNaUIuCisJICBEZWZpbmUgdGhlIGFkZHJlc3Mgb2YgdGhlIHRoZSBzeXN0ZW0gdmVjdG9ycy4gQ29tbW9ubHkgdGhpcyBpcworCSAgcHV0IGF0IHRoZSBzdGFydCBvZiBSQU0sIGJ1dCBpdCBkb2Vzbid0IGhhdmUgdG8gYmUuIE9uIENvbGRGaXJlCisJICBwbGF0Zm9ybXMgdGhpcyBhZGRyZXNzIGlzIHByb2dyYW1tZWQgaW50byB0aGUgVkJSIHJlZ2lzdGVyLCB0aHVzCisJICBhY3R1YWxseSBzZXR0aW5nIHRoZSBhZGRyZXNzIHRvIHVzZS4KIAotY29uZmlnIFJBTTMyTUIKLQlib29sICIzMk1pQiIKK2NvbmZpZyBLRVJORUxCQVNFCisJaGV4ICJBZGRyZXNzIG9mIHRoZSBiYXNlIG9mIGtlcm5lbCBjb2RlIgorCWRlZmF1bHQgIjB4NDAwIgogCWhlbHAKLQkgIFNldCBSQU0gc2l6ZSB0byBiZSAzMk1pQi4KLQotZW5kY2hvaWNlCisJICBUeXBpY2FsbHkgb24gbTY4ayBzeXN0ZW1zIHRoZSBrZXJuZWwgd2lsbCBub3Qgc3RhcnQgYXQgdGhlIGJhc2UKKwkgIG9mIFJBTSwgYnV0IHVzdWFsbHkgc29tZSBzbWFsbCBvZmZzZXQgZnJvbSBpdC4gRGVmaW5lIHRoZSBzdGFydAorCSAgYWRkcmVzcyBvZiB0aGUga2VybmVsIGhlcmUuIFRoZSBtb3N0IGNvbW1vbiBzZXR1cCB3aWxsIGhhdmUgdGhlCisJICBwcm9jZXNzb3IgdmVjdG9ycyBhdCB0aGUgYmFzZSBvZiBSQU0gYW5kIHRoZW4gdGhlIHN0YXJ0IG9mIHRoZQorCSAga2VybmVsLiBPbiBzb21lIHBsYXRmb3JtcyBzb21lIFJBTSBpcyByZXNlcnZlZCBmb3IgYm9vdCBsb2FkZXJzCisJICBhbmQgdGhlIGtlcm5lbCBzdGFydHMgYWZ0ZXIgdGhhdC4gVGhlIDB4NDAwIGRlZmF1bHQgd2FzIGJhc2VkIG9uCisJICBhIHN5c3RlbSB3aXRoIHRoZSBSQU0gYmFzZWQgYXQgYWRkcmVzcyAwLCBhbmQgbGVhdmluZyBlbm91Z2ggcm9vbQorCSAgZm9yIHRoZSB0aGVvcmV0aWNhbCBtYXhpbXVtIG51bWJlciBvZiAyNTYgdmVjdG9ycy4KIAogY2hvaWNlCiAJcHJvbXB0ICJSQU0gYnVzIHdpZHRoIgpAQCAtNTY1LDcgKzUxOSw3IEBACiAKIGNvbmZpZyBSQU1BVVRPQklUCiAJYm9vbCAiQVVUTyIKLQktLS1oZWxwLS0tCisJaGVscAogCSAgU2VsZWN0IHRoZSBwaHlzaWNhbCBSQU0gZGF0YSBidXMgc2l6ZS4gTm90IG5lZWRlZCBvbiBtb3N0IHBsYXRmb3JtcywKIAkgIHNvIHlvdSBjYW4gZ2VuZXJhbGx5IGNob29zZSBBVVRPLgogCkBAIC01OTksNyArNTUzLDkgQEAKIGNvbmZpZyBST01LRVJORUwKIAlib29sICJST00iCiAJaGVscAotCSAgVGhlIGtlcm5lbCB3aWxsIGJlIHJlc2lkZW50IGluIEZMQVNIL1JPTSB3aGVuIHJ1bm5pbmcuCisJICBUaGUga2VybmVsIHdpbGwgYmUgcmVzaWRlbnQgaW4gRkxBU0gvUk9NIHdoZW4gcnVubmluZy4gVGhpcyBpcworCSAgb2Z0ZW4gcmVmZXJyZWQgdG8gYXMgRXhlY3V0ZS1pbi1QbGFjZSAoWElQKSwgc2luY2UgdGhlIGtlcm5lbAorCSAgY29kZSBleGVjdXRlcyBmcm9tIHRoZSBwb3NpdGlvbiBpdCBpcyBzdG9yZWQgaW4gdGhlIEZMQVNIL1JPTS4KIAogZW5kY2hvaWNlCiAKZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9tNjhrbm9tbXUva2VybmVsL3NldHVwLmMKaW5kZXggOTMxMjBiOS4uOTlkMDM4ZSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrbm9tbXUva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9tNjhrbm9tbXUva2VybmVsL3NldHVwLmMKQEAgLTQyLDcgKzQyLDYgQEAKICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2VuZGlmCiAKLXVuc2lnbmVkIGxvbmcgcm9tX2xlbmd0aDsKIHVuc2lnbmVkIGxvbmcgbWVtb3J5X3N0YXJ0OwogdW5zaWduZWQgbG9uZyBtZW1vcnlfZW5kOwogCkBAIC01NiwyOSArNTUsMjkgQEAKIHsKIH0KIAotdm9pZCAoKm1hY2hfc2NoZWRfaW5pdCkgKGlycXJldHVybl90ICgqaGFuZGxlcikoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopKSA9IE5VTEw7Ci12b2lkICgqbWFjaF90aWNrKSggdm9pZCApID0gTlVMTDsKK3ZvaWQgKCptYWNoX3NjaGVkX2luaXQpIChpcnFyZXR1cm5fdCAoKmhhbmRsZXIpKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKSk7Cit2b2lkICgqbWFjaF90aWNrKSggdm9pZCApOwogLyogbWFjaGluZSBkZXBlbmRlbnQga2V5Ym9hcmQgZnVuY3Rpb25zICovCi1pbnQgKCptYWNoX2tleWJfaW5pdCkgKHZvaWQpID0gTlVMTDsKLWludCAoKm1hY2hfa2JkcmF0ZSkgKHN0cnVjdCBrYmRfcmVwZWF0ICopID0gTlVMTDsKLXZvaWQgKCptYWNoX2tiZF9sZWRzKSAodW5zaWduZWQgaW50KSA9IE5VTEw7CitpbnQgKCptYWNoX2tleWJfaW5pdCkgKHZvaWQpOworaW50ICgqbWFjaF9rYmRyYXRlKSAoc3RydWN0IGtiZF9yZXBlYXQgKik7Cit2b2lkICgqbWFjaF9rYmRfbGVkcykgKHVuc2lnbmVkIGludCk7CiAvKiBtYWNoaW5lIGRlcGVuZGVudCBpcnEgZnVuY3Rpb25zICovCi12b2lkICgqbWFjaF9pbml0X0lSUSkgKHZvaWQpID0gTlVMTDsKLWlycXJldHVybl90ICgqKCptYWNoX2RlZmF1bHRfaGFuZGxlcilbXSkgKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKSA9IE5VTEw7Ci1pbnQgKCptYWNoX2dldF9pcnFfbGlzdCkgKHN0cnVjdCBzZXFfZmlsZSAqLCB2b2lkICopID0gTlVMTDsKLXZvaWQgKCptYWNoX3Byb2Nlc3NfaW50KSAoaW50IGlycSwgc3RydWN0IHB0X3JlZ3MgKmZwKSA9IE5VTEw7Cit2b2lkICgqbWFjaF9pbml0X0lSUSkgKHZvaWQpOworaXJxcmV0dXJuX3QgKCooKm1hY2hfZGVmYXVsdF9oYW5kbGVyKVtdKSAoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopOworaW50ICgqbWFjaF9nZXRfaXJxX2xpc3QpIChzdHJ1Y3Qgc2VxX2ZpbGUgKiwgdm9pZCAqKTsKK3ZvaWQgKCptYWNoX3Byb2Nlc3NfaW50KSAoaW50IGlycSwgc3RydWN0IHB0X3JlZ3MgKmZwKTsKIHZvaWQgKCptYWNoX3RyYXBfaW5pdCkgKHZvaWQpOwogLyogbWFjaGluZSBkZXBlbmRlbnQgdGltZXIgZnVuY3Rpb25zICovCi11bnNpZ25lZCBsb25nICgqbWFjaF9nZXR0aW1lb2Zmc2V0KSAodm9pZCkgPSBOVUxMOwotdm9pZCAoKm1hY2hfZ2V0dG9kKSAoaW50KiwgaW50KiwgaW50KiwgaW50KiwgaW50KiwgaW50KikgPSBOVUxMOwotaW50ICgqbWFjaF9od2NsaykgKGludCwgc3RydWN0IGh3Y2xrX3RpbWUqKSA9IE5VTEw7Ci1pbnQgKCptYWNoX3NldF9jbG9ja19tbXNzKSAodW5zaWduZWQgbG9uZykgPSBOVUxMOwotdm9pZCAoKm1hY2hfbWtzb3VuZCkoIHVuc2lnbmVkIGludCBjb3VudCwgdW5zaWduZWQgaW50IHRpY2tzICkgPSBOVUxMOwotdm9pZCAoKm1hY2hfcmVzZXQpKCB2b2lkICkgPSBOVUxMOwordW5zaWduZWQgbG9uZyAoKm1hY2hfZ2V0dGltZW9mZnNldCkgKHZvaWQpOwordm9pZCAoKm1hY2hfZ2V0dG9kKSAoaW50KiwgaW50KiwgaW50KiwgaW50KiwgaW50KiwgaW50Kik7CitpbnQgKCptYWNoX2h3Y2xrKSAoaW50LCBzdHJ1Y3QgaHdjbGtfdGltZSopOworaW50ICgqbWFjaF9zZXRfY2xvY2tfbW1zcykgKHVuc2lnbmVkIGxvbmcpOwordm9pZCAoKm1hY2hfbWtzb3VuZCkoIHVuc2lnbmVkIGludCBjb3VudCwgdW5zaWduZWQgaW50IHRpY2tzICk7Cit2b2lkICgqbWFjaF9yZXNldCkoIHZvaWQgKTsKIHZvaWQgKCp3YWl0YnV0KSh2b2lkKSA9IGR1bW15X3dhaXRidXQ7Ci12b2lkICgqbWFjaF9kZWJ1Z19pbml0KSh2b2lkKSA9IE5VTEw7Ci12b2lkICgqbWFjaF9oYWx0KSggdm9pZCApID0gTlVMTDsKLXZvaWQgKCptYWNoX3Bvd2VyX29mZikoIHZvaWQgKSA9IE5VTEw7Cit2b2lkICgqbWFjaF9kZWJ1Z19pbml0KSh2b2lkKTsKK3ZvaWQgKCptYWNoX2hhbHQpKCB2b2lkICk7Cit2b2lkICgqbWFjaF9wb3dlcl9vZmYpKCB2b2lkICk7CiAKIAogI2lmZGVmIENPTkZJR19NNjgwMDAKQEAgLTEyOSw2ICsxMjgsOSBAQAogI2lmIGRlZmluZWQoQ09ORklHX001MzA3KQogCSNkZWZpbmUJQ1BVICJDT0xERklSRShtNTMwNykiCiAjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19NNTMyeCkKKwkjZGVmaW5lCUNQVSAiQ09MREZJUkUobTUzMngpIgorI2VuZGlmCiAjaWYgZGVmaW5lZChDT05GSUdfTTU0MDcpCiAJI2RlZmluZQlDUFUgIkNPTERGSVJFKG01NDA3KSIKICNlbmRpZgpAQCAtMjY3LDM0ICsyNjksNiBAQAogCXBhZ2luZ19pbml0KCk7CiB9CiAKLWludCBnZXRfY3B1aW5mbyhjaGFyICogYnVmZmVyKQotewotICAgIGNoYXIgKmNwdSwgKm1tdSwgKmZwdTsKLSAgICB1X2xvbmcgY2xvY2tmcmVxOwotCi0gICAgY3B1ID0gQ1BVOwotICAgIG1tdSA9ICJub25lIjsKLSAgICBmcHUgPSAibm9uZSI7Ci0KLSNpZmRlZiBDT05GSUdfQ09MREZJUkUKLSAgICBjbG9ja2ZyZXEgPSAobG9vcHNfcGVyX2ppZmZ5KkhaKSozOwotI2Vsc2UKLSAgICBjbG9ja2ZyZXEgPSAobG9vcHNfcGVyX2ppZmZ5KkhaKSoxNjsKLSNlbmRpZgotCi0gICAgcmV0dXJuKHNwcmludGYoYnVmZmVyLCAiQ1BVOlx0XHQlc1xuIgotCQkgICAiTU1VOlx0XHQlc1xuIgotCQkgICAiRlBVOlx0XHQlc1xuIgotCQkgICAiQ2xvY2tpbmc6XHQlbHUuJTFsdU1IelxuIgotCQkgICAiQm9nb01pcHM6XHQlbHUuJTAybHVcbiIKLQkJICAgIkNhbGlicmF0aW9uOlx0JWx1IGxvb3BzXG4iLAotCQkgICBjcHUsIG1tdSwgZnB1LAotCQkgICBjbG9ja2ZyZXEvMTAwMDAwMCwoY2xvY2tmcmVxLzEwMDAwMCklMTAsCi0JCSAgIChsb29wc19wZXJfamlmZnkqSFopLzUwMDAwMCwoKGxvb3BzX3Blcl9qaWZmeSpIWikvNTAwMCklMTAwLAotCQkgICAobG9vcHNfcGVyX2ppZmZ5KkhaKSkpOwotCi19Ci0KIC8qCiAgKglHZXQgQ1BVIGluZm9ybWF0aW9uIGZvciB1c2UgYnkgdGhlIHByb2Nmcy4KICAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrbm9tbXUva2VybmVsL3NpZ25hbC5jIGIvYXJjaC9tNjhrbm9tbXUva2VybmVsL3NpZ25hbC5jCmluZGV4IDhlMmM1YTguLjQzN2Y4YzYgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4a25vbW11L2tlcm5lbC9zaWduYWwuYworKysgYi9hcmNoL202OGtub21tdS9rZXJuZWwvc2lnbmFsLmMKQEAgLTYwOCw3ICs2MDgsNyBAQAogCWlmIChyZWdzLT5zdGthZGopIHsKIAkJc3RydWN0IHB0X3JlZ3MgKnRyZWdzID0KIAkJCShzdHJ1Y3QgcHRfcmVncyAqKSgodWxvbmcpcmVncyArIHJlZ3MtPnN0a2Fkaik7Ci0jaWYgREVCVUcKKyNpZiBkZWZpbmVkKERFQlVHKQogCQlwcmludGsoS0VSTl9ERUJVRyAiUGVyZm9ybWluZyBzdGFja2FkanVzdD0lMDR4XG4iLCByZWdzLT5zdGthZGopOwogI2VuZGlmCiAJCS8qIFRoaXMgbXVzdCBiZSBjb3BpZWQgd2l0aCBkZWNyZWFzaW5nIGFkZHJlc3NlcyB0bwpAQCAtNjc4LDcgKzY3OCw3IEBACiAJaWYgKHJlZ3MtPnN0a2FkaikgewogCQlzdHJ1Y3QgcHRfcmVncyAqdHJlZ3MgPQogCQkJKHN0cnVjdCBwdF9yZWdzICopKCh1bG9uZylyZWdzICsgcmVncy0+c3RrYWRqKTsKLSNpZiBERUJVRworI2lmIGRlZmluZWQoREVCVUcpCiAJCXByaW50ayhLRVJOX0RFQlVHICJQZXJmb3JtaW5nIHN0YWNrYWRqdXN0PSUwNHhcbiIsIHJlZ3MtPnN0a2Fkaik7CiAjZW5kaWYKIAkJLyogVGhpcyBtdXN0IGJlIGNvcGllZCB3aXRoIGRlY3JlYXNpbmcgYWRkcmVzc2VzIHRvCmRpZmYgLS1naXQgYS9hcmNoL202OGtub21tdS9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvbTY4a25vbW11L2tlcm5lbC90cmFwcy5jCmluZGV4IDViYzA2ODQuLjQ0ZmY3NGUgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4a25vbW11L2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gvbTY4a25vbW11L2tlcm5lbC90cmFwcy5jCkBAIC05MywxMiArOTMsMTIgQEAKIAlpZiAodXNlcl9tb2RlKCZmcC0+cHRyZWdzKSkKIAkJY3VycmVudC0+dGhyZWFkLmVzcDAgPSAodW5zaWduZWQgbG9uZykgZnA7CiAKLSNpZiBERUJVRworI2lmIGRlZmluZWQoREVCVUcpCiAJcHJpbnRrIChLRVJOX0RFQlVHICIqKiogQnVzIEVycm9yICoqKiBGb3JtYXQgaXMgJXhcbiIsIGZwLT5wdHJlZ3MuZm9ybWF0KTsKICNlbmRpZgogCiAJZGllX2lmX2tlcm5lbCgiYmFkIGZyYW1lIGZvcm1hdCIsJmZwLT5wdHJlZ3MsMCk7Ci0jaWYgREVCVUcKKyNpZiBkZWZpbmVkKERFQlVHKQogCXByaW50ayhLRVJOX0RFQlVHICJVbmtub3duIFNJR1NFR1YgLSA0XG4iKTsKICNlbmRpZgogCWZvcmNlX3NpZyhTSUdTRUdWLCBjdXJyZW50KTsKZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L2tlcm5lbC92bWxpbnV4Lmxkcy5TIGIvYXJjaC9tNjhrbm9tbXUva2VybmVsL3ZtbGludXgubGRzLlMKaW5kZXggYTMzMWNjOTAuLjZhMmYwYzYgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4a25vbW11L2tlcm5lbC92bWxpbnV4Lmxkcy5TCisrKyBiL2FyY2gvbTY4a25vbW11L2tlcm5lbC92bWxpbnV4Lmxkcy5TCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqCXZtbGludXgubGRzLlMgLS0gbWFzdGVyIGxpbmtlciBzY3JpcHQgZm9yIG02OGtub21tdSBhcmNoCiAgKgotICoJKEMpIENvcHlyaWdodCAyMDAyLTIwMDQsIEdyZWcgVW5nZXJlciA8Z2VyZ0BzbmFwZ2Vhci5jb20+CisgKgkoQykgQ29weXJpZ2h0IDIwMDItMjAwNiwgR3JlZyBVbmdlcmVyIDxnZXJnQHNuYXBnZWFyLmNvbT4KICAqCiAgKglUaGlzIGVuZHMgdXAgbG9va2luZyBjb21waWxjYXRlZCwgYmVjYXVzZSBvZiB0aGUgbnVtYmVyIG9mCiAgKglhZGRyZXNzIHZhcmlhdGlvbnMgZm9yIHJhbSBhbmQgcm9tL2ZsYXNoIGxheW91dHMuIFRoZSByZWFsCkBAIC0yMiwxMyArMjIsNyBAQAogI2RlZmluZQlST01fU1RBUlQJMHgxMGMxMDQwMAogI2RlZmluZQlST01fTEVOR1RICTB4ZmVjMDAKICNkZWZpbmUJUk9NX0VORAkJMHgxMGQwMDAwMAotI2RlZmluZQlSQU1WRUNfU1RBUlQJMHgwMDAwMDAwMAotI2RlZmluZQlSQU1WRUNfTEVOR1RICTB4NDAwCi0jZGVmaW5lCVJBTV9TVEFSVAkweDEwMDAwNDAwCi0jZGVmaW5lCVJBTV9MRU5HVEgJMHhmZmMwMAotI2RlZmluZQlSQU1fRU5ECQkweDEwMTAwMDAwCi0jZGVmaW5lIF9yYW1lbmQJX3JhbV9lbmRfbm90dXNlZAotI2RlZmluZQlEQVRBX0FERFIJUkFNX1NUQVJUCisjZGVmaW5lCURBVEFfQUREUglDT05GSUdfS0VSTkVMQkFTRQogI2VuZGlmCiAKIC8qCkBAIC00MSwxMSArMzUsNiBAQAogI2RlZmluZQlST01fU1RBUlQJMHgxMGMxMDQwMAogI2RlZmluZQlST01fTEVOR1RICTB4MWVmYzAwCiAjZGVmaW5lCVJPTV9FTkQJCTB4MTBlMDAwMDAKLSNkZWZpbmUJUkFNVkVDX1NUQVJUCTB4MDAwMDAwMDAKLSNkZWZpbmUJUkFNVkVDX0xFTkdUSAkweDQwMAotI2RlZmluZQlSQU1fU1RBUlQJMHgwMDAyMDQwMAotI2RlZmluZQlSQU1fTEVOR1RICTB4N2RmYzAwCi0jZGVmaW5lCVJBTV9FTkQJCTB4MDA4MDAwMDAKICNlbmRpZgogI2lmZGVmIENPTkZJR19ST01LRVJORUwKICNkZWZpbmUJUk9NVkVDX1NUQVJUCTB4MTBjMTAwMDAKQEAgLTUzLDExICs0Miw2IEBACiAjZGVmaW5lCVJPTV9TVEFSVAkweDEwYzEwNDAwCiAjZGVmaW5lCVJPTV9MRU5HVEgJMHgxZWZjMDAKICNkZWZpbmUJUk9NX0VORAkJMHgxMGUwMDAwMAotI2RlZmluZQlSQU1WRUNfU1RBUlQJMHgwMDAwMDAwMAotI2RlZmluZQlSQU1WRUNfTEVOR1RICTB4NDAwCi0jZGVmaW5lCVJBTV9TVEFSVAkweDAwMDIwMDAwCi0jZGVmaW5lCVJBTV9MRU5HVEgJMHg2MDAwMDAKLSNkZWZpbmUJUkFNX0VORAkJMHgwMDgwMDAwMAogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0hJTUVNS0VSTkVMCiAjZGVmaW5lCVJPTVZFQ19TVEFSVAkweDAwNjAwMDAwCkBAIC02NSwxNDEgKzQ5LDI4IEBACiAjZGVmaW5lCVJPTV9TVEFSVAkweDAwNjAwNDAwCiAjZGVmaW5lCVJPTV9MRU5HVEgJMHgxZWZjMDAKICNkZWZpbmUJUk9NX0VORAkJMHgwMDdmMDAwMAotI2RlZmluZQlSQU1WRUNfU1RBUlQJMHgwMDAwMDAwMAotI2RlZmluZQlSQU1WRUNfTEVOR1RICTB4NDAwCi0jZGVmaW5lCVJBTV9TVEFSVAkweDAwMDIwMDAwCi0jZGVmaW5lCVJBTV9MRU5HVEgJMHg1ZTAwMDAKLSNkZWZpbmUJUkFNX0VORAkJMHgwMDYwMDAwMAogI2VuZGlmCiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19EUkFHRU4yCi0jZGVmaW5lCVJBTV9TVEFSVAkweDEwMDAwCi0jZGVmaW5lCVJBTV9MRU5HVEgJMHg3ZjAwMDAKLSNlbmRpZgotCiAjaWZkZWYgQ09ORklHX1VDUVVJQ0MKICNkZWZpbmUJUk9NVkVDX1NUQVJUCTB4MDAwMDAwMDAKICNkZWZpbmUJUk9NVkVDX0xFTkdUSAkweDQwNAogI2RlZmluZQlST01fU1RBUlQJMHgwMDAwMDQwNAogI2RlZmluZQlST01fTEVOR1RICTB4MWZmNmZjCiAjZGVmaW5lCVJPTV9FTkQJCTB4MDAyMDAwMDAKLSNkZWZpbmUJUkFNVkVDX1NUQVJUCTB4MDAyMDAwMDAKLSNkZWZpbmUJUkFNVkVDX0xFTkdUSAkweDQwNAotI2RlZmluZQlSQU1fU1RBUlQJMHgwMDIwMDQwNAotI2RlZmluZQlSQU1fTEVOR1RICTB4MWZmNmZjCi0jZGVmaW5lCVJBTV9FTkQJCTB4MDA0MDAwMDAKLSNlbmRpZgotCi0vKgotICoJVGhlIHN0YW5kYXJkIEFybmV3c2ggNTIwNiBib2FyZCBvbmx5IGhhcyAxTWlCIG9mIHJhbS4gTm90IG5vcm1hbGx5Ci0gKgllbm91Z2ggdG8gYmUgdXNlZnVsLiBBc3N1bWUgdGhlIHVzZXIgaGFzIGZpdHRlZCBzb21ldGhpbmcgbGFyZ2VyLAotICoJYXQgbGVhc3QgNE1pQiBpbiBzaXplLiBObyBwb2ludCBpbiBub3QgbGV0dGluZyB0aGUga2VybmVsIGNvbXBsZXRlbHkKLSAqCWxpbmssIGl0IHdpbGwgYmUgb2J2aW91cyBpZiBpdCBpcyB0b28gYmlnIHdoZW4gdGhleSBnbyB0byBsb2FkIGl0LgotICovCi0jaWYgZGVmaW5lZChDT05GSUdfQVJONTIwNikKLSNkZWZpbmUJUkFNX1NUQVJUCTB4MTAwMDAKLSNkZWZpbmUJUkFNX0xFTkdUSAkweDNmMDAwMAotI2VuZGlmCi0KLS8qCi0gKglUaGUgTW90b3JvbGEgNTIwNmVMSVRFIGJvYXJkIG9ubHkgaGFzIDFNaUIgb2Ygc3RhdGljIFJBTS4KLSAqLwotI2lmIGRlZmluZWQoQ09ORklHX0VMSVRFKQotI2RlZmluZQlSQU1fU1RBUlQJMHgzMDAyMDAwMAotI2RlZmluZQlSQU1fTEVOR1RICTB4ZTAwMDAKLSNlbmRpZgotCi0vKgotICoJQWxsIHRoZSBNb3Rvcm9sYSBldmFsIGJvYXJkcyBoYXZlIHRoZSBzYW1lIGJhc2ljIGFycmFuZ2VtZW50LgotICoJVGhlIGVuZCBvZiBSQU0gd2lsbCB2YXJ5IGRlcGVuZGluZyBvbiBob3cgbXVjaCByYW0gaXMgZml0dGVkLAotICoJYnV0IHRoaXMgaXNuJ3QgaW1wb3J0YW50IGhlcmUsIHdlIGFzc3VtZSBhdCBsZWFzdCA0TWlCLgotICovCi0jaWYgZGVmaW5lZChDT05GSUdfTTUyMDZlQzMpIHx8IGRlZmluZWQoQ09ORklHX001MjQ5QzMpIHx8IFwKLSAgICBkZWZpbmVkKENPTkZJR19NNTI3MkMzKSB8fCBkZWZpbmVkKENPTkZJR19NNTMwN0MzKSB8fCBcCi0gICAgZGVmaW5lZChDT05GSUdfQVJONTMwNykgfHwgZGVmaW5lZChDT05GSUdfTTU0MDdDMykgfHwgXAotICAgIGRlZmluZWQoQ09ORklHX001MjcxRVZCKSB8fCBkZWZpbmVkKENPTkZJR19NNTI3NUVWQikgfHwgXAotICAgIGRlZmluZWQoQ09ORklHX001MjM1RVZCKQotI2RlZmluZQlSQU1fU1RBUlQJMHgyMDAwMAotI2RlZmluZQlSQU1fTEVOR1RICTB4M2UwMDAwCi0jZW5kaWYKLQotLyoKLSAqCVRoZSBGcmVlc2NhbGUgNTIwOEVWQiBib2FyZCBoYXMgMzJNQiBvZiBSQU0uCi0gKi8KLSNpZiBkZWZpbmVkKENPTkZJR19NNTIwOEVWQikKLSNkZWZpbmUJUkFNX1NUQVJUCTB4NDAwMjAwMDAKLSNkZWZpbmUJUkFNX0xFTkdUSAkweDAxZmUwMDAwCi0jZW5kaWYKLQotLyoKLSAqCVRoZSBzZW5UZWMgQ09CUkE1MjcyIGJvYXJkIGhhcyBuZWFybHkgdGhlIHNhbWUgbWVtb3J5IGxheW91dCBhcyAKLSAqCXRoZSBNNTI3MkMzLiBXZSBhc3N1bWUgMTZNaUIgcmFtLgotICovCi0jaWYgZGVmaW5lZChDT05GSUdfQ09CUkE1MjcyKQotI2RlZmluZSBSQU1fU1RBUlQgICAweDIwMDAwCi0jZGVmaW5lIFJBTV9MRU5HVEggIDB4ZmUwMDAwCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoQ09ORklHX001MjgyRVZCKQotI2RlZmluZQlSQU1fU1RBUlQJMHgxMDAwMAotI2RlZmluZQlSQU1fTEVOR1RICTB4M2YwMDAwCi0jZW5kaWYKLQotLyoKLSAqCVRoZSBzZW5UZWMgQ09CUkE1MjgyIGJvYXJkIGhhcyB0aGUgc2FtZSBtZW1vcnkgbGF5b3V0IGFzIHRoZSBNNTI4MkVWQi4KLSAqLwotI2lmIGRlZmluZWQoQ09ORklHX0NPQlJBNTI4MikKLSNkZWZpbmUgIFJBTV9TVEFSVCAgIDB4MTAwMDAKLSNkZWZpbmUgIFJBTV9MRU5HVEggIDB4M2YwMDAwCi0jZW5kaWYKLQotCi0vKgotICoJVGhlIEVNQUMgU29NLTUyODJFTSBtb2R1bGUuCi0gKi8KLSNpZiBkZWZpbmVkKENPTkZJR19TT001MjgyRU0pCi0jZGVmaW5lICBSQU1fU1RBUlQgICAweDEwMDAwCi0jZGVmaW5lICBSQU1fTEVOR1RIICAweGZmMDAwMAotI2VuZGlmCi0KLQotLyoKLSAqCVRoZXNlIGZsYXNoIGJvb3QgYm9hcmRzIHVzZSBhbGwgb2YgcmFtIGZvciBvcGVyYXRpb24uIEFnYWluIHRoZQotICoJYWN0dWFsIG1lbW9yeSBzaXplIGlzIG5vdCBpbXBvcnRhbnQgaGVyZSwgYXNzdW1lIGF0IGxlYXN0IDRNaUIuCi0gKglUaGV5IGN1cnJlbnRseSBoYXZlIG5vIHN1cHBvcnQgZm9yIHJ1bm5pbmcgaW4gZmxhc2guCi0gKi8KLSNpZiBkZWZpbmVkKENPTkZJR19ORVR0ZWwpIHx8IGRlZmluZWQoQ09ORklHX2VMSUEpIHx8IFwKLSAgICBkZWZpbmVkKENPTkZJR19ESVNLdGVsKSB8fCBkZWZpbmVkKENPTkZJR19TRUNVUkVFREdFTVAzKSB8fCBcCi0gICAgZGVmaW5lZChDT05GSUdfSFdfRkVJVEgpCi0jZGVmaW5lCVJBTV9TVEFSVAkweDQwMAotI2RlZmluZQlSQU1fTEVOR1RICTB4M2ZmYzAwCi0jZW5kaWYKLQotLyoKLSAqCVNuZWhhIEJvYXJkcyBtaW1pbXVuIG1lbW9yeQotICoJVGhlIGVuZCBvZiBSQU0gd2lsbCB2YXJ5IGRlcGVuZGluZyBvbiBob3cgbXVjaCByYW0gaXMgZml0dGVkLAotICoJYnV0IHRoaXMgaXNuJ3QgaW1wb3J0YW50IGhlcmUsIHdlIGFzc3VtZSBhdCBsZWFzdCA0TWlCLgotICovCi0jaWYgZGVmaW5lZChDT05GSUdfQ1BVMTZCKSAgIAotI2RlZmluZQlSQU1fU1RBUlQJMHgyMDAwMAotI2RlZmluZQlSQU1fTEVOR1RICTB4M2UwMDAwCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoQ09ORklHX01PRDUyNzIpCi0jZGVmaW5lIFJBTV9TVEFSVAkweDAyMDAwMDAwCi0jZGVmaW5lIFJBTV9MRU5HVEgJMHgwMDgwMDAwMAotI2RlZmluZSBSQU1WRUNfU1RBUlQJMHgyMDAwMDAwMAotI2RlZmluZSBSQU1WRUNfTEVOR1RICTB4MDAwMDA0MDAKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfUkFNS0VSTkVMKQorI2RlZmluZQlSQU1fU1RBUlQJQ09ORklHX0tFUk5FTEJBU0UKKyNkZWZpbmUJUkFNX0xFTkdUSAkoQ09ORklHX1JBTUJBU0UgKyBDT05GSUdfUkFNU0laRSAtIENPTkZJR19LRVJORUxCQVNFKQogI2RlZmluZQlURVhUCQlyYW0KICNkZWZpbmUJREFUQQkJcmFtCiAjZGVmaW5lCUlOSVQJCXJhbQogI2RlZmluZQlCU1MJCXJhbQogI2VuZGlmCiAjaWYgZGVmaW5lZChDT05GSUdfUk9NS0VSTkVMKSB8fCBkZWZpbmVkKENPTkZJR19ISU1FTUtFUk5FTCkKKyNkZWZpbmUJUkFNX1NUQVJUCUNPTkZJR19SQU1CQVNFCisjZGVmaW5lCVJBTV9MRU5HVEgJQ09ORklHX1JBTVNJWkUKICNkZWZpbmUJVEVYVAkJcm9tCiAjZGVmaW5lCURBVEEJCXJhbQogI2RlZmluZQlJTklUCQlyYW0KQEAgLTIxNSwxMyArODYsNyBAQAogRU5UUlkoX3N0YXJ0KQogCiBNRU1PUlkgewotI2lmZGVmIFJBTVZFQ19TVEFSVAotCXJhbXZlYwk6IE9SSUdJTiA9IFJBTVZFQ19TVEFSVCwgTEVOR1RIID0gUkFNVkVDX0xFTkdUSAotI2VuZGlmCiAJcmFtCTogT1JJR0lOID0gUkFNX1NUQVJULCBMRU5HVEggPSBSQU1fTEVOR1RICi0jaWZkZWYgUkFNX0VORAotCWVyYW0JOiBPUklHSU4gPSBSQU1fRU5ELCBMRU5HVEggPSAwCi0jZW5kaWYKICNpZmRlZiBST01fU1RBUlQKIAlyb212ZWMJOiBPUklHSU4gPSBST01WRUNfU1RBUlQsIExFTkdUSCA9IFJPTVZFQ19MRU5HVEgKIAlyb20JOiBPUklHSU4gPSBST01fU1RBUlQsIExFTkdUSCA9IFJPTV9MRU5HVEgKQEAgLTMwOCwxMiArMTczLDYgQEAKIAkJX19yb21fZW5kID0gLiA7CiAJfSA+IGVyb20KICNlbmRpZgotI2lmZGVmIFJBTVZFQ19TVEFSVAotCS4gPSBSQU1WRUNfU1RBUlQgOwotCS5yYW12ZWMgOiB7Ci0JCV9fcmFtdmVjID0gLjsKLQl9ID4gcmFtdmVjCi0jZW5kaWYKIAogCS5kYXRhIERBVEFfQUREUiA6IHsKIAkJLiA9IEFMSUdOKDQpOwpAQCAtMzczLDEyICsyMzIsNSBAQAogCQlfZWJzcyA9IC4gOwogCX0gPiBCU1MKIAotI2lmZGVmIFJBTV9FTkQKLQkuID0gUkFNX0VORCA7Ci0JLmVyYW0gOiB7Ci0JCV9fcmFtZW5kID0gLiA7Ci0JCV9yYW1lbmQgPSAuIDsKLQl9ID4gZXJhbQotI2VuZGlmCiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L21tL2luaXQuYyBiL2FyY2gvbTY4a25vbW11L21tL2luaXQuYwppbmRleCBkNzk1MDNmLi43MGQxNjUzIDEwMDY0NAotLS0gYS9hcmNoL202OGtub21tdS9tbS9pbml0LmMKKysrIGIvYXJjaC9tNjhrbm9tbXUvbW0vaW5pdC5jCkBAIC02Myw4ICs2Myw2IEBACiAKIHVuc2lnbmVkIGxvbmcgZW1wdHlfemVyb19wYWdlOwogCi1leHRlcm4gdW5zaWduZWQgbG9uZyByb21fbGVuZ3RoOwotCiB2b2lkIHNob3dfbWVtKHZvaWQpCiB7CiAgICAgdW5zaWduZWQgbG9uZyBpOwpAQCAtMTc4LDExICsxNzYsOSBAQAogCWluaXRrID0gKCZfX2luaXRfYmVnaW4gLSAmX19pbml0X2VuZCkgPj4gMTA7CiAKIAl0bXAgPSBucl9mcmVlX3BhZ2VzKCkgPDwgUEFHRV9TSElGVDsKLQlwcmludGsoS0VSTl9JTkZPICJNZW1vcnkgYXZhaWxhYmxlOiAlbHVrLyVsdWsgUkFNLCAlbHVrLyVsdWsgUk9NICglZGsga2VybmVsIGNvZGUsICVkayBkYXRhKVxuIiwKKwlwcmludGsoS0VSTl9JTkZPICJNZW1vcnkgYXZhaWxhYmxlOiAlbHVrLyVsdWsgUkFNLCAoJWRrIGtlcm5lbCBjb2RlLCAlZGsgZGF0YSlcbiIsCiAJICAgICAgIHRtcCA+PiAxMCwKIAkgICAgICAgbGVuID4+IDEwLAotCSAgICAgICAocm9tX2xlbmd0aCA+IDApID8gKChyb21fbGVuZ3RoID4+IDEwKSAtIGNvZGVrKSA6IDAsCi0JICAgICAgIHJvbV9sZW5ndGggPj4gMTAsCiAJICAgICAgIGNvZGVrLAogCSAgICAgICBkYXRhawogCSAgICAgICApOwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNTMwNy9NYWtlZmlsZSBiL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzUzMDcvTWFrZWZpbGUKaW5kZXggOGQxNjE5ZC4uMmZkMzdkYyAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNTMwNy9NYWtlZmlsZQorKysgYi9hcmNoL202OGtub21tdS9wbGF0Zm9ybS81MzA3L01ha2VmaWxlCkBAIC0yNSw2ICsyNSw3IEBACiBvYmotJChDT05GSUdfTTUyN3gpICAgICArPSBwaXQubwogb2JqLSQoQ09ORklHX001MjcyKQkrPSB0aW1lcnMubwogb2JqLSQoQ09ORklHX001MzA3KQkrPSBjb25maWcubyB0aW1lcnMubworb2JqLSQoQ09ORklHX001MzJ4KQkrPSB0aW1lcnMubwogb2JqLSQoQ09ORklHX001Mjh4KSAgICAgKz0gcGl0Lm8KIG9iai0kKENPTkZJR19NNTQwNykJKz0gdGltZXJzLm8KIApkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNTMwNy9lbnRyeS5TIGIvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNTMwNy9lbnRyeS5TCmluZGV4IDg5YjE4MGQuLjlkZGY1NDcgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzUzMDcvZW50cnkuUworKysgYi9hcmNoL202OGtub21tdS9wbGF0Zm9ybS81MzA3L2VudHJ5LlMKQEAgLTQsOCArNCw4IEBACiAgKiAgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDIsIEdyZWcgVW5nZXJlciAoZ2VyZ0BzbmFwZ2Vhci5jb20pCiAgKiAgQ29weXJpZ2h0IChDKSAxOTk4ICBELiBKZWZmIERpb25uZSA8amVmZkBsaW5lby5jYT4sCiAgKiAgICAgICAgICAgICAgICAgICAgICBLZW5uZXRoIEFsYmFub3dza2kgPGtqYWhkc0BramFoZHMuY29tPiwKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDAgIExpbmVvIEluYy4gKHd3dy5saW5lby5jb20pIAotICogIENvcHlyaWdodCAoQykgMjAwNCAgTWFjcSBFbGVjdHJvbmlxdWUgU0EuICh3d3cubWFjcWVsLmNvbSkKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDAgIExpbmVvIEluYy4gKHd3dy5saW5lby5jb20pCisgKiAgQ29weXJpZ2h0IChDKSAyMDA0LTIwMDYgIE1hY3EgRWxlY3Ryb25pcXVlIFNBLiAod3d3Lm1hY3FlbC5jb20pCiAgKgogICogQmFzZWQgb246CiAgKgpAQCAtNTYsMzIgKzU2LDI3IEBACiAuZ2xvYmwgaW50aGFuZGxlcgogLmdsb2JsIGZhc3RoYW5kbGVyCiAKK2Vub3N5czoKKwltb3YubAkjc3lzX25pX3N5c2NhbGwsJWQzCisJYnJhCTFmCisKIEVOVFJZKHN5c3RlbV9jYWxsKQogCVNBVkVfQUxMCiAJbW92ZQkjMHgyMDAwLCVzcgkJLyogZW5hYmxlIGludHJzIGFnYWluICovCiAKLQltb3ZlbAkjLUxFTk9TWVMsJWQyCi0JbW92ZWwJJWQyLFBUX0QwKCVzcCkJCS8qIGRlZmF1bHQgcmV0dXJuIHZhbHVlIGluIGQwICovCi0JCQkJCS8qIG9yaWdpbmFsIEQwIGlzIGluIG9yaWdfZDAgKi8KLQltb3ZlbAklZDAsJWQyCi0KLQkvKiBzYXZlIHRvcCBvZiBmcmFtZSAqLwotCXBlYQklc3BACi0JamJzcglzZXRfZXNwMAotCWFkZHFsCSM0LCVzcAotCi0JY21wbAkjTlJfc3lzY2FsbHMsJWQyCi0JamNjCXJldF9mcm9tX2V4Y2VwdGlvbgorCWNtcGwJI05SX3N5c2NhbGxzLCVkMAorCWpjYwllbm9zeXMKIAlsZWEJc3lzX2NhbGxfdGFibGUsJWEwCi0JbHNsbAkjMiwlZDIJCQkvKiBtb3ZlbCAlYTBAKCVkMjpsOjQpLCVkMyAqLwotCW1vdmVsCSVhMEAoJWQyKSwlZDMKLQlqZXEJcmV0X2Zyb21fZXhjZXB0aW9uCi0JbHNybAkjMiwlZDIKKwlsc2xsCSMyLCVkMAkJCS8qIG1vdmVsICVhMEAoJWQwOmw6NCksJWQzICovCisJbW92ZWwJJWEwQCglZDApLCVkMworCWplcQllbm9zeXMKIAorMToKIAltb3ZlbAklc3AsJWQyCQkJLyogZ2V0IHRocmVhZF9pbmZvIHBvaW50ZXIgKi8KIAlhbmRsCSMtVEhSRUFEX1NJWkUsJWQyCS8qIGF0IHN0YXJ0IG9mIGtlcm5lbCBzdGFjayAqLwogCW1vdmVsCSVkMiwlYTAKLQlidHN0CSNUSUZfU1lTQ0FMTF9UUkFDRSwlYTBAKFRJX0ZMQUdTKQorCW1vdmVsCSVzcCwlYTBAKFRIUkVBRF9FU1AwKQkvKiBzYXZlIHRvcCBvZiBmcmFtZSAqLworCWJ0c3QJIyhUSUZfU1lTQ0FMTF9UUkFDRSU4KSwlYTBAKFRJX0ZMQUdTKygzMS1USUZfU1lTQ0FMTF9UUkFDRSkvOCkKIAlibmVzCTFmCiAKIAltb3ZlbAklZDMsJWEwCkBAIC0xMjYsOCArMTIxLDggQEAKIAlqbmUJTHdvcmtfdG9fZG8JCS8qIHN0aWxsIHdvcmsgdG8gZG8gKi8KIAogTHJldHVybjoKLQltb3ZlICAgICMweDI3MDAsJXNyCQkvKiBkaXNhYmxlIGludHJzICovCi0JbW92ZWwgICBzd191c3AsJWEwCQkvKiBnZXQgdXNwICovCisJbW92ZQkjMHgyNzAwLCVzcgkJLyogZGlzYWJsZSBpbnRycyAqLworCW1vdmVsCXN3X3VzcCwlYTAJCS8qIGdldCB1c3AgKi8KIAltb3ZlbAklc3BAKFBUX1BDKSwlYTBALQkvKiBjb3B5IGV4Y2VwdGlvbiBwcm9ncmFtIGNvdW50ZXIgKi8KIAltb3ZlbAklc3BAKFBUX0ZPUk1BVFZFQyksJWEwQC0vKiBjb3B5IGV4Y2VwdGlvbiBmb3JtYXQvdmVjdG9yL3NyICovCiAJbW92ZW1sCSVzcEAsJWQxLSVkNS8lYTAtJWEyCkBAIC0xNzAsNyArMTY1LDcgQEAKIAltb3ZlbAklZDAsJXNwQChQVF9PUklHX0QwKQogCWFkZHFsCSMxLGxvY2FsX2lycV9jb3VudAogCi0JbW92ZXcgICAlc3BAKFBUX0ZPUk1BVFZFQyksJWQwCS8qIHB1dCBleGNlcHRpb24gIyBpbiBkMCAqLworCW1vdmV3CSVzcEAoUFRfRk9STUFUVkVDKSwlZDAJLyogcHV0IGV4Y2VwdGlvbiAjIGluIGQwICovCiAJYW5kbAkjMHgwM2ZjLCVkMAkJLyogbWFzayBvdXQgdmVjdG9yIG9ubHkgKi8KIAogCWxlYWwJcGVyX2NwdV9fa3N0YXQrU1RBVF9JUlEsJWEwCkBAIC0xODQsNyArMTc5LDcgQEAKIAogCW1vdmVsCSVzcCwlc3BALQkJLyogcHVzaCByZWdzIGFyZyBvbnRvIHN0YWNrICovCiAJbW92ZWwJJWEwQCg4KSwlc3BALQkJLyogcHVzaCBkZXZpZCBhcmcgKi8KLQltb3ZlbAklZDAsJXNwQC0gCQkvKiBwdXNoIHZlY3RvciAjIG9uIHN0YWNrICovCisJbW92ZWwJJWQwLCVzcEAtCQkvKiBwdXNoIHZlY3RvciAjIG9uIHN0YWNrICovCiAKIAltb3ZlbAklYTBALCVhMAkJLyogZ2V0IGZ1bmN0aW9uIHRvIGNhbGwgKi8KIAlqYnNyCSVhMEAJCQkvKiBjYWxsIHZlY3RvciBoYW5kbGVyICovCkBAIC0yMDEsNyArMTk2LDcgQEAKIEVOVFJZKGZhc3RoYW5kbGVyKQogCVNBVkVfTE9DQUwKIAotCW1vdmV3ICAgJXNwQChQVF9GT1JNQVRWRUMpLCVkMAorCW1vdmV3CSVzcEAoUFRfRk9STUFUVkVDKSwlZDAKIAlhbmRsCSMweDAzZmMsJWQwCQkvKiBtYXNrIG91dCB2ZWN0b3Igb25seSAqLwogCiAJbGVhbAlwZXJfY3B1X19rc3RhdCtTVEFUX0lSUSwlYTAKQEAgLTIxMCw3ICsyMDUsNyBAQAogCW1vdmVsCSVzcCwlc3BALQkJLyogcHVzaCByZWdzIGFyZyBvbnRvIHN0YWNrICovCiAJY2xybAklc3BALQkJCS8qIHB1c2ggZGV2aWQgYXJnICovCiAJbHNybAkjMiwlZDAJCQkvKiBjYWxjdWxhdGUgcmVhbCB2ZWN0b3IgIyAqLwotCW1vdmVsCSVkMCwlc3BALSAJCS8qIHB1c2ggdmVjdG9yICMgb24gc3RhY2sgKi8KKwltb3ZlbAklZDAsJXNwQC0JCS8qIHB1c2ggdmVjdG9yICMgb24gc3RhY2sgKi8KIAogCWxzbGwJIzQsJWQwCQkJLyogYWRqdXN0IGZvciBhcnJheSBvZmZzZXQgKi8KIAlsZWEJaXJxX2xpc3QsJWEwCkBAIC0yNjUsNCArMjYwLDMgQEAKIAltb3ZldwklYTFAKFRBU0tfVEhSRUFEK1RIUkVBRF9TUiksJWQwCS8qIHJlc3RvcmUgdGhyZWFkIHN0YXR1cyByZWcgKi8KIAltb3ZldwklZDAsICVzcgogCXJ0cwotCmRpZmYgLS1naXQgYS9hcmNoL202OGtub21tdS9wbGF0Zm9ybS81MzA3L2hlYWQuUyBiL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzUzMDcvaGVhZC5TCmluZGV4IGMzMGM0NjIuLjFkOWViMzAgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzUzMDcvaGVhZC5TCisrKyBiL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzUzMDcvaGVhZC5TCkBAIC0zLDcgKzMsNyBAQAogLyoKICAqCWhlYWQuUyAtLSBjb21tb24gc3RhcnR1cCBjb2RlIGZvciBDb2xkRmlyZSBDUFVzLgogICoKLSAqCShDKSBDb3B5cmlnaHQgMTk5OS0yMDA0LCBHcmVnIFVuZ2VyZXIgKGdlcmdAc25hcGdlYXIuY29tKS4KKyAqCShDKSBDb3B5cmlnaHQgMTk5OS0yMDA2LCBHcmVnIFVuZ2VyZXIgPGdlcmdAc25hcGdlYXIuY29tPi4KICAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xOSw0NyArMTksMTUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqCURlZmluZSBmaXhlZCBtZW1vcnkgc2l6ZXMuIENvbmZpZ3VyYXRpb24gb2YgYSBmaXhlZCBtZW1vcnkgc2l6ZQotICoJb3ZlcnJpZGVzIGV2ZXJ5dGhpbmcgZWxzZS4gSWYgdGhlIHVzZXIgZGVmaW5lZCBhIHNpemUgd2UganVzdAotICoJYmxpbmRseSB1c2UgaXQgKHRoZXkga25vdyB3aGF0IHRoZXkgYXJlIGRvaW5nIHJpZ2h0IDotKQotICovCi0jaWYgZGVmaW5lZChDT05GSUdfUkFNMzJNQikKLSNkZWZpbmUgTUVNX1NJWkUJMHgwMjAwMDAwMAkvKiBtZW1vcnkgc2l6ZSAzMk1iICovCi0jZWxpZiBkZWZpbmVkKENPTkZJR19SQU0xNk1CKQotI2RlZmluZSBNRU1fU0laRQkweDAxMDAwMDAwCS8qIG1lbW9yeSBzaXplIDE2TWIgKi8KLSNlbGlmIGRlZmluZWQoQ09ORklHX1JBTThNQikKLSNkZWZpbmUgTUVNX1NJWkUJMHgwMDgwMDAwMAkvKiBtZW1vcnkgc2l6ZSA4TWIgKi8KLSNlbGlmIGRlZmluZWQoQ09ORklHX1JBTTRNQikKLSNkZWZpbmUgTUVNX1NJWkUJMHgwMDQwMDAwMAkvKiBtZW1vcnkgc2l6ZSA0TWIgKi8KLSNlbGlmIGRlZmluZWQoQ09ORklHX1JBTTFNQikKLSNkZWZpbmUgTUVNX1NJWkUJMHgwMDEwMDAwMAkvKiBtZW1vcnkgc2l6ZSAxTWIgKi8KLSNlbmRpZgotCi0vKgotICoJTWVtb3J5IHNpemUgZXhjZXB0aW9ucyBmb3Igc3BlY2lhbCBjYXNlcy4gU29tZSBib2FyZHMgbWF5IGJlIHNldAotICoJZm9yIGF1dG8gbWVtb3J5IHNpemluZywgYnV0IHdlIGNhbid0IGRvIGl0IHRoYXQgd2F5IGZvciBzb21lIHJlYXNvbi4KLSAqCUZvciBleGFtcGxlIHRoZSA1MjA2ZUxJVEUgYm9hcmQgaGFzIHN0YXRpYyBSQU0sIGFuZCBhdXRvLWRldGVjdGluZwotICoJdGhlIFNEUkFNIHdpbGwgZG8geW91IG5vIGdvb2QgYXQgYWxsLiBTYW1lIGdvZXMgZm9yIHRoZSBNT0Q1MjcyLgotICovCi0jaWZkZWYgQ09ORklHX1JBTUFVVE8KLSNpZiBkZWZpbmVkKENPTkZJR19NNTIwNmVMSVRFKQotI2RlZmluZQlNRU1fU0laRQkweDAwMTAwMDAwCS8qIDFNaUIgZGVmYXVsdCBtZW1vcnkgKi8KLSNlbmRpZgotI2lmIGRlZmluZWQoQ09ORklHX01PRDUyNzIpCi0jZGVmaW5lIE1FTV9TSVpFCTB4MDA4MDAwMDAJLyogOE1pQiBkZWZhdWx0IG1lbW9yeSAqLwotI2VuZGlmCi0jZW5kaWYgLyogQ09ORklHX1JBTUFVVE8gKi8KLQotCi0vKgotICoJSWYgd2UgZG9uJ3QgaGF2ZSBhIGZpeGVkIG1lbW9yeSBzaXplIG5vdywgdGhlbiBsZXRzIGJ1aWxkIGluIGNvZGUKKyAqCUlmIHdlIGRvbid0IGhhdmUgYSBmaXhlZCBtZW1vcnkgc2l6ZSwgdGhlbiBsZXRzIGJ1aWxkIGluIGNvZGUKICAqCXRvIGF1dG8gZGV0ZWN0IHRoZSBEUkFNIHNpemUuIE9idmlvdXNseSB0aGlzIGlzIHRoZSBwcmVmZXJlZAotICoJbWV0aG9kLCBhbmQgc2hvdWxkIHdvcmsgZm9yIG1vc3QgYm9hcmRzIChpdCB3b24ndCB3b3JrIGZvciB0aG9zZQotICoJdGhhdCBkbyBub3QgaGF2ZSB0aGVpciBSQU0gc3RhcnRpbmcgYXQgYWRkcmVzcyAwKS4KKyAqCW1ldGhvZCwgYW5kIHNob3VsZCB3b3JrIGZvciBtb3N0IGJvYXJkcy4gSXQgd29uJ3Qgd29yayBmb3IgdGhvc2UKKyAqCXRoYXQgZG8gbm90IGhhdmUgdGhlaXIgUkFNIHN0YXJ0aW5nIGF0IGFkZHJlc3MgMCwgYW5kIGl0IG9ubHkKKyAqCXdvcmtzIG9uIFNEUkFNIChub3QgYm9hcmRzIGZpdHRlZCB3aXRoIFNSQU0pLgogICovCi0jaWYgZGVmaW5lZChNRU1fU0laRSkKKyNpZiBDT05GSUdfUkFNU0laRSAhPSAwCiAubWFjcm8gR0VUX01FTV9TSVpFCi0JbW92ZWwJI01FTV9TSVpFLCVkMAkJLyogaGFyZCBjb2RlZCBtZW1vcnkgc2l6ZSAqLworCW1vdmVsCSNDT05GSUdfUkFNU0laRSwlZDAJLyogaGFyZCBjb2RlZCBtZW1vcnkgc2l6ZSAqLwogLmVuZG0KIAogI2VsaWYgZGVmaW5lZChDT05GSUdfTTUyMDYpIHx8IGRlZmluZWQoQ09ORklHX001MjA2ZSkgfHwgXApAQCAtOTgsMzcgKzY2LDcgQEAKIC5lbmRtCiAKICNlbHNlCi0jZXJyb3IgIkVSUk9SOiBJIGRvbid0IGtub3cgaG93IHRvIGRldGVybWluZSB5b3VyIGJvYXJkcyBtZW1vcnkgc2l6ZT8iCi0jZW5kaWYKLQotCi0vKgotICoJTW9zdCBDb2xkRmlyZSBib2FyZHMgaGF2ZSB0aGVpciBEUkFNIHN0YXJ0aW5nIGF0IGFkZHJlc3MgMC4KLSAqCU5vdGFibGUgZXhjZXB0aW9uIGlzIHRoZSA1MjA2ZUxJVEUgYm9hcmQsIGFub3RoZXIgaXMgdGhlIE1PRDUyNzIuCi0gKi8KLSNpZiBkZWZpbmVkKENPTkZJR19NNTIwNmVMSVRFKQotI2RlZmluZQlNRU1fQkFTRQkweDMwMDAwMDAwCi0jZW5kaWYKLSNpZiBkZWZpbmVkKENPTkZJR19NT0Q1MjcyKQotI2RlZmluZSBNRU1fQkFTRQkweDAyMDAwMDAwCi0jZGVmaW5lIFZCUl9CQVNFCTB4MjAwMDAwMDAJLyogdmVjdG9ycyBpbiBTUkFNICovCi0jZW5kaWYKLSNpZiBkZWZpbmVkKENPTkZJR19NNTIwOEVWQikKLSNkZWZpbmUgTUVNX0JBU0UJMHg0MDAwMDAwMAotI2VuZGlmCi0KLSNpZm5kZWYgTUVNX0JBU0UKLSNkZWZpbmUJTUVNX0JBU0UJMHgwMDAwMDAwMAkvKiBtZW1vcnkgYmFzZSBhdCBhZGRyZXNzIDAgKi8KLSNlbmRpZgotCi0vKgotICoJVGhlIGRlZmF1bHQgbG9jYXRpb24gZm9yIHRoZSB2ZWN0b3JzIGlzIGF0IHRoZSBiYXNlIG9mIFJBTS4KLSAqCVNvbWUgYm9hcmRzIG1pZ2h0IGxpa2UgdG8gdXNlIGludGVybmFsIFNSQU0gb3Igc29tZXRoaW5nIGxpa2UKLSAqCXRoYXQuIElmIG5vIGJvYXJkIHNwZWNpZmljIGhlYWRlciBkZWZpbmVzIGFuIGFsdGVybmF0aXZlIHRoZW4KLSAqCXVzZSB0aGUgYmFzZSBvZiBSQU0uCi0gKi8KLSNpZm5kZWYJVkJSX0JBU0UKLSNkZWZpbmUJVkJSX0JBU0UJTUVNX0JBU0UJLyogdmVjdG9yIGFkZHJlc3MgKi8KKyNlcnJvciAiRVJST1I6IEkgZG9uJ3Qga25vdyBob3cgdG8gcHJvYmUgeW91ciBib2FyZHMgbWVtb3J5IHNpemU/IgogI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTE5MSwxMSArMTI5LDExIEBACiAJICoJQ3JlYXRlIGJhc2ljIG1lbW9yeSBjb25maWd1cmF0aW9uLiBTZXQgVkJSIGFjY29yZGluZ2x5LAogCSAqCWFuZCBzaXplIG1lbW9yeS4KIAkgKi8KLQltb3ZlbAkjVkJSX0JBU0UsJWE3CisJbW92ZWwJI0NPTkZJR19WRUNUT1JCQVNFLCVhNwogCW1vdmVjICAgJWE3LCVWQlIJCQkvKiBzZXQgdmVjdG9ycyBhZGRyICovCiAJbW92ZWwJJWE3LF9yYW12ZWMKIAotCW1vdmVsCSNNRU1fQkFTRSwlYTcJCQkvKiBtYXJrIHRoZSBiYXNlIG9mIFJBTSAqLworCW1vdmVsCSNDT05GSUdfUkFNQkFTRSwlYTcJCS8qIG1hcmsgdGhlIGJhc2Ugb2YgUkFNICovCiAJbW92ZWwJJWE3LF9yYW1iYXNlCiAKIAlHRVRfTUVNX1NJWkUJCQkJLyogbWFjcm8gY29kZSBkZXRlcm1pbmVzIHNpemUgKi8KZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzUzMDcvcGl0LmMgYi9hcmNoL202OGtub21tdS9wbGF0Zm9ybS81MzA3L3BpdC5jCmluZGV4IDMyM2YyNjcuLmVmMTc0NzQgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzUzMDcvcGl0LmMKKysrIGIvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNTMwNy9waXQuYwpAQCAtMSwxMSArMSwxMSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqCXBpdC5jIC0tIE1vdG9yb2xhIENvbGRGaXJlIFBJVCB0aW1lci4gQ3VycmVudGx5IHRoaXMgdHlwZSBvZgotICoJICAgICAgICAgaGFyZHdhcmUgdGltZXIgb25seSBleGlzdHMgaW4gdGhlIE1vdG9yb2xhIENvbGRGaXJlCisgKglwaXQuYyAtLSBGcmVlc2NhbGUgQ29sZEZpcmUgUElUIHRpbWVyLiBDdXJyZW50bHkgdGhpcyB0eXBlIG9mCisgKgkgICAgICAgICBoYXJkd2FyZSB0aW1lciBvbmx5IGV4aXN0cyBpbiB0aGUgRnJlZXNjYWxlIENvbGRGaXJlCiAgKgkJIDUyNzAvNTI3MSwgNTI4MiBhbmQgb3RoZXIgQ1BVcy4KICAqCi0gKglDb3B5cmlnaHQgKEMpIDE5OTktMjAwNCwgR3JlZyBVbmdlcmVyIChnZXJnQHNuYXBnZWFyLmNvbSkKKyAqCUNvcHlyaWdodCAoQykgMTk5OS0yMDA2LCBHcmVnIFVuZ2VyZXIgKGdlcmdAc25hcGdlYXIuY29tKQogICoJQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQsIFNuYXBHZWFyIEluYy4gKHd3dy5zbmFwZ2Vhci5jb20pCiAgKgogICovCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSA8bGludXgvcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9jb2xkZmlyZS5oPgogI2luY2x1ZGUgPGFzbS9tY2ZwaXQuaD4KQEAgLTI1LDEzICsyNiwyMCBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisvKgorICoJQnkgZGVmYXVsdCB1c2UgdGltZXIxIGFzIHRoZSBzeXN0ZW0gY2xvY2sgdGltZXIuCisgKi8KKyNkZWZpbmUJVEEoYSkJKE1DRl9JUFNCQVIgKyBNQ0ZQSVRfQkFTRTEgKyAoYSkpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHZvaWQgY29sZGZpcmVfcGl0X3RpY2sodm9pZCkKIHsKLQl2b2xhdGlsZSBzdHJ1Y3QgbWNmcGl0ICp0cDsKKwl1bnNpZ25lZCBzaG9ydCBwY3NyOwogCiAJLyogUmVzZXQgdGhlIENvbGRGaXJlIHRpbWVyICovCi0JdHAgPSAodm9sYXRpbGUgc3RydWN0IG1jZnBpdCAqKSAoTUNGX0lQU0JBUiArIE1DRlBJVF9CQVNFMSk7Ci0JdHAtPnBjc3IgfD0gTUNGUElUX1BDU1JfUElGOworCXBjc3IgPSBfX3Jhd19yZWFkdyhUQShNQ0ZQSVRfUENTUikpOworCV9fcmF3X3dyaXRldyhwY3NyIHwgTUNGUElUX1BDU1JfUElGLCBUQShNQ0ZQSVRfUENTUikpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNDAsNyArNDgsNiBAQAogewogCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKmljcnA7CiAJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqaW1ycDsKLQl2b2xhdGlsZSBzdHJ1Y3QgbWNmcGl0ICp0cDsKIAogCXJlcXVlc3RfaXJxKE1DRklOVF9WRUNCQVNFICsgTUNGSU5UX1BJVDEsIGhhbmRsZXIsIFNBX0lOVEVSUlVQVCwKIAkJIkNvbGRGaXJlIFRpbWVyIiwgTlVMTCk7CkBAIC01MywyNyArNjAsMjMgQEAKIAkqaW1ycCAmPSB+TUNGUElUX0lNUl9JQklUOwogCiAJLyogU2V0IHVwIFBJVCB0aW1lciAxIGFzIHBvbGwgY2xvY2sgKi8KLQl0cCA9ICh2b2xhdGlsZSBzdHJ1Y3QgbWNmcGl0ICopIChNQ0ZfSVBTQkFSICsgTUNGUElUX0JBU0UxKTsKLQl0cC0+cGNzciA9IE1DRlBJVF9QQ1NSX0RJU0FCTEU7Ci0KLQl0cC0+cG1yID0gKChNQ0ZfQ0xLIC8gMikgLyA2NCkgLyBIWjsKLQl0cC0+cGNzciA9IE1DRlBJVF9QQ1NSX0VOIHwgTUNGUElUX1BDU1JfUElFIHwgTUNGUElUX1BDU1JfT1ZXIHwKLQkJTUNGUElUX1BDU1JfUkxEIHwgTUNGUElUX1BDU1JfQ0xLNjQ7CisJX19yYXdfd3JpdGV3KE1DRlBJVF9QQ1NSX0RJU0FCTEUsIFRBKE1DRlBJVF9QQ1NSKSk7CisJX19yYXdfd3JpdGV3KCgoTUNGX0NMSyAvIDIpIC8gNjQpIC8gSFosIFRBKE1DRlBJVF9QTVIpKTsKKwlfX3Jhd193cml0ZXcoTUNGUElUX1BDU1JfRU4gfCBNQ0ZQSVRfUENTUl9QSUUgfCBNQ0ZQSVRfUENTUl9PVlcgfAorCQlNQ0ZQSVRfUENTUl9STEQgfCBNQ0ZQSVRfUENTUl9DTEs2NCwgVEEoTUNGUElUX1BDU1IpKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdW5zaWduZWQgbG9uZyBjb2xkZmlyZV9waXRfb2Zmc2V0KHZvaWQpCiB7Ci0Jdm9sYXRpbGUgc3RydWN0IG1jZnBpdCAqdHA7CiAJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqaXByOwogCXVuc2lnbmVkIGxvbmcgcG1yLCBwY250ciwgb2Zmc2V0OwogCi0JdHAgPSAodm9sYXRpbGUgc3RydWN0IG1jZnBpdCAqKSAoTUNGX0lQU0JBUiArIE1DRlBJVF9CQVNFMSk7CiAJaXByID0gKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikgKE1DRl9JUFNCQVIgKyBNQ0ZJQ01fSU5UQzAgKyBNQ0ZQSVRfSU1SKTsKIAotCXBtciA9ICooJnRwLT5wbXIpOwotCXBjbnRyID0gKigmdHAtPnBjbnRyKTsKKwlwbXIgPSBfX3Jhd19yZWFkdyhUQShNQ0ZQSVRfUE1SKSk7CisJcGNudHIgPSBfX3Jhd19yZWFkdyhUQShNQ0ZQSVRfUENOVFIpKTsKIAogCS8qCiAJICogSWYgd2UgYXJlIHN0aWxsIGluIHRoZSBmaXJzdCBoYWxmIG9mIHRoZSB1cGNvdW50IGFuZCBhCmRpZmYgLS1naXQgYS9hcmNoL202OGtub21tdS9wbGF0Zm9ybS81MzA3L3RpbWVycy5jIGIvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNTMwNy90aW1lcnMuYwppbmRleCBlZjQ5NTk2Li44M2I4Yjg5IDEwMDY0NAotLS0gYS9hcmNoL202OGtub21tdS9wbGF0Zm9ybS81MzA3L3RpbWVycy5jCisrKyBiL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzUzMDcvdGltZXJzLmMKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wYXJhbS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL3RyYXBzLmg+CiAjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KQEAgLTI0LDYgKzI1LDExIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgorICoJQnkgZGVmYXVsdCB1c2UgdGltZXIxIGFzIHRoZSBzeXN0ZW0gY2xvY2sgdGltZXIuCisgKi8KKyNkZWZpbmUJVEEoYSkJKE1DRl9NQkFSICsgTUNGVElNRVJfQkFTRTEgKyAoYSkpCisKKy8qCiAgKglEZWZhdWx0IHRoZSB0aW1lciBhbmQgdmVjdG9yIHRvIHVzZSBmb3IgQ29sZEZpcmUuIFNvbWUgQ29sZEZpcmUKICAqCUNQVSdzIGFuZCBzb21lIGJvYXJkcyBtYXkgd2FudCBkaWZmZXJlbnQuIFRoZWlyIHN1Yi1hcmNoaXRlY3R1cmUKICAqCXN0YXJ0dXAgY29kZSAoaW4gY29uZmlnLmMpIGNhbiBjaGFuZ2UgdGhlc2UgaWYgdGhleSB3YW50LgpAQCAtMzIsOCArMzgsNiBAQAogdW5zaWduZWQgaW50CW1jZl9wcm9maWxldmVjdG9yID0gMzE7CiB1bnNpZ25lZCBpbnQJbWNmX3RpbWVybGV2ZWwgPSA1OwogCi1zdGF0aWMgdm9sYXRpbGUgc3RydWN0IG1jZnRpbWVyICptY2ZfdGltZXJwOwotCiAvKgogICoJVGhlc2UgcHJvdmlkZSB0aGUgdW5kZXJseWluZyBpbnRlcnJ1cHQgdmVjdG9yIHN1cHBvcnQuCiAgKglVbmZvcnR1bmF0ZWx5IGl0IGlzIGEgbGl0dGxlIGRpZmZlcmVudCBvbiBlYWNoIENvbGRGaXJlLgpAQCAtNDYsMjAgKzUwLDE3IEBACiB2b2lkIGNvbGRmaXJlX3RpY2sodm9pZCkKIHsKIAkvKiBSZXNldCB0aGUgQ29sZEZpcmUgdGltZXIgKi8KLQltY2ZfdGltZXJwLT50ZXIgPSBNQ0ZUSU1FUl9URVJfQ0FQIHwgTUNGVElNRVJfVEVSX1JFRjsKKwlfX3Jhd193cml0ZWIoTUNGVElNRVJfVEVSX0NBUCB8IE1DRlRJTUVSX1RFUl9SRUYsIFRBKE1DRlRJTUVSX1RFUikpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB2b2lkIGNvbGRmaXJlX3RpbWVyX2luaXQoaXJxcmV0dXJuX3QgKCpoYW5kbGVyKShpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKikpCiB7Ci0JLyogU2V0IHVwIGFuIGludGVybmFsIFRJTUVSIGFzIHBvbGwgY2xvY2sgKi8KLQltY2ZfdGltZXJwID0gKHZvbGF0aWxlIHN0cnVjdCBtY2Z0aW1lciAqKSAoTUNGX01CQVIgKyBNQ0ZUSU1FUl9CQVNFMSk7Ci0JbWNmX3RpbWVycC0+dG1yID0gTUNGVElNRVJfVE1SX0RJU0FCTEU7Ci0KLQltY2ZfdGltZXJwLT50cnIgPSAodW5zaWduZWQgc2hvcnQpICgoTUNGX0JVU0NMSyAvIDE2KSAvIEhaKTsKLQltY2ZfdGltZXJwLT50bXIgPSBNQ0ZUSU1FUl9UTVJfRU5PUkkgfCBNQ0ZUSU1FUl9UTVJfQ0xLMTYgfAotCQlNQ0ZUSU1FUl9UTVJfUkVTVEFSVCB8IE1DRlRJTUVSX1RNUl9FTkFCTEU7CisJX19yYXdfd3JpdGV3KE1DRlRJTUVSX1RNUl9ESVNBQkxFLCBUQShNQ0ZUSU1FUl9UTVIpKTsKKwlfX3Jhd193cml0ZXcoKChNQ0ZfQlVTQ0xLIC8gMTYpIC8gSFopLCBUQShNQ0ZUSU1FUl9UUlIpKTsKKwlfX3Jhd193cml0ZXcoTUNGVElNRVJfVE1SX0VOT1JJIHwgTUNGVElNRVJfVE1SX0NMSzE2IHwKKwkJTUNGVElNRVJfVE1SX1JFU1RBUlQgfCBNQ0ZUSU1FUl9UTVJfRU5BQkxFLCBUQShNQ0ZUSU1FUl9UTVIpKTsKIAogCXJlcXVlc3RfaXJxKG1jZl90aW1lcnZlY3RvciwgaGFuZGxlciwgU0FfSU5URVJSVVBULCAidGltZXIiLCBOVUxMKTsKIAltY2Zfc2V0dGltZXJpY3IoMSwgbWNmX3RpbWVybGV2ZWwpOwpAQCAtNzUsMTMgKzc2LDggQEAKIHsKIAl1bnNpZ25lZCBsb25nIHRyciwgdGNuLCBvZmZzZXQ7CiAKLQkvKgotCSAqIFRoZSBjaGFuZ2UgdG8gcG9pbnRlciBhbmQgZGUtcmVmZXJlbmNlIGlzIHRvIGZvcmNlIHRoZSBjb21waWxlcgotCSAqIHRvIHJlYWQgdGhlIHJlZ2lzdGVycyB3aXRoIGEgc2luZ2xlIDE2Yml0IGFjY2Vzcy4gT3RoZXJ3aXNlIGl0Ci0JICogZG9lcyBzb21lIGNyYXp5IDhiaXQgcmVhZCBjb21iaW5pbmcuCi0JICovCi0JdGNuID0gKigmbWNmX3RpbWVycC0+dGNuKTsKLQl0cnIgPSAqKCZtY2ZfdGltZXJwLT50cnIpOworCXRjbiA9IF9fcmF3X3JlYWR3KFRBKE1DRlRJTUVSX1RDTikpOworCXRyciA9IF9fcmF3X3JlYWR3KFRBKE1DRlRJTUVSX1RSUikpOwogCW9mZnNldCA9ICh0Y24gKiAoMTAwMDAwMCAvIEhaKSkgLyB0cnI7CiAKIAkvKiBDaGVjayBpZiB3ZSBqdXN0IHdyYXBwZWQgdGhlIGNvdW50ZXJzIGFuZCBtYXliZSBtaXNzZWQgYSB0aWNrICovCkBAIC05NSwyMSArOTEsMjMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCisgKglCeSBkZWZhdWx0IHVzZSB0aW1lcjIgYXMgdGhlIHByb2ZpbGVyIGNsb2NrIHRpbWVyLgorICovCisjZGVmaW5lCVBBKGEpCShNQ0ZfTUJBUiArIE1DRlRJTUVSX0JBU0UyICsgKGEpKQorCisvKgogICoJQ2hvb3NlIGEgcmVhc29uYWJseSBmYXN0IHByb2ZpbGUgdGltZXIuIE1ha2UgaXQgYW4gb2RkIHZhbHVlIHRvCiAgKgl0cnkgYW5kIGdldCBnb29kIGNvdmVyYWdlIG9mIGtlcm5hbCBvcGVyYXRpb25zLgogICovCiAjZGVmaW5lCVBST0ZJTEVIWgkxMDEzCiAKLXN0YXRpYyB2b2xhdGlsZSBzdHJ1Y3QgbWNmdGltZXIgKm1jZl9wcm9mdHA7Ci0KIC8qCiAgKglVc2UgdGhlIG90aGVyIHRpbWVyIHRvIHByb3ZpZGUgaGlnaCBhY2N1cmFjeSBwcm9maWxpbmcgaW5mby4KICAqLwotCiB2b2lkIGNvbGRmaXJlX3Byb2ZpbGVfdGljayhpbnQgaXJxLCB2b2lkICpkdW1teSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJLyogUmVzZXQgQ29sZEZpcmUgdGltZXIyICovCi0JbWNmX3Byb2Z0cC0+dGVyID0gTUNGVElNRVJfVEVSX0NBUCB8IE1DRlRJTUVSX1RFUl9SRUY7CisJX19yYXdfd3JpdGViKE1DRlRJTUVSX1RFUl9DQVAgfCBNQ0ZUSU1FUl9URVJfUkVGLCBQQShNQ0ZUSU1FUl9URVIpKTsKIAlpZiAoY3VycmVudC0+cGlkKQogCQlwcm9maWxlX3RpY2soQ1BVX1BST0ZJTElORywgcmVncyk7CiB9CkBAIC0xMjEsMTIgKzExOSwxMSBAQAogCXByaW50ayhLRVJOX0lORk8gIlBST0ZJTEU6IGxvZGdpbmcgVElNRVIyIEAgJWRIeiBhcyBwcm9maWxlIHRpbWVyXG4iLCBQUk9GSUxFSFopOwogCiAJLyogU2V0IHVwIFRJTUVSIDIgYXMgaGlnaCBzcGVlZCBwcm9maWxlIGNsb2NrICovCi0JbWNmX3Byb2Z0cCA9ICh2b2xhdGlsZSBzdHJ1Y3QgbWNmdGltZXIgKikgKE1DRl9NQkFSICsgTUNGVElNRVJfQkFTRTIpOwotCW1jZl9wcm9mdHAtPnRtciA9IE1DRlRJTUVSX1RNUl9ESVNBQkxFOworCV9fcmF3X3dyaXRldyhNQ0ZUSU1FUl9UTVJfRElTQUJMRSwgUEEoTUNGVElNRVJfVE1SKSk7CiAKLQltY2ZfcHJvZnRwLT50cnIgPSAodW5zaWduZWQgc2hvcnQpICgoTUNGX0NMSyAvIDE2KSAvIFBST0ZJTEVIWik7Ci0JbWNmX3Byb2Z0cC0+dG1yID0gTUNGVElNRVJfVE1SX0VOT1JJIHwgTUNGVElNRVJfVE1SX0NMSzE2IHwKLQkJTUNGVElNRVJfVE1SX1JFU1RBUlQgfCBNQ0ZUSU1FUl9UTVJfRU5BQkxFOworCV9fcmF3X3dyaXRldygoKE1DRl9DTEsgLyAxNikgLyBQUk9GSUxFSFopLCBQQShNQ0ZUSU1FUl9UUlIpKTsKKwlfX3Jhd193cml0ZXcoTUNGVElNRVJfVE1SX0VOT1JJIHwgTUNGVElNRVJfVE1SX0NMSzE2IHwKKwkJTUNGVElNRVJfVE1SX1JFU1RBUlQgfCBNQ0ZUSU1FUl9UTVJfRU5BQkxFLCBQQShNQ0ZUSU1FUl9UTVIpKTsKIAogCXJlcXVlc3RfaXJxKG1jZl9wcm9maWxldmVjdG9yLCBjb2xkZmlyZV9wcm9maWxlX3RpY2ssCiAJCShTQV9JTlRFUlJVUFQgfCBJUlFfRkxHX0ZBU1QpLCAicHJvZmlsZSB0aW1lciIsIE5VTEwpOwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNTMyeC9NYWtlZmlsZSBiL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzUzMngvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIzMDE4MAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzUzMngvTWFrZWZpbGUKQEAgLTAsMCArMSwyMCBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIG02OGtub21tdSBsaW51eCBrZXJuZWwuCisjCisKKyMKKyMgSWYgeW91IHdhbnQgdG8gcGxheSB3aXRoIHRoZSBIVyBicmVha3BvaW50cyB0aGVuIHlvdSB3aWxsCisjIG5lZWQgdG8gYWRkIGRlZmluZSB0aGlzLCAgd2hpY2ggd2lsbCBnaXZlIHlvdSBhIHN0YWNrIGJhY2t0cmFjZQorIyBvbiB0aGUgY29uc29sZSBwb3J0IHdoZW5ldmVyIGEgREJHIGludGVycnVwdCBvY2N1cnMuIFlvdSBoYXZlIHRvCisjIHNldCB1cCB5b3UgSFcgYnJlYWtwb2ludHMgdG8gdHJpZ2dlciBhIERCRyBpbnRlcnJ1cHQ6CisjCisjIEVYVFJBX0NGTEFHUyArPSAtRFRSQVBfREJHX0lOVEVSUlVQVAorIyBFWFRSQV9BRkxBR1MgKz0gLURUUkFQX0RCR19JTlRFUlJVUFQKKyMKKworaWZkZWYgQ09ORklHX0ZVTExERUJVRworQUZMQUdTICs9IC1EREVCVUdHRVJfQ09NUEFUSUJMRV9DQUNIRT0xCitlbmRpZgorCisjb2JqLXkgOj0gY29uZmlnLm8gdXNiLW1jZjUzMngubyBzcGktbWNmNTMyeC5vCitvYmoteSA6PSBjb25maWcubwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNTMyeC9jb25maWcuYyBiL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzUzMngvY29uZmlnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VlZjliYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzUzMngvY29uZmlnLmMKQEAgLTAsMCArMSw0ODYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglsaW51eC9hcmNoL202OGtub21tdS9wbGF0Zm9ybS81MzJ4L2NvbmZpZy5jCisgKgorICoJQ29weXJpZ2h0IChDKSAxOTk5LTIwMDIsIEdyZWcgVW5nZXJlciAoZ2VyZ0BzbmFwZ2Vhci5jb20pCisgKglDb3B5cmlnaHQgKEMpIDIwMDAsIExpbmVvICh3d3cubGluZW8uY29tKQorICoJWWFyb3NsYXYgVmlub2dyYWRvdiB5YXJvc2xhdi52aW5vZ3JhZG92QGZyZWVzY2FsZS5jb20KKyAqCUNvcHlyaWdodCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jIDIwMDYKKyAqCUNvcHlyaWdodCAoYykgMjAwNiwgZW1saXgsIFNlYmFzdGlhbiBIZXNzIDxzaEBlbWxpeC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9wYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS90cmFwcy5oPgorI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CisjaW5jbHVkZSA8YXNtL2NvbGRmaXJlLmg+CisjaW5jbHVkZSA8YXNtL21jZnRpbWVyLmg+CisjaW5jbHVkZSA8YXNtL21jZnNpbS5oPgorI2luY2x1ZGUgPGFzbS9tY2ZkbWEuaD4KKyNpbmNsdWRlIDxhc20vbWNmd2RlYnVnLmg+CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgY29sZGZpcmVfdGljayh2b2lkKTsKK3ZvaWQgY29sZGZpcmVfdGltZXJfaW5pdChpcnFyZXR1cm5fdCAoKmhhbmRsZXIpKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKSk7Cit1bnNpZ25lZCBsb25nIGNvbGRmaXJlX3RpbWVyX29mZnNldCh2b2lkKTsKK3ZvaWQgY29sZGZpcmVfdHJhcF9pbml0KHZvaWQpOwordm9pZCBjb2xkZmlyZV9yZXNldCh2b2lkKTsKKworZXh0ZXJuIHVuc2lnbmVkIGludCBtY2ZfdGltZXJ2ZWN0b3I7CitleHRlcm4gdW5zaWduZWQgaW50IG1jZl9wcm9maWxldmVjdG9yOworZXh0ZXJuIHVuc2lnbmVkIGludCBtY2ZfdGltZXJsZXZlbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCURNQSBjaGFubmVsIGJhc2UgYWRkcmVzcyB0YWJsZS4KKyAqLwordW5zaWduZWQgaW50IGRtYV9iYXNlX2FkZHJbTUFYX002OEtfRE1BX0NIQU5ORUxTXSA9IHsgfTsKK3Vuc2lnbmVkIGludCBkbWFfZGV2aWNlX2FkZHJlc3NbTUFYX002OEtfRE1BX0NIQU5ORUxTXTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBtY2Zfc2V0dGltZXJpY3IodW5zaWduZWQgaW50IHRpbWVyLCB1bnNpZ25lZCBpbnQgbGV2ZWwpCit7CisJdm9sYXRpbGUgdW5zaWduZWQgY2hhciAqaWNycDsKKwl1bnNpZ25lZCBpbnQgaWNyOworCXVuc2lnbmVkIGNoYXIgaXJxOworCisJaWYgKHRpbWVyIDw9IDIpIHsKKwkJc3dpdGNoICh0aW1lcikgeworCQljYXNlIDI6ICBpcnEgPSAzMzsgaWNyID0gTUNGU0lNX0lDUl9USU1FUjI7IGJyZWFrOworCQlkZWZhdWx0OiBpcnEgPSAzMjsgaWNyID0gTUNGU0lNX0lDUl9USU1FUjE7IGJyZWFrOworCQl9CisJCQorCQlpY3JwID0gKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikgKE1DRl9NQkFSICsgaWNyKTsKKwkJKmljcnAgPSBsZXZlbDsKKwkJbWNmX2VuYWJsZV9pcnEwKGlycSk7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbnQgbWNmX3RpbWVyaXJxcGVuZGluZyhpbnQgdGltZXIpCit7CisJdW5zaWduZWQgaW50IGltciA9IDA7CisKKwlzd2l0Y2ggKHRpbWVyKSB7CisJY2FzZSAxOiAgaW1yID0gMHgxOyBicmVhazsKKwljYXNlIDI6ICBpbXIgPSAweDI7IGJyZWFrOworCWRlZmF1bHQ6IGJyZWFrOworCX0KKwlyZXR1cm4gKG1jZl9nZXRpcHJoKCkgJiBpbXIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIGNvbmZpZ19CU1AoY2hhciAqY29tbWFuZHAsIGludCBzaXplKQoreworCW1jZl9zZXRpbXIoTUNGU0lNX0lNUl9NQVNLQUxMKTsKKworI2lmIGRlZmluZWQoQ09ORklHX0JPT1RQQVJBTSkKKwlzdHJuY3B5KGNvbW1hbmRwLCBDT05GSUdfQk9PVFBBUkFNX1NUUklORywgc2l6ZSk7CisJY29tbWFuZHBbc2l6ZS0xXSA9IDA7CisjZWxzZQorCS8qIENvcHkgY29tbWFuZCBsaW5lIGZyb20gRkxBU0ggdG8gbG9jYWwgYnVmZmVyLi4uICovCisJbWVtY3B5KGNvbW1hbmRwLCAoY2hhciAqKSAweDQwMDAsIDQpOworCWlmKHN0cm5jbXAoY29tbWFuZHAsICJrY2wgIiwgNCkgPT0gMCl7CisJCW1lbWNweShjb21tYW5kcCwgKGNoYXIgKikgMHg0MDA0LCBzaXplKTsKKwkJY29tbWFuZHBbc2l6ZS0xXSA9IDA7CisJfSBlbHNlIHsKKwkJbWVtc2V0KGNvbW1hbmRwLCAwLCBzaXplKTsKKwl9CisjZW5kaWYKKworCW1jZl90aW1lcnZlY3RvciA9IDY0KzMyOworCW1jZl9wcm9maWxldmVjdG9yID0gNjQrMzM7CisJbWFjaF9zY2hlZF9pbml0ID0gY29sZGZpcmVfdGltZXJfaW5pdDsKKwltYWNoX3RpY2sgPSBjb2xkZmlyZV90aWNrOworCW1hY2hfZ2V0dGltZW9mZnNldCA9IGNvbGRmaXJlX3RpbWVyX29mZnNldDsKKwltYWNoX3RyYXBfaW5pdCA9IGNvbGRmaXJlX3RyYXBfaW5pdDsKKwltYWNoX3Jlc2V0ID0gY29sZGZpcmVfcmVzZXQ7CisKKyNpZmRlZiBNQ0ZfQkRNX0RJU0FCTEUKKwkvKgorCSAqIERpc2FibGUgdGhlIEJETSBjbG9ja2luZy4gIFRoaXMgYWxzbyB0dXJucyBvZmYgbW9zdCBvZiB0aGUgcmVzdCBvZgorCSAqIHRoZSBCRE0gZGV2aWNlLiAgVGhpcyBpcyBnb29kIGZvciBFTUMgcmVhc29ucy4gVGhpcyBvcHRpb24gaXMgbm90CisJICogaW5jb21wYXRpYmxlIHdpdGggdGhlIG1lbW9yeSBwcm90ZWN0aW9uIG9wdGlvbi4KKwkgKi8KKwl3ZGVidWcoTUNGREVCVUdfQ1NSLCBNQ0ZERUJVR19DU1JfUFNUQ0xLKTsKKyNlbmRpZgorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogQm9hcmQgaW5pdGlhbGl6YXRpb24gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogCisgKiBQTEwgbWluL21heCBzcGVjaWZpY2F0aW9ucworICovCisjZGVmaW5lIE1BWF9GVkNPCTUwMDAwMAkvKiBLSHogKi8KKyNkZWZpbmUgTUFYX0ZTWVMJODAwMDAgCS8qIEtIeiAqLworI2RlZmluZSBNSU5fRlNZUwk1ODMzMyAJLyogS0h6ICovCisjZGVmaW5lIEZSRUYJCTE2MDAwICAgLyogS0h6ICovCisKKworI2RlZmluZSBNQVhfTUZECQkxMzUgICAgIC8qIE11bHRpcGxpZXIgKi8KKyNkZWZpbmUgTUlOX01GRAkJODggICAgICAvKiBNdWx0aXBsaWVyICovCisjZGVmaW5lIEJVU0RJVgkJNiAgICAgICAvKiBEaXZpZGVyICovCisKKy8qCisgKiBMb3cgUG93ZXIgRGl2aWRlciBzcGVjaWZpY2F0aW9ucworICovCisjZGVmaW5lIE1JTl9MUEQJCSgxIDw8IDApICAgIC8qIERpdmlkZXIgKG5vdCBlbmNvZGVkKSAqLworI2RlZmluZSBNQVhfTFBECQkoMSA8PCAxNSkgICAvKiBEaXZpZGVyIChub3QgZW5jb2RlZCkgKi8KKyNkZWZpbmUgREVGQVVMVF9MUEQJKDEgPDwgMSkJLyogRGl2aWRlciAobm90IGVuY29kZWQpICovCisKKyNkZWZpbmUgU1lTX0NMS19LSFoJODAwMDAKKyNkZWZpbmUgU1lTVEVNX1BFUklPRAkxMi41CisvKgorICogIFNEUkFNIFRpbWluZyBQYXJhbWV0ZXJzCisgKi8gIAorI2RlZmluZSBTRFJBTV9CTAk4CS8qICMgb2YgYmVhdHMgaW4gYSBidXJzdCAqLworI2RlZmluZSBTRFJBTV9UV1IJMgkvKiBpbiBjbG9ja3MgKi8KKyNkZWZpbmUgU0RSQU1fQ0FTTAkyLjUJLyogQ0FTTCBpbiBjbG9ja3MgKi8KKyNkZWZpbmUgU0RSQU1fVFJDRAkyCS8qIGluIGNsb2NrcyAqLworI2RlZmluZSBTRFJBTV9UUlAJMgkvKiBpbiBjbG9ja3MgKi8KKyNkZWZpbmUgU0RSQU1fVFJGQwk3CS8qIGluIGNsb2NrcyAqLworI2RlZmluZSBTRFJBTV9UUkVGSQk3ODAwCS8qIGluIG5zICovCisKKyNkZWZpbmUgRVhUX1NSQU1fQUREUkVTUwkoMHhDMDAwMDAwMCkKKyNkZWZpbmUgRkxBU0hfQUREUkVTUwkJKDB4MDAwMDAwMDApCisjZGVmaW5lIFNEUkFNX0FERFJFU1MJCSgweDQwMDAwMDAwKQorCisjZGVmaW5lIE5BTkRfRkxBU0hfQUREUkVTUwkoMHhEMDAwMDAwMCkKKworaW50IHN5c19jbGtfa2h6ID0gMDsKK2ludCBzeXNfY2xrX21oeiA9IDA7CisKK3ZvaWQgd3RtX2luaXQodm9pZCk7Cit2b2lkIHNjbV9pbml0KHZvaWQpOwordm9pZCBncGlvX2luaXQodm9pZCk7Cit2b2lkIGZiY3NfaW5pdCh2b2lkKTsKK3ZvaWQgc2RyYW1jX2luaXQodm9pZCk7CitpbnQgIGNsb2NrX3BsbCAoaW50IGZzeXMsIGludCBmbGFncyk7CitpbnQgIGNsb2NrX2xpbXAgKGludCk7CitpbnQgIGNsb2NrX2V4aXRfbGltcCAodm9pZCk7CitpbnQgIGdldF9zeXNfY2xvY2sgKHZvaWQpOworCithc21saW5rYWdlIHZvaWQgX19pbml0IHN5c2luaXQodm9pZCkKK3sKKwlzeXNfY2xrX2toeiA9IGNsb2NrX3BsbCgwLCAwKTsKKwlzeXNfY2xrX21oeiA9IHN5c19jbGtfa2h6LzEwMDA7CisJCisJd3RtX2luaXQoKTsKKwlzY21faW5pdCgpOworCWdwaW9faW5pdCgpOworCWZiY3NfaW5pdCgpOworCXNkcmFtY19pbml0KCk7Cit9CisKK3ZvaWQgd3RtX2luaXQodm9pZCkKK3sKKwkvKiBEaXNhYmxlIHdhdGNoZG9nIHRpbWVyICovCisJTUNGX1dUTV9XQ1IgPSAwOworfQorCisjZGVmaW5lIE1DRl9TQ01fQkNSX0dCVwkJKDB4MDAwMDAxMDApCisjZGVmaW5lIE1DRl9TQ01fQkNSX0dCUgkJKDB4MDAwMDAyMDApCisKK3ZvaWQgc2NtX2luaXQodm9pZCkKK3sKKwkvKiBBbGwgbWFzdGVycyBhcmUgdHJ1c3RlZCAqLworCU1DRl9TQ01fTVBSID0gMHg3Nzc3Nzc3NzsKKyAgICAKKwkvKiBBbGxvdyBzdXBlcnZpc29yL3VzZXIsIHJlYWQvd3JpdGUsIGFuZCB0cnVzdGVkL3VudHJ1c3RlZAorCSAgIGFjY2VzcyB0byBhbGwgc2xhdmVzICovCisJTUNGX1NDTV9QQUNSQSA9IDA7CisJTUNGX1NDTV9QQUNSQiA9IDA7CisJTUNGX1NDTV9QQUNSQyA9IDA7CisJTUNGX1NDTV9QQUNSRCA9IDA7CisJTUNGX1NDTV9QQUNSRSA9IDA7CisJTUNGX1NDTV9QQUNSRiA9IDA7CisKKwkvKiBFbmFibGUgYnVyc3RzICovCisJTUNGX1NDTV9CQ1IgPSAoTUNGX1NDTV9CQ1JfR0JSIHwgTUNGX1NDTV9CQ1JfR0JXKTsKK30KKworCit2b2lkIGZiY3NfaW5pdCh2b2lkKQoreworCU1DRl9HUElPX1BBUl9DUyA9IDB4MDAwMDAwM0U7CisKKwkvKiBMYXRjaCBjaGlwIHNlbGVjdCAqLworCU1DRl9GQkNTMV9DU0FSID0gMHgxMDA4MDAwMDsKKworCU1DRl9GQkNTMV9DU0NSID0gMHgwMDJBMzc4MDsKKwlNQ0ZfRkJDUzFfQ1NNUiA9IChNQ0ZfRkJDU19DU01SX0JBTV8yTSB8IE1DRl9GQkNTX0NTTVJfVik7CisKKwkvKiBJbml0aWFsaXplIGxhdGNoIHRvIGRyaXZlIHNpZ25hbHMgdG8gaW5hY3RpdmUgc3RhdGVzICovCisJKigodTE2ICopKDB4MTAwODAwMDApKSA9IDB4RkZGRjsKKworCS8qIEV4dGVybmFsIFNSQU0gKi8KKwlNQ0ZfRkJDUzFfQ1NBUiA9IEVYVF9TUkFNX0FERFJFU1M7CisJTUNGX0ZCQ1MxX0NTQ1IgPSAoTUNGX0ZCQ1NfQ1NDUl9QU18xNgorCQkJfCBNQ0ZfRkJDU19DU0NSX0FBCisJCQl8IE1DRl9GQkNTX0NTQ1JfU0JNCisJCQl8IE1DRl9GQkNTX0NTQ1JfV1MoMSkpOworCU1DRl9GQkNTMV9DU01SID0gKE1DRl9GQkNTX0NTTVJfQkFNXzUxMksKKwkJCXwgTUNGX0ZCQ1NfQ1NNUl9WKTsKKworCS8qIEJvb3QgRmxhc2ggY29ubmVjdGVkIHRvIEZCQ1MwICovCisJTUNGX0ZCQ1MwX0NTQVIgPSBGTEFTSF9BRERSRVNTOworCU1DRl9GQkNTMF9DU0NSID0gKE1DRl9GQkNTX0NTQ1JfUFNfMTYKKwkJCXwgTUNGX0ZCQ1NfQ1NDUl9CRU0KKwkJCXwgTUNGX0ZCQ1NfQ1NDUl9BQQorCQkJfCBNQ0ZfRkJDU19DU0NSX1NCTQorCQkJfCBNQ0ZfRkJDU19DU0NSX1dTKDcpKTsKKwlNQ0ZfRkJDUzBfQ1NNUiA9IChNQ0ZfRkJDU19DU01SX0JBTV8zMk0KKwkJCXwgTUNGX0ZCQ1NfQ1NNUl9WKTsKK30KKwordm9pZCBzZHJhbWNfaW5pdCh2b2lkKQoreworCS8qCisJICogQ2hlY2sgdG8gc2VlIGlmIHRoZSBTRFJBTSBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkCisJICogYnkgYSBydW4gY29udHJvbCB0b29sCisJICovCisJaWYgKCEoTUNGX1NEUkFNQ19TRENSICYgTUNGX1NEUkFNQ19TRENSX1JFRikpIHsKKwkJLyogU0RSQU0gY2hpcCBzZWxlY3QgaW5pdGlhbGl6YXRpb24gKi8KKwkJCisJCS8qIEluaXRpYWxpemUgU0RSQU0gY2hpcCBzZWxlY3QgKi8KKwkJTUNGX1NEUkFNQ19TRENTMCA9ICgwCisJCQl8IE1DRl9TRFJBTUNfU0RDU19CQShTRFJBTV9BRERSRVNTKQorCQkJfCBNQ0ZfU0RSQU1DX1NEQ1NfQ1NTWihNQ0ZfU0RSQU1DX1NEQ1NfQ1NTWl8zMk1CWVRFKSk7CisKKwkvKgorCSAqIEJhc2ljIGNvbmZpZ3VyYXRpb24gYW5kIGluaXRpYWxpemF0aW9uCisJICovCisJTUNGX1NEUkFNQ19TRENGRzEgPSAoMAorCQl8IE1DRl9TRFJBTUNfU0RDRkcxX1NSRDJSVygoaW50KSgoU0RSQU1fQ0FTTCArIDIpICsgMC41ICkpCisJCXwgTUNGX1NEUkFNQ19TRENGRzFfU1dUMlJEKFNEUkFNX1RXUiArIDEpCisJCXwgTUNGX1NEUkFNQ19TRENGRzFfUkRMQVQoKGludCkoKFNEUkFNX0NBU0wqMikgKyAyKSkKKwkJfCBNQ0ZfU0RSQU1DX1NEQ0ZHMV9BQ1QyUlcoKGludCkoKFNEUkFNX1RSQ0QgKSArIDAuNSkpCisJCXwgTUNGX1NEUkFNQ19TRENGRzFfUFJFMkFDVCgoaW50KSgoU0RSQU1fVFJQICkgKyAwLjUpKQorCQl8IE1DRl9TRFJBTUNfU0RDRkcxX1JFRjJBQ1QoKGludCkoKChTRFJBTV9UUkZDKSApICsgMC41KSkKKwkJfCBNQ0ZfU0RSQU1DX1NEQ0ZHMV9XVExBVCgzKSk7CisJTUNGX1NEUkFNQ19TRENGRzIgPSAoMAorCQl8IE1DRl9TRFJBTUNfU0RDRkcyX0JSRDJQUkUoU0RSQU1fQkwvMiArIDEpCisJCXwgTUNGX1NEUkFNQ19TRENGRzJfQldUMlJXKFNEUkFNX0JMLzIgKyBTRFJBTV9UV1IpCisJCXwgTUNGX1NEUkFNQ19TRENGRzJfQlJEMldUKChpbnQpKChTRFJBTV9DQVNMK1NEUkFNX0JMLzItMS4wKSswLjUpKQorCQl8IE1DRl9TRFJBTUNfU0RDRkcyX0JMKFNEUkFNX0JMLTEpKTsKKworICAgICAgICAgICAgCisJLyoKKwkgKiBQcmVjaGFyZ2UgYW5kIGVuYWJsZSB3cml0ZSB0byBTRE1SCisJICovCisgICAgICAgIE1DRl9TRFJBTUNfU0RDUiA9ICgwCisJCXwgTUNGX1NEUkFNQ19TRENSX01PREVfRU4KKwkJfCBNQ0ZfU0RSQU1DX1NEQ1JfQ0tFCisJCXwgTUNGX1NEUkFNQ19TRENSX0REUgorCQl8IE1DRl9TRFJBTUNfU0RDUl9NVVgoMSkKKwkJfCBNQ0ZfU0RSQU1DX1NEQ1JfUkNOVCgoaW50KSgoKFNEUkFNX1RSRUZJLyhTWVNURU1fUEVSSU9EKjY0KSkgLSAxKSArIDAuNSkpCisJCXwgTUNGX1NEUkFNQ19TRENSX1BTXzE2CisJCXwgTUNGX1NEUkFNQ19TRENSX0lQQUxMKTsgICAgICAgICAgICAKKworCS8qCisJICogV3JpdGUgZXh0ZW5kZWQgbW9kZSByZWdpc3RlcgorCSAqLworCU1DRl9TRFJBTUNfU0RNUiA9ICgwCisJCXwgTUNGX1NEUkFNQ19TRE1SX0JOS0FEX0xFTVIKKwkJfCBNQ0ZfU0RSQU1DX1NETVJfQUQoMHgwKQorCQl8IE1DRl9TRFJBTUNfU0RNUl9DTUQpOworCisJLyoKKwkgKiBXcml0ZSBtb2RlIHJlZ2lzdGVyIGFuZCByZXNldCBETEwKKwkgKi8KKwlNQ0ZfU0RSQU1DX1NETVIgPSAoMAorCQl8IE1DRl9TRFJBTUNfU0RNUl9CTktBRF9MTVIKKwkJfCBNQ0ZfU0RSQU1DX1NETVJfQUQoMHgxNjMpCisJCXwgTUNGX1NEUkFNQ19TRE1SX0NNRCk7CisKKwkvKgorCSAqIEV4ZWN1dGUgYSBQQUxMIGNvbW1hbmQKKwkgKi8KKwlNQ0ZfU0RSQU1DX1NEQ1IgfD0gTUNGX1NEUkFNQ19TRENSX0lQQUxMOworCisJLyoKKwkgKiBQZXJmb3JtIHR3byBSRUYgY3ljbGVzCisJICovCisJTUNGX1NEUkFNQ19TRENSIHw9IE1DRl9TRFJBTUNfU0RDUl9JUkVGOworCU1DRl9TRFJBTUNfU0RDUiB8PSBNQ0ZfU0RSQU1DX1NEQ1JfSVJFRjsKKworCS8qCisJICogV3JpdGUgbW9kZSByZWdpc3RlciBhbmQgY2xlYXIgcmVzZXQgRExMCisJICovCisJTUNGX1NEUkFNQ19TRE1SID0gKDAKKwkJfCBNQ0ZfU0RSQU1DX1NETVJfQk5LQURfTE1SCisJCXwgTUNGX1NEUkFNQ19TRE1SX0FEKDB4MDYzKQorCQl8IE1DRl9TRFJBTUNfU0RNUl9DTUQpOworCQkJCQorCS8qCisJICogRW5hYmxlIGF1dG8gcmVmcmVzaCBhbmQgbG9jayBTRE1SCisJICovCisJTUNGX1NEUkFNQ19TRENSICY9IH5NQ0ZfU0RSQU1DX1NEQ1JfTU9ERV9FTjsKKwlNQ0ZfU0RSQU1DX1NEQ1IgfD0gKDAKKwkJfCBNQ0ZfU0RSQU1DX1NEQ1JfUkVGCisJCXwgTUNGX1NEUkFNQ19TRENSX0RRU19PRSgweEMpKTsKKwl9Cit9CisKK3ZvaWQgZ3Bpb19pbml0KHZvaWQpCit7CisJLyogRW5hYmxlIFVBUlQwIHBpbnMgKi8KKwlNQ0ZfR1BJT19QQVJfVUFSVCA9ICggMAorCQl8IE1DRl9HUElPX1BBUl9VQVJUX1BBUl9VUlhEMAorCQl8IE1DRl9HUElPX1BBUl9VQVJUX1BBUl9VVFhEMCk7CisKKwkvKiBJbml0aWFsaXplIFRJTjMgYXMgYSBHUElPIG91dHB1dCB0byBlbmFibGUgdGhlIHdyaXRlCisJICAgaGFsZiBvZiB0aGUgbGF0Y2ggKi8KKwlNQ0ZfR1BJT19QQVJfVElNRVIgPSAweDAwOworCU1DRl9HUElPX1BERFJfVElNRVIgPSAweDA4OworCU1DRl9HUElPX1BDTFJSX1RJTUVSID0gMHgwOworCit9CisKK2ludCBjbG9ja19wbGwoaW50IGZzeXMsIGludCBmbGFncykKK3sKKwlpbnQgZnJlZiwgdGVtcCwgZm91dCwgbWZkOworCXUzMiBpOworCisJZnJlZiA9IEZSRUY7CisgICAgICAgIAorCWlmIChmc3lzID09IDApIHsKKwkJLyogUmV0dXJuIGN1cnJlbnQgUExMIG91dHB1dCAqLworCQltZmQgPSBNQ0ZfUExMX1BGRFI7CisKKwkJcmV0dXJuIChmcmVmICogbWZkIC8gKEJVU0RJViAqIDQpKTsKKwl9CisKKwkvKiBDaGVjayBib3VuZHMgb2YgcmVxdWVzdGVkIHN5c3RlbSBjbG9jayAqLworCWlmIChmc3lzID4gTUFYX0ZTWVMpCisJCWZzeXMgPSBNQVhfRlNZUzsKKwlpZiAoZnN5cyA8IE1JTl9GU1lTKQorCQlmc3lzID0gTUlOX0ZTWVM7CisKKwkvKiBNdWx0aXBseWluZyBieSAxMDAgd2hlbiBjYWxjdWxhdGluZyB0aGUgdGVtcCB2YWx1ZSwKKwkgICBhbmQgdGhlbiBkaXZpZGluZyBieSAxMDAgdG8gY2FsY3VsYXRlIHRoZSBtZmQgYWxsb3dzCisJICAgZm9yIGV4YWN0IHZhbHVlcyB3aXRob3V0IG5lZWRpbmcgdG8gaW5jbHVkZSBmbG9hdGluZworCSAgIHBvaW50IGxpYnJhcmllcy4gKi8KKwl0ZW1wID0gMTAwICogZnN5cyAvIGZyZWY7CisJbWZkID0gNCAqIEJVU0RJViAqIHRlbXAgLyAxMDA7CisgICAgCSAgICAJICAgIAkKKwkvKiBEZXRlcm1pbmUgdGhlIG91dHB1dCBmcmVxdWVuY3kgZm9yIHNlbGVjdGVkIHZhbHVlcyAqLworCWZvdXQgPSAoZnJlZiAqIG1mZCAvIChCVVNESVYgKiA0KSk7CisKKwkvKgorCSAqIENoZWNrIHRvIHNlZSBpZiB0aGUgU0RSQU0gaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZC4KKwkgKiBJZiBpdCBoYXMgdGhlbiB0aGUgU0RSQU0gbmVlZHMgdG8gYmUgcHV0IGludG8gc2VsZiByZWZyZXNoCisJICogbW9kZSBiZWZvcmUgcmVwcm9ncmFtbWluZyB0aGUgUExMLgorCSAqLworCWlmIChNQ0ZfU0RSQU1DX1NEQ1IgJiBNQ0ZfU0RSQU1DX1NEQ1JfUkVGKQorCQkvKiBQdXQgU0RSQU0gaW50byBzZWxmIHJlZnJlc2ggbW9kZSAqLworCQlNQ0ZfU0RSQU1DX1NEQ1IgJj0gfk1DRl9TRFJBTUNfU0RDUl9DS0U7CisKKwkvKgorCSAqIEluaXRpYWxpemUgdGhlIFBMTCB0byBnZW5lcmF0ZSB0aGUgbmV3IHN5c3RlbSBjbG9jayBmcmVxdWVuY3kuCisJICogVGhlIGRldmljZSBtdXN0IGJlIHB1dCBpbnRvIExJTVAgbW9kZSB0byByZXByb2dyYW0gdGhlIFBMTC4KKwkgKi8KKworCS8qIEVudGVyIExJTVAgbW9kZSAqLworCWNsb2NrX2xpbXAoREVGQVVMVF9MUEQpOworICAgICAJCQkJCQorCS8qIFJlcHJvZ3JhbSBQTEwgZm9yIGRlc2lyZWQgZnN5cyAqLworCU1DRl9QTExfUE9EUiA9ICgwCisJCXwgTUNGX1BMTF9QT0RSX0NQVURJVihCVVNESVYvMykKKwkJfCBNQ0ZfUExMX1BPRFJfQlVTRElWKEJVU0RJVikpOworCQkJCQkJCisJTUNGX1BMTF9QRkRSID0gbWZkOworCQkKKwkvKiBFeGl0IExJTVAgbW9kZSAqLworCWNsb2NrX2V4aXRfbGltcCgpOworCQorCS8qCisJICogUmV0dXJuIHRoZSBTRFJBTSB0byBub3JtYWwgb3BlcmF0aW9uIGlmIGl0IGlzIGluIHVzZS4KKwkgKi8KKwlpZiAoTUNGX1NEUkFNQ19TRENSICYgTUNGX1NEUkFNQ19TRENSX1JFRikKKwkJLyogRXhpdCBzZWxmIHJlZnJlc2ggbW9kZSAqLworCQlNQ0ZfU0RSQU1DX1NEQ1IgfD0gTUNGX1NEUkFNQ19TRENSX0NLRTsKKworCS8qIEVycmF0YSAtIHdvcmthcm91bmQgZm9yIFNEUkFNIG9wZWFydGlvbiBhZnRlciBleGl0aW5nIExJTVAgbW9kZSAqLworCU1DRl9TRFJBTUNfTElNUF9GSVggPSBNQ0ZfU0RSQU1DX1JFRlJFU0g7CisKKwkvKiB3YWl0IGZvciBEUVMgbG9naWMgdG8gcmVsb2NrICovCisJZm9yIChpID0gMDsgaSA8IDB4MjAwOyBpKyspCisJCTsKKworCXJldHVybiBmb3V0OworfQorCitpbnQgY2xvY2tfbGltcChpbnQgZGl2KQoreworCXUzMiB0ZW1wOworCisJLyogQ2hlY2sgYm91bmRzIG9mIGRpdmlkZXIgKi8KKwlpZiAoZGl2IDwgTUlOX0xQRCkKKwkJZGl2ID0gTUlOX0xQRDsKKwlpZiAoZGl2ID4gTUFYX0xQRCkKKwkJZGl2ID0gTUFYX0xQRDsKKyAgICAKKwkvKiBTYXZlIG9mIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBTU0lESVYgc28gd2UgZG9uJ3QKKwkgICBvdmVyd3JpdGUgdGhlIHZhbHVlKi8KKwl0ZW1wID0gKE1DRl9DQ01fQ0RSICYgTUNGX0NDTV9DRFJfU1NJRElWKDB4RikpOworICAgICAgCisJLyogQXBwbHkgdGhlIGRpdmlkZXIgdG8gdGhlIHN5c3RlbSBjbG9jayAqLworCU1DRl9DQ01fQ0RSID0gKCAwCisJCXwgTUNGX0NDTV9DRFJfTFBESVYoZGl2KQorCQl8IE1DRl9DQ01fQ0RSX1NTSURJVih0ZW1wKSk7CisgICAgCisJTUNGX0NDTV9NSVNDQ1IgfD0gTUNGX0NDTV9NSVNDQ1JfTElNUDsKKyAgICAKKwlyZXR1cm4gKEZSRUYvKDMqKDEgPDwgZGl2KSkpOworfQorCitpbnQgY2xvY2tfZXhpdF9saW1wKHZvaWQpCit7CisJaW50IGZvdXQ7CisJCisJLyogRXhpdCBMSU1QIG1vZGUgKi8KKwlNQ0ZfQ0NNX01JU0NDUiA9IChNQ0ZfQ0NNX01JU0NDUiAmIH4gTUNGX0NDTV9NSVNDQ1JfTElNUCk7CisKKwkvKiBXYWl0IGZvciBQTEwgdG8gbG9jayAqLworCXdoaWxlICghKE1DRl9DQ01fTUlTQ0NSICYgTUNGX0NDTV9NSVNDQ1JfUExMX0xPQ0spKQorCQk7CisJCisJZm91dCA9IGdldF9zeXNfY2xvY2soKTsKKworCXJldHVybiBmb3V0OworfQorCitpbnQgZ2V0X3N5c19jbG9jayh2b2lkKQoreworCWludCBkaXZpZGVyOworCQorCS8qIFRlc3QgdG8gc2VlIGlmIGRldmljZSBpcyBpbiBMSU1QIG1vZGUgKi8KKwlpZiAoTUNGX0NDTV9NSVNDQ1IgJiBNQ0ZfQ0NNX01JU0NDUl9MSU1QKSB7CisJCWRpdmlkZXIgPSBNQ0ZfQ0NNX0NEUiAmIE1DRl9DQ01fQ0RSX0xQRElWKDB4Rik7CisJCXJldHVybiAoRlJFRi8oMiA8PCBkaXZpZGVyKSk7CisJfQorCWVsc2UKKwkJcmV0dXJuICgoRlJFRiAqIE1DRl9QTExfUEZEUikgLyAoQlVTRElWICogNCkpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNjgzMjgvaGVhZC1waWxvdC5TIGIvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNjgzMjgvaGVhZC1waWxvdC5TCmluZGV4IGM0Njc3NWYuLjQ2YjM2MDQgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzY4MzI4L2hlYWQtcGlsb3QuUworKysgYi9hcmNoL202OGtub21tdS9wbGF0Zm9ybS82ODMyOC9oZWFkLXBpbG90LlMKQEAgLTIxLDcgKzIxLDYgQEAKIC5nbG9iYWwgX3N0YXJ0CiAKIC5nbG9iYWwgX3JhbWJhc2UKLS5nbG9iYWwgX19yYW12ZWMKIC5nbG9iYWwgX3JhbXZlYwogLmdsb2JhbCBfcmFtc3RhcnQKIC5nbG9iYWwgX3JhbWVuZApAQCAtMTIxLDcgKzEyMCw3IEBACiAJREJHX1BVVEMoJ0InKQogCiAJLyogQ29weSBjb21tYW5kIGxpbmUgZnJvbSBiZWdpbm5pbmcgb2YgUkFNICgrMTYpIHRvIGVuZCBvZiBic3MgKi8KLQltb3ZlbAkjX19yYW12ZWMsICVkNworCW1vdmVsCSNDT05GSUdfVkVDVE9SQkFTRSwgJWQ3CiAJYWRkbAkjMTYsICVkNwogCW1vdmVhbAklZDcsICVhMAogCW1vdmVhbAkjX2Vic3MsICVhMQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNjgzMjgvaGVhZC1yYW0uUyBiL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzY4MzI4L2hlYWQtcmFtLlMKaW5kZXggNmJkYzliYy4uZThkYzkyNCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNjgzMjgvaGVhZC1yYW0uUworKysgYi9hcmNoL202OGtub21tdS9wbGF0Zm9ybS82ODMyOC9oZWFkLXJhbS5TCkBAIC0xLDEwICsxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KIAogCS5nbG9iYWwgX19tYWluCi0JLmdsb2JhbCBfX3JhbV9zdGFydAotCS5nbG9iYWwgX19yYW1fZW5kCiAJLmdsb2JhbCBfX3JvbV9zdGFydAotCS5nbG9iYWwgX19yb21fZW5kCiAKICAgICAgICAgLmdsb2JhbCBfcmFtYmFzZQogICAgICAgICAuZ2xvYmFsIF9yYW1zdGFydApAQCAtMTIsNiArOSw3IEBACiAJLmdsb2JhbCBzcGxhc2hfYml0cwogCS5nbG9iYWwgX3N0YXJ0CiAJLmdsb2JhbCBfc3RleHQKKwkuZ2xvYmFsIF9lZGF0YQogCiAjZGVmaW5lIERFQlVHCiAjZGVmaW5lIFJPTV9PRkZTRVQgMHgxMEMwMDAwMApAQCAtNzMsNyArNzEsNyBAQAogI2lmZGVmIENPTkZJR19SRUxPQ0FURQogCS8qIENvcHkgbWUgdG8gUkFNICovCiAJbW92ZWFsCSNfX3JvbV9zdGFydCwgJWEwCi0JbW92ZWFsCSNfX3JhbV9zdGFydCwgJWExCisJbW92ZWFsCSNfc3RleHQsICVhMQogCW1vdmVhbAkjX2VkYXRhLCAlYTIKIAogCS8qIENvcHkgJWEwIHRvICVhMSB1bnRpbCAlYTEgPT0gJWEyICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL2lyaXhzaWcuYyBiL2FyY2gvbWlwcy9rZXJuZWwvaXJpeHNpZy5jCmluZGV4IGE5YmY2Y2MuLjY3NmU4NjggMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvaXJpeHNpZy5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvaXJpeHNpZy5jCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvcmVzb3VyY2UuaD4KIAogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgpAQCAtNTQwLDggKzU0MSw2IEBACiAjZGVmaW5lIElSSVhfUF9QR0lEICAgMgogI2RlZmluZSBJUklYX1BfQUxMICAgIDcKIAotZXh0ZXJuIGludCBnZXRydXNhZ2Uoc3RydWN0IHRhc2tfc3RydWN0ICosIGludCwgc3RydWN0IHJ1c2FnZSBfX3VzZXIgKik7Ci0KICNkZWZpbmUgV19FWElURUQgICAgIDEKICNkZWZpbmUgV19UUkFQUEVEICAgIDIKICNkZWZpbmUgV19TVE9QUEVEICAgIDQKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvc3lzaXJpeC5jIGIvYXJjaC9taXBzL2tlcm5lbC9zeXNpcml4LmMKaW5kZXggMTllMWVmNC4uMTEzN2RkNiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9zeXNpcml4LmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9zeXNpcml4LmMKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KICNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CisjaW5jbHVkZSA8bGludXgvcmVzb3VyY2UuaD4KIAogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgpAQCAtMjM1LDcgKzIzNiw2IEBACiAjdW5kZWYgREVCVUdfUFJPQ0dSUFMKIAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaXJpeF9tYXBlbGYoaW50IGZkLCBzdHJ1Y3QgZWxmX3BoZHIgX191c2VyICp1c2VyX3BoZHJwLCBpbnQgY250KTsKLWV4dGVybiBpbnQgZ2V0cnVzYWdlKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgaW50IHdobywgc3RydWN0IHJ1c2FnZSBfX3VzZXIgKnJ1KTsKIGV4dGVybiBjaGFyICpwcm9tX2dldGVudihjaGFyICpuYW1lKTsKIGV4dGVybiBsb25nIHByb21fc2V0ZW52KGNoYXIgKm5hbWUsIGNoYXIgKnZhbHVlKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21vbWVudHVtL29jZWxvdF9nL2d0LWlycS5jIGIvYXJjaC9taXBzL21vbWVudHVtL29jZWxvdF9nL2d0LWlycS5jCmluZGV4IGU1ZWNlZWQuLjhiZDliODQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9tb21lbnR1bS9vY2Vsb3RfZy9ndC1pcnEuYworKysgYi9hcmNoL21pcHMvbW9tZW50dW0vb2NlbG90X2cvZ3QtaXJxLmMKQEAgLTU5LDcgKzU5LDcgQEAKICAqIGJpdF9udW0gICAtIEluZGljYXRlcyB3aGljaCBiaXQgbnVtYmVyIGluIHRoZSBjYXVzZSByZWdpc3RlcgogICoKICAqIE91dHB1dHMgOgotICogMSBpZiBzdWNjZXNmdWwsIDAgaWYgZmFpbHVyZQorICogMSBpZiBzdWNjZXNzZnVsLCAwIGlmIGZhaWx1cmUKICAqLwogaW50IGVuYWJsZV9nYWxpbGVvX2lycShpbnQgaW50X2NhdXNlLCBpbnQgYml0X251bSkKIHsKQEAgLTgzLDcgKzgzLDcgQEAKICAqIGJpdF9udW0gICAtIEluZGljYXRlcyB3aGljaCBiaXQgbnVtYmVyIGluIHRoZSBjYXVzZSByZWdpc3RlcgogICoKICAqIE91dHB1dHMgOgotICogMSBpZiBzdWNjZXNmdWwsIDAgaWYgZmFpbHVyZQorICogMSBpZiBzdWNjZXNzZnVsLCAwIGlmIGZhaWx1cmUKICAqLwogaW50IGRpc2FibGVfZ2FsaWxlb19pcnEoaW50IGludF9jYXVzZSwgaW50IGJpdF9udW0pCiB7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvb3Byb2ZpbGUvY29tbW9uLmMgYi9hcmNoL21pcHMvb3Byb2ZpbGUvY29tbW9uLmMKaW5kZXggYzMxZTRjZi4uNjVlYjU1NCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL29wcm9maWxlL2NvbW1vbi5jCisrKyBiL2FyY2gvbWlwcy9vcHJvZmlsZS9jb21tb24uYwpAQCAtMzgsNyArMzgsNyBAQAogCiAJZm9yIChpID0gMDsgaSA8IG1vZGVsLT5udW1fY291bnRlcnM7ICsraSkgewogCQlzdHJ1Y3QgZGVudHJ5ICpkaXI7Ci0JCWNoYXIgYnVmWzNdOworCQljaGFyIGJ1Zls0XTsKIAogCQlzbnByaW50ZihidWYsIHNpemVvZiBidWYsICIlZCIsIGkpOwogCQlkaXIgPSBvcHJvZmlsZWZzX21rZGlyKHNiLCByb290LCBidWYpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3NnaS1pcDIyL2lwMjItcmVzZXQuYyBiL2FyY2gvbWlwcy9zZ2ktaXAyMi9pcDIyLXJlc2V0LmMKaW5kZXggYTljNThlMC4uODEzNDIyMCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3NnaS1pcDIyL2lwMjItcmVzZXQuYworKysgYi9hcmNoL21pcHMvc2dpLWlwMjIvaXAyMi1yZXNldC5jCkBAIC0zNCw3ICszNCw3IEBACiAjZGVmaW5lIFBPV0VSRE9XTl9USU1FT1VUCTEyMAogCiAvKgotICogQmxpbmsgZnJlcXVlbmN5IGR1cmluZyByZWJvb3QgZ3JhY2UgcGVyaW9kIGFuZCB3aGVuIHBhbmljZWQuCisgKiBCbGluayBmcmVxdWVuY3kgZHVyaW5nIHJlYm9vdCBncmFjZSBwZXJpb2QgYW5kIHdoZW4gcGFuaWNrZWQuCiAgKi8KICNkZWZpbmUgUE9XRVJET1dOX0ZSRVEJCShIWiAvIDQpCiAjZGVmaW5lIFBBTklDX0ZSRVEJCShIWiAvIDgpCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvc2dpLWlwMzIvaXAzMi1yZXNldC5jIGIvYXJjaC9taXBzL3NnaS1pcDMyL2lwMzItcmVzZXQuYwppbmRleCBhYjlkOWNlLi43OWRkYjQ2IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvc2dpLWlwMzIvaXAzMi1yZXNldC5jCisrKyBiL2FyY2gvbWlwcy9zZ2ktaXAzMi9pcDMyLXJlc2V0LmMKQEAgLTI4LDEzICsyOCwxMyBAQAogCiAjZGVmaW5lIFBPV0VSRE9XTl9USU1FT1VUCTEyMAogLyoKLSAqIEJsaW5rIGZyZXF1ZW5jeSBkdXJpbmcgcmVib290IGdyYWNlIHBlcmlvZCBhbmQgd2hlbiBwYW5pY2VkLgorICogQmxpbmsgZnJlcXVlbmN5IGR1cmluZyByZWJvb3QgZ3JhY2UgcGVyaW9kIGFuZCB3aGVuIHBhbmlja2VkLgogICovCiAjZGVmaW5lIFBPV0VSRE9XTl9GUkVRCQkoSFogLyA0KQogI2RlZmluZSBQQU5JQ19GUkVRCQkoSFogLyA4KQogCiBzdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgcG93ZXJfdGltZXIsIGJsaW5rX3RpbWVyLCBkZWJvdW5jZV90aW1lcjsKLXN0YXRpYyBpbnQgaGFzX3BhbmljZWQsIHNodXRpbmdfZG93bjsKK3N0YXRpYyBpbnQgaGFzX3Bhbmlja2VkLCBzaHV0aW5nX2Rvd247CiAKIHN0YXRpYyB2b2lkIGlwMzJfbWFjaGluZV9yZXN0YXJ0KGNoYXIgKmNvbW1hbmQpIF9fYXR0cmlidXRlX18oKG5vcmV0dXJuKSk7CiBzdGF0aWMgdm9pZCBpcDMyX21hY2hpbmVfaGFsdCh2b2lkKSBfX2F0dHJpYnV0ZV9fKChub3JldHVybikpOwpAQCAtMTA5LDcgKzEwOSw3IEBACiAJfQogCUNNT1NfV1JJVEUocmVnX2EgJiB+RFNfUkVHQV9EVjAsIFJUQ19SRUdfQSk7CiAKLQlpZiAoaGFzX3BhbmljZWQpCisJaWYgKGhhc19wYW5pY2tlZCkKIAkJaXAzMl9tYWNoaW5lX3Jlc3RhcnQoTlVMTCk7CiAKIAllbmFibGVfaXJxKE1BQ0VJU0FfUlRDX0lSUSk7CkBAIC0xMTcsNyArMTE3LDcgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIGlwMzJfcG93ZXJfYnV0dG9uKHZvaWQpCiB7Ci0JaWYgKGhhc19wYW5pY2VkKQorCWlmIChoYXNfcGFuaWNrZWQpCiAJCXJldHVybjsKIAogCWlmIChzaHV0aW5nX2Rvd24gfHwga2lsbF9wcm9jKDEsIFNJR0lOVCwgMSkpIHsKQEAgLTE2MSw5ICsxNjEsOSBAQAogewogCXVuc2lnbmVkIGxvbmcgbGVkOwogCi0JaWYgKGhhc19wYW5pY2VkKQorCWlmIChoYXNfcGFuaWNrZWQpCiAJCXJldHVybiBOT1RJRllfRE9ORTsKLQloYXNfcGFuaWNlZCA9IDE7CisJaGFzX3Bhbmlja2VkID0gMTsKIAogCS8qIHR1cm4gb2ZmIHRoZSBncmVlbiBMRUQgKi8KIAlsZWQgPSBtYWNlLT5wZXJpZi5jdHJsLm1pc2MgfCBNQUNFSVNBX0xFRF9HUkVFTjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvY3Jhc2guYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvY3Jhc2guYwppbmRleCBkYmNiODU5Li5lMjUzYTQ1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2NyYXNoLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcmFzaC5jCkBAIC0xNzksNyArMTc5LDcgQEAKIAogCS8qCiAJICogVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBhZnRlciB0aGUgc3lzdGVtCi0JICogaGFzIHBhbmljZWQgb3IgaXMgb3RoZXJ3aXNlIGluIGEgY3JpdGljYWwgc3RhdGUuCisJICogaGFzIHBhbmlja2VkIG9yIGlzIG90aGVyd2lzZSBpbiBhIGNyaXRpY2FsIHN0YXRlLgogCSAqIFRoZSBtaW5pbXVtIGFtb3VudCBvZiBjb2RlIHRvIGFsbG93IGEga2V4ZWMnZCBrZXJuZWwKIAkgKiB0byBydW4gc3VjY2Vzc2Z1bGx5IG5lZWRzIHRvIGhhcHBlbiBoZXJlLgogCSAqCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL21hY2hpbmVfa2V4ZWNfMzIuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvbWFjaGluZV9rZXhlY18zMi5jCmluZGV4IDQ0MzYwNjEuLmNiYWEzNDEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvbWFjaGluZV9rZXhlY18zMi5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvbWFjaGluZV9rZXhlY18zMi5jCkBAIC0zMCw4ICszMCw4IEBACiAgKi8KIHZvaWQgZGVmYXVsdF9tYWNoaW5lX2tleGVjKHN0cnVjdCBraW1hZ2UgKmltYWdlKQogewotCWNvbnN0IGV4dGVybiB1bnNpZ25lZCBjaGFyIHJlbG9jYXRlX25ld19rZXJuZWxbXTsKLQljb25zdCBleHRlcm4gdW5zaWduZWQgaW50IHJlbG9jYXRlX25ld19rZXJuZWxfc2l6ZTsKKwlleHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciByZWxvY2F0ZV9uZXdfa2VybmVsW107CisJZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGludCByZWxvY2F0ZV9uZXdfa2VybmVsX3NpemU7CiAJdW5zaWduZWQgbG9uZyBwYWdlX2xpc3Q7CiAJdW5zaWduZWQgbG9uZyByZWJvb3RfY29kZV9idWZmZXIsIHJlYm9vdF9jb2RlX2J1ZmZlcl9waHlzOwogCXJlbG9jYXRlX25ld19rZXJuZWxfdCBybms7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3BjaV8zMi5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfMzIuYwppbmRleCBjODU4ZWI0Li5iNTQzMWNjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3BjaV8zMi5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpXzMyLmMKQEAgLTE2NTQsNyArMTY1NCw2IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJdm1hLT52bV9wZ29mZiA9IG9mZnNldCA+PiBQQUdFX1NISUZUOwotCXZtYS0+dm1fZmxhZ3MgfD0gVk1fU0hNIHwgVk1fTE9DS0VEIHwgVk1fSU87CiAJdm1hLT52bV9wYWdlX3Byb3QgPSBfX3BjaV9tbWFwX3NldF9wZ3Byb3QoZGV2LCBycCwKIAkJCQkJCSAgdm1hLT52bV9wYWdlX3Byb3QsCiAJCQkJCQkgIG1tYXBfc3RhdGUsIHdyaXRlX2NvbWJpbmUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfNjQuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpXzY0LmMKaW5kZXggNWFkODdjNC4uMjQ3OTM3ZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfNjQuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BjaV82NC5jCkBAIC04NzcsNyArODc3LDYgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAl2bWEtPnZtX3Bnb2ZmID0gb2Zmc2V0ID4+IFBBR0VfU0hJRlQ7Ci0Jdm1hLT52bV9mbGFncyB8PSBWTV9TSE0gfCBWTV9MT0NLRUQgfCBWTV9JTzsKIAl2bWEtPnZtX3BhZ2VfcHJvdCA9IF9fcGNpX21tYXBfc2V0X3BncHJvdChkZXYsIHJwLAogCQkJCQkJICB2bWEtPnZtX3BhZ2VfcHJvdCwKIAkJCQkJCSAgbW1hcF9zdGF0ZSwgd3JpdGVfY29tYmluZSk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3Byb2NfcHBjNjQuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvY19wcGM2NC5jCmluZGV4IDJiODdmODIuLjJhYjhmMmIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvY19wcGM2NC5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvY19wcGM2NC5jCkBAIC0xMTUsOCArMTE1LDYgQEAKIHsKIAlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRwID0gUERFKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKTsKIAotCXZtYS0+dm1fZmxhZ3MgfD0gVk1fU0hNIHwgVk1fTE9DS0VEOwotCiAJaWYgKCh2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQpID4gZHAtPnNpemUpCiAJCXJldHVybiAtRUlOVkFMOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3RpbWUuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdGltZS5jCmluZGV4IGQyMDkwNzUuLjdkZDVkYWIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdGltZS5jCkBAIC0xMDIsNyArMTAyLDcgQEAKIHU2NCB0Yl90b194czsKIHVuc2lnbmVkIHRiX3RvX3VzOwogCi0jZGVmaW5lIFRJQ0tMRU5fU0NBTEUJKFNISUZUX1NDQUxFIC0gMTApCisjZGVmaW5lIFRJQ0tMRU5fU0NBTEUJVElDS19MRU5HVEhfU0hJRlQKIHU2NCBsYXN0X3RpY2tfbGVuOwkvKiB1bml0cyBhcmUgbnMgLyAyXlRJQ0tMRU5fU0NBTEUgKi8KIHU2NCB0aWNrbGVuX3RvX3hzOwkvKiAwLjY0IGZyYWN0aW9uICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdHJhcHMuYwppbmRleCA5MWE2ZTA0Li41MmY1NjU5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC90cmFwcy5jCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9rcHJvYmVzLmg+CiAjaW5jbHVkZSA8bGludXgva2V4ZWMuaD4KKyNpbmNsdWRlIDxsaW51eC9iYWNrbGlnaHQuaD4KIAogI2luY2x1ZGUgPGFzbS9rZGVidWcuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgpAQCAtMTA1LDEwICsxMDYsMTggQEAKIAlzcGluX2xvY2tfaXJxKCZkaWVfbG9jayk7CiAJYnVzdF9zcGlubG9ja3MoMSk7CiAjaWZkZWYgQ09ORklHX1BNQUNfQkFDS0xJR0hUCi0JaWYgKG1hY2hpbmVfaXMocG93ZXJtYWMpKSB7Ci0JCXNldF9iYWNrbGlnaHRfZW5hYmxlKDEpOwotCQlzZXRfYmFja2xpZ2h0X2xldmVsKEJBQ0tMSUdIVF9NQVgpOworCW11dGV4X2xvY2soJnBtYWNfYmFja2xpZ2h0X211dGV4KTsKKwlpZiAobWFjaGluZV9pcyhwb3dlcm1hYykgJiYgcG1hY19iYWNrbGlnaHQpIHsKKwkJc3RydWN0IGJhY2tsaWdodF9wcm9wZXJ0aWVzICpwcm9wczsKKworCQlkb3duKCZwbWFjX2JhY2tsaWdodC0+c2VtKTsKKwkJcHJvcHMgPSBwbWFjX2JhY2tsaWdodC0+cHJvcHM7CisJCXByb3BzLT5icmlnaHRuZXNzID0gcHJvcHMtPm1heF9icmlnaHRuZXNzOworCQlwcm9wcy0+cG93ZXIgPSBGQl9CTEFOS19VTkJMQU5LOworCQlwcm9wcy0+dXBkYXRlX3N0YXR1cyhwbWFjX2JhY2tsaWdodCk7CisJCXVwKCZwbWFjX2JhY2tsaWdodC0+c2VtKTsKIAl9CisJbXV0ZXhfdW5sb2NrKCZwbWFjX2JhY2tsaWdodF9tdXRleCk7CiAjZW5kaWYKIAlwcmludGsoIk9vcHM6ICVzLCBzaWc6ICVsZCBbIyVkXVxuIiwgc3RyLCBlcnIsICsrZGllX2NvdW50ZXIpOwogI2lmZGVmIENPTkZJR19QUkVFTVBUCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vZmF1bHQuYyBiL2FyY2gvcG93ZXJwYy9tbS9mYXVsdC5jCmluZGV4IGZkYmJhNDIuLmEwYTllMWUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9mYXVsdC5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9mYXVsdC5jCkBAIC00MCw2ICs0MCw0MCBAQAogI2luY2x1ZGUgPGFzbS9rZGVidWcuaD4KICNpbmNsdWRlIDxhc20vc2lnaW5mby5oPgogCisjaWZkZWYgQ09ORklHX0tQUk9CRVMKK0FUT01JQ19OT1RJRklFUl9IRUFEKG5vdGlmeV9wYWdlX2ZhdWx0X2NoYWluKTsKKworLyogSG9vayB0byByZWdpc3RlciBmb3IgcGFnZSBmYXVsdCBub3RpZmljYXRpb25zICovCitpbnQgcmVnaXN0ZXJfcGFnZV9mYXVsdF9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKQoreworCXJldHVybiBhdG9taWNfbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIoJm5vdGlmeV9wYWdlX2ZhdWx0X2NoYWluLCBuYik7Cit9CisKK2ludCB1bnJlZ2lzdGVyX3BhZ2VfZmF1bHRfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKK3sKKwlyZXR1cm4gYXRvbWljX25vdGlmaWVyX2NoYWluX3VucmVnaXN0ZXIoJm5vdGlmeV9wYWdlX2ZhdWx0X2NoYWluLCBuYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG5vdGlmeV9wYWdlX2ZhdWx0KGVudW0gZGllX3ZhbCB2YWwsIGNvbnN0IGNoYXIgKnN0ciwKKwkJCXN0cnVjdCBwdF9yZWdzICpyZWdzLCBsb25nIGVyciwgaW50IHRyYXAsIGludCBzaWcpCit7CisJc3RydWN0IGRpZV9hcmdzIGFyZ3MgPSB7CisJCS5yZWdzID0gcmVncywKKwkJLnN0ciA9IHN0ciwKKwkJLmVyciA9IGVyciwKKwkJLnRyYXBuciA9IHRyYXAsCisJCS5zaWduciA9IHNpZworCX07CisJcmV0dXJuIGF0b21pY19ub3RpZmllcl9jYWxsX2NoYWluKCZub3RpZnlfcGFnZV9mYXVsdF9jaGFpbiwgdmFsLCAmYXJncyk7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgbm90aWZ5X3BhZ2VfZmF1bHQoZW51bSBkaWVfdmFsIHZhbCwgY29uc3QgY2hhciAqc3RyLAorCQkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGxvbmcgZXJyLCBpbnQgdHJhcCwgaW50IHNpZykKK3sKKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisjZW5kaWYKKwogLyoKICAqIENoZWNrIHdoZXRoZXIgdGhlIGluc3RydWN0aW9uIGF0IHJlZ3MtPm5pcCBpcyBhIHN0b3JlIHVzaW5nCiAgKiBhbiB1cGRhdGUgYWRkcmVzc2luZyBmb3JtIHdoaWNoIHdpbGwgdXBkYXRlIHIxLgpAQCAtMTQyLDcgKzE3Niw3IEBACiAJaXNfd3JpdGUgPSBlcnJvcl9jb2RlICYgRVNSX0RTVDsKICNlbmRpZiAvKiBDT05GSUdfNHh4IHx8IENPTkZJR19CT09LRSAqLwogCi0JaWYgKG5vdGlmeV9kaWUoRElFX1BBR0VfRkFVTFQsICJwYWdlX2ZhdWx0IiwgcmVncywgZXJyb3JfY29kZSwKKwlpZiAobm90aWZ5X3BhZ2VfZmF1bHQoRElFX1BBR0VfRkFVTFQsICJwYWdlX2ZhdWx0IiwgcmVncywgZXJyb3JfY29kZSwKIAkJCQkxMSwgU0lHU0VHVikgPT0gTk9USUZZX1NUT1ApCiAJCXJldHVybiAwOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvb3Byb2ZpbGUvY29tbW9uLmMgYi9hcmNoL3Bvd2VycGMvb3Byb2ZpbGUvY29tbW9uLmMKaW5kZXggMjdhZDU2Yi4uZmQwYmJiZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL29wcm9maWxlL2NvbW1vbi5jCisrKyBiL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9jb21tb24uYwpAQCAtOTQsNyArOTQsNyBAQAogCiAJZm9yIChpID0gMDsgaSA8IG1vZGVsLT5udW1fY291bnRlcnM7ICsraSkgewogCQlzdHJ1Y3QgZGVudHJ5ICpkaXI7Ci0JCWNoYXIgYnVmWzNdOworCQljaGFyIGJ1Zls0XTsKIAogCQlzbnByaW50ZihidWYsIHNpemVvZiBidWYsICIlZCIsIGkpOwogCQlkaXIgPSBvcHJvZmlsZWZzX21rZGlyKHNiLCByb290LCBidWYpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2NiZV9yZWdzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvY2JlX3JlZ3MuYwppbmRleCAyZGZkZTYxLi5jZTY5NmMxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvY2JlX3JlZ3MuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvY2JlX3JlZ3MuYwpAQCAtODksNyArODksNyBAQAogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqY3B1OwogCiAJLyogQnVpbGQgbG9jYWwgZmFzdCBtYXAgb2YgQ1BVcyAqLwotCWZvcl9lYWNoX2NwdShpKQorCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKQogCQljYmVfdGhyZWFkX21hcFtpXS5jcHVfbm9kZSA9IG9mX2dldF9jcHVfbm9kZShpLCBOVUxMKTsKIAogCS8qIEZpbmQgbWFwcyBmb3IgZWFjaCBkZXZpY2UgdHJlZSBDUFUgKi8KQEAgLTExMCw3ICsxMTAsNyBAQAogCQkJcmV0dXJuOwogCQl9CiAJCW1hcC0+Y3B1X25vZGUgPSBjcHU7Ci0JCWZvcl9lYWNoX2NwdShpKQorCQlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkKIAkJCWlmIChjYmVfdGhyZWFkX21hcFtpXS5jcHVfbm9kZSA9PSBjcHUpCiAJCQkJY2JlX3RocmVhZF9tYXBbaV0ucmVncyA9IG1hcDsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2ludGVycnVwdC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2ludGVycnVwdC5jCmluZGV4IGY0ZTJkODguLjFiYmY4MjIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9pbnRlcnJ1cHQuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvaW50ZXJydXB0LmMKQEAgLTE4MCw3ICsxODAsNyBAQAogCXVuc2lnbmVkIGxvbmcgcmVnczsKIAlzdHJ1Y3QgaWljICppaWM7CiAKLQlmb3JfZWFjaF9jcHUoY3B1KSB7CisJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgewogCQlpaWMgPSAmcGVyX2NwdShpaWMsIGNwdSk7CiAJCW5vZGVpZCA9IGNwdS8yOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvZmlsZS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2ZpbGUuYwppbmRleCA4MGMwMjY2Li43ODU0YTM4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvZmlsZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9maWxlLmMKQEAgLTExNTAsNyArMTE1MCw3IEBACiAJcmV0dXJuIG1hc2s7CiB9CiAKLXN0YXRpYyBpbnQgc3B1ZnNfbWZjX2ZsdXNoKHN0cnVjdCBmaWxlICpmaWxlKQorc3RhdGljIGludCBzcHVmc19tZmNfZmx1c2goc3RydWN0IGZpbGUgKmZpbGUsIGZsX293bmVyX3QgaWQpCiB7CiAJc3RydWN0IHNwdV9jb250ZXh0ICpjdHggPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJaW50IHJldDsKQEAgLTExNzYsNyArMTE3Niw3IEBACiBzdGF0aWMgaW50IHNwdWZzX21mY19mc3luYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAogCQkJICAgaW50IGRhdGFzeW5jKQogewotCXJldHVybiBzcHVmc19tZmNfZmx1c2goZmlsZSk7CisJcmV0dXJuIHNwdWZzX21mY19mbHVzaChmaWxlLCBOVUxMKTsKIH0KIAogc3RhdGljIGludCBzcHVmc19tZmNfZmFzeW5jKGludCBmZCwgc3RydWN0IGZpbGUgKmZpbGUsIGludCBvbikKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zd2l0Y2guYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zd2l0Y2guYwppbmRleCBiMzBlNTVkLi4zMDY4YjQyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc3dpdGNoLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3N3aXRjaC5jCkBAIC0yMTAwLDcgKzIxMDAsNyBAQAogICogQHNwdTogcG9pbnRlciB0byBTUFUgaW9tZW0gc3RydWN0dXJlLgogICoKICAqIFBlcmZvcm0gaGFydmVzdCArIHJlc3RvcmUsIGFzIHdlIG1heSBub3QgYmUgY29taW5nCi0gKiBmcm9tIGEgcHJldmlvdXMgc3VjY2VzZnVsIHNhdmUgb3BlcmF0aW9uLCBhbmQgdGhlCisgKiBmcm9tIGEgcHJldmlvdXMgc3VjY2Vzc2Z1bCBzYXZlIG9wZXJhdGlvbiwgYW5kIHRoZQogICogaGFyZHdhcmUgc3RhdGUgaXMgdW5rbm93bi4KICAqLwogaW50IHNwdV9yZXN0b3JlKHN0cnVjdCBzcHVfc3RhdGUgKm5ldywgc3RydWN0IHNwdSAqc3B1KQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9iYWNrbGlnaHQuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvYmFja2xpZ2h0LmMKaW5kZXggOGJlMmY3ZC4uNDk4YjA0MiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9iYWNrbGlnaHQuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL2JhY2tsaWdodC5jCkBAIC0zLDIwMCArMywxNDggQEAKICAqIENvbnRhaW5zIHN1cHBvcnQgZm9yIHRoZSBiYWNrbGlnaHQuCiAgKgogICogICBDb3B5cmlnaHQgKEMpIDIwMDAgQmVuamFtaW4gSGVycmVuc2NobWlkdAorICogICBDb3B5cmlnaHQgKEMpIDIwMDYgTWljaGFlbCBIYW5zZWxtYW5uIDxsaW51eC1rZXJuZWxAaGFuc21pLmNoPgogICoKICAqLwogCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+Ci0jaW5jbHVkZSA8bGludXgvcmVib290Lmg+Ci0jaW5jbHVkZSA8bGludXgvbnZyYW0uaD4KLSNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+Ci0jaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+Ci0jaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+Ci0jaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisjaW5jbHVkZSA8bGludXgvYmFja2xpZ2h0Lmg+CiAjaW5jbHVkZSA8YXNtL3Byb20uaD4KLSNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgotI2luY2x1ZGUgPGFzbS9udnJhbS5oPgogI2luY2x1ZGUgPGFzbS9iYWNrbGlnaHQuaD4KIAotI2luY2x1ZGUgPGxpbnV4L2FkYi5oPgotI2luY2x1ZGUgPGxpbnV4L3BtdS5oPgorI2RlZmluZSBPTERfQkFDS0xJR0hUX01BWCAxNQogCi1zdGF0aWMgc3RydWN0IGJhY2tsaWdodF9jb250cm9sbGVyICpiYWNrbGlnaHRlcjsKLXN0YXRpYyB2b2lkKiBiYWNrbGlnaHRlcl9kYXRhOwotc3RhdGljIGludCBiYWNrbGlnaHRfYXV0b3NhdmU7Ci1zdGF0aWMgaW50IGJhY2tsaWdodF9sZXZlbCA9IEJBQ0tMSUdIVF9NQVg7Ci1zdGF0aWMgaW50IGJhY2tsaWdodF9lbmFibGVkID0gMTsKLXN0YXRpYyBpbnQgYmFja2xpZ2h0X3JlcV9sZXZlbCA9IC0xOwotc3RhdGljIGludCBiYWNrbGlnaHRfcmVxX2VuYWJsZSA9IC0xOworLyogUHJvdGVjdCB0aGUgcG1hY19iYWNrbGlnaHQgdmFyaWFibGUgKi8KK0RFRklORV9NVVRFWChwbWFjX2JhY2tsaWdodF9tdXRleCk7CiAKLXN0YXRpYyB2b2lkIGJhY2tsaWdodF9jYWxsYmFjayh2b2lkICopOwotc3RhdGljIERFQ0xBUkVfV09SSyhiYWNrbGlnaHRfd29yaywgYmFja2xpZ2h0X2NhbGxiYWNrLCBOVUxMKTsKKy8qIE1haW4gYmFja2xpZ2h0IHN0b3JhZ2UKKyAqCisgKiBCYWNrbGlnaHQgZHJpdmVycyBpbiB0aGlzIHZhcmlhYmxlIGFyZSByZXF1aXJlZCB0byBoYXZlIHRoZSAicHJvcHMiCisgKiBhdHRyaWJ1dGUgc2V0IGFuZCB0byBoYXZlIGFuIHVwZGF0ZV9zdGF0dXMgZnVuY3Rpb24uCisgKgorICogV2UgY2FuIG9ubHkgc3RvcmUgb25lIGJhY2tsaWdodCBoZXJlLCBidXQgc2luY2UgQXBwbGUgbGFwdG9wcyBoYXZlIG9ubHkgb25lCisgKiBpbnRlcm5hbCBkaXNwbGF5LCBpdCBkb2Vzbid0IG1hdHRlci4gT3RoZXIgYmFja2xpZ2h0IGRyaXZlcnMgY2FuIGJlIHVzZWQKKyAqIGluZGVwZW5kZW50bHkuCisgKgorICogTG9jayBvcmRlcmluZzoKKyAqIHBtYWNfYmFja2xpZ2h0X211dGV4IChnbG9iYWwsIG1haW4gYmFja2xpZ2h0KQorICogICBwbWFjX2JhY2tsaWdodC0+c2VtIChiYWNrbGlnaHQgY2xhc3MpCisgKi8KK3N0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpwbWFjX2JhY2tsaWdodDsKIAotdm9pZCByZWdpc3Rlcl9iYWNrbGlnaHRfY29udHJvbGxlcihzdHJ1Y3QgYmFja2xpZ2h0X2NvbnRyb2xsZXIgKmN0cmxlciwKLQkJCQkJICB2b2lkICpkYXRhLCBjaGFyICp0eXBlKQoraW50IHBtYWNfaGFzX2JhY2tsaWdodF90eXBlKGNvbnN0IGNoYXIgKnR5cGUpCiB7Ci0Jc3RydWN0IGRldmljZV9ub2RlKiBia19ub2RlOwotCWNoYXIgKnByb3A7Ci0JaW50IHZhbGlkID0gMDsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUqIGJrX25vZGUgPSBmaW5kX2RldmljZXMoImJhY2tsaWdodCIpOwogCi0JLyogVGhlcmUncyBhbHJlYWR5IGEgbWF0Y2hpbmcgY29udHJvbGxlciwgYmFpbCBvdXQgKi8KLQlpZiAoYmFja2xpZ2h0ZXIgIT0gTlVMTCkKLQkJcmV0dXJuOwotCi0JYmtfbm9kZSA9IGZpbmRfZGV2aWNlcygiYmFja2xpZ2h0Iik7Ci0KLSNpZmRlZiBDT05GSUdfQURCX1BNVQotCS8qIFNwZWNpYWwgY2FzZSBmb3IgdGhlIG9sZCBQb3dlckJvb2sgc2luY2UgSSBjYW4ndCB0ZXN0IG9uIGl0ICovCi0JYmFja2xpZ2h0X2F1dG9zYXZlID0gbWFjaGluZV9pc19jb21wYXRpYmxlKCJBQVBMLDM0MDAvMjQwMCIpCi0JCXx8IG1hY2hpbmVfaXNfY29tcGF0aWJsZSgiQUFQTCwzNTAwIik7Ci0JaWYgKChiYWNrbGlnaHRfYXV0b3NhdmUKLQkgICAgIHx8IG1hY2hpbmVfaXNfY29tcGF0aWJsZSgiQUFQTCxQb3dlckJvb2sxOTk4IikKLQkgICAgIHx8IG1hY2hpbmVfaXNfY29tcGF0aWJsZSgiUG93ZXJCb29rMSwxIikpCi0JICAgICYmICFzdHJjbXAodHlwZSwgInBtdSIpKQotCQl2YWxpZCA9IDE7Ci0jZW5kaWYKIAlpZiAoYmtfbm9kZSkgewotCQlwcm9wID0gZ2V0X3Byb3BlcnR5KGJrX25vZGUsICJiYWNrbGlnaHQtY29udHJvbCIsIE5VTEwpOwotCQlpZiAocHJvcCAmJiAhc3RybmNtcChwcm9wLCB0eXBlLCBzdHJsZW4odHlwZSkpKQotCQkJdmFsaWQgPSAxOwotCX0KLQlpZiAoIXZhbGlkKQotCQlyZXR1cm47Ci0JYmFja2xpZ2h0ZXIgPSBjdHJsZXI7Ci0JYmFja2xpZ2h0ZXJfZGF0YSA9IGRhdGE7Ci0KLQlpZiAoYmtfbm9kZSAmJiAhYmFja2xpZ2h0X2F1dG9zYXZlKQotCQlwcm9wID0gZ2V0X3Byb3BlcnR5KGJrX25vZGUsICJia2x0IiwgTlVMTCk7Ci0JZWxzZQotCQlwcm9wID0gTlVMTDsKLQlpZiAocHJvcCkgewotCQliYWNrbGlnaHRfbGV2ZWwgPSAoKCpwcm9wKSsxKSA+PiAxOwotCQlpZiAoYmFja2xpZ2h0X2xldmVsID4gQkFDS0xJR0hUX01BWCkKLQkJCWJhY2tsaWdodF9sZXZlbCA9IEJBQ0tMSUdIVF9NQVg7CisJCWNoYXIgKnByb3AgPSBnZXRfcHJvcGVydHkoYmtfbm9kZSwgImJhY2tsaWdodC1jb250cm9sIiwgTlVMTCk7CisJCWlmIChwcm9wICYmIHN0cm5jbXAocHJvcCwgdHlwZSwgc3RybGVuKHR5cGUpKSA9PSAwKQorCQkJcmV0dXJuIDE7CiAJfQogCi0jaWZkZWYgQ09ORklHX0FEQl9QTVUKLQlpZiAoYmFja2xpZ2h0X2F1dG9zYXZlKSB7Ci0JCXN0cnVjdCBhZGJfcmVxdWVzdCByZXE7Ci0JCXBtdV9yZXF1ZXN0KCZyZXEsIE5VTEwsIDIsIDB4ZDksIDApOwotCQl3aGlsZSAoIXJlcS5jb21wbGV0ZSkKLQkJCXBtdV9wb2xsKCk7Ci0JCWJhY2tsaWdodF9sZXZlbCA9IHJlcS5yZXBseVswXSA+PiA0OwotCX0KLSNlbmRpZgotCWFjcXVpcmVfY29uc29sZV9zZW0oKTsKLQlpZiAoIWJhY2tsaWdodGVyLT5zZXRfZW5hYmxlKDEsIGJhY2tsaWdodF9sZXZlbCwgZGF0YSkpCi0JCWJhY2tsaWdodF9lbmFibGVkID0gMTsKLQlyZWxlYXNlX2NvbnNvbGVfc2VtKCk7Ci0KLQlwcmludGsoS0VSTl9JTkZPICJSZWdpc3RlcmVkIFwiJXNcIiBiYWNrbGlnaHQgY29udHJvbGxlciwiCi0JICAgICAgICJsZXZlbDogJWQvMTVcbiIsIHR5cGUsIGJhY2tsaWdodF9sZXZlbCk7Ci19Ci1FWFBPUlRfU1lNQk9MKHJlZ2lzdGVyX2JhY2tsaWdodF9jb250cm9sbGVyKTsKLQotdm9pZCB1bnJlZ2lzdGVyX2JhY2tsaWdodF9jb250cm9sbGVyKHN0cnVjdCBiYWNrbGlnaHRfY29udHJvbGxlcgotCQkJCQkgICAgKmN0cmxlciwgdm9pZCAqZGF0YSkKLXsKLQkvKiBXZSBrZWVwIHRoZSBjdXJyZW50IGJhY2tsaWdodCBsZXZlbCAoZm9yIG5vdykgKi8KLQlpZiAoY3RybGVyID09IGJhY2tsaWdodGVyICYmIGRhdGEgPT0gYmFja2xpZ2h0ZXJfZGF0YSkKLQkJYmFja2xpZ2h0ZXIgPSBOVUxMOwotfQotRVhQT1JUX1NZTUJPTCh1bnJlZ2lzdGVyX2JhY2tsaWdodF9jb250cm9sbGVyKTsKLQotc3RhdGljIGludCBfX3NldF9iYWNrbGlnaHRfZW5hYmxlKGludCBlbmFibGUpCi17Ci0JaW50IHJjOwotCi0JaWYgKCFiYWNrbGlnaHRlcikKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JYWNxdWlyZV9jb25zb2xlX3NlbSgpOwotCXJjID0gYmFja2xpZ2h0ZXItPnNldF9lbmFibGUoZW5hYmxlLCBiYWNrbGlnaHRfbGV2ZWwsCi0JCQkJICAgICBiYWNrbGlnaHRlcl9kYXRhKTsKLQlpZiAoIXJjKQotCQliYWNrbGlnaHRfZW5hYmxlZCA9IGVuYWJsZTsKLQlyZWxlYXNlX2NvbnNvbGVfc2VtKCk7Ci0JcmV0dXJuIHJjOwotfQotaW50IHNldF9iYWNrbGlnaHRfZW5hYmxlKGludCBlbmFibGUpCi17Ci0JaWYgKCFiYWNrbGlnaHRlcikKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JYmFja2xpZ2h0X3JlcV9lbmFibGUgPSBlbmFibGU7Ci0Jc2NoZWR1bGVfd29yaygmYmFja2xpZ2h0X3dvcmspOwogCXJldHVybiAwOwogfQogCi1FWFBPUlRfU1lNQk9MKHNldF9iYWNrbGlnaHRfZW5hYmxlKTsKLQotaW50IGdldF9iYWNrbGlnaHRfZW5hYmxlKHZvaWQpCitpbnQgcG1hY19iYWNrbGlnaHRfY3VydmVfbG9va3VwKHN0cnVjdCBmYl9pbmZvICppbmZvLCBpbnQgdmFsdWUpCiB7Ci0JaWYgKCFiYWNrbGlnaHRlcikKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JcmV0dXJuIGJhY2tsaWdodF9lbmFibGVkOwotfQotRVhQT1JUX1NZTUJPTChnZXRfYmFja2xpZ2h0X2VuYWJsZSk7CisJaW50IGxldmVsID0gKEZCX0JBQ0tMSUdIVF9MRVZFTFMgLSAxKTsKIAotc3RhdGljIGludCBfX3NldF9iYWNrbGlnaHRfbGV2ZWwoaW50IGxldmVsKQotewotCWludCByYyA9IDA7CisJaWYgKGluZm8gJiYgaW5mby0+YmxfZGV2KSB7CisJCWludCBpLCBtYXggPSAwOwogCi0JaWYgKCFiYWNrbGlnaHRlcikKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JaWYgKGxldmVsIDwgQkFDS0xJR0hUX01JTikKLQkJbGV2ZWwgPSBCQUNLTElHSFRfT0ZGOwotCWlmIChsZXZlbCA+IEJBQ0tMSUdIVF9NQVgpCi0JCWxldmVsID0gQkFDS0xJR0hUX01BWDsKLQlhY3F1aXJlX2NvbnNvbGVfc2VtKCk7Ci0JaWYgKGJhY2tsaWdodF9lbmFibGVkKQotCQlyYyA9IGJhY2tsaWdodGVyLT5zZXRfbGV2ZWwobGV2ZWwsIGJhY2tsaWdodGVyX2RhdGEpOwotCWlmICghcmMpCi0JCWJhY2tsaWdodF9sZXZlbCA9IGxldmVsOwotCXJlbGVhc2VfY29uc29sZV9zZW0oKTsKLQlpZiAoIXJjICYmICFiYWNrbGlnaHRfYXV0b3NhdmUpIHsKLQkJbGV2ZWwgPDw9MTsKLQkJaWYgKGxldmVsICYgMHgxMCkKLQkJCWxldmVsIHw9IDB4MDE7Ci0JCS8vIC0tIHRvZG86IHNhdmUgdG8gcHJvcGVydHkgImJrbHQiCisJCS8qIExvb2sgZm9yIGJpZ2dlc3QgdmFsdWUgKi8KKwkJZm9yIChpID0gMDsgaSA8IEZCX0JBQ0tMSUdIVF9MRVZFTFM7IGkrKykKKwkJCW1heCA9IG1heCgoaW50KWluZm8tPmJsX2N1cnZlW2ldLCBtYXgpOworCisJCS8qIExvb2sgZm9yIG5lYXJlc3QgdmFsdWUgKi8KKwkJZm9yIChpID0gMDsgaSA8IEZCX0JBQ0tMSUdIVF9MRVZFTFM7IGkrKykgeworCQkJaW50IGRpZmYgPSBhYnMoaW5mby0+YmxfY3VydmVbaV0gLSB2YWx1ZSk7CisJCQlpZiAoZGlmZiA8IG1heCkgeworCQkJCW1heCA9IGRpZmY7CisJCQkJbGV2ZWwgPSBpOworCQkJfQorCQl9CisKIAl9Ci0JcmV0dXJuIHJjOwotfQotaW50IHNldF9iYWNrbGlnaHRfbGV2ZWwoaW50IGxldmVsKQotewotCWlmICghYmFja2xpZ2h0ZXIpCi0JCXJldHVybiAtRU5PREVWOwotCWJhY2tsaWdodF9yZXFfbGV2ZWwgPSBsZXZlbDsKLQlzY2hlZHVsZV93b3JrKCZiYWNrbGlnaHRfd29yayk7Ci0JcmV0dXJuIDA7CisKKwlyZXR1cm4gbGV2ZWw7CiB9CiAKLUVYUE9SVF9TWU1CT0woc2V0X2JhY2tsaWdodF9sZXZlbCk7Ci0KLWludCBnZXRfYmFja2xpZ2h0X2xldmVsKHZvaWQpCitzdGF0aWMgdm9pZCBwbWFjX2JhY2tsaWdodF9rZXkoaW50IGRpcmVjdGlvbikKIHsKLQlpZiAoIWJhY2tsaWdodGVyKQotCQlyZXR1cm4gLUVOT0RFVjsKLQlyZXR1cm4gYmFja2xpZ2h0X2xldmVsOworCW11dGV4X2xvY2soJnBtYWNfYmFja2xpZ2h0X211dGV4KTsKKwlpZiAocG1hY19iYWNrbGlnaHQpIHsKKwkJc3RydWN0IGJhY2tsaWdodF9wcm9wZXJ0aWVzICpwcm9wczsKKwkJaW50IGJyaWdodG5lc3M7CisKKwkJZG93bigmcG1hY19iYWNrbGlnaHQtPnNlbSk7CisJCXByb3BzID0gcG1hY19iYWNrbGlnaHQtPnByb3BzOworCisJCWJyaWdodG5lc3MgPSBwcm9wcy0+YnJpZ2h0bmVzcyArCisJCQkoKGRpcmVjdGlvbj8tMToxKSAqIChwcm9wcy0+bWF4X2JyaWdodG5lc3MgLyAxNSkpOworCisJCWlmIChicmlnaHRuZXNzIDwgMCkKKwkJCWJyaWdodG5lc3MgPSAwOworCQllbHNlIGlmIChicmlnaHRuZXNzID4gcHJvcHMtPm1heF9icmlnaHRuZXNzKQorCQkJYnJpZ2h0bmVzcyA9IHByb3BzLT5tYXhfYnJpZ2h0bmVzczsKKworCQlwcm9wcy0+YnJpZ2h0bmVzcyA9IGJyaWdodG5lc3M7CisJCXByb3BzLT51cGRhdGVfc3RhdHVzKHBtYWNfYmFja2xpZ2h0KTsKKworCQl1cCgmcG1hY19iYWNrbGlnaHQtPnNlbSk7CisJfQorCW11dGV4X3VubG9jaygmcG1hY19iYWNrbGlnaHRfbXV0ZXgpOwogfQotRVhQT1JUX1NZTUJPTChnZXRfYmFja2xpZ2h0X2xldmVsKTsKIAotc3RhdGljIHZvaWQgYmFja2xpZ2h0X2NhbGxiYWNrKHZvaWQgKmR1bW15KQordm9pZCBwbWFjX2JhY2tsaWdodF9rZXlfdXAoKQogewotCWludCBsZXZlbCwgZW5hYmxlOworCXBtYWNfYmFja2xpZ2h0X2tleSgwKTsKK30KIAotCWRvIHsKLQkJbGV2ZWwgPSBiYWNrbGlnaHRfcmVxX2xldmVsOwotCQllbmFibGUgPSBiYWNrbGlnaHRfcmVxX2VuYWJsZTsKLQkJbWIoKTsKK3ZvaWQgcG1hY19iYWNrbGlnaHRfa2V5X2Rvd24oKQoreworCXBtYWNfYmFja2xpZ2h0X2tleSgxKTsKK30KIAotCQlpZiAobGV2ZWwgPj0gMCkKLQkJCV9fc2V0X2JhY2tsaWdodF9sZXZlbChsZXZlbCk7Ci0JCWlmIChlbmFibGUgPj0gMCkKLQkJCV9fc2V0X2JhY2tsaWdodF9lbmFibGUoZW5hYmxlKTsKLQl9IHdoaWxlKGNtcHhjaGcoJmJhY2tsaWdodF9yZXFfbGV2ZWwsIGxldmVsLCAtMSkgIT0gbGV2ZWwgfHwKLQkJY21weGNoZygmYmFja2xpZ2h0X3JlcV9lbmFibGUsIGVuYWJsZSwgLTEpICE9IGVuYWJsZSk7CitpbnQgcG1hY19iYWNrbGlnaHRfc2V0X2xlZ2FjeV9icmlnaHRuZXNzKGludCBicmlnaHRuZXNzKQoreworCWludCBlcnJvciA9IC1FTlhJTzsKKworCW11dGV4X2xvY2soJnBtYWNfYmFja2xpZ2h0X211dGV4KTsKKwlpZiAocG1hY19iYWNrbGlnaHQpIHsKKwkJc3RydWN0IGJhY2tsaWdodF9wcm9wZXJ0aWVzICpwcm9wczsKKworCQlkb3duKCZwbWFjX2JhY2tsaWdodC0+c2VtKTsKKwkJcHJvcHMgPSBwbWFjX2JhY2tsaWdodC0+cHJvcHM7CisJCXByb3BzLT5icmlnaHRuZXNzID0gYnJpZ2h0bmVzcyAqCisJCQlwcm9wcy0+bWF4X2JyaWdodG5lc3MgLyBPTERfQkFDS0xJR0hUX01BWDsKKwkJcHJvcHMtPnVwZGF0ZV9zdGF0dXMocG1hY19iYWNrbGlnaHQpOworCQl1cCgmcG1hY19iYWNrbGlnaHQtPnNlbSk7CisKKwkJZXJyb3IgPSAwOworCX0KKwltdXRleF91bmxvY2soJnBtYWNfYmFja2xpZ2h0X211dGV4KTsKKworCXJldHVybiBlcnJvcjsKK30KKworaW50IHBtYWNfYmFja2xpZ2h0X2dldF9sZWdhY3lfYnJpZ2h0bmVzcygpCit7CisJaW50IHJlc3VsdCA9IC1FTlhJTzsKKworCW11dGV4X2xvY2soJnBtYWNfYmFja2xpZ2h0X211dGV4KTsKKwlpZiAocG1hY19iYWNrbGlnaHQpIHsKKwkJc3RydWN0IGJhY2tsaWdodF9wcm9wZXJ0aWVzICpwcm9wczsKKworCQlkb3duKCZwbWFjX2JhY2tsaWdodC0+c2VtKTsKKwkJcHJvcHMgPSBwbWFjX2JhY2tsaWdodC0+cHJvcHM7CisJCXJlc3VsdCA9IHByb3BzLT5icmlnaHRuZXNzICoKKwkJCU9MRF9CQUNLTElHSFRfTUFYIC8gcHJvcHMtPm1heF9icmlnaHRuZXNzOworCQl1cCgmcG1hY19iYWNrbGlnaHQtPnNlbSk7CisJfQorCW11dGV4X3VubG9jaygmcG1hY19iYWNrbGlnaHRfbXV0ZXgpOworCisJcmV0dXJuIHJlc3VsdDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9lZWhfY2FjaGUuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9lZWhfY2FjaGUuYwppbmRleCA5OGMyM2FlLi5jMzdhODQ5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZWVoX2NhY2hlLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2VlaF9jYWNoZS5jCkBAIC0yODcsNyArMjg3LDcgQEAKICAqIGZpbmQgdGhlIHBjaSBkZXZpY2UgdGhhdCBjb3JyZXNwb25kcyB0byBhIGdpdmVuIGFkZHJlc3MuCiAgKiBUaGlzIHJvdXRpbmUgc2NhbnMgYWxsIHBjaSBidXNzZXMgdG8gYnVpbGQgdGhlIGNhY2hlLgogICogTXVzdCBiZSBydW4gbGF0ZSBpbiBib290IHByb2Nlc3MsIGFmdGVyIHRoZSBwY2kgY29udHJvbGxlcnMKLSAqIGhhdmUgYmVlbiBzY2FuZWQgZm9yIGRldmljZXMgKGFmdGVyIGFsbCBkZXZpY2UgcmVzb3VyY2VzIGFyZSBrbm93bikuCisgKiBoYXZlIGJlZW4gc2Nhbm5lZCBmb3IgZGV2aWNlcyAoYWZ0ZXIgYWxsIGRldmljZSByZXNvdXJjZXMgYXJlIGtub3duKS4KICAqLwogdm9pZCBfX2luaXQgcGNpX2FkZHJfY2FjaGVfYnVpbGQodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy94bW9uL3htb24uYyBiL2FyY2gvcG93ZXJwYy94bW9uL3htb24uYwppbmRleCA0NzM1YjQxLi4wNzQxZGY4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMveG1vbi94bW9uLmMKKysrIGIvYXJjaC9wb3dlcnBjL3htb24veG1vbi5jCkBAIC0yNiw5ICsyNiw2IEBACiAjaW5jbHVkZSA8YXNtL3Byb20uaD4KICNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgogI2luY2x1ZGUgPGFzbS94bW9uLmg+Ci0jaWZkZWYgQ09ORklHX1BNQUNfQkFDS0xJR0hUCi0jaW5jbHVkZSA8YXNtL2JhY2tsaWdodC5oPgotI2VuZGlmCiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL21tdS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMva2VybmVsL21hY2hpbmVfa2V4ZWMuYyBiL2FyY2gvcHBjL2tlcm5lbC9tYWNoaW5lX2tleGVjLmMKaW5kZXggODRkNjVhOC4uYTQ2OWJhNCAxMDA2NDQKLS0tIGEvYXJjaC9wcGMva2VybmVsL21hY2hpbmVfa2V4ZWMuYworKysgYi9hcmNoL3BwYy9rZXJuZWwvbWFjaGluZV9rZXhlYy5jCkBAIC0yNSw4ICsyNSw4IEBACiAJCQkJdW5zaWduZWQgbG9uZyByZWJvb3RfY29kZV9idWZmZXIsCiAJCQkJdW5zaWduZWQgbG9uZyBzdGFydF9hZGRyZXNzKSBBVFRSSUJfTk9SRVQ7CiAKLWNvbnN0IGV4dGVybiB1bnNpZ25lZCBjaGFyIHJlbG9jYXRlX25ld19rZXJuZWxbXTsKLWNvbnN0IGV4dGVybiB1bnNpZ25lZCBpbnQgcmVsb2NhdGVfbmV3X2tlcm5lbF9zaXplOworZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgcmVsb2NhdGVfbmV3X2tlcm5lbFtdOworZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGludCByZWxvY2F0ZV9uZXdfa2VybmVsX3NpemU7CiAKIHZvaWQgbWFjaGluZV9zaHV0ZG93bih2b2lkKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMva2VybmVsL3BjaS5jIGIvYXJjaC9wcGMva2VybmVsL3BjaS5jCmluZGV4IDgwOTY3M2EuLmQyMGFjY2YgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL2tlcm5lbC9wY2kuYworKysgYi9hcmNoL3BwYy9rZXJuZWwvcGNpLmMKQEAgLTEwMzIsNyArMTAzMiw2IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJdm1hLT52bV9wZ29mZiA9IG9mZnNldCA+PiBQQUdFX1NISUZUOwotCXZtYS0+dm1fZmxhZ3MgfD0gVk1fU0hNIHwgVk1fTE9DS0VEIHwgVk1fSU87CiAJdm1hLT52bV9wYWdlX3Byb3QgPSBfX3BjaV9tbWFwX3NldF9wZ3Byb3QoZGV2LCBycCwKIAkJCQkJCSAgdm1hLT52bV9wYWdlX3Byb3QsCiAJCQkJCQkgIG1tYXBfc3RhdGUsIHdyaXRlX2NvbWJpbmUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2NyeXB0by9hZXNfczM5MC5jIGIvYXJjaC9zMzkwL2NyeXB0by9hZXNfczM5MC5jCmluZGV4IGM1Y2EyZGMuLjU3MTNjN2UgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9jcnlwdG8vYWVzX3MzOTAuYworKysgYi9hcmNoL3MzOTAvY3J5cHRvL2Flc19zMzkwLmMKQEAgLTM3LDEwICszNywxMCBAQAogCWludCBrZXlfbGVuOwogfTsKIAotc3RhdGljIGludCBhZXNfc2V0X2tleSh2b2lkICpjdHgsIGNvbnN0IHU4ICppbl9rZXksIHVuc2lnbmVkIGludCBrZXlfbGVuLAotCQkgICAgICAgdTMyICpmbGFncykKK3N0YXRpYyBpbnQgYWVzX3NldF9rZXkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgY29uc3QgdTggKmluX2tleSwKKwkJICAgICAgIHVuc2lnbmVkIGludCBrZXlfbGVuLCB1MzIgKmZsYWdzKQogewotCXN0cnVjdCBzMzkwX2Flc19jdHggKnNjdHggPSBjdHg7CisJc3RydWN0IHMzOTBfYWVzX2N0eCAqc2N0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7CiAKIAlzd2l0Y2ggKGtleV9sZW4pIHsKIAljYXNlIDE2OgpAQCAtNzAsOSArNzAsOSBAQAogCXJldHVybiAtRUlOVkFMOwogfQogCi1zdGF0aWMgdm9pZCBhZXNfZW5jcnlwdCh2b2lkICpjdHgsIHU4ICpvdXQsIGNvbnN0IHU4ICppbikKK3N0YXRpYyB2b2lkIGFlc19lbmNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpvdXQsIGNvbnN0IHU4ICppbikKIHsKLQljb25zdCBzdHJ1Y3QgczM5MF9hZXNfY3R4ICpzY3R4ID0gY3R4OworCWNvbnN0IHN0cnVjdCBzMzkwX2Flc19jdHggKnNjdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOwogCiAJc3dpdGNoIChzY3R4LT5rZXlfbGVuKSB7CiAJY2FzZSAxNjoKQEAgLTkwLDkgKzkwLDkgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGFlc19kZWNyeXB0KHZvaWQgKmN0eCwgdTggKm91dCwgY29uc3QgdTggKmluKQorc3RhdGljIHZvaWQgYWVzX2RlY3J5cHQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKm91dCwgY29uc3QgdTggKmluKQogewotCWNvbnN0IHN0cnVjdCBzMzkwX2Flc19jdHggKnNjdHggPSBjdHg7CisJY29uc3Qgc3RydWN0IHMzOTBfYWVzX2N0eCAqc2N0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7CiAKIAlzd2l0Y2ggKHNjdHgtPmtleV9sZW4pIHsKIAljYXNlIDE2OgpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2NyeXB0by9kZXNfczM5MC5jIGIvYXJjaC9zMzkwL2NyeXB0by9kZXNfczM5MC5jCmluZGV4IGUzYzM3YWEuLmIzZjc0OTYgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9jcnlwdG8vZGVzX3MzOTAuYworKysgYi9hcmNoL3MzOTAvY3J5cHRvL2Rlc19zMzkwLmMKQEAgLTQ0LDEwICs0NCwxMCBAQAogCXU4IGtleVtERVMzXzE5Ml9LRVlfU0laRV07CiB9OwogCi1zdGF0aWMgaW50IGRlc19zZXRrZXkodm9pZCAqY3R4LCBjb25zdCB1OCAqa2V5LCB1bnNpZ25lZCBpbnQga2V5bGVuLAotCQkgICAgICB1MzIgKmZsYWdzKQorc3RhdGljIGludCBkZXNfc2V0a2V5KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIGNvbnN0IHU4ICprZXksCisJCSAgICAgIHVuc2lnbmVkIGludCBrZXlsZW4sIHUzMiAqZmxhZ3MpCiB7Ci0Jc3RydWN0IGNyeXB0X3MzOTBfZGVzX2N0eCAqZGN0eCA9IGN0eDsKKwlzdHJ1Y3QgY3J5cHRfczM5MF9kZXNfY3R4ICpkY3R4ID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKIAlpbnQgcmV0OwogCiAJLyogdGVzdCBpZiBrZXkgaXMgdmFsaWQgKG5vdCBhIHdlYWsga2V5KSAqLwpAQCAtNTcsMTYgKzU3LDE2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgZGVzX2VuY3J5cHQodm9pZCAqY3R4LCB1OCAqb3V0LCBjb25zdCB1OCAqaW4pCitzdGF0aWMgdm9pZCBkZXNfZW5jcnlwdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqb3V0LCBjb25zdCB1OCAqaW4pCiB7Ci0Jc3RydWN0IGNyeXB0X3MzOTBfZGVzX2N0eCAqZGN0eCA9IGN0eDsKKwlzdHJ1Y3QgY3J5cHRfczM5MF9kZXNfY3R4ICpkY3R4ID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKIAogCWNyeXB0X3MzOTBfa20oS01fREVBX0VOQ1JZUFQsIGRjdHgtPmtleSwgb3V0LCBpbiwgREVTX0JMT0NLX1NJWkUpOwogfQogCi1zdGF0aWMgdm9pZCBkZXNfZGVjcnlwdCh2b2lkICpjdHgsIHU4ICpvdXQsIGNvbnN0IHU4ICppbikKK3N0YXRpYyB2b2lkIGRlc19kZWNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpvdXQsIGNvbnN0IHU4ICppbikKIHsKLQlzdHJ1Y3QgY3J5cHRfczM5MF9kZXNfY3R4ICpkY3R4ID0gY3R4OworCXN0cnVjdCBjcnlwdF9zMzkwX2Rlc19jdHggKmRjdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOwogCiAJY3J5cHRfczM5MF9rbShLTV9ERUFfREVDUllQVCwgZGN0eC0+a2V5LCBvdXQsIGluLCBERVNfQkxPQ0tfU0laRSk7CiB9CkBAIC0xNjYsMTEgKzE2NiwxMSBAQAogICogICBJbXBsZW1lbnRlcnMgTVVTVCByZWplY3Qga2V5cyB0aGF0IGV4aGliaXQgdGhpcyBwcm9wZXJ0eS4KICAqCiAgKi8KLXN0YXRpYyBpbnQgZGVzM18xMjhfc2V0a2V5KHZvaWQgKmN0eCwgY29uc3QgdTggKmtleSwgdW5zaWduZWQgaW50IGtleWxlbiwKLQkJCSAgIHUzMiAqZmxhZ3MpCitzdGF0aWMgaW50IGRlczNfMTI4X3NldGtleShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCBjb25zdCB1OCAqa2V5LAorCQkJICAgdW5zaWduZWQgaW50IGtleWxlbiwgdTMyICpmbGFncykKIHsKIAlpbnQgaSwgcmV0OwotCXN0cnVjdCBjcnlwdF9zMzkwX2RlczNfMTI4X2N0eCAqZGN0eCA9IGN0eDsKKwlzdHJ1Y3QgY3J5cHRfczM5MF9kZXMzXzEyOF9jdHggKmRjdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOwogCWNvbnN0IHU4KiB0ZW1wX2tleSA9IGtleTsKIAogCWlmICghKG1lbWNtcChrZXksICZrZXlbREVTX0tFWV9TSVpFXSwgREVTX0tFWV9TSVpFKSkpIHsKQEAgLTE4NiwxNyArMTg2LDE3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGRlczNfMTI4X2VuY3J5cHQodm9pZCAqY3R4LCB1OCAqZHN0LCBjb25zdCB1OCAqc3JjKQorc3RhdGljIHZvaWQgZGVzM18xMjhfZW5jcnlwdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqZHN0LCBjb25zdCB1OCAqc3JjKQogewotCXN0cnVjdCBjcnlwdF9zMzkwX2RlczNfMTI4X2N0eCAqZGN0eCA9IGN0eDsKKwlzdHJ1Y3QgY3J5cHRfczM5MF9kZXMzXzEyOF9jdHggKmRjdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOwogCiAJY3J5cHRfczM5MF9rbShLTV9UREVBXzEyOF9FTkNSWVBULCBkY3R4LT5rZXksIGRzdCwgKHZvaWQqKXNyYywKIAkJICAgICAgREVTM18xMjhfQkxPQ0tfU0laRSk7CiB9CiAKLXN0YXRpYyB2b2lkIGRlczNfMTI4X2RlY3J5cHQodm9pZCAqY3R4LCB1OCAqZHN0LCBjb25zdCB1OCAqc3JjKQorc3RhdGljIHZvaWQgZGVzM18xMjhfZGVjcnlwdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqZHN0LCBjb25zdCB1OCAqc3JjKQogewotCXN0cnVjdCBjcnlwdF9zMzkwX2RlczNfMTI4X2N0eCAqZGN0eCA9IGN0eDsKKwlzdHJ1Y3QgY3J5cHRfczM5MF9kZXMzXzEyOF9jdHggKmRjdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOwogCiAJY3J5cHRfczM5MF9rbShLTV9UREVBXzEyOF9ERUNSWVBULCBkY3R4LT5rZXksIGRzdCwgKHZvaWQqKXNyYywKIAkJICAgICAgREVTM18xMjhfQkxPQ0tfU0laRSk7CkBAIC0zMDIsMTEgKzMwMiwxMSBAQAogICogICBwcm9wZXJ0eS4KICAqCiAgKi8KLXN0YXRpYyBpbnQgZGVzM18xOTJfc2V0a2V5KHZvaWQgKmN0eCwgY29uc3QgdTggKmtleSwgdW5zaWduZWQgaW50IGtleWxlbiwKLQkJCSAgIHUzMiAqZmxhZ3MpCitzdGF0aWMgaW50IGRlczNfMTkyX3NldGtleShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCBjb25zdCB1OCAqa2V5LAorCQkJICAgdW5zaWduZWQgaW50IGtleWxlbiwgdTMyICpmbGFncykKIHsKIAlpbnQgaSwgcmV0OwotCXN0cnVjdCBjcnlwdF9zMzkwX2RlczNfMTkyX2N0eCAqZGN0eCA9IGN0eDsKKwlzdHJ1Y3QgY3J5cHRfczM5MF9kZXMzXzE5Ml9jdHggKmRjdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOwogCWNvbnN0IHU4KiB0ZW1wX2tleSA9IGtleTsKIAogCWlmICghKG1lbWNtcChrZXksICZrZXlbREVTX0tFWV9TSVpFXSwgREVTX0tFWV9TSVpFKSAmJgpAQCAtMzI1LDE3ICszMjUsMTcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgZGVzM18xOTJfZW5jcnlwdCh2b2lkICpjdHgsIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpCitzdGF0aWMgdm9pZCBkZXMzXzE5Ml9lbmNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpCiB7Ci0Jc3RydWN0IGNyeXB0X3MzOTBfZGVzM18xOTJfY3R4ICpkY3R4ID0gY3R4OworCXN0cnVjdCBjcnlwdF9zMzkwX2RlczNfMTkyX2N0eCAqZGN0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7CiAKIAljcnlwdF9zMzkwX2ttKEtNX1RERUFfMTkyX0VOQ1JZUFQsIGRjdHgtPmtleSwgZHN0LCAodm9pZCopc3JjLAogCQkgICAgICBERVMzXzE5Ml9CTE9DS19TSVpFKTsKIH0KIAotc3RhdGljIHZvaWQgZGVzM18xOTJfZGVjcnlwdCh2b2lkICpjdHgsIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpCitzdGF0aWMgdm9pZCBkZXMzXzE5Ml9kZWNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpCiB7Ci0Jc3RydWN0IGNyeXB0X3MzOTBfZGVzM18xOTJfY3R4ICpkY3R4ID0gY3R4OworCXN0cnVjdCBjcnlwdF9zMzkwX2RlczNfMTkyX2N0eCAqZGN0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7CiAKIAljcnlwdF9zMzkwX2ttKEtNX1RERUFfMTkyX0RFQ1JZUFQsIGRjdHgtPmtleSwgZHN0LCAodm9pZCopc3JjLAogCQkgICAgICBERVMzXzE5Ml9CTE9DS19TSVpFKTsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9jcnlwdG8vc2hhMV9zMzkwLmMgYi9hcmNoL3MzOTAvY3J5cHRvL3NoYTFfczM5MC5jCmluZGV4IDk4Yzg5NmIuLjlkMzRhMzUgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9jcnlwdG8vc2hhMV9zMzkwLmMKKysrIGIvYXJjaC9zMzkwL2NyeXB0by9zaGExX3MzOTAuYwpAQCAtNDAsMjggKzQwLDI5IEBACiAJdTggYnVmZmVyWzIgKiBTSEExX0JMT0NLX1NJWkVdOwogfTsKIAotc3RhdGljIHZvaWQKLXNoYTFfaW5pdCh2b2lkICpjdHgpCitzdGF0aWMgdm9pZCBzaGExX2luaXQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKIHsKLQlzdGF0aWMgY29uc3Qgc3RydWN0IGNyeXB0X3MzOTBfc2hhMV9jdHggaW5pdHN0YXRlID0gewotCQkuc3RhdGUgPSB7Ci0JCQkweDY3NDUyMzAxLAotCQkJMHhFRkNEQUI4OSwKLQkJCTB4OThCQURDRkUsCi0JCQkweDEwMzI1NDc2LAotCQkJMHhDM0QyRTFGMAotCQl9LAorCXN0cnVjdCBjcnlwdF9zMzkwX3NoYTFfY3R4ICpjdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOworCXN0YXRpYyBjb25zdCB1MzIgaW5pdHN0YXRlWzVdID0geworCQkweDY3NDUyMzAxLAorCQkweEVGQ0RBQjg5LAorCQkweDk4QkFEQ0ZFLAorCQkweDEwMzI1NDc2LAorCQkweEMzRDJFMUYwCiAJfTsKLQltZW1jcHkoY3R4LCAmaW5pdHN0YXRlLCBzaXplb2YoaW5pdHN0YXRlKSk7CisKKwljdHgtPmNvdW50ID0gMDsKKwltZW1jcHkoY3R4LT5zdGF0ZSwgJmluaXRzdGF0ZSwgc2l6ZW9mKGluaXRzdGF0ZSkpOworCWN0eC0+YnVmX2xlbiA9IDA7CiB9CiAKLXN0YXRpYyB2b2lkCi1zaGExX3VwZGF0ZSh2b2lkICpjdHgsIGNvbnN0IHU4ICpkYXRhLCB1bnNpZ25lZCBpbnQgbGVuKQorc3RhdGljIHZvaWQgc2hhMV91cGRhdGUoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgY29uc3QgdTggKmRhdGEsCisJCQl1bnNpZ25lZCBpbnQgbGVuKQogewogCXN0cnVjdCBjcnlwdF9zMzkwX3NoYTFfY3R4ICpzY3R4OwogCWxvbmcgaW1kX2xlbjsKIAotCXNjdHggPSBjdHg7CisJc2N0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7CiAJc2N0eC0+Y291bnQgKz0gbGVuICogODsgLy9tZXNzYWdlIGJpdCBsZW5ndGgKIAogCS8vYW55dGhpbmcgaW4gYnVmZmVyIHlldD8gLT4gbXVzdCBiZSBjb21wbGV0ZWQKQEAgLTExMCwxMCArMTExLDkgQEAKIH0KIAogLyogQWRkIHBhZGRpbmcgYW5kIHJldHVybiB0aGUgbWVzc2FnZSBkaWdlc3QuICovCi1zdGF0aWMgdm9pZAotc2hhMV9maW5hbCh2b2lkKiBjdHgsIHU4ICpvdXQpCitzdGF0aWMgdm9pZCBzaGExX2ZpbmFsKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpvdXQpCiB7Ci0Jc3RydWN0IGNyeXB0X3MzOTBfc2hhMV9jdHggKnNjdHggPSBjdHg7CisJc3RydWN0IGNyeXB0X3MzOTBfc2hhMV9jdHggKnNjdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOwogCiAJLy9tdXN0IHBlcmZvcm0gbWFudWFsIHBhZGRpbmcKIAlwYWRfbWVzc2FnZShzY3R4KTsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9jcnlwdG8vc2hhMjU2X3MzOTAuYyBiL2FyY2gvczM5MC9jcnlwdG8vc2hhMjU2X3MzOTAuYwppbmRleCAxZWM1ZTkyLi5mNTczZGYzIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvY3J5cHRvL3NoYTI1Nl9zMzkwLmMKKysrIGIvYXJjaC9zMzkwL2NyeXB0by9zaGEyNTZfczM5MC5jCkBAIC0zMSw5ICszMSw5IEBACiAJdTggYnVmWzIgKiBTSEEyNTZfQkxPQ0tfU0laRV07CiB9OwogCi1zdGF0aWMgdm9pZCBzaGEyNTZfaW5pdCh2b2lkICpjdHgpCitzdGF0aWMgdm9pZCBzaGEyNTZfaW5pdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQogewotCXN0cnVjdCBzMzkwX3NoYTI1Nl9jdHggKnNjdHggPSBjdHg7CisJc3RydWN0IHMzOTBfc2hhMjU2X2N0eCAqc2N0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7CiAKIAlzY3R4LT5zdGF0ZVswXSA9IDB4NmEwOWU2Njc7CiAJc2N0eC0+c3RhdGVbMV0gPSAweGJiNjdhZTg1OwpAQCAtNDQsMTIgKzQ0LDEyIEBACiAJc2N0eC0+c3RhdGVbNl0gPSAweDFmODNkOWFiOwogCXNjdHgtPnN0YXRlWzddID0gMHg1YmUwY2QxOTsKIAlzY3R4LT5jb3VudCA9IDA7Ci0JbWVtc2V0KHNjdHgtPmJ1ZiwgMCwgc2l6ZW9mKHNjdHgtPmJ1ZikpOwogfQogCi1zdGF0aWMgdm9pZCBzaGEyNTZfdXBkYXRlKHZvaWQgKmN0eCwgY29uc3QgdTggKmRhdGEsIHVuc2lnbmVkIGludCBsZW4pCitzdGF0aWMgdm9pZCBzaGEyNTZfdXBkYXRlKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIGNvbnN0IHU4ICpkYXRhLAorCQkJICB1bnNpZ25lZCBpbnQgbGVuKQogewotCXN0cnVjdCBzMzkwX3NoYTI1Nl9jdHggKnNjdHggPSBjdHg7CisJc3RydWN0IHMzOTBfc2hhMjU2X2N0eCAqc2N0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7CiAJdW5zaWduZWQgaW50IGluZGV4OwogCWludCByZXQ7CiAKQEAgLTEwOCw5ICsxMDgsOSBAQAogfQogCiAvKiBBZGQgcGFkZGluZyBhbmQgcmV0dXJuIHRoZSBtZXNzYWdlIGRpZ2VzdCAqLwotc3RhdGljIHZvaWQgc2hhMjU2X2ZpbmFsKHZvaWQqIGN0eCwgdTggKm91dCkKK3N0YXRpYyB2b2lkIHNoYTI1Nl9maW5hbChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqb3V0KQogewotCXN0cnVjdCBzMzkwX3NoYTI1Nl9jdHggKnNjdHggPSBjdHg7CisJc3RydWN0IHMzOTBfc2hhMjU2X2N0eCAqc2N0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7CiAKIAkvKiBtdXN0IHBlcmZvcm0gbWFudWFsIHBhZGRpbmcgKi8KIAlwYWRfbWVzc2FnZShzY3R4KTsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvbWFjaGluZV9rZXhlYy5jIGIvYXJjaC9zMzkwL2tlcm5lbC9tYWNoaW5lX2tleGVjLmMKaW5kZXggYmFkODFiNS4uZmJkZTZhOSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9tYWNoaW5lX2tleGVjLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9tYWNoaW5lX2tleGVjLmMKQEAgLTI3LDggKzI3LDggQEAKIAogdHlwZWRlZiB2b2lkICgqcmVsb2NhdGVfa2VybmVsX3QpIChraW1hZ2VfZW50cnlfdCAqLCB1bnNpZ25lZCBsb25nKTsKIAotY29uc3QgZXh0ZXJuIHVuc2lnbmVkIGNoYXIgcmVsb2NhdGVfa2VybmVsW107Ci1jb25zdCBleHRlcm4gdW5zaWduZWQgbG9uZyBsb25nIHJlbG9jYXRlX2tlcm5lbF9sZW47CitleHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciByZWxvY2F0ZV9rZXJuZWxbXTsKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgcmVsb2NhdGVfa2VybmVsX2xlbjsKIAogaW50CiBtYWNoaW5lX2tleGVjX3ByZXBhcmUoc3RydWN0IGtpbWFnZSAqaW1hZ2UpCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3NldHVwLmMgYi9hcmNoL3MzOTAva2VybmVsL3NldHVwLmMKaW5kZXggMGEwNGU0YS4uYjI4MjAzNCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvc2V0dXAuYwpAQCAtNDcsNiArNDcsNyBAQAogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKyNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KIAogLyoKICAqIE1hY2hpbmUgc2V0dXAuLgpAQCAtNjYsMTEgKzY3LDYgQEAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIF9faW5pdGRhdGEgbWVtb3J5X2VuZDsKIAogLyoKLSAqIFNldHVwIG9wdGlvbnMKLSAqLwotZXh0ZXJuIGludCBfdGV4dCxfZXRleHQsIF9lZGF0YSwgX2VuZDsKLQotLyoKICAqIFRoaXMgaXMgc2V0IHVwIGJ5IHRoZSBzZXR1cC1yb3V0aW5lIGF0IGJvb3QtdGltZQogICogZm9yIFMzOTAgbmVlZCB0byBmaW5kIG91dCwgd2hhdCB3ZSBoYXZlIHRvIHNldHVwCiAgKiB1c2luZyBhZGRyZXNzIDB4MTA0MDAgLi4uCkBAIC04MCwxNSArNzYsMTEgQEAKIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBjb2RlX3Jlc291cmNlID0gewogCS5uYW1lICA9ICJLZXJuZWwgY29kZSIsCi0JLnN0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpICZfdGV4dCwKLQkuZW5kID0gKHVuc2lnbmVkIGxvbmcpICZfZXRleHQgLSAxLAogCS5mbGFncyA9IElPUkVTT1VSQ0VfQlVTWSB8IElPUkVTT1VSQ0VfTUVNLAogfTsKIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBkYXRhX3Jlc291cmNlID0gewogCS5uYW1lID0gIktlcm5lbCBkYXRhIiwKLQkuc3RhcnQgPSAodW5zaWduZWQgbG9uZykgJl9ldGV4dCwKLQkuZW5kID0gKHVuc2lnbmVkIGxvbmcpICZfZWRhdGEgLSAxLAogCS5mbGFncyA9IElPUkVTT1VSQ0VfQlVTWSB8IElPUkVTT1VSQ0VfTUVNLAogfTsKIApAQCAtNDIyLDYgKzQxNCwxMSBAQAogCXN0cnVjdCByZXNvdXJjZSAqcmVzOwogCWludCBpOwogCisJY29kZV9yZXNvdXJjZS5zdGFydCA9ICh1bnNpZ25lZCBsb25nKSAmX3RleHQ7CisJY29kZV9yZXNvdXJjZS5lbmQgPSAodW5zaWduZWQgbG9uZykgJl9ldGV4dCAtIDE7CisJZGF0YV9yZXNvdXJjZS5zdGFydCA9ICh1bnNpZ25lZCBsb25nKSAmX2V0ZXh0OworCWRhdGFfcmVzb3VyY2UuZW5kID0gKHVuc2lnbmVkIGxvbmcpICZfZWRhdGEgLSAxOworCiAJZm9yIChpID0gMDsgaSA8IE1FTU9SWV9DSFVOS1MgJiYgbWVtb3J5X2NodW5rW2ldLnNpemUgPiAwOyBpKyspIHsKIAkJcmVzID0gYWxsb2NfYm9vdG1lbV9sb3coc2l6ZW9mKHN0cnVjdCByZXNvdXJjZSkpOwogCQlyZXMtPmZsYWdzID0gSU9SRVNPVVJDRV9CVVNZIHwgSU9SRVNPVVJDRV9NRU07CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3Z0aW1lLmMgYi9hcmNoL3MzOTAva2VybmVsL3Z0aW1lLmMKaW5kZXggZGZlNmYwOC4uMWYwNDM5ZCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC92dGltZS5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvdnRpbWUuYwpAQCAtMzU2LDcgKzM1Niw3IEBACiAKIAlzZXRfdnRpbWVyKGV2ZW50LT5leHBpcmVzKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2dF9saXN0LT5sb2NrLCBmbGFncyk7Ci0JLyogcmVsZWFzZSBDUFUgYXF1aXJlZCBpbiBwcmVwYXJlX3Z0aW1lciBvciBtb2RfdmlydF90aW1lcigpICovCisJLyogcmVsZWFzZSBDUFUgYWNxdWlyZWQgaW4gcHJlcGFyZV92dGltZXIgb3IgbW9kX3ZpcnRfdGltZXIoKSAqLwogCXB1dF9jcHUoKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9NYWtlZmlsZSBiL2FyY2gvc2gvTWFrZWZpbGUKaW5kZXggYzcyZTE3YS4uZTQ2N2E0NSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9NYWtlZmlsZQorKysgYi9hcmNoL3NoL01ha2VmaWxlCkBAIC0xNDcsNyArMTQ3LDcgQEAKICMJdGhlbSBjaGFuZ2VkLiAgV2UgdXNlIC5hcmNoIGFuZCAubWFjaCB0byBpbmRpY2F0ZSB3aGVuIHRoZXkgd2VyZQogIwl1cGRhdGVkIGxhc3QsIG90aGVyd2lzZSBtYWtlIHVzZXMgdGhlIHRhcmdldCBkaXJlY3RvcnkgbXRpbWUuCiAKLWluY2x1ZGUvYXNtLXNoLy5jcHU6ICQod2lsZGNhcmQgaW5jbHVkZS9jb25maWcvY3B1LyouaCkgaW5jbHVkZS9jb25maWcvTUFSS0VSCitpbmNsdWRlL2FzbS1zaC8uY3B1OiAkKHdpbGRjYXJkIGluY2x1ZGUvY29uZmlnL2NwdS8qLmgpIGluY2x1ZGUvY29uZmlnL2F1dG8uY29uZgogCUBlY2hvICcgIFNZTUxJTksgaW5jbHVkZS9hc20tc2gvY3B1IC0+IGluY2x1ZGUvYXNtLXNoLyQoY3B1aW5jZGlyLXkpJwogCSQoUSlpZiBbICEgLWQgaW5jbHVkZS9hc20tc2ggXTsgdGhlbiBta2RpciAtcCBpbmNsdWRlL2FzbS1zaDsgZmkKIAkkKFEpbG4gLWZzbiAkKGluY2Rpci1wcmVmaXgpJChjcHVpbmNkaXIteSkgaW5jbHVkZS9hc20tc2gvY3B1CkBAIC0xNTcsNyArMTU3LDcgQEAKICMJZG9uJ3QsIGp1c3QgcmVmZXJlbmNlIHRoZSBwYXJlbnQgZGlyZWN0b3J5IHNvIHRoZSBzZW1hbnRpY3MgYXJlCiAjCWtlcHQgcm91Z2hseSB0aGUgc2FtZS4KIAotaW5jbHVkZS9hc20tc2gvLm1hY2g6ICQod2lsZGNhcmQgaW5jbHVkZS9jb25maWcvc2gvKi5oKSBpbmNsdWRlL2NvbmZpZy9NQVJLRVIKK2luY2x1ZGUvYXNtLXNoLy5tYWNoOiAkKHdpbGRjYXJkIGluY2x1ZGUvY29uZmlnL3NoLyouaCkgaW5jbHVkZS9jb25maWcvYXV0by5jb25mCiAJQGVjaG8gLW4gJyAgU1lNTElOSyBpbmNsdWRlL2FzbS1zaC9tYWNoIC0+ICcKIAkkKFEpaWYgWyAhIC1kIGluY2x1ZGUvYXNtLXNoIF07IHRoZW4gbWtkaXIgLXAgaW5jbHVkZS9hc20tc2g7IGZpCiAJJChRKWlmIFsgLWQgJChpbmNkaXItcHJlZml4KSQoaW5jZGlyLXkpIF07IHRoZW4gXApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvbWFjaGluZV9rZXhlYy5jIGIvYXJjaC9zaC9rZXJuZWwvbWFjaGluZV9rZXhlYy5jCmluZGV4IDQzNTQ2NTIuLjZiY2Q4ZDkgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL21hY2hpbmVfa2V4ZWMuYworKysgYi9hcmNoL3NoL2tlcm5lbC9tYWNoaW5lX2tleGVjLmMKQEAgLTI1LDggKzI1LDggQEAKIAkJCQl1bnNpZ25lZCBsb25nIHN0YXJ0X2FkZHJlc3MsCiAJCQkJdW5zaWduZWQgbG9uZyB2YnJfcmVnKSBBVFRSSUJfTk9SRVQ7CiAKLWNvbnN0IGV4dGVybiB1bnNpZ25lZCBjaGFyIHJlbG9jYXRlX25ld19rZXJuZWxbXTsKLWNvbnN0IGV4dGVybiB1bnNpZ25lZCBpbnQgcmVsb2NhdGVfbmV3X2tlcm5lbF9zaXplOworZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgcmVsb2NhdGVfbmV3X2tlcm5lbFtdOworZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGludCByZWxvY2F0ZV9uZXdfa2VybmVsX3NpemU7CiBleHRlcm4gdm9pZCAqZ2RiX3Zicl92ZWN0b3I7CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL3NoL29wcm9maWxlL29wX21vZGVsX3NoNzc1MC5jIGIvYXJjaC9zaC9vcHJvZmlsZS9vcF9tb2RlbF9zaDc3NTAuYwppbmRleCA1ZWM5ZGRjLi5jMjY1MTg1IDEwMDY0NAotLS0gYS9hcmNoL3NoL29wcm9maWxlL29wX21vZGVsX3NoNzc1MC5jCisrKyBiL2FyY2gvc2gvb3Byb2ZpbGUvb3BfbW9kZWxfc2g3NzUwLmMKQEAgLTE5OCw3ICsxOTgsNyBAQAogCiAJZm9yIChpID0gMDsgaSA8IE5SX0NOVFJTOyBpKyspIHsKIAkJc3RydWN0IGRlbnRyeSAqZGlyOwotCQljaGFyIGJ1ZlszXTsKKwkJY2hhciBidWZbNF07CiAKIAkJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiVkIiwgaSk7CiAJCWRpciA9IG9wcm9maWxlZnNfbWtkaXIoc2IsIHJvb3QsIGJ1Zik7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9vZl9kZXZpY2UuYyBiL2FyY2gvc3BhcmMva2VybmVsL29mX2RldmljZS5jCmluZGV4IDAwMWI4NjcuLjgwYTgwOTQgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL29mX2RldmljZS5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL29mX2RldmljZS5jCkBAIC0xMzgsNiArMTM4LDcgQEAKICAgICAgICAuc3VzcGVuZAk9IG9mX2RldmljZV9zdXNwZW5kLAogICAgICAgIC5yZXN1bWUJPSBvZl9kZXZpY2VfcmVzdW1lLAogfTsKK0VYUE9SVF9TWU1CT0woZWJ1c19idXNfdHlwZSk7CiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19TQlVTCkBAIC0xNDksNiArMTUwLDcgQEAKICAgICAgICAuc3VzcGVuZAk9IG9mX2RldmljZV9zdXNwZW5kLAogICAgICAgIC5yZXN1bWUJPSBvZl9kZXZpY2VfcmVzdW1lLAogfTsKK0VYUE9SVF9TWU1CT0woc2J1c19idXNfdHlwZSk7CiAjZW5kaWYKIAogc3RhdGljIGludCBfX2luaXQgb2ZfYnVzX2RyaXZlcl9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9wcm9tLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9wcm9tLmMKaW5kZXggNjNiMmI5Yi4uOTQ2Y2U2ZCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvcHJvbS5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3Byb20uYwpAQCAtMjcsNiArMjcsMTEgQEAKIAogc3RhdGljIHN0cnVjdCBkZXZpY2Vfbm9kZSAqYWxsbm9kZXM7CiAKKy8qIHVzZSB3aGVuIHRyYXZlcnNpbmcgdHJlZSB0aHJvdWdoIHRoZSBhbGxuZXh0LCBjaGlsZCwgc2libGluZywKKyAqIG9yIHBhcmVudCBtZW1iZXJzIG9mIHN0cnVjdCBkZXZpY2Vfbm9kZS4KKyAqLworc3RhdGljIERFRklORV9SV0xPQ0soZGV2dHJlZV9sb2NrKTsKKwogaW50IG9mX2RldmljZV9pc19jb21wYXRpYmxlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2aWNlLCBjb25zdCBjaGFyICpjb21wYXQpCiB7CiAJY29uc3QgY2hhciogY3A7CkBAIC0xODUsNiArMTkwLDU0IEBACiB9CiBFWFBPUlRfU1lNQk9MKG9mX2dldGludHByb3BfZGVmYXVsdCk7CiAKK2ludCBvZl9zZXRfcHJvcGVydHkoc3RydWN0IGRldmljZV9ub2RlICpkcCwgY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqdmFsLCBpbnQgbGVuKQoreworCXN0cnVjdCBwcm9wZXJ0eSAqKnByZXZwOworCXZvaWQgKm5ld192YWw7CisJaW50IGVycjsKKworCW5ld192YWwgPSBrbWFsbG9jKGxlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFuZXdfdmFsKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbWNweShuZXdfdmFsLCB2YWwsIGxlbik7CisKKwllcnIgPSAtRU5PREVWOworCisJd3JpdGVfbG9jaygmZGV2dHJlZV9sb2NrKTsKKwlwcmV2cCA9ICZkcC0+cHJvcGVydGllczsKKwl3aGlsZSAoKnByZXZwKSB7CisJCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcCA9ICpwcmV2cDsKKworCQlpZiAoIXN0cmNtcChwcm9wLT5uYW1lLCBuYW1lKSkgeworCQkJdm9pZCAqb2xkX3ZhbCA9IHByb3AtPnZhbHVlOworCQkJaW50IHJldDsKKworCQkJcmV0ID0gcHJvbV9zZXRwcm9wKGRwLT5ub2RlLCBuYW1lLCB2YWwsIGxlbik7CisJCQllcnIgPSAtRUlOVkFMOworCQkJaWYgKHJldCA+PSAwKSB7CisJCQkJcHJvcC0+dmFsdWUgPSBuZXdfdmFsOworCQkJCXByb3AtPmxlbmd0aCA9IGxlbjsKKworCQkJCWlmIChPRl9JU19EWU5BTUlDKHByb3ApKQorCQkJCQlrZnJlZShvbGRfdmFsKTsKKworCQkJCU9GX01BUktfRFlOQU1JQyhwcm9wKTsKKworCQkJCWVyciA9IDA7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQlwcmV2cCA9ICYoKnByZXZwKS0+bmV4dDsKKwl9CisJd3JpdGVfdW5sb2NrKCZkZXZ0cmVlX2xvY2spOworCisJLyogWFhYIFVwYXRlIHByb2NmcyBpZiBuZWNlc3NhcnkuLi4gKi8KKworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MKG9mX3NldF9wcm9wZXJ0eSk7CisKIHN0YXRpYyB1bnNpZ25lZCBpbnQgcHJvbV9lYXJseV9hbGxvY2F0ZWQ7CiAKIHN0YXRpYyB2b2lkICogX19pbml0IHByb21fZWFybHlfYWxsb2ModW5zaWduZWQgbG9uZyBzaXplKQpAQCAtMzU0LDcgKzQwNyw5IEBACiAJcmV0dXJuIG47CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcHJvcGVydHkgKiBfX2luaXQgYnVpbGRfb25lX3Byb3AocGhhbmRsZSBub2RlLCBjaGFyICpwcmV2KQorc3RhdGljIHVuc2lnbmVkIGludCB1bmlxdWVfaWQ7CisKK3N0YXRpYyBzdHJ1Y3QgcHJvcGVydHkgKiBfX2luaXQgYnVpbGRfb25lX3Byb3AocGhhbmRsZSBub2RlLCBjaGFyICpwcmV2LCBjaGFyICpzcGVjaWFsX25hbWUsIHZvaWQgKnNwZWNpYWxfdmFsLCBpbnQgc3BlY2lhbF9sZW4pCiB7CiAJc3RhdGljIHN0cnVjdCBwcm9wZXJ0eSAqdG1wID0gTlVMTDsKIAlzdHJ1Y3QgcHJvcGVydHkgKnA7CkBAIC0zNjQsMjUgKzQxOSwzNCBAQAogCQlwID0gdG1wOwogCQltZW1zZXQocCwgMCwgc2l6ZW9mKCpwKSArIDMyKTsKIAkJdG1wID0gTlVMTDsKLQl9IGVsc2UKKwl9IGVsc2UgewogCQlwID0gcHJvbV9lYXJseV9hbGxvYyhzaXplb2Yoc3RydWN0IHByb3BlcnR5KSArIDMyKTsKKwkJcC0+dW5pcXVlX2lkID0gdW5pcXVlX2lkKys7CisJfQogCiAJcC0+bmFtZSA9IChjaGFyICopIChwICsgMSk7Ci0JaWYgKHByZXYgPT0gTlVMTCkgewotCQlwcm9tX2ZpcnN0cHJvcChub2RlLCBwLT5uYW1lKTsKKwlpZiAoc3BlY2lhbF9uYW1lKSB7CisJCXAtPmxlbmd0aCA9IHNwZWNpYWxfbGVuOworCQlwLT52YWx1ZSA9IHByb21fZWFybHlfYWxsb2Moc3BlY2lhbF9sZW4pOworCQltZW1jcHkocC0+dmFsdWUsIHNwZWNpYWxfdmFsLCBzcGVjaWFsX2xlbik7CiAJfSBlbHNlIHsKLQkJcHJvbV9uZXh0cHJvcChub2RlLCBwcmV2LCBwLT5uYW1lKTsKLQl9Ci0JaWYgKHN0cmxlbihwLT5uYW1lKSA9PSAwKSB7Ci0JCXRtcCA9IHA7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlwLT5sZW5ndGggPSBwcm9tX2dldHByb3BsZW4obm9kZSwgcC0+bmFtZSk7Ci0JaWYgKHAtPmxlbmd0aCA8PSAwKSB7Ci0JCXAtPmxlbmd0aCA9IDA7Ci0JfSBlbHNlIHsKLQkJcC0+dmFsdWUgPSBwcm9tX2Vhcmx5X2FsbG9jKHAtPmxlbmd0aCk7Ci0JCWxlbiA9IHByb21fZ2V0cHJvcGVydHkobm9kZSwgcC0+bmFtZSwgcC0+dmFsdWUsIHAtPmxlbmd0aCk7CisJCWlmIChwcmV2ID09IE5VTEwpIHsKKwkJCXByb21fZmlyc3Rwcm9wKG5vZGUsIHAtPm5hbWUpOworCQl9IGVsc2UgeworCQkJcHJvbV9uZXh0cHJvcChub2RlLCBwcmV2LCBwLT5uYW1lKTsKKwkJfQorCQlpZiAoc3RybGVuKHAtPm5hbWUpID09IDApIHsKKwkJCXRtcCA9IHA7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlwLT5sZW5ndGggPSBwcm9tX2dldHByb3BsZW4obm9kZSwgcC0+bmFtZSk7CisJCWlmIChwLT5sZW5ndGggPD0gMCkgeworCQkJcC0+bGVuZ3RoID0gMDsKKwkJfSBlbHNlIHsKKwkJCXAtPnZhbHVlID0gcHJvbV9lYXJseV9hbGxvYyhwLT5sZW5ndGggKyAxKTsKKwkJCXByb21fZ2V0cHJvcGVydHkobm9kZSwgcC0+bmFtZSwgcC0+dmFsdWUsIHAtPmxlbmd0aCk7CisJCQkoKHVuc2lnbmVkIGNoYXIgKilwLT52YWx1ZSlbcC0+bGVuZ3RoXSA9ICdcMCc7CisJCX0KIAl9CiAJcmV0dXJuIHA7CiB9CkBAIC0zOTEsOSArNDU1LDE0IEBACiB7CiAJc3RydWN0IHByb3BlcnR5ICpoZWFkLCAqdGFpbDsKIAotCWhlYWQgPSB0YWlsID0gYnVpbGRfb25lX3Byb3Aobm9kZSwgTlVMTCk7CisJaGVhZCA9IHRhaWwgPSBidWlsZF9vbmVfcHJvcChub2RlLCBOVUxMLAorCQkJCSAgICAgIi5ub2RlIiwgJm5vZGUsIHNpemVvZihub2RlKSk7CisKKwl0YWlsLT5uZXh0ID0gYnVpbGRfb25lX3Byb3Aobm9kZSwgTlVMTCwgTlVMTCwgTlVMTCwgMCk7CisJdGFpbCA9IHRhaWwtPm5leHQ7CiAJd2hpbGUodGFpbCkgewotCQl0YWlsLT5uZXh0ID0gYnVpbGRfb25lX3Byb3Aobm9kZSwgdGFpbC0+bmFtZSk7CisJCXRhaWwtPm5leHQgPSBidWlsZF9vbmVfcHJvcChub2RlLCB0YWlsLT5uYW1lLAorCQkJCQkgICAgTlVMTCwgTlVMTCwgMCk7CiAJCXRhaWwgPSB0YWlsLT5uZXh0OwogCX0KIApAQCAtNDIyLDYgKzQ5MSw3IEBACiAJCXJldHVybiBOVUxMOwogCiAJZHAgPSBwcm9tX2Vhcmx5X2FsbG9jKHNpemVvZigqZHApKTsKKwlkcC0+dW5pcXVlX2lkID0gdW5pcXVlX2lkKys7CiAKIAlrcmVmX2luaXQoJmRwLT5rcmVmKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9saWIvTWFrZWZpbGUgYi9hcmNoL3NwYXJjL2xpYi9NYWtlZmlsZQppbmRleCBmYTUwMDY5Li41ZGI3ZTFkIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2xpYi9NYWtlZmlsZQorKysgYi9hcmNoL3NwYXJjL2xpYi9NYWtlZmlsZQpAQCAtOSwzICs5LDUgQEAKIAkgc3RybmNweV9mcm9tX3VzZXIubyBkaXZkaTMubyB1ZGl2ZGkzLm8gc3RybGVuX3VzZXIubyBcCiAJIGNvcHlfdXNlci5vIGxvY2tzLm8gYXRvbWljLm8gYXRvbWljMzIubyBiaXRvcHMubyBcCiAJIGxzaHJkaTMubyBhc2hsZGkzLm8gcndzZW0ubyBtdWxkaTMubyBiaXRleHQubworCitvYmoteSArPSBpb21hcC5vCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2xpYi9pb21hcC5jIGIvYXJjaC9zcGFyYy9saWIvaW9tYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDUwMWMxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zcGFyYy9saWIvaW9tYXAuYwpAQCAtMCwwICsxLDQ4IEBACisvKgorICogSW1wbGVtZW50IHRoZSBzcGFyYyBpb21hcCBpbnRlcmZhY2VzCisgKi8KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworLyogQ3JlYXRlIGEgdmlydHVhbCBtYXBwaW5nIGNvb2tpZSBmb3IgYW4gSU8gcG9ydCByYW5nZSAqLwordm9pZCBfX2lvbWVtICppb3BvcnRfbWFwKHVuc2lnbmVkIGxvbmcgcG9ydCwgdW5zaWduZWQgaW50IG5yKQoreworCXJldHVybiAodm9pZCBfX2lvbWVtICopICh1bnNpZ25lZCBsb25nKSBwb3J0OworfQorCit2b2lkIGlvcG9ydF91bm1hcCh2b2lkIF9faW9tZW0gKmFkZHIpCit7CisJLyogTm90aGluZyB0byBkbyAqLworfQorRVhQT1JUX1NZTUJPTChpb3BvcnRfbWFwKTsKK0VYUE9SVF9TWU1CT0woaW9wb3J0X3VubWFwKTsKKworLyogQ3JlYXRlIGEgdmlydHVhbCBtYXBwaW5nIGNvb2tpZSBmb3IgYSBQQ0kgQkFSIChtZW1vcnkgb3IgSU8pICovCit2b2lkIF9faW9tZW0gKnBjaV9pb21hcChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgYmFyLCB1bnNpZ25lZCBsb25nIG1heGxlbikKK3sKKwl1bnNpZ25lZCBsb25nIHN0YXJ0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgYmFyKTsKKwl1bnNpZ25lZCBsb25nIGxlbiA9IHBjaV9yZXNvdXJjZV9sZW4oZGV2LCBiYXIpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSBwY2lfcmVzb3VyY2VfZmxhZ3MoZGV2LCBiYXIpOworCisJaWYgKCFsZW4gfHwgIXN0YXJ0KQorCQlyZXR1cm4gTlVMTDsKKwlpZiAobWF4bGVuICYmIGxlbiA+IG1heGxlbikKKwkJbGVuID0gbWF4bGVuOworCWlmIChmbGFncyAmIElPUkVTT1VSQ0VfSU8pCisJCXJldHVybiBpb3BvcnRfbWFwKHN0YXJ0LCBsZW4pOworCWlmIChmbGFncyAmIElPUkVTT1VSQ0VfTUVNKSB7CisJCWlmIChmbGFncyAmIElPUkVTT1VSQ0VfQ0FDSEVBQkxFKQorCQkJcmV0dXJuIGlvcmVtYXAoc3RhcnQsIGxlbik7CisJCXJldHVybiBpb3JlbWFwX25vY2FjaGUoc3RhcnQsIGxlbik7CisJfQorCS8qIFdoYXQ/ICovCisJcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgcGNpX2lvdW5tYXAoc3RydWN0IHBjaV9kZXYgKmRldiwgdm9pZCBfX2lvbWVtICogYWRkcikKK3sKKwkvKiBub3RoaW5nIHRvIGRvICovCit9CitFWFBPUlRfU1lNQk9MKHBjaV9pb21hcCk7CitFWFBPUlRfU1lNQk9MKHBjaV9pb3VubWFwKTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvYXV4aW8uYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvYXV4aW8uYwppbmRleCAyYzQyODk0Li5jMmM2OWMxIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL2F1eGlvLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9hdXhpby5jCkBAIC02LDYgKzYsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CkBAIC0xNiw4ICsxNyw4IEBACiAjaW5jbHVkZSA8YXNtL2VidXMuaD4KICNpbmNsdWRlIDxhc20vYXV4aW8uaD4KIAotLyogVGhpcyBjYW5ub3QgYmUgc3RhdGljLCBhcyBpdCBpcyByZWZlcmVuY2VkIGluIGlycS5jICovCiB2b2lkIF9faW9tZW0gKmF1eGlvX3JlZ2lzdGVyID0gTlVMTDsKK0VYUE9SVF9TWU1CT0woYXV4aW9fcmVnaXN0ZXIpOwogCiBlbnVtIGF1eGlvX3R5cGUgewogCUFVWElPX1RZUEVfTk9ERVYsCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL2lycS5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9pcnEuYwppbmRleCAzMWUwZmJiLi5jYzg5YjA2IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL2lycS5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvaXJxLmMKQEAgLTU2Myw2NyArNTYzLDYgQEAKIAlpcnFfZXhpdCgpOwogfQogCi0jaWZkZWYgQ09ORklHX0JMS19ERVZfRkQKLWV4dGVybiBpcnFyZXR1cm5fdCBmbG9wcHlfaW50ZXJydXB0KGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKTsKLQotLyogWFhYIE5vIGVhc3kgd2F5IHRvIGluY2x1ZGUgYXNtL2Zsb3BweS5oIFhYWCAqLwotZXh0ZXJuIHVuc2lnbmVkIGNoYXIgKnBkbWFfdmFkZHI7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBwZG1hX3NpemU7Ci1leHRlcm4gdm9sYXRpbGUgaW50IGRvaW5nX3BkbWE7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBmZGNfc3RhdHVzOwotCi1pcnFyZXR1cm5fdCBzcGFyY19mbG9wcHlfaXJxKGludCBpcnEsIHZvaWQgKmRldl9jb29raWUsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCWlmIChsaWtlbHkoZG9pbmdfcGRtYSkpIHsKLQkJdm9pZCBfX2lvbWVtICpzdGF0ID0gKHZvaWQgX19pb21lbSAqKSBmZGNfc3RhdHVzOwotCQl1bnNpZ25lZCBjaGFyICp2YWRkciA9IHBkbWFfdmFkZHI7Ci0JCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IHBkbWFfc2l6ZTsKLQkJdTggdmFsOwotCi0JCXdoaWxlIChzaXplKSB7Ci0JCQl2YWwgPSByZWFkYihzdGF0KTsKLQkJCWlmICh1bmxpa2VseSghKHZhbCAmIDB4ODApKSkgewotCQkJCXBkbWFfdmFkZHIgPSB2YWRkcjsKLQkJCQlwZG1hX3NpemUgPSBzaXplOwotCQkJCXJldHVybiBJUlFfSEFORExFRDsKLQkJCX0KLQkJCWlmICh1bmxpa2VseSghKHZhbCAmIDB4MjApKSkgewotCQkJCXBkbWFfdmFkZHIgPSB2YWRkcjsKLQkJCQlwZG1hX3NpemUgPSBzaXplOwotCQkJCWRvaW5nX3BkbWEgPSAwOwotCQkJCWdvdG8gbWFpbl9pbnRlcnJ1cHQ7Ci0JCQl9Ci0JCQlpZiAodmFsICYgMHg0MCkgewotCQkJCS8qIHJlYWQgKi8KLQkJCQkqdmFkZHIrKyA9IHJlYWRiKHN0YXQgKyAxKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdW5zaWduZWQgY2hhciBkYXRhID0gKnZhZGRyKys7Ci0KLQkJCQkvKiB3cml0ZSAqLwotCQkJCXdyaXRlYihkYXRhLCBzdGF0ICsgMSk7Ci0JCQl9Ci0JCQlzaXplLS07Ci0JCX0KLQotCQlwZG1hX3ZhZGRyID0gdmFkZHI7Ci0JCXBkbWFfc2l6ZSA9IHNpemU7Ci0KLQkJLyogU2VuZCBUZXJtaW5hbCBDb3VudCBwdWxzZSB0byBmbG9wcHkgY29udHJvbGxlci4gKi8KLQkJdmFsID0gcmVhZGIoYXV4aW9fcmVnaXN0ZXIpOwotCQl2YWwgfD0gQVVYSU9fQVVYMV9GVENOVDsKLQkJd3JpdGViKHZhbCwgYXV4aW9fcmVnaXN0ZXIpOwotCQl2YWwgJj0gfkFVWElPX0FVWDFfRlRDTlQ7Ci0JCXdyaXRlYih2YWwsIGF1eGlvX3JlZ2lzdGVyKTsKLQotCQlkb2luZ19wZG1hID0gMDsKLQl9Ci0KLW1haW5faW50ZXJydXB0OgotCXJldHVybiBmbG9wcHlfaW50ZXJydXB0KGlycSwgZGV2X2Nvb2tpZSwgcmVncyk7Ci19Ci1FWFBPUlRfU1lNQk9MKHNwYXJjX2Zsb3BweV9pcnEpOwotI2VuZGlmCi0KIHN0cnVjdCBzdW41X3RpbWVyIHsKIAl1NjQJY291bnQwOwogCXU2NAlsaW1pdDA7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL29mX2RldmljZS5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9vZl9kZXZpY2UuYwppbmRleCA1NjZhYTM0Li43Njg0NzViIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL29mX2RldmljZS5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvb2ZfZGV2aWNlLmMKQEAgLTEzOCw2ICsxMzgsNyBAQAogICAgICAgIC5zdXNwZW5kCT0gb2ZfZGV2aWNlX3N1c3BlbmQsCiAgICAgICAgLnJlc3VtZQk9IG9mX2RldmljZV9yZXN1bWUsCiB9OworRVhQT1JUX1NZTUJPTChpc2FfYnVzX3R5cGUpOwogCiBzdHJ1Y3QgYnVzX3R5cGUgZWJ1c19idXNfdHlwZSA9IHsKICAgICAgICAubmFtZQk9ICJlYnVzIiwKQEAgLTE0Nyw2ICsxNDgsNyBAQAogICAgICAgIC5zdXNwZW5kCT0gb2ZfZGV2aWNlX3N1c3BlbmQsCiAgICAgICAgLnJlc3VtZQk9IG9mX2RldmljZV9yZXN1bWUsCiB9OworRVhQT1JUX1NZTUJPTChlYnVzX2J1c190eXBlKTsKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1NCVVMKQEAgLTE1OCw2ICsxNjAsNyBAQAogICAgICAgIC5zdXNwZW5kCT0gb2ZfZGV2aWNlX3N1c3BlbmQsCiAgICAgICAgLnJlc3VtZQk9IG9mX2RldmljZV9yZXN1bWUsCiB9OworRVhQT1JUX1NZTUJPTChzYnVzX2J1c190eXBlKTsKICNlbmRpZgogCiBzdGF0aWMgaW50IF9faW5pdCBvZl9idXNfZHJpdmVyX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcHJvbS5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9wcm9tLmMKaW5kZXggZTlkNzAzZS4uOGU4N2U3ZSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wcm9tLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9wcm9tLmMKQEAgLTI3LDYgKzI3LDExIEBACiAKIHN0YXRpYyBzdHJ1Y3QgZGV2aWNlX25vZGUgKmFsbG5vZGVzOwogCisvKiB1c2Ugd2hlbiB0cmF2ZXJzaW5nIHRyZWUgdGhyb3VnaCB0aGUgYWxsbmV4dCwgY2hpbGQsIHNpYmxpbmcsCisgKiBvciBwYXJlbnQgbWVtYmVycyBvZiBzdHJ1Y3QgZGV2aWNlX25vZGUuCisgKi8KK3N0YXRpYyBERUZJTkVfUldMT0NLKGRldnRyZWVfbG9jayk7CisKIGludCBvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldmljZSwgY29uc3QgY2hhciAqY29tcGF0KQogewogCWNvbnN0IGNoYXIqIGNwOwpAQCAtMTg1LDYgKzE5MCw1NCBAQAogfQogRVhQT1JUX1NZTUJPTChvZl9nZXRpbnRwcm9wX2RlZmF1bHQpOwogCitpbnQgb2Zfc2V0X3Byb3BlcnR5KHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAsIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKnZhbCwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgcHJvcGVydHkgKipwcmV2cDsKKwl2b2lkICpuZXdfdmFsOworCWludCBlcnI7CisKKwluZXdfdmFsID0ga21hbGxvYyhsZW4sIEdGUF9LRVJORUwpOworCWlmICghbmV3X3ZhbCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltZW1jcHkobmV3X3ZhbCwgdmFsLCBsZW4pOworCisJZXJyID0gLUVOT0RFVjsKKworCXdyaXRlX2xvY2soJmRldnRyZWVfbG9jayk7CisJcHJldnAgPSAmZHAtPnByb3BlcnRpZXM7CisJd2hpbGUgKCpwcmV2cCkgeworCQlzdHJ1Y3QgcHJvcGVydHkgKnByb3AgPSAqcHJldnA7CisKKwkJaWYgKCFzdHJjbXAocHJvcC0+bmFtZSwgbmFtZSkpIHsKKwkJCXZvaWQgKm9sZF92YWwgPSBwcm9wLT52YWx1ZTsKKwkJCWludCByZXQ7CisKKwkJCXJldCA9IHByb21fc2V0cHJvcChkcC0+bm9kZSwgbmFtZSwgdmFsLCBsZW4pOworCQkJZXJyID0gLUVJTlZBTDsKKwkJCWlmIChyZXQgPj0gMCkgeworCQkJCXByb3AtPnZhbHVlID0gbmV3X3ZhbDsKKwkJCQlwcm9wLT5sZW5ndGggPSBsZW47CisKKwkJCQlpZiAoT0ZfSVNfRFlOQU1JQyhwcm9wKSkKKwkJCQkJa2ZyZWUob2xkX3ZhbCk7CisKKwkJCQlPRl9NQVJLX0RZTkFNSUMocHJvcCk7CisKKwkJCQllcnIgPSAwOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJcHJldnAgPSAmKCpwcmV2cCktPm5leHQ7CisJfQorCXdyaXRlX3VubG9jaygmZGV2dHJlZV9sb2NrKTsKKworCS8qIFhYWCBVcGF0ZSBwcm9jZnMgaWYgbmVjZXNzYXJ5Li4uICovCisKKwlyZXR1cm4gZXJyOworfQorRVhQT1JUX1NZTUJPTChvZl9zZXRfcHJvcGVydHkpOworCiBzdGF0aWMgdW5zaWduZWQgaW50IHByb21fZWFybHlfYWxsb2NhdGVkOwogCiBzdGF0aWMgdm9pZCAqIF9faW5pdCBwcm9tX2Vhcmx5X2FsbG9jKHVuc2lnbmVkIGxvbmcgc2l6ZSkKQEAgLTUzMSw3ICs1ODQsOSBAQAogCXJldHVybiBuOwogfQogCi1zdGF0aWMgc3RydWN0IHByb3BlcnR5ICogX19pbml0IGJ1aWxkX29uZV9wcm9wKHBoYW5kbGUgbm9kZSwgY2hhciAqcHJldikKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdW5pcXVlX2lkOworCitzdGF0aWMgc3RydWN0IHByb3BlcnR5ICogX19pbml0IGJ1aWxkX29uZV9wcm9wKHBoYW5kbGUgbm9kZSwgY2hhciAqcHJldiwgY2hhciAqc3BlY2lhbF9uYW1lLCB2b2lkICpzcGVjaWFsX3ZhbCwgaW50IHNwZWNpYWxfbGVuKQogewogCXN0YXRpYyBzdHJ1Y3QgcHJvcGVydHkgKnRtcCA9IE5VTEw7CiAJc3RydWN0IHByb3BlcnR5ICpwOwpAQCAtNTQwLDI1ICs1OTUsMzUgQEAKIAkJcCA9IHRtcDsKIAkJbWVtc2V0KHAsIDAsIHNpemVvZigqcCkgKyAzMik7CiAJCXRtcCA9IE5VTEw7Ci0JfSBlbHNlCisJfSBlbHNlIHsKIAkJcCA9IHByb21fZWFybHlfYWxsb2Moc2l6ZW9mKHN0cnVjdCBwcm9wZXJ0eSkgKyAzMik7CisJCXAtPnVuaXF1ZV9pZCA9IHVuaXF1ZV9pZCsrOworCX0KIAogCXAtPm5hbWUgPSAoY2hhciAqKSAocCArIDEpOwotCWlmIChwcmV2ID09IE5VTEwpIHsKLQkJcHJvbV9maXJzdHByb3Aobm9kZSwgcC0+bmFtZSk7CisJaWYgKHNwZWNpYWxfbmFtZSkgeworCQlzdHJjcHkocC0+bmFtZSwgc3BlY2lhbF9uYW1lKTsKKwkJcC0+bGVuZ3RoID0gc3BlY2lhbF9sZW47CisJCXAtPnZhbHVlID0gcHJvbV9lYXJseV9hbGxvYyhzcGVjaWFsX2xlbik7CisJCW1lbWNweShwLT52YWx1ZSwgc3BlY2lhbF92YWwsIHNwZWNpYWxfbGVuKTsKIAl9IGVsc2UgewotCQlwcm9tX25leHRwcm9wKG5vZGUsIHByZXYsIHAtPm5hbWUpOwotCX0KLQlpZiAoc3RybGVuKHAtPm5hbWUpID09IDApIHsKLQkJdG1wID0gcDsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXAtPmxlbmd0aCA9IHByb21fZ2V0cHJvcGxlbihub2RlLCBwLT5uYW1lKTsKLQlpZiAocC0+bGVuZ3RoIDw9IDApIHsKLQkJcC0+bGVuZ3RoID0gMDsKLQl9IGVsc2UgewotCQlwLT52YWx1ZSA9IHByb21fZWFybHlfYWxsb2MocC0+bGVuZ3RoKTsKLQkJcHJvbV9nZXRwcm9wZXJ0eShub2RlLCBwLT5uYW1lLCBwLT52YWx1ZSwgcC0+bGVuZ3RoKTsKKwkJaWYgKHByZXYgPT0gTlVMTCkgeworCQkJcHJvbV9maXJzdHByb3Aobm9kZSwgcC0+bmFtZSk7CisJCX0gZWxzZSB7CisJCQlwcm9tX25leHRwcm9wKG5vZGUsIHByZXYsIHAtPm5hbWUpOworCQl9CisJCWlmIChzdHJsZW4ocC0+bmFtZSkgPT0gMCkgeworCQkJdG1wID0gcDsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCXAtPmxlbmd0aCA9IHByb21fZ2V0cHJvcGxlbihub2RlLCBwLT5uYW1lKTsKKwkJaWYgKHAtPmxlbmd0aCA8PSAwKSB7CisJCQlwLT5sZW5ndGggPSAwOworCQl9IGVsc2UgeworCQkJcC0+dmFsdWUgPSBwcm9tX2Vhcmx5X2FsbG9jKHAtPmxlbmd0aCArIDEpOworCQkJcHJvbV9nZXRwcm9wZXJ0eShub2RlLCBwLT5uYW1lLCBwLT52YWx1ZSwgcC0+bGVuZ3RoKTsKKwkJCSgodW5zaWduZWQgY2hhciAqKXAtPnZhbHVlKVtwLT5sZW5ndGhdID0gJ1wwJzsKKwkJfQogCX0KIAlyZXR1cm4gcDsKIH0KQEAgLTU2Nyw5ICs2MzIsMTQgQEAKIHsKIAlzdHJ1Y3QgcHJvcGVydHkgKmhlYWQsICp0YWlsOwogCi0JaGVhZCA9IHRhaWwgPSBidWlsZF9vbmVfcHJvcChub2RlLCBOVUxMKTsKKwloZWFkID0gdGFpbCA9IGJ1aWxkX29uZV9wcm9wKG5vZGUsIE5VTEwsCisJCQkJICAgICAiLm5vZGUiLCAmbm9kZSwgc2l6ZW9mKG5vZGUpKTsKKworCXRhaWwtPm5leHQgPSBidWlsZF9vbmVfcHJvcChub2RlLCBOVUxMLCBOVUxMLCBOVUxMLCAwKTsKKwl0YWlsID0gdGFpbC0+bmV4dDsKIAl3aGlsZSh0YWlsKSB7Ci0JCXRhaWwtPm5leHQgPSBidWlsZF9vbmVfcHJvcChub2RlLCB0YWlsLT5uYW1lKTsKKwkJdGFpbC0+bmV4dCA9IGJ1aWxkX29uZV9wcm9wKG5vZGUsIHRhaWwtPm5hbWUsCisJCQkJCSAgICBOVUxMLCBOVUxMLCAwKTsKIAkJdGFpbCA9IHRhaWwtPm5leHQ7CiAJfQogCkBAIC01OTgsNiArNjY4LDcgQEAKIAkJcmV0dXJuIE5VTEw7CiAKIAlkcCA9IHByb21fZWFybHlfYWxsb2Moc2l6ZW9mKCpkcCkpOworCWRwLT51bmlxdWVfaWQgPSB1bmlxdWVfaWQrKzsKIAogCWtyZWZfaW5pdCgmZHAtPmtyZWYpOwogCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQvbW0vZmF1bHQuYyBiL2FyY2gvc3BhcmM2NC9tbS9mYXVsdC5jCmluZGV4IDZlMDAyYWEuLjE2MDU5NjcgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9tbS9mYXVsdC5jCisrKyBiL2FyY2gvc3BhcmM2NC9tbS9mYXVsdC5jCkBAIC0zMSw2ICszMSw0MCBAQAogI2luY2x1ZGUgPGFzbS9rZGVidWcuaD4KICNpbmNsdWRlIDxhc20vbW11X2NvbnRleHQuaD4KIAorI2lmZGVmIENPTkZJR19LUFJPQkVTCitBVE9NSUNfTk9USUZJRVJfSEVBRChub3RpZnlfcGFnZV9mYXVsdF9jaGFpbik7CisKKy8qIEhvb2sgdG8gcmVnaXN0ZXIgZm9yIHBhZ2UgZmF1bHQgbm90aWZpY2F0aW9ucyAqLworaW50IHJlZ2lzdGVyX3BhZ2VfZmF1bHRfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKK3sKKwlyZXR1cm4gYXRvbWljX25vdGlmaWVyX2NoYWluX3JlZ2lzdGVyKCZub3RpZnlfcGFnZV9mYXVsdF9jaGFpbiwgbmIpOworfQorCitpbnQgdW5yZWdpc3Rlcl9wYWdlX2ZhdWx0X25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpCit7CisJcmV0dXJuIGF0b21pY19ub3RpZmllcl9jaGFpbl91bnJlZ2lzdGVyKCZub3RpZnlfcGFnZV9mYXVsdF9jaGFpbiwgbmIpOworfQorCitzdGF0aWMgaW5saW5lIGludCBub3RpZnlfcGFnZV9mYXVsdChlbnVtIGRpZV92YWwgdmFsLCBjb25zdCBjaGFyICpzdHIsCisJCQlzdHJ1Y3QgcHRfcmVncyAqcmVncywgbG9uZyBlcnIsIGludCB0cmFwLCBpbnQgc2lnKQoreworCXN0cnVjdCBkaWVfYXJncyBhcmdzID0geworCQkucmVncyA9IHJlZ3MsCisJCS5zdHIgPSBzdHIsCisJCS5lcnIgPSBlcnIsCisJCS50cmFwbnIgPSB0cmFwLAorCQkuc2lnbnIgPSBzaWcKKwl9OworCXJldHVybiBhdG9taWNfbm90aWZpZXJfY2FsbF9jaGFpbigmbm90aWZ5X3BhZ2VfZmF1bHRfY2hhaW4sIHZhbCwgJmFyZ3MpOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IG5vdGlmeV9wYWdlX2ZhdWx0KGVudW0gZGllX3ZhbCB2YWwsIGNvbnN0IGNoYXIgKnN0ciwKKwkJCXN0cnVjdCBwdF9yZWdzICpyZWdzLCBsb25nIGVyciwgaW50IHRyYXAsIGludCBzaWcpCit7CisJcmV0dXJuIE5PVElGWV9ET05FOworfQorI2VuZGlmCisKIC8qCiAgKiBUbyBkZWJ1ZyBrZXJuZWwgdG8gY2F0Y2ggYWNjZXNzZXMgdG8gY2VydGFpbiB2aXJ0dWFsL3BoeXNpY2FsIGFkZHJlc3Nlcy4KICAqIE1vZGUgPSAwIHNlbGVjdHMgcGh5c2ljYWwgd2F0Y2hwb2ludHMsIG1vZGUgPSAxIHNlbGVjdHMgdmlydHVhbCB3YXRjaHBvaW50cy4KQEAgLTI2Myw3ICsyOTcsNyBAQAogCiAJZmF1bHRfY29kZSA9IGdldF90aHJlYWRfZmF1bHRfY29kZSgpOwogCi0JaWYgKG5vdGlmeV9kaWUoRElFX1BBR0VfRkFVTFQsICJwYWdlX2ZhdWx0IiwgcmVncywKKwlpZiAobm90aWZ5X3BhZ2VfZmF1bHQoRElFX1BBR0VfRkFVTFQsICJwYWdlX2ZhdWx0IiwgcmVncywKIAkJICAgICAgIGZhdWx0X2NvZGUsIDAsIFNJR1NFR1YpID09IE5PVElGWV9TVE9QKQogCQlyZXR1cm47CiAKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9tbS9pbml0LmMgYi9hcmNoL3NwYXJjNjQvbW0vaW5pdC5jCmluZGV4IDUxMzk5MzQuLjVjMmJjZjMgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9tbS9pbml0LmMKKysrIGIvYXJjaC9zcGFyYzY0L21tL2luaXQuYwpAQCAtMTU2OCw2ICsxNTY4LDcgQEAKIHVuc2lnbmVkIGxvbmcgcGdfaW9iaXRzIF9fcmVhZF9tb3N0bHk7CiAKIHVuc2lnbmVkIGxvbmcgX1BBR0VfSUUgX19yZWFkX21vc3RseTsKK0VYUE9SVF9TWU1CT0woX1BBR0VfSUUpOwogCiB1bnNpZ25lZCBsb25nIF9QQUdFX0UgX19yZWFkX21vc3RseTsKIEVYUE9SVF9TWU1CT0woX1BBR0VfRSk7CmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvbWNvbnNvbGVfa2Vybi5jIGIvYXJjaC91bS9kcml2ZXJzL21jb25zb2xlX2tlcm4uYwppbmRleCA2ZDcxNzNmLi43OTE0OTMxIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvbWNvbnNvbGVfa2Vybi5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9tY29uc29sZV9rZXJuLmMKQEAgLTMwMCw4ICszMDAsNiBAQAogCW1hY2hpbmVfcmVzdGFydChOVUxMKTsKIH0KIAotZXh0ZXJuIHZvaWQgY3RybF9hbHRfZGVsKHZvaWQpOwotCiB2b2lkIG1jb25zb2xlX2NhZChzdHJ1Y3QgbWNfcmVxdWVzdCAqcmVxKQogewogCW1jb25zb2xlX3JlcGx5KHJlcSwgIiIsIDAsIDApOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL3ViZF9rZXJuLmMgYi9hcmNoL3VtL2RyaXZlcnMvdWJkX2tlcm4uYwppbmRleCAwODk3ODUyLi4yOTBjZWM2IDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvdWJkX2tlcm4uYworKysgYi9hcmNoL3VtL2RyaXZlcnMvdWJkX2tlcm4uYwpAQCAtMTIyMiw3ICsxMjIyLDcgQEAKIAkJfQogCX0KIAotCS8qIFN1Y2Nlc2Z1bCByZXR1cm4gY2FzZSEgKi8KKwkvKiBTdWNjZXNzZnVsIHJldHVybiBjYXNlISAqLwogCWlmKGJhY2tpbmdfZmlsZV9vdXQgPT0gTlVMTCkKIAkJcmV0dXJuKGZkKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL3N5c2RlcC14ODZfNjQvc3lzY2FsbHMuaCBiL2FyY2gvdW0vaW5jbHVkZS9zeXNkZXAteDg2XzY0L3N5c2NhbGxzLmgKaW5kZXggZTA2ZjgzZS4uNWU4NmFhMCAxMDA2NDQKLS0tIGEvYXJjaC91bS9pbmNsdWRlL3N5c2RlcC14ODZfNjQvc3lzY2FsbHMuaAorKysgYi9hcmNoL3VtL2luY2x1ZGUvc3lzZGVwLXg4Nl82NC9zeXNjYWxscy5oCkBAIC0xMiw4ICsxMiw2IEBACiAKIHR5cGVkZWYgbG9uZyBzeXNjYWxsX2hhbmRsZXJfdCh2b2lkKTsKIAotZXh0ZXJuIHN5c2NhbGxfaGFuZGxlcl90ICppYTMyX3N5c19jYWxsX3RhYmxlW107Ci0KIGV4dGVybiBzeXNjYWxsX2hhbmRsZXJfdCAqc3lzX2NhbGxfdGFibGVbXTsKIAogI2RlZmluZSBFWEVDVVRFX1NZU0NBTEwoc3lzY2FsbCwgcmVncykgXApkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQvS2NvbmZpZyBiL2FyY2gveDg2XzY0L0tjb25maWcKaW5kZXggYWY0NDEzMC4uY2NjNGE3ZiAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQvS2NvbmZpZworKysgYi9hcmNoL3g4Nl82NC9LY29uZmlnCkBAIC0zODYsMjQgKzM4Niw0NSBAQAogCWJvb2wgIlByb3ZpZGUgUlRDIGludGVycnVwdCIKIAlkZXBlbmRzIG9uIEhQRVRfVElNRVIgJiYgUlRDPXkKIAotY29uZmlnIEdBUlRfSU9NTVUKLQlib29sICJLOCBHQVJUIElPTU1VIHN1cHBvcnQiCisjIE1hcmsgYXMgZW1iZWRkZWQgYmVjYXVzZSB0b28gbWFueSBwZW9wbGUgZ290IGl0IHdyb25nLgorIyBUaGUgY29kZSBkaXNhYmxlcyBpdHNlbGYgd2hlbiBub3QgbmVlZGVkLgorY29uZmlnIElPTU1VCisJYm9vbCAiSU9NTVUgc3VwcG9ydCIgaWYgRU1CRURERUQKIAlkZWZhdWx0IHkKIAlzZWxlY3QgU1dJT1RMQgogCXNlbGVjdCBBR1AKIAlkZXBlbmRzIG9uIFBDSQogCWhlbHAKLQkgIFN1cHBvcnQgZm9yIGhhcmR3YXJlIElPTU1VIGluIEFNRCdzIE9wdGVyb24vQXRobG9uNjQgUHJvY2Vzc29ycwotCSAgYW5kIGZvciB0aGUgYm91bmNlIGJ1ZmZlcmluZyBzb2Z0d2FyZSBJT01NVS4KLQkgIE5lZWRlZCB0byBydW4gc3lzdGVtcyB3aXRoIG1vcmUgdGhhbiAzR0Igb2YgbWVtb3J5IHByb3Blcmx5IHdpdGgKLQkgIDMyLWJpdCBQQ0kgZGV2aWNlcyB0aGF0IGRvIG5vdCBzdXBwb3J0IERBQyAoRG91YmxlIEFkZHJlc3MgQ3ljbGUpLgotCSAgVGhlIElPTU1VIGNhbiBiZSB0dXJuZWQgb2ZmIGF0IHJ1bnRpbWUgd2l0aCB0aGUgaW9tbXU9b2ZmIHBhcmFtZXRlci4KLSAgCSAgTm9ybWFsbHkgdGhlIGtlcm5lbCB3aWxsIHRha2UgdGhlIHJpZ2h0IGNob2ljZSBieSBpdHNlbGYuCi0gIAkgIFRoaXMgb3B0aW9uIGluY2x1ZGVzIGEgZHJpdmVyIGZvciB0aGUgQU1EIE9wdGVyb24vQXRobG9uNjQgSU9NTVUKLSAgCSAgbm9ydGhicmlkZ2UgYW5kIGEgc29mdHdhcmUgZW11bGF0aW9uIHVzZWQgb24gb3RoZXIgc3lzdGVtcyB3aXRob3V0Ci0JICBoYXJkd2FyZSBJT01NVS4gIElmIHVuc3VyZSwgc2F5IFkuCisJICBTdXBwb3J0IGZvciBmdWxsIERNQSBhY2Nlc3Mgb2YgZGV2aWNlcyB3aXRoIDMyYml0IG1lbW9yeSBhY2Nlc3Mgb25seQorCSAgb24gc3lzdGVtcyB3aXRoIG1vcmUgdGhhbiAzR0IuIFRoaXMgaXMgdXN1YWxseSBuZWVkZWQgZm9yIFVTQiwKKwkgIHNvdW5kLCBtYW55IElERS9TQVRBIGNoaXBzZXRzIGFuZCBzb21lIG90aGVyIGRldmljZXMuCisJICBQcm92aWRlcyBhIGRyaXZlciBmb3IgdGhlIEFNRCBBdGhsb242NC9PcHRlcm9uL1R1cmlvbi9TZW1wcm9uIEdBUlQKKwkgIGJhc2VkIElPTU1VIGFuZCBhIHNvZnR3YXJlIGJvdW5jZSBidWZmZXIgYmFzZWQgSU9NTVUgdXNlZCBvbiBJbnRlbAorCSAgc3lzdGVtcyBhbmQgYXMgZmFsbGJhY2suCisJICBUaGUgY29kZSBpcyBvbmx5IGFjdGl2ZSB3aGVuIG5lZWRlZCAoZW5vdWdoIG1lbW9yeSBhbmQgbGltaXRlZAorCSAgZGV2aWNlKSB1bmxlc3MgQ09ORklHX0lPTU1VX0RFQlVHIG9yIGlvbW11PWZvcmNlIGlzIHNwZWNpZmllZAorCSAgdG9vLgogCi0jIG5lZWQgdGhpcyBhbHdheXMgc2VsZWN0ZWQgYnkgR0FSVF9JT01NVSBmb3IgdGhlIFZJQSB3b3JrYXJvdW5kCitjb25maWcgQ0FMR0FSWV9JT01NVQorCWJvb2wgIklCTSBDYWxnYXJ5IElPTU1VIHN1cHBvcnQiCisJZGVmYXVsdCB5CisJc2VsZWN0IFNXSU9UTEIKKwlkZXBlbmRzIG9uIFBDSSAmJiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBTdXBwb3J0IGZvciBoYXJkd2FyZSBJT01NVXMgaW4gSUJNJ3MgeFNlcmllcyB4MzY2IGFuZCB4NDYwCisJICBzeXN0ZW1zLiBOZWVkZWQgdG8gcnVuIHN5c3RlbXMgd2l0aCBtb3JlIHRoYW4gM0dCIG9mIG1lbW9yeQorCSAgcHJvcGVybHkgd2l0aCAzMi1iaXQgUENJIGRldmljZXMgdGhhdCBkbyBub3Qgc3VwcG9ydCBEQUMKKwkgIChEb3VibGUgQWRkcmVzcyBDeWNsZSkuIENhbGdhcnkgYWxzbyBzdXBwb3J0cyBidXMgbGV2ZWwKKwkgIGlzb2xhdGlvbiwgd2hlcmUgYWxsIERNQXMgcGFzcyB0aHJvdWdoIHRoZSBJT01NVS4gIFRoaXMKKwkgIHByZXZlbnRzIHRoZW0gZnJvbSBnb2luZyBhbnl3aGVyZSBleGNlcHQgdGhlaXIgaW50ZW5kZWQKKwkgIGRlc3RpbmF0aW9uLiBUaGlzIGNhdGNoZXMgaGFyZC10by1maW5kIGtlcm5lbCBidWdzIGFuZAorCSAgbWlzLWJlaGF2aW5nIGRyaXZlcnMgYW5kIGRldmljZXMgdGhhdCBkbyBub3QgdXNlIHRoZSBETUEtQVBJCisJICBwcm9wZXJseSB0byBzZXQgdXAgdGhlaXIgRE1BIGJ1ZmZlcnMuICBUaGUgSU9NTVUgY2FuIGJlCisJICB0dXJuZWQgb2ZmIGF0IGJvb3QgdGltZSB3aXRoIHRoZSBpb21tdT1vZmYgcGFyYW1ldGVyLgorCSAgTm9ybWFsbHkgdGhlIGtlcm5lbCB3aWxsIG1ha2UgdGhlIHJpZ2h0IGNob2ljZSBieSBpdHNlbGYuCisJICBJZiB1bnN1cmUsIHNheSBZLgorCisjIG5lZWQgdGhpcyBhbHdheXMgc2VsZWN0ZWQgYnkgSU9NTVUgZm9yIHRoZSBWSUEgd29ya2Fyb3VuZAogY29uZmlnIFNXSU9UTEIKIAlib29sCiAKQEAgLTUwMSw2ICs1MjIsMTAgQEAKICAgICAgICAgIG9wdGltYWwgVExCIHVzYWdlLiBJZiB5b3UgaGF2ZSBwcmV0dHkgbXVjaCBhbnkgdmVyc2lvbiBvZiBiaW51dGlscywgCiAJIHRoaXMgY2FuIGluY3JlYXNlIHlvdXIga2VybmVsIGJ1aWxkIHRpbWUgYnkgcm91Z2hseSBvbmUgbWludXRlLgogCitjb25maWcgSzhfTkIKKwlkZWZfYm9vbCB5CisJZGVwZW5kcyBvbiBBR1BfQU1ENjQgfHwgSU9NTVUgfHwgKFBDSSAmJiBOVU1BKQorCiBlbmRtZW51CiAKICMKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L0tjb25maWcuZGVidWcgYi9hcmNoL3g4Nl82NC9LY29uZmlnLmRlYnVnCmluZGV4IGVhMzFiNGMuLjFkOTJhYjUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L0tjb25maWcuZGVidWcKKysrIGIvYXJjaC94ODZfNjQvS2NvbmZpZy5kZWJ1ZwpAQCAtMTMsNyArMTMsNyBAQAogCSBJZiBpbiBkb3VidCwgc2F5ICJOIi4KIAogY29uZmlnIElPTU1VX0RFQlVHCi0gICAgICAgZGVwZW5kcyBvbiBHQVJUX0lPTU1VICYmIERFQlVHX0tFUk5FTAorICAgICAgIGRlcGVuZHMgb24gSU9NTVUgJiYgREVCVUdfS0VSTkVMCiAgICAgICAgYm9vbCAiRW5hYmxlIElPTU1VIGRlYnVnZ2luZyIKICAgICAgICBoZWxwCiAgICAgICAgICBGb3JjZSB0aGUgSU9NTVUgdG8gb24gZXZlbiB3aGVuIHlvdSBoYXZlIGxlc3MgdGhhbiA0R0Igb2YKQEAgLTM1LDYgKzM1LDIyIEBACiAgICAgICAgICBBZGQgYSBzaW1wbGUgbGVhayB0cmFjZXIgdG8gdGhlIElPTU1VIGNvZGUuIFRoaXMgaXMgdXNlZnVsIHdoZW4geW91CiAJIGFyZSBkZWJ1Z2dpbmcgYSBidWdneSBkZXZpY2UgZHJpdmVyIHRoYXQgbGVha3MgSU9NTVUgbWFwcGluZ3MuCiAKK2NvbmZpZyBERUJVR19TVEFDS09WRVJGTE9XCisgICAgICAgIGJvb2wgIkNoZWNrIGZvciBzdGFjayBvdmVyZmxvd3MiCisgICAgICAgIGRlcGVuZHMgb24gREVCVUdfS0VSTkVMCisgICAgICAgIGhlbHAKKwkgIFRoaXMgb3B0aW9uIHdpbGwgY2F1c2UgbWVzc2FnZXMgdG8gYmUgcHJpbnRlZCBpZiBmcmVlIHN0YWNrIHNwYWNlCisJICBkcm9wcyBiZWxvdyBhIGNlcnRhaW4gbGltaXQuCisKK2NvbmZpZyBERUJVR19TVEFDS19VU0FHRQorICAgICAgICBib29sICJTdGFjayB1dGlsaXphdGlvbiBpbnN0cnVtZW50YXRpb24iCisgICAgICAgIGRlcGVuZHMgb24gREVCVUdfS0VSTkVMCisgICAgICAgIGhlbHAKKwkgIEVuYWJsZXMgdGhlIGRpc3BsYXkgb2YgdGhlIG1pbmltdW0gYW1vdW50IG9mIGZyZWUgc3RhY2sgd2hpY2ggZWFjaAorCSAgdGFzayBoYXMgZXZlciBoYWQgYXZhaWxhYmxlIGluIHRoZSBzeXNycS1UIGFuZCBzeXNycS1QIGRlYnVnIG91dHB1dC4KKworCSAgVGhpcyBvcHRpb24gd2lsbCBzbG93IGRvd24gcHJvY2VzcyBjcmVhdGlvbiBzb21ld2hhdC4KKwogI2NvbmZpZyBYODZfUkVNT1RFX0RFQlVHCiAjICAgICAgIGJvb2wgImtnZGIgZGVidWdnaW5nIHN0dWIiCiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L01ha2VmaWxlIGIvYXJjaC94ODZfNjQvTWFrZWZpbGUKaW5kZXggZTU3M2UyYS4uNDMxYmI0YiAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQvTWFrZWZpbGUKKysrIGIvYXJjaC94ODZfNjQvTWFrZWZpbGUKQEAgLTI3LDYgKzI3LDcgQEAKIENIRUNLRkxBR1MgICAgICArPSAtRF9feDg2XzY0X18gLW02NAogCiBjZmxhZ3MteQk6PQorY2ZsYWdzLWtlcm5lbC15CTo9CiBjZmxhZ3MtJChDT05GSUdfTUs4KSArPSAkKGNhbGwgY2Mtb3B0aW9uLC1tYXJjaD1rOCkKIGNmbGFncy0kKENPTkZJR19NUFNDKSArPSAkKGNhbGwgY2Mtb3B0aW9uLC1tYXJjaD1ub2NvbmEpCiBjZmxhZ3MtJChDT05GSUdfR0VORVJJQ19DUFUpICs9ICQoY2FsbCBjYy1vcHRpb24sLW10dW5lPWdlbmVyaWMpCkBAIC0zNSw3ICszNiw3IEBACiBjZmxhZ3MteSArPSAtbW5vLXJlZC16b25lCiBjZmxhZ3MteSArPSAtbWNtb2RlbD1rZXJuZWwKIGNmbGFncy15ICs9IC1waXBlCi1jZmxhZ3MtJChDT05GSUdfUkVPUkRFUikgKz0gLWZmdW5jdGlvbi1zZWN0aW9ucworY2ZsYWdzLWtlcm5lbC0kKENPTkZJR19SRU9SREVSKSArPSAtZmZ1bmN0aW9uLXNlY3Rpb25zCiAjIHRoaXMgbWFrZXMgcmVhZGluZyBhc3NlbWJseSBzb3VyY2UgZWFzaWVyLCBidXQgcHJvZHVjZXMgd29yc2UgY29kZQogIyBhY3R1YWxseSBpdCBtYWtlcyB0aGUga2VybmVsIHNtYWxsZXIgdG9vLgogY2ZsYWdzLXkgKz0gLWZuby1yZW9yZGVyLWJsb2NrcwpAQCAtNTUsNiArNTYsNyBAQAogY2ZsYWdzLXkgKz0gJChjYWxsIGNjLW9wdGlvbiwtbW5vLXNzZSAtbW5vLW1teCAtbW5vLXNzZTIgLW1uby0zZG5vdywpCiAKIENGTEFHUyArPSAkKGNmbGFncy15KQorQ0ZMQUdTX0tFUk5FTCArPSAkKGNmbGFncy1rZXJuZWwteSkKIEFGTEFHUyArPSAtbTY0CiAKIGhlYWQteSA6PSBhcmNoL3g4Nl82NC9rZXJuZWwvaGVhZC5vIGFyY2gveDg2XzY0L2tlcm5lbC9oZWFkNjQubyBhcmNoL3g4Nl82NC9rZXJuZWwvaW5pdF90YXNrLm8KZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2Jvb3QvTWFrZWZpbGUgYi9hcmNoL3g4Nl82NC9ib290L01ha2VmaWxlCmluZGV4IDQzZWU2YzUuLmRlYjA2M2UgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2Jvb3QvTWFrZWZpbGUKKysrIGIvYXJjaC94ODZfNjQvYm9vdC9NYWtlZmlsZQpAQCAtMTA3LDggKzEwNywxMyBAQAogaXNvaW1hZ2U6ICQoQk9PVElNQUdFKQogCS1ybSAtcmYgJChvYmopL2lzb2ltYWdlCiAJbWtkaXIgJChvYmopL2lzb2ltYWdlCi0JY3AgYGVjaG8gL3Vzci9saWIqL3N5c2xpbnV4L2lzb2xpbnV4LmJpbiB8IGF3ayAneyBwcmludCAkMTsgfSdgIFwKLQkJJChvYmopL2lzb2ltYWdlCisJZm9yIGkgaW4gbGliIGxpYjY0IHNoYXJlIGVuZCA7IGRvIFwKKwkJaWYgWyAtZiAvdXNyLyQkaS9zeXNsaW51eC9pc29saW51eC5iaW4gXSA7IHRoZW4gXAorCQkJY3AgL3Vzci8kJGkvc3lzbGludXgvaXNvbGludXguYmluICQob2JqKS9pc29pbWFnZSA7IFwKKwkJCWJyZWFrIDsgXAorCQlmaSA7IFwKKwkJaWYgWyAkJGkgPSBlbmQgXSA7IHRoZW4gZXhpdCAxIDsgZmkgOyBcCisJZG9uZQogCWNwICQoQk9PVElNQUdFKSAkKG9iaikvaXNvaW1hZ2UvbGludXgKIAllY2hvICckKGltYWdlX2NtZGxpbmUpJyA+ICQob2JqKS9pc29pbWFnZS9pc29saW51eC5jZmcKIAlpZiBbIC1mICckKEZESU5JVFJEKScgXSA7IHRoZW4gXApkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQvYm9vdC9jb21wcmVzc2VkL21pc2MuYyBiL2FyY2gveDg2XzY0L2Jvb3QvY29tcHJlc3NlZC9taXNjLmMKaW5kZXggY2Y0Yjg4Yy4uMzc1NWIyZSAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQvYm9vdC9jb21wcmVzc2VkL21pc2MuYworKysgYi9hcmNoL3g4Nl82NC9ib290L2NvbXByZXNzZWQvbWlzYy5jCkBAIC03NywxMSArNzcsMTEgQEAKICAqLwogc3RhdGljIHVuc2lnbmVkIGNoYXIgKnJlYWxfbW9kZTsgLyogUG9pbnRlciB0byByZWFsLW1vZGUgZGF0YSAqLwogCi0jZGVmaW5lIEVYVF9NRU1fSyAgICgqKHVuc2lnbmVkIHNob3J0ICopKHJlYWxfbW9kZSArIDB4MikpCisjZGVmaW5lIFJNX0VYVF9NRU1fSyAgICgqKHVuc2lnbmVkIHNob3J0ICopKHJlYWxfbW9kZSArIDB4MikpCiAjaWZuZGVmIFNUQU5EQVJEX01FTU9SWV9CSU9TX0NBTEwKLSNkZWZpbmUgQUxUX01FTV9LICAgKCoodW5zaWduZWQgbG9uZyAqKShyZWFsX21vZGUgKyAweDFlMCkpCisjZGVmaW5lIFJNX0FMVF9NRU1fSyAgICgqKHVuc2lnbmVkIGxvbmcgKikocmVhbF9tb2RlICsgMHgxZTApKQogI2VuZGlmCi0jZGVmaW5lIFNDUkVFTl9JTkZPICgqKHN0cnVjdCBzY3JlZW5faW5mbyAqKShyZWFsX21vZGUrMCkpCisjZGVmaW5lIFJNX1NDUkVFTl9JTkZPICgqKHN0cnVjdCBzY3JlZW5faW5mbyAqKShyZWFsX21vZGUrMCkpCiAKIGV4dGVybiB1bnNpZ25lZCBjaGFyIGlucHV0X2RhdGFbXTsKIGV4dGVybiBpbnQgaW5wdXRfbGVuOwpAQCAtOTIsOSArOTIsOSBAQAogCiBzdGF0aWMgdm9pZCAqbWFsbG9jKGludCBzaXplKTsKIHN0YXRpYyB2b2lkIGZyZWUodm9pZCAqd2hlcmUpOwotIAotdm9pZCogbWVtc2V0KHZvaWQqIHMsIGludCBjLCB1bnNpZ25lZCBuKTsKLXZvaWQqIG1lbWNweSh2b2lkKiBkZXN0LCBjb25zdCB2b2lkKiBzcmMsIHVuc2lnbmVkIG4pOworCitzdGF0aWMgdm9pZCAqbWVtc2V0KHZvaWQgKnMsIGludCBjLCB1bnNpZ25lZCBuKTsKK3N0YXRpYyB2b2lkICptZW1jcHkodm9pZCAqZGVzdCwgY29uc3Qgdm9pZCAqc3JjLCB1bnNpZ25lZCBuKTsKIAogc3RhdGljIHZvaWQgcHV0c3RyKGNvbnN0IGNoYXIgKik7CiAKQEAgLTE2Miw4ICsxNjIsOCBAQAogCWludCB4LHkscG9zOwogCWNoYXIgYzsKIAotCXggPSBTQ1JFRU5fSU5GTy5vcmlnX3g7Ci0JeSA9IFNDUkVFTl9JTkZPLm9yaWdfeTsKKwl4ID0gUk1fU0NSRUVOX0lORk8ub3JpZ194OworCXkgPSBSTV9TQ1JFRU5fSU5GTy5vcmlnX3k7CiAKIAl3aGlsZSAoICggYyA9ICpzKysgKSAhPSAnXDAnICkgewogCQlpZiAoIGMgPT0gJ1xuJyApIHsKQEAgLTE4NCw4ICsxODQsOCBAQAogCQl9CiAJfQogCi0JU0NSRUVOX0lORk8ub3JpZ194ID0geDsKLQlTQ1JFRU5fSU5GTy5vcmlnX3kgPSB5OworCVJNX1NDUkVFTl9JTkZPLm9yaWdfeCA9IHg7CisJUk1fU0NSRUVOX0lORk8ub3JpZ195ID0geTsKIAogCXBvcyA9ICh4ICsgY29scyAqIHkpICogMjsJLyogVXBkYXRlIGN1cnNvciBwb3NpdGlvbiAqLwogCW91dGJfcCgxNCwgdmlkcG9ydCk7CkBAIC0xOTQsNyArMTk0LDcgQEAKIAlvdXRiX3AoMHhmZiAmIChwb3MgPj4gMSksIHZpZHBvcnQrMSk7CiB9CiAKLXZvaWQqIG1lbXNldCh2b2lkKiBzLCBpbnQgYywgdW5zaWduZWQgbikKK3N0YXRpYyB2b2lkKiBtZW1zZXQodm9pZCogcywgaW50IGMsIHVuc2lnbmVkIG4pCiB7CiAJaW50IGk7CiAJY2hhciAqc3MgPSAoY2hhciopczsKQEAgLTIwMyw3ICsyMDMsNyBAQAogCXJldHVybiBzOwogfQogCi12b2lkKiBtZW1jcHkodm9pZCogZGVzdCwgY29uc3Qgdm9pZCogc3JjLCB1bnNpZ25lZCBuKQorc3RhdGljIHZvaWQqIG1lbWNweSh2b2lkKiBkZXN0LCBjb25zdCB2b2lkKiBzcmMsIHVuc2lnbmVkIG4pCiB7CiAJaW50IGk7CiAJY2hhciAqZCA9IChjaGFyICopZGVzdCwgKnMgPSAoY2hhciAqKXNyYzsKQEAgLTI3OCwxNSArMjc4LDE1IEBACiAJcHV0c3RyKHgpOwogCXB1dHN0cigiXG5cbiAtLSBTeXN0ZW0gaGFsdGVkIik7CiAKLQl3aGlsZSgxKTsKKwl3aGlsZSgxKTsJLyogSGFsdCAqLwogfQogCi12b2lkIHNldHVwX25vcm1hbF9vdXRwdXRfYnVmZmVyKHZvaWQpCitzdGF0aWMgdm9pZCBzZXR1cF9ub3JtYWxfb3V0cHV0X2J1ZmZlcih2b2lkKQogewogI2lmZGVmIFNUQU5EQVJEX01FTU9SWV9CSU9TX0NBTEwKLQlpZiAoRVhUX01FTV9LIDwgMTAyNCkgZXJyb3IoIkxlc3MgdGhhbiAyTUIgb2YgbWVtb3J5Iik7CisJaWYgKFJNX0VYVF9NRU1fSyA8IDEwMjQpIGVycm9yKCJMZXNzIHRoYW4gMk1CIG9mIG1lbW9yeSIpOwogI2Vsc2UKLQlpZiAoKEFMVF9NRU1fSyA+IEVYVF9NRU1fSyA/IEFMVF9NRU1fSyA6IEVYVF9NRU1fSykgPCAxMDI0KSBlcnJvcigiTGVzcyB0aGFuIDJNQiBvZiBtZW1vcnkiKTsKKwlpZiAoKFJNX0FMVF9NRU1fSyA+IFJNX0VYVF9NRU1fSyA/IFJNX0FMVF9NRU1fSyA6IFJNX0VYVF9NRU1fSykgPCAxMDI0KSBlcnJvcigiTGVzcyB0aGFuIDJNQiBvZiBtZW1vcnkiKTsKICNlbmRpZgogCW91dHB1dF9kYXRhID0gKHVuc2lnbmVkIGNoYXIgKilfX1BIWVNJQ0FMX1NUQVJUOyAvKiBOb3JtYWxseSBQb2ludHMgdG8gMU0gKi8KIAlmcmVlX21lbV9lbmRfcHRyID0gKGxvbmcpcmVhbF9tb2RlOwpAQCAtMjk3LDEzICsyOTcsMTMgQEAKIAl1Y2ggKmhpZ2hfYnVmZmVyX3N0YXJ0OyBpbnQgaGNvdW50OwogfTsKIAotdm9pZCBzZXR1cF9vdXRwdXRfYnVmZmVyX2lmX3dlX3J1bl9oaWdoKHN0cnVjdCBtb3ZlcGFyYW1zICptdikKK3N0YXRpYyB2b2lkIHNldHVwX291dHB1dF9idWZmZXJfaWZfd2VfcnVuX2hpZ2goc3RydWN0IG1vdmVwYXJhbXMgKm12KQogewogCWhpZ2hfYnVmZmVyX3N0YXJ0ID0gKHVjaCAqKSgoKHVsZykmZW5kKSArIEhFQVBfU0laRSk7CiAjaWZkZWYgU1RBTkRBUkRfTUVNT1JZX0JJT1NfQ0FMTAotCWlmIChFWFRfTUVNX0sgPCAoMyoxMDI0KSkgZXJyb3IoIkxlc3MgdGhhbiA0TUIgb2YgbWVtb3J5Iik7CisJaWYgKFJNX0VYVF9NRU1fSyA8ICgzKjEwMjQpKSBlcnJvcigiTGVzcyB0aGFuIDRNQiBvZiBtZW1vcnkiKTsKICNlbHNlCi0JaWYgKChBTFRfTUVNX0sgPiBFWFRfTUVNX0sgPyBBTFRfTUVNX0sgOiBFWFRfTUVNX0spIDwgKDMqMTAyNCkpIGVycm9yKCJMZXNzIHRoYW4gNE1CIG9mIG1lbW9yeSIpOworCWlmICgoUk1fQUxUX01FTV9LID4gUk1fRVhUX01FTV9LID8gUk1fQUxUX01FTV9LIDogUk1fRVhUX01FTV9LKSA8ICgzKjEwMjQpKSBlcnJvcigiTGVzcyB0aGFuIDRNQiBvZiBtZW1vcnkiKTsKICNlbmRpZgkKIAltdi0+bG93X2J1ZmZlcl9zdGFydCA9IG91dHB1dF9kYXRhID0gKHVuc2lnbmVkIGNoYXIgKilMT1dfQlVGRkVSX1NUQVJUOwogCWxvd19idWZmZXJfZW5kID0gKCh1bnNpZ25lZCBpbnQpcmVhbF9tb2RlID4gTE9XX0JVRkZFUl9NQVgKQEAgLTMxOSw3ICszMTksNyBAQAogCW12LT5oaWdoX2J1ZmZlcl9zdGFydCA9IGhpZ2hfYnVmZmVyX3N0YXJ0OwogfQogCi12b2lkIGNsb3NlX291dHB1dF9idWZmZXJfaWZfd2VfcnVuX2hpZ2goc3RydWN0IG1vdmVwYXJhbXMgKm12KQorc3RhdGljIHZvaWQgY2xvc2Vfb3V0cHV0X2J1ZmZlcl9pZl93ZV9ydW5faGlnaChzdHJ1Y3QgbW92ZXBhcmFtcyAqbXYpCiB7CiAJaWYgKGJ5dGVzX291dCA+IGxvd19idWZmZXJfc2l6ZSkgewogCQltdi0+bGNvdW50ID0gbG93X2J1ZmZlcl9zaXplOwpAQCAtMzM1LDcgKzMzNSw3IEBACiB7CiAJcmVhbF9tb2RlID0gcm1vZGU7CiAKLQlpZiAoU0NSRUVOX0lORk8ub3JpZ192aWRlb19tb2RlID09IDcpIHsKKwlpZiAoUk1fU0NSRUVOX0lORk8ub3JpZ192aWRlb19tb2RlID09IDcpIHsKIAkJdmlkbWVtID0gKGNoYXIgKikgMHhiMDAwMDsKIAkJdmlkcG9ydCA9IDB4M2I0OwogCX0gZWxzZSB7CkBAIC0zNDMsOCArMzQzLDggQEAKIAkJdmlkcG9ydCA9IDB4M2Q0OwogCX0KIAotCWxpbmVzID0gU0NSRUVOX0lORk8ub3JpZ192aWRlb19saW5lczsKLQljb2xzID0gU0NSRUVOX0lORk8ub3JpZ192aWRlb19jb2xzOworCWxpbmVzID0gUk1fU0NSRUVOX0lORk8ub3JpZ192aWRlb19saW5lczsKKwljb2xzID0gUk1fU0NSRUVOX0lORk8ub3JpZ192aWRlb19jb2xzOwogCiAJaWYgKGZyZWVfbWVtX3B0ciA8IDB4MTAwMDAwKSBzZXR1cF9ub3JtYWxfb3V0cHV0X2J1ZmZlcigpOwogCWVsc2Ugc2V0dXBfb3V0cHV0X2J1ZmZlcl9pZl93ZV9ydW5faGlnaChtdik7CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9ib290L3Rvb2xzL2J1aWxkLmMgYi9hcmNoL3g4Nl82NC9ib290L3Rvb2xzL2J1aWxkLmMKaW5kZXggYzQ0ZjVlMi4uZWFlODY2OSAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQvYm9vdC90b29scy9idWlsZC5jCisrKyBiL2FyY2gveDg2XzY0L2Jvb3QvdG9vbHMvYnVpbGQuYwpAQCAtMTQ5LDEwICsxNDksOCBAQAogCXN6ID0gc2Iuc3Rfc2l6ZTsKIAlmcHJpbnRmIChzdGRlcnIsICJTeXN0ZW0gaXMgJWQga0JcbiIsIHN6LzEwMjQpOwogCXN5c19zaXplID0gKHN6ICsgMTUpIC8gMTY7Ci0JLyogMHg0MDAwMCoxNiA9IDQuMCBNQiwgcmVhc29uYWJsZSBlc3RpbWF0ZSBmb3IgdGhlIGN1cnJlbnQgbWF4aW11bSAqLwotCWlmIChzeXNfc2l6ZSA+IChpc19iaWdfa2VybmVsID8gMHg0MDAwMCA6IERFRl9TWVNTSVpFKSkKLQkJZGllKCJTeXN0ZW0gaXMgdG9vIGJpZy4gVHJ5IHVzaW5nICVzbW9kdWxlcy4iLAotCQkJaXNfYmlnX2tlcm5lbCA/ICIiIDogImJ6SW1hZ2Ugb3IgIik7CisJaWYgKCFpc19iaWdfa2VybmVsICYmIHN5c19zaXplID4gREVGX1NZU1NJWkUpCisJCWRpZSgiU3lzdGVtIGlzIHRvbyBiaWcuIFRyeSB1c2luZyBiekltYWdlIG9yIG1vZHVsZXMuIik7CiAJd2hpbGUgKHN6ID4gMCkgewogCQlpbnQgbCwgbjsKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQvYm9vdC92aWRlby5TIGIvYXJjaC94ODZfNjQvYm9vdC92aWRlby5TCmluZGV4IDMyMzI3YmIuLjJhYTU2NWMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2Jvb3QvdmlkZW8uUworKysgYi9hcmNoL3g4Nl82NC9ib290L3ZpZGVvLlMKQEAgLTE5MjksNiArMTkyOSw3IEBACiAJcmV0CiAKIHN0b3JlX2VkaWQ6CisjaWZkZWYgQ09ORklHX0ZJUk1XQVJFX0VESUQKIAlwdXNodwklZXMJCQkJIyBqdXN0IHNhdmUgYWxsIHJlZ2lzdGVycwogCXB1c2h3CSVheAogCXB1c2h3CSVieApAQCAtMTk0Niw2ICsxOTQ3LDIyIEBACiAJcmVwCiAJc3Rvc2wKIAorCXB1c2h3ICAgJWVzCQkJCSMgc2F2ZSBFUworCXhvcncgICAgJWRpLCAlZGkgICAgICAgICAgICAgICAgICAgICAgICAjIFJlcG9ydCBDYXBhYmlsaXR5CisJcHVzaHcgICAlZGkKKwlwb3B3ICAgICVlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBFUzpESSBtdXN0IGJlIDA6MAorCW1vdncJJDB4NGYxNSwgJWF4CisJeG9ydwklYngsICVieAorCXhvcncJJWN4LCAlY3gKKwlpbnQJJDB4MTAKKwlwb3B3ICAgICVlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyByZXN0b3JlIEVTCisKKwljbXBiICAgICQweDAwLCAlYWggICAgICAgICAgICAgICAgICAgICAgIyBjYWxsIHN1Y2Nlc3NmdWwKKwlqbmUgICAgIG5vX2VkaWQKKworCWNtcGIgICAgJDB4NGYsICVhbCAgICAgICAgICAgICAgICAgICAgICAjIGZ1bmN0aW9uIHN1cHBvcnRlZAorCWpuZSAgICAgbm9fZWRpZAorCiAJbW92dwkkMHg0ZjE1LCAlYXggICAgICAgICAgICAgICAgICAgICMgZG8gVkJFL0REQwogCW1vdncJJDB4MDEsICVieAogCW1vdncJJDB4MDAsICVjeApAQCAtMTk1MywxMiArMTk3MCwxNCBAQAogCW1vdncJJDB4MTQwLCAlZGkKIAlpbnQJJDB4MTAKIAorbm9fZWRpZDoKIAlwb3B3CSVkaQkJCQkjIHJlc3RvcmUgYWxsIHJlZ2lzdGVycwogCXBvcHcJJWR4CiAJcG9wdwklY3gKIAlwb3B3CSVieAogCXBvcHcJJWF4CiAJcG9wdwklZXMKKyNlbmRpZgogCXJldAogCiAjIFZJREVPX1NFTEVDVC1vbmx5IHZhcmlhYmxlcwpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQvY3J5cHRvL2Flcy14ODZfNjQtYXNtLlMgYi9hcmNoL3g4Nl82NC9jcnlwdG8vYWVzLXg4Nl82NC1hc20uUwppbmRleCA0ODNjYmIyLi4yNmI0MGRlIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9jcnlwdG8vYWVzLXg4Nl82NC1hc20uUworKysgYi9hcmNoL3g4Nl82NC9jcnlwdG8vYWVzLXg4Nl82NC1hc20uUwpAQCAtMTUsNiArMTUsMTAgQEAKIAogLnRleHQKIAorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgorCisjZGVmaW5lIEJBU0UgY3J5cHRvX3RmbV9jdHhfb2Zmc2V0CisKICNkZWZpbmUgUjEJJXJheAogI2RlZmluZSBSMUUJJWVheAogI2RlZmluZSBSMVgJJWF4CkBAIC00NiwxOSArNTAsMTkgQEAKICNkZWZpbmUgUjEwCSVyMTAKICNkZWZpbmUgUjExCSVyMTEKIAotI2RlZmluZSBwcm9sb2d1ZShGVU5DLEJBU0UsQjEyOCxCMTkyLHIxLHIyLHIzLHI0LHI1LHI2LHI3LHI4LHI5LHIxMCxyMTEpIFwKKyNkZWZpbmUgcHJvbG9ndWUoRlVOQyxLRVksQjEyOCxCMTkyLHIxLHIyLHIzLHI0LHI1LHI2LHI3LHI4LHI5LHIxMCxyMTEpIFwKIAkuZ2xvYmFsCUZVTkM7CQkJXAogCS50eXBlCUZVTkMsQGZ1bmN0aW9uOwkJXAogCS5hbGlnbgk4OwkJCVwKIEZVTkM6CW1vdnEJcjEscjI7CQkJXAogCW1vdnEJcjMscjQ7CQkJXAotCWxlYXEJQkFTRSs1MihyOCkscjk7CQlcCisJbGVhcQlCQVNFK0tFWSs1MihyOCkscjk7CVwKIAltb3ZxCXIxMCxyMTE7CQlcCiAJbW92bAkocjcpLHI1ICMjIEU7CQlcCiAJbW92bAk0KHI3KSxyMSAjIyBFOwkJXAogCW1vdmwJOChyNykscjYgIyMgRTsJCVwKIAltb3ZsCTEyKHI3KSxyNyAjIyBFOwkJXAotCW1vdmwJKHI4KSxyMTAgIyMgRTsJCVwKKwltb3ZsCUJBU0UocjgpLHIxMCAjIyBFOwlcCiAJeG9ybAktNDgocjkpLHI1ICMjIEU7CVwKIAl4b3JsCS00NChyOSkscjEgIyMgRTsJXAogCXhvcmwJLTQwKHI5KSxyNiAjIyBFOwlcCkBAIC0xMjgsOCArMTMyLDggQEAKIAltb3ZsCXIzICMjIEUscjEgIyMgRTsJXAogCW1vdmwJcjQgIyMgRSxyMiAjIyBFOwogCi0jZGVmaW5lIGVudHJ5KEZVTkMsQkFTRSxCMTI4LEIxOTIpIFwKLQlwcm9sb2d1ZShGVU5DLEJBU0UsQjEyOCxCMTkyLFIyLFI4LFI3LFI5LFIxLFIzLFI0LFI2LFIxMCxSNSxSMTEpCisjZGVmaW5lIGVudHJ5KEZVTkMsS0VZLEIxMjgsQjE5MikgXAorCXByb2xvZ3VlKEZVTkMsS0VZLEIxMjgsQjE5MixSMixSOCxSNyxSOSxSMSxSMyxSNCxSNixSMTAsUjUsUjExKQogCiAjZGVmaW5lIHJldHVybiBlcGlsb2d1ZShSOCxSMixSOSxSNyxSNSxSNixSMyxSNCxSMTEpCiAKQEAgLTE0Nyw5ICsxNTEsOSBAQAogI2RlZmluZSBkZWNyeXB0X2ZpbmFsKFRBQixPRkZTRVQpIFwKIAlyb3VuZChUQUIsT0ZGU0VULFIyLFIxLFI0LFIzLFI2LFI1LFI3LFIxMCxSNSxSNixSMyxSNCkKIAotLyogdm9pZCBhZXNfZW5jcnlwdCh2b2lkICpjdHgsIHU4ICpvdXQsIGNvbnN0IHU4ICppbikgKi8KKy8qIHZvaWQgYWVzX2VuY19ibGsoc3R1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqb3V0LCBjb25zdCB1OCAqaW4pICovCiAKLQllbnRyeShhZXNfZW5jcnlwdCwwLGVuYzEyOCxlbmMxOTIpCisJZW50cnkoYWVzX2VuY19ibGssMCxlbmMxMjgsZW5jMTkyKQogCWVuY3J5cHRfcm91bmQoYWVzX2Z0X3RhYiwtOTYpCiAJZW5jcnlwdF9yb3VuZChhZXNfZnRfdGFiLC04MCkKIGVuYzE5MjoJZW5jcnlwdF9yb3VuZChhZXNfZnRfdGFiLC02NCkKQEAgLTE2Niw5ICsxNzAsOSBAQAogCWVuY3J5cHRfZmluYWwoYWVzX2ZsX3RhYiwxMTIpCiAJcmV0dXJuCiAKLS8qIHZvaWQgYWVzX2RlY3J5cHQodm9pZCAqY3R4LCB1OCAqb3V0LCBjb25zdCB1OCAqaW4pICovCisvKiB2b2lkIGFlc19kZWNfYmxrKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpvdXQsIGNvbnN0IHU4ICppbikgKi8KIAotCWVudHJ5KGFlc19kZWNyeXB0LDI0MCxkZWMxMjgsZGVjMTkyKQorCWVudHJ5KGFlc19kZWNfYmxrLDI0MCxkZWMxMjgsZGVjMTkyKQogCWRlY3J5cHRfcm91bmQoYWVzX2l0X3RhYiwtOTYpCiAJZGVjcnlwdF9yb3VuZChhZXNfaXRfdGFiLC04MCkKIGRlYzE5MjoJZGVjcnlwdF9yb3VuZChhZXNfaXRfdGFiLC02NCkKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2NyeXB0by9hZXMuYyBiL2FyY2gveDg2XzY0L2NyeXB0by9hZXMuYwppbmRleCA2Zjc3ZTc3Li42ODg2NmZhIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9jcnlwdG8vYWVzLmMKKysrIGIvYXJjaC94ODZfNjQvY3J5cHRvL2Flcy5jCkBAIC0yMjcsMTAgKzIyNywxMCBAQAogCXQgXj0gRV9LRVlbOCAqIGkgKyA3XTsgRV9LRVlbOCAqIGkgKyAxNV0gPSB0OwlcCiB9CiAKLXN0YXRpYyBpbnQgYWVzX3NldF9rZXkodm9pZCAqY3R4X2FyZywgY29uc3QgdTggKmluX2tleSwgdW5zaWduZWQgaW50IGtleV9sZW4sCi0JCSAgICAgICB1MzIgKmZsYWdzKQorc3RhdGljIGludCBhZXNfc2V0X2tleShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCBjb25zdCB1OCAqaW5fa2V5LAorCQkgICAgICAgdW5zaWduZWQgaW50IGtleV9sZW4sIHUzMiAqZmxhZ3MpCiB7Ci0Jc3RydWN0IGFlc19jdHggKmN0eCA9IGN0eF9hcmc7CisJc3RydWN0IGFlc19jdHggKmN0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7CiAJY29uc3QgX19sZTMyICprZXkgPSAoY29uc3QgX19sZTMyICopaW5fa2V5OwogCXUzMiBpLCBqLCB0LCB1LCB2LCB3OwogCkBAIC0yODMsOCArMjgzLDE4IEBACiAJcmV0dXJuIDA7CiB9CiAKLWV4dGVybiB2b2lkIGFlc19lbmNyeXB0KHZvaWQgKmN0eF9hcmcsIHU4ICpvdXQsIGNvbnN0IHU4ICppbik7Ci1leHRlcm4gdm9pZCBhZXNfZGVjcnlwdCh2b2lkICpjdHhfYXJnLCB1OCAqb3V0LCBjb25zdCB1OCAqaW4pOworYXNtbGlua2FnZSB2b2lkIGFlc19lbmNfYmxrKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpvdXQsIGNvbnN0IHU4ICppbik7Cithc21saW5rYWdlIHZvaWQgYWVzX2RlY19ibGsoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKm91dCwgY29uc3QgdTggKmluKTsKKworc3RhdGljIHZvaWQgYWVzX2VuY3J5cHQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKmRzdCwgY29uc3QgdTggKnNyYykKK3sKKwlhZXNfZW5jX2Jsayh0Zm0sIGRzdCwgc3JjKTsKK30KKworc3RhdGljIHZvaWQgYWVzX2RlY3J5cHQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKmRzdCwgY29uc3QgdTggKnNyYykKK3sKKwlhZXNfZGVjX2Jsayh0Zm0sIGRzdCwgc3JjKTsKK30KIAogc3RhdGljIHN0cnVjdCBjcnlwdG9fYWxnIGFlc19hbGcgPSB7CiAJLmNyYV9uYW1lCQk9CSJhZXMiLApkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQvZGVmY29uZmlnIGIvYXJjaC94ODZfNjQvZGVmY29uZmlnCmluZGV4IDY5ZGIwYzAuLmU2OWQ0MDMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2RlZmNvbmZpZworKysgYi9hcmNoL3g4Nl82NC9kZWZjb25maWcKQEAgLTEsNyArMSw3IEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTctcmMxLWdpdDExCi0jIFN1biBBcHIgMTYgMDc6MjI6MzYgMjAwNgorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjE3LWdpdDYKKyMgU2F0IEp1biAyNCAwMDo1MjoyOCAyMDA2CiAjCiBDT05GSUdfWDg2XzY0PXkKIENPTkZJR182NEJJVD15CkBAIC00Miw3ICs0Miw2IEBACiAjIENPTkZJR19SRUxBWSBpcyBub3Qgc2V0CiBDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgogQ09ORklHX1VJRDE2PXkKLUNPTkZJR19WTTg2PXkKIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRT15CiAjIENPTkZJR19FTUJFRERFRCBpcyBub3Qgc2V0CiBDT05GSUdfS0FMTFNZTVM9eQpAQCAtNTcsNyArNTYsNiBAQAogQ09ORklHX0VQT0xMPXkKIENPTkZJR19TSE1FTT15CiBDT05GSUdfU0xBQj15Ci1DT05GSUdfRE9VQkxFRkFVTFQ9eQogIyBDT05GSUdfVElOWV9TSE1FTSBpcyBub3Qgc2V0CiBDT05GSUdfQkFTRV9TTUFMTD0wCiAjIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKQEAgLTE0NCw3ICsxNDIsOCBAQAogQ09ORklHX0hPVFBMVUdfQ1BVPXkKIENPTkZJR19IUEVUX1RJTUVSPXkKIENPTkZJR19IUEVUX0VNVUxBVEVfUlRDPXkKLUNPTkZJR19HQVJUX0lPTU1VPXkKK0NPTkZJR19JT01NVT15CisjIENPTkZJR19DQUxHQVJZX0lPTU1VIGlzIG5vdCBzZXQKIENPTkZJR19TV0lPVExCPXkKIENPTkZJR19YODZfTUNFPXkKIENPTkZJR19YODZfTUNFX0lOVEVMPXkKQEAgLTE1OCw2ICsxNTcsNyBAQAogIyBDT05GSUdfSFpfMTAwMCBpcyBub3Qgc2V0CiBDT05GSUdfSFo9MjUwCiAjIENPTkZJR19SRU9SREVSIGlzIG5vdCBzZXQKK0NPTkZJR19LOF9OQj15CiBDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CiBDT05GSUdfR0VORVJJQ19JUlFfUFJPQkU9eQogQ09ORklHX0lTQV9ETUFfQVBJPXkKQEAgLTI5Myw2ICsyOTMsOCBAQAogIyBDT05GSUdfSU5FVF9JUENPTVAgaXMgbm90IHNldAogIyBDT05GSUdfSU5FVF9YRlJNX1RVTk5FTCBpcyBub3Qgc2V0CiAjIENPTkZJR19JTkVUX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1hGUk1fTU9ERV9UUkFOU1BPUlQgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9YRlJNX01PREVfVFVOTkVMIGlzIG5vdCBzZXQKIENPTkZJR19JTkVUX0RJQUc9eQogQ09ORklHX0lORVRfVENQX0RJQUc9eQogIyBDT05GSUdfVENQX0NPTkdfQURWQU5DRUQgaXMgbm90IHNldApAQCAtMzA1LDcgKzMwNywxMCBAQAogIyBDT05GSUdfSU5FVDZfSVBDT01QIGlzIG5vdCBzZXQKICMgQ09ORklHX0lORVQ2X1hGUk1fVFVOTkVMIGlzIG5vdCBzZXQKICMgQ09ORklHX0lORVQ2X1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUNl9YRlJNX01PREVfVFJBTlNQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVQ2X1hGUk1fTU9ERV9UVU5ORUwgaXMgbm90IHNldAogIyBDT05GSUdfSVBWNl9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUV09SS19TRUNNQVJLIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CiAKICMKQEAgLTM0NCw2ICszNDksNyBAQAogIyBOZXR3b3JrIHRlc3RpbmcKICMKICMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1RDUFBST0JFIGlzIG5vdCBzZXQKICMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKICMgQ09ORklHX0lSREEgaXMgbm90IHNldAogIyBDT05GSUdfQlQgaXMgbm90IHNldApAQCAtMzYwLDYgKzM2Niw3IEBACiBDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15CiBDT05GSUdfRldfTE9BREVSPXkKICMgQ09ORklHX0RFQlVHX0RSSVZFUiBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNfSFlQRVJWSVNPUiBpcyBub3Qgc2V0CiAKICMKICMgQ29ubmVjdG9yIC0gdW5pZmllZCB1c2Vyc3BhY2UgPC0+IGtlcm5lbHNwYWNlIGxpbmtlcgpAQCAtNTI2LDYgKzUzMyw3IEBACiAjIENPTkZJR19TQ1NJX1NBVEFfTVYgaXMgbm90IHNldAogQ09ORklHX1NDU0lfU0FUQV9OVj15CiAjIENPTkZJR19TQ1NJX1BEQ19BRE1BIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSFBUSU9QIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfU0FUQV9RU1RPUiBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX1NBVEFfUFJPTUlTRSBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX1NBVEFfU1g0IGlzIG5vdCBzZXQKQEAgLTU5MSwxMCArNTk5LDcgQEAKICMKICMgRGV2aWNlIERyaXZlcnMKICMKLQotIwotIyBUZXhhcyBJbnN0cnVtZW50cyBQQ0lMeW54IHJlcXVpcmVzIEkyQwotIworIyBDT05GSUdfSUVFRTEzOTRfUENJTFlOWCBpcyBub3Qgc2V0CiBDT05GSUdfSUVFRTEzOTRfT0hDSTEzOTQ9eQogCiAjCkBAIC02NDUsNyArNjUwLDE2IEBACiAjCiAjIFR1bGlwIGZhbWlseSBuZXR3b3JrIGRldmljZSBzdXBwb3J0CiAjCi0jIENPTkZJR19ORVRfVFVMSVAgaXMgbm90IHNldAorQ09ORklHX05FVF9UVUxJUD15CisjIENPTkZJR19ERTIxMDRYIGlzIG5vdCBzZXQKK0NPTkZJR19UVUxJUD15CisjIENPTkZJR19UVUxJUF9NV0kgaXMgbm90IHNldAorIyBDT05GSUdfVFVMSVBfTU1JTyBpcyBub3Qgc2V0CisjIENPTkZJR19UVUxJUF9OQVBJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFNFg1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1dJTkJPTkRfODQwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RNOTEwMiBpcyBub3Qgc2V0CisjIENPTkZJR19VTEk1MjZYIGlzIG5vdCBzZXQKICMgQ09ORklHX0hQMTAwIGlzIG5vdCBzZXQKIENPTkZJR19ORVRfUENJPXkKICMgQ09ORklHX1BDTkVUMzIgaXMgbm90IHNldApAQCAtNjk3LDYgKzcxMSw3IEBACiAjIENPTkZJR19JWEdCIGlzIG5vdCBzZXQKIENPTkZJR19TMklPPW0KICMgQ09ORklHX1MySU9fTkFQSSBpcyBub3Qgc2V0CisjIENPTkZJR19NWVJJMTBHRSBpcyBub3Qgc2V0CiAKICMKICMgVG9rZW4gUmluZyBkZXZpY2VzCkBAIC04ODcsNyArOTAyLDU2IEBACiAjCiAjIEkyQyBzdXBwb3J0CiAjCi0jIENPTkZJR19JMkMgaXMgbm90IHNldAorQ09ORklHX0kyQz1tCitDT05GSUdfSTJDX0NIQVJERVY9bQorCisjCisjIEkyQyBBbGdvcml0aG1zCisjCisjIENPTkZJR19JMkNfQUxHT0JJVCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQUxHT1BDRiBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQUxHT1BDQSBpcyBub3Qgc2V0CisKKyMKKyMgSTJDIEhhcmR3YXJlIEJ1cyBzdXBwb3J0CisjCisjIENPTkZJR19JMkNfQUxJMTUzNSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQUxJMTU2MyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQUxJMTVYMyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQU1ENzU2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTUQ4MTExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19JODAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19JODEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19QSUlYNCBpcyBub3Qgc2V0CitDT05GSUdfSTJDX0lTQT1tCisjIENPTkZJR19JMkNfTkZPUkNFMiBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfT0NPUkVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19QQVJQT1JUX0xJR0hUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19QUk9TQVZBR0UgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NBVkFHRTQgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NJUzU1OTUgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NJUzYzMCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU0lTOTZYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TVFVCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19WSUEgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1ZJQVBSTyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfVk9PRE9PMyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfUENBX0lTQSBpcyBub3Qgc2V0CisKKyMKKyMgTWlzY2VsbGFuZW91cyBJMkMgQ2hpcCBzdXBwb3J0CisjCisjIENPTkZJR19TRU5TT1JTX0RTMTMzNyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0RTMTM3NCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0VFUFJPTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDRjg1NzQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0E5NTM5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUENGODU5MSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX01BWDY4NzUgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0FMR08gaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0JVUyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQ0hJUCBpcyBub3Qgc2V0CiAKICMKICMgU1BJIHN1cHBvcnQKQEAgLTg5OCwxNCArOTYyLDUxIEBACiAjCiAjIERhbGxhcydzIDEtd2lyZSBidXMKICMKLSMgQ09ORklHX1cxIGlzIG5vdCBzZXQKIAogIwogIyBIYXJkd2FyZSBNb25pdG9yaW5nIHN1cHBvcnQKICMKIENPTkZJR19IV01PTj15CiAjIENPTkZJR19IV01PTl9WSUQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BQklUVUdVUlUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDIxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAyNSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTEwMjYgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDMxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNOTI0MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FTQjEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FUWFAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRFMxNjIxIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfRjcxODA1RiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0ZTQ0hFUiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0ZTQ1BPUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0dMNTE4U00gaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19HTDUyMFNNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfSVQ4NyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNNjMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTc1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE03NyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNNzggaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE04MyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNODUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTg3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE05MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNOTIgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19NQVgxNjE5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUEM4NzM2MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1NJUzU1OTUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19TTVNDNDdNMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1NNU0M0N00xOTIgaXMgbm90IHNldAorQ09ORklHX1NFTlNPUlNfU01TQzQ3QjM5Nz1tCisjIENPTkZJR19TRU5TT1JTX1ZJQTY4NkEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19WVDgyMzEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM3ODFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNzkxRCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4Mzc5MkQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODNMNzg1VFMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM2MjdIRiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4MzYyN0VIRiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0hEQVBTIGlzIG5vdCBzZXQKICMgQ09ORklHX0hXTU9OX0RFQlVHX0NISVAgaXMgbm90IHNldAogCkBAIC05MTgsNiArMTAxOSw3IEBACiAjIE11bHRpbWVkaWEgZGV2aWNlcwogIwogIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKK0NPTkZJR19WSURFT19WNEwyPXkKIAogIwogIyBEaWdpdGFsIFZpZGVvIEJyb2FkY2FzdGluZyBEZXZpY2VzCkBAIC05NTMsMjggKzEwNTUsMTcgQEAKICMgT3BlbiBTb3VuZCBTeXN0ZW0KICMKIENPTkZJR19TT1VORF9QUklNRT15Ci1DT05GSUdfT0JTT0xFVEVfT1NTX0RSSVZFUj15CiAjIENPTkZJR19TT1VORF9CVDg3OCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TT1VORF9DTVBDSSBpcyBub3Qgc2V0CiAjIENPTkZJR19TT1VORF9FTVUxMEsxIGlzIG5vdCBzZXQKICMgQ09ORklHX1NPVU5EX0ZVU0lPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TT1VORF9DUzQyODEgaXMgbm90IHNldAotIyBDT05GSUdfU09VTkRfRVMxMzcwIGlzIG5vdCBzZXQKICMgQ09ORklHX1NPVU5EX0VTMTM3MSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TT1VORF9FU1NTT0xPMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TT1VORF9NQUVTVFJPIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NPVU5EX01BRVNUUk8zIGlzIG5vdCBzZXQKIENPTkZJR19TT1VORF9JQ0g9eQotIyBDT05GSUdfU09VTkRfU09OSUNWSUJFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TT1VORF9UUklERU5UIGlzIG5vdCBzZXQKICMgQ09ORklHX1NPVU5EX01TTkRDTEFTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NPVU5EX01TTkRQSU4gaXMgbm90IHNldAogIyBDT05GSUdfU09VTkRfVklBODJDWFhYIGlzIG5vdCBzZXQKICMgQ09ORklHX1NPVU5EX09TUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TT1VORF9BTEk1NDU1IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NPVU5EX0ZPUlRFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NPVU5EX1JNRTk2WFggaXMgbm90IHNldAotIyBDT05GSUdfU09VTkRfQUQxOTgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPVU5EX1RWTUlYRVIgaXMgbm90IHNldAogCiAjCiAjIFVTQiBzdXBwb3J0CkBAIC0xMDAwLDYgKzEwOTEsNyBAQAogQ09ORklHX1VTQl9FSENJX0hDRD15CiAjIENPTkZJR19VU0JfRUhDSV9TUExJVF9JU08gaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0VIQ0lfUk9PVF9IVUJfVFQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0VIQ0lfVFRfTkVXU0NIRUQgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0lTUDExNlhfSENEIGlzIG5vdCBzZXQKIENPTkZJR19VU0JfT0hDSV9IQ0Q9eQogIyBDT05GSUdfVVNCX09IQ0lfQklHX0VORElBTiBpcyBub3Qgc2V0CkBAIC0xMDg5LDEwICsxMTgxLDEyIEBACiAjIENPTkZJR19VU0JfTEVHT1RPV0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9MQ0QgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0xFRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQ1k3QzYzIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9DWVRIRVJNIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9QSElER0VUS0lUIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9QSElER0VUU0VSVk8gaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0lETU9VU0UgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FQUExFRElTUExBWSBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfU0lTVVNCVkdBIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9MRCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfVEVTVCBpcyBub3Qgc2V0CkBAIC0xMTQxLDYgKzEyMzUsMTkgQEAKICMgQ09ORklHX1JUQ19DTEFTUyBpcyBub3Qgc2V0CiAKICMKKyMgRE1BIEVuZ2luZSBzdXBwb3J0CisjCisjIENPTkZJR19ETUFfRU5HSU5FIGlzIG5vdCBzZXQKKworIworIyBETUEgQ2xpZW50cworIworCisjCisjIERNQSBEZXZpY2VzCisjCisKKyMKICMgRmlybXdhcmUgRHJpdmVycwogIwogIyBDT05GSUdfRUREIGlzIG5vdCBzZXQKQEAgLTExNzUsNiArMTI4Miw3IEBACiAjIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CiBDT05GSUdfSU5PVElGWT15CitDT05GSUdfSU5PVElGWV9VU0VSPXkKICMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKIENPTkZJR19ETk9USUZZPXkKIENPTkZJR19BVVRPRlNfRlM9eQpAQCAtMTMzMSw3ICsxNDM5LDggQEAKIENPTkZJR19ERUJVR19GUz15CiAjIENPTkZJR19ERUJVR19WTSBpcyBub3Qgc2V0CiAjIENPTkZJR19GUkFNRV9QT0lOVEVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VOV0lORF9JTkZPIGlzIG5vdCBzZXQKK0NPTkZJR19VTldJTkRfSU5GTz15CitDT05GSUdfU1RBQ0tfVU5XSU5EPXkKICMgQ09ORklHX0ZPUkNFRF9JTkxJTklORyBpcyBub3Qgc2V0CiAjIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX1JPREFUQSBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9pYTMyL2ZwdTMyLmMgYi9hcmNoL3g4Nl82NC9pYTMyL2ZwdTMyLmMKaW5kZXggMWMyMzA5NS4uMmM4MjA5YSAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQvaWEzMi9mcHUzMi5jCisrKyBiL2FyY2gveDg2XzY0L2lhMzIvZnB1MzIuYwpAQCAtMiw3ICsyLDYgQEAKICAqIENvcHlyaWdodCAyMDAyIEFuZGkgS2xlZW4sIFN1U0UgTGFicy4KICAqIEZYU0FWRTwtPmkzODcgY29udmVyc2lvbiBzdXBwb3J0LiBCYXNlZCBvbiBjb2RlIGJ5IEdhcmV0aCBIdWdoZXMuCiAgKiBUaGlzIGlzIHVzZWQgZm9yIHB0cmFjZSwgc2lnbmFscyBhbmQgY29yZWR1bXBzIGluIDMyYml0IGVtdWxhdGlvbi4KLSAqICRJZDogZnB1MzIuYyx2IDEuMSAyMDAyLzAzLzIxIDE0OjE2OjMyIGFrIEV4cCAkCiAgKi8gCiAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQvaWEzMi9pYTMyX3NpZ25hbC5jIGIvYXJjaC94ODZfNjQvaWEzMi9pYTMyX3NpZ25hbC5jCmluZGV4IGUwYTkyNDMuLjI1ZTVjYTIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2lhMzIvaWEzMl9zaWduYWwuYworKysgYi9hcmNoL3g4Nl82NC9pYTMyL2lhMzJfc2lnbmFsLmMKQEAgLTYsOCArNiw2IEBACiAgKiAgMTk5Ny0xMS0yOCAgTW9kaWZpZWQgZm9yIFBPU0lYLjFiIHNpZ25hbHMgYnkgUmljaGFyZCBIZW5kZXJzb24KICAqICAyMDAwLTA2LTIwICBQZW50aXVtIElJSSBGWFNSLCBTU0Ugc3VwcG9ydCBieSBHYXJldGggSHVnaGVzCiAgKiAgMjAwMC0xMi0qICAgeDg2LTY0IGNvbXBhdGliaWxpdHkgbW9kZSBzaWduYWwgaGFuZGxpbmcgYnkgQW5kaSBLbGVlbgotICogCi0gKiAgJElkOiBpYTMyX3NpZ25hbC5jLHYgMS4yMiAyMDAyLzA3LzI5IDEwOjM0OjAzIGFrIEV4cCAkCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9pYTMyL2lhMzJlbnRyeS5TIGIvYXJjaC94ODZfNjQvaWEzMi9pYTMyZW50cnkuUwppbmRleCA0ZWM1OTRhLi5jNTM2ZmE5IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9pYTMyL2lhMzJlbnRyeS5TCisrKyBiL2FyY2gveDg2XzY0L2lhMzIvaWEzMmVudHJ5LlMKQEAgLTE1NSw2ICsxNTUsNyBAQAogCS5wcmV2aW91cwogCWptcAlzeXNlbnRlcl9kb19jYWxsCiAJQ0ZJX0VORFBST0MKK0VORFBST0MoaWEzMl9zeXNlbnRlcl90YXJnZXQpCiAKIC8qCiAgKiAzMmJpdCBTWVNDQUxMIGluc3RydWN0aW9uIGVudHJ5LgpAQCAtMTc4LDcgKzE3OSw3IEBACiAgKi8gCQogRU5UUlkoaWEzMl9jc3Rhcl90YXJnZXQpCiAJQ0ZJX1NUQVJUUFJPQzMyCXNpbXBsZQotCUNGSV9ERUZfQ0ZBCXJzcCwwCisJQ0ZJX0RFRl9DRkEJcnNwLFBEQV9TVEFDS09GRlNFVAogCUNGSV9SRUdJU1RFUglyaXAscmN4CiAJLypDRklfUkVHSVNURVIJcmZsYWdzLHIxMSovCiAJc3dhcGdzCkBAIC0yNDksNiArMjUwLDcgQEAKIAkucXVhZCAxYixpYTMyX2JhZGFyZwogCS5wcmV2aW91cwogCWptcCBjc3Rhcl9kb19jYWxsCitFTkQoaWEzMl9jc3Rhcl90YXJnZXQpCiAJCQkJCiBpYTMyX2JhZGFyZzoKIAltb3ZxICQtRUZBVUxULCVyYXgKQEAgLTMxNCwxNiArMzE2LDEzIEBACiAJTE9BRF9BUkdTIEFSR09GRlNFVCAgLyogcmVsb2FkIGFyZ3MgZnJvbSBzdGFjayBpbiBjYXNlIHB0cmFjZSBjaGFuZ2VkIGl0ICovCiAJUkVTVE9SRV9SRVNUCiAJam1wIGlhMzJfZG9fc3lzY2FsbAorRU5EKGlhMzJfc3lzY2FsbCkKIAogaWEzMl9iYWRzeXM6CiAJbW92cSAkMCxPUklHX1JBWC1BUkdPRkZTRVQoJXJzcCkKIAltb3ZxICQtRU5PU1lTLFJBWC1BUkdPRkZTRVQoJXJzcCkKIAlqbXAgaW50X3JldF9mcm9tX3N5c19jYWxsCiAKLW5pX3N5c2NhbGw6Ci0JbW92cSAlcmF4LCVyZGkKLQlqbXAgIHN5czMyX25pX3N5c2NhbGwJCQkKLQogcXVpZXRfbmlfc3lzY2FsbDoKIAltb3ZxICQtRU5PU1lTLCVyYXgKIAlyZXQKQEAgLTM3MCwxMCArMzY5LDEwIEBACiAJUkVTVE9SRV9SRVNUCiAJam1wICBpYTMyX3N5c3JldAkvKiBtaXNiYWxhbmNlcyB0aGUgcmV0dXJuIGNhY2hlICovCiAJQ0ZJX0VORFBST0MKK0VORChpYTMyX3B0cmVnc19jb21tb24pCiAKIAkuc2VjdGlvbiAucm9kYXRhLCJhIgogCS5hbGlnbiA4Ci0JLmdsb2JsIGlhMzJfc3lzX2NhbGxfdGFibGUKIGlhMzJfc3lzX2NhbGxfdGFibGU6CiAJLnF1YWQgc3lzX3Jlc3RhcnRfc3lzY2FsbAogCS5xdWFkIHN5c19leGl0CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9pYTMyL3B0cmFjZTMyLmMgYi9hcmNoL3g4Nl82NC9pYTMyL3B0cmFjZTMyLmMKaW5kZXggMjNhNDUxNS4uYTU5MGI3YSAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQvaWEzMi9wdHJhY2UzMi5jCisrKyBiL2FyY2gveDg2XzY0L2lhMzIvcHRyYWNlMzIuYwpAQCAtNyw4ICs3LDYgQEAKICAqIAogICogVGhpcyBhbGxvd3MgdG8gYWNjZXNzIDY0Yml0IHByb2Nlc3NlcyB0b287IGJ1dCB0aGVyZSBpcyBubyB3YXkgdG8gc2VlIHRoZSBleHRlbmRlZCAKICAqIHJlZ2lzdGVyIGNvbnRlbnRzLgotICoKLSAqICRJZDogcHRyYWNlMzIuYyx2IDEuMTYgMjAwMy8wMy8xNCAxNjowNjozNSBhayBFeHAgJAogICovIAogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CkBAIC0yNyw2ICsyNSw3IEBACiAjaW5jbHVkZSA8YXNtL2RlYnVncmVnLmg+CiAjaW5jbHVkZSA8YXNtL2kzODcuaD4KICNpbmNsdWRlIDxhc20vZnB1MzIuaD4KKyNpbmNsdWRlIDxhc20vaWEzMi5oPgogCiAvKgogICogRGV0ZXJtaW5lcyB3aGljaCBmbGFncyB0aGUgdXNlciBoYXMgYWNjZXNzIHRvIFsxID0gYWNjZXNzLCAwID0gbm8gYWNjZXNzXS4KQEAgLTE5OSw2ICsxOTgsMjQgQEAKIAogI3VuZGVmIFIzMgogCitzdGF0aWMgbG9uZyBwdHJhY2UzMl9zaWdpbmZvKHVuc2lnbmVkIHJlcXVlc3QsIHUzMiBwaWQsIHUzMiBhZGRyLCB1MzIgZGF0YSkKK3sKKwlpbnQgcmV0OworCWNvbXBhdF9zaWdpbmZvX3QgKnNpMzIgPSAoY29tcGF0X3NpZ2luZm9fdCAqKWNvbXBhdF9wdHIoZGF0YSk7CisJc2lnaW5mb190ICpzaSA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZihzaWdpbmZvX3QpKTsKKwlpZiAocmVxdWVzdCA9PSBQVFJBQ0VfU0VUU0lHSU5GTykgeworCQlyZXQgPSBjb3B5X3NpZ2luZm9fZnJvbV91c2VyMzIoc2ksIHNpMzIpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisJcmV0ID0gc3lzX3B0cmFjZShyZXF1ZXN0LCBwaWQsIGFkZHIsICh1bnNpZ25lZCBsb25nKXNpKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCWlmIChyZXF1ZXN0ID09IFBUUkFDRV9HRVRTSUdJTkZPKQorCQlyZXQgPSBjb3B5X3NpZ2luZm9fdG9fdXNlcjMyKHNpMzIsIHNpKTsKKwlyZXR1cm4gcmV0OworfQorCiBhc21saW5rYWdlIGxvbmcgc3lzMzJfcHRyYWNlKGxvbmcgcmVxdWVzdCwgdTMyIHBpZCwgdTMyIGFkZHIsIHUzMiBkYXRhKQogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQ7CkBAIC0yMDgsOSArMjI1LDE5IEBACiAJX191MzIgdmFsOwogCiAJc3dpdGNoIChyZXF1ZXN0KSB7IAotCWRlZmF1bHQ6CisJY2FzZSBQVFJBQ0VfVFJBQ0VNRToKKwljYXNlIFBUUkFDRV9BVFRBQ0g6CisJY2FzZSBQVFJBQ0VfS0lMTDoKKwljYXNlIFBUUkFDRV9DT05UOgorCWNhc2UgUFRSQUNFX1NJTkdMRVNURVA6CisJY2FzZSBQVFJBQ0VfREVUQUNIOgorCWNhc2UgUFRSQUNFX1NZU0NBTEw6CisJY2FzZSBQVFJBQ0VfU0VUT1BUSU9OUzoKIAkJcmV0dXJuIHN5c19wdHJhY2UocmVxdWVzdCwgcGlkLCBhZGRyLCBkYXRhKTsgCiAKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwogCWNhc2UgUFRSQUNFX1BFRUtURVhUOgogCWNhc2UgUFRSQUNFX1BFRUtEQVRBOgogCWNhc2UgUFRSQUNFX1BPS0VEQVRBOgpAQCAtMjI1LDEwICsyNTIsMTEgQEAKIAljYXNlIFBUUkFDRV9HRVRGUFhSRUdTOgogCWNhc2UgUFRSQUNFX0dFVEVWRU5UTVNHOgogCQlicmVhazsKLQl9IAogCi0JaWYgKHJlcXVlc3QgPT0gUFRSQUNFX1RSQUNFTUUpCi0JCXJldHVybiBwdHJhY2VfdHJhY2VtZSgpOworCWNhc2UgUFRSQUNFX1NFVFNJR0lORk86CisJY2FzZSBQVFJBQ0VfR0VUU0lHSU5GTzoKKwkJcmV0dXJuIHB0cmFjZTMyX3NpZ2luZm8ocmVxdWVzdCwgcGlkLCBhZGRyLCBkYXRhKTsKKwl9CiAKIAljaGlsZCA9IHB0cmFjZV9nZXRfdGFza19zdHJ1Y3QocGlkKTsKIAlpZiAoSVNfRVJSKGNoaWxkKSkKQEAgLTM0OSw4ICszNzcsNyBAQAogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWJyZWFrOworCQlCVUcoKTsKIAl9CiAKICBvdXQ6CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9pYTMyL3N5c19pYTMyLmMgYi9hcmNoL3g4Nl82NC9pYTMyL3N5c19pYTMyLmMKaW5kZXggZjE4MmIyMC4uZGM4ODE1NCAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQvaWEzMi9zeXNfaWEzMi5jCisrKyBiL2FyY2gveDg2XzY0L2lhMzIvc3lzX2lhMzIuYwpAQCAtNTA4LDE5ICs1MDgsNiBAQAogCXJldHVybiBjb21wYXRfc3lzX3dhaXQ0KHBpZCwgc3RhdF9hZGRyLCBvcHRpb25zLCBOVUxMKTsKIH0KIAotaW50IHN5czMyX25pX3N5c2NhbGwoaW50IGNhbGwpCi17IAotCXN0cnVjdCB0YXNrX3N0cnVjdCAqbWUgPSBjdXJyZW50OwotCXN0YXRpYyBjaGFyIGxhc3Rjb21tW3NpemVvZihtZS0+Y29tbSldOwotCi0JaWYgKHN0cm5jbXAobGFzdGNvbW0sIG1lLT5jb21tLCBzaXplb2YobGFzdGNvbW0pKSkgewotCQlwcmludGsoS0VSTl9JTkZPICJJQTMyIHN5c2NhbGwgJWQgZnJvbSAlcyBub3QgaW1wbGVtZW50ZWRcbiIsCi0JCSAgICAgICBjYWxsLCBtZS0+Y29tbSk7Ci0JCXN0cm5jcHkobGFzdGNvbW0sIG1lLT5jb21tLCBzaXplb2YobGFzdGNvbW0pKTsKLQl9IAotCXJldHVybiAtRU5PU1lTOwkgICAgICAgCi19IAotCiAvKiAzMi1iaXQgdGltZXZhbCBhbmQgcmVsYXRlZCBmbG90c2FtLiAgKi8KIAogYXNtbGlua2FnZSBsb25nCkBAIC05MTYsNyArOTAzLDcgQEAKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKm1lID0gY3VycmVudDsKIAlzdGF0aWMgY2hhciBsYXN0Y29tbVtzaXplb2YobWUtPmNvbW0pXTsKIAlpZiAoc3RybmNtcChsYXN0Y29tbSwgbWUtPmNvbW0sIHNpemVvZihsYXN0Y29tbSkpKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIiVzOiB2bTg2IG1vZGUgbm90IHN1cHBvcnRlZCBvbiA2NCBiaXQga2VybmVsXG4iLAorCQljb21wYXRfcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHZtODYgbW9kZSBub3Qgc3VwcG9ydGVkIG9uIDY0IGJpdCBrZXJuZWxcbiIsCiAJCSAgICAgICBtZS0+Y29tbSk7CiAJCXN0cm5jcHkobGFzdGNvbW0sIG1lLT5jb21tLCBzaXplb2YobGFzdGNvbW0pKTsKIAl9IApAQCAtOTI5LDEzICs5MTYsMyBAQAogCXJldHVybiBzeXNfbG9va3VwX2Rjb29raWUoKCh1NjQpYWRkcl9oaWdoIDw8IDMyKSB8IGFkZHJfbG93LCBidWYsIGxlbik7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IGlhMzJfaW5pdCAodm9pZCkKLXsKLQlwcmludGsoIklBMzIgZW11bGF0aW9uICRJZDogc3lzX2lhMzIuYyx2IDEuMzIgMjAwMi8wMy8yNCAxMzowMjoyOCBhayBFeHAgJFxuIik7ICAKLQlyZXR1cm4gMDsKLX0KLQotX19pbml0Y2FsbChpYTMyX2luaXQpOwotCi1leHRlcm4gdW5zaWduZWQgbG9uZyBpYTMyX3N5c19jYWxsX3RhYmxlW107Ci1FWFBPUlRfU1lNQk9MKGlhMzJfc3lzX2NhbGxfdGFibGUpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL01ha2VmaWxlIGIvYXJjaC94ODZfNjQva2VybmVsL01ha2VmaWxlCmluZGV4IDA1OWM4ODMuLmFlYjljNTYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9NYWtlZmlsZQorKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvTWFrZWZpbGUKQEAgLTgsNyArOCw3IEBACiAJCXB0cmFjZS5vIHRpbWUubyBpb3BvcnQubyBsZHQubyBzZXR1cC5vIGk4MjU5Lm8gc3lzX3g4Nl82NC5vIFwKIAkJeDg2NjRfa3N5bXMubyBpMzg3Lm8gc3lzY2FsbC5vIHZzeXNjYWxsLm8gXAogCQlzZXR1cDY0Lm8gYm9vdGZsYWcubyBlODIwLm8gcmVib290Lm8gcXVpcmtzLm8gaTgyMzcubyBcCi0JCXBjaS1kbWEubyBwY2ktbm9tbXUubworCQlwY2ktZG1hLm8gcGNpLW5vbW11Lm8gYWx0ZXJuYXRpdmUubwogCiBvYmotJChDT05GSUdfWDg2X01DRSkgICAgICAgICArPSBtY2Uubwogb2JqLSQoQ09ORklHX1g4Nl9NQ0VfSU5URUwpCSs9IG1jZV9pbnRlbC5vCkBAIC0yOCwxMSArMjgsMTMgQEAKIG9iai0kKENPTkZJR19TT0ZUV0FSRV9TVVNQRU5EKQkrPSBzdXNwZW5kX2FzbS5vCiBvYmotJChDT05GSUdfQ1BVX0ZSRVEpCQkrPSBjcHVmcmVxLwogb2JqLSQoQ09ORklHX0VBUkxZX1BSSU5USykJKz0gZWFybHlfcHJpbnRrLm8KLW9iai0kKENPTkZJR19HQVJUX0lPTU1VKQkrPSBwY2ktZ2FydC5vIGFwZXJ0dXJlLm8KK29iai0kKENPTkZJR19JT01NVSkJCSs9IHBjaS1nYXJ0Lm8gYXBlcnR1cmUubworb2JqLSQoQ09ORklHX0NBTEdBUllfSU9NTVUpCSs9IHBjaS1jYWxnYXJ5Lm8gdGNlLm8KIG9iai0kKENPTkZJR19TV0lPVExCKQkJKz0gcGNpLXN3aW90bGIubwogb2JqLSQoQ09ORklHX0tQUk9CRVMpCQkrPSBrcHJvYmVzLm8KIG9iai0kKENPTkZJR19YODZfUE1fVElNRVIpCSs9IHBtdGltZXIubwogb2JqLSQoQ09ORklHX1g4Nl9WU01QKQkJKz0gdnNtcC5vCitvYmotJChDT05GSUdfSzhfTkIpCQkrPSBrOC5vCiAKIG9iai0kKENPTkZJR19NT0RVTEVTKQkJKz0gbW9kdWxlLm8KIApAQCAtNDksMyArNTEsNSBAQAogcXVpcmtzLXkJCQkrPSAuLi8uLi9pMzg2L2tlcm5lbC9xdWlya3MubwogaTgyMzcteQkJCQkrPSAuLi8uLi9pMzg2L2tlcm5lbC9pODIzNy5vCiBtc3ItJChzdWJzdCBtLHksJChDT05GSUdfWDg2X01TUikpICArPSAuLi8uLi9pMzg2L2tlcm5lbC9tc3IubworYWx0ZXJuYXRpdmUteQkJCSs9IC4uLy4uL2kzODYva2VybmVsL2FsdGVybmF0aXZlLm8KKwpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL2FwZXJ0dXJlLmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvYXBlcnR1cmUuYwppbmRleCA3MGI5ZDIxLi5hMTk1ZWYwIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvYXBlcnR1cmUuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvYXBlcnR1cmUuYwpAQCAtOCw3ICs4LDYgQEAKICAqIGJlY2F1c2Ugb25seSB0aGUgYm9vdG1lbSBhbGxvY2F0b3IgY2FuIGFsbG9jYXRlIDMyK01CLiAKICAqIAogICogQ29weXJpZ2h0IDIwMDIgQW5kaSBLbGVlbiwgU3VTRSBMYWJzLgotICogJElkOiBhcGVydHVyZS5jLHYgMS43IDIwMDMvMDgvMDEgMDM6MzY6MTggYWsgRXhwICQKICAqLwogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpAQCAtMjQsNiArMjMsNyBAQAogI2luY2x1ZGUgPGFzbS9wcm90by5oPgogI2luY2x1ZGUgPGFzbS9wY2ktZGlyZWN0Lmg+CiAjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9rOC5oPgogCiBpbnQgaW9tbXVfYXBlcnR1cmU7CiBpbnQgaW9tbXVfYXBlcnR1cmVfZGlzYWJsZWQgX19pbml0ZGF0YSA9IDA7CkBAIC0zNyw4ICszNyw2IEBACiAvKiBUaGlzIGNvZGUgcnVucyBiZWZvcmUgdGhlIFBDSSBzdWJzeXN0ZW0gaXMgaW5pdGlhbGl6ZWQsIHNvIGp1c3QKICAgIGFjY2VzcyB0aGUgbm9ydGhicmlkZ2UgZGlyZWN0bHkuICovCiAKLSNkZWZpbmUgTkJfSURfMyAoUENJX1ZFTkRPUl9JRF9BTUQgfCAoMHgxMTAzPDwxNikpCi0KIHN0YXRpYyB1MzIgX19pbml0IGFsbG9jYXRlX2FwZXJ0dXJlKHZvaWQpIAogewogCXBnX2RhdGFfdCAqbmQwID0gTk9ERV9EQVRBKDApOwpAQCAtNjgsMjAgKzY2LDIwIEBACiAJcmV0dXJuICh1MzIpX19wYShwKTsgCiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IGFwZXJ0dXJlX3ZhbGlkKGNoYXIgKm5hbWUsIHU2NCBhcGVyX2Jhc2UsIHUzMiBhcGVyX3NpemUpIAorc3RhdGljIGludCBfX2luaXQgYXBlcnR1cmVfdmFsaWQodTY0IGFwZXJfYmFzZSwgdTMyIGFwZXJfc2l6ZSkKIHsgCiAJaWYgKCFhcGVyX2Jhc2UpIAogCQlyZXR1cm4gMDsKIAlpZiAoYXBlcl9zaXplIDwgNjQqMTAyNCoxMDI0KSB7IAotCQlwcmludGsoIkFwZXJ0dXJlIGZyb20gJXMgdG9vIHNtYWxsICglZCBNQilcbiIsIG5hbWUsIGFwZXJfc2l6ZT4+MjApOyAKKwkJcHJpbnRrKCJBcGVydHVyZSB0b28gc21hbGwgKCVkIE1CKVxuIiwgYXBlcl9zaXplPj4yMCk7CiAJCXJldHVybiAwOwogCX0KIAlpZiAoYXBlcl9iYXNlICsgYXBlcl9zaXplID49IDB4ZmZmZmZmZmYpIHsgCi0JCXByaW50aygiQXBlcnR1cmUgZnJvbSAlcyBiZXlvbmQgNEdCLiBJZ25vcmluZy5cbiIsbmFtZSk7CisJCXByaW50aygiQXBlcnR1cmUgYmV5b25kIDRHQi4gSWdub3JpbmcuXG4iKTsKIAkJcmV0dXJuIDA7IAogCX0KIAlpZiAoZTgyMF9hbnlfbWFwcGVkKGFwZXJfYmFzZSwgYXBlcl9iYXNlICsgYXBlcl9zaXplLCBFODIwX1JBTSkpIHsKLQkJcHJpbnRrKCJBcGVydHVyZSBmcm9tICVzIHBvaW50aW5nIHRvIGU4MjAgUkFNLiBJZ25vcmluZy5cbiIsbmFtZSk7CisJCXByaW50aygiQXBlcnR1cmUgcG9pbnRpbmcgdG8gZTgyMCBSQU0uIElnbm9yaW5nLlxuIik7CiAJCXJldHVybiAwOyAKIAl9IAogCXJldHVybiAxOwpAQCAtMTQwLDcgKzEzOCw3IEBACiAJcHJpbnRrKCJBcGVydHVyZSBmcm9tIEFHUCBAICVMeCBzaXplICV1IE1CIChBUFNJWkUgJXgpXG4iLCAKIAkgICAgICAgYXBlciwgMzIgPDwgKm9yZGVyLCBhcHNpemVyZWcpOwogCi0JaWYgKCFhcGVydHVyZV92YWxpZCgiQUdQIGJyaWRnZSIsIGFwZXIsICgzMioxMDI0KjEwMjQpIDw8ICpvcmRlcikpCisJaWYgKCFhcGVydHVyZV92YWxpZChhcGVyLCAoMzIqMTAyNCoxMDI0KSA8PCAqb3JkZXIpKQogCSAgICByZXR1cm4gMDsKIAlyZXR1cm4gKHUzMilhcGVyOyAKIH0gCkBAIC0yMDgsMTAgKzIwNiwxMCBAQAogCiAJZml4ID0gMDsKIAlmb3IgKG51bSA9IDI0OyBudW0gPCAzMjsgbnVtKyspIHsJCQotCQljaGFyIG5hbWVbMzBdOwotCQlpZiAocmVhZF9wY2lfY29uZmlnKDAsIG51bSwgMywgMHgwMCkgIT0gTkJfSURfMykgCi0JCQljb250aW51ZTsJCisJCWlmICghZWFybHlfaXNfazhfbmIocmVhZF9wY2lfY29uZmlnKDAsIG51bSwgMywgMHgwMCkpKQorCQkJY29udGludWU7CiAKKwkJaW9tbXVfZGV0ZWN0ZWQgPSAxOwogCQlpb21tdV9hcGVydHVyZSA9IDE7IAogCiAJCWFwZXJfb3JkZXIgPSAocmVhZF9wY2lfY29uZmlnKDAsIG51bSwgMywgMHg5MCkgPj4gMSkgJiA3OyAKQEAgLTIyMiw5ICsyMjAsNyBAQAogCQlwcmludGsoIkNQVSAlZDogYXBlcnR1cmUgQCAlTHggc2l6ZSAldSBNQlxuIiwgbnVtLTI0LCAKIAkJICAgICAgIGFwZXJfYmFzZSwgYXBlcl9zaXplPj4yMCk7CiAJCQotCQlzcHJpbnRmKG5hbWUsICJub3J0aGJyaWRnZSBjcHUgJWQiLCBudW0tMjQpOyAKLQotCQlpZiAoIWFwZXJ0dXJlX3ZhbGlkKG5hbWUsIGFwZXJfYmFzZSwgYXBlcl9zaXplKSkgeyAKKwkJaWYgKCFhcGVydHVyZV92YWxpZChhcGVyX2Jhc2UsIGFwZXJfc2l6ZSkpIHsKIAkJCWZpeCA9IDE7IAogCQkJYnJlYWs7IAogCQl9CkBAIC0yNzMsNyArMjY5LDcgQEAKIAogCS8qIEZpeCB1cCB0aGUgbm9ydGggYnJpZGdlcyAqLwogCWZvciAobnVtID0gMjQ7IG51bSA8IDMyOyBudW0rKykgeyAJCQotCQlpZiAocmVhZF9wY2lfY29uZmlnKDAsIG51bSwgMywgMHgwMCkgIT0gTkJfSURfMykgCisJCWlmICghZWFybHlfaXNfazhfbmIocmVhZF9wY2lfY29uZmlnKDAsIG51bSwgMywgMHgwMCkpKQogCQkJY29udGludWU7CQogCiAJCS8qIERvbid0IGVuYWJsZSB0cmFuc2xhdGlvbiB5ZXQuIFRoYXQgaXMgZG9uZSBsYXRlci4gCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvYXBpYy5jIGIvYXJjaC94ODZfNjQva2VybmVsL2FwaWMuYwppbmRleCAyOWVmOTkwLi5iMmVhZDkxIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvYXBpYy5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9hcGljLmMKQEAgLTEwMCw3ICsxMDAsNyBAQAogCW1heGx2dCA9IGdldF9tYXhsdnQoKTsKIAogCS8qCi0JICogTWFza2luZyBhbiBMVlQgZW50cnkgb24gYSBQNiBjYW4gdHJpZ2dlciBhIGxvY2FsIEFQSUMgZXJyb3IKKwkgKiBNYXNraW5nIGFuIExWVCBlbnRyeSBjYW4gdHJpZ2dlciBhIGxvY2FsIEFQSUMgZXJyb3IKIAkgKiBpZiB0aGUgdmVjdG9yIGlzIHplcm8uIE1hc2sgTFZURVJSIGZpcnN0IHRvIHByZXZlbnQgdGhpcy4KIAkgKi8KIAlpZiAobWF4bHZ0ID49IDMpIHsKQEAgLTg1MSw3ICs4NTEsMTggQEAKIAkJdW5zaWduZWQgbG9uZyB2OwogCiAJCXYgPSBhcGljX3JlYWQoQVBJQ19MVlRUKTsKLQkJYXBpY193cml0ZShBUElDX0xWVFQsIHYgfCBBUElDX0xWVF9NQVNLRUQpOworCQkvKgorCQkgKiBXaGVuIGFuIGlsbGVnYWwgdmVjdG9yIHZhbHVlICgwLTE1KSBpcyB3cml0dGVuIHRvIGFuIExWVAorCQkgKiBlbnRyeSBhbmQgZGVsaXZlcnkgbW9kZSBpcyBGaXhlZCwgdGhlIEFQSUMgbWF5IHNpZ25hbCBhbgorCQkgKiBpbGxlZ2FsIHZlY3RvciBlcnJvciwgd2l0aCBvdXQgcmVnYXJkIHRvIHdoZXRoZXIgdGhlIG1hc2sKKwkJICogYml0IGlzIHNldCBvciB3aGV0aGVyIGFuIGludGVycnVwdCBpcyBhY3R1YWxseSBzZWVuIG9uIGlucHV0LgorCQkgKgorCQkgKiBCb290IHNlcXVlbmNlIG1pZ2h0IGNhbGwgdGhpcyBmdW5jdGlvbiB3aGVuIHRoZSBMVlRUIGhhcworCQkgKiAnMCcgdmVjdG9yIHZhbHVlLiBTbyBtYWtlIHN1cmUgdmVjdG9yIGZpZWxkIGlzIHNldCB0bworCQkgKiB2YWxpZCB2YWx1ZS4KKwkJICovCisJCXYgfD0gKEFQSUNfTFZUX01BU0tFRCB8IExPQ0FMX1RJTUVSX1ZFQ1RPUik7CisJCWFwaWNfd3JpdGUoQVBJQ19MVlRULCB2KTsKIAl9CiB9CiAKQEAgLTkwOSwxNSArOTIwLDEzIEBACiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKLSNpZmRlZiBDT05GSUdfWDg2X01DRV9BTUQKLXZvaWQgc2V0dXBfdGhyZXNob2xkX2x2dCh1bnNpZ25lZCBsb25nIGx2dF9vZmYpCit2b2lkIHNldHVwX0FQSUNfZXh0ZW5lZF9sdnQodW5zaWduZWQgY2hhciBsdnRfb2ZmLCB1bnNpZ25lZCBjaGFyIHZlY3RvciwKKwkJCSAgICB1bnNpZ25lZCBjaGFyIG1zZ190eXBlLCB1bnNpZ25lZCBjaGFyIG1hc2spCiB7Ci0JdW5zaWduZWQgaW50IHYgPSAwOwotCXVuc2lnbmVkIGxvbmcgcmVnID0gKGx2dF9vZmYgPDwgNCkgKyAweDUwMDsKLQl2IHw9IFRIUkVTSE9MRF9BUElDX1ZFQ1RPUjsKKwl1bnNpZ25lZCBsb25nIHJlZyA9IChsdnRfb2ZmIDw8IDQpICsgSzhfQVBJQ19FWFRfTFZUX0JBU0U7CisJdW5zaWduZWQgaW50ICB2ICAgPSAobWFzayA8PCAxNikgfCAobXNnX3R5cGUgPDwgOCkgfCB2ZWN0b3I7CiAJYXBpY193cml0ZShyZWcsIHYpOwogfQotI2VuZGlmIC8qIENPTkZJR19YODZfTUNFX0FNRCAqLwogCiAjdW5kZWYgQVBJQ19ESVZJU09SCiAKQEAgLTk4Myw3ICs5OTIsNyBAQAogfQogCiAvKgotICogb2VtX2ZvcmNlX2hwZXRfdGltZXIgLS0gZm9yY2UgSFBFVCBtb2RlIGZvciBzb21lIGJveGVzLgorICogYXBpY19pc19jbHVzdGVyZWRfYm94KCkgLS0gQ2hlY2sgaWYgd2UgY2FuIGV4cGVjdCBnb29kIFRTQwogICoKICAqIFRodXMgZmFyLCB0aGUgbWFqb3IgdXNlciBvZiB0aGlzIGlzIElCTSdzIFN1bW1pdDIgc2VyaWVzOgogICoKQEAgLTk5MSw3ICsxMDAwLDcgQEAKICAqIG11bHRpLWNoYXNzaXMuIFVzZSBhdmFpbGFibGUgZGF0YSB0byB0YWtlIGEgZ29vZCBndWVzcy4KICAqIElmIGluIGRvdWJ0LCBnbyBIUEVULgogICovCi1fX2NwdWluaXQgaW50IG9lbV9mb3JjZV9ocGV0X3RpbWVyKHZvaWQpCitfX2NwdWluaXQgaW50IGFwaWNfaXNfY2x1c3RlcmVkX2JveCh2b2lkKQogewogCWludCBpLCBjbHVzdGVycywgemVyb3M7CiAJdW5zaWduZWQgaWQ7CkBAIC0xMDIyLDggKzEwMzEsNyBAQAogCX0KIAogCS8qCi0JICogSWYgY2x1c3RlcnMgPiAyLCB0aGVuIHNob3VsZCBiZSBtdWx0aS1jaGFzc2lzLiAgUmV0dXJuIDEgZm9yIEhQRVQuCi0JICogRWxzZSByZXR1cm4gMCB0byB1c2UgVFNDLgorCSAqIElmIGNsdXN0ZXJzID4gMiwgdGhlbiBzaG91bGQgYmUgbXVsdGktY2hhc3Npcy4KIAkgKiBNYXkgaGF2ZSB0byByZXZpc2l0IHRoaXMgd2hlbiBtdWx0aS1jb3JlICsgaHlwZXJ0aHJlYWRlZCBDUFVzIGNvbWUKIAkgKiBvdXQsIGJ1dCBBRkFJSyB0aGlzIHdpbGwgd29yayBldmVuIGZvciB0aGVtLgogCSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL2FzbS1vZmZzZXRzLmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvYXNtLW9mZnNldHMuYwppbmRleCAzODgzNGJiLi45NjY4N2UyIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvYXNtLW9mZnNldHMuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvYXNtLW9mZnNldHMuYwpAQCAtNCw2ICs0LDcgQEAKICAqIGFuZCBmb3JtYXQgdGhlIHJlcXVpcmVkIGRhdGEuCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+IAogI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+IApAQCAtNjgsNSArNjksNyBAQAogCURFRklORShwYmVfbmV4dCwgb2Zmc2V0b2Yoc3RydWN0IHBiZSwgbmV4dCkpOwogCUJMQU5LKCk7CiAJREVGSU5FKFRTU19pc3QsIG9mZnNldG9mKHN0cnVjdCB0c3Nfc3RydWN0LCBpc3QpKTsKKwlCTEFOSygpOworCURFRklORShjcnlwdG9fdGZtX2N0eF9vZmZzZXQsIG9mZnNldG9mKHN0cnVjdCBjcnlwdG9fdGZtLCBfX2NydF9jdHgpKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9jcmFzaC5jIGIvYXJjaC94ODZfNjQva2VybmVsL2NyYXNoLmMKaW5kZXggNGU2YzNiNy4uZDhkNTc1MCAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL2NyYXNoLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL2NyYXNoLmMKQEAgLTExMSwxNCArMTExLDE0IEBACiAJYXRvbWljX2RlYygmd2FpdGluZ19mb3JfY3Jhc2hfaXBpKTsKIAkvKiBBc3N1bWUgaGx0IHdvcmtzICovCiAJZm9yKDs7KQotCQlhc20oImhsdCIpOworCQloYWx0KCk7CiAKIAlyZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQgc21wX3NlbmRfbm1pX2FsbGJ1dHNlbGYodm9pZCkKIHsKLQlzZW5kX0lQSV9hbGxidXRzZWxmKEFQSUNfRE1fTk1JKTsKKwlzZW5kX0lQSV9hbGxidXRzZWxmKE5NSV9WRUNUT1IpOwogfQogCiAvKgpAQCAtMTYxLDcgKzE2MSw3IEBACiB7CiAJLyoKIAkgKiBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIGFmdGVyIHRoZSBzeXN0ZW0KLQkgKiBoYXMgcGFuaWNlZCBvciBpcyBvdGhlcndpc2UgaW4gYSBjcml0aWNhbCBzdGF0ZS4KKwkgKiBoYXMgcGFuaWNrZWQgb3IgaXMgb3RoZXJ3aXNlIGluIGEgY3JpdGljYWwgc3RhdGUuCiAJICogVGhlIG1pbmltdW0gYW1vdW50IG9mIGNvZGUgdG8gYWxsb3cgYSBrZXhlYydkIGtlcm5lbAogCSAqIHRvIHJ1biBzdWNjZXNzZnVsbHkgbmVlZHMgdG8gaGFwcGVuIGhlcmUuCiAJICoKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9lODIwLmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvZTgyMC5jCmluZGV4IDFlZjYwMjguLjllOTRkODMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9lODIwLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL2U4MjAuYwpAQCAtMSw3ICsxLDYgQEAKIC8qIAogICogSGFuZGxlIHRoZSBtZW1vcnkgbWFwLgogICogVGhlIGZ1bmN0aW9ucyBoZXJlIGRvIHRoZSBqb2IgdW50aWwgYm9vdG1lbSB0YWtlcyBvdmVyLgotICogJElkOiBlODIwLmMsdiAxLjQgMjAwMi8wOS8xOSAxOToyNTozMiBhayBFeHAgJAogICoKICAqICBHZXR0aW5nIHNhbml0aXplX2U4MjBfbWFwKCkgaW4gc3luYyB3aXRoIGkzODYgdmVyc2lvbiBieSBhcHBseWluZyBjaGFuZ2U6CiAgKiAgLSAgUHJvdmlzaW9ucyBmb3IgZW1wdHkgRTgyMCBtZW1vcnkgcmVnaW9ucyAocmVwb3J0ZWQgYnkgY2VydGFpbiBCSU9TZXMpLgpAQCAtNjIxLDYgKzYyMCw3IEBACiB9CiAKIHVuc2lnbmVkIGxvbmcgcGNpX21lbV9zdGFydCA9IDB4YWVlZGJhYmU7CitFWFBPUlRfU1lNQk9MKHBjaV9tZW1fc3RhcnQpOwogCiAvKgogICogU2VhcmNoIGZvciB0aGUgYmlnZ2VzdCBnYXAgaW4gdGhlIGxvdyAzMiBiaXRzIG9mIHRoZSBlODIwCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvZW50cnkuUyBiL2FyY2gveDg2XzY0L2tlcm5lbC9lbnRyeS5TCmluZGV4IDU4NmIzNGMuLjcyOTBlNzIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9lbnRyeS5TCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9lbnRyeS5TCkBAIC0xNTQsNiArMTU0LDcgQEAKIAlHRVRfVEhSRUFEX0lORk8oJXJjeCkJCiAJam1wIHJmZl9hY3Rpb24KIAlDRklfRU5EUFJPQworRU5EKHJldF9mcm9tX2ZvcmspCiAKIC8qCiAgKiBTeXN0ZW0gY2FsbCBlbnRyeS4gVXB0byA2IGFyZ3VtZW50cyBpbiByZWdpc3RlcnMgYXJlIHN1cHBvcnRlZC4KQEAgLTE4OCw3ICsxODksNyBAQAogCiBFTlRSWShzeXN0ZW1fY2FsbCkKIAlDRklfU1RBUlRQUk9DCXNpbXBsZQotCUNGSV9ERUZfQ0ZBCXJzcCwwCisJQ0ZJX0RFRl9DRkEJcnNwLFBEQV9TVEFDS09GRlNFVAogCUNGSV9SRUdJU1RFUglyaXAscmN4CiAJLypDRklfUkVHSVNURVIJcmZsYWdzLHIxMSovCiAJc3dhcGdzCkBAIC0yODUsNiArMjg2LDcgQEAKIAkvKiBVc2UgSVJFVCBiZWNhdXNlIHVzZXIgY291bGQgaGF2ZSBjaGFuZ2VkIGZyYW1lICovCiAJam1wIGludF9yZXRfZnJvbV9zeXNfY2FsbAogCUNGSV9FTkRQUk9DCitFTkQoc3lzdGVtX2NhbGwpCiAJCQogLyogCiAgKiBTeXNjYWxsIHJldHVybiBwYXRoIGVuZGluZyB3aXRoIElSRVQuCkBAIC0zNjQsNiArMzY2LDcgQEAKIAljbGkKIAlqbXAgaW50X3dpdGhfY2hlY2sKIAlDRklfRU5EUFJPQworRU5EKGludF9yZXRfZnJvbV9zeXNfY2FsbCkKIAkJCiAvKiAKICAqIENlcnRhaW4gc3BlY2lhbCBzeXN0ZW0gY2FsbHMgdGhhdCBuZWVkIHRvIHNhdmUgYSBjb21wbGV0ZSBmdWxsIHN0YWNrIGZyYW1lLgpAQCAtMzc1LDYgKzM3OCw3IEBACiAJbGVhcQlcZnVuYyglcmlwKSwlcmF4CiAJbGVhcSAgICAtQVJHT0ZGU0VUKzgoJXJzcCksXGFyZyAvKiA4IGZvciByZXR1cm4gYWRkcmVzcyAqLwogCWptcAlwdHJlZ3NjYWxsX2NvbW1vbgorRU5EKFxsYWJlbCkKIAkuZW5kbQogCiAJQ0ZJX1NUQVJUUFJPQwpAQCAtNDA0LDYgKzQwOCw3IEBACiAJQ0ZJX1JFTF9PRkZTRVQgcmlwLCAwCiAJcmV0CiAJQ0ZJX0VORFBST0MKK0VORChwdHJlZ3NjYWxsX2NvbW1vbikKIAkKIEVOVFJZKHN0dWJfZXhlY3ZlKQogCUNGSV9TVEFSVFBST0MKQEAgLTQxOCw2ICs0MjMsNyBAQAogCVJFU1RPUkVfUkVTVAogCWptcCBpbnRfcmV0X2Zyb21fc3lzX2NhbGwKIAlDRklfRU5EUFJPQworRU5EKHN0dWJfZXhlY3ZlKQogCQogLyoKICAqIHNpZ3JldHVybiBpcyBzcGVjaWFsIGJlY2F1c2UgaXQgbmVlZHMgdG8gcmVzdG9yZSBhbGwgcmVnaXN0ZXJzIG9uIHJldHVybi4KQEAgLTQzNSw2ICs0NDEsNyBAQAogCVJFU1RPUkVfUkVTVAogCWptcCBpbnRfcmV0X2Zyb21fc3lzX2NhbGwKIAlDRklfRU5EUFJPQworRU5EKHN0dWJfcnRfc2lncmV0dXJuKQogCiAvKgogICogaW5pdGlhbCBmcmFtZSBzdGF0ZSBmb3IgaW50ZXJydXB0cyBhbmQgZXhjZXB0aW9ucwpAQCAtNDY2LDI5ICs0NzMsMTggQEAKIC8qIDAoJXJzcCk6IGludGVycnVwdCBudW1iZXIgKi8gCiAJLm1hY3JvIGludGVycnVwdCBmdW5jCiAJY2xkCi0jaWZkZWYgQ09ORklHX0RFQlVHX0lORk8KLQlTQVZFX0FMTAkKLQltb3ZxICVyc3AsJXJkaQotCS8qCi0JICogU2V0dXAgYSBzdGFjayBmcmFtZSBwb2ludGVyLiAgVGhpcyBhbGxvd3MgZ2RiIHRvIHRyYWNlCi0JICogYmFjayB0byB0aGUgb3JpZ2luYWwgc3RhY2suCi0JICovCi0JbW92cSAlcnNwLCVyYnAKLQlDRklfREVGX0NGQV9SRUdJU1RFUglyYnAKLSNlbHNlCQkKIAlTQVZFX0FSR1MKIAlsZWFxIC1BUkdPRkZTRVQoJXJzcCksJXJkaQkjIGFyZzEgZm9yIGhhbmRsZXIKLSNlbmRpZgkKKwlwdXNocSAlcmJwCisJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUCTgKKwlDRklfUkVMX09GRlNFVAkJcmJwLCAwCisJbW92cSAlcnNwLCVyYnAKKwlDRklfREVGX0NGQV9SRUdJU1RFUglyYnAKIAl0ZXN0bCAkMyxDUyglcmRpKQogCWplIDFmCiAJc3dhcGdzCQogMToJaW5jbAklZ3M6cGRhX2lycWNvdW50CSMgUkVELVBFTiBzaG91bGQgY2hlY2sgcHJlZW1wdCBjb3VudAotCW1vdnEgJWdzOnBkYV9pcnFzdGFja3B0ciwlcmF4Ci0JY21vdmVxICVyYXgsJXJzcCAvKnRvZG8gVGhpcyBuZWVkcyBDRkkgYW5ub3RhdGlvbiEgKi8KLQlwdXNocSAlcmRpCQkJIyBzYXZlIG9sZCBzdGFjawkKLSNpZm5kZWYgQ09ORklHX0RFQlVHX0lORk8KLQlDRklfQURKVVNUX0NGQV9PRkZTRVQJOAotI2VuZGlmCisJY21vdmVxICVnczpwZGFfaXJxc3RhY2twdHIsJXJzcAogCWNhbGwgXGZ1bmMKIAkuZW5kbQogCkBAIC00OTcsMTcgKzQ5MywxMSBAQAogCWludGVycnVwdCBkb19JUlEKIAkvKiAwKCVyc3ApOiBvbGRyc3AtQVJHT0ZGU0VUICovCiByZXRfZnJvbV9pbnRyOgotCXBvcHEgICVyZGkKLSNpZm5kZWYgQ09ORklHX0RFQlVHX0lORk8KLQlDRklfQURKVVNUX0NGQV9PRkZTRVQJLTgKLSNlbmRpZgogCWNsaQkKIAlkZWNsICVnczpwZGFfaXJxY291bnQKLSNpZmRlZiBDT05GSUdfREVCVUdfSU5GTwotCW1vdnEgUkJQKCVyZGkpLCVyYnAKKwlsZWF2ZXEKIAlDRklfREVGX0NGQV9SRUdJU1RFUglyc3AKLSNlbmRpZgotCWxlYXEgQVJHT0ZGU0VUKCVyZGkpLCVyc3AgLyp0b2RvIFRoaXMgbmVlZHMgQ0ZJIGFubm90YXRpb24hICovCisJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUCS04CiBleGl0X2ludHI6CiAJR0VUX1RIUkVBRF9JTkZPKCVyY3gpCiAJdGVzdGwgJDMsQ1MtQVJHT0ZGU0VUKCVyc3ApCkBAIC01ODksNyArNTc5LDkgQEAKIAljYWxsIHByZWVtcHRfc2NoZWR1bGVfaXJxCiAJam1wIGV4aXRfaW50cgogI2VuZGlmCQorCiAJQ0ZJX0VORFBST0MKK0VORChjb21tb25faW50ZXJydXB0KQogCQogLyoKICAqIEFQSUMgaW50ZXJydXB0cy4KQEAgLTYwNSwxNyArNTk3LDIxIEBACiAKIEVOVFJZKHRoZXJtYWxfaW50ZXJydXB0KQogCWFwaWNpbnRlcnJ1cHQgVEhFUk1BTF9BUElDX1ZFQ1RPUixzbXBfdGhlcm1hbF9pbnRlcnJ1cHQKK0VORCh0aGVybWFsX2ludGVycnVwdCkKIAogRU5UUlkodGhyZXNob2xkX2ludGVycnVwdCkKIAlhcGljaW50ZXJydXB0IFRIUkVTSE9MRF9BUElDX1ZFQ1RPUixtY2VfdGhyZXNob2xkX2ludGVycnVwdAorRU5EKHRocmVzaG9sZF9pbnRlcnJ1cHQpCiAKICNpZmRlZiBDT05GSUdfU01QCQogRU5UUlkocmVzY2hlZHVsZV9pbnRlcnJ1cHQpCiAJYXBpY2ludGVycnVwdCBSRVNDSEVEVUxFX1ZFQ1RPUixzbXBfcmVzY2hlZHVsZV9pbnRlcnJ1cHQKK0VORChyZXNjaGVkdWxlX2ludGVycnVwdCkKIAogCS5tYWNybyBJTlZBTElEQVRFX0VOVFJZIG51bQogRU5UUlkoaW52YWxpZGF0ZV9pbnRlcnJ1cHRcbnVtKQogCWFwaWNpbnRlcnJ1cHQgSU5WQUxJREFURV9UTEJfVkVDVE9SX1NUQVJUK1xudW0sc21wX2ludmFsaWRhdGVfaW50ZXJydXB0CQorRU5EKGludmFsaWRhdGVfaW50ZXJydXB0XG51bSkKIAkuZW5kbQogCiAJSU5WQUxJREFURV9FTlRSWSAwCkBAIC02MjksMTcgKzYyNSwyMSBAQAogCiBFTlRSWShjYWxsX2Z1bmN0aW9uX2ludGVycnVwdCkKIAlhcGljaW50ZXJydXB0IENBTExfRlVOQ1RJT05fVkVDVE9SLHNtcF9jYWxsX2Z1bmN0aW9uX2ludGVycnVwdAorRU5EKGNhbGxfZnVuY3Rpb25faW50ZXJydXB0KQogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMJCiBFTlRSWShhcGljX3RpbWVyX2ludGVycnVwdCkKIAlhcGljaW50ZXJydXB0IExPQ0FMX1RJTUVSX1ZFQ1RPUixzbXBfYXBpY190aW1lcl9pbnRlcnJ1cHQKK0VORChhcGljX3RpbWVyX2ludGVycnVwdCkKIAogRU5UUlkoZXJyb3JfaW50ZXJydXB0KQogCWFwaWNpbnRlcnJ1cHQgRVJST1JfQVBJQ19WRUNUT1Isc21wX2Vycm9yX2ludGVycnVwdAorRU5EKGVycm9yX2ludGVycnVwdCkKIAogRU5UUlkoc3B1cmlvdXNfaW50ZXJydXB0KQogCWFwaWNpbnRlcnJ1cHQgU1BVUklPVVNfQVBJQ19WRUNUT1Isc21wX3NwdXJpb3VzX2ludGVycnVwdAorRU5EKHNwdXJpb3VzX2ludGVycnVwdCkKICNlbmRpZgogCQkJCQogLyoKQEAgLTc3Nyw2ICs3NzcsNyBAQAogCWNtcHEgJGdzX2NoYW5nZSxSSVAoJXJzcCkKICAgICAgICAgamUgICBlcnJvcl9zd2FwZ3MKIAlqbXAgIGVycm9yX3N0aQorRU5EKGVycm9yX2VudHJ5KQogCQogICAgICAgIC8qIFJlbG9hZCBncyBzZWxlY3RvciB3aXRoIGV4Y2VwdGlvbiBoYW5kbGluZyAqLwogICAgICAgIC8qIGVkaTogIG5ldyBzZWxlY3RvciAqLyAKQEAgLTc5NCw2ICs3OTUsNyBAQAogCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCAtOAogICAgICAgICByZXQKIAlDRklfRU5EUFJPQworRU5EUFJPQyhsb2FkX2dzX2luZGV4KQogICAgICAgIAogICAgICAgICAuc2VjdGlvbiBfX2V4X3RhYmxlLCJhIgogICAgICAgICAuYWxpZ24gOApAQCAtODQ3LDcgKzg0OSw3IEBACiAJVU5GQUtFX1NUQUNLX0ZSQU1FCiAJcmV0CiAJQ0ZJX0VORFBST0MKLQorRU5EUFJPQyhrZXJuZWxfdGhyZWFkKQogCQogY2hpbGRfcmlwOgogCS8qCkBAIC04NjAsNiArODYyLDcgQEAKIAkjIGV4aXQKIAl4b3JsICVlZGksICVlZGkKIAljYWxsIGRvX2V4aXQKK0VORFBST0MoY2hpbGRfcmlwKQogCiAvKgogICogZXhlY3ZlKCkuIFRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gdXNlIElSRVQsIG5vdCBTWVNSRVQsIHRvIHNldCB1cCBhbGwgc3RhdGUgcHJvcGVybHkuCkBAIC04ODksMTkgKzg5MiwyNCBAQAogCVVORkFLRV9TVEFDS19GUkFNRQogCXJldAogCUNGSV9FTkRQUk9DCitFTkRQUk9DKGV4ZWN2ZSkKIAogS1BST0JFX0VOVFJZKHBhZ2VfZmF1bHQpCiAJZXJyb3JlbnRyeSBkb19wYWdlX2ZhdWx0CitFTkQocGFnZV9mYXVsdCkKIAkucHJldmlvdXMgLnRleHQKIAogRU5UUlkoY29wcm9jZXNzb3JfZXJyb3IpCiAJemVyb2VudHJ5IGRvX2NvcHJvY2Vzc29yX2Vycm9yCitFTkQoY29wcm9jZXNzb3JfZXJyb3IpCiAKIEVOVFJZKHNpbWRfY29wcm9jZXNzb3JfZXJyb3IpCiAJemVyb2VudHJ5IGRvX3NpbWRfY29wcm9jZXNzb3JfZXJyb3IJCitFTkQoc2ltZF9jb3Byb2Nlc3Nvcl9lcnJvcikKIAogRU5UUlkoZGV2aWNlX25vdF9hdmFpbGFibGUpCiAJemVyb2VudHJ5IG1hdGhfc3RhdGVfcmVzdG9yZQorRU5EKGRldmljZV9ub3RfYXZhaWxhYmxlKQogCiAJLyogcnVucyBvbiBleGNlcHRpb24gc3RhY2sgKi8KIEtQUk9CRV9FTlRSWShkZWJ1ZykKQEAgLTkxMSw2ICs5MTksNyBAQAogCXBhcmFub2lkZW50cnkgZG9fZGVidWcsIERFQlVHX1NUQUNLCiAJam1wIHBhcmFub2lkX2V4aXQKIAlDRklfRU5EUFJPQworRU5EKGRlYnVnKQogCS5wcmV2aW91cyAudGV4dAogCiAJLyogcnVucyBvbiBleGNlcHRpb24gc3RhY2sgKi8JCkBAIC05NjEsNiArOTcwLDcgQEAKIAljbGkKIAlqbXAgcGFyYW5vaWRfdXNlcnNwYWNlCiAJQ0ZJX0VORFBST0MKK0VORChubWkpCiAJLnByZXZpb3VzIC50ZXh0CiAKIEtQUk9CRV9FTlRSWShpbnQzKQpAQCAtOTcwLDIyICs5ODAsMjggQEAKICAJcGFyYW5vaWRlbnRyeSBkb19pbnQzLCBERUJVR19TVEFDSwogIAlqbXAgcGFyYW5vaWRfZXhpdAogIAlDRklfRU5EUFJPQworRU5EKGludDMpCiAJLnByZXZpb3VzIC50ZXh0CiAKIEVOVFJZKG92ZXJmbG93KQogCXplcm9lbnRyeSBkb19vdmVyZmxvdworRU5EKG92ZXJmbG93KQogCiBFTlRSWShib3VuZHMpCiAJemVyb2VudHJ5IGRvX2JvdW5kcworRU5EKGJvdW5kcykKIAogRU5UUlkoaW52YWxpZF9vcCkKIAl6ZXJvZW50cnkgZG9faW52YWxpZF9vcAkKK0VORChpbnZhbGlkX29wKQogCiBFTlRSWShjb3Byb2Nlc3Nvcl9zZWdtZW50X292ZXJydW4pCiAJemVyb2VudHJ5IGRvX2NvcHJvY2Vzc29yX3NlZ21lbnRfb3ZlcnJ1bgorRU5EKGNvcHJvY2Vzc29yX3NlZ21lbnRfb3ZlcnJ1bikKIAogRU5UUlkocmVzZXJ2ZWQpCiAJemVyb2VudHJ5IGRvX3Jlc2VydmVkCitFTkQocmVzZXJ2ZWQpCiAKIAkvKiBydW5zIG9uIGV4Y2VwdGlvbiBzdGFjayAqLwogRU5UUlkoZG91YmxlX2ZhdWx0KQpAQCAtOTkzLDEyICsxMDA5LDE1IEBACiAJcGFyYW5vaWRlbnRyeSBkb19kb3VibGVfZmF1bHQKIAlqbXAgcGFyYW5vaWRfZXhpdAogCUNGSV9FTkRQUk9DCitFTkQoZG91YmxlX2ZhdWx0KQogCiBFTlRSWShpbnZhbGlkX1RTUykKIAllcnJvcmVudHJ5IGRvX2ludmFsaWRfVFNTCitFTkQoaW52YWxpZF9UU1MpCiAKIEVOVFJZKHNlZ21lbnRfbm90X3ByZXNlbnQpCiAJZXJyb3JlbnRyeSBkb19zZWdtZW50X25vdF9wcmVzZW50CitFTkQoc2VnbWVudF9ub3RfcHJlc2VudCkKIAogCS8qIHJ1bnMgb24gZXhjZXB0aW9uIHN0YWNrICovCiBFTlRSWShzdGFja19zZWdtZW50KQpAQCAtMTAwNiwxOSArMTAyNSwyNCBAQAogCXBhcmFub2lkZW50cnkgZG9fc3RhY2tfc2VnbWVudAogCWptcCBwYXJhbm9pZF9leGl0CiAJQ0ZJX0VORFBST0MKK0VORChzdGFja19zZWdtZW50KQogCiBLUFJPQkVfRU5UUlkoZ2VuZXJhbF9wcm90ZWN0aW9uKQogCWVycm9yZW50cnkgZG9fZ2VuZXJhbF9wcm90ZWN0aW9uCitFTkQoZ2VuZXJhbF9wcm90ZWN0aW9uKQogCS5wcmV2aW91cyAudGV4dAogCiBFTlRSWShhbGlnbm1lbnRfY2hlY2spCiAJZXJyb3JlbnRyeSBkb19hbGlnbm1lbnRfY2hlY2sKK0VORChhbGlnbm1lbnRfY2hlY2spCiAKIEVOVFJZKGRpdmlkZV9lcnJvcikKIAl6ZXJvZW50cnkgZG9fZGl2aWRlX2Vycm9yCitFTkQoZGl2aWRlX2Vycm9yKQogCiBFTlRSWShzcHVyaW91c19pbnRlcnJ1cHRfYnVnKQogCXplcm9lbnRyeSBkb19zcHVyaW91c19pbnRlcnJ1cHRfYnVnCitFTkQoc3B1cmlvdXNfaW50ZXJydXB0X2J1ZykKIAogI2lmZGVmIENPTkZJR19YODZfTUNFCiAJLyogcnVucyBvbiBleGNlcHRpb24gc3RhY2sgKi8KQEAgLTEwMjksNiArMTA1Myw3IEBACiAJcGFyYW5vaWRlbnRyeSBkb19tYWNoaW5lX2NoZWNrCiAJam1wIHBhcmFub2lkX2V4aXQKIAlDRklfRU5EUFJPQworRU5EKG1hY2hpbmVfY2hlY2spCiAjZW5kaWYKIAogRU5UUlkoY2FsbF9zb2Z0aXJxKQpAQCAtMTA0NiwzICsxMDcxLDM3IEBACiAJZGVjbCAlZ3M6cGRhX2lycWNvdW50CiAJcmV0CiAJQ0ZJX0VORFBST0MKK0VORFBST0MoY2FsbF9zb2Z0aXJxKQorCisjaWZkZWYgQ09ORklHX1NUQUNLX1VOV0lORAorRU5UUlkoYXJjaF91bndpbmRfaW5pdF9ydW5uaW5nKQorCUNGSV9TVEFSVFBST0MKKwltb3ZxCSVyMTUsIFIxNSglcmRpKQorCW1vdnEJJXIxNCwgUjE0KCVyZGkpCisJeGNoZ3EJJXJzaSwgJXJkeAorCW1vdnEJJXIxMywgUjEzKCVyZGkpCisJbW92cQklcjEyLCBSMTIoJXJkaSkKKwl4b3JsCSVlYXgsICVlYXgKKwltb3ZxCSVyYnAsIFJCUCglcmRpKQorCW1vdnEJJXJieCwgUkJYKCVyZGkpCisJbW92cQkoJXJzcCksICVyY3gKKwltb3ZxCSVyYXgsIFIxMSglcmRpKQorCW1vdnEJJXJheCwgUjEwKCVyZGkpCisJbW92cQklcmF4LCBSOSglcmRpKQorCW1vdnEJJXJheCwgUjgoJXJkaSkKKwltb3ZxCSVyYXgsIFJBWCglcmRpKQorCW1vdnEJJXJheCwgUkNYKCVyZGkpCisJbW92cQklcmF4LCBSRFgoJXJkaSkKKwltb3ZxCSVyYXgsIFJTSSglcmRpKQorCW1vdnEJJXJheCwgUkRJKCVyZGkpCisJbW92cQklcmF4LCBPUklHX1JBWCglcmRpKQorCW1vdnEJJXJjeCwgUklQKCVyZGkpCisJbGVhcQk4KCVyc3ApLCAlcmN4CisJbW92cQkkX19LRVJORUxfQ1MsIENTKCVyZGkpCisJbW92cQklcmF4LCBFRkxBR1MoJXJkaSkKKwltb3ZxCSVyY3gsIFJTUCglcmRpKQorCW1vdnEJJF9fS0VSTkVMX0RTLCBTUyglcmRpKQorCWptcHEJKiVyZHgKKwlDRklfRU5EUFJPQworRU5EUFJPQyhhcmNoX3Vud2luZF9pbml0X3J1bm5pbmcpCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9nZW5hcGljX2ZsYXQuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9nZW5hcGljX2ZsYXQuYwppbmRleCAxYTJhYjgyLi4yMWM3MDY2IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvZ2VuYXBpY19mbGF0LmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL2dlbmFwaWNfZmxhdC5jCkBAIC03OCwyMiArNzgsMjkgQEAKIAogc3RhdGljIHZvaWQgZmxhdF9zZW5kX0lQSV9hbGxidXRzZWxmKGludCB2ZWN0b3IpCiB7Ci0jaWZuZGVmIENPTkZJR19IT1RQTFVHX0NQVQotCWlmICgoKG51bV9vbmxpbmVfY3B1cygpKSAtIDEpID49IDEpCi0JCV9fc2VuZF9JUElfc2hvcnRjdXQoQVBJQ19ERVNUX0FMTEJVVCwgdmVjdG9yLEFQSUNfREVTVF9MT0dJQ0FMKTsKKyNpZmRlZglDT05GSUdfSE9UUExVR19DUFUKKwlpbnQgaG90cGx1ZyA9IDE7CiAjZWxzZQotCWNwdW1hc2tfdCBhbGxidXRtZSA9IGNwdV9vbmxpbmVfbWFwOwotCi0JY3B1X2NsZWFyKHNtcF9wcm9jZXNzb3JfaWQoKSwgYWxsYnV0bWUpOwotCi0JaWYgKCFjcHVzX2VtcHR5KGFsbGJ1dG1lKSkKLQkJZmxhdF9zZW5kX0lQSV9tYXNrKGFsbGJ1dG1lLCB2ZWN0b3IpOworCWludCBob3RwbHVnID0gMDsKICNlbmRpZgorCWlmIChob3RwbHVnIHx8IHZlY3RvciA9PSBOTUlfVkVDVE9SKSB7CisJCWNwdW1hc2tfdCBhbGxidXRtZSA9IGNwdV9vbmxpbmVfbWFwOworCisJCWNwdV9jbGVhcihzbXBfcHJvY2Vzc29yX2lkKCksIGFsbGJ1dG1lKTsKKworCQlpZiAoIWNwdXNfZW1wdHkoYWxsYnV0bWUpKQorCQkJZmxhdF9zZW5kX0lQSV9tYXNrKGFsbGJ1dG1lLCB2ZWN0b3IpOworCX0gZWxzZSBpZiAobnVtX29ubGluZV9jcHVzKCkgPiAxKSB7CisJCV9fc2VuZF9JUElfc2hvcnRjdXQoQVBJQ19ERVNUX0FMTEJVVCwgdmVjdG9yLEFQSUNfREVTVF9MT0dJQ0FMKTsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIGZsYXRfc2VuZF9JUElfYWxsKGludCB2ZWN0b3IpCiB7Ci0JX19zZW5kX0lQSV9zaG9ydGN1dChBUElDX0RFU1RfQUxMSU5DLCB2ZWN0b3IsIEFQSUNfREVTVF9MT0dJQ0FMKTsKKwlpZiAodmVjdG9yID09IE5NSV9WRUNUT1IpCisJCWZsYXRfc2VuZF9JUElfbWFzayhjcHVfb25saW5lX21hcCwgdmVjdG9yKTsKKwllbHNlCisJCV9fc2VuZF9JUElfc2hvcnRjdXQoQVBJQ19ERVNUX0FMTElOQywgdmVjdG9yLCBBUElDX0RFU1RfTE9HSUNBTCk7CiB9CiAKIHN0YXRpYyBpbnQgZmxhdF9hcGljX2lkX3JlZ2lzdGVyZWQodm9pZCkKQEAgLTEwOCwxMCArMTE1LDcgQEAKIAogc3RhdGljIHVuc2lnbmVkIGludCBwaHlzX3BrZ19pZChpbnQgaW5kZXhfbXNiKQogewotCXUzMiBlYng7Ci0KLQllYnggPSBjcHVpZF9lYngoMSk7Ci0JcmV0dXJuICgoZWJ4ID4+IDI0KSAmIDB4RkYpID4+IGluZGV4X21zYjsKKwlyZXR1cm4gaGFyZF9zbXBfcHJvY2Vzc29yX2lkKCkgPj4gaW5kZXhfbXNiOwogfQogCiBzdHJ1Y3QgZ2VuYXBpYyBhcGljX2ZsYXQgPSAgewpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL2hlYWQ2NC5jIGIvYXJjaC94ODZfNjQva2VybmVsL2hlYWQ2NC5jCmluZGV4IGNlYTIwYTYuLmU2YTcxYzkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9oZWFkNjQuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvaGVhZDY0LmMKQEAgLTIsOCArMiw2IEBACiAgKiAgbGludXgvYXJjaC94ODZfNjQva2VybmVsL2hlYWQ2NC5jIC0tIHByZXBhcmUgdG8gcnVuIGNvbW1vbiBjb2RlCiAgKgogICogIENvcHlyaWdodCAoQykgMjAwMCBBbmRyZWEgQXJjYW5nZWxpIDxhbmRyZWFAc3VzZS5kZT4gU3VTRQotICoKLSAqICAkSWQ6IGhlYWQ2NC5jLHYgMS4yMiAyMDAxLzA3LzA2IDE0OjI4OjIwIGFrIEV4cCAkCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9pODI1OS5jIGIvYXJjaC94ODZfNjQva2VybmVsL2k4MjU5LmMKaW5kZXggNWVjZDM0YS4uODZiMmMxZSAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL2k4MjU5LmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL2k4MjU5LmMKQEAgLTQ0LDExICs0NCwxMSBAQAogCUJJKHgsOCkgQkkoeCw5KSBCSSh4LGEpIEJJKHgsYikgXAogCUJJKHgsYykgQkkoeCxkKSBCSSh4LGUpIEJJKHgsZikKIAotI2RlZmluZSBCVUlMRF8xNF9JUlFTKHgpIFwKKyNkZWZpbmUgQlVJTERfMTVfSVJRUyh4KSBcCiAJQkkoeCwwKSBCSSh4LDEpIEJJKHgsMikgQkkoeCwzKSBcCiAJQkkoeCw0KSBCSSh4LDUpIEJJKHgsNikgQkkoeCw3KSBcCiAJQkkoeCw4KSBCSSh4LDkpIEJJKHgsYSkgQkkoeCxiKSBcCi0JQkkoeCxjKSBCSSh4LGQpCisJQkkoeCxjKSBCSSh4LGQpIEJJKHgsZSkKIAogLyoKICAqIElTQSBQSUMgb3IgbG93IElPLUFQSUMgdHJpZ2dlcmVkIChJTlRBLWN5Y2xlIG9yIEFQSUMpIGludGVycnVwdHM6CkBAIC03MywxMyArNzMsMTMgQEAKIEJVSUxEXzE2X0lSUVMoMHhjKSBCVUlMRF8xNl9JUlFTKDB4ZCkKIAogI2lmZGVmIENPTkZJR19QQ0lfTVNJCi0JQlVJTERfMTRfSVJRUygweGUpCisJQlVJTERfMTVfSVJRUygweGUpCiAjZW5kaWYKIAogI2VuZGlmCiAKICN1bmRlZiBCVUlMRF8xNl9JUlFTCi0jdW5kZWYgQlVJTERfMTRfSVJRUworI3VuZGVmIEJVSUxEXzE1X0lSUVMKICN1bmRlZiBCSQogCiAKQEAgLTkyLDExICs5MiwxMSBAQAogCUlSUSh4LDgpLCBJUlEoeCw5KSwgSVJRKHgsYSksIElSUSh4LGIpLCBcCiAJSVJRKHgsYyksIElSUSh4LGQpLCBJUlEoeCxlKSwgSVJRKHgsZikKIAotI2RlZmluZSBJUlFMSVNUXzE0KHgpIFwKKyNkZWZpbmUgSVJRTElTVF8xNSh4KSBcCiAJSVJRKHgsMCksIElSUSh4LDEpLCBJUlEoeCwyKSwgSVJRKHgsMyksIFwKIAlJUlEoeCw0KSwgSVJRKHgsNSksIElSUSh4LDYpLCBJUlEoeCw3KSwgXAogCUlSUSh4LDgpLCBJUlEoeCw5KSwgSVJRKHgsYSksIElSUSh4LGIpLCBcCi0JSVJRKHgsYyksIElSUSh4LGQpCisJSVJRKHgsYyksIElSUSh4LGQpLCBJUlEoeCxlKQogCiB2b2lkICgqaW50ZXJydXB0W05SX0lSUVNdKSh2b2lkKSA9IHsKIAlJUlFMSVNUXzE2KDB4MCksCkBAIC0xMDgsNyArMTA4LDcgQEAKIAlJUlFMSVNUXzE2KDB4YyksIElSUUxJU1RfMTYoMHhkKQogCiAjaWZkZWYgQ09ORklHX1BDSV9NU0kKLQksIElSUUxJU1RfMTQoMHhlKQorCSwgSVJRTElTVF8xNSgweGUpCiAjZW5kaWYKIAogI2VuZGlmCkBAIC0yNzgsNyArMjc4LDcgQEAKIAkgKiBMaWdodHdlaWdodCBzcHVyaW91cyBJUlEgZGV0ZWN0aW9uLiBXZSBkbyBub3Qgd2FudAogCSAqIHRvIG92ZXJkbyBzcHVyaW91cyBJUlEgaGFuZGxpbmcgLSBpdCdzIHVzdWFsbHkgYSBzaWduCiAJICogb2YgaGFyZHdhcmUgcHJvYmxlbXMsIHNvIHdlIG9ubHkgZG8gdGhlIGNoZWNrcyB3ZSBjYW4KLQkgKiBkbyB3aXRob3V0IHNsb3dpbmcgZG93biBnb29kIGhhcmR3YXJlIHVubmVjZXNzZXJpbHkuCisJICogZG8gd2l0aG91dCBzbG93aW5nIGRvd24gZ29vZCBoYXJkd2FyZSB1bm5lY2Vzc2FyaWx5LgogCSAqCiAJICogTm90ZSB0aGF0IElSUTcgYW5kIElSUTE1ICh0aGUgdHdvIHNwdXJpb3VzIElSUXMKIAkgKiB1c3VhbGx5IHJlc3VsdGluZyBmcm9tIHRoZSA4MjU5QS0xfDIgUElDcykgb2NjdXIKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9pb19hcGljLmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvaW9fYXBpYy5jCmluZGV4IDljYzcwMzEuLmM3NjhkOGEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9pb19hcGljLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL2lvX2FwaWMuYwpAQCAtNDEsNiArNDEsNyBAQAogI2luY2x1ZGUgPGFzbS9tYWNoX2FwaWMuaD4KICNpbmNsdWRlIDxhc20vYWNwaS5oPgogI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vbm1pLmg+CiAKICNkZWZpbmUgX19hcGljZGVidWdpbml0ICBfX2luaXQKIApAQCAtNTYsNiArNTcsNyBAQAogc3RhdGljIHN0cnVjdCB7IGludCBwaW4sIGFwaWM7IH0gaW9hcGljX2k4MjU5ID0geyAtMSwgLTEgfTsKIAogc3RhdGljIERFRklORV9TUElOTE9DSyhpb2FwaWNfbG9jayk7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHZlY3Rvcl9sb2NrKTsKIAogLyoKICAqICMgb2YgSVJRIHJvdXRpbmcgcmVnaXN0ZXJzCkBAIC0zMTcsNyArMzE5LDcgQEAKIAkJCQl2ZW5kb3IgJj0gMHhmZmZmOwogCQkJCXN3aXRjaCAodmVuZG9yKSB7IAogCQkJCWNhc2UgUENJX1ZFTkRPUl9JRF9WSUE6Ci0jaWZkZWYgQ09ORklHX0dBUlRfSU9NTVUKKyNpZmRlZiBDT05GSUdfSU9NTVUKIAkJCQkJaWYgKChlbmRfcGZuID4gTUFYX0RNQTMyX1BGTiB8fAogCQkJCQkgICAgIGZvcmNlX2lvbW11KSAmJgogCQkJCQkgICAgIWlvbW11X2FwZXJ0dXJlX2FsbG93ZWQpIHsKQEAgLTgzNCwxMCArODM2LDE3IEBACiBpbnQgYXNzaWduX2lycV92ZWN0b3IoaW50IGlycSkKIHsKIAlzdGF0aWMgaW50IGN1cnJlbnRfdmVjdG9yID0gRklSU1RfREVWSUNFX1ZFQ1RPUiwgb2Zmc2V0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCB2ZWN0b3I7CiAKIAlCVUdfT04oaXJxICE9IEFVVE9fQVNTSUdOICYmICh1bnNpZ25lZClpcnEgPj0gTlJfSVJRX1ZFQ1RPUlMpOwotCWlmIChpcnEgIT0gQVVUT19BU1NJR04gJiYgSU9fQVBJQ19WRUNUT1IoaXJxKSA+IDApCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdmVjdG9yX2xvY2ssIGZsYWdzKTsKKworCWlmIChpcnEgIT0gQVVUT19BU1NJR04gJiYgSU9fQVBJQ19WRUNUT1IoaXJxKSA+IDApIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmVjdG9yX2xvY2ssIGZsYWdzKTsKIAkJcmV0dXJuIElPX0FQSUNfVkVDVE9SKGlycSk7CisJfQogbmV4dDoKIAljdXJyZW50X3ZlY3RvciArPSA4OwogCWlmIChjdXJyZW50X3ZlY3RvciA9PSBJQTMyX1NZU0NBTExfVkVDVE9SKQpAQCAtODQ5LDExICs4NTgsMTQgQEAKIAkJY3VycmVudF92ZWN0b3IgPSBGSVJTVF9ERVZJQ0VfVkVDVE9SICsgb2Zmc2V0OwogCX0KIAotCXZlY3Rvcl9pcnFbY3VycmVudF92ZWN0b3JdID0gaXJxOworCXZlY3RvciA9IGN1cnJlbnRfdmVjdG9yOworCXZlY3Rvcl9pcnFbdmVjdG9yXSA9IGlycTsKIAlpZiAoaXJxICE9IEFVVE9fQVNTSUdOKQotCQlJT19BUElDX1ZFQ1RPUihpcnEpID0gY3VycmVudF92ZWN0b3I7CisJCUlPX0FQSUNfVkVDVE9SKGlycSkgPSB2ZWN0b3I7CiAKLQlyZXR1cm4gY3VycmVudF92ZWN0b3I7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmVjdG9yX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiB2ZWN0b3I7CiB9CiAKIGV4dGVybiB2b2lkICgqaW50ZXJydXB0W05SX0lSUVNdKSh2b2lkKTsKQEAgLTg2NiwyMSArODc4LDE0IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBpb2FwaWNfcmVnaXN0ZXJfaW50cihpbnQgaXJxLCBpbnQgdmVjdG9yLCB1bnNpZ25lZCBsb25nIHRyaWdnZXIpCiB7Ci0JaWYgKHVzZV9wY2lfdmVjdG9yKCkgJiYgIXBsYXRmb3JtX2xlZ2FjeV9pcnEoaXJxKSkgewotCQlpZiAoKHRyaWdnZXIgPT0gSU9BUElDX0FVVE8gJiYgSU9fQVBJQ19pcnFfdHJpZ2dlcihpcnEpKSB8fAotCQkJCXRyaWdnZXIgPT0gSU9BUElDX0xFVkVMKQotCQkJaXJxX2Rlc2NbdmVjdG9yXS5oYW5kbGVyID0gJmlvYXBpY19sZXZlbF90eXBlOwotCQllbHNlCi0JCQlpcnFfZGVzY1t2ZWN0b3JdLmhhbmRsZXIgPSAmaW9hcGljX2VkZ2VfdHlwZTsKLQkJc2V0X2ludHJfZ2F0ZSh2ZWN0b3IsIGludGVycnVwdFt2ZWN0b3JdKTsKLQl9IGVsc2UJewotCQlpZiAoKHRyaWdnZXIgPT0gSU9BUElDX0FVVE8gJiYgSU9fQVBJQ19pcnFfdHJpZ2dlcihpcnEpKSB8fAotCQkJCXRyaWdnZXIgPT0gSU9BUElDX0xFVkVMKQotCQkJaXJxX2Rlc2NbaXJxXS5oYW5kbGVyID0gJmlvYXBpY19sZXZlbF90eXBlOwotCQllbHNlCi0JCQlpcnFfZGVzY1tpcnFdLmhhbmRsZXIgPSAmaW9hcGljX2VkZ2VfdHlwZTsKLQkJc2V0X2ludHJfZ2F0ZSh2ZWN0b3IsIGludGVycnVwdFtpcnFdKTsKLQl9CisJdW5zaWduZWQgaWR4ID0gdXNlX3BjaV92ZWN0b3IoKSAmJiAhcGxhdGZvcm1fbGVnYWN5X2lycShpcnEpID8gdmVjdG9yIDogaXJxOworCisJaWYgKCh0cmlnZ2VyID09IElPQVBJQ19BVVRPICYmIElPX0FQSUNfaXJxX3RyaWdnZXIoaXJxKSkgfHwKKwkJCXRyaWdnZXIgPT0gSU9BUElDX0xFVkVMKQorCQlpcnFfZGVzY1tpZHhdLmhhbmRsZXIgPSAmaW9hcGljX2xldmVsX3R5cGU7CisJZWxzZQorCQlpcnFfZGVzY1tpZHhdLmhhbmRsZXIgPSAmaW9hcGljX2VkZ2VfdHlwZTsKKwlzZXRfaW50cl9nYXRlKHZlY3RvciwgaW50ZXJydXB0W2lkeF0pOwogfQogCiBzdGF0aWMgdm9pZCBfX2luaXQgc2V0dXBfSU9fQVBJQ19pcnFzKHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvaXJxLmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvaXJxLmMKaW5kZXggZDhiZDBiMy4uNTk1MThkNCAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL2lycS5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9pcnEuYwpAQCAtMjYsNiArMjYsMzAgQEAKICNlbmRpZgogI2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfREVCVUdfU1RBQ0tPVkVSRkxPVworLyoKKyAqIFByb2JhYmlsaXN0aWMgc3RhY2sgb3ZlcmZsb3cgY2hlY2s6CisgKgorICogT25seSBjaGVjayB0aGUgc3RhY2sgaW4gcHJvY2VzcyBjb250ZXh0LCBiZWNhdXNlIGV2ZXJ5dGhpbmcgZWxzZQorICogcnVucyBvbiB0aGUgYmlnIGludGVycnVwdCBzdGFja3MuIENoZWNraW5nIHJlbGlhYmx5IGlzIHRvbyBleHBlbnNpdmUsCisgKiBzbyB3ZSBqdXN0IGNoZWNrIGZyb20gaW50ZXJydXB0cy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHN0YWNrX292ZXJmbG93X2NoZWNrKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXU2NCBjdXJiYXNlID0gKHU2NCkgY3VycmVudC0+dGhyZWFkX2luZm87CisJc3RhdGljIHVuc2lnbmVkIGxvbmcgd2FybmVkID0gLTYwKkhaOworCisJaWYgKHJlZ3MtPnJzcCA+PSBjdXJiYXNlICYmIHJlZ3MtPnJzcCA8PSBjdXJiYXNlICsgVEhSRUFEX1NJWkUgJiYKKwkgICAgcmVncy0+cnNwIDwgIGN1cmJhc2UgKyBzaXplb2Yoc3RydWN0IHRocmVhZF9pbmZvKSArIDEyOCAmJgorCSAgICB0aW1lX2FmdGVyKGppZmZpZXMsIHdhcm5lZCArIDYwKkhaKSkgeworCQlwcmludGsoImRvX0lSUTogJXMgbmVhciBzdGFjayBvdmVyZmxvdyAoY3VyOiVMeCxyc3A6JWx4KVxuIiwKKwkJICAgICAgIGN1cnJlbnQtPmNvbW0sIGN1cmJhc2UsIHJlZ3MtPnJzcCk7CisJCXNob3dfc3RhY2soTlVMTCxOVUxMKTsKKwkJd2FybmVkID0gamlmZmllczsKKwl9Cit9CisjZW5kaWYKKwogLyoKICAqIEdlbmVyaWMsIGNvbnRyb2xsZXItaW5kZXBlbmRlbnQgZnVuY3Rpb25zOgogICovCkBAIC0zOSw3ICs2Myw3IEBACiAJaWYgKGkgPT0gMCkgewogCQlzZXFfcHJpbnRmKHAsICIgICAgICAgICAgICIpOwogCQlmb3JfZWFjaF9vbmxpbmVfY3B1KGopCi0JCQlzZXFfcHJpbnRmKHAsICJDUFUlZCAgICAgICAiLGopOworCQkJc2VxX3ByaW50ZihwLCAiQ1BVJS04ZCIsaik7CiAJCXNlcV9wdXRjKHAsICdcbicpOwogCX0KIApAQCAtOTYsNyArMTIwLDkgQEAKIAogCWV4aXRfaWRsZSgpOwogCWlycV9lbnRlcigpOwotCisjaWZkZWYgQ09ORklHX0RFQlVHX1NUQUNLT1ZFUkZMT1cKKwlzdGFja19vdmVyZmxvd19jaGVjayhyZWdzKTsKKyNlbmRpZgogCV9fZG9fSVJRKGlycSwgcmVncyk7CiAJaXJxX2V4aXQoKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL2s4LmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvazguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDE2NjgyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL2s4LmMKQEAgLTAsMCArMSwxMTggQEAKKy8qCisgKiBTaGFyZWQgc3VwcG9ydCBjb2RlIGZvciBBTUQgSzggbm9ydGhicmlkZ2VzIGFuZCBkZXJpdmF0ZXMuCisgKiBDb3B5cmlnaHQgMjAwNiBBbmRpIEtsZWVuLCBTVVNFIExhYnMuIFN1YmplY3QgdG8gR1BMdjIuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9nZnAuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8YXNtL2s4Lmg+CisKK2ludCBudW1fazhfbm9ydGhicmlkZ2VzOworRVhQT1JUX1NZTUJPTChudW1fazhfbm9ydGhicmlkZ2VzKTsKKworc3RhdGljIHUzMiAqZmx1c2hfd29yZHM7CisKK3N0cnVjdCBwY2lfZGV2aWNlX2lkIGs4X25iX2lkc1tdID0geworCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0FNRCwgMHgxMTAzKSB9LAorCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0FNRCwgMHgxMjAzKSB9LAorCXt9Cit9OworRVhQT1JUX1NZTUJPTChrOF9uYl9pZHMpOworCitzdHJ1Y3QgcGNpX2RldiAqKms4X25vcnRoYnJpZGdlczsKK0VYUE9SVF9TWU1CT0woazhfbm9ydGhicmlkZ2VzKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2ICpuZXh0X2s4X25vcnRoYnJpZGdlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJZG8geworCQlkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBkZXYpOworCQlpZiAoIWRldikKKwkJCWJyZWFrOworCX0gd2hpbGUgKCFwY2lfbWF0Y2hfaWQoJms4X25iX2lkc1swXSwgZGV2KSk7CisJcmV0dXJuIGRldjsKK30KKworaW50IGNhY2hlX2s4X25vcnRoYnJpZGdlcyh2b2lkKQoreworCWludCBpOworCXN0cnVjdCBwY2lfZGV2ICpkZXY7CisJaWYgKG51bV9rOF9ub3J0aGJyaWRnZXMpCisJCXJldHVybiAwOworCisJbnVtX2s4X25vcnRoYnJpZGdlcyA9IDA7CisJZGV2ID0gTlVMTDsKKwl3aGlsZSAoKGRldiA9IG5leHRfazhfbm9ydGhicmlkZ2UoZGV2KSkgIT0gTlVMTCkKKwkJbnVtX2s4X25vcnRoYnJpZGdlcysrOworCisJazhfbm9ydGhicmlkZ2VzID0ga21hbGxvYygobnVtX2s4X25vcnRoYnJpZGdlcyArIDEpICogc2l6ZW9mKHZvaWQgKiksCisJCQkJICBHRlBfS0VSTkVMKTsKKwlpZiAoIWs4X25vcnRoYnJpZGdlcykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlmbHVzaF93b3JkcyA9IGttYWxsb2MobnVtX2s4X25vcnRoYnJpZGdlcyAqIHNpemVvZih1MzIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWZsdXNoX3dvcmRzKSB7CisJCWtmcmVlKGs4X25vcnRoYnJpZGdlcyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWRldiA9IE5VTEw7CisJaSA9IDA7CisJd2hpbGUgKChkZXYgPSBuZXh0X2s4X25vcnRoYnJpZGdlKGRldikpICE9IE5VTEwpIHsKKwkJazhfbm9ydGhicmlkZ2VzW2krK10gPSBkZXY7CisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIDB4OWMsICZmbHVzaF93b3Jkc1tpXSk7CisJfQorCWs4X25vcnRoYnJpZGdlc1tpXSA9IE5VTEw7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChjYWNoZV9rOF9ub3J0aGJyaWRnZXMpOworCisvKiBJZ25vcmVzIHN1YmRldmljZS9zdWJ2ZW5kb3IgYnV0IGFzIGZhciBhcyBJIGNhbiBmaWd1cmUgb3V0CisgICB0aGV5J3JlIHVzZWxlc3MgYW55d2F5cyAqLworaW50IF9faW5pdCBlYXJseV9pc19rOF9uYih1MzIgZGV2aWNlKQoreworCXN0cnVjdCBwY2lfZGV2aWNlX2lkICppZDsKKwl1MzIgdmVuZG9yID0gZGV2aWNlICYgMHhmZmZmOworCWRldmljZSA+Pj0gMTY7CisJZm9yIChpZCA9IGs4X25iX2lkczsgaWQtPnZlbmRvcjsgaWQrKykKKwkJaWYgKHZlbmRvciA9PSBpZC0+dmVuZG9yICYmIGRldmljZSA9PSBpZC0+ZGV2aWNlKQorCQkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgazhfZmx1c2hfZ2FydHModm9pZCkKK3sKKwlpbnQgZmx1c2hlZCwgaTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soZ2FydF9sb2NrKTsKKworCS8qIEF2b2lkIHJhY2VzIGJldHdlZW4gQUdQIGFuZCBJT01NVS4gSW4gdGhlb3J5IGl0J3Mgbm90IG5lZWRlZAorCSAgIGJ1dCBJJ20gbm90IHN1cmUgaWYgdGhlIGhhcmR3YXJlIHdvbid0IGxvc2UgZmx1c2ggcmVxdWVzdHMKKwkgICB3aGVuIGFub3RoZXIgaXMgcGVuZGluZy4gVGhpcyB3aG9sZSB0aGluZyBpcyBzbyBleHBlbnNpdmUgYW55d2F5cworCSAgIHRoYXQgaXQgZG9lc24ndCBtYXR0ZXIgdG8gc2VyaWFsaXplIG1vcmUuIC1BSyAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZnYXJ0X2xvY2ssIGZsYWdzKTsKKwlmbHVzaGVkID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2s4X25vcnRoYnJpZGdlczsgaSsrKSB7CisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoazhfbm9ydGhicmlkZ2VzW2ldLCAweDljLAorCQkJCSAgICAgICBmbHVzaF93b3Jkc1tpXXwxKTsKKwkJZmx1c2hlZCsrOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2s4X25vcnRoYnJpZGdlczsgaSsrKSB7CisJCXUzMiB3OworCQkvKiBNYWtlIHN1cmUgdGhlIGhhcmR3YXJlIGFjdHVhbGx5IGV4ZWN1dGVkIHRoZSBmbHVzaCovCisJCWZvciAoOzspIHsKKwkJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChrOF9ub3J0aGJyaWRnZXNbaV0sCisJCQkJCSAgICAgIDB4OWMsICZ3KTsKKwkJCWlmICghKHcgJiAxKSkKKwkJCQlicmVhazsKKwkJCWNwdV9yZWxheCgpOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdhcnRfbG9jaywgZmxhZ3MpOworCWlmICghZmx1c2hlZCkKKwkJcHJpbnRrKCJub3RoaW5nIHRvIGZsdXNoP1xuIik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChrOF9mbHVzaF9nYXJ0cyk7CisKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9tYWNoaW5lX2tleGVjLmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvbWFjaGluZV9rZXhlYy5jCmluZGV4IDI1YWM4YTMuLjgzZmIyNGEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9tYWNoaW5lX2tleGVjLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL21hY2hpbmVfa2V4ZWMuYwpAQCAtMTQ5LDggKzE0OSw4IEBACiAJCQkJCXVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkcmVzcywKIAkJCQkJdW5zaWduZWQgbG9uZyBwZ3RhYmxlKSBBVFRSSUJfTk9SRVQ7CiAKLWNvbnN0IGV4dGVybiB1bnNpZ25lZCBjaGFyIHJlbG9jYXRlX25ld19rZXJuZWxbXTsKLWNvbnN0IGV4dGVybiB1bnNpZ25lZCBsb25nIHJlbG9jYXRlX25ld19rZXJuZWxfc2l6ZTsKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIHJlbG9jYXRlX25ld19rZXJuZWxbXTsKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBsb25nIHJlbG9jYXRlX25ld19rZXJuZWxfc2l6ZTsKIAogaW50IG1hY2hpbmVfa2V4ZWNfcHJlcGFyZShzdHJ1Y3Qga2ltYWdlICppbWFnZSkKIHsKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9tY2UuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9tY2UuYwppbmRleCBjNjlmYzQzLi5hY2Q1ODE2IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvbWNlLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL21jZS5jCkBAIC01NjIsNyArNTYyLDcgQEAKIAlzZXRfa3NldF9uYW1lKCJtYWNoaW5lY2hlY2siKSwKIH07CiAKLXN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3Qgc3lzX2RldmljZSwgZGV2aWNlX21jZSk7CitERUZJTkVfUEVSX0NQVShzdHJ1Y3Qgc3lzX2RldmljZSwgZGV2aWNlX21jZSk7CiAKIC8qIFdoeSBhcmUgdGhlcmUgbm8gZ2VuZXJpYyBmdW5jdGlvbnMgZm9yIHRoaXM/ICovCiAjZGVmaW5lIEFDQ0VTU09SKG5hbWUsIHZhciwgc3RhcnQpIFwKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9tY2VfYW1kLmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvbWNlX2FtZC5jCmluZGV4IGQxM2IyNDEuLjMzNTIwMGEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9tY2VfYW1kLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL21jZV9hbWQuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiAgKGMpIDIwMDUgQWR2YW5jZWQgTWljcm8gRGV2aWNlcywgSW5jLgorICogIChjKSAyMDA1LCAyMDA2IEFkdmFuY2VkIE1pY3JvIERldmljZXMsIEluYy4KICAqICBZb3VyIHVzZSBvZiB0aGlzIGNvZGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCiAgKiAgR05VIGdlbmVyYWwgcHVibGljIGxpY2Vuc2UgdmVyc2lvbiAyLiBTZWUgIkNPUFlJTkciIG9yCiAgKiAgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC5odG1sCkBAIC04LDkgKzgsMTAgQEAKICAqCiAgKiAgU3VwcG9ydCA6IGphY29iLnNoaW5AYW1kLmNvbQogICoKLSAqICBNQzRfTUlTQzAgRFJBTSBFQ0MgRXJyb3IgVGhyZXNob2xkIGF2YWlsYWJsZSB1bmRlciBBTUQgSzggUmV2IEYuCi0gKiAgTUM0X01JU0MwIGV4aXN0cyBwZXIgcGh5c2ljYWwgcHJvY2Vzc29yLgorICogIEFwcmlsIDIwMDYKKyAqICAgICAtIGFkZGVkIHN1cHBvcnQgZm9yIEFNRCBGYW1pbHkgMHgxMCBwcm9jZXNzb3JzCiAgKgorICogIEFsbCBNQzRfTUlTQ2kgcmVnaXN0ZXJzIGFyZSBzaGFyZWQgYmV0d2VlbiBtdWx0aS1jb3JlcwogICovCiAKICNpbmNsdWRlIDxsaW51eC9jcHUuaD4KQEAgLTI5LDMyICszMCw0NSBAQAogI2luY2x1ZGUgPGFzbS9wZXJjcHUuaD4KICNpbmNsdWRlIDxhc20vaWRsZS5oPgogCi0jZGVmaW5lIFBGWCAibWNlX3RocmVzaG9sZDogIgotI2RlZmluZSBWRVJTSU9OICJ2ZXJzaW9uIDEuMDAuOSIKLSNkZWZpbmUgTlJfQkFOS1MgNQotI2RlZmluZSBUSFJFU0hPTERfTUFYIDB4RkZGCi0jZGVmaW5lIElOVF9UWVBFX0FQSUMgMHgwMDAyMDAwMAotI2RlZmluZSBNQVNLX1ZBTElEX0hJIDB4ODAwMDAwMDAKLSNkZWZpbmUgTUFTS19MVlRPRkZfSEkgMHgwMEYwMDAwMAotI2RlZmluZSBNQVNLX0NPVU5UX0VOX0hJIDB4MDAwODAwMDAKLSNkZWZpbmUgTUFTS19JTlRfVFlQRV9ISSAweDAwMDYwMDAwCi0jZGVmaW5lIE1BU0tfT1ZFUkZMT1dfSEkgMHgwMDAxMDAwMAorI2RlZmluZSBQRlggICAgICAgICAgICAgICAibWNlX3RocmVzaG9sZDogIgorI2RlZmluZSBWRVJTSU9OICAgICAgICAgICAidmVyc2lvbiAxLjEuMSIKKyNkZWZpbmUgTlJfQkFOS1MgICAgICAgICAgNgorI2RlZmluZSBOUl9CTE9DS1MgICAgICAgICA5CisjZGVmaW5lIFRIUkVTSE9MRF9NQVggICAgIDB4RkZGCisjZGVmaW5lIElOVF9UWVBFX0FQSUMgICAgIDB4MDAwMjAwMDAKKyNkZWZpbmUgTUFTS19WQUxJRF9ISSAgICAgMHg4MDAwMDAwMAorI2RlZmluZSBNQVNLX0xWVE9GRl9ISSAgICAweDAwRjAwMDAwCisjZGVmaW5lIE1BU0tfQ09VTlRfRU5fSEkgIDB4MDAwODAwMDAKKyNkZWZpbmUgTUFTS19JTlRfVFlQRV9ISSAgMHgwMDA2MDAwMAorI2RlZmluZSBNQVNLX09WRVJGTE9XX0hJICAweDAwMDEwMDAwCiAjZGVmaW5lIE1BU0tfRVJSX0NPVU5UX0hJIDB4MDAwMDBGRkYKLSNkZWZpbmUgTUFTS19PVkVSRkxPVyAweDAwMDEwMDAwMDAwMDAwMDBMCisjZGVmaW5lIE1BU0tfQkxLUFRSX0xPICAgIDB4RkYwMDAwMDAKKyNkZWZpbmUgTUNHX1hCTEtfQUREUiAgICAgMHhDMDAwMDQwMAogCi1zdHJ1Y3QgdGhyZXNob2xkX2Jhbmsgeworc3RydWN0IHRocmVzaG9sZF9ibG9jayB7CisJdW5zaWduZWQgaW50IGJsb2NrOworCXVuc2lnbmVkIGludCBiYW5rOwogCXVuc2lnbmVkIGludCBjcHU7Ci0JdTggYmFuazsKLQl1OCBpbnRlcnJ1cHRfZW5hYmxlOworCXUzMiBhZGRyZXNzOworCXUxNiBpbnRlcnJ1cHRfZW5hYmxlOwogCXUxNiB0aHJlc2hvbGRfbGltaXQ7CiAJc3RydWN0IGtvYmplY3Qga29iajsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG1pc2NqOwogfTsKIAotc3RhdGljIHN0cnVjdCB0aHJlc2hvbGRfYmFuayB0aHJlc2hvbGRfZGVmYXVsdHMgPSB7CisvKiBkZWZhdWx0cyB1c2VkIGVhcmx5IG9uIGJvb3QgKi8KK3N0YXRpYyBzdHJ1Y3QgdGhyZXNob2xkX2Jsb2NrIHRocmVzaG9sZF9kZWZhdWx0cyA9IHsKIAkuaW50ZXJydXB0X2VuYWJsZSA9IDAsCiAJLnRocmVzaG9sZF9saW1pdCA9IFRIUkVTSE9MRF9NQVgsCiB9OwogCitzdHJ1Y3QgdGhyZXNob2xkX2JhbmsgeworCXN0cnVjdCBrb2JqZWN0IGtvYmo7CisJc3RydWN0IHRocmVzaG9sZF9ibG9jayAqYmxvY2tzOworCWNwdW1hc2tfdCBjcHVzOworfTsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgdGhyZXNob2xkX2JhbmsgKiwgdGhyZXNob2xkX2JhbmtzW05SX0JBTktTXSk7CisKICNpZmRlZiBDT05GSUdfU01QCiBzdGF0aWMgdW5zaWduZWQgY2hhciBzaGFyZWRfYmFua1tOUl9CQU5LU10gPSB7CiAJMCwgMCwgMCwgMCwgMQpAQCAtNjgsMTIgKzgyLDEyIEBACiAgKi8KIAogLyogbXVzdCBiZSBjYWxsZWQgd2l0aCBjb3JyZWN0IGNwdSBhZmZpbml0eSAqLwotc3RhdGljIHZvaWQgdGhyZXNob2xkX3Jlc3RhcnRfYmFuayhzdHJ1Y3QgdGhyZXNob2xkX2JhbmsgKmIsCitzdGF0aWMgdm9pZCB0aHJlc2hvbGRfcmVzdGFydF9iYW5rKHN0cnVjdCB0aHJlc2hvbGRfYmxvY2sgKmIsCiAJCQkJICAgaW50IHJlc2V0LCB1MTYgb2xkX2xpbWl0KQogewogCXUzMiBtY2lfbWlzY19oaSwgbWNpX21pc2NfbG87CiAKLQlyZG1zcihNU1JfSUEzMl9NQzBfTUlTQyArIGItPmJhbmsgKiA0LCBtY2lfbWlzY19sbywgbWNpX21pc2NfaGkpOworCXJkbXNyKGItPmFkZHJlc3MsIG1jaV9taXNjX2xvLCBtY2lfbWlzY19oaSk7CiAKIAlpZiAoYi0+dGhyZXNob2xkX2xpbWl0IDwgKG1jaV9taXNjX2hpICYgVEhSRVNIT0xEX01BWCkpCiAJCXJlc2V0ID0gMTsJLyogbGltaXQgY2Fubm90IGJlIGxvd2VyIHRoYW4gZXJyIGNvdW50ICovCkBAIC05NCwzNSArMTA4LDU3IEBACiAJICAgIChtY2lfbWlzY19oaSAmPSB+TUFTS19JTlRfVFlQRV9ISSk7CiAKIAltY2lfbWlzY19oaSB8PSBNQVNLX0NPVU5UX0VOX0hJOwotCXdybXNyKE1TUl9JQTMyX01DMF9NSVNDICsgYi0+YmFuayAqIDQsIG1jaV9taXNjX2xvLCBtY2lfbWlzY19oaSk7CisJd3Jtc3IoYi0+YWRkcmVzcywgbWNpX21pc2NfbG8sIG1jaV9taXNjX2hpKTsKIH0KIAorLyogY3B1IGluaXQgZW50cnkgcG9pbnQsIGNhbGxlZCBmcm9tIG1jZS5jIHdpdGggcHJlZW1wdCBvZmYgKi8KIHZvaWQgX19jcHVpbml0IG1jZV9hbWRfZmVhdHVyZV9pbml0KHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKIHsKLQlpbnQgYmFuazsKLQl1MzIgbWNpX21pc2NfbG8sIG1jaV9taXNjX2hpOworCXVuc2lnbmVkIGludCBiYW5rLCBibG9jazsKIAl1bnNpZ25lZCBpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCXUzMiBsb3cgPSAwLCBoaWdoID0gMCwgYWRkcmVzcyA9IDA7CiAKIAlmb3IgKGJhbmsgPSAwOyBiYW5rIDwgTlJfQkFOS1M7ICsrYmFuaykgewotCQlyZG1zcihNU1JfSUEzMl9NQzBfTUlTQyArIGJhbmsgKiA0LCBtY2lfbWlzY19sbywgbWNpX21pc2NfaGkpOworCQlmb3IgKGJsb2NrID0gMDsgYmxvY2sgPCBOUl9CTE9DS1M7ICsrYmxvY2spIHsKKwkJCWlmIChibG9jayA9PSAwKQorCQkJCWFkZHJlc3MgPSBNU1JfSUEzMl9NQzBfTUlTQyArIGJhbmsgKiA0OworCQkJZWxzZSBpZiAoYmxvY2sgPT0gMSkKKwkJCQlhZGRyZXNzID0gTUNHX1hCTEtfQUREUgorCQkJCQkrICgobG93ICYgTUFTS19CTEtQVFJfTE8pID4+IDIxKTsKKwkJCWVsc2UKKwkJCQkrK2FkZHJlc3M7CiAKLQkJLyogIXZhbGlkLCAhY291bnRlciBwcmVzZW50LCBiaW9zIGxvY2tlZCAqLwotCQlpZiAoIShtY2lfbWlzY19oaSAmIE1BU0tfVkFMSURfSEkpIHx8Ci0JCSAgICAhKG1jaV9taXNjX2hpICYgTUFTS19WQUxJRF9ISSA+PiAxKSB8fAotCQkgICAgKG1jaV9taXNjX2hpICYgTUFTS19WQUxJRF9ISSA+PiAyKSkKLQkJCWNvbnRpbnVlOworCQkJaWYgKHJkbXNyX3NhZmUoYWRkcmVzcywgJmxvdywgJmhpZ2gpKQorCQkJCWNvbnRpbnVlOwogCi0JCXBlcl9jcHUoYmFua19tYXAsIGNwdSkgfD0gKDEgPDwgYmFuayk7CisJCQlpZiAoIShoaWdoICYgTUFTS19WQUxJRF9ISSkpIHsKKwkJCQlpZiAoYmxvY2spCisJCQkJCWNvbnRpbnVlOworCQkJCWVsc2UKKwkJCQkJYnJlYWs7CisJCQl9CiAKKwkJCWlmICghKGhpZ2ggJiBNQVNLX1ZBTElEX0hJID4+IDEpICB8fAorCQkJICAgICAoaGlnaCAmIE1BU0tfVkFMSURfSEkgPj4gMikpCisJCQkJY29udGludWU7CisKKwkJCWlmICghYmxvY2spCisJCQkJcGVyX2NwdShiYW5rX21hcCwgY3B1KSB8PSAoMSA8PCBiYW5rKTsKICNpZmRlZiBDT05GSUdfU01QCi0JCWlmIChzaGFyZWRfYmFua1tiYW5rXSAmJiBjcHVfY29yZV9pZFtjcHVdKQotCQkJY29udGludWU7CisJCQlpZiAoc2hhcmVkX2JhbmtbYmFua10gJiYgYy0+Y3B1X2NvcmVfaWQpCisJCQkJYnJlYWs7CiAjZW5kaWYKKwkJCWhpZ2ggJj0gfk1BU0tfTFZUT0ZGX0hJOworCQkJaGlnaCB8PSBLOF9BUElDX0VYVF9MVlRfRU5UUllfVEhSRVNIT0xEIDw8IDIwOworCQkJd3Jtc3IoYWRkcmVzcywgbG93LCBoaWdoKTsKIAotCQlzZXR1cF90aHJlc2hvbGRfbHZ0KChtY2lfbWlzY19oaSAmIE1BU0tfTFZUT0ZGX0hJKSA+PiAyMCk7Ci0JCXRocmVzaG9sZF9kZWZhdWx0cy5jcHUgPSBjcHU7Ci0JCXRocmVzaG9sZF9kZWZhdWx0cy5iYW5rID0gYmFuazsKLQkJdGhyZXNob2xkX3Jlc3RhcnRfYmFuaygmdGhyZXNob2xkX2RlZmF1bHRzLCAwLCAwKTsKKwkJCXNldHVwX0FQSUNfZXh0ZW5lZF9sdnQoSzhfQVBJQ19FWFRfTFZUX0VOVFJZX1RIUkVTSE9MRCwKKwkJCQkJICAgICAgIFRIUkVTSE9MRF9BUElDX1ZFQ1RPUiwKKwkJCQkJICAgICAgIEs4X0FQSUNfRVhUX0lOVF9NU0dfRklYLCAwKTsKKworCQkJdGhyZXNob2xkX2RlZmF1bHRzLmFkZHJlc3MgPSBhZGRyZXNzOworCQkJdGhyZXNob2xkX3Jlc3RhcnRfYmFuaygmdGhyZXNob2xkX2RlZmF1bHRzLCAwLCAwKTsKKwkJfQogCX0KIH0KIApAQCAtMTM3LDggKzE3Myw5IEBACiAgKi8KIGFzbWxpbmthZ2Ugdm9pZCBtY2VfdGhyZXNob2xkX2ludGVycnVwdCh2b2lkKQogewotCWludCBiYW5rOworCXVuc2lnbmVkIGludCBiYW5rLCBibG9jazsKIAlzdHJ1Y3QgbWNlIG07CisJdTMyIGxvdyA9IDAsIGhpZ2ggPSAwLCBhZGRyZXNzID0gMDsKIAogCWFja19BUElDX2lycSgpOwogCWV4aXRfaWRsZSgpOwpAQCAtMTUwLDE1ICsxODcsNDIgQEAKIAogCS8qIGFzc3VtZSBmaXJzdCBiYW5rIGNhdXNlZCBpdCAqLwogCWZvciAoYmFuayA9IDA7IGJhbmsgPCBOUl9CQU5LUzsgKytiYW5rKSB7Ci0JCW0uYmFuayA9IE1DRV9USFJFU0hPTERfQkFTRSArIGJhbms7Ci0JCXJkbXNybChNU1JfSUEzMl9NQzBfTUlTQyArIGJhbmsgKiA0LCBtLm1pc2MpOworCQlmb3IgKGJsb2NrID0gMDsgYmxvY2sgPCBOUl9CTE9DS1M7ICsrYmxvY2spIHsKKwkJCWlmIChibG9jayA9PSAwKQorCQkJCWFkZHJlc3MgPSBNU1JfSUEzMl9NQzBfTUlTQyArIGJhbmsgKiA0OworCQkJZWxzZSBpZiAoYmxvY2sgPT0gMSkKKwkJCQlhZGRyZXNzID0gTUNHX1hCTEtfQUREUgorCQkJCQkrICgobG93ICYgTUFTS19CTEtQVFJfTE8pID4+IDIxKTsKKwkJCWVsc2UKKwkJCQkrK2FkZHJlc3M7CiAKLQkJaWYgKG0ubWlzYyAmIE1BU0tfT1ZFUkZMT1cpIHsKLQkJCW1jZV9sb2coJm0pOwotCQkJZ290byBvdXQ7CisJCQlpZiAocmRtc3Jfc2FmZShhZGRyZXNzLCAmbG93LCAmaGlnaCkpCisJCQkJY29udGludWU7CisKKwkJCWlmICghKGhpZ2ggJiBNQVNLX1ZBTElEX0hJKSkgeworCQkJCWlmIChibG9jaykKKwkJCQkJY29udGludWU7CisJCQkJZWxzZQorCQkJCQlicmVhazsKKwkJCX0KKworCQkJaWYgKCEoaGlnaCAmIE1BU0tfVkFMSURfSEkgPj4gMSkgIHx8CisJCQkgICAgIChoaWdoICYgTUFTS19WQUxJRF9ISSA+PiAyKSkKKwkJCQljb250aW51ZTsKKworCQkJaWYgKGhpZ2ggJiBNQVNLX09WRVJGTE9XX0hJKSB7CisJCQkJcmRtc3JsKGFkZHJlc3MsIG0ubWlzYyk7CisJCQkJcmRtc3JsKE1TUl9JQTMyX01DMF9TVEFUVVMgKyBiYW5rICogNCwKKwkJCQkgICAgICAgbS5zdGF0dXMpOworCQkJCW0uYmFuayA9IEs4X01DRV9USFJFU0hPTERfQkFTRQorCQkJCSAgICAgICArIGJhbmsgKiBOUl9CTE9DS1MKKwkJCQkgICAgICAgKyBibG9jazsKKwkJCQltY2VfbG9nKCZtKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KIAkJfQogCX0KLSAgICAgIG91dDoKK291dDoKIAlpcnFfZXhpdCgpOwogfQogCkBAIC0xNjYsMjAgKzIzMCwxMiBAQAogICogU3lzZnMgSW50ZXJmYWNlCiAgKi8KIAotc3RhdGljIHN0cnVjdCBzeXNkZXZfY2xhc3MgdGhyZXNob2xkX3N5c2NsYXNzID0gewotCXNldF9rc2V0X25hbWUoInRocmVzaG9sZCIpLAotfTsKLQotc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBzeXNfZGV2aWNlLCBkZXZpY2VfdGhyZXNob2xkKTsKLQogc3RydWN0IHRocmVzaG9sZF9hdHRyIHsKLSAgICAgICAgc3RydWN0IGF0dHJpYnV0ZSBhdHRyOwotICAgICAgICBzc2l6ZV90KCpzaG93KSAoc3RydWN0IHRocmVzaG9sZF9iYW5rICosIGNoYXIgKik7Ci0gICAgICAgIHNzaXplX3QoKnN0b3JlKSAoc3RydWN0IHRocmVzaG9sZF9iYW5rICosIGNvbnN0IGNoYXIgKiwgc2l6ZV90IGNvdW50KTsKKwlzdHJ1Y3QgYXR0cmlidXRlIGF0dHI7CisJc3NpemVfdCgqc2hvdykgKHN0cnVjdCB0aHJlc2hvbGRfYmxvY2sgKiwgY2hhciAqKTsKKwlzc2l6ZV90KCpzdG9yZSkgKHN0cnVjdCB0aHJlc2hvbGRfYmxvY2sgKiwgY29uc3QgY2hhciAqLCBzaXplX3QgY291bnQpOwogfTsKIAotc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCB0aHJlc2hvbGRfYmFuayAqLCB0aHJlc2hvbGRfYmFua3NbTlJfQkFOS1NdKTsKLQogc3RhdGljIGNwdW1hc2tfdCBhZmZpbml0eV9zZXQodW5zaWduZWQgaW50IGNwdSkKIHsKIAljcHVtYXNrX3Qgb2xkbWFzayA9IGN1cnJlbnQtPmNwdXNfYWxsb3dlZDsKQEAgLTE5NCwxNSArMjUwLDE1IEBACiAJc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBvbGRtYXNrKTsKIH0KIAotI2RlZmluZSBTSE9XX0ZJRUxEUyhuYW1lKSBcCi0gICAgICAgIHN0YXRpYyBzc2l6ZV90IHNob3dfICMjIG5hbWUoc3RydWN0IHRocmVzaG9sZF9iYW5rICogYiwgY2hhciAqYnVmKSBcCi0gICAgICAgIHsgXAotICAgICAgICAgICAgICAgIHJldHVybiBzcHJpbnRmKGJ1ZiwgIiVseFxuIiwgKHVuc2lnbmVkIGxvbmcpIGItPm5hbWUpOyBcCi0gICAgICAgIH0KKyNkZWZpbmUgU0hPV19GSUVMRFMobmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHNzaXplX3Qgc2hvd18gIyMgbmFtZShzdHJ1Y3QgdGhyZXNob2xkX2Jsb2NrICogYiwgY2hhciAqYnVmKSBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIHNwcmludGYoYnVmLCAiJWx4XG4iLCAodW5zaWduZWQgbG9uZykgYi0+bmFtZSk7ICAgICAgXAorfQogU0hPV19GSUVMRFMoaW50ZXJydXB0X2VuYWJsZSkKIFNIT1dfRklFTERTKHRocmVzaG9sZF9saW1pdCkKIAotc3RhdGljIHNzaXplX3Qgc3RvcmVfaW50ZXJydXB0X2VuYWJsZShzdHJ1Y3QgdGhyZXNob2xkX2JhbmsgKmIsCitzdGF0aWMgc3NpemVfdCBzdG9yZV9pbnRlcnJ1cHRfZW5hYmxlKHN0cnVjdCB0aHJlc2hvbGRfYmxvY2sgKmIsCiAJCQkJICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJY2hhciAqZW5kOwpAQCAtMjE5LDcgKzI3NSw3IEBACiAJcmV0dXJuIGVuZCAtIGJ1ZjsKIH0KIAotc3RhdGljIHNzaXplX3Qgc3RvcmVfdGhyZXNob2xkX2xpbWl0KHN0cnVjdCB0aHJlc2hvbGRfYmFuayAqYiwKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX3RocmVzaG9sZF9saW1pdChzdHJ1Y3QgdGhyZXNob2xkX2Jsb2NrICpiLAogCQkJCSAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJY2hhciAqZW5kOwpAQCAtMjQyLDE4ICsyOTgsMTggQEAKIAlyZXR1cm4gZW5kIC0gYnVmOwogfQogCi1zdGF0aWMgc3NpemVfdCBzaG93X2Vycm9yX2NvdW50KHN0cnVjdCB0aHJlc2hvbGRfYmFuayAqYiwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3Qgc2hvd19lcnJvcl9jb3VudChzdHJ1Y3QgdGhyZXNob2xkX2Jsb2NrICpiLCBjaGFyICpidWYpCiB7CiAJdTMyIGhpZ2gsIGxvdzsKIAljcHVtYXNrX3Qgb2xkbWFzazsKIAlvbGRtYXNrID0gYWZmaW5pdHlfc2V0KGItPmNwdSk7Ci0JcmRtc3IoTVNSX0lBMzJfTUMwX01JU0MgKyBiLT5iYW5rICogNCwgbG93LCBoaWdoKTsgLyogaWdub3JlIGxvdyAzMiAqLworCXJkbXNyKGItPmFkZHJlc3MsIGxvdywgaGlnaCk7CiAJYWZmaW5pdHlfcmVzdG9yZShvbGRtYXNrKTsKIAlyZXR1cm4gc3ByaW50ZihidWYsICIleFxuIiwKIAkJICAgICAgIChoaWdoICYgMHhGRkYpIC0gKFRIUkVTSE9MRF9NQVggLSBiLT50aHJlc2hvbGRfbGltaXQpKTsKIH0KIAotc3RhdGljIHNzaXplX3Qgc3RvcmVfZXJyb3JfY291bnQoc3RydWN0IHRocmVzaG9sZF9iYW5rICpiLAorc3RhdGljIHNzaXplX3Qgc3RvcmVfZXJyb3JfY291bnQoc3RydWN0IHRocmVzaG9sZF9ibG9jayAqYiwKIAkJCQkgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJY3B1bWFza190IG9sZG1hc2s7CkBAIC0yNjksMTMgKzMyNSwxMyBAQAogICAgICAgICAuc3RvcmUgPSBfc3RvcmUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiB9OwogCi0jZGVmaW5lIEFUVFJfRklFTERTKG5hbWUpIFwKLSAgICAgICAgc3RhdGljIHN0cnVjdCB0aHJlc2hvbGRfYXR0ciBuYW1lID0gXAorI2RlZmluZSBSV19BVFRSKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBzdHJ1Y3QgdGhyZXNob2xkX2F0dHIgbmFtZSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIFRIUkVTSE9MRF9BVFRSKG5hbWUsIDA2NDQsIHNob3dfIyMgbmFtZSwgc3RvcmVfIyMgbmFtZSkKIAotQVRUUl9GSUVMRFMoaW50ZXJydXB0X2VuYWJsZSk7Ci1BVFRSX0ZJRUxEUyh0aHJlc2hvbGRfbGltaXQpOwotQVRUUl9GSUVMRFMoZXJyb3JfY291bnQpOworUldfQVRUUihpbnRlcnJ1cHRfZW5hYmxlKTsKK1JXX0FUVFIodGhyZXNob2xkX2xpbWl0KTsKK1JXX0FUVFIoZXJyb3JfY291bnQpOwogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqZGVmYXVsdF9hdHRyc1tdID0gewogCSZpbnRlcnJ1cHRfZW5hYmxlLmF0dHIsCkBAIC0yODQsMTIgKzM0MCwxMiBAQAogCU5VTEwKIH07CiAKLSNkZWZpbmUgdG9fYmFuayhrKSBjb250YWluZXJfb2YoayxzdHJ1Y3QgdGhyZXNob2xkX2Jhbmssa29iaikKLSNkZWZpbmUgdG9fYXR0cihhKSBjb250YWluZXJfb2YoYSxzdHJ1Y3QgdGhyZXNob2xkX2F0dHIsYXR0cikKKyNkZWZpbmUgdG9fYmxvY2soaykgY29udGFpbmVyX29mKGssIHN0cnVjdCB0aHJlc2hvbGRfYmxvY2ssIGtvYmopCisjZGVmaW5lIHRvX2F0dHIoYSkgY29udGFpbmVyX29mKGEsIHN0cnVjdCB0aHJlc2hvbGRfYXR0ciwgYXR0cikKIAogc3RhdGljIHNzaXplX3Qgc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewotCXN0cnVjdCB0aHJlc2hvbGRfYmFuayAqYiA9IHRvX2Jhbmsoa29iaik7CisJc3RydWN0IHRocmVzaG9sZF9ibG9jayAqYiA9IHRvX2Jsb2NrKGtvYmopOwogCXN0cnVjdCB0aHJlc2hvbGRfYXR0ciAqYSA9IHRvX2F0dHIoYXR0cik7CiAJc3NpemVfdCByZXQ7CiAJcmV0ID0gYS0+c2hvdyA/IGEtPnNob3coYiwgYnVmKSA6IC1FSU87CkBAIC0yOTksNyArMzU1LDcgQEAKIHN0YXRpYyBzc2l6ZV90IHN0b3JlKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAogCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewotCXN0cnVjdCB0aHJlc2hvbGRfYmFuayAqYiA9IHRvX2Jhbmsoa29iaik7CisJc3RydWN0IHRocmVzaG9sZF9ibG9jayAqYiA9IHRvX2Jsb2NrKGtvYmopOwogCXN0cnVjdCB0aHJlc2hvbGRfYXR0ciAqYSA9IHRvX2F0dHIoYXR0cik7CiAJc3NpemVfdCByZXQ7CiAJcmV0ID0gYS0+c3RvcmUgPyBhLT5zdG9yZShiLCBidWYsIGNvdW50KSA6IC1FSU87CkBAIC0zMTYsNjkgKzM3MiwxNzQgQEAKIAkuZGVmYXVsdF9hdHRycyA9IGRlZmF1bHRfYXR0cnMsCiB9OwogCi0vKiBzeW1saW5rcyBzaWJsaW5nIHNoYXJlZCBiYW5rcyB0byBmaXJzdCBjb3JlLiAgZmlyc3QgY29yZSBvd25zIGRpci9maWxlcy4gKi8KLXN0YXRpYyBfX2NwdWluaXQgaW50IHRocmVzaG9sZF9jcmVhdGVfYmFuayh1bnNpZ25lZCBpbnQgY3B1LCBpbnQgYmFuaykKK3N0YXRpYyBfX2NwdWluaXQgaW50IGFsbG9jYXRlX3RocmVzaG9sZF9ibG9ja3ModW5zaWduZWQgaW50IGNwdSwKKwkJCQkJICAgICAgIHVuc2lnbmVkIGludCBiYW5rLAorCQkJCQkgICAgICAgdW5zaWduZWQgaW50IGJsb2NrLAorCQkJCQkgICAgICAgdTMyIGFkZHJlc3MpCiB7Ci0JaW50IGVyciA9IDA7CisJaW50IGVycjsKKwl1MzIgbG93LCBoaWdoOworCXN0cnVjdCB0aHJlc2hvbGRfYmxvY2sgKmIgPSBOVUxMOworCisJaWYgKChiYW5rID49IE5SX0JBTktTKSB8fCAoYmxvY2sgPj0gTlJfQkxPQ0tTKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAocmRtc3Jfc2FmZShhZGRyZXNzLCAmbG93LCAmaGlnaCkpCisJCWdvdG8gcmVjdXJzZTsKKworCWlmICghKGhpZ2ggJiBNQVNLX1ZBTElEX0hJKSkgeworCQlpZiAoYmxvY2spCisJCQlnb3RvIHJlY3Vyc2U7CisJCWVsc2UKKwkJCXJldHVybiAwOworCX0KKworCWlmICghKGhpZ2ggJiBNQVNLX1ZBTElEX0hJID4+IDEpICB8fAorCSAgICAgKGhpZ2ggJiBNQVNLX1ZBTElEX0hJID4+IDIpKQorCQlnb3RvIHJlY3Vyc2U7CisKKwliID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHRocmVzaG9sZF9ibG9jayksIEdGUF9LRVJORUwpOworCWlmICghYikKKwkJcmV0dXJuIC1FTk9NRU07CisJbWVtc2V0KGIsIDAsIHNpemVvZihzdHJ1Y3QgdGhyZXNob2xkX2Jsb2NrKSk7CisKKwliLT5ibG9jayA9IGJsb2NrOworCWItPmJhbmsgPSBiYW5rOworCWItPmNwdSA9IGNwdTsKKwliLT5hZGRyZXNzID0gYWRkcmVzczsKKwliLT5pbnRlcnJ1cHRfZW5hYmxlID0gMDsKKwliLT50aHJlc2hvbGRfbGltaXQgPSBUSFJFU0hPTERfTUFYOworCisJSU5JVF9MSVNUX0hFQUQoJmItPm1pc2NqKTsKKworCWlmIChwZXJfY3B1KHRocmVzaG9sZF9iYW5rcywgY3B1KVtiYW5rXS0+YmxvY2tzKQorCQlsaXN0X2FkZCgmYi0+bWlzY2osCisJCQkgJnBlcl9jcHUodGhyZXNob2xkX2JhbmtzLCBjcHUpW2JhbmtdLT5ibG9ja3MtPm1pc2NqKTsKKwllbHNlCisJCXBlcl9jcHUodGhyZXNob2xkX2JhbmtzLCBjcHUpW2JhbmtdLT5ibG9ja3MgPSBiOworCisJa29iamVjdF9zZXRfbmFtZSgmYi0+a29iaiwgIm1pc2MlaSIsIGJsb2NrKTsKKwliLT5rb2JqLnBhcmVudCA9ICZwZXJfY3B1KHRocmVzaG9sZF9iYW5rcywgY3B1KVtiYW5rXS0+a29iajsKKwliLT5rb2JqLmt0eXBlID0gJnRocmVzaG9sZF9rdHlwZTsKKwllcnIgPSBrb2JqZWN0X3JlZ2lzdGVyKCZiLT5rb2JqKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9mcmVlOworcmVjdXJzZToKKwlpZiAoIWJsb2NrKSB7CisJCWFkZHJlc3MgPSAobG93ICYgTUFTS19CTEtQVFJfTE8pID4+IDIxOworCQlpZiAoIWFkZHJlc3MpCisJCQlyZXR1cm4gMDsKKwkJYWRkcmVzcyArPSBNQ0dfWEJMS19BRERSOworCX0gZWxzZQorCQkrK2FkZHJlc3M7CisKKwllcnIgPSBhbGxvY2F0ZV90aHJlc2hvbGRfYmxvY2tzKGNwdSwgYmFuaywgKytibG9jaywgYWRkcmVzcyk7CisJaWYgKGVycikKKwkJZ290byBvdXRfZnJlZTsKKworCXJldHVybiBlcnI7CisKK291dF9mcmVlOgorCWlmIChiKSB7CisJCWtvYmplY3RfdW5yZWdpc3RlcigmYi0+a29iaik7CisJCWtmcmVlKGIpOworCX0KKwlyZXR1cm4gZXJyOworfQorCisvKiBzeW1saW5rcyBzaWJsaW5nIHNoYXJlZCBiYW5rcyB0byBmaXJzdCBjb3JlLiAgZmlyc3QgY29yZSBvd25zIGRpci9maWxlcy4gKi8KK3N0YXRpYyBfX2NwdWluaXQgaW50IHRocmVzaG9sZF9jcmVhdGVfYmFuayh1bnNpZ25lZCBpbnQgY3B1LCB1bnNpZ25lZCBpbnQgYmFuaykKK3sKKwlpbnQgaSwgZXJyID0gMDsKIAlzdHJ1Y3QgdGhyZXNob2xkX2JhbmsgKmIgPSBOVUxMOworCWNwdW1hc2tfdCBvbGRtYXNrID0gQ1BVX01BU0tfTk9ORTsKKwljaGFyIG5hbWVbMzJdOworCisJc3ByaW50ZihuYW1lLCAidGhyZXNob2xkX2JhbmslaSIsIGJhbmspOwogCiAjaWZkZWYgQ09ORklHX1NNUAotCWlmIChjcHVfY29yZV9pZFtjcHVdICYmIHNoYXJlZF9iYW5rW2JhbmtdKSB7CS8qIHN5bWxpbmsgKi8KLQkJY2hhciBuYW1lWzE2XTsKLQkJdW5zaWduZWQgbGNwdSA9IGZpcnN0X2NwdShjcHVfY29yZV9tYXBbY3B1XSk7Ci0JCWlmIChjcHVfY29yZV9pZFtsY3B1XSkKLQkJCWdvdG8gb3V0OwkvKiBmaXJzdCBjb3JlIG5vdCB1cCB5ZXQgKi8KKwlpZiAoY3B1X2RhdGFbY3B1XS5jcHVfY29yZV9pZCAmJiBzaGFyZWRfYmFua1tiYW5rXSkgewkvKiBzeW1saW5rICovCisJCWkgPSBmaXJzdF9jcHUoY3B1X2NvcmVfbWFwW2NwdV0pOwogCi0JCWIgPSBwZXJfY3B1KHRocmVzaG9sZF9iYW5rcywgbGNwdSlbYmFua107CisJCS8qIGZpcnN0IGNvcmUgbm90IHVwIHlldCAqLworCQlpZiAoY3B1X2RhdGFbaV0uY3B1X2NvcmVfaWQpCisJCQlnb3RvIG91dDsKKworCQkvKiBhbHJlYWR5IGxpbmtlZCAqLworCQlpZiAocGVyX2NwdSh0aHJlc2hvbGRfYmFua3MsIGNwdSlbYmFua10pCisJCQlnb3RvIG91dDsKKworCQliID0gcGVyX2NwdSh0aHJlc2hvbGRfYmFua3MsIGkpW2JhbmtdOworCiAJCWlmICghYikKIAkJCWdvdG8gb3V0OwotCQlzcHJpbnRmKG5hbWUsICJiYW5rJWkiLCBiYW5rKTsKLQkJZXJyID0gc3lzZnNfY3JlYXRlX2xpbmsoJnBlcl9jcHUoZGV2aWNlX3RocmVzaG9sZCwgY3B1KS5rb2JqLAorCisJCWVyciA9IHN5c2ZzX2NyZWF0ZV9saW5rKCZwZXJfY3B1KGRldmljZV9tY2UsIGNwdSkua29iaiwKIAkJCQkJJmItPmtvYmosIG5hbWUpOwogCQlpZiAoZXJyKQogCQkJZ290byBvdXQ7CisKKwkJYi0+Y3B1cyA9IGNwdV9jb3JlX21hcFtjcHVdOwogCQlwZXJfY3B1KHRocmVzaG9sZF9iYW5rcywgY3B1KVtiYW5rXSA9IGI7CiAJCWdvdG8gb3V0OwogCX0KICNlbmRpZgogCi0JYiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB0aHJlc2hvbGRfYmFuayksIEdGUF9LRVJORUwpOworCWIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdGhyZXNob2xkX2JhbmspLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWIpIHsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBvdXQ7CiAJfQogCW1lbXNldChiLCAwLCBzaXplb2Yoc3RydWN0IHRocmVzaG9sZF9iYW5rKSk7CiAKLQliLT5jcHUgPSBjcHU7Ci0JYi0+YmFuayA9IGJhbms7Ci0JYi0+aW50ZXJydXB0X2VuYWJsZSA9IDA7Ci0JYi0+dGhyZXNob2xkX2xpbWl0ID0gVEhSRVNIT0xEX01BWDsKLQlrb2JqZWN0X3NldF9uYW1lKCZiLT5rb2JqLCAiYmFuayVpIiwgYmFuayk7Ci0JYi0+a29iai5wYXJlbnQgPSAmcGVyX2NwdShkZXZpY2VfdGhyZXNob2xkLCBjcHUpLmtvYmo7Ci0JYi0+a29iai5rdHlwZSA9ICZ0aHJlc2hvbGRfa3R5cGU7Ci0KKwlrb2JqZWN0X3NldF9uYW1lKCZiLT5rb2JqLCAidGhyZXNob2xkX2JhbmslaSIsIGJhbmspOworCWItPmtvYmoucGFyZW50ID0gJnBlcl9jcHUoZGV2aWNlX21jZSwgY3B1KS5rb2JqOworI2lmbmRlZiBDT05GSUdfU01QCisJYi0+Y3B1cyA9IENQVV9NQVNLX0FMTDsKKyNlbHNlCisJYi0+Y3B1cyA9IGNwdV9jb3JlX21hcFtjcHVdOworI2VuZGlmCiAJZXJyID0ga29iamVjdF9yZWdpc3RlcigmYi0+a29iaik7Ci0JaWYgKGVycikgewotCQlrZnJlZShiKTsKLQkJZ290byBvdXQ7Ci0JfQorCWlmIChlcnIpCisJCWdvdG8gb3V0X2ZyZWU7CisKIAlwZXJfY3B1KHRocmVzaG9sZF9iYW5rcywgY3B1KVtiYW5rXSA9IGI7Ci0gICAgICBvdXQ6CisKKwlvbGRtYXNrID0gYWZmaW5pdHlfc2V0KGNwdSk7CisJZXJyID0gYWxsb2NhdGVfdGhyZXNob2xkX2Jsb2NrcyhjcHUsIGJhbmssIDAsCisJCQkJCU1TUl9JQTMyX01DMF9NSVNDICsgYmFuayAqIDQpOworCWFmZmluaXR5X3Jlc3RvcmUob2xkbWFzayk7CisKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9mcmVlOworCisJZm9yX2VhY2hfY3B1X21hc2soaSwgYi0+Y3B1cykgeworCQlpZiAoaSA9PSBjcHUpCisJCQljb250aW51ZTsKKworCQllcnIgPSBzeXNmc19jcmVhdGVfbGluaygmcGVyX2NwdShkZXZpY2VfbWNlLCBpKS5rb2JqLAorCQkJCQkmYi0+a29iaiwgbmFtZSk7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dDsKKworCQlwZXJfY3B1KHRocmVzaG9sZF9iYW5rcywgaSlbYmFua10gPSBiOworCX0KKworCWdvdG8gb3V0OworCitvdXRfZnJlZToKKwlwZXJfY3B1KHRocmVzaG9sZF9iYW5rcywgY3B1KVtiYW5rXSA9IE5VTEw7CisJa2ZyZWUoYik7CitvdXQ6CiAJcmV0dXJuIGVycjsKIH0KIAogLyogY3JlYXRlIGRpci9maWxlcyBmb3IgYWxsIHZhbGlkIHRocmVzaG9sZCBiYW5rcyAqLwogc3RhdGljIF9fY3B1aW5pdCBpbnQgdGhyZXNob2xkX2NyZWF0ZV9kZXZpY2UodW5zaWduZWQgaW50IGNwdSkKIHsKLQlpbnQgYmFuazsKKwl1bnNpZ25lZCBpbnQgYmFuazsKIAlpbnQgZXJyID0gMDsKIAotCXBlcl9jcHUoZGV2aWNlX3RocmVzaG9sZCwgY3B1KS5pZCA9IGNwdTsKLQlwZXJfY3B1KGRldmljZV90aHJlc2hvbGQsIGNwdSkuY2xzID0gJnRocmVzaG9sZF9zeXNjbGFzczsKLQllcnIgPSBzeXNkZXZfcmVnaXN0ZXIoJnBlcl9jcHUoZGV2aWNlX3RocmVzaG9sZCwgY3B1KSk7Ci0JaWYgKGVycikKLQkJZ290byBvdXQ7Ci0KIAlmb3IgKGJhbmsgPSAwOyBiYW5rIDwgTlJfQkFOS1M7ICsrYmFuaykgewogCQlpZiAoIShwZXJfY3B1KGJhbmtfbWFwLCBjcHUpICYgMSA8PCBiYW5rKSkKIAkJCWNvbnRpbnVlOwpAQCAtMzg2LDcgKzU0Nyw3IEBACiAJCWlmIChlcnIpCiAJCQlnb3RvIG91dDsKIAl9Ci0gICAgICBvdXQ6CitvdXQ6CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMzk3LDkyICs1NTgsODUgQEAKICAqICAgb2Ygc2hhcmVkIHN5c2ZzIGRpci9maWxlcywgYW5kIHJlc3Qgb2YgdGhlIGNvcmVzIHdpbGwgYmUgc3ltbGlua2VkIHRvIGl0LgogICovCiAKLS8qIGNwdSBob3RwbHVnIGNhbGwgcmVtb3ZlcyBhbGwgc3ltbGlua3MgYmVmb3JlIGZpcnN0IGNvcmUgZGllcyAqLworc3RhdGljIF9fY3B1aW5pdCB2b2lkIGRlYWxsb2NhdGVfdGhyZXNob2xkX2Jsb2NrKHVuc2lnbmVkIGludCBjcHUsCisJCQkJCQkgdW5zaWduZWQgaW50IGJhbmspCit7CisJc3RydWN0IHRocmVzaG9sZF9ibG9jayAqcG9zID0gTlVMTDsKKwlzdHJ1Y3QgdGhyZXNob2xkX2Jsb2NrICp0bXAgPSBOVUxMOworCXN0cnVjdCB0aHJlc2hvbGRfYmFuayAqaGVhZCA9IHBlcl9jcHUodGhyZXNob2xkX2JhbmtzLCBjcHUpW2JhbmtdOworCisJaWYgKCFoZWFkKQorCQlyZXR1cm47CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocG9zLCB0bXAsICZoZWFkLT5ibG9ja3MtPm1pc2NqLCBtaXNjaikgeworCQlrb2JqZWN0X3VucmVnaXN0ZXIoJnBvcy0+a29iaik7CisJCWxpc3RfZGVsKCZwb3MtPm1pc2NqKTsKKwkJa2ZyZWUocG9zKTsKKwl9CisKKwlrZnJlZShwZXJfY3B1KHRocmVzaG9sZF9iYW5rcywgY3B1KVtiYW5rXS0+YmxvY2tzKTsKKwlwZXJfY3B1KHRocmVzaG9sZF9iYW5rcywgY3B1KVtiYW5rXS0+YmxvY2tzID0gTlVMTDsKK30KKwogc3RhdGljIF9fY3B1aW5pdCB2b2lkIHRocmVzaG9sZF9yZW1vdmVfYmFuayh1bnNpZ25lZCBpbnQgY3B1LCBpbnQgYmFuaykKIHsKKwlpbnQgaSA9IDA7CiAJc3RydWN0IHRocmVzaG9sZF9iYW5rICpiOwotCWNoYXIgbmFtZVsxNl07CisJY2hhciBuYW1lWzMyXTsKIAogCWIgPSBwZXJfY3B1KHRocmVzaG9sZF9iYW5rcywgY3B1KVtiYW5rXTsKKwogCWlmICghYikKIAkJcmV0dXJuOwotCWlmIChzaGFyZWRfYmFua1tiYW5rXSAmJiBhdG9taWNfcmVhZCgmYi0+a29iai5rcmVmLnJlZmNvdW50KSA+IDIpIHsKLQkJc3ByaW50ZihuYW1lLCAiYmFuayVpIiwgYmFuayk7Ci0JCXN5c2ZzX3JlbW92ZV9saW5rKCZwZXJfY3B1KGRldmljZV90aHJlc2hvbGQsIGNwdSkua29iaiwgbmFtZSk7Ci0JCXBlcl9jcHUodGhyZXNob2xkX2JhbmtzLCBjcHUpW2JhbmtdID0gTlVMTDsKLQl9IGVsc2UgewotCQlrb2JqZWN0X3VucmVnaXN0ZXIoJmItPmtvYmopOwotCQlrZnJlZShwZXJfY3B1KHRocmVzaG9sZF9iYW5rcywgY3B1KVtiYW5rXSk7CisKKwlpZiAoIWItPmJsb2NrcykKKwkJZ290byBmcmVlX291dDsKKworCXNwcmludGYobmFtZSwgInRocmVzaG9sZF9iYW5rJWkiLCBiYW5rKTsKKworCS8qIHNpYmxpbmcgc3ltbGluayAqLworCWlmIChzaGFyZWRfYmFua1tiYW5rXSAmJiBiLT5ibG9ja3MtPmNwdSAhPSBjcHUpIHsKKwkJc3lzZnNfcmVtb3ZlX2xpbmsoJnBlcl9jcHUoZGV2aWNlX21jZSwgY3B1KS5rb2JqLCBuYW1lKTsKKwkJcGVyX2NwdSh0aHJlc2hvbGRfYmFua3MsIGkpW2JhbmtdID0gTlVMTDsKKwkJcmV0dXJuOwogCX0KKworCS8qIHJlbW92ZSBhbGwgc2libGluZyBzeW1saW5rcyBiZWZvcmUgdW5yZWdpc3RlcmluZyAqLworCWZvcl9lYWNoX2NwdV9tYXNrKGksIGItPmNwdXMpIHsKKwkJaWYgKGkgPT0gY3B1KQorCQkJY29udGludWU7CisKKwkJc3lzZnNfcmVtb3ZlX2xpbmsoJnBlcl9jcHUoZGV2aWNlX21jZSwgaSkua29iaiwgbmFtZSk7CisJCXBlcl9jcHUodGhyZXNob2xkX2JhbmtzLCBpKVtiYW5rXSA9IE5VTEw7CisJfQorCisJZGVhbGxvY2F0ZV90aHJlc2hvbGRfYmxvY2soY3B1LCBiYW5rKTsKKworZnJlZV9vdXQ6CisJa29iamVjdF91bnJlZ2lzdGVyKCZiLT5rb2JqKTsKKwlrZnJlZShiKTsKKwlwZXJfY3B1KHRocmVzaG9sZF9iYW5rcywgY3B1KVtiYW5rXSA9IE5VTEw7CiB9CiAKIHN0YXRpYyBfX2NwdWluaXQgdm9pZCB0aHJlc2hvbGRfcmVtb3ZlX2RldmljZSh1bnNpZ25lZCBpbnQgY3B1KQogewotCWludCBiYW5rOworCXVuc2lnbmVkIGludCBiYW5rOwogCiAJZm9yIChiYW5rID0gMDsgYmFuayA8IE5SX0JBTktTOyArK2JhbmspIHsKIAkJaWYgKCEocGVyX2NwdShiYW5rX21hcCwgY3B1KSAmIDEgPDwgYmFuaykpCiAJCQljb250aW51ZTsKIAkJdGhyZXNob2xkX3JlbW92ZV9iYW5rKGNwdSwgYmFuayk7CiAJfQotCXN5c2Rldl91bnJlZ2lzdGVyKCZwZXJfY3B1KGRldmljZV90aHJlc2hvbGQsIGNwdSkpOwogfQogCi0vKiBsaW5rIGFsbCBleGlzdGluZyBzaWJsaW5ncyB3aGVuIGZpcnN0IGNvcmUgY29tZXMgdXAgKi8KLXN0YXRpYyBfX2NwdWluaXQgaW50IHRocmVzaG9sZF9jcmVhdGVfc3ltbGlua3ModW5zaWduZWQgaW50IGNwdSkKLXsKLQlpbnQgYmFuaywgZXJyID0gMDsKLQl1bnNpZ25lZCBpbnQgbGNwdSA9IDA7Ci0KLQlpZiAoY3B1X2NvcmVfaWRbY3B1XSkKLQkJcmV0dXJuIDA7Ci0JZm9yX2VhY2hfY3B1X21hc2sobGNwdSwgY3B1X2NvcmVfbWFwW2NwdV0pIHsKLQkJaWYgKGxjcHUgPT0gY3B1KQotCQkJY29udGludWU7Ci0JCWZvciAoYmFuayA9IDA7IGJhbmsgPCBOUl9CQU5LUzsgKytiYW5rKSB7Ci0JCQlpZiAoIShwZXJfY3B1KGJhbmtfbWFwLCBjcHUpICYgMSA8PCBiYW5rKSkKLQkJCQljb250aW51ZTsKLQkJCWlmICghc2hhcmVkX2JhbmtbYmFua10pCi0JCQkJY29udGludWU7Ci0JCQllcnIgPSB0aHJlc2hvbGRfY3JlYXRlX2JhbmsobGNwdSwgYmFuayk7Ci0JCX0KLQl9Ci0JcmV0dXJuIGVycjsKLX0KLQotLyogcmVtb3ZlIGFsbCBzeW1saW5rcyBiZWZvcmUgZmlyc3QgY29yZSBkaWVzLiAqLwotc3RhdGljIF9fY3B1aW5pdCB2b2lkIHRocmVzaG9sZF9yZW1vdmVfc3ltbGlua3ModW5zaWduZWQgaW50IGNwdSkKLXsKLQlpbnQgYmFuazsKLQl1bnNpZ25lZCBpbnQgbGNwdSA9IDA7Ci0JaWYgKGNwdV9jb3JlX2lkW2NwdV0pCi0JCXJldHVybjsKLQlmb3JfZWFjaF9jcHVfbWFzayhsY3B1LCBjcHVfY29yZV9tYXBbY3B1XSkgewotCQlpZiAobGNwdSA9PSBjcHUpCi0JCQljb250aW51ZTsKLQkJZm9yIChiYW5rID0gMDsgYmFuayA8IE5SX0JBTktTOyArK2JhbmspIHsKLQkJCWlmICghKHBlcl9jcHUoYmFua19tYXAsIGNwdSkgJiAxIDw8IGJhbmspKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKCFzaGFyZWRfYmFua1tiYW5rXSkKLQkJCQljb250aW51ZTsKLQkJCXRocmVzaG9sZF9yZW1vdmVfYmFuayhsY3B1LCBiYW5rKTsKLQkJfQotCX0KLX0KICNlbHNlIC8qICFDT05GSUdfSE9UUExVR19DUFUgKi8KLXN0YXRpYyBfX2NwdWluaXQgdm9pZCB0aHJlc2hvbGRfY3JlYXRlX3N5bWxpbmtzKHVuc2lnbmVkIGludCBjcHUpCi17Ci19Ci1zdGF0aWMgX19jcHVpbml0IHZvaWQgdGhyZXNob2xkX3JlbW92ZV9zeW1saW5rcyh1bnNpZ25lZCBpbnQgY3B1KQotewotfQogc3RhdGljIHZvaWQgdGhyZXNob2xkX3JlbW92ZV9kZXZpY2UodW5zaWduZWQgaW50IGNwdSkKIHsKIH0KICNlbmRpZgogCiAvKiBnZXQgbm90aWZpZWQgd2hlbiBhIGNwdSBjb21lcyBvbi9vZmYgKi8KLXN0YXRpYyBpbnQgdGhyZXNob2xkX2NwdV9jYWxsYmFjayhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5mYiwKK3N0YXRpYyBpbnQgX19jcHVpbml0IHRocmVzaG9sZF9jcHVfY2FsbGJhY2soc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuZmIsCiAJCQkJCSAgICB1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqaGNwdSkKIHsKIAkvKiBjcHUgd2FzIHVuc2lnbmVkIGludCB0byBiZWdpbiB3aXRoICovCkBAIC00OTQsMTMgKzY0OCw2IEBACiAJc3dpdGNoIChhY3Rpb24pIHsKIAljYXNlIENQVV9PTkxJTkU6CiAJCXRocmVzaG9sZF9jcmVhdGVfZGV2aWNlKGNwdSk7Ci0JCXRocmVzaG9sZF9jcmVhdGVfc3ltbGlua3MoY3B1KTsKLQkJYnJlYWs7Ci0JY2FzZSBDUFVfRE9XTl9QUkVQQVJFOgotCQl0aHJlc2hvbGRfcmVtb3ZlX3N5bWxpbmtzKGNwdSk7Ci0JCWJyZWFrOwotCWNhc2UgQ1BVX0RPV05fRkFJTEVEOgotCQl0aHJlc2hvbGRfY3JlYXRlX3N5bWxpbmtzKGNwdSk7CiAJCWJyZWFrOwogCWNhc2UgQ1BVX0RFQUQ6CiAJCXRocmVzaG9sZF9yZW1vdmVfZGV2aWNlKGNwdSk7CkBAIC01MTIsMjkgKzY1OSwyMiBAQAogCXJldHVybiBOT1RJRllfT0s7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgdGhyZXNob2xkX2NwdV9ub3RpZmllciA9IHsKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgdGhyZXNob2xkX2NwdV9ub3RpZmllciBfX2NwdWluaXRkYXRhID0gewogCS5ub3RpZmllcl9jYWxsID0gdGhyZXNob2xkX2NwdV9jYWxsYmFjaywKIH07CiAKIHN0YXRpYyBfX2luaXQgaW50IHRocmVzaG9sZF9pbml0X2RldmljZSh2b2lkKQogewotCWludCBlcnI7Ci0JaW50IGxjcHUgPSAwOwotCi0JZXJyID0gc3lzZGV2X2NsYXNzX3JlZ2lzdGVyKCZ0aHJlc2hvbGRfc3lzY2xhc3MpOwotCWlmIChlcnIpCi0JCWdvdG8gb3V0OworCXVuc2lnbmVkIGxjcHUgPSAwOwogCiAJLyogdG8gaGl0IENQVXMgb25saW5lIGJlZm9yZSB0aGUgbm90aWZpZXIgaXMgdXAgKi8KIAlmb3JfZWFjaF9vbmxpbmVfY3B1KGxjcHUpIHsKLQkJZXJyID0gdGhyZXNob2xkX2NyZWF0ZV9kZXZpY2UobGNwdSk7CisJCWludCBlcnIgPSB0aHJlc2hvbGRfY3JlYXRlX2RldmljZShsY3B1KTsKIAkJaWYgKGVycikKLQkJCWdvdG8gb3V0OworCQkJcmV0dXJuIGVycjsKIAl9CiAJcmVnaXN0ZXJfY3B1X25vdGlmaWVyKCZ0aHJlc2hvbGRfY3B1X25vdGlmaWVyKTsKLQotICAgICAgb3V0OgotCXJldHVybiBlcnI7CisJcmV0dXJuIDA7CiB9CiAKIGRldmljZV9pbml0Y2FsbCh0aHJlc2hvbGRfaW5pdF9kZXZpY2UpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL21vZHVsZS5jIGIvYXJjaC94ODZfNjQva2VybmVsL21vZHVsZS5jCmluZGV4IGJhYzE5NWMuLjlkMDk1OGYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9tb2R1bGUuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvbW9kdWxlLmMKQEAgLTE0NSwyNiArMTQ1LDM4IEBACiAJcmV0dXJuIC1FTk9TWVM7CiB9IAogCi1leHRlcm4gdm9pZCBhcHBseV9hbHRlcm5hdGl2ZXModm9pZCAqc3RhcnQsIHZvaWQgKmVuZCk7IAotCiBpbnQgbW9kdWxlX2ZpbmFsaXplKGNvbnN0IEVsZl9FaGRyICpoZHIsCi0JCSAgICBjb25zdCBFbGZfU2hkciAqc2VjaGRycywKLQkJICAgIHN0cnVjdCBtb2R1bGUgKm1lKQorICAgICAgICAgICAgICAgICAgICBjb25zdCBFbGZfU2hkciAqc2VjaGRycywKKyAgICAgICAgICAgICAgICAgICAgc3RydWN0IG1vZHVsZSAqbWUpCiB7Ci0JY29uc3QgRWxmX1NoZHIgKnM7CisJY29uc3QgRWxmX1NoZHIgKnMsICp0ZXh0ID0gTlVMTCwgKmFsdCA9IE5VTEwsICpsb2NrcyA9IE5VTEw7CiAJY2hhciAqc2Vjc3RyaW5ncyA9ICh2b2lkICopaGRyICsgc2VjaGRyc1toZHItPmVfc2hzdHJuZHhdLnNoX29mZnNldDsKIAotCS8qIGxvb2sgZm9yIC5hbHRpbnN0cnVjdGlvbnMgdG8gcGF0Y2ggKi8gCi0JZm9yIChzID0gc2VjaGRyczsgcyA8IHNlY2hkcnMgKyBoZHItPmVfc2hudW07IHMrKykgeyAKLQkJdm9pZCAqc2VnOyAJCQotCQlpZiAoc3RyY21wKCIuYWx0aW5zdHJ1Y3Rpb25zIiwgc2Vjc3RyaW5ncyArIHMtPnNoX25hbWUpKQotCQkJY29udGludWU7Ci0JCXNlZyA9ICh2b2lkICopcy0+c2hfYWRkcjsgCi0JCWFwcGx5X2FsdGVybmF0aXZlcyhzZWcsIHNlZyArIHMtPnNoX3NpemUpOyAKLQl9IAkKKwlmb3IgKHMgPSBzZWNoZHJzOyBzIDwgc2VjaGRycyArIGhkci0+ZV9zaG51bTsgcysrKSB7CisJCWlmICghc3RyY21wKCIudGV4dCIsIHNlY3N0cmluZ3MgKyBzLT5zaF9uYW1lKSkKKwkJCXRleHQgPSBzOworCQlpZiAoIXN0cmNtcCgiLmFsdGluc3RydWN0aW9ucyIsIHNlY3N0cmluZ3MgKyBzLT5zaF9uYW1lKSkKKwkJCWFsdCA9IHM7CisJCWlmICghc3RyY21wKCIuc21wX2xvY2tzIiwgc2Vjc3RyaW5ncyArIHMtPnNoX25hbWUpKQorCQkJbG9ja3M9IHM7CisJfQorCisJaWYgKGFsdCkgeworCQkvKiBwYXRjaCAuYWx0aW5zdHJ1Y3Rpb25zICovCisJCXZvaWQgKmFzZWcgPSAodm9pZCAqKWFsdC0+c2hfYWRkcjsKKwkJYXBwbHlfYWx0ZXJuYXRpdmVzKGFzZWcsIGFzZWcgKyBhbHQtPnNoX3NpemUpOworCX0KKwlpZiAobG9ja3MgJiYgdGV4dCkgeworCQl2b2lkICpsc2VnID0gKHZvaWQgKilsb2Nrcy0+c2hfYWRkcjsKKwkJdm9pZCAqdHNlZyA9ICh2b2lkICopdGV4dC0+c2hfYWRkcjsKKwkJYWx0ZXJuYXRpdmVzX3NtcF9tb2R1bGVfYWRkKG1lLCBtZS0+bmFtZSwKKwkJCQkJICAgIGxzZWcsIGxzZWcgKyBsb2Nrcy0+c2hfc2l6ZSwKKwkJCQkJICAgIHRzZWcsIHRzZWcgKyB0ZXh0LT5zaF9zaXplKTsKKwl9CiAJcmV0dXJuIDA7CiB9CiAKIHZvaWQgbW9kdWxlX2FyY2hfY2xlYW51cChzdHJ1Y3QgbW9kdWxlICptb2QpCiB7CisJYWx0ZXJuYXRpdmVzX3NtcF9tb2R1bGVfZGVsKG1vZCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvbm1pLmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvbm1pLmMKaW5kZXggNGU2MzU3Zi4uMzk5NDg5YyAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL25taS5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9ubWkuYwpAQCAtMTUsMTEgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbWMxNDY4MThydGMuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L25taS5oPgpAQCAtMjcsMTQgKzIzLDExIEBACiAjaW5jbHVkZSA8bGludXgva3Byb2Jlcy5oPgogCiAjaW5jbHVkZSA8YXNtL3NtcC5oPgotI2luY2x1ZGUgPGFzbS9tdHJyLmg+Ci0jaW5jbHVkZSA8YXNtL21wc3BlYy5oPgogI2luY2x1ZGUgPGFzbS9ubWkuaD4KLSNpbmNsdWRlIDxhc20vbXNyLmg+CiAjaW5jbHVkZSA8YXNtL3Byb3RvLmg+CiAjaW5jbHVkZSA8YXNtL2tkZWJ1Zy5oPgotI2luY2x1ZGUgPGFzbS9sb2NhbC5oPgogI2luY2x1ZGUgPGFzbS9tY2UuaD4KKyNpbmNsdWRlIDxhc20vaW50ZWxfYXJjaF9wZXJmbW9uLmg+CiAKIC8qCiAgKiBsYXBpY19ubWlfb3duZXIgdHJhY2tzIHRoZSBvd25lcnNoaXAgb2YgdGhlIGxhcGljIE5NSSBoYXJkd2FyZToKQEAgLTc0LDYgKzY3LDkgQEAKICNkZWZpbmUgSzdfRVZFTlRfQ1lDTEVTX1BST0NFU1NPUl9JU19SVU5OSU5HCTB4NzYKICNkZWZpbmUgSzdfTk1JX0VWRU5UCQlLN19FVkVOVF9DWUNMRVNfUFJPQ0VTU09SX0lTX1JVTk5JTkcKIAorI2RlZmluZSBBUkNIX1BFUkZNT05fTk1JX0VWRU5UX1NFTAlBUkNIX1BFUkZNT05fVU5IQUxURURfQ09SRV9DWUNMRVNfU0VMCisjZGVmaW5lIEFSQ0hfUEVSRk1PTl9OTUlfRVZFTlRfVU1BU0sJQVJDSF9QRVJGTU9OX1VOSEFMVEVEX0NPUkVfQ1lDTEVTX1VNQVNLCisKICNkZWZpbmUgTVNSX1A0X01JU0NfRU5BQkxFCTB4MUEwCiAjZGVmaW5lIE1TUl9QNF9NSVNDX0VOQUJMRV9QRVJGX0FWQUlMCSgxPDw3KQogI2RlZmluZSBNU1JfUDRfTUlTQ19FTkFCTEVfUEVCU19VTkFWQUlMCSgxPDwxMikKQEAgLTEwNSw3ICsxMDEsMTAgQEAKIAljYXNlIFg4Nl9WRU5ET1JfQU1EOgogCQlyZXR1cm4gYm9vdF9jcHVfZGF0YS54ODYgPT0gMTU7CiAJY2FzZSBYODZfVkVORE9SX0lOVEVMOgotCQlyZXR1cm4gYm9vdF9jcHVfZGF0YS54ODYgPT0gMTU7CisJCWlmIChjcHVfaGFzKCZib290X2NwdV9kYXRhLCBYODZfRkVBVFVSRV9BUkNIX1BFUkZNT04pKQorCQkJcmV0dXJuIDE7CisJCWVsc2UKKwkJCXJldHVybiAoYm9vdF9jcHVfZGF0YS54ODYgPT0gMTUpOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTIxMSw2ICsyMTAsOCBAQAogCiBfX3NldHVwKCJubWlfd2F0Y2hkb2c9Iiwgc2V0dXBfbm1pX3dhdGNoZG9nKTsKIAorc3RhdGljIHZvaWQgZGlzYWJsZV9pbnRlbF9hcmNoX3dhdGNoZG9nKHZvaWQpOworCiBzdGF0aWMgdm9pZCBkaXNhYmxlX2xhcGljX25taV93YXRjaGRvZyh2b2lkKQogewogCWlmIChubWlfYWN0aXZlIDw9IDApCkBAIC0yMjMsNiArMjI0LDggQEAKIAkJaWYgKGJvb3RfY3B1X2RhdGEueDg2ID09IDE1KSB7CiAJCQl3cm1zcihNU1JfUDRfSVFfQ0NDUjAsIDAsIDApOwogCQkJd3Jtc3IoTVNSX1A0X0NSVV9FU0NSMCwgMCwgMCk7CisJCX0gZWxzZSBpZiAoY3B1X2hhcygmYm9vdF9jcHVfZGF0YSwgWDg2X0ZFQVRVUkVfQVJDSF9QRVJGTU9OKSkgeworCQkJZGlzYWJsZV9pbnRlbF9hcmNoX3dhdGNoZG9nKCk7CiAJCX0KIAkJYnJlYWs7CiAJfQpAQCAtMzc1LDYgKzM3OCw1MyBAQAogCXdybXNyKE1TUl9LN19FVk5UU0VMMCwgZXZudHNlbCwgMCk7CiB9CiAKK3N0YXRpYyB2b2lkIGRpc2FibGVfaW50ZWxfYXJjaF93YXRjaGRvZyh2b2lkKQoreworCXVuc2lnbmVkIGVieDsKKworCS8qCisJICogQ2hlY2sgd2hldGhlciB0aGUgQXJjaGl0ZWN0dXJhbCBQZXJmTW9uIHN1cHBvcnRzCisJICogVW5oYWx0ZWQgQ29yZSBDeWNsZXMgRXZlbnQgb3Igbm90LgorCSAqIE5PVEU6IENvcnJlc3BvbmRpbmcgYml0ID0gMCBpbiBlYnAgaW5kaWNhdGVzIGV2ZW50IHByZXNlbnQuCisJICovCisJZWJ4ID0gY3B1aWRfZWJ4KDEwKTsKKwlpZiAoIShlYnggJiBBUkNIX1BFUkZNT05fVU5IQUxURURfQ09SRV9DWUNMRVNfUFJFU0VOVCkpCisJCXdybXNyKE1TUl9BUkNIX1BFUkZNT05fRVZFTlRTRUwwLCAwLCAwKTsKK30KKworc3RhdGljIGludCBzZXR1cF9pbnRlbF9hcmNoX3dhdGNoZG9nKHZvaWQpCit7CisJdW5zaWduZWQgaW50IGV2bnRzZWw7CisJdW5zaWduZWQgZWJ4OworCisJLyoKKwkgKiBDaGVjayB3aGV0aGVyIHRoZSBBcmNoaXRlY3R1cmFsIFBlcmZNb24gc3VwcG9ydHMKKwkgKiBVbmhhbHRlZCBDb3JlIEN5Y2xlcyBFdmVudCBvciBub3QuCisJICogTk9URTogQ29ycmVzcG9uZGluZyBiaXQgPSAwIGluIGVicCBpbmRpY2F0ZXMgZXZlbnQgcHJlc2VudC4KKwkgKi8KKwllYnggPSBjcHVpZF9lYngoMTApOworCWlmICgoZWJ4ICYgQVJDSF9QRVJGTU9OX1VOSEFMVEVEX0NPUkVfQ1lDTEVTX1BSRVNFTlQpKQorCQlyZXR1cm4gMDsKKworCW5taV9wZXJmY3RyX21zciA9IE1TUl9BUkNIX1BFUkZNT05fUEVSRkNUUjA7CisKKwljbGVhcl9tc3JfcmFuZ2UoTVNSX0FSQ0hfUEVSRk1PTl9FVkVOVFNFTDAsIDIpOworCWNsZWFyX21zcl9yYW5nZShNU1JfQVJDSF9QRVJGTU9OX1BFUkZDVFIwLCAyKTsKKworCWV2bnRzZWwgPSBBUkNIX1BFUkZNT05fRVZFTlRTRUxfSU5UCisJCXwgQVJDSF9QRVJGTU9OX0VWRU5UU0VMX09TCisJCXwgQVJDSF9QRVJGTU9OX0VWRU5UU0VMX1VTUgorCQl8IEFSQ0hfUEVSRk1PTl9OTUlfRVZFTlRfU0VMCisJCXwgQVJDSF9QRVJGTU9OX05NSV9FVkVOVF9VTUFTSzsKKworCXdybXNyKE1TUl9BUkNIX1BFUkZNT05fRVZFTlRTRUwwLCBldm50c2VsLCAwKTsKKwl3cm1zcmwoTVNSX0FSQ0hfUEVSRk1PTl9QRVJGQ1RSMCwgLSgodTY0KWNwdV9raHogKiAxMDAwIC8gbm1pX2h6KSk7CisJYXBpY193cml0ZShBUElDX0xWVFBDLCBBUElDX0RNX05NSSk7CisJZXZudHNlbCB8PSBBUkNIX1BFUkZNT05fRVZFTlRTRUwwX0VOQUJMRTsKKwl3cm1zcihNU1JfQVJDSF9QRVJGTU9OX0VWRU5UU0VMMCwgZXZudHNlbCwgMCk7CisJcmV0dXJuIDE7Cit9CisKIAogc3RhdGljIGludCBzZXR1cF9wNF93YXRjaGRvZyh2b2lkKQogewpAQCAtNDI4LDEwICs0NzgsMTYgQEAKIAkJc2V0dXBfazdfd2F0Y2hkb2coKTsKIAkJYnJlYWs7CiAJY2FzZSBYODZfVkVORE9SX0lOVEVMOgotCQlpZiAoYm9vdF9jcHVfZGF0YS54ODYgIT0gMTUpCisJCWlmIChjcHVfaGFzKCZib290X2NwdV9kYXRhLCBYODZfRkVBVFVSRV9BUkNIX1BFUkZNT04pKSB7CisJCQlpZiAoIXNldHVwX2ludGVsX2FyY2hfd2F0Y2hkb2coKSkKKwkJCQlyZXR1cm47CisJCX0gZWxzZSBpZiAoYm9vdF9jcHVfZGF0YS54ODYgPT0gMTUpIHsKKwkJCWlmICghc2V0dXBfcDRfd2F0Y2hkb2coKSkKKwkJCQlyZXR1cm47CisJCX0gZWxzZSB7CiAJCQlyZXR1cm47Ci0JCWlmICghc2V0dXBfcDRfd2F0Y2hkb2coKSkKLQkJCXJldHVybjsKKwkJfQorCiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKQEAgLTUxNiw3ICs1NzIsMTQgQEAKICAJCQkgKi8KICAJCQl3cm1zcihNU1JfUDRfSVFfQ0NDUjAsIG5taV9wNF9jY2NyX3ZhbCwgMCk7CiAgCQkJYXBpY193cml0ZShBUElDX0xWVFBDLCBBUElDX0RNX05NSSk7Ci0gCQl9CisgCQl9IGVsc2UgaWYgKG5taV9wZXJmY3RyX21zciA9PSBNU1JfQVJDSF9QRVJGTU9OX1BFUkZDVFIwKSB7CisJCQkvKgorCQkJICogRm9yIEludGVsIGJhc2VkIGFyY2hpdGVjdHVyYWwgcGVyZm1vbgorCQkJICogLSBMVlRQQyBpcyBtYXNrZWQgb24gaW50ZXJydXB0IGFuZCBtdXN0IGJlCisJCQkgKiAgIHVubWFza2VkIGJ5IHRoZSBMVlRQQyBoYW5kbGVyLgorCQkJICovCisJCQlhcGljX3dyaXRlKEFQSUNfTFZUUEMsIEFQSUNfRE1fTk1JKTsKKwkJfQogCQl3cm1zcmwobm1pX3BlcmZjdHJfbXNyLCAtKCh1NjQpY3B1X2toeiAqIDEwMDAgLyBubWlfaHopKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvcGNpLWNhbGdhcnkuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9wY2ktY2FsZ2FyeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5MWNiODQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvcGNpLWNhbGdhcnkuYwpAQCAtMCwwICsxLDEwMTggQEAKKy8qCisgKiBEZXJpdmVkIGZyb20gYXJjaC9wb3dlcnBjL2tlcm5lbC9pb21tdS5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2IEpvbiBNYXNvbiA8amRtYXNvbkB1cy5pYm0uY29tPiwgSUJNIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgTXVsaSBCZW4tWWVodWRhIDxtdWxpQGlsLmlibS5jb20+LCBJQk0gQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2lfaWRzLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxhc20vcHJvdG8uaD4KKyNpbmNsdWRlIDxhc20vY2FsZ2FyeS5oPgorI2luY2x1ZGUgPGFzbS90Y2UuaD4KKyNpbmNsdWRlIDxhc20vcGNpLWRpcmVjdC5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JQk1fQ0FMR0FSWSAweDAyYTEKKyNkZWZpbmUgUENJX1ZFTkRPUl9ERVZJQ0VfSURfQ0FMR0FSWSBcCisJKFBDSV9WRU5ET1JfSURfSUJNIHwgUENJX0RFVklDRV9JRF9JQk1fQ0FMR0FSWSA8PCAxNikKKworLyogd2UgbmVlZCB0aGVzZSBmb3IgcmVnaXN0ZXIgc3BhY2UgYWRkcmVzcyBjYWxjdWxhdGlvbiAqLworI2RlZmluZSBTVEFSVF9BRERSRVNTICAgICAgICAgICAweGZlMDAwMDAwCisjZGVmaW5lIENIQVNTSVNfQkFTRSAgICAgICAgICAgIDAKKyNkZWZpbmUgT05FX0JBU0VEX0NIQVNTSVNfTlVNICAgMQorCisvKiByZWdpc3RlciBvZmZzZXRzIGluc2lkZSB0aGUgaG9zdCBicmlkZ2Ugc3BhY2UgKi8KKyNkZWZpbmUgUEhCX0NTUl9PRkZTRVQJCTB4MDExMAorI2RlZmluZSBQSEJfUExTU1JfT0ZGU0VUCTB4MDEyMAorI2RlZmluZSBQSEJfQ09ORklHX1JXX09GRlNFVAkweDAxNjAKKyNkZWZpbmUgUEhCX0lPQkFTRV9CQVJfTE9XCTB4MDE3MAorI2RlZmluZSBQSEJfSU9CQVNFX0JBUl9ISUdICTB4MDE4MAorI2RlZmluZSBQSEJfTUVNXzFfTE9XCQkweDAxOTAKKyNkZWZpbmUgUEhCX01FTV8xX0hJR0gJCTB4MDFBMAorI2RlZmluZSBQSEJfSU9fQUREUl9TSVpFCTB4MDFCMAorI2RlZmluZSBQSEJfTUVNXzFfU0laRQkJMHgwMUMwCisjZGVmaW5lIFBIQl9NRU1fU1RfT0ZGU0VUCTB4MDFEMAorI2RlZmluZSBQSEJfQUVSX09GRlNFVAkJMHgwMjAwCisjZGVmaW5lIFBIQl9DT05GSUdfMF9ISUdICTB4MDIyMAorI2RlZmluZSBQSEJfQ09ORklHXzBfTE9XCTB4MDIzMAorI2RlZmluZSBQSEJfQ09ORklHXzBfRU5ECTB4MDI0MAorI2RlZmluZSBQSEJfTUVNXzJfTE9XCQkweDAyQjAKKyNkZWZpbmUgUEhCX01FTV8yX0hJR0gJCTB4MDJDMAorI2RlZmluZSBQSEJfTUVNXzJfU0laRV9ISUdICTB4MDJEMAorI2RlZmluZSBQSEJfTUVNXzJfU0laRV9MT1cJMHgwMkUwCisjZGVmaW5lIFBIQl9ET1NIT0xFX09GRlNFVAkweDA4RTAKKworLyogUEhCX0NPTkZJR19SVyAqLworI2RlZmluZSBQSEJfVENFX0VOQUJMRQkJMHgyMDAwMDAwMAorI2RlZmluZSBQSEJfU0xPVF9ESVNBQkxFCTB4MUMwMDAwMDAKKyNkZWZpbmUgUEhCX0RBQ19ESVNBQkxFCQkweDAxMDAwMDAwCisjZGVmaW5lIFBIQl9NRU0yX0VOQUJMRQkJMHgwMDQwMDAwMAorI2RlZmluZSBQSEJfTUNTUl9FTkFCTEUJCTB4MDAxMDAwMDAKKy8qIFRBUiAoVGFibGUgQWRkcmVzcyBSZWdpc3RlcikgKi8KKyNkZWZpbmUgVEFSX1NXX0JJVFMJCTB4MDAwMGZmZmZmZmZmODAwZlVMCisjZGVmaW5lIFRBUl9WQUxJRAkJMHgwMDAwMDAwMDAwMDAwMDA4VUwKKy8qIENTUiAoQ2hhbm5lbC9ETUEgU3RhdHVzIFJlZ2lzdGVyKSAqLworI2RlZmluZSBDU1JfQUdFTlRfTUFTSwkJMHhmZmUwZmZmZgorCisjZGVmaW5lIE1BWF9OVU1fT0ZfUEhCUwkJOCAvKiBob3cgbWFueSBQSEJzIGluIHRvdGFsPyAqLworI2RlZmluZSBNQVhfUEhCX0JVU19OVU0JCShNQVhfTlVNX09GX1BIQlMgKiAyKSAvKiBtYXggZGV2LT5idXMtPm51bWJlciAqLworI2RlZmluZSBQSEJTX1BFUl9DQUxHQVJZCTQKKworLyogcmVnaXN0ZXIgb2Zmc2V0cyBpbiBDYWxnYXJ5J3MgaW50ZXJuYWwgcmVnaXN0ZXIgc3BhY2UgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIHRhcl9vZmZzZXRzW10gPSB7CisJMHgwNTgwIC8qIFRBUjAgKi8sCisJMHgwNTg4IC8qIFRBUjEgKi8sCisJMHgwNTkwIC8qIFRBUjIgKi8sCisJMHgwNTk4IC8qIFRBUjMgKi8KK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIHNwbGl0X3F1ZXVlX29mZnNldHNbXSA9IHsKKwkweDQ4NzAgLyogU1BMSVQgUVVFVUUgMCAqLywKKwkweDU4NzAgLyogU1BMSVQgUVVFVUUgMSAqLywKKwkweDY4NzAgLyogU1BMSVQgUVVFVUUgMiAqLywKKwkweDc4NzAgLyogU1BMSVQgUVVFVUUgMyAqLworfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgcGhiX29mZnNldHNbXSA9IHsKKwkweDgwMDAgLyogUEhCMCAqLywKKwkweDkwMDAgLyogUEhCMSAqLywKKwkweEEwMDAgLyogUEhCMiAqLywKKwkweEIwMDAgLyogUEhCMyAqLworfTsKKwordm9pZCogdGNlX3RhYmxlX2t2YVtNQVhfTlVNX09GX1BIQlMgKiBNQVhfTlVNTk9ERVNdOwordW5zaWduZWQgaW50IHNwZWNpZmllZF90YWJsZV9zaXplID0gVENFX1RBQkxFX1NJWkVfVU5TUEVDSUZJRUQ7CitzdGF0aWMgaW50IHRyYW5zbGF0ZV9lbXB0eV9zbG90cyBfX3JlYWRfbW9zdGx5ID0gMDsKK3N0YXRpYyBpbnQgY2FsZ2FyeV9kZXRlY3RlZCBfX3JlYWRfbW9zdGx5ID0gMDsKKworLyoKKyAqIHRoZSBiaXRtYXAgb2YgUEhCcyB0aGUgdXNlciByZXF1ZXN0ZWQgdGhhdCB3ZSBkaXNhYmxlCisgKiB0cmFuc2xhdGlvbiBvbi4KKyAqLworc3RhdGljIERFQ0xBUkVfQklUTUFQKHRyYW5zbGF0aW9uX2Rpc2FibGVkLCBNQVhfTlVNTk9ERVMgKiBNQVhfUEhCX0JVU19OVU0pOworCitzdGF0aWMgdm9pZCB0Y2VfY2FjaGVfYmxhc3Qoc3RydWN0IGlvbW11X3RhYmxlICp0YmwpOworCisvKiBlbmFibGUgdGhpcyB0byBzdHJlc3MgdGVzdCB0aGUgY2hpcCdzIFRDRSBjYWNoZSAqLworI2lmZGVmIENPTkZJR19JT01NVV9ERUJVRworc3RhdGljIGlubGluZSB2b2lkIHRjZV9jYWNoZV9ibGFzdF9zdHJlc3Moc3RydWN0IGlvbW11X3RhYmxlICp0YmwpCit7CisJdGNlX2NhY2hlX2JsYXN0KHRibCk7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIHRjZV9jYWNoZV9ibGFzdF9zdHJlc3Moc3RydWN0IGlvbW11X3RhYmxlICp0YmwpCit7Cit9CisjZW5kaWYgLyogQkxBU1RfVENFX0NBQ0hFX09OX1VOTUFQICovCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IG51bV9kbWFfcGFnZXModW5zaWduZWQgbG9uZyBkbWEsIHVuc2lnbmVkIGludCBkbWFsZW4pCit7CisJdW5zaWduZWQgaW50IG5wYWdlczsKKworCW5wYWdlcyA9IFBBR0VfQUxJR04oZG1hICsgZG1hbGVuKSAtIChkbWEgJiBQQUdFX01BU0spOworCW5wYWdlcyA+Pj0gUEFHRV9TSElGVDsKKworCXJldHVybiBucGFnZXM7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHRyYW5zbGF0ZV9waGIoc3RydWN0IHBjaV9kZXYqIGRldikKK3sKKwlpbnQgZGlzYWJsZWQgPSB0ZXN0X2JpdChkZXYtPmJ1cy0+bnVtYmVyLCB0cmFuc2xhdGlvbl9kaXNhYmxlZCk7CisJcmV0dXJuICFkaXNhYmxlZDsKK30KKworc3RhdGljIHZvaWQgaW9tbXVfcmFuZ2VfcmVzZXJ2ZShzdHJ1Y3QgaW9tbXVfdGFibGUgKnRibCwKKyAgICAgICAgdW5zaWduZWQgbG9uZyBzdGFydF9hZGRyLCB1bnNpZ25lZCBpbnQgbnBhZ2VzKQoreworCXVuc2lnbmVkIGxvbmcgaW5kZXg7CisJdW5zaWduZWQgbG9uZyBlbmQ7CisKKwlpbmRleCA9IHN0YXJ0X2FkZHIgPj4gUEFHRV9TSElGVDsKKworCS8qIGJhaWwgb3V0IGlmIHdlJ3JlIGFza2VkIHRvIHJlc2VydmUgYSByZWdpb24gd2UgZG9uJ3QgY292ZXIgKi8KKwlpZiAoaW5kZXggPj0gdGJsLT5pdF9zaXplKQorCQlyZXR1cm47CisKKwllbmQgPSBpbmRleCArIG5wYWdlczsKKwlpZiAoZW5kID4gdGJsLT5pdF9zaXplKSAvKiBkb24ndCBnbyBvZmYgdGhlIHRhYmxlICovCisJCWVuZCA9IHRibC0+aXRfc2l6ZTsKKworCXdoaWxlIChpbmRleCA8IGVuZCkgeworCQlpZiAodGVzdF9iaXQoaW5kZXgsIHRibC0+aXRfbWFwKSkKKwkJCXByaW50ayhLRVJOX0VSUiAiQ2FsZ2FyeTogZW50cnkgYWxyZWFkeSBhbGxvY2F0ZWQgYXQgIgorCQkJICAgICAgICIweCVseCB0YmwgJXAgZG1hIDB4JWx4IG5wYWdlcyAldVxuIiwKKwkJCSAgICAgICBpbmRleCwgdGJsLCBzdGFydF9hZGRyLCBucGFnZXMpOworCQkrK2luZGV4OworCX0KKwlzZXRfYml0X3N0cmluZyh0YmwtPml0X21hcCwgc3RhcnRfYWRkciA+PiBQQUdFX1NISUZULCBucGFnZXMpOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBpb21tdV9yYW5nZV9hbGxvYyhzdHJ1Y3QgaW9tbXVfdGFibGUgKnRibCwKKwl1bnNpZ25lZCBpbnQgbnBhZ2VzKQoreworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworCisJQlVHX09OKG5wYWdlcyA9PSAwKTsKKworCW9mZnNldCA9IGZpbmRfbmV4dF96ZXJvX3N0cmluZyh0YmwtPml0X21hcCwgdGJsLT5pdF9oaW50LAorCQkJCSAgICAgICB0YmwtPml0X3NpemUsIG5wYWdlcyk7CisJaWYgKG9mZnNldCA9PSB+MFVMKSB7CisJCXRjZV9jYWNoZV9ibGFzdCh0YmwpOworCQlvZmZzZXQgPSBmaW5kX25leHRfemVyb19zdHJpbmcodGJsLT5pdF9tYXAsIDAsCisJCQkJCSAgICAgICB0YmwtPml0X3NpemUsIG5wYWdlcyk7CisJCWlmIChvZmZzZXQgPT0gfjBVTCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQ2FsZ2FyeTogSU9NTVUgZnVsbC5cbiIpOworCQkJaWYgKHBhbmljX29uX292ZXJmbG93KQorCQkJCXBhbmljKCJDYWxnYXJ5OiBmaXggdGhlIGFsbG9jYXRvci5cbiIpOworCQkJZWxzZQorCQkJCXJldHVybiBiYWRfZG1hX2FkZHJlc3M7CisJCX0KKwl9CisKKwlzZXRfYml0X3N0cmluZyh0YmwtPml0X21hcCwgb2Zmc2V0LCBucGFnZXMpOworCXRibC0+aXRfaGludCA9IG9mZnNldCArIG5wYWdlczsKKwlCVUdfT04odGJsLT5pdF9oaW50ID4gdGJsLT5pdF9zaXplKTsKKworCXJldHVybiBvZmZzZXQ7Cit9CisKK3N0YXRpYyBkbWFfYWRkcl90IGlvbW11X2FsbG9jKHN0cnVjdCBpb21tdV90YWJsZSAqdGJsLCB2b2lkICp2YWRkciwKKwl1bnNpZ25lZCBpbnQgbnBhZ2VzLCBpbnQgZGlyZWN0aW9uKQoreworCXVuc2lnbmVkIGxvbmcgZW50cnksIGZsYWdzOworCWRtYV9hZGRyX3QgcmV0ID0gYmFkX2RtYV9hZGRyZXNzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnRibC0+aXRfbG9jaywgZmxhZ3MpOworCisJZW50cnkgPSBpb21tdV9yYW5nZV9hbGxvYyh0YmwsIG5wYWdlcyk7CisKKwlpZiAodW5saWtlbHkoZW50cnkgPT0gYmFkX2RtYV9hZGRyZXNzKSkKKwkJZ290byBlcnJvcjsKKworCS8qIHNldCB0aGUgcmV0dXJuIGRtYSBhZGRyZXNzICovCisJcmV0ID0gKGVudHJ5IDw8IFBBR0VfU0hJRlQpIHwgKCh1bnNpZ25lZCBsb25nKXZhZGRyICYgflBBR0VfTUFTSyk7CisKKwkvKiBwdXQgdGhlIFRDRXMgaW4gdGhlIEhXIHRhYmxlICovCisJdGNlX2J1aWxkKHRibCwgZW50cnksIG5wYWdlcywgKHVuc2lnbmVkIGxvbmcpdmFkZHIgJiBQQUdFX01BU0ssCisJCSAgZGlyZWN0aW9uKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRibC0+aXRfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKKworZXJyb3I6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGJsLT5pdF9sb2NrLCBmbGFncyk7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiQ2FsZ2FyeTogZmFpbGVkIHRvIGFsbG9jYXRlICV1IHBhZ2VzIGluICIKKwkgICAgICAgImlvbW11ICVwXG4iLCBucGFnZXMsIHRibCk7CisJcmV0dXJuIGJhZF9kbWFfYWRkcmVzczsKK30KKworc3RhdGljIHZvaWQgX19pb21tdV9mcmVlKHN0cnVjdCBpb21tdV90YWJsZSAqdGJsLCBkbWFfYWRkcl90IGRtYV9hZGRyLAorCXVuc2lnbmVkIGludCBucGFnZXMpCit7CisJdW5zaWduZWQgbG9uZyBlbnRyeTsKKwl1bnNpZ25lZCBsb25nIGk7CisKKwllbnRyeSA9IGRtYV9hZGRyID4+IFBBR0VfU0hJRlQ7CisKKwlCVUdfT04oZW50cnkgKyBucGFnZXMgPiB0YmwtPml0X3NpemUpOworCisJdGNlX2ZyZWUodGJsLCBlbnRyeSwgbnBhZ2VzKTsKKworCWZvciAoaSA9IDA7IGkgPCBucGFnZXM7ICsraSkgeworCQlpZiAoIXRlc3RfYml0KGVudHJ5ICsgaSwgdGJsLT5pdF9tYXApKQorCQkJcHJpbnRrKEtFUk5fRVJSICJDYWxnYXJ5OiBiaXQgaXMgb2ZmIGF0IDB4JWx4ICIKKwkJCSAgICAgICAidGJsICVwIGRtYSAweCVMeCBlbnRyeSAweCVseCBucGFnZXMgJXVcbiIsCisJCQkgICAgICAgZW50cnkgKyBpLCB0YmwsIGRtYV9hZGRyLCBlbnRyeSwgbnBhZ2VzKTsKKwl9CisKKwlfX2NsZWFyX2JpdF9zdHJpbmcodGJsLT5pdF9tYXAsIGVudHJ5LCBucGFnZXMpOworCisJdGNlX2NhY2hlX2JsYXN0X3N0cmVzcyh0YmwpOworfQorCitzdGF0aWMgdm9pZCBpb21tdV9mcmVlKHN0cnVjdCBpb21tdV90YWJsZSAqdGJsLCBkbWFfYWRkcl90IGRtYV9hZGRyLAorCXVuc2lnbmVkIGludCBucGFnZXMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ0YmwtPml0X2xvY2ssIGZsYWdzKTsKKworCV9faW9tbXVfZnJlZSh0YmwsIGRtYV9hZGRyLCBucGFnZXMpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGJsLT5pdF9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIF9fY2FsZ2FyeV91bm1hcF9zZyhzdHJ1Y3QgaW9tbXVfdGFibGUgKnRibCwKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbGlzdCwgaW50IG5lbGVtcywgaW50IGRpcmVjdGlvbikKK3sKKwl3aGlsZSAobmVsZW1zLS0pIHsKKwkJdW5zaWduZWQgaW50IG5wYWdlczsKKwkJZG1hX2FkZHJfdCBkbWEgPSBzZ2xpc3QtPmRtYV9hZGRyZXNzOworCQl1bnNpZ25lZCBpbnQgZG1hbGVuID0gc2dsaXN0LT5kbWFfbGVuZ3RoOworCisJCWlmIChkbWFsZW4gPT0gMCkKKwkJCWJyZWFrOworCisJCW5wYWdlcyA9IG51bV9kbWFfcGFnZXMoZG1hLCBkbWFsZW4pOworCQlfX2lvbW11X2ZyZWUodGJsLCBkbWEsIG5wYWdlcyk7CisJCXNnbGlzdCsrOworCX0KK30KKwordm9pZCBjYWxnYXJ5X3VubWFwX3NnKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2xpc3QsCisJCSAgICAgIGludCBuZWxlbXMsIGludCBkaXJlY3Rpb24pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgaW9tbXVfdGFibGUgKnRibCA9IHRvX3BjaV9kZXYoZGV2KS0+YnVzLT5zZWxmLT5zeXNkYXRhOworCisJaWYgKCF0cmFuc2xhdGVfcGhiKHRvX3BjaV9kZXYoZGV2KSkpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ0YmwtPml0X2xvY2ssIGZsYWdzKTsKKworCV9fY2FsZ2FyeV91bm1hcF9zZyh0YmwsIHNnbGlzdCwgbmVsZW1zLCBkaXJlY3Rpb24pOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGJsLT5pdF9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgY2FsZ2FyeV9ub250cmFuc2xhdGVfbWFwX3NnKHN0cnVjdCBkZXZpY2UqIGRldiwKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCBpbnQgbmVsZW1zLCBpbnQgZGlyZWN0aW9uKQoreworCWludCBpOworCisgCWZvciAoaSA9IDA7IGkgPCBuZWxlbXM7IGkrKyApIHsKKwkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzID0gJnNnW2ldOworCQlCVUdfT04oIXMtPnBhZ2UpOworCQlzLT5kbWFfYWRkcmVzcyA9IHZpcnRfdG9fYnVzKHBhZ2VfYWRkcmVzcyhzLT5wYWdlKSArcy0+b2Zmc2V0KTsKKwkJcy0+ZG1hX2xlbmd0aCA9IHMtPmxlbmd0aDsKKwl9CisJcmV0dXJuIG5lbGVtczsKK30KKworaW50IGNhbGdhcnlfbWFwX3NnKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKKwlpbnQgbmVsZW1zLCBpbnQgZGlyZWN0aW9uKQoreworCXN0cnVjdCBpb21tdV90YWJsZSAqdGJsID0gdG9fcGNpX2RldihkZXYpLT5idXMtPnNlbGYtPnN5c2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBsb25nIHZhZGRyOworCXVuc2lnbmVkIGludCBucGFnZXM7CisJdW5zaWduZWQgbG9uZyBlbnRyeTsKKwlpbnQgaTsKKworCWlmICghdHJhbnNsYXRlX3BoYih0b19wY2lfZGV2KGRldikpKQorCQlyZXR1cm4gY2FsZ2FyeV9ub250cmFuc2xhdGVfbWFwX3NnKGRldiwgc2csIG5lbGVtcywgZGlyZWN0aW9uKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ0YmwtPml0X2xvY2ssIGZsYWdzKTsKKworCWZvciAoaSA9IDA7IGkgPCBuZWxlbXM7IGkrKyApIHsKKwkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzID0gJnNnW2ldOworCQlCVUdfT04oIXMtPnBhZ2UpOworCisJCXZhZGRyID0gKHVuc2lnbmVkIGxvbmcpcGFnZV9hZGRyZXNzKHMtPnBhZ2UpICsgcy0+b2Zmc2V0OworCQlucGFnZXMgPSBudW1fZG1hX3BhZ2VzKHZhZGRyLCBzLT5sZW5ndGgpOworCisJCWVudHJ5ID0gaW9tbXVfcmFuZ2VfYWxsb2ModGJsLCBucGFnZXMpOworCQlpZiAoZW50cnkgPT0gYmFkX2RtYV9hZGRyZXNzKSB7CisJCQkvKiBtYWtlcyBzdXJlIHVubWFwIGtub3dzIHRvIHN0b3AgKi8KKwkJCXMtPmRtYV9sZW5ndGggPSAwOworCQkJZ290byBlcnJvcjsKKwkJfQorCisJCXMtPmRtYV9hZGRyZXNzID0gKGVudHJ5IDw8IFBBR0VfU0hJRlQpIHwgcy0+b2Zmc2V0OworCisJCS8qIGluc2VydCBpbnRvIEhXIHRhYmxlICovCisJCXRjZV9idWlsZCh0YmwsIGVudHJ5LCBucGFnZXMsIHZhZGRyICYgUEFHRV9NQVNLLAorCQkJICBkaXJlY3Rpb24pOworCisJCXMtPmRtYV9sZW5ndGggPSBzLT5sZW5ndGg7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGJsLT5pdF9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gbmVsZW1zOworZXJyb3I6CisJX19jYWxnYXJ5X3VubWFwX3NnKHRibCwgc2csIG5lbGVtcywgZGlyZWN0aW9uKTsKKwlmb3IgKGkgPSAwOyBpIDwgbmVsZW1zOyBpKyspIHsKKwkJc2dbaV0uZG1hX2FkZHJlc3MgPSBiYWRfZG1hX2FkZHJlc3M7CisJCXNnW2ldLmRtYV9sZW5ndGggPSAwOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0YmwtPml0X2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworZG1hX2FkZHJfdCBjYWxnYXJ5X21hcF9zaW5nbGUoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICp2YWRkciwKKwlzaXplX3Qgc2l6ZSwgaW50IGRpcmVjdGlvbikKK3sKKwlkbWFfYWRkcl90IGRtYV9oYW5kbGUgPSBiYWRfZG1hX2FkZHJlc3M7CisJdW5zaWduZWQgbG9uZyB1YWRkcjsKKwl1bnNpZ25lZCBpbnQgbnBhZ2VzOworCXN0cnVjdCBpb21tdV90YWJsZSAqdGJsID0gdG9fcGNpX2RldihkZXYpLT5idXMtPnNlbGYtPnN5c2RhdGE7CisKKwl1YWRkciA9ICh1bnNpZ25lZCBsb25nKXZhZGRyOworCW5wYWdlcyA9IG51bV9kbWFfcGFnZXModWFkZHIsIHNpemUpOworCisJaWYgKHRyYW5zbGF0ZV9waGIodG9fcGNpX2RldihkZXYpKSkKKwkJZG1hX2hhbmRsZSA9IGlvbW11X2FsbG9jKHRibCwgdmFkZHIsIG5wYWdlcywgZGlyZWN0aW9uKTsKKwllbHNlCisJCWRtYV9oYW5kbGUgPSB2aXJ0X3RvX2J1cyh2YWRkcik7CisKKwlyZXR1cm4gZG1hX2hhbmRsZTsKK30KKwordm9pZCBjYWxnYXJ5X3VubWFwX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSwKKwlzaXplX3Qgc2l6ZSwgaW50IGRpcmVjdGlvbikKK3sKKwlzdHJ1Y3QgaW9tbXVfdGFibGUgKnRibCA9IHRvX3BjaV9kZXYoZGV2KS0+YnVzLT5zZWxmLT5zeXNkYXRhOworCXVuc2lnbmVkIGludCBucGFnZXM7CisKKwlpZiAoIXRyYW5zbGF0ZV9waGIodG9fcGNpX2RldihkZXYpKSkKKwkJcmV0dXJuOworCisJbnBhZ2VzID0gbnVtX2RtYV9wYWdlcyhkbWFfaGFuZGxlLCBzaXplKTsKKwlpb21tdV9mcmVlKHRibCwgZG1hX2hhbmRsZSwgbnBhZ2VzKTsKK30KKwordm9pZCogY2FsZ2FyeV9hbGxvY19jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLAorCWRtYV9hZGRyX3QgKmRtYV9oYW5kbGUsIGdmcF90IGZsYWcpCit7CisJdm9pZCAqcmV0ID0gTlVMTDsKKwlkbWFfYWRkcl90IG1hcHBpbmc7CisJdW5zaWduZWQgaW50IG5wYWdlcywgb3JkZXI7CisJc3RydWN0IGlvbW11X3RhYmxlICp0Ymw7CisKKwl0YmwgPSB0b19wY2lfZGV2KGRldiktPmJ1cy0+c2VsZi0+c3lzZGF0YTsKKworCXNpemUgPSBQQUdFX0FMSUdOKHNpemUpOyAvKiBzaXplIHJvdW5kZWQgdXAgdG8gZnVsbCBwYWdlcyAqLworCW5wYWdlcyA9IHNpemUgPj4gUEFHRV9TSElGVDsKKwlvcmRlciA9IGdldF9vcmRlcihzaXplKTsKKworCS8qIGFsbG9jIGVub3VnaCBwYWdlcyAoYW5kIHBvc3NpYmx5IG1vcmUpICovCisJcmV0ID0gKHZvaWQgKilfX2dldF9mcmVlX3BhZ2VzKGZsYWcsIG9yZGVyKTsKKwlpZiAoIXJldCkKKwkJZ290byBlcnJvcjsKKwltZW1zZXQocmV0LCAwLCBzaXplKTsKKworCWlmICh0cmFuc2xhdGVfcGhiKHRvX3BjaV9kZXYoZGV2KSkpIHsKKwkJLyogc2V0IHVwIHRjZXMgdG8gY292ZXIgdGhlIGFsbG9jYXRlZCByYW5nZSAqLworCQltYXBwaW5nID0gaW9tbXVfYWxsb2ModGJsLCByZXQsIG5wYWdlcywgRE1BX0JJRElSRUNUSU9OQUwpOworCQlpZiAobWFwcGluZyA9PSBiYWRfZG1hX2FkZHJlc3MpCisJCQlnb3RvIGZyZWU7CisKKwkJKmRtYV9oYW5kbGUgPSBtYXBwaW5nOworCX0gZWxzZSAvKiBub24gdHJhbnNsYXRlZCBzbG90ICovCisJCSpkbWFfaGFuZGxlID0gdmlydF90b19idXMocmV0KTsKKworCXJldHVybiByZXQ7CisKK2ZyZWU6CisJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZylyZXQsIGdldF9vcmRlcihzaXplKSk7CisJcmV0ID0gTlVMTDsKK2Vycm9yOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZG1hX21hcHBpbmdfb3BzIGNhbGdhcnlfZG1hX29wcyA9IHsKKwkuYWxsb2NfY29oZXJlbnQgPSBjYWxnYXJ5X2FsbG9jX2NvaGVyZW50LAorCS5tYXBfc2luZ2xlID0gY2FsZ2FyeV9tYXBfc2luZ2xlLAorCS51bm1hcF9zaW5nbGUgPSBjYWxnYXJ5X3VubWFwX3NpbmdsZSwKKwkubWFwX3NnID0gY2FsZ2FyeV9tYXBfc2csCisJLnVubWFwX3NnID0gY2FsZ2FyeV91bm1hcF9zZywKK307CisKK3N0YXRpYyBpbmxpbmUgaW50IGJ1c25vX3RvX3BoYmlkKHVuc2lnbmVkIGNoYXIgbnVtKQoreworCXJldHVybiBidXNfdG9fcGhiKG51bSkgJSBQSEJTX1BFUl9DQUxHQVJZOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgc3BsaXRfcXVldWVfb2Zmc2V0KHVuc2lnbmVkIGNoYXIgbnVtKQoreworCXNpemVfdCBpZHggPSBidXNub190b19waGJpZChudW0pOworCisJcmV0dXJuIHNwbGl0X3F1ZXVlX29mZnNldHNbaWR4XTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHRhcl9vZmZzZXQodW5zaWduZWQgY2hhciBudW0pCit7CisJc2l6ZV90IGlkeCA9IGJ1c25vX3RvX3BoYmlkKG51bSk7CisKKwlyZXR1cm4gdGFyX29mZnNldHNbaWR4XTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHBoYl9vZmZzZXQodW5zaWduZWQgY2hhciBudW0pCit7CisJc2l6ZV90IGlkeCA9IGJ1c25vX3RvX3BoYmlkKG51bSk7CisKKwlyZXR1cm4gcGhiX29mZnNldHNbaWR4XTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9faW9tZW0qIGNhbGdhcnlfcmVnKHZvaWQgX19pb21lbSAqYmFyLCB1bnNpZ25lZCBsb25nIG9mZnNldCkKK3sKKwl1bnNpZ25lZCBsb25nIHRhcmdldCA9ICgodW5zaWduZWQgbG9uZyliYXIpIHwgb2Zmc2V0OworCXJldHVybiAodm9pZCBfX2lvbWVtKil0YXJnZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHRjZV9jYWNoZV9ibGFzdChzdHJ1Y3QgaW9tbXVfdGFibGUgKnRibCkKK3sKKwl1NjQgdmFsOworCXUzMiBhZXI7CisJaW50IGkgPSAwOworCXZvaWQgX19pb21lbSAqYmJhciA9IHRibC0+YmJhcjsKKwl2b2lkIF9faW9tZW0gKnRhcmdldDsKKworCS8qIGRpc2FibGUgYXJiaXRyYXRpb24gb24gdGhlIGJ1cyAqLworCXRhcmdldCA9IGNhbGdhcnlfcmVnKGJiYXIsIHBoYl9vZmZzZXQodGJsLT5pdF9idXNubykgfCBQSEJfQUVSX09GRlNFVCk7CisJYWVyID0gcmVhZGwodGFyZ2V0KTsKKwl3cml0ZWwoMCwgdGFyZ2V0KTsKKworCS8qIHJlYWQgcGxzc3IgdG8gZW5zdXJlIGl0IGdvdCB0aGVyZSAqLworCXRhcmdldCA9IGNhbGdhcnlfcmVnKGJiYXIsIHBoYl9vZmZzZXQodGJsLT5pdF9idXNubykgfCBQSEJfUExTU1JfT0ZGU0VUKTsKKwl2YWwgPSByZWFkbCh0YXJnZXQpOworCisJLyogcG9sbCBzcGxpdCBxdWV1ZXMgdW50aWwgYWxsIERNQSBhY3Rpdml0eSBpcyBkb25lICovCisJdGFyZ2V0ID0gY2FsZ2FyeV9yZWcoYmJhciwgc3BsaXRfcXVldWVfb2Zmc2V0KHRibC0+aXRfYnVzbm8pKTsKKwlkbyB7CisJCXZhbCA9IHJlYWRxKHRhcmdldCk7CisJCWkrKzsKKwl9IHdoaWxlICgodmFsICYgMHhmZikgIT0gMHhmZiAmJiBpIDwgMTAwKTsKKwlpZiAoaSA9PSAxMDApCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkNhbGdhcnk6IFBDSSBidXMgbm90IHF1aWVzY2VkLCAiCisJCSAgICAgICAiY29udGludWluZyBhbnl3YXlcbiIpOworCisJLyogaW52YWxpZGF0ZSBUQ0UgY2FjaGUgKi8KKwl0YXJnZXQgPSBjYWxnYXJ5X3JlZyhiYmFyLCB0YXJfb2Zmc2V0KHRibC0+aXRfYnVzbm8pKTsKKwl3cml0ZXEodGJsLT50YXJfdmFsLCB0YXJnZXQpOworCisJLyogZW5hYmxlIGFyYml0cmF0aW9uICovCisJdGFyZ2V0ID0gY2FsZ2FyeV9yZWcoYmJhciwgcGhiX29mZnNldCh0YmwtPml0X2J1c25vKSB8IFBIQl9BRVJfT0ZGU0VUKTsKKwl3cml0ZWwoYWVyLCB0YXJnZXQpOworCSh2b2lkKXJlYWRsKHRhcmdldCk7IC8qIGZsdXNoICovCit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBjYWxnYXJ5X3Jlc2VydmVfbWVtX3JlZ2lvbihzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1NjQgc3RhcnQsCisJdTY0IGxpbWl0KQoreworCXVuc2lnbmVkIGludCBudW1wYWdlczsKKworCWxpbWl0ID0gbGltaXQgfCAweGZmZmZmOworCWxpbWl0Kys7CisKKwludW1wYWdlcyA9ICgobGltaXQgLSBzdGFydCkgPj4gUEFHRV9TSElGVCk7CisJaW9tbXVfcmFuZ2VfcmVzZXJ2ZShkZXYtPnN5c2RhdGEsIHN0YXJ0LCBudW1wYWdlcyk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBjYWxnYXJ5X3Jlc2VydmVfcGVyaXBoZXJhbF9tZW1fMShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXZvaWQgX19pb21lbSAqdGFyZ2V0OworCXU2NCBsb3csIGhpZ2gsIHNpemVsb3c7CisJdTY0IHN0YXJ0LCBsaW1pdDsKKwlzdHJ1Y3QgaW9tbXVfdGFibGUgKnRibCA9IGRldi0+c3lzZGF0YTsKKwl1bnNpZ25lZCBjaGFyIGJ1c251bSA9IGRldi0+YnVzLT5udW1iZXI7CisJdm9pZCBfX2lvbWVtICpiYmFyID0gdGJsLT5iYmFyOworCisJLyogcGVyaXBoZXJhbCBNRU1fMSByZWdpb24gKi8KKwl0YXJnZXQgPSBjYWxnYXJ5X3JlZyhiYmFyLCBwaGJfb2Zmc2V0KGJ1c251bSkgfCBQSEJfTUVNXzFfTE9XKTsKKwlsb3cgPSBiZTMyX3RvX2NwdShyZWFkbCh0YXJnZXQpKTsKKwl0YXJnZXQgPSBjYWxnYXJ5X3JlZyhiYmFyLCBwaGJfb2Zmc2V0KGJ1c251bSkgfCBQSEJfTUVNXzFfSElHSCk7CisJaGlnaCA9IGJlMzJfdG9fY3B1KHJlYWRsKHRhcmdldCkpOworCXRhcmdldCA9IGNhbGdhcnlfcmVnKGJiYXIsIHBoYl9vZmZzZXQoYnVzbnVtKSB8IFBIQl9NRU1fMV9TSVpFKTsKKwlzaXplbG93ID0gYmUzMl90b19jcHUocmVhZGwodGFyZ2V0KSk7CisKKwlzdGFydCA9IChoaWdoIDw8IDMyKSB8IGxvdzsKKwlsaW1pdCA9IHNpemVsb3c7CisKKwljYWxnYXJ5X3Jlc2VydmVfbWVtX3JlZ2lvbihkZXYsIHN0YXJ0LCBsaW1pdCk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBjYWxnYXJ5X3Jlc2VydmVfcGVyaXBoZXJhbF9tZW1fMihzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXZvaWQgX19pb21lbSAqdGFyZ2V0OworCXUzMiB2YWwzMjsKKwl1NjQgbG93LCBoaWdoLCBzaXplbG93LCBzaXplaGlnaDsKKwl1NjQgc3RhcnQsIGxpbWl0OworCXN0cnVjdCBpb21tdV90YWJsZSAqdGJsID0gZGV2LT5zeXNkYXRhOworCXVuc2lnbmVkIGNoYXIgYnVzbnVtID0gZGV2LT5idXMtPm51bWJlcjsKKwl2b2lkIF9faW9tZW0gKmJiYXIgPSB0YmwtPmJiYXI7CisKKwkvKiBpcyBpdCBlbmFibGVkPyAqLworCXRhcmdldCA9IGNhbGdhcnlfcmVnKGJiYXIsIHBoYl9vZmZzZXQoYnVzbnVtKSB8IFBIQl9DT05GSUdfUldfT0ZGU0VUKTsKKwl2YWwzMiA9IGJlMzJfdG9fY3B1KHJlYWRsKHRhcmdldCkpOworCWlmICghKHZhbDMyICYgUEhCX01FTTJfRU5BQkxFKSkKKwkJcmV0dXJuOworCisJdGFyZ2V0ID0gY2FsZ2FyeV9yZWcoYmJhciwgcGhiX29mZnNldChidXNudW0pIHwgUEhCX01FTV8yX0xPVyk7CisJbG93ID0gYmUzMl90b19jcHUocmVhZGwodGFyZ2V0KSk7CisJdGFyZ2V0ID0gY2FsZ2FyeV9yZWcoYmJhciwgcGhiX29mZnNldChidXNudW0pIHwgUEhCX01FTV8yX0hJR0gpOworCWhpZ2ggPSBiZTMyX3RvX2NwdShyZWFkbCh0YXJnZXQpKTsKKwl0YXJnZXQgPSBjYWxnYXJ5X3JlZyhiYmFyLCBwaGJfb2Zmc2V0KGJ1c251bSkgfCBQSEJfTUVNXzJfU0laRV9MT1cpOworCXNpemVsb3cgPSBiZTMyX3RvX2NwdShyZWFkbCh0YXJnZXQpKTsKKwl0YXJnZXQgPSBjYWxnYXJ5X3JlZyhiYmFyLCBwaGJfb2Zmc2V0KGJ1c251bSkgfCBQSEJfTUVNXzJfU0laRV9ISUdIKTsKKwlzaXplaGlnaCA9IGJlMzJfdG9fY3B1KHJlYWRsKHRhcmdldCkpOworCisJc3RhcnQgPSAoaGlnaCA8PCAzMikgfCBsb3c7CisJbGltaXQgPSAoc2l6ZWhpZ2ggPDwgMzIpIHwgc2l6ZWxvdzsKKworCWNhbGdhcnlfcmVzZXJ2ZV9tZW1fcmVnaW9uKGRldiwgc3RhcnQsIGxpbWl0KTsKK30KKworLyoKKyAqIHNvbWUgcmVnaW9ucyBvZiB0aGUgSU8gYWRkcmVzcyBzcGFjZSBkbyBub3QgZ2V0IHRyYW5zbGF0ZWQsIHNvIHdlCisgKiBtdXN0IG5vdCBnaXZlIGRldmljZXMgSU8gYWRkcmVzc2VzIGluIHRob3NlIHJlZ2lvbnMuIFRoZSByZWdpb25zCisgKiBhcmUgdGhlIDY0MEtCLTFNQiByZWdpb24gYW5kIHRoZSB0d28gUENJIHBlcmlwaGVyYWwgbWVtb3J5IGhvbGVzLgorICogUmVzZXJ2ZSBhbGwgb2YgdGhlbSBpbiB0aGUgSU9NTVUgYml0bWFwIHRvIGF2b2lkIGdpdmluZyB0aGVtIG91dAorICogbGF0ZXIuCisgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBjYWxnYXJ5X3Jlc2VydmVfcmVnaW9ucyhzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXVuc2lnbmVkIGludCBucGFnZXM7CisJdm9pZCBfX2lvbWVtICpiYmFyOworCXVuc2lnbmVkIGNoYXIgYnVzbnVtOworCXU2NCBzdGFydDsKKwlzdHJ1Y3QgaW9tbXVfdGFibGUgKnRibCA9IGRldi0+c3lzZGF0YTsKKworCWJiYXIgPSB0YmwtPmJiYXI7CisJYnVzbnVtID0gZGV2LT5idXMtPm51bWJlcjsKKworCS8qIHJlc2VydmUgYmFkX2RtYV9hZGRyZXNzIGluIGNhc2UgaXQncyBhIGxlZ2FsIGFkZHJlc3MgKi8KKwlpb21tdV9yYW5nZV9yZXNlcnZlKHRibCwgYmFkX2RtYV9hZGRyZXNzLCAxKTsKKworCS8qIGF2b2lkIHRoZSBCSU9TL1ZHQSBmaXJzdCA2NDBLQi0xTUIgcmVnaW9uICovCisJc3RhcnQgPSAoNjQwICogMTAyNCk7CisJbnBhZ2VzID0gKCgxMDI0IC0gNjQwKSAqIDEwMjQpID4+IFBBR0VfU0hJRlQ7CisJaW9tbXVfcmFuZ2VfcmVzZXJ2ZSh0YmwsIHN0YXJ0LCBucGFnZXMpOworCisJLyogcmVzZXJ2ZSB0aGUgdHdvIFBDSSBwZXJpcGhlcmFsIG1lbW9yeSByZWdpb25zIGluIElPIHNwYWNlICovCisJY2FsZ2FyeV9yZXNlcnZlX3BlcmlwaGVyYWxfbWVtXzEoZGV2KTsKKwljYWxnYXJ5X3Jlc2VydmVfcGVyaXBoZXJhbF9tZW1fMihkZXYpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBjYWxnYXJ5X3NldHVwX3RhcihzdHJ1Y3QgcGNpX2RldiAqZGV2LCB2b2lkIF9faW9tZW0gKmJiYXIpCit7CisJdTY0IHZhbDY0OworCXU2NCB0YWJsZV9waHlzOworCXZvaWQgX19pb21lbSAqdGFyZ2V0OworCWludCByZXQ7CisJc3RydWN0IGlvbW11X3RhYmxlICp0Ymw7CisKKwkvKiBidWlsZCBUQ0UgdGFibGVzIGZvciBlYWNoIFBIQiAqLworCXJldCA9IGJ1aWxkX3RjZV90YWJsZShkZXYsIGJiYXIpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwljYWxnYXJ5X3Jlc2VydmVfcmVnaW9ucyhkZXYpOworCisJLyogc2V0IFRBUnMgZm9yIGVhY2ggUEhCICovCisJdGFyZ2V0ID0gY2FsZ2FyeV9yZWcoYmJhciwgdGFyX29mZnNldChkZXYtPmJ1cy0+bnVtYmVyKSk7CisJdmFsNjQgPSBiZTY0X3RvX2NwdShyZWFkcSh0YXJnZXQpKTsKKworCS8qIHplcm8gb3V0IGFsbCBUQVIgYml0cyB1bmRlciBzdyBjb250cm9sICovCisJdmFsNjQgJj0gflRBUl9TV19CSVRTOworCisJdGJsID0gZGV2LT5zeXNkYXRhOworCXRhYmxlX3BoeXMgPSAodTY0KV9fcGEodGJsLT5pdF9iYXNlKTsKKwl2YWw2NCB8PSB0YWJsZV9waHlzOworCisJQlVHX09OKHNwZWNpZmllZF90YWJsZV9zaXplID4gVENFX1RBQkxFX1NJWkVfOE0pOworCXZhbDY0IHw9ICh1NjQpIHNwZWNpZmllZF90YWJsZV9zaXplOworCisJdGJsLT50YXJfdmFsID0gY3B1X3RvX2JlNjQodmFsNjQpOworCXdyaXRlcSh0YmwtPnRhcl92YWwsIHRhcmdldCk7CisJcmVhZHEodGFyZ2V0KTsgLyogZmx1c2ggKi8KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgY2FsZ2FyeV9mcmVlX3RhcihzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXU2NCB2YWw2NDsKKwlzdHJ1Y3QgaW9tbXVfdGFibGUgKnRibCA9IGRldi0+c3lzZGF0YTsKKwl2b2lkIF9faW9tZW0gKnRhcmdldDsKKworCXRhcmdldCA9IGNhbGdhcnlfcmVnKHRibC0+YmJhciwgdGFyX29mZnNldChkZXYtPmJ1cy0+bnVtYmVyKSk7CisJdmFsNjQgPSBiZTY0X3RvX2NwdShyZWFkcSh0YXJnZXQpKTsKKwl2YWw2NCAmPSB+VEFSX1NXX0JJVFM7CisJd3JpdGVxKGNwdV90b19iZTY0KHZhbDY0KSwgdGFyZ2V0KTsKKwlyZWFkcSh0YXJnZXQpOyAvKiBmbHVzaCAqLworCisJa2ZyZWUodGJsKTsKKwlkZXYtPnN5c2RhdGEgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZCBjYWxnYXJ5X3dhdGNoZG9nKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gKHN0cnVjdCBwY2lfZGV2ICopZGF0YTsKKwlzdHJ1Y3QgaW9tbXVfdGFibGUgKnRibCA9IGRldi0+c3lzZGF0YTsKKwl2b2lkIF9faW9tZW0gKmJiYXIgPSB0YmwtPmJiYXI7CisJdTMyIHZhbDMyOworCXZvaWQgX19pb21lbSAqdGFyZ2V0OworCisJdGFyZ2V0ID0gY2FsZ2FyeV9yZWcoYmJhciwgcGhiX29mZnNldCh0YmwtPml0X2J1c25vKSB8IFBIQl9DU1JfT0ZGU0VUKTsKKwl2YWwzMiA9IGJlMzJfdG9fY3B1KHJlYWRsKHRhcmdldCkpOworCisJLyogSWYgbm8gZXJyb3IsIHRoZSBhZ2VudCBJRCBpbiB0aGUgQ1NSIGlzIG5vdCB2YWxpZCAqLworCWlmICh2YWwzMiAmIENTUl9BR0VOVF9NQVNLKSB7CisJCXByaW50ayhLRVJOX0VNRVJHICJjYWxnYXJ5X3dhdGNoZG9nOiBETUEgZXJyb3Igb24gYnVzICVkLCAiCisJCQkJICAiQ1NSID0gJSN4XG4iLCBkZXYtPmJ1cy0+bnVtYmVyLCB2YWwzMik7CisJCXdyaXRlbCgwLCB0YXJnZXQpOworCisJCS8qIERpc2FibGUgYnVzIHRoYXQgY2F1c2VkIHRoZSBlcnJvciAqLworCQl0YXJnZXQgPSBjYWxnYXJ5X3JlZyhiYmFyLCBwaGJfb2Zmc2V0KHRibC0+aXRfYnVzbm8pIHwKKwkJCQkJICAgUEhCX0NPTkZJR19SV19PRkZTRVQpOworCQl2YWwzMiA9IGJlMzJfdG9fY3B1KHJlYWRsKHRhcmdldCkpOworCQl2YWwzMiB8PSBQSEJfU0xPVF9ESVNBQkxFOworCQl3cml0ZWwoY3B1X3RvX2JlMzIodmFsMzIpLCB0YXJnZXQpOworCQlyZWFkbCh0YXJnZXQpOyAvKiBmbHVzaCAqLworCX0gZWxzZSB7CisJCS8qIFJlc2V0IHRoZSB0aW1lciAqLworCQltb2RfdGltZXIoJnRibC0+d2F0Y2hkb2dfdGltZXIsIGppZmZpZXMgKyAyICogSFopOworCX0KK30KKworc3RhdGljIHZvaWQgX19pbml0IGNhbGdhcnlfZW5hYmxlX3RyYW5zbGF0aW9uKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJdTMyIHZhbDMyOworCXVuc2lnbmVkIGNoYXIgYnVzbnVtOworCXZvaWQgX19pb21lbSAqdGFyZ2V0OworCXZvaWQgX19pb21lbSAqYmJhcjsKKwlzdHJ1Y3QgaW9tbXVfdGFibGUgKnRibDsKKworCWJ1c251bSA9IGRldi0+YnVzLT5udW1iZXI7CisJdGJsID0gZGV2LT5zeXNkYXRhOworCWJiYXIgPSB0YmwtPmJiYXI7CisKKwkvKiBlbmFibGUgVENFIGluIFBIQiBDb25maWcgUmVnaXN0ZXIgKi8KKwl0YXJnZXQgPSBjYWxnYXJ5X3JlZyhiYmFyLCBwaGJfb2Zmc2V0KGJ1c251bSkgfCBQSEJfQ09ORklHX1JXX09GRlNFVCk7CisJdmFsMzIgPSBiZTMyX3RvX2NwdShyZWFkbCh0YXJnZXQpKTsKKwl2YWwzMiB8PSBQSEJfVENFX0VOQUJMRSB8IFBIQl9EQUNfRElTQUJMRSB8IFBIQl9NQ1NSX0VOQUJMRTsKKworCXByaW50ayhLRVJOX0lORk8gIkNhbGdhcnk6IGVuYWJsaW5nIHRyYW5zbGF0aW9uIG9uIFBIQiAlZFxuIiwgYnVzbnVtKTsKKwlwcmludGsoS0VSTl9JTkZPICJDYWxnYXJ5OiBlcnJhbnQgRE1BcyB3aWxsIG5vdyBiZSBwcmV2ZW50ZWQgb24gdGhpcyAiCisJICAgICAgICJidXMuXG4iKTsKKworCXdyaXRlbChjcHVfdG9fYmUzMih2YWwzMiksIHRhcmdldCk7CisJcmVhZGwodGFyZ2V0KTsgLyogZmx1c2ggKi8KKworCWluaXRfdGltZXIoJnRibC0+d2F0Y2hkb2dfdGltZXIpOworCXRibC0+d2F0Y2hkb2dfdGltZXIuZnVuY3Rpb24gPSAmY2FsZ2FyeV93YXRjaGRvZzsKKwl0YmwtPndhdGNoZG9nX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylkZXY7CisJbW9kX3RpbWVyKCZ0YmwtPndhdGNoZG9nX3RpbWVyLCBqaWZmaWVzKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGNhbGdhcnlfZGlzYWJsZV90cmFuc2xhdGlvbihzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXUzMiB2YWwzMjsKKwl1bnNpZ25lZCBjaGFyIGJ1c251bTsKKwl2b2lkIF9faW9tZW0gKnRhcmdldDsKKwl2b2lkIF9faW9tZW0gKmJiYXI7CisJc3RydWN0IGlvbW11X3RhYmxlICp0Ymw7CisKKwlidXNudW0gPSBkZXYtPmJ1cy0+bnVtYmVyOworCXRibCA9IGRldi0+c3lzZGF0YTsKKwliYmFyID0gdGJsLT5iYmFyOworCisJLyogZGlzYWJsZSBUQ0UgaW4gUEhCIENvbmZpZyBSZWdpc3RlciAqLworCXRhcmdldCA9IGNhbGdhcnlfcmVnKGJiYXIsIHBoYl9vZmZzZXQoYnVzbnVtKSB8IFBIQl9DT05GSUdfUldfT0ZGU0VUKTsKKwl2YWwzMiA9IGJlMzJfdG9fY3B1KHJlYWRsKHRhcmdldCkpOworCXZhbDMyICY9IH4oUEhCX1RDRV9FTkFCTEUgfCBQSEJfREFDX0RJU0FCTEUgfCBQSEJfTUNTUl9FTkFCTEUpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiQ2FsZ2FyeTogZGlzYWJsaW5nIHRyYW5zbGF0aW9uIG9uIFBIQiAlZCFcbiIsIGJ1c251bSk7CisJd3JpdGVsKGNwdV90b19iZTMyKHZhbDMyKSwgdGFyZ2V0KTsKKwlyZWFkbCh0YXJnZXQpOyAvKiBmbHVzaCAqLworCisJZGVsX3RpbWVyX3N5bmMoJnRibC0+d2F0Y2hkb2dfdGltZXIpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBfX2luaXQgbG9jYXRlX3JlZ2lzdGVyX3NwYWNlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJaW50IHJpb25vZGVpZDsKKwl1MzIgYWRkcmVzczsKKworCXJpb25vZGVpZCA9IChkZXYtPmJ1cy0+bnVtYmVyICUgMTUgPiA0KSA/IDMgOiAyOworCS8qCisJICogcmVnaXN0ZXIgc3BhY2UgYWRkcmVzcyBjYWxjdWxhdGlvbiBhcyBmb2xsb3dzOgorCSAqIEZFME1CLThNQipPbmVCYXNlZENoYXNzaXNOdW1iZXIrMU1CKihSaW9Ob2RlSWQtQ2hhc3Npc0Jhc2UpCisJICogQ2hhc3Npc0Jhc2UgaXMgYWx3YXlzIHplcm8gZm9yIHgzNjYveDI2MC94NDYwCisJICogUmlvTm9kZUlkIGlzIDIgZm9yIGZpcnN0IENhbGdhcnksIDMgZm9yIHNlY29uZCBDYWxnYXJ5CisJICovCisJYWRkcmVzcyA9IFNUQVJUX0FERFJFU1MJLQorCQkoMHg4MDAwMDAgKiAoT05FX0JBU0VEX0NIQVNTSVNfTlVNICsgZGV2LT5idXMtPm51bWJlciAvIDE1KSkgKworCQkoMHgxMDAwMDApICogKHJpb25vZGVpZCAtIENIQVNTSVNfQkFTRSk7CisJcmV0dXJuIGFkZHJlc3M7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGNhbGdhcnlfaW5pdF9vbmVfbm9udHJhc2xhdGVkKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJZGV2LT5zeXNkYXRhID0gTlVMTDsKKwlkZXYtPmJ1cy0+c2VsZiA9IGRldjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBjYWxnYXJ5X2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJdTMyIGFkZHJlc3M7CisJdm9pZCBfX2lvbWVtICpiYmFyOworCWludCByZXQ7CisKKwlhZGRyZXNzID0gbG9jYXRlX3JlZ2lzdGVyX3NwYWNlKGRldik7CisJLyogbWFwIGVudGlyZSAxTUIgb2YgQ2FsZ2FyeSBjb25maWcgc3BhY2UgKi8KKwliYmFyID0gaW9yZW1hcF9ub2NhY2hlKGFkZHJlc3MsIDEwMjQgKiAxMDI0KTsKKwlpZiAoIWJiYXIpIHsKKwkJcmV0ID0gLUVOT0RBVEE7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlyZXQgPSBjYWxnYXJ5X3NldHVwX3RhcihkZXYsIGJiYXIpOworCWlmIChyZXQpCisJCWdvdG8gaW91bm1hcDsKKworCWRldi0+YnVzLT5zZWxmID0gZGV2OworCWNhbGdhcnlfZW5hYmxlX3RyYW5zbGF0aW9uKGRldik7CisKKwlyZXR1cm4gMDsKKworaW91bm1hcDoKKwlpb3VubWFwKGJiYXIpOworZG9uZToKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9faW5pdCBjYWxnYXJ5X2luaXQodm9pZCkKK3sKKwlpbnQgaSwgcmV0ID0gLUVOT0RFVjsKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gTlVMTDsKKworCWZvciAoaSA9IDA7IGkgPD0gbnVtX29ubGluZV9ub2RlcygpICogTUFYX05VTV9PRl9QSEJTOyBpKyspIHsKKwkJZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9JQk0sCisJCQkJICAgICBQQ0lfREVWSUNFX0lEX0lCTV9DQUxHQVJZLAorCQkJCSAgICAgZGV2KTsKKwkJaWYgKCFkZXYpCisJCQlicmVhazsKKwkJaWYgKCF0cmFuc2xhdGVfcGhiKGRldikpIHsKKwkJCWNhbGdhcnlfaW5pdF9vbmVfbm9udHJhc2xhdGVkKGRldik7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXRjZV90YWJsZV9rdmFbaV0gJiYgIXRyYW5zbGF0ZV9lbXB0eV9zbG90cykgeworCQkJcGNpX2Rldl9wdXQoZGV2KTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXJldCA9IGNhbGdhcnlfaW5pdF9vbmUoZGV2KTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyb3I7CisJfQorCisJcmV0dXJuIHJldDsKKworZXJyb3I6CisJZm9yIChpLS07IGkgPj0gMDsgaS0tKSB7CisJCWRldiA9IHBjaV9maW5kX2RldmljZV9yZXZlcnNlKFBDSV9WRU5ET1JfSURfSUJNLAorCQkJCQkgICAgICBQQ0lfREVWSUNFX0lEX0lCTV9DQUxHQVJZLAorCQkJCQkgICAgICBkZXYpOworCQlpZiAoIXRyYW5zbGF0ZV9waGIoZGV2KSkgeworCQkJcGNpX2Rldl9wdXQoZGV2KTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghdGNlX3RhYmxlX2t2YVtpXSAmJiAhdHJhbnNsYXRlX2VtcHR5X3Nsb3RzKQorCQkJY29udGludWU7CisJCWNhbGdhcnlfZGlzYWJsZV90cmFuc2xhdGlvbihkZXYpOworCQljYWxnYXJ5X2ZyZWVfdGFyKGRldik7CisJCXBjaV9kZXZfcHV0KGRldik7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBpbnQgX19pbml0IGRldGVybWluZV90Y2VfdGFibGVfc2l6ZSh1NjQgcmFtKQoreworCWludCByZXQ7CisKKwlpZiAoc3BlY2lmaWVkX3RhYmxlX3NpemUgIT0gVENFX1RBQkxFX1NJWkVfVU5TUEVDSUZJRUQpCisJCXJldHVybiBzcGVjaWZpZWRfdGFibGVfc2l6ZTsKKworCS8qCisJICogVGFibGUgc2l6ZXMgYXJlIGZyb20gMCB0byA3IChUQ0VfVEFCTEVfU0laRV82NEsgdG8KKwkgKiBUQ0VfVEFCTEVfU0laRV84TSkuIFRhYmxlIHNpemUgMCBoYXMgOEsgZW50cmllcyBhbmQgZWFjaAorCSAqIGxhcmdlciB0YWJsZSBzaXplIGhhcyB0d2ljZSBhcyBtYW55IGVudHJpZXMsIHNvIHNoaWZ0IHRoZQorCSAqIG1heCByYW0gYWRkcmVzcyBieSAxMyB0byBkaXZpZGUgYnkgOEsgYW5kIHRoZW4gbG9vayBhdCB0aGUKKwkgKiBvcmRlciBvZiB0aGUgcmVzdWx0IHRvIGNob29zZSBiZXR3ZWVuIDAtNy4KKwkgKi8KKwlyZXQgPSBnZXRfb3JkZXIocmFtID4+IDEzKTsKKwlpZiAocmV0ID4gVENFX1RBQkxFX1NJWkVfOE0pCisJCXJldCA9IFRDRV9UQUJMRV9TSVpFXzhNOworCisJcmV0dXJuIHJldDsKK30KKwordm9pZCBfX2luaXQgZGV0ZWN0X2NhbGdhcnkodm9pZCkKK3sKKwl1MzIgdmFsOworCWludCBidXMsIHRhYmxlX2lkeDsKKwl2b2lkICp0Ymw7CisJaW50IGRldGVjdGVkID0gMDsKKworCS8qCisJICogaWYgdGhlIHVzZXIgc3BlY2lmaWVkIGlvbW11PW9mZiBvciBpb21tdT1zb2Z0IG9yIHdlIGZvdW5kCisJICogYW5vdGhlciBIVyBJT01NVSBhbHJlYWR5LCBiYWlsIG91dC4KKwkgKi8KKwlpZiAoc3dpb3RsYiB8fCBub19pb21tdSB8fCBpb21tdV9kZXRlY3RlZCkKKwkJcmV0dXJuOworCisJc3BlY2lmaWVkX3RhYmxlX3NpemUgPSBkZXRlcm1pbmVfdGNlX3RhYmxlX3NpemUoZW5kX3BmbiAqIFBBR0VfU0laRSk7CisKKwlmb3IgKGJ1cyA9IDAsIHRhYmxlX2lkeCA9IDA7CisJICAgICBidXMgPD0gbnVtX29ubGluZV9ub2RlcygpICogTUFYX1BIQl9CVVNfTlVNOworCSAgICAgYnVzKyspIHsKKwkJQlVHX09OKGJ1cyA+IE1BWF9OVU1OT0RFUyAqIE1BWF9QSEJfQlVTX05VTSk7CisJCWlmIChyZWFkX3BjaV9jb25maWcoYnVzLCAwLCAwLCAwKSAhPSBQQ0lfVkVORE9SX0RFVklDRV9JRF9DQUxHQVJZKQorCQkJY29udGludWU7CisJCWlmICh0ZXN0X2JpdChidXMsIHRyYW5zbGF0aW9uX2Rpc2FibGVkKSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiQ2FsZ2FyeTogdHJhbnNsYXRpb24gaXMgZGlzYWJsZWQgZm9yICIKKwkJCSAgICAgICAiUEhCIDB4JXhcbiIsIGJ1cyk7CisJCQkvKiBza2lwIHRoaXMgcGhiLCBkb24ndCBhbGxvY2F0ZSBhIHRibCBmb3IgaXQgKi8KKwkJCXRjZV90YWJsZV9rdmFbdGFibGVfaWR4XSA9IE5VTEw7CisJCQl0YWJsZV9pZHgrKzsKKwkJCWNvbnRpbnVlOworCQl9CisJCS8qCisJCSAqIHNjYW4gdGhlIGZpcnN0IHNsb3Qgb2YgdGhlIFBDSSBidXMgdG8gc2VlIGlmIHRoZXJlCisJCSAqIGFyZSBhbnkgZGV2aWNlcyBwcmVzZW50CisJCSAqLworCQl2YWwgPSByZWFkX3BjaV9jb25maWcoYnVzLCAxLCAwLCAwKTsKKwkJaWYgKHZhbCAhPSAweGZmZmZmZmZmIHx8IHRyYW5zbGF0ZV9lbXB0eV9zbG90cykgeworCQkJdGJsID0gYWxsb2NfdGNlX3RhYmxlKCk7CisJCQlpZiAoIXRibCkKKwkJCQlnb3RvIGNsZWFudXA7CisJCQlkZXRlY3RlZCA9IDE7CisJCX0gZWxzZQorCQkJdGJsID0gTlVMTDsKKworCQl0Y2VfdGFibGVfa3ZhW3RhYmxlX2lkeF0gPSB0Ymw7CisJCXRhYmxlX2lkeCsrOworCX0KKworCWlmIChkZXRlY3RlZCkgeworCQlpb21tdV9kZXRlY3RlZCA9IDE7CisJCWNhbGdhcnlfZGV0ZWN0ZWQgPSAxOworCQlwcmludGsoS0VSTl9JTkZPICJQQ0ktRE1BOiBDYWxnYXJ5IElPTU1VIGRldGVjdGVkLiAiCisJCSAgICAgICAiVENFIHRhYmxlIHNwZWMgaXMgJWQuXG4iLCBzcGVjaWZpZWRfdGFibGVfc2l6ZSk7CisJfQorCXJldHVybjsKKworY2xlYW51cDoKKwlmb3IgKC0tdGFibGVfaWR4OyB0YWJsZV9pZHggPj0gMDsgLS10YWJsZV9pZHgpCisJCWlmICh0Y2VfdGFibGVfa3ZhW3RhYmxlX2lkeF0pCisJCQlmcmVlX3RjZV90YWJsZSh0Y2VfdGFibGVfa3ZhW3RhYmxlX2lkeF0pOworfQorCitpbnQgX19pbml0IGNhbGdhcnlfaW9tbXVfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwlpZiAobm9faW9tbXUgfHwgc3dpb3RsYikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoIWNhbGdhcnlfZGV0ZWN0ZWQpCisJCXJldHVybiAtRU5PREVWOworCisJLyogb2ssIHdlJ3JlIHRyeWluZyB0byB1c2UgQ2FsZ2FyeSAtIGxldCdzIHJvbGwgKi8KKwlwcmludGsoS0VSTl9JTkZPICJQQ0ktRE1BOiBVc2luZyBDYWxnYXJ5IElPTU1VXG4iKTsKKworCXJldCA9IGNhbGdhcnlfaW5pdCgpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJQQ0ktRE1BOiBDYWxnYXJ5IGluaXQgZmFpbGVkICVkLCAiCisJCSAgICAgICAiZmFsbGluZyBiYWNrIHRvIG5vX2lvbW11XG4iLCByZXQpOworCQlpZiAoZW5kX3BmbiA+IE1BWF9ETUEzMl9QRk4pCisJCQlwcmludGsoS0VSTl9FUlIgIldBUk5JTkcgbW9yZSB0aGFuIDRHQiBvZiBtZW1vcnksICIKKwkJCQkJIjMyYml0IFBDSSBtYXkgbWFsZnVuY3Rpb24uXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlmb3JjZV9pb21tdSA9IDE7CisJZG1hX29wcyA9ICZjYWxnYXJ5X2RtYV9vcHM7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgY2FsZ2FyeV9wYXJzZV9vcHRpb25zKGNoYXIgKnApCit7CisJdW5zaWduZWQgaW50IGJyaWRnZTsKKwlzaXplX3QgbGVuOworCWNoYXIqIGVuZHA7CisKKwl3aGlsZSAoKnApIHsKKwkJaWYgKCFzdHJuY21wKHAsICI2NGsiLCAzKSkKKwkJCXNwZWNpZmllZF90YWJsZV9zaXplID0gVENFX1RBQkxFX1NJWkVfNjRLOworCQllbHNlIGlmICghc3RybmNtcChwLCAiMTI4ayIsIDQpKQorCQkJc3BlY2lmaWVkX3RhYmxlX3NpemUgPSBUQ0VfVEFCTEVfU0laRV8xMjhLOworCQllbHNlIGlmICghc3RybmNtcChwLCAiMjU2ayIsIDQpKQorCQkJc3BlY2lmaWVkX3RhYmxlX3NpemUgPSBUQ0VfVEFCTEVfU0laRV8yNTZLOworCQllbHNlIGlmICghc3RybmNtcChwLCAiNTEyayIsIDQpKQorCQkJc3BlY2lmaWVkX3RhYmxlX3NpemUgPSBUQ0VfVEFCTEVfU0laRV81MTJLOworCQllbHNlIGlmICghc3RybmNtcChwLCAiMU0iLCAyKSkKKwkJCXNwZWNpZmllZF90YWJsZV9zaXplID0gVENFX1RBQkxFX1NJWkVfMU07CisJCWVsc2UgaWYgKCFzdHJuY21wKHAsICIyTSIsIDIpKQorCQkJc3BlY2lmaWVkX3RhYmxlX3NpemUgPSBUQ0VfVEFCTEVfU0laRV8yTTsKKwkJZWxzZSBpZiAoIXN0cm5jbXAocCwgIjRNIiwgMikpCisJCQlzcGVjaWZpZWRfdGFibGVfc2l6ZSA9IFRDRV9UQUJMRV9TSVpFXzRNOworCQllbHNlIGlmICghc3RybmNtcChwLCAiOE0iLCAyKSkKKwkJCXNwZWNpZmllZF90YWJsZV9zaXplID0gVENFX1RBQkxFX1NJWkVfOE07CisKKwkJbGVuID0gc3RybGVuKCJ0cmFuc2xhdGVfZW1wdHlfc2xvdHMiKTsKKwkJaWYgKCFzdHJuY21wKHAsICJ0cmFuc2xhdGVfZW1wdHlfc2xvdHMiLCBsZW4pKQorCQkJdHJhbnNsYXRlX2VtcHR5X3Nsb3RzID0gMTsKKworCQlsZW4gPSBzdHJsZW4oImRpc2FibGUiKTsKKwkJaWYgKCFzdHJuY21wKHAsICJkaXNhYmxlIiwgbGVuKSkgeworCQkJcCArPSBsZW47CisJCQlpZiAoKnAgPT0gJz0nKQorCQkJCSsrcDsKKwkJCWlmICgqcCA9PSAnXDAnKQorCQkJCWJyZWFrOworCQkJYnJpZGdlID0gc2ltcGxlX3N0cnRvbChwLCAmZW5kcCwgMCk7CisJCQlpZiAocCA9PSBlbmRwKQorCQkJCWJyZWFrOworCisJCQlpZiAoYnJpZGdlIDw9IChudW1fb25saW5lX25vZGVzKCkgKiBNQVhfUEhCX0JVU19OVU0pKSB7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiQ2FsZ2FyeTogZGlzYWJsaW5nICIKKwkJCQkgICAgICAgInRyYW5zbGF0aW9uIGZvciBQSEIgMHgleFxuIiwgYnJpZGdlKTsKKwkJCQlzZXRfYml0KGJyaWRnZSwgdHJhbnNsYXRpb25fZGlzYWJsZWQpOworCQkJfQorCQl9CisKKwkJcCA9IHN0cnBicmsocCwgIiwiKTsKKwkJaWYgKCFwKQorCQkJYnJlYWs7CisKKwkJcCsrOyAvKiBza2lwICcsJyAqLworCX0KKwlyZXR1cm4gMTsKK30KK19fc2V0dXAoImNhbGdhcnk9IiwgY2FsZ2FyeV9wYXJzZV9vcHRpb25zKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9wY2ktZG1hLmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvcGNpLWRtYS5jCmluZGV4IGE5Mjc1Yzk1Li45YzQ0ZjRmIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvcGNpLWRtYS5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9wY2ktZG1hLmMKQEAgLTksNiArOSw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3Byb3RvLmg+CisjaW5jbHVkZSA8YXNtL2NhbGdhcnkuaD4KIAogaW50IGlvbW11X21lcmdlIF9fcmVhZF9tb3N0bHkgPSAwOwogRVhQT1JUX1NZTUJPTChpb21tdV9tZXJnZSk7CkBAIC0zMywxMiArMzQsMTUgQEAKIGludCBmb3JjZV9pb21tdSBfX3JlYWRfbW9zdGx5PSAwOwogI2VuZGlmCiAKKy8qIFNldCB0aGlzIHRvIDEgaWYgdGhlcmUgaXMgYSBIVyBJT01NVSBpbiB0aGUgc3lzdGVtICovCitpbnQgaW9tbXVfZGV0ZWN0ZWQgX19yZWFkX21vc3RseSA9IDA7CisKIC8qIER1bW15IGRldmljZSB1c2VkIGZvciBOVUxMIGFyZ3VtZW50cyAobm9ybWFsbHkgSVNBKS4gQmV0dGVyIHdvdWxkCiAgICBiZSBwcm9iYWJseSBhIHNtYWxsZXIgRE1BIG1hc2ssIGJ1dCB0aGlzIGlzIGJ1Zy10by1idWcgY29tcGF0aWJsZQogICAgdG8gaTM4Ni4gKi8KIHN0cnVjdCBkZXZpY2UgZmFsbGJhY2tfZGV2ID0gewogCS5idXNfaWQgPSAiZmFsbGJhY2sgZGV2aWNlIiwKLQkuY29oZXJlbnRfZG1hX21hc2sgPSAweGZmZmZmZmZmLAorCS5jb2hlcmVudF9kbWFfbWFzayA9IERNQV8zMkJJVF9NQVNLLAogCS5kbWFfbWFzayA9ICZmYWxsYmFja19kZXYuY29oZXJlbnRfZG1hX21hc2ssCiB9OwogCkBAIC03Nyw3ICs4MSw3IEBACiAJCWRldiA9ICZmYWxsYmFja19kZXY7CiAJZG1hX21hc2sgPSBkZXYtPmNvaGVyZW50X2RtYV9tYXNrOwogCWlmIChkbWFfbWFzayA9PSAwKQotCQlkbWFfbWFzayA9IDB4ZmZmZmZmZmY7CisJCWRtYV9tYXNrID0gRE1BXzMyQklUX01BU0s7CiAKIAkvKiBEb24ndCBpbnZva2UgT09NIGtpbGxlciAqLwogCWdmcCB8PSBfX0dGUF9OT1JFVFJZOwpAQCAtOTAsNyArOTQsNyBAQAogCSAgIGxhcmdlciB0aGFuIDE2TUIgYW5kIGluIHRoaXMgY2FzZSB3ZSBoYXZlIGEgY2hhbmNlIG9mCiAJICAgZmluZGluZyBmaXR0aW5nIG1lbW9yeSBpbiB0aGUgbmV4dCBoaWdoZXIgem9uZSBmaXJzdC4gSWYKIAkgICBub3QgcmV0cnkgd2l0aCB0cnVlIEdGUF9ETUEuIC1BSyAqLwotCWlmIChkbWFfbWFzayA8PSAweGZmZmZmZmZmKQorCWlmIChkbWFfbWFzayA8PSBETUFfMzJCSVRfTUFTSykKIAkJZ2ZwIHw9IEdGUF9ETUEzMjsKIAogIGFnYWluOgpAQCAtMTExLDcgKzExNSw3IEBACiAKIAkJCS8qIERvbid0IHVzZSB0aGUgMTZNQiBaT05FX0RNQSB1bmxlc3MgYWJzb2x1dGVseQogCQkJICAgbmVlZGVkLiBJdCdzIGJldHRlciB0byB1c2UgcmVtYXBwaW5nIGZpcnN0LiAqLwotCQkJaWYgKGRtYV9tYXNrIDwgMHhmZmZmZmZmZiAmJiAhKGdmcCAmIEdGUF9ETUEpKSB7CisJCQlpZiAoZG1hX21hc2sgPCBETUFfMzJCSVRfTUFTSyAmJiAhKGdmcCAmIEdGUF9ETUEpKSB7CiAJCQkJZ2ZwID0gKGdmcCAmIH5HRlBfRE1BMzIpIHwgR0ZQX0RNQTsKIAkJCQlnb3RvIGFnYWluOwogCQkJfQpAQCAtMTc0LDcgKzE3OCw3IEBACiAJLyogQ29waWVkIGZyb20gaTM4Ni4gRG9lc24ndCBtYWtlIG11Y2ggc2Vuc2UsIGJlY2F1c2UgaXQgd2lsbAogCSAgIG9ubHkgd29yayBmb3IgcGNpX2FsbG9jX2NvaGVyZW50LgogCSAgIFRoZSBjYWxsZXIganVzdCBoYXMgdG8gdXNlIEdGUF9ETUEgaW4gdGhpcyBjYXNlLiAqLwotICAgICAgICBpZiAobWFzayA8IDB4MDBmZmZmZmYpCisgICAgICAgIGlmIChtYXNrIDwgRE1BXzI0QklUX01BU0spCiAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAKIAkvKiBUZWxsIHRoZSBkZXZpY2UgdG8gdXNlIFNBQyB3aGVuIElPTU1VIGZvcmNlIGlzIG9uLiAgVGhpcwpAQCAtMTg5LDcgKzE5Myw3IEBACiAJICAgU0FDIGZvciB0aGVzZS4gIEFzc3VtZSBhbGwgbWFza3MgPD0gNDAgYml0cyBhcmUgb2YgdGhpcwogCSAgIHR5cGUuIE5vcm1hbGx5IHRoaXMgZG9lc24ndCBtYWtlIGFueSBkaWZmZXJlbmNlLCBidXQgZ2l2ZXMKIAkgICBtb3JlIGdlbnRsZSBoYW5kbGluZyBvZiBJT01NVSBvdmVyZmxvdy4gKi8KLQlpZiAoaW9tbXVfc2FjX2ZvcmNlICYmIChtYXNrID49IDB4ZmZmZmZmZmZmZlVMTCkpIHsKKwlpZiAoaW9tbXVfc2FjX2ZvcmNlICYmIChtYXNrID49IERNQV80MEJJVF9NQVNLKSkgewogCQlwcmludGsoS0VSTl9JTkZPICIlczogRm9yY2UgU0FDIHdpdGggbWFzayAlTHhcbiIsIGRldi0+YnVzX2lkLG1hc2spOwogCQlyZXR1cm4gMDsKIAl9CkBAIC0yNjYsNyArMjcwLDcgQEAKIAkJICAgIHN3aW90bGIgPSAxOwogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfR0FSVF9JT01NVQorI2lmZGVmIENPTkZJR19JT01NVQogCSAgICBnYXJ0X3BhcnNlX29wdGlvbnMocCk7CiAjZW5kaWYKIApAQCAtMjc2LDMgKzI4MCw0MCBAQAogICAgIH0KICAgICByZXR1cm4gMTsKIH0KK19fc2V0dXAoImlvbW11PSIsIGlvbW11X3NldHVwKTsKKwordm9pZCBfX2luaXQgcGNpX2lvbW11X2FsbG9jKHZvaWQpCit7CisJLyoKKwkgKiBUaGUgb3JkZXIgb2YgdGhlc2UgZnVuY3Rpb25zIGlzIGltcG9ydGFudCBmb3IKKwkgKiBmYWxsLWJhY2svZmFpbC1vdmVyIHJlYXNvbnMKKwkgKi8KKyNpZmRlZiBDT05GSUdfSU9NTVUKKwlpb21tdV9ob2xlX2luaXQoKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0NBTEdBUllfSU9NTVUKKwlkZXRlY3RfY2FsZ2FyeSgpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfU1dJT1RMQgorCXBjaV9zd2lvdGxiX2luaXQoKTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW50IF9faW5pdCBwY2lfaW9tbXVfaW5pdCh2b2lkKQoreworI2lmZGVmIENPTkZJR19DQUxHQVJZX0lPTU1VCisJY2FsZ2FyeV9pb21tdV9pbml0KCk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19JT01NVQorCWdhcnRfaW9tbXVfaW5pdCgpOworI2VuZGlmCisKKwlub19pb21tdV9pbml0KCk7CisJcmV0dXJuIDA7Cit9CisKKy8qIE11c3QgZXhlY3V0ZSBhZnRlciBQQ0kgc3Vic3lzdGVtICovCitmc19pbml0Y2FsbChwY2lfaW9tbXVfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvcGNpLWdhcnQuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9wY2ktZ2FydC5jCmluZGV4IDgyYTdjOWIuLjRjYTY3NGQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9wY2ktZ2FydC5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9wY2ktZ2FydC5jCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSA8YXNtL2tkZWJ1Zy5oPgogI2luY2x1ZGUgPGFzbS9zd2lvdGxiLmg+CiAjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9rOC5oPgogCiB1bnNpZ25lZCBsb25nIGlvbW11X2J1c19iYXNlOwkvKiBHQVJUIHJlbWFwcGluZyBhcmVhIChwaHlzaWNhbCkgKi8KIHN0YXRpYyB1bnNpZ25lZCBsb25nIGlvbW11X3NpemU7IAkvKiBzaXplIG9mIHJlbWFwcGluZyBhcmVhIGJ5dGVzICovCkBAIC00Niw4ICs0Nyw2IEBACiAgICBhbHNvIHNlZW4gd2l0aCBRbG9naWMgYXQgbGVhc3QpLiAqLwogaW50IGlvbW11X2Z1bGxmbHVzaCA9IDE7CiAKLSNkZWZpbmUgTUFYX05CIDgKLQogLyogQWxsb2NhdGlvbiBiaXRtYXAgZm9yIHRoZSByZW1hcHBpbmcgYXJlYSAqLyAKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soaW9tbXVfYml0bWFwX2xvY2spOwogc3RhdGljIHVuc2lnbmVkIGxvbmcgKmlvbW11X2dhcnRfYml0bWFwOyAvKiBndWFyZGVkIGJ5IGlvbW11X2JpdG1hcF9sb2NrICovCkBAIC02MywxMyArNjIsNiBAQAogI2RlZmluZSB0b19wYWdlcyhhZGRyLHNpemUpIFwKIAkocm91bmRfdXAoKChhZGRyKSAmIH5QQUdFX01BU0spICsgKHNpemUpLCBQQUdFX1NJWkUpID4+IFBBR0VfU0hJRlQpCiAKLSNkZWZpbmUgZm9yX2FsbF9uYihkZXYpIFwKLQlkZXYgPSBOVUxMOwlcCi0Jd2hpbGUgKChkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0FNRCwgMHgxMTAzLCBkZXYpKSE9TlVMTCkKLQotc3RhdGljIHN0cnVjdCBwY2lfZGV2ICpub3J0aGJyaWRnZXNbTUFYX05CXTsKLXN0YXRpYyB1MzIgbm9ydGhicmlkZ2VfZmx1c2hfd29yZFtNQVhfTkJdOwotCiAjZGVmaW5lIEVNRVJHRU5DWV9QQUdFUyAzMiAvKiA9IDEyOEtCICovIAogCiAjaWZkZWYgQ09ORklHX0FHUApAQCAtOTMsNyArODUsNyBAQAogCW9mZnNldCA9IGZpbmRfbmV4dF96ZXJvX3N0cmluZyhpb21tdV9nYXJ0X2JpdG1hcCxuZXh0X2JpdCxpb21tdV9wYWdlcyxzaXplKTsKIAlpZiAob2Zmc2V0ID09IC0xKSB7CiAJCW5lZWRfZmx1c2ggPSAxOwotCSAgICAgICAJb2Zmc2V0ID0gZmluZF9uZXh0X3plcm9fc3RyaW5nKGlvbW11X2dhcnRfYml0bWFwLDAsbmV4dF9iaXQsc2l6ZSk7CisJCW9mZnNldCA9IGZpbmRfbmV4dF96ZXJvX3N0cmluZyhpb21tdV9nYXJ0X2JpdG1hcCwwLGlvbW11X3BhZ2VzLHNpemUpOwogCX0KIAlpZiAob2Zmc2V0ICE9IC0xKSB7IAogCQlzZXRfYml0X3N0cmluZyhpb21tdV9nYXJ0X2JpdG1hcCwgb2Zmc2V0LCBzaXplKTsgCkBAIC0xMjAsNDQgKzExMiwxNyBAQAogLyogCiAgKiBVc2UgZ2xvYmFsIGZsdXNoIHN0YXRlIHRvIGF2b2lkIHJhY2VzIHdpdGggbXVsdGlwbGUgZmx1c2hlcnMuCiAgKi8KLXN0YXRpYyB2b2lkIGZsdXNoX2dhcnQoc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIHZvaWQgZmx1c2hfZ2FydCh2b2lkKQogeyAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBmbHVzaGVkID0gMDsKLQlpbnQgaSwgbWF4OwotCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmlvbW11X2JpdG1hcF9sb2NrLCBmbGFncyk7Ci0JaWYgKG5lZWRfZmx1c2gpIHsgCi0JCW1heCA9IDA7Ci0JCWZvciAoaSA9IDA7IGkgPCBNQVhfTkI7IGkrKykgewotCQkJaWYgKCFub3J0aGJyaWRnZXNbaV0pIAotCQkJCWNvbnRpbnVlOwotCQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChub3J0aGJyaWRnZXNbaV0sIDB4OWMsIAotCQkJCQkgICAgICAgbm9ydGhicmlkZ2VfZmx1c2hfd29yZFtpXSB8IDEpOyAKLQkJCWZsdXNoZWQrKzsKLQkJCW1heCA9IGk7Ci0JCX0KLQkJZm9yIChpID0gMDsgaSA8PSBtYXg7IGkrKykgewotCQkJdTMyIHc7Ci0JCQlpZiAoIW5vcnRoYnJpZGdlc1tpXSkKLQkJCQljb250aW51ZTsKLQkJCS8qIE1ha2Ugc3VyZSB0aGUgaGFyZHdhcmUgYWN0dWFsbHkgZXhlY3V0ZWQgdGhlIGZsdXNoLiAqLwotCQkJZm9yICg7OykgeyAKLQkJCQlwY2lfcmVhZF9jb25maWdfZHdvcmQobm9ydGhicmlkZ2VzW2ldLCAweDljLCAmdyk7Ci0JCQkJaWYgKCEodyAmIDEpKQotCQkJCQlicmVhazsKLQkJCQljcHVfcmVsYXgoKTsKLQkJCX0KLQkJfSAKLQkJaWYgKCFmbHVzaGVkKSAKLQkJCXByaW50aygibm90aGluZyB0byBmbHVzaD9cbiIpOworCWlmIChuZWVkX2ZsdXNoKSB7CisJCWs4X2ZsdXNoX2dhcnRzKCk7CiAJCW5lZWRfZmx1c2ggPSAwOwogCX0gCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9tbXVfYml0bWFwX2xvY2ssIGZsYWdzKTsKIH0gCiAKLQotCiAjaWZkZWYgQ09ORklHX0lPTU1VX0xFQUsKIAogI2RlZmluZSBTRVRfTEVBSyh4KSBpZiAoaW9tbXVfbGVha190YWIpIFwKQEAgLTI2Niw3ICsyMzEsNyBAQAogCQkJCSBzaXplX3Qgc2l6ZSwgaW50IGRpcikKIHsKIAlkbWFfYWRkcl90IG1hcCA9IGRtYV9tYXBfYXJlYShkZXYsIHZpcnRfdG9fYnVzKGJ1ZiksIHNpemUsIGRpcik7Ci0JZmx1c2hfZ2FydChkZXYpOworCWZsdXNoX2dhcnQoKTsKIAlyZXR1cm4gbWFwOwogfQogCkBAIC0yODksNiArMjU0LDI4IEBACiB9CiAKIC8qCisgKiBGcmVlIGEgRE1BIG1hcHBpbmcuCisgKi8KK3ZvaWQgZ2FydF91bm1hcF9zaW5nbGUoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGRtYV9hZGRyLAorCQkgICAgICBzaXplX3Qgc2l6ZSwgaW50IGRpcmVjdGlvbikKK3sKKwl1bnNpZ25lZCBsb25nIGlvbW11X3BhZ2U7CisJaW50IG5wYWdlczsKKwlpbnQgaTsKKworCWlmIChkbWFfYWRkciA8IGlvbW11X2J1c19iYXNlICsgRU1FUkdFTkNZX1BBR0VTKlBBR0VfU0laRSB8fAorCSAgICBkbWFfYWRkciA+PSBpb21tdV9idXNfYmFzZSArIGlvbW11X3NpemUpCisJCXJldHVybjsKKwlpb21tdV9wYWdlID0gKGRtYV9hZGRyIC0gaW9tbXVfYnVzX2Jhc2UpPj5QQUdFX1NISUZUOworCW5wYWdlcyA9IHRvX3BhZ2VzKGRtYV9hZGRyLCBzaXplKTsKKwlmb3IgKGkgPSAwOyBpIDwgbnBhZ2VzOyBpKyspIHsKKwkJaW9tbXVfZ2F0dF9iYXNlW2lvbW11X3BhZ2UgKyBpXSA9IGdhcnRfdW5tYXBwZWRfZW50cnk7CisJCUNMRUFSX0xFQUsoaW9tbXVfcGFnZSArIGkpOworCX0KKwlmcmVlX2lvbW11KGlvbW11X3BhZ2UsIG5wYWdlcyk7Cit9CisKKy8qCiAgKiBXcmFwcGVyIGZvciBwY2lfdW5tYXBfc2luZ2xlIHdvcmtpbmcgd2l0aCBzY2F0dGVybGlzdHMuCiAgKi8KIHZvaWQgZ2FydF91bm1hcF9zZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBuZW50cywgaW50IGRpcikKQEAgLTI5OSw3ICsyODYsNyBAQAogCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnMgPSAmc2dbaV07CiAJCWlmICghcy0+ZG1hX2xlbmd0aCB8fCAhcy0+bGVuZ3RoKQogCQkJYnJlYWs7Ci0JCWRtYV91bm1hcF9zaW5nbGUoZGV2LCBzLT5kbWFfYWRkcmVzcywgcy0+ZG1hX2xlbmd0aCwgZGlyKTsKKwkJZ2FydF91bm1hcF9zaW5nbGUoZGV2LCBzLT5kbWFfYWRkcmVzcywgcy0+ZG1hX2xlbmd0aCwgZGlyKTsKIAl9CiB9CiAKQEAgLTMyOSw3ICszMTYsNyBAQAogCQlzLT5kbWFfYWRkcmVzcyA9IGFkZHI7CiAJCXMtPmRtYV9sZW5ndGggPSBzLT5sZW5ndGg7CiAJfQotCWZsdXNoX2dhcnQoZGV2KTsKKwlmbHVzaF9nYXJ0KCk7CiAJcmV0dXJuIG5lbnRzOwogfQogCkBAIC00MzYsMTMgKzQyMywxMyBAQAogCWlmIChkbWFfbWFwX2NvbnQoc2csIHN0YXJ0LCBpLCBzZytvdXQsIHBhZ2VzLCBuZWVkKSA8IDApCiAJCWdvdG8gZXJyb3I7CiAJb3V0Kys7Ci0JZmx1c2hfZ2FydChkZXYpOworCWZsdXNoX2dhcnQoKTsKIAlpZiAob3V0IDwgbmVudHMpIAogCQlzZ1tvdXRdLmRtYV9sZW5ndGggPSAwOyAKIAlyZXR1cm4gb3V0OwogCiBlcnJvcjoKLQlmbHVzaF9nYXJ0KE5VTEwpOworCWZsdXNoX2dhcnQoKTsKIAlnYXJ0X3VubWFwX3NnKGRldiwgc2csIG5lbnRzLCBkaXIpOwogCS8qIFdoZW4gaXQgd2FzIGZvcmNlZCBvciBtZXJnZWQgdHJ5IGFnYWluIGluIGEgZHVtYiB3YXkgKi8KIAlpZiAoZm9yY2VfaW9tbXUgfHwgaW9tbXVfbWVyZ2UpIHsKQEAgLTQ1OCwyOCArNDQ1LDYgQEAKIAlyZXR1cm4gMDsKIH0gCiAKLS8qCi0gKiBGcmVlIGEgRE1BIG1hcHBpbmcuCi0gKi8gCi12b2lkIGdhcnRfdW5tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBkbWFfYWRkciwKLQkJICAgICAgc2l6ZV90IHNpemUsIGludCBkaXJlY3Rpb24pCi17Ci0JdW5zaWduZWQgbG9uZyBpb21tdV9wYWdlOyAKLQlpbnQgbnBhZ2VzOwotCWludCBpOwotCi0JaWYgKGRtYV9hZGRyIDwgaW9tbXVfYnVzX2Jhc2UgKyBFTUVSR0VOQ1lfUEFHRVMqUEFHRV9TSVpFIHx8IAotCSAgICBkbWFfYWRkciA+PSBpb21tdV9idXNfYmFzZSArIGlvbW11X3NpemUpCi0JCXJldHVybjsKLQlpb21tdV9wYWdlID0gKGRtYV9hZGRyIC0gaW9tbXVfYnVzX2Jhc2UpPj5QQUdFX1NISUZUOwkKLQlucGFnZXMgPSB0b19wYWdlcyhkbWFfYWRkciwgc2l6ZSk7Ci0JZm9yIChpID0gMDsgaSA8IG5wYWdlczsgaSsrKSB7IAotCQlpb21tdV9nYXR0X2Jhc2VbaW9tbXVfcGFnZSArIGldID0gZ2FydF91bm1hcHBlZF9lbnRyeTsgCi0JCUNMRUFSX0xFQUsoaW9tbXVfcGFnZSArIGkpOwotCX0KLQlmcmVlX2lvbW11KGlvbW11X3BhZ2UsIG5wYWdlcyk7Ci19Ci0KIHN0YXRpYyBpbnQgbm9fYWdwOwogCiBzdGF0aWMgX19pbml0IHVuc2lnbmVkIGxvbmcgY2hlY2tfaW9tbXVfc2l6ZSh1bnNpZ25lZCBsb25nIGFwZXIsIHU2NCBhcGVyX3NpemUpCkBAIC01MzIsMTAgKzQ5NywxMyBAQAogCXZvaWQgKmdhdHQ7CiAJdW5zaWduZWQgYXBlcl9iYXNlLCBuZXdfYXBlcl9iYXNlOwogCXVuc2lnbmVkIGFwZXJfc2l6ZSwgZ2F0dF9zaXplLCBuZXdfYXBlcl9zaXplOwotCQorCWludCBpOworCiAJcHJpbnRrKEtFUk5fSU5GTyAiUENJLURNQTogRGlzYWJsaW5nIEFHUC5cbiIpOwogCWFwZXJfc2l6ZSA9IGFwZXJfYmFzZSA9IGluZm8tPmFwZXJfc2l6ZSA9IDA7Ci0JZm9yX2FsbF9uYihkZXYpIHsgCisJZGV2ID0gTlVMTDsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2s4X25vcnRoYnJpZGdlczsgaSsrKSB7CisJCWRldiA9IGs4X25vcnRoYnJpZGdlc1tpXTsKIAkJbmV3X2FwZXJfYmFzZSA9IHJlYWRfYXBlcnR1cmUoZGV2LCAmbmV3X2FwZXJfc2l6ZSk7IAogCQlpZiAoIW5ld19hcGVyX2Jhc2UpIAogCQkJZ290byBub21tdTsgCkBAIC01NTgsMTEgKzUyNiwxMiBAQAogCQlwYW5pYygiQ2Fubm90IGFsbG9jYXRlIEdBVFQgdGFibGUiKTsgCiAJbWVtc2V0KGdhdHQsIDAsIGdhdHRfc2l6ZSk7IAogCWFncF9nYXR0X3RhYmxlID0gZ2F0dDsKLQkKLQlmb3JfYWxsX25iKGRldikgeyAKKworCWZvciAoaSA9IDA7IGkgPCBudW1fazhfbm9ydGhicmlkZ2VzOyBpKyspIHsKIAkJdTMyIGN0bDsgCiAJCXUzMiBnYXR0X3JlZzsgCiAKKwkJZGV2ID0gazhfbm9ydGhicmlkZ2VzW2ldOwogCQlnYXR0X3JlZyA9IF9fcGEoZ2F0dCkgPj4gMTI7IAogCQlnYXR0X3JlZyA8PD0gNDsgCiAJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCAweDk4LCBnYXR0X3JlZyk7CkBAIC01NzMsNyArNTQyLDcgQEAKIAogCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgMHg5MCwgY3RsKTsgCiAJfQotCWZsdXNoX2dhcnQoTlVMTCk7IAorCWZsdXNoX2dhcnQoKTsKIAkKIAlwcmludGsoIlBDSS1ETUE6IGFwZXJ0dXJlIGJhc2UgQCAleCBzaXplICV1IEtCXG4iLGFwZXJfYmFzZSwgYXBlcl9zaXplPj4xMCk7IAogCXJldHVybiAwOwpAQCAtNjAyLDE1ICs1NzEsMTkgQEAKIAkudW5tYXBfc2cgPSBnYXJ0X3VubWFwX3NnLAogfTsKIAotc3RhdGljIGludCBfX2luaXQgcGNpX2lvbW11X2luaXQodm9pZCkKK3ZvaWQgX19pbml0IGdhcnRfaW9tbXVfaW5pdCh2b2lkKQogeyAKIAlzdHJ1Y3QgYWdwX2tlcm5faW5mbyBpbmZvOwogCXVuc2lnbmVkIGxvbmcgYXBlcl9zaXplOwogCXVuc2lnbmVkIGxvbmcgaW9tbXVfc3RhcnQ7Ci0Jc3RydWN0IHBjaV9kZXYgKmRldjsKIAl1bnNpZ25lZCBsb25nIHNjcmF0Y2g7CiAJbG9uZyBpOwogCisJaWYgKGNhY2hlX2s4X25vcnRoYnJpZGdlcygpIDwgMCB8fCBudW1fazhfbm9ydGhicmlkZ2VzID09IDApIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiUENJLUdBUlQ6IE5vIEFNRCBub3J0aGJyaWRnZSBmb3VuZC5cbiIpOworCQlyZXR1cm47CisJfQorCiAjaWZuZGVmIENPTkZJR19BR1BfQU1ENjQKIAlub19hZ3AgPSAxOyAKICNlbHNlCkBAIC02MjIsNyArNTk1LDExIEBACiAjZW5kaWYJCiAKIAlpZiAoc3dpb3RsYikKLQkJcmV0dXJuIC0xOyAKKwkJcmV0dXJuOworCisJLyogRGlkIHdlIGRldGVjdCBhIGRpZmZlcmVudCBIVyBJT01NVT8gKi8KKwlpZiAoaW9tbXVfZGV0ZWN0ZWQgJiYgIWlvbW11X2FwZXJ0dXJlKQorCQlyZXR1cm47CiAKIAlpZiAobm9faW9tbXUgfHwKIAkgICAgKCFmb3JjZV9pb21tdSAmJiBlbmRfcGZuIDw9IE1BWF9ETUEzMl9QRk4pIHx8CkBAIC02MzQsMTUgKzYxMSw3IEBACiAJCQkJCSJidXQgSU9NTVUgbm90IGF2YWlsYWJsZS5cbiIKIAkJCSAgICAgICBLRVJOX0VSUiAiV0FSTklORyAzMmJpdCBQQ0kgbWF5IG1hbGZ1bmN0aW9uLlxuIik7CiAJCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCWkgPSAwOwotCWZvcl9hbGxfbmIoZGV2KQotCQlpKys7Ci0JaWYgKGkgPiBNQVhfTkIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJQQ0ktR0FSVDogVG9vIG1hbnkgbm9ydGhicmlkZ2VzICglbGQpLiBEaXNhYmxlZFxuIiwgaSk7Ci0JCXJldHVybiAtMTsKKwkJcmV0dXJuOwogCX0KIAogCXByaW50ayhLRVJOX0lORk8gIlBDSS1ETUE6IHVzaW5nIEdBUlQgSU9NTVUuXG4iKTsKQEAgLTcwNywyNiArNjc2LDEwIEBACiAJZm9yIChpID0gRU1FUkdFTkNZX1BBR0VTOyBpIDwgaW9tbXVfcGFnZXM7IGkrKykgCiAJCWlvbW11X2dhdHRfYmFzZVtpXSA9IGdhcnRfdW5tYXBwZWRfZW50cnk7CiAKLQlmb3JfYWxsX25iKGRldikgewotCQl1MzIgZmxhZzsgCi0JCWludCBjcHUgPSBQQ0lfU0xPVChkZXYtPmRldmZuKSAtIDI0OwotCQlpZiAoY3B1ID49IE1BWF9OQikKLQkJCWNvbnRpbnVlOwotCQlub3J0aGJyaWRnZXNbY3B1XSA9IGRldjsKLQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgMHg5YywgJmZsYWcpOyAvKiBjYWNoZSBmbHVzaCB3b3JkICovCi0JCW5vcnRoYnJpZGdlX2ZsdXNoX3dvcmRbY3B1XSA9IGZsYWc7IAotCX0KLQkJICAgICAKLQlmbHVzaF9nYXJ0KE5VTEwpOwotCisJZmx1c2hfZ2FydCgpOwogCWRtYV9vcHMgPSAmZ2FydF9kbWFfb3BzOwotCi0JcmV0dXJuIDA7CiB9IAogCi0vKiBNdXN0IGV4ZWN1dGUgYWZ0ZXIgUENJIHN1YnN5c3RlbSAqLwotZnNfaW5pdGNhbGwocGNpX2lvbW11X2luaXQpOwotCiB2b2lkIGdhcnRfcGFyc2Vfb3B0aW9ucyhjaGFyICpwKQogewogCWludCBhcmc7CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvcGNpLW5vbW11LmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvcGNpLW5vbW11LmMKaW5kZXggMWY2ZWNjNi4uYzRjM2NjMyAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL3BjaS1ub21tdS5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9wY2ktbm9tbXUuYwpAQCAtNCw2ICs0LDggQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKwogI2luY2x1ZGUgPGFzbS9wcm90by5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxhc20vZG1hLmg+CkBAIC0xMiwxMCArMTQsMTEgQEAKIGNoZWNrX2FkZHIoY2hhciAqbmFtZSwgc3RydWN0IGRldmljZSAqaHdkZXYsIGRtYV9hZGRyX3QgYnVzLCBzaXplX3Qgc2l6ZSkKIHsKICAgICAgICAgaWYgKGh3ZGV2ICYmIGJ1cyArIHNpemUgPiAqaHdkZXYtPmRtYV9tYXNrKSB7Ci0JCWlmICgqaHdkZXYtPmRtYV9tYXNrID49IDB4ZmZmZmZmZmZVTEwpCisJCWlmICgqaHdkZXYtPmRtYV9tYXNrID49IERNQV8zMkJJVF9NQVNLKQogCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkgICAgIm5vbW11XyVzOiBvdmVyZmxvdyAlTHgrJWx1IG9mIGRldmljZSBtYXNrICVMeFxuIiwKLQkgICAgICAgCQkJbmFtZSwgKGxvbmcgbG9uZylidXMsIHNpemUsIChsb25nIGxvbmcpKmh3ZGV2LT5kbWFfbWFzayk7CisJCQkgICAgIm5vbW11XyVzOiBvdmVyZmxvdyAlTHgrJXp1IG9mIGRldmljZSBtYXNrICVMeFxuIiwKKwkJCQluYW1lLCAobG9uZyBsb25nKWJ1cywgc2l6ZSwKKwkJCQkobG9uZyBsb25nKSpod2Rldi0+ZG1hX21hc2spOwogCQlyZXR1cm4gMDsKIAl9CiAJcmV0dXJuIDE7CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvcGNpLXN3aW90bGIuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9wY2ktc3dpb3RsYi5jCmluZGV4IDk5MGVkNjcuLmViZGI3N2YgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9wY2ktc3dpb3RsYi5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9wY2ktc3dpb3RsYi5jCkBAIC0zMSw3ICszMSw3IEBACiB2b2lkIHBjaV9zd2lvdGxiX2luaXQodm9pZCkKIHsKIAkvKiBkb24ndCBpbml0aWFsaXplIHN3aW90bGIgaWYgaW9tbXU9b2ZmIChub19pb21tdT0xKSAqLwotCWlmICghaW9tbXVfYXBlcnR1cmUgJiYgIW5vX2lvbW11ICYmCisJaWYgKCFpb21tdV9kZXRlY3RlZCAmJiAhbm9faW9tbXUgJiYKIAkgICAgKGVuZF9wZm4gPiBNQVhfRE1BMzJfUEZOIHx8IGZvcmNlX2lvbW11KSkKIAkgICAgICAgc3dpb3RsYiA9IDE7CiAJaWYgKHN3aW90bGIpIHsKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9wbXRpbWVyLmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvcG10aW1lci5jCmluZGV4IGJmNDIxZWQuLjc1NTQ0NTggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9wbXRpbWVyLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL3BtdGltZXIuYwpAQCAtMjcsNyArMjcsNyBAQAogLyogVGhlIEkvTyBwb3J0IHRoZSBQTVRNUiByZXNpZGVzIGF0LgogICogVGhlIGxvY2F0aW9uIGlzIGRldGVjdGVkIGR1cmluZyBzZXR1cF9hcmNoKCksCiAgKiBpbiBhcmNoL2kzODYva2VybmVsL2FjcGkvYm9vdC5jICovCi11MzIgcG10bXJfaW9wb3J0OwordTMyIHBtdG1yX2lvcG9ydCBfX3JlYWRfbW9zdGx5OwogCiAvKiB2YWx1ZSBvZiB0aGUgUG93ZXIgdGltZXIgYXQgbGFzdCB0aW1lciBpbnRlcnJ1cHQgKi8KIHN0YXRpYyB1MzIgb2Zmc2V0X2RlbGF5OwpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggZmI5MDNlNi4uY2E1NmUxOSAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvcHJvY2Vzcy5jCkBAIC0xMCw3ICsxMCw2IEBACiAgKglBbmRpIEtsZWVuLgogICoKICAqCUNQVSBob3RwbHVnIHN1cHBvcnQgLSBhc2hvay5yYWpAaW50ZWwuY29tCi0gKiAgJElkOiBwcm9jZXNzLmMsdiAxLjM4IDIwMDIvMDEvMTUgMTA6MDg6MDMgYWsgRXhwICQKICAqLwogCiAvKgpAQCAtNjQsNiArNjMsNyBAQAogICogUG93ZXJtYW5hZ2VtZW50IGlkbGUgZnVuY3Rpb24sIGlmIGFueS4uCiAgKi8KIHZvaWQgKCpwbV9pZGxlKSh2b2lkKTsKK0VYUE9SVF9TWU1CT0wocG1faWRsZSk7CiBzdGF0aWMgREVGSU5FX1BFUl9DUFUodW5zaWduZWQgaW50LCBjcHVfaWRsZV9zdGF0ZSk7CiAKIHN0YXRpYyBBVE9NSUNfTk9USUZJRVJfSEVBRChpZGxlX25vdGlmaWVyKTsKQEAgLTExMSw3ICsxMTEsNyBAQAogewogCWxvY2FsX2lycV9lbmFibGUoKTsKIAotCWNsZWFyX3RocmVhZF9mbGFnKFRJRl9QT0xMSU5HX05SRkxBRyk7CisJY3VycmVudF90aHJlYWRfaW5mbygpLT5zdGF0dXMgJj0gflRTX1BPTExJTkc7CiAJc21wX21iX19hZnRlcl9jbGVhcl9iaXQoKTsKIAl3aGlsZSAoIW5lZWRfcmVzY2hlZCgpKSB7CiAJCWxvY2FsX2lycV9kaXNhYmxlKCk7CkBAIC0xMjAsNyArMTIwLDcgQEAKIAkJZWxzZQogCQkJbG9jYWxfaXJxX2VuYWJsZSgpOwogCX0KLQlzZXRfdGhyZWFkX2ZsYWcoVElGX1BPTExJTkdfTlJGTEFHKTsKKwljdXJyZW50X3RocmVhZF9pbmZvKCktPnN0YXR1cyB8PSBUU19QT0xMSU5HOwogfQogCiAvKgpAQCAtMjAzLDggKzIwMyw3IEBACiAgKi8KIHZvaWQgY3B1X2lkbGUgKHZvaWQpCiB7Ci0Jc2V0X3RocmVhZF9mbGFnKFRJRl9QT0xMSU5HX05SRkxBRyk7Ci0KKwljdXJyZW50X3RocmVhZF9pbmZvKCktPnN0YXR1cyB8PSBUU19QT0xMSU5HOwogCS8qIGVuZGxlc3MgaWRsZSBsb29wIHdpdGggbm8gcHJpb3JpdHkgYXQgYWxsICovCiAJd2hpbGUgKDEpIHsKIAkJd2hpbGUgKCFuZWVkX3Jlc2NoZWQoKSkgewpAQCAtMzM1LDcgKzMzNCw3IEBACiB7CiAJcHJpbnRrKCJDUFUgJWQ6Iiwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKIAlfX3Nob3dfcmVncyhyZWdzKTsKLQlzaG93X3RyYWNlKCZyZWdzLT5yc3ApOworCXNob3dfdHJhY2UoTlVMTCwgcmVncywgKHZvaWQgKikocmVncyArIDEpKTsKIH0KIAogLyoKQEAgLTM2NSw4ICszNjQsMTEgQEAKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7CiAJc3RydWN0IHRocmVhZF9pbmZvICp0ID0gY3VycmVudF90aHJlYWRfaW5mbygpOwogCi0JaWYgKHQtPmZsYWdzICYgX1RJRl9BQklfUEVORElORykKKwlpZiAodC0+ZmxhZ3MgJiBfVElGX0FCSV9QRU5ESU5HKSB7CiAJCXQtPmZsYWdzIF49IChfVElGX0FCSV9QRU5ESU5HIHwgX1RJRl9JQTMyKTsKKwkJaWYgKHQtPmZsYWdzICYgX1RJRl9JQTMyKQorCQkJY3VycmVudF90aHJlYWRfaW5mbygpLT5zdGF0dXMgfD0gVFNfQ09NUEFUOworCX0KIAogCXRzay0+dGhyZWFkLmRlYnVncmVnMCA9IDA7CiAJdHNrLT50aHJlYWQuZGVidWdyZWcxID0gMDsKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9yZWJvb3QuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9yZWJvb3QuYwppbmRleCA1NzExN2I4Li4yZDY3Njk4IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvcmVib290LmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL3JlYm9vdC5jCkBAIC0yMCw2ICsyMCw3IEBACiAgKiBQb3dlciBvZmYgZnVuY3Rpb24sIGlmIGFueQogICovCiB2b2lkICgqcG1fcG93ZXJfb2ZmKSh2b2lkKTsKK0VYUE9SVF9TWU1CT0wocG1fcG93ZXJfb2ZmKTsKIAogc3RhdGljIGxvbmcgbm9faWR0WzNdOwogc3RhdGljIGVudW0geyAKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9zZXR1cC5jIGIvYXJjaC94ODZfNjQva2VybmVsL3NldHVwLmMKaW5kZXggYjhkNTExNi4uMTEyOTkxOCAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL3NldHVwLmMKQEAgLTUsOCArNSw2IEBACiAgKgogICogIE5vdiAyMDAxIERhdmUgSm9uZXMgPGRhdmVqQHN1c2UuZGU+CiAgKiAgRm9ya2VkIGZyb20gaTM4NiBzZXR1cCBjb2RlLgotICoKLSAqICAkSWQkCiAgKi8KIAogLyoKQEAgLTQ3LDcgKzQ1LDYgQEAKICNpbmNsdWRlIDxsaW51eC9kbWkuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+Ci0jaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgogCiAjaW5jbHVkZSA8YXNtL210cnIuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgpAQCAtNjYsOSArNjMsNyBAQAogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoX2FwaWMuaD4KICNpbmNsdWRlIDxhc20vbnVtYS5oPgotI2luY2x1ZGUgPGFzbS9zd2lvdGxiLmg+CiAjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+Ci0jaW5jbHVkZSA8YXNtL2dhcnQtbWFwcGluZy5oPgogI2luY2x1ZGUgPGFzbS9kbWkuaD4KIAogLyoKQEAgLTc2LDYgKzcxLDcgQEAKICAqLwogCiBzdHJ1Y3QgY3B1aW5mb194ODYgYm9vdF9jcHVfZGF0YSBfX3JlYWRfbW9zdGx5OworRVhQT1JUX1NZTUJPTChib290X2NwdV9kYXRhKTsKIAogdW5zaWduZWQgbG9uZyBtbXVfY3I0X2ZlYXR1cmVzOwogCkBAIC0xMDQsMTIgKzEwMCwxNCBAQAogICogU2V0dXAgb3B0aW9ucwogICovCiBzdHJ1Y3Qgc2NyZWVuX2luZm8gc2NyZWVuX2luZm87CitFWFBPUlRfU1lNQk9MKHNjcmVlbl9pbmZvKTsKIHN0cnVjdCBzeXNfZGVzY190YWJsZV9zdHJ1Y3QgewogCXVuc2lnbmVkIHNob3J0IGxlbmd0aDsKIAl1bnNpZ25lZCBjaGFyIHRhYmxlWzBdOwogfTsKIAogc3RydWN0IGVkaWRfaW5mbyBlZGlkX2luZm87CitFWFBPUlRfU1lNQk9MX0dQTChlZGlkX2luZm8pOwogc3RydWN0IGU4MjBtYXAgZTgyMDsKIAogZXh0ZXJuIGludCByb290X21vdW50ZmxhZ3M7CkBAIC00NzQsODAgKzQ3Miw2IEBACiB9IAogI2VuZGlmCiAKLS8qIFVzZSBpbmxpbmUgYXNzZW1ibHkgdG8gZGVmaW5lIHRoaXMgYmVjYXVzZSB0aGUgbm9wcyBhcmUgZGVmaW5lZCAKLSAgIGFzIGlubGluZSBhc3NlbWJseSBzdHJpbmdzIGluIHRoZSBpbmNsdWRlIGZpbGVzIGFuZCB3ZSBjYW5ub3QgCi0gICBnZXQgdGhlbSBlYXNpbHkgaW50byBzdHJpbmdzLiAqLwotYXNtKCJcdC5kYXRhXG5rOG5vcHM6ICIgCi0gICAgSzhfTk9QMSBLOF9OT1AyIEs4X05PUDMgSzhfTk9QNCBLOF9OT1A1IEs4X05PUDYKLSAgICBLOF9OT1A3IEs4X05PUDgpOyAKLSAgICAKLWV4dGVybiB1bnNpZ25lZCBjaGFyIGs4bm9wc1tdOwotc3RhdGljIHVuc2lnbmVkIGNoYXIgKms4X25vcHNbQVNNX05PUF9NQVgrMV0gPSB7IAotICAgICBOVUxMLAotICAgICBrOG5vcHMsCi0gICAgIGs4bm9wcyArIDEsCi0gICAgIGs4bm9wcyArIDEgKyAyLAotICAgICBrOG5vcHMgKyAxICsgMiArIDMsCi0gICAgIGs4bm9wcyArIDEgKyAyICsgMyArIDQsCi0gICAgIGs4bm9wcyArIDEgKyAyICsgMyArIDQgKyA1LAotICAgICBrOG5vcHMgKyAxICsgMiArIDMgKyA0ICsgNSArIDYsCi0gICAgIGs4bm9wcyArIDEgKyAyICsgMyArIDQgKyA1ICsgNiArIDcsCi19OyAKLQotZXh0ZXJuIGNoYXIgX192c3lzY2FsbF8wOwotCi0vKiBSZXBsYWNlIGluc3RydWN0aW9ucyB3aXRoIGJldHRlciBhbHRlcm5hdGl2ZXMgZm9yIHRoaXMgQ1BVIHR5cGUuCi0KLSAgIFRoaXMgcnVucyBiZWZvcmUgU01QIGlzIGluaXRpYWxpemVkIHRvIGF2b2lkIFNNUCBwcm9ibGVtcyB3aXRoCi0gICBzZWxmIG1vZGlmeWluZyBjb2RlLiBUaGlzIGltcGxpZXMgdGhhdCBhc3N5bWV0cmljIHN5c3RlbXMgd2hlcmUKLSAgIEFQcyBoYXZlIGxlc3MgY2FwYWJpbGl0aWVzIHRoYW4gdGhlIGJvb3QgcHJvY2Vzc29yIGFyZSBub3QgaGFuZGxlZC4gCi0gICBJbiB0aGlzIGNhc2UgYm9vdCB3aXRoICJub3JlcGxhY2VtZW50Ii4gKi8gCi12b2lkIGFwcGx5X2FsdGVybmF0aXZlcyh2b2lkICpzdGFydCwgdm9pZCAqZW5kKSAKLXsgCi0Jc3RydWN0IGFsdF9pbnN0ciAqYTsgCi0JaW50IGRpZmYsIGksIGs7Ci0JZm9yIChhID0gc3RhcnQ7ICh2b2lkICopYSA8IGVuZDsgYSsrKSB7IAotCQl1OCAqaW5zdHI7Ci0KLQkJaWYgKCFib290X2NwdV9oYXMoYS0+Y3B1aWQpKQotCQkJY29udGludWU7Ci0KLQkJQlVHX09OKGEtPnJlcGxhY2VtZW50bGVuID4gYS0+aW5zdHJsZW4pOyAKLQkJaW5zdHIgPSBhLT5pbnN0cjsKLQkJLyogdnN5c2NhbGwgY29kZSBpcyBub3QgbWFwcGVkIHlldC4gcmVzb2x2ZSBpdCBtYW51YWxseS4gKi8KLQkJaWYgKGluc3RyID49ICh1OCAqKVZTWVNDQUxMX1NUQVJUICYmIGluc3RyIDwgKHU4KilWU1lTQ0FMTF9FTkQpCi0JCQlpbnN0ciA9IF9fdmEoaW5zdHIgLSAodTgqKVZTWVNDQUxMX1NUQVJUICsgKHU4KilfX3BhX3N5bWJvbCgmX192c3lzY2FsbF8wKSk7Ci0JCV9faW5saW5lX21lbWNweShpbnN0ciwgYS0+cmVwbGFjZW1lbnQsIGEtPnJlcGxhY2VtZW50bGVuKTsKLQkJZGlmZiA9IGEtPmluc3RybGVuIC0gYS0+cmVwbGFjZW1lbnRsZW47IAotCi0JCS8qIFBhZCB0aGUgcmVzdCB3aXRoIG5vcHMgKi8KLQkJZm9yIChpID0gYS0+cmVwbGFjZW1lbnRsZW47IGRpZmYgPiAwOyBkaWZmIC09IGssIGkgKz0gaykgewotCQkJayA9IGRpZmY7Ci0JCQlpZiAoayA+IEFTTV9OT1BfTUFYKQotCQkJCWsgPSBBU01fTk9QX01BWDsKLQkJCV9faW5saW5lX21lbWNweShpbnN0ciArIGksIGs4X25vcHNba10sIGspOwotCQl9IAotCX0KLX0gCi0KLXN0YXRpYyBpbnQgbm9fcmVwbGFjZW1lbnQgX19pbml0ZGF0YSA9IDA7IAotIAotdm9pZCBfX2luaXQgYWx0ZXJuYXRpdmVfaW5zdHJ1Y3Rpb25zKHZvaWQpCi17Ci0JZXh0ZXJuIHN0cnVjdCBhbHRfaW5zdHIgX19hbHRfaW5zdHJ1Y3Rpb25zW10sIF9fYWx0X2luc3RydWN0aW9uc19lbmRbXTsKLQlpZiAobm9fcmVwbGFjZW1lbnQpIAotCQlyZXR1cm47Ci0JYXBwbHlfYWx0ZXJuYXRpdmVzKF9fYWx0X2luc3RydWN0aW9ucywgX19hbHRfaW5zdHJ1Y3Rpb25zX2VuZCk7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IG5vcmVwbGFjZW1lbnRfc2V0dXAoY2hhciAqcykKLXsgCi0gICAgIG5vX3JlcGxhY2VtZW50ID0gMTsgCi0gICAgIHJldHVybiAxOwotfSAKLQotX19zZXR1cCgibm9yZXBsYWNlbWVudCIsIG5vcmVwbGFjZW1lbnRfc2V0dXApOyAKLQogI2lmIGRlZmluZWQoQ09ORklHX0VERCkgfHwgZGVmaW5lZChDT05GSUdfRUREX01PRFVMRSkKIHN0cnVjdCBlZGQgZWRkOwogI2lmZGVmIENPTkZJR19FRERfTU9EVUxFCkBAIC01OTYsMTAwICs1MjAsNiBAQAogCQllYmRhX3NpemUgPSA2NCoxMDI0OwogfQogCi0jaWZkZWYgQ09ORklHX1NPRlRXQVJFX1NVU1BFTkQKLXN0YXRpYyB2b2lkIF9faW5pdCBtYXJrX25vc2F2ZV9wYWdlX3JhbmdlKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQotewotCXN0cnVjdCBwYWdlICpwYWdlOwotCXdoaWxlIChzdGFydCA8PSBlbmQpIHsKLQkJcGFnZSA9IHBmbl90b19wYWdlKHN0YXJ0KTsKLQkJU2V0UGFnZU5vc2F2ZShwYWdlKTsKLQkJc3RhcnQrKzsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBlODIwX25vc2F2ZV9yZXNlcnZlZF9wYWdlcyh2b2lkKQotewotCWludCBpOwotCXVuc2lnbmVkIGxvbmcgcl9zdGFydCA9IDAsIHJfZW5kID0gMDsKLQotCS8qIEFzc3VtZSBlODIwIG1hcCBpcyBzb3J0ZWQgKi8KLQlmb3IgKGkgPSAwOyBpIDwgZTgyMC5ucl9tYXA7IGkrKykgewotCQlzdHJ1Y3QgZTgyMGVudHJ5ICplaSA9ICZlODIwLm1hcFtpXTsKLQkJdW5zaWduZWQgbG9uZyBzdGFydCwgZW5kOwotCi0JCXN0YXJ0ID0gcm91bmRfZG93bihlaS0+YWRkciwgUEFHRV9TSVpFKTsKLQkJZW5kID0gcm91bmRfdXAoZWktPmFkZHIgKyBlaS0+c2l6ZSwgUEFHRV9TSVpFKTsKLQkJaWYgKHN0YXJ0ID49IGVuZCkKLQkJCWNvbnRpbnVlOwotCQlpZiAoZWktPnR5cGUgPT0gRTgyMF9SRVNFUlZFRCkKLQkJCWNvbnRpbnVlOwotCQlyX2VuZCA9IHN0YXJ0Pj5QQUdFX1NISUZUOwotCQkvKiBzd3N1c3AgaWdub3JlcyBpbnZhbGlkIHBmbiwgaWdub3JlIHRoZXNlIHBhZ2VzIGhlcmUgKi8KLQkJaWYgKHJfZW5kID4gZW5kX3BmbikKLQkJCXJfZW5kID0gZW5kX3BmbjsKLQkJaWYgKHJfZW5kID4gcl9zdGFydCkKLQkJCW1hcmtfbm9zYXZlX3BhZ2VfcmFuZ2Uocl9zdGFydCwgcl9lbmQtMSk7Ci0JCWlmIChyX2VuZCA+PSBlbmRfcGZuKQotCQkJYnJlYWs7Ci0JCXJfc3RhcnQgPSBlbmQ+PlBBR0VfU0hJRlQ7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgZTgyMF9zYXZlX2FjcGlfcGFnZXModm9pZCkKLXsKLQlpbnQgaTsKLQotCS8qIEFzc3VtZSBlODIwIG1hcCBpcyBzb3J0ZWQgKi8KLQlmb3IgKGkgPSAwOyBpIDwgZTgyMC5ucl9tYXA7IGkrKykgewotCQlzdHJ1Y3QgZTgyMGVudHJ5ICplaSA9ICZlODIwLm1hcFtpXTsKLQkJdW5zaWduZWQgbG9uZyBzdGFydCwgZW5kOwotCi0JCXN0YXJ0ID0gZWktPmFkZHIsIFBBR0VfU0laRTsKLQkJZW5kID0gZWktPmFkZHIgKyBlaS0+c2l6ZTsKLQkJaWYgKHN0YXJ0ID49IGVuZCkKLQkJCWNvbnRpbnVlOwotCQlpZiAoZWktPnR5cGUgIT0gRTgyMF9BQ1BJICYmIGVpLT50eXBlICE9IEU4MjBfTlZTKQotCQkJY29udGludWU7Ci0JCS8qCi0JCSAqIElmIHRoZSByZWdpb24gaXMgYmVsb3cgZW5kX3BmbiwgaXQgd2lsbCBiZQotCQkgKiBzYXZlZC9yZXN0b3JlZCBieSBzd3N1c3AgZm9sbG93ICdSQU0nIHR5cGUuCi0JCSAqLwotCQlpZiAoc3RhcnQgPCAoZW5kX3BmbiA8PCBQQUdFX1NISUZUKSkKLQkJCXN0YXJ0ID0gZW5kX3BmbiA8PCBQQUdFX1NISUZUOwotCQlpZiAoZW5kID4gc3RhcnQpCi0JCQlzd3N1c3BfYWRkX2FyY2hfcGFnZXMoc3RhcnQsIGVuZCk7Ci0JfQotfQotCi1leHRlcm4gY2hhciBfX3N0YXJ0X3JvZGF0YSwgX19lbmRfcm9kYXRhOwotLyoKLSAqIEJJT1MgcmVzZXJ2ZWQgcmVnaW9uL2hvbGUgLSBubyBzYXZlL3Jlc3RvcmUKLSAqIEFDUEkgTlZTIC0gc2F2ZS9yZXN0b3JlCi0gKiBBQ1BJIERhdGEgLSB0aGlzIGlzIGEgbGl0dGxlIHRyaWNreSwgdGhlIG1lbSBjb3VsZCBiZSB1c2VkIGJ5IE9TIGFmdGVyIE9TCi0gKiByZWFkcyB0YWJsZXMgZnJvbSB0aGUgcmVnaW9uLCBidXQgYW55d2F5IHNhdmUvcmVzdG9yZSB0aGUgbWVtb3J5IGhhc24ndCBhbnkKLSAqIHNpZGUgZWZmZWN0IGFuZCBMaW51eCBydW50aW1lIG1vZHVsZSBsb2FkL3VubG9hZCBtaWdodCB1c2UgaXQuCi0gKiBrZXJuZWwgcm9kYXRhIC0gbm8gc2F2ZS9yZXN0b3JlIChrZXJuZWwgcm9kYXRhIGlzbid0IGNoYW5nZWQpCi0gKi8KLXN0YXRpYyBpbnQgX19pbml0IG1hcmtfbm9zYXZlX3BhZ2VzKHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyBwZm5fc3RhcnQsIHBmbl9lbmQ7Ci0KLQkvKiBCSU9TIHJlc2VydmVkIHJlZ2lvbnMgJiBob2xlcyAqLwotCWU4MjBfbm9zYXZlX3Jlc2VydmVkX3BhZ2VzKCk7Ci0KLQkvKiBrZXJuZWwgcm9kYXRhICovCi0JcGZuX3N0YXJ0ID0gcm91bmRfdXAoX19wYV9zeW1ib2woJl9fc3RhcnRfcm9kYXRhKSwgUEFHRV9TSVpFKSA+PiBQQUdFX1NISUZUOwotCXBmbl9lbmQgPSByb3VuZF9kb3duKF9fcGFfc3ltYm9sKCZfX2VuZF9yb2RhdGEpLCBQQUdFX1NJWkUpID4+IFBBR0VfU0hJRlQ7Ci0JbWFya19ub3NhdmVfcGFnZV9yYW5nZShwZm5fc3RhcnQsIHBmbl9lbmQtMSk7Ci0KLQkvKiByZWNvcmQgQUNQSSBEYXRhL05WUyBhcyBzYXZlYWJsZSAqLwotCWU4MjBfc2F2ZV9hY3BpX3BhZ2VzKCk7Ci0KLQlyZXR1cm4gMDsKLX0KLWNvcmVfaW5pdGNhbGwobWFya19ub3NhdmVfcGFnZXMpOwotI2VuZGlmCi0KIHZvaWQgX19pbml0IHNldHVwX2FyY2goY2hhciAqKmNtZGxpbmVfcCkKIHsKIAl1bnNpZ25lZCBsb25nIGtlcm5lbF9lbmQ7CkBAIC04MjMsNyArNjUzLDcgQEAKICNlbmRpZgogI2lmZGVmIENPTkZJR19LRVhFQwogCWlmIChjcmFzaGtfcmVzLnN0YXJ0ICE9IGNyYXNoa19yZXMuZW5kKSB7Ci0JCXJlc2VydmVfYm9vdG1lbShjcmFzaGtfcmVzLnN0YXJ0LAorCQlyZXNlcnZlX2Jvb3RtZW1fZ2VuZXJpYyhjcmFzaGtfcmVzLnN0YXJ0LAogCQkJY3Jhc2hrX3Jlcy5lbmQgLSBjcmFzaGtfcmVzLnN0YXJ0ICsgMSk7CiAJfQogI2VuZGlmCkBAIC04NzQsMTAgKzcwNCw2IEBACiAKIAllODIwX3NldHVwX2dhcCgpOwogCi0jaWZkZWYgQ09ORklHX0dBUlRfSU9NTVUKLQlpb21tdV9ob2xlX2luaXQoKTsKLSNlbmRpZgotCiAjaWZkZWYgQ09ORklHX1ZUCiAjaWYgZGVmaW5lZChDT05GSUdfVkdBX0NPTlNPTEUpCiAJY29uc3dpdGNocCA9ICZ2Z2FfY29uOwpAQCAtOTYyLDI0ICs3ODgsMzIgQEAKIHN0YXRpYyB2b2lkIF9faW5pdCBhbWRfZGV0ZWN0X2NtcChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCiB7CiAjaWZkZWYgQ09ORklHX1NNUAotCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAJdW5zaWduZWQgYml0czsKICNpZmRlZiBDT05GSUdfTlVNQQorCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAJaW50IG5vZGUgPSAwOwogCXVuc2lnbmVkIGFwaWNpZCA9IGhhcmRfc21wX3Byb2Nlc3Nvcl9pZCgpOwogI2VuZGlmCisJdW5zaWduZWQgZWN4ID0gY3B1aWRfZWN4KDB4ODAwMDAwMDgpOwogCi0JYml0cyA9IDA7Ci0Jd2hpbGUgKCgxIDw8IGJpdHMpIDwgYy0+eDg2X21heF9jb3JlcykKLQkJYml0cysrOworCWMtPng4Nl9tYXhfY29yZXMgPSAoZWN4ICYgMHhmZikgKyAxOworCisJLyogQ1BVIHRlbGxpbmcgdXMgdGhlIGNvcmUgaWQgYml0cyBzaGlmdD8gKi8KKwliaXRzID0gKGVjeCA+PiAxMikgJiAweEY7CisKKwkvKiBPdGhlcndpc2UgcmVjb21wdXRlICovCisJaWYgKGJpdHMgPT0gMCkgeworCQl3aGlsZSAoKDEgPDwgYml0cykgPCBjLT54ODZfbWF4X2NvcmVzKQorCQkJYml0cysrOworCX0KIAogCS8qIExvdyBvcmRlciBiaXRzIGRlZmluZSB0aGUgY29yZSBpZCAoaW5kZXggb2YgY29yZSBpbiBzb2NrZXQpICovCi0JY3B1X2NvcmVfaWRbY3B1XSA9IHBoeXNfcHJvY19pZFtjcHVdICYgKCgxIDw8IGJpdHMpLTEpOworCWMtPmNwdV9jb3JlX2lkID0gYy0+cGh5c19wcm9jX2lkICYgKCgxIDw8IGJpdHMpLTEpOwogCS8qIENvbnZlcnQgdGhlIEFQSUMgSUQgaW50byB0aGUgc29ja2V0IElEICovCi0JcGh5c19wcm9jX2lkW2NwdV0gPSBwaHlzX3BrZ19pZChiaXRzKTsKKwljLT5waHlzX3Byb2NfaWQgPSBwaHlzX3BrZ19pZChiaXRzKTsKIAogI2lmZGVmIENPTkZJR19OVU1BCi0gIAlub2RlID0gcGh5c19wcm9jX2lkW2NwdV07CisgIAlub2RlID0gYy0+cGh5c19wcm9jX2lkOwogIAlpZiAoYXBpY2lkX3RvX25vZGVbYXBpY2lkXSAhPSBOVU1BX05PX05PREUpCiAgCQlub2RlID0gYXBpY2lkX3RvX25vZGVbYXBpY2lkXTsKICAJaWYgKCFub2RlX29ubGluZShub2RlKSkgewpAQCAtOTkyLDcgKzgyNiw3IEBACiAgCQkgICBidXQgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhlIEhUIG5vZGVpZHMuCiAgCQkgICBJZiB0aGF0IGRvZXNuJ3QgcmVzdWx0IGluIGEgdXNhYmxlIG5vZGUgZmFsbCBiYWNrIHRvIHRoZQogIAkJICAgcGF0aCBmb3IgdGhlIHByZXZpb3VzIGNhc2UuICAqLwotIAkJaW50IGh0X25vZGVpZCA9IGFwaWNpZCAtIChwaHlzX3Byb2NfaWRbMF0gPDwgYml0cyk7CisgCQlpbnQgaHRfbm9kZWlkID0gYXBpY2lkIC0gKGNwdV9kYXRhWzBdLnBoeXNfcHJvY19pZCA8PCBiaXRzKTsKICAJCWlmIChodF9ub2RlaWQgPj0gMCAmJgogIAkJICAgIGFwaWNpZF90b19ub2RlW2h0X25vZGVpZF0gIT0gTlVNQV9OT19OT0RFKQogIAkJCW5vZGUgPSBhcGljaWRfdG9fbm9kZVtodF9ub2RlaWRdOwpAQCAtMTAwMiwxNSArODM2LDEzIEBACiAgCX0KIAludW1hX3NldF9ub2RlKGNwdSwgbm9kZSk7CiAKLSAgCXByaW50ayhLRVJOX0lORk8gIkNQVSAlZC8leCglZCkgLT4gTm9kZSAlZCAtPiBDb3JlICVkXG4iLAotICAJCQljcHUsIGFwaWNpZCwgYy0+eDg2X21heF9jb3Jlcywgbm9kZSwgY3B1X2NvcmVfaWRbY3B1XSk7CisJcHJpbnRrKEtFUk5fSU5GTyAiQ1BVICVkLyV4IC0+IE5vZGUgJWRcbiIsIGNwdSwgYXBpY2lkLCBub2RlKTsKICNlbmRpZgogI2VuZGlmCiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IGluaXRfYW1kKHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKK3N0YXRpYyB2b2lkIF9faW5pdCBpbml0X2FtZChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCiB7Ci0JaW50IHI7CiAJdW5zaWduZWQgbGV2ZWw7CiAKICNpZmRlZiBDT05GSUdfU01QCkBAIC0xMDQzLDggKzg3NSw4IEBACiAJaWYgKGMtPng4NiA+PSA2KQogCQlzZXRfYml0KFg4Nl9GRUFUVVJFX0ZYU0FWRV9MRUFLLCAmYy0+eDg2X2NhcGFiaWxpdHkpOwogCi0JciA9IGdldF9tb2RlbF9uYW1lKGMpOwotCWlmICghcikgeyAKKwlsZXZlbCA9IGdldF9tb2RlbF9uYW1lKGMpOworCWlmICghbGV2ZWwpIHsKIAkJc3dpdGNoIChjLT54ODYpIHsgCiAJCWNhc2UgMTU6CiAJCQkvKiBTaG91bGQgZGlzdGluZ3Vpc2ggTW9kZWxzIGhlcmUsIGJ1dCB0aGlzIGlzIG9ubHkKQEAgLTEwNTksMTMgKzg5MSwxMiBAQAogCWlmIChjLT54ODZfcG93ZXIgJiAoMTw8OCkpCiAJCXNldF9iaXQoWDg2X0ZFQVRVUkVfQ09OU1RBTlRfVFNDLCAmYy0+eDg2X2NhcGFiaWxpdHkpOwogCi0JaWYgKGMtPmV4dGVuZGVkX2NwdWlkX2xldmVsID49IDB4ODAwMDAwMDgpIHsKLQkJYy0+eDg2X21heF9jb3JlcyA9IChjcHVpZF9lY3goMHg4MDAwMDAwOCkgJiAweGZmKSArIDE7Ci0KKwkvKiBNdWx0aSBjb3JlIENQVT8gKi8KKwlpZiAoYy0+ZXh0ZW5kZWRfY3B1aWRfbGV2ZWwgPj0gMHg4MDAwMDAwOCkKIAkJYW1kX2RldGVjdF9jbXAoYyk7Ci0JfQogCi0JcmV0dXJuIHI7CisJLyogRml4IGNwdWlkNCBlbXVsYXRpb24gZm9yIG1vcmUgKi8KKwludW1fY2FjaGVfbGVhdmVzID0gMzsKIH0KIAogc3RhdGljIHZvaWQgX19jcHVpbml0IGRldGVjdF9odChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCkBAIC0xMDczLDEzICs5MDQsMTQgQEAKICNpZmRlZiBDT05GSUdfU01QCiAJdTMyIAllYXgsIGVieCwgZWN4LCBlZHg7CiAJaW50IAlpbmRleF9tc2IsIGNvcmVfYml0czsKLQlpbnQgCWNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIAogCWNwdWlkKDEsICZlYXgsICZlYngsICZlY3gsICZlZHgpOwogCiAKLQlpZiAoIWNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfSFQpIHx8IGNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfQ01QX0xFR0FDWSkpCisJaWYgKCFjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX0hUKSkKIAkJcmV0dXJuOworIAlpZiAoY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9DTVBfTEVHQUNZKSkKKwkJZ290byBvdXQ7CiAKIAlzbXBfbnVtX3NpYmxpbmdzID0gKGVieCAmIDB4ZmYwMDAwKSA+PiAxNjsKIApAQCAtMTA5NCwxMCArOTI2LDcgQEAKIAkJfQogCiAJCWluZGV4X21zYiA9IGdldF9jb3VudF9vcmRlcihzbXBfbnVtX3NpYmxpbmdzKTsKLQkJcGh5c19wcm9jX2lkW2NwdV0gPSBwaHlzX3BrZ19pZChpbmRleF9tc2IpOwotCi0JCXByaW50ayhLRVJOX0lORk8gICJDUFU6IFBoeXNpY2FsIFByb2Nlc3NvciBJRDogJWRcbiIsCi0JCSAgICAgICBwaHlzX3Byb2NfaWRbY3B1XSk7CisJCWMtPnBoeXNfcHJvY19pZCA9IHBoeXNfcGtnX2lkKGluZGV4X21zYik7CiAKIAkJc21wX251bV9zaWJsaW5ncyA9IHNtcF9udW1fc2libGluZ3MgLyBjLT54ODZfbWF4X2NvcmVzOwogCkBAIC0xMTA1LDEzICs5MzQsMTUgQEAKIAogCQljb3JlX2JpdHMgPSBnZXRfY291bnRfb3JkZXIoYy0+eDg2X21heF9jb3Jlcyk7CiAKLQkJY3B1X2NvcmVfaWRbY3B1XSA9IHBoeXNfcGtnX2lkKGluZGV4X21zYikgJgorCQljLT5jcHVfY29yZV9pZCA9IHBoeXNfcGtnX2lkKGluZGV4X21zYikgJgogCQkJCQkgICAgICAgKCgxIDw8IGNvcmVfYml0cykgLSAxKTsKLQotCQlpZiAoYy0+eDg2X21heF9jb3JlcyA+IDEpCi0JCQlwcmludGsoS0VSTl9JTkZPICAiQ1BVOiBQcm9jZXNzb3IgQ29yZSBJRDogJWRcbiIsCi0JCQkgICAgICAgY3B1X2NvcmVfaWRbY3B1XSk7CiAJfQorb3V0OgorCWlmICgoYy0+eDg2X21heF9jb3JlcyAqIHNtcF9udW1fc2libGluZ3MpID4gMSkgeworCQlwcmludGsoS0VSTl9JTkZPICAiQ1BVOiBQaHlzaWNhbCBQcm9jZXNzb3IgSUQ6ICVkXG4iLCBjLT5waHlzX3Byb2NfaWQpOworCQlwcmludGsoS0VSTl9JTkZPICAiQ1BVOiBQcm9jZXNzb3IgQ29yZSBJRDogJWRcbiIsIGMtPmNwdV9jb3JlX2lkKTsKKwl9CisKICNlbmRpZgogfQogCkBAIC0xMTIwLDE1ICs5NTEsMTIgQEAKICAqLwogc3RhdGljIGludCBfX2NwdWluaXQgaW50ZWxfbnVtX2NwdV9jb3JlcyhzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCiB7Ci0JdW5zaWduZWQgaW50IGVheDsKKwl1bnNpZ25lZCBpbnQgZWF4LCB0OwogCiAJaWYgKGMtPmNwdWlkX2xldmVsIDwgNCkKIAkJcmV0dXJuIDE7CiAKLQlfX2FzbV9fKCJjcHVpZCIKLQkJOiAiPWEiIChlYXgpCi0JCTogIjAiICg0KSwgImMiICgwKQotCQk6ICJieCIsICJkeCIpOworCWNwdWlkX2NvdW50KDQsIDAsICZlYXgsICZ0LCAmdCwgJnQpOwogCiAJaWYgKGVheCAmIDB4MWYpCiAJCXJldHVybiAoKGVheCA+PiAyNikgKyAxKTsKQEAgLTExNDEsMTYgKzk2OSwxNyBAQAogI2lmZGVmIENPTkZJR19OVU1BCiAJdW5zaWduZWQgbm9kZTsKIAlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCWludCBhcGljaWQgPSBoYXJkX3NtcF9wcm9jZXNzb3JfaWQoKTsKIAogCS8qIERvbid0IGRvIHRoZSBmdW5reSBmYWxsYmFjayBoZXVyaXN0aWNzIHRoZSBBTUQgdmVyc2lvbiBlbXBsb3lzCiAJICAgZm9yIG5vdy4gKi8KLQlub2RlID0gYXBpY2lkX3RvX25vZGVbaGFyZF9zbXBfcHJvY2Vzc29yX2lkKCldOworCW5vZGUgPSBhcGljaWRfdG9fbm9kZVthcGljaWRdOwogCWlmIChub2RlID09IE5VTUFfTk9fTk9ERSkKIAkJbm9kZSA9IGZpcnN0X25vZGUobm9kZV9vbmxpbmVfbWFwKTsKIAludW1hX3NldF9ub2RlKGNwdSwgbm9kZSk7CiAKIAlpZiAoYWNwaV9udW1hID4gMCkKLQkJcHJpbnRrKEtFUk5fSU5GTyAiQ1BVICVkIC0+IE5vZGUgJWRcbiIsIGNwdSwgbm9kZSk7CisJCXByaW50ayhLRVJOX0lORk8gIkNQVSAlZC8leCAtPiBOb2RlICVkXG4iLCBjcHUsIGFwaWNpZCwgbm9kZSk7CiAjZW5kaWYKIH0KIApAQCAtMTE2MCw2ICs5ODksMTMgQEAKIAl1bnNpZ25lZCBuOwogCiAJaW5pdF9pbnRlbF9jYWNoZWluZm8oYyk7CisJaWYgKGMtPmNwdWlkX2xldmVsID4gOSApIHsKKwkJdW5zaWduZWQgZWF4ID0gY3B1aWRfZWF4KDEwKTsKKwkJLyogQ2hlY2sgZm9yIHZlcnNpb24gYW5kIHRoZSBudW1iZXIgb2YgY291bnRlcnMgKi8KKwkJaWYgKChlYXggJiAweGZmKSAmJiAoKChlYXg+PjgpICYgMHhmZikgPiAxKSkKKwkJCXNldF9iaXQoWDg2X0ZFQVRVUkVfQVJDSF9QRVJGTU9OLCAmYy0+eDg2X2NhcGFiaWxpdHkpOworCX0KKwogCW4gPSBjLT5leHRlbmRlZF9jcHVpZF9sZXZlbDsKIAlpZiAobiA+PSAweDgwMDAwMDA4KSB7CiAJCXVuc2lnbmVkIGVheCA9IGNwdWlkX2VheCgweDgwMDAwMDA4KTsKQEAgLTEyNTEsNyArMTA4Nyw3IEBACiAJfQogCiAjaWZkZWYgQ09ORklHX1NNUAotCXBoeXNfcHJvY19pZFtzbXBfcHJvY2Vzc29yX2lkKCldID0gKGNwdWlkX2VieCgxKSA+PiAyNCkgJiAweGZmOworCWMtPnBoeXNfcHJvY19pZCA9IChjcHVpZF9lYngoMSkgPj4gMjQpICYgMHhmZjsKICNlbmRpZgogfQogCkBAIC0xMzc4LDcgKzEyMTQsNyBAQAogCQlOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAogCQlOVUxMLCBOVUxMLCBOVUxMLCAic3lzY2FsbCIsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCiAJCU5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsICJueCIsIE5VTEwsICJtbXhleHQiLCBOVUxMLAotCQlOVUxMLCAiZnhzcl9vcHQiLCAicmR0c2NwIiwgTlVMTCwgTlVMTCwgImxtIiwgIjNkbm93ZXh0IiwgIjNkbm93IiwKKwkJTlVMTCwgImZ4c3Jfb3B0IiwgTlVMTCwgInJkdHNjcCIsIE5VTEwsICJsbSIsICIzZG5vd2V4dCIsICIzZG5vdyIsCiAKIAkJLyogVHJhbnNtZXRhLWRlZmluZWQgKi8KIAkJInJlY292ZXJ5IiwgImxvbmdydW4iLCBOVUxMLCAibHJ0aSIsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCkBAIC0xMzg5LDcgKzEyMjUsNyBAQAogCQkvKiBPdGhlciAoTGludXgtZGVmaW5lZCkgKi8KIAkJImN4bW14IiwgTlVMTCwgImN5cml4X2FyciIsICJjZW50YXVyX21jciIsIE5VTEwsCiAJCSJjb25zdGFudF90c2MiLCBOVUxMLCBOVUxMLAotCQlOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAorCQkidXAiLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAogCQlOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAogCQlOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAogCkBAIC0xNDU5LDkgKzEyOTUsOSBAQAogI2lmZGVmIENPTkZJR19TTVAKIAlpZiAoc21wX251bV9zaWJsaW5ncyAqIGMtPng4Nl9tYXhfY29yZXMgPiAxKSB7CiAJCWludCBjcHUgPSBjIC0gY3B1X2RhdGE7Ci0JCXNlcV9wcmludGYobSwgInBoeXNpY2FsIGlkXHQ6ICVkXG4iLCBwaHlzX3Byb2NfaWRbY3B1XSk7CisJCXNlcV9wcmludGYobSwgInBoeXNpY2FsIGlkXHQ6ICVkXG4iLCBjLT5waHlzX3Byb2NfaWQpOwogCQlzZXFfcHJpbnRmKG0sICJzaWJsaW5nc1x0OiAlZFxuIiwgY3B1c193ZWlnaHQoY3B1X2NvcmVfbWFwW2NwdV0pKTsKLQkJc2VxX3ByaW50ZihtLCAiY29yZSBpZFx0XHQ6ICVkXG4iLCBjcHVfY29yZV9pZFtjcHVdKTsKKwkJc2VxX3ByaW50ZihtLCAiY29yZSBpZFx0XHQ6ICVkXG4iLCBjLT5jcHVfY29yZV9pZCk7CiAJCXNlcV9wcmludGYobSwgImNwdSBjb3Jlc1x0OiAlZFxuIiwgYy0+Ym9vdGVkX2NvcmVzKTsKIAl9CiAjZW5kaWYJCkBAIC0xNTM1LDcgKzEzNzEsNyBAQAogCS5zaG93ID0Jc2hvd19jcHVpbmZvLAogfTsKIAotI2lmZGVmIENPTkZJR19JTlBVVF9QQ1NQS1IKKyNpZiBkZWZpbmVkKENPTkZJR19JTlBVVF9QQ1NQS1IpIHx8IGRlZmluZWQoQ09ORklHX0lOUFVUX1BDU1BLUl9NT0RVTEUpCiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiBzdGF0aWMgX19pbml0IGludCBhZGRfcGNzcGtyKHZvaWQpCiB7CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvc2V0dXA2NC5jIGIvYXJjaC94ODZfNjQva2VybmVsL3NldHVwNjQuYwppbmRleCA4YTY5MWZhLi5mNTkzNGNiIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvc2V0dXA2NC5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9zZXR1cDY0LmMKQEAgLTMsNyArMyw2IEBACiAgKiBDb3B5cmlnaHQgKEMpIDE5OTUgIExpbnVzIFRvcnZhbGRzCiAgKiBDb3B5cmlnaHQgMjAwMSwgMjAwMiwgMjAwMyBTdVNFIExhYnMgLyBBbmRpIEtsZWVuLgogICogU2VlIHNldHVwLmMgZm9yIG9sZGVyIGNoYW5nZWxvZy4KLSAqICRJZDogc2V0dXA2NC5jLHYgMS4xMiAyMDAyLzAzLzIxIDEwOjA5OjE3IGFrIEV4cCAkCiAgKi8gCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpAQCAtMzEsNiArMzAsNyBAQAogY3B1bWFza190IGNwdV9pbml0aWFsaXplZCBfX2NwdWluaXRkYXRhID0gQ1BVX01BU0tfTk9ORTsKIAogc3RydWN0IHg4NjY0X3BkYSAqX2NwdV9wZGFbTlJfQ1BVU10gX19yZWFkX21vc3RseTsKK0VYUE9SVF9TWU1CT0woX2NwdV9wZGEpOwogc3RydWN0IHg4NjY0X3BkYSBib290X2NwdV9wZGFbTlJfQ1BVU10gX19jYWNoZWxpbmVfYWxpZ25lZDsKIAogc3RydWN0IGRlc2NfcHRyIGlkdF9kZXNjciA9IHsgMjU2ICogMTYgLSAxLCAodW5zaWduZWQgbG9uZykgaWR0X3RhYmxlIH07CkBAIC0zOCw2ICszOCw3IEBACiBjaGFyIGJvb3RfY3B1X3N0YWNrW0lSUVNUQUNLU0laRV0gX19hdHRyaWJ1dGVfXygoc2VjdGlvbigiLmJzcy5wYWdlX2FsaWduZWQiKSkpOwogCiB1bnNpZ25lZCBsb25nIF9fc3VwcG9ydGVkX3B0ZV9tYXNrIF9fcmVhZF9tb3N0bHkgPSB+MFVMOworRVhQT1JUX1NZTUJPTChfX3N1cHBvcnRlZF9wdGVfbWFzayk7CiBzdGF0aWMgaW50IGRvX25vdF9ueCBfX2NwdWluaXRkYXRhID0gMDsKIAogLyogbm9leGVjPW9ufG9mZgpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL3NpZ25hbC5jIGIvYXJjaC94ODZfNjQva2VybmVsL3NpZ25hbC5jCmluZGV4IGU1ZjVjZTc5Li4yODE2MTE3IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvc2lnbmFsLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL3NpZ25hbC5jCkBAIC03LDggKzcsNiBAQAogICogIDE5OTctMTEtMjggIE1vZGlmaWVkIGZvciBQT1NJWC4xYiBzaWduYWxzIGJ5IFJpY2hhcmQgSGVuZGVyc29uCiAgKiAgMjAwMC0wNi0yMCAgUGVudGl1bSBJSUkgRlhTUiwgU1NFIHN1cHBvcnQgYnkgR2FyZXRoIEh1Z2hlcwogICogIDIwMDAtMjAwMiAgIHg4Ni02NCBzdXBwb3J0IGJ5IEFuZGkgS2xlZW4KLSAqIAotICogICRJZDogc2lnbmFsLmMsdiAxLjE4IDIwMDEvMTAvMTcgMjI6MzA6MzcgYWsgRXhwICQKICAqLwogCiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KQEAgLTIzOSw3ICsyMzcsNiBAQAogCXJzcCA9IHJlZ3MtPnJzcCAtIDEyODsKIAogCS8qIFRoaXMgaXMgdGhlIFgvT3BlbiBzYW5jdGlvbmVkIHNpZ25hbCBzdGFjayBzd2l0Y2hpbmcuICAqLwotCS8qIFJFRC1QRU46IHJlZHpvbmUgb24gdGhhdCBzdGFjaz8gKi8KIAlpZiAoa2EtPnNhLnNhX2ZsYWdzICYgU0FfT05TVEFDSykgewogCQlpZiAoc2FzX3NzX2ZsYWdzKHJzcCkgPT0gMCkKIAkJCXJzcCA9IGN1cnJlbnQtPnNhc19zc19zcCArIGN1cnJlbnQtPnNhc19zc19zaXplOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL3NtcC5jIGIvYXJjaC94ODZfNjQva2VybmVsL3NtcC5jCmluZGV4IDRhNjYyOGIuLmFjZWU0YmMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9zbXAuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvc21wLmMKQEAgLTIyNCw2ICsyMjQsNyBAQAogCQlmbHVzaF90bGJfb3RoZXJzKGNwdV9tYXNrLCBtbSwgRkxVU0hfQUxMKTsKIAlwcmVlbXB0X2VuYWJsZSgpOwogfQorRVhQT1JUX1NZTUJPTChmbHVzaF90bGJfY3VycmVudF90YXNrKTsKIAogdm9pZCBmbHVzaF90bGJfbW0gKHN0cnVjdCBtbV9zdHJ1Y3QgKiBtbSkKIHsKQEAgLTI0NCw2ICsyNDUsNyBAQAogCiAJcHJlZW1wdF9lbmFibGUoKTsKIH0KK0VYUE9SVF9TWU1CT0woZmx1c2hfdGxiX21tKTsKIAogdm9pZCBmbHVzaF90bGJfcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKiB2bWEsIHVuc2lnbmVkIGxvbmcgdmEpCiB7CkBAIC0yNjYsNiArMjY4LDcgQEAKIAogCXByZWVtcHRfZW5hYmxlKCk7CiB9CitFWFBPUlRfU1lNQk9MKGZsdXNoX3RsYl9wYWdlKTsKIAogc3RhdGljIHZvaWQgZG9fZmx1c2hfdGxiX2FsbCh2b2lkKiBpbmZvKQogewpAQCAtNDQzLDYgKzQ0Niw3IEBACiAJc3Bpbl91bmxvY2soJmNhbGxfbG9jayk7CiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MKHNtcF9jYWxsX2Z1bmN0aW9uKTsKIAogdm9pZCBzbXBfc3RvcF9jcHUodm9pZCkKIHsKQEAgLTQ2MCw3ICs0NjQsNyBAQAogewogCXNtcF9zdG9wX2NwdSgpOyAKIAlmb3IgKDs7KSAKLQkJYXNtKCJobHQiKTsgCisJCWhhbHQoKTsKIH0gCiAKIHZvaWQgc21wX3NlbmRfc3RvcCh2b2lkKQpAQCAtNDcwLDcgKzQ3NCw3IEBACiAJCXJldHVybjsKIAkvKiBEb24ndCBkZWFkbG9jayBvbiB0aGUgY2FsbCBsb2NrIGluIHBhbmljICovCiAJaWYgKCFzcGluX3RyeWxvY2soJmNhbGxfbG9jaykpIHsKLQkJLyogaWdub3JlIGxvY2tpbmcgYmVjYXVzZSB3ZSBoYXZlIHBhbmljZWQgYW55d2F5cyAqLworCQkvKiBpZ25vcmUgbG9ja2luZyBiZWNhdXNlIHdlIGhhdmUgcGFuaWNrZWQgYW55d2F5cyAqLwogCQlub2xvY2sgPSAxOwogCX0KIAlfX3NtcF9jYWxsX2Z1bmN0aW9uKHNtcF9yZWFsbHlfc3RvcF9jcHUsIE5VTEwsIDAsIDApOwpAQCAtNTIwLDEzICs1MjQsMTMgQEAKIAogaW50IHNhZmVfc21wX3Byb2Nlc3Nvcl9pZCh2b2lkKQogewotCWludCBhcGljaWQsIGk7CisJdW5zaWduZWQgYXBpY2lkLCBpOwogCiAJaWYgKGRpc2FibGVfYXBpYykKIAkJcmV0dXJuIDA7CiAKIAlhcGljaWQgPSBoYXJkX3NtcF9wcm9jZXNzb3JfaWQoKTsKLQlpZiAoeDg2X2NwdV90b19hcGljaWRbYXBpY2lkXSA9PSBhcGljaWQpCisJaWYgKGFwaWNpZCA8IE5SX0NQVVMgJiYgeDg2X2NwdV90b19hcGljaWRbYXBpY2lkXSA9PSBhcGljaWQpCiAJCXJldHVybiBhcGljaWQ7CiAKIAlmb3IgKGkgPSAwOyBpIDwgTlJfQ1BVUzsgKytpKSB7CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvc21wYm9vdC5jIGIvYXJjaC94ODZfNjQva2VybmVsL3NtcGJvb3QuYwppbmRleCA3MWE3MjIyLi40ZTk3NTUxIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvc21wYm9vdC5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9zbXBib290LmMKQEAgLTYzLDEzICs2MywxMSBAQAogCiAvKiBOdW1iZXIgb2Ygc2libGluZ3MgcGVyIENQVSBwYWNrYWdlICovCiBpbnQgc21wX251bV9zaWJsaW5ncyA9IDE7Ci0vKiBQYWNrYWdlIElEIG9mIGVhY2ggbG9naWNhbCBDUFUgKi8KLXU4IHBoeXNfcHJvY19pZFtOUl9DUFVTXSBfX3JlYWRfbW9zdGx5ID0geyBbMCAuLi4gTlJfQ1BVUy0xXSA9IEJBRF9BUElDSUQgfTsKLS8qIGNvcmUgSUQgb2YgZWFjaCBsb2dpY2FsIENQVSAqLwotdTggY3B1X2NvcmVfaWRbTlJfQ1BVU10gX19yZWFkX21vc3RseSA9IHsgWzAgLi4uIE5SX0NQVVMtMV0gPSBCQURfQVBJQ0lEIH07CitFWFBPUlRfU1lNQk9MKHNtcF9udW1fc2libGluZ3MpOwogCiAvKiBMYXN0IGxldmVsIGNhY2hlIElEIG9mIGVhY2ggbG9naWNhbCBDUFUgKi8KIHU4IGNwdV9sbGNfaWRbTlJfQ1BVU10gX19jcHVpbml0ZGF0YSAgPSB7WzAgLi4uIE5SX0NQVVMtMV0gPSBCQURfQVBJQ0lEfTsKK0VYUE9SVF9TWU1CT0woY3B1X2xsY19pZCk7CiAKIC8qIEJpdG1hc2sgb2YgY3VycmVudGx5IG9ubGluZSBDUFVzICovCiBjcHVtYXNrX3QgY3B1X29ubGluZV9tYXAgX19yZWFkX21vc3RseTsKQEAgLTgyLDE4ICs4MCwyMSBAQAogICovCiBjcHVtYXNrX3QgY3B1X2NhbGxpbl9tYXA7CiBjcHVtYXNrX3QgY3B1X2NhbGxvdXRfbWFwOworRVhQT1JUX1NZTUJPTChjcHVfY2FsbG91dF9tYXApOwogCiBjcHVtYXNrX3QgY3B1X3Bvc3NpYmxlX21hcDsKIEVYUE9SVF9TWU1CT0woY3B1X3Bvc3NpYmxlX21hcCk7CiAKIC8qIFBlciBDUFUgYm9nb21pcHMgYW5kIG90aGVyIHBhcmFtZXRlcnMgKi8KIHN0cnVjdCBjcHVpbmZvX3g4NiBjcHVfZGF0YVtOUl9DUFVTXSBfX2NhY2hlbGluZV9hbGlnbmVkOworRVhQT1JUX1NZTUJPTChjcHVfZGF0YSk7CiAKIC8qIFNldCB3aGVuIHRoZSBpZGxlcnMgYXJlIGFsbCBmb3JrZWQgKi8KIGludCBzbXBfdGhyZWFkc19yZWFkeTsKIAogLyogcmVwcmVzZW50aW5nIEhUIHNpYmxpbmdzIG9mIGVhY2ggbG9naWNhbCBDUFUgKi8KIGNwdW1hc2tfdCBjcHVfc2libGluZ19tYXBbTlJfQ1BVU10gX19yZWFkX21vc3RseTsKK0VYUE9SVF9TWU1CT0woY3B1X3NpYmxpbmdfbWFwKTsKIAogLyogcmVwcmVzZW50aW5nIEhUIGFuZCBjb3JlIHNpYmxpbmdzIG9mIGVhY2ggbG9naWNhbCBDUFUgKi8KIGNwdW1hc2tfdCBjcHVfY29yZV9tYXBbTlJfQ1BVU10gX19yZWFkX21vc3RseTsKQEAgLTQ3Miw4ICs0NzMsOCBAQAogCiAJaWYgKHNtcF9udW1fc2libGluZ3MgPiAxKSB7CiAJCWZvcl9lYWNoX2NwdV9tYXNrKGksIGNwdV9zaWJsaW5nX3NldHVwX21hcCkgewotCQkJaWYgKHBoeXNfcHJvY19pZFtjcHVdID09IHBoeXNfcHJvY19pZFtpXSAmJgotCQkJICAgIGNwdV9jb3JlX2lkW2NwdV0gPT0gY3B1X2NvcmVfaWRbaV0pIHsKKwkJCWlmIChjW2NwdV0ucGh5c19wcm9jX2lkID09IGNbaV0ucGh5c19wcm9jX2lkICYmCisJCQkgICAgY1tjcHVdLmNwdV9jb3JlX2lkID09IGNbaV0uY3B1X2NvcmVfaWQpIHsKIAkJCQljcHVfc2V0KGksIGNwdV9zaWJsaW5nX21hcFtjcHVdKTsKIAkJCQljcHVfc2V0KGNwdSwgY3B1X3NpYmxpbmdfbWFwW2ldKTsKIAkJCQljcHVfc2V0KGksIGNwdV9jb3JlX21hcFtjcHVdKTsKQEAgLTUwMCw3ICs1MDEsNyBAQAogCQkJY3B1X3NldChpLCBjW2NwdV0ubGxjX3NoYXJlZF9tYXApOwogCQkJY3B1X3NldChjcHUsIGNbaV0ubGxjX3NoYXJlZF9tYXApOwogCQl9Ci0JCWlmIChwaHlzX3Byb2NfaWRbY3B1XSA9PSBwaHlzX3Byb2NfaWRbaV0pIHsKKwkJaWYgKGNbY3B1XS5waHlzX3Byb2NfaWQgPT0gY1tpXS5waHlzX3Byb2NfaWQpIHsKIAkJCWNwdV9zZXQoaSwgY3B1X2NvcmVfbWFwW2NwdV0pOwogCQkJY3B1X3NldChjcHUsIGNwdV9jb3JlX21hcFtpXSk7CiAJCQkvKgpAQCAtNzk3LDYgKzc5OCw4IEBACiAJfQogCiAKKwlhbHRlcm5hdGl2ZXNfc21wX3N3aXRjaCgxKTsKKwogCWNfaWRsZS5pZGxlID0gZ2V0X2lkbGVfZm9yX2NwdShjcHUpOwogCiAJaWYgKGNfaWRsZS5pZGxlKSB7CkBAIC0xMTk5LDggKzEyMDIsOCBAQAogCQljcHVfY2xlYXIoY3B1LCBjcHVfc2libGluZ19tYXBbc2libGluZ10pOwogCWNwdXNfY2xlYXIoY3B1X3NpYmxpbmdfbWFwW2NwdV0pOwogCWNwdXNfY2xlYXIoY3B1X2NvcmVfbWFwW2NwdV0pOwotCXBoeXNfcHJvY19pZFtjcHVdID0gQkFEX0FQSUNJRDsKLQljcHVfY29yZV9pZFtjcHVdID0gQkFEX0FQSUNJRDsKKwljW2NwdV0ucGh5c19wcm9jX2lkID0gMDsKKwljW2NwdV0uY3B1X2NvcmVfaWQgPSAwOwogCWNwdV9jbGVhcihjcHUsIGNwdV9zaWJsaW5nX3NldHVwX21hcCk7CiB9CiAKQEAgLTEyNTksNiArMTI2Miw4IEBACiAJCS8qIFRoZXkgYWNrIHRoaXMgaW4gcGxheV9kZWFkIGJ5IHNldHRpbmcgQ1BVX0RFQUQgKi8KIAkJaWYgKHBlcl9jcHUoY3B1X3N0YXRlLCBjcHUpID09IENQVV9ERUFEKSB7CiAJCQlwcmludGsgKCJDUFUgJWQgaXMgbm93IG9mZmxpbmVcbiIsIGNwdSk7CisJCQlpZiAoMSA9PSBudW1fb25saW5lX2NwdXMoKSkKKwkJCQlhbHRlcm5hdGl2ZXNfc21wX3N3aXRjaCgwKTsKIAkJCXJldHVybjsKIAkJfQogCQltc2xlZXAoMTAwKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC90Y2UuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC90Y2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDRjNjdmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL3RjZS5jCkBAIC0wLDAgKzEsMjAyIEBACisvKgorICogRGVyaXZlZCBmcm9tIGFyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9pb21tdS5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2IEpvbiBNYXNvbiA8amRtYXNvbkB1cy5pYm0uY29tPiwgSUJNIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgTXVsaSBCZW4tWWVodWRhIDxtdWxpQGlsLmlibS5jb20+LCBJQk0gQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgorI2luY2x1ZGUgPGFzbS90Y2UuaD4KKyNpbmNsdWRlIDxhc20vY2FsZ2FyeS5oPgorI2luY2x1ZGUgPGFzbS9wcm90by5oPgorCisvKiBmbHVzaCBhIHRjZSBhdCAndGNlYWRkcicgdG8gbWFpbiBtZW1vcnkgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBmbHVzaF90Y2Uodm9pZCogdGNlYWRkcikKK3sKKwkvKiBhIHNpbmdsZSB0Y2UgY2FuJ3QgY3Jvc3MgYSBjYWNoZSBsaW5lICovCisJaWYgKGNwdV9oYXNfY2xmbHVzaCkKKwkJYXNtIHZvbGF0aWxlKCJjbGZsdXNoICglMCkiIDo6ICJyIiAodGNlYWRkcikpOworCWVsc2UKKwkJYXNtIHZvbGF0aWxlKCJ3YmludmQiOjo6Im1lbW9yeSIpOworfQorCit2b2lkIHRjZV9idWlsZChzdHJ1Y3QgaW9tbXVfdGFibGUgKnRibCwgdW5zaWduZWQgbG9uZyBpbmRleCwKKwl1bnNpZ25lZCBpbnQgbnBhZ2VzLCB1bnNpZ25lZCBsb25nIHVhZGRyLCBpbnQgZGlyZWN0aW9uKQoreworCXU2NCogdHA7CisJdTY0IHQ7CisJdTY0IHJwbjsKKworCXQgPSAoMSA8PCBUQ0VfUkVBRF9TSElGVCk7CisJaWYgKGRpcmVjdGlvbiAhPSBETUFfVE9fREVWSUNFKQorCQl0IHw9ICgxIDw8IFRDRV9XUklURV9TSElGVCk7CisKKwl0cCA9ICgodTY0Kil0YmwtPml0X2Jhc2UpICsgaW5kZXg7CisKKwl3aGlsZSAobnBhZ2VzLS0pIHsKKwkJcnBuID0gKHZpcnRfdG9fYnVzKCh2b2lkKil1YWRkcikpID4+IFBBR0VfU0hJRlQ7CisJCXQgJj0gflRDRV9SUE5fTUFTSzsKKwkJdCB8PSAocnBuIDw8IFRDRV9SUE5fU0hJRlQpOworCisJCSp0cCA9IGNwdV90b19iZTY0KHQpOworCQlmbHVzaF90Y2UodHApOworCisJCXVhZGRyICs9IFBBR0VfU0laRTsKKwkJdHArKzsKKwl9Cit9CisKK3ZvaWQgdGNlX2ZyZWUoc3RydWN0IGlvbW11X3RhYmxlICp0YmwsIGxvbmcgaW5kZXgsIHVuc2lnbmVkIGludCBucGFnZXMpCit7CisJdTY0KiB0cDsKKworCXRwICA9ICgodTY0Kil0YmwtPml0X2Jhc2UpICsgaW5kZXg7CisKKwl3aGlsZSAobnBhZ2VzLS0pIHsKKwkJKnRwID0gY3B1X3RvX2JlNjQoMCk7CisJCWZsdXNoX3RjZSh0cCk7CisJCXRwKys7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCB0YWJsZV9zaXplX3RvX251bWJlcl9vZl9lbnRyaWVzKHVuc2lnbmVkIGNoYXIgc2l6ZSkKK3sKKwkvKgorCSAqIHNpemUgaXMgdGhlIG9yZGVyIG9mIHRoZSB0YWJsZSwgMC03CisJICogc21hbGxlc3QgdGFibGUgaXMgOEsgZW50cmllcywgc28gc2hpZnQgcmVzdWx0IGJ5IDEzIHRvCisJICogbXVsdGlwbHkgYnkgOEsKKwkgKi8KKwlyZXR1cm4gKDEgPDwgc2l6ZSkgPDwgMTM7Cit9CisKK3N0YXRpYyBpbnQgdGNlX3RhYmxlX3NldHBhcm1zKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHN0cnVjdCBpb21tdV90YWJsZSAqdGJsKQoreworCXVuc2lnbmVkIGludCBiaXRtYXBzejsKKwl1bnNpZ25lZCBpbnQgdGNlX3RhYmxlX2luZGV4OworCXVuc2lnbmVkIGxvbmcgYm1wcGFnZXM7CisJaW50IHJldDsKKworCXRibC0+aXRfYnVzbm8gPSBkZXYtPmJ1cy0+bnVtYmVyOworCisJLyogc2V0IHRoZSB0Y2UgdGFibGUgc2l6ZSAtIG1lYXN1cmVkIGluIGVudHJpZXMgKi8KKwl0YmwtPml0X3NpemUgPSB0YWJsZV9zaXplX3RvX251bWJlcl9vZl9lbnRyaWVzKHNwZWNpZmllZF90YWJsZV9zaXplKTsKKworCXRjZV90YWJsZV9pbmRleCA9IGJ1c190b19waGIodGJsLT5pdF9idXNubyk7CisJdGJsLT5pdF9iYXNlID0gKHVuc2lnbmVkIGxvbmcpdGNlX3RhYmxlX2t2YVt0Y2VfdGFibGVfaW5kZXhdOworCWlmICghdGJsLT5pdF9iYXNlKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQ2FsZ2FyeTogaW9tbXVfdGFibGVfc2V0cGFybXM6ICIKKwkJICAgICAgICJubyB0YWJsZSBhbGxvY2F0ZWQ/IVxuIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZG9uZTsKKwl9CisKKwkvKgorCSAqIG51bWJlciBvZiBieXRlcyBuZWVkZWQgZm9yIHRoZSBiaXRtYXAgc2l6ZSBpbiBudW1iZXIgb2YKKwkgKiBlbnRyaWVzOyB3ZSBuZWVkIG9uZSBiaXQgcGVyIGVudHJ5CisJICovCisJYml0bWFwc3ogPSB0YmwtPml0X3NpemUgLyBCSVRTX1BFUl9CWVRFOworCWJtcHBhZ2VzID0gX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLCBnZXRfb3JkZXIoYml0bWFwc3opKTsKKwlpZiAoIWJtcHBhZ2VzKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQ2FsZ2FyeTogY2Fubm90IGFsbG9jYXRlIGJpdG1hcFxuIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZG9uZTsKKwl9CisKKwl0YmwtPml0X21hcCA9ICh1bnNpZ25lZCBsb25nKilibXBwYWdlczsKKworCW1lbXNldCh0YmwtPml0X21hcCwgMCwgYml0bWFwc3opOworCisJdGJsLT5pdF9oaW50ID0gMDsKKworCXNwaW5fbG9ja19pbml0KCZ0YmwtPml0X2xvY2spOworCisJcmV0dXJuIDA7CisKK2RvbmU6CisJcmV0dXJuIHJldDsKK30KKworaW50IGJ1aWxkX3RjZV90YWJsZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB2b2lkIF9faW9tZW0gKmJiYXIpCit7CisJc3RydWN0IGlvbW11X3RhYmxlICp0Ymw7CisJaW50IHJldDsKKworCWlmIChkZXYtPnN5c2RhdGEpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJDYWxnYXJ5OiBkZXYgJXAgaGFzIHN5c2RhdGEgJXBcbiIsCisJCSAgICAgICBkZXYsIGRldi0+c3lzZGF0YSk7CisJCUJVRygpOworCX0KKworCXRibCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpb21tdV90YWJsZSksIEdGUF9LRVJORUwpOworCWlmICghdGJsKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQ2FsZ2FyeTogZXJyb3IgYWxsb2NhdGluZyBpb21tdV90YWJsZVxuIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZG9uZTsKKwl9CisKKwlyZXQgPSB0Y2VfdGFibGVfc2V0cGFybXMoZGV2LCB0YmwpOworCWlmIChyZXQpCisJCWdvdG8gZnJlZV90Ymw7CisKKwl0Y2VfZnJlZSh0YmwsIDAsIHRibC0+aXRfc2l6ZSk7CisKKwl0YmwtPmJiYXIgPSBiYmFyOworCisJLyoKKwkgKiBOVU1BIGlzIGFscmVhZHkgdXNpbmcgdGhlIGJ1cydzIHN5c2RhdGEgcG9pbnRlciwgc28gd2UgdXNlCisJICogdGhlIGJ1cydzIHBjaV9kZXYncyBzeXNkYXRhIGluc3RlYWQuCisJICovCisJZGV2LT5zeXNkYXRhID0gdGJsOworCisJcmV0dXJuIDA7CisKK2ZyZWVfdGJsOgorCWtmcmVlKHRibCk7Citkb25lOgorCXJldHVybiByZXQ7Cit9CisKK3ZvaWQqIGFsbG9jX3RjZV90YWJsZSh2b2lkKQoreworCXVuc2lnbmVkIGludCBzaXplOworCisJc2l6ZSA9IHRhYmxlX3NpemVfdG9fbnVtYmVyX29mX2VudHJpZXMoc3BlY2lmaWVkX3RhYmxlX3NpemUpOworCXNpemUgKj0gVENFX0VOVFJZX1NJWkU7CisKKwlyZXR1cm4gX19hbGxvY19ib290bWVtX2xvdyhzaXplLCBzaXplLCAwKTsKK30KKwordm9pZCBmcmVlX3RjZV90YWJsZSh2b2lkICp0YmwpCit7CisJdW5zaWduZWQgaW50IHNpemU7CisKKwlpZiAoIXRibCkKKwkJcmV0dXJuOworCisJc2l6ZSA9IHRhYmxlX3NpemVfdG9fbnVtYmVyX29mX2VudHJpZXMoc3BlY2lmaWVkX3RhYmxlX3NpemUpOworCXNpemUgKj0gVENFX0VOVFJZX1NJWkU7CisKKwlmcmVlX2Jvb3RtZW0oX19wYSh0YmwpLCBzaXplKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC90aW1lLmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvdGltZS5jCmluZGV4IDczOTI1NzAuLmViYmVlNmYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL3RpbWUuYwpAQCAtOCw3ICs4LDcgQEAKICAqICBDb3B5cmlnaHQgKGMpIDE5OTUgIE1hcmt1cyBLdWhuCiAgKiAgQ29weXJpZ2h0IChjKSAxOTk2ICBJbmdvIE1vbG5hcgogICogIENvcHlyaWdodCAoYykgMTk5OCAgQW5kcmVhIEFyY2FuZ2VsaQotICogIENvcHlyaWdodCAoYykgMjAwMiAgVm9qdGVjaCBQYXZsaWsKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDIsMjAwNiAgVm9qdGVjaCBQYXZsaWsKICAqICBDb3B5cmlnaHQgKGMpIDIwMDMgIEFuZGkgS2xlZW4KICAqICBSVEMgc3VwcG9ydCBjb2RlIHRha2VuIGZyb20gYXJjaC9pMzg2L2tlcm5lbC90aW1lcnMvdGltZV9ocGV0LmMKICAqLwpAQCAtNTEsMTQgKzUxLDIxIEBACiBzdGF0aWMgY2hhciAqdGltZV9pbml0X2d0b2Qodm9pZCk7CiAKIERFRklORV9TUElOTE9DSyhydGNfbG9jayk7CitFWFBPUlRfU1lNQk9MKHJ0Y19sb2NrKTsKIERFRklORV9TUElOTE9DSyhpODI1M19sb2NrKTsKIAogaW50IG5vaHBldCBfX2luaXRkYXRhID0gMDsKIHN0YXRpYyBpbnQgbm90c2MgX19pbml0ZGF0YSA9IDA7CiAKLSN1bmRlZiBIUEVUX0hBQ0tfRU5BQkxFX0RBTkdFUk9VUworI2RlZmluZSBVU0VDX1BFUl9USUNLIChVU0VDX1BFUl9TRUMgLyBIWikKKyNkZWZpbmUgTlNFQ19QRVJfVElDSyAoTlNFQ19QRVJfU0VDIC8gSFopCisjZGVmaW5lIEZTRUNfUEVSX1RJQ0sgKEZTRUNfUEVSX1NFQyAvIEhaKQorCisjZGVmaW5lIE5TX1NDQUxFCTEwIC8qIDJeMTAsIGNhcmVmdWxseSBjaG9zZW4gKi8KKyNkZWZpbmUgVVNfU0NBTEUJMzIgLyogMl4zMiwgYXJiaXRyYWxyaWx5IGNob3NlbiAqLwogCiB1bnNpZ25lZCBpbnQgY3B1X2toejsJCQkJCS8qIFRTQyBjbG9ja3MgLyB1c2VjLCBub3QgdXNlZCBoZXJlICovCitFWFBPUlRfU1lNQk9MKGNwdV9raHopOwogc3RhdGljIHVuc2lnbmVkIGxvbmcgaHBldF9wZXJpb2Q7CQkJLyogZnNlY3MgLyBIUEVUIGNsb2NrICovCiB1bnNpZ25lZCBsb25nIGhwZXRfdGljazsJCQkJLyogSFBFVCBjbG9ja3MgLyBpbnRlcnJ1cHQgKi8KIGludCBocGV0X3VzZV90aW1lcjsJCQkJLyogVXNlIGNvdW50ZXIgb2YgaHBldCBmb3IgdGltZSBrZWVwaW5nLCBvdGhlcndpc2UgUElUICovCkBAIC05MCw3ICs5Nyw3IEBACiAJdCA9IGdldF9jeWNsZXNfc3luYygpOwogCWlmICh0IDwgdnh0aW1lLmxhc3RfdHNjKSAKIAkJdCA9IHZ4dGltZS5sYXN0X3RzYzsgLyogaGFjayAqLwotCXggPSAoKHQgLSB2eHRpbWUubGFzdF90c2MpICogdnh0aW1lLnRzY19xdW90KSA+PiAzMjsKKwl4ID0gKCh0IC0gdnh0aW1lLmxhc3RfdHNjKSAqIHZ4dGltZS50c2NfcXVvdCkgPj4gVVNfU0NBTEU7CiAJcmV0dXJuIHg7CiB9CiAKQEAgLTk4LDcgKzEwNSw3IEBACiB7CiAJLyogY2FwIGNvdW50ZXIgcmVhZCB0byBvbmUgdGljayB0byBhdm9pZCBpbmNvbnNpc3RlbmNpZXMgKi8KIAl1bnNpZ25lZCBsb25nIGNvdW50ZXIgPSBocGV0X3JlYWRsKEhQRVRfQ09VTlRFUikgLSB2eHRpbWUubGFzdDsKLQlyZXR1cm4gKG1pbihjb3VudGVyLGhwZXRfdGljaykgKiB2eHRpbWUucXVvdCkgPj4gMzI7CisJcmV0dXJuIChtaW4oY291bnRlcixocGV0X3RpY2spICogdnh0aW1lLnF1b3QpID4+IFVTX1NDQUxFOwogfQogCiB1bnNpZ25lZCBpbnQgKCpkb19nZXR0aW1lb2Zmc2V0KSh2b2lkKSA9IGRvX2dldHRpbWVvZmZzZXRfdHNjOwpAQCAtMTE4LDcgKzEyNSw3IEBACiAJCXNlcSA9IHJlYWRfc2VxYmVnaW4oJnh0aW1lX2xvY2spOwogCiAJCXNlYyA9IHh0aW1lLnR2X3NlYzsKLQkJdXNlYyA9IHh0aW1lLnR2X25zZWMgLyAxMDAwOworCQl1c2VjID0geHRpbWUudHZfbnNlYyAvIE5TRUNfUEVSX1VTRUM7CiAKIAkJLyogaTM4NiBkb2VzIHNvbWUgY29ycmVjdGlvbiBoZXJlIHRvIGtlZXAgdGhlIGNsb2NrIAogCQkgICBtb25vdG9ub3VzIGV2ZW4gd2hlbiBudHBkIGlzIGZpeGluZyBkcmlmdC4KQEAgLTEyOSwxNCArMTM2LDE0IEBACiAJCSAgIGluIGFyY2gveDg2XzY0L2tlcm5lbC92c3lzY2FsbC5jIGFuZCBleHBvcnQgYWxsIG5lZWRlZAogCQkgICB2YXJpYWJsZXMgaW4gdm1saW51eC5sZHMuIC1BSyAqLyAKIAotCQl0ID0gKGppZmZpZXMgLSB3YWxsX2ppZmZpZXMpICogKDEwMDAwMDBMIC8gSFopICsKKwkJdCA9IChqaWZmaWVzIC0gd2FsbF9qaWZmaWVzKSAqIFVTRUNfUEVSX1RJQ0sgKwogCQkJZG9fZ2V0dGltZW9mZnNldCgpOwogCQl1c2VjICs9IHQ7CiAKIAl9IHdoaWxlIChyZWFkX3NlcXJldHJ5KCZ4dGltZV9sb2NrLCBzZXEpKTsKIAotCXR2LT50dl9zZWMgPSBzZWMgKyB1c2VjIC8gMTAwMDAwMDsKLQl0di0+dHZfdXNlYyA9IHVzZWMgJSAxMDAwMDAwOworCXR2LT50dl9zZWMgPSBzZWMgKyB1c2VjIC8gVVNFQ19QRVJfU0VDOworCXR2LT50dl91c2VjID0gdXNlYyAlIFVTRUNfUEVSX1NFQzsKIH0KIAogRVhQT1JUX1NZTUJPTChkb19nZXR0aW1lb2ZkYXkpOwpAQCAtMTU3LDggKzE2NCw4IEBACiAKIAl3cml0ZV9zZXFsb2NrX2lycSgmeHRpbWVfbG9jayk7CiAKLQluc2VjIC09IGRvX2dldHRpbWVvZmZzZXQoKSAqIDEwMDAgKwotCQkoamlmZmllcyAtIHdhbGxfamlmZmllcykgKiAoTlNFQ19QRVJfU0VDL0haKTsKKwluc2VjIC09IGRvX2dldHRpbWVvZmZzZXQoKSAqIE5TRUNfUEVSX1VTRUMgKworCQkoamlmZmllcyAtIHdhbGxfamlmZmllcykgKiBOU0VDX1BFUl9USUNLOwogCiAJd3RtX3NlYyAgPSB3YWxsX3RvX21vbm90b25pYy50dl9zZWMgKyAoeHRpbWUudHZfc2VjIC0gc2VjKTsKIAl3dG1fbnNlYyA9IHdhbGxfdG9fbW9ub3RvbmljLnR2X25zZWMgKyAoeHRpbWUudHZfbnNlYyAtIG5zZWMpOwpAQCAtMjg4LDcgKzI5NSw3IEBACiAJCQl0aGlzX29mZnNldCA9IGhwZXRfcmVhZGwoSFBFVF9DT1VOVEVSKTsKIAkJfSB3aGlsZSAocmVhZF9zZXFyZXRyeSgmeHRpbWVfbG9jaywgc2VxKSk7CiAJCW9mZnNldCA9ICh0aGlzX29mZnNldCAtIGxhc3Rfb2Zmc2V0KTsKLQkJb2Zmc2V0ICo9IChOU0VDX1BFUl9TRUMvSFopIC8gaHBldF90aWNrOworCQlvZmZzZXQgKj0gTlNFQ19QRVJfVElDSyAvIGhwZXRfdGljazsKIAl9IGVsc2UgewogCQlkbyB7CiAJCQlzZXEgPSByZWFkX3NlcWJlZ2luKCZ4dGltZV9sb2NrKTsKQEAgLTI5Nyw3ICszMDQsOCBAQAogCQkJYmFzZSA9IG1vbm90b25pY19iYXNlOwogCQl9IHdoaWxlIChyZWFkX3NlcXJldHJ5KCZ4dGltZV9sb2NrLCBzZXEpKTsKIAkJdGhpc19vZmZzZXQgPSBnZXRfY3ljbGVzX3N5bmMoKTsKLQkJb2Zmc2V0ID0gKHRoaXNfb2Zmc2V0IC0gbGFzdF9vZmZzZXQpKjEwMDAgLyBjcHVfa2h6OyAKKwkJLyogRklYTUU6IDEwMDAgb3IgMTAwMDAwMD8gKi8KKwkJb2Zmc2V0ID0gKHRoaXNfb2Zmc2V0IC0gbGFzdF9vZmZzZXQpKjEwMDAgLyBjcHVfa2h6OwogCX0KIAlyZXR1cm4gYmFzZSArIG9mZnNldDsKIH0KQEAgLTM4Miw3ICszOTAsNyBAQAogCQl9CiAKIAkJbW9ub3RvbmljX2Jhc2UgKz0gCi0JCQkob2Zmc2V0IC0gdnh0aW1lLmxhc3QpKihOU0VDX1BFUl9TRUMvSFopIC8gaHBldF90aWNrOworCQkJKG9mZnNldCAtIHZ4dGltZS5sYXN0KSAqIE5TRUNfUEVSX1RJQ0sgLyBocGV0X3RpY2s7CiAKIAkJdnh0aW1lLmxhc3QgPSBvZmZzZXQ7CiAjaWZkZWYgQ09ORklHX1g4Nl9QTV9USU1FUgpAQCAtMzkxLDI0ICszOTksMjUgQEAKICNlbmRpZgogCX0gZWxzZSB7CiAJCW9mZnNldCA9ICgoKHRzYyAtIHZ4dGltZS5sYXN0X3RzYykgKgotCQkJICAgdnh0aW1lLnRzY19xdW90KSA+PiAzMikgLSAoVVNFQ19QRVJfU0VDIC8gSFopOworCQkJICAgdnh0aW1lLnRzY19xdW90KSA+PiBVU19TQ0FMRSkgLSBVU0VDX1BFUl9USUNLOwogCiAJCWlmIChvZmZzZXQgPCAwKQogCQkJb2Zmc2V0ID0gMDsKIAotCQlpZiAob2Zmc2V0ID4gKFVTRUNfUEVSX1NFQyAvIEhaKSkgewotCQkJbG9zdCA9IG9mZnNldCAvIChVU0VDX1BFUl9TRUMgLyBIWik7Ci0JCQlvZmZzZXQgJT0gKFVTRUNfUEVSX1NFQyAvIEhaKTsKKwkJaWYgKG9mZnNldCA+IFVTRUNfUEVSX1RJQ0spIHsKKwkJCWxvc3QgPSBvZmZzZXQgLyBVU0VDX1BFUl9USUNLOworCQkJb2Zmc2V0ICU9IFVTRUNfUEVSX1RJQ0s7CiAJCX0KIAotCQltb25vdG9uaWNfYmFzZSArPSAodHNjIC0gdnh0aW1lLmxhc3RfdHNjKSoxMDAwMDAwL2NwdV9raHogOworCQkvKiBGSVhNRTogMTAwMCBvciAxMDAwMDAwPyAqLworCQltb25vdG9uaWNfYmFzZSArPSAodHNjIC0gdnh0aW1lLmxhc3RfdHNjKSAqIDEwMDAwMDAgLyBjcHVfa2h6OwogCiAJCXZ4dGltZS5sYXN0X3RzYyA9IHRzYyAtIHZ4dGltZS5xdW90ICogZGVsYXkgLyB2eHRpbWUudHNjX3F1b3Q7CiAKIAkJaWYgKCgoKHRzYyAtIHZ4dGltZS5sYXN0X3RzYykgKgotCQkgICAgICB2eHRpbWUudHNjX3F1b3QpID4+IDMyKSA8IG9mZnNldCkKKwkJICAgICAgdnh0aW1lLnRzY19xdW90KSA+PiBVU19TQ0FMRSkgPCBvZmZzZXQpCiAJCQl2eHRpbWUubGFzdF90c2MgPSB0c2MgLQotCQkJCSgoKGxvbmcpIG9mZnNldCA8PCAzMikgLyB2eHRpbWUudHNjX3F1b3QpIC0gMTsKKwkJCQkoKChsb25nKSBvZmZzZXQgPDwgVVNfU0NBTEUpIC8gdnh0aW1lLnRzY19xdW90KSAtIDE7CiAJfQogCiAJaWYgKGxvc3QgPiAwKSB7CkBAIC00NjgsMTYgKzQ3NywxNSBAQAogfQogCiBzdGF0aWMgdW5zaWduZWQgaW50IGN5YzJuc19zY2FsZSBfX3JlYWRfbW9zdGx5OwotI2RlZmluZSBDWUMyTlNfU0NBTEVfRkFDVE9SIDEwIC8qIDJeMTAsIGNhcmVmdWxseSBjaG9zZW4gKi8KIAogc3RhdGljIGlubGluZSB2b2lkIHNldF9jeWMybnNfc2NhbGUodW5zaWduZWQgbG9uZyBjcHVfa2h6KQogewotCWN5YzJuc19zY2FsZSA9ICgxMDAwMDAwIDw8IENZQzJOU19TQ0FMRV9GQUNUT1IpL2NwdV9raHo7CisJY3ljMm5zX3NjYWxlID0gKE5TRUNfUEVSX01TRUMgPDwgTlNfU0NBTEUpIC8gY3B1X2toejsKIH0KIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGxvbmcgY3ljbGVzXzJfbnModW5zaWduZWQgbG9uZyBsb25nIGN5YykKIHsKLQlyZXR1cm4gKGN5YyAqIGN5YzJuc19zY2FsZSkgPj4gQ1lDMk5TX1NDQUxFX0ZBQ1RPUjsKKwlyZXR1cm4gKGN5YyAqIGN5YzJuc19zY2FsZSkgPj4gTlNfU0NBTEU7CiB9CiAKIHVuc2lnbmVkIGxvbmcgbG9uZyBzY2hlZF9jbG9jayh2b2lkKQpAQCAtNDkwLDcgKzQ5OCw3IEBACiAgICAgICAgICAgIERpc2FkdmFudGFnZSBpcyBhIHNtYWxsIGRyaWZ0IGJldHdlZW4gQ1BVcyBpbiBzb21lIGNvbmZpZ3VyYXRpb25zLAogCSAgIGJ1dCB0aGF0IHNob3VsZCBiZSB0b2xlcmFibGUuICovCiAJaWYgKF9fdnh0aW1lLm1vZGUgPT0gVlhUSU1FX0hQRVQpCi0JCXJldHVybiAoaHBldF9yZWFkbChIUEVUX0NPVU5URVIpICogdnh0aW1lLnF1b3QpID4+IDMyOworCQlyZXR1cm4gKGhwZXRfcmVhZGwoSFBFVF9DT1VOVEVSKSAqIHZ4dGltZS5xdW90KSA+PiBVU19TQ0FMRTsKICNlbmRpZgogCiAJLyogQ291bGQgZG8gQ1BVIGNvcmUgc3luYyBoZXJlLiBPcHRlcm9uIGNhbiBleGVjdXRlIHJkdHNjIHNwZWN1bGF0aXZlbHksCkBAIC02MzMsNyArNjQxLDcgQEAKIAogCQljcHVfa2h6ID0gY3B1ZnJlcV9zY2FsZShjcHVfa2h6X3JlZiwgcmVmX2ZyZXEsIGZyZXEtPm5ldyk7CiAJCWlmICghKGZyZXEtPmZsYWdzICYgQ1BVRlJFUV9DT05TVF9MT09QUykpCi0JCQl2eHRpbWUudHNjX3F1b3QgPSAoMTAwMEwgPDwgMzIpIC8gY3B1X2toejsKKwkJCXZ4dGltZS50c2NfcXVvdCA9IChVU0VDX1BFUl9NU0VDIDw8IFVTX1NDQUxFKSAvIGNwdV9raHo7CiAJfQogCQogCXNldF9jeWMybnNfc2NhbGUoY3B1X2toel9yZWYpOwpAQCAtNzg5LDggKzc5Nyw4IEBACiAJaWYgKGhwZXRfdXNlX3RpbWVyKSB7CiAJCWhwZXRfd3JpdGVsKEhQRVRfVE5fRU5BQkxFIHwgSFBFVF9UTl9QRVJJT0RJQyB8IEhQRVRfVE5fU0VUVkFMIHwKIAkJICAgIEhQRVRfVE5fMzJCSVQsIEhQRVRfVDBfQ0ZHKTsKLQkJaHBldF93cml0ZWwoaHBldF90aWNrLCBIUEVUX1QwX0NNUCk7Ci0JCWhwZXRfd3JpdGVsKGhwZXRfdGljaywgSFBFVF9UMF9DTVApOyAvKiBBSzogd2h5IHR3aWNlPyAqLworCQlocGV0X3dyaXRlbChocGV0X3RpY2ssIEhQRVRfVDBfQ01QKTsgLyogbmV4dCBpbnRlcnJ1cHQgKi8KKwkJaHBldF93cml0ZWwoaHBldF90aWNrLCBIUEVUX1QwX0NNUCk7IC8qIHBlcmlvZCAqLwogCQljZmcgfD0gSFBFVF9DRkdfTEVHQUNZOwogCX0KIC8qCkBAIC04MjUsOCArODMzLDcgQEAKIAlpZiAoaHBldF9wZXJpb2QgPCAxMDAwMDAgfHwgaHBldF9wZXJpb2QgPiAxMDAwMDAwMDApCiAJCXJldHVybiAtMTsKIAotCWhwZXRfdGljayA9ICgxMDAwMDAwMDAwTCAqIChVU0VDX1BFUl9TRUMgLyBIWikgKyBocGV0X3BlcmlvZCAvIDIpIC8KLQkJaHBldF9wZXJpb2Q7CisJaHBldF90aWNrID0gKEZTRUNfUEVSX1RJQ0sgKyBocGV0X3BlcmlvZCAvIDIpIC8gaHBldF9wZXJpb2Q7CiAKIAlocGV0X3VzZV90aW1lciA9IChpZCAmIEhQRVRfSURfTEVHU1VQKTsKIApAQCAtODkwLDE4ICs4OTcsNiBAQAogCWNoYXIgKnRpbWVuYW1lOwogCWNoYXIgKmd0b2Q7CiAKLSNpZmRlZiBIUEVUX0hBQ0tfRU5BQkxFX0RBTkdFUk9VUwotICAgICAgICBpZiAoIXZ4dGltZS5ocGV0X2FkZHJlc3MpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAidGltZS5jOiBXQVJOSU5HOiBFbmFibGluZyBIUEVUIGJhc2UgIgotCQkgICAgICAgIm1hbnVhbGx5IVxuIik7Ci0gICAgICAgICAgICAgICAgb3V0bCgweDgwMDAzOGEwLCAweGNmOCk7Ci0gICAgICAgICAgICAgICAgb3V0bCgweGZmMDAwMDAxLCAweGNmYyk7Ci0gICAgICAgICAgICAgICAgb3V0bCgweDgwMDAzOGEwLCAweGNmOCk7Ci0gICAgICAgICAgICAgICAgdnh0aW1lLmhwZXRfYWRkcmVzcyA9IGlubCgweGNmYykgJiAweGZmZmZmZmZlOwotCQlwcmludGsoS0VSTl9XQVJOSU5HICJ0aW1lLmM6IFdBUk5JTkc6IEVuYWJsZWQgSFBFVCAiCi0JCSAgICAgICAiYXQgJSNseC5cbiIsIHZ4dGltZS5ocGV0X2FkZHJlc3MpOwotICAgICAgICB9Ci0jZW5kaWYKIAlpZiAobm9ocGV0KQogCQl2eHRpbWUuaHBldF9hZGRyZXNzID0gMDsKIApAQCAtOTEyLDcgKzkwNyw3IEBACiAJICAgICAgICAgICAgICAgICAgICAgICAgLXh0aW1lLnR2X3NlYywgLXh0aW1lLnR2X25zZWMpOwogCiAJaWYgKCFocGV0X2luaXQoKSkKLSAgICAgICAgICAgICAgICB2eHRpbWVfaHogPSAoMTAwMDAwMDAwMDAwMDAwMEwgKyBocGV0X3BlcmlvZCAvIDIpIC8gaHBldF9wZXJpb2Q7CisgICAgICAgICAgICAgICAgdnh0aW1lX2h6ID0gKEZTRUNfUEVSX1NFQyArIGhwZXRfcGVyaW9kIC8gMikgLyBocGV0X3BlcmlvZDsKIAllbHNlCiAJCXZ4dGltZS5ocGV0X2FkZHJlc3MgPSAwOwogCkBAIC05NDEsOCArOTM2LDggQEAKIAkgICAgICAgdnh0aW1lX2h6IC8gMTAwMDAwMCwgdnh0aW1lX2h6ICUgMTAwMDAwMCwgdGltZW5hbWUsIGd0b2QpOwogCXByaW50ayhLRVJOX0lORk8gInRpbWUuYzogRGV0ZWN0ZWQgJWQuJTAzZCBNSHogcHJvY2Vzc29yLlxuIiwKIAkJY3B1X2toeiAvIDEwMDAsIGNwdV9raHogJSAxMDAwKTsKLQl2eHRpbWUucXVvdCA9ICgxMDAwMDAwTCA8PCAzMikgLyB2eHRpbWVfaHo7Ci0Jdnh0aW1lLnRzY19xdW90ID0gKDEwMDBMIDw8IDMyKSAvIGNwdV9raHo7CisJdnh0aW1lLnF1b3QgPSAoVVNFQ19QRVJfU0VDIDw8IFVTX1NDQUxFKSAvIHZ4dGltZV9oejsKKwl2eHRpbWUudHNjX3F1b3QgPSAoVVNFQ19QRVJfTVNFQyA8PCBVU19TQ0FMRSkgLyBjcHVfa2h6OwogCXZ4dGltZS5sYXN0X3RzYyA9IGdldF9jeWNsZXNfc3luYygpOwogCXNldHVwX2lycSgwLCAmaXJxMCk7CiAKQEAgLTk1NiwxMCArOTUxLDEwIEBACiBfX2NwdWluaXQgaW50IHVuc3luY2hyb25pemVkX3RzYyh2b2lkKQogewogI2lmZGVmIENPTkZJR19TTVAKLQlpZiAob2VtX2ZvcmNlX2hwZXRfdGltZXIoKSkKKwlpZiAoYXBpY19pc19jbHVzdGVyZWRfYm94KCkpCiAJCXJldHVybiAxOwogIAkvKiBJbnRlbCBzeXN0ZW1zIGFyZSBub3JtYWxseSBhbGwgc3luY2hyb25pemVkLiBFeGNlcHRpb25zCi0gCSAgIGFyZSBoYW5kbGVkIGluIHRoZSBPRU0gY2hlY2sgYWJvdmUuICovCisgCSAgIGFyZSBoYW5kbGVkIGluIHRoZSBjaGVjayBhYm92ZS4gKi8KICAJaWYgKGJvb3RfY3B1X2RhdGEueDg2X3ZlbmRvciA9PSBYODZfVkVORE9SX0lOVEVMKQogIAkJcmV0dXJuIDA7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC90cmFwcy5jIGIvYXJjaC94ODZfNjQva2VybmVsL3RyYXBzLmMKaW5kZXggY2VhMzM1ZS4uM2QxMWEyZiAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL3RyYXBzLmMKQEAgLTYsOCArNiw2IEBACiAgKgogICogIFBlbnRpdW0gSUlJIEZYU1IsIFNTRSBzdXBwb3J0CiAgKglHYXJldGggSHVnaGVzIDxnYXJldGhAdmFsaW51eC5jb20+LCBNYXkgMjAwMAotICoKLSAqICAkSWQ6IHRyYXBzLmMsdiAxLjM2IDIwMDIvMDMvMjQgMTE6MDk6MTAgYWsgRXhwICQKICAqLwogCiAvKgpAQCAtMzEsNiArMjksNyBAQAogI2luY2x1ZGUgPGxpbnV4L25taS5oPgogI2luY2x1ZGUgPGxpbnV4L2twcm9iZXMuaD4KICNpbmNsdWRlIDxsaW51eC9rZXhlYy5oPgorI2luY2x1ZGUgPGxpbnV4L3Vud2luZC5oPgogCiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CkBAIC00MSw3ICs0MCw3IEBACiAjaW5jbHVkZSA8YXNtL2kzODcuaD4KICNpbmNsdWRlIDxhc20va2RlYnVnLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgotCisjaW5jbHVkZSA8YXNtL3Vud2luZC5oPgogI2luY2x1ZGUgPGFzbS9zbXAuaD4KICNpbmNsdWRlIDxhc20vcGdhbGxvYy5oPgogI2luY2x1ZGUgPGFzbS9wZGEuaD4KQEAgLTcxLDYgKzcwLDcgQEAKIGFzbWxpbmthZ2Ugdm9pZCBzcHVyaW91c19pbnRlcnJ1cHRfYnVnKHZvaWQpOwogCiBBVE9NSUNfTk9USUZJRVJfSEVBRChkaWVfY2hhaW4pOworRVhQT1JUX1NZTUJPTChkaWVfY2hhaW4pOwogCiBpbnQgcmVnaXN0ZXJfZGllX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpCiB7CkBAIC0xMDcsNyArMTA3LDggQEAKIAlwcmVlbXB0X2VuYWJsZV9ub19yZXNjaGVkKCk7CiB9CiAKLXN0YXRpYyBpbnQga3N0YWNrX2RlcHRoX3RvX3ByaW50ID0gMTA7CitzdGF0aWMgaW50IGtzdGFja19kZXB0aF90b19wcmludCA9IDEyOworc3RhdGljIGludCBjYWxsX3RyYWNlID0gMTsKIAogI2lmZGVmIENPTkZJR19LQUxMU1lNUwogI2luY2x1ZGUgPGxpbnV4L2thbGxzeW1zLmg+IApAQCAtMTkxLDYgKzE5MiwyNSBAQAogCXJldHVybiBOVUxMOwogfQogCitzdGF0aWMgaW50IHNob3dfdHJhY2VfdW53aW5kKHN0cnVjdCB1bndpbmRfZnJhbWVfaW5mbyAqaW5mbywgdm9pZCAqY29udGV4dCkKK3sKKwlpbnQgaSA9IDExLCBuID0gMDsKKworCXdoaWxlICh1bndpbmQoaW5mbykgPT0gMCAmJiBVTldfUEMoaW5mbykpIHsKKwkJKytuOworCQlpZiAoaSA+IDUwKSB7CisJCQlwcmludGsoIlxuICAgICAgICIpOworCQkJaSA9IDc7CisJCX0gZWxzZQorCQkJaSArPSBwcmludGsoIiAiKTsKKwkJaSArPSBwcmludGtfYWRkcmVzcyhVTldfUEMoaW5mbykpOworCQlpZiAoYXJjaF91bndfdXNlcl9tb2RlKGluZm8pKQorCQkJYnJlYWs7CisJfQorCXByaW50aygiXG4iKTsKKwlyZXR1cm4gbjsKK30KKwogLyoKICAqIHg4Ni02NCBjYW4gaGF2ZSB1cHRvIHRocmVlIGtlcm5lbCBzdGFja3M6IAogICogcHJvY2VzcyBzdGFjawpAQCAtMTk4LDE1ICsyMTgsMzkgQEAKICAqIHNldmVyZSBleGNlcHRpb24gKGRvdWJsZSBmYXVsdCwgbm1pLCBzdGFjayBmYXVsdCwgZGVidWcsIG1jZSkgaGFyZHdhcmUgc3RhY2sKICAqLwogCi12b2lkIHNob3dfdHJhY2UodW5zaWduZWQgbG9uZyAqc3RhY2spCit2b2lkIHNob3dfdHJhY2Uoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBsb25nICogc3RhY2spCiB7CiAJY29uc3QgdW5zaWduZWQgY3B1ID0gc2FmZV9zbXBfcHJvY2Vzc29yX2lkKCk7CiAJdW5zaWduZWQgbG9uZyAqaXJxc3RhY2tfZW5kID0gKHVuc2lnbmVkIGxvbmcgKiljcHVfcGRhKGNwdSktPmlycXN0YWNrcHRyOwotCWludCBpOworCWludCBpID0gMTE7CiAJdW5zaWduZWQgdXNlZCA9IDA7CiAKIAlwcmludGsoIlxuQ2FsbCBUcmFjZToiKTsKIAorCWlmICghdHNrKQorCQl0c2sgPSBjdXJyZW50OworCisJaWYgKGNhbGxfdHJhY2UgPj0gMCkgeworCQlpbnQgdW53X3JldCA9IDA7CisJCXN0cnVjdCB1bndpbmRfZnJhbWVfaW5mbyBpbmZvOworCisJCWlmIChyZWdzKSB7CisJCQlpZiAodW53aW5kX2luaXRfZnJhbWVfaW5mbygmaW5mbywgdHNrLCByZWdzKSA9PSAwKQorCQkJCXVud19yZXQgPSBzaG93X3RyYWNlX3Vud2luZCgmaW5mbywgTlVMTCk7CisJCX0gZWxzZSBpZiAodHNrID09IGN1cnJlbnQpCisJCQl1bndfcmV0ID0gdW53aW5kX2luaXRfcnVubmluZygmaW5mbywgc2hvd190cmFjZV91bndpbmQsIE5VTEwpOworCQllbHNlIHsKKwkJCWlmICh1bndpbmRfaW5pdF9ibG9ja2VkKCZpbmZvLCB0c2spID09IDApCisJCQkJdW53X3JldCA9IHNob3dfdHJhY2VfdW53aW5kKCZpbmZvLCBOVUxMKTsKKwkJfQorCQlpZiAodW53X3JldCA+IDApIHsKKwkJCWlmIChjYWxsX3RyYWNlID4gMCkKKwkJCQlyZXR1cm47CisJCQlwcmludGsoIkxlZ2FjeSBjYWxsIHRyYWNlOiIpOworCQkJaSA9IDE4OworCQl9CisJfQorCiAjZGVmaW5lIEhBTkRMRV9TVEFDSyhjb25kKSBcCiAJZG8gd2hpbGUgKGNvbmQpIHsgXAogCQl1bnNpZ25lZCBsb25nIGFkZHIgPSAqc3RhY2srKzsgXApAQCAtMjI5LDcgKzI3Myw3IEBACiAJCX0gXAogCX0gd2hpbGUgKDApCiAKLQlmb3IoaSA9IDExOyA7ICkgeworCWZvcig7IDsgKSB7CiAJCWNvbnN0IGNoYXIgKmlkOwogCQl1bnNpZ25lZCBsb25nICplc3RhY2tfZW5kOwogCQllc3RhY2tfZW5kID0gaW5fZXhjZXB0aW9uX3N0YWNrKGNwdSwgKHVuc2lnbmVkIGxvbmcpc3RhY2ssCkBAIC0yNjQsNyArMzA4LDcgQEAKIAlwcmludGsoIlxuIik7CiB9CiAKLXZvaWQgc2hvd19zdGFjayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgdW5zaWduZWQgbG9uZyAqIHJzcCkKK3N0YXRpYyB2b2lkIF9zaG93X3N0YWNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgbG9uZyAqIHJzcCkKIHsKIAl1bnNpZ25lZCBsb25nICpzdGFjazsKIAlpbnQgaTsKQEAgLTI5OCw3ICszNDIsMTIgQEAKIAkJcHJpbnRrKCIlMDE2bHggIiwgKnN0YWNrKyspOwogCQl0b3VjaF9ubWlfd2F0Y2hkb2coKTsKIAl9Ci0Jc2hvd190cmFjZSgodW5zaWduZWQgbG9uZyAqKXJzcCk7CisJc2hvd190cmFjZSh0c2ssIHJlZ3MsIHJzcCk7Cit9CisKK3ZvaWQgc2hvd19zdGFjayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgdW5zaWduZWQgbG9uZyAqIHJzcCkKK3sKKwlfc2hvd19zdGFjayh0c2ssIE5VTEwsIHJzcCk7CiB9CiAKIC8qCkBAIC0zMDcsNyArMzU2LDcgQEAKIHZvaWQgZHVtcF9zdGFjayh2b2lkKQogewogCXVuc2lnbmVkIGxvbmcgZHVtbXk7Ci0Jc2hvd190cmFjZSgmZHVtbXkpOworCXNob3dfdHJhY2UoTlVMTCwgTlVMTCwgJmR1bW15KTsKIH0KIAogRVhQT1JUX1NZTUJPTChkdW1wX3N0YWNrKTsKQEAgLTMzNCw3ICszODMsNyBAQAogCWlmIChpbl9rZXJuZWwpIHsKIAogCQlwcmludGsoIlN0YWNrOiAiKTsKLQkJc2hvd19zdGFjayhOVUxMLCAodW5zaWduZWQgbG9uZyopcnNwKTsKKwkJX3Nob3dfc3RhY2soTlVMTCwgcmVncywgKHVuc2lnbmVkIGxvbmcqKXJzcCk7CiAKIAkJcHJpbnRrKCJcbkNvZGU6ICIpOwogCQlpZiAocmVncy0+cmlwIDwgUEFHRV9PRkZTRVQpCkBAIC0zODMsNiArNDMyLDcgQEAKIHsgCiAJQlVHKCk7IAogfSAKK0VYUE9SVF9TWU1CT0wob3V0X29mX2xpbmVfYnVnKTsKICNlbmRpZgogCiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGRpZV9sb2NrKTsKQEAgLTEwMTIsMyArMTA2MiwxNCBAQAogfQogX19zZXR1cCgia3N0YWNrPSIsIGtzdGFja19zZXR1cCk7CiAKK3N0YXRpYyBpbnQgX19pbml0IGNhbGxfdHJhY2Vfc2V0dXAoY2hhciAqcykKK3sKKwlpZiAoc3RyY21wKHMsICJvbGQiKSA9PSAwKQorCQljYWxsX3RyYWNlID0gLTE7CisJZWxzZSBpZiAoc3RyY21wKHMsICJib3RoIikgPT0gMCkKKwkJY2FsbF90cmFjZSA9IDA7CisJZWxzZSBpZiAoc3RyY21wKHMsICJuZXciKSA9PSAwKQorCQljYWxsX3RyYWNlID0gMTsKKwlyZXR1cm4gMTsKK30KK19fc2V0dXAoImNhbGxfdHJhY2U9IiwgY2FsbF90cmFjZV9zZXR1cCk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvdm1saW51eC5sZHMuUyBiL2FyY2gveDg2XzY0L2tlcm5lbC92bWxpbnV4Lmxkcy5TCmluZGV4IGI4MWY0NzMuLjFjNmE1ZjMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC92bWxpbnV4Lmxkcy5TCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC92bWxpbnV4Lmxkcy5TCkBAIC00NSw2ICs0NSwxNSBAQAogCiAgIFJPREFUQQogCisjaWZkZWYgQ09ORklHX1NUQUNLX1VOV0lORAorICAuID0gQUxJR04oOCk7CisgIC5laF9mcmFtZSA6IEFUKEFERFIoLmVoX2ZyYW1lKSAtIExPQURfT0ZGU0VUKSB7CisJX19zdGFydF91bndpbmQgPSAuOworICAJKiguZWhfZnJhbWUpCisJX19lbmRfdW53aW5kID0gLjsKKyAgfQorI2VuZGlmCisKIAkJCQkvKiBEYXRhICovCiAgIC5kYXRhIDogQVQoQUREUiguZGF0YSkgLSBMT0FEX09GRlNFVCkgewogCSooLmRhdGEpCkBAIC0xMzEsNiArMTQwLDI2IEBACiAJKiguZGF0YS5wYWdlX2FsaWduZWQpCiAgIH0KIAorICAvKiBtaWdodCBnZXQgZnJlZWQgYWZ0ZXIgaW5pdCAqLworICAuID0gQUxJR04oNDA5Nik7CisgIF9fc21wX2FsdF9iZWdpbiA9IC47CisgIF9fc21wX2FsdF9pbnN0cnVjdGlvbnMgPSAuOworICAuc21wX2FsdGluc3RydWN0aW9ucyA6IEFUKEFERFIoLnNtcF9hbHRpbnN0cnVjdGlvbnMpIC0gTE9BRF9PRkZTRVQpIHsKKwkqKC5zbXBfYWx0aW5zdHJ1Y3Rpb25zKQorICB9CisgIF9fc21wX2FsdF9pbnN0cnVjdGlvbnNfZW5kID0gLjsKKyAgLiA9IEFMSUdOKDgpOworICBfX3NtcF9sb2NrcyA9IC47CisgIC5zbXBfbG9ja3MgOiBBVChBRERSKC5zbXBfbG9ja3MpIC0gTE9BRF9PRkZTRVQpIHsKKwkqKC5zbXBfbG9ja3MpCisgIH0KKyAgX19zbXBfbG9ja3NfZW5kID0gLjsKKyAgLnNtcF9hbHRpbnN0cl9yZXBsYWNlbWVudCA6IEFUKEFERFIoLnNtcF9hbHRpbnN0cl9yZXBsYWNlbWVudCkgLSBMT0FEX09GRlNFVCkgeworCSooLnNtcF9hbHRpbnN0cl9yZXBsYWNlbWVudCkKKyAgfQorICAuID0gQUxJR04oNDA5Nik7CisgIF9fc21wX2FsdF9lbmQgPSAuOworCiAgIC4gPSBBTElHTig0MDk2KTsJCS8qIEluaXQgY29kZSBhbmQgZGF0YSAqLwogICBfX2luaXRfYmVnaW4gPSAuOwogICAuaW5pdC50ZXh0IDogQVQoQUREUiguaW5pdC50ZXh0KSAtIExPQURfT0ZGU0VUKSB7CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvdnN5c2NhbGwuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC92c3lzY2FsbC5jCmluZGV4IDk0NjhmYjIuLmY2MDMwMzcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC92c3lzY2FsbC5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC92c3lzY2FsbC5jCkBAIC0xMDcsNyArMTA3LDcgQEAKIAogaW50IF9fdnN5c2NhbGwoMCkgdmdldHRpbWVvZmRheShzdHJ1Y3QgdGltZXZhbCAqIHR2LCBzdHJ1Y3QgdGltZXpvbmUgKiB0eikKIHsKLQlpZiAodW5saWtlbHkoIV9fc3lzY3RsX3ZzeXNjYWxsKSkKKwlpZiAoIV9fc3lzY3RsX3ZzeXNjYWxsKQogCQlyZXR1cm4gZ2V0dGltZW9mZGF5KHR2LHR6KTsKIAlpZiAodHYpCiAJCWRvX3ZnZXR0aW1lb2ZkYXkodHYpOwpAQCAtMTIwLDcgKzEyMCw3IEBACiAgKiB1bmxpa2VseSAqLwogdGltZV90IF9fdnN5c2NhbGwoMSkgdnRpbWUodGltZV90ICp0KQogewotCWlmICh1bmxpa2VseSghX19zeXNjdGxfdnN5c2NhbGwpKQorCWlmICghX19zeXNjdGxfdnN5c2NhbGwpCiAJCXJldHVybiB0aW1lX3N5c2NhbGwodCk7CiAJZWxzZSBpZiAodCkKIAkJKnQgPSBfX3h0aW1lLnR2X3NlYzsJCQpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL3g4NjY0X2tzeW1zLmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwveDg2NjRfa3N5bXMuYwppbmRleCAxZGVmMjFjLi4zNzA5NTJjIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwveDg2NjRfa3N5bXMuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwveDg2NjRfa3N5bXMuYwpAQCAtMSw2NiArMSwyMSBAQAorLyogRXhwb3J0cyBmb3IgYXNzZW1ibHkgZmlsZXMuCisgICBBbGwgQyBleHBvcnRzIHNob3VsZCBnbyBpbiB0aGUgcmVzcGVjdGl2ZSBDIGZpbGVzLiAqLworCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+Ci0jaW5jbHVkZSA8bGludXgvdXNlci5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvaW42Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9wbS5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2FwbV9iaW9zLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KLSNpbmNsdWRlIDxsaW51eC90dHkuaD4KIAogI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+Ci0jaW5jbHVkZSA8YXNtL2kzODcuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGFzbS9jaGVja3N1bS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9kZWxheS5oPgotI2luY2x1ZGUgPGFzbS9pcnEuaD4KLSNpbmNsdWRlIDxhc20vbW14Lmg+Ci0jaW5jbHVkZSA8YXNtL2Rlc2MuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgotI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+Ci0jaW5jbHVkZSA8YXNtL25taS5oPgotI2luY2x1ZGUgPGFzbS9rZGVidWcuaD4KLSNpbmNsdWRlIDxhc20vdW5pc3RkLmg+Ci0jaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+Ci0jaW5jbHVkZSA8YXNtL2tkZWJ1Zy5oPgogCi1leHRlcm4gc3BpbmxvY2tfdCBydGNfbG9jazsKLQotI2lmZGVmIENPTkZJR19TTVAKLWV4dGVybiB2b2lkIF9fd3JpdGVfbG9ja19mYWlsZWQocndsb2NrX3QgKnJ3KTsKLWV4dGVybiB2b2lkIF9fcmVhZF9sb2NrX2ZhaWxlZChyd2xvY2tfdCAqcncpOwotI2VuZGlmCi0KLS8qIHBsYXRmb3JtIGRlcGVuZGVudCBzdXBwb3J0ICovCi1FWFBPUlRfU1lNQk9MKGJvb3RfY3B1X2RhdGEpOwotLy9FWFBPUlRfU1lNQk9MKGR1bXBfZnB1KTsKLUVYUE9SVF9TWU1CT0woX19pb3JlbWFwKTsKLUVYUE9SVF9TWU1CT0woaW9yZW1hcF9ub2NhY2hlKTsKLUVYUE9SVF9TWU1CT0woaW91bm1hcCk7CiBFWFBPUlRfU1lNQk9MKGtlcm5lbF90aHJlYWQpOwotRVhQT1JUX1NZTUJPTChwbV9pZGxlKTsKLUVYUE9SVF9TWU1CT0wocG1fcG93ZXJfb2ZmKTsKIAogRVhQT1JUX1NZTUJPTChfX2Rvd25fZmFpbGVkKTsKIEVYUE9SVF9TWU1CT0woX19kb3duX2ZhaWxlZF9pbnRlcnJ1cHRpYmxlKTsKIEVYUE9SVF9TWU1CT0woX19kb3duX2ZhaWxlZF90cnlsb2NrKTsKIEVYUE9SVF9TWU1CT0woX191cF93YWtldXApOwotLyogTmV0d29ya2luZyBoZWxwZXIgcm91dGluZXMuICovCi1FWFBPUlRfU1lNQk9MKGNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2spOwotRVhQT1JUX1NZTUJPTChpcF9jb21wdXRlX2NzdW0pOwotLyogRGVsYXkgbG9vcHMgKi8KLUVYUE9SVF9TWU1CT0woX191ZGVsYXkpOwotRVhQT1JUX1NZTUJPTChfX25kZWxheSk7Ci1FWFBPUlRfU1lNQk9MKF9fZGVsYXkpOwotRVhQT1JUX1NZTUJPTChfX2NvbnN0X3VkZWxheSk7CiAKIEVYUE9SVF9TWU1CT0woX19nZXRfdXNlcl8xKTsKIEVYUE9SVF9TWU1CT0woX19nZXRfdXNlcl8yKTsKQEAgLTcxLDQyICsyNiwyMCBAQAogRVhQT1JUX1NZTUJPTChfX3B1dF91c2VyXzQpOwogRVhQT1JUX1NZTUJPTChfX3B1dF91c2VyXzgpOwogCi1FWFBPUlRfU1lNQk9MKHN0cm5jcHlfZnJvbV91c2VyKTsKLUVYUE9SVF9TWU1CT0woX19zdHJuY3B5X2Zyb21fdXNlcik7Ci1FWFBPUlRfU1lNQk9MKGNsZWFyX3VzZXIpOwotRVhQT1JUX1NZTUJPTChfX2NsZWFyX3VzZXIpOwogRVhQT1JUX1NZTUJPTChjb3B5X3VzZXJfZ2VuZXJpYyk7CiBFWFBPUlRfU1lNQk9MKGNvcHlfZnJvbV91c2VyKTsKIEVYUE9SVF9TWU1CT0woY29weV90b191c2VyKTsKLUVYUE9SVF9TWU1CT0woY29weV9pbl91c2VyKTsKLUVYUE9SVF9TWU1CT0woc3Rybmxlbl91c2VyKTsKLQotI2lmZGVmIENPTkZJR19QQ0kKLUVYUE9SVF9TWU1CT0wocGNpX21lbV9zdGFydCk7Ci0jZW5kaWYKIAogRVhQT1JUX1NZTUJPTChjb3B5X3BhZ2UpOwogRVhQT1JUX1NZTUJPTChjbGVhcl9wYWdlKTsKIAotRVhQT1JUX1NZTUJPTChfY3B1X3BkYSk7CiAjaWZkZWYgQ09ORklHX1NNUAotRVhQT1JUX1NZTUJPTChjcHVfZGF0YSk7CitleHRlcm4gdm9pZCBGQVNUQ0FMTCggX193cml0ZV9sb2NrX2ZhaWxlZChyd2xvY2tfdCAqcncpKTsKK2V4dGVybiB2b2lkIEZBU1RDQUxMKCBfX3JlYWRfbG9ja19mYWlsZWQocndsb2NrX3QgKnJ3KSk7CiBFWFBPUlRfU1lNQk9MKF9fd3JpdGVfbG9ja19mYWlsZWQpOwogRVhQT1JUX1NZTUJPTChfX3JlYWRfbG9ja19mYWlsZWQpOwotCi1FWFBPUlRfU1lNQk9MKHNtcF9jYWxsX2Z1bmN0aW9uKTsKLUVYUE9SVF9TWU1CT0woY3B1X2NhbGxvdXRfbWFwKTsKICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX1ZUCi1FWFBPUlRfU1lNQk9MKHNjcmVlbl9pbmZvKTsKLSNlbmRpZgotCi1FWFBPUlRfU1lNQk9MKHJ0Y19sb2NrKTsKLQotRVhQT1JUX1NZTUJPTF9HUEwoc2V0X25taV9jYWxsYmFjayk7Ci1FWFBPUlRfU1lNQk9MX0dQTCh1bnNldF9ubWlfY2FsbGJhY2spOwotCiAvKiBFeHBvcnQgc3RyaW5nIGZ1bmN0aW9ucy4gV2Ugbm9ybWFsbHkgcmVseSBvbiBnY2MgYnVpbHRpbiBmb3IgbW9zdCBvZiB0aGVzZSwKICAgIGJ1dCBnY2Mgc29tZXRpbWVzIGRlY2lkZXMgbm90IHRvIGlubGluZSB0aGVtLiAqLyAgICAKICN1bmRlZiBtZW1jcHkKQEAgLTExNCw1MSArNDcsMTQgQEAKICN1bmRlZiBtZW1tb3ZlCiAKIGV4dGVybiB2b2lkICogbWVtc2V0KHZvaWQgKixpbnQsX19rZXJuZWxfc2l6ZV90KTsKLWV4dGVybiBzaXplX3Qgc3RybGVuKGNvbnN0IGNoYXIgKik7Ci1leHRlcm4gdm9pZCAqIG1lbW1vdmUodm9pZCAqIGRlc3QsY29uc3Qgdm9pZCAqc3JjLHNpemVfdCBjb3VudCk7CiBleHRlcm4gdm9pZCAqIG1lbWNweSh2b2lkICosY29uc3Qgdm9pZCAqLF9fa2VybmVsX3NpemVfdCk7CiBleHRlcm4gdm9pZCAqIF9fbWVtY3B5KHZvaWQgKixjb25zdCB2b2lkICosX19rZXJuZWxfc2l6ZV90KTsKIAogRVhQT1JUX1NZTUJPTChtZW1zZXQpOwotRVhQT1JUX1NZTUJPTChtZW1tb3ZlKTsKIEVYUE9SVF9TWU1CT0wobWVtY3B5KTsKIEVYUE9SVF9TWU1CT0woX19tZW1jcHkpOwogCi0jaWZkZWYgQ09ORklHX1JXU0VNX1hDSEdBRERfQUxHT1JJVEhNCi0vKiBwcm90b3R5cGVzIGFyZSB3cm9uZywgdGhlc2UgYXJlIGFzc2VtYmx5IHdpdGggY3VzdG9tIGNhbGxpbmcgZnVuY3Rpb25zICovCi1leHRlcm4gdm9pZCByd3NlbV9kb3duX3JlYWRfZmFpbGVkX3RodW5rKHZvaWQpOwotZXh0ZXJuIHZvaWQgcndzZW1fd2FrZV90aHVuayh2b2lkKTsKLWV4dGVybiB2b2lkIHJ3c2VtX2Rvd25ncmFkZV90aHVuayh2b2lkKTsKLWV4dGVybiB2b2lkIHJ3c2VtX2Rvd25fd3JpdGVfZmFpbGVkX3RodW5rKHZvaWQpOwotRVhQT1JUX1NZTUJPTChyd3NlbV9kb3duX3JlYWRfZmFpbGVkX3RodW5rKTsKLUVYUE9SVF9TWU1CT0wocndzZW1fd2FrZV90aHVuayk7Ci1FWFBPUlRfU1lNQk9MKHJ3c2VtX2Rvd25ncmFkZV90aHVuayk7Ci1FWFBPUlRfU1lNQk9MKHJ3c2VtX2Rvd25fd3JpdGVfZmFpbGVkX3RodW5rKTsKLSNlbmRpZgotCiBFWFBPUlRfU1lNQk9MKGVtcHR5X3plcm9fcGFnZSk7Ci0KLUVYUE9SVF9TWU1CT0woZGllX2NoYWluKTsKLQotI2lmZGVmIENPTkZJR19TTVAKLUVYUE9SVF9TWU1CT0woY3B1X3NpYmxpbmdfbWFwKTsKLUVYUE9SVF9TWU1CT0woc21wX251bV9zaWJsaW5ncyk7Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19CVUcKLUVYUE9SVF9TWU1CT0wob3V0X29mX2xpbmVfYnVnKTsKLSNlbmRpZgotCiBFWFBPUlRfU1lNQk9MKGluaXRfbGV2ZWw0X3BndCk7Ci0KLWV4dGVybiB1bnNpZ25lZCBsb25nIF9fc3VwcG9ydGVkX3B0ZV9tYXNrOwotRVhQT1JUX1NZTUJPTChfX3N1cHBvcnRlZF9wdGVfbWFzayk7Ci0KLSNpZmRlZiBDT05GSUdfU01QCi1FWFBPUlRfU1lNQk9MKGZsdXNoX3RsYl9wYWdlKTsKLSNlbmRpZgotCi1FWFBPUlRfU1lNQk9MKGNwdV9raHopOwotCiBFWFBPUlRfU1lNQk9MKGxvYWRfZ3NfaW5kZXgpOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9saWIvY3N1bS1wYXJ0aWFsLmMgYi9hcmNoL3g4Nl82NC9saWIvY3N1bS1wYXJ0aWFsLmMKaW5kZXggNTM4NGUyMi4uYzQ5MzczNSAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQvbGliL2NzdW0tcGFydGlhbC5jCisrKyBiL2FyY2gveDg2XzY0L2xpYi9jc3VtLXBhcnRpYWwuYwpAQCAtMTQ3LDQgKzE0Nyw1IEBACiB7CiAJcmV0dXJuIGNzdW1fZm9sZChjc3VtX3BhcnRpYWwoYnVmZixsZW4sMCkpOwogfQorRVhQT1JUX1NZTUJPTChpcF9jb21wdXRlX2NzdW0pOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9saWIvY3N1bS13cmFwcGVycy5jIGIvYXJjaC94ODZfNjQvbGliL2NzdW0td3JhcHBlcnMuYwppbmRleCA5NDMyM2YyLi5iMTMyMGVjIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9saWIvY3N1bS13cmFwcGVycy5jCisrKyBiL2FyY2gveDg2XzY0L2xpYi9jc3VtLXdyYXBwZXJzLmMKQEAgLTEwOSw2ICsxMDksNyBAQAogeyAKIAlyZXR1cm4gY3N1bV9wYXJ0aWFsX2NvcHlfZ2VuZXJpYyhzcmMsZHN0LGxlbixzdW0sTlVMTCxOVUxMKTsKIH0gCitFWFBPUlRfU1lNQk9MKGNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2spOwogCiB1bnNpZ25lZCBzaG9ydCBjc3VtX2lwdjZfbWFnaWMoc3RydWN0IGluNl9hZGRyICpzYWRkciwgc3RydWN0IGluNl9hZGRyICpkYWRkciwKIAkJCSAgICAgICBfX3UzMiBsZW4sIHVuc2lnbmVkIHNob3J0IHByb3RvLCB1bnNpZ25lZCBpbnQgc3VtKSAKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2xpYi9kZWxheS5jIGIvYXJjaC94ODZfNjQvbGliL2RlbGF5LmMKaW5kZXggMDNjNDYwYy4uYjZjZDNjYyAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQvbGliL2RlbGF5LmMKKysrIGIvYXJjaC94ODZfNjQvbGliL2RlbGF5LmMKQEAgLTksNiArOSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxhc20vZGVsYXkuaD4KQEAgLTM2LDE4ICszNywyMiBAQAogCX0KIAl3aGlsZSgobm93LWJjbG9jaykgPCBsb29wcyk7CiB9CitFWFBPUlRfU1lNQk9MKF9fZGVsYXkpOwogCiBpbmxpbmUgdm9pZCBfX2NvbnN0X3VkZWxheSh1bnNpZ25lZCBsb25nIHhsb29wcykKIHsKIAlfX2RlbGF5KCh4bG9vcHMgKiBIWiAqIGNwdV9kYXRhW3Jhd19zbXBfcHJvY2Vzc29yX2lkKCldLmxvb3BzX3Blcl9qaWZmeSkgPj4gMzIpOwogfQorRVhQT1JUX1NZTUJPTChfX2NvbnN0X3VkZWxheSk7CiAKIHZvaWQgX191ZGVsYXkodW5zaWduZWQgbG9uZyB1c2VjcykKIHsKIAlfX2NvbnN0X3VkZWxheSh1c2VjcyAqIDB4MDAwMDEwYzYpOyAgLyogMioqMzIgLyAxMDAwMDAwICovCiB9CitFWFBPUlRfU1lNQk9MKF9fdWRlbGF5KTsKIAogdm9pZCBfX25kZWxheSh1bnNpZ25lZCBsb25nIG5zZWNzKQogewogCV9fY29uc3RfdWRlbGF5KG5zZWNzICogMHgwMDAwNSk7ICAvKiAyKiozMiAvIDEwMDAwMDAwMDAgKHJvdW5kZWQgdXApICovCiB9CitFWFBPUlRfU1lNQk9MKF9fbmRlbGF5KTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2xpYi9tZW1tb3ZlLmMgYi9hcmNoL3g4Nl82NC9saWIvbWVtbW92ZS5jCmluZGV4IGU5M2Q1MjUuLjc1MWViYWUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2xpYi9tZW1tb3ZlLmMKKysrIGIvYXJjaC94ODZfNjQvbGliL21lbW1vdmUuYwpAQCAtMywxMiArMywxMyBAQAogICovCiAjZGVmaW5lIF9TVFJJTkdfQwogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjdW5kZWYgbWVtbW92ZQogdm9pZCAqbWVtbW92ZSh2b2lkICogZGVzdCxjb25zdCB2b2lkICpzcmMsc2l6ZV90IGNvdW50KQogewogCWlmIChkZXN0IDwgc3JjKSB7IAotCQlfX2lubGluZV9tZW1jcHkoZGVzdCxzcmMsY291bnQpOworCQlyZXR1cm4gbWVtY3B5KGRlc3Qsc3JjLGNvdW50KTsKIAl9IGVsc2UgewogCQljaGFyICpwID0gKGNoYXIgKikgZGVzdCArIGNvdW50OwogCQljaGFyICpzID0gKGNoYXIgKikgc3JjICsgY291bnQ7CkBAIC0xNywzICsxOCw0IEBACiAJfQogCXJldHVybiBkZXN0OwogfSAKK0VYUE9SVF9TWU1CT0wobWVtbW92ZSk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9saWIvdXNlcmNvcHkuYyBiL2FyY2gveDg2XzY0L2xpYi91c2VyY29weS5jCmluZGV4IDliYzJjMjkuLjg5M2Q0M2YgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2xpYi91c2VyY29weS5jCisrKyBiL2FyY2gveDg2XzY0L2xpYi91c2VyY29weS5jCkBAIC01LDYgKzUsNyBAQAogICogQ29weXJpZ2h0IDE5OTcgTGludXMgVG9ydmFsZHMKICAqIENvcHlyaWdodCAyMDAyIEFuZGkgS2xlZW4gPGFrQHN1c2UuZGU+CiAgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCiAvKgpAQCAtNDcsMTUgKzQ4LDE3IEBACiAJX19kb19zdHJuY3B5X2Zyb21fdXNlcihkc3QsIHNyYywgY291bnQsIHJlcyk7CiAJcmV0dXJuIHJlczsKIH0KK0VYUE9SVF9TWU1CT0woX19zdHJuY3B5X2Zyb21fdXNlcik7CiAKIGxvbmcKIHN0cm5jcHlfZnJvbV91c2VyKGNoYXIgKmRzdCwgY29uc3QgY2hhciBfX3VzZXIgKnNyYywgbG9uZyBjb3VudCkKIHsKIAlsb25nIHJlcyA9IC1FRkFVTFQ7CiAJaWYgKGFjY2Vzc19vayhWRVJJRllfUkVBRCwgc3JjLCAxKSkKLQkJX19kb19zdHJuY3B5X2Zyb21fdXNlcihkc3QsIHNyYywgY291bnQsIHJlcyk7CisJCXJldHVybiBfX3N0cm5jcHlfZnJvbV91c2VyKGRzdCwgc3JjLCBjb3VudCk7CiAJcmV0dXJuIHJlczsKIH0KK0VYUE9SVF9TWU1CT0woc3RybmNweV9mcm9tX3VzZXIpOwogCiAvKgogICogWmVybyBVc2Vyc3BhY2UKQEAgLTk0LDcgKzk3LDcgQEAKIAkJICBbemVyb10gInIiICgwVUwpLCBbZWlnaHRdICJyIiAoOFVMKSk7CiAJcmV0dXJuIHNpemU7CiB9Ci0KK0VYUE9SVF9TWU1CT0woX19jbGVhcl91c2VyKTsKIAogdW5zaWduZWQgbG9uZyBjbGVhcl91c2VyKHZvaWQgX191c2VyICp0bywgdW5zaWduZWQgbG9uZyBuKQogewpAQCAtMTAyLDYgKzEwNSw3IEBACiAJCXJldHVybiBfX2NsZWFyX3VzZXIodG8sIG4pOwogCXJldHVybiBuOwogfQorRVhQT1JUX1NZTUJPTChjbGVhcl91c2VyKTsKIAogLyoKICAqIFJldHVybiB0aGUgc2l6ZSBvZiBhIHN0cmluZyAoaW5jbHVkaW5nIHRoZSBlbmRpbmcgMCkKQEAgLTEyNSw2ICsxMjksNyBAQAogCQlzKys7CiAJfQogfQorRVhQT1JUX1NZTUJPTChfX3N0cm5sZW5fdXNlcik7CiAKIGxvbmcgc3Rybmxlbl91c2VyKGNvbnN0IGNoYXIgX191c2VyICpzLCBsb25nIG4pCiB7CkBAIC0xMzIsNiArMTM3LDcgQEAKIAkJcmV0dXJuIDA7CiAJcmV0dXJuIF9fc3Rybmxlbl91c2VyKHMsIG4pOwogfQorRVhQT1JUX1NZTUJPTChzdHJubGVuX3VzZXIpOwogCiBsb25nIHN0cmxlbl91c2VyKGNvbnN0IGNoYXIgX191c2VyICpzKQogewpAQCAtMTQ3LDYgKzE1Myw3IEBACiAJCXMrKzsKIAl9CiB9CitFWFBPUlRfU1lNQk9MKHN0cmxlbl91c2VyKTsKIAogdW5zaWduZWQgbG9uZyBjb3B5X2luX3VzZXIodm9pZCBfX3VzZXIgKnRvLCBjb25zdCB2b2lkIF9fdXNlciAqZnJvbSwgdW5zaWduZWQgbGVuKQogewpAQCAtMTU1LDMgKzE2Miw1IEBACiAJfSAKIAlyZXR1cm4gbGVuOwkJCiB9CitFWFBPUlRfU1lNQk9MKGNvcHlfaW5fdXNlcik7CisKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L21tL2ZhdWx0LmMgYi9hcmNoL3g4Nl82NC9tbS9mYXVsdC5jCmluZGV4IDU1MjUwNTkuLjA4ZGM2OTYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L21tL2ZhdWx0LmMKKysrIGIvYXJjaC94ODZfNjQvbW0vZmF1bHQuYwpAQCAtNDEsNiArNDEsNDEgQEAKICNkZWZpbmUgUEZfUlNWRAkoMTw8MykKICNkZWZpbmUgUEZfSU5TVFIJKDE8PDQpCiAKKyNpZmRlZiBDT05GSUdfS1BST0JFUworQVRPTUlDX05PVElGSUVSX0hFQUQobm90aWZ5X3BhZ2VfZmF1bHRfY2hhaW4pOworCisvKiBIb29rIHRvIHJlZ2lzdGVyIGZvciBwYWdlIGZhdWx0IG5vdGlmaWNhdGlvbnMgKi8KK2ludCByZWdpc3Rlcl9wYWdlX2ZhdWx0X25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpCit7CisJdm1hbGxvY19zeW5jX2FsbCgpOworCXJldHVybiBhdG9taWNfbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIoJm5vdGlmeV9wYWdlX2ZhdWx0X2NoYWluLCBuYik7Cit9CisKK2ludCB1bnJlZ2lzdGVyX3BhZ2VfZmF1bHRfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKK3sKKwlyZXR1cm4gYXRvbWljX25vdGlmaWVyX2NoYWluX3VucmVnaXN0ZXIoJm5vdGlmeV9wYWdlX2ZhdWx0X2NoYWluLCBuYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG5vdGlmeV9wYWdlX2ZhdWx0KGVudW0gZGllX3ZhbCB2YWwsIGNvbnN0IGNoYXIgKnN0ciwKKwkJCXN0cnVjdCBwdF9yZWdzICpyZWdzLCBsb25nIGVyciwgaW50IHRyYXAsIGludCBzaWcpCit7CisJc3RydWN0IGRpZV9hcmdzIGFyZ3MgPSB7CisJCS5yZWdzID0gcmVncywKKwkJLnN0ciA9IHN0ciwKKwkJLmVyciA9IGVyciwKKwkJLnRyYXBuciA9IHRyYXAsCisJCS5zaWduciA9IHNpZworCX07CisJcmV0dXJuIGF0b21pY19ub3RpZmllcl9jYWxsX2NoYWluKCZub3RpZnlfcGFnZV9mYXVsdF9jaGFpbiwgdmFsLCAmYXJncyk7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgbm90aWZ5X3BhZ2VfZmF1bHQoZW51bSBkaWVfdmFsIHZhbCwgY29uc3QgY2hhciAqc3RyLAorCQkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGxvbmcgZXJyLCBpbnQgdHJhcCwgaW50IHNpZykKK3sKKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisjZW5kaWYKKwogdm9pZCBidXN0X3NwaW5sb2NrcyhpbnQgeWVzKQogewogCWludCBsb2dsZXZlbF9zYXZlID0gY29uc29sZV9sb2dsZXZlbDsKQEAgLTE2MCw3ICsxOTUsNyBAQAogCXByaW50aygiUEdEICVseCAiLCBwZ2RfdmFsKCpwZ2QpKTsKIAlpZiAoIXBnZF9wcmVzZW50KCpwZ2QpKSBnb3RvIHJldDsgCiAKLQlwdWQgPSBfX3B1ZF9vZmZzZXRfaygocHVkX3QgKilwZ2RfcGFnZSgqcGdkKSwgYWRkcmVzcyk7CisJcHVkID0gcHVkX29mZnNldChwZ2QsIGFkZHJlc3MpOwogCWlmIChiYWRfYWRkcmVzcyhwdWQpKSBnb3RvIGJhZDsKIAlwcmludGsoIlBVRCAlbHggIiwgcHVkX3ZhbCgqcHVkKSk7CiAJaWYgKCFwdWRfcHJlc2VudCgqcHVkKSkJZ290byByZXQ7CkBAIC0zNDgsNyArMzgzLDcgQEAKIAkJCWlmICh2bWFsbG9jX2ZhdWx0KGFkZHJlc3MpID49IDApCiAJCQkJcmV0dXJuOwogCQl9Ci0JCWlmIChub3RpZnlfZGllKERJRV9QQUdFX0ZBVUxULCAicGFnZSBmYXVsdCIsIHJlZ3MsIGVycm9yX2NvZGUsIDE0LAorCQlpZiAobm90aWZ5X3BhZ2VfZmF1bHQoRElFX1BBR0VfRkFVTFQsICJwYWdlIGZhdWx0IiwgcmVncywgZXJyb3JfY29kZSwgMTQsCiAJCQkJCQlTSUdTRUdWKSA9PSBOT1RJRllfU1RPUCkKIAkJCXJldHVybjsKIAkJLyoKQEAgLTM1OCw3ICszOTMsNyBAQAogCQlnb3RvIGJhZF9hcmVhX25vc2VtYXBob3JlOwogCX0KIAotCWlmIChub3RpZnlfZGllKERJRV9QQUdFX0ZBVUxULCAicGFnZSBmYXVsdCIsIHJlZ3MsIGVycm9yX2NvZGUsIDE0LAorCWlmIChub3RpZnlfcGFnZV9mYXVsdChESUVfUEFHRV9GQVVMVCwgInBhZ2UgZmF1bHQiLCByZWdzLCBlcnJvcl9jb2RlLCAxNCwKIAkJCQkJU0lHU0VHVikgPT0gTk9USUZZX1NUT1ApCiAJCXJldHVybjsKIApAQCAtNDEwLDggKzQ0NSwxMCBAQAogCWlmICghKHZtYS0+dm1fZmxhZ3MgJiBWTV9HUk9XU0RPV04pKQogCQlnb3RvIGJhZF9hcmVhOwogCWlmIChlcnJvcl9jb2RlICYgNCkgewotCQkvLyBYWFg6IGFsaWduIHJlZCB6b25lIHNpemUgd2l0aCBBQkkgCi0JCWlmIChhZGRyZXNzICsgMTI4IDwgcmVncy0+cnNwKQorCQkvKiBBbGxvdyB1c2Vyc3BhY2UganVzdCBlbm91Z2ggYWNjZXNzIGJlbG93IHRoZSBzdGFjayBwb2ludGVyCisJCSAqIHRvIGxldCB0aGUgJ2VudGVyJyBpbnN0cnVjdGlvbiB3b3JrLgorCQkgKi8KKwkJaWYgKGFkZHJlc3MgKyA2NTUzNiArIDMyICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpIDwgcmVncy0+cnNwKQogCQkJZ290byBiYWRfYXJlYTsKIAl9CiAJaWYgKGV4cGFuZF9zdGFjayh2bWEsIGFkZHJlc3MpKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQvbW0vaW5pdC5jIGIvYXJjaC94ODZfNjQvbW0vaW5pdC5jCmluZGV4IDRiYTM0ZTkuLjAyYWRkMWQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L21tL2luaXQuYworKysgYi9hcmNoL3g4Nl82NC9tbS9pbml0LmMKQEAgLTQxLDggKzQxLDYgQEAKICNpbmNsdWRlIDxhc20vcHJvdG8uaD4KICNpbmNsdWRlIDxhc20vc21wLmg+CiAjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+Ci0jaW5jbHVkZSA8YXNtL2RtYS1tYXBwaW5nLmg+Ci0jaW5jbHVkZSA8YXNtL3N3aW90bGIuaD4KIAogI2lmbmRlZiBEcHJpbnRrCiAjZGVmaW5lIERwcmludGsoeC4uLikKQEAgLTkwLDggKzg4LDYgQEAKIAlwcmludGsoS0VSTl9JTkZPICIlbHUgcGFnZXMgc3dhcCBjYWNoZWRcbiIsY2FjaGVkKTsKIH0KIAotLyogUmVmZXJlbmNlcyB0byBzZWN0aW9uIGJvdW5kYXJpZXMgKi8KLQogaW50IGFmdGVyX2Jvb3RtZW07CiAKIHN0YXRpYyBfX2luaXQgdm9pZCAqc3BwX2dldHBhZ2Uodm9pZCkKQEAgLTI2MSw5ICsyNTcsMTAgQEAKIAlmb3IgKGkgPSAwOyBpIDwgUFRSU19QRVJfUE1EOyBwbWQrKywgaSsrLCBhZGRyZXNzICs9IFBNRF9TSVpFKSB7CiAJCXVuc2lnbmVkIGxvbmcgZW50cnk7CiAKLQkJaWYgKGFkZHJlc3MgPiBlbmQpIHsKLQkJCWZvciAoOyBpIDwgUFRSU19QRVJfUE1EOyBpKyssIHBtZCsrKQotCQkJCXNldF9wbWQocG1kLCBfX3BtZCgwKSk7CisJCWlmIChhZGRyZXNzID49IGVuZCkgeworCQkJaWYgKCFhZnRlcl9ib290bWVtKQorCQkJCWZvciAoOyBpIDwgUFRSU19QRVJfUE1EOyBpKyssIHBtZCsrKQorCQkJCQlzZXRfcG1kKHBtZCwgX19wbWQoMCkpOwogCQkJYnJlYWs7CiAJCX0KIAkJZW50cnkgPSBfUEFHRV9OWHxfUEFHRV9QU0V8X0tFUk5QR19UQUJMRXxfUEFHRV9HTE9CQUx8YWRkcmVzczsKQEAgLTM0MSw3ICszMzgsOCBAQAogCXRhYmxlX2VuZCA9IHRhYmxlX3N0YXJ0OwogCiAJZWFybHlfcHJpbnRrKCJrZXJuZWwgZGlyZWN0IG1hcHBpbmcgdGFibGVzIHVwIHRvICVseCBAICVseC0lbHhcbiIsCi0JCWVuZCwgdGFibGVfc3RhcnQgPDwgUEFHRV9TSElGVCwgdGFibGVfZW5kIDw8IFBBR0VfU0hJRlQpOworCQllbmQsIHRhYmxlX3N0YXJ0IDw8IFBBR0VfU0hJRlQsCisJCSh0YWJsZV9zdGFydCA8PCBQQUdFX1NISUZUKSArIHRhYmxlcyk7CiB9CiAKIC8qIFNldHVwIHRoZSBkaXJlY3QgbWFwcGluZyBvZiB0aGUgcGh5c2ljYWwgbWVtb3J5IGF0IFBBR0VfT0ZGU0VULgpAQCAtMzcyLDcgKzM3MCw3IEBACiAJCXB1ZF90ICpwdWQ7CiAKIAkJaWYgKGFmdGVyX2Jvb3RtZW0pCi0JCQlwdWQgPSBwdWRfb2Zmc2V0X2socGdkLCBzdGFydCAmIFBHRElSX01BU0spOworCQkJcHVkID0gcHVkX29mZnNldChwZ2QsIHN0YXJ0ICYgUEdESVJfTUFTSyk7CiAJCWVsc2UKIAkJCXB1ZCA9IGFsbG9jX2xvd19wYWdlKCZtYXAsICZwdWRfcGh5cyk7CiAKQEAgLTU4NywxMCArNTg1LDcgQEAKIHsKIAlsb25nIGNvZGVzaXplLCByZXNlcnZlZHBhZ2VzLCBkYXRhc2l6ZSwgaW5pdHNpemU7CiAKLSNpZmRlZiBDT05GSUdfU1dJT1RMQgotCXBjaV9zd2lvdGxiX2luaXQoKTsKLSNlbmRpZgotCW5vX2lvbW11X2luaXQoKTsKKwlwY2lfaW9tbXVfYWxsb2MoKTsKIAogCS8qIEhvdyBtYW55IGVuZC1vZi1tZW1vcnkgdmFyaWFibGVzIHlvdSBoYXZlLCBncmFuZG1hISAqLwogCW1heF9sb3dfcGZuID0gZW5kX3BmbjsKQEAgLTY0NCwyMCArNjM5LDI5IEBACiAjZW5kaWYKIH0KIAotdm9pZCBmcmVlX2luaXRtZW0odm9pZCkKK3ZvaWQgZnJlZV9pbml0X3BhZ2VzKGNoYXIgKndoYXQsIHVuc2lnbmVkIGxvbmcgYmVnaW4sIHVuc2lnbmVkIGxvbmcgZW5kKQogewogCXVuc2lnbmVkIGxvbmcgYWRkcjsKIAotCWFkZHIgPSAodW5zaWduZWQgbG9uZykoJl9faW5pdF9iZWdpbik7Ci0JZm9yICg7IGFkZHIgPCAodW5zaWduZWQgbG9uZykoJl9faW5pdF9lbmQpOyBhZGRyICs9IFBBR0VfU0laRSkgeworCWlmIChiZWdpbiA+PSBlbmQpCisJCXJldHVybjsKKworCXByaW50ayhLRVJOX0lORk8gIkZyZWVpbmcgJXM6ICVsZGsgZnJlZWRcbiIsIHdoYXQsIChlbmQgLSBiZWdpbikgPj4gMTApOworCWZvciAoYWRkciA9IGJlZ2luOyBhZGRyIDwgZW5kOyBhZGRyICs9IFBBR0VfU0laRSkgewogCQlDbGVhclBhZ2VSZXNlcnZlZCh2aXJ0X3RvX3BhZ2UoYWRkcikpOwogCQlpbml0X3BhZ2VfY291bnQodmlydF90b19wYWdlKGFkZHIpKTsKIAkJbWVtc2V0KCh2b2lkICopKGFkZHIgJiB+KFBBR0VfU0laRS0xKSksIDB4Y2MsIFBBR0VfU0laRSk7IAogCQlmcmVlX3BhZ2UoYWRkcik7CiAJCXRvdGFscmFtX3BhZ2VzKys7CiAJfQorfQorCit2b2lkIGZyZWVfaW5pdG1lbSh2b2lkKQorewogCW1lbXNldChfX2luaXRkYXRhX2JlZ2luLCAweGJhLCBfX2luaXRkYXRhX2VuZCAtIF9faW5pdGRhdGFfYmVnaW4pOwotCXByaW50ayAoIkZyZWVpbmcgdW51c2VkIGtlcm5lbCBtZW1vcnk6ICVsdWsgZnJlZWRcbiIsIChfX2luaXRfZW5kIC0gX19pbml0X2JlZ2luKSA+PiAxMCk7CisJZnJlZV9pbml0X3BhZ2VzKCJ1bnVzZWQga2VybmVsIG1lbW9yeSIsCisJCQkodW5zaWduZWQgbG9uZykoJl9faW5pdF9iZWdpbiksCisJCQkodW5zaWduZWQgbG9uZykoJl9faW5pdF9lbmQpKTsKIH0KIAogI2lmZGVmIENPTkZJR19ERUJVR19ST0RBVEEKQEAgLTY4NiwxNSArNjkwLDcgQEAKICNpZmRlZiBDT05GSUdfQkxLX0RFVl9JTklUUkQKIHZvaWQgZnJlZV9pbml0cmRfbWVtKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQogewotCWlmIChzdGFydCA+PSBlbmQpCi0JCXJldHVybjsKLQlwcmludGsgKCJGcmVlaW5nIGluaXRyZCBtZW1vcnk6ICVsZGsgZnJlZWRcbiIsIChlbmQgLSBzdGFydCkgPj4gMTApOwotCWZvciAoOyBzdGFydCA8IGVuZDsgc3RhcnQgKz0gUEFHRV9TSVpFKSB7Ci0JCUNsZWFyUGFnZVJlc2VydmVkKHZpcnRfdG9fcGFnZShzdGFydCkpOwotCQlpbml0X3BhZ2VfY291bnQodmlydF90b19wYWdlKHN0YXJ0KSk7Ci0JCWZyZWVfcGFnZShzdGFydCk7Ci0JCXRvdGFscmFtX3BhZ2VzKys7Ci0JfQorCWZyZWVfaW5pdF9wYWdlcygiaW5pdHJkIG1lbW9yeSIsIHN0YXJ0LCBlbmQpOwogfQogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L21tL2lvcmVtYXAuYyBiL2FyY2gveDg2XzY0L21tL2lvcmVtYXAuYwppbmRleCBhZTIwNzA2Li40NWQ3ZDgyIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9tbS9pb3JlbWFwLmMKKysrIGIvYXJjaC94ODZfNjQvbW0vaW9yZW1hcC5jCkBAIC0xMSw2ICsxMSw3IEBACiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3BnYWxsb2MuaD4KICNpbmNsdWRlIDxhc20vZml4bWFwLmg+CkBAIC0yMTksNiArMjIwLDcgQEAKIAl9CiAJcmV0dXJuIChfX2ZvcmNlIHZvaWQgX19pb21lbSAqKSAob2Zmc2V0ICsgKGNoYXIgKilhZGRyKTsKIH0KK0VYUE9SVF9TWU1CT0woX19pb3JlbWFwKTsKIAogLyoqCiAgKiBpb3JlbWFwX25vY2FjaGUgICAgIC0gICBtYXAgYnVzIG1lbW9yeSBpbnRvIENQVSBzcGFjZQpAQCAtMjQ2LDYgKzI0OCw3IEBACiB7CiAJcmV0dXJuIF9faW9yZW1hcChwaHlzX2FkZHIsIHNpemUsIF9QQUdFX1BDRCk7CiB9CitFWFBPUlRfU1lNQk9MKGlvcmVtYXBfbm9jYWNoZSk7CiAKIC8qKgogICogaW91bm1hcCAtIEZyZWUgYSBJTyByZW1hcHBpbmcKQEAgLTI5MSwzICsyOTQsNSBAQAogCUJVR19PTihwICE9IG8gfHwgbyA9PSBOVUxMKTsKIAlrZnJlZShwKTsgCiB9CitFWFBPUlRfU1lNQk9MKGlvdW5tYXApOworCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9wY2kvazgtYnVzLmMgYi9hcmNoL3g4Nl82NC9wY2kvazgtYnVzLmMKaW5kZXggM2FjZjYwZC4uYjUwYTdjNyAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQvcGNpL2s4LWJ1cy5jCisrKyBiL2FyY2gveDg2XzY0L3BjaS9rOC1idXMuYwpAQCAtMiw2ICsyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxhc20vbXBzcGVjLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgorI2luY2x1ZGUgPGFzbS9rOC5oPgogCiAvKgogICogVGhpcyBkaXNjb3ZlcnMgdGhlIHBjaWJ1cyA8LT4gbm9kZSBtYXBwaW5nIG9uIEFNRCBLOC4KQEAgLTE4LDcgKzE5LDYgQEAKICNkZWZpbmUgTlJfTERUX0JVU19OVU1CRVJfUkVHSVNURVJTIDMKICNkZWZpbmUgU0VDT05EQVJZX0xEVF9CVVNfTlVNQkVSKGR3b3JkKSAoKGR3b3JkID4+IDgpICYgMHhGRikKICNkZWZpbmUgU1VCT1JESU5BVEVfTERUX0JVU19OVU1CRVIoZHdvcmQpICgoZHdvcmQgPj4gMTYpICYgMHhGRikKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9LOEhUQ09ORklHIDB4MTEwMAogCiAvKioKICAqIGZpbGxfbXBfYnVzX3RvX2NwdW1hc2soKQpAQCAtMjgsOCArMjgsNyBAQAogX19pbml0IHN0YXRpYyBpbnQKIGZpbGxfbXBfYnVzX3RvX2NwdW1hc2sodm9pZCkKIHsKLQlzdHJ1Y3QgcGNpX2RldiAqbmJfZGV2ID0gTlVMTDsKLQlpbnQgaSwgajsKKwlpbnQgaSwgaiwgazsKIAl1MzIgbGR0YnVzLCBuaWQ7CiAJc3RhdGljIGludCBsYm5yWzNdID0gewogCQlMRFRfQlVTX05VTUJFUl9SRUdJU1RFUl8wLApAQCAtMzcsOCArMzYsOSBAQAogCQlMRFRfQlVTX05VTUJFUl9SRUdJU1RFUl8yCiAJfTsKIAotCXdoaWxlICgobmJfZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9BTUQsCi0JCQlQQ0lfREVWSUNFX0lEX0s4SFRDT05GSUcsIG5iX2RldikpKSB7CisJY2FjaGVfazhfbm9ydGhicmlkZ2VzKCk7CisJZm9yIChrID0gMDsgayA8IG51bV9rOF9ub3J0aGJyaWRnZXM7IGsrKykgeworCQlzdHJ1Y3QgcGNpX2RldiAqbmJfZGV2ID0gazhfbm9ydGhicmlkZ2VzW2tdOwogCQlwY2lfcmVhZF9jb25maWdfZHdvcmQobmJfZGV2LCBOT0RFX0lEX1JFR0lTVEVSLCAmbmlkKTsKIAogCQlmb3IgKGkgPSAwOyBpIDwgTlJfTERUX0JVU19OVU1CRVJfUkVHSVNURVJTOyBpKyspIHsKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL01ha2VmaWxlIGIvYXJjaC94dGVuc2EvTWFrZWZpbGUKaW5kZXggOThmYWM4NC4uM2EzYTRjNiAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2EvTWFrZWZpbGUKKysrIGIvYXJjaC94dGVuc2EvTWFrZWZpbGUKQEAgLTcxLDcgKzcxLDcgQEAKICMgVXBkYXRlIG1hY2hpbmUgY3B1IGFuZCBwbGF0Zm9ybSBzeW1saW5rcyBpZiBzb21ldGhpbmcgd2hpY2ggYWZmZWN0cwogIyB0aGVtIGNoYW5nZWQuCiAKLSQoYXJjaGluYykvLnBsYXRmb3JtOiAkKHdpbGRjYXJkIGluY2x1ZGUvY29uZmlnL2FyY2gvKi5oKSBpbmNsdWRlL2NvbmZpZy9NQVJLRVIKKyQoYXJjaGluYykvLnBsYXRmb3JtOiAkKHdpbGRjYXJkIGluY2x1ZGUvY29uZmlnL2FyY2gvKi5oKSBpbmNsdWRlL2NvbmZpZy9hdXRvLmNvbmYKIAlAZWNobyAnICBTWU1MSU5LICQoYXJjaGluYykveHRlbnNhL2NvbmZpZyAtPiAkKGFyY2hpbmMpL3h0ZW5zYS9jb25maWctJChDUFUpJwogCSQoUSlta2RpciAtcCAkKGFyY2hpbmMpCiAJJChRKW1rZGlyIC1wICQoYXJjaGluYykveHRlbnNhCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9rZXJuZWwvcGNpLmMgYi9hcmNoL3h0ZW5zYS9rZXJuZWwvcGNpLmMKaW5kZXggZGUxOTUwMS4uYzZmNDcxYiAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2Eva2VybmVsL3BjaS5jCisrKyBiL2FyY2gveHRlbnNhL2tlcm5lbC9wY2kuYwpAQCAtMzUwLDE3ICszNTAsNiBAQAogfQogCiAvKgotICogU2V0IHZtX2ZsYWdzIG9mIFZNQSwgYXMgYXBwcm9wcmlhdGUgZm9yIHRoaXMgYXJjaGl0ZWN0dXJlLCBmb3IgYSBwY2kgZGV2aWNlCi0gKiBtYXBwaW5nLgotICovCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkCi1fX3BjaV9tbWFwX3NldF9mbGFncyhzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKLQkJICAgICBlbnVtIHBjaV9tbWFwX3N0YXRlIG1tYXBfc3RhdGUpCi17Ci0Jdm1hLT52bV9mbGFncyB8PSBWTV9TSE0gfCBWTV9MT0NLRUQgfCBWTV9JTzsKLX0KLQotLyoKICAqIFNldCB2bV9wYWdlX3Byb3Qgb2YgVk1BLCBhcyBhcHByb3ByaWF0ZSBmb3IgdGhpcyBhcmNoaXRlY3R1cmUsIGZvciBhIHBjaQogICogZGV2aWNlIG1hcHBpbmcuCiAgKi8KQEAgLTM5OSw3ICszODgsNiBAQAogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCi0JX19wY2lfbW1hcF9zZXRfZmxhZ3MoZGV2LCB2bWEsIG1tYXBfc3RhdGUpOwogCV9fcGNpX21tYXBfc2V0X3BncHJvdChkZXYsIHZtYSwgbW1hcF9zdGF0ZSwgd3JpdGVfY29tYmluZSk7CiAKIAlyZXQgPSBpb19yZW1hcF9wZm5fcmFuZ2Uodm1hLCB2bWEtPnZtX3N0YXJ0LCB2bWEtPnZtX3Bnb2ZmLApkaWZmIC0tZ2l0IGEvYmxvY2svYXMtaW9zY2hlZC5jIGIvYmxvY2svYXMtaW9zY2hlZC5jCmluZGV4IDFlYzVkZjQuLjNhZjMxZWQgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2FzLWlvc2NoZWQuYworKysgYi9ibG9jay9hcy1pb3NjaGVkLmMKQEAgLTg5Miw3ICs4OTIsNyBAQAogfQogCiAvKgotICogYXNfY2FuX2FudGljaXBhdGUgaW5kaWNhdGVzIHdlYXRoZXIgd2Ugc2hvdWxkIGVpdGhlciBydW4gYXJxCisgKiBhc19jYW5fYW50aWNpcGF0ZSBpbmRpY2F0ZXMgd2hldGhlciB3ZSBzaG91bGQgZWl0aGVyIHJ1biBhcnEKICAqIG9yIGtlZXAgYW50aWNpcGF0aW5nIGEgYmV0dGVyIHJlcXVlc3QuCiAgKi8KIHN0YXRpYyBpbnQgYXNfY2FuX2FudGljaXBhdGUoc3RydWN0IGFzX2RhdGEgKmFkLCBzdHJ1Y3QgYXNfcnEgKmFycSkKZGlmZiAtLWdpdCBhL2Jsb2NrL2xsX3J3X2Jsay5jIGIvYmxvY2svbGxfcndfYmxrLmMKaW5kZXggMDYwM2FiMi4uYzA0NDIyYSAxMDA2NDQKLS0tIGEvYmxvY2svbGxfcndfYmxrLmMKKysrIGIvYmxvY2svbGxfcndfYmxrLmMKQEAgLTI3NDUsNyArMjc0NSw3IEBACiAJCXJldHVybiAwOwogCiAJLyoKLQkgKiBub3QgY29udGlnaW91cworCSAqIG5vdCBjb250aWd1b3VzCiAJICovCiAJaWYgKHJlcS0+c2VjdG9yICsgcmVxLT5ucl9zZWN0b3JzICE9IG5leHQtPnNlY3RvcikKIAkJcmV0dXJuIDA7CkBAIC0zNDE1LDcgKzM0MTUsNyBAQAogICoKICAqIERlc2NyaXB0aW9uOgogICogICAgIEVuZHMgYWxsIEkvTyBvbiBhIHJlcXVlc3QuIEl0IGRvZXMgbm90IGhhbmRsZSBwYXJ0aWFsIGNvbXBsZXRpb25zLAotICogICAgIHVubGVzcyB0aGUgZHJpdmVyIGFjdHVhbGx5IGltcGxlbWVudHMgdGhpcyBpbiBpdHMgY29tcGxldGlvbmMgY2FsbGJhY2sKKyAqICAgICB1bmxlc3MgdGhlIGRyaXZlciBhY3R1YWxseSBpbXBsZW1lbnRzIHRoaXMgaW4gaXRzIGNvbXBsZXRpb24gY2FsbGJhY2sKICAqICAgICB0aHJvdWdoIHJlcXVldWVpbmcuIFRoZWggYWN0dWFsIGNvbXBsZXRpb24gaGFwcGVucyBvdXQtb2Ytb3JkZXIsCiAgKiAgICAgdGhyb3VnaCBhIHNvZnRpcnEgaGFuZGxlci4gVGhlIHVzZXIgbXVzdCBoYXZlIHJlZ2lzdGVyZWQgYSBjb21wbGV0aW9uCiAgKiAgICAgY2FsbGJhY2sgdGhyb3VnaCBibGtfcXVldWVfc29mdGlycV9kb25lKCkuCmRpZmYgLS1naXQgYS9jcnlwdG8vS2NvbmZpZyBiL2NyeXB0by9LY29uZmlnCmluZGV4IGM0NDJmMmUuLmJhMTMzZDUgMTAwNjQ0Ci0tLSBhL2NyeXB0by9LY29uZmlnCisrKyBiL2NyeXB0by9LY29uZmlnCkBAIC0zMzcsNyArMzM3LDcgQEAKIAogY29uZmlnIENSWVBUT19URVNUCiAJdHJpc3RhdGUgIlRlc3RpbmcgbW9kdWxlIgotCWRlcGVuZHMgb24gQ1JZUFRPCisJZGVwZW5kcyBvbiBDUllQVE8gJiYgbQogCWhlbHAKIAkgIFF1aWNrICYgZGlydHkgY3J5cHRvIHRlc3QgbW9kdWxlLgogCmRpZmYgLS1naXQgYS9jcnlwdG8vYWVzLmMgYi9jcnlwdG8vYWVzLmMKaW5kZXggYTUwMTcyOS4uYTAzODcxMSAxMDA2NDQKLS0tIGEvY3J5cHRvL2Flcy5jCisrKyBiL2NyeXB0by9hZXMuYwpAQCAtMjQ4LDEwICsyNDgsMTAgQEAKICAgICB0IF49IEVfS0VZWzggKiBpICsgN107IEVfS0VZWzggKiBpICsgMTVdID0gdDsgICBcCiB9CiAKLXN0YXRpYyBpbnQKLWFlc19zZXRfa2V5KHZvaWQgKmN0eF9hcmcsIGNvbnN0IHU4ICppbl9rZXksIHVuc2lnbmVkIGludCBrZXlfbGVuLCB1MzIgKmZsYWdzKQorc3RhdGljIGludCBhZXNfc2V0X2tleShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCBjb25zdCB1OCAqaW5fa2V5LAorCQkgICAgICAgdW5zaWduZWQgaW50IGtleV9sZW4sIHUzMiAqZmxhZ3MpCiB7Ci0Jc3RydWN0IGFlc19jdHggKmN0eCA9IGN0eF9hcmc7CisJc3RydWN0IGFlc19jdHggKmN0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7CiAJY29uc3QgX19sZTMyICprZXkgPSAoY29uc3QgX19sZTMyICopaW5fa2V5OwogCXUzMiBpLCB0LCB1LCB2LCB3OwogCkBAIC0zMTgsOSArMzE4LDkgQEAKICAgICBmX3JsKGJvLCBiaSwgMiwgayk7ICAgICBcCiAgICAgZl9ybChibywgYmksIDMsIGspCiAKLXN0YXRpYyB2b2lkIGFlc19lbmNyeXB0KHZvaWQgKmN0eF9hcmcsIHU4ICpvdXQsIGNvbnN0IHU4ICppbikKK3N0YXRpYyB2b2lkIGFlc19lbmNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpvdXQsIGNvbnN0IHU4ICppbikKIHsKLQljb25zdCBzdHJ1Y3QgYWVzX2N0eCAqY3R4ID0gY3R4X2FyZzsKKwljb25zdCBzdHJ1Y3QgYWVzX2N0eCAqY3R4ID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKIAljb25zdCBfX2xlMzIgKnNyYyA9IChjb25zdCBfX2xlMzIgKilpbjsKIAlfX2xlMzIgKmRzdCA9IChfX2xlMzIgKilvdXQ7CiAJdTMyIGIwWzRdLCBiMVs0XTsKQEAgLTM3Myw5ICszNzMsOSBAQAogICAgIGlfcmwoYm8sIGJpLCAyLCBrKTsgICAgIFwKICAgICBpX3JsKGJvLCBiaSwgMywgaykKIAotc3RhdGljIHZvaWQgYWVzX2RlY3J5cHQodm9pZCAqY3R4X2FyZywgdTggKm91dCwgY29uc3QgdTggKmluKQorc3RhdGljIHZvaWQgYWVzX2RlY3J5cHQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKm91dCwgY29uc3QgdTggKmluKQogewotCWNvbnN0IHN0cnVjdCBhZXNfY3R4ICpjdHggPSBjdHhfYXJnOworCWNvbnN0IHN0cnVjdCBhZXNfY3R4ICpjdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOwogCWNvbnN0IF9fbGUzMiAqc3JjID0gKGNvbnN0IF9fbGUzMiAqKWluOwogCV9fbGUzMiAqZHN0ID0gKF9fbGUzMiAqKW91dDsKIAl1MzIgYjBbNF0sIGIxWzRdOwpkaWZmIC0tZ2l0IGEvY3J5cHRvL2FudWJpcy5jIGIvY3J5cHRvL2FudWJpcy5jCmluZGV4IDJjNzk2YmQuLjdlMmUxYTIgMTAwNjQ0Ci0tLSBhL2NyeXB0by9hbnViaXMuYworKysgYi9jcnlwdG8vYW51YmlzLmMKQEAgLTQ2MCwxNiArNDYwLDE1IEBACiAJMHhmNzI2ZmZlZFUsIDB4ZTg5ZDZmOGVVLCAweDE5YTBmMDg5VSwKIH07CiAKLXN0YXRpYyBpbnQgYW51YmlzX3NldGtleSh2b2lkICpjdHhfYXJnLCBjb25zdCB1OCAqaW5fa2V5LAorc3RhdGljIGludCBhbnViaXNfc2V0a2V5KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIGNvbnN0IHU4ICppbl9rZXksCiAJCQkgdW5zaWduZWQgaW50IGtleV9sZW4sIHUzMiAqZmxhZ3MpCiB7CisJc3RydWN0IGFudWJpc19jdHggKmN0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7CiAJY29uc3QgX19iZTMyICprZXkgPSAoY29uc3QgX19iZTMyICopaW5fa2V5OwogCWludCBOLCBSLCBpLCByOwogCXUzMiBrYXBwYVtBTlVCSVNfTUFYX05dOwogCXUzMiBpbnRlcltBTlVCSVNfTUFYX05dOwogCi0Jc3RydWN0IGFudWJpc19jdHggKmN0eCA9IGN0eF9hcmc7Ci0KIAlzd2l0Y2ggKGtleV9sZW4pCiAJewogCQljYXNlIDE2OiBjYXNlIDIwOiBjYXNlIDI0OiBjYXNlIDI4OgpAQCAtNjYwLDE1ICs2NTksMTUgQEAKIAkJZHN0W2ldID0gY3B1X3RvX2JlMzIoaW50ZXJbaV0pOwogfQogCi1zdGF0aWMgdm9pZCBhbnViaXNfZW5jcnlwdCh2b2lkICpjdHhfYXJnLCB1OCAqZHN0LCBjb25zdCB1OCAqc3JjKQorc3RhdGljIHZvaWQgYW51YmlzX2VuY3J5cHQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKmRzdCwgY29uc3QgdTggKnNyYykKIHsKLQlzdHJ1Y3QgYW51YmlzX2N0eCAqY3R4ID0gY3R4X2FyZzsKKwlzdHJ1Y3QgYW51YmlzX2N0eCAqY3R4ID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKIAlhbnViaXNfY3J5cHQoY3R4LT5FLCBkc3QsIHNyYywgY3R4LT5SKTsKIH0KIAotc3RhdGljIHZvaWQgYW51YmlzX2RlY3J5cHQodm9pZCAqY3R4X2FyZywgdTggKmRzdCwgY29uc3QgdTggKnNyYykKK3N0YXRpYyB2b2lkIGFudWJpc19kZWNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpCiB7Ci0Jc3RydWN0IGFudWJpc19jdHggKmN0eCA9IGN0eF9hcmc7CisJc3RydWN0IGFudWJpc19jdHggKmN0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7CiAJYW51YmlzX2NyeXB0KGN0eC0+RCwgZHN0LCBzcmMsIGN0eC0+Uik7CiB9CiAKZGlmZiAtLWdpdCBhL2NyeXB0by9hcGkuYyBiL2NyeXB0by9hcGkuYwppbmRleCA4MGJiYTYzLi5jMTFlYzFmIDEwMDY0NAotLS0gYS9jcnlwdG8vYXBpLmMKKysrIGIvY3J5cHRvL2FwaS5jCkBAIC0xODgsMTMgKzE4OCwxNiBAQAogCWlmIChjcnlwdG9faW5pdF9mbGFncyh0Zm0sIGZsYWdzKSkKIAkJZ290byBvdXRfZnJlZV90Zm07CiAJCQotCWlmIChjcnlwdG9faW5pdF9vcHModGZtKSkgewotCQljcnlwdG9fZXhpdF9vcHModGZtKTsKKwlpZiAoY3J5cHRvX2luaXRfb3BzKHRmbSkpCiAJCWdvdG8gb3V0X2ZyZWVfdGZtOwotCX0KKworCWlmIChhbGctPmNyYV9pbml0ICYmIGFsZy0+Y3JhX2luaXQodGZtKSkKKwkJZ290byBjcmFfaW5pdF9mYWlsZWQ7CiAKIAlnb3RvIG91dDsKIAorY3JhX2luaXRfZmFpbGVkOgorCWNyeXB0b19leGl0X29wcyh0Zm0pOwogb3V0X2ZyZWVfdGZtOgogCWtmcmVlKHRmbSk7CiAJdGZtID0gTlVMTDsKQEAgLTIxNSw2ICsyMTgsOCBAQAogCWFsZyA9IHRmbS0+X19jcnRfYWxnOwogCXNpemUgPSBzaXplb2YoKnRmbSkgKyBhbGctPmNyYV9jdHhzaXplOwogCisJaWYgKGFsZy0+Y3JhX2V4aXQpCisJCWFsZy0+Y3JhX2V4aXQodGZtKTsKIAljcnlwdG9fZXhpdF9vcHModGZtKTsKIAljcnlwdG9fYWxnX3B1dChhbGcpOwogCW1lbXNldCh0Zm0sIDAsIHNpemUpOwpAQCAtMjI0LDcgKzIyOSw3IEBACiBzdGF0aWMgaW5saW5lIGludCBjcnlwdG9fc2V0X2RyaXZlcl9uYW1lKHN0cnVjdCBjcnlwdG9fYWxnICphbGcpCiB7CiAJc3RhdGljIGNvbnN0IGNoYXIgc3VmZml4W10gPSAiLWdlbmVyaWMiOwotCWNoYXIgKmRyaXZlcl9uYW1lID0gKGNoYXIgKilhbGctPmNyYV9kcml2ZXJfbmFtZTsKKwljaGFyICpkcml2ZXJfbmFtZSA9IGFsZy0+Y3JhX2RyaXZlcl9uYW1lOwogCWludCBsZW47CiAKIAlpZiAoKmRyaXZlcl9uYW1lKQpAQCAtMjYyLDEzICsyNjcsMTMgQEAKIAlkb3duX3dyaXRlKCZjcnlwdG9fYWxnX3NlbSk7CiAJCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShxLCAmY3J5cHRvX2FsZ19saXN0LCBjcmFfbGlzdCkgewotCQlpZiAoIXN0cmNtcChxLT5jcmFfZHJpdmVyX25hbWUsIGFsZy0+Y3JhX2RyaXZlcl9uYW1lKSkgeworCQlpZiAocSA9PSBhbGcpIHsKIAkJCXJldCA9IC1FRVhJU1Q7CiAJCQlnb3RvIG91dDsKIAkJfQogCX0KIAkKLQlsaXN0X2FkZF90YWlsKCZhbGctPmNyYV9saXN0LCAmY3J5cHRvX2FsZ19saXN0KTsKKwlsaXN0X2FkZCgmYWxnLT5jcmFfbGlzdCwgJmNyeXB0b19hbGdfbGlzdCk7CiBvdXQ6CQogCXVwX3dyaXRlKCZjcnlwdG9fYWxnX3NlbSk7CiAJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2NyeXB0by9hcmM0LmMgYi9jcnlwdG8vYXJjNC5jCmluZGV4IDllZmJjYWEuLjVlZGM2YTYgMTAwNjQ0Ci0tLSBhL2NyeXB0by9hcmM0LmMKKysrIGIvY3J5cHRvL2FyYzQuYwpAQCAtMjQsOSArMjQsMTAgQEAKIAl1OCB4LCB5OwogfTsKIAotc3RhdGljIGludCBhcmM0X3NldF9rZXkodm9pZCAqY3R4X2FyZywgY29uc3QgdTggKmluX2tleSwgdW5zaWduZWQgaW50IGtleV9sZW4sIHUzMiAqZmxhZ3MpCitzdGF0aWMgaW50IGFyYzRfc2V0X2tleShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCBjb25zdCB1OCAqaW5fa2V5LAorCQkJdW5zaWduZWQgaW50IGtleV9sZW4sIHUzMiAqZmxhZ3MpCiB7Ci0Jc3RydWN0IGFyYzRfY3R4ICpjdHggPSBjdHhfYXJnOworCXN0cnVjdCBhcmM0X2N0eCAqY3R4ID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKIAlpbnQgaSwgaiA9IDAsIGsgPSAwOwogCiAJY3R4LT54ID0gMTsKQEAgLTQ4LDkgKzQ5LDkgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgYXJjNF9jcnlwdCh2b2lkICpjdHhfYXJnLCB1OCAqb3V0LCBjb25zdCB1OCAqaW4pCitzdGF0aWMgdm9pZCBhcmM0X2NyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpvdXQsIGNvbnN0IHU4ICppbikKIHsKLQlzdHJ1Y3QgYXJjNF9jdHggKmN0eCA9IGN0eF9hcmc7CisJc3RydWN0IGFyYzRfY3R4ICpjdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOwogCiAJdTggKmNvbnN0IFMgPSBjdHgtPlM7CiAJdTggeCA9IGN0eC0+eDsKZGlmZiAtLWdpdCBhL2NyeXB0by9ibG93ZmlzaC5jIGIvY3J5cHRvL2Jsb3dmaXNoLmMKaW5kZXggN2Y3MTBiMi4uNDkwMjY1ZiAxMDA2NDQKLS0tIGEvY3J5cHRvL2Jsb3dmaXNoLmMKKysrIGIvY3J5cHRvL2Jsb3dmaXNoLmMKQEAgLTM0OSw3ICszNDksNyBAQAogCWRzdFsxXSA9IHlsOwogfQogCi1zdGF0aWMgdm9pZCBiZl9lbmNyeXB0KHZvaWQgKmN0eCwgdTggKmRzdCwgY29uc3QgdTggKnNyYykKK3N0YXRpYyB2b2lkIGJmX2VuY3J5cHQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKmRzdCwgY29uc3QgdTggKnNyYykKIHsKIAljb25zdCBfX2JlMzIgKmluX2JsayA9IChjb25zdCBfX2JlMzIgKilzcmM7CiAJX19iZTMyICpjb25zdCBvdXRfYmxrID0gKF9fYmUzMiAqKWRzdDsKQEAgLTM1NywxNyArMzU3LDE4IEBACiAKIAlpbjMyWzBdID0gYmUzMl90b19jcHUoaW5fYmxrWzBdKTsKIAlpbjMyWzFdID0gYmUzMl90b19jcHUoaW5fYmxrWzFdKTsKLQllbmNyeXB0X2Jsb2NrKGN0eCwgb3V0MzIsIGluMzIpOworCWVuY3J5cHRfYmxvY2soY3J5cHRvX3RmbV9jdHgodGZtKSwgb3V0MzIsIGluMzIpOwogCW91dF9ibGtbMF0gPSBjcHVfdG9fYmUzMihvdXQzMlswXSk7CiAJb3V0X2Jsa1sxXSA9IGNwdV90b19iZTMyKG91dDMyWzFdKTsKIH0KIAotc3RhdGljIHZvaWQgYmZfZGVjcnlwdCh2b2lkICpjdHgsIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpCitzdGF0aWMgdm9pZCBiZl9kZWNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpCiB7CisJc3RydWN0IGJmX2N0eCAqY3R4ID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKIAljb25zdCBfX2JlMzIgKmluX2JsayA9IChjb25zdCBfX2JlMzIgKilzcmM7CiAJX19iZTMyICpjb25zdCBvdXRfYmxrID0gKF9fYmUzMiAqKWRzdDsKLQljb25zdCB1MzIgKlAgPSAoKHN0cnVjdCBiZl9jdHggKiljdHgpLT5wOwotCWNvbnN0IHUzMiAqUyA9ICgoc3RydWN0IGJmX2N0eCAqKWN0eCktPnM7CisJY29uc3QgdTMyICpQID0gY3R4LT5wOworCWNvbnN0IHUzMiAqUyA9IGN0eC0+czsKIAl1MzIgeWwgPSBiZTMyX3RvX2NwdShpbl9ibGtbMF0pOwogCXUzMiB5ciA9IGJlMzJfdG9fY3B1KGluX2Jsa1sxXSk7CiAKQEAgLTM5OCwxMiArMzk5LDE0IEBACiAvKiAKICAqIENhbGN1bGF0ZXMgdGhlIGJsb3dmaXNoIFMgYW5kIFAgYm94ZXMgZm9yIGVuY3J5cHRpb24gYW5kIGRlY3J5cHRpb24uCiAgKi8KLXN0YXRpYyBpbnQgYmZfc2V0a2V5KHZvaWQgKmN0eCwgY29uc3QgdTggKmtleSwgdW5zaWduZWQgaW50IGtleWxlbiwgdTMyICpmbGFncykKK3N0YXRpYyBpbnQgYmZfc2V0a2V5KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIGNvbnN0IHU4ICprZXksCisJCSAgICAgdW5zaWduZWQgaW50IGtleWxlbiwgdTMyICpmbGFncykKIHsKKwlzdHJ1Y3QgYmZfY3R4ICpjdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOworCXUzMiAqUCA9IGN0eC0+cDsKKwl1MzIgKlMgPSBjdHgtPnM7CiAJc2hvcnQgaSwgaiwgY291bnQ7CiAJdTMyIGRhdGFbMl0sIHRlbXA7Ci0JdTMyICpQID0gKChzdHJ1Y3QgYmZfY3R4ICopY3R4KS0+cDsKLQl1MzIgKlMgPSAoKHN0cnVjdCBiZl9jdHggKiljdHgpLT5zOwogCiAJLyogQ29weSB0aGUgaW5pdGlhbGl6YXRpb24gcy1ib3hlcyAqLwogCWZvciAoaSA9IDAsIGNvdW50ID0gMDsgaSA8IDI1NjsgaSsrKQpkaWZmIC0tZ2l0IGEvY3J5cHRvL2Nhc3Q1LmMgYi9jcnlwdG8vY2FzdDUuYwppbmRleCA4ODM0Yzg1Li4wOGVlZjU4IDEwMDY0NAotLS0gYS9jcnlwdG8vY2FzdDUuYworKysgYi9jcnlwdG8vY2FzdDUuYwpAQCAtNTc3LDkgKzU3Nyw5IEBACiAgICAgKCgoczFbSSA+PiAyNF0gKyBzMlsoST4+MTYpJjB4ZmZdKSBeIHMzWyhJPj44KSYweGZmXSkgLSBzNFtJJjB4ZmZdKSApCiAKIAotc3RhdGljIHZvaWQgY2FzdDVfZW5jcnlwdCh2b2lkICpjdHgsIHU4ICogb3V0YnVmLCBjb25zdCB1OCAqIGluYnVmKQorc3RhdGljIHZvaWQgY2FzdDVfZW5jcnlwdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqb3V0YnVmLCBjb25zdCB1OCAqaW5idWYpCiB7Ci0Jc3RydWN0IGNhc3Q1X2N0eCAqYyA9IChzdHJ1Y3QgY2FzdDVfY3R4ICopIGN0eDsKKwlzdHJ1Y3QgY2FzdDVfY3R4ICpjID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKIAljb25zdCBfX2JlMzIgKnNyYyA9IChjb25zdCBfX2JlMzIgKilpbmJ1ZjsKIAlfX2JlMzIgKmRzdCA9IChfX2JlMzIgKilvdXRidWY7CiAJdTMyIGwsIHIsIHQ7CkBAIC02NDIsOSArNjQyLDkgQEAKIAlkc3RbMV0gPSBjcHVfdG9fYmUzMihsKTsKIH0KIAotc3RhdGljIHZvaWQgY2FzdDVfZGVjcnlwdCh2b2lkICpjdHgsIHU4ICogb3V0YnVmLCBjb25zdCB1OCAqIGluYnVmKQorc3RhdGljIHZvaWQgY2FzdDVfZGVjcnlwdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqb3V0YnVmLCBjb25zdCB1OCAqaW5idWYpCiB7Ci0Jc3RydWN0IGNhc3Q1X2N0eCAqYyA9IChzdHJ1Y3QgY2FzdDVfY3R4ICopIGN0eDsKKwlzdHJ1Y3QgY2FzdDVfY3R4ICpjID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKIAljb25zdCBfX2JlMzIgKnNyYyA9IChjb25zdCBfX2JlMzIgKilpbmJ1ZjsKIAlfX2JlMzIgKmRzdCA9IChfX2JlMzIgKilvdXRidWY7CiAJdTMyIGwsIHIsIHQ7CkBAIC03NjksMTUgKzc2OSwxNSBAQAogfQogCiAKLXN0YXRpYyBpbnQKLWNhc3Q1X3NldGtleSh2b2lkICpjdHgsIGNvbnN0IHU4ICoga2V5LCB1bnNpZ25lZCBrZXlfbGVuLCB1MzIgKiBmbGFncykKK3N0YXRpYyBpbnQgY2FzdDVfc2V0a2V5KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIGNvbnN0IHU4ICprZXksCisJCQl1bnNpZ25lZCBrZXlfbGVuLCB1MzIgKmZsYWdzKQogeworCXN0cnVjdCBjYXN0NV9jdHggKmMgPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOwogCWludCBpOwogCXUzMiB4WzRdOwogCXUzMiB6WzRdOwogCXUzMiBrWzE2XTsKIAlfX2JlMzIgcF9rZXlbNF07Ci0Jc3RydWN0IGNhc3Q1X2N0eCAqYyA9IChzdHJ1Y3QgY2FzdDVfY3R4ICopIGN0eDsKIAkKIAlpZiAoa2V5X2xlbiA8IDUgfHwga2V5X2xlbiA+IDE2KSB7CiAJCSpmbGFncyB8PSBDUllQVE9fVEZNX1JFU19CQURfS0VZX0xFTjsKZGlmZiAtLWdpdCBhL2NyeXB0by9jYXN0Ni5jIGIvY3J5cHRvL2Nhc3Q2LmMKaW5kZXggOWUyODc0MC4uMDhlMzNiZiAxMDA2NDQKLS0tIGEvY3J5cHRvL2Nhc3Q2LmMKKysrIGIvY3J5cHRvL2Nhc3Q2LmMKQEAgLTM4MSwxMyArMzgxLDEzIEBACiAJa2V5WzddIF49IEYyKGtleVswXSwgVHJbaSAlIDRdWzddLCBUbVtpXVs3XSk7CiB9CiAKLXN0YXRpYyBpbnQKLWNhc3Q2X3NldGtleSh2b2lkICpjdHgsIGNvbnN0IHU4ICogaW5fa2V5LCB1bnNpZ25lZCBrZXlfbGVuLCB1MzIgKiBmbGFncykKK3N0YXRpYyBpbnQgY2FzdDZfc2V0a2V5KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIGNvbnN0IHU4ICppbl9rZXksCisJCQl1bnNpZ25lZCBrZXlfbGVuLCB1MzIgKmZsYWdzKQogewogCWludCBpOwogCXUzMiBrZXlbOF07CiAJX19iZTMyIHBfa2V5WzhdOyAvKiBwYWRkZWQga2V5ICovCi0Jc3RydWN0IGNhc3Q2X2N0eCAqYyA9IChzdHJ1Y3QgY2FzdDZfY3R4ICopIGN0eDsKKwlzdHJ1Y3QgY2FzdDZfY3R4ICpjID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKIAogCWlmIChrZXlfbGVuIDwgMTYgfHwga2V5X2xlbiA+IDMyIHx8IGtleV9sZW4gJSA0ICE9IDApIHsKIAkJKmZsYWdzIHw9IENSWVBUT19URk1fUkVTX0JBRF9LRVlfTEVOOwpAQCAtNDQ0LDggKzQ0NCw5IEBACiAgICAgICAgIGJsb2NrWzJdIF49IEYxKGJsb2NrWzNdLCBLclswXSwgS21bMF0pOwogfQogCi1zdGF0aWMgdm9pZCBjYXN0Nl9lbmNyeXB0ICh2b2lkICogY3R4LCB1OCAqIG91dGJ1ZiwgY29uc3QgdTggKiBpbmJ1ZikgewotCXN0cnVjdCBjYXN0Nl9jdHggKiBjID0gKHN0cnVjdCBjYXN0Nl9jdHggKiljdHg7CitzdGF0aWMgdm9pZCBjYXN0Nl9lbmNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpvdXRidWYsIGNvbnN0IHU4ICppbmJ1ZikKK3sKKwlzdHJ1Y3QgY2FzdDZfY3R4ICpjID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKIAljb25zdCBfX2JlMzIgKnNyYyA9IChjb25zdCBfX2JlMzIgKilpbmJ1ZjsKIAlfX2JlMzIgKmRzdCA9IChfX2JlMzIgKilvdXRidWY7CiAJdTMyIGJsb2NrWzRdOwpAQCAtNDc2LDggKzQ3Nyw4IEBACiAJZHN0WzNdID0gY3B1X3RvX2JlMzIoYmxvY2tbM10pOwogfQkKIAotc3RhdGljIHZvaWQgY2FzdDZfZGVjcnlwdCAodm9pZCAqIGN0eCwgdTggKiBvdXRidWYsIGNvbnN0IHU4ICogaW5idWYpIHsKLQlzdHJ1Y3QgY2FzdDZfY3R4ICogYyA9IChzdHJ1Y3QgY2FzdDZfY3R4ICopY3R4Oworc3RhdGljIHZvaWQgY2FzdDZfZGVjcnlwdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqb3V0YnVmLCBjb25zdCB1OCAqaW5idWYpIHsKKwlzdHJ1Y3QgY2FzdDZfY3R4ICogYyA9IGNyeXB0b190Zm1fY3R4KHRmbSk7CiAJY29uc3QgX19iZTMyICpzcmMgPSAoY29uc3QgX19iZTMyICopaW5idWY7CiAJX19iZTMyICpkc3QgPSAoX19iZTMyICopb3V0YnVmOwogCXUzMiBibG9ja1s0XTsKZGlmZiAtLWdpdCBhL2NyeXB0by9jaXBoZXIuYyBiL2NyeXB0by9jaXBoZXIuYwppbmRleCA2NWJjZWEwLi5iODk5ZWI5IDEwMDY0NAotLS0gYS9jcnlwdG8vY2lwaGVyLmMKKysrIGIvY3J5cHRvL2NpcGhlci5jCkBAIC0xODcsNyArMTg3LDcgQEAKIAl2b2lkICgqeG9yKSh1OCAqLCBjb25zdCB1OCAqKSA9IHRmbS0+Y3J0X3UuY2lwaGVyLmNpdF94b3JfYmxvY2s7CiAJaW50IGJzaXplID0gY3J5cHRvX3RmbV9hbGdfYmxvY2tzaXplKHRmbSk7CiAKLQl2b2lkICgqZm4pKHZvaWQgKiwgdTggKiwgY29uc3QgdTggKikgPSBkZXNjLT5jcmZuOworCXZvaWQgKCpmbikoc3RydWN0IGNyeXB0b190Zm0gKiwgdTggKiwgY29uc3QgdTggKikgPSBkZXNjLT5jcmZuOwogCXU4ICppdiA9IGRlc2MtPmluZm87CiAJdW5zaWduZWQgaW50IGRvbmUgPSAwOwogCkBAIC0xOTUsNyArMTk1LDcgQEAKIAogCWRvIHsKIAkJeG9yKGl2LCBzcmMpOwotCQlmbihjcnlwdG9fdGZtX2N0eCh0Zm0pLCBkc3QsIGl2KTsKKwkJZm4odGZtLCBkc3QsIGl2KTsKIAkJbWVtY3B5KGl2LCBkc3QsIGJzaXplKTsKIAogCQlzcmMgKz0gYnNpemU7CkBAIC0yMTgsNyArMjE4LDcgQEAKIAl1OCAqYnVmID0gKHU4ICopQUxJR04oKHVuc2lnbmVkIGxvbmcpc3RhY2ssIGFsaWdubWFzayArIDEpOwogCXU4ICoqZHN0X3AgPSBzcmMgPT0gZHN0ID8gJmJ1ZiA6ICZkc3Q7CiAKLQl2b2lkICgqZm4pKHZvaWQgKiwgdTggKiwgY29uc3QgdTggKikgPSBkZXNjLT5jcmZuOworCXZvaWQgKCpmbikoc3RydWN0IGNyeXB0b190Zm0gKiwgdTggKiwgY29uc3QgdTggKikgPSBkZXNjLT5jcmZuOwogCXU4ICppdiA9IGRlc2MtPmluZm87CiAJdW5zaWduZWQgaW50IGRvbmUgPSAwOwogCkBAIC0yMjcsNyArMjI3LDcgQEAKIAlkbyB7CiAJCXU4ICp0bXBfZHN0ID0gKmRzdF9wOwogCi0JCWZuKGNyeXB0b190Zm1fY3R4KHRmbSksIHRtcF9kc3QsIHNyYyk7CisJCWZuKHRmbSwgdG1wX2RzdCwgc3JjKTsKIAkJeG9yKHRtcF9kc3QsIGl2KTsKIAkJbWVtY3B5KGl2LCBzcmMsIGJzaXplKTsKIAkJaWYgKHRtcF9kc3QgIT0gZHN0KQpAQCAtMjQ1LDEzICsyNDUsMTMgQEAKIHsKIAlzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtID0gZGVzYy0+dGZtOwogCWludCBic2l6ZSA9IGNyeXB0b190Zm1fYWxnX2Jsb2Nrc2l6ZSh0Zm0pOwotCXZvaWQgKCpmbikodm9pZCAqLCB1OCAqLCBjb25zdCB1OCAqKSA9IGRlc2MtPmNyZm47CisJdm9pZCAoKmZuKShzdHJ1Y3QgY3J5cHRvX3RmbSAqLCB1OCAqLCBjb25zdCB1OCAqKSA9IGRlc2MtPmNyZm47CiAJdW5zaWduZWQgaW50IGRvbmUgPSAwOwogCiAJbmJ5dGVzIC09IGJzaXplOwogCiAJZG8gewotCQlmbihjcnlwdG9fdGZtX2N0eCh0Zm0pLCBkc3QsIHNyYyk7CisJCWZuKHRmbSwgZHN0LCBzcmMpOwogCiAJCXNyYyArPSBic2l6ZTsKIAkJZHN0ICs9IGJzaXplOwpAQCAtMjY4LDcgKzI2OCw3IEBACiAJCXRmbS0+Y3J0X2ZsYWdzIHw9IENSWVBUT19URk1fUkVTX0JBRF9LRVlfTEVOOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9IGVsc2UKLQkJcmV0dXJuIGNpYS0+Y2lhX3NldGtleShjcnlwdG9fdGZtX2N0eCh0Zm0pLCBrZXksIGtleWxlbiwKKwkJcmV0dXJuIGNpYS0+Y2lhX3NldGtleSh0Zm0sIGtleSwga2V5bGVuLAogCQkgICAgICAgICAgICAgICAgICAgICAgICZ0Zm0tPmNydF9mbGFncyk7CiB9CiAKZGlmZiAtLWdpdCBhL2NyeXB0by9jb21wcmVzcy5jIGIvY3J5cHRvL2NvbXByZXNzLmMKaW5kZXggZWIzNmQ5My4uZWNhMTgyYSAxMDA2NDQKLS0tIGEvY3J5cHRvL2NvbXByZXNzLmMKKysrIGIvY3J5cHRvL2NvbXByZXNzLmMKQEAgLTIyLDggKzIyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1OCAqc3JjLCB1bnNpZ25lZCBpbnQgc2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OCAqZHN0LCB1bnNpZ25lZCBpbnQgKmRsZW4pCiB7Ci0JcmV0dXJuIHRmbS0+X19jcnRfYWxnLT5jcmFfY29tcHJlc3MuY29hX2NvbXByZXNzKGNyeXB0b190Zm1fY3R4KHRmbSksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYywgc2xlbiwgZHN0LAorCXJldHVybiB0Zm0tPl9fY3J0X2FsZy0+Y3JhX2NvbXByZXNzLmNvYV9jb21wcmVzcyh0Zm0sIHNyYywgc2xlbiwgZHN0LAogCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbGVuKTsKIH0KIApAQCAtMzEsOCArMzAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1OCAqc3JjLCB1bnNpZ25lZCBpbnQgc2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTggKmRzdCwgdW5zaWduZWQgaW50ICpkbGVuKQogewotCXJldHVybiB0Zm0tPl9fY3J0X2FsZy0+Y3JhX2NvbXByZXNzLmNvYV9kZWNvbXByZXNzKGNyeXB0b190Zm1fY3R4KHRmbSksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLCBzbGVuLCBkc3QsCisJcmV0dXJuIHRmbS0+X19jcnRfYWxnLT5jcmFfY29tcHJlc3MuY29hX2RlY29tcHJlc3ModGZtLCBzcmMsIHNsZW4sIGRzdCwKIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbGVuKTsKIH0KIApAQCAtNDMsMjEgKzQxLDE0IEBACiAKIGludCBjcnlwdG9faW5pdF9jb21wcmVzc19vcHMoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKIHsKLQlpbnQgcmV0ID0gMDsKIAlzdHJ1Y3QgY29tcHJlc3NfdGZtICpvcHMgPSAmdGZtLT5jcnRfY29tcHJlc3M7Ci0JCi0JcmV0ID0gdGZtLT5fX2NydF9hbGctPmNyYV9jb21wcmVzcy5jb2FfaW5pdChjcnlwdG9fdGZtX2N0eCh0Zm0pKTsKLQlpZiAocmV0KQotCQlnb3RvIG91dDsKIAogCW9wcy0+Y290X2NvbXByZXNzID0gY3J5cHRvX2NvbXByZXNzOwogCW9wcy0+Y290X2RlY29tcHJlc3MgPSBjcnlwdG9fZGVjb21wcmVzczsKIAkKLW91dDoKLQlyZXR1cm4gcmV0OworCXJldHVybiAwOwogfQogCiB2b2lkIGNyeXB0b19leGl0X2NvbXByZXNzX29wcyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQogewotCXRmbS0+X19jcnRfYWxnLT5jcmFfY29tcHJlc3MuY29hX2V4aXQoY3J5cHRvX3RmbV9jdHgodGZtKSk7CiB9CmRpZmYgLS1naXQgYS9jcnlwdG8vY3JjMzJjLmMgYi9jcnlwdG8vY3JjMzJjLmMKaW5kZXggOTUzMzYyNC4uZjI2NjAxMiAxMDA2NDQKLS0tIGEvY3J5cHRvL2NyYzMyYy5jCisrKyBiL2NyeXB0by9jcmMzMmMuYwpAQCAtMzEsOSArMzEsOSBAQAogICogY3JjIHVzaW5nIHRhYmxlLgogICovCiAKLXN0YXRpYyB2b2lkIGNoa3N1bV9pbml0KHZvaWQgKmN0eCkKK3N0YXRpYyB2b2lkIGNoa3N1bV9pbml0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCiB7Ci0Jc3RydWN0IGNoa3N1bV9jdHggKm1jdHggPSBjdHg7CisJc3RydWN0IGNoa3N1bV9jdHggKm1jdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOwogCiAJbWN0eC0+Y3JjID0gfih1MzIpMDsJCQkvKiBjb21tb24gdXNhZ2UgKi8KIH0KQEAgLTQzLDEwICs0MywxMCBAQAogICogSWYgeW91ciBhbGdvcml0aG0gc3RhcnRzIHdpdGggfjAsIHRoZW4gWE9SIHdpdGggfjAgYmVmb3JlIHlvdSBzZXQKICAqIHRoZSBzZWVkLgogICovCi1zdGF0aWMgaW50IGNoa3N1bV9zZXRrZXkodm9pZCAqY3R4LCBjb25zdCB1OCAqa2V5LCB1bnNpZ25lZCBpbnQga2V5bGVuLAotCSAgICAgICAgICAgICAgICAgIHUzMiAqZmxhZ3MpCitzdGF0aWMgaW50IGNoa3N1bV9zZXRrZXkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgY29uc3QgdTggKmtleSwKKwkJCSB1bnNpZ25lZCBpbnQga2V5bGVuLCB1MzIgKmZsYWdzKQogewotCXN0cnVjdCBjaGtzdW1fY3R4ICptY3R4ID0gY3R4OworCXN0cnVjdCBjaGtzdW1fY3R4ICptY3R4ID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKIAogCWlmIChrZXlsZW4gIT0gc2l6ZW9mKG1jdHgtPmNyYykpIHsKIAkJaWYgKGZsYWdzKQpAQCAtNTcsOSArNTcsMTAgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgY2hrc3VtX3VwZGF0ZSh2b2lkICpjdHgsIGNvbnN0IHU4ICpkYXRhLCB1bnNpZ25lZCBpbnQgbGVuZ3RoKQorc3RhdGljIHZvaWQgY2hrc3VtX3VwZGF0ZShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCBjb25zdCB1OCAqZGF0YSwKKwkJCSAgdW5zaWduZWQgaW50IGxlbmd0aCkKIHsKLQlzdHJ1Y3QgY2hrc3VtX2N0eCAqbWN0eCA9IGN0eDsKKwlzdHJ1Y3QgY2hrc3VtX2N0eCAqbWN0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7CiAJdTMyIG1jcmM7CiAKIAltY3JjID0gY3JjMzJjKG1jdHgtPmNyYywgZGF0YSwgKHNpemVfdClsZW5ndGgpOwpAQCAtNjcsOSArNjgsOSBAQAogCW1jdHgtPmNyYyA9IG1jcmM7CiB9CiAKLXN0YXRpYyB2b2lkIGNoa3N1bV9maW5hbCh2b2lkICpjdHgsIHU4ICpvdXQpCitzdGF0aWMgdm9pZCBjaGtzdW1fZmluYWwoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKm91dCkKIHsKLQlzdHJ1Y3QgY2hrc3VtX2N0eCAqbWN0eCA9IGN0eDsKKwlzdHJ1Y3QgY2hrc3VtX2N0eCAqbWN0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7CiAJdTMyIG1jcmMgPSAobWN0eC0+Y3JjIF4gfih1MzIpMCk7CiAJCiAJKih1MzIgKilvdXQgPSBfX2xlMzJfdG9fY3B1KG1jcmMpOwpkaWZmIC0tZ2l0IGEvY3J5cHRvL2NyeXB0b19udWxsLmMgYi9jcnlwdG8vY3J5cHRvX251bGwuYwppbmRleCAzZmNmNmU4Li5hMGQ5NTZiIDEwMDY0NAotLS0gYS9jcnlwdG8vY3J5cHRvX251bGwuYworKysgYi9jcnlwdG8vY3J5cHRvX251bGwuYwpAQCAtMjcsOCArMjcsOCBAQAogI2RlZmluZSBOVUxMX0JMT0NLX1NJWkUJCTEKICNkZWZpbmUgTlVMTF9ESUdFU1RfU0laRQkwCiAKLXN0YXRpYyBpbnQgbnVsbF9jb21wcmVzcyh2b2lkICpjdHgsIGNvbnN0IHU4ICpzcmMsIHVuc2lnbmVkIGludCBzbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgIHU4ICpkc3QsIHVuc2lnbmVkIGludCAqZGxlbikKK3N0YXRpYyBpbnQgbnVsbF9jb21wcmVzcyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCBjb25zdCB1OCAqc3JjLAorCQkJIHVuc2lnbmVkIGludCBzbGVuLCB1OCAqZHN0LCB1bnNpZ25lZCBpbnQgKmRsZW4pCiB7CiAJaWYgKHNsZW4gPiAqZGxlbikKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0zNywyMCArMzcsMjEgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgbnVsbF9pbml0KHZvaWQgKmN0eCkKK3N0YXRpYyB2b2lkIG51bGxfaW5pdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQogeyB9CiAKLXN0YXRpYyB2b2lkIG51bGxfdXBkYXRlKHZvaWQgKmN0eCwgY29uc3QgdTggKmRhdGEsIHVuc2lnbmVkIGludCBsZW4pCitzdGF0aWMgdm9pZCBudWxsX3VwZGF0ZShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCBjb25zdCB1OCAqZGF0YSwKKwkJCXVuc2lnbmVkIGludCBsZW4pCiB7IH0KIAotc3RhdGljIHZvaWQgbnVsbF9maW5hbCh2b2lkICpjdHgsIHU4ICpvdXQpCitzdGF0aWMgdm9pZCBudWxsX2ZpbmFsKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpvdXQpCiB7IH0KIAotc3RhdGljIGludCBudWxsX3NldGtleSh2b2lkICpjdHgsIGNvbnN0IHU4ICprZXksCi0gICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBrZXlsZW4sIHUzMiAqZmxhZ3MpCitzdGF0aWMgaW50IG51bGxfc2V0a2V5KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIGNvbnN0IHU4ICprZXksCisJCSAgICAgICB1bnNpZ25lZCBpbnQga2V5bGVuLCB1MzIgKmZsYWdzKQogeyByZXR1cm4gMDsgfQogCi1zdGF0aWMgdm9pZCBudWxsX2NyeXB0KHZvaWQgKmN0eCwgdTggKmRzdCwgY29uc3QgdTggKnNyYykKK3N0YXRpYyB2b2lkIG51bGxfY3J5cHQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKmRzdCwgY29uc3QgdTggKnNyYykKIHsKIAltZW1jcHkoZHN0LCBzcmMsIE5VTExfQkxPQ0tfU0laRSk7CiB9CmRpZmYgLS1naXQgYS9jcnlwdG8vZGVmbGF0ZS5jIGIvY3J5cHRvL2RlZmxhdGUuYwppbmRleCBmMjA5MzY4Li42NTg4YmJmIDEwMDY0NAotLS0gYS9jcnlwdG8vZGVmbGF0ZS5jCisrKyBiL2NyeXB0by9kZWZsYXRlLmMKQEAgLTEwMiw4ICsxMDIsOSBAQAogCWtmcmVlKGN0eC0+ZGVjb21wX3N0cmVhbS53b3Jrc3BhY2UpOwogfQogCi1zdGF0aWMgaW50IGRlZmxhdGVfaW5pdCh2b2lkICpjdHgpCitzdGF0aWMgaW50IGRlZmxhdGVfaW5pdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQogeworCXN0cnVjdCBkZWZsYXRlX2N0eCAqY3R4ID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKIAlpbnQgcmV0OwogCQogCXJldCA9IGRlZmxhdGVfY29tcF9pbml0KGN0eCk7CkBAIC0xMTYsMTcgKzExNywxOSBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIGRlZmxhdGVfZXhpdCh2b2lkICpjdHgpCitzdGF0aWMgdm9pZCBkZWZsYXRlX2V4aXQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKIHsKKwlzdHJ1Y3QgZGVmbGF0ZV9jdHggKmN0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7CisKIAlkZWZsYXRlX2NvbXBfZXhpdChjdHgpOwogCWRlZmxhdGVfZGVjb21wX2V4aXQoY3R4KTsKIH0KIAotc3RhdGljIGludCBkZWZsYXRlX2NvbXByZXNzKHZvaWQgKmN0eCwgY29uc3QgdTggKnNyYywgdW5zaWduZWQgaW50IHNsZW4sCi0JICAgICAgICAgICAgICAgICAgICB1OCAqZHN0LCB1bnNpZ25lZCBpbnQgKmRsZW4pCitzdGF0aWMgaW50IGRlZmxhdGVfY29tcHJlc3Moc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgY29uc3QgdTggKnNyYywKKwkJCSAgICB1bnNpZ25lZCBpbnQgc2xlbiwgdTggKmRzdCwgdW5zaWduZWQgaW50ICpkbGVuKQogewogCWludCByZXQgPSAwOwotCXN0cnVjdCBkZWZsYXRlX2N0eCAqZGN0eCA9IGN0eDsKKwlzdHJ1Y3QgZGVmbGF0ZV9jdHggKmRjdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOwogCXN0cnVjdCB6X3N0cmVhbV9zICpzdHJlYW0gPSAmZGN0eC0+Y29tcF9zdHJlYW07CiAKIAlyZXQgPSB6bGliX2RlZmxhdGVSZXNldChzdHJlYW0pOwpAQCAtMTUxLDEyICsxNTQsMTIgQEAKIAlyZXR1cm4gcmV0OwogfQogIAotc3RhdGljIGludCBkZWZsYXRlX2RlY29tcHJlc3Modm9pZCAqY3R4LCBjb25zdCB1OCAqc3JjLCB1bnNpZ25lZCBpbnQgc2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4ICpkc3QsIHVuc2lnbmVkIGludCAqZGxlbikKK3N0YXRpYyBpbnQgZGVmbGF0ZV9kZWNvbXByZXNzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIGNvbnN0IHU4ICpzcmMsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgc2xlbiwgdTggKmRzdCwgdW5zaWduZWQgaW50ICpkbGVuKQogewogCQogCWludCByZXQgPSAwOwotCXN0cnVjdCBkZWZsYXRlX2N0eCAqZGN0eCA9IGN0eDsKKwlzdHJ1Y3QgZGVmbGF0ZV9jdHggKmRjdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOwogCXN0cnVjdCB6X3N0cmVhbV9zICpzdHJlYW0gPSAmZGN0eC0+ZGVjb21wX3N0cmVhbTsKIAogCXJldCA9IHpsaWJfaW5mbGF0ZVJlc2V0KHN0cmVhbSk7CkBAIC0xOTgsOSArMjAxLDkgQEAKIAkuY3JhX2N0eHNpemUJCT0gc2l6ZW9mKHN0cnVjdCBkZWZsYXRlX2N0eCksCiAJLmNyYV9tb2R1bGUJCT0gVEhJU19NT0RVTEUsCiAJLmNyYV9saXN0CQk9IExJU1RfSEVBRF9JTklUKGFsZy5jcmFfbGlzdCksCisJLmNyYV9pbml0CQk9IGRlZmxhdGVfaW5pdCwKKwkuY3JhX2V4aXQJCT0gZGVmbGF0ZV9leGl0LAogCS5jcmFfdQkJCT0geyAuY29tcHJlc3MgPSB7Ci0JLmNvYV9pbml0CQk9IGRlZmxhdGVfaW5pdCwKLQkuY29hX2V4aXQJCT0gZGVmbGF0ZV9leGl0LAogCS5jb2FfY29tcHJlc3MgCQk9IGRlZmxhdGVfY29tcHJlc3MsCiAJLmNvYV9kZWNvbXByZXNzICAJPSBkZWZsYXRlX2RlY29tcHJlc3MgfSB9CiB9OwpkaWZmIC0tZ2l0IGEvY3J5cHRvL2Rlcy5jIGIvY3J5cHRvL2Rlcy5jCmluZGV4IDJkNzRjYWIuLmE5ZDNjMjMgMTAwNjQ0Ci0tLSBhL2NyeXB0by9kZXMuYworKysgYi9jcnlwdG8vZGVzLmMKQEAgLTc4Myw5ICs3ODMsMTAgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbnQgZGVzX3NldGtleSh2b2lkICpjdHgsIGNvbnN0IHU4ICprZXksIHVuc2lnbmVkIGludCBrZXlsZW4sIHUzMiAqZmxhZ3MpCitzdGF0aWMgaW50IGRlc19zZXRrZXkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgY29uc3QgdTggKmtleSwKKwkJICAgICAgdW5zaWduZWQgaW50IGtleWxlbiwgdTMyICpmbGFncykKIHsKLQlzdHJ1Y3QgZGVzX2N0eCAqZGN0eCA9IGN0eDsKKwlzdHJ1Y3QgZGVzX2N0eCAqZGN0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7CiAJdTMyIHRtcFtERVNfRVhQS0VZX1dPUkRTXTsKIAlpbnQgcmV0OwogCkBAIC04MDMsOSArODA0LDEwIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGRlc19lbmNyeXB0KHZvaWQgKmN0eCwgdTggKmRzdCwgY29uc3QgdTggKnNyYykKK3N0YXRpYyB2b2lkIGRlc19lbmNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpCiB7Ci0JY29uc3QgdTMyICpLID0gKChzdHJ1Y3QgZGVzX2N0eCAqKWN0eCktPmV4cGtleTsKKwlzdHJ1Y3QgZGVzX2N0eCAqY3R4ID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKKwljb25zdCB1MzIgKksgPSBjdHgtPmV4cGtleTsKIAljb25zdCBfX2xlMzIgKnMgPSAoY29uc3QgX19sZTMyICopc3JjOwogCV9fbGUzMiAqZCA9IChfX2xlMzIgKilkc3Q7CiAJdTMyIEwsIFIsIEEsIEI7CkBAIC04MjUsOSArODI3LDEwIEBACiAJZFsxXSA9IGNwdV90b19sZTMyKEwpOwogfQogCi1zdGF0aWMgdm9pZCBkZXNfZGVjcnlwdCh2b2lkICpjdHgsIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpCitzdGF0aWMgdm9pZCBkZXNfZGVjcnlwdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqZHN0LCBjb25zdCB1OCAqc3JjKQogewotCWNvbnN0IHUzMiAqSyA9ICgoc3RydWN0IGRlc19jdHggKiljdHgpLT5leHBrZXkgKyBERVNfRVhQS0VZX1dPUkRTIC0gMjsKKwlzdHJ1Y3QgZGVzX2N0eCAqY3R4ID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKKwljb25zdCB1MzIgKksgPSBjdHgtPmV4cGtleSArIERFU19FWFBLRVlfV09SRFMgLSAyOwogCWNvbnN0IF9fbGUzMiAqcyA9IChjb25zdCBfX2xlMzIgKilzcmM7CiAJX19sZTMyICpkID0gKF9fbGUzMiAqKWRzdDsKIAl1MzIgTCwgUiwgQSwgQjsKQEAgLTg2MCwxMSArODYzLDExIEBACiAgKiAgIHByb3BlcnR5LgogICoKICAqLwotc3RhdGljIGludCBkZXMzX2VkZV9zZXRrZXkodm9pZCAqY3R4LCBjb25zdCB1OCAqa2V5LAorc3RhdGljIGludCBkZXMzX2VkZV9zZXRrZXkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgY29uc3QgdTggKmtleSwKIAkJCSAgIHVuc2lnbmVkIGludCBrZXlsZW4sIHUzMiAqZmxhZ3MpCiB7CiAJY29uc3QgdTMyICpLID0gKGNvbnN0IHUzMiAqKWtleTsKLQlzdHJ1Y3QgZGVzM19lZGVfY3R4ICpkY3R4ID0gY3R4OworCXN0cnVjdCBkZXMzX2VkZV9jdHggKmRjdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOwogCXUzMiAqZXhwa2V5ID0gZGN0eC0+ZXhwa2V5OwogCiAJaWYgKHVubGlrZWx5KCEoKEtbMF0gXiBLWzJdKSB8IChLWzFdIF4gS1szXSkpIHx8CkBAIC04ODEsOSArODg0LDkgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgZGVzM19lZGVfZW5jcnlwdCh2b2lkICpjdHgsIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpCitzdGF0aWMgdm9pZCBkZXMzX2VkZV9lbmNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpCiB7Ci0Jc3RydWN0IGRlczNfZWRlX2N0eCAqZGN0eCA9IGN0eDsKKwlzdHJ1Y3QgZGVzM19lZGVfY3R4ICpkY3R4ID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKIAljb25zdCB1MzIgKksgPSBkY3R4LT5leHBrZXk7CiAJY29uc3QgX19sZTMyICpzID0gKGNvbnN0IF9fbGUzMiAqKXNyYzsKIAlfX2xlMzIgKmQgPSAoX19sZTMyICopZHN0OwpAQCAtOTEyLDkgKzkxNSw5IEBACiAJZFsxXSA9IGNwdV90b19sZTMyKEwpOwogfQogCi1zdGF0aWMgdm9pZCBkZXMzX2VkZV9kZWNyeXB0KHZvaWQgKmN0eCwgdTggKmRzdCwgY29uc3QgdTggKnNyYykKK3N0YXRpYyB2b2lkIGRlczNfZWRlX2RlY3J5cHQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKmRzdCwgY29uc3QgdTggKnNyYykKIHsKLQlzdHJ1Y3QgZGVzM19lZGVfY3R4ICpkY3R4ID0gY3R4OworCXN0cnVjdCBkZXMzX2VkZV9jdHggKmRjdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOwogCWNvbnN0IHUzMiAqSyA9IGRjdHgtPmV4cGtleSArIERFUzNfRURFX0VYUEtFWV9XT1JEUyAtIDI7CiAJY29uc3QgX19sZTMyICpzID0gKGNvbnN0IF9fbGUzMiAqKXNyYzsKIAlfX2xlMzIgKmQgPSAoX19sZTMyICopZHN0OwpkaWZmIC0tZ2l0IGEvY3J5cHRvL2RpZ2VzdC5jIGIvY3J5cHRvL2RpZ2VzdC5jCmluZGV4IGQ5YjZhYzkuLjYwMzAwNmEgMTAwNjQ0Ci0tLSBhL2NyeXB0by9kaWdlc3QuYworKysgYi9jcnlwdG8vZGlnZXN0LmMKQEAgLTIwLDEzICsyMCwxNCBAQAogCiBzdGF0aWMgdm9pZCBpbml0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCiB7Ci0JdGZtLT5fX2NydF9hbGctPmNyYV9kaWdlc3QuZGlhX2luaXQoY3J5cHRvX3RmbV9jdHgodGZtKSk7CisJdGZtLT5fX2NydF9hbGctPmNyYV9kaWdlc3QuZGlhX2luaXQodGZtKTsKIH0KIAogc3RhdGljIHZvaWQgdXBkYXRlKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCiAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgdW5zaWduZWQgaW50IG5zZykKIHsKIAl1bnNpZ25lZCBpbnQgaTsKKwl1bnNpZ25lZCBpbnQgYWxpZ25tYXNrID0gY3J5cHRvX3RmbV9hbGdfYWxpZ25tYXNrKHRmbSk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbnNnOyBpKyspIHsKIApAQCAtMzgsMTIgKzM5LDIyIEBACiAJCQl1bnNpZ25lZCBpbnQgYnl0ZXNfZnJvbV9wYWdlID0gbWluKGwsICgodW5zaWduZWQgaW50KQogCQkJCQkJCSAgIChQQUdFX1NJWkUpKSAtIAogCQkJCQkJCSAgIG9mZnNldCk7Ci0JCQljaGFyICpwID0gY3J5cHRvX2ttYXAocGcsIDApICsgb2Zmc2V0OworCQkJY2hhciAqc3JjID0gY3J5cHRvX2ttYXAocGcsIDApOworCQkJY2hhciAqcCA9IHNyYyArIG9mZnNldDsKIAotCQkJdGZtLT5fX2NydF9hbGctPmNyYV9kaWdlc3QuZGlhX3VwZGF0ZQotCQkJCQkoY3J5cHRvX3RmbV9jdHgodGZtKSwgcCwKLQkJCQkJIGJ5dGVzX2Zyb21fcGFnZSk7Ci0JCQljcnlwdG9fa3VubWFwKHAsIDApOworCQkJaWYgKHVubGlrZWx5KG9mZnNldCAmIGFsaWdubWFzaykpIHsKKwkJCQl1bnNpZ25lZCBpbnQgYnl0ZXMgPQorCQkJCQlhbGlnbm1hc2sgKyAxIC0gKG9mZnNldCAmIGFsaWdubWFzayk7CisJCQkJYnl0ZXMgPSBtaW4oYnl0ZXMsIGJ5dGVzX2Zyb21fcGFnZSk7CisJCQkJdGZtLT5fX2NydF9hbGctPmNyYV9kaWdlc3QuZGlhX3VwZGF0ZSh0Zm0sIHAsCisJCQkJCQkJCSAgICAgIGJ5dGVzKTsKKwkJCQlwICs9IGJ5dGVzOworCQkJCWJ5dGVzX2Zyb21fcGFnZSAtPSBieXRlczsKKwkJCQlsIC09IGJ5dGVzOworCQkJfQorCQkJdGZtLT5fX2NydF9hbGctPmNyYV9kaWdlc3QuZGlhX3VwZGF0ZSh0Zm0sIHAsCisJCQkJCQkJICAgICAgYnl0ZXNfZnJvbV9wYWdlKTsKKwkJCWNyeXB0b19rdW5tYXAoc3JjLCAwKTsKIAkJCWNyeXB0b195aWVsZCh0Zm0pOwogCQkJb2Zmc2V0ID0gMDsKIAkJCXBnKys7CkBAIC01NCw3ICs2NSwxNSBAQAogCiBzdGF0aWMgdm9pZCBmaW5hbChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqb3V0KQogewotCXRmbS0+X19jcnRfYWxnLT5jcmFfZGlnZXN0LmRpYV9maW5hbChjcnlwdG9fdGZtX2N0eCh0Zm0pLCBvdXQpOworCXVuc2lnbmVkIGxvbmcgYWxpZ25tYXNrID0gY3J5cHRvX3RmbV9hbGdfYWxpZ25tYXNrKHRmbSk7CisJaWYgKHVubGlrZWx5KCh1bnNpZ25lZCBsb25nKW91dCAmIGFsaWdubWFzaykpIHsKKwkJdW5zaWduZWQgaW50IHNpemUgPSBjcnlwdG9fdGZtX2FsZ19kaWdlc3RzaXplKHRmbSk7CisJCXU4IGJ1ZmZlcltzaXplICsgYWxpZ25tYXNrXTsKKwkJdTggKmRzdCA9ICh1OCAqKUFMSUdOKCh1bnNpZ25lZCBsb25nKWJ1ZmZlciwgYWxpZ25tYXNrICsgMSk7CisJCXRmbS0+X19jcnRfYWxnLT5jcmFfZGlnZXN0LmRpYV9maW5hbCh0Zm0sIGRzdCk7CisJCW1lbWNweShvdXQsIGRzdCwgc2l6ZSk7CisJfSBlbHNlCisJCXRmbS0+X19jcnRfYWxnLT5jcmFfZGlnZXN0LmRpYV9maW5hbCh0Zm0sIG91dCk7CiB9CiAKIHN0YXRpYyBpbnQgc2V0a2V5KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIGNvbnN0IHU4ICprZXksIHVuc2lnbmVkIGludCBrZXlsZW4pCkBAIC02MiwyNSArODEsMTUgQEAKIAl1MzIgZmxhZ3M7CiAJaWYgKHRmbS0+X19jcnRfYWxnLT5jcmFfZGlnZXN0LmRpYV9zZXRrZXkgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9TWVM7Ci0JcmV0dXJuIHRmbS0+X19jcnRfYWxnLT5jcmFfZGlnZXN0LmRpYV9zZXRrZXkoY3J5cHRvX3RmbV9jdHgodGZtKSwKLQkJCQkJCSAgICAga2V5LCBrZXlsZW4sICZmbGFncyk7CisJcmV0dXJuIHRmbS0+X19jcnRfYWxnLT5jcmFfZGlnZXN0LmRpYV9zZXRrZXkodGZtLCBrZXksIGtleWxlbiwgJmZsYWdzKTsKIH0KIAogc3RhdGljIHZvaWQgZGlnZXN0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCiAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgdW5zaWduZWQgaW50IG5zZywgdTggKm91dCkKIHsKLQl1bnNpZ25lZCBpbnQgaTsKLQotCXRmbS0+Y3J0X2RpZ2VzdC5kaXRfaW5pdCh0Zm0pOwotCQkKLQlmb3IgKGkgPSAwOyBpIDwgbnNnOyBpKyspIHsKLQkJY2hhciAqcCA9IGNyeXB0b19rbWFwKHNnW2ldLnBhZ2UsIDApICsgc2dbaV0ub2Zmc2V0OwotCQl0Zm0tPl9fY3J0X2FsZy0+Y3JhX2RpZ2VzdC5kaWFfdXBkYXRlKGNyeXB0b190Zm1fY3R4KHRmbSksCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCwgc2dbaV0ubGVuZ3RoKTsKLQkJY3J5cHRvX2t1bm1hcChwLCAwKTsKLQkJY3J5cHRvX3lpZWxkKHRmbSk7Ci0JfQotCWNyeXB0b19kaWdlc3RfZmluYWwodGZtLCBvdXQpOworCWluaXQodGZtKTsKKwl1cGRhdGUodGZtLCBzZywgbnNnKTsKKwlmaW5hbCh0Zm0sIG91dCk7CiB9CiAKIGludCBjcnlwdG9faW5pdF9kaWdlc3RfZmxhZ3Moc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTMyIGZsYWdzKQpkaWZmIC0tZ2l0IGEvY3J5cHRvL2toYXphZC5jIGIvY3J5cHRvL2toYXphZC5jCmluZGV4IDgwN2YyYmYuLmQ0YzlkMzYgMTAwNjQ0Ci0tLSBhL2NyeXB0by9raGF6YWQuYworKysgYi9jcnlwdG8va2hhemFkLmMKQEAgLTc1NCwxMSArNzU0LDExIEBACiAJMHhjY2M0MWQxNGMzNjNkYTVkVUxMLCAweDVmZGM3ZGNkN2Y1YTZjNWNVTEwsIDB4ZjcyNmZmZWRlODlkNmY4ZVVMTAogfTsKIAotc3RhdGljIGludCBraGF6YWRfc2V0a2V5KHZvaWQgKmN0eF9hcmcsIGNvbnN0IHU4ICppbl9rZXksCi0gICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBrZXlfbGVuLCB1MzIgKmZsYWdzKQorc3RhdGljIGludCBraGF6YWRfc2V0a2V5KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIGNvbnN0IHU4ICppbl9rZXksCisJCQkgdW5zaWduZWQgaW50IGtleV9sZW4sIHUzMiAqZmxhZ3MpCiB7Ci0Jc3RydWN0IGtoYXphZF9jdHggKmN0eCA9IGN0eF9hcmc7Ci0JY29uc3QgX19iZTY0ICprZXkgPSAoY29uc3QgX19iZTY0ICopaW5fa2V5OworCXN0cnVjdCBraGF6YWRfY3R4ICpjdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOworCWNvbnN0IF9fYmUzMiAqa2V5ID0gKGNvbnN0IF9fYmUzMiAqKWluX2tleTsKIAlpbnQgcjsKIAljb25zdCB1NjQgKlMgPSBUNzsKIAl1NjQgSzIsIEsxOwpAQCAtNzY5LDggKzc2OSw5IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCUsyID0gYmU2NF90b19jcHUoa2V5WzBdKTsKLQlLMSA9IGJlNjRfdG9fY3B1KGtleVsxXSk7CisJLyoga2V5IGlzIHN1cHBvc2VkIHRvIGJlIDMyLWJpdCBhbGlnbmVkICovCisJSzIgPSAoKHU2NCliZTMyX3RvX2NwdShrZXlbMF0pIDw8IDMyKSB8IGJlMzJfdG9fY3B1KGtleVsxXSk7CisJSzEgPSAoKHU2NCliZTMyX3RvX2NwdShrZXlbMl0pIDw8IDMyKSB8IGJlMzJfdG9fY3B1KGtleVszXSk7CiAKIAkvKiBzZXR1cCB0aGUgZW5jcnlwdCBrZXkgKi8KIAlmb3IgKHIgPSAwOyByIDw9IEtIQVpBRF9ST1VORFM7IHIrKykgewpAQCAtODQwLDE1ICs4NDEsMTUgQEAKIAkqZHN0ID0gY3B1X3RvX2JlNjQoc3RhdGUpOwogfQogCi1zdGF0aWMgdm9pZCBraGF6YWRfZW5jcnlwdCh2b2lkICpjdHhfYXJnLCB1OCAqZHN0LCBjb25zdCB1OCAqc3JjKQorc3RhdGljIHZvaWQga2hhemFkX2VuY3J5cHQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKmRzdCwgY29uc3QgdTggKnNyYykKIHsKLQlzdHJ1Y3Qga2hhemFkX2N0eCAqY3R4ID0gY3R4X2FyZzsKKwlzdHJ1Y3Qga2hhemFkX2N0eCAqY3R4ID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKIAlraGF6YWRfY3J5cHQoY3R4LT5FLCBkc3QsIHNyYyk7CiB9CiAKLXN0YXRpYyB2b2lkIGtoYXphZF9kZWNyeXB0KHZvaWQgKmN0eF9hcmcsIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpCitzdGF0aWMgdm9pZCBraGF6YWRfZGVjcnlwdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqZHN0LCBjb25zdCB1OCAqc3JjKQogewotCXN0cnVjdCBraGF6YWRfY3R4ICpjdHggPSBjdHhfYXJnOworCXN0cnVjdCBraGF6YWRfY3R4ICpjdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOwogCWtoYXphZF9jcnlwdChjdHgtPkQsIGRzdCwgc3JjKTsKIH0KIApkaWZmIC0tZ2l0IGEvY3J5cHRvL21kNC5jIGIvY3J5cHRvL21kNC5jCmluZGV4IGEyZDZkZjUuLmMxYmM3MWIgMTAwNjQ0Ci0tLSBhL2NyeXB0by9tZDQuYworKysgYi9jcnlwdG8vbWQ0LmMKQEAgLTE1Miw5ICsxNTIsOSBAQAogCW1kNF90cmFuc2Zvcm0oY3R4LT5oYXNoLCBjdHgtPmJsb2NrKTsKIH0KIAotc3RhdGljIHZvaWQgbWQ0X2luaXQodm9pZCAqY3R4KQorc3RhdGljIHZvaWQgbWQ0X2luaXQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKIHsKLQlzdHJ1Y3QgbWQ0X2N0eCAqbWN0eCA9IGN0eDsKKwlzdHJ1Y3QgbWQ0X2N0eCAqbWN0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7CiAKIAltY3R4LT5oYXNoWzBdID0gMHg2NzQ1MjMwMTsKIAltY3R4LT5oYXNoWzFdID0gMHhlZmNkYWI4OTsKQEAgLTE2Myw5ICsxNjMsOSBAQAogCW1jdHgtPmJ5dGVfY291bnQgPSAwOwogfQogCi1zdGF0aWMgdm9pZCBtZDRfdXBkYXRlKHZvaWQgKmN0eCwgY29uc3QgdTggKmRhdGEsIHVuc2lnbmVkIGludCBsZW4pCitzdGF0aWMgdm9pZCBtZDRfdXBkYXRlKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIGNvbnN0IHU4ICpkYXRhLCB1bnNpZ25lZCBpbnQgbGVuKQogewotCXN0cnVjdCBtZDRfY3R4ICptY3R4ID0gY3R4OworCXN0cnVjdCBtZDRfY3R4ICptY3R4ID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKIAljb25zdCB1MzIgYXZhaWwgPSBzaXplb2YobWN0eC0+YmxvY2spIC0gKG1jdHgtPmJ5dGVfY291bnQgJiAweDNmKTsKIAogCW1jdHgtPmJ5dGVfY291bnQgKz0gbGVuOwpAQCAtMTkzLDkgKzE5Myw5IEBACiAJbWVtY3B5KG1jdHgtPmJsb2NrLCBkYXRhLCBsZW4pOwogfQogCi1zdGF0aWMgdm9pZCBtZDRfZmluYWwodm9pZCAqY3R4LCB1OCAqb3V0KQorc3RhdGljIHZvaWQgbWQ0X2ZpbmFsKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpvdXQpCiB7Ci0Jc3RydWN0IG1kNF9jdHggKm1jdHggPSBjdHg7CisJc3RydWN0IG1kNF9jdHggKm1jdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOwogCWNvbnN0IHVuc2lnbmVkIGludCBvZmZzZXQgPSBtY3R4LT5ieXRlX2NvdW50ICYgMHgzZjsKIAljaGFyICpwID0gKGNoYXIgKiltY3R4LT5ibG9jayArIG9mZnNldDsKIAlpbnQgcGFkZGluZyA9IDU2IC0gKG9mZnNldCArIDEpOwpkaWZmIC0tZ2l0IGEvY3J5cHRvL21kNS5jIGIvY3J5cHRvL21kNS5jCmluZGV4IDdmMDQxYWUuLjkzZDE4ZTggMTAwNjQ0Ci0tLSBhL2NyeXB0by9tZDUuYworKysgYi9jcnlwdG8vbWQ1LmMKQEAgLTE0Nyw5ICsxNDcsOSBAQAogCW1kNV90cmFuc2Zvcm0oY3R4LT5oYXNoLCBjdHgtPmJsb2NrKTsKIH0KIAotc3RhdGljIHZvaWQgbWQ1X2luaXQodm9pZCAqY3R4KQorc3RhdGljIHZvaWQgbWQ1X2luaXQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKIHsKLQlzdHJ1Y3QgbWQ1X2N0eCAqbWN0eCA9IGN0eDsKKwlzdHJ1Y3QgbWQ1X2N0eCAqbWN0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7CiAKIAltY3R4LT5oYXNoWzBdID0gMHg2NzQ1MjMwMTsKIAltY3R4LT5oYXNoWzFdID0gMHhlZmNkYWI4OTsKQEAgLTE1OCw5ICsxNTgsOSBAQAogCW1jdHgtPmJ5dGVfY291bnQgPSAwOwogfQogCi1zdGF0aWMgdm9pZCBtZDVfdXBkYXRlKHZvaWQgKmN0eCwgY29uc3QgdTggKmRhdGEsIHVuc2lnbmVkIGludCBsZW4pCitzdGF0aWMgdm9pZCBtZDVfdXBkYXRlKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIGNvbnN0IHU4ICpkYXRhLCB1bnNpZ25lZCBpbnQgbGVuKQogewotCXN0cnVjdCBtZDVfY3R4ICptY3R4ID0gY3R4OworCXN0cnVjdCBtZDVfY3R4ICptY3R4ID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKIAljb25zdCB1MzIgYXZhaWwgPSBzaXplb2YobWN0eC0+YmxvY2spIC0gKG1jdHgtPmJ5dGVfY291bnQgJiAweDNmKTsKIAogCW1jdHgtPmJ5dGVfY291bnQgKz0gbGVuOwpAQCAtMTg4LDkgKzE4OCw5IEBACiAJbWVtY3B5KG1jdHgtPmJsb2NrLCBkYXRhLCBsZW4pOwogfQogCi1zdGF0aWMgdm9pZCBtZDVfZmluYWwodm9pZCAqY3R4LCB1OCAqb3V0KQorc3RhdGljIHZvaWQgbWQ1X2ZpbmFsKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpvdXQpCiB7Ci0Jc3RydWN0IG1kNV9jdHggKm1jdHggPSBjdHg7CisJc3RydWN0IG1kNV9jdHggKm1jdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOwogCWNvbnN0IHVuc2lnbmVkIGludCBvZmZzZXQgPSBtY3R4LT5ieXRlX2NvdW50ICYgMHgzZjsKIAljaGFyICpwID0gKGNoYXIgKiltY3R4LT5ibG9jayArIG9mZnNldDsKIAlpbnQgcGFkZGluZyA9IDU2IC0gKG9mZnNldCArIDEpOwpkaWZmIC0tZ2l0IGEvY3J5cHRvL21pY2hhZWxfbWljLmMgYi9jcnlwdG8vbWljaGFlbF9taWMuYwppbmRleCA0ZjZhYjIzLi5kMDYxZGEyIDEwMDY0NAotLS0gYS9jcnlwdG8vbWljaGFlbF9taWMuYworKysgYi9jcnlwdG8vbWljaGFlbF9taWMuYwpAQCAtNDUsMTYgKzQ1LDE3IEBACiB9IHdoaWxlICgwKQogCiAKLXN0YXRpYyB2b2lkIG1pY2hhZWxfaW5pdCh2b2lkICpjdHgpCitzdGF0aWMgdm9pZCBtaWNoYWVsX2luaXQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKIHsKLQlzdHJ1Y3QgbWljaGFlbF9taWNfY3R4ICptY3R4ID0gY3R4OworCXN0cnVjdCBtaWNoYWVsX21pY19jdHggKm1jdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOwogCW1jdHgtPnBlbmRpbmdfbGVuID0gMDsKIH0KIAogCi1zdGF0aWMgdm9pZCBtaWNoYWVsX3VwZGF0ZSh2b2lkICpjdHgsIGNvbnN0IHU4ICpkYXRhLCB1bnNpZ25lZCBpbnQgbGVuKQorc3RhdGljIHZvaWQgbWljaGFlbF91cGRhdGUoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgY29uc3QgdTggKmRhdGEsCisJCQkgICB1bnNpZ25lZCBpbnQgbGVuKQogewotCXN0cnVjdCBtaWNoYWVsX21pY19jdHggKm1jdHggPSBjdHg7CisJc3RydWN0IG1pY2hhZWxfbWljX2N0eCAqbWN0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7CiAJY29uc3QgX19sZTMyICpzcmM7CiAKIAlpZiAobWN0eC0+cGVuZGluZ19sZW4pIHsKQEAgLTkwLDkgKzkxLDkgQEAKIH0KIAogCi1zdGF0aWMgdm9pZCBtaWNoYWVsX2ZpbmFsKHZvaWQgKmN0eCwgdTggKm91dCkKK3N0YXRpYyB2b2lkIG1pY2hhZWxfZmluYWwoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKm91dCkKIHsKLQlzdHJ1Y3QgbWljaGFlbF9taWNfY3R4ICptY3R4ID0gY3R4OworCXN0cnVjdCBtaWNoYWVsX21pY19jdHggKm1jdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOwogCXU4ICpkYXRhID0gbWN0eC0+cGVuZGluZzsKIAlfX2xlMzIgKmRzdCA9IChfX2xlMzIgKilvdXQ7CiAKQEAgLTEyMSwxMCArMTIyLDEwIEBACiB9CiAKIAotc3RhdGljIGludCBtaWNoYWVsX3NldGtleSh2b2lkICpjdHgsIGNvbnN0IHU4ICprZXksIHVuc2lnbmVkIGludCBrZXlsZW4sCi0JCQkgIHUzMiAqZmxhZ3MpCitzdGF0aWMgaW50IG1pY2hhZWxfc2V0a2V5KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIGNvbnN0IHU4ICprZXksCisJCQkgIHVuc2lnbmVkIGludCBrZXlsZW4sIHUzMiAqZmxhZ3MpCiB7Ci0Jc3RydWN0IG1pY2hhZWxfbWljX2N0eCAqbWN0eCA9IGN0eDsKKwlzdHJ1Y3QgbWljaGFlbF9taWNfY3R4ICptY3R4ID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKIAljb25zdCBfX2xlMzIgKmRhdGEgPSAoY29uc3QgX19sZTMyICopa2V5OwogCiAJaWYgKGtleWxlbiAhPSA4KSB7CkBAIC0xNDUsNiArMTQ2LDcgQEAKIAkuY3JhX2Jsb2Nrc2l6ZQk9IDgsCiAJLmNyYV9jdHhzaXplCT0gc2l6ZW9mKHN0cnVjdCBtaWNoYWVsX21pY19jdHgpLAogCS5jcmFfbW9kdWxlCT0gVEhJU19NT0RVTEUsCisJLmNyYV9hbGlnbm1hc2sJPSAzLAogCS5jcmFfbGlzdAk9IExJU1RfSEVBRF9JTklUKG1pY2hhZWxfbWljX2FsZy5jcmFfbGlzdCksCiAJLmNyYV91CQk9IHsgLmRpZ2VzdCA9IHsKIAkuZGlhX2RpZ2VzdHNpemUJPSA4LApkaWZmIC0tZ2l0IGEvY3J5cHRvL3NlcnBlbnQuYyBiL2NyeXB0by9zZXJwZW50LmMKaW5kZXggZTM2NjQwNi4uZGU2MGNkZCAxMDA2NDQKLS0tIGEvY3J5cHRvL3NlcnBlbnQuYworKysgYi9jcnlwdG8vc2VycGVudC5jCkBAIC0yMTUsOSArMjE1LDExIEBACiB9OwogCiAKLXN0YXRpYyBpbnQgc2VycGVudF9zZXRrZXkodm9pZCAqY3R4LCBjb25zdCB1OCAqa2V5LCB1bnNpZ25lZCBpbnQga2V5bGVuLCB1MzIgKmZsYWdzKQorc3RhdGljIGludCBzZXJwZW50X3NldGtleShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCBjb25zdCB1OCAqa2V5LAorCQkJICB1bnNpZ25lZCBpbnQga2V5bGVuLCB1MzIgKmZsYWdzKQogewotCXUzMiAqayA9ICgoc3RydWN0IHNlcnBlbnRfY3R4ICopY3R4KS0+ZXhwa2V5OworCXN0cnVjdCBzZXJwZW50X2N0eCAqY3R4ID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKKwl1MzIgKmsgPSBjdHgtPmV4cGtleTsKIAl1OCAgKms4ID0gKHU4ICopazsKIAl1MzIgcjAscjEscjIscjMscjQ7CiAJaW50IGk7CkBAIC0zNjUsMTAgKzM2NywxMSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBzZXJwZW50X2VuY3J5cHQodm9pZCAqY3R4LCB1OCAqZHN0LCBjb25zdCB1OCAqc3JjKQorc3RhdGljIHZvaWQgc2VycGVudF9lbmNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpCiB7CisJc3RydWN0IHNlcnBlbnRfY3R4ICpjdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOwogCWNvbnN0IHUzMgotCQkqayA9ICgoc3RydWN0IHNlcnBlbnRfY3R4ICopY3R4KS0+ZXhwa2V5LAorCQkqayA9IGN0eC0+ZXhwa2V5LAogCQkqcyA9IChjb25zdCB1MzIgKilzcmM7CiAJdTMyCSpkID0gKHUzMiAqKWRzdCwKIAkJcjAsIHIxLCByMiwgcjMsIHI0OwpAQCAtNDIzLDggKzQyNiw5IEBACiAJZFszXSA9IGNwdV90b19sZTMyKHIzKTsKIH0KIAotc3RhdGljIHZvaWQgc2VycGVudF9kZWNyeXB0KHZvaWQgKmN0eCwgdTggKmRzdCwgY29uc3QgdTggKnNyYykKK3N0YXRpYyB2b2lkIHNlcnBlbnRfZGVjcnlwdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqZHN0LCBjb25zdCB1OCAqc3JjKQogeworCXN0cnVjdCBzZXJwZW50X2N0eCAqY3R4ID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKIAljb25zdCB1MzIKIAkJKmsgPSAoKHN0cnVjdCBzZXJwZW50X2N0eCAqKWN0eCktPmV4cGtleSwKIAkJKnMgPSAoY29uc3QgdTMyICopc3JjOwpAQCAtNDkyLDcgKzQ5Niw4IEBACiAJLmNpYV9kZWNyeXB0ICAJCT0Jc2VycGVudF9kZWNyeXB0IH0gfQogfTsKIAotc3RhdGljIGludCB0bmVwcmVzX3NldGtleSh2b2lkICpjdHgsIGNvbnN0IHU4ICprZXksIHVuc2lnbmVkIGludCBrZXlsZW4sIHUzMiAqZmxhZ3MpCitzdGF0aWMgaW50IHRuZXByZXNfc2V0a2V5KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIGNvbnN0IHU4ICprZXksCisJCQkgIHVuc2lnbmVkIGludCBrZXlsZW4sIHUzMiAqZmxhZ3MpCiB7CiAJdTggcmV2X2tleVtTRVJQRU5UX01BWF9LRVlfU0laRV07CiAJaW50IGk7CkBAIC01MDYsMTAgKzUxMSwxMCBAQAogCWZvciAoaSA9IDA7IGkgPCBrZXlsZW47ICsraSkKIAkJcmV2X2tleVtrZXlsZW4gLSBpIC0gMV0gPSBrZXlbaV07CiAgCi0JcmV0dXJuIHNlcnBlbnRfc2V0a2V5KGN0eCwgcmV2X2tleSwga2V5bGVuLCBmbGFncyk7CisJcmV0dXJuIHNlcnBlbnRfc2V0a2V5KHRmbSwgcmV2X2tleSwga2V5bGVuLCBmbGFncyk7CiB9CiAKLXN0YXRpYyB2b2lkIHRuZXByZXNfZW5jcnlwdCh2b2lkICpjdHgsIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpCitzdGF0aWMgdm9pZCB0bmVwcmVzX2VuY3J5cHQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKmRzdCwgY29uc3QgdTggKnNyYykKIHsKIAljb25zdCB1MzIgKiBjb25zdCBzID0gKGNvbnN0IHUzMiAqIGNvbnN0KXNyYzsKIAl1MzIgKiBjb25zdCBkID0gKHUzMiAqIGNvbnN0KWRzdDsKQEAgLTUyMSw3ICs1MjYsNyBAQAogCXJzWzJdID0gc3dhYjMyKHNbMV0pOwogCXJzWzNdID0gc3dhYjMyKHNbMF0pOwogCi0Jc2VycGVudF9lbmNyeXB0KGN0eCwgKHU4ICopcmQsICh1OCAqKXJzKTsKKwlzZXJwZW50X2VuY3J5cHQodGZtLCAodTggKilyZCwgKHU4ICopcnMpOwogCiAJZFswXSA9IHN3YWIzMihyZFszXSk7CiAJZFsxXSA9IHN3YWIzMihyZFsyXSk7CkBAIC01MjksNyArNTM0LDcgQEAKIAlkWzNdID0gc3dhYjMyKHJkWzBdKTsKIH0KIAotc3RhdGljIHZvaWQgdG5lcHJlc19kZWNyeXB0KHZvaWQgKmN0eCwgdTggKmRzdCwgY29uc3QgdTggKnNyYykKK3N0YXRpYyB2b2lkIHRuZXByZXNfZGVjcnlwdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqZHN0LCBjb25zdCB1OCAqc3JjKQogewogCWNvbnN0IHUzMiAqIGNvbnN0IHMgPSAoY29uc3QgdTMyICogY29uc3Qpc3JjOwogCXUzMiAqIGNvbnN0IGQgPSAodTMyICogY29uc3QpZHN0OwpAQCAtNTQxLDcgKzU0Niw3IEBACiAJcnNbMl0gPSBzd2FiMzIoc1sxXSk7CiAJcnNbM10gPSBzd2FiMzIoc1swXSk7CiAKLQlzZXJwZW50X2RlY3J5cHQoY3R4LCAodTggKilyZCwgKHU4ICopcnMpOworCXNlcnBlbnRfZGVjcnlwdCh0Zm0sICh1OCAqKXJkLCAodTggKilycyk7CiAKIAlkWzBdID0gc3dhYjMyKHJkWzNdKTsKIAlkWzFdID0gc3dhYjMyKHJkWzJdKTsKZGlmZiAtLWdpdCBhL2NyeXB0by9zaGExLmMgYi9jcnlwdG8vc2hhMS5jCmluZGV4IDIxNTcxZWQzLi42Yzc3YjY4IDEwMDY0NAotLS0gYS9jcnlwdG8vc2hhMS5jCisrKyBiL2NyeXB0by9zaGExLmMKQEAgLTM0LDkgKzM0LDkgQEAKICAgICAgICAgdTggYnVmZmVyWzY0XTsKIH07CiAKLXN0YXRpYyB2b2lkIHNoYTFfaW5pdCh2b2lkICpjdHgpCitzdGF0aWMgdm9pZCBzaGExX2luaXQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKIHsKLQlzdHJ1Y3Qgc2hhMV9jdHggKnNjdHggPSBjdHg7CisJc3RydWN0IHNoYTFfY3R4ICpzY3R4ID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKIAlzdGF0aWMgY29uc3Qgc3RydWN0IHNoYTFfY3R4IGluaXRzdGF0ZSA9IHsKIAkgIDAsCiAJICB7IDB4Njc0NTIzMDEsIDB4RUZDREFCODksIDB4OThCQURDRkUsIDB4MTAzMjU0NzYsIDB4QzNEMkUxRjAgfSwKQEAgLTQ2LDkgKzQ2LDEwIEBACiAJKnNjdHggPSBpbml0c3RhdGU7CiB9CiAKLXN0YXRpYyB2b2lkIHNoYTFfdXBkYXRlKHZvaWQgKmN0eCwgY29uc3QgdTggKmRhdGEsIHVuc2lnbmVkIGludCBsZW4pCitzdGF0aWMgdm9pZCBzaGExX3VwZGF0ZShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCBjb25zdCB1OCAqZGF0YSwKKwkJCXVuc2lnbmVkIGludCBsZW4pCiB7Ci0Jc3RydWN0IHNoYTFfY3R4ICpzY3R4ID0gY3R4OworCXN0cnVjdCBzaGExX2N0eCAqc2N0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7CiAJdW5zaWduZWQgaW50IHBhcnRpYWwsIGRvbmU7CiAJY29uc3QgdTggKnNyYzsKIApAQCAtODAsOSArODEsOSBAQAogCiAKIC8qIEFkZCBwYWRkaW5nIGFuZCByZXR1cm4gdGhlIG1lc3NhZ2UgZGlnZXN0LiAqLwotc3RhdGljIHZvaWQgc2hhMV9maW5hbCh2b2lkKiBjdHgsIHU4ICpvdXQpCitzdGF0aWMgdm9pZCBzaGExX2ZpbmFsKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpvdXQpCiB7Ci0Jc3RydWN0IHNoYTFfY3R4ICpzY3R4ID0gY3R4OworCXN0cnVjdCBzaGExX2N0eCAqc2N0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7CiAJX19iZTMyICpkc3QgPSAoX19iZTMyICopb3V0OwogCXUzMiBpLCBpbmRleCwgcGFkbGVuOwogCV9fYmU2NCBiaXRzOwpAQCAtOTMsMTAgKzk0LDEwIEBACiAJLyogUGFkIG91dCB0byA1NiBtb2QgNjQgKi8KIAlpbmRleCA9IHNjdHgtPmNvdW50ICYgMHgzZjsKIAlwYWRsZW4gPSAoaW5kZXggPCA1NikgPyAoNTYgLSBpbmRleCkgOiAoKDY0KzU2KSAtIGluZGV4KTsKLQlzaGExX3VwZGF0ZShzY3R4LCBwYWRkaW5nLCBwYWRsZW4pOworCXNoYTFfdXBkYXRlKHRmbSwgcGFkZGluZywgcGFkbGVuKTsKIAogCS8qIEFwcGVuZCBsZW5ndGggKi8KLQlzaGExX3VwZGF0ZShzY3R4LCAoY29uc3QgdTggKikmYml0cywgc2l6ZW9mKGJpdHMpKTsKKwlzaGExX3VwZGF0ZSh0Zm0sIChjb25zdCB1OCAqKSZiaXRzLCBzaXplb2YoYml0cykpOwogCiAJLyogU3RvcmUgc3RhdGUgaW4gZGlnZXN0ICovCiAJZm9yIChpID0gMDsgaSA8IDU7IGkrKykKQEAgLTExMiw2ICsxMTMsNyBAQAogCS5jcmFfYmxvY2tzaXplCT0JU0hBMV9ITUFDX0JMT0NLX1NJWkUsCiAJLmNyYV9jdHhzaXplCT0Jc2l6ZW9mKHN0cnVjdCBzaGExX2N0eCksCiAJLmNyYV9tb2R1bGUJPQlUSElTX01PRFVMRSwKKwkuY3JhX2FsaWdubWFzawk9CTMsCiAJLmNyYV9saXN0ICAgICAgID0gICAgICAgTElTVF9IRUFEX0lOSVQoYWxnLmNyYV9saXN0KSwKIAkuY3JhX3UJCT0JeyAuZGlnZXN0ID0gewogCS5kaWFfZGlnZXN0c2l6ZQk9CVNIQTFfRElHRVNUX1NJWkUsCmRpZmYgLS1naXQgYS9jcnlwdG8vc2hhMjU2LmMgYi9jcnlwdG8vc2hhMjU2LmMKaW5kZXggOWQ1ZWY2Ny4uYmM3MWQ4NSAxMDA2NDQKLS0tIGEvY3J5cHRvL3NoYTI1Ni5jCisrKyBiL2NyeXB0by9zaGEyNTYuYwpAQCAtMjMwLDkgKzIzMCw5IEBACiAJbWVtc2V0KFcsIDAsIDY0ICogc2l6ZW9mKHUzMikpOwogfQogCi1zdGF0aWMgdm9pZCBzaGEyNTZfaW5pdCh2b2lkICpjdHgpCitzdGF0aWMgdm9pZCBzaGEyNTZfaW5pdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQogewotCXN0cnVjdCBzaGEyNTZfY3R4ICpzY3R4ID0gY3R4OworCXN0cnVjdCBzaGEyNTZfY3R4ICpzY3R4ID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKIAlzY3R4LT5zdGF0ZVswXSA9IEgwOwogCXNjdHgtPnN0YXRlWzFdID0gSDE7CiAJc2N0eC0+c3RhdGVbMl0gPSBIMjsKQEAgLTI0MiwxMiArMjQyLDEyIEBACiAJc2N0eC0+c3RhdGVbNl0gPSBINjsKIAlzY3R4LT5zdGF0ZVs3XSA9IEg3OwogCXNjdHgtPmNvdW50WzBdID0gc2N0eC0+Y291bnRbMV0gPSAwOwotCW1lbXNldChzY3R4LT5idWYsIDAsIHNpemVvZihzY3R4LT5idWYpKTsKIH0KIAotc3RhdGljIHZvaWQgc2hhMjU2X3VwZGF0ZSh2b2lkICpjdHgsIGNvbnN0IHU4ICpkYXRhLCB1bnNpZ25lZCBpbnQgbGVuKQorc3RhdGljIHZvaWQgc2hhMjU2X3VwZGF0ZShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCBjb25zdCB1OCAqZGF0YSwKKwkJCSAgdW5zaWduZWQgaW50IGxlbikKIHsKLQlzdHJ1Y3Qgc2hhMjU2X2N0eCAqc2N0eCA9IGN0eDsKKwlzdHJ1Y3Qgc2hhMjU2X2N0eCAqc2N0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7CiAJdW5zaWduZWQgaW50IGksIGluZGV4LCBwYXJ0X2xlbjsKIAogCS8qIENvbXB1dGUgbnVtYmVyIG9mIGJ5dGVzIG1vZCAxMjggKi8KQEAgLTI3Nyw5ICsyNzcsOSBAQAogCW1lbWNweSgmc2N0eC0+YnVmW2luZGV4XSwgJmRhdGFbaV0sIGxlbi1pKTsKIH0KIAotc3RhdGljIHZvaWQgc2hhMjU2X2ZpbmFsKHZvaWQqIGN0eCwgdTggKm91dCkKK3N0YXRpYyB2b2lkIHNoYTI1Nl9maW5hbChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqb3V0KQogewotCXN0cnVjdCBzaGEyNTZfY3R4ICpzY3R4ID0gY3R4OworCXN0cnVjdCBzaGEyNTZfY3R4ICpzY3R4ID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKIAlfX2JlMzIgKmRzdCA9IChfX2JlMzIgKilvdXQ7CiAJX19iZTMyIGJpdHNbMl07CiAJdW5zaWduZWQgaW50IGluZGV4LCBwYWRfbGVuOwpAQCAtMjkzLDEwICsyOTMsMTAgQEAKIAkvKiBQYWQgb3V0IHRvIDU2IG1vZCA2NC4gKi8KIAlpbmRleCA9IChzY3R4LT5jb3VudFswXSA+PiAzKSAmIDB4M2Y7CiAJcGFkX2xlbiA9IChpbmRleCA8IDU2KSA/ICg1NiAtIGluZGV4KSA6ICgoNjQrNTYpIC0gaW5kZXgpOwotCXNoYTI1Nl91cGRhdGUoc2N0eCwgcGFkZGluZywgcGFkX2xlbik7CisJc2hhMjU2X3VwZGF0ZSh0Zm0sIHBhZGRpbmcsIHBhZF9sZW4pOwogCiAJLyogQXBwZW5kIGxlbmd0aCAoYmVmb3JlIHBhZGRpbmcpICovCi0Jc2hhMjU2X3VwZGF0ZShzY3R4LCAoY29uc3QgdTggKiliaXRzLCBzaXplb2YoYml0cykpOworCXNoYTI1Nl91cGRhdGUodGZtLCAoY29uc3QgdTggKiliaXRzLCBzaXplb2YoYml0cykpOwogCiAJLyogU3RvcmUgc3RhdGUgaW4gZGlnZXN0ICovCiAJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKQEAgLTMxMyw2ICszMTMsNyBAQAogCS5jcmFfYmxvY2tzaXplCT0JU0hBMjU2X0hNQUNfQkxPQ0tfU0laRSwKIAkuY3JhX2N0eHNpemUJPQlzaXplb2Yoc3RydWN0IHNoYTI1Nl9jdHgpLAogCS5jcmFfbW9kdWxlCT0JVEhJU19NT0RVTEUsCisJLmNyYV9hbGlnbm1hc2sJPQkzLAogCS5jcmFfbGlzdCAgICAgICA9ICAgICAgIExJU1RfSEVBRF9JTklUKGFsZy5jcmFfbGlzdCksCiAJLmNyYV91CQk9CXsgLmRpZ2VzdCA9IHsKIAkuZGlhX2RpZ2VzdHNpemUJPQlTSEEyNTZfRElHRVNUX1NJWkUsCmRpZmYgLS1naXQgYS9jcnlwdG8vc2hhNTEyLmMgYi9jcnlwdG8vc2hhNTEyLmMKaW5kZXggM2U2ZTkzOS4uMmRmZTdmMSAxMDA2NDQKLS0tIGEvY3J5cHRvL3NoYTUxMi5jCisrKyBiL2NyeXB0by9zaGE1MTIuYwpAQCAtMTYxLDkgKzE2MSw5IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1zaGE1MTJfaW5pdCh2b2lkICpjdHgpCitzaGE1MTJfaW5pdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQogewotICAgICAgICBzdHJ1Y3Qgc2hhNTEyX2N0eCAqc2N0eCA9IGN0eDsKKwlzdHJ1Y3Qgc2hhNTEyX2N0eCAqc2N0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7CiAJc2N0eC0+c3RhdGVbMF0gPSBIMDsKIAlzY3R4LT5zdGF0ZVsxXSA9IEgxOwogCXNjdHgtPnN0YXRlWzJdID0gSDI7CkBAIC0xNzMsMTMgKzE3MywxMiBAQAogCXNjdHgtPnN0YXRlWzZdID0gSDY7CiAJc2N0eC0+c3RhdGVbN10gPSBINzsKIAlzY3R4LT5jb3VudFswXSA9IHNjdHgtPmNvdW50WzFdID0gc2N0eC0+Y291bnRbMl0gPSBzY3R4LT5jb3VudFszXSA9IDA7Ci0JbWVtc2V0KHNjdHgtPmJ1ZiwgMCwgc2l6ZW9mKHNjdHgtPmJ1ZikpOwogfQogCiBzdGF0aWMgdm9pZAotc2hhMzg0X2luaXQodm9pZCAqY3R4KQorc2hhMzg0X2luaXQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKIHsKLSAgICAgICAgc3RydWN0IHNoYTUxMl9jdHggKnNjdHggPSBjdHg7CisJc3RydWN0IHNoYTUxMl9jdHggKnNjdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOwogICAgICAgICBzY3R4LT5zdGF0ZVswXSA9IEhQMDsKICAgICAgICAgc2N0eC0+c3RhdGVbMV0gPSBIUDE7CiAgICAgICAgIHNjdHgtPnN0YXRlWzJdID0gSFAyOwpAQCAtMTg5LDEzICsxODgsMTIgQEAKICAgICAgICAgc2N0eC0+c3RhdGVbNl0gPSBIUDY7CiAgICAgICAgIHNjdHgtPnN0YXRlWzddID0gSFA3OwogICAgICAgICBzY3R4LT5jb3VudFswXSA9IHNjdHgtPmNvdW50WzFdID0gc2N0eC0+Y291bnRbMl0gPSBzY3R4LT5jb3VudFszXSA9IDA7Ci0gICAgICAgIG1lbXNldChzY3R4LT5idWYsIDAsIHNpemVvZihzY3R4LT5idWYpKTsKIH0KIAogc3RhdGljIHZvaWQKLXNoYTUxMl91cGRhdGUodm9pZCAqY3R4LCBjb25zdCB1OCAqZGF0YSwgdW5zaWduZWQgaW50IGxlbikKK3NoYTUxMl91cGRhdGUoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgY29uc3QgdTggKmRhdGEsIHVuc2lnbmVkIGludCBsZW4pCiB7Ci0gICAgICAgIHN0cnVjdCBzaGE1MTJfY3R4ICpzY3R4ID0gY3R4OworCXN0cnVjdCBzaGE1MTJfY3R4ICpzY3R4ID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKIAogCXVuc2lnbmVkIGludCBpLCBpbmRleCwgcGFydF9sZW47CiAKQEAgLTIzMyw5ICsyMzEsOSBAQAogfQogCiBzdGF0aWMgdm9pZAotc2hhNTEyX2ZpbmFsKHZvaWQgKmN0eCwgdTggKmhhc2gpCitzaGE1MTJfZmluYWwoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKmhhc2gpCiB7Ci0gICAgICAgIHN0cnVjdCBzaGE1MTJfY3R4ICpzY3R4ID0gY3R4OworCXN0cnVjdCBzaGE1MTJfY3R4ICpzY3R4ID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKICAgICAgICAgc3RhdGljIHU4IHBhZGRpbmdbMTI4XSA9IHsgMHg4MCwgfTsKIAlfX2JlNjQgKmRzdCA9IChfX2JlNjQgKiloYXNoOwogCV9fYmUzMiBiaXRzWzRdOwpAQCAtMjUxLDEwICsyNDksMTAgQEAKIAkvKiBQYWQgb3V0IHRvIDExMiBtb2QgMTI4LiAqLwogCWluZGV4ID0gKHNjdHgtPmNvdW50WzBdID4+IDMpICYgMHg3ZjsKIAlwYWRfbGVuID0gKGluZGV4IDwgMTEyKSA/ICgxMTIgLSBpbmRleCkgOiAoKDEyOCsxMTIpIC0gaW5kZXgpOwotCXNoYTUxMl91cGRhdGUoc2N0eCwgcGFkZGluZywgcGFkX2xlbik7CisJc2hhNTEyX3VwZGF0ZSh0Zm0sIHBhZGRpbmcsIHBhZF9sZW4pOwogCiAJLyogQXBwZW5kIGxlbmd0aCAoYmVmb3JlIHBhZGRpbmcpICovCi0Jc2hhNTEyX3VwZGF0ZShzY3R4LCAoY29uc3QgdTggKiliaXRzLCBzaXplb2YoYml0cykpOworCXNoYTUxMl91cGRhdGUodGZtLCAoY29uc3QgdTggKiliaXRzLCBzaXplb2YoYml0cykpOwogCiAJLyogU3RvcmUgc3RhdGUgaW4gZGlnZXN0ICovCiAJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKQEAgLTI2NCwxMiArMjYyLDExIEBACiAJbWVtc2V0KHNjdHgsIDAsIHNpemVvZihzdHJ1Y3Qgc2hhNTEyX2N0eCkpOwogfQogCi1zdGF0aWMgdm9pZCBzaGEzODRfZmluYWwodm9pZCAqY3R4LCB1OCAqaGFzaCkKK3N0YXRpYyB2b2lkIHNoYTM4NF9maW5hbChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqaGFzaCkKIHsKLSAgICAgICAgc3RydWN0IHNoYTUxMl9jdHggKnNjdHggPSBjdHg7CiAgICAgICAgIHU4IERbNjRdOwogCi0gICAgICAgIHNoYTUxMl9maW5hbChzY3R4LCBEKTsKKwlzaGE1MTJfZmluYWwodGZtLCBEKTsKIAogICAgICAgICBtZW1jcHkoaGFzaCwgRCwgNDgpOwogICAgICAgICBtZW1zZXQoRCwgMCwgNjQpOwpAQCAtMjgxLDYgKzI3OCw3IEBACiAgICAgICAgIC5jcmFfYmxvY2tzaXplICA9IFNIQTUxMl9ITUFDX0JMT0NLX1NJWkUsCiAgICAgICAgIC5jcmFfY3R4c2l6ZSAgICA9IHNpemVvZihzdHJ1Y3Qgc2hhNTEyX2N0eCksCiAgICAgICAgIC5jcmFfbW9kdWxlICAgICA9IFRISVNfTU9EVUxFLAorCS5jcmFfYWxpZ25tYXNrCT0gMywKICAgICAgICAgLmNyYV9saXN0ICAgICAgID0gTElTVF9IRUFEX0lOSVQoc2hhNTEyLmNyYV9saXN0KSwKICAgICAgICAgLmNyYV91ICAgICAgICAgID0geyAuZGlnZXN0ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZGlhX2RpZ2VzdHNpemUgPSBTSEE1MTJfRElHRVNUX1NJWkUsCkBAIC0yOTUsNiArMjkzLDcgQEAKICAgICAgICAgLmNyYV9mbGFncyAgICAgID0gQ1JZUFRPX0FMR19UWVBFX0RJR0VTVCwKICAgICAgICAgLmNyYV9ibG9ja3NpemUgID0gU0hBMzg0X0hNQUNfQkxPQ0tfU0laRSwKICAgICAgICAgLmNyYV9jdHhzaXplICAgID0gc2l6ZW9mKHN0cnVjdCBzaGE1MTJfY3R4KSwKKwkuY3JhX2FsaWdubWFzawk9IDMsCiAgICAgICAgIC5jcmFfbW9kdWxlICAgICA9IFRISVNfTU9EVUxFLAogICAgICAgICAuY3JhX2xpc3QgICAgICAgPSBMSVNUX0hFQURfSU5JVChzaGEzODQuY3JhX2xpc3QpLAogICAgICAgICAuY3JhX3UgICAgICAgICAgPSB7IC5kaWdlc3QgPSB7CmRpZmYgLS1naXQgYS9jcnlwdG8vdGNyeXB0LmMgYi9jcnlwdG8vdGNyeXB0LmMKaW5kZXggNDllMzQ0Zi4uZTUyZjU2YyAxMDA2NDQKLS0tIGEvY3J5cHRvL3RjcnlwdC5jCisrKyBiL2NyeXB0by90Y3J5cHQuYwpAQCAtNTcwLDYgKzU3MCwxMjIgQEAKIAljcnlwdG9fZnJlZV90Zm0odGZtKTsKIH0KIAorc3RhdGljIHZvaWQgdGVzdF9kaWdlc3RfamlmZmllcyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCBjaGFyICpwLCBpbnQgYmxlbiwKKwkJCQlpbnQgcGxlbiwgY2hhciAqb3V0LCBpbnQgc2VjKQoreworCXN0cnVjdCBzY2F0dGVybGlzdCBzZ1sxXTsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0LCBlbmQ7CisJaW50IGJjb3VudCwgcGNvdW50OworCisJZm9yIChzdGFydCA9IGppZmZpZXMsIGVuZCA9IHN0YXJ0ICsgc2VjICogSFosIGJjb3VudCA9IDA7CisJICAgICB0aW1lX2JlZm9yZShqaWZmaWVzLCBlbmQpOyBiY291bnQrKykgeworCQljcnlwdG9fZGlnZXN0X2luaXQodGZtKTsKKwkJZm9yIChwY291bnQgPSAwOyBwY291bnQgPCBibGVuOyBwY291bnQgKz0gcGxlbikgeworCQkJc2dfc2V0X2J1ZihzZywgcCArIHBjb3VudCwgcGxlbik7CisJCQljcnlwdG9fZGlnZXN0X3VwZGF0ZSh0Zm0sIHNnLCAxKTsKKwkJfQorCQkvKiB3ZSBhc3N1bWUgdGhlcmUgaXMgZW5vdWdoIHNwYWNlIGluICdvdXQnIGZvciB0aGUgcmVzdWx0ICovCisJCWNyeXB0b19kaWdlc3RfZmluYWwodGZtLCBvdXQpOworCX0KKworCXByaW50aygiJTZ1IG9wZXJzL3NlYywgJTlsdSBieXRlcy9zZWNcbiIsCisJICAgICAgIGJjb3VudCAvIHNlYywgKChsb25nKWJjb3VudCAqIGJsZW4pIC8gc2VjKTsKKworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgdGVzdF9kaWdlc3RfY3ljbGVzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIGNoYXIgKnAsIGludCBibGVuLAorCQkJICAgICAgIGludCBwbGVuLCBjaGFyICpvdXQpCit7CisJc3RydWN0IHNjYXR0ZXJsaXN0IHNnWzFdOworCXVuc2lnbmVkIGxvbmcgY3ljbGVzID0gMDsKKwlpbnQgaSwgcGNvdW50OworCisJbG9jYWxfYmhfZGlzYWJsZSgpOworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisKKwkvKiBXYXJtLXVwIHJ1bi4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCWNyeXB0b19kaWdlc3RfaW5pdCh0Zm0pOworCQlmb3IgKHBjb3VudCA9IDA7IHBjb3VudCA8IGJsZW47IHBjb3VudCArPSBwbGVuKSB7CisJCQlzZ19zZXRfYnVmKHNnLCBwICsgcGNvdW50LCBwbGVuKTsKKwkJCWNyeXB0b19kaWdlc3RfdXBkYXRlKHRmbSwgc2csIDEpOworCQl9CisJCWNyeXB0b19kaWdlc3RfZmluYWwodGZtLCBvdXQpOworCX0KKworCS8qIFRoZSByZWFsIHRoaW5nLiAqLworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJY3ljbGVzX3Qgc3RhcnQsIGVuZDsKKworCQljcnlwdG9fZGlnZXN0X2luaXQodGZtKTsKKworCQlzdGFydCA9IGdldF9jeWNsZXMoKTsKKworCQlmb3IgKHBjb3VudCA9IDA7IHBjb3VudCA8IGJsZW47IHBjb3VudCArPSBwbGVuKSB7CisJCQlzZ19zZXRfYnVmKHNnLCBwICsgcGNvdW50LCBwbGVuKTsKKwkJCWNyeXB0b19kaWdlc3RfdXBkYXRlKHRmbSwgc2csIDEpOworCQl9CisJCWNyeXB0b19kaWdlc3RfZmluYWwodGZtLCBvdXQpOworCisJCWVuZCA9IGdldF9jeWNsZXMoKTsKKworCQljeWNsZXMgKz0gZW5kIC0gc3RhcnQ7CisJfQorCisJbG9jYWxfaXJxX2VuYWJsZSgpOworCWxvY2FsX2JoX2VuYWJsZSgpOworCisJcHJpbnRrKCIlNmx1IGN5Y2xlcy9vcGVyYXRpb24sICU0bHUgY3ljbGVzL2J5dGVcbiIsCisJICAgICAgIGN5Y2xlcyAvIDgsIGN5Y2xlcyAvICg4ICogYmxlbikpOworCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X2RpZ2VzdF9zcGVlZChjaGFyICphbGdvLCB1bnNpZ25lZCBpbnQgc2VjLAorCQkJICAgICAgc3RydWN0IGRpZ2VzdF9zcGVlZCAqc3BlZWQpCit7CisJc3RydWN0IGNyeXB0b190Zm0gKnRmbTsKKwljaGFyIG91dHB1dFsxMDI0XTsKKwlpbnQgaTsKKworCXByaW50aygiXG50ZXN0aW5nIHNwZWVkIG9mICVzXG4iLCBhbGdvKTsKKworCXRmbSA9IGNyeXB0b19hbGxvY190Zm0oYWxnbywgMCk7CisKKwlpZiAodGZtID09IE5VTEwpIHsKKwkJcHJpbnRrKCJmYWlsZWQgdG8gbG9hZCB0cmFuc2Zvcm0gZm9yICVzXG4iLCBhbGdvKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChjcnlwdG9fdGZtX2FsZ19kaWdlc3RzaXplKHRmbSkgPiBzaXplb2Yob3V0cHV0KSkgeworCQlwcmludGsoImRpZ2VzdHNpemUoJXUpID4gb3V0cHV0YnVmZmVyKCV6dSlcbiIsCisJCSAgICAgICBjcnlwdG9fdGZtX2FsZ19kaWdlc3RzaXplKHRmbSksIHNpemVvZihvdXRwdXQpKTsKKwkJZ290byBvdXQ7CisJfQorCisJZm9yIChpID0gMDsgc3BlZWRbaV0uYmxlbiAhPSAwOyBpKyspIHsKKwkJaWYgKHNwZWVkW2ldLmJsZW4gPiBUVk1FTVNJWkUpIHsKKwkJCXByaW50aygidGVtcGxhdGUgKCV1KSB0b28gYmlnIGZvciB0dm1lbSAoJXUpXG4iLAorCQkJICAgICAgIHNwZWVkW2ldLmJsZW4sIFRWTUVNU0laRSk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCXByaW50aygidGVzdCUzdSAoJTV1IGJ5dGUgYmxvY2tzLCU1dSBieXRlcyBwZXIgdXBkYXRlLCU0dSB1cGRhdGVzKTogIiwKKwkJICAgICAgIGksIHNwZWVkW2ldLmJsZW4sIHNwZWVkW2ldLnBsZW4sIHNwZWVkW2ldLmJsZW4gLyBzcGVlZFtpXS5wbGVuKTsKKworCQltZW1zZXQodHZtZW0sIDB4ZmYsIHNwZWVkW2ldLmJsZW4pOworCisJCWlmIChzZWMpCisJCQl0ZXN0X2RpZ2VzdF9qaWZmaWVzKHRmbSwgdHZtZW0sIHNwZWVkW2ldLmJsZW4sIHNwZWVkW2ldLnBsZW4sIG91dHB1dCwgc2VjKTsKKwkJZWxzZQorCQkJdGVzdF9kaWdlc3RfY3ljbGVzKHRmbSwgdHZtZW0sIHNwZWVkW2ldLmJsZW4sIHNwZWVkW2ldLnBsZW4sIG91dHB1dCk7CisJfQorCitvdXQ6CisJY3J5cHRvX2ZyZWVfdGZtKHRmbSk7Cit9CisKIHN0YXRpYyB2b2lkIHRlc3RfZGVmbGF0ZSh2b2lkKQogewogCXVuc2lnbmVkIGludCBpOwpAQCAtMTA4Niw2ICsxMjAyLDYwIEBACiAJCQkJICBkZXNfc3BlZWRfdGVtcGxhdGUpOwogCQlicmVhazsKIAorCWNhc2UgMzAwOgorCQkvKiBmYWxsIHRocm91Z2ggKi8KKworCWNhc2UgMzAxOgorCQl0ZXN0X2RpZ2VzdF9zcGVlZCgibWQ0Iiwgc2VjLCBnZW5lcmljX2RpZ2VzdF9zcGVlZF90ZW1wbGF0ZSk7CisJCWlmIChtb2RlID4gMzAwICYmIG1vZGUgPCA0MDApIGJyZWFrOworCisJY2FzZSAzMDI6CisJCXRlc3RfZGlnZXN0X3NwZWVkKCJtZDUiLCBzZWMsIGdlbmVyaWNfZGlnZXN0X3NwZWVkX3RlbXBsYXRlKTsKKwkJaWYgKG1vZGUgPiAzMDAgJiYgbW9kZSA8IDQwMCkgYnJlYWs7CisKKwljYXNlIDMwMzoKKwkJdGVzdF9kaWdlc3Rfc3BlZWQoInNoYTEiLCBzZWMsIGdlbmVyaWNfZGlnZXN0X3NwZWVkX3RlbXBsYXRlKTsKKwkJaWYgKG1vZGUgPiAzMDAgJiYgbW9kZSA8IDQwMCkgYnJlYWs7CisKKwljYXNlIDMwNDoKKwkJdGVzdF9kaWdlc3Rfc3BlZWQoInNoYTI1NiIsIHNlYywgZ2VuZXJpY19kaWdlc3Rfc3BlZWRfdGVtcGxhdGUpOworCQlpZiAobW9kZSA+IDMwMCAmJiBtb2RlIDwgNDAwKSBicmVhazsKKworCWNhc2UgMzA1OgorCQl0ZXN0X2RpZ2VzdF9zcGVlZCgic2hhMzg0Iiwgc2VjLCBnZW5lcmljX2RpZ2VzdF9zcGVlZF90ZW1wbGF0ZSk7CisJCWlmIChtb2RlID4gMzAwICYmIG1vZGUgPCA0MDApIGJyZWFrOworCisJY2FzZSAzMDY6CisJCXRlc3RfZGlnZXN0X3NwZWVkKCJzaGE1MTIiLCBzZWMsIGdlbmVyaWNfZGlnZXN0X3NwZWVkX3RlbXBsYXRlKTsKKwkJaWYgKG1vZGUgPiAzMDAgJiYgbW9kZSA8IDQwMCkgYnJlYWs7CisKKwljYXNlIDMwNzoKKwkJdGVzdF9kaWdlc3Rfc3BlZWQoIndwMjU2Iiwgc2VjLCBnZW5lcmljX2RpZ2VzdF9zcGVlZF90ZW1wbGF0ZSk7CisJCWlmIChtb2RlID4gMzAwICYmIG1vZGUgPCA0MDApIGJyZWFrOworCisJY2FzZSAzMDg6CisJCXRlc3RfZGlnZXN0X3NwZWVkKCJ3cDM4NCIsIHNlYywgZ2VuZXJpY19kaWdlc3Rfc3BlZWRfdGVtcGxhdGUpOworCQlpZiAobW9kZSA+IDMwMCAmJiBtb2RlIDwgNDAwKSBicmVhazsKKworCWNhc2UgMzA5OgorCQl0ZXN0X2RpZ2VzdF9zcGVlZCgid3A1MTIiLCBzZWMsIGdlbmVyaWNfZGlnZXN0X3NwZWVkX3RlbXBsYXRlKTsKKwkJaWYgKG1vZGUgPiAzMDAgJiYgbW9kZSA8IDQwMCkgYnJlYWs7CisKKwljYXNlIDMxMDoKKwkJdGVzdF9kaWdlc3Rfc3BlZWQoInRncjEyOCIsIHNlYywgZ2VuZXJpY19kaWdlc3Rfc3BlZWRfdGVtcGxhdGUpOworCQlpZiAobW9kZSA+IDMwMCAmJiBtb2RlIDwgNDAwKSBicmVhazsKKworCWNhc2UgMzExOgorCQl0ZXN0X2RpZ2VzdF9zcGVlZCgidGdyMTYwIiwgc2VjLCBnZW5lcmljX2RpZ2VzdF9zcGVlZF90ZW1wbGF0ZSk7CisJCWlmIChtb2RlID4gMzAwICYmIG1vZGUgPCA0MDApIGJyZWFrOworCisJY2FzZSAzMTI6CisJCXRlc3RfZGlnZXN0X3NwZWVkKCJ0Z3IxOTIiLCBzZWMsIGdlbmVyaWNfZGlnZXN0X3NwZWVkX3RlbXBsYXRlKTsKKwkJaWYgKG1vZGUgPiAzMDAgJiYgbW9kZSA8IDQwMCkgYnJlYWs7CisKKwljYXNlIDM5OToKKwkJYnJlYWs7CisKIAljYXNlIDEwMDA6CiAJCXRlc3RfYXZhaWxhYmxlKCk7CiAJCWJyZWFrOwpAQCAtMTExMyw3ICsxMjgzLDE0IEBACiAKIAlrZnJlZSh4YnVmKTsKIAlrZnJlZSh0dm1lbSk7Ci0JcmV0dXJuIDA7CisKKwkvKiBXZSBpbnRlbnRpb25hbHkgcmV0dXJuIC1FQUdBSU4gdG8gcHJldmVudCBrZWVwaW5nCisJICogdGhlIG1vZHVsZS4gSXQgZG9lcyBhbGwgaXRzIHdvcmsgZnJvbSBpbml0KCkKKwkgKiBhbmQgZG9lc24ndCBvZmZlciBhbnkgcnVudGltZSBmdW5jdGlvbmFsaXR5IAorCSAqID0+IHdlIGRvbid0IG5lZWQgaXQgaW4gdGhlIG1lbW9yeSwgZG8gd2U/CisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gbWx1ZHZpZworCSAqLworCXJldHVybiAtRUFHQUlOOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvY3J5cHRvL3RjcnlwdC5oIGIvY3J5cHRvL3RjcnlwdC5oCmluZGV4IDFmNjgzYmEuLjFmYWM1NjAgMTAwNjQ0Ci0tLSBhL2NyeXB0by90Y3J5cHQuaAorKysgYi9jcnlwdG8vdGNyeXB0LmgKQEAgLTY1LDYgKzY1LDExIEBACiAJdW5zaWduZWQgaW50IGJsZW47CiB9OwogCitzdHJ1Y3QgZGlnZXN0X3NwZWVkIHsKKwl1bnNpZ25lZCBpbnQgYmxlbjsJLyogYnVmZmVyIGxlbmd0aCAqLworCXVuc2lnbmVkIGludCBwbGVuOwkvKiBwZXItdXBkYXRlIGxlbmd0aCAqLworfTsKKwogLyoKICAqIE1ENCB0ZXN0IHZlY3RvcnMgZnJvbSBSRkMxMzIwCiAgKi8KQEAgLTI5NzUsNCArMjk4MCwzNSBAQAogCXsgIC5rbGVuID0gMCwgLmJsZW4gPSAwLCB9CiB9OwogCisvKgorICogRGlnZXN0IHNwZWVkIHRlc3RzCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZGlnZXN0X3NwZWVkIGdlbmVyaWNfZGlnZXN0X3NwZWVkX3RlbXBsYXRlW10gPSB7CisJeyAuYmxlbiA9IDE2LCAJLnBsZW4gPSAxNiwgfSwKKwl7IC5ibGVuID0gNjQsCS5wbGVuID0gMTYsIH0sCisJeyAuYmxlbiA9IDY0LAkucGxlbiA9IDY0LCB9LAorCXsgLmJsZW4gPSAyNTYsCS5wbGVuID0gMTYsIH0sCisJeyAuYmxlbiA9IDI1NiwJLnBsZW4gPSA2NCwgfSwKKwl7IC5ibGVuID0gMjU2LAkucGxlbiA9IDI1NiwgfSwKKwl7IC5ibGVuID0gMTAyNCwJLnBsZW4gPSAxNiwgfSwKKwl7IC5ibGVuID0gMTAyNCwJLnBsZW4gPSAyNTYsIH0sCisJeyAuYmxlbiA9IDEwMjQsCS5wbGVuID0gMTAyNCwgfSwKKwl7IC5ibGVuID0gMjA0OCwJLnBsZW4gPSAxNiwgfSwKKwl7IC5ibGVuID0gMjA0OCwJLnBsZW4gPSAyNTYsIH0sCisJeyAuYmxlbiA9IDIwNDgsCS5wbGVuID0gMTAyNCwgfSwKKwl7IC5ibGVuID0gMjA0OCwJLnBsZW4gPSAyMDQ4LCB9LAorCXsgLmJsZW4gPSA0MDk2LAkucGxlbiA9IDE2LCB9LAorCXsgLmJsZW4gPSA0MDk2LAkucGxlbiA9IDI1NiwgfSwKKwl7IC5ibGVuID0gNDA5NiwJLnBsZW4gPSAxMDI0LCB9LAorCXsgLmJsZW4gPSA0MDk2LAkucGxlbiA9IDQwOTYsIH0sCisJeyAuYmxlbiA9IDgxOTIsCS5wbGVuID0gMTYsIH0sCisJeyAuYmxlbiA9IDgxOTIsCS5wbGVuID0gMjU2LCB9LAorCXsgLmJsZW4gPSA4MTkyLAkucGxlbiA9IDEwMjQsIH0sCisJeyAuYmxlbiA9IDgxOTIsCS5wbGVuID0gNDA5NiwgfSwKKwl7IC5ibGVuID0gODE5MiwJLnBsZW4gPSA4MTkyLCB9LAorCisJLyogRW5kIG1hcmtlciAqLworCXsgIC5ibGVuID0gMCwJLnBsZW4gPSAwLCB9Cit9OworCiAjZW5kaWYJLyogX0NSWVBUT19UQ1JZUFRfSCAqLwpkaWZmIC0tZ2l0IGEvY3J5cHRvL3RlYS5jIGIvY3J5cHRvL3RlYS5jCmluZGV4IGE2YTAyYjMuLjUzNjdhZGMgMTAwNjQ0Ci0tLSBhL2NyeXB0by90ZWEuYworKysgYi9jcnlwdG8vdGVhLmMKQEAgLTQ1LDEwICs0NSwxMCBAQAogCXUzMiBLRVlbNF07CiB9OwogCi1zdGF0aWMgaW50IHRlYV9zZXRrZXkodm9pZCAqY3R4X2FyZywgY29uc3QgdTggKmluX2tleSwKLSAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGtleV9sZW4sIHUzMiAqZmxhZ3MpCi17IAotCXN0cnVjdCB0ZWFfY3R4ICpjdHggPSBjdHhfYXJnOworc3RhdGljIGludCB0ZWFfc2V0a2V5KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIGNvbnN0IHU4ICppbl9rZXksCisJCSAgICAgIHVuc2lnbmVkIGludCBrZXlfbGVuLCB1MzIgKmZsYWdzKQoreworCXN0cnVjdCB0ZWFfY3R4ICpjdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOwogCWNvbnN0IF9fbGUzMiAqa2V5ID0gKGNvbnN0IF9fbGUzMiAqKWluX2tleTsKIAkKIAlpZiAoa2V5X2xlbiAhPSAxNikKQEAgLTY2LDEyICs2NiwxMSBAQAogCiB9CiAKLXN0YXRpYyB2b2lkIHRlYV9lbmNyeXB0KHZvaWQgKmN0eF9hcmcsIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpCi17IAorc3RhdGljIHZvaWQgdGVhX2VuY3J5cHQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKmRzdCwgY29uc3QgdTggKnNyYykKK3sKIAl1MzIgeSwgeiwgbiwgc3VtID0gMDsKIAl1MzIgazAsIGsxLCBrMiwgazM7Ci0KLQlzdHJ1Y3QgdGVhX2N0eCAqY3R4ID0gY3R4X2FyZzsKKwlzdHJ1Y3QgdGVhX2N0eCAqY3R4ID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKIAljb25zdCBfX2xlMzIgKmluID0gKGNvbnN0IF9fbGUzMiAqKXNyYzsKIAlfX2xlMzIgKm91dCA9IChfX2xlMzIgKilkc3Q7CiAKQEAgLTk1LDExICs5NCwxMSBAQAogCW91dFsxXSA9IGNwdV90b19sZTMyKHopOwogfQogCi1zdGF0aWMgdm9pZCB0ZWFfZGVjcnlwdCh2b2lkICpjdHhfYXJnLCB1OCAqZHN0LCBjb25zdCB1OCAqc3JjKQoteyAKK3N0YXRpYyB2b2lkIHRlYV9kZWNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpCit7CiAJdTMyIHksIHosIG4sIHN1bTsKIAl1MzIgazAsIGsxLCBrMiwgazM7Ci0Jc3RydWN0IHRlYV9jdHggKmN0eCA9IGN0eF9hcmc7CisJc3RydWN0IHRlYV9jdHggKmN0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7CiAJY29uc3QgX19sZTMyICppbiA9IChjb25zdCBfX2xlMzIgKilzcmM7CiAJX19sZTMyICpvdXQgPSAoX19sZTMyICopZHN0OwogCkBAIC0xMjUsMTAgKzEyNCwxMCBAQAogCW91dFsxXSA9IGNwdV90b19sZTMyKHopOwogfQogCi1zdGF0aWMgaW50IHh0ZWFfc2V0a2V5KHZvaWQgKmN0eF9hcmcsIGNvbnN0IHU4ICppbl9rZXksCi0gICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBrZXlfbGVuLCB1MzIgKmZsYWdzKQoteyAKLQlzdHJ1Y3QgeHRlYV9jdHggKmN0eCA9IGN0eF9hcmc7CitzdGF0aWMgaW50IHh0ZWFfc2V0a2V5KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIGNvbnN0IHU4ICppbl9rZXksCisJCSAgICAgICB1bnNpZ25lZCBpbnQga2V5X2xlbiwgdTMyICpmbGFncykKK3sKKwlzdHJ1Y3QgeHRlYV9jdHggKmN0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7CiAJY29uc3QgX19sZTMyICprZXkgPSAoY29uc3QgX19sZTMyICopaW5fa2V5OwogCQogCWlmIChrZXlfbGVuICE9IDE2KQpAQCAtMTQ2LDEyICsxNDUsMTEgQEAKIAogfQogCi1zdGF0aWMgdm9pZCB4dGVhX2VuY3J5cHQodm9pZCAqY3R4X2FyZywgdTggKmRzdCwgY29uc3QgdTggKnNyYykKLXsgCitzdGF0aWMgdm9pZCB4dGVhX2VuY3J5cHQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKmRzdCwgY29uc3QgdTggKnNyYykKK3sKIAl1MzIgeSwgeiwgc3VtID0gMDsKIAl1MzIgbGltaXQgPSBYVEVBX0RFTFRBICogWFRFQV9ST1VORFM7Ci0KLQlzdHJ1Y3QgeHRlYV9jdHggKmN0eCA9IGN0eF9hcmc7CisJc3RydWN0IHh0ZWFfY3R4ICpjdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOwogCWNvbnN0IF9fbGUzMiAqaW4gPSAoY29uc3QgX19sZTMyICopc3JjOwogCV9fbGUzMiAqb3V0ID0gKF9fbGUzMiAqKWRzdDsKIApAQCAtMTY4LDEwICsxNjYsMTAgQEAKIAlvdXRbMV0gPSBjcHVfdG9fbGUzMih6KTsKIH0KIAotc3RhdGljIHZvaWQgeHRlYV9kZWNyeXB0KHZvaWQgKmN0eF9hcmcsIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpCi17IAorc3RhdGljIHZvaWQgeHRlYV9kZWNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpCit7CiAJdTMyIHksIHosIHN1bTsKLQlzdHJ1Y3QgdGVhX2N0eCAqY3R4ID0gY3R4X2FyZzsKKwlzdHJ1Y3QgdGVhX2N0eCAqY3R4ID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKIAljb25zdCBfX2xlMzIgKmluID0gKGNvbnN0IF9fbGUzMiAqKXNyYzsKIAlfX2xlMzIgKm91dCA9IChfX2xlMzIgKilkc3Q7CiAKQEAgLTE5MSwxMiArMTg5LDExIEBACiB9CiAKIAotc3RhdGljIHZvaWQgeGV0YV9lbmNyeXB0KHZvaWQgKmN0eF9hcmcsIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpCi17IAorc3RhdGljIHZvaWQgeGV0YV9lbmNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpCit7CiAJdTMyIHksIHosIHN1bSA9IDA7CiAJdTMyIGxpbWl0ID0gWFRFQV9ERUxUQSAqIFhURUFfUk9VTkRTOwotCi0Jc3RydWN0IHh0ZWFfY3R4ICpjdHggPSBjdHhfYXJnOworCXN0cnVjdCB4dGVhX2N0eCAqY3R4ID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKIAljb25zdCBfX2xlMzIgKmluID0gKGNvbnN0IF9fbGUzMiAqKXNyYzsKIAlfX2xlMzIgKm91dCA9IChfX2xlMzIgKilkc3Q7CiAKQEAgLTIxMywxMCArMjEwLDEwIEBACiAJb3V0WzFdID0gY3B1X3RvX2xlMzIoeik7CiB9CiAKLXN0YXRpYyB2b2lkIHhldGFfZGVjcnlwdCh2b2lkICpjdHhfYXJnLCB1OCAqZHN0LCBjb25zdCB1OCAqc3JjKQoteyAKK3N0YXRpYyB2b2lkIHhldGFfZGVjcnlwdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqZHN0LCBjb25zdCB1OCAqc3JjKQorewogCXUzMiB5LCB6LCBzdW07Ci0Jc3RydWN0IHRlYV9jdHggKmN0eCA9IGN0eF9hcmc7CisJc3RydWN0IHRlYV9jdHggKmN0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7CiAJY29uc3QgX19sZTMyICppbiA9IChjb25zdCBfX2xlMzIgKilzcmM7CiAJX19sZTMyICpvdXQgPSAoX19sZTMyICopZHN0OwogCmRpZmYgLS1naXQgYS9jcnlwdG8vdGdyMTkyLmMgYi9jcnlwdG8vdGdyMTkyLmMKaW5kZXggMmQ4ZTQ0Zi4uYTBmYWRmMyAxMDA2NDQKLS0tIGEvY3J5cHRvL3RncjE5Mi5jCisrKyBiL2NyeXB0by90Z3IxOTIuYwpAQCAtNDk2LDExICs0OTYsMTAgQEAKIAl0Y3R4LT5jID0gYzsKIH0KIAotc3RhdGljIHZvaWQgdGdyMTkyX2luaXQodm9pZCAqY3R4KQorc3RhdGljIHZvaWQgdGdyMTkyX2luaXQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKIHsKLQlzdHJ1Y3QgdGdyMTkyX2N0eCAqdGN0eCA9IGN0eDsKKwlzdHJ1Y3QgdGdyMTkyX2N0eCAqdGN0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7CiAKLQltZW1zZXQgKHRjdHgtPmhhc2gsIDAsIDY0KTsKIAl0Y3R4LT5hID0gMHgwMTIzNDU2Nzg5YWJjZGVmVUxMOwogCXRjdHgtPmIgPSAweGZlZGNiYTk4NzY1NDMyMTBVTEw7CiAJdGN0eC0+YyA9IDB4ZjA5NmE1YjRjM2IyZTE4N1VMTDsKQEAgLTUxMSw5ICs1MTAsMTAgQEAKIAogLyogVXBkYXRlIHRoZSBtZXNzYWdlIGRpZ2VzdCB3aXRoIHRoZSBjb250ZW50cwogICogb2YgSU5CVUYgd2l0aCBsZW5ndGggSU5MRU4uICovCi1zdGF0aWMgdm9pZCB0Z3IxOTJfdXBkYXRlKHZvaWQgKmN0eCwgY29uc3QgdTggKiBpbmJ1ZiwgdW5zaWduZWQgaW50IGxlbikKK3N0YXRpYyB2b2lkIHRncjE5Ml91cGRhdGUoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgY29uc3QgdTggKmluYnVmLAorCQkJICB1bnNpZ25lZCBpbnQgbGVuKQogewotCXN0cnVjdCB0Z3IxOTJfY3R4ICp0Y3R4ID0gY3R4OworCXN0cnVjdCB0Z3IxOTJfY3R4ICp0Y3R4ID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKIAogCWlmICh0Y3R4LT5jb3VudCA9PSA2NCkgewkvKiBmbHVzaCB0aGUgYnVmZmVyICovCiAJCXRncjE5Ml90cmFuc2Zvcm0odGN0eCwgdGN0eC0+aGFzaCk7CkBAIC01MjcsNyArNTI3LDcgQEAKIAkJZm9yICg7IGxlbiAmJiB0Y3R4LT5jb3VudCA8IDY0OyBsZW4tLSkgewogCQkJdGN0eC0+aGFzaFt0Y3R4LT5jb3VudCsrXSA9ICppbmJ1ZisrOwogCQl9Ci0JCXRncjE5Ml91cGRhdGUodGN0eCwgTlVMTCwgMCk7CisJCXRncjE5Ml91cGRhdGUodGZtLCBOVUxMLCAwKTsKIAkJaWYgKCFsZW4pIHsKIAkJCXJldHVybjsKIAkJfQpAQCAtNTQ5LDE1ICs1NDksMTUgQEAKIAogCiAvKiBUaGUgcm91dGluZSB0ZXJtaW5hdGVzIHRoZSBjb21wdXRhdGlvbiAqLwotc3RhdGljIHZvaWQgdGdyMTkyX2ZpbmFsKHZvaWQgKmN0eCwgdTggKiBvdXQpCitzdGF0aWMgdm9pZCB0Z3IxOTJfZmluYWwoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKiBvdXQpCiB7Ci0Jc3RydWN0IHRncjE5Ml9jdHggKnRjdHggPSBjdHg7CisJc3RydWN0IHRncjE5Ml9jdHggKnRjdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOwogCV9fYmU2NCAqZHN0ID0gKF9fYmU2NCAqKW91dDsKIAlfX2JlNjQgKmJlNjRwOwogCV9fbGUzMiAqbGUzMnA7CiAJdTMyIHQsIG1zYiwgbHNiOwogCi0JdGdyMTkyX3VwZGF0ZSh0Y3R4LCBOVUxMLCAwKTsgLyogZmx1c2ggKi8gOworCXRncjE5Ml91cGRhdGUodGZtLCBOVUxMLCAwKTsgLyogZmx1c2ggKi8gOwogCiAJbXNiID0gMDsKIAl0ID0gdGN0eC0+bmJsb2NrczsKQEAgLTU4NSw3ICs1ODUsNyBAQAogCQl3aGlsZSAodGN0eC0+Y291bnQgPCA2NCkgewogCQkJdGN0eC0+aGFzaFt0Y3R4LT5jb3VudCsrXSA9IDA7CiAJCX0KLQkJdGdyMTkyX3VwZGF0ZSh0Y3R4LCBOVUxMLCAwKTsgLyogZmx1c2ggKi8gOworCQl0Z3IxOTJfdXBkYXRlKHRmbSwgTlVMTCwgMCk7IC8qIGZsdXNoICovIDsKIAkJbWVtc2V0KHRjdHgtPmhhc2gsIDAsIDU2KTsgICAgLyogZmlsbCBuZXh0IGJsb2NrIHdpdGggemVyb2VzICovCiAJfQogCS8qIGFwcGVuZCB0aGUgNjQgYml0IGNvdW50ICovCkBAIC02MDEsMjIgKzYwMSwyMCBAQAogCWRzdFsyXSA9IGJlNjRwWzJdID0gY3B1X3RvX2JlNjQodGN0eC0+Yyk7CiB9CiAKLXN0YXRpYyB2b2lkIHRncjE2MF9maW5hbCh2b2lkICpjdHgsIHU4ICogb3V0KQorc3RhdGljIHZvaWQgdGdyMTYwX2ZpbmFsKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICogb3V0KQogewotCXN0cnVjdCB0Z3IxOTJfY3R4ICp3Y3R4ID0gY3R4OwogCXU4IERbNjRdOwogCi0JdGdyMTkyX2ZpbmFsKHdjdHgsIEQpOworCXRncjE5Ml9maW5hbCh0Zm0sIEQpOwogCW1lbWNweShvdXQsIEQsIFRHUjE2MF9ESUdFU1RfU0laRSk7CiAJbWVtc2V0KEQsIDAsIFRHUjE5Ml9ESUdFU1RfU0laRSk7CiB9CiAKLXN0YXRpYyB2b2lkIHRncjEyOF9maW5hbCh2b2lkICpjdHgsIHU4ICogb3V0KQorc3RhdGljIHZvaWQgdGdyMTI4X2ZpbmFsKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICogb3V0KQogewotCXN0cnVjdCB0Z3IxOTJfY3R4ICp3Y3R4ID0gY3R4OwogCXU4IERbNjRdOwogCi0JdGdyMTkyX2ZpbmFsKHdjdHgsIEQpOworCXRncjE5Ml9maW5hbCh0Zm0sIEQpOwogCW1lbWNweShvdXQsIEQsIFRHUjEyOF9ESUdFU1RfU0laRSk7CiAJbWVtc2V0KEQsIDAsIFRHUjE5Ml9ESUdFU1RfU0laRSk7CiB9CkBAIC02MjcsNiArNjI1LDcgQEAKIAkuY3JhX2Jsb2Nrc2l6ZSA9IFRHUjE5Ml9CTE9DS19TSVpFLAogCS5jcmFfY3R4c2l6ZSA9IHNpemVvZihzdHJ1Y3QgdGdyMTkyX2N0eCksCiAJLmNyYV9tb2R1bGUgPSBUSElTX01PRFVMRSwKKwkuY3JhX2FsaWdubWFzayA9IDcsCiAJLmNyYV9saXN0ID0gTElTVF9IRUFEX0lOSVQodGdyMTkyLmNyYV9saXN0KSwKIAkuY3JhX3UgPSB7LmRpZ2VzdCA9IHsKIAkJCSAgICAgLmRpYV9kaWdlc3RzaXplID0gVEdSMTkyX0RJR0VTVF9TSVpFLApAQCAtNjQxLDYgKzY0MCw3IEBACiAJLmNyYV9ibG9ja3NpemUgPSBUR1IxOTJfQkxPQ0tfU0laRSwKIAkuY3JhX2N0eHNpemUgPSBzaXplb2Yoc3RydWN0IHRncjE5Ml9jdHgpLAogCS5jcmFfbW9kdWxlID0gVEhJU19NT0RVTEUsCisJLmNyYV9hbGlnbm1hc2sgPSA3LAogCS5jcmFfbGlzdCA9IExJU1RfSEVBRF9JTklUKHRncjE2MC5jcmFfbGlzdCksCiAJLmNyYV91ID0gey5kaWdlc3QgPSB7CiAJCQkgICAgIC5kaWFfZGlnZXN0c2l6ZSA9IFRHUjE2MF9ESUdFU1RfU0laRSwKQEAgLTY1NSw2ICs2NTUsNyBAQAogCS5jcmFfYmxvY2tzaXplID0gVEdSMTkyX0JMT0NLX1NJWkUsCiAJLmNyYV9jdHhzaXplID0gc2l6ZW9mKHN0cnVjdCB0Z3IxOTJfY3R4KSwKIAkuY3JhX21vZHVsZSA9IFRISVNfTU9EVUxFLAorCS5jcmFfYWxpZ25tYXNrID0gNywKIAkuY3JhX2xpc3QgPSBMSVNUX0hFQURfSU5JVCh0Z3IxMjguY3JhX2xpc3QpLAogCS5jcmFfdSA9IHsuZGlnZXN0ID0gewogCQkJICAgICAuZGlhX2RpZ2VzdHNpemUgPSBUR1IxMjhfRElHRVNUX1NJWkUsCmRpZmYgLS1naXQgYS9jcnlwdG8vdHdvZmlzaC5jIGIvY3J5cHRvL3R3b2Zpc2guYwppbmRleCBkZGZkNWEzLi5lYzI0ODgyIDEwMDY0NAotLS0gYS9jcnlwdG8vdHdvZmlzaC5jCisrKyBiL2NyeXB0by90d29maXNoLmMKQEAgLTY0MywxMSArNjQzLDExIEBACiB9OwogCiAvKiBQZXJmb3JtIHRoZSBrZXkgc2V0dXAuICovCi1zdGF0aWMgaW50IHR3b2Zpc2hfc2V0a2V5KHZvaWQgKmN4LCBjb25zdCB1OCAqa2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQga2V5X2xlbiwgdTMyICpmbGFncykKK3N0YXRpYyBpbnQgdHdvZmlzaF9zZXRrZXkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgY29uc3QgdTggKmtleSwKKwkJCSAgdW5zaWduZWQgaW50IGtleV9sZW4sIHUzMiAqZmxhZ3MpCiB7CiAJCi0Jc3RydWN0IHR3b2Zpc2hfY3R4ICpjdHggPSBjeDsKKwlzdHJ1Y3QgdHdvZmlzaF9jdHggKmN0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7CiAKIAlpbnQgaSwgaiwgazsKIApAQCAtODAyLDkgKzgwMiw5IEBACiB9CiAKIC8qIEVuY3J5cHQgb25lIGJsb2NrLiAgaW4gYW5kIG91dCBtYXkgYmUgdGhlIHNhbWUuICovCi1zdGF0aWMgdm9pZCB0d29maXNoX2VuY3J5cHQodm9pZCAqY3gsIHU4ICpvdXQsIGNvbnN0IHU4ICppbikKK3N0YXRpYyB2b2lkIHR3b2Zpc2hfZW5jcnlwdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqb3V0LCBjb25zdCB1OCAqaW4pCiB7Ci0Jc3RydWN0IHR3b2Zpc2hfY3R4ICpjdHggPSBjeDsKKwlzdHJ1Y3QgdHdvZmlzaF9jdHggKmN0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7CiAJY29uc3QgX19sZTMyICpzcmMgPSAoY29uc3QgX19sZTMyICopaW47CiAJX19sZTMyICpkc3QgPSAoX19sZTMyICopb3V0OwogCkBAIC04MzksOSArODM5LDkgQEAKIH0KIAogLyogRGVjcnlwdCBvbmUgYmxvY2suICBpbiBhbmQgb3V0IG1heSBiZSB0aGUgc2FtZS4gKi8KLXN0YXRpYyB2b2lkIHR3b2Zpc2hfZGVjcnlwdCh2b2lkICpjeCwgdTggKm91dCwgY29uc3QgdTggKmluKQorc3RhdGljIHZvaWQgdHdvZmlzaF9kZWNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpvdXQsIGNvbnN0IHU4ICppbikKIHsKLQlzdHJ1Y3QgdHdvZmlzaF9jdHggKmN0eCA9IGN4OworCXN0cnVjdCB0d29maXNoX2N0eCAqY3R4ID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKIAljb25zdCBfX2xlMzIgKnNyYyA9IChjb25zdCBfX2xlMzIgKilpbjsKIAlfX2xlMzIgKmRzdCA9IChfX2xlMzIgKilvdXQ7CiAgIApkaWZmIC0tZ2l0IGEvY3J5cHRvL3dwNTEyLmMgYi9jcnlwdG8vd3A1MTIuYwppbmRleCBiMjI2YTEyLi43MjdkMDVhIDEwMDY0NAotLS0gYS9jcnlwdG8vd3A1MTIuYworKysgYi9jcnlwdG8vd3A1MTIuYwpAQCAtOTgxLDkgKzk4MSw5IEBACiAKIH0KIAotc3RhdGljIHZvaWQgd3A1MTJfaW5pdCAodm9pZCAqY3R4KSB7CitzdGF0aWMgdm9pZCB3cDUxMl9pbml0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pIHsKKwlzdHJ1Y3Qgd3A1MTJfY3R4ICp3Y3R4ID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKIAlpbnQgaTsKLQlzdHJ1Y3Qgd3A1MTJfY3R4ICp3Y3R4ID0gY3R4OwogCiAJbWVtc2V0KHdjdHgtPmJpdExlbmd0aCwgMCwgMzIpOwogCXdjdHgtPmJ1ZmZlckJpdHMgPSB3Y3R4LT5idWZmZXJQb3MgPSAwOwpAQCAtOTkzLDEwICs5OTMsMTAgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIHdwNTEyX3VwZGF0ZSh2b2lkICpjdHgsIGNvbnN0IHU4ICpzb3VyY2UsIHVuc2lnbmVkIGludCBsZW4pCitzdGF0aWMgdm9pZCB3cDUxMl91cGRhdGUoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgY29uc3QgdTggKnNvdXJjZSwKKwkJCSB1bnNpZ25lZCBpbnQgbGVuKQogewotCi0Jc3RydWN0IHdwNTEyX2N0eCAqd2N0eCA9IGN0eDsKKwlzdHJ1Y3Qgd3A1MTJfY3R4ICp3Y3R4ID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKIAlpbnQgc291cmNlUG9zICAgID0gMDsKIAl1bnNpZ25lZCBpbnQgYml0c19sZW4gPSBsZW4gKiA4OyAvLyBjb252ZXJ0IHRvIG51bWJlciBvZiBiaXRzCiAJaW50IHNvdXJjZUdhcCAgICA9ICg4IC0gKChpbnQpYml0c19sZW4gJiA3KSkgJiA3OwpAQCAtMTA1NCw5ICsxMDU0LDkgQEAKIAogfQogCi1zdGF0aWMgdm9pZCB3cDUxMl9maW5hbCh2b2lkICpjdHgsIHU4ICpvdXQpCitzdGF0aWMgdm9pZCB3cDUxMl9maW5hbChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqb3V0KQogewotCXN0cnVjdCB3cDUxMl9jdHggKndjdHggPSBjdHg7CisJc3RydWN0IHdwNTEyX2N0eCAqd2N0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7CiAJaW50IGk7CiAgICAJdTggKmJ1ZmZlciAgICAgID0gd2N0eC0+YnVmZmVyOwogICAgCXU4ICpiaXRMZW5ndGggICA9IHdjdHgtPmJpdExlbmd0aDsKQEAgLTEwODcsMjIgKzEwODcsMjAgQEAKICAgIAl3Y3R4LT5idWZmZXJQb3MgICAgPSBidWZmZXJQb3M7CiB9CiAKLXN0YXRpYyB2b2lkIHdwMzg0X2ZpbmFsKHZvaWQgKmN0eCwgdTggKm91dCkKK3N0YXRpYyB2b2lkIHdwMzg0X2ZpbmFsKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpvdXQpCiB7Ci0Jc3RydWN0IHdwNTEyX2N0eCAqd2N0eCA9IGN0eDsKIAl1OCBEWzY0XTsKIAotCXdwNTEyX2ZpbmFsICh3Y3R4LCBEKTsKKwl3cDUxMl9maW5hbCh0Zm0sIEQpOwogCW1lbWNweSAob3V0LCBELCBXUDM4NF9ESUdFU1RfU0laRSk7CiAJbWVtc2V0IChELCAwLCBXUDUxMl9ESUdFU1RfU0laRSk7CiB9CiAKLXN0YXRpYyB2b2lkIHdwMjU2X2ZpbmFsKHZvaWQgKmN0eCwgdTggKm91dCkKK3N0YXRpYyB2b2lkIHdwMjU2X2ZpbmFsKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpvdXQpCiB7Ci0Jc3RydWN0IHdwNTEyX2N0eCAqd2N0eCA9IGN0eDsKIAl1OCBEWzY0XTsKIAotCXdwNTEyX2ZpbmFsICh3Y3R4LCBEKTsKKwl3cDUxMl9maW5hbCh0Zm0sIEQpOwogCW1lbWNweSAob3V0LCBELCBXUDI1Nl9ESUdFU1RfU0laRSk7CiAJbWVtc2V0IChELCAwLCBXUDUxMl9ESUdFU1RfU0laRSk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL01ha2VmaWxlIGIvZHJpdmVycy9NYWtlZmlsZQppbmRleCAzYzUxNzAzLi5mYzJkNzQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvTWFrZWZpbGUKQEAgLTc0LDQgKzc0LDUgQEAKIG9iai15CQkJCSs9IGZpcm13YXJlLwogb2JqLSQoQ09ORklHX0NSWVBUTykJCSs9IGNyeXB0by8KIG9iai0kKENPTkZJR19TVVBFUkgpCQkrPSBzaC8KK29iai0kKENPTkZJR19HRU5FUklDX1RJTUUpCSs9IGNsb2Nrc291cmNlLwogb2JqLSQoQ09ORklHX0RNQV9FTkdJTkUpCSs9IGRtYS8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfaWRsZS5jIGIvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9pZGxlLmMKaW5kZXggM2I5N2E1ZS4uOGE3NGJmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9pZGxlLmMKKysrIGIvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9pZGxlLmMKQEAgLTIwNiwxMSArMjA2LDExIEBACiAKIHN0YXRpYyB2b2lkIGFjcGlfc2FmZV9oYWx0KHZvaWQpCiB7Ci0JY2xlYXJfdGhyZWFkX2ZsYWcoVElGX1BPTExJTkdfTlJGTEFHKTsKKwljdXJyZW50X3RocmVhZF9pbmZvKCktPnN0YXR1cyAmPSB+VFNfUE9MTElORzsKIAlzbXBfbWJfX2FmdGVyX2NsZWFyX2JpdCgpOwogCWlmICghbmVlZF9yZXNjaGVkKCkpCiAJCXNhZmVfaGFsdCgpOwotCXNldF90aHJlYWRfZmxhZyhUSUZfUE9MTElOR19OUkZMQUcpOworCWN1cnJlbnRfdGhyZWFkX2luZm8oKS0+c3RhdHVzIHw9IFRTX1BPTExJTkc7CiB9CiAKIHN0YXRpYyBhdG9taWNfdCBjM19jcHVfY291bnQ7CkBAIC0zMzAsMTAgKzMzMCwxMCBAQAogCSAqIEludm9rZSB0aGUgY3VycmVudCBDeCBzdGF0ZSB0byBwdXQgdGhlIHByb2Nlc3NvciB0byBzbGVlcC4KIAkgKi8KIAlpZiAoY3gtPnR5cGUgPT0gQUNQSV9TVEFURV9DMiB8fCBjeC0+dHlwZSA9PSBBQ1BJX1NUQVRFX0MzKSB7Ci0JCWNsZWFyX3RocmVhZF9mbGFnKFRJRl9QT0xMSU5HX05SRkxBRyk7CisJCWN1cnJlbnRfdGhyZWFkX2luZm8oKS0+c3RhdHVzICY9IH5UU19QT0xMSU5HOwogCQlzbXBfbWJfX2FmdGVyX2NsZWFyX2JpdCgpOwogCQlpZiAobmVlZF9yZXNjaGVkKCkpIHsKLQkJCXNldF90aHJlYWRfZmxhZyhUSUZfUE9MTElOR19OUkZMQUcpOworCQkJY3VycmVudF90aHJlYWRfaW5mbygpLT5zdGF0dXMgfD0gVFNfUE9MTElORzsKIAkJCWxvY2FsX2lycV9lbmFibGUoKTsKIAkJCXJldHVybjsKIAkJfQpAQCAtMzY5LDkgKzM2OSwxNCBAQAogCQl0MiA9IGlubChhY3BpX2ZhZHQueHBtX3Rtcl9ibGsuYWRkcmVzcyk7CiAJCS8qIEdldCBlbmQgdGltZSAodGlja3MpICovCiAJCXQyID0gaW5sKGFjcGlfZmFkdC54cG1fdG1yX2Jsay5hZGRyZXNzKTsKKworI2lmZGVmIENPTkZJR19HRU5FUklDX1RJTUUKKwkJLyogVFNDIGhhbHRzIGluIEMyLCBzbyBub3RpZnkgdXNlcnMgKi8KKwkJbWFya190c2NfdW5zdGFibGUoKTsKKyNlbmRpZgogCQkvKiBSZS1lbmFibGUgaW50ZXJydXB0cyAqLwogCQlsb2NhbF9pcnFfZW5hYmxlKCk7Ci0JCXNldF90aHJlYWRfZmxhZyhUSUZfUE9MTElOR19OUkZMQUcpOworCQljdXJyZW50X3RocmVhZF9pbmZvKCktPnN0YXR1cyB8PSBUU19QT0xMSU5HOwogCQkvKiBDb21wdXRlIHRpbWUgKHRpY2tzKSB0aGF0IHdlIHdlcmUgYWN0dWFsbHkgYXNsZWVwICovCiAJCXNsZWVwX3RpY2tzID0KIAkJICAgIHRpY2tzX2VsYXBzZWQodDEsIHQyKSAtIGN4LT5sYXRlbmN5X3RpY2tzIC0gQzJfT1ZFUkhFQUQ7CkBAIC00MDksOSArNDE0LDEzIEBACiAJCQkJCSAgQUNQSV9NVFhfRE9fTk9UX0xPQ0spOwogCQl9CiAKKyNpZmRlZiBDT05GSUdfR0VORVJJQ19USU1FCisJCS8qIFRTQyBoYWx0cyBpbiBDMywgc28gbm90aWZ5IHVzZXJzICovCisJCW1hcmtfdHNjX3Vuc3RhYmxlKCk7CisjZW5kaWYKIAkJLyogUmUtZW5hYmxlIGludGVycnVwdHMgKi8KIAkJbG9jYWxfaXJxX2VuYWJsZSgpOwotCQlzZXRfdGhyZWFkX2ZsYWcoVElGX1BPTExJTkdfTlJGTEFHKTsKKwkJY3VycmVudF90aHJlYWRfaW5mbygpLT5zdGF0dXMgfD0gVFNfUE9MTElORzsKIAkJLyogQ29tcHV0ZSB0aW1lICh0aWNrcykgdGhhdCB3ZSB3ZXJlIGFjdHVhbGx5IGFzbGVlcCAqLwogCQlzbGVlcF90aWNrcyA9CiAJCSAgICB0aWNrc19lbGFwc2VkKHQxLCB0MikgLSBjeC0+bGF0ZW5jeV90aWNrcyAtIEMzX09WRVJIRUFEOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdG0vZmlyZXN0cmVhbS5jIGIvZHJpdmVycy9hdG0vZmlyZXN0cmVhbS5jCmluZGV4IDdmN2VjMjguLmYyZWVhZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRtL2ZpcmVzdHJlYW0uYworKysgYi9kcml2ZXJzL2F0bS9maXJlc3RyZWFtLmMKQEAgLTk1MSw3ICs5NTEsNyBAQAogCQkgICBpdCBtb3N0IGxpa2VseSB0aGF0IHRoZSBjaGlwIHdpbGwgbm90aWNlIGl0LiBJdCBhbHNvIHByZXZlbnRzIHVzCiAJCSAgIGZyb20gaGF2aW5nIHRvIHdhaXQgZm9yIGNvbXBsZXRpb24uIE9uIHRoZSBvdGhlciBoYW5kLCB3ZSBtYXkKIAkJICAgbmVlZCB0byB3YWl0IGZvciBjb21wbGV0aW9uIGFueXdheSwgdG8gc2VlIGlmIGl0IGNvbXBsZXRlZAotCQkgICBzdWNjZXNmdWxseS4gKi8KKwkJICAgc3VjY2Vzc2Z1bGx5LiAqLwogCiAJCXN3aXRjaCAoYXRtX3ZjYy0+cW9zLmFhbCkgewogCQljYXNlIEFUTV9BQUwyOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3Bvd2VyL3Jlc3VtZS5jIGIvZHJpdmVycy9iYXNlL3Bvd2VyL3Jlc3VtZS5jCmluZGV4IDUyMDY3OWMuLjgyNjA5M2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9wb3dlci9yZXN1bWUuYworKysgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvcmVzdW1lLmMKQEAgLTUzLDggKzUzLDcgQEAKIAkJc3RydWN0IGRldmljZSAqIGRldiA9IHRvX2RldmljZShlbnRyeSk7CiAKIAkJZ2V0X2RldmljZShkZXYpOwotCQlsaXN0X2RlbF9pbml0KGVudHJ5KTsKLQkJbGlzdF9hZGRfdGFpbChlbnRyeSwgJmRwbV9hY3RpdmUpOworCQlsaXN0X21vdmVfdGFpbChlbnRyeSwgJmRwbV9hY3RpdmUpOwogCiAJCXVwKCZkcG1fbGlzdF9zZW0pOwogCQlpZiAoIWRldi0+cG93ZXIucHJldl9zdGF0ZS5ldmVudCkKQEAgLTEwMSw4ICsxMDAsNyBAQAogCQlzdHJ1Y3QgZGV2aWNlICogZGV2ID0gdG9fZGV2aWNlKGVudHJ5KTsKIAogCQlnZXRfZGV2aWNlKGRldik7Ci0JCWxpc3RfZGVsX2luaXQoZW50cnkpOwotCQlsaXN0X2FkZF90YWlsKGVudHJ5LCAmZHBtX2FjdGl2ZSk7CisJCWxpc3RfbW92ZV90YWlsKGVudHJ5LCAmZHBtX2FjdGl2ZSk7CiAJCXJlc3VtZV9kZXZpY2UoZGV2KTsKIAkJcHV0X2RldmljZShkZXYpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9wb3dlci9zdXNwZW5kLmMgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvc3VzcGVuZC5jCmluZGV4IDFhMWZlNDMuLjY5NTA5ZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9wb3dlci9zdXNwZW5kLmMKKysrIGIvZHJpdmVycy9iYXNlL3Bvd2VyL3N1c3BlbmQuYwpAQCAtMTE2LDEyICsxMTYsMTAgQEAKIAkJLyogQ2hlY2sgaWYgdGhlIGRldmljZSBnb3QgcmVtb3ZlZCAqLwogCQlpZiAoIWxpc3RfZW1wdHkoJmRldi0+cG93ZXIuZW50cnkpKSB7CiAJCQkvKiBNb3ZlIGl0IHRvIHRoZSBkcG1fb2ZmIG9yIGRwbV9vZmZfaXJxIGxpc3QgKi8KLQkJCWlmICghZXJyb3IpIHsKLQkJCQlsaXN0X2RlbCgmZGV2LT5wb3dlci5lbnRyeSk7Ci0JCQkJbGlzdF9hZGQoJmRldi0+cG93ZXIuZW50cnksICZkcG1fb2ZmKTsKLQkJCX0gZWxzZSBpZiAoZXJyb3IgPT0gLUVBR0FJTikgewotCQkJCWxpc3RfZGVsKCZkZXYtPnBvd2VyLmVudHJ5KTsKLQkJCQlsaXN0X2FkZCgmZGV2LT5wb3dlci5lbnRyeSwgJmRwbV9vZmZfaXJxKTsKKwkJCWlmICghZXJyb3IpCisJCQkJbGlzdF9tb3ZlKCZkZXYtPnBvd2VyLmVudHJ5LCAmZHBtX29mZik7CisJCQllbHNlIGlmIChlcnJvciA9PSAtRUFHQUlOKSB7CisJCQkJbGlzdF9tb3ZlKCZkZXYtPnBvd2VyLmVudHJ5LCAmZHBtX29mZl9pcnEpOwogCQkJCWVycm9yID0gMDsKIAkJCX0KIAkJfQpAQCAtMTM5LDggKzEzNyw3IEBACiAJCSAqLwogCQl3aGlsZSAoIWxpc3RfZW1wdHkoJmRwbV9vZmZfaXJxKSkgewogCQkJc3RydWN0IGxpc3RfaGVhZCAqIGVudHJ5ID0gZHBtX29mZl9pcnEubmV4dDsKLQkJCWxpc3RfZGVsKGVudHJ5KTsKLQkJCWxpc3RfYWRkKGVudHJ5LCAmZHBtX29mZik7CisJCQlsaXN0X21vdmUoZW50cnksICZkcG1fb2ZmKTsKIAkJfQogCQlkcG1fcmVzdW1lKCk7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9hbWlmbG9wLmMgYi9kcml2ZXJzL2Jsb2NrL2FtaWZsb3AuYwppbmRleCAyYThhZjY4Li4yNjQxNTk3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2FtaWZsb3AuYworKysgYi9kcml2ZXJzL2Jsb2NrL2FtaWZsb3AuYwpAQCAtNjQsNiArNjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvZWxldmF0b3IuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KIAogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2NjaXNzLmMgYi9kcml2ZXJzL2Jsb2NrL2NjaXNzLmMKaW5kZXggMjVjM2M0YS4uMzliMGY1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9jY2lzcy5jCisrKyBiL2RyaXZlcnMvYmxvY2svY2Npc3MuYwpAQCAtMzQsNyArMzQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Jsa3BnLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPiAKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaGRyZWcuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgpAQCAtNjQsMTQzICs2NCwxMjkgQEAKIAogLyogZGVmaW5lIHRoZSBQQ0kgaW5mbyBmb3IgdGhlIGNhcmRzIHdlIGNhbiBjb250cm9sICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgY2Npc3NfcGNpX2RldmljZV9pZFtdID0gewotCXsgUENJX1ZFTkRPUl9JRF9DT01QQVEsIFBDSV9ERVZJQ0VfSURfQ09NUEFRX0NJU1MsCi0JCQkweDBFMTEsIDB4NDA3MCwgMCwgMCwgMH0sCi0JeyBQQ0lfVkVORE9SX0lEX0NPTVBBUSwgUENJX0RFVklDRV9JRF9DT01QQVFfQ0lTU0IsCi0gICAgICAgICAgICAgICAgICAgICAgICAweDBFMTEsIDB4NDA4MCwgMCwgMCwgMH0sCi0JeyBQQ0lfVkVORE9SX0lEX0NPTVBBUSwgUENJX0RFVklDRV9JRF9DT01QQVFfQ0lTU0IsCi0gICAgICAgICAgICAgICAgICAgICAgICAweDBFMTEsIDB4NDA4MiwgMCwgMCwgMH0sCi0JeyBQQ0lfVkVORE9SX0lEX0NPTVBBUSwgUENJX0RFVklDRV9JRF9DT01QQVFfQ0lTU0IsCi0gICAgICAgICAgICAgICAgICAgICAgICAweDBFMTEsIDB4NDA4MywgMCwgMCwgMH0sCi0JeyBQQ0lfVkVORE9SX0lEX0NPTVBBUSwgUENJX0RFVklDRV9JRF9DT01QQVFfQ0lTU0MsCi0JCTB4MEUxMSwgMHg0MDlBLCAwLCAwLCAwfSwKLQl7IFBDSV9WRU5ET1JfSURfQ09NUEFRLCBQQ0lfREVWSUNFX0lEX0NPTVBBUV9DSVNTQywKLQkJMHgwRTExLCAweDQwOUIsIDAsIDAsIDB9LAotCXsgUENJX1ZFTkRPUl9JRF9DT01QQVEsIFBDSV9ERVZJQ0VfSURfQ09NUEFRX0NJU1NDLAotCQkweDBFMTEsIDB4NDA5QywgMCwgMCwgMH0sCi0JeyBQQ0lfVkVORE9SX0lEX0NPTVBBUSwgUENJX0RFVklDRV9JRF9DT01QQVFfQ0lTU0MsCi0JCTB4MEUxMSwgMHg0MDlELCAwLCAwLCAwfSwKLQl7IFBDSV9WRU5ET1JfSURfQ09NUEFRLCBQQ0lfREVWSUNFX0lEX0NPTVBBUV9DSVNTQywKLQkJMHgwRTExLCAweDQwOTEsIDAsIDAsIDB9LAotCXsgUENJX1ZFTkRPUl9JRF9IUCwgUENJX0RFVklDRV9JRF9IUF9DSVNTQSwKLQkJMHgxMDNDLCAweDMyMjUsIDAsIDAsIDB9LAotCXsgUENJX1ZFTkRPUl9JRF9IUCwgUENJX0RFVklDRV9JRF9IUF9DSVNTQywKLQkJMHgxMDNjLCAweDMyMjMsIDAsIDAsIDB9LAotCXsgUENJX1ZFTkRPUl9JRF9IUCwgUENJX0RFVklDRV9JRF9IUF9DSVNTQywKLQkJMHgxMDNjLCAweDMyMzQsIDAsIDAsIDB9LAotCXsgUENJX1ZFTkRPUl9JRF9IUCwgUENJX0RFVklDRV9JRF9IUF9DSVNTQywKLQkJMHgxMDNjLCAweDMyMzUsIDAsIDAsIDB9LAotCXsgUENJX1ZFTkRPUl9JRF9IUCwgUENJX0RFVklDRV9JRF9IUF9DSVNTRCwKLQkJMHgxMDNjLCAweDMyMTEsIDAsIDAsIDB9LAotCXsgUENJX1ZFTkRPUl9JRF9IUCwgUENJX0RFVklDRV9JRF9IUF9DSVNTRCwKLQkJMHgxMDNjLCAweDMyMTIsIDAsIDAsIDB9LAotCXsgUENJX1ZFTkRPUl9JRF9IUCwgUENJX0RFVklDRV9JRF9IUF9DSVNTRCwKLQkJMHgxMDNjLCAweDMyMTMsIDAsIDAsIDB9LAotCXsgUENJX1ZFTkRPUl9JRF9IUCwgUENJX0RFVklDRV9JRF9IUF9DSVNTRCwKLQkJMHgxMDNjLCAweDMyMTQsIDAsIDAsIDB9LAotCXsgUENJX1ZFTkRPUl9JRF9IUCwgUENJX0RFVklDRV9JRF9IUF9DSVNTRCwKLQkJMHgxMDNjLCAweDMyMTUsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX0NPTVBBUSwgUENJX0RFVklDRV9JRF9DT01QQVFfQ0lTUywgIDB4MEUxMSwgMHg0MDcwfSwKKwl7UENJX1ZFTkRPUl9JRF9DT01QQVEsIFBDSV9ERVZJQ0VfSURfQ09NUEFRX0NJU1NCLCAweDBFMTEsIDB4NDA4MH0sCisJe1BDSV9WRU5ET1JfSURfQ09NUEFRLCBQQ0lfREVWSUNFX0lEX0NPTVBBUV9DSVNTQiwgMHgwRTExLCAweDQwODJ9LAorCXtQQ0lfVkVORE9SX0lEX0NPTVBBUSwgUENJX0RFVklDRV9JRF9DT01QQVFfQ0lTU0IsIDB4MEUxMSwgMHg0MDgzfSwKKwl7UENJX1ZFTkRPUl9JRF9DT01QQVEsIFBDSV9ERVZJQ0VfSURfQ09NUEFRX0NJU1NDLCAweDBFMTEsIDB4NDA5MX0sCisJe1BDSV9WRU5ET1JfSURfQ09NUEFRLCBQQ0lfREVWSUNFX0lEX0NPTVBBUV9DSVNTQywgMHgwRTExLCAweDQwOUF9LAorCXtQQ0lfVkVORE9SX0lEX0NPTVBBUSwgUENJX0RFVklDRV9JRF9DT01QQVFfQ0lTU0MsIDB4MEUxMSwgMHg0MDlCfSwKKwl7UENJX1ZFTkRPUl9JRF9DT01QQVEsIFBDSV9ERVZJQ0VfSURfQ09NUEFRX0NJU1NDLCAweDBFMTEsIDB4NDA5Q30sCisJe1BDSV9WRU5ET1JfSURfQ09NUEFRLCBQQ0lfREVWSUNFX0lEX0NPTVBBUV9DSVNTQywgMHgwRTExLCAweDQwOUR9LAorCXtQQ0lfVkVORE9SX0lEX0hQLCAgICAgUENJX0RFVklDRV9JRF9IUF9DSVNTQSwgICAgIDB4MTAzQywgMHgzMjI1fSwKKwl7UENJX1ZFTkRPUl9JRF9IUCwgICAgIFBDSV9ERVZJQ0VfSURfSFBfQ0lTU0MsICAgICAweDEwM0MsIDB4MzIyM30sCisJe1BDSV9WRU5ET1JfSURfSFAsICAgICBQQ0lfREVWSUNFX0lEX0hQX0NJU1NDLCAgICAgMHgxMDNDLCAweDMyMzR9LAorCXtQQ0lfVkVORE9SX0lEX0hQLCAgICAgUENJX0RFVklDRV9JRF9IUF9DSVNTQywgICAgIDB4MTAzQywgMHgzMjM1fSwKKwl7UENJX1ZFTkRPUl9JRF9IUCwgICAgIFBDSV9ERVZJQ0VfSURfSFBfQ0lTU0QsICAgICAweDEwM0MsIDB4MzIxMX0sCisJe1BDSV9WRU5ET1JfSURfSFAsICAgICBQQ0lfREVWSUNFX0lEX0hQX0NJU1NELCAgICAgMHgxMDNDLCAweDMyMTJ9LAorCXtQQ0lfVkVORE9SX0lEX0hQLCAgICAgUENJX0RFVklDRV9JRF9IUF9DSVNTRCwgICAgIDB4MTAzQywgMHgzMjEzfSwKKwl7UENJX1ZFTkRPUl9JRF9IUCwgICAgIFBDSV9ERVZJQ0VfSURfSFBfQ0lTU0QsICAgICAweDEwM0MsIDB4MzIxNH0sCisJe1BDSV9WRU5ET1JfSURfSFAsICAgICBQQ0lfREVWSUNFX0lEX0hQX0NJU1NELCAgICAgMHgxMDNDLCAweDMyMTV9LAogCXswLH0KIH07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgY2Npc3NfcGNpX2RldmljZV9pZCk7CiAKLSNkZWZpbmUgTlJfUFJPRFVDVFMgQVJSQVlfU0laRShwcm9kdWN0cykKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBjY2lzc19wY2lfZGV2aWNlX2lkKTsKIAogLyogIGJvYXJkX2lkID0gU3Vic3lzdGVtIERldmljZSBJRCAmIFZlbmRvciBJRAogICogIHByb2R1Y3QgPSBNYXJrZXRpbmcgTmFtZSBmb3IgdGhlIGJvYXJkCi0gKiAgYWNjZXNzID0gQWRkcmVzcyBvZiB0aGUgc3RydWN0IG9mIGZ1bmN0aW9uIHBvaW50ZXJzIAorICogIGFjY2VzcyA9IEFkZHJlc3Mgb2YgdGhlIHN0cnVjdCBvZiBmdW5jdGlvbiBwb2ludGVycwogICovCiBzdGF0aWMgc3RydWN0IGJvYXJkX3R5cGUgcHJvZHVjdHNbXSA9IHsKLQl7IDB4NDA3MDBFMTEsICJTbWFydCBBcnJheSA1MzAwIiwgJlNBNV9hY2Nlc3MgfSwKLQl7IDB4NDA4MDBFMTEsICJTbWFydCBBcnJheSA1aSIsICZTQTVCX2FjY2Vzc30sCi0JeyAweDQwODIwRTExLCAiU21hcnQgQXJyYXkgNTMyIiwgJlNBNUJfYWNjZXNzfSwKLQl7IDB4NDA4MzBFMTEsICJTbWFydCBBcnJheSA1MzEyIiwgJlNBNUJfYWNjZXNzfSwKLQl7IDB4NDA5QTBFMTEsICJTbWFydCBBcnJheSA2NDEiLCAmU0E1X2FjY2Vzc30sCi0JeyAweDQwOUIwRTExLCAiU21hcnQgQXJyYXkgNjQyIiwgJlNBNV9hY2Nlc3N9LAotCXsgMHg0MDlDMEUxMSwgIlNtYXJ0IEFycmF5IDY0MDAiLCAmU0E1X2FjY2Vzc30sCi0JeyAweDQwOUQwRTExLCAiU21hcnQgQXJyYXkgNjQwMCBFTSIsICZTQTVfYWNjZXNzfSwKLQl7IDB4NDA5MTBFMTEsICJTbWFydCBBcnJheSA2aSIsICZTQTVfYWNjZXNzfSwKLQl7IDB4MzIyNTEwM0MsICJTbWFydCBBcnJheSBQNjAwIiwgJlNBNV9hY2Nlc3N9LAotCXsgMHgzMjIzMTAzQywgIlNtYXJ0IEFycmF5IFA4MDAiLCAmU0E1X2FjY2Vzc30sCi0JeyAweDMyMzQxMDNDLCAiU21hcnQgQXJyYXkgUDQwMCIsICZTQTVfYWNjZXNzfSwKLQl7IDB4MzIzNTEwM0MsICJTbWFydCBBcnJheSBQNDAwaSIsICZTQTVfYWNjZXNzfSwKLQl7IDB4MzIxMTEwM0MsICJTbWFydCBBcnJheSBFMjAwaSIsICZTQTVfYWNjZXNzfSwKLQl7IDB4MzIxMjEwM0MsICJTbWFydCBBcnJheSBFMjAwIiwgJlNBNV9hY2Nlc3N9LAotCXsgMHgzMjEzMTAzQywgIlNtYXJ0IEFycmF5IEUyMDBpIiwgJlNBNV9hY2Nlc3N9LAotCXsgMHgzMjE0MTAzQywgIlNtYXJ0IEFycmF5IEUyMDBpIiwgJlNBNV9hY2Nlc3N9LAotCXsgMHgzMjE1MTAzQywgIlNtYXJ0IEFycmF5IEUyMDBpIiwgJlNBNV9hY2Nlc3N9LAorCXsweDQwNzAwRTExLCAiU21hcnQgQXJyYXkgNTMwMCIsICZTQTVfYWNjZXNzfSwKKwl7MHg0MDgwMEUxMSwgIlNtYXJ0IEFycmF5IDVpIiwgJlNBNUJfYWNjZXNzfSwKKwl7MHg0MDgyMEUxMSwgIlNtYXJ0IEFycmF5IDUzMiIsICZTQTVCX2FjY2Vzc30sCisJezB4NDA4MzBFMTEsICJTbWFydCBBcnJheSA1MzEyIiwgJlNBNUJfYWNjZXNzfSwKKwl7MHg0MDlBMEUxMSwgIlNtYXJ0IEFycmF5IDY0MSIsICZTQTVfYWNjZXNzfSwKKwl7MHg0MDlCMEUxMSwgIlNtYXJ0IEFycmF5IDY0MiIsICZTQTVfYWNjZXNzfSwKKwl7MHg0MDlDMEUxMSwgIlNtYXJ0IEFycmF5IDY0MDAiLCAmU0E1X2FjY2Vzc30sCisJezB4NDA5RDBFMTEsICJTbWFydCBBcnJheSA2NDAwIEVNIiwgJlNBNV9hY2Nlc3N9LAorCXsweDQwOTEwRTExLCAiU21hcnQgQXJyYXkgNmkiLCAmU0E1X2FjY2Vzc30sCisJezB4MzIyNTEwM0MsICJTbWFydCBBcnJheSBQNjAwIiwgJlNBNV9hY2Nlc3N9LAorCXsweDMyMjMxMDNDLCAiU21hcnQgQXJyYXkgUDgwMCIsICZTQTVfYWNjZXNzfSwKKwl7MHgzMjM0MTAzQywgIlNtYXJ0IEFycmF5IFA0MDAiLCAmU0E1X2FjY2Vzc30sCisJezB4MzIzNTEwM0MsICJTbWFydCBBcnJheSBQNDAwaSIsICZTQTVfYWNjZXNzfSwKKwl7MHgzMjExMTAzQywgIlNtYXJ0IEFycmF5IEUyMDBpIiwgJlNBNV9hY2Nlc3N9LAorCXsweDMyMTIxMDNDLCAiU21hcnQgQXJyYXkgRTIwMCIsICZTQTVfYWNjZXNzfSwKKwl7MHgzMjEzMTAzQywgIlNtYXJ0IEFycmF5IEUyMDBpIiwgJlNBNV9hY2Nlc3N9LAorCXsweDMyMTQxMDNDLCAiU21hcnQgQXJyYXkgRTIwMGkiLCAmU0E1X2FjY2Vzc30sCisJezB4MzIxNTEwM0MsICJTbWFydCBBcnJheSBFMjAwaSIsICZTQTVfYWNjZXNzfSwKIH07CiAKLS8qIEhvdyBsb25nIHRvIHdhaXQgKGluIG1pbGxlc2NvbmRzKSBmb3IgYm9hcmQgdG8gZ28gaW50byBzaW1wbGUgbW9kZSAqLwotI2RlZmluZSBNQVhfQ09ORklHX1dBSVQgMzAwMDAgCisvKiBIb3cgbG9uZyB0byB3YWl0IChpbiBtaWxsaXNlY29uZHMpIGZvciBib2FyZCB0byBnbyBpbnRvIHNpbXBsZSBtb2RlICovCisjZGVmaW5lIE1BWF9DT05GSUdfV0FJVCAzMDAwMAogI2RlZmluZSBNQVhfSU9DVExfQ09ORklHX1dBSVQgMTAwMAogCiAvKmRlZmluZSBob3cgbWFueSB0aW1lcyB3ZSB3aWxsIHRyeSBhIGNvbW1hbmQgYmVjYXVzZSBvZiBidXMgcmVzZXRzICovCiAjZGVmaW5lIE1BWF9DTURfUkVUUklFUyAzCiAKICNkZWZpbmUgUkVBRF9BSEVBRCAJIDEwMjQKLSNkZWZpbmUgTlJfQ01EUwkJIDM4NCAvKiAjY29tbWFuZHMgdGhhdCBjYW4gYmUgb3V0c3RhbmRpbmcgKi8KKyNkZWZpbmUgTlJfQ01EUwkJIDM4NAkvKiAjY29tbWFuZHMgdGhhdCBjYW4gYmUgb3V0c3RhbmRpbmcgKi8KICNkZWZpbmUgTUFYX0NUTFIJMzIKIAogLyogT3JpZ2luYWxseSBjY2lzcyBkcml2ZXIgb25seSBzdXBwb3J0cyA4IG1ham9yIG51bWJlcnMgKi8KICNkZWZpbmUgTUFYX0NUTFJfT1JJRyAJOAogCi0KIHN0YXRpYyBjdGxyX2luZm9fdCAqaGJhW01BWF9DVExSXTsKIAogc3RhdGljIHZvaWQgZG9fY2Npc3NfcmVxdWVzdChyZXF1ZXN0X3F1ZXVlX3QgKnEpOwogc3RhdGljIGlycXJldHVybl90IGRvX2NjaXNzX2ludHIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CiBzdGF0aWMgaW50IGNjaXNzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGVwKTsKIHN0YXRpYyBpbnQgY2Npc3NfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZXApOwotc3RhdGljIGludCBjY2lzc19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZXAsIAotCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CitzdGF0aWMgaW50IGNjaXNzX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKIHN0YXRpYyBpbnQgY2Npc3NfZ2V0Z2VvKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHN0cnVjdCBoZF9nZW9tZXRyeSAqZ2VvKTsKIAogc3RhdGljIGludCByZXZhbGlkYXRlX2FsbHZvbChjdGxyX2luZm9fdCAqaG9zdCk7CiBzdGF0aWMgaW50IGNjaXNzX3JldmFsaWRhdGUoc3RydWN0IGdlbmRpc2sgKmRpc2spOwogc3RhdGljIGludCByZWJ1aWxkX2x1bl90YWJsZShjdGxyX2luZm9fdCAqaCwgc3RydWN0IGdlbmRpc2sgKmRlbF9kaXNrKTsKLXN0YXRpYyBpbnQgZGVyZWdpc3Rlcl9kaXNrKHN0cnVjdCBnZW5kaXNrICpkaXNrLCBkcml2ZV9pbmZvX3N0cnVjdCAqZHJ2LCBpbnQgY2xlYXJfYWxsKTsKK3N0YXRpYyBpbnQgZGVyZWdpc3Rlcl9kaXNrKHN0cnVjdCBnZW5kaXNrICpkaXNrLCBkcml2ZV9pbmZvX3N0cnVjdCAqZHJ2LAorCQkJICAgaW50IGNsZWFyX2FsbCk7CiAKIHN0YXRpYyB2b2lkIGNjaXNzX3JlYWRfY2FwYWNpdHkoaW50IGN0bHIsIGludCBsb2d2b2wsIFJlYWRDYXBkYXRhX3N0cnVjdCAqYnVmLAotCWludCB3aXRoaXJxLCB1bnNpZ25lZCBpbnQgKnRvdGFsX3NpemUsIHVuc2lnbmVkIGludCAqYmxvY2tfc2l6ZSk7Ci1zdGF0aWMgdm9pZCBjY2lzc19nZW9tZXRyeV9pbnF1aXJ5KGludCBjdGxyLCBpbnQgbG9ndm9sLAotCQkJaW50IHdpdGhpcnEsIHVuc2lnbmVkIGludCB0b3RhbF9zaXplLAotCQkJdW5zaWduZWQgaW50IGJsb2NrX3NpemUsIElucXVpcnlEYXRhX3N0cnVjdCAqaW5xX2J1ZmYsCi0JCQlkcml2ZV9pbmZvX3N0cnVjdCAqZHJ2KTsKKwkJCQlpbnQgd2l0aGlycSwgdW5zaWduZWQgaW50ICp0b3RhbF9zaXplLAorCQkJCXVuc2lnbmVkIGludCAqYmxvY2tfc2l6ZSk7CitzdGF0aWMgdm9pZCBjY2lzc19nZW9tZXRyeV9pbnF1aXJ5KGludCBjdGxyLCBpbnQgbG9ndm9sLCBpbnQgd2l0aGlycSwKKwkJCQkgICB1bnNpZ25lZCBpbnQgdG90YWxfc2l6ZSwKKwkJCQkgICB1bnNpZ25lZCBpbnQgYmxvY2tfc2l6ZSwKKwkJCQkgICBJbnF1aXJ5RGF0YV9zdHJ1Y3QgKmlucV9idWZmLAorCQkJCSAgIGRyaXZlX2luZm9fc3RydWN0ICpkcnYpOwogc3RhdGljIHZvaWQgY2Npc3NfZ2V0Z2VvbWV0cnkoaW50IGNudGxfbnVtKTsKLXN0YXRpYyB2b2lkIF9fZGV2aW5pdCBjY2lzc19pbnRlcnJ1cHRfbW9kZShjdGxyX2luZm9fdCAqLCBzdHJ1Y3QgcGNpX2RldiAqLCBfX3UzMik7Ci1zdGF0aWMgdm9pZCBzdGFydF9pbyggY3Rscl9pbmZvX3QgKmgpOwotc3RhdGljIGludCBzZW5kY21kKCBfX3U4IGNtZCwgaW50IGN0bHIsIHZvaWQgKmJ1ZmYsIHNpemVfdCBzaXplLAotCXVuc2lnbmVkIGludCB1c2VfdW5pdF9udW0sIHVuc2lnbmVkIGludCBsb2dfdW5pdCwgX191OCBwYWdlX2NvZGUsCi0JdW5zaWduZWQgY2hhciAqc2NzaTNhZGRyLCBpbnQgY21kX3R5cGUpOwotc3RhdGljIGludCBzZW5kY21kX3dpdGhpcnEoX191OAljbWQsIGludCBjdGxyLCB2b2lkICpidWZmLCBzaXplX3Qgc2l6ZSwKLQl1bnNpZ25lZCBpbnQgdXNlX3VuaXRfbnVtLCB1bnNpZ25lZCBpbnQgbG9nX3VuaXQsIF9fdTgJcGFnZV9jb2RlLAotCWludCBjbWRfdHlwZSk7CitzdGF0aWMgdm9pZCBfX2RldmluaXQgY2Npc3NfaW50ZXJydXB0X21vZGUoY3Rscl9pbmZvX3QgKiwgc3RydWN0IHBjaV9kZXYgKiwKKwkJCQkJICAgX191MzIpOworc3RhdGljIHZvaWQgc3RhcnRfaW8oY3Rscl9pbmZvX3QgKmgpOworc3RhdGljIGludCBzZW5kY21kKF9fdTggY21kLCBpbnQgY3Rsciwgdm9pZCAqYnVmZiwgc2l6ZV90IHNpemUsCisJCSAgIHVuc2lnbmVkIGludCB1c2VfdW5pdF9udW0sIHVuc2lnbmVkIGludCBsb2dfdW5pdCwKKwkJICAgX191OCBwYWdlX2NvZGUsIHVuc2lnbmVkIGNoYXIgKnNjc2kzYWRkciwgaW50IGNtZF90eXBlKTsKK3N0YXRpYyBpbnQgc2VuZGNtZF93aXRoaXJxKF9fdTggY21kLCBpbnQgY3Rsciwgdm9pZCAqYnVmZiwgc2l6ZV90IHNpemUsCisJCQkgICB1bnNpZ25lZCBpbnQgdXNlX3VuaXRfbnVtLCB1bnNpZ25lZCBpbnQgbG9nX3VuaXQsCisJCQkgICBfX3U4IHBhZ2VfY29kZSwgaW50IGNtZF90eXBlKTsKIAogc3RhdGljIHZvaWQgZmFpbF9hbGxfY21kcyh1bnNpZ25lZCBsb25nIGN0bHIpOwogCiAjaWZkZWYgQ09ORklHX1BST0NfRlMKLXN0YXRpYyBpbnQgY2Npc3NfcHJvY19nZXRfaW5mbyhjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCAKLQkJaW50IGxlbmd0aCwgaW50ICplb2YsIHZvaWQgKmRhdGEpOworc3RhdGljIGludCBjY2lzc19wcm9jX2dldF9pbmZvKGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsCisJCQkgICAgICAgaW50IGxlbmd0aCwgaW50ICplb2YsIHZvaWQgKmRhdGEpOwogc3RhdGljIHZvaWQgY2Npc3NfcHJvY2luaXQoaW50IGkpOwogI2Vsc2UKLXN0YXRpYyB2b2lkIGNjaXNzX3Byb2Npbml0KGludCBpKSB7fQotI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCitzdGF0aWMgdm9pZCBjY2lzc19wcm9jaW5pdChpbnQgaSkKK3sKK30KKyNlbmRpZgkJCQkvKiBDT05GSUdfUFJPQ19GUyAqLwogCiAjaWZkZWYgQ09ORklHX0NPTVBBVAogc3RhdGljIGxvbmcgY2Npc3NfY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmLCB1bnNpZ25lZCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKICNlbmRpZgogCi1zdGF0aWMgc3RydWN0IGJsb2NrX2RldmljZV9vcGVyYXRpb25zIGNjaXNzX2ZvcHMgID0gewotCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkub3BlbgkJPSBjY2lzc19vcGVuLCAKLQkucmVsZWFzZSAgICAgICAJPSBjY2lzc19yZWxlYXNlLAotICAgICAgICAuaW9jdGwJCT0gY2Npc3NfaW9jdGwsCi0gICAgICAgIC5nZXRnZW8JCT0gY2Npc3NfZ2V0Z2VvLAorc3RhdGljIHN0cnVjdCBibG9ja19kZXZpY2Vfb3BlcmF0aW9ucyBjY2lzc19mb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5vcGVuID0gY2Npc3Nfb3BlbiwKKwkucmVsZWFzZSA9IGNjaXNzX3JlbGVhc2UsCisJLmlvY3RsID0gY2Npc3NfaW9jdGwsCisJLmdldGdlbyA9IGNjaXNzX2dldGdlbywKICNpZmRlZiBDT05GSUdfQ09NUEFUCi0JLmNvbXBhdF9pb2N0bCAgID0gY2Npc3NfY29tcGF0X2lvY3RsLAorCS5jb21wYXRfaW9jdGwgPSBjY2lzc19jb21wYXRfaW9jdGwsCiAjZW5kaWYKLQkucmV2YWxpZGF0ZV9kaXNrPSBjY2lzc19yZXZhbGlkYXRlLAorCS5yZXZhbGlkYXRlX2Rpc2sgPSBjY2lzc19yZXZhbGlkYXRlLAogfTsKIAogLyoKQEAgLTIwOCwyOCArMTk0LDI5IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBhZGRRKENvbW1hbmRMaXN0X3N0cnVjdCAqKlFwdHIsIENvbW1hbmRMaXN0X3N0cnVjdCAqYykKIHsKLSAgICAgICAgaWYgKCpRcHRyID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAqUXB0ciA9IGM7Ci0gICAgICAgICAgICAgICAgYy0+bmV4dCA9IGMtPnByZXYgPSBjOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGMtPnByZXYgPSAoKlFwdHIpLT5wcmV2OwotICAgICAgICAgICAgICAgIGMtPm5leHQgPSAoKlFwdHIpOwotICAgICAgICAgICAgICAgICgqUXB0ciktPnByZXYtPm5leHQgPSBjOwotICAgICAgICAgICAgICAgICgqUXB0ciktPnByZXYgPSBjOwotICAgICAgICB9CisJaWYgKCpRcHRyID09IE5VTEwpIHsKKwkJKlFwdHIgPSBjOworCQljLT5uZXh0ID0gYy0+cHJldiA9IGM7CisJfSBlbHNlIHsKKwkJYy0+cHJldiA9ICgqUXB0ciktPnByZXY7CisJCWMtPm5leHQgPSAoKlFwdHIpOworCQkoKlFwdHIpLT5wcmV2LT5uZXh0ID0gYzsKKwkJKCpRcHRyKS0+cHJldiA9IGM7CisJfQogfQogCi1zdGF0aWMgaW5saW5lIENvbW1hbmRMaXN0X3N0cnVjdCAqcmVtb3ZlUShDb21tYW5kTGlzdF9zdHJ1Y3QgKipRcHRyLCAKLQkJCQkJCUNvbW1hbmRMaXN0X3N0cnVjdCAqYykKK3N0YXRpYyBpbmxpbmUgQ29tbWFuZExpc3Rfc3RydWN0ICpyZW1vdmVRKENvbW1hbmRMaXN0X3N0cnVjdCAqKlFwdHIsCisJCQkJCSAgQ29tbWFuZExpc3Rfc3RydWN0ICpjKQogewotICAgICAgICBpZiAoYyAmJiBjLT5uZXh0ICE9IGMpIHsKLSAgICAgICAgICAgICAgICBpZiAoKlFwdHIgPT0gYykgKlFwdHIgPSBjLT5uZXh0OwotICAgICAgICAgICAgICAgIGMtPnByZXYtPm5leHQgPSBjLT5uZXh0OwotICAgICAgICAgICAgICAgIGMtPm5leHQtPnByZXYgPSBjLT5wcmV2OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICpRcHRyID0gTlVMTDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYzsKKwlpZiAoYyAmJiBjLT5uZXh0ICE9IGMpIHsKKwkJaWYgKCpRcHRyID09IGMpCisJCQkqUXB0ciA9IGMtPm5leHQ7CisJCWMtPnByZXYtPm5leHQgPSBjLT5uZXh0OworCQljLT5uZXh0LT5wcmV2ID0gYy0+cHJldjsKKwl9IGVsc2UgeworCQkqUXB0ciA9IE5VTEw7CisJfQorCXJldHVybiBjOwogfQogCiAjaW5jbHVkZSAiY2Npc3Nfc2NzaS5jIgkJLyogRm9yIFNDU0kgdGFwZSBzdXBwb3J0ICovCkBAIC0yNDIsMjMgKzIyOSwyNCBAQAogI2RlZmluZSBFTkdfR0lHIDEwMDAwMDAwMDAKICNkZWZpbmUgRU5HX0dJR19GQUNUT1IgKEVOR19HSUcvNTEyKQogI2RlZmluZSBSQUlEX1VOS05PV04gNgotc3RhdGljIGNvbnN0IGNoYXIgKnJhaWRfbGFiZWxbXSA9IHsiMCIsIjQiLCIxKDErMCkiLCI1IiwiNSsxIiwiQURHIiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVTktOT1dOIn07CitzdGF0aWMgY29uc3QgY2hhciAqcmFpZF9sYWJlbFtdID0geyAiMCIsICI0IiwgIjEoMSswKSIsICI1IiwgIjUrMSIsICJBREciLAorCSJVTktOT1dOIgorfTsKIAogc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY19jY2lzczsKIAotc3RhdGljIGludCBjY2lzc19wcm9jX2dldF9pbmZvKGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIAotCQlpbnQgbGVuZ3RoLCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3N0YXRpYyBpbnQgY2Npc3NfcHJvY19nZXRfaW5mbyhjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LAorCQkJICAgICAgIGludCBsZW5ndGgsIGludCAqZW9mLCB2b2lkICpkYXRhKQogewotICAgICAgICBvZmZfdCBwb3MgPSAwOwotICAgICAgICBvZmZfdCBsZW4gPSAwOwotICAgICAgICBpbnQgc2l6ZSwgaSwgY3RscjsKLSAgICAgICAgY3Rscl9pbmZvX3QgKmggPSAoY3Rscl9pbmZvX3QqKWRhdGE7Ci0gICAgICAgIGRyaXZlX2luZm9fc3RydWN0ICpkcnY7CisJb2ZmX3QgcG9zID0gMDsKKwlvZmZfdCBsZW4gPSAwOworCWludCBzaXplLCBpLCBjdGxyOworCWN0bHJfaW5mb190ICpoID0gKGN0bHJfaW5mb190ICopIGRhdGE7CisJZHJpdmVfaW5mb19zdHJ1Y3QgKmRydjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotICAgICAgICBzZWN0b3JfdCB2b2xfc3osIHZvbF9zel9mcmFjOworCXNlY3Rvcl90IHZvbF9zeiwgdm9sX3N6X2ZyYWM7CiAKLSAgICAgICAgY3RsciA9IGgtPmN0bHI7CisJY3RsciA9IGgtPmN0bHI7CiAKIAkvKiBwcmV2ZW50IGRpc3BsYXlpbmcgYm9ndXMgaW5mbyBkdXJpbmcgY29uZmlndXJhdGlvbgogCSAqIG9yIGRlY29uZmlndXJhdGlvbiBvZiBhIGxvZ2ljYWwgdm9sdW1lCkBAIC0yNjYsMzUgKzI1NCwzNSBAQAogCXNwaW5fbG9ja19pcnFzYXZlKENDSVNTX0xPQ0soY3RsciksIGZsYWdzKTsKIAlpZiAoaC0+YnVzeV9jb25maWd1cmluZykgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKENDSVNTX0xPQ0soY3RsciksIGZsYWdzKTsKLQlyZXR1cm4gLUVCVVNZOworCQlyZXR1cm4gLUVCVVNZOwogCX0KIAloLT5idXN5X2NvbmZpZ3VyaW5nID0gMTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKENDSVNTX0xPQ0soY3RsciksIGZsYWdzKTsKIAotICAgICAgICBzaXplID0gc3ByaW50ZihidWZmZXIsICIlczogSFAgJXMgQ29udHJvbGxlclxuIgotCQkiQm9hcmQgSUQ6IDB4JTA4bHhcbiIKLQkJIkZpcm13YXJlIFZlcnNpb246ICVjJWMlYyVjXG4iCi0JCSJJUlE6ICVkXG4iCi0JCSJMb2dpY2FsIGRyaXZlczogJWRcbiIKLQkJIkN1cnJlbnQgUSBkZXB0aDogJWRcbiIKLQkJIkN1cnJlbnQgIyBjb21tYW5kcyBvbiBjb250cm9sbGVyOiAlZFxuIgotCQkiTWF4IFEgZGVwdGggc2luY2UgaW5pdDogJWRcbiIKLQkJIk1heCAjIGNvbW1hbmRzIG9uIGNvbnRyb2xsZXIgc2luY2UgaW5pdDogJWRcbiIKLQkJIk1heCBTRyBlbnRyaWVzIHNpbmNlIGluaXQ6ICVkXG5cbiIsCi0gICAgICAgICAgICAgICAgaC0+ZGV2bmFtZSwKLSAgICAgICAgICAgICAgICBoLT5wcm9kdWN0X25hbWUsCi0gICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpaC0+Ym9hcmRfaWQsCi0JCWgtPmZpcm1fdmVyWzBdLCBoLT5maXJtX3ZlclsxXSwgaC0+ZmlybV92ZXJbMl0sIGgtPmZpcm1fdmVyWzNdLAotICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpaC0+aW50cltTSU1QTEVfTU9ERV9JTlRdLAotICAgICAgICAgICAgICAgIGgtPm51bV9sdW5zLCAKLQkJaC0+UWRlcHRoLCBoLT5jb21tYW5kc19vdXRzdGFuZGluZywKLQkJaC0+bWF4UXNpbmNlaW5pdCwgaC0+bWF4X291dHN0YW5kaW5nLCBoLT5tYXhTRyk7CisJc2l6ZSA9IHNwcmludGYoYnVmZmVyLCAiJXM6IEhQICVzIENvbnRyb2xsZXJcbiIKKwkJICAgICAgICJCb2FyZCBJRDogMHglMDhseFxuIgorCQkgICAgICAgIkZpcm13YXJlIFZlcnNpb246ICVjJWMlYyVjXG4iCisJCSAgICAgICAiSVJROiAlZFxuIgorCQkgICAgICAgIkxvZ2ljYWwgZHJpdmVzOiAlZFxuIgorCQkgICAgICAgIkN1cnJlbnQgUSBkZXB0aDogJWRcbiIKKwkJICAgICAgICJDdXJyZW50ICMgY29tbWFuZHMgb24gY29udHJvbGxlcjogJWRcbiIKKwkJICAgICAgICJNYXggUSBkZXB0aCBzaW5jZSBpbml0OiAlZFxuIgorCQkgICAgICAgIk1heCAjIGNvbW1hbmRzIG9uIGNvbnRyb2xsZXIgc2luY2UgaW5pdDogJWRcbiIKKwkJICAgICAgICJNYXggU0cgZW50cmllcyBzaW5jZSBpbml0OiAlZFxuXG4iLAorCQkgICAgICAgaC0+ZGV2bmFtZSwKKwkJICAgICAgIGgtPnByb2R1Y3RfbmFtZSwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nKWgtPmJvYXJkX2lkLAorCQkgICAgICAgaC0+ZmlybV92ZXJbMF0sIGgtPmZpcm1fdmVyWzFdLCBoLT5maXJtX3ZlclsyXSwKKwkJICAgICAgIGgtPmZpcm1fdmVyWzNdLCAodW5zaWduZWQgaW50KWgtPmludHJbU0lNUExFX01PREVfSU5UXSwKKwkJICAgICAgIGgtPm51bV9sdW5zLCBoLT5RZGVwdGgsIGgtPmNvbW1hbmRzX291dHN0YW5kaW5nLAorCQkgICAgICAgaC0+bWF4UXNpbmNlaW5pdCwgaC0+bWF4X291dHN0YW5kaW5nLCBoLT5tYXhTRyk7CiAKLSAgICAgICAgcG9zICs9IHNpemU7IGxlbiArPSBzaXplOworCXBvcyArPSBzaXplOworCWxlbiArPSBzaXplOwogCWNjaXNzX3Byb2NfdGFwZV9yZXBvcnQoY3RsciwgYnVmZmVyLCAmcG9zLCAmbGVuKTsKLQlmb3IoaT0wOyBpPD1oLT5oaWdoZXN0X2x1bjsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8PSBoLT5oaWdoZXN0X2x1bjsgaSsrKSB7CiAKLSAgICAgICAgICAgICAgICBkcnYgPSAmaC0+ZHJ2W2ldOworCQlkcnYgPSAmaC0+ZHJ2W2ldOwogCQlpZiAoZHJ2LT5oZWFkcyA9PSAwKQogCQkJY29udGludWU7CiAKQEAgLTMwNSwyNSArMjkzLDI2IEBACiAKIAkJaWYgKGRydi0+cmFpZF9sZXZlbCA+IDUpCiAJCQlkcnYtPnJhaWRfbGV2ZWwgPSBSQUlEX1VOS05PV047Ci0JCXNpemUgPSBzcHJpbnRmKGJ1ZmZlcitsZW4sICJjY2lzcy9jJWRkJWQ6IgotCQkJCSJcdCU0dS4lMDJ1R0JcdFJBSUQgJXNcbiIsCi0JCQkJY3RsciwgaSwgKGludCl2b2xfc3osIChpbnQpdm9sX3N6X2ZyYWMsCi0JCQkJcmFpZF9sYWJlbFtkcnYtPnJhaWRfbGV2ZWxdKTsKLSAgICAgICAgICAgICAgICBwb3MgKz0gc2l6ZTsgbGVuICs9IHNpemU7Ci0gICAgICAgIH0KKwkJc2l6ZSA9IHNwcmludGYoYnVmZmVyICsgbGVuLCAiY2Npc3MvYyVkZCVkOiIKKwkJCSAgICAgICAiXHQlNHUuJTAydUdCXHRSQUlEICVzXG4iLAorCQkJICAgICAgIGN0bHIsIGksIChpbnQpdm9sX3N6LCAoaW50KXZvbF9zel9mcmFjLAorCQkJICAgICAgIHJhaWRfbGFiZWxbZHJ2LT5yYWlkX2xldmVsXSk7CisJCXBvcyArPSBzaXplOworCQlsZW4gKz0gc2l6ZTsKKwl9CiAKLSAgICAgICAgKmVvZiA9IDE7Ci0gICAgICAgICpzdGFydCA9IGJ1ZmZlcitvZmZzZXQ7Ci0gICAgICAgIGxlbiAtPSBvZmZzZXQ7Ci0gICAgICAgIGlmIChsZW4+bGVuZ3RoKQotICAgICAgICAgICAgICAgIGxlbiA9IGxlbmd0aDsKKwkqZW9mID0gMTsKKwkqc3RhcnQgPSBidWZmZXIgKyBvZmZzZXQ7CisJbGVuIC09IG9mZnNldDsKKwlpZiAobGVuID4gbGVuZ3RoKQorCQlsZW4gPSBsZW5ndGg7CiAJaC0+YnVzeV9jb25maWd1cmluZyA9IDA7Ci0gICAgICAgIHJldHVybiBsZW47CisJcmV0dXJuIGxlbjsKIH0KIAotc3RhdGljIGludCAKLWNjaXNzX3Byb2Nfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIAotCQkJdW5zaWduZWQgbG9uZyBjb3VudCwgdm9pZCAqZGF0YSkKK3N0YXRpYyBpbnQKK2NjaXNzX3Byb2Nfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCisJCSB1bnNpZ25lZCBsb25nIGNvdW50LCB2b2lkICpkYXRhKQogewogCXVuc2lnbmVkIGNoYXIgY21kWzgwXTsKIAlpbnQgbGVuOwpAQCAtMzMyLDIwICszMjEsMjMgQEAKIAlpbnQgcmM7CiAjZW5kaWYKIAotCWlmIChjb3VudCA+IHNpemVvZihjbWQpLTEpIHJldHVybiAtRUlOVkFMOwotCWlmIChjb3B5X2Zyb21fdXNlcihjbWQsIGJ1ZmZlciwgY291bnQpKSByZXR1cm4gLUVGQVVMVDsKKwlpZiAoY291bnQgPiBzaXplb2YoY21kKSAtIDEpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChjb3B5X2Zyb21fdXNlcihjbWQsIGJ1ZmZlciwgY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKIAljbWRbY291bnRdID0gJ1wwJzsKIAlsZW4gPSBzdHJsZW4oY21kKTsJLy8gYWJvdmUgMyBsaW5lcyBlbnN1cmUgc2FmZXR5Ci0JaWYgKGxlbiAmJiBjbWRbbGVuLTFdID09ICdcbicpCisJaWYgKGxlbiAmJiBjbWRbbGVuIC0gMV0gPT0gJ1xuJykKIAkJY21kWy0tbGVuXSA9ICdcMCc7CiAjCWlmZGVmIENPTkZJR19DSVNTX1NDU0lfVEFQRQotCQlpZiAoc3RyY21wKCJlbmdhZ2Ugc2NzaSIsIGNtZCk9PTApIHsKLQkJCXJjID0gY2Npc3NfZW5nYWdlX3Njc2koaC0+Y3Rscik7Ci0JCQlpZiAocmMgIT0gMCkgcmV0dXJuIC1yYzsKLQkJCXJldHVybiBjb3VudDsKLQkJfQotCQkvKiBtaWdodCBiZSBuaWNlIHRvIGhhdmUgImRpc2VuZ2FnZSIgdG9vLCBidXQgaXQncyBub3QgCi0JCSAgIHNhZmVseSBwb3NzaWJsZS4gKG9ubHkgMSBtb2R1bGUgdXNlIGNvdW50LCBsb2NrIGlzc3Vlcy4pICovCisJaWYgKHN0cmNtcCgiZW5nYWdlIHNjc2kiLCBjbWQpID09IDApIHsKKwkJcmMgPSBjY2lzc19lbmdhZ2Vfc2NzaShoLT5jdGxyKTsKKwkJaWYgKHJjICE9IDApCisJCQlyZXR1cm4gLXJjOworCQlyZXR1cm4gY291bnQ7CisJfQorCS8qIG1pZ2h0IGJlIG5pY2UgdG8gaGF2ZSAiZGlzZW5nYWdlIiB0b28sIGJ1dCBpdCdzIG5vdAorCSAgIHNhZmVseSBwb3NzaWJsZS4gKG9ubHkgMSBtb2R1bGUgdXNlIGNvdW50LCBsb2NrIGlzc3Vlcy4pICovCiAjCWVuZGlmCiAJcmV0dXJuIC1FSU5WQUw7CiB9CkBAIC0zNTgsMTE2ICszNTAsMTEzIEBACiB7CiAJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwZGU7CiAKLSAgICAgICAgaWYgKHByb2NfY2Npc3MgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHByb2NfY2Npc3MgPSBwcm9jX21rZGlyKCJjY2lzcyIsIHByb2Nfcm9vdF9kcml2ZXIpOwotICAgICAgICAgICAgICAgIGlmICghcHJvY19jY2lzcykgCisJaWYgKHByb2NfY2Npc3MgPT0gTlVMTCkgeworCQlwcm9jX2NjaXNzID0gcHJvY19ta2RpcigiY2Npc3MiLCBwcm9jX3Jvb3RfZHJpdmVyKTsKKwkJaWYgKCFwcm9jX2NjaXNzKQogCQkJcmV0dXJuOwotICAgICAgICB9CisJfQogCi0JcGRlID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeShoYmFbaV0tPmRldm5hbWUsIAotCQlTX0lXVVNSIHwgU19JUlVTUiB8IFNfSVJHUlAgfCBTX0lST1RILCAKLQkJcHJvY19jY2lzcywgY2Npc3NfcHJvY19nZXRfaW5mbywgaGJhW2ldKTsKKwlwZGUgPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KGhiYVtpXS0+ZGV2bmFtZSwKKwkJCQkgICAgIFNfSVdVU1IgfCBTX0lSVVNSIHwgU19JUkdSUCB8IFNfSVJPVEgsCisJCQkJICAgICBwcm9jX2NjaXNzLCBjY2lzc19wcm9jX2dldF9pbmZvLCBoYmFbaV0pOwogCXBkZS0+d3JpdGVfcHJvYyA9IGNjaXNzX3Byb2Nfd3JpdGU7CiB9Ci0jZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KKyNlbmRpZgkJCQkvKiBDT05GSUdfUFJPQ19GUyAqLwogCi0vKiAKLSAqIEZvciBvcGVyYXRpb25zIHRoYXQgY2Fubm90IHNsZWVwLCBhIGNvbW1hbmQgYmxvY2sgaXMgYWxsb2NhdGVkIGF0IGluaXQsIAorLyoKKyAqIEZvciBvcGVyYXRpb25zIHRoYXQgY2Fubm90IHNsZWVwLCBhIGNvbW1hbmQgYmxvY2sgaXMgYWxsb2NhdGVkIGF0IGluaXQsCiAgKiBhbmQgbWFuYWdlZCBieSBjbWRfYWxsb2MoKSBhbmQgY21kX2ZyZWUoKSB1c2luZyBhIHNpbXBsZSBiaXRtYXAgdG8gdHJhY2sKLSAqIHdoaWNoIG9uZXMgYXJlIGZyZWUgb3IgaW4gdXNlLiAgRm9yIG9wZXJhdGlvbnMgdGhhdCBjYW4gd2FpdCBmb3Iga21hbGxvYyAKLSAqIHRvIHBvc3NpYmxlIHNsZWVwLCB0aGlzIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCB3aXRoIGdldF9mcm9tX3Bvb2wgc2V0IHRvIDAuIAotICogY21kX2ZyZWUoKSBNVVNUIGJlIGNhbGxlZCB3aXRoIGEgZ290X2Zyb21fcG9vbCBzZXQgdG8gMCBpZiBjbWRfYWxsb2Mgd2FzLiAKLSAqLyAKLXN0YXRpYyBDb21tYW5kTGlzdF9zdHJ1Y3QgKiBjbWRfYWxsb2MoY3Rscl9pbmZvX3QgKmgsIGludCBnZXRfZnJvbV9wb29sKQorICogd2hpY2ggb25lcyBhcmUgZnJlZSBvciBpbiB1c2UuICBGb3Igb3BlcmF0aW9ucyB0aGF0IGNhbiB3YWl0IGZvciBrbWFsbG9jCisgKiB0byBwb3NzaWJsZSBzbGVlcCwgdGhpcyByb3V0aW5lIGNhbiBiZSBjYWxsZWQgd2l0aCBnZXRfZnJvbV9wb29sIHNldCB0byAwLgorICogY21kX2ZyZWUoKSBNVVNUIGJlIGNhbGxlZCB3aXRoIGEgZ290X2Zyb21fcG9vbCBzZXQgdG8gMCBpZiBjbWRfYWxsb2Mgd2FzLgorICovCitzdGF0aWMgQ29tbWFuZExpc3Rfc3RydWN0ICpjbWRfYWxsb2MoY3Rscl9pbmZvX3QgKmgsIGludCBnZXRfZnJvbV9wb29sKQogewogCUNvbW1hbmRMaXN0X3N0cnVjdCAqYzsKLQlpbnQgaTsgCisJaW50IGk7CiAJdTY0Yml0IHRlbXA2NDsKIAlkbWFfYWRkcl90IGNtZF9kbWFfaGFuZGxlLCBlcnJfZG1hX2hhbmRsZTsKIAotCWlmICghZ2V0X2Zyb21fcG9vbCkKLQl7Ci0JCWMgPSAoQ29tbWFuZExpc3Rfc3RydWN0ICopIHBjaV9hbGxvY19jb25zaXN0ZW50KAotCQkJaC0+cGRldiwgc2l6ZW9mKENvbW1hbmRMaXN0X3N0cnVjdCksICZjbWRfZG1hX2hhbmRsZSk7IAotICAgICAgICAJaWYoYz09TlVMTCkKLSAgICAgICAgICAgICAgICAgCXJldHVybiBOVUxMOworCWlmICghZ2V0X2Zyb21fcG9vbCkgeworCQljID0gKENvbW1hbmRMaXN0X3N0cnVjdCAqKSBwY2lfYWxsb2NfY29uc2lzdGVudChoLT5wZGV2LAorCQkJc2l6ZW9mKENvbW1hbmRMaXN0X3N0cnVjdCksICZjbWRfZG1hX2hhbmRsZSk7CisJCWlmIChjID09IE5VTEwpCisJCQlyZXR1cm4gTlVMTDsKIAkJbWVtc2V0KGMsIDAsIHNpemVvZihDb21tYW5kTGlzdF9zdHJ1Y3QpKTsKIAogCQljLT5jbWRpbmRleCA9IC0xOwogCi0JCWMtPmVycl9pbmZvID0gKEVycm9ySW5mb19zdHJ1Y3QgKilwY2lfYWxsb2NfY29uc2lzdGVudCgKLQkJCQkJaC0+cGRldiwgc2l6ZW9mKEVycm9ySW5mb19zdHJ1Y3QpLCAKLQkJCQkJJmVycl9kbWFfaGFuZGxlKTsKLQkKLQkJaWYgKGMtPmVycl9pbmZvID09IE5VTEwpCi0JCXsKLQkJCXBjaV9mcmVlX2NvbnNpc3RlbnQoaC0+cGRldiwgCisJCWMtPmVycl9pbmZvID0gKEVycm9ySW5mb19zdHJ1Y3QgKikKKwkJICAgIHBjaV9hbGxvY19jb25zaXN0ZW50KGgtPnBkZXYsIHNpemVvZihFcnJvckluZm9fc3RydWN0KSwKKwkJCSAgICAmZXJyX2RtYV9oYW5kbGUpOworCisJCWlmIChjLT5lcnJfaW5mbyA9PSBOVUxMKSB7CisJCQlwY2lfZnJlZV9jb25zaXN0ZW50KGgtPnBkZXYsCiAJCQkJc2l6ZW9mKENvbW1hbmRMaXN0X3N0cnVjdCksIGMsIGNtZF9kbWFfaGFuZGxlKTsKIAkJCXJldHVybiBOVUxMOwogCQl9CiAJCW1lbXNldChjLT5lcnJfaW5mbywgMCwgc2l6ZW9mKEVycm9ySW5mb19zdHJ1Y3QpKTsKLQl9IGVsc2UgLyogZ2V0IGl0IG91dCBvZiB0aGUgY29udHJvbGxlcnMgcG9vbCAqLyAKLQl7Ci0JICAgICAJZG8gewotICAgICAgICAgICAgICAgIAlpID0gZmluZF9maXJzdF96ZXJvX2JpdChoLT5jbWRfcG9vbF9iaXRzLCBOUl9DTURTKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID09IE5SX0NNRFMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgICAgIH0gd2hpbGUodGVzdF9hbmRfc2V0X2JpdChpICYgKEJJVFNfUEVSX0xPTkcgLSAxKSwgaC0+Y21kX3Bvb2xfYml0cysoaS9CSVRTX1BFUl9MT05HKSkgIT0gMCk7CisJfSBlbHNlIHsJCS8qIGdldCBpdCBvdXQgb2YgdGhlIGNvbnRyb2xsZXJzIHBvb2wgKi8KKworCQlkbyB7CisJCQlpID0gZmluZF9maXJzdF96ZXJvX2JpdChoLT5jbWRfcG9vbF9iaXRzLCBOUl9DTURTKTsKKwkJCWlmIChpID09IE5SX0NNRFMpCisJCQkJcmV0dXJuIE5VTEw7CisJCX0gd2hpbGUgKHRlc3RfYW5kX3NldF9iaXQKKwkJCSAoaSAmIChCSVRTX1BFUl9MT05HIC0gMSksCisJCQkgIGgtPmNtZF9wb29sX2JpdHMgKyAoaSAvIEJJVFNfUEVSX0xPTkcpKSAhPSAwKTsKICNpZmRlZiBDQ0lTU19ERUJVRwogCQlwcmludGsoS0VSTl9ERUJVRyAiY2Npc3M6IHVzaW5nIGNvbW1hbmQgYnVmZmVyICVkXG4iLCBpKTsKICNlbmRpZgotICAgICAgICAgICAgICAgIGMgPSBoLT5jbWRfcG9vbCArIGk7CisJCWMgPSBoLT5jbWRfcG9vbCArIGk7CiAJCW1lbXNldChjLCAwLCBzaXplb2YoQ29tbWFuZExpc3Rfc3RydWN0KSk7Ci0JCWNtZF9kbWFfaGFuZGxlID0gaC0+Y21kX3Bvb2xfZGhhbmRsZSAKLQkJCQkJKyBpKnNpemVvZihDb21tYW5kTGlzdF9zdHJ1Y3QpOworCQljbWRfZG1hX2hhbmRsZSA9IGgtPmNtZF9wb29sX2RoYW5kbGUKKwkJICAgICsgaSAqIHNpemVvZihDb21tYW5kTGlzdF9zdHJ1Y3QpOwogCQljLT5lcnJfaW5mbyA9IGgtPmVycmluZm9fcG9vbCArIGk7CiAJCW1lbXNldChjLT5lcnJfaW5mbywgMCwgc2l6ZW9mKEVycm9ySW5mb19zdHJ1Y3QpKTsKLQkJZXJyX2RtYV9oYW5kbGUgPSBoLT5lcnJpbmZvX3Bvb2xfZGhhbmRsZSAKLQkJCQkJKyBpKnNpemVvZihFcnJvckluZm9fc3RydWN0KTsKLSAgICAgICAgICAgICAgICBoLT5ucl9hbGxvY3MrKzsKKwkJZXJyX2RtYV9oYW5kbGUgPSBoLT5lcnJpbmZvX3Bvb2xfZGhhbmRsZQorCQkgICAgKyBpICogc2l6ZW9mKEVycm9ySW5mb19zdHJ1Y3QpOworCQloLT5ucl9hbGxvY3MrKzsKIAogCQljLT5jbWRpbmRleCA9IGk7Ci0gICAgICAgIH0KKwl9CiAKIAljLT5idXNhZGRyID0gKF9fdTMyKSBjbWRfZG1hX2hhbmRsZTsKLQl0ZW1wNjQudmFsID0gKF9fdTY0KSBlcnJfZG1hX2hhbmRsZTsJCisJdGVtcDY0LnZhbCA9IChfX3U2NCkgZXJyX2RtYV9oYW5kbGU7CiAJYy0+RXJyRGVzYy5BZGRyLmxvd2VyID0gdGVtcDY0LnZhbDMyLmxvd2VyOwogCWMtPkVyckRlc2MuQWRkci51cHBlciA9IHRlbXA2NC52YWwzMi51cHBlcjsKIAljLT5FcnJEZXNjLkxlbiA9IHNpemVvZihFcnJvckluZm9fc3RydWN0KTsKLQkKKwogCWMtPmN0bHIgPSBoLT5jdGxyOwotICAgICAgICByZXR1cm4gYzsKLQotCisJcmV0dXJuIGM7CiB9CiAKLS8qIAotICogRnJlZXMgYSBjb21tYW5kIGJsb2NrIHRoYXQgd2FzIHByZXZpb3VzbHkgYWxsb2NhdGVkIHdpdGggY21kX2FsbG9jKCkuIAorLyoKKyAqIEZyZWVzIGEgY29tbWFuZCBibG9jayB0aGF0IHdhcyBwcmV2aW91c2x5IGFsbG9jYXRlZCB3aXRoIGNtZF9hbGxvYygpLgogICovCiBzdGF0aWMgdm9pZCBjbWRfZnJlZShjdGxyX2luZm9fdCAqaCwgQ29tbWFuZExpc3Rfc3RydWN0ICpjLCBpbnQgZ290X2Zyb21fcG9vbCkKIHsKIAlpbnQgaTsKIAl1NjRiaXQgdGVtcDY0OwogCi0JaWYoICFnb3RfZnJvbV9wb29sKQotCXsgCisJaWYgKCFnb3RfZnJvbV9wb29sKSB7CiAJCXRlbXA2NC52YWwzMi5sb3dlciA9IGMtPkVyckRlc2MuQWRkci5sb3dlcjsKIAkJdGVtcDY0LnZhbDMyLnVwcGVyID0gYy0+RXJyRGVzYy5BZGRyLnVwcGVyOwotCQlwY2lfZnJlZV9jb25zaXN0ZW50KGgtPnBkZXYsIHNpemVvZihFcnJvckluZm9fc3RydWN0KSwgCi0JCQljLT5lcnJfaW5mbywgKGRtYV9hZGRyX3QpIHRlbXA2NC52YWwpOwotCQlwY2lfZnJlZV9jb25zaXN0ZW50KGgtPnBkZXYsIHNpemVvZihDb21tYW5kTGlzdF9zdHJ1Y3QpLCAKLQkJCWMsIChkbWFfYWRkcl90KSBjLT5idXNhZGRyKTsKLQl9IGVsc2UgCi0JeworCQlwY2lfZnJlZV9jb25zaXN0ZW50KGgtPnBkZXYsIHNpemVvZihFcnJvckluZm9fc3RydWN0KSwKKwkJCQkgICAgYy0+ZXJyX2luZm8sIChkbWFfYWRkcl90KSB0ZW1wNjQudmFsKTsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChoLT5wZGV2LCBzaXplb2YoQ29tbWFuZExpc3Rfc3RydWN0KSwKKwkJCQkgICAgYywgKGRtYV9hZGRyX3QpIGMtPmJ1c2FkZHIpOworCX0gZWxzZSB7CiAJCWkgPSBjIC0gaC0+Y21kX3Bvb2w7Ci0JCWNsZWFyX2JpdChpJihCSVRTX1BFUl9MT05HLTEpLCBoLT5jbWRfcG9vbF9iaXRzKyhpL0JJVFNfUEVSX0xPTkcpKTsKLSAgICAgICAgICAgICAgICBoLT5ucl9mcmVlcysrOwotICAgICAgICB9CisJCWNsZWFyX2JpdChpICYgKEJJVFNfUEVSX0xPTkcgLSAxKSwKKwkJCSAgaC0+Y21kX3Bvb2xfYml0cyArIChpIC8gQklUU19QRVJfTE9ORykpOworCQloLT5ucl9mcmVlcysrOworCX0KIH0KIAogc3RhdGljIGlubGluZSBjdGxyX2luZm9fdCAqZ2V0X2hvc3Qoc3RydWN0IGdlbmRpc2sgKmRpc2spCiB7Ci0JcmV0dXJuIGRpc2stPnF1ZXVlLT5xdWV1ZWRhdGE7IAorCXJldHVybiBkaXNrLT5xdWV1ZS0+cXVldWVkYXRhOwogfQogCiBzdGF0aWMgaW5saW5lIGRyaXZlX2luZm9fc3RydWN0ICpnZXRfZHJ2KHN0cnVjdCBnZW5kaXNrICpkaXNrKQpAQCAtNDg1LDcgKzQ3NCw3IEBACiAKICNpZmRlZiBDQ0lTU19ERUJVRwogCXByaW50ayhLRVJOX0RFQlVHICJjY2lzc19vcGVuICVzXG4iLCBpbm9kZS0+aV9iZGV2LT5iZF9kaXNrLT5kaXNrX25hbWUpOwotI2VuZGlmIC8qIENDSVNTX0RFQlVHICovIAorI2VuZGlmCQkJCS8qIENDSVNTX0RFQlVHICovCiAKIAlpZiAoaG9zdC0+YnVzeV9pbml0aWFsaXppbmcgfHwgZHJ2LT5idXN5X2NvbmZpZ3VyaW5nKQogCQlyZXR1cm4gLUVCVVNZOwpAQCAtNDk4LDEwICs0ODcsMTAgQEAKIAkgKiBmb3IgInJhdyBjb250cm9sbGVyIi4KIAkgKi8KIAlpZiAoZHJ2LT5ucl9ibG9ja3MgPT0gMCkgewotCQlpZiAoaW1pbm9yKGlub2RlKSAhPSAwKQl7IAkvKiBub3Qgbm9kZSAwPyAqLworCQlpZiAoaW1pbm9yKGlub2RlKSAhPSAwKSB7CS8qIG5vdCBub2RlIDA/ICovCiAJCQkvKiBpZiBub3Qgbm9kZSAwIG1ha2Ugc3VyZSBpdCBpcyBhIHBhcnRpdGlvbiA9IDAgKi8KIAkJCWlmIChpbWlub3IoaW5vZGUpICYgMHgwZikgewotCQkJcmV0dXJuIC1FTlhJTzsKKwkJCQlyZXR1cm4gLUVOWElPOwogCQkJCS8qIGlmIGl0IGlzLCBtYWtlIHN1cmUgd2UgaGF2ZSBhIExVTiBJRCAqLwogCQkJfSBlbHNlIGlmIChkcnYtPkx1bklEID09IDApIHsKIAkJCQlyZXR1cm4gLUVOWElPOwpAQCAtNTE0LDYgKzUwMyw3IEBACiAJaG9zdC0+dXNhZ2VfY291bnQrKzsKIAlyZXR1cm4gMDsKIH0KKwogLyoKICAqIENsb3NlLiAgU3luYyBmaXJzdC4KICAqLwpAQCAtNTIzLDggKzUxMyw5IEBACiAJZHJpdmVfaW5mb19zdHJ1Y3QgKmRydiA9IGdldF9kcnYoaW5vZGUtPmlfYmRldi0+YmRfZGlzayk7CiAKICNpZmRlZiBDQ0lTU19ERUJVRwotCXByaW50ayhLRVJOX0RFQlVHICJjY2lzc19yZWxlYXNlICVzXG4iLCBpbm9kZS0+aV9iZGV2LT5iZF9kaXNrLT5kaXNrX25hbWUpOwotI2VuZGlmIC8qIENDSVNTX0RFQlVHICovCisJcHJpbnRrKEtFUk5fREVCVUcgImNjaXNzX3JlbGVhc2UgJXNcbiIsCisJICAgICAgIGlub2RlLT5pX2JkZXYtPmJkX2Rpc2stPmRpc2tfbmFtZSk7CisjZW5kaWYJCQkJLyogQ0NJU1NfREVCVUcgKi8KIAogCWRydi0+dXNhZ2VfY291bnQtLTsKIAlob3N0LT51c2FnZV9jb3VudC0tOwpAQCAtNTQyLDggKzUzMywxMCBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgY2Npc3NfaW9jdGwzMl9wYXNzdGhydShzdHJ1Y3QgZmlsZSAqZiwgdW5zaWduZWQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7Ci1zdGF0aWMgaW50IGNjaXNzX2lvY3RsMzJfYmlnX3Bhc3N0aHJ1KHN0cnVjdCBmaWxlICpmLCB1bnNpZ25lZCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKK3N0YXRpYyBpbnQgY2Npc3NfaW9jdGwzMl9wYXNzdGhydShzdHJ1Y3QgZmlsZSAqZiwgdW5zaWduZWQgY21kLAorCQkJCSAgdW5zaWduZWQgbG9uZyBhcmcpOworc3RhdGljIGludCBjY2lzc19pb2N0bDMyX2JpZ19wYXNzdGhydShzdHJ1Y3QgZmlsZSAqZiwgdW5zaWduZWQgY21kLAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYXJnKTsKIAogc3RhdGljIGxvbmcgY2Npc3NfY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmLCB1bnNpZ25lZCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewpAQCAtNTc1LDE5ICs1NjgsMjYgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbnQgY2Npc3NfaW9jdGwzMl9wYXNzdGhydShzdHJ1Y3QgZmlsZSAqZiwgdW5zaWduZWQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3N0YXRpYyBpbnQgY2Npc3NfaW9jdGwzMl9wYXNzdGhydShzdHJ1Y3QgZmlsZSAqZiwgdW5zaWduZWQgY21kLAorCQkJCSAgdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJSU9DVEwzMl9Db21tYW5kX3N0cnVjdCBfX3VzZXIgKmFyZzMyID0KLQkJKElPQ1RMMzJfQ29tbWFuZF9zdHJ1Y3QgX191c2VyICopIGFyZzsKKwkgICAgKElPQ1RMMzJfQ29tbWFuZF9zdHJ1Y3QgX191c2VyICopIGFyZzsKIAlJT0NUTF9Db21tYW5kX3N0cnVjdCBhcmc2NDsKIAlJT0NUTF9Db21tYW5kX3N0cnVjdCBfX3VzZXIgKnAgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoYXJnNjQpKTsKIAlpbnQgZXJyOwogCXUzMiBjcDsKIAogCWVyciA9IDA7Ci0JZXJyIHw9IGNvcHlfZnJvbV91c2VyKCZhcmc2NC5MVU5faW5mbywgJmFyZzMyLT5MVU5faW5mbywgc2l6ZW9mKGFyZzY0LkxVTl9pbmZvKSk7Ci0JZXJyIHw9IGNvcHlfZnJvbV91c2VyKCZhcmc2NC5SZXF1ZXN0LCAmYXJnMzItPlJlcXVlc3QsIHNpemVvZihhcmc2NC5SZXF1ZXN0KSk7Ci0JZXJyIHw9IGNvcHlfZnJvbV91c2VyKCZhcmc2NC5lcnJvcl9pbmZvLCAmYXJnMzItPmVycm9yX2luZm8sIHNpemVvZihhcmc2NC5lcnJvcl9pbmZvKSk7CisJZXJyIHw9CisJICAgIGNvcHlfZnJvbV91c2VyKCZhcmc2NC5MVU5faW5mbywgJmFyZzMyLT5MVU5faW5mbywKKwkJCSAgIHNpemVvZihhcmc2NC5MVU5faW5mbykpOworCWVyciB8PQorCSAgICBjb3B5X2Zyb21fdXNlcigmYXJnNjQuUmVxdWVzdCwgJmFyZzMyLT5SZXF1ZXN0LAorCQkJICAgc2l6ZW9mKGFyZzY0LlJlcXVlc3QpKTsKKwllcnIgfD0KKwkgICAgY29weV9mcm9tX3VzZXIoJmFyZzY0LmVycm9yX2luZm8sICZhcmczMi0+ZXJyb3JfaW5mbywKKwkJCSAgIHNpemVvZihhcmc2NC5lcnJvcl9pbmZvKSk7CiAJZXJyIHw9IGdldF91c2VyKGFyZzY0LmJ1Zl9zaXplLCAmYXJnMzItPmJ1Zl9zaXplKTsKIAllcnIgfD0gZ2V0X3VzZXIoY3AsICZhcmczMi0+YnVmKTsKIAlhcmc2NC5idWYgPSBjb21wYXRfcHRyKGNwKTsKQEAgLTU5NiwyOCArNTk2LDM4IEBACiAJaWYgKGVycikKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQllcnIgPSBkb19pb2N0bChmLCBDQ0lTU19QQVNTVEhSVSwgKHVuc2lnbmVkIGxvbmcpIHApOworCWVyciA9IGRvX2lvY3RsKGYsIENDSVNTX1BBU1NUSFJVLCAodW5zaWduZWQgbG9uZylwKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwotCWVyciB8PSBjb3B5X2luX3VzZXIoJmFyZzMyLT5lcnJvcl9pbmZvLCAmcC0+ZXJyb3JfaW5mbywgc2l6ZW9mKGFyZzMyLT5lcnJvcl9pbmZvKSk7CisJZXJyIHw9CisJICAgIGNvcHlfaW5fdXNlcigmYXJnMzItPmVycm9yX2luZm8sICZwLT5lcnJvcl9pbmZvLAorCQkJIHNpemVvZihhcmczMi0+ZXJyb3JfaW5mbykpOwogCWlmIChlcnIpCiAJCXJldHVybiAtRUZBVUxUOwogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgY2Npc3NfaW9jdGwzMl9iaWdfcGFzc3RocnUoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCitzdGF0aWMgaW50IGNjaXNzX2lvY3RsMzJfYmlnX3Bhc3N0aHJ1KHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBjbWQsCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJQklHX0lPQ1RMMzJfQ29tbWFuZF9zdHJ1Y3QgX191c2VyICphcmczMiA9Ci0JCShCSUdfSU9DVEwzMl9Db21tYW5kX3N0cnVjdCBfX3VzZXIgKikgYXJnOworCSAgICAoQklHX0lPQ1RMMzJfQ29tbWFuZF9zdHJ1Y3QgX191c2VyICopIGFyZzsKIAlCSUdfSU9DVExfQ29tbWFuZF9zdHJ1Y3QgYXJnNjQ7Ci0JQklHX0lPQ1RMX0NvbW1hbmRfc3RydWN0IF9fdXNlciAqcCA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZihhcmc2NCkpOworCUJJR19JT0NUTF9Db21tYW5kX3N0cnVjdCBfX3VzZXIgKnAgPQorCSAgICBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoYXJnNjQpKTsKIAlpbnQgZXJyOwogCXUzMiBjcDsKIAogCWVyciA9IDA7Ci0JZXJyIHw9IGNvcHlfZnJvbV91c2VyKCZhcmc2NC5MVU5faW5mbywgJmFyZzMyLT5MVU5faW5mbywgc2l6ZW9mKGFyZzY0LkxVTl9pbmZvKSk7Ci0JZXJyIHw9IGNvcHlfZnJvbV91c2VyKCZhcmc2NC5SZXF1ZXN0LCAmYXJnMzItPlJlcXVlc3QsIHNpemVvZihhcmc2NC5SZXF1ZXN0KSk7Ci0JZXJyIHw9IGNvcHlfZnJvbV91c2VyKCZhcmc2NC5lcnJvcl9pbmZvLCAmYXJnMzItPmVycm9yX2luZm8sIHNpemVvZihhcmc2NC5lcnJvcl9pbmZvKSk7CisJZXJyIHw9CisJICAgIGNvcHlfZnJvbV91c2VyKCZhcmc2NC5MVU5faW5mbywgJmFyZzMyLT5MVU5faW5mbywKKwkJCSAgIHNpemVvZihhcmc2NC5MVU5faW5mbykpOworCWVyciB8PQorCSAgICBjb3B5X2Zyb21fdXNlcigmYXJnNjQuUmVxdWVzdCwgJmFyZzMyLT5SZXF1ZXN0LAorCQkJICAgc2l6ZW9mKGFyZzY0LlJlcXVlc3QpKTsKKwllcnIgfD0KKwkgICAgY29weV9mcm9tX3VzZXIoJmFyZzY0LmVycm9yX2luZm8sICZhcmczMi0+ZXJyb3JfaW5mbywKKwkJCSAgIHNpemVvZihhcmc2NC5lcnJvcl9pbmZvKSk7CiAJZXJyIHw9IGdldF91c2VyKGFyZzY0LmJ1Zl9zaXplLCAmYXJnMzItPmJ1Zl9zaXplKTsKIAllcnIgfD0gZ2V0X3VzZXIoYXJnNjQubWFsbG9jX3NpemUsICZhcmczMi0+bWFsbG9jX3NpemUpOwogCWVyciB8PSBnZXRfdXNlcihjcCwgJmFyZzMyLT5idWYpOwpAQCAtNjI1LDEyICs2MzUsMTQgQEAKIAllcnIgfD0gY29weV90b191c2VyKHAsICZhcmc2NCwgc2l6ZW9mKGFyZzY0KSk7CiAKIAlpZiAoZXJyKQotCQkgcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAtRUZBVUxUOwogCi0JZXJyID0gZG9faW9jdGwoZmlsZSwgQ0NJU1NfQklHX1BBU1NUSFJVLCAodW5zaWduZWQgbG9uZykgcCk7CisJZXJyID0gZG9faW9jdGwoZmlsZSwgQ0NJU1NfQklHX1BBU1NUSFJVLCAodW5zaWduZWQgbG9uZylwKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwotCWVyciB8PSBjb3B5X2luX3VzZXIoJmFyZzMyLT5lcnJvcl9pbmZvLCAmcC0+ZXJyb3JfaW5mbywgc2l6ZW9mKGFyZzMyLT5lcnJvcl9pbmZvKSk7CisJZXJyIHw9CisJICAgIGNvcHlfaW5fdXNlcigmYXJnMzItPmVycm9yX2luZm8sICZwLT5lcnJvcl9pbmZvLAorCQkJIHNpemVvZihhcmczMi0+ZXJyb3JfaW5mbykpOwogCWlmIChlcnIpCiAJCXJldHVybiAtRUZBVUxUOwogCXJldHVybiBlcnI7CkBAIC02NTEsMTAgKzY2MywxMCBAQAogfQogCiAvKgotICogaW9jdGwgCisgKiBpb2N0bAogICovCi1zdGF0aWMgaW50IGNjaXNzX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlcCwgCi0JCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQorc3RhdGljIGludCBjY2lzc19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKIAlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2ID0gaW5vZGUtPmlfYmRldjsKIAlzdHJ1Y3QgZ2VuZGlzayAqZGlzayA9IGJkZXYtPmJkX2Rpc2s7CkBAIC02NjUsMTcxICs2NzcsMTkzIEBACiAKICNpZmRlZiBDQ0lTU19ERUJVRwogCXByaW50ayhLRVJOX0RFQlVHICJjY2lzc19pb2N0bDogQ2FsbGVkIHdpdGggY21kPSV4ICVseFxuIiwgY21kLCBhcmcpOwotI2VuZGlmIC8qIENDSVNTX0RFQlVHICovIAotCQotCXN3aXRjaChjbWQpIHsKKyNlbmRpZgkJCQkvKiBDQ0lTU19ERUJVRyAqLworCisJc3dpdGNoIChjbWQpIHsKIAljYXNlIENDSVNTX0dFVFBDSUlORk86Ci0JewotCQljY2lzc19wY2lfaW5mb19zdHJ1Y3QgcGNpaW5mbzsKLQotCQlpZiAoIWFyZykgcmV0dXJuIC1FSU5WQUw7Ci0JCXBjaWluZm8uZG9tYWluID0gcGNpX2RvbWFpbl9ucihob3N0LT5wZGV2LT5idXMpOwotCQlwY2lpbmZvLmJ1cyA9IGhvc3QtPnBkZXYtPmJ1cy0+bnVtYmVyOwotCQlwY2lpbmZvLmRldl9mbiA9IGhvc3QtPnBkZXYtPmRldmZuOwotCQlwY2lpbmZvLmJvYXJkX2lkID0gaG9zdC0+Ym9hcmRfaWQ7Ci0JCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnBjaWluZm8sICBzaXplb2YoIGNjaXNzX3BjaV9pbmZvX3N0cnVjdCApKSkKLQkJCXJldHVybiAgLUVGQVVMVDsKLQkJcmV0dXJuKDApOwotCX0JCi0JY2FzZSBDQ0lTU19HRVRJTlRJTkZPOgotCXsKLQkJY2Npc3NfY29hbGludF9zdHJ1Y3QgaW50aW5mbzsKLQkJaWYgKCFhcmcpIHJldHVybiAtRUlOVkFMOwotCQlpbnRpbmZvLmRlbGF5ID0gcmVhZGwoJmhvc3QtPmNmZ3RhYmxlLT5Ib3N0V3JpdGUuQ29hbEludERlbGF5KTsKLQkJaW50aW5mby5jb3VudCA9IHJlYWRsKCZob3N0LT5jZmd0YWJsZS0+SG9zdFdyaXRlLkNvYWxJbnRDb3VudCk7Ci0JCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmludGluZm8sIHNpemVvZiggY2Npc3NfY29hbGludF9zdHJ1Y3QgKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLSAgICAgICAgICAgICAgICByZXR1cm4oMCk7Ci0gICAgICAgIH0KLQljYXNlIENDSVNTX1NFVElOVElORk86Ci0gICAgICAgIHsKLSAgICAgICAgICAgICAgICBjY2lzc19jb2FsaW50X3N0cnVjdCBpbnRpbmZvOwotCQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCQlpbnQgaTsKLQotCQlpZiAoIWFyZykgcmV0dXJuIC1FSU5WQUw7CQotCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpIHJldHVybiAtRVBFUk07Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmaW50aW5mbywgYXJncCwgc2l6ZW9mKCBjY2lzc19jb2FsaW50X3N0cnVjdCkpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCWlmICggKGludGluZm8uZGVsYXkgPT0gMCApICYmIChpbnRpbmZvLmNvdW50ID09IDApKQotCiAJCXsKLS8vCQkJcHJpbnRrKCJjY2lzc19pb2N0bDogZGVsYXkgYW5kIGNvdW50IGNhbm5vdCBiZSAwXG4iKTsKLQkJCXJldHVybiggLUVJTlZBTCk7CisJCQljY2lzc19wY2lfaW5mb19zdHJ1Y3QgcGNpaW5mbzsKKworCQkJaWYgKCFhcmcpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlwY2lpbmZvLmRvbWFpbiA9IHBjaV9kb21haW5fbnIoaG9zdC0+cGRldi0+YnVzKTsKKwkJCXBjaWluZm8uYnVzID0gaG9zdC0+cGRldi0+YnVzLT5udW1iZXI7CisJCQlwY2lpbmZvLmRldl9mbiA9IGhvc3QtPnBkZXYtPmRldmZuOworCQkJcGNpaW5mby5ib2FyZF9pZCA9IGhvc3QtPmJvYXJkX2lkOworCQkJaWYgKGNvcHlfdG9fdXNlcgorCQkJICAgIChhcmdwLCAmcGNpaW5mbywgc2l6ZW9mKGNjaXNzX3BjaV9pbmZvX3N0cnVjdCkpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJcmV0dXJuIDA7CiAJCX0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoQ0NJU1NfTE9DSyhjdGxyKSwgZmxhZ3MpOwotCQkvKiBVcGRhdGUgdGhlIGZpZWxkLCBhbmQgdGhlbiByaW5nIHRoZSBkb29yYmVsbCAqLyAKLQkJd3JpdGVsKCBpbnRpbmZvLmRlbGF5LCAKLQkJCSYoaG9zdC0+Y2ZndGFibGUtPkhvc3RXcml0ZS5Db2FsSW50RGVsYXkpKTsKLQkJd3JpdGVsKCBpbnRpbmZvLmNvdW50LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICYoaG9zdC0+Y2ZndGFibGUtPkhvc3RXcml0ZS5Db2FsSW50Q291bnQpKTsKLQkJd3JpdGVsKCBDRkdUQkxfQ2hhbmdlUmVxLCBob3N0LT52YWRkciArIFNBNV9ET09SQkVMTCk7CisJY2FzZSBDQ0lTU19HRVRJTlRJTkZPOgorCQl7CisJCQljY2lzc19jb2FsaW50X3N0cnVjdCBpbnRpbmZvOworCQkJaWYgKCFhcmcpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlpbnRpbmZvLmRlbGF5ID0KKwkJCSAgICByZWFkbCgmaG9zdC0+Y2ZndGFibGUtPkhvc3RXcml0ZS5Db2FsSW50RGVsYXkpOworCQkJaW50aW5mby5jb3VudCA9CisJCQkgICAgcmVhZGwoJmhvc3QtPmNmZ3RhYmxlLT5Ib3N0V3JpdGUuQ29hbEludENvdW50KTsKKwkJCWlmIChjb3B5X3RvX3VzZXIKKwkJCSAgICAoYXJncCwgJmludGluZm8sIHNpemVvZihjY2lzc19jb2FsaW50X3N0cnVjdCkpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJcmV0dXJuIDA7CisJCX0KKwljYXNlIENDSVNTX1NFVElOVElORk86CisJCXsKKwkJCWNjaXNzX2NvYWxpbnRfc3RydWN0IGludGluZm87CisJCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCQkJaW50IGk7CiAKLQkJZm9yKGk9MDtpPE1BWF9JT0NUTF9DT05GSUdfV0FJVDtpKyspIHsKLQkJCWlmICghKHJlYWRsKGhvc3QtPnZhZGRyICsgU0E1X0RPT1JCRUxMKSAKLQkJCQkJJiBDRkdUQkxfQ2hhbmdlUmVxKSkKLQkJCQlicmVhazsKLQkJCS8qIGRlbGF5IGFuZCB0cnkgYWdhaW4gKi8KLQkJCXVkZWxheSgxMDAwKTsKLQkJfQkKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShDQ0lTU19MT0NLKGN0bHIpLCBmbGFncyk7Ci0JCWlmIChpID49IE1BWF9JT0NUTF9DT05GSUdfV0FJVCkKLQkJCXJldHVybiAtRUFHQUlOOwotICAgICAgICAgICAgICAgIHJldHVybigwKTsKLSAgICAgICAgfQorCQkJaWYgKCFhcmcpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCQkJcmV0dXJuIC1FUEVSTTsKKwkJCWlmIChjb3B5X2Zyb21fdXNlcgorCQkJICAgICgmaW50aW5mbywgYXJncCwgc2l6ZW9mKGNjaXNzX2NvYWxpbnRfc3RydWN0KSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlpZiAoKGludGluZm8uZGVsYXkgPT0gMCkgJiYgKGludGluZm8uY291bnQgPT0gMCkpCisJCQl7CisvLyAgICAgICAgICAgICAgICAgICAgICBwcmludGsoImNjaXNzX2lvY3RsOiBkZWxheSBhbmQgY291bnQgY2Fubm90IGJlIDBcbiIpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJc3Bpbl9sb2NrX2lycXNhdmUoQ0NJU1NfTE9DSyhjdGxyKSwgZmxhZ3MpOworCQkJLyogVXBkYXRlIHRoZSBmaWVsZCwgYW5kIHRoZW4gcmluZyB0aGUgZG9vcmJlbGwgKi8KKwkJCXdyaXRlbChpbnRpbmZvLmRlbGF5LAorCQkJICAgICAgICYoaG9zdC0+Y2ZndGFibGUtPkhvc3RXcml0ZS5Db2FsSW50RGVsYXkpKTsKKwkJCXdyaXRlbChpbnRpbmZvLmNvdW50LAorCQkJICAgICAgICYoaG9zdC0+Y2ZndGFibGUtPkhvc3RXcml0ZS5Db2FsSW50Q291bnQpKTsKKwkJCXdyaXRlbChDRkdUQkxfQ2hhbmdlUmVxLCBob3N0LT52YWRkciArIFNBNV9ET09SQkVMTCk7CisKKwkJCWZvciAoaSA9IDA7IGkgPCBNQVhfSU9DVExfQ09ORklHX1dBSVQ7IGkrKykgeworCQkJCWlmICghKHJlYWRsKGhvc3QtPnZhZGRyICsgU0E1X0RPT1JCRUxMKQorCQkJCSAgICAgICYgQ0ZHVEJMX0NoYW5nZVJlcSkpCisJCQkJCWJyZWFrOworCQkJCS8qIGRlbGF5IGFuZCB0cnkgYWdhaW4gKi8KKwkJCQl1ZGVsYXkoMTAwMCk7CisJCQl9CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKENDSVNTX0xPQ0soY3RsciksIGZsYWdzKTsKKwkJCWlmIChpID49IE1BWF9JT0NUTF9DT05GSUdfV0FJVCkKKwkJCQlyZXR1cm4gLUVBR0FJTjsKKwkJCXJldHVybiAwOworCQl9CiAJY2FzZSBDQ0lTU19HRVROT0RFTkFNRToKLSAgICAgICAgewotICAgICAgICAgICAgICAgIE5vZGVOYW1lX3R5cGUgTm9kZU5hbWU7Ci0JCWludCBpOyAKKwkJeworCQkJTm9kZU5hbWVfdHlwZSBOb2RlTmFtZTsKKwkJCWludCBpOwogCi0JCWlmICghYXJnKSByZXR1cm4gLUVJTlZBTDsKLQkJZm9yKGk9MDtpPDE2O2krKykKLQkJCU5vZGVOYW1lW2ldID0gcmVhZGIoJmhvc3QtPmNmZ3RhYmxlLT5TZXJ2ZXJOYW1lW2ldKTsKLSAgICAgICAgICAgICAgICBpZiAoY29weV90b191c2VyKGFyZ3AsIE5vZGVOYW1lLCBzaXplb2YoIE5vZGVOYW1lX3R5cGUpKSkKLSAgICAgICAgICAgICAgICAJcmV0dXJuICAtRUZBVUxUOwotICAgICAgICAgICAgICAgIHJldHVybigwKTsKLSAgICAgICAgfQorCQkJaWYgKCFhcmcpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKwkJCQlOb2RlTmFtZVtpXSA9CisJCQkJICAgIHJlYWRiKCZob3N0LT5jZmd0YWJsZS0+U2VydmVyTmFtZVtpXSk7CisJCQlpZiAoY29weV90b191c2VyKGFyZ3AsIE5vZGVOYW1lLCBzaXplb2YoTm9kZU5hbWVfdHlwZSkpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJcmV0dXJuIDA7CisJCX0KIAljYXNlIENDSVNTX1NFVE5PREVOQU1FOgotCXsKLQkJTm9kZU5hbWVfdHlwZSBOb2RlTmFtZTsKLQkJdW5zaWduZWQgbG9uZyBmbGFnczsKLQkJaW50IGk7CisJCXsKKwkJCU5vZGVOYW1lX3R5cGUgTm9kZU5hbWU7CisJCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCQkJaW50IGk7CiAKLQkJaWYgKCFhcmcpIHJldHVybiAtRUlOVkFMOwotCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpIHJldHVybiAtRVBFUk07Ci0JCQotCQlpZiAoY29weV9mcm9tX3VzZXIoTm9kZU5hbWUsIGFyZ3AsIHNpemVvZiggTm9kZU5hbWVfdHlwZSkpKQotCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlpZiAoIWFyZykKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJCQlyZXR1cm4gLUVQRVJNOwogCi0JCXNwaW5fbG9ja19pcnFzYXZlKENDSVNTX0xPQ0soY3RsciksIGZsYWdzKTsKKwkJCWlmIChjb3B5X2Zyb21fdXNlcgorCQkJICAgIChOb2RlTmFtZSwgYXJncCwgc2l6ZW9mKE5vZGVOYW1lX3R5cGUpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKIAotCQkJLyogVXBkYXRlIHRoZSBmaWVsZCwgYW5kIHRoZW4gcmluZyB0aGUgZG9vcmJlbGwgKi8gCi0JCWZvcihpPTA7aTwxNjtpKyspCi0JCQl3cml0ZWIoIE5vZGVOYW1lW2ldLCAmaG9zdC0+Y2ZndGFibGUtPlNlcnZlck5hbWVbaV0pOwotCQkJCi0JCXdyaXRlbCggQ0ZHVEJMX0NoYW5nZVJlcSwgaG9zdC0+dmFkZHIgKyBTQTVfRE9PUkJFTEwpOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoQ0NJU1NfTE9DSyhjdGxyKSwgZmxhZ3MpOwogCi0JCWZvcihpPTA7aTxNQVhfSU9DVExfQ09ORklHX1dBSVQ7aSsrKSB7Ci0JCQlpZiAoIShyZWFkbChob3N0LT52YWRkciArIFNBNV9ET09SQkVMTCkgCi0JCQkJCSYgQ0ZHVEJMX0NoYW5nZVJlcSkpCi0JCQkJYnJlYWs7Ci0JCQkvKiBkZWxheSBhbmQgdHJ5IGFnYWluICovCi0JCQl1ZGVsYXkoMTAwMCk7Ci0JCX0JCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoQ0NJU1NfTE9DSyhjdGxyKSwgZmxhZ3MpOwotCQlpZiAoaSA+PSBNQVhfSU9DVExfQ09ORklHX1dBSVQpCi0JCQlyZXR1cm4gLUVBR0FJTjsKLSAgICAgICAgICAgICAgICByZXR1cm4oMCk7Ci0gICAgICAgIH0KKwkJCS8qIFVwZGF0ZSB0aGUgZmllbGQsIGFuZCB0aGVuIHJpbmcgdGhlIGRvb3JiZWxsICovCisJCQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKwkJCQl3cml0ZWIoTm9kZU5hbWVbaV0sCisJCQkJICAgICAgICZob3N0LT5jZmd0YWJsZS0+U2VydmVyTmFtZVtpXSk7CisKKwkJCXdyaXRlbChDRkdUQkxfQ2hhbmdlUmVxLCBob3N0LT52YWRkciArIFNBNV9ET09SQkVMTCk7CisKKwkJCWZvciAoaSA9IDA7IGkgPCBNQVhfSU9DVExfQ09ORklHX1dBSVQ7IGkrKykgeworCQkJCWlmICghKHJlYWRsKGhvc3QtPnZhZGRyICsgU0E1X0RPT1JCRUxMKQorCQkJCSAgICAgICYgQ0ZHVEJMX0NoYW5nZVJlcSkpCisJCQkJCWJyZWFrOworCQkJCS8qIGRlbGF5IGFuZCB0cnkgYWdhaW4gKi8KKwkJCQl1ZGVsYXkoMTAwMCk7CisJCQl9CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKENDSVNTX0xPQ0soY3RsciksIGZsYWdzKTsKKwkJCWlmIChpID49IE1BWF9JT0NUTF9DT05GSUdfV0FJVCkKKwkJCQlyZXR1cm4gLUVBR0FJTjsKKwkJCXJldHVybiAwOworCQl9CiAKIAljYXNlIENDSVNTX0dFVEhFQVJUQkVBVDoKLSAgICAgICAgewotICAgICAgICAgICAgICAgIEhlYXJ0YmVhdF90eXBlIGhlYXJ0YmVhdDsKKwkJeworCQkJSGVhcnRiZWF0X3R5cGUgaGVhcnRiZWF0OwogCi0JCWlmICghYXJnKSByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgICAgICBoZWFydGJlYXQgPSByZWFkbCgmaG9zdC0+Y2ZndGFibGUtPkhlYXJ0QmVhdCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmaGVhcnRiZWF0LCBzaXplb2YoIEhlYXJ0YmVhdF90eXBlKSkpCi0gICAgICAgICAgICAgICAgCXJldHVybiAtRUZBVUxUOwotICAgICAgICAgICAgICAgIHJldHVybigwKTsKLSAgICAgICAgfQorCQkJaWYgKCFhcmcpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQloZWFydGJlYXQgPSByZWFkbCgmaG9zdC0+Y2ZndGFibGUtPkhlYXJ0QmVhdCk7CisJCQlpZiAoY29weV90b191c2VyCisJCQkgICAgKGFyZ3AsICZoZWFydGJlYXQsIHNpemVvZihIZWFydGJlYXRfdHlwZSkpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJcmV0dXJuIDA7CisJCX0KIAljYXNlIENDSVNTX0dFVEJVU1RZUEVTOgotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQnVzVHlwZXNfdHlwZSBCdXNUeXBlczsKKwkJeworCQkJQnVzVHlwZXNfdHlwZSBCdXNUeXBlczsKIAotCQlpZiAoIWFyZykgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgICAgICAgICAgQnVzVHlwZXMgPSByZWFkbCgmaG9zdC0+Y2ZndGFibGUtPkJ1c1R5cGVzKTsKLSAgICAgICAgICAgICAgICBpZiAoY29weV90b191c2VyKGFyZ3AsICZCdXNUeXBlcywgc2l6ZW9mKCBCdXNUeXBlc190eXBlKSApKQotICAgICAgICAgICAgICAgIAlyZXR1cm4gIC1FRkFVTFQ7Ci0gICAgICAgICAgICAgICAgcmV0dXJuKDApOwotICAgICAgICB9CisJCQlpZiAoIWFyZykKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCUJ1c1R5cGVzID0gcmVhZGwoJmhvc3QtPmNmZ3RhYmxlLT5CdXNUeXBlcyk7CisJCQlpZiAoY29weV90b191c2VyCisJCQkgICAgKGFyZ3AsICZCdXNUeXBlcywgc2l6ZW9mKEJ1c1R5cGVzX3R5cGUpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXJldHVybiAwOworCQl9CiAJY2FzZSBDQ0lTU19HRVRGSVJNVkVSOgotICAgICAgICB7Ci0JCUZpcm13YXJlVmVyX3R5cGUgZmlybXdhcmU7CisJCXsKKwkJCUZpcm13YXJlVmVyX3R5cGUgZmlybXdhcmU7CiAKLQkJaWYgKCFhcmcpIHJldHVybiAtRUlOVkFMOwotCQltZW1jcHkoZmlybXdhcmUsIGhvc3QtPmZpcm1fdmVyLCA0KTsKKwkJCWlmICghYXJnKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJbWVtY3B5KGZpcm13YXJlLCBob3N0LT5maXJtX3ZlciwgNCk7CiAKLSAgICAgICAgICAgICAgICBpZiAoY29weV90b191c2VyKGFyZ3AsIGZpcm13YXJlLCBzaXplb2YoIEZpcm13YXJlVmVyX3R5cGUpKSkKLSAgICAgICAgICAgICAgICAJcmV0dXJuIC1FRkFVTFQ7Ci0gICAgICAgICAgICAgICAgcmV0dXJuKDApOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgQ0NJU1NfR0VURFJJVlZFUjoKLSAgICAgICAgewotCQlEcml2ZXJWZXJfdHlwZSBEcml2ZXJWZXIgPSBEUklWRVJfVkVSU0lPTjsKKwkJCWlmIChjb3B5X3RvX3VzZXIKKwkJCSAgICAoYXJncCwgZmlybXdhcmUsIHNpemVvZihGaXJtd2FyZVZlcl90eXBlKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlyZXR1cm4gMDsKKwkJfQorCWNhc2UgQ0NJU1NfR0VURFJJVlZFUjoKKwkJeworCQkJRHJpdmVyVmVyX3R5cGUgRHJpdmVyVmVyID0gRFJJVkVSX1ZFUlNJT047CiAKLSAgICAgICAgICAgICAgICBpZiAoIWFyZykgcmV0dXJuIC1FSU5WQUw7CisJCQlpZiAoIWFyZykKKwkJCQlyZXR1cm4gLUVJTlZBTDsKIAotICAgICAgICAgICAgICAgIGlmIChjb3B5X3RvX3VzZXIoYXJncCwgJkRyaXZlclZlciwgc2l6ZW9mKCBEcml2ZXJWZXJfdHlwZSkgKSkKLSAgICAgICAgICAgICAgICAJcmV0dXJuIC1FRkFVTFQ7Ci0gICAgICAgICAgICAgICAgcmV0dXJuKDApOwotICAgICAgICB9CisJCQlpZiAoY29weV90b191c2VyCisJCQkgICAgKGFyZ3AsICZEcml2ZXJWZXIsIHNpemVvZihEcml2ZXJWZXJfdHlwZSkpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJcmV0dXJuIDA7CisJCX0KIAogCWNhc2UgQ0NJU1NfUkVWQUxJRFZPTFM6CiAJCWlmIChiZGV2ICE9IGJkZXYtPmJkX2NvbnRhaW5zIHx8IGRydiAhPSBob3N0LT5kcnYpCiAJCQlyZXR1cm4gLUVOWElPOwotICAgICAgICAgICAgICAgIHJldHVybiByZXZhbGlkYXRlX2FsbHZvbChob3N0KTsKKwkJcmV0dXJuIHJldmFsaWRhdGVfYWxsdm9sKGhvc3QpOwogCi0gCWNhc2UgQ0NJU1NfR0VUTFVOSU5GTzogewotIAkJTG9ndm9sSW5mb19zdHJ1Y3QgbHVuaW5mbzsKLSAJCQotIAkJbHVuaW5mby5MdW5JRCA9IGRydi0+THVuSUQ7Ci0gCQlsdW5pbmZvLm51bV9vcGVucyA9IGRydi0+dXNhZ2VfY291bnQ7Ci0gCQlsdW5pbmZvLm51bV9wYXJ0cyA9IDA7Ci0gCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZsdW5pbmZvLAotIAkJCQlzaXplb2YoTG9ndm9sSW5mb19zdHJ1Y3QpKSkKLSAJCQlyZXR1cm4gLUVGQVVMVDsKLSAJCXJldHVybigwKTsKLSAJfQorCWNhc2UgQ0NJU1NfR0VUTFVOSU5GTzp7CisJCQlMb2d2b2xJbmZvX3N0cnVjdCBsdW5pbmZvOworCisJCQlsdW5pbmZvLkx1bklEID0gZHJ2LT5MdW5JRDsKKwkJCWx1bmluZm8ubnVtX29wZW5zID0gZHJ2LT51c2FnZV9jb3VudDsKKwkJCWx1bmluZm8ubnVtX3BhcnRzID0gMDsKKwkJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmx1bmluZm8sCisJCQkJCSBzaXplb2YoTG9ndm9sSW5mb19zdHJ1Y3QpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXJldHVybiAwOworCQl9CiAJY2FzZSBDQ0lTU19ERVJFR0RJU0s6CiAJCXJldHVybiByZWJ1aWxkX2x1bl90YWJsZShob3N0LCBkaXNrKTsKIApAQCAtODM3LDI3OCArODcxLDI4NCBAQAogCQlyZXR1cm4gcmVidWlsZF9sdW5fdGFibGUoaG9zdCwgTlVMTCk7CiAKIAljYXNlIENDSVNTX1BBU1NUSFJVOgotCXsKLQkJSU9DVExfQ29tbWFuZF9zdHJ1Y3QgaW9jb21tYW5kOwotCQlDb21tYW5kTGlzdF9zdHJ1Y3QgKmM7Ci0JCWNoYXIgCSpidWZmID0gTlVMTDsKLQkJdTY0Yml0CXRlbXA2NDsKLQkJdW5zaWduZWQgbG9uZyBmbGFnczsKLQkJREVDTEFSRV9DT01QTEVUSU9OKHdhaXQpOwotCi0JCWlmICghYXJnKSByZXR1cm4gLUVJTlZBTDsKLQkKLQkJaWYgKCFjYXBhYmxlKENBUF9TWVNfUkFXSU8pKSByZXR1cm4gLUVQRVJNOwotCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmaW9jb21tYW5kLCBhcmdwLCBzaXplb2YoIElPQ1RMX0NvbW1hbmRfc3RydWN0KSApKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCWlmKChpb2NvbW1hbmQuYnVmX3NpemUgPCAxKSAmJiAKLQkJCQkoaW9jb21tYW5kLlJlcXVlc3QuVHlwZS5EaXJlY3Rpb24gIT0gWEZFUl9OT05FKSkKLQkJewkKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9IAotI2lmIDAgLyogJ2J1Zl9zaXplJyBtZW1iZXIgaXMgMTYtYml0cywgYW5kIGFsd2F5cyBzbWFsbGVyIHRoYW4ga21hbGxvYyBsaW1pdCAqLwotCQkvKiBDaGVjayBrbWFsbG9jIGxpbWl0cyAqLwotCQlpZihpb2NvbW1hbmQuYnVmX3NpemUgPiAxMjgwMDApCi0JCQlyZXR1cm4gLUVJTlZBTDsKLSNlbmRpZgotCQlpZihpb2NvbW1hbmQuYnVmX3NpemUgPiAwKQogCQl7Ci0JCQlidWZmID0gIGttYWxsb2MoaW9jb21tYW5kLmJ1Zl9zaXplLCBHRlBfS0VSTkVMKTsKLQkJCWlmKCBidWZmID09IE5VTEwpIAorCQkJSU9DVExfQ29tbWFuZF9zdHJ1Y3QgaW9jb21tYW5kOworCQkJQ29tbWFuZExpc3Rfc3RydWN0ICpjOworCQkJY2hhciAqYnVmZiA9IE5VTEw7CisJCQl1NjRiaXQgdGVtcDY0OworCQkJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJCURFQ0xBUkVfQ09NUExFVElPTih3YWl0KTsKKworCQkJaWYgKCFhcmcpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCWlmICghY2FwYWJsZShDQVBfU1lTX1JBV0lPKSkKKwkJCQlyZXR1cm4gLUVQRVJNOworCisJCQlpZiAoY29weV9mcm9tX3VzZXIKKwkJCSAgICAoJmlvY29tbWFuZCwgYXJncCwgc2l6ZW9mKElPQ1RMX0NvbW1hbmRfc3RydWN0KSkpCiAJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQkJaWYgKGlvY29tbWFuZC5SZXF1ZXN0LlR5cGUuRGlyZWN0aW9uID09IFhGRVJfV1JJVEUpCi0JCXsKLQkJCS8qIENvcHkgdGhlIGRhdGEgaW50byB0aGUgYnVmZmVyIHdlIGNyZWF0ZWQgKi8gCi0JCQlpZiAoY29weV9mcm9tX3VzZXIoYnVmZiwgaW9jb21tYW5kLmJ1ZiwgaW9jb21tYW5kLmJ1Zl9zaXplKSkKLQkJCXsKLQkJCQlrZnJlZShidWZmKTsKLQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWlmICgoaW9jb21tYW5kLmJ1Zl9zaXplIDwgMSkgJiYKKwkJCSAgICAoaW9jb21tYW5kLlJlcXVlc3QuVHlwZS5EaXJlY3Rpb24gIT0gWEZFUl9OT05FKSkgeworCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQotCQl9IGVsc2UgewotCQkJbWVtc2V0KGJ1ZmYsIDAsIGlvY29tbWFuZC5idWZfc2l6ZSk7Ci0JCX0KLQkJaWYgKChjID0gY21kX2FsbG9jKGhvc3QgLCAwKSkgPT0gTlVMTCkKLQkJewotCQkJa2ZyZWUoYnVmZik7Ci0JCQlyZXR1cm4gLUVOT01FTTsKLQkJfQotCQkJLy8gRmlsbCBpbiB0aGUgY29tbWFuZCB0eXBlIAotCQljLT5jbWRfdHlwZSA9IENNRF9JT0NUTF9QRU5EOwotCQkJLy8gRmlsbCBpbiBDb21tYW5kIEhlYWRlciAKLQkJYy0+SGVhZGVyLlJlcGx5UXVldWUgPSAwOyAgLy8gdW51c2VkIGluIHNpbXBsZSBtb2RlCi0JCWlmKCBpb2NvbW1hbmQuYnVmX3NpemUgPiAwKSAJLy8gYnVmZmVyIHRvIGZpbGwgCi0JCXsKLQkJCWMtPkhlYWRlci5TR0xpc3QgPSAxOwotCQkJYy0+SGVhZGVyLlNHVG90YWw9IDE7Ci0JCX0gZWxzZQkvLyBubyBidWZmZXJzIHRvIGZpbGwgIAotCQl7Ci0JCQljLT5IZWFkZXIuU0dMaXN0ID0gMDsKLSAgICAgICAgICAgICAgICAJYy0+SGVhZGVyLlNHVG90YWw9IDA7Ci0JCX0KLQkJYy0+SGVhZGVyLkxVTiA9IGlvY29tbWFuZC5MVU5faW5mbzsKLQkJYy0+SGVhZGVyLlRhZy5sb3dlciA9IGMtPmJ1c2FkZHI7ICAvLyB1c2UgdGhlIGtlcm5lbCBhZGRyZXNzIHRoZSBjbWQgYmxvY2sgZm9yIHRhZwotCQkKLQkJLy8gRmlsbCBpbiBSZXF1ZXN0IGJsb2NrIAotCQljLT5SZXF1ZXN0ID0gaW9jb21tYW5kLlJlcXVlc3Q7IAotCQotCQkvLyBGaWxsIGluIHRoZSBzY2F0dGVyIGdhdGhlciBpbmZvcm1hdGlvbgotCQlpZiAoaW9jb21tYW5kLmJ1Zl9zaXplID4gMCApIAotCQl7Ci0JCQl0ZW1wNjQudmFsID0gcGNpX21hcF9zaW5nbGUoIGhvc3QtPnBkZXYsIGJ1ZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9jb21tYW5kLmJ1Zl9zaXplLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENJX0RNQV9CSURJUkVDVElPTkFMKTsJCi0JCQljLT5TR1swXS5BZGRyLmxvd2VyID0gdGVtcDY0LnZhbDMyLmxvd2VyOwotCQkJYy0+U0dbMF0uQWRkci51cHBlciA9IHRlbXA2NC52YWwzMi51cHBlcjsKLQkJCWMtPlNHWzBdLkxlbiA9IGlvY29tbWFuZC5idWZfc2l6ZTsKLQkJCWMtPlNHWzBdLkV4dCA9IDA7ICAvLyB3ZSBhcmUgbm90IGNoYWluaW5nCi0JCX0KLQkJYy0+d2FpdGluZyA9ICZ3YWl0OwotCi0JCS8qIFB1dCB0aGUgcmVxdWVzdCBvbiB0aGUgdGFpbCBvZiB0aGUgcmVxdWVzdCBxdWV1ZSAqLwotCQlzcGluX2xvY2tfaXJxc2F2ZShDQ0lTU19MT0NLKGN0bHIpLCBmbGFncyk7Ci0JCWFkZFEoJmhvc3QtPnJlcVEsIGMpOwotCQlob3N0LT5RZGVwdGgrKzsKLQkJc3RhcnRfaW8oaG9zdCk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoQ0NJU1NfTE9DSyhjdGxyKSwgZmxhZ3MpOwotCi0JCXdhaXRfZm9yX2NvbXBsZXRpb24oJndhaXQpOwotCi0JCS8qIHVubG9jayB0aGUgYnVmZmVycyBmcm9tIERNQSAqLwotCQl0ZW1wNjQudmFsMzIubG93ZXIgPSBjLT5TR1swXS5BZGRyLmxvd2VyOwotICAgICAgICAgICAgICAgIHRlbXA2NC52YWwzMi51cHBlciA9IGMtPlNHWzBdLkFkZHIudXBwZXI7Ci0gICAgICAgICAgICAgICAgcGNpX3VubWFwX3NpbmdsZSggaG9zdC0+cGRldiwgKGRtYV9hZGRyX3QpIHRlbXA2NC52YWwsCi0gICAgICAgICAgICAgICAgCWlvY29tbWFuZC5idWZfc2l6ZSwgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKLQotCQkvKiBDb3B5IHRoZSBlcnJvciBpbmZvcm1hdGlvbiBvdXQgKi8gCi0JCWlvY29tbWFuZC5lcnJvcl9pbmZvID0gKihjLT5lcnJfaW5mbyk7Ci0JCWlmICggY29weV90b191c2VyKGFyZ3AsICZpb2NvbW1hbmQsIHNpemVvZiggSU9DVExfQ29tbWFuZF9zdHJ1Y3QpICkgKQotCQl7Ci0JCQlrZnJlZShidWZmKTsKLQkJCWNtZF9mcmVlKGhvc3QsIGMsIDApOwotCQkJcmV0dXJuKCAtRUZBVUxUKTsJCi0JCX0gCQotCi0JCWlmIChpb2NvbW1hbmQuUmVxdWVzdC5UeXBlLkRpcmVjdGlvbiA9PSBYRkVSX1JFQUQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29weSB0aGUgZGF0YSBvdXQgb2YgdGhlIGJ1ZmZlciB3ZSBjcmVhdGVkICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29weV90b191c2VyKGlvY29tbWFuZC5idWYsIGJ1ZmYsIGlvY29tbWFuZC5idWZfc2l6ZSkpCisjaWYgMAkJCQkvKiAnYnVmX3NpemUnIG1lbWJlciBpcyAxNi1iaXRzLCBhbmQgYWx3YXlzIHNtYWxsZXIgdGhhbiBrbWFsbG9jIGxpbWl0ICovCisJCQkvKiBDaGVjayBrbWFsbG9jIGxpbWl0cyAqLworCQkJaWYgKGlvY29tbWFuZC5idWZfc2l6ZSA+IDEyODAwMCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKyNlbmRpZgorCQkJaWYgKGlvY29tbWFuZC5idWZfc2l6ZSA+IDApIHsKKwkJCQlidWZmID0ga21hbGxvYyhpb2NvbW1hbmQuYnVmX3NpemUsIEdGUF9LRVJORUwpOworCQkJCWlmIChidWZmID09IE5VTEwpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJfQorCQkJaWYgKGlvY29tbWFuZC5SZXF1ZXN0LlR5cGUuRGlyZWN0aW9uID09IFhGRVJfV1JJVEUpIHsKKwkJCQkvKiBDb3B5IHRoZSBkYXRhIGludG8gdGhlIGJ1ZmZlciB3ZSBjcmVhdGVkICovCisJCQkJaWYgKGNvcHlfZnJvbV91c2VyCisJCQkJICAgIChidWZmLCBpb2NvbW1hbmQuYnVmLCBpb2NvbW1hbmQuYnVmX3NpemUpKSB7CisJCQkJCWtmcmVlKGJ1ZmYpOworCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCW1lbXNldChidWZmLCAwLCBpb2NvbW1hbmQuYnVmX3NpemUpOworCQkJfQorCQkJaWYgKChjID0gY21kX2FsbG9jKGhvc3QsIDApKSA9PSBOVUxMKSB7CisJCQkJa2ZyZWUoYnVmZik7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9CisJCQkvLyBGaWxsIGluIHRoZSBjb21tYW5kIHR5cGUKKwkJCWMtPmNtZF90eXBlID0gQ01EX0lPQ1RMX1BFTkQ7CisJCQkvLyBGaWxsIGluIENvbW1hbmQgSGVhZGVyCisJCQljLT5IZWFkZXIuUmVwbHlRdWV1ZSA9IDA7CS8vIHVudXNlZCBpbiBzaW1wbGUgbW9kZQorCQkJaWYgKGlvY29tbWFuZC5idWZfc2l6ZSA+IDApCS8vIGJ1ZmZlciB0byBmaWxsCiAJCQl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAJa2ZyZWUoYnVmZik7CisJCQkJYy0+SGVhZGVyLlNHTGlzdCA9IDE7CisJCQkJYy0+SGVhZGVyLlNHVG90YWwgPSAxOworCQkJfSBlbHNlCS8vIG5vIGJ1ZmZlcnMgdG8gZmlsbAorCQkJeworCQkJCWMtPkhlYWRlci5TR0xpc3QgPSAwOworCQkJCWMtPkhlYWRlci5TR1RvdGFsID0gMDsKKwkJCX0KKwkJCWMtPkhlYWRlci5MVU4gPSBpb2NvbW1hbmQuTFVOX2luZm87CisJCQljLT5IZWFkZXIuVGFnLmxvd2VyID0gYy0+YnVzYWRkcjsJLy8gdXNlIHRoZSBrZXJuZWwgYWRkcmVzcyB0aGUgY21kIGJsb2NrIGZvciB0YWcKKworCQkJLy8gRmlsbCBpbiBSZXF1ZXN0IGJsb2NrCisJCQljLT5SZXF1ZXN0ID0gaW9jb21tYW5kLlJlcXVlc3Q7CisKKwkJCS8vIEZpbGwgaW4gdGhlIHNjYXR0ZXIgZ2F0aGVyIGluZm9ybWF0aW9uCisJCQlpZiAoaW9jb21tYW5kLmJ1Zl9zaXplID4gMCkgeworCQkJCXRlbXA2NC52YWwgPSBwY2lfbWFwX3NpbmdsZShob3N0LT5wZGV2LCBidWZmLAorCQkJCQlpb2NvbW1hbmQuYnVmX3NpemUsCisJCQkJCVBDSV9ETUFfQklESVJFQ1RJT05BTCk7CisJCQkJYy0+U0dbMF0uQWRkci5sb3dlciA9IHRlbXA2NC52YWwzMi5sb3dlcjsKKwkJCQljLT5TR1swXS5BZGRyLnVwcGVyID0gdGVtcDY0LnZhbDMyLnVwcGVyOworCQkJCWMtPlNHWzBdLkxlbiA9IGlvY29tbWFuZC5idWZfc2l6ZTsKKwkJCQljLT5TR1swXS5FeHQgPSAwOwkvLyB3ZSBhcmUgbm90IGNoYWluaW5nCisJCQl9CisJCQljLT53YWl0aW5nID0gJndhaXQ7CisKKwkJCS8qIFB1dCB0aGUgcmVxdWVzdCBvbiB0aGUgdGFpbCBvZiB0aGUgcmVxdWVzdCBxdWV1ZSAqLworCQkJc3Bpbl9sb2NrX2lycXNhdmUoQ0NJU1NfTE9DSyhjdGxyKSwgZmxhZ3MpOworCQkJYWRkUSgmaG9zdC0+cmVxUSwgYyk7CisJCQlob3N0LT5RZGVwdGgrKzsKKwkJCXN0YXJ0X2lvKGhvc3QpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShDQ0lTU19MT0NLKGN0bHIpLCBmbGFncyk7CisKKwkJCXdhaXRfZm9yX2NvbXBsZXRpb24oJndhaXQpOworCisJCQkvKiB1bmxvY2sgdGhlIGJ1ZmZlcnMgZnJvbSBETUEgKi8KKwkJCXRlbXA2NC52YWwzMi5sb3dlciA9IGMtPlNHWzBdLkFkZHIubG93ZXI7CisJCQl0ZW1wNjQudmFsMzIudXBwZXIgPSBjLT5TR1swXS5BZGRyLnVwcGVyOworCQkJcGNpX3VubWFwX3NpbmdsZShob3N0LT5wZGV2LCAoZG1hX2FkZHJfdCkgdGVtcDY0LnZhbCwKKwkJCQkJIGlvY29tbWFuZC5idWZfc2l6ZSwKKwkJCQkJIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7CisKKwkJCS8qIENvcHkgdGhlIGVycm9yIGluZm9ybWF0aW9uIG91dCAqLworCQkJaW9jb21tYW5kLmVycm9yX2luZm8gPSAqKGMtPmVycl9pbmZvKTsKKwkJCWlmIChjb3B5X3RvX3VzZXIKKwkJCSAgICAoYXJncCwgJmlvY29tbWFuZCwgc2l6ZW9mKElPQ1RMX0NvbW1hbmRfc3RydWN0KSkpIHsKKwkJCQlrZnJlZShidWZmKTsKIAkJCQljbWRfZnJlZShob3N0LCBjLCAwKTsKIAkJCQlyZXR1cm4gLUVGQVVMVDsKIAkJCX0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAga2ZyZWUoYnVmZik7Ci0JCWNtZF9mcmVlKGhvc3QsIGMsIDApOwotICAgICAgICAgICAgICAgIHJldHVybigwKTsKLQl9IAotCWNhc2UgQ0NJU1NfQklHX1BBU1NUSFJVOiB7Ci0JCUJJR19JT0NUTF9Db21tYW5kX3N0cnVjdCAqaW9jOwotCQlDb21tYW5kTGlzdF9zdHJ1Y3QgKmM7Ci0JCXVuc2lnbmVkIGNoYXIgKipidWZmID0gTlVMTDsKLQkJaW50CSpidWZmX3NpemUgPSBOVUxMOwotCQl1NjRiaXQJdGVtcDY0OwotCQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCQlCWVRFIHNnX3VzZWQgPSAwOwotCQlpbnQgc3RhdHVzID0gMDsKLQkJaW50IGk7Ci0JCURFQ0xBUkVfQ09NUExFVElPTih3YWl0KTsKLQkJX191MzIgICBsZWZ0OwotCQlfX3UzMglzejsKLQkJQllURSAgICBfX3VzZXIgKmRhdGFfcHRyOwogCi0JCWlmICghYXJnKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWlmICghY2FwYWJsZShDQVBfU1lTX1JBV0lPKSkKLQkJCXJldHVybiAtRVBFUk07Ci0JCWlvYyA9IChCSUdfSU9DVExfQ29tbWFuZF9zdHJ1Y3QgKikgCi0JCQlrbWFsbG9jKHNpemVvZigqaW9jKSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghaW9jKSB7Ci0JCQlzdGF0dXMgPSAtRU5PTUVNOwotCQkJZ290byBjbGVhbnVwMTsKKwkJCWlmIChpb2NvbW1hbmQuUmVxdWVzdC5UeXBlLkRpcmVjdGlvbiA9PSBYRkVSX1JFQUQpIHsKKwkJCQkvKiBDb3B5IHRoZSBkYXRhIG91dCBvZiB0aGUgYnVmZmVyIHdlIGNyZWF0ZWQgKi8KKwkJCQlpZiAoY29weV90b191c2VyCisJCQkJICAgIChpb2NvbW1hbmQuYnVmLCBidWZmLCBpb2NvbW1hbmQuYnVmX3NpemUpKSB7CisJCQkJCWtmcmVlKGJ1ZmYpOworCQkJCQljbWRfZnJlZShob3N0LCBjLCAwKTsKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJfQorCQkJfQorCQkJa2ZyZWUoYnVmZik7CisJCQljbWRfZnJlZShob3N0LCBjLCAwKTsKKwkJCXJldHVybiAwOwogCQl9Ci0JCWlmIChjb3B5X2Zyb21fdXNlcihpb2MsIGFyZ3AsIHNpemVvZigqaW9jKSkpIHsKLQkJCXN0YXR1cyA9IC1FRkFVTFQ7Ci0JCQlnb3RvIGNsZWFudXAxOwotCQl9Ci0JCWlmICgoaW9jLT5idWZfc2l6ZSA8IDEpICYmCi0JCQkoaW9jLT5SZXF1ZXN0LlR5cGUuRGlyZWN0aW9uICE9IFhGRVJfTk9ORSkpIHsKLQkJCQlzdGF0dXMgPSAtRUlOVkFMOwotCQkJCWdvdG8gY2xlYW51cDE7Ci0JCX0KLQkJLyogQ2hlY2sga21hbGxvYyBsaW1pdHMgIHVzaW5nIGFsbCBTR3MgKi8KLQkJaWYgKGlvYy0+bWFsbG9jX3NpemUgPiBNQVhfS01BTExPQ19TSVpFKSB7Ci0JCQlzdGF0dXMgPSAtRUlOVkFMOwotCQkJZ290byBjbGVhbnVwMTsKLQkJfQotCQlpZiAoaW9jLT5idWZfc2l6ZSA+IGlvYy0+bWFsbG9jX3NpemUgKiBNQVhTR0VOVFJJRVMpIHsKLQkJCXN0YXR1cyA9IC1FSU5WQUw7Ci0JCQlnb3RvIGNsZWFudXAxOwotCQl9Ci0JCWJ1ZmYgPSBremFsbG9jKE1BWFNHRU5UUklFUyAqIHNpemVvZihjaGFyICopLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFidWZmKSB7Ci0JCQlzdGF0dXMgPSAtRU5PTUVNOwotCQkJZ290byBjbGVhbnVwMTsKLQkJfQotCQlidWZmX3NpemUgPSAoaW50ICopIGttYWxsb2MoTUFYU0dFTlRSSUVTICogc2l6ZW9mKGludCksIAotCQkJCQlHRlBfS0VSTkVMKTsKLQkJaWYgKCFidWZmX3NpemUpIHsKLQkJCXN0YXR1cyA9IC1FTk9NRU07Ci0JCQlnb3RvIGNsZWFudXAxOwotCQl9Ci0JCWxlZnQgPSBpb2MtPmJ1Zl9zaXplOwotCQlkYXRhX3B0ciA9IGlvYy0+YnVmOwotCQl3aGlsZSAobGVmdCkgewotCQkJc3ogPSAobGVmdCA+IGlvYy0+bWFsbG9jX3NpemUpID8gaW9jLT5tYWxsb2Nfc2l6ZSA6IGxlZnQ7Ci0JCQlidWZmX3NpemVbc2dfdXNlZF0gPSBzejsKLQkJCWJ1ZmZbc2dfdXNlZF0gPSBrbWFsbG9jKHN6LCBHRlBfS0VSTkVMKTsKLQkJCWlmIChidWZmW3NnX3VzZWRdID09IE5VTEwpIHsKKwljYXNlIENDSVNTX0JJR19QQVNTVEhSVTp7CisJCQlCSUdfSU9DVExfQ29tbWFuZF9zdHJ1Y3QgKmlvYzsKKwkJCUNvbW1hbmRMaXN0X3N0cnVjdCAqYzsKKwkJCXVuc2lnbmVkIGNoYXIgKipidWZmID0gTlVMTDsKKwkJCWludCAqYnVmZl9zaXplID0gTlVMTDsKKwkJCXU2NGJpdCB0ZW1wNjQ7CisJCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCQkJQllURSBzZ191c2VkID0gMDsKKwkJCWludCBzdGF0dXMgPSAwOworCQkJaW50IGk7CisJCQlERUNMQVJFX0NPTVBMRVRJT04od2FpdCk7CisJCQlfX3UzMiBsZWZ0OworCQkJX191MzIgc3o7CisJCQlCWVRFIF9fdXNlciAqZGF0YV9wdHI7CisKKwkJCWlmICghYXJnKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJaWYgKCFjYXBhYmxlKENBUF9TWVNfUkFXSU8pKQorCQkJCXJldHVybiAtRVBFUk07CisJCQlpb2MgPSAoQklHX0lPQ1RMX0NvbW1hbmRfc3RydWN0ICopCisJCQkgICAga21hbGxvYyhzaXplb2YoKmlvYyksIEdGUF9LRVJORUwpOworCQkJaWYgKCFpb2MpIHsKIAkJCQlzdGF0dXMgPSAtRU5PTUVNOwogCQkJCWdvdG8gY2xlYW51cDE7CiAJCQl9Ci0JCQlpZiAoaW9jLT5SZXF1ZXN0LlR5cGUuRGlyZWN0aW9uID09IFhGRVJfV1JJVEUpIHsKLQkJCQlpZiAoY29weV9mcm9tX3VzZXIoYnVmZltzZ191c2VkXSwgZGF0YV9wdHIsIHN6KSkgeworCQkJaWYgKGNvcHlfZnJvbV91c2VyKGlvYywgYXJncCwgc2l6ZW9mKCppb2MpKSkgeworCQkJCXN0YXR1cyA9IC1FRkFVTFQ7CisJCQkJZ290byBjbGVhbnVwMTsKKwkJCX0KKwkJCWlmICgoaW9jLT5idWZfc2l6ZSA8IDEpICYmCisJCQkgICAgKGlvYy0+UmVxdWVzdC5UeXBlLkRpcmVjdGlvbiAhPSBYRkVSX05PTkUpKSB7CisJCQkJc3RhdHVzID0gLUVJTlZBTDsKKwkJCQlnb3RvIGNsZWFudXAxOworCQkJfQorCQkJLyogQ2hlY2sga21hbGxvYyBsaW1pdHMgIHVzaW5nIGFsbCBTR3MgKi8KKwkJCWlmIChpb2MtPm1hbGxvY19zaXplID4gTUFYX0tNQUxMT0NfU0laRSkgeworCQkJCXN0YXR1cyA9IC1FSU5WQUw7CisJCQkJZ290byBjbGVhbnVwMTsKKwkJCX0KKwkJCWlmIChpb2MtPmJ1Zl9zaXplID4gaW9jLT5tYWxsb2Nfc2l6ZSAqIE1BWFNHRU5UUklFUykgeworCQkJCXN0YXR1cyA9IC1FSU5WQUw7CisJCQkJZ290byBjbGVhbnVwMTsKKwkJCX0KKwkJCWJ1ZmYgPQorCQkJICAgIGt6YWxsb2MoTUFYU0dFTlRSSUVTICogc2l6ZW9mKGNoYXIgKiksIEdGUF9LRVJORUwpOworCQkJaWYgKCFidWZmKSB7CisJCQkJc3RhdHVzID0gLUVOT01FTTsKKwkJCQlnb3RvIGNsZWFudXAxOworCQkJfQorCQkJYnVmZl9zaXplID0gKGludCAqKWttYWxsb2MoTUFYU0dFTlRSSUVTICogc2l6ZW9mKGludCksCisJCQkJCQkgICBHRlBfS0VSTkVMKTsKKwkJCWlmICghYnVmZl9zaXplKSB7CisJCQkJc3RhdHVzID0gLUVOT01FTTsKKwkJCQlnb3RvIGNsZWFudXAxOworCQkJfQorCQkJbGVmdCA9IGlvYy0+YnVmX3NpemU7CisJCQlkYXRhX3B0ciA9IGlvYy0+YnVmOworCQkJd2hpbGUgKGxlZnQpIHsKKwkJCQlzeiA9IChsZWZ0ID4KKwkJCQkgICAgICBpb2MtPm1hbGxvY19zaXplKSA/IGlvYy0+CisJCQkJICAgIG1hbGxvY19zaXplIDogbGVmdDsKKwkJCQlidWZmX3NpemVbc2dfdXNlZF0gPSBzejsKKwkJCQlidWZmW3NnX3VzZWRdID0ga21hbGxvYyhzeiwgR0ZQX0tFUk5FTCk7CisJCQkJaWYgKGJ1ZmZbc2dfdXNlZF0gPT0gTlVMTCkgewogCQkJCQlzdGF0dXMgPSAtRU5PTUVNOwogCQkJCQlnb3RvIGNsZWFudXAxOwogCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJbWVtc2V0KGJ1ZmZbc2dfdXNlZF0sIDAsIHN6KTsKLQkJCX0KLQkJCWxlZnQgLT0gc3o7Ci0JCQlkYXRhX3B0ciArPSBzejsKLQkJCXNnX3VzZWQrKzsKLQkJfQotCQlpZiAoKGMgPSBjbWRfYWxsb2MoaG9zdCAsIDApKSA9PSBOVUxMKSB7Ci0JCQlzdGF0dXMgPSAtRU5PTUVNOwotCQkJZ290byBjbGVhbnVwMTsJCi0JCX0KLQkJYy0+Y21kX3R5cGUgPSBDTURfSU9DVExfUEVORDsKLQkJYy0+SGVhZGVyLlJlcGx5UXVldWUgPSAwOwotCQkKLQkJaWYoIGlvYy0+YnVmX3NpemUgPiAwKSB7Ci0JCQljLT5IZWFkZXIuU0dMaXN0ID0gc2dfdXNlZDsKLQkJCWMtPkhlYWRlci5TR1RvdGFsPSBzZ191c2VkOwotCQl9IGVsc2UgeyAKLQkJCWMtPkhlYWRlci5TR0xpc3QgPSAwOwotCQkJYy0+SGVhZGVyLlNHVG90YWw9IDA7Ci0JCX0KLQkJYy0+SGVhZGVyLkxVTiA9IGlvYy0+TFVOX2luZm87Ci0JCWMtPkhlYWRlci5UYWcubG93ZXIgPSBjLT5idXNhZGRyOwotCQkKLQkJYy0+UmVxdWVzdCA9IGlvYy0+UmVxdWVzdDsKLQkJaWYgKGlvYy0+YnVmX3NpemUgPiAwICkgewotCQkJaW50IGk7Ci0JCQlmb3IoaT0wOyBpPHNnX3VzZWQ7IGkrKykgewotCQkJCXRlbXA2NC52YWwgPSBwY2lfbWFwX3NpbmdsZSggaG9zdC0+cGRldiwgYnVmZltpXSwKLQkJCQkJYnVmZl9zaXplW2ldLAotCQkJCQlQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOwotCQkJCWMtPlNHW2ldLkFkZHIubG93ZXIgPSB0ZW1wNjQudmFsMzIubG93ZXI7Ci0JCQkJYy0+U0dbaV0uQWRkci51cHBlciA9IHRlbXA2NC52YWwzMi51cHBlcjsKLQkJCQljLT5TR1tpXS5MZW4gPSBidWZmX3NpemVbaV07Ci0JCQkJYy0+U0dbaV0uRXh0ID0gMDsgIC8qIHdlIGFyZSBub3QgY2hhaW5pbmcgKi8KLQkJCX0KLQkJfQotCQljLT53YWl0aW5nID0gJndhaXQ7Ci0JCS8qIFB1dCB0aGUgcmVxdWVzdCBvbiB0aGUgdGFpbCBvZiB0aGUgcmVxdWVzdCBxdWV1ZSAqLwotCQlzcGluX2xvY2tfaXJxc2F2ZShDQ0lTU19MT0NLKGN0bHIpLCBmbGFncyk7Ci0JCWFkZFEoJmhvc3QtPnJlcVEsIGMpOwotCQlob3N0LT5RZGVwdGgrKzsKLQkJc3RhcnRfaW8oaG9zdCk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoQ0NJU1NfTE9DSyhjdGxyKSwgZmxhZ3MpOwotCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZ3YWl0KTsKLQkJLyogdW5sb2NrIHRoZSBidWZmZXJzIGZyb20gRE1BICovCi0JCWZvcihpPTA7IGk8c2dfdXNlZDsgaSsrKSB7Ci0JCQl0ZW1wNjQudmFsMzIubG93ZXIgPSBjLT5TR1tpXS5BZGRyLmxvd2VyOwotCQkJdGVtcDY0LnZhbDMyLnVwcGVyID0gYy0+U0dbaV0uQWRkci51cHBlcjsKLQkJCXBjaV91bm1hcF9zaW5nbGUoIGhvc3QtPnBkZXYsIChkbWFfYWRkcl90KSB0ZW1wNjQudmFsLAotCQkJCWJ1ZmZfc2l6ZVtpXSwgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKLQkJfQotCQkvKiBDb3B5IHRoZSBlcnJvciBpbmZvcm1hdGlvbiBvdXQgKi8KLQkJaW9jLT5lcnJvcl9pbmZvID0gKihjLT5lcnJfaW5mbyk7Ci0JCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgaW9jLCBzaXplb2YoKmlvYykpKSB7Ci0JCQljbWRfZnJlZShob3N0LCBjLCAwKTsKLQkJCXN0YXR1cyA9IC1FRkFVTFQ7Ci0JCQlnb3RvIGNsZWFudXAxOwotCQl9Ci0JCWlmIChpb2MtPlJlcXVlc3QuVHlwZS5EaXJlY3Rpb24gPT0gWEZFUl9SRUFEKSB7Ci0JCQkvKiBDb3B5IHRoZSBkYXRhIG91dCBvZiB0aGUgYnVmZmVyIHdlIGNyZWF0ZWQgKi8KLQkJCUJZVEUgX191c2VyICpwdHIgPSBpb2MtPmJ1ZjsKLQkgICAgICAgIAlmb3IoaT0wOyBpPCBzZ191c2VkOyBpKyspIHsKLQkJCQlpZiAoY29weV90b191c2VyKHB0ciwgYnVmZltpXSwgYnVmZl9zaXplW2ldKSkgewotCQkJCQljbWRfZnJlZShob3N0LCBjLCAwKTsKLQkJCQkJc3RhdHVzID0gLUVGQVVMVDsKLQkJCQkJZ290byBjbGVhbnVwMTsKKwkJCQlpZiAoaW9jLT5SZXF1ZXN0LlR5cGUuRGlyZWN0aW9uID09IFhGRVJfV1JJVEUpIHsKKwkJCQkJaWYgKGNvcHlfZnJvbV91c2VyCisJCQkJCSAgICAoYnVmZltzZ191c2VkXSwgZGF0YV9wdHIsIHN6KSkgeworCQkJCQkJc3RhdHVzID0gLUVOT01FTTsKKwkJCQkJCWdvdG8gY2xlYW51cDE7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQltZW1zZXQoYnVmZltzZ191c2VkXSwgMCwgc3opOwogCQkJCX0KLQkJCQlwdHIgKz0gYnVmZl9zaXplW2ldOworCQkJCWxlZnQgLT0gc3o7CisJCQkJZGF0YV9wdHIgKz0gc3o7CisJCQkJc2dfdXNlZCsrOwogCQkJfQorCQkJaWYgKChjID0gY21kX2FsbG9jKGhvc3QsIDApKSA9PSBOVUxMKSB7CisJCQkJc3RhdHVzID0gLUVOT01FTTsKKwkJCQlnb3RvIGNsZWFudXAxOworCQkJfQorCQkJYy0+Y21kX3R5cGUgPSBDTURfSU9DVExfUEVORDsKKwkJCWMtPkhlYWRlci5SZXBseVF1ZXVlID0gMDsKKworCQkJaWYgKGlvYy0+YnVmX3NpemUgPiAwKSB7CisJCQkJYy0+SGVhZGVyLlNHTGlzdCA9IHNnX3VzZWQ7CisJCQkJYy0+SGVhZGVyLlNHVG90YWwgPSBzZ191c2VkOworCQkJfSBlbHNlIHsKKwkJCQljLT5IZWFkZXIuU0dMaXN0ID0gMDsKKwkJCQljLT5IZWFkZXIuU0dUb3RhbCA9IDA7CisJCQl9CisJCQljLT5IZWFkZXIuTFVOID0gaW9jLT5MVU5faW5mbzsKKwkJCWMtPkhlYWRlci5UYWcubG93ZXIgPSBjLT5idXNhZGRyOworCisJCQljLT5SZXF1ZXN0ID0gaW9jLT5SZXF1ZXN0OworCQkJaWYgKGlvYy0+YnVmX3NpemUgPiAwKSB7CisJCQkJaW50IGk7CisJCQkJZm9yIChpID0gMDsgaSA8IHNnX3VzZWQ7IGkrKykgeworCQkJCQl0ZW1wNjQudmFsID0KKwkJCQkJICAgIHBjaV9tYXBfc2luZ2xlKGhvc3QtPnBkZXYsIGJ1ZmZbaV0sCisJCQkJCQkgICAgYnVmZl9zaXplW2ldLAorCQkJCQkJICAgIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7CisJCQkJCWMtPlNHW2ldLkFkZHIubG93ZXIgPQorCQkJCQkgICAgdGVtcDY0LnZhbDMyLmxvd2VyOworCQkJCQljLT5TR1tpXS5BZGRyLnVwcGVyID0KKwkJCQkJICAgIHRlbXA2NC52YWwzMi51cHBlcjsKKwkJCQkJYy0+U0dbaV0uTGVuID0gYnVmZl9zaXplW2ldOworCQkJCQljLT5TR1tpXS5FeHQgPSAwOwkvKiB3ZSBhcmUgbm90IGNoYWluaW5nICovCisJCQkJfQorCQkJfQorCQkJYy0+d2FpdGluZyA9ICZ3YWl0OworCQkJLyogUHV0IHRoZSByZXF1ZXN0IG9uIHRoZSB0YWlsIG9mIHRoZSByZXF1ZXN0IHF1ZXVlICovCisJCQlzcGluX2xvY2tfaXJxc2F2ZShDQ0lTU19MT0NLKGN0bHIpLCBmbGFncyk7CisJCQlhZGRRKCZob3N0LT5yZXFRLCBjKTsKKwkJCWhvc3QtPlFkZXB0aCsrOworCQkJc3RhcnRfaW8oaG9zdCk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKENDSVNTX0xPQ0soY3RsciksIGZsYWdzKTsKKwkJCXdhaXRfZm9yX2NvbXBsZXRpb24oJndhaXQpOworCQkJLyogdW5sb2NrIHRoZSBidWZmZXJzIGZyb20gRE1BICovCisJCQlmb3IgKGkgPSAwOyBpIDwgc2dfdXNlZDsgaSsrKSB7CisJCQkJdGVtcDY0LnZhbDMyLmxvd2VyID0gYy0+U0dbaV0uQWRkci5sb3dlcjsKKwkJCQl0ZW1wNjQudmFsMzIudXBwZXIgPSBjLT5TR1tpXS5BZGRyLnVwcGVyOworCQkJCXBjaV91bm1hcF9zaW5nbGUoaG9zdC0+cGRldiwKKwkJCQkJKGRtYV9hZGRyX3QpIHRlbXA2NC52YWwsIGJ1ZmZfc2l6ZVtpXSwKKwkJCQkJUENJX0RNQV9CSURJUkVDVElPTkFMKTsKKwkJCX0KKwkJCS8qIENvcHkgdGhlIGVycm9yIGluZm9ybWF0aW9uIG91dCAqLworCQkJaW9jLT5lcnJvcl9pbmZvID0gKihjLT5lcnJfaW5mbyk7CisJCQlpZiAoY29weV90b191c2VyKGFyZ3AsIGlvYywgc2l6ZW9mKCppb2MpKSkgeworCQkJCWNtZF9mcmVlKGhvc3QsIGMsIDApOworCQkJCXN0YXR1cyA9IC1FRkFVTFQ7CisJCQkJZ290byBjbGVhbnVwMTsKKwkJCX0KKwkJCWlmIChpb2MtPlJlcXVlc3QuVHlwZS5EaXJlY3Rpb24gPT0gWEZFUl9SRUFEKSB7CisJCQkJLyogQ29weSB0aGUgZGF0YSBvdXQgb2YgdGhlIGJ1ZmZlciB3ZSBjcmVhdGVkICovCisJCQkJQllURSBfX3VzZXIgKnB0ciA9IGlvYy0+YnVmOworCQkJCWZvciAoaSA9IDA7IGkgPCBzZ191c2VkOyBpKyspIHsKKwkJCQkJaWYgKGNvcHlfdG9fdXNlcgorCQkJCQkgICAgKHB0ciwgYnVmZltpXSwgYnVmZl9zaXplW2ldKSkgeworCQkJCQkJY21kX2ZyZWUoaG9zdCwgYywgMCk7CisJCQkJCQlzdGF0dXMgPSAtRUZBVUxUOworCQkJCQkJZ290byBjbGVhbnVwMTsKKwkJCQkJfQorCQkJCQlwdHIgKz0gYnVmZl9zaXplW2ldOworCQkJCX0KKwkJCX0KKwkJCWNtZF9mcmVlKGhvc3QsIGMsIDApOworCQkJc3RhdHVzID0gMDsKKwkJICAgICAgY2xlYW51cDE6CisJCQlpZiAoYnVmZikgeworCQkJCWZvciAoaSA9IDA7IGkgPCBzZ191c2VkOyBpKyspCisJCQkJCWtmcmVlKGJ1ZmZbaV0pOworCQkJCWtmcmVlKGJ1ZmYpOworCQkJfQorCQkJa2ZyZWUoYnVmZl9zaXplKTsKKwkJCWtmcmVlKGlvYyk7CisJCQlyZXR1cm4gc3RhdHVzOwogCQl9Ci0JCWNtZF9mcmVlKGhvc3QsIGMsIDApOwotCQlzdGF0dXMgPSAwOwotY2xlYW51cDE6Ci0JCWlmIChidWZmKSB7Ci0JCQlmb3IoaT0wOyBpPHNnX3VzZWQ7IGkrKykKLQkJCQlrZnJlZShidWZmW2ldKTsKLQkJCWtmcmVlKGJ1ZmYpOwotCQl9Ci0JCWtmcmVlKGJ1ZmZfc2l6ZSk7Ci0JCWtmcmVlKGlvYyk7Ci0JCXJldHVybihzdGF0dXMpOwotCX0KIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVOT1RUWTsKIAl9Ci0JCiB9CiAKIC8qCkBAIC0xMTE5LDcgKzExNTksNyBAQAogICoKICAqIFJpZ2h0IG5vdyBJJ20gdXNpbmcgdGhlIGdldGdlb21ldHJ5KCkgZnVuY3Rpb24gdG8gZG8gdGhpcywgYnV0IHRoaXMKICAqIGZ1bmN0aW9uIHNob3VsZCBwcm9iYWJseSBiZSBmaW5lciBncmFpbmVkIGFuZCBhbGxvdyB5b3UgdG8gcmV2YWxpZGF0ZSBvbmUKLSAqIHBhcnRpY3VhbGFyIGxvZ2ljYWwgdm9sdW1lIChpbnN0ZWFkIG9mIGFsbCBvZiB0aGVtIG9uIGEgcGFydGljdWxhcgorICogcGFydGljdWxhciBsb2dpY2FsIHZvbHVtZSAoaW5zdGVhZCBvZiBhbGwgb2YgdGhlbSBvbiBhIHBhcnRpY3VsYXIKICAqIGNvbnRyb2xsZXIpLgogICovCiBzdGF0aWMgaW50IHJldmFsaWRhdGVfYWxsdm9sKGN0bHJfaW5mb190ICpob3N0KQpAQCAtMTEyNywxNyArMTE2NywxNyBAQAogCWludCBjdGxyID0gaG9zdC0+Y3RsciwgaTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0gICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKENDSVNTX0xPQ0soY3RsciksIGZsYWdzKTsKLSAgICAgICAgaWYgKGhvc3QtPnVzYWdlX2NvdW50ID4gMSkgewotICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoQ0NJU1NfTE9DSyhjdGxyKSwgZmxhZ3MpOwotICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzOiBEZXZpY2UgYnVzeSBmb3Igdm9sdW1lIgotICAgICAgICAgICAgICAgICAgICAgICAgIiByZXZhbGlkYXRpb24gKHVzYWdlPSVkKVxuIiwgaG9zdC0+dXNhZ2VfY291bnQpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRUJVU1k7Ci0gICAgICAgIH0KLSAgICAgICAgaG9zdC0+dXNhZ2VfY291bnQrKzsKKwlzcGluX2xvY2tfaXJxc2F2ZShDQ0lTU19MT0NLKGN0bHIpLCBmbGFncyk7CisJaWYgKGhvc3QtPnVzYWdlX2NvdW50ID4gMSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKENDSVNTX0xPQ0soY3RsciksIGZsYWdzKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2Npc3M6IERldmljZSBidXN5IGZvciB2b2x1bWUiCisJCSAgICAgICAiIHJldmFsaWRhdGlvbiAodXNhZ2U9JWQpXG4iLCBob3N0LT51c2FnZV9jb3VudCk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCWhvc3QtPnVzYWdlX2NvdW50Kys7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShDQ0lTU19MT0NLKGN0bHIpLCBmbGFncyk7CiAKLQlmb3IoaT0wOyBpPCBOV0Q7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBOV0Q7IGkrKykgewogCQlzdHJ1Y3QgZ2VuZGlzayAqZGlzayA9IGhvc3QtPmdlbmRpc2tbaV07CiAJCWlmIChkaXNrKSB7CiAJCQlyZXF1ZXN0X3F1ZXVlX3QgKnEgPSBkaXNrLT5xdWV1ZTsKQEAgLTExNDksMjIgKzExODksMjIgQEAKIAkJfQogCX0KIAotICAgICAgICAvKgotICAgICAgICAgKiBTZXQgdGhlIHBhcnRpdGlvbiBhbmQgYmxvY2sgc2l6ZSBzdHJ1Y3R1cmVzIGZvciBhbGwgdm9sdW1lcwotICAgICAgICAgKiBvbiB0aGlzIGNvbnRyb2xsZXIgdG8gemVyby4gIFdlIHdpbGwgcmVyZWFkIGFsbCBvZiB0aGlzIGRhdGEKLSAgICAgICAgICovCi0gICAgICAgIG1lbXNldChob3N0LT5kcnYsICAgICAgICAwLCBzaXplb2YoZHJpdmVfaW5mb19zdHJ1Y3QpCi0JCQkJCQkqIENJU1NfTUFYX0xVTik7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIFRlbGwgdGhlIGFycmF5IGNvbnRyb2xsZXIgbm90IHRvIGdpdmUgdXMgYW55IGludGVycnVwdHMgd2hpbGUKLSAgICAgICAgICogd2UgY2hlY2sgdGhlIG5ldyBnZW9tZXRyeS4gIFRoZW4gdHVybiBpbnRlcnJ1cHRzIGJhY2sgb24gd2hlbgotICAgICAgICAgKiB3ZSdyZSBkb25lLgotICAgICAgICAgKi8KLSAgICAgICAgaG9zdC0+YWNjZXNzLnNldF9pbnRyX21hc2soaG9zdCwgQ0NJU1NfSU5UUl9PRkYpOwotICAgICAgICBjY2lzc19nZXRnZW9tZXRyeShjdGxyKTsKLSAgICAgICAgaG9zdC0+YWNjZXNzLnNldF9pbnRyX21hc2soaG9zdCwgQ0NJU1NfSU5UUl9PTik7CisJLyoKKwkgKiBTZXQgdGhlIHBhcnRpdGlvbiBhbmQgYmxvY2sgc2l6ZSBzdHJ1Y3R1cmVzIGZvciBhbGwgdm9sdW1lcworCSAqIG9uIHRoaXMgY29udHJvbGxlciB0byB6ZXJvLiAgV2Ugd2lsbCByZXJlYWQgYWxsIG9mIHRoaXMgZGF0YQorCSAqLworCW1lbXNldChob3N0LT5kcnYsIDAsIHNpemVvZihkcml2ZV9pbmZvX3N0cnVjdCkKKwkgICAgICAgKiBDSVNTX01BWF9MVU4pOworCS8qCisJICogVGVsbCB0aGUgYXJyYXkgY29udHJvbGxlciBub3QgdG8gZ2l2ZSB1cyBhbnkgaW50ZXJydXB0cyB3aGlsZQorCSAqIHdlIGNoZWNrIHRoZSBuZXcgZ2VvbWV0cnkuICBUaGVuIHR1cm4gaW50ZXJydXB0cyBiYWNrIG9uIHdoZW4KKwkgKiB3ZSdyZSBkb25lLgorCSAqLworCWhvc3QtPmFjY2Vzcy5zZXRfaW50cl9tYXNrKGhvc3QsIENDSVNTX0lOVFJfT0ZGKTsKKwljY2lzc19nZXRnZW9tZXRyeShjdGxyKTsKKwlob3N0LT5hY2Nlc3Muc2V0X2ludHJfbWFzayhob3N0LCBDQ0lTU19JTlRSX09OKTsKIAotCS8qIExvb3AgdGhyb3VnaCBlYWNoIHJlYWwgZGV2aWNlICovIAorCS8qIExvb3AgdGhyb3VnaCBlYWNoIHJlYWwgZGV2aWNlICovCiAJZm9yIChpID0gMDsgaSA8IE5XRDsgaSsrKSB7CiAJCXN0cnVjdCBnZW5kaXNrICpkaXNrID0gaG9zdC0+Z2VuZGlza1tpXTsKIAkJZHJpdmVfaW5mb19zdHJ1Y3QgKmRydiA9ICYoaG9zdC0+ZHJ2W2ldKTsKQEAgLTExNzYsOCArMTIxNiw4IEBACiAJCXNldF9jYXBhY2l0eShkaXNrLCBkcnYtPm5yX2Jsb2Nrcyk7CiAJCWFkZF9kaXNrKGRpc2spOwogCX0KLSAgICAgICAgaG9zdC0+dXNhZ2VfY291bnQtLTsKLSAgICAgICAgcmV0dXJuIDA7CisJaG9zdC0+dXNhZ2VfY291bnQtLTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGNvbXBsZXRlX2J1ZmZlcnMoc3RydWN0IGJpbyAqYmlvLCBpbnQgc3RhdHVzKQpAQCAtMTE5MSw3ICsxMjMxLDYgQEAKIAkJYmlvX2VuZGlvKGJpbywgbnJfc2VjdG9ycyA8PCA5LCBzdGF0dXMgPyAwIDogLUVJTyk7CiAJCWJpbyA9IHhiaDsKIAl9Ci0KIH0KIAogc3RhdGljIHZvaWQgY2Npc3Nfc29mdGlycV9kb25lKHN0cnVjdCByZXF1ZXN0ICpycSkKQEAgLTEyMDksNyArMTI0OCw3IEBACiAKIAkvKiBjb21tYW5kIGRpZCBub3QgbmVlZCB0byBiZSByZXRyaWVkICovCiAJLyogdW5tYXAgdGhlIERNQSBtYXBwaW5nIGZvciBhbGwgdGhlIHNjYXR0ZXIgZ2F0aGVyIGVsZW1lbnRzICovCi0JZm9yKGk9MDsgaTxjbWQtPkhlYWRlci5TR0xpc3Q7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBjbWQtPkhlYWRlci5TR0xpc3Q7IGkrKykgewogCQl0ZW1wNjQudmFsMzIubG93ZXIgPSBjbWQtPlNHW2ldLkFkZHIubG93ZXI7CiAJCXRlbXA2NC52YWwzMi51cHBlciA9IGNtZC0+U0dbaV0uQWRkci51cHBlcjsKIAkJcGNpX3VubWFwX3BhZ2UoaC0+cGRldiwgdGVtcDY0LnZhbCwgY21kLT5TR1tpXS5MZW4sIGRkaXIpOwpAQCAtMTIxOSwxMSArMTI1OCwxMiBAQAogCiAjaWZkZWYgQ0NJU1NfREVCVUcKIAlwcmludGsoIkRvbmUgd2l0aCAlcFxuIiwgcnEpOwotI2VuZGlmIC8qIENDSVNTX0RFQlVHICovCisjZW5kaWYJCQkJLyogQ0NJU1NfREVCVUcgKi8KIAorCWFkZF9kaXNrX3JhbmRvbW5lc3MocnEtPnJxX2Rpc2spOwogCXNwaW5fbG9ja19pcnFzYXZlKCZoLT5sb2NrLCBmbGFncyk7CiAJZW5kX3RoYXRfcmVxdWVzdF9sYXN0KHJxLCBycS0+ZXJyb3JzKTsKLQljbWRfZnJlZShoLCBjbWQsMSk7CisJY21kX2ZyZWUoaCwgY21kLCAxKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoLT5sb2NrLCBmbGFncyk7CiB9CiAKQEAgLTEyMzQsOSArMTI3NCw5IEBACiAgKiB3aWxsIGFsd2F5cyBiZSBsZWZ0IHJlZ2lzdGVyZWQgd2l0aCB0aGUga2VybmVsIHNpbmNlIGl0IGlzIGFsc28gdGhlCiAgKiBjb250cm9sbGVyIG5vZGUuICBBbnkgY2hhbmdlcyB0byBkaXNrIDAgd2lsbCBzaG93IHVwIG9uIHRoZSBuZXh0CiAgKiByZWJvb3QuCi0qLworICovCiBzdGF0aWMgdm9pZCBjY2lzc191cGRhdGVfZHJpdmVfaW5mbyhpbnQgY3RsciwgaW50IGRydl9pbmRleCkKLSAgeworewogCWN0bHJfaW5mb190ICpoID0gaGJhW2N0bHJdOwogCXN0cnVjdCBnZW5kaXNrICpkaXNrOwogCVJlYWRDYXBkYXRhX3N0cnVjdCAqc2l6ZV9idWZmID0gTlVMTDsKQEAgLTEyNDYsMTMgKzEyODYsMTMgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKIAlpbnQgcmV0ID0gMDsKIAotCS8qIGlmIHRoZSBkaXNrIGFscmVhZHkgZXhpc3RzIHRoZW4gZGVyZWdpc3RlciBpdCBiZWZvcmUgcHJvY2VlZGluZyovCi0JaWYgKGgtPmRydltkcnZfaW5kZXhdLnJhaWRfbGV2ZWwgIT0gLTEpeworCS8qIGlmIHRoZSBkaXNrIGFscmVhZHkgZXhpc3RzIHRoZW4gZGVyZWdpc3RlciBpdCBiZWZvcmUgcHJvY2VlZGluZyAqLworCWlmIChoLT5kcnZbZHJ2X2luZGV4XS5yYWlkX2xldmVsICE9IC0xKSB7CiAJCXNwaW5fbG9ja19pcnFzYXZlKENDSVNTX0xPQ0soaC0+Y3RsciksIGZsYWdzKTsKIAkJaC0+ZHJ2W2Rydl9pbmRleF0uYnVzeV9jb25maWd1cmluZyA9IDE7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoQ0NJU1NfTE9DSyhoLT5jdGxyKSwgZmxhZ3MpOwogCQlyZXQgPSBkZXJlZ2lzdGVyX2Rpc2soaC0+Z2VuZGlza1tkcnZfaW5kZXhdLAotCQkJJmgtPmRydltkcnZfaW5kZXhdLCAwKTsKKwkJCQkgICAgICAmaC0+ZHJ2W2Rydl9pbmRleF0sIDApOwogCQloLT5kcnZbZHJ2X2luZGV4XS5idXN5X2NvbmZpZ3VyaW5nID0gMDsKIAl9CiAKQEAgLTEyNjAsMjcgKzEzMDAsMjUgQEAKIAlpZiAocmV0KQogCQlyZXR1cm47CiAKLQotCS8qIEdldCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZGlzayBhbmQgbW9kaWZ5IHRoZSBkcml2ZXIgc3R1cmN0dXJlICovCi0Jc2l6ZV9idWZmID0ga21hbGxvYyhzaXplb2YoIFJlYWRDYXBkYXRhX3N0cnVjdCksIEdGUF9LRVJORUwpOwotICAgICAgICBpZiAoc2l6ZV9idWZmID09IE5VTEwpCisJLyogR2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBkaXNrIGFuZCBtb2RpZnkgdGhlIGRyaXZlciBzdHJ1Y3R1cmUgKi8KKwlzaXplX2J1ZmYgPSBrbWFsbG9jKHNpemVvZihSZWFkQ2FwZGF0YV9zdHJ1Y3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoc2l6ZV9idWZmID09IE5VTEwpCiAJCWdvdG8gbWVtX21zZzsKLQlpbnFfYnVmZiA9IGttYWxsb2Moc2l6ZW9mKCBJbnF1aXJ5RGF0YV9zdHJ1Y3QpLCBHRlBfS0VSTkVMKTsKKwlpbnFfYnVmZiA9IGttYWxsb2Moc2l6ZW9mKElucXVpcnlEYXRhX3N0cnVjdCksIEdGUF9LRVJORUwpOwogCWlmIChpbnFfYnVmZiA9PSBOVUxMKQogCQlnb3RvIG1lbV9tc2c7CiAKIAljY2lzc19yZWFkX2NhcGFjaXR5KGN0bHIsIGRydl9pbmRleCwgc2l6ZV9idWZmLCAxLAotCQkmdG90YWxfc2l6ZSwgJmJsb2NrX3NpemUpOworCQkJICAgICZ0b3RhbF9zaXplLCAmYmxvY2tfc2l6ZSk7CiAJY2Npc3NfZ2VvbWV0cnlfaW5xdWlyeShjdGxyLCBkcnZfaW5kZXgsIDEsIHRvdGFsX3NpemUsIGJsb2NrX3NpemUsCi0JCWlucV9idWZmLCAmaC0+ZHJ2W2Rydl9pbmRleF0pOworCQkJICAgICAgIGlucV9idWZmLCAmaC0+ZHJ2W2Rydl9pbmRleF0pOwogCiAJKytoLT5udW1fbHVuczsKIAlkaXNrID0gaC0+Z2VuZGlza1tkcnZfaW5kZXhdOwogCXNldF9jYXBhY2l0eShkaXNrLCBoLT5kcnZbZHJ2X2luZGV4XS5ucl9ibG9ja3MpOwogCi0KIAkvKiBpZiBpdCdzIHRoZSBjb250cm9sbGVyIGl0J3MgYWxyZWFkeSBhZGRlZCAqLwotCWlmIChkcnZfaW5kZXgpeworCWlmIChkcnZfaW5kZXgpIHsKIAkJZGlzay0+cXVldWUgPSBibGtfaW5pdF9xdWV1ZShkb19jY2lzc19yZXF1ZXN0LCAmaC0+bG9jayk7CiAKIAkJLyogU2V0IHVwIHF1ZXVlIGluZm9ybWF0aW9uICovCkBAIC0xMzAwLDE3ICsxMzM4LDE3IEBACiAJCWRpc2stPnF1ZXVlLT5xdWV1ZWRhdGEgPSBoYmFbY3Rscl07CiAKIAkJYmxrX3F1ZXVlX2hhcmRzZWN0X3NpemUoZGlzay0+cXVldWUsCi0JCQloYmFbY3Rscl0tPmRydltkcnZfaW5kZXhdLmJsb2NrX3NpemUpOworCQkJCQloYmFbY3Rscl0tPmRydltkcnZfaW5kZXhdLmJsb2NrX3NpemUpOwogCiAJCWgtPmRydltkcnZfaW5kZXhdLnF1ZXVlID0gZGlzay0+cXVldWU7CiAJCWFkZF9kaXNrKGRpc2spOwogCX0KIAotZnJlZXJldDoKKyAgICAgIGZyZWVyZXQ6CiAJa2ZyZWUoc2l6ZV9idWZmKTsKIAlrZnJlZShpbnFfYnVmZik7CiAJcmV0dXJuOwotbWVtX21zZzoKKyAgICAgIG1lbV9tc2c6CiAJcHJpbnRrKEtFUk5fRVJSICJjY2lzczogb3V0IG9mIG1lbW9yeVxuIik7CiAJZ290byBmcmVlcmV0OwogfQpAQCAtMTMyMCwxMyArMTM1OCwxMyBAQAogICogd2hlcmUgbmV3IGRyaXZlcyB3aWxsIGJlIGFkZGVkLiAgSWYgdGhlIGluZGV4IHRvIGJlIHJldHVybmVkIGlzIGdyZWF0ZXIKICAqIHRoYW4gdGhlIGhpZ2hlc3RfbHVuIGluZGV4IGZvciB0aGUgY29udHJvbGxlciB0aGVuIGhpZ2hlc3RfbHVuIGlzIHNldAogICogdG8gdGhpcyBuZXcgaW5kZXguICBJZiB0aGVyZSBhcmUgbm8gYXZhaWxhYmxlIGluZGV4ZXMgdGhlbiAtMSBpcyByZXR1cm5lZC4KLSovCisgKi8KIHN0YXRpYyBpbnQgY2Npc3NfZmluZF9mcmVlX2RyaXZlX2luZGV4KGludCBjdGxyKQogewogCWludCBpOwogCi0JZm9yIChpPTA7IGkgPCBDSVNTX01BWF9MVU47IGkrKyl7Ci0JCWlmIChoYmFbY3Rscl0tPmRydltpXS5yYWlkX2xldmVsID09IC0xKXsKKwlmb3IgKGkgPSAwOyBpIDwgQ0lTU19NQVhfTFVOOyBpKyspIHsKKwkJaWYgKGhiYVtjdGxyXS0+ZHJ2W2ldLnJhaWRfbGV2ZWwgPT0gLTEpIHsKIAkJCWlmIChpID4gaGJhW2N0bHJdLT5oaWdoZXN0X2x1bikKIAkJCQloYmFbY3Rscl0tPmhpZ2hlc3RfbHVuID0gaTsKIAkJCXJldHVybiBpOwpAQCAtMTMzNiw3ICsxMzc0LDcgQEAKIH0KIAogLyogVGhpcyBmdW5jdGlvbiB3aWxsIGFkZCBhbmQgcmVtb3ZlIGxvZ2ljYWwgZHJpdmVzIGZyb20gdGhlIExvZ2ljYWwKLSAqIGRyaXZlIGFycmF5IG9mIHRoZSBjb250cm9sbGVyIGFuZCBtYWludGFpbiBwZXJzaXN0YW5jeSBvZiBvcmRlcmluZworICogZHJpdmUgYXJyYXkgb2YgdGhlIGNvbnRyb2xsZXIgYW5kIG1haW50YWluIHBlcnNpc3RlbmN5IG9mIG9yZGVyaW5nCiAgKiBzbyB0aGF0IG1vdW50IHBvaW50cyBhcmUgcHJlc2VydmVkIHVudGlsIHRoZSBuZXh0IHJlYm9vdC4gIFRoaXMgYWxsb3dzCiAgKiBmb3IgdGhlIHJlbW92YWwgb2YgbG9naWNhbCBkcml2ZXMgaW4gdGhlIG1pZGRsZSBvZiB0aGUgZHJpdmUgYXJyYXkKICAqIHdpdGhvdXQgYSByZS1vcmRlcmluZyBvZiB0aG9zZSBkcml2ZXMuCkBAIC0xMzQ0LDcgKzEzODIsNyBAQAogICogaAkJPSBUaGUgY29udHJvbGxlciB0byBwZXJmb3JtIHRoZSBvcGVyYXRpb25zIG9uCiAgKiBkZWxfZGlzawk9IFRoZSBkaXNrIHRvIHJlbW92ZSBpZiBzcGVjaWZpZWQuICBJZiB0aGUgdmFsdWUgZ2l2ZW4KICAqCQkgIGlzIE5VTEwgdGhlbiBubyBkaXNrIGlzIHJlbW92ZWQuCi0qLworICovCiBzdGF0aWMgaW50IHJlYnVpbGRfbHVuX3RhYmxlKGN0bHJfaW5mb190ICpoLCBzdHJ1Y3QgZ2VuZGlzayAqZGVsX2Rpc2spCiB7CiAJaW50IGN0bHIgPSBoLT5jdGxyOwpAQCAtMTM2MSwxMiArMTM5OSwxMiBAQAogCiAJLyogU2V0IGJ1c3lfY29uZmlndXJpbmcgZmxhZyBmb3IgdGhpcyBvcGVyYXRpb24gKi8KIAlzcGluX2xvY2tfaXJxc2F2ZShDQ0lTU19MT0NLKGgtPmN0bHIpLCBmbGFncyk7Ci0JaWYgKGgtPm51bV9sdW5zID49IENJU1NfTUFYX0xVTil7CisJaWYgKGgtPm51bV9sdW5zID49IENJU1NfTUFYX0xVTikgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKENDSVNTX0xPQ0soaC0+Y3RsciksIGZsYWdzKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JaWYgKGgtPmJ1c3lfY29uZmlndXJpbmcpeworCWlmIChoLT5idXN5X2NvbmZpZ3VyaW5nKSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoQ0NJU1NfTE9DSyhoLT5jdGxyKSwgZmxhZ3MpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KQEAgLTEzNzYsNyArMTQxNCw3IEBACiAJICogYW5kIHVwZGF0ZSB0aGUgbG9naWNhbCBkcml2ZSB0YWJsZS4gIElmIGl0IGlzIG5vdCBOVUxMIHRoZW4KIAkgKiB3ZSB3aWxsIGNoZWNrIGlmIHRoZSBkaXNrIGlzIGluIHVzZSBvciBub3QuCiAJICovCi0JaWYgKGRlbF9kaXNrICE9IE5VTEwpeworCWlmIChkZWxfZGlzayAhPSBOVUxMKSB7CiAJCWRydiA9IGdldF9kcnYoZGVsX2Rpc2spOwogCQlkcnYtPmJ1c3lfY29uZmlndXJpbmcgPSAxOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKENDSVNTX0xPQ0soaC0+Y3RsciksIGZsYWdzKTsKQEAgLTEzOTQsNjEgKzE0MzIsNjcgQEAKIAkJCWdvdG8gbWVtX21zZzsKIAogCQlyZXR1cm5fY29kZSA9IHNlbmRjbWRfd2l0aGlycShDSVNTX1JFUE9SVF9MT0csIGN0bHIsIGxkX2J1ZmYsCi0JCQkJc2l6ZW9mKFJlcG9ydEx1bkRhdGFfc3RydWN0KSwgMCwgMCwgMCwKLQkJCQlUWVBFX0NNRCk7CisJCQkJCSAgICAgIHNpemVvZihSZXBvcnRMdW5EYXRhX3N0cnVjdCksIDAsCisJCQkJCSAgICAgIDAsIDAsIFRZUEVfQ01EKTsKIAotCQlpZiAocmV0dXJuX2NvZGUgPT0gSU9fT0spewotCQkJbGlzdGxlbmd0aCB8PSAoMHhmZiAmICh1bnNpZ25lZCBpbnQpKGxkX2J1ZmYtPkxVTkxpc3RMZW5ndGhbMF0pKSA8PCAyNDsKLQkJCWxpc3RsZW5ndGggfD0gKDB4ZmYgJiAodW5zaWduZWQgaW50KShsZF9idWZmLT5MVU5MaXN0TGVuZ3RoWzFdKSkgPDwgMTY7Ci0JCQlsaXN0bGVuZ3RoIHw9ICgweGZmICYgKHVuc2lnbmVkIGludCkobGRfYnVmZi0+TFVOTGlzdExlbmd0aFsyXSkpIDw8IDg7Ci0JCQlsaXN0bGVuZ3RoIHw9IDB4ZmYgJiAodW5zaWduZWQgaW50KShsZF9idWZmLT5MVU5MaXN0TGVuZ3RoWzNdKTsKLQkJfSBlbHNleyAvKiByZWFkaW5nIG51bWJlciBvZiBsb2dpY2FsIHZvbHVtZXMgZmFpbGVkICovCisJCWlmIChyZXR1cm5fY29kZSA9PSBJT19PSykgeworCQkJbGlzdGxlbmd0aCB8PQorCQkJICAgICgweGZmICYgKHVuc2lnbmVkIGludCkobGRfYnVmZi0+TFVOTGlzdExlbmd0aFswXSkpCisJCQkgICAgPDwgMjQ7CisJCQlsaXN0bGVuZ3RoIHw9CisJCQkgICAgKDB4ZmYgJiAodW5zaWduZWQgaW50KShsZF9idWZmLT5MVU5MaXN0TGVuZ3RoWzFdKSkKKwkJCSAgICA8PCAxNjsKKwkJCWxpc3RsZW5ndGggfD0KKwkJCSAgICAoMHhmZiAmICh1bnNpZ25lZCBpbnQpKGxkX2J1ZmYtPkxVTkxpc3RMZW5ndGhbMl0pKQorCQkJICAgIDw8IDg7CisJCQlsaXN0bGVuZ3RoIHw9CisJCQkgICAgMHhmZiAmICh1bnNpZ25lZCBpbnQpKGxkX2J1ZmYtPkxVTkxpc3RMZW5ndGhbM10pOworCQl9IGVsc2UgewkvKiByZWFkaW5nIG51bWJlciBvZiBsb2dpY2FsIHZvbHVtZXMgZmFpbGVkICovCiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICJjY2lzczogcmVwb3J0IGxvZ2ljYWwgdm9sdW1lIgotCQkJCSIgY29tbWFuZCBmYWlsZWRcbiIpOworCQkJICAgICAgICIgY29tbWFuZCBmYWlsZWRcbiIpOwogCQkJbGlzdGxlbmd0aCA9IDA7CiAJCQlnb3RvIGZyZWVyZXQ7CiAJCX0KIAogCQludW1fbHVucyA9IGxpc3RsZW5ndGggLyA4OwkvKiA4IGJ5dGVzIHBlciBlbnRyeSAqLwotCQlpZiAobnVtX2x1bnMgPiBDSVNTX01BWF9MVU4peworCQlpZiAobnVtX2x1bnMgPiBDSVNTX01BWF9MVU4pIHsKIAkJCW51bV9sdW5zID0gQ0lTU19NQVhfTFVOOwogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2Npc3M6IG1vcmUgbHVucyBjb25maWd1cmVkIgotCQkJCSIgb24gY29udHJvbGxlciB0aGFuIGNhbiBiZSBoYW5kbGVkIGJ5IgotCQkJCSIgdGhpcyBkcml2ZXIuXG4iKTsKKwkJCSAgICAgICAiIG9uIGNvbnRyb2xsZXIgdGhhbiBjYW4gYmUgaGFuZGxlZCBieSIKKwkJCSAgICAgICAiIHRoaXMgZHJpdmVyLlxuIik7CiAJCX0KIAogCQkvKiBDb21wYXJlIGNvbnRyb2xsZXIgZHJpdmUgYXJyYXkgdG8gZHJpdmVycyBkcml2ZSBhcnJheS4KLQkgCSogQ2hlY2sgZm9yIHVwZGF0ZXMgaW4gdGhlIGRyaXZlIGluZm9ybWF0aW9uIGFuZCBhbnkgbmV3IGRyaXZlcwotCSAJKiBvbiB0aGUgY29udHJvbGxlci4KLQkgCSovCi0JCWZvciAoaT0wOyBpIDwgbnVtX2x1bnM7IGkrKyl7CisJCSAqIENoZWNrIGZvciB1cGRhdGVzIGluIHRoZSBkcml2ZSBpbmZvcm1hdGlvbiBhbmQgYW55IG5ldyBkcml2ZXMKKwkJICogb24gdGhlIGNvbnRyb2xsZXIuCisJCSAqLworCQlmb3IgKGkgPSAwOyBpIDwgbnVtX2x1bnM7IGkrKykgewogCQkJaW50IGo7CiAKIAkJCWRydl9mb3VuZCA9IDA7CiAKLQkgIAkJbHVuaWQgPSAoMHhmZiAmCi0JCQkJKHVuc2lnbmVkIGludCkobGRfYnVmZi0+TFVOW2ldWzNdKSkgPDwgMjQ7Ci0gICAgICAgIAkJbHVuaWQgfD0gKDB4ZmYgJgotCQkJCSh1bnNpZ25lZCBpbnQpKGxkX2J1ZmYtPkxVTltpXVsyXSkpIDw8IDE2OwotICAgICAgICAJCWx1bmlkIHw9ICgweGZmICYKLQkJCQkodW5zaWduZWQgaW50KShsZF9idWZmLT5MVU5baV1bMV0pKSA8PCA4OwotICAgICAgICAJCWx1bmlkIHw9IDB4ZmYgJgotCQkJCSh1bnNpZ25lZCBpbnQpKGxkX2J1ZmYtPkxVTltpXVswXSk7CisJCQlsdW5pZCA9ICgweGZmICYKKwkJCQkgKHVuc2lnbmVkIGludCkobGRfYnVmZi0+TFVOW2ldWzNdKSkgPDwgMjQ7CisJCQlsdW5pZCB8PSAoMHhmZiAmCisJCQkJICAodW5zaWduZWQgaW50KShsZF9idWZmLT5MVU5baV1bMl0pKSA8PCAxNjsKKwkJCWx1bmlkIHw9ICgweGZmICYKKwkJCQkgICh1bnNpZ25lZCBpbnQpKGxkX2J1ZmYtPkxVTltpXVsxXSkpIDw8IDg7CisJCQlsdW5pZCB8PSAweGZmICYgKHVuc2lnbmVkIGludCkobGRfYnVmZi0+TFVOW2ldWzBdKTsKIAogCQkJLyogRmluZCBpZiB0aGUgTFVOIGlzIGFscmVhZHkgaW4gdGhlIGRyaXZlIGFycmF5CiAJCQkgKiBvZiB0aGUgY29udHJvbGxlci4gIElmIHNvIHRoZW4gdXBkYXRlIGl0cyBpbmZvCiAJCQkgKiBpZiBub3QgaXMgdXNlLiAgSWYgaXQgZG9lcyBub3QgZXhpc3QgdGhlbiBmaW5kCiAJCQkgKiB0aGUgZmlyc3QgZnJlZSBpbmRleCBhbmQgYWRkIGl0LgotCQkJKi8KLQkJCWZvciAoaj0wOyBqIDw9IGgtPmhpZ2hlc3RfbHVuOyBqKyspewotCQkJCWlmIChoLT5kcnZbal0uTHVuSUQgPT0gbHVuaWQpeworCQkJICovCisJCQlmb3IgKGogPSAwOyBqIDw9IGgtPmhpZ2hlc3RfbHVuOyBqKyspIHsKKwkJCQlpZiAoaC0+ZHJ2W2pdLkx1bklEID09IGx1bmlkKSB7CiAJCQkJCWRydl9pbmRleCA9IGo7CiAJCQkJCWRydl9mb3VuZCA9IDE7CiAJCQkJfQogCQkJfQogCiAJCQkvKiBjaGVjayBpZiB0aGUgZHJpdmUgd2FzIGZvdW5kIGFscmVhZHkgaW4gdGhlIGFycmF5ICovCi0JCQlpZiAoIWRydl9mb3VuZCl7CisJCQlpZiAoIWRydl9mb3VuZCkgewogCQkJCWRydl9pbmRleCA9IGNjaXNzX2ZpbmRfZnJlZV9kcml2ZV9pbmRleChjdGxyKTsKIAkJCQlpZiAoZHJ2X2luZGV4ID09IC0xKQogCQkJCQlnb3RvIGZyZWVyZXQ7CkBAIC0xNDU2LDE4ICsxNTAwLDE4IEBACiAJCQl9CiAJCQloLT5kcnZbZHJ2X2luZGV4XS5MdW5JRCA9IGx1bmlkOwogCQkJY2Npc3NfdXBkYXRlX2RyaXZlX2luZm8oY3RsciwgZHJ2X2luZGV4KTsKLQkJfSAvKiBlbmQgZm9yICovCi0JfSAvKiBlbmQgZWxzZSAqLworCQl9CQkvKiBlbmQgZm9yICovCisJfQkJCS8qIGVuZCBlbHNlICovCiAKLWZyZWVyZXQ6CisgICAgICBmcmVlcmV0OgogCWtmcmVlKGxkX2J1ZmYpOwogCWgtPmJ1c3lfY29uZmlndXJpbmcgPSAwOwogCS8qIFdlIHJldHVybiAtMSBoZXJlIHRvIHRlbGwgdGhlIEFDVSB0aGF0IHdlIGhhdmUgcmVnaXN0ZXJlZC91cGRhdGVkCiAJICogYWxsIG9mIHRoZSBkcml2ZXMgdGhhdCB3ZSBjYW4gYW5kIHRvIGtlZXAgaXQgZnJvbSBjYWxsaW5nIHVzCiAJICogYWRkaXRpb25hbCB0aW1lcy4KLQkqLworCSAqLwogCXJldHVybiAtMTsKLW1lbV9tc2c6CisgICAgICBtZW1fbXNnOgogCXByaW50ayhLRVJOX0VSUiAiY2Npc3M6IG91dCBvZiBtZW1vcnlcbiIpOwogCWdvdG8gZnJlZXJldDsKIH0KQEAgLTE0ODMsNyArMTUyNyw3IEBACiAgKiBjbGVhcl9hbGwgPSBUaGlzIGZsYWcgZGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCB0aGUgZGlzayBpbmZvcm1hdGlvbgogICogICAgICAgICAgICAgaXMgZ29pbmcgdG8gYmUgY29tcGxldGVseSBjbGVhcmVkIG91dCBhbmQgdGhlIGhpZ2hlc3RfbHVuCiAgKiAgICAgICAgICAgICByZXNldC4gIFNvbWV0aW1lcyB3ZSB3YW50IHRvIGNsZWFyIG91dCBpbmZvcm1hdGlvbiBhYm91dAotICogICAgICAgICAgICAgdGhlIGRpc2sgaW4gcHJlcGVyYXRpb24gZm9yIHJlLWFkZGluZyBpdC4gIEluIHRoaXMgY2FzZQorICogICAgICAgICAgICAgdGhlIGRpc2sgaW4gcHJlcGFyYXRpb24gZm9yIHJlLWFkZGluZyBpdC4gIEluIHRoaXMgY2FzZQogICogICAgICAgICAgICAgdGhlIGhpZ2hlc3RfbHVuIHNob3VsZCBiZSBsZWZ0IHVuY2hhbmdlZCBhbmQgdGhlIEx1bklECiAgKiAgICAgICAgICAgICBzaG91bGQgbm90IGJlIGNsZWFyZWQuCiAqLwpAQCAtMTQ5NiwxOSArMTU0MCwxNyBAQAogCQlyZXR1cm4gLUVQRVJNOwogCiAJLyogbWFrZSBzdXJlIGxvZ2ljYWwgdm9sdW1lIGlzIE5PVCBpcyB1c2UgKi8KLQlpZihjbGVhcl9hbGwgfHwgKGgtPmdlbmRpc2tbMF0gPT0gZGlzaykpIHsKLQlpZiAoZHJ2LT51c2FnZV9jb3VudCA+IDEpCi0gICAgICAgICAgICAgICAgcmV0dXJuIC1FQlVTWTsKLQl9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgCWlmKCBkcnYtPnVzYWdlX2NvdW50ID4gMCApCi0gICAgICAgICAgICAgICAgCXJldHVybiAtRUJVU1k7CisJaWYgKGNsZWFyX2FsbCB8fCAoaC0+Z2VuZGlza1swXSA9PSBkaXNrKSkgeworCQlpZiAoZHJ2LT51c2FnZV9jb3VudCA+IDEpCisJCQlyZXR1cm4gLUVCVVNZOworCX0gZWxzZSBpZiAoZHJ2LT51c2FnZV9jb3VudCA+IDApCisJCXJldHVybiAtRUJVU1k7CiAKIAkvKiBpbnZhbGlkYXRlIHRoZSBkZXZpY2VzIGFuZCBkZXJlZ2lzdGVyIHRoZSBkaXNrLiAgSWYgaXQgaXMgZGlzawogCSAqIHplcm8gZG8gbm90IGRlcmVnaXN0ZXIgaXQgYnV0IGp1c3QgemVybyBvdXQgaXQncyB2YWx1ZXMuICBUaGlzCiAJICogYWxsb3dzIHVzIHRvIGRlbGV0ZSBkaXNrIHplcm8gYnV0IGtlZXAgdGhlIGNvbnRyb2xsZXIgcmVnaXN0ZXJlZC4KLQkqLwotCWlmIChoLT5nZW5kaXNrWzBdICE9IGRpc2speworCSAqLworCWlmIChoLT5nZW5kaXNrWzBdICE9IGRpc2spIHsKIAkJaWYgKGRpc2spIHsKIAkJCXJlcXVlc3RfcXVldWVfdCAqcSA9IGRpc2stPnF1ZXVlOwogCQkJaWYgKGRpc2stPmZsYWdzICYgR0VOSERfRkxfVVApCkBAIC0xNTMwLDkxICsxNTcyLDkwIEBACiAJZHJ2LT5yYWlkX2xldmVsID0gLTE7CS8qIFRoaXMgY2FuIGJlIHVzZWQgYXMgYSBmbGFnIHZhcmlhYmxlIHRvCiAJCQkJICogaW5kaWNhdGUgdGhhdCB0aGlzIGVsZW1lbnQgb2YgdGhlIGRyaXZlCiAJCQkJICogYXJyYXkgaXMgZnJlZS4KLQkJCQkqLworCQkJCSAqLwogCi0JaWYgKGNsZWFyX2FsbCl7Ci0JLyogY2hlY2sgdG8gc2VlIGlmIGl0IHdhcyB0aGUgbGFzdCBkaXNrICovCi0JaWYgKGRydiA9PSBoLT5kcnYgKyBoLT5oaWdoZXN0X2x1bikgewotCQkvKiBpZiBzbywgZmluZCB0aGUgbmV3IGhpZ2h0ZXN0IGx1biAqLwotCQlpbnQgaSwgbmV3aGlnaGVzdCA9LTE7Ci0JCWZvcihpPTA7IGk8aC0+aGlnaGVzdF9sdW47IGkrKykgewotCQkJLyogaWYgdGhlIGRpc2sgaGFzIHNpemUgPiAwLCBpdCBpcyBhdmFpbGFibGUgKi8KKwlpZiAoY2xlYXJfYWxsKSB7CisJCS8qIGNoZWNrIHRvIHNlZSBpZiBpdCB3YXMgdGhlIGxhc3QgZGlzayAqLworCQlpZiAoZHJ2ID09IGgtPmRydiArIGgtPmhpZ2hlc3RfbHVuKSB7CisJCQkvKiBpZiBzbywgZmluZCB0aGUgbmV3IGhpZ2h0ZXN0IGx1biAqLworCQkJaW50IGksIG5ld2hpZ2hlc3QgPSAtMTsKKwkJCWZvciAoaSA9IDA7IGkgPCBoLT5oaWdoZXN0X2x1bjsgaSsrKSB7CisJCQkJLyogaWYgdGhlIGRpc2sgaGFzIHNpemUgPiAwLCBpdCBpcyBhdmFpbGFibGUgKi8KIAkJCQlpZiAoaC0+ZHJ2W2ldLmhlYWRzKQotCQkJCW5ld2hpZ2hlc3QgPSBpOworCQkJCQluZXdoaWdoZXN0ID0gaTsKKwkJCX0KKwkJCWgtPmhpZ2hlc3RfbHVuID0gbmV3aGlnaGVzdDsKIAkJfQotCQloLT5oaWdoZXN0X2x1biA9IG5ld2hpZ2hlc3Q7Ci0JfQogCi0JZHJ2LT5MdW5JRCA9IDA7CisJCWRydi0+THVuSUQgPSAwOwogCX0KLQlyZXR1cm4oMCk7CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZmlsbF9jbWQoQ29tbWFuZExpc3Rfc3RydWN0ICpjLCBfX3U4IGNtZCwgaW50IGN0bHIsIHZvaWQgKmJ1ZmYsCi0Jc2l6ZV90IHNpemUsCi0JdW5zaWduZWQgaW50IHVzZV91bml0X251bSwgLyogMDogYWRkcmVzcyB0aGUgY29udHJvbGxlciwKLQkJCQkgICAgICAxOiBhZGRyZXNzIGxvZ2ljYWwgdm9sdW1lIGxvZ191bml0LAotCQkJCSAgICAgIDI6IHBlcmlwaCBkZXZpY2UgYWRkcmVzcyBpcyBzY3NpM2FkZHIgKi8KLQl1bnNpZ25lZCBpbnQgbG9nX3VuaXQsIF9fdTggcGFnZV9jb2RlLCB1bnNpZ25lZCBjaGFyICpzY3NpM2FkZHIsCi0JaW50IGNtZF90eXBlKQorc3RhdGljIGludCBmaWxsX2NtZChDb21tYW5kTGlzdF9zdHJ1Y3QgKmMsIF9fdTggY21kLCBpbnQgY3Rsciwgdm9pZCAqYnVmZiwgc2l6ZV90IHNpemUsIHVuc2lnbmVkIGludCB1c2VfdW5pdF9udW0sCS8qIDA6IGFkZHJlc3MgdGhlIGNvbnRyb2xsZXIsCisJCQkJCQkJCQkJCQkJCQkgICAxOiBhZGRyZXNzIGxvZ2ljYWwgdm9sdW1lIGxvZ191bml0LAorCQkJCQkJCQkJCQkJCQkJICAgMjogcGVyaXBoIGRldmljZSBhZGRyZXNzIGlzIHNjc2kzYWRkciAqLworCQkgICAgdW5zaWduZWQgaW50IGxvZ191bml0LCBfX3U4IHBhZ2VfY29kZSwKKwkJICAgIHVuc2lnbmVkIGNoYXIgKnNjc2kzYWRkciwgaW50IGNtZF90eXBlKQogewotCWN0bHJfaW5mb190ICpoPSBoYmFbY3Rscl07CisJY3Rscl9pbmZvX3QgKmggPSBoYmFbY3Rscl07CiAJdTY0Yml0IGJ1ZmZfZG1hX2hhbmRsZTsKIAlpbnQgc3RhdHVzID0gSU9fT0s7CiAKIAljLT5jbWRfdHlwZSA9IENNRF9JT0NUTF9QRU5EOwogCWMtPkhlYWRlci5SZXBseVF1ZXVlID0gMDsKLQlpZiggYnVmZiAhPSBOVUxMKSB7CisJaWYgKGJ1ZmYgIT0gTlVMTCkgewogCQljLT5IZWFkZXIuU0dMaXN0ID0gMTsKLQkJYy0+SGVhZGVyLlNHVG90YWw9IDE7CisJCWMtPkhlYWRlci5TR1RvdGFsID0gMTsKIAl9IGVsc2UgewogCQljLT5IZWFkZXIuU0dMaXN0ID0gMDsKLSAgICAgICAgICAgICAgICBjLT5IZWFkZXIuU0dUb3RhbD0gMDsKKwkJYy0+SGVhZGVyLlNHVG90YWwgPSAwOwogCX0KIAljLT5IZWFkZXIuVGFnLmxvd2VyID0gYy0+YnVzYWRkcjsKIAogCWMtPlJlcXVlc3QuVHlwZS5UeXBlID0gY21kX3R5cGU7CiAJaWYgKGNtZF90eXBlID09IFRZUEVfQ01EKSB7Ci0JCXN3aXRjaChjbWQpIHsKLQkJY2FzZSAgQ0lTU19JTlFVSVJZOgorCQlzd2l0Y2ggKGNtZCkgeworCQljYXNlIENJU1NfSU5RVUlSWToKIAkJCS8qIElmIHRoZSBsb2dpY2FsIHVuaXQgbnVtYmVyIGlzIDAgdGhlbiwgdGhpcyBpcyBnb2luZwotCQkJdG8gY29udHJvbGxlciBzbyBJdCdzIGEgcGh5c2ljYWwgY29tbWFuZAotCQkJbW9kZSA9IDAgdGFyZ2V0ID0gMC4gIFNvIHdlIGhhdmUgbm90aGluZyB0byB3cml0ZS4KLQkJCW90aGVyd2lzZSwgaWYgdXNlX3VuaXRfbnVtID09IDEsCi0JCQltb2RlID0gMSh2b2x1bWUgc2V0IGFkZHJlc3NpbmcpIHRhcmdldCA9IExVTklECi0JCQlvdGhlcndpc2UsIGlmIHVzZV91bml0X251bSA9PSAyLAotCQkJbW9kZSA9IDAocGVyaXBoIGRldiBhZGRyKSB0YXJnZXQgPSBzY3NpM2FkZHIgKi8KKwkJCSAgIHRvIGNvbnRyb2xsZXIgc28gSXQncyBhIHBoeXNpY2FsIGNvbW1hbmQKKwkJCSAgIG1vZGUgPSAwIHRhcmdldCA9IDAuICBTbyB3ZSBoYXZlIG5vdGhpbmcgdG8gd3JpdGUuCisJCQkgICBvdGhlcndpc2UsIGlmIHVzZV91bml0X251bSA9PSAxLAorCQkJICAgbW9kZSA9IDEodm9sdW1lIHNldCBhZGRyZXNzaW5nKSB0YXJnZXQgPSBMVU5JRAorCQkJICAgb3RoZXJ3aXNlLCBpZiB1c2VfdW5pdF9udW0gPT0gMiwKKwkJCSAgIG1vZGUgPSAwKHBlcmlwaCBkZXYgYWRkcikgdGFyZ2V0ID0gc2NzaTNhZGRyICovCiAJCQlpZiAodXNlX3VuaXRfbnVtID09IDEpIHsKLQkJCQljLT5IZWFkZXIuTFVOLkxvZ0Rldi5Wb2xJZD0KLQkJCQkJaC0+ZHJ2W2xvZ191bml0XS5MdW5JRDsKLSAgICAgICAgICAgICAgICAgICAgICAgIAljLT5IZWFkZXIuTFVOLkxvZ0Rldi5Nb2RlID0gMTsKKwkJCQljLT5IZWFkZXIuTFVOLkxvZ0Rldi5Wb2xJZCA9CisJCQkJICAgIGgtPmRydltsb2dfdW5pdF0uTHVuSUQ7CisJCQkJYy0+SGVhZGVyLkxVTi5Mb2dEZXYuTW9kZSA9IDE7CiAJCQl9IGVsc2UgaWYgKHVzZV91bml0X251bSA9PSAyKSB7Ci0JCQkJbWVtY3B5KGMtPkhlYWRlci5MVU4uTHVuQWRkckJ5dGVzLHNjc2kzYWRkciw4KTsKKwkJCQltZW1jcHkoYy0+SGVhZGVyLkxVTi5MdW5BZGRyQnl0ZXMsIHNjc2kzYWRkciwKKwkJCQkgICAgICAgOCk7CiAJCQkJYy0+SGVhZGVyLkxVTi5Mb2dEZXYuTW9kZSA9IDA7CiAJCQl9CiAJCQkvKiBhcmUgd2UgdHJ5aW5nIHRvIHJlYWQgYSB2aXRhbCBwcm9kdWN0IHBhZ2UgKi8KLQkJCWlmKHBhZ2VfY29kZSAhPSAwKSB7CisJCQlpZiAocGFnZV9jb2RlICE9IDApIHsKIAkJCQljLT5SZXF1ZXN0LkNEQlsxXSA9IDB4MDE7CiAJCQkJYy0+UmVxdWVzdC5DREJbMl0gPSBwYWdlX2NvZGU7CiAJCQl9CiAJCQljLT5SZXF1ZXN0LkNEQkxlbiA9IDY7Ci0JCQljLT5SZXF1ZXN0LlR5cGUuQXR0cmlidXRlID0gQVRUUl9TSU1QTEU7ICAKKwkJCWMtPlJlcXVlc3QuVHlwZS5BdHRyaWJ1dGUgPSBBVFRSX1NJTVBMRTsKIAkJCWMtPlJlcXVlc3QuVHlwZS5EaXJlY3Rpb24gPSBYRkVSX1JFQUQ7CiAJCQljLT5SZXF1ZXN0LlRpbWVvdXQgPSAwOwotCQkJYy0+UmVxdWVzdC5DREJbMF0gPSAgQ0lTU19JTlFVSVJZOwotCQkJYy0+UmVxdWVzdC5DREJbNF0gPSBzaXplICAmIDB4RkY7ICAKLQkJYnJlYWs7CisJCQljLT5SZXF1ZXN0LkNEQlswXSA9IENJU1NfSU5RVUlSWTsKKwkJCWMtPlJlcXVlc3QuQ0RCWzRdID0gc2l6ZSAmIDB4RkY7CisJCQlicmVhazsKIAkJY2FzZSBDSVNTX1JFUE9SVF9MT0c6CiAJCWNhc2UgQ0lTU19SRVBPUlRfUEhZUzoKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRhbGtpbmcgdG8gY29udHJvbGxlciBzbyBJdCdzIGEgcGh5c2ljYWwgY29tbWFuZAorCQkJLyogVGFsa2luZyB0byBjb250cm9sbGVyIHNvIEl0J3MgYSBwaHlzaWNhbCBjb21tYW5kCiAJCQkgICBtb2RlID0gMDAgdGFyZ2V0ID0gMC4gIE5vdGhpbmcgdG8gd3JpdGUuCi0gICAgICAgICAgICAgICAgICAgICAgICAqLworCQkJICovCiAJCQljLT5SZXF1ZXN0LkNEQkxlbiA9IDEyOwogCQkJYy0+UmVxdWVzdC5UeXBlLkF0dHJpYnV0ZSA9IEFUVFJfU0lNUExFOwogCQkJYy0+UmVxdWVzdC5UeXBlLkRpcmVjdGlvbiA9IFhGRVJfUkVBRDsKIAkJCWMtPlJlcXVlc3QuVGltZW91dCA9IDA7CiAJCQljLT5SZXF1ZXN0LkNEQlswXSA9IGNtZDsKLQkJCWMtPlJlcXVlc3QuQ0RCWzZdID0gKHNpemUgPj4gMjQpICYgMHhGRjsgIC8vTVNCCisJCQljLT5SZXF1ZXN0LkNEQls2XSA9IChzaXplID4+IDI0KSAmIDB4RkY7CS8vTVNCCiAJCQljLT5SZXF1ZXN0LkNEQls3XSA9IChzaXplID4+IDE2KSAmIDB4RkY7CiAJCQljLT5SZXF1ZXN0LkNEQls4XSA9IChzaXplID4+IDgpICYgMHhGRjsKIAkJCWMtPlJlcXVlc3QuQ0RCWzldID0gc2l6ZSAmIDB4RkY7CkBAIC0xNjI4LDcgKzE2NjksNyBAQAogCQkJYy0+UmVxdWVzdC5UeXBlLkRpcmVjdGlvbiA9IFhGRVJfUkVBRDsKIAkJCWMtPlJlcXVlc3QuVGltZW91dCA9IDA7CiAJCQljLT5SZXF1ZXN0LkNEQlswXSA9IGNtZDsKLQkJYnJlYWs7CisJCQlicmVhazsKIAkJY2FzZSBDQ0lTU19DQUNIRV9GTFVTSDoKIAkJCWMtPlJlcXVlc3QuQ0RCTGVuID0gMTI7CiAJCQljLT5SZXF1ZXN0LlR5cGUuQXR0cmlidXRlID0gQVRUUl9TSU1QTEU7CkBAIC0xNjM2LDMyICsxNjc3LDMyIEBACiAJCQljLT5SZXF1ZXN0LlRpbWVvdXQgPSAwOwogCQkJYy0+UmVxdWVzdC5DREJbMF0gPSBCTUlDX1dSSVRFOwogCQkJYy0+UmVxdWVzdC5DREJbNl0gPSBCTUlDX0NBQ0hFX0ZMVVNIOwotCQlicmVhazsKKwkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkJCSJjY2lzcyVkOiAgVW5rbm93biBDb21tYW5kIDB4JWNcbiIsIGN0bHIsIGNtZCk7Ci0JCQlyZXR1cm4oSU9fRVJST1IpOworCQkJICAgICAgICJjY2lzcyVkOiAgVW5rbm93biBDb21tYW5kIDB4JWNcbiIsIGN0bHIsIGNtZCk7CisJCQlyZXR1cm4gSU9fRVJST1I7CiAJCX0KIAl9IGVsc2UgaWYgKGNtZF90eXBlID09IFRZUEVfTVNHKSB7CiAJCXN3aXRjaCAoY21kKSB7Ci0JCWNhc2UgMDogLyogQUJPUlQgbWVzc2FnZSAqLworCQljYXNlIDA6CS8qIEFCT1JUIG1lc3NhZ2UgKi8KIAkJCWMtPlJlcXVlc3QuQ0RCTGVuID0gMTI7CiAJCQljLT5SZXF1ZXN0LlR5cGUuQXR0cmlidXRlID0gQVRUUl9TSU1QTEU7CiAJCQljLT5SZXF1ZXN0LlR5cGUuRGlyZWN0aW9uID0gWEZFUl9XUklURTsKIAkJCWMtPlJlcXVlc3QuVGltZW91dCA9IDA7Ci0JCQljLT5SZXF1ZXN0LkNEQlswXSA9IGNtZDsgLyogYWJvcnQgKi8KLQkJCWMtPlJlcXVlc3QuQ0RCWzFdID0gMDsgICAvKiBhYm9ydCBhIGNvbW1hbmQgKi8KKwkJCWMtPlJlcXVlc3QuQ0RCWzBdID0gY21kOwkvKiBhYm9ydCAqLworCQkJYy0+UmVxdWVzdC5DREJbMV0gPSAwOwkvKiBhYm9ydCBhIGNvbW1hbmQgKi8KIAkJCS8qIGJ1ZmYgY29udGFpbnMgdGhlIHRhZyBvZiB0aGUgY29tbWFuZCB0byBhYm9ydCAqLwogCQkJbWVtY3B5KCZjLT5SZXF1ZXN0LkNEQls0XSwgYnVmZiwgOCk7CiAJCQlicmVhazsKLQkJY2FzZSAxOiAvKiBSRVNFVCBtZXNzYWdlICovCisJCWNhc2UgMToJLyogUkVTRVQgbWVzc2FnZSAqLwogCQkJYy0+UmVxdWVzdC5DREJMZW4gPSAxMjsKIAkJCWMtPlJlcXVlc3QuVHlwZS5BdHRyaWJ1dGUgPSBBVFRSX1NJTVBMRTsKIAkJCWMtPlJlcXVlc3QuVHlwZS5EaXJlY3Rpb24gPSBYRkVSX1dSSVRFOwogCQkJYy0+UmVxdWVzdC5UaW1lb3V0ID0gMDsKIAkJCW1lbXNldCgmYy0+UmVxdWVzdC5DREJbMF0sIDAsIHNpemVvZihjLT5SZXF1ZXN0LkNEQikpOwotCQkJYy0+UmVxdWVzdC5DREJbMF0gPSBjbWQ7ICAvKiByZXNldCAqLwotCQkJYy0+UmVxdWVzdC5DREJbMV0gPSAweDA0OyAvKiByZXNldCBhIExVTiAqLworCQkJYy0+UmVxdWVzdC5DREJbMF0gPSBjbWQ7CS8qIHJlc2V0ICovCisJCQljLT5SZXF1ZXN0LkNEQlsxXSA9IDB4MDQ7CS8qIHJlc2V0IGEgTFVOICovCiAJCWNhc2UgMzoJLyogTm8tT3AgbWVzc2FnZSAqLwogCQkJYy0+UmVxdWVzdC5DREJMZW4gPSAxOwogCQkJYy0+UmVxdWVzdC5UeXBlLkF0dHJpYnV0ZSA9IEFUVFJfU0lNUExFOwpAQCAtMTY3MSwxNjggKzE3MTIsMTY0IEBACiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJCQkiY2Npc3MlZDogdW5rbm93biBtZXNzYWdlIHR5cGUgJWRcbiIsCi0JCQkJY3RsciwgY21kKTsKKwkJCSAgICAgICAiY2Npc3MlZDogdW5rbm93biBtZXNzYWdlIHR5cGUgJWRcbiIsIGN0bHIsIGNtZCk7CiAJCQlyZXR1cm4gSU9fRVJST1I7CiAJCX0KIAl9IGVsc2UgewogCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCQkiY2Npc3MlZDogdW5rbm93biBjb21tYW5kIHR5cGUgJWRcbiIsIGN0bHIsIGNtZF90eXBlKTsKKwkJICAgICAgICJjY2lzcyVkOiB1bmtub3duIGNvbW1hbmQgdHlwZSAlZFxuIiwgY3RsciwgY21kX3R5cGUpOwogCQlyZXR1cm4gSU9fRVJST1I7CiAJfQogCS8qIEZpbGwgaW4gdGhlIHNjYXR0ZXIgZ2F0aGVyIGluZm9ybWF0aW9uICovCiAJaWYgKHNpemUgPiAwKSB7CiAJCWJ1ZmZfZG1hX2hhbmRsZS52YWwgPSAoX191NjQpIHBjaV9tYXBfc2luZ2xlKGgtPnBkZXYsCi0JCQlidWZmLCBzaXplLCBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOworCQkJCQkJCSAgICAgYnVmZiwgc2l6ZSwKKwkJCQkJCQkgICAgIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7CiAJCWMtPlNHWzBdLkFkZHIubG93ZXIgPSBidWZmX2RtYV9oYW5kbGUudmFsMzIubG93ZXI7CiAJCWMtPlNHWzBdLkFkZHIudXBwZXIgPSBidWZmX2RtYV9oYW5kbGUudmFsMzIudXBwZXI7CiAJCWMtPlNHWzBdLkxlbiA9IHNpemU7Ci0JCWMtPlNHWzBdLkV4dCA9IDA7ICAvKiB3ZSBhcmUgbm90IGNoYWluaW5nICovCisJCWMtPlNHWzBdLkV4dCA9IDA7CS8qIHdlIGFyZSBub3QgY2hhaW5pbmcgKi8KIAl9CiAJcmV0dXJuIHN0YXR1czsKIH0KLXN0YXRpYyBpbnQgc2VuZGNtZF93aXRoaXJxKF9fdTgJY21kLAotCWludAljdGxyLAotCXZvaWQJKmJ1ZmYsCi0Jc2l6ZV90CXNpemUsCi0JdW5zaWduZWQgaW50IHVzZV91bml0X251bSwKLQl1bnNpZ25lZCBpbnQgbG9nX3VuaXQsCi0JX191OAlwYWdlX2NvZGUsCi0JaW50IGNtZF90eXBlKQorCitzdGF0aWMgaW50IHNlbmRjbWRfd2l0aGlycShfX3U4IGNtZCwKKwkJCSAgIGludCBjdGxyLAorCQkJICAgdm9pZCAqYnVmZiwKKwkJCSAgIHNpemVfdCBzaXplLAorCQkJICAgdW5zaWduZWQgaW50IHVzZV91bml0X251bSwKKwkJCSAgIHVuc2lnbmVkIGludCBsb2dfdW5pdCwgX191OCBwYWdlX2NvZGUsIGludCBjbWRfdHlwZSkKIHsKIAljdGxyX2luZm9fdCAqaCA9IGhiYVtjdGxyXTsKIAlDb21tYW5kTGlzdF9zdHJ1Y3QgKmM7Ci0JdTY0Yml0CWJ1ZmZfZG1hX2hhbmRsZTsKKwl1NjRiaXQgYnVmZl9kbWFfaGFuZGxlOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJldHVybl9zdGF0dXM7CiAJREVDTEFSRV9DT01QTEVUSU9OKHdhaXQpOwotCQotCWlmICgoYyA9IGNtZF9hbGxvYyhoICwgMCkpID09IE5VTEwpCisKKwlpZiAoKGMgPSBjbWRfYWxsb2MoaCwgMCkpID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCXJldHVybl9zdGF0dXMgPSBmaWxsX2NtZChjLCBjbWQsIGN0bHIsIGJ1ZmYsIHNpemUsIHVzZV91bml0X251bSwKLQkJbG9nX3VuaXQsIHBhZ2VfY29kZSwgTlVMTCwgY21kX3R5cGUpOworCQkJCSBsb2dfdW5pdCwgcGFnZV9jb2RlLCBOVUxMLCBjbWRfdHlwZSk7CiAJaWYgKHJldHVybl9zdGF0dXMgIT0gSU9fT0spIHsKIAkJY21kX2ZyZWUoaCwgYywgMCk7CiAJCXJldHVybiByZXR1cm5fc3RhdHVzOwogCX0KLXJlc2VuZF9jbWQyOgorICAgICAgcmVzZW5kX2NtZDI6CiAJYy0+d2FpdGluZyA9ICZ3YWl0OwotCQorCiAJLyogUHV0IHRoZSByZXF1ZXN0IG9uIHRoZSB0YWlsIG9mIHRoZSBxdWV1ZSBhbmQgc2VuZCBpdCAqLwogCXNwaW5fbG9ja19pcnFzYXZlKENDSVNTX0xPQ0soY3RsciksIGZsYWdzKTsKIAlhZGRRKCZoLT5yZXFRLCBjKTsKIAloLT5RZGVwdGgrKzsKIAlzdGFydF9pbyhoKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKENDSVNTX0xPQ0soY3RsciksIGZsYWdzKTsKLQkKKwogCXdhaXRfZm9yX2NvbXBsZXRpb24oJndhaXQpOwogCi0JaWYoYy0+ZXJyX2luZm8tPkNvbW1hbmRTdGF0dXMgIT0gMCkgCi0JeyAvKiBhbiBlcnJvciBoYXMgb2NjdXJyZWQgKi8gCi0JCXN3aXRjaChjLT5lcnJfaW5mby0+Q29tbWFuZFN0YXR1cykKLQkJewotCQkJY2FzZSBDTURfVEFSR0VUX1NUQVRVUzoKLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJjY2lzczogY21kICVwIGhhcyAiCi0JCQkJCSIgY29tcGxldGVkIHdpdGggZXJyb3JzXG4iLCBjKTsKLQkJCQlpZiggYy0+ZXJyX2luZm8tPlNjc2lTdGF0dXMpCi0gICAgICAgICAgICAgICAgCQl7Ci0gICAgICAgICAgICAgICAgICAgIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzOiBjbWQgJXAgIgotCQkJCQkiaGFzIFNDU0kgU3RhdHVzID0gJXhcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAJCQljLCAgCi0JCQkJCQljLT5lcnJfaW5mby0+U2NzaVN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgCQl9CisJaWYgKGMtPmVycl9pbmZvLT5Db21tYW5kU3RhdHVzICE9IDApIHsJLyogYW4gZXJyb3IgaGFzIG9jY3VycmVkICovCisJCXN3aXRjaCAoYy0+ZXJyX2luZm8tPkNvbW1hbmRTdGF0dXMpIHsKKwkJY2FzZSBDTURfVEFSR0VUX1NUQVRVUzoKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzOiBjbWQgJXAgaGFzICIKKwkJCSAgICAgICAiIGNvbXBsZXRlZCB3aXRoIGVycm9yc1xuIiwgYyk7CisJCQlpZiAoYy0+ZXJyX2luZm8tPlNjc2lTdGF0dXMpIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJjY2lzczogY21kICVwICIKKwkJCQkgICAgICAgImhhcyBTQ1NJIFN0YXR1cyA9ICV4XG4iLAorCQkJCSAgICAgICBjLCBjLT5lcnJfaW5mby0+U2NzaVN0YXR1cyk7CisJCQl9CiAKIAkJCWJyZWFrOwotCQkJY2FzZSBDTURfREFUQV9VTkRFUlJVTjoKLQkJCWNhc2UgQ01EX0RBVEFfT1ZFUlJVTjoKKwkJY2FzZSBDTURfREFUQV9VTkRFUlJVTjoKKwkJY2FzZSBDTURfREFUQV9PVkVSUlVOOgogCQkJLyogZXhwZWN0ZWQgZm9yIGlucXVpcmUgYW5kIHJlcG9ydCBsdW4gY29tbWFuZHMgKi8KIAkJCWJyZWFrOwotCQkJY2FzZSBDTURfSU5WQUxJRDoKLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJjY2lzczogQ21kICVwIGlzICIKLQkJCQkJInJlcG9ydGVkIGludmFsaWRcbiIsIGMpOwotCQkJCXJldHVybl9zdGF0dXMgPSBJT19FUlJPUjsKKwkJY2FzZSBDTURfSU5WQUxJRDoKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzOiBDbWQgJXAgaXMgIgorCQkJICAgICAgICJyZXBvcnRlZCBpbnZhbGlkXG4iLCBjKTsKKwkJCXJldHVybl9zdGF0dXMgPSBJT19FUlJPUjsKIAkJCWJyZWFrOwotCQkJY2FzZSBDTURfUFJPVE9DT0xfRVJSOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICJjY2lzczogY21kICVwIGhhcyAiCi0JCQkJCSJwcm90b2NvbCBlcnJvciBcbiIsIGMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5fc3RhdHVzID0gSU9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLWNhc2UgQ01EX0hBUkRXQVJFX0VSUjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiY2Npc3M6IGNtZCAlcCBoYWQgIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGhhcmR3YXJlIGVycm9yXG4iLCBjKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuX3N0YXR1cyA9IElPX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0JCQljYXNlIENNRF9DT05ORUNUSU9OX0xPU1Q6Ci0JCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2Npc3M6IGNtZCAlcCBoYWQgIgotCQkJCQkiY29ubmVjdGlvbiBsb3N0XG4iLCBjKTsKLQkJCQlyZXR1cm5fc3RhdHVzID0gSU9fRVJST1I7CisJCWNhc2UgQ01EX1BST1RPQ09MX0VSUjoKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzOiBjbWQgJXAgaGFzICIKKwkJCSAgICAgICAicHJvdG9jb2wgZXJyb3IgXG4iLCBjKTsKKwkJCXJldHVybl9zdGF0dXMgPSBJT19FUlJPUjsKIAkJCWJyZWFrOwotCQkJY2FzZSBDTURfQUJPUlRFRDoKLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJjY2lzczogY21kICVwIHdhcyAiCi0JCQkJCSJhYm9ydGVkXG4iLCBjKTsKLQkJCQlyZXR1cm5fc3RhdHVzID0gSU9fRVJST1I7CisJCWNhc2UgQ01EX0hBUkRXQVJFX0VSUjoKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzOiBjbWQgJXAgaGFkICIKKwkJCSAgICAgICAiIGhhcmR3YXJlIGVycm9yXG4iLCBjKTsKKwkJCXJldHVybl9zdGF0dXMgPSBJT19FUlJPUjsKIAkJCWJyZWFrOwotCQkJY2FzZSBDTURfQUJPUlRfRkFJTEVEOgotCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzOiBjbWQgJXAgcmVwb3J0cyAiCi0JCQkJCSJhYm9ydCBmYWlsZWRcbiIsIGMpOwotCQkJCXJldHVybl9zdGF0dXMgPSBJT19FUlJPUjsKKwkJY2FzZSBDTURfQ09OTkVDVElPTl9MT1NUOgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2Npc3M6IGNtZCAlcCBoYWQgIgorCQkJICAgICAgICJjb25uZWN0aW9uIGxvc3RcbiIsIGMpOworCQkJcmV0dXJuX3N0YXR1cyA9IElPX0VSUk9SOwogCQkJYnJlYWs7Ci0JCQljYXNlIENNRF9VTlNPTElDSVRFRF9BQk9SVDoKLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HIAotCQkJCQkiY2Npc3MlZDogdW5zb2xpY2l0ZWQgYWJvcnQgJXBcbiIsCi0JCQkJCWN0bHIsIGMpOwotCQkJCWlmIChjLT5yZXRyeV9jb3VudCA8IE1BWF9DTURfUkVUUklFUykgewotCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HIAotCQkJCQkJImNjaXNzJWQ6IHJldHJ5aW5nICVwXG4iLCAKLQkJCQkJCWN0bHIsIGMpOwotCQkJCQljLT5yZXRyeV9jb3VudCsrOwotCQkJCQkvKiBlcmFzZSB0aGUgb2xkIGVycm9yIGluZm9ybWF0aW9uICovCi0JCQkJCW1lbXNldChjLT5lcnJfaW5mbywgMCwKLQkJCQkJCXNpemVvZihFcnJvckluZm9fc3RydWN0KSk7Ci0JCQkJCXJldHVybl9zdGF0dXMgPSBJT19PSzsKLQkJCQkJSU5JVF9DT01QTEVUSU9OKHdhaXQpOwotCQkJCQlnb3RvIHJlc2VuZF9jbWQyOwotCQkJCX0KLQkJCQlyZXR1cm5fc3RhdHVzID0gSU9fRVJST1I7CisJCWNhc2UgQ01EX0FCT1JURUQ6CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJjY2lzczogY21kICVwIHdhcyAiCisJCQkgICAgICAgImFib3J0ZWRcbiIsIGMpOworCQkJcmV0dXJuX3N0YXR1cyA9IElPX0VSUk9SOwogCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzOiBjbWQgJXAgcmV0dXJuZWQgIgotCQkJCQkidW5rbm93biBzdGF0dXMgJXhcbiIsIGMsIAotCQkJCQkJYy0+ZXJyX2luZm8tPkNvbW1hbmRTdGF0dXMpOyAKLQkJCQlyZXR1cm5fc3RhdHVzID0gSU9fRVJST1I7CisJCWNhc2UgQ01EX0FCT1JUX0ZBSUxFRDoKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzOiBjbWQgJXAgcmVwb3J0cyAiCisJCQkgICAgICAgImFib3J0IGZhaWxlZFxuIiwgYyk7CisJCQlyZXR1cm5fc3RhdHVzID0gSU9fRVJST1I7CisJCQlicmVhazsKKwkJY2FzZSBDTURfVU5TT0xJQ0lURURfQUJPUlQ6CisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgImNjaXNzJWQ6IHVuc29saWNpdGVkIGFib3J0ICVwXG4iLCBjdGxyLCBjKTsKKwkJCWlmIChjLT5yZXRyeV9jb3VudCA8IE1BWF9DTURfUkVUUklFUykgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQkgICAgICAgImNjaXNzJWQ6IHJldHJ5aW5nICVwXG4iLCBjdGxyLCBjKTsKKwkJCQljLT5yZXRyeV9jb3VudCsrOworCQkJCS8qIGVyYXNlIHRoZSBvbGQgZXJyb3IgaW5mb3JtYXRpb24gKi8KKwkJCQltZW1zZXQoYy0+ZXJyX2luZm8sIDAsCisJCQkJICAgICAgIHNpemVvZihFcnJvckluZm9fc3RydWN0KSk7CisJCQkJcmV0dXJuX3N0YXR1cyA9IElPX09LOworCQkJCUlOSVRfQ09NUExFVElPTih3YWl0KTsKKwkJCQlnb3RvIHJlc2VuZF9jbWQyOworCQkJfQorCQkJcmV0dXJuX3N0YXR1cyA9IElPX0VSUk9SOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJjY2lzczogY21kICVwIHJldHVybmVkICIKKwkJCSAgICAgICAidW5rbm93biBzdGF0dXMgJXhcbiIsIGMsCisJCQkgICAgICAgYy0+ZXJyX2luZm8tPkNvbW1hbmRTdGF0dXMpOworCQkJcmV0dXJuX3N0YXR1cyA9IElPX0VSUk9SOwogCQl9Ci0JfQkKKwl9CiAJLyogdW5sb2NrIHRoZSBidWZmZXJzIGZyb20gRE1BICovCiAJYnVmZl9kbWFfaGFuZGxlLnZhbDMyLmxvd2VyID0gYy0+U0dbMF0uQWRkci5sb3dlcjsKIAlidWZmX2RtYV9oYW5kbGUudmFsMzIudXBwZXIgPSBjLT5TR1swXS5BZGRyLnVwcGVyOwotCXBjaV91bm1hcF9zaW5nbGUoIGgtPnBkZXYsIChkbWFfYWRkcl90KSBidWZmX2RtYV9oYW5kbGUudmFsLAotCQkJYy0+U0dbMF0uTGVuLCBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOworCXBjaV91bm1hcF9zaW5nbGUoaC0+cGRldiwgKGRtYV9hZGRyX3QpIGJ1ZmZfZG1hX2hhbmRsZS52YWwsCisJCQkgYy0+U0dbMF0uTGVuLCBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOwogCWNtZF9mcmVlKGgsIGMsIDApOwotICAgICAgICByZXR1cm4ocmV0dXJuX3N0YXR1cyk7Ci0KKwlyZXR1cm4gcmV0dXJuX3N0YXR1czsKIH0KKwogc3RhdGljIHZvaWQgY2Npc3NfZ2VvbWV0cnlfaW5xdWlyeShpbnQgY3RsciwgaW50IGxvZ3ZvbCwKLQkJCWludCB3aXRoaXJxLCB1bnNpZ25lZCBpbnQgdG90YWxfc2l6ZSwKLQkJCXVuc2lnbmVkIGludCBibG9ja19zaXplLCBJbnF1aXJ5RGF0YV9zdHJ1Y3QgKmlucV9idWZmLAotCQkJZHJpdmVfaW5mb19zdHJ1Y3QgKmRydikKKwkJCQkgICBpbnQgd2l0aGlycSwgdW5zaWduZWQgaW50IHRvdGFsX3NpemUsCisJCQkJICAgdW5zaWduZWQgaW50IGJsb2NrX3NpemUsCisJCQkJICAgSW5xdWlyeURhdGFfc3RydWN0ICppbnFfYnVmZiwKKwkJCQkgICBkcml2ZV9pbmZvX3N0cnVjdCAqZHJ2KQogewogCWludCByZXR1cm5fY29kZTsKIAltZW1zZXQoaW5xX2J1ZmYsIDAsIHNpemVvZihJbnF1aXJ5RGF0YV9zdHJ1Y3QpKTsKIAlpZiAod2l0aGlycSkKIAkJcmV0dXJuX2NvZGUgPSBzZW5kY21kX3dpdGhpcnEoQ0lTU19JTlFVSVJZLCBjdGxyLAotCQkJaW5xX2J1ZmYsIHNpemVvZigqaW5xX2J1ZmYpLCAxLCBsb2d2b2wgLDB4QzEsIFRZUEVfQ01EKTsKKwkJCQkJICAgICAgaW5xX2J1ZmYsIHNpemVvZigqaW5xX2J1ZmYpLCAxLAorCQkJCQkgICAgICBsb2d2b2wsIDB4QzEsIFRZUEVfQ01EKTsKIAllbHNlCiAJCXJldHVybl9jb2RlID0gc2VuZGNtZChDSVNTX0lOUVVJUlksIGN0bHIsIGlucV9idWZmLAotCQkJc2l6ZW9mKCppbnFfYnVmZiksIDEsIGxvZ3ZvbCAsMHhDMSwgTlVMTCwgVFlQRV9DTUQpOworCQkJCSAgICAgIHNpemVvZigqaW5xX2J1ZmYpLCAxLCBsb2d2b2wsIDB4QzEsIE5VTEwsCisJCQkJICAgICAgVFlQRV9DTUQpOwogCWlmIChyZXR1cm5fY29kZSA9PSBJT19PSykgewotCQlpZihpbnFfYnVmZi0+ZGF0YV9ieXRlWzhdID09IDB4RkYpIHsKKwkJaWYgKGlucV9idWZmLT5kYXRhX2J5dGVbOF0gPT0gMHhGRikgewogCQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkJCSJjY2lzczogcmVhZGluZyBnZW9tZXRyeSBmYWlsZWQsIHZvbHVtZSAiCi0JCQkJImRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyBnZW9tZXRyeVxuIik7CisJCQkgICAgICAgImNjaXNzOiByZWFkaW5nIGdlb21ldHJ5IGZhaWxlZCwgdm9sdW1lICIKKwkJCSAgICAgICAiZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nIGdlb21ldHJ5XG4iKTsKIAkJCWRydi0+YmxvY2tfc2l6ZSA9IGJsb2NrX3NpemU7CiAJCQlkcnYtPm5yX2Jsb2NrcyA9IHRvdGFsX3NpemU7CiAJCQlkcnYtPmhlYWRzID0gMjU1OwotCQkJZHJ2LT5zZWN0b3JzID0gMzI7IC8vIFNlY3RvcnMgcGVyIHRyYWNrCisJCQlkcnYtPnNlY3RvcnMgPSAzMjsJLy8gU2VjdG9ycyBwZXIgdHJhY2sKIAkJCWRydi0+Y3lsaW5kZXJzID0gdG90YWxfc2l6ZSAvIDI1NSAvIDMyOwogCQl9IGVsc2UgewogCQkJdW5zaWduZWQgaW50IHQ7CkBAIC0xODQ2LDM3ICsxODgzLDQyIEBACiAJCQlkcnYtPnJhaWRfbGV2ZWwgPSBpbnFfYnVmZi0+ZGF0YV9ieXRlWzhdOwogCQkJdCA9IGRydi0+aGVhZHMgKiBkcnYtPnNlY3RvcnM7CiAJCQlpZiAodCA+IDEpIHsKLQkJCQlkcnYtPmN5bGluZGVycyA9IHRvdGFsX3NpemUvdDsKKwkJCQlkcnYtPmN5bGluZGVycyA9IHRvdGFsX3NpemUgLyB0OwogCQkJfQogCQl9Ci0JfSBlbHNlIHsgLyogR2V0IGdlb21ldHJ5IGZhaWxlZCAqLworCX0gZWxzZSB7CQkvKiBHZXQgZ2VvbWV0cnkgZmFpbGVkICovCiAJCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzOiByZWFkaW5nIGdlb21ldHJ5IGZhaWxlZFxuIik7CiAJfQogCXByaW50ayhLRVJOX0lORk8gIiAgICAgIGhlYWRzPSAlZCwgc2VjdG9ycz0gJWQsIGN5bGluZGVycz0gJWRcblxuIiwKLQkJZHJ2LT5oZWFkcywgZHJ2LT5zZWN0b3JzLCBkcnYtPmN5bGluZGVycyk7CisJICAgICAgIGRydi0+aGVhZHMsIGRydi0+c2VjdG9ycywgZHJ2LT5jeWxpbmRlcnMpOwogfQorCiBzdGF0aWMgdm9pZAogY2Npc3NfcmVhZF9jYXBhY2l0eShpbnQgY3RsciwgaW50IGxvZ3ZvbCwgUmVhZENhcGRhdGFfc3RydWN0ICpidWYsCi0JCWludCB3aXRoaXJxLCB1bnNpZ25lZCBpbnQgKnRvdGFsX3NpemUsIHVuc2lnbmVkIGludCAqYmxvY2tfc2l6ZSkKKwkJICAgIGludCB3aXRoaXJxLCB1bnNpZ25lZCBpbnQgKnRvdGFsX3NpemUsCisJCSAgICB1bnNpZ25lZCBpbnQgKmJsb2NrX3NpemUpCiB7CiAJaW50IHJldHVybl9jb2RlOwogCW1lbXNldChidWYsIDAsIHNpemVvZigqYnVmKSk7CiAJaWYgKHdpdGhpcnEpCiAJCXJldHVybl9jb2RlID0gc2VuZGNtZF93aXRoaXJxKENDSVNTX1JFQURfQ0FQQUNJVFksCi0JCQljdGxyLCBidWYsIHNpemVvZigqYnVmKSwgMSwgbG9ndm9sLCAwLCBUWVBFX0NNRCk7CisJCQkJCSAgICAgIGN0bHIsIGJ1Ziwgc2l6ZW9mKCpidWYpLCAxLAorCQkJCQkgICAgICBsb2d2b2wsIDAsIFRZUEVfQ01EKTsKIAllbHNlCiAJCXJldHVybl9jb2RlID0gc2VuZGNtZChDQ0lTU19SRUFEX0NBUEFDSVRZLAotCQkJY3RsciwgYnVmLCBzaXplb2YoKmJ1ZiksIDEsIGxvZ3ZvbCwgMCwgTlVMTCwgVFlQRV9DTUQpOworCQkJCSAgICAgIGN0bHIsIGJ1Ziwgc2l6ZW9mKCpidWYpLCAxLCBsb2d2b2wsIDAsCisJCQkJICAgICAgTlVMTCwgVFlQRV9DTUQpOwogCWlmIChyZXR1cm5fY29kZSA9PSBJT19PSykgewotCQkqdG90YWxfc2l6ZSA9IGJlMzJfdG9fY3B1KCooKF9fYmUzMiAqKSAmYnVmLT50b3RhbF9zaXplWzBdKSkrMTsKLQkJKmJsb2NrX3NpemUgPSBiZTMyX3RvX2NwdSgqKChfX2JlMzIgKikgJmJ1Zi0+YmxvY2tfc2l6ZVswXSkpOwotCX0gZWxzZSB7IC8qIHJlYWQgY2FwYWNpdHkgY29tbWFuZCBmYWlsZWQgKi8KKwkJKnRvdGFsX3NpemUgPQorCQkgICAgYmUzMl90b19jcHUoKigoX19iZTMyICopICYgYnVmLT50b3RhbF9zaXplWzBdKSkgKyAxOworCQkqYmxvY2tfc2l6ZSA9IGJlMzJfdG9fY3B1KCooKF9fYmUzMiAqKSAmIGJ1Zi0+YmxvY2tfc2l6ZVswXSkpOworCX0gZWxzZSB7CQkvKiByZWFkIGNhcGFjaXR5IGNvbW1hbmQgZmFpbGVkICovCiAJCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzOiByZWFkIGNhcGFjaXR5IGZhaWxlZFxuIik7CiAJCSp0b3RhbF9zaXplID0gMDsKIAkJKmJsb2NrX3NpemUgPSBCTE9DS19TSVpFOwogCX0KIAlwcmludGsoS0VSTl9JTkZPICIgICAgICBibG9ja3M9ICV1IGJsb2NrX3NpemU9ICVkXG4iLAotCQkqdG90YWxfc2l6ZSwgKmJsb2NrX3NpemUpOworCSAgICAgICAqdG90YWxfc2l6ZSwgKmJsb2NrX3NpemUpOwogCXJldHVybjsKIH0KIApAQCAtMTg4NSwzOCArMTkyNywzOCBAQAogCWN0bHJfaW5mb190ICpoID0gZ2V0X2hvc3QoZGlzayk7CiAJZHJpdmVfaW5mb19zdHJ1Y3QgKmRydiA9IGdldF9kcnYoZGlzayk7CiAJaW50IGxvZ3ZvbDsKLQlpbnQgRk9VTkQ9MDsKKwlpbnQgRk9VTkQgPSAwOwogCXVuc2lnbmVkIGludCBibG9ja19zaXplOwogCXVuc2lnbmVkIGludCB0b3RhbF9zaXplOwogCVJlYWRDYXBkYXRhX3N0cnVjdCAqc2l6ZV9idWZmID0gTlVMTDsKIAlJbnF1aXJ5RGF0YV9zdHJ1Y3QgKmlucV9idWZmID0gTlVMTDsKIAotCWZvcihsb2d2b2w9MDsgbG9ndm9sIDwgQ0lTU19NQVhfTFVOOyBsb2d2b2wrKykKLQl7Ci0JCWlmKGgtPmRydltsb2d2b2xdLkx1bklEID09IGRydi0+THVuSUQpIHsKLQkJCUZPVU5EPTE7CisJZm9yIChsb2d2b2wgPSAwOyBsb2d2b2wgPCBDSVNTX01BWF9MVU47IGxvZ3ZvbCsrKSB7CisJCWlmIChoLT5kcnZbbG9ndm9sXS5MdW5JRCA9PSBkcnYtPkx1bklEKSB7CisJCQlGT1VORCA9IDE7CiAJCQlicmVhazsKIAkJfQogCX0KIAotCWlmICghRk9VTkQpIHJldHVybiAxOworCWlmICghRk9VTkQpCisJCXJldHVybiAxOwogCi0Jc2l6ZV9idWZmID0ga21hbGxvYyhzaXplb2YoIFJlYWRDYXBkYXRhX3N0cnVjdCksIEdGUF9LRVJORUwpOwotICAgICAgICBpZiAoc2l6ZV9idWZmID09IE5VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICJjY2lzczogb3V0IG9mIG1lbW9yeVxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0KLQlpbnFfYnVmZiA9IGttYWxsb2Moc2l6ZW9mKCBJbnF1aXJ5RGF0YV9zdHJ1Y3QpLCBHRlBfS0VSTkVMKTsKLSAgICAgICAgaWYgKGlucV9idWZmID09IE5VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICJjY2lzczogb3V0IG9mIG1lbW9yeVxuIik7CisJc2l6ZV9idWZmID0ga21hbGxvYyhzaXplb2YoUmVhZENhcGRhdGFfc3RydWN0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKHNpemVfYnVmZiA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzOiBvdXQgb2YgbWVtb3J5XG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCWlucV9idWZmID0ga21hbGxvYyhzaXplb2YoSW5xdWlyeURhdGFfc3RydWN0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKGlucV9idWZmID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2Npc3M6IG91dCBvZiBtZW1vcnlcbiIpOwogCQlrZnJlZShzaXplX2J1ZmYpOwotICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9CisJCXJldHVybiAxOworCX0KIAotCWNjaXNzX3JlYWRfY2FwYWNpdHkoaC0+Y3RsciwgbG9ndm9sLCBzaXplX2J1ZmYsIDEsICZ0b3RhbF9zaXplLCAmYmxvY2tfc2l6ZSk7Ci0JY2Npc3NfZ2VvbWV0cnlfaW5xdWlyeShoLT5jdGxyLCBsb2d2b2wsIDEsIHRvdGFsX3NpemUsIGJsb2NrX3NpemUsIGlucV9idWZmLCBkcnYpOworCWNjaXNzX3JlYWRfY2FwYWNpdHkoaC0+Y3RsciwgbG9ndm9sLCBzaXplX2J1ZmYsIDEsICZ0b3RhbF9zaXplLAorCQkJICAgICZibG9ja19zaXplKTsKKwljY2lzc19nZW9tZXRyeV9pbnF1aXJ5KGgtPmN0bHIsIGxvZ3ZvbCwgMSwgdG90YWxfc2l6ZSwgYmxvY2tfc2l6ZSwKKwkJCSAgICAgICBpbnFfYnVmZiwgZHJ2KTsKIAogCWJsa19xdWV1ZV9oYXJkc2VjdF9zaXplKGRydi0+cXVldWUsIGRydi0+YmxvY2tfc2l6ZSk7CiAJc2V0X2NhcGFjaXR5KGRpc2ssIGRydi0+bnJfYmxvY2tzKTsKQEAgLTE5NDMsNyArMTk4NSw3IEBACiAJCWlmIChkb25lID09IEZJRk9fRU1QVFkpCiAJCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSgxKTsKIAkJZWxzZQotCQkJcmV0dXJuIChkb25lKTsKKwkJCXJldHVybiBkb25lOwogCX0KIAkvKiBJbnZhbGlkIGFkZHJlc3MgdG8gdGVsbCBjYWxsZXIgd2UgcmFuIG91dCBvZiB0aW1lICovCiAJcmV0dXJuIDE7CkBAIC0xOTUyLDI4ICsxOTk0LDI4IEBACiBzdGF0aWMgaW50IGFkZF9zZW5kY21kX3JlamVjdChfX3U4IGNtZCwgaW50IGN0bHIsIHVuc2lnbmVkIGxvbmcgY29tcGxldGUpCiB7CiAJLyogV2UgZ2V0IGluIGhlcmUgaWYgc2VuZGNtZCgpIGlzIHBvbGxpbmcgZm9yIGNvbXBsZXRpb25zCi0JICAgYW5kIGdldHMgc29tZSBjb21tYW5kIGJhY2sgdGhhdCBpdCB3YXNuJ3QgZXhwZWN0aW5nIC0tIAotCSAgIHNvbWV0aGluZyBvdGhlciB0aGFuIHRoYXQgd2hpY2ggaXQganVzdCBzZW50IGRvd24uICAKLQkgICBPcmRpbmFyaWx5LCB0aGF0IHNob3VsZG4ndCBoYXBwZW4sIGJ1dCBpdCBjYW4gaGFwcGVuIHdoZW4gCisJICAgYW5kIGdldHMgc29tZSBjb21tYW5kIGJhY2sgdGhhdCBpdCB3YXNuJ3QgZXhwZWN0aW5nIC0tCisJICAgc29tZXRoaW5nIG90aGVyIHRoYW4gdGhhdCB3aGljaCBpdCBqdXN0IHNlbnQgZG93bi4KKwkgICBPcmRpbmFyaWx5LCB0aGF0IHNob3VsZG4ndCBoYXBwZW4sIGJ1dCBpdCBjYW4gaGFwcGVuIHdoZW4KIAkgICB0aGUgc2NzaSB0YXBlIHN0dWZmIGdldHMgaW50byBlcnJvciBoYW5kbGluZyBtb2RlLCBhbmQKLQkgICBzdGFydHMgdXNpbmcgc2VuZGNtZCgpIHRvIHRyeSB0byBhYm9ydCBjb21tYW5kcyBhbmQgCisJICAgc3RhcnRzIHVzaW5nIHNlbmRjbWQoKSB0byB0cnkgdG8gYWJvcnQgY29tbWFuZHMgYW5kCiAJICAgcmVzZXQgdGFwZSBkcml2ZXMuICBJbiB0aGF0IGNhc2UsIHNlbmRjbWQgbWF5IHBpY2sgdXAKIAkgICBjb21wbGV0aW9ucyBvZiBjb21tYW5kcyB0aGF0IHdlcmUgc2VudCB0byBsb2dpY2FsIGRyaXZlcwotCSAgIHRocm91Z2ggdGhlIGJsb2NrIGkvbyBzeXN0ZW0sIG9yIGNjaXNzIGlvY3RscyBjb21wbGV0aW5nLCBldGMuIAorCSAgIHRocm91Z2ggdGhlIGJsb2NrIGkvbyBzeXN0ZW0sIG9yIGNjaXNzIGlvY3RscyBjb21wbGV0aW5nLCBldGMuCiAJICAgSW4gdGhhdCBjYXNlLCB3ZSBuZWVkIHRvIHNhdmUgdGhvc2UgY29tcGxldGlvbnMgZm9yIGxhdGVyCiAJICAgcHJvY2Vzc2luZyBieSB0aGUgaW50ZXJydXB0IGhhbmRsZXIuCi0JKi8KKwkgKi8KIAogI2lmZGVmIENPTkZJR19DSVNTX1NDU0lfVEFQRQotCXN0cnVjdCBzZW5kY21kX3JlamVjdF9saXN0ICpzcmwgPSAmaGJhW2N0bHJdLT5zY3NpX3JlamVjdHM7CQorCXN0cnVjdCBzZW5kY21kX3JlamVjdF9saXN0ICpzcmwgPSAmaGJhW2N0bHJdLT5zY3NpX3JlamVjdHM7CiAKIAkvKiBJZiBpdCdzIG5vdCB0aGUgc2NzaSB0YXBlIHN0dWZmIGRvaW5nIGVycm9yIGhhbmRsaW5nLCAoYWJvcnQgKi8KIAkvKiBvciByZXNldCkgdGhlbiB3ZSBkb24ndCBleHBlY3QgYW55dGhpbmcgd2VpcmQuICovCiAJaWYgKGNtZCAhPSBDQ0lTU19SRVNFVF9NU0cgJiYgY21kICE9IENDSVNTX0FCT1JUX01TRykgewogI2VuZGlmCi0JCXByaW50ayggS0VSTl9XQVJOSU5HICJjY2lzcyBjY2lzcyVkOiBTZW5kQ21kICIKLQkJICAgICAgIkludmFsaWQgY29tbWFuZCBsaXN0IGFkZHJlc3MgcmV0dXJuZWQhICglbHgpXG4iLAotCQkJY3RsciwgY29tcGxldGUpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJjY2lzcyBjY2lzcyVkOiBTZW5kQ21kICIKKwkJICAgICAgICJJbnZhbGlkIGNvbW1hbmQgbGlzdCBhZGRyZXNzIHJldHVybmVkISAoJWx4KVxuIiwKKwkJICAgICAgIGN0bHIsIGNvbXBsZXRlKTsKIAkJLyogbm90IG11Y2ggd2UgY2FuIGRvLiAqLwogI2lmZGVmIENPTkZJR19DSVNTX1NDU0lfVEFQRQogCQlyZXR1cm4gMTsKQEAgLTE5ODQsNyArMjAyNiw3IEBACiAJaWYgKHNybC0+bmNvbXBsZXRpb25zID49IChOUl9DTURTICsgMikpIHsKIAkJLyogVWggb2guICBObyByb29tIHRvIHNhdmUgaXQgZm9yIGxhdGVyLi4uICovCiAJCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzJWQ6IFNlbmRjbWQ6IEludmFsaWQgY29tbWFuZCBhZGRyLCAiCi0JCQkicmVqZWN0IGxpc3Qgb3ZlcmZsb3csIGNvbW1hbmQgbG9zdCFcbiIsIGN0bHIpOworCQkgICAgICAgInJlamVjdCBsaXN0IG92ZXJmbG93LCBjb21tYW5kIGxvc3QhXG4iLCBjdGxyKTsKIAkJcmV0dXJuIDE7CiAJfQogCS8qIFNhdmUgaXQgZm9yIGxhdGVyICovCkBAIC0xOTk1LDM0MCArMjAzNywzMjcgQEAKIH0KIAogLyoKLSAqIFNlbmQgYSBjb21tYW5kIHRvIHRoZSBjb250cm9sbGVyLCBhbmQgd2FpdCBmb3IgaXQgdG8gY29tcGxldGUuICAKLSAqIE9ubHkgdXNlZCBhdCBpbml0IHRpbWUuIAorICogU2VuZCBhIGNvbW1hbmQgdG8gdGhlIGNvbnRyb2xsZXIsIGFuZCB3YWl0IGZvciBpdCB0byBjb21wbGV0ZS4KKyAqIE9ubHkgdXNlZCBhdCBpbml0IHRpbWUuCiAgKi8KLXN0YXRpYyBpbnQgc2VuZGNtZCgKLQlfX3U4CWNtZCwKLQlpbnQJY3RsciwKLQl2b2lkCSpidWZmLAotCXNpemVfdAlzaXplLAotCXVuc2lnbmVkIGludCB1c2VfdW5pdF9udW0sIC8qIDA6IGFkZHJlc3MgdGhlIGNvbnRyb2xsZXIsCi0JCQkJICAgICAgMTogYWRkcmVzcyBsb2dpY2FsIHZvbHVtZSBsb2dfdW5pdCwgCi0JCQkJICAgICAgMjogcGVyaXBoIGRldmljZSBhZGRyZXNzIGlzIHNjc2kzYWRkciAqLwotCXVuc2lnbmVkIGludCBsb2dfdW5pdCwKLQlfX3U4CXBhZ2VfY29kZSwKLQl1bnNpZ25lZCBjaGFyICpzY3NpM2FkZHIsCi0JaW50IGNtZF90eXBlKQorc3RhdGljIGludCBzZW5kY21kKF9fdTggY21kLCBpbnQgY3Rsciwgdm9pZCAqYnVmZiwgc2l6ZV90IHNpemUsIHVuc2lnbmVkIGludCB1c2VfdW5pdF9udW0sCS8qIDA6IGFkZHJlc3MgdGhlIGNvbnRyb2xsZXIsCisJCQkJCQkJCQkJCQkgICAxOiBhZGRyZXNzIGxvZ2ljYWwgdm9sdW1lIGxvZ191bml0LAorCQkJCQkJCQkJCQkJICAgMjogcGVyaXBoIGRldmljZSBhZGRyZXNzIGlzIHNjc2kzYWRkciAqLworCQkgICB1bnNpZ25lZCBpbnQgbG9nX3VuaXQsCisJCSAgIF9fdTggcGFnZV9jb2RlLCB1bnNpZ25lZCBjaGFyICpzY3NpM2FkZHIsIGludCBjbWRfdHlwZSkKIHsKIAlDb21tYW5kTGlzdF9zdHJ1Y3QgKmM7CiAJaW50IGk7CiAJdW5zaWduZWQgbG9uZyBjb21wbGV0ZTsKLQljdGxyX2luZm9fdCAqaW5mb19wPSBoYmFbY3Rscl07CisJY3Rscl9pbmZvX3QgKmluZm9fcCA9IGhiYVtjdGxyXTsKIAl1NjRiaXQgYnVmZl9kbWFfaGFuZGxlOwogCWludCBzdGF0dXMsIGRvbmUgPSAwOwogCiAJaWYgKChjID0gY21kX2FsbG9jKGluZm9fcCwgMSkpID09IE5VTEwpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2Npc3M6IHVuYWJsZSB0byBnZXQgbWVtb3J5Iik7Ci0JCXJldHVybihJT19FUlJPUik7CisJCXJldHVybiBJT19FUlJPUjsKIAl9CiAJc3RhdHVzID0gZmlsbF9jbWQoYywgY21kLCBjdGxyLCBidWZmLCBzaXplLCB1c2VfdW5pdF9udW0sCi0JCWxvZ191bml0LCBwYWdlX2NvZGUsIHNjc2kzYWRkciwgY21kX3R5cGUpOworCQkJICBsb2dfdW5pdCwgcGFnZV9jb2RlLCBzY3NpM2FkZHIsIGNtZF90eXBlKTsKIAlpZiAoc3RhdHVzICE9IElPX09LKSB7CiAJCWNtZF9mcmVlKGluZm9fcCwgYywgMSk7CiAJCXJldHVybiBzdGF0dXM7CiAJfQotcmVzZW5kX2NtZDE6CisgICAgICByZXNlbmRfY21kMToKIAkvKgotICAgICAgICAgKiBEaXNhYmxlIGludGVycnVwdAotICAgICAgICAgKi8KKwkgKiBEaXNhYmxlIGludGVycnVwdAorCSAqLwogI2lmZGVmIENDSVNTX0RFQlVHCiAJcHJpbnRrKEtFUk5fREVCVUcgImNjaXNzOiB0dXJuaW5nIGludHIgb2ZmXG4iKTsKLSNlbmRpZiAvKiBDQ0lTU19ERUJVRyAqLyAKLSAgICAgICAgaW5mb19wLT5hY2Nlc3Muc2V0X2ludHJfbWFzayhpbmZvX3AsIENDSVNTX0lOVFJfT0ZGKTsKLQkKKyNlbmRpZgkJCQkvKiBDQ0lTU19ERUJVRyAqLworCWluZm9fcC0+YWNjZXNzLnNldF9pbnRyX21hc2soaW5mb19wLCBDQ0lTU19JTlRSX09GRik7CisKIAkvKiBNYWtlIHN1cmUgdGhlcmUgaXMgcm9vbSBpbiB0aGUgY29tbWFuZCBGSUZPICovCi0gICAgICAgIC8qIEFjdHVhbGx5IGl0IHNob3VsZCBiZSBjb21wbGV0ZWx5IGVtcHR5IGF0IHRoaXMgdGltZSAqLworCS8qIEFjdHVhbGx5IGl0IHNob3VsZCBiZSBjb21wbGV0ZWx5IGVtcHR5IGF0IHRoaXMgdGltZSAqLwogCS8qIHVubGVzcyB3ZSBhcmUgaW4gaGVyZSBkb2luZyBlcnJvciBoYW5kbGluZyBmb3IgdGhlIHNjc2kgKi8KIAkvKiB0YXBlIHNpZGUgb2YgdGhlIGRyaXZlci4gKi8KLSAgICAgICAgZm9yIChpID0gMjAwMDAwOyBpID4gMDsgaS0tKSAKLQl7CisJZm9yIChpID0gMjAwMDAwOyBpID4gMDsgaS0tKSB7CiAJCS8qIGlmIGZpZm8gaXNuJ3QgZnVsbCBnbyAqLwotICAgICAgICAgICAgICAgIGlmICghKGluZm9fcC0+YWNjZXNzLmZpZm9fZnVsbChpbmZvX3ApKSkgCi0JCXsKLQkJCQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHVkZWxheSgxMCk7Ci0gICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiY2Npc3MgY2Npc3MlZDogU2VuZENtZCBGSUZPIGZ1bGwsIgotICAgICAgICAgICAgICAgICAgICAgICAgIiB3YWl0aW5nIVxuIiwgY3Rscik7Ci0gICAgICAgIH0KLSAgICAgICAgLyoKLSAgICAgICAgICogU2VuZCB0aGUgY21kCi0gICAgICAgICAqLwotICAgICAgICBpbmZvX3AtPmFjY2Vzcy5zdWJtaXRfY29tbWFuZChpbmZvX3AsIGMpOworCQlpZiAoIShpbmZvX3AtPmFjY2Vzcy5maWZvX2Z1bGwoaW5mb19wKSkpIHsKKworCQkJYnJlYWs7CisJCX0KKwkJdWRlbGF5KDEwKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2Npc3MgY2Npc3MlZDogU2VuZENtZCBGSUZPIGZ1bGwsIgorCQkgICAgICAgIiB3YWl0aW5nIVxuIiwgY3Rscik7CisJfQorCS8qCisJICogU2VuZCB0aGUgY21kCisJICovCisJaW5mb19wLT5hY2Nlc3Muc3VibWl0X2NvbW1hbmQoaW5mb19wLCBjKTsKIAlkb25lID0gMDsKIAlkbyB7CiAJCWNvbXBsZXRlID0gcG9sbGNvbXBsZXRlKGN0bHIpOwogCiAjaWZkZWYgQ0NJU1NfREVCVUcKIAkJcHJpbnRrKEtFUk5fREVCVUcgImNjaXNzOiBjb21tYW5kIGNvbXBsZXRlZFxuIik7Ci0jZW5kaWYgLyogQ0NJU1NfREVCVUcgKi8KKyNlbmRpZgkJCQkvKiBDQ0lTU19ERUJVRyAqLwogCiAJCWlmIChjb21wbGV0ZSA9PSAxKSB7Ci0JCQlwcmludGsoIEtFUk5fV0FSTklORwotCQkJCSJjY2lzcyBjY2lzcyVkOiBTZW5kQ21kIFRpbWVvdXQgb3V0LCAiCi0JCQkJIk5vIGNvbW1hbmQgbGlzdCBhZGRyZXNzIHJldHVybmVkIVxuIiwKLQkJCQljdGxyKTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSAgICAgICAiY2Npc3MgY2Npc3MlZDogU2VuZENtZCBUaW1lb3V0IG91dCwgIgorCQkJICAgICAgICJObyBjb21tYW5kIGxpc3QgYWRkcmVzcyByZXR1cm5lZCFcbiIsIGN0bHIpOwogCQkJc3RhdHVzID0gSU9fRVJST1I7CiAJCQlkb25lID0gMTsKIAkJCWJyZWFrOwogCQl9CiAKIAkJLyogVGhpcyB3aWxsIG5lZWQgdG8gY2hhbmdlIGZvciBkaXJlY3QgbG9va3VwIGNvbXBsZXRpb25zICovCi0JCWlmICggKGNvbXBsZXRlICYgQ0lTU19FUlJPUl9CSVQpCi0JCSAgICAgJiYgKGNvbXBsZXRlICYgfkNJU1NfRVJST1JfQklUKSA9PSBjLT5idXNhZGRyKQotCQkgICAgIHsKLQkJCS8qIGlmIGRhdGEgb3ZlcnJ1biBvciB1bmRlcnVuIG9uIFJlcG9ydCBjb21tYW5kIAotCQkJCWlnbm9yZSBpdCAKLQkJCSovCisJCWlmICgoY29tcGxldGUgJiBDSVNTX0VSUk9SX0JJVCkKKwkJICAgICYmIChjb21wbGV0ZSAmIH5DSVNTX0VSUk9SX0JJVCkgPT0gYy0+YnVzYWRkcikgeworCQkJLyogaWYgZGF0YSBvdmVycnVuIG9yIHVuZGVydW4gb24gUmVwb3J0IGNvbW1hbmQKKwkJCSAgIGlnbm9yZSBpdAorCQkJICovCiAJCQlpZiAoKChjLT5SZXF1ZXN0LkNEQlswXSA9PSBDSVNTX1JFUE9SVF9MT0cpIHx8CiAJCQkgICAgIChjLT5SZXF1ZXN0LkNEQlswXSA9PSBDSVNTX1JFUE9SVF9QSFlTKSB8fAogCQkJICAgICAoYy0+UmVxdWVzdC5DREJbMF0gPT0gQ0lTU19JTlFVSVJZKSkgJiYKLQkJCQkoKGMtPmVycl9pbmZvLT5Db21tYW5kU3RhdHVzID09IAotCQkJCQlDTURfREFUQV9PVkVSUlVOKSB8fCAKLQkJCQkgKGMtPmVycl9pbmZvLT5Db21tYW5kU3RhdHVzID09IAotCQkJCQlDTURfREFUQV9VTkRFUlJVTikKLQkJCSAJKSkKLQkJCXsKKwkJCSAgICAoKGMtPmVycl9pbmZvLT5Db21tYW5kU3RhdHVzID09CisJCQkgICAgICBDTURfREFUQV9PVkVSUlVOKSB8fAorCQkJICAgICAoYy0+ZXJyX2luZm8tPkNvbW1hbmRTdGF0dXMgPT0gQ01EX0RBVEFfVU5ERVJSVU4pCisJCQkgICAgKSkgewogCQkJCWNvbXBsZXRlID0gYy0+YnVzYWRkcjsKIAkJCX0gZWxzZSB7CiAJCQkJaWYgKGMtPmVycl9pbmZvLT5Db21tYW5kU3RhdHVzID09Ci0JCQkJCQlDTURfVU5TT0xJQ0lURURfQUJPUlQpIHsKKwkJCQkgICAgQ01EX1VOU09MSUNJVEVEX0FCT1JUKSB7CiAJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzJWQ6ICIKLQkJCQkJCSJ1bnNvbGljaXRlZCBhYm9ydCAlcFxuIiwKLQkJCQkJCWN0bHIsIGMpOworCQkJCQkgICAgICAgInVuc29saWNpdGVkIGFib3J0ICVwXG4iLAorCQkJCQkgICAgICAgY3RsciwgYyk7CiAJCQkJCWlmIChjLT5yZXRyeV9jb3VudCA8IE1BWF9DTURfUkVUUklFUykgewogCQkJCQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkJCQkJICAgImNjaXNzJWQ6IHJldHJ5aW5nICVwXG4iLAotCQkJCQkJICAgY3RsciwgYyk7CisJCQkJCQkgICAgICAgImNjaXNzJWQ6IHJldHJ5aW5nICVwXG4iLAorCQkJCQkJICAgICAgIGN0bHIsIGMpOwogCQkJCQkJYy0+cmV0cnlfY291bnQrKzsKIAkJCQkJCS8qIGVyYXNlIHRoZSBvbGQgZXJyb3IgKi8KIAkJCQkJCS8qIGluZm9ybWF0aW9uICovCiAJCQkJCQltZW1zZXQoYy0+ZXJyX2luZm8sIDAsCi0JCQkJCQkgICBzaXplb2YoRXJyb3JJbmZvX3N0cnVjdCkpOworCQkJCQkJICAgICAgIHNpemVvZgorCQkJCQkJICAgICAgIChFcnJvckluZm9fc3RydWN0KSk7CiAJCQkJCQlnb3RvIHJlc2VuZF9jbWQxOwogCQkJCQl9IGVsc2UgewogCQkJCQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkJCQkJICAgImNjaXNzJWQ6IHJldHJpZWQgJXAgdG9vICIKLQkJCQkJCSAgICJtYW55IHRpbWVzXG4iLCBjdGxyLCBjKTsKKwkJCQkJCSAgICAgICAiY2Npc3MlZDogcmV0cmllZCAlcCB0b28gIgorCQkJCQkJICAgICAgICJtYW55IHRpbWVzXG4iLCBjdGxyLCBjKTsKIAkJCQkJCXN0YXR1cyA9IElPX0VSUk9SOwogCQkJCQkJZ290byBjbGVhbnVwMTsKIAkJCQkJfQotCQkJCX0gZWxzZSBpZiAoYy0+ZXJyX2luZm8tPkNvbW1hbmRTdGF0dXMgPT0gQ01EX1VOQUJPUlRBQkxFKSB7Ci0JCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzJWQ6IGNvbW1hbmQgY291bGQgbm90IGJlIGFib3J0ZWQuXG4iLCBjdGxyKTsKKwkJCQl9IGVsc2UgaWYgKGMtPmVycl9pbmZvLT5Db21tYW5kU3RhdHVzID09CisJCQkJCSAgIENNRF9VTkFCT1JUQUJMRSkgeworCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJCSAgICAgICAiY2Npc3MlZDogY29tbWFuZCBjb3VsZCBub3QgYmUgYWJvcnRlZC5cbiIsCisJCQkJCSAgICAgICBjdGxyKTsKIAkJCQkJc3RhdHVzID0gSU9fRVJST1I7CiAJCQkJCWdvdG8gY2xlYW51cDE7CiAJCQkJfQogCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImNpc3MgY2lzcyVkOiBzZW5kY21kIgotCQkJCSIgRXJyb3IgJXggXG4iLCBjdGxyLCAKLQkJCQkJYy0+ZXJyX2luZm8tPkNvbW1hbmRTdGF0dXMpOyAKKwkJCQkgICAgICAgIiBFcnJvciAleCBcbiIsIGN0bHIsCisJCQkJICAgICAgIGMtPmVycl9pbmZvLT5Db21tYW5kU3RhdHVzKTsKIAkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJjaXNzIGNpc3MlZDogc2VuZGNtZCIKLQkJCQkiIG9mZmVuc2l2ZSBpbmZvXG4iCi0JCQkJIiAgc2l6ZSAleFxuICAgbnVtICV4ICAgdmFsdWUgJXhcbiIsIGN0bHIsCi0JCQkJICBjLT5lcnJfaW5mby0+TW9yZUVyckluZm8uSW52YWxpZF9DbWQub2ZmZW5zZV9zaXplLAotCQkJCSAgYy0+ZXJyX2luZm8tPk1vcmVFcnJJbmZvLkludmFsaWRfQ21kLm9mZmVuc2VfbnVtLAotCQkJCSAgYy0+ZXJyX2luZm8tPk1vcmVFcnJJbmZvLkludmFsaWRfQ21kLm9mZmVuc2VfdmFsdWUpOworCQkJCSAgICAgICAiIG9mZmVuc2l2ZSBpbmZvXG4iCisJCQkJICAgICAgICIgIHNpemUgJXhcbiAgIG51bSAleCAgIHZhbHVlICV4XG4iLAorCQkJCSAgICAgICBjdGxyLAorCQkJCSAgICAgICBjLT5lcnJfaW5mby0+TW9yZUVyckluZm8uSW52YWxpZF9DbWQuCisJCQkJICAgICAgIG9mZmVuc2Vfc2l6ZSwKKwkJCQkgICAgICAgYy0+ZXJyX2luZm8tPk1vcmVFcnJJbmZvLkludmFsaWRfQ21kLgorCQkJCSAgICAgICBvZmZlbnNlX251bSwKKwkJCQkgICAgICAgYy0+ZXJyX2luZm8tPk1vcmVFcnJJbmZvLkludmFsaWRfQ21kLgorCQkJCSAgICAgICBvZmZlbnNlX3ZhbHVlKTsKIAkJCQlzdGF0dXMgPSBJT19FUlJPUjsKIAkJCQlnb3RvIGNsZWFudXAxOwogCQkJfQogCQl9CiAJCS8qIFRoaXMgd2lsbCBuZWVkIGNoYW5naW5nIGZvciBkaXJlY3QgbG9va3VwIGNvbXBsZXRpb25zICovCi0gICAgICAgICAgICAgICAgaWYgKGNvbXBsZXRlICE9IGMtPmJ1c2FkZHIpIHsKKwkJaWYgKGNvbXBsZXRlICE9IGMtPmJ1c2FkZHIpIHsKIAkJCWlmIChhZGRfc2VuZGNtZF9yZWplY3QoY21kLCBjdGxyLCBjb21wbGV0ZSkgIT0gMCkgewotCQkJCUJVRygpOyAvKiB3ZSBhcmUgcHJldHR5IG11Y2ggaG9zZWQgaWYgd2UgZ2V0IGhlcmUuICovCisJCQkJQlVHKCk7CS8qIHdlIGFyZSBwcmV0dHkgbXVjaCBob3NlZCBpZiB3ZSBnZXQgaGVyZS4gKi8KIAkJCX0KIAkJCWNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0gZWxzZQorCQl9IGVsc2UKIAkJCWRvbmUgPSAxOwotICAgICAgICB9IHdoaWxlICghZG9uZSk7Ci0JCQotY2xlYW51cDE6CQorCX0gd2hpbGUgKCFkb25lKTsKKworICAgICAgY2xlYW51cDE6CiAJLyogdW5sb2NrIHRoZSBkYXRhIGJ1ZmZlciBmcm9tIERNQSAqLwogCWJ1ZmZfZG1hX2hhbmRsZS52YWwzMi5sb3dlciA9IGMtPlNHWzBdLkFkZHIubG93ZXI7CiAJYnVmZl9kbWFfaGFuZGxlLnZhbDMyLnVwcGVyID0gYy0+U0dbMF0uQWRkci51cHBlcjsKIAlwY2lfdW5tYXBfc2luZ2xlKGluZm9fcC0+cGRldiwgKGRtYV9hZGRyX3QpIGJ1ZmZfZG1hX2hhbmRsZS52YWwsCi0JCQkJYy0+U0dbMF0uTGVuLCBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOworCQkJIGMtPlNHWzBdLkxlbiwgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKICNpZmRlZiBDT05GSUdfQ0lTU19TQ1NJX1RBUEUKIAkvKiBpZiB3ZSBzYXZlZCBzb21lIGNvbW1hbmRzIGZvciBsYXRlciwgcHJvY2VzcyB0aGVtIG5vdy4gKi8KIAlpZiAoaW5mb19wLT5zY3NpX3JlamVjdHMubmNvbXBsZXRpb25zID4gMCkKIAkJZG9fY2Npc3NfaW50cigwLCBpbmZvX3AsIE5VTEwpOwogI2VuZGlmCiAJY21kX2ZyZWUoaW5mb19wLCBjLCAxKTsKLQlyZXR1cm4gKHN0YXR1cyk7Ci19IAorCXJldHVybiBzdGF0dXM7Cit9CisKIC8qCiAgKiBNYXAgKHBoeXNpY2FsKSBQQ0kgbWVtIGludG8gKHZpcnR1YWwpIGtlcm5lbCBzcGFjZQogICovCiBzdGF0aWMgdm9pZCBfX2lvbWVtICpyZW1hcF9wY2lfbWVtKHVsb25nIGJhc2UsIHVsb25nIHNpemUpCiB7Ci0gICAgICAgIHVsb25nIHBhZ2VfYmFzZSAgICAgICAgPSAoKHVsb25nKSBiYXNlKSAmIFBBR0VfTUFTSzsKLSAgICAgICAgdWxvbmcgcGFnZV9vZmZzICAgICAgICA9ICgodWxvbmcpIGJhc2UpIC0gcGFnZV9iYXNlOwotICAgICAgICB2b2lkIF9faW9tZW0gKnBhZ2VfcmVtYXBwZWQgPSBpb3JlbWFwKHBhZ2VfYmFzZSwgcGFnZV9vZmZzK3NpemUpOworCXVsb25nIHBhZ2VfYmFzZSA9ICgodWxvbmcpIGJhc2UpICYgUEFHRV9NQVNLOworCXVsb25nIHBhZ2Vfb2ZmcyA9ICgodWxvbmcpIGJhc2UpIC0gcGFnZV9iYXNlOworCXZvaWQgX19pb21lbSAqcGFnZV9yZW1hcHBlZCA9IGlvcmVtYXAocGFnZV9iYXNlLCBwYWdlX29mZnMgKyBzaXplKTsKIAotICAgICAgICByZXR1cm4gcGFnZV9yZW1hcHBlZCA/IChwYWdlX3JlbWFwcGVkICsgcGFnZV9vZmZzKSA6IE5VTEw7CisJcmV0dXJuIHBhZ2VfcmVtYXBwZWQgPyAocGFnZV9yZW1hcHBlZCArIHBhZ2Vfb2ZmcykgOiBOVUxMOwogfQogCi0vKiAKLSAqIFRha2VzIGpvYnMgb2YgdGhlIFEgYW5kIHNlbmRzIHRoZW0gdG8gdGhlIGhhcmR3YXJlLCB0aGVuIHB1dHMgaXQgb24gCi0gKiB0aGUgUSB0byB3YWl0IGZvciBjb21wbGV0aW9uLiAKLSAqLyAKLXN0YXRpYyB2b2lkIHN0YXJ0X2lvKCBjdGxyX2luZm9fdCAqaCkKKy8qCisgKiBUYWtlcyBqb2JzIG9mIHRoZSBRIGFuZCBzZW5kcyB0aGVtIHRvIHRoZSBoYXJkd2FyZSwgdGhlbiBwdXRzIGl0IG9uCisgKiB0aGUgUSB0byB3YWl0IGZvciBjb21wbGV0aW9uLgorICovCitzdGF0aWMgdm9pZCBzdGFydF9pbyhjdGxyX2luZm9fdCAqaCkKIHsKIAlDb21tYW5kTGlzdF9zdHJ1Y3QgKmM7Ci0JCi0Jd2hpbGUoKCBjID0gaC0+cmVxUSkgIT0gTlVMTCApCi0JeworCisJd2hpbGUgKChjID0gaC0+cmVxUSkgIT0gTlVMTCkgewogCQkvKiBjYW4ndCBkbyBhbnl0aGluZyBpZiBmaWZvIGlzIGZ1bGwgKi8KIAkJaWYgKChoLT5hY2Nlc3MuZmlmb19mdWxsKGgpKSkgewogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2Npc3M6IGZpZm8gZnVsbFxuIik7CiAJCQlicmVhazsKIAkJfQogCi0JCS8qIEdldCB0aGUgZmlyc3QgZW50cnkgZnJvbSB0aGUgUmVxdWVzdCBRICovIAorCQkvKiBHZXQgdGhlIGZpcnN0IGVudHJ5IGZyb20gdGhlIFJlcXVlc3QgUSAqLwogCQlyZW1vdmVRKCYoaC0+cmVxUSksIGMpOwogCQloLT5RZGVwdGgtLTsKLQkKLQkJLyogVGVsbCB0aGUgY29udHJvbGxlciBleGVjdXRlIGNvbW1hbmQgKi8gCisKKwkJLyogVGVsbCB0aGUgY29udHJvbGxlciBleGVjdXRlIGNvbW1hbmQgKi8KIAkJaC0+YWNjZXNzLnN1Ym1pdF9jb21tYW5kKGgsIGMpOwotCQkKLQkJLyogUHV0IGpvYiBvbnRvIHRoZSBjb21wbGV0ZWQgUSAqLyAKLQkJYWRkUSAoJihoLT5jbXBRKSwgYyk7IAorCisJCS8qIFB1dCBqb2Igb250byB0aGUgY29tcGxldGVkIFEgKi8KKwkJYWRkUSgmKGgtPmNtcFEpLCBjKTsKIAl9CiB9CisKIC8qIEFzc3VtZXMgdGhhdCBDQ0lTU19MT0NLKGgtPmN0bHIpIGlzIGhlbGQuICovCiAvKiBaZXJvcyBvdXQgdGhlIGVycm9yIHJlY29yZCBhbmQgdGhlbiByZXNlbmRzIHRoZSBjb21tYW5kIGJhY2sgKi8KIC8qIHRvIHRoZSBjb250cm9sbGVyICovCi1zdGF0aWMgaW5saW5lIHZvaWQgcmVzZW5kX2NjaXNzX2NtZCggY3Rscl9pbmZvX3QgKmgsIENvbW1hbmRMaXN0X3N0cnVjdCAqYykKK3N0YXRpYyBpbmxpbmUgdm9pZCByZXNlbmRfY2Npc3NfY21kKGN0bHJfaW5mb190ICpoLCBDb21tYW5kTGlzdF9zdHJ1Y3QgKmMpCiB7CiAJLyogZXJhc2UgdGhlIG9sZCBlcnJvciBpbmZvcm1hdGlvbiAqLwogCW1lbXNldChjLT5lcnJfaW5mbywgMCwgc2l6ZW9mKEVycm9ySW5mb19zdHJ1Y3QpKTsKIAogCS8qIGFkZCBpdCB0byBzb2Z0d2FyZSBxdWV1ZSBhbmQgdGhlbiBzZW5kIGl0IHRvIHRoZSBjb250cm9sbGVyICovCi0JYWRkUSgmKGgtPnJlcVEpLGMpOworCWFkZFEoJihoLT5yZXFRKSwgYyk7CiAJaC0+UWRlcHRoKys7Ci0JaWYoaC0+UWRlcHRoID4gaC0+bWF4UXNpbmNlaW5pdCkKKwlpZiAoaC0+UWRlcHRoID4gaC0+bWF4UXNpbmNlaW5pdCkKIAkJaC0+bWF4UXNpbmNlaW5pdCA9IGgtPlFkZXB0aDsKIAogCXN0YXJ0X2lvKGgpOwogfQogCi0vKiBjaGVja3MgdGhlIHN0YXR1cyBvZiB0aGUgam9iIGFuZCBjYWxscyBjb21wbGV0ZSBidWZmZXJzIHRvIG1hcmsgYWxsIAorLyogY2hlY2tzIHRoZSBzdGF0dXMgb2YgdGhlIGpvYiBhbmQgY2FsbHMgY29tcGxldGUgYnVmZmVycyB0byBtYXJrIGFsbAogICogYnVmZmVycyBmb3IgdGhlIGNvbXBsZXRlZCBqb2IuIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IG5lZWQKICAqIHRvIGhvbGQgdGhlIGhiYS9xdWV1ZSBsb2NrLgotICovIAotc3RhdGljIGlubGluZSB2b2lkIGNvbXBsZXRlX2NvbW1hbmQoIGN0bHJfaW5mb190ICpoLCBDb21tYW5kTGlzdF9zdHJ1Y3QgKmNtZCwKLQkJaW50IHRpbWVvdXQpCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBjb21wbGV0ZV9jb21tYW5kKGN0bHJfaW5mb190ICpoLCBDb21tYW5kTGlzdF9zdHJ1Y3QgKmNtZCwKKwkJCQkgICAgaW50IHRpbWVvdXQpCiB7CiAJaW50IHN0YXR1cyA9IDE7CiAJaW50IHJldHJ5X2NtZCA9IDA7Ci0JCQotCWlmICh0aW1lb3V0KQotCQlzdGF0dXMgPSAwOyAKIAotCWlmKGNtZC0+ZXJyX2luZm8tPkNvbW1hbmRTdGF0dXMgIT0gMCkgCi0JeyAvKiBhbiBlcnJvciBoYXMgb2NjdXJyZWQgKi8gCi0JCXN3aXRjaChjbWQtPmVycl9pbmZvLT5Db21tYW5kU3RhdHVzKQotCQl7CisJaWYgKHRpbWVvdXQpCisJCXN0YXR1cyA9IDA7CisKKwlpZiAoY21kLT5lcnJfaW5mby0+Q29tbWFuZFN0YXR1cyAhPSAwKSB7CS8qIGFuIGVycm9yIGhhcyBvY2N1cnJlZCAqLworCQlzd2l0Y2ggKGNtZC0+ZXJyX2luZm8tPkNvbW1hbmRTdGF0dXMpIHsKIAkJCXVuc2lnbmVkIGNoYXIgc2Vuc2Vfa2V5OwotCQkJY2FzZSBDTURfVEFSR0VUX1NUQVRVUzoKLQkJCQlzdGF0dXMgPSAwOwotCQkJCi0JCQkJaWYoIGNtZC0+ZXJyX2luZm8tPlNjc2lTdGF0dXMgPT0gMHgwMikKLQkJCQl7Ci0JCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzOiBjbWQgJXAgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkiaGFzIENIRUNLIENPTkRJVElPTiAiCi0JCQkJCQkiIGJ5dGUgMiA9IDB4JXhcbiIsIGNtZCwKLQkJCQkJCWNtZC0+ZXJyX2luZm8tPlNlbnNlSW5mb1syXQotCQkJCQkpOwotCQkJCQkvKiBjaGVjayB0aGUgc2Vuc2Uga2V5ICovCi0JCQkJCXNlbnNlX2tleSA9IDB4ZiAmIAotCQkJCQkJY21kLT5lcnJfaW5mby0+U2Vuc2VJbmZvWzJdOwotCQkJCQkvKiBubyBzdGF0dXMgb3IgcmVjb3ZlcmVkIGVycm9yICovCi0JCQkJCWlmKChzZW5zZV9rZXkgPT0gMHgwKSB8fAotCQkJCQkgICAgKHNlbnNlX2tleSA9PSAweDEpKQotCQkJCQl7Ci0JCQkJCQkJc3RhdHVzID0gMTsKLQkJCQkJfQotCQkJCX0gZWxzZQotCQkJCXsKLQkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2Npc3M6IGNtZCAlcCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGFzIFNDU0kgU3RhdHVzIDB4JXhcbiIsCi0JCQkJCQljbWQsIGNtZC0+ZXJyX2luZm8tPlNjc2lTdGF0dXMpOworCQljYXNlIENNRF9UQVJHRVRfU1RBVFVTOgorCQkJc3RhdHVzID0gMDsKKworCQkJaWYgKGNtZC0+ZXJyX2luZm8tPlNjc2lTdGF0dXMgPT0gMHgwMikgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzOiBjbWQgJXAgIgorCQkJCSAgICAgICAiaGFzIENIRUNLIENPTkRJVElPTiAiCisJCQkJICAgICAgICIgYnl0ZSAyID0gMHgleFxuIiwgY21kLAorCQkJCSAgICAgICBjbWQtPmVycl9pbmZvLT5TZW5zZUluZm9bMl0KKwkJCQkgICAgKTsKKwkJCQkvKiBjaGVjayB0aGUgc2Vuc2Uga2V5ICovCisJCQkJc2Vuc2Vfa2V5ID0gMHhmICYgY21kLT5lcnJfaW5mby0+U2Vuc2VJbmZvWzJdOworCQkJCS8qIG5vIHN0YXR1cyBvciByZWNvdmVyZWQgZXJyb3IgKi8KKwkJCQlpZiAoKHNlbnNlX2tleSA9PSAweDApIHx8IChzZW5zZV9rZXkgPT0gMHgxKSkgeworCQkJCQlzdGF0dXMgPSAxOwogCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2Npc3M6IGNtZCAlcCAiCisJCQkJICAgICAgICJoYXMgU0NTSSBTdGF0dXMgMHgleFxuIiwKKwkJCQkgICAgICAgY21kLCBjbWQtPmVycl9pbmZvLT5TY3NpU3RhdHVzKTsKKwkJCX0KIAkJCWJyZWFrOwotCQkJY2FzZSBDTURfREFUQV9VTkRFUlJVTjoKLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJjY2lzczogY21kICVwIGhhcyIKLQkJCQkJIiBjb21wbGV0ZWQgd2l0aCBkYXRhIHVuZGVycnVuICIKLQkJCQkJInJlcG9ydGVkXG4iLCBjbWQpOworCQljYXNlIENNRF9EQVRBX1VOREVSUlVOOgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2Npc3M6IGNtZCAlcCBoYXMiCisJCQkgICAgICAgIiBjb21wbGV0ZWQgd2l0aCBkYXRhIHVuZGVycnVuICIKKwkJCSAgICAgICAicmVwb3J0ZWRcbiIsIGNtZCk7CiAJCQlicmVhazsKLQkJCWNhc2UgQ01EX0RBVEFfT1ZFUlJVTjoKLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJjY2lzczogY21kICVwIGhhcyIKLQkJCQkJIiBjb21wbGV0ZWQgd2l0aCBkYXRhIG92ZXJydW4gIgotCQkJCQkicmVwb3J0ZWRcbiIsIGNtZCk7CisJCWNhc2UgQ01EX0RBVEFfT1ZFUlJVTjoKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzOiBjbWQgJXAgaGFzIgorCQkJICAgICAgICIgY29tcGxldGVkIHdpdGggZGF0YSBvdmVycnVuICIKKwkJCSAgICAgICAicmVwb3J0ZWRcbiIsIGNtZCk7CiAJCQlicmVhazsKLQkJCWNhc2UgQ01EX0lOVkFMSUQ6Ci0JCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2Npc3M6IGNtZCAlcCBpcyAiCi0JCQkJCSJyZXBvcnRlZCBpbnZhbGlkXG4iLCBjbWQpOwotCQkJCXN0YXR1cyA9IDA7CisJCWNhc2UgQ01EX0lOVkFMSUQ6CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJjY2lzczogY21kICVwIGlzICIKKwkJCSAgICAgICAicmVwb3J0ZWQgaW52YWxpZFxuIiwgY21kKTsKKwkJCXN0YXR1cyA9IDA7CiAJCQlicmVhazsKLQkJCWNhc2UgQ01EX1BST1RPQ09MX0VSUjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiY2Npc3M6IGNtZCAlcCBoYXMgIgotCQkJCQkicHJvdG9jb2wgZXJyb3IgXG4iLCBjbWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0JCQljYXNlIENNRF9IQVJEV0FSRV9FUlI6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzOiBjbWQgJXAgaGFkICIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBoYXJkd2FyZSBlcnJvclxuIiwgY21kKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCQkJY2FzZSBDTURfQ09OTkVDVElPTl9MT1NUOgotCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzOiBjbWQgJXAgaGFkICIKLQkJCQkJImNvbm5lY3Rpb24gbG9zdFxuIiwgY21kKTsKLQkJCQlzdGF0dXM9MDsKKwkJY2FzZSBDTURfUFJPVE9DT0xfRVJSOgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2Npc3M6IGNtZCAlcCBoYXMgIgorCQkJICAgICAgICJwcm90b2NvbCBlcnJvciBcbiIsIGNtZCk7CisJCQlzdGF0dXMgPSAwOwogCQkJYnJlYWs7Ci0JCQljYXNlIENNRF9BQk9SVEVEOgotCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzOiBjbWQgJXAgd2FzICIKLQkJCQkJImFib3J0ZWRcbiIsIGNtZCk7Ci0JCQkJc3RhdHVzPTA7CisJCWNhc2UgQ01EX0hBUkRXQVJFX0VSUjoKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzOiBjbWQgJXAgaGFkICIKKwkJCSAgICAgICAiIGhhcmR3YXJlIGVycm9yXG4iLCBjbWQpOworCQkJc3RhdHVzID0gMDsKIAkJCWJyZWFrOwotCQkJY2FzZSBDTURfQUJPUlRfRkFJTEVEOgotCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzOiBjbWQgJXAgcmVwb3J0cyAiCi0JCQkJCSJhYm9ydCBmYWlsZWRcbiIsIGNtZCk7Ci0JCQkJc3RhdHVzPTA7CisJCWNhc2UgQ01EX0NPTk5FQ1RJT05fTE9TVDoKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzOiBjbWQgJXAgaGFkICIKKwkJCSAgICAgICAiY29ubmVjdGlvbiBsb3N0XG4iLCBjbWQpOworCQkJc3RhdHVzID0gMDsKIAkJCWJyZWFrOwotCQkJY2FzZSBDTURfVU5TT0xJQ0lURURfQUJPUlQ6Ci0JCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2Npc3MlZDogdW5zb2xpY2l0ZWQgIgotCQkJCQkiYWJvcnQgJXBcbiIsIGgtPmN0bHIsIGNtZCk7Ci0JCQkJaWYgKGNtZC0+cmV0cnlfY291bnQgPCBNQVhfQ01EX1JFVFJJRVMpIHsKLQkJCQkJcmV0cnlfY21kPTE7Ci0JCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJCQkJCSJjY2lzcyVkOiByZXRyeWluZyAlcFxuIiwKLQkJCQkJCWgtPmN0bHIsIGNtZCk7Ci0JCQkJCWNtZC0+cmV0cnlfY291bnQrKzsKLQkJCQl9IGVsc2UKLQkJCQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkJCQkJImNjaXNzJWQ6ICVwIHJldHJpZWQgdG9vICIKLQkJCQkJCSJtYW55IHRpbWVzXG4iLCBoLT5jdGxyLCBjbWQpOwotCQkJCXN0YXR1cz0wOworCQljYXNlIENNRF9BQk9SVEVEOgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2Npc3M6IGNtZCAlcCB3YXMgIgorCQkJICAgICAgICJhYm9ydGVkXG4iLCBjbWQpOworCQkJc3RhdHVzID0gMDsKIAkJCWJyZWFrOwotCQkJY2FzZSBDTURfVElNRU9VVDoKLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJjY2lzczogY21kICVwIHRpbWVkb3V0XG4iLAotCQkJCQljbWQpOwotCQkJCXN0YXR1cz0wOworCQljYXNlIENNRF9BQk9SVF9GQUlMRUQ6CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJjY2lzczogY21kICVwIHJlcG9ydHMgIgorCQkJICAgICAgICJhYm9ydCBmYWlsZWRcbiIsIGNtZCk7CisJCQlzdGF0dXMgPSAwOwogCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzOiBjbWQgJXAgcmV0dXJuZWQgIgotCQkJCQkidW5rbm93biBzdGF0dXMgJXhcbiIsIGNtZCwgCi0JCQkJCQljbWQtPmVycl9pbmZvLT5Db21tYW5kU3RhdHVzKTsgCi0JCQkJc3RhdHVzPTA7CisJCWNhc2UgQ01EX1VOU09MSUNJVEVEX0FCT1JUOgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2Npc3MlZDogdW5zb2xpY2l0ZWQgIgorCQkJICAgICAgICJhYm9ydCAlcFxuIiwgaC0+Y3RsciwgY21kKTsKKwkJCWlmIChjbWQtPnJldHJ5X2NvdW50IDwgTUFYX0NNRF9SRVRSSUVTKSB7CisJCQkJcmV0cnlfY21kID0gMTsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJICAgICAgICJjY2lzcyVkOiByZXRyeWluZyAlcFxuIiwgaC0+Y3RsciwgY21kKTsKKwkJCQljbWQtPnJldHJ5X2NvdW50Kys7CisJCQl9IGVsc2UKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJICAgICAgICJjY2lzcyVkOiAlcCByZXRyaWVkIHRvbyAiCisJCQkJICAgICAgICJtYW55IHRpbWVzXG4iLCBoLT5jdGxyLCBjbWQpOworCQkJc3RhdHVzID0gMDsKKwkJCWJyZWFrOworCQljYXNlIENNRF9USU1FT1VUOgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2Npc3M6IGNtZCAlcCB0aW1lZG91dFxuIiwgY21kKTsKKwkJCXN0YXR1cyA9IDA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzOiBjbWQgJXAgcmV0dXJuZWQgIgorCQkJICAgICAgICJ1bmtub3duIHN0YXR1cyAleFxuIiwgY21kLAorCQkJICAgICAgIGNtZC0+ZXJyX2luZm8tPkNvbW1hbmRTdGF0dXMpOworCQkJc3RhdHVzID0gMDsKIAkJfQogCX0KIAkvKiBXZSBuZWVkIHRvIHJldHVybiB0aGlzIGNvbW1hbmQgKi8KLQlpZihyZXRyeV9jbWQpIHsKLQkJcmVzZW5kX2NjaXNzX2NtZChoLGNtZCk7CisJaWYgKHJldHJ5X2NtZCkgeworCQlyZXNlbmRfY2Npc3NfY21kKGgsIGNtZCk7CiAJCXJldHVybjsKLQl9CQorCX0KIAogCWNtZC0+cnEtPmNvbXBsZXRpb25fZGF0YSA9IGNtZDsKIAljbWQtPnJxLT5lcnJvcnMgPSBzdGF0dXM7CkBAIC0yMzM2LDEyICsyMzY1LDEyIEBACiAJYmxrX2NvbXBsZXRlX3JlcXVlc3QoY21kLT5ycSk7CiB9CiAKLS8qIAotICogR2V0IGEgcmVxdWVzdCBhbmQgc3VibWl0IGl0IHRvIHRoZSBjb250cm9sbGVyLiAKKy8qCisgKiBHZXQgYSByZXF1ZXN0IGFuZCBzdWJtaXQgaXQgdG8gdGhlIGNvbnRyb2xsZXIuCiAgKi8KIHN0YXRpYyB2b2lkIGRvX2NjaXNzX3JlcXVlc3QocmVxdWVzdF9xdWV1ZV90ICpxKQogewotCWN0bHJfaW5mb190ICpoPSBxLT5xdWV1ZWRhdGE7IAorCWN0bHJfaW5mb190ICpoID0gcS0+cXVldWVkYXRhOwogCUNvbW1hbmRMaXN0X3N0cnVjdCAqYzsKIAlpbnQgc3RhcnRfYmxrLCBzZWc7CiAJc3RydWN0IHJlcXVlc3QgKmNyZXE7CkBAIC0yMzUyLDE4ICsyMzgxLDE4IEBACiAKIAkvKiBXZSBjYWxsIHN0YXJ0X2lvIGhlcmUgaW4gY2FzZSB0aGVyZSBpcyBhIGNvbW1hbmQgd2FpdGluZyBvbiB0aGUKIAkgKiBxdWV1ZSB0aGF0IGhhcyBub3QgYmVlbiBzZW50LgotCSovCisJICovCiAJaWYgKGJsa19xdWV1ZV9wbHVnZ2VkKHEpKQogCQlnb3RvIHN0YXJ0aW87CiAKLXF1ZXVlOgorICAgICAgcXVldWU6CiAJY3JlcSA9IGVsdl9uZXh0X3JlcXVlc3QocSk7CiAJaWYgKCFjcmVxKQogCQlnb3RvIHN0YXJ0aW87CiAKIAlCVUdfT04oY3JlcS0+bnJfcGh5c19zZWdtZW50cyA+IE1BWFNHRU5UUklFUyk7CiAKLQlpZiAoKCBjID0gY21kX2FsbG9jKGgsIDEpKSA9PSBOVUxMKQorCWlmICgoYyA9IGNtZF9hbGxvYyhoLCAxKSkgPT0gTlVMTCkKIAkJZ290byBmdWxsOwogCiAJYmxrZGV2X2RlcXVldWVfcmVxdWVzdChjcmVxKTsKQEAgLTIzNzIsODEgKzI0MDEsODIgQEAKIAogCWMtPmNtZF90eXBlID0gQ01EX1JXUkVROwogCWMtPnJxID0gY3JlcTsKLQkKLQkvKiBmaWxsIGluIHRoZSByZXF1ZXN0ICovIAorCisJLyogZmlsbCBpbiB0aGUgcmVxdWVzdCAqLwogCWRydiA9IGNyZXEtPnJxX2Rpc2stPnByaXZhdGVfZGF0YTsKLQljLT5IZWFkZXIuUmVwbHlRdWV1ZSA9IDA7ICAvLyB1bnVzZWQgaW4gc2ltcGxlIG1vZGUKKwljLT5IZWFkZXIuUmVwbHlRdWV1ZSA9IDA7CS8vIHVudXNlZCBpbiBzaW1wbGUgbW9kZQogCS8qIGdvdCBjb21tYW5kIGZyb20gcG9vbCwgc28gdXNlIHRoZSBjb21tYW5kIGJsb2NrIGluZGV4IGluc3RlYWQgKi8KIAkvKiBmb3IgZGlyZWN0IGxvb2t1cHMuICovCiAJLyogVGhlIGZpcnN0IDIgYml0cyBhcmUgcmVzZXJ2ZWQgZm9yIGNvbnRyb2xsZXIgZXJyb3IgcmVwb3J0aW5nLiAqLwogCWMtPkhlYWRlci5UYWcubG93ZXIgPSAoYy0+Y21kaW5kZXggPDwgMyk7Ci0JYy0+SGVhZGVyLlRhZy5sb3dlciB8PSAweDA0OyAvKiBmbGFnIGZvciBkaXJlY3QgbG9va3VwLiAqLwotCWMtPkhlYWRlci5MVU4uTG9nRGV2LlZvbElkPSBkcnYtPkx1bklEOworCWMtPkhlYWRlci5UYWcubG93ZXIgfD0gMHgwNDsJLyogZmxhZyBmb3IgZGlyZWN0IGxvb2t1cC4gKi8KKwljLT5IZWFkZXIuTFVOLkxvZ0Rldi5Wb2xJZCA9IGRydi0+THVuSUQ7CiAJYy0+SGVhZGVyLkxVTi5Mb2dEZXYuTW9kZSA9IDE7Ci0JYy0+UmVxdWVzdC5DREJMZW4gPSAxMDsgLy8gMTIgYnl0ZSBjb21tYW5kcyBub3QgaW4gRlcgeWV0OwotCWMtPlJlcXVlc3QuVHlwZS5UeXBlID0gIFRZUEVfQ01EOyAvLyBJdCBpcyBhIGNvbW1hbmQuIAotCWMtPlJlcXVlc3QuVHlwZS5BdHRyaWJ1dGUgPSBBVFRSX1NJTVBMRTsgCi0JYy0+UmVxdWVzdC5UeXBlLkRpcmVjdGlvbiA9IAotCQkocnFfZGF0YV9kaXIoY3JlcSkgPT0gUkVBRCkgPyBYRkVSX1JFQUQ6IFhGRVJfV1JJVEU7IAotCWMtPlJlcXVlc3QuVGltZW91dCA9IDA7IC8vIERvbid0IHRpbWUgb3V0CQotCWMtPlJlcXVlc3QuQ0RCWzBdID0gKHJxX2RhdGFfZGlyKGNyZXEpID09IFJFQUQpID8gQ0NJU1NfUkVBRCA6IENDSVNTX1dSSVRFOworCWMtPlJlcXVlc3QuQ0RCTGVuID0gMTA7CS8vIDEyIGJ5dGUgY29tbWFuZHMgbm90IGluIEZXIHlldDsKKwljLT5SZXF1ZXN0LlR5cGUuVHlwZSA9IFRZUEVfQ01EOwkvLyBJdCBpcyBhIGNvbW1hbmQuCisJYy0+UmVxdWVzdC5UeXBlLkF0dHJpYnV0ZSA9IEFUVFJfU0lNUExFOworCWMtPlJlcXVlc3QuVHlwZS5EaXJlY3Rpb24gPQorCSAgICAocnFfZGF0YV9kaXIoY3JlcSkgPT0gUkVBRCkgPyBYRkVSX1JFQUQgOiBYRkVSX1dSSVRFOworCWMtPlJlcXVlc3QuVGltZW91dCA9IDA7CS8vIERvbid0IHRpbWUgb3V0CisJYy0+UmVxdWVzdC5DREJbMF0gPQorCSAgICAocnFfZGF0YV9kaXIoY3JlcSkgPT0gUkVBRCkgPyBDQ0lTU19SRUFEIDogQ0NJU1NfV1JJVEU7CiAJc3RhcnRfYmxrID0gY3JlcS0+c2VjdG9yOwogI2lmZGVmIENDSVNTX0RFQlVHCi0JcHJpbnRrKEtFUk5fREVCVUcgImNpc3M6IHNlY3RvciA9JWQgbnJfc2VjdG9ycz0lZFxuIiwoaW50KSBjcmVxLT5zZWN0b3IsCi0JCShpbnQpIGNyZXEtPm5yX3NlY3RvcnMpOwkKLSNlbmRpZiAvKiBDQ0lTU19ERUJVRyAqLworCXByaW50ayhLRVJOX0RFQlVHICJjaXNzOiBzZWN0b3IgPSVkIG5yX3NlY3RvcnM9JWRcbiIsIChpbnQpY3JlcS0+c2VjdG9yLAorCSAgICAgICAoaW50KWNyZXEtPm5yX3NlY3RvcnMpOworI2VuZGlmCQkJCS8qIENDSVNTX0RFQlVHICovCiAKIAlzZWcgPSBibGtfcnFfbWFwX3NnKHEsIGNyZXEsIHRtcF9zZyk7CiAKLQkvKiBnZXQgdGhlIERNQSByZWNvcmRzIGZvciB0aGUgc2V0dXAgKi8gCisJLyogZ2V0IHRoZSBETUEgcmVjb3JkcyBmb3IgdGhlIHNldHVwICovCiAJaWYgKGMtPlJlcXVlc3QuVHlwZS5EaXJlY3Rpb24gPT0gWEZFUl9SRUFEKQogCQlkaXIgPSBQQ0lfRE1BX0ZST01ERVZJQ0U7CiAJZWxzZQogCQlkaXIgPSBQQ0lfRE1BX1RPREVWSUNFOwogCi0JZm9yIChpPTA7IGk8c2VnOyBpKyspCi0JeworCWZvciAoaSA9IDA7IGkgPCBzZWc7IGkrKykgewogCQljLT5TR1tpXS5MZW4gPSB0bXBfc2dbaV0ubGVuZ3RoOwogCQl0ZW1wNjQudmFsID0gKF9fdTY0KSBwY2lfbWFwX3BhZ2UoaC0+cGRldiwgdG1wX3NnW2ldLnBhZ2UsCi0JCQkgCQkgIHRtcF9zZ1tpXS5vZmZzZXQsIHRtcF9zZ1tpXS5sZW5ndGgsCi0JCQkJCSAgZGlyKTsKKwkJCQkJCSAgdG1wX3NnW2ldLm9mZnNldCwKKwkJCQkJCSAgdG1wX3NnW2ldLmxlbmd0aCwgZGlyKTsKIAkJYy0+U0dbaV0uQWRkci5sb3dlciA9IHRlbXA2NC52YWwzMi5sb3dlcjsKLSAgICAgICAgICAgICAgICBjLT5TR1tpXS5BZGRyLnVwcGVyID0gdGVtcDY0LnZhbDMyLnVwcGVyOwotICAgICAgICAgICAgICAgIGMtPlNHW2ldLkV4dCA9IDA7ICAvLyB3ZSBhcmUgbm90IGNoYWluaW5nCisJCWMtPlNHW2ldLkFkZHIudXBwZXIgPSB0ZW1wNjQudmFsMzIudXBwZXI7CisJCWMtPlNHW2ldLkV4dCA9IDA7CS8vIHdlIGFyZSBub3QgY2hhaW5pbmcKIAl9Ci0JLyogdHJhY2sgaG93IG1hbnkgU0cgZW50cmllcyB3ZSBhcmUgdXNpbmcgKi8gCi0JaWYoIHNlZyA+IGgtPm1heFNHKQotCQloLT5tYXhTRyA9IHNlZzsgCisJLyogdHJhY2sgaG93IG1hbnkgU0cgZW50cmllcyB3ZSBhcmUgdXNpbmcgKi8KKwlpZiAoc2VnID4gaC0+bWF4U0cpCisJCWgtPm1heFNHID0gc2VnOwogCiAjaWZkZWYgQ0NJU1NfREVCVUcKLQlwcmludGsoS0VSTl9ERUJVRyAiY2Npc3M6IFN1Ym1pdHRpbmcgJWQgc2VjdG9ycyBpbiAlZCBzZWdtZW50c1xuIiwgY3JlcS0+bnJfc2VjdG9ycywgc2VnKTsKLSNlbmRpZiAvKiBDQ0lTU19ERUJVRyAqLworCXByaW50ayhLRVJOX0RFQlVHICJjY2lzczogU3VibWl0dGluZyAlZCBzZWN0b3JzIGluICVkIHNlZ21lbnRzXG4iLAorCSAgICAgICBjcmVxLT5ucl9zZWN0b3JzLCBzZWcpOworI2VuZGlmCQkJCS8qIENDSVNTX0RFQlVHICovCiAKIAljLT5IZWFkZXIuU0dMaXN0ID0gYy0+SGVhZGVyLlNHVG90YWwgPSBzZWc7Ci0JYy0+UmVxdWVzdC5DREJbMV09IDA7Ci0JYy0+UmVxdWVzdC5DREJbMl09IChzdGFydF9ibGsgPj4gMjQpICYgMHhmZjsJLy9NU0IKLQljLT5SZXF1ZXN0LkNEQlszXT0gKHN0YXJ0X2JsayA+PiAxNikgJiAweGZmOwotCWMtPlJlcXVlc3QuQ0RCWzRdPSAoc3RhcnRfYmxrID4+ICA4KSAmIDB4ZmY7Ci0JYy0+UmVxdWVzdC5DREJbNV09IHN0YXJ0X2JsayAmIDB4ZmY7Ci0JYy0+UmVxdWVzdC5DREJbNl09IDA7IC8vIChzZWN0ID4+IDI0KSAmIDB4ZmY7IE1TQgotCWMtPlJlcXVlc3QuQ0RCWzddPSAoY3JlcS0+bnJfc2VjdG9ycyA+PiAgOCkgJiAweGZmOyAKLQljLT5SZXF1ZXN0LkNEQls4XT0gY3JlcS0+bnJfc2VjdG9ycyAmIDB4ZmY7IAorCWMtPlJlcXVlc3QuQ0RCWzFdID0gMDsKKwljLT5SZXF1ZXN0LkNEQlsyXSA9IChzdGFydF9ibGsgPj4gMjQpICYgMHhmZjsJLy9NU0IKKwljLT5SZXF1ZXN0LkNEQlszXSA9IChzdGFydF9ibGsgPj4gMTYpICYgMHhmZjsKKwljLT5SZXF1ZXN0LkNEQls0XSA9IChzdGFydF9ibGsgPj4gOCkgJiAweGZmOworCWMtPlJlcXVlc3QuQ0RCWzVdID0gc3RhcnRfYmxrICYgMHhmZjsKKwljLT5SZXF1ZXN0LkNEQls2XSA9IDA7CS8vIChzZWN0ID4+IDI0KSAmIDB4ZmY7IE1TQgorCWMtPlJlcXVlc3QuQ0RCWzddID0gKGNyZXEtPm5yX3NlY3RvcnMgPj4gOCkgJiAweGZmOworCWMtPlJlcXVlc3QuQ0RCWzhdID0gY3JlcS0+bnJfc2VjdG9ycyAmIDB4ZmY7CiAJYy0+UmVxdWVzdC5DREJbOV0gPSBjLT5SZXF1ZXN0LkNEQlsxMV0gPSBjLT5SZXF1ZXN0LkNEQlsxMl0gPSAwOwogCiAJc3Bpbl9sb2NrX2lycShxLT5xdWV1ZV9sb2NrKTsKIAotCWFkZFEoJihoLT5yZXFRKSxjKTsKKwlhZGRRKCYoaC0+cmVxUSksIGMpOwogCWgtPlFkZXB0aCsrOwotCWlmKGgtPlFkZXB0aCA+IGgtPm1heFFzaW5jZWluaXQpCi0JCWgtPm1heFFzaW5jZWluaXQgPSBoLT5RZGVwdGg7IAorCWlmIChoLT5RZGVwdGggPiBoLT5tYXhRc2luY2Vpbml0KQorCQloLT5tYXhRc2luY2Vpbml0ID0gaC0+UWRlcHRoOwogCiAJZ290byBxdWV1ZTsKLWZ1bGw6CisgICAgICBmdWxsOgogCWJsa19zdG9wX3F1ZXVlKHEpOwotc3RhcnRpbzoKKyAgICAgIHN0YXJ0aW86CiAJLyogV2Ugd2lsbCBhbHJlYWR5IGhhdmUgdGhlIGRyaXZlciBsb2NrIGhlcmUgc28gbm90IG5lZWQKIAkgKiB0byBsb2NrIGl0LgotCSovCisJICovCiAJc3RhcnRfaW8oaCk7CiB9CiAKQEAgLTI0NzMsNyArMjUwMyw3IEBACiBzdGF0aWMgaW5saW5lIGludCBpbnRlcnJ1cHRfcGVuZGluZyhjdGxyX2luZm9fdCAqaCkKIHsKICNpZmRlZiBDT05GSUdfQ0lTU19TQ1NJX1RBUEUKLQlyZXR1cm4gKCBoLT5hY2Nlc3MuaW50cl9wZW5kaW5nKGgpIAorCXJldHVybiAoaC0+YWNjZXNzLmludHJfcGVuZGluZyhoKQogCQl8fCAoaC0+c2NzaV9yZWplY3RzLm5jb21wbGV0aW9ucyA+IDApKTsKICNlbHNlCiAJcmV0dXJuIGgtPmFjY2Vzcy5pbnRyX3BlbmRpbmcoaCk7CkBAIC0yNDgzLDExICsyNTEzLDExIEBACiBzdGF0aWMgaW5saW5lIGxvbmcgaW50ZXJydXB0X25vdF9mb3JfdXMoY3Rscl9pbmZvX3QgKmgpCiB7CiAjaWZkZWYgQ09ORklHX0NJU1NfU0NTSV9UQVBFCi0JcmV0dXJuICgoKGgtPmFjY2Vzcy5pbnRyX3BlbmRpbmcoaCkgPT0gMCkgfHwgCi0JCSAoaC0+aW50ZXJydXB0c19lbmFibGVkID09IDApKSAKLQkgICAgICAmJiAoaC0+c2NzaV9yZWplY3RzLm5jb21wbGV0aW9ucyA9PSAwKSk7CisJcmV0dXJuICgoKGgtPmFjY2Vzcy5pbnRyX3BlbmRpbmcoaCkgPT0gMCkgfHwKKwkJIChoLT5pbnRlcnJ1cHRzX2VuYWJsZWQgPT0gMCkpCisJCSYmIChoLT5zY3NpX3JlamVjdHMubmNvbXBsZXRpb25zID09IDApKTsKICNlbHNlCi0JcmV0dXJuICgoKGgtPmFjY2Vzcy5pbnRyX3BlbmRpbmcoaCkgPT0gMCkgfHwgCisJcmV0dXJuICgoKGgtPmFjY2Vzcy5pbnRyX3BlbmRpbmcoaCkgPT0gMCkgfHwKIAkJIChoLT5pbnRlcnJ1cHRzX2VuYWJsZWQgPT0gMCkpKTsKICNlbmRpZgogfQpAQCAtMjUwOSwxMiArMjUzOSwxNCBAQAogCSAqLwogCXNwaW5fbG9ja19pcnFzYXZlKENDSVNTX0xPQ0soaC0+Y3RsciksIGZsYWdzKTsKIAl3aGlsZSAoaW50ZXJydXB0X3BlbmRpbmcoaCkpIHsKLQkJd2hpbGUoKGEgPSBnZXRfbmV4dF9jb21wbGV0aW9uKGgpKSAhPSBGSUZPX0VNUFRZKSB7CisJCXdoaWxlICgoYSA9IGdldF9uZXh0X2NvbXBsZXRpb24oaCkpICE9IEZJRk9fRU1QVFkpIHsKIAkJCWExID0gYTsKIAkJCWlmICgoYSAmIDB4MDQpKSB7CiAJCQkJYTIgPSAoYSA+PiAzKTsKIAkJCQlpZiAoYTIgPj0gTlJfQ01EUykgewotCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJjY2lzczogY29udHJvbGxlciBjY2lzcyVkIGZhaWxlZCwgc3RvcHBpbmcuXG4iLCBoLT5jdGxyKTsKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCQkgICAgICAgImNjaXNzOiBjb250cm9sbGVyIGNjaXNzJWQgZmFpbGVkLCBzdG9wcGluZy5cbiIsCisJCQkJCSAgICAgICBoLT5jdGxyKTsKIAkJCQkJZmFpbF9hbGxfY21kcyhoLT5jdGxyKTsKIAkJCQkJcmV0dXJuIElSUV9IQU5ETEVEOwogCQkJCX0KQEAgLTI1MjMsMjIgKzI1NTUsMjQgQEAKIAkJCQlhID0gYy0+YnVzYWRkcjsKIAogCQkJfSBlbHNlIHsKLQkJCWEgJj0gfjM7CisJCQkJYSAmPSB+MzsKIAkJCQlpZiAoKGMgPSBoLT5jbXBRKSA9PSBOVUxMKSB7Ci0JCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzOiBDb21wbGV0aW9uIG9mICUwOHggaWdub3JlZFxuIiwgYTEpOwotCQkJCWNvbnRpbnVlOwkKLQkJCX0gCi0JCQl3aGlsZShjLT5idXNhZGRyICE9IGEpIHsKLQkJCQljID0gYy0+bmV4dDsKLQkJCQlpZiAoYyA9PSBoLT5jbXBRKSAKLQkJCQkJYnJlYWs7Ci0JCQl9CisJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQkJICAgICAgICJjY2lzczogQ29tcGxldGlvbiBvZiAlMDh4IGlnbm9yZWRcbiIsCisJCQkJCSAgICAgICBhMSk7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQl3aGlsZSAoYy0+YnVzYWRkciAhPSBhKSB7CisJCQkJCWMgPSBjLT5uZXh0OworCQkJCQlpZiAoYyA9PSBoLT5jbXBRKQorCQkJCQkJYnJlYWs7CisJCQkJfQogCQkJfQogCQkJLyoKIAkJCSAqIElmIHdlJ3ZlIGZvdW5kIHRoZSBjb21tYW5kLCB0YWtlIGl0IG9mZiB0aGUKIAkJCSAqIGNvbXBsZXRpb24gUSBhbmQgZnJlZSBpdAogCQkJICovCi0JCQkgaWYgKGMtPmJ1c2FkZHIgPT0gYSkgeworCQkJaWYgKGMtPmJ1c2FkZHIgPT0gYSkgewogCQkJCXJlbW92ZVEoJmgtPmNtcFEsIGMpOwogCQkJCWlmIChjLT5jbWRfdHlwZSA9PSBDTURfUldSRVEpIHsKIAkJCQkJY29tcGxldGVfY29tbWFuZChoLCBjLCAwKTsKQEAgLTI1NTQsMTMwICsyNTg4LDExOCBAQAogCQl9CiAJfQogCi0gCS8qIGNoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIG1heGVkIG91dCB0aGUgbnVtYmVyIG9mIGNvbW1hbmRzIHRoYXQgY2FuCi0gCSAqIGJlIHBsYWNlZCBvbiB0aGUgcXVldWUuICBJZiBzbyB0aGVuIGV4aXQuICBXZSBkbyB0aGlzIGNoZWNrIGhlcmUKLSAJICogaW4gY2FzZSB0aGUgaW50ZXJydXB0IHdlIHNlcnZpY2VkIHdhcyBmcm9tIGFuIGlvY3RsIGFuZCBkaWQgbm90Ci0gCSAqIGZyZWUgYW55IG5ldyBjb21tYW5kcy4KKwkvKiBjaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBtYXhlZCBvdXQgdGhlIG51bWJlciBvZiBjb21tYW5kcyB0aGF0IGNhbgorCSAqIGJlIHBsYWNlZCBvbiB0aGUgcXVldWUuICBJZiBzbyB0aGVuIGV4aXQuICBXZSBkbyB0aGlzIGNoZWNrIGhlcmUKKwkgKiBpbiBjYXNlIHRoZSBpbnRlcnJ1cHQgd2Ugc2VydmljZWQgd2FzIGZyb20gYW4gaW9jdGwgYW5kIGRpZCBub3QKKwkgKiBmcmVlIGFueSBuZXcgY29tbWFuZHMuCiAJICovCi0gCWlmICgoZmluZF9maXJzdF96ZXJvX2JpdChoLT5jbWRfcG9vbF9iaXRzLCBOUl9DTURTKSkgPT0gTlJfQ01EUykKLSAJCWdvdG8gY2xlYW51cDsKKwlpZiAoKGZpbmRfZmlyc3RfemVyb19iaXQoaC0+Y21kX3Bvb2xfYml0cywgTlJfQ01EUykpID09IE5SX0NNRFMpCisJCWdvdG8gY2xlYW51cDsKIAotIAkvKiBXZSBoYXZlIHJvb20gb24gdGhlIHF1ZXVlIGZvciBtb3JlIGNvbW1hbmRzLiAgTm93IHdlIG5lZWQgdG8gcXVldWUKLSAJICogdGhlbSB1cC4gIFdlIHdpbGwgYWxzbyBrZWVwIHRyYWNrIG9mIHRoZSBuZXh0IHF1ZXVlIHRvIHJ1biBzbwotIAkgKiB0aGF0IGV2ZXJ5IHF1ZXVlIGdldHMgYSBjaGFuY2UgdG8gYmUgc3RhcnRlZCBmaXJzdC4KLSAJKi8KLQlmb3IgKGo9MDsgaiA8IGgtPmhpZ2hlc3RfbHVuICsgMTsgaisrKXsKKwkvKiBXZSBoYXZlIHJvb20gb24gdGhlIHF1ZXVlIGZvciBtb3JlIGNvbW1hbmRzLiAgTm93IHdlIG5lZWQgdG8gcXVldWUKKwkgKiB0aGVtIHVwLiAgV2Ugd2lsbCBhbHNvIGtlZXAgdHJhY2sgb2YgdGhlIG5leHQgcXVldWUgdG8gcnVuIHNvCisJICogdGhhdCBldmVyeSBxdWV1ZSBnZXRzIGEgY2hhbmNlIHRvIGJlIHN0YXJ0ZWQgZmlyc3QuCisJICovCisJZm9yIChqID0gMDsgaiA8IGgtPmhpZ2hlc3RfbHVuICsgMTsgaisrKSB7CiAJCWludCBjdXJyX3F1ZXVlID0gKHN0YXJ0X3F1ZXVlICsgaikgJSAoaC0+aGlnaGVzdF9sdW4gKyAxKTsKLSAJCS8qIG1ha2Ugc3VyZSB0aGUgZGlzayBoYXMgYmVlbiBhZGRlZCBhbmQgdGhlIGRyaXZlIGlzIHJlYWwKLSAJCSAqIGJlY2F1c2UgdGhpcyBjYW4gYmUgY2FsbGVkIGZyb20gdGhlIG1pZGRsZSBvZiBpbml0X29uZS4KLSAJCSovCi0JCWlmKCEoaC0+ZHJ2W2N1cnJfcXVldWVdLnF1ZXVlKSB8fAotCQkgCQkgICAhKGgtPmRydltjdXJyX3F1ZXVlXS5oZWFkcykpCi0gCQkJY29udGludWU7Ci0gCQlibGtfc3RhcnRfcXVldWUoaC0+Z2VuZGlza1tjdXJyX3F1ZXVlXS0+cXVldWUpOworCQkvKiBtYWtlIHN1cmUgdGhlIGRpc2sgaGFzIGJlZW4gYWRkZWQgYW5kIHRoZSBkcml2ZSBpcyByZWFsCisJCSAqIGJlY2F1c2UgdGhpcyBjYW4gYmUgY2FsbGVkIGZyb20gdGhlIG1pZGRsZSBvZiBpbml0X29uZS4KKwkJICovCisJCWlmICghKGgtPmRydltjdXJyX3F1ZXVlXS5xdWV1ZSkgfHwgIShoLT5kcnZbY3Vycl9xdWV1ZV0uaGVhZHMpKQorCQkJY29udGludWU7CisJCWJsa19zdGFydF9xdWV1ZShoLT5nZW5kaXNrW2N1cnJfcXVldWVdLT5xdWV1ZSk7CiAKLSAJCS8qIGNoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIG1heGVkIG91dCB0aGUgbnVtYmVyIG9mIGNvbW1hbmRzCi0gCQkgKiB0aGF0IGNhbiBiZSBwbGFjZWQgb24gdGhlIHF1ZXVlLgotIAkJKi8KLSAJCWlmICgoZmluZF9maXJzdF96ZXJvX2JpdChoLT5jbWRfcG9vbF9iaXRzLCBOUl9DTURTKSkgPT0gTlJfQ01EUykKLSAJCXsKLSAJCQlpZiAoY3Vycl9xdWV1ZSA9PSBzdGFydF9xdWV1ZSl7Ci0JCQkJaC0+bmV4dF90b19ydW4gPSAoc3RhcnRfcXVldWUgKyAxKSAlIChoLT5oaWdoZXN0X2x1biArIDEpOwotIAkJCQlnb3RvIGNsZWFudXA7Ci0gCQkJfSBlbHNlIHsKLSAJCQkJaC0+bmV4dF90b19ydW4gPSBjdXJyX3F1ZXVlOwotIAkJCQlnb3RvIGNsZWFudXA7Ci0gCX0KLSAJCX0gZWxzZSB7CisJCS8qIGNoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIG1heGVkIG91dCB0aGUgbnVtYmVyIG9mIGNvbW1hbmRzCisJCSAqIHRoYXQgY2FuIGJlIHBsYWNlZCBvbiB0aGUgcXVldWUuCisJCSAqLworCQlpZiAoKGZpbmRfZmlyc3RfemVyb19iaXQoaC0+Y21kX3Bvb2xfYml0cywgTlJfQ01EUykpID09IE5SX0NNRFMpIHsKKwkJCWlmIChjdXJyX3F1ZXVlID09IHN0YXJ0X3F1ZXVlKSB7CisJCQkJaC0+bmV4dF90b19ydW4gPQorCQkJCSAgICAoc3RhcnRfcXVldWUgKyAxKSAlIChoLT5oaWdoZXN0X2x1biArIDEpOworCQkJCWdvdG8gY2xlYW51cDsKKwkJCX0gZWxzZSB7CisJCQkJaC0+bmV4dF90b19ydW4gPSBjdXJyX3F1ZXVlOworCQkJCWdvdG8gY2xlYW51cDsKKwkJCX0KKwkJfSBlbHNlIHsKIAkJCWN1cnJfcXVldWUgPSAoY3Vycl9xdWV1ZSArIDEpICUgKGgtPmhpZ2hlc3RfbHVuICsgMSk7Ci0gCQl9Ci0gCX0KKwkJfQorCX0KIAotY2xlYW51cDoKKyAgICAgIGNsZWFudXA6CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShDQ0lTU19MT0NLKGgtPmN0bHIpLCBmbGFncyk7CiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQotLyogCi0gKiAgV2UgY2Fubm90IHJlYWQgdGhlIHN0cnVjdHVyZSBkaXJlY3RseSwgZm9yIHBvcnRhYmxpdHkgd2UgbXVzdCB1c2UgCisKKy8qCisgKiAgV2UgY2Fubm90IHJlYWQgdGhlIHN0cnVjdHVyZSBkaXJlY3RseSwgZm9yIHBvcnRhYmlsaXR5IHdlIG11c3QgdXNlCiAgKiAgIHRoZSBpbyBmdW5jdGlvbnMuCi0gKiAgIFRoaXMgaXMgZm9yIGRlYnVnIG9ubHkuIAorICogICBUaGlzIGlzIGZvciBkZWJ1ZyBvbmx5LgogICovCiAjaWZkZWYgQ0NJU1NfREVCVUcKLXN0YXRpYyB2b2lkIHByaW50X2NmZ190YWJsZSggQ2ZnVGFibGVfc3RydWN0ICp0YikKK3N0YXRpYyB2b2lkIHByaW50X2NmZ190YWJsZShDZmdUYWJsZV9zdHJ1Y3QgKnRiKQogewogCWludCBpOwogCWNoYXIgdGVtcF9uYW1lWzE3XTsKIAogCXByaW50aygiQ29udHJvbGxlciBDb25maWd1cmF0aW9uIGluZm9ybWF0aW9uXG4iKTsKIAlwcmludGsoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7Ci0JZm9yKGk9MDtpPDQ7aSsrKQorCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCiAJCXRlbXBfbmFtZVtpXSA9IHJlYWRiKCYodGItPlNpZ25hdHVyZVtpXSkpOwotCXRlbXBfbmFtZVs0XT0nXDAnOwotCXByaW50aygiICAgU2lnbmF0dXJlID0gJXNcbiIsIHRlbXBfbmFtZSk7IAorCXRlbXBfbmFtZVs0XSA9ICdcMCc7CisJcHJpbnRrKCIgICBTaWduYXR1cmUgPSAlc1xuIiwgdGVtcF9uYW1lKTsKIAlwcmludGsoIiAgIFNwZWMgTnVtYmVyID0gJWRcbiIsIHJlYWRsKCYodGItPlNwZWNWYWxlbmNlKSkpOwotCXByaW50aygiICAgVHJhbnNwb3J0IG1ldGhvZHMgc3VwcG9ydGVkID0gMHgleFxuIiwgCi0JCQkJcmVhZGwoJih0Yi0+IFRyYW5zcG9ydFN1cHBvcnQpKSk7Ci0JcHJpbnRrKCIgICBUcmFuc3BvcnQgbWV0aG9kcyBhY3RpdmUgPSAweCV4XG4iLCAKLQkJCQlyZWFkbCgmKHRiLT5UcmFuc3BvcnRBY3RpdmUpKSk7Ci0JcHJpbnRrKCIgICBSZXF1ZXN0ZWQgdHJhbnNwb3J0IE1ldGhvZCA9IDB4JXhcbiIsIAotCQkJcmVhZGwoJih0Yi0+SG9zdFdyaXRlLlRyYW5zcG9ydFJlcXVlc3QpKSk7Ci0JcHJpbnRrKCIgICBDb2FsZXNlIEludGVycnVwdCBEZWxheSA9IDB4JXhcbiIsIAotCQkJcmVhZGwoJih0Yi0+SG9zdFdyaXRlLkNvYWxJbnREZWxheSkpKTsKLQlwcmludGsoIiAgIENvYWxlc2UgSW50ZXJydXB0IENvdW50ID0gMHgleFxuIiwgCi0JCQlyZWFkbCgmKHRiLT5Ib3N0V3JpdGUuQ29hbEludENvdW50KSkpOwotCXByaW50aygiICAgTWF4IG91dHN0YW5kaW5nIGNvbW1hbmRzID0gMHglZFxuIiwgCi0JCQlyZWFkbCgmKHRiLT5DbWRzT3V0TWF4KSkpOwotCXByaW50aygiICAgQnVzIFR5cGVzID0gMHgleFxuIiwgcmVhZGwoJih0Yi0+IEJ1c1R5cGVzKSkpOwotCWZvcihpPTA7aTwxNjtpKyspCisJcHJpbnRrKCIgICBUcmFuc3BvcnQgbWV0aG9kcyBzdXBwb3J0ZWQgPSAweCV4XG4iLAorCSAgICAgICByZWFkbCgmKHRiLT5UcmFuc3BvcnRTdXBwb3J0KSkpOworCXByaW50aygiICAgVHJhbnNwb3J0IG1ldGhvZHMgYWN0aXZlID0gMHgleFxuIiwKKwkgICAgICAgcmVhZGwoJih0Yi0+VHJhbnNwb3J0QWN0aXZlKSkpOworCXByaW50aygiICAgUmVxdWVzdGVkIHRyYW5zcG9ydCBNZXRob2QgPSAweCV4XG4iLAorCSAgICAgICByZWFkbCgmKHRiLT5Ib3N0V3JpdGUuVHJhbnNwb3J0UmVxdWVzdCkpKTsKKwlwcmludGsoIiAgIENvYWxlc2NlIEludGVycnVwdCBEZWxheSA9IDB4JXhcbiIsCisJICAgICAgIHJlYWRsKCYodGItPkhvc3RXcml0ZS5Db2FsSW50RGVsYXkpKSk7CisJcHJpbnRrKCIgICBDb2FsZXNjZSBJbnRlcnJ1cHQgQ291bnQgPSAweCV4XG4iLAorCSAgICAgICByZWFkbCgmKHRiLT5Ib3N0V3JpdGUuQ29hbEludENvdW50KSkpOworCXByaW50aygiICAgTWF4IG91dHN0YW5kaW5nIGNvbW1hbmRzID0gMHglZFxuIiwKKwkgICAgICAgcmVhZGwoJih0Yi0+Q21kc091dE1heCkpKTsKKwlwcmludGsoIiAgIEJ1cyBUeXBlcyA9IDB4JXhcbiIsIHJlYWRsKCYodGItPkJ1c1R5cGVzKSkpOworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQogCQl0ZW1wX25hbWVbaV0gPSByZWFkYigmKHRiLT5TZXJ2ZXJOYW1lW2ldKSk7CiAJdGVtcF9uYW1lWzE2XSA9ICdcMCc7CiAJcHJpbnRrKCIgICBTZXJ2ZXIgTmFtZSA9ICVzXG4iLCB0ZW1wX25hbWUpOwotCXByaW50aygiICAgSGVhcnRiZWF0IENvdW50ZXIgPSAweCV4XG5cblxuIiwgCi0JCQlyZWFkbCgmKHRiLT5IZWFydEJlYXQpKSk7CisJcHJpbnRrKCIgICBIZWFydGJlYXQgQ291bnRlciA9IDB4JXhcblxuXG4iLCByZWFkbCgmKHRiLT5IZWFydEJlYXQpKSk7CiB9Ci0jZW5kaWYgLyogQ0NJU1NfREVCVUcgKi8gCisjZW5kaWYJCQkJLyogQ0NJU1NfREVCVUcgKi8KIAotc3RhdGljIHZvaWQgcmVsZWFzZV9pb19tZW0oY3Rscl9pbmZvX3QgKmMpCi17Ci0JLyogaWYgSU8gbWVtIHdhcyBub3QgcHJvdGVjdGVkIGRvIG5vdGhpbmcgKi8KLQlpZiggYy0+aW9fbWVtX2FkZHIgPT0gMCkKLQkJcmV0dXJuOwotCXJlbGVhc2VfcmVnaW9uKGMtPmlvX21lbV9hZGRyLCBjLT5pb19tZW1fbGVuZ3RoKTsKLQljLT5pb19tZW1fYWRkciA9IDA7Ci0JYy0+aW9fbWVtX2xlbmd0aCA9IDA7Ci19Ci0KLXN0YXRpYyBpbnQgZmluZF9QQ0lfQkFSX2luZGV4KHN0cnVjdCBwY2lfZGV2ICpwZGV2LAotCQkJCXVuc2lnbmVkIGxvbmcgcGNpX2Jhcl9hZGRyKQorc3RhdGljIGludCBmaW5kX1BDSV9CQVJfaW5kZXgoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHVuc2lnbmVkIGxvbmcgcGNpX2Jhcl9hZGRyKQogewogCWludCBpLCBvZmZzZXQsIG1lbV90eXBlLCBiYXJfdHlwZTsKLQlpZiAocGNpX2Jhcl9hZGRyID09IFBDSV9CQVNFX0FERFJFU1NfMCkgLyogbG9va2luZyBmb3IgQkFSIHplcm8/ICovCisJaWYgKHBjaV9iYXJfYWRkciA9PSBQQ0lfQkFTRV9BRERSRVNTXzApCS8qIGxvb2tpbmcgZm9yIEJBUiB6ZXJvPyAqLwogCQlyZXR1cm4gMDsKIAlvZmZzZXQgPSAwOwotCWZvciAoaT0wOyBpPERFVklDRV9DT1VOVF9SRVNPVVJDRTsgaSsrKSB7Ci0JCWJhcl90eXBlID0gcGNpX3Jlc291cmNlX2ZsYWdzKHBkZXYsIGkpICYKLQkJCVBDSV9CQVNFX0FERFJFU1NfU1BBQ0U7CisJZm9yIChpID0gMDsgaSA8IERFVklDRV9DT1VOVF9SRVNPVVJDRTsgaSsrKSB7CisJCWJhcl90eXBlID0gcGNpX3Jlc291cmNlX2ZsYWdzKHBkZXYsIGkpICYgUENJX0JBU0VfQUREUkVTU19TUEFDRTsKIAkJaWYgKGJhcl90eXBlID09IFBDSV9CQVNFX0FERFJFU1NfU1BBQ0VfSU8pCiAJCQlvZmZzZXQgKz0gNDsKIAkJZWxzZSB7CiAJCQltZW1fdHlwZSA9IHBjaV9yZXNvdXJjZV9mbGFncyhwZGV2LCBpKSAmCi0JCQkJUENJX0JBU0VfQUREUkVTU19NRU1fVFlQRV9NQVNLOworCQkJICAgIFBDSV9CQVNFX0FERFJFU1NfTUVNX1RZUEVfTUFTSzsKIAkJCXN3aXRjaCAobWVtX3R5cGUpIHsKLQkJCQljYXNlIFBDSV9CQVNFX0FERFJFU1NfTUVNX1RZUEVfMzI6Ci0JCQkJY2FzZSBQQ0lfQkFTRV9BRERSRVNTX01FTV9UWVBFXzFNOgotCQkJCQlvZmZzZXQgKz0gNDsgLyogMzIgYml0ICovCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgUENJX0JBU0VfQUREUkVTU19NRU1fVFlQRV82NDoKLQkJCQkJb2Zmc2V0ICs9IDg7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6IC8qIHJlc2VydmVkIGluIFBDSSAyLjIgKi8KLQkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQmFzZSBhZGRyZXNzIGlzIGludmFsaWRcbiIpOwotCQkJICAgICAgIAkJcmV0dXJuIC0xOworCQkJY2FzZSBQQ0lfQkFTRV9BRERSRVNTX01FTV9UWVBFXzMyOgorCQkJY2FzZSBQQ0lfQkFTRV9BRERSRVNTX01FTV9UWVBFXzFNOgorCQkJCW9mZnNldCArPSA0OwkvKiAzMiBiaXQgKi8KKwkJCQlicmVhazsKKwkJCWNhc2UgUENJX0JBU0VfQUREUkVTU19NRU1fVFlQRV82NDoKKwkJCQlvZmZzZXQgKz0gODsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CS8qIHJlc2VydmVkIGluIFBDSSAyLjIgKi8KKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJICAgICAgICJCYXNlIGFkZHJlc3MgaXMgaW52YWxpZFxuIik7CisJCQkJcmV0dXJuIC0xOwogCQkJCWJyZWFrOwogCQkJfQogCQl9Ci0gCQlpZiAob2Zmc2V0ID09IHBjaV9iYXJfYWRkciAtIFBDSV9CQVNFX0FERFJFU1NfMCkKLQkJCXJldHVybiBpKzE7CisJCWlmIChvZmZzZXQgPT0gcGNpX2Jhcl9hZGRyIC0gUENJX0JBU0VfQUREUkVTU18wKQorCQkJcmV0dXJuIGkgKyAxOwogCX0KIAlyZXR1cm4gLTE7CiB9CkBAIC0yNjg2LDUzICsyNzA4LDU0IEBACiAgKiBjb250cm9sbGVycyB0aGF0IGFyZSBjYXBhYmxlLiBJZiBub3QsIHdlIHVzZSBJTy1BUElDIG1vZGUuCiAgKi8KIAotc3RhdGljIHZvaWQgX19kZXZpbml0IGNjaXNzX2ludGVycnVwdF9tb2RlKGN0bHJfaW5mb190ICpjLCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwgX191MzIgYm9hcmRfaWQpCitzdGF0aWMgdm9pZCBfX2RldmluaXQgY2Npc3NfaW50ZXJydXB0X21vZGUoY3Rscl9pbmZvX3QgKmMsCisJCQkJCSAgIHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBfX3UzMiBib2FyZF9pZCkKIHsKICNpZmRlZiBDT05GSUdfUENJX01TSQotICAgICAgICBpbnQgZXJyOwotICAgICAgICBzdHJ1Y3QgbXNpeF9lbnRyeSBjY2lzc19tc2l4X2VudHJpZXNbNF0gPSB7ezAsMH0sIHswLDF9LAotCQkJCQkJICAgezAsMn0sIHswLDN9fTsKKwlpbnQgZXJyOworCXN0cnVjdCBtc2l4X2VudHJ5IGNjaXNzX21zaXhfZW50cmllc1s0XSA9IHsgezAsIDB9LCB7MCwgMX0sCisJezAsIDJ9LCB7MCwgM30KKwl9OwogCiAJLyogU29tZSBib2FyZHMgYWR2ZXJ0aXNlIE1TSSBidXQgZG9uJ3QgcmVhbGx5IHN1cHBvcnQgaXQgKi8KIAlpZiAoKGJvYXJkX2lkID09IDB4NDA3MDBFMTEpIHx8Ci0JCShib2FyZF9pZCA9PSAweDQwODAwRTExKSB8fAotCQkoYm9hcmRfaWQgPT0gMHg0MDgyMEUxMSkgfHwKLQkJKGJvYXJkX2lkID09IDB4NDA4MzBFMTEpKQorCSAgICAoYm9hcmRfaWQgPT0gMHg0MDgwMEUxMSkgfHwKKwkgICAgKGJvYXJkX2lkID09IDB4NDA4MjBFMTEpIHx8IChib2FyZF9pZCA9PSAweDQwODMwRTExKSkKIAkJZ290byBkZWZhdWx0X2ludF9tb2RlOwogCi0gICAgICAgIGlmIChwY2lfZmluZF9jYXBhYmlsaXR5KHBkZXYsIFBDSV9DQVBfSURfTVNJWCkpIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBwY2lfZW5hYmxlX21zaXgocGRldiwgY2Npc3NfbXNpeF9lbnRyaWVzLCA0KTsKLSAgICAgICAgICAgICAgICBpZiAoIWVycikgewotICAgICAgICAgICAgICAgICAgICAgICAgYy0+aW50clswXSA9IGNjaXNzX21zaXhfZW50cmllc1swXS52ZWN0b3I7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjLT5pbnRyWzFdID0gY2Npc3NfbXNpeF9lbnRyaWVzWzFdLnZlY3RvcjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGMtPmludHJbMl0gPSBjY2lzc19tc2l4X2VudHJpZXNbMl0udmVjdG9yOwotICAgICAgICAgICAgICAgICAgICAgICAgYy0+aW50clszXSA9IGNjaXNzX21zaXhfZW50cmllc1szXS52ZWN0b3I7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjLT5tc2l4X3ZlY3RvciA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChlcnIgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICJjY2lzczogb25seSAlZCBNU0ktWCB2ZWN0b3JzICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXZhaWxhYmxlXG4iLCBlcnIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICJjY2lzczogTVNJLVggaW5pdCBmYWlsZWQgJWRcbiIsCi0JCQkJCQllcnIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAocGNpX2ZpbmRfY2FwYWJpbGl0eShwZGV2LCBQQ0lfQ0FQX0lEX01TSSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoIXBjaV9lbmFibGVfbXNpKHBkZXYpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjLT5pbnRyW1NJTVBMRV9NT0RFX0lOVF0gPSBwZGV2LT5pcnE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjLT5tc2lfdmVjdG9yID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiY2Npc3M6IE1TSSBpbml0IGZhaWxlZFxuIik7Ci0gICAgICAgIAkJYy0+aW50cltTSU1QTEVfTU9ERV9JTlRdID0gcGRldi0+aXJxOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotZGVmYXVsdF9pbnRfbW9kZToKLSNlbmRpZiAvKiBDT05GSUdfUENJX01TSSAqLworCWlmIChwY2lfZmluZF9jYXBhYmlsaXR5KHBkZXYsIFBDSV9DQVBfSURfTVNJWCkpIHsKKwkJZXJyID0gcGNpX2VuYWJsZV9tc2l4KHBkZXYsIGNjaXNzX21zaXhfZW50cmllcywgNCk7CisJCWlmICghZXJyKSB7CisJCQljLT5pbnRyWzBdID0gY2Npc3NfbXNpeF9lbnRyaWVzWzBdLnZlY3RvcjsKKwkJCWMtPmludHJbMV0gPSBjY2lzc19tc2l4X2VudHJpZXNbMV0udmVjdG9yOworCQkJYy0+aW50clsyXSA9IGNjaXNzX21zaXhfZW50cmllc1syXS52ZWN0b3I7CisJCQljLT5pbnRyWzNdID0gY2Npc3NfbXNpeF9lbnRyaWVzWzNdLnZlY3RvcjsKKwkJCWMtPm1zaXhfdmVjdG9yID0gMTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAoZXJyID4gMCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2Npc3M6IG9ubHkgJWQgTVNJLVggdmVjdG9ycyAiCisJCQkgICAgICAgImF2YWlsYWJsZVxuIiwgZXJyKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzOiBNU0ktWCBpbml0IGZhaWxlZCAlZFxuIiwKKwkJCSAgICAgICBlcnIpOworCQl9CisJfQorCWlmIChwY2lfZmluZF9jYXBhYmlsaXR5KHBkZXYsIFBDSV9DQVBfSURfTVNJKSkgeworCQlpZiAoIXBjaV9lbmFibGVfbXNpKHBkZXYpKSB7CisJCQljLT5pbnRyW1NJTVBMRV9NT0RFX0lOVF0gPSBwZGV2LT5pcnE7CisJCQljLT5tc2lfdmVjdG9yID0gMTsKKwkJCXJldHVybjsKKwkJfSBlbHNlIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzOiBNU0kgaW5pdCBmYWlsZWRcbiIpOworCQkJYy0+aW50cltTSU1QTEVfTU9ERV9JTlRdID0gcGRldi0+aXJxOworCQkJcmV0dXJuOworCQl9CisJfQorICAgICAgZGVmYXVsdF9pbnRfbW9kZToKKyNlbmRpZgkJCQkvKiBDT05GSUdfUENJX01TSSAqLwogCS8qIGlmIHdlIGdldCBoZXJlIHdlJ3JlIGdvaW5nIHRvIHVzZSB0aGUgZGVmYXVsdCBpbnRlcnJ1cHQgbW9kZSAqLwotICAgICAgICBjLT5pbnRyW1NJTVBMRV9NT0RFX0lOVF0gPSBwZGV2LT5pcnE7CisJYy0+aW50cltTSU1QTEVfTU9ERV9JTlRdID0gcGRldi0+aXJxOwogCXJldHVybjsKIH0KIApAQCAtMjc0Myw1OCArMjc2Niw0MCBAQAogCV9fdTY0IGNmZ19vZmZzZXQ7CiAJX191MzIgY2ZnX2Jhc2VfYWRkcjsKIAlfX3U2NCBjZmdfYmFzZV9hZGRyX2luZGV4OwotCWludCBpOworCWludCBpLCBlcnI7CiAKIAkvKiBjaGVjayB0byBzZWUgaWYgY29udHJvbGxlciBoYXMgYmVlbiBkaXNhYmxlZCAqLwogCS8qIEJFRk9SRSB0cnlpbmcgdG8gZW5hYmxlIGl0ICovCi0JKHZvaWQpIHBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9DT01NQU5ELCZjb21tYW5kKTsKLQlpZighKGNvbW1hbmQgJiAweDAyKSkKLQl7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzOiBjb250cm9sbGVyIGFwcGVhcnMgdG8gYmUgZGlzYWJsZWRcbiIpOwotCQlyZXR1cm4oLTEpOworCSh2b2lkKXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9DT01NQU5ELCAmY29tbWFuZCk7CisJaWYgKCEoY29tbWFuZCAmIDB4MDIpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICJjY2lzczogY29udHJvbGxlciBhcHBlYXJzIHRvIGJlIGRpc2FibGVkXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKQotCXsKKwllcnIgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAoZXJyKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiY2Npc3M6IFVuYWJsZSB0byBFbmFibGUgUENJIGRldmljZVxuIik7Ci0JCXJldHVybiggLTEpOworCQlyZXR1cm4gZXJyOworCX0KKworCWVyciA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgImNjaXNzIik7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgImNjaXNzOiBDYW5ub3Qgb2J0YWluIFBDSSByZXNvdXJjZXMsICIKKwkJICAgICAgICJhYm9ydGluZ1xuIik7CisJCWdvdG8gZXJyX291dF9kaXNhYmxlX3BkZXY7CiAJfQogCiAJc3Vic3lzdGVtX3ZlbmRvcl9pZCA9IHBkZXYtPnN1YnN5c3RlbV92ZW5kb3I7CiAJc3Vic3lzdGVtX2RldmljZV9pZCA9IHBkZXYtPnN1YnN5c3RlbV9kZXZpY2U7CiAJYm9hcmRfaWQgPSAoKChfX3UzMikgKHN1YnN5c3RlbV9kZXZpY2VfaWQgPDwgMTYpICYgMHhmZmZmMDAwMCkgfAotCQkJCQlzdWJzeXN0ZW1fdmVuZG9yX2lkKTsKLQotCS8qIHNlYXJjaCBmb3Igb3VyIElPIHJhbmdlIHNvIHdlIGNhbiBwcm90ZWN0IGl0ICovCi0JZm9yKGk9MDsgaTxERVZJQ0VfQ09VTlRfUkVTT1VSQ0U7IGkrKykKLQl7Ci0JCS8qIGlzIHRoaXMgYW4gSU8gcmFuZ2UgKi8gCi0JCWlmKCBwY2lfcmVzb3VyY2VfZmxhZ3MocGRldiwgaSkgJiAweDAxICkgewotCQkJYy0+aW9fbWVtX2FkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgaSk7Ci0JCQljLT5pb19tZW1fbGVuZ3RoID0gcGNpX3Jlc291cmNlX2VuZChwZGV2LCBpKSAtCi0JCQkJcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIGkpICsxOwotI2lmZGVmIENDSVNTX0RFQlVHCi0JCQlwcmludGsoIklPIHZhbHVlIGZvdW5kIGJhc2VfYWRkclslZF0gJWx4ICVseFxuIiwgaSwKLQkJCQljLT5pb19tZW1fYWRkciwgYy0+aW9fbWVtX2xlbmd0aCk7Ci0jZW5kaWYgLyogQ0NJU1NfREVCVUcgKi8KLQkJCS8qIHJlZ2lzdGVyIHRoZSBJTyByYW5nZSAqLyAKLQkJCWlmKCFyZXF1ZXN0X3JlZ2lvbiggYy0+aW9fbWVtX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+aW9fbWVtX2xlbmd0aCwgImNjaXNzIikpCi0JCQl7Ci0JCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2Npc3MgSS9PIG1lbW9yeSByYW5nZSBhbHJlYWR5IGluIHVzZSBhZGRyPSVseCBsZW5ndGg9JWxkXG4iLAotCQkJCWMtPmlvX21lbV9hZGRyLCBjLT5pb19tZW1fbGVuZ3RoKTsKLQkJCQljLT5pb19tZW1fYWRkcj0gMDsKLQkJCQljLT5pb19tZW1fbGVuZ3RoID0gMDsKLQkJCX0gCi0JCQlicmVhazsKLQkJfQotCX0KKwkJICAgIHN1YnN5c3RlbV92ZW5kb3JfaWQpOwogCiAjaWZkZWYgQ0NJU1NfREVCVUcKIAlwcmludGsoImNvbW1hbmQgPSAleFxuIiwgY29tbWFuZCk7CiAJcHJpbnRrKCJpcnEgPSAleFxuIiwgcGRldi0+aXJxKTsKIAlwcmludGsoImJvYXJkX2lkID0gJXhcbiIsIGJvYXJkX2lkKTsKLSNlbmRpZiAvKiBDQ0lTU19ERUJVRyAqLyAKKyNlbmRpZgkJCQkvKiBDQ0lTU19ERUJVRyAqLwogCiAvKiBJZiB0aGUga2VybmVsIHN1cHBvcnRzIE1TSS9NU0ktWCB3ZSB3aWxsIHRyeSB0byBlbmFibGUgdGhhdCBmdW5jdGlvbmFsaXR5LAogICogZWxzZSB3ZSB1c2UgdGhlIElPLUFQSUMgaW50ZXJydXB0IGFzc2lnbmVkIHRvIHVzIGJ5IHN5c3RlbSBST00uCkBAIC0yODAzLDI3ICsyODA4LDI4IEBACiAKIAkvKgogCSAqIE1lbW9yeSBiYXNlIGFkZHIgaXMgZmlyc3QgYWRkciAsIHRoZSBzZWNvbmQgcG9pbnRzIHRvIHRoZSBjb25maWcKLSAgICAgICAgICogICB0YWJsZQorCSAqICAgdGFibGUKIAkgKi8KIAotCWMtPnBhZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOyAvKiBhZGRyZXNzaW5nIG1vZGUgYml0cyBhbHJlYWR5IHJlbW92ZWQgKi8KKwljLT5wYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsJLyogYWRkcmVzc2luZyBtb2RlIGJpdHMgYWxyZWFkeSByZW1vdmVkICovCiAjaWZkZWYgQ0NJU1NfREVCVUcKIAlwcmludGsoImFkZHJlc3MgMCA9ICV4XG4iLCBjLT5wYWRkcik7Ci0jZW5kaWYgLyogQ0NJU1NfREVCVUcgKi8gCisjZW5kaWYJCQkJLyogQ0NJU1NfREVCVUcgKi8KIAljLT52YWRkciA9IHJlbWFwX3BjaV9tZW0oYy0+cGFkZHIsIDIwMCk7CiAKIAkvKiBXYWl0IGZvciB0aGUgYm9hcmQgdG8gYmVjb21lIHJlYWR5LiAgKFBDSSBob3RwbHVnIG5lZWRzIHRoaXMuKQogCSAqIFdlIHBvbGwgZm9yIHVwIHRvIDEyMCBzZWNzLCBvbmNlIHBlciAxMDBtcy4gKi8KLQlmb3IgKGk9MDsgaSA8IDEyMDA7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCAxMjAwOyBpKyspIHsKIAkJc2NyYXRjaHBhZCA9IHJlYWRsKGMtPnZhZGRyICsgU0E1X1NDUkFUQ0hQQURfT0ZGU0VUKTsKIAkJaWYgKHNjcmF0Y2hwYWQgPT0gQ0NJU1NfRklSTVdBUkVfUkVBRFkpCiAJCQlicmVhazsKIAkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJc2NoZWR1bGVfdGltZW91dChIWiAvIDEwKTsgLyogd2FpdCAxMDBtcyAqLworCQlzY2hlZHVsZV90aW1lb3V0KEhaIC8gMTApOwkvKiB3YWl0IDEwMG1zICovCiAJfQogCWlmIChzY3JhdGNocGFkICE9IENDSVNTX0ZJUk1XQVJFX1JFQURZKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzOiBCb2FyZCBub3QgcmVhZHkuICBUaW1lZCBvdXQuXG4iKTsKLQkJcmV0dXJuIC0xOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIGVycl9vdXRfZnJlZV9yZXM7CiAJfQogCiAJLyogZ2V0IHRoZSBhZGRyZXNzIGluZGV4IG51bWJlciAqLwpAQCAtMjgzMSwxMDMgKzI4MzcsMTA4IEBACiAJY2ZnX2Jhc2VfYWRkciAmPSAoX191MzIpIDB4MDAwMGZmZmY7CiAjaWZkZWYgQ0NJU1NfREVCVUcKIAlwcmludGsoImNmZyBiYXNlIGFkZHJlc3MgPSAleFxuIiwgY2ZnX2Jhc2VfYWRkcik7Ci0jZW5kaWYgLyogQ0NJU1NfREVCVUcgKi8KLQljZmdfYmFzZV9hZGRyX2luZGV4ID0KLQkJZmluZF9QQ0lfQkFSX2luZGV4KHBkZXYsIGNmZ19iYXNlX2FkZHIpOworI2VuZGlmCQkJCS8qIENDSVNTX0RFQlVHICovCisJY2ZnX2Jhc2VfYWRkcl9pbmRleCA9IGZpbmRfUENJX0JBUl9pbmRleChwZGV2LCBjZmdfYmFzZV9hZGRyKTsKICNpZmRlZiBDQ0lTU19ERUJVRwogCXByaW50aygiY2ZnIGJhc2UgYWRkcmVzcyBpbmRleCA9ICV4XG4iLCBjZmdfYmFzZV9hZGRyX2luZGV4KTsKLSNlbmRpZiAvKiBDQ0lTU19ERUJVRyAqLworI2VuZGlmCQkJCS8qIENDSVNTX0RFQlVHICovCiAJaWYgKGNmZ19iYXNlX2FkZHJfaW5kZXggPT0gLTEpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2Npc3M6IENhbm5vdCBmaW5kIGNmZ19iYXNlX2FkZHJfaW5kZXhcbiIpOwotCQlyZWxlYXNlX2lvX21lbShjKTsKLQkJcmV0dXJuIC0xOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIGVycl9vdXRfZnJlZV9yZXM7CiAJfQogCiAJY2ZnX29mZnNldCA9IHJlYWRsKGMtPnZhZGRyICsgU0E1X0NUTUVNX09GRlNFVCk7CiAjaWZkZWYgQ0NJU1NfREVCVUcKIAlwcmludGsoImNmZyBvZmZzZXQgPSAleFxuIiwgY2ZnX29mZnNldCk7Ci0jZW5kaWYgLyogQ0NJU1NfREVCVUcgKi8KLQljLT5jZmd0YWJsZSA9ICByZW1hcF9wY2lfbWVtKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LAotCQkJCWNmZ19iYXNlX2FkZHJfaW5kZXgpICsgY2ZnX29mZnNldCwKLQkJCQlzaXplb2YoQ2ZnVGFibGVfc3RydWN0KSk7CisjZW5kaWYJCQkJLyogQ0NJU1NfREVCVUcgKi8KKwljLT5jZmd0YWJsZSA9IHJlbWFwX3BjaV9tZW0ocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsCisJCQkJCQkgICAgICAgY2ZnX2Jhc2VfYWRkcl9pbmRleCkgKworCQkJCSAgICBjZmdfb2Zmc2V0LCBzaXplb2YoQ2ZnVGFibGVfc3RydWN0KSk7CiAJYy0+Ym9hcmRfaWQgPSBib2FyZF9pZDsKIAogI2lmZGVmIENDSVNTX0RFQlVHCiAJcHJpbnRfY2ZnX3RhYmxlKGMtPmNmZ3RhYmxlKTsKLSNlbmRpZiAvKiBDQ0lTU19ERUJVRyAqLworI2VuZGlmCQkJCS8qIENDSVNTX0RFQlVHICovCiAKLQlmb3IoaT0wOyBpPE5SX1BST0RVQ1RTOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwcm9kdWN0cyk7IGkrKykgewogCQlpZiAoYm9hcmRfaWQgPT0gcHJvZHVjdHNbaV0uYm9hcmRfaWQpIHsKIAkJCWMtPnByb2R1Y3RfbmFtZSA9IHByb2R1Y3RzW2ldLnByb2R1Y3RfbmFtZTsKIAkJCWMtPmFjY2VzcyA9ICoocHJvZHVjdHNbaV0uYWNjZXNzKTsKIAkJCWJyZWFrOwogCQl9CiAJfQotCWlmIChpID09IE5SX1BST0RVQ1RTKSB7CisJaWYgKGkgPT0gQVJSQVlfU0laRShwcm9kdWN0cykpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2Npc3M6IFNvcnJ5LCBJIGRvbid0IGtub3cgaG93IgotCQkJIiB0byBhY2Nlc3MgdGhlIFNtYXJ0IEFycmF5IGNvbnRyb2xsZXIgJTA4bHhcbiIsIAotCQkJCSh1bnNpZ25lZCBsb25nKWJvYXJkX2lkKTsKLQkJcmV0dXJuIC0xOworCQkgICAgICAgIiB0byBhY2Nlc3MgdGhlIFNtYXJ0IEFycmF5IGNvbnRyb2xsZXIgJTA4bHhcbiIsCisJCSAgICAgICAodW5zaWduZWQgbG9uZylib2FyZF9pZCk7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX291dF9mcmVlX3JlczsKIAl9Ci0JaWYgKCAgKHJlYWRiKCZjLT5jZmd0YWJsZS0+U2lnbmF0dXJlWzBdKSAhPSAnQycpIHx8Ci0JICAgICAgKHJlYWRiKCZjLT5jZmd0YWJsZS0+U2lnbmF0dXJlWzFdKSAhPSAnSScpIHx8Ci0JICAgICAgKHJlYWRiKCZjLT5jZmd0YWJsZS0+U2lnbmF0dXJlWzJdKSAhPSAnUycpIHx8Ci0JICAgICAgKHJlYWRiKCZjLT5jZmd0YWJsZS0+U2lnbmF0dXJlWzNdKSAhPSAnUycpICkKLQl7CisJaWYgKChyZWFkYigmYy0+Y2ZndGFibGUtPlNpZ25hdHVyZVswXSkgIT0gJ0MnKSB8fAorCSAgICAocmVhZGIoJmMtPmNmZ3RhYmxlLT5TaWduYXR1cmVbMV0pICE9ICdJJykgfHwKKwkgICAgKHJlYWRiKCZjLT5jZmd0YWJsZS0+U2lnbmF0dXJlWzJdKSAhPSAnUycpIHx8CisJICAgIChyZWFkYigmYy0+Y2ZndGFibGUtPlNpZ25hdHVyZVszXSkgIT0gJ1MnKSkgewogCQlwcmludGsoIkRvZXMgbm90IGFwcGVhciB0byBiZSBhIHZhbGlkIENJU1MgY29uZmlnIHRhYmxlXG4iKTsKLQkJcmV0dXJuIC0xOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIGVycl9vdXRfZnJlZV9yZXM7CiAJfQotCiAjaWZkZWYgQ09ORklHX1g4NgotewotCS8qIE5lZWQgdG8gZW5hYmxlIHByZWZldGNoIGluIHRoZSBTQ1NJIGNvcmUgZm9yIDY0MDAgaW4geDg2ICovCi0JX191MzIgcHJlZmV0Y2g7Ci0JcHJlZmV0Y2ggPSByZWFkbCgmKGMtPmNmZ3RhYmxlLT5TQ1NJX1ByZWZldGNoKSk7Ci0JcHJlZmV0Y2ggfD0gMHgxMDA7Ci0Jd3JpdGVsKHByZWZldGNoLCAmKGMtPmNmZ3RhYmxlLT5TQ1NJX1ByZWZldGNoKSk7Ci19CisJeworCQkvKiBOZWVkIHRvIGVuYWJsZSBwcmVmZXRjaCBpbiB0aGUgU0NTSSBjb3JlIGZvciA2NDAwIGluIHg4NiAqLworCQlfX3UzMiBwcmVmZXRjaDsKKwkJcHJlZmV0Y2ggPSByZWFkbCgmKGMtPmNmZ3RhYmxlLT5TQ1NJX1ByZWZldGNoKSk7CisJCXByZWZldGNoIHw9IDB4MTAwOworCQl3cml0ZWwocHJlZmV0Y2gsICYoYy0+Y2ZndGFibGUtPlNDU0lfUHJlZmV0Y2gpKTsKKwl9CiAjZW5kaWYKIAogI2lmZGVmIENDSVNTX0RFQlVHCiAJcHJpbnRrKCJUcnlpbmcgdG8gcHV0IGJvYXJkIGludG8gU2ltcGxlIG1vZGVcbiIpOwotI2VuZGlmIC8qIENDSVNTX0RFQlVHICovIAorI2VuZGlmCQkJCS8qIENDSVNTX0RFQlVHICovCiAJYy0+bWF4X2NvbW1hbmRzID0gcmVhZGwoJihjLT5jZmd0YWJsZS0+Q21kc091dE1heCkpOwotCS8qIFVwZGF0ZSB0aGUgZmllbGQsIGFuZCB0aGVuIHJpbmcgdGhlIGRvb3JiZWxsICovIAotCXdyaXRlbCggQ0ZHVEJMX1RyYW5zX1NpbXBsZSwgCi0JCSYoYy0+Y2ZndGFibGUtPkhvc3RXcml0ZS5UcmFuc3BvcnRSZXF1ZXN0KSk7Ci0Jd3JpdGVsKCBDRkdUQkxfQ2hhbmdlUmVxLCBjLT52YWRkciArIFNBNV9ET09SQkVMTCk7CisJLyogVXBkYXRlIHRoZSBmaWVsZCwgYW5kIHRoZW4gcmluZyB0aGUgZG9vcmJlbGwgKi8KKwl3cml0ZWwoQ0ZHVEJMX1RyYW5zX1NpbXBsZSwgJihjLT5jZmd0YWJsZS0+SG9zdFdyaXRlLlRyYW5zcG9ydFJlcXVlc3QpKTsKKwl3cml0ZWwoQ0ZHVEJMX0NoYW5nZVJlcSwgYy0+dmFkZHIgKyBTQTVfRE9PUkJFTEwpOwogCiAJLyogdW5kZXIgY2VydGFpbiB2ZXJ5IHJhcmUgY29uZGl0aW9ucywgdGhpcyBjYW4gdGFrZSBhd2hpbGUuCiAJICogKGUuZy46IGhvdCByZXBsYWNlIGEgZmFpbGVkIDE0NEdCIGRyaXZlIGluIGEgUkFJRCA1IHNldCByaWdodAogCSAqIGFzIHdlIGVudGVyIHRoaXMgY29kZS4pICovCi0JZm9yKGk9MDtpPE1BWF9DT05GSUdfV0FJVDtpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0NPTkZJR19XQUlUOyBpKyspIHsKIAkJaWYgKCEocmVhZGwoYy0+dmFkZHIgKyBTQTVfRE9PUkJFTEwpICYgQ0ZHVEJMX0NoYW5nZVJlcSkpCiAJCQlicmVhazsKIAkJLyogZGVsYXkgYW5kIHRyeSBhZ2FpbiAqLwogCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwogCQlzY2hlZHVsZV90aW1lb3V0KDEwKTsKLQl9CQorCX0KIAogI2lmZGVmIENDSVNTX0RFQlVHCi0JcHJpbnRrKEtFUk5fREVCVUcgIkkgY291bnRlciBnb3QgdG8gJWQgJXhcbiIsIGksIHJlYWRsKGMtPnZhZGRyICsgU0E1X0RPT1JCRUxMKSk7Ci0jZW5kaWYgLyogQ0NJU1NfREVCVUcgKi8KKwlwcmludGsoS0VSTl9ERUJVRyAiSSBjb3VudGVyIGdvdCB0byAlZCAleFxuIiwgaSwKKwkgICAgICAgcmVhZGwoYy0+dmFkZHIgKyBTQTVfRE9PUkJFTEwpKTsKKyNlbmRpZgkJCQkvKiBDQ0lTU19ERUJVRyAqLwogI2lmZGVmIENDSVNTX0RFQlVHCi0JcHJpbnRfY2ZnX3RhYmxlKGMtPmNmZ3RhYmxlKTsJCi0jZW5kaWYgLyogQ0NJU1NfREVCVUcgKi8gCisJcHJpbnRfY2ZnX3RhYmxlKGMtPmNmZ3RhYmxlKTsKKyNlbmRpZgkJCQkvKiBDQ0lTU19ERUJVRyAqLwogCi0JaWYgKCEocmVhZGwoJihjLT5jZmd0YWJsZS0+VHJhbnNwb3J0QWN0aXZlKSkgJiBDRkdUQkxfVHJhbnNfU2ltcGxlKSkKLQl7CisJaWYgKCEocmVhZGwoJihjLT5jZmd0YWJsZS0+VHJhbnNwb3J0QWN0aXZlKSkgJiBDRkdUQkxfVHJhbnNfU2ltcGxlKSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJjY2lzczogdW5hYmxlIHRvIGdldCBib2FyZCBpbnRvIgotCQkJCQkiIHNpbXBsZSBtb2RlXG4iKTsKLQkJcmV0dXJuIC0xOworCQkgICAgICAgIiBzaW1wbGUgbW9kZVxuIik7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX291dF9mcmVlX3JlczsKIAl9CiAJcmV0dXJuIDA7CiAKKyAgICAgIGVycl9vdXRfZnJlZV9yZXM6CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKworICAgICAgZXJyX291dF9kaXNhYmxlX3BkZXY6CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCXJldHVybiBlcnI7CiB9CiAKLS8qIAotICogR2V0cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbG9jYWwgdm9sdW1lcyBhdHRhY2hlZCB0byB0aGUgY29udHJvbGxlci4gCi0gKi8gCisvKgorICogR2V0cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbG9jYWwgdm9sdW1lcyBhdHRhY2hlZCB0byB0aGUgY29udHJvbGxlci4KKyAqLwogc3RhdGljIHZvaWQgY2Npc3NfZ2V0Z2VvbWV0cnkoaW50IGNudGxfbnVtKQogewogCVJlcG9ydEx1bkRhdGFfc3RydWN0ICpsZF9idWZmOwpAQCAtMjkzOCwxMDIgKzI5NDksMTAyIEBACiAJaW50IGxpc3RsZW5ndGggPSAwOwogCV9fdTMyIGx1bmlkID0gMDsKIAlpbnQgYmxvY2tfc2l6ZTsKLQlpbnQgdG90YWxfc2l6ZTsgCisJaW50IHRvdGFsX3NpemU7CiAKIAlsZF9idWZmID0ga3phbGxvYyhzaXplb2YoUmVwb3J0THVuRGF0YV9zdHJ1Y3QpLCBHRlBfS0VSTkVMKTsKLQlpZiAobGRfYnVmZiA9PSBOVUxMKQotCXsKKwlpZiAobGRfYnVmZiA9PSBOVUxMKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiY2Npc3M6IG91dCBvZiBtZW1vcnlcbiIpOwogCQlyZXR1cm47CiAJfQotCXNpemVfYnVmZiA9IGttYWxsb2Moc2l6ZW9mKCBSZWFkQ2FwZGF0YV9zdHJ1Y3QpLCBHRlBfS0VSTkVMKTsKLSAgICAgICAgaWYgKHNpemVfYnVmZiA9PSBOVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJjY2lzczogb3V0IG9mIG1lbW9yeVxuIik7CisJc2l6ZV9idWZmID0ga21hbGxvYyhzaXplb2YoUmVhZENhcGRhdGFfc3RydWN0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKHNpemVfYnVmZiA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiY2Npc3M6IG91dCBvZiBtZW1vcnlcbiIpOwogCQlrZnJlZShsZF9idWZmKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQlpbnFfYnVmZiA9IGttYWxsb2Moc2l6ZW9mKCBJbnF1aXJ5RGF0YV9zdHJ1Y3QpLCBHRlBfS0VSTkVMKTsKLSAgICAgICAgaWYgKGlucV9idWZmID09IE5VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgImNjaXNzOiBvdXQgb2YgbWVtb3J5XG4iKTsKLSAgICAgICAgICAgICAgICBrZnJlZShsZF9idWZmKTsKKwkJcmV0dXJuOworCX0KKwlpbnFfYnVmZiA9IGttYWxsb2Moc2l6ZW9mKElucXVpcnlEYXRhX3N0cnVjdCksIEdGUF9LRVJORUwpOworCWlmIChpbnFfYnVmZiA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiY2Npc3M6IG91dCBvZiBtZW1vcnlcbiIpOworCQlrZnJlZShsZF9idWZmKTsKIAkJa2ZyZWUoc2l6ZV9idWZmKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQkvKiBHZXQgdGhlIGZpcm13YXJlIHZlcnNpb24gKi8gCi0JcmV0dXJuX2NvZGUgPSBzZW5kY21kKENJU1NfSU5RVUlSWSwgY250bF9udW0sIGlucV9idWZmLCAKLQkJc2l6ZW9mKElucXVpcnlEYXRhX3N0cnVjdCksIDAsIDAgLDAsIE5VTEwsIFRZUEVfQ01EKTsKLQlpZiAocmV0dXJuX2NvZGUgPT0gSU9fT0spCi0JeworCQlyZXR1cm47CisJfQorCS8qIEdldCB0aGUgZmlybXdhcmUgdmVyc2lvbiAqLworCXJldHVybl9jb2RlID0gc2VuZGNtZChDSVNTX0lOUVVJUlksIGNudGxfbnVtLCBpbnFfYnVmZiwKKwkJCSAgICAgIHNpemVvZihJbnF1aXJ5RGF0YV9zdHJ1Y3QpLCAwLCAwLCAwLCBOVUxMLAorCQkJICAgICAgVFlQRV9DTUQpOworCWlmIChyZXR1cm5fY29kZSA9PSBJT19PSykgewogCQloYmFbY250bF9udW1dLT5maXJtX3ZlclswXSA9IGlucV9idWZmLT5kYXRhX2J5dGVbMzJdOwogCQloYmFbY250bF9udW1dLT5maXJtX3ZlclsxXSA9IGlucV9idWZmLT5kYXRhX2J5dGVbMzNdOwogCQloYmFbY250bF9udW1dLT5maXJtX3ZlclsyXSA9IGlucV9idWZmLT5kYXRhX2J5dGVbMzRdOwogCQloYmFbY250bF9udW1dLT5maXJtX3ZlclszXSA9IGlucV9idWZmLT5kYXRhX2J5dGVbMzVdOwotCX0gZWxzZSAvKiBzZW5kIGNvbW1hbmQgZmFpbGVkICovCi0JewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJjY2lzczogdW5hYmxlIHRvIGRldGVybWluZSBmaXJtd2FyZSIKLQkJCSIgdmVyc2lvbiBvZiBjb250cm9sbGVyXG4iKTsKLQl9Ci0JLyogR2V0IHRoZSBudW1iZXIgb2YgbG9naWNhbCB2b2x1bWVzICovIAotCXJldHVybl9jb2RlID0gc2VuZGNtZChDSVNTX1JFUE9SVF9MT0csIGNudGxfbnVtLCBsZF9idWZmLCAKLQkJCXNpemVvZihSZXBvcnRMdW5EYXRhX3N0cnVjdCksIDAsIDAsIDAsIE5VTEwsIFRZUEVfQ01EKTsKKwl9IGVsc2UgewkJLyogc2VuZCBjb21tYW5kIGZhaWxlZCAqLwogCi0JaWYoIHJldHVybl9jb2RlID09IElPX09LKQotCXsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2Npc3M6IHVuYWJsZSB0byBkZXRlcm1pbmUgZmlybXdhcmUiCisJCSAgICAgICAiIHZlcnNpb24gb2YgY29udHJvbGxlclxuIik7CisJfQorCS8qIEdldCB0aGUgbnVtYmVyIG9mIGxvZ2ljYWwgdm9sdW1lcyAqLworCXJldHVybl9jb2RlID0gc2VuZGNtZChDSVNTX1JFUE9SVF9MT0csIGNudGxfbnVtLCBsZF9idWZmLAorCQkJICAgICAgc2l6ZW9mKFJlcG9ydEx1bkRhdGFfc3RydWN0KSwgMCwgMCwgMCwgTlVMTCwKKwkJCSAgICAgIFRZUEVfQ01EKTsKKworCWlmIChyZXR1cm5fY29kZSA9PSBJT19PSykgewogI2lmZGVmIENDSVNTX0RFQlVHCiAJCXByaW50aygiTFVOIERhdGFcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKLSNlbmRpZiAvKiBDQ0lTU19ERUJVRyAqLyAKKyNlbmRpZgkJCQkvKiBDQ0lTU19ERUJVRyAqLwogCi0JCWxpc3RsZW5ndGggfD0gKDB4ZmYgJiAodW5zaWduZWQgaW50KShsZF9idWZmLT5MVU5MaXN0TGVuZ3RoWzBdKSkgPDwgMjQ7Ci0JCWxpc3RsZW5ndGggfD0gKDB4ZmYgJiAodW5zaWduZWQgaW50KShsZF9idWZmLT5MVU5MaXN0TGVuZ3RoWzFdKSkgPDwgMTY7Ci0JCWxpc3RsZW5ndGggfD0gKDB4ZmYgJiAodW5zaWduZWQgaW50KShsZF9idWZmLT5MVU5MaXN0TGVuZ3RoWzJdKSkgPDwgODsJCisJCWxpc3RsZW5ndGggfD0KKwkJICAgICgweGZmICYgKHVuc2lnbmVkIGludCkobGRfYnVmZi0+TFVOTGlzdExlbmd0aFswXSkpIDw8IDI0OworCQlsaXN0bGVuZ3RoIHw9CisJCSAgICAoMHhmZiAmICh1bnNpZ25lZCBpbnQpKGxkX2J1ZmYtPkxVTkxpc3RMZW5ndGhbMV0pKSA8PCAxNjsKKwkJbGlzdGxlbmd0aCB8PQorCQkgICAgKDB4ZmYgJiAodW5zaWduZWQgaW50KShsZF9idWZmLT5MVU5MaXN0TGVuZ3RoWzJdKSkgPDwgODsKIAkJbGlzdGxlbmd0aCB8PSAweGZmICYgKHVuc2lnbmVkIGludCkobGRfYnVmZi0+TFVOTGlzdExlbmd0aFszXSk7Ci0JfSBlbHNlIC8qIHJlYWRpbmcgbnVtYmVyIG9mIGxvZ2ljYWwgdm9sdW1lcyBmYWlsZWQgKi8KLQl7CisJfSBlbHNlIHsJCS8qIHJlYWRpbmcgbnVtYmVyIG9mIGxvZ2ljYWwgdm9sdW1lcyBmYWlsZWQgKi8KKwogCQlwcmludGsoS0VSTl9XQVJOSU5HICJjY2lzczogcmVwb3J0IGxvZ2ljYWwgdm9sdW1lIgotCQkJIiBjb21tYW5kIGZhaWxlZFxuIik7CisJCSAgICAgICAiIGNvbW1hbmQgZmFpbGVkXG4iKTsKIAkJbGlzdGxlbmd0aCA9IDA7CiAJfQotCWhiYVtjbnRsX251bV0tPm51bV9sdW5zID0gbGlzdGxlbmd0aCAvIDg7IC8vIDggYnl0ZXMgcHJlIGVudHJ5Ci0JaWYgKGhiYVtjbnRsX251bV0tPm51bV9sdW5zID4gQ0lTU19NQVhfTFVOKQotCXsKLQkJcHJpbnRrKEtFUk5fRVJSICJjaXNzOiAgb25seSAlZCBudW1iZXIgb2YgbG9naWNhbCB2b2x1bWVzIHN1cHBvcnRlZFxuIiwKLQkJCUNJU1NfTUFYX0xVTik7CisJaGJhW2NudGxfbnVtXS0+bnVtX2x1bnMgPSBsaXN0bGVuZ3RoIC8gODsJLy8gOCBieXRlcyBwcmUgZW50cnkKKwlpZiAoaGJhW2NudGxfbnVtXS0+bnVtX2x1bnMgPiBDSVNTX01BWF9MVU4pIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiY2lzczogIG9ubHkgJWQgbnVtYmVyIG9mIGxvZ2ljYWwgdm9sdW1lcyBzdXBwb3J0ZWRcbiIsCisJCSAgICAgICBDSVNTX01BWF9MVU4pOwogCQloYmFbY250bF9udW1dLT5udW1fbHVucyA9IENJU1NfTUFYX0xVTjsKIAl9CiAjaWZkZWYgQ0NJU1NfREVCVUcKLQlwcmludGsoS0VSTl9ERUJVRyAiTGVuZ3RoID0gJXggJXggJXggJXggPSAlZFxuIiwgbGRfYnVmZi0+TFVOTGlzdExlbmd0aFswXSwKLQkJbGRfYnVmZi0+TFVOTGlzdExlbmd0aFsxXSwgbGRfYnVmZi0+TFVOTGlzdExlbmd0aFsyXSwKLQkJbGRfYnVmZi0+TFVOTGlzdExlbmd0aFszXSwgIGhiYVtjbnRsX251bV0tPm51bV9sdW5zKTsKLSNlbmRpZiAvKiBDQ0lTU19ERUJVRyAqLworCXByaW50ayhLRVJOX0RFQlVHICJMZW5ndGggPSAleCAleCAleCAleCA9ICVkXG4iLAorCSAgICAgICBsZF9idWZmLT5MVU5MaXN0TGVuZ3RoWzBdLCBsZF9idWZmLT5MVU5MaXN0TGVuZ3RoWzFdLAorCSAgICAgICBsZF9idWZmLT5MVU5MaXN0TGVuZ3RoWzJdLCBsZF9idWZmLT5MVU5MaXN0TGVuZ3RoWzNdLAorCSAgICAgICBoYmFbY250bF9udW1dLT5udW1fbHVucyk7CisjZW5kaWYJCQkJLyogQ0NJU1NfREVCVUcgKi8KIAotCWhiYVtjbnRsX251bV0tPmhpZ2hlc3RfbHVuID0gaGJhW2NudGxfbnVtXS0+bnVtX2x1bnMtMTsKLS8vCWZvcihpPTA7IGk8ICBoYmFbY250bF9udW1dLT5udW1fbHVuczsgaSsrKQotCWZvcihpPTA7IGkgPCBDSVNTX01BWF9MVU47IGkrKykKLQl7Ci0JCWlmIChpIDwgaGJhW2NudGxfbnVtXS0+bnVtX2x1bnMpewotCQkgIAlsdW5pZCA9ICgweGZmICYgKHVuc2lnbmVkIGludCkobGRfYnVmZi0+TFVOW2ldWzNdKSkKLQkJCQkgPDwgMjQ7Ci0gICAgICAgIAkJbHVuaWQgfD0gKDB4ZmYgJiAodW5zaWduZWQgaW50KShsZF9idWZmLT5MVU5baV1bMl0pKQotCQkJCSA8PCAxNjsKLSAgICAgICAgCQlsdW5pZCB8PSAoMHhmZiAmICh1bnNpZ25lZCBpbnQpKGxkX2J1ZmYtPkxVTltpXVsxXSkpCi0JCQkJIDw8IDg7Ci0gICAgICAgIAlsdW5pZCB8PSAweGZmICYgKHVuc2lnbmVkIGludCkobGRfYnVmZi0+TFVOW2ldWzBdKTsKLQkJCi0JCWhiYVtjbnRsX251bV0tPmRydltpXS5MdW5JRCA9IGx1bmlkOworCWhiYVtjbnRsX251bV0tPmhpZ2hlc3RfbHVuID0gaGJhW2NudGxfbnVtXS0+bnVtX2x1bnMgLSAxOworLy8gICAgICBmb3IoaT0wOyBpPCAgaGJhW2NudGxfbnVtXS0+bnVtX2x1bnM7IGkrKykKKwlmb3IgKGkgPSAwOyBpIDwgQ0lTU19NQVhfTFVOOyBpKyspIHsKKwkJaWYgKGkgPCBoYmFbY250bF9udW1dLT5udW1fbHVucykgeworCQkJbHVuaWQgPSAoMHhmZiAmICh1bnNpZ25lZCBpbnQpKGxkX2J1ZmYtPkxVTltpXVszXSkpCisJCQkgICAgPDwgMjQ7CisJCQlsdW5pZCB8PSAoMHhmZiAmICh1bnNpZ25lZCBpbnQpKGxkX2J1ZmYtPkxVTltpXVsyXSkpCisJCQkgICAgPDwgMTY7CisJCQlsdW5pZCB8PSAoMHhmZiAmICh1bnNpZ25lZCBpbnQpKGxkX2J1ZmYtPkxVTltpXVsxXSkpCisJCQkgICAgPDwgODsKKwkJCWx1bmlkIHw9IDB4ZmYgJiAodW5zaWduZWQgaW50KShsZF9idWZmLT5MVU5baV1bMF0pOwogCisJCQloYmFbY250bF9udW1dLT5kcnZbaV0uTHVuSUQgPSBsdW5pZDsKIAogI2lmZGVmIENDSVNTX0RFQlVHCi0JICAJcHJpbnRrKEtFUk5fREVCVUcgIkxVTlslZF06ICAleCAleCAleCAleCA9ICV4XG4iLCBpLCAKLQkJCWxkX2J1ZmYtPkxVTltpXVswXSwgbGRfYnVmZi0+TFVOW2ldWzFdLAotCQkJbGRfYnVmZi0+TFVOW2ldWzJdLCBsZF9idWZmLT5MVU5baV1bM10sCi0JCQloYmFbY250bF9udW1dLT5kcnZbaV0uTHVuSUQpOwotI2VuZGlmIC8qIENDSVNTX0RFQlVHICovCi0JCWNjaXNzX3JlYWRfY2FwYWNpdHkoY250bF9udW0sIGksIHNpemVfYnVmZiwgMCwKLQkJCSZ0b3RhbF9zaXplLCAmYmxvY2tfc2l6ZSk7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiTFVOWyVkXTogICV4ICV4ICV4ICV4ID0gJXhcbiIsIGksCisJCQkgICAgICAgbGRfYnVmZi0+TFVOW2ldWzBdLCBsZF9idWZmLT5MVU5baV1bMV0sCisJCQkgICAgICAgbGRfYnVmZi0+TFVOW2ldWzJdLCBsZF9idWZmLT5MVU5baV1bM10sCisJCQkgICAgICAgaGJhW2NudGxfbnVtXS0+ZHJ2W2ldLkx1bklEKTsKKyNlbmRpZgkJCQkvKiBDQ0lTU19ERUJVRyAqLworCQkJY2Npc3NfcmVhZF9jYXBhY2l0eShjbnRsX251bSwgaSwgc2l6ZV9idWZmLCAwLAorCQkJCQkgICAgJnRvdGFsX3NpemUsICZibG9ja19zaXplKTsKIAkJCWNjaXNzX2dlb21ldHJ5X2lucXVpcnkoY250bF9udW0sIGksIDAsIHRvdGFsX3NpemUsCi0JCQkJYmxvY2tfc2l6ZSwgaW5xX2J1ZmYsICZoYmFbY250bF9udW1dLT5kcnZbaV0pOworCQkJCQkgICAgICAgYmxvY2tfc2l6ZSwgaW5xX2J1ZmYsCisJCQkJCSAgICAgICAmaGJhW2NudGxfbnVtXS0+ZHJ2W2ldKTsKIAkJfSBlbHNlIHsKIAkJCS8qIGluaXRpYWxpemUgcmFpZF9sZXZlbCB0byBpbmRpY2F0ZSBhIGZyZWUgc3BhY2UgKi8KIAkJCWhiYVtjbnRsX251bV0tPmRydltpXS5yYWlkX2xldmVsID0gLTE7CkBAIC0zMDQyLDcgKzMwNTMsNyBAQAogCWtmcmVlKGxkX2J1ZmYpOwogCWtmcmVlKHNpemVfYnVmZik7CiAJa2ZyZWUoaW5xX2J1ZmYpOwotfQkKK30KIAogLyogRnVuY3Rpb24gdG8gZmluZCB0aGUgZmlyc3QgZnJlZSBwb2ludGVyIGludG8gb3VyIGhiYVtdIGFycmF5ICovCiAvKiBSZXR1cm5zIC0xIGlmIG5vIGZyZWUgZW50cmllcyBhcmUgbGVmdC4gICovCkBAIC0zMDU2LDcgKzMwNjcsNyBAQAogCQkJZ290byBvdXQ7CiAJfQogCi0JZm9yKGk9MDsgaTwgTUFYX0NUTFI7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBNQVhfQ1RMUjsgaSsrKSB7CiAJCWlmICghaGJhW2ldKSB7CiAJCQljdGxyX2luZm9fdCAqcDsKIAkJCXAgPSBremFsbG9jKHNpemVvZihjdGxyX2luZm9fdCksIEdGUF9LRVJORUwpOwpAQCAtMzA2OSwxMSArMzA4MCwxMSBAQAogCQl9CiAJfQogCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzOiBUaGlzIGRyaXZlciBzdXBwb3J0cyBhIG1heGltdW0iCi0JCSIgb2YgJWQgY29udHJvbGxlcnMuXG4iLCBNQVhfQ1RMUik7CisJICAgICAgICIgb2YgJWQgY29udHJvbGxlcnMuXG4iLCBNQVhfQ1RMUik7CiAJZ290byBvdXQ7Ci1Fbm9tZW06CisgICAgICBFbm9tZW06CiAJcHJpbnRrKEtFUk5fRVJSICJjY2lzczogb3V0IG9mIG1lbW9yeS5cbiIpOwotb3V0OgorICAgICAgb3V0OgogCXdoaWxlIChuLS0pCiAJCXB1dF9kaXNrKGRpc2tbbl0pOwogCXJldHVybiAtMTsKQEAgLTMwOTYsMjAgKzMxMDcsMTcgQEAKICAqICByZXR1cm5zIHRoZSBudW1iZXIgb2YgYmxvY2sgZGV2aWNlcyByZWdpc3RlcmVkLgogICovCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBjY2lzc19pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKLQljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQorCQkJCSAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQogewogCXJlcXVlc3RfcXVldWVfdCAqcTsKIAlpbnQgaTsKIAlpbnQgajsKIAlpbnQgcmM7CisJaW50IGRhYzsKIAotCXByaW50ayhLRVJOX0RFQlVHICJjY2lzczogRGV2aWNlIDB4JXggaGFzIGJlZW4gZm91bmQgYXQiCi0JCQkiIGJ1cyAlZCBkZXYgJWQgZnVuYyAlZFxuIiwKLQkJcGRldi0+ZGV2aWNlLCBwZGV2LT5idXMtPm51bWJlciwgUENJX1NMT1QocGRldi0+ZGV2Zm4pLAotCQkJUENJX0ZVTkMocGRldi0+ZGV2Zm4pKTsKIAlpID0gYWxsb2NfY2Npc3NfaGJhKCk7Ci0JaWYoaSA8IDApCi0JCXJldHVybiAoLTEpOworCWlmIChpIDwgMCkKKwkJcmV0dXJuIC0xOwogCiAJaGJhW2ldLT5idXN5X2luaXRpYWxpemluZyA9IDE7CiAKQEAgLTMxMjIsMTEgKzMxMzAsMTEgQEAKIAogCS8qIGNvbmZpZ3VyZSBQQ0kgRE1BIHN0dWZmICovCiAJaWYgKCFwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV82NEJJVF9NQVNLKSkKLQkJcHJpbnRrKCJjY2lzczogdXNpbmcgREFDIGN5Y2xlc1xuIik7CisJCWRhYyA9IDE7CiAJZWxzZSBpZiAoIXBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BXzMyQklUX01BU0spKQotCQlwcmludGsoImNjaXNzOiBub3QgdXNpbmcgREFDIGN5Y2xlc1xuIik7CisJCWRhYyA9IDA7CiAJZWxzZSB7Ci0JCXByaW50aygiY2Npc3M6IG5vIHN1aXRhYmxlIERNQSBhdmFpbGFibGVcbiIpOworCQlwcmludGsoS0VSTl9FUlIgImNjaXNzOiBubyBzdWl0YWJsZSBETUEgYXZhaWxhYmxlXG4iKTsKIAkJZ290byBjbGVhbjE7CiAJfQogCkBAIC0zMTM4LDYwICszMTQ2LDY5IEBACiAJaWYgKGkgPCBNQVhfQ1RMUl9PUklHKQogCQloYmFbaV0tPm1ham9yID0gQ09NUEFRX0NJU1NfTUFKT1IgKyBpOwogCXJjID0gcmVnaXN0ZXJfYmxrZGV2KGhiYVtpXS0+bWFqb3IsIGhiYVtpXS0+ZGV2bmFtZSk7Ci0JaWYocmMgPT0gLUVCVVNZIHx8IHJjID09IC1FSU5WQUwpIHsKKwlpZiAocmMgPT0gLUVCVVNZIHx8IHJjID09IC1FSU5WQUwpIHsKIAkJcHJpbnRrKEtFUk5fRVJSCi0JCQkiY2Npc3M6ICBVbmFibGUgdG8gZ2V0IG1ham9yIG51bWJlciAlZCBmb3IgJXMgIgotCQkJIm9uIGhiYSAlZFxuIiwgaGJhW2ldLT5tYWpvciwgaGJhW2ldLT5kZXZuYW1lLCBpKTsKKwkJICAgICAgICJjY2lzczogIFVuYWJsZSB0byBnZXQgbWFqb3IgbnVtYmVyICVkIGZvciAlcyAiCisJCSAgICAgICAib24gaGJhICVkXG4iLCBoYmFbaV0tPm1ham9yLCBoYmFbaV0tPmRldm5hbWUsIGkpOwogCQlnb3RvIGNsZWFuMTsKLQl9Ci0JZWxzZSB7CisJfSBlbHNlIHsKIAkJaWYgKGkgPj0gTUFYX0NUTFJfT1JJRykKIAkJCWhiYVtpXS0+bWFqb3IgPSByYzsKIAl9CiAKIAkvKiBtYWtlIHN1cmUgdGhlIGJvYXJkIGludGVycnVwdHMgYXJlIG9mZiAqLwogCWhiYVtpXS0+YWNjZXNzLnNldF9pbnRyX21hc2soaGJhW2ldLCBDQ0lTU19JTlRSX09GRik7Ci0JaWYoIHJlcXVlc3RfaXJxKGhiYVtpXS0+aW50cltTSU1QTEVfTU9ERV9JTlRdLCBkb19jY2lzc19pbnRyLAotCQlTQV9JTlRFUlJVUFQgfCBTQV9TSElSUSB8IFNBX1NBTVBMRV9SQU5ET00sIAotCQkJaGJhW2ldLT5kZXZuYW1lLCBoYmFbaV0pKSB7CisJaWYgKHJlcXVlc3RfaXJxKGhiYVtpXS0+aW50cltTSU1QTEVfTU9ERV9JTlRdLCBkb19jY2lzc19pbnRyLAorCQkJU0FfSU5URVJSVVBUIHwgU0FfU0hJUlEsIGhiYVtpXS0+ZGV2bmFtZSwgaGJhW2ldKSkgewogCQlwcmludGsoS0VSTl9FUlIgImNjaXNzOiBVbmFibGUgdG8gZ2V0IGlycSAlZCBmb3IgJXNcbiIsCi0JCQloYmFbaV0tPmludHJbU0lNUExFX01PREVfSU5UXSwgaGJhW2ldLT5kZXZuYW1lKTsKKwkJICAgICAgIGhiYVtpXS0+aW50cltTSU1QTEVfTU9ERV9JTlRdLCBoYmFbaV0tPmRldm5hbWUpOwogCQlnb3RvIGNsZWFuMjsKIAl9Ci0JaGJhW2ldLT5jbWRfcG9vbF9iaXRzID0ga21hbGxvYygoKE5SX0NNRFMrQklUU19QRVJfTE9ORy0xKS9CSVRTX1BFUl9MT05HKSpzaXplb2YodW5zaWduZWQgbG9uZyksIEdGUF9LRVJORUwpOwotCWhiYVtpXS0+Y21kX3Bvb2wgPSAoQ29tbWFuZExpc3Rfc3RydWN0ICopcGNpX2FsbG9jX2NvbnNpc3RlbnQoCi0JCWhiYVtpXS0+cGRldiwgTlJfQ01EUyAqIHNpemVvZihDb21tYW5kTGlzdF9zdHJ1Y3QpLCAKLQkJJihoYmFbaV0tPmNtZF9wb29sX2RoYW5kbGUpKTsKLQloYmFbaV0tPmVycmluZm9fcG9vbCA9IChFcnJvckluZm9fc3RydWN0ICopcGNpX2FsbG9jX2NvbnNpc3RlbnQoCi0JCWhiYVtpXS0+cGRldiwgTlJfQ01EUyAqIHNpemVvZiggRXJyb3JJbmZvX3N0cnVjdCksIAotCQkmKGhiYVtpXS0+ZXJyaW5mb19wb29sX2RoYW5kbGUpKTsKLQlpZigoaGJhW2ldLT5jbWRfcG9vbF9iaXRzID09IE5VTEwpIAotCQl8fCAoaGJhW2ldLT5jbWRfcG9vbCA9PSBOVUxMKQotCQl8fCAoaGJhW2ldLT5lcnJpbmZvX3Bvb2wgPT0gTlVMTCkpIHsKLSAgICAgICAgICAgICAgICBwcmludGsoIEtFUk5fRVJSICJjY2lzczogb3V0IG9mIG1lbW9yeSIpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IDwweCV4PiBhdCBQQ0kgJXMgSVJRICVkJXMgdXNpbmcgREFDXG4iLAorCSAgICAgICBoYmFbaV0tPmRldm5hbWUsIHBkZXYtPmRldmljZSwgcGNpX25hbWUocGRldiksCisJICAgICAgIGhiYVtpXS0+aW50cltTSU1QTEVfTU9ERV9JTlRdLCBkYWMgPyAiIiA6ICIgbm90Iik7CisKKwloYmFbaV0tPmNtZF9wb29sX2JpdHMgPQorCSAgICBrbWFsbG9jKCgoTlJfQ01EUyArIEJJVFNfUEVSX0xPTkcgLQorCQkgICAgICAxKSAvIEJJVFNfUEVSX0xPTkcpICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpLCBHRlBfS0VSTkVMKTsKKwloYmFbaV0tPmNtZF9wb29sID0gKENvbW1hbmRMaXN0X3N0cnVjdCAqKQorCSAgICBwY2lfYWxsb2NfY29uc2lzdGVudChoYmFbaV0tPnBkZXYsCisJCSAgICBOUl9DTURTICogc2l6ZW9mKENvbW1hbmRMaXN0X3N0cnVjdCksCisJCSAgICAmKGhiYVtpXS0+Y21kX3Bvb2xfZGhhbmRsZSkpOworCWhiYVtpXS0+ZXJyaW5mb19wb29sID0gKEVycm9ySW5mb19zdHJ1Y3QgKikKKwkgICAgcGNpX2FsbG9jX2NvbnNpc3RlbnQoaGJhW2ldLT5wZGV2LAorCQkgICAgTlJfQ01EUyAqIHNpemVvZihFcnJvckluZm9fc3RydWN0KSwKKwkJICAgICYoaGJhW2ldLT5lcnJpbmZvX3Bvb2xfZGhhbmRsZSkpOworCWlmICgoaGJhW2ldLT5jbWRfcG9vbF9iaXRzID09IE5VTEwpCisJICAgIHx8IChoYmFbaV0tPmNtZF9wb29sID09IE5VTEwpCisJICAgIHx8IChoYmFbaV0tPmVycmluZm9fcG9vbCA9PSBOVUxMKSkgeworCQlwcmludGsoS0VSTl9FUlIgImNjaXNzOiBvdXQgb2YgbWVtb3J5Iik7CiAJCWdvdG8gY2xlYW40OwogCX0KICNpZmRlZiBDT05GSUdfQ0lTU19TQ1NJX1RBUEUKLQloYmFbaV0tPnNjc2lfcmVqZWN0cy5jb21wbGV0ZSA9IAotCQlrbWFsbG9jKHNpemVvZihoYmFbaV0tPnNjc2lfcmVqZWN0cy5jb21wbGV0ZVswXSkgKiAKLQkJCShOUl9DTURTICsgNSksIEdGUF9LRVJORUwpOworCWhiYVtpXS0+c2NzaV9yZWplY3RzLmNvbXBsZXRlID0KKwkgICAga21hbGxvYyhzaXplb2YoaGJhW2ldLT5zY3NpX3JlamVjdHMuY29tcGxldGVbMF0pICoKKwkJICAgIChOUl9DTURTICsgNSksIEdGUF9LRVJORUwpOwogCWlmIChoYmFbaV0tPnNjc2lfcmVqZWN0cy5jb21wbGV0ZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRrKCBLRVJOX0VSUiAiY2Npc3M6IG91dCBvZiBtZW1vcnkiKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJjY2lzczogb3V0IG9mIG1lbW9yeSIpOwogCQlnb3RvIGNsZWFuNDsKIAl9CiAjZW5kaWYKIAlzcGluX2xvY2tfaW5pdCgmaGJhW2ldLT5sb2NrKTsKIAotCS8qIEluaXRpYWxpemUgdGhlIHBkZXYgZHJpdmVyIHByaXZhdGUgZGF0YS4gCi0JCWhhdmUgaXQgcG9pbnQgdG8gaGJhW2ldLiAgKi8KKwkvKiBJbml0aWFsaXplIHRoZSBwZGV2IGRyaXZlciBwcml2YXRlIGRhdGEuCisJICAgaGF2ZSBpdCBwb2ludCB0byBoYmFbaV0uICAqLwogCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBoYmFbaV0pOwotCS8qIGNvbW1hbmQgYW5kIGVycm9yIGluZm8gcmVjcyB6ZXJvZWQgb3V0IGJlZm9yZSAKLQkJCXRoZXkgYXJlIHVzZWQgKi8KLSAgICAgICAgbWVtc2V0KGhiYVtpXS0+Y21kX3Bvb2xfYml0cywgMCwgKChOUl9DTURTK0JJVFNfUEVSX0xPTkctMSkvQklUU19QRVJfTE9ORykqc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKKwkvKiBjb21tYW5kIGFuZCBlcnJvciBpbmZvIHJlY3MgemVyb2VkIG91dCBiZWZvcmUKKwkgICB0aGV5IGFyZSB1c2VkICovCisJbWVtc2V0KGhiYVtpXS0+Y21kX3Bvb2xfYml0cywgMCwKKwkgICAgICAgKChOUl9DTURTICsgQklUU19QRVJfTE9ORyAtCisJCSAxKSAvIEJJVFNfUEVSX0xPTkcpICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKIAotI2lmZGVmIENDSVNTX0RFQlVHCQotCXByaW50ayhLRVJOX0RFQlVHICJTY2FubmluZyBmb3IgZHJpdmVzIG9uIGNvbnRyb2xsZXIgY2Npc3MlZFxuIixpKTsKLSNlbmRpZiAvKiBDQ0lTU19ERUJVRyAqLworI2lmZGVmIENDSVNTX0RFQlVHCisJcHJpbnRrKEtFUk5fREVCVUcgIlNjYW5uaW5nIGZvciBkcml2ZXMgb24gY29udHJvbGxlciBjY2lzcyVkXG4iLCBpKTsKKyNlbmRpZgkJCQkvKiBDQ0lTU19ERUJVRyAqLwogCiAJY2Npc3NfZ2V0Z2VvbWV0cnkoaSk7CiAKQEAgLTMyMDMsMTUgKzMyMjAsMTUgQEAKIAljY2lzc19wcm9jaW5pdChpKTsKIAloYmFbaV0tPmJ1c3lfaW5pdGlhbGl6aW5nID0gMDsKIAotCWZvcihqPTA7IGogPCBOV0Q7IGorKykgeyAvKiBtZm0gKi8KKwlmb3IgKGogPSAwOyBqIDwgTldEOyBqKyspIHsJLyogbWZtICovCiAJCWRyaXZlX2luZm9fc3RydWN0ICpkcnYgPSAmKGhiYVtpXS0+ZHJ2W2pdKTsKIAkJc3RydWN0IGdlbmRpc2sgKmRpc2sgPSBoYmFbaV0tPmdlbmRpc2tbal07CiAKIAkJcSA9IGJsa19pbml0X3F1ZXVlKGRvX2NjaXNzX3JlcXVlc3QsICZoYmFbaV0tPmxvY2spOwogCQlpZiAoIXEpIHsKIAkJCXByaW50ayhLRVJOX0VSUgotCQkJICAgImNjaXNzOiAgdW5hYmxlIHRvIGFsbG9jYXRlIHF1ZXVlIGZvciBkaXNrICVkXG4iLAotCQkJICAgaik7CisJCQkgICAgICAgImNjaXNzOiAgdW5hYmxlIHRvIGFsbG9jYXRlIHF1ZXVlIGZvciBkaXNrICVkXG4iLAorCQkJICAgICAgIGopOwogCQkJYnJlYWs7CiAJCX0KIAkJZHJ2LT5xdWV1ZSA9IHE7CkBAIC0zMjQwLDkyICszMjU3LDg3IEBACiAJCWRpc2stPmRyaXZlcmZzX2RldiA9ICZwZGV2LT5kZXY7CiAJCS8qIHdlIG11c3QgcmVnaXN0ZXIgdGhlIGNvbnRyb2xsZXIgZXZlbiBpZiBubyBkaXNrcyBleGlzdCAqLwogCQkvKiB0aGlzIGlzIGZvciB0aGUgb25saW5lIGFycmF5IHV0aWxpdGllcyAqLwotCQlpZighZHJ2LT5oZWFkcyAmJiBqKQorCQlpZiAoIWRydi0+aGVhZHMgJiYgaikKIAkJCWNvbnRpbnVlOwogCQlibGtfcXVldWVfaGFyZHNlY3Rfc2l6ZShxLCBkcnYtPmJsb2NrX3NpemUpOwogCQlzZXRfY2FwYWNpdHkoZGlzaywgZHJ2LT5ucl9ibG9ja3MpOwogCQlhZGRfZGlzayhkaXNrKTsKIAl9CiAKLQlyZXR1cm4oMSk7CisJcmV0dXJuIDE7CiAKLWNsZWFuNDoKKyAgICAgIGNsZWFuNDoKICNpZmRlZiBDT05GSUdfQ0lTU19TQ1NJX1RBUEUKIAlrZnJlZShoYmFbaV0tPnNjc2lfcmVqZWN0cy5jb21wbGV0ZSk7CiAjZW5kaWYKIAlrZnJlZShoYmFbaV0tPmNtZF9wb29sX2JpdHMpOwotCWlmKGhiYVtpXS0+Y21kX3Bvb2wpCisJaWYgKGhiYVtpXS0+Y21kX3Bvb2wpCiAJCXBjaV9mcmVlX2NvbnNpc3RlbnQoaGJhW2ldLT5wZGV2LAotCQkJTlJfQ01EUyAqIHNpemVvZihDb21tYW5kTGlzdF9zdHJ1Y3QpLAotCQkJaGJhW2ldLT5jbWRfcG9vbCwgaGJhW2ldLT5jbWRfcG9vbF9kaGFuZGxlKTsKLQlpZihoYmFbaV0tPmVycmluZm9fcG9vbCkKKwkJCQkgICAgTlJfQ01EUyAqIHNpemVvZihDb21tYW5kTGlzdF9zdHJ1Y3QpLAorCQkJCSAgICBoYmFbaV0tPmNtZF9wb29sLCBoYmFbaV0tPmNtZF9wb29sX2RoYW5kbGUpOworCWlmIChoYmFbaV0tPmVycmluZm9fcG9vbCkKIAkJcGNpX2ZyZWVfY29uc2lzdGVudChoYmFbaV0tPnBkZXYsCi0JCQlOUl9DTURTICogc2l6ZW9mKCBFcnJvckluZm9fc3RydWN0KSwKLQkJCWhiYVtpXS0+ZXJyaW5mb19wb29sLAotCQkJaGJhW2ldLT5lcnJpbmZvX3Bvb2xfZGhhbmRsZSk7CisJCQkJICAgIE5SX0NNRFMgKiBzaXplb2YoRXJyb3JJbmZvX3N0cnVjdCksCisJCQkJICAgIGhiYVtpXS0+ZXJyaW5mb19wb29sLAorCQkJCSAgICBoYmFbaV0tPmVycmluZm9fcG9vbF9kaGFuZGxlKTsKIAlmcmVlX2lycShoYmFbaV0tPmludHJbU0lNUExFX01PREVfSU5UXSwgaGJhW2ldKTsKLWNsZWFuMjoKKyAgICAgIGNsZWFuMjoKIAl1bnJlZ2lzdGVyX2Jsa2RldihoYmFbaV0tPm1ham9yLCBoYmFbaV0tPmRldm5hbWUpOwotY2xlYW4xOgotCXJlbGVhc2VfaW9fbWVtKGhiYVtpXSk7CisgICAgICBjbGVhbjE6CiAJaGJhW2ldLT5idXN5X2luaXRpYWxpemluZyA9IDA7CiAJZnJlZV9oYmEoaSk7Ci0JcmV0dXJuKC0xKTsKKwlyZXR1cm4gLTE7CiB9CiAKLXN0YXRpYyB2b2lkIF9fZGV2ZXhpdCBjY2lzc19yZW1vdmVfb25lIChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBjY2lzc19yZW1vdmVfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewogCWN0bHJfaW5mb190ICp0bXBfcHRyOwogCWludCBpLCBqOwogCWNoYXIgZmx1c2hfYnVmWzRdOwotCWludCByZXR1cm5fY29kZTsgCisJaW50IHJldHVybl9jb2RlOwogCi0JaWYgKHBjaV9nZXRfZHJ2ZGF0YShwZGV2KSA9PSBOVUxMKQotCXsKLQkJcHJpbnRrKCBLRVJOX0VSUiAiY2Npc3M6IFVuYWJsZSB0byByZW1vdmUgZGV2aWNlIFxuIik7CisJaWYgKHBjaV9nZXRfZHJ2ZGF0YShwZGV2KSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiY2Npc3M6IFVuYWJsZSB0byByZW1vdmUgZGV2aWNlIFxuIik7CiAJCXJldHVybjsKIAl9CiAJdG1wX3B0ciA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlpID0gdG1wX3B0ci0+Y3RscjsKLQlpZiAoaGJhW2ldID09IE5VTEwpIAotCXsKKwlpZiAoaGJhW2ldID09IE5VTEwpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJjY2lzczogZGV2aWNlIGFwcGVhcnMgdG8gIgotCQkJImFscmVhZHkgYmUgcmVtb3ZlZCBcbiIpOworCQkgICAgICAgImFscmVhZHkgYmUgcmVtb3ZlZCBcbiIpOwogCQlyZXR1cm47CiAJfQogCS8qIFR1cm4gYm9hcmQgaW50ZXJydXB0cyBvZmYgIGFuZCBzZW5kIHRoZSBmbHVzaCBjYWNoZSBjb21tYW5kICovCiAJLyogc2VuZGNtZCB3aWxsIHR1cm4gb2ZmIGludGVycnVwdCwgYW5kIHNlbmQgdGhlIGZsdXNoLi4uCi0JKiBUbyB3cml0ZSBhbGwgZGF0YSBpbiB0aGUgYmF0dGVyeSBiYWNrZWQgY2FjaGUgdG8gZGlza3MgKi8KKwkgKiBUbyB3cml0ZSBhbGwgZGF0YSBpbiB0aGUgYmF0dGVyeSBiYWNrZWQgY2FjaGUgdG8gZGlza3MgKi8KIAltZW1zZXQoZmx1c2hfYnVmLCAwLCA0KTsKIAlyZXR1cm5fY29kZSA9IHNlbmRjbWQoQ0NJU1NfQ0FDSEVfRkxVU0gsIGksIGZsdXNoX2J1ZiwgNCwgMCwgMCwgMCwgTlVMTCwKLQkJCQlUWVBFX0NNRCk7Ci0JaWYocmV0dXJuX2NvZGUgIT0gSU9fT0spCi0JewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJFcnJvciBGbHVzaGluZyBjYWNoZSBvbiBjb250cm9sbGVyICVkXG4iLCAKLQkJCWkpOworCQkJICAgICAgVFlQRV9DTUQpOworCWlmIChyZXR1cm5fY29kZSAhPSBJT19PSykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJFcnJvciBGbHVzaGluZyBjYWNoZSBvbiBjb250cm9sbGVyICVkXG4iLAorCQkgICAgICAgaSk7CiAJfQogCWZyZWVfaXJxKGhiYVtpXS0+aW50clsyXSwgaGJhW2ldKTsKIAogI2lmZGVmIENPTkZJR19QQ0lfTVNJCi0gICAgICAgIGlmIChoYmFbaV0tPm1zaXhfdmVjdG9yKQotICAgICAgICAgICAgICAgIHBjaV9kaXNhYmxlX21zaXgoaGJhW2ldLT5wZGV2KTsKLSAgICAgICAgZWxzZSBpZiAoaGJhW2ldLT5tc2lfdmVjdG9yKQotICAgICAgICAgICAgICAgIHBjaV9kaXNhYmxlX21zaShoYmFbaV0tPnBkZXYpOwotI2VuZGlmIC8qIENPTkZJR19QQ0lfTVNJICovCisJaWYgKGhiYVtpXS0+bXNpeF92ZWN0b3IpCisJCXBjaV9kaXNhYmxlX21zaXgoaGJhW2ldLT5wZGV2KTsKKwllbHNlIGlmIChoYmFbaV0tPm1zaV92ZWN0b3IpCisJCXBjaV9kaXNhYmxlX21zaShoYmFbaV0tPnBkZXYpOworI2VuZGlmCQkJCS8qIENPTkZJR19QQ0lfTVNJICovCiAKLQlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CiAJaW91bm1hcChoYmFbaV0tPnZhZGRyKTsKLQljY2lzc191bnJlZ2lzdGVyX3Njc2koaSk7ICAvKiB1bmhvb2sgZnJvbSBTQ1NJIHN1YnN5c3RlbSAqLworCWNjaXNzX3VucmVnaXN0ZXJfc2NzaShpKTsJLyogdW5ob29rIGZyb20gU0NTSSBzdWJzeXN0ZW0gKi8KIAl1bnJlZ2lzdGVyX2Jsa2RldihoYmFbaV0tPm1ham9yLCBoYmFbaV0tPmRldm5hbWUpOwotCXJlbW92ZV9wcm9jX2VudHJ5KGhiYVtpXS0+ZGV2bmFtZSwgcHJvY19jY2lzcyk7CQotCQorCXJlbW92ZV9wcm9jX2VudHJ5KGhiYVtpXS0+ZGV2bmFtZSwgcHJvY19jY2lzcyk7CisKIAkvKiByZW1vdmUgaXQgZnJvbSB0aGUgZGlzayBsaXN0ICovCiAJZm9yIChqID0gMDsgaiA8IE5XRDsgaisrKSB7CiAJCXN0cnVjdCBnZW5kaXNrICpkaXNrID0gaGJhW2ldLT5nZW5kaXNrW2pdOwogCQlpZiAoZGlzaykgewogCQkJcmVxdWVzdF9xdWV1ZV90ICpxID0gZGlzay0+cXVldWU7CiAKLQkJCWlmIChkaXNrLT5mbGFncyAmIEdFTkhEX0ZMX1VQKSAKKwkJCWlmIChkaXNrLT5mbGFncyAmIEdFTkhEX0ZMX1VQKQogCQkJCWRlbF9nZW5kaXNrKGRpc2spOwogCQkJaWYgKHEpCiAJCQkJYmxrX2NsZWFudXBfcXVldWUocSk7CkBAIC0zMzM0LDI2ICszMzQ2LDI4IEBACiAKIAlwY2lfZnJlZV9jb25zaXN0ZW50KGhiYVtpXS0+cGRldiwgTlJfQ01EUyAqIHNpemVvZihDb21tYW5kTGlzdF9zdHJ1Y3QpLAogCQkJICAgIGhiYVtpXS0+Y21kX3Bvb2wsIGhiYVtpXS0+Y21kX3Bvb2xfZGhhbmRsZSk7Ci0JcGNpX2ZyZWVfY29uc2lzdGVudChoYmFbaV0tPnBkZXYsIE5SX0NNRFMgKiBzaXplb2YoIEVycm9ySW5mb19zdHJ1Y3QpLAotCQloYmFbaV0tPmVycmluZm9fcG9vbCwgaGJhW2ldLT5lcnJpbmZvX3Bvb2xfZGhhbmRsZSk7CisJcGNpX2ZyZWVfY29uc2lzdGVudChoYmFbaV0tPnBkZXYsIE5SX0NNRFMgKiBzaXplb2YoRXJyb3JJbmZvX3N0cnVjdCksCisJCQkgICAgaGJhW2ldLT5lcnJpbmZvX3Bvb2wsIGhiYVtpXS0+ZXJyaW5mb19wb29sX2RoYW5kbGUpOwogCWtmcmVlKGhiYVtpXS0+Y21kX3Bvb2xfYml0cyk7CiAjaWZkZWYgQ09ORklHX0NJU1NfU0NTSV9UQVBFCiAJa2ZyZWUoaGJhW2ldLT5zY3NpX3JlamVjdHMuY29tcGxldGUpOwogI2VuZGlmCi0gCXJlbGVhc2VfaW9fbWVtKGhiYVtpXSk7CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwogCWZyZWVfaGJhKGkpOwotfQkKK30KIAogc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGNjaXNzX3BjaV9kcml2ZXIgPSB7Ci0JLm5hbWUgPQkJImNjaXNzIiwKLQkucHJvYmUgPQljY2lzc19pbml0X29uZSwKLQkucmVtb3ZlID0JX19kZXZleGl0X3AoY2Npc3NfcmVtb3ZlX29uZSksCi0JLmlkX3RhYmxlID0JY2Npc3NfcGNpX2RldmljZV9pZCwgLyogaWRfdGFibGUgKi8KKwkubmFtZSA9ICJjY2lzcyIsCisJLnByb2JlID0gY2Npc3NfaW5pdF9vbmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGNjaXNzX3JlbW92ZV9vbmUpLAorCS5pZF90YWJsZSA9IGNjaXNzX3BjaV9kZXZpY2VfaWQsCS8qIGlkX3RhYmxlICovCiB9OwogCiAvKgogICogIFRoaXMgaXMgaXQuICBSZWdpc3RlciB0aGUgUENJIGRyaXZlciBpbmZvcm1hdGlvbiBmb3IgdGhlIGNhcmRzIHdlIGNvbnRyb2wKLSAqICB0aGUgT1Mgd2lsbCBjYWxsIG91ciByZWdpc3RlcmVkIHJvdXRpbmVzIHdoZW4gaXQgZmluZHMgb25lIG9mIG91ciBjYXJkcy4gCisgKiAgdGhlIE9TIHdpbGwgY2FsbCBvdXIgcmVnaXN0ZXJlZCByb3V0aW5lcyB3aGVuIGl0IGZpbmRzIG9uZSBvZiBvdXIgY2FyZHMuCiAgKi8KIHN0YXRpYyBpbnQgX19pbml0IGNjaXNzX2luaXQodm9pZCkKIHsKQEAgLTMzNjksMTIgKzMzODMsMTAgQEAKIAogCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmY2Npc3NfcGNpX2RyaXZlcik7CiAJLyogZG91YmxlIGNoZWNrIHRoYXQgYWxsIGNvbnRyb2xsZXIgZW50cnlzIGhhdmUgYmVlbiByZW1vdmVkICovCi0JZm9yIChpPTA7IGk8IE1BWF9DVExSOyBpKyspIAotCXsKLQkJaWYgKGhiYVtpXSAhPSBOVUxMKQotCQl7CisJZm9yIChpID0gMDsgaSA8IE1BWF9DVExSOyBpKyspIHsKKwkJaWYgKGhiYVtpXSAhPSBOVUxMKSB7CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICJjY2lzczogaGFkIHRvIHJlbW92ZSIKLQkJCQkJIiBjb250cm9sbGVyICVkXG4iLCBpKTsKKwkJCSAgICAgICAiIGNvbnRyb2xsZXIgJWRcbiIsIGkpOwogCQkJY2Npc3NfcmVtb3ZlX29uZShoYmFbaV0tPnBkZXYpOwogCQl9CiAJfQpAQCAtMzM4OSwyMSArMzQwMSwyMSBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlwcmludGsoS0VSTl9XQVJOSU5HICJjY2lzcyVkOiBjb250cm9sbGVyIG5vdCByZXNwb25kaW5nLlxuIiwgaC0+Y3Rscik7Ci0JaC0+YWxpdmUgPSAwOwkvKiB0aGUgY29udHJvbGxlciBhcHBhcmVudGx5IGRpZWQuLi4gKi8KKwloLT5hbGl2ZSA9IDA7CQkvKiB0aGUgY29udHJvbGxlciBhcHBhcmVudGx5IGRpZWQuLi4gKi8KIAogCXNwaW5fbG9ja19pcnFzYXZlKENDSVNTX0xPQ0soY3RsciksIGZsYWdzKTsKIAotCXBjaV9kaXNhYmxlX2RldmljZShoLT5wZGV2KTsgLyogTWFrZSBzdXJlIGl0IGlzIHJlYWxseSBkZWFkLiAqLworCXBjaV9kaXNhYmxlX2RldmljZShoLT5wZGV2KTsJLyogTWFrZSBzdXJlIGl0IGlzIHJlYWxseSBkZWFkLiAqLwogCiAJLyogbW92ZSBldmVyeXRoaW5nIG9mZiB0aGUgcmVxdWVzdCBxdWV1ZSBvbnRvIHRoZSBjb21wbGV0ZWQgcXVldWUgKi8KLQl3aGlsZSggKGMgPSBoLT5yZXFRKSAhPSBOVUxMICkgeworCXdoaWxlICgoYyA9IGgtPnJlcVEpICE9IE5VTEwpIHsKIAkJcmVtb3ZlUSgmKGgtPnJlcVEpLCBjKTsKIAkJaC0+UWRlcHRoLS07Ci0JCWFkZFEgKCYoaC0+Y21wUSksIGMpOworCQlhZGRRKCYoaC0+Y21wUSksIGMpOwogCX0KIAogCS8qIE5vdywgZmFpbCBldmVyeXRoaW5nIG9uIHRoZSBjb21wbGV0ZWQgcXVldWUgd2l0aCBhIEhXIGVycm9yICovCi0Jd2hpbGUoIChjID0gaC0+Y21wUSkgIT0gTlVMTCApIHsKKwl3aGlsZSAoKGMgPSBoLT5jbXBRKSAhPSBOVUxMKSB7CiAJCXJlbW92ZVEoJmgtPmNtcFEsIGMpOwogCQljLT5lcnJfaW5mby0+Q29tbWFuZFN0YXR1cyA9IENNRF9IQVJEV0FSRV9FUlI7CiAJCWlmIChjLT5jbWRfdHlwZSA9PSBDTURfUldSRVEpIHsKQEAgLTM0MTEsOCArMzQyMyw4IEBACiAJCX0gZWxzZSBpZiAoYy0+Y21kX3R5cGUgPT0gQ01EX0lPQ1RMX1BFTkQpCiAJCQljb21wbGV0ZShjLT53YWl0aW5nKTsKICNpZmRlZiBDT05GSUdfQ0lTU19TQ1NJX1RBUEUKLQkJCWVsc2UgaWYgKGMtPmNtZF90eXBlID09IENNRF9TQ1NJKQotCQkJCWNvbXBsZXRlX3Njc2lfY29tbWFuZChjLCAwLCAwKTsKKwkJZWxzZSBpZiAoYy0+Y21kX3R5cGUgPT0gQ01EX1NDU0kpCisJCQljb21wbGV0ZV9zY3NpX2NvbW1hbmQoYywgMCwgMCk7CiAjZW5kaWYKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShDQ0lTU19MT0NLKGN0bHIpLCBmbGFncyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2NjaXNzLmggYi9kcml2ZXJzL2Jsb2NrL2NjaXNzLmgKaW5kZXggYjI0ZmMwNS4uODY4ZTBkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9jY2lzcy5oCisrKyBiL2RyaXZlcnMvYmxvY2svY2Npc3MuaApAQCAtNjAsOCArNjAsNiBAQAogCV9fdTMyCWJvYXJkX2lkOwogCXZvaWQgX19pb21lbSAqdmFkZHI7CiAJdW5zaWduZWQgbG9uZyBwYWRkcjsKLQl1bnNpZ25lZCBsb25nIGlvX21lbV9hZGRyOwotCXVuc2lnbmVkIGxvbmcgaW9fbWVtX2xlbmd0aDsKIAlDZmdUYWJsZV9zdHJ1Y3QgX19pb21lbSAqY2ZndGFibGU7CiAJaW50CWludGVycnVwdHNfZW5hYmxlZDsKIAlpbnQJbWFqb3I7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2NwcWFycmF5LmMgYi9kcml2ZXJzL2Jsb2NrL2NwcWFycmF5LmMKaW5kZXggYjZlYTJmMC4uNWViNmZiNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9jcHFhcnJheS5jCisrKyBiL2RyaXZlcnMvYmxvY2svY3BxYXJyYXkuYwpAQCAtMzkyLDcgKzM5Miw3IEBACiB9CiAKIC8qIHBkZXYgaXMgTlVMTCBmb3IgZWlzYSAqLwotc3RhdGljIGludCBjcHFhcnJheV9yZWdpc3Rlcl9jdGxyKCBpbnQgaSwgc3RydWN0IHBjaV9kZXYgKnBkZXYpCitzdGF0aWMgaW50IF9faW5pdCBjcHFhcnJheV9yZWdpc3Rlcl9jdGxyKCBpbnQgaSwgc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7CiAJcmVxdWVzdF9xdWV1ZV90ICpxOwogCWludCBqOwpAQCAtNDEwLDggKzQxMCw3IEBACiAJfQogCWhiYVtpXS0+YWNjZXNzLnNldF9pbnRyX21hc2soaGJhW2ldLCAwKTsKIAlpZiAocmVxdWVzdF9pcnEoaGJhW2ldLT5pbnRyLCBkb19pZGFfaW50ciwKLQkJU0FfSU5URVJSVVBUfFNBX1NISVJRfFNBX1NBTVBMRV9SQU5ET00sCi0JCWhiYVtpXS0+ZGV2bmFtZSwgaGJhW2ldKSkKKwkJU0FfSU5URVJSVVBUfFNBX1NISVJRLCBoYmFbaV0tPmRldm5hbWUsIGhiYVtpXSkpCiAJewogCQlwcmludGsoS0VSTl9FUlIgImNwcWFycmF5OiBVbmFibGUgdG8gZ2V0IGlycSAlZCBmb3IgJXNcbiIsCiAJCQkJaGJhW2ldLT5pbnRyLCBoYmFbaV0tPmRldm5hbWUpOwpAQCAtNzQ1LDcgKzc0NCw3IEBACiAvKgogICogRmluZCBhbiBFSVNBIGNvbnRyb2xsZXIncyBzaWduYXR1cmUuICBTZXQgdXAgYW4gaGJhIGlmIHdlIGZpbmQgaXQuCiAgKi8KLXN0YXRpYyBpbnQgY3BxYXJyYXlfZWlzYV9kZXRlY3Qodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IGNwcWFycmF5X2Vpc2FfZGV0ZWN0KHZvaWQpCiB7CiAJaW50IGk9MCwgajsKIAlfX3UzMiBib2FyZF9pZDsKQEAgLTEwMzYsNiArMTAzNSw4IEBACiAKIAljb21wbGV0ZV9idWZmZXJzKGNtZC0+cnEtPmJpbywgb2spOwogCisJYWRkX2Rpc2tfcmFuZG9tbmVzcyhjbWQtPnJxLT5ycV9kaXNrKTsKKwogICAgICAgICBEQkdQWChwcmludGsoIkRvbmUgd2l0aCAlcFxuIiwgY21kLT5ycSk7KTsKIAllbmRfdGhhdF9yZXF1ZXN0X2xhc3QoY21kLT5ycSwgb2sgPyAxIDogLUVJTyk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL25iZC5jIGIvZHJpdmVycy9ibG9jay9uYmQuYwppbmRleCA4YmNhNDkwLi43ZjU1NGYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL25iZC5jCisrKyBiL2RyaXZlcnMvYmxvY2svbmJkLmMKQEAgLTcsMzkgKzcsOSBAQAogICogQ29weXJpZ2h0IDE5OTctMjAwMCBQYXZlbCBNYWNoZWsgPHBhdmVsQHVjdy5jej4KICAqIFBhcnRzIGNvcHlyaWdodCAyMDAxIFN0ZXZlbiBXaGl0ZWhvdXNlIDxzdGV2ZUBjaHlnd3luLmNvbT4KICAqCi0gKiAocGFydCBvZiBjb2RlIHN0b2xlbiBmcm9tIGxvb3AuYykKKyAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciBHUEx2MiBvciBsYXRlci4KICAqCi0gKiA5Ny0zLTI1IGNvbXBpbGVkIDAtdGggdmVyc2lvbiwgbm90IHlldCB0ZXN0ZWQgaXQgCi0gKiAgIChpdCBkaWQgbm90IHdvcmssIEJUVykgKGxhdGVyIHRoYXQgZGF5KSBIRVkhIGl0IHdvcmtzIQotICogICAoYml0IGxhdGVyKSBobW0sIG5vdCB0aGF0IG11Y2guLi4gMjowMGFtIG5leHQgZGF5OgotICogICB5ZXMsIGl0IHdvcmtzLCBidXQgaXQgZ2l2ZXMgc29tZXRoaW5nIGxpa2UgNTBrQi9zZWMKLSAqIDk3LTQtMDEgY29tcGxldGUgcmV3cml0ZSB0byBtYWtlIGl0IHBvc3NpYmxlIGZvciBtYW55IHJlcXVlc3RzIGF0IAotICogICBvbmNlIHRvIGJlIHByb2Nlc3NlZAotICogOTctNC0xMSBNYWtpbmcgcHJvdG9jb2wgaW5kZXBlbmRlbnQgb2YgZW5kaWFuaXR5IGV0Yy4KLSAqIDk3LTktMTMgQ29zbWV0aWMgY2hhbmdlcwotICogOTgtNS0xMyBBdHRlbXB0IHRvIG1ha2UgNjQtYml0LWNsZWFuIG9uIDY0LWJpdCBtYWNoaW5lcwotICogOTktMS0xMSBBdHRlbXB0IHRvIG1ha2UgNjQtYml0LWNsZWFuIG9uIDMyLWJpdCBtYWNoaW5lcyA8YW5rcnlAbWlmLnBnLmdkYS5wbD4KLSAqIDAxLTItMjcgRml4IHRvIHN0b3JlIHByb3BlciBibG9ja2NvdW50IGZvciBrZXJuZWwgKGNhbGN1bGF0ZWQgdXNpbmcKLSAqICAgQkxPQ0tfU0laRV9CSVRTLCBub3QgZGV2aWNlIGJsb2Nrc2l6ZSkgPGFnYUBwZXJtb25saW5lLnJ1PgotICogMDEtMy0xMSBNYWtlIG5iZCB3b3JrIHdpdGggbmV3IExpbnV4IGJsb2NrIGxheWVyIGNvZGUuIEl0IG5vdyBzdXBwb3J0cwotICogICBwbHVnZ2luZyBsaWtlIGFsbCB0aGUgb3RoZXIgYmxvY2sgZGV2aWNlcy4gQWxzbyBhZGRlZCBpbiBNU0dfTU9SRSB0bwotICogICByZWR1Y2UgbnVtYmVyIG9mIHBhcnRpYWwgVENQIHNlZ21lbnRzIHNlbnQuIDxzdGV2ZUBjaHlnd3luLmNvbT4KLSAqIDAxLTEyLTYgRml4IGRlYWRsb2NrIGNvbmRpdGlvbiBieSBtYWtpbmcgcXVldWUgbG9ja3MgaW5kZXBlbmRlbnQgb2YKLSAqICAgdGhlIHRyYW5zbWl0IGxvY2suIDxzdGV2ZUBjaHlnd3luLmNvbT4KLSAqIDAyLTEwLTExIEFsbG93IGh1bmcgeG1pdCB0byBiZSBhYm9ydGVkIHZpYSBTSUdLSUxMICYgdmFyaW91cyBmaXhlcy4KLSAqICAgPFBhdWwuQ2xlbWVudHNAU3RlZWxFeWUuY29tPiA8SmFtZXMuQm90dG9tbGV5QFN0ZWVsRXllLmNvbT4KLSAqIDAzLTA2LTIyIE1ha2UgbmJkIHdvcmsgd2l0aCBuZXcgbGludXggMi41IGJsb2NrIGxheWVyIGRlc2lnbi4gVGhpcyBmaXhlcwotICogICBtZW1vcnkgY29ycnVwdGlvbiBmcm9tIG1vZHVsZSByZW1vdmFsIGFuZCBwb3NzaWJsZSBtZW1vcnkgY29ycnVwdGlvbgotICogICBmcm9tIHNlbmRpbmcvcmVjZWl2aW5nIGRpc2sgZGF0YS4gPGxkbEBhcm9zLm5ldD4KLSAqIDAzLTA2LTIzIENvc21ldGljIGNoYW5nZXMuIDxsZGxAYXJvcy5uZXQ+Ci0gKiAwMy0wNi0yMyBFbmhhbmNlIGRpYWdub3N0aWNzIHN1cHBvcnQuIDxsZGxAYXJvcy5uZXQ+Ci0gKiAwMy0wNi0yNCBSZW1vdmUgdW5uZWVkZWQgYmxrc2l6ZV9iaXRzIGZpZWxkIGZyb20gbmJkX2RldmljZSBzdHJ1Y3QuCi0gKiAgIDxsZGxAYXJvcy5uZXQ+Ci0gKiAwMy0wNi0yNCBDbGVhbnVwIFBBUkFOT0lBIHVzYWdlICYgY29kZS4gPGxkbEBhcm9zLm5ldD4KLSAqIDA0LTAyLTE5IFJlbW92ZSBQQVJBTk9JQSwgcGx1cyB2YXJpb3VzIGNsZWFudXBzIChQYXVsIENsZW1lbnRzKQotICogcG9zc2libGUgRklYTUU6IG1ha2Ugc2V0X3NvY2sgLyBzZXRfYmxrc2l6ZSAvIHNldF9zaXplIC8gZG9faXQgb25lIHN5c2NhbGwKLSAqIHdoeSBub3Q6IHdvdWxkIG5lZWQgYWNjZXNzX29rIGFuZCBmcmllbmRzLCB3b3VsZCBzaGFyZSB5ZXQgYW5vdGhlcgotICogICAgICAgICAgc3RydWN0dXJlIHdpdGggdXNlcmxhbmQKKyAqIChwYXJ0IG9mIGNvZGUgc3RvbGVuIGZyb20gbG9vcC5jKQogICovCiAKICNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibHVldG9vdGgvZHRsMV9jcy5jIGIvZHJpdmVycy9ibHVldG9vdGgvZHRsMV9jcy5jCmluZGV4IGE3MWEyNDAuLmVkOGRjYTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmx1ZXRvb3RoL2R0bDFfY3MuYworKysgYi9kcml2ZXJzL2JsdWV0b290aC9kdGwxX2NzLmMKQEAgLTQyMyw2ICs0MjMsOSBAQAogCW5zaC5sZW4gPSBza2ItPmxlbjsKIAogCXMgPSBidF9za2JfYWxsb2MoTlNITCArIHNrYi0+bGVuICsgMSwgR0ZQX0FUT01JQyk7CisJaWYgKCFzKQorCQlyZXR1cm4gLUVOT01FTTsKKwogCXNrYl9yZXNlcnZlKHMsIE5TSEwpOwogCW1lbWNweShza2JfcHV0KHMsIHNrYi0+bGVuKSwgc2tiLT5kYXRhLCBza2ItPmxlbik7CiAJaWYgKHNrYi0+bGVuICYgMHgwMDAxKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jZHJvbS9tY2R4LmMgYi9kcml2ZXJzL2Nkcm9tL21jZHguYwppbmRleCBhMGI1ODBjLi4wZjZlN2FhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nkcm9tL21jZHguYworKysgYi9kcml2ZXJzL2Nkcm9tL21jZHguYwpAQCAtMTAwNiw3ICsxMDA2LDcgQEAKIAogLyogTU9EVUxFIFNUVUZGICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1pbnQgX19tY2R4X2luaXQodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IF9fbWNkeF9pbml0KHZvaWQpCiB7CiAJaW50IGk7CiAJaW50IGRyaXZlcyA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvS2NvbmZpZyBiL2RyaXZlcnMvY2hhci9LY29uZmlnCmluZGV4IDc4ZDkyOGYuLjM2MTBjNTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9LY29uZmlnCisrKyBiL2RyaXZlcnMvY2hhci9LY29uZmlnCkBAIC02Miw2ICs2MiwyMyBAQAogCWRlcGVuZHMgb24gVlQgJiYgIVMzOTAgJiYgIVVNTAogCWRlZmF1bHQgeQogCitjb25maWcgVlRfSFdfQ09OU09MRV9CSU5ESU5HCisgICAgICAgYm9vbCAiU3VwcG9ydCBmb3IgYmluZGluZyBhbmQgdW5iaW5kaW5nIGNvbnNvbGUgZHJpdmVycyIKKyAgICAgICBkZXBlbmRzIG9uIEhXX0NPTlNPTEUKKyAgICAgICBkZWZhdWx0IG4KKyAgICAgICAtLS1oZWxwLS0tCisgICAgICAgICBUaGUgdmlydHVhbCB0ZXJtaW5hbCBpcyB0aGUgZGV2aWNlIHRoYXQgaW50ZXJhY3RzIHdpdGggdGhlIHBoeXNpY2FsCisgICAgICAgICB0ZXJtaW5hbCB0aHJvdWdoIGNvbnNvbGUgZHJpdmVycy4gT24gdGhlc2Ugc3lzdGVtcywgYXQgbGVhc3Qgb25lCisgICAgICAgICBjb25zb2xlIGRyaXZlciBpcyBsb2FkZWQuIEluIG90aGVyIGNvbmZpZ3VyYXRpb25zLCBhZGRpdGlvbmFsIGNvbnNvbGUKKyAgICAgICAgIGRyaXZlcnMgbWF5IGJlIGVuYWJsZWQsIHN1Y2ggYXMgdGhlIGZyYW1lYnVmZmVyIGNvbnNvbGUuIElmIG1vcmUgdGhhbgorICAgICAgICAgMSBjb25zb2xlIGRyaXZlciBpcyBlbmFibGVkLCBzZXR0aW5nIHRoaXMgdG8gJ3knIHdpbGwgYWxsb3cgeW91IHRvCisgICAgICAgICBzZWxlY3QgdGhlIGNvbnNvbGUgZHJpdmVyIHRoYXQgd2lsbCBzZXJ2ZSBhcyB0aGUgYmFja2VuZCBmb3IgdGhlCisgICAgICAgICB2aXJ0dWFsIHRlcm1pbmFscy4KKworCSBTZWUgPGZpbGU6RG9jdW1lbnRhdGlvbi9jb25zb2xlL2NvbnNvbGUudHh0PiBmb3IgbW9yZQorCSBpbmZvcm1hdGlvbi4gRm9yIGZyYW1lYnVmZmVyIGNvbnNvbGUgdXNlcnMsIHBsZWFzZSByZWZlciB0bworCSA8ZmlsZTpEb2N1bWVudGF0aW9uL2ZiL2ZiY29uLnR4dD4uCisKIGNvbmZpZyBTRVJJQUxfTk9OU1RBTkRBUkQKIAlib29sICJOb24tc3RhbmRhcmQgc2VyaWFsIHBvcnQgc3VwcG9ydCIKIAktLS1oZWxwLS0tCkBAIC02NzAsMjAgKzY4Nyw3IEBACiAKIAkgIElmIHlvdSdyZSBub3Qgc3VyZSwgc2F5IE4uCiAKLWNvbmZpZyBIV19SQU5ET00KLQl0cmlzdGF0ZSAiSW50ZWwvQU1EL1ZJQSBIVyBSYW5kb20gTnVtYmVyIEdlbmVyYXRvciBzdXBwb3J0IgotCWRlcGVuZHMgb24gKFg4NiB8fCBJQTY0KSAmJiBQQ0kKLQktLS1oZWxwLS0tCi0JICBUaGlzIGRyaXZlciBwcm92aWRlcyBrZXJuZWwtc2lkZSBzdXBwb3J0IGZvciB0aGUgUmFuZG9tIE51bWJlcgotCSAgR2VuZXJhdG9yIGhhcmR3YXJlIGZvdW5kIG9uIEludGVsIGk4eHgtYmFzZWQgbW90aGVyYm9hcmRzLAotCSAgQU1EIDc2eC1iYXNlZCBtb3RoZXJib2FyZHMsIGFuZCBWaWEgTmVoZW1pYWggQ1BVcy4KLQotCSAgUHJvdmlkZXMgYSBjaGFyYWN0ZXIgZHJpdmVyLCB1c2VkIHRvIHJlYWQoKSBlbnRyb3B5IGRhdGEuCi0KLQkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQotCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGh3X3JhbmRvbS4KLQotCSAgSWYgdW5zdXJlLCBzYXkgTi4KK3NvdXJjZSAiZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9LY29uZmlnIgogCiBjb25maWcgTlZSQU0KIAl0cmlzdGF0ZSAiL2Rldi9udnJhbSBzdXBwb3J0IgpAQCAtODY1LDYgKzg2OSw3IEBACiBjb25maWcgVEFOQkFDX1RCMDIxOQogCXRyaXN0YXRlICJUQU5CQUMgVEIwMjE5IGJhc2UgYm9hcmQgc3VwcG9ydCIKIAlkZXBlbmRzIFRBTkJBQ19UQjAyMlgKKwlzZWxlY3QgR1BJT19WUjQxWFgKIAogbWVudSAiRnRhcGUsIHRoZSBmbG9wcHkgdGFwZSBkZXZpY2UgZHJpdmVyIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvTWFrZWZpbGUgYi9kcml2ZXJzL2NoYXIvTWFrZWZpbGUKaW5kZXggZmI5MTliZi4uNTI0MTA1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvY2hhci9NYWtlZmlsZQpAQCAtNzUsNyArNzUsNyBAQAogb2JqLSQoQ09ORklHX1RPU0hJQkEpCQkrPSB0b3NoaWJhLm8KIG9iai0kKENPTkZJR19JOEspCQkrPSBpOGsubwogb2JqLSQoQ09ORklHX0RTMTYyMCkJCSs9IGRzMTYyMC5vCi1vYmotJChDT05GSUdfSFdfUkFORE9NKQkJKz0gaHdfcmFuZG9tLm8KK29iai0kKENPTkZJR19IV19SQU5ET00pCQkrPSBod19yYW5kb20vCiBvYmotJChDT05GSUdfRlRBUEUpCQkrPSBmdGFwZS8KIG9iai0kKENPTkZJR19DT0JBTFRfTENEKQkrPSBsY2Qubwogb2JqLSQoQ09ORklHX1BQREVWKQkJKz0gcHBkZXYubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2FncC9LY29uZmlnIGIvZHJpdmVycy9jaGFyL2FncC9LY29uZmlnCmluZGV4IDQ2Njg1YTUuLjk4MjZhMzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9hZ3AvS2NvbmZpZworKysgYi9kcml2ZXJzL2NoYXIvYWdwL0tjb25maWcKQEAgLTU1LDkgKzU1LDkgQEAKIAkgIFggb24gQU1EIElyb25nYXRlLCA3NjEsIGFuZCA3NjIgY2hpcHNldHMuCiAKIGNvbmZpZyBBR1BfQU1ENjQKLQl0cmlzdGF0ZSAiQU1EIE9wdGVyb24vQXRobG9uNjQgb24tQ1BVIEdBUlQgc3VwcG9ydCIgaWYgIUdBUlRfSU9NTVUKKwl0cmlzdGF0ZSAiQU1EIE9wdGVyb24vQXRobG9uNjQgb24tQ1BVIEdBUlQgc3VwcG9ydCIgaWYgIUlPTU1VCiAJZGVwZW5kcyBvbiBBR1AgJiYgWDg2Ci0JZGVmYXVsdCB5IGlmIEdBUlRfSU9NTVUKKwlkZWZhdWx0IHkgaWYgSU9NTVUKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBnaXZlcyB5b3UgQUdQIHN1cHBvcnQgZm9yIHRoZSBHTFggY29tcG9uZW50IG9mCiAJICBYIHVzaW5nIHRoZSBvbi1DUFUgbm9ydGhicmlkZ2Ugb2YgdGhlIEFNRCBBdGhsb242NC9PcHRlcm9uIENQVXMuCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL2FtZC1rNy1hZ3AuYyBiL2RyaXZlcnMvY2hhci9hZ3AvYW1kLWs3LWFncC5jCmluZGV4IDFmNzc2NjUuLjUxZDBkNTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9hZ3AvYW1kLWs3LWFncC5jCisrKyBiL2RyaXZlcnMvY2hhci9hZ3AvYW1kLWs3LWFncC5jCkBAIC0xMTgsNyArMTE4LDcgQEAKIAlyZXR1cm4gcmV0dmFsOwogfQogCi0vKiBTaW5jZSB3ZSBkb24ndCBuZWVkIGNvbnRpZ2lvdXMgbWVtb3J5IHdlIGp1c3QgdHJ5CisvKiBTaW5jZSB3ZSBkb24ndCBuZWVkIGNvbnRpZ3VvdXMgbWVtb3J5IHdlIGp1c3QgdHJ5CiAgKiB0byBnZXQgdGhlIGdhdHQgdGFibGUgb25jZQogICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hZ3AvYW1kNjQtYWdwLmMgYi9kcml2ZXJzL2NoYXIvYWdwL2FtZDY0LWFncC5jCmluZGV4IGFjM2MzM2EuLmY2OTBlZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9hZ3AvYW1kNjQtYWdwLmMKKysrIGIvZHJpdmVycy9jaGFyL2FncC9hbWQ2NC1hZ3AuYwpAQCAtMTUsMTEgKzE1LDkgQEAKICNpbmNsdWRlIDxsaW51eC9hZ3BfYmFja2VuZC5oPgogI2luY2x1ZGUgPGxpbnV4L21tem9uZS5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CQkvKiBQQUdFX1NJWkUgKi8KKyNpbmNsdWRlIDxhc20vazguaD4KICNpbmNsdWRlICJhZ3AuaCIKIAotLyogV2lsbCBuZWVkIHRvIGJlIGluY3JlYXNlZCBpZiBBTUQ2NCBldmVyIGdvZXMgPjgtd2F5LiAqLwotI2RlZmluZSBNQVhfSEFNTUVSX0dBUlRTICAgOAotCiAvKiBQVEUgYml0cy4gKi8KICNkZWZpbmUgR1BURV9WQUxJRAkxCiAjZGVmaW5lIEdQVEVfQ09IRVJFTlQJMgpAQCAtNTMsMjggKzUxLDEyIEBACiAjZGVmaW5lIFVMSV9YODZfNjRfSFRUX0ZFQV9SRUcJCTB4NTAKICNkZWZpbmUgVUxJX1g4Nl82NF9FTlVfU0NSX1JFRwkJMHg1NAogCi1zdGF0aWMgaW50IG5yX2dhcnRzOwotc3RhdGljIHN0cnVjdCBwY2lfZGV2ICogaGFtbWVyc1tNQVhfSEFNTUVSX0dBUlRTXTsKLQogc3RhdGljIHN0cnVjdCByZXNvdXJjZSAqYXBlcnR1cmVfcmVzb3VyY2U7CiBzdGF0aWMgaW50IF9faW5pdGRhdGEgYWdwX3RyeV91bnN1cHBvcnRlZCA9IDE7CiAKLSNkZWZpbmUgZm9yX2VhY2hfbmIoKSBmb3IoZ2FydF9pdGVyYXRvcj0wO2dhcnRfaXRlcmF0b3I8bnJfZ2FydHM7Z2FydF9pdGVyYXRvcisrKQotCi1zdGF0aWMgdm9pZCBmbHVzaF9hbWQ2NF90bGIoc3RydWN0IHBjaV9kZXYgKmRldikKLXsKLQl1MzIgdG1wOwotCi0JcGNpX3JlYWRfY29uZmlnX2R3b3JkIChkZXYsIEFNRDY0X0dBUlRDQUNIRUNUTCwgJnRtcCk7Ci0JdG1wIHw9IElOVkdBUlQ7Ci0JcGNpX3dyaXRlX2NvbmZpZ19kd29yZCAoZGV2LCBBTUQ2NF9HQVJUQ0FDSEVDVEwsIHRtcCk7Ci19Ci0KIHN0YXRpYyB2b2lkIGFtZDY0X3RsYmZsdXNoKHN0cnVjdCBhZ3BfbWVtb3J5ICp0ZW1wKQogewotCWludCBnYXJ0X2l0ZXJhdG9yOwotCWZvcl9lYWNoX25iKCkKLQkJZmx1c2hfYW1kNjRfdGxiKGhhbW1lcnNbZ2FydF9pdGVyYXRvcl0pOworCWs4X2ZsdXNoX2dhcnRzKCk7CiB9CiAKIHN0YXRpYyBpbnQgYW1kNjRfaW5zZXJ0X21lbW9yeShzdHJ1Y3QgYWdwX21lbW9yeSAqbWVtLCBvZmZfdCBwZ19zdGFydCwgaW50IHR5cGUpCkBAIC0xNTMsNyArMTM1LDcgQEAKIAl1MzIgdGVtcDsKIAlzdHJ1Y3QgYXBlcl9zaXplX2luZm9fMzIgKnZhbHVlczsKIAotCWRldiA9IGhhbW1lcnNbMF07CisJZGV2ID0gazhfbm9ydGhicmlkZ2VzWzBdOwogCWlmIChkZXY9PU5VTEwpCiAJCXJldHVybiAwOwogCkBAIC0yMDEsOSArMTgzLDYgQEAKIAl0bXAgJj0gfihESVNHQVJUQ1BVIHwgRElTR0FSVElPKTsKIAlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGhhbW1lciwgQU1ENjRfR0FSVEFQRVJUVVJFQ1RMLCB0bXApOwogCi0JLyoga2VlcCBDUFUncyBjb2hlcmVudC4gKi8KLQlmbHVzaF9hbWQ2NF90bGIgKGhhbW1lcik7Ci0KIAlyZXR1cm4gYXBlcl9iYXNlOwogfQogCkBAIC0yMjIsMTMgKzIwMSwxNCBAQAogc3RhdGljIGludCBhbWRfODE1MV9jb25maWd1cmUodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIGdhdHRfYnVzID0gdmlydF90b19nYXJ0KGFncF9icmlkZ2UtPmdhdHRfdGFibGVfcmVhbCk7Ci0JaW50IGdhcnRfaXRlcmF0b3I7CisJaW50IGk7CiAKIAkvKiBDb25maWd1cmUgQUdQIHJlZ3MgaW4gZWFjaCB4ODYtNjQgaG9zdCBicmlkZ2UuICovCi0JZm9yX2VhY2hfbmIoKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fazhfbm9ydGhicmlkZ2VzOyBpKyspIHsKIAkJYWdwX2JyaWRnZS0+Z2FydF9idXNfYWRkciA9Ci0JCQkJYW1kNjRfY29uZmlndXJlKGhhbW1lcnNbZ2FydF9pdGVyYXRvcl0sZ2F0dF9idXMpOworCQkJCWFtZDY0X2NvbmZpZ3VyZShrOF9ub3J0aGJyaWRnZXNbaV0sIGdhdHRfYnVzKTsKIAl9CisJazhfZmx1c2hfZ2FydHMoKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjM2LDEyICsyMTYsMTMgQEAKIHN0YXRpYyB2b2lkIGFtZDY0X2NsZWFudXAodm9pZCkKIHsKIAl1MzIgdG1wOwotCWludCBnYXJ0X2l0ZXJhdG9yOwotCWZvcl9lYWNoX25iKCkgeworCWludCBpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX2s4X25vcnRoYnJpZGdlczsgaSsrKSB7CisJCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBrOF9ub3J0aGJyaWRnZXNbaV07CiAJCS8qIGRpc2FibGUgZ2FydCB0cmFuc2xhdGlvbiAqLwotCQlwY2lfcmVhZF9jb25maWdfZHdvcmQgKGhhbW1lcnNbZ2FydF9pdGVyYXRvcl0sIEFNRDY0X0dBUlRBUEVSVFVSRUNUTCwgJnRtcCk7CisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZCAoZGV2LCBBTUQ2NF9HQVJUQVBFUlRVUkVDVEwsICZ0bXApOwogCQl0bXAgJj0gfkFNRDY0X0dBUlRFTjsKLQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZCAoaGFtbWVyc1tnYXJ0X2l0ZXJhdG9yXSwgQU1ENjRfR0FSVEFQRVJUVVJFQ1RMLCB0bXApOworCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkIChkZXYsIEFNRDY0X0dBUlRBUEVSVFVSRUNUTCwgdG1wKTsKIAl9CiB9CiAKQEAgLTMxMSw3ICsyOTIsNyBAQAogLyoKICAqIFcqcyBjZW50cmljIEJJT1Mgc29tZXRpbWVzIG9ubHkgc2V0IHVwIHRoZSBhcGVydHVyZSBpbiB0aGUgQUdQCiAgKiBicmlkZ2UsIG5vdCB0aGUgbm9ydGhicmlkZ2UuIE9uIEFNRDY0IHRoaXMgaXMgaGFuZGxlZCBlYXJseQotICogaW4gYXBlcnR1cmUuYywgYnV0IHdoZW4gR0FSVF9JT01NVSBpcyBub3QgZW5hYmxlZCBvciB3ZSBydW4KKyAqIGluIGFwZXJ0dXJlLmMsIGJ1dCB3aGVuIElPTU1VIGlzIG5vdCBlbmFibGVkIG9yIHdlIHJ1bgogICogb24gYSAzMmJpdCBrZXJuZWwgdGhpcyBuZWVkcyB0byBiZSByZWRvbmUuCiAgKiBVbmZvcnR1bmF0ZWx5IGl0IGlzIGltcG9zc2libGUgdG8gZml4IHRoZSBhcGVydHVyZSBoZXJlIGJlY2F1c2UgaXQncyB0b28gbGF0ZQogICogdG8gYWxsb2NhdGUgdGhhdCBtdWNoIG1lbW9yeS4gQnV0IGF0IGxlYXN0IGVycm9yIG91dCBjbGVhbmx5IGluc3RlYWQgb2YKQEAgLTM2MSwxNyArMzQyLDE1IEBACiAKIHN0YXRpYyBfX2RldmluaXQgaW50IGNhY2hlX25icyAoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHUzMiBjYXBfcHRyKQogewotCXN0cnVjdCBwY2lfZGV2ICpsb29wX2RldiA9IE5VTEw7Ci0JaW50IGkgPSAwOworCWludCBpOwogCi0JLyogY2FjaGUgcGNpX2RldnMgb2Ygbm9ydGhicmlkZ2VzLiAqLwotCXdoaWxlICgobG9vcF9kZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0FNRCwgMHgxMTAzLCBsb29wX2RldikpCi0JCQkhPSBOVUxMKSB7Ci0JCWlmIChpID09IE1BWF9IQU1NRVJfR0FSVFMpIHsKLQkJCXByaW50ayhLRVJOX0VSUiBQRlggIlRvbyBtYW55IG5vcnRoYnJpZGdlcyBmb3IgQUdQXG4iKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlpZiAoZml4X25vcnRoYnJpZGdlKGxvb3BfZGV2LCBwZGV2LCBjYXBfcHRyKSA8IDApIHsKKwlpZiAoY2FjaGVfazhfbm9ydGhicmlkZ2VzKCkgPCAwKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWkgPSAwOworCWZvciAoaSA9IDA7IGkgPCBudW1fazhfbm9ydGhicmlkZ2VzOyBpKyspIHsKKwkJc3RydWN0IHBjaV9kZXYgKmRldiA9IGs4X25vcnRoYnJpZGdlc1tpXTsKKwkJaWYgKGZpeF9ub3J0aGJyaWRnZShkZXYsIHBkZXYsIGNhcF9wdHIpIDwgMCkgewogCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiTm8gdXNhYmxlIGFwZXJ0dXJlIGZvdW5kLlxuIik7CiAjaWZkZWYgX194ODZfNjRfXwogCQkJLyogc2hvdWxkIHBvcnQgdGhpcyB0byBpMzg2ICovCkBAIC0zNzksMTAgKzM1OCw4IEBACiAjZW5kaWYKIAkJCXJldHVybiAtMTsKIAkJfQotCQloYW1tZXJzW2krK10gPSBsb29wX2RldjsKIAl9Ci0JCW5yX2dhcnRzID0gaTsKLQlyZXR1cm4gaSA9PSAwID8gLTEgOiAwOworCXJldHVybiAwOwogfQogCiAvKiBIYW5kbGUgQU1EIDgxNTEgcXVpcmtzICovCkBAIC00NTAsNyArNDI3LDcgQEAKIAl9CiAKIAkvKiBzaGFkb3cgeDg2LTY0IHJlZ2lzdGVycyBpbnRvIFVMaSByZWdpc3RlcnMgKi8KLQlwY2lfcmVhZF9jb25maWdfZHdvcmQgKGhhbW1lcnNbMF0sIEFNRDY0X0dBUlRBUEVSVFVSRUJBU0UsICZodHRmZWEpOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZCAoazhfbm9ydGhicmlkZ2VzWzBdLCBBTUQ2NF9HQVJUQVBFUlRVUkVCQVNFLCAmaHR0ZmVhKTsKIAogCS8qIGlmIHg4Ni02NCBhcGVydHVyZSBiYXNlIGlzIGJleW9uZCA0RywgZXhpdCBoZXJlICovCiAJaWYgKChodHRmZWEgJiAweDdmZmYpID4+ICgzMiAtIDI1KSkKQEAgLTUxMyw3ICs0OTAsNyBAQAogCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2MSwgTlZJRElBX1g4Nl82NF8xX0FQU0laRSwgdG1wKTsKIAogCS8qIHNoYWRvdyB4ODYtNjQgcmVnaXN0ZXJzIGludG8gTlZJRElBIHJlZ2lzdGVycyAqLwotCXBjaV9yZWFkX2NvbmZpZ19kd29yZCAoaGFtbWVyc1swXSwgQU1ENjRfR0FSVEFQRVJUVVJFQkFTRSwgJmFwYmFzZSk7CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkIChrOF9ub3J0aGJyaWRnZXNbMF0sIEFNRDY0X0dBUlRBUEVSVFVSRUJBU0UsICZhcGJhc2UpOwogCiAJLyogaWYgeDg2LTY0IGFwZXJ0dXJlIGJhc2UgaXMgYmV5b25kIDRHLCBleGl0IGhlcmUgKi8KIAlpZiAoIChhcGJhc2UgJiAweDdmZmYpID4+ICgzMiAtIDI1KSApIHsKQEAgLTc1NCwxMCArNzMxLDYgQEAKIGludCBfX2luaXQgYWdwX2FtZDY0X2luaXQodm9pZCkKIHsKIAlpbnQgZXJyID0gMDsKLQlzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgYW1kNjRuYltdID0gewotCQl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9BTUQsIDB4MTEwMykgfSwKLQkJeyB9LAotCX07CiAKIAlpZiAoYWdwX29mZikKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC03NzQsNyArNzQ3LDcgQEAKIAkJfQogCiAJCS8qIEZpcnN0IGNoZWNrIHRoYXQgd2UgaGF2ZSBhdCBsZWFzdCBvbmUgQU1ENjQgTkIgKi8KLQkJaWYgKCFwY2lfZGV2X3ByZXNlbnQoYW1kNjRuYikpCisJCWlmICghcGNpX2Rldl9wcmVzZW50KGs4X25iX2lkcykpCiAJCQlyZXR1cm4gLUVOT0RFVjsKIAogCQkvKiBMb29rIGZvciBhbnkgQUdQIGJyaWRnZSAqLwpAQCAtODAyLDcgKzc3NSw3IEBACiAKIC8qIE9uIEFNRDY0IHRoZSBQQ0kgZHJpdmVyIG5lZWRzIHRvIGluaXRpYWxpemUgdGhpcyBkcml2ZXIgZWFybHkKICAgIGZvciB0aGUgSU9NTVUsIHNvIGl0IGhhcyB0byBiZSBjYWxsZWQgdmlhIGEgYmFja2Rvb3IuICovCi0jaWZuZGVmIENPTkZJR19HQVJUX0lPTU1VCisjaWZuZGVmIENPTkZJR19JT01NVQogbW9kdWxlX2luaXQoYWdwX2FtZDY0X2luaXQpOwogbW9kdWxlX2V4aXQoYWdwX2FtZDY0X2NsZWFudXApOwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL2F0aS1hZ3AuYyBiL2RyaXZlcnMvY2hhci9hZ3AvYXRpLWFncC5jCmluZGV4IDA2ZmQxMGIuLjE2MDU2NDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9hZ3AvYXRpLWFncC5jCisrKyBiL2RyaXZlcnMvY2hhci9hZ3AvYXRpLWFncC5jCkBAIC0yNjEsNyArMjYxLDcgQEAKICNlbmRpZgogCiAvKgotICpTaW5jZSB3ZSBkb24ndCBuZWVkIGNvbnRpZ2lvdXMgbWVtb3J5IHdlIGp1c3QgdHJ5CisgKlNpbmNlIHdlIGRvbid0IG5lZWQgY29udGlndW91cyBtZW1vcnkgd2UganVzdCB0cnkKICAqIHRvIGdldCB0aGUgZ2F0dCB0YWJsZSBvbmNlCiAgKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2FncC9lZmZpY2Vvbi1hZ3AuYyBiL2RyaXZlcnMvY2hhci9hZ3AvZWZmaWNlb24tYWdwLmMKaW5kZXggODZhOTY2Yi4uYjc4OGIwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2FncC9lZmZpY2Vvbi1hZ3AuYworKysgYi9kcml2ZXJzL2NoYXIvYWdwL2VmZmljZW9uLWFncC5jCkBAIC0xNzcsNyArMTc3LDcgQEAKIAogCiAvKgotICogU2luY2Ugd2UgZG9uJ3QgbmVlZCBjb250aWdpb3VzIG1lbW9yeSB3ZSBqdXN0IHRyeQorICogU2luY2Ugd2UgZG9uJ3QgbmVlZCBjb250aWd1b3VzIG1lbW9yeSB3ZSBqdXN0IHRyeQogICogdG8gZ2V0IHRoZSBnYXR0IHRhYmxlIG9uY2UKICAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYXBwbGljb20uYyBiL2RyaXZlcnMvY2hhci9hcHBsaWNvbS5jCmluZGV4IGEzNzBlN2EuLjkyNzVkNWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9hcHBsaWNvbS5jCisrKyBiL2RyaXZlcnMvY2hhci9hcHBsaWNvbS5jCkBAIC0xNjYsMTEgKzE2Niw3IEBACiAJcmV0dXJuIGJvYXJkbm8gKyAxOwogfQogCi0jaWZkZWYgTU9EVUxFCi0KLSNkZWZpbmUgYXBwbGljb21faW5pdCBpbml0X21vZHVsZQotCi12b2lkIGNsZWFudXBfbW9kdWxlKHZvaWQpCitzdGF0aWMgdm9pZCBfX2V4aXQgYXBwbGljb21fZXhpdCh2b2lkKQogewogCXVuc2lnbmVkIGludCBpOwogCkBAIC0xODgsOSArMTg0LDcgQEAKIAl9CiB9CiAKLSNlbmRpZgkJCQkvKiBNT0RVTEUgKi8KLQotaW50IF9faW5pdCBhcHBsaWNvbV9pbml0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBhcHBsaWNvbV9pbml0KHZvaWQpCiB7CiAJaW50IGksIG51bWlzYSA9IDA7CiAJc3RydWN0IHBjaV9kZXYgKmRldiA9IE5VTEw7CkBAIC0zNTUsMTAgKzM0OSw5IEBACiAJcmV0dXJuIHJldDsKIH0KIAorbW9kdWxlX2luaXQoYXBwbGljb21faW5pdCk7Cittb2R1bGVfZXhpdChhcHBsaWNvbV9leGl0KTsKIAotI2lmbmRlZiBNT0RVTEUKLV9faW5pdGNhbGwoYXBwbGljb21faW5pdCk7Ci0jZW5kaWYKIAogc3RhdGljIHNzaXplX3QgYWNfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICogcHBvcykKIHsKQEAgLTg1MSwyOCArODQ0LDMgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2lmbmRlZiBNT0RVTEUKLXN0YXRpYyBpbnQgX19pbml0IGFwcGxpY29tX3NldHVwKGNoYXIgKnN0cikKLXsKLQlpbnQgaW50c1s0XTsKLQotCSh2b2lkKSBnZXRfb3B0aW9ucyhzdHIsIDQsIGludHMpOwotCi0JaWYgKGludHNbMF0gPiAyKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIlRvbyBtYW55IGFyZ3VtZW50cyB0byAnYXBwbGljb209JywgZXhwZWN0ZWQgbWVtLGlycSBvbmx5LlxuIik7Ci0JfQotCi0JaWYgKGludHNbMF0gPCAyKSB7Ci0JCXByaW50ayhLRVJOX0lORk8iYXBwbGljb20gbnVtYXJnczogJWRcbiIsIGludHNbMF0pOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQltZW0gPSBpbnRzWzFdOwotCWlycSA9IGludHNbMl07Ci0JcmV0dXJuIDE7Ci19Ci0KLV9fc2V0dXAoImFwcGxpY29tPSIsIGFwcGxpY29tX3NldHVwKTsKLQotI2VuZGlmCQkJCS8qIE1PRFVMRSAqLwotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvY3ljbGFkZXMuYyBiL2RyaXZlcnMvY2hhci9jeWNsYWRlcy5jCmluZGV4IGNjN2FjZjguLjEyMmU3YTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9jeWNsYWRlcy5jCisrKyBiL2RyaXZlcnMvY2hhci9jeWNsYWRlcy5jCkBAIC0yODMzLDkgKzI4MzMsOCBAQAogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAgICAgICAgIAotICAgIGlmICghdHR5IHx8ICFpbmZvLT54bWl0X2J1ZiB8fCAhdG1wX2J1Zil7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KKyAgICBpZiAoIWluZm8tPnhtaXRfYnVmIHx8ICF0bXBfYnVmKQorCXJldHVybiAwOwogCiAgICAgQ1lfTE9DSyhpbmZvLCBmbGFncyk7CiAgICAgd2hpbGUgKDEpIHsKQEAgLTI4ODQsNyArMjg4Myw3IEBACiAgICAgaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJjeV9wdXRfY2hhciIpKQogICAgICAgICByZXR1cm47CiAKLSAgICBpZiAoIXR0eSB8fCAhaW5mby0+eG1pdF9idWYpCisgICAgaWYgKCFpbmZvLT54bWl0X2J1ZikKICAgICAgICAgcmV0dXJuOwogCiAgICAgQ1lfTE9DSyhpbmZvLCBmbGFncyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZXNwLmMgYi9kcml2ZXJzL2NoYXIvZXNwLmMKaW5kZXggMDlkYzRiMC4uOTIyMTc0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2VzcC5jCisrKyBiL2RyaXZlcnMvY2hhci9lc3AuYwpAQCAtMTIxMiw3ICsxMjEyLDcgQEAKIAlpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgInJzX3B1dF9jaGFyIikpCiAJCXJldHVybjsKIAotCWlmICghdHR5IHx8ICFpbmZvLT54bWl0X2J1ZikKKwlpZiAoIWluZm8tPnhtaXRfYnVmKQogCQlyZXR1cm47CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOwpAQCAtMTI1Niw3ICsxMjU2LDcgQEAKIAlpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgInJzX3dyaXRlIikpCiAJCXJldHVybiAwOwogCi0JaWYgKCF0dHkgfHwgIWluZm8tPnhtaXRfYnVmKQorCWlmICghaW5mby0+eG1pdF9idWYpCiAJCXJldHVybiAwOwogCSAgICAKIAl3aGlsZSAoMSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2hhbmdjaGVjay10aW1lci5jIGIvZHJpdmVycy9jaGFyL2hhbmdjaGVjay10aW1lci5jCmluZGV4IGFjNjI2NDEuLmQ2OWYyYWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9oYW5nY2hlY2stdGltZXIuYworKysgYi9kcml2ZXJzL2NoYXIvaGFuZ2NoZWNrLXRpbWVyLmMKQEAgLTExNywxMiArMTE3LDEyIEBACiBfX3NldHVwKCJoY2hlY2tfZHVtcF90YXNrcyIsIGhhbmdjaGVja19wYXJzZV9kdW1wX3Rhc2tzKTsKICNlbmRpZiAvKiBub3QgTU9EVUxFICovCiAKLSNpZiBkZWZpbmVkKENPTkZJR19YODYpIHx8IGRlZmluZWQoQ09ORklHX1MzOTApCisjaWYgZGVmaW5lZChDT05GSUdfWDg2XzY0KSB8fCBkZWZpbmVkKENPTkZJR19TMzkwKQogIyBkZWZpbmUgSEFWRV9NT05PVE9OSUMKICMgZGVmaW5lIFRJTUVSX0ZSRVEgMTAwMDAwMDAwMFVMTAogI2VsaWYgZGVmaW5lZChDT05GSUdfSUE2NCkKICMgZGVmaW5lIFRJTUVSX0ZSRVEgKCh1bnNpZ25lZCBsb25nIGxvbmcpbG9jYWxfY3B1X2RhdGEtPml0Y19mcmVxKQotI2VsaWYgZGVmaW5lZChDT05GSUdfUFBDNjQpCisjZWxzZQogIyBkZWZpbmUgVElNRVJfRlJFUSAoSFoqbG9vcHNfcGVyX2ppZmZ5KQogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9od19yYW5kb20uYyBiL2RyaXZlcnMvY2hhci9od19yYW5kb20uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjlkYzg3ZS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2OTggKzAsMCBAQAotLyoKLSAgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgdGhlIEFNRCBHZW9kZSBMWCBSTkcKLQkoYykgQ29weXJpZ2h0IDIwMDQtMjAwNSBBZHZhbmNlZCBNaWNybyBEZXZpY2VzLCBJbmMuCi0KLQlkZXJpdmVkIGZyb20KLQotIAlIYXJkd2FyZSBkcml2ZXIgZm9yIHRoZSBJbnRlbC9BTUQvVklBIFJhbmRvbSBOdW1iZXIgR2VuZXJhdG9ycyAoUk5HKQotCShjKSBDb3B5cmlnaHQgMjAwMyBSZWQgSGF0IEluYyA8amdhcnppa0ByZWRoYXQuY29tPgotIAotIAlkZXJpdmVkIGZyb20KLSAKLSAgICAgICAgSGFyZHdhcmUgZHJpdmVyIGZvciB0aGUgQU1EIDc2OCBSYW5kb20gTnVtYmVyIEdlbmVyYXRvciAoUk5HKQotICAgICAgICAoYykgQ29weXJpZ2h0IDIwMDEgUmVkIEhhdCBJbmMgPGFsYW5AcmVkaGF0LmNvbT4KLQotIAlkZXJpdmVkIGZyb20KLSAKLQlIYXJkd2FyZSBkcml2ZXIgZm9yIEludGVsIGk4MTAgUmFuZG9tIE51bWJlciBHZW5lcmF0b3IgKFJORykKLQlDb3B5cmlnaHQgMjAwMCwyMDAxIEplZmYgR2FyemlrIDxqZ2FyemlrQHBvYm94LmNvbT4KLQlDb3B5cmlnaHQgMjAwMCwyMDAxIFBoaWxpcHAgUnVtcGYgPHBydW1wZkBtYW5kcmFrZXNvZnQuY29tPgotCi0JUGxlYXNlIHJlYWQgRG9jdW1lbnRhdGlvbi9od19yYW5kb20udHh0IGZvciBkZXRhaWxzIG9uIHVzZS4KLQotCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCi0gICAgICAgIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCi0KLSAqLwotCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgotI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLQotI2lmZGVmIF9faTM4Nl9fCi0jaW5jbHVkZSA8YXNtL21zci5oPgotI2luY2x1ZGUgPGFzbS9jcHVmZWF0dXJlLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0KLQotLyoKLSAqIGNvcmUgbW9kdWxlIGFuZCB2ZXJzaW9uIGluZm9ybWF0aW9uCi0gKi8KLSNkZWZpbmUgUk5HX1ZFUlNJT04gIjEuMC4wIgotI2RlZmluZSBSTkdfTU9EVUxFX05BTUUgImh3X3JhbmRvbSIKLSNkZWZpbmUgUk5HX0RSSVZFUl9OQU1FICAgUk5HX01PRFVMRV9OQU1FICIgaGFyZHdhcmUgZHJpdmVyICIgUk5HX1ZFUlNJT04KLSNkZWZpbmUgUEZYIFJOR19NT0RVTEVfTkFNRSAiOiAiCi0KLQotLyoKLSAqIGRlYnVnZ2luZyBtYWNyb3MKLSAqLwotCi0vKiBwcl9kZWJ1ZygpIGNvbGxhcHNlcyB0byBhIG5vLW9wIGlmIERFQlVHIGlzIG5vdCBkZWZpbmVkICovCi0jZGVmaW5lIERQUklOVEsoZm10LCBhcmdzLi4uKSBwcl9kZWJ1ZyhQRlggIiVzOiAiIGZtdCwgX19GVU5DVElPTl9fICwgIyMgYXJncykKLQotCi0jdW5kZWYgUk5HX05ERUJVRyAgICAgICAgLyogZGVmaW5lIHRvIGVuYWJsZSBsaWdodHdlaWdodCBydW50aW1lIGNoZWNrcyAqLwotI2lmZGVmIFJOR19OREVCVUcKLSNkZWZpbmUgYXNzZXJ0KGV4cHIpCQkJCQkJCVwKLQkJaWYoIShleHByKSkgewkJCQkJCVwKLQkJcHJpbnRrKEtFUk5fREVCVUcgUEZYICJBc3NlcnRpb24gZmFpbGVkISAlcywlcywlcywiCVwKLQkJImxpbmU9JWRcbiIsICNleHByLCBfX0ZJTEVfXywgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7CVwKLQkJfQotI2Vsc2UKLSNkZWZpbmUgYXNzZXJ0KGV4cHIpCi0jZW5kaWYKLQotI2RlZmluZSBSTkdfTUlTQ0RFVl9NSU5PUgkJMTgzIC8qIG9mZmljaWFsICovCi0KLXN0YXRpYyBpbnQgcm5nX2Rldl9vcGVuIChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCk7Ci1zdGF0aWMgc3NpemVfdCBybmdfZGV2X3JlYWQgKHN0cnVjdCBmaWxlICpmaWxwLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3Qgc2l6ZSwKLQkJCQlsb2ZmX3QgKiBvZmZwKTsKLQotc3RhdGljIGludCBfX2luaXQgaW50ZWxfaW5pdCAoc3RydWN0IHBjaV9kZXYgKmRldik7Ci1zdGF0aWMgdm9pZCBpbnRlbF9jbGVhbnVwKHZvaWQpOwotc3RhdGljIHVuc2lnbmVkIGludCBpbnRlbF9kYXRhX3ByZXNlbnQgKHZvaWQpOwotc3RhdGljIHUzMiBpbnRlbF9kYXRhX3JlYWQgKHZvaWQpOwotCi1zdGF0aWMgaW50IF9faW5pdCBhbWRfaW5pdCAoc3RydWN0IHBjaV9kZXYgKmRldik7Ci1zdGF0aWMgdm9pZCBhbWRfY2xlYW51cCh2b2lkKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgYW1kX2RhdGFfcHJlc2VudCAodm9pZCk7Ci1zdGF0aWMgdTMyIGFtZF9kYXRhX3JlYWQgKHZvaWQpOwotCi0jaWZkZWYgX19pMzg2X18KLXN0YXRpYyBpbnQgX19pbml0IHZpYV9pbml0KHN0cnVjdCBwY2lfZGV2ICpkZXYpOwotc3RhdGljIHZvaWQgdmlhX2NsZWFudXAodm9pZCk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IHZpYV9kYXRhX3ByZXNlbnQgKHZvaWQpOwotc3RhdGljIHUzMiB2aWFfZGF0YV9yZWFkICh2b2lkKTsKLSNlbmRpZgotCi1zdGF0aWMgaW50IF9faW5pdCBnZW9kZV9pbml0KHN0cnVjdCBwY2lfZGV2ICpkZXYpOwotc3RhdGljIHZvaWQgZ2VvZGVfY2xlYW51cCh2b2lkKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgZ2VvZGVfZGF0YV9wcmVzZW50ICh2b2lkKTsKLXN0YXRpYyB1MzIgZ2VvZGVfZGF0YV9yZWFkICh2b2lkKTsKLQotc3RydWN0IHJuZ19vcGVyYXRpb25zIHsKLQlpbnQgKCppbml0KSAoc3RydWN0IHBjaV9kZXYgKmRldik7Ci0Jdm9pZCAoKmNsZWFudXApICh2b2lkKTsKLQl1bnNpZ25lZCBpbnQgKCpkYXRhX3ByZXNlbnQpICh2b2lkKTsKLQl1MzIgKCpkYXRhX3JlYWQpICh2b2lkKTsKLQl1bnNpZ25lZCBpbnQgbl9ieXRlczsgLyogbnVtYmVyIG9mIGJ5dGVzIHBlciAtPmRhdGFfcmVhZCAqLwotfTsKLXN0YXRpYyBzdHJ1Y3Qgcm5nX29wZXJhdGlvbnMgKnJuZ19vcHM7Ci0KLXN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJuZ19jaHJkZXZfb3BzID0gewotCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkub3BlbgkJPSBybmdfZGV2X29wZW4sCi0JLnJlYWQJCT0gcm5nX2Rldl9yZWFkLAotfTsKLQotCi1zdGF0aWMgc3RydWN0IG1pc2NkZXZpY2Ugcm5nX21pc2NkZXYgPSB7Ci0JUk5HX01JU0NERVZfTUlOT1IsCi0JUk5HX01PRFVMRV9OQU1FLAotCSZybmdfY2hyZGV2X29wcywKLX07Ci0KLWVudW0gewotCXJuZ19od19ub25lLAotCXJuZ19od19pbnRlbCwKLQlybmdfaHdfYW1kLAotI2lmZGVmIF9faTM4Nl9fCi0Jcm5nX2h3X3ZpYSwKLSNlbmRpZgotCXJuZ19od19nZW9kZSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgcm5nX29wZXJhdGlvbnMgcm5nX3ZlbmRvcl9vcHNbXSA9IHsKLQkvKiBybmdfaHdfbm9uZSAqLwotCXsgfSwKLQotCS8qIHJuZ19od19pbnRlbCAqLwotCXsgaW50ZWxfaW5pdCwgaW50ZWxfY2xlYW51cCwgaW50ZWxfZGF0YV9wcmVzZW50LAotCSAgaW50ZWxfZGF0YV9yZWFkLCAxIH0sCi0KLQkvKiBybmdfaHdfYW1kICovCi0JeyBhbWRfaW5pdCwgYW1kX2NsZWFudXAsIGFtZF9kYXRhX3ByZXNlbnQsIGFtZF9kYXRhX3JlYWQsIDQgfSwKLQotI2lmZGVmIF9faTM4Nl9fCi0JLyogcm5nX2h3X3ZpYSAqLwotCXsgdmlhX2luaXQsIHZpYV9jbGVhbnVwLCB2aWFfZGF0YV9wcmVzZW50LCB2aWFfZGF0YV9yZWFkLCAxIH0sCi0jZW5kaWYKLQotCS8qIHJuZ19od19nZW9kZSAqLwotCXsgZ2VvZGVfaW5pdCwgZ2VvZGVfY2xlYW51cCwgZ2VvZGVfZGF0YV9wcmVzZW50LCBnZW9kZV9kYXRhX3JlYWQsIDQgfQotfTsKLQotLyoKLSAqIERhdGEgZm9yIFBDSSBkcml2ZXIgaW50ZXJmYWNlCi0gKgotICogVGhpcyBkYXRhIG9ubHkgZXhpc3RzIGZvciBleHBvcnRpbmcgdGhlIHN1cHBvcnRlZAotICogUENJIGlkcyB2aWEgTU9EVUxFX0RFVklDRV9UQUJMRS4gIFdlIGRvIG5vdCBhY3R1YWxseQotICogcmVnaXN0ZXIgYSBwY2lfZHJpdmVyLCBiZWNhdXNlIHNvbWVvbmUgZWxzZSBtaWdodCBvbmUgZGF5Ci0gKiB3YW50IHRvIHJlZ2lzdGVyIGFub3RoZXIgZHJpdmVyIG9uIHRoZSBzYW1lIFBDSSBpZC4KLSAqLwotc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHJuZ19wY2lfdGJsW10gPSB7Ci0JeyAweDEwMjIsIDB4NzQ0MywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgcm5nX2h3X2FtZCB9LAotCXsgMHgxMDIyLCAweDc0NmIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIHJuZ19od19hbWQgfSwKLQotCXsgMHg4MDg2LCAweDI0MTgsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIHJuZ19od19pbnRlbCB9LAotCXsgMHg4MDg2LCAweDI0MjgsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIHJuZ19od19pbnRlbCB9LAotCXsgMHg4MDg2LCAweDI0MzAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIHJuZ19od19pbnRlbCB9LAotCXsgMHg4MDg2LCAweDI0NDgsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIHJuZ19od19pbnRlbCB9LAotCXsgMHg4MDg2LCAweDI0NGUsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIHJuZ19od19pbnRlbCB9LAotCXsgMHg4MDg2LCAweDI0NWUsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIHJuZ19od19pbnRlbCB9LAotCi0JeyBQQ0lfVkVORE9SX0lEX0FNRCwgUENJX0RFVklDRV9JRF9BTURfTFhfQUVTLAotCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgcm5nX2h3X2dlb2RlIH0sCi0KLQl7IDAsIH0sCS8qIHRlcm1pbmF0ZSBsaXN0ICovCi19OwotTU9EVUxFX0RFVklDRV9UQUJMRSAocGNpLCBybmdfcGNpX3RibCk7Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogSW50ZWwgUk5HIG9wZXJhdGlvbnMKLSAqCi0gKi8KLQotLyoKLSAqIFJORyByZWdpc3RlcnMgKG9mZnNldHMgZnJvbSBybmdfbWVtKQotICovCi0jZGVmaW5lIElOVEVMX1JOR19IV19TVEFUVVMJCQkwCi0jZGVmaW5lICAgICAgICAgSU5URUxfUk5HX1BSRVNFTlQJCTB4NDAKLSNkZWZpbmUgICAgICAgICBJTlRFTF9STkdfRU5BQkxFRAkJMHgwMQotI2RlZmluZSBJTlRFTF9STkdfU1RBVFVTCQkJMQotI2RlZmluZSAgICAgICAgIElOVEVMX1JOR19EQVRBX1BSRVNFTlQJCTB4MDEKLSNkZWZpbmUgSU5URUxfUk5HX0RBVEEJCQkJMgotCi0vKgotICogTWFnaWMgYWRkcmVzcyBhdCB3aGljaCBJbnRlbCBQQ0kgYnJpZGdlcyBsb2NhdGUgdGhlIFJORwotICovCi0jZGVmaW5lIElOVEVMX1JOR19BRERSCQkJCTB4RkZCQzAxNUYKLSNkZWZpbmUgSU5URUxfUk5HX0FERFJfTEVOCQkJMwotCi0vKiB0b2tlbiB0byBvdXIgaW9yZW1hcCdkIFJORyByZWdpc3RlciBhcmVhICovCi1zdGF0aWMgdm9pZCBfX2lvbWVtICpybmdfbWVtOwotCi1zdGF0aWMgaW5saW5lIHU4IGludGVsX2h3c3RhdHVzICh2b2lkKQotewotCWFzc2VydCAocm5nX21lbSAhPSBOVUxMKTsKLQlyZXR1cm4gcmVhZGIgKHJuZ19tZW0gKyBJTlRFTF9STkdfSFdfU1RBVFVTKTsKLX0KLQotc3RhdGljIGlubGluZSB1OCBpbnRlbF9od3N0YXR1c19zZXQgKHU4IGh3X3N0YXR1cykKLXsKLQlhc3NlcnQgKHJuZ19tZW0gIT0gTlVMTCk7Ci0Jd3JpdGViIChod19zdGF0dXMsIHJuZ19tZW0gKyBJTlRFTF9STkdfSFdfU1RBVFVTKTsKLQlyZXR1cm4gaW50ZWxfaHdzdGF0dXMgKCk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgaW50ZWxfZGF0YV9wcmVzZW50KHZvaWQpCi17Ci0JYXNzZXJ0IChybmdfbWVtICE9IE5VTEwpOwotCi0JcmV0dXJuIChyZWFkYiAocm5nX21lbSArIElOVEVMX1JOR19TVEFUVVMpICYgSU5URUxfUk5HX0RBVEFfUFJFU0VOVCkgPwotCQkxIDogMDsKLX0KLQotc3RhdGljIHUzMiBpbnRlbF9kYXRhX3JlYWQodm9pZCkKLXsKLQlhc3NlcnQgKHJuZ19tZW0gIT0gTlVMTCk7Ci0KLQlyZXR1cm4gcmVhZGIgKHJuZ19tZW0gKyBJTlRFTF9STkdfREFUQSk7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IGludGVsX2luaXQgKHN0cnVjdCBwY2lfZGV2ICpkZXYpCi17Ci0JaW50IHJjOwotCXU4IGh3X3N0YXR1czsKLQotCURQUklOVEsgKCJFTlRFUlxuIik7Ci0KLQlybmdfbWVtID0gaW9yZW1hcCAoSU5URUxfUk5HX0FERFIsIElOVEVMX1JOR19BRERSX0xFTik7Ci0JaWYgKHJuZ19tZW0gPT0gTlVMTCkgewotCQlwcmludGsgKEtFUk5fRVJSIFBGWCAiY2Fubm90IGlvcmVtYXAgUk5HIE1lbW9yeVxuIik7Ci0JCXJjID0gLUVCVVNZOwotCQlnb3RvIGVycl9vdXQ7Ci0JfQotCi0JLyogQ2hlY2sgZm9yIEludGVsIDgyODAyICovCi0JaHdfc3RhdHVzID0gaW50ZWxfaHdzdGF0dXMgKCk7Ci0JaWYgKChod19zdGF0dXMgJiBJTlRFTF9STkdfUFJFU0VOVCkgPT0gMCkgewotCQlwcmludGsgKEtFUk5fRVJSIFBGWCAiUk5HIG5vdCBkZXRlY3RlZFxuIik7Ci0JCXJjID0gLUVOT0RFVjsKLQkJZ290byBlcnJfb3V0X2ZyZWVfbWFwOwotCX0KLQotCS8qIHR1cm4gUk5HIGgvdyBvbiwgaWYgaXQncyBvZmYgKi8KLQlpZiAoKGh3X3N0YXR1cyAmIElOVEVMX1JOR19FTkFCTEVEKSA9PSAwKQotCQlod19zdGF0dXMgPSBpbnRlbF9od3N0YXR1c19zZXQgKGh3X3N0YXR1cyB8IElOVEVMX1JOR19FTkFCTEVEKTsKLQlpZiAoKGh3X3N0YXR1cyAmIElOVEVMX1JOR19FTkFCTEVEKSA9PSAwKSB7Ci0JCXByaW50ayAoS0VSTl9FUlIgUEZYICJjYW5ub3QgZW5hYmxlIFJORywgYWJvcnRpbmdcbiIpOwotCQlyYyA9IC1FSU87Ci0JCWdvdG8gZXJyX291dF9mcmVlX21hcDsKLQl9Ci0KLQlEUFJJTlRLICgiRVhJVCwgcmV0dXJuaW5nIDBcbiIpOwotCXJldHVybiAwOwotCi1lcnJfb3V0X2ZyZWVfbWFwOgotCWlvdW5tYXAgKHJuZ19tZW0pOwotCXJuZ19tZW0gPSBOVUxMOwotZXJyX291dDoKLQlEUFJJTlRLICgiRVhJVCwgcmV0dXJuaW5nICVkXG4iLCByYyk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgdm9pZCBpbnRlbF9jbGVhbnVwKHZvaWQpCi17Ci0JdTggaHdfc3RhdHVzOwotCi0JaHdfc3RhdHVzID0gaW50ZWxfaHdzdGF0dXMgKCk7Ci0JaWYgKGh3X3N0YXR1cyAmIElOVEVMX1JOR19FTkFCTEVEKQotCQlpbnRlbF9od3N0YXR1c19zZXQgKGh3X3N0YXR1cyAmIH5JTlRFTF9STkdfRU5BQkxFRCk7Ci0JZWxzZQotCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAidW51c3VhbDogUk5HIGFscmVhZHkgZGlzYWJsZWRcbiIpOwotCWlvdW5tYXAocm5nX21lbSk7Ci0Jcm5nX21lbSA9IE5VTEw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEFNRCBSTkcgb3BlcmF0aW9ucwotICoKLSAqLwotCi1zdGF0aWMgdTMyIHBtYmFzZTsJCQkvKiBQTXh4IEkvTyBiYXNlICovCi1zdGF0aWMgc3RydWN0IHBjaV9kZXYgKmFtZF9kZXY7Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgYW1kX2RhdGFfcHJlc2VudCAodm9pZCkKLXsKLSAgICAgIAlyZXR1cm4gaW5sKHBtYmFzZSArIDB4RjQpICYgMTsKLX0KLQotCi1zdGF0aWMgdTMyIGFtZF9kYXRhX3JlYWQgKHZvaWQpCi17Ci0JcmV0dXJuIGlubChwbWJhc2UgKyAweEYwKTsKLX0KLQotc3RhdGljIGludCBfX2luaXQgYW1kX2luaXQgKHN0cnVjdCBwY2lfZGV2ICpkZXYpCi17Ci0JaW50IHJjOwotCXU4IHJuZW47Ci0KLQlEUFJJTlRLICgiRU5URVJcbiIpOwotCi0JcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgMHg1OCwgJnBtYmFzZSk7Ci0KLQlwbWJhc2UgJj0gMHgwMDAwRkYwMDsKLQotCWlmIChwbWJhc2UgPT0gMCkKLQl7Ci0JCXByaW50ayAoS0VSTl9FUlIgUEZYICJwb3dlciBtYW5hZ2VtZW50IGJhc2Ugbm90IHNldFxuIik7Ci0JCXJjID0gLUVJTzsKLQkJZ290byBlcnJfb3V0OwotCX0KLQotCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgMHg0MCwgJnJuZW4pOwotCXJuZW4gfD0gKDEgPDwgNyk7CS8qIFJORyBvbiAqLwotCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NDAsIHJuZW4pOwotCi0JcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweDQxLCAmcm5lbik7Ci0Jcm5lbiB8PSAoMSA8PCA3KTsJLyogUE1JTyBlbmFibGUgKi8KLQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDQxLCBybmVuKTsKLQotCXByX2luZm8oIFBGWCAiQU1ENzY4IHN5c3RlbSBtYW5hZ2VtZW50IEkvTyByZWdpc3RlcnMgYXQgMHglWC5cbiIsCi0JCQlwbWJhc2UpOwotCi0JYW1kX2RldiA9IGRldjsKLQotCURQUklOVEsgKCJFWElULCByZXR1cm5pbmcgMFxuIik7Ci0JcmV0dXJuIDA7Ci0KLWVycl9vdXQ6Ci0JRFBSSU5USyAoIkVYSVQsIHJldHVybmluZyAlZFxuIiwgcmMpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHZvaWQgYW1kX2NsZWFudXAodm9pZCkKLXsKLQl1OCBybmVuOwotCi0JcGNpX3JlYWRfY29uZmlnX2J5dGUoYW1kX2RldiwgMHg0MCwgJnJuZW4pOwotCXJuZW4gJj0gfigxIDw8IDcpOwkvKiBSTkcgb2ZmICovCi0JcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGFtZF9kZXYsIDB4NDAsIHJuZW4pOwotCi0JLyogRklYTUU6IHR3aWRkbGUgcG1pbywgYWxzbz8gKi8KLX0KLQotI2lmZGVmIF9faTM4Nl9fCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBWSUEgUk5HIG9wZXJhdGlvbnMKLSAqCi0gKi8KLQotZW51bSB7Ci0JVklBX1NUUkZJTFRfQ05UX1NISUZUCT0gMTYsCi0JVklBX1NUUkZJTFRfRkFJTAk9ICgxIDw8IDE1KSwKLQlWSUFfU1RSRklMVF9FTkFCTEUJPSAoMSA8PCAxNCksCi0JVklBX1JBV0JJVFNfRU5BQkxFCT0gKDEgPDwgMTMpLAotCVZJQV9STkdfRU5BQkxFCQk9ICgxIDw8IDYpLAotCVZJQV9YU1RPUkVfQ05UX01BU0sJPSAweDBGLAotCi0JVklBX1JOR19DSFVOS184CQk9IDB4MDAsCS8qIDY0IHJhbmQgYml0cywgNjQgc3RvcmVkIGJpdHMgKi8KLQlWSUFfUk5HX0NIVU5LXzQJCT0gMHgwMSwJLyogMzIgcmFuZCBiaXRzLCAzMiBzdG9yZWQgYml0cyAqLwotCVZJQV9STkdfQ0hVTktfNF9NQVNLCT0gMHhGRkZGRkZGRiwKLQlWSUFfUk5HX0NIVU5LXzIJCT0gMHgwMiwJLyogMTYgcmFuZCBiaXRzLCAzMiBzdG9yZWQgYml0cyAqLwotCVZJQV9STkdfQ0hVTktfMl9NQVNLCT0gMHhGRkZGLAotCVZJQV9STkdfQ0hVTktfMQkJPSAweDAzLAkvKiA4IHJhbmQgYml0cywgMzIgc3RvcmVkIGJpdHMgKi8KLQlWSUFfUk5HX0NIVU5LXzFfTUFTSwk9IDB4RkYsCi19OwotCi1zdGF0aWMgdTMyIHZpYV9ybmdfZGF0dW07Ci0KLS8qCi0gKiBJbnZlc3RpZ2F0ZSB1c2luZyB0aGUgJ3JlcCcgcHJlZml4IHRvIG9idGFpbiAzMiBiaXRzIG9mIHJhbmRvbSBkYXRhCi0gKiBpbiBvbmUgaW5zbi4gIFRoZSB1cHNpZGUgaXMgcG90ZW50aWFsbHkgYmV0dGVyIHBlcmZvcm1hbmNlLiAgVGhlCi0gKiBkb3duc2lkZSBpcyB0aGF0IHRoZSBpbnN0cnVjdGlvbiBiZWNvbWVzIG5vIGxvbmdlciBhdG9taWMuICBEdWUgdG8KLSAqIHRoaXMsIGp1c3QgbGlrZSBmYW1pbGlhciBpc3N1ZXMgd2l0aCAvZGV2L3JhbmRvbSBpdHNlbGYsIHRoZSB3b3JzdAotICogY2FzZSBvZiBhICdyZXAgeHN0b3JlJyBjb3VsZCBwb3RlbnRpYWxseSBwYXVzZSBhIGNwdSBmb3IgYW4KLSAqIHVucmVhc29uYWJseSBsb25nIHRpbWUuICBJbiBwcmFjdGljZSwgdGhpcyBjb25kaXRpb24gd291bGQgbGlrZWx5Ci0gKiBvbmx5IG9jY3VyIHdoZW4gdGhlIGhhcmR3YXJlIGlzIGZhaWxpbmcuICAob3Igc28gd2UgaG9wZSA6KSkKLSAqCi0gKiBBbm90aGVyIHBvc3NpYmxlIHBlcmZvcm1hbmNlIGJvb3N0IG1heSBjb21lIGZyb20gc2ltcGx5IGJ1ZmZlcmluZwotICogdW50aWwgd2UgaGF2ZSA0IGJ5dGVzLCB0aHVzIHJldHVybmluZyBhIHUzMiBhdCBhIHRpbWUsCi0gKiBpbnN0ZWFkIG9mIHRoZSBjdXJyZW50IHU4LWF0LWEtdGltZS4KLSAqLwotCi1zdGF0aWMgaW5saW5lIHUzMiB4c3RvcmUodTMyICphZGRyLCB1MzIgZWR4X2luKQotewotCXUzMiBlYXhfb3V0OwotCi0JYXNtKCIuYnl0ZSAweDBGLDB4QTcsMHhDMCAvKiB4c3RvcmUgJSVlZGkgKGFkZHI9JTApICovIgotCQk6Ij1tIigqYWRkciksICI9YSIoZWF4X291dCkKLQkJOiJEIihhZGRyKSwgImQiKGVkeF9pbikpOwotCi0JcmV0dXJuIGVheF9vdXQ7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgdmlhX2RhdGFfcHJlc2VudCh2b2lkKQotewotCXUzMiBieXRlc19vdXQ7Ci0KLQkvKiBXZSBjaG9vc2UgdGhlIHJlY29tbWVuZGVkIDEtYnl0ZS1wZXItaW5zdHJ1Y3Rpb24gUk5HIHJhdGUsCi0JICogZm9yIGdyZWF0ZXIgcmFuZG9tbmVzcyBhdCB0aGUgZXhwZW5zZSBvZiBzcGVlZC4gIExhcmdlcgotCSAqIHZhbHVlcyAyLCA0LCBvciA4IGJ5dGVzLXBlci1pbnN0cnVjdGlvbiB5aWVsZCBncmVhdGVyCi0JICogc3BlZWQgYXQgbGVzc2VyIHJhbmRvbW5lc3MuCi0JICoKLQkgKiBJZiB5b3UgY2hhbmdlIHRoaXMgdG8gYW5vdGhlciBWSUFfQ0hVTktfbiwgeW91IG11c3QgYWxzbwotCSAqIGNoYW5nZSB0aGUgLT5uX2J5dGVzIHZhbHVlcyBpbiBybmdfdmVuZG9yX29wc1tdIHRhYmxlcy4KLQkgKiBWSUFfQ0hVTktfOCByZXF1aXJlcyBmdXJ0aGVyIGNvZGUgY2hhbmdlcy4KLQkgKgotCSAqIEEgY29weSBvZiBNU1JfVklBX1JORyBpcyBwbGFjZWQgaW4gZWF4X291dCB3aGVuIHhzdG9yZQotCSAqIGNvbXBsZXRlcy4KLQkgKi8KLQl2aWFfcm5nX2RhdHVtID0gMDsgLyogcGFyYW5vaWEsIG5vdCByZWFsbHkgbmVjZXNzYXJ5ICovCi0JYnl0ZXNfb3V0ID0geHN0b3JlKCZ2aWFfcm5nX2RhdHVtLCBWSUFfUk5HX0NIVU5LXzEpICYgVklBX1hTVE9SRV9DTlRfTUFTSzsKLQlpZiAoYnl0ZXNfb3V0ID09IDApCi0JCXJldHVybiAwOwotCi0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB1MzIgdmlhX2RhdGFfcmVhZCh2b2lkKQotewotCXJldHVybiB2aWFfcm5nX2RhdHVtOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCB2aWFfaW5pdChzdHJ1Y3QgcGNpX2RldiAqZGV2KQotewotCXUzMiBsbywgaGksIG9sZF9sbzsKLQotCS8qIENvbnRyb2wgdGhlIFJORyB2aWEgTVNSLiAgVHJlYWQgbGlnaHRseSBhbmQgcGF5IHZlcnkgY2xvc2UKLQkgKiBjbG9zZSBhdHRlbnRpb24gdG8gdmFsdWVzIHdyaXR0ZW4sIGFzIHRoZSByZXNlcnZlZCBmaWVsZHMKLQkgKiBhcmUgZG9jdW1lbnRlZCB0byBiZSAidW5kZWZpbmVkIGFuZCB1bnByZWRpY3RhYmxlIjsgYnV0IGl0Ci0JICogZG9lcyBub3Qgc2F5IHRvIHdyaXRlIHRoZW0gYXMgemVybywgc28gSSBtYWtlIGEgZ3Vlc3MgdGhhdAotCSAqIHdlIHJlc3RvcmUgdGhlIHZhbHVlcyB3ZSBmaW5kIGluIHRoZSByZWdpc3Rlci4KLQkgKi8KLQlyZG1zcihNU1JfVklBX1JORywgbG8sIGhpKTsKLQotCW9sZF9sbyA9IGxvOwotCWxvICY9IH4oMHg3ZiA8PCBWSUFfU1RSRklMVF9DTlRfU0hJRlQpOwotCWxvICY9IH5WSUFfWFNUT1JFX0NOVF9NQVNLOwotCWxvICY9IH4oVklBX1NUUkZJTFRfRU5BQkxFIHwgVklBX1NUUkZJTFRfRkFJTCB8IFZJQV9SQVdCSVRTX0VOQUJMRSk7Ci0JbG8gfD0gVklBX1JOR19FTkFCTEU7Ci0KLQlpZiAobG8gIT0gb2xkX2xvKQotCQl3cm1zcihNU1JfVklBX1JORywgbG8sIGhpKTsKLQotCS8qIHBlcmhhcHMtdW5uZWNlc3Nhcnkgc2FuaXR5IGNoZWNrOyByZW1vdmUgYWZ0ZXIgdGVzdGluZyBpZgotCSAgIHVubmVlZGVkICovCi0JcmRtc3IoTVNSX1ZJQV9STkcsIGxvLCBoaSk7Ci0JaWYgKChsbyAmIFZJQV9STkdfRU5BQkxFKSA9PSAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBQRlggImNhbm5vdCBlbmFibGUgVklBIEMzIFJORywgYWJvcnRpbmdcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgdmlhX2NsZWFudXAodm9pZCkKLXsKLQkvKiBkbyBub3RoaW5nICovCi19Ci0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQU1EIEdlb2RlIFJORyBvcGVyYXRpb25zCi0gKgotICovCi0KLXN0YXRpYyB2b2lkIF9faW9tZW0gKmdlb2RlX3JuZ19iYXNlID0gTlVMTDsKLQotI2RlZmluZSBHRU9ERV9STkdfREFUQV9SRUcgICAweDUwCi0jZGVmaW5lIEdFT0RFX1JOR19TVEFUVVNfUkVHIDB4NTQKLQotc3RhdGljIHUzMiBnZW9kZV9kYXRhX3JlYWQodm9pZCkKLXsKLQl1MzIgdmFsOwotCi0JYXNzZXJ0KGdlb2RlX3JuZ19iYXNlICE9IE5VTEwpOwotCXZhbCA9IHJlYWRsKGdlb2RlX3JuZ19iYXNlICsgR0VPREVfUk5HX0RBVEFfUkVHKTsKLQlyZXR1cm4gdmFsOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IGdlb2RlX2RhdGFfcHJlc2VudCh2b2lkKQotewotCXUzMiB2YWw7Ci0KLQlhc3NlcnQoZ2VvZGVfcm5nX2Jhc2UgIT0gTlVMTCk7Ci0JdmFsID0gcmVhZGwoZ2VvZGVfcm5nX2Jhc2UgKyBHRU9ERV9STkdfU1RBVFVTX1JFRyk7Ci0JcmV0dXJuIHZhbDsKLX0KLQotc3RhdGljIHZvaWQgZ2VvZGVfY2xlYW51cCh2b2lkKQotewotCWlvdW5tYXAoZ2VvZGVfcm5nX2Jhc2UpOwotICAJZ2VvZGVfcm5nX2Jhc2UgPSBOVUxMOwotfQotCi1zdGF0aWMgaW50IGdlb2RlX2luaXQoc3RydWN0IHBjaV9kZXYgKmRldikKLXsKLQl1bnNpZ25lZCBsb25nIHJuZ19iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgMCk7Ci0KLQlpZiAocm5nX2Jhc2UgPT0gMCkKLQkJcmV0dXJuIDE7Ci0KLQlnZW9kZV9ybmdfYmFzZSA9IGlvcmVtYXAocm5nX2Jhc2UsIDB4NTgpOwotCi0JaWYgKGdlb2RlX3JuZ19iYXNlID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2Fubm90IGlvcmVtYXAgUk5HIG1lbW9yeVxuIik7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIC9kZXYvaHdyYW5kb20gY2hhcmFjdGVyIGRldmljZSBoYW5kbGluZyAobWFqb3IgMTAsIG1pbm9yIDE4MykKLSAqCi0gKi8KLQotc3RhdGljIGludCBybmdfZGV2X29wZW4gKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQotewotCS8qIGVuZm9yY2UgcmVhZC1vbmx5IGFjY2VzcyB0byB0aGlzIGNocmRldiAqLwotCWlmICgoZmlscC0+Zl9tb2RlICYgRk1PREVfUkVBRCkgPT0gMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKGZpbHAtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyBzc2l6ZV90IHJuZ19kZXZfcmVhZCAoc3RydWN0IGZpbGUgKmZpbHAsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBzaXplLAotCQkJCWxvZmZfdCAqIG9mZnApCi17Ci0Jc3RhdGljIERFRklORV9TUElOTE9DSyhybmdfbG9jayk7Ci0JdW5zaWduZWQgaW50IGhhdmVfZGF0YTsKLQl1MzIgZGF0YSA9IDA7Ci0Jc3NpemVfdCByZXQgPSAwOwotCi0Jd2hpbGUgKHNpemUpIHsKLQkJc3Bpbl9sb2NrKCZybmdfbG9jayk7Ci0KLQkJaGF2ZV9kYXRhID0gMDsKLQkJaWYgKHJuZ19vcHMtPmRhdGFfcHJlc2VudCgpKSB7Ci0JCQlkYXRhID0gcm5nX29wcy0+ZGF0YV9yZWFkKCk7Ci0JCQloYXZlX2RhdGEgPSBybmdfb3BzLT5uX2J5dGVzOwotCQl9Ci0KLQkJc3Bpbl91bmxvY2sgKCZybmdfbG9jayk7Ci0KLQkJd2hpbGUgKGhhdmVfZGF0YSAmJiBzaXplKSB7Ci0JCQlpZiAocHV0X3VzZXIoKHU4KWRhdGEsIGJ1ZisrKSkgewotCQkJCXJldCA9IHJldCA/IDogLUVGQVVMVDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXNpemUtLTsKLQkJCXJldCsrOwotCQkJaGF2ZV9kYXRhLS07Ci0JCQlkYXRhPj49ODsKLQkJfQotCi0JCWlmIChmaWxwLT5mX2ZsYWdzICYgT19OT05CTE9DSykKLQkJCXJldHVybiByZXQgPyA6IC1FQUdBSU47Ci0KLQkJaWYobmVlZF9yZXNjaGVkKCkpCi0JCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUoMSk7Ci0JCWVsc2UKLQkJCXVkZWxheSgyMDApOwkvKiBGSVhNRTogV2UgY291bGQgcG9sbCBmb3IgMjUwdVMgPz8gKi8KLQotCQlpZiAoc2lnbmFsX3BlbmRpbmcgKGN1cnJlbnQpKQotCQkJcmV0dXJuIHJldCA/IDogLUVSRVNUQVJUU1lTOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi0KLQotLyoKLSAqIHJuZ19pbml0X29uZSAtIGxvb2sgZm9yIGFuZCBhdHRlbXB0IHRvIGluaXQgYSBzaW5nbGUgUk5HCi0gKi8KLXN0YXRpYyBpbnQgX19pbml0IHJuZ19pbml0X29uZSAoc3RydWN0IHBjaV9kZXYgKmRldikKLXsKLQlpbnQgcmM7Ci0KLQlEUFJJTlRLICgiRU5URVJcbiIpOwotCi0JYXNzZXJ0KHJuZ19vcHMgIT0gTlVMTCk7Ci0KLQlyYyA9IHJuZ19vcHMtPmluaXQoZGV2KTsKLQlpZiAocmMpCi0JCWdvdG8gZXJyX291dDsKLQotCXJjID0gbWlzY19yZWdpc3RlciAoJnJuZ19taXNjZGV2KTsKLQlpZiAocmMpIHsKLQkJcHJpbnRrIChLRVJOX0VSUiBQRlggIm1pc2MgZGV2aWNlIHJlZ2lzdGVyIGZhaWxlZFxuIik7Ci0JCWdvdG8gZXJyX291dF9jbGVhbnVwX2h3OwotCX0KLQotCURQUklOVEsgKCJFWElULCByZXR1cm5pbmcgMFxuIik7Ci0JcmV0dXJuIDA7Ci0KLWVycl9vdXRfY2xlYW51cF9odzoKLQlybmdfb3BzLT5jbGVhbnVwKCk7Ci1lcnJfb3V0OgotCURQUklOVEsgKCJFWElULCByZXR1cm5pbmcgJWRcbiIsIHJjKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLQotCi1NT0RVTEVfQVVUSE9SKCJUaGUgTGludXggS2VybmVsIHRlYW0iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiSC9XIFJhbmRvbSBOdW1iZXIgR2VuZXJhdG9yIChSTkcpIGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi0KLS8qCi0gKiBybmdfaW5pdCAtIGluaXRpYWxpemUgUk5HIG1vZHVsZQotICovCi1zdGF0aWMgaW50IF9faW5pdCBybmdfaW5pdCAodm9pZCkKLXsKLQlpbnQgcmM7Ci0Jc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBOVUxMOwotCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQ7Ci0KLQlEUFJJTlRLICgiRU5URVJcbiIpOwotCi0JLyogUHJvYmUgZm9yIEludGVsLCBBTUQsIEdlb2RlIFJOR3MgKi8KLQlmb3JfZWFjaF9wY2lfZGV2KHBkZXYpIHsKLQkJZW50ID0gcGNpX21hdGNoX2lkKHJuZ19wY2lfdGJsLCBwZGV2KTsKLQkJaWYgKGVudCkgewotCQkJcm5nX29wcyA9ICZybmdfdmVuZG9yX29wc1tlbnQtPmRyaXZlcl9kYXRhXTsKLQkJCWdvdG8gbWF0Y2g7Ci0JCX0KLQl9Ci0KLSNpZmRlZiBfX2kzODZfXwotCS8qIFByb2JlIGZvciBWSUEgUk5HICovCi0JaWYgKGNwdV9oYXNfeHN0b3JlKSB7Ci0JCXJuZ19vcHMgPSAmcm5nX3ZlbmRvcl9vcHNbcm5nX2h3X3ZpYV07Ci0JCXBkZXYgPSBOVUxMOwotCQlnb3RvIG1hdGNoOwotCX0KLSNlbmRpZgotCi0JRFBSSU5USyAoIkVYSVQsIHJldHVybmluZyAtRU5PREVWXG4iKTsKLQlyZXR1cm4gLUVOT0RFVjsKLQotbWF0Y2g6Ci0JcmMgPSBybmdfaW5pdF9vbmUgKHBkZXYpOwotCWlmIChyYykKLQkJcmV0dXJuIHJjOwotCi0JcHJfaW5mbyggUk5HX0RSSVZFUl9OQU1FICIgbG9hZGVkXG4iKTsKLQotCURQUklOVEsgKCJFWElULCByZXR1cm5pbmcgMFxuIik7Ci0JcmV0dXJuIDA7Ci19Ci0KLQotLyoKLSAqIHJuZ19pbml0IC0gc2h1dGRvd24gUk5HIG1vZHVsZQotICovCi1zdGF0aWMgdm9pZCBfX2V4aXQgcm5nX2NsZWFudXAgKHZvaWQpCi17Ci0JRFBSSU5USyAoIkVOVEVSXG4iKTsKLQotCW1pc2NfZGVyZWdpc3RlciAoJnJuZ19taXNjZGV2KTsKLQotCWlmIChybmdfb3BzLT5jbGVhbnVwKQotCQlybmdfb3BzLT5jbGVhbnVwKCk7Ci0KLQlEUFJJTlRLICgiRVhJVFxuIik7Ci19Ci0KLQotbW9kdWxlX2luaXQgKHJuZ19pbml0KTsKLW1vZHVsZV9leGl0IChybmdfY2xlYW51cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL0tjb25maWcgYi9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY3NjM1ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9od19yYW5kb20vS2NvbmZpZwpAQCAtMCwwICsxLDkwIEBACisjCisjIEhhcmR3YXJlIFJhbmRvbSBOdW1iZXIgR2VuZXJhdG9yIChSTkcpIGNvbmZpZ3VyYXRpb24KKyMKKworY29uZmlnIEhXX1JBTkRPTQorCWJvb2wgIkhhcmR3YXJlIFJhbmRvbSBOdW1iZXIgR2VuZXJhdG9yIENvcmUgc3VwcG9ydCIKKwlkZWZhdWx0IHkKKwktLS1oZWxwLS0tCisJICBIYXJkd2FyZSBSYW5kb20gTnVtYmVyIEdlbmVyYXRvciBDb3JlIGluZnJhc3RydWN0dXJlLgorCisJICBJZiB1bnN1cmUsIHNheSBZLgorCitjb25maWcgSFdfUkFORE9NX0lOVEVMCisJdHJpc3RhdGUgIkludGVsIEhXIFJhbmRvbSBOdW1iZXIgR2VuZXJhdG9yIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBIV19SQU5ET00gJiYgKFg4NiB8fCBJQTY0KSAmJiBQQ0kKKwlkZWZhdWx0IHkKKwktLS1oZWxwLS0tCisJICBUaGlzIGRyaXZlciBwcm92aWRlcyBrZXJuZWwtc2lkZSBzdXBwb3J0IGZvciB0aGUgUmFuZG9tIE51bWJlcgorCSAgR2VuZXJhdG9yIGhhcmR3YXJlIGZvdW5kIG9uIEludGVsIGk4eHgtYmFzZWQgbW90aGVyYm9hcmRzLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBpbnRlbC1ybmcuCisKKwkgIElmIHVuc3VyZSwgc2F5IFkuCisKK2NvbmZpZyBIV19SQU5ET01fQU1ECisJdHJpc3RhdGUgIkFNRCBIVyBSYW5kb20gTnVtYmVyIEdlbmVyYXRvciBzdXBwb3J0IgorCWRlcGVuZHMgb24gSFdfUkFORE9NICYmIFg4NiAmJiBQQ0kKKwlkZWZhdWx0IHkKKwktLS1oZWxwLS0tCisJICBUaGlzIGRyaXZlciBwcm92aWRlcyBrZXJuZWwtc2lkZSBzdXBwb3J0IGZvciB0aGUgUmFuZG9tIE51bWJlcgorCSAgR2VuZXJhdG9yIGhhcmR3YXJlIGZvdW5kIG9uIEFNRCA3NngtYmFzZWQgbW90aGVyYm9hcmRzLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBhbWQtcm5nLgorCisJICBJZiB1bnN1cmUsIHNheSBZLgorCitjb25maWcgSFdfUkFORE9NX0dFT0RFCisJdHJpc3RhdGUgIkFNRCBHZW9kZSBIVyBSYW5kb20gTnVtYmVyIEdlbmVyYXRvciBzdXBwb3J0IgorCWRlcGVuZHMgb24gSFdfUkFORE9NICYmIFg4NiAmJiBQQ0kKKwlkZWZhdWx0IHkKKwktLS1oZWxwLS0tCisJICBUaGlzIGRyaXZlciBwcm92aWRlcyBrZXJuZWwtc2lkZSBzdXBwb3J0IGZvciB0aGUgUmFuZG9tIE51bWJlcgorCSAgR2VuZXJhdG9yIGhhcmR3YXJlIGZvdW5kIG9uIHRoZSBBTUQgR2VvZGUgTFguCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGdlb2RlLXJuZy4KKworCSAgSWYgdW5zdXJlLCBzYXkgWS4KKworY29uZmlnIEhXX1JBTkRPTV9WSUEKKwl0cmlzdGF0ZSAiVklBIEhXIFJhbmRvbSBOdW1iZXIgR2VuZXJhdG9yIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBIV19SQU5ET00gJiYgWDg2XzMyCisJZGVmYXVsdCB5CisJLS0taGVscC0tLQorCSAgVGhpcyBkcml2ZXIgcHJvdmlkZXMga2VybmVsLXNpZGUgc3VwcG9ydCBmb3IgdGhlIFJhbmRvbSBOdW1iZXIKKwkgIEdlbmVyYXRvciBoYXJkd2FyZSBmb3VuZCBvbiBWSUEgYmFzZWQgbW90aGVyYm9hcmRzLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB2aWEtcm5nLgorCisJICBJZiB1bnN1cmUsIHNheSBZLgorCitjb25maWcgSFdfUkFORE9NX0lYUDRYWAorCXRyaXN0YXRlICJJbnRlbCBJWFA0eHggTlBVIEhXIFJhbmRvbSBOdW1iZXIgR2VuZXJhdG9yIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBIV19SQU5ET00gJiYgQVJDSF9JWFA0WFgKKwlkZWZhdWx0IHkKKwktLS1oZWxwLS0tCisJICBUaGlzIGRyaXZlciBwcm92aWRlcyBrZXJuZWwtc2lkZSBzdXBwb3J0IGZvciB0aGUgUmFuZG9tCisJICBOdW1iZXIgR2VuZXJhdG9yIGhhcmR3YXJlIGZvdW5kIG9uIHRoZSBJbnRlbCBJWFA0eHggTlBVLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBpeHA0eHgtcm5nLgorCisJICBJZiB1bnN1cmUsIHNheSBZLgorCitjb25maWcgSFdfUkFORE9NX09NQVAKKwl0cmlzdGF0ZSAiT01BUCBSYW5kb20gTnVtYmVyIEdlbmVyYXRvciBzdXBwb3J0IgorCWRlcGVuZHMgb24gSFdfUkFORE9NICYmIChBUkNIX09NQVAxNlhYIHx8IEFSQ0hfT01BUDI0WFgpCisJZGVmYXVsdCB5CisgCS0tLWhlbHAtLS0KKyAJICBUaGlzIGRyaXZlciBwcm92aWRlcyBrZXJuZWwtc2lkZSBzdXBwb3J0IGZvciB0aGUgUmFuZG9tIE51bWJlcgorCSAgR2VuZXJhdG9yIGhhcmR3YXJlIGZvdW5kIG9uIE9NQVAxNnh4IGFuZCBPTUFQMjR4eCBtdWx0aW1lZGlhCisJICBwcm9jZXNzb3JzLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBvbWFwLXJuZy4KKworIAkgIElmIHVuc3VyZSwgc2F5IFkuCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL01ha2VmaWxlIGIvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjYzYWU5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9NYWtlZmlsZQpAQCAtMCwwICsxLDExIEBACisjCisjIE1ha2VmaWxlIGZvciBIVyBSYW5kb20gTnVtYmVyIEdlbmVyYXRvciAoUk5HKSBkZXZpY2UgZHJpdmVycy4KKyMKKworb2JqLSQoQ09ORklHX0hXX1JBTkRPTSkgKz0gY29yZS5vCitvYmotJChDT05GSUdfSFdfUkFORE9NX0lOVEVMKSArPSBpbnRlbC1ybmcubworb2JqLSQoQ09ORklHX0hXX1JBTkRPTV9BTUQpICs9IGFtZC1ybmcubworb2JqLSQoQ09ORklHX0hXX1JBTkRPTV9HRU9ERSkgKz0gZ2VvZGUtcm5nLm8KK29iai0kKENPTkZJR19IV19SQU5ET01fVklBKSArPSB2aWEtcm5nLm8KK29iai0kKENPTkZJR19IV19SQU5ET01fSVhQNFhYKSArPSBpeHA0eHgtcm5nLm8KK29iai0kKENPTkZJR19IV19SQU5ET01fT01BUCkgKz0gb21hcC1ybmcubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9hbWQtcm5nLmMgYi9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL2FtZC1ybmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWU0ZTBmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9hbWQtcm5nLmMKQEAgLTAsMCArMSwxNTIgQEAKKy8qCisgKiBSTkcgZHJpdmVyIGZvciBBTUQgUk5HcworICoKKyAqIENvcHlyaWdodCAyMDA1IChjKSBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCisgKgorICogd2l0aCB0aGUgbWFqb3JpdHkgb2YgdGhlIGNvZGUgY29taW5nIGZyb206CisgKgorICogSGFyZHdhcmUgZHJpdmVyIGZvciB0aGUgSW50ZWwvQU1EL1ZJQSBSYW5kb20gTnVtYmVyIEdlbmVyYXRvcnMgKFJORykKKyAqIChjKSBDb3B5cmlnaHQgMjAwMyBSZWQgSGF0IEluYyA8amdhcnppa0ByZWRoYXQuY29tPgorICoKKyAqIGRlcml2ZWQgZnJvbQorICoKKyAqIEhhcmR3YXJlIGRyaXZlciBmb3IgdGhlIEFNRCA3NjggUmFuZG9tIE51bWJlciBHZW5lcmF0b3IgKFJORykKKyAqIChjKSBDb3B5cmlnaHQgMjAwMSBSZWQgSGF0IEluYyA8YWxhbkByZWRoYXQuY29tPgorICoKKyAqIGRlcml2ZWQgZnJvbQorICoKKyAqIEhhcmR3YXJlIGRyaXZlciBmb3IgSW50ZWwgaTgxMCBSYW5kb20gTnVtYmVyIEdlbmVyYXRvciAoUk5HKQorICogQ29weXJpZ2h0IDIwMDAsMjAwMSBKZWZmIEdhcnppayA8amdhcnppa0Bwb2JveC5jb20+CisgKiBDb3B5cmlnaHQgMjAwMCwyMDAxIFBoaWxpcHAgUnVtcGYgPHBydW1wZkBtYW5kcmFrZXNvZnQuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciAgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueQorICogd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9od19yYW5kb20uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworCisjZGVmaW5lIFBGWAlLQlVJTERfTU9ETkFNRSAiOiAiCisKKworLyoKKyAqIERhdGEgZm9yIFBDSSBkcml2ZXIgaW50ZXJmYWNlCisgKgorICogVGhpcyBkYXRhIG9ubHkgZXhpc3RzIGZvciBleHBvcnRpbmcgdGhlIHN1cHBvcnRlZAorICogUENJIGlkcyB2aWEgTU9EVUxFX0RFVklDRV9UQUJMRS4gIFdlIGRvIG5vdCBhY3R1YWxseQorICogcmVnaXN0ZXIgYSBwY2lfZHJpdmVyLCBiZWNhdXNlIHNvbWVvbmUgZWxzZSBtaWdodCBvbmUgZGF5CisgKiB3YW50IHRvIHJlZ2lzdGVyIGFub3RoZXIgZHJpdmVyIG9uIHRoZSBzYW1lIFBDSSBpZC4KKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIHBjaV90YmxbXSA9IHsKKwl7IDB4MTAyMiwgMHg3NDQzLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwLCB9LAorCXsgMHgxMDIyLCAweDc0NmIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAsIH0sCisJeyAwLCB9LAkvKiB0ZXJtaW5hdGUgbGlzdCAqLworfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBwY2lfdGJsKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2ICphbWRfcGRldjsKKworCitzdGF0aWMgaW50IGFtZF9ybmdfZGF0YV9wcmVzZW50KHN0cnVjdCBod3JuZyAqcm5nKQoreworCXUzMiBwbWJhc2UgPSAodTMyKXJuZy0+cHJpdjsKKworICAgICAgCXJldHVybiAhIShpbmwocG1iYXNlICsgMHhGNCkgJiAxKTsKK30KKworc3RhdGljIGludCBhbWRfcm5nX2RhdGFfcmVhZChzdHJ1Y3QgaHdybmcgKnJuZywgdTMyICpkYXRhKQoreworCXUzMiBwbWJhc2UgPSAodTMyKXJuZy0+cHJpdjsKKworCSpkYXRhID0gaW5sKHBtYmFzZSArIDB4RjApOworCisJcmV0dXJuIDQ7Cit9CisKK3N0YXRpYyBpbnQgYW1kX3JuZ19pbml0KHN0cnVjdCBod3JuZyAqcm5nKQoreworCXU4IHJuZW47CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShhbWRfcGRldiwgMHg0MCwgJnJuZW4pOworCXJuZW4gfD0gKDEgPDwgNyk7CS8qIFJORyBvbiAqLworCXBjaV93cml0ZV9jb25maWdfYnl0ZShhbWRfcGRldiwgMHg0MCwgcm5lbik7CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShhbWRfcGRldiwgMHg0MSwgJnJuZW4pOworCXJuZW4gfD0gKDEgPDwgNyk7CS8qIFBNSU8gZW5hYmxlICovCisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGFtZF9wZGV2LCAweDQxLCBybmVuKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhbWRfcm5nX2NsZWFudXAoc3RydWN0IGh3cm5nICpybmcpCit7CisJdTggcm5lbjsKKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGFtZF9wZGV2LCAweDQwLCAmcm5lbik7CisJcm5lbiAmPSB+KDEgPDwgNyk7CS8qIFJORyBvZmYgKi8KKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoYW1kX3BkZXYsIDB4NDAsIHJuZW4pOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgaHdybmcgYW1kX3JuZyA9IHsKKwkubmFtZQkJPSAiYW1kIiwKKwkuaW5pdAkJPSBhbWRfcm5nX2luaXQsCisJLmNsZWFudXAJPSBhbWRfcm5nX2NsZWFudXAsCisJLmRhdGFfcHJlc2VudAk9IGFtZF9ybmdfZGF0YV9wcmVzZW50LAorCS5kYXRhX3JlYWQJPSBhbWRfcm5nX2RhdGFfcmVhZCwKK307CisKKworc3RhdGljIGludCBfX2luaXQgbW9kX2luaXQodm9pZCkKK3sKKwlpbnQgZXJyID0gLUVOT0RFVjsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IE5VTEw7CisJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudDsKKwl1MzIgcG1iYXNlOworCisJZm9yX2VhY2hfcGNpX2RldihwZGV2KSB7CisJCWVudCA9IHBjaV9tYXRjaF9pZChwY2lfdGJsLCBwZGV2KTsKKwkJaWYgKGVudCkKKwkJCWdvdG8gZm91bmQ7CisJfQorCS8qIERldmljZSBub3QgZm91bmQuICovCisJZ290byBvdXQ7CisKK2ZvdW5kOgorCWVyciA9IHBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCAweDU4LCAmcG1iYXNlKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKwllcnIgPSAtRUlPOworCXBtYmFzZSAmPSAweDAwMDBGRjAwOworCWlmIChwbWJhc2UgPT0gMCkKKwkJZ290byBvdXQ7CisJYW1kX3JuZy5wcml2ID0gKHVuc2lnbmVkIGxvbmcpcG1iYXNlOworCWFtZF9wZGV2ID0gcGRldjsKKworCXByaW50ayhLRVJOX0lORk8gIkFNRDc2OCBSTkcgZGV0ZWN0ZWRcbiIpOworCWVyciA9IGh3cm5nX3JlZ2lzdGVyKCZhbWRfcm5nKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIlJORyByZWdpc3RlcmluZyBmYWlsZWQgKCVkKVxuIiwKKwkJICAgICAgIGVycik7CisJCWdvdG8gb3V0OworCX0KK291dDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbW9kX2V4aXQodm9pZCkKK3sKKwlod3JuZ191bnJlZ2lzdGVyKCZhbWRfcm5nKTsKK30KKworc3Vic3lzX2luaXRjYWxsKG1vZF9pbml0KTsKK21vZHVsZV9leGl0KG1vZF9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiVGhlIExpbnV4IEtlcm5lbCB0ZWFtIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkgvVyBSTkcgZHJpdmVyIGZvciBBTUQgY2hpcHNldHMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9od19yYW5kb20vY29yZS5jIGIvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhiMDI2NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9od19yYW5kb20vY29yZS5jCkBAIC0wLDAgKzEsMzU0IEBACisvKgorICAgICAgICBBZGRlZCBzdXBwb3J0IGZvciB0aGUgQU1EIEdlb2RlIExYIFJORworCShjKSBDb3B5cmlnaHQgMjAwNC0yMDA1IEFkdmFuY2VkIE1pY3JvIERldmljZXMsIEluYy4KKworCWRlcml2ZWQgZnJvbQorCisgCUhhcmR3YXJlIGRyaXZlciBmb3IgdGhlIEludGVsL0FNRC9WSUEgUmFuZG9tIE51bWJlciBHZW5lcmF0b3JzIChSTkcpCisJKGMpIENvcHlyaWdodCAyMDAzIFJlZCBIYXQgSW5jIDxqZ2FyemlrQHJlZGhhdC5jb20+CisKKyAJZGVyaXZlZCBmcm9tCisKKyAgICAgICAgSGFyZHdhcmUgZHJpdmVyIGZvciB0aGUgQU1EIDc2OCBSYW5kb20gTnVtYmVyIEdlbmVyYXRvciAoUk5HKQorICAgICAgICAoYykgQ29weXJpZ2h0IDIwMDEgUmVkIEhhdCBJbmMgPGFsYW5AcmVkaGF0LmNvbT4KKworIAlkZXJpdmVkIGZyb20KKworCUhhcmR3YXJlIGRyaXZlciBmb3IgSW50ZWwgaTgxMCBSYW5kb20gTnVtYmVyIEdlbmVyYXRvciAoUk5HKQorCUNvcHlyaWdodCAyMDAwLDIwMDEgSmVmZiBHYXJ6aWsgPGpnYXJ6aWtAcG9ib3guY29tPgorCUNvcHlyaWdodCAyMDAwLDIwMDEgUGhpbGlwcCBSdW1wZiA8cHJ1bXBmQG1hbmRyYWtlc29mdC5jb20+CisKKwlBZGRlZCBnZW5lcmljIFJORyBBUEkKKwlDb3B5cmlnaHQgMjAwNiBNaWNoYWVsIEJ1ZXNjaCA8bWJ1ZXNjaEBmcmVlbmV0LmRlPgorCUNvcHlyaWdodCAyMDA1IChjKSBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCisKKwlQbGVhc2UgcmVhZCBEb2N1bWVudGF0aW9uL2h3X3JhbmRvbS50eHQgZm9yIGRldGFpbHMgb24gdXNlLgorCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCVRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKyAgICAgICAgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKworICovCisKKworI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2h3X3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKworI2RlZmluZSBSTkdfTU9EVUxFX05BTUUJCSJod19yYW5kb20iCisjZGVmaW5lIFBGWAkJCVJOR19NT0RVTEVfTkFNRSAiOiAiCisjZGVmaW5lIFJOR19NSVNDREVWX01JTk9SCTE4MyAvKiBvZmZpY2lhbCAqLworCisKK3N0YXRpYyBzdHJ1Y3QgaHdybmcgKmN1cnJlbnRfcm5nOworc3RhdGljIExJU1RfSEVBRChybmdfbGlzdCk7CitzdGF0aWMgREVGSU5FX01VVEVYKHJuZ19tdXRleCk7CisKKworc3RhdGljIGlubGluZSBpbnQgaHdybmdfaW5pdChzdHJ1Y3QgaHdybmcgKnJuZykKK3sKKwlpZiAoIXJuZy0+aW5pdCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIHJuZy0+aW5pdChybmcpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaHdybmdfY2xlYW51cChzdHJ1Y3QgaHdybmcgKnJuZykKK3sKKwlpZiAocm5nICYmIHJuZy0+Y2xlYW51cCkKKwkJcm5nLT5jbGVhbnVwKHJuZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGh3cm5nX2RhdGFfcHJlc2VudChzdHJ1Y3QgaHdybmcgKnJuZykKK3sKKwlpZiAoIXJuZy0+ZGF0YV9wcmVzZW50KQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gcm5nLT5kYXRhX3ByZXNlbnQocm5nKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgaHdybmdfZGF0YV9yZWFkKHN0cnVjdCBod3JuZyAqcm5nLCB1MzIgKmRhdGEpCit7CisJcmV0dXJuIHJuZy0+ZGF0YV9yZWFkKHJuZywgZGF0YSk7Cit9CisKKworc3RhdGljIGludCBybmdfZGV2X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJLyogZW5mb3JjZSByZWFkLW9ubHkgYWNjZXNzIHRvIHRoaXMgY2hyZGV2ICovCisJaWYgKChmaWxwLT5mX21vZGUgJiBGTU9ERV9SRUFEKSA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoZmlscC0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCBybmdfZGV2X3JlYWQoc3RydWN0IGZpbGUgKmZpbHAsIGNoYXIgX191c2VyICpidWYsCisJCQkgICAgc2l6ZV90IHNpemUsIGxvZmZfdCAqb2ZmcCkKK3sKKwl1MzIgZGF0YTsKKwlzc2l6ZV90IHJldCA9IDA7CisJaW50IGksIGVyciA9IDA7CisJaW50IGRhdGFfcHJlc2VudDsKKwlpbnQgYnl0ZXNfcmVhZDsKKworCXdoaWxlIChzaXplKSB7CisJCWVyciA9IC1FUkVTVEFSVFNZUzsKKwkJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmcm5nX211dGV4KSkKKwkJCWdvdG8gb3V0OworCQlpZiAoIWN1cnJlbnRfcm5nKSB7CisJCQltdXRleF91bmxvY2soJnJuZ19tdXRleCk7CisJCQllcnIgPSAtRU5PREVWOworCQkJZ290byBvdXQ7CisJCX0KKwkJaWYgKGZpbHAtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQlkYXRhX3ByZXNlbnQgPSBod3JuZ19kYXRhX3ByZXNlbnQoY3VycmVudF9ybmcpOworCQl9IGVsc2UgeworCQkJLyogU29tZSBSTkcgcmVxdWlyZSBzb21lIHRpbWUgYmV0d2VlbiBkYXRhX3JlYWRzIHRvIGdhdGhlcgorCQkJICogbmV3IGVudHJvcHkuIFBvbGwgaXQuCisJCQkgKi8KKwkJCWZvciAoaSA9IDA7IGkgPCAyMDsgaSsrKSB7CisJCQkJZGF0YV9wcmVzZW50ID0gaHdybmdfZGF0YV9wcmVzZW50KGN1cnJlbnRfcm5nKTsKKwkJCQlpZiAoZGF0YV9wcmVzZW50KQorCQkJCQlicmVhazsKKwkJCQl1ZGVsYXkoMTApOworCQkJfQorCQl9CisJCWJ5dGVzX3JlYWQgPSAwOworCQlpZiAoZGF0YV9wcmVzZW50KQorCQkJYnl0ZXNfcmVhZCA9IGh3cm5nX2RhdGFfcmVhZChjdXJyZW50X3JuZywgJmRhdGEpOworCQltdXRleF91bmxvY2soJnJuZ19tdXRleCk7CisKKwkJZXJyID0gLUVBR0FJTjsKKwkJaWYgKCFieXRlc19yZWFkICYmIChmaWxwLT5mX2ZsYWdzICYgT19OT05CTE9DSykpCisJCQlnb3RvIG91dDsKKworCQllcnIgPSAtRUZBVUxUOworCQl3aGlsZSAoYnl0ZXNfcmVhZCAmJiBzaXplKSB7CisJCQlpZiAocHV0X3VzZXIoKHU4KWRhdGEsIGJ1ZisrKSkKKwkJCQlnb3RvIG91dDsKKwkJCXNpemUtLTsKKwkJCXJldCsrOworCQkJYnl0ZXNfcmVhZC0tOworCQkJZGF0YSA+Pj0gODsKKwkJfQorCisJCWlmIChuZWVkX3Jlc2NoZWQoKSkKKwkJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZSgxKTsKKwkJZXJyID0gLUVSRVNUQVJUU1lTOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQlnb3RvIG91dDsKKwl9CitvdXQ6CisJcmV0dXJuIHJldCA/IDogZXJyOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJuZ19jaHJkZXZfb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkub3BlbgkJPSBybmdfZGV2X29wZW4sCisJLnJlYWQJCT0gcm5nX2Rldl9yZWFkLAorfTsKKworc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIHJuZ19taXNjZGV2ID0geworCS5taW5vcgkJPSBSTkdfTUlTQ0RFVl9NSU5PUiwKKwkubmFtZQkJPSBSTkdfTU9EVUxFX05BTUUsCisJLmZvcHMJCT0gJnJuZ19jaHJkZXZfb3BzLAorfTsKKworCitzdGF0aWMgc3NpemVfdCBod3JuZ19hdHRyX2N1cnJlbnRfc3RvcmUoc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3MsCisJCQkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBod3JuZyAqcm5nOworCisJZXJyID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZybmdfbXV0ZXgpOworCWlmIChlcnIpCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJZXJyID0gLUVOT0RFVjsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJuZywgJnJuZ19saXN0LCBsaXN0KSB7CisJCWlmIChzdHJjbXAocm5nLT5uYW1lLCBidWYpID09IDApIHsKKwkJCWlmIChybmcgPT0gY3VycmVudF9ybmcpIHsKKwkJCQllcnIgPSAwOworCQkJCWJyZWFrOworCQkJfQorCQkJZXJyID0gaHdybmdfaW5pdChybmcpOworCQkJaWYgKGVycikKKwkJCQlicmVhazsKKwkJCWh3cm5nX2NsZWFudXAoY3VycmVudF9ybmcpOworCQkJY3VycmVudF9ybmcgPSBybmc7CisJCQllcnIgPSAwOworCQkJYnJlYWs7CisJCX0KKwl9CisJbXV0ZXhfdW5sb2NrKCZybmdfbXV0ZXgpOworCisJcmV0dXJuIGVyciA/IDogbGVuOworfQorCitzdGF0aWMgc3NpemVfdCBod3JuZ19hdHRyX2N1cnJlbnRfc2hvdyhzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzcywKKwkJCQkgICAgICAgY2hhciAqYnVmKQoreworCWludCBlcnI7CisJc3NpemVfdCByZXQ7CisJY29uc3QgY2hhciAqbmFtZSA9ICJub25lIjsKKworCWVyciA9IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmcm5nX211dGV4KTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCWlmIChjdXJyZW50X3JuZykKKwkJbmFtZSA9IGN1cnJlbnRfcm5nLT5uYW1lOworCXJldCA9IHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXNcbiIsIG5hbWUpOworCW11dGV4X3VubG9jaygmcm5nX211dGV4KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGh3cm5nX2F0dHJfYXZhaWxhYmxlX3Nob3coc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3MsCisJCQkJCSBjaGFyICpidWYpCit7CisJaW50IGVycjsKKwlzc2l6ZV90IHJldCA9IDA7CisJc3RydWN0IGh3cm5nICpybmc7CisKKwllcnIgPSBtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJnJuZ19tdXRleCk7CisJaWYgKGVycikKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwlidWZbMF0gPSAnXDAnOworCWxpc3RfZm9yX2VhY2hfZW50cnkocm5nLCAmcm5nX2xpc3QsIGxpc3QpIHsKKwkJc3RybmNhdChidWYsIHJuZy0+bmFtZSwgUEFHRV9TSVpFIC0gcmV0IC0gMSk7CisJCXJldCArPSBzdHJsZW4ocm5nLT5uYW1lKTsKKwkJc3RybmNhdChidWYsICIgIiwgUEFHRV9TSVpFIC0gcmV0IC0gMSk7CisJCXJldCsrOworCX0KKwlzdHJuY2F0KGJ1ZiwgIlxuIiwgUEFHRV9TSVpFIC0gcmV0IC0gMSk7CisJcmV0Kys7CisJbXV0ZXhfdW5sb2NrKCZybmdfbXV0ZXgpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKHJuZ19jdXJyZW50LCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJCSBod3JuZ19hdHRyX2N1cnJlbnRfc2hvdywKKwkJCSBod3JuZ19hdHRyX2N1cnJlbnRfc3RvcmUpOworc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKHJuZ19hdmFpbGFibGUsIFNfSVJVR08sCisJCQkgaHdybmdfYXR0cl9hdmFpbGFibGVfc2hvdywKKwkJCSBOVUxMKTsKKworCitzdGF0aWMgdm9pZCB1bnJlZ2lzdGVyX21pc2NkZXYodm9pZCkKK3sKKwljbGFzc19kZXZpY2VfcmVtb3ZlX2ZpbGUocm5nX21pc2NkZXYuY2xhc3MsCisJCQkJICZjbGFzc19kZXZpY2VfYXR0cl9ybmdfYXZhaWxhYmxlKTsKKwljbGFzc19kZXZpY2VfcmVtb3ZlX2ZpbGUocm5nX21pc2NkZXYuY2xhc3MsCisJCQkJICZjbGFzc19kZXZpY2VfYXR0cl9ybmdfY3VycmVudCk7CisJbWlzY19kZXJlZ2lzdGVyKCZybmdfbWlzY2Rldik7Cit9CisKK3N0YXRpYyBpbnQgcmVnaXN0ZXJfbWlzY2Rldih2b2lkKQoreworCWludCBlcnI7CisKKwllcnIgPSBtaXNjX3JlZ2lzdGVyKCZybmdfbWlzY2Rldik7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisJZXJyID0gY2xhc3NfZGV2aWNlX2NyZWF0ZV9maWxlKHJuZ19taXNjZGV2LmNsYXNzLAorCQkJCSAgICAgICAmY2xhc3NfZGV2aWNlX2F0dHJfcm5nX2N1cnJlbnQpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX21pc2NfZGVyZWc7CisJZXJyID0gY2xhc3NfZGV2aWNlX2NyZWF0ZV9maWxlKHJuZ19taXNjZGV2LmNsYXNzLAorCQkJCSAgICAgICAmY2xhc3NfZGV2aWNlX2F0dHJfcm5nX2F2YWlsYWJsZSk7CisJaWYgKGVycikKKwkJZ290byBlcnJfcmVtb3ZlX2N1cnJlbnQ7CitvdXQ6CisJcmV0dXJuIGVycjsKKworZXJyX3JlbW92ZV9jdXJyZW50OgorCWNsYXNzX2RldmljZV9yZW1vdmVfZmlsZShybmdfbWlzY2Rldi5jbGFzcywKKwkJCQkgJmNsYXNzX2RldmljZV9hdHRyX3JuZ19jdXJyZW50KTsKK2Vycl9taXNjX2RlcmVnOgorCW1pc2NfZGVyZWdpc3Rlcigmcm5nX21pc2NkZXYpOworCWdvdG8gb3V0OworfQorCitpbnQgaHdybmdfcmVnaXN0ZXIoc3RydWN0IGh3cm5nICpybmcpCit7CisJaW50IG11c3RfcmVnaXN0ZXJfbWlzYzsKKwlpbnQgZXJyID0gLUVJTlZBTDsKKwlzdHJ1Y3QgaHdybmcgKm9sZF9ybmcsICp0bXA7CisKKwlpZiAocm5nLT5uYW1lID09IE5VTEwgfHwKKwkgICAgcm5nLT5kYXRhX3JlYWQgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisKKwltdXRleF9sb2NrKCZybmdfbXV0ZXgpOworCisJLyogTXVzdCBub3QgcmVnaXN0ZXIgdHdvIFJOR3Mgd2l0aCB0aGUgc2FtZSBuYW1lLiAqLworCWVyciA9IC1FRVhJU1Q7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0bXAsICZybmdfbGlzdCwgbGlzdCkgeworCQlpZiAoc3RyY21wKHRtcC0+bmFtZSwgcm5nLT5uYW1lKSA9PSAwKQorCQkJZ290byBvdXRfdW5sb2NrOworCX0KKworCW11c3RfcmVnaXN0ZXJfbWlzYyA9IChjdXJyZW50X3JuZyA9PSBOVUxMKTsKKwlvbGRfcm5nID0gY3VycmVudF9ybmc7CisJaWYgKCFvbGRfcm5nKSB7CisJCWVyciA9IGh3cm5nX2luaXQocm5nKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0X3VubG9jazsKKwkJY3VycmVudF9ybmcgPSBybmc7CisJfQorCWVyciA9IDA7CisJaWYgKG11c3RfcmVnaXN0ZXJfbWlzYykgeworCQllcnIgPSByZWdpc3Rlcl9taXNjZGV2KCk7CisJCWlmIChlcnIpIHsKKwkJCWlmICghb2xkX3JuZykgeworCQkJCWh3cm5nX2NsZWFudXAocm5nKTsKKwkJCQljdXJyZW50X3JuZyA9IE5VTEw7CisJCQl9CisJCQlnb3RvIG91dF91bmxvY2s7CisJCX0KKwl9CisJSU5JVF9MSVNUX0hFQUQoJnJuZy0+bGlzdCk7CisJbGlzdF9hZGRfdGFpbCgmcm5nLT5saXN0LCAmcm5nX2xpc3QpOworb3V0X3VubG9jazoKKwltdXRleF91bmxvY2soJnJuZ19tdXRleCk7CitvdXQ6CisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGh3cm5nX3JlZ2lzdGVyKTsKKwordm9pZCBod3JuZ191bnJlZ2lzdGVyKHN0cnVjdCBod3JuZyAqcm5nKQoreworCWludCBlcnI7CisKKwltdXRleF9sb2NrKCZybmdfbXV0ZXgpOworCisJbGlzdF9kZWwoJnJuZy0+bGlzdCk7CisJaWYgKGN1cnJlbnRfcm5nID09IHJuZykgeworCQlod3JuZ19jbGVhbnVwKHJuZyk7CisJCWlmIChsaXN0X2VtcHR5KCZybmdfbGlzdCkpIHsKKwkJCWN1cnJlbnRfcm5nID0gTlVMTDsKKwkJfSBlbHNlIHsKKwkJCWN1cnJlbnRfcm5nID0gbGlzdF9lbnRyeShybmdfbGlzdC5wcmV2LCBzdHJ1Y3QgaHdybmcsIGxpc3QpOworCQkJZXJyID0gaHdybmdfaW5pdChjdXJyZW50X3JuZyk7CisJCQlpZiAoZXJyKQorCQkJCWN1cnJlbnRfcm5nID0gTlVMTDsKKwkJfQorCX0KKwlpZiAobGlzdF9lbXB0eSgmcm5nX2xpc3QpKQorCQl1bnJlZ2lzdGVyX21pc2NkZXYoKTsKKworCW11dGV4X3VubG9jaygmcm5nX211dGV4KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGh3cm5nX3VucmVnaXN0ZXIpOworCisKK01PRFVMRV9ERVNDUklQVElPTigiSC9XIFJhbmRvbSBOdW1iZXIgR2VuZXJhdG9yIChSTkcpIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9nZW9kZS1ybmcuYyBiL2RyaXZlcnMvY2hhci9od19yYW5kb20vZ2VvZGUtcm5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU2MWYyMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9od19yYW5kb20vZ2VvZGUtcm5nLmMKQEAgLTAsMCArMSwxMjggQEAKKy8qCisgKiBSTkcgZHJpdmVyIGZvciBBTUQgR2VvZGUgUk5HcworICoKKyAqIENvcHlyaWdodCAyMDA1IChjKSBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCisgKgorICogd2l0aCB0aGUgbWFqb3JpdHkgb2YgdGhlIGNvZGUgY29taW5nIGZyb206CisgKgorICogSGFyZHdhcmUgZHJpdmVyIGZvciB0aGUgSW50ZWwvQU1EL1ZJQSBSYW5kb20gTnVtYmVyIEdlbmVyYXRvcnMgKFJORykKKyAqIChjKSBDb3B5cmlnaHQgMjAwMyBSZWQgSGF0IEluYyA8amdhcnppa0ByZWRoYXQuY29tPgorICoKKyAqIGRlcml2ZWQgZnJvbQorICoKKyAqIEhhcmR3YXJlIGRyaXZlciBmb3IgdGhlIEFNRCA3NjggUmFuZG9tIE51bWJlciBHZW5lcmF0b3IgKFJORykKKyAqIChjKSBDb3B5cmlnaHQgMjAwMSBSZWQgSGF0IEluYyA8YWxhbkByZWRoYXQuY29tPgorICoKKyAqIGRlcml2ZWQgZnJvbQorICoKKyAqIEhhcmR3YXJlIGRyaXZlciBmb3IgSW50ZWwgaTgxMCBSYW5kb20gTnVtYmVyIEdlbmVyYXRvciAoUk5HKQorICogQ29weXJpZ2h0IDIwMDAsMjAwMSBKZWZmIEdhcnppayA8amdhcnppa0Bwb2JveC5jb20+CisgKiBDb3B5cmlnaHQgMjAwMCwyMDAxIFBoaWxpcHAgUnVtcGYgPHBydW1wZkBtYW5kcmFrZXNvZnQuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciAgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueQorICogd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9od19yYW5kb20uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworCisjZGVmaW5lIFBGWAlLQlVJTERfTU9ETkFNRSAiOiAiCisKKyNkZWZpbmUgR0VPREVfUk5HX0RBVEFfUkVHICAgMHg1MAorI2RlZmluZSBHRU9ERV9STkdfU1RBVFVTX1JFRyAweDU0CisKKy8qCisgKiBEYXRhIGZvciBQQ0kgZHJpdmVyIGludGVyZmFjZQorICoKKyAqIFRoaXMgZGF0YSBvbmx5IGV4aXN0cyBmb3IgZXhwb3J0aW5nIHRoZSBzdXBwb3J0ZWQKKyAqIFBDSSBpZHMgdmlhIE1PRFVMRV9ERVZJQ0VfVEFCTEUuICBXZSBkbyBub3QgYWN0dWFsbHkKKyAqIHJlZ2lzdGVyIGEgcGNpX2RyaXZlciwgYmVjYXVzZSBzb21lb25lIGVsc2UgbWlnaHQgb25lIGRheQorICogd2FudCB0byByZWdpc3RlciBhbm90aGVyIGRyaXZlciBvbiB0aGUgc2FtZSBQQ0kgaWQuCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBwY2lfdGJsW10gPSB7CisJeyBQQ0lfVkVORE9SX0lEX0FNRCwgUENJX0RFVklDRV9JRF9BTURfTFhfQUVTLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCwgfSwKKwl7IDAsIH0sCS8qIHRlcm1pbmF0ZSBsaXN0ICovCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHBjaV90YmwpOworCisKK3N0YXRpYyBpbnQgZ2VvZGVfcm5nX2RhdGFfcmVhZChzdHJ1Y3QgaHdybmcgKnJuZywgdTMyICpkYXRhKQoreworCXZvaWQgX19pb21lbSAqbWVtID0gKHZvaWQgX19pb21lbSAqKXJuZy0+cHJpdjsKKworCSpkYXRhID0gcmVhZGwobWVtICsgR0VPREVfUk5HX0RBVEFfUkVHKTsKKworCXJldHVybiA0OworfQorCitzdGF0aWMgaW50IGdlb2RlX3JuZ19kYXRhX3ByZXNlbnQoc3RydWN0IGh3cm5nICpybmcpCit7CisJdm9pZCBfX2lvbWVtICptZW0gPSAodm9pZCBfX2lvbWVtICopcm5nLT5wcml2OworCisJcmV0dXJuICEhKHJlYWRsKG1lbSArIEdFT0RFX1JOR19TVEFUVVNfUkVHKSk7Cit9CisKKworc3RhdGljIHN0cnVjdCBod3JuZyBnZW9kZV9ybmcgPSB7CisJLm5hbWUJCT0gImdlb2RlIiwKKwkuZGF0YV9wcmVzZW50CT0gZ2VvZGVfcm5nX2RhdGFfcHJlc2VudCwKKwkuZGF0YV9yZWFkCT0gZ2VvZGVfcm5nX2RhdGFfcmVhZCwKK307CisKKworc3RhdGljIGludCBfX2luaXQgbW9kX2luaXQodm9pZCkKK3sKKwlpbnQgZXJyID0gLUVOT0RFVjsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IE5VTEw7CisJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudDsKKwl2b2lkIF9faW9tZW0gKm1lbTsKKwl1bnNpZ25lZCBsb25nIHJuZ19iYXNlOworCisJZm9yX2VhY2hfcGNpX2RldihwZGV2KSB7CisJCWVudCA9IHBjaV9tYXRjaF9pZChwY2lfdGJsLCBwZGV2KTsKKwkJaWYgKGVudCkKKwkJCWdvdG8gZm91bmQ7CisJfQorCS8qIERldmljZSBub3QgZm91bmQuICovCisJZ290byBvdXQ7CisKK2ZvdW5kOgorCXJuZ19iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOworCWlmIChybmdfYmFzZSA9PSAwKQorCQlnb3RvIG91dDsKKwllcnIgPSAtRU5PTUVNOworCW1lbSA9IGlvcmVtYXAocm5nX2Jhc2UsIDB4NTgpOworCWlmICghbWVtKQorCQlnb3RvIG91dDsKKwlnZW9kZV9ybmcucHJpdiA9ICh1bnNpZ25lZCBsb25nKW1lbTsKKworCXByaW50ayhLRVJOX0lORk8gIkFNRCBHZW9kZSBSTkcgZGV0ZWN0ZWRcbiIpOworCWVyciA9IGh3cm5nX3JlZ2lzdGVyKCZnZW9kZV9ybmcpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiUk5HIHJlZ2lzdGVyaW5nIGZhaWxlZCAoJWQpXG4iLAorCQkgICAgICAgZXJyKTsKKwkJZ290byBvdXQ7CisJfQorb3V0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtb2RfZXhpdCh2b2lkKQoreworCXZvaWQgX19pb21lbSAqbWVtID0gKHZvaWQgX19pb21lbSAqKWdlb2RlX3JuZy5wcml2OworCisJaHdybmdfdW5yZWdpc3RlcigmZ2VvZGVfcm5nKTsKKwlpb3VubWFwKG1lbSk7Cit9CisKK3N1YnN5c19pbml0Y2FsbChtb2RfaW5pdCk7Cittb2R1bGVfZXhpdChtb2RfZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiSC9XIFJORyBkcml2ZXIgZm9yIEFNRCBHZW9kZSBMWCBDUFVzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL2ludGVsLXJuZy5jIGIvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9pbnRlbC1ybmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTk0YmQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9pbnRlbC1ybmcuYwpAQCAtMCwwICsxLDE4OSBAQAorLyoKKyAqIFJORyBkcml2ZXIgZm9yIEludGVsIFJOR3MKKyAqCisgKiBDb3B5cmlnaHQgMjAwNSAoYykgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICoKKyAqIHdpdGggdGhlIG1ham9yaXR5IG9mIHRoZSBjb2RlIGNvbWluZyBmcm9tOgorICoKKyAqIEhhcmR3YXJlIGRyaXZlciBmb3IgdGhlIEludGVsL0FNRC9WSUEgUmFuZG9tIE51bWJlciBHZW5lcmF0b3JzIChSTkcpCisgKiAoYykgQ29weXJpZ2h0IDIwMDMgUmVkIEhhdCBJbmMgPGpnYXJ6aWtAcmVkaGF0LmNvbT4KKyAqCisgKiBkZXJpdmVkIGZyb20KKyAqCisgKiBIYXJkd2FyZSBkcml2ZXIgZm9yIHRoZSBBTUQgNzY4IFJhbmRvbSBOdW1iZXIgR2VuZXJhdG9yIChSTkcpCisgKiAoYykgQ29weXJpZ2h0IDIwMDEgUmVkIEhhdCBJbmMgPGFsYW5AcmVkaGF0LmNvbT4KKyAqCisgKiBkZXJpdmVkIGZyb20KKyAqCisgKiBIYXJkd2FyZSBkcml2ZXIgZm9yIEludGVsIGk4MTAgUmFuZG9tIE51bWJlciBHZW5lcmF0b3IgKFJORykKKyAqIENvcHlyaWdodCAyMDAwLDIwMDEgSmVmZiBHYXJ6aWsgPGpnYXJ6aWtAcG9ib3guY29tPgorICogQ29weXJpZ2h0IDIwMDAsMjAwMSBQaGlsaXBwIFJ1bXBmIDxwcnVtcGZAbWFuZHJha2Vzb2Z0LmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkKKyAqIHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaHdfcmFuZG9tLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKworI2RlZmluZSBQRlgJS0JVSUxEX01PRE5BTUUgIjogIgorCisvKgorICogUk5HIHJlZ2lzdGVycworICovCisjZGVmaW5lIElOVEVMX1JOR19IV19TVEFUVVMJCQkwCisjZGVmaW5lICAgICAgICAgSU5URUxfUk5HX1BSRVNFTlQJCTB4NDAKKyNkZWZpbmUgICAgICAgICBJTlRFTF9STkdfRU5BQkxFRAkJMHgwMQorI2RlZmluZSBJTlRFTF9STkdfU1RBVFVTCQkJMQorI2RlZmluZSAgICAgICAgIElOVEVMX1JOR19EQVRBX1BSRVNFTlQJCTB4MDEKKyNkZWZpbmUgSU5URUxfUk5HX0RBVEEJCQkJMgorCisvKgorICogTWFnaWMgYWRkcmVzcyBhdCB3aGljaCBJbnRlbCBQQ0kgYnJpZGdlcyBsb2NhdGUgdGhlIFJORworICovCisjZGVmaW5lIElOVEVMX1JOR19BRERSCQkJCTB4RkZCQzAxNUYKKyNkZWZpbmUgSU5URUxfUk5HX0FERFJfTEVOCQkJMworCisvKgorICogRGF0YSBmb3IgUENJIGRyaXZlciBpbnRlcmZhY2UKKyAqCisgKiBUaGlzIGRhdGEgb25seSBleGlzdHMgZm9yIGV4cG9ydGluZyB0aGUgc3VwcG9ydGVkCisgKiBQQ0kgaWRzIHZpYSBNT0RVTEVfREVWSUNFX1RBQkxFLiAgV2UgZG8gbm90IGFjdHVhbGx5CisgKiByZWdpc3RlciBhIHBjaV9kcml2ZXIsIGJlY2F1c2Ugc29tZW9uZSBlbHNlIG1pZ2h0IG9uZSBkYXkKKyAqIHdhbnQgdG8gcmVnaXN0ZXIgYW5vdGhlciBkcml2ZXIgb24gdGhlIHNhbWUgUENJIGlkLgorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgcGNpX3RibFtdID0geworCXsgMHg4MDg2LCAweDI0MTgsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAsIH0sCisJeyAweDgwODYsIDB4MjQyOCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCwgfSwKKwl7IDB4ODA4NiwgMHgyNDMwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwLCB9LAorCXsgMHg4MDg2LCAweDI0NDgsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAsIH0sCisJeyAweDgwODYsIDB4MjQ0ZSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCwgfSwKKwl7IDB4ODA4NiwgMHgyNDVlLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwLCB9LAorCXsgMCwgfSwJLyogdGVybWluYXRlIGxpc3QgKi8KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgcGNpX3RibCk7CisKKworc3RhdGljIGlubGluZSB1OCBod3N0YXR1c19nZXQodm9pZCBfX2lvbWVtICptZW0pCit7CisJcmV0dXJuIHJlYWRiKG1lbSArIElOVEVMX1JOR19IV19TVEFUVVMpOworfQorCitzdGF0aWMgaW5saW5lIHU4IGh3c3RhdHVzX3NldCh2b2lkIF9faW9tZW0gKm1lbSwKKwkJCSAgICAgIHU4IGh3X3N0YXR1cykKK3sKKwl3cml0ZWIoaHdfc3RhdHVzLCBtZW0gKyBJTlRFTF9STkdfSFdfU1RBVFVTKTsKKwlyZXR1cm4gaHdzdGF0dXNfZ2V0KG1lbSk7Cit9CisKK3N0YXRpYyBpbnQgaW50ZWxfcm5nX2RhdGFfcHJlc2VudChzdHJ1Y3QgaHdybmcgKnJuZykKK3sKKwl2b2lkIF9faW9tZW0gKm1lbSA9ICh2b2lkIF9faW9tZW0gKilybmctPnByaXY7CisKKwlyZXR1cm4gISEocmVhZGIobWVtICsgSU5URUxfUk5HX1NUQVRVUykgJiBJTlRFTF9STkdfREFUQV9QUkVTRU5UKTsKK30KKworc3RhdGljIGludCBpbnRlbF9ybmdfZGF0YV9yZWFkKHN0cnVjdCBod3JuZyAqcm5nLCB1MzIgKmRhdGEpCit7CisJdm9pZCBfX2lvbWVtICptZW0gPSAodm9pZCBfX2lvbWVtICopcm5nLT5wcml2OworCisJKmRhdGEgPSByZWFkYihtZW0gKyBJTlRFTF9STkdfREFUQSk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBpbnRlbF9ybmdfaW5pdChzdHJ1Y3QgaHdybmcgKnJuZykKK3sKKwl2b2lkIF9faW9tZW0gKm1lbSA9ICh2b2lkIF9faW9tZW0gKilybmctPnByaXY7CisJdTggaHdfc3RhdHVzOworCWludCBlcnIgPSAtRUlPOworCisJaHdfc3RhdHVzID0gaHdzdGF0dXNfZ2V0KG1lbSk7CisJLyogdHVybiBSTkcgaC93IG9uLCBpZiBpdCdzIG9mZiAqLworCWlmICgoaHdfc3RhdHVzICYgSU5URUxfUk5HX0VOQUJMRUQpID09IDApCisJCWh3X3N0YXR1cyA9IGh3c3RhdHVzX3NldChtZW0sIGh3X3N0YXR1cyB8IElOVEVMX1JOR19FTkFCTEVEKTsKKwlpZiAoKGh3X3N0YXR1cyAmIElOVEVMX1JOR19FTkFCTEVEKSA9PSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImNhbm5vdCBlbmFibGUgUk5HLCBhYm9ydGluZ1xuIik7CisJCWdvdG8gb3V0OworCX0KKwllcnIgPSAwOworb3V0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIGludGVsX3JuZ19jbGVhbnVwKHN0cnVjdCBod3JuZyAqcm5nKQoreworCXZvaWQgX19pb21lbSAqbWVtID0gKHZvaWQgX19pb21lbSAqKXJuZy0+cHJpdjsKKwl1OCBod19zdGF0dXM7CisKKwlod19zdGF0dXMgPSBod3N0YXR1c19nZXQobWVtKTsKKwlpZiAoaHdfc3RhdHVzICYgSU5URUxfUk5HX0VOQUJMRUQpCisJCWh3c3RhdHVzX3NldChtZW0sIGh3X3N0YXR1cyAmIH5JTlRFTF9STkdfRU5BQkxFRCk7CisJZWxzZQorCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAidW51c3VhbDogUk5HIGFscmVhZHkgZGlzYWJsZWRcbiIpOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgaHdybmcgaW50ZWxfcm5nID0geworCS5uYW1lCQk9ICJpbnRlbCIsCisJLmluaXQJCT0gaW50ZWxfcm5nX2luaXQsCisJLmNsZWFudXAJPSBpbnRlbF9ybmdfY2xlYW51cCwKKwkuZGF0YV9wcmVzZW50CT0gaW50ZWxfcm5nX2RhdGFfcHJlc2VudCwKKwkuZGF0YV9yZWFkCT0gaW50ZWxfcm5nX2RhdGFfcmVhZCwKK307CisKKworc3RhdGljIGludCBfX2luaXQgbW9kX2luaXQodm9pZCkKK3sKKwlpbnQgZXJyID0gLUVOT0RFVjsKKwl2b2lkIF9faW9tZW0gKm1lbTsKKwl1OCBod19zdGF0dXM7CisKKwlpZiAoIXBjaV9kZXZfcHJlc2VudChwY2lfdGJsKSkKKwkJZ290byBvdXQ7IC8qIERldmljZSBub3QgZm91bmQuICovCisKKwllcnIgPSAtRU5PTUVNOworCW1lbSA9IGlvcmVtYXAoSU5URUxfUk5HX0FERFIsIElOVEVMX1JOR19BRERSX0xFTik7CisJaWYgKCFtZW0pCisJCWdvdG8gb3V0OworCWludGVsX3JuZy5wcml2ID0gKHVuc2lnbmVkIGxvbmcpbWVtOworCisJLyogQ2hlY2sgZm9yIEludGVsIDgyODAyICovCisJZXJyID0gLUVOT0RFVjsKKwlod19zdGF0dXMgPSBod3N0YXR1c19nZXQobWVtKTsKKwlpZiAoKGh3X3N0YXR1cyAmIElOVEVMX1JOR19QUkVTRU5UKSA9PSAwKQorCQlnb3RvIGVycl91bm1hcDsKKworCXByaW50ayhLRVJOX0lORk8gIkludGVsIDgyODAyIFJORyBkZXRlY3RlZFxuIik7CisJZXJyID0gaHdybmdfcmVnaXN0ZXIoJmludGVsX3JuZyk7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJSTkcgcmVnaXN0ZXJpbmcgZmFpbGVkICglZClcbiIsCisJCSAgICAgICBlcnIpOworCQlnb3RvIG91dDsKKwl9CitvdXQ6CisJcmV0dXJuIGVycjsKKworZXJyX3VubWFwOgorCWlvdW5tYXAobWVtKTsKKwlnb3RvIG91dDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG1vZF9leGl0KHZvaWQpCit7CisJdm9pZCBfX2lvbWVtICptZW0gPSAodm9pZCBfX2lvbWVtICopaW50ZWxfcm5nLnByaXY7CisKKwlod3JuZ191bnJlZ2lzdGVyKCZpbnRlbF9ybmcpOworCWlvdW5tYXAobWVtKTsKK30KKworc3Vic3lzX2luaXRjYWxsKG1vZF9pbml0KTsKK21vZHVsZV9leGl0KG1vZF9leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJIL1cgUk5HIGRyaXZlciBmb3IgSW50ZWwgY2hpcHNldHMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9od19yYW5kb20vaXhwNHh4LXJuZy5jIGIvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9peHA0eHgtcm5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY3MTAyMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9od19yYW5kb20vaXhwNHh4LXJuZy5jCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBkcml2ZXJzL2NoYXIvcm5nL2l4cDR4eC1ybmcuYworICoKKyAqIFJORyBkcml2ZXIgZm9yIEludGVsIElYUDR4eCBmYW1pbHkgb2YgTlBVcworICoKKyAqIEF1dGhvcjogRGVlcGFrIFNheGVuYSA8ZHNheGVuYUBwbGV4aXR5Lm5ldD4KKyAqCisgKiBDb3B5cmlnaHQgMjAwNSAoYykgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICoKKyAqIEZpeGVzIGJ5IE1pY2hhZWwgQnVlc2NoCisgKgorICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyICB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIuIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55CisgKiB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvaHdfcmFuZG9tLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKworCitzdGF0aWMgaW50IGl4cDR4eF9ybmdfZGF0YV9yZWFkKHN0cnVjdCBod3JuZyAqcm5nLCB1MzIgKmJ1ZmZlcikKK3sKKwl2b2lkIF9faW9tZW0gKiBybmdfYmFzZSA9ICh2b2lkIF9faW9tZW0gKilybmctPnByaXY7CisKKwkqYnVmZmVyID0gX19yYXdfcmVhZGwocm5nX2Jhc2UpOworCisJcmV0dXJuIDQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaHdybmcgaXhwNHh4X3JuZ19vcHMgPSB7CisJLm5hbWUJCT0gIml4cDR4eCIsCisJLmRhdGFfcmVhZAk9IGl4cDR4eF9ybmdfZGF0YV9yZWFkLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaXhwNHh4X3JuZ19pbml0KHZvaWQpCit7CisJdm9pZCBfX2lvbWVtICogcm5nX2Jhc2U7CisJaW50IGVycjsKKworCXJuZ19iYXNlID0gaW9yZW1hcCgweDcwMDAyMTAwLCA0KTsKKwlpZiAoIXJuZ19iYXNlKQorCQlyZXR1cm4gLUVOT01FTTsKKwlpeHA0eHhfcm5nX29wcy5wcml2ID0gKHVuc2lnbmVkIGxvbmcpcm5nX2Jhc2U7CisJZXJyID0gaHdybmdfcmVnaXN0ZXIoJml4cDR4eF9ybmdfb3BzKTsKKwlpZiAoZXJyKQorCQlpb3VubWFwKHJuZ19iYXNlKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBpeHA0eHhfcm5nX2V4aXQodm9pZCkKK3sKKwl2b2lkIF9faW9tZW0gKiBybmdfYmFzZSA9ICh2b2lkIF9faW9tZW0gKilpeHA0eHhfcm5nX29wcy5wcml2OworCisJaHdybmdfdW5yZWdpc3RlcigmaXhwNHh4X3JuZ19vcHMpOworCWlvdW5tYXAocm5nX2Jhc2UpOworfQorCitzdWJzeXNfaW5pdGNhbGwoaXhwNHh4X3JuZ19pbml0KTsKK21vZHVsZV9leGl0KGl4cDR4eF9ybmdfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkRlZXBhayBTYXhlbmEgPGRzYXhlbmFAcGxleGl0eS5uZXQ+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkgvVyBSYW5kb20gTnVtYmVyIEdlbmVyYXRvciAoUk5HKSBkcml2ZXIgZm9yIElYUDR4eCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9vbWFwLXJuZy5jIGIvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9vbWFwLXJuZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxOTUxNmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL29tYXAtcm5nLmMKQEAgLTAsMCArMSwyMDggQEAKKy8qCisgKiBkcml2ZXIvY2hhci9od19yYW5kb20vb21hcC1ybmcuYworICoKKyAqIFJORyBkcml2ZXIgZm9yIFRJIE9NQVAgQ1BVIGZhbWlseQorICoKKyAqIEF1dGhvcjogRGVlcGFrIFNheGVuYSA8ZHNheGVuYUBwbGV4aXR5Lm5ldD4KKyAqCisgKiBDb3B5cmlnaHQgMjAwNSAoYykgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICoKKyAqIE1vc3RseSBiYXNlZCBvbiBvcmlnaW5hbCBkcml2ZXI6CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IE5va2lhIENvcnBvcmF0aW9uCisgKiBBdXRob3I6IEp1aGEgWXJq77+977+9PGp1aGEueXJqb2xhQG5va2lhLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkKKyAqIHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqCisgKiBUT0RPOgorICoKKyAqIC0gTWFrZSBzdGF0dXMgdXBkYXRlZCBiZSBpbnRlcnJ1cHQgZHJpdmVuIHNvIHdlIGRvbid0IHBvbGwKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9od19yYW5kb20uaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9jbG9jay5oPgorCisjZGVmaW5lIFJOR19PVVRfUkVHCQkweDAwCQkvKiBPdXRwdXQgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUk5HX1NUQVRfUkVHCQkweDA0CQkvKiBTdGF0dXMgcmVnaXN0ZXIKKwkJCQkJCQlbMF0gPSBTVEFUX0JVU1kgKi8KKyNkZWZpbmUgUk5HX0FMQVJNX1JFRwkJMHgyNAkJLyogQWxhcm0gcmVnaXN0ZXIKKwkJCQkJCQlbNzowXSA9IEFMQVJNX0NPVU5URVIgKi8KKyNkZWZpbmUgUk5HX0NPTkZJR19SRUcJCTB4MjgJCS8qIENvbmZpZ3VyYXRpb24gcmVnaXN0ZXIKKwkJCQkJCQlbMTE6Nl0gPSBSRVNFVF9DT1VOVAorCQkJCQkJCVs1OjNdICA9IFJJTkcyX0RFTEFZCisJCQkJCQkJWzI6MF0gID0gUklORzFfREVMQVkgKi8KKyNkZWZpbmUgUk5HX1JFVl9SRUcJCTB4M2MJCS8qIFJldmlzaW9uIHJlZ2lzdGVyCisJCQkJCQkJWzc6MF0gPSBSRVZfTkIgKi8KKyNkZWZpbmUgUk5HX01BU0tfUkVHCQkweDQwCQkvKiBNYXNrIGFuZCByZXNldCByZWdpc3RlcgorCQkJCQkJCVsyXSA9IElUX0VOCisJCQkJCQkJWzFdID0gU09GVFJFU0VUCisJCQkJCQkJWzBdID0gQVVUT0lETEUgKi8KKyNkZWZpbmUgUk5HX1NZU1NUQVRVUwkJMHg0NAkJLyogU3lzdGVtIHN0YXR1cworCQkJCQkJCVswXSA9IFJFU0VURE9ORSAqLworCitzdGF0aWMgdm9pZCBfX2lvbWVtICpybmdfYmFzZTsKK3N0YXRpYyBzdHJ1Y3QgY2xrICpybmdfaWNrOworc3RhdGljIHN0cnVjdCBkZXZpY2UgKnJuZ19kZXY7CisKK3N0YXRpYyB1MzIgb21hcF9ybmdfcmVhZF9yZWcoaW50IHJlZykKK3sKKwlyZXR1cm4gX19yYXdfcmVhZGwocm5nX2Jhc2UgKyByZWcpOworfQorCitzdGF0aWMgdm9pZCBvbWFwX3JuZ193cml0ZV9yZWcoaW50IHJlZywgdTMyIHZhbCkKK3sKKwlfX3Jhd193cml0ZWwodmFsLCBybmdfYmFzZSArIHJlZyk7Cit9CisKKy8qIFJFVklTSVQ6IERvZXMgdGhlIHN0YXR1cyBiaXQgcmVhbGx5IHdvcmsgb24gMTZ4eD8gKi8KK3N0YXRpYyBpbnQgb21hcF9ybmdfZGF0YV9wcmVzZW50KHN0cnVjdCBod3JuZyAqcm5nKQoreworCXJldHVybiBvbWFwX3JuZ19yZWFkX3JlZyhSTkdfU1RBVF9SRUcpID8gMCA6IDE7Cit9CisKK3N0YXRpYyBpbnQgb21hcF9ybmdfZGF0YV9yZWFkKHN0cnVjdCBod3JuZyAqcm5nLCB1MzIgKmRhdGEpCit7CisJKmRhdGEgPSBvbWFwX3JuZ19yZWFkX3JlZyhSTkdfT1VUX1JFRyk7CisKKwlyZXR1cm4gNDsKK30KKworc3RhdGljIHN0cnVjdCBod3JuZyBvbWFwX3JuZ19vcHMgPSB7CisJLm5hbWUJCT0gIm9tYXAiLAorCS5kYXRhX3ByZXNlbnQJPSBvbWFwX3JuZ19kYXRhX3ByZXNlbnQsCisJLmRhdGFfcmVhZAk9IG9tYXBfcm5nX2RhdGFfcmVhZCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG9tYXBfcm5nX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IHJlc291cmNlICpyZXMsICptZW07CisJaW50IHJldDsKKworCS8qCisJICogQSBiaXQgdWdseSwgYW5kIGl0IHdpbGwgbmV2ZXIgYWN0dWFsbHkgaGFwcGVuIGJ1dCB0aGVyZSBjYW4KKwkgKiBiZSBvbmx5IG9uZSBSTkcgYW5kIHRoaXMgY2F0Y2hlcyBhbnkgYm9yaworCSAqLworCUJVR19PTihybmdfZGV2KTsKKworICAgIAlpZiAoY3B1X2lzX29tYXAyNHh4KCkpIHsKKwkJcm5nX2ljayA9IGNsa19nZXQoTlVMTCwgInJuZ19pY2siKTsKKwkJaWYgKElTX0VSUihybmdfaWNrKSkgeworCQkJZGV2X2VycihkZXYsICJDb3VsZCBub3QgZ2V0IHJuZ19pY2tcbiIpOworCQkJcmV0ID0gUFRSX0VSUihybmdfaWNrKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJZWxzZSB7CisJCQljbGtfdXNlKHJuZ19pY2spOworCQl9CisJfQorCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKworCWlmICghcmVzKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCW1lbSA9IHJlcXVlc3RfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXMtPmVuZCAtIHJlcy0+c3RhcnQgKyAxLAorCQkJCSBwZGV2LT5uYW1lKTsKKwlpZiAobWVtID09IE5VTEwpCisJCXJldHVybiAtRUJVU1k7CisKKwlkZXZfc2V0X2RydmRhdGEoZGV2LCBtZW0pOworCXJuZ19iYXNlID0gKHUzMiBfX2lvbWVtICopaW9fcDJ2KHJlcy0+c3RhcnQpOworCisJcmV0ID0gaHdybmdfcmVnaXN0ZXIoJm9tYXBfcm5nX29wcyk7CisJaWYgKHJldCkgeworCQlyZWxlYXNlX3Jlc291cmNlKG1lbSk7CisJCXJuZ19iYXNlID0gTlVMTDsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlkZXZfaW5mbyhkZXYsICJPTUFQIFJhbmRvbSBOdW1iZXIgR2VuZXJhdG9yIHZlci4gJTAyeFxuIiwKKwkJb21hcF9ybmdfcmVhZF9yZWcoUk5HX1JFVl9SRUcpKTsKKwlvbWFwX3JuZ193cml0ZV9yZWcoUk5HX01BU0tfUkVHLCAweDEpOworCisJcm5nX2RldiA9IGRldjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZXhpdCBvbWFwX3JuZ19yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCByZXNvdXJjZSAqbWVtID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlod3JuZ191bnJlZ2lzdGVyKCZvbWFwX3JuZ19vcHMpOworCisJb21hcF9ybmdfd3JpdGVfcmVnKFJOR19NQVNLX1JFRywgMHgwKTsKKworCWlmIChjcHVfaXNfb21hcDI0eHgoKSkgeworCQljbGtfdW51c2Uocm5nX2ljayk7CisJCWNsa19wdXQocm5nX2ljayk7CisJfQorCisJcmVsZWFzZV9yZXNvdXJjZShtZW0pOworCXJuZ19iYXNlID0gTlVMTDsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BNCisKK3N0YXRpYyBpbnQgb21hcF9ybmdfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBtZXNzYWdlLCB1MzIgbGV2ZWwpCit7CisJb21hcF9ybmdfd3JpdGVfcmVnKFJOR19NQVNLX1JFRywgMHgwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9tYXBfcm5nX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBtZXNzYWdlLCB1MzIgbGV2ZWwpCit7CisJb21hcF9ybmdfd3JpdGVfcmVnKFJOR19NQVNLX1JFRywgMHgxKTsKKworCXJldHVybiAxOworfQorCisjZWxzZQorCisjZGVmaW5lCW9tYXBfcm5nX3N1c3BlbmQJTlVMTAorI2RlZmluZQlvbWFwX3JuZ19yZXN1bWUJCU5VTEwKKworI2VuZGlmCisKKworc3RhdGljIHN0cnVjdCBkZXZpY2VfZHJpdmVyIG9tYXBfcm5nX2RyaXZlciA9IHsKKwkubmFtZQkJPSAib21hcF9ybmciLAorCS5idXMJCT0gJnBsYXRmb3JtX2J1c190eXBlLAorCS5wcm9iZQkJPSBvbWFwX3JuZ19wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZXhpdF9wKG9tYXBfcm5nX3JlbW92ZSksCisJLnN1c3BlbmQJPSBvbWFwX3JuZ19zdXNwZW5kLAorCS5yZXN1bWUJCT0gb21hcF9ybmdfcmVzdW1lCit9OworCitzdGF0aWMgaW50IF9faW5pdCBvbWFwX3JuZ19pbml0KHZvaWQpCit7CisJaWYgKCFjcHVfaXNfb21hcDE2eHgoKSAmJiAhY3B1X2lzX29tYXAyNHh4KCkpCisJCXJldHVybiAtRU5PREVWOworCisJcmV0dXJuIGRyaXZlcl9yZWdpc3Rlcigmb21hcF9ybmdfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG9tYXBfcm5nX2V4aXQodm9pZCkKK3sKKwlkcml2ZXJfdW5yZWdpc3Rlcigmb21hcF9ybmdfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQob21hcF9ybmdfaW5pdCk7Cittb2R1bGVfZXhpdChvbWFwX3JuZ19leGl0KTsKKworTU9EVUxFX0FVVEhPUigiRGVlcGFrIFNheGVuYSAoYW5kIG90aGVycykiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9od19yYW5kb20vdmlhLXJuZy5jIGIvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS92aWEtcm5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU3ODZiNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9od19yYW5kb20vdmlhLXJuZy5jCkBAIC0wLDAgKzEsMTgzIEBACisvKgorICogUk5HIGRyaXZlciBmb3IgVklBIFJOR3MKKyAqCisgKiBDb3B5cmlnaHQgMjAwNSAoYykgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICoKKyAqIHdpdGggdGhlIG1ham9yaXR5IG9mIHRoZSBjb2RlIGNvbWluZyBmcm9tOgorICoKKyAqIEhhcmR3YXJlIGRyaXZlciBmb3IgdGhlIEludGVsL0FNRC9WSUEgUmFuZG9tIE51bWJlciBHZW5lcmF0b3JzIChSTkcpCisgKiAoYykgQ29weXJpZ2h0IDIwMDMgUmVkIEhhdCBJbmMgPGpnYXJ6aWtAcmVkaGF0LmNvbT4KKyAqCisgKiBkZXJpdmVkIGZyb20KKyAqCisgKiBIYXJkd2FyZSBkcml2ZXIgZm9yIHRoZSBBTUQgNzY4IFJhbmRvbSBOdW1iZXIgR2VuZXJhdG9yIChSTkcpCisgKiAoYykgQ29weXJpZ2h0IDIwMDEgUmVkIEhhdCBJbmMgPGFsYW5AcmVkaGF0LmNvbT4KKyAqCisgKiBkZXJpdmVkIGZyb20KKyAqCisgKiBIYXJkd2FyZSBkcml2ZXIgZm9yIEludGVsIGk4MTAgUmFuZG9tIE51bWJlciBHZW5lcmF0b3IgKFJORykKKyAqIENvcHlyaWdodCAyMDAwLDIwMDEgSmVmZiBHYXJ6aWsgPGpnYXJ6aWtAcG9ib3guY29tPgorICogQ29weXJpZ2h0IDIwMDAsMjAwMSBQaGlsaXBwIFJ1bXBmIDxwcnVtcGZAbWFuZHJha2Vzb2Z0LmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkKKyAqIHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaHdfcmFuZG9tLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL21zci5oPgorI2luY2x1ZGUgPGFzbS9jcHVmZWF0dXJlLmg+CisKKworI2RlZmluZSBQRlgJS0JVSUxEX01PRE5BTUUgIjogIgorCisKK2VudW0geworCVZJQV9TVFJGSUxUX0NOVF9TSElGVAk9IDE2LAorCVZJQV9TVFJGSUxUX0ZBSUwJPSAoMSA8PCAxNSksCisJVklBX1NUUkZJTFRfRU5BQkxFCT0gKDEgPDwgMTQpLAorCVZJQV9SQVdCSVRTX0VOQUJMRQk9ICgxIDw8IDEzKSwKKwlWSUFfUk5HX0VOQUJMRQkJPSAoMSA8PCA2KSwKKwlWSUFfWFNUT1JFX0NOVF9NQVNLCT0gMHgwRiwKKworCVZJQV9STkdfQ0hVTktfOAkJPSAweDAwLAkvKiA2NCByYW5kIGJpdHMsIDY0IHN0b3JlZCBiaXRzICovCisJVklBX1JOR19DSFVOS180CQk9IDB4MDEsCS8qIDMyIHJhbmQgYml0cywgMzIgc3RvcmVkIGJpdHMgKi8KKwlWSUFfUk5HX0NIVU5LXzRfTUFTSwk9IDB4RkZGRkZGRkYsCisJVklBX1JOR19DSFVOS18yCQk9IDB4MDIsCS8qIDE2IHJhbmQgYml0cywgMzIgc3RvcmVkIGJpdHMgKi8KKwlWSUFfUk5HX0NIVU5LXzJfTUFTSwk9IDB4RkZGRiwKKwlWSUFfUk5HX0NIVU5LXzEJCT0gMHgwMywJLyogOCByYW5kIGJpdHMsIDMyIHN0b3JlZCBiaXRzICovCisJVklBX1JOR19DSFVOS18xX01BU0sJPSAweEZGLAorfTsKKworLyoKKyAqIEludmVzdGlnYXRlIHVzaW5nIHRoZSAncmVwJyBwcmVmaXggdG8gb2J0YWluIDMyIGJpdHMgb2YgcmFuZG9tIGRhdGEKKyAqIGluIG9uZSBpbnNuLiAgVGhlIHVwc2lkZSBpcyBwb3RlbnRpYWxseSBiZXR0ZXIgcGVyZm9ybWFuY2UuICBUaGUKKyAqIGRvd25zaWRlIGlzIHRoYXQgdGhlIGluc3RydWN0aW9uIGJlY29tZXMgbm8gbG9uZ2VyIGF0b21pYy4gIER1ZSB0bworICogdGhpcywganVzdCBsaWtlIGZhbWlsaWFyIGlzc3VlcyB3aXRoIC9kZXYvcmFuZG9tIGl0c2VsZiwgdGhlIHdvcnN0CisgKiBjYXNlIG9mIGEgJ3JlcCB4c3RvcmUnIGNvdWxkIHBvdGVudGlhbGx5IHBhdXNlIGEgY3B1IGZvciBhbgorICogdW5yZWFzb25hYmx5IGxvbmcgdGltZS4gIEluIHByYWN0aWNlLCB0aGlzIGNvbmRpdGlvbiB3b3VsZCBsaWtlbHkKKyAqIG9ubHkgb2NjdXIgd2hlbiB0aGUgaGFyZHdhcmUgaXMgZmFpbGluZy4gIChvciBzbyB3ZSBob3BlIDopKQorICoKKyAqIEFub3RoZXIgcG9zc2libGUgcGVyZm9ybWFuY2UgYm9vc3QgbWF5IGNvbWUgZnJvbSBzaW1wbHkgYnVmZmVyaW5nCisgKiB1bnRpbCB3ZSBoYXZlIDQgYnl0ZXMsIHRodXMgcmV0dXJuaW5nIGEgdTMyIGF0IGEgdGltZSwKKyAqIGluc3RlYWQgb2YgdGhlIGN1cnJlbnQgdTgtYXQtYS10aW1lLgorICovCisKK3N0YXRpYyBpbmxpbmUgdTMyIHhzdG9yZSh1MzIgKmFkZHIsIHUzMiBlZHhfaW4pCit7CisJdTMyIGVheF9vdXQ7CisKKwlhc20oIi5ieXRlIDB4MEYsMHhBNywweEMwIC8qIHhzdG9yZSAlJWVkaSAoYWRkcj0lMCkgKi8iCisJCToiPW0iKCphZGRyKSwgIj1hIihlYXhfb3V0KQorCQk6IkQiKGFkZHIpLCAiZCIoZWR4X2luKSk7CisKKwlyZXR1cm4gZWF4X291dDsKK30KKworc3RhdGljIGludCB2aWFfcm5nX2RhdGFfcHJlc2VudChzdHJ1Y3QgaHdybmcgKnJuZykKK3sKKwl1MzIgYnl0ZXNfb3V0OworCXUzMiAqdmlhX3JuZ19kYXR1bSA9ICh1MzIgKikoJnJuZy0+cHJpdik7CisKKwkvKiBXZSBjaG9vc2UgdGhlIHJlY29tbWVuZGVkIDEtYnl0ZS1wZXItaW5zdHJ1Y3Rpb24gUk5HIHJhdGUsCisJICogZm9yIGdyZWF0ZXIgcmFuZG9tbmVzcyBhdCB0aGUgZXhwZW5zZSBvZiBzcGVlZC4gIExhcmdlcgorCSAqIHZhbHVlcyAyLCA0LCBvciA4IGJ5dGVzLXBlci1pbnN0cnVjdGlvbiB5aWVsZCBncmVhdGVyCisJICogc3BlZWQgYXQgbGVzc2VyIHJhbmRvbW5lc3MuCisJICoKKwkgKiBJZiB5b3UgY2hhbmdlIHRoaXMgdG8gYW5vdGhlciBWSUFfQ0hVTktfbiwgeW91IG11c3QgYWxzbworCSAqIGNoYW5nZSB0aGUgLT5uX2J5dGVzIHZhbHVlcyBpbiBybmdfdmVuZG9yX29wc1tdIHRhYmxlcy4KKwkgKiBWSUFfQ0hVTktfOCByZXF1aXJlcyBmdXJ0aGVyIGNvZGUgY2hhbmdlcy4KKwkgKgorCSAqIEEgY29weSBvZiBNU1JfVklBX1JORyBpcyBwbGFjZWQgaW4gZWF4X291dCB3aGVuIHhzdG9yZQorCSAqIGNvbXBsZXRlcy4KKwkgKi8KKworCSp2aWFfcm5nX2RhdHVtID0gMDsgLyogcGFyYW5vaWEsIG5vdCByZWFsbHkgbmVjZXNzYXJ5ICovCisJYnl0ZXNfb3V0ID0geHN0b3JlKHZpYV9ybmdfZGF0dW0sIFZJQV9STkdfQ0hVTktfMSk7CisJYnl0ZXNfb3V0ICY9IFZJQV9YU1RPUkVfQ05UX01BU0s7CisJaWYgKGJ5dGVzX291dCA9PSAwKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCB2aWFfcm5nX2RhdGFfcmVhZChzdHJ1Y3QgaHdybmcgKnJuZywgdTMyICpkYXRhKQoreworCXUzMiB2aWFfcm5nX2RhdHVtID0gKHUzMilybmctPnByaXY7CisKKwkqZGF0YSA9IHZpYV9ybmdfZGF0dW07CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCB2aWFfcm5nX2luaXQoc3RydWN0IGh3cm5nICpybmcpCit7CisJdTMyIGxvLCBoaSwgb2xkX2xvOworCisJLyogQ29udHJvbCB0aGUgUk5HIHZpYSBNU1IuICBUcmVhZCBsaWdodGx5IGFuZCBwYXkgdmVyeSBjbG9zZQorCSAqIGNsb3NlIGF0dGVudGlvbiB0byB2YWx1ZXMgd3JpdHRlbiwgYXMgdGhlIHJlc2VydmVkIGZpZWxkcworCSAqIGFyZSBkb2N1bWVudGVkIHRvIGJlICJ1bmRlZmluZWQgYW5kIHVucHJlZGljdGFibGUiOyBidXQgaXQKKwkgKiBkb2VzIG5vdCBzYXkgdG8gd3JpdGUgdGhlbSBhcyB6ZXJvLCBzbyBJIG1ha2UgYSBndWVzcyB0aGF0CisJICogd2UgcmVzdG9yZSB0aGUgdmFsdWVzIHdlIGZpbmQgaW4gdGhlIHJlZ2lzdGVyLgorCSAqLworCXJkbXNyKE1TUl9WSUFfUk5HLCBsbywgaGkpOworCisJb2xkX2xvID0gbG87CisJbG8gJj0gfigweDdmIDw8IFZJQV9TVFJGSUxUX0NOVF9TSElGVCk7CisJbG8gJj0gflZJQV9YU1RPUkVfQ05UX01BU0s7CisJbG8gJj0gfihWSUFfU1RSRklMVF9FTkFCTEUgfCBWSUFfU1RSRklMVF9GQUlMIHwgVklBX1JBV0JJVFNfRU5BQkxFKTsKKwlsbyB8PSBWSUFfUk5HX0VOQUJMRTsKKworCWlmIChsbyAhPSBvbGRfbG8pCisJCXdybXNyKE1TUl9WSUFfUk5HLCBsbywgaGkpOworCisJLyogcGVyaGFwcy11bm5lY2Vzc2FyeSBzYW5pdHkgY2hlY2s7IHJlbW92ZSBhZnRlciB0ZXN0aW5nIGlmCisJICAgdW5uZWVkZWQgKi8KKwlyZG1zcihNU1JfVklBX1JORywgbG8sIGhpKTsKKwlpZiAoKGxvICYgVklBX1JOR19FTkFCTEUpID09IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiY2Fubm90IGVuYWJsZSBWSUEgQzMgUk5HLCBhYm9ydGluZ1xuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgaHdybmcgdmlhX3JuZyA9IHsKKwkubmFtZQkJPSAidmlhIiwKKwkuaW5pdAkJPSB2aWFfcm5nX2luaXQsCisJLmRhdGFfcHJlc2VudAk9IHZpYV9ybmdfZGF0YV9wcmVzZW50LAorCS5kYXRhX3JlYWQJPSB2aWFfcm5nX2RhdGFfcmVhZCwKK307CisKKworc3RhdGljIGludCBfX2luaXQgbW9kX2luaXQodm9pZCkKK3sKKwlpbnQgZXJyOworCisJaWYgKCFjcHVfaGFzX3hzdG9yZSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJcHJpbnRrKEtFUk5fSU5GTyAiVklBIFJORyBkZXRlY3RlZFxuIik7CisJZXJyID0gaHdybmdfcmVnaXN0ZXIoJnZpYV9ybmcpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiUk5HIHJlZ2lzdGVyaW5nIGZhaWxlZCAoJWQpXG4iLAorCQkgICAgICAgZXJyKTsKKwkJZ290byBvdXQ7CisJfQorb3V0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtb2RfZXhpdCh2b2lkKQoreworCWh3cm5nX3VucmVnaXN0ZXIoJnZpYV9ybmcpOworfQorCitzdWJzeXNfaW5pdGNhbGwobW9kX2luaXQpOworbW9kdWxlX2V4aXQobW9kX2V4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkgvVyBSTkcgZHJpdmVyIGZvciBWSUEgY2hpcHNldHMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9pcDIvaXAybWFpbi5jIGIvZHJpdmVycy9jaGFyL2lwMi9pcDJtYWluLmMKaW5kZXggMDNkYjFjYi4uOWFiMzNjMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2lwMi9pcDJtYWluLmMKKysrIGIvZHJpdmVycy9jaGFyL2lwMi9pcDJtYWluLmMKQEAgLTMwNSw3ICszMDUsNyBAQAogCiAvLyBTb21lIGZ1bmN0aW9ucyB0byBrZWVwIHRyYWNrIG9mIHdoYXQgaXJxJ3Mgd2UgaGF2ZQogCi1zdGF0aWMgaW50IF9faW5pdAorc3RhdGljIGludAogaXNfdmFsaWRfaXJxKGludCBpcnEpCiB7CiAJaW50ICppID0gVmFsaWRfSXJxczsKQEAgLTMxNiwxNCArMzE2LDE0IEBACiAJcmV0dXJuICgqaSk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdAorc3RhdGljIHZvaWQKIG1hcmtfcmVxdWVzdGVkX2lycSggY2hhciBpcnEgKQogewogCXJpcnFzW2lpbmR4KytdID0gaXJxOwogfQogCiAjaWZkZWYgTU9EVUxFCi1zdGF0aWMgaW50IF9faW5pdAorc3RhdGljIGludAogY2xlYXJfcmVxdWVzdGVkX2lycSggY2hhciBpcnEgKQogewogCWludCBpOwpAQCAtMzM3LDcgKzMzNyw3IEBACiB9CiAjZW5kaWYKIAotc3RhdGljIGludCBfX2luaXQKK3N0YXRpYyBpbnQKIGhhdmVfcmVxdWVzdGVkX2lycSggY2hhciBpcnEgKQogewogCS8vIGFycmF5IGluaXQgdG8gemVyb3Mgc28gMCBpcnEgd2lsbCBub3QgYmUgcmVxdWVzdGVkIGFzIGEgc2lkZSBlZmZlY3QKQEAgLTgxOCw3ICs4MTgsNyBAQAogLyogdGhlIGJvYXJkLCB0aGUgY2hhbm5lbCBzdHJ1Y3R1cmVzIGFyZSBpbml0aWFsaXplZCwgYW5kIHRoZSBib2FyZCBkZXRhaWxzICAgKi8KIC8qIGFyZSByZXBvcnRlZCBvbiB0aGUgY29uc29sZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgX19pbml0CitzdGF0aWMgdm9pZAogaXAyX2luaXRfYm9hcmQoIGludCBib2FyZG51bSApCiB7CiAJaW50IGk7CkBAIC05NjEsNyArOTYxLDcgQEAKIC8qIEVJU0EgbW90aGVyYm9hcmQsIG9yIG5vIHZhbGlkIGJvYXJkIElEIGlzIHNlbGVjdGVkIGl0IHJldHVybnMgMC4gT3RoZXJ3aXNlICovCiAvKiBpdCByZXR1cm5zIHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIGNvbnRyb2xsZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCBfX2luaXQKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydAogZmluZF9laXNhX2JvYXJkKCBpbnQgc3RhcnRfc2xvdCApCiB7CiAJaW50IGksIGo7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX21zZ2hhbmRsZXIuYyBiL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfbXNnaGFuZGxlci5jCmluZGV4IDlmMmY4ZmQuLmIwM2RkYWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfbXNnaGFuZGxlci5jCisrKyBiL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfbXNnaGFuZGxlci5jCkBAIC05MzYsMTEgKzkzNiw4IEBACiAKIAlpZiAodmFsKSB7CiAJCS8qIERlbGl2ZXIgYW55IHF1ZXVlZCBldmVudHMuICovCi0JCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShtc2csIG1zZzIsICZpbnRmLT53YWl0aW5nX2V2ZW50cywKLQkJCQkJIGxpbmspIHsKLQkJCWxpc3RfZGVsKCZtc2ctPmxpbmspOwotCQkJbGlzdF9hZGRfdGFpbCgmbXNnLT5saW5rLCAmbXNncyk7Ci0JCX0KKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG1zZywgbXNnMiwgJmludGYtPndhaXRpbmdfZXZlbnRzLCBsaW5rKQorCQkJbGlzdF9tb3ZlX3RhaWwoJm1zZy0+bGluaywgJm1zZ3MpOwogCQlpbnRmLT53YWl0aW5nX2V2ZW50c19jb3VudCA9IDA7CiAJfQogCkBAIC0zNjc3LDcgKzM2NzQsNyBAQAogfQogI2VuZGlmIC8qIENPTkZJR19JUE1JX1BBTklDX0VWRU5UICovCiAKLXN0YXRpYyBpbnQgaGFzX3BhbmljZWQgPSAwOworc3RhdGljIGludCBoYXNfcGFuaWNrZWQgPSAwOwogCiBzdGF0aWMgaW50IHBhbmljX2V2ZW50KHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywKIAkJICAgICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICBldmVudCwKQEAgLTM2ODYsOSArMzY4Myw5IEBACiAJaW50ICAgICAgICBpOwogCWlwbWlfc21pX3QgaW50ZjsKIAotCWlmIChoYXNfcGFuaWNlZCkKKwlpZiAoaGFzX3Bhbmlja2VkKQogCQlyZXR1cm4gTk9USUZZX0RPTkU7Ci0JaGFzX3BhbmljZWQgPSAxOworCWhhc19wYW5pY2tlZCA9IDE7CiAKIAkvKiBGb3IgZXZlcnkgcmVnaXN0ZXJlZCBpbnRlcmZhY2UsIHNldCBpdCB0byBydW4gdG8gY29tcGxldGlvbi4gKi8KIAlmb3IgKGkgPSAwOyBpIDwgTUFYX0lQTUlfSU5URVJGQUNFUzsgaSsrKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaXNpY29tLmMgYi9kcml2ZXJzL2NoYXIvaXNpY29tLmMKaW5kZXggZTllYmFiYS4uZWZhYWExOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2lzaWNvbS5jCisrKyBiL2RyaXZlcnMvY2hhci9pc2ljb20uYwpAQCAtMTE0NSw3ICsxMTQ1LDcgQEAKIAlpZiAoaXNpY29tX3BhcmFub2lhX2NoZWNrKHBvcnQsIHR0eS0+bmFtZSwgImlzaWNvbV93cml0ZSIpKQogCQlyZXR1cm4gMDsKIAotCWlmICghdHR5IHx8ICFwb3J0LT54bWl0X2J1ZikKKwlpZiAoIXBvcnQtPnhtaXRfYnVmKQogCQlyZXR1cm4gMDsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsKQEAgLTExODAsNyArMTE4MCw3IEBACiAJaWYgKGlzaWNvbV9wYXJhbm9pYV9jaGVjayhwb3J0LCB0dHktPm5hbWUsICJpc2ljb21fcHV0X2NoYXIiKSkKIAkJcmV0dXJuOwogCi0JaWYgKCF0dHkgfHwgIXBvcnQtPnhtaXRfYnVmKQorCWlmICghcG9ydC0+eG1pdF9idWYpCiAJCXJldHVybjsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9rZXlib2FyZC5jIGIvZHJpdmVycy9jaGFyL2tleWJvYXJkLmMKaW5kZXggNTc1NWI3ZS4uNGJiM2QyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2tleWJvYXJkLmMKKysrIGIvZHJpdmVycy9jaGFyL2tleWJvYXJkLmMKQEAgLTM5LDYgKzM5LDcgQEAKICNpbmNsdWRlIDxsaW51eC92dF9rZXJuLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzcnEuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgogCiBzdGF0aWMgdm9pZCBrYmRfZGlzY29ubmVjdChzdHJ1Y3QgaW5wdXRfaGFuZGxlICpoYW5kbGUpOwogZXh0ZXJuIHZvaWQgY3RybF9hbHRfZGVsKHZvaWQpOwpAQCAtMTUwLDYgKzE1MSw3IEBACiAgICAgICAgICIyMzBcMTc3XDAwMFwwMDBcMjEzXDIxNFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDAiIC8qIDB4NTAgLSAweDVmICovCiAgICAgICAgICJcclwwMDAvIjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4NjAgLSAweDZmICovCiBzdGF0aWMgaW50IHN5c3JxX2Rvd247CitzdGF0aWMgaW50IHN5c3JxX2FsdF91c2U7CiAjZW5kaWYKIHN0YXRpYyBpbnQgc3lzcnFfYWx0OwogCkBAIC02NzIsNyArNjc0LDcgQEAKICAqLwogc3RhdGljIHZvaWQga19kZWFkKHN0cnVjdCB2Y19kYXRhICp2YywgdW5zaWduZWQgY2hhciB2YWx1ZSwgY2hhciB1cF9mbGFnLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLQlzdGF0aWMgdW5zaWduZWQgY2hhciByZXRfZGlhY3JbTlJfREVBRF0gPSB7J2AnLCAnXCcnLCAnXicsICd+JywgJyInLCAnLCcgfTsKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciByZXRfZGlhY3JbTlJfREVBRF0gPSB7J2AnLCAnXCcnLCAnXicsICd+JywgJyInLCAnLCcgfTsKIAl2YWx1ZSA9IHJldF9kaWFjclt2YWx1ZV07CiAJa19kZWFkdW5pY29kZSh2YywgdmFsdWUsIHVwX2ZsYWcsIHJlZ3MpOwogfQpAQCAtNzA5LDggKzcxMSw4IEBACiAKIHN0YXRpYyB2b2lkIGtfcGFkKHN0cnVjdCB2Y19kYXRhICp2YywgdW5zaWduZWQgY2hhciB2YWx1ZSwgY2hhciB1cF9mbGFnLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLQlzdGF0aWMgY29uc3QgY2hhciAqcGFkX2NoYXJzID0gIjAxMjM0NTY3ODkrLSovXDAxNSwuPygpIyI7Ci0Jc3RhdGljIGNvbnN0IGNoYXIgKmFwcF9tYXAgPSAicHFyc3R1dnd4eWxTUlFNbm5tUFFTIjsKKwlzdGF0aWMgY29uc3QgY2hhciBwYWRfY2hhcnNbXSA9ICIwMTIzNDU2Nzg5Ky0qL1wwMTUsLj8oKSMiOworCXN0YXRpYyBjb25zdCBjaGFyIGFwcF9tYXBbXSA9ICJwcXJzdHV2d3h5bFNSUU1ubm1QUVMiOwogCiAJaWYgKHVwX2ZsYWcpCiAJCXJldHVybjsJCS8qIG5vIGFjdGlvbiwgaWYgdGhpcyBpcyBhIGtleSByZWxlYXNlICovCkBAIC0xMDM1LDcgKzEwMzcsNyBAQAogI2RlZmluZSBIV19SQVcoZGV2KSAodGVzdF9iaXQoRVZfTVNDLCBkZXYtPmV2Yml0KSAmJiB0ZXN0X2JpdChNU0NfUkFXLCBkZXYtPm1zY2JpdCkgJiZcCiAJCQkoKGRldiktPmlkLmJ1c3R5cGUgPT0gQlVTX0k4MDQyKSAmJiAoKGRldiktPmlkLnZlbmRvciA9PSAweDAwMDEpICYmICgoZGV2KS0+aWQucHJvZHVjdCA9PSAweDAwMDEpKQogCi1zdGF0aWMgdW5zaWduZWQgc2hvcnQgeDg2X2tleWNvZGVzWzI1Nl0gPQorc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IHg4Nl9rZXljb2Rlc1syNTZdID0KIAl7IDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwgIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsCiAJIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLAogCSAzMiwgMzMsIDM0LCAzNSwgMzYsIDM3LCAzOCwgMzksIDQwLCA0MSwgNDIsIDQzLCA0NCwgNDUsIDQ2LCA0NywKQEAgLTEwNzMsMTEgKzEwNzUsMTMgQEAKIAkJCXB1dF9xdWV1ZSh2YywgMHgxZCB8IHVwX2ZsYWcpOwogCQkJcHV0X3F1ZXVlKHZjLCAweDQ1IHwgdXBfZmxhZyk7CiAJCQlyZXR1cm4gMDsKLQkJY2FzZSBLRVlfSEFOR1VFTDoKLQkJCWlmICghdXBfZmxhZykgcHV0X3F1ZXVlKHZjLCAweGYxKTsKKwkJY2FzZSBLRVlfSEFOR0VVTDoKKwkJCWlmICghdXBfZmxhZykKKwkJCQlwdXRfcXVldWUodmMsIDB4ZjIpOwogCQkJcmV0dXJuIDA7CiAJCWNhc2UgS0VZX0hBTkpBOgotCQkJaWYgKCF1cF9mbGFnKSBwdXRfcXVldWUodmMsIDB4ZjIpOworCQkJaWYgKCF1cF9mbGFnKQorCQkJCXB1dF9xdWV1ZSh2YywgMHhmMSk7CiAJCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTExNDIsNyArMTE0Niw3IEBACiAJa2JkID0ga2JkX3RhYmxlICsgZmdfY29uc29sZTsKIAogCWlmIChrZXljb2RlID09IEtFWV9MRUZUQUxUIHx8IGtleWNvZGUgPT0gS0VZX1JJR0hUQUxUKQotCQlzeXNycV9hbHQgPSBkb3duOworCQlzeXNycV9hbHQgPSBkb3duID8ga2V5Y29kZSA6IDA7CiAjaWZkZWYgQ09ORklHX1NQQVJDCiAJaWYgKGtleWNvZGUgPT0gS0VZX1NUT1ApCiAJCXNwYXJjX2wxX2Ffc3RhdGUgPSBkb3duOwpAQCAtMTE2Miw5ICsxMTY2LDE0IEBACiAKICNpZmRlZiBDT05GSUdfTUFHSUNfU1lTUlEJICAgICAgIC8qIEhhbmRsZSB0aGUgU3lzUnEgSGFjayAqLwogCWlmIChrZXljb2RlID09IEtFWV9TWVNSUSAmJiAoc3lzcnFfZG93biB8fCAoZG93biA9PSAxICYmIHN5c3JxX2FsdCkpKSB7Ci0JCXN5c3JxX2Rvd24gPSBkb3duOworCQlpZiAoIXN5c3JxX2Rvd24pIHsKKwkJCXN5c3JxX2Rvd24gPSBkb3duOworCQkJc3lzcnFfYWx0X3VzZSA9IHN5c3JxX2FsdDsKKwkJfQogCQlyZXR1cm47CiAJfQorCWlmIChzeXNycV9kb3duICYmICFkb3duICYmIGtleWNvZGUgPT0gc3lzcnFfYWx0X3VzZSkKKwkJc3lzcnFfZG93biA9IDA7CiAJaWYgKHN5c3JxX2Rvd24gJiYgZG93biAmJiAhcmVwKSB7CiAJCWhhbmRsZV9zeXNycShrYmRfc3lzcnFfeGxhdGVba2V5Y29kZV0sIHJlZ3MsIHR0eSk7CiAJCXJldHVybjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9tbXRpbWVyLmMgYi9kcml2ZXJzL2NoYXIvbW10aW1lci5jCmluZGV4IDFiMDVmYTYuLmQ2NWIzMTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9tbXRpbWVyLmMKKysrIGIvZHJpdmVycy9jaGFyL21tdGltZXIuYwpAQCAtMzI5LDcgKzMyOSw2IEBACiAJaWYgKFBBR0VfU0laRSA+ICgxIDw8IDE2KSkKIAkJcmV0dXJuIC1FTk9TWVM7CiAKLQl2bWEtPnZtX2ZsYWdzIHw9IChWTV9JTyB8IFZNX1NITSB8IFZNX0xPQ0tFRCApOwogCXZtYS0+dm1fcGFnZV9wcm90ID0gcGdwcm90X25vbmNhY2hlZCh2bWEtPnZtX3BhZ2VfcHJvdCk7CiAKIAltbXRpbWVyX2FkZHIgPSBfX3BhKFJUQ19DT1VOVEVSX0FERFIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL214c2VyLmMgYi9kcml2ZXJzL2NoYXIvbXhzZXIuYwppbmRleCAwZmIyZmI5Li42NDVkOWQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvbXhzZXIuYworKysgYi9kcml2ZXJzL2NoYXIvbXhzZXIuYwpAQCAtOSw3ICs5LDcgQEAKICAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICoKICAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCkBAIC03MSw4ICs3MSw4IEBACiAjZGVmaW5lCU1YU0VSTUFKT1IJIDE3NAogI2RlZmluZQlNWFNFUkNVTUFKT1IJIDE3NQogCi0jZGVmaW5lCU1YU0VSX0VWRU5UX1RYTE9XCSAxCi0jZGVmaW5lCU1YU0VSX0VWRU5UX0hBTkdVUAkgMgorI2RlZmluZQlNWFNFUl9FVkVOVF9UWExPVwkxCisjZGVmaW5lCU1YU0VSX0VWRU5UX0hBTkdVUAkyCiAKICNkZWZpbmUgTVhTRVJfQk9BUkRTCQk0CS8qIE1heC4gYm9hcmRzICovCiAjZGVmaW5lIE1YU0VSX1BPUlRTCQkzMgkvKiBNYXguIHBvcnRzICovCkBAIC05Miw3ICs5Miw4IEBACiAjZGVmaW5lIFVBUlRfTUNSX0FGRQkJMHgyMAogI2RlZmluZSBVQVJUX0xTUl9TUEVDSUFMCTB4MUUKIAotI2RlZmluZSBSRUxFVkFOVF9JRkxBRyhpZmxhZykJKGlmbGFnICYgKElHTkJSS3xCUktJTlR8SUdOUEFSfFBBUk1SS3xJTlBDS3xJWE9OfElYT0ZGKSkKKyNkZWZpbmUgUkVMRVZBTlRfSUZMQUcoaWZsYWcpCShpZmxhZyAmIChJR05CUkt8QlJLSU5UfElHTlBBUnxQQVJNUkt8SU5QQ0t8XAorCQkJCQkgIElYT058SVhPRkYpKQogCiAjZGVmaW5lIElSUV9UKGluZm8pICgoaW5mby0+ZmxhZ3MgJiBBU1lOQ19TSEFSRV9JUlEpID8gU0FfU0hJUlEgOiBTQV9JTlRFUlJVUFQpCiAKQEAgLTE1MiwyNyArMTUzLDI3IEBACiB9OwogCiBzdGF0aWMgaW50IG14c2VyX251bXBvcnRzW10gPSB7Ci0JOCwJCQkvLyBDMTY4LUlTQQotCTQsCQkJLy8gQzEwNC1JU0EKLQk0LAkJCS8vIENJMTA0SgotCTgsCQkJLy8gQzE2OC1QQ0kKLQk0LAkJCS8vIEMxMDQtUENJCi0JMiwJCQkvLyBDMTAyLUlTQQotCTIsCQkJLy8gQ0kxMzIKLQk0LAkJCS8vIENJMTM0Ci0JMiwJCQkvLyBDUDEzMgotCTQsCQkJLy8gQ1AxMTQKLQk0LAkJCS8vIENUMTE0Ci0JMiwJCQkvLyBDUDEwMgotCTQsCQkJLy8gQ1AxMDRVCi0JOCwJCQkvLyBDUDE2OFUKLQkyLAkJCS8vIENQMTMyVQotCTQsCQkJLy8gQ1AxMzRVCi0JNCwJCQkvLyBDUDEwNEpVCi0JOCwJCQkvLyBSQzcwMDAKLQk4LAkJCS8vIENQMTE4VSAKLQkyLAkJCS8vIENQMTAyVUwgCi0JMiwJCQkvLyBDUDEwMlUKKwk4LAkJCS8qIEMxNjgtSVNBICovCisJNCwJCQkvKiBDMTA0LUlTQSAqLworCTQsCQkJLyogQ0kxMDRKICovCisJOCwJCQkvKiBDMTY4LVBDSSAqLworCTQsCQkJLyogQzEwNC1QQ0kgKi8KKwkyLAkJCS8qIEMxMDItSVNBICovCisJMiwJCQkvKiBDSTEzMiAqLworCTQsCQkJLyogQ0kxMzQgKi8KKwkyLAkJCS8qIENQMTMyICovCisJNCwJCQkvKiBDUDExNCAqLworCTQsCQkJLyogQ1QxMTQgKi8KKwkyLAkJCS8qIENQMTAyICovCisJNCwJCQkvKiBDUDEwNFUgKi8KKwk4LAkJCS8qIENQMTY4VSAqLworCTIsCQkJLyogQ1AxMzJVICovCisJNCwJCQkvKiBDUDEzNFUgKi8KKwk0LAkJCS8qIENQMTA0SlUgKi8KKwk4LAkJCS8qIFJDNzAwMCAqLworCTgsCQkJLyogQ1AxMThVICovCisJMiwJCQkvKiBDUDEwMlVMICovCisJMiwJCQkvKiBDUDEwMlUgKi8KIH07CiAKICNkZWZpbmUgVUFSVF9UWVBFX05VTQkyCkBAIC0xODIsNyArMTgzLDcgQEAKIAlNT1hBX01VU1RfTVU4NjBfSFdJRAogfTsKIAotLy8gVGhpcyBpcyBvbmx5IGZvciBQQ0kKKy8qIFRoaXMgaXMgb25seSBmb3IgUENJICovCiAjZGVmaW5lIFVBUlRfSU5GT19OVU0JMwogc3RydWN0IG14cGNpdWFydF9pbmZvIHsKIAlpbnQgdHlwZTsKQEAgLTIzMSw3ICsyMzIsNyBAQAogdHlwZWRlZiBzdHJ1Y3QgX21veGFfcGNpX2luZm8gewogCXVuc2lnbmVkIHNob3J0IGJ1c051bTsKIAl1bnNpZ25lZCBzaG9ydCBkZXZOdW07Ci0Jc3RydWN0IHBjaV9kZXYgKnBkZXY7CS8vIGFkZCBieSBWaWN0b3IgWXUuIDA2LTIzLTIwMDMKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsJLyogYWRkIGJ5IFZpY3RvciBZdS4gMDYtMjMtMjAwMyAqLwogfSBtb3hhX3BjaV9pbmZvOwogCiBzdGF0aWMgaW50IGlvYWRkcltNWFNFUl9CT0FSRFNdID0geyAwLCAwLCAwLCAwIH07CkBAIC0yODAsNiArMjgxLDcgQEAKIAlpbnQgZmlmb1szMl07CiAJaW50IGlmdHlwZVszMl07CiB9OworCiBzdHJ1Y3QgbXhzZXJfaHdjb25mIHsKIAlpbnQgYm9hcmRfdHlwZTsKIAlpbnQgcG9ydHM7CkBAIC0yOTAsOSArMjkyLDkgQEAKIAlpbnQgaW9hZGRyW01YU0VSX1BPUlRTX1BFUl9CT0FSRF07CiAJaW50IGJhdWRfYmFzZVtNWFNFUl9QT1JUU19QRVJfQk9BUkRdOwogCW1veGFfcGNpX2luZm8gcGNpSW5mbzsKLQlpbnQgSXNNb3hhTXVzdENoaXBGbGFnOwkvLyBhZGQgYnkgVmljdG9yIFl1LiAwOC0zMC0yMDAyCi0JaW50IE1heENhblNldEJhdWRSYXRlW01YU0VSX1BPUlRTX1BFUl9CT0FSRF07CS8vIGFkZCBieSBWaWN0b3IgWXUuIDA5LTA0LTIwMDIKLQlpbnQgb3Btb2RlX2lvYWRkcltNWFNFUl9QT1JUU19QRVJfQk9BUkRdOwkvLyBhZGQgYnkgVmljdG9yIFl1LiAwMS0wNS0yMDA0CisJaW50IElzTW94YU11c3RDaGlwRmxhZzsJLyogYWRkIGJ5IFZpY3RvciBZdS4gMDgtMzAtMjAwMiAqLworCWludCBNYXhDYW5TZXRCYXVkUmF0ZVtNWFNFUl9QT1JUU19QRVJfQk9BUkRdOwkvKiBhZGQgYnkgVmljdG9yIFl1LiAwOS0wNC0yMDAyICovCisJaW50IG9wbW9kZV9pb2FkZHJbTVhTRVJfUE9SVFNfUEVSX0JPQVJEXTsJLyogYWRkIGJ5IFZpY3RvciBZdS4gMDEtMDUtMjAwNCAqLwogfTsKIAogc3RydWN0IG14c2VyX3N0cnVjdCB7CkBAIC0zMzQsOSArMzM2LDkgQEAKIAl3YWl0X3F1ZXVlX2hlYWRfdCBkZWx0YV9tc3Jfd2FpdDsKIAlzdHJ1Y3QgYXN5bmNfaWNvdW50IGljb3VudDsJLyoga2VybmVsIGNvdW50ZXJzIGZvciB0aGUgNCBpbnB1dCBpbnRlcnJ1cHRzICovCiAJaW50IHRpbWVvdXQ7Ci0JaW50IElzTW94YU11c3RDaGlwRmxhZzsJLy8gYWRkIGJ5IFZpY3RvciBZdS4gMDgtMzAtMjAwMgotCWludCBNYXhDYW5TZXRCYXVkUmF0ZTsJLy8gYWRkIGJ5IFZpY3RvciBZdS4gMDktMDQtMjAwMgotCWludCBvcG1vZGVfaW9hZGRyOwkvLyBhZGQgYnkgVmljdG9yIFl1LiAwMS0wNS0yMDA0CisJaW50IElzTW94YU11c3RDaGlwRmxhZzsJLyogYWRkIGJ5IFZpY3RvciBZdS4gMDgtMzAtMjAwMiAqLworCWludCBNYXhDYW5TZXRCYXVkUmF0ZTsJLyogYWRkIGJ5IFZpY3RvciBZdS4gMDktMDQtMjAwMiAqLworCWludCBvcG1vZGVfaW9hZGRyOwkvKiBhZGQgYnkgVmljdG9yIFl1LiAwMS0wNS0yMDA0ICovCiAJdW5zaWduZWQgY2hhciBzdG9wX3J4OwogCXVuc2lnbmVkIGNoYXIgbGRpc2Nfc3RvcF9yeDsKIAlsb25nIHJlYWxiYXVkOwpAQCAtMzQ1LDcgKzM0Nyw2IEBACiAJc3BpbmxvY2tfdCBzbG9jazsKIH07CiAKLQogc3RydWN0IG14c2VyX21zdGF0dXMgewogCXRjZmxhZ190IGNmbGFnOwogCWludCBjdHM7CkBAIC0zNTgsNyArMzU5LDcgQEAKIAogc3RhdGljIGludCBteHNlckJvYXJkQ0FQW01YU0VSX0JPQVJEU10gPSB7CiAJMCwgMCwgMCwgMAotCSAgICAvKiAgMHgxODAsIDB4MjgwLCAweDIwMCwgMHgzMjAgICAqLworCS8qICAweDE4MCwgMHgyODAsIDB4MjAwLCAweDMyMCAqLwogfTsKIAogc3RhdGljIHN0cnVjdCB0dHlfZHJpdmVyICpteHZhcl9zZHJpdmVyOwpAQCAtMzg2LDcgKzM4Nyw3IEBACiBzdGF0aWMgdm9pZCBteHNlcl9nZXRjZmcoaW50IGJvYXJkLCBzdHJ1Y3QgbXhzZXJfaHdjb25mICpod2NvbmYpOwogc3RhdGljIGludCBteHNlcl9pbml0KHZvaWQpOwogCi0vL3N0YXRpYyB2b2lkICAgbXhzZXJfcG9sbCh1bnNpZ25lZCBsb25nKTsKKy8qIHN0YXRpYyB2b2lkICAgbXhzZXJfcG9sbCh1bnNpZ25lZCBsb25nKTsgKi8KIHN0YXRpYyBpbnQgbXhzZXJfZ2V0X0lTQV9jb25mKGludCwgc3RydWN0IG14c2VyX2h3Y29uZiAqKTsKIHN0YXRpYyBpbnQgbXhzZXJfZ2V0X1BDSV9jb25mKGludCwgaW50LCBpbnQsIHN0cnVjdCBteHNlcl9od2NvbmYgKik7CiBzdGF0aWMgdm9pZCBteHNlcl9kb19zb2Z0aW50KHZvaWQgKik7CkBAIC00NDAsMTggKzQ0MSwxOCBAQAogCVNFVF9NT1hBX01VU1RfWE9OMV9WQUxVRShpbywgMHgxMSk7CiAJaWYgKChod2lkID0gaW5iKGlvICsgVUFSVF9NQ1IpKSAhPSAwKSB7CiAJCW91dGIob2xkbWNyLCBpbyArIFVBUlRfTUNSKTsKLQkJcmV0dXJuIChNT1hBX09USEVSX1VBUlQpOworCQlyZXR1cm4gTU9YQV9PVEhFUl9VQVJUOwogCX0KIAogCUdFVF9NT1hBX01VU1RfSEFSRFdBUkVfSUQoaW8sICZod2lkKTsKIAlmb3IgKGkgPSAwOyBpIDwgVUFSVF9UWVBFX05VTTsgaSsrKSB7CiAJCWlmIChod2lkID09IEdtb3hhX3VhcnRfaWRbaV0pCi0JCQlyZXR1cm4gKGludCkgaHdpZDsKKwkJCXJldHVybiAoaW50KWh3aWQ7CiAJfQogCXJldHVybiBNT1hBX09USEVSX1VBUlQ7CiB9CiAKLS8vIGFib3ZlIGlzIG1vZGlmaWVkIGJ5IFZpY3RvciBZdS4gMDgtMTUtMjAwMgorLyogYWJvdmUgaXMgbW9kaWZpZWQgYnkgVmljdG9yIFl1LiAwOC0xNS0yMDAyICovCiAKIHN0YXRpYyBzdHJ1Y3QgdHR5X29wZXJhdGlvbnMgbXhzZXJfb3BzID0gewogCS5vcGVuID0gbXhzZXJfb3BlbiwKQEAgLTUwNCw3ICs1MDUsNiBAQAogCWVsc2UKIAkJcHJpbnRrKEtFUk5fRVJSICJDb3VsZG4ndCB1bnJlZ2lzdGVyIE1PWEEgU21hcnRpby9JbmR1c3RpbyBmYW1pbHkgc2VyaWFsIGRyaXZlclxuIik7CiAKLQogCWZvciAoaSA9IDA7IGkgPCBNWFNFUl9CT0FSRFM7IGkrKykgewogCQlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKIApAQCAtNTEzLDcgKzUxMyw3IEBACiAJCWVsc2UgewogCQkJcGRldiA9IG14c2VyY2ZnW2ldLnBjaUluZm8ucGRldjsKIAkJCWZyZWVfaXJxKG14c2VyY2ZnW2ldLmlycSwgJm14dmFyX3RhYmxlW2kgKiBNWFNFUl9QT1JUU19QRVJfQk9BUkRdKTsKLQkJCWlmIChwZGV2ICE9IE5VTEwpIHsJLy9QQ0kKKwkJCWlmIChwZGV2ICE9IE5VTEwpIHsJLyogUENJICovCiAJCQkJcmVsZWFzZV9yZWdpb24ocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDIpLCBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDIpKTsKIAkJCQlyZWxlYXNlX3JlZ2lvbihwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMyksIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMykpOwogCQkJfSBlbHNlIHsKQEAgLTUyNCw3ICs1MjQsNiBAQAogCX0KIAlpZiAodmVyYm9zZSkKIAkJcHJpbnRrKEtFUk5fREVCVUcgIkRvbmUuXG4iKTsKLQogfQogCiBzdGF0aWMgdm9pZCBwcm9jZXNzX3R4cnhfZmlmbyhzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvKQpAQCAtNTU4LDggKzU1NywxMCBAQAogCW4gPSBib2FyZCAqIE1YU0VSX1BPUlRTX1BFUl9CT0FSRDsKIAlpbmZvID0gJm14dmFyX3RhYmxlW25dOwogCS8qaWYgKHZlcmJvc2UpICovICB7Ci0JCXByaW50ayhLRVJOX0RFQlVHICIgICAgICAgIHR0eU0lZCAtIHR0eU0lZCAiLCBuLCBuICsgaHdjb25mLT5wb3J0cyAtIDEpOwotCQlwcmludGsoIiBtYXguIGJhdWQgcmF0ZSA9ICVkIGJwcy5cbiIsIGh3Y29uZi0+TWF4Q2FuU2V0QmF1ZFJhdGVbMF0pOworCQlwcmludGsoS0VSTl9ERUJVRyAiICAgICAgICB0dHlNJWQgLSB0dHlNJWQgIiwKKwkJCW4sIG4gKyBod2NvbmYtPnBvcnRzIC0gMSk7CisJCXByaW50aygiIG1heC4gYmF1ZCByYXRlID0gJWQgYnBzLlxuIiwKKwkJCWh3Y29uZi0+TWF4Q2FuU2V0QmF1ZFJhdGVbMF0pOwogCX0KIAogCWZvciAoaSA9IDA7IGkgPCBod2NvbmYtPnBvcnRzOyBpKyssIG4rKywgaW5mbysrKSB7CkBAIC01NjgsMTIgKzU2OSwxMiBAQAogCQlpbmZvLT5pcnEgPSBod2NvbmYtPmlycTsKIAkJaW5mby0+dmVjdG9yID0gaHdjb25mLT52ZWN0b3I7CiAJCWluZm8tPnZlY3Rvcm1hc2sgPSBod2NvbmYtPnZlY3Rvcl9tYXNrOwotCQlpbmZvLT5vcG1vZGVfaW9hZGRyID0gaHdjb25mLT5vcG1vZGVfaW9hZGRyW2ldOwkvLyBhZGQgYnkgVmljdG9yIFl1LiAwMS0wNS0yMDA0CisJCWluZm8tPm9wbW9kZV9pb2FkZHIgPSBod2NvbmYtPm9wbW9kZV9pb2FkZHJbaV07CS8qIGFkZCBieSBWaWN0b3IgWXUuIDAxLTA1LTIwMDQgKi8KIAkJaW5mby0+c3RvcF9yeCA9IDA7CiAJCWluZm8tPmxkaXNjX3N0b3BfcnggPSAwOwogCiAJCWluZm8tPklzTW94YU11c3RDaGlwRmxhZyA9IGh3Y29uZi0+SXNNb3hhTXVzdENoaXBGbGFnOwotCQkvL0VuaGFuY2UgbW9kZSBlbmFibGVkIGhlcmUKKwkJLyogRW5oYW5jZSBtb2RlIGVuYWJsZWQgaGVyZSAqLwogCQlpZiAoaW5mby0+SXNNb3hhTXVzdENoaXBGbGFnICE9IE1PWEFfT1RIRVJfVUFSVCkgewogCQkJRU5BQkxFX01PWEFfTVVTVF9FTkNIQU5DRV9NT0RFKGluZm8tPmJhc2UpOwogCQl9CkBAIC02MDYsMjIgKzYwNywyNSBAQAogCiAJLyogYmVmb3JlIHNldCBJTlQgSVNSLCBkaXNhYmxlIGFsbCBpbnQgKi8KIAlmb3IgKGkgPSAwOyBpIDwgaHdjb25mLT5wb3J0czsgaSsrKSB7Ci0JCW91dGIoaW5iKGh3Y29uZi0+aW9hZGRyW2ldICsgVUFSVF9JRVIpICYgMHhmMCwgaHdjb25mLT5pb2FkZHJbaV0gKyBVQVJUX0lFUik7CisJCW91dGIoaW5iKGh3Y29uZi0+aW9hZGRyW2ldICsgVUFSVF9JRVIpICYgMHhmMCwKKwkJCWh3Y29uZi0+aW9hZGRyW2ldICsgVUFSVF9JRVIpOwogCX0KIAogCW4gPSBib2FyZCAqIE1YU0VSX1BPUlRTX1BFUl9CT0FSRDsKIAlpbmZvID0gJm14dmFyX3RhYmxlW25dOwogCi0JcmV0dmFsID0gcmVxdWVzdF9pcnEoaHdjb25mLT5pcnEsIG14c2VyX2ludGVycnVwdCwgSVJRX1QoaW5mbyksICJteHNlciIsIGluZm8pOworCXJldHZhbCA9IHJlcXVlc3RfaXJxKGh3Y29uZi0+aXJxLCBteHNlcl9pbnRlcnJ1cHQsIElSUV9UKGluZm8pLAorCQkJCSJteHNlciIsIGluZm8pOwogCWlmIChyZXR2YWwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJCb2FyZCAlZDogJXMiLCBib2FyZCwgbXhzZXJfYnJkbmFtZVtod2NvbmYtPmJvYXJkX3R5cGUgLSAxXSk7Ci0JCXByaW50aygiICBSZXF1ZXN0IGlycSBmYWlsLElSUSAoJWQpIG1heSBiZSBjb25mbGl0IHdpdGggYW5vdGhlciBkZXZpY2UuXG4iLCBpbmZvLT5pcnEpOworCQlwcmludGsoS0VSTl9FUlIgIkJvYXJkICVkOiAlcyIsCisJCQlib2FyZCwgbXhzZXJfYnJkbmFtZVtod2NvbmYtPmJvYXJkX3R5cGUgLSAxXSk7CisJCXByaW50aygiICBSZXF1ZXN0IGlycSBmYWlsZWQsIElSUSAoJWQpIG1heSBjb25mbGljdCB3aXRoIgorCQkJIiBhbm90aGVyIGRldmljZS5cbiIsIGluZm8tPmlycSk7CiAJCXJldHVybiByZXR2YWw7CiAJfQogCXJldHVybiAwOwogfQogCi0KIHN0YXRpYyB2b2lkIG14c2VyX2dldGNmZyhpbnQgYm9hcmQsIHN0cnVjdCBteHNlcl9od2NvbmYgKmh3Y29uZikKIHsKIAlteHNlcmNmZ1tib2FyZF0gPSAqaHdjb25mOwpAQCAtNjMxLDI2ICs2MzUsMjcgQEAKIHN0YXRpYyBpbnQgbXhzZXJfZ2V0X1BDSV9jb25mKGludCBidXNudW0sIGludCBkZXZudW0sIGludCBib2FyZF90eXBlLCBzdHJ1Y3QgbXhzZXJfaHdjb25mICpod2NvbmYpCiB7CiAJaW50IGksIGo7Ci0vLyAgICAgIHVuc2lnbmVkIGludCAgICB2YWw7CisJLyogdW5zaWduZWQgaW50IHZhbDsgKi8KIAl1bnNpZ25lZCBpbnQgaW9hZGRyZXNzOwogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gaHdjb25mLT5wY2lJbmZvLnBkZXY7CiAKLQkvL2lvIGFkZHJlc3MKKwkvKiBpbyBhZGRyZXNzICovCiAJaHdjb25mLT5ib2FyZF90eXBlID0gYm9hcmRfdHlwZTsKIAlod2NvbmYtPnBvcnRzID0gbXhzZXJfbnVtcG9ydHNbYm9hcmRfdHlwZSAtIDFdOwogCWlvYWRkcmVzcyA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAyKTsKLQlyZXF1ZXN0X3JlZ2lvbihwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMiksIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMiksICJteHNlcihJTykiKTsKKwlyZXF1ZXN0X3JlZ2lvbihwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMiksIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMiksCisJCQkibXhzZXIoSU8pIik7CiAKLQlmb3IgKGkgPSAwOyBpIDwgaHdjb25mLT5wb3J0czsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IGh3Y29uZi0+cG9ydHM7IGkrKykKIAkJaHdjb25mLT5pb2FkZHJbaV0gPSBpb2FkZHJlc3MgKyA4ICogaTsKLQl9CiAKLQkvL3ZlY3RvcgorCS8qIHZlY3RvciAqLwogCWlvYWRkcmVzcyA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAzKTsKLQlyZXF1ZXN0X3JlZ2lvbihwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMyksIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMyksICJteHNlcih2ZWN0b3IpIik7CisJcmVxdWVzdF9yZWdpb24ocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDMpLCBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDMpLAorCQkJIm14c2VyKHZlY3RvcikiKTsKIAlod2NvbmYtPnZlY3RvciA9IGlvYWRkcmVzczsKIAotCS8vaXJxCisJLyogaXJxICovCiAJaHdjb25mLT5pcnEgPSBod2NvbmYtPnBjaUluZm8ucGRldi0+aXJxOwogCiAJaHdjb25mLT5Jc01veGFNdXN0Q2hpcEZsYWcgPSBDaGVja0lzTW94YU11c3QoaHdjb25mLT5pb2FkZHJbMF0pOwpAQCAtNjYzLDcgKzY2OCw3IEBACiAJCQlpZiAoR3BjaV91YXJ0X2luZm9bal0udHlwZSA9PSBod2NvbmYtPklzTW94YU11c3RDaGlwRmxhZykgewogCQkJCWh3Y29uZi0+TWF4Q2FuU2V0QmF1ZFJhdGVbaV0gPSBHcGNpX3VhcnRfaW5mb1tqXS5tYXhfYmF1ZDsKIAotCQkJCS8vZXhjZXB0aW9uLi4uLkNQLTEwMgorCQkJCS8qIGV4Y2VwdGlvbi4uLi5DUC0xMDIgKi8KIAkJCQlpZiAoYm9hcmRfdHlwZSA9PSBNWFNFUl9CT0FSRF9DUDEwMikKIAkJCQkJaHdjb25mLT5NYXhDYW5TZXRCYXVkUmF0ZVtpXSA9IDkyMTYwMDsKIAkJCQlicmVhazsKQEAgLTY3OCwxNSArNjgzLDE1IEBACiAJCQllbHNlCiAJCQkJaHdjb25mLT5vcG1vZGVfaW9hZGRyW2ldID0gaW9hZGRyZXNzICsgMHgwYzsKIAkJfQotCQlvdXRiKDAsIGlvYWRkcmVzcyArIDQpOwkvLyBkZWZhdWx0IHNldCB0byBSUzIzMiBtb2RlCi0JCW91dGIoMCwgaW9hZGRyZXNzICsgMHgwYyk7CS8vZGVmYXVsdCBzZXQgdG8gUlMyMzIgbW9kZQorCQlvdXRiKDAsIGlvYWRkcmVzcyArIDQpOwkvKiBkZWZhdWx0IHNldCB0byBSUzIzMiBtb2RlICovCisJCW91dGIoMCwgaW9hZGRyZXNzICsgMHgwYyk7CS8qIGRlZmF1bHQgc2V0IHRvIFJTMjMyIG1vZGUgKi8KIAl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgaHdjb25mLT5wb3J0czsgaSsrKSB7CiAJCWh3Y29uZi0+dmVjdG9yX21hc2sgfD0gKDEgPDwgaSk7CiAJCWh3Y29uZi0+YmF1ZF9iYXNlW2ldID0gOTIxNjAwOwogCX0KLQlyZXR1cm4gKDApOworCXJldHVybiAwOwogfQogI2VuZGlmCiAKQEAgLTcwNyw3ICs3MTIsOCBAQAogCQlteHNlcmNmZ1tpXS5ib2FyZF90eXBlID0gLTE7CiAJfQogCi0JcHJpbnRrKEtFUk5fSU5GTyAiTU9YQSBTbWFydGlvL0luZHVzdGlvIGZhbWlseSBkcml2ZXIgdmVyc2lvbiAlc1xuIiwgTVhTRVJfVkVSU0lPTik7CisJcHJpbnRrKEtFUk5fSU5GTyAiTU9YQSBTbWFydGlvL0luZHVzdGlvIGZhbWlseSBkcml2ZXIgdmVyc2lvbiAlc1xuIiwKKwkJTVhTRVJfVkVSU0lPTik7CiAKIAkvKiBJbml0aWFsaXplIHRoZSB0dHlfZHJpdmVyIHN0cnVjdHVyZSAqLwogCW1lbXNldChteHZhcl9zZHJpdmVyLCAwLCBzaXplb2Yoc3RydWN0IHR0eV9kcml2ZXIpKTsKQEAgLTcxOSw3ICs3MjUsNyBAQAogCW14dmFyX3Nkcml2ZXItPnR5cGUgPSBUVFlfRFJJVkVSX1RZUEVfU0VSSUFMOwogCW14dmFyX3Nkcml2ZXItPnN1YnR5cGUgPSBTRVJJQUxfVFlQRV9OT1JNQUw7CiAJbXh2YXJfc2RyaXZlci0+aW5pdF90ZXJtaW9zID0gdHR5X3N0ZF90ZXJtaW9zOwotCW14dmFyX3Nkcml2ZXItPmluaXRfdGVybWlvcy5jX2NmbGFnID0gQjk2MDAgfCBDUzggfCBDUkVBRCB8IEhVUENMIHwgQ0xPQ0FMOworCW14dmFyX3Nkcml2ZXItPmluaXRfdGVybWlvcy5jX2NmbGFnID0gQjk2MDB8Q1M4fENSRUFEfEhVUENMfENMT0NBTDsKIAlteHZhcl9zZHJpdmVyLT5mbGFncyA9IFRUWV9EUklWRVJfUkVBTF9SQVc7CiAJdHR5X3NldF9vcGVyYXRpb25zKG14dmFyX3Nkcml2ZXIsICZteHNlcl9vcHMpOwogCW14dmFyX3Nkcml2ZXItPnR0eXMgPSBteHZhcl90dHk7CkBAIC03MzksMjMgKzc0NSwyOSBAQAogCS8qIFN0YXJ0IGZpbmRpbmcgSVNBIGJvYXJkcyBoZXJlICovCiAJZm9yIChiID0gMDsgYiA8IE1YU0VSX0JPQVJEUyAmJiBtIDwgTVhTRVJfQk9BUkRTOyBiKyspIHsKIAkJaW50IGNhcDsKKwogCQlpZiAoIShjYXAgPSBteHNlckJvYXJkQ0FQW2JdKSkKIAkJCWNvbnRpbnVlOwogCiAJCXJldHZhbCA9IG14c2VyX2dldF9JU0FfY29uZihjYXAsICZod2NvbmYpOwogCiAJCWlmIChyZXR2YWwgIT0gMCkKLQkJCXByaW50ayhLRVJOX0lORk8gIkZvdW5kIE1PWEEgJXMgYm9hcmQgKENBUD0weCV4KVxuIiwgbXhzZXJfYnJkbmFtZVtod2NvbmYuYm9hcmRfdHlwZSAtIDFdLCBpb2FkZHJbYl0pOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiRm91bmQgTU9YQSAlcyBib2FyZCAoQ0FQPTB4JXgpXG4iLAorCQkJCW14c2VyX2JyZG5hbWVbaHdjb25mLmJvYXJkX3R5cGUgLSAxXSwgaW9hZGRyW2JdKTsKIAogCQlpZiAocmV0dmFsIDw9IDApIHsKIAkJCWlmIChyZXR2YWwgPT0gTVhTRVJfRVJSX0lSUSkKLQkJCQlwcmludGsoS0VSTl9FUlIgIkludmFsaWQgaW50ZXJydXB0IG51bWJlcixib2FyZCBub3QgY29uZmlndXJlZFxuIik7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJJbnZhbGlkIGludGVycnVwdCBudW1iZXIsICIKKwkJCQkJImJvYXJkIG5vdCBjb25maWd1cmVkXG4iKTsKIAkJCWVsc2UgaWYgKHJldHZhbCA9PSBNWFNFUl9FUlJfSVJRX0NPTkZMSVQpCi0JCQkJcHJpbnRrKEtFUk5fRVJSICJJbnZhbGlkIGludGVycnVwdCBudW1iZXIsYm9hcmQgbm90IGNvbmZpZ3VyZWRcbiIpOworCQkJCXByaW50ayhLRVJOX0VSUiAiSW52YWxpZCBpbnRlcnJ1cHQgbnVtYmVyLCAiCisJCQkJCSJib2FyZCBub3QgY29uZmlndXJlZFxuIik7CiAJCQllbHNlIGlmIChyZXR2YWwgPT0gTVhTRVJfRVJSX1ZFQ1RPUikKLQkJCQlwcmludGsoS0VSTl9FUlIgIkludmFsaWQgaW50ZXJydXB0IHZlY3Rvcixib2FyZCBub3QgY29uZmlndXJlZFxuIik7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJJbnZhbGlkIGludGVycnVwdCB2ZWN0b3IsICIKKwkJCQkJImJvYXJkIG5vdCBjb25maWd1cmVkXG4iKTsKIAkJCWVsc2UgaWYgKHJldHZhbCA9PSBNWFNFUl9FUlJfSU9BRERSKQotCQkJCXByaW50ayhLRVJOX0VSUiAiSW52YWxpZCBJL08gYWRkcmVzcyxib2FyZCBub3QgY29uZmlndXJlZFxuIik7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJJbnZhbGlkIEkvTyBhZGRyZXNzLCAiCisJCQkJCSJib2FyZCBub3QgY29uZmlndXJlZFxuIik7CiAKIAkJCWNvbnRpbnVlOwogCQl9CkBAIC03NjUsMzUgKzc3Nyw0MyBAQAogCQlod2NvbmYucGNpSW5mby5wZGV2ID0gTlVMTDsKIAogCQlteHNlcl9nZXRjZmcobSwgJmh3Y29uZik7Ci0JCS8vaW5pdCBteHNlcmNmZyBmaXJzdCwgb3IgbXhzZXJjZmcgZGF0YSBpcyBub3QgY29ycmVjdCBvbiBJU1IuCi0JCS8vbXhzZXJfaW5pdGJyZCB3aWxsIGhvb2sgSVNSLgorCQkvKgorCQkgKiBpbml0IG14c2VyY2ZnIGZpcnN0LAorCQkgKiBvciBteHNlcmNmZyBkYXRhIGlzIG5vdCBjb3JyZWN0IG9uIElTUi4KKwkJICovCisJCS8qIG14c2VyX2luaXRicmQgd2lsbCBob29rIElTUi4gKi8KIAkJaWYgKG14c2VyX2luaXRicmQobSwgJmh3Y29uZikgPCAwKQogCQkJY29udGludWU7CiAKLQogCQltKys7CiAJfQogCiAJLyogU3RhcnQgZmluZGluZyBJU0EgYm9hcmRzIGZyb20gbW9kdWxlIGFyZyAqLwogCWZvciAoYiA9IDA7IGIgPCBNWFNFUl9CT0FSRFMgJiYgbSA8IE1YU0VSX0JPQVJEUzsgYisrKSB7CiAJCWludCBjYXA7CisKIAkJaWYgKCEoY2FwID0gaW9hZGRyW2JdKSkKIAkJCWNvbnRpbnVlOwogCiAJCXJldHZhbCA9IG14c2VyX2dldF9JU0FfY29uZihjYXAsICZod2NvbmYpOwogCiAJCWlmIChyZXR2YWwgIT0gMCkKLQkJCXByaW50ayhLRVJOX0lORk8gIkZvdW5kIE1PWEEgJXMgYm9hcmQgKENBUD0weCV4KVxuIiwgbXhzZXJfYnJkbmFtZVtod2NvbmYuYm9hcmRfdHlwZSAtIDFdLCBpb2FkZHJbYl0pOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiRm91bmQgTU9YQSAlcyBib2FyZCAoQ0FQPTB4JXgpXG4iLAorCQkJCW14c2VyX2JyZG5hbWVbaHdjb25mLmJvYXJkX3R5cGUgLSAxXSwgaW9hZGRyW2JdKTsKIAogCQlpZiAocmV0dmFsIDw9IDApIHsKIAkJCWlmIChyZXR2YWwgPT0gTVhTRVJfRVJSX0lSUSkKLQkJCQlwcmludGsoS0VSTl9FUlIgIkludmFsaWQgaW50ZXJydXB0IG51bWJlcixib2FyZCBub3QgY29uZmlndXJlZFxuIik7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJJbnZhbGlkIGludGVycnVwdCBudW1iZXIsICIKKwkJCQkJImJvYXJkIG5vdCBjb25maWd1cmVkXG4iKTsKIAkJCWVsc2UgaWYgKHJldHZhbCA9PSBNWFNFUl9FUlJfSVJRX0NPTkZMSVQpCi0JCQkJcHJpbnRrKEtFUk5fRVJSICJJbnZhbGlkIGludGVycnVwdCBudW1iZXIsYm9hcmQgbm90IGNvbmZpZ3VyZWRcbiIpOworCQkJCXByaW50ayhLRVJOX0VSUiAiSW52YWxpZCBpbnRlcnJ1cHQgbnVtYmVyLCAiCisJCQkJCSJib2FyZCBub3QgY29uZmlndXJlZFxuIik7CiAJCQllbHNlIGlmIChyZXR2YWwgPT0gTVhTRVJfRVJSX1ZFQ1RPUikKLQkJCQlwcmludGsoS0VSTl9FUlIgIkludmFsaWQgaW50ZXJydXB0IHZlY3Rvcixib2FyZCBub3QgY29uZmlndXJlZFxuIik7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJJbnZhbGlkIGludGVycnVwdCB2ZWN0b3IsICIKKwkJCQkJImJvYXJkIG5vdCBjb25maWd1cmVkXG4iKTsKIAkJCWVsc2UgaWYgKHJldHZhbCA9PSBNWFNFUl9FUlJfSU9BRERSKQotCQkJCXByaW50ayhLRVJOX0VSUiAiSW52YWxpZCBJL08gYWRkcmVzcyxib2FyZCBub3QgY29uZmlndXJlZFxuIik7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJJbnZhbGlkIEkvTyBhZGRyZXNzLCAiCisJCQkJCSJib2FyZCBub3QgY29uZmlndXJlZFxuIik7CiAKIAkJCWNvbnRpbnVlOwogCQl9CkBAIC04MDMsOCArODIzLDExIEBACiAJCWh3Y29uZi5wY2lJbmZvLnBkZXYgPSBOVUxMOwogCiAJCW14c2VyX2dldGNmZyhtLCAmaHdjb25mKTsKLQkJLy9pbml0IG14c2VyY2ZnIGZpcnN0LCBvciBteHNlcmNmZyBkYXRhIGlzIG5vdCBjb3JyZWN0IG9uIElTUi4KLQkJLy9teHNlcl9pbml0YnJkIHdpbGwgaG9vayBJU1IuCisJCS8qCisJCSAqIGluaXQgbXhzZXJjZmcgZmlyc3QsCisJCSAqIG9yIG14c2VyY2ZnIGRhdGEgaXMgbm90IGNvcnJlY3Qgb24gSVNSLgorCQkgKi8KKwkJLyogbXhzZXJfaW5pdGJyZCB3aWxsIGhvb2sgSVNSLiAqLwogCQlpZiAobXhzZXJfaW5pdGJyZChtLCAmaHdjb25mKSA8IDApCiAJCQljb250aW51ZTsKIApAQCAtODE3LDcgKzg0MCw4IEBACiAJaW5kZXggPSAwOwogCWIgPSAwOwogCXdoaWxlIChiIDwgbikgewotCQlwZGV2ID0gcGNpX2ZpbmRfZGV2aWNlKG14c2VyX3BjaWJyZHNbYl0udmVuZG9yLCBteHNlcl9wY2licmRzW2JdLmRldmljZSwgcGRldik7CisJCXBkZXYgPSBwY2lfZmluZF9kZXZpY2UobXhzZXJfcGNpYnJkc1tiXS52ZW5kb3IsCisJCQkJbXhzZXJfcGNpYnJkc1tiXS5kZXZpY2UsIHBkZXYpOwogCQkJaWYgKHBkZXYgPT0gTlVMTCkgewogCQkJYisrOwogCQkJY29udGludWU7CkBAIC04MjUsMzAgKzg0OSw0OCBAQAogCQlod2NvbmYucGNpSW5mby5idXNOdW0gPSBidXNudW0gPSBwZGV2LT5idXMtPm51bWJlcjsKIAkJaHdjb25mLnBjaUluZm8uZGV2TnVtID0gZGV2bnVtID0gUENJX1NMT1QocGRldi0+ZGV2Zm4pIDw8IDM7CiAJCWh3Y29uZi5wY2lJbmZvLnBkZXYgPSBwZGV2OwotCQlwcmludGsoS0VSTl9JTkZPICJGb3VuZCBNT1hBICVzIGJvYXJkKEJ1c05vPSVkLERldk5vPSVkKVxuIiwgbXhzZXJfYnJkbmFtZVsoaW50KSAobXhzZXJfcGNpYnJkc1tiXS5kcml2ZXJfZGF0YSkgLSAxXSwgYnVzbnVtLCBkZXZudW0gPj4gMyk7CisJCXByaW50ayhLRVJOX0lORk8gIkZvdW5kIE1PWEEgJXMgYm9hcmQoQnVzTm89JWQsRGV2Tm89JWQpXG4iLAorCQkJbXhzZXJfYnJkbmFtZVsoaW50KSAobXhzZXJfcGNpYnJkc1tiXS5kcml2ZXJfZGF0YSkgLSAxXSwKKwkJCWJ1c251bSwgZGV2bnVtID4+IDMpOwogCQlpbmRleCsrOwotCQlpZiAobSA+PSBNWFNFUl9CT0FSRFMpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiVG9vIG1hbnkgU21hcnRpby9JbmR1c3RpbyBmYW1pbHkgYm9hcmRzIGZpbmQgKG1heGltdW0gJWQpLGJvYXJkIG5vdCBjb25maWd1cmVkXG4iLCBNWFNFUl9CT0FSRFMpOwotCQl9IGVsc2UgeworCQlpZiAobSA+PSBNWFNFUl9CT0FSRFMpCisJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkiVG9vIG1hbnkgU21hcnRpby9JbmR1c3RpbyBmYW1pbHkgYm9hcmRzIGZpbmQgIgorCQkJCSIobWF4aW11bSAlZCksIGJvYXJkIG5vdCBjb25maWd1cmVkXG4iLAorCQkJCU1YU0VSX0JPQVJEUyk7CisJCWVsc2UgewogCQkJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICJNb3hhIFNtYXJ0SS9PIFBDSSBlbmFibGUgZmFpbCAhXG4iKTsKKwkJCQlwcmludGsoS0VSTl9FUlIgIk1veGEgU21hcnRJL08gUENJIGVuYWJsZSAiCisJCQkJCSJmYWlsICFcbiIpOwogCQkJCWNvbnRpbnVlOwogCQkJfQotCQkJcmV0dmFsID0gbXhzZXJfZ2V0X1BDSV9jb25mKGJ1c251bSwgZGV2bnVtLCAoaW50KSBteHNlcl9wY2licmRzW2JdLmRyaXZlcl9kYXRhLCAmaHdjb25mKTsKKwkJCXJldHZhbCA9IG14c2VyX2dldF9QQ0lfY29uZihidXNudW0sIGRldm51bSwKKwkJCQkJKGludClteHNlcl9wY2licmRzW2JdLmRyaXZlcl9kYXRhLAorCQkJCQkmaHdjb25mKTsKIAkJCWlmIChyZXR2YWwgPCAwKSB7CiAJCQkJaWYgKHJldHZhbCA9PSBNWFNFUl9FUlJfSVJRKQotCQkJCQlwcmludGsoS0VSTl9FUlIgIkludmFsaWQgaW50ZXJydXB0IG51bWJlcixib2FyZCBub3QgY29uZmlndXJlZFxuIik7CisJCQkJCXByaW50ayhLRVJOX0VSUgorCQkJCQkJIkludmFsaWQgaW50ZXJydXB0IG51bWJlciwgIgorCQkJCQkJImJvYXJkIG5vdCBjb25maWd1cmVkXG4iKTsKIAkJCQllbHNlIGlmIChyZXR2YWwgPT0gTVhTRVJfRVJSX0lSUV9DT05GTElUKQotCQkJCQlwcmludGsoS0VSTl9FUlIgIkludmFsaWQgaW50ZXJydXB0IG51bWJlcixib2FyZCBub3QgY29uZmlndXJlZFxuIik7CisJCQkJCXByaW50ayhLRVJOX0VSUgorCQkJCQkJIkludmFsaWQgaW50ZXJydXB0IG51bWJlciwgIgorCQkJCQkJImJvYXJkIG5vdCBjb25maWd1cmVkXG4iKTsKIAkJCQllbHNlIGlmIChyZXR2YWwgPT0gTVhTRVJfRVJSX1ZFQ1RPUikKLQkJCQkJcHJpbnRrKEtFUk5fRVJSICJJbnZhbGlkIGludGVycnVwdCB2ZWN0b3IsYm9hcmQgbm90IGNvbmZpZ3VyZWRcbiIpOworCQkJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkJCSJJbnZhbGlkIGludGVycnVwdCB2ZWN0b3IsICIKKwkJCQkJCSJib2FyZCBub3QgY29uZmlndXJlZFxuIik7CiAJCQkJZWxzZSBpZiAocmV0dmFsID09IE1YU0VSX0VSUl9JT0FERFIpCi0JCQkJCXByaW50ayhLRVJOX0VSUiAiSW52YWxpZCBJL08gYWRkcmVzcyxib2FyZCBub3QgY29uZmlndXJlZFxuIik7CisJCQkJCXByaW50ayhLRVJOX0VSUgorCQkJCQkJIkludmFsaWQgSS9PIGFkZHJlc3MsICIKKwkJCQkJCSJib2FyZCBub3QgY29uZmlndXJlZFxuIik7CiAJCQkJY29udGludWU7CiAJCQl9CiAJCQlteHNlcl9nZXRjZmcobSwgJmh3Y29uZik7Ci0JCQkvL2luaXQgbXhzZXJjZmcgZmlyc3QsIG9yIG14c2VyY2ZnIGRhdGEgaXMgbm90IGNvcnJlY3Qgb24gSVNSLgotCQkJLy9teHNlcl9pbml0YnJkIHdpbGwgaG9vayBJU1IuCisJCQkvKiBpbml0IG14c2VyY2ZnIGZpcnN0LAorCQkJICogb3IgbXhzZXJjZmcgZGF0YSBpcyBub3QgY29ycmVjdCBvbiBJU1IuCisJCQkgKi8KKwkJCS8qIG14c2VyX2luaXRicmQgd2lsbCBob29rIElTUi4gKi8KIAkJCWlmIChteHNlcl9pbml0YnJkKG0sICZod2NvbmYpIDwgMCkKIAkJCQljb250aW51ZTsKIAkJCW0rKzsKQEAgLTg1OCw3ICs5MDAsOCBAQAogCiAJcmV0dmFsID0gdHR5X3JlZ2lzdGVyX2RyaXZlcihteHZhcl9zZHJpdmVyKTsKIAlpZiAocmV0dmFsKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiQ291bGRuJ3QgaW5zdGFsbCBNT1hBIFNtYXJ0aW8vSW5kdXN0aW8gZmFtaWx5IGRyaXZlciAhXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJDb3VsZG4ndCBpbnN0YWxsIE1PWEEgU21hcnRpby9JbmR1c3RpbyBmYW1pbHkiCisJCQkJIiBkcml2ZXIgIVxuIik7CiAJCXB1dF90dHlfZHJpdmVyKG14dmFyX3Nkcml2ZXIpOwogCiAJCWZvciAoaSA9IDA7IGkgPCBNWFNFUl9CT0FSRFM7IGkrKykgewpAQCAtODY2LDcgKzkwOSw3IEBACiAJCQkJY29udGludWU7CiAJCQllbHNlIHsKIAkJCQlmcmVlX2lycShteHNlcmNmZ1tpXS5pcnEsICZteHZhcl90YWJsZVtpICogTVhTRVJfUE9SVFNfUEVSX0JPQVJEXSk7Ci0JCQkJLy90b2RvOiByZWxlYXNlIGlvLCB2ZWN0b3IKKwkJCQkvKiB0b2RvOiByZWxlYXNlIGlvLCB2ZWN0b3IgKi8KIAkJCX0KIAkJfQogCQlyZXR1cm4gcmV0dmFsOwpAQCAtODc3LDcgKzkyMCw3IEBACiAKIHN0YXRpYyB2b2lkIG14c2VyX2RvX3NvZnRpbnQodm9pZCAqcHJpdmF0ZV8pCiB7Ci0Jc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbyA9IChzdHJ1Y3QgbXhzZXJfc3RydWN0ICopIHByaXZhdGVfOworCXN0cnVjdCBteHNlcl9zdHJ1Y3QgKmluZm8gPSBwcml2YXRlXzsKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwogCiAJdHR5ID0gaW5mby0+dHR5OwpAQCAtOTI2LDcgKzk2OSw3IEBACiAJCXJldHVybiAtRU5PREVWOwogCWluZm8gPSBteHZhcl90YWJsZSArIGxpbmU7CiAJaWYgKCFpbmZvLT5iYXNlKQotCQlyZXR1cm4gKC1FTk9ERVYpOworCQlyZXR1cm4gLUVOT0RFVjsKIAogCXR0eS0+ZHJpdmVyX2RhdGEgPSBpbmZvOwogCWluZm8tPnR0eSA9IHR0eTsKQEAgLTkzNSwxMSArOTc4LDExIEBACiAJICovCiAJcmV0dmFsID0gbXhzZXJfc3RhcnR1cChpbmZvKTsKIAlpZiAocmV0dmFsKQotCQlyZXR1cm4gKHJldHZhbCk7CisJCXJldHVybiByZXR2YWw7CiAKIAlyZXR2YWwgPSBteHNlcl9ibG9ja190aWxfcmVhZHkodHR5LCBmaWxwLCBpbmZvKTsKIAlpZiAocmV0dmFsKQotCQlyZXR1cm4gKHJldHZhbCk7CisJCXJldHVybiByZXR2YWw7CiAKIAlpbmZvLT5jb3VudCsrOwogCkBAIC05NTUsMTEgKzk5OCwxMiBAQAogCWluZm8tPnBncnAgPSBwcm9jZXNzX2dyb3VwKGN1cnJlbnQpOwogCWNsZWFyX2JpdChUVFlfRE9OVF9GTElQLCAmdHR5LT5mbGFncyk7CiAKLQkvL3N0YXR1cyA9IG14c2VyX2dldF9tc3IoaW5mby0+YmFzZSwgMCwgaW5mby0+cG9ydCk7Ci0JLy9teHNlcl9jaGVja19tb2RlbV9zdGF0dXMoaW5mbywgc3RhdHVzKTsKKwkvKgorCXN0YXR1cyA9IG14c2VyX2dldF9tc3IoaW5mby0+YmFzZSwgMCwgaW5mby0+cG9ydCk7CisJbXhzZXJfY2hlY2tfbW9kZW1fc3RhdHVzKGluZm8sIHN0YXR1cyk7CisJKi8KIAotLyogdW5tYXJrIGhlcmUgZm9yIHZlcnkgaGlnaCBiYXVkIHJhdGUgKGV4LiA5MjE2MDAgYnBzKSB1c2VkCi0qLworLyogdW5tYXJrIGhlcmUgZm9yIHZlcnkgaGlnaCBiYXVkIHJhdGUgKGV4LiA5MjE2MDAgYnBzKSB1c2VkICovCiAJdHR5LT5sb3dfbGF0ZW5jeSA9IDE7CiAJcmV0dXJuIDA7CiB9CkBAIC05NzIsNyArMTAxNiw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIG14c2VyX2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxwKQogewotCXN0cnVjdCBteHNlcl9zdHJ1Y3QgKmluZm8gPSAoc3RydWN0IG14c2VyX3N0cnVjdCAqKSB0dHktPmRyaXZlcl9kYXRhOworCXN0cnVjdCBteHNlcl9zdHJ1Y3QgKmluZm8gPSB0dHktPmRyaXZlcl9kYXRhOwogCiAJdW5zaWduZWQgbG9uZyB0aW1lb3V0OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC05OTcsMTEgKzEwNDEsMTMgQEAKIAkJICogb25lLCB3ZSd2ZSBnb3QgcmVhbCBwcm9ibGVtcywgc2luY2UgaXQgbWVhbnMgdGhlCiAJCSAqIHNlcmlhbCBwb3J0IHdvbid0IGJlIHNodXRkb3duLgogCQkgKi8KLQkJcHJpbnRrKEtFUk5fRVJSICJteHNlcl9jbG9zZTogYmFkIHNlcmlhbCBwb3J0IGNvdW50OyB0dHktPmNvdW50IGlzIDEsICIgImluZm8tPmNvdW50IGlzICVkXG4iLCBpbmZvLT5jb3VudCk7CisJCXByaW50ayhLRVJOX0VSUiAibXhzZXJfY2xvc2U6IGJhZCBzZXJpYWwgcG9ydCBjb3VudDsgIgorCQkJInR0eS0+Y291bnQgaXMgMSwgaW5mby0+Y291bnQgaXMgJWRcbiIsIGluZm8tPmNvdW50KTsKIAkJaW5mby0+Y291bnQgPSAxOwogCX0KIAlpZiAoLS1pbmZvLT5jb3VudCA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJteHNlcl9jbG9zZTogYmFkIHNlcmlhbCBwb3J0IGNvdW50IGZvciB0dHlzJWQ6ICVkXG4iLCBpbmZvLT5wb3J0LCBpbmZvLT5jb3VudCk7CisJCXByaW50ayhLRVJOX0VSUiAibXhzZXJfY2xvc2U6IGJhZCBzZXJpYWwgcG9ydCBjb3VudCBmb3IgIgorCQkJInR0eXMlZDogJWRcbiIsIGluZm8tPnBvcnQsIGluZm8tPmNvdW50KTsKIAkJaW5mby0+Y291bnQgPSAwOwogCX0KIAlpZiAoaW5mby0+Y291bnQpIHsKQEAgLTEwNTYsNyArMTEwMiw3IEBACiAJCQogCWxkID0gdHR5X2xkaXNjX3JlZih0dHkpOwogCWlmIChsZCkgewotCQlpZihsZC0+Zmx1c2hfYnVmZmVyKQorCQlpZiAobGQtPmZsdXNoX2J1ZmZlcikKIAkJCWxkLT5mbHVzaF9idWZmZXIodHR5KTsKIAkJdHR5X2xkaXNjX2RlcmVmKGxkKTsKIAl9CkBAIC0xMDc4LDMxICsxMTI0LDM0IEBACiBzdGF0aWMgaW50IG14c2VyX3dyaXRlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGNvdW50KQogewogCWludCBjLCB0b3RhbCA9IDA7Ci0Jc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbyA9IChzdHJ1Y3QgbXhzZXJfc3RydWN0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbyA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWlmICghdHR5IHx8ICFpbmZvLT54bWl0X2J1ZikKLQkJcmV0dXJuICgwKTsKKwlpZiAoIWluZm8tPnhtaXRfYnVmKQorCQlyZXR1cm4gMDsKIAogCXdoaWxlICgxKSB7Ci0JCWMgPSBtaW5fdChpbnQsIGNvdW50LCBtaW4oU0VSSUFMX1hNSVRfU0laRSAtIGluZm8tPnhtaXRfY250IC0gMSwgU0VSSUFMX1hNSVRfU0laRSAtIGluZm8tPnhtaXRfaGVhZCkpOworCQljID0gbWluX3QoaW50LCBjb3VudCwgbWluKFNFUklBTF9YTUlUX1NJWkUgLSBpbmZvLT54bWl0X2NudCAtIDEsCisJCQkJCSAgU0VSSUFMX1hNSVRfU0laRSAtIGluZm8tPnhtaXRfaGVhZCkpOwogCQlpZiAoYyA8PSAwKQogCQkJYnJlYWs7CiAKIAkJbWVtY3B5KGluZm8tPnhtaXRfYnVmICsgaW5mby0+eG1pdF9oZWFkLCBidWYsIGMpOwogCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKLQkJaW5mby0+eG1pdF9oZWFkID0gKGluZm8tPnhtaXRfaGVhZCArIGMpICYgKFNFUklBTF9YTUlUX1NJWkUgLSAxKTsKKwkJaW5mby0+eG1pdF9oZWFkID0gKGluZm8tPnhtaXRfaGVhZCArIGMpICYKKwkJCQkgIChTRVJJQUxfWE1JVF9TSVpFIC0gMSk7CiAJCWluZm8tPnhtaXRfY250ICs9IGM7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CiAKIAkJYnVmICs9IGM7CiAJCWNvdW50IC09IGM7CiAJCXRvdGFsICs9IGM7Ci0KIAl9CiAKIAlpZiAoaW5mby0+eG1pdF9jbnQgJiYgIXR0eS0+c3RvcHBlZCAmJiAhKGluZm8tPklFUiAmIFVBUlRfSUVSX1RIUkkpKSB7Ci0JCWlmICghdHR5LT5od19zdG9wcGVkIHx8IChpbmZvLT50eXBlID09IFBPUlRfMTY1NTBBKSB8fCAoaW5mby0+SXNNb3hhTXVzdENoaXBGbGFnKSkgeworCQlpZiAoIXR0eS0+aHdfc3RvcHBlZCB8fAorCQkJCShpbmZvLT50eXBlID09IFBPUlRfMTY1NTBBKSB8fAorCQkJCShpbmZvLT5Jc01veGFNdXN0Q2hpcEZsYWcpKSB7CiAJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKIAkJCWluZm8tPklFUiB8PSBVQVJUX0lFUl9USFJJOwogCQkJb3V0YihpbmZvLT5JRVIsIGluZm8tPmJhc2UgKyBVQVJUX0lFUik7CkBAIC0xMTE0LDEwICsxMTYzLDEwIEBACiAKIHN0YXRpYyB2b2lkIG14c2VyX3B1dF9jaGFyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHVuc2lnbmVkIGNoYXIgY2gpCiB7Ci0Jc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbyA9IChzdHJ1Y3QgbXhzZXJfc3RydWN0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbyA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWlmICghdHR5IHx8ICFpbmZvLT54bWl0X2J1ZikKKwlpZiAoIWluZm8tPnhtaXRfYnVmKQogCQlyZXR1cm47CiAKIAlpZiAoaW5mby0+eG1pdF9jbnQgPj0gU0VSSUFMX1hNSVRfU0laRSAtIDEpCkBAIC0xMTI5LDcgKzExNzgsOSBAQAogCWluZm8tPnhtaXRfY250Kys7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKIAlpZiAoIXR0eS0+c3RvcHBlZCAmJiAhKGluZm8tPklFUiAmIFVBUlRfSUVSX1RIUkkpKSB7Ci0JCWlmICghdHR5LT5od19zdG9wcGVkIHx8IChpbmZvLT50eXBlID09IFBPUlRfMTY1NTBBKSB8fCBpbmZvLT5Jc01veGFNdXN0Q2hpcEZsYWcpIHsKKwkJaWYgKCF0dHktPmh3X3N0b3BwZWQgfHwKKwkJCQkoaW5mby0+dHlwZSA9PSBQT1JUXzE2NTUwQSkgfHwKKwkJCQlpbmZvLT5Jc01veGFNdXN0Q2hpcEZsYWcpIHsKIAkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOwogCQkJaW5mby0+SUVSIHw9IFVBUlRfSUVSX1RIUkk7CiAJCQlvdXRiKGluZm8tPklFUiwgaW5mby0+YmFzZSArIFVBUlRfSUVSKTsKQEAgLTExNDEsMTAgKzExOTIsMTYgQEAKIAogc3RhdGljIHZvaWQgbXhzZXJfZmx1c2hfY2hhcnMoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKIHsKLQlzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvID0gKHN0cnVjdCBteHNlcl9zdHJ1Y3QgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvID0gdHR5LT5kcml2ZXJfZGF0YTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JaWYgKGluZm8tPnhtaXRfY250IDw9IDAgfHwgdHR5LT5zdG9wcGVkIHx8ICFpbmZvLT54bWl0X2J1ZiB8fCAodHR5LT5od19zdG9wcGVkICYmIChpbmZvLT50eXBlICE9IFBPUlRfMTY1NTBBKSAmJiAoIWluZm8tPklzTW94YU11c3RDaGlwRmxhZykpKQorCWlmIChpbmZvLT54bWl0X2NudCA8PSAwIHx8CisJCQl0dHktPnN0b3BwZWQgfHwKKwkJCSFpbmZvLT54bWl0X2J1ZiB8fAorCQkJKHR0eS0+aHdfc3RvcHBlZCAmJgorCQkJIChpbmZvLT50eXBlICE9IFBPUlRfMTY1NTBBKSAmJgorCQkJICghaW5mby0+SXNNb3hhTXVzdENoaXBGbGFnKQorCQkJKSkKIAkJcmV0dXJuOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CkBAIC0xMTU3LDI0ICsxMjE0LDI0IEBACiAKIHN0YXRpYyBpbnQgbXhzZXJfd3JpdGVfcm9vbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewotCXN0cnVjdCBteHNlcl9zdHJ1Y3QgKmluZm8gPSAoc3RydWN0IG14c2VyX3N0cnVjdCAqKSB0dHktPmRyaXZlcl9kYXRhOworCXN0cnVjdCBteHNlcl9zdHJ1Y3QgKmluZm8gPSB0dHktPmRyaXZlcl9kYXRhOwogCWludCByZXQ7CiAKIAlyZXQgPSBTRVJJQUxfWE1JVF9TSVpFIC0gaW5mby0+eG1pdF9jbnQgLSAxOwogCWlmIChyZXQgPCAwKQogCQlyZXQgPSAwOwotCXJldHVybiAocmV0KTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IG14c2VyX2NoYXJzX2luX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewotCXN0cnVjdCBteHNlcl9zdHJ1Y3QgKmluZm8gPSAoc3RydWN0IG14c2VyX3N0cnVjdCAqKSB0dHktPmRyaXZlcl9kYXRhOworCXN0cnVjdCBteHNlcl9zdHJ1Y3QgKmluZm8gPSB0dHktPmRyaXZlcl9kYXRhOwogCXJldHVybiBpbmZvLT54bWl0X2NudDsKIH0KIAogc3RhdGljIHZvaWQgbXhzZXJfZmx1c2hfYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCiB7Ci0Jc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbyA9IChzdHJ1Y3QgbXhzZXJfc3RydWN0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbyA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJY2hhciBmY3I7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIApAQCAtMTE4NCw3ICsxMjQxLDggQEAKIAogCS8qIGJlbG93IGFkZGVkIGJ5IHNoaW5oYXkgKi8KIAlmY3IgPSBpbmIoaW5mby0+YmFzZSArIFVBUlRfRkNSKTsKLQlvdXRiKChmY3IgfCBVQVJUX0ZDUl9DTEVBUl9SQ1ZSIHwgVUFSVF9GQ1JfQ0xFQVJfWE1JVCksIGluZm8tPmJhc2UgKyBVQVJUX0ZDUik7CisJb3V0YigoZmNyIHwgVUFSVF9GQ1JfQ0xFQVJfUkNWUiB8IFVBUlRfRkNSX0NMRUFSX1hNSVQpLAorCQlpbmZvLT5iYXNlICsgVUFSVF9GQ1IpOwogCW91dGIoZmNyLCBpbmZvLT5iYXNlICsgVUFSVF9GQ1IpOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKQEAgLTExOTcsNyArMTI1NSw3IEBACiAKIHN0YXRpYyBpbnQgbXhzZXJfaW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCXN0cnVjdCBteHNlcl9zdHJ1Y3QgKmluZm8gPSAoc3RydWN0IG14c2VyX3N0cnVjdCAqKSB0dHktPmRyaXZlcl9kYXRhOworCXN0cnVjdCBteHNlcl9zdHJ1Y3QgKmluZm8gPSB0dHktPmRyaXZlcl9kYXRhOwogCWludCByZXR2YWw7CiAJc3RydWN0IGFzeW5jX2ljb3VudCBjcHJldiwgY25vdzsJLyoga2VybmVsIGNvdW50ZXIgdGVtcHMgKi8KIAlzdHJ1Y3Qgc2VyaWFsX2ljb3VudGVyX3N0cnVjdCBfX3VzZXIgKnBfY3VzZXI7CkBAIC0xMjA2LDkgKzEyNjQsOSBAQAogCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwogCiAJaWYgKHR0eS0+aW5kZXggPT0gTVhTRVJfUE9SVFMpCi0JCXJldHVybiAobXhzZXJfaW9jdGxfc3BlY2lhbChjbWQsIGFyZ3ApKTsKKwkJcmV0dXJuIG14c2VyX2lvY3RsX3NwZWNpYWwoY21kLCBhcmdwKTsKIAotCS8vIGZvbGxvd2luZyBhZGQgYnkgVmljdG9yIFl1LiAwMS0wNS0yMDA0CisJLyogZm9sbG93aW5nIGFkZCBieSBWaWN0b3IgWXUuIDAxLTA1LTIwMDQgKi8KIAlpZiAoY21kID09IE1PWEFfU0VUX09QX01PREUgfHwgY21kID09IE1PWEFfR0VUX09QX01PREUpIHsKIAkJaW50IG9wbW9kZSwgcDsKIAkJc3RhdGljIHVuc2lnbmVkIGNoYXIgTW9kZU1hc2tbXSA9IHsgMHhmYywgMHhmMywgMHhjZiwgMHgzZiB9OwpAQCAtMTIxOSw3ICsxMjc3LDEwIEBACiAJCWlmIChjbWQgPT0gTU9YQV9TRVRfT1BfTU9ERSkgewogCQkJaWYgKGdldF91c2VyKG9wbW9kZSwgKGludCBfX3VzZXIgKikgYXJncCkpCiAJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQlpZiAob3Btb2RlICE9IFJTMjMyX01PREUgJiYgb3Btb2RlICE9IFJTNDg1XzJXSVJFX01PREUgJiYgb3Btb2RlICE9IFJTNDIyX01PREUgJiYgb3Btb2RlICE9IFJTNDg1XzRXSVJFX01PREUpCisJCQlpZiAob3Btb2RlICE9IFJTMjMyX01PREUgJiYKKwkJCQkJb3Btb2RlICE9IFJTNDg1XzJXSVJFX01PREUgJiYKKwkJCQkJb3Btb2RlICE9IFJTNDIyX01PREUgJiYKKwkJCQkJb3Btb2RlICE9IFJTNDg1XzRXSVJFX01PREUpCiAJCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCQltYXNrID0gTW9kZU1hc2tbcF07CiAJCQlzaGlmdGJpdCA9IHAgKiAyOwpAQCAtMTIzNiwzNiArMTI5NywzNiBAQAogCQl9CiAJCXJldHVybiAwOwogCX0KLQkvLyBhYm92ZSBhZGQgYnkgVmljdG9yIFl1LiAwMS0wNS0yMDA0CisJLyogYWJvdmUgYWRkIGJ5IFZpY3RvciBZdS4gMDEtMDUtMjAwNCAqLwogCiAJaWYgKChjbWQgIT0gVElPQ0dTRVJJQUwpICYmIChjbWQgIT0gVElPQ01JV0FJVCkgJiYgKGNtZCAhPSBUSU9DR0lDT1VOVCkpIHsKIAkJaWYgKHR0eS0+ZmxhZ3MgJiAoMSA8PCBUVFlfSU9fRVJST1IpKQotCQkJcmV0dXJuICgtRUlPKTsKKwkJCXJldHVybiAtRUlPOwogCX0KIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgVENTQlJLOgkJLyogU1ZJRCB2ZXJzaW9uOiBub24temVybyBhcmcgLS0+IG5vIGJyZWFrICovCiAJCXJldHZhbCA9IHR0eV9jaGVja19jaGFuZ2UodHR5KTsKIAkJaWYgKHJldHZhbCkKLQkJCXJldHVybiAocmV0dmFsKTsKKwkJCXJldHVybiByZXR2YWw7CiAJCXR0eV93YWl0X3VudGlsX3NlbnQodHR5LCAwKTsKIAkJaWYgKCFhcmcpCiAJCQlteHNlcl9zZW5kX2JyZWFrKGluZm8sIEhaIC8gNCk7CS8qIDEvNCBzZWNvbmQgKi8KLQkJcmV0dXJuICgwKTsKKwkJcmV0dXJuIDA7CiAJY2FzZSBUQ1NCUktQOgkJLyogc3VwcG9ydCBmb3IgUE9TSVggdGNzZW5kYnJlYWsoKSAqLwogCQlyZXR2YWwgPSB0dHlfY2hlY2tfY2hhbmdlKHR0eSk7CiAJCWlmIChyZXR2YWwpCi0JCQlyZXR1cm4gKHJldHZhbCk7CisJCQlyZXR1cm4gcmV0dmFsOwogCQl0dHlfd2FpdF91bnRpbF9zZW50KHR0eSwgMCk7CiAJCW14c2VyX3NlbmRfYnJlYWsoaW5mbywgYXJnID8gYXJnICogKEhaIC8gMTApIDogSFogLyA0KTsKLQkJcmV0dXJuICgwKTsKKwkJcmV0dXJuIDA7CiAJY2FzZSBUSU9DR1NPRlRDQVI6Ci0JCXJldHVybiBwdXRfdXNlcihDX0NMT0NBTCh0dHkpID8gMSA6IDAsICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKSBhcmdwKTsKKwkJcmV0dXJuIHB1dF91c2VyKENfQ0xPQ0FMKHR0eSkgPyAxIDogMCwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopYXJncCk7CiAJY2FzZSBUSU9DU1NPRlRDQVI6CiAJCWlmIChnZXRfdXNlcih0ZW1wbCwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopIGFyZ3ApKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCWFyZyA9IHRlbXBsOwogCQl0dHktPnRlcm1pb3MtPmNfY2ZsYWcgPSAoKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIH5DTE9DQUwpIHwgKGFyZyA/IENMT0NBTCA6IDApKTsKLQkJcmV0dXJuICgwKTsKKwkJcmV0dXJuIDA7CiAJY2FzZSBUSU9DR1NFUklBTDoKIAkJcmV0dXJuIG14c2VyX2dldF9zZXJpYWxfaW5mbyhpbmZvLCBhcmdwKTsKIAljYXNlIFRJT0NTU0VSSUFMOgpAQCAtMTI3OCw3ICsxMzM5LDcgQEAKIAkJICogICAodXNlIHwnZWQgVElPQ01fUk5HL0RTUi9DRC9DVFMgZm9yIG1hc2tpbmcpCiAJCSAqIENhbGxlciBzaG91bGQgdXNlIFRJT0NHSUNPVU5UIHRvIHNlZSB3aGljaCBvbmUgaXQgd2FzCiAJCSAqLwotCWNhc2UgVElPQ01JV0FJVDp7CisJY2FzZSBUSU9DTUlXQUlUOiB7CiAJCQlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKIAkJCWludCByZXQ7CiAJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKQEAgLTEyOTIsNyArMTM1MywxNCBAQAogCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CiAKIAkJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCQkJCWlmICgoKGFyZyAmIFRJT0NNX1JORykgJiYgKGNub3cucm5nICE9IGNwcmV2LnJuZykpIHx8ICgoYXJnICYgVElPQ01fRFNSKSAmJiAoY25vdy5kc3IgIT0gY3ByZXYuZHNyKSkgfHwgKChhcmcgJiBUSU9DTV9DRCkgJiYgKGNub3cuZGNkICE9IGNwcmV2LmRjZCkpIHx8ICgoYXJnICYgVElPQ01fQ1RTKSAmJiAoY25vdy5jdHMgIT0gY3ByZXYuY3RzKSkpIHsKKwkJCQlpZiAoKChhcmcgJiBUSU9DTV9STkcpICYmCisJCQkJCQkoY25vdy5ybmcgIT0gY3ByZXYucm5nKSkgfHwKKwkJCQkJCSgoYXJnICYgVElPQ01fRFNSKSAmJgorCQkJCQkJKGNub3cuZHNyICE9IGNwcmV2LmRzcikpIHx8CisJCQkJCQkoKGFyZyAmIFRJT0NNX0NEKSAmJgorCQkJCQkJKGNub3cuZGNkICE9IGNwcmV2LmRjZCkpIHx8CisJCQkJCQkoKGFyZyAmIFRJT0NNX0NUUykgJiYKKwkJCQkJCShjbm93LmN0cyAhPSBjcHJldi5jdHMpKSkgewogCQkJCQlyZXQgPSAwOwogCQkJCQlicmVhazsKIAkJCQl9CkBAIC0xMzM4LDIxICsxNDA2LDE4IEBACiAJCXB1dF91c2VyKGNub3cuZHNyLCAmcF9jdXNlci0+ZHNyKTsKIAkJcHV0X3VzZXIoY25vdy5ybmcsICZwX2N1c2VyLT5ybmcpOwogCQlwdXRfdXNlcihjbm93LmRjZCwgJnBfY3VzZXItPmRjZCk7Ci0KLS8qICovCiAJCXJldHVybiAwOwogCWNhc2UgTU9YQV9IaWdoU3BlZWRPbjoKLQkJcmV0dXJuIHB1dF91c2VyKGluZm8tPmJhdWRfYmFzZSAhPSAxMTUyMDAgPyAxIDogMCwgKGludCBfX3VzZXIgKikgYXJncCk7Ci0KLQljYXNlIE1PWEFfU0RTX1JTVElDT1VOVEVSOnsKKwkJcmV0dXJuIHB1dF91c2VyKGluZm8tPmJhdWRfYmFzZSAhPSAxMTUyMDAgPyAxIDogMCwgKGludCBfX3VzZXIgKilhcmdwKTsKKwljYXNlIE1PWEFfU0RTX1JTVElDT1VOVEVSOiB7CiAJCQlpbmZvLT5tb25fZGF0YS5yeGNudCA9IDA7CiAJCQlpbmZvLT5tb25fZGF0YS50eGNudCA9IDA7CiAJCQlyZXR1cm4gMDsKIAkJfQotLy8gKGFib3ZlKSBhZGRlZCBieSBKYW1lcy4KKy8qIChhYm92ZSkgYWRkZWQgYnkgSmFtZXMuICovCiAJY2FzZSBNT1hBX0FTUFBfU0VUQkFVRDp7CiAJCQlsb25nIGJhdWQ7Ci0JCQlpZiAoZ2V0X3VzZXIoYmF1ZCwgKGxvbmcgX191c2VyICopIGFyZ3ApKQorCQkJaWYgKGdldF91c2VyKGJhdWQsIChsb25nIF9fdXNlciAqKWFyZ3ApKQogCQkJCXJldHVybiAtRUZBVUxUOwogCQkJbXhzZXJfc2V0X2JhdWQoaW5mbywgYmF1ZCk7CiAJCQlyZXR1cm4gMDsKQEAgLTEzNzcsOSArMTQ0MiwxMCBAQAogCiAJCQlyZXR1cm4gMDsKIAkJfQotCWNhc2UgTU9YQV9BU1BQX01PTjp7CisJY2FzZSBNT1hBX0FTUFBfTU9OOiB7CiAJCQlpbnQgbWNyLCBzdGF0dXM7Ci0vLyAgICAgIGluZm8tPm1vbl9kYXRhLnNlcl9wYXJhbSA9IHR0eS0+dGVybWlvcy0+Y19jZmxhZzsKKworCQkJLyogaW5mby0+bW9uX2RhdGEuc2VyX3BhcmFtID0gdHR5LT50ZXJtaW9zLT5jX2NmbGFnOyAqLwogCiAJCQlzdGF0dXMgPSBteHNlcl9nZXRfbXNyKGluZm8tPmJhc2UsIDEsIGluZm8tPnBvcnQsIGluZm8pOwogCQkJbXhzZXJfY2hlY2tfbW9kZW1fc3RhdHVzKGluZm8sIHN0YXR1cyk7CkBAIC0xNDAwLDI1ICsxNDY2LDI1IEBACiAJCQllbHNlCiAJCQkJaW5mby0+bW9uX2RhdGEuaG9sZF9yZWFzb24gJj0gfk5QUElfTk9USUZZX0NUU0hPTEQ7CiAKLQotCQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmaW5mby0+bW9uX2RhdGEsIHNpemVvZihzdHJ1Y3QgbXhzZXJfbW9uKSkpCisJCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZpbmZvLT5tb25fZGF0YSwKKwkJCQkJc2l6ZW9mKHN0cnVjdCBteHNlcl9tb24pKSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKIAogCQkJcmV0dXJuIDA7Ci0KIAkJfQogCi0JY2FzZSBNT1hBX0FTUFBfTFNUQVRVUzp7Ci0JCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZpbmZvLT5lcnJfc2hhZG93LCBzaXplb2YodW5zaWduZWQgY2hhcikpKQorCWNhc2UgTU9YQV9BU1BQX0xTVEFUVVM6IHsKKwkJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmluZm8tPmVycl9zaGFkb3csCisJCQkJCXNpemVvZih1bnNpZ25lZCBjaGFyKSkpCiAJCQkJcmV0dXJuIC1FRkFVTFQ7CiAKIAkJCWluZm8tPmVycl9zaGFkb3cgPSAwOwogCQkJcmV0dXJuIDA7Ci0KIAkJfQotCWNhc2UgTU9YQV9TRVRfQkFVRF9NRVRIT0Q6eworCWNhc2UgTU9YQV9TRVRfQkFVRF9NRVRIT0Q6IHsKIAkJCWludCBtZXRob2Q7Ci0JCQlpZiAoZ2V0X3VzZXIobWV0aG9kLCAoaW50IF9fdXNlciAqKSBhcmdwKSkKKworCQkJaWYgKGdldF91c2VyKG1ldGhvZCwgKGludCBfX3VzZXIgKilhcmdwKSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKIAkJCW14c2VyX3NldF9iYXVkX21ldGhvZFtpbmZvLT5wb3J0XSA9IG1ldGhvZDsKIAkJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJm1ldGhvZCwgc2l6ZW9mKGludCkpKQpAQCAtMTQ0Miw3ICsxNTA4LDggQEAKIAogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBNT1hBX0dFVF9DT05GOgotCQlpZiAoY29weV90b191c2VyKGFyZ3AsIG14c2VyY2ZnLCBzaXplb2Yoc3RydWN0IG14c2VyX2h3Y29uZikgKiA0KSkKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCBteHNlcmNmZywKKwkJCQlzaXplb2Yoc3RydWN0IG14c2VyX2h3Y29uZikgKiA0KSkKIAkJCXJldHVybiAtRUZBVUxUOwogCQlyZXR1cm4gMDsKIAljYXNlIE1PWEFfR0VUX01BSk9SOgpAQCAtMTQ2MSwxMSArMTUyOCwxMSBAQAogCQkJaWYgKG14dmFyX3RhYmxlW2ldLmJhc2UpCiAJCQkJcmVzdWx0IHw9ICgxIDw8IGkpOwogCQl9Ci0JCXJldHVybiBwdXRfdXNlcihyZXN1bHQsICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKSBhcmdwKTsKKwkJcmV0dXJuIHB1dF91c2VyKHJlc3VsdCwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopYXJncCk7CiAJY2FzZSBNT1hBX0dFVERBVEFDT1VOVDoKIAkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmbXh2YXJfbG9nLCBzaXplb2YobXh2YXJfbG9nKSkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKLQkJcmV0dXJuICgwKTsKKwkJcmV0dXJuIDA7CiAJY2FzZSBNT1hBX0dFVE1TVEFUVVM6CiAJCWZvciAoaSA9IDA7IGkgPCBNWFNFUl9QT1JUUzsgaSsrKSB7CiAJCQlHTVN0YXR1c1tpXS5yaSA9IDA7CkBAIC0xNDk4LDIyICsxNTY1LDI2IEBACiAJCQllbHNlCiAJCQkJR01TdGF0dXNbaV0uY3RzID0gMDsKIAkJfQotCQlpZiAoY29weV90b191c2VyKGFyZ3AsIEdNU3RhdHVzLCBzaXplb2Yoc3RydWN0IG14c2VyX21zdGF0dXMpICogTVhTRVJfUE9SVFMpKQorCQlpZiAoY29weV90b191c2VyKGFyZ3AsIEdNU3RhdHVzLAorCQkJCXNpemVvZihzdHJ1Y3QgbXhzZXJfbXN0YXR1cykgKiBNWFNFUl9QT1JUUykpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAkJcmV0dXJuIDA7Ci0JY2FzZSBNT1hBX0FTUFBfTU9OX0VYVDp7CisJY2FzZSBNT1hBX0FTUFBfTU9OX0VYVDogewogCQkJaW50IHN0YXR1czsKIAkJCWludCBvcG1vZGUsIHA7CiAJCQlpbnQgc2hpZnRiaXQ7CiAJCQl1bnNpZ25lZCBjZmxhZywgaWZsYWc7CiAKIAkJCWZvciAoaSA9IDA7IGkgPCBNWFNFUl9QT1JUUzsgaSsrKSB7Ci0KIAkJCQlpZiAoIW14dmFyX3RhYmxlW2ldLmJhc2UpCiAJCQkJCWNvbnRpbnVlOwogCi0JCQkJc3RhdHVzID0gbXhzZXJfZ2V0X21zcihteHZhcl90YWJsZVtpXS5iYXNlLCAwLCBpLCAmKG14dmFyX3RhYmxlW2ldKSk7Ci0vLyAgICAgICAgICAgICAgICAgICAgICBteHNlcl9jaGVja19tb2RlbV9zdGF0dXMoJm14dmFyX3RhYmxlW2ldLCBzdGF0dXMpOworCQkJCXN0YXR1cyA9IG14c2VyX2dldF9tc3IobXh2YXJfdGFibGVbaV0uYmFzZSwgMCwKKwkJCQkJCQlpLCAmKG14dmFyX3RhYmxlW2ldKSk7CisJCQkJLyoKKwkJCQlteHNlcl9jaGVja19tb2RlbV9zdGF0dXMoJm14dmFyX3RhYmxlW2ldLAorCQkJCQkJCQlzdGF0dXMpOworCQkJCSovCiAJCQkJaWYgKHN0YXR1cyAmIFVBUlRfTVNSX1RFUkkpCiAJCQkJCW14dmFyX3RhYmxlW2ldLmljb3VudC5ybmcrKzsKIAkJCQlpZiAoc3RhdHVzICYgVUFSVF9NU1JfRERTUikKQEAgLTE1NzgsNzUgKzE2NDksNzYgQEAKIAlyZXR1cm4gMDsKIH0KIAotCiBzdGF0aWMgdm9pZCBteHNlcl9zdG9wcngoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKIHsKLQlzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvID0gKHN0cnVjdCBteHNlcl9zdHJ1Y3QgKikgdHR5LT5kcml2ZXJfZGF0YTsKLQkvL3Vuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KKwlzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvID0gdHR5LT5kcml2ZXJfZGF0YTsKKwkvKiB1bnNpZ25lZCBsb25nIGZsYWdzOyAqLwogCiAJaW5mby0+bGRpc2Nfc3RvcF9yeCA9IDE7CiAJaWYgKElfSVhPRkYodHR5KSkgewotCi0JCS8vTVhfTE9DSygmaW5mby0+c2xvY2spOwotCQkvLyBmb2xsb3dpbmcgYWRkIGJ5IFZpY3RvciBZdS4gMDktMDItMjAwMgorCQkvKiBNWF9MT0NLKCZpbmZvLT5zbG9jayk7ICovCisJCS8qIGZvbGxvd2luZyBhZGQgYnkgVmljdG9yIFl1LiAwOS0wMi0yMDAyICovCiAJCWlmIChpbmZvLT5Jc01veGFNdXN0Q2hpcEZsYWcpIHsKIAkJCWluZm8tPklFUiAmPSB+TU9YQV9NVVNUX1JFQ1ZfSVNSOwogCQkJb3V0YihpbmZvLT5JRVIsIGluZm8tPmJhc2UgKyBVQVJUX0lFUik7CiAJCX0gZWxzZSB7Ci0JCQkvLyBhYm92ZSBhZGQgYnkgVmljdG9yIFl1LiAwOS0wMi0yMDAyCi0KKwkJCS8qIGFib3ZlIGFkZCBieSBWaWN0b3IgWXUuIDA5LTAyLTIwMDIgKi8KIAkJCWluZm8tPnhfY2hhciA9IFNUT1BfQ0hBUih0dHkpOwotCQkJLy8gICAgICBvdXRiKGluZm8tPklFUiwgMCk7IC8vIG1hc2sgYnkgVmljdG9yIFl1LiAwOS0wMi0yMDAyCisJCQkvKiBtYXNrIGJ5IFZpY3RvciBZdS4gMDktMDItMjAwMiAqLworCQkJLyogb3V0YihpbmZvLT5JRVIsIDApOyAqLwogCQkJb3V0YigwLCBpbmZvLT5iYXNlICsgVUFSVF9JRVIpOwogCQkJaW5mby0+SUVSIHw9IFVBUlRfSUVSX1RIUkk7Ci0JCQlvdXRiKGluZm8tPklFUiwgaW5mby0+YmFzZSArIFVBUlRfSUVSKTsJLyogZm9yY2UgVHggaW50ZXJydXB0ICovCi0JCX0JCS8vIGFkZCBieSBWaWN0b3IgWXUuIDA5LTAyLTIwMDIKLQkJLy9NWF9VTkxPQ0soJmluZm8tPnNsb2NrKTsKKwkJCS8qIGZvcmNlIFR4IGludGVycnVwdCAqLworCQkJb3V0YihpbmZvLT5JRVIsIGluZm8tPmJhc2UgKyBVQVJUX0lFUik7CisJCX0JCS8qIGFkZCBieSBWaWN0b3IgWXUuIDA5LTAyLTIwMDIgKi8KKwkJLyogTVhfVU5MT0NLKCZpbmZvLT5zbG9jayk7ICovCiAJfQogCiAJaWYgKGluZm8tPnR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpIHsKLQkJLy9NWF9MT0NLKCZpbmZvLT5zbG9jayk7CisJCS8qIE1YX0xPQ0soJmluZm8tPnNsb2NrKTsgKi8KIAkJaW5mby0+TUNSICY9IH5VQVJUX01DUl9SVFM7CiAJCW91dGIoaW5mby0+TUNSLCBpbmZvLT5iYXNlICsgVUFSVF9NQ1IpOwotCQkvL01YX1VOTE9DSygmaW5mby0+c2xvY2spOworCQkvKiBNWF9VTkxPQ0soJmluZm8tPnNsb2NrKTsgKi8KIAl9CiB9CiAKIHN0YXRpYyB2b2lkIG14c2VyX3N0YXJ0cngoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKIHsKLQlzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvID0gKHN0cnVjdCBteHNlcl9zdHJ1Y3QgKikgdHR5LT5kcml2ZXJfZGF0YTsKLQkvL3Vuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbyA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJLyogdW5zaWduZWQgbG9uZyBmbGFnczsgKi8KIAogCWluZm8tPmxkaXNjX3N0b3BfcnggPSAwOwogCWlmIChJX0lYT0ZGKHR0eSkpIHsKIAkJaWYgKGluZm8tPnhfY2hhcikKIAkJCWluZm8tPnhfY2hhciA9IDA7CiAJCWVsc2UgewotCQkJLy9NWF9MT0NLKCZpbmZvLT5zbG9jayk7CisJCQkvKiBNWF9MT0NLKCZpbmZvLT5zbG9jayk7ICovCiAKLQkJCS8vIGZvbGxvd2luZyBhZGQgYnkgVmljdG9yIFl1LiAwOS0wMi0yMDAyCisJCQkvKiBmb2xsb3dpbmcgYWRkIGJ5IFZpY3RvciBZdS4gMDktMDItMjAwMiAqLwogCQkJaWYgKGluZm8tPklzTW94YU11c3RDaGlwRmxhZykgewogCQkJCWluZm8tPklFUiB8PSBNT1hBX01VU1RfUkVDVl9JU1I7CiAJCQkJb3V0YihpbmZvLT5JRVIsIGluZm8tPmJhc2UgKyBVQVJUX0lFUik7CiAJCQl9IGVsc2UgewotCQkJCS8vIGFib3ZlIGFkZCBieSBWaWN0b3IgWXUuIDA5LTAyLTIwMDIKKwkJCQkvKiBhYm92ZSBhZGQgYnkgVmljdG9yIFl1LiAwOS0wMi0yMDAyICovCiAKIAkJCQlpbmZvLT54X2NoYXIgPSBTVEFSVF9DSEFSKHR0eSk7Ci0JCQkJLy8gICAgICAgICAgb3V0YihpbmZvLT5JRVIsIDApOyAvLyBtYXNrIGJ5IFZpY3RvciBZdS4gMDktMDItMjAwMgotCQkJCW91dGIoMCwgaW5mby0+YmFzZSArIFVBUlRfSUVSKTsJLy8gYWRkIGJ5IFZpY3RvciBZdS4gMDktMDItMjAwMgotCQkJCWluZm8tPklFUiB8PSBVQVJUX0lFUl9USFJJOwkvKiBmb3JjZSBUeCBpbnRlcnJ1cHQgKi8KKwkJCQkvKiBtYXNrIGJ5IFZpY3RvciBZdS4gMDktMDItMjAwMiAqLworCQkJCS8qIG91dGIoaW5mby0+SUVSLCAwKTsgKi8KKwkJCQkvKiBhZGQgYnkgVmljdG9yIFl1LiAwOS0wMi0yMDAyICovCisJCQkJb3V0YigwLCBpbmZvLT5iYXNlICsgVUFSVF9JRVIpOworCQkJCS8qIGZvcmNlIFR4IGludGVycnVwdCAqLworCQkJCWluZm8tPklFUiB8PSBVQVJUX0lFUl9USFJJOwogCQkJCW91dGIoaW5mby0+SUVSLCBpbmZvLT5iYXNlICsgVUFSVF9JRVIpOwotCQkJfQkvLyBhZGQgYnkgVmljdG9yIFl1LiAwOS0wMi0yMDAyCi0JCQkvL01YX1VOTE9DSygmaW5mby0+c2xvY2spOworCQkJfQkvKiBhZGQgYnkgVmljdG9yIFl1LiAwOS0wMi0yMDAyICovCisJCQkvKiBNWF9VTkxPQ0soJmluZm8tPnNsb2NrKTsgKi8KIAkJfQogCX0KIAogCWlmIChpbmZvLT50dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSB7Ci0JCS8vTVhfTE9DSygmaW5mby0+c2xvY2spOworCQkvKiBNWF9MT0NLKCZpbmZvLT5zbG9jayk7ICovCiAJCWluZm8tPk1DUiB8PSBVQVJUX01DUl9SVFM7CiAJCW91dGIoaW5mby0+TUNSLCBpbmZvLT5iYXNlICsgVUFSVF9NQ1IpOwotCQkvL01YX1VOTE9DSygmaW5mby0+c2xvY2spOworCQkvKiBNWF9VTkxPQ0soJmluZm8tPnNsb2NrKTsgKi8KIAl9CiB9CiAKQEAgLTE2NTYsNDggKzE3MjgsNTMgQEAKICAqLwogc3RhdGljIHZvaWQgbXhzZXJfdGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKIHsKLQkvL3N0cnVjdCBteHNlcl9zdHJ1Y3QgKmluZm8gPSAoc3RydWN0IG14c2VyX3N0cnVjdCAqKXR0eS0+ZHJpdmVyX2RhdGE7Ci0JLy91bnNpZ25lZCBsb25nIGZsYWdzOwotCS8vTVhfTE9DSygmaW5mby0+c2xvY2spOworCS8qIHN0cnVjdCBteHNlcl9zdHJ1Y3QgKmluZm8gPSB0dHktPmRyaXZlcl9kYXRhOyAqLworCS8qIHVuc2lnbmVkIGxvbmcgZmxhZ3M7ICovCisKKwkvKiBNWF9MT0NLKCZpbmZvLT5zbG9jayk7ICovCiAJbXhzZXJfc3RvcHJ4KHR0eSk7Ci0JLy9NWF9VTkxPQ0soJmluZm8tPnNsb2NrKTsKKwkvKiBNWF9VTkxPQ0soJmluZm8tPnNsb2NrKTsgKi8KIH0KIAogc3RhdGljIHZvaWQgbXhzZXJfdW50aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewotCS8vc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbyA9IChzdHJ1Y3QgbXhzZXJfc3RydWN0ICopdHR5LT5kcml2ZXJfZGF0YTsKLQkvL3Vuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JLy9NWF9MT0NLKCZpbmZvLT5zbG9jayk7CisJLyogc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbyA9IHR0eS0+ZHJpdmVyX2RhdGE7ICovCisJLyogdW5zaWduZWQgbG9uZyBmbGFnczsgKi8KKworCS8qIE1YX0xPQ0soJmluZm8tPnNsb2NrKTsgKi8KIAlteHNlcl9zdGFydHJ4KHR0eSk7Ci0JLy9NWF9VTkxPQ0soJmluZm8tPnNsb2NrKTsKKwkvKiBNWF9VTkxPQ0soJmluZm8tPnNsb2NrKTsgKi8KIH0KIAogc3RhdGljIHZvaWQgbXhzZXJfc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHRlcm1pb3MgKm9sZF90ZXJtaW9zKQogewotCXN0cnVjdCBteHNlcl9zdHJ1Y3QgKmluZm8gPSAoc3RydWN0IG14c2VyX3N0cnVjdCAqKSB0dHktPmRyaXZlcl9kYXRhOworCXN0cnVjdCBteHNlcl9zdHJ1Y3QgKmluZm8gPSB0dHktPmRyaXZlcl9kYXRhOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlpZiAoKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAhPSBvbGRfdGVybWlvcy0+Y19jZmxhZykgfHwgKFJFTEVWQU5UX0lGTEFHKHR0eS0+dGVybWlvcy0+Y19pZmxhZykgIT0gUkVMRVZBTlRfSUZMQUcob2xkX3Rlcm1pb3MtPmNfaWZsYWcpKSkgeworCWlmICgodHR5LT50ZXJtaW9zLT5jX2NmbGFnICE9IG9sZF90ZXJtaW9zLT5jX2NmbGFnKSB8fAorCQkJKFJFTEVWQU5UX0lGTEFHKHR0eS0+dGVybWlvcy0+Y19pZmxhZykgIT0gUkVMRVZBTlRfSUZMQUcob2xkX3Rlcm1pb3MtPmNfaWZsYWcpKSkgewogCiAJCW14c2VyX2NoYW5nZV9zcGVlZChpbmZvLCBvbGRfdGVybWlvcyk7CiAKLQkJaWYgKChvbGRfdGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpICYmICEodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykpIHsKKwkJaWYgKChvbGRfdGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpICYmCisJCQkJISh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSkgewogCQkJdHR5LT5od19zdG9wcGVkID0gMDsKIAkJCW14c2VyX3N0YXJ0KHR0eSk7CiAJCX0KIAl9CiAKIC8qIEhhbmRsZSBzdyBzdG9wcGVkICovCi0JaWYgKChvbGRfdGVybWlvcy0+Y19pZmxhZyAmIElYT04pICYmICEodHR5LT50ZXJtaW9zLT5jX2lmbGFnICYgSVhPTikpIHsKKwlpZiAoKG9sZF90ZXJtaW9zLT5jX2lmbGFnICYgSVhPTikgJiYKKwkJCSEodHR5LT50ZXJtaW9zLT5jX2lmbGFnICYgSVhPTikpIHsKIAkJdHR5LT5zdG9wcGVkID0gMDsKIAotCQkvLyBmb2xsb3dpbmcgYWRkIGJ5IFZpY3RvciBZdS4gMDktMDItMjAwMgorCQkvKiBmb2xsb3dpbmcgYWRkIGJ5IFZpY3RvciBZdS4gMDktMDItMjAwMiAqLwogCQlpZiAoaW5mby0+SXNNb3hhTXVzdENoaXBGbGFnKSB7CiAJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKIAkJCURJU0FCTEVfTU9YQV9NVVNUX1JYX1NPRlRXQVJFX0ZMT1dfQ09OVFJPTChpbmZvLT5iYXNlKTsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CiAJCX0KLQkJLy8gYWJvdmUgYWRkIGJ5IFZpY3RvciBZdS4gMDktMDItMjAwMgorCQkvKiBhYm92ZSBhZGQgYnkgVmljdG9yIFl1LiAwOS0wMi0yMDAyICovCiAKIAkJbXhzZXJfc3RhcnQodHR5KTsKIAl9CkBAIC0xNzExLDcgKzE3ODgsNyBAQAogICovCiBzdGF0aWMgdm9pZCBteHNlcl9zdG9wKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCiB7Ci0Jc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbyA9IChzdHJ1Y3QgbXhzZXJfc3RydWN0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbyA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOwpAQCAtMTcyNCw3ICsxODAxLDcgQEAKIAogc3RhdGljIHZvaWQgbXhzZXJfc3RhcnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKIHsKLQlzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvID0gKHN0cnVjdCBteHNlcl9zdHJ1Y3QgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvID0gdHR5LT5kcml2ZXJfZGF0YTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CkBAIC0xNzQwLDcgKzE4MTcsNyBAQAogICovCiBzdGF0aWMgdm9pZCBteHNlcl93YWl0X3VudGlsX3NlbnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IHRpbWVvdXQpCiB7Ci0Jc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbyA9IChzdHJ1Y3QgbXhzZXJfc3RydWN0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbyA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJdW5zaWduZWQgbG9uZyBvcmlnX2ppZmZpZXMsIGNoYXJfdGltZTsKIAlpbnQgbHNyOwogCkBAIC0xNzc3LDcgKzE4NTQsOCBAQAogCWlmICghdGltZW91dCB8fCB0aW1lb3V0ID4gMiAqIGluZm8tPnRpbWVvdXQpCiAJCXRpbWVvdXQgPSAyICogaW5mby0+dGltZW91dDsKICNpZmRlZiBTRVJJQUxfREVCVUdfUlNfV0FJVF9VTlRJTF9TRU5UCi0JcHJpbnRrKEtFUk5fREVCVUcgIkluIHJzX3dhaXRfdW50aWxfc2VudCglZCkgY2hlY2s9JWx1Li4uIiwgdGltZW91dCwgY2hhcl90aW1lKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiSW4gcnNfd2FpdF91bnRpbF9zZW50KCVkKSBjaGVjaz0lbHUuLi4iLAorCQl0aW1lb3V0LCBjaGFyX3RpbWUpOwogCXByaW50aygiamlmZj0lbHUuLi4iLCBqaWZmaWVzKTsKICNlbmRpZgogCXdoaWxlICghKChsc3IgPSBpbmIoaW5mby0+YmFzZSArIFVBUlRfTFNSKSkgJiBVQVJUX0xTUl9URU1UKSkgewpAQCAtMTgwMyw3ICsxODgxLDcgQEAKICAqLwogdm9pZCBteHNlcl9oYW5ndXAoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKIHsKLQlzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvID0gKHN0cnVjdCBteHNlcl9zdHJ1Y3QgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvID0gdHR5LT5kcml2ZXJfZGF0YTsKIAogCW14c2VyX2ZsdXNoX2J1ZmZlcih0dHkpOwogCW14c2VyX3NodXRkb3duKGluZm8pOwpAQCAtMTgxNSwyNCArMTg5MywyNiBAQAogfQogCiAKLS8vIGFkZGVkIGJ5IEphbWVzIDAzLTEyLTIwMDQuCisvKiBhZGRlZCBieSBKYW1lcyAwMy0xMi0yMDA0LiAqLwogLyoKICAqIG14c2VyX3JzX2JyZWFrKCkgLS0tIHJvdXRpbmUgd2hpY2ggdHVybnMgdGhlIGJyZWFrIGhhbmRsaW5nIG9uIG9yIG9mZgogICovCiBzdGF0aWMgdm9pZCBteHNlcl9yc19icmVhayhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgYnJlYWtfc3RhdGUpCiB7Ci0Jc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbyA9IChzdHJ1Y3QgbXhzZXJfc3RydWN0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbyA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOwogCWlmIChicmVha19zdGF0ZSA9PSAtMSkKLQkJb3V0YihpbmIoaW5mby0+YmFzZSArIFVBUlRfTENSKSB8IFVBUlRfTENSX1NCQywgaW5mby0+YmFzZSArIFVBUlRfTENSKTsKKwkJb3V0YihpbmIoaW5mby0+YmFzZSArIFVBUlRfTENSKSB8IFVBUlRfTENSX1NCQywKKwkJCWluZm8tPmJhc2UgKyBVQVJUX0xDUik7CiAJZWxzZQotCQlvdXRiKGluYihpbmZvLT5iYXNlICsgVUFSVF9MQ1IpICYgflVBUlRfTENSX1NCQywgaW5mby0+YmFzZSArIFVBUlRfTENSKTsKKwkJb3V0YihpbmIoaW5mby0+YmFzZSArIFVBUlRfTENSKSAmIH5VQVJUX0xDUl9TQkMsCisJCQlpbmZvLT5iYXNlICsgVUFSVF9MQ1IpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CiB9CiAKLS8vIChhYm92ZSkgYWRkZWQgYnkgSmFtZXMuCisvKiAoYWJvdmUpIGFkZGVkIGJ5IEphbWVzLiAqLwogCiAKIC8qCkBAIC0xODQ4LDcgKzE5MjgsNyBAQAogCWludCBoYW5kbGVkID0gSVJRX05PTkU7CiAKIAlwb3J0ID0gTlVMTDsKLQkvL3NwaW5fbG9jaygmZ21fbG9jayk7CisJLyogc3Bpbl9sb2NrKCZnbV9sb2NrKTsgKi8KIAogCWZvciAoaSA9IDA7IGkgPCBNWFNFUl9CT0FSRFM7IGkrKykgewogCQlpZiAoZGV2X2lkID09ICYobXh2YXJfdGFibGVbaSAqIE1YU0VSX1BPUlRTX1BFUl9CT0FSRF0pKSB7CkBAIC0xODU3LDI5ICsxOTM3LDI1IEBACiAJCX0KIAl9CiAKLQlpZiAoaSA9PSBNWFNFUl9CT0FSRFMpIHsKKwlpZiAoaSA9PSBNWFNFUl9CT0FSRFMpCiAJCWdvdG8gaXJxX3N0b3A7Ci0JfQotCWlmIChwb3J0ID09IDApIHsKKwlpZiAocG9ydCA9PSAwKQogCQlnb3RvIGlycV9zdG9wOwotCX0KIAltYXggPSBteHNlcl9udW1wb3J0c1tteHNlcmNmZ1tpXS5ib2FyZF90eXBlIC0gMV07CiAJd2hpbGUgKDEpIHsKIAkJaXJxYml0cyA9IGluYihwb3J0LT52ZWN0b3IpICYgcG9ydC0+dmVjdG9ybWFzazsKLQkJaWYgKGlycWJpdHMgPT0gcG9ydC0+dmVjdG9ybWFzaykgeworCQlpZiAoaXJxYml0cyA9PSBwb3J0LT52ZWN0b3JtYXNrKQogCQkJYnJlYWs7Ci0JCX0KIAogCQloYW5kbGVkID0gSVJRX0hBTkRMRUQ7CiAJCWZvciAoaSA9IDAsIGJpdHMgPSAxOyBpIDwgbWF4OyBpKyssIGlycWJpdHMgfD0gYml0cywgYml0cyA8PD0gMSkgewotCQkJaWYgKGlycWJpdHMgPT0gcG9ydC0+dmVjdG9ybWFzaykgeworCQkJaWYgKGlycWJpdHMgPT0gcG9ydC0+dmVjdG9ybWFzaykKIAkJCQlicmVhazsKLQkJCX0KIAkJCWlmIChiaXRzICYgaXJxYml0cykKIAkJCQljb250aW51ZTsKIAkJCWluZm8gPSBwb3J0ICsgaTsKIAotCQkJLy8gZm9sbG93aW5nIGFkZCBieSBWaWN0b3IgWXUuIDA5LTEzLTIwMDIKKwkJCS8qIGZvbGxvd2luZyBhZGQgYnkgVmljdG9yIFl1LiAwOS0xMy0yMDAyICovCiAJCQlpaXIgPSBpbmIoaW5mby0+YmFzZSArIFVBUlRfSUlSKTsKIAkJCWlmIChpaXIgJiBVQVJUX0lJUl9OT19JTlQpCiAJCQkJY29udGludWU7CkBAIC0xODkwLDkgKzE5NjYsOSBAQAogCQkJCWluYihpbmZvLT5iYXNlICsgVUFSVF9NU1IpOwogCQkJCWNvbnRpbnVlOwogCQkJfQotCQkJLy8gYWJvdmUgYWRkIGJ5IFZpY3RvciBZdS4gMDktMTMtMjAwMgorCQkJLyogYWJvdmUgYWRkIGJ5IFZpY3RvciBZdS4gMDktMTMtMjAwMiAqLwogCQkJLyoKLQkJCSAgIGlmICggaW5mby0+dHR5LT5mbGlwLmNvdW50IDwgVFRZX0ZMSVBCVUZfU0laRS80ICl7CisJCQkgICBpZiAoaW5mby0+dHR5LT5mbGlwLmNvdW50IDwgVFRZX0ZMSVBCVUZfU0laRSAvIDQpIHsKIAkJCSAgIGluZm8tPklFUiB8PSBNT1hBX01VU1RfUkVDVl9JU1I7CiAJCQkgICBvdXRiKGluZm8tPklFUiwgaW5mby0+YmFzZSArIFVBUlRfSUVSKTsKIAkJCSAgIH0KQEAgLTE5MDgsMTggKzE5ODQsMTUgQEAKIAkJCSAgIHN0YXR1cyA9IGluYihpbmZvLT5iYXNlICsgVUFSVF9MU1IpICYgaW5mby0+cmVhZF9zdGF0dXNfbWFzazsKIAkJCSAqLwogCi0JCQkvLyBmb2xsb3dpbmcgYWRkIGJ5IFZpY3RvciBZdS4gMDktMDItMjAwMgorCQkJLyogZm9sbG93aW5nIGFkZCBieSBWaWN0b3IgWXUuIDA5LTAyLTIwMDIgKi8KIAkJCXN0YXR1cyA9IGluYihpbmZvLT5iYXNlICsgVUFSVF9MU1IpOwogCi0JCQlpZiAoc3RhdHVzICYgVUFSVF9MU1JfUEUpIHsKKwkJCWlmIChzdGF0dXMgJiBVQVJUX0xTUl9QRSkKIAkJCQlpbmZvLT5lcnJfc2hhZG93IHw9IE5QUElfTk9USUZZX1BBUklUWTsKLQkJCX0KLQkJCWlmIChzdGF0dXMgJiBVQVJUX0xTUl9GRSkgeworCQkJaWYgKHN0YXR1cyAmIFVBUlRfTFNSX0ZFKQogCQkJCWluZm8tPmVycl9zaGFkb3cgfD0gTlBQSV9OT1RJRllfRlJBTUlORzsKLQkJCX0KLQkJCWlmIChzdGF0dXMgJiBVQVJUX0xTUl9PRSkgeworCQkJaWYgKHN0YXR1cyAmIFVBUlRfTFNSX09FKQogCQkJCWluZm8tPmVycl9zaGFkb3cgfD0gTlBQSV9OT1RJRllfSFdfT1ZFUlJVTjsKLQkJCX0KIAkJCWlmIChzdGF0dXMgJiBVQVJUX0xTUl9CSSkKIAkJCQlpbmZvLT5lcnJfc2hhZG93IHw9IE5QUElfTk9USUZZX0JSRUFLOwogCkBAIC0xOTMwLDExICsyMDAzLDE0IEBACiAJCQkJICAgY29udGludWU7CiAJCQkJICAgfQogCQkJCSAqLwotCQkJCWlmIChpaXIgPT0gTU9YQV9NVVNUX0lJUl9HREEgfHwgaWlyID09IE1PWEFfTVVTVF9JSVJfUkRBIHx8IGlpciA9PSBNT1hBX01VU1RfSUlSX1JUTyB8fCBpaXIgPT0gTU9YQV9NVVNUX0lJUl9MU1IpCisJCQkJaWYgKGlpciA9PSBNT1hBX01VU1RfSUlSX0dEQSB8fAorCQkJCQkJaWlyID09IE1PWEFfTVVTVF9JSVJfUkRBIHx8CisJCQkJCQlpaXIgPT0gTU9YQV9NVVNUX0lJUl9SVE8gfHwKKwkJCQkJCWlpciA9PSBNT1hBX01VU1RfSUlSX0xTUikKIAkJCQkJbXhzZXJfcmVjZWl2ZV9jaGFycyhpbmZvLCAmc3RhdHVzKTsKIAogCQkJfSBlbHNlIHsKLQkJCQkvLyBhYm92ZSBhZGQgYnkgVmljdG9yIFl1LiAwOS0wMi0yMDAyCisJCQkJLyogYWJvdmUgYWRkIGJ5IFZpY3RvciBZdS4gMDktMDItMjAwMiAqLwogCiAJCQkJc3RhdHVzICY9IGluZm8tPnJlYWRfc3RhdHVzX21hc2s7CiAJCQkJaWYgKHN0YXR1cyAmIFVBUlRfTFNSX0RSKQpAQCAtMTk0NCwxMyArMjAyMCwxMyBAQAogCQkJaWYgKG1zciAmIFVBUlRfTVNSX0FOWV9ERUxUQSkgewogCQkJCW14c2VyX2NoZWNrX21vZGVtX3N0YXR1cyhpbmZvLCBtc3IpOwogCQkJfQotCQkJLy8gZm9sbG93aW5nIGFkZCBieSBWaWN0b3IgWXUuIDA5LTEzLTIwMDIKKwkJCS8qIGZvbGxvd2luZyBhZGQgYnkgVmljdG9yIFl1LiAwOS0xMy0yMDAyICovCiAJCQlpZiAoaW5mby0+SXNNb3hhTXVzdENoaXBGbGFnKSB7CiAJCQkJaWYgKChpaXIgPT0gMHgwMikgJiYgKHN0YXR1cyAmIFVBUlRfTFNSX1RIUkUpKSB7CiAJCQkJCW14c2VyX3RyYW5zbWl0X2NoYXJzKGluZm8pOwogCQkJCX0KIAkJCX0gZWxzZSB7Ci0JCQkJLy8gYWJvdmUgYWRkIGJ5IFZpY3RvciBZdS4gMDktMTMtMjAwMgorCQkJCS8qIGFib3ZlIGFkZCBieSBWaWN0b3IgWXUuIDA5LTEzLTIwMDIgKi8KIAogCQkJCWlmIChzdGF0dXMgJiBVQVJUX0xTUl9USFJFKSB7CiAvKiA4LTItOTkgYnkgV2lsbGlhbQpAQCAtMTk2Niw3ICsyMDQyLDcgQEAKIAl9CiAKICAgICAgIGlycV9zdG9wOgotCS8vc3Bpbl91bmxvY2soJmdtX2xvY2spOworCS8qIHNwaW5fdW5sb2NrKCZnbV9sb2NrKTsgKi8KIAlyZXR1cm4gaGFuZGxlZDsKIH0KIApAQCAtMTk4NCw1NiArMjA2MCw1OCBAQAogCiAJcmVjdl9yb29tID0gdHR5LT5yZWNlaXZlX3Jvb207CiAJaWYgKChyZWN2X3Jvb20gPT0gMCkgJiYgKCFpbmZvLT5sZGlzY19zdG9wX3J4KSkgewotCQkvL214c2VyX3Rocm90dGxlKHR0eSk7CisJCS8qIG14c2VyX3Rocm90dGxlKHR0eSk7ICovCiAJCW14c2VyX3N0b3ByeCh0dHkpOwotCQkvL3JldHVybjsKKwkJLyogcmV0dXJuOyAqLwogCX0KIAotCS8vIGZvbGxvd2luZyBhZGQgYnkgVmljdG9yIFl1LiAwOS0wMi0yMDAyCisJLyogZm9sbG93aW5nIGFkZCBieSBWaWN0b3IgWXUuIDA5LTAyLTIwMDIgKi8KIAlpZiAoaW5mby0+SXNNb3hhTXVzdENoaXBGbGFnICE9IE1PWEFfT1RIRVJfVUFSVCkgewogCiAJCWlmICgqc3RhdHVzICYgVUFSVF9MU1JfU1BFQ0lBTCkgewogCQkJZ290byBpbnRyX29sZDsKIAkJfQotCQkvLyBmb2xsb3dpbmcgYWRkIGJ5IFZpY3RvciBZdS4gMDItMTEtMjAwNAotCQlpZiAoaW5mby0+SXNNb3hhTXVzdENoaXBGbGFnID09IE1PWEFfTVVTVF9NVTg2MF9IV0lEICYmICgqc3RhdHVzICYgTU9YQV9NVVNUX0xTUl9SRVJSKSkKKwkJLyogZm9sbG93aW5nIGFkZCBieSBWaWN0b3IgWXUuIDAyLTExLTIwMDQgKi8KKwkJaWYgKGluZm8tPklzTW94YU11c3RDaGlwRmxhZyA9PSBNT1hBX01VU1RfTVU4NjBfSFdJRCAmJgorCQkJCSgqc3RhdHVzICYgTU9YQV9NVVNUX0xTUl9SRVJSKSkKIAkJCWdvdG8gaW50cl9vbGQ7Ci0JCS8vIGFib3ZlIGFkZCBieSBWaWN0b3IgWXUuIDAyLTE0LTIwMDQKKwkJLyogYWJvdmUgYWRkIGJ5IFZpY3RvciBZdS4gMDItMTQtMjAwNCAqLwogCQlpZiAoKnN0YXR1cyAmIE1PWEFfTVVTVF9MU1JfUkVSUikKIAkJCWdvdG8gaW50cl9vbGQ7CiAKIAkJZ2RsID0gaW5iKGluZm8tPmJhc2UgKyBNT1hBX01VU1RfR0RMX1JFR0lTVEVSKTsKIAotCQlpZiAoaW5mby0+SXNNb3hhTXVzdENoaXBGbGFnID09IE1PWEFfTVVTVF9NVTE1MF9IV0lEKQkvLyBhZGQgYnkgVmljdG9yIFl1LiAwMi0xMS0yMDA0CisJCS8qIGFkZCBieSBWaWN0b3IgWXUuIDAyLTExLTIwMDQgKi8KKwkJaWYgKGluZm8tPklzTW94YU11c3RDaGlwRmxhZyA9PSBNT1hBX01VU1RfTVUxNTBfSFdJRCkKIAkJCWdkbCAmPSBNT1hBX01VU1RfR0RMX01BU0s7CiAJCWlmIChnZGwgPj0gcmVjdl9yb29tKSB7CiAJCQlpZiAoIWluZm8tPmxkaXNjX3N0b3BfcngpIHsKLQkJCQkvL214c2VyX3Rocm90dGxlKHR0eSk7CisJCQkJLyogbXhzZXJfdGhyb3R0bGUodHR5KTsgKi8KIAkJCQlteHNlcl9zdG9wcngodHR5KTsKIAkJCX0KLQkJCS8vcmV0dXJuOworCQkJLyogcmV0dXJuOyAqLwogCQl9CiAJCXdoaWxlIChnZGwtLSkgewogCQkJY2ggPSBpbmIoaW5mby0+YmFzZSArIFVBUlRfUlgpOwogCQkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCBjaCwgMCk7CiAJCQljbnQrKzsKIAkJCS8qCi0JCQkgICBpZigoY250Pj1ISV9XQVRFUikgJiYgKGluZm8tPnN0b3Bfcng9PTApKXsKKwkJCSAgIGlmICgoY250ID49IEhJX1dBVEVSKSAmJiAoaW5mby0+c3RvcF9yeCA9PSAwKSkgewogCQkJICAgbXhzZXJfc3RvcHJ4KHR0eSk7Ci0JCQkgICBpbmZvLT5zdG9wX3J4PTE7CisJCQkgICBpbmZvLT5zdG9wX3J4ID0gMTsKIAkJCSAgIGJyZWFrOwogCQkJICAgfSAqLwogCQl9CiAJCWdvdG8gZW5kX2ludHI7CiAJfQotaW50cl9vbGQ6Ci0JLy8gYWJvdmUgYWRkIGJ5IFZpY3RvciBZdS4gMDktMDItMjAwMgorIGludHJfb2xkOgorCS8qIGFib3ZlIGFkZCBieSBWaWN0b3IgWXUuIDA5LTAyLTIwMDIgKi8KIAogCWRvIHsKIAkJaWYgKG1heC0tIDwgMCkKIAkJCWJyZWFrOwogCQkvKgotCQkgICBpZigoY250Pj1ISV9XQVRFUikgJiYgKGluZm8tPnN0b3Bfcng9PTApKXsKKwkJICAgaWYgKChjbnQgPj0gSElfV0FURVIpICYmIChpbmZvLT5zdG9wX3J4ID09IDApKSB7CiAJCSAgIG14c2VyX3N0b3ByeCh0dHkpOwogCQkgICBpbmZvLT5zdG9wX3J4PTE7CiAJCSAgIGJyZWFrOwpAQCAtMjA0MSwxMSArMjExOSwxMSBAQAogCQkgKi8KIAogCQljaCA9IGluYihpbmZvLT5iYXNlICsgVUFSVF9SWCk7Ci0JCS8vIGZvbGxvd2luZyBhZGQgYnkgVmljdG9yIFl1LiAwOS0wMi0yMDAyCisJCS8qIGZvbGxvd2luZyBhZGQgYnkgVmljdG9yIFl1LiAwOS0wMi0yMDAyICovCiAJCWlmIChpbmZvLT5Jc01veGFNdXN0Q2hpcEZsYWcgJiYgKCpzdGF0dXMgJiBVQVJUX0xTUl9PRSkgLyomJiAhKCpzdGF0dXMmVUFSVF9MU1JfRFIpICovICkKIAkJCW91dGIoMHgyMywgaW5mby0+YmFzZSArIFVBUlRfRkNSKTsKIAkJKnN0YXR1cyAmPSBpbmZvLT5yZWFkX3N0YXR1c19tYXNrOwotCQkvLyBhYm92ZSBhZGQgYnkgVmljdG9yIFl1LiAwOS0wMi0yMDAyCisJCS8qIGFib3ZlIGFkZCBieSBWaWN0b3IgWXUuIDA5LTAyLTIwMDIgKi8KIAkJaWYgKCpzdGF0dXMgJiBpbmZvLT5pZ25vcmVfc3RhdHVzX21hc2spIHsKIAkJCWlmICgrK2lnbm9yZWQgPiAxMDApCiAJCQkJYnJlYWs7CkBAIC0yMDgwLDcgKzIxNTgsNyBAQAogCQkJY250Kys7CiAJCQlpZiAoY250ID49IHJlY3Zfcm9vbSkgewogCQkJCWlmICghaW5mby0+bGRpc2Nfc3RvcF9yeCkgewotCQkJCQkvL214c2VyX3Rocm90dGxlKHR0eSk7CisJCQkJCS8qIG14c2VyX3Rocm90dGxlKHR0eSk7ICovCiAJCQkJCW14c2VyX3N0b3ByeCh0dHkpOwogCQkJCX0KIAkJCQlicmVhazsKQEAgLTIwODgsMjEgKzIxNjYsMjAgQEAKIAogCQl9CiAKLQkJLy8gZm9sbG93aW5nIGFkZCBieSBWaWN0b3IgWXUuIDA5LTAyLTIwMDIKKwkJLyogZm9sbG93aW5nIGFkZCBieSBWaWN0b3IgWXUuIDA5LTAyLTIwMDIgKi8KIAkJaWYgKGluZm8tPklzTW94YU11c3RDaGlwRmxhZykKIAkJCWJyZWFrOwotCQkvLyBhYm92ZSBhZGQgYnkgVmljdG9yIFl1LiAwOS0wMi0yMDAyCisJCS8qIGFib3ZlIGFkZCBieSBWaWN0b3IgWXUuIDA5LTAyLTIwMDIgKi8KIAogCQkvKiBtYXNrIGJ5IFZpY3RvciBZdS4gMDktMDItMjAwMgogCQkgKnN0YXR1cyA9IGluYihpbmZvLT5iYXNlICsgVUFSVF9MU1IpICYgaW5mby0+cmVhZF9zdGF0dXNfbWFzazsKIAkJICovCi0JCS8vIGZvbGxvd2luZyBhZGQgYnkgVmljdG9yIFl1LiAwOS0wMi0yMDAyCisJCS8qIGZvbGxvd2luZyBhZGQgYnkgVmljdG9yIFl1LiAwOS0wMi0yMDAyICovCiAJCSpzdGF0dXMgPSBpbmIoaW5mby0+YmFzZSArIFVBUlRfTFNSKTsKLQkJLy8gYWJvdmUgYWRkIGJ5IFZpY3RvciBZdS4gMDktMDItMjAwMgorCQkvKiBhYm92ZSBhZGQgYnkgVmljdG9yIFl1LiAwOS0wMi0yMDAyICovCiAJfSB3aGlsZSAoKnN0YXR1cyAmIFVBUlRfTFNSX0RSKTsKIAotZW5kX2ludHI6CQkvLyBhZGQgYnkgVmljdG9yIFl1LiAwOS0wMi0yMDAyCi0KK2VuZF9pbnRyOgkJLyogYWRkIGJ5IFZpY3RvciBZdS4gMDktMDItMjAwMiAqLwogCW14dmFyX2xvZy5yeGNudFtpbmZvLT5wb3J0XSArPSBjbnQ7CiAJaW5mby0+bW9uX2RhdGEucnhjbnQgKz0gY250OwogCWluZm8tPm1vbl9kYXRhLnVwX3J4Y250ICs9IGNudDsKQEAgLTIxMzcsNyArMjIxNCwxMCBAQAogCQlyZXR1cm47CiAJfQogCi0JaWYgKChpbmZvLT54bWl0X2NudCA8PSAwKSB8fCBpbmZvLT50dHktPnN0b3BwZWQgfHwgKGluZm8tPnR0eS0+aHdfc3RvcHBlZCAmJiAoaW5mby0+dHlwZSAhPSBQT1JUXzE2NTUwQSkgJiYgKCFpbmZvLT5Jc01veGFNdXN0Q2hpcEZsYWcpKSkgeworCWlmICgoaW5mby0+eG1pdF9jbnQgPD0gMCkgfHwgaW5mby0+dHR5LT5zdG9wcGVkIHx8CisJCQkoaW5mby0+dHR5LT5od19zdG9wcGVkICYmCisJCQkoaW5mby0+dHlwZSAhPSBQT1JUXzE2NTUwQSkgJiYKKwkJCSghaW5mby0+SXNNb3hhTXVzdENoaXBGbGFnKSkpIHsKIAkJaW5mby0+SUVSICY9IH5VQVJUX0lFUl9USFJJOwogCQlvdXRiKGluZm8tPklFUiwgaW5mby0+YmFzZSArIFVBUlRfSUVSKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKQEAgLTIxNDcsMTcgKzIyMjcsMTggQEAKIAljbnQgPSBpbmZvLT54bWl0X2NudDsKIAljb3VudCA9IGluZm8tPnhtaXRfZmlmb19zaXplOwogCWRvIHsKLQkJb3V0YihpbmZvLT54bWl0X2J1ZltpbmZvLT54bWl0X3RhaWwrK10sIGluZm8tPmJhc2UgKyBVQVJUX1RYKTsKKwkJb3V0YihpbmZvLT54bWl0X2J1ZltpbmZvLT54bWl0X3RhaWwrK10sCisJCQlpbmZvLT5iYXNlICsgVUFSVF9UWCk7CiAJCWluZm8tPnhtaXRfdGFpbCA9IGluZm8tPnhtaXRfdGFpbCAmIChTRVJJQUxfWE1JVF9TSVpFIC0gMSk7CiAJCWlmICgtLWluZm8tPnhtaXRfY250IDw9IDApCiAJCQlicmVhazsKIAl9IHdoaWxlICgtLWNvdW50ID4gMCk7CiAJbXh2YXJfbG9nLnR4Y250W2luZm8tPnBvcnRdICs9IChjbnQgLSBpbmZvLT54bWl0X2NudCk7CiAKLS8vIGFkZGVkIGJ5IEphbWVzIDAzLTEyLTIwMDQuCisvKiBhZGRlZCBieSBKYW1lcyAwMy0xMi0yMDA0LiAqLwogCWluZm8tPm1vbl9kYXRhLnR4Y250ICs9IChjbnQgLSBpbmZvLT54bWl0X2NudCk7CiAJaW5mby0+bW9uX2RhdGEudXBfdHhjbnQgKz0gKGNudCAtIGluZm8tPnhtaXRfY250KTsKLS8vIChhYm92ZSkgYWRkZWQgYnkgSmFtZXMuCisvKiAoYWJvdmUpIGFkZGVkIGJ5IEphbWVzLiAqLwogCiAvKiBhZGRlZCBieSBjYXNwZXIgMS8xMS8yMDAwICovCiAJaW5mby0+aWNvdW50LnR4ICs9IChjbnQgLSBpbmZvLT54bWl0X2NudCk7CkBAIC0yMTg4LDcgKzIyNjksNiBAQAogCWluZm8tPm1vbl9kYXRhLm1vZGVtX3N0YXR1cyA9IHN0YXR1czsKIAl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPmRlbHRhX21zcl93YWl0KTsKIAotCiAJaWYgKChpbmZvLT5mbGFncyAmIEFTWU5DX0NIRUNLX0NEKSAmJiAoc3RhdHVzICYgVUFSVF9NU1JfRERDRCkpIHsKIAkJaWYgKHN0YXR1cyAmIFVBUlRfTVNSX0RDRCkKIAkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+b3Blbl93YWl0KTsKQEAgLTIyMDAsNyArMjI4MCw4IEBACiAJCQlpZiAoc3RhdHVzICYgVUFSVF9NU1JfQ1RTKSB7CiAJCQkJaW5mby0+dHR5LT5od19zdG9wcGVkID0gMDsKIAotCQkJCWlmICgoaW5mby0+dHlwZSAhPSBQT1JUXzE2NTUwQSkgJiYgKCFpbmZvLT5Jc01veGFNdXN0Q2hpcEZsYWcpKSB7CisJCQkJaWYgKChpbmZvLT50eXBlICE9IFBPUlRfMTY1NTBBKSAmJgorCQkJCQkJKCFpbmZvLT5Jc01veGFNdXN0Q2hpcEZsYWcpKSB7CiAJCQkJCWluZm8tPklFUiB8PSBVQVJUX0lFUl9USFJJOwogCQkJCQlvdXRiKGluZm8tPklFUiwgaW5mby0+YmFzZSArIFVBUlRfSUVSKTsKIAkJCQl9CkBAIC0yMjA5LDcgKzIyOTAsOCBAQAogCQl9IGVsc2UgewogCQkJaWYgKCEoc3RhdHVzICYgVUFSVF9NU1JfQ1RTKSkgewogCQkJCWluZm8tPnR0eS0+aHdfc3RvcHBlZCA9IDE7Ci0JCQkJaWYgKChpbmZvLT50eXBlICE9IFBPUlRfMTY1NTBBKSAmJiAoIWluZm8tPklzTW94YU11c3RDaGlwRmxhZykpIHsKKwkJCQlpZiAoKGluZm8tPnR5cGUgIT0gUE9SVF8xNjU1MEEpICYmCisJCQkJCQkoIWluZm8tPklzTW94YU11c3RDaGlwRmxhZykpIHsKIAkJCQkJaW5mby0+SUVSICY9IH5VQVJUX0lFUl9USFJJOwogCQkJCQlvdXRiKGluZm8tPklFUiwgaW5mby0+YmFzZSArIFVBUlRfSUVSKTsKIAkJCQl9CkBAIC0yMjMxLDcgKzIzMTMsNyBAQAogCSAqLwogCWlmICgoZmlscC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHx8ICh0dHktPmZsYWdzICYgKDEgPDwgVFRZX0lPX0VSUk9SKSkpIHsKIAkJaW5mby0+ZmxhZ3MgfD0gQVNZTkNfTk9STUFMX0FDVElWRTsKLQkJcmV0dXJuICgwKTsKKwkJcmV0dXJuIDA7CiAJfQogCiAJaWYgKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENMT0NBTCkKQEAgLTIyNTQsNyArMjMzNiw4IEBACiAJaW5mby0+YmxvY2tlZF9vcGVuKys7CiAJd2hpbGUgKDEpIHsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7Ci0JCW91dGIoaW5iKGluZm8tPmJhc2UgKyBVQVJUX01DUikgfCBVQVJUX01DUl9EVFIgfCBVQVJUX01DUl9SVFMsIGluZm8tPmJhc2UgKyBVQVJUX01DUik7CisJCW91dGIoaW5iKGluZm8tPmJhc2UgKyBVQVJUX01DUikgfAorCQkJVUFSVF9NQ1JfRFRSIHwgVUFSVF9NQ1JfUlRTLCBpbmZvLT5iYXNlICsgVUFSVF9NQ1IpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOwogCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwogCQlpZiAodHR5X2h1bmdfdXBfcChmaWxwKSB8fCAhKGluZm8tPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpKSB7CkBAIC0yMjY0LDcgKzIzNDcsOSBAQAogCQkJCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsKIAkJCWJyZWFrOwogCQl9Ci0JCWlmICghKGluZm8tPmZsYWdzICYgQVNZTkNfQ0xPU0lORykgJiYgKGRvX2Nsb2NhbCB8fCAoaW5iKGluZm8tPmJhc2UgKyBVQVJUX01TUikgJiBVQVJUX01TUl9EQ0QpKSkKKwkJaWYgKCEoaW5mby0+ZmxhZ3MgJiBBU1lOQ19DTE9TSU5HKSAmJgorCQkJCShkb19jbG9jYWwgfHwKKwkJCQkoaW5iKGluZm8tPmJhc2UgKyBVQVJUX01TUikgJiBVQVJUX01TUl9EQ0QpKSkKIAkJCWJyZWFrOwogCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKIAkJCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsKQEAgLTIyNzgsMjcgKzIzNjMsMjYgQEAKIAkJaW5mby0+Y291bnQrKzsKIAlpbmZvLT5ibG9ja2VkX29wZW4tLTsKIAlpZiAocmV0dmFsKQotCQlyZXR1cm4gKHJldHZhbCk7CisJCXJldHVybiByZXR2YWw7CiAJaW5mby0+ZmxhZ3MgfD0gQVNZTkNfTk9STUFMX0FDVElWRTsKLQlyZXR1cm4gKDApOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IG14c2VyX3N0YXJ0dXAoc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbykKIHsKLQogCXVuc2lnbmVkIGxvbmcgcGFnZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJcGFnZSA9IF9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKIAlpZiAoIXBhZ2UpCi0JCXJldHVybiAoLUVOT01FTSk7CisJCXJldHVybiAtRU5PTUVNOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CiAKIAlpZiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkgewogCQlmcmVlX3BhZ2UocGFnZSk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7Ci0JCXJldHVybiAoMCk7CisJCXJldHVybiAwOwogCX0KIAogCWlmICghaW5mby0+YmFzZSB8fCAhaW5mby0+dHlwZSkgewpAQCAtMjMwNiw3ICsyMzkwLDcgQEAKIAkJCXNldF9iaXQoVFRZX0lPX0VSUk9SLCAmaW5mby0+dHR5LT5mbGFncyk7CiAJCWZyZWVfcGFnZShwYWdlKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuICgwKTsKKwkJcmV0dXJuIDA7CiAJfQogCWlmIChpbmZvLT54bWl0X2J1ZikKIAkJZnJlZV9wYWdlKHBhZ2UpOwpAQCAtMjMxOCw5ICsyNDAyLDEyIEBACiAJICogKHRoZXkgd2lsbCBiZSByZWVuYWJsZWQgaW4gbXhzZXJfY2hhbmdlX3NwZWVkKCkpCiAJICovCiAJaWYgKGluZm8tPklzTW94YU11c3RDaGlwRmxhZykKLQkJb3V0YigoVUFSVF9GQ1JfQ0xFQVJfUkNWUiB8IFVBUlRfRkNSX0NMRUFSX1hNSVQgfCBNT1hBX01VU1RfRkNSX0dEQV9NT0RFX0VOQUJMRSksIGluZm8tPmJhc2UgKyBVQVJUX0ZDUik7CisJCW91dGIoKFVBUlRfRkNSX0NMRUFSX1JDVlIgfAorCQkJVUFSVF9GQ1JfQ0xFQVJfWE1JVCB8CisJCQlNT1hBX01VU1RfRkNSX0dEQV9NT0RFX0VOQUJMRSksIGluZm8tPmJhc2UgKyBVQVJUX0ZDUik7CiAJZWxzZQotCQlvdXRiKChVQVJUX0ZDUl9DTEVBUl9SQ1ZSIHwgVUFSVF9GQ1JfQ0xFQVJfWE1JVCksIGluZm8tPmJhc2UgKyBVQVJUX0ZDUik7CisJCW91dGIoKFVBUlRfRkNSX0NMRUFSX1JDVlIgfCBVQVJUX0ZDUl9DTEVBUl9YTUlUKSwKKwkJCWluZm8tPmJhc2UgKyBVQVJUX0ZDUik7CiAKIAkvKgogCSAqIEF0IHRoaXMgcG9pbnQgdGhlcmUncyBubyB3YXkgdGhlIExTUiBjb3VsZCBzdGlsbCBiZSAweEZGOwpAQCAtMjMzMiw5ICsyNDE5LDkgQEAKIAkJaWYgKGNhcGFibGUoQ0FQX1NZU19BRE1JTikpIHsKIAkJCWlmIChpbmZvLT50dHkpCiAJCQkJc2V0X2JpdChUVFlfSU9fRVJST1IsICZpbmZvLT50dHktPmZsYWdzKTsKLQkJCXJldHVybiAoMCk7CisJCQlyZXR1cm4gMDsKIAkJfSBlbHNlCi0JCQlyZXR1cm4gKC1FTk9ERVYpOworCQkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCiAJLyoKQEAgLTIzNTYsMTIgKzI0NDMsMTIgQEAKIAkgKiBGaW5hbGx5LCBlbmFibGUgaW50ZXJydXB0cwogCSAqLwogCWluZm8tPklFUiA9IFVBUlRfSUVSX01TSSB8IFVBUlRfSUVSX1JMU0kgfCBVQVJUX0lFUl9SREk7Ci0vLyAgICAgIGluZm8tPklFUiA9IFVBUlRfSUVSX1JMU0kgfCBVQVJUX0lFUl9SREk7CisJLyogaW5mby0+SUVSID0gVUFSVF9JRVJfUkxTSSB8IFVBUlRfSUVSX1JESTsgKi8KIAotCS8vIGZvbGxvd2luZyBhZGQgYnkgVmljdG9yIFl1LiAwOC0zMC0yMDAyCisJLyogZm9sbG93aW5nIGFkZCBieSBWaWN0b3IgWXUuIDA4LTMwLTIwMDIgKi8KIAlpZiAoaW5mby0+SXNNb3hhTXVzdENoaXBGbGFnKQogCQlpbmZvLT5JRVIgfD0gTU9YQV9NVVNUX0lFUl9FR0RBSTsKLQkvLyBhYm92ZSBhZGQgYnkgVmljdG9yIFl1LiAwOC0zMC0yMDAyCisJLyogYWJvdmUgYWRkIGJ5IFZpY3RvciBZdS4gMDgtMzAtMjAwMiAqLwogCW91dGIoaW5mby0+SUVSLCBpbmZvLT5iYXNlICsgVUFSVF9JRVIpOwkvKiBlbmFibGUgaW50ZXJydXB0cyAqLwogCiAJLyoKQEAgLTIzODMsNyArMjQ3MCw3IEBACiAJbXhzZXJfY2hhbmdlX3NwZWVkKGluZm8sIE5VTEwpOwogCiAJaW5mby0+ZmxhZ3MgfD0gQVNZTkNfSU5JVElBTElaRUQ7Ci0JcmV0dXJuICgwKTsKKwlyZXR1cm4gMDsKIH0KIAogLyoKQEAgLTI0MjEsMTIgKzI1MDgsMTUgQEAKIAlvdXRiKGluZm8tPk1DUiwgaW5mby0+YmFzZSArIFVBUlRfTUNSKTsKIAogCS8qIGNsZWFyIFJ4L1R4IEZJRk8ncyAqLwotCS8vIGZvbGxvd2luZyBhZGQgYnkgVmljdG9yIFl1LiAwOC0zMC0yMDAyCisJLyogZm9sbG93aW5nIGFkZCBieSBWaWN0b3IgWXUuIDA4LTMwLTIwMDIgKi8KIAlpZiAoaW5mby0+SXNNb3hhTXVzdENoaXBGbGFnKQotCQlvdXRiKChVQVJUX0ZDUl9DTEVBUl9SQ1ZSIHwgVUFSVF9GQ1JfQ0xFQVJfWE1JVCB8IE1PWEFfTVVTVF9GQ1JfR0RBX01PREVfRU5BQkxFKSwgaW5mby0+YmFzZSArIFVBUlRfRkNSKTsKKwkJb3V0YigoVUFSVF9GQ1JfQ0xFQVJfUkNWUiB8CisJCQlVQVJUX0ZDUl9DTEVBUl9YTUlUIHwKKwkJCU1PWEFfTVVTVF9GQ1JfR0RBX01PREVfRU5BQkxFKSwgaW5mby0+YmFzZSArIFVBUlRfRkNSKTsKIAllbHNlCi0JCS8vIGFib3ZlIGFkZCBieSBWaWN0b3IgWXUuIDA4LTMwLTIwMDIKLQkJb3V0YigoVUFSVF9GQ1JfQ0xFQVJfUkNWUiB8IFVBUlRfRkNSX0NMRUFSX1hNSVQpLCBpbmZvLT5iYXNlICsgVUFSVF9GQ1IpOworCQkvKiBhYm92ZSBhZGQgYnkgVmljdG9yIFl1LiAwOC0zMC0yMDAyICovCisJCW91dGIoKFVBUlRfRkNSX0NMRUFSX1JDVlIgfCBVQVJUX0ZDUl9DTEVBUl9YTUlUKSwKKwkJCWluZm8tPmJhc2UgKyBVQVJUX0ZDUik7CiAKIAkvKiByZWFkIGRhdGEgcG9ydCB0byByZXNldCB0aGluZ3MgKi8KIAkodm9pZCkgaW5iKGluZm8tPmJhc2UgKyBVQVJUX1JYKTsKQEAgLTI0MzYsMTEgKzI1MjYsMTAgQEAKIAogCWluZm8tPmZsYWdzICY9IH5BU1lOQ19JTklUSUFMSVpFRDsKIAotCS8vIGZvbGxvd2luZyBhZGQgYnkgVmljdG9yIFl1LiAwOS0yMy0yMDAyCi0JaWYgKGluZm8tPklzTW94YU11c3RDaGlwRmxhZykgeworCS8qIGZvbGxvd2luZyBhZGQgYnkgVmljdG9yIFl1LiAwOS0yMy0yMDAyICovCisJaWYgKGluZm8tPklzTW94YU11c3RDaGlwRmxhZykKIAkJU0VUX01PWEFfTVVTVF9OT19TT0ZUV0FSRV9GTE9XX0NPTlRST0woaW5mby0+YmFzZSk7Ci0JfQotCS8vIGFib3ZlIGFkZCBieSBWaWN0b3IgWXUuIDA5LTIzLTIwMDIKKwkvKiBhYm92ZSBhZGQgYnkgVmljdG9yIFl1LiAwOS0yMy0yMDAyICovCiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOwogfQpAQCAtMjQ1NywxNCArMjU0NiwxMiBAQAogCWxvbmcgYmF1ZDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0KIAlpZiAoIWluZm8tPnR0eSB8fCAhaW5mby0+dHR5LT50ZXJtaW9zKQogCQlyZXR1cm4gcmV0OwogCWNmbGFnID0gaW5mby0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnOwogCWlmICghKGluZm8tPmJhc2UpKQogCQlyZXR1cm4gcmV0OwogCi0KICNpZm5kZWYgQjkyMTYwMAogI2RlZmluZSBCOTIxNjAwIChCNDYwODAwICsxKQogI2VuZGlmCkBAIC0yNTU5LDkgKzI2NDYsOCBAQAogCQljdmFsIHw9IDB4MDQ7CiAJaWYgKGNmbGFnICYgUEFSRU5CKQogCQljdmFsIHw9IFVBUlRfTENSX1BBUklUWTsKLQlpZiAoIShjZmxhZyAmIFBBUk9ERCkpIHsKKwlpZiAoIShjZmxhZyAmIFBBUk9ERCkpCiAJCWN2YWwgfD0gVUFSVF9MQ1JfRVBBUjsKLQl9CiAJaWYgKGNmbGFnICYgQ01TUEFSKQogCQljdmFsIHw9IFVBUlRfTENSX1NQQVI7CiAKQEAgLTI1NzQsMTMgKzI2NjAsMTIgQEAKIAkJCWZjciA9IDA7CiAJfSBlbHNlIHsKIAkJZmNyID0gVUFSVF9GQ1JfRU5BQkxFX0ZJRk87Ci0JCS8vIGZvbGxvd2luZyBhZGQgYnkgVmljdG9yIFl1LiAwOC0zMC0yMDAyCisJCS8qIGZvbGxvd2luZyBhZGQgYnkgVmljdG9yIFl1LiAwOC0zMC0yMDAyICovCiAJCWlmIChpbmZvLT5Jc01veGFNdXN0Q2hpcEZsYWcpIHsKIAkJCWZjciB8PSBNT1hBX01VU1RfRkNSX0dEQV9NT0RFX0VOQUJMRTsKIAkJCVNFVF9NT1hBX01VU1RfRklGT19WQUxVRShpbmZvKTsKIAkJfSBlbHNlIHsKLQkJCS8vIGFib3ZlIGFkZCBieSBWaWN0b3IgWXUuIDA4LTMwLTIwMDIKLQorCQkJLyogYWJvdmUgYWRkIGJ5IFZpY3RvciBZdS4gMDgtMzAtMjAwMiAqLwogCQkJc3dpdGNoIChpbmZvLT5yeF90cmlnZ2VyKSB7CiAJCQljYXNlIDE6CiAJCQkJZmNyIHw9IFVBUlRfRkNSX1RSSUdHRVJfMTsKQEAgLTI2MDYsMjIgKzI2OTEsMjQgQEAKIAkJaW5mby0+SUVSIHw9IFVBUlRfSUVSX01TSTsKIAkJaWYgKChpbmZvLT50eXBlID09IFBPUlRfMTY1NTBBKSB8fCAoaW5mby0+SXNNb3hhTXVzdENoaXBGbGFnKSkgewogCQkJaW5mby0+TUNSIHw9IFVBUlRfTUNSX0FGRTsKLQkJCS8vc3RhdHVzID0gbXhzZXJfZ2V0X21zcihpbmZvLT5iYXNlLCAwLCBpbmZvLT5wb3J0KTsKLS8qCXNhdmVfZmxhZ3MoZmxhZ3MpOworCQkJLyogc3RhdHVzID0gbXhzZXJfZ2V0X21zcihpbmZvLT5iYXNlLCAwLCBpbmZvLT5wb3J0KTsgKi8KKy8qCisJc2F2ZV9mbGFncyhmbGFncyk7CiAJY2xpKCk7CiAJc3RhdHVzID0gaW5iKGJhc2VhZGRyICsgVUFSVF9NU1IpOwotCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOyovCi0JCQkvL214c2VyX2NoZWNrX21vZGVtX3N0YXR1cyhpbmZvLCBzdGF0dXMpOworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworKi8KKwkJCS8qIG14c2VyX2NoZWNrX21vZGVtX3N0YXR1cyhpbmZvLCBzdGF0dXMpOyAqLwogCQl9IGVsc2UgewotCQkJLy9zdGF0dXMgPSBteHNlcl9nZXRfbXNyKGluZm8tPmJhc2UsIDAsIGluZm8tPnBvcnQpOwotCi0JCQkvL01YX0xPQ0soJmluZm8tPnNsb2NrKTsKKwkJCS8qIHN0YXR1cyA9IG14c2VyX2dldF9tc3IoaW5mby0+YmFzZSwgMCwgaW5mby0+cG9ydCk7ICovCisJCQkvKiBNWF9MT0NLKCZpbmZvLT5zbG9jayk7ICovCiAJCQlzdGF0dXMgPSBpbmIoaW5mby0+YmFzZSArIFVBUlRfTVNSKTsKLQkJCS8vTVhfVU5MT0NLKCZpbmZvLT5zbG9jayk7CisJCQkvKiBNWF9VTkxPQ0soJmluZm8tPnNsb2NrKTsgKi8KIAkJCWlmIChpbmZvLT50dHktPmh3X3N0b3BwZWQpIHsKIAkJCQlpZiAoc3RhdHVzICYgVUFSVF9NU1JfQ1RTKSB7CiAJCQkJCWluZm8tPnR0eS0+aHdfc3RvcHBlZCA9IDA7Ci0JCQkJCWlmICgoaW5mby0+dHlwZSAhPSBQT1JUXzE2NTUwQSkgJiYgKCFpbmZvLT5Jc01veGFNdXN0Q2hpcEZsYWcpKSB7CisJCQkJCWlmICgoaW5mby0+dHlwZSAhPSBQT1JUXzE2NTUwQSkgJiYKKwkJCQkJCQkoIWluZm8tPklzTW94YU11c3RDaGlwRmxhZykpIHsKIAkJCQkJCWluZm8tPklFUiB8PSBVQVJUX0lFUl9USFJJOwogCQkJCQkJb3V0YihpbmZvLT5JRVIsIGluZm8tPmJhc2UgKyBVQVJUX0lFUik7CiAJCQkJCX0KQEAgLTI2MzAsNyArMjcxNyw4IEBACiAJCQl9IGVsc2UgewogCQkJCWlmICghKHN0YXR1cyAmIFVBUlRfTVNSX0NUUykpIHsKIAkJCQkJaW5mby0+dHR5LT5od19zdG9wcGVkID0gMTsKLQkJCQkJaWYgKChpbmZvLT50eXBlICE9IFBPUlRfMTY1NTBBKSAmJiAoIWluZm8tPklzTW94YU11c3RDaGlwRmxhZykpIHsKKwkJCQkJaWYgKChpbmZvLT50eXBlICE9IFBPUlRfMTY1NTBBKSAmJgorCQkJCQkJCSghaW5mby0+SXNNb3hhTXVzdENoaXBGbGFnKSkgewogCQkJCQkJaW5mby0+SUVSICY9IH5VQVJUX0lFUl9USFJJOwogCQkJCQkJb3V0YihpbmZvLT5JRVIsIGluZm8tPmJhc2UgKyBVQVJUX0lFUik7CiAJCQkJCX0KQEAgLTI2NjgsMTEgKzI3NTYsMTcgQEAKIAkJICogb3ZlcnJ1bnMgdG9vLiAgKEZvciByZWFsIHJhdyBzdXBwb3J0KS4KIAkJICovCiAJCWlmIChJX0lHTlBBUihpbmZvLT50dHkpKSB7Ci0JCQlpbmZvLT5pZ25vcmVfc3RhdHVzX21hc2sgfD0gVUFSVF9MU1JfT0UgfCBVQVJUX0xTUl9QRSB8IFVBUlRfTFNSX0ZFOwotCQkJaW5mby0+cmVhZF9zdGF0dXNfbWFzayB8PSBVQVJUX0xTUl9PRSB8IFVBUlRfTFNSX1BFIHwgVUFSVF9MU1JfRkU7CisJCQlpbmZvLT5pZ25vcmVfc3RhdHVzX21hc2sgfD0KKwkJCQkJCVVBUlRfTFNSX09FIHwKKwkJCQkJCVVBUlRfTFNSX1BFIHwKKwkJCQkJCVVBUlRfTFNSX0ZFOworCQkJaW5mby0+cmVhZF9zdGF0dXNfbWFzayB8PQorCQkJCQkJVUFSVF9MU1JfT0UgfAorCQkJCQkJVUFSVF9MU1JfUEUgfAorCQkJCQkJVUFSVF9MU1JfRkU7CiAJCX0KIAl9Ci0JLy8gZm9sbG93aW5nIGFkZCBieSBWaWN0b3IgWXUuIDA5LTAyLTIwMDIKKwkvKiBmb2xsb3dpbmcgYWRkIGJ5IFZpY3RvciBZdS4gMDktMDItMjAwMiAqLwogCWlmIChpbmZvLT5Jc01veGFNdXN0Q2hpcEZsYWcpIHsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CiAJCVNFVF9NT1hBX01VU1RfWE9OMV9WQUxVRShpbmZvLT5iYXNlLCBTVEFSVF9DSEFSKGluZm8tPnR0eSkpOwpAQCAtMjY5OCw3ICsyNzkyLDcgQEAKIAkJICovCiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CiAJfQotCS8vIGFib3ZlIGFkZCBieSBWaWN0b3IgWXUuIDA5LTAyLTIwMDIKKwkvKiBhYm92ZSBhZGQgYnkgVmljdG9yIFl1LiAwOS0wMi0yMDAyICovCiAKIAogCW91dGIoZmNyLCBpbmZvLT5iYXNlICsgVUFSVF9GQ1IpOwkvKiBzZXQgZmNyICovCkBAIC0yNzI5LDEwICsyODIzLDggQEAKIAkJcXVvdCA9ICgyICogaW5mby0+YmF1ZF9iYXNlIC8gMjY5KTsKIAl9IGVsc2UgaWYgKG5ld3NwZCkgewogCQlxdW90ID0gaW5mby0+YmF1ZF9iYXNlIC8gbmV3c3BkOwotCiAJCWlmIChxdW90ID09IDApCiAJCQlxdW90ID0gMTsKLQogCX0gZWxzZSB7CiAJCXF1b3QgPSAwOwogCX0KQEAgLTI3NjUsOCArMjg1Nyw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotCi0KIC8qCiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIGZyaWVuZHMgb2YgbXhzZXJfaW9jdGwoKQpAQCAtMjc3Nyw3ICsyODY3LDcgQEAKIAlzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCB0bXA7CiAKIAlpZiAoIXJldGluZm8pCi0JCXJldHVybiAoLUVGQVVMVCk7CisJCXJldHVybiAtRUZBVUxUOwogCW1lbXNldCgmdG1wLCAwLCBzaXplb2YodG1wKSk7CiAJdG1wLnR5cGUgPSBpbmZvLT50eXBlOwogCXRtcC5saW5lID0gaW5mby0+cG9ydDsKQEAgLTI3OTEsNyArMjg4MSw3IEBACiAJdG1wLmh1YjYgPSAwOwogCWlmIChjb3B5X3RvX3VzZXIocmV0aW5mbywgJnRtcCwgc2l6ZW9mKCpyZXRpbmZvKSkpCiAJCXJldHVybiAtRUZBVUxUOwotCXJldHVybiAoMCk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgbXhzZXJfc2V0X3NlcmlhbF9pbmZvKHN0cnVjdCBteHNlcl9zdHJ1Y3QgKmluZm8sIHN0cnVjdCBzZXJpYWxfc3RydWN0IF9fdXNlciAqbmV3X2luZm8pCkBAIC0yODAxLDI5ICsyODkxLDM3IEBACiAJaW50IHJldHZhbCA9IDA7CiAKIAlpZiAoIW5ld19pbmZvIHx8ICFpbmZvLT5iYXNlKQotCQlyZXR1cm4gKC1FRkFVTFQpOworCQlyZXR1cm4gLUVGQVVMVDsKIAlpZiAoY29weV9mcm9tX3VzZXIoJm5ld19zZXJpYWwsIG5ld19pbmZvLCBzaXplb2YobmV3X3NlcmlhbCkpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCWlmICgobmV3X3NlcmlhbC5pcnEgIT0gaW5mby0+aXJxKSB8fCAobmV3X3NlcmlhbC5wb3J0ICE9IGluZm8tPmJhc2UpIHx8IChuZXdfc2VyaWFsLmN1c3RvbV9kaXZpc29yICE9IGluZm8tPmN1c3RvbV9kaXZpc29yKSB8fCAobmV3X3NlcmlhbC5iYXVkX2Jhc2UgIT0gaW5mby0+YmF1ZF9iYXNlKSkKLQkJcmV0dXJuICgtRVBFUk0pOworCWlmICgobmV3X3NlcmlhbC5pcnEgIT0gaW5mby0+aXJxKSB8fAorCQkJKG5ld19zZXJpYWwucG9ydCAhPSBpbmZvLT5iYXNlKSB8fAorCQkJKG5ld19zZXJpYWwuY3VzdG9tX2Rpdmlzb3IgIT0gaW5mby0+Y3VzdG9tX2Rpdmlzb3IpIHx8CisJCQkobmV3X3NlcmlhbC5iYXVkX2Jhc2UgIT0gaW5mby0+YmF1ZF9iYXNlKSkKKwkJcmV0dXJuIC1FUEVSTTsKIAogCWZsYWdzID0gaW5mby0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSzsKIAogCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkgewotCQlpZiAoKG5ld19zZXJpYWwuYmF1ZF9iYXNlICE9IGluZm8tPmJhdWRfYmFzZSkgfHwgKG5ld19zZXJpYWwuY2xvc2VfZGVsYXkgIT0gaW5mby0+Y2xvc2VfZGVsYXkpIHx8ICgobmV3X3NlcmlhbC5mbGFncyAmIH5BU1lOQ19VU1JfTUFTSykgIT0gKGluZm8tPmZsYWdzICYgfkFTWU5DX1VTUl9NQVNLKSkpCi0JCQlyZXR1cm4gKC1FUEVSTSk7Ci0JCWluZm8tPmZsYWdzID0gKChpbmZvLT5mbGFncyAmIH5BU1lOQ19VU1JfTUFTSykgfCAobmV3X3NlcmlhbC5mbGFncyAmIEFTWU5DX1VTUl9NQVNLKSk7CisJCWlmICgobmV3X3NlcmlhbC5iYXVkX2Jhc2UgIT0gaW5mby0+YmF1ZF9iYXNlKSB8fAorCQkJCShuZXdfc2VyaWFsLmNsb3NlX2RlbGF5ICE9IGluZm8tPmNsb3NlX2RlbGF5KSB8fAorCQkJCSgobmV3X3NlcmlhbC5mbGFncyAmIH5BU1lOQ19VU1JfTUFTSykgIT0gKGluZm8tPmZsYWdzICYgfkFTWU5DX1VTUl9NQVNLKSkpCisJCQlyZXR1cm4gLUVQRVJNOworCQlpbmZvLT5mbGFncyA9ICgoaW5mby0+ZmxhZ3MgJiB+QVNZTkNfVVNSX01BU0spIHwKKwkJCQkobmV3X3NlcmlhbC5mbGFncyAmIEFTWU5DX1VTUl9NQVNLKSk7CiAJfSBlbHNlIHsKIAkJLyoKIAkJICogT0ssIHBhc3QgdGhpcyBwb2ludCwgYWxsIHRoZSBlcnJvciBjaGVja2luZyBoYXMgYmVlbiBkb25lLgogCQkgKiBBdCB0aGlzIHBvaW50LCB3ZSBzdGFydCBtYWtpbmcgY2hhbmdlcy4uLi4uCiAJCSAqLwotCQlpbmZvLT5mbGFncyA9ICgoaW5mby0+ZmxhZ3MgJiB+QVNZTkNfRkxBR1MpIHwgKG5ld19zZXJpYWwuZmxhZ3MgJiBBU1lOQ19GTEFHUykpOworCQlpbmZvLT5mbGFncyA9ICgoaW5mby0+ZmxhZ3MgJiB+QVNZTkNfRkxBR1MpIHwKKwkJCQkobmV3X3NlcmlhbC5mbGFncyAmIEFTWU5DX0ZMQUdTKSk7CiAJCWluZm8tPmNsb3NlX2RlbGF5ID0gbmV3X3NlcmlhbC5jbG9zZV9kZWxheSAqIEhaIC8gMTAwOwogCQlpbmZvLT5jbG9zaW5nX3dhaXQgPSBuZXdfc2VyaWFsLmNsb3Npbmdfd2FpdCAqIEhaIC8gMTAwOwotCQlpbmZvLT50dHktPmxvd19sYXRlbmN5ID0gKGluZm8tPmZsYWdzICYgQVNZTkNfTE9XX0xBVEVOQ1kpID8gMSA6IDA7Ci0JCWluZm8tPnR0eS0+bG93X2xhdGVuY3kgPSAwOwkvLyhpbmZvLT5mbGFncyAmIEFTWU5DX0xPV19MQVRFTkNZKSA/IDEgOiAwOworCQlpbmZvLT50dHktPmxvd19sYXRlbmN5ID0KKwkJCQkoaW5mby0+ZmxhZ3MgJiBBU1lOQ19MT1dfTEFURU5DWSkgPyAxIDogMDsKKwkJaW5mby0+dHR5LT5sb3dfbGF0ZW5jeSA9IDA7CS8qIChpbmZvLT5mbGFncyAmIEFTWU5DX0xPV19MQVRFTkNZKSA/IDEgOiAwOyAqLwogCX0KIAogCS8qIGFkZGVkIGJ5IGNhc3BlciwgMy8xNy8yMDAwLCBmb3IgbW91c2UgKi8KQEAgLTI4MzEsNyArMjkyOSw2IEBACiAKIAlwcm9jZXNzX3R4cnhfZmlmbyhpbmZvKTsKIAotCS8qICovCiAJaWYgKGluZm8tPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpIHsKIAkJaWYgKGZsYWdzICE9IChpbmZvLT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSkgewogCQkJbXhzZXJfY2hhbmdlX3NwZWVkKGluZm8sIE5VTEwpOwpAQCAtMjgzOSw3ICsyOTM2LDcgQEAKIAl9IGVsc2UgewogCQlyZXR2YWwgPSBteHNlcl9zdGFydHVwKGluZm8pOwogCX0KLQlyZXR1cm4gKHJldHZhbCk7CisJcmV0dXJuIHJldHZhbDsKIH0KIAogLyoKQEAgLTI4NzYsMjUgKzI5NzMsMjcgQEAKIAkJcmV0dXJuOwogCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7Ci0Jb3V0YihpbmIoaW5mby0+YmFzZSArIFVBUlRfTENSKSB8IFVBUlRfTENSX1NCQywgaW5mby0+YmFzZSArIFVBUlRfTENSKTsKKwlvdXRiKGluYihpbmZvLT5iYXNlICsgVUFSVF9MQ1IpIHwgVUFSVF9MQ1JfU0JDLAorCQlpbmZvLT5iYXNlICsgVUFSVF9MQ1IpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CiAJc2NoZWR1bGVfdGltZW91dChkdXJhdGlvbik7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7Ci0Jb3V0YihpbmIoaW5mby0+YmFzZSArIFVBUlRfTENSKSAmIH5VQVJUX0xDUl9TQkMsIGluZm8tPmJhc2UgKyBVQVJUX0xDUik7CisJb3V0YihpbmIoaW5mby0+YmFzZSArIFVBUlRfTENSKSAmIH5VQVJUX0xDUl9TQkMsCisJCWluZm8tPmJhc2UgKyBVQVJUX0xDUik7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKIH0KIAogc3RhdGljIGludCBteHNlcl90aW9jbWdldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvID0gKHN0cnVjdCBteHNlcl9zdHJ1Y3QgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvID0gdHR5LT5kcml2ZXJfZGF0YTsKIAl1bnNpZ25lZCBjaGFyIGNvbnRyb2wsIHN0YXR1czsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAKIAlpZiAodHR5LT5pbmRleCA9PSBNWFNFUl9QT1JUUykKLQkJcmV0dXJuICgtRU5PSU9DVExDTUQpOworCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOwogCWlmICh0dHktPmZsYWdzICYgKDEgPDwgVFRZX0lPX0VSUk9SKSkKLQkJcmV0dXJuICgtRUlPKTsKKwkJcmV0dXJuIC1FSU87CiAKIAljb250cm9sID0gaW5mby0+TUNSOwogCkBAIC0yOTA0LDEyICszMDAzLDE2IEBACiAJCW14c2VyX2NoZWNrX21vZGVtX3N0YXR1cyhpbmZvLCBzdGF0dXMpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CiAJcmV0dXJuICgoY29udHJvbCAmIFVBUlRfTUNSX1JUUykgPyBUSU9DTV9SVFMgOiAwKSB8Ci0JICAgICgoY29udHJvbCAmIFVBUlRfTUNSX0RUUikgPyBUSU9DTV9EVFIgOiAwKSB8ICgoc3RhdHVzICYgVUFSVF9NU1JfRENEKSA/IFRJT0NNX0NBUiA6IDApIHwgKChzdGF0dXMgJiBVQVJUX01TUl9SSSkgPyBUSU9DTV9STkcgOiAwKSB8ICgoc3RhdHVzICYgVUFSVF9NU1JfRFNSKSA/IFRJT0NNX0RTUiA6IDApIHwgKChzdGF0dXMgJiBVQVJUX01TUl9DVFMpID8gVElPQ01fQ1RTIDogMCk7CisJCSAgICAoKGNvbnRyb2wgJiBVQVJUX01DUl9EVFIpID8gVElPQ01fRFRSIDogMCkgfAorCQkgICAgKChzdGF0dXMgJiBVQVJUX01TUl9EQ0QpID8gVElPQ01fQ0FSIDogMCkgfAorCQkgICAgKChzdGF0dXMgJiBVQVJUX01TUl9SSSkgPyBUSU9DTV9STkcgOiAwKSB8CisJCSAgICAoKHN0YXR1cyAmIFVBUlRfTVNSX0RTUikgPyBUSU9DTV9EU1IgOiAwKSB8CisJCSAgICAoKHN0YXR1cyAmIFVBUlRfTVNSX0NUUykgPyBUSU9DTV9DVFMgOiAwKTsKIH0KIAogc3RhdGljIGludCBteHNlcl90aW9jbXNldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IHNldCwgdW5zaWduZWQgaW50IGNsZWFyKQogewotCXN0cnVjdCBteHNlcl9zdHJ1Y3QgKmluZm8gPSAoc3RydWN0IG14c2VyX3N0cnVjdCAqKSB0dHktPmRyaXZlcl9kYXRhOworCXN0cnVjdCBteHNlcl9zdHJ1Y3QgKmluZm8gPSB0dHktPmRyaXZlcl9kYXRhOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIApAQCAtMjk2OCwzOCArMzA3MSwzNiBAQAogCQlod2NvbmYtPmJvYXJkX3R5cGUgPSBNWFNFUl9CT0FSRF9DSTEwNEo7CiAJCWh3Y29uZi0+cG9ydHMgPSA0OwogCX0gZWxzZQotCQlyZXR1cm4gKDApOworCQlyZXR1cm4gMDsKIAogCWlycSA9IDA7CiAJaWYgKGh3Y29uZi0+cG9ydHMgPT0gMikgewogCQlpcnEgPSByZWdzWzldICYgMHhGMDAwOwogCQlpcnEgPSBpcnEgfCAoaXJxID4+IDQpOwogCQlpZiAoaXJxICE9IChyZWdzWzldICYgMHhGRjAwKSkKLQkJCXJldHVybiAoTVhTRVJfRVJSX0lSUV9DT05GTElUKTsKKwkJCXJldHVybiBNWFNFUl9FUlJfSVJRX0NPTkZMSVQ7CiAJfSBlbHNlIGlmIChod2NvbmYtPnBvcnRzID09IDQpIHsKIAkJaXJxID0gcmVnc1s5XSAmIDB4RjAwMDsKIAkJaXJxID0gaXJxIHwgKGlycSA+PiA0KTsKIAkJaXJxID0gaXJxIHwgKGlycSA+PiA4KTsKIAkJaWYgKGlycSAhPSByZWdzWzldKQotCQkJcmV0dXJuIChNWFNFUl9FUlJfSVJRX0NPTkZMSVQpOworCQkJcmV0dXJuIE1YU0VSX0VSUl9JUlFfQ09ORkxJVDsKIAl9IGVsc2UgaWYgKGh3Y29uZi0+cG9ydHMgPT0gOCkgewogCQlpcnEgPSByZWdzWzldICYgMHhGMDAwOwogCQlpcnEgPSBpcnEgfCAoaXJxID4+IDQpOwogCQlpcnEgPSBpcnEgfCAoaXJxID4+IDgpOwogCQlpZiAoKGlycSAhPSByZWdzWzldKSB8fCAoaXJxICE9IHJlZ3NbMTBdKSkKLQkJCXJldHVybiAoTVhTRVJfRVJSX0lSUV9DT05GTElUKTsKKwkJCXJldHVybiBNWFNFUl9FUlJfSVJRX0NPTkZMSVQ7CiAJfQogCi0JaWYgKCFpcnEpIHsKLQkJcmV0dXJuIChNWFNFUl9FUlJfSVJRKTsKLQl9Ci0JaHdjb25mLT5pcnEgPSAoKGludCkgKGlycSAmIDB4RjAwMCkgPj4gMTIpOworCWlmICghaXJxKQorCQlyZXR1cm4gTVhTRVJfRVJSX0lSUTsKKwlod2NvbmYtPmlycSA9ICgoaW50KShpcnEgJiAweEYwMDApID4+IDEyKTsKIAlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQogCQlod2NvbmYtPmlvYWRkcltpXSA9IChpbnQpIHJlZ3NbaSArIDFdICYgMHhGRkY4OwotCWlmICgocmVnc1sxMl0gJiAweDgwKSA9PSAwKSB7Ci0JCXJldHVybiAoTVhTRVJfRVJSX1ZFQ1RPUik7Ci0JfQotCWh3Y29uZi0+dmVjdG9yID0gKGludCkgcmVnc1sxMV07CS8qIGludGVycnVwdCB2ZWN0b3IgKi8KKwlpZiAoKHJlZ3NbMTJdICYgMHg4MCkgPT0gMCkKKwkJcmV0dXJuIE1YU0VSX0VSUl9WRUNUT1I7CisJaHdjb25mLT52ZWN0b3IgPSAoaW50KXJlZ3NbMTFdOwkvKiBpbnRlcnJ1cHQgdmVjdG9yICovCiAJaWYgKGlkID09IDEpCiAJCWh3Y29uZi0+dmVjdG9yX21hc2sgPSAweDAwRkY7CiAJZWxzZQpAQCAtMzAwNywxMCArMzEwOCwxMCBAQAogCWZvciAoaSA9IDcsIGJpdHMgPSAweDAxMDA7IGkgPj0gMDsgaS0tLCBiaXRzIDw8PSAxKSB7CiAJCWlmIChyZWdzWzEyXSAmIGJpdHMpIHsKIAkJCWh3Y29uZi0+YmF1ZF9iYXNlW2ldID0gOTIxNjAwOwotCQkJaHdjb25mLT5NYXhDYW5TZXRCYXVkUmF0ZVtpXSA9IDkyMTYwMDsJLy8gYWRkIGJ5IFZpY3RvciBZdS4gMDktMDQtMjAwMgorCQkJaHdjb25mLT5NYXhDYW5TZXRCYXVkUmF0ZVtpXSA9IDkyMTYwMDsJLyogYWRkIGJ5IFZpY3RvciBZdS4gMDktMDQtMjAwMiAqLwogCQl9IGVsc2UgewogCQkJaHdjb25mLT5iYXVkX2Jhc2VbaV0gPSAxMTUyMDA7Ci0JCQlod2NvbmYtPk1heENhblNldEJhdWRSYXRlW2ldID0gMTE1MjAwOwkvLyBhZGQgYnkgVmljdG9yIFl1LiAwOS0wNC0yMDAyCisJCQlod2NvbmYtPk1heENhblNldEJhdWRSYXRlW2ldID0gMTE1MjAwOwkvKiBhZGQgYnkgVmljdG9yIFl1LiAwOS0wNC0yMDAyICovCiAJCX0KIAl9CiAJc2NyYXRjaDIgPSBpbmIoY2FwICsgVUFSVF9MQ1IpICYgKH5VQVJUX0xDUl9ETEFCKTsKQEAgLTMwMzAsNyArMzEzMSw3IEBACiAJCWh3Y29uZi0+cG9ydHMgPSA0OwogCXJlcXVlc3RfcmVnaW9uKGh3Y29uZi0+aW9hZGRyWzBdLCA4ICogaHdjb25mLT5wb3J0cywgIm14c2VyKElPKSIpOwogCXJlcXVlc3RfcmVnaW9uKGh3Y29uZi0+dmVjdG9yLCAxLCAibXhzZXIodmVjdG9yKSIpOwotCXJldHVybiAoaHdjb25mLT5wb3J0cyk7CisJcmV0dXJuIGh3Y29uZi0+cG9ydHM7CiB9CiAKICNkZWZpbmUgQ0hJUF9TSyAJMHgwMQkvKiBTZXJpYWwgRGF0YSBDbG9jayAgaW4gRXByb20gKi8KQEAgLTMwNTMsNyArMzE1NCw3IEBACiAKIAlpZCA9IG14c2VyX3Byb2dyYW1fbW9kZShwb3J0KTsKIAlpZiAoaWQgPCAwKQotCQlyZXR1cm4gKGlkKTsKKwkJcmV0dXJuIGlkOwogCWZvciAoaSA9IDA7IGkgPCAxNDsgaSsrKSB7CiAJCWsgPSAoaSAmIDB4M0YpIHwgMHgxODA7CiAJCWZvciAoaiA9IDB4MTAwOyBqID4gMDsgaiA+Pj0gMSkgewpAQCAtMzA2Niw3ICszMTY3LDcgQEAKIAkJCQlvdXRiKENISVBfQ1MgfCBDSElQX1NLLCBwb3J0KTsJLyogQT8gYml0IG9mIHJlYWQgKi8KIAkJCX0KIAkJfQotCQkodm9pZCkgaW5iKHBvcnQpOworCQkodm9pZClpbmIocG9ydCk7CiAJCXZhbHVlID0gMDsKIAkJZm9yIChrID0gMCwgaiA9IDB4ODAwMDsgayA8IDE2OyBrKyssIGogPj49IDEpIHsKIAkJCW91dGIoQ0hJUF9DUywgcG9ydCk7CkBAIC0zMDc4LDI4ICszMTc5LDMzIEBACiAJCW91dGIoMCwgcG9ydCk7CiAJfQogCW14c2VyX25vcm1hbF9tb2RlKHBvcnQpOwotCXJldHVybiAoaWQpOworCXJldHVybiBpZDsKIH0KIAogc3RhdGljIGludCBteHNlcl9wcm9ncmFtX21vZGUoaW50IHBvcnQpCiB7CiAJaW50IGlkLCBpLCBqLCBuOwotCS8vdW5zaWduZWQgbG9uZyBmbGFnczsKKwkvKiB1bnNpZ25lZCBsb25nIGZsYWdzOyAqLwogCiAJc3Bpbl9sb2NrKCZnbV9sb2NrKTsKIAlvdXRiKDAsIHBvcnQpOwogCW91dGIoMCwgcG9ydCk7CiAJb3V0YigwLCBwb3J0KTsKLQkodm9pZCkgaW5iKHBvcnQpOwotCSh2b2lkKSBpbmIocG9ydCk7CisJKHZvaWQpaW5iKHBvcnQpOworCSh2b2lkKWluYihwb3J0KTsKIAlvdXRiKDAsIHBvcnQpOwotCSh2b2lkKSBpbmIocG9ydCk7Ci0JLy9yZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKwkodm9pZClpbmIocG9ydCk7CisJLyogcmVzdG9yZV9mbGFncyhmbGFncyk7ICovCiAJc3Bpbl91bmxvY2soJmdtX2xvY2spOwogCiAJaWQgPSBpbmIocG9ydCArIDEpICYgMHgxRjsKLQlpZiAoKGlkICE9IEMxNjhfQVNJQ19JRCkgJiYgKGlkICE9IEMxMDRfQVNJQ19JRCkgJiYgKGlkICE9IEMxMDJfQVNJQ19JRCkgJiYgKGlkICE9IENJMTMyX0FTSUNfSUQpICYmIChpZCAhPSBDSTEzNF9BU0lDX0lEKSAmJiAoaWQgIT0gQ0kxMDRKX0FTSUNfSUQpKQotCQlyZXR1cm4gKC0xKTsKKwlpZiAoKGlkICE9IEMxNjhfQVNJQ19JRCkgJiYKKwkJCShpZCAhPSBDMTA0X0FTSUNfSUQpICYmCisJCQkoaWQgIT0gQzEwMl9BU0lDX0lEKSAmJgorCQkJKGlkICE9IENJMTMyX0FTSUNfSUQpICYmCisJCQkoaWQgIT0gQ0kxMzRfQVNJQ19JRCkgJiYKKwkJCShpZCAhPSBDSTEwNEpfQVNJQ19JRCkpCisJCXJldHVybiAtMTsKIAlmb3IgKGkgPSAwLCBqID0gMDsgaSA8IDQ7IGkrKykgewogCQluID0gaW5iKHBvcnQgKyAyKTsKIAkJaWYgKG4gPT0gJ00nKSB7CkBAIC0zMTEyLDcgKzMyMTgsNyBAQAogCX0KIAlpZiAoaiAhPSAyKQogCQlpZCA9IC0yOwotCXJldHVybiAoaWQpOworCXJldHVybiBpZDsKIH0KIAogc3RhdGljIHZvaWQgbXhzZXJfbm9ybWFsX21vZGUoaW50IHBvcnQpCkBAIC0zMTMwLDcgKzMyMzYsNyBAQAogCQlpZiAoKG4gJiAweDYxKSA9PSAweDYwKQogCQkJYnJlYWs7CiAJCWlmICgobiAmIDEpID09IDEpCi0JCQkodm9pZCkgaW5iKHBvcnQpOworCQkJKHZvaWQpaW5iKHBvcnQpOwogCX0KIAlvdXRiKDB4MDAsIHBvcnQgKyA0KTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9uX3IzOTY0LmMgYi9kcml2ZXJzL2NoYXIvbl9yMzk2NC5jCmluZGV4IGM0OGRlMDkuLjIwM2RjMmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9uX3IzOTY0LmMKKysrIGIvZHJpdmVycy9jaGFyL25fcjM5NjQuYwpAQCAtOTUxLDcgKzk1MSw4IEBACiAgICB7CiBxdWV1ZV90aGVfbWVzc2FnZToKIAotICAgICAgcE1zZyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCByMzk2NF9tZXNzYWdlKSwgR0ZQX0tFUk5FTCk7CisgICAgICBwTXNnID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHIzOTY0X21lc3NhZ2UpLAorCQkgICAgIGVycm9yX2NvZGU/R0ZQX0FUT01JQzpHRlBfS0VSTkVMKTsKICAgICAgIFRSQUNFX00oImFkZF9tc2cgLSBrbWFsbG9jICVwIixwTXNnKTsKICAgICAgIGlmKHBNc2c9PU5VTEwpIHsKICAgICAgICAgIHJldHVybjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9wY21jaWEvc3luY2xpbmtfY3MuYyBiL2RyaXZlcnMvY2hhci9wY21jaWEvc3luY2xpbmtfY3MuYwppbmRleCAwYzE0MWMyLi4xN2JjOGFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvcGNtY2lhL3N5bmNsaW5rX2NzLmMKKysrIGIvZHJpdmVycy9jaGFyL3BjbWNpYS9zeW5jbGlua19jcy5jCkBAIC0xNTgyLDcgKzE1ODIsNyBAQAogCWlmIChtZ3NscGNfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAibWdzbHBjX3B1dF9jaGFyIikpCiAJCXJldHVybjsKIAotCWlmICghdHR5IHx8ICFpbmZvLT50eF9idWYpCisJaWYgKCFpbmZvLT50eF9idWYpCiAJCXJldHVybjsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKQEAgLTE2NDksNyArMTY0OSw3IEBACiAJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSxjb3VudCk7CiAJCiAJaWYgKG1nc2xwY19wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJtZ3NscGNfd3JpdGUiKSB8fAotCSAgICAhdHR5IHx8ICFpbmZvLT50eF9idWYpCisJCSFpbmZvLT50eF9idWYpCiAJCWdvdG8gY2xlYW51cDsKIAogCWlmIChpbmZvLT5wYXJhbXMubW9kZSA9PSBNR1NMX01PREVfSERMQykgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9yaW9pbnRyLmMgYi9kcml2ZXJzL2NoYXIvcmlvL3Jpb2ludHIuYwppbmRleCBlZWMxZmVhLi4wYmQwOTA0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvcmlvL3Jpb2ludHIuYworKysgYi9kcml2ZXJzL2NoYXIvcmlvL3Jpb2ludHIuYwpAQCAtNTQ2LDcgKzU0Niw3IEBACiAJICoqIHJ1biBvdXQgb2Ygc3BhY2UgaXQgd2lsbCBiZSBzZXQgdG8gdGhlIG9mZnNldCBvZiB0aGUKIAkgKiogbmV4dCBieXRlIHRvIGNvcHkgZnJvbSB0aGUgcGFja2V0IGRhdGEgYXJlYS4gVGhlIHBhY2tldAogCSAqKiBsZW5ndGggZmllbGQgaXMgZGVjcmVtZW50ZWQgYnkgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0Ci0JICoqIHdlIHN1Y2Nlc2Z1bGx5IHJlbW92ZWQgZnJvbSB0aGUgcGFja2V0LiBXaGVuIHRoaXMgcmVhY2hlcworCSAqKiB3ZSBzdWNjZXNzZnVsbHkgcmVtb3ZlZCBmcm9tIHRoZSBwYWNrZXQuIFdoZW4gdGhpcyByZWFjaGVzCiAJICoqIHplcm8sIHdlIHJlc2V0IHRoZSBvZmZzZXQgcG9pbnRlciB0byBiZSB6ZXJvLCBhbmQgZnJlZQogCSAqKiB0aGUgcGFja2V0IGZyb20gdGhlIGZyb250IG9mIHRoZSBxdWV1ZS4KIAkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yb2NrZXQuYyBiL2RyaXZlcnMvY2hhci9yb2NrZXQuYwppbmRleCA3ZWRjNmE0Li4wNzA4YzUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvcm9ja2V0LmMKKysrIGIvZHJpdmVycy9jaGFyL3JvY2tldC5jCkBAIC0zMjQsMzUgKzMyNCwxNSBAQAogCQkJICBDSEFOTkVMX3QgKiBjcCwgdW5zaWduZWQgaW50IENoYW5TdGF0dXMpCiB7CiAJdW5zaWduZWQgaW50IENoYXJOU3RhdDsKLQlpbnQgVG9SZWN2LCB3UmVjdiwgc3BhY2UgPSAwLCBjb3VudDsKLQl1bnNpZ25lZCBjaGFyICpjYnVmLCAqY2hlYWQ7Ci0JY2hhciAqZmJ1ZiwgKmZoZWFkOwotCXN0cnVjdCB0dHlfbGRpc2MgKmxkOwotCi0JbGQgPSB0dHlfbGRpc2NfcmVmKHR0eSk7CisJaW50IFRvUmVjdiwgd1JlY3YsIHNwYWNlOworCXVuc2lnbmVkIGNoYXIgKmNidWY7CiAKIAlUb1JlY3YgPSBzR2V0UnhDbnQoY3ApOwotCXNwYWNlID0gdHR5LT5yZWNlaXZlX3Jvb207Ci0JaWYgKHNwYWNlID4gMiAqIFRUWV9GTElQQlVGX1NJWkUpCi0JCXNwYWNlID0gMiAqIFRUWV9GTElQQlVGX1NJWkU7Ci0JY291bnQgPSAwOwogI2lmZGVmIFJPQ0tFVF9ERUJVR19JTlRSCi0JcHJpbnRrKEtFUk5fSU5GTyAicnBfZG9fcmVjZWl2ZSglZCwgJWQpLi4uIiwgVG9SZWN2LCBzcGFjZSk7CisJcHJpbnRrKEtFUk5fSU5GTyAicnBfZG9fcmVjZWl2ZSglZCkuLi4iLCBUb1JlY3YpOwogI2VuZGlmCi0KLQkvKgotCSAqIGRldGVybWluZSBob3cgbWFueSB3ZSBjYW4gYWN0dWFsbHkgcmVhZCBpbi4gIElmIHdlIGNhbid0Ci0JICogcmVhZCBhbnkgaW4gdGhlbiB3ZSBoYXZlIGEgc29mdHdhcmUgb3ZlcnJ1biBjb25kaXRpb24uCi0JICovCi0JaWYgKFRvUmVjdiA+IHNwYWNlKQotCQlUb1JlY3YgPSBzcGFjZTsKLQotCVRvUmVjdiA9IHR0eV9wcmVwYXJlX2ZsaXBfc3RyaW5nX2ZsYWdzKHR0eSwgJmNoZWFkLCAmZmhlYWQsIFRvUmVjdik7Ci0JaWYgKFRvUmVjdiA8PSAwKQotCQlnb3RvIGRvbmU7Ci0KLQljYnVmID0gY2hlYWQ7Ci0JZmJ1ZiA9IGZoZWFkOworCWlmIChUb1JlY3YgPT0gMCkKKwkJcmV0dXJuOwogCiAJLyoKIAkgKiBpZiBzdGF0dXMgaW5kaWNhdGVzIHRoZXJlIGFyZSBlcnJvcmVkIGNoYXJhY3RlcnMgaW4gdGhlCkBAIC0zODAsNiArMzYwLDggQEAKIAkJICAgICAgIGluZm8tPnJlYWRfc3RhdHVzX21hc2spOwogI2VuZGlmCiAJCXdoaWxlIChUb1JlY3YpIHsKKwkJCWNoYXIgZmxhZzsKKwogCQkJQ2hhck5TdGF0ID0gc0luVyhzR2V0VHhSeERhdGFJTyhjcCkpOwogI2lmZGVmIFJPQ0tFVF9ERUJVR19SRUNFSVZFCiAJCQlwcmludGsoS0VSTl9JTkZPICIleC4uLiIsIENoYXJOU3RhdCk7CkBAIC0zOTIsMTcgKzM3NCwxNiBAQAogCQkJfQogCQkJQ2hhck5TdGF0ICY9IGluZm8tPnJlYWRfc3RhdHVzX21hc2s7CiAJCQlpZiAoQ2hhck5TdGF0ICYgU1RNQlJFQUtIKQotCQkJCSpmYnVmKysgPSBUVFlfQlJFQUs7CisJCQkJZmxhZyA9IFRUWV9CUkVBSzsKIAkJCWVsc2UgaWYgKENoYXJOU3RhdCAmIFNUTVBBUklUWUgpCi0JCQkJKmZidWYrKyA9IFRUWV9QQVJJVFk7CisJCQkJZmxhZyA9IFRUWV9QQVJJVFk7CiAJCQllbHNlIGlmIChDaGFyTlN0YXQgJiBTVE1GUkFNRUgpCi0JCQkJKmZidWYrKyA9IFRUWV9GUkFNRTsKKwkJCQlmbGFnID0gVFRZX0ZSQU1FOwogCQkJZWxzZSBpZiAoQ2hhck5TdGF0ICYgU1RNUkNWUk9WUkgpCi0JCQkJKmZidWYrKyA9IFRUWV9PVkVSUlVOOworCQkJCWZsYWcgPSBUVFlfT1ZFUlJVTjsKIAkJCWVsc2UKLQkJCQkqZmJ1ZisrID0gVFRZX05PUk1BTDsKLQkJCSpjYnVmKysgPSBDaGFyTlN0YXQgJiAweGZmOwotCQkJY291bnQrKzsKKwkJCQlmbGFnID0gVFRZX05PUk1BTDsKKwkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgQ2hhck5TdGF0ICYgMHhmZiwgZmxhZyk7CiAJCQlUb1JlY3YtLTsKIAkJfQogCkBAIC00MjIsMjAgKzQwMywyMyBAQAogCQkgKiBjaGFyYWN0ZXJzIGF0IHRpbWUgYnkgZG9pbmcgcmVwZWF0ZWQgd29yZCBJTwogCQkgKiB0cmFuc2Zlci4KIAkJICovCisJCXNwYWNlID0gdHR5X3ByZXBhcmVfZmxpcF9zdHJpbmcodHR5LCAmY2J1ZiwgVG9SZWN2KTsKKwkJaWYgKHNwYWNlIDwgVG9SZWN2KSB7CisjaWZkZWYgUk9DS0VUX0RFQlVHX1JFQ0VJVkUKKwkJCXByaW50ayhLRVJOX0lORk8gInJwX2RvX3JlY2VpdmU6aW5zdWZmaWNpZW50IHNwYWNlIFRvUmVjdj0lZCBzcGFjZT0lZFxuIiwgVG9SZWN2LCBzcGFjZSk7CisjZW5kaWYKKwkJCWlmIChzcGFjZSA8PSAwKQorCQkJCXJldHVybjsKKwkJCVRvUmVjdiA9IHNwYWNlOworCQl9CiAJCXdSZWN2ID0gVG9SZWN2ID4+IDE7CiAJCWlmICh3UmVjdikKIAkJCXNJblN0clcoc0dldFR4UnhEYXRhSU8oY3ApLCAodW5zaWduZWQgc2hvcnQgKikgY2J1Ziwgd1JlY3YpOwogCQlpZiAoVG9SZWN2ICYgMSkKIAkJCWNidWZbVG9SZWN2IC0gMV0gPSBzSW5CKHNHZXRUeFJ4RGF0YUlPKGNwKSk7Ci0JCW1lbXNldChmYnVmLCBUVFlfTk9STUFMLCBUb1JlY3YpOwotCQljYnVmICs9IFRvUmVjdjsKLQkJZmJ1ZiArPSBUb1JlY3Y7Ci0JCWNvdW50ICs9IFRvUmVjdjsKIAl9CiAJLyogIFB1c2ggdGhlIGRhdGEgdXAgdG8gdGhlIHR0eSBsYXllciAqLwotCWxkLT5yZWNlaXZlX2J1Zih0dHksIGNoZWFkLCBmaGVhZCwgY291bnQpOwotZG9uZToKLQl0dHlfbGRpc2NfZGVyZWYobGQpOworCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHR0eSk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvc3BlY2lhbGl4LmMgYi9kcml2ZXJzL2NoYXIvc3BlY2lhbGl4LmMKaW5kZXggNTM0M2U5Zi4uMWI1MzMwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3NwZWNpYWxpeC5jCisrKyBiL2RyaXZlcnMvY2hhci9zcGVjaWFsaXguYwpAQCAtMTY4Myw3ICsxNjgzLDcgQEAKIAogCWJwID0gcG9ydF9Cb2FyZChwb3J0KTsKIAotCWlmICghdHR5IHx8ICFwb3J0LT54bWl0X2J1ZiB8fCAhdG1wX2J1ZikgeworCWlmICghcG9ydC0+eG1pdF9idWYgfHwgIXRtcF9idWYpIHsKIAkJZnVuY19leGl0KCk7CiAJCXJldHVybiAwOwogCX0KQEAgLTE3MzMsNyArMTczMyw3IEBACiAJCXJldHVybjsKIAl9CiAJZHByaW50ayAoU1hfREVCVUdfVFgsICJjaGVjayB0dHk6ICVwICVwXG4iLCB0dHksIHBvcnQtPnhtaXRfYnVmKTsKLQlpZiAoIXR0eSB8fCAhcG9ydC0+eG1pdF9idWYpIHsKKwlpZiAoIXBvcnQtPnhtaXRfYnVmKSB7CiAJCWZ1bmNfZXhpdCgpOwogCQlyZXR1cm47CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3N5bmNsaW5rX2d0LmMgYi9kcml2ZXJzL2NoYXIvc3luY2xpbmtfZ3QuYwppbmRleCBiNGQxZjRlLi40ZTM1ZDQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvc3luY2xpbmtfZ3QuYworKysgYi9kcml2ZXJzL2NoYXIvc3luY2xpbmtfZ3QuYwpAQCAtMTAxLDYgKzEwMSw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBwY2lfdGFibGVbXSA9IHsKIAl7UENJX1ZFTkRPUl9JRF9NSUNST0dBVEUsIFNZTkNMSU5LX0dUX0RFVklDRV9JRCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCx9LAorCXtQQ0lfVkVORE9SX0lEX01JQ1JPR0FURSwgU1lOQ0xJTktfR1QyX0RFVklDRV9JRCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCx9LAogCXtQQ0lfVkVORE9SX0lEX01JQ1JPR0FURSwgU1lOQ0xJTktfR1Q0X0RFVklDRV9JRCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCx9LAogCXtQQ0lfVkVORE9SX0lEX01JQ1JPR0FURSwgU1lOQ0xJTktfQUNfREVWSUNFX0lELCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELH0sCiAJezAsfSwgLyogdGVybWluYXRlIGxpc3QgKi8KQEAgLTg3MCw3ICs4NzEsNyBAQAogCQlnb3RvIGNsZWFudXA7CiAJREJHSU5GTygoIiVzIHdyaXRlIGNvdW50PSVkXG4iLCBpbmZvLT5kZXZpY2VfbmFtZSwgY291bnQpKTsKIAotCWlmICghdHR5IHx8ICFpbmZvLT50eF9idWYpCisJaWYgKCFpbmZvLT50eF9idWYpCiAJCWdvdG8gY2xlYW51cDsKIAogCWlmIChjb3VudCA+IGluZm8tPm1heF9mcmFtZV9zaXplKSB7CkBAIC05MjQsNyArOTI1LDcgQEAKIAlpZiAoc2FuaXR5X2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgInB1dF9jaGFyIikpCiAJCXJldHVybjsKIAlEQkdJTkZPKCgiJXMgcHV0X2NoYXIoJWQpXG4iLCBpbmZvLT5kZXZpY2VfbmFtZSwgY2gpKTsKLQlpZiAoIXR0eSB8fCAhaW5mby0+dHhfYnVmKQorCWlmICghaW5mby0+dHhfYnVmKQogCQlyZXR1cm47CiAJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOwogCWlmICghaW5mby0+dHhfYWN0aXZlICYmIChpbmZvLT50eF9jb3VudCA8IGluZm8tPm1heF9mcmFtZV9zaXplKSkKQEAgLTI1MTUsNyArMjUxNiw4IEBACiAJREJHSU5GTygoIiVzIHNldF90eGlkbGUoJWQpXG4iLCBpbmZvLT5kZXZpY2VfbmFtZSwgaWRsZV9tb2RlKSk7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOwogCWluZm8tPmlkbGVfbW9kZSA9IGlkbGVfbW9kZTsKLQl0eF9zZXRfaWRsZShpbmZvKTsKKwlpZiAoaW5mby0+cGFyYW1zLm1vZGUgIT0gTUdTTF9NT0RFX0FTWU5DKQorCQl0eF9zZXRfaWRsZShpbmZvKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTMwNzYsNyArMzA3OCw3IEBACiAKIHN0YXRpYyBpbnQgYWxsb2NfdG1wX3JidWYoc3RydWN0IHNsZ3RfaW5mbyAqaW5mbykKIHsKLQlpbmZvLT50bXBfcmJ1ZiA9IGttYWxsb2MoaW5mby0+bWF4X2ZyYW1lX3NpemUsIEdGUF9LRVJORUwpOworCWluZm8tPnRtcF9yYnVmID0ga21hbGxvYyhpbmZvLT5tYXhfZnJhbWVfc2l6ZSArIDUsIEdGUF9LRVJORUwpOwogCWlmIChpbmZvLT50bXBfcmJ1ZiA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIAlyZXR1cm4gMDsKQEAgLTMyNzYsNiArMzI3OCw5IEBACiAJY2FzZSBTWU5DTElOS19HVF9ERVZJQ0VfSUQ6CiAJCWRldnN0ciA9ICJHVCI7CiAJCWJyZWFrOworCWNhc2UgU1lOQ0xJTktfR1QyX0RFVklDRV9JRDoKKwkJZGV2c3RyID0gIkdUMiI7CisJCWJyZWFrOwogCWNhc2UgU1lOQ0xJTktfR1Q0X0RFVklDRV9JRDoKIAkJZGV2c3RyID0gIkdUNCI7CiAJCWJyZWFrOwpAQCAtMzM1Myw3ICszMzU4LDkgQEAKIAlpbnQgaTsKIAlpbnQgcG9ydF9jb3VudCA9IDE7CiAKLQlpZiAocGRldi0+ZGV2aWNlID09IFNZTkNMSU5LX0dUNF9ERVZJQ0VfSUQpCisJaWYgKHBkZXYtPmRldmljZSA9PSBTWU5DTElOS19HVDJfREVWSUNFX0lEKQorCQlwb3J0X2NvdW50ID0gMjsKKwllbHNlIGlmIChwZGV2LT5kZXZpY2UgPT0gU1lOQ0xJTktfR1Q0X0RFVklDRV9JRCkKIAkJcG9ydF9jb3VudCA9IDQ7CiAKIAkvKiBhbGxvY2F0ZSBkZXZpY2UgaW5zdGFuY2VzIGZvciBhbGwgcG9ydHMgKi8KQEAgLTM5NDAsOCArMzk0Nyw2IEBACiAKIAltc2Nfc2V0X3ZjcihpbmZvKTsKIAotCXR4X3NldF9pZGxlKGluZm8pOwotCiAJLyogU0NSIChzZXJpYWwgY29udHJvbCkKIAkgKgogCSAqIDE1ICAxPXR4IHJlcSBvbiBGSUZPIGhhbGYgZW1wdHkKQEAgLTQwMTIsNyArNDAxNyw3IEBACiAJY2FzZSBIRExDX0VOQ09ESU5HX0RJRkZfQklQSEFTRV9MRVZFTDogdmFsIHw9IEJJVDEyICsgQklUMTEgKyBCSVQxMDsgYnJlYWs7CiAJfQogCi0Jc3dpdGNoIChpbmZvLT5wYXJhbXMuY3JjX3R5cGUpCisJc3dpdGNoIChpbmZvLT5wYXJhbXMuY3JjX3R5cGUgJiBIRExDX0NSQ19NQVNLKQogCXsKIAljYXNlIEhETENfQ1JDXzE2X0NDSVRUOiB2YWwgfD0gQklUOTsgYnJlYWs7CiAJY2FzZSBIRExDX0NSQ18zMl9DQ0lUVDogdmFsIHw9IEJJVDkgKyBCSVQ4OyBicmVhazsKQEAgLTQwNzMsNyArNDA3OCw3IEBACiAJY2FzZSBIRExDX0VOQ09ESU5HX0RJRkZfQklQSEFTRV9MRVZFTDogdmFsIHw9IEJJVDEyICsgQklUMTEgKyBCSVQxMDsgYnJlYWs7CiAJfQogCi0Jc3dpdGNoIChpbmZvLT5wYXJhbXMuY3JjX3R5cGUpCisJc3dpdGNoIChpbmZvLT5wYXJhbXMuY3JjX3R5cGUgJiBIRExDX0NSQ19NQVNLKQogCXsKIAljYXNlIEhETENfQ1JDXzE2X0NDSVRUOiB2YWwgfD0gQklUOTsgYnJlYWs7CiAJY2FzZSBIRExDX0NSQ18zMl9DQ0lUVDogdmFsIHw9IEJJVDkgKyBCSVQ4OyBicmVhazsKQEAgLTQxNzUsMTcgKzQxODAsMzggQEAKICAqLwogc3RhdGljIHZvaWQgdHhfc2V0X2lkbGUoc3RydWN0IHNsZ3RfaW5mbyAqaW5mbykKIHsKLQl1bnNpZ25lZCBjaGFyIHZhbCA9IDB4ZmY7CisJdW5zaWduZWQgY2hhciB2YWw7CisJdW5zaWduZWQgc2hvcnQgdGNyOwogCi0Jc3dpdGNoKGluZm8tPmlkbGVfbW9kZSkKLQl7Ci0JY2FzZSBIRExDX1RYSURMRV9GTEFHUzogICAgICAgICAgdmFsID0gMHg3ZTsgYnJlYWs7Ci0JY2FzZSBIRExDX1RYSURMRV9BTFRfWkVST1NfT05FUzogdmFsID0gMHhhYTsgYnJlYWs7Ci0JY2FzZSBIRExDX1RYSURMRV9aRVJPUzogICAgICAgICAgdmFsID0gMHgwMDsgYnJlYWs7Ci0JY2FzZSBIRExDX1RYSURMRV9PTkVTOiAgICAgICAgICAgdmFsID0gMHhmZjsgYnJlYWs7Ci0JY2FzZSBIRExDX1RYSURMRV9BTFRfTUFSS19TUEFDRTogdmFsID0gMHhhYTsgYnJlYWs7Ci0JY2FzZSBIRExDX1RYSURMRV9TUEFDRTogICAgICAgICAgdmFsID0gMHgwMDsgYnJlYWs7Ci0JY2FzZSBIRExDX1RYSURMRV9NQVJLOiAgICAgICAgICAgdmFsID0gMHhmZjsgYnJlYWs7CisJLyogaWYgcHJlYW1ibGUgZW5hYmxlZCAodGNyWzZdID09IDEpIHRoZW4gdHggaWRsZSBzaXplID0gOCBiaXRzCisJICogZWxzZSB0Y3JbNTo0XSA9IHR4IGlkbGUgc2l6ZTogMDAgPSA4IGJpdHMsIDAxID0gMTYgYml0cworCSAqLworCXRjciA9IHJkX3JlZzE2KGluZm8sIFRDUik7CisJaWYgKGluZm8tPmlkbGVfbW9kZSAmIEhETENfVFhJRExFX0NVU1RPTV8xNikgeworCQkvKiBkaXNhYmxlIHByZWFtYmxlLCBzZXQgaWRsZSBzaXplIHRvIDE2IGJpdHMgKi8KKwkJdGNyID0gKHRjciAmIH4oQklUNiArIEJJVDUpKSB8IEJJVDQ7CisJCS8qIE1TQiBvZiAxNiBiaXQgaWRsZSBzcGVjaWZpZWQgaW4gdHggcHJlYW1ibGUgcmVnaXN0ZXIgKFRQUikgKi8KKwkJd3JfcmVnOChpbmZvLCBUUFIsICh1bnNpZ25lZCBjaGFyKSgoaW5mby0+aWRsZV9tb2RlID4+IDgpICYgMHhmZikpOworCX0gZWxzZSBpZiAoISh0Y3IgJiBCSVQ2KSkgeworCQkvKiBwcmVhbWJsZSBpcyBkaXNhYmxlZCwgc2V0IGlkbGUgc2l6ZSB0byA4IGJpdHMgKi8KKwkJdGNyICY9IH4oQklUNSArIEJJVDQpOworCX0KKwl3cl9yZWcxNihpbmZvLCBUQ1IsIHRjcik7CisKKwlpZiAoaW5mby0+aWRsZV9tb2RlICYgKEhETENfVFhJRExFX0NVU1RPTV84IHwgSERMQ19UWElETEVfQ1VTVE9NXzE2KSkgeworCQkvKiBMU0Igb2YgY3VzdG9tIHR4IGlkbGUgc3BlY2lmaWVkIGluIHR4IGlkbGUgcmVnaXN0ZXIgKi8KKwkJdmFsID0gKHVuc2lnbmVkIGNoYXIpKGluZm8tPmlkbGVfbW9kZSAmIDB4ZmYpOworCX0gZWxzZSB7CisJCS8qIHN0YW5kYXJkIDggYml0IGlkbGUgcGF0dGVybnMgKi8KKwkJc3dpdGNoKGluZm8tPmlkbGVfbW9kZSkKKwkJeworCQljYXNlIEhETENfVFhJRExFX0ZMQUdTOiAgICAgICAgICB2YWwgPSAweDdlOyBicmVhazsKKwkJY2FzZSBIRExDX1RYSURMRV9BTFRfWkVST1NfT05FUzoKKwkJY2FzZSBIRExDX1RYSURMRV9BTFRfTUFSS19TUEFDRTogdmFsID0gMHhhYTsgYnJlYWs7CisJCWNhc2UgSERMQ19UWElETEVfWkVST1M6CisJCWNhc2UgSERMQ19UWElETEVfU1BBQ0U6ICAgICAgICAgIHZhbCA9IDB4MDA7IGJyZWFrOworCQlkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSAweGZmOworCQl9CiAJfQogCiAJd3JfcmVnOChpbmZvLCBUSVIsIHZhbCk7CkBAIC00MzEzLDYgKzQzMzksMTIgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSBpbmZvLT50dHk7CiAJdW5zaWduZWQgY2hhciBhZGRyX2ZpZWxkID0gMHhmZjsKKwl1bnNpZ25lZCBpbnQgY3JjX3NpemUgPSAwOworCisJc3dpdGNoIChpbmZvLT5wYXJhbXMuY3JjX3R5cGUgJiBIRExDX0NSQ19NQVNLKSB7CisJY2FzZSBIRExDX0NSQ18xNl9DQ0lUVDogY3JjX3NpemUgPSAyOyBicmVhazsKKwljYXNlIEhETENfQ1JDXzMyX0NDSVRUOiBjcmNfc2l6ZSA9IDQ7IGJyZWFrOworCX0KIAogY2hlY2tfYWdhaW46CiAKQEAgLTQzNTcsNyArNDM4OSw3IEBACiAJc3RhdHVzID0gZGVzY19zdGF0dXMoaW5mby0+cmJ1ZnNbZW5kXSk7CiAKIAkvKiBpZ25vcmUgQ1JDIGJpdCBpZiBub3QgdXNpbmcgQ1JDIChiaXQgaXMgdW5kZWZpbmVkKSAqLwotCWlmIChpbmZvLT5wYXJhbXMuY3JjX3R5cGUgPT0gSERMQ19DUkNfTk9ORSkKKwlpZiAoKGluZm8tPnBhcmFtcy5jcmNfdHlwZSAmIEhETENfQ1JDX01BU0spID09IEhETENfQ1JDX05PTkUpCiAJCXN0YXR1cyAmPSB+QklUMTsKIAogCWlmIChmcmFtZXNpemUgPT0gMCB8fApAQCAtNDM2NiwzNCArNDM5OCwzNCBAQAogCQlnb3RvIGNoZWNrX2FnYWluOwogCX0KIAotCWlmIChmcmFtZXNpemUgPCAyIHx8IHN0YXR1cyAmIChCSVQxK0JJVDApKSB7Ci0JCWlmIChmcmFtZXNpemUgPCAyIHx8IChzdGF0dXMgJiBCSVQwKSkKLQkJCWluZm8tPmljb3VudC5yeHNob3J0Kys7Ci0JCWVsc2UKLQkJCWluZm8tPmljb3VudC5yeGNyYysrOworCWlmIChmcmFtZXNpemUgPCAoMiArIGNyY19zaXplKSB8fCBzdGF0dXMgJiBCSVQwKSB7CisJCWluZm8tPmljb3VudC5yeHNob3J0Kys7CiAJCWZyYW1lc2l6ZSA9IDA7CisJfSBlbHNlIGlmIChzdGF0dXMgJiBCSVQxKSB7CisJCWluZm8tPmljb3VudC5yeGNyYysrOworCQlpZiAoIShpbmZvLT5wYXJhbXMuY3JjX3R5cGUgJiBIRExDX0NSQ19SRVRVUk5fRVgpKQorCQkJZnJhbWVzaXplID0gMDsKKwl9CiAKICNpZmRlZiBDT05GSUdfSERMQwotCQl7Ci0JCQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSBoZGxjX3N0YXRzKGluZm8tPm5ldGRldik7Ci0JCQlzdGF0cy0+cnhfZXJyb3JzKys7Ci0JCQlzdGF0cy0+cnhfZnJhbWVfZXJyb3JzKys7Ci0JCX0KLSNlbmRpZgotCX0gZWxzZSB7Ci0JCS8qIGFkanVzdCBmcmFtZSBzaXplIGZvciBDUkMsIGlmIGFueSAqLwotCQlpZiAoaW5mby0+cGFyYW1zLmNyY190eXBlID09IEhETENfQ1JDXzE2X0NDSVRUKQotCQkJZnJhbWVzaXplIC09IDI7Ci0JCWVsc2UgaWYgKGluZm8tPnBhcmFtcy5jcmNfdHlwZSA9PSBIRExDX0NSQ18zMl9DQ0lUVCkKLQkJCWZyYW1lc2l6ZSAtPSA0OworCWlmIChmcmFtZXNpemUgPT0gMCkgeworCQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSBoZGxjX3N0YXRzKGluZm8tPm5ldGRldik7CisJCXN0YXRzLT5yeF9lcnJvcnMrKzsKKwkJc3RhdHMtPnJ4X2ZyYW1lX2Vycm9ycysrOwogCX0KKyNlbmRpZgogCiAJREJHQkgoKCIlcyByeCBmcmFtZSBzdGF0dXM9JTA0WCBzaXplPSVkXG4iLAogCQlpbmZvLT5kZXZpY2VfbmFtZSwgc3RhdHVzLCBmcmFtZXNpemUpKTsKIAlEQkdEQVRBKGluZm8sIGluZm8tPnJidWZzW3N0YXJ0XS5idWYsIG1pbl90KGludCwgZnJhbWVzaXplLCBETUFCVUZTSVpFKSwgInJ4Iik7CiAKIAlpZiAoZnJhbWVzaXplKSB7Ci0JCWlmIChmcmFtZXNpemUgPiBpbmZvLT5tYXhfZnJhbWVfc2l6ZSkKKwkJaWYgKCEoaW5mby0+cGFyYW1zLmNyY190eXBlICYgSERMQ19DUkNfUkVUVVJOX0VYKSkgeworCQkJZnJhbWVzaXplIC09IGNyY19zaXplOworCQkJY3JjX3NpemUgPSAwOworCQl9CisKKwkJaWYgKGZyYW1lc2l6ZSA+IGluZm8tPm1heF9mcmFtZV9zaXplICsgY3JjX3NpemUpCiAJCQlpbmZvLT5pY291bnQucnhsb25nKys7CiAJCWVsc2UgewogCQkJLyogY29weSBkbWEgYnVmZmVyKHMpIHRvIGNvbnRpZ3VvdXMgdGVtcCBidWZmZXIgKi8KQEAgLTQ0MTMsNiArNDQ0NSwxMSBAQAogCQkJCQlpID0gMDsKIAkJCX0KIAorCQkJaWYgKGluZm8tPnBhcmFtcy5jcmNfdHlwZSAmIEhETENfQ1JDX1JFVFVSTl9FWCkgeworCQkJCSpwID0gKHN0YXR1cyAmIEJJVDEpID8gUlhfQ1JDX0VSUk9SIDogUlhfT0s7CisJCQkJZnJhbWVzaXplKys7CisJCQl9CisKICNpZmRlZiBDT05GSUdfSERMQwogCQkJaWYgKGluZm8tPm5ldGNvdW50KQogCQkJCWhkbGNkZXZfcngoaW5mbyxpbmZvLT50bXBfcmJ1ZiwgZnJhbWVzaXplKTsKQEAgLTQ2NzEsMTMgKzQ3MDgsMTMgQEAKIHN0YXRpYyBpbnQgYWRhcHRlcl90ZXN0KHN0cnVjdCBzbGd0X2luZm8gKmluZm8pCiB7CiAJREJHSU5GTygoInRlc3RpbmcgJXNcbiIsIGluZm8tPmRldmljZV9uYW1lKSk7Ci0JaWYgKChpbmZvLT5pbml0X2Vycm9yID0gcmVnaXN0ZXJfdGVzdChpbmZvKSkgPCAwKSB7CisJaWYgKHJlZ2lzdGVyX3Rlc3QoaW5mbykgPCAwKSB7CiAJCXByaW50aygicmVnaXN0ZXIgdGVzdCBmYWlsdXJlICVzIGFkZHI9JTA4WFxuIiwKIAkJCWluZm8tPmRldmljZV9uYW1lLCBpbmZvLT5waHlzX3JlZ19hZGRyKTsKLQl9IGVsc2UgaWYgKChpbmZvLT5pbml0X2Vycm9yID0gaXJxX3Rlc3QoaW5mbykpIDwgMCkgeworCX0gZWxzZSBpZiAoaXJxX3Rlc3QoaW5mbykgPCAwKSB7CiAJCXByaW50aygiSVJRIHRlc3QgZmFpbHVyZSAlcyBJUlE9JWRcbiIsCiAJCQlpbmZvLT5kZXZpY2VfbmFtZSwgaW5mby0+aXJxX2xldmVsKTsKLQl9IGVsc2UgaWYgKChpbmZvLT5pbml0X2Vycm9yID0gbG9vcGJhY2tfdGVzdChpbmZvKSkgPCAwKSB7CisJfSBlbHNlIGlmIChsb29wYmFja190ZXN0KGluZm8pIDwgMCkgewogCQlwcmludGsoImxvb3BiYWNrIHRlc3QgZmFpbHVyZSAlc1xuIiwgaW5mby0+ZGV2aWNlX25hbWUpOwogCX0KIAlyZXR1cm4gaW5mby0+aW5pdF9lcnJvcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9zeW5jbGlua21wLmMgYi9kcml2ZXJzL2NoYXIvc3luY2xpbmttcC5jCmluZGV4IDg1ODc0MDEuLjIxYmYxNWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9zeW5jbGlua21wLmMKKysrIGIvZHJpdmVycy9jaGFyL3N5bmNsaW5rbXAuYwpAQCAtOTg4LDcgKzk4OCw3IEBACiAJaWYgKHNhbml0eV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJ3cml0ZSIpKQogCQlnb3RvIGNsZWFudXA7CiAKLQlpZiAoIXR0eSB8fCAhaW5mby0+dHhfYnVmKQorCWlmICghaW5mby0+dHhfYnVmKQogCQlnb3RvIGNsZWFudXA7CiAKIAlpZiAoaW5mby0+cGFyYW1zLm1vZGUgPT0gTUdTTF9NT0RFX0hETEMpIHsKQEAgLTEwNjcsNyArMTA2Nyw3IEBACiAJaWYgKHNhbml0eV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJwdXRfY2hhciIpKQogCQlyZXR1cm47CiAKLQlpZiAoIXR0eSB8fCAhaW5mby0+dHhfYnVmKQorCWlmICghaW5mby0+dHhfYnVmKQogCQlyZXR1cm47CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdGxjbGsuYyBiL2RyaXZlcnMvY2hhci90bGNsay5jCmluZGV4IGY1OGFkN2YuLmVmNjhkMTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci90bGNsay5jCisrKyBiL2RyaXZlcnMvY2hhci90bGNsay5jCkBAIC0zNDMsNyArMzQzLDcgQEAKIAogCXZhbCA9ICh1bnNpZ25lZCBjaGFyKXRtcDsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZXZlbnRfbG9jaywgZmxhZ3MpOwotCVNFVF9QT1JUX0JJVFMoVExDTEtfUkVHMSwgMHhlZiwgdmFsIDw8IDEpOworCVNFVF9QT1JUX0JJVFMoVExDTEtfUkVHMSwgMHhkZiwgdmFsIDw8IDEpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmV2ZW50X2xvY2ssIGZsYWdzKTsKIAogCXJldHVybiBzdHJubGVuKGJ1ZiwgY291bnQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Z0LmMgYi9kcml2ZXJzL2NoYXIvdnQuYwppbmRleCA2Yzk0ODc5Li43MTRkOTVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvdnQuYworKysgYi9kcml2ZXJzL2NoYXIvdnQuYwpAQCAtOTgsNyArOTgsMjIgQEAKICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAorI2RlZmluZSBNQVhfTlJfQ09OX0RSSVZFUiAxNgogCisjZGVmaW5lIENPTl9EUklWRVJfRkxBR19NT0RVTEUgMQorI2RlZmluZSBDT05fRFJJVkVSX0ZMQUdfSU5JVCAyCisKK3N0cnVjdCBjb25fZHJpdmVyIHsKKwljb25zdCBzdHJ1Y3QgY29uc3cgKmNvbjsKKwljb25zdCBjaGFyICpkZXNjOworCXN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldjsKKwlpbnQgbm9kZTsKKwlpbnQgZmlyc3Q7CisJaW50IGxhc3Q7CisJaW50IGZsYWc7Cit9OworCitzdGF0aWMgc3RydWN0IGNvbl9kcml2ZXIgcmVnaXN0ZXJlZF9jb25fZHJpdmVyW01BWF9OUl9DT05fRFJJVkVSXTsKIGNvbnN0IHN0cnVjdCBjb25zdyAqY29uc3dpdGNocDsKIAogLyogQSBiaXRtYXAgZm9yIGNvZGVzIDwzMi4gQSBiaXQgb2YgMSBpbmRpY2F0ZXMgdGhhdCB0aGUgY29kZQpAQCAtMjU1Nyw3ICsyNTcyLDcgQEAKIHsKIAljb25zdCBjaGFyICpkaXNwbGF5X2Rlc2MgPSBOVUxMOwogCXN0cnVjdCB2Y19kYXRhICp2YzsKLQl1bnNpZ25lZCBpbnQgY3VycmNvbnMgPSAwOworCXVuc2lnbmVkIGludCBjdXJyY29ucyA9IDAsIGk7CiAKIAlhY3F1aXJlX2NvbnNvbGVfc2VtKCk7CiAKQEAgLTI1NjksNiArMjU4NCwyMiBAQAogCQlyZXR1cm4gMDsKIAl9CiAKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX05SX0NPTl9EUklWRVI7IGkrKykgeworCQlzdHJ1Y3QgY29uX2RyaXZlciAqY29uX2RyaXZlciA9ICZyZWdpc3RlcmVkX2Nvbl9kcml2ZXJbaV07CisKKwkJaWYgKGNvbl9kcml2ZXItPmNvbiA9PSBOVUxMKSB7CisJCQljb25fZHJpdmVyLT5jb24gPSBjb25zd2l0Y2hwOworCQkJY29uX2RyaXZlci0+ZGVzYyA9IGRpc3BsYXlfZGVzYzsKKwkJCWNvbl9kcml2ZXItPmZsYWcgPSBDT05fRFJJVkVSX0ZMQUdfSU5JVDsKKwkJCWNvbl9kcml2ZXItPmZpcnN0ID0gMDsKKwkJCWNvbl9kcml2ZXItPmxhc3QgPSBNQVhfTlJfQ09OU09MRVMgLSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX05SX0NPTlNPTEVTOyBpKyspCisJCWNvbl9kcml2ZXJfbWFwW2ldID0gY29uc3dpdGNocDsKKwogCWluaXRfdGltZXIoJmNvbnNvbGVfdGltZXIpOwogCWNvbnNvbGVfdGltZXIuZnVuY3Rpb24gPSBibGFua19zY3JlZW5fdDsKIAlpZiAoYmxhbmtpbnRlcnZhbCkgewpAQCAtMjY1NiwzOCArMjY4Nyw1MyBAQAogfQogCiAjaWZuZGVmIFZUX1NJTkdMRV9EUklWRVIKKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KIAotLyoKLSAqCUlmIHdlIHN1cHBvcnQgbW9yZSBjb25zb2xlIGRyaXZlcnMsIHRoaXMgZnVuY3Rpb24gaXMgdXNlZAotICoJd2hlbiBhIGRyaXZlciB3YW50cyB0byB0YWtlIG92ZXIgc29tZSBleGlzdGluZyBjb25zb2xlcwotICoJYW5kIGJlY29tZSBkZWZhdWx0IGRyaXZlciBmb3IgbmV3bHkgb3BlbmVkIG9uZXMuCi0gKi8KK3N0YXRpYyBzdHJ1Y3QgY2xhc3MgKnZ0Y29uc29sZV9jbGFzczsKIAotaW50IHRha2Vfb3Zlcl9jb25zb2xlKGNvbnN0IHN0cnVjdCBjb25zdyAqY3N3LCBpbnQgZmlyc3QsIGludCBsYXN0LCBpbnQgZGVmbHQpCitzdGF0aWMgaW50IGJpbmRfY29uX2RyaXZlcihjb25zdCBzdHJ1Y3QgY29uc3cgKmNzdywgaW50IGZpcnN0LCBpbnQgbGFzdCwKKwkJCSAgIGludCBkZWZsdCkKIHsKLQlpbnQgaSwgaiA9IC0xOwotCWNvbnN0IGNoYXIgKmRlc2M7Ci0Jc3RydWN0IG1vZHVsZSAqb3duZXI7CisJc3RydWN0IG1vZHVsZSAqb3duZXIgPSBjc3ctPm93bmVyOworCWNvbnN0IGNoYXIgKmRlc2MgPSBOVUxMOworCXN0cnVjdCBjb25fZHJpdmVyICpjb25fZHJpdmVyOworCWludCBpLCBqID0gLTEsIGsgPSAtMSwgcmV0dmFsID0gLUVOT0RFVjsKIAotCW93bmVyID0gY3N3LT5vd25lcjsKIAlpZiAoIXRyeV9tb2R1bGVfZ2V0KG93bmVyKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAlhY3F1aXJlX2NvbnNvbGVfc2VtKCk7CiAKLQlkZXNjID0gY3N3LT5jb25fc3RhcnR1cCgpOwotCWlmICghZGVzYykgewotCQlyZWxlYXNlX2NvbnNvbGVfc2VtKCk7Ci0JCW1vZHVsZV9wdXQob3duZXIpOwotCQlyZXR1cm4gLUVOT0RFVjsKKwkvKiBjaGVjayBpZiBkcml2ZXIgaXMgcmVnaXN0ZXJlZCAqLworCWZvciAoaSA9IDA7IGkgPCBNQVhfTlJfQ09OX0RSSVZFUjsgaSsrKSB7CisJCWNvbl9kcml2ZXIgPSAmcmVnaXN0ZXJlZF9jb25fZHJpdmVyW2ldOworCisJCWlmIChjb25fZHJpdmVyLT5jb24gPT0gY3N3KSB7CisJCQlkZXNjID0gY29uX2RyaXZlci0+ZGVzYzsKKwkJCXJldHZhbCA9IDA7CisJCQlicmVhazsKKwkJfQogCX0KKworCWlmIChyZXR2YWwpCisJCWdvdG8gZXJyOworCisJaWYgKCEoY29uX2RyaXZlci0+ZmxhZyAmIENPTl9EUklWRVJfRkxBR19JTklUKSkgeworCQljc3ctPmNvbl9zdGFydHVwKCk7CisJCWNvbl9kcml2ZXItPmZsYWcgfD0gQ09OX0RSSVZFUl9GTEFHX0lOSVQ7CisJfQorCiAJaWYgKGRlZmx0KSB7CiAJCWlmIChjb25zd2l0Y2hwKQogCQkJbW9kdWxlX3B1dChjb25zd2l0Y2hwLT5vd25lcik7CisKIAkJX19tb2R1bGVfZ2V0KG93bmVyKTsKIAkJY29uc3dpdGNocCA9IGNzdzsKIAl9CiAKKwlmaXJzdCA9IG1heChmaXJzdCwgY29uX2RyaXZlci0+Zmlyc3QpOworCWxhc3QgPSBtaW4obGFzdCwgY29uX2RyaXZlci0+bGFzdCk7CisKIAlmb3IgKGkgPSBmaXJzdDsgaSA8PSBsYXN0OyBpKyspIHsKIAkJaW50IG9sZF93YXNfY29sb3I7CiAJCXN0cnVjdCB2Y19kYXRhICp2YyA9IHZjX2NvbnNbaV0uZDsKQEAgLTI3MDEsMTUgKzI3NDcsMTcgQEAKIAkJCWNvbnRpbnVlOwogCiAJCWogPSBpOwotCQlpZiAoQ09OX0lTX1ZJU0lCTEUodmMpKQorCisJCWlmIChDT05fSVNfVklTSUJMRSh2YykpIHsKKwkJCWsgPSBpOwogCQkJc2F2ZV9zY3JlZW4odmMpOworCQl9CisKIAkJb2xkX3dhc19jb2xvciA9IHZjLT52Y19jYW5fZG9fY29sb3I7CiAJCXZjLT52Y19zdy0+Y29uX2RlaW5pdCh2Yyk7CiAJCXZjLT52Y19vcmlnaW4gPSAodW5zaWduZWQgbG9uZyl2Yy0+dmNfc2NyZWVuYnVmOwotCQl2Yy0+dmNfdmlzaWJsZV9vcmlnaW4gPSB2Yy0+dmNfb3JpZ2luOwotCQl2Yy0+dmNfc2NyX2VuZCA9IHZjLT52Y19vcmlnaW4gKyB2Yy0+dmNfc2NyZWVuYnVmX3NpemU7Ci0JCXZjLT52Y19wb3MgPSB2Yy0+dmNfb3JpZ2luICsgdmMtPnZjX3NpemVfcm93ICogdmMtPnZjX3kgKyAyICogdmMtPnZjX3g7CiAJCXZpc3VhbF9pbml0KHZjLCBpLCAwKTsKKwkJc2V0X29yaWdpbih2Yyk7CiAJCXVwZGF0ZV9hdHRyKHZjKTsKIAogCQkvKiBJZiB0aGUgY29uc29sZSBjaGFuZ2VkIGJldHdlZW4gbW9ubyA8LT4gY29sb3IsIHRoZW4KQEAgLTI3MTgsMzcgKzI3NjYsNTA3IEBACiAJCSAqLwogCQlpZiAob2xkX3dhc19jb2xvciAhPSB2Yy0+dmNfY2FuX2RvX2NvbG9yKQogCQkJY2xlYXJfYnVmZmVyX2F0dHJpYnV0ZXModmMpOwotCi0JCWlmIChDT05fSVNfVklTSUJMRSh2YykpCi0JCQl1cGRhdGVfc2NyZWVuKHZjKTsKIAl9CisKIAlwcmludGsoIkNvbnNvbGU6IHN3aXRjaGluZyAiKTsKIAlpZiAoIWRlZmx0KQogCQlwcmludGsoImNvbnNvbGVzICVkLSVkICIsIGZpcnN0KzEsIGxhc3QrMSk7Ci0JaWYgKGogPj0gMCkKKwlpZiAoaiA+PSAwKSB7CisJCXN0cnVjdCB2Y19kYXRhICp2YyA9IHZjX2NvbnNbal0uZDsKKwogCQlwcmludGsoInRvICVzICVzICVkeCVkXG4iLAotCQkgICAgICAgdmNfY29uc1tqXS5kLT52Y19jYW5fZG9fY29sb3IgPyAiY29sb3VyIiA6ICJtb25vIiwKLQkJICAgICAgIGRlc2MsIHZjX2NvbnNbal0uZC0+dmNfY29scywgdmNfY29uc1tqXS5kLT52Y19yb3dzKTsKLQllbHNlCisJCSAgICAgICB2Yy0+dmNfY2FuX2RvX2NvbG9yID8gImNvbG91ciIgOiAibW9ubyIsCisJCSAgICAgICBkZXNjLCB2Yy0+dmNfY29scywgdmMtPnZjX3Jvd3MpOworCisJCWlmIChrID49IDApIHsKKwkJCXZjID0gdmNfY29uc1trXS5kOworCQkJdXBkYXRlX3NjcmVlbih2Yyk7CisJCX0KKwl9IGVsc2UKIAkJcHJpbnRrKCJ0byAlc1xuIiwgZGVzYyk7CiAKKwlyZXR2YWwgPSAwOworZXJyOgogCXJlbGVhc2VfY29uc29sZV9zZW0oKTsKLQogCW1vZHVsZV9wdXQob3duZXIpOwotCXJldHVybiAwOworCXJldHVybiByZXR2YWw7Cit9OworCisjaWZkZWYgQ09ORklHX1ZUX0hXX0NPTlNPTEVfQklORElORworc3RhdGljIGludCBjb25faXNfZ3JhcGhpY3MoY29uc3Qgc3RydWN0IGNvbnN3ICpjc3csIGludCBmaXJzdCwgaW50IGxhc3QpCit7CisJaW50IGksIHJldHZhbCA9IDA7CisKKwlmb3IgKGkgPSBmaXJzdDsgaSA8PSBsYXN0OyBpKyspIHsKKwkJc3RydWN0IHZjX2RhdGEgKnZjID0gdmNfY29uc1tpXS5kOworCisJCWlmICh2YyAmJiB2Yy0+dmNfbW9kZSA9PSBLRF9HUkFQSElDUykgeworCQkJcmV0dmFsID0gMTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIHJldHZhbDsKIH0KIAotdm9pZCBnaXZlX3VwX2NvbnNvbGUoY29uc3Qgc3RydWN0IGNvbnN3ICpjc3cpCitzdGF0aWMgaW50IHVuYmluZF9jb25fZHJpdmVyKGNvbnN0IHN0cnVjdCBjb25zdyAqY3N3LCBpbnQgZmlyc3QsIGludCBsYXN0LAorCQkJICAgICBpbnQgZGVmbHQpCiB7Ci0JaW50IGk7CisJc3RydWN0IG1vZHVsZSAqb3duZXIgPSBjc3ctPm93bmVyOworCWNvbnN0IHN0cnVjdCBjb25zdyAqZGVmY3N3ID0gTlVMTDsKKwlzdHJ1Y3QgY29uX2RyaXZlciAqY29uX2RyaXZlciA9IE5VTEwsICpjb25fYmFjayA9IE5VTEw7CisJaW50IGksIHJldHZhbCA9IC1FTk9ERVY7CiAKLQlmb3IoaSA9IDA7IGkgPCBNQVhfTlJfQ09OU09MRVM7IGkrKykKKwlpZiAoIXRyeV9tb2R1bGVfZ2V0KG93bmVyKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlhY3F1aXJlX2NvbnNvbGVfc2VtKCk7CisKKwkvKiBjaGVjayBpZiBkcml2ZXIgaXMgcmVnaXN0ZXJlZCBhbmQgaWYgaXQgaXMgdW5iaW5kYWJsZSAqLworCWZvciAoaSA9IDA7IGkgPCBNQVhfTlJfQ09OX0RSSVZFUjsgaSsrKSB7CisJCWNvbl9kcml2ZXIgPSAmcmVnaXN0ZXJlZF9jb25fZHJpdmVyW2ldOworCisJCWlmIChjb25fZHJpdmVyLT5jb24gPT0gY3N3ICYmCisJCSAgICBjb25fZHJpdmVyLT5mbGFnICYgQ09OX0RSSVZFUl9GTEFHX01PRFVMRSkgeworCQkJcmV0dmFsID0gMDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKHJldHZhbCkgeworCQlyZWxlYXNlX2NvbnNvbGVfc2VtKCk7CisJCWdvdG8gZXJyOworCX0KKworCXJldHZhbCA9IC1FTk9ERVY7CisKKwkvKiBjaGVjayBpZiBiYWNrdXAgZHJpdmVyIGV4aXN0cyAqLworCWZvciAoaSA9IDA7IGkgPCBNQVhfTlJfQ09OX0RSSVZFUjsgaSsrKSB7CisJCWNvbl9iYWNrID0gJnJlZ2lzdGVyZWRfY29uX2RyaXZlcltpXTsKKworCQlpZiAoY29uX2JhY2stPmNvbiAmJgorCQkgICAgIShjb25fYmFjay0+ZmxhZyAmIENPTl9EUklWRVJfRkxBR19NT0RVTEUpKSB7CisJCQlkZWZjc3cgPSBjb25fYmFjay0+Y29uOworCQkJcmV0dmFsID0gMDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKHJldHZhbCkgeworCQlyZWxlYXNlX2NvbnNvbGVfc2VtKCk7CisJCWdvdG8gZXJyOworCX0KKworCWlmICghY29uX2lzX2JvdW5kKGNzdykpIHsKKwkJcmVsZWFzZV9jb25zb2xlX3NlbSgpOworCQlnb3RvIGVycjsKKwl9CisKKwlmaXJzdCA9IG1heChmaXJzdCwgY29uX2RyaXZlci0+Zmlyc3QpOworCWxhc3QgPSBtaW4obGFzdCwgY29uX2RyaXZlci0+bGFzdCk7CisKKwlmb3IgKGkgPSBmaXJzdDsgaSA8PSBsYXN0OyBpKyspIHsKIAkJaWYgKGNvbl9kcml2ZXJfbWFwW2ldID09IGNzdykgewogCQkJbW9kdWxlX3B1dChjc3ctPm93bmVyKTsKIAkJCWNvbl9kcml2ZXJfbWFwW2ldID0gTlVMTDsKIAkJfQorCX0KKworCWlmICghY29uX2lzX2JvdW5kKGRlZmNzdykpIHsKKwkJY29uc3Qgc3RydWN0IGNvbnN3ICpkZWZjb25zdyA9IGNvbnN3aXRjaHA7CisKKwkJZGVmY3N3LT5jb25fc3RhcnR1cCgpOworCQljb25fYmFjay0+ZmxhZyB8PSBDT05fRFJJVkVSX0ZMQUdfSU5JVDsKKwkJLyoKKwkJICogdmdhY29uIG1heSBjaGFuZ2UgdGhlIGRlZmF1bHQgZHJpdmVyIHRvIHBvaW50CisJCSAqIHRvIGR1bW15Y29uLCB3ZSByZXN0b3JlIGl0IGhlcmUuLi4KKwkJICovCisJCWNvbnN3aXRjaHAgPSBkZWZjb25zdzsKKwl9CisKKwlpZiAoIWNvbl9pc19ib3VuZChjc3cpKQorCQljb25fZHJpdmVyLT5mbGFnICY9IH5DT05fRFJJVkVSX0ZMQUdfSU5JVDsKKworCXJlbGVhc2VfY29uc29sZV9zZW0oKTsKKwkvKiBpZ25vcmUgcmV0dXJuIHZhbHVlLCBiaW5kaW5nIHNob3VsZCBub3QgZmFpbCAqLworCWJpbmRfY29uX2RyaXZlcihkZWZjc3csIGZpcnN0LCBsYXN0LCBkZWZsdCk7CitlcnI6CisJbW9kdWxlX3B1dChvd25lcik7CisJcmV0dXJuIHJldHZhbDsKKwogfQogCitzdGF0aWMgaW50IHZ0X2JpbmQoc3RydWN0IGNvbl9kcml2ZXIgKmNvbikKK3sKKwljb25zdCBzdHJ1Y3QgY29uc3cgKmRlZmNzdyA9IE5VTEwsICpjc3cgPSBOVUxMOworCWludCBpLCBtb3JlID0gMSwgZmlyc3QgPSAtMSwgbGFzdCA9IC0xLCBkZWZsdCA9IDA7CisKKyAJaWYgKCFjb24tPmNvbiB8fCAhKGNvbi0+ZmxhZyAmIENPTl9EUklWRVJfRkxBR19NT0RVTEUpIHx8CisJICAgIGNvbl9pc19ncmFwaGljcyhjb24tPmNvbiwgY29uLT5maXJzdCwgY29uLT5sYXN0KSkKKwkJZ290byBlcnI7CisKKwljc3cgPSBjb24tPmNvbjsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfTlJfQ09OX0RSSVZFUjsgaSsrKSB7CisJCXN0cnVjdCBjb25fZHJpdmVyICpjb24gPSAmcmVnaXN0ZXJlZF9jb25fZHJpdmVyW2ldOworCisJCWlmIChjb24tPmNvbiAmJiAhKGNvbi0+ZmxhZyAmIENPTl9EUklWRVJfRkxBR19NT0RVTEUpKSB7CisJCQlkZWZjc3cgPSBjb24tPmNvbjsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKCFkZWZjc3cpCisJCWdvdG8gZXJyOworCisJd2hpbGUgKG1vcmUpIHsKKwkJbW9yZSA9IDA7CisKKwkJZm9yIChpID0gY29uLT5maXJzdDsgaSA8PSBjb24tPmxhc3Q7IGkrKykgeworCQkJaWYgKGNvbl9kcml2ZXJfbWFwW2ldID09IGRlZmNzdykgeworCQkJCWlmIChmaXJzdCA9PSAtMSkKKwkJCQkJZmlyc3QgPSBpOworCQkJCWxhc3QgPSBpOworCQkJCW1vcmUgPSAxOworCQkJfSBlbHNlIGlmIChmaXJzdCAhPSAtMSkKKwkJCQlicmVhazsKKwkJfQorCisJCWlmIChmaXJzdCA9PSAwICYmIGxhc3QgPT0gTUFYX05SX0NPTlNPTEVTIC0xKQorCQkJZGVmbHQgPSAxOworCisJCWlmIChmaXJzdCAhPSAtMSkKKwkJCWJpbmRfY29uX2RyaXZlcihjc3csIGZpcnN0LCBsYXN0LCBkZWZsdCk7CisKKwkJZmlyc3QgPSAtMTsKKwkJbGFzdCA9IC0xOworCQlkZWZsdCA9IDA7CisJfQorCitlcnI6CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdnRfdW5iaW5kKHN0cnVjdCBjb25fZHJpdmVyICpjb24pCit7CisJY29uc3Qgc3RydWN0IGNvbnN3ICpjc3cgPSBOVUxMOworCWludCBpLCBtb3JlID0gMSwgZmlyc3QgPSAtMSwgbGFzdCA9IC0xLCBkZWZsdCA9IDA7CisKKyAJaWYgKCFjb24tPmNvbiB8fCAhKGNvbi0+ZmxhZyAmIENPTl9EUklWRVJfRkxBR19NT0RVTEUpIHx8CisJICAgIGNvbl9pc19ncmFwaGljcyhjb24tPmNvbiwgY29uLT5maXJzdCwgY29uLT5sYXN0KSkKKwkJZ290byBlcnI7CisKKwljc3cgPSBjb24tPmNvbjsKKworCXdoaWxlIChtb3JlKSB7CisJCW1vcmUgPSAwOworCisJCWZvciAoaSA9IGNvbi0+Zmlyc3Q7IGkgPD0gY29uLT5sYXN0OyBpKyspIHsKKwkJCWlmIChjb25fZHJpdmVyX21hcFtpXSA9PSBjc3cpIHsKKwkJCQlpZiAoZmlyc3QgPT0gLTEpCisJCQkJCWZpcnN0ID0gaTsKKwkJCQlsYXN0ID0gaTsKKwkJCQltb3JlID0gMTsKKwkJCX0gZWxzZSBpZiAoZmlyc3QgIT0gLTEpCisJCQkJYnJlYWs7CisJCX0KKworCQlpZiAoZmlyc3QgPT0gMCAmJiBsYXN0ID09IE1BWF9OUl9DT05TT0xFUyAtMSkKKwkJCWRlZmx0ID0gMTsKKworCQlpZiAoZmlyc3QgIT0gLTEpCisJCQl1bmJpbmRfY29uX2RyaXZlcihjc3csIGZpcnN0LCBsYXN0LCBkZWZsdCk7CisKKwkJZmlyc3QgPSAtMTsKKwkJbGFzdCA9IC0xOworCQlkZWZsdCA9IDA7CisJfQorCitlcnI6CisJcmV0dXJuIDA7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgdnRfYmluZChzdHJ1Y3QgY29uX2RyaXZlciAqY29uKQoreworCXJldHVybiAwOworfQorc3RhdGljIGlubGluZSBpbnQgdnRfdW5iaW5kKHN0cnVjdCBjb25fZHJpdmVyICpjb24pCit7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogQ09ORklHX1ZUX0hXX0NPTlNPTEVfQklORElORyAqLworCitzdGF0aWMgc3NpemVfdCBzdG9yZV9iaW5kKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldmljZSwKKwkJCSAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGNvbl9kcml2ZXIgKmNvbiA9IGNsYXNzX2dldF9kZXZkYXRhKGNsYXNzX2RldmljZSk7CisJaW50IGJpbmQgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDApOworCisJaWYgKGJpbmQpCisJCXZ0X2JpbmQoY29uKTsKKwllbHNlCisJCXZ0X3VuYmluZChjb24pOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X2JpbmQoc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2aWNlLCBjaGFyICpidWYpCit7CisJc3RydWN0IGNvbl9kcml2ZXIgKmNvbiA9IGNsYXNzX2dldF9kZXZkYXRhKGNsYXNzX2RldmljZSk7CisJaW50IGJpbmQgPSBjb25faXNfYm91bmQoY29uLT5jb24pOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWlcbiIsIGJpbmQpOworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X25hbWUoc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2aWNlLCBjaGFyICpidWYpCit7CisJc3RydWN0IGNvbl9kcml2ZXIgKmNvbiA9IGNsYXNzX2dldF9kZXZkYXRhKGNsYXNzX2RldmljZSk7CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlcyAlc1xuIiwKKwkJCShjb24tPmZsYWcgJiBDT05fRFJJVkVSX0ZMQUdfTU9EVUxFKSA/ICIoTSkiIDogIihTKSIsCisJCQkgY29uLT5kZXNjKTsKKworfQorCitzdGF0aWMgc3RydWN0IGNsYXNzX2RldmljZV9hdHRyaWJ1dGUgY2xhc3NfZGV2aWNlX2F0dHJzW10gPSB7CisJX19BVFRSKGJpbmQsIFNfSVJVR098U19JV1VTUiwgc2hvd19iaW5kLCBzdG9yZV9iaW5kKSwKKwlfX0FUVFIobmFtZSwgU19JUlVHTywgc2hvd19uYW1lLCBOVUxMKSwKK307CisKK3N0YXRpYyBpbnQgdnRjb25zb2xlX2luaXRfY2xhc3NfZGV2aWNlKHN0cnVjdCBjb25fZHJpdmVyICpjb24pCit7CisJaW50IGk7CisKKwljbGFzc19zZXRfZGV2ZGF0YShjb24tPmNsYXNzX2RldiwgY29uKTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjbGFzc19kZXZpY2VfYXR0cnMpOyBpKyspCisJCWNsYXNzX2RldmljZV9jcmVhdGVfZmlsZShjb24tPmNsYXNzX2RldiwKKwkJCQkJICZjbGFzc19kZXZpY2VfYXR0cnNbaV0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHZ0Y29uc29sZV9kZWluaXRfY2xhc3NfZGV2aWNlKHN0cnVjdCBjb25fZHJpdmVyICpjb24pCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjbGFzc19kZXZpY2VfYXR0cnMpOyBpKyspCisJCWNsYXNzX2RldmljZV9yZW1vdmVfZmlsZShjb24tPmNsYXNzX2RldiwKKwkJCQkJICZjbGFzc19kZXZpY2VfYXR0cnNbaV0pOworfQorCisvKioKKyAqIGNvbl9pc19ib3VuZCAtIGNoZWNrcyBpZiBkcml2ZXIgaXMgYm91bmQgdG8gdGhlIGNvbnNvbGUKKyAqIEBjc3c6IGNvbnNvbGUgZHJpdmVyCisgKgorICogUkVUVVJOUzogemVybyBpZiB1bmJvdW5kLCBub256ZXJvIGlmIGJvdW5kCisgKgorICogRHJpdmVycyBjYW4gY2FsbCB0aGlzIGFuZCBpZiB6ZXJvLCB0aGV5IHNob3VsZCByZWxlYXNlCisgKiBhbGwgcmVzb3VyY2VzIGFsbG9jYXRlZCBvbiBjb25fc3RhcnR1cCgpCisgKi8KK2ludCBjb25faXNfYm91bmQoY29uc3Qgc3RydWN0IGNvbnN3ICpjc3cpCit7CisJaW50IGksIGJvdW5kID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfTlJfQ09OU09MRVM7IGkrKykgeworCQlpZiAoY29uX2RyaXZlcl9tYXBbaV0gPT0gY3N3KSB7CisJCQlib3VuZCA9IDE7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiBib3VuZDsKK30KK0VYUE9SVF9TWU1CT0woY29uX2lzX2JvdW5kKTsKKworLyoqCisgKiByZWdpc3Rlcl9jb25fZHJpdmVyIC0gcmVnaXN0ZXIgY29uc29sZSBkcml2ZXIgdG8gY29uc29sZSBsYXllcgorICogQGNzdzogY29uc29sZSBkcml2ZXIKKyAqIEBmaXJzdDogdGhlIGZpcnN0IGNvbnNvbGUgdG8gdGFrZSBvdmVyLCBtaW5pbXVtIHZhbHVlIGlzIDAKKyAqIEBsYXN0OiB0aGUgbGFzdCBjb25zb2xlIHRvIHRha2Ugb3ZlciwgbWF4aW11bSB2YWx1ZSBpcyBNQVhfTlJfQ09OU09MRVMgLTEKKyAqCisgKiBERVNDUklQVElPTjogVGhpcyBmdW5jdGlvbiByZWdpc3RlcnMgYSBjb25zb2xlIGRyaXZlciB3aGljaCBjYW4gbGF0ZXIKKyAqIGJpbmQgdG8gYSByYW5nZSBvZiBjb25zb2xlcyBzcGVjaWZpZWQgYnkgQGZpcnN0IGFuZCBAbGFzdC4gSXQgd2lsbAorICogYWxzbyBpbml0aWFsaXplIHRoZSBjb25zb2xlIGRyaXZlciBieSBjYWxsaW5nIGNvbl9zdGFydHVwKCkuCisgKi8KK2ludCByZWdpc3Rlcl9jb25fZHJpdmVyKGNvbnN0IHN0cnVjdCBjb25zdyAqY3N3LCBpbnQgZmlyc3QsIGludCBsYXN0KQoreworCXN0cnVjdCBtb2R1bGUgKm93bmVyID0gY3N3LT5vd25lcjsKKwlzdHJ1Y3QgY29uX2RyaXZlciAqY29uX2RyaXZlcjsKKwljb25zdCBjaGFyICpkZXNjOworCWludCBpLCByZXR2YWwgPSAwOworCisJaWYgKCF0cnlfbW9kdWxlX2dldChvd25lcikpCisJCXJldHVybiAtRU5PREVWOworCisJYWNxdWlyZV9jb25zb2xlX3NlbSgpOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9OUl9DT05fRFJJVkVSOyBpKyspIHsKKwkJY29uX2RyaXZlciA9ICZyZWdpc3RlcmVkX2Nvbl9kcml2ZXJbaV07CisKKwkJLyogYWxyZWFkeSByZWdpc3RlcmVkICovCisJCWlmIChjb25fZHJpdmVyLT5jb24gPT0gY3N3KQorCQkJcmV0dmFsID0gLUVJTlZBTDsKKwl9CisKKwlpZiAocmV0dmFsKQorCQlnb3RvIGVycjsKKworCWRlc2MgPSBjc3ctPmNvbl9zdGFydHVwKCk7CisKKwlpZiAoIWRlc2MpCisJCWdvdG8gZXJyOworCisJcmV0dmFsID0gLUVJTlZBTDsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfTlJfQ09OX0RSSVZFUjsgaSsrKSB7CisJCWNvbl9kcml2ZXIgPSAmcmVnaXN0ZXJlZF9jb25fZHJpdmVyW2ldOworCisJCWlmIChjb25fZHJpdmVyLT5jb24gPT0gTlVMTCkgeworCQkJY29uX2RyaXZlci0+Y29uID0gY3N3OworCQkJY29uX2RyaXZlci0+ZGVzYyA9IGRlc2M7CisJCQljb25fZHJpdmVyLT5ub2RlID0gaTsKKwkJCWNvbl9kcml2ZXItPmZsYWcgPSBDT05fRFJJVkVSX0ZMQUdfTU9EVUxFIHwKKwkJCSAgICAgICAgICAgICAgICAgICBDT05fRFJJVkVSX0ZMQUdfSU5JVDsKKwkJCWNvbl9kcml2ZXItPmZpcnN0ID0gZmlyc3Q7CisJCQljb25fZHJpdmVyLT5sYXN0ID0gbGFzdDsKKwkJCXJldHZhbCA9IDA7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChyZXR2YWwpCisJCWdvdG8gZXJyOworCisJY29uX2RyaXZlci0+Y2xhc3NfZGV2ID0gY2xhc3NfZGV2aWNlX2NyZWF0ZSh2dGNvbnNvbGVfY2xhc3MsIE5VTEwsCisJCQkJCQkgICAgTUtERVYoMCwgY29uX2RyaXZlci0+bm9kZSksCisJCQkJCQkgICAgTlVMTCwgInZ0Y29uJWkiLAorCQkJCQkJICAgIGNvbl9kcml2ZXItPm5vZGUpOworCisJaWYgKElTX0VSUihjb25fZHJpdmVyLT5jbGFzc19kZXYpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlVuYWJsZSB0byBjcmVhdGUgY2xhc3NfZGV2aWNlIGZvciAlczsgIgorCQkgICAgICAgImVycm5vID0gJWxkXG4iLCBjb25fZHJpdmVyLT5kZXNjLAorCQkgICAgICAgUFRSX0VSUihjb25fZHJpdmVyLT5jbGFzc19kZXYpKTsKKwkJY29uX2RyaXZlci0+Y2xhc3NfZGV2ID0gTlVMTDsKKwl9IGVsc2UgeworCQl2dGNvbnNvbGVfaW5pdF9jbGFzc19kZXZpY2UoY29uX2RyaXZlcik7CisJfQorZXJyOgorCXJlbGVhc2VfY29uc29sZV9zZW0oKTsKKwltb2R1bGVfcHV0KG93bmVyKTsKKwlyZXR1cm4gcmV0dmFsOworfQorRVhQT1JUX1NZTUJPTChyZWdpc3Rlcl9jb25fZHJpdmVyKTsKKworLyoqCisgKiB1bnJlZ2lzdGVyX2Nvbl9kcml2ZXIgLSB1bnJlZ2lzdGVyIGNvbnNvbGUgZHJpdmVyIGZyb20gY29uc29sZSBsYXllcgorICogQGNzdzogY29uc29sZSBkcml2ZXIKKyAqCisgKiBERVNDUklQVElPTjogQWxsIGRyaXZlcnMgdGhhdCByZWdpc3RlcnMgdG8gdGhlIGNvbnNvbGUgbGF5ZXIgbXVzdAorICogY2FsbCB0aGlzIGZ1bmN0aW9uIHVwb24gZXhpdCwgb3IgaWYgdGhlIGNvbnNvbGUgZHJpdmVyIGlzIGluIGEgc3RhdGUKKyAqIHdoZXJlIGl0IHdvbid0IGJlIGFibGUgdG8gaGFuZGxlIGNvbnNvbGUgc2VydmljZXMsIHN1Y2ggYXMgdGhlCisgKiBmcmFtZWJ1ZmZlciBjb25zb2xlIHdpdGhvdXQgbG9hZGVkIGZyYW1lYnVmZmVyIGRyaXZlcnMuCisgKgorICogVGhlIGRyaXZlciBtdXN0IHVuYmluZCBmaXJzdCBwcmlvciB0byB1bnJlZ2lzdHJhdGlvbi4KKyAqLworaW50IHVucmVnaXN0ZXJfY29uX2RyaXZlcihjb25zdCBzdHJ1Y3QgY29uc3cgKmNzdykKK3sKKwlpbnQgaSwgcmV0dmFsID0gLUVOT0RFVjsKKworCWFjcXVpcmVfY29uc29sZV9zZW0oKTsKKworCS8qIGNhbm5vdCB1bnJlZ2lzdGVyIGEgYm91bmQgZHJpdmVyICovCisJaWYgKGNvbl9pc19ib3VuZChjc3cpKQorCQlnb3RvIGVycjsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfTlJfQ09OX0RSSVZFUjsgaSsrKSB7CisJCXN0cnVjdCBjb25fZHJpdmVyICpjb25fZHJpdmVyID0gJnJlZ2lzdGVyZWRfY29uX2RyaXZlcltpXTsKKworCQlpZiAoY29uX2RyaXZlci0+Y29uID09IGNzdyAmJgorCQkgICAgY29uX2RyaXZlci0+ZmxhZyAmIENPTl9EUklWRVJfRkxBR19NT0RVTEUpIHsKKwkJCXZ0Y29uc29sZV9kZWluaXRfY2xhc3NfZGV2aWNlKGNvbl9kcml2ZXIpOworCQkJY2xhc3NfZGV2aWNlX2Rlc3Ryb3kodnRjb25zb2xlX2NsYXNzLAorCQkJCQkgICAgIE1LREVWKDAsIGNvbl9kcml2ZXItPm5vZGUpKTsKKwkJCWNvbl9kcml2ZXItPmNvbiA9IE5VTEw7CisJCQljb25fZHJpdmVyLT5kZXNjID0gTlVMTDsKKwkJCWNvbl9kcml2ZXItPmNsYXNzX2RldiA9IE5VTEw7CisJCQljb25fZHJpdmVyLT5ub2RlID0gMDsKKwkJCWNvbl9kcml2ZXItPmZsYWcgPSAwOworCQkJY29uX2RyaXZlci0+Zmlyc3QgPSAwOworCQkJY29uX2RyaXZlci0+bGFzdCA9IDA7CisJCQlyZXR2YWwgPSAwOworCQkJYnJlYWs7CisJCX0KKwl9CitlcnI6CisJcmVsZWFzZV9jb25zb2xlX3NlbSgpOworCXJldHVybiByZXR2YWw7Cit9CitFWFBPUlRfU1lNQk9MKHVucmVnaXN0ZXJfY29uX2RyaXZlcik7CisKKy8qCisgKglJZiB3ZSBzdXBwb3J0IG1vcmUgY29uc29sZSBkcml2ZXJzLCB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQKKyAqCXdoZW4gYSBkcml2ZXIgd2FudHMgdG8gdGFrZSBvdmVyIHNvbWUgZXhpc3RpbmcgY29uc29sZXMKKyAqCWFuZCBiZWNvbWUgZGVmYXVsdCBkcml2ZXIgZm9yIG5ld2x5IG9wZW5lZCBvbmVzLgorICoKKyAqICAgICAgdGFrZV9vdmVyX2NvbnNvbGUgaXMgYmFzaWNhbGx5IGEgcmVnaXN0ZXIgZm9sbG93ZWQgYnkgdW5iaW5kCisgKi8KK2ludCB0YWtlX292ZXJfY29uc29sZShjb25zdCBzdHJ1Y3QgY29uc3cgKmNzdywgaW50IGZpcnN0LCBpbnQgbGFzdCwgaW50IGRlZmx0KQoreworCWludCBlcnI7CisKKwllcnIgPSByZWdpc3Rlcl9jb25fZHJpdmVyKGNzdywgZmlyc3QsIGxhc3QpOworCisJaWYgKCFlcnIpCisJCWJpbmRfY29uX2RyaXZlcihjc3csIGZpcnN0LCBsYXN0LCBkZWZsdCk7CisKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogZ2l2ZV91cF9jb25zb2xlIGlzIGEgd3JhcHBlciB0byB1bnJlZ2lzdGVyX2Nvbl9kcml2ZXIuIEl0IHdpbGwgb25seQorICogd29yayBpZiBkcml2ZXIgaXMgZnVsbHkgdW5ib3VuZC4KKyAqLwordm9pZCBnaXZlX3VwX2NvbnNvbGUoY29uc3Qgc3RydWN0IGNvbnN3ICpjc3cpCit7CisJdW5yZWdpc3Rlcl9jb25fZHJpdmVyKGNzdyk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHZ0Y29uc29sZV9jbGFzc19pbml0KHZvaWQpCit7CisJaW50IGk7CisKKwl2dGNvbnNvbGVfY2xhc3MgPSBjbGFzc19jcmVhdGUoVEhJU19NT0RVTEUsICJ2dGNvbnNvbGUiKTsKKwlpZiAoSVNfRVJSKHZ0Y29uc29sZV9jbGFzcykpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiVW5hYmxlIHRvIGNyZWF0ZSB2dCBjb25zb2xlIGNsYXNzOyAiCisJCSAgICAgICAiZXJybm8gPSAlbGRcbiIsIFBUUl9FUlIodnRjb25zb2xlX2NsYXNzKSk7CisJCXZ0Y29uc29sZV9jbGFzcyA9IE5VTEw7CisJfQorCisJLyogQWRkIHN5c3RlbSBkcml2ZXJzIHRvIHN5c2ZzICovCisJZm9yIChpID0gMDsgaSA8IE1BWF9OUl9DT05fRFJJVkVSOyBpKyspIHsKKwkJc3RydWN0IGNvbl9kcml2ZXIgKmNvbiA9ICZyZWdpc3RlcmVkX2Nvbl9kcml2ZXJbaV07CisKKwkJaWYgKGNvbi0+Y29uICYmICFjb24tPmNsYXNzX2RldikgeworCQkJY29uLT5jbGFzc19kZXYgPQorCQkJCWNsYXNzX2RldmljZV9jcmVhdGUodnRjb25zb2xlX2NsYXNzLCBOVUxMLAorCQkJCQkJICAgIE1LREVWKDAsIGNvbi0+bm9kZSksIE5VTEwsCisJCQkJCQkgICAgInZ0Y29uJWkiLCBjb24tPm5vZGUpOworCisJCQlpZiAoSVNfRVJSKGNvbi0+Y2xhc3NfZGV2KSkgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlVuYWJsZSB0byBjcmVhdGUgIgorCQkJCSAgICAgICAiY2xhc3NfZGV2aWNlIGZvciAlczsgZXJybm8gPSAlbGRcbiIsCisJCQkJICAgICAgIGNvbi0+ZGVzYywgUFRSX0VSUihjb24tPmNsYXNzX2RldikpOworCQkJCWNvbi0+Y2xhc3NfZGV2ID0gTlVMTDsKKwkJCX0gZWxzZSB7CisJCQkJdnRjb25zb2xlX2luaXRfY2xhc3NfZGV2aWNlKGNvbik7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KK3Bvc3Rjb3JlX2luaXRjYWxsKHZ0Y29uc29sZV9jbGFzc19pbml0KTsKKwogI2VuZGlmCiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsb2Nrc291cmNlL01ha2VmaWxlIGIvZHJpdmVycy9jbG9ja3NvdXJjZS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTIyMjU0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jbG9ja3NvdXJjZS9NYWtlZmlsZQpAQCAtMCwwICsxLDMgQEAKK29iai0kKENPTkZJR19YODZfQ1lDTE9ORV9USU1FUikJKz0gY3ljbG9uZS5vCitvYmotJChDT05GSUdfWDg2X1BNX1RJTUVSKQkrPSBhY3BpX3BtLm8KK29iai0kKENPTkZJR19TQ3gyMDBIUl9USU1FUikJKz0gc2N4MjAwX2hydC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsb2Nrc291cmNlL2FjcGlfcG0uYyBiL2RyaXZlcnMvY2xvY2tzb3VyY2UvYWNwaV9wbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhZDNiZTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL2FjcGlfcG0uYwpAQCAtMCwwICsxLDE3NyBAQAorLyoKKyAqIGxpbnV4L2RyaXZlcnMvY2xvY2tzb3VyY2UvYWNwaV9wbS5jCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBBQ1BJIFBNIGJhc2VkIGNsb2Nrc291cmNlLgorICoKKyAqIFRoaXMgY29kZSB3YXMgbGFyZ2VseSBtb3ZlZCBmcm9tIHRoZSBpMzg2IHRpbWVyX3BtLmMgZmlsZQorICogd2hpY2ggd2FzIChDKSBEb21pbmlrIEJyb2Rvd3NraSA8bGludXhAYnJvZG8uZGU+IDIwMDMKKyAqIGFuZCBjb250YWluZWQgdGhlIGZvbGxvd2luZyBjb21tZW50czoKKyAqCisgKiBEcml2ZXIgdG8gdXNlIHRoZSBQb3dlciBNYW5hZ2VtZW50IFRpbWVyIChQTVRNUikgYXZhaWxhYmxlIGluIHNvbWUKKyAqIHNvdXRoYnJpZGdlcyBhcyBwcmltYXJ5IHRpbWluZyBzb3VyY2UgZm9yIHRoZSBMaW51eCBrZXJuZWwuCisgKgorICogQmFzZWQgb24gcGFydHMgb2YgbGludXgvZHJpdmVycy9hY3BpL2hhcmR3YXJlL2h3dGltZXIuYywgdGltZXJfcGl0LmMsCisgKiB0aW1lcl9ocGV0LmMsIGFuZCBvbiBBcmphbiB2YW4gZGUgVmVuJ3MgaW1wbGVtZW50YXRpb24gZm9yIDIuNC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdQTCB2Mi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY2xvY2tzb3VyY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworLyogTnVtYmVyIG9mIFBNVE1SIHRpY2tzIGV4cGVjdGVkIGR1cmluZyBjYWxpYnJhdGlvbiBydW4gKi8KKyNkZWZpbmUgUE1UTVJfVElDS1NfUEVSX1NFQyAzNTc5NTQ1CisKKy8qCisgKiBUaGUgSS9PIHBvcnQgdGhlIFBNVE1SIHJlc2lkZXMgYXQuCisgKiBUaGUgbG9jYXRpb24gaXMgZGV0ZWN0ZWQgZHVyaW5nIHNldHVwX2FyY2goKSwKKyAqIGluIGFyY2gvaTM4Ni9hY3BpL2Jvb3QuYworICovCit1MzIgcG10bXJfaW9wb3J0IF9fcmVhZF9tb3N0bHk7CisKKyNkZWZpbmUgQUNQSV9QTV9NQVNLIENMT0NLU09VUkNFX01BU0soMjQpIC8qIGxpbWl0IGl0IHRvIDI0IGJpdHMgKi8KKworc3RhdGljIGlubGluZSB1MzIgcmVhZF9wbXRtcih2b2lkKQoreworCS8qIG1hc2sgdGhlIG91dHB1dCB0byAyNCBiaXRzICovCisJcmV0dXJuIGlubChwbXRtcl9pb3BvcnQpICYgQUNQSV9QTV9NQVNLOworfQorCitzdGF0aWMgY3ljbGVfdCBhY3BpX3BtX3JlYWRfdmVyaWZpZWQodm9pZCkKK3sKKwl1MzIgdjEgPSAwLCB2MiA9IDAsIHYzID0gMDsKKworCS8qCisJICogSXQgaGFzIGJlZW4gcmVwb3J0ZWQgdGhhdCBiZWNhdXNlIG9mIHZhcmlvdXMgYnJva2VuCisJICogY2hpcHNldHMgKElDSDQsIFBJSVg0IGFuZCBQSUlYNEUpIHdoZXJlIHRoZSBBQ1BJIFBNIGNsb2NrCisJICogc291cmNlIGlzIG5vdCBsYXRjaGVkLCB5b3UgbXVzdCByZWFkIGl0IG11bHRpcGxlCisJICogdGltZXMgdG8gZW5zdXJlIGEgc2FmZSB2YWx1ZSBpcyByZWFkOgorCSAqLworCWRvIHsKKwkJdjEgPSByZWFkX3BtdG1yKCk7CisJCXYyID0gcmVhZF9wbXRtcigpOworCQl2MyA9IHJlYWRfcG10bXIoKTsKKwl9IHdoaWxlICgodjEgPiB2MiAmJiB2MSA8IHYzKSB8fCAodjIgPiB2MyAmJiB2MiA8IHYxKQorCQkJfHwgKHYzID4gdjEgJiYgdjMgPCB2MikpOworCisJcmV0dXJuIChjeWNsZV90KXYyOworfQorCitzdGF0aWMgY3ljbGVfdCBhY3BpX3BtX3JlYWQodm9pZCkKK3sKKwlyZXR1cm4gKGN5Y2xlX3QpcmVhZF9wbXRtcigpOworfQorCitzdGF0aWMgc3RydWN0IGNsb2Nrc291cmNlIGNsb2Nrc291cmNlX2FjcGlfcG0gPSB7CisJLm5hbWUJCT0gImFjcGlfcG0iLAorCS5yYXRpbmcJCT0gMjAwLAorCS5yZWFkCQk9IGFjcGlfcG1fcmVhZCwKKwkubWFzawkJPSAoY3ljbGVfdClBQ1BJX1BNX01BU0ssCisJLm11bHQJCT0gMCwgLyp0byBiZSBjYWx1Y2xhdGVkKi8KKwkuc2hpZnQJCT0gMjIsCisJLmlzX2NvbnRpbnVvdXMJPSAxLAorfTsKKworCisjaWZkZWYgQ09ORklHX1BDSQorc3RhdGljIGludCBhY3BpX3BtX2dvb2Q7CitzdGF0aWMgaW50IF9faW5pdCBhY3BpX3BtX2dvb2Rfc2V0dXAoY2hhciAqX19zdHIpCit7CisgICAgICAgYWNwaV9wbV9nb29kID0gMTsKKyAgICAgICByZXR1cm4gMTsKK30KK19fc2V0dXAoImFjcGlfcG1fZ29vZCIsIGFjcGlfcG1fZ29vZF9zZXR1cCk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhY3BpX3BtX25lZWRfd29ya2Fyb3VuZCh2b2lkKQoreworCWNsb2Nrc291cmNlX2FjcGlfcG0ucmVhZCA9IGFjcGlfcG1fcmVhZF92ZXJpZmllZDsKKwljbG9ja3NvdXJjZV9hY3BpX3BtLnJhdGluZyA9IDExMDsKK30KKworLyoKKyAqIFBJSVg0IEVycmF0YToKKyAqCisgKiBUaGUgcG93ZXIgbWFuYWdlbWVudCB0aW1lciBtYXkgcmV0dXJuIGltcHJvcGVyIHJlc3VsdHMgd2hlbiByZWFkLgorICogQWx0aG91Z2ggdGhlIHRpbWVyIHZhbHVlIHNldHRsZXMgcHJvcGVybHkgYWZ0ZXIgaW5jcmVtZW50aW5nLAorICogd2hpbGUgaW5jcmVtZW50aW5nIHRoZXJlIGlzIGEgMyBucyB3aW5kb3cgZXZlcnkgNjkuOCBucyB3aGVyZSB0aGUKKyAqIHRpbWVyIHZhbHVlIGlzIGluZGV0ZXJtaW5hdGUgKGEgNC4yJSBjaGFuY2UgdGhhdCB0aGUgZGF0YSB3aWxsIGJlCisgKiBpbmNvcnJlY3Qgd2hlbiByZWFkKS4gQXMgYSByZXN1bHQsIHRoZSBBQ1BJIGZyZWUgcnVubmluZyBjb3VudCB1cAorICogdGltZXIgc3BlY2lmaWNhdGlvbiBpcyB2aW9sYXRlZCBkdWUgdG8gZXJyb25lb3VzIHJlYWRzLgorICovCitzdGF0aWMgdm9pZCBfX2RldmluaXQgYWNwaV9wbV9jaGVja19ibGFja2xpc3Qoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwl1OCByZXY7CisKKwlpZiAoYWNwaV9wbV9nb29kKQorCQlyZXR1cm47CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIFBDSV9SRVZJU0lPTl9JRCwgJnJldik7CisJLyogdGhlIGJ1ZyBoYXMgYmVlbiBmaXhlZCBpbiBQSUlYNE0gKi8KKwlpZiAocmV2IDwgMykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIqIEZvdW5kIFBNLVRpbWVyIEJ1ZyBvbiB0aGUgY2hpcHNldC4iCisJCSAgICAgICAiIER1ZSB0byB3b3JrYXJvdW5kcyBmb3IgYSBidWcsXG4iCisJCSAgICAgICAiKiB0aGlzIGNsb2NrIHNvdXJjZSBpcyBzbG93LiBDb25zaWRlciB0cnlpbmciCisJCSAgICAgICAiIG90aGVyIGNsb2NrIHNvdXJjZXNcbiIpOworCisJCWFjcGlfcG1fbmVlZF93b3JrYXJvdW5kKCk7CisJfQorfQorREVDTEFSRV9QQ0lfRklYVVBfRUFSTFkoUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF84MjM3MUFCXzMsCisJCQlhY3BpX3BtX2NoZWNrX2JsYWNrbGlzdCk7CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBhY3BpX3BtX2NoZWNrX2dyYXlsaXN0KHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJaWYgKGFjcGlfcG1fZ29vZCkKKwkJcmV0dXJuOworCisJcHJpbnRrKEtFUk5fV0FSTklORyAiKiBUaGUgY2hpcHNldCBtYXkgaGF2ZSBQTS1UaW1lciBCdWcuIER1ZSB0byIKKwkgICAgICAgIiB3b3JrYXJvdW5kcyBmb3IgYSBidWcsXG4iCisJICAgICAgICIqIHRoaXMgY2xvY2sgc291cmNlIGlzIHNsb3cuIElmIHlvdSBhcmUgc3VyZSB5b3VyIHRpbWVyIgorCSAgICAgICAiIGRvZXMgbm90IGhhdmVcbiIKKwkgICAgICAgIiogdGhpcyBidWcsIHBsZWFzZSB1c2UgXCJhY3BpX3BtX2dvb2RcIiB0byBkaXNhYmxlIHRoZSIKKwkgICAgICAgIiB3b3JrYXJvdW5kXG4iKTsKKworCWFjcGlfcG1fbmVlZF93b3JrYXJvdW5kKCk7Cit9CitERUNMQVJFX1BDSV9GSVhVUF9FQVJMWShQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxREJfMCwKKwkJCWFjcGlfcG1fY2hlY2tfZ3JheWxpc3QpOworI2VuZGlmCisKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9hY3BpX3BtX2Nsb2Nrc291cmNlKHZvaWQpCit7CisJdTMyIHZhbHVlMSwgdmFsdWUyOworCXVuc2lnbmVkIGludCBpOworCisJaWYgKCFwbXRtcl9pb3BvcnQpCisJCXJldHVybiAtRU5PREVWOworCisJY2xvY2tzb3VyY2VfYWNwaV9wbS5tdWx0ID0gY2xvY2tzb3VyY2VfaHoybXVsdChQTVRNUl9USUNLU19QRVJfU0VDLAorCQkJCQkJY2xvY2tzb3VyY2VfYWNwaV9wbS5zaGlmdCk7CisKKwkvKiAidmVyaWZ5IiB0aGlzIHRpbWluZyBzb3VyY2U6ICovCisJdmFsdWUxID0gcmVhZF9wbXRtcigpOworCWZvciAoaSA9IDA7IGkgPCAxMDAwMDsgaSsrKSB7CisJCXZhbHVlMiA9IHJlYWRfcG10bXIoKTsKKwkJaWYgKHZhbHVlMiA9PSB2YWx1ZTEpCisJCQljb250aW51ZTsKKwkJaWYgKHZhbHVlMiA+IHZhbHVlMSkKKwkJCWdvdG8gcG1fZ29vZDsKKwkJaWYgKCh2YWx1ZTIgPCB2YWx1ZTEpICYmICgodmFsdWUyKSA8IDB4RkZGKSkKKwkJCWdvdG8gcG1fZ29vZDsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiUE0tVGltZXIgaGFkIGluY29uc2lzdGVudCByZXN1bHRzOiIKKwkJCSIgMHglI3gsIDB4JSN4IC0gYWJvcnRpbmcuXG4iLCB2YWx1ZTEsIHZhbHVlMik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlwcmludGsoS0VSTl9JTkZPICJQTS1UaW1lciBoYWQgbm8gcmVhc29uYWJsZSByZXN1bHQ6IgorCQkJIiAweCUjeCAtIGFib3J0aW5nLlxuIiwgdmFsdWUxKTsKKwlyZXR1cm4gLUVOT0RFVjsKKworcG1fZ29vZDoKKwlyZXR1cm4gY2xvY2tzb3VyY2VfcmVnaXN0ZXIoJmNsb2Nrc291cmNlX2FjcGlfcG0pOworfQorCittb2R1bGVfaW5pdChpbml0X2FjcGlfcG1fY2xvY2tzb3VyY2UpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbG9ja3NvdXJjZS9jeWNsb25lLmMgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL2N5Y2xvbmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjRkM2Q1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jbG9ja3NvdXJjZS9jeWNsb25lLmMKQEAgLTAsMCArMSwxMTkgQEAKKyNpbmNsdWRlIDxsaW51eC9jbG9ja3NvdXJjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXguaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSAibWFjaF90aW1lci5oIgorCisjZGVmaW5lIENZQ0xPTkVfQ0JBUl9BRERSCTB4RkVCMDBDRDAJLyogYmFzZSBhZGRyZXNzIHB0ciAqLworI2RlZmluZSBDWUNMT05FX1BNQ0NfT0ZGU0VUCTB4NTFBMAkJLyogb2Zmc2V0IHRvIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQ1lDTE9ORV9NUENTX09GRlNFVAkweDUxQTgJCS8qIG9mZnNldCB0byBzZWxlY3QgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQ1lDTE9ORV9NUE1DX09GRlNFVAkweDUxRDAJCS8qIG9mZnNldCB0byBjb3VudCByZWdpc3RlciAqLworI2RlZmluZSBDWUNMT05FX1RJTUVSX0ZSRVEJOTk3ODAwMDAJLyogMTAwTWh6LCBidXQgbm90IHJlYWxseSAqLworI2RlZmluZSBDWUNMT05FX1RJTUVSX01BU0sJQ0xPQ0tTT1VSQ0VfTUFTSygzMikgLyogMzIgYml0IG1hc2sgKi8KKworaW50IHVzZV9jeWNsb25lID0gMDsKK3N0YXRpYyB2b2lkIF9faW9tZW0gKmN5Y2xvbmVfcHRyOworCitzdGF0aWMgY3ljbGVfdCByZWFkX2N5Y2xvbmUodm9pZCkKK3sKKwlyZXR1cm4gKGN5Y2xlX3QpcmVhZGwoY3ljbG9uZV9wdHIpOworfQorCitzdGF0aWMgc3RydWN0IGNsb2Nrc291cmNlIGNsb2Nrc291cmNlX2N5Y2xvbmUgPSB7CisJLm5hbWUJCT0gImN5Y2xvbmUiLAorCS5yYXRpbmcJCT0gMjUwLAorCS5yZWFkCQk9IHJlYWRfY3ljbG9uZSwKKwkubWFzawkJPSBDWUNMT05FX1RJTUVSX01BU0ssCisJLm11bHQJCT0gMTAsCisJLnNoaWZ0CQk9IDAsCisJLmlzX2NvbnRpbnVvdXMJPSAxLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9jeWNsb25lX2Nsb2Nrc291cmNlKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBiYXNlOwkvKiBzYXZlZCB2YWx1ZSBmcm9tIENCQVIgKi8KKwl1bnNpZ25lZCBsb25nIG9mZnNldDsKKwl1MzIgX19pb21lbSogdm9sYXRpbGUgY3ljbG9uZV90aW1lcjsJLyogQ3ljbG9uZSBNUE1DMCByZWdpc3RlciAqLworCXUzMiBfX2lvbWVtKiByZWc7CisJaW50IGk7CisKKwkvKiBtYWtlIHN1cmUgd2UncmUgb24gYSBzdW1taXQgYm94OiAqLworCWlmICghdXNlX2N5Y2xvbmUpCisJCXJldHVybiAtRU5PREVWOworCisJcHJpbnRrKEtFUk5fSU5GTyAiU3VtbWl0IGNoaXBzZXQ6IFN0YXJ0aW5nIEN5Y2xvbmUgQ291bnRlci5cbiIpOworCisJLyogZmluZCBiYXNlIGFkZHJlc3M6ICovCisJb2Zmc2V0ID0gQ1lDTE9ORV9DQkFSX0FERFI7CisJcmVnID0gaW9yZW1hcF9ub2NhY2hlKG9mZnNldCwgc2l6ZW9mKHJlZykpOworCWlmICghcmVnKSB7CisJCXByaW50ayhLRVJOX0VSUiAiU3VtbWl0IGNoaXBzZXQ6IENvdWxkIG5vdCBmaW5kIHZhbGlkIENCQVIgcmVnaXN0ZXIuXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCS8qIGV2ZW4gb24gNjRiaXQgc3lzdGVtcywgdGhpcyBpcyBvbmx5IDMyYml0czogKi8KKwliYXNlID0gcmVhZGwocmVnKTsKKwlpZiAoIWJhc2UpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJTdW1taXQgY2hpcHNldDogQ291bGQgbm90IGZpbmQgdmFsaWQgQ0JBUiB2YWx1ZS5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJaW91bm1hcChyZWcpOworCisJLyogc2V0dXAgUE1DQzogKi8KKwlvZmZzZXQgPSBiYXNlICsgQ1lDTE9ORV9QTUNDX09GRlNFVDsKKwlyZWcgPSBpb3JlbWFwX25vY2FjaGUob2Zmc2V0LCBzaXplb2YocmVnKSk7CisJaWYgKCFyZWcpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJTdW1taXQgY2hpcHNldDogQ291bGQgbm90IGZpbmQgdmFsaWQgUE1DQyByZWdpc3Rlci5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJd3JpdGVsKDB4MDAwMDAwMDEscmVnKTsKKwlpb3VubWFwKHJlZyk7CisKKwkvKiBzZXR1cCBNUENTOiAqLworCW9mZnNldCA9IGJhc2UgKyBDWUNMT05FX01QQ1NfT0ZGU0VUOworCXJlZyA9IGlvcmVtYXBfbm9jYWNoZShvZmZzZXQsIHNpemVvZihyZWcpKTsKKwlpZiAoIXJlZykgeworCQlwcmludGsoS0VSTl9FUlIgIlN1bW1pdCBjaGlwc2V0OiBDb3VsZCBub3QgZmluZCB2YWxpZCBNUENTIHJlZ2lzdGVyLlxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwl3cml0ZWwoMHgwMDAwMDAwMSxyZWcpOworCWlvdW5tYXAocmVnKTsKKworCS8qIG1hcCBpbiBjeWNsb25lX3RpbWVyOiAqLworCW9mZnNldCA9IGJhc2UgKyBDWUNMT05FX01QTUNfT0ZGU0VUOworCWN5Y2xvbmVfdGltZXIgPSBpb3JlbWFwX25vY2FjaGUob2Zmc2V0LCBzaXplb2YodTY0KSk7CisJaWYgKCFjeWNsb25lX3RpbWVyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiU3VtbWl0IGNoaXBzZXQ6IENvdWxkIG5vdCBmaW5kIHZhbGlkIE1QTUMgcmVnaXN0ZXIuXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogcXVpY2sgdGVzdCB0byBtYWtlIHN1cmUgaXRzIHRpY2tpbmc6ICovCisJZm9yIChpID0gMDsgaSA8IDM7IGkrKyl7CisJCXUzMiBvbGQgPSByZWFkbChjeWNsb25lX3RpbWVyKTsKKwkJaW50IHN0YWxsID0gMTAwOworCisJCXdoaWxlIChzdGFsbC0tKQorCQkJYmFycmllcigpOworCisJCWlmIChyZWFkbChjeWNsb25lX3RpbWVyKSA9PSBvbGQpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiU3VtbWl0IGNoaXBzZXQ6IENvdW50ZXIgbm90IGNvdW50aW5nISBESVNBQkxFRFxuIik7CisJCQlpb3VubWFwKGN5Y2xvbmVfdGltZXIpOworCQkJY3ljbG9uZV90aW1lciA9IE5VTEw7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCX0KKwljeWNsb25lX3B0ciA9IGN5Y2xvbmVfdGltZXI7CisKKwkvKiBzb3J0IG91dCBtdWx0L3NoaWZ0IHZhbHVlczogKi8KKwljbG9ja3NvdXJjZV9jeWNsb25lLnNoaWZ0ID0gMjI7CisJY2xvY2tzb3VyY2VfY3ljbG9uZS5tdWx0ID0gY2xvY2tzb3VyY2VfaHoybXVsdChDWUNMT05FX1RJTUVSX0ZSRVEsCisJCQkJCQljbG9ja3NvdXJjZV9jeWNsb25lLnNoaWZ0KTsKKworCXJldHVybiBjbG9ja3NvdXJjZV9yZWdpc3RlcigmY2xvY2tzb3VyY2VfY3ljbG9uZSk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfY3ljbG9uZV9jbG9ja3NvdXJjZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsb2Nrc291cmNlL3NjeDIwMF9ocnQuYyBiL2RyaXZlcnMvY2xvY2tzb3VyY2Uvc2N4MjAwX2hydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0MThiODIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL3NjeDIwMF9ocnQuYwpAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBKaW0gQ3JvbWllCisgKgorICogVGhpcyBpcyBhIGNsb2Nrc291cmNlIGRyaXZlciBmb3IgdGhlIEdlb2RlIFNDeDIwMCdzIDEgb3IgMjcgTUh6CisgKiBoaWdoLXJlc29sdXRpb24gdGltZXIuICBUaGUgR2VvZGUgU0MtMTEwMCAoYXQgbGVhc3QpIGhhcyBhIGJ1Z2d5CisgKiB0aW1lIHN0YW1wIGNvdW50ZXIgKFRTQyksIHdoaWNoIGxvc2VzIHRpbWUgdW5sZXNzICdpZGxlPXBvbGwnIGlzCisgKiBnaXZlbiBhcyBhIGJvb3QtYXJnLiBJbiBpdHMgYWJzZW5jZSwgdGhlIEdlbmVyaWMgVGltZWtlZXBpbmcgY29kZQorICogd2lsbCBkZXRlY3QgYW5kIGRlLXJhdGUgdGhlIGJhZCBUU0MsIGFsbG93aW5nIHRoaXMgdGltZXIgdG8gdGFrZQorICogb3ZlciB0aW1la2VlcGluZyBkdXRpZXMuCisgKgorICogQmFzZWQgb24gd29yayBieSBKb2huIFN0dWx0eiwgYW5kIFRlZCBQaGVscHMgKGluIGEgMi42LjEyLXJjNiBwYXRjaCkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jbG9ja3NvdXJjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY3gyMDAuaD4KKworI2RlZmluZSBOQU1FICJzY3gyMDBfaHJ0IgorCitzdGF0aWMgaW50IG1oejI3OworbW9kdWxlX3BhcmFtKG1oejI3LCBpbnQsIDApOwkvKiBsb2FkIHRpbWUgb25seSAqLworTU9EVUxFX1BBUk1fREVTQyhtaHoyNywgImNvdW50IGF0IDI3LjAgTUh6IChkZWZhdWx0IGlzIDEuMCBNSHopIik7CisKK3N0YXRpYyBpbnQgcHBtOworbW9kdWxlX3BhcmFtKHBwbSwgaW50LCAwKTsJLyogbG9hZCB0aW1lIG9ubHkgKi8KK01PRFVMRV9QQVJNX0RFU0MocHBtLCAiKy1hZGp1c3QgdG8gYWN0dWFsIFhPIGZyZXEgKHBwbSkiKTsKKworLyogSGlSZXMgVGltZXIgY29uZmlndXJhdGlvbiByZWdpc3RlciBhZGRyZXNzICovCisjZGVmaW5lIFNDeDIwMF9UTUNORkdfT0ZGU0VUIChTQ3gyMDBfVElNRVJfT0ZGU0VUICsgNSkKKworLyogYW5kIGNvbmZpZyBzZXR0aW5ncyAqLworI2RlZmluZSBIUl9UTUVOICgxIDw8IDApCS8qIHRpbWVyIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgSFJfVE1DTEtTRUwgKDEgPDwgMSkJLyogMXwwIGNvdW50cyBhdCAyN3wxIE1IeiAqLworI2RlZmluZSBIUl9UTTI3TVBEICgxIDw8IDIpCS8qIDEgdHVybnMgb2ZmIGlucHV0IGNsb2NrIChwb3dlci1kb3duKSAqLworCisvKiBUaGUgYmFzZSB0aW1lciBmcmVxdWVuY3ksICogMjcgaWYgc2VsZWN0ZWQgKi8KKyNkZWZpbmUgSFJUX0ZSRVEgICAxMDAwMDAwCisKK3N0YXRpYyBjeWNsZV90IHJlYWRfaHJ0KHZvaWQpCit7CisJLyogUmVhZCB0aGUgdGltZXIgdmFsdWUgKi8KKwlyZXR1cm4gKGN5Y2xlX3QpIGlubChzY3gyMDBfY2JfYmFzZSArIFNDeDIwMF9USU1FUl9PRkZTRVQpOworfQorCisjZGVmaW5lIEhSVF9TSElGVF8xCTIyCisjZGVmaW5lIEhSVF9TSElGVF8yNwkyNgorCitzdGF0aWMgc3RydWN0IGNsb2Nrc291cmNlIGNzX2hydCA9IHsKKwkubmFtZQkJPSAic2N4MjAwX2hydCIsCisJLnJhdGluZwkJPSAyNTAsCisJLnJlYWQJCT0gcmVhZF9ocnQsCisJLm1hc2sJCT0gQ0xPQ0tTT1VSQ0VfTUFTSygzMiksCisJLmlzX2NvbnRpbnVvdXMJPSAxLAorCS8qIG11bHQsIHNoaWZ0IGFyZSBzZXQgYmFzZWQgb24gbWh6MjcgZmxhZyAqLworfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9ocnRfY2xvY2tzb3VyY2Uodm9pZCkKK3sKKwkvKiBNYWtlIHN1cmUgc2N4MjAwIGhhcyBpbml0aWFsaXplZGQgdGhlIGNvbmZpZ3VyYXRpb24gYmxvY2sgKi8KKwlpZiAoIXNjeDIwMF9jYl9wcmVzZW50KCkpCisJCXJldHVybiAtRU5PREVWOworCisJLyogUmVzZXJ2ZSB0aGUgdGltZXIncyBJU0EgaW8tcmVnaW9uIGZvciBvdXJzZWx2ZXMgKi8KKwlpZiAoIXJlcXVlc3RfcmVnaW9uKHNjeDIwMF9jYl9iYXNlICsgU0N4MjAwX1RJTUVSX09GRlNFVCwKKwkJCSAgICBTQ3gyMDBfVElNRVJfU0laRSwKKwkJCSAgICAiTmF0U2VtaSBTQ3gyMDAgSGlnaC1SZXNvbHV0aW9uIFRpbWVyIikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBOQU1FICI6IHVuYWJsZSB0byBsb2NrIHRpbWVyIHJlZ2lvblxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIHdyaXRlIHRpbWVyIGNvbmZpZyAqLworCW91dGIoSFJfVE1FTiB8IChtaHoyNykgPyBIUl9UTUNMS1NFTCA6IDAsCisJICAgICBzY3gyMDBfY2JfYmFzZSArIFNDeDIwMF9UTUNORkdfT0ZGU0VUKTsKKworCWlmIChtaHoyNykgeworCQljc19ocnQuc2hpZnQgPSBIUlRfU0hJRlRfMjc7CisJCWNzX2hydC5tdWx0ID0gY2xvY2tzb3VyY2VfaHoybXVsdCgoSFJUX0ZSRVEgKyBwcG0pICogMjcsCisJCQkJCQkgIGNzX2hydC5zaGlmdCk7CisJfSBlbHNlIHsKKwkJY3NfaHJ0LnNoaWZ0ID0gSFJUX1NISUZUXzE7CisJCWNzX2hydC5tdWx0ID0gY2xvY2tzb3VyY2VfaHoybXVsdChIUlRfRlJFUSArIHBwbSwKKwkJCQkJCSAgY3NfaHJ0LnNoaWZ0KTsKKwl9CisJcHJpbnRrKEtFUk5fSU5GTyAiZW5hYmxpbmcgc2N4MjAwIGhpZ2gtcmVzIHRpbWVyICglcyBNSHogKyVkIHBwbSlcbiIsCisJCW1oejI3ID8gIjI3IjoiMSIsIHBwbSk7CisKKwlyZXR1cm4gY2xvY2tzb3VyY2VfcmVnaXN0ZXIoJmNzX2hydCk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfaHJ0X2Nsb2Nrc291cmNlKTsKKworTU9EVUxFX0FVVEhPUigiSmltIENyb21pZSA8amltLmNyb21pZUBnbWFpbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oImNsb2Nrc291cmNlIG9uIFNDeDIwMCBIaVJlcyBUaW1lciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcnlwdG8vcGFkbG9jay1hZXMuYyBiL2RyaXZlcnMvY3J5cHRvL3BhZGxvY2stYWVzLmMKaW5kZXggNTE1OGE5ZC4uMTdlZTY4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcnlwdG8vcGFkbG9jay1hZXMuYworKysgYi9kcml2ZXJzL2NyeXB0by9wYWRsb2NrLWFlcy5jCkBAIC02MCwxNSArNjAsMTQgQEAKICNkZWZpbmUgQUVTX0VYVEVOREVEX0tFWV9TSVpFX0IJKEFFU19FWFRFTkRFRF9LRVlfU0laRSAqIHNpemVvZih1aW50MzJfdCkpCiAKIHN0cnVjdCBhZXNfY3R4IHsKLQl1aW50MzJfdCBlX2RhdGFbQUVTX0VYVEVOREVEX0tFWV9TSVpFXTsKLQl1aW50MzJfdCBkX2RhdGFbQUVTX0VYVEVOREVEX0tFWV9TSVpFXTsKIAlzdHJ1Y3QgewogCQlzdHJ1Y3QgY3dvcmQgZW5jcnlwdDsKIAkJc3RydWN0IGN3b3JkIGRlY3J5cHQ7CiAJfSBjd29yZDsKLQl1aW50MzJfdCAqRTsKLQl1aW50MzJfdCAqRDsKKwl1MzIgKkQ7CiAJaW50IGtleV9sZW5ndGg7CisJdTMyIEVbQUVTX0VYVEVOREVEX0tFWV9TSVpFXTsKKwl1MzIgZF9kYXRhW0FFU19FWFRFTkRFRF9LRVlfU0laRV07CiB9OwogCiAvKiA9PT09PT0gS2V5IG1hbmFnZW1lbnQgcm91dGluZXMgPT09PT09ICovCkBAIC0yODIsMTkgKzI4MSwyMCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBhZXNfY3R4ICphZXNfY3R4KHZvaWQgKmN0eCkKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGFlc19jdHggKmFlc19jdHgoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKIHsKKwl1bnNpZ25lZCBsb25nIGFkZHIgPSAodW5zaWduZWQgbG9uZyljcnlwdG9fdGZtX2N0eCh0Zm0pOwogCXVuc2lnbmVkIGxvbmcgYWxpZ24gPSBQQURMT0NLX0FMSUdOTUVOVDsKIAogCWlmIChhbGlnbiA8PSBjcnlwdG9fdGZtX2N0eF9hbGlnbm1lbnQoKSkKIAkJYWxpZ24gPSAxOwotCXJldHVybiAoc3RydWN0IGFlc19jdHggKilBTElHTigodW5zaWduZWQgbG9uZyljdHgsIGFsaWduKTsKKwlyZXR1cm4gKHN0cnVjdCBhZXNfY3R4ICopQUxJR04oYWRkciwgYWxpZ24pOwogfQogCi1zdGF0aWMgaW50Ci1hZXNfc2V0X2tleSh2b2lkICpjdHhfYXJnLCBjb25zdCB1aW50OF90ICppbl9rZXksIHVuc2lnbmVkIGludCBrZXlfbGVuLCB1aW50MzJfdCAqZmxhZ3MpCitzdGF0aWMgaW50IGFlc19zZXRfa2V5KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIGNvbnN0IHU4ICppbl9rZXksCisJCSAgICAgICB1bnNpZ25lZCBpbnQga2V5X2xlbiwgdTMyICpmbGFncykKIHsKLQlzdHJ1Y3QgYWVzX2N0eCAqY3R4ID0gYWVzX2N0eChjdHhfYXJnKTsKKwlzdHJ1Y3QgYWVzX2N0eCAqY3R4ID0gYWVzX2N0eCh0Zm0pOwogCWNvbnN0IF9fbGUzMiAqa2V5ID0gKGNvbnN0IF9fbGUzMiAqKWluX2tleTsKIAl1aW50MzJfdCBpLCB0LCB1LCB2LCB3OwogCXVpbnQzMl90IFBbQUVTX0VYVEVOREVEX0tFWV9TSVpFXTsKQEAgLTMxMiw4ICszMTIsNyBAQAogCSAqIGl0c2VsZiB3ZSBtdXN0IHN1cHBseSB0aGUgcGxhaW4ga2V5IGZvciBib3RoIGVuY3J5cHRpb24KIAkgKiBhbmQgZGVjcnlwdGlvbi4KIAkgKi8KLQljdHgtPkUgPSBjdHgtPmVfZGF0YTsKLQljdHgtPkQgPSBjdHgtPmVfZGF0YTsKKwljdHgtPkQgPSBjdHgtPkU7CiAKIAlFX0tFWVswXSA9IGxlMzJfdG9fY3B1KGtleVswXSk7CiAJRV9LRVlbMV0gPSBsZTMyX3RvX2NwdShrZXlbMV0pOwpAQCAtNDE0LDI0ICs0MTMsMjIgQEAKIAlyZXR1cm4gaXY7CiB9CiAKLXN0YXRpYyB2b2lkCi1hZXNfZW5jcnlwdCh2b2lkICpjdHhfYXJnLCB1aW50OF90ICpvdXQsIGNvbnN0IHVpbnQ4X3QgKmluKQorc3RhdGljIHZvaWQgYWVzX2VuY3J5cHQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKm91dCwgY29uc3QgdTggKmluKQogewotCXN0cnVjdCBhZXNfY3R4ICpjdHggPSBhZXNfY3R4KGN0eF9hcmcpOworCXN0cnVjdCBhZXNfY3R4ICpjdHggPSBhZXNfY3R4KHRmbSk7CiAJcGFkbG9ja194Y3J5cHRfZWNiKGluLCBvdXQsIGN0eC0+RSwgJmN0eC0+Y3dvcmQuZW5jcnlwdCwgMSk7CiB9CiAKLXN0YXRpYyB2b2lkCi1hZXNfZGVjcnlwdCh2b2lkICpjdHhfYXJnLCB1aW50OF90ICpvdXQsIGNvbnN0IHVpbnQ4X3QgKmluKQorc3RhdGljIHZvaWQgYWVzX2RlY3J5cHQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKm91dCwgY29uc3QgdTggKmluKQogewotCXN0cnVjdCBhZXNfY3R4ICpjdHggPSBhZXNfY3R4KGN0eF9hcmcpOworCXN0cnVjdCBhZXNfY3R4ICpjdHggPSBhZXNfY3R4KHRmbSk7CiAJcGFkbG9ja194Y3J5cHRfZWNiKGluLCBvdXQsIGN0eC0+RCwgJmN0eC0+Y3dvcmQuZGVjcnlwdCwgMSk7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgYWVzX2VuY3J5cHRfZWNiKGNvbnN0IHN0cnVjdCBjaXBoZXJfZGVzYyAqZGVzYywgdTggKm91dCwKIAkJCQkgICAgY29uc3QgdTggKmluLCB1bnNpZ25lZCBpbnQgbmJ5dGVzKQogewotCXN0cnVjdCBhZXNfY3R4ICpjdHggPSBhZXNfY3R4KGNyeXB0b190Zm1fY3R4KGRlc2MtPnRmbSkpOworCXN0cnVjdCBhZXNfY3R4ICpjdHggPSBhZXNfY3R4KGRlc2MtPnRmbSk7CiAJcGFkbG9ja194Y3J5cHRfZWNiKGluLCBvdXQsIGN0eC0+RSwgJmN0eC0+Y3dvcmQuZW5jcnlwdCwKIAkJCSAgIG5ieXRlcyAvIEFFU19CTE9DS19TSVpFKTsKIAlyZXR1cm4gbmJ5dGVzICYgfihBRVNfQkxPQ0tfU0laRSAtIDEpOwpAQCAtNDQwLDcgKzQzNyw3IEBACiBzdGF0aWMgdW5zaWduZWQgaW50IGFlc19kZWNyeXB0X2VjYihjb25zdCBzdHJ1Y3QgY2lwaGVyX2Rlc2MgKmRlc2MsIHU4ICpvdXQsCiAJCQkJICAgIGNvbnN0IHU4ICppbiwgdW5zaWduZWQgaW50IG5ieXRlcykKIHsKLQlzdHJ1Y3QgYWVzX2N0eCAqY3R4ID0gYWVzX2N0eChjcnlwdG9fdGZtX2N0eChkZXNjLT50Zm0pKTsKKwlzdHJ1Y3QgYWVzX2N0eCAqY3R4ID0gYWVzX2N0eChkZXNjLT50Zm0pOwogCXBhZGxvY2tfeGNyeXB0X2VjYihpbiwgb3V0LCBjdHgtPkQsICZjdHgtPmN3b3JkLmRlY3J5cHQsCiAJCQkgICBuYnl0ZXMgLyBBRVNfQkxPQ0tfU0laRSk7CiAJcmV0dXJuIG5ieXRlcyAmIH4oQUVTX0JMT0NLX1NJWkUgLSAxKTsKQEAgLTQ0OSw3ICs0NDYsNyBAQAogc3RhdGljIHVuc2lnbmVkIGludCBhZXNfZW5jcnlwdF9jYmMoY29uc3Qgc3RydWN0IGNpcGhlcl9kZXNjICpkZXNjLCB1OCAqb3V0LAogCQkJCSAgICBjb25zdCB1OCAqaW4sIHVuc2lnbmVkIGludCBuYnl0ZXMpCiB7Ci0Jc3RydWN0IGFlc19jdHggKmN0eCA9IGFlc19jdHgoY3J5cHRvX3RmbV9jdHgoZGVzYy0+dGZtKSk7CisJc3RydWN0IGFlc19jdHggKmN0eCA9IGFlc19jdHgoZGVzYy0+dGZtKTsKIAl1OCAqaXY7CiAKIAlpdiA9IHBhZGxvY2tfeGNyeXB0X2NiYyhpbiwgb3V0LCBjdHgtPkUsIGRlc2MtPmluZm8sCkBAIC00NjIsNyArNDU5LDcgQEAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgYWVzX2RlY3J5cHRfY2JjKGNvbnN0IHN0cnVjdCBjaXBoZXJfZGVzYyAqZGVzYywgdTggKm91dCwKIAkJCQkgICAgY29uc3QgdTggKmluLCB1bnNpZ25lZCBpbnQgbmJ5dGVzKQogewotCXN0cnVjdCBhZXNfY3R4ICpjdHggPSBhZXNfY3R4KGNyeXB0b190Zm1fY3R4KGRlc2MtPnRmbSkpOworCXN0cnVjdCBhZXNfY3R4ICpjdHggPSBhZXNfY3R4KGRlc2MtPnRmbSk7CiAJcGFkbG9ja194Y3J5cHRfY2JjKGluLCBvdXQsIGN0eC0+RCwgZGVzYy0+aW5mbywgJmN0eC0+Y3dvcmQuZGVjcnlwdCwKIAkJCSAgIG5ieXRlcyAvIEFFU19CTE9DS19TSVpFKTsKIAlyZXR1cm4gbmJ5dGVzICYgfihBRVNfQkxPQ0tfU0laRSAtIDEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvaW9hdGRtYS5jIGIvZHJpdmVycy9kbWEvaW9hdGRtYS5jCmluZGV4IDBmZGY3ZmIuLjI4MDFkMTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL2lvYXRkbWEuYworKysgYi9kcml2ZXJzL2RtYS9pb2F0ZG1hLmMKQEAgLTgyNCwxMCArODI0LDkgQEAKIHsKIAkvKiBpdCdzIGN1cnJlbnRseSB1bnNhZmUgdG8gdW5sb2FkIHRoaXMgbW9kdWxlICovCiAJLyogaWYgZm9yY2VkLCB3b3JzdCBjYXNlIGlzIHRoYXQgcm1tb2QgaGFuZ3MgKi8KLQlpZiAoVEhJU19NT0RVTEUgIT0gTlVMTCkKLQkJVEhJU19NT0RVTEUtPnVuc2FmZSA9IDE7CisJX191bnNhZmUoVEhJU19NT0RVTEUpOwogCi0JcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmaW9hdF9wY2lfZHJ2KTsKKwlwY2lfbW9kdWxlX2luaXQoJmlvYXRfcGNpX2Rydik7CiB9CiAKIG1vZHVsZV9pbml0KGlvYXRfaW5pdF9tb2R1bGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9LY29uZmlnIGIvZHJpdmVycy9maXJtd2FyZS9LY29uZmlnCmluZGV4IDFlMzcxYTUuLjczMWMzZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlybXdhcmUvS2NvbmZpZworKysgYi9kcml2ZXJzL2Zpcm13YXJlL0tjb25maWcKQEAgLTYsOCArNiw3IEBACiBtZW51ICJGaXJtd2FyZSBEcml2ZXJzIgogCiBjb25maWcgRURECi0JdHJpc3RhdGUgIkJJT1MgRW5oYW5jZWQgRGlzayBEcml2ZSBjYWxscyBkZXRlcm1pbmUgYm9vdCBkaXNrIChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCisJdHJpc3RhdGUgIkJJT1MgRW5oYW5jZWQgRGlzayBEcml2ZSBjYWxscyBkZXRlcm1pbmUgYm9vdCBkaXNrIgogCWRlcGVuZHMgb24gIUlBNjQKIAloZWxwCiAJICBTYXkgWSBvciBNIGhlcmUgaWYgeW91IHdhbnQgdG8gZW5hYmxlIEJJT1MgRW5oYW5jZWQgRGlzayBEcml2ZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9kbWlfc2Nhbi5jIGIvZHJpdmVycy9maXJtd2FyZS9kbWlfc2Nhbi5jCmluZGV4IDk0OGJkN2UuLmI5ZTM4ODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlybXdhcmUvZG1pX3NjYW4uYworKysgYi9kcml2ZXJzL2Zpcm13YXJlL2RtaV9zY2FuLmMKQEAgLTI1NSwxMCArMjU1LDE1IEBACiAvKioKICAqCWRtaV9jaGVja19zeXN0ZW0gLSBjaGVjayBzeXN0ZW0gRE1JIGRhdGEKICAqCUBsaXN0OiBhcnJheSBvZiBkbWlfc3lzdGVtX2lkIHN0cnVjdHVyZXMgdG8gbWF0Y2ggYWdhaW5zdAorICoJCUFsbCBub24tbnVsbCBlbGVtZW50cyBvZiB0aGUgbGlzdCBtdXN0IG1hdGNoCisgKgkJdGhlaXIgc2xvdCdzIChmaWVsZCBpbmRleCdzKSBkYXRhIChpLmUuLCBlYWNoCisgKgkJbGlzdCBzdHJpbmcgbXVzdCBiZSBhIHN1YnN0cmluZyBvZiB0aGUgc3BlY2lmaWVkCisgKgkJRE1JIHNsb3QncyBzdHJpbmcgZGF0YSkgdG8gYmUgY29uc2lkZXJlZCBhCisgKgkJc3VjY2Vzc2Z1bCBtYXRjaC4KICAqCiAgKglXYWxrIHRoZSBibGFja2xpc3QgdGFibGUgcnVubmluZyBtYXRjaGluZyBmdW5jdGlvbnMgdW50aWwgc29tZW9uZQogICoJcmV0dXJucyBub24gemVybyBvciB3ZSBoaXQgdGhlIGVuZC4gQ2FsbGJhY2sgZnVuY3Rpb24gaXMgY2FsbGVkIGZvcgotICoJZWFjaCBzdWNjZXNzZnVsbCBtYXRjaC4gUmV0dXJucyB0aGUgbnVtYmVyIG9mIG1hdGNoZXMuCisgKgllYWNoIHN1Y2Nlc3NmdWwgbWF0Y2guIFJldHVybnMgdGhlIG51bWJlciBvZiBtYXRjaGVzLgogICovCiBpbnQgZG1pX2NoZWNrX3N5c3RlbShzdHJ1Y3QgZG1pX3N5c3RlbV9pZCAqbGlzdCkKIHsKQEAgLTI4Nyw3ICsyOTIsNyBAQAogCiAvKioKICAqCWRtaV9nZXRfc3lzdGVtX2luZm8gLSByZXR1cm4gRE1JIGRhdGEgdmFsdWUKLSAqCUBmaWVsZDogZGF0YSBpbmRleCAoc2VlIGVudW0gZG1pX2ZpbGVkKQorICoJQGZpZWxkOiBkYXRhIGluZGV4IChzZWUgZW51bSBkbWlfZmllbGQpCiAgKgogICoJUmV0dXJucyBvbmUgRE1JIGRhdGEgdmFsdWUsIGNhbiBiZSB1c2VkIHRvIHBlcmZvcm0KICAqCWNvbXBsZXggRE1JIGRhdGEgY2hlY2tzLgpAQCAtMzAxLDEzICszMDYsMTMgQEAKIC8qKgogICoJZG1pX2ZpbmRfZGV2aWNlIC0gZmluZCBvbmJvYXJkIGRldmljZSBieSB0eXBlL25hbWUKICAqCUB0eXBlOiBkZXZpY2UgdHlwZSBvciAlRE1JX0RFVl9UWVBFX0FOWSB0byBtYXRjaCBhbGwgZGV2aWNlIHR5cGVzCi0gKglAZGVzYzogZGV2aWNlIG5hbWUgc3RyaW5nIG9yICVOVUxMIHRvIG1hdGNoIGFsbAorICoJQG5hbWU6IGRldmljZSBuYW1lIHN0cmluZyBvciAlTlVMTCB0byBtYXRjaCBhbGwKICAqCUBmcm9tOiBwcmV2aW91cyBkZXZpY2UgZm91bmQgaW4gc2VhcmNoLCBvciAlTlVMTCBmb3IgbmV3IHNlYXJjaC4KICAqCiAgKglJdGVyYXRlcyB0aHJvdWdoIHRoZSBsaXN0IG9mIGtub3duIG9uYm9hcmQgZGV2aWNlcy4gSWYgYSBkZXZpY2UgaXMKICAqCWZvdW5kIHdpdGggYSBtYXRjaGluZyBAdmVuZG9yIGFuZCBAZGV2aWNlLCBhIHBvaW50ZXIgdG8gaXRzIGRldmljZQogICoJc3RydWN0dXJlIGlzIHJldHVybmVkLiAgT3RoZXJ3aXNlLCAlTlVMTCBpcyByZXR1cm5lZC4KLSAqCUEgbmV3IHNlYXJjaCBpcyBpbml0aWF0ZWQgYnkgcGFzc2luZyAlTlVMTCB0byB0aGUgQGZyb20gYXJndW1lbnQuCisgKglBIG5ldyBzZWFyY2ggaXMgaW5pdGlhdGVkIGJ5IHBhc3NpbmcgJU5VTEwgYXMgdGhlIEBmcm9tIGFyZ3VtZW50LgogICoJSWYgQGZyb20gaXMgbm90ICVOVUxMLCBzZWFyY2hlcyBjb250aW51ZSBmcm9tIG5leHQgZGV2aWNlLgogICovCiBzdHJ1Y3QgZG1pX2RldmljZSAqIGRtaV9maW5kX2RldmljZShpbnQgdHlwZSwgY29uc3QgY2hhciAqbmFtZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vYXNiMTAwLmMgYi9kcml2ZXJzL2h3bW9uL2FzYjEwMC5jCmluZGV4IDY1YjI3MDkuLmZhY2MxY2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vYXNiMTAwLmMKKysrIGIvZHJpdmVycy9od21vbi9hc2IxMDAuYwpAQCAtMzQxLDcgKzM0MSw3IEBACiAKIC8qIE5vdGU6IHdlIHNhdmUgYW5kIHJlc3RvcmUgdGhlIGZhbiBtaW5pbXVtIGhlcmUsIGJlY2F1c2UgaXRzIHZhbHVlIGlzCiAgICBkZXRlcm1pbmVkIGluIHBhcnQgYnkgdGhlIGZhbiBkaXZpc29yLiAgVGhpcyBmb2xsb3dzIHRoZSBwcmluY2lwbGUgb2YKLSAgIGxlYXN0IHN1cHJpc2U7IHRoZSB1c2VyIGRvZXNuJ3QgZXhwZWN0IHRoZSBmYW4gbWluaW11bSB0byBjaGFuZ2UganVzdAorICAgbGVhc3Qgc3VycHJpc2U7IHRoZSB1c2VyIGRvZXNuJ3QgZXhwZWN0IHRoZSBmYW4gbWluaW11bSB0byBjaGFuZ2UganVzdAogICAgYmVjYXVzZSB0aGUgZGl2aXNvciBjaGFuZ2VkLiAqLwogc3RhdGljIHNzaXplX3Qgc2V0X2Zhbl9kaXYoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsCiAJCQkJc2l6ZV90IGNvdW50LCBpbnQgbnIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2xtNzguYyBiL2RyaXZlcnMvaHdtb24vbG03OC5jCmluZGV4IDk0YmUzZDcuLmE2Y2U3YWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vbG03OC5jCisrKyBiL2RyaXZlcnMvaHdtb24vbG03OC5jCkBAIC0zNTgsNyArMzU4LDcgQEAKIAogLyogTm90ZTogd2Ugc2F2ZSBhbmQgcmVzdG9yZSB0aGUgZmFuIG1pbmltdW0gaGVyZSwgYmVjYXVzZSBpdHMgdmFsdWUgaXMKICAgIGRldGVybWluZWQgaW4gcGFydCBieSB0aGUgZmFuIGRpdmlzb3IuICBUaGlzIGZvbGxvd3MgdGhlIHByaW5jaXBsZSBvZgotICAgbGVhc3Qgc3VwcmlzZTsgdGhlIHVzZXIgZG9lc24ndCBleHBlY3QgdGhlIGZhbiBtaW5pbXVtIHRvIGNoYW5nZSBqdXN0CisgICBsZWFzdCBzdXJwcmlzZTsgdGhlIHVzZXIgZG9lc24ndCBleHBlY3QgdGhlIGZhbiBtaW5pbXVtIHRvIGNoYW5nZSBqdXN0CiAgICBiZWNhdXNlIHRoZSBkaXZpc29yIGNoYW5nZWQuICovCiBzdGF0aWMgc3NpemVfdCBzZXRfZmFuX2RpdihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwKIAlzaXplX3QgY291bnQsIGludCBucikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vbG04MC5jIGIvZHJpdmVycy9od21vbi9sbTgwLmMKaW5kZXggZjcyMTIwZC4uYjRjY2RmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9sbTgwLmMKKysrIGIvZHJpdmVycy9od21vbi9sbTgwLmMKQEAgLTI1Myw3ICsyNTMsNyBAQAogCiAvKiBOb3RlOiB3ZSBzYXZlIGFuZCByZXN0b3JlIHRoZSBmYW4gbWluaW11bSBoZXJlLCBiZWNhdXNlIGl0cyB2YWx1ZSBpcwogICAgZGV0ZXJtaW5lZCBpbiBwYXJ0IGJ5IHRoZSBmYW4gZGl2aXNvci4gIFRoaXMgZm9sbG93cyB0aGUgcHJpbmNpcGxlIG9mCi0gICBsZWFzdCBzdXByaXNlOyB0aGUgdXNlciBkb2Vzbid0IGV4cGVjdCB0aGUgZmFuIG1pbmltdW0gdG8gY2hhbmdlIGp1c3QKKyAgIGxlYXN0IHN1cnByaXNlOyB0aGUgdXNlciBkb2Vzbid0IGV4cGVjdCB0aGUgZmFuIG1pbmltdW0gdG8gY2hhbmdlIGp1c3QKICAgIGJlY2F1c2UgdGhlIGRpdmlzb3IgY2hhbmdlZC4gKi8KIHN0YXRpYyBzc2l6ZV90IHNldF9mYW5fZGl2KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLAogCXNpemVfdCBjb3VudCwgaW50IG5yKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9sbTg3LmMgYi9kcml2ZXJzL2h3bW9uL2xtODcuYwppbmRleCBlMjI5ZGFmLi5lNmMxYjYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2xtODcuYworKysgYi9kcml2ZXJzL2h3bW9uL2xtODcuYwpAQCAtNDIxLDcgKzQyMSw3IEBACiAKIC8qIE5vdGU6IHdlIHNhdmUgYW5kIHJlc3RvcmUgdGhlIGZhbiBtaW5pbXVtIGhlcmUsIGJlY2F1c2UgaXRzIHZhbHVlIGlzCiAgICBkZXRlcm1pbmVkIGluIHBhcnQgYnkgdGhlIGZhbiBjbG9jayBkaXZpZGVyLiAgVGhpcyBmb2xsb3dzIHRoZSBwcmluY2lwbGUKLSAgIG9mIGxlYXN0IHN1cHJpc2U7IHRoZSB1c2VyIGRvZXNuJ3QgZXhwZWN0IHRoZSBmYW4gbWluaW11bSB0byBjaGFuZ2UganVzdAorICAgb2YgbGVhc3Qgc3VycHJpc2U7IHRoZSB1c2VyIGRvZXNuJ3QgZXhwZWN0IHRoZSBmYW4gbWluaW11bSB0byBjaGFuZ2UganVzdAogICAgYmVjYXVzZSB0aGUgZGl2aWRlciBjaGFuZ2VkLiAqLwogc3RhdGljIHNzaXplX3Qgc2V0X2Zhbl9kaXYoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsCiAJCXNpemVfdCBjb3VudCwgaW50IG5yKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9zaXM1NTk1LmMgYi9kcml2ZXJzL2h3bW9uL3NpczU1OTUuYwppbmRleCA2ZjNmZGE3Li4wNjNmNzFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3NpczU1OTUuYworKysgYi9kcml2ZXJzL2h3bW9uL3NpczU1OTUuYwpAQCAtMzgwLDcgKzM4MCw3IEBACiAKIC8qIE5vdGU6IHdlIHNhdmUgYW5kIHJlc3RvcmUgdGhlIGZhbiBtaW5pbXVtIGhlcmUsIGJlY2F1c2UgaXRzIHZhbHVlIGlzCiAgICBkZXRlcm1pbmVkIGluIHBhcnQgYnkgdGhlIGZhbiBkaXZpc29yLiAgVGhpcyBmb2xsb3dzIHRoZSBwcmluY2lwbGUgb2YKLSAgIGxlYXN0IHN1cHJpc2U7IHRoZSB1c2VyIGRvZXNuJ3QgZXhwZWN0IHRoZSBmYW4gbWluaW11bSB0byBjaGFuZ2UganVzdAorICAgbGVhc3Qgc3VycHJpc2U7IHRoZSB1c2VyIGRvZXNuJ3QgZXhwZWN0IHRoZSBmYW4gbWluaW11bSB0byBjaGFuZ2UganVzdAogICAgYmVjYXVzZSB0aGUgZGl2aXNvciBjaGFuZ2VkLiAqLwogc3RhdGljIHNzaXplX3Qgc2V0X2Zhbl9kaXYoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsCiAJc2l6ZV90IGNvdW50LCBpbnQgbnIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3Ntc2M0N20xLmMgYi9kcml2ZXJzL2h3bW9uL3Ntc2M0N20xLmMKaW5kZXggNzczMmFlYy4uODI1ZThmNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9zbXNjNDdtMS5jCisrKyBiL2RyaXZlcnMvaHdtb24vc21zYzQ3bTEuYwpAQCAtMjA3LDcgKzIwNyw3IEBACiAKIC8qIE5vdGU6IHdlIHNhdmUgYW5kIHJlc3RvcmUgdGhlIGZhbiBtaW5pbXVtIGhlcmUsIGJlY2F1c2UgaXRzIHZhbHVlIGlzCiAgICBkZXRlcm1pbmVkIGluIHBhcnQgYnkgdGhlIGZhbiBjbG9jayBkaXZpZGVyLiAgVGhpcyBmb2xsb3dzIHRoZSBwcmluY2lwbGUKLSAgIG9mIGxlYXN0IHN1cHJpc2U7IHRoZSB1c2VyIGRvZXNuJ3QgZXhwZWN0IHRoZSBmYW4gbWluaW11bSB0byBjaGFuZ2UganVzdAorICAgb2YgbGVhc3Qgc3VycHJpc2U7IHRoZSB1c2VyIGRvZXNuJ3QgZXhwZWN0IHRoZSBmYW4gbWluaW11bSB0byBjaGFuZ2UganVzdAogICAgYmVjYXVzZSB0aGUgZGl2aWRlciBjaGFuZ2VkLiAqLwogc3RhdGljIHNzaXplX3Qgc2V0X2Zhbl9kaXYoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsCiAJCXNpemVfdCBjb3VudCwgaW50IG5yKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi93ODM2MjdoZi5jIGIvZHJpdmVycy9od21vbi93ODM2MjdoZi5jCmluZGV4IDcxZmI3ZjEuLjc5MzY4ZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vdzgzNjI3aGYuYworKysgYi9kcml2ZXJzL2h3bW9uL3c4MzYyN2hmLmMKQEAgLTc4MSw3ICs3ODEsNyBAQAogCiAvKiBOb3RlOiB3ZSBzYXZlIGFuZCByZXN0b3JlIHRoZSBmYW4gbWluaW11bSBoZXJlLCBiZWNhdXNlIGl0cyB2YWx1ZSBpcwogICAgZGV0ZXJtaW5lZCBpbiBwYXJ0IGJ5IHRoZSBmYW4gZGl2aXNvci4gIFRoaXMgZm9sbG93cyB0aGUgcHJpbmNpcGxlIG9mCi0gICBsZWFzdCBzdXByaXNlOyB0aGUgdXNlciBkb2Vzbid0IGV4cGVjdCB0aGUgZmFuIG1pbmltdW0gdG8gY2hhbmdlIGp1c3QKKyAgIGxlYXN0IHN1cnByaXNlOyB0aGUgdXNlciBkb2Vzbid0IGV4cGVjdCB0aGUgZmFuIG1pbmltdW0gdG8gY2hhbmdlIGp1c3QKICAgIGJlY2F1c2UgdGhlIGRpdmlzb3IgY2hhbmdlZC4gKi8KIHN0YXRpYyBzc2l6ZV90CiBzdG9yZV9mYW5fZGl2X3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBpbnQgbnIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3c4Mzc4MWQuYyBiL2RyaXZlcnMvaHdtb24vdzgzNzgxZC5jCmluZGV4IGU0YzcwMDMuLjdiZTQ2OWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vdzgzNzgxZC5jCisrKyBiL2RyaXZlcnMvaHdtb24vdzgzNzgxZC5jCkBAIC02MzAsNyArNjMwLDcgQEAKIAogLyogTm90ZTogd2Ugc2F2ZSBhbmQgcmVzdG9yZSB0aGUgZmFuIG1pbmltdW0gaGVyZSwgYmVjYXVzZSBpdHMgdmFsdWUgaXMKICAgIGRldGVybWluZWQgaW4gcGFydCBieSB0aGUgZmFuIGRpdmlzb3IuICBUaGlzIGZvbGxvd3MgdGhlIHByaW5jaXBsZSBvZgotICAgbGVhc3Qgc3VwcmlzZTsgdGhlIHVzZXIgZG9lc24ndCBleHBlY3QgdGhlIGZhbiBtaW5pbXVtIHRvIGNoYW5nZSBqdXN0CisgICBsZWFzdCBzdXJwcmlzZTsgdGhlIHVzZXIgZG9lc24ndCBleHBlY3QgdGhlIGZhbiBtaW5pbXVtIHRvIGNoYW5nZSBqdXN0CiAgICBiZWNhdXNlIHRoZSBkaXZpc29yIGNoYW5nZWQuICovCiBzdGF0aWMgc3NpemVfdAogc3RvcmVfZmFuX2Rpdl9yZWcoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwgaW50IG5yKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi93ODM3OTJkLmMgYi9kcml2ZXJzL2h3bW9uL3c4Mzc5MmQuYwppbmRleCA0ZWY4ODRjLi5lNDA3Yzc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3c4Mzc5MmQuYworKysgYi9kcml2ZXJzL2h3bW9uL3c4Mzc5MmQuYwpAQCAtNDYzLDcgKzQ2Myw3IEBACiAKIC8qIE5vdGU6IHdlIHNhdmUgYW5kIHJlc3RvcmUgdGhlIGZhbiBtaW5pbXVtIGhlcmUsIGJlY2F1c2UgaXRzIHZhbHVlIGlzCiAgICBkZXRlcm1pbmVkIGluIHBhcnQgYnkgdGhlIGZhbiBkaXZpc29yLiAgVGhpcyBmb2xsb3dzIHRoZSBwcmluY2lwbGUgb2YKLSAgIGxlYXN0IHN1cHJpc2U7IHRoZSB1c2VyIGRvZXNuJ3QgZXhwZWN0IHRoZSBmYW4gbWluaW11bSB0byBjaGFuZ2UganVzdAorICAgbGVhc3Qgc3VycHJpc2U7IHRoZSB1c2VyIGRvZXNuJ3QgZXhwZWN0IHRoZSBmYW4gbWluaW11bSB0byBjaGFuZ2UganVzdAogICAgYmVjYXVzZSB0aGUgZGl2aXNvciBjaGFuZ2VkLiAqLwogc3RhdGljIHNzaXplX3QKIHN0b3JlX2Zhbl9kaXYoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS1jZC5jIGIvZHJpdmVycy9pZGUvaWRlLWNkLmMKaW5kZXggNmRlM2NkMy4uOTlmYTQyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLWNkLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLWNkLmMKQEAgLTM5NSw3ICszOTUsOCBAQAogCQkJICogd2UgY2Fubm90IHJlbGlhYmx5IGNoZWNrIGlmIGRyaXZlIGNhbiBhdXRvLWNsb3NlCiAJCQkgKi8KIAkJCWlmIChycS0+Y21kWzBdID09IEdQQ01EX1NUQVJUX1NUT1BfVU5JVCAmJiBzZW5zZS0+YXNjID09IDB4MjQpCi0JCQkJbG9nID0gMDsKKwkJCQlicmVhazsKKwkJCWxvZyA9IDE7CiAJCQlicmVhazsKIAkJY2FzZSBVTklUX0FUVEVOVElPTjoKIAkJCS8qCkBAIC00MTcsNiArNDE4LDExIEBACiAJCQkgICAgICBzdHJ1Y3QgcmVxdWVzdCAqZmFpbGVkX2NvbW1hbmQsCiAJCQkgICAgICBzdHJ1Y3QgcmVxdWVzdF9zZW5zZSAqc2Vuc2UpCiB7CisJdW5zaWduZWQgbG9uZyBzZWN0b3I7CisJdW5zaWduZWQgbG9uZyBiaW9fc2VjdG9yczsKKwl1bnNpZ25lZCBsb25nIHZhbGlkOworCXN0cnVjdCBjZHJvbV9pbmZvICppbmZvID0gZHJpdmUtPmRyaXZlcl9kYXRhOworCiAJaWYgKCFjZHJvbV9sb2dfc2Vuc2UoZHJpdmUsIGZhaWxlZF9jb21tYW5kLCBzZW5zZSkpCiAJCXJldHVybjsKIApAQCAtNDI5LDYgKzQzNSwzNyBAQAogCQlpZiAoc2Vuc2UtPnNlbnNlX2tleSA9PSAweDA1ICYmIHNlbnNlLT5hc2MgPT0gMHgyNCkKIAkJCXJldHVybjsKIAorIAlpZiAoc2Vuc2UtPmVycm9yX2NvZGUgPT0gMHg3MCkgewkvKiBDdXJyZW50IEVycm9yICovCisgCQlzd2l0Y2goc2Vuc2UtPnNlbnNlX2tleSkgeworCQljYXNlIE1FRElVTV9FUlJPUjoKKwkJY2FzZSBWT0xVTUVfT1ZFUkZMT1c6CisJCWNhc2UgSUxMRUdBTF9SRVFVRVNUOgorCQkJaWYgKCFzZW5zZS0+dmFsaWQpCisJCQkJYnJlYWs7CisJCQlpZiAoZmFpbGVkX2NvbW1hbmQgPT0gTlVMTCB8fAorCQkJCQkhYmxrX2ZzX3JlcXVlc3QoZmFpbGVkX2NvbW1hbmQpKQorCQkJCWJyZWFrOworCQkJc2VjdG9yID0gKHNlbnNlLT5pbmZvcm1hdGlvblswXSA8PCAyNCkgfAorCQkJCSAoc2Vuc2UtPmluZm9ybWF0aW9uWzFdIDw8IDE2KSB8CisJCQkJIChzZW5zZS0+aW5mb3JtYXRpb25bMl0gPDwgIDgpIHwKKwkJCQkgKHNlbnNlLT5pbmZvcm1hdGlvblszXSk7CisKKwkJCWJpb19zZWN0b3JzID0gYmlvX3NlY3RvcnMoZmFpbGVkX2NvbW1hbmQtPmJpbyk7CisJCQlpZiAoYmlvX3NlY3RvcnMgPCA0KQorCQkJCWJpb19zZWN0b3JzID0gNDsKKwkJCWlmIChkcml2ZS0+cXVldWUtPmhhcmRzZWN0X3NpemUgPT0gMjA0OCkKKwkJCQlzZWN0b3IgPDw9IDI7CS8qIERldmljZSBzZWN0b3Igc2l6ZSBpcyAySyAqLworCQkJc2VjdG9yICY9IH4oYmlvX3NlY3RvcnMgLTEpOworCQkJdmFsaWQgPSAoc2VjdG9yIC0gZmFpbGVkX2NvbW1hbmQtPnNlY3RvcikgPDwgOTsKKworCQkJaWYgKHZhbGlkIDwgMCkKKwkJCQl2YWxpZCA9IDA7CisJCQlpZiAoc2VjdG9yIDwgZ2V0X2NhcGFjaXR5KGluZm8tPmRpc2spICYmCisJCQkJZHJpdmUtPnByb2JlZF9jYXBhY2l0eSAtIHNlY3RvciA8IDQgKiA3NSkgeworCQkJCXNldF9jYXBhY2l0eShpbmZvLT5kaXNrLCBzZWN0b3IpOworCQkJfQorIAkJfQorIAl9CiAjaWYgVkVSQk9TRV9JREVfQ0RfRVJST1JTCiAJewogCQlpbnQgaTsKQEAgLTYwOSwxNyArNjQ2LDIzIEBACiAJCQkJc2Vuc2UgPSBmYWlsZWQtPnNlbnNlOwogCQkJCWZhaWxlZC0+c2Vuc2VfbGVuID0gcnEtPnNlbnNlX2xlbjsKIAkJCX0KLQorCQkJY2Ryb21fYW5hbHl6ZV9zZW5zZV9kYXRhKGRyaXZlLCBmYWlsZWQsIHNlbnNlKTsKIAkJCS8qCiAJCQkgKiBub3cgZW5kIGZhaWxlZCByZXF1ZXN0CiAJCQkgKi8KLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZpZGVfbG9jaywgZmxhZ3MpOwotCQkJZW5kX3RoYXRfcmVxdWVzdF9jaHVuayhmYWlsZWQsIDAsIGZhaWxlZC0+ZGF0YV9sZW4pOwotCQkJZW5kX3RoYXRfcmVxdWVzdF9sYXN0KGZhaWxlZCwgMCk7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZGVfbG9jaywgZmxhZ3MpOwotCQl9Ci0KLQkJY2Ryb21fYW5hbHl6ZV9zZW5zZV9kYXRhKGRyaXZlLCBmYWlsZWQsIHNlbnNlKTsKKwkJCWlmIChibGtfZnNfcmVxdWVzdChmYWlsZWQpKSB7CisJCQkJaWYgKGlkZV9lbmRfZGVxdWV1ZWRfcmVxdWVzdChkcml2ZSwgZmFpbGVkLCAwLAorCQkJCQkJZmFpbGVkLT5oYXJkX25yX3NlY3RvcnMpKQorCQkJCQlCVUcoKTsKKwkJCX0gZWxzZSB7CisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmlkZV9sb2NrLCBmbGFncyk7CisJCQkJZW5kX3RoYXRfcmVxdWVzdF9jaHVuayhmYWlsZWQsIDAsCisJCQkJCQkJZmFpbGVkLT5kYXRhX2xlbik7CisJCQkJZW5kX3RoYXRfcmVxdWVzdF9sYXN0KGZhaWxlZCwgMCk7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWRlX2xvY2ssIGZsYWdzKTsKKwkJCX0KKwkJfSBlbHNlCisJCQljZHJvbV9hbmFseXplX3NlbnNlX2RhdGEoZHJpdmUsIE5VTEwsIHNlbnNlKTsKIAl9CiAKIAlpZiAoIXJxLT5jdXJyZW50X25yX3NlY3RvcnMgJiYgYmxrX2ZzX3JlcXVlc3QocnEpKQpAQCAtNjMzLDYgKzY3NiwxMyBAQAogCWlkZV9lbmRfcmVxdWVzdChkcml2ZSwgdXB0b2RhdGUsIG5zZWN0b3JzKTsKIH0KIAorc3RhdGljIHZvaWQgaWRlX2R1bXBfc3RhdHVzX25vX3NlbnNlKGlkZV9kcml2ZV90ICpkcml2ZSwgY29uc3QgY2hhciAqbXNnLCB1OCBzdGF0KQoreworCWlmIChzdGF0ICYgMHg4MCkKKwkJcmV0dXJuOworCWlkZV9kdW1wX3N0YXR1cyhkcml2ZSwgbXNnLCBzdGF0KTsKK30KKwogLyogUmV0dXJucyAwIGlmIHRoZSByZXF1ZXN0IHNob3VsZCBiZSBjb250aW51ZWQuCiAgICBSZXR1cm5zIDEgaWYgdGhlIHJlcXVlc3Qgd2FzIGVuZGVkLiAqLwogc3RhdGljIGludCBjZHJvbV9kZWNvZGVfc3RhdHVzKGlkZV9kcml2ZV90ICpkcml2ZSwgaW50IGdvb2Rfc3RhdCwgaW50ICpzdGF0X3JldCkKQEAgLTc2MSwxNiArODExLDE2IEBACiAJCQkgICBzZW5zZV9rZXkgPT0gREFUQV9QUk9URUNUKSB7CiAJCQkvKiBObyBwb2ludCBpbiByZXRyeWluZyBhZnRlciBhbiBpbGxlZ2FsCiAJCQkgICByZXF1ZXN0IG9yIGRhdGEgcHJvdGVjdCBlcnJvci4qLwotCQkJaWRlX2R1bXBfc3RhdHVzIChkcml2ZSwgImNvbW1hbmQgZXJyb3IiLCBzdGF0KTsKKwkJCWlkZV9kdW1wX3N0YXR1c19ub19zZW5zZSAoZHJpdmUsICJjb21tYW5kIGVycm9yIiwgc3RhdCk7CiAJCQlkb19lbmRfcmVxdWVzdCA9IDE7CiAJCX0gZWxzZSBpZiAoc2Vuc2Vfa2V5ID09IE1FRElVTV9FUlJPUikgewogCQkJLyogTm8gcG9pbnQgaW4gcmUtdHJ5aW5nIGEgemlsbGlvbiB0aW1lcyBvbiBhIGJhZCAKIAkJCSAqIHNlY3Rvci4uLiAgSWYgd2UgZ290IGhlcmUgdGhlIGVycm9yIGlzIG5vdCBjb3JyZWN0YWJsZSAqLwotCQkJaWRlX2R1bXBfc3RhdHVzIChkcml2ZSwgIm1lZGlhIGVycm9yIChiYWQgc2VjdG9yKSIsIHN0YXQpOworCQkJaWRlX2R1bXBfc3RhdHVzX25vX3NlbnNlIChkcml2ZSwgIm1lZGlhIGVycm9yIChiYWQgc2VjdG9yKSIsIHN0YXQpOwogCQkJZG9fZW5kX3JlcXVlc3QgPSAxOwogCQl9IGVsc2UgaWYgKHNlbnNlX2tleSA9PSBCTEFOS19DSEVDSykgewogCQkJLyogRGlzayBhcHBlYXJzIGJsYW5rID8/ICovCi0JCQlpZGVfZHVtcF9zdGF0dXMgKGRyaXZlLCAibWVkaWEgZXJyb3IgKGJsYW5rKSIsIHN0YXQpOworCQkJaWRlX2R1bXBfc3RhdHVzX25vX3NlbnNlIChkcml2ZSwgIm1lZGlhIGVycm9yIChibGFuaykiLCBzdGF0KTsKIAkJCWRvX2VuZF9yZXF1ZXN0ID0gMTsKIAkJfSBlbHNlIGlmICgoZXJyICYgfkFCUlRfRVJSKSAhPSAwKSB7CiAJCQkvKiBHbyB0byB0aGUgZGVmYXVsdCBoYW5kbGVyCkBAIC03ODIsMTMgKzgzMiwyNyBAQAogCQkJZG9fZW5kX3JlcXVlc3QgPSAxOwogCQl9CiAKLQkJaWYgKGRvX2VuZF9yZXF1ZXN0KQotCQkJY2Ryb21fZW5kX3JlcXVlc3QoZHJpdmUsIDApOworCQkvKiBFbmQgYSByZXF1ZXN0IHRocm91Z2ggcmVxdWVzdCBzZW5zZSBhbmFseXNpcyB3aGVuIHdlIGhhdmUKKwkJICAgc2Vuc2UgZGF0YS4gV2UgbmVlZCB0aGlzIGluIG9yZGVyIHRvIHBlcmZvcm0gZW5kIG9mIG1lZGlhCisJCSAgIHByb2Nlc3NpbmcgKi8KIAotCQkvKiBJZiB3ZSBnb3QgYSBDSEVDS19DT05ESVRJT04gc3RhdHVzLAotCQkgICBxdWV1ZSBhIHJlcXVlc3Qgc2Vuc2UgY29tbWFuZC4gKi8KLQkJaWYgKChzdGF0ICYgRVJSX1NUQVQpICE9IDApCi0JCQljZHJvbV9xdWV1ZV9yZXF1ZXN0X3NlbnNlKGRyaXZlLCBOVUxMLCBOVUxMKTsKKwkJaWYgKGRvX2VuZF9yZXF1ZXN0KSB7CisJCQlpZiAoc3RhdCAmIEVSUl9TVEFUKSB7CisJCQkJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaWRlX2xvY2ssIGZsYWdzKTsKKwkJCQlibGtkZXZfZGVxdWV1ZV9yZXF1ZXN0KHJxKTsKKwkJCQlIV0dST1VQKGRyaXZlKS0+cnEgPSBOVUxMOworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlkZV9sb2NrLCBmbGFncyk7CisKKwkJCQljZHJvbV9xdWV1ZV9yZXF1ZXN0X3NlbnNlKGRyaXZlLCBycS0+c2Vuc2UsIHJxKTsKKwkJCX0gZWxzZQorCQkJCWNkcm9tX2VuZF9yZXF1ZXN0KGRyaXZlLCAwKTsKKwkJfSBlbHNlIHsKKwkJCS8qIElmIHdlIGdvdCBhIENIRUNLX0NPTkRJVElPTiBzdGF0dXMsCisJCQkgICBxdWV1ZSBhIHJlcXVlc3Qgc2Vuc2UgY29tbWFuZC4gKi8KKwkJCWlmIChzdGF0ICYgRVJSX1NUQVQpCisJCQkJY2Ryb21fcXVldWVfcmVxdWVzdF9zZW5zZShkcml2ZSwgTlVMTCwgTlVMTCk7CisJCX0KIAl9IGVsc2UgewogCQlibGtfZHVtcF9ycV9mbGFncyhycSwgImlkZS1jZDogYmFkIHJxIik7CiAJCWNkcm9tX2VuZF9yZXF1ZXN0KGRyaXZlLCAwKTsKQEAgLTE0OTEsOCArMTU1NSw3IEBACiB9CiAKIAotc3RhdGljCi1pbnQgY2Ryb21fcXVldWVfcGFja2V0X2NvbW1hbmQoaWRlX2RyaXZlX3QgKmRyaXZlLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCitzdGF0aWMgaW50IGNkcm9tX3F1ZXVlX3BhY2tldF9jb21tYW5kKGlkZV9kcml2ZV90ICpkcml2ZSwgc3RydWN0IHJlcXVlc3QgKnJxKQogewogCXN0cnVjdCByZXF1ZXN0X3NlbnNlIHNlbnNlOwogCWludCByZXRyaWVzID0gMTA7CkBAIC0yMjIwLDYgKzIyODMsOSBAQAogCQl0b2MtPmNhcGFjaXR5ID0gMHgxZmZmZmY7CiAKIAlzZXRfY2FwYWNpdHkoaW5mby0+ZGlzaywgdG9jLT5jYXBhY2l0eSAqIHNlY3RvcnNfcGVyX2ZyYW1lKTsKKwkvKiBTYXZlIGEgcHJpdmF0ZSBjb3B5IG9mIHRlIFRPQyBjYXBhY2l0eSBmb3IgZXJyb3IgaGFuZGxpbmcgKi8KKwlkcml2ZS0+cHJvYmVkX2NhcGFjaXR5ID0gdG9jLT5jYXBhY2l0eSAqIHNlY3RvcnNfcGVyX2ZyYW1lOworCiAJYmxrX3F1ZXVlX2hhcmRzZWN0X3NpemUoZHJpdmUtPnF1ZXVlLAogCQkJCXNlY3RvcnNfcGVyX2ZyYW1lIDw8IFNFQ1RPUl9CSVRTKTsKIApAQCAtMjM0Miw2ICsyNDA4LDcgQEAKIAlpZiAoIXN0YXQgJiYgKGxhc3Rfd3JpdHRlbiA+IHRvYy0+Y2FwYWNpdHkpKSB7CiAJCXRvYy0+Y2FwYWNpdHkgPSBsYXN0X3dyaXR0ZW47CiAJCXNldF9jYXBhY2l0eShpbmZvLT5kaXNrLCB0b2MtPmNhcGFjaXR5ICogc2VjdG9yc19wZXJfZnJhbWUpOworCQlkcml2ZS0+cHJvYmVkX2NhcGFjaXR5ID0gdG9jLT5jYXBhY2l0eSAqIHNlY3RvcnNfcGVyX2ZyYW1lOwogCX0KIAogCS8qIFJlbWVtYmVyIHRoYXQgd2UndmUgcmVhZCB0aGlzIHN0dWZmLiAqLwpAQCAtMjY5OCwxNCArMjc2NSwxMSBAQAogCSAqIGFueSBvdGhlciB3YXkgdG8gZGV0ZWN0IHRoaXMuLi4KIAkgKi8KIAlpZiAoc2Vuc2Uuc2Vuc2Vfa2V5ID09IE5PVF9SRUFEWSkgewotCQlpZiAoc2Vuc2UuYXNjID09IDB4M2EpIHsKLQkJCWlmIChzZW5zZS5hc2NxID09IDEpCi0JCQkJcmV0dXJuIENEU19OT19ESVNDOwotCQkJZWxzZSBpZiAoc2Vuc2UuYXNjcSA9PSAwIHx8IHNlbnNlLmFzY3EgPT0gMikKLQkJCQlyZXR1cm4gQ0RTX1RSQVlfT1BFTjsKLQkJfQorCQlpZiAoc2Vuc2UuYXNjID09IDB4M2EgJiYgc2Vuc2UuYXNjcSA9PSAxKQorCQkJcmV0dXJuIENEU19OT19ESVNDOworCQllbHNlCisJCQlyZXR1cm4gQ0RTX1RSQVlfT1BFTjsKIAl9Ci0KIAlyZXR1cm4gQ0RTX0RSSVZFX05PVF9SRUFEWTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLWRpc2suYyBiL2RyaXZlcnMvaWRlL2lkZS1kaXNrLmMKaW5kZXggYTUwMTdkZS4uZjAzM2Q3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLWRpc2suYworKysgYi9kcml2ZXJzL2lkZS9pZGUtZGlzay5jCkBAIC0zNyw3ICszNyw3IEBACiAgKiBWZXJzaW9uIDEuMTUJCWNvbnZlcnQgYWxsIGNhbGxzIHRvIGlkZV9yYXdfdGFza2ZpbGUKICAqCQkJCXNpbmNlIGFyZ3Mgd2lsbCByZXR1cm4gcmVnaXN0ZXIgY29udGVudC4KICAqIFZlcnNpb24gMS4xNgkJYWRkZWQgc3VzcGVuZC1yZXN1bWUtY2hlY2twb3dlcgotICogVmVyc2lvbiAxLjE3CQlkbyBmbHVzaCBvbiBzdGFuZHksIGRvIGZsdXNoIG9uIEFUQSA8IEFUQTYKKyAqIFZlcnNpb24gMS4xNwkJZG8gZmx1c2ggb24gc3RhbmRieSwgZG8gZmx1c2ggb24gQVRBIDwgQVRBNgogICoJCQlmaXggd2NhY2hlIHNldHVwLgogICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS1mbG9wcHkuYyBiL2RyaXZlcnMvaWRlL2lkZS1mbG9wcHkuYwppbmRleCBhMTE3OWU5Li40NjU2NTg3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtZmxvcHB5LmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLWZsb3BweS5jCkBAIC0xMjg0LDcgKzEyODQsNyBAQAogCiAJZGVidWdfbG9nKEtFUk5fSU5GTyAicnFfc3RhdHVzOiAlZCwgZGV2OiAlcywgZmxhZ3M6ICVseCwgZXJyb3JzOiAlZFxuIiwKIAkJCXJxLT5ycV9zdGF0dXMsCi0JCQlycS0+cnFfZGlzayA/IHJxLT5ycV9kaXNrLT5kaXNrX25hbWUgPyAiPyIsCisJCQlycS0+cnFfZGlzayA/IHJxLT5ycV9kaXNrLT5kaXNrX25hbWUgOiAiPyIsCiAJCQlycS0+ZmxhZ3MsIHJxLT5lcnJvcnMpOwogCWRlYnVnX2xvZyhLRVJOX0lORk8gInNlY3RvcjogJWxkLCBucl9zZWN0b3JzOiAlbGQsICIKIAkJCSJjdXJyZW50X25yX3NlY3RvcnM6ICVkXG4iLCAobG9uZylycS0+c2VjdG9yLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLWlvLmMgYi9kcml2ZXJzL2lkZS9pZGUtaW8uYwppbmRleCA0ZjJmMTM4Li45MzVjYjI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtaW8uYworKysgYi9kcml2ZXJzL2lkZS9pZGUtaW8uYwpAQCAtMjIzLDYgKzIyMyw2MyBAQAogfQogCiAvKioKKyAqCWlkZV9lbmRfZGVxdWV1ZWRfcmVxdWVzdAktCWNvbXBsZXRlIGFuIElERSBJL08KKyAqCUBkcml2ZTogSURFIGRldmljZSBmb3IgdGhlIEkvTworICoJQHVwdG9kYXRlOgorICoJQG5yX3NlY3RvcnM6IG51bWJlciBvZiBzZWN0b3JzIGNvbXBsZXRlZAorICoKKyAqCUNvbXBsZXRlIGFuIEkvTyB0aGF0IGlzIG5vIGxvbmdlciBvbiB0aGUgcmVxdWVzdCBxdWV1ZS4gVGhpcworICoJdHlwaWNhbGx5IG9jY3VycyB3aGVuIHdlIHB1bGwgdGhlIHJlcXVlc3QgYW5kIGlzc3VlIGEgUkVRVUVTVF9TRU5TRS4KKyAqCVdlIG11c3Qgc3RpbGwgZmluaXNoIHRoZSBvbGQgcmVxdWVzdCBidXQgd2UgbXVzdCBub3QgdGFtcGVyIHdpdGggdGhlCisgKglxdWV1ZSBpbiB0aGUgbWVhbnRpbWUuCisgKgorICoJTk9URTogVGhpcyBwYXRoIGRvZXMgbm90IGhhbmRsZSBiYXJyaWVyLCBidXQgYmFycmllciBpcyBub3Qgc3VwcG9ydGVkCisgKglvbiBpZGUtY2QgYW55d2F5LgorICovCisKK2ludCBpZGVfZW5kX2RlcXVldWVkX3JlcXVlc3QoaWRlX2RyaXZlX3QgKmRyaXZlLCBzdHJ1Y3QgcmVxdWVzdCAqcnEsCisJCQkgICAgIGludCB1cHRvZGF0ZSwgaW50IG5yX3NlY3RvcnMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpZGVfbG9jaywgZmxhZ3MpOworCisJQlVHX09OKCEocnEtPmZsYWdzICYgUkVRX1NUQVJURUQpKTsKKworCS8qCisJICogaWYgZmFpbGZhc3QgaXMgc2V0IG9uIGEgcmVxdWVzdCwgb3ZlcnJpZGUgbnVtYmVyIG9mIHNlY3RvcnMgYW5kCisJICogY29tcGxldGUgdGhlIHdob2xlIHJlcXVlc3QgcmlnaHQgbm93CisJICovCisJaWYgKGJsa19ub3JldHJ5X3JlcXVlc3QocnEpICYmIGVuZF9pb19lcnJvcih1cHRvZGF0ZSkpCisJCW5yX3NlY3RvcnMgPSBycS0+aGFyZF9ucl9zZWN0b3JzOworCisJaWYgKCFibGtfZnNfcmVxdWVzdChycSkgJiYgZW5kX2lvX2Vycm9yKHVwdG9kYXRlKSAmJiAhcnEtPmVycm9ycykKKwkJcnEtPmVycm9ycyA9IC1FSU87CisKKwkvKgorCSAqIGRlY2lkZSB3aGV0aGVyIHRvIHJlZW5hYmxlIERNQSAtLSAzIGlzIGEgcmFuZG9tIG1hZ2ljIGZvciBub3csCisJICogaWYgd2UgRE1BIHRpbWVvdXQgbW9yZSB0aGFuIDMgdGltZXMsIGp1c3Qgc3RheSBpbiBQSU8KKwkgKi8KKwlpZiAoZHJpdmUtPnN0YXRlID09IERNQV9QSU9fUkVUUlkgJiYgZHJpdmUtPnJldHJ5X3BpbyA8PSAzKSB7CisJCWRyaXZlLT5zdGF0ZSA9IDA7CisJCUhXR1JPVVAoZHJpdmUpLT5od2lmLT5pZGVfZG1hX29uKGRyaXZlKTsKKwl9CisKKwlpZiAoIWVuZF90aGF0X3JlcXVlc3RfZmlyc3QocnEsIHVwdG9kYXRlLCBucl9zZWN0b3JzKSkgeworCQlhZGRfZGlza19yYW5kb21uZXNzKHJxLT5ycV9kaXNrKTsKKwkJaWYgKGJsa19ycV90YWdnZWQocnEpKQorCQkJYmxrX3F1ZXVlX2VuZF90YWcoZHJpdmUtPnF1ZXVlLCBycSk7CisJCWVuZF90aGF0X3JlcXVlc3RfbGFzdChycSwgdXB0b2RhdGUpOworCQlyZXQgPSAwOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZGVfbG9jaywgZmxhZ3MpOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpZGVfZW5kX2RlcXVldWVkX3JlcXVlc3QpOworCisKKy8qKgogICoJaWRlX2NvbXBsZXRlX3BtX3JlcXVlc3QgLSBlbmQgdGhlIGN1cnJlbnQgUG93ZXIgTWFuYWdlbWVudCByZXF1ZXN0CiAgKglAZHJpdmU6IHRhcmdldCBkcml2ZQogICoJQHJxOiByZXF1ZXN0CkBAIC05MDIsNyArOTU5LDcgQEAKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBidXMgbm90IHJlYWR5IG9uIHdha2V1cFxuIiwgZHJpdmUtPm5hbWUpOwogCQlTRUxFQ1RfRFJJVkUoZHJpdmUpOwogCQlIV0lGKGRyaXZlKS0+T1VUQig4LCBIV0lGKGRyaXZlKS0+aW9fcG9ydHNbSURFX0NPTlRST0xfT0ZGU0VUXSk7Ci0JCXJjID0gaWRlX3dhaXRfbm90X2J1c3koSFdJRihkcml2ZSksIDEwMDAwKTsKKwkJcmMgPSBpZGVfd2FpdF9ub3RfYnVzeShIV0lGKGRyaXZlKSwgMTAwMDAwKTsKIAkJaWYgKHJjKQogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGRyaXZlIG5vdCByZWFkeSBvbiB3YWtldXBcbiIsIGRyaXZlLT5uYW1lKTsKIAl9CkBAIC0xNjA4LDcgKzE2NjUsNyBAQAogICoJSW5pdGlhbGl6ZSBhIHJlcXVlc3QgYmVmb3JlIHdlIGZpbGwgaXQgaW4gYW5kIHNlbmQgaXQgZG93biB0bwogICoJaWRlX2RvX2RyaXZlX2NtZC4gQ29tbWFuZHMgbXVzdCBiZSBzZXQgdXAgYnkgdGhpcyBmdW5jdGlvbi4gUmlnaHQKICAqCW5vdyBpdCBkb2Vzbid0IGRvIGEgbG90LCBidXQgaWYgdGhhdCBjaGFuZ2VzIGFidXNlcnMgd2lsbCBoYXZlIGEKLSAqCW5hc3R5IHN1cHJpc2UuCisgKgluYXN0eSBzdXJwcmlzZS4KICAqLwogCiB2b2lkIGlkZV9pbml0X2RyaXZlX2NtZCAoc3RydWN0IHJlcXVlc3QgKnJxKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLWxpYi5jIGIvZHJpdmVycy9pZGUvaWRlLWxpYi5jCmluZGV4IDE2YTE0MzEuLjdkZGIxMTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS1saWIuYworKysgYi9kcml2ZXJzL2lkZS9pZGUtbGliLmMKQEAgLTQ4NSw3ICs0ODUsNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdTggZXJyID0gMDsKIAotCWxvY2FsX2lycV9zZXQoZmxhZ3MpOworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAlwcmludGsoIiVzOiAlczogc3RhdHVzPTB4JTAyeCB7ICIsIGRyaXZlLT5uYW1lLCBtc2csIHN0YXQpOwogCWlmIChzdGF0ICYgQlVTWV9TVEFUKQogCQlwcmludGsoIkJ1c3kgIik7CkBAIC01NjcsNyArNTY3LDcgQEAKIAogCXN0YXR1cy5hbGwgPSBzdGF0OwogCWVycm9yLmFsbCA9IDA7Ci0JbG9jYWxfaXJxX3NldChmbGFncyk7CisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCXByaW50aygiJXM6ICVzOiBzdGF0dXM9MHglMDJ4IHsgIiwgZHJpdmUtPm5hbWUsIG1zZywgc3RhdCk7CiAJaWYgKHN0YXR1cy5iLmJzeSkKIAkJcHJpbnRrKCJCdXN5ICIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLXRhcGUuYyBiL2RyaXZlcnMvaWRlL2lkZS10YXBlLmMKaW5kZXggZjA0NzkxYS4uMDlmM2E3ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLXRhcGUuYworKysgYi9kcml2ZXJzL2lkZS9pZGUtdGFwZS5jCkBAIC0yNjQ2LDIxICsyNjQ2LDIzIEBACiAJcmV0dXJuIF9faWRldGFwZV9rbWFsbG9jX3N0YWdlKHRhcGUsIDAsIDApOwogfQogCi1zdGF0aWMgdm9pZCBpZGV0YXBlX2NvcHlfc3RhZ2VfZnJvbV91c2VyIChpZGV0YXBlX3RhcGVfdCAqdGFwZSwgaWRldGFwZV9zdGFnZV90ICpzdGFnZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwgaW50IG4pCitzdGF0aWMgaW50IGlkZXRhcGVfY29weV9zdGFnZV9mcm9tX3VzZXIgKGlkZXRhcGVfdGFwZV90ICp0YXBlLCBpZGV0YXBlX3N0YWdlX3QgKnN0YWdlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBpbnQgbikKIHsKIAlzdHJ1Y3QgaWRldGFwZV9iaCAqYmggPSB0YXBlLT5iaDsKIAlpbnQgY291bnQ7CisJaW50IHJldCA9IDA7CiAKIAl3aGlsZSAobikgewogI2lmIElERVRBUEVfREVCVUdfQlVHUwogCQlpZiAoYmggPT0gTlVMTCkgewogCQkJcHJpbnRrKEtFUk5fRVJSICJpZGUtdGFwZTogYmggPT0gTlVMTCBpbiAiCiAJCQkJImlkZXRhcGVfY29weV9zdGFnZV9mcm9tX3VzZXJcbiIpOwotCQkJcmV0dXJuOworCQkJcmV0dXJuIDE7CiAJCX0KICNlbmRpZiAvKiBJREVUQVBFX0RFQlVHX0JVR1MgKi8KIAkJY291bnQgPSBtaW4oKHVuc2lnbmVkIGludCkoYmgtPmJfc2l6ZSAtIGF0b21pY19yZWFkKCZiaC0+Yl9jb3VudCkpLCAodW5zaWduZWQgaW50KW4pOwotCQljb3B5X2Zyb21fdXNlcihiaC0+Yl9kYXRhICsgYXRvbWljX3JlYWQoJmJoLT5iX2NvdW50KSwgYnVmLCBjb3VudCk7CisJCWlmIChjb3B5X2Zyb21fdXNlcihiaC0+Yl9kYXRhICsgYXRvbWljX3JlYWQoJmJoLT5iX2NvdW50KSwgYnVmLCBjb3VudCkpCisJCQlyZXQgPSAxOwogCQluIC09IGNvdW50OwogCQlhdG9taWNfYWRkKGNvdW50LCAmYmgtPmJfY291bnQpOwogCQlidWYgKz0gY291bnQ7CkBAIC0yNjcxLDIzICsyNjczLDI2IEBACiAJCX0KIAl9CiAJdGFwZS0+YmggPSBiaDsKKwlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCBpZGV0YXBlX2NvcHlfc3RhZ2VfdG9fdXNlciAoaWRldGFwZV90YXBlX3QgKnRhcGUsIGNoYXIgX191c2VyICpidWYsIGlkZXRhcGVfc3RhZ2VfdCAqc3RhZ2UsIGludCBuKQorc3RhdGljIGludCBpZGV0YXBlX2NvcHlfc3RhZ2VfdG9fdXNlciAoaWRldGFwZV90YXBlX3QgKnRhcGUsIGNoYXIgX191c2VyICpidWYsIGlkZXRhcGVfc3RhZ2VfdCAqc3RhZ2UsIGludCBuKQogewogCXN0cnVjdCBpZGV0YXBlX2JoICpiaCA9IHRhcGUtPmJoOwogCWludCBjb3VudDsKKwlpbnQgcmV0ID0gMDsKIAogCXdoaWxlIChuKSB7CiAjaWYgSURFVEFQRV9ERUJVR19CVUdTCiAJCWlmIChiaCA9PSBOVUxMKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgImlkZS10YXBlOiBiaCA9PSBOVUxMIGluICIKIAkJCQkiaWRldGFwZV9jb3B5X3N0YWdlX3RvX3VzZXJcbiIpOwotCQkJcmV0dXJuOworCQkJcmV0dXJuIDE7CiAJCX0KICNlbmRpZiAvKiBJREVUQVBFX0RFQlVHX0JVR1MgKi8KIAkJY291bnQgPSBtaW4odGFwZS0+Yl9jb3VudCwgbik7Ci0JCWNvcHlfdG9fdXNlcihidWYsIHRhcGUtPmJfZGF0YSwgY291bnQpOworCQlpZiAgKGNvcHlfdG9fdXNlcihidWYsIHRhcGUtPmJfZGF0YSwgY291bnQpKQorCQkJcmV0ID0gMTsKIAkJbiAtPSBjb3VudDsKIAkJdGFwZS0+Yl9kYXRhICs9IGNvdW50OwogCQl0YXBlLT5iX2NvdW50IC09IGNvdW50OwpAQCAtMjcwMCw2ICsyNzA1LDcgQEAKIAkJCX0KIAkJfQogCX0KKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCBpZGV0YXBlX2luaXRfbWVyZ2Vfc3RhZ2UgKGlkZXRhcGVfdGFwZV90ICp0YXBlKQpAQCAtMzcxOSw2ICszNzI1LDcgQEAKIAlzdHJ1Y3QgaWRlX3RhcGVfb2JqICp0YXBlID0gaWRlX3RhcGVfZihmaWxlKTsKIAlpZGVfZHJpdmVfdCAqZHJpdmUgPSB0YXBlLT5kcml2ZTsKIAlzc2l6ZV90IGJ5dGVzX3JlYWQsdGVtcCwgYWN0dWFsbHlfcmVhZCA9IDAsIHJjOworCXNzaXplX3QgcmV0ID0gMDsKIAogI2lmIElERVRBUEVfREVCVUdfTE9HCiAJaWYgKHRhcGUtPmRlYnVnX2xldmVsID49IDMpCkBAIC0zNzM3LDcgKzM3NDQsOCBAQAogCQlyZXR1cm4gKDApOwogCWlmICh0YXBlLT5tZXJnZV9zdGFnZV9zaXplKSB7CiAJCWFjdHVhbGx5X3JlYWQgPSBtaW4oKHVuc2lnbmVkIGludCkodGFwZS0+bWVyZ2Vfc3RhZ2Vfc2l6ZSksICh1bnNpZ25lZCBpbnQpY291bnQpOwotCQlpZGV0YXBlX2NvcHlfc3RhZ2VfdG9fdXNlcih0YXBlLCBidWYsIHRhcGUtPm1lcmdlX3N0YWdlLCBhY3R1YWxseV9yZWFkKTsKKwkJaWYgKGlkZXRhcGVfY29weV9zdGFnZV90b191c2VyKHRhcGUsIGJ1ZiwgdGFwZS0+bWVyZ2Vfc3RhZ2UsIGFjdHVhbGx5X3JlYWQpKQorCQkJcmV0ID0gLUVGQVVMVDsKIAkJYnVmICs9IGFjdHVhbGx5X3JlYWQ7CiAJCXRhcGUtPm1lcmdlX3N0YWdlX3NpemUgLT0gYWN0dWFsbHlfcmVhZDsKIAkJY291bnQgLT0gYWN0dWFsbHlfcmVhZDsKQEAgLTM3NDYsNyArMzc1NCw4IEBACiAJCWJ5dGVzX3JlYWQgPSBpZGV0YXBlX2FkZF9jaHJkZXZfcmVhZF9yZXF1ZXN0KGRyaXZlLCB0YXBlLT5jYXBhYmlsaXRpZXMuY3RsKTsKIAkJaWYgKGJ5dGVzX3JlYWQgPD0gMCkKIAkJCWdvdG8gZmluaXNoOwotCQlpZGV0YXBlX2NvcHlfc3RhZ2VfdG9fdXNlcih0YXBlLCBidWYsIHRhcGUtPm1lcmdlX3N0YWdlLCBieXRlc19yZWFkKTsKKwkJaWYgKGlkZXRhcGVfY29weV9zdGFnZV90b191c2VyKHRhcGUsIGJ1ZiwgdGFwZS0+bWVyZ2Vfc3RhZ2UsIGJ5dGVzX3JlYWQpKQorCQkJcmV0ID0gLUVGQVVMVDsKIAkJYnVmICs9IGJ5dGVzX3JlYWQ7CiAJCWNvdW50IC09IGJ5dGVzX3JlYWQ7CiAJCWFjdHVhbGx5X3JlYWQgKz0gYnl0ZXNfcmVhZDsKQEAgLTM3NTYsNyArMzc2NSw4IEBACiAJCWlmIChieXRlc19yZWFkIDw9IDApCiAJCQlnb3RvIGZpbmlzaDsKIAkJdGVtcCA9IG1pbigodW5zaWduZWQgbG9uZyljb3VudCwgKHVuc2lnbmVkIGxvbmcpYnl0ZXNfcmVhZCk7Ci0JCWlkZXRhcGVfY29weV9zdGFnZV90b191c2VyKHRhcGUsIGJ1ZiwgdGFwZS0+bWVyZ2Vfc3RhZ2UsIHRlbXApOworCQlpZiAoaWRldGFwZV9jb3B5X3N0YWdlX3RvX3VzZXIodGFwZSwgYnVmLCB0YXBlLT5tZXJnZV9zdGFnZSwgdGVtcCkpCisJCQlyZXQgPSAtRUZBVUxUOwogCQlhY3R1YWxseV9yZWFkICs9IHRlbXA7CiAJCXRhcGUtPm1lcmdlX3N0YWdlX3NpemUgPSBieXRlc19yZWFkLXRlbXA7CiAJfQpAQCAtMzc2OSw3ICszNzc5LDggQEAKIAkJaWRldGFwZV9zcGFjZV9vdmVyX2ZpbGVtYXJrcyhkcml2ZSwgTVRGU0YsIDEpOwogCQlyZXR1cm4gMDsKIAl9Ci0JcmV0dXJuIGFjdHVhbGx5X3JlYWQ7CisKKwlyZXR1cm4gKHJldCkgPyByZXQgOiBhY3R1YWxseV9yZWFkOwogfQogCiBzdGF0aWMgc3NpemVfdCBpZGV0YXBlX2NocmRldl93cml0ZSAoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCkBAIC0zNzc3LDcgKzM3ODgsOCBAQAogewogCXN0cnVjdCBpZGVfdGFwZV9vYmogKnRhcGUgPSBpZGVfdGFwZV9mKGZpbGUpOwogCWlkZV9kcml2ZV90ICpkcml2ZSA9IHRhcGUtPmRyaXZlOwotCXNzaXplX3QgcmV0dmFsLCBhY3R1YWxseV93cml0dGVuID0gMDsKKwlzc2l6ZV90IGFjdHVhbGx5X3dyaXR0ZW4gPSAwOworCXNzaXplX3QgcmV0ID0gMDsKIAogCS8qIFRoZSBkcml2ZSBpcyB3cml0ZSBwcm90ZWN0ZWQuICovCiAJaWYgKHRhcGUtPndyaXRlX3Byb3QpCkBAIC0zODEzLDcgKzM4MjUsNyBAQAogCQkgKglzb21lIGRyaXZlcyAoU2VhZ2F0ZSBTVFQzNDAxQSkgd2lsbCByZXR1cm4gYW4gZXJyb3IuCiAJCSAqLwogCQlpZiAoZHJpdmUtPmRzY19vdmVybGFwKSB7Ci0JCQlyZXR2YWwgPSBpZGV0YXBlX3F1ZXVlX3J3X3RhaWwoZHJpdmUsIFJFUV9JREVUQVBFX1dSSVRFLCAwLCB0YXBlLT5tZXJnZV9zdGFnZS0+YmgpOworCQkJc3NpemVfdCByZXR2YWwgPSBpZGV0YXBlX3F1ZXVlX3J3X3RhaWwoZHJpdmUsIFJFUV9JREVUQVBFX1dSSVRFLCAwLCB0YXBlLT5tZXJnZV9zdGFnZS0+YmgpOwogCQkJaWYgKHJldHZhbCA8IDApIHsKIAkJCQlfX2lkZXRhcGVfa2ZyZWVfc3RhZ2UodGFwZS0+bWVyZ2Vfc3RhZ2UpOwogCQkJCXRhcGUtPm1lcmdlX3N0YWdlID0gTlVMTDsKQEAgLTM4MzQsMTIgKzM4NDYsMTQgQEAKIAkJfQogI2VuZGlmIC8qIElERVRBUEVfREVCVUdfQlVHUyAqLwogCQlhY3R1YWxseV93cml0dGVuID0gbWluKCh1bnNpZ25lZCBpbnQpKHRhcGUtPnN0YWdlX3NpemUgLSB0YXBlLT5tZXJnZV9zdGFnZV9zaXplKSwgKHVuc2lnbmVkIGludCljb3VudCk7Ci0JCWlkZXRhcGVfY29weV9zdGFnZV9mcm9tX3VzZXIodGFwZSwgdGFwZS0+bWVyZ2Vfc3RhZ2UsIGJ1ZiwgYWN0dWFsbHlfd3JpdHRlbik7CisJCWlmIChpZGV0YXBlX2NvcHlfc3RhZ2VfZnJvbV91c2VyKHRhcGUsIHRhcGUtPm1lcmdlX3N0YWdlLCBidWYsIGFjdHVhbGx5X3dyaXR0ZW4pKQorCQkJCXJldCA9IC1FRkFVTFQ7CiAJCWJ1ZiArPSBhY3R1YWxseV93cml0dGVuOwogCQl0YXBlLT5tZXJnZV9zdGFnZV9zaXplICs9IGFjdHVhbGx5X3dyaXR0ZW47CiAJCWNvdW50IC09IGFjdHVhbGx5X3dyaXR0ZW47CiAKIAkJaWYgKHRhcGUtPm1lcmdlX3N0YWdlX3NpemUgPT0gdGFwZS0+c3RhZ2Vfc2l6ZSkgeworCQkJc3NpemVfdCByZXR2YWw7CiAJCQl0YXBlLT5tZXJnZV9zdGFnZV9zaXplID0gMDsKIAkJCXJldHZhbCA9IGlkZXRhcGVfYWRkX2NocmRldl93cml0ZV9yZXF1ZXN0KGRyaXZlLCB0YXBlLT5jYXBhYmlsaXRpZXMuY3RsKTsKIAkJCWlmIChyZXR2YWwgPD0gMCkKQEAgLTM4NDcsNyArMzg2MSw5IEBACiAJCX0KIAl9CiAJd2hpbGUgKGNvdW50ID49IHRhcGUtPnN0YWdlX3NpemUpIHsKLQkJaWRldGFwZV9jb3B5X3N0YWdlX2Zyb21fdXNlcih0YXBlLCB0YXBlLT5tZXJnZV9zdGFnZSwgYnVmLCB0YXBlLT5zdGFnZV9zaXplKTsKKwkJc3NpemVfdCByZXR2YWw7CisJCWlmIChpZGV0YXBlX2NvcHlfc3RhZ2VfZnJvbV91c2VyKHRhcGUsIHRhcGUtPm1lcmdlX3N0YWdlLCBidWYsIHRhcGUtPnN0YWdlX3NpemUpKQorCQkJcmV0ID0gLUVGQVVMVDsKIAkJYnVmICs9IHRhcGUtPnN0YWdlX3NpemU7CiAJCWNvdW50IC09IHRhcGUtPnN0YWdlX3NpemU7CiAJCXJldHZhbCA9IGlkZXRhcGVfYWRkX2NocmRldl93cml0ZV9yZXF1ZXN0KGRyaXZlLCB0YXBlLT5jYXBhYmlsaXRpZXMuY3RsKTsKQEAgLTM4NTcsMTAgKzM4NzMsMTEgQEAKIAl9CiAJaWYgKGNvdW50KSB7CiAJCWFjdHVhbGx5X3dyaXR0ZW4gKz0gY291bnQ7Ci0JCWlkZXRhcGVfY29weV9zdGFnZV9mcm9tX3VzZXIodGFwZSwgdGFwZS0+bWVyZ2Vfc3RhZ2UsIGJ1ZiwgY291bnQpOworCQlpZiAoaWRldGFwZV9jb3B5X3N0YWdlX2Zyb21fdXNlcih0YXBlLCB0YXBlLT5tZXJnZV9zdGFnZSwgYnVmLCBjb3VudCkpCisJCQlyZXQgPSAtRUZBVUxUOwogCQl0YXBlLT5tZXJnZV9zdGFnZV9zaXplICs9IGNvdW50OwogCX0KLQlyZXR1cm4gKGFjdHVhbGx5X3dyaXR0ZW4pOworCXJldHVybiAocmV0KSA/IHJldCA6IGFjdHVhbGx5X3dyaXR0ZW47CiB9CiAKIHN0YXRpYyBpbnQgaWRldGFwZV93cml0ZV9maWxlbWFyayAoaWRlX2RyaXZlX3QgKmRyaXZlKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLXRpbWluZy5oIGIvZHJpdmVycy9pZGUvaWRlLXRpbWluZy5oCmluZGV4IDJmY2ZhYzYuLmMwODY0YjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS10aW1pbmcuaAorKysgYi9kcml2ZXJzL2lkZS9pZGUtdGltaW5nLmgKQEAgLTIyMCw2ICsyMjAsMTIgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIC8qCisgKiBDb3B5IHRoZSB0aW1pbmcgZnJvbSB0aGUgdGFibGUuCisgKi8KKworCSp0ID0gKnM7CisKKy8qCiAgKiBJZiB0aGUgZHJpdmUgaXMgYW4gRUlERSBkcml2ZSwgaXQgY2FuIHRlbGwgdXMgaXQgbmVlZHMgZXh0ZW5kZWQKICAqIFBJTy9NV0RNQSBjeWNsZSB0aW1pbmcuCiAgKi8KQEAgLTI0Nyw3ICsyNTMsNyBAQAogICogQ29udmVydCB0aGUgdGltaW5nIHRvIGJ1cyBjbG9jayBjb3VudHMuCiAgKi8KIAotCWlkZV90aW1pbmdfcXVhbnRpemUocywgdCwgVCwgVVQpOworCWlkZV90aW1pbmdfcXVhbnRpemUodCwgdCwgVCwgVVQpOwogCiAvKgogICogRXZlbiBpbiBETUEvVURNQSBtb2RlcyB3ZSBzdGlsbCB1c2UgUElPIGFjY2VzcyBmb3IgSURFTlRJRlksIFMuTS5BLlIuVApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvcGNpL3BkYzIwMnh4X29sZC5jIGIvZHJpdmVycy9pZGUvcGNpL3BkYzIwMnh4X29sZC5jCmluZGV4IDdjZTViZjcuLjIyZDE3NTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL3BjaS9wZGMyMDJ4eF9vbGQuYworKysgYi9kcml2ZXJzL2lkZS9wY2kvcGRjMjAyeHhfb2xkLmMKQEAgLTM3MCw3ICszNzAsNiBAQAogCWlmICghKHNwZWVkKSkgewogCQkvKiByZXN0b3JlIG9yaWdpbmFsIHBjaS1jb25maWcgc3BhY2UgKi8KIAkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIGRyaXZlX3BjaSwgZHJpdmVfY29uZik7Ci0JCWh3aWYtPnR1bmVwcm9jKGRyaXZlLCA1KTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC00MTUsOCArNDE0LDYgQEAKIAlpZiAoZHJpdmUtPmFkZHJlc3NpbmcgPT0gMSkgewogCQlzdHJ1Y3QgcmVxdWVzdCAqcnEJPSBIV0dST1VQKGRyaXZlKS0+cnE7CiAJCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKLS8vCQlzdHJ1Y3QgcGNpX2RldiAqZGV2CT0gaHdpZi0+cGNpX2RldjsKLS8vCQl1bnNnbmVkIGxvbmcgaGlnaF8xNgk9IHBjaV9yZXNvdXJjZV9zdGFydChkZXYsIDQpOwogCQl1bnNpZ25lZCBsb25nIGhpZ2hfMTYgICA9IGh3aWYtPmRtYV9tYXN0ZXI7CiAJCXVuc2lnbmVkIGxvbmcgYXRhcGlfcmVnCT0gaGlnaF8xNiArIChod2lmLT5jaGFubmVsID8gMHgyNCA6IDB4MjApOwogCQl1MzIgd29yZF9jb3VudAk9IDA7CkBAIC00MzYsNyArNDMzLDYgQEAKIHsKIAlpZiAoZHJpdmUtPmFkZHJlc3NpbmcgPT0gMSkgewogCQlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7Ci0vLwkJdW5zaWduZWQgbG9uZyBoaWdoXzE2CT0gcGNpX3Jlc291cmNlX3N0YXJ0KGh3aWYtPnBjaV9kZXYsIDQpOwogCQl1bnNpZ25lZCBsb25nIGhpZ2hfMTYJPSBod2lmLT5kbWFfbWFzdGVyOwogCQl1bnNpZ25lZCBsb25nIGF0YXBpX3JlZwk9IGhpZ2hfMTYgKyAoaHdpZi0+Y2hhbm5lbCA/IDB4MjQgOiAweDIwKTsKIAkJdTggY2xvY2sJCT0gMDsKQEAgLTQ1Myw4ICs0NDksNiBAQAogc3RhdGljIGludCBwZGMyMDJ4eF9vbGRfaWRlX2RtYV90ZXN0X2lycShpZGVfZHJpdmVfdCAqZHJpdmUpCiB7CiAJaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOwotLy8Jc3RydWN0IHBjaV9kZXYgKmRldgk9IGh3aWYtPnBjaV9kZXY7Ci0vLwl1bnNpZ25lZCBsb25nIGhpZ2hfMTYJPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCA0KTsKIAl1bnNpZ25lZCBsb25nIGhpZ2hfMTYJPSBod2lmLT5kbWFfbWFzdGVyOwogCXU4IGRtYV9zdGF0CQk9IGh3aWYtPklOQihod2lmLT5kbWFfc3RhdHVzKTsKIAl1OCBzYzFkCQkJPSBod2lmLT5JTkIoKGhpZ2hfMTYgKyAweDAwMWQpKTsKQEAgLTQ5MiwxMiArNDg2LDcgQEAKIAogc3RhdGljIHZvaWQgcGRjMjAyeHhfcmVzZXRfaG9zdCAoaWRlX2h3aWZfdCAqaHdpZikKIHsKLSNpZmRlZiBDT05GSUdfQkxLX0RFVl9JREVETUEKLS8vCXVuc2lnbmVkIGxvbmcgaGlnaF8xNgk9IGh3aWYtPmRtYV9iYXNlIC0gKDgqKGh3aWYtPmNoYW5uZWwpKTsKIAl1bnNpZ25lZCBsb25nIGhpZ2hfMTYJPSBod2lmLT5kbWFfbWFzdGVyOwotI2Vsc2UgLyogIUNPTkZJR19CTEtfREVWX0lERURNQSAqLwotCXVuc2lnbmVkIGxvbmcgaGlnaF8xNgk9IHBjaV9yZXNvdXJjZV9zdGFydChod2lmLT5wY2lfZGV2LCA0KTsKLSNlbmRpZiAvKiBDT05GSUdfQkxLX0RFVl9JREVETUEgKi8KIAl1OCB1ZG1hX3NwZWVkX2ZsYWcJPSBod2lmLT5JTkIoaGlnaF8xNnwweDAwMWYpOwogCiAJaHdpZi0+T1VUQigodWRtYV9zcGVlZF9mbGFnIHwgMHgxMCksIChoaWdoXzE2fDB4MDAxZikpOwpAQCAtNTUwLDMxICs1MzksNiBAQAogI2VuZGlmCiB9CiAKLS8qCi0gKiBTaW5jZSBTVU4gQ29iYWx0IGlzIGF0dGVtcHRpbmcgdG8gZG8gdGhpcyBvcGVyYXRpb24sIEkgc2hvdWxkIGRpc2Nsb3NlCi0gKiB0aGlzIGhhcyBiZWVuIGEgbG9uZyB0aW1lIGFnbyBUaHUgSnVsIDI3IDE2OjQwOjU3IDIwMDAgd2FzIHRoZSBwYXRjaCBkYXRlCi0gKiBIT1RTV0FQIEFUQSBJbmZyYXN0cnVjdHVyZS4KLSAqLwotc3RhdGljIGludCBwZGMyMDJ4eF90cmlzdGF0ZSAoaWRlX2RyaXZlX3QgKiBkcml2ZSwgaW50IHN0YXRlKQotewotCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKLS8vCXVuc2lnbmVkIGxvbmcgaGlnaF8xNgk9IGh3aWYtPmRtYV9iYXNlIC0gKDgqKGh3aWYtPmNoYW5uZWwpKTsKLQl1bnNpZ25lZCBsb25nIGhpZ2hfMTYJPSBod2lmLT5kbWFfbWFzdGVyOwotCXU4IHNjMWYJCQk9IGh3aWYtPklOQihoaWdoXzE2fDB4MDAxZik7Ci0KLQlpZiAoIWh3aWYpCi0JCXJldHVybiAtRUlOVkFMOwotCi0vLwlod2lmLT5idXNfc3RhdGUgPSBzdGF0ZTsKLQotCWlmIChzdGF0ZSkgewotCQlod2lmLT5PVVRCKHNjMWYgfCAweDA4LCAoaGlnaF8xNnwweDAwMWYpKTsKLQl9IGVsc2UgewotCQlod2lmLT5PVVRCKHNjMWYgJiB+MHgwOCwgKGhpZ2hfMTZ8MHgwMDFmKSk7Ci0JfQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgdW5zaWduZWQgaW50IF9fZGV2aW5pdCBpbml0X2NoaXBzZXRfcGRjMjAyeHgoc3RydWN0IHBjaV9kZXYgKmRldiwgY29uc3QgY2hhciAqbmFtZSkKIHsKIAlpZiAoZGV2LT5yZXNvdXJjZVtQQ0lfUk9NX1JFU09VUkNFXS5zdGFydCkgewpAQCAtNjI0LDEwICs1ODgsOCBAQAogCWh3aWYtPnR1bmVwcm9jICA9ICZjb25maWdfY2hpcHNldF9mb3JfcGlvOwogCWh3aWYtPnF1aXJrcHJvYyA9ICZwZGMyMDJ4eF9xdWlya3Byb2M7CiAKLQlpZiAoaHdpZi0+cGNpX2Rldi0+ZGV2aWNlICE9IFBDSV9ERVZJQ0VfSURfUFJPTUlTRV8yMDI0NikgewotCQlod2lmLT5idXNwcm9jICAgPSAmcGRjMjAyeHhfdHJpc3RhdGU7CisJaWYgKGh3aWYtPnBjaV9kZXYtPmRldmljZSAhPSBQQ0lfREVWSUNFX0lEX1BST01JU0VfMjAyNDYpCiAJCWh3aWYtPnJlc2V0cHJvYyA9ICZwZGMyMDJ4eF9yZXNldDsKLQl9CiAKIAlod2lmLT5zcGVlZHByb2MgPSAmcGRjMjAyeHhfdHVuZV9jaGlwc2V0OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9wY2kvcGlpeC5jIGIvZHJpdmVycy9pZGUvcGNpL3BpaXguYwppbmRleCBlOWI4M2UxLi43ZmFjNmY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9wY2kvcGlpeC5jCisrKyBiL2RyaXZlcnMvaWRlL3BjaS9waWl4LmMKQEAgLTIyMiw2ICsyMjIsOCBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdTE2IG1hc3Rlcl9kYXRhOwogCXU4IHNsYXZlX2RhdGE7CisJc3RhdGljIERFRklORV9TUElOTE9DSyh0dW5lX2xvY2spOworCiAJCQkJIC8qIElTUCAgUlRDICovCiAJdTggdGltaW5nc1tdWzJdCT0geyB7IDAsIDAgfSwKIAkJCSAgICB7IDAsIDAgfSwKQEAgLTIzMCw3ICsyMzIsMTMgQEAKIAkJCSAgICB7IDIsIDMgfSwgfTsKIAogCXBpbyA9IGlkZV9nZXRfYmVzdF9waW9fbW9kZShkcml2ZSwgcGlvLCA1LCBOVUxMKTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmaWRlX2xvY2ssIGZsYWdzKTsKKworCS8qCisJICogTWFzdGVyIHZzIHNsYXZlIGlzIHN5bmNocm9uaXplZCBhYm92ZSB1cyBidXQgdGhlIHNsYXZlIHJlZ2lzdGVyIGlzCisJICogc2hhcmVkIGJ5IHRoZSB0d28gaHdpZnMgc28gdGhlIGNvcm5lciBjYXNlIG9mIHR3byBzbGF2ZSB0aW1lb3V0cyBpbgorCSAqIHBhcmFsbGVsIG11c3QgYmUgbG9ja2VkLgorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZ0dW5lX2xvY2ssIGZsYWdzKTsKIAlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIG1hc3Rlcl9wb3J0LCAmbWFzdGVyX2RhdGEpOwogCWlmIChpc19zbGF2ZSkgewogCQltYXN0ZXJfZGF0YSA9IG1hc3Rlcl9kYXRhIHwgMHg0MDAwOwpAQCAtMjUwLDcgKzI1OCw3IEBACiAJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgbWFzdGVyX3BvcnQsIG1hc3Rlcl9kYXRhKTsKIAlpZiAoaXNfc2xhdmUpCiAJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIHNsYXZlX3BvcnQsIHNsYXZlX2RhdGEpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlkZV9sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHVuZV9sb2NrLCBmbGFncyk7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9LY29uZmlnIGIvZHJpdmVycy9pZWVlMTM5NC9LY29uZmlnCmluZGV4IDc5YjgxYmUuLjE4NjczNzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWVlZTEzOTQvS2NvbmZpZworKysgYi9kcml2ZXJzL2llZWUxMzk0L0tjb25maWcKQEAgLTQsNyArNCw3IEBACiAKIGNvbmZpZyBJRUVFMTM5NAogCXRyaXN0YXRlICJJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0IgotCWRlcGVuZHMgb24gKFBDSSB8fCBCUk9LRU4pICYmIChCUk9LRU4gfHwgIUZSVikKKwlkZXBlbmRzIG9uIFBDSSB8fCBCUk9LRU4KIAlzZWxlY3QgTkVUCiAJaGVscAogCSAgSUVFRSAxMzk0IGRlc2NyaWJlcyBhIGhpZ2ggcGVyZm9ybWFuY2Ugc2VyaWFsIGJ1cywgd2hpY2ggaXMgYWxzbwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9ldGgxMzk0LmMgYi9kcml2ZXJzL2llZWUxMzk0L2V0aDEzOTQuYwppbmRleCA1YmRhMTU5Li4yZDViNTdiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWUxMzk0L2V0aDEzOTQuYworKysgYi9kcml2ZXJzL2llZWUxMzk0L2V0aDEzOTQuYwpAQCAtMTA3NCw4ICsxMDc0LDcgQEAKIAogCS8qIE1vdmUgbGlzdCBlbnRyeSB0byBiZWdpbm5pZyBvZiBsaXN0IHNvIHRoYXQgb2xkZXN0IHBhcnRpYWwKIAkgKiBkYXRhZ3JhbXMgcGVyY29sYXRlIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QgKi8KLQlsaXN0X2RlbChsaCk7Ci0JbGlzdF9hZGQobGgsIHBkZ2wpOworCWxpc3RfbW92ZShsaCwgcGRnbCk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvaG9zdHMuYyBiL2RyaXZlcnMvaWVlZTEzOTQvaG9zdHMuYwppbmRleCAyZDQ3YjExLi5hZDQ5YzA0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWUxMzk0L2hvc3RzLmMKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9ob3N0cy5jCkBAIC0xMDMsNyArMTAzLDcgQEAKICAqIGRyaXZlciBzcGVjaWZpYyBwYXJ0cywgZW5hYmxlIHRoZSBjb250cm9sbGVyIGFuZCBtYWtlIGl0IGF2YWlsYWJsZQogICogdG8gdGhlIGdlbmVyYWwgc3Vic3lzdGVtIHVzaW5nIGhwc2JfYWRkX2hvc3QoKS4KICAqCi0gKiBSZXR1cm4gVmFsdWU6IGEgcG9pbnRlciB0byB0aGUgJmhwc2JfaG9zdCBpZiBzdWNjZXNmdWwsICVOVUxMIGlmCisgKiBSZXR1cm4gVmFsdWU6IGEgcG9pbnRlciB0byB0aGUgJmhwc2JfaG9zdCBpZiBzdWNjZXNzZnVsLCAlTlVMTCBpZgogICogbm8gbWVtb3J5IHdhcyBhdmFpbGFibGUuCiAgKi8KIHN0YXRpYyBERUZJTkVfTVVURVgoaG9zdF9udW1fYWxsb2MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9pZWVlMTM5NF9jb3JlLmggYi9kcml2ZXJzL2llZWUxMzk0L2llZWUxMzk0X2NvcmUuaAppbmRleCBlN2I1NWU4Li4wZWNiZjMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWUxMzk0L2llZWUxMzk0X2NvcmUuaAorKysgYi9kcml2ZXJzL2llZWUxMzk0L2llZWUxMzk0X2NvcmUuaApAQCAtMTM5LDcgKzEzOSw3IEBACiAKIC8qCiAgKiBIYW5kIG92ZXIgcmVjZWl2ZWQgc2VsZmlkIHBhY2tldCB0byB0aGUgY29yZS4gIENvbXBsZW1lbnQgY2hlY2sgKHNlY29uZAotICogcXVhZGxldCBpcyBjb21wbGVtZW50IG9mIGZpcnN0KSBpcyBleHBlY3RlZCB0byBiZSBkb25lIGFuZCBzdWNjZXNmdWwuCisgKiBxdWFkbGV0IGlzIGNvbXBsZW1lbnQgb2YgZmlyc3QpIGlzIGV4cGVjdGVkIHRvIGJlIGRvbmUgYW5kIHN1Y2Nlc3NmdWwuCiAgKi8KIHZvaWQgaHBzYl9zZWxmaWRfcmVjZWl2ZWQoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwgcXVhZGxldF90IHNpZCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvbm9kZW1nci5jIGIvZHJpdmVycy9pZWVlMTM5NC9ub2RlbWdyLmMKaW5kZXggOTQ4ZjFiOC4uNTBjNzFlMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZWVlMTM5NC9ub2RlbWdyLmMKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9ub2RlbWdyLmMKQEAgLTgsNiArOCw3IEBACiAgKiBkaXJlY3Rvcnkgb2YgdGhlIGtlcm5lbCBzb3VyY2VzIGZvciBkZXRhaWxzLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9iaXRtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CkBAIC0zMzQsMTAgKzMzNSwxMiBAQAogc3RhdGljIERFVklDRV9BVFRSKGJ1c19vcHRpb25zLFNfSVJVR08sZndfc2hvd19uZV9idXNfb3B0aW9ucyxOVUxMKTsKIAogCisvKiB0bGFiZWxzX2ZyZWUsIHRsYWJlbHNfYWxsb2NhdGlvbnMsIHRsYWJlbHNfbWFzayBhcmUgcmVhZCBub24tYXRvbWljYWxseQorICogaGVyZSwgdGhlcmVmb3JlIGRpc3BsYXllZCB2YWx1ZXMgbWF5IGJlIG9jY2FzaW9uYWxseSB3cm9uZy4gKi8KIHN0YXRpYyBzc2l6ZV90IGZ3X3Nob3dfbmVfdGxhYmVsc19mcmVlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3Qgbm9kZV9lbnRyeSAqbmUgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3Qgbm9kZV9lbnRyeSwgZGV2aWNlKTsKLQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgYXRvbWljX3JlYWQoJm5lLT50cG9vbC0+Y291bnQuY291bnQpICsgMSk7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIDY0IC0gYml0bWFwX3dlaWdodChuZS0+dHBvb2wtPnBvb2wsIDY0KSk7CiB9CiBzdGF0aWMgREVWSUNFX0FUVFIodGxhYmVsc19mcmVlLFNfSVJVR08sZndfc2hvd19uZV90bGFiZWxzX2ZyZWUsTlVMTCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvcmF3MTM5NC5jIGIvZHJpdmVycy9pZWVlMTM5NC9yYXcxMzk0LmMKaW5kZXggMjBjZTUzOS4uNTcxZWE2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZWVlMTM5NC9yYXcxMzk0LmMKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9yYXcxMzk0LmMKQEAgLTEzMiw4ICsxMzIsNyBAQAogc3RhdGljIHZvaWQgX19xdWV1ZV9jb21wbGV0ZV9yZXEoc3RydWN0IHBlbmRpbmdfcmVxdWVzdCAqcmVxKQogewogCXN0cnVjdCBmaWxlX2luZm8gKmZpID0gcmVxLT5maWxlX2luZm87Ci0JbGlzdF9kZWwoJnJlcS0+bGlzdCk7Ci0JbGlzdF9hZGRfdGFpbCgmcmVxLT5saXN0LCAmZmktPnJlcV9jb21wbGV0ZSk7CisJbGlzdF9tb3ZlX3RhaWwoJnJlcS0+bGlzdCwgJmZpLT5yZXFfY29tcGxldGUpOwogCiAJdXAoJmZpLT5jb21wbGV0ZV9zZW0pOwogCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZmktPnBvbGxfd2FpdF9jb21wbGV0ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvS2NvbmZpZyBiL2RyaXZlcnMvaW5maW5pYmFuZC9LY29uZmlnCmluZGV4IGJhMmQ2NTAuLjY5YTUzZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9LY29uZmlnCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9LY29uZmlnCkBAIC00MSw0ICs0MSw2IEBACiAKIHNvdXJjZSAiZHJpdmVycy9pbmZpbmliYW5kL3VscC9zcnAvS2NvbmZpZyIKIAorc291cmNlICJkcml2ZXJzL2luZmluaWJhbmQvdWxwL2lzZXIvS2NvbmZpZyIKKwogZW5kbWVudQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL01ha2VmaWxlIGIvZHJpdmVycy9pbmZpbmliYW5kL01ha2VmaWxlCmluZGV4IGVlYTI3MzIuLmM3ZmY1OGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2luZmluaWJhbmQvTWFrZWZpbGUKQEAgLTMsMyArMyw0IEBACiBvYmotJChDT05GSUdfSVBBVEhfQ09SRSkJCSs9IGh3L2lwYXRoLwogb2JqLSQoQ09ORklHX0lORklOSUJBTkRfSVBPSUIpCQkrPSB1bHAvaXBvaWIvCiBvYmotJChDT05GSUdfSU5GSU5JQkFORF9TUlApCQkrPSB1bHAvc3JwLworb2JqLSQoQ09ORklHX0lORklOSUJBTkRfSVNFUikJCSs9IHVscC9pc2VyLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvY21hLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9jbWEuYwppbmRleCBhNzY4MzRlLi44NjNmNjRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9jbWEuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9jbWEuYwpAQCAtNDc2LDcgKzQ3Niw3IEBACiAJZWxzZSB7CiAJCWlwNiA9ICYoKHN0cnVjdCBzb2NrYWRkcl9pbjYgKikgYWRkciktPnNpbjZfYWRkcjsKIAkJcmV0dXJuIChpcDYtPnM2X2FkZHIzMlswXSB8IGlwNi0+czZfYWRkcjMyWzFdIHwKLQkJCWlwNi0+czZfYWRkcjMyWzNdIHwgaXA2LT5zNl9hZGRyMzJbNF0pID09IDA7CisJCQlpcDYtPnM2X2FkZHIzMlsyXSB8IGlwNi0+czZfYWRkcjMyWzNdKSA9PSAwOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvbWFkLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9tYWQuYwppbmRleCBiMzhlMDJhLi41ZWQ0ZGFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9tYWQuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9tYWQuYwpAQCAtMTc3NSwxMSArMTc3NSw5IEBACiB2b2lkIGliX21hcmtfbWFkX2RvbmUoc3RydWN0IGliX21hZF9zZW5kX3dyX3ByaXZhdGUgKm1hZF9zZW5kX3dyKQogewogCW1hZF9zZW5kX3dyLT50aW1lb3V0ID0gMDsKLQlpZiAobWFkX3NlbmRfd3ItPnJlZmNvdW50ID09IDEpIHsKLQkJbGlzdF9kZWwoJm1hZF9zZW5kX3dyLT5hZ2VudF9saXN0KTsKLQkJbGlzdF9hZGRfdGFpbCgmbWFkX3NlbmRfd3ItPmFnZW50X2xpc3QsCisJaWYgKG1hZF9zZW5kX3dyLT5yZWZjb3VudCA9PSAxKQorCQlsaXN0X21vdmVfdGFpbCgmbWFkX3NlbmRfd3ItPmFnZW50X2xpc3QsCiAJCQkgICAgICAmbWFkX3NlbmRfd3ItPm1hZF9hZ2VudF9wcml2LT5kb25lX2xpc3QpOwotCX0KIH0KIAogc3RhdGljIHZvaWQgaWJfbWFkX2NvbXBsZXRlX3JlY3Yoc3RydWN0IGliX21hZF9hZ2VudF9wcml2YXRlICptYWRfYWdlbnRfcHJpdiwKQEAgLTIwOTgsOCArMjA5Niw3IEBACiAJCXF1ZXVlZF9zZW5kX3dyID0gY29udGFpbmVyX29mKG1hZF9saXN0LAogCQkJCQlzdHJ1Y3QgaWJfbWFkX3NlbmRfd3JfcHJpdmF0ZSwKIAkJCQkJbWFkX2xpc3QpOwotCQlsaXN0X2RlbCgmbWFkX2xpc3QtPmxpc3QpOwotCQlsaXN0X2FkZF90YWlsKCZtYWRfbGlzdC0+bGlzdCwgJnNlbmRfcXVldWUtPmxpc3QpOworCQlsaXN0X21vdmVfdGFpbCgmbWFkX2xpc3QtPmxpc3QsICZzZW5kX3F1ZXVlLT5saXN0KTsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VuZF9xdWV1ZS0+bG9jaywgZmxhZ3MpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9tYWRfcm1wcC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvbWFkX3JtcHAuYwppbmRleCBkNDcwNGUwLi5lYmNkNWIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9tYWRfcm1wcC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL21hZF9ybXBwLmMKQEAgLTY2NSw4ICs2NjUsNyBAQAogCQkJZ290byBvdXQ7CiAKIAkJbWFkX3NlbmRfd3ItPnJlZmNvdW50Kys7Ci0JCWxpc3RfZGVsKCZtYWRfc2VuZF93ci0+YWdlbnRfbGlzdCk7Ci0JCWxpc3RfYWRkX3RhaWwoJm1hZF9zZW5kX3dyLT5hZ2VudF9saXN0LAorCQlsaXN0X21vdmVfdGFpbCgmbWFkX3NlbmRfd3ItPmFnZW50X2xpc3QsCiAJCQkgICAgICAmbWFkX3NlbmRfd3ItPm1hZF9hZ2VudF9wcml2LT5zZW5kX2xpc3QpOwogCX0KIG91dDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3V2ZXJic19jbWQuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3V2ZXJic19jbWQuYwppbmRleCA3NmJmNjFlLi5hOTA4YTdiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91dmVyYnNfY21kLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdXZlcmJzX2NtZC5jCkBAIC0xNTMwLDcgKzE1MzAsNiBAQAogb3V0X3B1dDoKIAlwdXRfcXBfcmVhZChxcCk7CiAKLW91dDoKIAl3aGlsZSAod3IpIHsKIAkJaWYgKGlzX3VkICYmIHdyLT53ci51ZC5haCkKIAkJCXB1dF9haF9yZWFkKHdyLT53ci51ZC5haCk7CkBAIC0xNTM5LDYgKzE1MzgsNyBAQAogCQl3ciA9IG5leHQ7CiAJfQogCitvdXQ6CiAJa2ZyZWUodXNlcl93cik7CiAKIAlyZXR1cm4gcmV0ID8gcmV0IDogaW5fbGVuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdXZlcmJzX21haW4uYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3V2ZXJic19tYWluLmMKaW5kZXggZTU3ZDNjNS4uZTcyNWNjYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdXZlcmJzX21haW4uYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91dmVyYnNfbWFpbi5jCkBAIC0xODgsNyArMTg4LDYgQEAKIAogCQlpZHJfcmVtb3ZlX3VvYmooJmliX3V2ZXJic19haF9pZHIsIHVvYmopOwogCQlpYl9kZXN0cm95X2FoKGFoKTsKLQkJbGlzdF9kZWwoJnVvYmotPmxpc3QpOwogCQlrZnJlZSh1b2JqKTsKIAl9CiAKQEAgLTIwMCw3ICsxOTksNiBAQAogCQlpZHJfcmVtb3ZlX3VvYmooJmliX3V2ZXJic19xcF9pZHIsIHVvYmopOwogCQlpYl91dmVyYnNfZGV0YWNoX3VtY2FzdChxcCwgdXFwKTsKIAkJaWJfZGVzdHJveV9xcChxcCk7Ci0JCWxpc3RfZGVsKCZ1b2JqLT5saXN0KTsKIAkJaWJfdXZlcmJzX3JlbGVhc2VfdWV2ZW50KGZpbGUsICZ1cXAtPnVldmVudCk7CiAJCWtmcmVlKHVxcCk7CiAJfQpAQCAtMjEzLDcgKzIxMSw2IEBACiAKIAkJaWRyX3JlbW92ZV91b2JqKCZpYl91dmVyYnNfY3FfaWRyLCB1b2JqKTsKIAkJaWJfZGVzdHJveV9jcShjcSk7Ci0JCWxpc3RfZGVsKCZ1b2JqLT5saXN0KTsKIAkJaWJfdXZlcmJzX3JlbGVhc2VfdWNxKGZpbGUsIGV2X2ZpbGUsIHVjcSk7CiAJCWtmcmVlKHVjcSk7CiAJfQpAQCAtMjI1LDcgKzIyMiw2IEBACiAKIAkJaWRyX3JlbW92ZV91b2JqKCZpYl91dmVyYnNfc3JxX2lkciwgdW9iaik7CiAJCWliX2Rlc3Ryb3lfc3JxKHNycSk7Ci0JCWxpc3RfZGVsKCZ1b2JqLT5saXN0KTsKIAkJaWJfdXZlcmJzX3JlbGVhc2VfdWV2ZW50KGZpbGUsIHVldmVudCk7CiAJCWtmcmVlKHVldmVudCk7CiAJfQpAQCAtMjQzLDcgKzIzOSw2IEBACiAJCW1lbW9iaiA9IGNvbnRhaW5lcl9vZih1b2JqLCBzdHJ1Y3QgaWJfdW1lbV9vYmplY3QsIHVvYmplY3QpOwogCQlpYl91bWVtX3JlbGVhc2Vfb25fY2xvc2UobXJkZXYsICZtZW1vYmotPnVtZW0pOwogCi0JCWxpc3RfZGVsKCZ1b2JqLT5saXN0KTsKIAkJa2ZyZWUobWVtb2JqKTsKIAl9CiAKQEAgLTI1Miw3ICsyNDcsNiBAQAogCiAJCWlkcl9yZW1vdmVfdW9iaigmaWJfdXZlcmJzX3BkX2lkciwgdW9iaik7CiAJCWliX2RlYWxsb2NfcGQocGQpOwotCQlsaXN0X2RlbCgmdW9iai0+bGlzdCk7CiAJCWtmcmVlKHVvYmopOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9tdWx0aWNhc3QuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfbXVsdGljYXN0LmMKaW5kZXggMjE2NDcxZi4uYWI0MDQ4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9tdWx0aWNhc3QuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX211bHRpY2FzdC5jCkBAIC04NjQsOCArODY0LDcgQEAKIAogCQkJaWYgKG1jYXN0KSB7CiAJCQkJLyogRGVzdHJveSB0aGUgc2VuZCBvbmx5IGVudHJ5ICovCi0JCQkJbGlzdF9kZWwoJm1jYXN0LT5saXN0KTsKLQkJCQlsaXN0X2FkZF90YWlsKCZtY2FzdC0+bGlzdCwgJnJlbW92ZV9saXN0KTsKKwkJCQlsaXN0X21vdmVfdGFpbCgmbWNhc3QtPmxpc3QsICZyZW1vdmVfbGlzdCk7CiAKIAkJCQlyYl9yZXBsYWNlX25vZGUoJm1jYXN0LT5yYl9ub2RlLAogCQkJCQkJJm5tY2FzdC0+cmJfbm9kZSwKQEAgLTg5MCw4ICs4ODksNyBAQAogCQkJcmJfZXJhc2UoJm1jYXN0LT5yYl9ub2RlLCAmcHJpdi0+bXVsdGljYXN0X3RyZWUpOwogCiAJCQkvKiBNb3ZlIHRvIHRoZSByZW1vdmUgbGlzdCAqLwotCQkJbGlzdF9kZWwoJm1jYXN0LT5saXN0KTsKLQkJCWxpc3RfYWRkX3RhaWwoJm1jYXN0LT5saXN0LCAmcmVtb3ZlX2xpc3QpOworCQkJbGlzdF9tb3ZlX3RhaWwoJm1jYXN0LT5saXN0LCAmcmVtb3ZlX2xpc3QpOwogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lzZXIvS2NvbmZpZyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXNlci9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlYWQ4N2QKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lzZXIvS2NvbmZpZwpAQCAtMCwwICsxLDExIEBACitjb25maWcgSU5GSU5JQkFORF9JU0VSCisJdHJpc3RhdGUgIklTQ1NJIFJETUEgUHJvdG9jb2wiCisJZGVwZW5kcyBvbiBJTkZJTklCQU5EICYmIFNDU0kKKwlzZWxlY3QgU0NTSV9JU0NTSV9BVFRSUworCS0tLWhlbHAtLS0KKwkgIFN1cHBvcnQgZm9yIHRoZSBJU0NTSSBSRE1BIFByb3RvY29sIG92ZXIgSW5maW5pQmFuZC4gIFRoaXMKKwkgIGFsbG93cyB5b3UgdG8gYWNjZXNzIHN0b3JhZ2UgZGV2aWNlcyB0aGF0IHNwZWFrIElTRVIvSVNDU0kKKwkgIG92ZXIgSW5maW5pQmFuZC4KKworCSAgVGhlIElTRVIgcHJvdG9jb2wgaXMgZGVmaW5lZCBieSBJRVRGLgorCSAgU2VlIDxodHRwOi8vd3d3LmlldGYub3JnLz4uCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lzZXIvTWFrZWZpbGUgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lzZXIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU2Y2QxNWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lzZXIvTWFrZWZpbGUKQEAgLTAsMCArMSw0IEBACitvYmotJChDT05GSUdfSU5GSU5JQkFORF9JU0VSKQkrPSBpYl9pc2VyLm8KKworaWJfaXNlci15CQkJOj0gaXNlcl92ZXJicy5vIGlzZXJfaW5pdGlhdG9yLm8gaXNlcl9tZW1vcnkubyBcCisJCQkJICAgaXNjc2lfaXNlci5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lzZXIvaXNjc2lfaXNlci5jIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pc2VyL2lzY3NpX2lzZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzNmMmRlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pc2VyL2lzY3NpX2lzZXIuYwpAQCAtMCwwICsxLDc5MCBAQAorLyoKKyAqIGlTQ1NJIEluaXRpYXRvciBvdmVyIGlTRVIgRGF0YS1QYXRoCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IERtaXRyeSBZdXN1cG92CisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgQWxleCBBaXptYW4KKyAqIENvcHlyaWdodCAoQykgMjAwNSBNaWtlIENocmlzdGllCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgVm9sdGFpcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIG1haW50YWluZWQgYnkgb3BlbmliLWdlbmVyYWxAb3BlbmliLm9yZworICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCisgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiwgYXZhaWxhYmxlIGZyb20gdGhlIGZpbGUKKyAqIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUsIG9yIHRoZQorICogT3BlbklCLm9yZyBCU0QgbGljZW5zZSBiZWxvdzoKKyAqCisgKiAgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgorICogICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZworICogICAgIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKgktIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKKyAqCSAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqCSAgZGlzY2xhaW1lci4KKyAqCisgKgktIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqCSAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqCSAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKgkgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICoKKyAqIENyZWRpdHM6CisgKglDaHJpc3RvcGggSGVsbHdpZworICoJRlVKSVRBIFRvbW9ub3JpCisgKglBcm5lIFJlZGxpY2gKKyAqCVpoZW55dSBXYW5nCisgKiBNb2RpZmllZCBieToKKyAqICAgICAgRXJleiBaaWxiZXIKKyAqCisgKgorICogJElkOiBpc2NzaV9pc2VyLmMgNjk2NSAyMDA2LTA1LTA3IDExOjM2OjIwWiBvZ2VybGl0eiAkCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2hhcmRpcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9rZmlmby5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmZzX2ZzX2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2VoLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX3RjcS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX3RyYW5zcG9ydF9pc2NzaS5oPgorCisjaW5jbHVkZSAiaXNjc2lfaXNlci5oIgorCitzdGF0aWMgdW5zaWduZWQgaW50IGlzY3NpX21heF9sdW4gPSA1MTI7Cittb2R1bGVfcGFyYW1fbmFtZWQobWF4X2x1biwgaXNjc2lfbWF4X2x1biwgdWludCwgU19JUlVHTyk7CisKK2ludCBpc2VyX2RlYnVnX2xldmVsID0gMDsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJpU0VSIChpU0NTSSBFeHRlbnNpb25zIGZvciBSRE1BKSBEYXRhbW92ZXIgIgorCQkgICAidiIgRFJWX1ZFUiAiICgiIERSVl9EQVRFICIpIik7CitNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7CitNT0RVTEVfQVVUSE9SKCJBbGV4IE5lemhpbnNreSwgRGFuIEJhciBEb3YsIE9yIEdlcmxpdHoiKTsKKworbW9kdWxlX3BhcmFtX25hbWVkKGRlYnVnX2xldmVsLCBpc2VyX2RlYnVnX2xldmVsLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1Z19sZXZlbCwgIkVuYWJsZSBkZWJ1ZyB0cmFjaW5nIGlmID4gMCAoZGVmYXVsdDpkaXNhYmxlZCkiKTsKKworc3RydWN0IGlzZXJfZ2xvYmFsIGlnOworCit2b2lkCitpc2NzaV9pc2VyX3JlY3Yoc3RydWN0IGlzY3NpX2Nvbm4gKmNvbm4sCisJCXN0cnVjdCBpc2NzaV9oZHIgKmhkciwgY2hhciAqcnhfZGF0YSwgaW50IHJ4X2RhdGFfbGVuKQoreworCWludCByYyA9IDA7CisJdWludDMyX3QgcmV0X2l0dDsKKwlpbnQgZGF0YWxlbjsKKwlpbnQgYWhzbGVuOworCisJLyogdmVyaWZ5IFBEVSBsZW5ndGggKi8KKwlkYXRhbGVuID0gbnRvaDI0KGhkci0+ZGxlbmd0aCk7CisJaWYgKGRhdGFsZW4gIT0gcnhfZGF0YV9sZW4pIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpc2NzaV9pc2VyOiBkYXRhbGVuICVkIChoZHIpICE9ICVkIChJQikgXG4iLAorCQkgICAgICAgZGF0YWxlbiwgcnhfZGF0YV9sZW4pOworCQlyYyA9IElTQ1NJX0VSUl9EQVRBTEVOOworCQlnb3RvIGVycm9yOworCX0KKworCS8qIHJlYWQgQUhTICovCisJYWhzbGVuID0gaGRyLT5obGVuZ3RoICogNDsKKworCS8qIHZlcmlmeSBpdHQgKGl0dCBlbmNvZGluZzogYWdlK2NpZCtpdHQpICovCisJcmMgPSBpc2NzaV92ZXJpZnlfaXR0KGNvbm4sIGhkciwgJnJldF9pdHQpOworCisJaWYgKCFyYykKKwkJcmMgPSBpc2NzaV9jb21wbGV0ZV9wZHUoY29ubiwgaGRyLCByeF9kYXRhLCByeF9kYXRhX2xlbik7CisKKwlpZiAocmMgJiYgcmMgIT0gSVNDU0lfRVJSX05PX1NDU0lfQ01EKQorCQlnb3RvIGVycm9yOworCisJcmV0dXJuOworZXJyb3I6CisJaXNjc2lfY29ubl9mYWlsdXJlKGNvbm4sIHJjKTsKK30KKworCisvKioKKyAqIGlzY3NpX2lzZXJfY21kX2luaXQgLSBJbml0aWFsaXplIGlTQ1NJIFNDU0lfUkVBRCBvciBTQ1NJX1dSSVRFIGNvbW1hbmRzCisgKgorICoqLworc3RhdGljIHZvaWQKK2lzY3NpX2lzZXJfY21kX2luaXQoc3RydWN0IGlzY3NpX2NtZF90YXNrICpjdGFzaykKK3sKKwlzdHJ1Y3QgaXNjc2lfaXNlcl9jb25uICAgICAqaXNlcl9jb25uICA9IGN0YXNrLT5jb25uLT5kZF9kYXRhOworCXN0cnVjdCBpc2NzaV9pc2VyX2NtZF90YXNrICppc2VyX2N0YXNrID0gY3Rhc2stPmRkX2RhdGE7CisJc3RydWN0IHNjc2lfY21uZCAgKnNjID0gY3Rhc2stPnNjOworCisJaXNlcl9jdGFzay0+Y29tbWFuZF9zZW50ID0gMDsKKwlpc2VyX2N0YXNrLT5pc2VyX2Nvbm4gICAgPSBpc2VyX2Nvbm47CisKKwlpZiAoc2MtPnNjX2RhdGFfZGlyZWN0aW9uID09IERNQV9UT19ERVZJQ0UpIHsKKwkJQlVHX09OKGN0YXNrLT50b3RhbF9sZW5ndGggPT0gMCk7CisJCS8qIGJ5dGVzIHRvIGJlIHNlbnQgdmlhIFJETUEgb3BlcmF0aW9ucyAqLworCQlpc2VyX2N0YXNrLT5yZG1hX2RhdGFfY291bnQgPSBjdGFzay0+dG90YWxfbGVuZ3RoIC0KKwkJCQkJIGN0YXNrLT5pbW1fY291bnQgLQorCQkJCQkgY3Rhc2stPnVuc29sX2NvdW50OworCisJCWRlYnVnX3Njc2koImNtZCBbaXR0ICV4IHRvdGFsICVkIGltbSAlZCB1bnNvbF9kYXRhICVkICIKKwkJCSAgICJyZG1hX2RhdGEgJWRdXG4iLAorCQkJICAgY3Rhc2stPml0dCwgY3Rhc2stPnRvdGFsX2xlbmd0aCwgY3Rhc2stPmltbV9jb3VudCwKKwkJCSAgIGN0YXNrLT51bnNvbF9jb3VudCwgaXNlcl9jdGFzay0+cmRtYV9kYXRhX2NvdW50KTsKKwl9IGVsc2UKKwkJLyogYnl0ZXMgdG8gYmUgc2VudCB2aWEgUkRNQSBvcGVyYXRpb25zICovCisJCWlzZXJfY3Rhc2stPnJkbWFfZGF0YV9jb3VudCA9IGN0YXNrLT50b3RhbF9sZW5ndGg7CisKKwlpc2VyX2N0YXNrX3JkbWFfaW5pdChpc2VyX2N0YXNrKTsKK30KKworLyoqCisgKiBpc2NzaV9tdGFza194bWl0IC0geG1pdCBtYW5hZ2VtZW50KGltbWVkaWF0ZSkgdGFzaworICogQGNvbm46IGlzY3NpIGNvbm5lY3Rpb24KKyAqIEBtdGFzazogdGFzayBtYW5hZ2VtZW50IHRhc2sKKyAqCisgKiBOb3RlczoKKyAqCVRoZSBmdW5jdGlvbiBjYW4gcmV0dXJuIC1FQUdBSU4gaW4gd2hpY2ggY2FzZSBjYWxsZXIgbXVzdAorICoJY2FsbCBpdCBhZ2FpbiBsYXRlciwgb3IgcmVjb3Zlci4gJzAnIHJldHVybiBjb2RlIG1lYW5zIHN1Y2Nlc3NmdWwKKyAqCXhtaXQuCisgKgorICoqLworc3RhdGljIGludAoraXNjc2lfaXNlcl9tdGFza194bWl0KHN0cnVjdCBpc2NzaV9jb25uICpjb25uLAorCQkgICAgICBzdHJ1Y3QgaXNjc2lfbWdtdF90YXNrICptdGFzaykKK3sKKwlpbnQgZXJyb3IgPSAwOworCisJZGVidWdfc2NzaSgibXRhc2sgZGVxIFtjaWQgJWQgaXR0IDB4JXhdXG4iLCBjb25uLT5pZCwgbXRhc2stPml0dCk7CisKKwllcnJvciA9IGlzZXJfc2VuZF9jb250cm9sKGNvbm4sIG10YXNrKTsKKworCS8qIHNpbmNlIGlzZXIgeG1pdHMgY29udHJvbCB3aXRoIHplcm8gY29weSwgbXRhc2tzIGNhbiBub3QgYmUgcmVjeWNsZWQKKwkgKiByaWdodCBhZnRlciBzZW5kaW5nIHRoZW0uCisJICogVGhlIHJlY3ljbGluZyBzY2hlbWUgaXMgYmFzZWQgb24gd2hldGhlciBhIHJlc3BvbnNlIGlzIGV4cGVjdGVkCisJICogLSBpZiB5ZXMsIHRoZSBtdGFzayBpcyByZWN5Y2xlZCBhdCBpc2NzaV9jb21wbGV0ZV9wZHUKKwkgKiAtIGlmIG5vLCAgdGhlIG10YXNrIGlzIHJlY3ljbGVkIGF0IGlzZXJfc25kX2NvbXBsZXRpb24KKwkgKi8KKwlpZiAoZXJyb3IgJiYgZXJyb3IgIT0gLUVBR0FJTikKKwkJaXNjc2lfY29ubl9mYWlsdXJlKGNvbm4sIElTQ1NJX0VSUl9DT05OX0ZBSUxFRCk7CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQKK2lzY3NpX2lzZXJfY3Rhc2tfeG1pdF91bnNvbF9kYXRhKHN0cnVjdCBpc2NzaV9jb25uICpjb25uLAorCQkJCSBzdHJ1Y3QgaXNjc2lfY21kX3Rhc2sgKmN0YXNrKQoreworCXN0cnVjdCBpc2NzaV9kYXRhICBoZHI7CisJaW50IGVycm9yID0gMDsKKwlzdHJ1Y3QgaXNjc2lfaXNlcl9jbWRfdGFzayAqaXNlcl9jdGFzayA9IGN0YXNrLT5kZF9kYXRhOworCisJLyogU2VuZCBkYXRhLW91dCBQRFVzIHdoaWxlIHRoZXJlJ3Mgc3RpbGwgdW5zb2xpY2l0ZWQgZGF0YSB0byBzZW5kICovCisJd2hpbGUgKGN0YXNrLT51bnNvbF9jb3VudCA+IDApIHsKKwkJaXNjc2lfcHJlcF91bnNvbGljaXRfZGF0YV9wZHUoY3Rhc2ssICZoZHIsCisJCQkJCSAgICAgIGlzZXJfY3Rhc2stPnJkbWFfZGF0YV9jb3VudCk7CisKKwkJZGVidWdfc2NzaSgiU2VuZGluZyBkYXRhLW91dDogaXR0IDB4JXgsIGRhdGEgY291bnQgJWRcbiIsCisJCQkgICBoZHIuaXR0LCBjdGFzay0+ZGF0YV9jb3VudCk7CisKKwkJLyogdGhlIGJ1ZmZlciBkZXNjcmlwdGlvbiBoYXMgYmVlbiBwYXNzZWQgd2l0aCB0aGUgY29tbWFuZCAqLworCQkvKiBTZW5kIHRoZSBjb21tYW5kICovCisJCWVycm9yID0gaXNlcl9zZW5kX2RhdGFfb3V0KGNvbm4sIGN0YXNrLCAmaGRyKTsKKwkJaWYgKGVycm9yKSB7CisJCQljdGFzay0+dW5zb2xfZGF0YXNuLS07CisJCQlnb3RvIGlzY3NpX2lzZXJfY3Rhc2tfeG1pdF91bnNvbF9kYXRhX2V4aXQ7CisJCX0KKwkJY3Rhc2stPnVuc29sX2NvdW50IC09IGN0YXNrLT5kYXRhX2NvdW50OworCQlkZWJ1Z19zY3NpKCJOZWVkIHRvIHNlbmQgJWQgbW9yZSBhcyBkYXRhLW91dCBQRFVzXG4iLAorCQkJICAgY3Rhc2stPnVuc29sX2NvdW50KTsKKwl9CisKK2lzY3NpX2lzZXJfY3Rhc2tfeG1pdF91bnNvbF9kYXRhX2V4aXQ6CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW50Citpc2NzaV9pc2VyX2N0YXNrX3htaXQoc3RydWN0IGlzY3NpX2Nvbm4gKmNvbm4sCisJCSAgICAgIHN0cnVjdCBpc2NzaV9jbWRfdGFzayAqY3Rhc2spCit7CisJc3RydWN0IGlzY3NpX2lzZXJfY21kX3Rhc2sgKmlzZXJfY3Rhc2sgPSBjdGFzay0+ZGRfZGF0YTsKKwlpbnQgZXJyb3IgPSAwOworCisJZGVidWdfc2NzaSgiY3Rhc2sgZGVxIFtjaWQgJWQgaXR0IDB4JXhdXG4iLAorCQkgICBjb25uLT5pZCwgY3Rhc2stPml0dCk7CisKKwkvKgorCSAqIHNlcmlhbGl6ZSB3aXRoIFRNRiBBYm9ydFRhc2sKKwkgKi8KKwlpZiAoY3Rhc2stPm10YXNrKQorCQlyZXR1cm4gZXJyb3I7CisKKwkvKiBTZW5kIHRoZSBjbWQgUERVICovCisJaWYgKCFpc2VyX2N0YXNrLT5jb21tYW5kX3NlbnQpIHsKKwkJZXJyb3IgPSBpc2VyX3NlbmRfY29tbWFuZChjb25uLCBjdGFzayk7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gaXNjc2lfaXNlcl9jdGFza194bWl0X2V4aXQ7CisJCWlzZXJfY3Rhc2stPmNvbW1hbmRfc2VudCA9IDE7CisJfQorCisJLyogU2VuZCB1bnNvbGljaXRlZCBkYXRhLW91dCBQRFUocykgaWYgbmVjZXNzYXJ5ICovCisJaWYgKGN0YXNrLT51bnNvbF9jb3VudCkKKwkJZXJyb3IgPSBpc2NzaV9pc2VyX2N0YXNrX3htaXRfdW5zb2xfZGF0YShjb25uLCBjdGFzayk7CisKKyBpc2NzaV9pc2VyX2N0YXNrX3htaXRfZXhpdDoKKwlpZiAoZXJyb3IgJiYgZXJyb3IgIT0gLUVBR0FJTikKKwkJaXNjc2lfY29ubl9mYWlsdXJlKGNvbm4sIElTQ1NJX0VSUl9DT05OX0ZBSUxFRCk7CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgdm9pZAoraXNjc2lfaXNlcl9jbGVhbnVwX2N0YXNrKHN0cnVjdCBpc2NzaV9jb25uICpjb25uLCBzdHJ1Y3QgaXNjc2lfY21kX3Rhc2sgKmN0YXNrKQoreworCXN0cnVjdCBpc2NzaV9pc2VyX2NtZF90YXNrICppc2VyX2N0YXNrID0gY3Rhc2stPmRkX2RhdGE7CisKKwlpZiAoaXNlcl9jdGFzay0+c3RhdHVzID09IElTRVJfVEFTS19TVEFUVVNfU1RBUlRFRCkgeworCQlpc2VyX2N0YXNrLT5zdGF0dXMgPSBJU0VSX1RBU0tfU1RBVFVTX0NPTVBMRVRFRDsKKwkJaXNlcl9jdGFza19yZG1hX2ZpbmFsaXplKGlzZXJfY3Rhc2spOworCX0KK30KKworc3RhdGljIHN0cnVjdCBpc2VyX2Nvbm4gKgoraXNjc2lfaXNlcl9pYl9jb25uX2xvb2t1cChfX3U2NCBlcF9oYW5kbGUpCit7CisJc3RydWN0IGlzZXJfY29ubiAqaWJfY29ubjsKKwlzdHJ1Y3QgaXNlcl9jb25uICp1aWJfY29ubiA9IChzdHJ1Y3QgaXNlcl9jb25uICopKHVuc2lnbmVkIGxvbmcpZXBfaGFuZGxlOworCisJbXV0ZXhfbG9jaygmaWcuY29ubmxpc3RfbXV0ZXgpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoaWJfY29ubiwgJmlnLmNvbm5saXN0LCBjb25uX2xpc3QpIHsKKwkJaWYgKGliX2Nvbm4gPT0gdWliX2Nvbm4pIHsKKwkJCW11dGV4X3VubG9jaygmaWcuY29ubmxpc3RfbXV0ZXgpOworCQkJcmV0dXJuIGliX2Nvbm47CisJCX0KKwl9CisJbXV0ZXhfdW5sb2NrKCZpZy5jb25ubGlzdF9tdXRleCk7CisJaXNlcl9lcnIoIm5vIGNvbm4gZXhpc3RzIGZvciBlcGggJWxseFxuIiwodW5zaWduZWQgbG9uZyBsb25nKWVwX2hhbmRsZSk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXNjc2lfY2xzX2Nvbm4gKgoraXNjc2lfaXNlcl9jb25uX2NyZWF0ZShzdHJ1Y3QgaXNjc2lfY2xzX3Nlc3Npb24gKmNsc19zZXNzaW9uLCB1aW50MzJfdCBjb25uX2lkeCkKK3sKKwlzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubjsKKwlzdHJ1Y3QgaXNjc2lfY2xzX2Nvbm4gKmNsc19jb25uOworCXN0cnVjdCBpc2NzaV9pc2VyX2Nvbm4gKmlzZXJfY29ubjsKKworCWNsc19jb25uID0gaXNjc2lfY29ubl9zZXR1cChjbHNfc2Vzc2lvbiwgY29ubl9pZHgpOworCWlmICghY2xzX2Nvbm4pCisJCXJldHVybiBOVUxMOworCWNvbm4gPSBjbHNfY29ubi0+ZGRfZGF0YTsKKworCS8qCisJICogZHVlIHRvIGlzc3VlcyB3aXRoIHRoZSBsb2dpbiBjb2RlIHJlIGlzZXIgc2VtYXRpY3MKKwkgKiB0aGlzIG5vdCBzZXQgaW4gaXNjc2lfY29ubl9zZXR1cCAtIEZJWE1FCisJICovCisJY29ubi0+bWF4X3JlY3ZfZGxlbmd0aCA9IDEyODsKKworCWlzZXJfY29ubiA9IGt6YWxsb2Moc2l6ZW9mKCppc2VyX2Nvbm4pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWlzZXJfY29ubikKKwkJZ290byBjb25uX2FsbG9jX2ZhaWw7CisKKwkvKiBjdXJyZW50bHkgdGhpcyBpcyB0aGUgb25seSBmaWVsZCB3aGljaCBuZWVkIHRvIGJlIGluaXRpYXRlZCAqLworCXJ3bG9ja19pbml0KCZpc2VyX2Nvbm4tPmxvY2spOworCisJY29ubi0+ZGRfZGF0YSA9IGlzZXJfY29ubjsKKwlpc2VyX2Nvbm4tPmlzY3NpX2Nvbm4gPSBjb25uOworCisJcmV0dXJuIGNsc19jb25uOworCitjb25uX2FsbG9jX2ZhaWw6CisJaXNjc2lfY29ubl90ZWFyZG93bihjbHNfY29ubik7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCitpc2NzaV9pc2VyX2Nvbm5fZGVzdHJveShzdHJ1Y3QgaXNjc2lfY2xzX2Nvbm4gKmNsc19jb25uKQoreworCXN0cnVjdCBpc2NzaV9jb25uICpjb25uID0gY2xzX2Nvbm4tPmRkX2RhdGE7CisJc3RydWN0IGlzY3NpX2lzZXJfY29ubiAqaXNlcl9jb25uID0gY29ubi0+ZGRfZGF0YTsKKworCWlzY3NpX2Nvbm5fdGVhcmRvd24oY2xzX2Nvbm4pOworCWtmcmVlKGlzZXJfY29ubik7Cit9CisKK3N0YXRpYyBpbnQKK2lzY3NpX2lzZXJfY29ubl9iaW5kKHN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqY2xzX3Nlc3Npb24sCisJCSAgICAgc3RydWN0IGlzY3NpX2Nsc19jb25uICpjbHNfY29ubiwgdWludDY0X3QgdHJhbnNwb3J0X2VwaCwKKwkJICAgICBpbnQgaXNfbGVhZGluZykKK3sKKwlzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubiA9IGNsc19jb25uLT5kZF9kYXRhOworCXN0cnVjdCBpc2NzaV9pc2VyX2Nvbm4gKmlzZXJfY29ubjsKKwlzdHJ1Y3QgaXNlcl9jb25uICppYl9jb25uOworCWludCBlcnJvcjsKKworCWVycm9yID0gaXNjc2lfY29ubl9iaW5kKGNsc19zZXNzaW9uLCBjbHNfY29ubiwgaXNfbGVhZGluZyk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwkvKiB0aGUgdHJhbnNwb3J0IGVwIGhhbmRsZSBjb21lcyBmcm9tIHVzZXIgc3BhY2Ugc28gaXQgbXVzdCBiZQorCSAqIHZlcmlmaWVkIGFnYWluc3QgdGhlIGdsb2JhbCBpYiBjb25uZWN0aW9ucyBsaXN0ICovCisJaWJfY29ubiA9IGlzY3NpX2lzZXJfaWJfY29ubl9sb29rdXAodHJhbnNwb3J0X2VwaCk7CisJaWYgKCFpYl9jb25uKSB7CisJCWlzZXJfZXJyKCJjYW4ndCBiaW5kIGVwaCAlbGx4XG4iLAorCQkJICh1bnNpZ25lZCBsb25nIGxvbmcpdHJhbnNwb3J0X2VwaCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwkvKiBiaW5kcyB0aGUgaVNFUiBjb25uZWN0aW9uIHJldHJpZXZlZCBmcm9tIHRoZSBwcmV2aW91c2x5CisJICogY29ubmVjdGVkIGVwX2hhbmRsZSB0byB0aGUgaVNDU0kgbGF5ZXIgY29ubmVjdGlvbi4gZXhjaGFuZ2VzCisJICogY29ubmVjdGlvbiBwb2ludGVycyAqLworCWlzZXJfZXJyKCJiaW5kaW5nIGlzY3NpIGNvbm4gJXAgdG8gaXNlcl9jb25uICVwXG4iLGNvbm4saWJfY29ubik7CisJaXNlcl9jb25uID0gY29ubi0+ZGRfZGF0YTsKKwlpYl9jb25uLT5pc2VyX2Nvbm4gPSBpc2VyX2Nvbm47CisJaXNlcl9jb25uLT5pYl9jb25uICA9IGliX2Nvbm47CisKKwljb25uLT5yZWN2X2xvY2sgPSAmaXNlcl9jb25uLT5sb2NrOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2lzY3NpX2lzZXJfY29ubl9zdGFydChzdHJ1Y3QgaXNjc2lfY2xzX2Nvbm4gKmNsc19jb25uKQoreworCXN0cnVjdCBpc2NzaV9jb25uICpjb25uID0gY2xzX2Nvbm4tPmRkX2RhdGE7CisJaW50IGVycjsKKworCWVyciA9IGlzY3NpX2Nvbm5fc3RhcnQoY2xzX2Nvbm4pOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlyZXR1cm4gaXNlcl9jb25uX3NldF9mdWxsX2ZlYXR1cmVkX21vZGUoY29ubik7Cit9CisKK3N0YXRpYyB2b2lkCitpc2NzaV9pc2VyX2Nvbm5fdGVybWluYXRlKHN0cnVjdCBpc2NzaV9jb25uICpjb25uKQoreworCXN0cnVjdCBpc2NzaV9pc2VyX2Nvbm4gKmlzZXJfY29ubiA9IGNvbm4tPmRkX2RhdGE7CisJc3RydWN0IGlzZXJfY29ubiAqaWJfY29ubiA9IGlzZXJfY29ubi0+aWJfY29ubjsKKworCUJVR19PTighaWJfY29ubik7CisJLyogc3RhcnRzIGNvbm4gdGVhcmRvd24gcHJvY2Vzcywgd2FpdHMgdW50aWwgYWxsIHByZXZpb3VzbHkgICAqCisJICogcG9zdGVkIGJ1ZmZlcnMgZ2V0IGZsdXNoZWQsIGRlYWxsb2NhdGVzIGFsbCBjb25uIHJlc291cmNlcyAqLworCWlzZXJfY29ubl90ZXJtaW5hdGUoaWJfY29ubik7CisJaXNlcl9jb25uLT5pYl9jb25uID0gTlVMTDsKKwljb25uLT5yZWN2X2xvY2sgPSBOVUxMOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgaXNjc2lfdHJhbnNwb3J0IGlzY3NpX2lzZXJfdHJhbnNwb3J0OworCitzdGF0aWMgc3RydWN0IGlzY3NpX2Nsc19zZXNzaW9uICoKK2lzY3NpX2lzZXJfc2Vzc2lvbl9jcmVhdGUoc3RydWN0IGlzY3NpX3RyYW5zcG9ydCAqaXNjc2l0LAorCQkJIHN0cnVjdCBzY3NpX3RyYW5zcG9ydF90ZW1wbGF0ZSAqc2NzaXQsCisJCQkgIHVpbnQzMl90IGluaXRpYWxfY21kc24sIHVpbnQzMl90ICpob3N0bm8pCit7CisJc3RydWN0IGlzY3NpX2Nsc19zZXNzaW9uICpjbHNfc2Vzc2lvbjsKKwlzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiAqc2Vzc2lvbjsKKwlpbnQgaTsKKwl1aW50MzJfdCBobjsKKwlzdHJ1Y3QgaXNjc2lfY21kX3Rhc2sgICpjdGFzazsKKwlzdHJ1Y3QgaXNjc2lfbWdtdF90YXNrICptdGFzazsKKwlzdHJ1Y3QgaXNjc2lfaXNlcl9jbWRfdGFzayAqaXNlcl9jdGFzazsKKwlzdHJ1Y3QgaXNlcl9kZXNjICpkZXNjOworCisJY2xzX3Nlc3Npb24gPSBpc2NzaV9zZXNzaW9uX3NldHVwKGlzY3NpdCwgc2NzaXQsCisJCQkJCSAgc2l6ZW9mKHN0cnVjdCBpc2NzaV9pc2VyX2NtZF90YXNrKSwKKwkJCQkJICBzaXplb2Yoc3RydWN0IGlzZXJfZGVzYyksCisJCQkJCSAgaW5pdGlhbF9jbWRzbiwgJmhuKTsKKwlpZiAoIWNsc19zZXNzaW9uKQorCXJldHVybiBOVUxMOworCisJKmhvc3RubyA9IGhuOworCXNlc3Npb24gPSBjbGFzc190b190cmFuc3BvcnRfc2Vzc2lvbihjbHNfc2Vzc2lvbik7CisKKwkvKiBsaWJpc2NzaSBzZXR1cCBpdHRzLCBkYXRhIGFuZCBwb29sIHNvIGp1c3Qgc2V0IGRlc2MgZmllbGRzICovCisJZm9yIChpID0gMDsgaSA8IHNlc3Npb24tPmNtZHNfbWF4OyBpKyspIHsKKwkJY3Rhc2sgICAgICA9IHNlc3Npb24tPmNtZHNbaV07CisJCWlzZXJfY3Rhc2sgPSBjdGFzay0+ZGRfZGF0YTsKKwkJY3Rhc2stPmhkciA9IChzdHJ1Y3QgaXNjc2lfY21kICopJmlzZXJfY3Rhc2stPmRlc2MuaXNjc2lfaGVhZGVyOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBzZXNzaW9uLT5tZ210cG9vbF9tYXg7IGkrKykgeworCQltdGFzayAgICAgID0gc2Vzc2lvbi0+bWdtdF9jbWRzW2ldOworCQlkZXNjICAgICAgID0gbXRhc2stPmRkX2RhdGE7CisJCW10YXNrLT5oZHIgPSAmZGVzYy0+aXNjc2lfaGVhZGVyOworCQlkZXNjLT5kYXRhID0gbXRhc2stPmRhdGE7CisJfQorCisJcmV0dXJuIGNsc19zZXNzaW9uOworfQorCitzdGF0aWMgaW50Citpc2NzaV9pc2VyX2Nvbm5fc2V0X3BhcmFtKHN0cnVjdCBpc2NzaV9jbHNfY29ubiAqY2xzX2Nvbm4sCisJCQkgIGVudW0gaXNjc2lfcGFyYW0gcGFyYW0sIHVpbnQzMl90IHZhbHVlKQoreworCXN0cnVjdCBpc2NzaV9jb25uICpjb25uID0gY2xzX2Nvbm4tPmRkX2RhdGE7CisJc3RydWN0IGlzY3NpX3Nlc3Npb24gKnNlc3Npb24gPSBjb25uLT5zZXNzaW9uOworCisJc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwlpZiAoY29ubi0+Y19zdGFnZSAhPSBJU0NTSV9DT05OX0lOSVRJQUxfU1RBR0UgJiYKKwkgICAgY29ubi0+c3RvcF9zdGFnZSAhPSBTVE9QX0NPTk5fUkVDT1ZFUikgeworCQlwcmludGsoS0VSTl9FUlIgImlzY3NpX2lzZXI6IGNhbiBub3QgY2hhbmdlIHBhcmFtZXRlciBbJWRdXG4iLAorCQkgICAgICAgcGFyYW0pOworCQlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJCXJldHVybiAwOworCX0KKwlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisKKwlzd2l0Y2ggKHBhcmFtKSB7CisJY2FzZSBJU0NTSV9QQVJBTV9NQVhfUkVDVl9ETEVOR1RIOgorCQkvKiBUQkQgKi8KKwkJYnJlYWs7CisJY2FzZSBJU0NTSV9QQVJBTV9NQVhfWE1JVF9ETEVOR1RIOgorCQljb25uLT5tYXhfeG1pdF9kbGVuZ3RoID0gIHZhbHVlOworCQlicmVhazsKKwljYXNlIElTQ1NJX1BBUkFNX0hEUkRHU1RfRU46CisJCWlmICh2YWx1ZSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJEYXRhRGlnZXN0IHdhc24ndCBuZWdvdGlhdGVkIHRvIE5vbmUiKTsKKwkJCXJldHVybiAtRVBST1RPOworCQl9CisJCWJyZWFrOworCWNhc2UgSVNDU0lfUEFSQU1fREFUQURHU1RfRU46CisJCWlmICh2YWx1ZSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJEYXRhRGlnZXN0IHdhc24ndCBuZWdvdGlhdGVkIHRvIE5vbmUiKTsKKwkJCXJldHVybiAtRVBST1RPOworCQl9CisJCWJyZWFrOworCWNhc2UgSVNDU0lfUEFSQU1fSU5JVElBTF9SMlRfRU46CisJCXNlc3Npb24tPmluaXRpYWxfcjJ0X2VuID0gdmFsdWU7CisJCWJyZWFrOworCWNhc2UgSVNDU0lfUEFSQU1fSU1NX0RBVEFfRU46CisJCXNlc3Npb24tPmltbV9kYXRhX2VuID0gdmFsdWU7CisJCWJyZWFrOworCWNhc2UgSVNDU0lfUEFSQU1fRklSU1RfQlVSU1Q6CisJCXNlc3Npb24tPmZpcnN0X2J1cnN0ID0gdmFsdWU7CisJCWJyZWFrOworCWNhc2UgSVNDU0lfUEFSQU1fTUFYX0JVUlNUOgorCQlzZXNzaW9uLT5tYXhfYnVyc3QgPSB2YWx1ZTsKKwkJYnJlYWs7CisJY2FzZSBJU0NTSV9QQVJBTV9QRFVfSU5PUkRFUl9FTjoKKwkJc2Vzc2lvbi0+cGR1X2lub3JkZXJfZW4gPSB2YWx1ZTsKKwkJYnJlYWs7CisJY2FzZSBJU0NTSV9QQVJBTV9EQVRBU0VRX0lOT1JERVJfRU46CisJCXNlc3Npb24tPmRhdGFzZXFfaW5vcmRlcl9lbiA9IHZhbHVlOworCQlicmVhazsKKwljYXNlIElTQ1NJX1BBUkFNX0VSTDoKKwkJc2Vzc2lvbi0+ZXJsID0gdmFsdWU7CisJCWJyZWFrOworCWNhc2UgSVNDU0lfUEFSQU1fSUZNQVJLRVJfRU46CisJCWlmICh2YWx1ZSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJJRk1hcmtlciB3YXNuJ3QgbmVnb3RpYXRlZCB0byBObyIpOworCQkJcmV0dXJuIC1FUFJPVE87CisJCX0KKwkJYnJlYWs7CisJY2FzZSBJU0NTSV9QQVJBTV9PRk1BUktFUl9FTjoKKwkJaWYgKHZhbHVlKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIk9GTWFya2VyIHdhc24ndCBuZWdvdGlhdGVkIHRvIE5vIik7CisJCQlyZXR1cm4gLUVQUk9UTzsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAoraXNjc2lfaXNlcl9zZXNzaW9uX2dldF9wYXJhbShzdHJ1Y3QgaXNjc2lfY2xzX3Nlc3Npb24gKmNsc19zZXNzaW9uLAorCQkJICAgICBlbnVtIGlzY3NpX3BhcmFtIHBhcmFtLCB1aW50MzJfdCAqdmFsdWUpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBpc2NzaV9zZXNzaW9uX3RvX3Nob3N0KGNsc19zZXNzaW9uKTsKKwlzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiAqc2Vzc2lvbiA9IGlzY3NpX2hvc3RkYXRhKHNob3N0LT5ob3N0ZGF0YSk7CisKKwlzd2l0Y2ggKHBhcmFtKSB7CisJY2FzZSBJU0NTSV9QQVJBTV9JTklUSUFMX1IyVF9FTjoKKwkJKnZhbHVlID0gc2Vzc2lvbi0+aW5pdGlhbF9yMnRfZW47CisJCWJyZWFrOworCWNhc2UgSVNDU0lfUEFSQU1fTUFYX1IyVDoKKwkJKnZhbHVlID0gc2Vzc2lvbi0+bWF4X3IydDsKKwkJYnJlYWs7CisJY2FzZSBJU0NTSV9QQVJBTV9JTU1fREFUQV9FTjoKKwkJKnZhbHVlID0gc2Vzc2lvbi0+aW1tX2RhdGFfZW47CisJCWJyZWFrOworCWNhc2UgSVNDU0lfUEFSQU1fRklSU1RfQlVSU1Q6CisJCSp2YWx1ZSA9IHNlc3Npb24tPmZpcnN0X2J1cnN0OworCQlicmVhazsKKwljYXNlIElTQ1NJX1BBUkFNX01BWF9CVVJTVDoKKwkJKnZhbHVlID0gc2Vzc2lvbi0+bWF4X2J1cnN0OworCQlicmVhazsKKwljYXNlIElTQ1NJX1BBUkFNX1BEVV9JTk9SREVSX0VOOgorCQkqdmFsdWUgPSBzZXNzaW9uLT5wZHVfaW5vcmRlcl9lbjsKKwkJYnJlYWs7CisJY2FzZSBJU0NTSV9QQVJBTV9EQVRBU0VRX0lOT1JERVJfRU46CisJCSp2YWx1ZSA9IHNlc3Npb24tPmRhdGFzZXFfaW5vcmRlcl9lbjsKKwkJYnJlYWs7CisJY2FzZSBJU0NTSV9QQVJBTV9FUkw6CisJCSp2YWx1ZSA9IHNlc3Npb24tPmVybDsKKwkJYnJlYWs7CisJY2FzZSBJU0NTSV9QQVJBTV9JRk1BUktFUl9FTjoKKwkJKnZhbHVlID0gMDsKKwkJYnJlYWs7CisJY2FzZSBJU0NTSV9QQVJBTV9PRk1BUktFUl9FTjoKKwkJKnZhbHVlID0gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIElTQ1NJX0VSUl9QQVJBTV9OT1RfRk9VTkQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2lzY3NpX2lzZXJfY29ubl9nZXRfcGFyYW0oc3RydWN0IGlzY3NpX2Nsc19jb25uICpjbHNfY29ubiwKKwkJCSAgZW51bSBpc2NzaV9wYXJhbSBwYXJhbSwgdWludDMyX3QgKnZhbHVlKQoreworCXN0cnVjdCBpc2NzaV9jb25uICpjb25uID0gY2xzX2Nvbm4tPmRkX2RhdGE7CisKKwlzd2l0Y2gocGFyYW0pIHsKKwljYXNlIElTQ1NJX1BBUkFNX01BWF9SRUNWX0RMRU5HVEg6CisJCSp2YWx1ZSA9IGNvbm4tPm1heF9yZWN2X2RsZW5ndGg7CisJCWJyZWFrOworCWNhc2UgSVNDU0lfUEFSQU1fTUFYX1hNSVRfRExFTkdUSDoKKwkJKnZhbHVlID0gY29ubi0+bWF4X3htaXRfZGxlbmd0aDsKKwkJYnJlYWs7CisJY2FzZSBJU0NTSV9QQVJBTV9IRFJER1NUX0VOOgorCQkqdmFsdWUgPSAwOworCQlicmVhazsKKwljYXNlIElTQ1NJX1BBUkFNX0RBVEFER1NUX0VOOgorCQkqdmFsdWUgPSAwOworCQlicmVhazsKKwkvKmNhc2UgSVNDU0lfUEFSQU1fVEFSR0VUX1JFQ1ZfRExFTkdUSDoKKwkJKnZhbHVlID0gY29ubi0+dGFyZ2V0X3JlY3ZfZGxlbmd0aDsKKwkJYnJlYWs7CisJY2FzZSBJU0NTSV9QQVJBTV9JTklUSUFUT1JfUkVDVl9ETEVOR1RIOgorCQkqdmFsdWUgPSBjb25uLT5pbml0aWF0b3JfcmVjdl9kbGVuZ3RoOworCQlicmVhazsqLworCWRlZmF1bHQ6CisJCXJldHVybiBJU0NTSV9FUlJfUEFSQU1fTk9UX0ZPVU5EOworCX0KKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkCitpc2NzaV9pc2VyX2Nvbm5fZ2V0X3N0YXRzKHN0cnVjdCBpc2NzaV9jbHNfY29ubiAqY2xzX2Nvbm4sIHN0cnVjdCBpc2NzaV9zdGF0cyAqc3RhdHMpCit7CisJc3RydWN0IGlzY3NpX2Nvbm4gKmNvbm4gPSBjbHNfY29ubi0+ZGRfZGF0YTsKKworCXN0YXRzLT50eGRhdGFfb2N0ZXRzID0gY29ubi0+dHhkYXRhX29jdGV0czsKKwlzdGF0cy0+cnhkYXRhX29jdGV0cyA9IGNvbm4tPnJ4ZGF0YV9vY3RldHM7CisJc3RhdHMtPnNjc2ljbWRfcGR1cyA9IGNvbm4tPnNjc2ljbWRfcGR1c19jbnQ7CisJc3RhdHMtPmRhdGFvdXRfcGR1cyA9IGNvbm4tPmRhdGFvdXRfcGR1c19jbnQ7CisJc3RhdHMtPnNjc2lyc3BfcGR1cyA9IGNvbm4tPnNjc2lyc3BfcGR1c19jbnQ7CisJc3RhdHMtPmRhdGFpbl9wZHVzID0gY29ubi0+ZGF0YWluX3BkdXNfY250OyAvKiBhbHdheXMgMCAqLworCXN0YXRzLT5yMnRfcGR1cyA9IGNvbm4tPnIydF9wZHVzX2NudDsgLyogYWx3YXlzIDAgKi8KKwlzdGF0cy0+dG1mY21kX3BkdXMgPSBjb25uLT50bWZjbWRfcGR1c19jbnQ7CisJc3RhdHMtPnRtZnJzcF9wZHVzID0gY29ubi0+dG1mcnNwX3BkdXNfY250OworCXN0YXRzLT5jdXN0b21fbGVuZ3RoID0gMzsKKwlzdHJjcHkoc3RhdHMtPmN1c3RvbVswXS5kZXNjLCAicXBfdHhfcXVldWVfZnVsbCIpOworCXN0YXRzLT5jdXN0b21bMF0udmFsdWUgPSAwOyAvKiBUQiBpc2VyX2Nvbm4tPnFwX3R4X3F1ZXVlX2Z1bGw7ICovCisJc3RyY3B5KHN0YXRzLT5jdXN0b21bMV0uZGVzYywgImZtcl9tYXBfbm90X2F2YWlsIik7CisJc3RhdHMtPmN1c3RvbVsxXS52YWx1ZSA9IDA7IC8qIFRCIGlzZXJfY29ubi0+Zm1yX21hcF9ub3RfYXZhaWwgKi87CisJc3RyY3B5KHN0YXRzLT5jdXN0b21bMl0uZGVzYywgImVoX2Fib3J0X2NudCIpOworCXN0YXRzLT5jdXN0b21bMl0udmFsdWUgPSBjb25uLT5laF9hYm9ydF9jbnQ7Cit9CisKK3N0YXRpYyBpbnQKK2lzY3NpX2lzZXJfZXBfY29ubmVjdChzdHJ1Y3Qgc29ja2FkZHIgKmRzdF9hZGRyLCBpbnQgbm9uX2Jsb2NraW5nLAorCQkgICAgICBfX3U2NCAqZXBfaGFuZGxlKQoreworCWludCBlcnI7CisJc3RydWN0IGlzZXJfY29ubiAqaWJfY29ubjsKKworCWVyciA9IGlzZXJfY29ubl9pbml0KCZpYl9jb25uKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCWVyciA9IGlzZXJfY29ubmVjdChpYl9jb25uLCBOVUxMLCAoc3RydWN0IHNvY2thZGRyX2luICopZHN0X2FkZHIsIG5vbl9ibG9ja2luZyk7CisJaWYgKCFlcnIpCisJCSplcF9oYW5kbGUgPSAoX191NjQpKHVuc2lnbmVkIGxvbmcpaWJfY29ubjsKKworb3V0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQKK2lzY3NpX2lzZXJfZXBfcG9sbChfX3U2NCBlcF9oYW5kbGUsIGludCB0aW1lb3V0X21zKQoreworCXN0cnVjdCBpc2VyX2Nvbm4gKmliX2Nvbm4gPSBpc2NzaV9pc2VyX2liX2Nvbm5fbG9va3VwKGVwX2hhbmRsZSk7CisJaW50IHJjOworCisJaWYgKCFpYl9jb25uKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoaWJfY29ubi0+d2FpdCwKKwkJCSAgICAgaWJfY29ubi0+c3RhdGUgPT0gSVNFUl9DT05OX1VQLAorCQkJICAgICBtc2Vjc190b19qaWZmaWVzKHRpbWVvdXRfbXMpKTsKKworCS8qIGlmIGNvbm4gZXN0YWJsaXNobWVudCBmYWlsZWQsIHJldHVybiBlcnJvciBjb2RlIHRvIGlzY3NpICovCisJaWYgKCFyYyAmJgorCSAgICAoaWJfY29ubi0+c3RhdGUgPT0gSVNFUl9DT05OX1RFUk1JTkFUSU5HIHx8CisJICAgICBpYl9jb25uLT5zdGF0ZSA9PSBJU0VSX0NPTk5fRE9XTikpCisJCXJjID0gLTE7CisKKwlpc2VyX2VycigiaWIgY29ubiAlcCByYyA9ICVkXG4iLCBpYl9jb25uLCByYyk7CisKKwlpZiAocmMgPiAwKQorCQlyZXR1cm4gMTsgLyogc3VjY2VzcywgdGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiBQT0xMT1VUICovCisJZWxzZSBpZiAoIXJjKQorCQlyZXR1cm4gMDsgLyogdGltZW91dCAqLworCWVsc2UKKwkJcmV0dXJuIHJjOyAvKiBzaWduYWwgKi8KK30KKworc3RhdGljIHZvaWQKK2lzY3NpX2lzZXJfZXBfZGlzY29ubmVjdChfX3U2NCBlcF9oYW5kbGUpCit7CisJc3RydWN0IGlzZXJfY29ubiAqaWJfY29ubiA9IGlzY3NpX2lzZXJfaWJfY29ubl9sb29rdXAoZXBfaGFuZGxlKTsKKworCWlmICghaWJfY29ubikKKwkJcmV0dXJuOworCisJaXNlcl9lcnIoImliIGNvbm4gJXAgc3RhdGUgJWRcbiIsaWJfY29ubiwgaWJfY29ubi0+c3RhdGUpOworCisJaXNlcl9jb25uX3Rlcm1pbmF0ZShpYl9jb25uKTsKK30KKworc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgaXNjc2lfaXNlcl9zaHQgPSB7CisJLm5hbWUgICAgICAgICAgICAgICAgICAgPSAiaVNDU0kgSW5pdGlhdG9yIG92ZXIgaVNFUiwgdi4iIERSVl9WRVIsCisJLnF1ZXVlY29tbWFuZCAgICAgICAgICAgPSBpc2NzaV9xdWV1ZWNvbW1hbmQsCisJLmNhbl9xdWV1ZQkJPSBJU0NTSV9YTUlUX0NNRFNfTUFYIC0gMSwKKwkuc2dfdGFibGVzaXplICAgICAgICAgICA9IElTQ1NJX0lTRVJfU0dfVEFCTEVTSVpFLAorCS5jbWRfcGVyX2x1biAgICAgICAgICAgID0gSVNDU0lfTUFYX0NNRF9QRVJfTFVOLAorCS5laF9hYm9ydF9oYW5kbGVyICAgICAgID0gaXNjc2lfZWhfYWJvcnQsCisJLmVoX2hvc3RfcmVzZXRfaGFuZGxlcgk9IGlzY3NpX2VoX2hvc3RfcmVzZXQsCisJLnVzZV9jbHVzdGVyaW5nICAgICAgICAgPSBESVNBQkxFX0NMVVNURVJJTkcsCisJLnByb2NfbmFtZSAgICAgICAgICAgICAgPSAiaXNjc2lfaXNlciIsCisJLnRoaXNfaWQgICAgICAgICAgICAgICAgPSAtMSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaXNjc2lfdHJhbnNwb3J0IGlzY3NpX2lzZXJfdHJhbnNwb3J0ID0geworCS5vd25lciAgICAgICAgICAgICAgICAgID0gVEhJU19NT0RVTEUsCisJLm5hbWUgICAgICAgICAgICAgICAgICAgPSAiaXNlciIsCisJLmNhcHMgICAgICAgICAgICAgICAgICAgPSBDQVBfUkVDT1ZFUllfTDAgfCBDQVBfTVVMVElfUjJULAorCS5wYXJhbV9tYXNrCQk9IElTQ1NJX01BWF9SRUNWX0RMRU5HVEggfAorCQkJCSAgSVNDU0lfTUFYX1hNSVRfRExFTkdUSCB8CisJCQkJICBJU0NTSV9IRFJER1NUX0VOIHwKKwkJCQkgIElTQ1NJX0RBVEFER1NUX0VOIHwKKwkJCQkgIElTQ1NJX0lOSVRJQUxfUjJUX0VOIHwKKwkJCQkgIElTQ1NJX01BWF9SMlQgfAorCQkJCSAgSVNDU0lfSU1NX0RBVEFfRU4gfAorCQkJCSAgSVNDU0lfRklSU1RfQlVSU1QgfAorCQkJCSAgSVNDU0lfTUFYX0JVUlNUIHwKKwkJCQkgIElTQ1NJX1BEVV9JTk9SREVSX0VOIHwKKwkJCQkgIElTQ1NJX0RBVEFTRVFfSU5PUkRFUl9FTiwKKwkuaG9zdF90ZW1wbGF0ZSAgICAgICAgICA9ICZpc2NzaV9pc2VyX3NodCwKKwkuY29ubmRhdGFfc2l6ZQkJPSBzaXplb2Yoc3RydWN0IGlzY3NpX2Nvbm4pLAorCS5tYXhfbHVuICAgICAgICAgICAgICAgID0gSVNDU0lfSVNFUl9NQVhfTFVOLAorCS5tYXhfY21kX2xlbiAgICAgICAgICAgID0gSVNDU0lfSVNFUl9NQVhfQ01EX0xFTiwKKwkvKiBzZXNzaW9uIG1hbmFnZW1lbnQgKi8KKwkuY3JlYXRlX3Nlc3Npb24gICAgICAgICA9IGlzY3NpX2lzZXJfc2Vzc2lvbl9jcmVhdGUsCisJLmRlc3Ryb3lfc2Vzc2lvbiAgICAgICAgPSBpc2NzaV9zZXNzaW9uX3RlYXJkb3duLAorCS8qIGNvbm5lY3Rpb24gbWFuYWdlbWVudCAqLworCS5jcmVhdGVfY29ubiAgICAgICAgICAgID0gaXNjc2lfaXNlcl9jb25uX2NyZWF0ZSwKKwkuYmluZF9jb25uICAgICAgICAgICAgICA9IGlzY3NpX2lzZXJfY29ubl9iaW5kLAorCS5kZXN0cm95X2Nvbm4gICAgICAgICAgID0gaXNjc2lfaXNlcl9jb25uX2Rlc3Ryb3ksCisJLnNldF9wYXJhbSAgICAgICAgICAgICAgPSBpc2NzaV9pc2VyX2Nvbm5fc2V0X3BhcmFtLAorCS5nZXRfY29ubl9wYXJhbQkJPSBpc2NzaV9pc2VyX2Nvbm5fZ2V0X3BhcmFtLAorCS5nZXRfc2Vzc2lvbl9wYXJhbQk9IGlzY3NpX2lzZXJfc2Vzc2lvbl9nZXRfcGFyYW0sCisJLnN0YXJ0X2Nvbm4gICAgICAgICAgICAgPSBpc2NzaV9pc2VyX2Nvbm5fc3RhcnQsCisJLnN0b3BfY29ubiAgICAgICAgICAgICAgPSBpc2NzaV9jb25uX3N0b3AsCisJLyogdGhlc2UgYXJlIGNhbGxlZCBhcyBwYXJ0IG9mIGNvbm4gcmVjb3ZlcnkgKi8KKwkuc3VzcGVuZF9jb25uX3JlY3YJPSBOVUxMLCAvKiBGSVhNRSBpcy9ob3cgdGhpcyByZWx2YW50IHRvIGlzZXI/ICovCisJLnRlcm1pbmF0ZV9jb25uCQk9IGlzY3NpX2lzZXJfY29ubl90ZXJtaW5hdGUsCisJLyogSU8gKi8KKwkuc2VuZF9wZHUJCT0gaXNjc2lfY29ubl9zZW5kX3BkdSwKKwkuZ2V0X3N0YXRzCQk9IGlzY3NpX2lzZXJfY29ubl9nZXRfc3RhdHMsCisJLmluaXRfY21kX3Rhc2sJCT0gaXNjc2lfaXNlcl9jbWRfaW5pdCwKKwkueG1pdF9jbWRfdGFzawkJPSBpc2NzaV9pc2VyX2N0YXNrX3htaXQsCisJLnhtaXRfbWdtdF90YXNrCQk9IGlzY3NpX2lzZXJfbXRhc2tfeG1pdCwKKwkuY2xlYW51cF9jbWRfdGFzawk9IGlzY3NpX2lzZXJfY2xlYW51cF9jdGFzaywKKwkvKiByZWNvdmVyeSAqLworCS5zZXNzaW9uX3JlY292ZXJ5X3RpbWVkb3V0ID0gaXNjc2lfc2Vzc2lvbl9yZWNvdmVyeV90aW1lZG91dCwKKworCS5lcF9jb25uZWN0ICAgICAgICAgICAgID0gaXNjc2lfaXNlcl9lcF9jb25uZWN0LAorCS5lcF9wb2xsICAgICAgICAgICAgICAgID0gaXNjc2lfaXNlcl9lcF9wb2xsLAorCS5lcF9kaXNjb25uZWN0ICAgICAgICAgID0gaXNjc2lfaXNlcl9lcF9kaXNjb25uZWN0Cit9OworCitzdGF0aWMgaW50IF9faW5pdCBpc2VyX2luaXQodm9pZCkKK3sKKwlpbnQgZXJyOworCisJaXNlcl9kYmcoIlN0YXJ0aW5nIGlTRVIgZGF0YW1vdmVyLi4uXG4iKTsKKworCWlmIChpc2NzaV9tYXhfbHVuIDwgMSkgeworCQlwcmludGsoS0VSTl9FUlIgIkludmFsaWQgbWF4X2x1biB2YWx1ZSBvZiAldVxuIiwgaXNjc2lfbWF4X2x1bik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlzY3NpX2lzZXJfdHJhbnNwb3J0Lm1heF9sdW4gPSBpc2NzaV9tYXhfbHVuOworCisJbWVtc2V0KCZpZywgMCwgc2l6ZW9mKHN0cnVjdCBpc2VyX2dsb2JhbCkpOworCisJaWcuZGVzY19jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKCJpc2VyX2Rlc2NyaXB0b3JzIiwKKwkJCQkJICBzaXplb2YgKHN0cnVjdCBpc2VyX2Rlc2MpLAorCQkJCQkgIDAsIFNMQUJfSFdDQUNIRV9BTElHTiwKKwkJCQkJICBOVUxMLCBOVUxMKTsKKwlpZiAoaWcuZGVzY19jYWNoZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIGRldmljZSBpbml0IGlzIGNhbGxlZCBvbmx5IGFmdGVyIHRoZSBmaXJzdCBhZGRyIHJlc29sdXRpb24gKi8KKwltdXRleF9pbml0KCZpZy5kZXZpY2VfbGlzdF9tdXRleCk7CisJSU5JVF9MSVNUX0hFQUQoJmlnLmRldmljZV9saXN0KTsKKwltdXRleF9pbml0KCZpZy5jb25ubGlzdF9tdXRleCk7CisJSU5JVF9MSVNUX0hFQUQoJmlnLmNvbm5saXN0KTsKKworCWlmICghaXNjc2lfcmVnaXN0ZXJfdHJhbnNwb3J0KCZpc2NzaV9pc2VyX3RyYW5zcG9ydCkpIHsKKwkJaXNlcl9lcnIoImlzY3NpX3JlZ2lzdGVyX3RyYW5zcG9ydCBmYWlsZWRcbiIpOworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIHJlZ2lzdGVyX3RyYW5zcG9ydF9mYWlsdXJlOworCX0KKworCXJldHVybiAwOworCityZWdpc3Rlcl90cmFuc3BvcnRfZmFpbHVyZToKKwlrbWVtX2NhY2hlX2Rlc3Ryb3koaWcuZGVzY19jYWNoZSk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgaXNlcl9leGl0KHZvaWQpCit7CisJaXNlcl9kYmcoIlJlbW92aW5nIGlTRVIgZGF0YW1vdmVyLi4uXG4iKTsKKwlpc2NzaV91bnJlZ2lzdGVyX3RyYW5zcG9ydCgmaXNjc2lfaXNlcl90cmFuc3BvcnQpOworCWttZW1fY2FjaGVfZGVzdHJveShpZy5kZXNjX2NhY2hlKTsKK30KKworbW9kdWxlX2luaXQoaXNlcl9pbml0KTsKK21vZHVsZV9leGl0KGlzZXJfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lzZXIvaXNjc2lfaXNlci5oIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pc2VyL2lzY3NpX2lzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzUwYmE2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pc2VyL2lzY3NpX2lzZXIuaApAQCAtMCwwICsxLDM1NCBAQAorLyoKKyAqIGlTRVIgdHJhbnNwb3J0IGZvciB0aGUgT3BlbiBpU0NTSSBJbml0aWF0b3IgJiBpU0VSIHRyYW5zcG9ydCBpbnRlcm5hbHMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgRG1pdHJ5IFl1c3Vwb3YKKyAqIENvcHlyaWdodCAoQykgMjAwNCBBbGV4IEFpem1hbgorICogQ29weXJpZ2h0IChDKSAyMDA1IE1pa2UgQ2hyaXN0aWUKKyAqIGJhc2VkIG9uIGNvZGUgbWFpbnRhaW5lZCBieSBvcGVuLWlzY3NpQGdvb2dsZWdyb3Vwcy5jb20KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUsIDIwMDYgVm9sdGFpcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBDaXNjbyBTeXN0ZW1zLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bworICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIsIGF2YWlsYWJsZSBmcm9tIHRoZSBmaWxlCisgKiBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLCBvciB0aGUKKyAqIE9wZW5JQi5vcmcgQlNEIGxpY2Vuc2UgYmVsb3c6CisgKgorICogICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKKyAqICAgICB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKKyAqICAgICBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICoJLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlCisgKgkgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKgkgIGRpc2NsYWltZXIuCisgKgorICoJLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKgkgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKgkgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICoJICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqCisgKiAkSWQ6IGlzY3NpX2lzZXIuaCA3MDUxIDIwMDYtMDUtMTAgMTI6Mjk6MTFaIG9nZXJsaXR6ICQKKyAqLworI2lmbmRlZiBfX0lTQ1NJX0lTRVJfSF9fCisjZGVmaW5lIF9fSVNDU0lfSVNFUl9IX18KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8c2NzaS9saWJpc2NzaS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV90cmFuc3BvcnRfaXNjc2kuaD4KKworI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L21lbXBvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC91aW8uaD4KKworI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvaW42Lmg+CisKKyNpbmNsdWRlIDxyZG1hL2liX3ZlcmJzLmg+CisjaW5jbHVkZSA8cmRtYS9pYl9mbXJfcG9vbC5oPgorI2luY2x1ZGUgPHJkbWEvcmRtYV9jbS5oPgorCisjZGVmaW5lIERSVl9OQU1FCSJpc2VyIgorI2RlZmluZSBQRlgJCURSVl9OQU1FICI6ICIKKyNkZWZpbmUgRFJWX1ZFUgkJIjAuMSIKKyNkZWZpbmUgRFJWX0RBVEUJIk1heSA3dGgsIDIwMDYiCisKKyNkZWZpbmUgaXNlcl9kYmcoZm10LCBhcmcuLi4pCQkJCVwKKwlkbyB7CQkJCQkJXAorCQlpZiAoaXNlcl9kZWJ1Z19sZXZlbCA+IDApCQlcCisJCQlwcmludGsoS0VSTl9ERUJVRyBQRlggIiVzOiIgZm10LFwKKwkJCQlfX2Z1bmNfXyAsICMjIGFyZyk7CVwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIGlzZXJfZXJyKGZtdCwgYXJnLi4uKQkJCQlcCisJZG8gewkJCQkJCVwKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXM6IiBmbXQsICAgICAgICAgIFwKKwkJICAgICAgIF9fZnVuY19fICwgIyMgYXJnKTsJCVwKKwl9IHdoaWxlICgwKQorCisJCQkJCS8qIHN1cHBvcnQgdXB0byA1MTJLQiBpbiBvbmUgUkRNQSAqLworI2RlZmluZSBJU0NTSV9JU0VSX1NHX1RBQkxFU0laRSAgICAgICAgICgweDgwMDAwID4+IFBBR0VfU0hJRlQpCisjZGVmaW5lIElTQ1NJX0lTRVJfTUFYX0xVTgkJMjU2CisjZGVmaW5lIElTQ1NJX0lTRVJfTUFYX0NNRF9MRU4JCTE2CisKKy8qIFFQIHNldHRpbmdzICovCisvKiBNYXhpbWFsIGJvdW5kcyBvbiByZWNlaXZlZCBhc3luY2hyb25vdXMgUERVcyAqLworI2RlZmluZSBJU0VSX01BWF9SWF9NSVNDX1BEVVMJCTQgLyogTk9PUF9JTigyKSAsIEFTWU5DX0VWRU5UKDIpICAgKi8KKworI2RlZmluZSBJU0VSX01BWF9UWF9NSVNDX1BEVVMJCTYgLyogTk9PUF9PVVQoMiksIFRFWFQoMSksICAgICAgICAgKgorCQkJCQkgICAqIFNDU0lfVE1GVU5DKDIpLCBMT0dPVVQoMSkgKi8KKworI2RlZmluZSBJU0VSX1FQX01BWF9SRUNWX0RUT1MJCShJU0NTSV9YTUlUX0NNRFNfTUFYICsgXAorCQkJCQlJU0VSX01BWF9SWF9NSVNDX1BEVVMgICAgKyAgXAorCQkJCQlJU0VSX01BWF9UWF9NSVNDX1BEVVMpCisKKy8qIHRoZSBtYXggVFggKHNlbmQpIFdSIHN1cHBvcnRlZCBieSB0aGUgaVNFUiBRUCBpcyBkZWZpbmVkIGJ5ICAgICAgICAgICAgICAgICAqCisgKiBtYXhfc2VuZF93ciA9IFQgKiAoMSArIEQpICsgQyA7IEQgaXMgaG93IG1hbnkgaW5mbGlnaHQgZGF0YW91dHMgd2UgZXhwZWN0ICAgKgorICogdG8gaGF2ZSBhdCBtYXggZm9yIFNDU0kgY29tbWFuZC4gVGhlIHR4IHBvc3RpbmcgJiBjb21wbGV0aW9uIGhhbmRsaW5nIGNvZGUgICoKKyAqIHN1cHBvcnRzIC1FQUdBSU4gc2NoZW1lIHdoZXJlIHR4IGlzIHN1c3BlbmRlZCB0aWxsIHRoZSBRUCBoYXMgcm9vbSBmb3IgbW9yZSAqCisgKiBzZW5kIFdSLiBEPTggY29tZXMgZnJvbSA2NEsvOEsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBJU0VSX0lORkxJR0hUX0RBVEFPVVRTCQk4CisKKyNkZWZpbmUgSVNFUl9RUF9NQVhfUkVRX0RUT1MJCShJU0NTSV9YTUlUX0NNRFNfTUFYICogICAgXAorCQkJCQkoMSArIElTRVJfSU5GTElHSFRfREFUQU9VVFMpICsgXAorCQkJCQlJU0VSX01BWF9UWF9NSVNDX1BEVVMgICAgICAgICsgXAorCQkJCQlJU0VSX01BWF9SWF9NSVNDX1BEVVMpCisKKyNkZWZpbmUgSVNFUl9WRVIJCQkweDEwCisjZGVmaW5lIElTRVJfV1NWCQkJMHgwOAorI2RlZmluZSBJU0VSX1JTVgkJCTB4MDQKKworc3RydWN0IGlzZXJfaGRyIHsKKwl1OCAgICAgIGZsYWdzOworCXU4ICAgICAgcnN2ZFszXTsKKwlfX2JlMzIgIHdyaXRlX3N0YWc7IC8qIHdyaXRlIHJrZXkgKi8KKwlfX2JlNjQgIHdyaXRlX3ZhOworCV9fYmUzMiAgcmVhZF9zdGFnOyAgLyogcmVhZCBya2V5ICovCisJX19iZTY0ICByZWFkX3ZhOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworCisvKiBMZW5ndGggb2YgYW4gb2JqZWN0IG5hbWUgc3RyaW5nICovCisjZGVmaW5lIElTRVJfT0JKRUNUX05BTUVfU0laRQkJICAgIDY0CisKK2VudW0gaXNlcl9pYl9jb25uX3N0YXRlIHsKKwlJU0VSX0NPTk5fSU5JVCwJCSAgIC8qIGRlc2NyaXB0b3IgYWxsb2NkLCBubyBjb25uICAgICAgICAgICovCisJSVNFUl9DT05OX1BFTkRJTkcsCSAgIC8qIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIGVzdGFibGlzaGVkICovCisJSVNFUl9DT05OX1VQLAkJICAgLyogdXAgYW5kIHJ1bm5pbmcgICAgICAgICAgICAgICAgICAgICAgKi8KKwlJU0VSX0NPTk5fVEVSTUlOQVRJTkcsCSAgIC8qIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIHRlcm1pbmF0ZWQgICovCisJSVNFUl9DT05OX0RPV04sCQkgICAvKiBzaHV0IGRvd24gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCUlTRVJfQ09OTl9TVEFURVNfTlVNCit9OworCitlbnVtIGlzZXJfdGFza19zdGF0dXMgeworCUlTRVJfVEFTS19TVEFUVVNfSU5JVCA9IDAsCisJSVNFUl9UQVNLX1NUQVRVU19TVEFSVEVELAorCUlTRVJfVEFTS19TVEFUVVNfQ09NUExFVEVECit9OworCitlbnVtIGlzZXJfZGF0YV9kaXIgeworCUlTRVJfRElSX0lOID0gMCwJICAgLyogdG8gaW5pdGlhdG9yICovCisJSVNFUl9ESVJfT1VULAkJICAgLyogZnJvbSBpbml0aWF0b3IgKi8KKwlJU0VSX0RJUlNfTlVNCit9OworCitzdHJ1Y3QgaXNlcl9kYXRhX2J1ZiB7CisJdm9pZCAgICAgICAgICAgICAgICpidWY7ICAgICAgLyogcG9pbnRlciB0byB0aGUgc2cgbGlzdCAgICAgICAgICAgICAgICovCisJdW5zaWduZWQgaW50ICAgICAgIHNpemU7ICAgICAgLyogbnVtIGVudHJpZXMgb2YgdGhpcyBzZyAgICAgICAgICAgICAgICovCisJdW5zaWduZWQgbG9uZyAgICAgIGRhdGFfbGVuOyAgLyogdG90YWwgZGF0YSBsZW4gICAgICAgICAgICAgICAgICAgICAgICovCisJdW5zaWduZWQgaW50ICAgICAgIGRtYV9uZW50czsgLyogcmV0dXJuZWQgYnkgZG1hX21hcF9zZyAgICAgICAgICAgICAgICovCisJY2hhciAgICAgICAJICAgKmNvcHlfYnVmOyAvKiBhbGxvY2F0ZWQgY29weSBidWYgZm9yIFNHcyB1bmFsaWduZWQgKgorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGZvciByZG1hIHdoaWNoIGFyZSBjb3BpZWQgICAgICAgICAgICAqLworCXN0cnVjdCBzY2F0dGVybGlzdCBzZ19zaW5nbGU7IC8qIFNHLWlmaWVkIGNsb25lIG9mIGEgbm9uIFNHIFNDIG9yICAgICAqCisJCQkJICAgICAgICogdW5hbGlnbmVkIFNHICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIH07CisKKy8qIGZ3ZCBkZWNsYXJhdGlvbnMgKi8KK3N0cnVjdCBpc2VyX2RldmljZTsKK3N0cnVjdCBpc2NzaV9pc2VyX2Nvbm47CitzdHJ1Y3QgaXNjc2lfaXNlcl9jbWRfdGFzazsKKworc3RydWN0IGlzZXJfbWVtX3JlZyB7CisJdTMyICBsa2V5OworCXUzMiAgcmtleTsKKwl1NjQgIHZhOworCXU2NCAgbGVuOworCXZvaWQgKm1lbV9oOworfTsKKworc3RydWN0IGlzZXJfcmVnZF9idWYgeworCXN0cnVjdCBpc2VyX21lbV9yZWcgICAgIHJlZzsgICAgICAgIC8qIG1lbW9yeSByZWdpc3RyYXRpb24gaW5mbyAgICAgICAgKi8KKwl2b2lkICAgICAgICAgICAgICAgICAgICAqdmlydF9hZGRyOworCXN0cnVjdCBpc2VyX2RldmljZSAgICAgICpkZXZpY2U7ICAgIC8qIGRldmljZS0+ZGV2aWNlIGZvciBkbWFfdW5tYXAgICAgKi8KKwlkbWFfYWRkcl90ICAgICAgICAgICAgICBkbWFfYWRkcjsgICAvKiBpZiBub24gemVybywgYWRkciBmb3IgZG1hX3VubWFwICovCisJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uOyAgLyogZGlyZWN0aW9uIGZvciBkbWFfdW5tYXAJICAgICAgICovCisJdW5zaWduZWQgaW50ICAgICAgICAgICAgZGF0YV9zaXplOworCWF0b21pY190ICAgICAgICAgICAgICAgIHJlZl9jb3VudDsgIC8qIHJlZmNvdW50LCBmcmVlZCB3aGVuIGRlYyB0byAwICAgKi8KK307CisKKyNkZWZpbmUgTUFYX1JFR0RfQlVGX1ZFQ1RPUl9MRU4JMgorCitzdHJ1Y3QgaXNlcl9kdG8geworCXN0cnVjdCBpc2NzaV9pc2VyX2NtZF90YXNrICpjdGFzazsKKwlzdHJ1Y3QgaXNjc2lfaXNlcl9jb25uICAgICAqY29ubjsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlfZW5hYmxlOworCisJLyogdmVjdG9yIG9mIHJlZ2lzdGVyZWQgYnVmZmVycyAqLworCXVuc2lnbmVkIGludCAgICAgICAgICAgICAgIHJlZ2RfdmVjdG9yX2xlbjsKKwlzdHJ1Y3QgaXNlcl9yZWdkX2J1ZiAgICAgICAqcmVnZFtNQVhfUkVHRF9CVUZfVkVDVE9SX0xFTl07CisKKwkvKiBvZmZzZXQgaW50byB0aGUgcmVnaXN0ZXJlZCBidWZmZXIgbWF5IGJlIHNwZWNpZmllZCAqLworCXVuc2lnbmVkIGludCAgICAgICAgICAgICAgIG9mZnNldFtNQVhfUkVHRF9CVUZfVkVDVE9SX0xFTl07CisKKwkvKiBhIHNtYWxsZXIgc2l6ZSBtYXkgYmUgc3BlY2lmaWVkLCBpZiAwLCB0aGVuIGZ1bGwgc2l6ZSBpcyB1c2VkICovCisJdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgdXNlZF9zeltNQVhfUkVHRF9CVUZfVkVDVE9SX0xFTl07Cit9OworCitlbnVtIGlzZXJfZGVzY190eXBlIHsKKwlJU0NTSV9SWCwKKwlJU0NTSV9UWF9DT05UUk9MICwKKwlJU0NTSV9UWF9TQ1NJX0NPTU1BTkQsCisJSVNDU0lfVFhfREFUQU9VVAorfTsKKworc3RydWN0IGlzZXJfZGVzYyB7CisJc3RydWN0IGlzZXJfaGRyICAgICAgICAgICAgICBpc2VyX2hlYWRlcjsKKwlzdHJ1Y3QgaXNjc2lfaGRyICAgICAgICAgICAgIGlzY3NpX2hlYWRlcjsKKwlzdHJ1Y3QgaXNlcl9yZWdkX2J1ZiAgICAgICAgIGhkcl9yZWdkX2J1ZjsKKwl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhOyAgICAgICAgIC8qIHVzZWQgYnkgUlggJiBUWF9DT05UUk9MICovCisJc3RydWN0IGlzZXJfcmVnZF9idWYgICAgICAgICBkYXRhX3JlZ2RfYnVmOyAvKiB1c2VkIGJ5IFJYICYgVFhfQ09OVFJPTCAqLworCWVudW0gICBpc2VyX2Rlc2NfdHlwZSAgICAgICAgdHlwZTsKKwlzdHJ1Y3QgaXNlcl9kdG8gICAgICAgICAgICAgIGR0bzsKK307CisKK3N0cnVjdCBpc2VyX2RldmljZSB7CisJc3RydWN0IGliX2RldmljZSAgICAgICAgICAgICAqaWJfZGV2aWNlOworCXN0cnVjdCBpYl9wZAkgICAgICAgICAgICAgKnBkOworCXN0cnVjdCBpYl9jcQkgICAgICAgICAgICAgKmNxOworCXN0cnVjdCBpYl9tcgkgICAgICAgICAgICAgKm1yOworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdAkgICAgIGNxX3Rhc2tsZXQ7CisJc3RydWN0IGxpc3RfaGVhZCAgICAgICAgICAgICBpZ19saXN0OyAvKiBlbnRyeSBpbiBpZyBkZXZpY2VzIGxpc3QgKi8KKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmNvdW50OworfTsKKworc3RydWN0IGlzZXJfY29ubiB7CisJc3RydWN0IGlzY3NpX2lzZXJfY29ubiAgICAgICAqaXNlcl9jb25uOyAvKiBpc2VyIGNvbm4gZm9yIHVwY2FsbHMgICovCisJZW51bSBpc2VyX2liX2Nvbm5fc3RhdGUJICAgICBzdGF0ZTsJICAgIC8qIHJkbWEgY29ubmVjdGlvbiBzdGF0ZSAgICovCisJc3BpbmxvY2tfdAkJICAgICBsb2NrOwkgICAgLyogdXNlZCBmb3Igc3RhdGUgY2hhbmdlcyAgKi8KKwlzdHJ1Y3QgaXNlcl9kZXZpY2UgICAgICAgICAgICpkZXZpY2U7ICAgICAgIC8qIGRldmljZSBjb250ZXh0ICAgICAgICAgICovCisJc3RydWN0IHJkbWFfY21faWQgICAgICAgICAgICAqY21hX2lkOyAgICAgICAvKiBDTUEgSUQJCSAgICAgICAqLworCXN0cnVjdCBpYl9xcAkgICAgICAgICAgICAgKnFwOyAgICAgICAgICAgLyogUVAgCQkgICAgICAgKi8KKwlzdHJ1Y3QgaWJfZm1yX3Bvb2wgICAgICAgICAgICpmbXJfcG9vbDsgICAgIC8qIHBvb2wgb2YgSUIgRk1ScyAgICAgICAgICovCisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNjX2V2dF9mbGFnOyAvKiBkaXNjb25uIGV2ZW50IGRlbGl2ZXJlZCAqLworCXdhaXRfcXVldWVfaGVhZF90CSAgICAgd2FpdDsgICAgICAgICAgLyogd2FpdHEgZm9yIGNvbm4vZGlzY29ubiAgKi8KKwlhdG9taWNfdCAgICAgICAgICAgICAgICAgICAgIHBvc3RfcmVjdl9idWZfY291bnQ7IC8qIHBvc3RlZCByeCBjb3VudCAgICovCisJYXRvbWljX3QgICAgICAgICAgICAgICAgICAgICBwb3N0X3NlbmRfYnVmX2NvdW50OyAvKiBwb3N0ZWQgdHggY291bnQgICAqLworCXN0cnVjdCB3b3JrX3N0cnVjdCAgICAgICAgICAgY29tcGVycm9yX3dvcms7IC8qIGNvbm4gdGVybSBzbGVlcGFibGUgY3R4Ki8KKwljaGFyIAkJCSAgICAgbmFtZVtJU0VSX09CSkVDVF9OQU1FX1NJWkVdOworCXN0cnVjdCBpc2VyX3BhZ2VfdmVjICAgICAgICAgKnBhZ2VfdmVjOyAgICAgLyogcmVwcmVzZW50cyBTRyB0byBmbXIgbWFwcyoKKwkJCQkJCSAgICAgKiBtYXBzIHNlcmlhbGl6ZWQgYXMgdHggaXMqLworCXN0cnVjdCBsaXN0X2hlYWQJICAgICBjb25uX2xpc3Q7ICAgICAgIC8qIGVudHJ5IGluIGlnIGNvbm4gbGlzdCAqLworfTsKKworc3RydWN0IGlzY3NpX2lzZXJfY29ubiB7CisJc3RydWN0IGlzY3NpX2Nvbm4gICAgICAgICAgICAqaXNjc2lfY29ubjsvKiBwdHIgdG8gaXNjc2kgY29ubiAqLworCXN0cnVjdCBpc2VyX2Nvbm4gICAgICAgICAgICAgKmliX2Nvbm47ICAgLyogaVNFUiBJQiBjb25uICAgICAgKi8KKworCXJ3bG9ja190CQkgICAgIGxvY2s7Cit9OworCitzdHJ1Y3QgaXNjc2lfaXNlcl9jbWRfdGFzayB7CisJc3RydWN0IGlzZXJfZGVzYyAgICAgICAgICAgICBkZXNjOworCXN0cnVjdCBpc2NzaV9pc2VyX2Nvbm4JICAgICAqaXNlcl9jb25uOworCWludAkJCSAgICAgcmRtYV9kYXRhX2NvdW50Oy8qIFJETUEgYnl0ZXMgICAgICAgICAgICovCisJZW51bSBpc2VyX3Rhc2tfc3RhdHVzIAkgICAgIHN0YXR1czsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRfc2VudDsgIC8qIHNldCBpZiBjb21tYW5kICBzZW50ICAqLworCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyW0lTRVJfRElSU19OVU1dOyAgICAgIC8qIHNldCBpZiBkaXIgdXNlKi8KKwlzdHJ1Y3QgaXNlcl9yZWdkX2J1ZiAgICAgICAgIHJkbWFfcmVnZFtJU0VSX0RJUlNfTlVNXTsvKiByZWdkIHJkbWEgYnVmICovCisJc3RydWN0IGlzZXJfZGF0YV9idWYgICAgICAgICBkYXRhW0lTRVJfRElSU19OVU1dOyAgICAgLyogb3JpZy4gZGF0YSBkZXMqLworCXN0cnVjdCBpc2VyX2RhdGFfYnVmICAgICAgICAgZGF0YV9jb3B5W0lTRVJfRElSU19OVU1dOy8qIGNvbnRpZy4gY29weSAgKi8KK307CisKK3N0cnVjdCBpc2VyX3BhZ2VfdmVjIHsKKwl1NjQgKnBhZ2VzOworCWludCBsZW5ndGg7CisJaW50IG9mZnNldDsKKwlpbnQgZGF0YV9zaXplOworfTsKKworc3RydWN0IGlzZXJfZ2xvYmFsIHsKKwlzdHJ1Y3QgbXV0ZXggICAgICBkZXZpY2VfbGlzdF9tdXRleDsvKiAgICAgICAgICAgICAgICAgICAqLworCXN0cnVjdCBsaXN0X2hlYWQgIGRldmljZV9saXN0OwkgICAgIC8qIGFsbCBpU0VSIGRldmljZXMgKi8KKwlzdHJ1Y3QgbXV0ZXggICAgICBjb25ubGlzdF9tdXRleDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICBjb25ubGlzdDsJCS8qIGFsbCBpU0VSIElCIGNvbm5lY3Rpb25zICovCisKKwlrbWVtX2NhY2hlX3QgKmRlc2NfY2FjaGU7Cit9OworCitleHRlcm4gc3RydWN0IGlzZXJfZ2xvYmFsIGlnOworZXh0ZXJuIGludCBpc2VyX2RlYnVnX2xldmVsOworCisvKiBhbGxvY2F0ZSBjb25uZWN0aW9uIHJlc291cmNlcyBuZWVkZWQgZm9yIHJkbWEgZnVuY3Rpb25hbGl0eSAqLworaW50IGlzZXJfY29ubl9zZXRfZnVsbF9mZWF0dXJlZF9tb2RlKHN0cnVjdCBpc2NzaV9jb25uICpjb25uKTsKKworaW50IGlzZXJfc2VuZF9jb250cm9sKHN0cnVjdCBpc2NzaV9jb25uICAgICAgKmNvbm4sCisJCSAgICAgIHN0cnVjdCBpc2NzaV9tZ210X3Rhc2sgKm10YXNrKTsKKworaW50IGlzZXJfc2VuZF9jb21tYW5kKHN0cnVjdCBpc2NzaV9jb25uICAgICAgKmNvbm4sCisJCSAgICAgIHN0cnVjdCBpc2NzaV9jbWRfdGFzayAgKmN0YXNrKTsKKworaW50IGlzZXJfc2VuZF9kYXRhX291dChzdHJ1Y3QgaXNjc2lfY29ubiAgICAgKmNvbm4sCisJCSAgICAgICBzdHJ1Y3QgaXNjc2lfY21kX3Rhc2sgKmN0YXNrLAorCQkgICAgICAgc3RydWN0IGlzY3NpX2RhdGEgICAgICAgICAgKmhkcik7CisKK3ZvaWQgaXNjc2lfaXNlcl9yZWN2KHN0cnVjdCBpc2NzaV9jb25uICpjb25uLAorCQkgICAgIHN0cnVjdCBpc2NzaV9oZHIgICAgICAgKmhkciwKKwkJICAgICBjaGFyICAgICAgICAgICAgICAgICAgICpyeF9kYXRhLAorCQkgICAgIGludCAgICAgICAgICAgICAgICAgICAgcnhfZGF0YV9sZW4pOworCitpbnQgIGlzZXJfY29ubl9pbml0KHN0cnVjdCBpc2VyX2Nvbm4gKippYl9jb25uKTsKKwordm9pZCBpc2VyX2Nvbm5fdGVybWluYXRlKHN0cnVjdCBpc2VyX2Nvbm4gKmliX2Nvbm4pOworCit2b2lkIGlzZXJfY29ubl9yZWxlYXNlKHN0cnVjdCBpc2VyX2Nvbm4gKmliX2Nvbm4pOworCit2b2lkIGlzZXJfcmN2X2NvbXBsZXRpb24oc3RydWN0IGlzZXJfZGVzYyAqZGVzYywKKwkJCSB1bnNpZ25lZCBsb25nICAgIGR0b194ZmVyX2xlbik7CisKK3ZvaWQgaXNlcl9zbmRfY29tcGxldGlvbihzdHJ1Y3QgaXNlcl9kZXNjICpkZXNjKTsKKwordm9pZCBpc2VyX2N0YXNrX3JkbWFfaW5pdChzdHJ1Y3QgaXNjc2lfaXNlcl9jbWRfdGFzayAgICAgKmN0YXNrKTsKKwordm9pZCBpc2VyX2N0YXNrX3JkbWFfZmluYWxpemUoc3RydWN0IGlzY3NpX2lzZXJfY21kX3Rhc2sgKmN0YXNrKTsKKwordm9pZCBpc2VyX2R0b19idWZmc19yZWxlYXNlKHN0cnVjdCBpc2VyX2R0byAqZHRvKTsKKworaW50ICBpc2VyX3JlZ2RfYnVmZl9yZWxlYXNlKHN0cnVjdCBpc2VyX3JlZ2RfYnVmICpyZWdkX2J1Zik7CisKK3ZvaWQgaXNlcl9yZWdfc2luZ2xlKHN0cnVjdCBpc2VyX2RldmljZSAgICAgICpkZXZpY2UsCisJCSAgICAgc3RydWN0IGlzZXJfcmVnZF9idWYgICAgKnJlZ2RfYnVmLAorCQkgICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbik7CisKK2ludCAgaXNlcl9zdGFydF9yZG1hX3VuYWxpZ25lZF9zZyhzdHJ1Y3QgaXNjc2lfaXNlcl9jbWRfdGFzayAgICAqY3Rhc2ssCisJCQkJICBlbnVtIGlzZXJfZGF0YV9kaXIgICAgICAgICAgICBjbWRfZGlyKTsKKwordm9pZCBpc2VyX2ZpbmFsaXplX3JkbWFfdW5hbGlnbmVkX3NnKHN0cnVjdCBpc2NzaV9pc2VyX2NtZF90YXNrICpjdGFzaywKKwkJCQkgICAgIGVudW0gaXNlcl9kYXRhX2RpciAgICAgICAgIGNtZF9kaXIpOworCitpbnQgIGlzZXJfcmVnX3JkbWFfbWVtKHN0cnVjdCBpc2NzaV9pc2VyX2NtZF90YXNrICpjdGFzaywKKwkJICAgICAgIGVudW0gICBpc2VyX2RhdGFfZGlyICAgICAgICBjbWRfZGlyKTsKKworaW50ICBpc2VyX2Nvbm5lY3Qoc3RydWN0IGlzZXJfY29ubiAgICppYl9jb25uLAorCQkgIHN0cnVjdCBzb2NrYWRkcl9pbiAqc3JjX2FkZHIsCisJCSAgc3RydWN0IHNvY2thZGRyX2luICpkc3RfYWRkciwKKwkJICBpbnQgICAgICAgICAgICAgICAgbm9uX2Jsb2NraW5nKTsKKworaW50ICBpc2VyX3JlZ19wYWdlX3ZlYyhzdHJ1Y3QgaXNlcl9jb25uICAgICAqaWJfY29ubiwKKwkJICAgICAgIHN0cnVjdCBpc2VyX3BhZ2VfdmVjICpwYWdlX3ZlYywKKwkJICAgICAgIHN0cnVjdCBpc2VyX21lbV9yZWcgICptZW1fcmVnKTsKKwordm9pZCBpc2VyX3VucmVnX21lbShzdHJ1Y3QgaXNlcl9tZW1fcmVnICptZW1fcmVnKTsKKworaW50ICBpc2VyX3Bvc3RfcmVjdihzdHJ1Y3QgaXNlcl9kZXNjICpyeF9kZXNjKTsKK2ludCAgaXNlcl9wb3N0X3NlbmQoc3RydWN0IGlzZXJfZGVzYyAqdHhfZGVzYyk7CisKK2ludCBpc2VyX2Nvbm5fc3RhdGVfY29tcChzdHJ1Y3QgaXNlcl9jb25uICppYl9jb25uLAorCQkJIGVudW0gaXNlcl9pYl9jb25uX3N0YXRlIGNvbXApOworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lzZXIvaXNlcl9pbml0aWF0b3IuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXNlci9pc2VyX2luaXRpYXRvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjZjU2ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lzZXIvaXNlcl9pbml0aWF0b3IuYwpAQCAtMCwwICsxLDczOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSwgMjAwNiBWb2x0YWlyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCisgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiwgYXZhaWxhYmxlIGZyb20gdGhlIGZpbGUKKyAqIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUsIG9yIHRoZQorICogT3BlbklCLm9yZyBCU0QgbGljZW5zZSBiZWxvdzoKKyAqCisgKiAgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgorICogICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZworICogICAgIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKgktIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKKyAqCSAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqCSAgZGlzY2xhaW1lci4KKyAqCisgKgktIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqCSAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqCSAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKgkgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICoKKyAqICRJZDogaXNlcl9pbml0aWF0b3IuYyA2OTY0IDIwMDYtMDUtMDcgMTE6MTE6NDNaIG9nZXJsaXR6ICQKKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zY2F0dGVybGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CisjaW5jbHVkZSA8bGludXgva2ZpZm8uaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisKKyNpbmNsdWRlICJpc2NzaV9pc2VyLmgiCisKKy8qIENvbnN0YW50IFBEVSBsZW5ndGhzIGNhbGN1bGF0aW9ucyAqLworI2RlZmluZSBJU0VSX1RPVEFMX0hFQURFUlNfTEVOICAoc2l6ZW9mIChzdHJ1Y3QgaXNlcl9oZHIpICsgXAorCQkJCSBzaXplb2YgKHN0cnVjdCBpc2NzaV9oZHIpKQorCisvKiBpc2VyX2R0b19hZGRfcmVnZF9idWZmIC0gaW5jcmVtZW50cyB0aGUgcmVmZXJlbmNlIGNvdW50IGZvciAqCisgKiB0aGUgcmVnaXN0ZXJlZCBidWZmZXIgJiBhZGRzIGl0IHRvIHRoZSBEVE8gb2JqZWN0ICAgICAgICAgICAqLworc3RhdGljIHZvaWQgaXNlcl9kdG9fYWRkX3JlZ2RfYnVmZihzdHJ1Y3QgaXNlcl9kdG8gKmR0bywKKwkJCQkgICBzdHJ1Y3QgaXNlcl9yZWdkX2J1ZiAqcmVnZF9idWYsCisJCQkJICAgdW5zaWduZWQgbG9uZyB1c2Vfb2Zmc2V0LAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgdXNlX3NpemUpCit7CisJaW50IGFkZF9pZHg7CisKKwlhdG9taWNfaW5jKCZyZWdkX2J1Zi0+cmVmX2NvdW50KTsKKworCWFkZF9pZHggPSBkdG8tPnJlZ2RfdmVjdG9yX2xlbjsKKwlkdG8tPnJlZ2RbYWRkX2lkeF0gPSByZWdkX2J1ZjsKKwlkdG8tPnVzZWRfc3pbYWRkX2lkeF0gPSB1c2Vfc2l6ZTsKKwlkdG8tPm9mZnNldFthZGRfaWR4XSA9IHVzZV9vZmZzZXQ7CisKKwlkdG8tPnJlZ2RfdmVjdG9yX2xlbisrOworfQorCitzdGF0aWMgaW50IGlzZXJfZG1hX21hcF90YXNrX2RhdGEoc3RydWN0IGlzY3NpX2lzZXJfY21kX3Rhc2sgKmlzZXJfY3Rhc2ssCisJCQkJICBzdHJ1Y3QgaXNlcl9kYXRhX2J1ZiAgICAgICAqZGF0YSwKKwkJCQkgIGVudW0gICBpc2VyX2RhdGFfZGlyICAgICAgIGlzZXJfZGlyLAorCQkJCSAgZW51bSAgIGRtYV9kYXRhX2RpcmVjdGlvbiAgZG1hX2RpcikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkbWFfZGV2aWNlOworCisJaXNlcl9jdGFzay0+ZGlyW2lzZXJfZGlyXSA9IDE7CisJZG1hX2RldmljZSA9IGlzZXJfY3Rhc2stPmlzZXJfY29ubi0+aWJfY29ubi0+ZGV2aWNlLT5pYl9kZXZpY2UtPmRtYV9kZXZpY2U7CisKKwlkYXRhLT5kbWFfbmVudHMgPSBkbWFfbWFwX3NnKGRtYV9kZXZpY2UsIGRhdGEtPmJ1ZiwgZGF0YS0+c2l6ZSwgZG1hX2Rpcik7CisJaWYgKGRhdGEtPmRtYV9uZW50cyA9PSAwKSB7CisJCWlzZXJfZXJyKCJkbWFfbWFwX3NnIGZhaWxlZCEhIVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaXNlcl9kbWFfdW5tYXBfdGFza19kYXRhKHN0cnVjdCBpc2NzaV9pc2VyX2NtZF90YXNrICppc2VyX2N0YXNrKQoreworCXN0cnVjdCBkZXZpY2UgICpkbWFfZGV2aWNlOworCXN0cnVjdCBpc2VyX2RhdGFfYnVmICpkYXRhOworCisJZG1hX2RldmljZSA9IGlzZXJfY3Rhc2stPmlzZXJfY29ubi0+aWJfY29ubi0+ZGV2aWNlLT5pYl9kZXZpY2UtPmRtYV9kZXZpY2U7CisKKwlpZiAoaXNlcl9jdGFzay0+ZGlyW0lTRVJfRElSX0lOXSkgeworCQlkYXRhID0gJmlzZXJfY3Rhc2stPmRhdGFbSVNFUl9ESVJfSU5dOworCQlkbWFfdW5tYXBfc2coZG1hX2RldmljZSwgZGF0YS0+YnVmLCBkYXRhLT5zaXplLCBETUFfRlJPTV9ERVZJQ0UpOworCX0KKworCWlmIChpc2VyX2N0YXNrLT5kaXJbSVNFUl9ESVJfT1VUXSkgeworCQlkYXRhID0gJmlzZXJfY3Rhc2stPmRhdGFbSVNFUl9ESVJfT1VUXTsKKwkJZG1hX3VubWFwX3NnKGRtYV9kZXZpY2UsIGRhdGEtPmJ1ZiwgZGF0YS0+c2l6ZSwgRE1BX1RPX0RFVklDRSk7CisJfQorfQorCisvKiBSZWdpc3RlciB1c2VyIGJ1ZmZlciBtZW1vcnkgYW5kIGluaXRpYWxpemUgcGFzc2l2ZSByZG1hCisgKiAgZHRvIGRlc2NyaXB0b3IuIFRvdGFsIGRhdGEgc2l6ZSBpcyBzdG9yZWQgaW4KKyAqICBpc2VyX2N0YXNrLT5kYXRhW0lTRVJfRElSX0lOXS5kYXRhX2xlbgorICovCitzdGF0aWMgaW50IGlzZXJfcHJlcGFyZV9yZWFkX2NtZChzdHJ1Y3QgaXNjc2lfY21kX3Rhc2sgKmN0YXNrLAorCQkJCSB1bnNpZ25lZCBpbnQgZWR0bCkKKworeworCXN0cnVjdCBpc2NzaV9pc2VyX2NtZF90YXNrICppc2VyX2N0YXNrID0gY3Rhc2stPmRkX2RhdGE7CisJc3RydWN0IGlzZXJfcmVnZF9idWYgKnJlZ2RfYnVmOworCWludCBlcnI7CisJc3RydWN0IGlzZXJfaGRyICpoZHIgPSAmaXNlcl9jdGFzay0+ZGVzYy5pc2VyX2hlYWRlcjsKKwlzdHJ1Y3QgaXNlcl9kYXRhX2J1ZiAqYnVmX2luID0gJmlzZXJfY3Rhc2stPmRhdGFbSVNFUl9ESVJfSU5dOworCisJZXJyID0gaXNlcl9kbWFfbWFwX3Rhc2tfZGF0YShpc2VyX2N0YXNrLAorCQkJCSAgICAgYnVmX2luLAorCQkJCSAgICAgSVNFUl9ESVJfSU4sCisJCQkJICAgICBETUFfRlJPTV9ERVZJQ0UpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlpZiAoZWR0bCA+IGlzZXJfY3Rhc2stPmRhdGFbSVNFUl9ESVJfSU5dLmRhdGFfbGVuKSB7CisJCWlzZXJfZXJyKCJUb3RhbCBkYXRhIGxlbmd0aDogJWxkLCBsZXNzIHRoYW4gRURUTDogIgorCQkJICIlZCwgaW4gUkVBRCBjbWQgQkhTIGl0dDogJWQsIGNvbm46IDB4JXBcbiIsCisJCQkgaXNlcl9jdGFzay0+ZGF0YVtJU0VSX0RJUl9JTl0uZGF0YV9sZW4sIGVkdGwsCisJCQkgY3Rhc2stPml0dCwgaXNlcl9jdGFzay0+aXNlcl9jb25uKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZXJyID0gaXNlcl9yZWdfcmRtYV9tZW0oaXNlcl9jdGFzayxJU0VSX0RJUl9JTik7CisJaWYgKGVycikgeworCQlpc2VyX2VycigiRmFpbGVkIHRvIHNldCB1cCBEYXRhLUlOIFJETUFcbiIpOworCQlyZXR1cm4gZXJyOworCX0KKwlyZWdkX2J1ZiA9ICZpc2VyX2N0YXNrLT5yZG1hX3JlZ2RbSVNFUl9ESVJfSU5dOworCisJaGRyLT5mbGFncyAgICB8PSBJU0VSX1JTVjsKKwloZHItPnJlYWRfc3RhZyA9IGNwdV90b19iZTMyKHJlZ2RfYnVmLT5yZWcucmtleSk7CisJaGRyLT5yZWFkX3ZhICAgPSBjcHVfdG9fYmU2NChyZWdkX2J1Zi0+cmVnLnZhKTsKKworCWlzZXJfZGJnKCJDbWQgaXR0OiVkIFJFQUQgdGFncyBSS0VZOiUjLjRYIFZBOiUjbGxYXG4iLAorCQkgY3Rhc2stPml0dCwgcmVnZF9idWYtPnJlZy5ya2V5LAorCQkgKHVuc2lnbmVkIGxvbmcgbG9uZylyZWdkX2J1Zi0+cmVnLnZhKTsKKworCXJldHVybiAwOworfQorCisvKiBSZWdpc3RlciB1c2VyIGJ1ZmZlciBtZW1vcnkgYW5kIGluaXRpYWxpemUgcGFzc2l2ZSByZG1hCisgKiAgZHRvIGRlc2NyaXB0b3IuIFRvdGFsIGRhdGEgc2l6ZSBpcyBzdG9yZWQgaW4KKyAqICBjdGFzay0+ZGF0YVtJU0VSX0RJUl9PVVRdLmRhdGFfbGVuCisgKi8KK3N0YXRpYyBpbnQKK2lzZXJfcHJlcGFyZV93cml0ZV9jbWQoc3RydWN0IGlzY3NpX2NtZF90YXNrICpjdGFzaywKKwkJICAgICAgIHVuc2lnbmVkIGludCBpbW1fc3osCisJCSAgICAgICB1bnNpZ25lZCBpbnQgdW5zb2xfc3osCisJCSAgICAgICB1bnNpZ25lZCBpbnQgZWR0bCkKK3sKKwlzdHJ1Y3QgaXNjc2lfaXNlcl9jbWRfdGFzayAqaXNlcl9jdGFzayA9IGN0YXNrLT5kZF9kYXRhOworCXN0cnVjdCBpc2VyX3JlZ2RfYnVmICpyZWdkX2J1ZjsKKwlpbnQgZXJyOworCXN0cnVjdCBpc2VyX2R0byAqc2VuZF9kdG8gPSAmaXNlcl9jdGFzay0+ZGVzYy5kdG87CisJc3RydWN0IGlzZXJfaGRyICpoZHIgPSAmaXNlcl9jdGFzay0+ZGVzYy5pc2VyX2hlYWRlcjsKKwlzdHJ1Y3QgaXNlcl9kYXRhX2J1ZiAqYnVmX291dCA9ICZpc2VyX2N0YXNrLT5kYXRhW0lTRVJfRElSX09VVF07CisKKwllcnIgPSBpc2VyX2RtYV9tYXBfdGFza19kYXRhKGlzZXJfY3Rhc2ssCisJCQkJICAgICBidWZfb3V0LAorCQkJCSAgICAgSVNFUl9ESVJfT1VULAorCQkJCSAgICAgRE1BX1RPX0RFVklDRSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWlmIChlZHRsID4gaXNlcl9jdGFzay0+ZGF0YVtJU0VSX0RJUl9PVVRdLmRhdGFfbGVuKSB7CisJCWlzZXJfZXJyKCJUb3RhbCBkYXRhIGxlbmd0aDogJWxkLCBsZXNzIHRoYW4gRURUTDogJWQsICIKKwkJCSAiaW4gV1JJVEUgY21kIEJIUyBpdHQ6ICVkLCBjb25uOiAweCVwXG4iLAorCQkJIGlzZXJfY3Rhc2stPmRhdGFbSVNFUl9ESVJfT1VUXS5kYXRhX2xlbiwKKwkJCSBlZHRsLCBjdGFzay0+aXR0LCBjdGFzay0+Y29ubik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWVyciA9IGlzZXJfcmVnX3JkbWFfbWVtKGlzZXJfY3Rhc2ssSVNFUl9ESVJfT1VUKTsKKwlpZiAoZXJyICE9IDApIHsKKwkJaXNlcl9lcnIoIkZhaWxlZCB0byByZWdpc3RlciB3cml0ZSBjbWQgUkRNQSBtZW1cbiIpOworCQlyZXR1cm4gZXJyOworCX0KKworCXJlZ2RfYnVmID0gJmlzZXJfY3Rhc2stPnJkbWFfcmVnZFtJU0VSX0RJUl9PVVRdOworCisJaWYgKHVuc29sX3N6IDwgZWR0bCkgeworCQloZHItPmZsYWdzICAgICB8PSBJU0VSX1dTVjsKKwkJaGRyLT53cml0ZV9zdGFnID0gY3B1X3RvX2JlMzIocmVnZF9idWYtPnJlZy5ya2V5KTsKKwkJaGRyLT53cml0ZV92YSAgID0gY3B1X3RvX2JlNjQocmVnZF9idWYtPnJlZy52YSArIHVuc29sX3N6KTsKKworCQlpc2VyX2RiZygiQ21kIGl0dDolZCwgV1JJVEUgdGFncywgUktFWTolIy40WCAiCisJCQkgIlZBOiUjbGxYICsgdW5zb2w6JWRcbiIsCisJCQkgY3Rhc2stPml0dCwgcmVnZF9idWYtPnJlZy5ya2V5LAorCQkJICh1bnNpZ25lZCBsb25nIGxvbmcpcmVnZF9idWYtPnJlZy52YSwgdW5zb2xfc3opOworCX0KKworCWlmIChpbW1fc3ogPiAwKSB7CisJCWlzZXJfZGJnKCJDbWQgaXR0OiVkLCBXUklURSwgYWRkaW5nIGltbS5kYXRhIHN6OiAlZFxuIiwKKwkJCSBjdGFzay0+aXR0LCBpbW1fc3opOworCQlpc2VyX2R0b19hZGRfcmVnZF9idWZmKHNlbmRfZHRvLAorCQkJCSAgICAgICByZWdkX2J1ZiwKKwkJCQkgICAgICAgMCwKKwkJCQkgICAgICAgaW1tX3N6KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBpc2VyX3Bvc3RfcmVjZWl2ZV9jb250cm9sIC0gYWxsb2NhdGVzLCBpbml0aWFsaXplcyBhbmQgcG9zdHMgcmVjZWl2ZSBEVE8uCisgKi8KK3N0YXRpYyBpbnQgaXNlcl9wb3N0X3JlY2VpdmVfY29udHJvbChzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubikKK3sKKwlzdHJ1Y3QgaXNjc2lfaXNlcl9jb25uICppc2VyX2Nvbm4gPSBjb25uLT5kZF9kYXRhOworCXN0cnVjdCBpc2VyX2Rlc2MgICAgICpyeF9kZXNjOworCXN0cnVjdCBpc2VyX3JlZ2RfYnVmICpyZWdkX2hkcjsKKwlzdHJ1Y3QgaXNlcl9yZWdkX2J1ZiAqcmVnZF9kYXRhOworCXN0cnVjdCBpc2VyX2R0byAgICAgICpyZWN2X2R0byA9IE5VTEw7CisJc3RydWN0IGlzZXJfZGV2aWNlICAqZGV2aWNlID0gaXNlcl9jb25uLT5pYl9jb25uLT5kZXZpY2U7CisJaW50IHJ4X2RhdGFfc2l6ZSwgZXJyID0gMDsKKworCXJ4X2Rlc2MgPSBrbWVtX2NhY2hlX2FsbG9jKGlnLmRlc2NfY2FjaGUsIEdGUF9OT0lPKTsKKwlpZiAocnhfZGVzYyA9PSBOVUxMKSB7CisJCWlzZXJfZXJyKCJGYWlsZWQgdG8gYWxsb2MgZGVzYyBmb3IgcG9zdCByZWN2XG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXJ4X2Rlc2MtPnR5cGUgPSBJU0NTSV9SWDsKKworCS8qIGZvciB0aGUgbG9naW4gc2VxdWVuY2Ugd2UgbXVzdCBzdXBwb3J0IHJ4IG9mIHVwdG8gOEs7IGxvZ2luIGlzIGRvbmUKKwkgKiBhZnRlciBjb25uIGNyZWF0ZS9iaW5kIChjb25uZWN0KSBhbmQgY29ubiBzdG9wL2JpbmQgKHJlY29ubmVjdCksCisJICogd2hhdCdzIGNvbW1vbiBmb3IgYm90aCBzY2hlbWVzIGlzIHRoYXQgdGhlIGNvbm5lY3Rpb24gaXMgbm90IHN0YXJ0ZWQKKwkgKi8KKwlpZiAoY29ubi0+Y19zdGFnZSAhPSBJU0NTSV9DT05OX1NUQVJURUQpCisJCXJ4X2RhdGFfc2l6ZSA9IERFRkFVTFRfTUFYX1JFQ1ZfREFUQV9TRUdNRU5UX0xFTkdUSDsKKwllbHNlIC8qIEZJWE1FIHRpbGwgdXNlciBzcGFjZSBzZXRzIGNvbm4tPm1heF9yZWN2X2RsZW5ndGggY29ycmVjdGx5ICovCisJCXJ4X2RhdGFfc2l6ZSA9IDEyODsKKworCXJ4X2Rlc2MtPmRhdGEgPSBrbWFsbG9jKHJ4X2RhdGFfc2l6ZSwgR0ZQX05PSU8pOworCWlmIChyeF9kZXNjLT5kYXRhID09IE5VTEwpIHsKKwkJaXNlcl9lcnIoIkZhaWxlZCB0byBhbGxvYyBkYXRhIGJ1ZiBmb3IgcG9zdCByZWN2XG4iKTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBwb3N0X3J4X2ttYWxsb2NfZmFpbHVyZTsKKwl9CisKKwlyZWN2X2R0byA9ICZyeF9kZXNjLT5kdG87CisJcmVjdl9kdG8tPmNvbm4gICAgICAgICAgPSBpc2VyX2Nvbm47CisJcmVjdl9kdG8tPnJlZ2RfdmVjdG9yX2xlbiA9IDA7CisKKwlyZWdkX2hkciA9ICZyeF9kZXNjLT5oZHJfcmVnZF9idWY7CisJbWVtc2V0KHJlZ2RfaGRyLCAwLCBzaXplb2Yoc3RydWN0IGlzZXJfcmVnZF9idWYpKTsKKwlyZWdkX2hkci0+ZGV2aWNlICA9IGRldmljZTsKKwlyZWdkX2hkci0+dmlydF9hZGRyICA9IHJ4X2Rlc2M7IC8qID09ICZyeF9kZXNjLT5pc2VyX2hlYWRlciAqLworCXJlZ2RfaGRyLT5kYXRhX3NpemUgID0gSVNFUl9UT1RBTF9IRUFERVJTX0xFTjsKKworCWlzZXJfcmVnX3NpbmdsZShkZXZpY2UsIHJlZ2RfaGRyLCBETUFfRlJPTV9ERVZJQ0UpOworCisJaXNlcl9kdG9fYWRkX3JlZ2RfYnVmZihyZWN2X2R0bywgcmVnZF9oZHIsIDAsIDApOworCisJcmVnZF9kYXRhID0gJnJ4X2Rlc2MtPmRhdGFfcmVnZF9idWY7CisJbWVtc2V0KHJlZ2RfZGF0YSwgMCwgc2l6ZW9mKHN0cnVjdCBpc2VyX3JlZ2RfYnVmKSk7CisJcmVnZF9kYXRhLT5kZXZpY2UgID0gZGV2aWNlOworCXJlZ2RfZGF0YS0+dmlydF9hZGRyICA9IHJ4X2Rlc2MtPmRhdGE7CisJcmVnZF9kYXRhLT5kYXRhX3NpemUgID0gcnhfZGF0YV9zaXplOworCisJaXNlcl9yZWdfc2luZ2xlKGRldmljZSwgcmVnZF9kYXRhLCBETUFfRlJPTV9ERVZJQ0UpOworCisJaXNlcl9kdG9fYWRkX3JlZ2RfYnVmZihyZWN2X2R0bywgcmVnZF9kYXRhLCAwLCAwKTsKKworCWVyciA9IGlzZXJfcG9zdF9yZWN2KHJ4X2Rlc2MpOworCWlmICghZXJyKQorCQlyZXR1cm4gMDsKKworCS8qIGlzZXJfcG9zdF9yZWN2IGZhaWxlZCAqLworCWlzZXJfZHRvX2J1ZmZzX3JlbGVhc2UocmVjdl9kdG8pOworCWtmcmVlKHJ4X2Rlc2MtPmRhdGEpOworcG9zdF9yeF9rbWFsbG9jX2ZhaWx1cmU6CisJa21lbV9jYWNoZV9mcmVlKGlnLmRlc2NfY2FjaGUsIHJ4X2Rlc2MpOworCXJldHVybiBlcnI7Cit9CisKKy8qIGNyZWF0ZXMgYSBuZXcgdHggZGVzY3JpcHRvciBhbmQgYWRkcyBoZWFkZXIgcmVnZCBidWZmZXIgKi8KK3N0YXRpYyB2b2lkIGlzZXJfY3JlYXRlX3NlbmRfZGVzYyhzdHJ1Y3QgaXNjc2lfaXNlcl9jb25uICppc2VyX2Nvbm4sCisJCQkJICBzdHJ1Y3QgaXNlcl9kZXNjICAgICAgICp0eF9kZXNjKQoreworCXN0cnVjdCBpc2VyX3JlZ2RfYnVmICpyZWdkX2hkciA9ICZ0eF9kZXNjLT5oZHJfcmVnZF9idWY7CisJc3RydWN0IGlzZXJfZHRvICAgICAgKnNlbmRfZHRvID0gJnR4X2Rlc2MtPmR0bzsKKworCW1lbXNldChyZWdkX2hkciwgMCwgc2l6ZW9mKHN0cnVjdCBpc2VyX3JlZ2RfYnVmKSk7CisJcmVnZF9oZHItPmRldmljZSAgPSBpc2VyX2Nvbm4tPmliX2Nvbm4tPmRldmljZTsKKwlyZWdkX2hkci0+dmlydF9hZGRyICA9IHR4X2Rlc2M7IC8qID09ICZ0eF9kZXNjLT5pc2VyX2hlYWRlciAqLworCXJlZ2RfaGRyLT5kYXRhX3NpemUgID0gSVNFUl9UT1RBTF9IRUFERVJTX0xFTjsKKworCXNlbmRfZHRvLT5jb25uICAgICAgICAgID0gaXNlcl9jb25uOworCXNlbmRfZHRvLT5ub3RpZnlfZW5hYmxlICAgPSAxOworCXNlbmRfZHRvLT5yZWdkX3ZlY3Rvcl9sZW4gPSAwOworCisJbWVtc2V0KCZ0eF9kZXNjLT5pc2VyX2hlYWRlciwgMCwgc2l6ZW9mKHN0cnVjdCBpc2VyX2hkcikpOworCXR4X2Rlc2MtPmlzZXJfaGVhZGVyLmZsYWdzID0gSVNFUl9WRVI7CisKKwlpc2VyX2R0b19hZGRfcmVnZF9idWZmKHNlbmRfZHRvLCByZWdkX2hkciwgMCwgMCk7Cit9CisKKy8qKgorICogIGlzZXJfY29ubl9zZXRfZnVsbF9mZWF0dXJlZF9tb2RlIC0gKGlTRVIgQVBJKQorICovCitpbnQgaXNlcl9jb25uX3NldF9mdWxsX2ZlYXR1cmVkX21vZGUoc3RydWN0IGlzY3NpX2Nvbm4gKmNvbm4pCit7CisJc3RydWN0IGlzY3NpX2lzZXJfY29ubiAqaXNlcl9jb25uID0gY29ubi0+ZGRfZGF0YTsKKworCWludCBpOworCS8qIG5vIG5lZWQgdG8ga2VlcCBpdCBpbiBhIHZhciwgd2UgYXJlIGFmdGVyIGxvZ2luIHNvIGlmIHRoaXMgc2hvdWxkCisJICogYmUgbmVnb3RpYXRlZCwgYnkgbm93IHRoZSByZXN1bHQgc2hvdWxkIGJlIGF2YWlsYWJsZSBoZXJlICovCisJaW50IGluaXRpYWxfcG9zdF9yZWN2X2J1ZnNfbnVtID0gSVNFUl9NQVhfUlhfTUlTQ19QRFVTOworCisJaXNlcl9kYmcoIkluaXRpYWxseSBwb3N0OiAlZFxuIiwgaW5pdGlhbF9wb3N0X3JlY3ZfYnVmc19udW0pOworCisJLyogQ2hlY2sgdGhhdCB0aGVyZSBpcyBubyBwb3N0ZWQgcmVjdiBvciBzZW5kIGJ1ZmZlcnMgbGVmdCAtICovCisJLyogdGhleSBtdXN0IGJlIGNvbnN1bWVkIGR1cmluZyB0aGUgbG9naW4gcGhhc2UgKi8KKwlCVUdfT04oYXRvbWljX3JlYWQoJmlzZXJfY29ubi0+aWJfY29ubi0+cG9zdF9yZWN2X2J1Zl9jb3VudCkgIT0gMCk7CisJQlVHX09OKGF0b21pY19yZWFkKCZpc2VyX2Nvbm4tPmliX2Nvbm4tPnBvc3Rfc2VuZF9idWZfY291bnQpICE9IDApOworCisJLyogSW5pdGlhbCBwb3N0IHJlY2VpdmUgYnVmZmVycyAqLworCWZvciAoaSA9IDA7IGkgPCBpbml0aWFsX3Bvc3RfcmVjdl9idWZzX251bTsgaSsrKSB7CisJCWlmIChpc2VyX3Bvc3RfcmVjZWl2ZV9jb250cm9sKGNvbm4pICE9IDApIHsKKwkJCWlzZXJfZXJyKCJGYWlsZWQgdG8gcG9zdCByZWN2IGJ1ZnMgYXQ6JWQgY29ubjoweCVwXG4iLAorCQkJCSBpLCBjb25uKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJfQorCWlzZXJfZGJnKCJQb3N0ZWQgJWQgcG9zdCByZWN2IGJ1ZnMsIGNvbm46MHglcFxuIiwgaSwgY29ubik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2lzZXJfY2hlY2tfeG1pdChzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubiwgdm9pZCAqdGFzaykKK3sKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBpc2NzaV9pc2VyX2Nvbm4gKmlzZXJfY29ubiA9IGNvbm4tPmRkX2RhdGE7CisKKwl3cml0ZV9sb2NrX2JoKGNvbm4tPnJlY3ZfbG9jayk7CisJaWYgKGF0b21pY19yZWFkKCZpc2VyX2Nvbm4tPmliX2Nvbm4tPnBvc3Rfc2VuZF9idWZfY291bnQpID09CisJICAgIElTRVJfUVBfTUFYX1JFUV9EVE9TKSB7CisJCWlzZXJfZGJnKCIlbGQgY2FuJ3QgeG1pdCB0YXNrICVwLCBzdXNwZW5kaW5nIHR4XG4iLGppZmZpZXMsdGFzayk7CisJCXNldF9iaXQoSVNDU0lfU1VTUEVORF9CSVQsICZjb25uLT5zdXNwZW5kX3R4KTsKKwkJcmMgPSAtRUFHQUlOOworCX0KKwl3cml0ZV91bmxvY2tfYmgoY29ubi0+cmVjdl9sb2NrKTsKKwlyZXR1cm4gcmM7Cit9CisKKworLyoqCisgKiBpc2VyX3NlbmRfY29tbWFuZCAtIHNlbmQgY29tbWFuZCBQRFUKKyAqLworaW50IGlzZXJfc2VuZF9jb21tYW5kKHN0cnVjdCBpc2NzaV9jb25uICAgICAqY29ubiwKKwkJICAgICAgc3RydWN0IGlzY3NpX2NtZF90YXNrICpjdGFzaykKK3sKKwlzdHJ1Y3QgaXNjc2lfaXNlcl9jb25uICppc2VyX2Nvbm4gPSBjb25uLT5kZF9kYXRhOworCXN0cnVjdCBpc2NzaV9pc2VyX2NtZF90YXNrICppc2VyX2N0YXNrID0gY3Rhc2stPmRkX2RhdGE7CisJc3RydWN0IGlzZXJfZHRvICpzZW5kX2R0byA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBlZHRsOworCWludCBlcnIgPSAwOworCXN0cnVjdCBpc2VyX2RhdGFfYnVmICpkYXRhX2J1ZjsKKworCXN0cnVjdCBpc2NzaV9jbWQgKmhkciA9ICBjdGFzay0+aGRyOworCXN0cnVjdCBzY3NpX2NtbmQgKnNjICA9ICBjdGFzay0+c2M7CisKKwlpZiAoIWlzZXJfY29ubl9zdGF0ZV9jb21wKGlzZXJfY29ubi0+aWJfY29ubiwgSVNFUl9DT05OX1VQKSkgeworCQlpc2VyX2VycigiRmFpbGVkIHRvIHNlbmQsIGNvbm46IDB4JXAgaXMgbm90IHVwXG4iLCBpc2VyX2Nvbm4tPmliX2Nvbm4pOworCQlyZXR1cm4gLUVQRVJNOworCX0KKwlpZiAoaXNlcl9jaGVja194bWl0KGNvbm4sIGN0YXNrKSkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwllZHRsID0gbnRvaGwoaGRyLT5kYXRhX2xlbmd0aCk7CisKKwkvKiBidWlsZCB0aGUgdHggZGVzYyByZWdkIGhlYWRlciBhbmQgYWRkIGl0IHRvIHRoZSB0eCBkZXNjIGR0byAqLworCWlzZXJfY3Rhc2stPmRlc2MudHlwZSA9IElTQ1NJX1RYX1NDU0lfQ09NTUFORDsKKwlzZW5kX2R0byA9ICZpc2VyX2N0YXNrLT5kZXNjLmR0bzsKKwlzZW5kX2R0by0+Y3Rhc2sgPSBpc2VyX2N0YXNrOworCWlzZXJfY3JlYXRlX3NlbmRfZGVzYyhpc2VyX2Nvbm4sICZpc2VyX2N0YXNrLT5kZXNjKTsKKworCWlmIChoZHItPmZsYWdzICYgSVNDU0lfRkxBR19DTURfUkVBRCkKKwkJZGF0YV9idWYgPSAmaXNlcl9jdGFzay0+ZGF0YVtJU0VSX0RJUl9JTl07CisJZWxzZQorCQlkYXRhX2J1ZiA9ICZpc2VyX2N0YXNrLT5kYXRhW0lTRVJfRElSX09VVF07CisKKwlpZiAoc2MtPnVzZV9zZykgeyAvKiB1c2luZyBhIHNjYXR0ZXIgbGlzdCAqLworCQlkYXRhX2J1Zi0+YnVmICA9IHNjLT5yZXF1ZXN0X2J1ZmZlcjsKKwkJZGF0YV9idWYtPnNpemUgPSBzYy0+dXNlX3NnOworCX0gZWxzZSBpZiAoc2MtPnJlcXVlc3RfYnVmZmxlbikgeworCQkvKiB1c2luZyBhIHNpbmdsZSBidWZmZXIgLSBjb252ZXJ0IGl0IGludG8gb25lIGVudHJ5IFNHICovCisJCXNnX2luaXRfb25lKCZkYXRhX2J1Zi0+c2dfc2luZ2xlLAorCQkJICAgIHNjLT5yZXF1ZXN0X2J1ZmZlciwgc2MtPnJlcXVlc3RfYnVmZmxlbik7CisJCWRhdGFfYnVmLT5idWYgICA9ICZkYXRhX2J1Zi0+c2dfc2luZ2xlOworCQlkYXRhX2J1Zi0+c2l6ZSAgPSAxOworCX0KKworCWRhdGFfYnVmLT5kYXRhX2xlbiA9IHNjLT5yZXF1ZXN0X2J1ZmZsZW47CisKKwlpZiAoaGRyLT5mbGFncyAmIElTQ1NJX0ZMQUdfQ01EX1JFQUQpIHsKKwkJZXJyID0gaXNlcl9wcmVwYXJlX3JlYWRfY21kKGN0YXNrLCBlZHRsKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gc2VuZF9jb21tYW5kX2Vycm9yOworCX0KKwlpZiAoaGRyLT5mbGFncyAmIElTQ1NJX0ZMQUdfQ01EX1dSSVRFKSB7CisJCWVyciA9IGlzZXJfcHJlcGFyZV93cml0ZV9jbWQoY3Rhc2ssCisJCQkJCSAgICAgY3Rhc2stPmltbV9jb3VudCwKKwkJCQkgICAgICAgICAgICAgY3Rhc2stPmltbV9jb3VudCArCisJCQkJCSAgICAgY3Rhc2stPnVuc29sX2NvdW50LAorCQkJCQkgICAgIGVkdGwpOworCQlpZiAoZXJyKQorCQkJZ290byBzZW5kX2NvbW1hbmRfZXJyb3I7CisJfQorCisJaXNlcl9yZWdfc2luZ2xlKGlzZXJfY29ubi0+aWJfY29ubi0+ZGV2aWNlLAorCQkJc2VuZF9kdG8tPnJlZ2RbMF0sIERNQV9UT19ERVZJQ0UpOworCisJaWYgKGlzZXJfcG9zdF9yZWNlaXZlX2NvbnRyb2woY29ubikgIT0gMCkgeworCQlpc2VyX2VycigicG9zdF9yZWN2IGZhaWxlZCFcbiIpOworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIHNlbmRfY29tbWFuZF9lcnJvcjsKKwl9CisKKwlpc2VyX2N0YXNrLT5zdGF0dXMgPSBJU0VSX1RBU0tfU1RBVFVTX1NUQVJURUQ7CisKKwllcnIgPSBpc2VyX3Bvc3Rfc2VuZCgmaXNlcl9jdGFzay0+ZGVzYyk7CisJaWYgKCFlcnIpCisJCXJldHVybiAwOworCitzZW5kX2NvbW1hbmRfZXJyb3I6CisJaXNlcl9kdG9fYnVmZnNfcmVsZWFzZShzZW5kX2R0byk7CisJaXNlcl9lcnIoImNvbm4gJXAgZmFpbGVkIGN0YXNrLT5pdHQgJWQgZXJyICVkXG4iLGNvbm4sIGN0YXNrLT5pdHQsIGVycik7CisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKiBpc2VyX3NlbmRfZGF0YV9vdXQgLSBzZW5kIGRhdGEgb3V0IFBEVQorICovCitpbnQgaXNlcl9zZW5kX2RhdGFfb3V0KHN0cnVjdCBpc2NzaV9jb25uICAgICAqY29ubiwKKwkJICAgICAgIHN0cnVjdCBpc2NzaV9jbWRfdGFzayAqY3Rhc2ssCisJCSAgICAgICBzdHJ1Y3QgaXNjc2lfZGF0YSAqaGRyKQoreworCXN0cnVjdCBpc2NzaV9pc2VyX2Nvbm4gKmlzZXJfY29ubiA9IGNvbm4tPmRkX2RhdGE7CisJc3RydWN0IGlzY3NpX2lzZXJfY21kX3Rhc2sgKmlzZXJfY3Rhc2sgPSBjdGFzay0+ZGRfZGF0YTsKKwlzdHJ1Y3QgaXNlcl9kZXNjICp0eF9kZXNjID0gTlVMTDsKKwlzdHJ1Y3QgaXNlcl9kdG8gKnNlbmRfZHRvID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGJ1Zl9vZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBkYXRhX3NlZ19sZW47CisJdW5zaWduZWQgaW50IGl0dDsKKwlpbnQgZXJyID0gMDsKKworCWlmICghaXNlcl9jb25uX3N0YXRlX2NvbXAoaXNlcl9jb25uLT5pYl9jb25uLCBJU0VSX0NPTk5fVVApKSB7CisJCWlzZXJfZXJyKCJGYWlsZWQgdG8gc2VuZCwgY29ubjogMHglcCBpcyBub3QgdXBcbiIsIGlzZXJfY29ubi0+aWJfY29ubik7CisJCXJldHVybiAtRVBFUk07CisJfQorCisJaWYgKGlzZXJfY2hlY2tfeG1pdChjb25uLCBjdGFzaykpCisJCXJldHVybiAtRUFHQUlOOworCisJaXR0ID0gbnRvaGwoaGRyLT5pdHQpOworCWRhdGFfc2VnX2xlbiA9IG50b2gyNChoZHItPmRsZW5ndGgpOworCWJ1Zl9vZmZzZXQgICA9IG50b2hsKGhkci0+b2Zmc2V0KTsKKworCWlzZXJfZGJnKCIlcyBpdHQgJWQgZHNlZ19sZW4gJWQgb2Zmc2V0ICVkXG4iLAorCQkgX19mdW5jX18sKGludClpdHQsKGludClkYXRhX3NlZ19sZW4sKGludClidWZfb2Zmc2V0KTsKKworCXR4X2Rlc2MgPSBrbWVtX2NhY2hlX2FsbG9jKGlnLmRlc2NfY2FjaGUsIEdGUF9OT0lPKTsKKwlpZiAodHhfZGVzYyA9PSBOVUxMKSB7CisJCWlzZXJfZXJyKCJGYWlsZWQgdG8gYWxsb2MgZGVzYyBmb3IgcG9zdCBkYXRhb3V0XG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJdHhfZGVzYy0+dHlwZSA9IElTQ1NJX1RYX0RBVEFPVVQ7CisJbWVtY3B5KCZ0eF9kZXNjLT5pc2NzaV9oZWFkZXIsIGhkciwgc2l6ZW9mKHN0cnVjdCBpc2NzaV9oZHIpKTsKKworCS8qIGJ1aWxkIHRoZSB0eCBkZXNjIHJlZ2QgaGVhZGVyIGFuZCBhZGQgaXQgdG8gdGhlIHR4IGRlc2MgZHRvICovCisJc2VuZF9kdG8gPSAmdHhfZGVzYy0+ZHRvOworCXNlbmRfZHRvLT5jdGFzayA9IGlzZXJfY3Rhc2s7CisJaXNlcl9jcmVhdGVfc2VuZF9kZXNjKGlzZXJfY29ubiwgdHhfZGVzYyk7CisKKwlpc2VyX3JlZ19zaW5nbGUoaXNlcl9jb25uLT5pYl9jb25uLT5kZXZpY2UsCisJCQlzZW5kX2R0by0+cmVnZFswXSwgRE1BX1RPX0RFVklDRSk7CisKKwkvKiBhbGwgZGF0YSB3YXMgcmVnaXN0ZXJlZCBmb3IgUkRNQSwgd2UgY2FuIHVzZSB0aGUgbGtleSAqLworCWlzZXJfZHRvX2FkZF9yZWdkX2J1ZmYoc2VuZF9kdG8sCisJCQkgICAgICAgJmlzZXJfY3Rhc2stPnJkbWFfcmVnZFtJU0VSX0RJUl9PVVRdLAorCQkJICAgICAgIGJ1Zl9vZmZzZXQsCisJCQkgICAgICAgZGF0YV9zZWdfbGVuKTsKKworCWlmIChidWZfb2Zmc2V0ICsgZGF0YV9zZWdfbGVuID4gaXNlcl9jdGFzay0+ZGF0YVtJU0VSX0RJUl9PVVRdLmRhdGFfbGVuKSB7CisJCWlzZXJfZXJyKCJPZmZzZXQ6JWxkICYgRFNMOiVsZCBpbiBEYXRhLU91dCAiCisJCQkgImluY29uc2lzdGVudCB3aXRoIHRvdGFsIGxlbjolbGQsIGl0dDolZFxuIiwKKwkJCSBidWZfb2Zmc2V0LCBkYXRhX3NlZ19sZW4sCisJCQkgaXNlcl9jdGFzay0+ZGF0YVtJU0VSX0RJUl9PVVRdLmRhdGFfbGVuLCBpdHQpOworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIHNlbmRfZGF0YV9vdXRfZXJyb3I7CisJfQorCWlzZXJfZGJnKCJkYXRhLW91dCBpdHQ6ICVkLCBvZmZzZXQ6ICVsZCwgc3o6ICVsZFxuIiwKKwkJIGl0dCwgYnVmX29mZnNldCwgZGF0YV9zZWdfbGVuKTsKKworCisJZXJyID0gaXNlcl9wb3N0X3NlbmQodHhfZGVzYyk7CisJaWYgKCFlcnIpCisJCXJldHVybiAwOworCitzZW5kX2RhdGFfb3V0X2Vycm9yOgorCWlzZXJfZHRvX2J1ZmZzX3JlbGVhc2Uoc2VuZF9kdG8pOworCWttZW1fY2FjaGVfZnJlZShpZy5kZXNjX2NhY2hlLCB0eF9kZXNjKTsKKwlpc2VyX2VycigiY29ubiAlcCBmYWlsZWQgZXJyICVkXG4iLGNvbm4sIGVycik7CisJcmV0dXJuIGVycjsKK30KKworaW50IGlzZXJfc2VuZF9jb250cm9sKHN0cnVjdCBpc2NzaV9jb25uICpjb25uLAorCQkgICAgICBzdHJ1Y3QgaXNjc2lfbWdtdF90YXNrICptdGFzaykKK3sKKwlzdHJ1Y3QgaXNjc2lfaXNlcl9jb25uICppc2VyX2Nvbm4gPSBjb25uLT5kZF9kYXRhOworCXN0cnVjdCBpc2VyX2Rlc2MgKm1kZXNjID0gbXRhc2stPmRkX2RhdGE7CisJc3RydWN0IGlzZXJfZHRvICpzZW5kX2R0byA9IE5VTEw7CisJdW5zaWduZWQgaW50IGl0dDsKKwl1bnNpZ25lZCBsb25nIGRhdGFfc2VnX2xlbjsKKwlpbnQgZXJyID0gMDsKKwl1bnNpZ25lZCBjaGFyIG9wY29kZTsKKwlzdHJ1Y3QgaXNlcl9yZWdkX2J1ZiAqcmVnZF9idWY7CisJc3RydWN0IGlzZXJfZGV2aWNlICpkZXZpY2U7CisKKwlpZiAoIWlzZXJfY29ubl9zdGF0ZV9jb21wKGlzZXJfY29ubi0+aWJfY29ubiwgSVNFUl9DT05OX1VQKSkgeworCQlpc2VyX2VycigiRmFpbGVkIHRvIHNlbmQsIGNvbm46IDB4JXAgaXMgbm90IHVwXG4iLCBpc2VyX2Nvbm4tPmliX2Nvbm4pOworCQlyZXR1cm4gLUVQRVJNOworCX0KKworCWlmIChpc2VyX2NoZWNrX3htaXQoY29ubixtdGFzaykpCisJCXJldHVybiAtRUFHQUlOOworCisJLyogYnVpbGQgdGhlIHR4IGRlc2MgcmVnZCBoZWFkZXIgYW5kIGFkZCBpdCB0byB0aGUgdHggZGVzYyBkdG8gKi8KKwltZGVzYy0+dHlwZSA9IElTQ1NJX1RYX0NPTlRST0w7CisJc2VuZF9kdG8gPSAmbWRlc2MtPmR0bzsKKwlzZW5kX2R0by0+Y3Rhc2sgPSBOVUxMOworCWlzZXJfY3JlYXRlX3NlbmRfZGVzYyhpc2VyX2Nvbm4sIG1kZXNjKTsKKworCWRldmljZSA9IGlzZXJfY29ubi0+aWJfY29ubi0+ZGV2aWNlOworCisJaXNlcl9yZWdfc2luZ2xlKGRldmljZSwgc2VuZF9kdG8tPnJlZ2RbMF0sIERNQV9UT19ERVZJQ0UpOworCisJaXR0ID0gbnRvaGwobXRhc2stPmhkci0+aXR0KTsKKwlvcGNvZGUgPSBtdGFzay0+aGRyLT5vcGNvZGUgJiBJU0NTSV9PUENPREVfTUFTSzsKKwlkYXRhX3NlZ19sZW4gPSBudG9oMjQobXRhc2stPmhkci0+ZGxlbmd0aCk7CisKKwlpZiAoZGF0YV9zZWdfbGVuID4gMCkgeworCQlyZWdkX2J1ZiA9ICZtZGVzYy0+ZGF0YV9yZWdkX2J1ZjsKKwkJbWVtc2V0KHJlZ2RfYnVmLCAwLCBzaXplb2Yoc3RydWN0IGlzZXJfcmVnZF9idWYpKTsKKwkJcmVnZF9idWYtPmRldmljZSA9IGRldmljZTsKKwkJcmVnZF9idWYtPnZpcnRfYWRkciA9IG10YXNrLT5kYXRhOworCQlyZWdkX2J1Zi0+ZGF0YV9zaXplID0gbXRhc2stPmRhdGFfY291bnQ7CisJCWlzZXJfcmVnX3NpbmdsZShkZXZpY2UsIHJlZ2RfYnVmLAorCQkJCURNQV9UT19ERVZJQ0UpOworCQlpc2VyX2R0b19hZGRfcmVnZF9idWZmKHNlbmRfZHRvLCByZWdkX2J1ZiwKKwkJCQkgICAgICAgMCwKKwkJCQkgICAgICAgZGF0YV9zZWdfbGVuKTsKKwl9CisKKwlpZiAoaXNlcl9wb3N0X3JlY2VpdmVfY29udHJvbChjb25uKSAhPSAwKSB7CisJCWlzZXJfZXJyKCJwb3N0X3Jjdl9idWZmIGZhaWxlZCFcbiIpOworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIHNlbmRfY29udHJvbF9lcnJvcjsKKwl9CisKKwllcnIgPSBpc2VyX3Bvc3Rfc2VuZChtZGVzYyk7CisJaWYgKCFlcnIpCisJCXJldHVybiAwOworCitzZW5kX2NvbnRyb2xfZXJyb3I6CisJaXNlcl9kdG9fYnVmZnNfcmVsZWFzZShzZW5kX2R0byk7CisJaXNlcl9lcnIoImNvbm4gJXAgZmFpbGVkIGVyciAlZFxuIixjb25uLCBlcnIpOworCXJldHVybiBlcnI7Cit9CisKKy8qKgorICogaXNlcl9yY3ZfZHRvX2NvbXBsZXRpb24gLSByZWN2IERUTyBjb21wbGV0aW9uCisgKi8KK3ZvaWQgaXNlcl9yY3ZfY29tcGxldGlvbihzdHJ1Y3QgaXNlcl9kZXNjICpyeF9kZXNjLAorCQkJIHVuc2lnbmVkIGxvbmcgZHRvX3hmZXJfbGVuKQoreworCXN0cnVjdCBpc2VyX2R0byAgICAgICAgKmR0byA9ICZyeF9kZXNjLT5kdG87CisJc3RydWN0IGlzY3NpX2lzZXJfY29ubiAqY29ubiA9IGR0by0+Y29ubjsKKwlzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiAqc2Vzc2lvbiA9IGNvbm4tPmlzY3NpX2Nvbm4tPnNlc3Npb247CisJc3RydWN0IGlzY3NpX2NtZF90YXNrICpjdGFzazsKKwlzdHJ1Y3QgaXNjc2lfaXNlcl9jbWRfdGFzayAqaXNlcl9jdGFzazsKKwlzdHJ1Y3QgaXNjc2lfaGRyICpoZHI7CisJY2hhciAgICpyeF9kYXRhID0gTlVMTDsKKwlpbnQgICAgIHJ4X2RhdGFfbGVuID0gMDsKKwl1bnNpZ25lZCBpbnQgaXR0OworCXVuc2lnbmVkIGNoYXIgb3Bjb2RlOworCisJaGRyID0gJnJ4X2Rlc2MtPmlzY3NpX2hlYWRlcjsKKworCWlzZXJfZGJnKCJvcCAweCV4IGl0dCAweCV4XG4iLCBoZHItPm9wY29kZSxoZHItPml0dCk7CisKKwlpZiAoZHRvX3hmZXJfbGVuID4gSVNFUl9UT1RBTF9IRUFERVJTX0xFTikgeyAvKiB3ZSBoYXZlIGRhdGEgKi8KKwkJcnhfZGF0YV9sZW4gPSBkdG9feGZlcl9sZW4gLSBJU0VSX1RPVEFMX0hFQURFUlNfTEVOOworCQlyeF9kYXRhICAgICA9IGR0by0+cmVnZFsxXS0+dmlydF9hZGRyOworCQlyeF9kYXRhICAgICs9IGR0by0+b2Zmc2V0WzFdOworCX0KKworCW9wY29kZSA9IGhkci0+b3Bjb2RlICYgSVNDU0lfT1BDT0RFX01BU0s7CisKKwlpZiAob3Bjb2RlID09IElTQ1NJX09QX1NDU0lfQ01EX1JTUCkgeworCSAgICAgICAgaXR0ID0gaGRyLT5pdHQgJiBJU0NTSV9JVFRfTUFTSzsgLyogbWFzayBvdXQgY2lkIGFuZCBhZ2UgYml0cyAqLworCQlpZiAoIShpdHQgPCBzZXNzaW9uLT5jbWRzX21heCkpCisJCQlpc2VyX2VycigiaXR0IGNhbid0IGJlIG1hdGNoZWQgdG8gdGFzayEhISIKKwkJCQkgImNvbm4gJXAgb3Bjb2RlICVkIGNtZHNfbWF4ICVkIGl0dCAlZFxuIiwKKwkJCQkgY29ubi0+aXNjc2lfY29ubixvcGNvZGUsc2Vzc2lvbi0+Y21kc19tYXgsaXR0KTsKKwkJLyogdXNlIHRoZSBtYXBwaW5nIGdpdmVuIHdpdGggdGhlIGNtZHMgYXJyYXkgaW5kZXhlZCBieSBpdHQgKi8KKwkJY3Rhc2sgPSAoc3RydWN0IGlzY3NpX2NtZF90YXNrICopc2Vzc2lvbi0+Y21kc1tpdHRdOworCQlpc2VyX2N0YXNrID0gY3Rhc2stPmRkX2RhdGE7CisJCWlzZXJfZGJnKCJpdHQgJWQgY3Rhc2sgJXBcbiIsaXR0LGN0YXNrKTsKKwkJaXNlcl9jdGFzay0+c3RhdHVzID0gSVNFUl9UQVNLX1NUQVRVU19DT01QTEVURUQ7CisJCWlzZXJfY3Rhc2tfcmRtYV9maW5hbGl6ZShpc2VyX2N0YXNrKTsKKwl9CisKKwlpc2VyX2R0b19idWZmc19yZWxlYXNlKGR0byk7CisKKwlpc2NzaV9pc2VyX3JlY3YoY29ubi0+aXNjc2lfY29ubiwgaGRyLCByeF9kYXRhLCByeF9kYXRhX2xlbik7CisKKwlrZnJlZShyeF9kZXNjLT5kYXRhKTsKKwlrbWVtX2NhY2hlX2ZyZWUoaWcuZGVzY19jYWNoZSwgcnhfZGVzYyk7CisKKwkvKiBkZWNyZW1lbnRpbmcgY29ubi0+cG9zdF9yZWN2X2J1Zl9jb3VudCBvbmx5IC0tYWZ0ZXItLSBmcmVlaW5nIHRoZSAgICoKKwkgKiB0YXNrIGVsaW1pbmF0ZXMgdGhlIG5lZWQgdG8gd29ycnkgb24gdGFza3Mgd2hpY2ggYXJlIGNvbXBsZXRlZCBpbiAgICoKKwkgKiBwYXJhbGxlbCB0byB0aGUgZXhlY3V0aW9uIG9mIGlzZXJfY29ubl90ZXJtLiBTbyB0aGUgY29kZSB0aGF0IHdhaXRzICoKKwkgKiBmb3IgdGhlIHBvc3RlZCByeCBidWZzIHJlZmNvdW50IHRvIGJlY29tZSB6ZXJvIGhhbmRsZXMgZXZlcnl0aGluZyAgICovCisJYXRvbWljX2RlYygmY29ubi0+aWJfY29ubi0+cG9zdF9yZWN2X2J1Zl9jb3VudCk7Cit9CisKK3ZvaWQgaXNlcl9zbmRfY29tcGxldGlvbihzdHJ1Y3QgaXNlcl9kZXNjICp0eF9kZXNjKQoreworCXN0cnVjdCBpc2VyX2R0byAgICAgICAgKmR0byA9ICZ0eF9kZXNjLT5kdG87CisJc3RydWN0IGlzY3NpX2lzZXJfY29ubiAqaXNlcl9jb25uID0gZHRvLT5jb25uOworCXN0cnVjdCBpc2NzaV9jb25uICAgICAgKmNvbm4gPSBpc2VyX2Nvbm4tPmlzY3NpX2Nvbm47CisJc3RydWN0IGlzY3NpX21nbXRfdGFzayAqbXRhc2s7CisKKwlpc2VyX2RiZygiSW5pdGlhdG9yLCBEYXRhIHNlbnQgZHRvPTB4JXBcbiIsIGR0byk7CisKKwlpc2VyX2R0b19idWZmc19yZWxlYXNlKGR0byk7CisKKwlpZiAodHhfZGVzYy0+dHlwZSA9PSBJU0NTSV9UWF9EQVRBT1VUKQorCQlrbWVtX2NhY2hlX2ZyZWUoaWcuZGVzY19jYWNoZSwgdHhfZGVzYyk7CisKKwlhdG9taWNfZGVjKCZpc2VyX2Nvbm4tPmliX2Nvbm4tPnBvc3Rfc2VuZF9idWZfY291bnQpOworCisJd3JpdGVfbG9jayhjb25uLT5yZWN2X2xvY2spOworCWlmIChjb25uLT5zdXNwZW5kX3R4KSB7CisJCWlzZXJfZGJnKCIlbGQgcmVzdW1pbmcgdHhcbiIsamlmZmllcyk7CisJCWNsZWFyX2JpdChJU0NTSV9TVVNQRU5EX0JJVCwgJmNvbm4tPnN1c3BlbmRfdHgpOworCQlzY3NpX3F1ZXVlX3dvcmsoY29ubi0+c2Vzc2lvbi0+aG9zdCwgJmNvbm4tPnhtaXR3b3JrKTsKKwl9CisJd3JpdGVfdW5sb2NrKGNvbm4tPnJlY3ZfbG9jayk7CisKKwlpZiAodHhfZGVzYy0+dHlwZSA9PSBJU0NTSV9UWF9DT05UUk9MKSB7CisJCS8qIHRoaXMgYXJpdGhtZXRpYyBpcyBsZWdhbCBieSBsaWJpc2NzaSBkZF9kYXRhIGFsbG9jYXRpb24gKi8KKwkJbXRhc2sgPSAodm9pZCAqKSAoKGxvbmcpKHZvaWQgKil0eF9kZXNjIC0KKwkJCQkgIHNpemVvZihzdHJ1Y3QgaXNjc2lfbWdtdF90YXNrKSk7CisJCWlmIChtdGFzay0+aGRyLT5pdHQgPT0gY3B1X3RvX2JlMzIoSVNDU0lfUkVTRVJWRURfVEFHKSkgeworCQkJc3RydWN0IGlzY3NpX3Nlc3Npb24gKnNlc3Npb24gPSBjb25uLT5zZXNzaW9uOworCisJCQlzcGluX2xvY2soJmNvbm4tPnNlc3Npb24tPmxvY2spOworCQkJbGlzdF9kZWwoJm10YXNrLT5ydW5uaW5nKTsKKwkJCV9fa2ZpZm9fcHV0KHNlc3Npb24tPm1nbXRwb29sLnF1ZXVlLCAodm9pZCopJm10YXNrLAorCQkJCSAgICBzaXplb2Yodm9pZCopKTsKKwkJCXNwaW5fdW5sb2NrKCZzZXNzaW9uLT5sb2NrKTsKKwkJfQorCX0KK30KKwordm9pZCBpc2VyX2N0YXNrX3JkbWFfaW5pdChzdHJ1Y3QgaXNjc2lfaXNlcl9jbWRfdGFzayAqaXNlcl9jdGFzaykKKworeworCWlzZXJfY3Rhc2stPnN0YXR1cyA9IElTRVJfVEFTS19TVEFUVVNfSU5JVDsKKworCWlzZXJfY3Rhc2stPmRpcltJU0VSX0RJUl9JTl0gPSAwOworCWlzZXJfY3Rhc2stPmRpcltJU0VSX0RJUl9PVVRdID0gMDsKKworCWlzZXJfY3Rhc2stPmRhdGFbSVNFUl9ESVJfSU5dLmRhdGFfbGVuICA9IDA7CisJaXNlcl9jdGFzay0+ZGF0YVtJU0VSX0RJUl9PVVRdLmRhdGFfbGVuID0gMDsKKworCW1lbXNldCgmaXNlcl9jdGFzay0+cmRtYV9yZWdkW0lTRVJfRElSX0lOXSwgMCwKKwkgICAgICAgc2l6ZW9mKHN0cnVjdCBpc2VyX3JlZ2RfYnVmKSk7CisJbWVtc2V0KCZpc2VyX2N0YXNrLT5yZG1hX3JlZ2RbSVNFUl9ESVJfT1VUXSwgMCwKKwkgICAgICAgc2l6ZW9mKHN0cnVjdCBpc2VyX3JlZ2RfYnVmKSk7Cit9CisKK3ZvaWQgaXNlcl9jdGFza19yZG1hX2ZpbmFsaXplKHN0cnVjdCBpc2NzaV9pc2VyX2NtZF90YXNrICppc2VyX2N0YXNrKQoreworCWludCBkZWZlcnJlZDsKKworCS8qIGlmIHdlIHdlcmUgcmVhZGluZywgY29weSBiYWNrIHRvIHVuYWxpZ25lZCBzZ2xpc3QsCisJICogYW55d2F5IGRtYV91bm1hcCBhbmQgZnJlZSB0aGUgY29weQorCSAqLworCWlmIChpc2VyX2N0YXNrLT5kYXRhX2NvcHlbSVNFUl9ESVJfSU5dLmNvcHlfYnVmICE9IE5VTEwpCisJCWlzZXJfZmluYWxpemVfcmRtYV91bmFsaWduZWRfc2coaXNlcl9jdGFzaywgSVNFUl9ESVJfSU4pOworCWlmIChpc2VyX2N0YXNrLT5kYXRhX2NvcHlbSVNFUl9ESVJfT1VUXS5jb3B5X2J1ZiAhPSBOVUxMKQorCQlpc2VyX2ZpbmFsaXplX3JkbWFfdW5hbGlnbmVkX3NnKGlzZXJfY3Rhc2ssIElTRVJfRElSX09VVCk7CisKKwlpZiAoaXNlcl9jdGFzay0+ZGlyW0lTRVJfRElSX0lOXSkgeworCQlkZWZlcnJlZCA9IGlzZXJfcmVnZF9idWZmX3JlbGVhc2UKKwkJCSgmaXNlcl9jdGFzay0+cmRtYV9yZWdkW0lTRVJfRElSX0lOXSk7CisJCWlmIChkZWZlcnJlZCkgeworCQkJaXNlcl9lcnIoIlJlZmVyZW5jZXMgcmVtYWluIGZvciBCVUYtSU4gcmRtYSByZWdcbiIpOworCQkJQlVHKCk7CisJCX0KKwl9CisKKwlpZiAoaXNlcl9jdGFzay0+ZGlyW0lTRVJfRElSX09VVF0pIHsKKwkJZGVmZXJyZWQgPSBpc2VyX3JlZ2RfYnVmZl9yZWxlYXNlCisJCQkoJmlzZXJfY3Rhc2stPnJkbWFfcmVnZFtJU0VSX0RJUl9PVVRdKTsKKwkJaWYgKGRlZmVycmVkKSB7CisJCQlpc2VyX2VycigiUmVmZXJlbmNlcyByZW1haW4gZm9yIEJVRi1PVVQgcmRtYSByZWdcbiIpOworCQkJQlVHKCk7CisJCX0KKwl9CisKKwlpc2VyX2RtYV91bm1hcF90YXNrX2RhdGEoaXNlcl9jdGFzayk7Cit9CisKK3ZvaWQgaXNlcl9kdG9fYnVmZnNfcmVsZWFzZShzdHJ1Y3QgaXNlcl9kdG8gKmR0bykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBkdG8tPnJlZ2RfdmVjdG9yX2xlbjsgaSsrKQorCQlpc2VyX3JlZ2RfYnVmZl9yZWxlYXNlKGR0by0+cmVnZFtpXSk7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXNlci9pc2VyX21lbW9yeS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pc2VyL2lzZXJfbWVtb3J5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE5NTBhNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXNlci9pc2VyX21lbW9yeS5jCkBAIC0wLDAgKzEsNDAxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1LCAyMDA2IFZvbHRhaXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KKyAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyLCBhdmFpbGFibGUgZnJvbSB0aGUgZmlsZQorICogQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZSwgb3IgdGhlCisgKiBPcGVuSUIub3JnIEJTRCBsaWNlbnNlIGJlbG93OgorICoKKyAqICAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCisgKiAgICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCisgKiAgICAgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqCS0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQorICoJICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICoJICBkaXNjbGFpbWVyLgorICoKKyAqCS0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICoJICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICoJICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqCSAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKgorICogJElkOiBpc2VyX21lbW9yeS5jIDY5NjQgMjAwNi0wNS0wNyAxMToxMTo0M1ogb2dlcmxpdHogJAorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3NjYXR0ZXJsaXN0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KKworI2luY2x1ZGUgImlzY3NpX2lzZXIuaCIKKworI2RlZmluZSBJU0VSX0tNQUxMT0NfVEhSRVNIT0xEIDB4MjAwMDAgLyogMTI4SyAtIGttYWxsb2MgbGltaXQgKi8KKy8qKgorICogRGVjcmVtZW50cyB0aGUgcmVmZXJlbmNlIGNvdW50IGZvciB0aGUKKyAqIHJlZ2lzdGVyZWQgYnVmZmVyICYgcmVsZWFzZXMgaXQKKyAqCisgKiByZXR1cm5zIDAgaWYgcmVsZWFzZWQsIDEgaWYgZGVmZXJyZWQKKyAqLworaW50IGlzZXJfcmVnZF9idWZmX3JlbGVhc2Uoc3RydWN0IGlzZXJfcmVnZF9idWYgKnJlZ2RfYnVmKQoreworCXN0cnVjdCBkZXZpY2UgKmRtYV9kZXZpY2U7CisKKwlpZiAoKGF0b21pY19yZWFkKCZyZWdkX2J1Zi0+cmVmX2NvdW50KSA9PSAwKSB8fAorCSAgICBhdG9taWNfZGVjX2FuZF90ZXN0KCZyZWdkX2J1Zi0+cmVmX2NvdW50KSkgeworCQkvKiBpZiB3ZSB1c2VkIHRoZSBkbWEgbXIsIHVucmVnIGlzIGp1c3QgTk9QICovCisJCWlmIChyZWdkX2J1Zi0+cmVnLnJrZXkgIT0gMCkKKwkJCWlzZXJfdW5yZWdfbWVtKCZyZWdkX2J1Zi0+cmVnKTsKKworCQlpZiAocmVnZF9idWYtPmRtYV9hZGRyKSB7CisJCQlkbWFfZGV2aWNlID0gcmVnZF9idWYtPmRldmljZS0+aWJfZGV2aWNlLT5kbWFfZGV2aWNlOworCQkJZG1hX3VubWFwX3NpbmdsZShkbWFfZGV2aWNlLAorCQkJCQkgcmVnZF9idWYtPmRtYV9hZGRyLAorCQkJCQkgcmVnZF9idWYtPmRhdGFfc2l6ZSwKKwkJCQkJIHJlZ2RfYnVmLT5kaXJlY3Rpb24pOworCQl9CisJCS8qIGVsc2UgdGhpcyByZWdkIGJ1ZiBpcyBhc3NvY2lhdGVkIHdpdGggdGFzayB3aGljaCB3ZSAqLworCQkvKiBkbWFfdW5tYXBfc2luZ2xlL3NnIGxhdGVyICovCisJCXJldHVybiAwOworCX0gZWxzZSB7CisJCWlzZXJfZGJnKCJSZWxlYXNlIGRlZmVycmVkLCByZWdkLmJ1ZmY6IDB4JXBcbiIsIHJlZ2RfYnVmKTsKKwkJcmV0dXJuIDE7CisJfQorfQorCisvKioKKyAqIGlzZXJfcmVnX3NpbmdsZSAtIGZpbGxzIHJlZ2lzdGVyZWQgYnVmZmVyIGRlc2NyaXB0b3Igd2l0aAorICoJCSAgICAgcmVnaXN0cmF0aW9uIGluZm9ybWF0aW9uCisgKi8KK3ZvaWQgaXNlcl9yZWdfc2luZ2xlKHN0cnVjdCBpc2VyX2RldmljZSAqZGV2aWNlLAorCQkgICAgIHN0cnVjdCBpc2VyX3JlZ2RfYnVmICpyZWdkX2J1ZiwKKwkJICAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCit7CisJZG1hX2FkZHJfdCBkbWFfYWRkcjsKKworCWRtYV9hZGRyICA9IGRtYV9tYXBfc2luZ2xlKGRldmljZS0+aWJfZGV2aWNlLT5kbWFfZGV2aWNlLAorCQkJCSAgIHJlZ2RfYnVmLT52aXJ0X2FkZHIsCisJCQkJICAgcmVnZF9idWYtPmRhdGFfc2l6ZSwgZGlyZWN0aW9uKTsKKwlCVUdfT04oZG1hX21hcHBpbmdfZXJyb3IoZG1hX2FkZHIpKTsKKworCXJlZ2RfYnVmLT5yZWcubGtleSA9IGRldmljZS0+bXItPmxrZXk7CisJcmVnZF9idWYtPnJlZy5ya2V5ID0gMDsgLyogaW5kaWNhdGUgdGhlcmUncyBubyBuZWVkIHRvIHVucmVnICovCisJcmVnZF9idWYtPnJlZy5sZW4gID0gcmVnZF9idWYtPmRhdGFfc2l6ZTsKKwlyZWdkX2J1Zi0+cmVnLnZhICAgPSBkbWFfYWRkcjsKKworCXJlZ2RfYnVmLT5kbWFfYWRkciAgPSBkbWFfYWRkcjsKKwlyZWdkX2J1Zi0+ZGlyZWN0aW9uID0gZGlyZWN0aW9uOworfQorCisvKioKKyAqIGlzZXJfc3RhcnRfcmRtYV91bmFsaWduZWRfc2cKKyAqLworaW50IGlzZXJfc3RhcnRfcmRtYV91bmFsaWduZWRfc2coc3RydWN0IGlzY3NpX2lzZXJfY21kX3Rhc2sgICppc2VyX2N0YXNrLAorCQkJCSBlbnVtIGlzZXJfZGF0YV9kaXIgY21kX2RpcikKK3sKKwlpbnQgZG1hX25lbnRzOworCXN0cnVjdCBkZXZpY2UgKmRtYV9kZXZpY2U7CisJY2hhciAqbWVtID0gTlVMTDsKKwlzdHJ1Y3QgaXNlcl9kYXRhX2J1ZiAqZGF0YSA9ICZpc2VyX2N0YXNrLT5kYXRhW2NtZF9kaXJdOworCXVuc2lnbmVkIGxvbmcgIGNtZF9kYXRhX2xlbiA9IGRhdGEtPmRhdGFfbGVuOworCisJaWYgKGNtZF9kYXRhX2xlbiA+IElTRVJfS01BTExPQ19USFJFU0hPTEQpCisJCW1lbSA9ICh2b2lkICopX19nZXRfZnJlZV9wYWdlcyhHRlBfTk9JTywKKwkJICAgICAgbG9uZ19sb2cyKHJvdW5kdXBfcG93X29mX3R3byhjbWRfZGF0YV9sZW4pKSAtIFBBR0VfU0hJRlQpOworCWVsc2UKKwkJbWVtID0ga21hbGxvYyhjbWRfZGF0YV9sZW4sIEdGUF9OT0lPKTsKKworCWlmIChtZW0gPT0gTlVMTCkgeworCQlpc2VyX2VycigiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbSBzaXplICVkICVkIGZvciBjb3B5aW5nIHNnbGlzdFxuIiwKKwkJCSBkYXRhLT5zaXplLChpbnQpY21kX2RhdGFfbGVuKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaWYgKGNtZF9kaXIgPT0gSVNFUl9ESVJfT1VUKSB7CisJCS8qIGNvcHkgdGhlIHVuYWxpZ25lZCBzZyB0aGUgYnVmZmVyIHdoaWNoIGlzIHVzZWQgZm9yIFJETUEgKi8KKwkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZyA9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKilkYXRhLT5idWY7CisJCWludCBpOworCQljaGFyICpwLCAqZnJvbTsKKworCQlmb3IgKHAgPSBtZW0sIGkgPSAwOyBpIDwgZGF0YS0+c2l6ZTsgaSsrKSB7CisJCQlmcm9tID0ga21hcF9hdG9taWMoc2dbaV0ucGFnZSwgS01fVVNFUjApOworCQkJbWVtY3B5KHAsCisJCQkgICAgICAgZnJvbSArIHNnW2ldLm9mZnNldCwKKwkJCSAgICAgICBzZ1tpXS5sZW5ndGgpOworCQkJa3VubWFwX2F0b21pYyhmcm9tLCBLTV9VU0VSMCk7CisJCQlwICs9IHNnW2ldLmxlbmd0aDsKKwkJfQorCX0KKworCXNnX2luaXRfb25lKCZpc2VyX2N0YXNrLT5kYXRhX2NvcHlbY21kX2Rpcl0uc2dfc2luZ2xlLCBtZW0sIGNtZF9kYXRhX2xlbik7CisJaXNlcl9jdGFzay0+ZGF0YV9jb3B5W2NtZF9kaXJdLmJ1ZiAgPQorCQkmaXNlcl9jdGFzay0+ZGF0YV9jb3B5W2NtZF9kaXJdLnNnX3NpbmdsZTsKKwlpc2VyX2N0YXNrLT5kYXRhX2NvcHlbY21kX2Rpcl0uc2l6ZSA9IDE7CisKKwlpc2VyX2N0YXNrLT5kYXRhX2NvcHlbY21kX2Rpcl0uY29weV9idWYgID0gbWVtOworCisJZG1hX2RldmljZSA9IGlzZXJfY3Rhc2stPmlzZXJfY29ubi0+aWJfY29ubi0+ZGV2aWNlLT5pYl9kZXZpY2UtPmRtYV9kZXZpY2U7CisKKwlpZiAoY21kX2RpciA9PSBJU0VSX0RJUl9PVVQpCisJCWRtYV9uZW50cyA9IGRtYV9tYXBfc2coZG1hX2RldmljZSwKKwkJCQkgICAgICAgJmlzZXJfY3Rhc2stPmRhdGFfY29weVtjbWRfZGlyXS5zZ19zaW5nbGUsCisJCQkJICAgICAgIDEsIERNQV9UT19ERVZJQ0UpOworCWVsc2UKKwkJZG1hX25lbnRzID0gZG1hX21hcF9zZyhkbWFfZGV2aWNlLAorCQkJCSAgICAgICAmaXNlcl9jdGFzay0+ZGF0YV9jb3B5W2NtZF9kaXJdLnNnX3NpbmdsZSwKKwkJCQkgICAgICAgMSwgRE1BX0ZST01fREVWSUNFKTsKKworCUJVR19PTihkbWFfbmVudHMgPT0gMCk7CisKKwlpc2VyX2N0YXNrLT5kYXRhX2NvcHlbY21kX2Rpcl0uZG1hX25lbnRzID0gZG1hX25lbnRzOworCXJldHVybiAwOworfQorCisvKioKKyAqIGlzZXJfZmluYWxpemVfcmRtYV91bmFsaWduZWRfc2cKKyAqLwordm9pZCBpc2VyX2ZpbmFsaXplX3JkbWFfdW5hbGlnbmVkX3NnKHN0cnVjdCBpc2NzaV9pc2VyX2NtZF90YXNrICppc2VyX2N0YXNrLAorCQkJCSAgICAgZW51bSBpc2VyX2RhdGFfZGlyICAgICAgICAgY21kX2RpcikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkbWFfZGV2aWNlOworCXN0cnVjdCBpc2VyX2RhdGFfYnVmICptZW1fY29weTsKKwl1bnNpZ25lZCBsb25nICBjbWRfZGF0YV9sZW47CisKKwlkbWFfZGV2aWNlID0gaXNlcl9jdGFzay0+aXNlcl9jb25uLT5pYl9jb25uLT5kZXZpY2UtPmliX2RldmljZS0+ZG1hX2RldmljZTsKKwltZW1fY29weSAgID0gJmlzZXJfY3Rhc2stPmRhdGFfY29weVtjbWRfZGlyXTsKKworCWlmIChjbWRfZGlyID09IElTRVJfRElSX09VVCkKKwkJZG1hX3VubWFwX3NnKGRtYV9kZXZpY2UsICZtZW1fY29weS0+c2dfc2luZ2xlLCAxLAorCQkJICAgICBETUFfVE9fREVWSUNFKTsKKwllbHNlCisJCWRtYV91bm1hcF9zZyhkbWFfZGV2aWNlLCAmbWVtX2NvcHktPnNnX3NpbmdsZSwgMSwKKwkJCSAgICAgRE1BX0ZST01fREVWSUNFKTsKKworCWlmIChjbWRfZGlyID09IElTRVJfRElSX0lOKSB7CisJCWNoYXIgKm1lbTsKKwkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKKwkJdW5zaWduZWQgY2hhciAqcCwgKnRvOworCQl1bnNpZ25lZCBpbnQgc2dfc2l6ZTsKKwkJaW50IGk7CisKKwkJLyogY29weSBiYWNrIHJlYWQgUkRNQSB0byB1bmFsaWduZWQgc2cgKi8KKwkJbWVtCT0gbWVtX2NvcHktPmNvcHlfYnVmOworCisJCXNnCT0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKWlzZXJfY3Rhc2stPmRhdGFbSVNFUl9ESVJfSU5dLmJ1ZjsKKwkJc2dfc2l6ZSA9IGlzZXJfY3Rhc2stPmRhdGFbSVNFUl9ESVJfSU5dLnNpemU7CisKKwkJZm9yIChwID0gbWVtLCBpID0gMDsgaSA8IHNnX3NpemU7IGkrKyl7CisJCQl0byA9IGttYXBfYXRvbWljKHNnW2ldLnBhZ2UsIEtNX1NPRlRJUlEwKTsKKwkJCW1lbWNweSh0byArIHNnW2ldLm9mZnNldCwKKwkJCSAgICAgICBwLAorCQkJICAgICAgIHNnW2ldLmxlbmd0aCk7CisJCQlrdW5tYXBfYXRvbWljKHRvLCBLTV9TT0ZUSVJRMCk7CisJCQlwICs9IHNnW2ldLmxlbmd0aDsKKwkJfQorCX0KKworCWNtZF9kYXRhX2xlbiA9IGlzZXJfY3Rhc2stPmRhdGFbY21kX2Rpcl0uZGF0YV9sZW47CisKKwlpZiAoY21kX2RhdGFfbGVuID4gSVNFUl9LTUFMTE9DX1RIUkVTSE9MRCkKKwkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZyltZW1fY29weS0+Y29weV9idWYsCisJCQkgICBsb25nX2xvZzIocm91bmR1cF9wb3dfb2ZfdHdvKGNtZF9kYXRhX2xlbikpIC0gUEFHRV9TSElGVCk7CisJZWxzZQorCQlrZnJlZShtZW1fY29weS0+Y29weV9idWYpOworCisJbWVtX2NvcHktPmNvcHlfYnVmID0gTlVMTDsKK30KKworLyoqCisgKiBpc2VyX3NnX3RvX3BhZ2VfdmVjIC0gVHJhbnNsYXRlcyBzY2F0dGVybGlzdCBlbnRyaWVzIHRvIHBoeXNpY2FsIGFkZHJlc3NlcworICogYW5kIHJldHVybnMgdGhlIGxlbmd0aCBvZiByZXN1bHRpbmcgcGh5c2ljYWwgYWRkcmVzcyBhcnJheSAobWF5IGJlIGxlc3MgdGhhbgorICogdGhlIG9yaWdpbmFsIGR1ZSB0byBwb3NzaWJsZSBjb21wYWN0aW9uKS4KKyAqCisgKiB3ZSBidWlsZCBhICJwYWdlIHZlYyIgdW5kZXIgdGhlIGFzc3VtcHRpb24gdGhhdCB0aGUgU0cgbWVldHMgdGhlIFJETUEKKyAqIGFsaWdubWVudCByZXF1aXJlbWVudHMuIE90aGVyIHRoZW4gdGhlIGZpcnN0IGFuZCBsYXN0IFNHIGVsZW1lbnRzLCBhbGwKKyAqIHRoZSAiaW50ZXJuYWwiIGVsZW1lbnRzIGNhbiBiZSBjb21wYWN0ZWQgaW50byBhIGxpc3Qgd2hvc2UgZWxlbWVudHMgYXJlCisgKiBkbWEgYWRkcmVzc2VzIG9mIHBoeXNpY2FsIHBhZ2VzLiBUaGUgY29kZSBzdXBwb3J0cyBhbHNvIHRoZSB3ZWlyZCBjYXNlCisgKiB3aGVyZSAtLWZldyBmcmFnbWVudHMgb2YgdGhlIHNhbWUgcGFnZS0tIGFyZSBwcmVzZW50IGluIHRoZSBTRyBhcworICogY29uc2VjdXRpdmUgZWxlbWVudHMuIEFsc28sIGl0IGhhbmRsZXMgb25lIGVudHJ5IFNHLgorICovCitzdGF0aWMgaW50IGlzZXJfc2dfdG9fcGFnZV92ZWMoc3RydWN0IGlzZXJfZGF0YV9idWYgKmRhdGEsCisJCQkgICAgICAgc3RydWN0IGlzZXJfcGFnZV92ZWMgKnBhZ2VfdmVjKQoreworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2cgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopZGF0YS0+YnVmOworCWRtYV9hZGRyX3QgZmlyc3RfYWRkciwgbGFzdF9hZGRyLCBwYWdlOworCWludCBzdGFydF9hbGlnbmVkLCBlbmRfYWxpZ25lZDsKKwl1bnNpZ25lZCBpbnQgY3VyX3BhZ2UgPSAwOworCXVuc2lnbmVkIGxvbmcgdG90YWxfc3ogPSAwOworCWludCBpOworCisJLyogY29tcHV0ZSB0aGUgb2Zmc2V0IG9mIGZpcnN0IGVsZW1lbnQgKi8KKwlwYWdlX3ZlYy0+b2Zmc2V0ID0gKHU2NCkgc2dbMF0ub2Zmc2V0OworCisJZm9yIChpID0gMDsgaSA8IGRhdGEtPmRtYV9uZW50czsgaSsrKSB7CisJCXRvdGFsX3N6ICs9IHNnX2RtYV9sZW4oJnNnW2ldKTsKKworCQlmaXJzdF9hZGRyID0gc2dfZG1hX2FkZHJlc3MoJnNnW2ldKTsKKwkJbGFzdF9hZGRyICA9IGZpcnN0X2FkZHIgKyBzZ19kbWFfbGVuKCZzZ1tpXSk7CisKKwkJc3RhcnRfYWxpZ25lZCA9ICEoZmlyc3RfYWRkciAmIH5QQUdFX01BU0spOworCQllbmRfYWxpZ25lZCAgID0gIShsYXN0X2FkZHIgICYgflBBR0VfTUFTSyk7CisKKwkJLyogY29udGludWUgdG8gY29sbGVjdCBwYWdlIGZyYWdtZW50cyB0aWxsIGFsaWduZWQgb3IgU0cgZW5kcyAqLworCQl3aGlsZSAoIWVuZF9hbGlnbmVkICYmIChpICsgMSA8IGRhdGEtPmRtYV9uZW50cykpIHsKKwkJCWkrKzsKKwkJCXRvdGFsX3N6ICs9IHNnX2RtYV9sZW4oJnNnW2ldKTsKKwkJCWxhc3RfYWRkciA9IHNnX2RtYV9hZGRyZXNzKCZzZ1tpXSkgKyBzZ19kbWFfbGVuKCZzZ1tpXSk7CisJCQllbmRfYWxpZ25lZCA9ICEobGFzdF9hZGRyICAmIH5QQUdFX01BU0spOworCQl9CisKKwkJZmlyc3RfYWRkciA9IGZpcnN0X2FkZHIgJiBQQUdFX01BU0s7CisKKwkJZm9yIChwYWdlID0gZmlyc3RfYWRkcjsgcGFnZSA8IGxhc3RfYWRkcjsgcGFnZSArPSBQQUdFX1NJWkUpCisJCQlwYWdlX3ZlYy0+cGFnZXNbY3VyX3BhZ2UrK10gPSBwYWdlOworCisJfQorCXBhZ2VfdmVjLT5kYXRhX3NpemUgPSB0b3RhbF9zejsKKwlpc2VyX2RiZygicGFnZV92ZWMtPmRhdGFfc2l6ZTolZCBjdXJfcGFnZSAlZFxuIiwgcGFnZV92ZWMtPmRhdGFfc2l6ZSxjdXJfcGFnZSk7CisJcmV0dXJuIGN1cl9wYWdlOworfQorCisjZGVmaW5lIE1BU0tfNEsJCQkoKDFVTCA8PCAxMikgLSAxKSAvKiAweEZGRiAqLworI2RlZmluZSBJU180S19BTElHTkVEKGFkZHIpCSgoKCh1bnNpZ25lZCBsb25nKWFkZHIpICYgTUFTS180SykgPT0gMCkKKworLyoqCisgKiBpc2VyX2RhdGFfYnVmX2FsaWduZWRfbGVuIC0gVHJpZXMgdG8gZGV0ZXJtaW5lIHRoZSBtYXhpbWFsIGNvcnJlY3RseSBhbGlnbmVkCisgKiBmb3IgUkRNQSBzdWItbGlzdCBvZiBhIHNjYXR0ZXItZ2F0aGVyIGxpc3Qgb2YgbWVtb3J5IGJ1ZmZlcnMsIGFuZCAgcmV0dXJucworICogdGhlIG51bWJlciBvZiBlbnRyaWVzIHdoaWNoIGFyZSBhbGlnbmVkIGNvcnJlY3RseS4gU3VwcG9ydHMgdGhlIGNhc2Ugd2hlcmUKKyAqIGNvbnNlY3V0aXZlIFNHIGVsZW1lbnRzIGFyZSBhY3R1YWxseSBmcmFnbWVudHMgb2YgdGhlIHNhbWUgcGh5c2NpYWwgcGFnZS4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBpc2VyX2RhdGFfYnVmX2FsaWduZWRfbGVuKHN0cnVjdCBpc2VyX2RhdGFfYnVmICpkYXRhKQoreworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CisJZG1hX2FkZHJfdCBlbmRfYWRkciwgbmV4dF9hZGRyOworCWludCBpLCBjbnQ7CisJdW5zaWduZWQgaW50IHJldF9sZW4gPSAwOworCisJc2cgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopZGF0YS0+YnVmOworCisJZm9yIChjbnQgPSAwLCBpID0gMDsgaSA8IGRhdGEtPmRtYV9uZW50czsgaSsrLCBjbnQrKykgeworCQkvKiBpc2VyX2RiZygiQ2hlY2tpbmcgc2cgaW9idWYgWyVkXTogcGh5cz0weCUwOGxYICIKKwkJICAgIm9mZnNldDogJWxkIHN6OiAlbGRcbiIsIGksCisJCSAgICh1bnNpZ25lZCBsb25nKXBhZ2VfdG9fcGh5cyhzZ1tpXS5wYWdlKSwKKwkJICAgKHVuc2lnbmVkIGxvbmcpc2dbaV0ub2Zmc2V0LAorCQkgICAodW5zaWduZWQgbG9uZylzZ1tpXS5sZW5ndGgpOyAqLworCQllbmRfYWRkciA9IHNnX2RtYV9hZGRyZXNzKCZzZ1tpXSkgKworCQkJICAgc2dfZG1hX2xlbigmc2dbaV0pOworCQkvKiBpc2VyX2RiZygiQ2hlY2tpbmcgc2cgaW9idWYgZW5kIGFkZHJlc3MgIgorCQkgICAgICAgIjB4JTA4bFhcbiIsIGVuZF9hZGRyKTsgKi8KKwkJaWYgKGkgKyAxIDwgZGF0YS0+ZG1hX25lbnRzKSB7CisJCQluZXh0X2FkZHIgPSBzZ19kbWFfYWRkcmVzcygmc2dbaSsxXSk7CisJCQkvKiBhcmUgaSwgaSsxIGZyYWdtZW50cyBvZiB0aGUgc2FtZSBwYWdlPyAqLworCQkJaWYgKGVuZF9hZGRyID09IG5leHRfYWRkcikKKwkJCQljb250aW51ZTsKKwkJCWVsc2UgaWYgKCFJU180S19BTElHTkVEKGVuZF9hZGRyKSkgeworCQkJCXJldF9sZW4gPSBjbnQgKyAxOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCWlmIChpID09IGRhdGEtPmRtYV9uZW50cykKKwkJcmV0X2xlbiA9IGNudDsJLyogbG9vcCBlbmRlZCAqLworCWlzZXJfZGJnKCJGb3VuZCAlZCBhbGlnbmVkIGVudHJpZXMgb3V0IG9mICVkIGluIHNnOjB4JXBcbiIsCisJCSByZXRfbGVuLCBkYXRhLT5kbWFfbmVudHMsIGRhdGEpOworCXJldHVybiByZXRfbGVuOworfQorCitzdGF0aWMgdm9pZCBpc2VyX2RhdGFfYnVmX2R1bXAoc3RydWN0IGlzZXJfZGF0YV9idWYgKmRhdGEpCit7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZyA9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKilkYXRhLT5idWY7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZGF0YS0+c2l6ZTsgaSsrKQorCQlpc2VyX2Vycigic2dbJWRdIGRtYV9hZGRyOjB4JWxYIHBhZ2U6MHglcCAiCisJCQkgIm9mZjolZCBzejolZCBkbWFfbGVuOiVkXG4iLAorCQkJIGksICh1bnNpZ25lZCBsb25nKXNnX2RtYV9hZGRyZXNzKCZzZ1tpXSksCisJCQkgc2dbaV0ucGFnZSwgc2dbaV0ub2Zmc2V0LAorCQkJIHNnW2ldLmxlbmd0aCxzZ19kbWFfbGVuKCZzZ1tpXSkpOworfQorCitzdGF0aWMgdm9pZCBpc2VyX2R1bXBfcGFnZV92ZWMoc3RydWN0IGlzZXJfcGFnZV92ZWMgKnBhZ2VfdmVjKQoreworCWludCBpOworCisJaXNlcl9lcnIoInBhZ2UgdmVjIGxlbmd0aCAlZCBkYXRhIHNpemUgJWRcbiIsCisJCSBwYWdlX3ZlYy0+bGVuZ3RoLCBwYWdlX3ZlYy0+ZGF0YV9zaXplKTsKKwlmb3IgKGkgPSAwOyBpIDwgcGFnZV92ZWMtPmxlbmd0aDsgaSsrKQorCQlpc2VyX2VycigiJWQgJWx4XG4iLGksKHVuc2lnbmVkIGxvbmcpcGFnZV92ZWMtPnBhZ2VzW2ldKTsKK30KKworc3RhdGljIHZvaWQgaXNlcl9wYWdlX3ZlY19idWlsZChzdHJ1Y3QgaXNlcl9kYXRhX2J1ZiAqZGF0YSwKKwkJCQlzdHJ1Y3QgaXNlcl9wYWdlX3ZlYyAqcGFnZV92ZWMpCit7CisJaW50IHBhZ2VfdmVjX2xlbiA9IDA7CisKKwlwYWdlX3ZlYy0+bGVuZ3RoID0gMDsKKwlwYWdlX3ZlYy0+b2Zmc2V0ID0gMDsKKworCWlzZXJfZGJnKCJUcmFuc2xhdGluZyBzZyBzejogJWRcbiIsIGRhdGEtPmRtYV9uZW50cyk7CisJcGFnZV92ZWNfbGVuID0gaXNlcl9zZ190b19wYWdlX3ZlYyhkYXRhLHBhZ2VfdmVjKTsKKwlpc2VyX2RiZygic2cgbGVuICVkIHBhZ2VfdmVjX2xlbiAlZFxuIiwgZGF0YS0+ZG1hX25lbnRzLHBhZ2VfdmVjX2xlbik7CisKKwlwYWdlX3ZlYy0+bGVuZ3RoID0gcGFnZV92ZWNfbGVuOworCisJaWYgKHBhZ2VfdmVjX2xlbiAqIFBBR0VfU0laRSA8IHBhZ2VfdmVjLT5kYXRhX3NpemUpIHsKKwkJaXNlcl9lcnIoInBhZ2VfdmVjIHRvbyBzaG9ydCB0byBob2xkIHRoaXMgU0dcbiIpOworCQlpc2VyX2RhdGFfYnVmX2R1bXAoZGF0YSk7CisJCWlzZXJfZHVtcF9wYWdlX3ZlYyhwYWdlX3ZlYyk7CisJCUJVRygpOworCX0KK30KKworLyoqCisgKiBpc2VyX3JlZ19yZG1hX21lbSAtIFJlZ2lzdGVycyBtZW1vcnkgaW50ZW5kZWQgZm9yIFJETUEsCisgKiBvYnRhaW5pbmcgcmtleSBhbmQgdmEKKyAqCisgKiByZXR1cm5zIDAgb24gc3VjY2VzcywgZXJybm8gY29kZSBvbiBmYWlsdXJlCisgKi8KK2ludCBpc2VyX3JlZ19yZG1hX21lbShzdHJ1Y3QgaXNjc2lfaXNlcl9jbWRfdGFzayAqaXNlcl9jdGFzaywKKwkJICAgICAgZW51bSAgIGlzZXJfZGF0YV9kaXIgICAgICAgIGNtZF9kaXIpCit7CisJc3RydWN0IGlzZXJfY29ubiAgICAgKmliX2Nvbm4gPSBpc2VyX2N0YXNrLT5pc2VyX2Nvbm4tPmliX2Nvbm47CisJc3RydWN0IGlzZXJfZGF0YV9idWYgKm1lbSA9ICZpc2VyX2N0YXNrLT5kYXRhW2NtZF9kaXJdOworCXN0cnVjdCBpc2VyX3JlZ2RfYnVmICpyZWdkX2J1ZjsKKwlpbnQgYWxpZ25lZF9sZW47CisJaW50IGVycjsKKworCXJlZ2RfYnVmID0gJmlzZXJfY3Rhc2stPnJkbWFfcmVnZFtjbWRfZGlyXTsKKworCWFsaWduZWRfbGVuID0gaXNlcl9kYXRhX2J1Zl9hbGlnbmVkX2xlbihtZW0pOworCWlmIChhbGlnbmVkX2xlbiAhPSBtZW0tPnNpemUpIHsKKwkJaXNlcl9lcnIoInJkbWEgYWxpZ25tZW50IHZpb2xhdGlvbiAlZC8lZCBhbGlnbmVkXG4iLAorCQkJIGFsaWduZWRfbGVuLCBtZW0tPnNpemUpOworCQlpc2VyX2RhdGFfYnVmX2R1bXAobWVtKTsKKwkJLyogYWxsb2NhdGUgY29weSBidWYsIGlmIHdlIGFyZSB3cml0aW5nLCBjb3B5IHRoZSAqLworCQkvKiB1bmFsaWduZWQgc2NhdHRlcmxpc3QsIGRtYSBtYXAgdGhlIGNvcHkgICAgICAgICovCisJCWlmIChpc2VyX3N0YXJ0X3JkbWFfdW5hbGlnbmVkX3NnKGlzZXJfY3Rhc2ssIGNtZF9kaXIpICE9IDApCisJCQkJcmV0dXJuIC1FTk9NRU07CisJCW1lbSA9ICZpc2VyX2N0YXNrLT5kYXRhX2NvcHlbY21kX2Rpcl07CisJfQorCisJaXNlcl9wYWdlX3ZlY19idWlsZChtZW0sIGliX2Nvbm4tPnBhZ2VfdmVjKTsKKwllcnIgPSBpc2VyX3JlZ19wYWdlX3ZlYyhpYl9jb25uLCBpYl9jb25uLT5wYWdlX3ZlYywgJnJlZ2RfYnVmLT5yZWcpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkvKiB0YWtlIGEgcmVmZXJlbmNlIG9uIHRoaXMgcmVnZCBidWYgc3VjaCB0aGF0IGl0IHdpbGwgbm90IGJlIHJlbGVhc2VkICoKKwkgKiAoZWcgaW4gc2VuZCBkdG8gY29tcGxldGlvbikgYmVmb3JlIHdlIGdldCB0aGUgc2NzaSByZXNwb25zZSAgICAgICAgICovCisJYXRvbWljX2luYygmcmVnZF9idWYtPnJlZl9jb3VudCk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lzZXIvaXNlcl92ZXJicy5jIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pc2VyL2lzZXJfdmVyYnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjExN2JiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pc2VyL2lzZXJfdmVyYnMuYwpAQCAtMCwwICsxLDgyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSwgMjAwNiBWb2x0YWlyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IENpc2NvIFN5c3RlbXMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCisgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiwgYXZhaWxhYmxlIGZyb20gdGhlIGZpbGUKKyAqIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUsIG9yIHRoZQorICogT3BlbklCLm9yZyBCU0QgbGljZW5zZSBiZWxvdzoKKyAqCisgKiAgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgorICogICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZworICogICAgIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKgktIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKKyAqCSAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqCSAgZGlzY2xhaW1lci4KKyAqCisgKgktIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqCSAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqCSAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKgkgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICoKKyAqICRJZDogaXNlcl92ZXJicy5jIDcwNTEgMjAwNi0wNS0xMCAxMjoyOToxMVogb2dlcmxpdHogJAorICovCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKworI2luY2x1ZGUgImlzY3NpX2lzZXIuaCIKKworI2RlZmluZSBJU0NTSV9JU0VSX01BWF9DT05OCTgKKyNkZWZpbmUgSVNFUl9NQVhfQ1FfTEVOCQkoKElTRVJfUVBfTUFYX1JFQ1ZfRFRPUyArIFwKKwkJCQlJU0VSX1FQX01BWF9SRVFfRFRPUykgKiAgIFwKKwkJCQkgSVNDU0lfSVNFUl9NQVhfQ09OTikKKworc3RhdGljIHZvaWQgaXNlcl9jcV90YXNrbGV0X2ZuKHVuc2lnbmVkIGxvbmcgZGF0YSk7CitzdGF0aWMgdm9pZCBpc2VyX2NxX2NhbGxiYWNrKHN0cnVjdCBpYl9jcSAqY3EsIHZvaWQgKmNxX2NvbnRleHQpOworc3RhdGljIHZvaWQgaXNlcl9jb21wX2Vycm9yX3dvcmtlcih2b2lkICpkYXRhKTsKKworc3RhdGljIHZvaWQgaXNlcl9jcV9ldmVudF9jYWxsYmFjayhzdHJ1Y3QgaWJfZXZlbnQgKmNhdXNlLCB2b2lkICpjb250ZXh0KQoreworCWlzZXJfZXJyKCJnb3QgY3EgZXZlbnQgJWQgXG4iLCBjYXVzZS0+ZXZlbnQpOworfQorCitzdGF0aWMgdm9pZCBpc2VyX3FwX2V2ZW50X2NhbGxiYWNrKHN0cnVjdCBpYl9ldmVudCAqY2F1c2UsIHZvaWQgKmNvbnRleHQpCit7CisJaXNlcl9lcnIoImdvdCBxcCBldmVudCAlZFxuIixjYXVzZS0+ZXZlbnQpOworfQorCisvKioKKyAqIGlzZXJfY3JlYXRlX2RldmljZV9pYl9yZXMgLSBjcmVhdGVzIFByb3RlY3Rpb24gRG9tYWluIChQRCksIENvbXBsZXRpb24KKyAqIFF1ZXVlIChDUSksIERNQSBNZW1vcnkgUmVnaW9uIChETUEgTVIpIHdpdGggdGhlIGRldmljZSBhc3NvY2lhdGVkIHdpdGgKKyAqIHRoZSBhZGFwYXRvci4KKyAqCisgKiByZXR1cm5zIDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZQorICovCitzdGF0aWMgaW50IGlzZXJfY3JlYXRlX2RldmljZV9pYl9yZXMoc3RydWN0IGlzZXJfZGV2aWNlICpkZXZpY2UpCit7CisJZGV2aWNlLT5wZCA9IGliX2FsbG9jX3BkKGRldmljZS0+aWJfZGV2aWNlKTsKKwlpZiAoSVNfRVJSKGRldmljZS0+cGQpKQorCQlnb3RvIHBkX2VycjsKKworCWRldmljZS0+Y3EgPSBpYl9jcmVhdGVfY3EoZGV2aWNlLT5pYl9kZXZpY2UsCisJCQkJICBpc2VyX2NxX2NhbGxiYWNrLAorCQkJCSAgaXNlcl9jcV9ldmVudF9jYWxsYmFjaywKKwkJCQkgICh2b2lkICopZGV2aWNlLAorCQkJCSAgSVNFUl9NQVhfQ1FfTEVOKTsKKwlpZiAoSVNfRVJSKGRldmljZS0+Y3EpKQorCQlnb3RvIGNxX2VycjsKKworCWlmIChpYl9yZXFfbm90aWZ5X2NxKGRldmljZS0+Y3EsIElCX0NRX05FWFRfQ09NUCkpCisJCWdvdG8gY3FfYXJtX2VycjsKKworCXRhc2tsZXRfaW5pdCgmZGV2aWNlLT5jcV90YXNrbGV0LAorCQkgICAgIGlzZXJfY3FfdGFza2xldF9mbiwKKwkJICAgICAodW5zaWduZWQgbG9uZylkZXZpY2UpOworCisJZGV2aWNlLT5tciA9IGliX2dldF9kbWFfbXIoZGV2aWNlLT5wZCwKKwkJCQkgICBJQl9BQ0NFU1NfTE9DQUxfV1JJVEUpOworCWlmIChJU19FUlIoZGV2aWNlLT5tcikpCisJCWdvdG8gZG1hX21yX2VycjsKKworCXJldHVybiAwOworCitkbWFfbXJfZXJyOgorCXRhc2tsZXRfa2lsbCgmZGV2aWNlLT5jcV90YXNrbGV0KTsKK2NxX2FybV9lcnI6CisJaWJfZGVzdHJveV9jcShkZXZpY2UtPmNxKTsKK2NxX2VycjoKKwlpYl9kZWFsbG9jX3BkKGRldmljZS0+cGQpOworcGRfZXJyOgorCWlzZXJfZXJyKCJmYWlsZWQgdG8gYWxsb2NhdGUgYW4gSUIgcmVzb3VyY2VcbiIpOworCXJldHVybiAtMTsKK30KKworLyoqCisgKiBpc2VyX2ZyZWVfZGV2aWNlX2liX3JlcyAtIGRlc3RvcnkvZGVhbGxvYy9kZXJlZyB0aGUgRE1BIE1SLAorICogQ1EgYW5kIFBEIGNyZWF0ZWQgd2l0aCB0aGUgZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWRhcGF0b3IuCisgKi8KK3N0YXRpYyB2b2lkIGlzZXJfZnJlZV9kZXZpY2VfaWJfcmVzKHN0cnVjdCBpc2VyX2RldmljZSAqZGV2aWNlKQoreworCUJVR19PTihkZXZpY2UtPm1yID09IE5VTEwpOworCisJdGFza2xldF9raWxsKCZkZXZpY2UtPmNxX3Rhc2tsZXQpOworCisJKHZvaWQpaWJfZGVyZWdfbXIoZGV2aWNlLT5tcik7CisJKHZvaWQpaWJfZGVzdHJveV9jcShkZXZpY2UtPmNxKTsKKwkodm9pZClpYl9kZWFsbG9jX3BkKGRldmljZS0+cGQpOworCisJZGV2aWNlLT5tciA9IE5VTEw7CisJZGV2aWNlLT5jcSA9IE5VTEw7CisJZGV2aWNlLT5wZCA9IE5VTEw7Cit9CisKKy8qKgorICogaXNlcl9jcmVhdGVfaWJfY29ubl9yZXMgLSBDcmVhdGVzIEZNUiBwb29sIGFuZCBRdWV1ZS1QYWlyIChRUCkKKyAqCisgKiByZXR1cm5zIDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZQorICovCitzdGF0aWMgaW50IGlzZXJfY3JlYXRlX2liX2Nvbm5fcmVzKHN0cnVjdCBpc2VyX2Nvbm4gKmliX2Nvbm4pCit7CisJc3RydWN0IGlzZXJfZGV2aWNlCSpkZXZpY2U7CisJc3RydWN0IGliX3FwX2luaXRfYXR0cglpbml0X2F0dHI7CisJaW50CQkJcmV0OworCXN0cnVjdCBpYl9mbXJfcG9vbF9wYXJhbSBwYXJhbXM7CisKKwlCVUdfT04oaWJfY29ubi0+ZGV2aWNlID09IE5VTEwpOworCisJZGV2aWNlID0gaWJfY29ubi0+ZGV2aWNlOworCisJaWJfY29ubi0+cGFnZV92ZWMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaXNlcl9wYWdlX3ZlYykgKworCQkJCSAgICAoc2l6ZW9mKHU2NCkgKiAoSVNDU0lfSVNFUl9TR19UQUJMRVNJWkUgKzEpKSwKKwkJCQkgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFpYl9jb25uLT5wYWdlX3ZlYykgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGFsbG9jX2VycjsKKwl9CisJaWJfY29ubi0+cGFnZV92ZWMtPnBhZ2VzID0gKHU2NCAqKSAoaWJfY29ubi0+cGFnZV92ZWMgKyAxKTsKKworCXBhcmFtcy5wYWdlX3NoaWZ0ICAgICAgICA9IFBBR0VfU0hJRlQ7CisJLyogd2hlbiB0aGUgZmlyc3QvbGFzdCBTRyBlbGVtZW50IGFyZSBub3Qgc3RhcnQvZW5kICoKKwkgKiBwYWdlIGFsaWduZWQsIHRoZSBtYXAgd2hvdWxkIGJlIG9mIE4rMSBwYWdlcyAgICAgKi8KKwlwYXJhbXMubWF4X3BhZ2VzX3Blcl9mbXIgPSBJU0NTSV9JU0VSX1NHX1RBQkxFU0laRSArIDE7CisJLyogbWFrZSB0aGUgcG9vbCBzaXplIHR3aWNlIHRoZSBtYXggbnVtYmVyIG9mIFNDU0kgY29tbWFuZHMgKgorCSAqIHRoZSBNTCBpcyBleHBlY3RlZCB0byBxdWV1ZSwgd2F0ZXJtYXJrIGZvciB1bm1hcCBhdCA1MCUgICovCisJcGFyYW1zLnBvb2xfc2l6ZQkgPSBJU0NTSV9YTUlUX0NNRFNfTUFYICogMjsKKwlwYXJhbXMuZGlydHlfd2F0ZXJtYXJrCSA9IElTQ1NJX1hNSVRfQ01EU19NQVg7CisJcGFyYW1zLmNhY2hlCQkgPSAwOworCXBhcmFtcy5mbHVzaF9mdW5jdGlvbgkgPSBOVUxMOworCXBhcmFtcy5hY2Nlc3MJCSA9IChJQl9BQ0NFU1NfTE9DQUxfV1JJVEUgIHwKKwkJCQkgICAgSUJfQUNDRVNTX1JFTU9URV9XUklURSB8CisJCQkJICAgIElCX0FDQ0VTU19SRU1PVEVfUkVBRCk7CisKKwlpYl9jb25uLT5mbXJfcG9vbCA9IGliX2NyZWF0ZV9mbXJfcG9vbChkZXZpY2UtPnBkLCAmcGFyYW1zKTsKKwlpZiAoSVNfRVJSKGliX2Nvbm4tPmZtcl9wb29sKSkgeworCQlyZXQgPSBQVFJfRVJSKGliX2Nvbm4tPmZtcl9wb29sKTsKKwkJZ290byBmbXJfcG9vbF9lcnI7CisJfQorCisJbWVtc2V0KCZpbml0X2F0dHIsIDAsIHNpemVvZiBpbml0X2F0dHIpOworCisJaW5pdF9hdHRyLmV2ZW50X2hhbmRsZXIgPSBpc2VyX3FwX2V2ZW50X2NhbGxiYWNrOworCWluaXRfYXR0ci5xcF9jb250ZXh0CT0gKHZvaWQgKilpYl9jb25uOworCWluaXRfYXR0ci5zZW5kX2NxCT0gZGV2aWNlLT5jcTsKKwlpbml0X2F0dHIucmVjdl9jcQk9IGRldmljZS0+Y3E7CisJaW5pdF9hdHRyLmNhcC5tYXhfc2VuZF93ciAgPSBJU0VSX1FQX01BWF9SRVFfRFRPUzsKKwlpbml0X2F0dHIuY2FwLm1heF9yZWN2X3dyICA9IElTRVJfUVBfTUFYX1JFQ1ZfRFRPUzsKKwlpbml0X2F0dHIuY2FwLm1heF9zZW5kX3NnZSA9IE1BWF9SRUdEX0JVRl9WRUNUT1JfTEVOOworCWluaXRfYXR0ci5jYXAubWF4X3JlY3Zfc2dlID0gMjsKKwlpbml0X2F0dHIuc3Ffc2lnX3R5cGUJPSBJQl9TSUdOQUxfUkVRX1dSOworCWluaXRfYXR0ci5xcF90eXBlCT0gSUJfUVBUX1JDOworCisJcmV0ID0gcmRtYV9jcmVhdGVfcXAoaWJfY29ubi0+Y21hX2lkLCBkZXZpY2UtPnBkLCAmaW5pdF9hdHRyKTsKKwlpZiAocmV0KQorCQlnb3RvIHFwX2VycjsKKworCWliX2Nvbm4tPnFwID0gaWJfY29ubi0+Y21hX2lkLT5xcDsKKwlpc2VyX2Vycigic2V0dGluZyBjb25uICVwIGNtYV9pZCAlcDogZm1yX3Bvb2wgJXAgcXAgJXBcbiIsCisJCSBpYl9jb25uLCBpYl9jb25uLT5jbWFfaWQsCisJCSBpYl9jb25uLT5mbXJfcG9vbCwgaWJfY29ubi0+Y21hX2lkLT5xcCk7CisJcmV0dXJuIHJldDsKKworcXBfZXJyOgorCSh2b2lkKWliX2Rlc3Ryb3lfZm1yX3Bvb2woaWJfY29ubi0+Zm1yX3Bvb2wpOworZm1yX3Bvb2xfZXJyOgorCWtmcmVlKGliX2Nvbm4tPnBhZ2VfdmVjKTsKK2FsbG9jX2VycjoKKwlpc2VyX2VycigidW5hYmxlIHRvIGFsbG9jIG1lbSBvciBjcmVhdGUgcmVzb3VyY2UsIGVyciAlZFxuIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIHJlbGVhc2VzIHRoZSBGTVIgcG9vbCwgUVAgYW5kIENNQSBJRCBvYmplY3RzLCByZXR1cm5zIDAgb24gc3VjY2VzcywKKyAqIC0xIG9uIGZhaWx1cmUKKyAqLworc3RhdGljIGludCBpc2VyX2ZyZWVfaWJfY29ubl9yZXMoc3RydWN0IGlzZXJfY29ubiAqaWJfY29ubikKK3sKKwlCVUdfT04oaWJfY29ubiA9PSBOVUxMKTsKKworCWlzZXJfZXJyKCJmcmVlaW5nIGNvbm4gJXAgY21hX2lkICVwIGZtciBwb29sICVwIHFwICVwXG4iLAorCQkgaWJfY29ubiwgaWJfY29ubi0+Y21hX2lkLAorCQkgaWJfY29ubi0+Zm1yX3Bvb2wsIGliX2Nvbm4tPnFwKTsKKworCS8qIHFwIGlzIGNyZWF0ZWQgb25seSBvbmNlIGJvdGggYWRkciAmIHJvdXRlIGFyZSByZXNvbHZlZCAqLworCWlmIChpYl9jb25uLT5mbXJfcG9vbCAhPSBOVUxMKQorCQlpYl9kZXN0cm95X2Ztcl9wb29sKGliX2Nvbm4tPmZtcl9wb29sKTsKKworCWlmIChpYl9jb25uLT5xcCAhPSBOVUxMKQorCQlyZG1hX2Rlc3Ryb3lfcXAoaWJfY29ubi0+Y21hX2lkKTsKKworCWlmIChpYl9jb25uLT5jbWFfaWQgIT0gTlVMTCkKKwkJcmRtYV9kZXN0cm95X2lkKGliX2Nvbm4tPmNtYV9pZCk7CisKKwlpYl9jb25uLT5mbXJfcG9vbCA9IE5VTEw7CisJaWJfY29ubi0+cXAJICA9IE5VTEw7CisJaWJfY29ubi0+Y21hX2lkICAgPSBOVUxMOworCWtmcmVlKGliX2Nvbm4tPnBhZ2VfdmVjKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGJhc2VkIG9uIHRoZSByZXNvbHZlZCBkZXZpY2Ugbm9kZSBHVUlEIHNlZSBpZiB0aGVyZSBhbHJlYWR5IGFsbG9jYXRlZAorICogZGV2aWNlIGZvciB0aGlzIGRldmljZS4gSWYgdGhlcmUncyBubyBzdWNoLCBjcmVhdGUgb25lLgorICovCitzdGF0aWMKK3N0cnVjdCBpc2VyX2RldmljZSAqaXNlcl9kZXZpY2VfZmluZF9ieV9pYl9kZXZpY2Uoc3RydWN0IHJkbWFfY21faWQgKmNtYV9pZCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICAgICpwX2xpc3Q7CisJc3RydWN0IGlzZXJfZGV2aWNlICAqZGV2aWNlID0gTlVMTDsKKworCW11dGV4X2xvY2soJmlnLmRldmljZV9saXN0X211dGV4KTsKKworCXBfbGlzdCA9IGlnLmRldmljZV9saXN0Lm5leHQ7CisJd2hpbGUgKHBfbGlzdCAhPSAmaWcuZGV2aWNlX2xpc3QpIHsKKwkJZGV2aWNlID0gbGlzdF9lbnRyeShwX2xpc3QsIHN0cnVjdCBpc2VyX2RldmljZSwgaWdfbGlzdCk7CisJCS8qIGZpbmQgaWYgdGhlcmUncyBhIG1hdGNoIHVzaW5nIHRoZSBub2RlIEdVSUQgKi8KKwkJaWYgKGRldmljZS0+aWJfZGV2aWNlLT5ub2RlX2d1aWQgPT0gY21hX2lkLT5kZXZpY2UtPm5vZGVfZ3VpZCkKKwkJCWJyZWFrOworCX0KKworCWlmIChkZXZpY2UgPT0gTlVMTCkgeworCQlkZXZpY2UgPSBremFsbG9jKHNpemVvZiAqZGV2aWNlLCBHRlBfS0VSTkVMKTsKKwkJaWYgKGRldmljZSA9PSBOVUxMKQorCQkJZ290byBvdXQ7CisJCS8qIGFzc2lnbiB0aGlzIGRldmljZSB0byB0aGUgZGV2aWNlICovCisJCWRldmljZS0+aWJfZGV2aWNlID0gY21hX2lkLT5kZXZpY2U7CisJCS8qIGluaXQgdGhlIGRldmljZSBhbmQgbGluayBpdCBpbnRvIGlnIGRldmljZSBsaXN0ICovCisJCWlmIChpc2VyX2NyZWF0ZV9kZXZpY2VfaWJfcmVzKGRldmljZSkpIHsKKwkJCWtmcmVlKGRldmljZSk7CisJCQlkZXZpY2UgPSBOVUxMOworCQkJZ290byBvdXQ7CisJCX0KKwkJbGlzdF9hZGQoJmRldmljZS0+aWdfbGlzdCwgJmlnLmRldmljZV9saXN0KTsKKwl9CitvdXQ6CisJQlVHX09OKGRldmljZSA9PSBOVUxMKTsKKwlkZXZpY2UtPnJlZmNvdW50Kys7CisJbXV0ZXhfdW5sb2NrKCZpZy5kZXZpY2VfbGlzdF9tdXRleCk7CisJcmV0dXJuIGRldmljZTsKK30KKworLyogaWYgdGhlcmUncyBubyBkZW1hbmQgZm9yIHRoaXMgZGV2aWNlLCByZWxlYXNlIGl0ICovCitzdGF0aWMgdm9pZCBpc2VyX2RldmljZV90cnlfcmVsZWFzZShzdHJ1Y3QgaXNlcl9kZXZpY2UgKmRldmljZSkKK3sKKwltdXRleF9sb2NrKCZpZy5kZXZpY2VfbGlzdF9tdXRleCk7CisJZGV2aWNlLT5yZWZjb3VudC0tOworCWlzZXJfZXJyKCJkZXZpY2UgJXAgcmVmY291bnQgJWRcbiIsZGV2aWNlLGRldmljZS0+cmVmY291bnQpOworCWlmICghZGV2aWNlLT5yZWZjb3VudCkgeworCQlpc2VyX2ZyZWVfZGV2aWNlX2liX3JlcyhkZXZpY2UpOworCQlsaXN0X2RlbCgmZGV2aWNlLT5pZ19saXN0KTsKKwkJa2ZyZWUoZGV2aWNlKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZpZy5kZXZpY2VfbGlzdF9tdXRleCk7Cit9CisKK2ludCBpc2VyX2Nvbm5fc3RhdGVfY29tcChzdHJ1Y3QgaXNlcl9jb25uICppYl9jb25uLAorCQkJZW51bSBpc2VyX2liX2Nvbm5fc3RhdGUgY29tcCkKK3sKKwlpbnQgcmV0OworCisJc3Bpbl9sb2NrX2JoKCZpYl9jb25uLT5sb2NrKTsKKwlyZXQgPSAoaWJfY29ubi0+c3RhdGUgPT0gY29tcCk7CisJc3Bpbl91bmxvY2tfYmgoJmliX2Nvbm4tPmxvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaXNlcl9jb25uX3N0YXRlX2NvbXBfZXhjaChzdHJ1Y3QgaXNlcl9jb25uICppYl9jb25uLAorCQkJCSAgICAgZW51bSBpc2VyX2liX2Nvbm5fc3RhdGUgY29tcCwKKwkJCQkgICAgIGVudW0gaXNlcl9pYl9jb25uX3N0YXRlIGV4Y2gpCit7CisJaW50IHJldDsKKworCXNwaW5fbG9ja19iaCgmaWJfY29ubi0+bG9jayk7CisJaWYgKChyZXQgPSAoaWJfY29ubi0+c3RhdGUgPT0gY29tcCkpKQorCQlpYl9jb25uLT5zdGF0ZSA9IGV4Y2g7CisJc3Bpbl91bmxvY2tfYmgoJmliX2Nvbm4tPmxvY2spOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogdHJpZ2dlcnMgc3RhcnQgb2YgdGhlIGRpc2Nvbm5lY3QgcHJvY2VkdXJlcyBhbmQgd2FpdCBmb3IgdGhlbSB0byBiZSBkb25lCisgKi8KK3ZvaWQgaXNlcl9jb25uX3Rlcm1pbmF0ZShzdHJ1Y3QgaXNlcl9jb25uICppYl9jb25uKQoreworCWludCBlcnIgPSAwOworCisJLyogY2hhbmdlIHRoZSBpYiBjb25uIHN0YXRlIG9ubHkgaWYgdGhlIGNvbm4gaXMgVVAsIGhvd2V2ZXIgYWx3YXlzIGNhbGwKKwkgKiByZG1hX2Rpc2Nvbm5lY3Qgc2luY2UgdGhpcyBpcyB0aGUgb25seSB3YXkgdG8gY2F1c2UgdGhlIENNQSB0byBjaGFuZ2UKKwkgKiB0aGUgUVAgc3RhdGUgdG8gRVJST1IKKwkgKi8KKworCWlzZXJfY29ubl9zdGF0ZV9jb21wX2V4Y2goaWJfY29ubiwgSVNFUl9DT05OX1VQLCBJU0VSX0NPTk5fVEVSTUlOQVRJTkcpOworCWVyciA9IHJkbWFfZGlzY29ubmVjdChpYl9jb25uLT5jbWFfaWQpOworCWlmIChlcnIpCisJCWlzZXJfZXJyKCJGYWlsZWQgdG8gZGlzY29ubmVjdCwgY29ubjogMHglcCBlcnIgJWRcbiIsCisJCQkgaWJfY29ubixlcnIpOworCisJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGliX2Nvbm4tPndhaXQsCisJCQkJIGliX2Nvbm4tPnN0YXRlID09IElTRVJfQ09OTl9ET1dOKTsKKworCWlzZXJfY29ubl9yZWxlYXNlKGliX2Nvbm4pOworfQorCitzdGF0aWMgdm9pZCBpc2VyX2Nvbm5lY3RfZXJyb3Ioc3RydWN0IHJkbWFfY21faWQgKmNtYV9pZCkKK3sKKwlzdHJ1Y3QgaXNlcl9jb25uICppYl9jb25uOworCWliX2Nvbm4gPSAoc3RydWN0IGlzZXJfY29ubiAqKWNtYV9pZC0+Y29udGV4dDsKKworCWliX2Nvbm4tPnN0YXRlID0gSVNFUl9DT05OX0RPV047CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpYl9jb25uLT53YWl0KTsKK30KKworc3RhdGljIHZvaWQgaXNlcl9hZGRyX2hhbmRsZXIoc3RydWN0IHJkbWFfY21faWQgKmNtYV9pZCkKK3sKKwlzdHJ1Y3QgaXNlcl9kZXZpY2UgKmRldmljZTsKKwlzdHJ1Y3QgaXNlcl9jb25uICAgKmliX2Nvbm47CisJaW50ICAgIHJldDsKKworCWRldmljZSA9IGlzZXJfZGV2aWNlX2ZpbmRfYnlfaWJfZGV2aWNlKGNtYV9pZCk7CisJaWJfY29ubiA9IChzdHJ1Y3QgaXNlcl9jb25uICopY21hX2lkLT5jb250ZXh0OworCWliX2Nvbm4tPmRldmljZSA9IGRldmljZTsKKworCXJldCA9IHJkbWFfcmVzb2x2ZV9yb3V0ZShjbWFfaWQsIDEwMDApOworCWlmIChyZXQpIHsKKwkJaXNlcl9lcnIoInJlc29sdmUgcm91dGUgZmFpbGVkOiAlZFxuIiwgcmV0KTsKKwkJaXNlcl9jb25uZWN0X2Vycm9yKGNtYV9pZCk7CisJfQorCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgaXNlcl9yb3V0ZV9oYW5kbGVyKHN0cnVjdCByZG1hX2NtX2lkICpjbWFfaWQpCit7CisJc3RydWN0IHJkbWFfY29ubl9wYXJhbSBjb25uX3BhcmFtOworCWludCAgICByZXQ7CisKKwlyZXQgPSBpc2VyX2NyZWF0ZV9pYl9jb25uX3Jlcygoc3RydWN0IGlzZXJfY29ubiAqKWNtYV9pZC0+Y29udGV4dCk7CisJaWYgKHJldCkKKwkJZ290byBmYWlsdXJlOworCisJaXNlcl9kYmcoInBhdGgubXR1IGlzICVkIHNldHRpbmcgaXQgdG8gJWRcbiIsCisJCSBjbWFfaWQtPnJvdXRlLnBhdGhfcmVjLT5tdHUsIElCX01UVV8xMDI0KTsKKworCS8qIHdlIG11c3Qgc2V0IHRoZSBNVFUgdG8gMTAyNCBhcyB0aGlzIGlzIHdoYXQgdGhlIHRhcmdldCBpcyBhc3N1bWluZyAqLworCWlmIChjbWFfaWQtPnJvdXRlLnBhdGhfcmVjLT5tdHUgPiBJQl9NVFVfMTAyNCkKKwkJY21hX2lkLT5yb3V0ZS5wYXRoX3JlYy0+bXR1ID0gSUJfTVRVXzEwMjQ7CisKKwltZW1zZXQoJmNvbm5fcGFyYW0sIDAsIHNpemVvZiBjb25uX3BhcmFtKTsKKwljb25uX3BhcmFtLnJlc3BvbmRlcl9yZXNvdXJjZXMgPSA0OworCWNvbm5fcGFyYW0uaW5pdGlhdG9yX2RlcHRoICAgICA9IDE7CisJY29ubl9wYXJhbS5yZXRyeV9jb3VudAkgICAgICAgPSA3OworCWNvbm5fcGFyYW0ucm5yX3JldHJ5X2NvdW50ICAgICA9IDY7CisKKwlyZXQgPSByZG1hX2Nvbm5lY3QoY21hX2lkLCAmY29ubl9wYXJhbSk7CisJaWYgKHJldCkgeworCQlpc2VyX2VycigiZmFpbHVyZSBjb25uZWN0aW5nOiAlZFxuIiwgcmV0KTsKKwkJZ290byBmYWlsdXJlOworCX0KKworCXJldHVybjsKK2ZhaWx1cmU6CisJaXNlcl9jb25uZWN0X2Vycm9yKGNtYV9pZCk7Cit9CisKK3N0YXRpYyB2b2lkIGlzZXJfY29ubmVjdGVkX2hhbmRsZXIoc3RydWN0IHJkbWFfY21faWQgKmNtYV9pZCkKK3sKKwlzdHJ1Y3QgaXNlcl9jb25uICppYl9jb25uOworCisJaWJfY29ubiA9IChzdHJ1Y3QgaXNlcl9jb25uICopY21hX2lkLT5jb250ZXh0OworCWliX2Nvbm4tPnN0YXRlID0gSVNFUl9DT05OX1VQOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaWJfY29ubi0+d2FpdCk7Cit9CisKK3N0YXRpYyB2b2lkIGlzZXJfZGlzY29ubmVjdGVkX2hhbmRsZXIoc3RydWN0IHJkbWFfY21faWQgKmNtYV9pZCkKK3sKKwlzdHJ1Y3QgaXNlcl9jb25uICppYl9jb25uOworCisJaWJfY29ubiA9IChzdHJ1Y3QgaXNlcl9jb25uICopY21hX2lkLT5jb250ZXh0OworCWliX2Nvbm4tPmRpc2NfZXZ0X2ZsYWcgPSAxOworCisJLyogZ2V0dGluZyBoZXJlIHdoZW4gdGhlIHN0YXRlIGlzIFVQIG1lYW5zIHRoYXQgdGhlIGNvbm4gaXMgYmVpbmcgKgorCSAqIHRlcm1pbmF0ZWQgYXN5bmNocm9ub3VzbHkgZnJvbSB0aGUgaVNDU0kgbGF5ZXIncyBwZXJzcGVjdGl2ZS4gICovCisJaWYgKGlzZXJfY29ubl9zdGF0ZV9jb21wX2V4Y2goaWJfY29ubiwgSVNFUl9DT05OX1VQLAorCQkJCSAgICAgIElTRVJfQ09OTl9URVJNSU5BVElORykpCisJCWlzY3NpX2Nvbm5fZmFpbHVyZShpYl9jb25uLT5pc2VyX2Nvbm4tPmlzY3NpX2Nvbm4sCisJCQkJICAgSVNDU0lfRVJSX0NPTk5fRkFJTEVEKTsKKworCS8qIENvbXBsZXRlIHRoZSB0ZXJtaW5hdGlvbiBwcm9jZXNzIGlmIG5vIHBvc3RzIGFyZSBwZW5kaW5nICovCisJaWYgKChhdG9taWNfcmVhZCgmaWJfY29ubi0+cG9zdF9yZWN2X2J1Zl9jb3VudCkgPT0gMCkgJiYKKwkgICAgKGF0b21pY19yZWFkKCZpYl9jb25uLT5wb3N0X3NlbmRfYnVmX2NvdW50KSA9PSAwKSkgeworCQlpYl9jb25uLT5zdGF0ZSA9IElTRVJfQ09OTl9ET1dOOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmliX2Nvbm4tPndhaXQpOworCX0KK30KKworc3RhdGljIGludCBpc2VyX2NtYV9oYW5kbGVyKHN0cnVjdCByZG1hX2NtX2lkICpjbWFfaWQsIHN0cnVjdCByZG1hX2NtX2V2ZW50ICpldmVudCkKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlzZXJfZXJyKCJldmVudCAlZCBjb25uICVwIGlkICVwXG4iLGV2ZW50LT5ldmVudCxjbWFfaWQtPmNvbnRleHQsY21hX2lkKTsKKworCXN3aXRjaCAoZXZlbnQtPmV2ZW50KSB7CisJY2FzZSBSRE1BX0NNX0VWRU5UX0FERFJfUkVTT0xWRUQ6CisJCWlzZXJfYWRkcl9oYW5kbGVyKGNtYV9pZCk7CisJCWJyZWFrOworCWNhc2UgUkRNQV9DTV9FVkVOVF9ST1VURV9SRVNPTFZFRDoKKwkJaXNlcl9yb3V0ZV9oYW5kbGVyKGNtYV9pZCk7CisJCWJyZWFrOworCWNhc2UgUkRNQV9DTV9FVkVOVF9FU1RBQkxJU0hFRDoKKwkJaXNlcl9jb25uZWN0ZWRfaGFuZGxlcihjbWFfaWQpOworCQlicmVhazsKKwljYXNlIFJETUFfQ01fRVZFTlRfQUREUl9FUlJPUjoKKwljYXNlIFJETUFfQ01fRVZFTlRfUk9VVEVfRVJST1I6CisJY2FzZSBSRE1BX0NNX0VWRU5UX0NPTk5FQ1RfRVJST1I6CisJY2FzZSBSRE1BX0NNX0VWRU5UX1VOUkVBQ0hBQkxFOgorCWNhc2UgUkRNQV9DTV9FVkVOVF9SRUpFQ1RFRDoKKwkJaXNlcl9lcnIoImV2ZW50OiAlZCwgZXJyb3I6ICVkXG4iLCBldmVudC0+ZXZlbnQsIGV2ZW50LT5zdGF0dXMpOworCQlpc2VyX2Nvbm5lY3RfZXJyb3IoY21hX2lkKTsKKwkJYnJlYWs7CisJY2FzZSBSRE1BX0NNX0VWRU5UX0RJU0NPTk5FQ1RFRDoKKwkJaXNlcl9kaXNjb25uZWN0ZWRfaGFuZGxlcihjbWFfaWQpOworCQlicmVhazsKKwljYXNlIFJETUFfQ01fRVZFTlRfREVWSUNFX1JFTU9WQUw6CisJCUJVRygpOworCQlicmVhazsKKwljYXNlIFJETUFfQ01fRVZFTlRfQ09OTkVDVF9SRVNQT05TRToKKwkJQlVHKCk7CisJCWJyZWFrOworCWNhc2UgUkRNQV9DTV9FVkVOVF9DT05ORUNUX1JFUVVFU1Q6CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CisKK2ludCBpc2VyX2Nvbm5faW5pdChzdHJ1Y3QgaXNlcl9jb25uICoqaWJjb25uKQoreworCXN0cnVjdCBpc2VyX2Nvbm4gKmliX2Nvbm47CisKKwlpYl9jb25uID0ga3phbGxvYyhzaXplb2YgKmliX2Nvbm4sIEdGUF9LRVJORUwpOworCWlmICghaWJfY29ubikgeworCQlpc2VyX2VycigiY2FuJ3QgYWxsb2MgbWVtb3J5IGZvciBzdHJ1Y3QgaXNlcl9jb25uXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWliX2Nvbm4tPnN0YXRlID0gSVNFUl9DT05OX0lOSVQ7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmaWJfY29ubi0+d2FpdCk7CisJYXRvbWljX3NldCgmaWJfY29ubi0+cG9zdF9yZWN2X2J1Zl9jb3VudCwgMCk7CisJYXRvbWljX3NldCgmaWJfY29ubi0+cG9zdF9zZW5kX2J1Zl9jb3VudCwgMCk7CisJSU5JVF9XT1JLKCZpYl9jb25uLT5jb21wZXJyb3Jfd29yaywgaXNlcl9jb21wX2Vycm9yX3dvcmtlciwKKwkJICBpYl9jb25uKTsKKwlJTklUX0xJU1RfSEVBRCgmaWJfY29ubi0+Y29ubl9saXN0KTsKKwlzcGluX2xvY2tfaW5pdCgmaWJfY29ubi0+bG9jayk7CisKKwkqaWJjb25uID0gaWJfY29ubjsKKwlyZXR1cm4gMDsKK30KKworIC8qKgorICogc3RhcnRzIHRoZSBwcm9jZXNzIG9mIGNvbm5lY3RpbmcgdG8gdGhlIHRhcmdldAorICogc2xlZXBzIHVudGlsbCB0aGUgY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZCBvciByZWplY3RlZAorICovCitpbnQgaXNlcl9jb25uZWN0KHN0cnVjdCBpc2VyX2Nvbm4gICAqaWJfY29ubiwKKwkJIHN0cnVjdCBzb2NrYWRkcl9pbiAqc3JjX2FkZHIsCisJCSBzdHJ1Y3Qgc29ja2FkZHJfaW4gKmRzdF9hZGRyLAorCQkgaW50ICAgICAgICAgICAgICAgICBub25fYmxvY2tpbmcpCit7CisJc3RydWN0IHNvY2thZGRyICpzcmMsICpkc3Q7CisJaW50IGVyciA9IDA7CisKKwlzcHJpbnRmKGliX2Nvbm4tPm5hbWUsIiVkLiVkLiVkLiVkOiVkIiwKKwkJTklQUVVBRChkc3RfYWRkci0+c2luX2FkZHIuc19hZGRyKSwgZHN0X2FkZHItPnNpbl9wb3J0KTsKKworCS8qIHRoZSBkZXZpY2UgaXMga25vd24gb25seSAtLWFmdGVyLS0gYWRkcmVzcyByZXNvbHV0aW9uICovCisJaWJfY29ubi0+ZGV2aWNlID0gTlVMTDsKKworCWlzZXJfZXJyKCJjb25uZWN0aW5nIHRvOiAlZC4lZC4lZC4lZCwgcG9ydCAweCV4XG4iLAorCQkgTklQUVVBRChkc3RfYWRkci0+c2luX2FkZHIpLCBkc3RfYWRkci0+c2luX3BvcnQpOworCisJaWJfY29ubi0+c3RhdGUgPSBJU0VSX0NPTk5fUEVORElORzsKKworCWliX2Nvbm4tPmNtYV9pZCA9IHJkbWFfY3JlYXRlX2lkKGlzZXJfY21hX2hhbmRsZXIsCisJCQkJCSAgICAgKHZvaWQgKilpYl9jb25uLAorCQkJCQkgICAgIFJETUFfUFNfVENQKTsKKwlpZiAoSVNfRVJSKGliX2Nvbm4tPmNtYV9pZCkpIHsKKwkJZXJyID0gUFRSX0VSUihpYl9jb25uLT5jbWFfaWQpOworCQlpc2VyX2VycigicmRtYV9jcmVhdGVfaWQgZmFpbGVkOiAlZFxuIiwgZXJyKTsKKwkJZ290byBpZF9mYWlsdXJlOworCX0KKworCXNyYyA9IChzdHJ1Y3Qgc29ja2FkZHIgKilzcmNfYWRkcjsKKwlkc3QgPSAoc3RydWN0IHNvY2thZGRyICopZHN0X2FkZHI7CisJZXJyID0gcmRtYV9yZXNvbHZlX2FkZHIoaWJfY29ubi0+Y21hX2lkLCBzcmMsIGRzdCwgMTAwMCk7CisJaWYgKGVycikgeworCQlpc2VyX2VycigicmRtYV9yZXNvbHZlX2FkZHIgZmFpbGVkOiAlZFxuIiwgZXJyKTsKKwkJZ290byBhZGRyX2ZhaWx1cmU7CisJfQorCisJaWYgKCFub25fYmxvY2tpbmcpIHsKKwkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGliX2Nvbm4tPndhaXQsCisJCQkJCSAoaWJfY29ubi0+c3RhdGUgIT0gSVNFUl9DT05OX1BFTkRJTkcpKTsKKworCQlpZiAoaWJfY29ubi0+c3RhdGUgIT0gSVNFUl9DT05OX1VQKSB7CisJCQllcnIgPSAgLUVJTzsKKwkJCWdvdG8gY29ubmVjdF9mYWlsdXJlOworCQl9CisJfQorCisJbXV0ZXhfbG9jaygmaWcuY29ubmxpc3RfbXV0ZXgpOworCWxpc3RfYWRkKCZpYl9jb25uLT5jb25uX2xpc3QsICZpZy5jb25ubGlzdCk7CisJbXV0ZXhfdW5sb2NrKCZpZy5jb25ubGlzdF9tdXRleCk7CisJcmV0dXJuIDA7CisKK2lkX2ZhaWx1cmU6CisJaWJfY29ubi0+Y21hX2lkID0gTlVMTDsKK2FkZHJfZmFpbHVyZToKKwlpYl9jb25uLT5zdGF0ZSA9IElTRVJfQ09OTl9ET1dOOworY29ubmVjdF9mYWlsdXJlOgorCWlzZXJfY29ubl9yZWxlYXNlKGliX2Nvbm4pOworCXJldHVybiBlcnI7Cit9CisKKy8qKgorICogRnJlZXMgYWxsIGNvbm4gb2JqZWN0cyBhbmQgZGVhbGxvY3MgY29ubiBkZXNjcmlwdG9yCisgKi8KK3ZvaWQgaXNlcl9jb25uX3JlbGVhc2Uoc3RydWN0IGlzZXJfY29ubiAqaWJfY29ubikKK3sKKwlzdHJ1Y3QgaXNlcl9kZXZpY2UgICpkZXZpY2UgPSBpYl9jb25uLT5kZXZpY2U7CisKKwlCVUdfT04oaWJfY29ubi0+c3RhdGUgIT0gSVNFUl9DT05OX0RPV04pOworCisJbXV0ZXhfbG9jaygmaWcuY29ubmxpc3RfbXV0ZXgpOworCWxpc3RfZGVsKCZpYl9jb25uLT5jb25uX2xpc3QpOworCW11dGV4X3VubG9jaygmaWcuY29ubmxpc3RfbXV0ZXgpOworCisJaXNlcl9mcmVlX2liX2Nvbm5fcmVzKGliX2Nvbm4pOworCWliX2Nvbm4tPmRldmljZSA9IE5VTEw7CisJLyogb24gRVZFTlRfQUREUl9FUlJPUiB0aGVyZSdzIG5vIGRldmljZSB5ZXQgZm9yIHRoaXMgY29ubiAqLworCWlmIChkZXZpY2UgIT0gTlVMTCkKKwkJaXNlcl9kZXZpY2VfdHJ5X3JlbGVhc2UoZGV2aWNlKTsKKwlrZnJlZShpYl9jb25uKTsKK30KKworCisvKioKKyAqIGlzZXJfcmVnX3BhZ2VfdmVjIC0gUmVnaXN0ZXIgcGh5c2ljYWwgbWVtb3J5CisgKgorICogcmV0dXJuczogMCBvbiBzdWNjZXNzLCBlcnJubyBjb2RlIG9uIGZhaWx1cmUKKyAqLworaW50IGlzZXJfcmVnX3BhZ2VfdmVjKHN0cnVjdCBpc2VyX2Nvbm4gICAgICppYl9jb25uLAorCQkgICAgICBzdHJ1Y3QgaXNlcl9wYWdlX3ZlYyAqcGFnZV92ZWMsCisJCSAgICAgIHN0cnVjdCBpc2VyX21lbV9yZWcgICptZW1fcmVnKQoreworCXN0cnVjdCBpYl9wb29sX2ZtciAqbWVtOworCXU2NAkJICAgaW9fYWRkcjsKKwl1NjQJCSAgICpwYWdlX2xpc3Q7CisJaW50CQkgICBzdGF0dXM7CisKKwlwYWdlX2xpc3QgPSBwYWdlX3ZlYy0+cGFnZXM7CisJaW9fYWRkcgkgID0gcGFnZV9saXN0WzBdOworCisJbWVtICA9IGliX2Ztcl9wb29sX21hcF9waHlzKGliX2Nvbm4tPmZtcl9wb29sLAorCQkJCSAgICBwYWdlX2xpc3QsCisJCQkJICAgIHBhZ2VfdmVjLT5sZW5ndGgsCisJCQkJICAgICZpb19hZGRyKTsKKworCWlmIChJU19FUlIobWVtKSkgeworCQlzdGF0dXMgPSAoaW50KVBUUl9FUlIobWVtKTsKKwkJaXNlcl9lcnIoImliX2Ztcl9wb29sX21hcF9waHlzIGZhaWxlZDogJWRcbiIsIHN0YXR1cyk7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJbWVtX3JlZy0+bGtleSAgPSBtZW0tPmZtci0+bGtleTsKKwltZW1fcmVnLT5ya2V5ICA9IG1lbS0+Zm1yLT5ya2V5OworCW1lbV9yZWctPmxlbiAgID0gcGFnZV92ZWMtPmxlbmd0aCAqIFBBR0VfU0laRTsKKwltZW1fcmVnLT52YSAgICA9IGlvX2FkZHI7CisJbWVtX3JlZy0+bWVtX2ggPSAodm9pZCAqKW1lbTsKKworCW1lbV9yZWctPnZhICAgKz0gcGFnZV92ZWMtPm9mZnNldDsKKwltZW1fcmVnLT5sZW4gICA9IHBhZ2VfdmVjLT5kYXRhX3NpemU7CisKKwlpc2VyX2RiZygiUEhZU0lDQUwgTWVtLnJlZ2lzdGVyLCBbUEhZUyBwX2FycmF5OiAweCVwLCBzejogJWQsICIKKwkJICJlbnRyeVswXTogKDB4JTA4bHgsJWxkKV0gLT4gIgorCQkgIltsa2V5OiAweCUwOFggbWVtX2g6IDB4JXAgdmE6IDB4JTA4bFggc3o6ICVsZF1cbiIsCisJCSBwYWdlX3ZlYywgcGFnZV92ZWMtPmxlbmd0aCwKKwkJICh1bnNpZ25lZCBsb25nKXBhZ2VfdmVjLT5wYWdlc1swXSwKKwkJICh1bnNpZ25lZCBsb25nKXBhZ2VfdmVjLT5kYXRhX3NpemUsCisJCSAodW5zaWduZWQgaW50KW1lbV9yZWctPmxrZXksIG1lbV9yZWctPm1lbV9oLAorCQkgKHVuc2lnbmVkIGxvbmcpbWVtX3JlZy0+dmEsICh1bnNpZ25lZCBsb25nKW1lbV9yZWctPmxlbik7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogVW5yZWdpc3RlciAocHJldmlvc3VseSByZWdpc3RlcmVkKSBtZW1vcnkuCisgKi8KK3ZvaWQgaXNlcl91bnJlZ19tZW0oc3RydWN0IGlzZXJfbWVtX3JlZyAqcmVnKQoreworCWludCByZXQ7CisKKwlpc2VyX2RiZygiUEhZU0lDQUwgTWVtLlVucmVnaXN0ZXIgbWVtX2ggJXBcbiIscmVnLT5tZW1faCk7CisKKwlyZXQgPSBpYl9mbXJfcG9vbF91bm1hcCgoc3RydWN0IGliX3Bvb2xfZm1yICopcmVnLT5tZW1faCk7CisJaWYgKHJldCkKKwkJaXNlcl9lcnIoImliX2Ztcl9wb29sX3VubWFwIGZhaWxlZCAlZFxuIiwgcmV0KTsKKworCXJlZy0+bWVtX2ggPSBOVUxMOworfQorCisvKioKKyAqIGlzZXJfZHRvX3RvX2lvdiAtIGJ1aWxkcyBJT1YgZnJvbSBhIGR0byBkZXNjcmlwdG9yCisgKi8KK3N0YXRpYyB2b2lkIGlzZXJfZHRvX3RvX2lvdihzdHJ1Y3QgaXNlcl9kdG8gKmR0bywgc3RydWN0IGliX3NnZSAqaW92LCBpbnQgaW92X2xlbikKK3sKKwlpbnQJCSAgICAgaTsKKwlzdHJ1Y3QgaWJfc2dlCSAgICAgKnNnZTsKKwlzdHJ1Y3QgaXNlcl9yZWdkX2J1ZiAqcmVnZF9idWY7CisKKwlpZiAoZHRvLT5yZWdkX3ZlY3Rvcl9sZW4gPiBpb3ZfbGVuKSB7CisJCWlzZXJfZXJyKCJpb3Ygc2l6ZSAlZCB0b28gc21hbGwgZm9yIHBvc3RpbmcgZHRvIG9mIGxlbiAlZFxuIiwKKwkJCSBpb3ZfbGVuLCBkdG8tPnJlZ2RfdmVjdG9yX2xlbik7CisJCUJVRygpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBkdG8tPnJlZ2RfdmVjdG9yX2xlbjsgaSsrKSB7CisJCXNnZQkgICAgPSAmaW92W2ldOworCQlyZWdkX2J1ZiAgPSBkdG8tPnJlZ2RbaV07CisKKwkJc2dlLT5hZGRyICAgPSByZWdkX2J1Zi0+cmVnLnZhOworCQlzZ2UtPmxlbmd0aCA9IHJlZ2RfYnVmLT5yZWcubGVuOworCQlzZ2UtPmxrZXkgICA9IHJlZ2RfYnVmLT5yZWcubGtleTsKKworCQlpZiAoZHRvLT51c2VkX3N6W2ldID4gMCkgIC8qIEFkanVzdCBzaXplICovCisJCQlzZ2UtPmxlbmd0aCA9IGR0by0+dXNlZF9zeltpXTsKKworCQkvKiBvZmZzZXQgYW5kIGxlbmd0aCBzaG91bGQgbm90IGV4Y2VlZCB0aGUgcmVnZCBidWYgbGVuZ3RoICovCisJCWlmIChzZ2UtPmxlbmd0aCArIGR0by0+b2Zmc2V0W2ldID4gcmVnZF9idWYtPnJlZy5sZW4pIHsKKwkJCWlzZXJfZXJyKCJVc2VkIGxlbjolbGQgKyBvZmZzZXQ6JWQsIGV4Y2VlZCByZWcuYnVmLmxlbjoiCisJCQkJICIlbGQgaW4gZHRvOjB4JXAgWyVkXSwgdmE6MHglMDhsWFxuIiwKKwkJCQkgKHVuc2lnbmVkIGxvbmcpc2dlLT5sZW5ndGgsIGR0by0+b2Zmc2V0W2ldLAorCQkJCSAodW5zaWduZWQgbG9uZylyZWdkX2J1Zi0+cmVnLmxlbiwgZHRvLCBpLAorCQkJCSAodW5zaWduZWQgbG9uZylzZ2UtPmFkZHIpOworCQkJQlVHKCk7CisJCX0KKworCQlzZ2UtPmFkZHIgKz0gZHRvLT5vZmZzZXRbaV07IC8qIEFkanVzdCBvZmZzZXQgKi8KKwl9Cit9CisKKy8qKgorICogaXNlcl9wb3N0X3JlY3YgLSBQb3N0cyBhIHJlY2VpdmUgYnVmZmVyLgorICoKKyAqIHJldHVybnMgMCBvbiBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlCisgKi8KK2ludCBpc2VyX3Bvc3RfcmVjdihzdHJ1Y3QgaXNlcl9kZXNjICpyeF9kZXNjKQoreworCWludAkJICBpYl9yZXQsIHJldF92YWwgPSAwOworCXN0cnVjdCBpYl9yZWN2X3dyIHJlY3Zfd3IsICpyZWN2X3dyX2ZhaWxlZDsKKwlzdHJ1Y3QgaWJfc2dlCSAgaW92WzJdOworCXN0cnVjdCBpc2VyX2Nvbm4gICppYl9jb25uOworCXN0cnVjdCBpc2VyX2R0byAgICpyZWN2X2R0byA9ICZyeF9kZXNjLT5kdG87CisKKwkvKiBSZXRyaWV2ZSBjb25uICovCisJaWJfY29ubiA9IHJlY3ZfZHRvLT5jb25uLT5pYl9jb25uOworCisJaXNlcl9kdG9fdG9faW92KHJlY3ZfZHRvLCBpb3YsIDIpOworCisJcmVjdl93ci5uZXh0CT0gTlVMTDsKKwlyZWN2X3dyLnNnX2xpc3QgPSBpb3Y7CisJcmVjdl93ci5udW1fc2dlID0gcmVjdl9kdG8tPnJlZ2RfdmVjdG9yX2xlbjsKKwlyZWN2X3dyLndyX2lkCT0gKHVuc2lnbmVkIGxvbmcpcnhfZGVzYzsKKworCWF0b21pY19pbmMoJmliX2Nvbm4tPnBvc3RfcmVjdl9idWZfY291bnQpOworCWliX3JldAk9IGliX3Bvc3RfcmVjdihpYl9jb25uLT5xcCwgJnJlY3Zfd3IsICZyZWN2X3dyX2ZhaWxlZCk7CisJaWYgKGliX3JldCkgeworCQlpc2VyX2VycigiaWJfcG9zdF9yZWN2IGZhaWxlZCByZXQ9JWRcbiIsIGliX3JldCk7CisJCWF0b21pY19kZWMoJmliX2Nvbm4tPnBvc3RfcmVjdl9idWZfY291bnQpOworCQlyZXRfdmFsID0gLTE7CisJfQorCisJcmV0dXJuIHJldF92YWw7Cit9CisKKy8qKgorICogaXNlcl9zdGFydF9zZW5kIC0gSW5pdGlhdGUgYSBTZW5kIERUTyBvcGVyYXRpb24KKyAqCisgKiByZXR1cm5zIDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZQorICovCitpbnQgaXNlcl9wb3N0X3NlbmQoc3RydWN0IGlzZXJfZGVzYyAqdHhfZGVzYykKK3sKKwlpbnQJCSAgaWJfcmV0LCByZXRfdmFsID0gMDsKKwlzdHJ1Y3QgaWJfc2VuZF93ciBzZW5kX3dyLCAqc2VuZF93cl9mYWlsZWQ7CisJc3RydWN0IGliX3NnZQkgIGlvdltNQVhfUkVHRF9CVUZfVkVDVE9SX0xFTl07CisJc3RydWN0IGlzZXJfY29ubiAgKmliX2Nvbm47CisJc3RydWN0IGlzZXJfZHRvICAgKmR0byA9ICZ0eF9kZXNjLT5kdG87CisKKwlpYl9jb25uID0gZHRvLT5jb25uLT5pYl9jb25uOworCisJaXNlcl9kdG9fdG9faW92KGR0bywgaW92LCBNQVhfUkVHRF9CVUZfVkVDVE9SX0xFTik7CisKKwlzZW5kX3dyLm5leHQJICAgPSBOVUxMOworCXNlbmRfd3Iud3JfaWQJICAgPSAodW5zaWduZWQgbG9uZyl0eF9kZXNjOworCXNlbmRfd3Iuc2dfbGlzdAkgICA9IGlvdjsKKwlzZW5kX3dyLm51bV9zZ2UJICAgPSBkdG8tPnJlZ2RfdmVjdG9yX2xlbjsKKwlzZW5kX3dyLm9wY29kZQkgICA9IElCX1dSX1NFTkQ7CisJc2VuZF93ci5zZW5kX2ZsYWdzID0gZHRvLT5ub3RpZnlfZW5hYmxlID8gSUJfU0VORF9TSUdOQUxFRCA6IDA7CisKKwlhdG9taWNfaW5jKCZpYl9jb25uLT5wb3N0X3NlbmRfYnVmX2NvdW50KTsKKworCWliX3JldCA9IGliX3Bvc3Rfc2VuZChpYl9jb25uLT5xcCwgJnNlbmRfd3IsICZzZW5kX3dyX2ZhaWxlZCk7CisJaWYgKGliX3JldCkgeworCQlpc2VyX2VycigiRmFpbGVkIHRvIHN0YXJ0IFNFTkQgRFRPLCBkdG86IDB4JXAsIElPViBsZW46ICVkXG4iLAorCQkJIGR0bywgZHRvLT5yZWdkX3ZlY3Rvcl9sZW4pOworCQlpc2VyX2VycigiaWJfcG9zdF9zZW5kIGZhaWxlZCwgcmV0OiVkXG4iLCBpYl9yZXQpOworCQlhdG9taWNfZGVjKCZpYl9jb25uLT5wb3N0X3NlbmRfYnVmX2NvdW50KTsKKwkJcmV0X3ZhbCA9IC0xOworCX0KKworCXJldHVybiByZXRfdmFsOworfQorCitzdGF0aWMgdm9pZCBpc2VyX2NvbXBfZXJyb3Jfd29ya2VyKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGlzZXJfY29ubiAqaWJfY29ubiA9IGRhdGE7CisKKwkvKiBnZXR0aW5nIGhlcmUgd2hlbiB0aGUgc3RhdGUgaXMgVVAgbWVhbnMgdGhhdCB0aGUgY29ubiBpcyBiZWluZyAqCisJICogdGVybWluYXRlZCBhc3luY2hyb25vdXNseSBmcm9tIHRoZSBpU0NTSSBsYXllcidzIHBlcnNwZWN0aXZlLiAgKi8KKwlpZiAoaXNlcl9jb25uX3N0YXRlX2NvbXBfZXhjaChpYl9jb25uLCBJU0VSX0NPTk5fVVAsCisJCQkJICAgICAgSVNFUl9DT05OX1RFUk1JTkFUSU5HKSkKKwkJaXNjc2lfY29ubl9mYWlsdXJlKGliX2Nvbm4tPmlzZXJfY29ubi0+aXNjc2lfY29ubiwKKwkJCQkJSVNDU0lfRVJSX0NPTk5fRkFJTEVEKTsKKworCS8qIGNvbXBsZXRlIHRoZSB0ZXJtaW5hdGlvbiBwcm9jZXNzIGlmIGRpc2Nvbm5lY3QgZXZlbnQgd2FzIGRlbGl2ZXJlZCAqCisJICogbm90ZSB0aGVyZSBhcmUgbm8gbW9yZSBub24gY29tcGxldGVkIHBvc3RzIHRvIHRoZSBRUCAgICAgICAgICAgICAgICovCisJaWYgKGliX2Nvbm4tPmRpc2NfZXZ0X2ZsYWcpIHsKKwkJaWJfY29ubi0+c3RhdGUgPSBJU0VSX0NPTk5fRE9XTjsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpYl9jb25uLT53YWl0KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGlzZXJfaGFuZGxlX2NvbXBfZXJyb3Ioc3RydWN0IGlzZXJfZGVzYyAqZGVzYykKK3sKKwlzdHJ1Y3QgaXNlcl9kdG8gICpkdG8gICAgID0gJmRlc2MtPmR0bzsKKwlzdHJ1Y3QgaXNlcl9jb25uICppYl9jb25uID0gZHRvLT5jb25uLT5pYl9jb25uOworCisJaXNlcl9kdG9fYnVmZnNfcmVsZWFzZShkdG8pOworCisJaWYgKGRlc2MtPnR5cGUgPT0gSVNDU0lfUlgpIHsKKwkJa2ZyZWUoZGVzYy0+ZGF0YSk7CisJCWttZW1fY2FjaGVfZnJlZShpZy5kZXNjX2NhY2hlLCBkZXNjKTsKKwkJYXRvbWljX2RlYygmaWJfY29ubi0+cG9zdF9yZWN2X2J1Zl9jb3VudCk7CisJfSBlbHNlIHsgLyogdHlwZSBpcyBUWCBjb250cm9sL2NvbW1hbmQvZGF0YW91dCAqLworCQlpZiAoZGVzYy0+dHlwZSA9PSBJU0NTSV9UWF9EQVRBT1VUKQorCQkJa21lbV9jYWNoZV9mcmVlKGlnLmRlc2NfY2FjaGUsIGRlc2MpOworCQlhdG9taWNfZGVjKCZpYl9jb25uLT5wb3N0X3NlbmRfYnVmX2NvdW50KTsKKwl9CisKKwlpZiAoYXRvbWljX3JlYWQoJmliX2Nvbm4tPnBvc3RfcmVjdl9idWZfY291bnQpID09IDAgJiYKKwkgICAgYXRvbWljX3JlYWQoJmliX2Nvbm4tPnBvc3Rfc2VuZF9idWZfY291bnQpID09IDApCisJCXNjaGVkdWxlX3dvcmsoJmliX2Nvbm4tPmNvbXBlcnJvcl93b3JrKTsKK30KKworc3RhdGljIHZvaWQgaXNlcl9jcV90YXNrbGV0X2ZuKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwkgc3RydWN0IGlzZXJfZGV2aWNlICAqZGV2aWNlID0gKHN0cnVjdCBpc2VyX2RldmljZSAqKWRhdGE7CisJIHN0cnVjdCBpYl9jcQkgICAgICpjcSA9IGRldmljZS0+Y3E7CisJIHN0cnVjdCBpYl93YwkgICAgIHdjOworCSBzdHJ1Y3QgaXNlcl9kZXNjICAgICpkZXNjOworCSB1bnNpZ25lZCBsb25nCSAgICAgeGZlcl9sZW47CisKKwl3aGlsZSAoaWJfcG9sbF9jcShjcSwgMSwgJndjKSA9PSAxKSB7CisJCWRlc2MJID0gKHN0cnVjdCBpc2VyX2Rlc2MgKikgKHVuc2lnbmVkIGxvbmcpIHdjLndyX2lkOworCQlCVUdfT04oZGVzYyA9PSBOVUxMKTsKKworCQlpZiAod2Muc3RhdHVzID09IElCX1dDX1NVQ0NFU1MpIHsKKwkJCWlmIChkZXNjLT50eXBlID09IElTQ1NJX1JYKSB7CisJCQkJeGZlcl9sZW4gPSAodW5zaWduZWQgbG9uZyl3Yy5ieXRlX2xlbjsKKwkJCQlpc2VyX3Jjdl9jb21wbGV0aW9uKGRlc2MsIHhmZXJfbGVuKTsKKwkJCX0gZWxzZSAvKiB0eXBlID09IElTQ1NJX1RYX0NPTlRST0wvU0NTSV9DTUQvRE9VVCAqLworCQkJCWlzZXJfc25kX2NvbXBsZXRpb24oZGVzYyk7CisJCX0gZWxzZSB7CisJCQlpc2VyX2VycigiY29tcCB3LiBlcnJvciBvcCAlZCBzdGF0dXMgJWRcbiIsZGVzYy0+dHlwZSx3Yy5zdGF0dXMpOworCQkJaXNlcl9oYW5kbGVfY29tcF9lcnJvcihkZXNjKTsKKwkJfQorCX0KKwkvKiAjd2FybmluZyAiaXQgaXMgYXNzdW1lZCBoZXJlIHRoYXQgYXJtaW5nIENRIG9ubHkgb25jZSBpdHMgZW1wdHkiICoKKwkgKiAiIHdvdWxkIG5vdCBjYXVzZSBpbnRlcnJ1cHRzIHRvIGJlIG1pc3NlZCIgICAgICAgICAgICAgICAgICAgICAgICovCisJaWJfcmVxX25vdGlmeV9jcShjcSwgSUJfQ1FfTkVYVF9DT01QKTsKK30KKworc3RhdGljIHZvaWQgaXNlcl9jcV9jYWxsYmFjayhzdHJ1Y3QgaWJfY3EgKmNxLCB2b2lkICpjcV9jb250ZXh0KQoreworCXN0cnVjdCBpc2VyX2RldmljZSAgKmRldmljZSA9IChzdHJ1Y3QgaXNlcl9kZXZpY2UgKiljcV9jb250ZXh0OworCisJdGFza2xldF9zY2hlZHVsZSgmZGV2aWNlLT5jcV90YXNrbGV0KTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvZXZkZXYuYyBiL2RyaXZlcnMvaW5wdXQvZXZkZXYuYwppbmRleCA1ZjU2MWZjLi5hMjlkNWNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2V2ZGV2LmMKKysrIGIvZHJpdmVycy9pbnB1dC9ldmRldi5jCkBAIC03OCwxNCArNzgsMTkgQEAKIHsKIAlpbnQgcmV0dmFsOwogCXN0cnVjdCBldmRldl9saXN0ICpsaXN0ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCiAJcmV0dmFsID0gZmFzeW5jX2hlbHBlcihmZCwgZmlsZSwgb24sICZsaXN0LT5mYXN5bmMpOworCiAJcmV0dXJuIHJldHZhbCA8IDAgPyByZXR2YWwgOiAwOwogfQogCi1zdGF0aWMgaW50IGV2ZGV2X2ZsdXNoKHN0cnVjdCBmaWxlICogZmlsZSwgZmxfb3duZXJfdCBpZCkKK3N0YXRpYyBpbnQgZXZkZXZfZmx1c2goc3RydWN0IGZpbGUgKmZpbGUsIGZsX293bmVyX3QgaWQpCiB7CiAJc3RydWN0IGV2ZGV2X2xpc3QgKmxpc3QgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaWYgKCFsaXN0LT5ldmRldi0+ZXhpc3QpIHJldHVybiAtRU5PREVWOworCisJaWYgKCFsaXN0LT5ldmRldi0+ZXhpc3QpCisJCXJldHVybiAtRU5PREVWOworCiAJcmV0dXJuIGlucHV0X2ZsdXNoX2RldmljZSgmbGlzdC0+ZXZkZXYtPmhhbmRsZSwgZmlsZSk7CiB9CiAKQEAgLTMwMCw2ICszMDUsNyBAQAogc3RhdGljIHVuc2lnbmVkIGludCBldmRldl9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KQogewogCXN0cnVjdCBldmRldl9saXN0ICpsaXN0ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCiAJcG9sbF93YWl0KGZpbGUsICZsaXN0LT5ldmRldi0+d2FpdCwgd2FpdCk7CiAJcmV0dXJuICgobGlzdC0+aGVhZCA9PSBsaXN0LT50YWlsKSA/IDAgOiAoUE9MTElOIHwgUE9MTFJETk9STSkpIHwKIAkJKGxpc3QtPmV2ZGV2LT5leGlzdCA/IDAgOiAoUE9MTEhVUCB8IFBPTExFUlIpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvaW5wdXQuYyBiL2RyaXZlcnMvaW5wdXQvaW5wdXQuYwppbmRleCAzMDM4YzI2Li5kZTJlNzU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2lucHV0LmMKKysrIGIvZHJpdmVycy9pbnB1dC9pbnB1dC5jCkBAIC0yOCwyMCArMjgsNiBAQAogTU9EVUxFX0RFU0NSSVBUSU9OKCJJbnB1dCBjb3JlIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKLUVYUE9SVF9TWU1CT0woaW5wdXRfYWxsb2NhdGVfZGV2aWNlKTsKLUVYUE9SVF9TWU1CT0woaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKTsKLUVYUE9SVF9TWU1CT0woaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UpOwotRVhQT1JUX1NZTUJPTChpbnB1dF9yZWdpc3Rlcl9oYW5kbGVyKTsKLUVYUE9SVF9TWU1CT0woaW5wdXRfdW5yZWdpc3Rlcl9oYW5kbGVyKTsKLUVYUE9SVF9TWU1CT0woaW5wdXRfZ3JhYl9kZXZpY2UpOwotRVhQT1JUX1NZTUJPTChpbnB1dF9yZWxlYXNlX2RldmljZSk7Ci1FWFBPUlRfU1lNQk9MKGlucHV0X29wZW5fZGV2aWNlKTsKLUVYUE9SVF9TWU1CT0woaW5wdXRfY2xvc2VfZGV2aWNlKTsKLUVYUE9SVF9TWU1CT0woaW5wdXRfYWNjZXB0X3Byb2Nlc3MpOwotRVhQT1JUX1NZTUJPTChpbnB1dF9mbHVzaF9kZXZpY2UpOwotRVhQT1JUX1NZTUJPTChpbnB1dF9ldmVudCk7Ci1FWFBPUlRfU1lNQk9MX0dQTChpbnB1dF9jbGFzcyk7Ci0KICNkZWZpbmUgSU5QVVRfREVWSUNFUwkyNTYKIAogc3RhdGljIExJU1RfSEVBRChpbnB1dF9kZXZfbGlzdCk7CkBAIC02MywxMSArNDksMTMgQEAKIAkJY2FzZSBFVl9TWU46CiAJCQlzd2l0Y2ggKGNvZGUpIHsKIAkJCQljYXNlIFNZTl9DT05GSUc6Ci0JCQkJCWlmIChkZXYtPmV2ZW50KSBkZXYtPmV2ZW50KGRldiwgdHlwZSwgY29kZSwgdmFsdWUpOworCQkJCQlpZiAoZGV2LT5ldmVudCkKKwkJCQkJCWRldi0+ZXZlbnQoZGV2LCB0eXBlLCBjb2RlLCB2YWx1ZSk7CiAJCQkJCWJyZWFrOwogCiAJCQkJY2FzZSBTWU5fUkVQT1JUOgotCQkJCQlpZiAoZGV2LT5zeW5jKSByZXR1cm47CisJCQkJCWlmIChkZXYtPnN5bmMpCisJCQkJCQlyZXR1cm47CiAJCQkJCWRldi0+c3luYyA9IDE7CiAJCQkJCWJyZWFrOwogCQkJfQpAQCAtMTM2LDcgKzEyNCw4IEBACiAJCQlpZiAoY29kZSA+IE1TQ19NQVggfHwgIXRlc3RfYml0KGNvZGUsIGRldi0+bXNjYml0KSkKIAkJCQlyZXR1cm47CiAKLQkJCWlmIChkZXYtPmV2ZW50KSBkZXYtPmV2ZW50KGRldiwgdHlwZSwgY29kZSwgdmFsdWUpOworCQkJaWYgKGRldi0+ZXZlbnQpCisJCQkJZGV2LT5ldmVudChkZXYsIHR5cGUsIGNvZGUsIHZhbHVlKTsKIAogCQkJYnJlYWs7CiAKQEAgLTE0Niw3ICsxMzUsOSBAQAogCQkJCXJldHVybjsKIAogCQkJY2hhbmdlX2JpdChjb2RlLCBkZXYtPmxlZCk7Ci0JCQlpZiAoZGV2LT5ldmVudCkgZGV2LT5ldmVudChkZXYsIHR5cGUsIGNvZGUsIHZhbHVlKTsKKworCQkJaWYgKGRldi0+ZXZlbnQpCisJCQkJZGV2LT5ldmVudChkZXYsIHR5cGUsIGNvZGUsIHZhbHVlKTsKIAogCQkJYnJlYWs7CiAKQEAgLTE1OCwyMSArMTQ5LDI1IEBACiAJCQlpZiAoISF0ZXN0X2JpdChjb2RlLCBkZXYtPnNuZCkgIT0gISF2YWx1ZSkKIAkJCQljaGFuZ2VfYml0KGNvZGUsIGRldi0+c25kKTsKIAotCQkJaWYgKGRldi0+ZXZlbnQpIGRldi0+ZXZlbnQoZGV2LCB0eXBlLCBjb2RlLCB2YWx1ZSk7CisJCQlpZiAoZGV2LT5ldmVudCkKKwkJCQlkZXYtPmV2ZW50KGRldiwgdHlwZSwgY29kZSwgdmFsdWUpOwogCiAJCQlicmVhazsKIAogCQljYXNlIEVWX1JFUDoKIAotCQkJaWYgKGNvZGUgPiBSRVBfTUFYIHx8IHZhbHVlIDwgMCB8fCBkZXYtPnJlcFtjb2RlXSA9PSB2YWx1ZSkgcmV0dXJuOworCQkJaWYgKGNvZGUgPiBSRVBfTUFYIHx8IHZhbHVlIDwgMCB8fCBkZXYtPnJlcFtjb2RlXSA9PSB2YWx1ZSkKKwkJCQlyZXR1cm47CiAKIAkJCWRldi0+cmVwW2NvZGVdID0gdmFsdWU7Ci0JCQlpZiAoZGV2LT5ldmVudCkgZGV2LT5ldmVudChkZXYsIHR5cGUsIGNvZGUsIHZhbHVlKTsKKwkJCWlmIChkZXYtPmV2ZW50KQorCQkJCWRldi0+ZXZlbnQoZGV2LCB0eXBlLCBjb2RlLCB2YWx1ZSk7CiAKIAkJCWJyZWFrOwogCiAJCWNhc2UgRVZfRkY6Ci0JCQlpZiAoZGV2LT5ldmVudCkgZGV2LT5ldmVudChkZXYsIHR5cGUsIGNvZGUsIHZhbHVlKTsKKwkJCWlmIChkZXYtPmV2ZW50KQorCQkJCWRldi0+ZXZlbnQoZGV2LCB0eXBlLCBjb2RlLCB2YWx1ZSk7CiAJCQlicmVhazsKIAl9CiAKQEAgLTE4Niw2ICsxODEsNyBAQAogCQkJaWYgKGhhbmRsZS0+b3BlbikKIAkJCQloYW5kbGUtPmhhbmRsZXItPmV2ZW50KGhhbmRsZSwgdHlwZSwgY29kZSwgdmFsdWUpOwogfQorRVhQT1JUX1NZTUJPTChpbnB1dF9ldmVudCk7CiAKIHN0YXRpYyB2b2lkIGlucHV0X3JlcGVhdF9rZXkodW5zaWduZWQgbG9uZyBkYXRhKQogewpAQCAtMjA4LDYgKzIwNCw3IEBACiAKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0woaW5wdXRfYWNjZXB0X3Byb2Nlc3MpOwogCiBpbnQgaW5wdXRfZ3JhYl9kZXZpY2Uoc3RydWN0IGlucHV0X2hhbmRsZSAqaGFuZGxlKQogewpAQCAtMjE3LDEyICsyMTQsMTQgQEAKIAloYW5kbGUtPmRldi0+Z3JhYiA9IGhhbmRsZTsKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0woaW5wdXRfZ3JhYl9kZXZpY2UpOwogCiB2b2lkIGlucHV0X3JlbGVhc2VfZGV2aWNlKHN0cnVjdCBpbnB1dF9oYW5kbGUgKmhhbmRsZSkKIHsKIAlpZiAoaGFuZGxlLT5kZXYtPmdyYWIgPT0gaGFuZGxlKQogCQloYW5kbGUtPmRldi0+Z3JhYiA9IE5VTEw7CiB9CitFWFBPUlRfU1lNQk9MKGlucHV0X3JlbGVhc2VfZGV2aWNlKTsKIAogaW50IGlucHV0X29wZW5fZGV2aWNlKHN0cnVjdCBpbnB1dF9oYW5kbGUgKmhhbmRsZSkKIHsKQEAgLTI0NSw2ICsyNDQsNyBAQAogCiAJcmV0dXJuIGVycjsKIH0KK0VYUE9SVF9TWU1CT0woaW5wdXRfb3Blbl9kZXZpY2UpOwogCiBpbnQgaW5wdXRfZmx1c2hfZGV2aWNlKHN0cnVjdCBpbnB1dF9oYW5kbGUqIGhhbmRsZSwgc3RydWN0IGZpbGUqIGZpbGUpCiB7CkBAIC0yNTMsNiArMjUzLDcgQEAKIAogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTChpbnB1dF9mbHVzaF9kZXZpY2UpOwogCiB2b2lkIGlucHV0X2Nsb3NlX2RldmljZShzdHJ1Y3QgaW5wdXRfaGFuZGxlICpoYW5kbGUpCiB7CkBAIC0yNjgsNiArMjY5LDcgQEAKIAogCW11dGV4X3VubG9jaygmZGV2LT5tdXRleCk7CiB9CitFWFBPUlRfU1lNQk9MKGlucHV0X2Nsb3NlX2RldmljZSk7CiAKIHN0YXRpYyB2b2lkIGlucHV0X2xpbmtfaGFuZGxlKHN0cnVjdCBpbnB1dF9oYW5kbGUgKmhhbmRsZSkKIHsKQEAgLTMzNSw5ICszMzcsMTEgQEAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgaW5wdXRfcHJvY19kZXZpY2VzX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpCiB7CiAJaW50IHN0YXRlID0gaW5wdXRfZGV2aWNlc19zdGF0ZTsKKwogCXBvbGxfd2FpdChmaWxlLCAmaW5wdXRfZGV2aWNlc19wb2xsX3dhaXQsIHdhaXQpOwogCWlmIChzdGF0ZSAhPSBpbnB1dF9kZXZpY2VzX3N0YXRlKQogCQlyZXR1cm4gUE9MTElOIHwgUE9MTFJETk9STTsKKwogCXJldHVybiAwOwogfQogCkBAIC02MjksNyArNjMzLDcgQEAKIAogCWxlbiA9IGlucHV0X3ByaW50X21vZGFsaWFzKGJ1ZiwgUEFHRV9TSVpFLCBpZCwgMSk7CiAKLQlyZXR1cm4gbWF4X3QoaW50LCBsZW4sIFBBR0VfU0laRSk7CisJcmV0dXJuIG1pbl90KGludCwgbGVuLCBQQUdFX1NJWkUpOwogfQogc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKG1vZGFsaWFzLCBTX0lSVUdPLCBpbnB1dF9kZXZfc2hvd19tb2RhbGlhcywgTlVMTCk7CiAKQEAgLTg2Miw2ICs4NjYsNyBAQAogCS5yZWxlYXNlCQk9IGlucHV0X2Rldl9yZWxlYXNlLAogCS51ZXZlbnQJCQk9IGlucHV0X2Rldl91ZXZlbnQsCiB9OworRVhQT1JUX1NZTUJPTF9HUEwoaW5wdXRfY2xhc3MpOwogCiBzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9hbGxvY2F0ZV9kZXZpY2Uodm9pZCkKIHsKQEAgLTg3MiwxMiArODc3LDI3IEBACiAJCWRldi0+ZHluYWxsb2MgPSAxOwogCQlkZXYtPmNkZXYuY2xhc3MgPSAmaW5wdXRfY2xhc3M7CiAJCWNsYXNzX2RldmljZV9pbml0aWFsaXplKCZkZXYtPmNkZXYpOworCQltdXRleF9pbml0KCZkZXYtPm11dGV4KTsKIAkJSU5JVF9MSVNUX0hFQUQoJmRldi0+aF9saXN0KTsKIAkJSU5JVF9MSVNUX0hFQUQoJmRldi0+bm9kZSk7CiAJfQogCiAJcmV0dXJuIGRldjsKIH0KK0VYUE9SVF9TWU1CT0woaW5wdXRfYWxsb2NhdGVfZGV2aWNlKTsKKwordm9pZCBpbnB1dF9mcmVlX2RldmljZShzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYpCit7CisJaWYgKGRldikgeworCisJCW11dGV4X2xvY2soJmRldi0+bXV0ZXgpOworCQlkZXYtPm5hbWUgPSBkZXYtPnBoeXMgPSBkZXYtPnVuaXEgPSBOVUxMOworCQltdXRleF91bmxvY2soJmRldi0+bXV0ZXgpOworCisJCWlucHV0X3B1dF9kZXZpY2UoZGV2KTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKGlucHV0X2ZyZWVfZGV2aWNlKTsKIAogaW50IGlucHV0X3JlZ2lzdGVyX2RldmljZShzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYpCiB7CkBAIC04OTUsNyArOTE1LDYgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JbXV0ZXhfaW5pdCgmZGV2LT5tdXRleCk7CiAJc2V0X2JpdChFVl9TWU4sIGRldi0+ZXZiaXQpOwogCiAJLyoKQEAgLTk1NiwxMiArOTc1LDE0IEBACiAgZmFpbDE6CWNsYXNzX2RldmljZV9kZWwoJmRldi0+Y2Rldik7CiAJcmV0dXJuIGVycm9yOwogfQorRVhQT1JUX1NZTUJPTChpbnB1dF9yZWdpc3Rlcl9kZXZpY2UpOwogCiB2b2lkIGlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKHN0cnVjdCBpbnB1dF9kZXYgKmRldikKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICogbm9kZSwgKiBuZXh0OworCXN0cnVjdCBsaXN0X2hlYWQgKm5vZGUsICpuZXh0OwogCi0JaWYgKCFkZXYpIHJldHVybjsKKwlpZiAoIWRldikKKwkJcmV0dXJuOwogCiAJZGVsX3RpbWVyX3N5bmMoJmRldi0+dGltZXIpOwogCkBAIC05NzksOCArMTAwMCwxMyBAQAogCXN5c2ZzX3JlbW92ZV9ncm91cCgmZGV2LT5jZGV2LmtvYmosICZpbnB1dF9kZXZfYXR0cl9ncm91cCk7CiAJY2xhc3NfZGV2aWNlX3VucmVnaXN0ZXIoJmRldi0+Y2Rldik7CiAKKwltdXRleF9sb2NrKCZkZXYtPm11dGV4KTsKKwlkZXYtPm5hbWUgPSBkZXYtPnBoeXMgPSBkZXYtPnVuaXEgPSBOVUxMOworCW11dGV4X3VubG9jaygmZGV2LT5tdXRleCk7CisKIAlpbnB1dF93YWtldXBfcHJvY2ZzX3JlYWRlcnMoKTsKIH0KK0VYUE9SVF9TWU1CT0woaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UpOwogCiB2b2lkIGlucHV0X3JlZ2lzdGVyX2hhbmRsZXIoc3RydWN0IGlucHV0X2hhbmRsZXIgKmhhbmRsZXIpCiB7CkBAIC05ODgsNyArMTAxNCw4IEBACiAJc3RydWN0IGlucHV0X2hhbmRsZSAqaGFuZGxlOwogCXN0cnVjdCBpbnB1dF9kZXZpY2VfaWQgKmlkOwogCi0JaWYgKCFoYW5kbGVyKSByZXR1cm47CisJaWYgKCFoYW5kbGVyKQorCQlyZXR1cm47CiAKIAlJTklUX0xJU1RfSEVBRCgmaGFuZGxlci0+aF9saXN0KTsKIApAQCAtMTAwNSwxMCArMTAzMiwxMSBAQAogCiAJaW5wdXRfd2FrZXVwX3Byb2Nmc19yZWFkZXJzKCk7CiB9CitFWFBPUlRfU1lNQk9MKGlucHV0X3JlZ2lzdGVyX2hhbmRsZXIpOwogCiB2b2lkIGlucHV0X3VucmVnaXN0ZXJfaGFuZGxlcihzdHJ1Y3QgaW5wdXRfaGFuZGxlciAqaGFuZGxlcikKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICogbm9kZSwgKiBuZXh0OworCXN0cnVjdCBsaXN0X2hlYWQgKm5vZGUsICpuZXh0OwogCiAJbGlzdF9mb3JfZWFjaF9zYWZlKG5vZGUsIG5leHQsICZoYW5kbGVyLT5oX2xpc3QpIHsKIAkJc3RydWN0IGlucHV0X2hhbmRsZSAqIGhhbmRsZSA9IHRvX2hhbmRsZV9oKG5vZGUpOwpAQCAtMTAyNCw2ICsxMDUyLDcgQEAKIAogCWlucHV0X3dha2V1cF9wcm9jZnNfcmVhZGVycygpOwogfQorRVhQT1JUX1NZTUJPTChpbnB1dF91bnJlZ2lzdGVyX2hhbmRsZXIpOwogCiBzdGF0aWMgaW50IGlucHV0X29wZW5fZmlsZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvam95ZGV2LmMgYi9kcml2ZXJzL2lucHV0L2pveWRldi5jCmluZGV4IDk0OWJkY2UuLmQ2NzE1NzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvam95ZGV2LmMKKysrIGIvZHJpdmVycy9pbnB1dC9qb3lkZXYuYwpAQCAtODEsMTAgKzgxLDcgQEAKIAkJCXJldHVybiAwOwogCX0KIAotCWlmICh2YWx1ZSA8IC0zMjc2NykgcmV0dXJuIC0zMjc2NzsKLQlpZiAodmFsdWUgPiAgMzI3NjcpIHJldHVybiAgMzI3Njc7Ci0KLQlyZXR1cm4gdmFsdWU7CisJcmV0dXJuIHZhbHVlIDwgLTMyNzY3ID8gLTMyNzY3IDogKHZhbHVlID4gMzI3NjcgPyAzMjc2NyA6IHZhbHVlKTsKIH0KIAogc3RhdGljIHZvaWQgam95ZGV2X2V2ZW50KHN0cnVjdCBpbnB1dF9oYW5kbGUgKmhhbmRsZSwgdW5zaWduZWQgaW50IHR5cGUsIHVuc2lnbmVkIGludCBjb2RlLCBpbnQgdmFsdWUpCkBAIC05Niw3ICs5Myw4IEBACiAJc3dpdGNoICh0eXBlKSB7CiAKIAkJY2FzZSBFVl9LRVk6Ci0JCQlpZiAoY29kZSA8IEJUTl9NSVNDIHx8IHZhbHVlID09IDIpIHJldHVybjsKKwkJCWlmIChjb2RlIDwgQlROX01JU0MgfHwgdmFsdWUgPT0gMikKKwkJCQlyZXR1cm47CiAJCQlldmVudC50eXBlID0gSlNfRVZFTlRfQlVUVE9OOwogCQkJZXZlbnQubnVtYmVyID0gam95ZGV2LT5rZXltYXBbY29kZSAtIEJUTl9NSVNDXTsKIAkJCWV2ZW50LnZhbHVlID0gdmFsdWU7CkBAIC0xMDYsNyArMTA0LDggQEAKIAkJCWV2ZW50LnR5cGUgPSBKU19FVkVOVF9BWElTOwogCQkJZXZlbnQubnVtYmVyID0gam95ZGV2LT5hYnNtYXBbY29kZV07CiAJCQlldmVudC52YWx1ZSA9IGpveWRldl9jb3JyZWN0KHZhbHVlLCBqb3lkZXYtPmNvcnIgKyBldmVudC5udW1iZXIpOwotCQkJaWYgKGV2ZW50LnZhbHVlID09IGpveWRldi0+YWJzW2V2ZW50Lm51bWJlcl0pIHJldHVybjsKKwkJCWlmIChldmVudC52YWx1ZSA9PSBqb3lkZXYtPmFic1tldmVudC5udW1iZXJdKQorCQkJCXJldHVybjsKIAkJCWpveWRldi0+YWJzW2V2ZW50Lm51bWJlcl0gPSBldmVudC52YWx1ZTsKIAkJCWJyZWFrOwogCkBAIC0xMzQsNyArMTMzLDkgQEAKIHsKIAlpbnQgcmV0dmFsOwogCXN0cnVjdCBqb3lkZXZfbGlzdCAqbGlzdCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwogCXJldHZhbCA9IGZhc3luY19oZWxwZXIoZmQsIGZpbGUsIG9uLCAmbGlzdC0+ZmFzeW5jKTsKKwogCXJldHVybiByZXR2YWwgPCAwID8gcmV0dmFsIDogMDsKIH0KIApAQCAtMjIyLDEyICsyMjMsMTIgQEAKIAkJcmV0dXJuIHNpemVvZihzdHJ1Y3QgSlNfREFUQV9UWVBFKTsKIAl9CiAKLQlpZiAobGlzdC0+c3RhcnR1cCA9PSBqb3lkZXYtPm5hYnMgKyBqb3lkZXYtPm5rZXkKLQkJJiYgbGlzdC0+aGVhZCA9PSBsaXN0LT50YWlsICYmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykpCi0JCQlyZXR1cm4gLUVBR0FJTjsKKwlpZiAobGlzdC0+c3RhcnR1cCA9PSBqb3lkZXYtPm5hYnMgKyBqb3lkZXYtPm5rZXkgJiYKKwkgICAgbGlzdC0+aGVhZCA9PSBsaXN0LT50YWlsICYmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykpCisJCXJldHVybiAtRUFHQUlOOwogCiAJcmV0dmFsID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGxpc3QtPmpveWRldi0+d2FpdCwKLQkJIAkJCSAgIWxpc3QtPmpveWRldi0+ZXhpc3QgfHwKKwkJCQkJICAhbGlzdC0+am95ZGV2LT5leGlzdCB8fAogCQkJCQkgIGxpc3QtPnN0YXJ0dXAgPCBqb3lkZXYtPm5hYnMgKyBqb3lkZXYtPm5rZXkgfHwKIAkJCQkJICBsaXN0LT5oZWFkICE9IGxpc3QtPnRhaWwpOwogCkBAIC0yNzYsOCArMjc3LDkgQEAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgam95ZGV2X3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpCiB7CiAJc3RydWN0IGpveWRldl9saXN0ICpsaXN0ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCiAJcG9sbF93YWl0KGZpbGUsICZsaXN0LT5qb3lkZXYtPndhaXQsIHdhaXQpOwotCXJldHVybiAoKGxpc3QtPmhlYWQgIT0gbGlzdC0+dGFpbCB8fCBsaXN0LT5zdGFydHVwIDwgbGlzdC0+am95ZGV2LT5uYWJzICsgbGlzdC0+am95ZGV2LT5ua2V5KSA/IAorCXJldHVybiAoKGxpc3QtPmhlYWQgIT0gbGlzdC0+dGFpbCB8fCBsaXN0LT5zdGFydHVwIDwgbGlzdC0+am95ZGV2LT5uYWJzICsgbGlzdC0+am95ZGV2LT5ua2V5KSA/CiAJCShQT0xMSU4gfCBQT0xMUkROT1JNKSA6IDApIHwgKGxpc3QtPmpveWRldi0+ZXhpc3QgPyAwIDogKFBPTExIVVAgfCBQT0xMRVJSKSk7CiB9CiAKQEAgLTI5MSwyMCArMjkzLDI2IEBACiAJCWNhc2UgSlNfU0VUX0NBTDoKIAkJCXJldHVybiBjb3B5X2Zyb21fdXNlcigmam95ZGV2LT5nbHVlLkpTX0NPUlIsIGFyZ3AsCiAJCQkJc2l6ZW9mKGpveWRldi0+Z2x1ZS5KU19DT1JSKSkgPyAtRUZBVUxUIDogMDsKKwogCQljYXNlIEpTX0dFVF9DQUw6CiAJCQlyZXR1cm4gY29weV90b191c2VyKGFyZ3AsICZqb3lkZXYtPmdsdWUuSlNfQ09SUiwKIAkJCQlzaXplb2Yoam95ZGV2LT5nbHVlLkpTX0NPUlIpKSA/IC1FRkFVTFQgOiAwOworCiAJCWNhc2UgSlNfU0VUX1RJTUVPVVQ6CiAJCQlyZXR1cm4gZ2V0X3VzZXIoam95ZGV2LT5nbHVlLkpTX1RJTUVPVVQsIChzMzIgX191c2VyICopIGFyZ3ApOworCiAJCWNhc2UgSlNfR0VUX1RJTUVPVVQ6CiAJCQlyZXR1cm4gcHV0X3VzZXIoam95ZGV2LT5nbHVlLkpTX1RJTUVPVVQsIChzMzIgX191c2VyICopIGFyZ3ApOwogCiAJCWNhc2UgSlNJT0NHVkVSU0lPTjoKIAkJCXJldHVybiBwdXRfdXNlcihKU19WRVJTSU9OLCAoX191MzIgX191c2VyICopIGFyZ3ApOworCiAJCWNhc2UgSlNJT0NHQVhFUzoKIAkJCXJldHVybiBwdXRfdXNlcihqb3lkZXYtPm5hYnMsIChfX3U4IF9fdXNlciAqKSBhcmdwKTsKKwogCQljYXNlIEpTSU9DR0JVVFRPTlM6CiAJCQlyZXR1cm4gcHV0X3VzZXIoam95ZGV2LT5ua2V5LCAoX191OCBfX3VzZXIgKikgYXJncCk7CisKIAkJY2FzZSBKU0lPQ1NDT1JSOgogCQkJaWYgKGNvcHlfZnJvbV91c2VyKGpveWRldi0+Y29yciwgYXJncCwKIAkJCQkgICAgICBzaXplb2Yoam95ZGV2LT5jb3JyWzBdKSAqIGpveWRldi0+bmFicykpCkBAIC0zMTQsMzggKzMyMiw0OSBAQAogCQkJICAgICAgICBqb3lkZXYtPmFic1tpXSA9IGpveWRldl9jb3JyZWN0KGRldi0+YWJzW2pdLCBqb3lkZXYtPmNvcnIgKyBpKTsKIAkJCX0KIAkJCXJldHVybiAwOworCiAJCWNhc2UgSlNJT0NHQ09SUjoKIAkJCXJldHVybiBjb3B5X3RvX3VzZXIoYXJncCwgam95ZGV2LT5jb3JyLAogCQkJCQkJc2l6ZW9mKGpveWRldi0+Y29yclswXSkgKiBqb3lkZXYtPm5hYnMpID8gLUVGQVVMVCA6IDA7CisKIAkJY2FzZSBKU0lPQ1NBWE1BUDoKIAkJCWlmIChjb3B5X2Zyb21fdXNlcihqb3lkZXYtPmFic3BhbSwgYXJncCwgc2l6ZW9mKF9fdTgpICogKEFCU19NQVggKyAxKSkpCiAJCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCQlmb3IgKGkgPSAwOyBpIDwgam95ZGV2LT5uYWJzOyBpKyspIHsKLQkJCQlpZiAoam95ZGV2LT5hYnNwYW1baV0gPiBBQlNfTUFYKSByZXR1cm4gLUVJTlZBTDsKKwkJCQlpZiAoam95ZGV2LT5hYnNwYW1baV0gPiBBQlNfTUFYKQorCQkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCQlqb3lkZXYtPmFic21hcFtqb3lkZXYtPmFic3BhbVtpXV0gPSBpOwogCQkJfQogCQkJcmV0dXJuIDA7CisKIAkJY2FzZSBKU0lPQ0dBWE1BUDoKIAkJCXJldHVybiBjb3B5X3RvX3VzZXIoYXJncCwgam95ZGV2LT5hYnNwYW0sCiAJCQkJCQlzaXplb2YoX191OCkgKiAoQUJTX01BWCArIDEpKSA/IC1FRkFVTFQgOiAwOworCiAJCWNhc2UgSlNJT0NTQlROTUFQOgogCQkJaWYgKGNvcHlfZnJvbV91c2VyKGpveWRldi0+a2V5cGFtLCBhcmdwLCBzaXplb2YoX191MTYpICogKEtFWV9NQVggLSBCVE5fTUlTQyArIDEpKSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKIAkJCWZvciAoaSA9IDA7IGkgPCBqb3lkZXYtPm5rZXk7IGkrKykgewotCQkJCWlmIChqb3lkZXYtPmtleXBhbVtpXSA+IEtFWV9NQVggfHwgam95ZGV2LT5rZXlwYW1baV0gPCBCVE5fTUlTQykgcmV0dXJuIC1FSU5WQUw7CisJCQkJaWYgKGpveWRldi0+a2V5cGFtW2ldID4gS0VZX01BWCB8fCBqb3lkZXYtPmtleXBhbVtpXSA8IEJUTl9NSVNDKQorCQkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCQlqb3lkZXYtPmtleW1hcFtqb3lkZXYtPmtleXBhbVtpXSAtIEJUTl9NSVNDXSA9IGk7CiAJCQl9CiAJCQlyZXR1cm4gMDsKKwogCQljYXNlIEpTSU9DR0JUTk1BUDoKIAkJCXJldHVybiBjb3B5X3RvX3VzZXIoYXJncCwgam95ZGV2LT5rZXlwYW0sCiAJCQkJCQlzaXplb2YoX191MTYpICogKEtFWV9NQVggLSBCVE5fTUlTQyArIDEpKSA/IC1FRkFVTFQgOiAwOworCiAJCWRlZmF1bHQ6CiAJCQlpZiAoKGNtZCAmIH4oX0lPQ19TSVpFTUFTSyA8PCBfSU9DX1NJWkVTSElGVCkpID09IEpTSU9DR05BTUUoMCkpIHsKIAkJCQlpbnQgbGVuOwotCQkJCWlmICghZGV2LT5uYW1lKSByZXR1cm4gMDsKKwkJCQlpZiAoIWRldi0+bmFtZSkKKwkJCQkJcmV0dXJuIDA7CiAJCQkJbGVuID0gc3RybGVuKGRldi0+bmFtZSkgKyAxOwotCQkJCWlmIChsZW4gPiBfSU9DX1NJWkUoY21kKSkgbGVuID0gX0lPQ19TSVpFKGNtZCk7Ci0JCQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCBkZXYtPm5hbWUsIGxlbikpIHJldHVybiAtRUZBVUxUOworCQkJCWlmIChsZW4gPiBfSU9DX1NJWkUoY21kKSkKKwkJCQkJbGVuID0gX0lPQ19TSVpFKGNtZCk7CisJCQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCBkZXYtPm5hbWUsIGxlbikpCisJCQkJCXJldHVybiAtRUZBVUxUOwogCQkJCXJldHVybiBsZW47CiAJCQl9CiAJfQpAQCAtMzYyLDcgKzM4MSw5IEBACiAJc3RydWN0IEpTX0RBVEFfU0FWRV9UWVBFXzMyIGRzMzI7CiAJaW50IGVycjsKIAotCWlmICgham95ZGV2LT5leGlzdCkgcmV0dXJuIC1FTk9ERVY7CisJaWYgKCFqb3lkZXYtPmV4aXN0KQorCQlyZXR1cm4gLUVOT0RFVjsKKwogCXN3aXRjaChjbWQpIHsKIAljYXNlIEpTX1NFVF9USU1FTElNSVQ6CiAJCWVyciA9IGdldF91c2VyKHRtcDMyLCAoczMyIF9fdXNlciAqKSBhcmcpOwpAQCAtMzk1LDggKzQxNiw3IEBACiAJCWRzMzIuSlNfU0FWRSAgICAgICA9IGpveWRldi0+Z2x1ZS5KU19TQVZFOwogCQlkczMyLkpTX0NPUlIgICAgICAgPSBqb3lkZXYtPmdsdWUuSlNfQ09SUjsKIAotCQllcnIgPSBjb3B5X3RvX3VzZXIoYXJncCwgJmRzMzIsCi0JCQkJCSAgc2l6ZW9mKGRzMzIpKSA/IC1FRkFVTFQgOiAwOworCQllcnIgPSBjb3B5X3RvX3VzZXIoYXJncCwgJmRzMzIsIHNpemVvZihkczMyKSkgPyAtRUZBVUxUIDogMDsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpAQCAtNDEyLDcgKzQzMiw4IEBACiAJc3RydWN0IGpveWRldiAqam95ZGV2ID0gbGlzdC0+am95ZGV2OwogCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwogCi0JaWYgKCFqb3lkZXYtPmV4aXN0KSByZXR1cm4gLUVOT0RFVjsKKwlpZiAoIWpveWRldi0+ZXhpc3QpCisJCXJldHVybiAtRU5PREVWOwogCiAJc3dpdGNoKGNtZCkgewogCQljYXNlIEpTX1NFVF9USU1FTElNSVQ6CkBAIC01NDYsOCArNTY3LDggQEAKIAkJLmZsYWdzID0gSU5QVVRfREVWSUNFX0lEX01BVENIX0VWQklUIHwgSU5QVVRfREVWSUNFX0lEX01BVENIX0tFWUJJVCwKIAkJLmV2Yml0ID0geyBCSVQoRVZfS0VZKSB9LAogCQkua2V5Yml0ID0geyBbTE9ORyhCVE5fVE9VQ0gpXSA9IEJJVChCVE5fVE9VQ0gpIH0sCi0JfSwgCS8qIEF2b2lkIGl0b3VjaHBhZHMsIHRvdWNoc2NyZWVucyBhbmQgdGFibGV0cyAqLwotCXsgfSwgCS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCisJfSwJLyogQXZvaWQgaXRvdWNocGFkcywgdG91Y2hzY3JlZW5zIGFuZCB0YWJsZXRzICovCisJeyB9CS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCiB9OwogCiBzdGF0aWMgc3RydWN0IGlucHV0X2RldmljZV9pZCBqb3lkZXZfaWRzW10gPSB7CkBAIC01NjYsNyArNTg3LDcgQEAKIAkJLmV2Yml0ID0geyBCSVQoRVZfQUJTKSB9LAogCQkuYWJzYml0ID0geyBCSVQoQUJTX1RIUk9UVExFKSB9LAogCX0sCi0JeyB9LCAJLyogVGVybWluYXRpbmcgZW50cnkgKi8KKwl7IH0JLyogVGVybWluYXRpbmcgZW50cnkgKi8KIH07CiAKIE1PRFVMRV9ERVZJQ0VfVEFCTEUoaW5wdXQsIGpveWRldl9pZHMpOwpAQCAtNTc5LDcgKzYwMCw3IEBACiAJLm1pbm9yID0JSk9ZREVWX01JTk9SX0JBU0UsCiAJLm5hbWUgPQkJImpveWRldiIsCiAJLmlkX3RhYmxlID0Jam95ZGV2X2lkcywKLQkuYmxhY2tsaXN0ID0gCWpveWRldl9ibGFja2xpc3QsCisJLmJsYWNrbGlzdCA9CWpveWRldl9ibGFja2xpc3QsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBqb3lkZXZfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9hM2QuYyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svYTNkLmMKaW5kZXggNDYxMmQxMy4uYjExYTRiYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9hM2QuYworKysgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2EzZC5jCkBAIC0zMDYsNyArMzA2LDcgQEAKIAlnYW1lcG9ydF9zZXRfcG9sbF9oYW5kbGVyKGdhbWVwb3J0LCBhM2RfcG9sbCk7CiAJZ2FtZXBvcnRfc2V0X3BvbGxfaW50ZXJ2YWwoZ2FtZXBvcnQsIDIwKTsKIAotCXNwcmludGYoYTNkLT5waHlzLCAiJXMvaW5wdXQwIiwgZ2FtZXBvcnQtPnBoeXMpOworCXNucHJpbnRmKGEzZC0+cGh5cywgc2l6ZW9mKGEzZC0+cGh5cyksICIlcy9pbnB1dDAiLCBnYW1lcG9ydC0+cGh5cyk7CiAKIAlpbnB1dF9kZXYtPm5hbWUgPSBhM2RfbmFtZXNbYTNkLT5tb2RlXTsKIAlpbnB1dF9kZXYtPnBoeXMgPSBhM2QtPnBoeXM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2FuYWxvZy5jIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9hbmFsb2cuYwppbmRleCAzMTIxOTYxLi4wMWRjMGIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2FuYWxvZy5jCisrKyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svYW5hbG9nLmMKQEAgLTQwOCwyMSArNDA4LDIzIEBACiAKIHN0YXRpYyB2b2lkIGFuYWxvZ19uYW1lKHN0cnVjdCBhbmFsb2cgKmFuYWxvZykKIHsKLQlzcHJpbnRmKGFuYWxvZy0+bmFtZSwgIkFuYWxvZyAlZC1heGlzICVkLWJ1dHRvbiIsCi0JCWh3ZWlnaHQ4KGFuYWxvZy0+bWFzayAmIEFOQUxPR19BWEVTX1NURCksCi0JCWh3ZWlnaHQ4KGFuYWxvZy0+bWFzayAmIEFOQUxPR19CVE5TX1NURCkgKyAhIShhbmFsb2ctPm1hc2sgJiBBTkFMT0dfQlROU19DSEYpICogMiArCi0JCWh3ZWlnaHQxNihhbmFsb2ctPm1hc2sgJiBBTkFMT0dfQlROU19HQU1FUEFEKSArICEhKGFuYWxvZy0+bWFzayAmIEFOQUxPR19IQlROX0NIRikgKiA0KTsKKwlzbnByaW50ZihhbmFsb2ctPm5hbWUsIHNpemVvZihhbmFsb2ctPm5hbWUpLCAiQW5hbG9nICVkLWF4aXMgJWQtYnV0dG9uIiwKKwkJIGh3ZWlnaHQ4KGFuYWxvZy0+bWFzayAmIEFOQUxPR19BWEVTX1NURCksCisJCSBod2VpZ2h0OChhbmFsb2ctPm1hc2sgJiBBTkFMT0dfQlROU19TVEQpICsgISEoYW5hbG9nLT5tYXNrICYgQU5BTE9HX0JUTlNfQ0hGKSAqIDIgKworCQkgaHdlaWdodDE2KGFuYWxvZy0+bWFzayAmIEFOQUxPR19CVE5TX0dBTUVQQUQpICsgISEoYW5hbG9nLT5tYXNrICYgQU5BTE9HX0hCVE5fQ0hGKSAqIDQpOwogCiAJaWYgKGFuYWxvZy0+bWFzayAmIEFOQUxPR19IQVRTX0FMTCkKLQkJc3ByaW50ZihhbmFsb2ctPm5hbWUsICIlcyAlZC1oYXQiLAotCQkJYW5hbG9nLT5uYW1lLCBod2VpZ2h0MTYoYW5hbG9nLT5tYXNrICYgQU5BTE9HX0hBVFNfQUxMKSk7CisJCXNucHJpbnRmKGFuYWxvZy0+bmFtZSwgc2l6ZW9mKGFuYWxvZy0+bmFtZSksICIlcyAlZC1oYXQiLAorCQkJIGFuYWxvZy0+bmFtZSwgaHdlaWdodDE2KGFuYWxvZy0+bWFzayAmIEFOQUxPR19IQVRTX0FMTCkpOwogCiAJaWYgKGFuYWxvZy0+bWFzayAmIEFOQUxPR19IQVRfRkNTKQotCQkJc3RyY2F0KGFuYWxvZy0+bmFtZSwgIiBGQ1MiKTsKKwkJc3RybGNhdChhbmFsb2ctPm5hbWUsICIgRkNTIiwgc2l6ZW9mKGFuYWxvZy0+bmFtZSkpOwogCWlmIChhbmFsb2ctPm1hc2sgJiBBTkFMT0dfQU5ZX0NIRikKLQkJCXN0cmNhdChhbmFsb2ctPm5hbWUsIChhbmFsb2ctPm1hc2sgJiBBTkFMT0dfU0FJVEVLKSA/ICIgU2FpdGVrIiA6ICIgQ0hGIik7CisJCXN0cmxjYXQoYW5hbG9nLT5uYW1lLCAoYW5hbG9nLT5tYXNrICYgQU5BTE9HX1NBSVRFSykgPyAiIFNhaXRlayIgOiAiIENIRiIsCisJCQlzaXplb2YoYW5hbG9nLT5uYW1lKSk7CiAKLQlzdHJjYXQoYW5hbG9nLT5uYW1lLCAoYW5hbG9nLT5tYXNrICYgQU5BTE9HX0dBTUVQQUQpID8gIiBnYW1lcGFkIjogIiBqb3lzdGljayIpOworCXN0cmxjYXQoYW5hbG9nLT5uYW1lLCAoYW5hbG9nLT5tYXNrICYgQU5BTE9HX0dBTUVQQUQpID8gIiBnYW1lcGFkIjogIiBqb3lzdGljayIsCisJCXNpemVvZihhbmFsb2ctPm5hbWUpKTsKIH0KIAogLyoKQEAgLTQzNSw3ICs0MzcsOCBAQAogCWludCBpLCBqLCB0LCB2LCB3LCB4LCB5LCB6OwogCiAJYW5hbG9nX25hbWUoYW5hbG9nKTsKLQlzcHJpbnRmKGFuYWxvZy0+cGh5cywgIiVzL2lucHV0JWQiLCBwb3J0LT5nYW1lcG9ydC0+cGh5cywgaW5kZXgpOworCXNucHJpbnRmKGFuYWxvZy0+cGh5cywgc2l6ZW9mKGFuYWxvZy0+cGh5cyksCisJCSAiJXMvaW5wdXQlZCIsIHBvcnQtPmdhbWVwb3J0LT5waHlzLCBpbmRleCk7CiAJYW5hbG9nLT5idXR0b25zID0gKGFuYWxvZy0+bWFzayAmIEFOQUxPR19HQU1FUEFEKSA/IGFuYWxvZ19wYWRfYnRuIDogYW5hbG9nX2pveV9idG47CiAKIAlhbmFsb2ctPmRldiA9IGlucHV0X2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9jb2JyYS5jIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9jb2JyYS5jCmluZGV4IDE5MDlmN2UuLmQ1ZTQyZWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svY29icmEuYworKysgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2NvYnJhLmMKQEAgLTIwMiw3ICsyMDIsOCBAQAogCQkJZ290byBmYWlsMzsKIAkJfQogCi0JCXNwcmludGYoY29icmEtPnBoeXNbaV0sICIlcy9pbnB1dCVkIiwgZ2FtZXBvcnQtPnBoeXMsIGkpOworCQlzbnByaW50Zihjb2JyYS0+cGh5c1tpXSwgc2l6ZW9mKGNvYnJhLT5waHlzW2ldKSwKKwkJCSAiJXMvaW5wdXQlZCIsIGdhbWVwb3J0LT5waHlzLCBpKTsKIAogCQlpbnB1dF9kZXYtPm5hbWUgPSAiQ3JlYXRpdmUgTGFicyBCbGFzdGVyIEdhbWVQYWQgQ29icmEiOwogCQlpbnB1dF9kZXYtPnBoeXMgPSBjb2JyYS0+cGh5c1tpXTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svZGI5LmMgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2RiOS5jCmluZGV4IGU2MTg5NDYuLjZmMzFmMDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svZGI5LmMKKysrIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9kYjkuYwpAQCAtNjIwLDcgKzYyMCw4IEBACiAJCQlnb3RvIGVycl91bnJlZ19kZXZzOwogCQl9CiAKLQkJc3ByaW50ZihkYjktPnBoeXNbaV0sICIlcy9pbnB1dCVkIiwgZGI5LT5wZC0+cG9ydC0+bmFtZSwgaSk7CisJCXNucHJpbnRmKGRiOS0+cGh5c1tpXSwgc2l6ZW9mKGRiOS0+cGh5c1tpXSksCisJCQkgIiVzL2lucHV0JWQiLCBkYjktPnBkLT5wb3J0LT5uYW1lLCBpKTsKIAogCQlpbnB1dF9kZXYtPm5hbWUgPSBkYjlfbW9kZS0+bmFtZTsKIAkJaW5wdXRfZGV2LT5waHlzID0gZGI5LT5waHlzW2ldOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9nYW1lY29uLmMgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2dhbWVjb24uYwppbmRleCBlY2JkYjZiLi5mZTEyYWEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2dhbWVjb24uYworKysgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2dhbWVjb24uYwpAQCAtNzYxLDcgKzc2MSw4IEBACiAJCWlmICghcGFkc1tpXSkKIAkJCWNvbnRpbnVlOwogCi0JCXNwcmludGYoZ2MtPnBoeXNbaV0sICIlcy9pbnB1dCVkIiwgZ2MtPnBkLT5wb3J0LT5uYW1lLCBpKTsKKwkJc25wcmludGYoZ2MtPnBoeXNbaV0sIHNpemVvZihnYy0+cGh5c1tpXSksCisJCQkgIiVzL2lucHV0JWQiLCBnYy0+cGQtPnBvcnQtPm5hbWUsIGkpOwogCQllcnIgPSBnY19zZXR1cF9wYWQoZ2MsIGksIHBhZHNbaV0pOwogCQlpZiAoZXJyKQogCQkJZ290byBlcnJfdW5yZWdfZGV2czsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svZ2Yyay5jIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9nZjJrLmMKaW5kZXggOGEzYWQ0NS4uZTRhNjk5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9nZjJrLmMKKysrIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9nZjJrLmMKQEAgLTI5OCw3ICsyOTgsNyBAQAogCWdhbWVwb3J0X3NldF9wb2xsX2hhbmRsZXIoZ2FtZXBvcnQsIGdmMmtfcG9sbCk7CiAJZ2FtZXBvcnRfc2V0X3BvbGxfaW50ZXJ2YWwoZ2FtZXBvcnQsIDIwKTsKIAotCXNwcmludGYoZ2Yyay0+cGh5cywgIiVzL2lucHV0MCIsIGdhbWVwb3J0LT5waHlzKTsKKwlzbnByaW50ZihnZjJrLT5waHlzLCBzaXplb2YoZ2Yyay0+cGh5cyksICIlcy9pbnB1dDAiLCBnYW1lcG9ydC0+cGh5cyk7CiAKIAlnZjJrLT5sZW5ndGggPSBnZjJrX2xlbnNbZ2Yyay0+aWRdOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2dyaXAuYyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svZ3JpcC5jCmluZGV4IDIwY2I5OGEuLjE3YTkwYzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svZ3JpcC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svZ3JpcC5jCkBAIC0zNTQsNyArMzU0LDggQEAKIAkJCWdvdG8gZmFpbDM7CiAJCX0KIAotCQlzcHJpbnRmKGdyaXAtPnBoeXNbaV0sICIlcy9pbnB1dCVkIiwgZ2FtZXBvcnQtPnBoeXMsIGkpOworCQlzbnByaW50ZihncmlwLT5waHlzW2ldLCBzaXplb2YoZ3JpcC0+cGh5c1tpXSksCisJCQkgIiVzL2lucHV0JWQiLCBnYW1lcG9ydC0+cGh5cywgaSk7CiAKIAkJaW5wdXRfZGV2LT5uYW1lID0gZ3JpcF9uYW1lW2dyaXAtPm1vZGVbaV1dOwogCQlpbnB1dF9kZXYtPnBoeXMgPSBncmlwLT5waHlzW2ldOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9ndWlsbGVtb3QuYyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svZ3VpbGxlbW90LmMKaW5kZXggNmUyYzcyMS4uODQwZWQ5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9ndWlsbGVtb3QuYworKysgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2d1aWxsZW1vdC5jCkBAIC0yMjIsNyArMjIyLDcgQEAKIAlnYW1lcG9ydF9zZXRfcG9sbF9oYW5kbGVyKGdhbWVwb3J0LCBndWlsbGVtb3RfcG9sbCk7CiAJZ2FtZXBvcnRfc2V0X3BvbGxfaW50ZXJ2YWwoZ2FtZXBvcnQsIDIwKTsKIAotCXNwcmludGYoZ3VpbGxlbW90LT5waHlzLCAiJXMvaW5wdXQwIiwgZ2FtZXBvcnQtPnBoeXMpOworCXNucHJpbnRmKGd1aWxsZW1vdC0+cGh5cywgc2l6ZW9mKGd1aWxsZW1vdC0+cGh5cyksICIlcy9pbnB1dDAiLCBnYW1lcG9ydC0+cGh5cyk7CiAJZ3VpbGxlbW90LT50eXBlID0gZ3VpbGxlbW90X3R5cGUgKyBpOwogCiAJaW5wdXRfZGV2LT5uYW1lID0gZ3VpbGxlbW90X3R5cGVbaV0ubmFtZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svaWZvcmNlL2lmb3JjZS1mZi5jIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9pZm9yY2UvaWZvcmNlLWZmLmMKaW5kZXggMmI4ZTg0NS4uNTBjOTA3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9pZm9yY2UvaWZvcmNlLWZmLmMKKysrIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9pZm9yY2UvaWZvcmNlLWZmLmMKQEAgLTQ3LDcgKzQ3LDcgQEAKIAkJCWlmb3JjZS0+ZGV2aWNlX21lbW9yeS5zdGFydCwgaWZvcmNlLT5kZXZpY2VfbWVtb3J5LmVuZCwgMkwsCiAJCQlOVUxMLCBOVUxMKSkgewogCQkJbXV0ZXhfdW5sb2NrKCZpZm9yY2UtPm1lbV9tdXRleCk7Ci0JCQlyZXR1cm4gLUVOT01FTTsKKwkJCXJldHVybiAtRU5PU1BDOwogCQl9CiAJCW11dGV4X3VubG9jaygmaWZvcmNlLT5tZW1fbXV0ZXgpOwogCX0KQEAgLTgwLDcgKzgwLDcgQEAKIAkJCWlmb3JjZS0+ZGV2aWNlX21lbW9yeS5zdGFydCwgaWZvcmNlLT5kZXZpY2VfbWVtb3J5LmVuZCwgMkwsCiAJCQlOVUxMLCBOVUxMKSkgewogCQkJbXV0ZXhfdW5sb2NrKCZpZm9yY2UtPm1lbV9tdXRleCk7Ci0JCQlyZXR1cm4gLUVOT01FTTsKKwkJCXJldHVybiAtRU5PU1BDOwogCQl9CiAJCW11dGV4X3VubG9jaygmaWZvcmNlLT5tZW1fbXV0ZXgpOwogCX0KQEAgLTEyMCw3ICsxMjAsNyBAQAogCQkJaWZvcmNlLT5kZXZpY2VfbWVtb3J5LnN0YXJ0LCBpZm9yY2UtPmRldmljZV9tZW1vcnkuZW5kLCAyTCwKIAkJCU5VTEwsIE5VTEwpKSB7CiAJCQltdXRleF91bmxvY2soJmlmb3JjZS0+bWVtX211dGV4KTsKLQkJCXJldHVybiAtRU5PTUVNOworCQkJcmV0dXJuIC1FTk9TUEM7CiAJCX0KIAkJbXV0ZXhfdW5sb2NrKCZpZm9yY2UtPm1lbV9tdXRleCk7CiAJfQpAQCAtMTU3LDcgKzE1Nyw3IEBACiAJCQlpZm9yY2UtPmRldmljZV9tZW1vcnkuc3RhcnQsIGlmb3JjZS0+ZGV2aWNlX21lbW9yeS5lbmQsIDJMLAogCQkJTlVMTCwgTlVMTCkpIHsKIAkJCW11dGV4X3VubG9jaygmaWZvcmNlLT5tZW1fbXV0ZXgpOwotCQkJcmV0dXJuIC1FTk9NRU07CisJCQlyZXR1cm4gLUVOT1NQQzsKIAkJfQogCQltdXRleF91bmxvY2soJmlmb3JjZS0+bWVtX211dGV4KTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2lmb3JjZS9pZm9yY2UtbWFpbi5jIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9pZm9yY2UvaWZvcmNlLW1haW4uYwppbmRleCBhYjBhMjZiLi42ZDk5ZTNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2lmb3JjZS9pZm9yY2UtbWFpbi5jCisrKyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svaWZvcmNlL2lmb3JjZS1tYWluLmMKQEAgLTg2LDcgKzg2LDcgQEAKIAogc3RhdGljIGludCBpZm9yY2VfaW5wdXRfZXZlbnQoc3RydWN0IGlucHV0X2RldiAqZGV2LCB1bnNpZ25lZCBpbnQgdHlwZSwgdW5zaWduZWQgaW50IGNvZGUsIGludCB2YWx1ZSkKIHsKLQlzdHJ1Y3QgaWZvcmNlKiBpZm9yY2UgPSAoc3RydWN0IGlmb3JjZSopKGRldi0+cHJpdmF0ZSk7CisJc3RydWN0IGlmb3JjZSogaWZvcmNlID0gZGV2LT5wcml2YXRlOwogCXVuc2lnbmVkIGNoYXIgZGF0YVszXTsKIAogCWlmICh0eXBlICE9IEVWX0ZGKQpAQCAtMTM4LDcgKzEzOCw3IEBACiAgKi8KIHN0YXRpYyBpbnQgaWZvcmNlX3VwbG9hZF9lZmZlY3Qoc3RydWN0IGlucHV0X2RldiAqZGV2LCBzdHJ1Y3QgZmZfZWZmZWN0ICplZmZlY3QpCiB7Ci0Jc3RydWN0IGlmb3JjZSogaWZvcmNlID0gKHN0cnVjdCBpZm9yY2UqKShkZXYtPnByaXZhdGUpOworCXN0cnVjdCBpZm9yY2UqIGlmb3JjZSA9IGRldi0+cHJpdmF0ZTsKIAlpbnQgaWQ7CiAJaW50IHJldDsKIAlpbnQgaXNfdXBkYXRlOwpAQCAtMjE4LDcgKzIxOCw3IEBACiAgKi8KIHN0YXRpYyBpbnQgaWZvcmNlX2VyYXNlX2VmZmVjdChzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYsIGludCBlZmZlY3RfaWQpCiB7Ci0Jc3RydWN0IGlmb3JjZSogaWZvcmNlID0gKHN0cnVjdCBpZm9yY2UqKShkZXYtPnByaXZhdGUpOworCXN0cnVjdCBpZm9yY2UqIGlmb3JjZSA9IGRldi0+cHJpdmF0ZTsKIAlpbnQgZXJyID0gMDsKIAlzdHJ1Y3QgaWZvcmNlX2NvcmVfZWZmZWN0KiBjb3JlX2VmZmVjdDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9pbnRlcmFjdC5jIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9pbnRlcmFjdC5jCmluZGV4IGM0ZWQwMTcuLmJiZmViOWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svaW50ZXJhY3QuYworKysgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2ludGVyYWN0LmMKQEAgLTI1MSw3ICsyNTEsNyBAQAogCWdhbWVwb3J0X3NldF9wb2xsX2hhbmRsZXIoZ2FtZXBvcnQsIGludGVyYWN0X3BvbGwpOwogCWdhbWVwb3J0X3NldF9wb2xsX2ludGVydmFsKGdhbWVwb3J0LCAyMCk7CiAKLQlzcHJpbnRmKGludGVyYWN0LT5waHlzLCAiJXMvaW5wdXQwIiwgZ2FtZXBvcnQtPnBoeXMpOworCXNucHJpbnRmKGludGVyYWN0LT5waHlzLCBzaXplb2YoaW50ZXJhY3QtPnBoeXMpLCAiJXMvaW5wdXQwIiwgZ2FtZXBvcnQtPnBoeXMpOwogCiAJaW50ZXJhY3QtPnR5cGUgPSBpOwogCWludGVyYWN0LT5sZW5ndGggPSBpbnRlcmFjdF90eXBlW2ldLmxlbmd0aDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svbWFnZWxsYW4uYyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svbWFnZWxsYW4uYwppbmRleCBjYTNjYzIzLi4xNjhiMTA2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL21hZ2VsbGFuLmMKKysrIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9tYWdlbGxhbi5jCkBAIC0xNjIsNyArMTYyLDcgQEAKIAkJZ290byBmYWlsOwogCiAJbWFnZWxsYW4tPmRldiA9IGlucHV0X2RldjsKLQlzcHJpbnRmKG1hZ2VsbGFuLT5waHlzLCAiJXMvaW5wdXQwIiwgc2VyaW8tPnBoeXMpOworCXNucHJpbnRmKG1hZ2VsbGFuLT5waHlzLCBzaXplb2YobWFnZWxsYW4tPnBoeXMpLCAiJXMvaW5wdXQwIiwgc2VyaW8tPnBoeXMpOwogCiAJaW5wdXRfZGV2LT5uYW1lID0gIkxvZ2lDYWQzRCBNYWdlbGxhbiAvIFNwYWNlTW91c2UiOwogCWlucHV0X2Rldi0+cGh5cyA9IG1hZ2VsbGFuLT5waHlzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9zaWRld2luZGVyLmMgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL3NpZGV3aW5kZXIuYwppbmRleCA5NWMwZGU3Li5lNThiMjJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL3NpZGV3aW5kZXIuYworKysgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL3NpZGV3aW5kZXIuYwpAQCAtNTQxLDcgKzU0MSw3IEBACiAgKiBVbmZvcnR1bmF0ZWx5IEkgZG9uJ3Qga25vdyBob3cgdG8gZG8gdGhpcyBmb3IgdGhlIG90aGVyIFNXIHR5cGVzLgogICovCiAKLXN0YXRpYyB2b2lkIHN3XzNkcF9pZCh1bnNpZ25lZCBjaGFyICpidWYsIGNoYXIgKmNvbW1lbnQpCitzdGF0aWMgdm9pZCBzd18zZHBfaWQodW5zaWduZWQgY2hhciAqYnVmLCBjaGFyICpjb21tZW50LCBzaXplX3Qgc2l6ZSkKIHsKIAlpbnQgaTsKIAljaGFyIHBucFs4XSwgcmV2WzldOwpAQCAtNTU0LDcgKzU1NCw3IEBACiAKIAlwbnBbN10gPSByZXZbOF0gPSAwOwogCi0Jc3ByaW50Zihjb21tZW50LCAiIFtQblAgJWQuJTAyZCBpZCAlcyByZXYgJXNdIiwKKwlzbnByaW50Zihjb21tZW50LCBzaXplLCAiIFtQblAgJWQuJTAyZCBpZCAlcyByZXYgJXNdIiwKIAkJKGludCkgKChzd19nZXRfYml0cyhidWYsIDgsIDYsIDEpIDw8IDYpIHwJCS8qIFR3byA2LWJpdCB2YWx1ZXMgKi8KIAkJCXN3X2dldF9iaXRzKGJ1ZiwgMTYsIDYsIDEpKSAvIDEwMCwKIAkJKGludCkgKChzd19nZXRfYml0cyhidWYsIDgsIDYsIDEpIDw8IDYpIHwKQEAgLTY5NSw3ICs2OTUsNyBAQAogCQkJCQkJc3ctPnR5cGUgPSBTV19JRF9GRlA7CiAJCQkJCQlzcHJpbnRmKGNvbW1lbnQsICIgW0FDICVzXSIsIHN3X2dldF9iaXRzKGlkYnVmLDM4LDEsMykgPyAib2ZmIiA6ICJvbiIpOwogCQkJCQl9IGVsc2UKLQkJCQkJc3ctPnR5cGUgPSBTV19JRF9QUDsKKwkJCQkJCXN3LT50eXBlID0gU1dfSURfUFA7CiAJCQkJCWJyZWFrOwogCQkJCWNhc2UgNjY6CiAJCQkJCXN3LT5iaXRzID0gMzsKQEAgLTcwMyw3ICs3MDMsOCBAQAogCQkJCQlzdy0+bGVuZ3RoID0gMjI7CiAJCQkJY2FzZSA2NDoKIAkJCQkJc3ctPnR5cGUgPSBTV19JRF8zRFA7Ci0JCQkJCWlmIChqID09IDE2MCkgc3dfM2RwX2lkKGlkYnVmLCBjb21tZW50KTsKKwkJCQkJaWYgKGogPT0gMTYwKQorCQkJCQkJc3dfM2RwX2lkKGlkYnVmLCBjb21tZW50LCBzaXplb2YoY29tbWVudCkpOwogCQkJCQlicmVhazsKIAkJCX0KIAkJfQpAQCAtNzMzLDggKzczNCwxMCBAQAogCWZvciAoaSA9IDA7IGkgPCBzdy0+bnVtYmVyOyBpKyspIHsKIAkJaW50IGJpdHMsIGNvZGU7CiAKLQkJc3ByaW50Zihzdy0+bmFtZSwgIk1pY3Jvc29mdCBTaWRlV2luZGVyICVzIiwgc3dfbmFtZVtzdy0+dHlwZV0pOwotCQlzcHJpbnRmKHN3LT5waHlzW2ldLCAiJXMvaW5wdXQlZCIsIGdhbWVwb3J0LT5waHlzLCBpKTsKKwkJc25wcmludGYoc3ctPm5hbWUsIHNpemVvZihzdy0+bmFtZSksCisJCQkgIk1pY3Jvc29mdCBTaWRlV2luZGVyICVzIiwgc3dfbmFtZVtzdy0+dHlwZV0pOworCQlzbnByaW50Zihzdy0+cGh5c1tpXSwgc2l6ZW9mKHN3LT5waHlzW2ldKSwKKwkJCSAiJXMvaW5wdXQlZCIsIGdhbWVwb3J0LT5waHlzLCBpKTsKIAogCQlzdy0+ZGV2W2ldID0gaW5wdXRfZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7CiAJCWlmICghaW5wdXRfZGV2KSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL3NwYWNlYmFsbC5jIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9zcGFjZWJhbGwuYwppbmRleCBkNmY4ZGI4Li43NWViNWNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL3NwYWNlYmFsbC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svc3BhY2ViYWxsLmMKQEAgLTIyMCw3ICsyMjAsNyBAQAogCQlnb3RvIGZhaWw7CiAKIAlzcGFjZWJhbGwtPmRldiA9IGlucHV0X2RldjsKLQlzcHJpbnRmKHNwYWNlYmFsbC0+cGh5cywgIiVzL2lucHV0MCIsIHNlcmlvLT5waHlzKTsKKwlzbnByaW50ZihzcGFjZWJhbGwtPnBoeXMsIHNpemVvZihzcGFjZWJhbGwtPnBoeXMpLCAiJXMvaW5wdXQwIiwgc2VyaW8tPnBoeXMpOwogCiAJaW5wdXRfZGV2LT5uYW1lID0gc3BhY2ViYWxsX25hbWVzW2lkXTsKIAlpbnB1dF9kZXYtPnBoeXMgPSBzcGFjZWJhbGwtPnBoeXM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL3NwYWNlb3JiLmMgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL3NwYWNlb3JiLmMKaW5kZXggN2MxMjNhMC4uM2UyNzgyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9zcGFjZW9yYi5jCisrKyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svc3BhY2VvcmIuYwpAQCAtMTc3LDcgKzE3Nyw3IEBACiAJCWdvdG8gZmFpbDsKIAogCXNwYWNlb3JiLT5kZXYgPSBpbnB1dF9kZXY7Ci0Jc3ByaW50ZihzcGFjZW9yYi0+cGh5cywgIiVzL2lucHV0MCIsIHNlcmlvLT5waHlzKTsKKwlzbnByaW50ZihzcGFjZW9yYi0+cGh5cywgc2l6ZW9mKHNwYWNlb3JiLT5waHlzKSwgIiVzL2lucHV0MCIsIHNlcmlvLT5waHlzKTsKIAogCWlucHV0X2Rldi0+bmFtZSA9ICJTcGFjZVRlYyBTcGFjZU9yYiAzNjAgLyBBdmVuZ2VyIjsKIAlpbnB1dF9kZXYtPnBoeXMgPSBzcGFjZW9yYi0+cGh5czsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svc3Rpbmdlci5jIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9zdGluZ2VyLmMKaW5kZXggMGE5ZWQxZC4uMDExZWM0OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9zdGluZ2VyLmMKKysrIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9zdGluZ2VyLmMKQEAgLTE0OCw3ICsxNDgsNyBAQAogCQlnb3RvIGZhaWw7CiAKIAlzdGluZ2VyLT5kZXYgPSBpbnB1dF9kZXY7Ci0Jc3ByaW50ZihzdGluZ2VyLT5waHlzLCAiJXMvc2VyaW8wIiwgc2VyaW8tPnBoeXMpOworCXNucHJpbnRmKHN0aW5nZXItPnBoeXMsIHNpemVvZihzdGluZ2VyLT5waHlzKSwgIiVzL3NlcmlvMCIsIHNlcmlvLT5waHlzKTsKIAogCWlucHV0X2Rldi0+bmFtZSA9ICJHcmF2aXMgU3RpbmdlciI7CiAJaW5wdXRfZGV2LT5waHlzID0gc3Rpbmdlci0+cGh5czsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svdHdpZGpveS5jIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay90d2lkam95LmMKaW5kZXggN2Y4YjAwOS4uMDc2ZjIzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay90d2lkam95LmMKKysrIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay90d2lkam95LmMKQEAgLTE5OSw3ICsxOTksNyBAQAogCQlnb3RvIGZhaWw7CiAKIAl0d2lkam95LT5kZXYgPSBpbnB1dF9kZXY7Ci0Jc3ByaW50Zih0d2lkam95LT5waHlzLCAiJXMvaW5wdXQwIiwgc2VyaW8tPnBoeXMpOworCXNucHJpbnRmKHR3aWRqb3ktPnBoeXMsIHNpemVvZih0d2lkam95LT5waHlzKSwgIiVzL2lucHV0MCIsIHNlcmlvLT5waHlzKTsKIAogCWlucHV0X2Rldi0+bmFtZSA9ICJIYW5keWtleSBUd2lkZGxlciI7CiAJaW5wdXRfZGV2LT5waHlzID0gdHdpZGpveS0+cGh5czsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svd2Fycmlvci5jIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay93YXJyaW9yLmMKaW5kZXggMTg0OWIxNy4uZjljMWEwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay93YXJyaW9yLmMKKysrIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay93YXJyaW9yLmMKQEAgLTE1NCw3ICsxNTQsNyBAQAogCQlnb3RvIGZhaWw7CiAKIAl3YXJyaW9yLT5kZXYgPSBpbnB1dF9kZXY7Ci0Jc3ByaW50Zih3YXJyaW9yLT5waHlzLCAiJXMvaW5wdXQwIiwgc2VyaW8tPnBoeXMpOworCXNucHJpbnRmKHdhcnJpb3ItPnBoeXMsIHNpemVvZih3YXJyaW9yLT5waHlzKSwgIiVzL2lucHV0MCIsIHNlcmlvLT5waHlzKTsKIAogCWlucHV0X2Rldi0+bmFtZSA9ICJMb2dpdGVjaCBXaW5nTWFuIFdhcnJpb3IiOwogCWlucHV0X2Rldi0+cGh5cyA9IHdhcnJpb3ItPnBoeXM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2F0a2JkLmMgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2F0a2JkLmMKaW5kZXggZmFkMDRiNi4uZmZkZThmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9hdGtiZC5jCisrKyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvYXRrYmQuYwpAQCAtNTUsNyArNTUsNyBAQAogbW9kdWxlX3BhcmFtX25hbWVkKHNvZnRyYXcsIGF0a2JkX3NvZnRyYXcsIGJvb2wsIDApOwogTU9EVUxFX1BBUk1fREVTQyhzb2Z0cmF3LCAiVXNlIHNvZnR3YXJlIGdlbmVyYXRlZCByYXdtb2RlIik7CiAKLXN0YXRpYyBpbnQgYXRrYmRfc2Nyb2xsID0gMDsKK3N0YXRpYyBpbnQgYXRrYmRfc2Nyb2xsOwogbW9kdWxlX3BhcmFtX25hbWVkKHNjcm9sbCwgYXRrYmRfc2Nyb2xsLCBib29sLCAwKTsKIE1PRFVMRV9QQVJNX0RFU0Moc2Nyb2xsLCAiRW5hYmxlIHNjcm9sbC13aGVlbCBvbiBNUyBPZmZpY2UgYW5kIHNpbWlsYXIga2V5Ym9hcmRzIik7CiAKQEAgLTE1MCw4ICsxNTAsOCBAQAogI2RlZmluZSBBVEtCRF9SRVRfRU1VTDAJCTB4ZTAKICNkZWZpbmUgQVRLQkRfUkVUX0VNVUwxCQkweGUxCiAjZGVmaW5lIEFUS0JEX1JFVF9SRUxFQVNFCTB4ZjAKLSNkZWZpbmUgQVRLQkRfUkVUX0hBTkdVRUwJMHhmMQotI2RlZmluZSBBVEtCRF9SRVRfSEFOSkEJCTB4ZjIKKyNkZWZpbmUgQVRLQkRfUkVUX0hBTkpBCQkweGYxCisjZGVmaW5lIEFUS0JEX1JFVF9IQU5HRVVMCTB4ZjIKICNkZWZpbmUgQVRLQkRfUkVUX0VSUgkJMHhmZgogCiAjZGVmaW5lIEFUS0JEX0tFWV9VTktOT1dOCSAgMApAQCAtMTcwLDYgKzE3MCwxMyBAQAogI2RlZmluZSBBVEtCRF9MRURfRVZFTlRfQklUCTAKICNkZWZpbmUgQVRLQkRfUkVQX0VWRU5UX0JJVAkxCiAKKyNkZWZpbmUgQVRLQkRfWExfRVJSCQkweDAxCisjZGVmaW5lIEFUS0JEX1hMX0JBVAkJMHgwMgorI2RlZmluZSBBVEtCRF9YTF9BQ0sJCTB4MDQKKyNkZWZpbmUgQVRLQkRfWExfTkFLCQkweDA4CisjZGVmaW5lIEFUS0JEX1hMX0hBTkdFVUwJMHgxMAorI2RlZmluZSBBVEtCRF9YTF9IQU5KQQkJMHgyMAorCiBzdGF0aWMgc3RydWN0IHsKIAl1bnNpZ25lZCBjaGFyIGtleWNvZGU7CiAJdW5zaWduZWQgY2hhciBzZXQyOwpAQCAtMjExLDggKzIxOCw3IEBACiAJdW5zaWduZWQgY2hhciBlbXVsOwogCXVuc2lnbmVkIGNoYXIgcmVzZW5kOwogCXVuc2lnbmVkIGNoYXIgcmVsZWFzZTsKLQl1bnNpZ25lZCBjaGFyIGJhdF94bDsKLQl1bnNpZ25lZCBjaGFyIGVycl94bDsKKwl1bnNpZ25lZCBsb25nIHhsX2JpdDsKIAl1bnNpZ25lZCBpbnQgbGFzdDsKIAl1bnNpZ25lZCBsb25nIHRpbWU7CiAKQEAgLTI0NSwxNyArMjUxLDY1IEBACiBBVEtCRF9ERUZJTkVfQVRUUihzb2Z0cmVwZWF0KTsKIEFUS0JEX0RFRklORV9BVFRSKHNvZnRyYXcpOwogCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHhsX3RhYmxlW10gPSB7CisJQVRLQkRfUkVUX0JBVCwgQVRLQkRfUkVUX0VSUiwgQVRLQkRfUkVUX0FDSywKKwlBVEtCRF9SRVRfTkFLLCBBVEtCRF9SRVRfSEFOSkEsIEFUS0JEX1JFVF9IQU5HRVVMLAorfTsKIAotc3RhdGljIHZvaWQgYXRrYmRfcmVwb3J0X2tleShzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYsIHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgY29kZSwgaW50IHZhbHVlKQorLyoKKyAqIENoZWNrcyBpZiB3ZSBzaG91bGQgbWFuZ2xlIHRoZSBzY2FuY29kZSB0byBleHRyYWN0ICdyZWxlYXNlJyBiaXQKKyAqIGluIHRyYW5zbGF0ZWQgbW9kZS4KKyAqLworc3RhdGljIGludCBhdGtiZF9uZWVkX3hsYXRlKHVuc2lnbmVkIGxvbmcgeGxfYml0LCB1bnNpZ25lZCBjaGFyIGNvZGUpCiB7Ci0JaW5wdXRfcmVncyhkZXYsIHJlZ3MpOwotCWlmICh2YWx1ZSA9PSAzKSB7Ci0JCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBjb2RlLCAxKTsKLQkJaW5wdXRfc3luYyhkZXYpOwotCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgY29kZSwgMCk7Ci0JfSBlbHNlCi0JCWlucHV0X2V2ZW50KGRldiwgRVZfS0VZLCBjb2RlLCB2YWx1ZSk7Ci0JaW5wdXRfc3luYyhkZXYpOworCWludCBpOworCisJaWYgKGNvZGUgPT0gQVRLQkRfUkVUX0VNVUwwIHx8IGNvZGUgPT0gQVRLQkRfUkVUX0VNVUwxKQorCQlyZXR1cm4gMDsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHhsX3RhYmxlKTsgaSsrKQorCQlpZiAoY29kZSA9PSB4bF90YWJsZVtpXSkKKwkJCXJldHVybiB0ZXN0X2JpdChpLCAmeGxfYml0KTsKKworCXJldHVybiAxOworfQorCisvKgorICogQ2FsY3VsYXRlcyBuZXcgdmFsdWUgb2YgeGxfYml0IHNvIHRoZSBkcml2ZXIgY2FuIGRpc3Rpbmd1aXNoCisgKiBiZXR3ZWVuIG1ha2UvYnJlYWsgcGFpciBvZiBzY2FuY29kZXMgZm9yIHNlbGVjdCBrZXlzIGFuZCBQUy8yCisgKiBwcm90b2NvbCByZXNwb25zZXMuCisgKi8KK3N0YXRpYyB2b2lkIGF0a2JkX2NhbGN1bGF0ZV94bF9iaXQoc3RydWN0IGF0a2JkICphdGtiZCwgdW5zaWduZWQgY2hhciBjb2RlKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoeGxfdGFibGUpOyBpKyspIHsKKwkJaWYgKCEoKGNvZGUgXiB4bF90YWJsZVtpXSkgJiAweDdmKSkgeworCQkJaWYgKGNvZGUgJiAweDgwKQorCQkJCV9fY2xlYXJfYml0KGksICZhdGtiZC0+eGxfYml0KTsKKwkJCWVsc2UKKwkJCQlfX3NldF9iaXQoaSwgJmF0a2JkLT54bF9iaXQpOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKKy8qCisgKiBFbmNvZGUgdGhlIHNjYW5jb2RlLCAweGUwIHByZWZpeCwgYW5kIGhpZ2ggYml0IGludG8gYSBzaW5nbGUgaW50ZWdlciwKKyAqIGtlZXBpbmcga2VybmVsIDIuNCBjb21wYXRpYmlsaXR5IGZvciBzZXQgMgorICovCitzdGF0aWMgdW5zaWduZWQgaW50IGF0a2JkX2NvbXBhdF9zY2FuY29kZShzdHJ1Y3QgYXRrYmQgKmF0a2JkLCB1bnNpZ25lZCBpbnQgY29kZSkKK3sKKwlpZiAoYXRrYmQtPnNldCA9PSAzKSB7CisJCWlmIChhdGtiZC0+ZW11bCA9PSAxKQorCQkJY29kZSB8PSAweDEwMDsKKyAgICAgICAgfSBlbHNlIHsKKwkJY29kZSA9IChjb2RlICYgMHg3ZikgfCAoKGNvZGUgJiAweDgwKSA8PCAxKTsKKwkJaWYgKGF0a2JkLT5lbXVsID09IDEpCisJCQljb2RlIHw9IDB4ODA7CisJfQorCisJcmV0dXJuIGNvZGU7CiB9CiAKIC8qCkBAIC0yNjcsOSArMzIxLDExIEBACiAJCQl1bnNpZ25lZCBpbnQgZmxhZ3MsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXN0cnVjdCBhdGtiZCAqYXRrYmQgPSBzZXJpb19nZXRfZHJ2ZGF0YShzZXJpbyk7CisJc3RydWN0IGlucHV0X2RldiAqZGV2ID0gYXRrYmQtPmRldjsKIAl1bnNpZ25lZCBpbnQgY29kZSA9IGRhdGE7Ci0JaW50IHNjcm9sbCA9IDAsIGhzY3JvbGwgPSAwLCBjbGljayA9IC0xOworCWludCBzY3JvbGwgPSAwLCBoc2Nyb2xsID0gMCwgY2xpY2sgPSAtMSwgYWRkX3JlbGVhc2VfZXZlbnQgPSAwOwogCWludCB2YWx1ZTsKKwl1bnNpZ25lZCBjaGFyIGtleWNvZGU7CiAKICNpZmRlZiBBVEtCRF9ERUJVRwogCXByaW50ayhLRVJOX0RFQlVHICJhdGtiZC5jOiBSZWNlaXZlZCAlMDJ4IGZsYWdzICUwMnhcbiIsIGRhdGEsIGZsYWdzKTsKQEAgLTI5OCwyNSArMzU0LDE3IEBACiAJaWYgKCFhdGtiZC0+ZW5hYmxlZCkKIAkJZ290byBvdXQ7CiAKLQlpbnB1dF9ldmVudChhdGtiZC0+ZGV2LCBFVl9NU0MsIE1TQ19SQVcsIGNvZGUpOworCWlucHV0X2V2ZW50KGRldiwgRVZfTVNDLCBNU0NfUkFXLCBjb2RlKTsKIAogCWlmIChhdGtiZC0+dHJhbnNsYXRlZCkgewogCi0JCWlmIChhdGtiZC0+ZW11bCB8fAotCQkgICAgKGNvZGUgIT0gQVRLQkRfUkVUX0VNVUwwICYmIGNvZGUgIT0gQVRLQkRfUkVUX0VNVUwxICYmCi0JCSAgICAgY29kZSAhPSBBVEtCRF9SRVRfSEFOR1VFTCAmJiBjb2RlICE9IEFUS0JEX1JFVF9IQU5KQSAmJgotCQkgICAgIChjb2RlICE9IEFUS0JEX1JFVF9FUlIgfHwgYXRrYmQtPmVycl94bCkgJiYKLQkgICAgICAgICAgICAgKGNvZGUgIT0gQVRLQkRfUkVUX0JBVCB8fCBhdGtiZC0+YmF0X3hsKSkpIHsKKwkJaWYgKGF0a2JkLT5lbXVsIHx8IGF0a2JkX25lZWRfeGxhdGUoYXRrYmQtPnhsX2JpdCwgY29kZSkpIHsKIAkJCWF0a2JkLT5yZWxlYXNlID0gY29kZSA+PiA3OwogCQkJY29kZSAmPSAweDdmOwogCQl9CiAKLQkJaWYgKCFhdGtiZC0+ZW11bCkgewotCQkgICAgIGlmICgoY29kZSAmIDB4N2YpID09IChBVEtCRF9SRVRfQkFUICYgMHg3ZikpCi0JCQlhdGtiZC0+YmF0X3hsID0gIShkYXRhID4+IDcpOwotCQkgICAgIGlmICgoY29kZSAmIDB4N2YpID09IChBVEtCRF9SRVRfRVJSICYgMHg3ZikpCi0JCQlhdGtiZC0+ZXJyX3hsID0gIShkYXRhID4+IDcpOwotCQl9CisJCWlmICghYXRrYmQtPmVtdWwpCisJCQlhdGtiZF9jYWxjdWxhdGVfeGxfYml0KGF0a2JkLCBkYXRhKTsKIAl9CiAKIAlzd2l0Y2ggKGNvZGUpIHsKQEAgLTMzMyw0NyArMzgxLDQ4IEBACiAJCWNhc2UgQVRLQkRfUkVUX1JFTEVBU0U6CiAJCQlhdGtiZC0+cmVsZWFzZSA9IDE7CiAJCQlnb3RvIG91dDsKLQkJY2FzZSBBVEtCRF9SRVRfSEFOR1VFTDoKLQkJCWF0a2JkX3JlcG9ydF9rZXkoYXRrYmQtPmRldiwgcmVncywgS0VZX0hBTkdVRUwsIDMpOworCQljYXNlIEFUS0JEX1JFVF9BQ0s6CisJCWNhc2UgQVRLQkRfUkVUX05BSzoKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImF0a2JkLmM6IFNwdXJpb3VzICVzIG9uICVzLiAiCisJCQkgICAgICAgIlNvbWUgcHJvZ3JhbSBtaWdodCBiZSB0cnlpbmcgYWNjZXNzIGhhcmR3YXJlIGRpcmVjdGx5LlxuIiwKKwkJCSAgICAgICBkYXRhID09IEFUS0JEX1JFVF9BQ0sgPyAiQUNLIiA6ICJOQUsiLCBzZXJpby0+cGh5cyk7CiAJCQlnb3RvIG91dDsKKwkJY2FzZSBBVEtCRF9SRVRfSEFOR0VVTDoKIAkJY2FzZSBBVEtCRF9SRVRfSEFOSkE6Ci0JCQlhdGtiZF9yZXBvcnRfa2V5KGF0a2JkLT5kZXYsIHJlZ3MsIEtFWV9IQU5KQSwgMyk7Ci0JCQlnb3RvIG91dDsKKwkJCS8qCisJCQkgKiBUaGVzZSBrZXlzIGRvIG5vdCByZXBvcnQgcmVsZWFzZSBhbmQgdGh1cyBuZWVkIHRvIGJlCisJCQkgKiBmbGFnZ2VkIHByb3Blcmx5CisJCQkgKi8KKwkJCWFkZF9yZWxlYXNlX2V2ZW50ID0gMTsKKwkJCWJyZWFrOwogCQljYXNlIEFUS0JEX1JFVF9FUlI6CiAJCQlwcmludGsoS0VSTl9ERUJVRyAiYXRrYmQuYzogS2V5Ym9hcmQgb24gJXMgcmVwb3J0cyB0b28gbWFueSBrZXlzIHByZXNzZWQuXG4iLCBzZXJpby0+cGh5cyk7CiAJCQlnb3RvIG91dDsKIAl9CiAKLQlpZiAoYXRrYmQtPnNldCAhPSAzKQotCQljb2RlID0gKGNvZGUgJiAweDdmKSB8ICgoY29kZSAmIDB4ODApIDw8IDEpOwotCWlmIChhdGtiZC0+ZW11bCkgewotCQlpZiAoLS1hdGtiZC0+ZW11bCkKLQkJCWdvdG8gb3V0OwotCQljb2RlIHw9IChhdGtiZC0+c2V0ICE9IDMpID8gMHg4MCA6IDB4MTAwOwotCX0KKwljb2RlID0gYXRrYmRfY29tcGF0X3NjYW5jb2RlKGF0a2JkLCBjb2RlKTsKIAotCWlmIChhdGtiZC0+a2V5Y29kZVtjb2RlXSAhPSBBVEtCRF9LRVlfTlVMTCkKLQkJaW5wdXRfZXZlbnQoYXRrYmQtPmRldiwgRVZfTVNDLCBNU0NfU0NBTiwgY29kZSk7CisJaWYgKGF0a2JkLT5lbXVsICYmIC0tYXRrYmQtPmVtdWwpCisJCWdvdG8gb3V0OwogCi0Jc3dpdGNoIChhdGtiZC0+a2V5Y29kZVtjb2RlXSkgeworCWtleWNvZGUgPSBhdGtiZC0+a2V5Y29kZVtjb2RlXTsKKworCWlmIChrZXljb2RlICE9IEFUS0JEX0tFWV9OVUxMKQorCQlpbnB1dF9ldmVudChkZXYsIEVWX01TQywgTVNDX1NDQU4sIGNvZGUpOworCisJc3dpdGNoIChrZXljb2RlKSB7CiAJCWNhc2UgQVRLQkRfS0VZX05VTEw6CiAJCQlicmVhazsKIAkJY2FzZSBBVEtCRF9LRVlfVU5LTk9XTjoKLQkJCWlmIChkYXRhID09IEFUS0JEX1JFVF9BQ0sgfHwgZGF0YSA9PSBBVEtCRF9SRVRfTkFLKSB7Ci0JCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYXRrYmQuYzogU3B1cmlvdXMgJXMgb24gJXMuIFNvbWUgcHJvZ3JhbSwgIgotCQkJCSAgICAgICAibGlrZSBYRnJlZTg2LCBtaWdodCBiZSB0cnlpbmcgYWNjZXNzIGhhcmR3YXJlIGRpcmVjdGx5LlxuIiwKLQkJCQkgICAgICAgZGF0YSA9PSBBVEtCRF9SRVRfQUNLID8gIkFDSyIgOiAiTkFLIiwgc2VyaW8tPnBoeXMpOwotCQkJfSBlbHNlIHsKLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJhdGtiZC5jOiBVbmtub3duIGtleSAlcyAiCi0JCQkJICAgICAgICIoJXMgc2V0ICVkLCBjb2RlICUjeCBvbiAlcykuXG4iLAotCQkJCSAgICAgICBhdGtiZC0+cmVsZWFzZSA/ICJyZWxlYXNlZCIgOiAicHJlc3NlZCIsCi0JCQkJICAgICAgIGF0a2JkLT50cmFuc2xhdGVkID8gInRyYW5zbGF0ZWQiIDogInJhdyIsCi0JCQkJICAgICAgIGF0a2JkLT5zZXQsIGNvZGUsIHNlcmlvLT5waHlzKTsKLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJhdGtiZC5jOiBVc2UgJ3NldGtleWNvZGVzICVzJTAyeCA8a2V5Y29kZT4nICIKLQkJCQkgICAgICAgInRvIG1ha2UgaXQga25vd24uXG4iLAotCQkJCSAgICAgICBjb2RlICYgMHg4MCA/ICJlMCIgOiAiIiwgY29kZSAmIDB4N2YpOwotCQkJfQotCQkJaW5wdXRfc3luYyhhdGtiZC0+ZGV2KTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSAgICAgICAiYXRrYmQuYzogVW5rbm93biBrZXkgJXMgKCVzIHNldCAlZCwgY29kZSAlI3ggb24gJXMpLlxuIiwKKwkJCSAgICAgICBhdGtiZC0+cmVsZWFzZSA/ICJyZWxlYXNlZCIgOiAicHJlc3NlZCIsCisJCQkgICAgICAgYXRrYmQtPnRyYW5zbGF0ZWQgPyAidHJhbnNsYXRlZCIgOiAicmF3IiwKKwkJCSAgICAgICBhdGtiZC0+c2V0LCBjb2RlLCBzZXJpby0+cGh5cyk7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgImF0a2JkLmM6IFVzZSAnc2V0a2V5Y29kZXMgJXMlMDJ4IDxrZXljb2RlPicgdG8gbWFrZSBpdCBrbm93bi5cbiIsCisJCQkgICAgICAgY29kZSAmIDB4ODAgPyAiZTAiIDogIiIsIGNvZGUgJiAweDdmKTsKKwkJCWlucHV0X3N5bmMoZGV2KTsKIAkJCWJyZWFrOwogCQljYXNlIEFUS0JEX1NDUl8xOgogCQkJc2Nyb2xsID0gMSAtIGF0a2JkLT5yZWxlYXNlICogMjsKQEAgLTM5NywzMyArNDQ2LDM1IEBACiAJCQloc2Nyb2xsID0gMTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJdmFsdWUgPSBhdGtiZC0+cmVsZWFzZSA/IDAgOgotCQkJCSgxICsgKCFhdGtiZC0+c29mdHJlcGVhdCAmJiB0ZXN0X2JpdChhdGtiZC0+a2V5Y29kZVtjb2RlXSwgYXRrYmQtPmRldi0+a2V5KSkpOwotCi0JCQlzd2l0Y2ggKHZhbHVlKSB7CS8qIFdvcmthcm91bmQgVG9zaGliYSBsYXB0b3AgbXVsdGlwbGUga2V5cHJlc3MgKi8KLQkJCQljYXNlIDA6Ci0JCQkJCWF0a2JkLT5sYXN0ID0gMDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAxOgotCQkJCQlhdGtiZC0+bGFzdCA9IGNvZGU7Ci0JCQkJCWF0a2JkLT50aW1lID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoYXRrYmQtPmRldi0+cmVwW1JFUF9ERUxBWV0pIC8gMjsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAyOgotCQkJCQlpZiAoIXRpbWVfYWZ0ZXIoamlmZmllcywgYXRrYmQtPnRpbWUpICYmIGF0a2JkLT5sYXN0ID09IGNvZGUpCi0JCQkJCQl2YWx1ZSA9IDE7Ci0JCQkJCWJyZWFrOworCQkJaWYgKGF0a2JkLT5yZWxlYXNlKSB7CisJCQkJdmFsdWUgPSAwOworCQkJCWF0a2JkLT5sYXN0ID0gMDsKKwkJCX0gZWxzZSBpZiAoIWF0a2JkLT5zb2Z0cmVwZWF0ICYmIHRlc3RfYml0KGtleWNvZGUsIGRldi0+a2V5KSkgeworCQkJCS8qIFdvcmthcm91bmQgVG9zaGliYSBsYXB0b3AgbXVsdGlwbGUga2V5cHJlc3MgKi8KKwkJCQl2YWx1ZSA9IHRpbWVfYmVmb3JlKGppZmZpZXMsIGF0a2JkLT50aW1lKSAmJiBhdGtiZC0+bGFzdCA9PSBjb2RlID8gMSA6IDI7CisJCQl9IGVsc2UgeworCQkJCXZhbHVlID0gMTsKKwkJCQlhdGtiZC0+bGFzdCA9IGNvZGU7CisJCQkJYXRrYmQtPnRpbWUgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhkZXYtPnJlcFtSRVBfREVMQVldKSAvIDI7CiAJCQl9CiAKLQkJCWF0a2JkX3JlcG9ydF9rZXkoYXRrYmQtPmRldiwgcmVncywgYXRrYmQtPmtleWNvZGVbY29kZV0sIHZhbHVlKTsKKwkJCWlucHV0X3JlZ3MoZGV2LCByZWdzKTsKKwkJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBrZXljb2RlLCB2YWx1ZSk7CisJCQlpbnB1dF9zeW5jKGRldik7CisKKwkJCWlmICh2YWx1ZSAmJiBhZGRfcmVsZWFzZV9ldmVudCkgeworCQkJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBrZXljb2RlLCAwKTsKKwkJCQlpbnB1dF9zeW5jKGRldik7CisJCQl9CiAJfQogCiAJaWYgKGF0a2JkLT5zY3JvbGwpIHsKLQkJaW5wdXRfcmVncyhhdGtiZC0+ZGV2LCByZWdzKTsKKwkJaW5wdXRfcmVncyhkZXYsIHJlZ3MpOwogCQlpZiAoY2xpY2sgIT0gLTEpCi0JCQlpbnB1dF9yZXBvcnRfa2V5KGF0a2JkLT5kZXYsIEJUTl9NSURETEUsIGNsaWNrKTsKLQkJaW5wdXRfcmVwb3J0X3JlbChhdGtiZC0+ZGV2LCBSRUxfV0hFRUwsIHNjcm9sbCk7Ci0JCWlucHV0X3JlcG9ydF9yZWwoYXRrYmQtPmRldiwgUkVMX0hXSEVFTCwgaHNjcm9sbCk7Ci0JCWlucHV0X3N5bmMoYXRrYmQtPmRldik7CisJCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX01JRERMRSwgY2xpY2spOworCQlpbnB1dF9yZXBvcnRfcmVsKGRldiwgUkVMX1dIRUVMLCBzY3JvbGwpOworCQlpbnB1dF9yZXBvcnRfcmVsKGRldiwgUkVMX0hXSEVFTCwgaHNjcm9sbCk7CisJCWlucHV0X3N5bmMoZGV2KTsKIAl9CiAKIAlhdGtiZC0+cmVsZWFzZSA9IDA7CkBAIC03NjQsNiArODE1LDkgQEAKIAkJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGF0a2JkX3Njcm9sbF9rZXlzKTsgaSsrKQogCQkJCWF0a2JkLT5rZXljb2RlW2F0a2JkX3Njcm9sbF9rZXlzW2ldLnNldDJdID0gYXRrYmRfc2Nyb2xsX2tleXNbaV0ua2V5Y29kZTsKIAl9CisKKwlhdGtiZC0+a2V5Y29kZVthdGtiZF9jb21wYXRfc2NhbmNvZGUoYXRrYmQsIEFUS0JEX1JFVF9IQU5HRVVMKV0gPSBLRVlfSEFOR1VFTDsKKwlhdGtiZC0+a2V5Y29kZVthdGtiZF9jb21wYXRfc2NhbmNvZGUoYXRrYmQsIEFUS0JEX1JFVF9IQU5KQSldID0gS0VZX0hBTkpBOwogfQogCiAvKgpAQCAtNzc2LDEyICs4MzAsMTUgQEAKIAlpbnQgaTsKIAogCWlmIChhdGtiZC0+ZXh0cmEpCi0JCXNwcmludGYoYXRrYmQtPm5hbWUsICJBVCBTZXQgMiBFeHRyYSBrZXlib2FyZCIpOworCQlzbnByaW50ZihhdGtiZC0+bmFtZSwgc2l6ZW9mKGF0a2JkLT5uYW1lKSwKKwkJCSAiQVQgU2V0IDIgRXh0cmEga2V5Ym9hcmQiKTsKIAllbHNlCi0JCXNwcmludGYoYXRrYmQtPm5hbWUsICJBVCAlcyBTZXQgJWQga2V5Ym9hcmQiLAotCQkJYXRrYmQtPnRyYW5zbGF0ZWQgPyAiVHJhbnNsYXRlZCIgOiAiUmF3IiwgYXRrYmQtPnNldCk7CisJCXNucHJpbnRmKGF0a2JkLT5uYW1lLCBzaXplb2YoYXRrYmQtPm5hbWUpLAorCQkJICJBVCAlcyBTZXQgJWQga2V5Ym9hcmQiLAorCQkJIGF0a2JkLT50cmFuc2xhdGVkID8gIlRyYW5zbGF0ZWQiIDogIlJhdyIsIGF0a2JkLT5zZXQpOwogCi0Jc3ByaW50ZihhdGtiZC0+cGh5cywgIiVzL2lucHV0MCIsIGF0a2JkLT5wczJkZXYuc2VyaW8tPnBoeXMpOworCXNucHJpbnRmKGF0a2JkLT5waHlzLCBzaXplb2YoYXRrYmQtPnBoeXMpLAorCQkgIiVzL2lucHV0MCIsIGF0a2JkLT5wczJkZXYuc2VyaW8tPnBoeXMpOwogCiAJaW5wdXRfZGV2LT5uYW1lID0gYXRrYmQtPm5hbWU7CiAJaW5wdXRfZGV2LT5waHlzID0gYXRrYmQtPnBoeXM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2xra2JkLmMgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2xra2JkLmMKaW5kZXggNzdjNGQ5Ni4uNTE3NDIyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9sa2tiZC5jCisrKyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvbGtrYmQuYwpAQCAtMzg0LDE4ICszODQsMjEgQEAKIAkgKi8KIAlzd2l0Y2ggKGxrLT5pZFs0XSkgewogCQljYXNlIDE6Ci0JCQlzcHJpbnRmIChsay0+bmFtZSwgIkRFQyBMSzIwMSBrZXlib2FyZCIpOworCQkJc3RybGNweSAobGstPm5hbWUsICJERUMgTEsyMDEga2V5Ym9hcmQiLAorCQkJCSBzaXplb2YgKGxrLT5uYW1lKSk7CiAKIAkJCWlmIChsazIwMV9jb21wb3NlX2lzX2FsdCkKIAkJCQlsay0+a2V5Y29kZVsweGIxXSA9IEtFWV9MRUZUQUxUOwogCQkJYnJlYWs7CiAKIAkJY2FzZSAyOgotCQkJc3ByaW50ZiAobGstPm5hbWUsICJERUMgTEs0MDEga2V5Ym9hcmQiKTsKKwkJCXN0cmxjcHkgKGxrLT5uYW1lLCAiREVDIExLNDAxIGtleWJvYXJkIiwKKwkJCQkgc2l6ZW9mIChsay0+bmFtZSkpOwogCQkJYnJlYWs7CiAKIAkJZGVmYXVsdDoKLQkJCXNwcmludGYgKGxrLT5uYW1lLCAiVW5rbm93biBERUMga2V5Ym9hcmQiKTsKKwkJCXN0cmxjcHkgKGxrLT5uYW1lLCAiVW5rbm93biBERUMga2V5Ym9hcmQiLAorCQkJCSBzaXplb2YgKGxrLT5uYW1lKSk7CiAJCQlwcmludGsgKEtFUk5fRVJSICJsa2tiZDoga2V5Ym9hcmQgb24gJXMgaXMgdW5rbm93biwgIgogCQkJCQkicGxlYXNlIHJlcG9ydCB0byBKYW4tQmVuZWRpY3QgR2xhdyAiCiAJCQkJCSI8amJnbGF3QGx1Zy1vd2wuZGU+XG4iLCBsay0+cGh5cyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL25ld3RvbmtiZC5jIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9uZXd0b25rYmQuYwppbmRleCBkMTA5ODNjLi40MGEzZjU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL25ld3RvbmtiZC5jCisrKyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvbmV3dG9ua2JkLmMKQEAgLTk2LDcgKzk2LDcgQEAKIAogCW5rYmQtPnNlcmlvID0gc2VyaW87CiAJbmtiZC0+ZGV2ID0gaW5wdXRfZGV2OwotCXNwcmludGYobmtiZC0+cGh5cywgIiVzL2lucHV0MCIsIHNlcmlvLT5waHlzKTsKKwlzbnByaW50Zihua2JkLT5waHlzLCBzaXplb2YobmtiZC0+cGh5cyksICIlcy9pbnB1dDAiLCBzZXJpby0+cGh5cyk7CiAJbWVtY3B5KG5rYmQtPmtleWNvZGUsIG5rYmRfa2V5Y29kZSwgc2l6ZW9mKG5rYmQtPmtleWNvZGUpKTsKIAogCWlucHV0X2Rldi0+bmFtZSA9ICJOZXd0b24gS2V5Ym9hcmQiOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9zdW5rYmQuYyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvc3Vua2JkLmMKaW5kZXggYjE1YjZkOC4uOWRiZDdiOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9zdW5rYmQuYworKysgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL3N1bmtiZC5jCkBAIC0yNjMsNyArMjYzLDcgQEAKIAkJZ290byBmYWlsOwogCX0KIAotCXNwcmludGYoc3Vua2JkLT5uYW1lLCAiU3VuIFR5cGUgJWQga2V5Ym9hcmQiLCBzdW5rYmQtPnR5cGUpOworCXNucHJpbnRmKHN1bmtiZC0+bmFtZSwgc2l6ZW9mKHN1bmtiZC0+bmFtZSksICJTdW4gVHlwZSAlZCBrZXlib2FyZCIsIHN1bmtiZC0+dHlwZSk7CiAJbWVtY3B5KHN1bmtiZC0+a2V5Y29kZSwgc3Vua2JkX2tleWNvZGUsIHNpemVvZihzdW5rYmQtPmtleWNvZGUpKTsKIAogCWlucHV0X2Rldi0+bmFtZSA9IHN1bmtiZC0+bmFtZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQveHRrYmQuYyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQveHRrYmQuYwppbmRleCA0MTM1ZTNlLi4wODIxZDUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL3h0a2JkLmMKKysrIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC94dGtiZC5jCkBAIC0xMDAsNyArMTAwLDcgQEAKIAogCXh0a2JkLT5zZXJpbyA9IHNlcmlvOwogCXh0a2JkLT5kZXYgPSBpbnB1dF9kZXY7Ci0Jc3ByaW50Zih4dGtiZC0+cGh5cywgIiVzL2lucHV0MCIsIHNlcmlvLT5waHlzKTsKKwlzbnByaW50Zih4dGtiZC0+cGh5cywgc2l6ZW9mKHh0a2JkLT5waHlzKSwgIiVzL2lucHV0MCIsIHNlcmlvLT5waHlzKTsKIAltZW1jcHkoeHRrYmQtPmtleWNvZGUsIHh0a2JkX2tleWNvZGUsIHNpemVvZih4dGtiZC0+a2V5Y29kZSkpOwogCiAJaW5wdXRfZGV2LT5uYW1lID0gIlhUIEtleWJvYXJkIjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbW91c2UvYWxwcy5jIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9hbHBzLmMKaW5kZXggYTBlMmU3OS4uMDcwZDc1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9tb3VzZS9hbHBzLmMKKysrIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9hbHBzLmMKQEAgLTQ3MCw3ICs0NzAsNyBAQAogCQlkZXYxLT5rZXliaXRbTE9ORyhCVE5fQkFDSyldIHw9IEJJVChCVE5fQkFDSyk7CiAJfQogCi0Jc3ByaW50Zihwcml2LT5waHlzLCAiJXMvaW5wdXQxIiwgcHNtb3VzZS0+cHMyZGV2LnNlcmlvLT5waHlzKTsKKwlzbnByaW50Zihwcml2LT5waHlzLCBzaXplb2YocHJpdi0+cGh5cyksICIlcy9pbnB1dDEiLCBwc21vdXNlLT5wczJkZXYuc2VyaW8tPnBoeXMpOwogCWRldjItPnBoeXMgPSBwcml2LT5waHlzOwogCWRldjItPm5hbWUgPSAocHJpdi0+aS0+ZmxhZ3MgJiBBTFBTX0RVQUxQT0lOVCkgPyAiRHVhbFBvaW50IFN0aWNrIiA6ICJQUy8yIE1vdXNlIjsKIAlkZXYyLT5pZC5idXN0eXBlID0gQlVTX0k4MDQyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9tb3VzZS9wc21vdXNlLWJhc2UuYyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvcHNtb3VzZS1iYXNlLmMKaW5kZXggMTM2MzIxYS4uOGJjOWY1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9tb3VzZS9wc21vdXNlLWJhc2UuYworKysgYi9kcml2ZXJzL2lucHV0L21vdXNlL3BzbW91c2UtYmFzZS5jCkBAIC0xNTAsOSArMTUwLDIwIEBACiAgKi8KIAogCWlmIChwc21vdXNlLT50eXBlID09IFBTTU9VU0VfSU1FWCkgewotCQlpbnB1dF9yZXBvcnRfcmVsKGRldiwgUkVMX1dIRUVMLCAoaW50KSAocGFja2V0WzNdICYgOCkgLSAoaW50KSAocGFja2V0WzNdICYgNykpOwotCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1NJREUsIChwYWNrZXRbM10gPj4gNCkgJiAxKTsKLQkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9FWFRSQSwgKHBhY2tldFszXSA+PiA1KSAmIDEpOworCQlzd2l0Y2ggKHBhY2tldFszXSAmIDB4QzApIHsKKwkJCWNhc2UgMHg4MDogLyogdmVydGljYWwgc2Nyb2xsIG9uIEludGVsbGlNb3VzZSBFeHBsb3JlciA0LjAgKi8KKwkJCQlpbnB1dF9yZXBvcnRfcmVsKGRldiwgUkVMX1dIRUVMLCAoaW50KSAocGFja2V0WzNdICYgMzIpIC0gKGludCkgKHBhY2tldFszXSAmIDMxKSk7CisJCQkJYnJlYWs7CisJCQljYXNlIDB4NDA6IC8qIGhvcml6b250YWwgc2Nyb2xsIG9uIEludGVsbGlNb3VzZSBFeHBsb3JlciA0LjAgKi8KKwkJCQlpbnB1dF9yZXBvcnRfcmVsKGRldiwgUkVMX0hXSEVFTCwgKGludCkgKHBhY2tldFszXSAmIDMyKSAtIChpbnQpIChwYWNrZXRbM10gJiAzMSkpOworCQkJCWJyZWFrOworCQkJY2FzZSAweDAwOgorCQkJY2FzZSAweEMwOgorCQkJCWlucHV0X3JlcG9ydF9yZWwoZGV2LCBSRUxfV0hFRUwsIChpbnQpIChwYWNrZXRbM10gJiA4KSAtIChpbnQpIChwYWNrZXRbM10gJiA3KSk7CisJCQkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9TSURFLCAocGFja2V0WzNdID4+IDQpICYgMSk7CisJCQkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9FWFRSQSwgKHBhY2tldFszXSA+PiA1KSAmIDEpOworCQkJCWJyZWFrOworCQl9CiAJfQogCiAvKgpAQCAtNDY2LDkgKzQ3NywyNSBAQAogCWlmIChwYXJhbVswXSAhPSA0KQogCQlyZXR1cm4gLTE7CiAKKy8qIE1hZ2ljIHRvIGVuYWJsZSBob3Jpem9udGFsIHNjcm9sbGluZyBvbiBJbnRlbGxpTW91c2UgNC4wICovCisJcGFyYW1bMF0gPSAyMDA7CisJcHMyX2NvbW1hbmQocHMyZGV2LCBwYXJhbSwgUFNNT1VTRV9DTURfU0VUUkFURSk7CisJcGFyYW1bMF0gPSAgODA7CisJcHMyX2NvbW1hbmQocHMyZGV2LCBwYXJhbSwgUFNNT1VTRV9DTURfU0VUUkFURSk7CisJcGFyYW1bMF0gPSAgNDA7CisJcHMyX2NvbW1hbmQocHMyZGV2LCBwYXJhbSwgUFNNT1VTRV9DTURfU0VUUkFURSk7CisKKwlwYXJhbVswXSA9IDIwMDsKKwlwczJfY29tbWFuZChwczJkZXYsIHBhcmFtLCBQU01PVVNFX0NNRF9TRVRSQVRFKTsKKwlwYXJhbVswXSA9IDIwMDsKKwlwczJfY29tbWFuZChwczJkZXYsIHBhcmFtLCBQU01PVVNFX0NNRF9TRVRSQVRFKTsKKwlwYXJhbVswXSA9ICA2MDsKKwlwczJfY29tbWFuZChwczJkZXYsIHBhcmFtLCBQU01PVVNFX0NNRF9TRVRSQVRFKTsKKwogCWlmIChzZXRfcHJvcGVydGllcykgewogCQlzZXRfYml0KEJUTl9NSURETEUsIHBzbW91c2UtPmRldi0+a2V5Yml0KTsKIAkJc2V0X2JpdChSRUxfV0hFRUwsIHBzbW91c2UtPmRldi0+cmVsYml0KTsKKwkJc2V0X2JpdChSRUxfSFdIRUVMLCBwc21vdXNlLT5kZXYtPnJlbGJpdCk7CiAJCXNldF9iaXQoQlROX1NJREUsIHBzbW91c2UtPmRldi0+a2V5Yml0KTsKIAkJc2V0X2JpdChCVE5fRVhUUkEsIHBzbW91c2UtPmRldi0+a2V5Yml0KTsKIApAQCAtMTA1Nyw4ICsxMDg0LDggQEAKIAlpZiAocHNtb3VzZS0+cmVzeW5jX3RpbWUgJiYgcHNtb3VzZS0+cG9sbChwc21vdXNlKSkKIAkJcHNtb3VzZS0+cmVzeW5jX3RpbWUgPSAwOwogCi0Jc3ByaW50Zihwc21vdXNlLT5kZXZuYW1lLCAiJXMgJXMgJXMiLAotCQlwc21vdXNlX3Byb3RvY29sX2J5X3R5cGUocHNtb3VzZS0+dHlwZSktPm5hbWUsIHBzbW91c2UtPnZlbmRvciwgcHNtb3VzZS0+bmFtZSk7CisJc25wcmludGYocHNtb3VzZS0+ZGV2bmFtZSwgc2l6ZW9mKHBzbW91c2UtPmRldm5hbWUpLCAiJXMgJXMgJXMiLAorCQkgcHNtb3VzZV9wcm90b2NvbF9ieV90eXBlKHBzbW91c2UtPnR5cGUpLT5uYW1lLCBwc21vdXNlLT52ZW5kb3IsIHBzbW91c2UtPm5hbWUpOwogCiAJaW5wdXRfZGV2LT5uYW1lID0gcHNtb3VzZS0+ZGV2bmFtZTsKIAlpbnB1dF9kZXYtPnBoeXMgPSBwc21vdXNlLT5waHlzOwpAQCAtMTA5OSw3ICsxMTI2LDcgQEAKIAlwczJfaW5pdCgmcHNtb3VzZS0+cHMyZGV2LCBzZXJpbyk7CiAJSU5JVF9XT1JLKCZwc21vdXNlLT5yZXN5bmNfd29yaywgcHNtb3VzZV9yZXN5bmMsIHBzbW91c2UpOwogCXBzbW91c2UtPmRldiA9IGlucHV0X2RldjsKLQlzcHJpbnRmKHBzbW91c2UtPnBoeXMsICIlcy9pbnB1dDAiLCBzZXJpby0+cGh5cyk7CisJc25wcmludGYocHNtb3VzZS0+cGh5cywgc2l6ZW9mKHBzbW91c2UtPnBoeXMpLCAiJXMvaW5wdXQwIiwgc2VyaW8tPnBoeXMpOwogCiAJcHNtb3VzZV9zZXRfc3RhdGUocHNtb3VzZSwgUFNNT1VTRV9JTklUSUFMSVpJTkcpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlL3Nlcm1vdXNlLmMgYi9kcml2ZXJzL2lucHV0L21vdXNlL3Nlcm1vdXNlLmMKaW5kZXggMmY5YTA0YS4uYTg5NzQyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9tb3VzZS9zZXJtb3VzZS5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2Uvc2VybW91c2UuYwpAQCAtMjU0LDcgKzI1NCw3IEBACiAJCWdvdG8gZmFpbDsKIAogCXNlcm1vdXNlLT5kZXYgPSBpbnB1dF9kZXY7Ci0Jc3ByaW50ZihzZXJtb3VzZS0+cGh5cywgIiVzL2lucHV0MCIsIHNlcmlvLT5waHlzKTsKKwlzbnByaW50ZihzZXJtb3VzZS0+cGh5cywgc2l6ZW9mKHNlcm1vdXNlLT5waHlzKSwgIiVzL2lucHV0MCIsIHNlcmlvLT5waHlzKTsKIAlzZXJtb3VzZS0+dHlwZSA9IHNlcmlvLT5pZC5wcm90bzsKIAogCWlucHV0X2Rldi0+bmFtZSA9IHNlcm1vdXNlX3Byb3RvY29sc1tzZXJtb3VzZS0+dHlwZV07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlL3ZzeHh4YWEuYyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvdnN4eHhhYS5jCmluZGV4IDM2ZTk0NDIuLjdiODViYzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbW91c2UvdnN4eHhhYS5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvdnN4eHhhYS5jCkBAIC0xNTMsMjIgKzE1MywyNSBAQAogewogCXN3aXRjaCAobW91c2UtPnR5cGUpIHsKIAkJY2FzZSAweDAyOgotCQkJc3ByaW50ZiAobW91c2UtPm5hbWUsICJERUMgVlNYWFgtQUEvLUdBIG1vdXNlIik7CisJCQlzdHJsY3B5IChtb3VzZS0+bmFtZSwgIkRFQyBWU1hYWC1BQS8tR0EgbW91c2UiLAorCQkJCSBzaXplb2YgKG1vdXNlLT5uYW1lKSk7CiAJCQlicmVhazsKIAogCQljYXNlIDB4MDQ6Ci0JCQlzcHJpbnRmIChtb3VzZS0+bmFtZSwgIkRFQyBWU1hYWC1BQiBkaWdpdGl6ZXIiKTsKKwkJCXN0cmxjcHkgKG1vdXNlLT5uYW1lLCAiREVDIFZTWFhYLUFCIGRpZ2l0aXplciIsCisJCQkJIHNpemVvZiAobW91c2UtPm5hbWUpKTsKIAkJCWJyZWFrOwogCiAJCWRlZmF1bHQ6Ci0JCQlzcHJpbnRmIChtb3VzZS0+bmFtZSwgInVua25vd24gREVDIHBvaW50ZXIgZGV2aWNlICIKLQkJCQkJIih0eXBlID0gMHglMDJ4KSIsIG1vdXNlLT50eXBlKTsKKwkJCXNucHJpbnRmIChtb3VzZS0+bmFtZSwgc2l6ZW9mIChtb3VzZS0+bmFtZSksCisJCQkJICAidW5rbm93biBERUMgcG9pbnRlciBkZXZpY2UgKHR5cGUgPSAweCUwMngpIiwKKwkJCQkgIG1vdXNlLT50eXBlKTsKIAkJCWJyZWFrOwogCX0KIAotCXByaW50ayAoS0VSTl9JTkZPICJGb3VuZCAlcyB2ZXJzaW9uIDB4JTAyeCBmcm9tIGNvdW50cnkgMHglMDJ4ICIKLQkJCSJvbiBwb3J0ICVzXG4iLCBtb3VzZS0+bmFtZSwgbW91c2UtPnZlcnNpb24sCi0JCQltb3VzZS0+Y291bnRyeSwgbW91c2UtPnBoeXMpOworCXByaW50ayAoS0VSTl9JTkZPCisJCSJGb3VuZCAlcyB2ZXJzaW9uIDB4JTAyeCBmcm9tIGNvdW50cnkgMHglMDJ4IG9uIHBvcnQgJXNcbiIsCisJCW1vdXNlLT5uYW1lLCBtb3VzZS0+dmVyc2lvbiwgbW91c2UtPmNvdW50cnksIG1vdXNlLT5waHlzKTsKIH0KIAogLyoKQEAgLTUwMyw4ICs1MDYsOSBAQAogCiAJbW91c2UtPmRldiA9IGlucHV0X2RldjsKIAltb3VzZS0+c2VyaW8gPSBzZXJpbzsKLQlzcHJpbnRmIChtb3VzZS0+bmFtZSwgIkRFQyBWU1hYWC1BQS8tR0EgbW91c2Ugb3IgVlNYWFgtQUIgZGlnaXRpemVyIik7Ci0Jc3ByaW50ZiAobW91c2UtPnBoeXMsICIlcy9pbnB1dDAiLCBzZXJpby0+cGh5cyk7CisJc3RybGNhdCAobW91c2UtPm5hbWUsICJERUMgVlNYWFgtQUEvLUdBIG1vdXNlIG9yIFZTWFhYLUFCIGRpZ2l0aXplciIsCisJCSBzaXplb2YgKG1vdXNlLT5uYW1lKSk7CisJc25wcmludGYgKG1vdXNlLT5waHlzLCBzaXplb2YgKG1vdXNlLT5waHlzKSwgIiVzL2lucHV0MCIsIHNlcmlvLT5waHlzKTsKIAogCWlucHV0X2Rldi0+bmFtZSA9IG1vdXNlLT5uYW1lOwogCWlucHV0X2Rldi0+cGh5cyA9IG1vdXNlLT5waHlzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9tb3VzZWRldi5jIGIvZHJpdmVycy9pbnB1dC9tb3VzZWRldi5jCmluZGV4IGI2ODVhNTAuLmViNzIxYjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbW91c2VkZXYuYworKysgYi9kcml2ZXJzL2lucHV0L21vdXNlZGV2LmMKQEAgLTEyMyw3ICsxMjMsOSBAQAogCiAJaWYgKG1vdXNlZGV2LT50b3VjaCkgewogCQlzaXplID0gZGV2LT5hYnNtYXhbQUJTX1hdIC0gZGV2LT5hYnNtaW5bQUJTX1hdOwotCQlpZiAoc2l6ZSA9PSAwKSBzaXplID0gMjU2ICogMjsKKwkJaWYgKHNpemUgPT0gMCkKKwkJCXNpemUgPSAyNTYgKiAyOworCiAJCXN3aXRjaCAoY29kZSkgewogCQkJY2FzZSBBQlNfWDoKIAkJCQlmeCgwKSA9IHZhbHVlOwpAQCAtMTU1LDE4ICsxNTcsMjQgQEAKIAlzd2l0Y2ggKGNvZGUpIHsKIAkJY2FzZSBBQlNfWDoKIAkJCXNpemUgPSBkZXYtPmFic21heFtBQlNfWF0gLSBkZXYtPmFic21pbltBQlNfWF07Ci0JCQlpZiAoc2l6ZSA9PSAwKSBzaXplID0geHJlcyA/IDogMTsKLQkJCWlmICh2YWx1ZSA+IGRldi0+YWJzbWF4W0FCU19YXSkgdmFsdWUgPSBkZXYtPmFic21heFtBQlNfWF07Ci0JCQlpZiAodmFsdWUgPCBkZXYtPmFic21pbltBQlNfWF0pIHZhbHVlID0gZGV2LT5hYnNtaW5bQUJTX1hdOworCQkJaWYgKHNpemUgPT0gMCkKKwkJCQlzaXplID0geHJlcyA/IDogMTsKKwkJCWlmICh2YWx1ZSA+IGRldi0+YWJzbWF4W0FCU19YXSkKKwkJCQl2YWx1ZSA9IGRldi0+YWJzbWF4W0FCU19YXTsKKwkJCWlmICh2YWx1ZSA8IGRldi0+YWJzbWluW0FCU19YXSkKKwkJCQl2YWx1ZSA9IGRldi0+YWJzbWluW0FCU19YXTsKIAkJCW1vdXNlZGV2LT5wYWNrZXQueCA9ICgodmFsdWUgLSBkZXYtPmFic21pbltBQlNfWF0pICogeHJlcykgLyBzaXplOwogCQkJbW91c2VkZXYtPnBhY2tldC5hYnNfZXZlbnQgPSAxOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBBQlNfWToKIAkJCXNpemUgPSBkZXYtPmFic21heFtBQlNfWV0gLSBkZXYtPmFic21pbltBQlNfWV07Ci0JCQlpZiAoc2l6ZSA9PSAwKSBzaXplID0geXJlcyA/IDogMTsKLQkJCWlmICh2YWx1ZSA+IGRldi0+YWJzbWF4W0FCU19ZXSkgdmFsdWUgPSBkZXYtPmFic21heFtBQlNfWV07Ci0JCQlpZiAodmFsdWUgPCBkZXYtPmFic21pbltBQlNfWV0pIHZhbHVlID0gZGV2LT5hYnNtaW5bQUJTX1ldOworCQkJaWYgKHNpemUgPT0gMCkKKwkJCQlzaXplID0geXJlcyA/IDogMTsKKwkJCWlmICh2YWx1ZSA+IGRldi0+YWJzbWF4W0FCU19ZXSkKKwkJCQl2YWx1ZSA9IGRldi0+YWJzbWF4W0FCU19ZXTsKKwkJCWlmICh2YWx1ZSA8IGRldi0+YWJzbWluW0FCU19ZXSkKKwkJCQl2YWx1ZSA9IGRldi0+YWJzbWluW0FCU19ZXTsKIAkJCW1vdXNlZGV2LT5wYWNrZXQueSA9IHlyZXMgLSAoKHZhbHVlIC0gZGV2LT5hYnNtaW5bQUJTX1ldKSAqIHlyZXMpIC8gc2l6ZTsKIAkJCW1vdXNlZGV2LT5wYWNrZXQuYWJzX2V2ZW50ID0gMTsKIAkJCWJyZWFrOwpAQCAtMjAyLDcgKzIxMCw3IEBACiAJCWNhc2UgQlROX1NJREU6CQlpbmRleCA9IDM7IGJyZWFrOwogCQljYXNlIEJUTl80OgogCQljYXNlIEJUTl9FWFRSQToJCWluZGV4ID0gNDsgYnJlYWs7Ci0JCWRlZmF1bHQ6IAkJcmV0dXJuOworCQlkZWZhdWx0OgkJcmV0dXJuOwogCX0KIAogCWlmICh2YWx1ZSkgewpAQCAtMjg1LDEwICsyOTMsOSBAQAogCQltb3VzZWRldi0+dG91Y2ggPSBtb3VzZWRldi0+cGt0X2NvdW50ID0gMDsKIAkJbW91c2VkZXYtPmZyYWNfZHggPSAwOwogCQltb3VzZWRldi0+ZnJhY19keSA9IDA7Ci0JfQotCWVsc2UKLQkJaWYgKCFtb3VzZWRldi0+dG91Y2gpCi0JCQltb3VzZWRldi0+dG91Y2ggPSBqaWZmaWVzOworCisJfSBlbHNlIGlmICghbW91c2VkZXYtPnRvdWNoKQorCQltb3VzZWRldi0+dG91Y2ggPSBqaWZmaWVzOwogfQogCiBzdGF0aWMgdm9pZCBtb3VzZWRldl9ldmVudChzdHJ1Y3QgaW5wdXRfaGFuZGxlICpoYW5kbGUsIHVuc2lnbmVkIGludCB0eXBlLCB1bnNpZ25lZCBpbnQgY29kZSwgaW50IHZhbHVlKQpAQCAtMzI3LDcgKzMzNCw3IEBACiAJCQkJCW1vdXNlZGV2LT5wa3RfY291bnQrKzsKIAkJCQkJLyogSW5wdXQgc3lzdGVtIGVhdHMgZHVwbGljYXRlIGV2ZW50cywgYnV0IHdlIG5lZWQgYWxsIG9mIHRoZW0KIAkJCQkJICogdG8gZG8gY29ycmVjdCBhdmVyYWdpbmcgc28gYXBwbHkgcHJlc2VudCBvbmUgZm9yd2FyZAotCQkJIAkJICovCisJCQkJCSAqLwogCQkJCQlmeCgwKSA9IGZ4KDEpOwogCQkJCQlmeSgwKSA9IGZ5KDEpOwogCQkJCX0KQEAgLTM0Niw3ICszNTMsOSBAQAogewogCWludCByZXR2YWw7CiAJc3RydWN0IG1vdXNlZGV2X2xpc3QgKmxpc3QgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKIAlyZXR2YWwgPSBmYXN5bmNfaGVscGVyKGZkLCBmaWxlLCBvbiwgJmxpc3QtPmZhc3luYyk7CisKIAlyZXR1cm4gcmV0dmFsIDwgMCA/IHJldHZhbCA6IDA7CiB9CiAKQEAgLTUwNywxNCArNTE2LDE2IEBACiAJCQkJbGlzdC0+aW1leHNlcSA9IDA7CiAJCQkJbGlzdC0+bW9kZSA9IE1PVVNFREVWX0VNVUxfRVhQUzsKIAkJCX0KLQkJfSBlbHNlIGxpc3QtPmltZXhzZXEgPSAwOworCQl9IGVsc2UKKwkJCWxpc3QtPmltZXhzZXEgPSAwOwogCiAJCWlmIChjID09IG1vdXNlZGV2X2ltcHNfc2VxW2xpc3QtPmltcHNzZXFdKSB7CiAJCQlpZiAoKytsaXN0LT5pbXBzc2VxID09IE1PVVNFREVWX1NFUV9MRU4pIHsKIAkJCQlsaXN0LT5pbXBzc2VxID0gMDsKIAkJCQlsaXN0LT5tb2RlID0gTU9VU0VERVZfRU1VTF9JTVBTOwogCQkJfQotCQl9IGVsc2UgbGlzdC0+aW1wc3NlcSA9IDA7CisJCX0gZWxzZQorCQkJbGlzdC0+aW1wc3NlcSA9IDA7CiAKIAkJbGlzdC0+cHMyWzBdID0gMHhmYTsKIApAQCAtNTk4LDYgKzYwOSw3IEBACiBzdGF0aWMgdW5zaWduZWQgaW50IG1vdXNlZGV2X3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpCiB7CiAJc3RydWN0IG1vdXNlZGV2X2xpc3QgKmxpc3QgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKIAlwb2xsX3dhaXQoZmlsZSwgJmxpc3QtPm1vdXNlZGV2LT53YWl0LCB3YWl0KTsKIAlyZXR1cm4gKChsaXN0LT5yZWFkeSB8fCBsaXN0LT5idWZmZXIpID8gKFBPTExJTiB8IFBPTExSRE5PUk0pIDogMCkgfAogCQkobGlzdC0+bW91c2VkZXYtPmV4aXN0ID8gMCA6IChQT0xMSFVQIHwgUE9MTEVSUikpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hZHM3ODQ2LmMgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2Fkczc4NDYuYwppbmRleCAxNjFhZmRkLi4zODYwMjNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2Fkczc4NDYuYworKysgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2Fkczc4NDYuYwpAQCAtNzczLDggKzc3Myw3IEBACiAKIAl0cy0+bGFzdF9tc2cgPSBtOwogCi0JaWYgKHJlcXVlc3RfaXJxKHNwaS0+aXJxLCBhZHM3ODQ2X2lycSwKLQkJCVNBX1NBTVBMRV9SQU5ET00gfCBTQV9UUklHR0VSX0ZBTExJTkcsCisJaWYgKHJlcXVlc3RfaXJxKHNwaS0+aXJxLCBhZHM3ODQ2X2lycSwgU0FfVFJJR0dFUl9GQUxMSU5HLAogCQkJc3BpLT5kZXYuZHJpdmVyLT5uYW1lLCB0cykpIHsKIAkJZGV2X2RiZygmc3BpLT5kZXYsICJpcnEgJWQgYnVzeT9cbiIsIHNwaS0+aXJxKTsKIAkJZXJyID0gLUVCVVNZOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9ndW56ZS5jIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9ndW56ZS5jCmluZGV4IDQ2NmRhMTkuLmI3NjliMjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vZ3VuemUuYworKysgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2d1bnplLmMKQEAgLTEyOSw3ICsxMjksNyBAQAogCiAJZ3VuemUtPnNlcmlvID0gc2VyaW87CiAJZ3VuemUtPmRldiA9IGlucHV0X2RldjsKLQlzcHJpbnRmKGd1bnplLT5waHlzLCAiJXMvaW5wdXQwIiwgc2VyaW8tPnBoeXMpOworCXNucHJpbnRmKGd1bnplLT5waHlzLCBzaXplb2Yoc2VyaW8tPnBoeXMpLCAiJXMvaW5wdXQwIiwgc2VyaW8tPnBoeXMpOwogCiAJaW5wdXRfZGV2LT5wcml2YXRlID0gZ3VuemU7CiAJaW5wdXRfZGV2LT5uYW1lID0gIkd1bnplIEFITC01MVMgVG91Y2hTY3JlZW4iOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9oMzYwMF90c19pbnB1dC5jIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9oMzYwMF90c19pbnB1dC5jCmluZGV4IGExOGQ1NmIuLjJkZTIxMzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vaDM2MDBfdHNfaW5wdXQuYworKysgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2gzNjAwX3RzX2lucHV0LmMKQEAgLTM2Myw3ICszNjMsNyBAQAogCiAJdHMtPnNlcmlvID0gc2VyaW87CiAJdHMtPmRldiA9IGlucHV0X2RldjsKLQlzcHJpbnRmKHRzLT5waHlzLCAiJXMvaW5wdXQwIiwgc2VyaW8tPnBoeXMpOworCXNucHJpbnRmKHRzLT5waHlzLCBzaXplb2YodHMtPnBoeXMpLCAiJXMvaW5wdXQwIiwgc2VyaW8tPnBoeXMpOwogCiAJaW5wdXRfZGV2LT5uYW1lID0gIkgzNjAwIFRvdWNoU2NyZWVuIjsKIAlpbnB1dF9kZXYtPnBoeXMgPSB0cy0+cGh5czsKQEAgLTM5OSwxNiArMzk5LDE0IEBACiAJc2V0X0dQSU9fSVJRX2VkZ2UoR1BJT19CSVRTWV9OUE9XRVJfQlVUVE9OLCBHUElPX1JJU0lOR19FREdFKTsKIAogCWlmIChyZXF1ZXN0X2lycShJUlFfR1BJT19CSVRTWV9BQ1RJT05fQlVUVE9OLCBhY3Rpb25fYnV0dG9uX2hhbmRsZXIsCi0JCQlTQV9TSElSUSB8IFNBX0lOVEVSUlVQVCB8IFNBX1NBTVBMRV9SQU5ET00sCi0JCQkiaDM2MDBfYWN0aW9uIiwgJnRzLT5kZXYpKSB7CisJCQlTQV9TSElSUSB8IFNBX0lOVEVSUlVQVCwgImgzNjAwX2FjdGlvbiIsICZ0cy0+ZGV2KSkgewogCQlwcmludGsoS0VSTl9FUlIgImgzNjAwdHMuYzogQ291bGQgbm90IGFsbG9jYXRlIEFjdGlvbiBCdXR0b24gSVJRIVxuIik7CiAJCWVyciA9IC1FQlVTWTsKIAkJZ290byBmYWlsMjsKIAl9CiAKIAlpZiAocmVxdWVzdF9pcnEoSVJRX0dQSU9fQklUU1lfTlBPV0VSX0JVVFRPTiwgbnBvd2VyX2J1dHRvbl9oYW5kbGVyLAotCQkJU0FfU0hJUlEgfCBTQV9JTlRFUlJVUFQgfCBTQV9TQU1QTEVfUkFORE9NLAotCQkJImgzNjAwX3N1c3BlbmQiLCAmdHMtPmRldikpIHsKKwkJCVNBX1NISVJRIHwgU0FfSU5URVJSVVBULCAiaDM2MDBfc3VzcGVuZCIsICZ0cy0+ZGV2KSkgewogCQlwcmludGsoS0VSTl9FUlIgImgzNjAwdHMuYzogQ291bGQgbm90IGFsbG9jYXRlIFBvd2VyIEJ1dHRvbiBJUlEhXG4iKTsKIAkJZXJyID0gLUVCVVNZOwogCQlnb3RvIGZhaWwzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9tdG91Y2guYyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vbXRvdWNoLmMKaW5kZXggMWQwZDM3ZS4uODY0N2E5MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9tdG91Y2guYworKysgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL210b3VjaC5jCkBAIC0xNDMsNyArMTQzLDcgQEAKIAogCW10b3VjaC0+c2VyaW8gPSBzZXJpbzsKIAltdG91Y2gtPmRldiA9IGlucHV0X2RldjsKLQlzcHJpbnRmKG10b3VjaC0+cGh5cywgIiVzL2lucHV0MCIsIHNlcmlvLT5waHlzKTsKKwlzbnByaW50ZihtdG91Y2gtPnBoeXMsIHNpemVvZihtdG91Y2gtPnBoeXMpLCAiJXMvaW5wdXQwIiwgc2VyaW8tPnBoeXMpOwogCiAJaW5wdXRfZGV2LT5wcml2YXRlID0gbXRvdWNoOwogCWlucHV0X2Rldi0+bmFtZSA9ICJNaWNyb1RvdWNoIFNlcmlhbCBUb3VjaFNjcmVlbiI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RzZGV2LmMgYi9kcml2ZXJzL2lucHV0L3RzZGV2LmMKaW5kZXggZDY3OGQxNC4uNWY5ZWNhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90c2Rldi5jCisrKyBiL2RyaXZlcnMvaW5wdXQvdHNkZXYuYwpAQCAtMzUsNyArMzUsNyBAQAogICogZS1tYWlsIC0gbWFpbCB5b3VyIG1lc3NhZ2UgdG8gPGpzaW1tb25zQGluZnJhZGVhZC5vcmc+LgogICovCiAKLSNkZWZpbmUgVFNERVZfTUlOT1JfQkFTRSAJMTI4CisjZGVmaW5lIFRTREVWX01JTk9SX0JBU0UJMTI4CiAjZGVmaW5lIFRTREVWX01JTk9SUwkJMzIKIC8qIEZpcnN0IDE2IGRldmljZXMgYXJlIGgzNjAwX3RzIGNvbXBhdGlibGU7IHNlY29uZCAxNiBhcmUgaDM2MDBfdHNyYXcgKi8KICNkZWZpbmUgVFNERVZfTUlOT1JfTUFTSwkxNQpAQCAtMjMwLDYgKzIzMCw3IEBACiBzdGF0aWMgdW5zaWduZWQgaW50IHRzZGV2X3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKiB3YWl0KQogewogCXN0cnVjdCB0c2Rldl9saXN0ICpsaXN0ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCiAJcG9sbF93YWl0KGZpbGUsICZsaXN0LT50c2Rldi0+d2FpdCwgd2FpdCk7CiAJcmV0dXJuICgobGlzdC0+aGVhZCA9PSBsaXN0LT50YWlsKSA/IDAgOiAoUE9MTElOIHwgUE9MTFJETk9STSkpIHwKIAkJKGxpc3QtPnRzZGV2LT5leGlzdCA/IDAgOiAoUE9MTEhVUCB8IFBPTExFUlIpKTsKQEAgLTI0OCwxMSArMjQ5LDEzIEBACiAJCQkJICBzaXplb2YgKHN0cnVjdCB0c19jYWxpYnJhdGlvbikpKQogCQkJcmV0dmFsID0gLUVGQVVMVDsKIAkJYnJlYWs7CisKIAljYXNlIFRTX1NFVF9DQUw6CiAJCWlmIChjb3B5X2Zyb21fdXNlciAoJnRzZGV2LT5jYWwsICh2b2lkIF9fdXNlciAqKWFyZywKIAkJCQkgICAgc2l6ZW9mIChzdHJ1Y3QgdHNfY2FsaWJyYXRpb24pKSkKIAkJCXJldHZhbCA9IC1FRkFVTFQ7CiAJCWJyZWFrOworCiAJZGVmYXVsdDoKIAkJcmV0dmFsID0gLUVJTlZBTDsKIAkJYnJlYWs7CkBAIC0yODQsOSArMjg3LDExIEBACiAJCWNhc2UgQUJTX1g6CiAJCQl0c2Rldi0+eCA9IHZhbHVlOwogCQkJYnJlYWs7CisKIAkJY2FzZSBBQlNfWToKIAkJCXRzZGV2LT55ID0gdmFsdWU7CiAJCQlicmVhazsKKwogCQljYXNlIEFCU19QUkVTU1VSRToKIAkJCWlmICh2YWx1ZSA+IGhhbmRsZS0+ZGV2LT5hYnNtYXhbQUJTX1BSRVNTVVJFXSkKIAkJCQl2YWx1ZSA9IGhhbmRsZS0+ZGV2LT5hYnNtYXhbQUJTX1BSRVNTVVJFXTsKQEAgLTMwNyw2ICszMTIsNyBAQAogCQkJZWxzZSBpZiAodHNkZXYtPnggPiB4cmVzKQogCQkJCXRzZGV2LT54ID0geHJlczsKIAkJCWJyZWFrOworCiAJCWNhc2UgUkVMX1k6CiAJCQl0c2Rldi0+eSArPSB2YWx1ZTsKIAkJCWlmICh0c2Rldi0+eSA8IDApCkBAIC0zMjMsNiArMzI5LDcgQEAKIAkJCWNhc2UgMDoKIAkJCQl0c2Rldi0+cHJlc3N1cmUgPSAwOwogCQkJCWJyZWFrOworCiAJCQljYXNlIDE6CiAJCQkJaWYgKCF0c2Rldi0+cHJlc3N1cmUpCiAJCQkJCXRzZGV2LT5wcmVzc3VyZSA9IDE7CkBAIC0zNzAsOSArMzc3LDggQEAKIAlzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZGV2OwogCWludCBtaW5vciwgZGVsdGE7CiAKLQlmb3IgKG1pbm9yID0gMDsgbWlub3IgPCBUU0RFVl9NSU5PUlMvMiAmJiB0c2Rldl90YWJsZVttaW5vcl07Ci0JICAgICBtaW5vcisrKTsKLQlpZiAobWlub3IgPj0gVFNERVZfTUlOT1JTLzIpIHsKKwlmb3IgKG1pbm9yID0gMDsgbWlub3IgPCBUU0RFVl9NSU5PUlMgLyAyICYmIHRzZGV2X3RhYmxlW21pbm9yXTsgbWlub3IrKyk7CisJaWYgKG1pbm9yID49IFRTREVWX01JTk9SUyAvIDIpIHsKIAkJcHJpbnRrKEtFUk5fRVJSCiAJCSAgICAgICAidHNkZXY6IFlvdSBoYXZlIHdheSB0b28gbWFueSB0b3VjaHNjcmVlbnNcbiIpOwogCQlyZXR1cm4gTlVMTDsKQEAgLTQ0NCwyMiArNDUwLDIyIEBACiAJICAgICAgLmV2Yml0CT0geyBCSVQoRVZfS0VZKSB8IEJJVChFVl9SRUwpIH0sCiAJICAgICAgLmtleWJpdAk9IHsgW0xPTkcoQlROX0xFRlQpXSA9IEJJVChCVE5fTEVGVCkgfSwKIAkgICAgICAucmVsYml0CT0geyBCSVQoUkVMX1gpIHwgQklUKFJFTF9ZKSB9LAotCSB9LC8qIEEgbW91c2UgbGlrZSBkZXZpY2UsIGF0IGxlYXN0IG9uZSBidXR0b24sIHR3byByZWxhdGl2ZSBheGVzICovCisJfSwgLyogQSBtb3VzZSBsaWtlIGRldmljZSwgYXQgbGVhc3Qgb25lIGJ1dHRvbiwgdHdvIHJlbGF0aXZlIGF4ZXMgKi8KIAogCXsKIAkgICAgICAuZmxhZ3MJPSBJTlBVVF9ERVZJQ0VfSURfTUFUQ0hfRVZCSVQgfCBJTlBVVF9ERVZJQ0VfSURfTUFUQ0hfS0VZQklUIHwgSU5QVVRfREVWSUNFX0lEX01BVENIX0FCU0JJVCwKIAkgICAgICAuZXZiaXQJPSB7IEJJVChFVl9LRVkpIHwgQklUKEVWX0FCUykgfSwKIAkgICAgICAua2V5Yml0CT0geyBbTE9ORyhCVE5fVE9VQ0gpXSA9IEJJVChCVE5fVE9VQ0gpIH0sCiAJICAgICAgLmFic2JpdAk9IHsgQklUKEFCU19YKSB8IEJJVChBQlNfWSkgfSwKLQkgfSwvKiBBIHRhYmxldCBsaWtlIGRldmljZSwgYXQgbGVhc3QgdG91Y2ggZGV0ZWN0aW9uLCB0d28gYWJzb2x1dGUgYXhlcyAqLworCX0sIC8qIEEgdGFibGV0IGxpa2UgZGV2aWNlLCBhdCBsZWFzdCB0b3VjaCBkZXRlY3Rpb24sIHR3byBhYnNvbHV0ZSBheGVzICovCiAKIAl7CiAJICAgICAgLmZsYWdzCT0gSU5QVVRfREVWSUNFX0lEX01BVENIX0VWQklUIHwgSU5QVVRfREVWSUNFX0lEX01BVENIX0FCU0JJVCwKIAkgICAgICAuZXZiaXQJPSB7IEJJVChFVl9BQlMpIH0sCiAJICAgICAgLmFic2JpdAk9IHsgQklUKEFCU19YKSB8IEJJVChBQlNfWSkgfCBCSVQoQUJTX1BSRVNTVVJFKSB9LAotCSB9LC8qIEEgdGFibGV0IGxpa2UgZGV2aWNlIHdpdGggc2V2ZXJhbCBncmFkYXRpb25zIG9mIHByZXNzdXJlICovCisJfSwgLyogQSB0YWJsZXQgbGlrZSBkZXZpY2Ugd2l0aCBzZXZlcmFsIGdyYWRhdGlvbnMgb2YgcHJlc3N1cmUgKi8KIAotCXt9LC8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCisJe30gLyogVGVybWluYXRpbmcgZW50cnkgKi8KIH07CiAKIE1PRFVMRV9ERVZJQ0VfVEFCTEUoaW5wdXQsIHRzZGV2X2lkcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vY2FwaS9jYXBpLmMgYi9kcml2ZXJzL2lzZG4vY2FwaS9jYXBpLmMKaW5kZXggMTczYzg5OS4uMmU1NDFmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2NhcGkvY2FwaS5jCisrKyBiL2RyaXZlcnMvaXNkbi9jYXBpL2NhcGkuYwpAQCAtODcsNiArODcsMTEgQEAKICNpZmRlZiBDT05GSUdfSVNETl9DQVBJX01JRERMRVdBUkUKIHN0cnVjdCBjYXBpbWlub3I7CiAKK3N0cnVjdCBkYXRhaGFuZGxlX3F1ZXVlIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CisJdTE2CQkJZGF0YWhhbmRsZTsKK307CisKIHN0cnVjdCBjYXBpbWlub3IgewogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIAlzdHJ1Y3QgY2FwaW5jY2kgICpuY2NpcDsKQEAgLTEwOSwxMiArMTE0LDkgQEAKIAlpbnQgICAgICAgICAgICAgICAgIG91dGJ5dGVzOwogCiAJLyogdHJhbnNtaXQgcGF0aCAqLwotCXN0cnVjdCBkYXRhaGFuZGxlX3F1ZXVlIHsKLQkJICAgIHN0cnVjdCBkYXRhaGFuZGxlX3F1ZXVlICpuZXh0OwotCQkgICAgdTE2ICAgICAgICAgICAgICAgICAgICBkYXRhaGFuZGxlOwotCX0gKmFja3F1ZXVlOworCXN0cnVjdCBsaXN0X2hlYWQgYWNrcXVldWU7CiAJaW50IG5hY2s7Ci0KKwlzcGlubG9ja190IGFja3Fsb2NrOwogfTsKICNlbmRpZiAvKiBDT05GSUdfSVNETl9DQVBJX01JRERMRVdBUkUgKi8KIApAQCAtMTU2LDQ4ICsxNTgsNTQgQEAKIAogc3RhdGljIGludCBjYXBpbmNjaV9hZGRfYWNrKHN0cnVjdCBjYXBpbWlub3IgKm1wLCB1MTYgZGF0YWhhbmRsZSkKIHsKLQlzdHJ1Y3QgZGF0YWhhbmRsZV9xdWV1ZSAqbiwgKipwcDsKKwlzdHJ1Y3QgZGF0YWhhbmRsZV9xdWV1ZSAqbjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJbiA9IGttYWxsb2Moc2l6ZW9mKCpuKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFuKSB7Ci0JICAgcHJpbnRrKEtFUk5fRVJSICJjYXBpOiBhbGxvYyBkYXRhaGFuZGxlIGZhaWxlZFxuIik7Ci0JICAgcmV0dXJuIC0xOworCWlmICh1bmxpa2VseSghbikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJjYXBpOiBhbGxvYyBkYXRhaGFuZGxlIGZhaWxlZFxuIik7CisJCXJldHVybiAtMTsKIAl9Ci0Jbi0+bmV4dCA9IE5VTEw7CiAJbi0+ZGF0YWhhbmRsZSA9IGRhdGFoYW5kbGU7Ci0JZm9yIChwcCA9ICZtcC0+YWNrcXVldWU7ICpwcDsgcHAgPSAmKCpwcCktPm5leHQpIDsKLQkqcHAgPSBuOworCUlOSVRfTElTVF9IRUFEKCZuLT5saXN0KTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbXAtPmFja3Fsb2NrLCBmbGFncyk7CisJbGlzdF9hZGRfdGFpbCgmbi0+bGlzdCwgJm1wLT5hY2txdWV1ZSk7CiAJbXAtPm5hY2srKzsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtcC0+YWNrcWxvY2ssIGZsYWdzKTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBjYXBpbWlub3JfZGVsX2FjayhzdHJ1Y3QgY2FwaW1pbm9yICptcCwgdTE2IGRhdGFoYW5kbGUpCiB7Ci0Jc3RydWN0IGRhdGFoYW5kbGVfcXVldWUgKipwcCwgKnA7CisJc3RydWN0IGRhdGFoYW5kbGVfcXVldWUgKnAsICp0bXA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWZvciAocHAgPSAmbXAtPmFja3F1ZXVlOyAqcHA7IHBwID0gJigqcHApLT5uZXh0KSB7Ci0gCQlpZiAoKCpwcCktPmRhdGFoYW5kbGUgPT0gZGF0YWhhbmRsZSkgewotCQkJcCA9ICpwcDsKLQkJCSpwcCA9ICgqcHApLT5uZXh0OworCXNwaW5fbG9ja19pcnFzYXZlKCZtcC0+YWNrcWxvY2ssIGZsYWdzKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocCwgdG1wLCAmbXAtPmFja3F1ZXVlLCBsaXN0KSB7CisgCQlpZiAocC0+ZGF0YWhhbmRsZSA9PSBkYXRhaGFuZGxlKSB7CisJCQlsaXN0X2RlbCgmcC0+bGlzdCk7CiAJCQlrZnJlZShwKTsKIAkJCW1wLT5uYWNrLS07CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtcC0+YWNrcWxvY2ssIGZsYWdzKTsKIAkJCXJldHVybiAwOwogCQl9CiAJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1wLT5hY2txbG9jaywgZmxhZ3MpOwogCXJldHVybiAtMTsKIH0KIAogc3RhdGljIHZvaWQgY2FwaW1pbm9yX2RlbF9hbGxfYWNrKHN0cnVjdCBjYXBpbWlub3IgKm1wKQogewotCXN0cnVjdCBkYXRhaGFuZGxlX3F1ZXVlICoqcHAsICpwOworCXN0cnVjdCBkYXRhaGFuZGxlX3F1ZXVlICpwLCAqdG1wOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlwcCA9ICZtcC0+YWNrcXVldWU7Ci0Jd2hpbGUgKCpwcCkgewotCQlwID0gKnBwOwotCQkqcHAgPSAoKnBwKS0+bmV4dDsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbXAtPmFja3Fsb2NrLCBmbGFncyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHAsIHRtcCwgJm1wLT5hY2txdWV1ZSwgbGlzdCkgeworCQlsaXN0X2RlbCgmcC0+bGlzdCk7CiAJCWtmcmVlKHApOwogCQltcC0+bmFjay0tOwogCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtcC0+YWNrcWxvY2ssIGZsYWdzKTsKIH0KIAogCkBAIC0yMjAsNiArMjI4LDggQEAKIAltcC0+bmNjaSA9IG5jY2k7CiAJbXAtPm1zZ2lkID0gMDsKIAlhdG9taWNfc2V0KCZtcC0+dHR5b3BlbmNvdW50LDApOworCUlOSVRfTElTVF9IRUFEKCZtcC0+YWNrcXVldWUpOworCXNwaW5fbG9ja19pbml0KCZtcC0+YWNrcWxvY2spOwogCiAJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmbXAtPmlucXVldWUpOwogCXNrYl9xdWV1ZV9oZWFkX2luaXQoJm1wLT5vdXRxdWV1ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vZGl2ZXJ0L2lzZG5fZGl2ZXJ0LmMgYi9kcml2ZXJzL2lzZG4vZGl2ZXJ0L2lzZG5fZGl2ZXJ0LmMKaW5kZXggZjFhMWY5YS4uMWY1ZWJlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2RpdmVydC9pc2RuX2RpdmVydC5jCisrKyBiL2RyaXZlcnMvaXNkbi9kaXZlcnQvaXNkbl9kaXZlcnQuYwpAQCAtNTkyLDcgKzU5Miw3IEBACiB9IC8qIHB1dF9hZGRyZXNzICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogcmVwb3J0IGEgc3VjY2VzZnVsbCBpbnRlcnJvZ2F0aW9uICovCisvKiByZXBvcnQgYSBzdWNjZXNzZnVsIGludGVycm9nYXRpb24gKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RhdGljIGludCBpbnRlcnJvZ2F0ZV9zdWNjZXNzKGlzZG5fY3RybCAqaWMsIHN0cnVjdCBjYWxsX3N0cnVjICpjcykKIHsgY2hhciAqc3JjID0gaWMtPnBhcm0uZHNzMV9pby5kYXRhOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2dpZ2FzZXQvYmFzLWdpZ2FzZXQuYyBiL2RyaXZlcnMvaXNkbi9naWdhc2V0L2Jhcy1naWdhc2V0LmMKaW5kZXggZWI0MWFiYS4uOGE0NTcxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2dpZ2FzZXQvYmFzLWdpZ2FzZXQuYworKysgYi9kcml2ZXJzL2lzZG4vZ2lnYXNldC9iYXMtZ2lnYXNldC5jCkBAIC02NSwyMyArNjUsMjIgQEAKIAogTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIGdpZ2FzZXRfdGFibGUpOwogCi0vKj09PT09PT09PT09PT09PT09PT09PT09IGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyo9PT09PT09PT09PT09PT09PT09PT09PSBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzID09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIAotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaWYgYSBuZXcgZGV2aWNlIGlzIGNvbm5lY3RlZCB0byB0aGUgVVNCIHBvcnQuIEl0Ci0gKiBjaGVja3Mgd2hldGhlciB0aGlzIG5ldyBkZXZpY2UgYmVsb25ncyB0byB0aGlzIGRyaXZlci4KLSAqLworLyogZnVuY3Rpb24gY2FsbGVkIGlmIGEgbmV3IGRldmljZSBiZWxvbmdpbmcgdG8gdGhpcyBkcml2ZXIgaXMgY29ubmVjdGVkICovCiBzdGF0aWMgaW50IGdpZ2FzZXRfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSwKIAkJCSBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpOwogCiAvKiBGdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBpZiB0aGUgZGV2aWNlIGlzIHVucGx1Z2dlZCAqLwogc3RhdGljIHZvaWQgZ2lnYXNldF9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UpOwogCi1zdGF0aWMgdm9pZCByZWFkX2N0cmxfY2FsbGJhY2soc3RydWN0IHVyYiAqLCBzdHJ1Y3QgcHRfcmVncyAqKTsKK3N0YXRpYyBpbnQgYXRyZWFkX3N1Ym1pdChzdHJ1Y3QgY2FyZHN0YXRlICosIGludCk7CiBzdGF0aWMgdm9pZCBzdG9wdXJicyhzdHJ1Y3QgYmFzX2JjX3N0YXRlICopOworc3RhdGljIGludCByZXFfc3VibWl0KHN0cnVjdCBiY19zdGF0ZSAqLCBpbnQsIGludCwgaW50KTsKIHN0YXRpYyBpbnQgYXR3cml0ZV9zdWJtaXQoc3RydWN0IGNhcmRzdGF0ZSAqLCB1bnNpZ25lZCBjaGFyICosIGludCk7CiBzdGF0aWMgaW50IHN0YXJ0X2Nic2VuZChzdHJ1Y3QgY2FyZHN0YXRlICopOwogCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogCiBzdHJ1Y3QgYmFzX2NhcmRzdGF0ZSB7CiAJc3RydWN0IHVzYl9kZXZpY2UJKnVkZXY7CQkvKiBVU0IgZGV2aWNlIHBvaW50ZXIgKi8KQEAgLTkxLDYgKzkwLDcgQEAKIAlzdHJ1Y3QgdXJiCQkqdXJiX2N0cmw7CS8qIGNvbnRyb2wgcGlwZSBkZWZhdWx0IFVSQiAqLwogCXN0cnVjdCB1c2JfY3RybHJlcXVlc3QJZHJfY3RybDsKIAlzdHJ1Y3QgdGltZXJfbGlzdAl0aW1lcl9jdHJsOwkvKiBjb250cm9sIHJlcXVlc3QgdGltZW91dCAqLworCWludAkJCXJldHJ5X2N0cmw7CiAKIAlzdHJ1Y3QgdGltZXJfbGlzdAl0aW1lcl9hdHJkeTsJLyogQVQgY29tbWFuZCByZWFkeSB0aW1lb3V0ICovCiAJc3RydWN0IHVyYgkJKnVyYl9jbWRfb3V0OwkvKiBmb3Igc2VuZGluZyBBVCBjb21tYW5kcyAqLwpAQCAtMzA3LDYgKzMwNyw3IEBACiAgKiBoYW5nIHVwIGFueSBleGlzdGluZyBjb25uZWN0aW9uIGJlY2F1c2Ugb2YgYW4gdW5yZWNvdmVyYWJsZSBlcnJvcgogICogVGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIGZyb20gYW55IGNvbnRleHQgYW5kIHRha2VzIGNhcmUgb2Ygc2NoZWR1bGluZwogICogdGhlIG5lY2Vzc2FyeSBhY3Rpb25zIGZvciBleGVjdXRpb24gb3V0c2lkZSBvZiBpbnRlcnJ1cHQgY29udGV4dC4KKyAqIGNzLT5sb2NrIG11c3Qgbm90IGJlIGhlbGQuCiAgKiBhcmd1bWVudDoKICAqCUIgY2hhbm5lbCBjb250cm9sIHN0cnVjdHVyZQogICovCkBAIC0zMjUsMTQgKzMyNiwxNyBAQAogCiAvKiBlcnJvcl9yZXNldAogICogcmVzZXQgR2lnYXNldCBkZXZpY2UgYmVjYXVzZSBvZiBhbiB1bnJlY292ZXJhYmxlIGVycm9yCi0gKiBUaGlzIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgZnJvbSBhbnkgY29udGV4dCwgYW5kIHNob3VsZCB0YWtlIGNhcmUgb2YKKyAqIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBmcm9tIGFueSBjb250ZXh0LCBhbmQgdGFrZXMgY2FyZSBvZgogICogc2NoZWR1bGluZyB0aGUgbmVjZXNzYXJ5IGFjdGlvbnMgZm9yIGV4ZWN1dGlvbiBvdXRzaWRlIG9mIGludGVycnVwdCBjb250ZXh0LgotICogUmlnaHQgbm93LCBpdCBqdXN0IGdlbmVyYXRlcyBhIGtlcm5lbCBtZXNzYWdlIGNhbGxpbmcgZm9yIGhlbHAuCisgKiBjcy0+bG9jayBtdXN0IG5vdCBiZSBoZWxkLgogICogYXJndW1lbnQ6CiAgKgljb250cm9sbGVyIHN0YXRlIHN0cnVjdHVyZQogICovCiBzdGF0aWMgaW5saW5lIHZvaWQgZXJyb3JfcmVzZXQoc3RydWN0IGNhcmRzdGF0ZSAqY3MpCiB7CisJLyogY2xvc2UgQVQgY29tbWFuZCBjaGFubmVsIHRvIHJlY292ZXIgKGlnbm9yZSBlcnJvcnMpICovCisJcmVxX3N1Ym1pdChjcy0+YmNzLCBIRF9DTE9TRV9BVENIQU5ORUwsIDAsIEJBU19USU1FT1VUKTsKKwogCS8vRklYTUUgdHJ5IHRvIHJlY292ZXIgd2l0aG91dCBib3RoZXJpbmcgdGhlIHVzZXIKIAlkZXZfZXJyKGNzLT5kZXYsCiAJICAgICJ1bnJlY292ZXJhYmxlIGVycm9yIC0gcGxlYXNlIGRpc2Nvbm5lY3QgR2lnYXNldCBiYXNlIHRvIHJlc2V0XG4iKTsKQEAgLTQwMywxNCArNDA3LDMwIEBACiB7CiAJc3RydWN0IGNhcmRzdGF0ZSAqY3MgPSAoc3RydWN0IGNhcmRzdGF0ZSAqKSBkYXRhOwogCXN0cnVjdCBiYXNfY2FyZHN0YXRlICp1Y3MgPSBjcy0+aHcuYmFzOworCWludCByYzsKIAogCWlmICghdWNzLT5yY3ZidWZfc2l6ZSkgewogCQlnaWdfZGJnKERFQlVHX1VTQlJFUSwgIiVzOiBubyByZWNlaXZlIGluIHByb2dyZXNzIiwgX19mdW5jX18pOwogCQlyZXR1cm47CiAJfQogCi0JZGV2X2Vycihjcy0+ZGV2LCAidGltZW91dCByZWFkaW5nIEFUIHJlc3BvbnNlXG4iKTsKLQllcnJvcl9yZXNldChjcyk7CS8vRklYTUUgcmV0cnk/CisJaWYgKHVjcy0+cmV0cnlfY21kX2luKysgPCBCQVNfUkVUUlkpIHsKKwkJZGV2X25vdGljZShjcy0+ZGV2LCAiY29udHJvbCByZWFkOiB0aW1lb3V0LCByZXRyeSAlZFxuIiwKKwkJCSAgIHVjcy0+cmV0cnlfY21kX2luKTsKKwkJcmMgPSBhdHJlYWRfc3VibWl0KGNzLCBCQVNfVElNRU9VVCk7CisJCWlmIChyYyA+PSAwIHx8IHJjID09IC1FTk9ERVYpCisJCQkvKiByZXN1Ym1pdHRlZCBvciBkaXNjb25uZWN0ZWQgKi8KKwkJCS8qIC0gYnlwYXNzIHJlZ3VsYXIgZXhpdCBibG9jayAqLworCQkJcmV0dXJuOworCX0gZWxzZSB7CisJCWRldl9lcnIoY3MtPmRldiwKKwkJCSJjb250cm9sIHJlYWQ6IHRpbWVvdXQsIGdpdmluZyB1cCBhZnRlciAlZCB0cmllc1xuIiwKKwkJCXVjcy0+cmV0cnlfY21kX2luKTsKKwl9CisJa2ZyZWUodWNzLT5yY3ZidWYpOworCXVjcy0+cmN2YnVmID0gTlVMTDsKKwl1Y3MtPnJjdmJ1Zl9zaXplID0gMDsKKwllcnJvcl9yZXNldChjcyk7CiB9CiAKIC8qIHNldC9jbGVhciBiaXRzIGluIGJhc2UgY29ubmVjdGlvbiBzdGF0ZSwgcmV0dXJuIHByZXZpb3VzIHN0YXRlCkBAIC00MjgsNiArNDQ4LDk2IEBACiAJcmV0dXJuIHN0YXRlOwogfQogCisvKiByZWFkX2N0cmxfY2FsbGJhY2sKKyAqIFVTQiBjb21wbGV0aW9uIGhhbmRsZXIgZm9yIGNvbnRyb2wgcGlwZSBpbnB1dAorICogY2FsbGVkIGJ5IHRoZSBVU0Igc3Vic3lzdGVtIGluIGludGVycnVwdCBjb250ZXh0CisgKiBwYXJhbWV0ZXI6CisgKgl1cmIJVVNCIHJlcXVlc3QgYmxvY2sKKyAqCQl1cmItPmNvbnRleHQgPSBpbmJ1ZiBzdHJ1Y3R1cmUgZm9yIGNvbnRyb2xsZXIgc3RhdGUKKyAqLworc3RhdGljIHZvaWQgcmVhZF9jdHJsX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IGluYnVmX3QgKmluYnVmID0gdXJiLT5jb250ZXh0OworCXN0cnVjdCBjYXJkc3RhdGUgKmNzID0gaW5idWYtPmNzOworCXN0cnVjdCBiYXNfY2FyZHN0YXRlICp1Y3MgPSBjcy0+aHcuYmFzOworCWludCBoYXZlX2RhdGEgPSAwOworCXVuc2lnbmVkIG51bWJ5dGVzOworCWludCByYzsKKworCXVwZGF0ZV9iYXNzdGF0ZSh1Y3MsIDAsIEJTX0FUUkRQRU5EKTsKKworCWlmICghdWNzLT5yY3ZidWZfc2l6ZSkgeworCQlkZXZfd2Fybihjcy0+ZGV2LCAiJXM6IG5vIHJlY2VpdmUgaW4gcHJvZ3Jlc3NcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCWRlbF90aW1lcigmdWNzLT50aW1lcl9jbWRfaW4pOworCisJc3dpdGNoICh1cmItPnN0YXR1cykgeworCWNhc2UgMDoJCQkJLyogbm9ybWFsIGNvbXBsZXRpb24gKi8KKwkJbnVtYnl0ZXMgPSB1cmItPmFjdHVhbF9sZW5ndGg7CisJCWlmICh1bmxpa2VseShudW1ieXRlcyAhPSB1Y3MtPnJjdmJ1Zl9zaXplKSkgeworCQkJZGV2X3dhcm4oY3MtPmRldiwKKwkJCSAgICAgICAiY29udHJvbCByZWFkOiByZWNlaXZlZCAlZCBjaGFycywgZXhwZWN0ZWQgJWRcbiIsCisJCQkJIG51bWJ5dGVzLCB1Y3MtPnJjdmJ1Zl9zaXplKTsKKwkJCWlmIChudW1ieXRlcyA+IHVjcy0+cmN2YnVmX3NpemUpCisJCQkJbnVtYnl0ZXMgPSB1Y3MtPnJjdmJ1Zl9zaXplOworCQl9CisKKwkJLyogY29weSByZWNlaXZlZCBieXRlcyB0byBpbmJ1ZiAqLworCQloYXZlX2RhdGEgPSBnaWdhc2V0X2ZpbGxfaW5idWYoaW5idWYsIHVjcy0+cmN2YnVmLCBudW1ieXRlcyk7CisKKwkJaWYgKHVubGlrZWx5KG51bWJ5dGVzIDwgdWNzLT5yY3ZidWZfc2l6ZSkpIHsKKwkJCS8qIGluY29tcGxldGUgLSByZXN1Ym1pdCBmb3IgcmVtYWluaW5nIGJ5dGVzICovCisJCQl1Y3MtPnJjdmJ1Zl9zaXplIC09IG51bWJ5dGVzOworCQkJdWNzLT5yZXRyeV9jbWRfaW4gPSAwOworCQkJcmMgPSBhdHJlYWRfc3VibWl0KGNzLCBCQVNfVElNRU9VVCk7CisJCQlpZiAocmMgPj0gMCB8fCByYyA9PSAtRU5PREVWKQorCQkJCS8qIHJlc3VibWl0dGVkIG9yIGRpc2Nvbm5lY3RlZCAqLworCQkJCS8qIC0gYnlwYXNzIHJlZ3VsYXIgZXhpdCBibG9jayAqLworCQkJCXJldHVybjsKKwkJCWVycm9yX3Jlc2V0KGNzKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgLUVOT0VOVDoJCQkvKiBjYW5jZWxsZWQgKi8KKwljYXNlIC1FQ09OTlJFU0VUOgkJLyogY2FuY2VsbGVkIChhc3luYykgKi8KKwljYXNlIC1FSU5QUk9HUkVTUzoJCS8qIHBlbmRpbmcgKi8KKwljYXNlIC1FTk9ERVY6CQkJLyogZGV2aWNlIHJlbW92ZWQgKi8KKwljYXNlIC1FU0hVVERPV046CQkvKiBkZXZpY2Ugc2h1dCBkb3duICovCisJCS8qIG5vIGFjdGlvbiBuZWNlc3NhcnkgKi8KKwkJZ2lnX2RiZyhERUJVR19VU0JSRVEsICIlczogJXMiLAorCQkJX19mdW5jX18sIGdldF91c2Jfc3RhdG1zZyh1cmItPnN0YXR1cykpOworCQlicmVhazsKKworCWRlZmF1bHQ6CQkJLyogc2V2ZXJlIHRyb3VibGUgKi8KKwkJZGV2X3dhcm4oY3MtPmRldiwgImNvbnRyb2wgcmVhZDogJXNcbiIsCisJCQkgZ2V0X3VzYl9zdGF0bXNnKHVyYi0+c3RhdHVzKSk7CisJCWlmICh1Y3MtPnJldHJ5X2NtZF9pbisrIDwgQkFTX1JFVFJZKSB7CisJCQlkZXZfbm90aWNlKGNzLT5kZXYsICJjb250cm9sIHJlYWQ6IHJldHJ5ICVkXG4iLAorCQkJCSAgIHVjcy0+cmV0cnlfY21kX2luKTsKKwkJCXJjID0gYXRyZWFkX3N1Ym1pdChjcywgQkFTX1RJTUVPVVQpOworCQkJaWYgKHJjID49IDAgfHwgcmMgPT0gLUVOT0RFVikKKwkJCQkvKiByZXN1Ym1pdHRlZCBvciBkaXNjb25uZWN0ZWQgKi8KKwkJCQkvKiAtIGJ5cGFzcyByZWd1bGFyIGV4aXQgYmxvY2sgKi8KKwkJCQlyZXR1cm47CisJCX0gZWxzZSB7CisJCQlkZXZfZXJyKGNzLT5kZXYsCisJCQkJImNvbnRyb2wgcmVhZDogZ2l2aW5nIHVwIGFmdGVyICVkIHRyaWVzXG4iLAorCQkJCXVjcy0+cmV0cnlfY21kX2luKTsKKwkJfQorCQllcnJvcl9yZXNldChjcyk7CisJfQorCisJa2ZyZWUodWNzLT5yY3ZidWYpOworCXVjcy0+cmN2YnVmID0gTlVMTDsKKwl1Y3MtPnJjdmJ1Zl9zaXplID0gMDsKKwlpZiAoaGF2ZV9kYXRhKSB7CisJCWdpZ19kYmcoREVCVUdfSU5UUiwgIiVzLS0+QkgiLCBfX2Z1bmNfXyk7CisJCWdpZ2FzZXRfc2NoZWR1bGVfZXZlbnQoY3MpOworCX0KK30KKwogLyogYXRyZWFkX3N1Ym1pdAogICogc3VibWl0IGFuIEhEX1JFQURfQVRNRVNTQUdFIGNvbW1hbmQgVVJCIGFuZCBvcHRpb25hbGx5IHN0YXJ0IGEgdGltZW91dAogICogcGFyYW1ldGVyczoKQEAgLTQ2Niw3ICs1NzYsNyBAQAogCWlmICgocmV0ID0gdXNiX3N1Ym1pdF91cmIodWNzLT51cmJfY21kX2luLCBTTEFCX0FUT01JQykpICE9IDApIHsKIAkJdXBkYXRlX2Jhc3N0YXRlKHVjcywgMCwgQlNfQVRSRFBFTkQpOwogCQlkZXZfZXJyKGNzLT5kZXYsICJjb3VsZCBub3Qgc3VibWl0IEhEX1JFQURfQVRNRVNTQUdFOiAlc1xuIiwKLQkJCWdldF91c2Jfc3RhdG1zZyhyZXQpKTsKKwkJCWdldF91c2JfcmNtc2cocmV0KSk7CiAJCXJldHVybiByZXQ7CiAJfQogCkBAIC02MTEsOSArNzIxLDEyIEBACiAJCQlrZnJlZSh1Y3MtPnJjdmJ1Zik7CiAJCQl1Y3MtPnJjdmJ1ZiA9IE5VTEw7CiAJCQl1Y3MtPnJjdmJ1Zl9zaXplID0gMDsKLQkJCWlmIChyYyAhPSAtRU5PREVWKQorCQkJaWYgKHJjICE9IC1FTk9ERVYpIHsKIAkJCQkvL0ZJWE1FIGNvcnJlY3RpdmUgYWN0aW9uPworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNzLT5sb2NrLCBmbGFncyk7CiAJCQkJZXJyb3JfcmVzZXQoY3MpOworCQkJCWJyZWFrOworCQkJfQogCQl9CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNzLT5sb2NrLCBmbGFncyk7CiAJCWJyZWFrOwpAQCAtNjQzLDk3ICs3NTYsNiBAQAogCX0KIH0KIAotLyogcmVhZF9jdHJsX2NhbGxiYWNrCi0gKiBVU0IgY29tcGxldGlvbiBoYW5kbGVyIGZvciBjb250cm9sIHBpcGUgaW5wdXQKLSAqIGNhbGxlZCBieSB0aGUgVVNCIHN1YnN5c3RlbSBpbiBpbnRlcnJ1cHQgY29udGV4dAotICogcGFyYW1ldGVyOgotICoJdXJiCVVTQiByZXF1ZXN0IGJsb2NrCi0gKgkJdXJiLT5jb250ZXh0ID0gaW5idWYgc3RydWN0dXJlIGZvciBjb250cm9sbGVyIHN0YXRlCi0gKi8KLXN0YXRpYyB2b2lkIHJlYWRfY3RybF9jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCXN0cnVjdCBpbmJ1Zl90ICppbmJ1ZiA9IHVyYi0+Y29udGV4dDsKLQlzdHJ1Y3QgY2FyZHN0YXRlICpjcyA9IGluYnVmLT5jczsKLQlzdHJ1Y3QgYmFzX2NhcmRzdGF0ZSAqdWNzID0gY3MtPmh3LmJhczsKLQlpbnQgaGF2ZV9kYXRhID0gMDsKLQl1bnNpZ25lZCBudW1ieXRlczsKLQlpbnQgcmM7Ci0KLQl1cGRhdGVfYmFzc3RhdGUodWNzLCAwLCBCU19BVFJEUEVORCk7Ci0KLQlpZiAoIXVjcy0+cmN2YnVmX3NpemUpIHsKLQkJZGV2X3dhcm4oY3MtPmRldiwgIiVzOiBubyByZWNlaXZlIGluIHByb2dyZXNzXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybjsKLQl9Ci0KLQlkZWxfdGltZXIoJnVjcy0+dGltZXJfY21kX2luKTsKLQotCXN3aXRjaCAodXJiLT5zdGF0dXMpIHsKLQljYXNlIDA6CQkJCS8qIG5vcm1hbCBjb21wbGV0aW9uICovCi0JCW51bWJ5dGVzID0gdXJiLT5hY3R1YWxfbGVuZ3RoOwotCQlpZiAodW5saWtlbHkobnVtYnl0ZXMgPT0gMCkpIHsKLQkJCWRldl93YXJuKGNzLT5kZXYsCi0JCQkJICJjb250cm9sIHJlYWQ6IGVtcHR5IGJsb2NrIHJlY2VpdmVkXG4iKTsKLQkJCWdvdG8gcmV0cnk7Ci0JCX0KLQkJaWYgKHVubGlrZWx5KG51bWJ5dGVzICE9IHVjcy0+cmN2YnVmX3NpemUpKSB7Ci0JCQlkZXZfd2Fybihjcy0+ZGV2LAotCQkJICAgICAgICJjb250cm9sIHJlYWQ6IHJlY2VpdmVkICVkIGNoYXJzLCBleHBlY3RlZCAlZFxuIiwKLQkJCQkgbnVtYnl0ZXMsIHVjcy0+cmN2YnVmX3NpemUpOwotCQkJaWYgKG51bWJ5dGVzID4gdWNzLT5yY3ZidWZfc2l6ZSkKLQkJCQludW1ieXRlcyA9IHVjcy0+cmN2YnVmX3NpemU7Ci0JCX0KLQotCQkvKiBjb3B5IHJlY2VpdmVkIGJ5dGVzIHRvIGluYnVmICovCi0JCWhhdmVfZGF0YSA9IGdpZ2FzZXRfZmlsbF9pbmJ1ZihpbmJ1ZiwgdWNzLT5yY3ZidWYsIG51bWJ5dGVzKTsKLQotCQlpZiAodW5saWtlbHkobnVtYnl0ZXMgPCB1Y3MtPnJjdmJ1Zl9zaXplKSkgewotCQkJLyogaW5jb21wbGV0ZSAtIHJlc3VibWl0IGZvciByZW1haW5pbmcgYnl0ZXMgKi8KLQkJCXVjcy0+cmN2YnVmX3NpemUgLT0gbnVtYnl0ZXM7Ci0JCQl1Y3MtPnJldHJ5X2NtZF9pbiA9IDA7Ci0JCQlnb3RvIHJldHJ5OwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSAtRU5PRU5UOgkJCS8qIGNhbmNlbGxlZCAqLwotCWNhc2UgLUVDT05OUkVTRVQ6CQkvKiBjYW5jZWxsZWQgKGFzeW5jKSAqLwotCWNhc2UgLUVJTlBST0dSRVNTOgkJLyogcGVuZGluZyAqLwotCWNhc2UgLUVOT0RFVjoJCQkvKiBkZXZpY2UgcmVtb3ZlZCAqLwotCWNhc2UgLUVTSFVURE9XTjoJCS8qIGRldmljZSBzaHV0IGRvd24gKi8KLQkJLyogbm8gYWN0aW9uIG5lY2Vzc2FyeSAqLwotCQlnaWdfZGJnKERFQlVHX1VTQlJFUSwgIiVzOiAlcyIsCi0JCQlfX2Z1bmNfXywgZ2V0X3VzYl9zdGF0bXNnKHVyYi0+c3RhdHVzKSk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoJCQkvKiBzZXZlcmUgdHJvdWJsZSAqLwotCQlkZXZfd2Fybihjcy0+ZGV2LCAiY29udHJvbCByZWFkOiAlc1xuIiwKLQkJCSBnZXRfdXNiX3N0YXRtc2codXJiLT5zdGF0dXMpKTsKLQlyZXRyeToKLQkJaWYgKHVjcy0+cmV0cnlfY21kX2luKysgPCBCQVNfUkVUUlkpIHsKLQkJCWRldl9ub3RpY2UoY3MtPmRldiwgImNvbnRyb2wgcmVhZDogcmV0cnkgJWRcbiIsCi0JCQkJICAgdWNzLT5yZXRyeV9jbWRfaW4pOwotCQkJcmMgPSBhdHJlYWRfc3VibWl0KGNzLCBCQVNfVElNRU9VVCk7Ci0JCQlpZiAocmMgPj0gMCB8fCByYyA9PSAtRU5PREVWKQotCQkJCS8qIHJlc3VibWl0dGVkIG9yIGRpc2Nvbm5lY3RlZCAqLwotCQkJCS8qIC0gYnlwYXNzIHJlZ3VsYXIgZXhpdCBibG9jayAqLwotCQkJCXJldHVybjsKLQkJfSBlbHNlIHsKLQkJCWRldl9lcnIoY3MtPmRldiwKLQkJCQkiY29udHJvbCByZWFkOiBnaXZpbmcgdXAgYWZ0ZXIgJWQgdHJpZXNcbiIsCi0JCQkJdWNzLT5yZXRyeV9jbWRfaW4pOwotCQl9Ci0JCWVycm9yX3Jlc2V0KGNzKTsKLQl9Ci0KLQlrZnJlZSh1Y3MtPnJjdmJ1Zik7Ci0JdWNzLT5yY3ZidWYgPSBOVUxMOwotCXVjcy0+cmN2YnVmX3NpemUgPSAwOwotCWlmIChoYXZlX2RhdGEpIHsKLQkJZ2lnX2RiZyhERUJVR19JTlRSLCAiJXMtLT5CSCIsIF9fZnVuY19fKTsKLQkJZ2lnYXNldF9zY2hlZHVsZV9ldmVudChjcyk7Ci0JfQotfQotCiAvKiByZWFkX2lzb19jYWxsYmFjawogICogVVNCIGNvbXBsZXRpb24gaGFuZGxlciBmb3IgQiBjaGFubmVsIGlzb2Nocm9ub3VzIGlucHV0CiAgKiBjYWxsZWQgYnkgdGhlIFVTQiBzdWJzeXN0ZW0gaW4gaW50ZXJydXB0IGNvbnRleHQKQEAgLTEzNzgsNiArMTQwMCw3IEBACiAJY2FzZSBIRF9DTE9TRV9CMUNIQU5ORUw6CiAJCWRldl9lcnIoYmNzLT5jcy0+ZGV2LCAidGltZW91dCBjbG9zaW5nIGNoYW5uZWwgJWRcbiIsCiAJCQliY3MtPmNoYW5uZWwgKyAxKTsKKwkJZXJyb3JfcmVzZXQoYmNzLT5jcyk7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKQEAgLTEzOTYsMjIgKzE0MTksNjEgQEAKIHN0YXRpYyB2b2lkIHdyaXRlX2N0cmxfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlzdHJ1Y3QgYmFzX2NhcmRzdGF0ZSAqdWNzID0gdXJiLT5jb250ZXh0OworCWludCByYzsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnVjcy0+bG9jaywgZmxhZ3MpOwotCWlmICh1cmItPnN0YXR1cyAmJiB1Y3MtPnBlbmRpbmcpIHsKLQkJZGV2X2VycigmdWNzLT5pbnRlcmZhY2UtPmRldiwKLQkJCSJjb250cm9sIHJlcXVlc3QgMHglMDJ4IGZhaWxlZDogJXNcbiIsCi0JCQl1Y3MtPnBlbmRpbmcsIGdldF91c2Jfc3RhdG1zZyh1cmItPnN0YXR1cykpOwotCQlkZWxfdGltZXIoJnVjcy0+dGltZXJfY3RybCk7Ci0JCXVjcy0+cGVuZGluZyA9IDA7Ci0JfQotCS8qIGluZGl2aWR1YWwgaGFuZGxpbmcgb2Ygc3BlY2lmaWMgcmVxdWVzdCB0eXBlcyAqLwotCXN3aXRjaCAodWNzLT5wZW5kaW5nKSB7Ci0JY2FzZSBIRF9ERVZJQ0VfSU5JVF9BQ0s6CQkvKiBubyByZXBseSBleHBlY3RlZCAqLwotCQl1Y3MtPnBlbmRpbmcgPSAwOworCS8qIGNoZWNrIHN0YXR1cyAqLworCXN3aXRjaCAodXJiLT5zdGF0dXMpIHsKKwljYXNlIDA6CQkJCQkvKiBub3JtYWwgY29tcGxldGlvbiAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmdWNzLT5sb2NrLCBmbGFncyk7CisJCXN3aXRjaCAodWNzLT5wZW5kaW5nKSB7CisJCWNhc2UgSERfREVWSUNFX0lOSVRfQUNLOgkvKiBubyByZXBseSBleHBlY3RlZCAqLworCQkJZGVsX3RpbWVyKCZ1Y3MtPnRpbWVyX2N0cmwpOworCQkJdWNzLT5wZW5kaW5nID0gMDsKKwkJCWJyZWFrOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVjcy0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisKKwljYXNlIC1FTk9FTlQ6CQkJLyogY2FuY2VsbGVkICovCisJY2FzZSAtRUNPTk5SRVNFVDoJCS8qIGNhbmNlbGxlZCAoYXN5bmMpICovCisJY2FzZSAtRUlOUFJPR1JFU1M6CQkvKiBwZW5kaW5nICovCisJY2FzZSAtRU5PREVWOgkJCS8qIGRldmljZSByZW1vdmVkICovCisJY2FzZSAtRVNIVVRET1dOOgkJLyogZGV2aWNlIHNodXQgZG93biAqLworCQkvKiBpZ25vcmUgc2lsZW50bHkgKi8KKwkJZ2lnX2RiZyhERUJVR19VU0JSRVEsICIlczogJXMiLAorCQkJX19mdW5jX18sIGdldF91c2Jfc3RhdG1zZyh1cmItPnN0YXR1cykpOwogCQlicmVhazsKKworCWRlZmF1bHQ6CQkJCS8qIGFueSBmYWlsdXJlICovCisJCWlmICgrK3Vjcy0+cmV0cnlfY3RybCA+IEJBU19SRVRSWSkgeworCQkJZGV2X2VycigmdWNzLT5pbnRlcmZhY2UtPmRldiwKKwkJCQkiY29udHJvbCByZXF1ZXN0IDB4JTAyeCBmYWlsZWQ6ICVzXG4iLAorCQkJCXVjcy0+ZHJfY3RybC5iUmVxdWVzdCwKKwkJCQlnZXRfdXNiX3N0YXRtc2codXJiLT5zdGF0dXMpKTsKKwkJCWJyZWFrOwkJLyogZ2l2ZSB1cCAqLworCQl9CisJCWRldl9ub3RpY2UoJnVjcy0+aW50ZXJmYWNlLT5kZXYsCisJCQkgICAiY29udHJvbCByZXF1ZXN0IDB4JTAyeDogJXMsIHJldHJ5ICVkXG4iLAorCQkJICAgdWNzLT5kcl9jdHJsLmJSZXF1ZXN0LCBnZXRfdXNiX3N0YXRtc2codXJiLT5zdGF0dXMpLAorCQkJICAgdWNzLT5yZXRyeV9jdHJsKTsKKwkJLyogdXJiLT5kZXYgaXMgY2xvYmJlcmVkIGJ5IFVTQiBzdWJzeXN0ZW0gKi8KKwkJdXJiLT5kZXYgPSB1Y3MtPnVkZXY7CisJCXJjID0gdXNiX3N1Ym1pdF91cmIodXJiLCBTTEFCX0FUT01JQyk7CisJCWlmICh1bmxpa2VseShyYykpIHsKKwkJCWRldl9lcnIoJnVjcy0+aW50ZXJmYWNlLT5kZXYsCisJCQkJImNvdWxkIG5vdCByZXN1Ym1pdCByZXF1ZXN0IDB4JTAyeDogJXNcbiIsCisJCQkJdWNzLT5kcl9jdHJsLmJSZXF1ZXN0LCBnZXRfdXNiX3JjbXNnKHJjKSk7CisJCQlicmVhazsKKwkJfQorCQkvKiByZXN1Ym1pdHRlZCAqLworCQlyZXR1cm47CiAJfQorCisJLyogZmFpbGVkLCBjbGVhciBwZW5kaW5nIHJlcXVlc3QgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmdWNzLT5sb2NrLCBmbGFncyk7CisJZGVsX3RpbWVyKCZ1Y3MtPnRpbWVyX2N0cmwpOworCXVjcy0+cGVuZGluZyA9IDA7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdWNzLT5sb2NrLCBmbGFncyk7CiB9CiAKQEAgLTE0NTUsOSArMTUxNywxMSBAQAogCQkJICAgICB1c2Jfc25kY3RybHBpcGUodWNzLT51ZGV2LCAwKSwKIAkJCSAgICAgKHVuc2lnbmVkIGNoYXIqKSAmdWNzLT5kcl9jdHJsLCBOVUxMLCAwLAogCQkJICAgICB3cml0ZV9jdHJsX2NhbGxiYWNrLCB1Y3MpOwotCWlmICgocmV0ID0gdXNiX3N1Ym1pdF91cmIodWNzLT51cmJfY3RybCwgU0xBQl9BVE9NSUMpKSAhPSAwKSB7CisJdWNzLT5yZXRyeV9jdHJsID0gMDsKKwlyZXQgPSB1c2Jfc3VibWl0X3VyYih1Y3MtPnVyYl9jdHJsLCBTTEFCX0FUT01JQyk7CisJaWYgKHVubGlrZWx5KHJldCkpIHsKIAkJZGV2X2VycihiY3MtPmNzLT5kZXYsICJjb3VsZCBub3Qgc3VibWl0IHJlcXVlc3QgMHglMDJ4OiAlc1xuIiwKLQkJCXJlcSwgZ2V0X3VzYl9zdGF0bXNnKHJldCkpOworCQkJcmVxLCBnZXRfdXNiX3JjbXNnKHJldCkpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1Y3MtPmxvY2ssIGZsYWdzKTsKIAkJcmV0dXJuIHJldDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vZ2lnYXNldC9ldi1sYXllci5jIGIvZHJpdmVycy9pc2RuL2dpZ2FzZXQvZXYtbGF5ZXIuYwppbmRleCAxOGUwNWMwLi40NGYwMmRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vZ2lnYXNldC9ldi1sYXllci5jCisrKyBiL2RyaXZlcnMvaXNkbi9naWdhc2V0L2V2LWxheWVyLmMKQEAgLTEyNjIsNyArMTI2Miw4IEBACiAJCWJyZWFrOwogCWNhc2UgQUNUX0hVUE1PREVNOgogCQkvKiBzZW5kICIrKysiIChoYW5ndXAgaW4gdW5pbW9kZW0gbW9kZSkgKi8KLQkJY3MtPm9wcy0+d3JpdGVfY21kKGNzLCAiKysrIiwgMywgTlVMTCk7CisJCWlmIChjcy0+Y29ubmVjdGVkKQorCQkJY3MtPm9wcy0+d3JpdGVfY21kKGNzLCAiKysrIiwgMywgTlVMTCk7CiAJCWJyZWFrOwogCWNhc2UgQUNUX1JJTkc6CiAJCS8qIGdldCBmcmVzaCBBVCBzdGF0ZSBzdHJ1Y3R1cmUgZm9yIG5ldyBDSUQgKi8KQEAgLTEyOTQsNyArMTI5NSw2IEBACiAJCWJyZWFrOwogCWNhc2UgQUNUX0lDQUxMOgogCQloYW5kbGVfaWNhbGwoY3MsIGJjcywgcF9hdF9zdGF0ZSk7Ci0JCWF0X3N0YXRlID0gKnBfYXRfc3RhdGU7CiAJCWJyZWFrOwogCWNhc2UgQUNUX0ZBSUxTRE9XTjoKIAkJZGV2X3dhcm4oY3MtPmRldiwgIkNvdWxkIG5vdCBzaHV0IGRvd24gdGhlIGRldmljZS5cbiIpOwpAQCAtMTMzNCwxMCArMTMzNCw4IEBACiAJCQkgKi8KIAkJCWF0X3N0YXRlLT5wZW5kaW5nX2NvbW1hbmRzIHw9IFBDX0RMRTA7CiAJCQlhdG9taWNfc2V0KCZjcy0+Y29tbWFuZHNfcGVuZGluZywgMSk7Ci0JCX0gZWxzZSB7CisJCX0gZWxzZQogCQkJZGlzY29ubmVjdChwX2F0X3N0YXRlKTsKLQkJCWF0X3N0YXRlID0gKnBfYXRfc3RhdGU7Ci0JCX0KIAkJYnJlYWs7CiAJY2FzZSBBQ1RfRkFLRURMRTA6CiAJCWF0X3N0YXRlLT5pbnRfdmFyW1ZBUl9aRExFXSA9IDA7CkBAIC0xMzU0LDEwICsxMzUyLDggQEAKIAkJYXRfc3RhdGUtPmNpZCA9IC0xOwogCQlpZiAoYmNzICYmIGNzLT5vbmVjaGFubmVsKQogCQkJYXRfc3RhdGUtPnBlbmRpbmdfY29tbWFuZHMgfD0gUENfRExFMDsKLQkJZWxzZSB7CisJCWVsc2UKIAkJCWRpc2Nvbm5lY3QocF9hdF9zdGF0ZSk7Ci0JCQlhdF9zdGF0ZSA9ICpwX2F0X3N0YXRlOwotCQl9CiAJCXNjaGVkdWxlX2luaXQoY3MsIE1TX1JFQ09WRVIpOwogCQlicmVhazsKIAljYXNlIEFDVF9GQUlMRExFMDoKQEAgLTE0MTAsNyArMTQwNiw2IEBACiAKIAljYXNlIEFDVF9BQk9SVEFDQ0VQVDoJLyogaGFuZ3VwL2Vycm9yL3RpbWVvdXQgZHVyaW5nIElDQUxMIHByb2Nlc3NpbmcgKi8KIAkJZGlzY29ubmVjdChwX2F0X3N0YXRlKTsKLQkJYXRfc3RhdGUgPSAqcF9hdF9zdGF0ZTsKIAkJYnJlYWs7CiAKIAljYXNlIEFDVF9BQk9SVERJQUw6CS8qIGVycm9yL3RpbWVvdXQgZHVyaW5nIGRpYWwgcHJlcGFyYXRpb24gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oaXNheC9xOTMxLmMgYi9kcml2ZXJzL2lzZG4vaGlzYXgvcTkzMS5jCmluZGV4IGFiZWNhYmYuLmFhY2JmMGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oaXNheC9xOTMxLmMKKysrIGIvZHJpdmVycy9pc2RuL2hpc2F4L3E5MzEuYwpAQCAtMTQwMiwxMiArMTQwMiwxMiBAQAogCQkJfQogCQkJLyogTm8sIGxvY2F0ZSBpdCBpbiB0aGUgdGFibGUgKi8KIAkJCWlmIChjc2V0ID09IDApIHsKLQkJCQlmb3IgKGkgPSAwOyBpIDwgSUVTSVpFOyBpKyspCisJCQkJZm9yIChpID0gMDsgaSA8IElFU0laRV9OSTE7IGkrKykKIAkJCQkJaWYgKCpidWYgPT0gaWVsaXN0X25pMVtpXS5ucikKIAkJCQkJCWJyZWFrOwogCiAJCQkJLyogV2hlbiBub3QgZm91bmQsIGdpdmUgYXBwcm9wcmlhdGUgbXNnICovCi0JCQkJaWYgKGkgIT0gSUVTSVpFKSB7CisJCQkJaWYgKGkgIT0gSUVTSVpFX05JMSkgewogCQkJCQlkcCArPSBzcHJpbnRmKGRwLCAiICAlc1xuIiwgaWVsaXN0X25pMVtpXS5kZXNjcik7CiAJCQkJCWRwICs9IGllbGlzdF9uaTFbaV0uZihkcCwgYnVmKTsKIAkJCQl9IGVsc2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9pNGwvaXNkbl9jb21tb24uYyBiL2RyaXZlcnMvaXNkbi9pNGwvaXNkbl9jb21tb24uYwppbmRleCA4MWFjY2RmLi5iMjZlNTA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fY29tbW9uLmMKKysrIGIvZHJpdmVycy9pc2RuL2k0bC9pc2RuX2NvbW1vbi5jCkBAIC05MzMsNyArOTMzLDcgQEAKIAkJCWNvdW50X3B1dCA9IGNvdW50X3B1bGw7CiAJCQlpZihjb3VudF9wdXQgPiAxKQogCQkJCXR0eV9pbnNlcnRfZmxpcF9zdHJpbmcodHR5LCBza2ItPmRhdGEsIGNvdW50X3B1dCAtIDEpOwotCQkJbGFzdCA9IHNrYi0+ZGF0YVtjb3VudF9wdXRdIC0gMTsKKwkJCWxhc3QgPSBza2ItPmRhdGFbY291bnRfcHV0IC0gMV07CiAJCQlsZW4gLT0gY291bnRfcHV0OwogI2lmZGVmIENPTkZJR19JU0ROX0FVRElPCiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGVkcy9LY29uZmlnIGIvZHJpdmVycy9sZWRzL0tjb25maWcKaW5kZXggZjU3M2Q1YS4uOTY1MDk5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9sZWRzL0tjb25maWcKKysrIGIvZHJpdmVycy9sZWRzL0tjb25maWcKQEAgLTkzLDUgKzkzLDE0IEBACiAJICBUaGlzIGFsbG93cyBMRURzIHRvIGJlIGNvbnRyb2xsZWQgYnkgSURFIGRpc2sgYWN0aXZpdHkuCiAJICBJZiB1bnN1cmUsIHNheSBZLgogCitjb25maWcgTEVEU19UUklHR0VSX0hFQVJUQkVBVAorCXRyaXN0YXRlICJMRUQgSGVhcnRiZWF0IFRyaWdnZXIiCisJZGVwZW5kcyBMRURTX1RSSUdHRVJTCisJaGVscAorCSAgVGhpcyBhbGxvd3MgTEVEcyB0byBiZSBjb250cm9sbGVkIGJ5IGEgQ1BVIGxvYWQgYXZlcmFnZS4KKwkgIFRoZSBmbGFzaCBmcmVxdWVuY3kgaXMgYSBoeXBlcmJvbGljIGZ1bmN0aW9uIG9mIHRoZSAxLW1pbnV0ZQorCSAgbG9hZCBhdmVyYWdlLgorCSAgSWYgdW5zdXJlLCBzYXkgWS4KKwogZW5kbWVudQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2xlZHMvTWFrZWZpbGUgYi9kcml2ZXJzL2xlZHMvTWFrZWZpbGUKaW5kZXggZGNlYTEwMC4uODhkM2I2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9sZWRzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbGVkcy9NYWtlZmlsZQpAQCAtMTYsMyArMTYsNCBAQAogIyBMRUQgVHJpZ2dlcnMKIG9iai0kKENPTkZJR19MRURTX1RSSUdHRVJfVElNRVIpCSs9IGxlZHRyaWctdGltZXIubwogb2JqLSQoQ09ORklHX0xFRFNfVFJJR0dFUl9JREVfRElTSykJKz0gbGVkdHJpZy1pZGUtZGlzay5vCitvYmotJChDT05GSUdfTEVEU19UUklHR0VSX0hFQVJUQkVBVCkJKz0gbGVkdHJpZy1oZWFydGJlYXQubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZWRzL2xlZHRyaWctaGVhcnRiZWF0LmMgYi9kcml2ZXJzL2xlZHMvbGVkdHJpZy1oZWFydGJlYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmY4Y2VjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9sZWRzL2xlZHRyaWctaGVhcnRiZWF0LmMKQEAgLTAsMCArMSwxMTggQEAKKy8qCisgKiBMRUQgSGVhcnRiZWF0IFRyaWdnZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgQXRzdXNoaSBOZW1vdG8gPGFuZW1vQG1iYS5vY24ubmUuanA+CisgKgorICogQmFzZWQgb24gUmljaGFyZCBQdXJkaWUncyBsZWR0cmlnLXRpbWVyLmMgYW5kIHNvbWUgYXJjaCdzCisgKiBDT05GSUdfSEVBUlRCRUFUIGNvZGUuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2xlZHMuaD4KKyNpbmNsdWRlICJsZWRzLmgiCisKK3N0cnVjdCBoZWFydGJlYXRfdHJpZ19kYXRhIHsKKwl1bnNpZ25lZCBpbnQgcGhhc2U7CisJdW5zaWduZWQgaW50IHBlcmlvZDsKKwlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKK307CisKK3N0YXRpYyB2b2lkIGxlZF9oZWFydGJlYXRfZnVuY3Rpb24odW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBsZWRfY2xhc3NkZXYgKmxlZF9jZGV2ID0gKHN0cnVjdCBsZWRfY2xhc3NkZXYgKikgZGF0YTsKKwlzdHJ1Y3QgaGVhcnRiZWF0X3RyaWdfZGF0YSAqaGVhcnRiZWF0X2RhdGEgPSBsZWRfY2Rldi0+dHJpZ2dlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgYnJpZ2h0bmVzcyA9IExFRF9PRkY7CisJdW5zaWduZWQgbG9uZyBkZWxheSA9IDA7CisKKwkvKiBhY3RzIGxpa2UgYW4gYWN0dWFsIGhlYXJ0IGJlYXQgLS0gaWUgdGh1bXAtdGh1bXAtcGF1c2UuLi4gKi8KKwlzd2l0Y2ggKGhlYXJ0YmVhdF9kYXRhLT5waGFzZSkgeworCWNhc2UgMDoKKwkJLyoKKwkJICogVGhlIGh5cGVyYm9saWMgZnVuY3Rpb24gYmVsb3cgbW9kaWZpZXMgdGhlCisJCSAqIGhlYXJ0YmVhdCBwZXJpb2QgbGVuZ3RoIGluIGRlcGVuZGVuY3kgb2YgdGhlCisJCSAqIGN1cnJlbnQgKDFtaW4pIGxvYWQuIEl0IGdvZXMgdGhyb3VnaCB0aGUgcG9pbnRzCisJCSAqIGYoMCk9MTI2MCwgZigxKT04NjAsIGYoNSk9NTEwLCBmKGluZiktPjMwMC4KKwkJICovCisJCWhlYXJ0YmVhdF9kYXRhLT5wZXJpb2QgPSAzMDAgKworCQkJKDY3MjAgPDwgRlNISUZUKSAvICg1ICogYXZlbnJ1blswXSArICg3IDw8IEZTSElGVCkpOworCQloZWFydGJlYXRfZGF0YS0+cGVyaW9kID0KKwkJCW1zZWNzX3RvX2ppZmZpZXMoaGVhcnRiZWF0X2RhdGEtPnBlcmlvZCk7CisJCWRlbGF5ID0gbXNlY3NfdG9famlmZmllcyg3MCk7CisJCWhlYXJ0YmVhdF9kYXRhLT5waGFzZSsrOworCQlicmlnaHRuZXNzID0gTEVEX0ZVTEw7CisJCWJyZWFrOworCWNhc2UgMToKKwkJZGVsYXkgPSBoZWFydGJlYXRfZGF0YS0+cGVyaW9kIC8gNCAtIG1zZWNzX3RvX2ppZmZpZXMoNzApOworCQloZWFydGJlYXRfZGF0YS0+cGhhc2UrKzsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlkZWxheSA9IG1zZWNzX3RvX2ppZmZpZXMoNzApOworCQloZWFydGJlYXRfZGF0YS0+cGhhc2UrKzsKKwkJYnJpZ2h0bmVzcyA9IExFRF9GVUxMOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZWxheSA9IGhlYXJ0YmVhdF9kYXRhLT5wZXJpb2QgLSBoZWFydGJlYXRfZGF0YS0+cGVyaW9kIC8gNCAtCisJCQltc2Vjc190b19qaWZmaWVzKDcwKTsKKwkJaGVhcnRiZWF0X2RhdGEtPnBoYXNlID0gMDsKKwkJYnJlYWs7CisJfQorCisJbGVkX3NldF9icmlnaHRuZXNzKGxlZF9jZGV2LCBicmlnaHRuZXNzKTsKKwltb2RfdGltZXIoJmhlYXJ0YmVhdF9kYXRhLT50aW1lciwgamlmZmllcyArIGRlbGF5KTsKK30KKworc3RhdGljIHZvaWQgaGVhcnRiZWF0X3RyaWdfYWN0aXZhdGUoc3RydWN0IGxlZF9jbGFzc2RldiAqbGVkX2NkZXYpCit7CisJc3RydWN0IGhlYXJ0YmVhdF90cmlnX2RhdGEgKmhlYXJ0YmVhdF9kYXRhOworCisJaGVhcnRiZWF0X2RhdGEgPSBremFsbG9jKHNpemVvZigqaGVhcnRiZWF0X2RhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWhlYXJ0YmVhdF9kYXRhKQorCQlyZXR1cm47CisKKwlsZWRfY2Rldi0+dHJpZ2dlcl9kYXRhID0gaGVhcnRiZWF0X2RhdGE7CisJc2V0dXBfdGltZXIoJmhlYXJ0YmVhdF9kYXRhLT50aW1lciwKKwkJICAgIGxlZF9oZWFydGJlYXRfZnVuY3Rpb24sICh1bnNpZ25lZCBsb25nKSBsZWRfY2Rldik7CisJaGVhcnRiZWF0X2RhdGEtPnBoYXNlID0gMDsKKwlsZWRfaGVhcnRiZWF0X2Z1bmN0aW9uKGhlYXJ0YmVhdF9kYXRhLT50aW1lci5kYXRhKTsKK30KKworc3RhdGljIHZvaWQgaGVhcnRiZWF0X3RyaWdfZGVhY3RpdmF0ZShzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpsZWRfY2RldikKK3sKKwlzdHJ1Y3QgaGVhcnRiZWF0X3RyaWdfZGF0YSAqaGVhcnRiZWF0X2RhdGEgPSBsZWRfY2Rldi0+dHJpZ2dlcl9kYXRhOworCisJaWYgKGhlYXJ0YmVhdF9kYXRhKSB7CisJCWRlbF90aW1lcl9zeW5jKCZoZWFydGJlYXRfZGF0YS0+dGltZXIpOworCQlrZnJlZShoZWFydGJlYXRfZGF0YSk7CisJfQorfQorCitzdGF0aWMgc3RydWN0IGxlZF90cmlnZ2VyIGhlYXJ0YmVhdF9sZWRfdHJpZ2dlciA9IHsKKwkubmFtZSAgICAgPSAiaGVhcnRiZWF0IiwKKwkuYWN0aXZhdGUgPSBoZWFydGJlYXRfdHJpZ19hY3RpdmF0ZSwKKwkuZGVhY3RpdmF0ZSA9IGhlYXJ0YmVhdF90cmlnX2RlYWN0aXZhdGUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBoZWFydGJlYXRfdHJpZ19pbml0KHZvaWQpCit7CisJcmV0dXJuIGxlZF90cmlnZ2VyX3JlZ2lzdGVyKCZoZWFydGJlYXRfbGVkX3RyaWdnZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgaGVhcnRiZWF0X3RyaWdfZXhpdCh2b2lkKQoreworCWxlZF90cmlnZ2VyX3VucmVnaXN0ZXIoJmhlYXJ0YmVhdF9sZWRfdHJpZ2dlcik7Cit9CisKK21vZHVsZV9pbml0KGhlYXJ0YmVhdF90cmlnX2luaXQpOworbW9kdWxlX2V4aXQoaGVhcnRiZWF0X3RyaWdfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkF0c3VzaGkgTmVtb3RvIDxhbmVtb0BtYmEub2NuLm5lLmpwPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJIZWFydGJlYXQgTEVEIHRyaWdnZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWFjaW50b3NoL0tjb25maWcgYi9kcml2ZXJzL21hY2ludG9zaC9LY29uZmlnCmluZGV4IGNjZjVkZjQuLjM3Y2Q2ZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWFjaW50b3NoL0tjb25maWcKKysrIGIvZHJpdmVycy9tYWNpbnRvc2gvS2NvbmZpZwpAQCAtOTksMTcgKzk5LDIyIEBACiAJICBkZXZpY2VzIGFyZSBub3QgZnVsbHkgc3VwcG9ydGVkIGluIHRoZSBiYXkgYXMgSSBuZXZlciBoYWQgb25lIHRvCiAJICB0cnkgd2l0aAogCi0jIG1hZGUgYSBzZXBhcmF0ZSBvcHRpb24gc2luY2UgYmFja2xpZ2h0IG1heSBlbmQgdXAgYmVlaW5nIHVzZWQKLSMgb24gbm9uLXBvd2VyYm9vayBtYWNoaW5lcyAoYnV0IG9ubHkgb24gUE1VIGJhc2VkIG9uZXMgQUZBSUspCiBjb25maWcgUE1BQ19CQUNLTElHSFQKIAlib29sICJCYWNrbGlnaHQgY29udHJvbCBmb3IgTENEIHNjcmVlbnMiCiAJZGVwZW5kcyBvbiBBREJfUE1VICYmIChCUk9LRU4gfHwgIVBQQzY0KQogCWhlbHAKLQkgIFNheSBZIGhlcmUgdG8gYnVpbGQgaW4gY29kZSB0byBtYW5hZ2UgdGhlIExDRCBiYWNrbGlnaHQgb24gYQotCSAgTWFjaW50b3NoIFBvd2VyQm9vay4gIFdpdGggdGhpcyBjb2RlLCB0aGUgYmFja2xpZ2h0IHdpbGwgYmUgdHVybmVkCi0JICBvbiBhbmQgb2ZmIGFwcHJvcHJpYXRlbHkgb24gcG93ZXItbWFuYWdlbWVudCBhbmQgbGlkLW9wZW4vbGlkLWNsb3NlZAotCSAgZXZlbnRzOyBhbHNvLCB0aGUgUG93ZXJCb29rIGJ1dHRvbiBkZXZpY2Ugd2lsbCBiZSBlbmFibGVkIHNvIHlvdSBjYW4KLQkgIGNoYW5nZSB0aGUgc2NyZWVuIGJyaWdodG5lc3MuCisJICBTYXkgWSBoZXJlIHRvIGVuYWJsZSBNYWNpbnRvc2ggc3BlY2lmaWMgZXh0ZW5zaW9ucyBvZiB0aGUgZ2VuZXJpYworCSAgYmFja2xpZ2h0IGNvZGUuIFdpdGggdGhpcyBlbmFibGVkLCB0aGUgYnJpZ2h0bmVzcyBrZXlzIG9uIG9sZGVyCisJICBQb3dlckJvb2tzIHdpbGwgYmUgZW5hYmxlZCBzbyB5b3UgY2FuIGNoYW5nZSB0aGUgc2NyZWVuIGJyaWdodG5lc3MuCisJICBOZXdlciBtb2RlbHMgc2hvdWxkIHVzZSBhbiB1c2Vyc3BhY2UgZGFlbW9uIGxpa2UgcGJidXR0b25zZC4KKworY29uZmlnIFBNQUNfQkFDS0xJR0hUX0xFR0FDWQorCWJvb2wgIlByb3ZpZGUgbGVnYWN5IGlvY3RsJ3Mgb24gL2Rldi9wbXUgZm9yIHRoZSBiYWNrbGlnaHQiCisJZGVwZW5kcyBvbiBQTUFDX0JBQ0tMSUdIVCAmJiAoQlJPS0VOIHx8ICFQUEM2NCkKKwloZWxwCisJICBTYXkgWSBpZiB5b3Ugd2FudCB0byBlbmFibGUgbGVnYWN5IGlvY3RsJ3Mgb24gL2Rldi9wbXUuIFRoaXMgaXMgZm9yCisJICBwcm9ncmFtcyB3aGljaCB1c2UgdGhpcyBvbGQgaW50ZXJmYWNlLiBOZXcgYW5kIHVwZGF0ZWQgcHJvZ3JhbXMKKwkgIHNob3VsZCB1c2UgdGhlIGJhY2tsaWdodCBjbGFzc2VzIGluIHN5c2ZzLgogCiBjb25maWcgQURCX01BQ0lPCiAJYm9vbCAiSW5jbHVkZSBNYWNJTyAoQ0hSUCkgQURCIGRyaXZlciIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWFjaW50b3NoL01ha2VmaWxlIGIvZHJpdmVycy9tYWNpbnRvc2gvTWFrZWZpbGUKaW5kZXggNjA4MWFjZC4uNDVhMjY4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tYWNpbnRvc2gvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tYWNpbnRvc2gvTWFrZWZpbGUKQEAgLTExLDcgKzExLDggQEAKIG9iai0kKENPTkZJR19JTlBVVF9BREJISUQpCSs9IGFkYmhpZC5vCiBvYmotJChDT05GSUdfQU5TTENEKQkJKz0gYW5zLWxjZC5vCiAKLW9iai0kKENPTkZJR19BREJfUE1VKQkJKz0gdmlhLXBtdS5vCitvYmotJChDT05GSUdfQURCX1BNVSkJCSs9IHZpYS1wbXUubyB2aWEtcG11LWV2ZW50Lm8KK29iai0kKENPTkZJR19QTUFDX0JBQ0tMSUdIVCkJKz0gdmlhLXBtdS1iYWNrbGlnaHQubwogb2JqLSQoQ09ORklHX0FEQl9DVURBKQkJKz0gdmlhLWN1ZGEubwogb2JqLSQoQ09ORklHX1BNQUNfQVBNX0VNVSkJKz0gYXBtX2VtdS5vCiBvYmotJChDT05GSUdfUE1BQ19TTVUpCQkrPSBzbXUubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tYWNpbnRvc2gvYWRiaGlkLmMgYi9kcml2ZXJzL21hY2ludG9zaC9hZGJoaWQuYwppbmRleCAzOTQzMzRlLi5jYmZiYmUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21hY2ludG9zaC9hZGJoaWQuYworKysgYi9kcml2ZXJzL21hY2ludG9zaC9hZGJoaWQuYwpAQCAtMTc5LDcgKzE3OSw3IEBACiAJLyogMHg2NSAqLyBLRVlfRjksCQkvKiAgNjcgKi8KIAkvKiAweDY2ICovIEtFWV9IQU5KQSwJCS8qIDEyMyAqLwogCS8qIDB4NjcgKi8gS0VZX0YxMSwJCS8qICA4NyAqLwotCS8qIDB4NjggKi8gS0VZX0hBTkdVRUwsCQkvKiAxMjIgKi8KKwkvKiAweDY4ICovIEtFWV9IQU5HRVVMLAkJLyogMTIyICovCiAJLyogMHg2OSAqLyBLRVlfU1lTUlEsCQkvKiAgOTkgKi8KIAkvKiAweDZhICovIDAsCiAJLyogMHg2YiAqLyBLRVlfU0NST0xMTE9DSywJLyogIDcwICovCkBAIC01MDMsOSArNTAzLDcgQEAKIAljYXNlIDB4MWY6IC8qIFBvd2VyYm9vayBidXR0b24gZGV2aWNlICovCiAJICB7CiAJCWludCBkb3duID0gKGRhdGFbMV0gPT0gKGRhdGFbMV0gJiAweGYpKTsKLSNpZmRlZiBDT05GSUdfUE1BQ19CQUNLTElHSFQKLQkJaW50IGJhY2tsaWdodCA9IGdldF9iYWNrbGlnaHRfbGV2ZWwoKTsKLSNlbmRpZgorCiAJCS8qCiAJCSAqIFhYWDogV2hlcmUgaXMgdGhlIGNvbnRyYXN0IGNvbnRyb2wgZm9yIHRoZSBwYXNzaXZlPwogCQkgKiAgLS0gQ29ydApAQCAtNTMwLDI5ICs1MjgsMTcgQEAKIAogCQljYXNlIDB4YToJLyogYnJpZ2h0bmVzcyBkZWNyZWFzZSAqLwogI2lmZGVmIENPTkZJR19QTUFDX0JBQ0tMSUdIVAotCQkJaWYgKCFkaXNhYmxlX2tlcm5lbF9iYWNrbGlnaHQpIHsKLQkJCQlpZiAoZG93biAmJiBiYWNrbGlnaHQgPj0gMCkgewotCQkJCQlpZiAoYmFja2xpZ2h0ID4gQkFDS0xJR0hUX09GRikKLQkJCQkJCXNldF9iYWNrbGlnaHRfbGV2ZWwoYmFja2xpZ2h0LTEpOwotCQkJCQllbHNlCi0JCQkJCQlzZXRfYmFja2xpZ2h0X2xldmVsKEJBQ0tMSUdIVF9PRkYpOwotCQkJCX0KLQkJCX0KLSNlbmRpZiAvKiBDT05GSUdfUE1BQ19CQUNLTElHSFQgKi8KKwkJCWlmICghZGlzYWJsZV9rZXJuZWxfYmFja2xpZ2h0ICYmIGRvd24pCisJCQkJcG1hY19iYWNrbGlnaHRfa2V5X2Rvd24oKTsKKyNlbmRpZgogCQkJaW5wdXRfcmVwb3J0X2tleShhZGJoaWRbaWRdLT5pbnB1dCwgS0VZX0JSSUdIVE5FU1NET1dOLCBkb3duKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgMHg5OgkvKiBicmlnaHRuZXNzIGluY3JlYXNlICovCiAjaWZkZWYgQ09ORklHX1BNQUNfQkFDS0xJR0hUCi0JCQlpZiAoIWRpc2FibGVfa2VybmVsX2JhY2tsaWdodCkgewotCQkJCWlmIChkb3duICYmIGJhY2tsaWdodCA+PSAwKSB7Ci0JCQkJCWlmIChiYWNrbGlnaHQgPCBCQUNLTElHSFRfTUFYKQotCQkJCQkJc2V0X2JhY2tsaWdodF9sZXZlbChiYWNrbGlnaHQrMSk7Ci0JCQkJCWVsc2UgCi0JCQkJCQlzZXRfYmFja2xpZ2h0X2xldmVsKEJBQ0tMSUdIVF9NQVgpOwotCQkJCX0KLQkJCX0KLSNlbmRpZiAvKiBDT05GSUdfUE1BQ19CQUNLTElHSFQgKi8KKwkJCWlmICghZGlzYWJsZV9rZXJuZWxfYmFja2xpZ2h0ICYmIGRvd24pCisJCQkJcG1hY19iYWNrbGlnaHRfa2V5X3VwKCk7CisjZW5kaWYKIAkJCWlucHV0X3JlcG9ydF9rZXkoYWRiaGlkW2lkXS0+aW5wdXQsIEtFWV9CUklHSFRORVNTVVAsIGRvd24pOwogCQkJYnJlYWs7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWFjaW50b3NoL3ZpYS1wbXUtYmFja2xpZ2h0LmMgYi9kcml2ZXJzL21hY2ludG9zaC92aWEtcG11LWJhY2tsaWdodC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0MmQwNWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21hY2ludG9zaC92aWEtcG11LWJhY2tsaWdodC5jCkBAIC0wLDAgKzEsMTUwIEBACisvKgorICogQmFja2xpZ2h0IGNvZGUgZm9yIHZpYS1wbXUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTggUGF1bCBNYWNrZXJyYXMgYW5kIEZhYmlvIFJpY2NhcmRpLgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDIgQmVuamFtaW4gSGVycmVuc2NobWlkdAorICogQ29weXJpZ2h0IChDKSAyMDA2ICAgICAgTWljaGFlbCBIYW5zZWxtYW5uIDxsaW51eC1rZXJuZWxAaGFuc21pLmNoPgorICoKKyAqLworCisjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2FkYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BtdS5oPgorI2luY2x1ZGUgPGFzbS9iYWNrbGlnaHQuaD4KKyNpbmNsdWRlIDxhc20vcHJvbS5oPgorCisjZGVmaW5lIE1BWF9QTVVfTEVWRUwgMHhGRgorCitzdGF0aWMgc3RydWN0IGRldmljZV9ub2RlICp2aWFzOworc3RhdGljIHN0cnVjdCBiYWNrbGlnaHRfcHJvcGVydGllcyBwbXVfYmFja2xpZ2h0X2RhdGE7CisKK3N0YXRpYyBpbnQgcG11X2JhY2tsaWdodF9nZXRfbGV2ZWxfYnJpZ2h0bmVzcyhzdHJ1Y3QgZmJfaW5mbyAqaW5mbywKKwkJaW50IGxldmVsKQoreworCWludCBwbXVsZXZlbDsKKworCS8qIEdldCBhbmQgY29udmVydCB0aGUgdmFsdWUgKi8KKwltdXRleF9sb2NrKCZpbmZvLT5ibF9tdXRleCk7CisJcG11bGV2ZWwgPSBpbmZvLT5ibF9jdXJ2ZVtsZXZlbF0gKiBGQl9CQUNLTElHSFRfTUFYIC8gTUFYX1BNVV9MRVZFTDsKKwltdXRleF91bmxvY2soJmluZm8tPmJsX211dGV4KTsKKworCWlmIChwbXVsZXZlbCA8IDApCisJCXBtdWxldmVsID0gMDsKKwllbHNlIGlmIChwbXVsZXZlbCA+IE1BWF9QTVVfTEVWRUwpCisJCXBtdWxldmVsID0gTUFYX1BNVV9MRVZFTDsKKworCXJldHVybiBwbXVsZXZlbDsKK30KKworc3RhdGljIGludCBwbXVfYmFja2xpZ2h0X3VwZGF0ZV9zdGF0dXMoc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkKQoreworCXN0cnVjdCBmYl9pbmZvICppbmZvID0gY2xhc3NfZ2V0X2RldmRhdGEoJmJkLT5jbGFzc19kZXYpOworCXN0cnVjdCBhZGJfcmVxdWVzdCByZXE7CisJaW50IHBtdWxldmVsLCBsZXZlbCA9IGJkLT5wcm9wcy0+YnJpZ2h0bmVzczsKKworCWlmICh2aWFzID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKGJkLT5wcm9wcy0+cG93ZXIgIT0gRkJfQkxBTktfVU5CTEFOSyB8fAorCSAgICBiZC0+cHJvcHMtPmZiX2JsYW5rICE9IEZCX0JMQU5LX1VOQkxBTkspCisJCWxldmVsID0gMDsKKworCXBtdWxldmVsID0gcG11X2JhY2tsaWdodF9nZXRfbGV2ZWxfYnJpZ2h0bmVzcyhpbmZvLCBsZXZlbCk7CisKKwlwbXVfcmVxdWVzdCgmcmVxLCBOVUxMLCAyLCBQTVVfQkFDS0xJR0hUX0JSSUdIVCwgcG11bGV2ZWwpOworCXBtdV93YWl0X2NvbXBsZXRlKCZyZXEpOworCisJcG11X3JlcXVlc3QoJnJlcSwgTlVMTCwgMiwgUE1VX1BPV0VSX0NUUkwsCisJCVBNVV9QT1dfQkFDS0xJR0hUIHwgKGxldmVsID4gMCA/IFBNVV9QT1dfT04gOiBQTVVfUE9XX09GRikpOworCXBtdV93YWl0X2NvbXBsZXRlKCZyZXEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcG11X2JhY2tsaWdodF9nZXRfYnJpZ2h0bmVzcyhzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQpCit7CisJcmV0dXJuIGJkLT5wcm9wcy0+YnJpZ2h0bmVzczsKK30KKworc3RhdGljIHN0cnVjdCBiYWNrbGlnaHRfcHJvcGVydGllcyBwbXVfYmFja2xpZ2h0X2RhdGEgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5nZXRfYnJpZ2h0bmVzcwk9IHBtdV9iYWNrbGlnaHRfZ2V0X2JyaWdodG5lc3MsCisJLnVwZGF0ZV9zdGF0dXMJPSBwbXVfYmFja2xpZ2h0X3VwZGF0ZV9zdGF0dXMsCisJLm1heF9icmlnaHRuZXNzCT0gKEZCX0JBQ0tMSUdIVF9MRVZFTFMgLSAxKSwKK307CisKK3ZvaWQgX19pbml0IHBtdV9iYWNrbGlnaHRfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKmluX3ZpYXMpCit7CisJc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkOworCXN0cnVjdCBmYl9pbmZvICppbmZvOworCWNoYXIgbmFtZVsxMF07CisJaW50IGxldmVsLCBhdXRvc2F2ZTsKKworCXZpYXMgPSBpbl92aWFzOworCisJLyogU3BlY2lhbCBjYXNlIGZvciB0aGUgb2xkIFBvd2VyQm9vayBzaW5jZSBJIGNhbid0IHRlc3Qgb24gaXQgKi8KKwlhdXRvc2F2ZSA9CisJCW1hY2hpbmVfaXNfY29tcGF0aWJsZSgiQUFQTCwzNDAwLzI0MDAiKSB8fAorCQltYWNoaW5lX2lzX2NvbXBhdGlibGUoIkFBUEwsMzUwMCIpOworCisJaWYgKCFhdXRvc2F2ZSAmJgorCSAgICAhcG1hY19oYXNfYmFja2xpZ2h0X3R5cGUoInBtdSIpICYmCisJICAgICFtYWNoaW5lX2lzX2NvbXBhdGlibGUoIkFBUEwsUG93ZXJCb29rMTk5OCIpICYmCisJICAgICFtYWNoaW5lX2lzX2NvbXBhdGlibGUoIlBvd2VyQm9vazEsMSIpKQorCQlyZXR1cm47CisKKwkvKiBBY3R1YWxseSwgdGhpcyBpcyBhIGhhY2ssIGJ1dCBJIGRvbid0IGtub3cgb2YgYSBiZXR0ZXIgd2F5CisJICogdG8gZ2V0IHRoZSBmaXJzdCBmcmFtZWJ1ZmZlciBkZXZpY2UuCisJICovCisJaW5mbyA9IHJlZ2lzdGVyZWRfZmJbMF07CisJaWYgKCFpbmZvKSB7CisJCXByaW50aygicG11Ymw6IE5vIGZyYW1lYnVmZmVyIGZvdW5kXG4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICJwbXVibCVkIiwgaW5mby0+bm9kZSk7CisKKwliZCA9IGJhY2tsaWdodF9kZXZpY2VfcmVnaXN0ZXIobmFtZSwgaW5mbywgJnBtdV9iYWNrbGlnaHRfZGF0YSk7CisJaWYgKElTX0VSUihiZCkpIHsKKwkJcHJpbnRrKCJwbXVibDogQmFja2xpZ2h0IHJlZ2lzdHJhdGlvbiBmYWlsZWRcbiIpOworCQlnb3RvIGVycm9yOworCX0KKworCW11dGV4X2xvY2soJmluZm8tPmJsX211dGV4KTsKKwlpbmZvLT5ibF9kZXYgPSBiZDsKKwlmYl9ibF9kZWZhdWx0X2N1cnZlKGluZm8sIDB4N0YsIDB4NDYsIDB4MEUpOworCW11dGV4X3VubG9jaygmaW5mby0+YmxfbXV0ZXgpOworCisJbGV2ZWwgPSBwbXVfYmFja2xpZ2h0X2RhdGEubWF4X2JyaWdodG5lc3M7CisKKwlpZiAoYXV0b3NhdmUpIHsKKwkJLyogcmVhZCBhdXRvc2F2ZWQgdmFsdWUgaWYgYXZhaWxhYmxlICovCisJCXN0cnVjdCBhZGJfcmVxdWVzdCByZXE7CisJCXBtdV9yZXF1ZXN0KCZyZXEsIE5VTEwsIDIsIDB4ZDksIDApOworCQlwbXVfd2FpdF9jb21wbGV0ZSgmcmVxKTsKKworCQltdXRleF9sb2NrKCZpbmZvLT5ibF9tdXRleCk7CisJCWxldmVsID0gcG1hY19iYWNrbGlnaHRfY3VydmVfbG9va3VwKGluZm8sCisJCQkJKHJlcS5yZXBseVswXSA+PiA0KSAqCisJCQkJcG11X2JhY2tsaWdodF9kYXRhLm1heF9icmlnaHRuZXNzIC8gMTUpOworCQltdXRleF91bmxvY2soJmluZm8tPmJsX211dGV4KTsKKwl9CisKKwl1cCgmYmQtPnNlbSk7CisJYmQtPnByb3BzLT5icmlnaHRuZXNzID0gbGV2ZWw7CisJYmQtPnByb3BzLT5wb3dlciA9IEZCX0JMQU5LX1VOQkxBTks7CisJYmQtPnByb3BzLT51cGRhdGVfc3RhdHVzKGJkKTsKKwlkb3duKCZiZC0+c2VtKTsKKworCW11dGV4X2xvY2soJnBtYWNfYmFja2xpZ2h0X211dGV4KTsKKwlpZiAoIXBtYWNfYmFja2xpZ2h0KQorCQlwbWFjX2JhY2tsaWdodCA9IGJkOworCW11dGV4X3VubG9jaygmcG1hY19iYWNrbGlnaHRfbXV0ZXgpOworCisJcHJpbnRrKCJwbXVibDogQmFja2xpZ2h0IGluaXRpYWxpemVkICglcylcbiIsIG5hbWUpOworCisJcmV0dXJuOworCitlcnJvcjoKKwlyZXR1cm47Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21hY2ludG9zaC92aWEtcG11LWV2ZW50LmMgYi9kcml2ZXJzL21hY2ludG9zaC92aWEtcG11LWV2ZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVjZDU2NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWFjaW50b3NoL3ZpYS1wbXUtZXZlbnQuYwpAQCAtMCwwICsxLDgwIEBACisvKgorICogdmlhLXBtdSBldmVudCBkZXZpY2UgZm9yIHJlcG9ydGluZyBzb21lIGV2ZW50cyB0aGF0IGNvbWUgdGhyb3VnaCB0aGUgUE1VCisgKgorICogQ29weXJpZ2h0IDIwMDYgSm9oYW5uZXMgQmVyZyA8am9oYW5uZXNAc2lwc29sdXRpb25zLm5ldD4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgorICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L2FkYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BtdS5oPgorI2luY2x1ZGUgInZpYS1wbXUtZXZlbnQuaCIKKworc3RhdGljIHN0cnVjdCBpbnB1dF9kZXYgKnBtdV9pbnB1dF9kZXY7CisKK3N0YXRpYyBpbnQgX19pbml0IHZpYV9wbXVfZXZlbnRfaW5pdCh2b2lkKQoreworCWludCBlcnI7CisKKwkvKiBkbyBvdGhlciBtb2RlbHMgcmVwb3J0IGJ1dHRvbi9saWQgc3RhdHVzPyAqLworCWlmIChwbXVfZ2V0X21vZGVsKCkgIT0gUE1VX0tFWUxBUkdPX0JBU0VEKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXBtdV9pbnB1dF9kZXYgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoIXBtdV9pbnB1dF9kZXYpCisJCXJldHVybiAtRU5PTUVNOworCisJcG11X2lucHV0X2Rldi0+bmFtZSA9ICJQTVUiOworCXBtdV9pbnB1dF9kZXYtPmlkLmJ1c3R5cGUgPSBCVVNfSE9TVDsKKwlwbXVfaW5wdXRfZGV2LT5pZC52ZW5kb3IgPSAweDAwMDE7CisJcG11X2lucHV0X2Rldi0+aWQucHJvZHVjdCA9IDB4MDAwMTsKKwlwbXVfaW5wdXRfZGV2LT5pZC52ZXJzaW9uID0gMHgwMTAwOworCisJc2V0X2JpdChFVl9LRVksIHBtdV9pbnB1dF9kZXYtPmV2Yml0KTsKKwlzZXRfYml0KEVWX1NXLCBwbXVfaW5wdXRfZGV2LT5ldmJpdCk7CisJc2V0X2JpdChLRVlfUE9XRVIsIHBtdV9pbnB1dF9kZXYtPmtleWJpdCk7CisJc2V0X2JpdChTV19MSUQsIHBtdV9pbnB1dF9kZXYtPnN3Yml0KTsKKworCWVyciA9IGlucHV0X3JlZ2lzdGVyX2RldmljZShwbXVfaW5wdXRfZGV2KTsKKwlpZiAoZXJyKQorCQlpbnB1dF9mcmVlX2RldmljZShwbXVfaW5wdXRfZGV2KTsKKwlyZXR1cm4gZXJyOworfQorCit2b2lkIHZpYV9wbXVfZXZlbnQoaW50IGtleSwgaW50IGRvd24pCit7CisKKwlpZiAodW5saWtlbHkoIXBtdV9pbnB1dF9kZXYpKQorCQlyZXR1cm47CisKKwlzd2l0Y2ggKGtleSkgeworCWNhc2UgUE1VX0VWVF9QT1dFUjoKKwkJaW5wdXRfcmVwb3J0X2tleShwbXVfaW5wdXRfZGV2LCBLRVlfUE9XRVIsIGRvd24pOworCQlicmVhazsKKwljYXNlIFBNVV9FVlRfTElEOgorCQlpbnB1dF9yZXBvcnRfc3dpdGNoKHBtdV9pbnB1dF9kZXYsIFNXX0xJRCwgZG93bik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIG5vIHN1Y2gga2V5IGhhbmRsZWQgKi8KKwkJcmV0dXJuOworCX0KKworCWlucHV0X3N5bmMocG11X2lucHV0X2Rldik7Cit9CisKK2xhdGVfaW5pdGNhbGwodmlhX3BtdV9ldmVudF9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWFjaW50b3NoL3ZpYS1wbXUtZXZlbnQuaCBiL2RyaXZlcnMvbWFjaW50b3NoL3ZpYS1wbXUtZXZlbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmM1NGRlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tYWNpbnRvc2gvdmlhLXBtdS1ldmVudC5oCkBAIC0wLDAgKzEsOCBAQAorI2lmbmRlZiBfX1ZJQV9QTVVfRVZFTlRfSAorI2RlZmluZSBfX1ZJQV9QTVVfRVZFTlRfSAorCisjZGVmaW5lIFBNVV9FVlRfUE9XRVIJMAorI2RlZmluZSBQTVVfRVZUX0xJRAkxCitleHRlcm4gdm9pZCB2aWFfcG11X2V2ZW50KGludCBrZXksIGludCBkb3duKTsKKworI2VuZGlmIC8qIF9fVklBX1BNVV9FVkVOVF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21hY2ludG9zaC92aWEtcG11LmMgYi9kcml2ZXJzL21hY2ludG9zaC92aWEtcG11LmMKaW5kZXggYzYzZDRlNy4uMWFiNGYxNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tYWNpbnRvc2gvdmlhLXBtdS5jCisrKyBiL2RyaXZlcnMvbWFjaW50b3NoL3ZpYS1wbXUuYwpAQCAtNjksNiArNjksOCBAQAogI2luY2x1ZGUgPGFzbS9vcGVuX3BpYy5oPgogI2VuZGlmCiAKKyNpbmNsdWRlICJ2aWEtcG11LWV2ZW50LmgiCisKIC8qIFNvbWUgY29tcGlsZSBvcHRpb25zICovCiAjdW5kZWYgU1VTUEVORF9VU0VTX1BNVQogI2RlZmluZSBERUJVR19TTEVFUApAQCAtMTQ0LDcgKzE0Niw2IEBACiBzdGF0aWMgaW50IGRhdGFfbGVuOwogc3RhdGljIHZvbGF0aWxlIGludCBhZGJfaW50X3BlbmRpbmc7CiBzdGF0aWMgdm9sYXRpbGUgaW50IGRpc2FibGVfcG9sbDsKLXN0YXRpYyBzdHJ1Y3QgYWRiX3JlcXVlc3QgYnJpZ2h0X3JlcV8xLCBicmlnaHRfcmVxXzI7CiBzdGF0aWMgc3RydWN0IGRldmljZV9ub2RlICp2aWFzOwogc3RhdGljIGludCBwbXVfa2luZCA9IFBNVV9VTktOT1dOOwogc3RhdGljIGludCBwbXVfZnVsbHlfaW5pdGVkID0gMDsKQEAgLTE2MSw3ICsxNjIsNyBAQAogI2lmIGRlZmluZWQoQ09ORklHX1BNKSAmJiBkZWZpbmVkKENPTkZJR19QUEMzMikKIHN0YXRpYyBpbnQgb3B0aW9uX2xpZF93YWtldXAgPSAxOwogI2VuZGlmIC8qIENPTkZJR19QTSAmJiBDT05GSUdfUFBDMzIgKi8KLSNpZiAoZGVmaW5lZChDT05GSUdfUE0pJiZkZWZpbmVkKENPTkZJR19QUEMzMikpfHxkZWZpbmVkKENPTkZJR19QTUFDX0JBQ0tMSUdIVCkKKyNpZiAoZGVmaW5lZChDT05GSUdfUE0pJiZkZWZpbmVkKENPTkZJR19QUEMzMikpfHxkZWZpbmVkKENPTkZJR19QTUFDX0JBQ0tMSUdIVF9MRUdBQ1kpCiBzdGF0aWMgaW50IHNsZWVwX2luX3Byb2dyZXNzOwogI2VuZGlmCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBhc3luY19yZXFfbG9ja3M7CkBAIC0yMDgsMTAgKzIwOSw2IEBACiAJCQkgIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpOwogc3RhdGljIGludCBwcm9jX2dldF9pcnFzdGF0cyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwKIAkJCSAgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSk7Ci0jaWZkZWYgQ09ORklHX1BNQUNfQkFDS0xJR0hUCi1zdGF0aWMgaW50IHBtdV9zZXRfYmFja2xpZ2h0X2xldmVsKGludCBsZXZlbCwgdm9pZCogZGF0YSk7Ci1zdGF0aWMgaW50IHBtdV9zZXRfYmFja2xpZ2h0X2VuYWJsZShpbnQgb24sIGludCBsZXZlbCwgdm9pZCogZGF0YSk7Ci0jZW5kaWYgLyogQ09ORklHX1BNQUNfQkFDS0xJR0hUICovCiBzdGF0aWMgdm9pZCBwbXVfcGFzc19pbnRyKHVuc2lnbmVkIGNoYXIgKmRhdGEsIGludCBsZW4pOwogc3RhdGljIGludCBwcm9jX2dldF9iYXR0KGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAogCQkJaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSk7CkBAIC0yOTIsMTMgKzI4OSw2IEBACiAJIkNvcmU5OSIKIH07CiAKLSNpZmRlZiBDT05GSUdfUE1BQ19CQUNLTElHSFQKLXN0YXRpYyBzdHJ1Y3QgYmFja2xpZ2h0X2NvbnRyb2xsZXIgcG11X2JhY2tsaWdodF9jb250cm9sbGVyID0gewotCXBtdV9zZXRfYmFja2xpZ2h0X2VuYWJsZSwKLQlwbXVfc2V0X2JhY2tsaWdodF9sZXZlbAotfTsKLSNlbmRpZiAvKiBDT05GSUdfUE1BQ19CQUNLTElHSFQgKi8KLQogaW50IF9faW5pdCBmaW5kX3ZpYV9wbXUodm9pZCkKIHsKIAl1NjQgdGFkZHI7CkBAIC00MTcsOCArNDA3LDYgQEAKIAlpZiAodmlhcyA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWJyaWdodF9yZXFfMS5jb21wbGV0ZSA9IDE7Ci0JYnJpZ2h0X3JlcV8yLmNvbXBsZXRlID0gMTsKIAliYXR0X3JlcS5jb21wbGV0ZSA9IDE7CiAKICNpZm5kZWYgQ09ORklHX1BQQ19NRVJHRQpAQCAtNDgzLDkgKzQ3MSw5IEBACiAJCXJldHVybiAtRU5PREVWOwogCiAjaWZkZWYgQ09ORklHX1BNQUNfQkFDS0xJR0hUCi0JLyogRW5hYmxlIGJhY2tsaWdodCAqLwotCXJlZ2lzdGVyX2JhY2tsaWdodF9jb250cm9sbGVyKCZwbXVfYmFja2xpZ2h0X2NvbnRyb2xsZXIsIE5VTEwsICJwbXUiKTsKLSNlbmRpZiAvKiBDT05GSUdfUE1BQ19CQUNLTElHSFQgKi8KKwkvKiBJbml0aWFsaXplIGJhY2tsaWdodCAqLworCXBtdV9iYWNrbGlnaHRfaW5pdCh2aWFzKTsKKyNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1BQQzMyCiAgIAlpZiAobWFjaGluZV9pc19jb21wYXRpYmxlKCJBQVBMLDM0MDAvMjQwMCIpIHx8CkBAIC0xNDI0LDcgKzE0MTIsNyBAQAogI2lmZGVmIENPTkZJR19JTlBVVF9BREJISUQKIAkJCWlmICghZGlzYWJsZV9rZXJuZWxfYmFja2xpZ2h0KQogI2VuZGlmIC8qIENPTkZJR19JTlBVVF9BREJISUQgKi8KLQkJCQlzZXRfYmFja2xpZ2h0X2xldmVsKGRhdGFbMV0gPj4gNCk7CisJCQkJcG1hY19iYWNrbGlnaHRfc2V0X2xlZ2FjeV9icmlnaHRuZXNzKGRhdGFbMV0gPj4gNCk7CiAjZW5kaWYgLyogQ09ORklHX1BNQUNfQkFDS0xJR0hUICovCiAJfQogCS8qIFRpY2sgaW50ZXJydXB0ICovCkBAIC0xNDQxLDYgKzE0MjksMTIgQEAKIAkJaWYgKHBtdV9iYXR0ZXJ5X2NvdW50KQogCQkJcXVlcnlfYmF0dGVyeV9zdGF0ZSgpOwogCQlwbXVfcGFzc19pbnRyKGRhdGEsIGxlbik7CisJCS8qIGxlbiA9PSA2IGlzIHByb2JhYmx5IGEgYmFkIGNoZWNrLiBCdXQgaG93IGRvIEkKKwkJICoga25vdyB3aGF0IFBNVSB2ZXJzaW9ucyBzZW5kIHdoYXQgZXZlbnRzIGhlcmU/ICovCisJCWlmIChsZW4gPT0gNikgeworCQkJdmlhX3BtdV9ldmVudChQTVVfRVZUX1BPV0VSLCAhIShkYXRhWzFdJjgpKTsKKwkJCXZpYV9wbXVfZXZlbnQoUE1VX0VWVF9MSUQsIGRhdGFbMV0mMSk7CisJCX0KIAl9IGVsc2UgewogCSAgICAgICBwbXVfcGFzc19pbnRyKGRhdGEsIGxlbik7CiAJfQpAQCAtMTY3NCw2MSArMTY2OCw2IEBACiAJcmV0dXJuIElSUV9OT05FOwogfQogCi0jaWZkZWYgQ09ORklHX1BNQUNfQkFDS0xJR0hUCi1zdGF0aWMgaW50IGJhY2tsaWdodF90b19icmlnaHRbXSA9IHsKLQkweDdmLCAweDQ2LCAweDQyLCAweDNlLCAweDNhLCAweDM2LCAweDMyLCAweDJlLAotCTB4MmEsIDB4MjYsIDB4MjIsIDB4MWUsIDB4MWEsIDB4MTYsIDB4MTIsIDB4MGUKLX07Ci0gCi1zdGF0aWMgaW50Ci1wbXVfc2V0X2JhY2tsaWdodF9lbmFibGUoaW50IG9uLCBpbnQgbGV2ZWwsIHZvaWQqIGRhdGEpCi17Ci0Jc3RydWN0IGFkYl9yZXF1ZXN0IHJlcTsKLQkKLQlpZiAodmlhcyA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWlmIChvbikgewotCQlwbXVfcmVxdWVzdCgmcmVxLCBOVUxMLCAyLCBQTVVfQkFDS0xJR0hUX0JSSUdIVCwKLQkJCSAgICBiYWNrbGlnaHRfdG9fYnJpZ2h0W2xldmVsXSk7Ci0JCXBtdV93YWl0X2NvbXBsZXRlKCZyZXEpOwotCX0KLQlwbXVfcmVxdWVzdCgmcmVxLCBOVUxMLCAyLCBQTVVfUE9XRVJfQ1RSTCwKLQkJICAgIFBNVV9QT1dfQkFDS0xJR0hUIHwgKG9uID8gUE1VX1BPV19PTiA6IFBNVV9QT1dfT0ZGKSk7Ci0gICAgICAgCXBtdV93YWl0X2NvbXBsZXRlKCZyZXEpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wbXVfYnJpZ2h0X2NvbXBsZXRlKHN0cnVjdCBhZGJfcmVxdWVzdCAqcmVxKQotewotCWlmIChyZXEgPT0gJmJyaWdodF9yZXFfMSkKLQkJY2xlYXJfYml0KDEsICZhc3luY19yZXFfbG9ja3MpOwotCWlmIChyZXEgPT0gJmJyaWdodF9yZXFfMikKLQkJY2xlYXJfYml0KDIsICZhc3luY19yZXFfbG9ja3MpOwotfQotCi1zdGF0aWMgaW50Ci1wbXVfc2V0X2JhY2tsaWdodF9sZXZlbChpbnQgbGV2ZWwsIHZvaWQqIGRhdGEpCi17Ci0JaWYgKHZpYXMgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlpZiAodGVzdF9hbmRfc2V0X2JpdCgxLCAmYXN5bmNfcmVxX2xvY2tzKSkKLQkJcmV0dXJuIC1FQUdBSU47Ci0JcG11X3JlcXVlc3QoJmJyaWdodF9yZXFfMSwgcG11X2JyaWdodF9jb21wbGV0ZSwgMiwgUE1VX0JBQ0tMSUdIVF9CUklHSFQsCi0JCWJhY2tsaWdodF90b19icmlnaHRbbGV2ZWxdKTsKLQlpZiAodGVzdF9hbmRfc2V0X2JpdCgyLCAmYXN5bmNfcmVxX2xvY2tzKSkKLQkJcmV0dXJuIC1FQUdBSU47Ci0JcG11X3JlcXVlc3QoJmJyaWdodF9yZXFfMiwgcG11X2JyaWdodF9jb21wbGV0ZSwgMiwgUE1VX1BPV0VSX0NUUkwsCi0JCSAgICBQTVVfUE9XX0JBQ0tMSUdIVCB8IChsZXZlbCA+IEJBQ0tMSUdIVF9PRkYgPwotCQkJCQkgUE1VX1BPV19PTiA6IFBNVV9QT1dfT0ZGKSk7Ci0KLQlyZXR1cm4gMDsKLX0KLSNlbmRpZiAvKiBDT05GSUdfUE1BQ19CQUNLTElHSFQgKi8KLQogdm9pZAogcG11X2VuYWJsZV9pcmxlZChpbnQgb24pCiB7CkBAIC0yMTQ1LDkgKzIwODQsOCBAQAogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAotCS8qIFdhaXQgZm9yIGNvbXBsZXRpb24gb2YgYXN5bmMgYmFja2xpZ2h0IHJlcXVlc3RzICovCi0Jd2hpbGUgKCFicmlnaHRfcmVxXzEuY29tcGxldGUgfHwgIWJyaWdodF9yZXFfMi5jb21wbGV0ZSB8fAotCQkJIWJhdHRfcmVxLmNvbXBsZXRlKQorCS8qIFdhaXQgZm9yIGNvbXBsZXRpb24gb2YgYXN5bmMgcmVxdWVzdHMgKi8KKwl3aGlsZSAoIWJhdHRfcmVxLmNvbXBsZXRlKQogCQlwbXVfcG9sbCgpOwogCiAJLyogR2l2ZXVwIHRoZSBsYXp5IEZQVSAmIHZlYyBzbyB3ZSBkb24ndCBoYXZlIHRvIGJhY2sgdGhlbQpAQCAtMjY3OCwyNiArMjYxNiwzNCBAQAogCQkJcmV0dXJuIHB1dF91c2VyKDEsIGFyZ3ApOwogI2VuZGlmIC8qIENPTkZJR19QTSAmJiBDT05GSUdfUFBDMzIgKi8KIAotI2lmZGVmIENPTkZJR19QTUFDX0JBQ0tMSUdIVAotCS8qIEJhY2tsaWdodCBzaG91bGQgaGF2ZSBpdHMgb3duIGRldmljZSBvciBnbyB2aWEKLQkgKiB0aGUgZmJkZXYKLQkgKi8KKyNpZmRlZiBDT05GSUdfUE1BQ19CQUNLTElHSFRfTEVHQUNZCisJLyogQ29tcGF0aWJpbGl0eSBpb2N0bCdzIGZvciBiYWNrbGlnaHQgKi8KIAljYXNlIFBNVV9JT0NfR0VUX0JBQ0tMSUdIVDoKKwl7CisJCWludCBicmlnaHRuZXNzOworCiAJCWlmIChzbGVlcF9pbl9wcm9ncmVzcykKIAkJCXJldHVybiAtRUJVU1k7Ci0JCWVycm9yID0gZ2V0X2JhY2tsaWdodF9sZXZlbCgpOwotCQlpZiAoZXJyb3IgPCAwKQotCQkJcmV0dXJuIGVycm9yOwotCQlyZXR1cm4gcHV0X3VzZXIoZXJyb3IsIGFyZ3ApOworCisJCWJyaWdodG5lc3MgPSBwbWFjX2JhY2tsaWdodF9nZXRfbGVnYWN5X2JyaWdodG5lc3MoKTsKKwkJaWYgKGJyaWdodG5lc3MgPCAwKQorCQkJcmV0dXJuIGJyaWdodG5lc3M7CisJCWVsc2UKKwkJCXJldHVybiBwdXRfdXNlcihicmlnaHRuZXNzLCBhcmdwKTsKKworCX0KIAljYXNlIFBNVV9JT0NfU0VUX0JBQ0tMSUdIVDoKIAl7Ci0JCV9fdTMyIHZhbHVlOworCQlpbnQgYnJpZ2h0bmVzczsKKwogCQlpZiAoc2xlZXBfaW5fcHJvZ3Jlc3MpCiAJCQlyZXR1cm4gLUVCVVNZOwotCQllcnJvciA9IGdldF91c2VyKHZhbHVlLCBhcmdwKTsKLQkJaWYgKCFlcnJvcikKLQkJCWVycm9yID0gc2V0X2JhY2tsaWdodF9sZXZlbCh2YWx1ZSk7Ci0JCWJyZWFrOworCisJCWVycm9yID0gZ2V0X3VzZXIoYnJpZ2h0bmVzcywgYXJncCk7CisJCWlmIChlcnJvcikKKwkJCXJldHVybiBlcnJvcjsKKworCQlyZXR1cm4gcG1hY19iYWNrbGlnaHRfc2V0X2xlZ2FjeV9icmlnaHRuZXNzKGJyaWdodG5lc3MpOwogCX0KICNpZmRlZiBDT05GSUdfSU5QVVRfQURCSElECiAJY2FzZSBQTVVfSU9DX0dSQUJfQkFDS0xJR0hUOiB7CkBAIC0yNzEzLDcgKzI2NTksNyBAQAogCQlyZXR1cm4gMDsKIAl9CiAjZW5kaWYgLyogQ09ORklHX0lOUFVUX0FEQkhJRCAqLwotI2VuZGlmIC8qIENPTkZJR19QTUFDX0JBQ0tMSUdIVCAqLworI2VuZGlmIC8qIENPTkZJR19QTUFDX0JBQ0tMSUdIVF9MRUdBQ1kgKi8KIAljYXNlIFBNVV9JT0NfR0VUX01PREVMOgogCSAgICAJcmV0dXJuIHB1dF91c2VyKHBtdV9raW5kLCBhcmdwKTsKIAljYXNlIFBNVV9JT0NfSEFTX0FEQjoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvS2NvbmZpZyBiL2RyaXZlcnMvbWQvS2NvbmZpZwppbmRleCBhYzI1YTQ4Li5iZjg2OWVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL0tjb25maWcKKysrIGIvZHJpdmVycy9tZC9LY29uZmlnCkBAIC05MCw3ICs5MCw3IEBACiAJZGVwZW5kcyBvbiBCTEtfREVWX01EICYmIEVYUEVSSU1FTlRBTAogCS0tLWhlbHAtLS0KIAkgIFJBSUQtMTAgcHJvdmlkZXMgYSBjb21iaW5hdGlvbiBvZiBzdHJpcGluZyAoUkFJRC0wKSBhbmQKLQkgIG1pcnJvcmluZyAoUkFJRC0xKSB3aXRoIGVhc2llciBjb25maWd1cmF0aW9uIGFuZCBtb3JlIGZsZXhhYmxlCisJICBtaXJyb3JpbmcgKFJBSUQtMSkgd2l0aCBlYXNpZXIgY29uZmlndXJhdGlvbiBhbmQgbW9yZSBmbGV4aWJsZQogCSAgbGF5b3V0LgogCSAgVW5saWtlIFJBSUQtMCwgYnV0IGxpa2UgUkFJRC0xLCBSQUlELTEwIHJlcXVpcmVzIGFsbCBkZXZpY2VzIHRvCiAJICBiZSB0aGUgc2FtZSBzaXplIChvciBhdCBsZWFzdCwgb25seSBhcyBtdWNoIGFzIHRoZSBzbWFsbGVzdCBkZXZpY2UKQEAgLTEwNCw4ICsxMDQsOCBAQAogCiAJICBJZiB1bnN1cmUsIHNheSBZLgogCi1jb25maWcgTURfUkFJRDUKLQl0cmlzdGF0ZSAiUkFJRC00L1JBSUQtNSBtb2RlIgorY29uZmlnIE1EX1JBSUQ0NTYKKwl0cmlzdGF0ZSAiUkFJRC00L1JBSUQtNS9SQUlELTYgbW9kZSIKIAlkZXBlbmRzIG9uIEJMS19ERVZfTUQKIAktLS1oZWxwLS0tCiAJICBBIFJBSUQtNSBzZXQgb2YgTiBkcml2ZXMgd2l0aCBhIGNhcGFjaXR5IG9mIEMgTUIgcGVyIGRyaXZlIHByb3ZpZGVzCkBAIC0xMTYsMjAgKzExNiwyOCBAQAogCSAgd2hpbGUgYSBSQUlELTUgc2V0IGRpc3RyaWJ1dGVzIHRoZSBwYXJpdHkgYWNyb3NzIHRoZSBkcml2ZXMgaW4gb25lCiAJICBvZiB0aGUgYXZhaWxhYmxlIHBhcml0eSBkaXN0cmlidXRpb24gbWV0aG9kcy4KIAorCSAgQSBSQUlELTYgc2V0IG9mIE4gZHJpdmVzIHdpdGggYSBjYXBhY2l0eSBvZiBDIE1CIHBlciBkcml2ZQorCSAgcHJvdmlkZXMgdGhlIGNhcGFjaXR5IG9mIEMgKiAoTiAtIDIpIE1CLCBhbmQgcHJvdGVjdHMKKwkgIGFnYWluc3QgYSBmYWlsdXJlIG9mIGFueSB0d28gZHJpdmVzLiBGb3IgYSBnaXZlbiBzZWN0b3IKKwkgIChyb3cpIG51bWJlciwgKE4gLSAyKSBkcml2ZXMgY29udGFpbiBkYXRhIHNlY3RvcnMsIGFuZCB0d28KKwkgIGRyaXZlcyBjb250YWlucyB0d28gaW5kZXBlbmRlbnQgcmVkdW5kYW5jeSBzeW5kcm9tZXMuICBMaWtlCisJICBSQUlELTUsIFJBSUQtNiBkaXN0cmlidXRlcyB0aGUgc3luZHJvbWVzIGFjcm9zcyB0aGUgZHJpdmVzCisJICBpbiBvbmUgb2YgdGhlIGF2YWlsYWJsZSBwYXJpdHkgZGlzdHJpYnV0aW9uIG1ldGhvZHMuCisKIAkgIEluZm9ybWF0aW9uIGFib3V0IFNvZnR3YXJlIFJBSUQgb24gTGludXggaXMgY29udGFpbmVkIGluIHRoZQogCSAgU29mdHdhcmUtUkFJRCBtaW5pLUhPV1RPLCBhdmFpbGFibGUgZnJvbQogCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4gVGhlcmUgeW91IHdpbGwgYWxzbwogCSAgbGVhcm4gd2hlcmUgdG8gZ2V0IHRoZSBzdXBwb3J0aW5nIHVzZXIgc3BhY2UgdXRpbGl0aWVzIHJhaWR0b29scy4KIAotCSAgSWYgeW91IHdhbnQgdG8gdXNlIHN1Y2ggYSBSQUlELTQvUkFJRC01IHNldCwgc2F5IFkuICBUbworCSAgSWYgeW91IHdhbnQgdG8gdXNlIHN1Y2ggYSBSQUlELTQvUkFJRC01L1JBSUQtNiBzZXQsIHNheSBZLiAgVG8KIAkgIGNvbXBpbGUgdGhpcyBjb2RlIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCi0JICB3aWxsIGJlIGNhbGxlZCByYWlkNS4KKwkgIHdpbGwgYmUgY2FsbGVkIHJhaWQ0NTYuCiAKIAkgIElmIHVuc3VyZSwgc2F5IFkuCiAKIGNvbmZpZyBNRF9SQUlENV9SRVNIQVBFCiAJYm9vbCAiU3VwcG9ydCBhZGRpbmcgZHJpdmVzIHRvIGEgcmFpZC01IGFycmF5IChleHBlcmltZW50YWwpIgotCWRlcGVuZHMgb24gTURfUkFJRDUgJiYgRVhQRVJJTUVOVEFMCisJZGVwZW5kcyBvbiBNRF9SQUlENDU2ICYmIEVYUEVSSU1FTlRBTAogCS0tLWhlbHAtLS0KIAkgIEEgUkFJRC01IHNldCBjYW4gYmUgZXhwYW5kZWQgYnkgYWRkaW5nIGV4dHJhIGRyaXZlcy4gVGhpcwogCSAgcmVxdWlyZXMgInJlc3RyaXBpbmciIHRoZSBhcnJheSB3aGljaCBtZWFucyAoYWxtb3N0KSBldmVyeQpAQCAtMTM5LDcgKzE0Nyw3IEBACiAJICBpcyBvbmxpbmUuICBIb3dldmVyIGl0IGlzIHN0aWxsIEVYUEVSSU1FTlRBTCBjb2RlLiAgSXQgc2hvdWxkCiAJICB3b3JrLCBidXQgcGxlYXNlIGJlIHN1cmUgdGhhdCB5b3UgaGF2ZSBiYWNrdXBzLgogCi0JICBZb3Ugd2lsbCBuZWVkIG1kYWRtIHZlcmlvbiAyLjQuMSBvciBsYXRlciB0byB1c2UgdGhpcworCSAgWW91IHdpbGwgbmVlZCBtZGFkbSB2ZXJzaW9uIDIuNC4xIG9yIGxhdGVyIHRvIHVzZSB0aGlzCiAJICBmZWF0dXJlIHNhZmVseS4gIER1cmluZyB0aGUgZWFybHkgc3RhZ2Ugb2YgcmVzaGFwZSB0aGVyZSBpcwogCSAgYSBjcml0aWNhbCBzZWN0aW9uIHdoZXJlIGxpdmUgZGF0YSBpcyBiZWluZyBvdmVyLXdyaXR0ZW4uICBBCiAJICBjcmFzaCBkdXJpbmcgdGhpcyB0aW1lIG5lZWRzIGV4dHJhIGNhcmUgZm9yIHJlY292ZXJ5LiAgVGhlCkBAIC0xNTQsMjggKzE2Miw2IEBACiAJICBUaGVyZSBzaG91bGQgYmUgZW5vdWdoIHNwYXJlcyBhbHJlYWR5IHByZXNlbnQgdG8gbWFrZSB0aGUgbmV3CiAJICBhcnJheSB3b3JrYWJsZS4KIAotY29uZmlnIE1EX1JBSUQ2Ci0JdHJpc3RhdGUgIlJBSUQtNiBtb2RlIgotCWRlcGVuZHMgb24gQkxLX0RFVl9NRAotCS0tLWhlbHAtLS0KLQkgIEEgUkFJRC02IHNldCBvZiBOIGRyaXZlcyB3aXRoIGEgY2FwYWNpdHkgb2YgQyBNQiBwZXIgZHJpdmUKLQkgIHByb3ZpZGVzIHRoZSBjYXBhY2l0eSBvZiBDICogKE4gLSAyKSBNQiwgYW5kIHByb3RlY3RzCi0JICBhZ2FpbnN0IGEgZmFpbHVyZSBvZiBhbnkgdHdvIGRyaXZlcy4gRm9yIGEgZ2l2ZW4gc2VjdG9yCi0JICAocm93KSBudW1iZXIsIChOIC0gMikgZHJpdmVzIGNvbnRhaW4gZGF0YSBzZWN0b3JzLCBhbmQgdHdvCi0JICBkcml2ZXMgY29udGFpbnMgdHdvIGluZGVwZW5kZW50IHJlZHVuZGFuY3kgc3luZHJvbWVzLiAgTGlrZQotCSAgUkFJRC01LCBSQUlELTYgZGlzdHJpYnV0ZXMgdGhlIHN5bmRyb21lcyBhY3Jvc3MgdGhlIGRyaXZlcwotCSAgaW4gb25lIG9mIHRoZSBhdmFpbGFibGUgcGFyaXR5IGRpc3RyaWJ1dGlvbiBtZXRob2RzLgotCi0JICBSQUlELTYgcmVxdWlyZXMgbWRhZG0tMS41LjAgb3IgbGF0ZXIsIGF2YWlsYWJsZSBhdDoKLQotCSAgZnRwOi8vZnRwLmtlcm5lbC5vcmcvcHViL2xpbnV4L3V0aWxzL3JhaWQvbWRhZG0vCi0KLQkgIElmIHlvdSB3YW50IHRvIHVzZSBzdWNoIGEgUkFJRC02IHNldCwgc2F5IFkuICBUbyBjb21waWxlCi0JICB0aGlzIGNvZGUgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZQotCSAgY2FsbGVkIHJhaWQ2LgotCi0JICBJZiB1bnN1cmUsIHNheSBZLgotCiBjb25maWcgTURfTVVMVElQQVRICiAJdHJpc3RhdGUgIk11bHRpcGF0aCBJL08gc3VwcG9ydCIKIAlkZXBlbmRzIG9uIEJMS19ERVZfTUQKQEAgLTIzNSw3ICsyMjEsNyBAQAogICAgICAgIHRyaXN0YXRlICJTbmFwc2hvdCB0YXJnZXQgKEVYUEVSSU1FTlRBTCkiCiAgICAgICAgZGVwZW5kcyBvbiBCTEtfREVWX0RNICYmIEVYUEVSSU1FTlRBTAogICAgICAgIC0tLWhlbHAtLS0KLSAgICAgICAgIEFsbG93IHZvbHVtZSBtYW5hZ2VycyB0byB0YWtlIHdyaXRlYWJsZSBzbmFwc2hvdHMgb2YgYSBkZXZpY2UuCisgICAgICAgICBBbGxvdyB2b2x1bWUgbWFuYWdlcnMgdG8gdGFrZSB3cml0YWJsZSBzbmFwc2hvdHMgb2YgYSBkZXZpY2UuCiAKIGNvbmZpZyBETV9NSVJST1IKICAgICAgICB0cmlzdGF0ZSAiTWlycm9yIHRhcmdldCAoRVhQRVJJTUVOVEFMKSIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvTWFrZWZpbGUgYi9kcml2ZXJzL21kL01ha2VmaWxlCmluZGV4IGQzZWZlZGYuLjM0OTU3YTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZC9NYWtlZmlsZQpAQCAtOCw3ICs4LDcgQEAKIGRtLXNuYXBzaG90LW9ianMgOj0gZG0tc25hcC5vIGRtLWV4Y2VwdGlvbi1zdG9yZS5vCiBkbS1taXJyb3Itb2Jqcwk6PSBkbS1sb2cubyBkbS1yYWlkMS5vCiBtZC1tb2Qtb2JqcyAgICAgOj0gbWQubyBiaXRtYXAubwotcmFpZDYtb2Jqcwk6PSByYWlkNm1haW4ubyByYWlkNmFsZ29zLm8gcmFpZDZyZWNvdi5vIHJhaWQ2dGFibGVzLm8gXAorcmFpZDQ1Ni1vYmpzCTo9IHJhaWQ1Lm8gcmFpZDZhbGdvcy5vIHJhaWQ2cmVjb3YubyByYWlkNnRhYmxlcy5vIFwKIAkJICAgcmFpZDZpbnQxLm8gcmFpZDZpbnQyLm8gcmFpZDZpbnQ0Lm8gXAogCQkgICByYWlkNmludDgubyByYWlkNmludDE2Lm8gcmFpZDZpbnQzMi5vIFwKIAkJICAgcmFpZDZhbHRpdmVjMS5vIHJhaWQ2YWx0aXZlYzIubyByYWlkNmFsdGl2ZWM0Lm8gXApAQCAtMjUsOCArMjUsNyBAQAogb2JqLSQoQ09ORklHX01EX1JBSUQwKQkJKz0gcmFpZDAubwogb2JqLSQoQ09ORklHX01EX1JBSUQxKQkJKz0gcmFpZDEubwogb2JqLSQoQ09ORklHX01EX1JBSUQxMCkJCSs9IHJhaWQxMC5vCi1vYmotJChDT05GSUdfTURfUkFJRDUpCQkrPSByYWlkNS5vIHhvci5vCi1vYmotJChDT05GSUdfTURfUkFJRDYpCQkrPSByYWlkNi5vIHhvci5vCitvYmotJChDT05GSUdfTURfUkFJRDQ1NikJKz0gcmFpZDQ1Ni5vIHhvci5vCiBvYmotJChDT05GSUdfTURfTVVMVElQQVRIKQkrPSBtdWx0aXBhdGgubwogb2JqLSQoQ09ORklHX01EX0ZBVUxUWSkJCSs9IGZhdWx0eS5vCiBvYmotJChDT05GSUdfQkxLX0RFVl9NRCkJKz0gbWQtbW9kLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvYml0bWFwLmMgYi9kcml2ZXJzL21kL2JpdG1hcC5jCmluZGV4IGY4ZmZhZWUuLmViYmQyZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvYml0bWFwLmMKKysrIGIvZHJpdmVycy9tZC9iaXRtYXAuYwpAQCAtNyw3ICs3LDYgQEAKICAqIGFkZGl0aW9ucywgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDQsIFBhdWwgQ2xlbWVudHMsIFN0ZWVsRXllIFRlY2hub2xvZ3ksIEluYy46CiAgKiAtIGFkZGVkIGRpc2sgc3RvcmFnZSBmb3IgYml0bWFwCiAgKiAtIGNoYW5nZXMgdG8gYWxsb3cgdmFyaW91cyBiaXRtYXAgY2h1bmsgc2l6ZXMKLSAqIC0gYWRkZWQgYml0bWFwIGRhZW1vbiAodG8gYXN5bmNocm9ub3VzbHkgY2xlYXIgYml0bWFwIGJpdHMgZnJvbSBkaXNrKQogICovCiAKIC8qCkBAIC0xNSw5ICsxNCw2IEBACiAgKgogICogZmx1c2ggYWZ0ZXIgcGVyY2VudCBzZXQgcmF0aGVyIHRoYW4ganVzdCB0aW1lIGJhc2VkLiAobWF5YmUgYm90aCkuCiAgKiB3YWl0IGlmIGNvdW50IGdldHMgdG9vIGhpZ2gsIHdha2Ugd2hlbiBpdCBkcm9wcyB0byBoYWxmLgotICogYWxsb3cgYml0bWFwIHRvIGJlIG1pcnJvcmVkIHdpdGggc3VwZXJibG9jayAoYmVmb3JlIG9yIGFmdGVyLi4uKQotICogYWxsb3cgaG90LWFkZCB0byByZS1pbnN0YXRlIGEgY3VycmVudCBkZXZpY2UuCi0gKiBhbGxvdyBob3QtYWRkIG9mIGJpdG1hcCBhZnRlciBxdWllc3NpbmcgZGV2aWNlCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtNzMsMjQgKzY5LDYgQEAKIAogCiAvKgotICogdGVzdCBpZiB0aGUgYml0bWFwIGlzIGFjdGl2ZQotICovCi1pbnQgYml0bWFwX2FjdGl2ZShzdHJ1Y3QgYml0bWFwICpiaXRtYXApCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgcmVzID0gMDsKLQotCWlmICghYml0bWFwKQotCQlyZXR1cm4gcmVzOwotCXNwaW5fbG9ja19pcnFzYXZlKCZiaXRtYXAtPmxvY2ssIGZsYWdzKTsKLQlyZXMgPSBiaXRtYXAtPmZsYWdzICYgQklUTUFQX0FDVElWRTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiaXRtYXAtPmxvY2ssIGZsYWdzKTsKLQlyZXR1cm4gcmVzOwotfQotCi0jZGVmaW5lIFdSSVRFX1BPT0xfU0laRSAyNTYKLQotLyoKICAqIGp1c3QgYSBwbGFjZWhvbGRlciAtIGNhbGxzIGttYWxsb2MgZm9yIGJpdG1hcCBwYWdlcwogICovCiBzdGF0aWMgdW5zaWduZWQgY2hhciAqYml0bWFwX2FsbG9jX3BhZ2Uoc3RydWN0IGJpdG1hcCAqYml0bWFwKQpAQCAtMjY5LDYgKzI0Nyw4IEBACiAKIAkJaWYgKHN5bmNfcGFnZV9pbyhyZGV2LT5iZGV2LCB0YXJnZXQsIFBBR0VfU0laRSwgcGFnZSwgUkVBRCkpIHsKIAkJCXBhZ2UtPmluZGV4ID0gaW5kZXg7CisJCQlhdHRhY2hfcGFnZV9idWZmZXJzKHBhZ2UsIE5VTEwpOyAvKiBzbyB0aGF0IGZyZWVfYnVmZmVyIHdpbGwKKwkJCQkJCQkgICogcXVpZXRseSBuby1vcCAqLwogCQkJcmV0dXJuIHBhZ2U7CiAJCX0KIAl9CkBAIC0zMDAsNzcgKzI4MCwxMzIgQEAKICAqLwogc3RhdGljIGludCB3cml0ZV9wYWdlKHN0cnVjdCBiaXRtYXAgKmJpdG1hcCwgc3RydWN0IHBhZ2UgKnBhZ2UsIGludCB3YWl0KQogewotCWludCByZXQgPSAtRU5PTUVNOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CiAKIAlpZiAoYml0bWFwLT5maWxlID09IE5VTEwpCiAJCXJldHVybiB3cml0ZV9zYl9wYWdlKGJpdG1hcC0+bWRkZXYsIGJpdG1hcC0+b2Zmc2V0LCBwYWdlLCB3YWl0KTsKIAotCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOyAvKiBtYWtlIHN1cmUgdmlzaWJsZSB0byBhbnlvbmUgcmVhZGluZyB0aGUgZmlsZSAqLworCWJoID0gcGFnZV9idWZmZXJzKHBhZ2UpOwogCi0JaWYgKHdhaXQpCi0JCWxvY2tfcGFnZShwYWdlKTsKLQllbHNlIHsKLQkJaWYgKFRlc3RTZXRQYWdlTG9ja2VkKHBhZ2UpKQotCQkJcmV0dXJuIC1FQUdBSU47IC8qIGFscmVhZHkgbG9ja2VkICovCi0JCWlmIChQYWdlV3JpdGViYWNrKHBhZ2UpKSB7Ci0JCQl1bmxvY2tfcGFnZShwYWdlKTsKLQkJCXJldHVybiAtRUFHQUlOOwotCQl9CisJd2hpbGUgKGJoICYmIGJoLT5iX2Jsb2NrbnIpIHsKKwkJYXRvbWljX2luYygmYml0bWFwLT5wZW5kaW5nX3dyaXRlcyk7CisJCXNldF9idWZmZXJfbG9ja2VkKGJoKTsKKwkJc2V0X2J1ZmZlcl9tYXBwZWQoYmgpOworCQlzdWJtaXRfYmgoV1JJVEUsIGJoKTsKKwkJYmggPSBiaC0+Yl90aGlzX3BhZ2U7CiAJfQogCi0JcmV0ID0gcGFnZS0+bWFwcGluZy0+YV9vcHMtPnByZXBhcmVfd3JpdGUoYml0bWFwLT5maWxlLCBwYWdlLCAwLCBQQUdFX1NJWkUpOwotCWlmICghcmV0KQotCQlyZXQgPSBwYWdlLT5tYXBwaW5nLT5hX29wcy0+Y29tbWl0X3dyaXRlKGJpdG1hcC0+ZmlsZSwgcGFnZSwgMCwKLQkJCVBBR0VfU0laRSk7Ci0JaWYgKHJldCkgewotCQl1bmxvY2tfcGFnZShwYWdlKTsKLQkJcmV0dXJuIHJldDsKKwlpZiAod2FpdCkgeworCQl3YWl0X2V2ZW50KGJpdG1hcC0+d3JpdGVfd2FpdCwKKwkJCSAgIGF0b21pY19yZWFkKCZiaXRtYXAtPnBlbmRpbmdfd3JpdGVzKT09MCk7CisJCXJldHVybiAoYml0bWFwLT5mbGFncyAmIEJJVE1BUF9XUklURV9FUlJPUikgPyAtRUlPIDogMDsKIAl9Ci0KLQlzZXRfcGFnZV9kaXJ0eShwYWdlKTsgLyogZm9yY2UgaXQgdG8gYmUgd3JpdHRlbiBvdXQgKi8KLQotCWlmICghd2FpdCkgewotCQkvKiBhZGQgdG8gbGlzdCB0byBiZSB3YWl0ZWQgZm9yIGJ5IGRhZW1vbiAqLwotCQlzdHJ1Y3QgcGFnZV9saXN0ICppdGVtID0gbWVtcG9vbF9hbGxvYyhiaXRtYXAtPndyaXRlX3Bvb2wsIEdGUF9OT0lPKTsKLQkJaXRlbS0+cGFnZSA9IHBhZ2U7Ci0JCWdldF9wYWdlKHBhZ2UpOwotCQlzcGluX2xvY2soJmJpdG1hcC0+d3JpdGVfbG9jayk7Ci0JCWxpc3RfYWRkKCZpdGVtLT5saXN0LCAmYml0bWFwLT5jb21wbGV0ZV9wYWdlcyk7Ci0JCXNwaW5fdW5sb2NrKCZiaXRtYXAtPndyaXRlX2xvY2spOwotCQltZF93YWtldXBfdGhyZWFkKGJpdG1hcC0+d3JpdGViYWNrX2RhZW1vbik7Ci0JfQotCXJldHVybiB3cml0ZV9vbmVfcGFnZShwYWdlLCB3YWl0KTsKKwlyZXR1cm4gMDsKIH0KIAotLyogcmVhZCBhIHBhZ2UgZnJvbSBhIGZpbGUsIHBpbm5pbmcgaXQgaW50byBjYWNoZSwgYW5kIHJldHVybiBieXRlc19yZWFkICovCi1zdGF0aWMgc3RydWN0IHBhZ2UgKnJlYWRfcGFnZShzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgbG9uZyBpbmRleCwKLQkJCQkJdW5zaWduZWQgbG9uZyAqYnl0ZXNfcmVhZCkKK3N0YXRpYyB2b2lkIGVuZF9iaXRtYXBfd3JpdGUoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgaW50IHVwdG9kYXRlKQogewotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX21hcHBpbmctPmhvc3Q7CisJc3RydWN0IGJpdG1hcCAqYml0bWFwID0gYmgtPmJfcHJpdmF0ZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCF1cHRvZGF0ZSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmYml0bWFwLT5sb2NrLCBmbGFncyk7CisJCWJpdG1hcC0+ZmxhZ3MgfD0gQklUTUFQX1dSSVRFX0VSUk9SOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiaXRtYXAtPmxvY2ssIGZsYWdzKTsKKwl9CisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmJpdG1hcC0+cGVuZGluZ193cml0ZXMpKQorCQl3YWtlX3VwKCZiaXRtYXAtPndyaXRlX3dhaXQpOworfQorCisvKiBjb3BpZWQgZnJvbSBidWZmZXIuYyAqLworc3RhdGljIHZvaWQKK19fY2xlYXJfcGFnZV9idWZmZXJzKHN0cnVjdCBwYWdlICpwYWdlKQoreworCUNsZWFyUGFnZVByaXZhdGUocGFnZSk7CisJc2V0X3BhZ2VfcHJpdmF0ZShwYWdlLCAwKTsKKwlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7Cit9CitzdGF0aWMgdm9pZCBmcmVlX2J1ZmZlcnMoc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IHBhZ2VfYnVmZmVycyhwYWdlKTsKKworCXdoaWxlIChiaCkgeworCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKm5leHQgPSBiaC0+Yl90aGlzX3BhZ2U7CisJCWZyZWVfYnVmZmVyX2hlYWQoYmgpOworCQliaCA9IG5leHQ7CisJfQorCV9fY2xlYXJfcGFnZV9idWZmZXJzKHBhZ2UpOworCXB1dF9wYWdlKHBhZ2UpOworfQorCisvKiByZWFkIGEgcGFnZSBmcm9tIGEgZmlsZS4KKyAqIFdlIGJvdGggcmVhZCB0aGUgcGFnZSwgYW5kIGF0dGFjaCBidWZmZXJzIHRvIHRoZSBwYWdlIHRvIHJlY29yZCB0aGUKKyAqIGFkZHJlc3Mgb2YgZWFjaCBibG9jayAodXNpbmcgYm1hcCkuICBUaGVzZSBhZGRyZXNzZXMgd2lsbCBiZSB1c2VkCisgKiB0byB3cml0ZSB0aGUgYmxvY2sgbGF0ZXIsIGNvbXBsZXRlbHkgYnlwYXNzaW5nIHRoZSBmaWxlc3lzdGVtLgorICogVGhpcyB1c2FnZSBpcyBzaW1pbGFyIHRvIGhvdyBzd2FwIGZpbGVzIGFyZSBoYW5kbGVkLCBhbmQgYWxsb3dzIHVzCisgKiB0byB3cml0ZSB0byBhIGZpbGUgd2l0aCBubyBjb25jZXJucyBvZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsaW5nLgorICovCitzdGF0aWMgc3RydWN0IHBhZ2UgKnJlYWRfcGFnZShzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgbG9uZyBpbmRleCwKKwkJCSAgICAgIHN0cnVjdCBiaXRtYXAgKmJpdG1hcCwKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgY291bnQpCit7CiAJc3RydWN0IHBhZ2UgKnBhZ2UgPSBOVUxMOwotCWxvZmZfdCBpc2l6ZSA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKLQl1bnNpZ25lZCBsb25nIGVuZF9pbmRleCA9IGlzaXplID4+IFBBR0VfU0hJRlQ7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJc2VjdG9yX3QgYmxvY2s7CiAKIAlQUklOVEsoInJlYWQgYml0bWFwIGZpbGUgKCVkQiBAICVMdSlcbiIsIChpbnQpUEFHRV9TSVpFLAogCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylpbmRleCA8PCBQQUdFX1NISUZUKTsKIAotCXBhZ2UgPSByZWFkX2NhY2hlX3BhZ2UoaW5vZGUtPmlfbWFwcGluZywgaW5kZXgsCi0JCQkoZmlsbGVyX3QgKilpbm9kZS0+aV9tYXBwaW5nLT5hX29wcy0+cmVhZHBhZ2UsIGZpbGUpOworCXBhZ2UgPSBhbGxvY19wYWdlKEdGUF9LRVJORUwpOworCWlmICghcGFnZSkKKwkJcGFnZSA9IEVSUl9QVFIoLUVOT01FTSk7CiAJaWYgKElTX0VSUihwYWdlKSkKIAkJZ290byBvdXQ7Ci0Jd2FpdF9vbl9wYWdlX2xvY2tlZChwYWdlKTsKLQlpZiAoIVBhZ2VVcHRvZGF0ZShwYWdlKSB8fCBQYWdlRXJyb3IocGFnZSkpIHsKKworCWJoID0gYWxsb2NfcGFnZV9idWZmZXJzKHBhZ2UsIDE8PGlub2RlLT5pX2Jsa2JpdHMsIDApOworCWlmICghYmgpIHsKIAkJcHV0X3BhZ2UocGFnZSk7Ci0JCXBhZ2UgPSBFUlJfUFRSKC1FSU8pOworCQlwYWdlID0gRVJSX1BUUigtRU5PTUVNKTsKIAkJZ290byBvdXQ7CiAJfQorCWF0dGFjaF9wYWdlX2J1ZmZlcnMocGFnZSwgYmgpOworCWJsb2NrID0gaW5kZXggPDwgKFBBR0VfU0hJRlQgLSBpbm9kZS0+aV9ibGtiaXRzKTsKKwl3aGlsZSAoYmgpIHsKKwkJaWYgKGNvdW50ID09IDApCisJCQliaC0+Yl9ibG9ja25yID0gMDsKKwkJZWxzZSB7CisJCQliaC0+Yl9ibG9ja25yID0gYm1hcChpbm9kZSwgYmxvY2spOworCQkJaWYgKGJoLT5iX2Jsb2NrbnIgPT0gMCkgeworCQkJCS8qIENhbm5vdCB1c2UgdGhpcyBmaWxlISAqLworCQkJCWZyZWVfYnVmZmVycyhwYWdlKTsKKwkJCQlwYWdlID0gRVJSX1BUUigtRUlOVkFMKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWJoLT5iX2JkZXYgPSBpbm9kZS0+aV9zYi0+c19iZGV2OworCQkJaWYgKGNvdW50IDwgKDE8PGlub2RlLT5pX2Jsa2JpdHMpKQorCQkJCWNvdW50ID0gMDsKKwkJCWVsc2UKKwkJCQljb3VudCAtPSAoMTw8aW5vZGUtPmlfYmxrYml0cyk7CiAKLQlpZiAoaW5kZXggPiBlbmRfaW5kZXgpIC8qIHdlIGhhdmUgcmVhZCBiZXlvbmQgRU9GICovCi0JCSpieXRlc19yZWFkID0gMDsKLQllbHNlIGlmIChpbmRleCA9PSBlbmRfaW5kZXgpIC8qIHBvc3NpYmxlIHNob3J0IHJlYWQgKi8KLQkJKmJ5dGVzX3JlYWQgPSBpc2l6ZSAmIH5QQUdFX01BU0s7Ci0JZWxzZQotCQkqYnl0ZXNfcmVhZCA9IFBBR0VfU0laRTsgLyogZ290IGEgZnVsbCBwYWdlICovCisJCQliaC0+Yl9lbmRfaW8gPSBlbmRfYml0bWFwX3dyaXRlOworCQkJYmgtPmJfcHJpdmF0ZSA9IGJpdG1hcDsKKwkJCWF0b21pY19pbmMoJmJpdG1hcC0+cGVuZGluZ193cml0ZXMpOworCQkJc2V0X2J1ZmZlcl9sb2NrZWQoYmgpOworCQkJc2V0X2J1ZmZlcl9tYXBwZWQoYmgpOworCQkJc3VibWl0X2JoKFJFQUQsIGJoKTsKKwkJfQorCQlibG9jaysrOworCQliaCA9IGJoLT5iX3RoaXNfcGFnZTsKKwl9CisJcGFnZS0+aW5kZXggPSBpbmRleDsKKworCXdhaXRfZXZlbnQoYml0bWFwLT53cml0ZV93YWl0LAorCQkgICBhdG9taWNfcmVhZCgmYml0bWFwLT5wZW5kaW5nX3dyaXRlcyk9PTApOworCWlmIChiaXRtYXAtPmZsYWdzICYgQklUTUFQX1dSSVRFX0VSUk9SKSB7CisJCWZyZWVfYnVmZmVycyhwYWdlKTsKKwkJcGFnZSA9IEVSUl9QVFIoLUVJTyk7CisJfQogb3V0OgogCWlmIChJU19FUlIocGFnZSkpCiAJCXByaW50ayhLRVJOX0FMRVJUICJtZDogYml0bWFwIHJlYWQgZXJyb3I6ICglZEIgQCAlTHUpOiAlbGRcbiIsCkBAIC00NDEsMTYgKzQ3NiwxNCBAQAogCWNoYXIgKnJlYXNvbiA9IE5VTEw7CiAJYml0bWFwX3N1cGVyX3QgKnNiOwogCXVuc2lnbmVkIGxvbmcgY2h1bmtzaXplLCBkYWVtb25fc2xlZXAsIHdyaXRlX2JlaGluZDsKLQl1bnNpZ25lZCBsb25nIGJ5dGVzX3JlYWQ7CiAJdW5zaWduZWQgbG9uZyBsb25nIGV2ZW50czsKIAlpbnQgZXJyID0gLUVJTlZBTDsKIAogCS8qIHBhZ2UgMCBpcyB0aGUgc3VwZXJibG9jaywgcmVhZCBpdC4uLiAqLwogCWlmIChiaXRtYXAtPmZpbGUpCi0JCWJpdG1hcC0+c2JfcGFnZSA9IHJlYWRfcGFnZShiaXRtYXAtPmZpbGUsIDAsICZieXRlc19yZWFkKTsKKwkJYml0bWFwLT5zYl9wYWdlID0gcmVhZF9wYWdlKGJpdG1hcC0+ZmlsZSwgMCwgYml0bWFwLCBQQUdFX1NJWkUpOwogCWVsc2UgewogCQliaXRtYXAtPnNiX3BhZ2UgPSByZWFkX3NiX3BhZ2UoYml0bWFwLT5tZGRldiwgYml0bWFwLT5vZmZzZXQsIDApOwotCQlieXRlc19yZWFkID0gUEFHRV9TSVpFOwogCX0KIAlpZiAoSVNfRVJSKGJpdG1hcC0+c2JfcGFnZSkpIHsKIAkJZXJyID0gUFRSX0VSUihiaXRtYXAtPnNiX3BhZ2UpOwpAQCAtNDYwLDEzICs0OTMsNiBAQAogCiAJc2IgPSAoYml0bWFwX3N1cGVyX3QgKilrbWFwX2F0b21pYyhiaXRtYXAtPnNiX3BhZ2UsIEtNX1VTRVIwKTsKIAotCWlmIChieXRlc19yZWFkIDwgc2l6ZW9mKCpzYikpIHsgLyogc2hvcnQgcmVhZCAqLwotCQlwcmludGsoS0VSTl9JTkZPICIlczogYml0bWFwIGZpbGUgc3VwZXJibG9jayB0cnVuY2F0ZWRcbiIsCi0JCQlibW5hbWUoYml0bWFwKSk7Ci0JCWVyciA9IC1FTk9TUEM7Ci0JCWdvdG8gb3V0OwotCX0KLQogCWNodW5rc2l6ZSA9IGxlMzJfdG9fY3B1KHNiLT5jaHVua3NpemUpOwogCWRhZW1vbl9zbGVlcCA9IGxlMzJfdG9fY3B1KHNiLT5kYWVtb25fc2xlZXApOwogCXdyaXRlX2JlaGluZCA9IGxlMzJfdG9fY3B1KHNiLT53cml0ZV9iZWhpbmQpOwpAQCAtNTUwLDcgKzU3Niw2IEBACiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJpdG1hcC0+bG9jaywgZmxhZ3MpOwogCQlyZXR1cm47CiAJfQotCWdldF9wYWdlKGJpdG1hcC0+c2JfcGFnZSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYml0bWFwLT5sb2NrLCBmbGFncyk7CiAJc2IgPSAoYml0bWFwX3N1cGVyX3QgKilrbWFwX2F0b21pYyhiaXRtYXAtPnNiX3BhZ2UsIEtNX1VTRVIwKTsKIAlzd2l0Y2ggKG9wKSB7CkBAIC01NjEsNyArNTg2LDYgQEAKIAkJZGVmYXVsdDogQlVHKCk7CiAJfQogCWt1bm1hcF9hdG9taWMoc2IsIEtNX1VTRVIwKTsKLQlwdXRfcGFnZShiaXRtYXAtPnNiX3BhZ2UpOwogfQogCiAvKgpAQCAtNjE0LDQ4ICs2MzgsMTcgQEAKIAogCXdoaWxlIChwYWdlcy0tKQogCQlpZiAobWFwW3BhZ2VzXS0+aW5kZXggIT0gMCkgLyogMCBpcyBzYl9wYWdlLCByZWxlYXNlIGl0IGJlbG93ICovCi0JCQlwdXRfcGFnZShtYXBbcGFnZXNdKTsKKwkJCWZyZWVfYnVmZmVycyhtYXBbcGFnZXNdKTsKIAlrZnJlZShtYXApOwogCWtmcmVlKGF0dHIpOwogCi0Jc2FmZV9wdXRfcGFnZShzYl9wYWdlKTsKLX0KLQotc3RhdGljIHZvaWQgYml0bWFwX3N0b3BfZGFlbW9uKHN0cnVjdCBiaXRtYXAgKmJpdG1hcCk7Ci0KLS8qIGRlcXVldWUgdGhlIG5leHQgaXRlbSBpbiBhIHBhZ2UgbGlzdCAtLSBkb24ndCBjYWxsIGZyb20gaXJxIGNvbnRleHQgKi8KLXN0YXRpYyBzdHJ1Y3QgcGFnZV9saXN0ICpkZXF1ZXVlX3BhZ2Uoc3RydWN0IGJpdG1hcCAqYml0bWFwKQotewotCXN0cnVjdCBwYWdlX2xpc3QgKml0ZW0gPSBOVUxMOwotCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQgPSAmYml0bWFwLT5jb21wbGV0ZV9wYWdlczsKLQotCXNwaW5fbG9jaygmYml0bWFwLT53cml0ZV9sb2NrKTsKLQlpZiAobGlzdF9lbXB0eShoZWFkKSkKLQkJZ290byBvdXQ7Ci0JaXRlbSA9IGxpc3RfZW50cnkoaGVhZC0+cHJldiwgc3RydWN0IHBhZ2VfbGlzdCwgbGlzdCk7Ci0JbGlzdF9kZWwoaGVhZC0+cHJldik7Ci1vdXQ6Ci0Jc3Bpbl91bmxvY2soJmJpdG1hcC0+d3JpdGVfbG9jayk7Ci0JcmV0dXJuIGl0ZW07Ci19Ci0KLXN0YXRpYyB2b2lkIGRyYWluX3dyaXRlX3F1ZXVlcyhzdHJ1Y3QgYml0bWFwICpiaXRtYXApCi17Ci0Jc3RydWN0IHBhZ2VfbGlzdCAqaXRlbTsKLQotCXdoaWxlICgoaXRlbSA9IGRlcXVldWVfcGFnZShiaXRtYXApKSkgewotCQkvKiBkb24ndCBib3RoZXIgdG8gd2FpdCAqLwotCQlwdXRfcGFnZShpdGVtLT5wYWdlKTsKLQkJbWVtcG9vbF9mcmVlKGl0ZW0sIGJpdG1hcC0+d3JpdGVfcG9vbCk7Ci0JfQotCi0Jd2FrZV91cCgmYml0bWFwLT53cml0ZV93YWl0KTsKKwlpZiAoc2JfcGFnZSkKKwkJZnJlZV9idWZmZXJzKHNiX3BhZ2UpOwogfQogCiBzdGF0aWMgdm9pZCBiaXRtYXBfZmlsZV9wdXQoc3RydWN0IGJpdG1hcCAqYml0bWFwKQogewogCXN0cnVjdCBmaWxlICpmaWxlOwotCXN0cnVjdCBpbm9kZSAqaW5vZGU7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZiaXRtYXAtPmxvY2ssIGZsYWdzKTsKQEAgLTY2MywxNyArNjU2LDE0IEBACiAJYml0bWFwLT5maWxlID0gTlVMTDsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiaXRtYXAtPmxvY2ssIGZsYWdzKTsKIAotCWJpdG1hcF9zdG9wX2RhZW1vbihiaXRtYXApOwotCi0JZHJhaW5fd3JpdGVfcXVldWVzKGJpdG1hcCk7Ci0KKwlpZiAoZmlsZSkKKwkJd2FpdF9ldmVudChiaXRtYXAtPndyaXRlX3dhaXQsCisJCQkgICBhdG9taWNfcmVhZCgmYml0bWFwLT5wZW5kaW5nX3dyaXRlcyk9PTApOwogCWJpdG1hcF9maWxlX3VubWFwKGJpdG1hcCk7CiAKIAlpZiAoZmlsZSkgewotCQlpbm9kZSA9IGZpbGUtPmZfbWFwcGluZy0+aG9zdDsKLQkJc3Bpbl9sb2NrKCZpbm9kZS0+aV9sb2NrKTsKLQkJYXRvbWljX3NldCgmaW5vZGUtPmlfd3JpdGVjb3VudCwgMSk7IC8qIGFsbG93IHdyaXRlcyBhZ2FpbiAqLwotCQlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CisJCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwkJaW52YWxpZGF0ZV9pbm9kZV9wYWdlcyhpbm9kZS0+aV9tYXBwaW5nKTsKIAkJZnB1dChmaWxlKTsKIAl9CiB9CkBAIC03MDgsMjYgKzY5OCwyNyBAQAogfQogCiBlbnVtIGJpdG1hcF9wYWdlX2F0dHIgewotCUJJVE1BUF9QQUdFX0RJUlRZID0gMSwgLy8gdGhlcmUgYXJlIHNldCBiaXRzIHRoYXQgbmVlZCB0byBiZSBzeW5jZWQKLQlCSVRNQVBfUEFHRV9DTEVBTiA9IDIsIC8vIHRoZXJlIGFyZSBiaXRzIHRoYXQgbWlnaHQgbmVlZCB0byBiZSBjbGVhcmVkCi0JQklUTUFQX1BBR0VfTkVFRFdSSVRFPTQsIC8vIHRoZXJlIGFyZSBjbGVhcmVkIGJpdHMgdGhhdCBuZWVkIHRvIGJlIHN5bmNlZAorCUJJVE1BUF9QQUdFX0RJUlRZID0gMCwgLy8gdGhlcmUgYXJlIHNldCBiaXRzIHRoYXQgbmVlZCB0byBiZSBzeW5jZWQKKwlCSVRNQVBfUEFHRV9DTEVBTiA9IDEsIC8vIHRoZXJlIGFyZSBiaXRzIHRoYXQgbWlnaHQgbmVlZCB0byBiZSBjbGVhcmVkCisJQklUTUFQX1BBR0VfTkVFRFdSSVRFPTIsIC8vIHRoZXJlIGFyZSBjbGVhcmVkIGJpdHMgdGhhdCBuZWVkIHRvIGJlIHN5bmNlZAogfTsKIAogc3RhdGljIGlubGluZSB2b2lkIHNldF9wYWdlX2F0dHIoc3RydWN0IGJpdG1hcCAqYml0bWFwLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKIAkJCQllbnVtIGJpdG1hcF9wYWdlX2F0dHIgYXR0cikKIHsKLQliaXRtYXAtPmZpbGVtYXBfYXR0cltwYWdlLT5pbmRleF0gfD0gYXR0cjsKKwlfX3NldF9iaXQoKHBhZ2UtPmluZGV4PDwyKSArIGF0dHIsIGJpdG1hcC0+ZmlsZW1hcF9hdHRyKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGNsZWFyX3BhZ2VfYXR0cihzdHJ1Y3QgYml0bWFwICpiaXRtYXAsIHN0cnVjdCBwYWdlICpwYWdlLAogCQkJCWVudW0gYml0bWFwX3BhZ2VfYXR0ciBhdHRyKQogewotCWJpdG1hcC0+ZmlsZW1hcF9hdHRyW3BhZ2UtPmluZGV4XSAmPSB+YXR0cjsKKwlfX2NsZWFyX2JpdCgocGFnZS0+aW5kZXg8PDIpICsgYXR0ciwgYml0bWFwLT5maWxlbWFwX2F0dHIpOwogfQogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZ2V0X3BhZ2VfYXR0cihzdHJ1Y3QgYml0bWFwICpiaXRtYXAsIHN0cnVjdCBwYWdlICpwYWdlKQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHRlc3RfcGFnZV9hdHRyKHN0cnVjdCBiaXRtYXAgKmJpdG1hcCwgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQkJCSAgIGVudW0gYml0bWFwX3BhZ2VfYXR0ciBhdHRyKQogewotCXJldHVybiBiaXRtYXAtPmZpbGVtYXBfYXR0cltwYWdlLT5pbmRleF07CisJcmV0dXJuIHRlc3RfYml0KChwYWdlLT5pbmRleDw8MikgKyBhdHRyLCBiaXRtYXAtPmZpbGVtYXBfYXR0cik7CiB9CiAKIC8qCkBAIC03NTEsMTEgKzc0Miw2IEBACiAJcGFnZSA9IGZpbGVtYXBfZ2V0X3BhZ2UoYml0bWFwLCBjaHVuayk7CiAJYml0ID0gZmlsZV9wYWdlX29mZnNldChjaHVuayk7CiAKLQotCS8qIG1ha2Ugc3VyZSB0aGUgcGFnZSBzdGF5cyBjYWNoZWQgdW50aWwgaXQgZ2V0cyB3cml0dGVuIG91dCAqLwotCWlmICghIChnZXRfcGFnZV9hdHRyKGJpdG1hcCwgcGFnZSkgJiBCSVRNQVBfUEFHRV9ESVJUWSkpCi0JCWdldF9wYWdlKHBhZ2UpOwotCiAgCS8qIHNldCB0aGUgYml0ICovCiAJa2FkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CiAJaWYgKGJpdG1hcC0+ZmxhZ3MgJiBCSVRNQVBfSE9TVEVORElBTikKQEAgLTc3NSw3ICs3NjEsOCBAQAogICogc3luYyB0aGUgZGlydHkgcGFnZXMgb2YgdGhlIGJpdG1hcCBmaWxlIHRvIGRpc2sgKi8KIGludCBiaXRtYXBfdW5wbHVnKHN0cnVjdCBiaXRtYXAgKmJpdG1hcCkKIHsKLQl1bnNpZ25lZCBsb25nIGksIGF0dHIsIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgaSwgZmxhZ3M7CisJaW50IGRpcnR5LCBuZWVkX3dyaXRlOwogCXN0cnVjdCBwYWdlICpwYWdlOwogCWludCB3YWl0ID0gMDsKIAlpbnQgZXJyOwpAQCAtNzkyLDM1ICs3NzksMjYgQEAKIAkJCXJldHVybiAwOwogCQl9CiAJCXBhZ2UgPSBiaXRtYXAtPmZpbGVtYXBbaV07Ci0JCWF0dHIgPSBnZXRfcGFnZV9hdHRyKGJpdG1hcCwgcGFnZSk7CisJCWRpcnR5ID0gdGVzdF9wYWdlX2F0dHIoYml0bWFwLCBwYWdlLCBCSVRNQVBfUEFHRV9ESVJUWSk7CisJCW5lZWRfd3JpdGUgPSB0ZXN0X3BhZ2VfYXR0cihiaXRtYXAsIHBhZ2UsIEJJVE1BUF9QQUdFX05FRURXUklURSk7CiAJCWNsZWFyX3BhZ2VfYXR0cihiaXRtYXAsIHBhZ2UsIEJJVE1BUF9QQUdFX0RJUlRZKTsKIAkJY2xlYXJfcGFnZV9hdHRyKGJpdG1hcCwgcGFnZSwgQklUTUFQX1BBR0VfTkVFRFdSSVRFKTsKLQkJaWYgKChhdHRyICYgQklUTUFQX1BBR0VfRElSVFkpKQorCQlpZiAoZGlydHkpCiAJCQl3YWl0ID0gMTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYml0bWFwLT5sb2NrLCBmbGFncyk7CiAKLQkJaWYgKGF0dHIgJiAoQklUTUFQX1BBR0VfRElSVFkgfCBCSVRNQVBfUEFHRV9ORUVEV1JJVEUpKSB7CisJCWlmIChkaXJ0eSB8IG5lZWRfd3JpdGUpCiAJCQllcnIgPSB3cml0ZV9wYWdlKGJpdG1hcCwgcGFnZSwgMCk7Ci0JCQlpZiAoZXJyID09IC1FQUdBSU4pIHsKLQkJCQlpZiAoYXR0ciAmIEJJVE1BUF9QQUdFX0RJUlRZKQotCQkJCQllcnIgPSB3cml0ZV9wYWdlKGJpdG1hcCwgcGFnZSwgMSk7Ci0JCQkJZWxzZQotCQkJCQllcnIgPSAwOwotCQkJfQotCQkJaWYgKGVycikKLQkJCQlyZXR1cm4gMTsKLQkJfQogCX0KIAlpZiAod2FpdCkgeyAvKiBpZiBhbnkgd3JpdGVzIHdlcmUgcGVyZm9ybWVkLCB3ZSBuZWVkIHRvIHdhaXQgb24gdGhlbSAqLwotCQlpZiAoYml0bWFwLT5maWxlKSB7Ci0JCQlzcGluX2xvY2tfaXJxKCZiaXRtYXAtPndyaXRlX2xvY2spOwotCQkJd2FpdF9ldmVudF9sb2NrX2lycShiaXRtYXAtPndyaXRlX3dhaXQsCi0JCQkJCSAgICBsaXN0X2VtcHR5KCZiaXRtYXAtPmNvbXBsZXRlX3BhZ2VzKSwgYml0bWFwLT53cml0ZV9sb2NrLAotCQkJCQkgICAgd2FrZV91cF9wcm9jZXNzKGJpdG1hcC0+d3JpdGViYWNrX2RhZW1vbi0+dHNrKSk7Ci0JCQlzcGluX3VubG9ja19pcnEoJmJpdG1hcC0+d3JpdGVfbG9jayk7Ci0JCX0gZWxzZQorCQlpZiAoYml0bWFwLT5maWxlKQorCQkJd2FpdF9ldmVudChiaXRtYXAtPndyaXRlX3dhaXQsCisJCQkJICAgYXRvbWljX3JlYWQoJmJpdG1hcC0+cGVuZGluZ193cml0ZXMpPT0wKTsKKwkJZWxzZQogCQkJbWRfc3VwZXJfd2FpdChiaXRtYXAtPm1kZGV2KTsKIAl9CisJaWYgKGJpdG1hcC0+ZmxhZ3MgJiBCSVRNQVBfV1JJVEVfRVJST1IpCisJCWJpdG1hcF9maWxlX2tpY2soYml0bWFwKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtODQyLDcgKzgyMCw3IEBACiAJc3RydWN0IHBhZ2UgKnBhZ2UgPSBOVUxMLCAqb2xkcGFnZSA9IE5VTEw7CiAJdW5zaWduZWQgbG9uZyBudW1fcGFnZXMsIGJpdF9jbnQgPSAwOwogCXN0cnVjdCBmaWxlICpmaWxlOwotCXVuc2lnbmVkIGxvbmcgYnl0ZXMsIG9mZnNldCwgZHVtbXk7CisJdW5zaWduZWQgbG9uZyBieXRlcywgb2Zmc2V0OwogCWludCBvdXRvZmRhdGU7CiAJaW50IHJldCA9IC1FTk9TUEM7CiAJdm9pZCAqcGFkZHI7CkBAIC04NzksNyArODU3LDEyIEBACiAJaWYgKCFiaXRtYXAtPmZpbGVtYXApCiAJCWdvdG8gb3V0OwogCi0JYml0bWFwLT5maWxlbWFwX2F0dHIgPSBremFsbG9jKHNpemVvZihsb25nKSAqIG51bV9wYWdlcywgR0ZQX0tFUk5FTCk7CisJLyogV2UgbmVlZCA0IGJpdHMgcGVyIHBhZ2UsIHJvdW5kZWQgdXAgdG8gYSBtdWx0aXBsZSBvZiBzaXplb2YodW5zaWduZWQgbG9uZykgKi8KKwliaXRtYXAtPmZpbGVtYXBfYXR0ciA9IGt6YWxsb2MoCisJCSgoKG51bV9wYWdlcyo0LzgpK3NpemVvZih1bnNpZ25lZCBsb25nKS0xKQorCQkgL3NpemVvZih1bnNpZ25lZCBsb25nKSkKKwkJKnNpemVvZih1bnNpZ25lZCBsb25nKSwKKwkJR0ZQX0tFUk5FTCk7CiAJaWYgKCFiaXRtYXAtPmZpbGVtYXBfYXR0cikKIAkJZ290byBvdXQ7CiAKQEAgLTg5MCw3ICs4NzMsMTIgQEAKIAkJaW5kZXggPSBmaWxlX3BhZ2VfaW5kZXgoaSk7CiAJCWJpdCA9IGZpbGVfcGFnZV9vZmZzZXQoaSk7CiAJCWlmIChpbmRleCAhPSBvbGRpbmRleCkgeyAvKiB0aGlzIGlzIGEgbmV3IHBhZ2UsIHJlYWQgaXQgaW4gKi8KKwkJCWludCBjb3VudDsKIAkJCS8qIHVubWFwIHRoZSBvbGQgcGFnZSwgd2UncmUgZG9uZSB3aXRoIGl0ICovCisJCQlpZiAoaW5kZXggPT0gbnVtX3BhZ2VzLTEpCisJCQkJY291bnQgPSBieXRlcyAtIGluZGV4ICogUEFHRV9TSVpFOworCQkJZWxzZQorCQkJCWNvdW50ID0gUEFHRV9TSVpFOwogCQkJaWYgKGluZGV4ID09IDApIHsKIAkJCQkvKgogCQkJCSAqIGlmIHdlJ3JlIGhlcmUgdGhlbiB0aGUgc3VwZXJibG9jayBwYWdlCkBAIC05MDAsNyArODg4LDcgQEAKIAkJCQlwYWdlID0gYml0bWFwLT5zYl9wYWdlOwogCQkJCW9mZnNldCA9IHNpemVvZihiaXRtYXBfc3VwZXJfdCk7CiAJCQl9IGVsc2UgaWYgKGZpbGUpIHsKLQkJCQlwYWdlID0gcmVhZF9wYWdlKGZpbGUsIGluZGV4LCAmZHVtbXkpOworCQkJCXBhZ2UgPSByZWFkX3BhZ2UoZmlsZSwgaW5kZXgsIGJpdG1hcCwgY291bnQpOwogCQkJCW9mZnNldCA9IDA7CiAJCQl9IGVsc2UgewogCQkJCXBhZ2UgPSByZWFkX3NiX3BhZ2UoYml0bWFwLT5tZGRldiwgYml0bWFwLT5vZmZzZXQsIGluZGV4KTsKQEAgLTk3MSwxMiArOTU5LDExIEBACiAJLyogV2UgZG9uJ3QgYWN0dWFsbHkgd3JpdGUgYWxsIGJpdG1hcCBibG9ja3MgaGVyZSwKIAkgKiBqdXN0IGZsYWcgdGhlbSBhcyBuZWVkaW5nIHRvIGJlIHdyaXR0ZW4KIAkgKi8KKwlpbnQgaTsKIAotCXVuc2lnbmVkIGxvbmcgY2h1bmtzID0gYml0bWFwLT5jaHVua3M7Ci0JdW5zaWduZWQgbG9uZyBieXRlcyA9IChjaHVua3MrNykvOCArIHNpemVvZihiaXRtYXBfc3VwZXJfdCk7Ci0JdW5zaWduZWQgbG9uZyBudW1fcGFnZXMgPSAoYnl0ZXMgKyBQQUdFX1NJWkUtMSkgLyBQQUdFX1NJWkU7Ci0Jd2hpbGUgKG51bV9wYWdlcy0tKQotCQliaXRtYXAtPmZpbGVtYXBfYXR0cltudW1fcGFnZXNdIHw9IEJJVE1BUF9QQUdFX05FRURXUklURTsKKwlmb3IgKGk9MDsgaSA8IGJpdG1hcC0+ZmlsZV9wYWdlczsgaSsrKQorCQlzZXRfcGFnZV9hdHRyKGJpdG1hcCwgYml0bWFwLT5maWxlbWFwW2ldLAorCQkJICAgICAgQklUTUFQX1BBR0VfTkVFRFdSSVRFKTsKIH0KIAogCkBAIC0xMDA3LDcgKzk5NCw2IEBACiAJc3RydWN0IHBhZ2UgKnBhZ2UgPSBOVUxMLCAqbGFzdHBhZ2UgPSBOVUxMOwogCWludCBlcnIgPSAwOwogCWludCBibG9ja3M7Ci0JaW50IGF0dHI7CiAJdm9pZCAqcGFkZHI7CiAKIAlpZiAoYml0bWFwID09IE5VTEwpCkBAIC0xMDI5LDQzICsxMDE1LDM0IEBACiAKIAkJaWYgKHBhZ2UgIT0gbGFzdHBhZ2UpIHsKIAkJCS8qIHNraXAgdGhpcyBwYWdlIHVubGVzcyBpdCdzIG1hcmtlZCBhcyBuZWVkaW5nIGNsZWFuaW5nICovCi0JCQlpZiAoISgoYXR0cj1nZXRfcGFnZV9hdHRyKGJpdG1hcCwgcGFnZSkpICYgQklUTUFQX1BBR0VfQ0xFQU4pKSB7Ci0JCQkJaWYgKGF0dHIgJiBCSVRNQVBfUEFHRV9ORUVEV1JJVEUpIHsKLQkJCQkJZ2V0X3BhZ2UocGFnZSk7CisJCQlpZiAoIXRlc3RfcGFnZV9hdHRyKGJpdG1hcCwgcGFnZSwgQklUTUFQX1BBR0VfQ0xFQU4pKSB7CisJCQkJaW50IG5lZWRfd3JpdGUgPSB0ZXN0X3BhZ2VfYXR0cihiaXRtYXAsIHBhZ2UsCisJCQkJCQkJCUJJVE1BUF9QQUdFX05FRURXUklURSk7CisJCQkJaWYgKG5lZWRfd3JpdGUpCiAJCQkJCWNsZWFyX3BhZ2VfYXR0cihiaXRtYXAsIHBhZ2UsIEJJVE1BUF9QQUdFX05FRURXUklURSk7Ci0JCQkJfQorCiAJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYml0bWFwLT5sb2NrLCBmbGFncyk7Ci0JCQkJaWYgKGF0dHIgJiBCSVRNQVBfUEFHRV9ORUVEV1JJVEUpIHsKKwkJCQlpZiAobmVlZF93cml0ZSkgewogCQkJCQlzd2l0Y2ggKHdyaXRlX3BhZ2UoYml0bWFwLCBwYWdlLCAwKSkgewotCQkJCQljYXNlIC1FQUdBSU46Ci0JCQkJCQlzZXRfcGFnZV9hdHRyKGJpdG1hcCwgcGFnZSwgQklUTUFQX1BBR0VfTkVFRFdSSVRFKTsKLQkJCQkJCWJyZWFrOwogCQkJCQljYXNlIDA6CiAJCQkJCQlicmVhazsKIAkJCQkJZGVmYXVsdDoKIAkJCQkJCWJpdG1hcF9maWxlX2tpY2soYml0bWFwKTsKIAkJCQkJfQotCQkJCQlwdXRfcGFnZShwYWdlKTsKIAkJCQl9CiAJCQkJY29udGludWU7CiAJCQl9CiAKIAkJCS8qIGdyYWIgdGhlIG5ldyBwYWdlLCBzeW5jIGFuZCByZWxlYXNlIHRoZSBvbGQgKi8KLQkJCWdldF9wYWdlKHBhZ2UpOwogCQkJaWYgKGxhc3RwYWdlICE9IE5VTEwpIHsKLQkJCQlpZiAoZ2V0X3BhZ2VfYXR0cihiaXRtYXAsIGxhc3RwYWdlKSAmIEJJVE1BUF9QQUdFX05FRURXUklURSkgeworCQkJCWlmICh0ZXN0X3BhZ2VfYXR0cihiaXRtYXAsIGxhc3RwYWdlLCBCSVRNQVBfUEFHRV9ORUVEV1JJVEUpKSB7CiAJCQkJCWNsZWFyX3BhZ2VfYXR0cihiaXRtYXAsIGxhc3RwYWdlLCBCSVRNQVBfUEFHRV9ORUVEV1JJVEUpOwogCQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiaXRtYXAtPmxvY2ssIGZsYWdzKTsKIAkJCQkJZXJyID0gd3JpdGVfcGFnZShiaXRtYXAsIGxhc3RwYWdlLCAwKTsKLQkJCQkJaWYgKGVyciA9PSAtRUFHQUlOKSB7Ci0JCQkJCQllcnIgPSAwOwotCQkJCQkJc2V0X3BhZ2VfYXR0cihiaXRtYXAsIGxhc3RwYWdlLCBCSVRNQVBfUEFHRV9ORUVEV1JJVEUpOwotCQkJCQl9CiAJCQkJfSBlbHNlIHsKIAkJCQkJc2V0X3BhZ2VfYXR0cihiaXRtYXAsIGxhc3RwYWdlLCBCSVRNQVBfUEFHRV9ORUVEV1JJVEUpOwogCQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiaXRtYXAtPmxvY2ssIGZsYWdzKTsKIAkJCQl9Ci0JCQkJcHV0X3BhZ2UobGFzdHBhZ2UpOwogCQkJCWlmIChlcnIpCiAJCQkJCWJpdG1hcF9maWxlX2tpY2soYml0bWFwKTsKIAkJCX0gZWxzZQpAQCAtMTEwNywxMzEgKzEwODQsMTkgQEAKIAkvKiBub3cgc3luYyB0aGUgZmluYWwgcGFnZSAqLwogCWlmIChsYXN0cGFnZSAhPSBOVUxMKSB7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZiaXRtYXAtPmxvY2ssIGZsYWdzKTsKLQkJaWYgKGdldF9wYWdlX2F0dHIoYml0bWFwLCBsYXN0cGFnZSkgJkJJVE1BUF9QQUdFX05FRURXUklURSkgeworCQlpZiAodGVzdF9wYWdlX2F0dHIoYml0bWFwLCBsYXN0cGFnZSwgQklUTUFQX1BBR0VfTkVFRFdSSVRFKSkgewogCQkJY2xlYXJfcGFnZV9hdHRyKGJpdG1hcCwgbGFzdHBhZ2UsIEJJVE1BUF9QQUdFX05FRURXUklURSk7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiaXRtYXAtPmxvY2ssIGZsYWdzKTsKIAkJCWVyciA9IHdyaXRlX3BhZ2UoYml0bWFwLCBsYXN0cGFnZSwgMCk7Ci0JCQlpZiAoZXJyID09IC1FQUdBSU4pIHsKLQkJCQlzZXRfcGFnZV9hdHRyKGJpdG1hcCwgbGFzdHBhZ2UsIEJJVE1BUF9QQUdFX05FRURXUklURSk7Ci0JCQkJZXJyID0gMDsKLQkJCX0KIAkJfSBlbHNlIHsKIAkJCXNldF9wYWdlX2F0dHIoYml0bWFwLCBsYXN0cGFnZSwgQklUTUFQX1BBR0VfTkVFRFdSSVRFKTsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJpdG1hcC0+bG9jaywgZmxhZ3MpOwogCQl9Ci0KLQkJcHV0X3BhZ2UobGFzdHBhZ2UpOwogCX0KIAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyB2b2lkIGRhZW1vbl9leGl0KHN0cnVjdCBiaXRtYXAgKmJpdG1hcCwgbWRrX3RocmVhZF90ICoqZGFlbW9uKQotewotCW1ka190aHJlYWRfdCAqZG1uOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkvKiBpZiBubyBvbmUgaXMgd2FpdGluZyBvbiB1cywgd2UnbGwgZnJlZSB0aGUgbWQgdGhyZWFkIHN0cnVjdAotCSAqIGFuZCBleGl0LCBvdGhlcndpc2Ugd2UgbGV0IHRoZSB3YWl0ZXIgY2xlYW4gdGhpbmdzIHVwICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJpdG1hcC0+bG9jaywgZmxhZ3MpOwotCWlmICgoZG1uID0gKmRhZW1vbikpIHsgLyogbm8gb25lIGlzIHdhaXRpbmcsIGNsZWFudXAgYW5kIGV4aXQgKi8KLQkJKmRhZW1vbiA9IE5VTEw7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJpdG1hcC0+bG9jaywgZmxhZ3MpOwotCQlrZnJlZShkbW4pOwotCQljb21wbGV0ZV9hbmRfZXhpdChOVUxMLCAwKTsgLyogZG9fZXhpdCBub3QgZXhwb3J0ZWQgKi8KLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYml0bWFwLT5sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJpdG1hcF93cml0ZWJhY2tfZGFlbW9uKG1kZGV2X3QgKm1kZGV2KQotewotCXN0cnVjdCBiaXRtYXAgKmJpdG1hcCA9IG1kZGV2LT5iaXRtYXA7Ci0Jc3RydWN0IHBhZ2UgKnBhZ2U7Ci0Jc3RydWN0IHBhZ2VfbGlzdCAqaXRlbTsKLQlpbnQgZXJyID0gMDsKLQotCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgewotCQlwcmludGsoS0VSTl9JTkZPCi0JCSAgICAgICAiJXM6IGJpdG1hcCB3cml0ZWJhY2sgZGFlbW9uIGdvdCBzaWduYWwsIGV4aXRpbmcuLi5cbiIsCi0JCSAgICAgICBibW5hbWUoYml0bWFwKSk7Ci0JCWVyciA9IC1FSU5UUjsKLQkJZ290byBvdXQ7Ci0JfQotCWlmIChiaXRtYXAgPT0gTlVMTCkKLQkJLyogYWJvdXQgdG8gYmUgc3RvcHBlZC4gKi8KLQkJcmV0dXJuOwotCi0JUFJJTlRLKCIlczogYml0bWFwIHdyaXRlYmFjayBkYWVtb24gd29rZSB1cC4uLlxuIiwgYm1uYW1lKGJpdG1hcCkpOwotCS8qIHdhaXQgb24gYml0bWFwIHBhZ2Ugd3JpdGViYWNrcyAqLwotCXdoaWxlICgoaXRlbSA9IGRlcXVldWVfcGFnZShiaXRtYXApKSkgewotCQlwYWdlID0gaXRlbS0+cGFnZTsKLQkJbWVtcG9vbF9mcmVlKGl0ZW0sIGJpdG1hcC0+d3JpdGVfcG9vbCk7Ci0JCVBSSU5USygid2FpdCBvbiBwYWdlIHdyaXRlYmFjazogJXBcbiIsIHBhZ2UpOwotCQl3YWl0X29uX3BhZ2Vfd3JpdGViYWNrKHBhZ2UpOwotCQlQUklOVEsoImZpbmlzaGVkIHBhZ2Ugd3JpdGViYWNrOiAlcFxuIiwgcGFnZSk7Ci0KLQkJZXJyID0gUGFnZUVycm9yKHBhZ2UpOwotCQlwdXRfcGFnZShwYWdlKTsKLQkJaWYgKGVycikgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGJpdG1hcCBmaWxlIHdyaXRlYmFjayAiCi0JCQkgICAgICAgImZhaWxlZCAocGFnZSAlbHUpOiAlZFxuIiwKLQkJCSAgICAgICBibW5hbWUoYml0bWFwKSwgcGFnZS0+aW5kZXgsIGVycik7Ci0JCQliaXRtYXBfZmlsZV9raWNrKGJpdG1hcCk7Ci0JCQlnb3RvIG91dDsKLQkJfQotCX0KLSBvdXQ6Ci0Jd2FrZV91cCgmYml0bWFwLT53cml0ZV93YWl0KTsKLQlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIiVzOiBiaXRtYXAgd3JpdGViYWNrIGRhZW1vbiBleGl0aW5nICglZClcbiIsCi0JCSAgICAgICBibW5hbWUoYml0bWFwKSwgZXJyKTsKLQkJZGFlbW9uX2V4aXQoYml0bWFwLCAmYml0bWFwLT53cml0ZWJhY2tfZGFlbW9uKTsKLQl9Ci19Ci0KLXN0YXRpYyBtZGtfdGhyZWFkX3QgKmJpdG1hcF9zdGFydF9kYWVtb24oc3RydWN0IGJpdG1hcCAqYml0bWFwLAotCQkJCXZvaWQgKCpmdW5jKShtZGRldl90ICopLCBjaGFyICpuYW1lKQotewotCW1ka190aHJlYWRfdCAqZGFlbW9uOwotCWNoYXIgbmFtZWJ1ZlszMl07Ci0KLSNpZmRlZiBJTkpFQ1RfRkFUQUxfRkFVTFRfMgotCWRhZW1vbiA9IE5VTEw7Ci0jZWxzZQotCXNwcmludGYobmFtZWJ1ZiwgIiUlc18lcyIsIG5hbWUpOwotCWRhZW1vbiA9IG1kX3JlZ2lzdGVyX3RocmVhZChmdW5jLCBiaXRtYXAtPm1kZGV2LCBuYW1lYnVmKTsKLSNlbmRpZgotCWlmICghZGFlbW9uKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IGZhaWxlZCB0byBzdGFydCBiaXRtYXAgZGFlbW9uXG4iLAotCQkJYm1uYW1lKGJpdG1hcCkpOwotCQlyZXR1cm4gRVJSX1BUUigtRUNISUxEKTsKLQl9Ci0KLQltZF93YWtldXBfdGhyZWFkKGRhZW1vbik7IC8qIHN0YXJ0IGl0IHJ1bm5pbmcgKi8KLQotCVBSSU5USygiJXM6ICVzIGRhZW1vbiAocGlkICVkKSBzdGFydGVkLi4uXG4iLAotCQlibW5hbWUoYml0bWFwKSwgbmFtZSwgZGFlbW9uLT50c2stPnBpZCk7Ci0KLQlyZXR1cm4gZGFlbW9uOwotfQotCi1zdGF0aWMgdm9pZCBiaXRtYXBfc3RvcF9kYWVtb24oc3RydWN0IGJpdG1hcCAqYml0bWFwKQotewotCS8qIHRoZSBkYWVtb24gY2FuJ3Qgc3RvcCBpdHNlbGYuLi4gaXQnbGwganVzdCBleGl0IGluc3RlYWQuLi4gKi8KLQlpZiAoYml0bWFwLT53cml0ZWJhY2tfZGFlbW9uICYmICEgSVNfRVJSKGJpdG1hcC0+d3JpdGViYWNrX2RhZW1vbikgJiYKLQkgICAgY3VycmVudC0+cGlkICE9IGJpdG1hcC0+d3JpdGViYWNrX2RhZW1vbi0+dHNrLT5waWQpIHsKLQkJbWRrX3RocmVhZF90ICpkYWVtb247Ci0JCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmJpdG1hcC0+bG9jaywgZmxhZ3MpOwotCQlkYWVtb24gPSBiaXRtYXAtPndyaXRlYmFja19kYWVtb247Ci0JCWJpdG1hcC0+d3JpdGViYWNrX2RhZW1vbiA9IE5VTEw7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJpdG1hcC0+bG9jaywgZmxhZ3MpOwotCQlpZiAoZGFlbW9uICYmICEgSVNfRVJSKGRhZW1vbikpCi0JCQltZF91bnJlZ2lzdGVyX3RocmVhZChkYWVtb24pOyAvKiBkZXN0cm95IHRoZSB0aHJlYWQgKi8KLQl9Ci19Ci0KIHN0YXRpYyBiaXRtYXBfY291bnRlcl90ICpiaXRtYXBfZ2V0X2NvdW50ZXIoc3RydWN0IGJpdG1hcCAqYml0bWFwLAogCQkJCQkgICAgc2VjdG9yX3Qgb2Zmc2V0LCBpbnQgKmJsb2NrcywKIAkJCQkJICAgIGludCBjcmVhdGUpCkBAIC0xNTAwLDggKzEzNjUsNiBAQAogCiAJLyogZnJlZSBhbGwgYWxsb2NhdGVkIG1lbW9yeSAqLwogCi0JbWVtcG9vbF9kZXN0cm95KGJpdG1hcC0+d3JpdGVfcG9vbCk7Ci0KIAlpZiAoYnApIC8qIGRlYWxsb2NhdGUgdGhlIHBhZ2UgbWVtb3J5ICovCiAJCWZvciAoayA9IDA7IGsgPCBwYWdlczsgaysrKQogCQkJaWYgKGJwW2tdLm1hcCAmJiAhYnBba10uaGlqYWNrZWQpCkBAIC0xNTQ5LDIwICsxNDEyLDIwIEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJc3Bpbl9sb2NrX2luaXQoJmJpdG1hcC0+bG9jayk7Ci0JYml0bWFwLT5tZGRldiA9IG1kZGV2OwotCi0Jc3Bpbl9sb2NrX2luaXQoJmJpdG1hcC0+d3JpdGVfbG9jayk7Ci0JSU5JVF9MSVNUX0hFQUQoJmJpdG1hcC0+Y29tcGxldGVfcGFnZXMpOworCWF0b21pY19zZXQoJmJpdG1hcC0+cGVuZGluZ193cml0ZXMsIDApOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmJpdG1hcC0+d3JpdGVfd2FpdCk7Ci0JYml0bWFwLT53cml0ZV9wb29sID0gbWVtcG9vbF9jcmVhdGVfa21hbGxvY19wb29sKFdSSVRFX1BPT0xfU0laRSwKLQkJCQkJCXNpemVvZihzdHJ1Y3QgcGFnZV9saXN0KSk7Ci0JZXJyID0gLUVOT01FTTsKLQlpZiAoIWJpdG1hcC0+d3JpdGVfcG9vbCkKLQkJZ290byBlcnJvcjsKKworCWJpdG1hcC0+bWRkZXYgPSBtZGRldjsKIAogCWJpdG1hcC0+ZmlsZSA9IGZpbGU7CiAJYml0bWFwLT5vZmZzZXQgPSBtZGRldi0+Yml0bWFwX29mZnNldDsKLQlpZiAoZmlsZSkgZ2V0X2ZpbGUoZmlsZSk7CisJaWYgKGZpbGUpIHsKKwkJZ2V0X2ZpbGUoZmlsZSk7CisJCWRvX3N5bmNfZmlsZV9yYW5nZShmaWxlLCAwLCBMTE9OR19NQVgsCisJCQkJICAgU1lOQ19GSUxFX1JBTkdFX1dBSVRfQkVGT1JFIHwKKwkJCQkgICBTWU5DX0ZJTEVfUkFOR0VfV1JJVEUgfAorCQkJCSAgIFNZTkNfRklMRV9SQU5HRV9XQUlUX0FGVEVSKTsKKwl9CiAJLyogcmVhZCBzdXBlcmJsb2NrIGZyb20gYml0bWFwIGZpbGUgKHRoaXMgc2V0cyBiaXRtYXAtPmNodW5rc2l6ZSkgKi8KIAllcnIgPSBiaXRtYXBfcmVhZF9zYihiaXRtYXApOwogCWlmIChlcnIpCkBAIC0xNTk0LDggKzE0NTcsNiBAQAogCWlmICghYml0bWFwLT5icCkKIAkJZ290byBlcnJvcjsKIAotCWJpdG1hcC0+ZmxhZ3MgfD0gQklUTUFQX0FDVElWRTsKLQogCS8qIG5vdyB0aGF0IHdlIGhhdmUgc29tZSBwYWdlcyBhdmFpbGFibGUsIGluaXRpYWxpemUgdGhlIGluLW1lbW9yeQogCSAqIGJpdG1hcCBmcm9tIHRoZSBvbi1kaXNrIGJpdG1hcCAqLwogCXN0YXJ0ID0gMDsKQEAgLTE2MTMsMTUgKzE0NzQsNiBAQAogCiAJbWRkZXYtPmJpdG1hcCA9IGJpdG1hcDsKIAotCWlmIChmaWxlKQotCQkvKiBraWNrIG9mZiB0aGUgYml0bWFwIHdyaXRlYmFjayBkYWVtb24gKi8KLQkJYml0bWFwLT53cml0ZWJhY2tfZGFlbW9uID0KLQkJCWJpdG1hcF9zdGFydF9kYWVtb24oYml0bWFwLAotCQkJCQkgICAgYml0bWFwX3dyaXRlYmFja19kYWVtb24sCi0JCQkJCSAgICAiYml0bWFwX3diIik7Ci0KLQlpZiAoSVNfRVJSKGJpdG1hcC0+d3JpdGViYWNrX2RhZW1vbikpCi0JCXJldHVybiBQVFJfRVJSKGJpdG1hcC0+d3JpdGViYWNrX2RhZW1vbik7CiAJbWRkZXYtPnRocmVhZC0+dGltZW91dCA9IGJpdG1hcC0+ZGFlbW9uX3NsZWVwICogSFo7CiAKIAlyZXR1cm4gYml0bWFwX3VwZGF0ZV9zYihiaXRtYXApOwpAQCAtMTYzOCw0ICsxNDkwLDMgQEAKIEVYUE9SVF9TWU1CT0woYml0bWFwX2VuZF9zeW5jKTsKIEVYUE9SVF9TWU1CT0woYml0bWFwX3VucGx1Zyk7CiBFWFBPUlRfU1lNQk9MKGJpdG1hcF9jbG9zZV9zeW5jKTsKLUVYUE9SVF9TWU1CT0woYml0bWFwX2RhZW1vbl93b3JrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tY3J5cHQuYyBiL2RyaXZlcnMvbWQvZG0tY3J5cHQuYwppbmRleCA2MWE1OTBiLi42MDIyZWQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLWNyeXB0LmMKKysrIGIvZHJpdmVycy9tZC9kbS1jcnlwdC5jCkBAIC0yMCw3ICsyMCw3IEBACiAKICNpbmNsdWRlICJkbS5oIgogCi0jZGVmaW5lIFBGWAkiY3J5cHQ6ICIKKyNkZWZpbmUgRE1fTVNHX1BSRUZJWCAiY3J5cHQiCiAKIC8qCiAgKiBwZXIgYmlvIHByaXZhdGUgZGF0YQpAQCAtMTI1LDE5ICsxMjUsMTkgQEAKIAl1OCAqc2FsdDsKIAogCWlmIChvcHRzID09IE5VTEwpIHsKLQkJdGktPmVycm9yID0gUEZYICJEaWdlc3QgYWxnb3JpdGhtIG1pc3NpbmcgZm9yIEVTU0lWIG1vZGUiOworCQl0aS0+ZXJyb3IgPSAiRGlnZXN0IGFsZ29yaXRobSBtaXNzaW5nIGZvciBFU1NJViBtb2RlIjsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJLyogSGFzaCB0aGUgY2lwaGVyIGtleSB3aXRoIHRoZSBnaXZlbiBoYXNoIGFsZ29yaXRobSAqLwogCWhhc2hfdGZtID0gY3J5cHRvX2FsbG9jX3RmbShvcHRzLCBDUllQVE9fVEZNX1JFUV9NQVlfU0xFRVApOwogCWlmIChoYXNoX3RmbSA9PSBOVUxMKSB7Ci0JCXRpLT5lcnJvciA9IFBGWCAiRXJyb3IgaW5pdGlhbGl6aW5nIEVTU0lWIGhhc2giOworCQl0aS0+ZXJyb3IgPSAiRXJyb3IgaW5pdGlhbGl6aW5nIEVTU0lWIGhhc2giOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlpZiAoY3J5cHRvX3RmbV9hbGdfdHlwZShoYXNoX3RmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0RJR0VTVCkgewotCQl0aS0+ZXJyb3IgPSBQRlggIkV4cGVjdGVkIGRpZ2VzdCBhbGdvcml0aG0gZm9yIEVTU0lWIGhhc2giOworCQl0aS0+ZXJyb3IgPSAiRXhwZWN0ZWQgZGlnZXN0IGFsZ29yaXRobSBmb3IgRVNTSVYgaGFzaCI7CiAJCWNyeXB0b19mcmVlX3RmbShoYXNoX3RmbSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTE0NSw3ICsxNDUsNyBAQAogCXNhbHRzaXplID0gY3J5cHRvX3RmbV9hbGdfZGlnZXN0c2l6ZShoYXNoX3RmbSk7CiAJc2FsdCA9IGttYWxsb2Moc2FsdHNpemUsIEdGUF9LRVJORUwpOwogCWlmIChzYWx0ID09IE5VTEwpIHsKLQkJdGktPmVycm9yID0gUEZYICJFcnJvciBrbWFsbG9jaW5nIHNhbHQgc3RvcmFnZSBpbiBFU1NJViI7CisJCXRpLT5lcnJvciA9ICJFcnJvciBrbWFsbG9jaW5nIHNhbHQgc3RvcmFnZSBpbiBFU1NJViI7CiAJCWNyeXB0b19mcmVlX3RmbShoYXNoX3RmbSk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KQEAgLTE1OSwyMCArMTU5LDIwIEBACiAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUllQVE9fVEZNX01PREVfRUNCIHwKIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENSWVBUT19URk1fUkVRX01BWV9TTEVFUCk7CiAJaWYgKGVzc2l2X3RmbSA9PSBOVUxMKSB7Ci0JCXRpLT5lcnJvciA9IFBGWCAiRXJyb3IgYWxsb2NhdGluZyBjcnlwdG8gdGZtIGZvciBFU1NJViI7CisJCXRpLT5lcnJvciA9ICJFcnJvciBhbGxvY2F0aW5nIGNyeXB0byB0Zm0gZm9yIEVTU0lWIjsKIAkJa2ZyZWUoc2FsdCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlpZiAoY3J5cHRvX3RmbV9hbGdfYmxvY2tzaXplKGVzc2l2X3RmbSkKIAkgICAgIT0gY3J5cHRvX3RmbV9hbGdfaXZzaXplKGNjLT50Zm0pKSB7Ci0JCXRpLT5lcnJvciA9IFBGWCAiQmxvY2sgc2l6ZSBvZiBFU1NJViBjaXBoZXIgZG9lcyAiCisJCXRpLT5lcnJvciA9ICJCbG9jayBzaXplIG9mIEVTU0lWIGNpcGhlciBkb2VzICIKIAkJCSAgICAgICAgIm5vdCBtYXRjaCBJViBzaXplIG9mIGJsb2NrIGNpcGhlciI7CiAJCWNyeXB0b19mcmVlX3RmbShlc3Npdl90Zm0pOwogCQlrZnJlZShzYWx0KTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWlmIChjcnlwdG9fY2lwaGVyX3NldGtleShlc3Npdl90Zm0sIHNhbHQsIHNhbHRzaXplKSA8IDApIHsKLQkJdGktPmVycm9yID0gUEZYICJGYWlsZWQgdG8gc2V0IGtleSBmb3IgRVNTSVYgY2lwaGVyIjsKKwkJdGktPmVycm9yID0gIkZhaWxlZCB0byBzZXQga2V5IGZvciBFU1NJViBjaXBoZXIiOwogCQljcnlwdG9fZnJlZV90Zm0oZXNzaXZfdGZtKTsKIAkJa2ZyZWUoc2FsdCk7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNTIxLDcgKzUyMSw3IEBACiAJdW5zaWduZWQgbG9uZyBsb25nIHRtcGxsOwogCiAJaWYgKGFyZ2MgIT0gNSkgewotCQl0aS0+ZXJyb3IgPSBQRlggIk5vdCBlbm91Z2ggYXJndW1lbnRzIjsKKwkJdGktPmVycm9yID0gIk5vdCBlbm91Z2ggYXJndW1lbnRzIjsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC01MzIsMjEgKzUzMiwyMSBAQAogCWl2bW9kZSA9IHN0cnNlcCgmaXZvcHRzLCAiOiIpOwogCiAJaWYgKHRtcCkKLQkJRE1XQVJOKFBGWCAiVW5leHBlY3RlZCBhZGRpdGlvbmFsIGNpcGhlciBvcHRpb25zIik7CisJCURNV0FSTigiVW5leHBlY3RlZCBhZGRpdGlvbmFsIGNpcGhlciBvcHRpb25zIik7CiAKIAlrZXlfc2l6ZSA9IHN0cmxlbihhcmd2WzFdKSA+PiAxOwogCiAJY2MgPSBrbWFsbG9jKHNpemVvZigqY2MpICsga2V5X3NpemUgKiBzaXplb2YodTgpLCBHRlBfS0VSTkVMKTsKIAlpZiAoY2MgPT0gTlVMTCkgewogCQl0aS0+ZXJyb3IgPQotCQkJUEZYICJDYW5ub3QgYWxsb2NhdGUgdHJhbnNwYXJlbnQgZW5jcnlwdGlvbiBjb250ZXh0IjsKKwkJCSJDYW5ub3QgYWxsb2NhdGUgdHJhbnNwYXJlbnQgZW5jcnlwdGlvbiBjb250ZXh0IjsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCiAJY2MtPmtleV9zaXplID0ga2V5X3NpemU7CiAJaWYgKCgha2V5X3NpemUgJiYgc3RyY21wKGFyZ3ZbMV0sICItIikgIT0gMCkgfHwKIAkgICAgKGtleV9zaXplICYmIGNyeXB0X2RlY29kZV9rZXkoY2MtPmtleSwgYXJndlsxXSwga2V5X3NpemUpIDwgMCkpIHsKLQkJdGktPmVycm9yID0gUEZYICJFcnJvciBkZWNvZGluZyBrZXkiOworCQl0aS0+ZXJyb3IgPSAiRXJyb3IgZGVjb2Rpbmcga2V5IjsKIAkJZ290byBiYWQxOwogCX0KIApAQCAtNTYyLDIyICs1NjIsMjIgQEAKIAllbHNlIGlmIChzdHJjbXAoY2hhaW5tb2RlLCAiZWNiIikgPT0gMCkKIAkJY3J5cHRvX2ZsYWdzID0gQ1JZUFRPX1RGTV9NT0RFX0VDQjsKIAllbHNlIHsKLQkJdGktPmVycm9yID0gUEZYICJVbmtub3duIGNoYWluaW5nIG1vZGUiOworCQl0aS0+ZXJyb3IgPSAiVW5rbm93biBjaGFpbmluZyBtb2RlIjsKIAkJZ290byBiYWQxOwogCX0KIAogCWlmIChjcnlwdG9fZmxhZ3MgIT0gQ1JZUFRPX1RGTV9NT0RFX0VDQiAmJiAhaXZtb2RlKSB7Ci0JCXRpLT5lcnJvciA9IFBGWCAiVGhpcyBjaGFpbmluZyBtb2RlIHJlcXVpcmVzIGFuIElWIG1lY2hhbmlzbSI7CisJCXRpLT5lcnJvciA9ICJUaGlzIGNoYWluaW5nIG1vZGUgcmVxdWlyZXMgYW4gSVYgbWVjaGFuaXNtIjsKIAkJZ290byBiYWQxOwogCX0KIAogCXRmbSA9IGNyeXB0b19hbGxvY190Zm0oY2lwaGVyLCBjcnlwdG9fZmxhZ3MgfCBDUllQVE9fVEZNX1JFUV9NQVlfU0xFRVApOwogCWlmICghdGZtKSB7Ci0JCXRpLT5lcnJvciA9IFBGWCAiRXJyb3IgYWxsb2NhdGluZyBjcnlwdG8gdGZtIjsKKwkJdGktPmVycm9yID0gIkVycm9yIGFsbG9jYXRpbmcgY3J5cHRvIHRmbSI7CiAJCWdvdG8gYmFkMTsKIAl9CiAJaWYgKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSKSB7Ci0JCXRpLT5lcnJvciA9IFBGWCAiRXhwZWN0ZWQgY2lwaGVyIGFsZ29yaXRobSI7CisJCXRpLT5lcnJvciA9ICJFeHBlY3RlZCBjaXBoZXIgYWxnb3JpdGhtIjsKIAkJZ290byBiYWQyOwogCX0KIApAQCAtNTk1LDcgKzU5NSw3IEBACiAJZWxzZSBpZiAoc3RyY21wKGl2bW9kZSwgImVzc2l2IikgPT0gMCkKIAkJY2MtPml2X2dlbl9vcHMgPSAmY3J5cHRfaXZfZXNzaXZfb3BzOwogCWVsc2UgewotCQl0aS0+ZXJyb3IgPSBQRlggIkludmFsaWQgSVYgbW9kZSI7CisJCXRpLT5lcnJvciA9ICJJbnZhbGlkIElWIG1vZGUiOwogCQlnb3RvIGJhZDI7CiAJfQogCkBAIC02MTAsNyArNjEwLDcgQEAKIAllbHNlIHsKIAkJY2MtPml2X3NpemUgPSAwOwogCQlpZiAoY2MtPml2X2dlbl9vcHMpIHsKLQkJCURNV0FSTihQRlggIlNlbGVjdGVkIGNpcGhlciBkb2VzIG5vdCBzdXBwb3J0IElWcyIpOworCQkJRE1XQVJOKCJTZWxlY3RlZCBjaXBoZXIgZG9lcyBub3Qgc3VwcG9ydCBJVnMiKTsKIAkJCWlmIChjYy0+aXZfZ2VuX29wcy0+ZHRyKQogCQkJCWNjLT5pdl9nZW5fb3BzLT5kdHIoY2MpOwogCQkJY2MtPml2X2dlbl9vcHMgPSBOVUxMOwpAQCAtNjE5LDM2ICs2MTksMzYgQEAKIAogCWNjLT5pb19wb29sID0gbWVtcG9vbF9jcmVhdGVfc2xhYl9wb29sKE1JTl9JT1MsIF9jcnlwdF9pb19wb29sKTsKIAlpZiAoIWNjLT5pb19wb29sKSB7Ci0JCXRpLT5lcnJvciA9IFBGWCAiQ2Fubm90IGFsbG9jYXRlIGNyeXB0IGlvIG1lbXBvb2wiOworCQl0aS0+ZXJyb3IgPSAiQ2Fubm90IGFsbG9jYXRlIGNyeXB0IGlvIG1lbXBvb2wiOwogCQlnb3RvIGJhZDM7CiAJfQogCiAJY2MtPnBhZ2VfcG9vbCA9IG1lbXBvb2xfY3JlYXRlX3BhZ2VfcG9vbChNSU5fUE9PTF9QQUdFUywgMCk7CiAJaWYgKCFjYy0+cGFnZV9wb29sKSB7Ci0JCXRpLT5lcnJvciA9IFBGWCAiQ2Fubm90IGFsbG9jYXRlIHBhZ2UgbWVtcG9vbCI7CisJCXRpLT5lcnJvciA9ICJDYW5ub3QgYWxsb2NhdGUgcGFnZSBtZW1wb29sIjsKIAkJZ290byBiYWQ0OwogCX0KIAogCWlmICh0Zm0tPmNydF9jaXBoZXIuY2l0X3NldGtleSh0Zm0sIGNjLT5rZXksIGtleV9zaXplKSA8IDApIHsKLQkJdGktPmVycm9yID0gUEZYICJFcnJvciBzZXR0aW5nIGtleSI7CisJCXRpLT5lcnJvciA9ICJFcnJvciBzZXR0aW5nIGtleSI7CiAJCWdvdG8gYmFkNTsKIAl9CiAKIAlpZiAoc3NjYW5mKGFyZ3ZbMl0sICIlbGx1IiwgJnRtcGxsKSAhPSAxKSB7Ci0JCXRpLT5lcnJvciA9IFBGWCAiSW52YWxpZCBpdl9vZmZzZXQgc2VjdG9yIjsKKwkJdGktPmVycm9yID0gIkludmFsaWQgaXZfb2Zmc2V0IHNlY3RvciI7CiAJCWdvdG8gYmFkNTsKIAl9CiAJY2MtPml2X29mZnNldCA9IHRtcGxsOwogCiAJaWYgKHNzY2FuZihhcmd2WzRdLCAiJWxsdSIsICZ0bXBsbCkgIT0gMSkgewotCQl0aS0+ZXJyb3IgPSBQRlggIkludmFsaWQgZGV2aWNlIHNlY3RvciI7CisJCXRpLT5lcnJvciA9ICJJbnZhbGlkIGRldmljZSBzZWN0b3IiOwogCQlnb3RvIGJhZDU7CiAJfQogCWNjLT5zdGFydCA9IHRtcGxsOwogCiAJaWYgKGRtX2dldF9kZXZpY2UodGksIGFyZ3ZbM10sIGNjLT5zdGFydCwgdGktPmxlbiwKIAkgICAgICAgICAgICAgICAgICBkbV90YWJsZV9nZXRfbW9kZSh0aS0+dGFibGUpLCAmY2MtPmRldikpIHsKLQkJdGktPmVycm9yID0gUEZYICJEZXZpY2UgbG9va3VwIGZhaWxlZCI7CisJCXRpLT5lcnJvciA9ICJEZXZpY2UgbG9va3VwIGZhaWxlZCI7CiAJCWdvdG8gYmFkNTsKIAl9CiAKQEAgLTY1Nyw3ICs2NTcsNyBAQAogCQkJKihpdm9wdHMgLSAxKSA9ICc6JzsKIAkJY2MtPml2X21vZGUgPSBrbWFsbG9jKHN0cmxlbihpdm1vZGUpICsgMSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghY2MtPml2X21vZGUpIHsKLQkJCXRpLT5lcnJvciA9IFBGWCAiRXJyb3Iga21hbGxvY2luZyBpdl9tb2RlIHN0cmluZyI7CisJCQl0aS0+ZXJyb3IgPSAiRXJyb3Iga21hbGxvY2luZyBpdl9tb2RlIHN0cmluZyI7CiAJCQlnb3RvIGJhZDU7CiAJCX0KIAkJc3RyY3B5KGNjLT5pdl9tb2RlLCBpdm1vZGUpOwpAQCAtOTE4LDEzICs5MTgsMTMgQEAKIAlfa2NyeXB0ZF93b3JrcXVldWUgPSBjcmVhdGVfd29ya3F1ZXVlKCJrY3J5cHRkIik7CiAJaWYgKCFfa2NyeXB0ZF93b3JrcXVldWUpIHsKIAkJciA9IC1FTk9NRU07Ci0JCURNRVJSKFBGWCAiY291bGRuJ3QgY3JlYXRlIGtjcnlwdGQiKTsKKwkJRE1FUlIoImNvdWxkbid0IGNyZWF0ZSBrY3J5cHRkIik7CiAJCWdvdG8gYmFkMTsKIAl9CiAKIAlyID0gZG1fcmVnaXN0ZXJfdGFyZ2V0KCZjcnlwdF90YXJnZXQpOwogCWlmIChyIDwgMCkgewotCQlETUVSUihQRlggInJlZ2lzdGVyIGZhaWxlZCAlZCIsIHIpOworCQlETUVSUigicmVnaXN0ZXIgZmFpbGVkICVkIiwgcik7CiAJCWdvdG8gYmFkMjsKIAl9CiAKQEAgLTk0Miw3ICs5NDIsNyBAQAogCWludCByID0gZG1fdW5yZWdpc3Rlcl90YXJnZXQoJmNyeXB0X3RhcmdldCk7CiAKIAlpZiAociA8IDApCi0JCURNRVJSKFBGWCAidW5yZWdpc3RlciBmYWlsZWQgJWQiLCByKTsKKwkJRE1FUlIoInVucmVnaXN0ZXIgZmFpbGVkICVkIiwgcik7CiAKIAlkZXN0cm95X3dvcmtxdWV1ZShfa2NyeXB0ZF93b3JrcXVldWUpOwogCWttZW1fY2FjaGVfZGVzdHJveShfY3J5cHRfaW9fcG9vbCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLWVtYy5jIGIvZHJpdmVycy9tZC9kbS1lbWMuYwppbmRleCBjNzA2NzY3Li4yYTM3NGNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLWVtYy5jCisrKyBiL2RyaXZlcnMvbWQvZG0tZW1jLmMKQEAgLTEyLDYgKzEyLDggQEAKICNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgogCisjZGVmaW5lIERNX01TR19QUkVGSVggIm11bHRpcGF0aCBlbWMiCisKIHN0cnVjdCBlbWNfaGFuZGxlciB7CiAJc3BpbmxvY2tfdCBsb2NrOwogCkBAIC02Niw3ICs2OCw3IEBACiAKIAliaW8gPSBiaW9fYWxsb2MoR0ZQX0FUT01JQywgMSk7CiAJaWYgKCFiaW8pIHsKLQkJRE1FUlIoImRtLWVtYzogZ2V0X2ZhaWxvdmVyX2JpbzogYmlvX2FsbG9jKCkgZmFpbGVkLiIpOworCQlETUVSUigiZ2V0X2ZhaWxvdmVyX2JpbzogYmlvX2FsbG9jKCkgZmFpbGVkLiIpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKQEAgLTc4LDEzICs4MCwxMyBAQAogCiAJcGFnZSA9IGFsbG9jX3BhZ2UoR0ZQX0FUT01JQyk7CiAJaWYgKCFwYWdlKSB7Ci0JCURNRVJSKCJkbS1lbWM6IGdldF9mYWlsb3Zlcl9iaW86IGFsbG9jX3BhZ2UoKSBmYWlsZWQuIik7CisJCURNRVJSKCJnZXRfZmFpbG92ZXJfYmlvOiBhbGxvY19wYWdlKCkgZmFpbGVkLiIpOwogCQliaW9fcHV0KGJpbyk7CiAJCXJldHVybiBOVUxMOwogCX0KIAogCWlmIChiaW9fYWRkX3BhZ2UoYmlvLCBwYWdlLCBkYXRhX3NpemUsIDApICE9IGRhdGFfc2l6ZSkgewotCQlETUVSUigiZG0tZW1jOiBnZXRfZmFpbG92ZXJfYmlvOiBhbGxvY19wYWdlKCkgZmFpbGVkLiIpOworCQlETUVSUigiZ2V0X2ZhaWxvdmVyX2JpbzogYWxsb2NfcGFnZSgpIGZhaWxlZC4iKTsKIAkJX19mcmVlX3BhZ2UocGFnZSk7CiAJCWJpb19wdXQoYmlvKTsKIAkJcmV0dXJuIE5VTEw7CkBAIC0xMDMsNyArMTA1LDcgQEAKIAkvKiBGSVhNRTogRmlndXJlIG91dCB3aHkgaXQgZmFpbHMgd2l0aCBHRlBfQVRPTUlDLiAqLwogCXJxID0gYmxrX2dldF9yZXF1ZXN0KHEsIFdSSVRFLCBfX0dGUF9XQUlUKTsKIAlpZiAoIXJxKSB7Ci0JCURNRVJSKCJkbS1lbWM6IGdldF9mYWlsb3Zlcl9yZXE6IGJsa19nZXRfcmVxdWVzdCBmYWlsZWQiKTsKKwkJRE1FUlIoImdldF9mYWlsb3Zlcl9yZXE6IGJsa19nZXRfcmVxdWVzdCBmYWlsZWQiKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCkBAIC0xNjAsNyArMTYyLDcgQEAKIAogCWJpbyA9IGdldF9mYWlsb3Zlcl9iaW8ocGF0aCwgZGF0YV9zaXplKTsKIAlpZiAoIWJpbykgewotCQlETUVSUigiZG0tZW1jOiBlbWNfdHJlc3Bhc3NfZ2V0OiBubyBiaW8iKTsKKwkJRE1FUlIoImVtY190cmVzcGFzc19nZXQ6IG5vIGJpbyIpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKQEAgLTE3Myw3ICsxNzUsNyBAQAogCS8qIGdldCByZXF1ZXN0IGZvciBibG9jayBsYXllciBwYWNrZXQgY29tbWFuZCAqLwogCXJxID0gZ2V0X2ZhaWxvdmVyX3JlcShoLCBiaW8sIHBhdGgpOwogCWlmICghcnEpIHsKLQkJRE1FUlIoImRtLWVtYzogZW1jX3RyZXNwYXNzX2dldDogbm8gcnEiKTsKKwkJRE1FUlIoImVtY190cmVzcGFzc19nZXQ6IG5vIHJxIik7CiAJCWZyZWVfYmlvKGJpbyk7CiAJCXJldHVybiBOVUxMOwogCX0KQEAgLTIwMCwxOCArMjAyLDE4IEBACiAJICogaW5pdGlhbCBzdGF0ZSBwYXNzZWQgaW50byB1cyBhbmQgdGhlbiBnZXQgYW4gdXBkYXRlIGhlcmUuCiAJICovCiAJaWYgKCFxKSB7Ci0JCURNSU5GTygiZG0tZW1jOiBlbWNfcGdfaW5pdDogbm8gcXVldWUiKTsKKwkJRE1JTkZPKCJlbWNfcGdfaW5pdDogbm8gcXVldWUiKTsKIAkJZ290byBmYWlsX3BhdGg7CiAJfQogCiAJLyogRklYTUU6IFRoZSByZXF1ZXN0IHNob3VsZCBiZSBwcmUtYWxsb2NhdGVkLiAqLwogCXJxID0gZW1jX3RyZXNwYXNzX2dldChod2gtPmNvbnRleHQsIHBhdGgpOwogCWlmICghcnEpIHsKLQkJRE1FUlIoImRtLWVtYzogZW1jX3BnX2luaXQ6IG5vIHJxIik7CisJCURNRVJSKCJlbWNfcGdfaW5pdDogbm8gcnEiKTsKIAkJZ290byBmYWlsX3BhdGg7CiAJfQogCi0JRE1JTkZPKCJkbS1lbWM6IGVtY19wZ19pbml0OiBzZW5kaW5nIHN3aXRjaC1vdmVyIGNvbW1hbmQiKTsKKwlETUlORk8oImVtY19wZ19pbml0OiBzZW5kaW5nIHN3aXRjaC1vdmVyIGNvbW1hbmQiKTsKIAllbHZfYWRkX3JlcXVlc3QocSwgcnEsIEVMRVZBVE9SX0lOU0VSVF9GUk9OVCwgMSk7CiAJcmV0dXJuOwogCkBAIC0yNDEsMTggKzI0MywxOCBAQAogCQlociA9IDA7CiAJCXNob3J0X3RyZXNwYXNzID0gMDsKIAl9IGVsc2UgaWYgKGFyZ2MgIT0gMikgewotCQlETVdBUk4oImRtLWVtYyBod2hhbmRsZXI6IGluY29ycmVjdCBudW1iZXIgb2YgYXJndW1lbnRzIik7CisJCURNV0FSTigiaW5jb3JyZWN0IG51bWJlciBvZiBhcmd1bWVudHMiKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfSBlbHNlIHsKIAkJaWYgKChzc2NhbmYoYXJndlswXSwgIiV1IiwgJnNob3J0X3RyZXNwYXNzKSAhPSAxKQogCQkJfHwgKHNob3J0X3RyZXNwYXNzID4gMSkpIHsKLQkJCURNV0FSTigiZG0tZW1jOiBpbnZhbGlkIHRyZXNwYXNzIG1vZGUgc2VsZWN0ZWQiKTsKKwkJCURNV0FSTigiaW52YWxpZCB0cmVzcGFzcyBtb2RlIHNlbGVjdGVkIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCiAJCWlmICgoc3NjYW5mKGFyZ3ZbMV0sICIldSIsICZocikgIT0gMSkKIAkJCXx8IChociA+IDEpKSB7Ci0JCQlETVdBUk4oImRtLWVtYzogaW52YWxpZCBob25vciByZXNlcnZhdGlvbiBmbGFnIHNlbGVjdGVkIik7CisJCQlETVdBUk4oImludmFsaWQgaG9ub3IgcmVzZXJ2YXRpb24gZmxhZyBzZWxlY3RlZCIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAl9CkBAIC0yNjQsMTQgKzI2NiwxNCBAQAogCWh3aC0+Y29udGV4dCA9IGg7CiAKIAlpZiAoKGgtPnNob3J0X3RyZXNwYXNzID0gc2hvcnRfdHJlc3Bhc3MpKQotCQlETVdBUk4oImRtLWVtYzogc2hvcnQgdHJlc3Bhc3MgY29tbWFuZCB3aWxsIGJlIHNlbmQiKTsKKwkJRE1XQVJOKCJzaG9ydCB0cmVzcGFzcyBjb21tYW5kIHdpbGwgYmUgc2VuZCIpOwogCWVsc2UKLQkJRE1XQVJOKCJkbS1lbWM6IGxvbmcgdHJlc3Bhc3MgY29tbWFuZCB3aWxsIGJlIHNlbmQiKTsKKwkJRE1XQVJOKCJsb25nIHRyZXNwYXNzIGNvbW1hbmQgd2lsbCBiZSBzZW5kIik7CiAKIAlpZiAoKGgtPmhyID0gaHIpKQotCQlETVdBUk4oImRtLWVtYzogaG9ub3IgcmVzZXJ2YXRpb24gYml0IHdpbGwgYmUgc2V0Iik7CisJCURNV0FSTigiaG9ub3IgcmVzZXJ2YXRpb24gYml0IHdpbGwgYmUgc2V0Iik7CiAJZWxzZQotCQlETVdBUk4oImRtLWVtYzogaG9ub3IgcmVzZXJ2YXRpb24gYml0IHdpbGwgbm90IGJlIHNldCAoZGVmYXVsdCkiKTsKKwkJRE1XQVJOKCJob25vciByZXNlcnZhdGlvbiBiaXQgd2lsbCBub3QgYmUgc2V0IChkZWZhdWx0KSIpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0zMzYsOSArMzM4LDkgQEAKIAlpbnQgciA9IGRtX3JlZ2lzdGVyX2h3X2hhbmRsZXIoJmVtY19od2gpOwogCiAJaWYgKHIgPCAwKQotCQlETUVSUigiZW1jOiByZWdpc3RlciBmYWlsZWQgJWQiLCByKTsKKwkJRE1FUlIoInJlZ2lzdGVyIGZhaWxlZCAlZCIsIHIpOwogCi0JRE1JTkZPKCJkbS1lbWMgdmVyc2lvbiAwLjAuMyBsb2FkZWQiKTsKKwlETUlORk8oInZlcnNpb24gMC4wLjMgbG9hZGVkIik7CiAKIAlyZXR1cm4gcjsKIH0KQEAgLTM0OCw3ICszNTAsNyBAQAogCWludCByID0gZG1fdW5yZWdpc3Rlcl9od19oYW5kbGVyKCZlbWNfaHdoKTsKIAogCWlmIChyIDwgMCkKLQkJRE1FUlIoImVtYzogdW5yZWdpc3RlciBmYWlsZWQgJWQiLCByKTsKKwkJRE1FUlIoInVucmVnaXN0ZXIgZmFpbGVkICVkIiwgcik7CiB9CiAKIG1vZHVsZV9pbml0KGRtX2VtY19pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tZXhjZXB0aW9uLXN0b3JlLmMgYi9kcml2ZXJzL21kL2RtLWV4Y2VwdGlvbi1zdG9yZS5jCmluZGV4IGNjMDdiYmUuLmQxMjM3OWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0tZXhjZXB0aW9uLXN0b3JlLmMKKysrIGIvZHJpdmVycy9tZC9kbS1leGNlcHRpb24tc3RvcmUuYwpAQCAtMTYsNiArMTYsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKKyNkZWZpbmUgRE1fTVNHX1BSRUZJWCAic25hcHNob3RzIgorCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBQZXJzaXN0ZW50IHNuYXBzaG90cywgYnkgcGVyc2lzdGVudCB3ZSBtZWFuIHRoYXQgdGhlIHNuYXBzaG90CiAgKiB3aWxsIHN1cnZpdmUgYSByZWJvb3QuCkBAIC05MSw3ICs5Myw2IEBACiAJc3RydWN0IGRtX3NuYXBzaG90ICpzbmFwOwkvKiB1cCBwb2ludGVyIHRvIG15IHNuYXBzaG90ICovCiAJaW50IHZlcnNpb247CiAJaW50IHZhbGlkOwotCXVpbnQzMl90IGNodW5rX3NpemU7CiAJdWludDMyX3QgZXhjZXB0aW9uc19wZXJfYXJlYTsKIAogCS8qCkBAIC0xMzMsNyArMTM0LDcgQEAKIAlpbnQgciA9IC1FTk9NRU07CiAJc2l6ZV90IGxlbjsKIAotCWxlbiA9IHBzLT5jaHVua19zaXplIDw8IFNFQ1RPUl9TSElGVDsKKwlsZW4gPSBwcy0+c25hcC0+Y2h1bmtfc2l6ZSA8PCBTRUNUT1JfU0hJRlQ7CiAKIAkvKgogCSAqIEFsbG9jYXRlIHRoZSBjaHVua19zaXplIGJsb2NrIG9mIG1lbW9yeSB0aGF0IHdpbGwgaG9sZApAQCAtMTYwLDggKzE2MSw4IEBACiAJdW5zaWduZWQgbG9uZyBiaXRzOwogCiAJd2hlcmUuYmRldiA9IHBzLT5zbmFwLT5jb3ctPmJkZXY7Ci0Jd2hlcmUuc2VjdG9yID0gcHMtPmNodW5rX3NpemUgKiBjaHVuazsKLQl3aGVyZS5jb3VudCA9IHBzLT5jaHVua19zaXplOworCXdoZXJlLnNlY3RvciA9IHBzLT5zbmFwLT5jaHVua19zaXplICogY2h1bms7CisJd2hlcmUuY291bnQgPSBwcy0+c25hcC0+Y2h1bmtfc2l6ZTsKIAogCXJldHVybiBkbV9pb19zeW5jX3ZtKDEsICZ3aGVyZSwgcncsIHBzLT5hcmVhLCAmYml0cyk7CiB9CkBAIC0xODgsNyArMTg5LDcgQEAKIAogc3RhdGljIGludCB6ZXJvX2FyZWEoc3RydWN0IHBzdG9yZSAqcHMsIHVpbnQzMl90IGFyZWEpCiB7Ci0JbWVtc2V0KHBzLT5hcmVhLCAwLCBwcy0+Y2h1bmtfc2l6ZSA8PCBTRUNUT1JfU0hJRlQpOworCW1lbXNldChwcy0+YXJlYSwgMCwgcHMtPnNuYXAtPmNodW5rX3NpemUgPDwgU0VDVE9SX1NISUZUKTsKIAlyZXR1cm4gYXJlYV9pbyhwcywgYXJlYSwgV1JJVEUpOwogfQogCkBAIC0xOTYsNiArMTk3LDcgQEAKIHsKIAlpbnQgcjsKIAlzdHJ1Y3QgZGlza19oZWFkZXIgKmRoOworCWNodW5rX3QgY2h1bmtfc2l6ZTsKIAogCXIgPSBjaHVua19pbyhwcywgMCwgUkVBRCk7CiAJaWYgKHIpCkBAIC0yMTAsOCArMjEyLDI5IEBACiAJCSpuZXdfc25hcHNob3QgPSAwOwogCQlwcy0+dmFsaWQgPSBsZTMyX3RvX2NwdShkaC0+dmFsaWQpOwogCQlwcy0+dmVyc2lvbiA9IGxlMzJfdG9fY3B1KGRoLT52ZXJzaW9uKTsKLQkJcHMtPmNodW5rX3NpemUgPSBsZTMyX3RvX2NwdShkaC0+Y2h1bmtfc2l6ZSk7CisJCWNodW5rX3NpemUgPSBsZTMyX3RvX2NwdShkaC0+Y2h1bmtfc2l6ZSk7CisJCWlmIChwcy0+c25hcC0+Y2h1bmtfc2l6ZSAhPSBjaHVua19zaXplKSB7CisJCQlETVdBUk4oImNodW5rIHNpemUgJWxsdSBpbiBkZXZpY2UgbWV0YWRhdGEgb3ZlcnJpZGVzICIKKwkJCSAgICAgICAidGFibGUgY2h1bmsgc2l6ZSBvZiAlbGx1LiIsCisJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyljaHVua19zaXplLAorCQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpcHMtPnNuYXAtPmNodW5rX3NpemUpOwogCisJCQkvKiBXZSBoYWQgYSBib2d1cyBjaHVua19zaXplLiBGaXggc3R1ZmYgdXAuICovCisJCQlkbV9pb19wdXQoc2VjdG9yc190b19wYWdlcyhwcy0+c25hcC0+Y2h1bmtfc2l6ZSkpOworCQkJZnJlZV9hcmVhKHBzKTsKKworCQkJcHMtPnNuYXAtPmNodW5rX3NpemUgPSBjaHVua19zaXplOworCQkJcHMtPnNuYXAtPmNodW5rX21hc2sgPSBjaHVua19zaXplIC0gMTsKKwkJCXBzLT5zbmFwLT5jaHVua19zaGlmdCA9IGZmcyhjaHVua19zaXplKSAtIDE7CisKKwkJCXIgPSBhbGxvY19hcmVhKHBzKTsKKwkJCWlmIChyKQorCQkJCXJldHVybiByOworCisJCQlyID0gZG1faW9fZ2V0KHNlY3RvcnNfdG9fcGFnZXMoY2h1bmtfc2l6ZSkpOworCQkJaWYgKHIpCisJCQkJcmV0dXJuIHI7CisJCX0KIAl9IGVsc2UgewogCQlETVdBUk4oIkludmFsaWQvY29ycnVwdCBzbmFwc2hvdCIpOwogCQlyID0gLUVOWElPOwpAQCAtMjI0LDEzICsyNDcsMTMgQEAKIHsKIAlzdHJ1Y3QgZGlza19oZWFkZXIgKmRoOwogCi0JbWVtc2V0KHBzLT5hcmVhLCAwLCBwcy0+Y2h1bmtfc2l6ZSA8PCBTRUNUT1JfU0hJRlQpOworCW1lbXNldChwcy0+YXJlYSwgMCwgcHMtPnNuYXAtPmNodW5rX3NpemUgPDwgU0VDVE9SX1NISUZUKTsKIAogCWRoID0gKHN0cnVjdCBkaXNrX2hlYWRlciAqKSBwcy0+YXJlYTsKIAlkaC0+bWFnaWMgPSBjcHVfdG9fbGUzMihTTkFQX01BR0lDKTsKIAlkaC0+dmFsaWQgPSBjcHVfdG9fbGUzMihwcy0+dmFsaWQpOwogCWRoLT52ZXJzaW9uID0gY3B1X3RvX2xlMzIocHMtPnZlcnNpb24pOwotCWRoLT5jaHVua19zaXplID0gY3B1X3RvX2xlMzIocHMtPmNodW5rX3NpemUpOworCWRoLT5jaHVua19zaXplID0gY3B1X3RvX2xlMzIocHMtPnNuYXAtPmNodW5rX3NpemUpOwogCiAJcmV0dXJuIGNodW5rX2lvKHBzLCAwLCBXUklURSk7CiB9CkBAIC0zNjUsNyArMzg4LDcgQEAKIHsKIAlzdHJ1Y3QgcHN0b3JlICpwcyA9IGdldF9pbmZvKHN0b3JlKTsKIAotCWRtX2lvX3B1dChzZWN0b3JzX3RvX3BhZ2VzKHBzLT5jaHVua19zaXplKSk7CisJZG1faW9fcHV0KHNlY3RvcnNfdG9fcGFnZXMocHMtPnNuYXAtPmNodW5rX3NpemUpKTsKIAl2ZnJlZShwcy0+Y2FsbGJhY2tzKTsKIAlmcmVlX2FyZWEocHMpOwogCWtmcmVlKHBzKTsKQEAgLTM4NCw2ICs0MDcsMTYgQEAKIAkJcmV0dXJuIHI7CiAKIAkvKgorCSAqIE5vdyB3ZSBrbm93IGNvcnJlY3QgY2h1bmtfc2l6ZSwgY29tcGxldGUgdGhlIGluaXRpYWxpc2F0aW9uLgorCSAqLworCXBzLT5leGNlcHRpb25zX3Blcl9hcmVhID0gKHBzLT5zbmFwLT5jaHVua19zaXplIDw8IFNFQ1RPUl9TSElGVCkgLworCQkJCSAgc2l6ZW9mKHN0cnVjdCBkaXNrX2V4Y2VwdGlvbik7CisJcHMtPmNhbGxiYWNrcyA9IGRtX3ZjYWxsb2MocHMtPmV4Y2VwdGlvbnNfcGVyX2FyZWEsCisJCQlzaXplb2YoKnBzLT5jYWxsYmFja3MpKTsKKwlpZiAoIXBzLT5jYWxsYmFja3MpCisJCXJldHVybiAtRU5PTUVNOworCisJLyoKIAkgKiBEbyB3ZSBuZWVkIHRvIHNldHVwIGEgbmV3IHNuYXBzaG90ID8KIAkgKi8KIAlpZiAobmV3X3NuYXBzaG90KSB7CkBAIC01MzMsOSArNTY2LDYgQEAKIAlwcy0+c25hcCA9IHN0b3JlLT5zbmFwOwogCXBzLT52YWxpZCA9IDE7CiAJcHMtPnZlcnNpb24gPSBTTkFQU0hPVF9ESVNLX1ZFUlNJT047Ci0JcHMtPmNodW5rX3NpemUgPSBjaHVua19zaXplOwotCXBzLT5leGNlcHRpb25zX3Blcl9hcmVhID0gKGNodW5rX3NpemUgPDwgU0VDVE9SX1NISUZUKSAvCi0JICAgIHNpemVvZihzdHJ1Y3QgZGlza19leGNlcHRpb24pOwogCXBzLT5uZXh0X2ZyZWUgPSAyOwkvKiBza2lwcGluZyB0aGUgaGVhZGVyIGFuZCBmaXJzdCBhcmVhICovCiAJcHMtPmN1cnJlbnRfY29tbWl0dGVkID0gMDsKIApAQCAtNTQzLDE4ICs1NzMsOSBAQAogCWlmIChyKQogCQlnb3RvIGJhZDsKIAotCS8qCi0JICogQWxsb2NhdGUgc3BhY2UgZm9yIGFsbCB0aGUgY2FsbGJhY2tzLgotCSAqLwogCXBzLT5jYWxsYmFja19jb3VudCA9IDA7CiAJYXRvbWljX3NldCgmcHMtPnBlbmRpbmdfY291bnQsIDApOwotCXBzLT5jYWxsYmFja3MgPSBkbV92Y2FsbG9jKHBzLT5leGNlcHRpb25zX3Blcl9hcmVhLAotCQkJCSAgIHNpemVvZigqcHMtPmNhbGxiYWNrcykpOwotCi0JaWYgKCFwcy0+Y2FsbGJhY2tzKSB7Ci0JCXIgPSAtRU5PTUVNOwotCQlnb3RvIGJhZDsKLQl9CisJcHMtPmNhbGxiYWNrcyA9IE5VTEw7CiAKIAlzdG9yZS0+ZGVzdHJveSA9IHBlcnNpc3RlbnRfZGVzdHJveTsKIAlzdG9yZS0+cmVhZF9tZXRhZGF0YSA9IHBlcnNpc3RlbnRfcmVhZF9tZXRhZGF0YTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0taW9jdGwuYyBiL2RyaXZlcnMvbWQvZG0taW9jdGwuYwppbmRleCA4ZWRkNjQzLi4zZWRiMzQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLWlvY3RsLmMKKysrIGIvZHJpdmVycy9tZC9kbS1pb2N0bC5jCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiBTaXN0aW5hIFNvZnR3YXJlIChVSykgTGltaXRlZC4KLSAqIENvcHlyaWdodCAoQykgMjAwNCAtIDIwMDUgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA0IC0gMjAwNiBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEwuCiAgKi8KQEAgLTE5LDYgKzE5LDcgQEAKIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKKyNkZWZpbmUgRE1fTVNHX1BSRUZJWCAiaW9jdGwiCiAjZGVmaW5lIERNX0RSSVZFUl9FTUFJTCAiZG0tZGV2ZWxAcmVkaGF0LmNvbSIKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNDgsNyArNDksNyBAQAogc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgX25hbWVfYnVja2V0c1tOVU1fQlVDS0VUU107CiBzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCBfdXVpZF9idWNrZXRzW05VTV9CVUNLRVRTXTsKIAotc3RhdGljIHZvaWQgZG1faGFzaF9yZW1vdmVfYWxsKHZvaWQpOworc3RhdGljIHZvaWQgZG1faGFzaF9yZW1vdmVfYWxsKGludCBrZWVwX29wZW5fZGV2aWNlcyk7CiAKIC8qCiAgKiBHdWFyZHMgYWNjZXNzIHRvIGJvdGggaGFzaCB0YWJsZXMuCkBAIC03Myw3ICs3NCw3IEBACiAKIHN0YXRpYyB2b2lkIGRtX2hhc2hfZXhpdCh2b2lkKQogewotCWRtX2hhc2hfcmVtb3ZlX2FsbCgpOworCWRtX2hhc2hfcmVtb3ZlX2FsbCgwKTsKIAlkZXZmc19yZW1vdmUoRE1fRElSKTsKIH0KIApAQCAtMTAyLDggKzEwMywxMCBAQAogCXVuc2lnbmVkIGludCBoID0gaGFzaF9zdHIoc3RyKTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkgKGhjLCBfbmFtZV9idWNrZXRzICsgaCwgbmFtZV9saXN0KQotCQlpZiAoIXN0cmNtcChoYy0+bmFtZSwgc3RyKSkKKwkJaWYgKCFzdHJjbXAoaGMtPm5hbWUsIHN0cikpIHsKKwkJCWRtX2dldChoYy0+bWQpOwogCQkJcmV0dXJuIGhjOworCQl9CiAKIAlyZXR1cm4gTlVMTDsKIH0KQEAgLTExNCw4ICsxMTcsMTAgQEAKIAl1bnNpZ25lZCBpbnQgaCA9IGhhc2hfc3RyKHN0cik7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5IChoYywgX3V1aWRfYnVja2V0cyArIGgsIHV1aWRfbGlzdCkKLQkJaWYgKCFzdHJjbXAoaGMtPnV1aWQsIHN0cikpCisJCWlmICghc3RyY21wKGhjLT51dWlkLCBzdHIpKSB7CisJCQlkbV9nZXQoaGMtPm1kKTsKIAkJCXJldHVybiBoYzsKKwkJfQogCiAJcmV0dXJuIE5VTEw7CiB9CkBAIC0xOTEsNyArMTk2LDcgQEAKICAqLwogc3RhdGljIGludCBkbV9oYXNoX2luc2VydChjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp1dWlkLCBzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQpCiB7Ci0Jc3RydWN0IGhhc2hfY2VsbCAqY2VsbDsKKwlzdHJ1Y3QgaGFzaF9jZWxsICpjZWxsLCAqaGM7CiAKIAkvKgogCSAqIEFsbG9jYXRlIHRoZSBuZXcgY2VsbHMuCkBAIC0yMDQsMTQgKzIwOSwxOSBAQAogCSAqIEluc2VydCB0aGUgY2VsbCBpbnRvIGJvdGggaGFzaCB0YWJsZXMuCiAJICovCiAJZG93bl93cml0ZSgmX2hhc2hfbG9jayk7Ci0JaWYgKF9fZ2V0X25hbWVfY2VsbChuYW1lKSkKKwloYyA9IF9fZ2V0X25hbWVfY2VsbChuYW1lKTsKKwlpZiAoaGMpIHsKKwkJZG1fcHV0KGhjLT5tZCk7CiAJCWdvdG8gYmFkOworCX0KIAogCWxpc3RfYWRkKCZjZWxsLT5uYW1lX2xpc3QsIF9uYW1lX2J1Y2tldHMgKyBoYXNoX3N0cihuYW1lKSk7CiAKIAlpZiAodXVpZCkgewotCQlpZiAoX19nZXRfdXVpZF9jZWxsKHV1aWQpKSB7CisJCWhjID0gX19nZXRfdXVpZF9jZWxsKHV1aWQpOworCQlpZiAoaGMpIHsKIAkJCWxpc3RfZGVsKCZjZWxsLT5uYW1lX2xpc3QpOworCQkJZG1fcHV0KGhjLT5tZCk7CiAJCQlnb3RvIGJhZDsKIAkJfQogCQlsaXN0X2FkZCgmY2VsbC0+dXVpZF9saXN0LCBfdXVpZF9idWNrZXRzICsgaGFzaF9zdHIodXVpZCkpOwpAQCAtMjUxLDE5ICsyNjEsNDEgQEAKIAlmcmVlX2NlbGwoaGMpOwogfQogCi1zdGF0aWMgdm9pZCBkbV9oYXNoX3JlbW92ZV9hbGwodm9pZCkKK3N0YXRpYyB2b2lkIGRtX2hhc2hfcmVtb3ZlX2FsbChpbnQga2VlcF9vcGVuX2RldmljZXMpCiB7Ci0JaW50IGk7CisJaW50IGksIGRldl9za2lwcGVkLCBkZXZfcmVtb3ZlZDsKIAlzdHJ1Y3QgaGFzaF9jZWxsICpoYzsKIAlzdHJ1Y3QgbGlzdF9oZWFkICp0bXAsICpuOwogCiAJZG93bl93cml0ZSgmX2hhc2hfbG9jayk7CisKK3JldHJ5OgorCWRldl9za2lwcGVkID0gZGV2X3JlbW92ZWQgPSAwOwogCWZvciAoaSA9IDA7IGkgPCBOVU1fQlVDS0VUUzsgaSsrKSB7CiAJCWxpc3RfZm9yX2VhY2hfc2FmZSAodG1wLCBuLCBfbmFtZV9idWNrZXRzICsgaSkgewogCQkJaGMgPSBsaXN0X2VudHJ5KHRtcCwgc3RydWN0IGhhc2hfY2VsbCwgbmFtZV9saXN0KTsKKworCQkJaWYgKGtlZXBfb3Blbl9kZXZpY2VzICYmCisJCQkgICAgZG1fbG9ja19mb3JfZGVsZXRpb24oaGMtPm1kKSkgeworCQkJCWRldl9za2lwcGVkKys7CisJCQkJY29udGludWU7CisJCQl9CiAJCQlfX2hhc2hfcmVtb3ZlKGhjKTsKKwkJCWRldl9yZW1vdmVkID0gMTsKIAkJfQogCX0KKworCS8qCisJICogU29tZSBtYXBwZWQgZGV2aWNlcyBtYXkgYmUgdXNpbmcgb3RoZXIgbWFwcGVkIGRldmljZXMsIHNvIGlmIGFueQorCSAqIHN0aWxsIGV4aXN0LCByZXBlYXQgdW50aWwgd2UgbWFrZSBubyBmdXJ0aGVyIHByb2dyZXNzLgorCSAqLworCWlmIChkZXZfc2tpcHBlZCkgeworCQlpZiAoZGV2X3JlbW92ZWQpCisJCQlnb3RvIHJldHJ5OworCisJCURNV0FSTigicmVtb3ZlX2FsbCBsZWZ0ICVkIG9wZW4gZGV2aWNlKHMpIiwgZGV2X3NraXBwZWQpOworCX0KKwogCXVwX3dyaXRlKCZfaGFzaF9sb2NrKTsKIH0KIApAQCAtMjg5LDYgKzMyMSw3IEBACiAJaWYgKGhjKSB7CiAJCURNV0FSTigiYXNrZWQgdG8gcmVuYW1lIHRvIGFuIGFscmVhZHkgZXhpc3RpbmcgbmFtZSAlcyAtPiAlcyIsCiAJCSAgICAgICBvbGQsIG5ldyk7CisJCWRtX3B1dChoYy0+bWQpOwogCQl1cF93cml0ZSgmX2hhc2hfbG9jayk7CiAJCWtmcmVlKG5ld19uYW1lKTsKIAkJcmV0dXJuIC1FQlVTWTsKQEAgLTMyOCw2ICszNjEsNyBAQAogCQlkbV90YWJsZV9wdXQodGFibGUpOwogCX0KIAorCWRtX3B1dChoYy0+bWQpOwogCXVwX3dyaXRlKCZfaGFzaF9sb2NrKTsKIAlrZnJlZShvbGRfbmFtZSk7CiAJcmV0dXJuIDA7CkBAIC0zNDQsNyArMzc4LDcgQEAKIAogc3RhdGljIGludCByZW1vdmVfYWxsKHN0cnVjdCBkbV9pb2N0bCAqcGFyYW0sIHNpemVfdCBwYXJhbV9zaXplKQogewotCWRtX2hhc2hfcmVtb3ZlX2FsbCgpOworCWRtX2hhc2hfcmVtb3ZlX2FsbCgxKTsKIAlwYXJhbS0+ZGF0YV9zaXplID0gMDsKIAlyZXR1cm4gMDsKIH0KQEAgLTUyNCw3ICs1NTgsNiBAQAogewogCXN0cnVjdCBnZW5kaXNrICpkaXNrID0gZG1fZGlzayhtZCk7CiAJc3RydWN0IGRtX3RhYmxlICp0YWJsZTsKLQlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2OwogCiAJcGFyYW0tPmZsYWdzICY9IH4oRE1fU1VTUEVORF9GTEFHIHwgRE1fUkVBRE9OTFlfRkxBRyB8CiAJCQkgIERNX0FDVElWRV9QUkVTRU5UX0ZMQUcpOwpAQCAtNTM0LDIwICs1NjcsMTIgQEAKIAogCXBhcmFtLT5kZXYgPSBodWdlX2VuY29kZV9kZXYoTUtERVYoZGlzay0+bWFqb3IsIGRpc2stPmZpcnN0X21pbm9yKSk7CiAKLQlpZiAoIShwYXJhbS0+ZmxhZ3MgJiBETV9TS0lQX0JER0VUX0ZMQUcpKSB7Ci0JCWJkZXYgPSBiZGdldF9kaXNrKGRpc2ssIDApOwotCQlpZiAoIWJkZXYpCi0JCQlyZXR1cm4gLUVOWElPOwotCi0JCS8qCi0JCSAqIFllcywgdGhpcyB3aWxsIGJlIG91dCBvZiBkYXRlIGJ5IHRoZSB0aW1lIGl0IGdldHMgYmFjawotCQkgKiB0byB1c2VybGFuZCwgYnV0IGl0IGlzIHN0aWxsIHZlcnkgdXNlZnVsIGZvcgotCQkgKiBkZWJ1Z2dpbmcuCi0JCSAqLwotCQlwYXJhbS0+b3Blbl9jb3VudCA9IGJkZXYtPmJkX29wZW5lcnM7Ci0JCWJkcHV0KGJkZXYpOwotCX0gZWxzZQotCQlwYXJhbS0+b3Blbl9jb3VudCA9IC0xOworCS8qCisJICogWWVzLCB0aGlzIHdpbGwgYmUgb3V0IG9mIGRhdGUgYnkgdGhlIHRpbWUgaXQgZ2V0cyBiYWNrCisJICogdG8gdXNlcmxhbmQsIGJ1dCBpdCBpcyBzdGlsbCB2ZXJ5IHVzZWZ1bCBmb3IKKwkgKiBkZWJ1Z2dpbmcuCisJICovCisJcGFyYW0tPm9wZW5fY291bnQgPSBkbV9vcGVuX2NvdW50KG1kKTsKIAogCWlmIChkaXNrLT5wb2xpY3kpCiAJCXBhcmFtLT5mbGFncyB8PSBETV9SRUFET05MWV9GTEFHOwpAQCAtNTY3LDcgKzU5Miw3IEBACiAKIHN0YXRpYyBpbnQgZGV2X2NyZWF0ZShzdHJ1Y3QgZG1faW9jdGwgKnBhcmFtLCBzaXplX3QgcGFyYW1fc2l6ZSkKIHsKLQlpbnQgcjsKKwlpbnQgciwgbSA9IERNX0FOWV9NSU5PUjsKIAlzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQ7CiAKIAlyID0gY2hlY2tfbmFtZShwYXJhbS0+bmFtZSk7CkBAIC01NzUsMTAgKzYwMCw5IEBACiAJCXJldHVybiByOwogCiAJaWYgKHBhcmFtLT5mbGFncyAmIERNX1BFUlNJU1RFTlRfREVWX0ZMQUcpCi0JCXIgPSBkbV9jcmVhdGVfd2l0aF9taW5vcihNSU5PUihodWdlX2RlY29kZV9kZXYocGFyYW0tPmRldikpLCAmbWQpOwotCWVsc2UKLQkJciA9IGRtX2NyZWF0ZSgmbWQpOworCQltID0gTUlOT1IoaHVnZV9kZWNvZGVfZGV2KHBhcmFtLT5kZXYpKTsKIAorCXIgPSBkbV9jcmVhdGUobSwgJm1kKTsKIAlpZiAocikKIAkJcmV0dXJuIHI7CiAKQEAgLTYxMSwxMCArNjM1LDggQEAKIAkJcmV0dXJuIF9fZ2V0X25hbWVfY2VsbChwYXJhbS0+bmFtZSk7CiAKIAltZCA9IGRtX2dldF9tZChodWdlX2RlY29kZV9kZXYocGFyYW0tPmRldikpOwotCWlmIChtZCkgeworCWlmIChtZCkKIAkJbWRwdHIgPSBkbV9nZXRfbWRwdHIobWQpOwotCQlkbV9wdXQobWQpOwotCX0KIAogCXJldHVybiBtZHB0cjsKIH0KQEAgLTYyOCw3ICs2NTAsNiBAQAogCWhjID0gX19maW5kX2RldmljZV9oYXNoX2NlbGwocGFyYW0pOwogCWlmIChoYykgewogCQltZCA9IGhjLT5tZDsKLQkJZG1fZ2V0KG1kKTsKIAogCQkvKgogCQkgKiBTbmVha2lseSB3cml0ZSBpbiBib3RoIHRoZSBuYW1lIGFuZCB0aGUgdXVpZApAQCAtNjUzLDYgKzY3NCw4IEBACiBzdGF0aWMgaW50IGRldl9yZW1vdmUoc3RydWN0IGRtX2lvY3RsICpwYXJhbSwgc2l6ZV90IHBhcmFtX3NpemUpCiB7CiAJc3RydWN0IGhhc2hfY2VsbCAqaGM7CisJc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kOworCWludCByOwogCiAJZG93bl93cml0ZSgmX2hhc2hfbG9jayk7CiAJaGMgPSBfX2ZpbmRfZGV2aWNlX2hhc2hfY2VsbChwYXJhbSk7CkBAIC02NjMsOCArNjg2LDIyIEBACiAJCXJldHVybiAtRU5YSU87CiAJfQogCisJbWQgPSBoYy0+bWQ7CisKKwkvKgorCSAqIEVuc3VyZSB0aGUgZGV2aWNlIGlzIG5vdCBvcGVuIGFuZCBub3RoaW5nIGZ1cnRoZXIgY2FuIG9wZW4gaXQuCisJICovCisJciA9IGRtX2xvY2tfZm9yX2RlbGV0aW9uKG1kKTsKKwlpZiAocikgeworCQlETVdBUk4oInVuYWJsZSB0byByZW1vdmUgb3BlbiBkZXZpY2UgJXMiLCBoYy0+bmFtZSk7CisJCXVwX3dyaXRlKCZfaGFzaF9sb2NrKTsKKwkJZG1fcHV0KG1kKTsKKwkJcmV0dXJuIHI7CisJfQorCiAJX19oYXNoX3JlbW92ZShoYyk7CiAJdXBfd3JpdGUoJl9oYXNoX2xvY2spOworCWRtX3B1dChtZCk7CiAJcGFyYW0tPmRhdGFfc2l6ZSA9IDA7CiAJcmV0dXJuIDA7CiB9CkBAIC03OTAsNyArODI3LDYgQEAKIAl9CiAKIAltZCA9IGhjLT5tZDsKLQlkbV9nZXQobWQpOwogCiAJbmV3X21hcCA9IGhjLT5uZXdfbWFwOwogCWhjLT5uZXdfbWFwID0gTlVMTDsKQEAgLTEwNzgsNiArMTExNCw3IEBACiB7CiAJaW50IHI7CiAJc3RydWN0IGhhc2hfY2VsbCAqaGM7CisJc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kOwogCiAJZG93bl93cml0ZSgmX2hhc2hfbG9jayk7CiAKQEAgLTEwOTYsNyArMTEzMyw5IEBACiAJcGFyYW0tPmZsYWdzICY9IH5ETV9JTkFDVElWRV9QUkVTRU5UX0ZMQUc7CiAKIAlyID0gX19kZXZfc3RhdHVzKGhjLT5tZCwgcGFyYW0pOworCW1kID0gaGMtPm1kOwogCXVwX3dyaXRlKCZfaGFzaF9sb2NrKTsKKwlkbV9wdXQobWQpOwogCXJldHVybiByOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLWxpbmVhci5jIGIvZHJpdmVycy9tZC9kbS1saW5lYXIuYwppbmRleCBkYWY1ODZjLi40N2IzYzYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLWxpbmVhci5jCisrKyBiL2RyaXZlcnMvbWQvZG0tbGluZWFyLmMKQEAgLTEyLDYgKzEyLDggQEAKICNpbmNsdWRlIDxsaW51eC9iaW8uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKKyNkZWZpbmUgRE1fTVNHX1BSRUZJWCAibGluZWFyIgorCiAvKgogICogTGluZWFyOiBtYXBzIGEgbGluZWFyIHJhbmdlIG9mIGEgZGV2aWNlLgogICovCkBAIC0yOSw3ICszMSw3IEBACiAJdW5zaWduZWQgbG9uZyBsb25nIHRtcDsKIAogCWlmIChhcmdjICE9IDIpIHsKLQkJdGktPmVycm9yID0gImRtLWxpbmVhcjogSW52YWxpZCBhcmd1bWVudCBjb3VudCI7CisJCXRpLT5lcnJvciA9ICJJbnZhbGlkIGFyZ3VtZW50IGNvdW50IjsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0xMTEsNyArMTEzLDcgQEAKIAlpbnQgciA9IGRtX3JlZ2lzdGVyX3RhcmdldCgmbGluZWFyX3RhcmdldCk7CiAKIAlpZiAociA8IDApCi0JCURNRVJSKCJsaW5lYXI6IHJlZ2lzdGVyIGZhaWxlZCAlZCIsIHIpOworCQlETUVSUigicmVnaXN0ZXIgZmFpbGVkICVkIiwgcik7CiAKIAlyZXR1cm4gcjsKIH0KQEAgLTEyMSw1ICsxMjMsNSBAQAogCWludCByID0gZG1fdW5yZWdpc3Rlcl90YXJnZXQoJmxpbmVhcl90YXJnZXQpOwogCiAJaWYgKHIgPCAwKQotCQlETUVSUigibGluZWFyOiB1bnJlZ2lzdGVyIGZhaWxlZCAlZCIsIHIpOworCQlETUVSUigidW5yZWdpc3RlciBmYWlsZWQgJWQiLCByKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tbG9nLmMgYi9kcml2ZXJzL21kL2RtLWxvZy5jCmluZGV4IGQ3Mzc3OWEuLjY0Yjc2NGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0tbG9nLmMKKysrIGIvZHJpdmVycy9tZC9kbS1sb2cuYwpAQCAtMTIsNiArMTIsOCBAQAogI2luY2x1ZGUgImRtLWxvZy5oIgogI2luY2x1ZGUgImRtLWlvLmgiCiAKKyNkZWZpbmUgRE1fTVNHX1BSRUZJWCAibWlycm9yIGxvZyIKKwogc3RhdGljIExJU1RfSEVBRChfbG9nX3R5cGVzKTsKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soX2xvY2spOwogCkBAIC0xNTUsOCArMTU3LDYgQEAKIAogCXN0cnVjdCBpb19yZWdpb24gaGVhZGVyX2xvY2F0aW9uOwogCXN0cnVjdCBsb2dfaGVhZGVyICpkaXNrX2hlYWRlcjsKLQotCXN0cnVjdCBpb19yZWdpb24gYml0c19sb2NhdGlvbjsKIH07CiAKIC8qCkBAIC0yNDEsNDMgKzI0MSwyMSBAQAogfQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIEJpdHMgSU8KLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIGludCByZWFkX2JpdHMoc3RydWN0IGxvZ19jICpsb2cpCi17Ci0JaW50IHI7Ci0JdW5zaWduZWQgbG9uZyBlYml0czsKLQotCXIgPSBkbV9pb19zeW5jX3ZtKDEsICZsb2ctPmJpdHNfbG9jYXRpb24sIFJFQUQsCi0JCQkgIGxvZy0+Y2xlYW5fYml0cywgJmViaXRzKTsKLQlpZiAocikKLQkJcmV0dXJuIHI7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB3cml0ZV9iaXRzKHN0cnVjdCBsb2dfYyAqbG9nKQotewotCXVuc2lnbmVkIGxvbmcgZWJpdHM7Ci0JcmV0dXJuIGRtX2lvX3N5bmNfdm0oMSwgJmxvZy0+Yml0c19sb2NhdGlvbiwgV1JJVEUsCi0JCQkgICAgIGxvZy0+Y2xlYW5fYml0cywgJmViaXRzKTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBjb3JlIGxvZyBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9yCiAgKgogICogYXJndiBjb250YWlucyByZWdpb25fc2l6ZSBmb2xsb3dlZCBvcHRpb25hbGx5IGJ5IFtub11zeW5jCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICNkZWZpbmUgQllURV9TSElGVCAzCi1zdGF0aWMgaW50IGNvcmVfY3RyKHN0cnVjdCBkaXJ0eV9sb2cgKmxvZywgc3RydWN0IGRtX3RhcmdldCAqdGksCi0JCSAgICB1bnNpZ25lZCBpbnQgYXJnYywgY2hhciAqKmFyZ3YpCitzdGF0aWMgaW50IGNyZWF0ZV9sb2dfY29udGV4dChzdHJ1Y3QgZGlydHlfbG9nICpsb2csIHN0cnVjdCBkbV90YXJnZXQgKnRpLAorCQkJICAgICAgdW5zaWduZWQgaW50IGFyZ2MsIGNoYXIgKiphcmd2LAorCQkJICAgICAgc3RydWN0IGRtX2RldiAqZGV2KQogewogCWVudW0gc3luYyBzeW5jID0gREVGQVVMVFNZTkM7CiAKIAlzdHJ1Y3QgbG9nX2MgKmxjOwogCXVpbnQzMl90IHJlZ2lvbl9zaXplOwogCXVuc2lnbmVkIGludCByZWdpb25fY291bnQ7Ci0Jc2l6ZV90IGJpdHNldF9zaXplOworCXNpemVfdCBiaXRzZXRfc2l6ZSwgYnVmX3NpemU7CiAKIAlpZiAoYXJnYyA8IDEgfHwgYXJnYyA+IDIpIHsKIAkJRE1XQVJOKCJ3cm9uZyBudW1iZXIgb2YgYXJndW1lbnRzIHRvIG1pcnJvciBsb2ciKTsKQEAgLTMxOSwyMiArMjk3LDUzIEBACiAJICogV29yayBvdXQgaG93IG1hbnkgInVuc2lnbmVkIGxvbmcicyB3ZSBuZWVkIHRvIGhvbGQgdGhlIGJpdHNldC4KIAkgKi8KIAliaXRzZXRfc2l6ZSA9IGRtX3JvdW5kX3VwKHJlZ2lvbl9jb3VudCwKLQkJCQkgIHNpemVvZih1bnNpZ25lZCBsb25nKSA8PCBCWVRFX1NISUZUKTsKKwkJCQkgIHNpemVvZigqbGMtPmNsZWFuX2JpdHMpIDw8IEJZVEVfU0hJRlQpOwogCWJpdHNldF9zaXplID4+PSBCWVRFX1NISUZUOwogCi0JbGMtPmJpdHNldF91aW50MzJfY291bnQgPSBiaXRzZXRfc2l6ZSAvIDQ7Ci0JbGMtPmNsZWFuX2JpdHMgPSB2bWFsbG9jKGJpdHNldF9zaXplKTsKLQlpZiAoIWxjLT5jbGVhbl9iaXRzKSB7Ci0JCURNV0FSTigiY291bGRuJ3QgYWxsb2NhdGUgY2xlYW4gYml0c2V0Iik7Ci0JCWtmcmVlKGxjKTsKLQkJcmV0dXJuIC1FTk9NRU07CisJbGMtPmJpdHNldF91aW50MzJfY291bnQgPSBiaXRzZXRfc2l6ZSAvIHNpemVvZigqbGMtPmNsZWFuX2JpdHMpOworCisJLyoKKwkgKiBEaXNrIGxvZz8KKwkgKi8KKwlpZiAoIWRldikgeworCQlsYy0+Y2xlYW5fYml0cyA9IHZtYWxsb2MoYml0c2V0X3NpemUpOworCQlpZiAoIWxjLT5jbGVhbl9iaXRzKSB7CisJCQlETVdBUk4oImNvdWxkbid0IGFsbG9jYXRlIGNsZWFuIGJpdHNldCIpOworCQkJa2ZyZWUobGMpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJbGMtPmRpc2tfaGVhZGVyID0gTlVMTDsKKwl9IGVsc2UgeworCQlsYy0+bG9nX2RldiA9IGRldjsKKwkJbGMtPmhlYWRlcl9sb2NhdGlvbi5iZGV2ID0gbGMtPmxvZ19kZXYtPmJkZXY7CisJCWxjLT5oZWFkZXJfbG9jYXRpb24uc2VjdG9yID0gMDsKKworCQkvKgorCQkgKiBCdWZmZXIgaG9sZHMgYm90aCBoZWFkZXIgYW5kIGJpdHNldC4KKwkJICovCisJCWJ1Zl9zaXplID0gZG1fcm91bmRfdXAoKExPR19PRkZTRVQgPDwgU0VDVE9SX1NISUZUKSArCisJCQkJICAgICAgIGJpdHNldF9zaXplLCB0aS0+bGltaXRzLmhhcmRzZWN0X3NpemUpOworCQlsYy0+aGVhZGVyX2xvY2F0aW9uLmNvdW50ID0gYnVmX3NpemUgPj4gU0VDVE9SX1NISUZUOworCisJCWxjLT5kaXNrX2hlYWRlciA9IHZtYWxsb2MoYnVmX3NpemUpOworCQlpZiAoIWxjLT5kaXNrX2hlYWRlcikgeworCQkJRE1XQVJOKCJjb3VsZG4ndCBhbGxvY2F0ZSBkaXNrIGxvZyBidWZmZXIiKTsKKwkJCWtmcmVlKGxjKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisKKwkJbGMtPmNsZWFuX2JpdHMgPSAodm9pZCAqKWxjLT5kaXNrX2hlYWRlciArCisJCQkJIChMT0dfT0ZGU0VUIDw8IFNFQ1RPUl9TSElGVCk7CiAJfQorCiAJbWVtc2V0KGxjLT5jbGVhbl9iaXRzLCAtMSwgYml0c2V0X3NpemUpOwogCiAJbGMtPnN5bmNfYml0cyA9IHZtYWxsb2MoYml0c2V0X3NpemUpOwogCWlmICghbGMtPnN5bmNfYml0cykgewogCQlETVdBUk4oImNvdWxkbid0IGFsbG9jYXRlIHN5bmMgYml0c2V0Iik7Ci0JCXZmcmVlKGxjLT5jbGVhbl9iaXRzKTsKKwkJaWYgKCFkZXYpCisJCQl2ZnJlZShsYy0+Y2xlYW5fYml0cyk7CisJCXZmcmVlKGxjLT5kaXNrX2hlYWRlcik7CiAJCWtmcmVlKGxjKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtMzQ1LDIzICszNTQsMzggQEAKIAlpZiAoIWxjLT5yZWNvdmVyaW5nX2JpdHMpIHsKIAkJRE1XQVJOKCJjb3VsZG4ndCBhbGxvY2F0ZSBzeW5jIGJpdHNldCIpOwogCQl2ZnJlZShsYy0+c3luY19iaXRzKTsKLQkJdmZyZWUobGMtPmNsZWFuX2JpdHMpOworCQlpZiAoIWRldikKKwkJCXZmcmVlKGxjLT5jbGVhbl9iaXRzKTsKKwkJdmZyZWUobGMtPmRpc2tfaGVhZGVyKTsKIAkJa2ZyZWUobGMpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJbWVtc2V0KGxjLT5yZWNvdmVyaW5nX2JpdHMsIDAsIGJpdHNldF9zaXplKTsKIAlsYy0+c3luY19zZWFyY2ggPSAwOwogCWxvZy0+Y29udGV4dCA9IGxjOworCiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgY29yZV9jdHIoc3RydWN0IGRpcnR5X2xvZyAqbG9nLCBzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSwKKwkJICAgIHVuc2lnbmVkIGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlyZXR1cm4gY3JlYXRlX2xvZ19jb250ZXh0KGxvZywgdGksIGFyZ2MsIGFyZ3YsIE5VTEwpOworfQorCitzdGF0aWMgdm9pZCBkZXN0cm95X2xvZ19jb250ZXh0KHN0cnVjdCBsb2dfYyAqbGMpCit7CisJdmZyZWUobGMtPnN5bmNfYml0cyk7CisJdmZyZWUobGMtPnJlY292ZXJpbmdfYml0cyk7CisJa2ZyZWUobGMpOworfQorCiBzdGF0aWMgdm9pZCBjb3JlX2R0cihzdHJ1Y3QgZGlydHlfbG9nICpsb2cpCiB7CiAJc3RydWN0IGxvZ19jICpsYyA9IChzdHJ1Y3QgbG9nX2MgKikgbG9nLT5jb250ZXh0OworCiAJdmZyZWUobGMtPmNsZWFuX2JpdHMpOwotCXZmcmVlKGxjLT5zeW5jX2JpdHMpOwotCXZmcmVlKGxjLT5yZWNvdmVyaW5nX2JpdHMpOwotCWtmcmVlKGxjKTsKKwlkZXN0cm95X2xvZ19jb250ZXh0KGxjKTsKIH0KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0zNzMsOCArMzk3LDYgQEAKIAkJICAgIHVuc2lnbmVkIGludCBhcmdjLCBjaGFyICoqYXJndikKIHsKIAlpbnQgcjsKLQlzaXplX3Qgc2l6ZTsKLQlzdHJ1Y3QgbG9nX2MgKmxjOwogCXN0cnVjdCBkbV9kZXYgKmRldjsKIAogCWlmIChhcmdjIDwgMiB8fCBhcmdjID4gMykgewpAQCAtMzg3LDQ5ICs0MDksMjIgQEAKIAlpZiAocikKIAkJcmV0dXJuIHI7CiAKLQlyID0gY29yZV9jdHIobG9nLCB0aSwgYXJnYyAtIDEsIGFyZ3YgKyAxKTsKKwlyID0gY3JlYXRlX2xvZ19jb250ZXh0KGxvZywgdGksIGFyZ2MgLSAxLCBhcmd2ICsgMSwgZGV2KTsKIAlpZiAocikgewogCQlkbV9wdXRfZGV2aWNlKHRpLCBkZXYpOwogCQlyZXR1cm4gcjsKIAl9CiAKLQlsYyA9IChzdHJ1Y3QgbG9nX2MgKikgbG9nLT5jb250ZXh0OwotCWxjLT5sb2dfZGV2ID0gZGV2OwotCi0JLyogc2V0dXAgdGhlIGRpc2sgaGVhZGVyIGZpZWxkcyAqLwotCWxjLT5oZWFkZXJfbG9jYXRpb24uYmRldiA9IGxjLT5sb2dfZGV2LT5iZGV2OwotCWxjLT5oZWFkZXJfbG9jYXRpb24uc2VjdG9yID0gMDsKLQlsYy0+aGVhZGVyX2xvY2F0aW9uLmNvdW50ID0gMTsKLQotCS8qCi0JICogV2UgY2FuJ3QgcmVhZCBsZXNzIHRoYW4gdGhpcyBhbW91bnQsIGV2ZW4gdGhvdWdoIHdlJ2xsCi0JICogbm90IGJlIHVzaW5nIG1vc3Qgb2YgdGhpcyBzcGFjZS4KLQkgKi8KLQlsYy0+ZGlza19oZWFkZXIgPSB2bWFsbG9jKDEgPDwgU0VDVE9SX1NISUZUKTsKLQlpZiAoIWxjLT5kaXNrX2hlYWRlcikKLQkJZ290byBiYWQ7Ci0KLQkvKiBzZXR1cCB0aGUgZGlzayBiaXRzZXQgZmllbGRzICovCi0JbGMtPmJpdHNfbG9jYXRpb24uYmRldiA9IGxjLT5sb2dfZGV2LT5iZGV2OwotCWxjLT5iaXRzX2xvY2F0aW9uLnNlY3RvciA9IExPR19PRkZTRVQ7Ci0KLQlzaXplID0gZG1fcm91bmRfdXAobGMtPmJpdHNldF91aW50MzJfY291bnQgKiBzaXplb2YodWludDMyX3QpLAotCQkJICAgMSA8PCBTRUNUT1JfU0hJRlQpOwotCWxjLT5iaXRzX2xvY2F0aW9uLmNvdW50ID0gc2l6ZSA+PiBTRUNUT1JfU0hJRlQ7CiAJcmV0dXJuIDA7Ci0KLSBiYWQ6Ci0JZG1fcHV0X2RldmljZSh0aSwgbGMtPmxvZ19kZXYpOwotCWNvcmVfZHRyKGxvZyk7Ci0JcmV0dXJuIC1FTk9NRU07CiB9CiAKIHN0YXRpYyB2b2lkIGRpc2tfZHRyKHN0cnVjdCBkaXJ0eV9sb2cgKmxvZykKIHsKIAlzdHJ1Y3QgbG9nX2MgKmxjID0gKHN0cnVjdCBsb2dfYyAqKSBsb2ctPmNvbnRleHQ7CisKIAlkbV9wdXRfZGV2aWNlKGxjLT50aSwgbGMtPmxvZ19kZXYpOwogCXZmcmVlKGxjLT5kaXNrX2hlYWRlcik7Ci0JY29yZV9kdHIobG9nKTsKKwlkZXN0cm95X2xvZ19jb250ZXh0KGxjKTsKIH0KIAogc3RhdGljIGludCBjb3VudF9iaXRzMzIodWludDMyX3QgKmFkZHIsIHVuc2lnbmVkIHNpemUpCkBAIC00NTQsMTIgKzQ0OSw3IEBACiAJaWYgKHIpCiAJCXJldHVybiByOwogCi0JLyogcmVhZCB0aGUgYml0cyAqLwotCXIgPSByZWFkX2JpdHMobGMpOwotCWlmIChyKQotCQlyZXR1cm4gcjsKLQotCS8qIHNldCBvciBjbGVhciBhbnkgbmV3IGJpdHMgKi8KKwkvKiBzZXQgb3IgY2xlYXIgYW55IG5ldyBiaXRzIC0tIGRldmljZSBoYXMgZ3Jvd24gKi8KIAlpZiAobGMtPnN5bmMgPT0gTk9TWU5DKQogCQlmb3IgKGkgPSBsYy0+aGVhZGVyLm5yX3JlZ2lvbnM7IGkgPCBsYy0+cmVnaW9uX2NvdW50OyBpKyspCiAJCQkvKiBGSVhNRTogYW1hemluZ2x5IGluZWZmaWNpZW50ICovCkBAIC00NjksMTUgKzQ1OSwxNCBAQAogCQkJLyogRklYTUU6IGFtYXppbmdseSBpbmVmZmljaWVudCAqLwogCQkJbG9nX2NsZWFyX2JpdChsYywgbGMtPmNsZWFuX2JpdHMsIGkpOwogCisJLyogY2xlYXIgYW55IG9sZCBiaXRzIC0tIGRldmljZSBoYXMgc2hydW5rICovCisJZm9yIChpID0gbGMtPnJlZ2lvbl9jb3VudDsgaSAlIChzaXplb2YoKmxjLT5jbGVhbl9iaXRzKSA8PCBCWVRFX1NISUZUKTsgaSsrKQorCQlsb2dfY2xlYXJfYml0KGxjLCBsYy0+Y2xlYW5fYml0cywgaSk7CisKIAkvKiBjb3B5IGNsZWFuIGFjcm9zcyB0byBzeW5jICovCiAJbWVtY3B5KGxjLT5zeW5jX2JpdHMsIGxjLT5jbGVhbl9iaXRzLCBzaXplKTsKIAlsYy0+c3luY19jb3VudCA9IGNvdW50X2JpdHMzMihsYy0+Y2xlYW5fYml0cywgbGMtPmJpdHNldF91aW50MzJfY291bnQpOwogCi0JLyogd3JpdGUgdGhlIGJpdHMgKi8KLQlyID0gd3JpdGVfYml0cyhsYyk7Ci0JaWYgKHIpCi0JCXJldHVybiByOwotCiAJLyogc2V0IHRoZSBjb3JyZWN0IG51bWJlciBvZiByZWdpb25zIGluIHRoZSBoZWFkZXIgKi8KIAlsYy0+aGVhZGVyLm5yX3JlZ2lvbnMgPSBsYy0+cmVnaW9uX2NvdW50OwogCkBAIC01MTgsNyArNTA3LDcgQEAKIAlpZiAoIWxjLT50b3VjaGVkKQogCQlyZXR1cm4gMDsKIAotCXIgPSB3cml0ZV9iaXRzKGxjKTsKKwlyID0gd3JpdGVfaGVhZGVyKGxjKTsKIAlpZiAoIXIpCiAJCWxjLT50b3VjaGVkID0gMDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1tcGF0aC5jIGIvZHJpdmVycy9tZC9kbS1tcGF0aC5jCmluZGV4IDE4MTZmMzAuLjIxNzYxNWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0tbXBhdGguYworKysgYi9kcml2ZXJzL21kL2RtLW1wYXRoLmMKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAKKyNkZWZpbmUgRE1fTVNHX1BSRUZJWCAibXVsdGlwYXRoIgogI2RlZmluZSBNRVNHX1NUUih4KSB4LCBzaXplb2YoeCkKIAogLyogUGF0aCBwcm9wZXJ0aWVzICovCkBAIC00NDYsOCArNDQ3LDYgQEAKIAljaGFyICplcnJvcjsKIH07CiAKLSNkZWZpbmUgRVNUUihzKSAoImRtLW11bHRpcGF0aDogIiBzKQotCiBzdGF0aWMgaW50IHJlYWRfcGFyYW0oc3RydWN0IHBhcmFtICpwYXJhbSwgY2hhciAqc3RyLCB1bnNpZ25lZCAqdiwgY2hhciAqKmVycm9yKQogewogCWlmICghc3RyIHx8CkBAIC00OTUsMTIgKzQ5NCwxMiBAQAogCXVuc2lnbmVkIHBzX2FyZ2M7CiAKIAlzdGF0aWMgc3RydWN0IHBhcmFtIF9wYXJhbXNbXSA9IHsKLQkJezAsIDEwMjQsIEVTVFIoImludmFsaWQgbnVtYmVyIG9mIHBhdGggc2VsZWN0b3IgYXJncyIpfSwKKwkJezAsIDEwMjQsICJpbnZhbGlkIG51bWJlciBvZiBwYXRoIHNlbGVjdG9yIGFyZ3MifSwKIAl9OwogCiAJcHN0ID0gZG1fZ2V0X3BhdGhfc2VsZWN0b3Ioc2hpZnQoYXMpKTsKIAlpZiAoIXBzdCkgewotCQl0aS0+ZXJyb3IgPSBFU1RSKCJ1bmtub3duIHBhdGggc2VsZWN0b3IgdHlwZSIpOworCQl0aS0+ZXJyb3IgPSAidW5rbm93biBwYXRoIHNlbGVjdG9yIHR5cGUiOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTUxMSw3ICs1MTAsNyBAQAogCXIgPSBwc3QtPmNyZWF0ZSgmcGctPnBzLCBwc19hcmdjLCBhcy0+YXJndik7CiAJaWYgKHIpIHsKIAkJZG1fcHV0X3BhdGhfc2VsZWN0b3IocHN0KTsKLQkJdGktPmVycm9yID0gRVNUUigicGF0aCBzZWxlY3RvciBjb25zdHJ1Y3RvciBmYWlsZWQiKTsKKwkJdGktPmVycm9yID0gInBhdGggc2VsZWN0b3IgY29uc3RydWN0b3IgZmFpbGVkIjsKIAkJcmV0dXJuIHI7CiAJfQogCkBAIC01MjksNyArNTI4LDcgQEAKIAogCS8qIHdlIG5lZWQgYXQgbGVhc3QgYSBwYXRoIGFyZyAqLwogCWlmIChhcy0+YXJnYyA8IDEpIHsKLQkJdGktPmVycm9yID0gRVNUUigibm8gZGV2aWNlIGdpdmVuIik7CisJCXRpLT5lcnJvciA9ICJubyBkZXZpY2UgZ2l2ZW4iOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKQEAgLTU0MCw3ICs1MzksNyBAQAogCXIgPSBkbV9nZXRfZGV2aWNlKHRpLCBzaGlmdChhcyksIHRpLT5iZWdpbiwgdGktPmxlbiwKIAkJCSAgZG1fdGFibGVfZ2V0X21vZGUodGktPnRhYmxlKSwgJnAtPnBhdGguZGV2KTsKIAlpZiAocikgewotCQl0aS0+ZXJyb3IgPSBFU1RSKCJlcnJvciBnZXR0aW5nIGRldmljZSIpOworCQl0aS0+ZXJyb3IgPSAiZXJyb3IgZ2V0dGluZyBkZXZpY2UiOwogCQlnb3RvIGJhZDsKIAl9CiAKQEAgLTU2Miw4ICs1NjEsOCBAQAogCQkJCQkJICAgc3RydWN0IGRtX3RhcmdldCAqdGkpCiB7CiAJc3RhdGljIHN0cnVjdCBwYXJhbSBfcGFyYW1zW10gPSB7Ci0JCXsxLCAxMDI0LCBFU1RSKCJpbnZhbGlkIG51bWJlciBvZiBwYXRocyIpfSwKLQkJezAsIDEwMjQsIEVTVFIoImludmFsaWQgbnVtYmVyIG9mIHNlbGVjdG9yIGFyZ3MiKX0KKwkJezEsIDEwMjQsICJpbnZhbGlkIG51bWJlciBvZiBwYXRocyJ9LAorCQl7MCwgMTAyNCwgImludmFsaWQgbnVtYmVyIG9mIHNlbGVjdG9yIGFyZ3MifQogCX07CiAKIAlpbnQgcjsKQEAgLTU3MiwxMyArNTcxLDEzIEBACiAKIAlpZiAoYXMtPmFyZ2MgPCAyKSB7CiAJCWFzLT5hcmdjID0gMDsKLQkJdGktPmVycm9yID0gRVNUUigibm90IGVub3VnaCBwcmlvcml0eSBncm91cCBhcnVtZW50cyIpOworCQl0aS0+ZXJyb3IgPSAibm90IGVub3VnaCBwcmlvcml0eSBncm91cCBhcnVtZW50cyI7CiAJCXJldHVybiBOVUxMOwogCX0KIAogCXBnID0gYWxsb2NfcHJpb3JpdHlfZ3JvdXAoKTsKIAlpZiAoIXBnKSB7Ci0JCXRpLT5lcnJvciA9IEVTVFIoImNvdWxkbid0IGFsbG9jYXRlIHByaW9yaXR5IGdyb3VwIik7CisJCXRpLT5lcnJvciA9ICJjb3VsZG4ndCBhbGxvY2F0ZSBwcmlvcml0eSBncm91cCI7CiAJCXJldHVybiBOVUxMOwogCX0KIAlwZy0+bSA9IG07CkBAIC02MzMsNyArNjMyLDcgQEAKIAl1bnNpZ25lZCBod19hcmdjOwogCiAJc3RhdGljIHN0cnVjdCBwYXJhbSBfcGFyYW1zW10gPSB7Ci0JCXswLCAxMDI0LCBFU1RSKCJpbnZhbGlkIG51bWJlciBvZiBoYXJkd2FyZSBoYW5kbGVyIGFyZ3MiKX0sCisJCXswLCAxMDI0LCAiaW52YWxpZCBudW1iZXIgb2YgaGFyZHdhcmUgaGFuZGxlciBhcmdzIn0sCiAJfTsKIAogCXIgPSByZWFkX3BhcmFtKF9wYXJhbXMsIHNoaWZ0KGFzKSwgJmh3X2FyZ2MsICZ0aS0+ZXJyb3IpOwpAQCAtNjQ1LDE0ICs2NDQsMTQgQEAKIAogCWh3aHQgPSBkbV9nZXRfaHdfaGFuZGxlcihzaGlmdChhcykpOwogCWlmICghaHdodCkgewotCQl0aS0+ZXJyb3IgPSBFU1RSKCJ1bmtub3duIGhhcmR3YXJlIGhhbmRsZXIgdHlwZSIpOworCQl0aS0+ZXJyb3IgPSAidW5rbm93biBoYXJkd2FyZSBoYW5kbGVyIHR5cGUiOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlyID0gaHdodC0+Y3JlYXRlKCZtLT5od19oYW5kbGVyLCBod19hcmdjIC0gMSwgYXMtPmFyZ3YpOwogCWlmIChyKSB7CiAJCWRtX3B1dF9od19oYW5kbGVyKGh3aHQpOwotCQl0aS0+ZXJyb3IgPSBFU1RSKCJoYXJkd2FyZSBoYW5kbGVyIGNvbnN0cnVjdG9yIGZhaWxlZCIpOworCQl0aS0+ZXJyb3IgPSAiaGFyZHdhcmUgaGFuZGxlciBjb25zdHJ1Y3RvciBmYWlsZWQiOwogCQlyZXR1cm4gcjsKIAl9CiAKQEAgLTY2OSw3ICs2NjgsNyBAQAogCXVuc2lnbmVkIGFyZ2M7CiAKIAlzdGF0aWMgc3RydWN0IHBhcmFtIF9wYXJhbXNbXSA9IHsKLQkJezAsIDEsIEVTVFIoImludmFsaWQgbnVtYmVyIG9mIGZlYXR1cmUgYXJncyIpfSwKKwkJezAsIDEsICJpbnZhbGlkIG51bWJlciBvZiBmZWF0dXJlIGFyZ3MifSwKIAl9OwogCiAJciA9IHJlYWRfcGFyYW0oX3BhcmFtcywgc2hpZnQoYXMpLCAmYXJnYywgJnRpLT5lcnJvcik7CkBAIC02OTIsOCArNjkxLDggQEAKIHsKIAkvKiB0YXJnZXQgcGFyYW1ldGVycyAqLwogCXN0YXRpYyBzdHJ1Y3QgcGFyYW0gX3BhcmFtc1tdID0gewotCQl7MSwgMTAyNCwgRVNUUigiaW52YWxpZCBudW1iZXIgb2YgcHJpb3JpdHkgZ3JvdXBzIil9LAotCQl7MSwgMTAyNCwgRVNUUigiaW52YWxpZCBpbml0aWFsIHByaW9yaXR5IGdyb3VwIG51bWJlciIpfSwKKwkJezEsIDEwMjQsICJpbnZhbGlkIG51bWJlciBvZiBwcmlvcml0eSBncm91cHMifSwKKwkJezEsIDEwMjQsICJpbnZhbGlkIGluaXRpYWwgcHJpb3JpdHkgZ3JvdXAgbnVtYmVyIn0sCiAJfTsKIAogCWludCByOwpAQCAtNzA3LDcgKzcwNiw3IEBACiAKIAltID0gYWxsb2NfbXVsdGlwYXRoKCk7CiAJaWYgKCFtKSB7Ci0JCXRpLT5lcnJvciA9IEVTVFIoImNhbid0IGFsbG9jYXRlIG11bHRpcGF0aCIpOworCQl0aS0+ZXJyb3IgPSAiY2FuJ3QgYWxsb2NhdGUgbXVsdGlwYXRoIjsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC03NDYsNyArNzQ1LDcgQEAKIAl9CiAKIAlpZiAocGdfY291bnQgIT0gbS0+bnJfcHJpb3JpdHlfZ3JvdXBzKSB7Ci0JCXRpLT5lcnJvciA9IEVTVFIoInByaW9yaXR5IGdyb3VwIGNvdW50IG1pc21hdGNoIik7CisJCXRpLT5lcnJvciA9ICJwcmlvcml0eSBncm91cCBjb3VudCBtaXNtYXRjaCI7CiAJCXIgPSAtRUlOVkFMOwogCQlnb3RvIGJhZDsKIAl9CkBAIC04MDcsNyArODA2LDcgQEAKIAlpZiAoIXBncGF0aC0+cGF0aC5pc19hY3RpdmUpCiAJCWdvdG8gb3V0OwogCi0JRE1XQVJOKCJkbS1tdWx0aXBhdGg6IEZhaWxpbmcgcGF0aCAlcy4iLCBwZ3BhdGgtPnBhdGguZGV2LT5uYW1lKTsKKwlETVdBUk4oIkZhaWxpbmcgcGF0aCAlcy4iLCBwZ3BhdGgtPnBhdGguZGV2LT5uYW1lKTsKIAogCXBncGF0aC0+cGctPnBzLnR5cGUtPmZhaWxfcGF0aCgmcGdwYXRoLT5wZy0+cHMsICZwZ3BhdGgtPnBhdGgpOwogCXBncGF0aC0+cGF0aC5pc19hY3RpdmUgPSAwOwpAQCAtMTI1MCw3ICsxMjQ5LDcgQEAKIAlyID0gZG1fZ2V0X2RldmljZSh0aSwgYXJndlsxXSwgdGktPmJlZ2luLCB0aS0+bGVuLAogCQkJICBkbV90YWJsZV9nZXRfbW9kZSh0aS0+dGFibGUpLCAmZGV2KTsKIAlpZiAocikgewotCQlETVdBUk4oImRtLW11bHRpcGF0aCBtZXNzYWdlOiBlcnJvciBnZXR0aW5nIGRldmljZSAlcyIsCisJCURNV0FSTigibWVzc2FnZTogZXJyb3IgZ2V0dGluZyBkZXZpY2UgJXMiLAogCQkgICAgICAgYXJndlsxXSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTEzMDksNyArMTMwOCw3IEBACiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAotCURNSU5GTygiZG0tbXVsdGlwYXRoIHZlcnNpb24gJXUuJXUuJXUgbG9hZGVkIiwKKwlETUlORk8oInZlcnNpb24gJXUuJXUuJXUgbG9hZGVkIiwKIAkgICAgICAgbXVsdGlwYXRoX3RhcmdldC52ZXJzaW9uWzBdLCBtdWx0aXBhdGhfdGFyZ2V0LnZlcnNpb25bMV0sCiAJICAgICAgIG11bHRpcGF0aF90YXJnZXQudmVyc2lvblsyXSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tcmFpZDEuYyBiL2RyaXZlcnMvbWQvZG0tcmFpZDEuYwppbmRleCBkMTJjZjNlLi5iZTQ4Y2VkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLXJhaWQxLmMKKysrIGIvZHJpdmVycy9tZC9kbS1yYWlkMS5jCkBAIC0yMCw2ICsyMCw4IEBACiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogCisjZGVmaW5lIERNX01TR19QUkVGSVggInJhaWQxIgorCiBzdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKl9rbWlycm9yZF93cTsKIHN0YXRpYyBzdHJ1Y3Qgd29ya19zdHJ1Y3QgX2ttaXJyb3JkX3dvcms7CiAKQEAgLTEwNiwxMiArMTA4LDQyIEBACiAJc3RydWN0IGJpb19saXN0IGRlbGF5ZWRfYmlvczsKIH07CiAKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogTWlycm9yIHNldCBzdHJ1Y3R1cmVzLgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RydWN0IG1pcnJvciB7CisJYXRvbWljX3QgZXJyb3JfY291bnQ7CisJc3RydWN0IGRtX2RldiAqZGV2OworCXNlY3Rvcl90IG9mZnNldDsKK307CisKK3N0cnVjdCBtaXJyb3Jfc2V0IHsKKwlzdHJ1Y3QgZG1fdGFyZ2V0ICp0aTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IHJlZ2lvbl9oYXNoIHJoOworCXN0cnVjdCBrY29weWRfY2xpZW50ICprY29weWRfY2xpZW50OworCisJc3BpbmxvY2tfdCBsb2NrOwkvKiBwcm90ZWN0cyB0aGUgbmV4dCB0d28gbGlzdHMgKi8KKwlzdHJ1Y3QgYmlvX2xpc3QgcmVhZHM7CisJc3RydWN0IGJpb19saXN0IHdyaXRlczsKKworCS8qIHJlY292ZXJ5ICovCisJcmVnaW9uX3QgbnJfcmVnaW9uczsKKwlpbnQgaW5fc3luYzsKKworCXN0cnVjdCBtaXJyb3IgKmRlZmF1bHRfbWlycm9yOwkvKiBEZWZhdWx0IG1pcnJvciAqLworCisJdW5zaWduZWQgaW50IG5yX21pcnJvcnM7CisJc3RydWN0IG1pcnJvciBtaXJyb3JbMF07Cit9OworCiAvKgogICogQ29udmVyc2lvbiBmbnMKICAqLwogc3RhdGljIGlubGluZSByZWdpb25fdCBiaW9fdG9fcmVnaW9uKHN0cnVjdCByZWdpb25faGFzaCAqcmgsIHN0cnVjdCBiaW8gKmJpbykKIHsKLQlyZXR1cm4gYmlvLT5iaV9zZWN0b3IgPj4gcmgtPnJlZ2lvbl9zaGlmdDsKKwlyZXR1cm4gKGJpby0+Ymlfc2VjdG9yIC0gcmgtPm1zLT50aS0+YmVnaW4pID4+IHJoLT5yZWdpb25fc2hpZnQ7CiB9CiAKIHN0YXRpYyBpbmxpbmUgc2VjdG9yX3QgcmVnaW9uX3RvX3NlY3RvcihzdHJ1Y3QgcmVnaW9uX2hhc2ggKnJoLCByZWdpb25fdCByZWdpb24pCkBAIC00NTgsMTEgKzQ5MCw5IEBACiAJLyogQWxyZWFkeSBxdWllc2NlZCA/ICovCiAJaWYgKGF0b21pY19yZWFkKCZyZWctPnBlbmRpbmcpKQogCQlsaXN0X2RlbF9pbml0KCZyZWctPmxpc3QpOworCWVsc2UKKwkJbGlzdF9tb3ZlKCZyZWctPmxpc3QsICZyaC0+cXVpZXNjZWRfcmVnaW9ucyk7CiAKLQllbHNlIHsKLQkJbGlzdF9kZWxfaW5pdCgmcmVnLT5saXN0KTsKLQkJbGlzdF9hZGQoJnJlZy0+bGlzdCwgJnJoLT5xdWllc2NlZF9yZWdpb25zKTsKLQl9CiAJc3Bpbl91bmxvY2tfaXJxKCZyaC0+cmVnaW9uX2xvY2spOwogCiAJcmV0dXJuIDE7CkBAIC01NDEsMzUgKzU3MSw2IEBACiAJd2FrZSgpOwogfQogCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBNaXJyb3Igc2V0IHN0cnVjdHVyZXMuCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdHJ1Y3QgbWlycm9yIHsKLQlhdG9taWNfdCBlcnJvcl9jb3VudDsKLQlzdHJ1Y3QgZG1fZGV2ICpkZXY7Ci0Jc2VjdG9yX3Qgb2Zmc2V0OwotfTsKLQotc3RydWN0IG1pcnJvcl9zZXQgewotCXN0cnVjdCBkbV90YXJnZXQgKnRpOwotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQlzdHJ1Y3QgcmVnaW9uX2hhc2ggcmg7Ci0Jc3RydWN0IGtjb3B5ZF9jbGllbnQgKmtjb3B5ZF9jbGllbnQ7Ci0KLQlzcGlubG9ja190IGxvY2s7CS8qIHByb3RlY3RzIHRoZSBuZXh0IHR3byBsaXN0cyAqLwotCXN0cnVjdCBiaW9fbGlzdCByZWFkczsKLQlzdHJ1Y3QgYmlvX2xpc3Qgd3JpdGVzOwotCi0JLyogcmVjb3ZlcnkgKi8KLQlyZWdpb25fdCBucl9yZWdpb25zOwotCWludCBpbl9zeW5jOwotCi0Jc3RydWN0IG1pcnJvciAqZGVmYXVsdF9taXJyb3I7CS8qIERlZmF1bHQgbWlycm9yICovCi0KLQl1bnNpZ25lZCBpbnQgbnJfbWlycm9yczsKLQlzdHJ1Y3QgbWlycm9yIG1pcnJvclswXTsKLX07Ci0KIC8qCiAgKiBFdmVyeSBtaXJyb3Igc2hvdWxkIGxvb2sgbGlrZSB0aGlzIG9uZS4KICAqLwpAQCAtNjAzLDcgKzYwNCw3IEBACiAJc3RydWN0IHJlZ2lvbiAqcmVnID0gKHN0cnVjdCByZWdpb24gKikgY29udGV4dDsKIAogCS8qIEZJWE1FOiBiZXR0ZXIgZXJyb3IgaGFuZGxpbmcgKi8KLQlyaF9yZWNvdmVyeV9lbmQocmVnLCByZWFkX2VyciB8fCB3cml0ZV9lcnIpOworCXJoX3JlY292ZXJ5X2VuZChyZWcsICEocmVhZF9lcnIgfHwgd3JpdGVfZXJyKSk7CiB9CiAKIHN0YXRpYyBpbnQgcmVjb3ZlcihzdHJ1Y3QgbWlycm9yX3NldCAqbXMsIHN0cnVjdCByZWdpb24gKnJlZykKQEAgLTg5Myw3ICs4OTQsNyBAQAogCiAJbXMgPSBrbWFsbG9jKGxlbiwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFtcykgewotCQl0aS0+ZXJyb3IgPSAiZG0tbWlycm9yOiBDYW5ub3QgYWxsb2NhdGUgbWlycm9yIGNvbnRleHQiOworCQl0aS0+ZXJyb3IgPSAiQ2Fubm90IGFsbG9jYXRlIG1pcnJvciBjb250ZXh0IjsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCkBAIC05MDcsNyArOTA4LDcgQEAKIAltcy0+ZGVmYXVsdF9taXJyb3IgPSAmbXMtPm1pcnJvcltERUZBVUxUX01JUlJPUl07CiAKIAlpZiAocmhfaW5pdCgmbXMtPnJoLCBtcywgZGwsIHJlZ2lvbl9zaXplLCBtcy0+bnJfcmVnaW9ucykpIHsKLQkJdGktPmVycm9yID0gImRtLW1pcnJvcjogRXJyb3IgY3JlYXRpbmcgZGlydHkgcmVnaW9uIGhhc2giOworCQl0aS0+ZXJyb3IgPSAiRXJyb3IgY3JlYXRpbmcgZGlydHkgcmVnaW9uIGhhc2giOwogCQlrZnJlZShtcyk7CiAJCXJldHVybiBOVUxMOwogCX0KQEAgLTkzNywxNCArOTM4LDE0IEBACiAJdW5zaWduZWQgbG9uZyBsb25nIG9mZnNldDsKIAogCWlmIChzc2NhbmYoYXJndlsxXSwgIiVsbHUiLCAmb2Zmc2V0KSAhPSAxKSB7Ci0JCXRpLT5lcnJvciA9ICJkbS1taXJyb3I6IEludmFsaWQgb2Zmc2V0IjsKKwkJdGktPmVycm9yID0gIkludmFsaWQgb2Zmc2V0IjsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJaWYgKGRtX2dldF9kZXZpY2UodGksIGFyZ3ZbMF0sIG9mZnNldCwgdGktPmxlbiwKIAkJCSAgZG1fdGFibGVfZ2V0X21vZGUodGktPnRhYmxlKSwKIAkJCSAgJm1zLT5taXJyb3JbbWlycm9yXS5kZXYpKSB7Ci0JCXRpLT5lcnJvciA9ICJkbS1taXJyb3I6IERldmljZSBsb29rdXAgZmFpbHVyZSI7CisJCXRpLT5lcnJvciA9ICJEZXZpY2UgbG9va3VwIGZhaWx1cmUiOwogCQlyZXR1cm4gLUVOWElPOwogCX0KIApAQCAtOTgxLDMwICs5ODIsMzAgQEAKIAlzdHJ1Y3QgZGlydHlfbG9nICpkbDsKIAogCWlmIChhcmdjIDwgMikgewotCQl0aS0+ZXJyb3IgPSAiZG0tbWlycm9yOiBJbnN1ZmZpY2llbnQgbWlycm9yIGxvZyBhcmd1bWVudHMiOworCQl0aS0+ZXJyb3IgPSAiSW5zdWZmaWNpZW50IG1pcnJvciBsb2cgYXJndW1lbnRzIjsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCiAJaWYgKHNzY2FuZihhcmd2WzFdLCAiJXUiLCAmcGFyYW1fY291bnQpICE9IDEpIHsKLQkJdGktPmVycm9yID0gImRtLW1pcnJvcjogSW52YWxpZCBtaXJyb3IgbG9nIGFyZ3VtZW50IGNvdW50IjsKKwkJdGktPmVycm9yID0gIkludmFsaWQgbWlycm9yIGxvZyBhcmd1bWVudCBjb3VudCI7CiAJCXJldHVybiBOVUxMOwogCX0KIAogCSphcmdzX3VzZWQgPSAyICsgcGFyYW1fY291bnQ7CiAKIAlpZiAoYXJnYyA8ICphcmdzX3VzZWQpIHsKLQkJdGktPmVycm9yID0gImRtLW1pcnJvcjogSW5zdWZmaWNpZW50IG1pcnJvciBsb2cgYXJndW1lbnRzIjsKKwkJdGktPmVycm9yID0gIkluc3VmZmljaWVudCBtaXJyb3IgbG9nIGFyZ3VtZW50cyI7CiAJCXJldHVybiBOVUxMOwogCX0KIAogCWRsID0gZG1fY3JlYXRlX2RpcnR5X2xvZyhhcmd2WzBdLCB0aSwgcGFyYW1fY291bnQsIGFyZ3YgKyAyKTsKIAlpZiAoIWRsKSB7Ci0JCXRpLT5lcnJvciA9ICJkbS1taXJyb3I6IEVycm9yIGNyZWF0aW5nIG1pcnJvciBkaXJ0eSBsb2ciOworCQl0aS0+ZXJyb3IgPSAiRXJyb3IgY3JlYXRpbmcgbWlycm9yIGRpcnR5IGxvZyI7CiAJCXJldHVybiBOVUxMOwogCX0KIAogCWlmICghX2NoZWNrX3JlZ2lvbl9zaXplKHRpLCBkbC0+dHlwZS0+Z2V0X3JlZ2lvbl9zaXplKGRsKSkpIHsKLQkJdGktPmVycm9yID0gImRtLW1pcnJvcjogSW52YWxpZCByZWdpb24gc2l6ZSI7CisJCXRpLT5lcnJvciA9ICJJbnZhbGlkIHJlZ2lvbiBzaXplIjsKIAkJZG1fZGVzdHJveV9kaXJ0eV9sb2coZGwpOwogCQlyZXR1cm4gTlVMTDsKIAl9CkBAIC0xMDM4LDcgKzEwMzksNyBAQAogCiAJaWYgKCFhcmdjIHx8IHNzY2FuZihhcmd2WzBdLCAiJXUiLCAmbnJfbWlycm9ycykgIT0gMSB8fAogCSAgICBucl9taXJyb3JzIDwgMiB8fCBucl9taXJyb3JzID4gS0NPUFlEX01BWF9SRUdJT05TICsgMSkgewotCQl0aS0+ZXJyb3IgPSAiZG0tbWlycm9yOiBJbnZhbGlkIG51bWJlciBvZiBtaXJyb3JzIjsKKwkJdGktPmVycm9yID0gIkludmFsaWQgbnVtYmVyIG9mIG1pcnJvcnMiOwogCQlkbV9kZXN0cm95X2RpcnR5X2xvZyhkbCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTEwNDYsNyArMTA0Nyw3IEBACiAJYXJndisrLCBhcmdjLS07CiAKIAlpZiAoYXJnYyAhPSBucl9taXJyb3JzICogMikgewotCQl0aS0+ZXJyb3IgPSAiZG0tbWlycm9yOiBXcm9uZyBudW1iZXIgb2YgbWlycm9yIGFyZ3VtZW50cyI7CisJCXRpLT5lcnJvciA9ICJXcm9uZyBudW1iZXIgb2YgbWlycm9yIGFyZ3VtZW50cyI7CiAJCWRtX2Rlc3Ryb3lfZGlydHlfbG9nKGRsKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMTExNSw3ICsxMTE2LDcgQEAKIAlzdHJ1Y3QgbWlycm9yICptOwogCXN0cnVjdCBtaXJyb3Jfc2V0ICptcyA9IHRpLT5wcml2YXRlOwogCi0JbWFwX2NvbnRleHQtPmxsID0gYmlvLT5iaV9zZWN0b3IgPj4gbXMtPnJoLnJlZ2lvbl9zaGlmdDsKKwltYXBfY29udGV4dC0+bGwgPSBiaW9fdG9fcmVnaW9uKCZtcy0+cmgsIGJpbyk7CiAKIAlpZiAocncgPT0gV1JJVEUpIHsKIAkJcXVldWVfYmlvKG1zLCBiaW8sIHJ3KTsKQEAgLTEyMjEsNyArMTIyMiw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgdGFyZ2V0X3R5cGUgbWlycm9yX3RhcmdldCA9IHsKIAkubmFtZQkgPSAibWlycm9yIiwKLQkudmVyc2lvbiA9IHsxLCAwLCAxfSwKKwkudmVyc2lvbiA9IHsxLCAwLCAyfSwKIAkubW9kdWxlCSA9IFRISVNfTU9EVUxFLAogCS5jdHIJID0gbWlycm9yX2N0ciwKIAkuZHRyCSA9IG1pcnJvcl9kdHIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLXJvdW5kLXJvYmluLmMgYi9kcml2ZXJzL21kL2RtLXJvdW5kLXJvYmluLmMKaW5kZXggZDAwMjQ4Ni4uYzVhMTZjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1yb3VuZC1yb2Jpbi5jCisrKyBiL2RyaXZlcnMvbWQvZG0tcm91bmQtcm9iaW4uYwpAQCAtMTQsNiArMTQsOCBAQAogCiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCisjZGVmaW5lIERNX01TR19QUkVGSVggIm11bHRpcGF0aCByb3VuZC1yb2JpbiIKKwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogUGF0aC1oYW5kbGluZyBjb2RlLCBwYXRocyBhcmUgaGVsZCBpbiBsaXN0cwogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtMTkxLDkgKzE5Myw5IEBACiAJaW50IHIgPSBkbV9yZWdpc3Rlcl9wYXRoX3NlbGVjdG9yKCZycl9wcyk7CiAKIAlpZiAociA8IDApCi0JCURNRVJSKCJyb3VuZC1yb2JpbjogcmVnaXN0ZXIgZmFpbGVkICVkIiwgcik7CisJCURNRVJSKCJyZWdpc3RlciBmYWlsZWQgJWQiLCByKTsKIAotCURNSU5GTygiZG0tcm91bmQtcm9iaW4gdmVyc2lvbiAxLjAuMCBsb2FkZWQiKTsKKwlETUlORk8oInZlcnNpb24gMS4wLjAgbG9hZGVkIik7CiAKIAlyZXR1cm4gcjsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tc25hcC5jIGIvZHJpdmVycy9tZC9kbS1zbmFwLmMKaW5kZXggMDgzMTJiNC4uOGVlYTBkZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0tc25hcC5jCisrKyBiL2RyaXZlcnMvbWQvZG0tc25hcC5jCkBAIC0yMyw2ICsyMyw4IEBACiAjaW5jbHVkZSAiZG0tYmlvLWxpc3QuaCIKICNpbmNsdWRlICJrY29weWQuaCIKIAorI2RlZmluZSBETV9NU0dfUFJFRklYICJzbmFwc2hvdHMiCisKIC8qCiAgKiBUaGUgcGVyY2VudGFnZSBpbmNyZW1lbnQgd2Ugd2lsbCB3YWtlIHVwIHVzZXJzIGF0CiAgKi8KQEAgLTExNyw3ICsxMTksNyBAQAogCV9vcmlnaW5zID0ga21hbGxvYyhPUklHSU5fSEFTSF9TSVpFICogc2l6ZW9mKHN0cnVjdCBsaXN0X2hlYWQpLAogCQkJICAgR0ZQX0tFUk5FTCk7CiAJaWYgKCFfb3JpZ2lucykgewotCQlETUVSUigiRGV2aWNlIG1hcHBlcjogU25hcHNob3Q6IHVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkiKTsKKwkJRE1FUlIoInVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkiKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC00MTIsNyArNDE0LDcgQEAKIAlpbnQgYmxvY2tzaXplOwogCiAJaWYgKGFyZ2MgPCA0KSB7Ci0JCXRpLT5lcnJvciA9ICJkbS1zbmFwc2hvdDogcmVxdWlyZXMgZXhhY3RseSA0IGFyZ3VtZW50cyI7CisJCXRpLT5lcnJvciA9ICJyZXF1aXJlcyBleGFjdGx5IDQgYXJndW1lbnRzIjsKIAkJciA9IC1FSU5WQUw7CiAJCWdvdG8gYmFkMTsKIAl9CkBAIC01MzAsNyArNTMyLDcgQEAKIAl9CiAKIAl0aS0+cHJpdmF0ZSA9IHM7Ci0JdGktPnNwbGl0X2lvID0gY2h1bmtfc2l6ZTsKKwl0aS0+c3BsaXRfaW8gPSBzLT5jaHVua19zaXplOwogCiAJcmV0dXJuIDA7CiAKQEAgLTExMjcsNyArMTEyOSw3IEBACiAJc3RydWN0IGRtX2RldiAqZGV2OwogCiAJaWYgKGFyZ2MgIT0gMSkgewotCQl0aS0+ZXJyb3IgPSAiZG0tb3JpZ2luOiBpbmNvcnJlY3QgbnVtYmVyIG9mIGFyZ3VtZW50cyI7CisJCXRpLT5lcnJvciA9ICJvcmlnaW46IGluY29ycmVjdCBudW1iZXIgb2YgYXJndW1lbnRzIjsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0xMjA0LDcgKzEyMDYsNyBAQAogCiBzdGF0aWMgc3RydWN0IHRhcmdldF90eXBlIG9yaWdpbl90YXJnZXQgPSB7CiAJLm5hbWUgICAgPSAic25hcHNob3Qtb3JpZ2luIiwKLQkudmVyc2lvbiA9IHsxLCAxLCAwfSwKKwkudmVyc2lvbiA9IHsxLCA0LCAwfSwKIAkubW9kdWxlICA9IFRISVNfTU9EVUxFLAogCS5jdHIgICAgID0gb3JpZ2luX2N0ciwKIAkuZHRyICAgICA9IG9yaWdpbl9kdHIsCkBAIC0xMjE1LDcgKzEyMTcsNyBAQAogCiBzdGF0aWMgc3RydWN0IHRhcmdldF90eXBlIHNuYXBzaG90X3RhcmdldCA9IHsKIAkubmFtZSAgICA9ICJzbmFwc2hvdCIsCi0JLnZlcnNpb24gPSB7MSwgMSwgMH0sCisJLnZlcnNpb24gPSB7MSwgNCwgMH0sCiAJLm1vZHVsZSAgPSBUSElTX01PRFVMRSwKIAkuY3RyICAgICA9IHNuYXBzaG90X2N0ciwKIAkuZHRyICAgICA9IHNuYXBzaG90X2R0ciwKQEAgLTEyMzYsNyArMTIzOCw3IEBACiAKIAlyID0gZG1fcmVnaXN0ZXJfdGFyZ2V0KCZvcmlnaW5fdGFyZ2V0KTsKIAlpZiAociA8IDApIHsKLQkJRE1FUlIoIkRldmljZSBtYXBwZXI6IE9yaWdpbjogcmVnaXN0ZXIgZmFpbGVkICVkXG4iLCByKTsKKwkJRE1FUlIoIk9yaWdpbiB0YXJnZXQgcmVnaXN0ZXIgZmFpbGVkICVkIiwgcik7CiAJCWdvdG8gYmFkMTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tc3RyaXBlLmMgYi9kcml2ZXJzL21kL2RtLXN0cmlwZS5jCmluZGV4IDA4MzI4YTguLjZjMjlmY2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0tc3RyaXBlLmMKKysrIGIvZHJpdmVycy9tZC9kbS1zdHJpcGUuYwpAQCAtMTIsNiArMTIsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2Jpby5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAorI2RlZmluZSBETV9NU0dfUFJFRklYICJzdHJpcGVkIgorCiBzdHJ1Y3Qgc3RyaXBlIHsKIAlzdHJ1Y3QgZG1fZGV2ICpkZXY7CiAJc2VjdG9yX3QgcGh5c2ljYWxfc3RhcnQ7CkBAIC03OCwxOSArODAsMTkgQEAKIAl1bnNpZ25lZCBpbnQgaTsKIAogCWlmIChhcmdjIDwgMikgewotCQl0aS0+ZXJyb3IgPSAiZG0tc3RyaXBlOiBOb3QgZW5vdWdoIGFyZ3VtZW50cyI7CisJCXRpLT5lcnJvciA9ICJOb3QgZW5vdWdoIGFyZ3VtZW50cyI7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCXN0cmlwZXMgPSBzaW1wbGVfc3RydG91bChhcmd2WzBdLCAmZW5kLCAxMCk7CiAJaWYgKCplbmQpIHsKLQkJdGktPmVycm9yID0gImRtLXN0cmlwZTogSW52YWxpZCBzdHJpcGUgY291bnQiOworCQl0aS0+ZXJyb3IgPSAiSW52YWxpZCBzdHJpcGUgY291bnQiOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAljaHVua19zaXplID0gc2ltcGxlX3N0cnRvdWwoYXJndlsxXSwgJmVuZCwgMTApOwogCWlmICgqZW5kKSB7Ci0JCXRpLT5lcnJvciA9ICJkbS1zdHJpcGU6IEludmFsaWQgY2h1bmtfc2l6ZSI7CisJCXRpLT5lcnJvciA9ICJJbnZhbGlkIGNodW5rX3NpemUiOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTk5LDE5ICsxMDEsMTkgQEAKIAkgKi8KIAlpZiAoIWNodW5rX3NpemUgfHwgKGNodW5rX3NpemUgJiAoY2h1bmtfc2l6ZSAtIDEpKSB8fAogCSAgICAoY2h1bmtfc2l6ZSA8IChQQUdFX1NJWkUgPj4gU0VDVE9SX1NISUZUKSkpIHsKLQkJdGktPmVycm9yID0gImRtLXN0cmlwZTogSW52YWxpZCBjaHVuayBzaXplIjsKKwkJdGktPmVycm9yID0gIkludmFsaWQgY2h1bmsgc2l6ZSI7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCWlmICh0aS0+bGVuICYgKGNodW5rX3NpemUgLSAxKSkgewotCQl0aS0+ZXJyb3IgPSAiZG0tc3RyaXBlOiBUYXJnZXQgbGVuZ3RoIG5vdCBkaXZpc2libGUgYnkgIgorCQl0aS0+ZXJyb3IgPSAiVGFyZ2V0IGxlbmd0aCBub3QgZGl2aXNpYmxlIGJ5ICIKIAkJICAgICJjaHVuayBzaXplIjsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJd2lkdGggPSB0aS0+bGVuOwogCWlmIChzZWN0b3JfZGl2KHdpZHRoLCBzdHJpcGVzKSkgewotCQl0aS0+ZXJyb3IgPSAiZG0tc3RyaXBlOiBUYXJnZXQgbGVuZ3RoIG5vdCBkaXZpc2libGUgYnkgIgorCQl0aS0+ZXJyb3IgPSAiVGFyZ2V0IGxlbmd0aCBub3QgZGl2aXNpYmxlIGJ5ICIKIAkJICAgICJudW1iZXIgb2Ygc3RyaXBlcyI7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTEyMCwxNCArMTIyLDE0IEBACiAJICogRG8gd2UgaGF2ZSBlbm91Z2ggYXJndW1lbnRzIGZvciB0aGF0IG1hbnkgc3RyaXBlcyA/CiAJICovCiAJaWYgKGFyZ2MgIT0gKDIgKyAyICogc3RyaXBlcykpIHsKLQkJdGktPmVycm9yID0gImRtLXN0cmlwZTogTm90IGVub3VnaCBkZXN0aW5hdGlvbnMgIgorCQl0aS0+ZXJyb3IgPSAiTm90IGVub3VnaCBkZXN0aW5hdGlvbnMgIgogCQkJInNwZWNpZmllZCI7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCXNjID0gYWxsb2NfY29udGV4dChzdHJpcGVzKTsKIAlpZiAoIXNjKSB7Ci0JCXRpLT5lcnJvciA9ICJkbS1zdHJpcGU6IE1lbW9yeSBhbGxvY2F0aW9uIGZvciBzdHJpcGVkIGNvbnRleHQgIgorCQl0aS0+ZXJyb3IgPSAiTWVtb3J5IGFsbG9jYXRpb24gZm9yIHN0cmlwZWQgY29udGV4dCAiCiAJCSAgICAiZmFpbGVkIjsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtMTQ5LDggKzE1MSw3IEBACiAKIAkJciA9IGdldF9zdHJpcGUodGksIHNjLCBpLCBhcmd2KTsKIAkJaWYgKHIgPCAwKSB7Ci0JCQl0aS0+ZXJyb3IgPSAiZG0tc3RyaXBlOiBDb3VsZG4ndCBwYXJzZSBzdHJpcGUgIgotCQkJCSJkZXN0aW5hdGlvbiI7CisJCQl0aS0+ZXJyb3IgPSAiQ291bGRuJ3QgcGFyc2Ugc3RyaXBlIGRlc3RpbmF0aW9uIjsKIAkJCXdoaWxlIChpLS0pCiAJCQkJZG1fcHV0X2RldmljZSh0aSwgc2MtPnN0cmlwZVtpXS5kZXYpOwogCQkJa2ZyZWUoc2MpOwpAQCAtMjI3LDcgKzIyOCw3IEBACiAKIAlyID0gZG1fcmVnaXN0ZXJfdGFyZ2V0KCZzdHJpcGVfdGFyZ2V0KTsKIAlpZiAociA8IDApCi0JCURNV0FSTigic3RyaXBlZCB0YXJnZXQgcmVnaXN0cmF0aW9uIGZhaWxlZCIpOworCQlETVdBUk4oInRhcmdldCByZWdpc3RyYXRpb24gZmFpbGVkIik7CiAKIAlyZXR1cm4gcjsKIH0KQEAgLTIzNSw3ICsyMzYsNyBAQAogdm9pZCBkbV9zdHJpcGVfZXhpdCh2b2lkKQogewogCWlmIChkbV91bnJlZ2lzdGVyX3RhcmdldCgmc3RyaXBlX3RhcmdldCkpCi0JCURNV0FSTigic3RyaXBlZCB0YXJnZXQgdW5yZWdpc3RyYXRpb24gZmFpbGVkIik7CisJCURNV0FSTigidGFyZ2V0IHVucmVnaXN0cmF0aW9uIGZhaWxlZCIpOwogCiAJcmV0dXJuOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS10YWJsZS5jIGIvZHJpdmVycy9tZC9kbS10YWJsZS5jCmluZGV4IDhmNTZhNTQuLjc1ZmU5NDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0tdGFibGUuYworKysgYi9kcml2ZXJzL21kL2RtLXRhYmxlLmMKQEAgLTE3LDYgKzE3LDggQEAKICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KIAorI2RlZmluZSBETV9NU0dfUFJFRklYICJ0YWJsZSIKKwogI2RlZmluZSBNQVhfREVQVEggMTYKICNkZWZpbmUgTk9ERV9TSVpFIEwxX0NBQ0hFX0JZVEVTCiAjZGVmaW5lIEtFWVNfUEVSX05PREUgKE5PREVfU0laRSAvIHNpemVvZihzZWN0b3JfdCkpCkBAIC0yMzcsNiArMjM5LDQ0IEBACiAJcmV0dXJuIDA7CiB9CiAKK2ludCBkbV9jcmVhdGVfZXJyb3JfdGFibGUoc3RydWN0IGRtX3RhYmxlICoqcmVzdWx0LCBzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQpCit7CisJc3RydWN0IGRtX3RhYmxlICp0OworCXNlY3Rvcl90IGRldl9zaXplID0gMTsKKwlpbnQgcjsKKworCS8qCisJICogRmluZCBjdXJyZW50IHNpemUgb2YgZGV2aWNlLgorCSAqIERlZmF1bHQgdG8gMSBzZWN0b3IgaWYgaW5hY3RpdmUuCisJICovCisJdCA9IGRtX2dldF90YWJsZShtZCk7CisJaWYgKHQpIHsKKwkJZGV2X3NpemUgPSBkbV90YWJsZV9nZXRfc2l6ZSh0KTsKKwkJZG1fdGFibGVfcHV0KHQpOworCX0KKworCXIgPSBkbV90YWJsZV9jcmVhdGUoJnQsIEZNT0RFX1JFQUQsIDEsIG1kKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlyID0gZG1fdGFibGVfYWRkX3RhcmdldCh0LCAiZXJyb3IiLCAwLCBkZXZfc2l6ZSwgTlVMTCk7CisJaWYgKHIpCisJCWdvdG8gb3V0OworCisJciA9IGRtX3RhYmxlX2NvbXBsZXRlKHQpOworCWlmIChyKQorCQlnb3RvIG91dDsKKworCSpyZXN1bHQgPSB0OworCitvdXQ6CisJaWYgKHIpCisJCWRtX3RhYmxlX3B1dCh0KTsKKworCXJldHVybiByOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZG1fY3JlYXRlX2Vycm9yX3RhYmxlKTsKKwogc3RhdGljIHZvaWQgZnJlZV9kZXZpY2VzKHN0cnVjdCBsaXN0X2hlYWQgKmRldmljZXMpCiB7CiAJc3RydWN0IGxpc3RfaGVhZCAqdG1wLCAqbmV4dDsKQEAgLTU5MCw2ICs2MzAsMTIgQEAKIAl1bnNpZ25lZCBhcnJheV9zaXplID0gMDsKIAogCSphcmdjID0gMDsKKworCWlmICghaW5wdXQpIHsKKwkJKmFyZ3ZwID0gTlVMTDsKKwkJcmV0dXJuIDA7CisJfQorCiAJYXJndiA9IHJlYWxsb2NfYXJndigmYXJyYXlfc2l6ZSwgYXJndik7CiAJaWYgKCFhcmd2KQogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTY3MSwxNSArNzE3LDE0IEBACiAJbWVtc2V0KHRndCwgMCwgc2l6ZW9mKCp0Z3QpKTsKIAogCWlmICghbGVuKSB7Ci0JCXRndC0+ZXJyb3IgPSAiemVyby1sZW5ndGggdGFyZ2V0IjsKLQkJRE1FUlIoIiVzIiwgdGd0LT5lcnJvcik7CisJCURNRVJSKCIlczogemVyby1sZW5ndGggdGFyZ2V0IiwgZG1fZGV2aWNlX25hbWUodC0+bWQpKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJdGd0LT50eXBlID0gZG1fZ2V0X3RhcmdldF90eXBlKHR5cGUpOwogCWlmICghdGd0LT50eXBlKSB7Ci0JCXRndC0+ZXJyb3IgPSAidW5rbm93biB0YXJnZXQgdHlwZSI7Ci0JCURNRVJSKCIlcyIsIHRndC0+ZXJyb3IpOworCQlETUVSUigiJXM6ICVzOiB1bmtub3duIHRhcmdldCB0eXBlIiwgZG1fZGV2aWNlX25hbWUodC0+bWQpLAorCQkgICAgICB0eXBlKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC03MTYsNyArNzYxLDcgQEAKIAlyZXR1cm4gMDsKIAogIGJhZDoKLQlETUVSUigiJXMiLCB0Z3QtPmVycm9yKTsKKwlETUVSUigiJXM6ICVzOiAlcyIsIGRtX2RldmljZV9uYW1lKHQtPm1kKSwgdHlwZSwgdGd0LT5lcnJvcik7CiAJZG1fcHV0X3RhcmdldF90eXBlKHRndC0+dHlwZSk7CiAJcmV0dXJuIHI7CiB9CkBAIC04MDIsNyArODQ3LDcgQEAKIAogc3RydWN0IGRtX3RhcmdldCAqZG1fdGFibGVfZ2V0X3RhcmdldChzdHJ1Y3QgZG1fdGFibGUgKnQsIHVuc2lnbmVkIGludCBpbmRleCkKIHsKLQlpZiAoaW5kZXggPiB0LT5udW1fdGFyZ2V0cykKKwlpZiAoaW5kZXggPj0gdC0+bnVtX3RhcmdldHMpCiAJCXJldHVybiBOVUxMOwogCiAJcmV0dXJuIHQtPnRhcmdldHMgKyBpbmRleDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tdGFyZ2V0LmMgYi9kcml2ZXJzL21kL2RtLXRhcmdldC5jCmluZGV4IDY0ZmQ4ZTcuLjQ3N2EwNDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0tdGFyZ2V0LmMKKysrIGIvZHJpdmVycy9tZC9kbS10YXJnZXQuYwpAQCAtMTIsNiArMTIsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2Jpby5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAorI2RlZmluZSBETV9NU0dfUFJFRklYICJ0YXJnZXQiCisKIHN0cnVjdCB0dF9pbnRlcm5hbCB7CiAJc3RydWN0IHRhcmdldF90eXBlIHR0OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLXplcm8uYyBiL2RyaXZlcnMvbWQvZG0temVyby5jCmluZGV4IDUxYzA2MzkuLmVhNTY5ZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0temVyby5jCisrKyBiL2RyaXZlcnMvbWQvZG0temVyby5jCkBAIC0xMCwxMyArMTAsMTUgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvYmlvLmg+CiAKKyNkZWZpbmUgRE1fTVNHX1BSRUZJWCAiemVybyIKKwogLyoKICAqIENvbnN0cnVjdCBhIGR1bW15IG1hcHBpbmcgdGhhdCBvbmx5IHJldHVybnMgemVyb3MKICAqLwogc3RhdGljIGludCB6ZXJvX2N0cihzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSwgdW5zaWduZWQgaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogewogCWlmIChhcmdjICE9IDApIHsKLQkJdGktPmVycm9yID0gImRtLXplcm86IE5vIGFyZ3VtZW50cyByZXF1aXJlZCI7CisJCXRpLT5lcnJvciA9ICJObyBhcmd1bWVudHMgcmVxdWlyZWQiOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTYwLDcgKzYyLDcgQEAKIAlpbnQgciA9IGRtX3JlZ2lzdGVyX3RhcmdldCgmemVyb190YXJnZXQpOwogCiAJaWYgKHIgPCAwKQotCQlETUVSUigiemVybzogcmVnaXN0ZXIgZmFpbGVkICVkIiwgcik7CisJCURNRVJSKCJyZWdpc3RlciBmYWlsZWQgJWQiLCByKTsKIAogCXJldHVybiByOwogfQpAQCAtNzAsNyArNzIsNyBAQAogCWludCByID0gZG1fdW5yZWdpc3Rlcl90YXJnZXQoJnplcm9fdGFyZ2V0KTsKIAogCWlmIChyIDwgMCkKLQkJRE1FUlIoInplcm86IHVucmVnaXN0ZXIgZmFpbGVkICVkIiwgcik7CisJCURNRVJSKCJ1bnJlZ2lzdGVyIGZhaWxlZCAlZCIsIHIpOwogfQogCiBtb2R1bGVfaW5pdChkbV96ZXJvX2luaXQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLmMgYi9kcml2ZXJzL21kL2RtLmMKaW5kZXggNGQ3MTBiNy4uM2VkMmU1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS5jCisrKyBiL2RyaXZlcnMvbWQvZG0uYwpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIgU2lzdGluYSBTb2Z0d2FyZSAoVUspIExpbWl0ZWQuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDYgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMLgogICovCkBAIC0yMSwxMSArMjEsMTQgQEAKICNpbmNsdWRlIDxsaW51eC9oZHJlZy5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa3RyYWNlX2FwaS5oPgogCisjZGVmaW5lIERNX01TR19QUkVGSVggImNvcmUiCisKIHN0YXRpYyBjb25zdCBjaGFyICpfbmFtZSA9IERNX05BTUU7CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgbWFqb3IgPSAwOwogc3RhdGljIHVuc2lnbmVkIGludCBfbWFqb3IgPSAwOwogCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKF9taW5vcl9sb2NrKTsKIC8qCiAgKiBPbmUgb2YgdGhlc2UgaXMgYWxsb2NhdGVkIHBlciBiaW8uCiAgKi8KQEAgLTQ5LDIzICs1MiwyOCBAQAogCiB1bmlvbiBtYXBfaW5mbyAqZG1fZ2V0X21hcGluZm8oc3RydWN0IGJpbyAqYmlvKQogewotICAgICAgICBpZiAoYmlvICYmIGJpby0+YmlfcHJpdmF0ZSkKLSAgICAgICAgICAgICAgICByZXR1cm4gJigoc3RydWN0IHRhcmdldF9pbyAqKWJpby0+YmlfcHJpdmF0ZSktPmluZm87Ci0gICAgICAgIHJldHVybiBOVUxMOworCWlmIChiaW8gJiYgYmlvLT5iaV9wcml2YXRlKQorCQlyZXR1cm4gJigoc3RydWN0IHRhcmdldF9pbyAqKWJpby0+YmlfcHJpdmF0ZSktPmluZm87CisJcmV0dXJuIE5VTEw7CiB9CiAKKyNkZWZpbmUgTUlOT1JfQUxMT0NFRCAoKHZvaWQgKiktMSkKKwogLyoKICAqIEJpdHMgZm9yIHRoZSBtZC0+ZmxhZ3MgZmllbGQuCiAgKi8KICNkZWZpbmUgRE1GX0JMT0NLX0lPIDAKICNkZWZpbmUgRE1GX1NVU1BFTkRFRCAxCiAjZGVmaW5lIERNRl9GUk9aRU4gMgorI2RlZmluZSBETUZfRlJFRUlORyAzCisjZGVmaW5lIERNRl9ERUxFVElORyA0CiAKIHN0cnVjdCBtYXBwZWRfZGV2aWNlIHsKIAlzdHJ1Y3Qgcndfc2VtYXBob3JlIGlvX2xvY2s7CiAJc3RydWN0IHNlbWFwaG9yZSBzdXNwZW5kX2xvY2s7CiAJcndsb2NrX3QgbWFwX2xvY2s7CiAJYXRvbWljX3QgaG9sZGVyczsKKwlhdG9taWNfdCBvcGVuX2NvdW50OwogCiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIApAQCAtMjE4LDkgKzIyNiwyNSBAQAogewogCXN0cnVjdCBtYXBwZWRfZGV2aWNlICptZDsKIAorCXNwaW5fbG9jaygmX21pbm9yX2xvY2spOworCiAJbWQgPSBpbm9kZS0+aV9iZGV2LT5iZF9kaXNrLT5wcml2YXRlX2RhdGE7CisJaWYgKCFtZCkKKwkJZ290byBvdXQ7CisKKwlpZiAodGVzdF9iaXQoRE1GX0ZSRUVJTkcsICZtZC0+ZmxhZ3MpIHx8CisJICAgIHRlc3RfYml0KERNRl9ERUxFVElORywgJm1kLT5mbGFncykpIHsKKwkJbWQgPSBOVUxMOworCQlnb3RvIG91dDsKKwl9CisKIAlkbV9nZXQobWQpOwotCXJldHVybiAwOworCWF0b21pY19pbmMoJm1kLT5vcGVuX2NvdW50KTsKKworb3V0OgorCXNwaW5fdW5sb2NrKCZfbWlub3JfbG9jayk7CisKKwlyZXR1cm4gbWQgPyAwIDogLUVOWElPOwogfQogCiBzdGF0aWMgaW50IGRtX2Jsa19jbG9zZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKQEAgLTIyOCwxMCArMjUyLDM1IEBACiAJc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kOwogCiAJbWQgPSBpbm9kZS0+aV9iZGV2LT5iZF9kaXNrLT5wcml2YXRlX2RhdGE7CisJYXRvbWljX2RlYygmbWQtPm9wZW5fY291bnQpOwogCWRtX3B1dChtZCk7CiAJcmV0dXJuIDA7CiB9CiAKK2ludCBkbV9vcGVuX2NvdW50KHN0cnVjdCBtYXBwZWRfZGV2aWNlICptZCkKK3sKKwlyZXR1cm4gYXRvbWljX3JlYWQoJm1kLT5vcGVuX2NvdW50KTsKK30KKworLyoKKyAqIEd1YXJhbnRlZXMgbm90aGluZyBpcyB1c2luZyB0aGUgZGV2aWNlIGJlZm9yZSBpdCdzIGRlbGV0ZWQuCisgKi8KK2ludCBkbV9sb2NrX2Zvcl9kZWxldGlvbihzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQpCit7CisJaW50IHIgPSAwOworCisJc3Bpbl9sb2NrKCZfbWlub3JfbG9jayk7CisKKwlpZiAoZG1fb3Blbl9jb3VudChtZCkpCisJCXIgPSAtRUJVU1k7CisJZWxzZQorCQlzZXRfYml0KERNRl9ERUxFVElORywgJm1kLT5mbGFncyk7CisKKwlzcGluX3VubG9jaygmX21pbm9yX2xvY2spOworCisJcmV0dXJuIHI7Cit9CisKIHN0YXRpYyBpbnQgZG1fYmxrX2dldGdlbyhzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBzdHJ1Y3QgaGRfZ2VvbWV0cnkgKmdlbykKIHsKIAlzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQgPSBiZGV2LT5iZF9kaXNrLT5wcml2YXRlX2RhdGE7CkBAIC00NTYsOCArNTA1LDggQEAKIAlpZiAociA+IDApIHsKIAkJLyogdGhlIGJpbyBoYXMgYmVlbiByZW1hcHBlZCBzbyBkaXNwYXRjaCBpdCAqLwogCi0JCWJsa19hZGRfdHJhY2VfcmVtYXAoYmRldl9nZXRfcXVldWUoY2xvbmUtPmJpX2JkZXYpLCBjbG9uZSwgCi0JCQkJICAgIHRpby0+aW8tPmJpby0+YmlfYmRldi0+YmRfZGV2LCBzZWN0b3IsIAorCQlibGtfYWRkX3RyYWNlX3JlbWFwKGJkZXZfZ2V0X3F1ZXVlKGNsb25lLT5iaV9iZGV2KSwgY2xvbmUsCisJCQkJICAgIHRpby0+aW8tPmJpby0+YmlfYmRldi0+YmRfZGV2LCBzZWN0b3IsCiAJCQkJICAgIGNsb25lLT5iaV9zZWN0b3IpOwogCiAJCWdlbmVyaWNfbWFrZV9yZXF1ZXN0KGNsb25lKTsKQEAgLTc0NCw0MyArNzkzLDM5IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBBbiBJRFIgaXMgdXNlZCB0byBrZWVwIHRyYWNrIG9mIGFsbG9jYXRlZCBtaW5vciBudW1iZXJzLgogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIERFRklORV9NVVRFWChfbWlub3JfbG9jayk7CiBzdGF0aWMgREVGSU5FX0lEUihfbWlub3JfaWRyKTsKIAotc3RhdGljIHZvaWQgZnJlZV9taW5vcih1bnNpZ25lZCBpbnQgbWlub3IpCitzdGF0aWMgdm9pZCBmcmVlX21pbm9yKGludCBtaW5vcikKIHsKLQltdXRleF9sb2NrKCZfbWlub3JfbG9jayk7CisJc3Bpbl9sb2NrKCZfbWlub3JfbG9jayk7CiAJaWRyX3JlbW92ZSgmX21pbm9yX2lkciwgbWlub3IpOwotCW11dGV4X3VubG9jaygmX21pbm9yX2xvY2spOworCXNwaW5fdW5sb2NrKCZfbWlub3JfbG9jayk7CiB9CiAKIC8qCiAgKiBTZWUgaWYgdGhlIGRldmljZSB3aXRoIGEgc3BlY2lmaWMgbWlub3IgIyBpcyBmcmVlLgogICovCi1zdGF0aWMgaW50IHNwZWNpZmljX21pbm9yKHN0cnVjdCBtYXBwZWRfZGV2aWNlICptZCwgdW5zaWduZWQgaW50IG1pbm9yKQorc3RhdGljIGludCBzcGVjaWZpY19taW5vcihzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQsIGludCBtaW5vcikKIHsKIAlpbnQgciwgbTsKIAogCWlmIChtaW5vciA+PSAoMSA8PCBNSU5PUkJJVFMpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCW11dGV4X2xvY2soJl9taW5vcl9sb2NrKTsKKwlyID0gaWRyX3ByZV9nZXQoJl9taW5vcl9pZHIsIEdGUF9LRVJORUwpOworCWlmICghcikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzcGluX2xvY2soJl9taW5vcl9sb2NrKTsKIAogCWlmIChpZHJfZmluZCgmX21pbm9yX2lkciwgbWlub3IpKSB7CiAJCXIgPSAtRUJVU1k7CiAJCWdvdG8gb3V0OwogCX0KIAotCXIgPSBpZHJfcHJlX2dldCgmX21pbm9yX2lkciwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFyKSB7Ci0JCXIgPSAtRU5PTUVNOworCXIgPSBpZHJfZ2V0X25ld19hYm92ZSgmX21pbm9yX2lkciwgTUlOT1JfQUxMT0NFRCwgbWlub3IsICZtKTsKKwlpZiAocikKIAkJZ290byBvdXQ7Ci0JfQotCi0JciA9IGlkcl9nZXRfbmV3X2Fib3ZlKCZfbWlub3JfaWRyLCBtZCwgbWlub3IsICZtKTsKLQlpZiAocikgewotCQlnb3RvIG91dDsKLQl9CiAKIAlpZiAobSAhPSBtaW5vcikgewogCQlpZHJfcmVtb3ZlKCZfbWlub3JfaWRyLCBtKTsKQEAgLTc4OSwyNCArODM0LDIxIEBACiAJfQogCiBvdXQ6Ci0JbXV0ZXhfdW5sb2NrKCZfbWlub3JfbG9jayk7CisJc3Bpbl91bmxvY2soJl9taW5vcl9sb2NrKTsKIAlyZXR1cm4gcjsKIH0KIAotc3RhdGljIGludCBuZXh0X2ZyZWVfbWlub3Ioc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kLCB1bnNpZ25lZCBpbnQgKm1pbm9yKQorc3RhdGljIGludCBuZXh0X2ZyZWVfbWlub3Ioc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kLCBpbnQgKm1pbm9yKQogewotCWludCByOwotCXVuc2lnbmVkIGludCBtOwotCi0JbXV0ZXhfbG9jaygmX21pbm9yX2xvY2spOworCWludCByLCBtOwogCiAJciA9IGlkcl9wcmVfZ2V0KCZfbWlub3JfaWRyLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXIpIHsKLQkJciA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0OwotCX0KKwlpZiAoIXIpCisJCXJldHVybiAtRU5PTUVNOwogCi0JciA9IGlkcl9nZXRfbmV3KCZfbWlub3JfaWRyLCBtZCwgJm0pOworCXNwaW5fbG9jaygmX21pbm9yX2xvY2spOworCisJciA9IGlkcl9nZXRfbmV3KCZfbWlub3JfaWRyLCBNSU5PUl9BTExPQ0VELCAmbSk7CiAJaWYgKHIpIHsKIAkJZ290byBvdXQ7CiAJfQpAQCAtODIwLDcgKzg2Miw3IEBACiAJKm1pbm9yID0gbTsKIAogb3V0OgotCW11dGV4X3VubG9jaygmX21pbm9yX2xvY2spOworCXNwaW5fdW5sb2NrKCZfbWlub3JfbG9jayk7CiAJcmV0dXJuIHI7CiB9CiAKQEAgLTgyOSwxOCArODcxLDI1IEBACiAvKgogICogQWxsb2NhdGUgYW5kIGluaXRpYWxpc2UgYSBibGFuayBkZXZpY2Ugd2l0aCBhIGdpdmVuIG1pbm9yLgogICovCi1zdGF0aWMgc3RydWN0IG1hcHBlZF9kZXZpY2UgKmFsbG9jX2Rldih1bnNpZ25lZCBpbnQgbWlub3IsIGludCBwZXJzaXN0ZW50KQorc3RhdGljIHN0cnVjdCBtYXBwZWRfZGV2aWNlICphbGxvY19kZXYoaW50IG1pbm9yKQogewogCWludCByOwogCXN0cnVjdCBtYXBwZWRfZGV2aWNlICptZCA9IGttYWxsb2Moc2l6ZW9mKCptZCksIEdGUF9LRVJORUwpOworCXZvaWQgKm9sZF9tZDsKIAogCWlmICghbWQpIHsKIAkJRE1XQVJOKCJ1bmFibGUgdG8gYWxsb2NhdGUgZGV2aWNlLCBvdXQgb2YgbWVtb3J5LiIpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKKwlpZiAoIXRyeV9tb2R1bGVfZ2V0KFRISVNfTU9EVUxFKSkKKwkJZ290byBiYWQwOworCiAJLyogZ2V0IGEgbWlub3IgbnVtYmVyIGZvciB0aGUgZGV2ICovCi0JciA9IHBlcnNpc3RlbnQgPyBzcGVjaWZpY19taW5vcihtZCwgbWlub3IpIDogbmV4dF9mcmVlX21pbm9yKG1kLCAmbWlub3IpOworCWlmIChtaW5vciA9PSBETV9BTllfTUlOT1IpCisJCXIgPSBuZXh0X2ZyZWVfbWlub3IobWQsICZtaW5vcik7CisJZWxzZQorCQlyID0gc3BlY2lmaWNfbWlub3IobWQsIG1pbm9yKTsKIAlpZiAociA8IDApCiAJCWdvdG8gYmFkMTsKIApAQCAtODQ5LDYgKzg5OCw3IEBACiAJaW5pdF9NVVRFWCgmbWQtPnN1c3BlbmRfbG9jayk7CiAJcndsb2NrX2luaXQoJm1kLT5tYXBfbG9jayk7CiAJYXRvbWljX3NldCgmbWQtPmhvbGRlcnMsIDEpOworCWF0b21pY19zZXQoJm1kLT5vcGVuX2NvdW50LCAwKTsKIAlhdG9taWNfc2V0KCZtZC0+ZXZlbnRfbnIsIDApOwogCiAJbWQtPnF1ZXVlID0gYmxrX2FsbG9jX3F1ZXVlKEdGUF9LRVJORUwpOwpAQCAtODc1LDYgKzkyNSwxMCBAQAogCWlmICghbWQtPmRpc2spCiAJCWdvdG8gYmFkNDsKIAorCWF0b21pY19zZXQoJm1kLT5wZW5kaW5nLCAwKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZtZC0+d2FpdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmbWQtPmV2ZW50cSk7CisKIAltZC0+ZGlzay0+bWFqb3IgPSBfbWFqb3I7CiAJbWQtPmRpc2stPmZpcnN0X21pbm9yID0gbWlub3I7CiAJbWQtPmRpc2stPmZvcHMgPSAmZG1fYmxrX2RvcHM7CkBAIC04ODQsOSArOTM4LDEyIEBACiAJYWRkX2Rpc2sobWQtPmRpc2spOwogCWZvcm1hdF9kZXZfdChtZC0+bmFtZSwgTUtERVYoX21ham9yLCBtaW5vcikpOwogCi0JYXRvbWljX3NldCgmbWQtPnBlbmRpbmcsIDApOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJm1kLT53YWl0KTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZtZC0+ZXZlbnRxKTsKKwkvKiBQb3B1bGF0ZSB0aGUgbWFwcGluZywgbm9ib2R5IGtub3dzIHdlIGV4aXN0IHlldCAqLworCXNwaW5fbG9jaygmX21pbm9yX2xvY2spOworCW9sZF9tZCA9IGlkcl9yZXBsYWNlKCZfbWlub3JfaWRyLCBtZCwgbWlub3IpOworCXNwaW5fdW5sb2NrKCZfbWlub3JfbG9jayk7CisKKwlCVUdfT04ob2xkX21kICE9IE1JTk9SX0FMTE9DRUQpOwogCiAJcmV0dXJuIG1kOwogCkBAIC04OTgsMTMgKzk1NSwxNSBAQAogCWJsa19jbGVhbnVwX3F1ZXVlKG1kLT5xdWV1ZSk7CiAJZnJlZV9taW5vcihtaW5vcik7CiAgYmFkMToKKwltb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKKyBiYWQwOgogCWtmcmVlKG1kKTsKIAlyZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIHZvaWQgZnJlZV9kZXYoc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kKQogewotCXVuc2lnbmVkIGludCBtaW5vciA9IG1kLT5kaXNrLT5maXJzdF9taW5vcjsKKwlpbnQgbWlub3IgPSBtZC0+ZGlzay0+Zmlyc3RfbWlub3I7CiAKIAlpZiAobWQtPnN1c3BlbmRlZF9iZGV2KSB7CiAJCXRoYXdfYmRldihtZC0+c3VzcGVuZGVkX2JkZXYsIE5VTEwpOwpAQCAtOTE0LDggKzk3MywxNCBAQAogCW1lbXBvb2xfZGVzdHJveShtZC0+aW9fcG9vbCk7CiAJZGVsX2dlbmRpc2sobWQtPmRpc2spOwogCWZyZWVfbWlub3IobWlub3IpOworCisJc3Bpbl9sb2NrKCZfbWlub3JfbG9jayk7CisJbWQtPmRpc2stPnByaXZhdGVfZGF0YSA9IE5VTEw7CisJc3Bpbl91bmxvY2soJl9taW5vcl9sb2NrKTsKKwogCXB1dF9kaXNrKG1kLT5kaXNrKTsKIAlibGtfY2xlYW51cF9xdWV1ZShtZC0+cXVldWUpOworCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOwogCWtmcmVlKG1kKTsKIH0KIApAQCAtOTg0LDEyICsxMDQ5LDExIEBACiAvKgogICogQ29uc3RydWN0b3IgZm9yIGEgbmV3IGRldmljZS4KICAqLwotc3RhdGljIGludCBjcmVhdGVfYXV4KHVuc2lnbmVkIGludCBtaW5vciwgaW50IHBlcnNpc3RlbnQsCi0JCSAgICAgIHN0cnVjdCBtYXBwZWRfZGV2aWNlICoqcmVzdWx0KQoraW50IGRtX2NyZWF0ZShpbnQgbWlub3IsIHN0cnVjdCBtYXBwZWRfZGV2aWNlICoqcmVzdWx0KQogewogCXN0cnVjdCBtYXBwZWRfZGV2aWNlICptZDsKIAotCW1kID0gYWxsb2NfZGV2KG1pbm9yLCBwZXJzaXN0ZW50KTsKKwltZCA9IGFsbG9jX2RldihtaW5vcik7CiAJaWYgKCFtZCkKIAkJcmV0dXJuIC1FTlhJTzsKIApAQCAtOTk3LDE2ICsxMDYxLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGRtX2NyZWF0ZShzdHJ1Y3QgbWFwcGVkX2RldmljZSAqKnJlc3VsdCkKLXsKLQlyZXR1cm4gY3JlYXRlX2F1eCgwLCAwLCByZXN1bHQpOwotfQotCi1pbnQgZG1fY3JlYXRlX3dpdGhfbWlub3IodW5zaWduZWQgaW50IG1pbm9yLCBzdHJ1Y3QgbWFwcGVkX2RldmljZSAqKnJlc3VsdCkKLXsKLQlyZXR1cm4gY3JlYXRlX2F1eChtaW5vciwgMSwgcmVzdWx0KTsKLX0KLQogc3RhdGljIHN0cnVjdCBtYXBwZWRfZGV2aWNlICpkbV9maW5kX21kKGRldl90IGRldikKIHsKIAlzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQ7CkBAIC0xMDE1LDEzICsxMDY5LDE4IEBACiAJaWYgKE1BSk9SKGRldikgIT0gX21ham9yIHx8IG1pbm9yID49ICgxIDw8IE1JTk9SQklUUykpCiAJCXJldHVybiBOVUxMOwogCi0JbXV0ZXhfbG9jaygmX21pbm9yX2xvY2spOworCXNwaW5fbG9jaygmX21pbm9yX2xvY2spOwogCiAJbWQgPSBpZHJfZmluZCgmX21pbm9yX2lkciwgbWlub3IpOwotCWlmICghbWQgfHwgKGRtX2Rpc2sobWQpLT5maXJzdF9taW5vciAhPSBtaW5vcikpCisJaWYgKG1kICYmIChtZCA9PSBNSU5PUl9BTExPQ0VEIHx8CisJCSAgIChkbV9kaXNrKG1kKS0+Zmlyc3RfbWlub3IgIT0gbWlub3IpIHx8CisJCSAgIHRlc3RfYml0KERNRl9GUkVFSU5HLCAmbWQtPmZsYWdzKSkpIHsKIAkJbWQgPSBOVUxMOworCQlnb3RvIG91dDsKKwl9CiAKLQltdXRleF91bmxvY2soJl9taW5vcl9sb2NrKTsKK291dDoKKwlzcGluX3VubG9jaygmX21pbm9yX2xvY2spOwogCiAJcmV0dXJuIG1kOwogfQpAQCAtMTA1MSwxMiArMTExMCwyMyBAQAogCWF0b21pY19pbmMoJm1kLT5ob2xkZXJzKTsKIH0KIAorY29uc3QgY2hhciAqZG1fZGV2aWNlX25hbWUoc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kKQoreworCXJldHVybiBtZC0+bmFtZTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGRtX2RldmljZV9uYW1lKTsKKwogdm9pZCBkbV9wdXQoc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kKQogewogCXN0cnVjdCBkbV90YWJsZSAqbWFwOwogCi0JaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJm1kLT5ob2xkZXJzKSkgeworCUJVR19PTih0ZXN0X2JpdChETUZfRlJFRUlORywgJm1kLT5mbGFncykpOworCisJaWYgKGF0b21pY19kZWNfYW5kX2xvY2soJm1kLT5ob2xkZXJzLCAmX21pbm9yX2xvY2spKSB7CiAJCW1hcCA9IGRtX2dldF90YWJsZShtZCk7CisJCWlkcl9yZXBsYWNlKCZfbWlub3JfaWRyLCBNSU5PUl9BTExPQ0VELCBkbV9kaXNrKG1kKS0+Zmlyc3RfbWlub3IpOworCQlzZXRfYml0KERNRl9GUkVFSU5HLCAmbWQtPmZsYWdzKTsKKwkJc3Bpbl91bmxvY2soJl9taW5vcl9sb2NrKTsKIAkJaWYgKCFkbV9zdXNwZW5kZWQobWQpKSB7CiAJCQlkbV90YWJsZV9wcmVzdXNwZW5kX3RhcmdldHMobWFwKTsKIAkJCWRtX3RhYmxlX3Bvc3RzdXNwZW5kX3RhcmdldHMobWFwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0uaCBiL2RyaXZlcnMvbWQvZG0uaAppbmRleCBmZDkwYmM4Li4zYzAzYzBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLmgKKysrIGIvZHJpdmVycy9tZC9kbS5oCkBAIC0yLDcgKzIsNyBAQAogICogSW50ZXJuYWwgaGVhZGVyIGZpbGUgZm9yIGRldmljZSBtYXBwZXIKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIgU2lzdGluYSBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDA0IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA2IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIExHUEwuCiAgKi8KQEAgLTE3LDkgKzE3LDEwIEBACiAjaW5jbHVkZSA8bGludXgvaGRyZWcuaD4KIAogI2RlZmluZSBETV9OQU1FICJkZXZpY2UtbWFwcGVyIgotI2RlZmluZSBETVdBUk4oZiwgeC4uLikgcHJpbnRrKEtFUk5fV0FSTklORyBETV9OQU1FICI6ICIgZiAiXG4iICwgIyMgeCkKLSNkZWZpbmUgRE1FUlIoZiwgeC4uLikgcHJpbnRrKEtFUk5fRVJSIERNX05BTUUgIjogIiBmICJcbiIgLCAjIyB4KQotI2RlZmluZSBETUlORk8oZiwgeC4uLikgcHJpbnRrKEtFUk5fSU5GTyBETV9OQU1FICI6ICIgZiAiXG4iICwgIyMgeCkKKworI2RlZmluZSBETUVSUihmLCBhcmcuLi4pIHByaW50ayhLRVJOX0VSUiBETV9OQU1FICI6ICIgRE1fTVNHX1BSRUZJWCAiOiAiIGYgIlxuIiwgIyMgYXJnKQorI2RlZmluZSBETVdBUk4oZiwgYXJnLi4uKSBwcmludGsoS0VSTl9XQVJOSU5HIERNX05BTUUgIjogIiBETV9NU0dfUFJFRklYICI6ICIgZiAiXG4iLCAjIyBhcmcpCisjZGVmaW5lIERNSU5GTyhmLCBhcmcuLi4pIHByaW50ayhLRVJOX0lORk8gRE1fTkFNRSAiOiAiIERNX01TR19QUkVGSVggIjogIiBmICJcbiIsICMjIGFyZykKIAogI2RlZmluZSBETUVNSVQoeC4uLikgc3ogKz0gKChzeiA+PSBtYXhsZW4pID8gXAogCQkJICAwIDogc2NucHJpbnRmKHJlc3VsdCArIHN6LCBtYXhsZW4gLSBzeiwgeCkpCkBAIC0zOSw4MyArNDAsMTYgQEAKIH07CiAKIHN0cnVjdCBkbV90YWJsZTsKLXN0cnVjdCBtYXBwZWRfZGV2aWNlOwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBGdW5jdGlvbnMgZm9yIG1hbmlwdWxhdGluZyBhIHN0cnVjdCBtYXBwZWRfZGV2aWNlLgotICogRHJvcCB0aGUgcmVmZXJlbmNlIHdpdGggZG1fcHV0IHdoZW4geW91IGZpbmlzaCB3aXRoIHRoZSBvYmplY3QuCisgKiBJbnRlcm5hbCB0YWJsZSBmdW5jdGlvbnMuCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgZG1fY3JlYXRlKHN0cnVjdCBtYXBwZWRfZGV2aWNlICoqbWQpOwotaW50IGRtX2NyZWF0ZV93aXRoX21pbm9yKHVuc2lnbmVkIGludCBtaW5vciwgc3RydWN0IG1hcHBlZF9kZXZpY2UgKiptZCk7Ci12b2lkIGRtX3NldF9tZHB0cihzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQsIHZvaWQgKnB0cik7Ci12b2lkICpkbV9nZXRfbWRwdHIoc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kKTsKLXN0cnVjdCBtYXBwZWRfZGV2aWNlICpkbV9nZXRfbWQoZGV2X3QgZGV2KTsKLQotLyoKLSAqIFJlZmVyZW5jZSBjb3VudGluZyBmb3IgbWQuCi0gKi8KLXZvaWQgZG1fZ2V0KHN0cnVjdCBtYXBwZWRfZGV2aWNlICptZCk7Ci12b2lkIGRtX3B1dChzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQpOwotCi0vKgotICogQSBkZXZpY2UgY2FuIHN0aWxsIGJlIHVzZWQgd2hpbGUgc3VzcGVuZGVkLCBidXQgSS9PIGlzIGRlZmVycmVkLgotICovCi1pbnQgZG1fc3VzcGVuZChzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQsIGludCB3aXRoX2xvY2tmcyk7Ci1pbnQgZG1fcmVzdW1lKHN0cnVjdCBtYXBwZWRfZGV2aWNlICptZCk7Ci0KLS8qCi0gKiBUaGUgZGV2aWNlIG11c3QgYmUgc3VzcGVuZGVkIGJlZm9yZSBjYWxsaW5nIHRoaXMgbWV0aG9kLgotICovCi1pbnQgZG1fc3dhcF90YWJsZShzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQsIHN0cnVjdCBkbV90YWJsZSAqdCk7Ci0KLS8qCi0gKiBEcm9wIGEgcmVmZXJlbmNlIG9uIHRoZSB0YWJsZSB3aGVuIHlvdSd2ZSBmaW5pc2hlZCB3aXRoIHRoZQotICogcmVzdWx0LgotICovCi1zdHJ1Y3QgZG1fdGFibGUgKmRtX2dldF90YWJsZShzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQpOwotCi0vKgotICogRXZlbnQgZnVuY3Rpb25zLgotICovCi11aW50MzJfdCBkbV9nZXRfZXZlbnRfbnIoc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kKTsKLWludCBkbV93YWl0X2V2ZW50KHN0cnVjdCBtYXBwZWRfZGV2aWNlICptZCwgaW50IGV2ZW50X25yKTsKLQotLyoKLSAqIEluZm8gZnVuY3Rpb25zLgotICovCi1zdHJ1Y3QgZ2VuZGlzayAqZG1fZGlzayhzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQpOwotaW50IGRtX3N1c3BlbmRlZChzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQpOwotCi0vKgotICogR2VvbWV0cnkgZnVuY3Rpb25zLgotICovCi1pbnQgZG1fZ2V0X2dlb21ldHJ5KHN0cnVjdCBtYXBwZWRfZGV2aWNlICptZCwgc3RydWN0IGhkX2dlb21ldHJ5ICpnZW8pOwotaW50IGRtX3NldF9nZW9tZXRyeShzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQsIHN0cnVjdCBoZF9nZW9tZXRyeSAqZ2VvKTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogRnVuY3Rpb25zIGZvciBtYW5pcHVsYXRpbmcgYSB0YWJsZS4gIFRhYmxlcyBhcmUgYWxzbyByZWZlcmVuY2UKLSAqIGNvdW50ZWQuCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgZG1fdGFibGVfY3JlYXRlKHN0cnVjdCBkbV90YWJsZSAqKnJlc3VsdCwgaW50IG1vZGUsCi0JCSAgICB1bnNpZ25lZCBudW1fdGFyZ2V0cywgc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kKTsKLQotdm9pZCBkbV90YWJsZV9nZXQoc3RydWN0IGRtX3RhYmxlICp0KTsKLXZvaWQgZG1fdGFibGVfcHV0KHN0cnVjdCBkbV90YWJsZSAqdCk7Ci0KLWludCBkbV90YWJsZV9hZGRfdGFyZ2V0KHN0cnVjdCBkbV90YWJsZSAqdCwgY29uc3QgY2hhciAqdHlwZSwKLQkJCXNlY3Rvcl90IHN0YXJ0LAlzZWN0b3JfdCBsZW4sIGNoYXIgKnBhcmFtcyk7Ci1pbnQgZG1fdGFibGVfY29tcGxldGUoc3RydWN0IGRtX3RhYmxlICp0KTsKIHZvaWQgZG1fdGFibGVfZXZlbnRfY2FsbGJhY2soc3RydWN0IGRtX3RhYmxlICp0LAogCQkJICAgICB2b2lkICgqZm4pKHZvaWQgKiksIHZvaWQgKmNvbnRleHQpOwotdm9pZCBkbV90YWJsZV9ldmVudChzdHJ1Y3QgZG1fdGFibGUgKnQpOwotc2VjdG9yX3QgZG1fdGFibGVfZ2V0X3NpemUoc3RydWN0IGRtX3RhYmxlICp0KTsKIHN0cnVjdCBkbV90YXJnZXQgKmRtX3RhYmxlX2dldF90YXJnZXQoc3RydWN0IGRtX3RhYmxlICp0LCB1bnNpZ25lZCBpbnQgaW5kZXgpOwogc3RydWN0IGRtX3RhcmdldCAqZG1fdGFibGVfZmluZF90YXJnZXQoc3RydWN0IGRtX3RhYmxlICp0LCBzZWN0b3JfdCBzZWN0b3IpOwogdm9pZCBkbV90YWJsZV9zZXRfcmVzdHJpY3Rpb25zKHN0cnVjdCBkbV90YWJsZSAqdCwgc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpOwotdW5zaWduZWQgaW50IGRtX3RhYmxlX2dldF9udW1fdGFyZ2V0cyhzdHJ1Y3QgZG1fdGFibGUgKnQpOwogc3RydWN0IGxpc3RfaGVhZCAqZG1fdGFibGVfZ2V0X2RldmljZXMoc3RydWN0IGRtX3RhYmxlICp0KTsKLWludCBkbV90YWJsZV9nZXRfbW9kZShzdHJ1Y3QgZG1fdGFibGUgKnQpOwotc3RydWN0IG1hcHBlZF9kZXZpY2UgKmRtX3RhYmxlX2dldF9tZChzdHJ1Y3QgZG1fdGFibGUgKnQpOwogdm9pZCBkbV90YWJsZV9wcmVzdXNwZW5kX3RhcmdldHMoc3RydWN0IGRtX3RhYmxlICp0KTsKIHZvaWQgZG1fdGFibGVfcG9zdHN1c3BlbmRfdGFyZ2V0cyhzdHJ1Y3QgZG1fdGFibGUgKnQpOwogdm9pZCBkbV90YWJsZV9yZXN1bWVfdGFyZ2V0cyhzdHJ1Y3QgZG1fdGFibGUgKnQpOwpAQCAtMTMzLDcgKzY3LDYgQEAKIGludCBkbV90YXJnZXRfaXRlcmF0ZSh2b2lkICgqaXRlcl9mdW5jKShzdHJ1Y3QgdGFyZ2V0X3R5cGUgKnR0LAogCQkJCQl2b2lkICpwYXJhbSksIHZvaWQgKnBhcmFtKTsKIAotCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBVc2VmdWwgaW5saW5lcy4KICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTE5MSw1ICsxMjQsNyBAQAogCiB2b2lkICpkbV92Y2FsbG9jKHVuc2lnbmVkIGxvbmcgbm1lbWIsIHVuc2lnbmVkIGxvbmcgZWxlbV9zaXplKTsKIHVuaW9uIG1hcF9pbmZvICpkbV9nZXRfbWFwaW5mbyhzdHJ1Y3QgYmlvICpiaW8pOworaW50IGRtX29wZW5fY291bnQoc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kKTsKK2ludCBkbV9sb2NrX2Zvcl9kZWxldGlvbihzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQva2NvcHlkLmMgYi9kcml2ZXJzL21kL2tjb3B5ZC5jCmluZGV4IDcyNDgwYTQuLjczYWI4NzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQva2NvcHlkLmMKKysrIGIvZHJpdmVycy9tZC9rY29weWQuYwpAQCAtMzE0LDcgKzMxNCw3IEBACiAKIAlpZiAoZXJyb3IpIHsKIAkJaWYgKGpvYi0+cncgPT0gV1JJVEUpCi0JCQlqb2ItPndyaXRlX2VyciAmPSBlcnJvcjsKKwkJCWpvYi0+d3JpdGVfZXJyIHw9IGVycm9yOwogCQllbHNlCiAJCQlqb2ItPnJlYWRfZXJyID0gMTsKIApAQCAtNDYwLDcgKzQ2MCw3IEBACiAJCWpvYi0+cmVhZF9lcnIgPSAxOwogCiAJaWYgKHdyaXRlX2VycikKLQkJam9iLT53cml0ZV9lcnIgJj0gd3JpdGVfZXJyOworCQlqb2ItPndyaXRlX2VyciB8PSB3cml0ZV9lcnI7CiAKIAkvKgogCSAqIE9ubHkgZGlzcGF0Y2ggbW9yZSB3b3JrIGlmIHRoZXJlIGhhc24ndCBiZWVuIGFuIGVycm9yLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9saW5lYXIuYyBiL2RyaXZlcnMvbWQvbGluZWFyLmMKaW5kZXggNzc3NTg1NDUuLmZmODNjOWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvbGluZWFyLmMKKysrIGIvZHJpdmVycy9tZC9saW5lYXIuYwpAQCAtMTExLDcgKzExMSw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBsaW5lYXJfcnVuIChtZGRldl90ICptZGRldikKK3N0YXRpYyBsaW5lYXJfY29uZl90ICpsaW5lYXJfY29uZihtZGRldl90ICptZGRldiwgaW50IHJhaWRfZGlza3MpCiB7CiAJbGluZWFyX2NvbmZfdCAqY29uZjsKIAlkZXZfaW5mb190ICoqdGFibGU7CkBAIC0xMjEsMjAgKzEyMSwyMSBAQAogCXNlY3Rvcl90IGN1cnJfb2Zmc2V0OwogCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKIAotCWNvbmYgPSBremFsbG9jIChzaXplb2YgKCpjb25mKSArIG1kZGV2LT5yYWlkX2Rpc2tzKnNpemVvZihkZXZfaW5mb190KSwKKwljb25mID0ga3phbGxvYyAoc2l6ZW9mICgqY29uZikgKyByYWlkX2Rpc2tzKnNpemVvZihkZXZfaW5mb190KSwKIAkJCUdGUF9LRVJORUwpOwogCWlmICghY29uZikKLQkJZ290byBvdXQ7CisJCXJldHVybiBOVUxMOworCiAJbWRkZXYtPnByaXZhdGUgPSBjb25mOwogCiAJY250ID0gMDsKLQltZGRldi0+YXJyYXlfc2l6ZSA9IDA7CisJY29uZi0+YXJyYXlfc2l6ZSA9IDA7CiAKIAlJVEVSQVRFX1JERVYobWRkZXYscmRldix0bXApIHsKIAkJaW50IGogPSByZGV2LT5yYWlkX2Rpc2s7CiAJCWRldl9pbmZvX3QgKmRpc2sgPSBjb25mLT5kaXNrcyArIGo7CiAKLQkJaWYgKGogPCAwIHx8IGogPiBtZGRldi0+cmFpZF9kaXNrcyB8fCBkaXNrLT5yZGV2KSB7CisJCWlmIChqIDwgMCB8fCBqID4gcmFpZF9kaXNrcyB8fCBkaXNrLT5yZGV2KSB7CiAJCQlwcmludGsoImxpbmVhcjogZGlzayBudW1iZXJpbmcgcHJvYmxlbS4gQWJvcnRpbmchXG4iKTsKIAkJCWdvdG8gb3V0OwogCQl9CkBAIC0xNTIsMTEgKzE1MywxMSBAQAogCQkJYmxrX3F1ZXVlX21heF9zZWN0b3JzKG1kZGV2LT5xdWV1ZSwgUEFHRV9TSVpFPj45KTsKIAogCQlkaXNrLT5zaXplID0gcmRldi0+c2l6ZTsKLQkJbWRkZXYtPmFycmF5X3NpemUgKz0gcmRldi0+c2l6ZTsKKwkJY29uZi0+YXJyYXlfc2l6ZSArPSByZGV2LT5zaXplOwogCiAJCWNudCsrOwogCX0KLQlpZiAoY250ICE9IG1kZGV2LT5yYWlkX2Rpc2tzKSB7CisJaWYgKGNudCAhPSByYWlkX2Rpc2tzKSB7CiAJCXByaW50aygibGluZWFyOiBub3QgZW5vdWdoIGRyaXZlcyBwcmVzZW50LiBBYm9ydGluZyFcbiIpOwogCQlnb3RvIG91dDsKIAl9CkBAIC0yMDAsNyArMjAxLDcgQEAKIAkJdW5zaWduZWQgcm91bmQ7CiAJCXVuc2lnbmVkIGxvbmcgYmFzZTsKIAotCQlzeiA9IG1kZGV2LT5hcnJheV9zaXplID4+IGNvbmYtPnByZXNoaWZ0OworCQlzeiA9IGNvbmYtPmFycmF5X3NpemUgPj4gY29uZi0+cHJlc2hpZnQ7CiAJCXN6ICs9IDE7IC8qIGZvcmNlIHJvdW5kLXVwICovCiAJCWJhc2UgPSBjb25mLT5oYXNoX3NwYWNpbmcgPj4gY29uZi0+cHJlc2hpZnQ7CiAJCXJvdW5kID0gc2VjdG9yX2RpdihzeiwgYmFzZSk7CkBAIC0yNDcsMTQgKzI0OCw1NiBAQAogCiAJQlVHX09OKHRhYmxlIC0gY29uZi0+aGFzaF90YWJsZSA+IG5iX3pvbmUpOwogCisJcmV0dXJuIGNvbmY7CisKK291dDoKKwlrZnJlZShjb25mKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBsaW5lYXJfcnVuIChtZGRldl90ICptZGRldikKK3sKKwlsaW5lYXJfY29uZl90ICpjb25mOworCisJY29uZiA9IGxpbmVhcl9jb25mKG1kZGV2LCBtZGRldi0+cmFpZF9kaXNrcyk7CisKKwlpZiAoIWNvbmYpCisJCXJldHVybiAxOworCW1kZGV2LT5wcml2YXRlID0gY29uZjsKKwltZGRldi0+YXJyYXlfc2l6ZSA9IGNvbmYtPmFycmF5X3NpemU7CisKIAlibGtfcXVldWVfbWVyZ2VfYnZlYyhtZGRldi0+cXVldWUsIGxpbmVhcl9tZXJnZWFibGVfYnZlYyk7CiAJbWRkZXYtPnF1ZXVlLT51bnBsdWdfZm4gPSBsaW5lYXJfdW5wbHVnOwogCW1kZGV2LT5xdWV1ZS0+aXNzdWVfZmx1c2hfZm4gPSBsaW5lYXJfaXNzdWVfZmx1c2g7CiAJcmV0dXJuIDA7Cit9CiAKLW91dDoKLQlrZnJlZShjb25mKTsKLQlyZXR1cm4gMTsKK3N0YXRpYyBpbnQgbGluZWFyX2FkZChtZGRldl90ICptZGRldiwgbWRrX3JkZXZfdCAqcmRldikKK3sKKwkvKiBBZGRpbmcgYSBkcml2ZSB0byBhIGxpbmVhciBhcnJheSBhbGxvd3MgdGhlIGFycmF5IHRvIGdyb3cuCisJICogSXQgaXMgcGVybWl0dGVkIGlmIHRoZSBuZXcgZHJpdmUgaGFzIGEgbWF0Y2hpbmcgc3VwZXJibG9jaworCSAqIGFscmVhZHkgb24gaXQsIHdpdGggcmFpZF9kaXNrIGVxdWFsIHRvIHJhaWRfZGlza3MuCisJICogSXQgaXMgYWNoaWV2ZWQgYnkgY3JlYXRpbmcgYSBuZXcgbGluZWFyX3ByaXZhdGVfZGF0YSBzdHJ1Y3R1cmUKKwkgKiBhbmQgc3dhcHBpbmcgaXQgaW4gaW4tcGxhY2Ugb2YgdGhlIGN1cnJlbnQgb25lLgorCSAqIFRoZSBjdXJyZW50IG9uZSBpcyBuZXZlciBmcmVlZCB1bnRpbCB0aGUgYXJyYXkgaXMgc3RvcHBlZC4KKwkgKiBUaGlzIGF2b2lkcyByYWNlcy4KKwkgKi8KKwlsaW5lYXJfY29uZl90ICpuZXdjb25mOworCisJaWYgKHJkZXYtPnJhaWRfZGlzayAhPSBtZGRldi0+cmFpZF9kaXNrcykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwluZXdjb25mID0gbGluZWFyX2NvbmYobWRkZXYsbWRkZXYtPnJhaWRfZGlza3MrMSk7CisKKwlpZiAoIW5ld2NvbmYpCisJCXJldHVybiAtRU5PTUVNOworCisJbmV3Y29uZi0+cHJldiA9IG1kZGV2X3RvX2NvbmYobWRkZXYpOworCW1kZGV2LT5wcml2YXRlID0gbmV3Y29uZjsKKwltZGRldi0+cmFpZF9kaXNrcysrOworCW1kZGV2LT5hcnJheV9zaXplID0gbmV3Y29uZi0+YXJyYXlfc2l6ZTsKKwlzZXRfY2FwYWNpdHkobWRkZXYtPmdlbmRpc2ssIG1kZGV2LT5hcnJheV9zaXplIDw8IDEpOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGxpbmVhcl9zdG9wIChtZGRldl90ICptZGRldikKQEAgLTI2Miw4ICszMDUsMTIgQEAKIAlsaW5lYXJfY29uZl90ICpjb25mID0gbWRkZXZfdG9fY29uZihtZGRldik7CiAgIAogCWJsa19zeW5jX3F1ZXVlKG1kZGV2LT5xdWV1ZSk7IC8qIHRoZSB1bnBsdWcgZm4gcmVmZXJlbmNlcyAnY29uZicqLwotCWtmcmVlKGNvbmYtPmhhc2hfdGFibGUpOwotCWtmcmVlKGNvbmYpOworCWRvIHsKKwkJbGluZWFyX2NvbmZfdCAqdCA9IGNvbmYtPnByZXY7CisJCWtmcmVlKGNvbmYtPmhhc2hfdGFibGUpOworCQlrZnJlZShjb25mKTsKKwkJY29uZiA9IHQ7CisJfSB3aGlsZSAoY29uZik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTM2MCw2ICs0MDcsNyBAQAogCS5ydW4JCT0gbGluZWFyX3J1biwKIAkuc3RvcAkJPSBsaW5lYXJfc3RvcCwKIAkuc3RhdHVzCQk9IGxpbmVhcl9zdGF0dXMsCisJLmhvdF9hZGRfZGlzawk9IGxpbmVhcl9hZGQsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBsaW5lYXJfaW5pdCAodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvbWQuYyBiL2RyaXZlcnMvbWQvbWQuYwppbmRleCBmMTliODc0Li4zMDYyNjhlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL21kLmMKKysrIGIvZHJpdmVycy9tZC9tZC5jCkBAIC00NCw2ICs0NCw3IEBACiAjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgogI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAKQEAgLTcyLDYgKzczLDEwIEBACiBzdGF0aWMgTElTVF9IRUFEKHBlcnNfbGlzdCk7CiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHBlcnNfbG9jayk7CiAKK3N0YXRpYyB2b2lkIG1kX3ByaW50X2RldmljZXModm9pZCk7CisKKyNkZWZpbmUgTURfQlVHKHguLi4pIHsgcHJpbnRrKCJtZDogYnVnIGluIGZpbGUgJXMsIGxpbmUgJWRcbiIsIF9fRklMRV9fLCBfX0xJTkVfXyk7IG1kX3ByaW50X2RldmljZXMoKTsgfQorCiAvKgogICogQ3VycmVudCBSQUlELTEsNCw1IHBhcmFsbGVsIHJlY29uc3RydWN0aW9uICdndWFyYW50ZWVkIHNwZWVkIGxpbWl0JwogICogaXMgMTAwMCBLQi9zZWMsIHNvIHRoZSBleHRyYSBzeXN0ZW0gbG9hZCBkb2VzIG5vdCBzaG93IHVwIHRoYXQgbXVjaC4KQEAgLTE3MCw3ICsxNzUsNyBAQAogLyogQWx0ZXJuYXRlIHZlcnNpb24gdGhhdCBjYW4gYmUgY2FsbGVkIGZyb20gaW50ZXJydXB0cwogICogd2hlbiBjYWxsaW5nIHN5c2ZzX25vdGlmeSBpc24ndCBuZWVkZWQuCiAgKi8KLXZvaWQgbWRfbmV3X2V2ZW50X2luaW50cihtZGRldl90ICptZGRldikKK3N0YXRpYyB2b2lkIG1kX25ld19ldmVudF9pbmludHIobWRkZXZfdCAqbWRkZXYpCiB7CiAJYXRvbWljX2luYygmbWRfZXZlbnRfY291bnQpOwogCXdha2VfdXAoJm1kX2V2ZW50X3dhaXRlcnMpOwpAQCAtNzMyLDYgKzczNyw3IEBACiB7CiAJbWRwX2Rpc2tfdCAqZGVzYzsKIAltZHBfc3VwZXJfdCAqc2IgPSAobWRwX3N1cGVyX3QgKilwYWdlX2FkZHJlc3MocmRldi0+c2JfcGFnZSk7CisJX191NjQgZXYxID0gbWRfZXZlbnQoc2IpOwogCiAJcmRldi0+cmFpZF9kaXNrID0gLTE7CiAJcmRldi0+ZmxhZ3MgPSAwOwpAQCAtNzQ4LDcgKzc1NCw3IEBACiAJCW1kZGV2LT5sYXlvdXQgPSBzYi0+bGF5b3V0OwogCQltZGRldi0+cmFpZF9kaXNrcyA9IHNiLT5yYWlkX2Rpc2tzOwogCQltZGRldi0+c2l6ZSA9IHNiLT5zaXplOwotCQltZGRldi0+ZXZlbnRzID0gbWRfZXZlbnQoc2IpOworCQltZGRldi0+ZXZlbnRzID0gZXYxOwogCQltZGRldi0+Yml0bWFwX29mZnNldCA9IDA7CiAJCW1kZGV2LT5kZWZhdWx0X2JpdG1hcF9vZmZzZXQgPSBNRF9TQl9CWVRFUyA+PiA5OwogCkBAIC03OTcsNyArODAzLDYgQEAKIAogCX0gZWxzZSBpZiAobWRkZXYtPnBlcnMgPT0gTlVMTCkgewogCQkvKiBJbnNpc3Qgb24gZ29vZCBldmVudCBjb3VudGVyIHdoaWxlIGFzc2VtYmxpbmcgKi8KLQkJX191NjQgZXYxID0gbWRfZXZlbnQoc2IpOwogCQkrK2V2MTsKIAkJaWYgKGV2MSA8IG1kZGV2LT5ldmVudHMpIAogCQkJcmV0dXJuIC1FSU5WQUw7CkBAIC04MDUsMTkgKzgxMCwyMSBAQAogCQkvKiBpZiBhZGRpbmcgdG8gYXJyYXkgd2l0aCBhIGJpdG1hcCwgdGhlbiB3ZSBjYW4gYWNjZXB0IGFuCiAJCSAqIG9sZGVyIGRldmljZSAuLi4gYnV0IG5vdCB0b28gb2xkLgogCQkgKi8KLQkJX191NjQgZXYxID0gbWRfZXZlbnQoc2IpOwogCQlpZiAoZXYxIDwgbWRkZXYtPmJpdG1hcC0+ZXZlbnRzX2NsZWFyZWQpCiAJCQlyZXR1cm4gMDsKLQl9IGVsc2UgLyoganVzdCBhIGhvdC1hZGQgb2YgYSBuZXcgZGV2aWNlLCBsZWF2ZSByYWlkX2Rpc2sgYXQgLTEgKi8KLQkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJaWYgKGV2MSA8IG1kZGV2LT5ldmVudHMpCisJCQkvKiBqdXN0IGEgaG90LWFkZCBvZiBhIG5ldyBkZXZpY2UsIGxlYXZlIHJhaWRfZGlzayBhdCAtMSAqLworCQkJcmV0dXJuIDA7CisJfQogCiAJaWYgKG1kZGV2LT5sZXZlbCAhPSBMRVZFTF9NVUxUSVBBVEgpIHsKIAkJZGVzYyA9IHNiLT5kaXNrcyArIHJkZXYtPmRlc2NfbnI7CiAKIAkJaWYgKGRlc2MtPnN0YXRlICYgKDE8PE1EX0RJU0tfRkFVTFRZKSkKIAkJCXNldF9iaXQoRmF1bHR5LCAmcmRldi0+ZmxhZ3MpOwotCQllbHNlIGlmIChkZXNjLT5zdGF0ZSAmICgxPDxNRF9ESVNLX1NZTkMpICYmCi0JCQkgZGVzYy0+cmFpZF9kaXNrIDwgbWRkZXYtPnJhaWRfZGlza3MpIHsKKwkJZWxzZSBpZiAoZGVzYy0+c3RhdGUgJiAoMTw8TURfRElTS19TWU5DKSAvKiAmJgorCQkJICAgIGRlc2MtPnJhaWRfZGlzayA8IG1kZGV2LT5yYWlkX2Rpc2tzICovKSB7CiAJCQlzZXRfYml0KEluX3N5bmMsICZyZGV2LT5mbGFncyk7CiAJCQlyZGV2LT5yYWlkX2Rpc2sgPSBkZXNjLT5yYWlkX2Rpc2s7CiAJCX0KQEAgLTExMDAsNiArMTEwNyw3IEBACiBzdGF0aWMgaW50IHN1cGVyXzFfdmFsaWRhdGUobWRkZXZfdCAqbWRkZXYsIG1ka19yZGV2X3QgKnJkZXYpCiB7CiAJc3RydWN0IG1kcF9zdXBlcmJsb2NrXzEgKnNiID0gKHN0cnVjdCBtZHBfc3VwZXJibG9ja18xKilwYWdlX2FkZHJlc3MocmRldi0+c2JfcGFnZSk7CisJX191NjQgZXYxID0gbGU2NF90b19jcHUoc2ItPmV2ZW50cyk7CiAKIAlyZGV2LT5yYWlkX2Rpc2sgPSAtMTsKIAlyZGV2LT5mbGFncyA9IDA7CkBAIC0xMTE1LDcgKzExMjMsNyBAQAogCQltZGRldi0+bGF5b3V0ID0gbGUzMl90b19jcHUoc2ItPmxheW91dCk7CiAJCW1kZGV2LT5yYWlkX2Rpc2tzID0gbGUzMl90b19jcHUoc2ItPnJhaWRfZGlza3MpOwogCQltZGRldi0+c2l6ZSA9IGxlNjRfdG9fY3B1KHNiLT5zaXplKS8yOwotCQltZGRldi0+ZXZlbnRzID0gbGU2NF90b19jcHUoc2ItPmV2ZW50cyk7CisJCW1kZGV2LT5ldmVudHMgPSBldjE7CiAJCW1kZGV2LT5iaXRtYXBfb2Zmc2V0ID0gMDsKIAkJbWRkZXYtPmRlZmF1bHRfYml0bWFwX29mZnNldCA9IDEwMjQgPj4gOTsKIAkJCkBAIC0xMTQ5LDcgKzExNTcsNiBAQAogCiAJfSBlbHNlIGlmIChtZGRldi0+cGVycyA9PSBOVUxMKSB7CiAJCS8qIEluc2lzdCBvZiBnb29kIGV2ZW50IGNvdW50ZXIgd2hpbGUgYXNzZW1ibGluZyAqLwotCQlfX3U2NCBldjEgPSBsZTY0X3RvX2NwdShzYi0+ZXZlbnRzKTsKIAkJKytldjE7CiAJCWlmIChldjEgPCBtZGRldi0+ZXZlbnRzKQogCQkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xMTU3LDEyICsxMTY0LDEzIEBACiAJCS8qIElmIGFkZGluZyB0byBhcnJheSB3aXRoIGEgYml0bWFwLCB0aGVuIHdlIGNhbiBhY2NlcHQgYW4KIAkJICogb2xkZXIgZGV2aWNlLCBidXQgbm90IHRvbyBvbGQuCiAJCSAqLwotCQlfX3U2NCBldjEgPSBsZTY0X3RvX2NwdShzYi0+ZXZlbnRzKTsKIAkJaWYgKGV2MSA8IG1kZGV2LT5iaXRtYXAtPmV2ZW50c19jbGVhcmVkKQogCQkJcmV0dXJuIDA7Ci0JfSBlbHNlIC8qIGp1c3QgYSBob3QtYWRkIG9mIGEgbmV3IGRldmljZSwgbGVhdmUgcmFpZF9kaXNrIGF0IC0xICovCi0JCXJldHVybiAwOwotCisJfSBlbHNlIHsKKwkJaWYgKGV2MSA8IG1kZGV2LT5ldmVudHMpCisJCQkvKiBqdXN0IGEgaG90LWFkZCBvZiBhIG5ldyBkZXZpY2UsIGxlYXZlIHJhaWRfZGlzayBhdCAtMSAqLworCQkJcmV0dXJuIDA7CisJfQogCWlmIChtZGRldi0+bGV2ZWwgIT0gTEVWRUxfTVVMVElQQVRIKSB7CiAJCWludCByb2xlOwogCQlyZGV2LT5kZXNjX25yID0gbGUzMl90b19jcHUoc2ItPmRldl9udW1iZXIpOwpAQCAtMTE3NCw3ICsxMTgyLDExIEBACiAJCQlzZXRfYml0KEZhdWx0eSwgJnJkZXYtPmZsYWdzKTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJc2V0X2JpdChJbl9zeW5jLCAmcmRldi0+ZmxhZ3MpOworCQkJaWYgKChsZTMyX3RvX2NwdShzYi0+ZmVhdHVyZV9tYXApICYKKwkJCSAgICAgTURfRkVBVFVSRV9SRUNPVkVSWV9PRkZTRVQpKQorCQkJCXJkZXYtPnJlY292ZXJ5X29mZnNldCA9IGxlNjRfdG9fY3B1KHNiLT5yZWNvdmVyeV9vZmZzZXQpOworCQkJZWxzZQorCQkJCXNldF9iaXQoSW5fc3luYywgJnJkZXYtPmZsYWdzKTsKIAkJCXJkZXYtPnJhaWRfZGlzayA9IHJvbGU7CiAJCQlicmVhazsKIAkJfQpAQCAtMTE5OCw2ICsxMjEwLDcgQEAKIAogCXNiLT5mZWF0dXJlX21hcCA9IDA7CiAJc2ItPnBhZDAgPSAwOworCXNiLT5yZWNvdmVyeV9vZmZzZXQgPSBjcHVfdG9fbGU2NCgwKTsKIAltZW1zZXQoc2ItPnBhZDEsIDAsIHNpemVvZihzYi0+cGFkMSkpOwogCW1lbXNldChzYi0+cGFkMiwgMCwgc2l6ZW9mKHNiLT5wYWQyKSk7CiAJbWVtc2V0KHNiLT5wYWQzLCAwLCBzaXplb2Yoc2ItPnBhZDMpKTsKQEAgLTEyMTgsNiArMTIzMSwxNCBAQAogCQlzYi0+Yml0bWFwX29mZnNldCA9IGNwdV90b19sZTMyKChfX3UzMiltZGRldi0+Yml0bWFwX29mZnNldCk7CiAJCXNiLT5mZWF0dXJlX21hcCA9IGNwdV90b19sZTMyKE1EX0ZFQVRVUkVfQklUTUFQX09GRlNFVCk7CiAJfQorCisJaWYgKHJkZXYtPnJhaWRfZGlzayA+PSAwICYmCisJICAgICF0ZXN0X2JpdChJbl9zeW5jLCAmcmRldi0+ZmxhZ3MpICYmCisJICAgIHJkZXYtPnJlY292ZXJ5X29mZnNldCA+IDApIHsKKwkJc2ItPmZlYXR1cmVfbWFwIHw9IGNwdV90b19sZTMyKE1EX0ZFQVRVUkVfUkVDT1ZFUllfT0ZGU0VUKTsKKwkJc2ItPnJlY292ZXJ5X29mZnNldCA9IGNwdV90b19sZTY0KHJkZXYtPnJlY292ZXJ5X29mZnNldCk7CisJfQorCiAJaWYgKG1kZGV2LT5yZXNoYXBlX3Bvc2l0aW9uICE9IE1heFNlY3RvcikgewogCQlzYi0+ZmVhdHVyZV9tYXAgfD0gY3B1X3RvX2xlMzIoTURfRkVBVFVSRV9SRVNIQVBFX0FDVElWRSk7CiAJCXNiLT5yZXNoYXBlX3Bvc2l0aW9uID0gY3B1X3RvX2xlNjQobWRkZXYtPnJlc2hhcGVfcG9zaXRpb24pOwpAQCAtMTI0MiwxMSArMTI2MywxMiBAQAogCQkJc2ItPmRldl9yb2xlc1tpXSA9IGNwdV90b19sZTE2KDB4ZmZmZSk7CiAJCWVsc2UgaWYgKHRlc3RfYml0KEluX3N5bmMsICZyZGV2Mi0+ZmxhZ3MpKQogCQkJc2ItPmRldl9yb2xlc1tpXSA9IGNwdV90b19sZTE2KHJkZXYyLT5yYWlkX2Rpc2spOworCQllbHNlIGlmIChyZGV2Mi0+cmFpZF9kaXNrID49IDAgJiYgcmRldjItPnJlY292ZXJ5X29mZnNldCA+IDApCisJCQlzYi0+ZGV2X3JvbGVzW2ldID0gY3B1X3RvX2xlMTYocmRldjItPnJhaWRfZGlzayk7CiAJCWVsc2UKIAkJCXNiLT5kZXZfcm9sZXNbaV0gPSBjcHVfdG9fbGUxNigweGZmZmYpOwogCX0KIAotCXNiLT5yZWNvdmVyeV9vZmZzZXQgPSBjcHVfdG9fbGU2NCgwKTsgLyogbm90IHN1cHBvcnRlZCB5ZXQgKi8KIAlzYi0+c2JfY3N1bSA9IGNhbGNfc2JfMV9jc3VtKHNiKTsKIH0KIApAQCAtMTUwNyw3ICsxNTI5LDcgQEAKIAkJcHJpbnRrKEtFUk5fSU5GTyAibWQ6IG5vIHJkZXYgc3VwZXJibG9jayFcbiIpOwogfQogCi12b2lkIG1kX3ByaW50X2RldmljZXModm9pZCkKK3N0YXRpYyB2b2lkIG1kX3ByaW50X2RldmljZXModm9pZCkKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICp0bXAsICp0bXAyOwogCW1ka19yZGV2X3QgKnJkZXY7CkBAIC0xNTM2LDE1ICsxNTU4LDMwIEBACiB9CiAKIAotc3RhdGljIHZvaWQgc3luY19zYnMobWRkZXZfdCAqIG1kZGV2KQorc3RhdGljIHZvaWQgc3luY19zYnMobWRkZXZfdCAqIG1kZGV2LCBpbnQgbm9zcGFyZXMpCiB7CisJLyogVXBkYXRlIGVhY2ggc3VwZXJibG9jayAoaW4tbWVtb3J5IGltYWdlKSwgYnV0CisJICogaWYgd2UgYXJlIGFsbG93ZWQgdG8sIHNraXAgc3BhcmVzIHdoaWNoIGFscmVhZHkKKwkgKiBoYXZlIHRoZSByaWdodCBldmVudCBjb3VudGVyLCBvciBoYXZlIG9uZSBlYXJsaWVyCisJICogKHdoaWNoIHdvdWxkIG1lYW4gdGhleSBhcmVuJ3QgYmVpbmcgbWFya2VkIGFzIGRpcnR5CisJICogd2l0aCB0aGUgcmVzdCBvZiB0aGUgYXJyYXkpCisJICovCiAJbWRrX3JkZXZfdCAqcmRldjsKIAlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CiAKIAlJVEVSQVRFX1JERVYobWRkZXYscmRldix0bXApIHsKLQkJc3VwZXJfdHlwZXNbbWRkZXYtPm1ham9yX3ZlcnNpb25dLgotCQkJc3luY19zdXBlcihtZGRldiwgcmRldik7Ci0JCXJkZXYtPnNiX2xvYWRlZCA9IDE7CisJCWlmIChyZGV2LT5zYl9ldmVudHMgPT0gbWRkZXYtPmV2ZW50cyB8fAorCQkgICAgKG5vc3BhcmVzICYmCisJCSAgICAgcmRldi0+cmFpZF9kaXNrIDwgMCAmJgorCQkgICAgIChyZGV2LT5zYl9ldmVudHMmMSk9PTAgJiYKKwkJICAgICByZGV2LT5zYl9ldmVudHMrMSA9PSBtZGRldi0+ZXZlbnRzKSkgeworCQkJLyogRG9uJ3QgdXBkYXRlIHRoaXMgc3VwZXJibG9jayAqLworCQkJcmRldi0+c2JfbG9hZGVkID0gMjsKKwkJfSBlbHNlIHsKKwkJCXN1cGVyX3R5cGVzW21kZGV2LT5tYWpvcl92ZXJzaW9uXS4KKwkJCQlzeW5jX3N1cGVyKG1kZGV2LCByZGV2KTsKKwkJCXJkZXYtPnNiX2xvYWRlZCA9IDE7CisJCX0KIAl9CiB9CiAKQEAgLTE1NTQsMTIgKzE1OTEsNDIgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CiAJbWRrX3JkZXZfdCAqcmRldjsKIAlpbnQgc3luY19yZXE7CisJaW50IG5vc3BhcmVzID0gMDsKIAogcmVwZWF0OgogCXNwaW5fbG9ja19pcnEoJm1kZGV2LT53cml0ZV9sb2NrKTsKIAlzeW5jX3JlcSA9IG1kZGV2LT5pbl9zeW5jOwogCW1kZGV2LT51dGltZSA9IGdldF9zZWNvbmRzKCk7Ci0JbWRkZXYtPmV2ZW50cyArKzsKKwlpZiAobWRkZXYtPnNiX2RpcnR5ID09IDMpCisJCS8qIGp1c3QgYSBjbGVhbjwtPiBkaXJ0eSB0cmFuc2l0aW9uLCBwb3NzaWJseSBsZWF2ZSBzcGFyZXMgYWxvbmUsCisJCSAqIHRob3VnaCBpZiBldmVudHMgaXNuJ3QgdGhlIHJpZ2h0IGV2ZW4vb2RkLCB3ZSB3aWxsIGhhdmUgdG8gZG8KKwkJICogc3BhcmVzIGFmdGVyIGFsbAorCQkgKi8KKwkJbm9zcGFyZXMgPSAxOworCisJLyogSWYgdGhpcyBpcyBqdXN0IGEgZGlydHk8LT5jbGVhbiB0cmFuc2l0aW9uLCBhbmQgdGhlIGFycmF5IGlzIGNsZWFuCisJICogYW5kICdldmVudHMnIGlzIG9kZCwgd2UgY2FuIHJvbGwgYmFjayB0byB0aGUgcHJldmlvdXMgY2xlYW4gc3RhdGUgKi8KKwlpZiAobWRkZXYtPnNiX2RpcnR5ID09IDMKKwkgICAgJiYgKG1kZGV2LT5pbl9zeW5jICYmIG1kZGV2LT5yZWNvdmVyeV9jcCA9PSBNYXhTZWN0b3IpCisJICAgICYmIChtZGRldi0+ZXZlbnRzICYgMSkpCisJCW1kZGV2LT5ldmVudHMtLTsKKwllbHNlIHsKKwkJLyogb3RoZXJ3aXNlIHdlIGhhdmUgdG8gZ28gZm9yd2FyZCBhbmQgLi4uICovCisJCW1kZGV2LT5ldmVudHMgKys7CisJCWlmICghbWRkZXYtPmluX3N5bmMgfHwgbWRkZXYtPnJlY292ZXJ5X2NwICE9IE1heFNlY3RvcikgeyAvKiBub3QgY2xlYW4gKi8KKwkJCS8qIC4uIGlmIHRoZSBhcnJheSBpc24ndCBjbGVhbiwgaW5zaXN0IG9uIGFuIG9kZCAnZXZlbnRzJyAqLworCQkJaWYgKChtZGRldi0+ZXZlbnRzJjEpPT0wKSB7CisJCQkJbWRkZXYtPmV2ZW50cysrOworCQkJCW5vc3BhcmVzID0gMDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIG90aGVyd2lzZSBpbnNpc3Qgb24gYW4gZXZlbiAnZXZlbnRzJyAoZm9yIGNsZWFuIHN0YXRlcykgKi8KKwkJCWlmICgobWRkZXYtPmV2ZW50cyYxKSkgeworCQkJCW1kZGV2LT5ldmVudHMrKzsKKwkJCQlub3NwYXJlcyA9IDA7CisJCQl9CisJCX0KKwl9CiAKIAlpZiAoIW1kZGV2LT5ldmVudHMpIHsKIAkJLyoKQEAgLTE1NzEsNyArMTYzOCw3IEBACiAJCW1kZGV2LT5ldmVudHMgLS07CiAJfQogCW1kZGV2LT5zYl9kaXJ0eSA9IDI7Ci0Jc3luY19zYnMobWRkZXYpOworCXN5bmNfc2JzKG1kZGV2LCBub3NwYXJlcyk7CiAKIAkvKgogCSAqIGRvIG5vdCB3cml0ZSBhbnl0aGluZyB0byBkaXNrIGlmIHVzaW5nCkBAIC0xNTkzLDYgKzE2NjAsOCBAQAogCUlURVJBVEVfUkRFVihtZGRldixyZGV2LHRtcCkgewogCQljaGFyIGJbQkRFVk5BTUVfU0laRV07CiAJCWRwcmludGsoS0VSTl9JTkZPICJtZDogIik7CisJCWlmIChyZGV2LT5zYl9sb2FkZWQgIT0gMSkKKwkJCWNvbnRpbnVlOyAvKiBubyBub2lzZSBvbiBzcGFyZSBkZXZpY2VzICovCiAJCWlmICh0ZXN0X2JpdChGYXVsdHksICZyZGV2LT5mbGFncykpCiAJCQlkcHJpbnRrKCIoc2tpcHBpbmcgZmF1bHR5ICIpOwogCkBAIC0xNjA0LDYgKzE2NzMsNyBAQAogCQkJZHByaW50ayhLRVJOX0lORk8gIih3cml0ZSkgJXMncyBzYiBvZmZzZXQ6ICVsbHVcbiIsCiAJCQkJYmRldm5hbWUocmRldi0+YmRldixiKSwKIAkJCQkodW5zaWduZWQgbG9uZyBsb25nKXJkZXYtPnNiX29mZnNldCk7CisJCQlyZGV2LT5zYl9ldmVudHMgPSBtZGRldi0+ZXZlbnRzOwogCiAJCX0gZWxzZQogCQkJZHByaW50aygiKVxuIik7CkBAIC0xNjY3LDYgKzE3MzcsMTAgQEAKIAkJbGVuICs9IHNwcmludGYocGFnZStsZW4sICIlc2luX3N5bmMiLHNlcCk7CiAJCXNlcCA9ICIsIjsKIAl9CisJaWYgKHRlc3RfYml0KFdyaXRlTW9zdGx5LCAmcmRldi0+ZmxhZ3MpKSB7CisJCWxlbiArPSBzcHJpbnRmKHBhZ2UrbGVuLCAiJXN3cml0ZV9tb3N0bHkiLHNlcCk7CisJCXNlcCA9ICIsIjsKKwl9CiAJaWYgKCF0ZXN0X2JpdChGYXVsdHksICZyZGV2LT5mbGFncykgJiYKIAkgICAgIXRlc3RfYml0KEluX3N5bmMsICZyZGV2LT5mbGFncykpIHsKIAkJbGVuICs9IHNwcmludGYocGFnZStsZW4sICIlc3NwYXJlIiwgc2VwKTsKQEAgLTE2NzUsOCArMTc0OSw0MCBAQAogCXJldHVybiBsZW4rc3ByaW50ZihwYWdlK2xlbiwgIlxuIik7CiB9CiAKK3N0YXRpYyBzc2l6ZV90CitzdGF0ZV9zdG9yZShtZGtfcmRldl90ICpyZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisJLyogY2FuIHdyaXRlCisJICogIGZhdWx0eSAgLSBzaW11bGF0ZXMgYW5kIGVycm9yCisJICogIHJlbW92ZSAgLSBkaXNjb25uZWN0cyB0aGUgZGV2aWNlCisJICogIHdyaXRlbW9zdGx5IC0gc2V0cyB3cml0ZV9tb3N0bHkKKwkgKiAgLXdyaXRlbW9zdGx5IC0gY2xlYXJzIHdyaXRlX21vc3RseQorCSAqLworCWludCBlcnIgPSAtRUlOVkFMOworCWlmIChjbWRfbWF0Y2goYnVmLCAiZmF1bHR5IikgJiYgcmRldi0+bWRkZXYtPnBlcnMpIHsKKwkJbWRfZXJyb3IocmRldi0+bWRkZXYsIHJkZXYpOworCQllcnIgPSAwOworCX0gZWxzZSBpZiAoY21kX21hdGNoKGJ1ZiwgInJlbW92ZSIpKSB7CisJCWlmIChyZGV2LT5yYWlkX2Rpc2sgPj0gMCkKKwkJCWVyciA9IC1FQlVTWTsKKwkJZWxzZSB7CisJCQltZGRldl90ICptZGRldiA9IHJkZXYtPm1kZGV2OworCQkJa2lja19yZGV2X2Zyb21fYXJyYXkocmRldik7CisJCQltZF91cGRhdGVfc2IobWRkZXYpOworCQkJbWRfbmV3X2V2ZW50KG1kZGV2KTsKKwkJCWVyciA9IDA7CisJCX0KKwl9IGVsc2UgaWYgKGNtZF9tYXRjaChidWYsICJ3cml0ZW1vc3RseSIpKSB7CisJCXNldF9iaXQoV3JpdGVNb3N0bHksICZyZGV2LT5mbGFncyk7CisJCWVyciA9IDA7CisJfSBlbHNlIGlmIChjbWRfbWF0Y2goYnVmLCAiLXdyaXRlbW9zdGx5IikpIHsKKwkJY2xlYXJfYml0KFdyaXRlTW9zdGx5LCAmcmRldi0+ZmxhZ3MpOworCQllcnIgPSAwOworCX0KKwlyZXR1cm4gZXJyID8gZXJyIDogbGVuOworfQogc3RhdGljIHN0cnVjdCByZGV2X3N5c2ZzX2VudHJ5Ci1yZGV2X3N0YXRlID0gX19BVFRSX1JPKHN0YXRlKTsKK3JkZXZfc3RhdGUgPSBfX0FUVFIoc3RhdGUsIDA2NDQsIHN0YXRlX3Nob3csIHN0YXRlX3N0b3JlKTsKIAogc3RhdGljIHNzaXplX3QKIHN1cGVyX3Nob3cobWRrX3JkZXZfdCAqcmRldiwgY2hhciAqcGFnZSkKQEAgLTE4NzMsNiArMTk3OSw3IEBACiAJcmRldi0+ZGVzY19uciA9IC0xOwogCXJkZXYtPmZsYWdzID0gMDsKIAlyZGV2LT5kYXRhX29mZnNldCA9IDA7CisJcmRldi0+c2JfZXZlbnRzID0gMDsKIAlhdG9taWNfc2V0KCZyZGV2LT5ucl9wZW5kaW5nLCAwKTsKIAlhdG9taWNfc2V0KCZyZGV2LT5yZWFkX2Vycm9ycywgMCk7CiAJYXRvbWljX3NldCgmcmRldi0+Y29ycmVjdGVkX2Vycm9ycywgMCk7CkBAIC0xOTc4LDYgKzIwODUsNTQgQEAKIH0KIAogc3RhdGljIHNzaXplX3QKK3NhZmVfZGVsYXlfc2hvdyhtZGRldl90ICptZGRldiwgY2hhciAqcGFnZSkKK3sKKwlpbnQgbXNlYyA9IChtZGRldi0+c2FmZW1vZGVfZGVsYXkqMTAwMCkvSFo7CisJcmV0dXJuIHNwcmludGYocGFnZSwgIiVkLiUwM2RcbiIsIG1zZWMvMTAwMCwgbXNlYyUxMDAwKTsKK30KK3N0YXRpYyBzc2l6ZV90CitzYWZlX2RlbGF5X3N0b3JlKG1kZGV2X3QgKm1kZGV2LCBjb25zdCBjaGFyICpjYnVmLCBzaXplX3QgbGVuKQoreworCWludCBzY2FsZT0xOworCWludCBkb3Q9MDsKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIG1zZWM7CisJY2hhciBidWZbMzBdOworCWNoYXIgKmU7CisJLyogcmVtb3ZlIGEgcGVyaW9kLCBhbmQgY291bnQgZGlnaXRzIGFmdGVyIGl0ICovCisJaWYgKGxlbiA+PSBzaXplb2YoYnVmKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJc3RybGNweShidWYsIGNidWYsIGxlbik7CisJYnVmW2xlbl0gPSAwOworCWZvciAoaT0wOyBpPGxlbjsgaSsrKSB7CisJCWlmIChkb3QpIHsKKwkJCWlmIChpc2RpZ2l0KGJ1ZltpXSkpIHsKKwkJCQlidWZbaS0xXSA9IGJ1ZltpXTsKKwkJCQlzY2FsZSAqPSAxMDsKKwkJCX0KKwkJCWJ1ZltpXSA9IDA7CisJCX0gZWxzZSBpZiAoYnVmW2ldID09ICcuJykgeworCQkJZG90PTE7CisJCQlidWZbaV0gPSAwOworCQl9CisJfQorCW1zZWMgPSBzaW1wbGVfc3RydG91bChidWYsICZlLCAxMCk7CisJaWYgKGUgPT0gYnVmIHx8ICgqZSAmJiAqZSAhPSAnXG4nKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJbXNlYyA9IChtc2VjICogMTAwMCkgLyBzY2FsZTsKKwlpZiAobXNlYyA9PSAwKQorCQltZGRldi0+c2FmZW1vZGVfZGVsYXkgPSAwOworCWVsc2UgeworCQltZGRldi0+c2FmZW1vZGVfZGVsYXkgPSAobXNlYypIWikvMTAwMDsKKwkJaWYgKG1kZGV2LT5zYWZlbW9kZV9kZWxheSA9PSAwKQorCQkJbWRkZXYtPnNhZmVtb2RlX2RlbGF5ID0gMTsKKwl9CisJcmV0dXJuIGxlbjsKK30KK3N0YXRpYyBzdHJ1Y3QgbWRfc3lzZnNfZW50cnkgbWRfc2FmZV9kZWxheSA9CitfX0FUVFIoc2FmZV9tb2RlX2RlbGF5LCAwNjQ0LHNhZmVfZGVsYXlfc2hvdywgc2FmZV9kZWxheV9zdG9yZSk7CisKK3N0YXRpYyBzc2l6ZV90CiBsZXZlbF9zaG93KG1kZGV2X3QgKm1kZGV2LCBjaGFyICpwYWdlKQogewogCXN0cnVjdCBtZGtfcGVyc29uYWxpdHkgKnAgPSBtZGRldi0+cGVyczsKQEAgLTIwMTIsNiArMjE2NywzMiBAQAogc3RhdGljIHN0cnVjdCBtZF9zeXNmc19lbnRyeSBtZF9sZXZlbCA9CiBfX0FUVFIobGV2ZWwsIDA2NDQsIGxldmVsX3Nob3csIGxldmVsX3N0b3JlKTsKIAorCitzdGF0aWMgc3NpemVfdAorbGF5b3V0X3Nob3cobWRkZXZfdCAqbWRkZXYsIGNoYXIgKnBhZ2UpCit7CisJLyoganVzdCBhIG51bWJlciwgbm90IG1lYW5pbmdmdWwgZm9yIGFsbCBsZXZlbHMgKi8KKwlyZXR1cm4gc3ByaW50ZihwYWdlLCAiJWRcbiIsIG1kZGV2LT5sYXlvdXQpOworfQorCitzdGF0aWMgc3NpemVfdAorbGF5b3V0X3N0b3JlKG1kZGV2X3QgKm1kZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisJY2hhciAqZTsKKwl1bnNpZ25lZCBsb25nIG4gPSBzaW1wbGVfc3RydG91bChidWYsICZlLCAxMCk7CisJaWYgKG1kZGV2LT5wZXJzKQorCQlyZXR1cm4gLUVCVVNZOworCisJaWYgKCEqYnVmIHx8ICgqZSAmJiAqZSAhPSAnXG4nKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltZGRldi0+bGF5b3V0ID0gbjsKKwlyZXR1cm4gbGVuOworfQorc3RhdGljIHN0cnVjdCBtZF9zeXNmc19lbnRyeSBtZF9sYXlvdXQgPQorX19BVFRSKGxheW91dCwgMDY1NSwgbGF5b3V0X3Nob3csIGxheW91dF9zdG9yZSk7CisKKwogc3RhdGljIHNzaXplX3QKIHJhaWRfZGlza3Nfc2hvdyhtZGRldl90ICptZGRldiwgY2hhciAqcGFnZSkKIHsKQEAgLTIwNjcsNiArMjI0OCwyMDAgQEAKIF9fQVRUUihjaHVua19zaXplLCAwNjQ0LCBjaHVua19zaXplX3Nob3csIGNodW5rX3NpemVfc3RvcmUpOwogCiBzdGF0aWMgc3NpemVfdAorcmVzeW5jX3N0YXJ0X3Nob3cobWRkZXZfdCAqbWRkZXYsIGNoYXIgKnBhZ2UpCit7CisJcmV0dXJuIHNwcmludGYocGFnZSwgIiVsbHVcbiIsICh1bnNpZ25lZCBsb25nIGxvbmcpbWRkZXYtPnJlY292ZXJ5X2NwKTsKK30KKworc3RhdGljIHNzaXplX3QKK3Jlc3luY19zdGFydF9zdG9yZShtZGRldl90ICptZGRldiwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQoreworCS8qIGNhbiBvbmx5IHNldCBjaHVua19zaXplIGlmIGFycmF5IGlzIG5vdCB5ZXQgYWN0aXZlICovCisJY2hhciAqZTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgbiA9IHNpbXBsZV9zdHJ0b3VsbChidWYsICZlLCAxMCk7CisKKwlpZiAobWRkZXYtPnBlcnMpCisJCXJldHVybiAtRUJVU1k7CisJaWYgKCEqYnVmIHx8ICgqZSAmJiAqZSAhPSAnXG4nKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltZGRldi0+cmVjb3ZlcnlfY3AgPSBuOworCXJldHVybiBsZW47Cit9CitzdGF0aWMgc3RydWN0IG1kX3N5c2ZzX2VudHJ5IG1kX3Jlc3luY19zdGFydCA9CitfX0FUVFIocmVzeW5jX3N0YXJ0LCAwNjQ0LCByZXN5bmNfc3RhcnRfc2hvdywgcmVzeW5jX3N0YXJ0X3N0b3JlKTsKKworLyoKKyAqIFRoZSBhcnJheSBzdGF0ZSBjYW4gYmU6CisgKgorICogY2xlYXIKKyAqICAgICBObyBkZXZpY2VzLCBubyBzaXplLCBubyBsZXZlbAorICogICAgIEVxdWl2YWxlbnQgdG8gU1RPUF9BUlJBWSBpb2N0bAorICogaW5hY3RpdmUKKyAqICAgICBNYXkgaGF2ZSBzb21lIHNldHRpbmdzLCBidXQgYXJyYXkgaXMgbm90IGFjdGl2ZQorICogICAgICAgIGFsbCBJTyByZXN1bHRzIGluIGVycm9yCisgKiAgICAgV2hlbiB3cml0dGVuLCBkb2Vzbid0IHRlYXIgZG93biBhcnJheSwgYnV0IGp1c3Qgc3RvcHMgaXQKKyAqIHN1c3BlbmRlZCAobm90IHN1cHBvcnRlZCB5ZXQpCisgKiAgICAgQWxsIElPIHJlcXVlc3RzIHdpbGwgYmxvY2suIFRoZSBhcnJheSBjYW4gYmUgcmVjb25maWd1cmVkLgorICogICAgIFdyaXRpbmcgdGhpcywgaWYgYWNjZXB0ZWQsIHdpbGwgYmxvY2sgdW50aWwgYXJyYXkgaXMgcXVpZXNzZW50CisgKiByZWFkb25seQorICogICAgIG5vIHJlc3luYyBjYW4gaGFwcGVuLiAgbm8gc3VwZXJibG9ja3MgZ2V0IHdyaXR0ZW4uCisgKiAgICAgd3JpdGUgcmVxdWVzdHMgZmFpbAorICogcmVhZC1hdXRvCisgKiAgICAgbGlrZSByZWFkb25seSwgYnV0IGJlaGF2ZXMgbGlrZSAnY2xlYW4nIG9uIGEgd3JpdGUgcmVxdWVzdC4KKyAqCisgKiBjbGVhbiAtIG5vIHBlbmRpbmcgd3JpdGVzLCBidXQgb3RoZXJ3aXNlIGFjdGl2ZS4KKyAqICAgICBXaGVuIHdyaXR0ZW4gdG8gaW5hY3RpdmUgYXJyYXksIHN0YXJ0cyB3aXRob3V0IHJlc3luYworICogICAgIElmIGEgd3JpdGUgcmVxdWVzdCBhcnJpdmVzIHRoZW4KKyAqICAgICAgIGlmIG1ldGFkYXRhIGlzIGtub3duLCBtYXJrICdkaXJ0eScgYW5kIHN3aXRjaCB0byAnYWN0aXZlJy4KKyAqICAgICAgIGlmIG5vdCBrbm93biwgYmxvY2sgYW5kIHN3aXRjaCB0byB3cml0ZS1wZW5kaW5nCisgKiAgICAgSWYgd3JpdHRlbiB0byBhbiBhY3RpdmUgYXJyYXkgdGhhdCBoYXMgcGVuZGluZyB3cml0ZXMsIHRoZW4gZmFpbHMuCisgKiBhY3RpdmUKKyAqICAgICBmdWxseSBhY3RpdmU6IElPIGFuZCByZXN5bmMgY2FuIGJlIGhhcHBlbmluZy4KKyAqICAgICBXaGVuIHdyaXR0ZW4gdG8gaW5hY3RpdmUgYXJyYXksIHN0YXJ0cyB3aXRoIHJlc3luYworICoKKyAqIHdyaXRlLXBlbmRpbmcKKyAqICAgICBjbGVhbiwgYnV0IHdyaXRlcyBhcmUgYmxvY2tlZCB3YWl0aW5nIGZvciAnYWN0aXZlJyB0byBiZSB3cml0dGVuLgorICoKKyAqIGFjdGl2ZS1pZGxlCisgKiAgICAgbGlrZSBhY3RpdmUsIGJ1dCBubyB3cml0ZXMgaGF2ZSBiZWVuIHNlZW4gZm9yIGEgd2hpbGUgKDEwMG1zZWMpLgorICoKKyAqLworZW51bSBhcnJheV9zdGF0ZSB7IGNsZWFyLCBpbmFjdGl2ZSwgc3VzcGVuZGVkLCByZWFkb25seSwgcmVhZF9hdXRvLCBjbGVhbiwgYWN0aXZlLAorCQkgICB3cml0ZV9wZW5kaW5nLCBhY3RpdmVfaWRsZSwgYmFkX3dvcmR9Oworc3RhdGljIGNoYXIgKmFycmF5X3N0YXRlc1tdID0geworCSJjbGVhciIsICJpbmFjdGl2ZSIsICJzdXNwZW5kZWQiLCAicmVhZG9ubHkiLCAicmVhZC1hdXRvIiwgImNsZWFuIiwgImFjdGl2ZSIsCisJIndyaXRlLXBlbmRpbmciLCAiYWN0aXZlLWlkbGUiLCBOVUxMIH07CisKK3N0YXRpYyBpbnQgbWF0Y2hfd29yZChjb25zdCBjaGFyICp3b3JkLCBjaGFyICoqbGlzdCkKK3sKKwlpbnQgbjsKKwlmb3IgKG49MDsgbGlzdFtuXTsgbisrKQorCQlpZiAoY21kX21hdGNoKHdvcmQsIGxpc3Rbbl0pKQorCQkJYnJlYWs7CisJcmV0dXJuIG47Cit9CisKK3N0YXRpYyBzc2l6ZV90CithcnJheV9zdGF0ZV9zaG93KG1kZGV2X3QgKm1kZGV2LCBjaGFyICpwYWdlKQoreworCWVudW0gYXJyYXlfc3RhdGUgc3QgPSBpbmFjdGl2ZTsKKworCWlmIChtZGRldi0+cGVycykKKwkJc3dpdGNoKG1kZGV2LT5ybykgeworCQljYXNlIDE6CisJCQlzdCA9IHJlYWRvbmx5OworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCXN0ID0gcmVhZF9hdXRvOworCQkJYnJlYWs7CisJCWNhc2UgMDoKKwkJCWlmIChtZGRldi0+aW5fc3luYykKKwkJCQlzdCA9IGNsZWFuOworCQkJZWxzZSBpZiAobWRkZXYtPnNhZmVtb2RlKQorCQkJCXN0ID0gYWN0aXZlX2lkbGU7CisJCQllbHNlCisJCQkJc3QgPSBhY3RpdmU7CisJCX0KKwllbHNlIHsKKwkJaWYgKGxpc3RfZW1wdHkoJm1kZGV2LT5kaXNrcykgJiYKKwkJICAgIG1kZGV2LT5yYWlkX2Rpc2tzID09IDAgJiYKKwkJICAgIG1kZGV2LT5zaXplID09IDApCisJCQlzdCA9IGNsZWFyOworCQllbHNlCisJCQlzdCA9IGluYWN0aXZlOworCX0KKwlyZXR1cm4gc3ByaW50ZihwYWdlLCAiJXNcbiIsIGFycmF5X3N0YXRlc1tzdF0pOworfQorCitzdGF0aWMgaW50IGRvX21kX3N0b3AobWRkZXZfdCAqIG1kZGV2LCBpbnQgcm8pOworc3RhdGljIGludCBkb19tZF9ydW4obWRkZXZfdCAqIG1kZGV2KTsKK3N0YXRpYyBpbnQgcmVzdGFydF9hcnJheShtZGRldl90ICptZGRldik7CisKK3N0YXRpYyBzc2l6ZV90CithcnJheV9zdGF0ZV9zdG9yZShtZGRldl90ICptZGRldiwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQoreworCWludCBlcnIgPSAtRUlOVkFMOworCWVudW0gYXJyYXlfc3RhdGUgc3QgPSBtYXRjaF93b3JkKGJ1ZiwgYXJyYXlfc3RhdGVzKTsKKwlzd2l0Y2goc3QpIHsKKwljYXNlIGJhZF93b3JkOgorCQlicmVhazsKKwljYXNlIGNsZWFyOgorCQkvKiBzdG9wcGluZyBhbiBhY3RpdmUgYXJyYXkgKi8KKwkJaWYgKG1kZGV2LT5wZXJzKSB7CisJCQlpZiAoYXRvbWljX3JlYWQoJm1kZGV2LT5hY3RpdmUpID4gMSkKKwkJCQlyZXR1cm4gLUVCVVNZOworCQkJZXJyID0gZG9fbWRfc3RvcChtZGRldiwgMCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBpbmFjdGl2ZToKKwkJLyogc3RvcHBpbmcgYW4gYWN0aXZlIGFycmF5ICovCisJCWlmIChtZGRldi0+cGVycykgeworCQkJaWYgKGF0b21pY19yZWFkKCZtZGRldi0+YWN0aXZlKSA+IDEpCisJCQkJcmV0dXJuIC1FQlVTWTsKKwkJCWVyciA9IGRvX21kX3N0b3AobWRkZXYsIDIpOworCQl9CisJCWJyZWFrOworCWNhc2Ugc3VzcGVuZGVkOgorCQlicmVhazsgLyogbm90IHN1cHBvcnRlZCB5ZXQgKi8KKwljYXNlIHJlYWRvbmx5OgorCQlpZiAobWRkZXYtPnBlcnMpCisJCQllcnIgPSBkb19tZF9zdG9wKG1kZGV2LCAxKTsKKwkJZWxzZSB7CisJCQltZGRldi0+cm8gPSAxOworCQkJZXJyID0gZG9fbWRfcnVuKG1kZGV2KTsKKwkJfQorCQlicmVhazsKKwljYXNlIHJlYWRfYXV0bzoKKwkJLyogc3RvcHBpbmcgYW4gYWN0aXZlIGFycmF5ICovCisJCWlmIChtZGRldi0+cGVycykgeworCQkJZXJyID0gZG9fbWRfc3RvcChtZGRldiwgMSk7CisJCQlpZiAoZXJyID09IDApCisJCQkJbWRkZXYtPnJvID0gMjsgLyogRklYTUUgbWFyayBkZXZpY2VzIHdyaXRhYmxlICovCisJCX0gZWxzZSB7CisJCQltZGRldi0+cm8gPSAyOworCQkJZXJyID0gZG9fbWRfcnVuKG1kZGV2KTsKKwkJfQorCQlicmVhazsKKwljYXNlIGNsZWFuOgorCQlpZiAobWRkZXYtPnBlcnMpIHsKKwkJCXJlc3RhcnRfYXJyYXkobWRkZXYpOworCQkJc3Bpbl9sb2NrX2lycSgmbWRkZXYtPndyaXRlX2xvY2spOworCQkJaWYgKGF0b21pY19yZWFkKCZtZGRldi0+d3JpdGVzX3BlbmRpbmcpID09IDApIHsKKwkJCQltZGRldi0+aW5fc3luYyA9IDE7CisJCQkJbWRkZXYtPnNiX2RpcnR5ID0gMTsKKwkJCX0KKwkJCXNwaW5fdW5sb2NrX2lycSgmbWRkZXYtPndyaXRlX2xvY2spOworCQl9IGVsc2UgeworCQkJbWRkZXYtPnJvID0gMDsKKwkJCW1kZGV2LT5yZWNvdmVyeV9jcCA9IE1heFNlY3RvcjsKKwkJCWVyciA9IGRvX21kX3J1bihtZGRldik7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBhY3RpdmU6CisJCWlmIChtZGRldi0+cGVycykgeworCQkJcmVzdGFydF9hcnJheShtZGRldik7CisJCQltZGRldi0+c2JfZGlydHkgPSAwOworCQkJd2FrZV91cCgmbWRkZXYtPnNiX3dhaXQpOworCQkJZXJyID0gMDsKKwkJfSBlbHNlIHsKKwkJCW1kZGV2LT5ybyA9IDA7CisJCQllcnIgPSBkb19tZF9ydW4obWRkZXYpOworCQl9CisJCWJyZWFrOworCWNhc2Ugd3JpdGVfcGVuZGluZzoKKwljYXNlIGFjdGl2ZV9pZGxlOgorCQkvKiB0aGVzZSBjYW5ub3QgYmUgc2V0ICovCisJCWJyZWFrOworCX0KKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCWVsc2UKKwkJcmV0dXJuIGxlbjsKK30KK3N0YXRpYyBzdHJ1Y3QgbWRfc3lzZnNfZW50cnkgbWRfYXJyYXlfc3RhdGUgPSBfX0FUVFIoYXJyYXlfc3RhdGUsIDA2NDQsIGFycmF5X3N0YXRlX3Nob3csIGFycmF5X3N0YXRlX3N0b3JlKTsKKworc3RhdGljIHNzaXplX3QKIG51bGxfc2hvdyhtZGRldl90ICptZGRldiwgY2hhciAqcGFnZSkKIHsKIAlyZXR1cm4gLUVJTlZBTDsKQEAgLTI0MjgsMTEgKzI4MDMsMTUgQEAKIAogc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKm1kX2RlZmF1bHRfYXR0cnNbXSA9IHsKIAkmbWRfbGV2ZWwuYXR0ciwKKwkmbWRfbGF5b3V0LmF0dHIsCiAJJm1kX3JhaWRfZGlza3MuYXR0ciwKIAkmbWRfY2h1bmtfc2l6ZS5hdHRyLAogCSZtZF9zaXplLmF0dHIsCisJJm1kX3Jlc3luY19zdGFydC5hdHRyLAogCSZtZF9tZXRhZGF0YS5hdHRyLAogCSZtZF9uZXdfZGV2aWNlLmF0dHIsCisJJm1kX3NhZmVfZGVsYXkuYXR0ciwKKwkmbWRfYXJyYXlfc3RhdGUuYXR0ciwKIAlOVUxMLAogfTsKIApAQCAtMjU1Myw4ICsyOTMyLDYgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotdm9pZCBtZF93YWtldXBfdGhyZWFkKG1ka190aHJlYWRfdCAqdGhyZWFkKTsKLQogc3RhdGljIHZvaWQgbWRfc2FmZW1vZGVfdGltZW91dCh1bnNpZ25lZCBsb25nIGRhdGEpCiB7CiAJbWRkZXZfdCAqbWRkZXYgPSAobWRkZXZfdCAqKSBkYXRhOwpAQCAtMjcwOCw3ICszMDg1LDcgQEAKIAltZGRldi0+c2FmZW1vZGUgPSAwOwogCW1kZGV2LT5zYWZlbW9kZV90aW1lci5mdW5jdGlvbiA9IG1kX3NhZmVtb2RlX3RpbWVvdXQ7CiAJbWRkZXYtPnNhZmVtb2RlX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgbWRkZXY7Ci0JbWRkZXYtPnNhZmVtb2RlX2RlbGF5ID0gKDIwICogSFopLzEwMDAgKzE7IC8qIDIwIG1zZWMgZGVsYXkgKi8KKwltZGRldi0+c2FmZW1vZGVfZGVsYXkgPSAoMjAwICogSFopLzEwMDAgKzE7IC8qIDIwMCBtc2VjIGRlbGF5ICovCiAJbWRkZXYtPmluX3N5bmMgPSAxOwogCiAJSVRFUkFURV9SREVWKG1kZGV2LHJkZXYsdG1wKQpAQCAtMjczNiw2ICszMTEzLDM2IEBACiAJbWRkZXYtPnF1ZXVlLT5xdWV1ZWRhdGEgPSBtZGRldjsKIAltZGRldi0+cXVldWUtPm1ha2VfcmVxdWVzdF9mbiA9IG1kZGV2LT5wZXJzLT5tYWtlX3JlcXVlc3Q7CiAKKwkvKiBJZiB0aGVyZSBpcyBhIHBhcnRpYWxseS1yZWNvdmVyZWQgZHJpdmUgd2UgbmVlZCB0bworCSAqIHN0YXJ0IHJlY292ZXJ5IGhlcmUuICBJZiB3ZSBsZWF2ZSBpdCB0byBtZF9jaGVja19yZWNvdmVyeSwKKwkgKiBpdCB3aWxsIHJlbW92ZSB0aGUgZHJpdmVzIGFuZCBub3QgZG8gdGhlIHJpZ2h0IHRoaW5nCisJICovCisJaWYgKG1kZGV2LT5kZWdyYWRlZCkgeworCQlzdHJ1Y3QgbGlzdF9oZWFkICpydG1wOworCQlpbnQgc3BhcmVzID0gMDsKKwkJSVRFUkFURV9SREVWKG1kZGV2LHJkZXYscnRtcCkKKwkJCWlmIChyZGV2LT5yYWlkX2Rpc2sgPj0gMCAmJgorCQkJICAgICF0ZXN0X2JpdChJbl9zeW5jLCAmcmRldi0+ZmxhZ3MpICYmCisJCQkgICAgIXRlc3RfYml0KEZhdWx0eSwgJnJkZXYtPmZsYWdzKSkKKwkJCQkvKiBjb21wbGV0ZSBhbiBpbnRlcnJ1cHRlZCByZWNvdmVyeSAqLworCQkJCXNwYXJlcysrOworCQlpZiAoc3BhcmVzICYmIG1kZGV2LT5wZXJzLT5zeW5jX3JlcXVlc3QpIHsKKwkJCW1kZGV2LT5yZWNvdmVyeSA9IDA7CisJCQlzZXRfYml0KE1EX1JFQ09WRVJZX1JVTk5JTkcsICZtZGRldi0+cmVjb3ZlcnkpOworCQkJbWRkZXYtPnN5bmNfdGhyZWFkID0gbWRfcmVnaXN0ZXJfdGhyZWFkKG1kX2RvX3N5bmMsCisJCQkJCQkJCW1kZGV2LAorCQkJCQkJCQkiJXNfcmVzeW5jIik7CisJCQlpZiAoIW1kZGV2LT5zeW5jX3RocmVhZCkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNvdWxkIG5vdCBzdGFydCByZXN5bmMiCisJCQkJICAgICAgICIgdGhyZWFkLi4uXG4iLAorCQkJCSAgICAgICBtZG5hbWUobWRkZXYpKTsKKwkJCQkvKiBsZWF2ZSB0aGUgc3BhcmVzIHdoZXJlIHRoZXkgYXJlLCBpdCBzaG91bGRuJ3QgaHVydCAqLworCQkJCW1kZGV2LT5yZWNvdmVyeSA9IDA7CisJCQl9IGVsc2UKKwkJCQltZF93YWtldXBfdGhyZWFkKG1kZGV2LT5zeW5jX3RocmVhZCk7CisJCX0KKwl9CisKIAltZGRldi0+Y2hhbmdlZCA9IDE7CiAJbWRfbmV3X2V2ZW50KG1kZGV2KTsKIAlyZXR1cm4gMDsKQEAgLTI3NjksMTggKzMxNzYsNDcgQEAKIAkJICovCiAJCXNldF9iaXQoTURfUkVDT1ZFUllfTkVFREVELCAmbWRkZXYtPnJlY292ZXJ5KTsKIAkJbWRfd2FrZXVwX3RocmVhZChtZGRldi0+dGhyZWFkKTsKKwkJbWRfd2FrZXVwX3RocmVhZChtZGRldi0+c3luY190aHJlYWQpOwogCQllcnIgPSAwOwotCX0gZWxzZSB7Ci0JCXByaW50ayhLRVJOX0VSUiAibWQ6ICVzIGhhcyBubyBwZXJzb25hbGl0eSBhc3NpZ25lZC5cbiIsCi0JCQltZG5hbWUobWRkZXYpKTsKKwl9IGVsc2UKIAkJZXJyID0gLUVJTlZBTDsKLQl9CiAKIG91dDoKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IGRvX21kX3N0b3AobWRkZXZfdCAqIG1kZGV2LCBpbnQgcm8pCisvKiBzaW1pbGFyIHRvIGRlbnlfd3JpdGVfYWNjZXNzLCBidXQgYWNjb3VudHMgZm9yIG91ciBob2xkaW5nIGEgcmVmZXJlbmNlCisgKiB0byB0aGUgZmlsZSBvdXJzZWx2ZXMgKi8KK3N0YXRpYyBpbnQgZGVueV9iaXRtYXBfd3JpdGVfYWNjZXNzKHN0cnVjdCBmaWxlICogZmlsZSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9tYXBwaW5nLT5ob3N0OworCisJc3Bpbl9sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwlpZiAoYXRvbWljX3JlYWQoJmlub2RlLT5pX3dyaXRlY291bnQpID4gMSkgeworCQlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CisJCXJldHVybiAtRVRYVEJTWTsKKwl9CisJYXRvbWljX3NldCgmaW5vZGUtPmlfd3JpdGVjb3VudCwgLTEpOworCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCByZXN0b3JlX2JpdG1hcF93cml0ZV9hY2Nlc3Moc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfbWFwcGluZy0+aG9zdDsKKworCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CisJYXRvbWljX3NldCgmaW5vZGUtPmlfd3JpdGVjb3VudCwgMSk7CisJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOworfQorCisvKiBtb2RlOgorICogICAwIC0gY29tcGxldGVseSBzdG9wIGFuZCBkaXMtYXNzZW1ibGUgYXJyYXkKKyAqICAgMSAtIHN3aXRjaCB0byByZWFkb25seQorICogICAyIC0gc3RvcCBidXQgZG8gbm90IGRpc2Fzc2VtYmxlIGFycmF5CisgKi8KK3N0YXRpYyBpbnQgZG9fbWRfc3RvcChtZGRldl90ICogbWRkZXYsIGludCBtb2RlKQogewogCWludCBlcnIgPSAwOwogCXN0cnVjdCBnZW5kaXNrICpkaXNrID0gbWRkZXYtPmdlbmRpc2s7CkBAIC0yNzkyLDYgKzMyMjgsNyBAQAogCQl9CiAKIAkJaWYgKG1kZGV2LT5zeW5jX3RocmVhZCkgeworCQkJc2V0X2JpdChNRF9SRUNPVkVSWV9GUk9aRU4sICZtZGRldi0+cmVjb3ZlcnkpOwogCQkJc2V0X2JpdChNRF9SRUNPVkVSWV9JTlRSLCAmbWRkZXYtPnJlY292ZXJ5KTsKIAkJCW1kX3VucmVnaXN0ZXJfdGhyZWFkKG1kZGV2LT5zeW5jX3RocmVhZCk7CiAJCQltZGRldi0+c3luY190aHJlYWQgPSBOVUxMOwpAQCAtMjgwMSwxMiArMzIzOCwxNSBAQAogCiAJCWludmFsaWRhdGVfcGFydGl0aW9uKGRpc2ssIDApOwogCi0JCWlmIChybykgeworCQlzd2l0Y2gobW9kZSkgeworCQljYXNlIDE6IC8qIHJlYWRvbmx5ICovCiAJCQllcnIgID0gLUVOWElPOwogCQkJaWYgKG1kZGV2LT5ybz09MSkKIAkJCQlnb3RvIG91dDsKIAkJCW1kZGV2LT5ybyA9IDE7Ci0JCX0gZWxzZSB7CisJCQlicmVhazsKKwkJY2FzZSAwOiAvKiBkaXNhc3NlbWJsZSAqLworCQljYXNlIDI6IC8qIHN0b3AgKi8KIAkJCWJpdG1hcF9mbHVzaChtZGRldik7CiAJCQltZF9zdXBlcl93YWl0KG1kZGV2KTsKIAkJCWlmIChtZGRldi0+cm8pCkBAIC0yODIxLDE5ICszMjYxLDIwIEBACiAJCQlpZiAobWRkZXYtPnJvKQogCQkJCW1kZGV2LT5ybyA9IDA7CiAJCX0KLQkJaWYgKCFtZGRldi0+aW5fc3luYykgeworCQlpZiAoIW1kZGV2LT5pbl9zeW5jIHx8IG1kZGV2LT5zYl9kaXJ0eSkgewogCQkJLyogbWFyayBhcnJheSBhcyBzaHV0ZG93biBjbGVhbmx5ICovCiAJCQltZGRldi0+aW5fc3luYyA9IDE7CiAJCQltZF91cGRhdGVfc2IobWRkZXYpOwogCQl9Ci0JCWlmIChybykKKwkJaWYgKG1vZGUgPT0gMSkKIAkJCXNldF9kaXNrX3JvKGRpc2ssIDEpOworCQljbGVhcl9iaXQoTURfUkVDT1ZFUllfRlJPWkVOLCAmbWRkZXYtPnJlY292ZXJ5KTsKIAl9CiAKIAkvKgogCSAqIEZyZWUgcmVzb3VyY2VzIGlmIGZpbmFsIHN0b3AKIAkgKi8KLQlpZiAoIXJvKSB7CisJaWYgKG1vZGUgPT0gMCkgewogCQltZGtfcmRldl90ICpyZGV2OwogCQlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CiAJCXN0cnVjdCBnZW5kaXNrICpkaXNrOwpAQCAtMjg0MSw3ICszMjgyLDcgQEAKIAogCQliaXRtYXBfZGVzdHJveShtZGRldik7CiAJCWlmIChtZGRldi0+Yml0bWFwX2ZpbGUpIHsKLQkJCWF0b21pY19zZXQoJm1kZGV2LT5iaXRtYXBfZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfd3JpdGVjb3VudCwgMSk7CisJCQlyZXN0b3JlX2JpdG1hcF93cml0ZV9hY2Nlc3MobWRkZXYtPmJpdG1hcF9maWxlKTsKIAkJCWZwdXQobWRkZXYtPmJpdG1hcF9maWxlKTsKIAkJCW1kZGV2LT5iaXRtYXBfZmlsZSA9IE5VTEw7CiAJCX0KQEAgLTI4NTcsMTEgKzMyOTgsMTUgQEAKIAkJZXhwb3J0X2FycmF5KG1kZGV2KTsKIAogCQltZGRldi0+YXJyYXlfc2l6ZSA9IDA7CisJCW1kZGV2LT5zaXplID0gMDsKKwkJbWRkZXYtPnJhaWRfZGlza3MgPSAwOworCQltZGRldi0+cmVjb3ZlcnlfY3AgPSAwOworCiAJCWRpc2sgPSBtZGRldi0+Z2VuZGlzazsKIAkJaWYgKGRpc2spCiAJCQlzZXRfY2FwYWNpdHkoZGlzaywgMCk7CiAJCW1kZGV2LT5jaGFuZ2VkID0gMTsKLQl9IGVsc2UKKwl9IGVsc2UgaWYgKG1kZGV2LT5wZXJzKQogCQlwcmludGsoS0VSTl9JTkZPICJtZDogJXMgc3dpdGNoZWQgdG8gcmVhZC1vbmx5IG1vZGUuXG4iLAogCQkJbWRuYW1lKG1kZGV2KSk7CiAJZXJyID0gMDsKQEAgLTMyNjQsNiArMzcwOSwxNyBAQAogCiAJCXJkZXYtPnJhaWRfZGlzayA9IC0xOwogCQllcnIgPSBiaW5kX3JkZXZfdG9fYXJyYXkocmRldiwgbWRkZXYpOworCQlpZiAoIWVyciAmJiAhbWRkZXYtPnBlcnMtPmhvdF9yZW1vdmVfZGlzaykgeworCQkJLyogSWYgdGhlcmUgaXMgaG90X2FkZF9kaXNrIGJ1dCBubyBob3RfcmVtb3ZlX2Rpc2sKKwkJCSAqIHRoZW4gYWRkZWQgZGlza3MgZm9yIGdlb21ldHJ5IGNoYW5nZXMsCisJCQkgKiBhbmQgc2hvdWxkIGJlIGFkZGVkIGltbWVkaWF0ZWx5LgorCQkJICovCisJCQlzdXBlcl90eXBlc1ttZGRldi0+bWFqb3JfdmVyc2lvbl0uCisJCQkJdmFsaWRhdGVfc3VwZXIobWRkZXYsIHJkZXYpOworCQkJZXJyID0gbWRkZXYtPnBlcnMtPmhvdF9hZGRfZGlzayhtZGRldiwgcmRldik7CisJCQlpZiAoZXJyKQorCQkJCXVuYmluZF9yZGV2X2Zyb21fYXJyYXkocmRldik7CisJCX0KIAkJaWYgKGVycikKIAkJCWV4cG9ydF9yZGV2KHJkZXYpOwogCkBAIC0zNDM0LDIzICszODkwLDYgQEAKIAlyZXR1cm4gZXJyOwogfQogCi0vKiBzaW1pbGFyIHRvIGRlbnlfd3JpdGVfYWNjZXNzLCBidXQgYWNjb3VudHMgZm9yIG91ciBob2xkaW5nIGEgcmVmZXJlbmNlCi0gKiB0byB0aGUgZmlsZSBvdXJzZWx2ZXMgKi8KLXN0YXRpYyBpbnQgZGVueV9iaXRtYXBfd3JpdGVfYWNjZXNzKHN0cnVjdCBmaWxlICogZmlsZSkKLXsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9tYXBwaW5nLT5ob3N0OwotCi0Jc3Bpbl9sb2NrKCZpbm9kZS0+aV9sb2NrKTsKLQlpZiAoYXRvbWljX3JlYWQoJmlub2RlLT5pX3dyaXRlY291bnQpID4gMSkgewotCQlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7Ci0JCXJldHVybiAtRVRYVEJTWTsKLQl9Ci0JYXRvbWljX3NldCgmaW5vZGUtPmlfd3JpdGVjb3VudCwgLTEpOwotCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IHNldF9iaXRtYXBfZmlsZShtZGRldl90ICptZGRldiwgaW50IGZkKQogewogCWludCBlcnI7CkBAIC0zNDkxLDEyICszOTMwLDE3IEBACiAJCW1kZGV2LT5wZXJzLT5xdWllc2NlKG1kZGV2LCAxKTsKIAkJaWYgKGZkID49IDApCiAJCQllcnIgPSBiaXRtYXBfY3JlYXRlKG1kZGV2KTsKLQkJaWYgKGZkIDwgMCB8fCBlcnIpCisJCWlmIChmZCA8IDAgfHwgZXJyKSB7CiAJCQliaXRtYXBfZGVzdHJveShtZGRldik7CisJCQlmZCA9IC0xOyAvKiBtYWtlIHN1cmUgdG8gcHV0IHRoZSBmaWxlICovCisJCX0KIAkJbWRkZXYtPnBlcnMtPnF1aWVzY2UobWRkZXYsIDApOwotCX0gZWxzZSBpZiAoZmQgPCAwKSB7Ci0JCWlmIChtZGRldi0+Yml0bWFwX2ZpbGUpCisJfQorCWlmIChmZCA8IDApIHsKKwkJaWYgKG1kZGV2LT5iaXRtYXBfZmlsZSkgeworCQkJcmVzdG9yZV9iaXRtYXBfd3JpdGVfYWNjZXNzKG1kZGV2LT5iaXRtYXBfZmlsZSk7CiAJCQlmcHV0KG1kZGV2LT5iaXRtYXBfZmlsZSk7CisJCX0KIAkJbWRkZXYtPmJpdG1hcF9maWxlID0gTlVMTDsKIAl9CiAKQEAgLTM5NzcsMTEgKzQ0MjEsNiBAQAogCQkJZ290byBkb25lX3VubG9jazsKIAogCQlkZWZhdWx0OgotCQkJaWYgKF9JT0NfVFlQRShjbWQpID09IE1EX01BSk9SKQotCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1kOiAlcyhwaWQgJWQpIHVzZWQiCi0JCQkJCSIgb2Jzb2xldGUgTUQgaW9jdGwsIHVwZ3JhZGUgeW91ciIKLQkJCQkJIiBzb2Z0d2FyZSB0byB1c2UgbmV3IGljdGxzLlxuIiwKLQkJCQkJY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkKTsKIAkJCWVyciA9IC1FSU5WQUw7CiAJCQlnb3RvIGFib3J0X3VubG9jazsKIAl9CkBAIC00NTg2LDcgKzUwMjUsNyBAQAogCQlzcGluX2xvY2tfaXJxKCZtZGRldi0+d3JpdGVfbG9jayk7CiAJCWlmIChtZGRldi0+aW5fc3luYykgewogCQkJbWRkZXYtPmluX3N5bmMgPSAwOwotCQkJbWRkZXYtPnNiX2RpcnR5ID0gMTsKKwkJCW1kZGV2LT5zYl9kaXJ0eSA9IDM7CiAJCQltZF93YWtldXBfdGhyZWFkKG1kZGV2LT50aHJlYWQpOwogCQl9CiAJCXNwaW5fdW5sb2NrX2lycSgmbWRkZXYtPndyaXRlX2xvY2spOwpAQCAtNDU5OSw3ICs1MDM4LDcgQEAKIAlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmbWRkZXYtPndyaXRlc19wZW5kaW5nKSkgewogCQlpZiAobWRkZXYtPnNhZmVtb2RlID09IDIpCiAJCQltZF93YWtldXBfdGhyZWFkKG1kZGV2LT50aHJlYWQpOwotCQllbHNlCisJCWVsc2UgaWYgKG1kZGV2LT5zYWZlbW9kZV9kZWxheSkKIAkJCW1vZF90aW1lcigmbWRkZXYtPnNhZmVtb2RlX3RpbWVyLCBqaWZmaWVzICsgbWRkZXYtPnNhZmVtb2RlX2RlbGF5KTsKIAl9CiB9CkBAIC00NjIwLDEwICs1MDU5LDE0IEBACiAJc3RydWN0IGxpc3RfaGVhZCAqdG1wOwogCXNlY3Rvcl90IGxhc3RfY2hlY2s7CiAJaW50IHNraXBwZWQgPSAwOworCXN0cnVjdCBsaXN0X2hlYWQgKnJ0bXA7CisJbWRrX3JkZXZfdCAqcmRldjsKIAogCS8qIGp1c3QgaW5jYXNlIHRocmVhZCByZXN0YXJ0cy4uLiAqLwogCWlmICh0ZXN0X2JpdChNRF9SRUNPVkVSWV9ET05FLCAmbWRkZXYtPnJlY292ZXJ5KSkKIAkJcmV0dXJuOworCWlmIChtZGRldi0+cm8pIC8qIG5ldmVyIHRyeSB0byBzeW5jIGEgcmVhZC1vbmx5IGFycmF5ICovCisJCXJldHVybjsKIAogCS8qIHdlIG92ZXJsb2FkIGN1cnJfcmVzeW5jIHNvbWV3aGF0IGhlcmUuCiAJICogMCA9PSBub3QgZW5nYWdlZCBpbiByZXN5bmMgYXQgYWxsCkBAIC00NjgyLDE3ICs1MTI1LDMwIEBACiAJCX0KIAl9IHdoaWxlIChtZGRldi0+Y3Vycl9yZXN5bmMgPCAyKTsKIAorCWogPSAwOwogCWlmICh0ZXN0X2JpdChNRF9SRUNPVkVSWV9TWU5DLCAmbWRkZXYtPnJlY292ZXJ5KSkgewogCQkvKiByZXN5bmMgZm9sbG93cyB0aGUgc2l6ZSByZXF1ZXN0ZWQgYnkgdGhlIHBlcnNvbmFsaXR5LAogCQkgKiB3aGljaCBkZWZhdWx0cyB0byBwaHlzaWNhbCBzaXplLCBidXQgY2FuIGJlIHZpcnR1YWwgc2l6ZQogCQkgKi8KIAkJbWF4X3NlY3RvcnMgPSBtZGRldi0+cmVzeW5jX21heF9zZWN0b3JzOwogCQltZGRldi0+cmVzeW5jX21pc21hdGNoZXMgPSAwOworCQkvKiB3ZSBkb24ndCB1c2UgdGhlIGNoZWNrcG9pbnQgaWYgdGhlcmUncyBhIGJpdG1hcCAqLworCQlpZiAoIW1kZGV2LT5iaXRtYXAgJiYKKwkJICAgICF0ZXN0X2JpdChNRF9SRUNPVkVSWV9SRVFVRVNURUQsICZtZGRldi0+cmVjb3ZlcnkpKQorCQkJaiA9IG1kZGV2LT5yZWNvdmVyeV9jcDsKIAl9IGVsc2UgaWYgKHRlc3RfYml0KE1EX1JFQ09WRVJZX1JFU0hBUEUsICZtZGRldi0+cmVjb3ZlcnkpKQogCQltYXhfc2VjdG9ycyA9IG1kZGV2LT5zaXplIDw8IDE7Ci0JZWxzZQorCWVsc2UgewogCQkvKiByZWNvdmVyeSBmb2xsb3dzIHRoZSBwaHlzaWNhbCBzaXplIG9mIGRldmljZXMgKi8KIAkJbWF4X3NlY3RvcnMgPSBtZGRldi0+c2l6ZSA8PCAxOworCQlqID0gTWF4U2VjdG9yOworCQlJVEVSQVRFX1JERVYobWRkZXYscmRldixydG1wKQorCQkJaWYgKHJkZXYtPnJhaWRfZGlzayA+PSAwICYmCisJCQkgICAgIXRlc3RfYml0KEZhdWx0eSwgJnJkZXYtPmZsYWdzKSAmJgorCQkJICAgICF0ZXN0X2JpdChJbl9zeW5jLCAmcmRldi0+ZmxhZ3MpICYmCisJCQkgICAgcmRldi0+cmVjb3Zlcnlfb2Zmc2V0IDwgaikKKwkJCQlqID0gcmRldi0+cmVjb3Zlcnlfb2Zmc2V0OworCX0KIAogCXByaW50ayhLRVJOX0lORk8gIm1kOiBzeW5jaW5nIFJBSUQgYXJyYXkgJXNcbiIsIG1kbmFtZShtZGRldikpOwogCXByaW50ayhLRVJOX0lORk8gIm1kOiBtaW5pbXVtIF9ndWFyYW50ZWVkXyByZWNvbnN0cnVjdGlvbiBzcGVlZDoiCkBAIC00NzAyLDEyICs1MTU4LDcgQEAKIAkgICAgICAgc3BlZWRfbWF4KG1kZGV2KSk7CiAKIAlpc19tZGRldl9pZGxlKG1kZGV2KTsgLyogdGhpcyBhbHNvIGluaXRpYWxpemVzIElPIGV2ZW50IGNvdW50ZXJzICovCi0JLyogd2UgZG9uJ3QgdXNlIHRoZSBjaGVja3BvaW50IGlmIHRoZXJlJ3MgYSBiaXRtYXAgKi8KLQlpZiAodGVzdF9iaXQoTURfUkVDT1ZFUllfU1lOQywgJm1kZGV2LT5yZWNvdmVyeSkgJiYgIW1kZGV2LT5iaXRtYXAKLQkgICAgJiYgISB0ZXN0X2JpdChNRF9SRUNPVkVSWV9SRVFVRVNURUQsICZtZGRldi0+cmVjb3ZlcnkpKQotCQlqID0gbWRkZXYtPnJlY292ZXJ5X2NwOwotCWVsc2UKLQkJaiA9IDA7CisKIAlpb19zZWN0b3JzID0gMDsKIAlmb3IgKG0gPSAwOyBtIDwgU1lOQ19NQVJLUzsgbSsrKSB7CiAJCW1hcmtbbV0gPSBqaWZmaWVzOwpAQCAtNDgyOCwxNSArNTI3OSwyOCBAQAogCWlmICghdGVzdF9iaXQoTURfUkVDT1ZFUllfRVJSLCAmbWRkZXYtPnJlY292ZXJ5KSAmJgogCSAgICB0ZXN0X2JpdChNRF9SRUNPVkVSWV9TWU5DLCAmbWRkZXYtPnJlY292ZXJ5KSAmJgogCSAgICAhdGVzdF9iaXQoTURfUkVDT1ZFUllfQ0hFQ0ssICZtZGRldi0+cmVjb3ZlcnkpICYmCi0JICAgIG1kZGV2LT5jdXJyX3Jlc3luYyA+IDIgJiYKLQkgICAgbWRkZXYtPmN1cnJfcmVzeW5jID49IG1kZGV2LT5yZWNvdmVyeV9jcCkgewotCQlpZiAodGVzdF9iaXQoTURfUkVDT1ZFUllfSU5UUiwgJm1kZGV2LT5yZWNvdmVyeSkpIHsKLQkJCXByaW50ayhLRVJOX0lORk8gCi0JCQkJIm1kOiBjaGVja3BvaW50aW5nIHJlY292ZXJ5IG9mICVzLlxuIiwKLQkJCQltZG5hbWUobWRkZXYpKTsKLQkJCW1kZGV2LT5yZWNvdmVyeV9jcCA9IG1kZGV2LT5jdXJyX3Jlc3luYzsKLQkJfSBlbHNlCi0JCQltZGRldi0+cmVjb3ZlcnlfY3AgPSBNYXhTZWN0b3I7CisJICAgIG1kZGV2LT5jdXJyX3Jlc3luYyA+IDIpIHsKKwkJaWYgKHRlc3RfYml0KE1EX1JFQ09WRVJZX1NZTkMsICZtZGRldi0+cmVjb3ZlcnkpKSB7CisJCQlpZiAodGVzdF9iaXQoTURfUkVDT1ZFUllfSU5UUiwgJm1kZGV2LT5yZWNvdmVyeSkpIHsKKwkJCQlpZiAobWRkZXYtPmN1cnJfcmVzeW5jID49IG1kZGV2LT5yZWNvdmVyeV9jcCkgeworCQkJCQlwcmludGsoS0VSTl9JTkZPCisJCQkJCSAgICAgICAibWQ6IGNoZWNrcG9pbnRpbmcgcmVjb3Zlcnkgb2YgJXMuXG4iLAorCQkJCQkgICAgICAgbWRuYW1lKG1kZGV2KSk7CisJCQkJCW1kZGV2LT5yZWNvdmVyeV9jcCA9IG1kZGV2LT5jdXJyX3Jlc3luYzsKKwkJCQl9CisJCQl9IGVsc2UKKwkJCQltZGRldi0+cmVjb3ZlcnlfY3AgPSBNYXhTZWN0b3I7CisJCX0gZWxzZSB7CisJCQlpZiAoIXRlc3RfYml0KE1EX1JFQ09WRVJZX0lOVFIsICZtZGRldi0+cmVjb3ZlcnkpKQorCQkJCW1kZGV2LT5jdXJyX3Jlc3luYyA9IE1heFNlY3RvcjsKKwkJCUlURVJBVEVfUkRFVihtZGRldixyZGV2LHJ0bXApCisJCQkJaWYgKHJkZXYtPnJhaWRfZGlzayA+PSAwICYmCisJCQkJICAgICF0ZXN0X2JpdChGYXVsdHksICZyZGV2LT5mbGFncykgJiYKKwkJCQkgICAgIXRlc3RfYml0KEluX3N5bmMsICZyZGV2LT5mbGFncykgJiYKKwkJCQkgICAgcmRldi0+cmVjb3Zlcnlfb2Zmc2V0IDwgbWRkZXYtPmN1cnJfcmVzeW5jKQorCQkJCQlyZGV2LT5yZWNvdmVyeV9vZmZzZXQgPSBtZGRldi0+Y3Vycl9yZXN5bmM7CisJCQltZGRldi0+c2JfZGlydHkgPSAxOworCQl9CiAJfQogCiAgc2tpcDoKQEAgLTQ5MDgsNyArNTM3Miw3IEBACiAJCWlmIChtZGRldi0+c2FmZW1vZGUgJiYgIWF0b21pY19yZWFkKCZtZGRldi0+d3JpdGVzX3BlbmRpbmcpICYmCiAJCSAgICAhbWRkZXYtPmluX3N5bmMgJiYgbWRkZXYtPnJlY292ZXJ5X2NwID09IE1heFNlY3RvcikgewogCQkJbWRkZXYtPmluX3N5bmMgPSAxOwotCQkJbWRkZXYtPnNiX2RpcnR5ID0gMTsKKwkJCW1kZGV2LT5zYl9kaXJ0eSA9IDM7CiAJCX0KIAkJaWYgKG1kZGV2LT5zYWZlbW9kZSA9PSAxKQogCQkJbWRkZXYtPnNhZmVtb2RlID0gMDsKQEAgLTQ5NTcsNiArNTQyMSw4IEBACiAJCWNsZWFyX2JpdChNRF9SRUNPVkVSWV9JTlRSLCAmbWRkZXYtPnJlY292ZXJ5KTsKIAkJY2xlYXJfYml0KE1EX1JFQ09WRVJZX0RPTkUsICZtZGRldi0+cmVjb3ZlcnkpOwogCisJCWlmICh0ZXN0X2JpdChNRF9SRUNPVkVSWV9GUk9aRU4sICZtZGRldi0+cmVjb3ZlcnkpKQorCQkJZ290byB1bmxvY2s7CiAJCS8qIG5vIHJlY292ZXJ5IGlzIHJ1bm5pbmcuCiAJCSAqIHJlbW92ZSBhbnkgZmFpbGVkIGRyaXZlcywgdGhlbgogCQkgKiBhZGQgc3BhcmVzIGlmIHBvc3NpYmxlLgpAQCAtNDk3OSw2ICs1NDQ1LDcgQEAKIAkJCUlURVJBVEVfUkRFVihtZGRldixyZGV2LHJ0bXApCiAJCQkJaWYgKHJkZXYtPnJhaWRfZGlzayA8IDAKIAkJCQkgICAgJiYgIXRlc3RfYml0KEZhdWx0eSwgJnJkZXYtPmZsYWdzKSkgeworCQkJCQlyZGV2LT5yZWNvdmVyeV9vZmZzZXQgPSAwOwogCQkJCQlpZiAobWRkZXYtPnBlcnMtPmhvdF9hZGRfZGlzayhtZGRldixyZGV2KSkgewogCQkJCQkJY2hhciBubVsyMF07CiAJCQkJCQlzcHJpbnRmKG5tLCAicmQlZCIsIHJkZXYtPnJhaWRfZGlzayk7CkBAIC01MjE2LDcgKzU2ODMsNiBAQAogRVhQT1JUX1NZTUJPTChtZF9yZWdpc3Rlcl90aHJlYWQpOwogRVhQT1JUX1NZTUJPTChtZF91bnJlZ2lzdGVyX3RocmVhZCk7CiBFWFBPUlRfU1lNQk9MKG1kX3dha2V1cF90aHJlYWQpOwotRVhQT1JUX1NZTUJPTChtZF9wcmludF9kZXZpY2VzKTsKIEVYUE9SVF9TWU1CT0wobWRfY2hlY2tfcmVjb3ZlcnkpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0FMSUFTKCJtZCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9yYWlkMS5jIGIvZHJpdmVycy9tZC9yYWlkMS5jCmluZGV4IDQwNzBlZmYuLmNlYWQ5MTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvcmFpZDEuYworKysgYi9kcml2ZXJzL21kL3JhaWQxLmMKQEAgLTM3NCwyNiArMzc0LDI2IEBACiAJICogYWxyZWFkeS4KIAkgKi8KIAlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmcjFfYmlvLT5yZW1haW5pbmcpKSB7Ci0JCWlmICh0ZXN0X2JpdChSMUJJT19CYXJyaWVyUmV0cnksICZyMV9iaW8tPnN0YXRlKSkgeworCQlpZiAodGVzdF9iaXQoUjFCSU9fQmFycmllclJldHJ5LCAmcjFfYmlvLT5zdGF0ZSkpCiAJCQlyZXNjaGVkdWxlX3JldHJ5KHIxX2Jpbyk7Ci0JCQlnb3RvIG91dDsKKwkJZWxzZSB7CisJCQkvKiBpdCByZWFsbHkgaXMgdGhlIGVuZCBvZiB0aGlzIHJlcXVlc3QgKi8KKwkJCWlmICh0ZXN0X2JpdChSMUJJT19CZWhpbmRJTywgJnIxX2Jpby0+c3RhdGUpKSB7CisJCQkJLyogZnJlZSBleHRyYSBjb3B5IG9mIHRoZSBkYXRhIHBhZ2VzICovCisJCQkJaW50IGkgPSBiaW8tPmJpX3ZjbnQ7CisJCQkJd2hpbGUgKGktLSkKKwkJCQkJc2FmZV9wdXRfcGFnZShiaW8tPmJpX2lvX3ZlY1tpXS5idl9wYWdlKTsKKwkJCX0KKwkJCS8qIGNsZWFyIHRoZSBiaXRtYXAgaWYgYWxsIHdyaXRlcyBjb21wbGV0ZSBzdWNjZXNzZnVsbHkgKi8KKwkJCWJpdG1hcF9lbmR3cml0ZShyMV9iaW8tPm1kZGV2LT5iaXRtYXAsIHIxX2Jpby0+c2VjdG9yLAorCQkJCQlyMV9iaW8tPnNlY3RvcnMsCisJCQkJCSF0ZXN0X2JpdChSMUJJT19EZWdyYWRlZCwgJnIxX2Jpby0+c3RhdGUpLAorCQkJCQliZWhpbmQpOworCQkJbWRfd3JpdGVfZW5kKHIxX2Jpby0+bWRkZXYpOworCQkJcmFpZF9lbmRfYmlvX2lvKHIxX2Jpbyk7CiAJCX0KLQkJLyogaXQgcmVhbGx5IGlzIHRoZSBlbmQgb2YgdGhpcyByZXF1ZXN0ICovCi0JCWlmICh0ZXN0X2JpdChSMUJJT19CZWhpbmRJTywgJnIxX2Jpby0+c3RhdGUpKSB7Ci0JCQkvKiBmcmVlIGV4dHJhIGNvcHkgb2YgdGhlIGRhdGEgcGFnZXMgKi8KLQkJCWludCBpID0gYmlvLT5iaV92Y250OwotCQkJd2hpbGUgKGktLSkKLQkJCQlzYWZlX3B1dF9wYWdlKGJpby0+YmlfaW9fdmVjW2ldLmJ2X3BhZ2UpOwotCQl9Ci0JCS8qIGNsZWFyIHRoZSBiaXRtYXAgaWYgYWxsIHdyaXRlcyBjb21wbGV0ZSBzdWNjZXNzZnVsbHkgKi8KLQkJYml0bWFwX2VuZHdyaXRlKHIxX2Jpby0+bWRkZXYtPmJpdG1hcCwgcjFfYmlvLT5zZWN0b3IsCi0JCQkJcjFfYmlvLT5zZWN0b3JzLAotCQkJCSF0ZXN0X2JpdChSMUJJT19EZWdyYWRlZCwgJnIxX2Jpby0+c3RhdGUpLAotCQkJCWJlaGluZCk7Ci0JCW1kX3dyaXRlX2VuZChyMV9iaW8tPm1kZGV2KTsKLQkJcmFpZF9lbmRfYmlvX2lvKHIxX2Jpbyk7CiAJfQotIG91dDoKKwogCWlmICh0b19wdXQpCiAJCWJpb19wdXQodG9fcHV0KTsKIApAQCAtMTYyNSw2ICsxNjI1LDEyIEBACiAJLyogYmVmb3JlIGJ1aWxkaW5nIGEgcmVxdWVzdCwgY2hlY2sgaWYgd2UgY2FuIHNraXAgdGhlc2UgYmxvY2tzLi4KIAkgKiBUaGlzIGNhbGwgdGhlIGJpdG1hcF9zdGFydF9zeW5jIGRvZXNuJ3QgYWN0dWFsbHkgcmVjb3JkIGFueXRoaW5nCiAJICovCisJaWYgKG1kZGV2LT5iaXRtYXAgPT0gTlVMTCAmJgorCSAgICBtZGRldi0+cmVjb3ZlcnlfY3AgPT0gTWF4U2VjdG9yICYmCisJICAgIGNvbmYtPmZ1bGxzeW5jID09IDApIHsKKwkJKnNraXBwZWQgPSAxOworCQlyZXR1cm4gbWF4X3NlY3RvciAtIHNlY3Rvcl9ucjsKKwl9CiAJaWYgKCFiaXRtYXBfc3RhcnRfc3luYyhtZGRldi0+Yml0bWFwLCBzZWN0b3JfbnIsICZzeW5jX2Jsb2NrcywgMSkgJiYKIAkgICAgIWNvbmYtPmZ1bGxzeW5jICYmICF0ZXN0X2JpdChNRF9SRUNPVkVSWV9SRVFVRVNURUQsICZtZGRldi0+cmVjb3ZlcnkpKSB7CiAJCS8qIFdlIGNhbiBza2lwIHRoaXMgYmxvY2ssIGFuZCBwcm9iYWJseSBzZXZlcmFsIG1vcmUgKi8KQEAgLTE4ODgsNyArMTg5NCw4IEBACiAKIAkJZGlzayA9IGNvbmYtPm1pcnJvcnMgKyBpOwogCi0JCWlmICghZGlzay0+cmRldikgeworCQlpZiAoIWRpc2stPnJkZXYgfHwKKwkJICAgICF0ZXN0X2JpdChJbl9zeW5jLCAmZGlzay0+cmRldi0+ZmxhZ3MpKSB7CiAJCQlkaXNrLT5oZWFkX3Bvc2l0aW9uID0gMDsKIAkJCW1kZGV2LT5kZWdyYWRlZCsrOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL3JhaWQxMC5jIGIvZHJpdmVycy9tZC9yYWlkMTAuYwppbmRleCAxNDQwOTM1Li43ZjYzNjI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL3JhaWQxMC5jCisrKyBiL2RyaXZlcnMvbWQvcmFpZDEwLmMKQEAgLTI5LDYgKzI5LDcgQEAKICAqICAgIHJhaWRfZGlza3MKICAqICAgIG5lYXJfY29waWVzIChzdG9yZWQgaW4gbG93IGJ5dGUgb2YgbGF5b3V0KQogICogICAgZmFyX2NvcGllcyAoc3RvcmVkIGluIHNlY29uZCBieXRlIG9mIGxheW91dCkKKyAqICAgIGZhcl9vZmZzZXQgKHN0b3JlZCBpbiBiaXQgMTYgb2YgbGF5b3V0ICkKICAqCiAgKiBUaGUgZGF0YSB0byBiZSBzdG9yZWQgaXMgZGl2aWRlZCBpbnRvIGNodW5rcyB1c2luZyBjaHVua3NpemUuCiAgKiBFYWNoIGRldmljZSBpcyBkaXZpZGVkIGludG8gZmFyX2NvcGllcyBzZWN0aW9ucy4KQEAgLTM2LDEwICszNywxNCBAQAogICogbmVhcl9jb3BpZXMgY29waWVzIG9mIGVhY2ggY2h1bmsgaXMgc3RvcmVkIChlYWNoIG9uIGEgZGlmZmVyZW50IGRyaXZlKS4KICAqIFRoZSBzdGFydGluZyBkZXZpY2UgZm9yIGVhY2ggc2VjdGlvbiBpcyBvZmZzZXQgbmVhcl9jb3BpZXMgZnJvbSB0aGUgc3RhcnRpbmcKICAqIGRldmljZSBvZiB0aGUgcHJldmlvdXMgc2VjdGlvbi4KLSAqIFRodXMgdGhlcmUgYXJlIChuZWFyX2NvcGllcypmYXJfY29waWVzKSBvZiBlYWNoIGNodW5rLCBhbmQgZWFjaCBpcyBvbiBhIGRpZmZlcmVudAorICogVGh1cyB0aGV5IGFyZSAobmVhcl9jb3BpZXMqZmFyX2NvcGllcykgb2YgZWFjaCBjaHVuaywgYW5kIGVhY2ggaXMgb24gYSBkaWZmZXJlbnQKICAqIGRyaXZlLgogICogbmVhcl9jb3BpZXMgYW5kIGZhcl9jb3BpZXMgbXVzdCBiZSBhdCBsZWFzdCBvbmUsIGFuZCB0aGVpciBwcm9kdWN0IGlzIGF0IG1vc3QKICAqIHJhaWRfZGlza3MuCisgKgorICogSWYgZmFyX29mZnNldCBpcyB0cnVlLCB0aGVuIHRoZSBmYXJfY29waWVzIGFyZSBoYW5kbGVkIGEgYml0IGRpZmZlcmVudGx5LgorICogVGhlIGNvcGllcyBhcmUgc3RpbGwgaW4gZGlmZmVyZW50IHN0cmlwZXMsIGJ1dCBpbnN0ZWFkIG9mIGJlIHZlcnkgZmFyIGFwYXJ0CisgKiBvbiBkaXNrLCB0aGVyZSBhcmUgYWRqYWNlbnQgc3RyaXBlcy4KICAqLwogCiAvKgpAQCAtMzU3LDggKzM2Miw3IEBACiAgKiBXaXRoIHRoaXMgbGF5b3V0LCBhbmQgYmxvY2sgaXMgbmV2ZXIgc3RvcmVkIHR3aWNlIG9uIHRoZSBvbmUgZGV2aWNlLgogICoKICAqIHJhaWQxMF9maW5kX3BoeXMgZmluZHMgdGhlIHNlY3RvciBvZmZzZXQgb2YgYSBnaXZlbiB2aXJ0dWFsIHNlY3RvcgotICogb24gZWFjaCBkZXZpY2UgdGhhdCBpdCBpcyBvbi4gSWYgYSBibG9jayBpc24ndCBvbiBhIGRldmljZSwKLSAqIHRoYXQgZW50cnkgaW4gdGhlIGFycmF5IGlzIHNldCB0byBNYXhTZWN0b3IuCisgKiBvbiBlYWNoIGRldmljZSB0aGF0IGl0IGlzIG9uLgogICoKICAqIHJhaWQxMF9maW5kX3ZpcnQgZG9lcyB0aGUgcmV2ZXJzZSBtYXBwaW5nLCBmcm9tIGEgZGV2aWNlIGFuZCBhCiAgKiBzZWN0b3Igb2Zmc2V0IHRvIGEgdmlydHVhbCBhZGRyZXNzCkBAIC0zODEsNiArMzg1LDggQEAKIAljaHVuayAqPSBjb25mLT5uZWFyX2NvcGllczsKIAlzdHJpcGUgPSBjaHVuazsKIAlkZXYgPSBzZWN0b3JfZGl2KHN0cmlwZSwgY29uZi0+cmFpZF9kaXNrcyk7CisJaWYgKGNvbmYtPmZhcl9vZmZzZXQpCisJCXN0cmlwZSAqPSBjb25mLT5mYXJfY29waWVzOwogCiAJc2VjdG9yICs9IHN0cmlwZSA8PCBjb25mLT5jaHVua19zaGlmdDsKIApAQCAtNDE0LDE2ICs0MjAsMjQgQEAKIHsKIAlzZWN0b3JfdCBvZmZzZXQsIGNodW5rLCB2Y2h1bms7CiAKLQl3aGlsZSAoc2VjdG9yID4gY29uZi0+c3RyaWRlKSB7Ci0JCXNlY3RvciAtPSBjb25mLT5zdHJpZGU7Ci0JCWlmIChkZXYgPCBjb25mLT5uZWFyX2NvcGllcykKLQkJCWRldiArPSBjb25mLT5yYWlkX2Rpc2tzIC0gY29uZi0+bmVhcl9jb3BpZXM7Ci0JCWVsc2UKLQkJCWRldiAtPSBjb25mLT5uZWFyX2NvcGllczsKLQl9Ci0KIAlvZmZzZXQgPSBzZWN0b3IgJiBjb25mLT5jaHVua19tYXNrOwotCWNodW5rID0gc2VjdG9yID4+IGNvbmYtPmNodW5rX3NoaWZ0OworCWlmIChjb25mLT5mYXJfb2Zmc2V0KSB7CisJCWludCBmYzsKKwkJY2h1bmsgPSBzZWN0b3IgPj4gY29uZi0+Y2h1bmtfc2hpZnQ7CisJCWZjID0gc2VjdG9yX2RpdihjaHVuaywgY29uZi0+ZmFyX2NvcGllcyk7CisJCWRldiAtPSBmYyAqIGNvbmYtPm5lYXJfY29waWVzOworCQlpZiAoZGV2IDwgMCkKKwkJCWRldiArPSBjb25mLT5yYWlkX2Rpc2tzOworCX0gZWxzZSB7CisJCXdoaWxlIChzZWN0b3IgPiBjb25mLT5zdHJpZGUpIHsKKwkJCXNlY3RvciAtPSBjb25mLT5zdHJpZGU7CisJCQlpZiAoZGV2IDwgY29uZi0+bmVhcl9jb3BpZXMpCisJCQkJZGV2ICs9IGNvbmYtPnJhaWRfZGlza3MgLSBjb25mLT5uZWFyX2NvcGllczsKKwkJCWVsc2UKKwkJCQlkZXYgLT0gY29uZi0+bmVhcl9jb3BpZXM7CisJCX0KKwkJY2h1bmsgPSBzZWN0b3IgPj4gY29uZi0+Y2h1bmtfc2hpZnQ7CisJfQogCXZjaHVuayA9IGNodW5rICogY29uZi0+cmFpZF9kaXNrcyArIGRldjsKIAlzZWN0b3JfZGl2KHZjaHVuaywgY29uZi0+bmVhcl9jb3BpZXMpOwogCXJldHVybiAodmNodW5rIDw8IGNvbmYtPmNodW5rX3NoaWZ0KSArIG9mZnNldDsKQEAgLTkwMCw5ICs5MTQsMTIgQEAKIAkJc2VxX3ByaW50ZihzZXEsICIgJWRLIGNodW5rcyIsIG1kZGV2LT5jaHVua19zaXplLzEwMjQpOwogCWlmIChjb25mLT5uZWFyX2NvcGllcyA+IDEpCiAJCXNlcV9wcmludGYoc2VxLCAiICVkIG5lYXItY29waWVzIiwgY29uZi0+bmVhcl9jb3BpZXMpOwotCWlmIChjb25mLT5mYXJfY29waWVzID4gMSkKLQkJc2VxX3ByaW50ZihzZXEsICIgJWQgZmFyLWNvcGllcyIsIGNvbmYtPmZhcl9jb3BpZXMpOwotCisJaWYgKGNvbmYtPmZhcl9jb3BpZXMgPiAxKSB7CisJCWlmIChjb25mLT5mYXJfb2Zmc2V0KQorCQkJc2VxX3ByaW50ZihzZXEsICIgJWQgb2Zmc2V0LWNvcGllcyIsIGNvbmYtPmZhcl9jb3BpZXMpOworCQllbHNlCisJCQlzZXFfcHJpbnRmKHNlcSwgIiAlZCBmYXItY29waWVzIiwgY29uZi0+ZmFyX2NvcGllcyk7CisJfQogCXNlcV9wcmludGYoc2VxLCAiIFslZC8lZF0gWyIsIGNvbmYtPnJhaWRfZGlza3MsCiAJCQkJCQljb25mLT53b3JraW5nX2Rpc2tzKTsKIAlmb3IgKGkgPSAwOyBpIDwgY29uZi0+cmFpZF9kaXNrczsgaSsrKQpAQCAtMTkxNSw3ICsxOTMyLDcgQEAKIAltaXJyb3JfaW5mb190ICpkaXNrOwogCW1ka19yZGV2X3QgKnJkZXY7CiAJc3RydWN0IGxpc3RfaGVhZCAqdG1wOwotCWludCBuYywgZmM7CisJaW50IG5jLCBmYywgZm87CiAJc2VjdG9yX3Qgc3RyaWRlLCBzaXplOwogCiAJaWYgKG1kZGV2LT5jaHVua19zaXplID09IDApIHsKQEAgLTE5MjUsOCArMTk0Miw5IEBACiAKIAluYyA9IG1kZGV2LT5sYXlvdXQgJiAyNTU7CiAJZmMgPSAobWRkZXYtPmxheW91dCA+PiA4KSAmIDI1NTsKKwlmbyA9IG1kZGV2LT5sYXlvdXQgJiAoMTw8MTYpOwogCWlmICgobmMqZmMpIDwyIHx8IChuYypmYykgPiBtZGRldi0+cmFpZF9kaXNrcyB8fAotCSAgICAobWRkZXYtPmxheW91dCA+PiAxNikpIHsKKwkgICAgKG1kZGV2LT5sYXlvdXQgPj4gMTcpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAicmFpZDEwOiAlczogdW5zdXBwb3J0ZWQgcmFpZDEwIGxheW91dDogMHglOHhcbiIsCiAJCSAgICAgICBtZG5hbWUobWRkZXYpLCBtZGRldi0+bGF5b3V0KTsKIAkJZ290byBvdXQ7CkBAIC0xOTU4LDEyICsxOTc2LDE2IEBACiAJY29uZi0+bmVhcl9jb3BpZXMgPSBuYzsKIAljb25mLT5mYXJfY29waWVzID0gZmM7CiAJY29uZi0+Y29waWVzID0gbmMqZmM7CisJY29uZi0+ZmFyX29mZnNldCA9IGZvOwogCWNvbmYtPmNodW5rX21hc2sgPSAoc2VjdG9yX3QpKG1kZGV2LT5jaHVua19zaXplPj45KS0xOwogCWNvbmYtPmNodW5rX3NoaWZ0ID0gZmZ6KH5tZGRldi0+Y2h1bmtfc2l6ZSkgLSA5OwotCXN0cmlkZSA9IG1kZGV2LT5zaXplID4+IChjb25mLT5jaHVua19zaGlmdC0xKTsKLQlzZWN0b3JfZGl2KHN0cmlkZSwgZmMpOwotCWNvbmYtPnN0cmlkZSA9IHN0cmlkZSA8PCBjb25mLT5jaHVua19zaGlmdDsKLQorCWlmIChmbykKKwkJY29uZi0+c3RyaWRlID0gMSA8PCBjb25mLT5jaHVua19zaGlmdDsKKwllbHNlIHsKKwkJc3RyaWRlID0gbWRkZXYtPnNpemUgPj4gKGNvbmYtPmNodW5rX3NoaWZ0LTEpOworCQlzZWN0b3JfZGl2KHN0cmlkZSwgZmMpOworCQljb25mLT5zdHJpZGUgPSBzdHJpZGUgPDwgY29uZi0+Y2h1bmtfc2hpZnQ7CisJfQogCWNvbmYtPnIxMGJpb19wb29sID0gbWVtcG9vbF9jcmVhdGUoTlJfUkFJRDEwX0JJT1MsIHIxMGJpb19wb29sX2FsbG9jLAogCQkJCQkJcjEwYmlvX3Bvb2xfZnJlZSwgY29uZik7CiAJaWYgKCFjb25mLT5yMTBiaW9fcG9vbCkgewpAQCAtMjAxNSw3ICsyMDM3LDggQEAKIAogCQlkaXNrID0gY29uZi0+bWlycm9ycyArIGk7CiAKLQkJaWYgKCFkaXNrLT5yZGV2KSB7CisJCWlmICghZGlzay0+cmRldiB8fAorCQkgICAgIXRlc3RfYml0KEluX3N5bmMsICZyZGV2LT5mbGFncykpIHsKIAkJCWRpc2stPmhlYWRfcG9zaXRpb24gPSAwOwogCQkJbWRkZXYtPmRlZ3JhZGVkKys7CiAJCX0KQEAgLTIwMzcsNyArMjA2MCwxMyBAQAogCS8qCiAJICogT2ssIGV2ZXJ5dGhpbmcgaXMganVzdCBmaW5lIG5vdwogCSAqLwotCXNpemUgPSBjb25mLT5zdHJpZGUgKiBjb25mLT5yYWlkX2Rpc2tzOworCWlmIChjb25mLT5mYXJfb2Zmc2V0KSB7CisJCXNpemUgPSBtZGRldi0+c2l6ZSA+PiAoY29uZi0+Y2h1bmtfc2hpZnQtMSk7CisJCXNpemUgKj0gY29uZi0+cmFpZF9kaXNrczsKKwkJc2l6ZSA8PD0gY29uZi0+Y2h1bmtfc2hpZnQ7CisJCXNlY3Rvcl9kaXYoc2l6ZSwgY29uZi0+ZmFyX2NvcGllcyk7CisJfSBlbHNlCisJCXNpemUgPSBjb25mLT5zdHJpZGUgKiBjb25mLT5yYWlkX2Rpc2tzOwogCXNlY3Rvcl9kaXYoc2l6ZSwgY29uZi0+bmVhcl9jb3BpZXMpOwogCW1kZGV2LT5hcnJheV9zaXplID0gc2l6ZS8yOwogCW1kZGV2LT5yZXN5bmNfbWF4X3NlY3RvcnMgPSBzaXplOwpAQCAtMjA1MCw3ICsyMDc5LDcgQEAKIAkgKiBtYXliZS4uLgogCSAqLwogCXsKLQkJaW50IHN0cmlwZSA9IGNvbmYtPnJhaWRfZGlza3MgKiBtZGRldi0+Y2h1bmtfc2l6ZSAvIFBBR0VfU0laRTsKKwkJaW50IHN0cmlwZSA9IGNvbmYtPnJhaWRfZGlza3MgKiAobWRkZXYtPmNodW5rX3NpemUgLyBQQUdFX1NJWkUpOwogCQlzdHJpcGUgLz0gY29uZi0+bmVhcl9jb3BpZXM7CiAJCWlmIChtZGRldi0+cXVldWUtPmJhY2tpbmdfZGV2X2luZm8ucmFfcGFnZXMgPCAyKiBzdHJpcGUpCiAJCQltZGRldi0+cXVldWUtPmJhY2tpbmdfZGV2X2luZm8ucmFfcGFnZXMgPSAyKiBzdHJpcGU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL3JhaWQ1LmMgYi9kcml2ZXJzL21kL3JhaWQ1LmMKaW5kZXggMzE4NDM2MC4uZjkyMGU1MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9yYWlkNS5jCisrKyBiL2RyaXZlcnMvbWQvcmFpZDUuYwpAQCAtMiw4ICsyLDExIEBACiAgKiByYWlkNS5jIDogTXVsdGlwbGUgRGV2aWNlcyBkcml2ZXIgZm9yIExpbnV4CiAgKgkgICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgSW5nbyBNb2xuYXIsIE1pZ3VlbCBkZSBJY2F6YSwgR2FkaSBPeG1hbgogICoJICAgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwIEluZ28gTW9sbmFyCisgKgkgICBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMgSC4gUGV0ZXIgQW52aW4KICAqCi0gKiBSQUlELTUgbWFuYWdlbWVudCBmdW5jdGlvbnMuCisgKiBSQUlELTQvNS82IG1hbmFnZW1lbnQgZnVuY3Rpb25zLgorICogVGhhbmtzIHRvIFBlbmd1aW4gQ29tcHV0aW5nIGZvciBtYWtpbmcgdGhlIFJBSUQtNiBkZXZlbG9wbWVudCBwb3NzaWJsZQorICogYnkgZG9uYXRpbmcgYSB0ZXN0IHNlcnZlciEKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTE5LDExICsyMiwxMSBAQAogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9yYWlkL3JhaWQ1Lmg+CiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisjaW5jbHVkZSAicmFpZDYuaCIKIAogI2luY2x1ZGUgPGxpbnV4L3JhaWQvYml0bWFwLmg+CiAKQEAgLTY4LDYgKzcxLDE2IEBACiAjZGVmaW5lIF9faW5saW5lX18KICNlbmRpZgogCisjaWYgIVJBSUQ2X1VTRV9FTVBUWV9aRVJPX1BBR0UKKy8qIEluIC5ic3Mgc28gaXQncyB6ZXJvZWQgKi8KK2NvbnN0IGNoYXIgcmFpZDZfZW1wdHlfemVyb19wYWdlW1BBR0VfU0laRV0gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgyNTYpKSk7CisjZW5kaWYKKworc3RhdGljIGlubGluZSBpbnQgcmFpZDZfbmV4dF9kaXNrKGludCBkaXNrLCBpbnQgcmFpZF9kaXNrcykKK3sKKwlkaXNrKys7CisJcmV0dXJuIChkaXNrIDwgcmFpZF9kaXNrcykgPyBkaXNrIDogMDsKK30KIHN0YXRpYyB2b2lkIHByaW50X3JhaWQ1X2NvbmYgKHJhaWQ1X2NvbmZfdCAqY29uZik7CiAKIHN0YXRpYyB2b2lkIF9fcmVsZWFzZV9zdHJpcGUocmFpZDVfY29uZl90ICpjb25mLCBzdHJ1Y3Qgc3RyaXBlX2hlYWQgKnNoKQpAQCAtMTA0LDcgKzExNyw3IEBACiB7CiAJcmFpZDVfY29uZl90ICpjb25mID0gc2gtPnJhaWRfY29uZjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCQorCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNvbmYtPmRldmljZV9sb2NrLCBmbGFncyk7CiAJX19yZWxlYXNlX3N0cmlwZShjb25mLCBzaCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29uZi0+ZGV2aWNlX2xvY2ssIGZsYWdzKTsKQEAgLTExNyw3ICsxMzAsNyBAQAogCWhsaXN0X2RlbF9pbml0KCZzaC0+aGFzaCk7CiB9CiAKLXN0YXRpYyB2b2lkIGluc2VydF9oYXNoKHJhaWQ1X2NvbmZfdCAqY29uZiwgc3RydWN0IHN0cmlwZV9oZWFkICpzaCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbnNlcnRfaGFzaChyYWlkNV9jb25mX3QgKmNvbmYsIHN0cnVjdCBzdHJpcGVfaGVhZCAqc2gpCiB7CiAJc3RydWN0IGhsaXN0X2hlYWQgKmhwID0gc3RyaXBlX2hhc2goY29uZiwgc2gtPnNlY3Rvcik7CiAKQEAgLTE5MCw3ICsyMDMsNyBAQAogCQkodW5zaWduZWQgbG9uZyBsb25nKXNoLT5zZWN0b3IpOwogCiAJcmVtb3ZlX2hhc2goc2gpOwotCQorCiAJc2gtPnNlY3RvciA9IHNlY3RvcjsKIAlzaC0+cGRfaWR4ID0gcGRfaWR4OwogCXNoLT5zdGF0ZSA9IDA7CkBAIC0yNjksOCArMjgyLDkgQEAKIAkJCX0gZWxzZSB7CiAJCQkJaWYgKCF0ZXN0X2JpdChTVFJJUEVfSEFORExFLCAmc2gtPnN0YXRlKSkKIAkJCQkJYXRvbWljX2luYygmY29uZi0+YWN0aXZlX3N0cmlwZXMpOwotCQkJCWlmICghbGlzdF9lbXB0eSgmc2gtPmxydSkpCi0JCQkJCWxpc3RfZGVsX2luaXQoJnNoLT5scnUpOworCQkJCWlmIChsaXN0X2VtcHR5KCZzaC0+bHJ1KSkKKwkJCQkJQlVHKCk7CisJCQkJbGlzdF9kZWxfaW5pdCgmc2gtPmxydSk7CiAJCQl9CiAJCX0KIAl9IHdoaWxlIChzaCA9PSBOVUxMKTsKQEAgLTMyMSwxMCArMzM1LDkgQEAKIAkJcmV0dXJuIDE7CiAJY29uZi0+c2xhYl9jYWNoZSA9IHNjOwogCWNvbmYtPnBvb2xfc2l6ZSA9IGRldnM7Ci0Jd2hpbGUgKG51bS0tKSB7CisJd2hpbGUgKG51bS0tKQogCQlpZiAoIWdyb3dfb25lX3N0cmlwZShjb25mKSkKIAkJCXJldHVybiAxOwotCX0KIAlyZXR1cm4gMDsKIH0KIApAQCAtNjMxLDggKzY0NCw3IEBACiAJZGV2LT5yZXEuYmlfcHJpdmF0ZSA9IHNoOwogCiAJZGV2LT5mbGFncyA9IDA7Ci0JaWYgKGkgIT0gc2gtPnBkX2lkeCkKLQkJZGV2LT5zZWN0b3IgPSBjb21wdXRlX2Jsb2NrbnIoc2gsIGkpOworCWRldi0+c2VjdG9yID0gY29tcHV0ZV9ibG9ja25yKHNoLCBpKTsKIH0KIAogc3RhdGljIHZvaWQgZXJyb3IobWRkZXZfdCAqbWRkZXYsIG1ka19yZGV2X3QgKnJkZXYpCkBAIC02NTksNyArNjcxLDcgQEAKIAkJCSIgT3BlcmF0aW9uIGNvbnRpbnVpbmcgb24gJWQgZGV2aWNlc1xuIiwKIAkJCWJkZXZuYW1lKHJkZXYtPmJkZXYsYiksIGNvbmYtPndvcmtpbmdfZGlza3MpOwogCX0KLX0JCit9CiAKIC8qCiAgKiBJbnB1dDogYSAnYmlnJyBzZWN0b3IgbnVtYmVyLApAQCAtNjk3LDkgKzcwOSwxMiBAQAogCS8qCiAJICogU2VsZWN0IHRoZSBwYXJpdHkgZGlzayBiYXNlZCBvbiB0aGUgdXNlciBzZWxlY3RlZCBhbGdvcml0aG0uCiAJICovCi0JaWYgKGNvbmYtPmxldmVsID09IDQpCisJc3dpdGNoKGNvbmYtPmxldmVsKSB7CisJY2FzZSA0OgogCQkqcGRfaWR4ID0gZGF0YV9kaXNrczsKLQllbHNlIHN3aXRjaCAoY29uZi0+YWxnb3JpdGhtKSB7CisJCWJyZWFrOworCWNhc2UgNToKKwkJc3dpdGNoIChjb25mLT5hbGdvcml0aG0pIHsKIAkJY2FzZSBBTEdPUklUSE1fTEVGVF9BU1lNTUVUUklDOgogCQkJKnBkX2lkeCA9IGRhdGFfZGlza3MgLSBzdHJpcGUgJSByYWlkX2Rpc2tzOwogCQkJaWYgKCpkZF9pZHggPj0gKnBkX2lkeCkKQEAgLTcyMSw2ICs3MzYsMzkgQEAKIAkJZGVmYXVsdDoKIAkJCXByaW50ayhLRVJOX0VSUiAicmFpZDU6IHVuc3VwcG9ydGVkIGFsZ29yaXRobSAlZFxuIiwKIAkJCQljb25mLT5hbGdvcml0aG0pOworCQl9CisJCWJyZWFrOworCWNhc2UgNjoKKworCQkvKioqKiBGSVggVEhJUyAqKioqLworCQlzd2l0Y2ggKGNvbmYtPmFsZ29yaXRobSkgeworCQljYXNlIEFMR09SSVRITV9MRUZUX0FTWU1NRVRSSUM6CisJCQkqcGRfaWR4ID0gcmFpZF9kaXNrcyAtIDEgLSAoc3RyaXBlICUgcmFpZF9kaXNrcyk7CisJCQlpZiAoKnBkX2lkeCA9PSByYWlkX2Rpc2tzLTEpCisJCQkJKCpkZF9pZHgpKys7IAkvKiBRIEQgRCBEIFAgKi8KKwkJCWVsc2UgaWYgKCpkZF9pZHggPj0gKnBkX2lkeCkKKwkJCQkoKmRkX2lkeCkgKz0gMjsgLyogRCBEIFAgUSBEICovCisJCQlicmVhazsKKwkJY2FzZSBBTEdPUklUSE1fUklHSFRfQVNZTU1FVFJJQzoKKwkJCSpwZF9pZHggPSBzdHJpcGUgJSByYWlkX2Rpc2tzOworCQkJaWYgKCpwZF9pZHggPT0gcmFpZF9kaXNrcy0xKQorCQkJCSgqZGRfaWR4KSsrOyAJLyogUSBEIEQgRCBQICovCisJCQllbHNlIGlmICgqZGRfaWR4ID49ICpwZF9pZHgpCisJCQkJKCpkZF9pZHgpICs9IDI7IC8qIEQgRCBQIFEgRCAqLworCQkJYnJlYWs7CisJCWNhc2UgQUxHT1JJVEhNX0xFRlRfU1lNTUVUUklDOgorCQkJKnBkX2lkeCA9IHJhaWRfZGlza3MgLSAxIC0gKHN0cmlwZSAlIHJhaWRfZGlza3MpOworCQkJKmRkX2lkeCA9ICgqcGRfaWR4ICsgMiArICpkZF9pZHgpICUgcmFpZF9kaXNrczsKKwkJCWJyZWFrOworCQljYXNlIEFMR09SSVRITV9SSUdIVF9TWU1NRVRSSUM6CisJCQkqcGRfaWR4ID0gc3RyaXBlICUgcmFpZF9kaXNrczsKKwkJCSpkZF9pZHggPSAoKnBkX2lkeCArIDIgKyAqZGRfaWR4KSAlIHJhaWRfZGlza3M7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50ayAoS0VSTl9DUklUICJyYWlkNjogdW5zdXBwb3J0ZWQgYWxnb3JpdGhtICVkXG4iLAorCQkJCWNvbmYtPmFsZ29yaXRobSk7CisJCX0KKwkJYnJlYWs7CiAJfQogCiAJLyoKQEAgLTc0MiwxMiArNzkwLDE3IEBACiAJaW50IGNodW5rX251bWJlciwgZHVtbXkxLCBkdW1teTIsIGRkX2lkeCA9IGk7CiAJc2VjdG9yX3Qgcl9zZWN0b3I7CiAKKwogCWNodW5rX29mZnNldCA9IHNlY3Rvcl9kaXYobmV3X3NlY3Rvciwgc2VjdG9yc19wZXJfY2h1bmspOwogCXN0cmlwZSA9IG5ld19zZWN0b3I7CiAJQlVHX09OKG5ld19zZWN0b3IgIT0gc3RyaXBlKTsKIAotCQotCXN3aXRjaCAoY29uZi0+YWxnb3JpdGhtKSB7CisJaWYgKGkgPT0gc2gtPnBkX2lkeCkKKwkJcmV0dXJuIDA7CisJc3dpdGNoKGNvbmYtPmxldmVsKSB7CisJY2FzZSA0OiBicmVhazsKKwljYXNlIDU6CisJCXN3aXRjaCAoY29uZi0+YWxnb3JpdGhtKSB7CiAJCWNhc2UgQUxHT1JJVEhNX0xFRlRfQVNZTU1FVFJJQzoKIAkJY2FzZSBBTEdPUklUSE1fUklHSFRfQVNZTU1FVFJJQzoKIAkJCWlmIChpID4gc2gtPnBkX2lkeCkKQEAgLTc2MSw3ICs4MTQsMzcgQEAKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJcHJpbnRrKEtFUk5fRVJSICJyYWlkNTogdW5zdXBwb3J0ZWQgYWxnb3JpdGhtICVkXG4iLAorCQkJICAgICAgIGNvbmYtPmFsZ29yaXRobSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSA2OgorCQlkYXRhX2Rpc2tzID0gcmFpZF9kaXNrcyAtIDI7CisJCWlmIChpID09IHJhaWQ2X25leHRfZGlzayhzaC0+cGRfaWR4LCByYWlkX2Rpc2tzKSkKKwkJCXJldHVybiAwOyAvKiBJdCBpcyB0aGUgUSBkaXNrICovCisJCXN3aXRjaCAoY29uZi0+YWxnb3JpdGhtKSB7CisJCWNhc2UgQUxHT1JJVEhNX0xFRlRfQVNZTU1FVFJJQzoKKwkJY2FzZSBBTEdPUklUSE1fUklHSFRfQVNZTU1FVFJJQzoKKwkJICAJaWYgKHNoLT5wZF9pZHggPT0gcmFpZF9kaXNrcy0xKQorCQkJCWktLTsgCS8qIFEgRCBEIEQgUCAqLworCQkJZWxzZSBpZiAoaSA+IHNoLT5wZF9pZHgpCisJCQkJaSAtPSAyOyAvKiBEIEQgUCBRIEQgKi8KKwkJCWJyZWFrOworCQljYXNlIEFMR09SSVRITV9MRUZUX1NZTU1FVFJJQzoKKwkJY2FzZSBBTEdPUklUSE1fUklHSFRfU1lNTUVUUklDOgorCQkJaWYgKHNoLT5wZF9pZHggPT0gcmFpZF9kaXNrcy0xKQorCQkJCWktLTsgLyogUSBEIEQgRCBQICovCisJCQllbHNlIHsKKwkJCQkvKiBEIEQgUCBRIEQgKi8KKwkJCQlpZiAoaSA8IHNoLT5wZF9pZHgpCisJCQkJCWkgKz0gcmFpZF9kaXNrczsKKwkJCQlpIC09IChzaC0+cGRfaWR4ICsgMik7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50ayAoS0VSTl9DUklUICJyYWlkNjogdW5zdXBwb3J0ZWQgYWxnb3JpdGhtICVkXG4iLAogCQkJCWNvbmYtPmFsZ29yaXRobSk7CisJCX0KKwkJYnJlYWs7CiAJfQogCiAJY2h1bmtfbnVtYmVyID0gc3RyaXBlICogZGF0YV9kaXNrcyArIGk7CkBAIC03NzgsMTAgKzg2MSwxMSBAQAogCiAKIC8qCi0gKiBDb3B5IGRhdGEgYmV0d2VlbiBhIHBhZ2UgaW4gdGhlIHN0cmlwZSBjYWNoZSwgYW5kIGEgYmlvLgotICogVGhlcmUgYXJlIG5vIGFsaWdubWVudCBvciBzaXplIGd1YXJhbnRlZXMgYmV0d2VlbiB0aGUgcGFnZSBvciB0aGUKLSAqIGJpbyBleGNlcHQgdGhhdCB0aGVyZSBpcyBzb21lIG92ZXJsYXAuCi0gKiBBbGwgaW92ZWNzIGluIHRoZSBiaW8gbXVzdCBiZSBjb25zaWRlcmVkLgorICogQ29weSBkYXRhIGJldHdlZW4gYSBwYWdlIGluIHRoZSBzdHJpcGUgY2FjaGUsIGFuZCBvbmUgb3IgbW9yZSBiaW9uCisgKiBUaGUgcGFnZSBjb3VsZCBhbGlnbiB3aXRoIHRoZSBtaWRkbGUgb2YgdGhlIGJpbywgb3IgdGhlcmUgY291bGQgYmUKKyAqIHNldmVyYWwgYmlvbiwgZWFjaCB3aXRoIHNldmVyYWwgYmlvX3ZlY3MsIHdoaWNoIGNvdmVyIHBhcnQgb2YgdGhlIHBhZ2UKKyAqIE11bHRpcGxlIGJpb24gYXJlIGxpbmtlZCB0b2dldGhlciBvbiBiaV9uZXh0LiAgVGhlcmUgbWF5IGJlIGV4dHJhcworICogYXQgdGhlIGVuZCBvZiB0aGlzIGxpc3QuICBXZSBpZ25vcmUgdGhlbS4KICAqLwogc3RhdGljIHZvaWQgY29weV9kYXRhKGludCBmcm9tYmlvLCBzdHJ1Y3QgYmlvICpiaW8sCiAJCSAgICAgc3RydWN0IHBhZ2UgKnBhZ2UsCkBAIC04MTAsNyArODk0LDcgQEAKIAkJaWYgKGxlbiA+IDAgJiYgcGFnZV9vZmZzZXQgKyBsZW4gPiBTVFJJUEVfU0laRSkKIAkJCWNsZW4gPSBTVFJJUEVfU0laRSAtIHBhZ2Vfb2Zmc2V0OwogCQllbHNlIGNsZW4gPSBsZW47Ci0JCQkKKwogCQlpZiAoY2xlbiA+IDApIHsKIAkJCWNoYXIgKmJhID0gX19iaW9fa21hcF9hdG9taWMoYmlvLCBpLCBLTV9VU0VSMCk7CiAJCQlpZiAoZnJvbWJpbykKQEAgLTg2MiwxNCArOTQ2LDE0IEBACiAJc2V0X2JpdChSNV9VUFRPREFURSwgJnNoLT5kZXZbZGRfaWR4XS5mbGFncyk7CiB9CiAKLXN0YXRpYyB2b2lkIGNvbXB1dGVfcGFyaXR5KHN0cnVjdCBzdHJpcGVfaGVhZCAqc2gsIGludCBtZXRob2QpCitzdGF0aWMgdm9pZCBjb21wdXRlX3Bhcml0eTUoc3RydWN0IHN0cmlwZV9oZWFkICpzaCwgaW50IG1ldGhvZCkKIHsKIAlyYWlkNV9jb25mX3QgKmNvbmYgPSBzaC0+cmFpZF9jb25mOwogCWludCBpLCBwZF9pZHggPSBzaC0+cGRfaWR4LCBkaXNrcyA9IHNoLT5kaXNrcywgY291bnQ7CiAJdm9pZCAqcHRyW01BWF9YT1JfQkxPQ0tTXTsKIAlzdHJ1Y3QgYmlvICpjaG9zZW47CiAKLQlQUklOVEsoImNvbXB1dGVfcGFyaXR5LCBzdHJpcGUgJWxsdSwgbWV0aG9kICVkXG4iLAorCVBSSU5USygiY29tcHV0ZV9wYXJpdHk1LCBzdHJpcGUgJWxsdSwgbWV0aG9kICVkXG4iLAogCQkodW5zaWduZWQgbG9uZyBsb25nKXNoLT5zZWN0b3IsIG1ldGhvZCk7CiAKIAljb3VudCA9IDE7CkBAIC05NTYsOSArMTA0MCwxOTUgQEAKIAkJY2xlYXJfYml0KFI1X1VQVE9EQVRFLCAmc2gtPmRldltwZF9pZHhdLmZsYWdzKTsKIH0KIAorc3RhdGljIHZvaWQgY29tcHV0ZV9wYXJpdHk2KHN0cnVjdCBzdHJpcGVfaGVhZCAqc2gsIGludCBtZXRob2QpCit7CisJcmFpZDZfY29uZl90ICpjb25mID0gc2gtPnJhaWRfY29uZjsKKwlpbnQgaSwgcGRfaWR4ID0gc2gtPnBkX2lkeCwgcWRfaWR4LCBkMF9pZHgsIGRpc2tzID0gY29uZi0+cmFpZF9kaXNrcywgY291bnQ7CisJc3RydWN0IGJpbyAqY2hvc2VuOworCS8qKioqIEZJWCBUSElTOiBUaGlzIGNvdWxkIGJlIHZlcnkgYmFkIGlmIGRpc2tzIGlzIGNsb3NlIHRvIDI1NiAqKioqLworCXZvaWQgKnB0cnNbZGlza3NdOworCisJcWRfaWR4ID0gcmFpZDZfbmV4dF9kaXNrKHBkX2lkeCwgZGlza3MpOworCWQwX2lkeCA9IHJhaWQ2X25leHRfZGlzayhxZF9pZHgsIGRpc2tzKTsKKworCVBSSU5USygiY29tcHV0ZV9wYXJpdHksIHN0cmlwZSAlbGx1LCBtZXRob2QgJWRcbiIsCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpc2gtPnNlY3RvciwgbWV0aG9kKTsKKworCXN3aXRjaChtZXRob2QpIHsKKwljYXNlIFJFQURfTU9ESUZZX1dSSVRFOgorCQlCVUcoKTsJCS8qIFJFQURfTU9ESUZZX1dSSVRFIE4vQSBmb3IgUkFJRC02ICovCisJY2FzZSBSRUNPTlNUUlVDVF9XUklURToKKwkJZm9yIChpPSBkaXNrczsgaS0tIDspCisJCQlpZiAoIGkgIT0gcGRfaWR4ICYmIGkgIT0gcWRfaWR4ICYmIHNoLT5kZXZbaV0udG93cml0ZSApIHsKKwkJCQljaG9zZW4gPSBzaC0+ZGV2W2ldLnRvd3JpdGU7CisJCQkJc2gtPmRldltpXS50b3dyaXRlID0gTlVMTDsKKworCQkJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoUjVfT3ZlcmxhcCwgJnNoLT5kZXZbaV0uZmxhZ3MpKQorCQkJCQl3YWtlX3VwKCZjb25mLT53YWl0X2Zvcl9vdmVybGFwKTsKKworCQkJCWlmIChzaC0+ZGV2W2ldLndyaXR0ZW4pIEJVRygpOworCQkJCXNoLT5kZXZbaV0ud3JpdHRlbiA9IGNob3NlbjsKKwkJCX0KKwkJYnJlYWs7CisJY2FzZSBDSEVDS19QQVJJVFk6CisJCUJVRygpOwkJLyogTm90IGltcGxlbWVudGVkIHlldCAqLworCX0KKworCWZvciAoaSA9IGRpc2tzOyBpLS07KQorCQlpZiAoc2gtPmRldltpXS53cml0dGVuKSB7CisJCQlzZWN0b3JfdCBzZWN0b3IgPSBzaC0+ZGV2W2ldLnNlY3RvcjsKKwkJCXN0cnVjdCBiaW8gKndiaSA9IHNoLT5kZXZbaV0ud3JpdHRlbjsKKwkJCXdoaWxlICh3YmkgJiYgd2JpLT5iaV9zZWN0b3IgPCBzZWN0b3IgKyBTVFJJUEVfU0VDVE9SUykgeworCQkJCWNvcHlfZGF0YSgxLCB3YmksIHNoLT5kZXZbaV0ucGFnZSwgc2VjdG9yKTsKKwkJCQl3YmkgPSByNV9uZXh0X2Jpbyh3YmksIHNlY3Rvcik7CisJCQl9CisKKwkJCXNldF9iaXQoUjVfTE9DS0VELCAmc2gtPmRldltpXS5mbGFncyk7CisJCQlzZXRfYml0KFI1X1VQVE9EQVRFLCAmc2gtPmRldltpXS5mbGFncyk7CisJCX0KKworLy8Jc3dpdGNoKG1ldGhvZCkgeworLy8JY2FzZSBSRUNPTlNUUlVDVF9XUklURToKKy8vCWNhc2UgQ0hFQ0tfUEFSSVRZOgorLy8JY2FzZSBVUERBVEVfUEFSSVRZOgorCQkvKiBOb3RlIHRoYXQgdW5saWtlIFJBSUQtNSwgdGhlIG9yZGVyaW5nIG9mIHRoZSBkaXNrcyBtYXR0ZXJzIGdyZWF0bHkuICovCisJCS8qIEZJWDogSXMgdGhpcyBvcmRlcmluZyBvZiBkcml2ZXMgZXZlbiByZW1vdGVseSBvcHRpbWFsPyAqLworCQljb3VudCA9IDA7CisJCWkgPSBkMF9pZHg7CisJCWRvIHsKKwkJCXB0cnNbY291bnQrK10gPSBwYWdlX2FkZHJlc3Moc2gtPmRldltpXS5wYWdlKTsKKwkJCWlmIChjb3VudCA8PSBkaXNrcy0yICYmICF0ZXN0X2JpdChSNV9VUFRPREFURSwgJnNoLT5kZXZbaV0uZmxhZ3MpKQorCQkJCXByaW50aygiYmxvY2sgJWQvJWQgbm90IHVwdG9kYXRlIG9uIHBhcml0eSBjYWxjXG4iLCBpLGNvdW50KTsKKwkJCWkgPSByYWlkNl9uZXh0X2Rpc2soaSwgZGlza3MpOworCQl9IHdoaWxlICggaSAhPSBkMF9pZHggKTsKKy8vCQlicmVhazsKKy8vCX0KKworCXJhaWQ2X2NhbGwuZ2VuX3N5bmRyb21lKGRpc2tzLCBTVFJJUEVfU0laRSwgcHRycyk7CisKKwlzd2l0Y2gobWV0aG9kKSB7CisJY2FzZSBSRUNPTlNUUlVDVF9XUklURToKKwkJc2V0X2JpdChSNV9VUFRPREFURSwgJnNoLT5kZXZbcGRfaWR4XS5mbGFncyk7CisJCXNldF9iaXQoUjVfVVBUT0RBVEUsICZzaC0+ZGV2W3FkX2lkeF0uZmxhZ3MpOworCQlzZXRfYml0KFI1X0xPQ0tFRCwgICAmc2gtPmRldltwZF9pZHhdLmZsYWdzKTsKKwkJc2V0X2JpdChSNV9MT0NLRUQsICAgJnNoLT5kZXZbcWRfaWR4XS5mbGFncyk7CisJCWJyZWFrOworCWNhc2UgVVBEQVRFX1BBUklUWToKKwkJc2V0X2JpdChSNV9VUFRPREFURSwgJnNoLT5kZXZbcGRfaWR4XS5mbGFncyk7CisJCXNldF9iaXQoUjVfVVBUT0RBVEUsICZzaC0+ZGV2W3FkX2lkeF0uZmxhZ3MpOworCQlicmVhazsKKwl9Cit9CisKKworLyogQ29tcHV0ZSBvbmUgbWlzc2luZyBibG9jayAqLworc3RhdGljIHZvaWQgY29tcHV0ZV9ibG9ja18xKHN0cnVjdCBzdHJpcGVfaGVhZCAqc2gsIGludCBkZF9pZHgsIGludCBub3plcm8pCit7CisJcmFpZDZfY29uZl90ICpjb25mID0gc2gtPnJhaWRfY29uZjsKKwlpbnQgaSwgY291bnQsIGRpc2tzID0gY29uZi0+cmFpZF9kaXNrczsKKwl2b2lkICpwdHJbTUFYX1hPUl9CTE9DS1NdLCAqcDsKKwlpbnQgcGRfaWR4ID0gc2gtPnBkX2lkeDsKKwlpbnQgcWRfaWR4ID0gcmFpZDZfbmV4dF9kaXNrKHBkX2lkeCwgZGlza3MpOworCisJUFJJTlRLKCJjb21wdXRlX2Jsb2NrXzEsIHN0cmlwZSAlbGx1LCBpZHggJWRcbiIsCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpc2gtPnNlY3RvciwgZGRfaWR4KTsKKworCWlmICggZGRfaWR4ID09IHFkX2lkeCApIHsKKwkJLyogV2UncmUgYWN0dWFsbHkgY29tcHV0aW5nIHRoZSBRIGRyaXZlICovCisJCWNvbXB1dGVfcGFyaXR5NihzaCwgVVBEQVRFX1BBUklUWSk7CisJfSBlbHNlIHsKKwkJcHRyWzBdID0gcGFnZV9hZGRyZXNzKHNoLT5kZXZbZGRfaWR4XS5wYWdlKTsKKwkJaWYgKCFub3plcm8pIG1lbXNldChwdHJbMF0sIDAsIFNUUklQRV9TSVpFKTsKKwkJY291bnQgPSAxOworCQlmb3IgKGkgPSBkaXNrcyA7IGktLTsgKSB7CisJCQlpZiAoaSA9PSBkZF9pZHggfHwgaSA9PSBxZF9pZHgpCisJCQkJY29udGludWU7CisJCQlwID0gcGFnZV9hZGRyZXNzKHNoLT5kZXZbaV0ucGFnZSk7CisJCQlpZiAodGVzdF9iaXQoUjVfVVBUT0RBVEUsICZzaC0+ZGV2W2ldLmZsYWdzKSkKKwkJCQlwdHJbY291bnQrK10gPSBwOworCQkJZWxzZQorCQkJCXByaW50aygiY29tcHV0ZV9ibG9jaygpICVkLCBzdHJpcGUgJWxsdSwgJWQiCisJCQkJICAgICAgICIgbm90IHByZXNlbnRcbiIsIGRkX2lkeCwKKwkJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylzaC0+c2VjdG9yLCBpKTsKKworCQkJY2hlY2tfeG9yKCk7CisJCX0KKwkJaWYgKGNvdW50ICE9IDEpCisJCQl4b3JfYmxvY2soY291bnQsIFNUUklQRV9TSVpFLCBwdHIpOworCQlpZiAoIW5vemVybykgc2V0X2JpdChSNV9VUFRPREFURSwgJnNoLT5kZXZbZGRfaWR4XS5mbGFncyk7CisJCWVsc2UgY2xlYXJfYml0KFI1X1VQVE9EQVRFLCAmc2gtPmRldltkZF9pZHhdLmZsYWdzKTsKKwl9Cit9CisKKy8qIENvbXB1dGUgdHdvIG1pc3NpbmcgYmxvY2tzICovCitzdGF0aWMgdm9pZCBjb21wdXRlX2Jsb2NrXzIoc3RydWN0IHN0cmlwZV9oZWFkICpzaCwgaW50IGRkX2lkeDEsIGludCBkZF9pZHgyKQoreworCXJhaWQ2X2NvbmZfdCAqY29uZiA9IHNoLT5yYWlkX2NvbmY7CisJaW50IGksIGNvdW50LCBkaXNrcyA9IGNvbmYtPnJhaWRfZGlza3M7CisJaW50IHBkX2lkeCA9IHNoLT5wZF9pZHg7CisJaW50IHFkX2lkeCA9IHJhaWQ2X25leHRfZGlzayhwZF9pZHgsIGRpc2tzKTsKKwlpbnQgZDBfaWR4ID0gcmFpZDZfbmV4dF9kaXNrKHFkX2lkeCwgZGlza3MpOworCWludCBmYWlsYSwgZmFpbGI7CisKKwkvKiBmYWlsYSBhbmQgZmFpbGIgYXJlIGRpc2sgbnVtYmVycyByZWxhdGl2ZSB0byBkMF9pZHggKi8KKwkvKiBwZF9pZHggYmVjb21lIGRpc2tzLTIgYW5kIHFkX2lkeCBiZWNvbWUgZGlza3MtMSAqLworCWZhaWxhID0gKGRkX2lkeDEgPCBkMF9pZHgpID8gZGRfaWR4MSsoZGlza3MtZDBfaWR4KSA6IGRkX2lkeDEtZDBfaWR4OworCWZhaWxiID0gKGRkX2lkeDIgPCBkMF9pZHgpID8gZGRfaWR4MisoZGlza3MtZDBfaWR4KSA6IGRkX2lkeDItZDBfaWR4OworCisJQlVHX09OKGZhaWxhID09IGZhaWxiKTsKKwlpZiAoIGZhaWxiIDwgZmFpbGEgKSB7IGludCB0bXAgPSBmYWlsYTsgZmFpbGEgPSBmYWlsYjsgZmFpbGIgPSB0bXA7IH0KKworCVBSSU5USygiY29tcHV0ZV9ibG9ja18yLCBzdHJpcGUgJWxsdSwgaWR4ICVkLCVkICglZCwlZClcbiIsCisJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpc2gtPnNlY3RvciwgZGRfaWR4MSwgZGRfaWR4MiwgZmFpbGEsIGZhaWxiKTsKKworCWlmICggZmFpbGIgPT0gZGlza3MtMSApIHsKKwkJLyogUSBkaXNrIGlzIG9uZSBvZiB0aGUgbWlzc2luZyBkaXNrcyAqLworCQlpZiAoIGZhaWxhID09IGRpc2tzLTIgKSB7CisJCQkvKiBNaXNzaW5nIFArUSwganVzdCByZWNvbXB1dGUgKi8KKwkJCWNvbXB1dGVfcGFyaXR5NihzaCwgVVBEQVRFX1BBUklUWSk7CisJCQlyZXR1cm47CisJCX0gZWxzZSB7CisJCQkvKiBXZSdyZSBtaXNzaW5nIEQrUTsgcmVjb21wdXRlIEQgZnJvbSBQICovCisJCQljb21wdXRlX2Jsb2NrXzEoc2gsIChkZF9pZHgxID09IHFkX2lkeCkgPyBkZF9pZHgyIDogZGRfaWR4MSwgMCk7CisJCQljb21wdXRlX3Bhcml0eTYoc2gsIFVQREFURV9QQVJJVFkpOyAvKiBJcyB0aGlzIG5lY2Vzc2FyeT8gKi8KKwkJCXJldHVybjsKKwkJfQorCX0KKworCS8qIFdlJ3JlIG1pc3NpbmcgRCtQIG9yIEQrRDsgYnVpbGQgcG9pbnRlciB0YWJsZSAqLworCXsKKwkJLyoqKiogRklYIFRISVM6IFRoaXMgY291bGQgYmUgdmVyeSBiYWQgaWYgZGlza3MgaXMgY2xvc2UgdG8gMjU2ICoqKiovCisJCXZvaWQgKnB0cnNbZGlza3NdOworCisJCWNvdW50ID0gMDsKKwkJaSA9IGQwX2lkeDsKKwkJZG8geworCQkJcHRyc1tjb3VudCsrXSA9IHBhZ2VfYWRkcmVzcyhzaC0+ZGV2W2ldLnBhZ2UpOworCQkJaSA9IHJhaWQ2X25leHRfZGlzayhpLCBkaXNrcyk7CisJCQlpZiAoaSAhPSBkZF9pZHgxICYmIGkgIT0gZGRfaWR4MiAmJgorCQkJICAgICF0ZXN0X2JpdChSNV9VUFRPREFURSwgJnNoLT5kZXZbaV0uZmxhZ3MpKQorCQkJCXByaW50aygiY29tcHV0ZV8yIHdpdGggbWlzc2luZyBibG9jayAlZC8lZFxuIiwgY291bnQsIGkpOworCQl9IHdoaWxlICggaSAhPSBkMF9pZHggKTsKKworCQlpZiAoIGZhaWxiID09IGRpc2tzLTIgKSB7CisJCQkvKiBXZSdyZSBtaXNzaW5nIEQrUC4gKi8KKwkJCXJhaWQ2X2RhdGFwX3JlY292KGRpc2tzLCBTVFJJUEVfU0laRSwgZmFpbGEsIHB0cnMpOworCQl9IGVsc2UgeworCQkJLyogV2UncmUgbWlzc2luZyBEK0QuICovCisJCQlyYWlkNl8yZGF0YV9yZWNvdihkaXNrcywgU1RSSVBFX1NJWkUsIGZhaWxhLCBmYWlsYiwgcHRycyk7CisJCX0KKworCQkvKiBCb3RoIHRoZSBhYm92ZSB1cGRhdGUgYm90aCBtaXNzaW5nIGJsb2NrcyAqLworCQlzZXRfYml0KFI1X1VQVE9EQVRFLCAmc2gtPmRldltkZF9pZHgxXS5mbGFncyk7CisJCXNldF9iaXQoUjVfVVBUT0RBVEUsICZzaC0+ZGV2W2RkX2lkeDJdLmZsYWdzKTsKKwl9Cit9CisKKworCiAvKgogICogRWFjaCBzdHJpcGUvZGV2IGNhbiBoYXZlIG9uZSBvciBtb3JlIGJpb24gYXR0YWNoZWQuCi0gKiB0b3JlYWQvdG93cml0ZSBwb2ludCB0byB0aGUgZmlyc3QgaW4gYSBjaGFpbi4gCisgKiB0b3JlYWQvdG93cml0ZSBwb2ludCB0byB0aGUgZmlyc3QgaW4gYSBjaGFpbi4KICAqIFRoZSBiaV9uZXh0IGNoYWluIG11c3QgYmUgaW4gb3JkZXIuCiAgKi8KIHN0YXRpYyBpbnQgYWRkX3N0cmlwZV9iaW8oc3RydWN0IHN0cmlwZV9oZWFkICpzaCwgc3RydWN0IGJpbyAqYmksIGludCBkZF9pZHgsIGludCBmb3J3cml0ZSkKQEAgLTEwMzEsNiArMTMwMSwxMyBAQAogCiBzdGF0aWMgdm9pZCBlbmRfcmVzaGFwZShyYWlkNV9jb25mX3QgKmNvbmYpOwogCitzdGF0aWMgaW50IHBhZ2VfaXNfemVybyhzdHJ1Y3QgcGFnZSAqcCkKK3sKKwljaGFyICphID0gcGFnZV9hZGRyZXNzKHApOworCXJldHVybiAoKCoodTMyKilhKSA9PSAwICYmCisJCW1lbWNtcChhLCBhKzQsIFNUUklQRV9TSVpFLTQpPT0wKTsKK30KKwogc3RhdGljIGludCBzdHJpcGVfdG9fcGRpZHgoc2VjdG9yX3Qgc3RyaXBlLCByYWlkNV9jb25mX3QgKmNvbmYsIGludCBkaXNrcykKIHsKIAlpbnQgc2VjdG9yc19wZXJfY2h1bmsgPSBjb25mLT5jaHVua19zaXplID4+IDk7CkBAIC0xMDYyLDcgKzEzMzksNyBAQAogICoKICAqLwogIAotc3RhdGljIHZvaWQgaGFuZGxlX3N0cmlwZShzdHJ1Y3Qgc3RyaXBlX2hlYWQgKnNoKQorc3RhdGljIHZvaWQgaGFuZGxlX3N0cmlwZTUoc3RydWN0IHN0cmlwZV9oZWFkICpzaCkKIHsKIAlyYWlkNV9jb25mX3QgKmNvbmYgPSBzaC0+cmFpZF9jb25mOwogCWludCBkaXNrcyA9IHNoLT5kaXNrczsKQEAgLTEzOTQsNyArMTY3MSw3IEBACiAJCWlmIChsb2NrZWQgPT0gMCAmJiAocmN3ID09IDAgfHxybXcgPT0gMCkgJiYKIAkJICAgICF0ZXN0X2JpdChTVFJJUEVfQklUX0RFTEFZLCAmc2gtPnN0YXRlKSkgewogCQkJUFJJTlRLKCJDb21wdXRpbmcgcGFyaXR5Li4uXG4iKTsKLQkJCWNvbXB1dGVfcGFyaXR5KHNoLCByY3c9PTAgPyBSRUNPTlNUUlVDVF9XUklURSA6IFJFQURfTU9ESUZZX1dSSVRFKTsKKwkJCWNvbXB1dGVfcGFyaXR5NShzaCwgcmN3PT0wID8gUkVDT05TVFJVQ1RfV1JJVEUgOiBSRUFEX01PRElGWV9XUklURSk7CiAJCQkvKiBub3cgZXZlcnkgbG9ja2VkIGJ1ZmZlciBpcyByZWFkeSB0byBiZSB3cml0dGVuICovCiAJCQlmb3IgKGk9ZGlza3M7IGktLTspCiAJCQkJaWYgKHRlc3RfYml0KFI1X0xPQ0tFRCwgJnNoLT5kZXZbaV0uZmxhZ3MpKSB7CkBAIC0xNDIxLDEzICsxNjk4LDEwIEBACiAJICAgICF0ZXN0X2JpdChTVFJJUEVfSU5TWU5DLCAmc2gtPnN0YXRlKSkgewogCQlzZXRfYml0KFNUUklQRV9IQU5ETEUsICZzaC0+c3RhdGUpOwogCQlpZiAoZmFpbGVkID09IDApIHsKLQkJCWNoYXIgKnBhZ2VhOwogCQkJQlVHX09OKHVwdG9kYXRlICE9IGRpc2tzKTsKLQkJCWNvbXB1dGVfcGFyaXR5KHNoLCBDSEVDS19QQVJJVFkpOworCQkJY29tcHV0ZV9wYXJpdHk1KHNoLCBDSEVDS19QQVJJVFkpOwogCQkJdXB0b2RhdGUtLTsKLQkJCXBhZ2VhID0gcGFnZV9hZGRyZXNzKHNoLT5kZXZbc2gtPnBkX2lkeF0ucGFnZSk7Ci0JCQlpZiAoKCoodTMyKilwYWdlYSkgPT0gMCAmJgotCQkJICAgICFtZW1jbXAocGFnZWEsIHBhZ2VhKzQsIFNUUklQRV9TSVpFLTQpKSB7CisJCQlpZiAocGFnZV9pc196ZXJvKHNoLT5kZXZbc2gtPnBkX2lkeF0ucGFnZSkpIHsKIAkJCQkvKiBwYXJpdHkgaXMgY29ycmVjdCAob24gZGlzYywgbm90IGluIGJ1ZmZlciBhbnkgbW9yZSkgKi8KIAkJCQlzZXRfYml0KFNUUklQRV9JTlNZTkMsICZzaC0+c3RhdGUpOwogCQkJfSBlbHNlIHsKQEAgLTE0ODcsNyArMTc2MSw3IEBACiAJCS8qIE5lZWQgdG8gd3JpdGUgb3V0IGFsbCBibG9ja3MgYWZ0ZXIgY29tcHV0aW5nIHBhcml0eSAqLwogCQlzaC0+ZGlza3MgPSBjb25mLT5yYWlkX2Rpc2tzOwogCQlzaC0+cGRfaWR4ID0gc3RyaXBlX3RvX3BkaWR4KHNoLT5zZWN0b3IsIGNvbmYsIGNvbmYtPnJhaWRfZGlza3MpOwotCQljb21wdXRlX3Bhcml0eShzaCwgUkVDT05TVFJVQ1RfV1JJVEUpOworCQljb21wdXRlX3Bhcml0eTUoc2gsIFJFQ09OU1RSVUNUX1dSSVRFKTsKIAkJZm9yIChpPSBjb25mLT5yYWlkX2Rpc2tzOyBpLS07KSB7CiAJCQlzZXRfYml0KFI1X0xPQ0tFRCwgJnNoLT5kZXZbaV0uZmxhZ3MpOwogCQkJbG9ja2VkKys7CkBAIC0xNjE1LDYgKzE4ODksNTY5IEBACiAJfQogfQogCitzdGF0aWMgdm9pZCBoYW5kbGVfc3RyaXBlNihzdHJ1Y3Qgc3RyaXBlX2hlYWQgKnNoLCBzdHJ1Y3QgcGFnZSAqdG1wX3BhZ2UpCit7CisJcmFpZDZfY29uZl90ICpjb25mID0gc2gtPnJhaWRfY29uZjsKKwlpbnQgZGlza3MgPSBjb25mLT5yYWlkX2Rpc2tzOworCXN0cnVjdCBiaW8gKnJldHVybl9iaT0gTlVMTDsKKwlzdHJ1Y3QgYmlvICpiaTsKKwlpbnQgaTsKKwlpbnQgc3luY2luZzsKKwlpbnQgbG9ja2VkPTAsIHVwdG9kYXRlPTAsIHRvX3JlYWQ9MCwgdG9fd3JpdGU9MCwgZmFpbGVkPTAsIHdyaXR0ZW49MDsKKwlpbnQgbm9uX292ZXJ3cml0ZSA9IDA7CisJaW50IGZhaWxlZF9udW1bMl0gPSB7MCwgMH07CisJc3RydWN0IHI1ZGV2ICpkZXYsICpwZGV2LCAqcWRldjsKKwlpbnQgcGRfaWR4ID0gc2gtPnBkX2lkeDsKKwlpbnQgcWRfaWR4ID0gcmFpZDZfbmV4dF9kaXNrKHBkX2lkeCwgZGlza3MpOworCWludCBwX2ZhaWxlZCwgcV9mYWlsZWQ7CisKKwlQUklOVEsoImhhbmRsaW5nIHN0cmlwZSAlbGx1LCBzdGF0ZT0lI2x4IGNudD0lZCwgcGRfaWR4PSVkLCBxZF9pZHg9JWRcbiIsCisJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpc2gtPnNlY3Rvciwgc2gtPnN0YXRlLCBhdG9taWNfcmVhZCgmc2gtPmNvdW50KSwKKwkgICAgICAgcGRfaWR4LCBxZF9pZHgpOworCisJc3Bpbl9sb2NrKCZzaC0+bG9jayk7CisJY2xlYXJfYml0KFNUUklQRV9IQU5ETEUsICZzaC0+c3RhdGUpOworCWNsZWFyX2JpdChTVFJJUEVfREVMQVlFRCwgJnNoLT5zdGF0ZSk7CisKKwlzeW5jaW5nID0gdGVzdF9iaXQoU1RSSVBFX1NZTkNJTkcsICZzaC0+c3RhdGUpOworCS8qIE5vdyB0byBsb29rIGFyb3VuZCBhbmQgc2VlIHdoYXQgY2FuIGJlIGRvbmUgKi8KKworCXJjdV9yZWFkX2xvY2soKTsKKwlmb3IgKGk9ZGlza3M7IGktLTsgKSB7CisJCW1ka19yZGV2X3QgKnJkZXY7CisJCWRldiA9ICZzaC0+ZGV2W2ldOworCQljbGVhcl9iaXQoUjVfSW5zeW5jLCAmZGV2LT5mbGFncyk7CisKKwkJUFJJTlRLKCJjaGVjayAlZDogc3RhdGUgMHglbHggcmVhZCAlcCB3cml0ZSAlcCB3cml0dGVuICVwXG4iLAorCQkJaSwgZGV2LT5mbGFncywgZGV2LT50b3JlYWQsIGRldi0+dG93cml0ZSwgZGV2LT53cml0dGVuKTsKKwkJLyogbWF5YmUgd2UgY2FuIHJlcGx5IHRvIGEgcmVhZCAqLworCQlpZiAodGVzdF9iaXQoUjVfVVBUT0RBVEUsICZkZXYtPmZsYWdzKSAmJiBkZXYtPnRvcmVhZCkgeworCQkJc3RydWN0IGJpbyAqcmJpLCAqcmJpMjsKKwkJCVBSSU5USygiUmV0dXJuIHJlYWQgZm9yIGRpc2MgJWRcbiIsIGkpOworCQkJc3Bpbl9sb2NrX2lycSgmY29uZi0+ZGV2aWNlX2xvY2spOworCQkJcmJpID0gZGV2LT50b3JlYWQ7CisJCQlkZXYtPnRvcmVhZCA9IE5VTEw7CisJCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFI1X092ZXJsYXAsICZkZXYtPmZsYWdzKSkKKwkJCQl3YWtlX3VwKCZjb25mLT53YWl0X2Zvcl9vdmVybGFwKTsKKwkJCXNwaW5fdW5sb2NrX2lycSgmY29uZi0+ZGV2aWNlX2xvY2spOworCQkJd2hpbGUgKHJiaSAmJiByYmktPmJpX3NlY3RvciA8IGRldi0+c2VjdG9yICsgU1RSSVBFX1NFQ1RPUlMpIHsKKwkJCQljb3B5X2RhdGEoMCwgcmJpLCBkZXYtPnBhZ2UsIGRldi0+c2VjdG9yKTsKKwkJCQlyYmkyID0gcjVfbmV4dF9iaW8ocmJpLCBkZXYtPnNlY3Rvcik7CisJCQkJc3Bpbl9sb2NrX2lycSgmY29uZi0+ZGV2aWNlX2xvY2spOworCQkJCWlmICgtLXJiaS0+YmlfcGh5c19zZWdtZW50cyA9PSAwKSB7CisJCQkJCXJiaS0+YmlfbmV4dCA9IHJldHVybl9iaTsKKwkJCQkJcmV0dXJuX2JpID0gcmJpOworCQkJCX0KKwkJCQlzcGluX3VubG9ja19pcnEoJmNvbmYtPmRldmljZV9sb2NrKTsKKwkJCQlyYmkgPSByYmkyOworCQkJfQorCQl9CisKKwkJLyogbm93IGNvdW50IHNvbWUgdGhpbmdzICovCisJCWlmICh0ZXN0X2JpdChSNV9MT0NLRUQsICZkZXYtPmZsYWdzKSkgbG9ja2VkKys7CisJCWlmICh0ZXN0X2JpdChSNV9VUFRPREFURSwgJmRldi0+ZmxhZ3MpKSB1cHRvZGF0ZSsrOworCisKKwkJaWYgKGRldi0+dG9yZWFkKSB0b19yZWFkKys7CisJCWlmIChkZXYtPnRvd3JpdGUpIHsKKwkJCXRvX3dyaXRlKys7CisJCQlpZiAoIXRlc3RfYml0KFI1X09WRVJXUklURSwgJmRldi0+ZmxhZ3MpKQorCQkJCW5vbl9vdmVyd3JpdGUrKzsKKwkJfQorCQlpZiAoZGV2LT53cml0dGVuKSB3cml0dGVuKys7CisJCXJkZXYgPSByY3VfZGVyZWZlcmVuY2UoY29uZi0+ZGlza3NbaV0ucmRldik7CisJCWlmICghcmRldiB8fCAhdGVzdF9iaXQoSW5fc3luYywgJnJkZXYtPmZsYWdzKSkgeworCQkJLyogVGhlIFJlYWRFcnJvciBmbGFnIHdpbGwganVzdCBiZSBjb25mdXNpbmcgbm93ICovCisJCQljbGVhcl9iaXQoUjVfUmVhZEVycm9yLCAmZGV2LT5mbGFncyk7CisJCQljbGVhcl9iaXQoUjVfUmVXcml0ZSwgJmRldi0+ZmxhZ3MpOworCQl9CisJCWlmICghcmRldiB8fCAhdGVzdF9iaXQoSW5fc3luYywgJnJkZXYtPmZsYWdzKQorCQkgICAgfHwgdGVzdF9iaXQoUjVfUmVhZEVycm9yLCAmZGV2LT5mbGFncykpIHsKKwkJCWlmICggZmFpbGVkIDwgMiApCisJCQkJZmFpbGVkX251bVtmYWlsZWRdID0gaTsKKwkJCWZhaWxlZCsrOworCQl9IGVsc2UKKwkJCXNldF9iaXQoUjVfSW5zeW5jLCAmZGV2LT5mbGFncyk7CisJfQorCXJjdV9yZWFkX3VubG9jaygpOworCVBSSU5USygibG9ja2VkPSVkIHVwdG9kYXRlPSVkIHRvX3JlYWQ9JWQiCisJICAgICAgICIgdG9fd3JpdGU9JWQgZmFpbGVkPSVkIGZhaWxlZF9udW09JWQsJWRcbiIsCisJICAgICAgIGxvY2tlZCwgdXB0b2RhdGUsIHRvX3JlYWQsIHRvX3dyaXRlLCBmYWlsZWQsCisJICAgICAgIGZhaWxlZF9udW1bMF0sIGZhaWxlZF9udW1bMV0pOworCS8qIGNoZWNrIGlmIHRoZSBhcnJheSBoYXMgbG9zdCA+MiBkZXZpY2VzIGFuZCwgaWYgc28sIHNvbWUgcmVxdWVzdHMgbWlnaHQKKwkgKiBuZWVkIHRvIGJlIGZhaWxlZAorCSAqLworCWlmIChmYWlsZWQgPiAyICYmIHRvX3JlYWQrdG9fd3JpdGUrd3JpdHRlbikgeworCQlmb3IgKGk9ZGlza3M7IGktLTsgKSB7CisJCQlpbnQgYml0bWFwX2VuZCA9IDA7CisKKwkJCWlmICh0ZXN0X2JpdChSNV9SZWFkRXJyb3IsICZzaC0+ZGV2W2ldLmZsYWdzKSkgeworCQkJCW1ka19yZGV2X3QgKnJkZXY7CisJCQkJcmN1X3JlYWRfbG9jaygpOworCQkJCXJkZXYgPSByY3VfZGVyZWZlcmVuY2UoY29uZi0+ZGlza3NbaV0ucmRldik7CisJCQkJaWYgKHJkZXYgJiYgdGVzdF9iaXQoSW5fc3luYywgJnJkZXYtPmZsYWdzKSkKKwkJCQkJLyogbXVsdGlwbGUgcmVhZCBmYWlsdXJlcyBpbiBvbmUgc3RyaXBlICovCisJCQkJCW1kX2Vycm9yKGNvbmYtPm1kZGV2LCByZGV2KTsKKwkJCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJCX0KKworCQkJc3Bpbl9sb2NrX2lycSgmY29uZi0+ZGV2aWNlX2xvY2spOworCQkJLyogZmFpbCBhbGwgd3JpdGVzIGZpcnN0ICovCisJCQliaSA9IHNoLT5kZXZbaV0udG93cml0ZTsKKwkJCXNoLT5kZXZbaV0udG93cml0ZSA9IE5VTEw7CisJCQlpZiAoYmkpIHsgdG9fd3JpdGUtLTsgYml0bWFwX2VuZCA9IDE7IH0KKworCQkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChSNV9PdmVybGFwLCAmc2gtPmRldltpXS5mbGFncykpCisJCQkJd2FrZV91cCgmY29uZi0+d2FpdF9mb3Jfb3ZlcmxhcCk7CisKKwkJCXdoaWxlIChiaSAmJiBiaS0+Ymlfc2VjdG9yIDwgc2gtPmRldltpXS5zZWN0b3IgKyBTVFJJUEVfU0VDVE9SUyl7CisJCQkJc3RydWN0IGJpbyAqbmV4dGJpID0gcjVfbmV4dF9iaW8oYmksIHNoLT5kZXZbaV0uc2VjdG9yKTsKKwkJCQljbGVhcl9iaXQoQklPX1VQVE9EQVRFLCAmYmktPmJpX2ZsYWdzKTsKKwkJCQlpZiAoLS1iaS0+YmlfcGh5c19zZWdtZW50cyA9PSAwKSB7CisJCQkJCW1kX3dyaXRlX2VuZChjb25mLT5tZGRldik7CisJCQkJCWJpLT5iaV9uZXh0ID0gcmV0dXJuX2JpOworCQkJCQlyZXR1cm5fYmkgPSBiaTsKKwkJCQl9CisJCQkJYmkgPSBuZXh0Ymk7CisJCQl9CisJCQkvKiBhbmQgZmFpbCBhbGwgJ3dyaXR0ZW4nICovCisJCQliaSA9IHNoLT5kZXZbaV0ud3JpdHRlbjsKKwkJCXNoLT5kZXZbaV0ud3JpdHRlbiA9IE5VTEw7CisJCQlpZiAoYmkpIGJpdG1hcF9lbmQgPSAxOworCQkJd2hpbGUgKGJpICYmIGJpLT5iaV9zZWN0b3IgPCBzaC0+ZGV2W2ldLnNlY3RvciArIFNUUklQRV9TRUNUT1JTKSB7CisJCQkJc3RydWN0IGJpbyAqYmkyID0gcjVfbmV4dF9iaW8oYmksIHNoLT5kZXZbaV0uc2VjdG9yKTsKKwkJCQljbGVhcl9iaXQoQklPX1VQVE9EQVRFLCAmYmktPmJpX2ZsYWdzKTsKKwkJCQlpZiAoLS1iaS0+YmlfcGh5c19zZWdtZW50cyA9PSAwKSB7CisJCQkJCW1kX3dyaXRlX2VuZChjb25mLT5tZGRldik7CisJCQkJCWJpLT5iaV9uZXh0ID0gcmV0dXJuX2JpOworCQkJCQlyZXR1cm5fYmkgPSBiaTsKKwkJCQl9CisJCQkJYmkgPSBiaTI7CisJCQl9CisKKwkJCS8qIGZhaWwgYW55IHJlYWRzIGlmIHRoaXMgZGV2aWNlIGlzIG5vbi1vcGVyYXRpb25hbCAqLworCQkJaWYgKCF0ZXN0X2JpdChSNV9JbnN5bmMsICZzaC0+ZGV2W2ldLmZsYWdzKSB8fAorCQkJICAgIHRlc3RfYml0KFI1X1JlYWRFcnJvciwgJnNoLT5kZXZbaV0uZmxhZ3MpKSB7CisJCQkJYmkgPSBzaC0+ZGV2W2ldLnRvcmVhZDsKKwkJCQlzaC0+ZGV2W2ldLnRvcmVhZCA9IE5VTEw7CisJCQkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChSNV9PdmVybGFwLCAmc2gtPmRldltpXS5mbGFncykpCisJCQkJCXdha2VfdXAoJmNvbmYtPndhaXRfZm9yX292ZXJsYXApOworCQkJCWlmIChiaSkgdG9fcmVhZC0tOworCQkJCXdoaWxlIChiaSAmJiBiaS0+Ymlfc2VjdG9yIDwgc2gtPmRldltpXS5zZWN0b3IgKyBTVFJJUEVfU0VDVE9SUyl7CisJCQkJCXN0cnVjdCBiaW8gKm5leHRiaSA9IHI1X25leHRfYmlvKGJpLCBzaC0+ZGV2W2ldLnNlY3Rvcik7CisJCQkJCWNsZWFyX2JpdChCSU9fVVBUT0RBVEUsICZiaS0+YmlfZmxhZ3MpOworCQkJCQlpZiAoLS1iaS0+YmlfcGh5c19zZWdtZW50cyA9PSAwKSB7CisJCQkJCQliaS0+YmlfbmV4dCA9IHJldHVybl9iaTsKKwkJCQkJCXJldHVybl9iaSA9IGJpOworCQkJCQl9CisJCQkJCWJpID0gbmV4dGJpOworCQkJCX0KKwkJCX0KKwkJCXNwaW5fdW5sb2NrX2lycSgmY29uZi0+ZGV2aWNlX2xvY2spOworCQkJaWYgKGJpdG1hcF9lbmQpCisJCQkJYml0bWFwX2VuZHdyaXRlKGNvbmYtPm1kZGV2LT5iaXRtYXAsIHNoLT5zZWN0b3IsCisJCQkJCQlTVFJJUEVfU0VDVE9SUywgMCwgMCk7CisJCX0KKwl9CisJaWYgKGZhaWxlZCA+IDIgJiYgc3luY2luZykgeworCQltZF9kb25lX3N5bmMoY29uZi0+bWRkZXYsIFNUUklQRV9TRUNUT1JTLDApOworCQljbGVhcl9iaXQoU1RSSVBFX1NZTkNJTkcsICZzaC0+c3RhdGUpOworCQlzeW5jaW5nID0gMDsKKwl9CisKKwkvKgorCSAqIG1pZ2h0IGJlIGFibGUgdG8gcmV0dXJuIHNvbWUgd3JpdGUgcmVxdWVzdHMgaWYgdGhlIHBhcml0eSBibG9ja3MKKwkgKiBhcmUgc2FmZSwgb3Igb24gYSBmYWlsZWQgZHJpdmUKKwkgKi8KKwlwZGV2ID0gJnNoLT5kZXZbcGRfaWR4XTsKKwlwX2ZhaWxlZCA9IChmYWlsZWQgPj0gMSAmJiBmYWlsZWRfbnVtWzBdID09IHBkX2lkeCkKKwkJfHwgKGZhaWxlZCA+PSAyICYmIGZhaWxlZF9udW1bMV0gPT0gcGRfaWR4KTsKKwlxZGV2ID0gJnNoLT5kZXZbcWRfaWR4XTsKKwlxX2ZhaWxlZCA9IChmYWlsZWQgPj0gMSAmJiBmYWlsZWRfbnVtWzBdID09IHFkX2lkeCkKKwkJfHwgKGZhaWxlZCA+PSAyICYmIGZhaWxlZF9udW1bMV0gPT0gcWRfaWR4KTsKKworCWlmICggd3JpdHRlbiAmJgorCSAgICAgKCBwX2ZhaWxlZCB8fCAoKHRlc3RfYml0KFI1X0luc3luYywgJnBkZXYtPmZsYWdzKQorCQkJICAgICAmJiAhdGVzdF9iaXQoUjVfTE9DS0VELCAmcGRldi0+ZmxhZ3MpCisJCQkgICAgICYmIHRlc3RfYml0KFI1X1VQVE9EQVRFLCAmcGRldi0+ZmxhZ3MpKSkgKSAmJgorCSAgICAgKCBxX2ZhaWxlZCB8fCAoKHRlc3RfYml0KFI1X0luc3luYywgJnFkZXYtPmZsYWdzKQorCQkJICAgICAmJiAhdGVzdF9iaXQoUjVfTE9DS0VELCAmcWRldi0+ZmxhZ3MpCisJCQkgICAgICYmIHRlc3RfYml0KFI1X1VQVE9EQVRFLCAmcWRldi0+ZmxhZ3MpKSkgKSApIHsKKwkJLyogYW55IHdyaXR0ZW4gYmxvY2sgb24gYW4gdXB0b2RhdGUgb3IgZmFpbGVkIGRyaXZlIGNhbiBiZQorCQkgKiByZXR1cm5lZC4gIE5vdGUgdGhhdCBpZiB3ZSAnd3JvdGUnIHRvIGEgZmFpbGVkIGRyaXZlLAorCQkgKiBpdCB3aWxsIGJlIFVQVE9EQVRFLCBidXQgbmV2ZXIgTE9DS0VELCBzbyB3ZSBkb24ndCBuZWVkCisJCSAqIHRvIHRlc3QgJ2ZhaWxlZCcgZGlyZWN0bHkuCisJCSAqLworCQlmb3IgKGk9ZGlza3M7IGktLTsgKQorCQkJaWYgKHNoLT5kZXZbaV0ud3JpdHRlbikgeworCQkJCWRldiA9ICZzaC0+ZGV2W2ldOworCQkJCWlmICghdGVzdF9iaXQoUjVfTE9DS0VELCAmZGV2LT5mbGFncykgJiYKKwkJCQkgICAgdGVzdF9iaXQoUjVfVVBUT0RBVEUsICZkZXYtPmZsYWdzKSApIHsKKwkJCQkJLyogV2UgY2FuIHJldHVybiBhbnkgd3JpdGUgcmVxdWVzdHMgKi8KKwkJCQkJaW50IGJpdG1hcF9lbmQgPSAwOworCQkJCQlzdHJ1Y3QgYmlvICp3YmksICp3YmkyOworCQkJCQlQUklOVEsoIlJldHVybiB3cml0ZSBmb3Igc3RyaXBlICVsbHUgZGlzYyAlZFxuIiwKKwkJCQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpc2gtPnNlY3RvciwgaSk7CisJCQkJCXNwaW5fbG9ja19pcnEoJmNvbmYtPmRldmljZV9sb2NrKTsKKwkJCQkJd2JpID0gZGV2LT53cml0dGVuOworCQkJCQlkZXYtPndyaXR0ZW4gPSBOVUxMOworCQkJCQl3aGlsZSAod2JpICYmIHdiaS0+Ymlfc2VjdG9yIDwgZGV2LT5zZWN0b3IgKyBTVFJJUEVfU0VDVE9SUykgeworCQkJCQkJd2JpMiA9IHI1X25leHRfYmlvKHdiaSwgZGV2LT5zZWN0b3IpOworCQkJCQkJaWYgKC0td2JpLT5iaV9waHlzX3NlZ21lbnRzID09IDApIHsKKwkJCQkJCQltZF93cml0ZV9lbmQoY29uZi0+bWRkZXYpOworCQkJCQkJCXdiaS0+YmlfbmV4dCA9IHJldHVybl9iaTsKKwkJCQkJCQlyZXR1cm5fYmkgPSB3Ymk7CisJCQkJCQl9CisJCQkJCQl3YmkgPSB3YmkyOworCQkJCQl9CisJCQkJCWlmIChkZXYtPnRvd3JpdGUgPT0gTlVMTCkKKwkJCQkJCWJpdG1hcF9lbmQgPSAxOworCQkJCQlzcGluX3VubG9ja19pcnEoJmNvbmYtPmRldmljZV9sb2NrKTsKKwkJCQkJaWYgKGJpdG1hcF9lbmQpCisJCQkJCQliaXRtYXBfZW5kd3JpdGUoY29uZi0+bWRkZXYtPmJpdG1hcCwgc2gtPnNlY3RvciwKKwkJCQkJCQkJU1RSSVBFX1NFQ1RPUlMsCisJCQkJCQkJCSF0ZXN0X2JpdChTVFJJUEVfREVHUkFERUQsICZzaC0+c3RhdGUpLCAwKTsKKwkJCQl9CisJCQl9CisJfQorCisJLyogTm93IHdlIG1pZ2h0IGNvbnNpZGVyIHJlYWRpbmcgc29tZSBibG9ja3MsIGVpdGhlciB0byBjaGVjay9nZW5lcmF0ZQorCSAqIHBhcml0eSwgb3IgdG8gc2F0aXNmeSByZXF1ZXN0cworCSAqIG9yIHRvIGxvYWQgYSBibG9jayB0aGF0IGlzIGJlaW5nIHBhcnRpYWxseSB3cml0dGVuLgorCSAqLworCWlmICh0b19yZWFkIHx8IG5vbl9vdmVyd3JpdGUgfHwgKHRvX3dyaXRlICYmIGZhaWxlZCkgfHwgKHN5bmNpbmcgJiYgKHVwdG9kYXRlIDwgZGlza3MpKSkgeworCQlmb3IgKGk9ZGlza3M7IGktLTspIHsKKwkJCWRldiA9ICZzaC0+ZGV2W2ldOworCQkJaWYgKCF0ZXN0X2JpdChSNV9MT0NLRUQsICZkZXYtPmZsYWdzKSAmJiAhdGVzdF9iaXQoUjVfVVBUT0RBVEUsICZkZXYtPmZsYWdzKSAmJgorCQkJICAgIChkZXYtPnRvcmVhZCB8fAorCQkJICAgICAoZGV2LT50b3dyaXRlICYmICF0ZXN0X2JpdChSNV9PVkVSV1JJVEUsICZkZXYtPmZsYWdzKSkgfHwKKwkJCSAgICAgc3luY2luZyB8fAorCQkJICAgICAoZmFpbGVkID49IDEgJiYgKHNoLT5kZXZbZmFpbGVkX251bVswXV0udG9yZWFkIHx8IHRvX3dyaXRlKSkgfHwKKwkJCSAgICAgKGZhaWxlZCA+PSAyICYmIChzaC0+ZGV2W2ZhaWxlZF9udW1bMV1dLnRvcmVhZCB8fCB0b193cml0ZSkpCisJCQkJICAgICkKKwkJCQkpIHsKKwkJCQkvKiB3ZSB3b3VsZCBsaWtlIHRvIGdldCB0aGlzIGJsb2NrLCBwb3NzaWJseQorCQkJCSAqIGJ5IGNvbXB1dGluZyBpdCwgYnV0IHdlIG1pZ2h0IG5vdCBiZSBhYmxlIHRvCisJCQkJICovCisJCQkJaWYgKHVwdG9kYXRlID09IGRpc2tzLTEpIHsKKwkJCQkJUFJJTlRLKCJDb21wdXRpbmcgc3RyaXBlICVsbHUgYmxvY2sgJWRcbiIsCisJCQkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXNoLT5zZWN0b3IsIGkpOworCQkJCQljb21wdXRlX2Jsb2NrXzEoc2gsIGksIDApOworCQkJCQl1cHRvZGF0ZSsrOworCQkJCX0gZWxzZSBpZiAoIHVwdG9kYXRlID09IGRpc2tzLTIgJiYgZmFpbGVkID49IDIgKSB7CisJCQkJCS8qIENvbXB1dGluZyAyLWZhaWx1cmUgaXMgKnZlcnkqIGV4cGVuc2l2ZTsgb25seSBkbyBpdCBpZiBmYWlsZWQgPj0gMiAqLworCQkJCQlpbnQgb3RoZXI7CisJCQkJCWZvciAob3RoZXI9ZGlza3M7IG90aGVyLS07KSB7CisJCQkJCQlpZiAoIG90aGVyID09IGkgKQorCQkJCQkJCWNvbnRpbnVlOworCQkJCQkJaWYgKCAhdGVzdF9iaXQoUjVfVVBUT0RBVEUsICZzaC0+ZGV2W290aGVyXS5mbGFncykgKQorCQkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCUJVR19PTihvdGhlciA8IDApOworCQkJCQlQUklOVEsoIkNvbXB1dGluZyBzdHJpcGUgJWxsdSBibG9ja3MgJWQsJWRcbiIsCisJCQkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXNoLT5zZWN0b3IsIGksIG90aGVyKTsKKwkJCQkJY29tcHV0ZV9ibG9ja18yKHNoLCBpLCBvdGhlcik7CisJCQkJCXVwdG9kYXRlICs9IDI7CisJCQkJfSBlbHNlIGlmICh0ZXN0X2JpdChSNV9JbnN5bmMsICZkZXYtPmZsYWdzKSkgeworCQkJCQlzZXRfYml0KFI1X0xPQ0tFRCwgJmRldi0+ZmxhZ3MpOworCQkJCQlzZXRfYml0KFI1X1dhbnRyZWFkLCAmZGV2LT5mbGFncyk7CisjaWYgMAorCQkJCQkvKiBpZiBJIGFtIGp1c3QgcmVhZGluZyB0aGlzIGJsb2NrIGFuZCB3ZSBkb24ndCBoYXZlCisJCQkJCSAgIGEgZmFpbGVkIGRyaXZlLCBvciBhbnkgcGVuZGluZyB3cml0ZXMgdGhlbiBzaWRlc3RlcCB0aGUgY2FjaGUgKi8KKwkJCQkJaWYgKHNoLT5iaF9yZWFkW2ldICYmICFzaC0+YmhfcmVhZFtpXS0+Yl9yZXFuZXh0ICYmCisJCQkJCSAgICAhIHN5bmNpbmcgJiYgIWZhaWxlZCAmJiAhdG9fd3JpdGUpIHsKKwkJCQkJCXNoLT5iaF9jYWNoZVtpXS0+Yl9wYWdlID0gIHNoLT5iaF9yZWFkW2ldLT5iX3BhZ2U7CisJCQkJCQlzaC0+YmhfY2FjaGVbaV0tPmJfZGF0YSA9ICBzaC0+YmhfcmVhZFtpXS0+Yl9kYXRhOworCQkJCQl9CisjZW5kaWYKKwkJCQkJbG9ja2VkKys7CisJCQkJCVBSSU5USygiUmVhZGluZyBibG9jayAlZCAoc3luYz0lZClcbiIsCisJCQkJCQlpLCBzeW5jaW5nKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJc2V0X2JpdChTVFJJUEVfSEFORExFLCAmc2gtPnN0YXRlKTsKKwl9CisKKwkvKiBub3cgdG8gY29uc2lkZXIgd3JpdGluZyBhbmQgd2hhdCBlbHNlLCBpZiBhbnl0aGluZyBzaG91bGQgYmUgcmVhZCAqLworCWlmICh0b193cml0ZSkgeworCQlpbnQgcmN3PTAsIG11c3RfY29tcHV0ZT0wOworCQlmb3IgKGk9ZGlza3MgOyBpLS07KSB7CisJCQlkZXYgPSAmc2gtPmRldltpXTsKKwkJCS8qIFdvdWxkIEkgaGF2ZSB0byByZWFkIHRoaXMgYnVmZmVyIGZvciByZWNvbnN0cnVjdF93cml0ZSAqLworCQkJaWYgKCF0ZXN0X2JpdChSNV9PVkVSV1JJVEUsICZkZXYtPmZsYWdzKQorCQkJICAgICYmIGkgIT0gcGRfaWR4ICYmIGkgIT0gcWRfaWR4CisJCQkgICAgJiYgKCF0ZXN0X2JpdChSNV9MT0NLRUQsICZkZXYtPmZsYWdzKQorI2lmIDAKKwkJCQl8fCBzaC0+YmhfcGFnZVtpXSAhPSBiaC0+Yl9wYWdlCisjZW5kaWYKKwkJCQkgICAgKSAmJgorCQkJICAgICF0ZXN0X2JpdChSNV9VUFRPREFURSwgJmRldi0+ZmxhZ3MpKSB7CisJCQkJaWYgKHRlc3RfYml0KFI1X0luc3luYywgJmRldi0+ZmxhZ3MpKSByY3crKzsKKwkJCQllbHNlIHsKKwkJCQkJUFJJTlRLKCJyYWlkNjogbXVzdF9jb21wdXRlOiBkaXNrICVkIGZsYWdzPSUjbHhcbiIsIGksIGRldi0+ZmxhZ3MpOworCQkJCQltdXN0X2NvbXB1dGUrKzsKKwkJCQl9CisJCQl9CisJCX0KKwkJUFJJTlRLKCJmb3Igc2VjdG9yICVsbHUsIHJjdz0lZCwgbXVzdF9jb21wdXRlPSVkXG4iLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylzaC0+c2VjdG9yLCByY3csIG11c3RfY29tcHV0ZSk7CisJCXNldF9iaXQoU1RSSVBFX0hBTkRMRSwgJnNoLT5zdGF0ZSk7CisKKwkJaWYgKHJjdyA+IDApCisJCQkvKiB3YW50IHJlY29uc3RydWN0IHdyaXRlLCBidXQgbmVlZCB0byBnZXQgc29tZSBkYXRhICovCisJCQlmb3IgKGk9ZGlza3M7IGktLTspIHsKKwkJCQlkZXYgPSAmc2gtPmRldltpXTsKKwkJCQlpZiAoIXRlc3RfYml0KFI1X09WRVJXUklURSwgJmRldi0+ZmxhZ3MpCisJCQkJICAgICYmICEoZmFpbGVkID09IDAgJiYgKGkgPT0gcGRfaWR4IHx8IGkgPT0gcWRfaWR4KSkKKwkJCQkgICAgJiYgIXRlc3RfYml0KFI1X0xPQ0tFRCwgJmRldi0+ZmxhZ3MpICYmICF0ZXN0X2JpdChSNV9VUFRPREFURSwgJmRldi0+ZmxhZ3MpICYmCisJCQkJICAgIHRlc3RfYml0KFI1X0luc3luYywgJmRldi0+ZmxhZ3MpKSB7CisJCQkJCWlmICh0ZXN0X2JpdChTVFJJUEVfUFJFUkVBRF9BQ1RJVkUsICZzaC0+c3RhdGUpKQorCQkJCQl7CisJCQkJCQlQUklOVEsoIlJlYWRfb2xkIHN0cmlwZSAlbGx1IGJsb2NrICVkIGZvciBSZWNvbnN0cnVjdFxuIiwKKwkJCQkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXNoLT5zZWN0b3IsIGkpOworCQkJCQkJc2V0X2JpdChSNV9MT0NLRUQsICZkZXYtPmZsYWdzKTsKKwkJCQkJCXNldF9iaXQoUjVfV2FudHJlYWQsICZkZXYtPmZsYWdzKTsKKwkJCQkJCWxvY2tlZCsrOworCQkJCQl9IGVsc2UgeworCQkJCQkJUFJJTlRLKCJSZXF1ZXN0IGRlbGF5ZWQgc3RyaXBlICVsbHUgYmxvY2sgJWQgZm9yIFJlY29uc3RydWN0XG4iLAorCQkJCQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpc2gtPnNlY3RvciwgaSk7CisJCQkJCQlzZXRfYml0KFNUUklQRV9ERUxBWUVELCAmc2gtPnN0YXRlKTsKKwkJCQkJCXNldF9iaXQoU1RSSVBFX0hBTkRMRSwgJnNoLT5zdGF0ZSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCS8qIG5vdyBpZiBub3RoaW5nIGlzIGxvY2tlZCwgYW5kIGlmIHdlIGhhdmUgZW5vdWdoIGRhdGEsIHdlIGNhbiBzdGFydCBhIHdyaXRlIHJlcXVlc3QgKi8KKwkJaWYgKGxvY2tlZCA9PSAwICYmIHJjdyA9PSAwICYmCisJCSAgICAhdGVzdF9iaXQoU1RSSVBFX0JJVF9ERUxBWSwgJnNoLT5zdGF0ZSkpIHsKKwkJCWlmICggbXVzdF9jb21wdXRlID4gMCApIHsKKwkJCQkvKiBXZSBoYXZlIGZhaWxlZCBibG9ja3MgYW5kIG5lZWQgdG8gY29tcHV0ZSB0aGVtICovCisJCQkJc3dpdGNoICggZmFpbGVkICkgeworCQkJCWNhc2UgMDoJQlVHKCk7CisJCQkJY2FzZSAxOiBjb21wdXRlX2Jsb2NrXzEoc2gsIGZhaWxlZF9udW1bMF0sIDApOyBicmVhazsKKwkJCQljYXNlIDI6IGNvbXB1dGVfYmxvY2tfMihzaCwgZmFpbGVkX251bVswXSwgZmFpbGVkX251bVsxXSk7IGJyZWFrOworCQkJCWRlZmF1bHQ6IEJVRygpOwkvKiBUaGlzIHJlcXVlc3Qgc2hvdWxkIGhhdmUgYmVlbiBmYWlsZWQ/ICovCisJCQkJfQorCQkJfQorCisJCQlQUklOVEsoIkNvbXB1dGluZyBwYXJpdHkgZm9yIHN0cmlwZSAlbGx1XG4iLCAodW5zaWduZWQgbG9uZyBsb25nKXNoLT5zZWN0b3IpOworCQkJY29tcHV0ZV9wYXJpdHk2KHNoLCBSRUNPTlNUUlVDVF9XUklURSk7CisJCQkvKiBub3cgZXZlcnkgbG9ja2VkIGJ1ZmZlciBpcyByZWFkeSB0byBiZSB3cml0dGVuICovCisJCQlmb3IgKGk9ZGlza3M7IGktLTspCisJCQkJaWYgKHRlc3RfYml0KFI1X0xPQ0tFRCwgJnNoLT5kZXZbaV0uZmxhZ3MpKSB7CisJCQkJCVBSSU5USygiV3JpdGluZyBzdHJpcGUgJWxsdSBibG9jayAlZFxuIiwKKwkJCQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpc2gtPnNlY3RvciwgaSk7CisJCQkJCWxvY2tlZCsrOworCQkJCQlzZXRfYml0KFI1X1dhbnR3cml0ZSwgJnNoLT5kZXZbaV0uZmxhZ3MpOworCQkJCX0KKwkJCS8qIGFmdGVyIGEgUkVDT05TVFJVQ1RfV1JJVEUsIHRoZSBzdHJpcGUgTVVTVCBiZSBpbi1zeW5jICovCisJCQlzZXRfYml0KFNUUklQRV9JTlNZTkMsICZzaC0+c3RhdGUpOworCisJCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFNUUklQRV9QUkVSRUFEX0FDVElWRSwgJnNoLT5zdGF0ZSkpIHsKKwkJCQlhdG9taWNfZGVjKCZjb25mLT5wcmVyZWFkX2FjdGl2ZV9zdHJpcGVzKTsKKwkJCQlpZiAoYXRvbWljX3JlYWQoJmNvbmYtPnByZXJlYWRfYWN0aXZlX3N0cmlwZXMpIDwgSU9fVEhSRVNIT0xEKQorCQkJCQltZF93YWtldXBfdGhyZWFkKGNvbmYtPm1kZGV2LT50aHJlYWQpOworCQkJfQorCQl9CisJfQorCisJLyogbWF5YmUgd2UgbmVlZCB0byBjaGVjayBhbmQgcG9zc2libHkgZml4IHRoZSBwYXJpdHkgZm9yIHRoaXMgc3RyaXBlCisJICogQW55IHJlYWRzIHdpbGwgYWxyZWFkeSBoYXZlIGJlZW4gc2NoZWR1bGVkLCBzbyB3ZSBqdXN0IHNlZSBpZiBlbm91Z2ggZGF0YQorCSAqIGlzIGF2YWlsYWJsZQorCSAqLworCWlmIChzeW5jaW5nICYmIGxvY2tlZCA9PSAwICYmICF0ZXN0X2JpdChTVFJJUEVfSU5TWU5DLCAmc2gtPnN0YXRlKSkgeworCQlpbnQgdXBkYXRlX3AgPSAwLCB1cGRhdGVfcSA9IDA7CisJCXN0cnVjdCByNWRldiAqZGV2OworCisJCXNldF9iaXQoU1RSSVBFX0hBTkRMRSwgJnNoLT5zdGF0ZSk7CisKKwkJQlVHX09OKGZhaWxlZD4yKTsKKwkJQlVHX09OKHVwdG9kYXRlIDwgZGlza3MpOworCQkvKiBXYW50IHRvIGNoZWNrIGFuZCBwb3NzaWJseSByZXBhaXIgUCBhbmQgUS4KKwkJICogSG93ZXZlciB0aGVyZSBjb3VsZCBiZSBvbmUgJ2ZhaWxlZCcgZGV2aWNlLCBpbiB3aGljaAorCQkgKiBjYXNlIHdlIGNhbiBvbmx5IGNoZWNrIG9uZSBvZiB0aGVtLCBwb3NzaWJseSB1c2luZyB0aGUKKwkJICogb3RoZXIgdG8gZ2VuZXJhdGUgbWlzc2luZyBkYXRhCisJCSAqLworCisJCS8qIElmICF0bXBfcGFnZSwgd2UgY2Fubm90IGRvIHRoZSBjYWxjdWxhdGlvbnMsCisJCSAqIGJ1dCBhcyB3ZSBoYXZlIHNldCBTVFJJUEVfSEFORExFLCB3ZSB3aWxsIHNvb24gYmUgY2FsbGVkCisJCSAqIGJ5IHN0cmlwZV9oYW5kbGUgd2l0aCBhIHRtcF9wYWdlIC0ganVzdCB3YWl0IHVudGlsIHRoZW4uCisJCSAqLworCQlpZiAodG1wX3BhZ2UpIHsKKwkJCWlmIChmYWlsZWQgPT0gcV9mYWlsZWQpIHsKKwkJCQkvKiBUaGUgb25seSBwb3NzaWJsZSBmYWlsZWQgZGV2aWNlIGhvbGRzICdRJywgc28gaXQgbWFrZXMKKwkJCQkgKiBzZW5zZSB0byBjaGVjayBQIChJZiBhbnl0aGluZyBlbHNlIHdlcmUgZmFpbGVkLCB3ZSB3b3VsZAorCQkJCSAqIGhhdmUgdXNlZCBQIHRvIHJlY3JlYXRlIGl0KS4KKwkJCQkgKi8KKwkJCQljb21wdXRlX2Jsb2NrXzEoc2gsIHBkX2lkeCwgMSk7CisJCQkJaWYgKCFwYWdlX2lzX3plcm8oc2gtPmRldltwZF9pZHhdLnBhZ2UpKSB7CisJCQkJCWNvbXB1dGVfYmxvY2tfMShzaCxwZF9pZHgsMCk7CisJCQkJCXVwZGF0ZV9wID0gMTsKKwkJCQl9CisJCQl9CisJCQlpZiAoIXFfZmFpbGVkICYmIGZhaWxlZCA8IDIpIHsKKwkJCQkvKiBxIGlzIG5vdCBmYWlsZWQsIGFuZCB3ZSBkaWRuJ3QgdXNlIGl0IHRvIGdlbmVyYXRlCisJCQkJICogYW55dGhpbmcsIHNvIGl0IG1ha2VzIHNlbnNlIHRvIGNoZWNrIGl0CisJCQkJICovCisJCQkJbWVtY3B5KHBhZ2VfYWRkcmVzcyh0bXBfcGFnZSksCisJCQkJICAgICAgIHBhZ2VfYWRkcmVzcyhzaC0+ZGV2W3FkX2lkeF0ucGFnZSksCisJCQkJICAgICAgIFNUUklQRV9TSVpFKTsKKwkJCQljb21wdXRlX3Bhcml0eTYoc2gsIFVQREFURV9QQVJJVFkpOworCQkJCWlmIChtZW1jbXAocGFnZV9hZGRyZXNzKHRtcF9wYWdlKSwKKwkJCQkJICAgcGFnZV9hZGRyZXNzKHNoLT5kZXZbcWRfaWR4XS5wYWdlKSwKKwkJCQkJICAgU1RSSVBFX1NJWkUpIT0gMCkgeworCQkJCQljbGVhcl9iaXQoU1RSSVBFX0lOU1lOQywgJnNoLT5zdGF0ZSk7CisJCQkJCXVwZGF0ZV9xID0gMTsKKwkJCQl9CisJCQl9CisJCQlpZiAodXBkYXRlX3AgfHwgdXBkYXRlX3EpIHsKKwkJCQljb25mLT5tZGRldi0+cmVzeW5jX21pc21hdGNoZXMgKz0gU1RSSVBFX1NFQ1RPUlM7CisJCQkJaWYgKHRlc3RfYml0KE1EX1JFQ09WRVJZX0NIRUNLLCAmY29uZi0+bWRkZXYtPnJlY292ZXJ5KSkKKwkJCQkJLyogZG9uJ3QgdHJ5IHRvIHJlcGFpciEhICovCisJCQkJCXVwZGF0ZV9wID0gdXBkYXRlX3EgPSAwOworCQkJfQorCisJCQkvKiBub3cgd3JpdGUgb3V0IGFueSBibG9jayBvbiBhIGZhaWxlZCBkcml2ZSwKKwkJCSAqIG9yIFAgb3IgUSBpZiB0aGV5IG5lZWQgaXQKKwkJCSAqLworCisJCQlpZiAoZmFpbGVkID09IDIpIHsKKwkJCQlkZXYgPSAmc2gtPmRldltmYWlsZWRfbnVtWzFdXTsKKwkJCQlsb2NrZWQrKzsKKwkJCQlzZXRfYml0KFI1X0xPQ0tFRCwgJmRldi0+ZmxhZ3MpOworCQkJCXNldF9iaXQoUjVfV2FudHdyaXRlLCAmZGV2LT5mbGFncyk7CisJCQl9CisJCQlpZiAoZmFpbGVkID49IDEpIHsKKwkJCQlkZXYgPSAmc2gtPmRldltmYWlsZWRfbnVtWzBdXTsKKwkJCQlsb2NrZWQrKzsKKwkJCQlzZXRfYml0KFI1X0xPQ0tFRCwgJmRldi0+ZmxhZ3MpOworCQkJCXNldF9iaXQoUjVfV2FudHdyaXRlLCAmZGV2LT5mbGFncyk7CisJCQl9CisKKwkJCWlmICh1cGRhdGVfcCkgeworCQkJCWRldiA9ICZzaC0+ZGV2W3BkX2lkeF07CisJCQkJbG9ja2VkICsrOworCQkJCXNldF9iaXQoUjVfTE9DS0VELCAmZGV2LT5mbGFncyk7CisJCQkJc2V0X2JpdChSNV9XYW50d3JpdGUsICZkZXYtPmZsYWdzKTsKKwkJCX0KKwkJCWlmICh1cGRhdGVfcSkgeworCQkJCWRldiA9ICZzaC0+ZGV2W3FkX2lkeF07CisJCQkJbG9ja2VkKys7CisJCQkJc2V0X2JpdChSNV9MT0NLRUQsICZkZXYtPmZsYWdzKTsKKwkJCQlzZXRfYml0KFI1X1dhbnR3cml0ZSwgJmRldi0+ZmxhZ3MpOworCQkJfQorCQkJY2xlYXJfYml0KFNUUklQRV9ERUdSQURFRCwgJnNoLT5zdGF0ZSk7CisKKwkJCXNldF9iaXQoU1RSSVBFX0lOU1lOQywgJnNoLT5zdGF0ZSk7CisJCX0KKwl9CisKKwlpZiAoc3luY2luZyAmJiBsb2NrZWQgPT0gMCAmJiB0ZXN0X2JpdChTVFJJUEVfSU5TWU5DLCAmc2gtPnN0YXRlKSkgeworCQltZF9kb25lX3N5bmMoY29uZi0+bWRkZXYsIFNUUklQRV9TRUNUT1JTLDEpOworCQljbGVhcl9iaXQoU1RSSVBFX1NZTkNJTkcsICZzaC0+c3RhdGUpOworCX0KKworCS8qIElmIHRoZSBmYWlsZWQgZHJpdmVzIGFyZSBqdXN0IGEgUmVhZEVycm9yLCB0aGVuIHdlIG1pZ2h0IG5lZWQKKwkgKiB0byBwcm9ncmVzcyB0aGUgcmVwYWlyL2NoZWNrIHByb2Nlc3MKKwkgKi8KKwlpZiAoZmFpbGVkIDw9IDIgJiYgISBjb25mLT5tZGRldi0+cm8pCisJCWZvciAoaT0wOyBpPGZhaWxlZDtpKyspIHsKKwkJCWRldiA9ICZzaC0+ZGV2W2ZhaWxlZF9udW1baV1dOworCQkJaWYgKHRlc3RfYml0KFI1X1JlYWRFcnJvciwgJmRldi0+ZmxhZ3MpCisJCQkgICAgJiYgIXRlc3RfYml0KFI1X0xPQ0tFRCwgJmRldi0+ZmxhZ3MpCisJCQkgICAgJiYgdGVzdF9iaXQoUjVfVVBUT0RBVEUsICZkZXYtPmZsYWdzKQorCQkJCSkgeworCQkJCWlmICghdGVzdF9iaXQoUjVfUmVXcml0ZSwgJmRldi0+ZmxhZ3MpKSB7CisJCQkJCXNldF9iaXQoUjVfV2FudHdyaXRlLCAmZGV2LT5mbGFncyk7CisJCQkJCXNldF9iaXQoUjVfUmVXcml0ZSwgJmRldi0+ZmxhZ3MpOworCQkJCQlzZXRfYml0KFI1X0xPQ0tFRCwgJmRldi0+ZmxhZ3MpOworCQkJCX0gZWxzZSB7CisJCQkJCS8qIGxldCdzIHJlYWQgaXQgYmFjayAqLworCQkJCQlzZXRfYml0KFI1X1dhbnRyZWFkLCAmZGV2LT5mbGFncyk7CisJCQkJCXNldF9iaXQoUjVfTE9DS0VELCAmZGV2LT5mbGFncyk7CisJCQkJfQorCQkJfQorCQl9CisJc3Bpbl91bmxvY2soJnNoLT5sb2NrKTsKKworCXdoaWxlICgoYmk9cmV0dXJuX2JpKSkgeworCQlpbnQgYnl0ZXMgPSBiaS0+Ymlfc2l6ZTsKKworCQlyZXR1cm5fYmkgPSBiaS0+YmlfbmV4dDsKKwkJYmktPmJpX25leHQgPSBOVUxMOworCQliaS0+Ymlfc2l6ZSA9IDA7CisJCWJpLT5iaV9lbmRfaW8oYmksIGJ5dGVzLCAwKTsKKwl9CisJZm9yIChpPWRpc2tzOyBpLS0gOykgeworCQlpbnQgcnc7CisJCXN0cnVjdCBiaW8gKmJpOworCQltZGtfcmRldl90ICpyZGV2OworCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFI1X1dhbnR3cml0ZSwgJnNoLT5kZXZbaV0uZmxhZ3MpKQorCQkJcncgPSAxOworCQllbHNlIGlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoUjVfV2FudHJlYWQsICZzaC0+ZGV2W2ldLmZsYWdzKSkKKwkJCXJ3ID0gMDsKKwkJZWxzZQorCQkJY29udGludWU7CisKKwkJYmkgPSAmc2gtPmRldltpXS5yZXE7CisKKwkJYmktPmJpX3J3ID0gcnc7CisJCWlmIChydykKKwkJCWJpLT5iaV9lbmRfaW8gPSByYWlkNV9lbmRfd3JpdGVfcmVxdWVzdDsKKwkJZWxzZQorCQkJYmktPmJpX2VuZF9pbyA9IHJhaWQ1X2VuZF9yZWFkX3JlcXVlc3Q7CisKKwkJcmN1X3JlYWRfbG9jaygpOworCQlyZGV2ID0gcmN1X2RlcmVmZXJlbmNlKGNvbmYtPmRpc2tzW2ldLnJkZXYpOworCQlpZiAocmRldiAmJiB0ZXN0X2JpdChGYXVsdHksICZyZGV2LT5mbGFncykpCisJCQlyZGV2ID0gTlVMTDsKKwkJaWYgKHJkZXYpCisJCQlhdG9taWNfaW5jKCZyZGV2LT5ucl9wZW5kaW5nKTsKKwkJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwkJaWYgKHJkZXYpIHsKKwkJCWlmIChzeW5jaW5nKQorCQkJCW1kX3N5bmNfYWNjdChyZGV2LT5iZGV2LCBTVFJJUEVfU0VDVE9SUyk7CisKKwkJCWJpLT5iaV9iZGV2ID0gcmRldi0+YmRldjsKKwkJCVBSSU5USygiZm9yICVsbHUgc2NoZWR1bGUgb3AgJWxkIG9uIGRpc2MgJWRcbiIsCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylzaC0+c2VjdG9yLCBiaS0+YmlfcncsIGkpOworCQkJYXRvbWljX2luYygmc2gtPmNvdW50KTsKKwkJCWJpLT5iaV9zZWN0b3IgPSBzaC0+c2VjdG9yICsgcmRldi0+ZGF0YV9vZmZzZXQ7CisJCQliaS0+YmlfZmxhZ3MgPSAxIDw8IEJJT19VUFRPREFURTsKKwkJCWJpLT5iaV92Y250ID0gMTsKKwkJCWJpLT5iaV9tYXhfdmVjcyA9IDE7CisJCQliaS0+YmlfaWR4ID0gMDsKKwkJCWJpLT5iaV9pb192ZWMgPSAmc2gtPmRldltpXS52ZWM7CisJCQliaS0+YmlfaW9fdmVjWzBdLmJ2X2xlbiA9IFNUUklQRV9TSVpFOworCQkJYmktPmJpX2lvX3ZlY1swXS5idl9vZmZzZXQgPSAwOworCQkJYmktPmJpX3NpemUgPSBTVFJJUEVfU0laRTsKKwkJCWJpLT5iaV9uZXh0ID0gTlVMTDsKKwkJCWlmIChydyA9PSBXUklURSAmJgorCQkJICAgIHRlc3RfYml0KFI1X1JlV3JpdGUsICZzaC0+ZGV2W2ldLmZsYWdzKSkKKwkJCQlhdG9taWNfYWRkKFNUUklQRV9TRUNUT1JTLCAmcmRldi0+Y29ycmVjdGVkX2Vycm9ycyk7CisJCQlnZW5lcmljX21ha2VfcmVxdWVzdChiaSk7CisJCX0gZWxzZSB7CisJCQlpZiAocncgPT0gMSkKKwkJCQlzZXRfYml0KFNUUklQRV9ERUdSQURFRCwgJnNoLT5zdGF0ZSk7CisJCQlQUklOVEsoInNraXAgb3AgJWxkIG9uIGRpc2MgJWQgZm9yIHNlY3RvciAlbGx1XG4iLAorCQkJCWJpLT5iaV9ydywgaSwgKHVuc2lnbmVkIGxvbmcgbG9uZylzaC0+c2VjdG9yKTsKKwkJCWNsZWFyX2JpdChSNV9MT0NLRUQsICZzaC0+ZGV2W2ldLmZsYWdzKTsKKwkJCXNldF9iaXQoU1RSSVBFX0hBTkRMRSwgJnNoLT5zdGF0ZSk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV9zdHJpcGUoc3RydWN0IHN0cmlwZV9oZWFkICpzaCwgc3RydWN0IHBhZ2UgKnRtcF9wYWdlKQoreworCWlmIChzaC0+cmFpZF9jb25mLT5sZXZlbCA9PSA2KQorCQloYW5kbGVfc3RyaXBlNihzaCwgdG1wX3BhZ2UpOworCWVsc2UKKwkJaGFuZGxlX3N0cmlwZTUoc2gpOworfQorCisKKwogc3RhdGljIHZvaWQgcmFpZDVfYWN0aXZhdGVfZGVsYXllZChyYWlkNV9jb25mX3QgKmNvbmYpCiB7CiAJaWYgKGF0b21pY19yZWFkKCZjb25mLT5wcmVyZWFkX2FjdGl2ZV9zdHJpcGVzKSA8IElPX1RIUkVTSE9MRCkgewpAQCAtMTc1Myw3ICsyNTkwLDcgQEAKIAogCWZvciAoO2xvZ2ljYWxfc2VjdG9yIDwgbGFzdF9zZWN0b3I7IGxvZ2ljYWxfc2VjdG9yICs9IFNUUklQRV9TRUNUT1JTKSB7CiAJCURFRklORV9XQUlUKHcpOwotCQlpbnQgZGlza3M7CisJCWludCBkaXNrcywgZGF0YV9kaXNrczsKIAogCXJldHJ5OgogCQlwcmVwYXJlX3RvX3dhaXQoJmNvbmYtPndhaXRfZm9yX292ZXJsYXAsICZ3LCBUQVNLX1VOSU5URVJSVVBUSUJMRSk7CkBAIC0xNzgxLDcgKzI2MTgsOSBAQAogCQkJfQogCQkJc3Bpbl91bmxvY2tfaXJxKCZjb25mLT5kZXZpY2VfbG9jayk7CiAJCX0KLSAJCW5ld19zZWN0b3IgPSByYWlkNV9jb21wdXRlX3NlY3Rvcihsb2dpY2FsX3NlY3RvciwgZGlza3MsIGRpc2tzIC0gMSwKKwkJZGF0YV9kaXNrcyA9IGRpc2tzIC0gY29uZi0+bWF4X2RlZ3JhZGVkOworCisgCQluZXdfc2VjdG9yID0gcmFpZDVfY29tcHV0ZV9zZWN0b3IobG9naWNhbF9zZWN0b3IsIGRpc2tzLCBkYXRhX2Rpc2tzLAogCQkJCQkJICAmZGRfaWR4LCAmcGRfaWR4LCBjb25mKTsKIAkJUFJJTlRLKCJyYWlkNTogbWFrZV9yZXF1ZXN0LCBzZWN0b3IgJWxsdSBsb2dpY2FsICVsbHVcbiIsCiAJCQkodW5zaWduZWQgbG9uZyBsb25nKW5ld19zZWN0b3IsIApAQCAtMTgzMyw3ICsyNjcyLDcgQEAKIAkJCX0KIAkJCWZpbmlzaF93YWl0KCZjb25mLT53YWl0X2Zvcl9vdmVybGFwLCAmdyk7CiAJCQlyYWlkNV9wbHVnX2RldmljZShjb25mKTsKLQkJCWhhbmRsZV9zdHJpcGUoc2gpOworCQkJaGFuZGxlX3N0cmlwZShzaCwgTlVMTCk7CiAJCQlyZWxlYXNlX3N0cmlwZShzaCk7CiAJCX0gZWxzZSB7CiAJCQkvKiBjYW5ub3QgZ2V0IHN0cmlwZSBmb3IgcmVhZC1haGVhZCwganVzdCBnaXZlLXVwICovCkBAIC0xODQ5LDcgKzI2ODgsNyBAQAogCWlmIChyZW1haW5pbmcgPT0gMCkgewogCQlpbnQgYnl0ZXMgPSBiaS0+Ymlfc2l6ZTsKIAotCQlpZiAoIGJpb19kYXRhX2RpcihiaSkgPT0gV1JJVEUgKQorCQlpZiAoIHJ3ID09IFdSSVRFICkKIAkJCW1kX3dyaXRlX2VuZChtZGRldik7CiAJCWJpLT5iaV9zaXplID0gMDsKIAkJYmktPmJpX2VuZF9pbyhiaSwgYnl0ZXMsIDApOwpAQCAtMTg1NywxNyArMjY5NiwxNDIgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyogRklYTUUgZ29fZmFzdGVyIGlzbid0IHVzZWQgKi8KLXN0YXRpYyBzZWN0b3JfdCBzeW5jX3JlcXVlc3QobWRkZXZfdCAqbWRkZXYsIHNlY3Rvcl90IHNlY3Rvcl9uciwgaW50ICpza2lwcGVkLCBpbnQgZ29fZmFzdGVyKQorc3RhdGljIHNlY3Rvcl90IHJlc2hhcGVfcmVxdWVzdChtZGRldl90ICptZGRldiwgc2VjdG9yX3Qgc2VjdG9yX25yLCBpbnQgKnNraXBwZWQpCiB7CisJLyogcmVzaGFwaW5nIGlzIHF1aXRlIGRpZmZlcmVudCB0byByZWNvdmVyeS9yZXN5bmMgc28gaXQgaXMKKwkgKiBoYW5kbGVkIHF1aXRlIHNlcGFyYXRlbHkgLi4uIGhlcmUuCisJICoKKwkgKiBPbiBlYWNoIGNhbGwgdG8gc3luY19yZXF1ZXN0LCB3ZSBnYXRoZXIgb25lIGNodW5rIHdvcnRoIG9mCisJICogZGVzdGluYXRpb24gc3RyaXBlcyBhbmQgZmxhZyB0aGVtIGFzIGV4cGFuZGluZy4KKwkgKiBUaGVuIHdlIGZpbmQgYWxsIHRoZSBzb3VyY2Ugc3RyaXBlcyBhbmQgcmVxdWVzdCByZWFkcy4KKwkgKiBBcyB0aGUgcmVhZHMgY29tcGxldGUsIGhhbmRsZV9zdHJpcGUgd2lsbCBjb3B5IHRoZSBkYXRhCisJICogaW50byB0aGUgZGVzdGluYXRpb24gc3RyaXBlIGFuZCByZWxlYXNlIHRoYXQgc3RyaXBlLgorCSAqLwogCXJhaWQ1X2NvbmZfdCAqY29uZiA9IChyYWlkNV9jb25mX3QgKikgbWRkZXYtPnByaXZhdGU7CiAJc3RydWN0IHN0cmlwZV9oZWFkICpzaDsKIAlpbnQgcGRfaWR4OwogCXNlY3Rvcl90IGZpcnN0X3NlY3RvciwgbGFzdF9zZWN0b3I7CisJaW50IHJhaWRfZGlza3M7CisJaW50IGRhdGFfZGlza3M7CisJaW50IGk7CisJaW50IGRkX2lkeDsKKwlzZWN0b3JfdCB3cml0ZXBvcywgc2FmZXBvcywgZ2FwOworCisJaWYgKHNlY3Rvcl9uciA9PSAwICYmCisJICAgIGNvbmYtPmV4cGFuZF9wcm9ncmVzcyAhPSAwKSB7CisJCS8qIHJlc3RhcnRpbmcgaW4gdGhlIG1pZGRsZSwgc2tpcCB0aGUgaW5pdGlhbCBzZWN0b3JzICovCisJCXNlY3Rvcl9uciA9IGNvbmYtPmV4cGFuZF9wcm9ncmVzczsKKwkJc2VjdG9yX2RpdihzZWN0b3JfbnIsIGNvbmYtPnJhaWRfZGlza3MtMSk7CisJCSpza2lwcGVkID0gMTsKKwkJcmV0dXJuIHNlY3Rvcl9ucjsKKwl9CisKKwkvKiB3ZSB1cGRhdGUgdGhlIG1ldGFkYXRhIHdoZW4gdGhlcmUgaXMgbW9yZSB0aGFuIDNNZWcKKwkgKiBpbiB0aGUgYmxvY2sgcmFuZ2UgKHRoYXQgaXMgcmF0aGVyIGFyYml0cmFyeSwgc2hvdWxkCisJICogcHJvYmFibHkgYmUgdGltZSBiYXNlZCkgb3Igd2hlbiB0aGUgZGF0YSBhYm91dCB0byBiZQorCSAqIGNvcGllZCB3b3VsZCBvdmVyLXdyaXRlIHRoZSBzb3VyY2Ugb2YgdGhlIGRhdGEgYXQKKwkgKiB0aGUgZnJvbnQgb2YgdGhlIHJhbmdlLgorCSAqIGkuZS4gb25lIG5ld19zdHJpcGUgZm9yd2FyZCBmcm9tIGV4cGFuZF9wcm9ncmVzcyBuZXdfbWFwcworCSAqIHRvIGFmdGVyIHdoZXJlIGV4cGFuZF9sbyBvbGRfbWFwcyB0bworCSAqLworCXdyaXRlcG9zID0gY29uZi0+ZXhwYW5kX3Byb2dyZXNzICsKKwkJY29uZi0+Y2h1bmtfc2l6ZS81MTIqKGNvbmYtPnJhaWRfZGlza3MtMSk7CisJc2VjdG9yX2Rpdih3cml0ZXBvcywgY29uZi0+cmFpZF9kaXNrcy0xKTsKKwlzYWZlcG9zID0gY29uZi0+ZXhwYW5kX2xvOworCXNlY3Rvcl9kaXYoc2FmZXBvcywgY29uZi0+cHJldmlvdXNfcmFpZF9kaXNrcy0xKTsKKwlnYXAgPSBjb25mLT5leHBhbmRfcHJvZ3Jlc3MgLSBjb25mLT5leHBhbmRfbG87CisKKwlpZiAod3JpdGVwb3MgPj0gc2FmZXBvcyB8fAorCSAgICBnYXAgPiAoY29uZi0+cmFpZF9kaXNrcy0xKSozMDAwKjIgLyozTWVnKi8pIHsKKwkJLyogQ2Fubm90IHByb2NlZWQgdW50aWwgd2UndmUgdXBkYXRlZCB0aGUgc3VwZXJibG9jay4uLiAqLworCQl3YWl0X2V2ZW50KGNvbmYtPndhaXRfZm9yX292ZXJsYXAsCisJCQkgICBhdG9taWNfcmVhZCgmY29uZi0+cmVzaGFwZV9zdHJpcGVzKT09MCk7CisJCW1kZGV2LT5yZXNoYXBlX3Bvc2l0aW9uID0gY29uZi0+ZXhwYW5kX3Byb2dyZXNzOworCQltZGRldi0+c2JfZGlydHkgPSAxOworCQltZF93YWtldXBfdGhyZWFkKG1kZGV2LT50aHJlYWQpOworCQl3YWl0X2V2ZW50KG1kZGV2LT5zYl93YWl0LCBtZGRldi0+c2JfZGlydHkgPT0gMCB8fAorCQkJICAga3RocmVhZF9zaG91bGRfc3RvcCgpKTsKKwkJc3Bpbl9sb2NrX2lycSgmY29uZi0+ZGV2aWNlX2xvY2spOworCQljb25mLT5leHBhbmRfbG8gPSBtZGRldi0+cmVzaGFwZV9wb3NpdGlvbjsKKwkJc3Bpbl91bmxvY2tfaXJxKCZjb25mLT5kZXZpY2VfbG9jayk7CisJCXdha2VfdXAoJmNvbmYtPndhaXRfZm9yX292ZXJsYXApOworCX0KKworCWZvciAoaT0wOyBpIDwgY29uZi0+Y2h1bmtfc2l6ZS81MTI7IGkrPSBTVFJJUEVfU0VDVE9SUykgeworCQlpbnQgajsKKwkJaW50IHNraXBwZWQgPSAwOworCQlwZF9pZHggPSBzdHJpcGVfdG9fcGRpZHgoc2VjdG9yX25yK2ksIGNvbmYsIGNvbmYtPnJhaWRfZGlza3MpOworCQlzaCA9IGdldF9hY3RpdmVfc3RyaXBlKGNvbmYsIHNlY3Rvcl9ucitpLAorCQkJCSAgICAgICBjb25mLT5yYWlkX2Rpc2tzLCBwZF9pZHgsIDApOworCQlzZXRfYml0KFNUUklQRV9FWFBBTkRJTkcsICZzaC0+c3RhdGUpOworCQlhdG9taWNfaW5jKCZjb25mLT5yZXNoYXBlX3N0cmlwZXMpOworCQkvKiBJZiBhbnkgb2YgdGhpcyBzdHJpcGUgaXMgYmV5b25kIHRoZSBlbmQgb2YgdGhlIG9sZAorCQkgKiBhcnJheSwgdGhlbiB3ZSBuZWVkIHRvIHplcm8gdGhvc2UgYmxvY2tzCisJCSAqLworCQlmb3IgKGo9c2gtPmRpc2tzOyBqLS07KSB7CisJCQlzZWN0b3JfdCBzOworCQkJaWYgKGogPT0gc2gtPnBkX2lkeCkKKwkJCQljb250aW51ZTsKKwkJCXMgPSBjb21wdXRlX2Jsb2NrbnIoc2gsIGopOworCQkJaWYgKHMgPCAobWRkZXYtPmFycmF5X3NpemU8PDEpKSB7CisJCQkJc2tpcHBlZCA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQltZW1zZXQocGFnZV9hZGRyZXNzKHNoLT5kZXZbal0ucGFnZSksIDAsIFNUUklQRV9TSVpFKTsKKwkJCXNldF9iaXQoUjVfRXhwYW5kZWQsICZzaC0+ZGV2W2pdLmZsYWdzKTsKKwkJCXNldF9iaXQoUjVfVVBUT0RBVEUsICZzaC0+ZGV2W2pdLmZsYWdzKTsKKwkJfQorCQlpZiAoIXNraXBwZWQpIHsKKwkJCXNldF9iaXQoU1RSSVBFX0VYUEFORF9SRUFEWSwgJnNoLT5zdGF0ZSk7CisJCQlzZXRfYml0KFNUUklQRV9IQU5ETEUsICZzaC0+c3RhdGUpOworCQl9CisJCXJlbGVhc2Vfc3RyaXBlKHNoKTsKKwl9CisJc3Bpbl9sb2NrX2lycSgmY29uZi0+ZGV2aWNlX2xvY2spOworCWNvbmYtPmV4cGFuZF9wcm9ncmVzcyA9IChzZWN0b3JfbnIgKyBpKSooY29uZi0+cmFpZF9kaXNrcy0xKTsKKwlzcGluX3VubG9ja19pcnEoJmNvbmYtPmRldmljZV9sb2NrKTsKKwkvKiBPaywgdGhvc2Ugc3RyaXBlIGFyZSByZWFkeS4gV2UgY2FuIHN0YXJ0IHNjaGVkdWxpbmcKKwkgKiByZWFkcyBvbiB0aGUgc291cmNlIHN0cmlwZXMuCisJICogVGhlIHNvdXJjZSBzdHJpcGVzIGFyZSBkZXRlcm1pbmVkIGJ5IG1hcHBpbmcgdGhlIGZpcnN0IGFuZCBsYXN0CisJICogYmxvY2sgb24gdGhlIGRlc3RpbmF0aW9uIHN0cmlwZXMuCisJICovCisJcmFpZF9kaXNrcyA9IGNvbmYtPnByZXZpb3VzX3JhaWRfZGlza3M7CisJZGF0YV9kaXNrcyA9IHJhaWRfZGlza3MgLSAxOworCWZpcnN0X3NlY3RvciA9CisJCXJhaWQ1X2NvbXB1dGVfc2VjdG9yKHNlY3Rvcl9uciooY29uZi0+cmFpZF9kaXNrcy0xKSwKKwkJCQkgICAgIHJhaWRfZGlza3MsIGRhdGFfZGlza3MsCisJCQkJICAgICAmZGRfaWR4LCAmcGRfaWR4LCBjb25mKTsKKwlsYXN0X3NlY3RvciA9CisJCXJhaWQ1X2NvbXB1dGVfc2VjdG9yKChzZWN0b3JfbnIrY29uZi0+Y2h1bmtfc2l6ZS81MTIpCisJCQkJICAgICAqKGNvbmYtPnJhaWRfZGlza3MtMSkgLTEsCisJCQkJICAgICByYWlkX2Rpc2tzLCBkYXRhX2Rpc2tzLAorCQkJCSAgICAgJmRkX2lkeCwgJnBkX2lkeCwgY29uZik7CisJaWYgKGxhc3Rfc2VjdG9yID49IChtZGRldi0+c2l6ZTw8MSkpCisJCWxhc3Rfc2VjdG9yID0gKG1kZGV2LT5zaXplPDwxKS0xOworCXdoaWxlIChmaXJzdF9zZWN0b3IgPD0gbGFzdF9zZWN0b3IpIHsKKwkJcGRfaWR4ID0gc3RyaXBlX3RvX3BkaWR4KGZpcnN0X3NlY3RvciwgY29uZiwgY29uZi0+cHJldmlvdXNfcmFpZF9kaXNrcyk7CisJCXNoID0gZ2V0X2FjdGl2ZV9zdHJpcGUoY29uZiwgZmlyc3Rfc2VjdG9yLAorCQkJCSAgICAgICBjb25mLT5wcmV2aW91c19yYWlkX2Rpc2tzLCBwZF9pZHgsIDApOworCQlzZXRfYml0KFNUUklQRV9FWFBBTkRfU09VUkNFLCAmc2gtPnN0YXRlKTsKKwkJc2V0X2JpdChTVFJJUEVfSEFORExFLCAmc2gtPnN0YXRlKTsKKwkJcmVsZWFzZV9zdHJpcGUoc2gpOworCQlmaXJzdF9zZWN0b3IgKz0gU1RSSVBFX1NFQ1RPUlM7CisJfQorCXJldHVybiBjb25mLT5jaHVua19zaXplPj45OworfQorCisvKiBGSVhNRSBnb19mYXN0ZXIgaXNuJ3QgdXNlZCAqLworc3RhdGljIGlubGluZSBzZWN0b3JfdCBzeW5jX3JlcXVlc3QobWRkZXZfdCAqbWRkZXYsIHNlY3Rvcl90IHNlY3Rvcl9uciwgaW50ICpza2lwcGVkLCBpbnQgZ29fZmFzdGVyKQoreworCXJhaWQ1X2NvbmZfdCAqY29uZiA9IChyYWlkNV9jb25mX3QgKikgbWRkZXYtPnByaXZhdGU7CisJc3RydWN0IHN0cmlwZV9oZWFkICpzaDsKKwlpbnQgcGRfaWR4OwogCWludCByYWlkX2Rpc2tzID0gY29uZi0+cmFpZF9kaXNrczsKLQlpbnQgZGF0YV9kaXNrcyA9IHJhaWRfZGlza3MtMTsKKwlpbnQgZGF0YV9kaXNrcyA9IHJhaWRfZGlza3MgLSBjb25mLT5tYXhfZGVncmFkZWQ7CiAJc2VjdG9yX3QgbWF4X3NlY3RvciA9IG1kZGV2LT5zaXplIDw8IDE7CiAJaW50IHN5bmNfYmxvY2tzOworCWludCBzdGlsbF9kZWdyYWRlZCA9IDA7CisJaW50IGk7CiAKIAlpZiAoc2VjdG9yX25yID49IG1heF9zZWN0b3IpIHsKIAkJLyoganVzdCBiZWluZyB0b2xkIHRvIGZpbmlzaCB1cCAuLiBub3RoaW5nIG11Y2ggdG8gZG8gKi8KQEAgLTE4ODAsMTM0ICsyODQ0LDIyIEBACiAJCWlmIChtZGRldi0+Y3Vycl9yZXN5bmMgPCBtYXhfc2VjdG9yKSAvKiBhYm9ydGVkICovCiAJCQliaXRtYXBfZW5kX3N5bmMobWRkZXYtPmJpdG1hcCwgbWRkZXYtPmN1cnJfcmVzeW5jLAogCQkJCQkmc3luY19ibG9ja3MsIDEpOwotCQllbHNlIC8qIGNvbXBlbHRlZCBzeW5jICovCisJCWVsc2UgLyogY29tcGxldGVkIHN5bmMgKi8KIAkJCWNvbmYtPmZ1bGxzeW5jID0gMDsKIAkJYml0bWFwX2Nsb3NlX3N5bmMobWRkZXYtPmJpdG1hcCk7CiAKIAkJcmV0dXJuIDA7CiAJfQogCi0JaWYgKHRlc3RfYml0KE1EX1JFQ09WRVJZX1JFU0hBUEUsICZtZGRldi0+cmVjb3ZlcnkpKSB7Ci0JCS8qIHJlc2hhcGluZyBpcyBxdWl0ZSBkaWZmZXJlbnQgdG8gcmVjb3ZlcnkvcmVzeW5jIHNvIGl0IGlzCi0JCSAqIGhhbmRsZWQgcXVpdGUgc2VwYXJhdGVseSAuLi4gaGVyZS4KLQkJICoKLQkJICogT24gZWFjaCBjYWxsIHRvIHN5bmNfcmVxdWVzdCwgd2UgZ2F0aGVyIG9uZSBjaHVuayB3b3J0aCBvZgotCQkgKiBkZXN0aW5hdGlvbiBzdHJpcGVzIGFuZCBmbGFnIHRoZW0gYXMgZXhwYW5kaW5nLgotCQkgKiBUaGVuIHdlIGZpbmQgYWxsIHRoZSBzb3VyY2Ugc3RyaXBlcyBhbmQgcmVxdWVzdCByZWFkcy4KLQkJICogQXMgdGhlIHJlYWRzIGNvbXBsZXRlLCBoYW5kbGVfc3RyaXBlIHdpbGwgY29weSB0aGUgZGF0YQotCQkgKiBpbnRvIHRoZSBkZXN0aW5hdGlvbiBzdHJpcGUgYW5kIHJlbGVhc2UgdGhhdCBzdHJpcGUuCi0JCSAqLwotCQlpbnQgaTsKLQkJaW50IGRkX2lkeDsKLQkJc2VjdG9yX3Qgd3JpdGVwb3MsIHNhZmVwb3MsIGdhcDsKKwlpZiAodGVzdF9iaXQoTURfUkVDT1ZFUllfUkVTSEFQRSwgJm1kZGV2LT5yZWNvdmVyeSkpCisJCXJldHVybiByZXNoYXBlX3JlcXVlc3QobWRkZXYsIHNlY3Rvcl9uciwgc2tpcHBlZCk7CiAKLQkJaWYgKHNlY3Rvcl9uciA9PSAwICYmCi0JCSAgICBjb25mLT5leHBhbmRfcHJvZ3Jlc3MgIT0gMCkgewotCQkJLyogcmVzdGFydGluZyBpbiB0aGUgbWlkZGxlLCBza2lwIHRoZSBpbml0aWFsIHNlY3RvcnMgKi8KLQkJCXNlY3Rvcl9uciA9IGNvbmYtPmV4cGFuZF9wcm9ncmVzczsKLQkJCXNlY3Rvcl9kaXYoc2VjdG9yX25yLCBjb25mLT5yYWlkX2Rpc2tzLTEpOwotCQkJKnNraXBwZWQgPSAxOwotCQkJcmV0dXJuIHNlY3Rvcl9ucjsKLQkJfQotCi0JCS8qIHdlIHVwZGF0ZSB0aGUgbWV0YWRhdGEgd2hlbiB0aGVyZSBpcyBtb3JlIHRoYW4gM01lZwotCQkgKiBpbiB0aGUgYmxvY2sgcmFuZ2UgKHRoYXQgaXMgcmF0aGVyIGFyYml0cmFyeSwgc2hvdWxkCi0JCSAqIHByb2JhYmx5IGJlIHRpbWUgYmFzZWQpIG9yIHdoZW4gdGhlIGRhdGEgYWJvdXQgdG8gYmUKLQkJICogY29waWVkIHdvdWxkIG92ZXItd3JpdGUgdGhlIHNvdXJjZSBvZiB0aGUgZGF0YSBhdAotCQkgKiB0aGUgZnJvbnQgb2YgdGhlIHJhbmdlLgotCQkgKiBpLmUuIG9uZSBuZXdfc3RyaXBlIGZvcndhcmQgZnJvbSBleHBhbmRfcHJvZ3Jlc3MgbmV3X21hcHMKLQkJICogdG8gYWZ0ZXIgd2hlcmUgZXhwYW5kX2xvIG9sZF9tYXBzIHRvCi0JCSAqLwotCQl3cml0ZXBvcyA9IGNvbmYtPmV4cGFuZF9wcm9ncmVzcyArCi0JCQljb25mLT5jaHVua19zaXplLzUxMiooY29uZi0+cmFpZF9kaXNrcy0xKTsKLQkJc2VjdG9yX2Rpdih3cml0ZXBvcywgY29uZi0+cmFpZF9kaXNrcy0xKTsKLQkJc2FmZXBvcyA9IGNvbmYtPmV4cGFuZF9sbzsKLQkJc2VjdG9yX2RpdihzYWZlcG9zLCBjb25mLT5wcmV2aW91c19yYWlkX2Rpc2tzLTEpOwotCQlnYXAgPSBjb25mLT5leHBhbmRfcHJvZ3Jlc3MgLSBjb25mLT5leHBhbmRfbG87Ci0KLQkJaWYgKHdyaXRlcG9zID49IHNhZmVwb3MgfHwKLQkJICAgIGdhcCA+IChjb25mLT5yYWlkX2Rpc2tzLTEpKjMwMDAqMiAvKjNNZWcqLykgewotCQkJLyogQ2Fubm90IHByb2NlZWQgdW50aWwgd2UndmUgdXBkYXRlZCB0aGUgc3VwZXJibG9jay4uLiAqLwotCQkJd2FpdF9ldmVudChjb25mLT53YWl0X2Zvcl9vdmVybGFwLAotCQkJCSAgIGF0b21pY19yZWFkKCZjb25mLT5yZXNoYXBlX3N0cmlwZXMpPT0wKTsKLQkJCW1kZGV2LT5yZXNoYXBlX3Bvc2l0aW9uID0gY29uZi0+ZXhwYW5kX3Byb2dyZXNzOwotCQkJbWRkZXYtPnNiX2RpcnR5ID0gMTsKLQkJCW1kX3dha2V1cF90aHJlYWQobWRkZXYtPnRocmVhZCk7Ci0JCQl3YWl0X2V2ZW50KG1kZGV2LT5zYl93YWl0LCBtZGRldi0+c2JfZGlydHkgPT0gMCB8fAotCQkJCSAgIGt0aHJlYWRfc2hvdWxkX3N0b3AoKSk7Ci0JCQlzcGluX2xvY2tfaXJxKCZjb25mLT5kZXZpY2VfbG9jayk7Ci0JCQljb25mLT5leHBhbmRfbG8gPSBtZGRldi0+cmVzaGFwZV9wb3NpdGlvbjsKLQkJCXNwaW5fdW5sb2NrX2lycSgmY29uZi0+ZGV2aWNlX2xvY2spOwotCQkJd2FrZV91cCgmY29uZi0+d2FpdF9mb3Jfb3ZlcmxhcCk7Ci0JCX0KLQotCQlmb3IgKGk9MDsgaSA8IGNvbmYtPmNodW5rX3NpemUvNTEyOyBpKz0gU1RSSVBFX1NFQ1RPUlMpIHsKLQkJCWludCBqOwotCQkJaW50IHNraXBwZWQgPSAwOwotCQkJcGRfaWR4ID0gc3RyaXBlX3RvX3BkaWR4KHNlY3Rvcl9ucitpLCBjb25mLCBjb25mLT5yYWlkX2Rpc2tzKTsKLQkJCXNoID0gZ2V0X2FjdGl2ZV9zdHJpcGUoY29uZiwgc2VjdG9yX25yK2ksCi0JCQkJCSAgICAgICBjb25mLT5yYWlkX2Rpc2tzLCBwZF9pZHgsIDApOwotCQkJc2V0X2JpdChTVFJJUEVfRVhQQU5ESU5HLCAmc2gtPnN0YXRlKTsKLQkJCWF0b21pY19pbmMoJmNvbmYtPnJlc2hhcGVfc3RyaXBlcyk7Ci0JCQkvKiBJZiBhbnkgb2YgdGhpcyBzdHJpcGUgaXMgYmV5b25kIHRoZSBlbmQgb2YgdGhlIG9sZAotCQkJICogYXJyYXksIHRoZW4gd2UgbmVlZCB0byB6ZXJvIHRob3NlIGJsb2NrcwotCQkJICovCi0JCQlmb3IgKGo9c2gtPmRpc2tzOyBqLS07KSB7Ci0JCQkJc2VjdG9yX3QgczsKLQkJCQlpZiAoaiA9PSBzaC0+cGRfaWR4KQotCQkJCQljb250aW51ZTsKLQkJCQlzID0gY29tcHV0ZV9ibG9ja25yKHNoLCBqKTsKLQkJCQlpZiAocyA8IChtZGRldi0+YXJyYXlfc2l6ZTw8MSkpIHsKLQkJCQkJc2tpcHBlZCA9IDE7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQltZW1zZXQocGFnZV9hZGRyZXNzKHNoLT5kZXZbal0ucGFnZSksIDAsIFNUUklQRV9TSVpFKTsKLQkJCQlzZXRfYml0KFI1X0V4cGFuZGVkLCAmc2gtPmRldltqXS5mbGFncyk7Ci0JCQkJc2V0X2JpdChSNV9VUFRPREFURSwgJnNoLT5kZXZbal0uZmxhZ3MpOwotCQkJfQotCQkJaWYgKCFza2lwcGVkKSB7Ci0JCQkJc2V0X2JpdChTVFJJUEVfRVhQQU5EX1JFQURZLCAmc2gtPnN0YXRlKTsKLQkJCQlzZXRfYml0KFNUUklQRV9IQU5ETEUsICZzaC0+c3RhdGUpOwotCQkJfQotCQkJcmVsZWFzZV9zdHJpcGUoc2gpOwotCQl9Ci0JCXNwaW5fbG9ja19pcnEoJmNvbmYtPmRldmljZV9sb2NrKTsKLQkJY29uZi0+ZXhwYW5kX3Byb2dyZXNzID0gKHNlY3Rvcl9uciArIGkpKihjb25mLT5yYWlkX2Rpc2tzLTEpOwotCQlzcGluX3VubG9ja19pcnEoJmNvbmYtPmRldmljZV9sb2NrKTsKLQkJLyogT2ssIHRob3NlIHN0cmlwZSBhcmUgcmVhZHkuIFdlIGNhbiBzdGFydCBzY2hlZHVsaW5nCi0JCSAqIHJlYWRzIG9uIHRoZSBzb3VyY2Ugc3RyaXBlcy4KLQkJICogVGhlIHNvdXJjZSBzdHJpcGVzIGFyZSBkZXRlcm1pbmVkIGJ5IG1hcHBpbmcgdGhlIGZpcnN0IGFuZCBsYXN0Ci0JCSAqIGJsb2NrIG9uIHRoZSBkZXN0aW5hdGlvbiBzdHJpcGVzLgotCQkgKi8KLQkJcmFpZF9kaXNrcyA9IGNvbmYtPnByZXZpb3VzX3JhaWRfZGlza3M7Ci0JCWRhdGFfZGlza3MgPSByYWlkX2Rpc2tzIC0gMTsKLQkJZmlyc3Rfc2VjdG9yID0KLQkJCXJhaWQ1X2NvbXB1dGVfc2VjdG9yKHNlY3Rvcl9uciooY29uZi0+cmFpZF9kaXNrcy0xKSwKLQkJCQkJICAgICByYWlkX2Rpc2tzLCBkYXRhX2Rpc2tzLAotCQkJCQkgICAgICZkZF9pZHgsICZwZF9pZHgsIGNvbmYpOwotCQlsYXN0X3NlY3RvciA9Ci0JCQlyYWlkNV9jb21wdXRlX3NlY3Rvcigoc2VjdG9yX25yK2NvbmYtPmNodW5rX3NpemUvNTEyKQotCQkJCQkgICAgICAgKihjb25mLT5yYWlkX2Rpc2tzLTEpIC0xLAotCQkJCQkgICAgIHJhaWRfZGlza3MsIGRhdGFfZGlza3MsCi0JCQkJCSAgICAgJmRkX2lkeCwgJnBkX2lkeCwgY29uZik7Ci0JCWlmIChsYXN0X3NlY3RvciA+PSAobWRkZXYtPnNpemU8PDEpKQotCQkJbGFzdF9zZWN0b3IgPSAobWRkZXYtPnNpemU8PDEpLTE7Ci0JCXdoaWxlIChmaXJzdF9zZWN0b3IgPD0gbGFzdF9zZWN0b3IpIHsKLQkJCXBkX2lkeCA9IHN0cmlwZV90b19wZGlkeChmaXJzdF9zZWN0b3IsIGNvbmYsIGNvbmYtPnByZXZpb3VzX3JhaWRfZGlza3MpOwotCQkJc2ggPSBnZXRfYWN0aXZlX3N0cmlwZShjb25mLCBmaXJzdF9zZWN0b3IsCi0JCQkJCSAgICAgICBjb25mLT5wcmV2aW91c19yYWlkX2Rpc2tzLCBwZF9pZHgsIDApOwotCQkJc2V0X2JpdChTVFJJUEVfRVhQQU5EX1NPVVJDRSwgJnNoLT5zdGF0ZSk7Ci0JCQlzZXRfYml0KFNUUklQRV9IQU5ETEUsICZzaC0+c3RhdGUpOwotCQkJcmVsZWFzZV9zdHJpcGUoc2gpOwotCQkJZmlyc3Rfc2VjdG9yICs9IFNUUklQRV9TRUNUT1JTOwotCQl9Ci0JCXJldHVybiBjb25mLT5jaHVua19zaXplPj45OwotCX0KLQkvKiBpZiB0aGVyZSBpcyAxIG9yIG1vcmUgZmFpbGVkIGRyaXZlcyBhbmQgd2UgYXJlIHRyeWluZworCS8qIGlmIHRoZXJlIGlzIHRvbyBtYW55IGZhaWxlZCBkcml2ZXMgYW5kIHdlIGFyZSB0cnlpbmcKIAkgKiB0byByZXN5bmMsIHRoZW4gYXNzZXJ0IHRoYXQgd2UgYXJlIGZpbmlzaGVkLCBiZWNhdXNlIHRoZXJlIGlzCiAJICogbm90aGluZyB3ZSBjYW4gZG8uCiAJICovCi0JaWYgKG1kZGV2LT5kZWdyYWRlZCA+PSAxICYmIHRlc3RfYml0KE1EX1JFQ09WRVJZX1NZTkMsICZtZGRldi0+cmVjb3ZlcnkpKSB7CisJaWYgKG1kZGV2LT5kZWdyYWRlZCA+PSBjb25mLT5tYXhfZGVncmFkZWQgJiYKKwkgICAgdGVzdF9iaXQoTURfUkVDT1ZFUllfU1lOQywgJm1kZGV2LT5yZWNvdmVyeSkpIHsKIAkJc2VjdG9yX3QgcnYgPSAobWRkZXYtPnNpemUgPDwgMSkgLSBzZWN0b3JfbnI7CiAJCSpza2lwcGVkID0gMTsKIAkJcmV0dXJuIHJ2OwpAQCAtMjAyNiwxNyArMjg3OCwyNiBAQAogCWlmIChzaCA9PSBOVUxMKSB7CiAJCXNoID0gZ2V0X2FjdGl2ZV9zdHJpcGUoY29uZiwgc2VjdG9yX25yLCByYWlkX2Rpc2tzLCBwZF9pZHgsIDApOwogCQkvKiBtYWtlIHN1cmUgd2UgZG9uJ3Qgc3dhbXAgdGhlIHN0cmlwZSBjYWNoZSBpZiBzb21lb25lIGVsc2UKLQkJICogaXMgdHJ5aW5nIHRvIGdldCBhY2Nlc3MgCisJCSAqIGlzIHRyeWluZyB0byBnZXQgYWNjZXNzCiAJCSAqLwogCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSgxKTsKIAl9Ci0JYml0bWFwX3N0YXJ0X3N5bmMobWRkZXYtPmJpdG1hcCwgc2VjdG9yX25yLCAmc3luY19ibG9ja3MsIDApOwotCXNwaW5fbG9jaygmc2gtPmxvY2spOwkKKwkvKiBOZWVkIHRvIGNoZWNrIGlmIGFycmF5IHdpbGwgc3RpbGwgYmUgZGVncmFkZWQgYWZ0ZXIgcmVjb3ZlcnkvcmVzeW5jCisJICogV2UgZG9uJ3QgbmVlZCB0byBjaGVjayB0aGUgJ2ZhaWxlZCcgZmxhZyBhcyB3aGVuIHRoYXQgZ2V0cyBzZXQsCisJICogcmVjb3ZlcnkgYWJvcnRzLgorCSAqLworCWZvciAoaT0wOyBpPG1kZGV2LT5yYWlkX2Rpc2tzOyBpKyspCisJCWlmIChjb25mLT5kaXNrc1tpXS5yZGV2ID09IE5VTEwpCisJCQlzdGlsbF9kZWdyYWRlZCA9IDE7CisKKwliaXRtYXBfc3RhcnRfc3luYyhtZGRldi0+Yml0bWFwLCBzZWN0b3JfbnIsICZzeW5jX2Jsb2Nrcywgc3RpbGxfZGVncmFkZWQpOworCisJc3Bpbl9sb2NrKCZzaC0+bG9jayk7CiAJc2V0X2JpdChTVFJJUEVfU1lOQ0lORywgJnNoLT5zdGF0ZSk7CiAJY2xlYXJfYml0KFNUUklQRV9JTlNZTkMsICZzaC0+c3RhdGUpOwogCXNwaW5fdW5sb2NrKCZzaC0+bG9jayk7CiAKLQloYW5kbGVfc3RyaXBlKHNoKTsKKwloYW5kbGVfc3RyaXBlKHNoLCBOVUxMKTsKIAlyZWxlYXNlX3N0cmlwZShzaCk7CiAKIAlyZXR1cm4gU1RSSVBFX1NFQ1RPUlM7CkBAIC0yMDkxLDcgKzI5NTIsNyBAQAogCQlzcGluX3VubG9ja19pcnEoJmNvbmYtPmRldmljZV9sb2NrKTsKIAkJCiAJCWhhbmRsZWQrKzsKLQkJaGFuZGxlX3N0cmlwZShzaCk7CisJCWhhbmRsZV9zdHJpcGUoc2gsIGNvbmYtPnNwYXJlX3BhZ2UpOwogCQlyZWxlYXNlX3N0cmlwZShzaCk7CiAKIAkJc3Bpbl9sb2NrX2lycSgmY29uZi0+ZGV2aWNlX2xvY2spOwpAQCAtMjE4MSw4ICszMDQyLDggQEAKIAlzdHJ1Y3QgZGlza19pbmZvICpkaXNrOwogCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKIAotCWlmIChtZGRldi0+bGV2ZWwgIT0gNSAmJiBtZGRldi0+bGV2ZWwgIT0gNCkgewotCQlwcmludGsoS0VSTl9FUlIgInJhaWQ1OiAlczogcmFpZCBsZXZlbCBub3Qgc2V0IHRvIDQvNSAoJWQpXG4iLAorCWlmIChtZGRldi0+bGV2ZWwgIT0gNSAmJiBtZGRldi0+bGV2ZWwgIT0gNCAmJiBtZGRldi0+bGV2ZWwgIT0gNikgeworCQlwcmludGsoS0VSTl9FUlIgInJhaWQ1OiAlczogcmFpZCBsZXZlbCBub3Qgc2V0IHRvIDQvNS82ICglZClcbiIsCiAJCSAgICAgICBtZG5hbWUobWRkZXYpLCBtZGRldi0+bGV2ZWwpOwogCQlyZXR1cm4gLUVJTzsKIAl9CkBAIC0yMjUxLDYgKzMxMTIsMTEgQEAKIAlpZiAoKGNvbmYtPnN0cmlwZV9oYXNodGJsID0ga3phbGxvYyhQQUdFX1NJWkUsIEdGUF9LRVJORUwpKSA9PSBOVUxMKQogCQlnb3RvIGFib3J0OwogCisJaWYgKG1kZGV2LT5sZXZlbCA9PSA2KSB7CisJCWNvbmYtPnNwYXJlX3BhZ2UgPSBhbGxvY19wYWdlKEdGUF9LRVJORUwpOworCQlpZiAoIWNvbmYtPnNwYXJlX3BhZ2UpCisJCQlnb3RvIGFib3J0OworCX0KIAlzcGluX2xvY2tfaW5pdCgmY29uZi0+ZGV2aWNlX2xvY2spOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmNvbmYtPndhaXRfZm9yX3N0cmlwZSk7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmY29uZi0+d2FpdF9mb3Jfb3ZlcmxhcCk7CkBAIC0yMjgyLDEyICszMTQ4LDE2IEBACiAJfQogCiAJLyoKLQkgKiAwIGZvciBhIGZ1bGx5IGZ1bmN0aW9uYWwgYXJyYXksIDEgZm9yIGEgZGVncmFkZWQgYXJyYXkuCisJICogMCBmb3IgYSBmdWxseSBmdW5jdGlvbmFsIGFycmF5LCAxIG9yIDIgZm9yIGEgZGVncmFkZWQgYXJyYXkuCiAJICovCiAJbWRkZXYtPmRlZ3JhZGVkID0gY29uZi0+ZmFpbGVkX2Rpc2tzID0gY29uZi0+cmFpZF9kaXNrcyAtIGNvbmYtPndvcmtpbmdfZGlza3M7CiAJY29uZi0+bWRkZXYgPSBtZGRldjsKIAljb25mLT5jaHVua19zaXplID0gbWRkZXYtPmNodW5rX3NpemU7CiAJY29uZi0+bGV2ZWwgPSBtZGRldi0+bGV2ZWw7CisJaWYgKGNvbmYtPmxldmVsID09IDYpCisJCWNvbmYtPm1heF9kZWdyYWRlZCA9IDI7CisJZWxzZQorCQljb25mLT5tYXhfZGVncmFkZWQgPSAxOwogCWNvbmYtPmFsZ29yaXRobSA9IG1kZGV2LT5sYXlvdXQ7CiAJY29uZi0+bWF4X25yX3N0cmlwZXMgPSBOUl9TVFJJUEVTOwogCWNvbmYtPmV4cGFuZF9wcm9ncmVzcyA9IG1kZGV2LT5yZXNoYXBlX3Bvc2l0aW9uOwpAQCAtMjI5Niw2ICszMTY2LDExIEBACiAJbWRkZXYtPnNpemUgJj0gfihtZGRldi0+Y2h1bmtfc2l6ZS8xMDI0IC0xKTsKIAltZGRldi0+cmVzeW5jX21heF9zZWN0b3JzID0gbWRkZXYtPnNpemUgPDwgMTsKIAorCWlmIChjb25mLT5sZXZlbCA9PSA2ICYmIGNvbmYtPnJhaWRfZGlza3MgPCA0KSB7CisJCXByaW50ayhLRVJOX0VSUiAicmFpZDY6IG5vdCBlbm91Z2ggY29uZmlndXJlZCBkZXZpY2VzIGZvciAlcyAoJWQsIG1pbmltdW0gNClcbiIsCisJCSAgICAgICBtZG5hbWUobWRkZXYpLCBjb25mLT5yYWlkX2Rpc2tzKTsKKwkJZ290byBhYm9ydDsKKwl9CiAJaWYgKCFjb25mLT5jaHVua19zaXplIHx8IGNvbmYtPmNodW5rX3NpemUgJSA0KSB7CiAJCXByaW50ayhLRVJOX0VSUiAicmFpZDU6IGludmFsaWQgY2h1bmsgc2l6ZSAlZCBmb3IgJXNcbiIsCiAJCQljb25mLT5jaHVua19zaXplLCBtZG5hbWUobWRkZXYpKTsKQEAgLTIzMDcsMTQgKzMxODIsMTQgQEAKIAkJCWNvbmYtPmFsZ29yaXRobSwgbWRuYW1lKG1kZGV2KSk7CiAJCWdvdG8gYWJvcnQ7CiAJfQotCWlmIChtZGRldi0+ZGVncmFkZWQgPiAxKSB7CisJaWYgKG1kZGV2LT5kZWdyYWRlZCA+IGNvbmYtPm1heF9kZWdyYWRlZCkgewogCQlwcmludGsoS0VSTl9FUlIgInJhaWQ1OiBub3QgZW5vdWdoIG9wZXJhdGlvbmFsIGRldmljZXMgZm9yICVzIgogCQkJIiAoJWQvJWQgZmFpbGVkKVxuIiwKIAkJCW1kbmFtZShtZGRldiksIGNvbmYtPmZhaWxlZF9kaXNrcywgY29uZi0+cmFpZF9kaXNrcyk7CiAJCWdvdG8gYWJvcnQ7CiAJfQogCi0JaWYgKG1kZGV2LT5kZWdyYWRlZCA9PSAxICYmCisJaWYgKG1kZGV2LT5kZWdyYWRlZCA+IDAgJiYKIAkgICAgbWRkZXYtPnJlY292ZXJ5X2NwICE9IE1heFNlY3RvcikgewogCQlpZiAobWRkZXYtPm9rX3N0YXJ0X2RlZ3JhZGVkKQogCQkJcHJpbnRrKEtFUk5fV0FSTklORwpAQCAtMjM3OSwxMSArMzI1NCwxMiBAQAogCX0KIAogCS8qIHJlYWQtYWhlYWQgc2l6ZSBtdXN0IGNvdmVyIHR3byB3aG9sZSBzdHJpcGVzLCB3aGljaCBpcwotCSAqIDIgKiAobi0xKSAqIGNodW5rc2l6ZSB3aGVyZSAnbicgaXMgdGhlIG51bWJlciBvZiByYWlkIGRldmljZXMKKwkgKiAyICogKGRhdGFkaXNrcykgKiBjaHVua3NpemUgd2hlcmUgJ24nIGlzIHRoZSBudW1iZXIgb2YgcmFpZCBkZXZpY2VzCiAJICovCiAJewotCQlpbnQgc3RyaXBlID0gKG1kZGV2LT5yYWlkX2Rpc2tzLTEpICogbWRkZXYtPmNodW5rX3NpemUKLQkJCS8gUEFHRV9TSVpFOworCQlpbnQgZGF0YV9kaXNrcyA9IGNvbmYtPnByZXZpb3VzX3JhaWRfZGlza3MgLSBjb25mLT5tYXhfZGVncmFkZWQ7CisJCWludCBzdHJpcGUgPSBkYXRhX2Rpc2tzICoKKwkJCShtZGRldi0+Y2h1bmtfc2l6ZSAvIFBBR0VfU0laRSk7CiAJCWlmIChtZGRldi0+cXVldWUtPmJhY2tpbmdfZGV2X2luZm8ucmFfcGFnZXMgPCAyICogc3RyaXBlKQogCQkJbWRkZXYtPnF1ZXVlLT5iYWNraW5nX2Rldl9pbmZvLnJhX3BhZ2VzID0gMiAqIHN0cmlwZTsKIAl9CkBAIC0yMzkzLDEyICszMjY5LDE0IEBACiAKIAltZGRldi0+cXVldWUtPnVucGx1Z19mbiA9IHJhaWQ1X3VucGx1Z19kZXZpY2U7CiAJbWRkZXYtPnF1ZXVlLT5pc3N1ZV9mbHVzaF9mbiA9IHJhaWQ1X2lzc3VlX2ZsdXNoOwotCW1kZGV2LT5hcnJheV9zaXplID0gIG1kZGV2LT5zaXplICogKGNvbmYtPnByZXZpb3VzX3JhaWRfZGlza3MgLSAxKTsKKwltZGRldi0+YXJyYXlfc2l6ZSA9ICBtZGRldi0+c2l6ZSAqIChjb25mLT5wcmV2aW91c19yYWlkX2Rpc2tzIC0KKwkJCQkJICAgIGNvbmYtPm1heF9kZWdyYWRlZCk7CiAKIAlyZXR1cm4gMDsKIGFib3J0OgogCWlmIChjb25mKSB7CiAJCXByaW50X3JhaWQ1X2NvbmYoY29uZik7CisJCXNhZmVfcHV0X3BhZ2UoY29uZi0+c3BhcmVfcGFnZSk7CiAJCWtmcmVlKGNvbmYtPmRpc2tzKTsKIAkJa2ZyZWUoY29uZi0+c3RyaXBlX2hhc2h0YmwpOwogCQlrZnJlZShjb25mKTsKQEAgLTI0MjcsMjMgKzMzMDUsMjMgQEAKIH0KIAogI2lmIFJBSUQ1X0RFQlVHCi1zdGF0aWMgdm9pZCBwcmludF9zaCAoc3RydWN0IHN0cmlwZV9oZWFkICpzaCkKK3N0YXRpYyB2b2lkIHByaW50X3NoIChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgc3RydWN0IHN0cmlwZV9oZWFkICpzaCkKIHsKIAlpbnQgaTsKIAotCXByaW50aygic2ggJWxsdSwgcGRfaWR4ICVkLCBzdGF0ZSAlbGQuXG4iLAotCQkodW5zaWduZWQgbG9uZyBsb25nKXNoLT5zZWN0b3IsIHNoLT5wZF9pZHgsIHNoLT5zdGF0ZSk7Ci0JcHJpbnRrKCJzaCAlbGx1LCAgY291bnQgJWQuXG4iLAotCQkodW5zaWduZWQgbG9uZyBsb25nKXNoLT5zZWN0b3IsIGF0b21pY19yZWFkKCZzaC0+Y291bnQpKTsKLQlwcmludGsoInNoICVsbHUsICIsICh1bnNpZ25lZCBsb25nIGxvbmcpc2gtPnNlY3Rvcik7CisJc2VxX3ByaW50ZihzZXEsICJzaCAlbGx1LCBwZF9pZHggJWQsIHN0YXRlICVsZC5cbiIsCisJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpc2gtPnNlY3Rvciwgc2gtPnBkX2lkeCwgc2gtPnN0YXRlKTsKKwlzZXFfcHJpbnRmKHNlcSwgInNoICVsbHUsICBjb3VudCAlZC5cbiIsCisJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpc2gtPnNlY3RvciwgYXRvbWljX3JlYWQoJnNoLT5jb3VudCkpOworCXNlcV9wcmludGYoc2VxLCAic2ggJWxsdSwgIiwgKHVuc2lnbmVkIGxvbmcgbG9uZylzaC0+c2VjdG9yKTsKIAlmb3IgKGkgPSAwOyBpIDwgc2gtPmRpc2tzOyBpKyspIHsKLQkJcHJpbnRrKCIoY2FjaGUlZDogJXAgJWxkKSAiLCAKLQkJCWksIHNoLT5kZXZbaV0ucGFnZSwgc2gtPmRldltpXS5mbGFncyk7CisJCXNlcV9wcmludGYoc2VxLCAiKGNhY2hlJWQ6ICVwICVsZCkgIiwKKwkJCSAgIGksIHNoLT5kZXZbaV0ucGFnZSwgc2gtPmRldltpXS5mbGFncyk7CiAJfQotCXByaW50aygiXG4iKTsKKwlzZXFfcHJpbnRmKHNlcSwgIlxuIik7CiB9CiAKLXN0YXRpYyB2b2lkIHByaW50YWxsIChyYWlkNV9jb25mX3QgKmNvbmYpCitzdGF0aWMgdm9pZCBwcmludGFsbCAoc3RydWN0IHNlcV9maWxlICpzZXEsIHJhaWQ1X2NvbmZfdCAqY29uZikKIHsKIAlzdHJ1Y3Qgc3RyaXBlX2hlYWQgKnNoOwogCXN0cnVjdCBobGlzdF9ub2RlICpobjsKQEAgLTI0NTQsNyArMzMzMiw3IEBACiAJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KHNoLCBobiwgJmNvbmYtPnN0cmlwZV9oYXNodGJsW2ldLCBoYXNoKSB7CiAJCQlpZiAoc2gtPnJhaWRfY29uZiAhPSBjb25mKQogCQkJCWNvbnRpbnVlOwotCQkJcHJpbnRfc2goc2gpOworCQkJcHJpbnRfc2goc2VxLCBzaCk7CiAJCX0KIAl9CiAJc3Bpbl91bmxvY2tfaXJxKCZjb25mLT5kZXZpY2VfbG9jayk7CkBAIC0yNDc0LDkgKzMzNTIsOCBAQAogCQkJICAgICAgIHRlc3RfYml0KEluX3N5bmMsICZjb25mLT5kaXNrc1tpXS5yZGV2LT5mbGFncykgPyAiVSIgOiAiXyIpOwogCXNlcV9wcmludGYgKHNlcSwgIl0iKTsKICNpZiBSQUlENV9ERUJVRwotI2RlZmluZSBEKHgpIFwKLQlzZXFfcHJpbnRmIChzZXEsICI8IiN4IjolZD4iLCBhdG9taWNfcmVhZCgmY29uZi0+eCkpCi0JcHJpbnRhbGwoY29uZik7CisJc2VxX3ByaW50ZiAoc2VxLCAiXG4iKTsKKwlwcmludGFsbChzZXEsIGNvbmYpOwogI2VuZGlmCiB9CiAKQEAgLTI1NjAsMTQgKzM0MzcsMjAgQEAKIAlpbnQgZGlzazsKIAlzdHJ1Y3QgZGlza19pbmZvICpwOwogCi0JaWYgKG1kZGV2LT5kZWdyYWRlZCA+IDEpCisJaWYgKG1kZGV2LT5kZWdyYWRlZCA+IGNvbmYtPm1heF9kZWdyYWRlZCkKIAkJLyogbm8gcG9pbnQgYWRkaW5nIGEgZGV2aWNlICovCiAJCXJldHVybiAwOwogCiAJLyoKLQkgKiBmaW5kIHRoZSBkaXNrIC4uLgorCSAqIGZpbmQgdGhlIGRpc2sgLi4uIGJ1dCBwcmVmZXIgcmRldi0+c2F2ZWRfcmFpZF9kaXNrCisJICogaWYgcG9zc2libGUuCiAJICovCi0JZm9yIChkaXNrPTA7IGRpc2sgPCBjb25mLT5yYWlkX2Rpc2tzOyBkaXNrKyspCisJaWYgKHJkZXYtPnNhdmVkX3JhaWRfZGlzayA+PSAwICYmCisJICAgIGNvbmYtPmRpc2tzW3JkZXYtPnNhdmVkX3JhaWRfZGlza10ucmRldiA9PSBOVUxMKQorCQlkaXNrID0gcmRldi0+c2F2ZWRfcmFpZF9kaXNrOworCWVsc2UKKwkJZGlzayA9IDA7CisJZm9yICggOyBkaXNrIDwgY29uZi0+cmFpZF9kaXNrczsgZGlzaysrKQogCQlpZiAoKHA9Y29uZi0+ZGlza3MgKyBkaXNrKS0+cmRldiA9PSBOVUxMKSB7CiAJCQljbGVhcl9iaXQoSW5fc3luYywgJnJkZXYtPmZsYWdzKTsKIAkJCXJkZXYtPnJhaWRfZGlzayA9IGRpc2s7CkBAIC0yNTkwLDggKzM0NzMsMTAgQEAKIAkgKiBhbnkgaW8gaW4gdGhlIHJlbW92ZWQgc3BhY2UgY29tcGxldGVzLCBidXQgaXQgaGFyZGx5IHNlZW1zCiAJICogd29ydGggaXQuCiAJICovCisJcmFpZDVfY29uZl90ICpjb25mID0gbWRkZXZfdG9fY29uZihtZGRldik7CisKIAlzZWN0b3JzICY9IH4oKHNlY3Rvcl90KW1kZGV2LT5jaHVua19zaXplLzUxMiAtIDEpOwotCW1kZGV2LT5hcnJheV9zaXplID0gKHNlY3RvcnMgKiAobWRkZXYtPnJhaWRfZGlza3MtMSkpPj4xOworCW1kZGV2LT5hcnJheV9zaXplID0gKHNlY3RvcnMgKiAobWRkZXYtPnJhaWRfZGlza3MtY29uZi0+bWF4X2RlZ3JhZGVkKSk+PjE7CiAJc2V0X2NhcGFjaXR5KG1kZGV2LT5nZW5kaXNrLCBtZGRldi0+YXJyYXlfc2l6ZSA8PCAxKTsKIAltZGRldi0+Y2hhbmdlZCA9IDE7CiAJaWYgKHNlY3RvcnMvMiAgPiBtZGRldi0+c2l6ZSAmJiBtZGRldi0+cmVjb3ZlcnlfY3AgPT0gTWF4U2VjdG9yKSB7CkBAIC0yNjgwLDYgKzM1NjUsNyBAQAogCQkJCXNldF9iaXQoSW5fc3luYywgJnJkZXYtPmZsYWdzKTsKIAkJCQljb25mLT53b3JraW5nX2Rpc2tzKys7CiAJCQkJYWRkZWRfZGV2aWNlcysrOworCQkJCXJkZXYtPnJlY292ZXJ5X29mZnNldCA9IDA7CiAJCQkJc3ByaW50ZihubSwgInJkJWQiLCByZGV2LT5yYWlkX2Rpc2spOwogCQkJCXN5c2ZzX2NyZWF0ZV9saW5rKCZtZGRldi0+a29iaiwgJnJkZXYtPmtvYmosIG5tKTsKIAkJCX0gZWxzZQpAQCAtMjczMSw2ICszNjE3LDE3IEBACiAJCWNvbmYtPmV4cGFuZF9wcm9ncmVzcyA9IE1heFNlY3RvcjsKIAkJc3Bpbl91bmxvY2tfaXJxKCZjb25mLT5kZXZpY2VfbG9jayk7CiAJCWNvbmYtPm1kZGV2LT5yZXNoYXBlX3Bvc2l0aW9uID0gTWF4U2VjdG9yOworCisJCS8qIHJlYWQtYWhlYWQgc2l6ZSBtdXN0IGNvdmVyIHR3byB3aG9sZSBzdHJpcGVzLCB3aGljaCBpcworCQkgKiAyICogKGRhdGFkaXNrcykgKiBjaHVua3NpemUgd2hlcmUgJ24nIGlzIHRoZSBudW1iZXIgb2YgcmFpZCBkZXZpY2VzCisJCSAqLworCQl7CisJCQlpbnQgZGF0YV9kaXNrcyA9IGNvbmYtPnByZXZpb3VzX3JhaWRfZGlza3MgLSBjb25mLT5tYXhfZGVncmFkZWQ7CisJCQlpbnQgc3RyaXBlID0gZGF0YV9kaXNrcyAqCisJCQkJKGNvbmYtPm1kZGV2LT5jaHVua19zaXplIC8gUEFHRV9TSVpFKTsKKwkJCWlmIChjb25mLT5tZGRldi0+cXVldWUtPmJhY2tpbmdfZGV2X2luZm8ucmFfcGFnZXMgPCAyICogc3RyaXBlKQorCQkJCWNvbmYtPm1kZGV2LT5xdWV1ZS0+YmFja2luZ19kZXZfaW5mby5yYV9wYWdlcyA9IDIgKiBzdHJpcGU7CisJCX0KIAl9CiB9CiAKQEAgLTI3NjIsNiArMzY1OSwyMyBAQAogCX0KIH0KIAorc3RhdGljIHN0cnVjdCBtZGtfcGVyc29uYWxpdHkgcmFpZDZfcGVyc29uYWxpdHkgPQoreworCS5uYW1lCQk9ICJyYWlkNiIsCisJLmxldmVsCQk9IDYsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5tYWtlX3JlcXVlc3QJPSBtYWtlX3JlcXVlc3QsCisJLnJ1bgkJPSBydW4sCisJLnN0b3AJCT0gc3RvcCwKKwkuc3RhdHVzCQk9IHN0YXR1cywKKwkuZXJyb3JfaGFuZGxlcgk9IGVycm9yLAorCS5ob3RfYWRkX2Rpc2sJPSByYWlkNV9hZGRfZGlzaywKKwkuaG90X3JlbW92ZV9kaXNrPSByYWlkNV9yZW1vdmVfZGlzaywKKwkuc3BhcmVfYWN0aXZlCT0gcmFpZDVfc3BhcmVfYWN0aXZlLAorCS5zeW5jX3JlcXVlc3QJPSBzeW5jX3JlcXVlc3QsCisJLnJlc2l6ZQkJPSByYWlkNV9yZXNpemUsCisJLnF1aWVzY2UJPSByYWlkNV9xdWllc2NlLAorfTsKIHN0YXRpYyBzdHJ1Y3QgbWRrX3BlcnNvbmFsaXR5IHJhaWQ1X3BlcnNvbmFsaXR5ID0KIHsKIAkubmFtZQkJPSAicmFpZDUiLApAQCAtMjgwNCw2ICszNzE4LDEyIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IHJhaWQ1X2luaXQodm9pZCkKIHsKKwlpbnQgZTsKKworCWUgPSByYWlkNl9zZWxlY3RfYWxnbygpOworCWlmICggZSApCisJCXJldHVybiBlOworCXJlZ2lzdGVyX21kX3BlcnNvbmFsaXR5KCZyYWlkNl9wZXJzb25hbGl0eSk7CiAJcmVnaXN0ZXJfbWRfcGVyc29uYWxpdHkoJnJhaWQ1X3BlcnNvbmFsaXR5KTsKIAlyZWdpc3Rlcl9tZF9wZXJzb25hbGl0eSgmcmFpZDRfcGVyc29uYWxpdHkpOwogCXJldHVybiAwOwpAQCAtMjgxMSw2ICszNzMxLDcgQEAKIAogc3RhdGljIHZvaWQgcmFpZDVfZXhpdCh2b2lkKQogeworCXVucmVnaXN0ZXJfbWRfcGVyc29uYWxpdHkoJnJhaWQ2X3BlcnNvbmFsaXR5KTsKIAl1bnJlZ2lzdGVyX21kX3BlcnNvbmFsaXR5KCZyYWlkNV9wZXJzb25hbGl0eSk7CiAJdW5yZWdpc3Rlcl9tZF9wZXJzb25hbGl0eSgmcmFpZDRfcGVyc29uYWxpdHkpOwogfQpAQCAtMjgyMywzICszNzQ0LDEwIEBACiBNT0RVTEVfQUxJQVMoIm1kLXJhaWQ0Iik7CiBNT0RVTEVfQUxJQVMoIm1kLWxldmVsLTUiKTsKIE1PRFVMRV9BTElBUygibWQtbGV2ZWwtNCIpOworTU9EVUxFX0FMSUFTKCJtZC1wZXJzb25hbGl0eS04Iik7IC8qIFJBSUQ2ICovCitNT0RVTEVfQUxJQVMoIm1kLXJhaWQ2Iik7CitNT0RVTEVfQUxJQVMoIm1kLWxldmVsLTYiKTsKKworLyogVGhpcyB1c2VkIHRvIGJlIHR3byBzZXBhcmF0ZSBtb2R1bGVzLCB0aGV5IHdlcmU6ICovCitNT0RVTEVfQUxJQVMoInJhaWQ1Iik7CitNT0RVTEVfQUxJQVMoInJhaWQ2Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL3JhaWQ2bWFpbi5jIGIvZHJpdmVycy9tZC9yYWlkNm1haW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM2OTM1NS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21kL3JhaWQ2bWFpbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjQyNyArMCwwIEBACi0vKgotICogcmFpZDZtYWluLmMgOiBNdWx0aXBsZSBEZXZpY2VzIGRyaXZlciBmb3IgTGludXgKLSAqCSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NyBJbmdvIE1vbG5hciwgTWlndWVsIGRlIEljYXphLCBHYWRpIE94bWFuCi0gKgkgICBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAgSW5nbyBNb2xuYXIKLSAqCSAgIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMyBILiBQZXRlciBBbnZpbgotICoKLSAqIFJBSUQtNiBtYW5hZ2VtZW50IGZ1bmN0aW9ucy4gIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gcmFpZDUuYy4KLSAqIExhc3QgbWVyZ2UgZnJvbSByYWlkNS5jIGJrY3ZzIHZlcnNpb24gMS43OSAoa2VybmVsIDIuNi4xKS4KLSAqCi0gKiBUaGFua3MgdG8gUGVuZ3VpbiBDb21wdXRpbmcgZm9yIG1ha2luZyB0aGUgUkFJRC02IGRldmVsb3BtZW50IHBvc3NpYmxlCi0gKiBieSBkb25hdGluZyBhIHRlc3Qgc2VydmVyIQotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICogYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIChmb3IgZXhhbXBsZSAvdXNyL3NyYy9saW51eC9DT1BZSU5HKTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICogU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKi8KLQotCi0jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KLSNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KLSNpbmNsdWRlIDxhc20vYXRvbWljLmg+Ci0jaW5jbHVkZSAicmFpZDYuaCIKLQotI2luY2x1ZGUgPGxpbnV4L3JhaWQvYml0bWFwLmg+Ci0KLS8qCi0gKiBTdHJpcGUgY2FjaGUKLSAqLwotCi0jZGVmaW5lIE5SX1NUUklQRVMJCTI1NgotI2RlZmluZSBTVFJJUEVfU0laRQkJUEFHRV9TSVpFCi0jZGVmaW5lIFNUUklQRV9TSElGVAkJKFBBR0VfU0hJRlQgLSA5KQotI2RlZmluZSBTVFJJUEVfU0VDVE9SUwkJKFNUUklQRV9TSVpFPj45KQotI2RlZmluZQlJT19USFJFU0hPTEQJCTEKLSNkZWZpbmUgTlJfSEFTSAkJCShQQUdFX1NJWkUgLyBzaXplb2Yoc3RydWN0IGhsaXN0X2hlYWQpKQotI2RlZmluZSBIQVNIX01BU0sJCShOUl9IQVNIIC0gMSkKLQotI2RlZmluZSBzdHJpcGVfaGFzaChjb25mLCBzZWN0KQkoJigoY29uZiktPnN0cmlwZV9oYXNodGJsWygoc2VjdCkgPj4gU1RSSVBFX1NISUZUKSAmIEhBU0hfTUFTS10pKQotCi0vKiBiaW8ncyBhdHRhY2hlZCB0byBhIHN0cmlwZStkZXZpY2UgZm9yIEkvTyBhcmUgbGlua2VkIHRvZ2V0aGVyIGluIGJpX3NlY3RvcgotICogb3JkZXIgd2l0aG91dCBvdmVybGFwLiAgVGhlcmUgbWF5IGJlIHNldmVyYWwgYmlvJ3MgcGVyIHN0cmlwZStkZXZpY2UsIGFuZAotICogYSBiaW8gY291bGQgc3BhbiBzZXZlcmFsIGRldmljZXMuCi0gKiBXaGVuIHdhbGtpbmcgdGhpcyBsaXN0IGZvciBhIHBhcnRpY3VsYXIgc3RyaXBlK2RldmljZSwgd2UgbXVzdCBuZXZlciBwcm9jZWVkCi0gKiBiZXlvbmQgYSBiaW8gdGhhdCBleHRlbmRzIHBhc3QgdGhpcyBkZXZpY2UsIGFzIHRoZSBuZXh0IGJpbyBtaWdodCBubyBsb25nZXIKLSAqIGJlIHZhbGlkLgotICogVGhpcyBtYWNybyBpcyB1c2VkIHRvIGRldGVybWluZSB0aGUgJ25leHQnIGJpbyBpbiB0aGUgbGlzdCwgZ2l2ZW4gdGhlIHNlY3RvcgotICogb2YgdGhlIGN1cnJlbnQgc3RyaXBlK2RldmljZQotICovCi0jZGVmaW5lIHI1X25leHRfYmlvKGJpbywgc2VjdCkgKCAoIChiaW8pLT5iaV9zZWN0b3IgKyAoKGJpbyktPmJpX3NpemU+PjkpIDwgc2VjdCArIFNUUklQRV9TRUNUT1JTKSA/IChiaW8pLT5iaV9uZXh0IDogTlVMTCkKLS8qCi0gKiBUaGUgZm9sbG93aW5nIGNhbiBiZSB1c2VkIHRvIGRlYnVnIHRoZSBkcml2ZXIKLSAqLwotI2RlZmluZSBSQUlENl9ERUJVRwkwCS8qIEV4dHJlbWVseSB2ZXJib3NlIHByaW50ayAqLwotI2RlZmluZSBSQUlENl9QQVJBTk9JQQkxCS8qIENoZWNrIHNwaW5sb2NrcyAqLwotI2RlZmluZSBSQUlENl9EVU1QU1RBVEUgMAkvKiBJbmNsdWRlIHN0cmlwZSBjYWNoZSBzdGF0ZSBpbiAvcHJvYy9tZHN0YXQgKi8KLSNpZiBSQUlENl9QQVJBTk9JQSAmJiBkZWZpbmVkKENPTkZJR19TTVApCi0jIGRlZmluZSBDSEVDS19ERVZMT0NLKCkgYXNzZXJ0X3NwaW5fbG9ja2VkKCZjb25mLT5kZXZpY2VfbG9jaykKLSNlbHNlCi0jIGRlZmluZSBDSEVDS19ERVZMT0NLKCkKLSNlbmRpZgotCi0jZGVmaW5lIFBSSU5USyh4Li4uKSAoKHZvaWQpKFJBSUQ2X0RFQlVHICYmIHByaW50ayhLRVJOX0RFQlVHIHgpKSkKLSNpZiBSQUlENl9ERUJVRwotI3VuZGVmIGlubGluZQotI3VuZGVmIF9faW5saW5lX18KLSNkZWZpbmUgaW5saW5lCi0jZGVmaW5lIF9faW5saW5lX18KLSNlbmRpZgotCi0jaWYgIVJBSUQ2X1VTRV9FTVBUWV9aRVJPX1BBR0UKLS8qIEluIC5ic3Mgc28gaXQncyB6ZXJvZWQgKi8KLWNvbnN0IGNoYXIgcmFpZDZfZW1wdHlfemVyb19wYWdlW1BBR0VfU0laRV0gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgyNTYpKSk7Ci0jZW5kaWYKLQotc3RhdGljIGlubGluZSBpbnQgcmFpZDZfbmV4dF9kaXNrKGludCBkaXNrLCBpbnQgcmFpZF9kaXNrcykKLXsKLQlkaXNrKys7Ci0JcmV0dXJuIChkaXNrIDwgcmFpZF9kaXNrcykgPyBkaXNrIDogMDsKLX0KLQotc3RhdGljIHZvaWQgcHJpbnRfcmFpZDZfY29uZiAocmFpZDZfY29uZl90ICpjb25mKTsKLQotc3RhdGljIHZvaWQgX19yZWxlYXNlX3N0cmlwZShyYWlkNl9jb25mX3QgKmNvbmYsIHN0cnVjdCBzdHJpcGVfaGVhZCAqc2gpCi17Ci0JaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJnNoLT5jb3VudCkpIHsKLQkJQlVHX09OKCFsaXN0X2VtcHR5KCZzaC0+bHJ1KSk7Ci0JCUJVR19PTihhdG9taWNfcmVhZCgmY29uZi0+YWN0aXZlX3N0cmlwZXMpPT0wKTsKLQkJaWYgKHRlc3RfYml0KFNUUklQRV9IQU5ETEUsICZzaC0+c3RhdGUpKSB7Ci0JCQlpZiAodGVzdF9iaXQoU1RSSVBFX0RFTEFZRUQsICZzaC0+c3RhdGUpKQotCQkJCWxpc3RfYWRkX3RhaWwoJnNoLT5scnUsICZjb25mLT5kZWxheWVkX2xpc3QpOwotCQkJZWxzZSBpZiAodGVzdF9iaXQoU1RSSVBFX0JJVF9ERUxBWSwgJnNoLT5zdGF0ZSkgJiYKLQkJCQkgY29uZi0+c2VxX3dyaXRlID09IHNoLT5ibV9zZXEpCi0JCQkJbGlzdF9hZGRfdGFpbCgmc2gtPmxydSwgJmNvbmYtPmJpdG1hcF9saXN0KTsKLQkJCWVsc2UgewotCQkJCWNsZWFyX2JpdChTVFJJUEVfQklUX0RFTEFZLCAmc2gtPnN0YXRlKTsKLQkJCQlsaXN0X2FkZF90YWlsKCZzaC0+bHJ1LCAmY29uZi0+aGFuZGxlX2xpc3QpOwotCQkJfQotCQkJbWRfd2FrZXVwX3RocmVhZChjb25mLT5tZGRldi0+dGhyZWFkKTsKLQkJfSBlbHNlIHsKLQkJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoU1RSSVBFX1BSRVJFQURfQUNUSVZFLCAmc2gtPnN0YXRlKSkgewotCQkJCWF0b21pY19kZWMoJmNvbmYtPnByZXJlYWRfYWN0aXZlX3N0cmlwZXMpOwotCQkJCWlmIChhdG9taWNfcmVhZCgmY29uZi0+cHJlcmVhZF9hY3RpdmVfc3RyaXBlcykgPCBJT19USFJFU0hPTEQpCi0JCQkJCW1kX3dha2V1cF90aHJlYWQoY29uZi0+bWRkZXYtPnRocmVhZCk7Ci0JCQl9Ci0JCQlsaXN0X2FkZF90YWlsKCZzaC0+bHJ1LCAmY29uZi0+aW5hY3RpdmVfbGlzdCk7Ci0JCQlhdG9taWNfZGVjKCZjb25mLT5hY3RpdmVfc3RyaXBlcyk7Ci0JCQlpZiAoIWNvbmYtPmluYWN0aXZlX2Jsb2NrZWQgfHwKLQkJCSAgICBhdG9taWNfcmVhZCgmY29uZi0+YWN0aXZlX3N0cmlwZXMpIDwgKGNvbmYtPm1heF9ucl9zdHJpcGVzKjMvNCkpCi0JCQkJd2FrZV91cCgmY29uZi0+d2FpdF9mb3Jfc3RyaXBlKTsKLQkJfQotCX0KLX0KLXN0YXRpYyB2b2lkIHJlbGVhc2Vfc3RyaXBlKHN0cnVjdCBzdHJpcGVfaGVhZCAqc2gpCi17Ci0JcmFpZDZfY29uZl90ICpjb25mID0gc2gtPnJhaWRfY29uZjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNvbmYtPmRldmljZV9sb2NrLCBmbGFncyk7Ci0JX19yZWxlYXNlX3N0cmlwZShjb25mLCBzaCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29uZi0+ZGV2aWNlX2xvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHJlbW92ZV9oYXNoKHN0cnVjdCBzdHJpcGVfaGVhZCAqc2gpCi17Ci0JUFJJTlRLKCJyZW1vdmVfaGFzaCgpLCBzdHJpcGUgJWxsdVxuIiwgKHVuc2lnbmVkIGxvbmcgbG9uZylzaC0+c2VjdG9yKTsKLQotCWhsaXN0X2RlbF9pbml0KCZzaC0+aGFzaCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBpbnNlcnRfaGFzaChyYWlkNl9jb25mX3QgKmNvbmYsIHN0cnVjdCBzdHJpcGVfaGVhZCAqc2gpCi17Ci0Jc3RydWN0IGhsaXN0X2hlYWQgKmhwID0gc3RyaXBlX2hhc2goY29uZiwgc2gtPnNlY3Rvcik7Ci0KLQlQUklOVEsoImluc2VydF9oYXNoKCksIHN0cmlwZSAlbGx1XG4iLCAodW5zaWduZWQgbG9uZyBsb25nKXNoLT5zZWN0b3IpOwotCi0JQ0hFQ0tfREVWTE9DSygpOwotCWhsaXN0X2FkZF9oZWFkKCZzaC0+aGFzaCwgaHApOwotfQotCi0KLS8qIGZpbmQgYW4gaWRsZSBzdHJpcGUsIG1ha2Ugc3VyZSBpdCBpcyB1bmhhc2hlZCwgYW5kIHJldHVybiBpdC4gKi8KLXN0YXRpYyBzdHJ1Y3Qgc3RyaXBlX2hlYWQgKmdldF9mcmVlX3N0cmlwZShyYWlkNl9jb25mX3QgKmNvbmYpCi17Ci0Jc3RydWN0IHN0cmlwZV9oZWFkICpzaCA9IE5VTEw7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqZmlyc3Q7Ci0KLQlDSEVDS19ERVZMT0NLKCk7Ci0JaWYgKGxpc3RfZW1wdHkoJmNvbmYtPmluYWN0aXZlX2xpc3QpKQotCQlnb3RvIG91dDsKLQlmaXJzdCA9IGNvbmYtPmluYWN0aXZlX2xpc3QubmV4dDsKLQlzaCA9IGxpc3RfZW50cnkoZmlyc3QsIHN0cnVjdCBzdHJpcGVfaGVhZCwgbHJ1KTsKLQlsaXN0X2RlbF9pbml0KGZpcnN0KTsKLQlyZW1vdmVfaGFzaChzaCk7Ci0JYXRvbWljX2luYygmY29uZi0+YWN0aXZlX3N0cmlwZXMpOwotb3V0OgotCXJldHVybiBzaDsKLX0KLQotc3RhdGljIHZvaWQgc2hyaW5rX2J1ZmZlcnMoc3RydWN0IHN0cmlwZV9oZWFkICpzaCwgaW50IG51bSkKLXsKLQlzdHJ1Y3QgcGFnZSAqcDsKLQlpbnQgaTsKLQotCWZvciAoaT0wOyBpPG51bSA7IGkrKykgewotCQlwID0gc2gtPmRldltpXS5wYWdlOwotCQlpZiAoIXApCi0JCQljb250aW51ZTsKLQkJc2gtPmRldltpXS5wYWdlID0gTlVMTDsKLQkJcHV0X3BhZ2UocCk7Ci0JfQotfQotCi1zdGF0aWMgaW50IGdyb3dfYnVmZmVycyhzdHJ1Y3Qgc3RyaXBlX2hlYWQgKnNoLCBpbnQgbnVtKQotewotCWludCBpOwotCi0JZm9yIChpPTA7IGk8bnVtOyBpKyspIHsKLQkJc3RydWN0IHBhZ2UgKnBhZ2U7Ci0KLQkJaWYgKCEocGFnZSA9IGFsbG9jX3BhZ2UoR0ZQX0tFUk5FTCkpKSB7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCQlzaC0+ZGV2W2ldLnBhZ2UgPSBwYWdlOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgcmFpZDZfYnVpbGRfYmxvY2sgKHN0cnVjdCBzdHJpcGVfaGVhZCAqc2gsIGludCBpKTsKLQotc3RhdGljIHZvaWQgaW5pdF9zdHJpcGUoc3RydWN0IHN0cmlwZV9oZWFkICpzaCwgc2VjdG9yX3Qgc2VjdG9yLCBpbnQgcGRfaWR4KQotewotCXJhaWQ2X2NvbmZfdCAqY29uZiA9IHNoLT5yYWlkX2NvbmY7Ci0JaW50IGRpc2tzID0gY29uZi0+cmFpZF9kaXNrcywgaTsKLQotCUJVR19PTihhdG9taWNfcmVhZCgmc2gtPmNvdW50KSAhPSAwKTsKLQlCVUdfT04odGVzdF9iaXQoU1RSSVBFX0hBTkRMRSwgJnNoLT5zdGF0ZSkpOwotCi0JQ0hFQ0tfREVWTE9DSygpOwotCVBSSU5USygiaW5pdF9zdHJpcGUgY2FsbGVkLCBzdHJpcGUgJWxsdVxuIiwKLQkJKHVuc2lnbmVkIGxvbmcgbG9uZylzaC0+c2VjdG9yKTsKLQotCXJlbW92ZV9oYXNoKHNoKTsKLQotCXNoLT5zZWN0b3IgPSBzZWN0b3I7Ci0Jc2gtPnBkX2lkeCA9IHBkX2lkeDsKLQlzaC0+c3RhdGUgPSAwOwotCi0JZm9yIChpPWRpc2tzOyBpLS07ICkgewotCQlzdHJ1Y3QgcjVkZXYgKmRldiA9ICZzaC0+ZGV2W2ldOwotCi0JCWlmIChkZXYtPnRvcmVhZCB8fCBkZXYtPnRvd3JpdGUgfHwgZGV2LT53cml0dGVuIHx8Ci0JCSAgICB0ZXN0X2JpdChSNV9MT0NLRUQsICZkZXYtPmZsYWdzKSkgewotCQkJUFJJTlRLKCJzZWN0b3I9JWxseCBpPSVkICVwICVwICVwICVkXG4iLAotCQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpc2gtPnNlY3RvciwgaSwgZGV2LT50b3JlYWQsCi0JCQkgICAgICAgZGV2LT50b3dyaXRlLCBkZXYtPndyaXR0ZW4sCi0JCQkgICAgICAgdGVzdF9iaXQoUjVfTE9DS0VELCAmZGV2LT5mbGFncykpOwotCQkJQlVHKCk7Ci0JCX0KLQkJZGV2LT5mbGFncyA9IDA7Ci0JCXJhaWQ2X2J1aWxkX2Jsb2NrKHNoLCBpKTsKLQl9Ci0JaW5zZXJ0X2hhc2goY29uZiwgc2gpOwotfQotCi1zdGF0aWMgc3RydWN0IHN0cmlwZV9oZWFkICpfX2ZpbmRfc3RyaXBlKHJhaWQ2X2NvbmZfdCAqY29uZiwgc2VjdG9yX3Qgc2VjdG9yKQotewotCXN0cnVjdCBzdHJpcGVfaGVhZCAqc2g7Ci0Jc3RydWN0IGhsaXN0X25vZGUgKmhuOwotCi0JQ0hFQ0tfREVWTE9DSygpOwotCVBSSU5USygiX19maW5kX3N0cmlwZSwgc2VjdG9yICVsbHVcbiIsICh1bnNpZ25lZCBsb25nIGxvbmcpc2VjdG9yKTsKLQlobGlzdF9mb3JfZWFjaF9lbnRyeSAoc2gsIGhuLCAgc3RyaXBlX2hhc2goY29uZiwgc2VjdG9yKSwgaGFzaCkKLQkJaWYgKHNoLT5zZWN0b3IgPT0gc2VjdG9yKQotCQkJcmV0dXJuIHNoOwotCVBSSU5USygiX19zdHJpcGUgJWxsdSBub3QgaW4gY2FjaGVcbiIsICh1bnNpZ25lZCBsb25nIGxvbmcpc2VjdG9yKTsKLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIHZvaWQgdW5wbHVnX3NsYXZlcyhtZGRldl90ICptZGRldik7Ci0KLXN0YXRpYyBzdHJ1Y3Qgc3RyaXBlX2hlYWQgKmdldF9hY3RpdmVfc3RyaXBlKHJhaWQ2X2NvbmZfdCAqY29uZiwgc2VjdG9yX3Qgc2VjdG9yLAotCQkJCQkgICAgIGludCBwZF9pZHgsIGludCBub2Jsb2NrKQotewotCXN0cnVjdCBzdHJpcGVfaGVhZCAqc2g7Ci0KLQlQUklOVEsoImdldF9zdHJpcGUsIHNlY3RvciAlbGx1XG4iLCAodW5zaWduZWQgbG9uZyBsb25nKXNlY3Rvcik7Ci0KLQlzcGluX2xvY2tfaXJxKCZjb25mLT5kZXZpY2VfbG9jayk7Ci0KLQlkbyB7Ci0JCXdhaXRfZXZlbnRfbG9ja19pcnEoY29uZi0+d2FpdF9mb3Jfc3RyaXBlLAotCQkJCSAgICBjb25mLT5xdWllc2NlID09IDAsCi0JCQkJICAgIGNvbmYtPmRldmljZV9sb2NrLCAvKiBub3RoaW5nICovKTsKLQkJc2ggPSBfX2ZpbmRfc3RyaXBlKGNvbmYsIHNlY3Rvcik7Ci0JCWlmICghc2gpIHsKLQkJCWlmICghY29uZi0+aW5hY3RpdmVfYmxvY2tlZCkKLQkJCQlzaCA9IGdldF9mcmVlX3N0cmlwZShjb25mKTsKLQkJCWlmIChub2Jsb2NrICYmIHNoID09IE5VTEwpCi0JCQkJYnJlYWs7Ci0JCQlpZiAoIXNoKSB7Ci0JCQkJY29uZi0+aW5hY3RpdmVfYmxvY2tlZCA9IDE7Ci0JCQkJd2FpdF9ldmVudF9sb2NrX2lycShjb25mLT53YWl0X2Zvcl9zdHJpcGUsCi0JCQkJCQkgICAgIWxpc3RfZW1wdHkoJmNvbmYtPmluYWN0aXZlX2xpc3QpICYmCi0JCQkJCQkgICAgKGF0b21pY19yZWFkKCZjb25mLT5hY3RpdmVfc3RyaXBlcykKLQkJCQkJCSAgICAgPCAoY29uZi0+bWF4X25yX3N0cmlwZXMgKjMvNCkKLQkJCQkJCSAgICAgfHwgIWNvbmYtPmluYWN0aXZlX2Jsb2NrZWQpLAotCQkJCQkJICAgIGNvbmYtPmRldmljZV9sb2NrLAotCQkJCQkJICAgIHVucGx1Z19zbGF2ZXMoY29uZi0+bWRkZXYpOwotCQkJCQkpOwotCQkJCWNvbmYtPmluYWN0aXZlX2Jsb2NrZWQgPSAwOwotCQkJfSBlbHNlCi0JCQkJaW5pdF9zdHJpcGUoc2gsIHNlY3RvciwgcGRfaWR4KTsKLQkJfSBlbHNlIHsKLQkJCWlmIChhdG9taWNfcmVhZCgmc2gtPmNvdW50KSkgewotCQkJCUJVR19PTighbGlzdF9lbXB0eSgmc2gtPmxydSkpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoIXRlc3RfYml0KFNUUklQRV9IQU5ETEUsICZzaC0+c3RhdGUpKQotCQkJCQlhdG9taWNfaW5jKCZjb25mLT5hY3RpdmVfc3RyaXBlcyk7Ci0JCQkJQlVHX09OKGxpc3RfZW1wdHkoJnNoLT5scnUpKTsKLQkJCQlsaXN0X2RlbF9pbml0KCZzaC0+bHJ1KTsKLQkJCX0KLQkJfQotCX0gd2hpbGUgKHNoID09IE5VTEwpOwotCi0JaWYgKHNoKQotCQlhdG9taWNfaW5jKCZzaC0+Y291bnQpOwotCi0Jc3Bpbl91bmxvY2tfaXJxKCZjb25mLT5kZXZpY2VfbG9jayk7Ci0JcmV0dXJuIHNoOwotfQotCi1zdGF0aWMgaW50IGdyb3dfb25lX3N0cmlwZShyYWlkNl9jb25mX3QgKmNvbmYpCi17Ci0Jc3RydWN0IHN0cmlwZV9oZWFkICpzaDsKLQlzaCA9IGttZW1fY2FjaGVfYWxsb2MoY29uZi0+c2xhYl9jYWNoZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFzaCkKLQkJcmV0dXJuIDA7Ci0JbWVtc2V0KHNoLCAwLCBzaXplb2YoKnNoKSArIChjb25mLT5yYWlkX2Rpc2tzLTEpKnNpemVvZihzdHJ1Y3QgcjVkZXYpKTsKLQlzaC0+cmFpZF9jb25mID0gY29uZjsKLQlzcGluX2xvY2tfaW5pdCgmc2gtPmxvY2spOwotCi0JaWYgKGdyb3dfYnVmZmVycyhzaCwgY29uZi0+cmFpZF9kaXNrcykpIHsKLQkJc2hyaW5rX2J1ZmZlcnMoc2gsIGNvbmYtPnJhaWRfZGlza3MpOwotCQlrbWVtX2NhY2hlX2ZyZWUoY29uZi0+c2xhYl9jYWNoZSwgc2gpOwotCQlyZXR1cm4gMDsKLQl9Ci0JLyogd2UganVzdCBjcmVhdGVkIGFuIGFjdGl2ZSBzdHJpcGUgc28uLi4gKi8KLQlhdG9taWNfc2V0KCZzaC0+Y291bnQsIDEpOwotCWF0b21pY19pbmMoJmNvbmYtPmFjdGl2ZV9zdHJpcGVzKTsKLQlJTklUX0xJU1RfSEVBRCgmc2gtPmxydSk7Ci0JcmVsZWFzZV9zdHJpcGUoc2gpOwotCXJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IGdyb3dfc3RyaXBlcyhyYWlkNl9jb25mX3QgKmNvbmYsIGludCBudW0pCi17Ci0Ja21lbV9jYWNoZV90ICpzYzsKLQlpbnQgZGV2cyA9IGNvbmYtPnJhaWRfZGlza3M7Ci0KLQlzcHJpbnRmKGNvbmYtPmNhY2hlX25hbWVbMF0sICJyYWlkNi8lcyIsIG1kbmFtZShjb25mLT5tZGRldikpOwotCi0Jc2MgPSBrbWVtX2NhY2hlX2NyZWF0ZShjb25mLT5jYWNoZV9uYW1lWzBdLAotCQkJICAgICAgIHNpemVvZihzdHJ1Y3Qgc3RyaXBlX2hlYWQpKyhkZXZzLTEpKnNpemVvZihzdHJ1Y3QgcjVkZXYpLAotCQkJICAgICAgIDAsIDAsIE5VTEwsIE5VTEwpOwotCWlmICghc2MpCi0JCXJldHVybiAxOwotCWNvbmYtPnNsYWJfY2FjaGUgPSBzYzsKLQl3aGlsZSAobnVtLS0pCi0JCWlmICghZ3Jvd19vbmVfc3RyaXBlKGNvbmYpKQotCQkJcmV0dXJuIDE7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZHJvcF9vbmVfc3RyaXBlKHJhaWQ2X2NvbmZfdCAqY29uZikKLXsKLQlzdHJ1Y3Qgc3RyaXBlX2hlYWQgKnNoOwotCXNwaW5fbG9ja19pcnEoJmNvbmYtPmRldmljZV9sb2NrKTsKLQlzaCA9IGdldF9mcmVlX3N0cmlwZShjb25mKTsKLQlzcGluX3VubG9ja19pcnEoJmNvbmYtPmRldmljZV9sb2NrKTsKLQlpZiAoIXNoKQotCQlyZXR1cm4gMDsKLQlCVUdfT04oYXRvbWljX3JlYWQoJnNoLT5jb3VudCkpOwotCXNocmlua19idWZmZXJzKHNoLCBjb25mLT5yYWlkX2Rpc2tzKTsKLQlrbWVtX2NhY2hlX2ZyZWUoY29uZi0+c2xhYl9jYWNoZSwgc2gpOwotCWF0b21pY19kZWMoJmNvbmYtPmFjdGl2ZV9zdHJpcGVzKTsKLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIHZvaWQgc2hyaW5rX3N0cmlwZXMocmFpZDZfY29uZl90ICpjb25mKQotewotCXdoaWxlIChkcm9wX29uZV9zdHJpcGUoY29uZikpCi0JCTsKLQotCWlmIChjb25mLT5zbGFiX2NhY2hlKQotCQlrbWVtX2NhY2hlX2Rlc3Ryb3koY29uZi0+c2xhYl9jYWNoZSk7Ci0JY29uZi0+c2xhYl9jYWNoZSA9IE5VTEw7Ci19Ci0KLXN0YXRpYyBpbnQgcmFpZDZfZW5kX3JlYWRfcmVxdWVzdChzdHJ1Y3QgYmlvICogYmksIHVuc2lnbmVkIGludCBieXRlc19kb25lLAotCQkJCSAgaW50IGVycm9yKQotewotIAlzdHJ1Y3Qgc3RyaXBlX2hlYWQgKnNoID0gYmktPmJpX3ByaXZhdGU7Ci0JcmFpZDZfY29uZl90ICpjb25mID0gc2gtPnJhaWRfY29uZjsKLQlpbnQgZGlza3MgPSBjb25mLT5yYWlkX2Rpc2tzLCBpOwotCWludCB1cHRvZGF0ZSA9IHRlc3RfYml0KEJJT19VUFRPREFURSwgJmJpLT5iaV9mbGFncyk7Ci0KLQlpZiAoYmktPmJpX3NpemUpCi0JCXJldHVybiAxOwotCi0JZm9yIChpPTAgOyBpPGRpc2tzOyBpKyspCi0JCWlmIChiaSA9PSAmc2gtPmRldltpXS5yZXEpCi0JCQlicmVhazsKLQotCVBSSU5USygiZW5kX3JlYWRfcmVxdWVzdCAlbGx1LyVkLCBjb3VudDogJWQsIHVwdG9kYXRlICVkLlxuIiwKLQkJKHVuc2lnbmVkIGxvbmcgbG9uZylzaC0+c2VjdG9yLCBpLCBhdG9taWNfcmVhZCgmc2gtPmNvdW50KSwKLQkJdXB0b2RhdGUpOwotCWlmIChpID09IGRpc2tzKSB7Ci0JCUJVRygpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAodXB0b2RhdGUpIHsKLSNpZiAwCi0JCXN0cnVjdCBiaW8gKmJpbzsKLQkJdW5zaWduZWQgbG9uZyBmbGFnczsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNvbmYtPmRldmljZV9sb2NrLCBmbGFncyk7Ci0JCS8qIHdlIGNhbiByZXR1cm4gYSBidWZmZXIgaWYgd2UgYnlwYXNzZWQgdGhlIGNhY2hlIG9yCi0JCSAqIGlmIHRoZSB0b3AgYnVmZmVyIGlzIG5vdCBpbiBoaWdobWVtLiAgSWYgdGhlcmUgYXJlCi0JCSAqIG11bHRpcGxlIGJ1ZmZlcnMsIGxlYXZlIHRoZSBleHRyYSB3b3JrIHRvCi0JCSAqIGhhbmRsZV9zdHJpcGUKLQkJICovCi0JCWJ1ZmZlciA9IHNoLT5iaF9yZWFkW2ldOwotCQlpZiAoYnVmZmVyICYmCi0JCSAgICAoIVBhZ2VIaWdoTWVtKGJ1ZmZlci0+Yl9wYWdlKQotCQkgICAgIHx8IGJ1ZmZlci0+Yl9wYWdlID09IGJoLT5iX3BhZ2UgKQotCQkJKSB7Ci0JCQlzaC0+YmhfcmVhZFtpXSA9IGJ1ZmZlci0+Yl9yZXFuZXh0OwotCQkJYnVmZmVyLT5iX3JlcW5leHQgPSBOVUxMOwotCQl9IGVsc2UKLQkJCWJ1ZmZlciA9IE5VTEw7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvbmYtPmRldmljZV9sb2NrLCBmbGFncyk7Ci0JCWlmIChzaC0+YmhfcGFnZVtpXT09YmgtPmJfcGFnZSkKLQkJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOwotCQlpZiAoYnVmZmVyKSB7Ci0JCQlpZiAoYnVmZmVyLT5iX3BhZ2UgIT0gYmgtPmJfcGFnZSkKLQkJCQltZW1jcHkoYnVmZmVyLT5iX2RhdGEsIGJoLT5iX2RhdGEsIGJoLT5iX3NpemUpOwotCQkJYnVmZmVyLT5iX2VuZF9pbyhidWZmZXIsIDEpOwotCQl9Ci0jZWxzZQotCQlzZXRfYml0KFI1X1VQVE9EQVRFLCAmc2gtPmRldltpXS5mbGFncyk7Ci0jZW5kaWYKLQkJaWYgKHRlc3RfYml0KFI1X1JlYWRFcnJvciwgJnNoLT5kZXZbaV0uZmxhZ3MpKSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPICJyYWlkNjogcmVhZCBlcnJvciBjb3JyZWN0ZWQhIVxuIik7Ci0JCQljbGVhcl9iaXQoUjVfUmVhZEVycm9yLCAmc2gtPmRldltpXS5mbGFncyk7Ci0JCQljbGVhcl9iaXQoUjVfUmVXcml0ZSwgJnNoLT5kZXZbaV0uZmxhZ3MpOwotCQl9Ci0JCWlmIChhdG9taWNfcmVhZCgmY29uZi0+ZGlza3NbaV0ucmRldi0+cmVhZF9lcnJvcnMpKQotCQkJYXRvbWljX3NldCgmY29uZi0+ZGlza3NbaV0ucmRldi0+cmVhZF9lcnJvcnMsIDApOwotCX0gZWxzZSB7Ci0JCWludCByZXRyeSA9IDA7Ci0JCWNsZWFyX2JpdChSNV9VUFRPREFURSwgJnNoLT5kZXZbaV0uZmxhZ3MpOwotCQlhdG9taWNfaW5jKCZjb25mLT5kaXNrc1tpXS5yZGV2LT5yZWFkX2Vycm9ycyk7Ci0JCWlmIChjb25mLT5tZGRldi0+ZGVncmFkZWQpCi0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJyYWlkNjogcmVhZCBlcnJvciBub3QgY29ycmVjdGFibGUuXG4iKTsKLQkJZWxzZSBpZiAodGVzdF9iaXQoUjVfUmVXcml0ZSwgJnNoLT5kZXZbaV0uZmxhZ3MpKQotCQkJLyogT2gsIG5vISEhICovCi0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJyYWlkNjogcmVhZCBlcnJvciBOT1QgY29ycmVjdGVkISFcbiIpOwotCQllbHNlIGlmIChhdG9taWNfcmVhZCgmY29uZi0+ZGlza3NbaV0ucmRldi0+cmVhZF9lcnJvcnMpCi0JCQkgPiBjb25mLT5tYXhfbnJfc3RyaXBlcykKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJCSAgICAgICAicmFpZDY6IFRvbyBtYW55IHJlYWQgZXJyb3JzLCBmYWlsaW5nIGRldmljZS5cbiIpOwotCQllbHNlCi0JCQlyZXRyeSA9IDE7Ci0JCWlmIChyZXRyeSkKLQkJCXNldF9iaXQoUjVfUmVhZEVycm9yLCAmc2gtPmRldltpXS5mbGFncyk7Ci0JCWVsc2UgewotCQkJY2xlYXJfYml0KFI1X1JlYWRFcnJvciwgJnNoLT5kZXZbaV0uZmxhZ3MpOwotCQkJY2xlYXJfYml0KFI1X1JlV3JpdGUsICZzaC0+ZGV2W2ldLmZsYWdzKTsKLQkJCW1kX2Vycm9yKGNvbmYtPm1kZGV2LCBjb25mLT5kaXNrc1tpXS5yZGV2KTsKLQkJfQotCX0KLQlyZGV2X2RlY19wZW5kaW5nKGNvbmYtPmRpc2tzW2ldLnJkZXYsIGNvbmYtPm1kZGV2KTsKLSNpZiAwCi0JLyogbXVzdCByZXN0b3JlIGJfcGFnZSBiZWZvcmUgdW5sb2NraW5nIGJ1ZmZlci4uLiAqLwotCWlmIChzaC0+YmhfcGFnZVtpXSAhPSBiaC0+Yl9wYWdlKSB7Ci0JCWJoLT5iX3BhZ2UgPSBzaC0+YmhfcGFnZVtpXTsKLQkJYmgtPmJfZGF0YSA9IHBhZ2VfYWRkcmVzcyhiaC0+Yl9wYWdlKTsKLQkJY2xlYXJfYnVmZmVyX3VwdG9kYXRlKGJoKTsKLQl9Ci0jZW5kaWYKLQljbGVhcl9iaXQoUjVfTE9DS0VELCAmc2gtPmRldltpXS5mbGFncyk7Ci0Jc2V0X2JpdChTVFJJUEVfSEFORExFLCAmc2gtPnN0YXRlKTsKLQlyZWxlYXNlX3N0cmlwZShzaCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcmFpZDZfZW5kX3dyaXRlX3JlcXVlc3QgKHN0cnVjdCBiaW8gKmJpLCB1bnNpZ25lZCBpbnQgYnl0ZXNfZG9uZSwKLQkJCQkgICAgaW50IGVycm9yKQotewotIAlzdHJ1Y3Qgc3RyaXBlX2hlYWQgKnNoID0gYmktPmJpX3ByaXZhdGU7Ci0JcmFpZDZfY29uZl90ICpjb25mID0gc2gtPnJhaWRfY29uZjsKLQlpbnQgZGlza3MgPSBjb25mLT5yYWlkX2Rpc2tzLCBpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHVwdG9kYXRlID0gdGVzdF9iaXQoQklPX1VQVE9EQVRFLCAmYmktPmJpX2ZsYWdzKTsKLQotCWlmIChiaS0+Ymlfc2l6ZSkKLQkJcmV0dXJuIDE7Ci0KLQlmb3IgKGk9MCA7IGk8ZGlza3M7IGkrKykKLQkJaWYgKGJpID09ICZzaC0+ZGV2W2ldLnJlcSkKLQkJCWJyZWFrOwotCi0JUFJJTlRLKCJlbmRfd3JpdGVfcmVxdWVzdCAlbGx1LyVkLCBjb3VudCAlZCwgdXB0b2RhdGU6ICVkLlxuIiwKLQkJKHVuc2lnbmVkIGxvbmcgbG9uZylzaC0+c2VjdG9yLCBpLCBhdG9taWNfcmVhZCgmc2gtPmNvdW50KSwKLQkJdXB0b2RhdGUpOwotCWlmIChpID09IGRpc2tzKSB7Ci0JCUJVRygpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY29uZi0+ZGV2aWNlX2xvY2ssIGZsYWdzKTsKLQlpZiAoIXVwdG9kYXRlKQotCQltZF9lcnJvcihjb25mLT5tZGRldiwgY29uZi0+ZGlza3NbaV0ucmRldik7Ci0KLQlyZGV2X2RlY19wZW5kaW5nKGNvbmYtPmRpc2tzW2ldLnJkZXYsIGNvbmYtPm1kZGV2KTsKLQotCWNsZWFyX2JpdChSNV9MT0NLRUQsICZzaC0+ZGV2W2ldLmZsYWdzKTsKLQlzZXRfYml0KFNUUklQRV9IQU5ETEUsICZzaC0+c3RhdGUpOwotCV9fcmVsZWFzZV9zdHJpcGUoY29uZiwgc2gpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvbmYtPmRldmljZV9sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIHNlY3Rvcl90IGNvbXB1dGVfYmxvY2tucihzdHJ1Y3Qgc3RyaXBlX2hlYWQgKnNoLCBpbnQgaSk7Ci0KLXN0YXRpYyB2b2lkIHJhaWQ2X2J1aWxkX2Jsb2NrIChzdHJ1Y3Qgc3RyaXBlX2hlYWQgKnNoLCBpbnQgaSkKLXsKLQlzdHJ1Y3QgcjVkZXYgKmRldiA9ICZzaC0+ZGV2W2ldOwotCWludCBwZF9pZHggPSBzaC0+cGRfaWR4OwotCWludCBxZF9pZHggPSByYWlkNl9uZXh0X2Rpc2socGRfaWR4LCBzaC0+cmFpZF9jb25mLT5yYWlkX2Rpc2tzKTsKLQotCWJpb19pbml0KCZkZXYtPnJlcSk7Ci0JZGV2LT5yZXEuYmlfaW9fdmVjID0gJmRldi0+dmVjOwotCWRldi0+cmVxLmJpX3ZjbnQrKzsKLQlkZXYtPnJlcS5iaV9tYXhfdmVjcysrOwotCWRldi0+dmVjLmJ2X3BhZ2UgPSBkZXYtPnBhZ2U7Ci0JZGV2LT52ZWMuYnZfbGVuID0gU1RSSVBFX1NJWkU7Ci0JZGV2LT52ZWMuYnZfb2Zmc2V0ID0gMDsKLQotCWRldi0+cmVxLmJpX3NlY3RvciA9IHNoLT5zZWN0b3I7Ci0JZGV2LT5yZXEuYmlfcHJpdmF0ZSA9IHNoOwotCi0JZGV2LT5mbGFncyA9IDA7Ci0JaWYgKGkgIT0gcGRfaWR4ICYmIGkgIT0gcWRfaWR4KQotCQlkZXYtPnNlY3RvciA9IGNvbXB1dGVfYmxvY2tucihzaCwgaSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGVycm9yKG1kZGV2X3QgKm1kZGV2LCBtZGtfcmRldl90ICpyZGV2KQotewotCWNoYXIgYltCREVWTkFNRV9TSVpFXTsKLQlyYWlkNl9jb25mX3QgKmNvbmYgPSAocmFpZDZfY29uZl90ICopIG1kZGV2LT5wcml2YXRlOwotCVBSSU5USygicmFpZDY6IGVycm9yIGNhbGxlZFxuIik7Ci0KLQlpZiAoIXRlc3RfYml0KEZhdWx0eSwgJnJkZXYtPmZsYWdzKSkgewotCQltZGRldi0+c2JfZGlydHkgPSAxOwotCQlpZiAodGVzdF9iaXQoSW5fc3luYywgJnJkZXYtPmZsYWdzKSkgewotCQkJY29uZi0+d29ya2luZ19kaXNrcy0tOwotCQkJbWRkZXYtPmRlZ3JhZGVkKys7Ci0JCQljb25mLT5mYWlsZWRfZGlza3MrKzsKLQkJCWNsZWFyX2JpdChJbl9zeW5jLCAmcmRldi0+ZmxhZ3MpOwotCQkJLyoKLQkJCSAqIGlmIHJlY292ZXJ5IHdhcyBydW5uaW5nLCBtYWtlIHN1cmUgaXQgYWJvcnRzLgotCQkJICovCi0JCQlzZXRfYml0KE1EX1JFQ09WRVJZX0VSUiwgJm1kZGV2LT5yZWNvdmVyeSk7Ci0JCX0KLQkJc2V0X2JpdChGYXVsdHksICZyZGV2LT5mbGFncyk7Ci0JCXByaW50ayAoS0VSTl9BTEVSVAotCQkJInJhaWQ2OiBEaXNrIGZhaWx1cmUgb24gJXMsIGRpc2FibGluZyBkZXZpY2UuIgotCQkJIiBPcGVyYXRpb24gY29udGludWluZyBvbiAlZCBkZXZpY2VzXG4iLAotCQkJYmRldm5hbWUocmRldi0+YmRldixiKSwgY29uZi0+d29ya2luZ19kaXNrcyk7Ci0JfQotfQotCi0vKgotICogSW5wdXQ6IGEgJ2JpZycgc2VjdG9yIG51bWJlciwKLSAqIE91dHB1dDogaW5kZXggb2YgdGhlIGRhdGEgYW5kIHBhcml0eSBkaXNrLCBhbmQgdGhlIHNlY3RvciAjIGluIHRoZW0uCi0gKi8KLXN0YXRpYyBzZWN0b3JfdCByYWlkNl9jb21wdXRlX3NlY3RvcihzZWN0b3JfdCByX3NlY3RvciwgdW5zaWduZWQgaW50IHJhaWRfZGlza3MsCi0JCQl1bnNpZ25lZCBpbnQgZGF0YV9kaXNrcywgdW5zaWduZWQgaW50ICogZGRfaWR4LAotCQkJdW5zaWduZWQgaW50ICogcGRfaWR4LCByYWlkNl9jb25mX3QgKmNvbmYpCi17Ci0JbG9uZyBzdHJpcGU7Ci0JdW5zaWduZWQgbG9uZyBjaHVua19udW1iZXI7Ci0JdW5zaWduZWQgaW50IGNodW5rX29mZnNldDsKLQlzZWN0b3JfdCBuZXdfc2VjdG9yOwotCWludCBzZWN0b3JzX3Blcl9jaHVuayA9IGNvbmYtPmNodW5rX3NpemUgPj4gOTsKLQotCS8qIEZpcnN0IGNvbXB1dGUgdGhlIGluZm9ybWF0aW9uIG9uIHRoaXMgc2VjdG9yICovCi0KLQkvKgotCSAqIENvbXB1dGUgdGhlIGNodW5rIG51bWJlciBhbmQgdGhlIHNlY3RvciBvZmZzZXQgaW5zaWRlIHRoZSBjaHVuawotCSAqLwotCWNodW5rX29mZnNldCA9IHNlY3Rvcl9kaXYocl9zZWN0b3IsIHNlY3RvcnNfcGVyX2NodW5rKTsKLQljaHVua19udW1iZXIgPSByX3NlY3RvcjsKLQlpZiAoIHJfc2VjdG9yICE9IGNodW5rX251bWJlciApIHsKLQkJcHJpbnRrKEtFUk5fQ1JJVCAicmFpZDY6IEVSUk9SOiByX3NlY3RvciA9ICVsbHUsIGNodW5rX251bWJlciA9ICVsdVxuIiwKLQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpcl9zZWN0b3IsICh1bnNpZ25lZCBsb25nKWNodW5rX251bWJlcik7Ci0JCUJVRygpOwotCX0KLQotCS8qCi0JICogQ29tcHV0ZSB0aGUgc3RyaXBlIG51bWJlcgotCSAqLwotCXN0cmlwZSA9IGNodW5rX251bWJlciAvIGRhdGFfZGlza3M7Ci0KLQkvKgotCSAqIENvbXB1dGUgdGhlIGRhdGEgZGlzayBhbmQgcGFyaXR5IGRpc2sgaW5kZXhlcyBpbnNpZGUgdGhlIHN0cmlwZQotCSAqLwotCSpkZF9pZHggPSBjaHVua19udW1iZXIgJSBkYXRhX2Rpc2tzOwotCi0JLyoKLQkgKiBTZWxlY3QgdGhlIHBhcml0eSBkaXNrIGJhc2VkIG9uIHRoZSB1c2VyIHNlbGVjdGVkIGFsZ29yaXRobS4KLQkgKi8KLQotCS8qKioqIEZJWCBUSElTICoqKiovCi0Jc3dpdGNoIChjb25mLT5hbGdvcml0aG0pIHsKLQljYXNlIEFMR09SSVRITV9MRUZUX0FTWU1NRVRSSUM6Ci0JCSpwZF9pZHggPSByYWlkX2Rpc2tzIC0gMSAtIChzdHJpcGUgJSByYWlkX2Rpc2tzKTsKLQkJaWYgKCpwZF9pZHggPT0gcmFpZF9kaXNrcy0xKQotCQkgIAkoKmRkX2lkeCkrKzsgCS8qIFEgRCBEIEQgUCAqLwotCQllbHNlIGlmICgqZGRfaWR4ID49ICpwZF9pZHgpCi0JCSAgCSgqZGRfaWR4KSArPSAyOyAvKiBEIEQgUCBRIEQgKi8KLQkJYnJlYWs7Ci0JY2FzZSBBTEdPUklUSE1fUklHSFRfQVNZTU1FVFJJQzoKLQkJKnBkX2lkeCA9IHN0cmlwZSAlIHJhaWRfZGlza3M7Ci0JCWlmICgqcGRfaWR4ID09IHJhaWRfZGlza3MtMSkKLQkJICAJKCpkZF9pZHgpKys7IAkvKiBRIEQgRCBEIFAgKi8KLQkJZWxzZSBpZiAoKmRkX2lkeCA+PSAqcGRfaWR4KQotCQkgIAkoKmRkX2lkeCkgKz0gMjsgLyogRCBEIFAgUSBEICovCi0JCWJyZWFrOwotCWNhc2UgQUxHT1JJVEhNX0xFRlRfU1lNTUVUUklDOgotCQkqcGRfaWR4ID0gcmFpZF9kaXNrcyAtIDEgLSAoc3RyaXBlICUgcmFpZF9kaXNrcyk7Ci0JCSpkZF9pZHggPSAoKnBkX2lkeCArIDIgKyAqZGRfaWR4KSAlIHJhaWRfZGlza3M7Ci0JCWJyZWFrOwotCWNhc2UgQUxHT1JJVEhNX1JJR0hUX1NZTU1FVFJJQzoKLQkJKnBkX2lkeCA9IHN0cmlwZSAlIHJhaWRfZGlza3M7Ci0JCSpkZF9pZHggPSAoKnBkX2lkeCArIDIgKyAqZGRfaWR4KSAlIHJhaWRfZGlza3M7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByaW50ayAoS0VSTl9DUklUICJyYWlkNjogdW5zdXBwb3J0ZWQgYWxnb3JpdGhtICVkXG4iLAotCQkJY29uZi0+YWxnb3JpdGhtKTsKLQl9Ci0KLQlQUklOVEsoInJhaWQ2OiBjaHVua19udW1iZXIgPSAlbHUsIHBkX2lkeCA9ICV1LCBkZF9pZHggPSAldVxuIiwKLQkgICAgICAgY2h1bmtfbnVtYmVyLCAqcGRfaWR4LCAqZGRfaWR4KTsKLQotCS8qCi0JICogRmluYWxseSwgY29tcHV0ZSB0aGUgbmV3IHNlY3RvciBudW1iZXIKLQkgKi8KLQluZXdfc2VjdG9yID0gKHNlY3Rvcl90KSBzdHJpcGUgKiBzZWN0b3JzX3Blcl9jaHVuayArIGNodW5rX29mZnNldDsKLQlyZXR1cm4gbmV3X3NlY3RvcjsKLX0KLQotCi1zdGF0aWMgc2VjdG9yX3QgY29tcHV0ZV9ibG9ja25yKHN0cnVjdCBzdHJpcGVfaGVhZCAqc2gsIGludCBpKQotewotCXJhaWQ2X2NvbmZfdCAqY29uZiA9IHNoLT5yYWlkX2NvbmY7Ci0JaW50IHJhaWRfZGlza3MgPSBjb25mLT5yYWlkX2Rpc2tzLCBkYXRhX2Rpc2tzID0gcmFpZF9kaXNrcyAtIDI7Ci0Jc2VjdG9yX3QgbmV3X3NlY3RvciA9IHNoLT5zZWN0b3IsIGNoZWNrOwotCWludCBzZWN0b3JzX3Blcl9jaHVuayA9IGNvbmYtPmNodW5rX3NpemUgPj4gOTsKLQlzZWN0b3JfdCBzdHJpcGU7Ci0JaW50IGNodW5rX29mZnNldDsKLQlpbnQgY2h1bmtfbnVtYmVyLCBkdW1teTEsIGR1bW15MiwgZGRfaWR4ID0gaTsKLQlzZWN0b3JfdCByX3NlY3RvcjsKLQlpbnQgaTAgPSBpOwotCi0JY2h1bmtfb2Zmc2V0ID0gc2VjdG9yX2RpdihuZXdfc2VjdG9yLCBzZWN0b3JzX3Blcl9jaHVuayk7Ci0Jc3RyaXBlID0gbmV3X3NlY3RvcjsKLQlpZiAoIG5ld19zZWN0b3IgIT0gc3RyaXBlICkgewotCQlwcmludGsoS0VSTl9DUklUICJyYWlkNjogRVJST1I6IG5ld19zZWN0b3IgPSAlbGx1LCBzdHJpcGUgPSAlbHVcbiIsCi0JCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKW5ld19zZWN0b3IsICh1bnNpZ25lZCBsb25nKXN0cmlwZSk7Ci0JCUJVRygpOwotCX0KLQotCXN3aXRjaCAoY29uZi0+YWxnb3JpdGhtKSB7Ci0JCWNhc2UgQUxHT1JJVEhNX0xFRlRfQVNZTU1FVFJJQzoKLQkJY2FzZSBBTEdPUklUSE1fUklHSFRfQVNZTU1FVFJJQzoKLQkJICAJaWYgKHNoLT5wZF9pZHggPT0gcmFpZF9kaXNrcy0xKQotCQkJCWktLTsgCS8qIFEgRCBEIEQgUCAqLwotCQkJZWxzZSBpZiAoaSA+IHNoLT5wZF9pZHgpCi0JCQkJaSAtPSAyOyAvKiBEIEQgUCBRIEQgKi8KLQkJCWJyZWFrOwotCQljYXNlIEFMR09SSVRITV9MRUZUX1NZTU1FVFJJQzoKLQkJY2FzZSBBTEdPUklUSE1fUklHSFRfU1lNTUVUUklDOgotCQkJaWYgKHNoLT5wZF9pZHggPT0gcmFpZF9kaXNrcy0xKQotCQkJCWktLTsgLyogUSBEIEQgRCBQICovCi0JCQllbHNlIHsKLQkJCQkvKiBEIEQgUCBRIEQgKi8KLQkJCQlpZiAoaSA8IHNoLT5wZF9pZHgpCi0JCQkJCWkgKz0gcmFpZF9kaXNrczsKLQkJCQlpIC09IChzaC0+cGRfaWR4ICsgMik7Ci0JCQl9Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXByaW50ayAoS0VSTl9DUklUICJyYWlkNjogdW5zdXBwb3J0ZWQgYWxnb3JpdGhtICVkXG4iLAotCQkJCWNvbmYtPmFsZ29yaXRobSk7Ci0JfQotCi0JUFJJTlRLKCJyYWlkNjogY29tcHV0ZV9ibG9ja25yOiBwZF9pZHggPSAldSwgaTAgPSAldSwgaSA9ICV1XG4iLCBzaC0+cGRfaWR4LCBpMCwgaSk7Ci0KLQljaHVua19udW1iZXIgPSBzdHJpcGUgKiBkYXRhX2Rpc2tzICsgaTsKLQlyX3NlY3RvciA9IChzZWN0b3JfdCljaHVua19udW1iZXIgKiBzZWN0b3JzX3Blcl9jaHVuayArIGNodW5rX29mZnNldDsKLQotCWNoZWNrID0gcmFpZDZfY29tcHV0ZV9zZWN0b3IgKHJfc2VjdG9yLCByYWlkX2Rpc2tzLCBkYXRhX2Rpc2tzLCAmZHVtbXkxLCAmZHVtbXkyLCBjb25mKTsKLQlpZiAoY2hlY2sgIT0gc2gtPnNlY3RvciB8fCBkdW1teTEgIT0gZGRfaWR4IHx8IGR1bW15MiAhPSBzaC0+cGRfaWR4KSB7Ci0JCXByaW50ayhLRVJOX0NSSVQgInJhaWQ2OiBjb21wdXRlX2Jsb2NrbnI6IG1hcCBub3QgY29ycmVjdFxuIik7Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gcl9zZWN0b3I7Ci19Ci0KLQotCi0vKgotICogQ29weSBkYXRhIGJldHdlZW4gYSBwYWdlIGluIHRoZSBzdHJpcGUgY2FjaGUsIGFuZCBvbmUgb3IgbW9yZSBiaW9uCi0gKiBUaGUgcGFnZSBjb3VsZCBhbGlnbiB3aXRoIHRoZSBtaWRkbGUgb2YgdGhlIGJpbywgb3IgdGhlcmUgY291bGQgYmUKLSAqIHNldmVyYWwgYmlvbiwgZWFjaCB3aXRoIHNldmVyYWwgYmlvX3ZlY3MsIHdoaWNoIGNvdmVyIHBhcnQgb2YgdGhlIHBhZ2UKLSAqIE11bHRpcGxlIGJpb24gYXJlIGxpbmtlZCB0b2dldGhlciBvbiBiaV9uZXh0LiAgVGhlcmUgbWF5IGJlIGV4dHJhcwotICogYXQgdGhlIGVuZCBvZiB0aGlzIGxpc3QuICBXZSBpZ25vcmUgdGhlbS4KLSAqLwotc3RhdGljIHZvaWQgY29weV9kYXRhKGludCBmcm9tYmlvLCBzdHJ1Y3QgYmlvICpiaW8sCi0JCSAgICAgc3RydWN0IHBhZ2UgKnBhZ2UsCi0JCSAgICAgc2VjdG9yX3Qgc2VjdG9yKQotewotCWNoYXIgKnBhID0gcGFnZV9hZGRyZXNzKHBhZ2UpOwotCXN0cnVjdCBiaW9fdmVjICpidmw7Ci0JaW50IGk7Ci0JaW50IHBhZ2Vfb2Zmc2V0OwotCi0JaWYgKGJpby0+Ymlfc2VjdG9yID49IHNlY3RvcikKLQkJcGFnZV9vZmZzZXQgPSAoc2lnbmVkKShiaW8tPmJpX3NlY3RvciAtIHNlY3RvcikgKiA1MTI7Ci0JZWxzZQotCQlwYWdlX29mZnNldCA9IChzaWduZWQpKHNlY3RvciAtIGJpby0+Ymlfc2VjdG9yKSAqIC01MTI7Ci0JYmlvX2Zvcl9lYWNoX3NlZ21lbnQoYnZsLCBiaW8sIGkpIHsKLQkJaW50IGxlbiA9IGJpb19pb3ZlY19pZHgoYmlvLGkpLT5idl9sZW47Ci0JCWludCBjbGVuOwotCQlpbnQgYl9vZmZzZXQgPSAwOwotCi0JCWlmIChwYWdlX29mZnNldCA8IDApIHsKLQkJCWJfb2Zmc2V0ID0gLXBhZ2Vfb2Zmc2V0OwotCQkJcGFnZV9vZmZzZXQgKz0gYl9vZmZzZXQ7Ci0JCQlsZW4gLT0gYl9vZmZzZXQ7Ci0JCX0KLQotCQlpZiAobGVuID4gMCAmJiBwYWdlX29mZnNldCArIGxlbiA+IFNUUklQRV9TSVpFKQotCQkJY2xlbiA9IFNUUklQRV9TSVpFIC0gcGFnZV9vZmZzZXQ7Ci0JCWVsc2UgY2xlbiA9IGxlbjsKLQotCQlpZiAoY2xlbiA+IDApIHsKLQkJCWNoYXIgKmJhID0gX19iaW9fa21hcF9hdG9taWMoYmlvLCBpLCBLTV9VU0VSMCk7Ci0JCQlpZiAoZnJvbWJpbykKLQkJCQltZW1jcHkocGErcGFnZV9vZmZzZXQsIGJhK2Jfb2Zmc2V0LCBjbGVuKTsKLQkJCWVsc2UKLQkJCQltZW1jcHkoYmErYl9vZmZzZXQsIHBhK3BhZ2Vfb2Zmc2V0LCBjbGVuKTsKLQkJCV9fYmlvX2t1bm1hcF9hdG9taWMoYmEsIEtNX1VTRVIwKTsKLQkJfQotCQlpZiAoY2xlbiA8IGxlbikgLyogaGl0IGVuZCBvZiBwYWdlICovCi0JCQlicmVhazsKLQkJcGFnZV9vZmZzZXQgKz0gIGxlbjsKLQl9Ci19Ci0KLSNkZWZpbmUgY2hlY2tfeG9yKCkgCWRvIHsgCQkJCQkJXAotCQkJICAgaWYgKGNvdW50ID09IE1BWF9YT1JfQkxPQ0tTKSB7CQlcCi0JCQkJeG9yX2Jsb2NrKGNvdW50LCBTVFJJUEVfU0laRSwgcHRyKTsJXAotCQkJCWNvdW50ID0gMTsJCQkJXAotCQkJICAgfQkJCQkJCVwKLQkJCX0gd2hpbGUoMCkKLQotLyogQ29tcHV0ZSBQIGFuZCBRIHN5bmRyb21lcyAqLwotc3RhdGljIHZvaWQgY29tcHV0ZV9wYXJpdHkoc3RydWN0IHN0cmlwZV9oZWFkICpzaCwgaW50IG1ldGhvZCkKLXsKLQlyYWlkNl9jb25mX3QgKmNvbmYgPSBzaC0+cmFpZF9jb25mOwotCWludCBpLCBwZF9pZHggPSBzaC0+cGRfaWR4LCBxZF9pZHgsIGQwX2lkeCwgZGlza3MgPSBjb25mLT5yYWlkX2Rpc2tzLCBjb3VudDsKLQlzdHJ1Y3QgYmlvICpjaG9zZW47Ci0JLyoqKiogRklYIFRISVM6IFRoaXMgY291bGQgYmUgdmVyeSBiYWQgaWYgZGlza3MgaXMgY2xvc2UgdG8gMjU2ICoqKiovCi0Jdm9pZCAqcHRyc1tkaXNrc107Ci0KLQlxZF9pZHggPSByYWlkNl9uZXh0X2Rpc2socGRfaWR4LCBkaXNrcyk7Ci0JZDBfaWR4ID0gcmFpZDZfbmV4dF9kaXNrKHFkX2lkeCwgZGlza3MpOwotCi0JUFJJTlRLKCJjb21wdXRlX3Bhcml0eSwgc3RyaXBlICVsbHUsIG1ldGhvZCAlZFxuIiwKLQkJKHVuc2lnbmVkIGxvbmcgbG9uZylzaC0+c2VjdG9yLCBtZXRob2QpOwotCi0Jc3dpdGNoKG1ldGhvZCkgewotCWNhc2UgUkVBRF9NT0RJRllfV1JJVEU6Ci0JCUJVRygpOwkJLyogUkVBRF9NT0RJRllfV1JJVEUgTi9BIGZvciBSQUlELTYgKi8KLQljYXNlIFJFQ09OU1RSVUNUX1dSSVRFOgotCQlmb3IgKGk9IGRpc2tzOyBpLS0gOykKLQkJCWlmICggaSAhPSBwZF9pZHggJiYgaSAhPSBxZF9pZHggJiYgc2gtPmRldltpXS50b3dyaXRlICkgewotCQkJCWNob3NlbiA9IHNoLT5kZXZbaV0udG93cml0ZTsKLQkJCQlzaC0+ZGV2W2ldLnRvd3JpdGUgPSBOVUxMOwotCi0JCQkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChSNV9PdmVybGFwLCAmc2gtPmRldltpXS5mbGFncykpCi0JCQkJCXdha2VfdXAoJmNvbmYtPndhaXRfZm9yX292ZXJsYXApOwotCi0JCQkJQlVHX09OKHNoLT5kZXZbaV0ud3JpdHRlbik7Ci0JCQkJc2gtPmRldltpXS53cml0dGVuID0gY2hvc2VuOwotCQkJfQotCQlicmVhazsKLQljYXNlIENIRUNLX1BBUklUWToKLQkJQlVHKCk7CQkvKiBOb3QgaW1wbGVtZW50ZWQgeWV0ICovCi0JfQotCi0JZm9yIChpID0gZGlza3M7IGktLTspCi0JCWlmIChzaC0+ZGV2W2ldLndyaXR0ZW4pIHsKLQkJCXNlY3Rvcl90IHNlY3RvciA9IHNoLT5kZXZbaV0uc2VjdG9yOwotCQkJc3RydWN0IGJpbyAqd2JpID0gc2gtPmRldltpXS53cml0dGVuOwotCQkJd2hpbGUgKHdiaSAmJiB3YmktPmJpX3NlY3RvciA8IHNlY3RvciArIFNUUklQRV9TRUNUT1JTKSB7Ci0JCQkJY29weV9kYXRhKDEsIHdiaSwgc2gtPmRldltpXS5wYWdlLCBzZWN0b3IpOwotCQkJCXdiaSA9IHI1X25leHRfYmlvKHdiaSwgc2VjdG9yKTsKLQkJCX0KLQotCQkJc2V0X2JpdChSNV9MT0NLRUQsICZzaC0+ZGV2W2ldLmZsYWdzKTsKLQkJCXNldF9iaXQoUjVfVVBUT0RBVEUsICZzaC0+ZGV2W2ldLmZsYWdzKTsKLQkJfQotCi0vLwlzd2l0Y2gobWV0aG9kKSB7Ci0vLwljYXNlIFJFQ09OU1RSVUNUX1dSSVRFOgotLy8JY2FzZSBDSEVDS19QQVJJVFk6Ci0vLwljYXNlIFVQREFURV9QQVJJVFk6Ci0JCS8qIE5vdGUgdGhhdCB1bmxpa2UgUkFJRC01LCB0aGUgb3JkZXJpbmcgb2YgdGhlIGRpc2tzIG1hdHRlcnMgZ3JlYXRseS4gKi8KLQkJLyogRklYOiBJcyB0aGlzIG9yZGVyaW5nIG9mIGRyaXZlcyBldmVuIHJlbW90ZWx5IG9wdGltYWw/ICovCi0JCWNvdW50ID0gMDsKLQkJaSA9IGQwX2lkeDsKLQkJZG8gewotCQkJcHRyc1tjb3VudCsrXSA9IHBhZ2VfYWRkcmVzcyhzaC0+ZGV2W2ldLnBhZ2UpOwotCQkJaWYgKGNvdW50IDw9IGRpc2tzLTIgJiYgIXRlc3RfYml0KFI1X1VQVE9EQVRFLCAmc2gtPmRldltpXS5mbGFncykpCi0JCQkJcHJpbnRrKCJibG9jayAlZC8lZCBub3QgdXB0b2RhdGUgb24gcGFyaXR5IGNhbGNcbiIsIGksY291bnQpOwotCQkJaSA9IHJhaWQ2X25leHRfZGlzayhpLCBkaXNrcyk7Ci0JCX0gd2hpbGUgKCBpICE9IGQwX2lkeCApOwotLy8JCWJyZWFrOwotLy8JfQotCi0JcmFpZDZfY2FsbC5nZW5fc3luZHJvbWUoZGlza3MsIFNUUklQRV9TSVpFLCBwdHJzKTsKLQotCXN3aXRjaChtZXRob2QpIHsKLQljYXNlIFJFQ09OU1RSVUNUX1dSSVRFOgotCQlzZXRfYml0KFI1X1VQVE9EQVRFLCAmc2gtPmRldltwZF9pZHhdLmZsYWdzKTsKLQkJc2V0X2JpdChSNV9VUFRPREFURSwgJnNoLT5kZXZbcWRfaWR4XS5mbGFncyk7Ci0JCXNldF9iaXQoUjVfTE9DS0VELCAgICZzaC0+ZGV2W3BkX2lkeF0uZmxhZ3MpOwotCQlzZXRfYml0KFI1X0xPQ0tFRCwgICAmc2gtPmRldltxZF9pZHhdLmZsYWdzKTsKLQkJYnJlYWs7Ci0JY2FzZSBVUERBVEVfUEFSSVRZOgotCQlzZXRfYml0KFI1X1VQVE9EQVRFLCAmc2gtPmRldltwZF9pZHhdLmZsYWdzKTsKLQkJc2V0X2JpdChSNV9VUFRPREFURSwgJnNoLT5kZXZbcWRfaWR4XS5mbGFncyk7Ci0JCWJyZWFrOwotCX0KLX0KLQotLyogQ29tcHV0ZSBvbmUgbWlzc2luZyBibG9jayAqLwotc3RhdGljIHZvaWQgY29tcHV0ZV9ibG9ja18xKHN0cnVjdCBzdHJpcGVfaGVhZCAqc2gsIGludCBkZF9pZHgsIGludCBub3plcm8pCi17Ci0JcmFpZDZfY29uZl90ICpjb25mID0gc2gtPnJhaWRfY29uZjsKLQlpbnQgaSwgY291bnQsIGRpc2tzID0gY29uZi0+cmFpZF9kaXNrczsKLQl2b2lkICpwdHJbTUFYX1hPUl9CTE9DS1NdLCAqcDsKLQlpbnQgcGRfaWR4ID0gc2gtPnBkX2lkeDsKLQlpbnQgcWRfaWR4ID0gcmFpZDZfbmV4dF9kaXNrKHBkX2lkeCwgZGlza3MpOwotCi0JUFJJTlRLKCJjb21wdXRlX2Jsb2NrXzEsIHN0cmlwZSAlbGx1LCBpZHggJWRcbiIsCi0JCSh1bnNpZ25lZCBsb25nIGxvbmcpc2gtPnNlY3RvciwgZGRfaWR4KTsKLQotCWlmICggZGRfaWR4ID09IHFkX2lkeCApIHsKLQkJLyogV2UncmUgYWN0dWFsbHkgY29tcHV0aW5nIHRoZSBRIGRyaXZlICovCi0JCWNvbXB1dGVfcGFyaXR5KHNoLCBVUERBVEVfUEFSSVRZKTsKLQl9IGVsc2UgewotCQlwdHJbMF0gPSBwYWdlX2FkZHJlc3Moc2gtPmRldltkZF9pZHhdLnBhZ2UpOwotCQlpZiAoIW5vemVybykgbWVtc2V0KHB0clswXSwgMCwgU1RSSVBFX1NJWkUpOwotCQljb3VudCA9IDE7Ci0JCWZvciAoaSA9IGRpc2tzIDsgaS0tOyApIHsKLQkJCWlmIChpID09IGRkX2lkeCB8fCBpID09IHFkX2lkeCkKLQkJCQljb250aW51ZTsKLQkJCXAgPSBwYWdlX2FkZHJlc3Moc2gtPmRldltpXS5wYWdlKTsKLQkJCWlmICh0ZXN0X2JpdChSNV9VUFRPREFURSwgJnNoLT5kZXZbaV0uZmxhZ3MpKQotCQkJCXB0cltjb3VudCsrXSA9IHA7Ci0JCQllbHNlCi0JCQkJcHJpbnRrKCJjb21wdXRlX2Jsb2NrKCkgJWQsIHN0cmlwZSAlbGx1LCAlZCIKLQkJCQkgICAgICAgIiBub3QgcHJlc2VudFxuIiwgZGRfaWR4LAotCQkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXNoLT5zZWN0b3IsIGkpOwotCi0JCQljaGVja194b3IoKTsKLQkJfQotCQlpZiAoY291bnQgIT0gMSkKLQkJCXhvcl9ibG9jayhjb3VudCwgU1RSSVBFX1NJWkUsIHB0cik7Ci0JCWlmICghbm96ZXJvKSBzZXRfYml0KFI1X1VQVE9EQVRFLCAmc2gtPmRldltkZF9pZHhdLmZsYWdzKTsKLQkJZWxzZSBjbGVhcl9iaXQoUjVfVVBUT0RBVEUsICZzaC0+ZGV2W2RkX2lkeF0uZmxhZ3MpOwotCX0KLX0KLQotLyogQ29tcHV0ZSB0d28gbWlzc2luZyBibG9ja3MgKi8KLXN0YXRpYyB2b2lkIGNvbXB1dGVfYmxvY2tfMihzdHJ1Y3Qgc3RyaXBlX2hlYWQgKnNoLCBpbnQgZGRfaWR4MSwgaW50IGRkX2lkeDIpCi17Ci0JcmFpZDZfY29uZl90ICpjb25mID0gc2gtPnJhaWRfY29uZjsKLQlpbnQgaSwgY291bnQsIGRpc2tzID0gY29uZi0+cmFpZF9kaXNrczsKLQlpbnQgcGRfaWR4ID0gc2gtPnBkX2lkeDsKLQlpbnQgcWRfaWR4ID0gcmFpZDZfbmV4dF9kaXNrKHBkX2lkeCwgZGlza3MpOwotCWludCBkMF9pZHggPSByYWlkNl9uZXh0X2Rpc2socWRfaWR4LCBkaXNrcyk7Ci0JaW50IGZhaWxhLCBmYWlsYjsKLQotCS8qIGZhaWxhIGFuZCBmYWlsYiBhcmUgZGlzayBudW1iZXJzIHJlbGF0aXZlIHRvIGQwX2lkeCAqLwotCS8qIHBkX2lkeCBiZWNvbWUgZGlza3MtMiBhbmQgcWRfaWR4IGJlY29tZSBkaXNrcy0xICovCi0JZmFpbGEgPSAoZGRfaWR4MSA8IGQwX2lkeCkgPyBkZF9pZHgxKyhkaXNrcy1kMF9pZHgpIDogZGRfaWR4MS1kMF9pZHg7Ci0JZmFpbGIgPSAoZGRfaWR4MiA8IGQwX2lkeCkgPyBkZF9pZHgyKyhkaXNrcy1kMF9pZHgpIDogZGRfaWR4Mi1kMF9pZHg7Ci0KLQlCVUdfT04oZmFpbGEgPT0gZmFpbGIpOwotCWlmICggZmFpbGIgPCBmYWlsYSApIHsgaW50IHRtcCA9IGZhaWxhOyBmYWlsYSA9IGZhaWxiOyBmYWlsYiA9IHRtcDsgfQotCi0JUFJJTlRLKCJjb21wdXRlX2Jsb2NrXzIsIHN0cmlwZSAlbGx1LCBpZHggJWQsJWQgKCVkLCVkKVxuIiwKLQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylzaC0+c2VjdG9yLCBkZF9pZHgxLCBkZF9pZHgyLCBmYWlsYSwgZmFpbGIpOwotCi0JaWYgKCBmYWlsYiA9PSBkaXNrcy0xICkgewotCQkvKiBRIGRpc2sgaXMgb25lIG9mIHRoZSBtaXNzaW5nIGRpc2tzICovCi0JCWlmICggZmFpbGEgPT0gZGlza3MtMiApIHsKLQkJCS8qIE1pc3NpbmcgUCtRLCBqdXN0IHJlY29tcHV0ZSAqLwotCQkJY29tcHV0ZV9wYXJpdHkoc2gsIFVQREFURV9QQVJJVFkpOwotCQkJcmV0dXJuOwotCQl9IGVsc2UgewotCQkJLyogV2UncmUgbWlzc2luZyBEK1E7IHJlY29tcHV0ZSBEIGZyb20gUCAqLwotCQkJY29tcHV0ZV9ibG9ja18xKHNoLCAoZGRfaWR4MSA9PSBxZF9pZHgpID8gZGRfaWR4MiA6IGRkX2lkeDEsIDApOwotCQkJY29tcHV0ZV9wYXJpdHkoc2gsIFVQREFURV9QQVJJVFkpOyAvKiBJcyB0aGlzIG5lY2Vzc2FyeT8gKi8KLQkJCXJldHVybjsKLQkJfQotCX0KLQotCS8qIFdlJ3JlIG1pc3NpbmcgRCtQIG9yIEQrRDsgYnVpbGQgcG9pbnRlciB0YWJsZSAqLwotCXsKLQkJLyoqKiogRklYIFRISVM6IFRoaXMgY291bGQgYmUgdmVyeSBiYWQgaWYgZGlza3MgaXMgY2xvc2UgdG8gMjU2ICoqKiovCi0JCXZvaWQgKnB0cnNbZGlza3NdOwotCi0JCWNvdW50ID0gMDsKLQkJaSA9IGQwX2lkeDsKLQkJZG8gewotCQkJcHRyc1tjb3VudCsrXSA9IHBhZ2VfYWRkcmVzcyhzaC0+ZGV2W2ldLnBhZ2UpOwotCQkJaSA9IHJhaWQ2X25leHRfZGlzayhpLCBkaXNrcyk7Ci0JCQlpZiAoaSAhPSBkZF9pZHgxICYmIGkgIT0gZGRfaWR4MiAmJgotCQkJICAgICF0ZXN0X2JpdChSNV9VUFRPREFURSwgJnNoLT5kZXZbaV0uZmxhZ3MpKQotCQkJCXByaW50aygiY29tcHV0ZV8yIHdpdGggbWlzc2luZyBibG9jayAlZC8lZFxuIiwgY291bnQsIGkpOwotCQl9IHdoaWxlICggaSAhPSBkMF9pZHggKTsKLQotCQlpZiAoIGZhaWxiID09IGRpc2tzLTIgKSB7Ci0JCQkvKiBXZSdyZSBtaXNzaW5nIEQrUC4gKi8KLQkJCXJhaWQ2X2RhdGFwX3JlY292KGRpc2tzLCBTVFJJUEVfU0laRSwgZmFpbGEsIHB0cnMpOwotCQl9IGVsc2UgewotCQkJLyogV2UncmUgbWlzc2luZyBEK0QuICovCi0JCQlyYWlkNl8yZGF0YV9yZWNvdihkaXNrcywgU1RSSVBFX1NJWkUsIGZhaWxhLCBmYWlsYiwgcHRycyk7Ci0JCX0KLQotCQkvKiBCb3RoIHRoZSBhYm92ZSB1cGRhdGUgYm90aCBtaXNzaW5nIGJsb2NrcyAqLwotCQlzZXRfYml0KFI1X1VQVE9EQVRFLCAmc2gtPmRldltkZF9pZHgxXS5mbGFncyk7Ci0JCXNldF9iaXQoUjVfVVBUT0RBVEUsICZzaC0+ZGV2W2RkX2lkeDJdLmZsYWdzKTsKLQl9Ci19Ci0KLQotLyoKLSAqIEVhY2ggc3RyaXBlL2RldiBjYW4gaGF2ZSBvbmUgb3IgbW9yZSBiaW9uIGF0dGFjaGVkLgotICogdG9yZWFkL3Rvd3JpdGUgcG9pbnQgdG8gdGhlIGZpcnN0IGluIGEgY2hhaW4uCi0gKiBUaGUgYmlfbmV4dCBjaGFpbiBtdXN0IGJlIGluIG9yZGVyLgotICovCi1zdGF0aWMgaW50IGFkZF9zdHJpcGVfYmlvKHN0cnVjdCBzdHJpcGVfaGVhZCAqc2gsIHN0cnVjdCBiaW8gKmJpLCBpbnQgZGRfaWR4LCBpbnQgZm9yd3JpdGUpCi17Ci0Jc3RydWN0IGJpbyAqKmJpcDsKLQlyYWlkNl9jb25mX3QgKmNvbmYgPSBzaC0+cmFpZF9jb25mOwotCWludCBmaXJzdHdyaXRlPTA7Ci0KLQlQUklOVEsoImFkZGluZyBiaCBiIyVsbHUgdG8gc3RyaXBlIHMjJWxsdVxuIiwKLQkJKHVuc2lnbmVkIGxvbmcgbG9uZyliaS0+Ymlfc2VjdG9yLAotCQkodW5zaWduZWQgbG9uZyBsb25nKXNoLT5zZWN0b3IpOwotCi0KLQlzcGluX2xvY2soJnNoLT5sb2NrKTsKLQlzcGluX2xvY2tfaXJxKCZjb25mLT5kZXZpY2VfbG9jayk7Ci0JaWYgKGZvcndyaXRlKSB7Ci0JCWJpcCA9ICZzaC0+ZGV2W2RkX2lkeF0udG93cml0ZTsKLQkJaWYgKCpiaXAgPT0gTlVMTCAmJiBzaC0+ZGV2W2RkX2lkeF0ud3JpdHRlbiA9PSBOVUxMKQotCQkJZmlyc3R3cml0ZSA9IDE7Ci0JfSBlbHNlCi0JCWJpcCA9ICZzaC0+ZGV2W2RkX2lkeF0udG9yZWFkOwotCXdoaWxlICgqYmlwICYmICgqYmlwKS0+Ymlfc2VjdG9yIDwgYmktPmJpX3NlY3RvcikgewotCQlpZiAoKCpiaXApLT5iaV9zZWN0b3IgKyAoKCpiaXApLT5iaV9zaXplID4+IDkpID4gYmktPmJpX3NlY3RvcikKLQkJCWdvdG8gb3ZlcmxhcDsKLQkJYmlwID0gJigqYmlwKS0+YmlfbmV4dDsKLQl9Ci0JaWYgKCpiaXAgJiYgKCpiaXApLT5iaV9zZWN0b3IgPCBiaS0+Ymlfc2VjdG9yICsgKChiaS0+Ymlfc2l6ZSk+PjkpKQotCQlnb3RvIG92ZXJsYXA7Ci0KLQlCVUdfT04oKmJpcCAmJiBiaS0+YmlfbmV4dCAmJiAoKmJpcCkgIT0gYmktPmJpX25leHQpOwotCWlmICgqYmlwKQotCQliaS0+YmlfbmV4dCA9ICpiaXA7Ci0JKmJpcCA9IGJpOwotCWJpLT5iaV9waHlzX3NlZ21lbnRzICsrOwotCXNwaW5fdW5sb2NrX2lycSgmY29uZi0+ZGV2aWNlX2xvY2spOwotCXNwaW5fdW5sb2NrKCZzaC0+bG9jayk7Ci0KLQlQUklOVEsoImFkZGVkIGJpIGIjJWxsdSB0byBzdHJpcGUgcyMlbGx1LCBkaXNrICVkLlxuIiwKLQkJKHVuc2lnbmVkIGxvbmcgbG9uZyliaS0+Ymlfc2VjdG9yLAotCQkodW5zaWduZWQgbG9uZyBsb25nKXNoLT5zZWN0b3IsIGRkX2lkeCk7Ci0KLQlpZiAoY29uZi0+bWRkZXYtPmJpdG1hcCAmJiBmaXJzdHdyaXRlKSB7Ci0JCXNoLT5ibV9zZXEgPSBjb25mLT5zZXFfd3JpdGU7Ci0JCWJpdG1hcF9zdGFydHdyaXRlKGNvbmYtPm1kZGV2LT5iaXRtYXAsIHNoLT5zZWN0b3IsCi0JCQkJICBTVFJJUEVfU0VDVE9SUywgMCk7Ci0JCXNldF9iaXQoU1RSSVBFX0JJVF9ERUxBWSwgJnNoLT5zdGF0ZSk7Ci0JfQotCi0JaWYgKGZvcndyaXRlKSB7Ci0JCS8qIGNoZWNrIGlmIHBhZ2UgaXMgY292ZXJlZCAqLwotCQlzZWN0b3JfdCBzZWN0b3IgPSBzaC0+ZGV2W2RkX2lkeF0uc2VjdG9yOwotCQlmb3IgKGJpPXNoLT5kZXZbZGRfaWR4XS50b3dyaXRlOwotCQkgICAgIHNlY3RvciA8IHNoLT5kZXZbZGRfaWR4XS5zZWN0b3IgKyBTVFJJUEVfU0VDVE9SUyAmJgotCQkJICAgICBiaSAmJiBiaS0+Ymlfc2VjdG9yIDw9IHNlY3RvcjsKLQkJICAgICBiaSA9IHI1X25leHRfYmlvKGJpLCBzaC0+ZGV2W2RkX2lkeF0uc2VjdG9yKSkgewotCQkJaWYgKGJpLT5iaV9zZWN0b3IgKyAoYmktPmJpX3NpemU+PjkpID49IHNlY3RvcikKLQkJCQlzZWN0b3IgPSBiaS0+Ymlfc2VjdG9yICsgKGJpLT5iaV9zaXplPj45KTsKLQkJfQotCQlpZiAoc2VjdG9yID49IHNoLT5kZXZbZGRfaWR4XS5zZWN0b3IgKyBTVFJJUEVfU0VDVE9SUykKLQkJCXNldF9iaXQoUjVfT1ZFUldSSVRFLCAmc2gtPmRldltkZF9pZHhdLmZsYWdzKTsKLQl9Ci0JcmV0dXJuIDE7Ci0KLSBvdmVybGFwOgotCXNldF9iaXQoUjVfT3ZlcmxhcCwgJnNoLT5kZXZbZGRfaWR4XS5mbGFncyk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZjb25mLT5kZXZpY2VfbG9jayk7Ci0Jc3Bpbl91bmxvY2soJnNoLT5sb2NrKTsKLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgaW50IHBhZ2VfaXNfemVybyhzdHJ1Y3QgcGFnZSAqcCkKLXsKLQljaGFyICphID0gcGFnZV9hZGRyZXNzKHApOwotCXJldHVybiAoKCoodTMyKilhKSA9PSAwICYmCi0JCW1lbWNtcChhLCBhKzQsIFNUUklQRV9TSVpFLTQpPT0wKTsKLX0KLS8qCi0gKiBoYW5kbGVfc3RyaXBlIC0gZG8gdGhpbmdzIHRvIGEgc3RyaXBlLgotICoKLSAqIFdlIGxvY2sgdGhlIHN0cmlwZSBhbmQgdGhlbiBleGFtaW5lIHRoZSBzdGF0ZSBvZiB2YXJpb3VzIGJpdHMKLSAqIHRvIHNlZSB3aGF0IG5lZWRzIHRvIGJlIGRvbmUuCi0gKiBQb3NzaWJsZSByZXN1bHRzOgotICogICAgcmV0dXJuIHNvbWUgcmVhZCByZXF1ZXN0IHdoaWNoIG5vdyBoYXZlIGRhdGEKLSAqICAgIHJldHVybiBzb21lIHdyaXRlIHJlcXVlc3RzIHdoaWNoIGFyZSBzYWZlbHkgb24gZGlzYwotICogICAgc2NoZWR1bGUgYSByZWFkIG9uIHNvbWUgYnVmZmVycwotICogICAgc2NoZWR1bGUgYSB3cml0ZSBvZiBzb21lIGJ1ZmZlcnMKLSAqICAgIHJldHVybiBjb25maXJtYXRpb24gb2YgcGFyaXR5IGNvcnJlY3RuZXNzCi0gKgotICogUGFyaXR5IGNhbGN1bGF0aW9ucyBhcmUgZG9uZSBpbnNpZGUgdGhlIHN0cmlwZSBsb2NrCi0gKiBidWZmZXJzIGFyZSB0YWtlbiBvZmYgcmVhZF9saXN0IG9yIHdyaXRlX2xpc3QsIGFuZCBiaF9jYWNoZSBidWZmZXJzCi0gKiBnZXQgQkhfTG9jayBzZXQgYmVmb3JlIHRoZSBzdHJpcGUgbG9jayBpcyByZWxlYXNlZC4KLSAqCi0gKi8KLQotc3RhdGljIHZvaWQgaGFuZGxlX3N0cmlwZShzdHJ1Y3Qgc3RyaXBlX2hlYWQgKnNoLCBzdHJ1Y3QgcGFnZSAqdG1wX3BhZ2UpCi17Ci0JcmFpZDZfY29uZl90ICpjb25mID0gc2gtPnJhaWRfY29uZjsKLQlpbnQgZGlza3MgPSBjb25mLT5yYWlkX2Rpc2tzOwotCXN0cnVjdCBiaW8gKnJldHVybl9iaT0gTlVMTDsKLQlzdHJ1Y3QgYmlvICpiaTsKLQlpbnQgaTsKLQlpbnQgc3luY2luZzsKLQlpbnQgbG9ja2VkPTAsIHVwdG9kYXRlPTAsIHRvX3JlYWQ9MCwgdG9fd3JpdGU9MCwgZmFpbGVkPTAsIHdyaXR0ZW49MDsKLQlpbnQgbm9uX292ZXJ3cml0ZSA9IDA7Ci0JaW50IGZhaWxlZF9udW1bMl0gPSB7MCwgMH07Ci0Jc3RydWN0IHI1ZGV2ICpkZXYsICpwZGV2LCAqcWRldjsKLQlpbnQgcGRfaWR4ID0gc2gtPnBkX2lkeDsKLQlpbnQgcWRfaWR4ID0gcmFpZDZfbmV4dF9kaXNrKHBkX2lkeCwgZGlza3MpOwotCWludCBwX2ZhaWxlZCwgcV9mYWlsZWQ7Ci0KLQlQUklOVEsoImhhbmRsaW5nIHN0cmlwZSAlbGx1LCBzdGF0ZT0lI2x4IGNudD0lZCwgcGRfaWR4PSVkLCBxZF9pZHg9JWRcbiIsCi0JICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpc2gtPnNlY3Rvciwgc2gtPnN0YXRlLCBhdG9taWNfcmVhZCgmc2gtPmNvdW50KSwKLQkgICAgICAgcGRfaWR4LCBxZF9pZHgpOwotCi0Jc3Bpbl9sb2NrKCZzaC0+bG9jayk7Ci0JY2xlYXJfYml0KFNUUklQRV9IQU5ETEUsICZzaC0+c3RhdGUpOwotCWNsZWFyX2JpdChTVFJJUEVfREVMQVlFRCwgJnNoLT5zdGF0ZSk7Ci0KLQlzeW5jaW5nID0gdGVzdF9iaXQoU1RSSVBFX1NZTkNJTkcsICZzaC0+c3RhdGUpOwotCS8qIE5vdyB0byBsb29rIGFyb3VuZCBhbmQgc2VlIHdoYXQgY2FuIGJlIGRvbmUgKi8KLQotCXJjdV9yZWFkX2xvY2soKTsKLQlmb3IgKGk9ZGlza3M7IGktLTsgKSB7Ci0JCW1ka19yZGV2X3QgKnJkZXY7Ci0JCWRldiA9ICZzaC0+ZGV2W2ldOwotCQljbGVhcl9iaXQoUjVfSW5zeW5jLCAmZGV2LT5mbGFncyk7Ci0KLQkJUFJJTlRLKCJjaGVjayAlZDogc3RhdGUgMHglbHggcmVhZCAlcCB3cml0ZSAlcCB3cml0dGVuICVwXG4iLAotCQkJaSwgZGV2LT5mbGFncywgZGV2LT50b3JlYWQsIGRldi0+dG93cml0ZSwgZGV2LT53cml0dGVuKTsKLQkJLyogbWF5YmUgd2UgY2FuIHJlcGx5IHRvIGEgcmVhZCAqLwotCQlpZiAodGVzdF9iaXQoUjVfVVBUT0RBVEUsICZkZXYtPmZsYWdzKSAmJiBkZXYtPnRvcmVhZCkgewotCQkJc3RydWN0IGJpbyAqcmJpLCAqcmJpMjsKLQkJCVBSSU5USygiUmV0dXJuIHJlYWQgZm9yIGRpc2MgJWRcbiIsIGkpOwotCQkJc3Bpbl9sb2NrX2lycSgmY29uZi0+ZGV2aWNlX2xvY2spOwotCQkJcmJpID0gZGV2LT50b3JlYWQ7Ci0JCQlkZXYtPnRvcmVhZCA9IE5VTEw7Ci0JCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFI1X092ZXJsYXAsICZkZXYtPmZsYWdzKSkKLQkJCQl3YWtlX3VwKCZjb25mLT53YWl0X2Zvcl9vdmVybGFwKTsKLQkJCXNwaW5fdW5sb2NrX2lycSgmY29uZi0+ZGV2aWNlX2xvY2spOwotCQkJd2hpbGUgKHJiaSAmJiByYmktPmJpX3NlY3RvciA8IGRldi0+c2VjdG9yICsgU1RSSVBFX1NFQ1RPUlMpIHsKLQkJCQljb3B5X2RhdGEoMCwgcmJpLCBkZXYtPnBhZ2UsIGRldi0+c2VjdG9yKTsKLQkJCQlyYmkyID0gcjVfbmV4dF9iaW8ocmJpLCBkZXYtPnNlY3Rvcik7Ci0JCQkJc3Bpbl9sb2NrX2lycSgmY29uZi0+ZGV2aWNlX2xvY2spOwotCQkJCWlmICgtLXJiaS0+YmlfcGh5c19zZWdtZW50cyA9PSAwKSB7Ci0JCQkJCXJiaS0+YmlfbmV4dCA9IHJldHVybl9iaTsKLQkJCQkJcmV0dXJuX2JpID0gcmJpOwotCQkJCX0KLQkJCQlzcGluX3VubG9ja19pcnEoJmNvbmYtPmRldmljZV9sb2NrKTsKLQkJCQlyYmkgPSByYmkyOwotCQkJfQotCQl9Ci0KLQkJLyogbm93IGNvdW50IHNvbWUgdGhpbmdzICovCi0JCWlmICh0ZXN0X2JpdChSNV9MT0NLRUQsICZkZXYtPmZsYWdzKSkgbG9ja2VkKys7Ci0JCWlmICh0ZXN0X2JpdChSNV9VUFRPREFURSwgJmRldi0+ZmxhZ3MpKSB1cHRvZGF0ZSsrOwotCi0KLQkJaWYgKGRldi0+dG9yZWFkKSB0b19yZWFkKys7Ci0JCWlmIChkZXYtPnRvd3JpdGUpIHsKLQkJCXRvX3dyaXRlKys7Ci0JCQlpZiAoIXRlc3RfYml0KFI1X09WRVJXUklURSwgJmRldi0+ZmxhZ3MpKQotCQkJCW5vbl9vdmVyd3JpdGUrKzsKLQkJfQotCQlpZiAoZGV2LT53cml0dGVuKSB3cml0dGVuKys7Ci0JCXJkZXYgPSByY3VfZGVyZWZlcmVuY2UoY29uZi0+ZGlza3NbaV0ucmRldik7Ci0JCWlmICghcmRldiB8fCAhdGVzdF9iaXQoSW5fc3luYywgJnJkZXYtPmZsYWdzKSkgewotCQkJLyogVGhlIFJlYWRFcnJvciBmbGFnIHdpbGwganVzdCBiZSBjb25mdXNpbmcgbm93ICovCi0JCQljbGVhcl9iaXQoUjVfUmVhZEVycm9yLCAmZGV2LT5mbGFncyk7Ci0JCQljbGVhcl9iaXQoUjVfUmVXcml0ZSwgJmRldi0+ZmxhZ3MpOwotCQl9Ci0JCWlmICghcmRldiB8fCAhdGVzdF9iaXQoSW5fc3luYywgJnJkZXYtPmZsYWdzKQotCQkgICAgfHwgdGVzdF9iaXQoUjVfUmVhZEVycm9yLCAmZGV2LT5mbGFncykpIHsKLQkJCWlmICggZmFpbGVkIDwgMiApCi0JCQkJZmFpbGVkX251bVtmYWlsZWRdID0gaTsKLQkJCWZhaWxlZCsrOwotCQl9IGVsc2UKLQkJCXNldF9iaXQoUjVfSW5zeW5jLCAmZGV2LT5mbGFncyk7Ci0JfQotCXJjdV9yZWFkX3VubG9jaygpOwotCVBSSU5USygibG9ja2VkPSVkIHVwdG9kYXRlPSVkIHRvX3JlYWQ9JWQiCi0JICAgICAgICIgdG9fd3JpdGU9JWQgZmFpbGVkPSVkIGZhaWxlZF9udW09JWQsJWRcbiIsCi0JICAgICAgIGxvY2tlZCwgdXB0b2RhdGUsIHRvX3JlYWQsIHRvX3dyaXRlLCBmYWlsZWQsCi0JICAgICAgIGZhaWxlZF9udW1bMF0sIGZhaWxlZF9udW1bMV0pOwotCS8qIGNoZWNrIGlmIHRoZSBhcnJheSBoYXMgbG9zdCA+MiBkZXZpY2VzIGFuZCwgaWYgc28sIHNvbWUgcmVxdWVzdHMgbWlnaHQKLQkgKiBuZWVkIHRvIGJlIGZhaWxlZAotCSAqLwotCWlmIChmYWlsZWQgPiAyICYmIHRvX3JlYWQrdG9fd3JpdGUrd3JpdHRlbikgewotCQlmb3IgKGk9ZGlza3M7IGktLTsgKSB7Ci0JCQlpbnQgYml0bWFwX2VuZCA9IDA7Ci0KLQkJCWlmICh0ZXN0X2JpdChSNV9SZWFkRXJyb3IsICZzaC0+ZGV2W2ldLmZsYWdzKSkgewotCQkJCW1ka19yZGV2X3QgKnJkZXY7Ci0JCQkJcmN1X3JlYWRfbG9jaygpOwotCQkJCXJkZXYgPSByY3VfZGVyZWZlcmVuY2UoY29uZi0+ZGlza3NbaV0ucmRldik7Ci0JCQkJaWYgKHJkZXYgJiYgdGVzdF9iaXQoSW5fc3luYywgJnJkZXYtPmZsYWdzKSkKLQkJCQkJLyogbXVsdGlwbGUgcmVhZCBmYWlsdXJlcyBpbiBvbmUgc3RyaXBlICovCi0JCQkJCW1kX2Vycm9yKGNvbmYtPm1kZGV2LCByZGV2KTsKLQkJCQlyY3VfcmVhZF91bmxvY2soKTsKLQkJCX0KLQotCQkJc3Bpbl9sb2NrX2lycSgmY29uZi0+ZGV2aWNlX2xvY2spOwotCQkJLyogZmFpbCBhbGwgd3JpdGVzIGZpcnN0ICovCi0JCQliaSA9IHNoLT5kZXZbaV0udG93cml0ZTsKLQkJCXNoLT5kZXZbaV0udG93cml0ZSA9IE5VTEw7Ci0JCQlpZiAoYmkpIHsgdG9fd3JpdGUtLTsgYml0bWFwX2VuZCA9IDE7IH0KLQotCQkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChSNV9PdmVybGFwLCAmc2gtPmRldltpXS5mbGFncykpCi0JCQkJd2FrZV91cCgmY29uZi0+d2FpdF9mb3Jfb3ZlcmxhcCk7Ci0KLQkJCXdoaWxlIChiaSAmJiBiaS0+Ymlfc2VjdG9yIDwgc2gtPmRldltpXS5zZWN0b3IgKyBTVFJJUEVfU0VDVE9SUyl7Ci0JCQkJc3RydWN0IGJpbyAqbmV4dGJpID0gcjVfbmV4dF9iaW8oYmksIHNoLT5kZXZbaV0uc2VjdG9yKTsKLQkJCQljbGVhcl9iaXQoQklPX1VQVE9EQVRFLCAmYmktPmJpX2ZsYWdzKTsKLQkJCQlpZiAoLS1iaS0+YmlfcGh5c19zZWdtZW50cyA9PSAwKSB7Ci0JCQkJCW1kX3dyaXRlX2VuZChjb25mLT5tZGRldik7Ci0JCQkJCWJpLT5iaV9uZXh0ID0gcmV0dXJuX2JpOwotCQkJCQlyZXR1cm5fYmkgPSBiaTsKLQkJCQl9Ci0JCQkJYmkgPSBuZXh0Ymk7Ci0JCQl9Ci0JCQkvKiBhbmQgZmFpbCBhbGwgJ3dyaXR0ZW4nICovCi0JCQliaSA9IHNoLT5kZXZbaV0ud3JpdHRlbjsKLQkJCXNoLT5kZXZbaV0ud3JpdHRlbiA9IE5VTEw7Ci0JCQlpZiAoYmkpIGJpdG1hcF9lbmQgPSAxOwotCQkJd2hpbGUgKGJpICYmIGJpLT5iaV9zZWN0b3IgPCBzaC0+ZGV2W2ldLnNlY3RvciArIFNUUklQRV9TRUNUT1JTKSB7Ci0JCQkJc3RydWN0IGJpbyAqYmkyID0gcjVfbmV4dF9iaW8oYmksIHNoLT5kZXZbaV0uc2VjdG9yKTsKLQkJCQljbGVhcl9iaXQoQklPX1VQVE9EQVRFLCAmYmktPmJpX2ZsYWdzKTsKLQkJCQlpZiAoLS1iaS0+YmlfcGh5c19zZWdtZW50cyA9PSAwKSB7Ci0JCQkJCW1kX3dyaXRlX2VuZChjb25mLT5tZGRldik7Ci0JCQkJCWJpLT5iaV9uZXh0ID0gcmV0dXJuX2JpOwotCQkJCQlyZXR1cm5fYmkgPSBiaTsKLQkJCQl9Ci0JCQkJYmkgPSBiaTI7Ci0JCQl9Ci0KLQkJCS8qIGZhaWwgYW55IHJlYWRzIGlmIHRoaXMgZGV2aWNlIGlzIG5vbi1vcGVyYXRpb25hbCAqLwotCQkJaWYgKCF0ZXN0X2JpdChSNV9JbnN5bmMsICZzaC0+ZGV2W2ldLmZsYWdzKSB8fAotCQkJICAgIHRlc3RfYml0KFI1X1JlYWRFcnJvciwgJnNoLT5kZXZbaV0uZmxhZ3MpKSB7Ci0JCQkJYmkgPSBzaC0+ZGV2W2ldLnRvcmVhZDsKLQkJCQlzaC0+ZGV2W2ldLnRvcmVhZCA9IE5VTEw7Ci0JCQkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChSNV9PdmVybGFwLCAmc2gtPmRldltpXS5mbGFncykpCi0JCQkJCXdha2VfdXAoJmNvbmYtPndhaXRfZm9yX292ZXJsYXApOwotCQkJCWlmIChiaSkgdG9fcmVhZC0tOwotCQkJCXdoaWxlIChiaSAmJiBiaS0+Ymlfc2VjdG9yIDwgc2gtPmRldltpXS5zZWN0b3IgKyBTVFJJUEVfU0VDVE9SUyl7Ci0JCQkJCXN0cnVjdCBiaW8gKm5leHRiaSA9IHI1X25leHRfYmlvKGJpLCBzaC0+ZGV2W2ldLnNlY3Rvcik7Ci0JCQkJCWNsZWFyX2JpdChCSU9fVVBUT0RBVEUsICZiaS0+YmlfZmxhZ3MpOwotCQkJCQlpZiAoLS1iaS0+YmlfcGh5c19zZWdtZW50cyA9PSAwKSB7Ci0JCQkJCQliaS0+YmlfbmV4dCA9IHJldHVybl9iaTsKLQkJCQkJCXJldHVybl9iaSA9IGJpOwotCQkJCQl9Ci0JCQkJCWJpID0gbmV4dGJpOwotCQkJCX0KLQkJCX0KLQkJCXNwaW5fdW5sb2NrX2lycSgmY29uZi0+ZGV2aWNlX2xvY2spOwotCQkJaWYgKGJpdG1hcF9lbmQpCi0JCQkJYml0bWFwX2VuZHdyaXRlKGNvbmYtPm1kZGV2LT5iaXRtYXAsIHNoLT5zZWN0b3IsCi0JCQkJCQlTVFJJUEVfU0VDVE9SUywgMCwgMCk7Ci0JCX0KLQl9Ci0JaWYgKGZhaWxlZCA+IDIgJiYgc3luY2luZykgewotCQltZF9kb25lX3N5bmMoY29uZi0+bWRkZXYsIFNUUklQRV9TRUNUT1JTLDApOwotCQljbGVhcl9iaXQoU1RSSVBFX1NZTkNJTkcsICZzaC0+c3RhdGUpOwotCQlzeW5jaW5nID0gMDsKLQl9Ci0KLQkvKgotCSAqIG1pZ2h0IGJlIGFibGUgdG8gcmV0dXJuIHNvbWUgd3JpdGUgcmVxdWVzdHMgaWYgdGhlIHBhcml0eSBibG9ja3MKLQkgKiBhcmUgc2FmZSwgb3Igb24gYSBmYWlsZWQgZHJpdmUKLQkgKi8KLQlwZGV2ID0gJnNoLT5kZXZbcGRfaWR4XTsKLQlwX2ZhaWxlZCA9IChmYWlsZWQgPj0gMSAmJiBmYWlsZWRfbnVtWzBdID09IHBkX2lkeCkKLQkJfHwgKGZhaWxlZCA+PSAyICYmIGZhaWxlZF9udW1bMV0gPT0gcGRfaWR4KTsKLQlxZGV2ID0gJnNoLT5kZXZbcWRfaWR4XTsKLQlxX2ZhaWxlZCA9IChmYWlsZWQgPj0gMSAmJiBmYWlsZWRfbnVtWzBdID09IHFkX2lkeCkKLQkJfHwgKGZhaWxlZCA+PSAyICYmIGZhaWxlZF9udW1bMV0gPT0gcWRfaWR4KTsKLQotCWlmICggd3JpdHRlbiAmJgotCSAgICAgKCBwX2ZhaWxlZCB8fCAoKHRlc3RfYml0KFI1X0luc3luYywgJnBkZXYtPmZsYWdzKQotCQkJICAgICAmJiAhdGVzdF9iaXQoUjVfTE9DS0VELCAmcGRldi0+ZmxhZ3MpCi0JCQkgICAgICYmIHRlc3RfYml0KFI1X1VQVE9EQVRFLCAmcGRldi0+ZmxhZ3MpKSkgKSAmJgotCSAgICAgKCBxX2ZhaWxlZCB8fCAoKHRlc3RfYml0KFI1X0luc3luYywgJnFkZXYtPmZsYWdzKQotCQkJICAgICAmJiAhdGVzdF9iaXQoUjVfTE9DS0VELCAmcWRldi0+ZmxhZ3MpCi0JCQkgICAgICYmIHRlc3RfYml0KFI1X1VQVE9EQVRFLCAmcWRldi0+ZmxhZ3MpKSkgKSApIHsKLQkJLyogYW55IHdyaXR0ZW4gYmxvY2sgb24gYW4gdXB0b2RhdGUgb3IgZmFpbGVkIGRyaXZlIGNhbiBiZQotCQkgKiByZXR1cm5lZC4gIE5vdGUgdGhhdCBpZiB3ZSAnd3JvdGUnIHRvIGEgZmFpbGVkIGRyaXZlLAotCQkgKiBpdCB3aWxsIGJlIFVQVE9EQVRFLCBidXQgbmV2ZXIgTE9DS0VELCBzbyB3ZSBkb24ndCBuZWVkCi0JCSAqIHRvIHRlc3QgJ2ZhaWxlZCcgZGlyZWN0bHkuCi0JCSAqLwotCQlmb3IgKGk9ZGlza3M7IGktLTsgKQotCQkJaWYgKHNoLT5kZXZbaV0ud3JpdHRlbikgewotCQkJCWRldiA9ICZzaC0+ZGV2W2ldOwotCQkJCWlmICghdGVzdF9iaXQoUjVfTE9DS0VELCAmZGV2LT5mbGFncykgJiYKLQkJCQkgICAgdGVzdF9iaXQoUjVfVVBUT0RBVEUsICZkZXYtPmZsYWdzKSApIHsKLQkJCQkJLyogV2UgY2FuIHJldHVybiBhbnkgd3JpdGUgcmVxdWVzdHMgKi8KLQkJCQkJaW50IGJpdG1hcF9lbmQgPSAwOwotCQkJCQlzdHJ1Y3QgYmlvICp3YmksICp3YmkyOwotCQkJCQlQUklOVEsoIlJldHVybiB3cml0ZSBmb3Igc3RyaXBlICVsbHUgZGlzYyAlZFxuIiwKLQkJCQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpc2gtPnNlY3RvciwgaSk7Ci0JCQkJCXNwaW5fbG9ja19pcnEoJmNvbmYtPmRldmljZV9sb2NrKTsKLQkJCQkJd2JpID0gZGV2LT53cml0dGVuOwotCQkJCQlkZXYtPndyaXR0ZW4gPSBOVUxMOwotCQkJCQl3aGlsZSAod2JpICYmIHdiaS0+Ymlfc2VjdG9yIDwgZGV2LT5zZWN0b3IgKyBTVFJJUEVfU0VDVE9SUykgewotCQkJCQkJd2JpMiA9IHI1X25leHRfYmlvKHdiaSwgZGV2LT5zZWN0b3IpOwotCQkJCQkJaWYgKC0td2JpLT5iaV9waHlzX3NlZ21lbnRzID09IDApIHsKLQkJCQkJCQltZF93cml0ZV9lbmQoY29uZi0+bWRkZXYpOwotCQkJCQkJCXdiaS0+YmlfbmV4dCA9IHJldHVybl9iaTsKLQkJCQkJCQlyZXR1cm5fYmkgPSB3Ymk7Ci0JCQkJCQl9Ci0JCQkJCQl3YmkgPSB3YmkyOwotCQkJCQl9Ci0JCQkJCWlmIChkZXYtPnRvd3JpdGUgPT0gTlVMTCkKLQkJCQkJCWJpdG1hcF9lbmQgPSAxOwotCQkJCQlzcGluX3VubG9ja19pcnEoJmNvbmYtPmRldmljZV9sb2NrKTsKLQkJCQkJaWYgKGJpdG1hcF9lbmQpCi0JCQkJCQliaXRtYXBfZW5kd3JpdGUoY29uZi0+bWRkZXYtPmJpdG1hcCwgc2gtPnNlY3RvciwKLQkJCQkJCQkJU1RSSVBFX1NFQ1RPUlMsCi0JCQkJCQkJCSF0ZXN0X2JpdChTVFJJUEVfREVHUkFERUQsICZzaC0+c3RhdGUpLCAwKTsKLQkJCQl9Ci0JCQl9Ci0JfQotCi0JLyogTm93IHdlIG1pZ2h0IGNvbnNpZGVyIHJlYWRpbmcgc29tZSBibG9ja3MsIGVpdGhlciB0byBjaGVjay9nZW5lcmF0ZQotCSAqIHBhcml0eSwgb3IgdG8gc2F0aXNmeSByZXF1ZXN0cwotCSAqIG9yIHRvIGxvYWQgYSBibG9jayB0aGF0IGlzIGJlaW5nIHBhcnRpYWxseSB3cml0dGVuLgotCSAqLwotCWlmICh0b19yZWFkIHx8IG5vbl9vdmVyd3JpdGUgfHwgKHRvX3dyaXRlICYmIGZhaWxlZCkgfHwgKHN5bmNpbmcgJiYgKHVwdG9kYXRlIDwgZGlza3MpKSkgewotCQlmb3IgKGk9ZGlza3M7IGktLTspIHsKLQkJCWRldiA9ICZzaC0+ZGV2W2ldOwotCQkJaWYgKCF0ZXN0X2JpdChSNV9MT0NLRUQsICZkZXYtPmZsYWdzKSAmJiAhdGVzdF9iaXQoUjVfVVBUT0RBVEUsICZkZXYtPmZsYWdzKSAmJgotCQkJICAgIChkZXYtPnRvcmVhZCB8fAotCQkJICAgICAoZGV2LT50b3dyaXRlICYmICF0ZXN0X2JpdChSNV9PVkVSV1JJVEUsICZkZXYtPmZsYWdzKSkgfHwKLQkJCSAgICAgc3luY2luZyB8fAotCQkJICAgICAoZmFpbGVkID49IDEgJiYgKHNoLT5kZXZbZmFpbGVkX251bVswXV0udG9yZWFkIHx8IHRvX3dyaXRlKSkgfHwKLQkJCSAgICAgKGZhaWxlZCA+PSAyICYmIChzaC0+ZGV2W2ZhaWxlZF9udW1bMV1dLnRvcmVhZCB8fCB0b193cml0ZSkpCi0JCQkJICAgICkKLQkJCQkpIHsKLQkJCQkvKiB3ZSB3b3VsZCBsaWtlIHRvIGdldCB0aGlzIGJsb2NrLCBwb3NzaWJseQotCQkJCSAqIGJ5IGNvbXB1dGluZyBpdCwgYnV0IHdlIG1pZ2h0IG5vdCBiZSBhYmxlIHRvCi0JCQkJICovCi0JCQkJaWYgKHVwdG9kYXRlID09IGRpc2tzLTEpIHsKLQkJCQkJUFJJTlRLKCJDb21wdXRpbmcgc3RyaXBlICVsbHUgYmxvY2sgJWRcbiIsCi0JCQkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXNoLT5zZWN0b3IsIGkpOwotCQkJCQljb21wdXRlX2Jsb2NrXzEoc2gsIGksIDApOwotCQkJCQl1cHRvZGF0ZSsrOwotCQkJCX0gZWxzZSBpZiAoIHVwdG9kYXRlID09IGRpc2tzLTIgJiYgZmFpbGVkID49IDIgKSB7Ci0JCQkJCS8qIENvbXB1dGluZyAyLWZhaWx1cmUgaXMgKnZlcnkqIGV4cGVuc2l2ZTsgb25seSBkbyBpdCBpZiBmYWlsZWQgPj0gMiAqLwotCQkJCQlpbnQgb3RoZXI7Ci0JCQkJCWZvciAob3RoZXI9ZGlza3M7IG90aGVyLS07KSB7Ci0JCQkJCQlpZiAoIG90aGVyID09IGkgKQotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJaWYgKCAhdGVzdF9iaXQoUjVfVVBUT0RBVEUsICZzaC0+ZGV2W290aGVyXS5mbGFncykgKQotCQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCUJVR19PTihvdGhlciA8IDApOwotCQkJCQlQUklOVEsoIkNvbXB1dGluZyBzdHJpcGUgJWxsdSBibG9ja3MgJWQsJWRcbiIsCi0JCQkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXNoLT5zZWN0b3IsIGksIG90aGVyKTsKLQkJCQkJY29tcHV0ZV9ibG9ja18yKHNoLCBpLCBvdGhlcik7Ci0JCQkJCXVwdG9kYXRlICs9IDI7Ci0JCQkJfSBlbHNlIGlmICh0ZXN0X2JpdChSNV9JbnN5bmMsICZkZXYtPmZsYWdzKSkgewotCQkJCQlzZXRfYml0KFI1X0xPQ0tFRCwgJmRldi0+ZmxhZ3MpOwotCQkJCQlzZXRfYml0KFI1X1dhbnRyZWFkLCAmZGV2LT5mbGFncyk7Ci0jaWYgMAotCQkJCQkvKiBpZiBJIGFtIGp1c3QgcmVhZGluZyB0aGlzIGJsb2NrIGFuZCB3ZSBkb24ndCBoYXZlCi0JCQkJCSAgIGEgZmFpbGVkIGRyaXZlLCBvciBhbnkgcGVuZGluZyB3cml0ZXMgdGhlbiBzaWRlc3RlcCB0aGUgY2FjaGUgKi8KLQkJCQkJaWYgKHNoLT5iaF9yZWFkW2ldICYmICFzaC0+YmhfcmVhZFtpXS0+Yl9yZXFuZXh0ICYmCi0JCQkJCSAgICAhIHN5bmNpbmcgJiYgIWZhaWxlZCAmJiAhdG9fd3JpdGUpIHsKLQkJCQkJCXNoLT5iaF9jYWNoZVtpXS0+Yl9wYWdlID0gIHNoLT5iaF9yZWFkW2ldLT5iX3BhZ2U7Ci0JCQkJCQlzaC0+YmhfY2FjaGVbaV0tPmJfZGF0YSA9ICBzaC0+YmhfcmVhZFtpXS0+Yl9kYXRhOwotCQkJCQl9Ci0jZW5kaWYKLQkJCQkJbG9ja2VkKys7Ci0JCQkJCVBSSU5USygiUmVhZGluZyBibG9jayAlZCAoc3luYz0lZClcbiIsCi0JCQkJCQlpLCBzeW5jaW5nKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc2V0X2JpdChTVFJJUEVfSEFORExFLCAmc2gtPnN0YXRlKTsKLQl9Ci0KLQkvKiBub3cgdG8gY29uc2lkZXIgd3JpdGluZyBhbmQgd2hhdCBlbHNlLCBpZiBhbnl0aGluZyBzaG91bGQgYmUgcmVhZCAqLwotCWlmICh0b193cml0ZSkgewotCQlpbnQgcmN3PTAsIG11c3RfY29tcHV0ZT0wOwotCQlmb3IgKGk9ZGlza3MgOyBpLS07KSB7Ci0JCQlkZXYgPSAmc2gtPmRldltpXTsKLQkJCS8qIFdvdWxkIEkgaGF2ZSB0byByZWFkIHRoaXMgYnVmZmVyIGZvciByZWNvbnN0cnVjdF93cml0ZSAqLwotCQkJaWYgKCF0ZXN0X2JpdChSNV9PVkVSV1JJVEUsICZkZXYtPmZsYWdzKQotCQkJICAgICYmIGkgIT0gcGRfaWR4ICYmIGkgIT0gcWRfaWR4Ci0JCQkgICAgJiYgKCF0ZXN0X2JpdChSNV9MT0NLRUQsICZkZXYtPmZsYWdzKQotI2lmIDAKLQkJCQl8fCBzaC0+YmhfcGFnZVtpXSAhPSBiaC0+Yl9wYWdlCi0jZW5kaWYKLQkJCQkgICAgKSAmJgotCQkJICAgICF0ZXN0X2JpdChSNV9VUFRPREFURSwgJmRldi0+ZmxhZ3MpKSB7Ci0JCQkJaWYgKHRlc3RfYml0KFI1X0luc3luYywgJmRldi0+ZmxhZ3MpKSByY3crKzsKLQkJCQllbHNlIHsKLQkJCQkJUFJJTlRLKCJyYWlkNjogbXVzdF9jb21wdXRlOiBkaXNrICVkIGZsYWdzPSUjbHhcbiIsIGksIGRldi0+ZmxhZ3MpOwotCQkJCQltdXN0X2NvbXB1dGUrKzsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJUFJJTlRLKCJmb3Igc2VjdG9yICVsbHUsIHJjdz0lZCwgbXVzdF9jb21wdXRlPSVkXG4iLAotCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylzaC0+c2VjdG9yLCByY3csIG11c3RfY29tcHV0ZSk7Ci0JCXNldF9iaXQoU1RSSVBFX0hBTkRMRSwgJnNoLT5zdGF0ZSk7Ci0KLQkJaWYgKHJjdyA+IDApCi0JCQkvKiB3YW50IHJlY29uc3RydWN0IHdyaXRlLCBidXQgbmVlZCB0byBnZXQgc29tZSBkYXRhICovCi0JCQlmb3IgKGk9ZGlza3M7IGktLTspIHsKLQkJCQlkZXYgPSAmc2gtPmRldltpXTsKLQkJCQlpZiAoIXRlc3RfYml0KFI1X09WRVJXUklURSwgJmRldi0+ZmxhZ3MpCi0JCQkJICAgICYmICEoZmFpbGVkID09IDAgJiYgKGkgPT0gcGRfaWR4IHx8IGkgPT0gcWRfaWR4KSkKLQkJCQkgICAgJiYgIXRlc3RfYml0KFI1X0xPQ0tFRCwgJmRldi0+ZmxhZ3MpICYmICF0ZXN0X2JpdChSNV9VUFRPREFURSwgJmRldi0+ZmxhZ3MpICYmCi0JCQkJICAgIHRlc3RfYml0KFI1X0luc3luYywgJmRldi0+ZmxhZ3MpKSB7Ci0JCQkJCWlmICh0ZXN0X2JpdChTVFJJUEVfUFJFUkVBRF9BQ1RJVkUsICZzaC0+c3RhdGUpKQotCQkJCQl7Ci0JCQkJCQlQUklOVEsoIlJlYWRfb2xkIHN0cmlwZSAlbGx1IGJsb2NrICVkIGZvciBSZWNvbnN0cnVjdFxuIiwKLQkJCQkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXNoLT5zZWN0b3IsIGkpOwotCQkJCQkJc2V0X2JpdChSNV9MT0NLRUQsICZkZXYtPmZsYWdzKTsKLQkJCQkJCXNldF9iaXQoUjVfV2FudHJlYWQsICZkZXYtPmZsYWdzKTsKLQkJCQkJCWxvY2tlZCsrOwotCQkJCQl9IGVsc2UgewotCQkJCQkJUFJJTlRLKCJSZXF1ZXN0IGRlbGF5ZWQgc3RyaXBlICVsbHUgYmxvY2sgJWQgZm9yIFJlY29uc3RydWN0XG4iLAotCQkJCQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpc2gtPnNlY3RvciwgaSk7Ci0JCQkJCQlzZXRfYml0KFNUUklQRV9ERUxBWUVELCAmc2gtPnN0YXRlKTsKLQkJCQkJCXNldF9iaXQoU1RSSVBFX0hBTkRMRSwgJnNoLT5zdGF0ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCS8qIG5vdyBpZiBub3RoaW5nIGlzIGxvY2tlZCwgYW5kIGlmIHdlIGhhdmUgZW5vdWdoIGRhdGEsIHdlIGNhbiBzdGFydCBhIHdyaXRlIHJlcXVlc3QgKi8KLQkJaWYgKGxvY2tlZCA9PSAwICYmIHJjdyA9PSAwICYmCi0JCSAgICAhdGVzdF9iaXQoU1RSSVBFX0JJVF9ERUxBWSwgJnNoLT5zdGF0ZSkpIHsKLQkJCWlmICggbXVzdF9jb21wdXRlID4gMCApIHsKLQkJCQkvKiBXZSBoYXZlIGZhaWxlZCBibG9ja3MgYW5kIG5lZWQgdG8gY29tcHV0ZSB0aGVtICovCi0JCQkJc3dpdGNoICggZmFpbGVkICkgewotCQkJCWNhc2UgMDoJQlVHKCk7Ci0JCQkJY2FzZSAxOiBjb21wdXRlX2Jsb2NrXzEoc2gsIGZhaWxlZF9udW1bMF0sIDApOyBicmVhazsKLQkJCQljYXNlIDI6IGNvbXB1dGVfYmxvY2tfMihzaCwgZmFpbGVkX251bVswXSwgZmFpbGVkX251bVsxXSk7IGJyZWFrOwotCQkJCWRlZmF1bHQ6IEJVRygpOwkvKiBUaGlzIHJlcXVlc3Qgc2hvdWxkIGhhdmUgYmVlbiBmYWlsZWQ/ICovCi0JCQkJfQotCQkJfQotCi0JCQlQUklOVEsoIkNvbXB1dGluZyBwYXJpdHkgZm9yIHN0cmlwZSAlbGx1XG4iLCAodW5zaWduZWQgbG9uZyBsb25nKXNoLT5zZWN0b3IpOwotCQkJY29tcHV0ZV9wYXJpdHkoc2gsIFJFQ09OU1RSVUNUX1dSSVRFKTsKLQkJCS8qIG5vdyBldmVyeSBsb2NrZWQgYnVmZmVyIGlzIHJlYWR5IHRvIGJlIHdyaXR0ZW4gKi8KLQkJCWZvciAoaT1kaXNrczsgaS0tOykKLQkJCQlpZiAodGVzdF9iaXQoUjVfTE9DS0VELCAmc2gtPmRldltpXS5mbGFncykpIHsKLQkJCQkJUFJJTlRLKCJXcml0aW5nIHN0cmlwZSAlbGx1IGJsb2NrICVkXG4iLAotCQkJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylzaC0+c2VjdG9yLCBpKTsKLQkJCQkJbG9ja2VkKys7Ci0JCQkJCXNldF9iaXQoUjVfV2FudHdyaXRlLCAmc2gtPmRldltpXS5mbGFncyk7Ci0JCQkJfQotCQkJLyogYWZ0ZXIgYSBSRUNPTlNUUlVDVF9XUklURSwgdGhlIHN0cmlwZSBNVVNUIGJlIGluLXN5bmMgKi8KLQkJCXNldF9iaXQoU1RSSVBFX0lOU1lOQywgJnNoLT5zdGF0ZSk7Ci0KLQkJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoU1RSSVBFX1BSRVJFQURfQUNUSVZFLCAmc2gtPnN0YXRlKSkgewotCQkJCWF0b21pY19kZWMoJmNvbmYtPnByZXJlYWRfYWN0aXZlX3N0cmlwZXMpOwotCQkJCWlmIChhdG9taWNfcmVhZCgmY29uZi0+cHJlcmVhZF9hY3RpdmVfc3RyaXBlcykgPCBJT19USFJFU0hPTEQpCi0JCQkJCW1kX3dha2V1cF90aHJlYWQoY29uZi0+bWRkZXYtPnRocmVhZCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiBtYXliZSB3ZSBuZWVkIHRvIGNoZWNrIGFuZCBwb3NzaWJseSBmaXggdGhlIHBhcml0eSBmb3IgdGhpcyBzdHJpcGUKLQkgKiBBbnkgcmVhZHMgd2lsbCBhbHJlYWR5IGhhdmUgYmVlbiBzY2hlZHVsZWQsIHNvIHdlIGp1c3Qgc2VlIGlmIGVub3VnaCBkYXRhCi0JICogaXMgYXZhaWxhYmxlCi0JICovCi0JaWYgKHN5bmNpbmcgJiYgbG9ja2VkID09IDAgJiYgIXRlc3RfYml0KFNUUklQRV9JTlNZTkMsICZzaC0+c3RhdGUpKSB7Ci0JCWludCB1cGRhdGVfcCA9IDAsIHVwZGF0ZV9xID0gMDsKLQkJc3RydWN0IHI1ZGV2ICpkZXY7Ci0KLQkJc2V0X2JpdChTVFJJUEVfSEFORExFLCAmc2gtPnN0YXRlKTsKLQotCQlCVUdfT04oZmFpbGVkPjIpOwotCQlCVUdfT04odXB0b2RhdGUgPCBkaXNrcyk7Ci0JCS8qIFdhbnQgdG8gY2hlY2sgYW5kIHBvc3NpYmx5IHJlcGFpciBQIGFuZCBRLgotCQkgKiBIb3dldmVyIHRoZXJlIGNvdWxkIGJlIG9uZSAnZmFpbGVkJyBkZXZpY2UsIGluIHdoaWNoCi0JCSAqIGNhc2Ugd2UgY2FuIG9ubHkgY2hlY2sgb25lIG9mIHRoZW0sIHBvc3NpYmx5IHVzaW5nIHRoZQotCQkgKiBvdGhlciB0byBnZW5lcmF0ZSBtaXNzaW5nIGRhdGEKLQkJICovCi0KLQkJLyogSWYgIXRtcF9wYWdlLCB3ZSBjYW5ub3QgZG8gdGhlIGNhbGN1bGF0aW9ucywKLQkJICogYnV0IGFzIHdlIGhhdmUgc2V0IFNUUklQRV9IQU5ETEUsIHdlIHdpbGwgc29vbiBiZSBjYWxsZWQKLQkJICogYnkgc3RyaXBlX2hhbmRsZSB3aXRoIGEgdG1wX3BhZ2UgLSBqdXN0IHdhaXQgdW50aWwgdGhlbi4KLQkJICovCi0JCWlmICh0bXBfcGFnZSkgewotCQkJaWYgKGZhaWxlZCA9PSBxX2ZhaWxlZCkgewotCQkJCS8qIFRoZSBvbmx5IHBvc3NpYmxlIGZhaWxlZCBkZXZpY2UgaG9sZHMgJ1EnLCBzbyBpdCBtYWtlcwotCQkJCSAqIHNlbnNlIHRvIGNoZWNrIFAgKElmIGFueXRoaW5nIGVsc2Ugd2VyZSBmYWlsZWQsIHdlIHdvdWxkCi0JCQkJICogaGF2ZSB1c2VkIFAgdG8gcmVjcmVhdGUgaXQpLgotCQkJCSAqLwotCQkJCWNvbXB1dGVfYmxvY2tfMShzaCwgcGRfaWR4LCAxKTsKLQkJCQlpZiAoIXBhZ2VfaXNfemVybyhzaC0+ZGV2W3BkX2lkeF0ucGFnZSkpIHsKLQkJCQkJY29tcHV0ZV9ibG9ja18xKHNoLHBkX2lkeCwwKTsKLQkJCQkJdXBkYXRlX3AgPSAxOwotCQkJCX0KLQkJCX0KLQkJCWlmICghcV9mYWlsZWQgJiYgZmFpbGVkIDwgMikgewotCQkJCS8qIHEgaXMgbm90IGZhaWxlZCwgYW5kIHdlIGRpZG4ndCB1c2UgaXQgdG8gZ2VuZXJhdGUKLQkJCQkgKiBhbnl0aGluZywgc28gaXQgbWFrZXMgc2Vuc2UgdG8gY2hlY2sgaXQKLQkJCQkgKi8KLQkJCQltZW1jcHkocGFnZV9hZGRyZXNzKHRtcF9wYWdlKSwKLQkJCQkgICAgICAgcGFnZV9hZGRyZXNzKHNoLT5kZXZbcWRfaWR4XS5wYWdlKSwKLQkJCQkgICAgICAgU1RSSVBFX1NJWkUpOwotCQkJCWNvbXB1dGVfcGFyaXR5KHNoLCBVUERBVEVfUEFSSVRZKTsKLQkJCQlpZiAobWVtY21wKHBhZ2VfYWRkcmVzcyh0bXBfcGFnZSksCi0JCQkJCSAgIHBhZ2VfYWRkcmVzcyhzaC0+ZGV2W3FkX2lkeF0ucGFnZSksCi0JCQkJCSAgIFNUUklQRV9TSVpFKSE9IDApIHsKLQkJCQkJY2xlYXJfYml0KFNUUklQRV9JTlNZTkMsICZzaC0+c3RhdGUpOwotCQkJCQl1cGRhdGVfcSA9IDE7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHVwZGF0ZV9wIHx8IHVwZGF0ZV9xKSB7Ci0JCQkJY29uZi0+bWRkZXYtPnJlc3luY19taXNtYXRjaGVzICs9IFNUUklQRV9TRUNUT1JTOwotCQkJCWlmICh0ZXN0X2JpdChNRF9SRUNPVkVSWV9DSEVDSywgJmNvbmYtPm1kZGV2LT5yZWNvdmVyeSkpCi0JCQkJCS8qIGRvbid0IHRyeSB0byByZXBhaXIhISAqLwotCQkJCQl1cGRhdGVfcCA9IHVwZGF0ZV9xID0gMDsKLQkJCX0KLQotCQkJLyogbm93IHdyaXRlIG91dCBhbnkgYmxvY2sgb24gYSBmYWlsZWQgZHJpdmUsCi0JCQkgKiBvciBQIG9yIFEgaWYgdGhleSBuZWVkIGl0Ci0JCQkgKi8KLQotCQkJaWYgKGZhaWxlZCA9PSAyKSB7Ci0JCQkJZGV2ID0gJnNoLT5kZXZbZmFpbGVkX251bVsxXV07Ci0JCQkJbG9ja2VkKys7Ci0JCQkJc2V0X2JpdChSNV9MT0NLRUQsICZkZXYtPmZsYWdzKTsKLQkJCQlzZXRfYml0KFI1X1dhbnR3cml0ZSwgJmRldi0+ZmxhZ3MpOwotCQkJfQotCQkJaWYgKGZhaWxlZCA+PSAxKSB7Ci0JCQkJZGV2ID0gJnNoLT5kZXZbZmFpbGVkX251bVswXV07Ci0JCQkJbG9ja2VkKys7Ci0JCQkJc2V0X2JpdChSNV9MT0NLRUQsICZkZXYtPmZsYWdzKTsKLQkJCQlzZXRfYml0KFI1X1dhbnR3cml0ZSwgJmRldi0+ZmxhZ3MpOwotCQkJfQotCi0JCQlpZiAodXBkYXRlX3ApIHsKLQkJCQlkZXYgPSAmc2gtPmRldltwZF9pZHhdOwotCQkJCWxvY2tlZCArKzsKLQkJCQlzZXRfYml0KFI1X0xPQ0tFRCwgJmRldi0+ZmxhZ3MpOwotCQkJCXNldF9iaXQoUjVfV2FudHdyaXRlLCAmZGV2LT5mbGFncyk7Ci0JCQl9Ci0JCQlpZiAodXBkYXRlX3EpIHsKLQkJCQlkZXYgPSAmc2gtPmRldltxZF9pZHhdOwotCQkJCWxvY2tlZCsrOwotCQkJCXNldF9iaXQoUjVfTE9DS0VELCAmZGV2LT5mbGFncyk7Ci0JCQkJc2V0X2JpdChSNV9XYW50d3JpdGUsICZkZXYtPmZsYWdzKTsKLQkJCX0KLQkJCWNsZWFyX2JpdChTVFJJUEVfREVHUkFERUQsICZzaC0+c3RhdGUpOwotCi0JCQlzZXRfYml0KFNUUklQRV9JTlNZTkMsICZzaC0+c3RhdGUpOwotCQl9Ci0JfQotCi0JaWYgKHN5bmNpbmcgJiYgbG9ja2VkID09IDAgJiYgdGVzdF9iaXQoU1RSSVBFX0lOU1lOQywgJnNoLT5zdGF0ZSkpIHsKLQkJbWRfZG9uZV9zeW5jKGNvbmYtPm1kZGV2LCBTVFJJUEVfU0VDVE9SUywxKTsKLQkJY2xlYXJfYml0KFNUUklQRV9TWU5DSU5HLCAmc2gtPnN0YXRlKTsKLQl9Ci0KLQkvKiBJZiB0aGUgZmFpbGVkIGRyaXZlcyBhcmUganVzdCBhIFJlYWRFcnJvciwgdGhlbiB3ZSBtaWdodCBuZWVkCi0JICogdG8gcHJvZ3Jlc3MgdGhlIHJlcGFpci9jaGVjayBwcm9jZXNzCi0JICovCi0JaWYgKGZhaWxlZCA8PSAyICYmICEgY29uZi0+bWRkZXYtPnJvKQotCQlmb3IgKGk9MDsgaTxmYWlsZWQ7aSsrKSB7Ci0JCQlkZXYgPSAmc2gtPmRldltmYWlsZWRfbnVtW2ldXTsKLQkJCWlmICh0ZXN0X2JpdChSNV9SZWFkRXJyb3IsICZkZXYtPmZsYWdzKQotCQkJICAgICYmICF0ZXN0X2JpdChSNV9MT0NLRUQsICZkZXYtPmZsYWdzKQotCQkJICAgICYmIHRlc3RfYml0KFI1X1VQVE9EQVRFLCAmZGV2LT5mbGFncykKLQkJCQkpIHsKLQkJCQlpZiAoIXRlc3RfYml0KFI1X1JlV3JpdGUsICZkZXYtPmZsYWdzKSkgewotCQkJCQlzZXRfYml0KFI1X1dhbnR3cml0ZSwgJmRldi0+ZmxhZ3MpOwotCQkJCQlzZXRfYml0KFI1X1JlV3JpdGUsICZkZXYtPmZsYWdzKTsKLQkJCQkJc2V0X2JpdChSNV9MT0NLRUQsICZkZXYtPmZsYWdzKTsKLQkJCQl9IGVsc2UgewotCQkJCQkvKiBsZXQncyByZWFkIGl0IGJhY2sgKi8KLQkJCQkJc2V0X2JpdChSNV9XYW50cmVhZCwgJmRldi0+ZmxhZ3MpOwotCQkJCQlzZXRfYml0KFI1X0xPQ0tFRCwgJmRldi0+ZmxhZ3MpOwotCQkJCX0KLQkJCX0KLQkJfQotCXNwaW5fdW5sb2NrKCZzaC0+bG9jayk7Ci0KLQl3aGlsZSAoKGJpPXJldHVybl9iaSkpIHsKLQkJaW50IGJ5dGVzID0gYmktPmJpX3NpemU7Ci0KLQkJcmV0dXJuX2JpID0gYmktPmJpX25leHQ7Ci0JCWJpLT5iaV9uZXh0ID0gTlVMTDsKLQkJYmktPmJpX3NpemUgPSAwOwotCQliaS0+YmlfZW5kX2lvKGJpLCBieXRlcywgMCk7Ci0JfQotCWZvciAoaT1kaXNrczsgaS0tIDspIHsKLQkJaW50IHJ3OwotCQlzdHJ1Y3QgYmlvICpiaTsKLQkJbWRrX3JkZXZfdCAqcmRldjsKLQkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChSNV9XYW50d3JpdGUsICZzaC0+ZGV2W2ldLmZsYWdzKSkKLQkJCXJ3ID0gMTsKLQkJZWxzZSBpZiAodGVzdF9hbmRfY2xlYXJfYml0KFI1X1dhbnRyZWFkLCAmc2gtPmRldltpXS5mbGFncykpCi0JCQlydyA9IDA7Ci0JCWVsc2UKLQkJCWNvbnRpbnVlOwotCi0JCWJpID0gJnNoLT5kZXZbaV0ucmVxOwotCi0JCWJpLT5iaV9ydyA9IHJ3OwotCQlpZiAocncpCi0JCQliaS0+YmlfZW5kX2lvID0gcmFpZDZfZW5kX3dyaXRlX3JlcXVlc3Q7Ci0JCWVsc2UKLQkJCWJpLT5iaV9lbmRfaW8gPSByYWlkNl9lbmRfcmVhZF9yZXF1ZXN0OwotCi0JCXJjdV9yZWFkX2xvY2soKTsKLQkJcmRldiA9IHJjdV9kZXJlZmVyZW5jZShjb25mLT5kaXNrc1tpXS5yZGV2KTsKLQkJaWYgKHJkZXYgJiYgdGVzdF9iaXQoRmF1bHR5LCAmcmRldi0+ZmxhZ3MpKQotCQkJcmRldiA9IE5VTEw7Ci0JCWlmIChyZGV2KQotCQkJYXRvbWljX2luYygmcmRldi0+bnJfcGVuZGluZyk7Ci0JCXJjdV9yZWFkX3VubG9jaygpOwotCi0JCWlmIChyZGV2KSB7Ci0JCQlpZiAoc3luY2luZykKLQkJCQltZF9zeW5jX2FjY3QocmRldi0+YmRldiwgU1RSSVBFX1NFQ1RPUlMpOwotCi0JCQliaS0+YmlfYmRldiA9IHJkZXYtPmJkZXY7Ci0JCQlQUklOVEsoImZvciAlbGx1IHNjaGVkdWxlIG9wICVsZCBvbiBkaXNjICVkXG4iLAotCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpc2gtPnNlY3RvciwgYmktPmJpX3J3LCBpKTsKLQkJCWF0b21pY19pbmMoJnNoLT5jb3VudCk7Ci0JCQliaS0+Ymlfc2VjdG9yID0gc2gtPnNlY3RvciArIHJkZXYtPmRhdGFfb2Zmc2V0OwotCQkJYmktPmJpX2ZsYWdzID0gMSA8PCBCSU9fVVBUT0RBVEU7Ci0JCQliaS0+YmlfdmNudCA9IDE7Ci0JCQliaS0+YmlfbWF4X3ZlY3MgPSAxOwotCQkJYmktPmJpX2lkeCA9IDA7Ci0JCQliaS0+YmlfaW9fdmVjID0gJnNoLT5kZXZbaV0udmVjOwotCQkJYmktPmJpX2lvX3ZlY1swXS5idl9sZW4gPSBTVFJJUEVfU0laRTsKLQkJCWJpLT5iaV9pb192ZWNbMF0uYnZfb2Zmc2V0ID0gMDsKLQkJCWJpLT5iaV9zaXplID0gU1RSSVBFX1NJWkU7Ci0JCQliaS0+YmlfbmV4dCA9IE5VTEw7Ci0JCQlpZiAocncgPT0gV1JJVEUgJiYKLQkJCSAgICB0ZXN0X2JpdChSNV9SZVdyaXRlLCAmc2gtPmRldltpXS5mbGFncykpCi0JCQkJYXRvbWljX2FkZChTVFJJUEVfU0VDVE9SUywgJnJkZXYtPmNvcnJlY3RlZF9lcnJvcnMpOwotCQkJZ2VuZXJpY19tYWtlX3JlcXVlc3QoYmkpOwotCQl9IGVsc2UgewotCQkJaWYgKHJ3ID09IDEpCi0JCQkJc2V0X2JpdChTVFJJUEVfREVHUkFERUQsICZzaC0+c3RhdGUpOwotCQkJUFJJTlRLKCJza2lwIG9wICVsZCBvbiBkaXNjICVkIGZvciBzZWN0b3IgJWxsdVxuIiwKLQkJCQliaS0+YmlfcncsIGksICh1bnNpZ25lZCBsb25nIGxvbmcpc2gtPnNlY3Rvcik7Ci0JCQljbGVhcl9iaXQoUjVfTE9DS0VELCAmc2gtPmRldltpXS5mbGFncyk7Ci0JCQlzZXRfYml0KFNUUklQRV9IQU5ETEUsICZzaC0+c3RhdGUpOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgdm9pZCByYWlkNl9hY3RpdmF0ZV9kZWxheWVkKHJhaWQ2X2NvbmZfdCAqY29uZikKLXsKLQlpZiAoYXRvbWljX3JlYWQoJmNvbmYtPnByZXJlYWRfYWN0aXZlX3N0cmlwZXMpIDwgSU9fVEhSRVNIT0xEKSB7Ci0JCXdoaWxlICghbGlzdF9lbXB0eSgmY29uZi0+ZGVsYXllZF9saXN0KSkgewotCQkJc3RydWN0IGxpc3RfaGVhZCAqbCA9IGNvbmYtPmRlbGF5ZWRfbGlzdC5uZXh0OwotCQkJc3RydWN0IHN0cmlwZV9oZWFkICpzaDsKLQkJCXNoID0gbGlzdF9lbnRyeShsLCBzdHJ1Y3Qgc3RyaXBlX2hlYWQsIGxydSk7Ci0JCQlsaXN0X2RlbF9pbml0KGwpOwotCQkJY2xlYXJfYml0KFNUUklQRV9ERUxBWUVELCAmc2gtPnN0YXRlKTsKLQkJCWlmICghdGVzdF9hbmRfc2V0X2JpdChTVFJJUEVfUFJFUkVBRF9BQ1RJVkUsICZzaC0+c3RhdGUpKQotCQkJCWF0b21pY19pbmMoJmNvbmYtPnByZXJlYWRfYWN0aXZlX3N0cmlwZXMpOwotCQkJbGlzdF9hZGRfdGFpbCgmc2gtPmxydSwgJmNvbmYtPmhhbmRsZV9saXN0KTsKLQkJfQotCX0KLX0KLQotc3RhdGljIHZvaWQgYWN0aXZhdGVfYml0X2RlbGF5KHJhaWQ2X2NvbmZfdCAqY29uZikKLXsKLQkvKiBkZXZpY2VfbG9jayBpcyBoZWxkICovCi0Jc3RydWN0IGxpc3RfaGVhZCBoZWFkOwotCWxpc3RfYWRkKCZoZWFkLCAmY29uZi0+Yml0bWFwX2xpc3QpOwotCWxpc3RfZGVsX2luaXQoJmNvbmYtPmJpdG1hcF9saXN0KTsKLQl3aGlsZSAoIWxpc3RfZW1wdHkoJmhlYWQpKSB7Ci0JCXN0cnVjdCBzdHJpcGVfaGVhZCAqc2ggPSBsaXN0X2VudHJ5KGhlYWQubmV4dCwgc3RydWN0IHN0cmlwZV9oZWFkLCBscnUpOwotCQlsaXN0X2RlbF9pbml0KCZzaC0+bHJ1KTsKLQkJYXRvbWljX2luYygmc2gtPmNvdW50KTsKLQkJX19yZWxlYXNlX3N0cmlwZShjb25mLCBzaCk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCB1bnBsdWdfc2xhdmVzKG1kZGV2X3QgKm1kZGV2KQotewotCXJhaWQ2X2NvbmZfdCAqY29uZiA9IG1kZGV2X3RvX2NvbmYobWRkZXYpOwotCWludCBpOwotCi0JcmN1X3JlYWRfbG9jaygpOwotCWZvciAoaT0wOyBpPG1kZGV2LT5yYWlkX2Rpc2tzOyBpKyspIHsKLQkJbWRrX3JkZXZfdCAqcmRldiA9IHJjdV9kZXJlZmVyZW5jZShjb25mLT5kaXNrc1tpXS5yZGV2KTsKLQkJaWYgKHJkZXYgJiYgIXRlc3RfYml0KEZhdWx0eSwgJnJkZXYtPmZsYWdzKSAmJiBhdG9taWNfcmVhZCgmcmRldi0+bnJfcGVuZGluZykpIHsKLQkJCXJlcXVlc3RfcXVldWVfdCAqcl9xdWV1ZSA9IGJkZXZfZ2V0X3F1ZXVlKHJkZXYtPmJkZXYpOwotCi0JCQlhdG9taWNfaW5jKCZyZGV2LT5ucl9wZW5kaW5nKTsKLQkJCXJjdV9yZWFkX3VubG9jaygpOwotCi0JCQlpZiAocl9xdWV1ZS0+dW5wbHVnX2ZuKQotCQkJCXJfcXVldWUtPnVucGx1Z19mbihyX3F1ZXVlKTsKLQotCQkJcmRldl9kZWNfcGVuZGluZyhyZGV2LCBtZGRldik7Ci0JCQlyY3VfcmVhZF9sb2NrKCk7Ci0JCX0KLQl9Ci0JcmN1X3JlYWRfdW5sb2NrKCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHJhaWQ2X3VucGx1Z19kZXZpY2UocmVxdWVzdF9xdWV1ZV90ICpxKQotewotCW1kZGV2X3QgKm1kZGV2ID0gcS0+cXVldWVkYXRhOwotCXJhaWQ2X2NvbmZfdCAqY29uZiA9IG1kZGV2X3RvX2NvbmYobWRkZXYpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY29uZi0+ZGV2aWNlX2xvY2ssIGZsYWdzKTsKLQotCWlmIChibGtfcmVtb3ZlX3BsdWcocSkpIHsKLQkJY29uZi0+c2VxX2ZsdXNoKys7Ci0JCXJhaWQ2X2FjdGl2YXRlX2RlbGF5ZWQoY29uZik7Ci0JfQotCW1kX3dha2V1cF90aHJlYWQobWRkZXYtPnRocmVhZCk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb25mLT5kZXZpY2VfbG9jaywgZmxhZ3MpOwotCi0JdW5wbHVnX3NsYXZlcyhtZGRldik7Ci19Ci0KLXN0YXRpYyBpbnQgcmFpZDZfaXNzdWVfZmx1c2gocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgZ2VuZGlzayAqZGlzaywKLQkJCSAgICAgc2VjdG9yX3QgKmVycm9yX3NlY3RvcikKLXsKLQltZGRldl90ICptZGRldiA9IHEtPnF1ZXVlZGF0YTsKLQlyYWlkNl9jb25mX3QgKmNvbmYgPSBtZGRldl90b19jb25mKG1kZGV2KTsKLQlpbnQgaSwgcmV0ID0gMDsKLQotCXJjdV9yZWFkX2xvY2soKTsKLQlmb3IgKGk9MDsgaTxtZGRldi0+cmFpZF9kaXNrcyAmJiByZXQgPT0gMDsgaSsrKSB7Ci0JCW1ka19yZGV2X3QgKnJkZXYgPSByY3VfZGVyZWZlcmVuY2UoY29uZi0+ZGlza3NbaV0ucmRldik7Ci0JCWlmIChyZGV2ICYmICF0ZXN0X2JpdChGYXVsdHksICZyZGV2LT5mbGFncykpIHsKLQkJCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYgPSByZGV2LT5iZGV2OwotCQkJcmVxdWVzdF9xdWV1ZV90ICpyX3F1ZXVlID0gYmRldl9nZXRfcXVldWUoYmRldik7Ci0KLQkJCWlmICghcl9xdWV1ZS0+aXNzdWVfZmx1c2hfZm4pCi0JCQkJcmV0ID0gLUVPUE5PVFNVUFA7Ci0JCQllbHNlIHsKLQkJCQlhdG9taWNfaW5jKCZyZGV2LT5ucl9wZW5kaW5nKTsKLQkJCQlyY3VfcmVhZF91bmxvY2soKTsKLQkJCQlyZXQgPSByX3F1ZXVlLT5pc3N1ZV9mbHVzaF9mbihyX3F1ZXVlLCBiZGV2LT5iZF9kaXNrLAotCQkJCQkJCSAgICAgIGVycm9yX3NlY3Rvcik7Ci0JCQkJcmRldl9kZWNfcGVuZGluZyhyZGV2LCBtZGRldik7Ci0JCQkJcmN1X3JlYWRfbG9jaygpOwotCQkJfQotCQl9Ci0JfQotCXJjdV9yZWFkX3VubG9jaygpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCByYWlkNl9wbHVnX2RldmljZShyYWlkNl9jb25mX3QgKmNvbmYpCi17Ci0Jc3Bpbl9sb2NrX2lycSgmY29uZi0+ZGV2aWNlX2xvY2spOwotCWJsa19wbHVnX2RldmljZShjb25mLT5tZGRldi0+cXVldWUpOwotCXNwaW5fdW5sb2NrX2lycSgmY29uZi0+ZGV2aWNlX2xvY2spOwotfQotCi1zdGF0aWMgaW50IG1ha2VfcmVxdWVzdCAocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgYmlvICogYmkpCi17Ci0JbWRkZXZfdCAqbWRkZXYgPSBxLT5xdWV1ZWRhdGE7Ci0JcmFpZDZfY29uZl90ICpjb25mID0gbWRkZXZfdG9fY29uZihtZGRldik7Ci0JY29uc3QgdW5zaWduZWQgaW50IHJhaWRfZGlza3MgPSBjb25mLT5yYWlkX2Rpc2tzOwotCWNvbnN0IHVuc2lnbmVkIGludCBkYXRhX2Rpc2tzID0gcmFpZF9kaXNrcyAtIDI7Ci0JdW5zaWduZWQgaW50IGRkX2lkeCwgcGRfaWR4OwotCXNlY3Rvcl90IG5ld19zZWN0b3I7Ci0Jc2VjdG9yX3QgbG9naWNhbF9zZWN0b3IsIGxhc3Rfc2VjdG9yOwotCXN0cnVjdCBzdHJpcGVfaGVhZCAqc2g7Ci0JY29uc3QgaW50IHJ3ID0gYmlvX2RhdGFfZGlyKGJpKTsKLQotCWlmICh1bmxpa2VseShiaW9fYmFycmllcihiaSkpKSB7Ci0JCWJpb19lbmRpbyhiaSwgYmktPmJpX3NpemUsIC1FT1BOT1RTVVBQKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JbWRfd3JpdGVfc3RhcnQobWRkZXYsIGJpKTsKLQotCWRpc2tfc3RhdF9pbmMobWRkZXYtPmdlbmRpc2ssIGlvc1tyd10pOwotCWRpc2tfc3RhdF9hZGQobWRkZXYtPmdlbmRpc2ssIHNlY3RvcnNbcnddLCBiaW9fc2VjdG9ycyhiaSkpOwotCi0JbG9naWNhbF9zZWN0b3IgPSBiaS0+Ymlfc2VjdG9yICYgfigoc2VjdG9yX3QpU1RSSVBFX1NFQ1RPUlMtMSk7Ci0JbGFzdF9zZWN0b3IgPSBiaS0+Ymlfc2VjdG9yICsgKGJpLT5iaV9zaXplPj45KTsKLQotCWJpLT5iaV9uZXh0ID0gTlVMTDsKLQliaS0+YmlfcGh5c19zZWdtZW50cyA9IDE7CS8qIG92ZXItbG9hZGVkIHRvIGNvdW50IGFjdGl2ZSBzdHJpcGVzICovCi0KLQlmb3IgKDtsb2dpY2FsX3NlY3RvciA8IGxhc3Rfc2VjdG9yOyBsb2dpY2FsX3NlY3RvciArPSBTVFJJUEVfU0VDVE9SUykgewotCQlERUZJTkVfV0FJVCh3KTsKLQotCQluZXdfc2VjdG9yID0gcmFpZDZfY29tcHV0ZV9zZWN0b3IobG9naWNhbF9zZWN0b3IsCi0JCQkJCQkgIHJhaWRfZGlza3MsIGRhdGFfZGlza3MsICZkZF9pZHgsICZwZF9pZHgsIGNvbmYpOwotCi0JCVBSSU5USygicmFpZDY6IG1ha2VfcmVxdWVzdCwgc2VjdG9yICVsbHUgbG9naWNhbCAlbGx1XG4iLAotCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyluZXdfc2VjdG9yLAotCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylsb2dpY2FsX3NlY3Rvcik7Ci0KLQlyZXRyeToKLQkJcHJlcGFyZV90b193YWl0KCZjb25mLT53YWl0X2Zvcl9vdmVybGFwLCAmdywgVEFTS19VTklOVEVSUlVQVElCTEUpOwotCQlzaCA9IGdldF9hY3RpdmVfc3RyaXBlKGNvbmYsIG5ld19zZWN0b3IsIHBkX2lkeCwgKGJpLT5iaV9ydyZSV0FfTUFTSykpOwotCQlpZiAoc2gpIHsKLQkJCWlmICghYWRkX3N0cmlwZV9iaW8oc2gsIGJpLCBkZF9pZHgsIChiaS0+YmlfcncmUldfTUFTSykpKSB7Ci0JCQkJLyogQWRkIGZhaWxlZCBkdWUgdG8gb3ZlcmxhcC4gIEZsdXNoIGV2ZXJ5dGhpbmcKLQkJCQkgKiBhbmQgd2FpdCBhIHdoaWxlCi0JCQkJICovCi0JCQkJcmFpZDZfdW5wbHVnX2RldmljZShtZGRldi0+cXVldWUpOwotCQkJCXJlbGVhc2Vfc3RyaXBlKHNoKTsKLQkJCQlzY2hlZHVsZSgpOwotCQkJCWdvdG8gcmV0cnk7Ci0JCQl9Ci0JCQlmaW5pc2hfd2FpdCgmY29uZi0+d2FpdF9mb3Jfb3ZlcmxhcCwgJncpOwotCQkJcmFpZDZfcGx1Z19kZXZpY2UoY29uZik7Ci0JCQloYW5kbGVfc3RyaXBlKHNoLCBOVUxMKTsKLQkJCXJlbGVhc2Vfc3RyaXBlKHNoKTsKLQkJfSBlbHNlIHsKLQkJCS8qIGNhbm5vdCBnZXQgc3RyaXBlIGZvciByZWFkLWFoZWFkLCBqdXN0IGdpdmUtdXAgKi8KLQkJCWNsZWFyX2JpdChCSU9fVVBUT0RBVEUsICZiaS0+YmlfZmxhZ3MpOwotCQkJZmluaXNoX3dhaXQoJmNvbmYtPndhaXRfZm9yX292ZXJsYXAsICZ3KTsKLQkJCWJyZWFrOwotCQl9Ci0KLQl9Ci0Jc3Bpbl9sb2NrX2lycSgmY29uZi0+ZGV2aWNlX2xvY2spOwotCWlmICgtLWJpLT5iaV9waHlzX3NlZ21lbnRzID09IDApIHsKLQkJaW50IGJ5dGVzID0gYmktPmJpX3NpemU7Ci0KLQkJaWYgKHJ3ID09IFdSSVRFICkKLQkJCW1kX3dyaXRlX2VuZChtZGRldik7Ci0JCWJpLT5iaV9zaXplID0gMDsKLQkJYmktPmJpX2VuZF9pbyhiaSwgYnl0ZXMsIDApOwotCX0KLQlzcGluX3VubG9ja19pcnEoJmNvbmYtPmRldmljZV9sb2NrKTsKLQlyZXR1cm4gMDsKLX0KLQotLyogRklYTUUgZ29fZmFzdGVyIGlzbid0IHVzZWQgKi8KLXN0YXRpYyBzZWN0b3JfdCBzeW5jX3JlcXVlc3QobWRkZXZfdCAqbWRkZXYsIHNlY3Rvcl90IHNlY3Rvcl9uciwgaW50ICpza2lwcGVkLCBpbnQgZ29fZmFzdGVyKQotewotCXJhaWQ2X2NvbmZfdCAqY29uZiA9IChyYWlkNl9jb25mX3QgKikgbWRkZXYtPnByaXZhdGU7Ci0Jc3RydWN0IHN0cmlwZV9oZWFkICpzaDsKLQlpbnQgc2VjdG9yc19wZXJfY2h1bmsgPSBjb25mLT5jaHVua19zaXplID4+IDk7Ci0Jc2VjdG9yX3QgeDsKLQl1bnNpZ25lZCBsb25nIHN0cmlwZTsKLQlpbnQgY2h1bmtfb2Zmc2V0OwotCWludCBkZF9pZHgsIHBkX2lkeDsKLQlzZWN0b3JfdCBmaXJzdF9zZWN0b3I7Ci0JaW50IHJhaWRfZGlza3MgPSBjb25mLT5yYWlkX2Rpc2tzOwotCWludCBkYXRhX2Rpc2tzID0gcmFpZF9kaXNrcyAtIDI7Ci0Jc2VjdG9yX3QgbWF4X3NlY3RvciA9IG1kZGV2LT5zaXplIDw8IDE7Ci0JaW50IHN5bmNfYmxvY2tzOwotCWludCBzdGlsbF9kZWdyYWRlZCA9IDA7Ci0JaW50IGk7Ci0KLQlpZiAoc2VjdG9yX25yID49IG1heF9zZWN0b3IpIHsKLQkJLyoganVzdCBiZWluZyB0b2xkIHRvIGZpbmlzaCB1cCAuLiBub3RoaW5nIG11Y2ggdG8gZG8gKi8KLQkJdW5wbHVnX3NsYXZlcyhtZGRldik7Ci0KLQkJaWYgKG1kZGV2LT5jdXJyX3Jlc3luYyA8IG1heF9zZWN0b3IpIC8qIGFib3J0ZWQgKi8KLQkJCWJpdG1hcF9lbmRfc3luYyhtZGRldi0+Yml0bWFwLCBtZGRldi0+Y3Vycl9yZXN5bmMsCi0JCQkJCSZzeW5jX2Jsb2NrcywgMSk7Ci0JCWVsc2UgLyogY29tcGxldGVkIHN5bmMgKi8KLQkJCWNvbmYtPmZ1bGxzeW5jID0gMDsKLQkJYml0bWFwX2Nsb3NlX3N5bmMobWRkZXYtPmJpdG1hcCk7Ci0KLQkJcmV0dXJuIDA7Ci0JfQotCS8qIGlmIHRoZXJlIGFyZSAyIG9yIG1vcmUgZmFpbGVkIGRyaXZlcyBhbmQgd2UgYXJlIHRyeWluZwotCSAqIHRvIHJlc3luYywgdGhlbiBhc3NlcnQgdGhhdCB3ZSBhcmUgZmluaXNoZWQsIGJlY2F1c2UgdGhlcmUgaXMKLQkgKiBub3RoaW5nIHdlIGNhbiBkby4KLQkgKi8KLQlpZiAobWRkZXYtPmRlZ3JhZGVkID49IDIgJiYgdGVzdF9iaXQoTURfUkVDT1ZFUllfU1lOQywgJm1kZGV2LT5yZWNvdmVyeSkpIHsKLQkJc2VjdG9yX3QgcnYgPSAobWRkZXYtPnNpemUgPDwgMSkgLSBzZWN0b3JfbnI7Ci0JCSpza2lwcGVkID0gMTsKLQkJcmV0dXJuIHJ2OwotCX0KLQlpZiAoIWJpdG1hcF9zdGFydF9zeW5jKG1kZGV2LT5iaXRtYXAsIHNlY3Rvcl9uciwgJnN5bmNfYmxvY2tzLCAxKSAmJgotCSAgICAhdGVzdF9iaXQoTURfUkVDT1ZFUllfUkVRVUVTVEVELCAmbWRkZXYtPnJlY292ZXJ5KSAmJgotCSAgICAhY29uZi0+ZnVsbHN5bmMgJiYgc3luY19ibG9ja3MgPj0gU1RSSVBFX1NFQ1RPUlMpIHsKLQkJLyogd2UgY2FuIHNraXAgdGhpcyBibG9jaywgYW5kIHByb2JhYmx5IG1vcmUgKi8KLQkJc3luY19ibG9ja3MgLz0gU1RSSVBFX1NFQ1RPUlM7Ci0JCSpza2lwcGVkID0gMTsKLQkJcmV0dXJuIHN5bmNfYmxvY2tzICogU1RSSVBFX1NFQ1RPUlM7IC8qIGtlZXAgdGhpbmdzIHJvdW5kZWQgdG8gd2hvbGUgc3RyaXBlcyAqLwotCX0KLQotCXggPSBzZWN0b3JfbnI7Ci0JY2h1bmtfb2Zmc2V0ID0gc2VjdG9yX2Rpdih4LCBzZWN0b3JzX3Blcl9jaHVuayk7Ci0Jc3RyaXBlID0geDsKLQlCVUdfT04oeCAhPSBzdHJpcGUpOwotCi0JZmlyc3Rfc2VjdG9yID0gcmFpZDZfY29tcHV0ZV9zZWN0b3IoKHNlY3Rvcl90KXN0cmlwZSpkYXRhX2Rpc2tzKnNlY3RvcnNfcGVyX2NodW5rCi0JCSsgY2h1bmtfb2Zmc2V0LCByYWlkX2Rpc2tzLCBkYXRhX2Rpc2tzLCAmZGRfaWR4LCAmcGRfaWR4LCBjb25mKTsKLQlzaCA9IGdldF9hY3RpdmVfc3RyaXBlKGNvbmYsIHNlY3Rvcl9uciwgcGRfaWR4LCAxKTsKLQlpZiAoc2ggPT0gTlVMTCkgewotCQlzaCA9IGdldF9hY3RpdmVfc3RyaXBlKGNvbmYsIHNlY3Rvcl9uciwgcGRfaWR4LCAwKTsKLQkJLyogbWFrZSBzdXJlIHdlIGRvbid0IHN3YW1wIHRoZSBzdHJpcGUgY2FjaGUgaWYgc29tZW9uZSBlbHNlCi0JCSAqIGlzIHRyeWluZyB0byBnZXQgYWNjZXNzCi0JCSAqLwotCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSgxKTsKLQl9Ci0JLyogTmVlZCB0byBjaGVjayBpZiBhcnJheSB3aWxsIHN0aWxsIGJlIGRlZ3JhZGVkIGFmdGVyIHJlY292ZXJ5L3Jlc3luYwotCSAqIFdlIGRvbid0IG5lZWQgdG8gY2hlY2sgdGhlICdmYWlsZWQnIGZsYWcgYXMgd2hlbiB0aGF0IGdldHMgc2V0LAotCSAqIHJlY292ZXJ5IGFib3J0cy4KLQkgKi8KLQlmb3IgKGk9MDsgaTxtZGRldi0+cmFpZF9kaXNrczsgaSsrKQotCQlpZiAoY29uZi0+ZGlza3NbaV0ucmRldiA9PSBOVUxMKQotCQkJc3RpbGxfZGVncmFkZWQgPSAxOwotCi0JYml0bWFwX3N0YXJ0X3N5bmMobWRkZXYtPmJpdG1hcCwgc2VjdG9yX25yLCAmc3luY19ibG9ja3MsIHN0aWxsX2RlZ3JhZGVkKTsKLQotCXNwaW5fbG9jaygmc2gtPmxvY2spOwotCXNldF9iaXQoU1RSSVBFX1NZTkNJTkcsICZzaC0+c3RhdGUpOwotCWNsZWFyX2JpdChTVFJJUEVfSU5TWU5DLCAmc2gtPnN0YXRlKTsKLQlzcGluX3VubG9jaygmc2gtPmxvY2spOwotCi0JaGFuZGxlX3N0cmlwZShzaCwgTlVMTCk7Ci0JcmVsZWFzZV9zdHJpcGUoc2gpOwotCi0JcmV0dXJuIFNUUklQRV9TRUNUT1JTOwotfQotCi0vKgotICogVGhpcyBpcyBvdXIgcmFpZDYga2VybmVsIHRocmVhZC4KLSAqCi0gKiBXZSBzY2FuIHRoZSBoYXNoIHRhYmxlIGZvciBzdHJpcGVzIHdoaWNoIGNhbiBiZSBoYW5kbGVkIG5vdy4KLSAqIER1cmluZyB0aGUgc2NhbiwgY29tcGxldGVkIHN0cmlwZXMgYXJlIHNhdmVkIGZvciB1cyBieSB0aGUgaW50ZXJydXB0Ci0gKiBoYW5kbGVyLCBzbyB0aGF0IHRoZXkgd2lsbCBub3QgaGF2ZSB0byB3YWl0IGZvciBvdXIgbmV4dCB3YWtldXAuCi0gKi8KLXN0YXRpYyB2b2lkIHJhaWQ2ZCAobWRkZXZfdCAqbWRkZXYpCi17Ci0Jc3RydWN0IHN0cmlwZV9oZWFkICpzaDsKLQlyYWlkNl9jb25mX3QgKmNvbmYgPSBtZGRldl90b19jb25mKG1kZGV2KTsKLQlpbnQgaGFuZGxlZDsKLQotCVBSSU5USygiKysrIHJhaWQ2ZCBhY3RpdmVcbiIpOwotCi0JbWRfY2hlY2tfcmVjb3ZlcnkobWRkZXYpOwotCi0JaGFuZGxlZCA9IDA7Ci0Jc3Bpbl9sb2NrX2lycSgmY29uZi0+ZGV2aWNlX2xvY2spOwotCXdoaWxlICgxKSB7Ci0JCXN0cnVjdCBsaXN0X2hlYWQgKmZpcnN0OwotCi0JCWlmIChjb25mLT5zZXFfZmx1c2ggLSBjb25mLT5zZXFfd3JpdGUgPiAwKSB7Ci0JCQlpbnQgc2VxID0gY29uZi0+c2VxX2ZsdXNoOwotCQkJc3Bpbl91bmxvY2tfaXJxKCZjb25mLT5kZXZpY2VfbG9jayk7Ci0JCQliaXRtYXBfdW5wbHVnKG1kZGV2LT5iaXRtYXApOwotCQkJc3Bpbl9sb2NrX2lycSgmY29uZi0+ZGV2aWNlX2xvY2spOwotCQkJY29uZi0+c2VxX3dyaXRlID0gc2VxOwotCQkJYWN0aXZhdGVfYml0X2RlbGF5KGNvbmYpOwotCQl9Ci0KLQkJaWYgKGxpc3RfZW1wdHkoJmNvbmYtPmhhbmRsZV9saXN0KSAmJgotCQkgICAgYXRvbWljX3JlYWQoJmNvbmYtPnByZXJlYWRfYWN0aXZlX3N0cmlwZXMpIDwgSU9fVEhSRVNIT0xEICYmCi0JCSAgICAhYmxrX3F1ZXVlX3BsdWdnZWQobWRkZXYtPnF1ZXVlKSAmJgotCQkgICAgIWxpc3RfZW1wdHkoJmNvbmYtPmRlbGF5ZWRfbGlzdCkpCi0JCQlyYWlkNl9hY3RpdmF0ZV9kZWxheWVkKGNvbmYpOwotCi0JCWlmIChsaXN0X2VtcHR5KCZjb25mLT5oYW5kbGVfbGlzdCkpCi0JCQlicmVhazsKLQotCQlmaXJzdCA9IGNvbmYtPmhhbmRsZV9saXN0Lm5leHQ7Ci0JCXNoID0gbGlzdF9lbnRyeShmaXJzdCwgc3RydWN0IHN0cmlwZV9oZWFkLCBscnUpOwotCi0JCWxpc3RfZGVsX2luaXQoZmlyc3QpOwotCQlhdG9taWNfaW5jKCZzaC0+Y291bnQpOwotCQlCVUdfT04oYXRvbWljX3JlYWQoJnNoLT5jb3VudCkhPSAxKTsKLQkJc3Bpbl91bmxvY2tfaXJxKCZjb25mLT5kZXZpY2VfbG9jayk7Ci0KLQkJaGFuZGxlZCsrOwotCQloYW5kbGVfc3RyaXBlKHNoLCBjb25mLT5zcGFyZV9wYWdlKTsKLQkJcmVsZWFzZV9zdHJpcGUoc2gpOwotCi0JCXNwaW5fbG9ja19pcnEoJmNvbmYtPmRldmljZV9sb2NrKTsKLQl9Ci0JUFJJTlRLKCIlZCBzdHJpcGVzIGhhbmRsZWRcbiIsIGhhbmRsZWQpOwotCi0Jc3Bpbl91bmxvY2tfaXJxKCZjb25mLT5kZXZpY2VfbG9jayk7Ci0KLQl1bnBsdWdfc2xhdmVzKG1kZGV2KTsKLQotCVBSSU5USygiLS0tIHJhaWQ2ZCBpbmFjdGl2ZVxuIik7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90Ci1yYWlkNl9zaG93X3N0cmlwZV9jYWNoZV9zaXplKG1kZGV2X3QgKm1kZGV2LCBjaGFyICpwYWdlKQotewotCXJhaWQ2X2NvbmZfdCAqY29uZiA9IG1kZGV2X3RvX2NvbmYobWRkZXYpOwotCWlmIChjb25mKQotCQlyZXR1cm4gc3ByaW50ZihwYWdlLCAiJWRcbiIsIGNvbmYtPm1heF9ucl9zdHJpcGVzKTsKLQllbHNlCi0JCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3NpemVfdAotcmFpZDZfc3RvcmVfc3RyaXBlX2NhY2hlX3NpemUobWRkZXZfdCAqbWRkZXYsIGNvbnN0IGNoYXIgKnBhZ2UsIHNpemVfdCBsZW4pCi17Ci0JcmFpZDZfY29uZl90ICpjb25mID0gbWRkZXZfdG9fY29uZihtZGRldik7Ci0JY2hhciAqZW5kOwotCWludCBuZXc7Ci0JaWYgKGxlbiA+PSBQQUdFX1NJWkUpCi0JCXJldHVybiAtRUlOVkFMOwotCWlmICghY29uZikKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQluZXcgPSBzaW1wbGVfc3RydG91bChwYWdlLCAmZW5kLCAxMCk7Ci0JaWYgKCEqcGFnZSB8fCAoKmVuZCAmJiAqZW5kICE9ICdcbicpICkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKG5ldyA8PSAxNiB8fCBuZXcgPiAzMjc2OCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0Jd2hpbGUgKG5ldyA8IGNvbmYtPm1heF9ucl9zdHJpcGVzKSB7Ci0JCWlmIChkcm9wX29uZV9zdHJpcGUoY29uZikpCi0JCQljb25mLT5tYXhfbnJfc3RyaXBlcy0tOwotCQllbHNlCi0JCQlicmVhazsKLQl9Ci0Jd2hpbGUgKG5ldyA+IGNvbmYtPm1heF9ucl9zdHJpcGVzKSB7Ci0JCWlmIChncm93X29uZV9zdHJpcGUoY29uZikpCi0JCQljb25mLT5tYXhfbnJfc3RyaXBlcysrOwotCQllbHNlIGJyZWFrOwotCX0KLQlyZXR1cm4gbGVuOwotfQotCi1zdGF0aWMgc3RydWN0IG1kX3N5c2ZzX2VudHJ5Ci1yYWlkNl9zdHJpcGVjYWNoZV9zaXplID0gX19BVFRSKHN0cmlwZV9jYWNoZV9zaXplLCBTX0lSVUdPIHwgU19JV1VTUiwKLQkJCQlyYWlkNl9zaG93X3N0cmlwZV9jYWNoZV9zaXplLAotCQkJCXJhaWQ2X3N0b3JlX3N0cmlwZV9jYWNoZV9zaXplKTsKLQotc3RhdGljIHNzaXplX3QKLXN0cmlwZV9jYWNoZV9hY3RpdmVfc2hvdyhtZGRldl90ICptZGRldiwgY2hhciAqcGFnZSkKLXsKLQlyYWlkNl9jb25mX3QgKmNvbmYgPSBtZGRldl90b19jb25mKG1kZGV2KTsKLQlpZiAoY29uZikKLQkJcmV0dXJuIHNwcmludGYocGFnZSwgIiVkXG4iLCBhdG9taWNfcmVhZCgmY29uZi0+YWN0aXZlX3N0cmlwZXMpKTsKLQllbHNlCi0JCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IG1kX3N5c2ZzX2VudHJ5Ci1yYWlkNl9zdHJpcGVjYWNoZV9hY3RpdmUgPSBfX0FUVFJfUk8oc3RyaXBlX2NhY2hlX2FjdGl2ZSk7Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpyYWlkNl9hdHRyc1tdID0gIHsKLQkmcmFpZDZfc3RyaXBlY2FjaGVfc2l6ZS5hdHRyLAotCSZyYWlkNl9zdHJpcGVjYWNoZV9hY3RpdmUuYXR0ciwKLQlOVUxMLAotfTsKLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHJhaWQ2X2F0dHJzX2dyb3VwID0gewotCS5uYW1lID0gTlVMTCwKLQkuYXR0cnMgPSByYWlkNl9hdHRycywKLX07Ci0KLXN0YXRpYyBpbnQgcnVuKG1kZGV2X3QgKm1kZGV2KQotewotCXJhaWQ2X2NvbmZfdCAqY29uZjsKLQlpbnQgcmFpZF9kaXNrLCBtZW1vcnk7Ci0JbWRrX3JkZXZfdCAqcmRldjsKLQlzdHJ1Y3QgZGlza19pbmZvICpkaXNrOwotCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKLQotCWlmIChtZGRldi0+bGV2ZWwgIT0gNikgewotCQlQUklOVEsoInJhaWQ2OiAlczogcmFpZCBsZXZlbCBub3Qgc2V0IHRvIDYgKCVkKVxuIiwgbWRuYW1lKG1kZGV2KSwgbWRkZXYtPmxldmVsKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JbWRkZXYtPnByaXZhdGUgPSBremFsbG9jKHNpemVvZiAocmFpZDZfY29uZl90KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKChjb25mID0gbWRkZXYtPnByaXZhdGUpID09IE5VTEwpCi0JCWdvdG8gYWJvcnQ7Ci0JY29uZi0+ZGlza3MgPSBremFsbG9jKG1kZGV2LT5yYWlkX2Rpc2tzICogc2l6ZW9mKHN0cnVjdCBkaXNrX2luZm8pLAotCQkJCSBHRlBfS0VSTkVMKTsKLQlpZiAoIWNvbmYtPmRpc2tzKQotCQlnb3RvIGFib3J0OwotCi0JY29uZi0+bWRkZXYgPSBtZGRldjsKLQotCWlmICgoY29uZi0+c3RyaXBlX2hhc2h0YmwgPSBremFsbG9jKFBBR0VfU0laRSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCi0JCWdvdG8gYWJvcnQ7Ci0KLQljb25mLT5zcGFyZV9wYWdlID0gYWxsb2NfcGFnZShHRlBfS0VSTkVMKTsKLQlpZiAoIWNvbmYtPnNwYXJlX3BhZ2UpCi0JCWdvdG8gYWJvcnQ7Ci0KLQlzcGluX2xvY2tfaW5pdCgmY29uZi0+ZGV2aWNlX2xvY2spOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmNvbmYtPndhaXRfZm9yX3N0cmlwZSk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmY29uZi0+d2FpdF9mb3Jfb3ZlcmxhcCk7Ci0JSU5JVF9MSVNUX0hFQUQoJmNvbmYtPmhhbmRsZV9saXN0KTsKLQlJTklUX0xJU1RfSEVBRCgmY29uZi0+ZGVsYXllZF9saXN0KTsKLQlJTklUX0xJU1RfSEVBRCgmY29uZi0+Yml0bWFwX2xpc3QpOwotCUlOSVRfTElTVF9IRUFEKCZjb25mLT5pbmFjdGl2ZV9saXN0KTsKLQlhdG9taWNfc2V0KCZjb25mLT5hY3RpdmVfc3RyaXBlcywgMCk7Ci0JYXRvbWljX3NldCgmY29uZi0+cHJlcmVhZF9hY3RpdmVfc3RyaXBlcywgMCk7Ci0KLQlQUklOVEsoInJhaWQ2OiBydW4oJXMpIGNhbGxlZC5cbiIsIG1kbmFtZShtZGRldikpOwotCi0JSVRFUkFURV9SREVWKG1kZGV2LHJkZXYsdG1wKSB7Ci0JCXJhaWRfZGlzayA9IHJkZXYtPnJhaWRfZGlzazsKLQkJaWYgKHJhaWRfZGlzayA+PSBtZGRldi0+cmFpZF9kaXNrcwotCQkgICAgfHwgcmFpZF9kaXNrIDwgMCkKLQkJCWNvbnRpbnVlOwotCQlkaXNrID0gY29uZi0+ZGlza3MgKyByYWlkX2Rpc2s7Ci0KLQkJZGlzay0+cmRldiA9IHJkZXY7Ci0KLQkJaWYgKHRlc3RfYml0KEluX3N5bmMsICZyZGV2LT5mbGFncykpIHsKLQkJCWNoYXIgYltCREVWTkFNRV9TSVpFXTsKLQkJCXByaW50ayhLRVJOX0lORk8gInJhaWQ2OiBkZXZpY2UgJXMgb3BlcmF0aW9uYWwgYXMgcmFpZCIKLQkJCSAgICAgICAiIGRpc2sgJWRcbiIsIGJkZXZuYW1lKHJkZXYtPmJkZXYsYiksCi0JCQkgICAgICAgcmFpZF9kaXNrKTsKLQkJCWNvbmYtPndvcmtpbmdfZGlza3MrKzsKLQkJfQotCX0KLQotCWNvbmYtPnJhaWRfZGlza3MgPSBtZGRldi0+cmFpZF9kaXNrczsKLQotCS8qCi0JICogMCBmb3IgYSBmdWxseSBmdW5jdGlvbmFsIGFycmF5LCAxIG9yIDIgZm9yIGEgZGVncmFkZWQgYXJyYXkuCi0JICovCi0JbWRkZXYtPmRlZ3JhZGVkID0gY29uZi0+ZmFpbGVkX2Rpc2tzID0gY29uZi0+cmFpZF9kaXNrcyAtIGNvbmYtPndvcmtpbmdfZGlza3M7Ci0JY29uZi0+bWRkZXYgPSBtZGRldjsKLQljb25mLT5jaHVua19zaXplID0gbWRkZXYtPmNodW5rX3NpemU7Ci0JY29uZi0+bGV2ZWwgPSBtZGRldi0+bGV2ZWw7Ci0JY29uZi0+YWxnb3JpdGhtID0gbWRkZXYtPmxheW91dDsKLQljb25mLT5tYXhfbnJfc3RyaXBlcyA9IE5SX1NUUklQRVM7Ci0KLQkvKiBkZXZpY2Ugc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgY2h1bmsgc2l6ZSAqLwotCW1kZGV2LT5zaXplICY9IH4obWRkZXYtPmNodW5rX3NpemUvMTAyNCAtMSk7Ci0JbWRkZXYtPnJlc3luY19tYXhfc2VjdG9ycyA9IG1kZGV2LT5zaXplIDw8IDE7Ci0KLQlpZiAoY29uZi0+cmFpZF9kaXNrcyA8IDQpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJyYWlkNjogbm90IGVub3VnaCBjb25maWd1cmVkIGRldmljZXMgZm9yICVzICglZCwgbWluaW11bSA0KVxuIiwKLQkJICAgICAgIG1kbmFtZShtZGRldiksIGNvbmYtPnJhaWRfZGlza3MpOwotCQlnb3RvIGFib3J0OwotCX0KLQlpZiAoIWNvbmYtPmNodW5rX3NpemUgfHwgY29uZi0+Y2h1bmtfc2l6ZSAlIDQpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJyYWlkNjogaW52YWxpZCBjaHVuayBzaXplICVkIGZvciAlc1xuIiwKLQkJICAgICAgIGNvbmYtPmNodW5rX3NpemUsIG1kbmFtZShtZGRldikpOwotCQlnb3RvIGFib3J0OwotCX0KLQlpZiAoY29uZi0+YWxnb3JpdGhtID4gQUxHT1JJVEhNX1JJR0hUX1NZTU1FVFJJQykgewotCQlwcmludGsoS0VSTl9FUlIKLQkJICAgICAgICJyYWlkNjogdW5zdXBwb3J0ZWQgcGFyaXR5IGFsZ29yaXRobSAlZCBmb3IgJXNcbiIsCi0JCSAgICAgICBjb25mLT5hbGdvcml0aG0sIG1kbmFtZShtZGRldikpOwotCQlnb3RvIGFib3J0OwotCX0KLQlpZiAobWRkZXYtPmRlZ3JhZGVkID4gMikgewotCQlwcmludGsoS0VSTl9FUlIgInJhaWQ2OiBub3QgZW5vdWdoIG9wZXJhdGlvbmFsIGRldmljZXMgZm9yICVzIgotCQkgICAgICAgIiAoJWQvJWQgZmFpbGVkKVxuIiwKLQkJICAgICAgIG1kbmFtZShtZGRldiksIGNvbmYtPmZhaWxlZF9kaXNrcywgY29uZi0+cmFpZF9kaXNrcyk7Ci0JCWdvdG8gYWJvcnQ7Ci0JfQotCi0JaWYgKG1kZGV2LT5kZWdyYWRlZCA+IDAgJiYKLQkgICAgbWRkZXYtPnJlY292ZXJ5X2NwICE9IE1heFNlY3RvcikgewotCQlpZiAobWRkZXYtPm9rX3N0YXJ0X2RlZ3JhZGVkKQotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAicmFpZDY6IHN0YXJ0aW5nIGRpcnR5IGRlZ3JhZGVkIGFycmF5OiVzIgotCQkJICAgICAgICItIGRhdGEgY29ycnVwdGlvbiBwb3NzaWJsZS5cbiIsCi0JCQkgICAgICAgbWRuYW1lKG1kZGV2KSk7Ci0JCWVsc2UgewotCQkJcHJpbnRrKEtFUk5fRVJSICJyYWlkNjogY2Fubm90IHN0YXJ0IGRpcnR5IGRlZ3JhZGVkIGFycmF5IgotCQkJICAgICAgICIgZm9yICVzXG4iLCBtZG5hbWUobWRkZXYpKTsKLQkJCWdvdG8gYWJvcnQ7Ci0JCX0KLQl9Ci0KLQl7Ci0JCW1kZGV2LT50aHJlYWQgPSBtZF9yZWdpc3Rlcl90aHJlYWQocmFpZDZkLCBtZGRldiwgIiVzX3JhaWQ2Iik7Ci0JCWlmICghbWRkZXYtPnRocmVhZCkgewotCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkgICAgICAgInJhaWQ2OiBjb3VsZG4ndCBhbGxvY2F0ZSB0aHJlYWQgZm9yICVzXG4iLAotCQkJICAgICAgIG1kbmFtZShtZGRldikpOwotCQkJZ290byBhYm9ydDsKLQkJfQotCX0KLQotCW1lbW9yeSA9IGNvbmYtPm1heF9ucl9zdHJpcGVzICogKHNpemVvZihzdHJ1Y3Qgc3RyaXBlX2hlYWQpICsKLQkJIGNvbmYtPnJhaWRfZGlza3MgKiAoKHNpemVvZihzdHJ1Y3QgYmlvKSArIFBBR0VfU0laRSkpKSAvIDEwMjQ7Ci0JaWYgKGdyb3dfc3RyaXBlcyhjb25mLCBjb25mLT5tYXhfbnJfc3RyaXBlcykpIHsKLQkJcHJpbnRrKEtFUk5fRVJSCi0JCSAgICAgICAicmFpZDY6IGNvdWxkbid0IGFsbG9jYXRlICVka0IgZm9yIGJ1ZmZlcnNcbiIsIG1lbW9yeSk7Ci0JCXNocmlua19zdHJpcGVzKGNvbmYpOwotCQltZF91bnJlZ2lzdGVyX3RocmVhZChtZGRldi0+dGhyZWFkKTsKLQkJZ290byBhYm9ydDsKLQl9IGVsc2UKLQkJcHJpbnRrKEtFUk5fSU5GTyAicmFpZDY6IGFsbG9jYXRlZCAlZGtCIGZvciAlc1xuIiwKLQkJICAgICAgIG1lbW9yeSwgbWRuYW1lKG1kZGV2KSk7Ci0KLQlpZiAobWRkZXYtPmRlZ3JhZGVkID09IDApCi0JCXByaW50ayhLRVJOX0lORk8gInJhaWQ2OiByYWlkIGxldmVsICVkIHNldCAlcyBhY3RpdmUgd2l0aCAlZCBvdXQgb2YgJWQiCi0JCSAgICAgICAiIGRldmljZXMsIGFsZ29yaXRobSAlZFxuIiwgY29uZi0+bGV2ZWwsIG1kbmFtZShtZGRldiksCi0JCSAgICAgICBtZGRldi0+cmFpZF9kaXNrcy1tZGRldi0+ZGVncmFkZWQsIG1kZGV2LT5yYWlkX2Rpc2tzLAotCQkgICAgICAgY29uZi0+YWxnb3JpdGhtKTsKLQllbHNlCi0JCXByaW50ayhLRVJOX0FMRVJUICJyYWlkNjogcmFpZCBsZXZlbCAlZCBzZXQgJXMgYWN0aXZlIHdpdGggJWQiCi0JCSAgICAgICAiIG91dCBvZiAlZCBkZXZpY2VzLCBhbGdvcml0aG0gJWRcbiIsIGNvbmYtPmxldmVsLAotCQkgICAgICAgbWRuYW1lKG1kZGV2KSwgbWRkZXYtPnJhaWRfZGlza3MgLSBtZGRldi0+ZGVncmFkZWQsCi0JCSAgICAgICBtZGRldi0+cmFpZF9kaXNrcywgY29uZi0+YWxnb3JpdGhtKTsKLQotCXByaW50X3JhaWQ2X2NvbmYoY29uZik7Ci0KLQkvKiByZWFkLWFoZWFkIHNpemUgbXVzdCBjb3ZlciB0d28gd2hvbGUgc3RyaXBlcywgd2hpY2ggaXMKLQkgKiAyICogKG4tMikgKiBjaHVua3NpemUgd2hlcmUgJ24nIGlzIHRoZSBudW1iZXIgb2YgcmFpZCBkZXZpY2VzCi0JICovCi0JewotCQlpbnQgc3RyaXBlID0gKG1kZGV2LT5yYWlkX2Rpc2tzLTIpICogbWRkZXYtPmNodW5rX3NpemUKLQkJCS8gUEFHRV9TSVpFOwotCQlpZiAobWRkZXYtPnF1ZXVlLT5iYWNraW5nX2Rldl9pbmZvLnJhX3BhZ2VzIDwgMiAqIHN0cmlwZSkKLQkJCW1kZGV2LT5xdWV1ZS0+YmFja2luZ19kZXZfaW5mby5yYV9wYWdlcyA9IDIgKiBzdHJpcGU7Ci0JfQotCi0JLyogT2ssIGV2ZXJ5dGhpbmcgaXMganVzdCBmaW5lIG5vdyAqLwotCXN5c2ZzX2NyZWF0ZV9ncm91cCgmbWRkZXYtPmtvYmosICZyYWlkNl9hdHRyc19ncm91cCk7Ci0KLQltZGRldi0+YXJyYXlfc2l6ZSA9ICBtZGRldi0+c2l6ZSAqIChtZGRldi0+cmFpZF9kaXNrcyAtIDIpOwotCi0JbWRkZXYtPnF1ZXVlLT51bnBsdWdfZm4gPSByYWlkNl91bnBsdWdfZGV2aWNlOwotCW1kZGV2LT5xdWV1ZS0+aXNzdWVfZmx1c2hfZm4gPSByYWlkNl9pc3N1ZV9mbHVzaDsKLQlyZXR1cm4gMDsKLWFib3J0OgotCWlmIChjb25mKSB7Ci0JCXByaW50X3JhaWQ2X2NvbmYoY29uZik7Ci0JCXNhZmVfcHV0X3BhZ2UoY29uZi0+c3BhcmVfcGFnZSk7Ci0JCWtmcmVlKGNvbmYtPnN0cmlwZV9oYXNodGJsKTsKLQkJa2ZyZWUoY29uZi0+ZGlza3MpOwotCQlrZnJlZShjb25mKTsKLQl9Ci0JbWRkZXYtPnByaXZhdGUgPSBOVUxMOwotCXByaW50ayhLRVJOX0FMRVJUICJyYWlkNjogZmFpbGVkIHRvIHJ1biByYWlkIHNldCAlc1xuIiwgbWRuYW1lKG1kZGV2KSk7Ci0JcmV0dXJuIC1FSU87Ci19Ci0KLQotCi1zdGF0aWMgaW50IHN0b3AgKG1kZGV2X3QgKm1kZGV2KQotewotCXJhaWQ2X2NvbmZfdCAqY29uZiA9IChyYWlkNl9jb25mX3QgKikgbWRkZXYtPnByaXZhdGU7Ci0KLQltZF91bnJlZ2lzdGVyX3RocmVhZChtZGRldi0+dGhyZWFkKTsKLQltZGRldi0+dGhyZWFkID0gTlVMTDsKLQlzaHJpbmtfc3RyaXBlcyhjb25mKTsKLQlrZnJlZShjb25mLT5zdHJpcGVfaGFzaHRibCk7Ci0JYmxrX3N5bmNfcXVldWUobWRkZXYtPnF1ZXVlKTsgLyogdGhlIHVucGx1ZyBmbiByZWZlcmVuY2VzICdjb25mJyovCi0Jc3lzZnNfcmVtb3ZlX2dyb3VwKCZtZGRldi0+a29iaiwgJnJhaWQ2X2F0dHJzX2dyb3VwKTsKLQlrZnJlZShjb25mKTsKLQltZGRldi0+cHJpdmF0ZSA9IE5VTEw7Ci0JcmV0dXJuIDA7Ci19Ci0KLSNpZiBSQUlENl9EVU1QU1RBVEUKLXN0YXRpYyB2b2lkIHByaW50X3NoIChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgc3RydWN0IHN0cmlwZV9oZWFkICpzaCkKLXsKLQlpbnQgaTsKLQotCXNlcV9wcmludGYoc2VxLCAic2ggJWxsdSwgcGRfaWR4ICVkLCBzdGF0ZSAlbGQuXG4iLAotCQkgICAodW5zaWduZWQgbG9uZyBsb25nKXNoLT5zZWN0b3IsIHNoLT5wZF9pZHgsIHNoLT5zdGF0ZSk7Ci0Jc2VxX3ByaW50ZihzZXEsICJzaCAlbGx1LCAgY291bnQgJWQuXG4iLAotCQkgICAodW5zaWduZWQgbG9uZyBsb25nKXNoLT5zZWN0b3IsIGF0b21pY19yZWFkKCZzaC0+Y291bnQpKTsKLQlzZXFfcHJpbnRmKHNlcSwgInNoICVsbHUsICIsICh1bnNpZ25lZCBsb25nIGxvbmcpc2gtPnNlY3Rvcik7Ci0JZm9yIChpID0gMDsgaSA8IHNoLT5yYWlkX2NvbmYtPnJhaWRfZGlza3M7IGkrKykgewotCQlzZXFfcHJpbnRmKHNlcSwgIihjYWNoZSVkOiAlcCAlbGQpICIsCi0JCQkgICBpLCBzaC0+ZGV2W2ldLnBhZ2UsIHNoLT5kZXZbaV0uZmxhZ3MpOwotCX0KLQlzZXFfcHJpbnRmKHNlcSwgIlxuIik7Ci19Ci0KLXN0YXRpYyB2b2lkIHByaW50YWxsIChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgcmFpZDZfY29uZl90ICpjb25mKQotewotCXN0cnVjdCBzdHJpcGVfaGVhZCAqc2g7Ci0Jc3RydWN0IGhsaXN0X25vZGUgKmhuOwotCWludCBpOwotCi0Jc3Bpbl9sb2NrX2lycSgmY29uZi0+ZGV2aWNlX2xvY2spOwotCWZvciAoaSA9IDA7IGkgPCBOUl9IQVNIOyBpKyspIHsKLQkJc2ggPSBjb25mLT5zdHJpcGVfaGFzaHRibFtpXTsKLQkJaGxpc3RfZm9yX2VhY2hfZW50cnkoc2gsIGhuLCAmY29uZi0+c3RyaXBlX2hhc2h0YmxbaV0sIGhhc2gpIHsKLQkJCWlmIChzaC0+cmFpZF9jb25mICE9IGNvbmYpCi0JCQkJY29udGludWU7Ci0JCQlwcmludF9zaChzZXEsIHNoKTsKLQkJfQotCX0KLQlzcGluX3VubG9ja19pcnEoJmNvbmYtPmRldmljZV9sb2NrKTsKLX0KLSNlbmRpZgotCi1zdGF0aWMgdm9pZCBzdGF0dXMgKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBtZGRldl90ICptZGRldikKLXsKLQlyYWlkNl9jb25mX3QgKmNvbmYgPSAocmFpZDZfY29uZl90ICopIG1kZGV2LT5wcml2YXRlOwotCWludCBpOwotCi0Jc2VxX3ByaW50ZiAoc2VxLCAiIGxldmVsICVkLCAlZGsgY2h1bmssIGFsZ29yaXRobSAlZCIsIG1kZGV2LT5sZXZlbCwgbWRkZXYtPmNodW5rX3NpemUgPj4gMTAsIG1kZGV2LT5sYXlvdXQpOwotCXNlcV9wcmludGYgKHNlcSwgIiBbJWQvJWRdIFsiLCBjb25mLT5yYWlkX2Rpc2tzLCBjb25mLT53b3JraW5nX2Rpc2tzKTsKLQlmb3IgKGkgPSAwOyBpIDwgY29uZi0+cmFpZF9kaXNrczsgaSsrKQotIAkJc2VxX3ByaW50ZiAoc2VxLCAiJXMiLAotCQkJICAgIGNvbmYtPmRpc2tzW2ldLnJkZXYgJiYKLQkJCSAgICB0ZXN0X2JpdChJbl9zeW5jLCAmY29uZi0+ZGlza3NbaV0ucmRldi0+ZmxhZ3MpID8gIlUiIDogIl8iKTsKLQlzZXFfcHJpbnRmIChzZXEsICJdIik7Ci0jaWYgUkFJRDZfRFVNUFNUQVRFCi0Jc2VxX3ByaW50ZiAoc2VxLCAiXG4iKTsKLQlwcmludGFsbChzZXEsIGNvbmYpOwotI2VuZGlmCi19Ci0KLXN0YXRpYyB2b2lkIHByaW50X3JhaWQ2X2NvbmYgKHJhaWQ2X2NvbmZfdCAqY29uZikKLXsKLQlpbnQgaTsKLQlzdHJ1Y3QgZGlza19pbmZvICp0bXA7Ci0KLQlwcmludGsoIlJBSUQ2IGNvbmYgcHJpbnRvdXQ6XG4iKTsKLQlpZiAoIWNvbmYpIHsKLQkJcHJpbnRrKCIoY29uZj09TlVMTClcbiIpOwotCQlyZXR1cm47Ci0JfQotCXByaW50aygiIC0tLSByZDolZCB3ZDolZCBmZDolZFxuIiwgY29uZi0+cmFpZF9kaXNrcywKLQkJIGNvbmYtPndvcmtpbmdfZGlza3MsIGNvbmYtPmZhaWxlZF9kaXNrcyk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgY29uZi0+cmFpZF9kaXNrczsgaSsrKSB7Ci0JCWNoYXIgYltCREVWTkFNRV9TSVpFXTsKLQkJdG1wID0gY29uZi0+ZGlza3MgKyBpOwotCQlpZiAodG1wLT5yZGV2KQotCQlwcmludGsoIiBkaXNrICVkLCBvOiVkLCBkZXY6JXNcbiIsCi0JCQlpLCAhdGVzdF9iaXQoRmF1bHR5LCAmdG1wLT5yZGV2LT5mbGFncyksCi0JCQliZGV2bmFtZSh0bXAtPnJkZXYtPmJkZXYsYikpOwotCX0KLX0KLQotc3RhdGljIGludCByYWlkNl9zcGFyZV9hY3RpdmUobWRkZXZfdCAqbWRkZXYpCi17Ci0JaW50IGk7Ci0JcmFpZDZfY29uZl90ICpjb25mID0gbWRkZXYtPnByaXZhdGU7Ci0Jc3RydWN0IGRpc2tfaW5mbyAqdG1wOwotCi0JZm9yIChpID0gMDsgaSA8IGNvbmYtPnJhaWRfZGlza3M7IGkrKykgewotCQl0bXAgPSBjb25mLT5kaXNrcyArIGk7Ci0JCWlmICh0bXAtPnJkZXYKLQkJICAgICYmICF0ZXN0X2JpdChGYXVsdHksICZ0bXAtPnJkZXYtPmZsYWdzKQotCQkgICAgJiYgIXRlc3RfYml0KEluX3N5bmMsICZ0bXAtPnJkZXYtPmZsYWdzKSkgewotCQkJbWRkZXYtPmRlZ3JhZGVkLS07Ci0JCQljb25mLT5mYWlsZWRfZGlza3MtLTsKLQkJCWNvbmYtPndvcmtpbmdfZGlza3MrKzsKLQkJCXNldF9iaXQoSW5fc3luYywgJnRtcC0+cmRldi0+ZmxhZ3MpOwotCQl9Ci0JfQotCXByaW50X3JhaWQ2X2NvbmYoY29uZik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcmFpZDZfcmVtb3ZlX2Rpc2sobWRkZXZfdCAqbWRkZXYsIGludCBudW1iZXIpCi17Ci0JcmFpZDZfY29uZl90ICpjb25mID0gbWRkZXYtPnByaXZhdGU7Ci0JaW50IGVyciA9IDA7Ci0JbWRrX3JkZXZfdCAqcmRldjsKLQlzdHJ1Y3QgZGlza19pbmZvICpwID0gY29uZi0+ZGlza3MgKyBudW1iZXI7Ci0KLQlwcmludF9yYWlkNl9jb25mKGNvbmYpOwotCXJkZXYgPSBwLT5yZGV2OwotCWlmIChyZGV2KSB7Ci0JCWlmICh0ZXN0X2JpdChJbl9zeW5jLCAmcmRldi0+ZmxhZ3MpIHx8Ci0JCSAgICBhdG9taWNfcmVhZCgmcmRldi0+bnJfcGVuZGluZykpIHsKLQkJCWVyciA9IC1FQlVTWTsKLQkJCWdvdG8gYWJvcnQ7Ci0JCX0KLQkJcC0+cmRldiA9IE5VTEw7Ci0JCXN5bmNocm9uaXplX3JjdSgpOwotCQlpZiAoYXRvbWljX3JlYWQoJnJkZXYtPm5yX3BlbmRpbmcpKSB7Ci0JCQkvKiBsb3N0IHRoZSByYWNlLCB0cnkgbGF0ZXIgKi8KLQkJCWVyciA9IC1FQlVTWTsKLQkJCXAtPnJkZXYgPSByZGV2OwotCQl9Ci0JfQotCi1hYm9ydDoKLQotCXByaW50X3JhaWQ2X2NvbmYoY29uZik7Ci0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIGludCByYWlkNl9hZGRfZGlzayhtZGRldl90ICptZGRldiwgbWRrX3JkZXZfdCAqcmRldikKLXsKLQlyYWlkNl9jb25mX3QgKmNvbmYgPSBtZGRldi0+cHJpdmF0ZTsKLQlpbnQgZm91bmQgPSAwOwotCWludCBkaXNrOwotCXN0cnVjdCBkaXNrX2luZm8gKnA7Ci0KLQlpZiAobWRkZXYtPmRlZ3JhZGVkID4gMikKLQkJLyogbm8gcG9pbnQgYWRkaW5nIGEgZGV2aWNlICovCi0JCXJldHVybiAwOwotCS8qCi0JICogZmluZCB0aGUgZGlzayAuLi4gYnV0IHByZWZlciByZGV2LT5zYXZlZF9yYWlkX2Rpc2sKLQkgKiBpZiBwb3NzaWJsZS4KLQkgKi8KLQlpZiAocmRldi0+c2F2ZWRfcmFpZF9kaXNrID49IDAgJiYKLQkgICAgY29uZi0+ZGlza3NbcmRldi0+c2F2ZWRfcmFpZF9kaXNrXS5yZGV2ID09IE5VTEwpCi0JCWRpc2sgPSByZGV2LT5zYXZlZF9yYWlkX2Rpc2s7Ci0JZWxzZQotCQlkaXNrID0gMDsKLQlmb3IgKCA7IGRpc2sgPCBtZGRldi0+cmFpZF9kaXNrczsgZGlzaysrKQotCQlpZiAoKHA9Y29uZi0+ZGlza3MgKyBkaXNrKS0+cmRldiA9PSBOVUxMKSB7Ci0JCQljbGVhcl9iaXQoSW5fc3luYywgJnJkZXYtPmZsYWdzKTsKLQkJCXJkZXYtPnJhaWRfZGlzayA9IGRpc2s7Ci0JCQlmb3VuZCA9IDE7Ci0JCQlpZiAocmRldi0+c2F2ZWRfcmFpZF9kaXNrICE9IGRpc2spCi0JCQkJY29uZi0+ZnVsbHN5bmMgPSAxOwotCQkJcmN1X2Fzc2lnbl9wb2ludGVyKHAtPnJkZXYsIHJkZXYpOwotCQkJYnJlYWs7Ci0JCX0KLQlwcmludF9yYWlkNl9jb25mKGNvbmYpOwotCXJldHVybiBmb3VuZDsKLX0KLQotc3RhdGljIGludCByYWlkNl9yZXNpemUobWRkZXZfdCAqbWRkZXYsIHNlY3Rvcl90IHNlY3RvcnMpCi17Ci0JLyogbm8gcmVzeW5jIGlzIGhhcHBlbmluZywgYW5kIHRoZXJlIGlzIGVub3VnaCBzcGFjZQotCSAqIG9uIGFsbCBkZXZpY2VzLCBzbyB3ZSBjYW4gcmVzaXplLgotCSAqIFdlIG5lZWQgdG8gbWFrZSBzdXJlIHJlc3luYyBjb3ZlcnMgYW55IG5ldyBzcGFjZS4KLQkgKiBJZiB0aGUgYXJyYXkgaXMgc2hyaW5raW5nIHdlIHNob3VsZCBwb3NzaWJseSB3YWl0IHVudGlsCi0JICogYW55IGlvIGluIHRoZSByZW1vdmVkIHNwYWNlIGNvbXBsZXRlcywgYnV0IGl0IGhhcmRseSBzZWVtcwotCSAqIHdvcnRoIGl0LgotCSAqLwotCXNlY3RvcnMgJj0gfigoc2VjdG9yX3QpbWRkZXYtPmNodW5rX3NpemUvNTEyIC0gMSk7Ci0JbWRkZXYtPmFycmF5X3NpemUgPSAoc2VjdG9ycyAqIChtZGRldi0+cmFpZF9kaXNrcy0yKSk+PjE7Ci0Jc2V0X2NhcGFjaXR5KG1kZGV2LT5nZW5kaXNrLCBtZGRldi0+YXJyYXlfc2l6ZSA8PCAxKTsKLQltZGRldi0+Y2hhbmdlZCA9IDE7Ci0JaWYgKHNlY3RvcnMvMiAgPiBtZGRldi0+c2l6ZSAmJiBtZGRldi0+cmVjb3ZlcnlfY3AgPT0gTWF4U2VjdG9yKSB7Ci0JCW1kZGV2LT5yZWNvdmVyeV9jcCA9IG1kZGV2LT5zaXplIDw8IDE7Ci0JCXNldF9iaXQoTURfUkVDT1ZFUllfTkVFREVELCAmbWRkZXYtPnJlY292ZXJ5KTsKLQl9Ci0JbWRkZXYtPnNpemUgPSBzZWN0b3JzIC8yOwotCW1kZGV2LT5yZXN5bmNfbWF4X3NlY3RvcnMgPSBzZWN0b3JzOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCByYWlkNl9xdWllc2NlKG1kZGV2X3QgKm1kZGV2LCBpbnQgc3RhdGUpCi17Ci0JcmFpZDZfY29uZl90ICpjb25mID0gbWRkZXZfdG9fY29uZihtZGRldik7Ci0KLQlzd2l0Y2goc3RhdGUpIHsKLQljYXNlIDE6IC8qIHN0b3AgYWxsIHdyaXRlcyAqLwotCQlzcGluX2xvY2tfaXJxKCZjb25mLT5kZXZpY2VfbG9jayk7Ci0JCWNvbmYtPnF1aWVzY2UgPSAxOwotCQl3YWl0X2V2ZW50X2xvY2tfaXJxKGNvbmYtPndhaXRfZm9yX3N0cmlwZSwKLQkJCQkgICAgYXRvbWljX3JlYWQoJmNvbmYtPmFjdGl2ZV9zdHJpcGVzKSA9PSAwLAotCQkJCSAgICBjb25mLT5kZXZpY2VfbG9jaywgLyogbm90aGluZyAqLyk7Ci0JCXNwaW5fdW5sb2NrX2lycSgmY29uZi0+ZGV2aWNlX2xvY2spOwotCQlicmVhazsKLQotCWNhc2UgMDogLyogcmUtZW5hYmxlIHdyaXRlcyAqLwotCQlzcGluX2xvY2tfaXJxKCZjb25mLT5kZXZpY2VfbG9jayk7Ci0JCWNvbmYtPnF1aWVzY2UgPSAwOwotCQl3YWtlX3VwKCZjb25mLT53YWl0X2Zvcl9zdHJpcGUpOwotCQlzcGluX3VubG9ja19pcnEoJmNvbmYtPmRldmljZV9sb2NrKTsKLQkJYnJlYWs7Ci0JfQotfQotCi1zdGF0aWMgc3RydWN0IG1ka19wZXJzb25hbGl0eSByYWlkNl9wZXJzb25hbGl0eSA9Ci17Ci0JLm5hbWUJCT0gInJhaWQ2IiwKLQkubGV2ZWwJCT0gNiwKLQkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JLm1ha2VfcmVxdWVzdAk9IG1ha2VfcmVxdWVzdCwKLQkucnVuCQk9IHJ1biwKLQkuc3RvcAkJPSBzdG9wLAotCS5zdGF0dXMJCT0gc3RhdHVzLAotCS5lcnJvcl9oYW5kbGVyCT0gZXJyb3IsCi0JLmhvdF9hZGRfZGlzawk9IHJhaWQ2X2FkZF9kaXNrLAotCS5ob3RfcmVtb3ZlX2Rpc2s9IHJhaWQ2X3JlbW92ZV9kaXNrLAotCS5zcGFyZV9hY3RpdmUJPSByYWlkNl9zcGFyZV9hY3RpdmUsCi0JLnN5bmNfcmVxdWVzdAk9IHN5bmNfcmVxdWVzdCwKLQkucmVzaXplCQk9IHJhaWQ2X3Jlc2l6ZSwKLQkucXVpZXNjZQk9IHJhaWQ2X3F1aWVzY2UsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCByYWlkNl9pbml0KHZvaWQpCi17Ci0JaW50IGU7Ci0KLQllID0gcmFpZDZfc2VsZWN0X2FsZ28oKTsKLQlpZiAoIGUgKQotCQlyZXR1cm4gZTsKLQotCXJldHVybiByZWdpc3Rlcl9tZF9wZXJzb25hbGl0eSgmcmFpZDZfcGVyc29uYWxpdHkpOwotfQotCi1zdGF0aWMgdm9pZCByYWlkNl9leGl0ICh2b2lkKQotewotCXVucmVnaXN0ZXJfbWRfcGVyc29uYWxpdHkoJnJhaWQ2X3BlcnNvbmFsaXR5KTsKLX0KLQotbW9kdWxlX2luaXQocmFpZDZfaW5pdCk7Ci1tb2R1bGVfZXhpdChyYWlkNl9leGl0KTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9BTElBUygibWQtcGVyc29uYWxpdHktOCIpOyAvKiBSQUlENiAqLwotTU9EVUxFX0FMSUFTKCJtZC1yYWlkNiIpOwotTU9EVUxFX0FMSUFTKCJtZC1sZXZlbC02Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL0tjb25maWcgYi9kcml2ZXJzL21lZGlhL0tjb25maWcKaW5kZXggMzQ0ZDgzYS4uZWY1MmU2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVkaWEvS2NvbmZpZwpAQCAtMjUsNyArMjUsNyBAQAogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHZpZGVvZGV2LgogCiBjb25maWcgVklERU9fVjRMMQotCWJvb2xlYW4gIkVuYWJsZSBWaWRlbyBGb3IgTGludXggQVBJIDEgKERFUFJFQ0FURUQpIgorCWJvb2wgIkVuYWJsZSBWaWRlbyBGb3IgTGludXggQVBJIDEgKERFUFJFQ0FURUQpIgogCWRlcGVuZHMgb24gVklERU9fREVWCiAJc2VsZWN0IFZJREVPX1Y0TDFfQ09NUEFUCiAJZGVmYXVsdCB5CkBAIC0zNiw3ICszNiw3IEBACiAJICBJZiB5b3UgYXJlIHVuc3VyZSBhcyB0byB3aGV0aGVyIHRoaXMgaXMgcmVxdWlyZWQsIGFuc3dlciBZLgogCiBjb25maWcgVklERU9fVjRMMV9DT01QQVQKLQlib29sZWFuICJFbmFibGUgVmlkZW8gRm9yIExpbnV4IEFQSSAxIGNvbXBhdGlibGUgTGF5ZXIiCisJYm9vbCAiRW5hYmxlIFZpZGVvIEZvciBMaW51eCBBUEkgMSBjb21wYXRpYmxlIExheWVyIgogCWRlcGVuZHMgb24gVklERU9fREVWCiAJZGVmYXVsdCB5CiAJLS0taGVscC0tLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9jb21tb24vTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi9NYWtlZmlsZQppbmRleCA2MWI4OTYxLi44ZTc0NDgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2NvbW1vbi9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi9NYWtlZmlsZQpAQCAtMSw1ICsxLDUgQEAKIHNhYTcxNDYtb2JqcyAgICA6PSBzYWE3MTQ2X2kyYy5vIHNhYTcxNDZfY29yZS5vCi1zYWE3MTQ2X3Z2LW9ianMgOj0gc2FhNzE0Nl92dl9rc3ltcy5vIHNhYTcxNDZfZm9wcy5vIHNhYTcxNDZfdmlkZW8ubyBzYWE3MTQ2X2hscC5vIHNhYTcxNDZfdmJpLm8KK3NhYTcxNDZfdnYtb2JqcyA6PSBzYWE3MTQ2X2ZvcHMubyBzYWE3MTQ2X3ZpZGVvLm8gc2FhNzE0Nl9obHAubyBzYWE3MTQ2X3ZiaS5vCiBpci1jb21tb24tb2JqcyAgOj0gaXItZnVuY3Rpb25zLm8gaXIta2V5bWFwcy5vCiAKIG9iai0kKENPTkZJR19WSURFT19TQUE3MTQ2KSArPSBzYWE3MTQ2Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL2lyLWZ1bmN0aW9ucy5jIGIvZHJpdmVycy9tZWRpYS9jb21tb24vaXItZnVuY3Rpb25zLmMKaW5kZXggMzk3Y2ZmOC4uOGVhYTg4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9jb21tb24vaXItZnVuY3Rpb25zLmMKKysrIGIvZHJpdmVycy9tZWRpYS9jb21tb24vaXItZnVuY3Rpb25zLmMKQEAgLTI2OSw0ICsyNjksMyBAQAogICogYy1iYXNpYy1vZmZzZXQ6IDgKICAqIEVuZDoKICAqLwotCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2NvbW1vbi9pci1rZXltYXBzLmMgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi9pci1rZXltYXBzLmMKaW5kZXggYTI5NGQ1Yy4uY2E5OGQ5NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9jb21tb24vaXIta2V5bWFwcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL2lyLWtleW1hcHMuYwpAQCAtNjE4LDcgKzYxOCw3IEBACiAKIEVYUE9SVF9TWU1CT0xfR1BMKGlyX2NvZGVzX2VtX3RlcnJhdGVjKTsKIAotSVJfS0VZVEFCX1RZUEUgaXJfY29kZXNfZW1fcGlubmFjbGVfdXNiW0lSX0tFWVRBQl9TSVpFXSA9IHsKK0lSX0tFWVRBQl9UWVBFIGlyX2NvZGVzX3Bpbm5hY2xlX2dyZXlbSVJfS0VZVEFCX1NJWkVdID0gewogCVsgMHgzYSBdID0gS0VZXzAsCiAJWyAweDMxIF0gPSBLRVlfMSwKIAlbIDB4MzIgXSA9IEtFWV8yLApAQCAtNjcwLDcgKzY3MCw3IEBACiAJWyAweDI3IF0gPSBLRVlfUkVDT1JELAogfTsKIAotRVhQT1JUX1NZTUJPTF9HUEwoaXJfY29kZXNfZW1fcGlubmFjbGVfdXNiKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGlyX2NvZGVzX3Bpbm5hY2xlX2dyZXkpOwogCiBJUl9LRVlUQUJfVFlQRSBpcl9jb2Rlc19mbHl2aWRlb1tJUl9LRVlUQUJfU0laRV0gPSB7CiAJWyAweDBmIF0gPSBLRVlfMCwKQEAgLTEyNjMsMzQgKzEyNjMsNTEgQEAKIAlbIDB4MGYgXSA9IEtFWV85LAogCiAJWyAweDAwIF0gPSBLRVlfUE9XRVIsCi0JWyAweDAyIF0gPSBLRVlfVFVORVIsCQkvKiBUVi9GTSAqLwotCVsgMHgxZSBdID0gS0VZX1ZJREVPLAorCVsgMHgxYiBdID0gS0VZX0FVRElPLCAgICAgICAgICAgLyogQXVkaW8gU291cmNlICovCisJWyAweDAyIF0gPSBLRVlfVFVORVIsCQkvKiBUVi9GTSwgbm90IG9uIFkwNDAwMDUyICovCisJWyAweDFlIF0gPSBLRVlfVklERU8sICAgICAgICAgICAvKiBWaWRlbyBTb3VyY2UgKi8KKwlbIDB4MTYgXSA9IEtFWV9JTkZPLCAgICAgICAgICAgIC8qIERpc3BsYXkgaW5mb3JtYXRpb24gKi8KIAlbIDB4MDQgXSA9IEtFWV9WT0xVTUVVUCwKIAlbIDB4MDggXSA9IEtFWV9WT0xVTUVET1dOLAogCVsgMHgwYyBdID0gS0VZX0NIQU5ORUxVUCwKIAlbIDB4MTAgXSA9IEtFWV9DSEFOTkVMRE9XTiwKIAlbIDB4MDMgXSA9IEtFWV9aT09NLAkJLyogZnVsbHNjcmVlbiAqLwotCVsgMHgxZiBdID0gS0VZX1NVQlRJVExFLAkJLyogY2xvc2VkIGNhcHRpb24vdGVsZXRleHQgKi8KKwlbIDB4MWYgXSA9IEtFWV9URVhULAkJLyogY2xvc2VkIGNhcHRpb24vdGVsZXRleHQgKi8KIAlbIDB4MjAgXSA9IEtFWV9TTEVFUCwKKwlbIDB4MjkgXSA9IEtFWV9DTEVBUiwgICAgICAgICAgIC8qIGJvc3Mga2V5ICovCiAJWyAweDE0IF0gPSBLRVlfTVVURSwKIAlbIDB4MmIgXSA9IEtFWV9SRUQsCiAJWyAweDJjIF0gPSBLRVlfR1JFRU4sCiAJWyAweDJkIF0gPSBLRVlfWUVMTE9XLAogCVsgMHgyZSBdID0gS0VZX0JMVUUsCi0JWyAweDE4IF0gPSBLRVlfS1BQTFVTLAkJLyogZmluZSB0dW5lICsgKi8KLQlbIDB4MTkgXSA9IEtFWV9LUE1JTlVTLAkJLyogZmluZSB0dW5lIC0gKi8KKwlbIDB4MTggXSA9IEtFWV9LUFBMVVMsCQkvKiBmaW5lIHR1bmUgKyAsIG5vdCBvbiBZMDQwMDUyICovCisJWyAweDE5IF0gPSBLRVlfS1BNSU5VUywJCS8qIGZpbmUgdHVuZSAtICwgbm90IG9uIFkwNDAwNTIgKi8KKwlbIDB4MmEgXSA9IEtFWV9NRURJQSwgICAgICAgICAgIC8qIFBJUCAoUGljdHVyZSBpbiBwaWN0dXJlICovCiAJWyAweDIxIF0gPSBLRVlfRE9ULAogCVsgMHgxMyBdID0gS0VZX0VOVEVSLAotCVsgMHgyMiBdID0gS0VZX0JBQ0ssCisJWyAweDExIF0gPSBLRVlfTEFTVCwgICAgICAgICAgICAvKiBSZWNhbGwgKGxhc3QgY2hhbm5lbCAqLworCVsgMHgyMiBdID0gS0VZX1BSRVZJT1VTLAogCVsgMHgyMyBdID0gS0VZX1BMQVlQQVVTRSwKIAlbIDB4MjQgXSA9IEtFWV9ORVhULAorCVsgMHgyNSBdID0gS0VZX0FSQ0hJVkUsICAgICAgIC8qIFRpbWUgU2hpZnRpbmcgKi8KIAlbIDB4MjYgXSA9IEtFWV9TVE9QLAotCVsgMHgyNyBdID0gS0VZX1JFQ09SRAorCVsgMHgyNyBdID0gS0VZX1JFQ09SRCwKKwlbIDB4MjggXSA9IEtFWV9TQVZFLCAgICAgICAgICAvKiBTY3JlZW5zaG90ICovCisJWyAweDJmIF0gPSBLRVlfTUVOVSwKKwlbIDB4MzAgXSA9IEtFWV9DQU5DRUwsCisJWyAweDMxIF0gPSBLRVlfQ0hBTk5FTCwgICAgICAgLyogQ2hhbm5lbCBTdXJmICovCisJWyAweDMyIF0gPSBLRVlfU1VCVElUTEUsCisJWyAweDMzIF0gPSBLRVlfTEFOR1VBR0UsCisJWyAweDM0IF0gPSBLRVlfUkVXSU5ELAorCVsgMHgzNSBdID0gS0VZX0ZBU1RGT1JXQVJELAorCVsgMHgzNiBdID0gS0VZX1RWLAorCVsgMHgzNyBdID0gS0VZX1JBRElPLCAgICAgICAgIC8qIEZNICovCisJWyAweDM4IF0gPSBLRVlfRFZECiB9OwogCiBFWFBPUlRfU1lNQk9MX0dQTChpcl9jb2Rlc193aW5mYXN0KTsKIAotSVJfS0VZVEFCX1RZUEUgaXJfY29kZXNfcGlubmFjbGVbSVJfS0VZVEFCX1NJWkVdID0geworSVJfS0VZVEFCX1RZUEUgaXJfY29kZXNfcGlubmFjbGVfY29sb3JbSVJfS0VZVEFCX1NJWkVdID0gewogCVsgMHg1OSBdID0gS0VZX01VVEUsCiAJWyAweDRhIF0gPSBLRVlfUE9XRVIsCiAKQEAgLTEzNDgsNyArMTM2NSw3IEBACiAJWyAweDBhIF0gPSBLRVlfQkFDS1NQQUNFLAogfTsKIAotRVhQT1JUX1NZTUJPTF9HUEwoaXJfY29kZXNfcGlubmFjbGUpOworRVhQT1JUX1NZTUJPTF9HUEwoaXJfY29kZXNfcGlubmFjbGVfY29sb3IpOwogCiAvKiBIYXVwcGF1Z2U6IHRoZSBuZXdlciwgZ3JheSByZW1vdGVzIChzZWVtcyB0aGVyZSBhcmUgbXVsdGlwbGUKICAqIHNsaWdodGx5IGRpZmZlcmVudCB2ZXJzaW9ucyksIHNoaXBwZWQgd2l0aCBjeDg4K2l2dHYgY2FyZHMuCkBAIC0xNDEzLDMgKzE0MzAsNDYgQEAKIAogRVhQT1JUX1NZTUJPTF9HUEwoaXJfY29kZXNfaGF1cHBhdWdlX25ldyk7CiAKK0lSX0tFWVRBQl9UWVBFIGlyX2NvZGVzX25wZ3RlY2hbSVJfS0VZVEFCX1NJWkVdID0geworCVsgMHgxZCBdID0gS0VZX1NXSVRDSFZJREVPTU9ERSwgLyogc3dpdGNoIGlucHV0cyAqLworCVsgMHgyYSBdID0gS0VZX0ZST05ULAorCisJWyAweDNlIF0gPSBLRVlfMSwKKwlbIDB4MDIgXSA9IEtFWV8yLAorCVsgMHgwNiBdID0gS0VZXzMsCisJWyAweDBhIF0gPSBLRVlfNCwKKwlbIDB4MGUgXSA9IEtFWV81LAorCVsgMHgxMiBdID0gS0VZXzYsCisJWyAweDE2IF0gPSBLRVlfNywKKwlbIDB4MWEgXSA9IEtFWV84LAorCVsgMHgxZSBdID0gS0VZXzksCisJWyAweDNhIF0gPSBLRVlfMCwKKwlbIDB4MjIgXSA9IEtFWV9OVU1MT0NLLCAgICAgICAgIC8qIC0vLS0gKi8KKwlbIDB4MjAgXSA9IEtFWV9SRUZSRVNILAorCisJWyAweDAzIF0gPSBLRVlfQlJJR0hUTkVTU0RPV04sCisJWyAweDI4IF0gPSBLRVlfQVVESU8sCisJWyAweDNjIF0gPSBLRVlfVVAsCisJWyAweDNmIF0gPSBLRVlfTEVGVCwKKwlbIDB4MmUgXSA9IEtFWV9NVVRFLAorCVsgMHgzYiBdID0gS0VZX1JJR0hULAorCVsgMHgwMCBdID0gS0VZX0RPV04sCisJWyAweDA3IF0gPSBLRVlfQlJJR0hUTkVTU1VQLAorCVsgMHgyYyBdID0gS0VZX1RFWFQsCisKKwlbIDB4MzcgXSA9IEtFWV9SRUNPUkQsCisJWyAweDE3IF0gPSBLRVlfUExBWSwKKwlbIDB4MTMgXSA9IEtFWV9QQVVTRSwKKwlbIDB4MjYgXSA9IEtFWV9TVE9QLAorCVsgMHgxOCBdID0gS0VZX0ZBU1RGT1JXQVJELAorCVsgMHgxNCBdID0gS0VZX1JFV0lORCwKKwlbIDB4MzMgXSA9IEtFWV9aT09NLAorCVsgMHgzMiBdID0gS0VZX0tFWUJPQVJELAorCVsgMHgzMCBdID0gS0VZX0dPVE8sICAgICAgICAgICAgLyogUG9pbnRpbmcgYXJyb3cgKi8KKwlbIDB4MzYgXSA9IEtFWV9NQUNSTywgICAgICAgICAgIC8qIE1heGltaXplL01pbmltaXplICh5ZWxsb3cpICovCisJWyAweDBiIF0gPSBLRVlfUkFESU8sCisJWyAweDEwIF0gPSBLRVlfUE9XRVIsCisKK307CisKK0VYUE9SVF9TWU1CT0xfR1BMKGlyX2NvZGVzX25wZ3RlY2gpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9jb21tb24vc2FhNzE0Nl9mb3BzLmMgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi9zYWE3MTQ2X2ZvcHMuYwppbmRleCA1MjNhYjM4Li4wMDI3YWNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2NvbW1vbi9zYWE3MTQ2X2ZvcHMuYworKysgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi9zYWE3MTQ2X2ZvcHMuYwpAQCAtNTAxLDYgKzUwMSw3IEBACiAKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHNhYTcxNDZfdnZfaW5pdCk7CiAKIGludCBzYWE3MTQ2X3Z2X3JlbGVhc2Uoc3RydWN0IHNhYTcxNDZfZGV2KiBkZXYpCiB7CkBAIC01MTUsNiArNTE2LDcgQEAKIAogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoc2FhNzE0Nl92dl9yZWxlYXNlKTsKIAogaW50IHNhYTcxNDZfcmVnaXN0ZXJfZGV2aWNlKHN0cnVjdCB2aWRlb19kZXZpY2UgKip2aWQsIHN0cnVjdCBzYWE3MTQ2X2RldiogZGV2LAogCQkJICAgIGNoYXIgKm5hbWUsIGludCB0eXBlKQpAQCAtNTUzLDYgKzU1NSw3IEBACiAJKnZpZCA9IHZmZDsKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHNhYTcxNDZfcmVnaXN0ZXJfZGV2aWNlKTsKIAogaW50IHNhYTcxNDZfdW5yZWdpc3Rlcl9kZXZpY2Uoc3RydWN0IHZpZGVvX2RldmljZSAqKnZpZCwgc3RydWN0IHNhYTcxNDZfZGV2KiBkZXYpCiB7CkBAIC01NzEsNiArNTc0LDcgQEAKIAogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoc2FhNzE0Nl91bnJlZ2lzdGVyX2RldmljZSk7CiAKIHN0YXRpYyBpbnQgX19pbml0IHNhYTcxNDZfdnZfaW5pdF9tb2R1bGUodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3NhYTcxNDZfaGxwLmMgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi9zYWE3MTQ2X2hscC5jCmluZGV4IDMzYmVjOGEuLjIwOTJlNmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3NhYTcxNDZfaGxwLmMKKysrIGIvZHJpdmVycy9tZWRpYS9jb21tb24vc2FhNzE0Nl9obHAuYwpAQCAtNjQxLDYgKzY0MSw3IEBACiAJdnYtPmN1cnJlbnRfaHBzX3NvdXJjZSA9IHNvdXJjZTsKIAl2di0+Y3VycmVudF9ocHNfc3luYyA9IHN5bmM7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChzYWE3MTQ2X3NldF9ocHNfc291cmNlX2FuZF9zeW5jKTsKIAogaW50IHNhYTcxNDZfZW5hYmxlX292ZXJsYXkoc3RydWN0IHNhYTcxNDZfZmggKmZoKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9jb21tb24vc2FhNzE0Nl92aWRlby5jIGIvZHJpdmVycy9tZWRpYS9jb21tb24vc2FhNzE0Nl92aWRlby5jCmluZGV4IGU3MDc5ZDEuLjgzOTNkNDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3NhYTcxNDZfdmlkZW8uYworKysgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi9zYWE3MTQ2X3ZpZGVvLmMKQEAgLTMxOCw2ICszMTgsNyBAQAogCiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChzYWE3MTQ2X3N0YXJ0X3ByZXZpZXcpOwogCiBpbnQgc2FhNzE0Nl9zdG9wX3ByZXZpZXcoc3RydWN0IHNhYTcxNDZfZmggKmZoKQogewpAQCAtMzUyLDYgKzM1Myw3IEBACiAKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHNhYTcxNDZfc3RvcF9wcmV2aWV3KTsKIAogc3RhdGljIGludCBzX2ZtdChzdHJ1Y3Qgc2FhNzE0Nl9maCAqZmgsIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3NhYTcxNDZfdnZfa3N5bXMuYyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3NhYTcxNDZfdnZfa3N5bXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjIyMjZlYi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL2NvbW1vbi9zYWE3MTQ2X3Z2X2tzeW1zLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc2FhNzE0Nl92di5oPgotCi1FWFBPUlRfU1lNQk9MX0dQTChzYWE3MTQ2X3N0YXJ0X3ByZXZpZXcpOwotRVhQT1JUX1NZTUJPTF9HUEwoc2FhNzE0Nl9zdG9wX3ByZXZpZXcpOwotCi1FWFBPUlRfU1lNQk9MX0dQTChzYWE3MTQ2X3NldF9ocHNfc291cmNlX2FuZF9zeW5jKTsKLUVYUE9SVF9TWU1CT0xfR1BMKHNhYTcxNDZfcmVnaXN0ZXJfZGV2aWNlKTsKLUVYUE9SVF9TWU1CT0xfR1BMKHNhYTcxNDZfdW5yZWdpc3Rlcl9kZXZpY2UpOwotCi1FWFBPUlRfU1lNQk9MX0dQTChzYWE3MTQ2X3Z2X2luaXQpOwotRVhQT1JUX1NZTUJPTF9HUEwoc2FhNzE0Nl92dl9yZWxlYXNlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcC1mZS10dW5lci5jIGIvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLWZlLXR1bmVyLmMKaW5kZXggOWM3ZjEyMi4uM2JlODdjNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLWZlLXR1bmVyLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLWZlLXR1bmVyLmMKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlICJzdHYwMjk3LmgiCiAjaW5jbHVkZSAibXQzMTIuaCIKICNpbmNsdWRlICJsZ2R0MzMweC5oIgorI2luY2x1ZGUgImxnX2gwNnhmLmgiCiAjaW5jbHVkZSAiZHZiLXBsbC5oIgogCiAvKiBsbmIgY29udHJvbCAqLwpAQCAtMTY2LDExICsxNjcsMTIgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBzYW1zdW5nX3RibXUyNDExMl9wbGxfc2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYywgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMpCitzdGF0aWMgaW50IHNhbXN1bmdfdGJtdTI0MTEyX3R1bmVyX3NldF9wYXJhbXMoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcGFyYW1zKQogewogCXU4IGJ1Zls0XTsKIAl1MzIgZGl2OwogCXN0cnVjdCBpMmNfbXNnIG1zZyA9IHsgLmFkZHIgPSAweDYxLCAuZmxhZ3MgPSAwLCAuYnVmID0gYnVmLCAubGVuID0gc2l6ZW9mKGJ1ZikgfTsKKwlzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjID0gZmUtPmR2Yi0+cHJpdjsKIAogCWRpdiA9IHBhcmFtcy0+ZnJlcXVlbmN5IC8gMTI1OwogCkBAIC0xODEsOCArMTgzLDExIEBACiAKIAlpZiAocGFyYW1zLT5mcmVxdWVuY3kgPCAxNTAwMDAwKSBidWZbM10gfD0gMHgxMDsKIAotCWlmIChpMmNfdHJhbnNmZXIoaTJjLCAmbXNnLCAxKSAhPSAxKQorCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMSk7CisJaWYgKGkyY190cmFuc2ZlcigmZmMtPmkyY19hZGFwLCAmbXNnLCAxKSAhPSAxKSB7CiAJCXJldHVybiAtRUlPOworCX0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMjQxLDcgKzI0Niw2IEBACiAJLnZvbHQxM19vcDBfb3AxID0gU1RWMDI5OV9WT0xUMTNfT1AxLAogCS5taW5fZGVsYXlfbXMgPSAxMDAsCiAJLnNldF9zeW1ib2xfcmF0ZSA9IHNhbXN1bmdfdGJtdTI0MTEyX3NldF9zeW1ib2xfcmF0ZSwKLQkucGxsX3NldCA9IHNhbXN1bmdfdGJtdTI0MTEyX3BsbF9zZXQsCiB9OwogCiAvKiBkdmItdCBtdDM1MiAqLwpAQCAtMjY0LDExICsyNjgsMTQgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBzYW1zdW5nX3RkdGM5MjUxZGgwX3BsbF9zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyogcGFyYW1zLCB1OCogcGxsYnVmKQorc3RhdGljIGludCBzYW1zdW5nX3RkdGM5MjUxZGgwX2NhbGNfcmVncyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMsIHU4KiBwbGxidWYsIGludCBidWZfbGVuKQogewogCXUzMiBkaXY7CiAJdW5zaWduZWQgY2hhciBicyA9IDA7CiAKKwlpZiAoYnVmX2xlbiA8IDUpCisJCXJldHVybiAtRUlOVkFMOworCiAJI2RlZmluZSBJRl9GUkVRVUVOQ1l4NiAyMTcgICAgLyogNiAqIDM2LjE2NjY2NjY2NjY3TUh6ICovCiAJZGl2ID0gKCgocGFyYW1zLT5mcmVxdWVuY3kgKyA4MzMzMykgKiAzKSAvIDUwMDAwMCkgKyBJRl9GUkVRVUVOQ1l4NjsKIApAQCAtMjc2LDE5ICsyODMsMTggQEAKIAlpZiAocGFyYW1zLT5mcmVxdWVuY3kgPj0gMTYxMDAwMDAwICYmIHBhcmFtcy0+ZnJlcXVlbmN5IDw9IDQzOTAwMDAwMCkgYnMgPSAweDBhOwogCWlmIChwYXJhbXMtPmZyZXF1ZW5jeSA+PSA0NDcwMDAwMDAgJiYgcGFyYW1zLT5mcmVxdWVuY3kgPD0gODYzMDAwMDAwKSBicyA9IDB4MDg7CiAKLQlwbGxidWZbMF0gPSAweGMyOyAvKiBOb3RlOiBub24tbGludXggc3RhbmRhcmQgUExMIGkyYyBhZGRyZXNzICovCisJcGxsYnVmWzBdID0gMHg2MTsKIAlwbGxidWZbMV0gPSBkaXYgPj4gODsKIAlwbGxidWZbMl0gPSBkaXYgJiAweGZmOwogCXBsbGJ1ZlszXSA9IDB4Y2M7CiAJcGxsYnVmWzRdID0gYnM7CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gNTsKIH0KIAogc3RhdGljIHN0cnVjdCBtdDM1Ml9jb25maWcgc2Ftc3VuZ190ZHRjOTI1MWRoMF9jb25maWcgPSB7CiAJLmRlbW9kX2FkZHJlc3MgPSAweDBmLAogCS5kZW1vZF9pbml0ICAgID0gc2Ftc3VuZ190ZHRjOTI1MWRoMF9kZW1vZF9pbml0LAotCS5wbGxfc2V0ICAgICAgID0gc2Ftc3VuZ190ZHRjOTI1MWRoMF9wbGxfc2V0LAogfTsKIAogc3RhdGljIGludCBmbGV4Y29wX2ZlX3JlcXVlc3RfZmlybXdhcmUoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqKmZ3LCBjaGFyKiBuYW1lKQpAQCAtMjk3LDU2ICszMDMsMjEgQEAKIAlyZXR1cm4gcmVxdWVzdF9maXJtd2FyZShmdywgbmFtZSwgZmMtPmRldik7CiB9CiAKLXN0YXRpYyBpbnQgbGdkdDMzMDNfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwKLQkJCSAgICBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcykKK3N0YXRpYyBpbnQgbGdkdDMzMDNfdHVuZXJfc2V0X3BhcmFtcyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMpCiB7CiAJc3RydWN0IGZsZXhjb3BfZGV2aWNlICpmYyA9IGZlLT5kdmItPnByaXY7Ci0JdTggYnVmWzRdOwotCXN0cnVjdCBpMmNfbXNnIG1zZyA9Ci0JCXsgLmFkZHIgPSAweDYxLCAuZmxhZ3MgPSAwLCAuYnVmID0gYnVmLCAubGVuID0gNCB9OwotCWludCBlcnI7Ci0KLQlkdmJfcGxsX2NvbmZpZ3VyZSgmZHZiX3BsbF90ZHZzX3R1YTYwMzQsYnVmLCBwYXJhbXMtPmZyZXF1ZW5jeSwgMCk7Ci0JZHByaW50aygxLCAiJXM6IHR1bmVyIGF0IDB4JTAyeCBieXRlczogMHglMDJ4IDB4JTAyeCAweCUwMnggMHglMDJ4XG4iLAotCQkJX19GVU5DVElPTl9fLCBtc2cuYWRkciwgYnVmWzBdLGJ1ZlsxXSxidWZbMl0sYnVmWzNdKTsKLQlpZiAoKGVyciA9IGkyY190cmFuc2ZlcigmZmMtPmkyY19hZGFwLCAmbXNnLCAxKSkgIT0gMSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJsZ2R0MzMwMzogJXMgZXJyb3IgIgotCQkJICAgIihhZGRyICUwMnggPC0gJTAyeCwgZXJyID0gJWkpXG4iLAotCQkJICAgX19GVU5DVElPTl9fLCBidWZbMF0sIGJ1ZlsxXSwgZXJyKTsKLQkJaWYgKGVyciA8IDApCi0JCQlyZXR1cm4gZXJyOwotCQllbHNlCi0JCQlyZXR1cm4gLUVSRU1PVEVJTzsKLQl9Ci0KLQlidWZbMF0gPSAweDg2IHwgMHgxODsKLQlidWZbMV0gPSAweDUwOwotCW1zZy5sZW4gPSAyOwotCWlmICgoZXJyID0gaTJjX3RyYW5zZmVyKCZmYy0+aTJjX2FkYXAsICZtc2csIDEpKSAhPSAxKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgImxnZHQzMzAzOiAlcyBlcnJvciAiCi0JCQkgICAiKGFkZHIgJTAyeCA8LSAlMDJ4LCBlcnIgPSAlaSlcbiIsCi0JCQkgICBfX0ZVTkNUSU9OX18sIGJ1ZlswXSwgYnVmWzFdLCBlcnIpOwotCQlpZiAoZXJyIDwgMCkKLQkJCXJldHVybiBlcnI7Ci0JCWVsc2UKLQkJCXJldHVybiAtRVJFTU9URUlPOwotCX0KLQotCXJldHVybiAwOworCXJldHVybiBsZ19oMDZ4Zl9wbGxfc2V0KGZlLCAmZmMtPmkyY19hZGFwLCBwYXJhbXMpOwogfQogCiBzdGF0aWMgc3RydWN0IGxnZHQzMzB4X2NvbmZpZyBhaXIycGNfYXRzY19oZDUwMDBfY29uZmlnID0gewogCS5kZW1vZF9hZGRyZXNzICAgICAgID0gMHg1OSwKIAkuZGVtb2RfY2hpcCAgICAgICAgICA9IExHRFQzMzAzLAogCS5zZXJpYWxfbXBlZyAgICAgICAgID0gMHgwNCwKLQkucGxsX3NldCAgICAgICAgICAgICA9IGxnZHQzMzAzX3BsbF9zZXQsCiAJLmNsb2NrX3BvbGFyaXR5X2ZsaXAgPSAxLAogfTsKIAogc3RhdGljIHN0cnVjdCBueHQyMDB4X2NvbmZpZyBzYW1zdW5nX3RibXZfY29uZmlnID0gewogCS5kZW1vZF9hZGRyZXNzICAgID0gMHgwYSwKLQkucGxsX2FkZHJlc3MgICAgICA9IDB4YzIsCi0JLnBsbF9kZXNjICAgICAgICAgPSAmZHZiX3BsbF9zYW1zdW5nX3RibXYsCiB9OwogCiBzdGF0aWMgc3RydWN0IGJjbTM1MTBfY29uZmlnIGFpcjJwY19hdHNjX2ZpcnN0X2dlbl9jb25maWcgPSB7CkBAIC0zNTQsNyArMzI1LDcgQEAKIAkucmVxdWVzdF9maXJtd2FyZSA9IGZsZXhjb3BfZmVfcmVxdWVzdF9maXJtd2FyZSwKIH07CiAKLXN0YXRpYyBpbnQgc2t5c3RhcjIzX3NhbXN1bmdfdGJkdTE4MTMyX3BsbF9zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyogcGFyYW1zKQorc3RhdGljIGludCBza3lzdGFyMjNfc2Ftc3VuZ190YmR1MTgxMzJfdHVuZXJfc2V0X3BhcmFtcyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMpCiB7CiAJdTggYnVmWzRdOwogCXUzMiBkaXY7CkBAIC0zNzEsNiArMzQyLDggQEAKIAlpZiAocGFyYW1zLT5mcmVxdWVuY3kgPCAxNTUwMDAwKQogCQlidWZbM10gfD0gMHgwMjsKIAorCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMSk7CiAJaWYgKGkyY190cmFuc2ZlcigmZmMtPmkyY19hZGFwLCAmbXNnLCAxKSAhPSAxKQogCQlyZXR1cm4gLUVJTzsKIAlyZXR1cm4gMDsKQEAgLTM3OSw5ICszNTIsNTIgQEAKIHN0YXRpYyBzdHJ1Y3QgbXQzMTJfY29uZmlnIHNreXN0YXIyM19zYW1zdW5nX3RiZHUxODEzMl9jb25maWcgPSB7CiAKIAkuZGVtb2RfYWRkcmVzcyA9IDB4MGUsCi0JLnBsbF9zZXQgPSBza3lzdGFyMjNfc2Ftc3VuZ190YmR1MTgxMzJfcGxsX3NldCwKIH07CiAKK3N0YXRpYyBpbnQgYWxwc190ZGVlNF9zdHYwMjk3X3R1bmVyX3NldF9wYXJhbXMoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsCisJCQkJCSAgICAgICBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKmZlcCkKK3sKKwlzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjID0gZmUtPmR2Yi0+cHJpdjsKKwl1OCBidWZbNF07CisJdTE2IGRpdjsKKwlpbnQgcmV0OworCisvKiAgNjIuNSBrSHogKiAxMCAqLworI2RlZmluZSBSRUZfRlJFUSAgICA2MjUKKyNkZWZpbmUgRlJFUV9PRkZTRVQgMzYxMjUKKworCWRpdiA9ICgoZmVwLT5mcmVxdWVuY3kvMTAwMCArIEZSRVFfT0ZGU0VUICkgKiAxMCkgIC8gUkVGX0ZSRVE7IC8vIDQgTUh6ID0gNDAwMCBLSHoKKworCWJ1ZlswXSA9ICh1OCkoIGRpdiA+PiA4KSAmIDB4N2Y7CisJYnVmWzFdID0gKHU4KSAgICAgICAgZGl2ICYgMHhmZjsKKworLyogRihvc2MpID0gTiAqIFJlZmVyZW5jZSBGcmVxLiAoNjIuNSBrSHopCisgKiBieXRlIDIgOiAgMCBOMTQgTjEzIE4xMiBOMTEgTjEwIE45ICBOOAorICogYnl0ZSAzIDogTjcgTjYgIE41ICBONCAgTjMgIE4yICBOMSAgTjAKKyAqIGJ5dGUgNCA6IDEgICogICAqICAgQUdEIFIzICBSMiAgUjEgIFIwCisgKiBieXRlIDUgOiBDMSAqICAgUkUgIFJUUyBCUzQgQlMzIEJTMiBCUzEKKyAqIEFHRCA9IDEsIFIzIFIyIFIxIFIwID0gMCAxIDAgMSA9PiBieXRlIDQgPSAxKioxMDEwMSA9IDB4OTUgKi8KKwlidWZbMl0gPSAweDk1OworCisvLyBSYW5nZShNSHopICBDMSAqICBSRSBSVFMgQlM0IEJTMyBCUzIgQlMxICBCeXRlIDUKKy8vICA0NyAtIDE1MyAgIDAgICogIDAgICAwICAgMCAgIDAgICAwICAgMSAgIDB4MDEKKy8vIDE1MyAtIDQzMCAgIDAgICogIDAgICAwICAgMCAgIDAgICAxICAgMCAgIDB4MDIKKy8vIDQzMCAtIDgyMiAgIDAgICogIDAgICAwICAgMSAgIDAgICAwICAgMCAgIDB4MDgKKy8vIDgyMiAtIDg2MiAgIDEgICogIDAgICAwICAgMSAgIDAgICAwICAgMCAgIDB4ODgKKworCSAgICAgaWYgKGZlcC0+ZnJlcXVlbmN5IDw9IDE1MzAwMDAwMCkgYnVmWzNdID0gMHgwMTsKKwllbHNlIGlmIChmZXAtPmZyZXF1ZW5jeSA8PSA0MzAwMDAwMDApIGJ1ZlszXSA9IDB4MDI7CisJZWxzZSBpZiAoZmVwLT5mcmVxdWVuY3kgPD0gODIyMDAwMDAwKSBidWZbM10gPSAweDA4OworCWVsc2UgYnVmWzNdID0gMHg4ODsKKworCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMSk7CisJZGViX3R1bmVyKCJ0dW5lciBidWZmZXIgZm9yICVkIEh6OiAleCAleCAleCAleFxuIixmZXAtPmZyZXF1ZW5jeSwgYnVmWzBdLGJ1ZlsxXSxidWZbMl0sYnVmWzNdKTsKKwlyZXQgPSBmYy0+aTJjX3JlcXVlc3QoZmMsRkNfV1JJVEUsRkNfSTJDX1BPUlRfVFVORVIsMHg2MSxidWZbMF0sJmJ1ZlsxXSwzKTsKKwlkZWJfdHVuZXIoInR1bmVyIHdyaXRlIHJldHVybmVkOiAlZFxuIixyZXQpOworCisJcmV0dXJuIDA7Cit9CiAKIHN0YXRpYyB1OCBhbHBzX3RkZWU0X3N0djAyOTdfaW5pdHRhYltdID0gewogCTB4ODAsIDB4MDEsCkBAIC00OTAsNyArNTA2LDkgQEAKIAogCS8qIHRyeSB0aGUgc2t5IHYyLjYgKHN0djAyOTkvU2Ftc3VuZyB0Ym11MjQxMTIoc2wxOTM1KSkgKi8KIAlpZiAoKGZjLT5mZSA9IHN0djAyOTlfYXR0YWNoKCZzYW1zdW5nX3RibXUyNDExMl9jb25maWcsICZmYy0+aTJjX2FkYXApKSAhPSBOVUxMKSB7Ci0JCW9wcyA9IGZjLT5mZS0+b3BzOworCQlvcHMgPSAmZmMtPmZlLT5vcHM7CisKKwkJb3BzLT50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IHNhbXN1bmdfdGJtdTI0MTEyX3R1bmVyX3NldF9wYXJhbXM7CiAKIAkJb3BzLT5zZXRfdm9sdGFnZSA9IGZsZXhjb3Bfc2V0X3ZvbHRhZ2U7CiAKQEAgLTUwMywxNiArNTIxLDE5IEBACiAJLyogdHJ5IHRoZSBhaXIgZHZiLXQgKG10MzUyL1NhbXN1bmcgdGR0YzkyNTFkaDAoPz8pKSAqLwogCWlmICgoZmMtPmZlID0gbXQzNTJfYXR0YWNoKCZzYW1zdW5nX3RkdGM5MjUxZGgwX2NvbmZpZywgJmZjLT5pMmNfYWRhcCkpICE9IE5VTEwgKSB7CiAJCWZjLT5kZXZfdHlwZSAgICAgICAgICA9IEZDX0FJUl9EVkI7CisJCWZjLT5mZS0+b3BzLnR1bmVyX29wcy5jYWxjX3JlZ3MgPSBzYW1zdW5nX3RkdGM5MjUxZGgwX2NhbGNfcmVnczsKIAkJaW5mbygiZm91bmQgdGhlIG10MzUyIGF0IGkyYyBhZGRyZXNzOiAweCUwMngiLHNhbXN1bmdfdGR0YzkyNTFkaDBfY29uZmlnLmRlbW9kX2FkZHJlc3MpOwogCX0gZWxzZQogCS8qIHRyeSB0aGUgYWlyIGF0c2MgMm5kIGdlbmVyYXRpb24gKG54dDIwMDIpICovCiAJaWYgKChmYy0+ZmUgPSBueHQyMDB4X2F0dGFjaCgmc2Ftc3VuZ190Ym12X2NvbmZpZywgJmZjLT5pMmNfYWRhcCkpICE9IE5VTEwpIHsKIAkJZmMtPmRldl90eXBlICAgICAgICAgID0gRkNfQUlSX0FUU0MyOworCQlkdmJfcGxsX2F0dGFjaChmYy0+ZmUsIDB4NjEsICZmYy0+aTJjX2FkYXAsICZkdmJfcGxsX3NhbXN1bmdfdGJtdik7CiAJCWluZm8oImZvdW5kIHRoZSBueHQyMDAyIGF0IGkyYyBhZGRyZXNzOiAweCUwMngiLHNhbXN1bmdfdGJtdl9jb25maWcuZGVtb2RfYWRkcmVzcyk7CiAJfSBlbHNlCiAJLyogdHJ5IHRoZSBhaXIgYXRzYyAzbmQgZ2VuZXJhdGlvbiAobGdkdDMzMDMpICovCiAJaWYgKChmYy0+ZmUgPSBsZ2R0MzMweF9hdHRhY2goJmFpcjJwY19hdHNjX2hkNTAwMF9jb25maWcsICZmYy0+aTJjX2FkYXApKSAhPSBOVUxMKSB7CiAJCWZjLT5kZXZfdHlwZSAgICAgICAgICA9IEZDX0FJUl9BVFNDMzsKKwkJZmMtPmZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBsZ2R0MzMwM190dW5lcl9zZXRfcGFyYW1zOwogCQlpbmZvKCJmb3VuZCB0aGUgbGdkdDMzMDMgYXQgaTJjIGFkZHJlc3M6IDB4JTAyeCIsYWlyMnBjX2F0c2NfaGQ1MDAwX2NvbmZpZy5kZW1vZF9hZGRyZXNzKTsKIAl9IGVsc2UKIAkvKiB0cnkgdGhlIGFpciBhdHNjIDFuZCBnZW5lcmF0aW9uIChiY20zNTEwKS9wYW5hc29uaWMgY3QxMHMgKi8KQEAgLTUyMywxMSArNTQ0LDE0IEBACiAJLyogdHJ5IHRoZSBjYWJsZSBkdmIgKHN0djAyOTcpICovCiAJaWYgKChmYy0+ZmUgPSBzdHYwMjk3X2F0dGFjaCgmYWxwc190ZGVlNF9zdHYwMjk3X2NvbmZpZywgJmZjLT5pMmNfYWRhcCkpICE9IE5VTEwpIHsKIAkJZmMtPmRldl90eXBlICAgICAgICAgICAgICAgICAgICAgICAgPSBGQ19DQUJMRTsKKwkJZmMtPmZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBhbHBzX3RkZWU0X3N0djAyOTdfdHVuZXJfc2V0X3BhcmFtczsKIAkJaW5mbygiZm91bmQgdGhlIHN0djAyOTcgYXQgaTJjIGFkZHJlc3M6IDB4JTAyeCIsYWxwc190ZGVlNF9zdHYwMjk3X2NvbmZpZy5kZW1vZF9hZGRyZXNzKTsKIAl9IGVsc2UKIAkvKiB0cnkgdGhlIHNreSB2Mi4zICh2cDMxMC9TYW1zdW5nIHRiZHUxODEzMih0c2E1MDU5KSkgKi8KIAlpZiAoKGZjLT5mZSA9IHZwMzEwX210MzEyX2F0dGFjaCgmc2t5c3RhcjIzX3NhbXN1bmdfdGJkdTE4MTMyX2NvbmZpZywgJmZjLT5pMmNfYWRhcCkpICE9IE5VTEwpIHsKLQkJb3BzID0gZmMtPmZlLT5vcHM7CisJCW9wcyA9ICZmYy0+ZmUtPm9wczsKKworCQlvcHMtPnR1bmVyX29wcy5zZXRfcGFyYW1zID0gc2t5c3RhcjIzX3NhbXN1bmdfdGJkdTE4MTMyX3R1bmVyX3NldF9wYXJhbXM7CiAKIAkJb3BzLT5kaXNlcWNfc2VuZF9tYXN0ZXJfY21kID0gZmxleGNvcF9kaXNlcWNfc2VuZF9tYXN0ZXJfY21kOwogCQlvcHMtPmRpc2VxY19zZW5kX2J1cnN0ICAgICAgPSBmbGV4Y29wX2Rpc2VxY19zZW5kX2J1cnN0OwpAQCAtNTQ3LDcgKzU3MSw3IEBACiAJfSBlbHNlIHsKIAkJaWYgKGR2Yl9yZWdpc3Rlcl9mcm9udGVuZCgmZmMtPmR2Yl9hZGFwdGVyLCBmYy0+ZmUpKSB7CiAJCQllcnIoImZyb250ZW5kIHJlZ2lzdHJhdGlvbiBmYWlsZWQhIik7Ci0JCQlvcHMgPSBmYy0+ZmUtPm9wczsKKwkJCW9wcyA9ICZmYy0+ZmUtPm9wczsKIAkJCWlmIChvcHMtPnJlbGVhc2UgIT0gTlVMTCkKIAkJCQlvcHMtPnJlbGVhc2UoZmMtPmZlKTsKIAkJCWZjLT5mZSA9IE5VTEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AtcGNpLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AtcGNpLmMKaW5kZXggOWJjNDBiZC4uZjA0MDQxNzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcC1wY2kuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AtcGNpLmMKQEAgLTI0MiwxOSArMjQyLDE2IEBACiAJaWYgKChyZXQgPSBmbGV4Y29wX2RtYV9hbGxvY2F0ZShmY19wY2ktPnBkZXYsJmZjX3BjaS0+ZG1hWzBdLEZDX0RFRkFVTFRfRE1BMV9CVUZTSVpFKSkgIT0gMCkKIAkJcmV0dXJuIHJldDsKIAotCWlmICgocmV0ID0gZmxleGNvcF9kbWFfYWxsb2NhdGUoZmNfcGNpLT5wZGV2LCZmY19wY2ktPmRtYVsxXSxGQ19ERUZBVUxUX0RNQTJfQlVGU0laRSkpICE9IDApCi0JCWdvdG8gZG1hMV9mcmVlOworCWlmICgocmV0ID0gZmxleGNvcF9kbWFfYWxsb2NhdGUoZmNfcGNpLT5wZGV2LCZmY19wY2ktPmRtYVsxXSxGQ19ERUZBVUxUX0RNQTJfQlVGU0laRSkpICE9IDApIHsKKwkJZmxleGNvcF9kbWFfZnJlZSgmZmNfcGNpLT5kbWFbMF0pOworCQlyZXR1cm4gcmV0OworCX0KIAogCWZsZXhjb3Bfc3JhbV9zZXRfZGVzdChmY19wY2ktPmZjX2RldixGQ19TUkFNX0RFU1RfTUVESUEgfCBGQ19TUkFNX0RFU1RfTkVULCBGQ19TUkFNX0RFU1RfVEFSR0VUX0RNQTEpOwogCWZsZXhjb3Bfc3JhbV9zZXRfZGVzdChmY19wY2ktPmZjX2RldixGQ19TUkFNX0RFU1RfQ0FPICAgfCBGQ19TUkFNX0RFU1RfQ0FJLCBGQ19TUkFNX0RFU1RfVEFSR0VUX0RNQTIpOwogCiAJZmNfcGNpLT5pbml0X3N0YXRlIHw9IEZDX1BDSV9ETUFfSU5JVDsKIAotCWdvdG8gc3VjY2VzczsKLWRtYTFfZnJlZToKLQlmbGV4Y29wX2RtYV9mcmVlKCZmY19wY2ktPmRtYVswXSk7Ci0KLXN1Y2Nlc3M6CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMzAzLDcgKzMwMCw3IEBACiAJc3Bpbl9sb2NrX2luaXQoJmZjX3BjaS0+aXJxX2xvY2spOwogCiAJZmNfcGNpLT5pbml0X3N0YXRlIHw9IEZDX1BDSV9JTklUOwotCWdvdG8gc3VjY2VzczsKKwlyZXR1cm4gcmV0OwogCiBlcnJfcGNpX2lvdW5tYXA6CiAJcGNpX2lvdW5tYXAoZmNfcGNpLT5wZGV2LCBmY19wY2ktPmlvX21lbSk7CkBAIC0zMTIsOCArMzA5LDYgQEAKIAlwY2lfcmVsZWFzZV9yZWdpb25zKGZjX3BjaS0+cGRldik7CiBlcnJfcGNpX2Rpc2FibGVfZGV2aWNlOgogCXBjaV9kaXNhYmxlX2RldmljZShmY19wY2ktPnBkZXYpOwotCi1zdWNjZXNzOgogCXJldHVybiByZXQ7CiB9CiAKQEAgLTM3OCwxNCArMzczLDE0IEBACiAKIAlJTklUX1dPUksoJmZjX3BjaS0+aXJxX2NoZWNrX3dvcmssIGZsZXhjb3BfcGNpX2lycV9jaGVja193b3JrLCBmY19wY2kpOwogCi0JZ290byBzdWNjZXNzOworCXJldHVybiByZXQ7CisKIGVycl9mY19leGl0OgogCWZsZXhjb3BfZGV2aWNlX2V4aXQoZmMpOwogZXJyX3BjaV9leGl0OgogCWZsZXhjb3BfcGNpX2V4aXQoZmNfcGNpKTsKIGVycl9rZnJlZToKIAlmbGV4Y29wX2RldmljZV9rZnJlZShmYyk7Ci1zdWNjZXNzOgogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcC11c2IuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcC11c2IuYwppbmRleCAwNmVjOWZmZi4uNTE1OTU0ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLXVzYi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcC11c2IuYwpAQCAtNDMzLDExICs0MzMsMTAgQEAKIAlmbGV4Y29wX3dhbl9zZXRfc3BlZWQoZmNfdXNiLT5mY19kZXYsRkNfV0FOX1NQRUVEXzhNQklUUyk7CiAJZmxleGNvcF9zcmFtX2N0cmwoZmNfdXNiLT5mY19kZXYsMSwxLDEpOwogCi0JcmV0ID0gMDsKLQlnb3RvIHN1Y2Nlc3M7CisJcmV0dXJuIDA7CisKIHVyYl9lcnJvcjoKIAlmbGV4Y29wX3VzYl90cmFuc2Zlcl9leGl0KGZjX3VzYik7Ci1zdWNjZXNzOgogCXJldHVybiByZXQ7CiB9CiAKQEAgLTUxNSwxNSArNTE0LDE0IEBACiAJCWdvdG8gZXJyX2ZjX2V4aXQ7CiAKIAlpbmZvKCIlcyBzdWNjZXNzZnVsbHkgaW5pdGlhbGl6ZWQgYW5kIGNvbm5lY3RlZC4iLERSSVZFUl9OQU1FKTsKLQlyZXQgPSAwOwotCWdvdG8gc3VjY2VzczsKKwlyZXR1cm4gMDsKKwogZXJyX2ZjX2V4aXQ6CiAJZmxleGNvcF9kZXZpY2VfZXhpdChmYyk7CiBlcnJfdXNiX2V4aXQ6CiAJZmxleGNvcF91c2JfZXhpdChmY191c2IpOwogZXJyX2tmcmVlOgogCWZsZXhjb3BfZGV2aWNlX2tmcmVlKGZjKTsKLXN1Y2Nlc3M6CiAJcmV0dXJuIHJldDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AuYwppbmRleCA1NmJhNTI0Li4yOWVjNDE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AuYwpAQCAtNjcsNyArNjcsNyBAQAogc3RhdGljIGludCBmbGV4Y29wX2R2Yl9pbml0KHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMpCiB7CiAJaW50IHJldDsKLQlpZiAoKHJldCA9IGR2Yl9yZWdpc3Rlcl9hZGFwdGVyKCZmYy0+ZHZiX2FkYXB0ZXIsIkZsZXhDb3AgRGlnaXRhbCBUViBkZXZpY2UiLGZjLT5vd25lcikpIDwgMCkgeworCWlmICgocmV0ID0gZHZiX3JlZ2lzdGVyX2FkYXB0ZXIoJmZjLT5kdmJfYWRhcHRlciwiRmxleENvcCBEaWdpdGFsIFRWIGRldmljZSIsZmMtPm93bmVyLGZjLT5kZXYpKSA8IDApIHsKIAkJZXJyKCJlcnJvciByZWdpc3RlcmluZyBEVkIgYWRhcHRlciIpOwogCQlyZXR1cm4gcmV0OwogCX0KQEAgLTExNiw3ICsxMTYsNyBAQAogCWR2Yl9uZXRfaW5pdCgmZmMtPmR2Yl9hZGFwdGVyLCAmZmMtPmR2Ym5ldCwgJmZjLT5kZW11eC5kbXgpOwogCiAJZmMtPmluaXRfc3RhdGUgfD0gRkNfU1RBVEVfRFZCX0lOSVQ7Ci0JZ290byBzdWNjZXNzOworCXJldHVybiAwOwogCiBlcnJfY29ubmVjdF9mcm9udGVuZDoKIAlmYy0+ZGVtdXguZG14LnJlbW92ZV9mcm9udGVuZCgmZmMtPmRlbXV4LmRteCwmZmMtPm1lbV9mcm9udGVuZCk7CkBAIC0xMjksOSArMTI5LDYgQEAKIGVycl9kbXg6CiAJZHZiX3VucmVnaXN0ZXJfYWRhcHRlcigmZmMtPmR2Yl9hZGFwdGVyKTsKIAlyZXR1cm4gcmV0OwotCi1zdWNjZXNzOgotCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBmbGV4Y29wX2R2Yl9leGl0KHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMpCkBAIC0yNzksMTEgKzI3NiwxMCBAQAogCiAJZmxleGNvcF9kZXZpY2VfbmFtZShmYywiaW5pdGlhbGl6YXRpb24gb2YiLCJjb21wbGV0ZSIpOwogCi0JcmV0ID0gMDsKLQlnb3RvIHN1Y2Nlc3M7CisJcmV0dXJuIDA7CisKIGVycm9yOgogCWZsZXhjb3BfZGV2aWNlX2V4aXQoZmMpOwotc3VjY2VzczoKIAlyZXR1cm4gcmV0OwogfQogRVhQT1JUX1NZTUJPTChmbGV4Y29wX2RldmljZV9pbml0aWFsaXplKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2J0ODc4LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9idDg3OC5jCmluZGV4IDU1MDBmOGEuLjc2MWZhNmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2J0ODc4LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvYnQ4NzguYwpAQCAtNjMsOCArNjMsNiBAQAogaW50IGJ0ODc4X251bTsKIHN0cnVjdCBidDg3OCBidDg3OFtCVDg3OF9NQVhdOwogCi1FWFBPUlRfU1lNQk9MKGJ0ODc4X2RlYnVnKTsKLUVYUE9SVF9TWU1CT0woYnQ4NzhfdmVyYm9zZSk7CiBFWFBPUlRfU1lNQk9MKGJ0ODc4X251bSk7CiBFWFBPUlRfU1lNQk9MKGJ0ODc4KTsKIApAQCAtMzkzLDcgKzM5MSw5IEBACiAJeyAweDA3NzExNDYxLCBCVFRWX0JPQVJEX0FWRFZCVF83NzEsCQkJIkFWZXJtZWRpYSBBdmVyVFYgRFZCLVQgNzcxIiB9LAogCXsgMHhkYjEwMThhYywgQlRUVl9CT0FSRF9EVklDT19EVkJUX0xJVEUsCQkiRFZpQ08gRnVzaW9uSERUViBEVkItVCBMaXRlIiB9LAogCXsgMHhkNTAwMThhYywgQlRUVl9CT0FSRF9EVklDT19GVVNJT05IRFRWXzVfTElURSwJIkRWaUNPIEZ1c2lvbkhEVFYgNSBMaXRlIiB9LAotCXsgMHgyMDAwNzA2MywgQlRUVl9CT0FSRF9QQ19IRFRWLAkJCSJwY0hEVFYgSEQtMjAwMCBUViJ9LAorCXsgMHgyMDAwNzA2MywgQlRUVl9CT0FSRF9QQ19IRFRWLAkJCSJwY0hEVFYgSEQtMjAwMCBUViIgfSwKKwl7IDB4MDAyNjE4MjIsIEJUVFZfQk9BUkRfVFdJTkhBTl9EU1QsCQkJIkROVFYgTGl2ZSEgTWluaSIgfSwKKwogCXsgMCwgLTEsIE5VTEwgfQogfTsKIApAQCAtNDE3LDYgKzQxNywxMSBAQAogCiAJcHJpbnRrKEtFUk5fSU5GTyAiYnQ4Nzg6IEJ0ODc4IEFVRElPIGZ1bmN0aW9uIGZvdW5kICglZCkuXG4iLAogCSAgICAgICBidDg3OF9udW0pOworCWlmIChidDg3OF9udW0gPj0gQlQ4NzhfTUFYKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYnQ4Nzg6IFRvbyBtYW55IGRldmljZXMgaW5zZXJ0ZWRcbiIpOworCQlyZXN1bHQgPSAtRU5PTUVNOworCQlnb3RvIGZhaWwwOworCX0KIAlpZiAocGNpX2VuYWJsZV9kZXZpY2UoZGV2KSkKIAkJcmV0dXJuIC1FSU87CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2RzdC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvZHN0LmMKaW5kZXggMWNmYTVlNS4uZDY4N2ExNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvZHN0LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvZHN0LmMKQEAgLTM4LDYgKzM4LDEwIEBACiBtb2R1bGVfcGFyYW0oZHN0X2FkZG9ucywgaW50LCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoZHN0X2FkZG9ucywgIkNBIGRhdWdodGVyYm9hcmQsIGRlZmF1bHQgaXMgMCAoTm8gYWRkb25zKSIpOwogCitzdGF0aWMgdW5zaWduZWQgaW50IGRzdF9hbGdvOworbW9kdWxlX3BhcmFtKGRzdF9hbGdvLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhkc3RfYWxnbywgInR1bmluZyBhbGdvOiBkZWZhdWx0IGlzIDA9KFNXKSwgMT0oSFcpIik7CisKICNkZWZpbmUgSEFTX0xPQ0sJCTEKICNkZWZpbmUgQVRURU1QVF9UVU5FCQkyCiAjZGVmaW5lIEhBU19QT1dFUgkJNApAQCAtNDcsMjAgKzUxLDI0IEBACiAjZGVmaW5lIERTVF9JTkZPCQkyCiAjZGVmaW5lIERTVF9ERUJVRwkJMwogCi0jZGVmaW5lIGRwcmludGsoeCwgeSwgeiwgZm9ybWF0LCBhcmcuLi4pIGRvIHsJCQkJCQlcCi0JaWYgKHopIHsJCQkJCQkJCQlcCi0JCWlmCSgoeCA+IERTVF9FUlJPUikgJiYgKHggPiB5KSkJCQkJCVwKLQkJCXByaW50ayhLRVJOX0VSUiAiJXM6ICIgZm9ybWF0ICJcbiIsIF9fRlVOQ1RJT05fXyAsICMjYXJnKTsJXAotCQllbHNlIGlmCSgoeCA+IERTVF9OT1RJQ0UpICYmICh4ID4geSkpCQkJCQlcCi0JCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiAiIGZvcm1hdCAiXG4iLCBfX0ZVTkNUSU9OX18gLCAjI2FyZyk7CVwKLQkJZWxzZSBpZiAoKHggPiBEU1RfSU5GTykgJiYgKHggPiB5KSkJCQkJCVwKLQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiAiIGZvcm1hdCAiXG4iLCBfX0ZVTkNUSU9OX18gLCAjI2FyZyk7CVwKLQkJZWxzZSBpZiAoKHggPiBEU1RfREVCVUcpICYmICh4ID4geSkpCQkJCQlcCi0JCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICIgZm9ybWF0ICJcbiIsIF9fRlVOQ1RJT05fXyAsICMjYXJnKTsJXAotCX0gZWxzZSB7CQkJCQkJCQkJXAotCQlpZiAoeCA+IHkpCQkJCQkJCQlcCi0JCQlwcmludGsoZm9ybWF0LCAjI2FyZyk7CQkJCQkJXAotCX0JCQkJCQkJCQkJXAorI2RlZmluZSBkcHJpbnRrKHgsIHksIHosIGZvcm1hdCwgYXJnLi4uKSBkbyB7CQkJCVwKKwlpZiAoeikgewkJCQkJCQlcCisJCWlmCSgoeCA+IERTVF9FUlJPUikgJiYgKHggPiB5KSkJCQlcCisJCQlwcmludGsoS0VSTl9FUlIgImRzdCglZCkgJXM6ICIgZm9ybWF0ICJcbiIsCVwKKwkJCQlzdGF0ZS0+YnQtPm5yLCBfX2Z1bmNfXyAsICMjYXJnKTsJXAorCQllbHNlIGlmCSgoeCA+IERTVF9OT1RJQ0UpICYmICh4ID4geSkpCQkJXAorCQkJcHJpbnRrKEtFUk5fTk9USUNFICJkc3QoJWQpICVzOiAiIGZvcm1hdCAiXG4iLCAgXAorCQkJCXN0YXRlLT5idC0+bnIsIF9fZnVuY19fICwgIyNhcmcpOwlcCisJCWVsc2UgaWYgKCh4ID4gRFNUX0lORk8pICYmICh4ID4geSkpCQkJXAorCQkJcHJpbnRrKEtFUk5fSU5GTyAiZHN0KCVkKSAlczogIiBmb3JtYXQgIlxuIiwJXAorCQkJCXN0YXRlLT5idC0+bnIsIF9fZnVuY19fICwgIyNhcmcpOwlcCisJCWVsc2UgaWYgKCh4ID4gRFNUX0RFQlVHKSAmJiAoeCA+IHkpKQkJCVwKKwkJCXByaW50ayhLRVJOX0RFQlVHICJkc3QoJWQpICVzOiAiIGZvcm1hdCAiXG4iLAlcCisJCQkJc3RhdGUtPmJ0LT5uciwgIF9fZnVuY19fICwgIyNhcmcpOwlcCisJfSBlbHNlIHsJCQkJCQkJXAorCQlpZiAoeCA+IHkpCQkJCQkJXAorCQkJcHJpbnRrKGZvcm1hdCwgIyNhcmcpOwkJCQlcCisJfQkJCQkJCQkJXAogfSB3aGlsZSgwKQogCiAKQEAgLTExMCw3ICsxMTgsNyBAQAogCiAJKnJlc3VsdCA9IDA7CiAJaWYgKChlcnIgPSBidDg3OF9kZXZpY2VfY29udHJvbChzdGF0ZS0+YnQsIERTVF9JR19SRUFELCAmcmRfcGFja2V0KSkgPCAwKSB7Ci0JCWRwcmludGsodmVyYm9zZSwgRFNUX0VSUk9SLCAxLCAiZHN0X2dwaW9faW5iIGVycm9yIChlcnIgPT0gJWkpXG4iLCBlcnIpOworCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9FUlJPUiwgMSwgImRzdF9ncGlvX2luYiBlcnJvciAoZXJyID09ICVpKSIsIGVycik7CiAJCXJldHVybiAtRVJFTU9URUlPOwogCX0KIAkqcmVzdWx0ID0gKHU4KSByZF9wYWNrZXQucmQudmFsdWU7CkBAIC0zNjMsNiArMzcxLDE3IEBACiAJCXN0YXRlLT50eF90dW5hWzJdID0gKGZyZXEgPj4gMTYpICYgMHhmZjsKIAkJc3RhdGUtPnR4X3R1bmFbM10gPSAoZnJlcSA+PiA4KSAmIDB4ZmY7CiAJCXN0YXRlLT50eF90dW5hWzRdID0gKHU4KSBmcmVxOworCX0gZWxzZSBpZiAoc3RhdGUtPmRzdF90eXBlID09IERTVF9UWVBFX0lTX0FUU0MpIHsKKwkJZnJlcSA9IGZyZXEgLyAxMDAwOworCQlpZiAoZnJlcSA8IDUxMDAwIHx8IGZyZXEgPiA4NTgwMDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJc3RhdGUtPnR4X3R1bmFbMl0gPSAoZnJlcSA+PiAxNikgJiAweGZmOworCQlzdGF0ZS0+dHhfdHVuYVszXSA9IChmcmVxID4+ICA4KSAmIDB4ZmY7CisJCXN0YXRlLT50eF90dW5hWzRdID0gKHU4KSBmcmVxOworCQlzdGF0ZS0+dHhfdHVuYVs1XSA9IDB4MDA7CQkvKglBVFNDCSovCisJCXN0YXRlLT50eF90dW5hWzZdID0gMHgwMDsKKwkJaWYgKHN0YXRlLT5kc3RfaHdfY2FwICYgRFNUX1RZUEVfSEFTX0FOQUxPRykKKwkJCXN0YXRlLT50eF90dW5hWzddID0gMHgwMDsJLyoJRGlnaXRhbAkqLwogCX0gZWxzZQogCQlyZXR1cm4gLUVJTlZBTDsKIApAQCAtNDQ3LDI5ICs0NjYsNDEgQEAKIAl9CiAJZHByaW50ayh2ZXJib3NlLCBEU1RfSU5GTywgMSwgInNldCBzeW1yYXRlICV1Iiwgc3JhdGUpOwogCXNyYXRlIC89IDEwMDA7Ci0JaWYgKHN0YXRlLT50eXBlX2ZsYWdzICYgRFNUX1RZUEVfSEFTX1NZTURJVikgewotCQlzdmFsID0gc3JhdGU7Ci0JCXN2YWwgPDw9IDIwOwotCQlkb19kaXYoc3ZhbCwgODgwMDApOwotCQlzeW1jYWxjID0gKHUzMikgc3ZhbDsKLQkJZHByaW50ayh2ZXJib3NlLCBEU1RfSU5GTywgMSwgInNldCBzeW1jYWxjICV1Iiwgc3ltY2FsYyk7Ci0JCXN0YXRlLT50eF90dW5hWzVdID0gKHU4KSAoc3ltY2FsYyA+PiAxMik7Ci0JCXN0YXRlLT50eF90dW5hWzZdID0gKHU4KSAoc3ltY2FsYyA+PiA0KTsKLQkJc3RhdGUtPnR4X3R1bmFbN10gPSAodTgpIChzeW1jYWxjIDw8IDQpOwotCX0gZWxzZSB7Ci0JCXN0YXRlLT50eF90dW5hWzVdID0gKHU4KSAoc3JhdGUgPj4gMTYpICYgMHg3ZjsKLQkJc3RhdGUtPnR4X3R1bmFbNl0gPSAodTgpIChzcmF0ZSA+PiA4KTsKLQkJc3RhdGUtPnR4X3R1bmFbN10gPSAodTgpIHNyYXRlOwotCX0KLQlzdGF0ZS0+dHhfdHVuYVs4XSAmPSB+MHgyMDsKLQlpZiAoc3RhdGUtPnR5cGVfZmxhZ3MgJiBEU1RfVFlQRV9IQVNfT0JTX1JFR1MpIHsKLQkJaWYgKHNyYXRlID4gODAwMCkKLQkJCXN0YXRlLT50eF90dW5hWzhdIHw9IDB4MjA7CisJaWYgKHN0YXRlLT5kc3RfdHlwZSA9PSBEU1RfVFlQRV9JU19TQVQpIHsKKwkJaWYgKHN0YXRlLT50eXBlX2ZsYWdzICYgRFNUX1RZUEVfSEFTX1NZTURJVikgeworCQkJc3ZhbCA9IHNyYXRlOworCQkJc3ZhbCA8PD0gMjA7CisJCQlkb19kaXYoc3ZhbCwgODgwMDApOworCQkJc3ltY2FsYyA9ICh1MzIpIHN2YWw7CisJCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9JTkZPLCAxLCAic2V0IHN5bWNhbGMgJXUiLCBzeW1jYWxjKTsKKwkJCXN0YXRlLT50eF90dW5hWzVdID0gKHU4KSAoc3ltY2FsYyA+PiAxMik7CisJCQlzdGF0ZS0+dHhfdHVuYVs2XSA9ICh1OCkgKHN5bWNhbGMgPj4gNCk7CisJCQlzdGF0ZS0+dHhfdHVuYVs3XSA9ICh1OCkgKHN5bWNhbGMgPDwgNCk7CisJCX0gZWxzZSB7CisJCQlzdGF0ZS0+dHhfdHVuYVs1XSA9ICh1OCkgKHNyYXRlID4+IDE2KSAmIDB4N2Y7CisJCQlzdGF0ZS0+dHhfdHVuYVs2XSA9ICh1OCkgKHNyYXRlID4+IDgpOworCQkJc3RhdGUtPnR4X3R1bmFbN10gPSAodTgpIHNyYXRlOworCQl9CisJCXN0YXRlLT50eF90dW5hWzhdICY9IH4weDIwOworCQlpZiAoc3RhdGUtPnR5cGVfZmxhZ3MgJiBEU1RfVFlQRV9IQVNfT0JTX1JFR1MpIHsKKwkJCWlmIChzcmF0ZSA+IDgwMDApCisJCQkJc3RhdGUtPnR4X3R1bmFbOF0gfD0gMHgyMDsKKwkJfQorCX0gZWxzZSBpZiAoc3RhdGUtPmRzdF90eXBlID09IERTVF9UWVBFX0lTX0NBQkxFKSB7CisJCWRwcmludGsodmVyYm9zZSwgRFNUX0RFQlVHLCAxLCAiJXMiLCBzdGF0ZS0+ZndfbmFtZSk7CisJCWlmICghc3RybmNtcChzdGF0ZS0+ZndfbmFtZSwgIkRDVE5FVyIsIDYpKSB7CisJCQlzdGF0ZS0+dHhfdHVuYVs1XSA9ICh1OCkgKHNyYXRlID4+IDgpOworCQkJc3RhdGUtPnR4X3R1bmFbNl0gPSAodTgpIHNyYXRlOworCQkJc3RhdGUtPnR4X3R1bmFbN10gPSAweDAwOworCQl9IGVsc2UgaWYgKCFzdHJuY21wKHN0YXRlLT5md19uYW1lLCAiRENULUNJIiwgNikpIHsKKwkJCXN0YXRlLT50eF90dW5hWzVdID0gMHgwMDsKKwkJCXN0YXRlLT50eF90dW5hWzZdID0gKHU4KSAoc3JhdGUgPj4gOCk7CisJCQlzdGF0ZS0+dHhfdHVuYVs3XSA9ICh1OCkgc3JhdGU7CisJCX0KIAl9CiAJcmV0dXJuIDA7CiB9CiAKLQogc3RhdGljIGludCBkc3Rfc2V0X21vZHVsYXRpb24oc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUsIGZlX21vZHVsYXRpb25fdCBtb2R1bGF0aW9uKQogewogCWlmIChzdGF0ZS0+ZHN0X3R5cGUgIT0gRFNUX1RZUEVfSVNfQ0FCTEUpCkBAIC00OTAsNyArNTIxLDEwIEBACiAJCXN0YXRlLT50eF90dW5hWzhdID0gMHg4MDsKIAkJYnJlYWs7CiAJY2FzZSBRQU1fMjU2OgotCQlzdGF0ZS0+dHhfdHVuYVs4XSA9IDB4MDA7CisJCWlmICghc3RybmNtcChzdGF0ZS0+ZndfbmFtZSwgIkRDVE5FVyIsIDYpKQorCQkJc3RhdGUtPnR4X3R1bmFbOF0gPSAweGZmOworCQllbHNlIGlmICghc3RybmNtcChzdGF0ZS0+ZndfbmFtZSwgIkRDVC1DSSIsIDYpKQorCQkJc3RhdGUtPnR4X3R1bmFbOF0gPSAweDAwOwogCQlicmVhazsKIAljYXNlIFFQU0s6CiAJY2FzZSBRQU1fQVVUTzoKQEAgLTUyMywxMyArNTU3LDE5IEBACiB9CiBFWFBPUlRfU1lNQk9MKGRzdF9jaGVja19zdW0pOwogCi1zdGF0aWMgdm9pZCBkc3RfdHlwZV9mbGFnc19wcmludCh1MzIgdHlwZV9mbGFncykKK3N0YXRpYyB2b2lkIGRzdF90eXBlX2ZsYWdzX3ByaW50KHN0cnVjdCBkc3Rfc3RhdGUgKnN0YXRlKQogeworCXUzMiB0eXBlX2ZsYWdzID0gc3RhdGUtPnR5cGVfZmxhZ3M7CisKIAlkcHJpbnRrKHZlcmJvc2UsIERTVF9FUlJPUiwgMCwgIkRTVCB0eXBlIGZsYWdzIDoiKTsKLQlpZiAodHlwZV9mbGFncyAmIERTVF9UWVBFX0hBU19ORVdUVU5FKQotCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9FUlJPUiwgMCwgIiAweCV4IG5ld3R1bmVyIiwgRFNUX1RZUEVfSEFTX05FV1RVTkUpOworCWlmICh0eXBlX2ZsYWdzICYgRFNUX1RZUEVfSEFTX1RTMTg4KQorCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9FUlJPUiwgMCwgIiAweCV4IG5ld3R1bmVyIiwgRFNUX1RZUEVfSEFTX1RTMTg4KTsKKwlpZiAodHlwZV9mbGFncyAmIERTVF9UWVBFX0hBU19ORVdUVU5FXzIpCisJCWRwcmludGsodmVyYm9zZSwgRFNUX0VSUk9SLCAwLCAiIDB4JXggbmV3dHVuZXIgMiIsIERTVF9UWVBFX0hBU19ORVdUVU5FXzIpOwogCWlmICh0eXBlX2ZsYWdzICYgRFNUX1RZUEVfSEFTX1RTMjA0KQogCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9FUlJPUiwgMCwgIiAweCV4IHRzMjA0IiwgRFNUX1RZUEVfSEFTX1RTMjA0KTsKKwlpZiAodHlwZV9mbGFncyAmIERTVF9UWVBFX0hBU19WTEYpCisJCWRwcmludGsodmVyYm9zZSwgRFNUX0VSUk9SLCAwLCAiIDB4JXggVkxGIiwgRFNUX1RZUEVfSEFTX1ZMRik7CiAJaWYgKHR5cGVfZmxhZ3MgJiBEU1RfVFlQRV9IQVNfU1lNRElWKQogCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9FUlJPUiwgMCwgIiAweCV4IHN5bWRpdiIsIERTVF9UWVBFX0hBU19TWU1ESVYpOwogCWlmICh0eXBlX2ZsYWdzICYgRFNUX1RZUEVfSEFTX0ZXXzEpCkBAIC01NDIsNyArNTgyLDcgQEAKIH0KIAogCi1zdGF0aWMgaW50IGRzdF90eXBlX3ByaW50KHU4IHR5cGUpCitzdGF0aWMgaW50IGRzdF90eXBlX3ByaW50KHN0cnVjdCBkc3Rfc3RhdGUgKnN0YXRlLCB1OCB0eXBlKQogewogCWNoYXIgKm90eXBlOwogCXN3aXRjaCAodHlwZSkgewpAQCAtNTU4LDYgKzU5OCwxMCBAQAogCQlvdHlwZSA9ICJjYWJsZSI7CiAJCWJyZWFrOwogCisJY2FzZSBEU1RfVFlQRV9JU19BVFNDOgorCQlvdHlwZSA9ICJhdHNjIjsKKwkJYnJlYWs7CisKIAlkZWZhdWx0OgogCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9JTkZPLCAxLCAiaW52YWxpZCBkc3QgdHlwZSAlZCIsIHR5cGUpOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTU2Nyw2ICs2MTEsMTI3IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0cnVjdCB0dW5lcl90eXBlcyB0dW5lcl9saXN0W10gPSB7CisJeworCQkudHVuZXJfdHlwZSA9IFRVTkVSX1RZUEVfTDY0NzI0LAorCQkudHVuZXJfbmFtZSA9ICJMIDY0NzI0IiwKKwkJLmJvYXJkX25hbWUgPSAiVU5LTk9XTiIsCisJCS5md19uYW1lICAgID0gIlVOS05PV04iCisJfSwKKworCXsKKwkJLnR1bmVyX3R5cGUgPSBUVU5FUl9UWVBFX1NUVjAyOTksCisJCS50dW5lcl9uYW1lID0gIlNUViAwMjk5IiwKKwkJLmJvYXJkX25hbWUgPSAiVlAxMDIwIiwKKwkJLmZ3X25hbWUgICAgPSAiRFNULU1PVCIKKwl9LAorCisJeworCQkudHVuZXJfdHlwZSA9IFRVTkVSX1RZUEVfU1RWMDI5OSwKKwkJLnR1bmVyX25hbWUgPSAiU1RWIDAyOTkiLAorCQkuYm9hcmRfbmFtZSA9ICJWUDEwMjAiLAorCQkuZndfbmFtZSAgICA9ICJEU1QtMDNUIgorCX0sCisKKwl7CisJCS50dW5lcl90eXBlID0gVFVORVJfVFlQRV9NQjg2QTE1LAorCQkudHVuZXJfbmFtZSA9ICJNQiA4NkExNSIsCisJCS5ib2FyZF9uYW1lID0gIlZQMTAyMiIsCisJCS5md19uYW1lICAgID0gIkRTVC0wM1QiCisJfSwKKworCXsKKwkJLnR1bmVyX3R5cGUgPSBUVU5FUl9UWVBFX01CODZBMTUsCisJCS50dW5lcl9uYW1lID0gIk1CIDg2QTE1IiwKKwkJLmJvYXJkX25hbWUgPSAiVlAxMDI1IiwKKwkJLmZ3X25hbWUgICAgPSAiRFNULTAzVCIKKwl9LAorCisJeworCQkudHVuZXJfdHlwZSA9IFRVTkVSX1RZUEVfU1RWMDI5OSwKKwkJLnR1bmVyX25hbWUgPSAiU1RWIDAyOTkiLAorCQkuYm9hcmRfbmFtZSA9ICJWUDEwMzAiLAorCQkuZndfbmFtZSAgICA9ICJEU1QtQ0kiCisJfSwKKworCXsKKwkJLnR1bmVyX3R5cGUgPSBUVU5FUl9UWVBFX1NUVjAyOTksCisJCS50dW5lcl9uYW1lID0gIlNUViAwMjk5IiwKKwkJLmJvYXJkX25hbWUgPSAiVlAxMDMwIiwKKwkJLmZ3X25hbWUgICAgPSAiRFNUTUNJIgorCX0sCisKKwl7CisJCS50dW5lcl90eXBlID0gVFVORVJfVFlQRV9VTktOT1dOLAorCQkudHVuZXJfbmFtZSA9ICJVTktOT1dOIiwKKwkJLmJvYXJkX25hbWUgPSAiVlAyMDIxIiwKKwkJLmZ3X25hbWUgICAgPSAiRENUTkVXIgorCX0sCisKKwl7CisJCS50dW5lcl90eXBlID0gVFVORVJfVFlQRV9VTktOT1dOLAorCQkudHVuZXJfbmFtZSA9ICJVTktOT1dOIiwKKwkJLmJvYXJkX25hbWUgPSAiVlAyMDMwIiwKKwkJLmZ3X25hbWUgICAgPSAiRENULUNJIgorCX0sCisKKwl7CisJCS50dW5lcl90eXBlID0gVFVORVJfVFlQRV9VTktOT1dOLAorCQkudHVuZXJfbmFtZSA9ICJVTktOT1dOIiwKKwkJLmJvYXJkX25hbWUgPSAiVlAyMDMxIiwKKwkJLmZ3X25hbWUgICAgPSAiRENULUNJIgorCX0sCisKKwl7CisJCS50dW5lcl90eXBlID0gVFVORVJfVFlQRV9VTktOT1dOLAorCQkudHVuZXJfbmFtZSA9ICJVTktOT1dOIiwKKwkJLmJvYXJkX25hbWUgPSAiVlAyMDQwIiwKKwkJLmZ3X25hbWUgICAgPSAiRENULUNJIgorCX0sCisKKwl7CisJCS50dW5lcl90eXBlID0gVFVORVJfVFlQRV9VTktOT1dOLAorCQkudHVuZXJfbmFtZSA9ICJVTktOT1dOIiwKKwkJLmJvYXJkX25hbWUgPSAiVlAzMDIwIiwKKwkJLmZ3X25hbWUgICAgPSAiRFRURlRBIgorCX0sCisKKwl7CisJCS50dW5lcl90eXBlID0gVFVORVJfVFlQRV9VTktOT1dOLAorCQkudHVuZXJfbmFtZSA9ICJVTktOT1dOIiwKKwkJLmJvYXJkX25hbWUgPSAiVlAzMDIxIiwKKwkJLmZ3X25hbWUgICAgPSAiRFRURlRBIgorCX0sCisKKwl7CisJCS50dW5lcl90eXBlID0gVFVORVJfVFlQRV9UREExMDA0NiwKKwkJLnR1bmVyX25hbWUgPSAiVERBMTAwNDYiLAorCQkuYm9hcmRfbmFtZSA9ICJWUDMwNDAiLAorCQkuZndfbmFtZSAgICA9ICJEVFQtQ0kiCisJfSwKKworCXsKKwkJLnR1bmVyX3R5cGUgPSBUVU5FUl9UWVBFX1VOS05PV04sCisJCS50dW5lcl9uYW1lID0gIlVOS05PV04iLAorCQkuYm9hcmRfbmFtZSA9ICJWUDMwNTEiLAorCQkuZndfbmFtZSAgICA9ICJEVFROWFQiCisJfSwKKworCXsKKwkJLnR1bmVyX3R5cGUgPSBUVU5FUl9UWVBFX05YVDIwMHgsCisJCS50dW5lcl9uYW1lID0gIk5YVDIwMHgiLAorCQkuYm9hcmRfbmFtZSA9ICJWUDMyMjAiLAorCQkuZndfbmFtZSAgICA9ICJBVFNDREkiCisJfSwKKworCXsKKwkJLnR1bmVyX3R5cGUgPSBUVU5FUl9UWVBFX05YVDIwMHgsCisJCS50dW5lcl9uYW1lID0gIk5YVDIwMHgiLAorCQkuYm9hcmRfbmFtZSA9ICJWUDMyNTAiLAorCQkuZndfbmFtZSAgICA9ICJBVFNDQUQiCisJfSwKK307CisKIC8qCiAJS25vd24gY2FyZHMgbGlzdAogCVNhdGVsbGl0ZQpAQCAtNjA4LDcgKzc3Myw4IEBACiAJCS5vZmZzZXQgPSAwLAogCQkuZHN0X3R5cGUgPSAgRFNUX1RZUEVfSVNfU0FULAogCQkudHlwZV9mbGFncyA9IERTVF9UWVBFX0hBU19TWU1ESVYgfCBEU1RfVFlQRV9IQVNfRldfMSB8IERTVF9UWVBFX0hBU19PQlNfUkVHUywKLQkJLmRzdF9mZWF0dXJlID0gMAorCQkuZHN0X2ZlYXR1cmUgPSAwLAorCQkudHVuZXJfdHlwZSA9IDAKIAl9LAkvKglvYnNvbGV0ZQkqLwogCiAJewpAQCAtNjE2LDE1ICs3ODIsMTcgQEAKIAkJLm9mZnNldCA9IDAsCiAJCS5kc3RfdHlwZSA9ICBEU1RfVFlQRV9JU19TQVQsCiAJCS50eXBlX2ZsYWdzID0gRFNUX1RZUEVfSEFTX1NZTURJViB8IERTVF9UWVBFX0hBU19GV18xLAotCQkuZHN0X2ZlYXR1cmUgPSAwCisJCS5kc3RfZmVhdHVyZSA9IDAsCisJCS50dW5lcl90eXBlID0gMAogCX0sCS8qCW9ic29sZXRlCSovCiAKIAl7CiAJCS5kZXZpY2VfaWQgPSAiRFNULTAzMCIsCiAJCS5vZmZzZXQgPSAgMCwKIAkJLmRzdF90eXBlID0gRFNUX1RZUEVfSVNfU0FULAotCQkudHlwZV9mbGFncyA9IERTVF9UWVBFX0hBU19UUzIwNCB8IERTVF9UWVBFX0hBU19ORVdUVU5FIHwgRFNUX1RZUEVfSEFTX0ZXXzEsCi0JCS5kc3RfZmVhdHVyZSA9IDAKKwkJLnR5cGVfZmxhZ3MgPSBEU1RfVFlQRV9IQVNfVFMyMDQgfCBEU1RfVFlQRV9IQVNfVFMxODggfCBEU1RfVFlQRV9IQVNfRldfMSwKKwkJLmRzdF9mZWF0dXJlID0gMCwKKwkJLnR1bmVyX3R5cGUgPSAwCiAJfSwJLyoJb2Jzb2xldGUJKi8KIAogCXsKQEAgLTYzMyw3ICs4MDEsOCBAQAogCQkuZHN0X3R5cGUgPSBEU1RfVFlQRV9JU19TQVQsCiAJCS50eXBlX2ZsYWdzID0gRFNUX1RZUEVfSEFTX1NZTURJViB8IERTVF9UWVBFX0hBU19UUzIwNCB8IERTVF9UWVBFX0hBU19GV18yLAogCQkuZHN0X2ZlYXR1cmUgPSBEU1RfVFlQRV9IQVNfRElTRVFDMyB8IERTVF9UWVBFX0hBU19ESVNFUUM0IHwgRFNUX1RZUEVfSEFTX0RJU0VRQzUKLQkJCQkJCQkgfCBEU1RfVFlQRV9IQVNfTUFDIHwgRFNUX1RZUEVfSEFTX01PVE8KKwkJCQkJCQkgfCBEU1RfVFlQRV9IQVNfTUFDIHwgRFNUX1RZUEVfSEFTX01PVE8sCisJCS50dW5lcl90eXBlID0gVFVORVJfVFlQRV9NVUxUSQogCSB9LAogCiAJewpAQCAtNjQxLDU3ICs4MTAsNjMgQEAKIAkJLm9mZnNldCA9ICAwLAogCQkuZHN0X3R5cGUgPSBEU1RfVFlQRV9JU19TQVQsCiAJCS50eXBlX2ZsYWdzID0gRFNUX1RZUEVfSEFTX1NZTURJViB8IERTVF9UWVBFX0hBU19GV18xLAotCQkuZHN0X2ZlYXR1cmUgPSAwCisJCS5kc3RfZmVhdHVyZSA9IDAsCisJCS50dW5lcl90eXBlID0gMAogCX0sCS8qCW9ic29sZXRlCSovCiAKIAl7CiAJCS5kZXZpY2VfaWQgPSAiRFNULUNJIiwKIAkJLm9mZnNldCA9IDEsCiAJCS5kc3RfdHlwZSA9IERTVF9UWVBFX0lTX1NBVCwKLQkJLnR5cGVfZmxhZ3MgPSBEU1RfVFlQRV9IQVNfVFMyMDQgfCBEU1RfVFlQRV9IQVNfTkVXVFVORSB8IERTVF9UWVBFX0hBU19GV18xLAotCQkuZHN0X2ZlYXR1cmUgPSBEU1RfVFlQRV9IQVNfQ0EKKwkJLnR5cGVfZmxhZ3MgPSBEU1RfVFlQRV9IQVNfVFMyMDQgfCBEU1RfVFlQRV9IQVNfRldfMSwKKwkJLmRzdF9mZWF0dXJlID0gRFNUX1RZUEVfSEFTX0NBLAorCQkudHVuZXJfdHlwZSA9IDAKIAl9LAkvKglBbiBPRU0gYm9hcmQJKi8KIAogCXsKIAkJLmRldmljZV9pZCA9ICJEU1RNQ0kiLAogCQkub2Zmc2V0ID0gMSwKIAkJLmRzdF90eXBlID0gRFNUX1RZUEVfSVNfU0FULAotCQkudHlwZV9mbGFncyA9IERTVF9UWVBFX0hBU19ORVdUVU5FIHwgRFNUX1RZUEVfSEFTX0ZXXzIgfCBEU1RfVFlQRV9IQVNfRldfQlVJTEQgfCBEU1RfVFlQRV9IQVNfSU5DX0NPVU5ULAorCQkudHlwZV9mbGFncyA9IERTVF9UWVBFX0hBU19UUzE4OCB8IERTVF9UWVBFX0hBU19GV18yIHwgRFNUX1RZUEVfSEFTX0ZXX0JVSUxEIHwgRFNUX1RZUEVfSEFTX0lOQ19DT1VOVCB8IERTVF9UWVBFX0hBU19WTEYsCiAJCS5kc3RfZmVhdHVyZSA9IERTVF9UWVBFX0hBU19DQSB8IERTVF9UWVBFX0hBU19ESVNFUUMzIHwgRFNUX1RZUEVfSEFTX0RJU0VRQzQKLQkJCQkJCQl8IERTVF9UWVBFX0hBU19NT1RPIHwgRFNUX1RZUEVfSEFTX01BQworCQkJCQkJCXwgRFNUX1RZUEVfSEFTX01PVE8gfCBEU1RfVFlQRV9IQVNfTUFDLAorCQkudHVuZXJfdHlwZSA9IFRVTkVSX1RZUEVfTVVMVEkKIAl9LAogCiAJewogCQkuZGV2aWNlX2lkID0gIkRTVEZDSSIsCiAJCS5vZmZzZXQgPSAxLAogCQkuZHN0X3R5cGUgPSBEU1RfVFlQRV9JU19TQVQsCi0JCS50eXBlX2ZsYWdzID0gRFNUX1RZUEVfSEFTX05FV1RVTkUgfCBEU1RfVFlQRV9IQVNfRldfMSwKLQkJLmRzdF9mZWF0dXJlID0gMAorCQkudHlwZV9mbGFncyA9IERTVF9UWVBFX0hBU19UUzE4OCB8IERTVF9UWVBFX0hBU19GV18xLAorCQkuZHN0X2ZlYXR1cmUgPSAwLAorCQkudHVuZXJfdHlwZSA9IDAKIAl9LAkvKiB1bmtub3duIHRvIHZlbmRvcgkqLwogCiAJewogCQkuZGV2aWNlX2lkID0gIkRDVC1DSSIsCiAJCS5vZmZzZXQgPSAxLAogCQkuZHN0X3R5cGUgPSBEU1RfVFlQRV9JU19DQUJMRSwKLQkJLnR5cGVfZmxhZ3MgPSBEU1RfVFlQRV9IQVNfVFMyMDQgfCBEU1RfVFlQRV9IQVNfTkVXVFVORSB8IERTVF9UWVBFX0hBU19GV18xCi0JCQkJCQkJfCBEU1RfVFlQRV9IQVNfRldfMiwKLQkJLmRzdF9mZWF0dXJlID0gRFNUX1RZUEVfSEFTX0NBCisJCS50eXBlX2ZsYWdzID0gRFNUX1RZUEVfSEFTX01VTFRJX0ZFIHwgRFNUX1RZUEVfSEFTX0ZXXzEJfCBEU1RfVFlQRV9IQVNfRldfMiB8IERTVF9UWVBFX0hBU19WTEYsCisJCS5kc3RfZmVhdHVyZSA9IERTVF9UWVBFX0hBU19DQSwKKwkJLnR1bmVyX3R5cGUgPSAwCiAJfSwKIAogCXsKIAkJLmRldmljZV9pZCA9ICJEQ1RORVciLAogCQkub2Zmc2V0ID0gMSwKIAkJLmRzdF90eXBlID0gRFNUX1RZUEVfSVNfQ0FCTEUsCi0JCS50eXBlX2ZsYWdzID0gRFNUX1RZUEVfSEFTX05FV1RVTkUgfCBEU1RfVFlQRV9IQVNfRldfMyB8IERTVF9UWVBFX0hBU19GV19CVUlMRCwKLQkJLmRzdF9mZWF0dXJlID0gMAorCQkudHlwZV9mbGFncyA9IERTVF9UWVBFX0hBU19UUzE4OCB8IERTVF9UWVBFX0hBU19GV18zIHwgRFNUX1RZUEVfSEFTX0ZXX0JVSUxEIHwgRFNUX1RZUEVfSEFTX01VTFRJX0ZFLAorCQkuZHN0X2ZlYXR1cmUgPSAwLAorCQkudHVuZXJfdHlwZSA9IDAKIAl9LAogCiAJewogCQkuZGV2aWNlX2lkID0gIkRUVC1DSSIsCiAJCS5vZmZzZXQgPSAxLAogCQkuZHN0X3R5cGUgPSBEU1RfVFlQRV9JU19URVJSLAotCQkudHlwZV9mbGFncyA9IERTVF9UWVBFX0hBU19UUzIwNCB8IERTVF9UWVBFX0hBU19ORVdUVU5FIHwgRFNUX1RZUEVfSEFTX0ZXXzIgfCBEU1RfVFlQRV9IQVNfTVVMVElfRkUsCi0JCS5kc3RfZmVhdHVyZSA9IERTVF9UWVBFX0hBU19DQQorCQkudHlwZV9mbGFncyA9IERTVF9UWVBFX0hBU19GV18yIHwgRFNUX1RZUEVfSEFTX01VTFRJX0ZFIHwgRFNUX1RZUEVfSEFTX1ZMRiwKKwkJLmRzdF9mZWF0dXJlID0gRFNUX1RZUEVfSEFTX0NBLAorCQkudHVuZXJfdHlwZSA9IDAKIAl9LAogCiAJewpAQCAtNjk5LDcgKzg3NCw4IEBACiAJCS5vZmZzZXQgPSAxLAogCQkuZHN0X3R5cGUgPSBEU1RfVFlQRV9JU19URVJSLAogCQkudHlwZV9mbGFncyA9IERTVF9UWVBFX0hBU19GV18yLAotCQkuZHN0X2ZlYXR1cmUgPSAwCisJCS5kc3RfZmVhdHVyZSA9IDAsCisJCS50dW5lcl90eXBlID0gMAogCX0sCiAKIAl7CkBAIC03MDcsNyArODgzLDggQEAKIAkJLm9mZnNldCA9IDEsCiAJCS5kc3RfdHlwZSA9IERTVF9UWVBFX0lTX1RFUlIsCiAJCS50eXBlX2ZsYWdzID0gRFNUX1RZUEVfSEFTX0ZXXzIsCi0JCS5kc3RfZmVhdHVyZSA9IERTVF9UWVBFX0hBU19BTkFMT0cKKwkJLmRzdF9mZWF0dXJlID0gRFNUX1RZUEVfSEFTX0FOQUxPRywKKwkJLnR1bmVyX3R5cGUgPSAwCiAJfSwKIAogCXsKQEAgLTcxNSwxNSArODkyLDE3IEBACiAJCS5vZmZzZXQgPSAxLAogCQkuZHN0X3R5cGUgPSBEU1RfVFlQRV9JU19BVFNDLAogCQkudHlwZV9mbGFncyA9IERTVF9UWVBFX0hBU19GV18yLAotCQkuZHN0X2ZlYXR1cmUgPSAwCisJCS5kc3RfZmVhdHVyZSA9IDAsCisJCS50dW5lcl90eXBlID0gMAogCX0sCiAKIAl7CiAJCS5kZXZpY2VfaWQgPSAiQVRTQ0FEIiwKIAkJLm9mZnNldCA9IDEsCiAJCS5kc3RfdHlwZSA9IERTVF9UWVBFX0lTX0FUU0MsCi0JCS50eXBlX2ZsYWdzID0gRFNUX1RZUEVfSEFTX0ZXXzIsCi0JCS5kc3RfZmVhdHVyZSA9IDAKKwkJLnR5cGVfZmxhZ3MgPSBEU1RfVFlQRV9IQVNfTVVMVElfRkUgfCBEU1RfVFlQRV9IQVNfRldfMiB8IERTVF9UWVBFX0hBU19GV19CVUlMRCwKKwkJLmRzdF9mZWF0dXJlID0gRFNUX1RZUEVfSEFTX01BQyB8IERTVF9UWVBFX0hBU19BTkFMT0csCisJCS50dW5lcl90eXBlID0gMAogCX0sCiAKIAl7IH0KQEAgLTc2OCw2ICs5NDcsOSBAQAogCiBzdGF0aWMgaW50IGRzdF9jYXJkX3R5cGUoc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUpCiB7CisJaW50IGo7CisJc3RydWN0IHR1bmVyX3R5cGVzICpwX3R1bmVyX2xpc3QgPSBOVUxMOworCiAJdTggZ2V0X3R5cGVbXSA9IHsgMHgwMCwgMHgxMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9OwogCWdldF90eXBlWzddID0gZHN0X2NoZWNrX3N1bShnZXRfdHlwZSwgNyk7CiAJaWYgKGRzdF9jb21tYW5kKHN0YXRlLCBnZXRfdHlwZSwgOCkgPCAwKSB7CkBAIC03NzUsOSArOTU3LDE3IEBACiAJCXJldHVybiAtMTsKIAl9CiAJbWVtc2V0KCZzdGF0ZS0+Y2FyZF9pbmZvLCAnXDAnLCA4KTsKLQltZW1jcHkoJnN0YXRlLT5jYXJkX2luZm8sICZzdGF0ZS0+cnhidWZmZXIsIDgpOworCW1lbWNweSgmc3RhdGUtPmNhcmRfaW5mbywgJnN0YXRlLT5yeGJ1ZmZlciwgNyk7CiAJZHByaW50ayh2ZXJib3NlLCBEU1RfRVJST1IsIDEsICJEZXZpY2UgTW9kZWw9WyVzXSIsICZzdGF0ZS0+Y2FyZF9pbmZvWzBdKTsKIAorCWZvciAoaiA9IDAsIHBfdHVuZXJfbGlzdCA9IHR1bmVyX2xpc3Q7IGogPCBBUlJBWV9TSVpFKHR1bmVyX2xpc3QpOyBqKyssIHBfdHVuZXJfbGlzdCsrKSB7CisJCWlmICghc3RyY21wKCZzdGF0ZS0+Y2FyZF9pbmZvWzBdLCBwX3R1bmVyX2xpc3QtPmJvYXJkX25hbWUpKSB7CisJCQlzdGF0ZS0+dHVuZXJfdHlwZSA9IHBfdHVuZXJfbGlzdC0+dHVuZXJfdHlwZTsKKwkJCWRwcmludGsodmVyYm9zZSwgRFNUX0VSUk9SLCAxLCAiRFNUIGhhcyBbJXNdIHR1bmVyLCB0dW5lciB0eXBlPVslZF0iLAorCQkJCXBfdHVuZXJfbGlzdC0+dHVuZXJfbmFtZSwgcF90dW5lcl9saXN0LT50dW5lcl90eXBlKTsKKwkJfQorCX0KKwogCXJldHVybiAwOwogfQogCkBAIC03OTAsMTIgKzk4MCw2NCBAQAogCQlyZXR1cm4gLTE7CiAJfQogCW1lbXNldCgmc3RhdGUtPnZlbmRvciwgJ1wwJywgOCk7Ci0JbWVtY3B5KCZzdGF0ZS0+dmVuZG9yLCAmc3RhdGUtPnJ4YnVmZmVyLCA4KTsKKwltZW1jcHkoJnN0YXRlLT52ZW5kb3IsICZzdGF0ZS0+cnhidWZmZXIsIDcpOwogCWRwcmludGsodmVyYm9zZSwgRFNUX0VSUk9SLCAxLCAiVmVuZG9yPVslc10iLCAmc3RhdGUtPnZlbmRvclswXSk7CiAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgZGVidWdfZHN0X2J1ZmZlcihzdHJ1Y3QgZHN0X3N0YXRlICpzdGF0ZSkKK3sKKwlpbnQgaTsKKworCWlmICh2ZXJib3NlID4gMikgeworCQlwcmludGsoIiVzOiBbIiwgX19mdW5jX18pOworCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCQkJcHJpbnRrKCIgJTAyeCIsIHN0YXRlLT5yeGJ1ZmZlcltpXSk7CisJCXByaW50aygiXVxuIik7CisJfQorfQorCitzdGF0aWMgaW50IGRzdF9jaGVja19zdHYwMjk5KHN0cnVjdCBkc3Rfc3RhdGUgKnN0YXRlKQoreworCXU4IGNoZWNrX3N0djAyOTlbXSA9IHsgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9OworCisJY2hlY2tfc3R2MDI5OVs3XSA9IGRzdF9jaGVja19zdW0oY2hlY2tfc3R2MDI5OSwgNyk7CisJaWYgKGRzdF9jb21tYW5kKHN0YXRlLCBjaGVja19zdHYwMjk5LCA4KSA8IDApIHsKKwkJZHByaW50ayh2ZXJib3NlLCBEU1RfRVJST1IsIDEsICJDbWQ9WzB4MDRdIGZhaWxlZCIpOworCQlyZXR1cm4gLTE7CisJfQorCWRlYnVnX2RzdF9idWZmZXIoc3RhdGUpOworCisJaWYgKG1lbWNtcCgmY2hlY2tfc3R2MDI5OSwgJnN0YXRlLT5yeGJ1ZmZlciwgOCkpIHsKKwkJZHByaW50ayh2ZXJib3NlLCBEU1RfRVJST1IsIDEsICJGb3VuZCBhIFNUVjAyOTkgTklNIik7CisJCXN0YXRlLT50dW5lcl90eXBlID0gVFVORVJfVFlQRV9TVFYwMjk5OworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgZHN0X2NoZWNrX21iODZhMTUoc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUpCit7CisJdTggY2hlY2tfbWI4NmExNVtdID0geyAweDAwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwIH07CisKKwljaGVja19tYjg2YTE1WzddID0gZHN0X2NoZWNrX3N1bShjaGVja19tYjg2YTE1LCA3KTsKKwlpZiAoZHN0X2NvbW1hbmQoc3RhdGUsIGNoZWNrX21iODZhMTUsIDgpIDwgMCkgeworCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9FUlJPUiwgMSwgIkNtZD1bMHgxMF0sIGZhaWxlZCIpOworCQlyZXR1cm4gLTE7CisJfQorCWRlYnVnX2RzdF9idWZmZXIoc3RhdGUpOworCisJaWYgKG1lbWNtcCgmY2hlY2tfbWI4NmExNSwgJnN0YXRlLT5yeGJ1ZmZlciwgOCkgPCAwKSB7CisJCWRwcmludGsodmVyYm9zZSwgRFNUX0VSUk9SLCAxLCAiRm91bmQgYSBNQjg2QTE1IE5JTSIpOworCQlzdGF0ZS0+dHVuZXJfdHlwZSA9IFRVTkVSX1RZUEVfTUI4NkExNTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIC0xOworfQorCiBzdGF0aWMgaW50IGRzdF9nZXRfdHVuZXJfaW5mbyhzdHJ1Y3QgZHN0X3N0YXRlICpzdGF0ZSkKIHsKIAl1OCBnZXRfdHVuZXJfMVtdID0geyAweDAwLCAweDEzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwIH07CkBAIC04MDMsNjAgKzEwNDUsNTkgQEAKIAogCWdldF90dW5lcl8xWzddID0gZHN0X2NoZWNrX3N1bShnZXRfdHVuZXJfMSwgNyk7CiAJZ2V0X3R1bmVyXzJbN10gPSBkc3RfY2hlY2tfc3VtKGdldF90dW5lcl8yLCA3KTsKKwlkcHJpbnRrKHZlcmJvc2UsIERTVF9FUlJPUiwgMSwgIkRTVCBUWXBlID0gTVVMVEkgRkUiKTsKIAlpZiAoc3RhdGUtPnR5cGVfZmxhZ3MgJiBEU1RfVFlQRV9IQVNfTVVMVElfRkUpIHsKLQkJaWYgKGRzdF9jb21tYW5kKHN0YXRlLCBnZXRfdHVuZXJfMiwgOCkgPCAwKSB7Ci0JCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9JTkZPLCAxLCAiVW5zdXBwb3J0ZWQgQ29tbWFuZCIpOwotCQkJcmV0dXJuIC0xOworCQlpZiAoZHN0X2NvbW1hbmQoc3RhdGUsIGdldF90dW5lcl8xLCA4KSA8IDApIHsKKwkJCWRwcmludGsodmVyYm9zZSwgRFNUX0lORk8sIDEsICJDbWQ9WzB4MTNdLCBVbnN1cHBvcnRlZCIpOworCQkJZ290byBmb3JjZTsKIAkJfQogCX0gZWxzZSB7Ci0JCWlmIChkc3RfY29tbWFuZChzdGF0ZSwgZ2V0X3R1bmVyXzEsIDgpIDwgMCkgewotCQkJZHByaW50ayh2ZXJib3NlLCBEU1RfSU5GTywgMSwgIlVuc3VwcG9ydGVkIENvbW1hbmQiKTsKLQkJCXJldHVybiAtMTsKKwkJaWYgKGRzdF9jb21tYW5kKHN0YXRlLCBnZXRfdHVuZXJfMiwgOCkgPCAwKSB7CisJCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9JTkZPLCAxLCAiQ21kPVsweGJdLCBVbnN1cHBvcnRlZCIpOworCQkJZ290byBmb3JjZTsKIAkJfQogCX0KIAltZW1zZXQoJnN0YXRlLT5ib2FyZF9pbmZvLCAnXDAnLCA4KTsKIAltZW1jcHkoJnN0YXRlLT5ib2FyZF9pbmZvLCAmc3RhdGUtPnJ4YnVmZmVyLCA4KTsKIAlpZiAoc3RhdGUtPnR5cGVfZmxhZ3MgJiBEU1RfVFlQRV9IQVNfTVVMVElfRkUpIHsKLQkJaWYgKHN0YXRlLT5ib2FyZF9pbmZvWzFdID09IDB4MGIpIHsKLQkJCWlmIChzdGF0ZS0+dHlwZV9mbGFncyAmIERTVF9UWVBFX0hBU19UUzIwNCkKLQkJCQlzdGF0ZS0+dHlwZV9mbGFncyAmPSB+RFNUX1RZUEVfSEFTX1RTMjA0OwotCQkJc3RhdGUtPnR5cGVfZmxhZ3MgfD0gRFNUX1RZUEVfSEFTX05FV1RVTkU7Ci0JCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9JTkZPLCAxLCAiRFNUIHR5cGUgaGFzIFRTPTE4OCIpOwotCQl9IGVsc2UgewotCQkJaWYgKHN0YXRlLT50eXBlX2ZsYWdzICYgRFNUX1RZUEVfSEFTX05FV1RVTkUpCi0JCQkJc3RhdGUtPnR5cGVfZmxhZ3MgJj0gfkRTVF9UWVBFX0hBU19ORVdUVU5FOwotCQkJc3RhdGUtPnR5cGVfZmxhZ3MgfD0gRFNUX1RZUEVfSEFTX1RTMjA0OwotCQkJZHByaW50ayh2ZXJib3NlLCBEU1RfSU5GTywgMSwgIkRTVCB0eXBlIGhhcyBUUz0yMDQiKTsKLQkJfQotCX0gZWxzZSB7Ci0JCWlmIChzdGF0ZS0+Ym9hcmRfaW5mb1swXSA9PSAweGJjKSB7Ci0JCQlpZiAoc3RhdGUtPnR5cGVfZmxhZ3MgJiBEU1RfVFlQRV9IQVNfVFMyMDQpCi0JCQkJc3RhdGUtPnR5cGVfZmxhZ3MgJj0gfkRTVF9UWVBFX0hBU19UUzIwNDsKLQkJCXN0YXRlLT50eXBlX2ZsYWdzIHw9IERTVF9UWVBFX0hBU19ORVdUVU5FOwotCQkJZHByaW50ayh2ZXJib3NlLCBEU1RfSU5GTywgMSwgIkRTVCB0eXBlIGhhcyBUUz0xODgsIERhdWdodGVyYm9hcmQ9WyVkXSIsIHN0YXRlLT5ib2FyZF9pbmZvWzFdKTsKKwkJZHByaW50ayh2ZXJib3NlLCBEU1RfRVJST1IsIDEsICJEU1QgdHlwZSBoYXMgVFM9MTg4Iik7CisJfQorCWlmIChzdGF0ZS0+Ym9hcmRfaW5mb1swXSA9PSAweGJjKSB7CisJCWlmIChzdGF0ZS0+dHlwZV9mbGFncyAhPSBEU1RfVFlQRV9JU19BVFNDKQorCQkJc3RhdGUtPnR5cGVfZmxhZ3MgfD0gRFNUX1RZUEVfSEFTX1RTMTg4OworCQllbHNlCisJCQlzdGF0ZS0+dHlwZV9mbGFncyB8PSBEU1RfVFlQRV9IQVNfTkVXVFVORV8yOwogCi0JCX0gZWxzZSBpZiAoc3RhdGUtPmJvYXJkX2luZm9bMF0gPT0gMHhjYykgewotCQkJaWYgKHN0YXRlLT50eXBlX2ZsYWdzICYgRFNUX1RZUEVfSEFTX05FV1RVTkUpCi0JCQkJc3RhdGUtPnR5cGVfZmxhZ3MgJj0gfkRTVF9UWVBFX0hBU19ORVdUVU5FOwotCQkJc3RhdGUtPnR5cGVfZmxhZ3MgfD0gRFNUX1RZUEVfSEFTX1RTMjA0OwotCQkJZHByaW50ayh2ZXJib3NlLCBEU1RfSU5GTywgMSwgIkRTVCB0eXBlIGhhcyBUUz0yMDQgRGF1Z2h0ZXJib2FyZD1bJWRdIiwgc3RhdGUtPmJvYXJkX2luZm9bMV0pOworCQlpZiAoc3RhdGUtPmJvYXJkX2luZm9bMV0gPT0gMHgwMSkgeworCQkJc3RhdGUtPmRzdF9od19jYXAgfD0gRFNUX1RZUEVfSEFTX0RCT0FSRDsKKwkJCWRwcmludGsodmVyYm9zZSwgRFNUX0VSUk9SLCAxLCAiRFNUIGhhcyBEYXVnaHRlcmJvYXJkIik7CiAJCX0KIAl9CiAKIAlyZXR1cm4gMDsKK2ZvcmNlOgorCWlmICghc3RybmNtcChzdGF0ZS0+ZndfbmFtZSwgIkRDVC1DSSIsIDYpKSB7CisJCXN0YXRlLT50eXBlX2ZsYWdzIHw9IERTVF9UWVBFX0hBU19UUzIwNDsKKwkJZHByaW50ayh2ZXJib3NlLCBEU1RfRVJST1IsIDEsICJGb3JjaW5nIFslc10gdG8gVFMxODgiLCBzdGF0ZS0+ZndfbmFtZSk7CisJfQorCisJcmV0dXJuIC0xOwogfQogCiBzdGF0aWMgaW50IGRzdF9nZXRfZGV2aWNlX2lkKHN0cnVjdCBkc3Rfc3RhdGUgKnN0YXRlKQogewogCXU4IHJlcGx5OwogCi0JaW50IGk7Ci0Jc3RydWN0IGRzdF90eXBlcyAqcF9kc3RfdHlwZTsKKwlpbnQgaSwgajsKKwlzdHJ1Y3QgZHN0X3R5cGVzICpwX2RzdF90eXBlID0gTlVMTDsKKwlzdHJ1Y3QgdHVuZXJfdHlwZXMgKnBfdHVuZXJfbGlzdCA9IE5VTEw7CisKIAl1OCB1c2VfZHN0X3R5cGUgPSAwOwogCXUzMiB1c2VfdHlwZV9mbGFncyA9IDA7CiAKIAlzdGF0aWMgdTggZGV2aWNlX3R5cGVbOF0gPSB7MHgwMCwgMHgwNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZn07CiAKKwlzdGF0ZS0+dHVuZXJfdHlwZSA9IDA7CiAJZGV2aWNlX3R5cGVbN10gPSBkc3RfY2hlY2tfc3VtKGRldmljZV90eXBlLCA3KTsKIAogCWlmICh3cml0ZV9kc3Qoc3RhdGUsIGRldmljZV90eXBlLCBGSVhFRF9DT01NKSkKQEAgLTg4OCw4ICsxMTI5LDM0IEBACiAKIAkJCS8qCUNhcmQgY2FwYWJpbGl0aWVzCSovCiAJCQlzdGF0ZS0+ZHN0X2h3X2NhcCA9IHBfZHN0X3R5cGUtPmRzdF9mZWF0dXJlOwotCQkJZHByaW50ayh2ZXJib3NlLCBEU1RfRVJST1IsIDEsICJSZWNvZ25pc2UgWyVzXVxuIiwgcF9kc3RfdHlwZS0+ZGV2aWNlX2lkKTsKLQorCQkJZHByaW50ayh2ZXJib3NlLCBEU1RfRVJST1IsIDEsICJSZWNvZ25pc2UgWyVzXSIsIHBfZHN0X3R5cGUtPmRldmljZV9pZCk7CisJCQlzdHJuY3B5KCZzdGF0ZS0+ZndfbmFtZVswXSwgcF9kc3RfdHlwZS0+ZGV2aWNlX2lkLCA2KTsKKwkJCS8qCU11bHRpcGxlIHR1bmVycwkJKi8KKwkJCWlmIChwX2RzdF90eXBlLT50dW5lcl90eXBlICYgVFVORVJfVFlQRV9NVUxUSSkgeworCQkJCXN3aXRjaCAodXNlX2RzdF90eXBlKSB7CisJCQkJY2FzZSBEU1RfVFlQRV9JU19TQVQ6CisJCQkJCS8qCVNUVjAyOTkgY2hlY2sJKi8KKwkJCQkJaWYgKGRzdF9jaGVja19zdHYwMjk5KHN0YXRlKSA8IDApIHsKKwkJCQkJCWRwcmludGsodmVyYm9zZSwgRFNUX0VSUk9SLCAxLCAiVW5zdXBwb3J0ZWQiKTsKKwkJCQkJCXN0YXRlLT50dW5lcl90eXBlID0gVFVORVJfVFlQRV9NQjg2QTE1OworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlpZiAoZHN0X2NoZWNrX21iODZhMTUoc3RhdGUpIDwgMCkKKwkJCQkJZHByaW50ayh2ZXJib3NlLCBEU1RfRVJST1IsIDEsICJVbnN1cHBvcnRlZCIpOworCQkJLyoJU2luZ2xlIHR1bmVyCQkqLworCQkJfSBlbHNlIHsKKwkJCQlzdGF0ZS0+dHVuZXJfdHlwZSA9IHBfZHN0X3R5cGUtPnR1bmVyX3R5cGU7CisJCQl9CisJCQlmb3IgKGogPSAwLCBwX3R1bmVyX2xpc3QgPSB0dW5lcl9saXN0OyBqIDwgQVJSQVlfU0laRSh0dW5lcl9saXN0KTsgaisrLCBwX3R1bmVyX2xpc3QrKykgeworCQkJCWlmICghKHN0cm5jbXAocF9kc3RfdHlwZS0+ZGV2aWNlX2lkLCBwX3R1bmVyX2xpc3QtPmZ3X25hbWUsIDcpKSAmJgorCQkJCQlwX3R1bmVyX2xpc3QtPnR1bmVyX3R5cGUgPT0gc3RhdGUtPnR1bmVyX3R5cGUpIHsKKwkJCQkJZHByaW50ayh2ZXJib3NlLCBEU1RfRVJST1IsIDEsICJbJXNdIGhhcyBhIFslc10iLAorCQkJCQkJcF9kc3RfdHlwZS0+ZGV2aWNlX2lkLCBwX3R1bmVyX2xpc3QtPnR1bmVyX25hbWUpOworCQkJCX0KKwkJCX0KIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtOTAwLDEwICsxMTY3LDEwIEBACiAJCXVzZV9kc3RfdHlwZSA9IERTVF9UWVBFX0lTX1NBVDsKIAkJdXNlX3R5cGVfZmxhZ3MgPSBEU1RfVFlQRV9IQVNfU1lNRElWOwogCX0KLQlkc3RfdHlwZV9wcmludCh1c2VfZHN0X3R5cGUpOworCWRzdF90eXBlX3ByaW50KHN0YXRlLCB1c2VfZHN0X3R5cGUpOwogCXN0YXRlLT50eXBlX2ZsYWdzID0gdXNlX3R5cGVfZmxhZ3M7CiAJc3RhdGUtPmRzdF90eXBlID0gdXNlX2RzdF90eXBlOwotCWRzdF90eXBlX2ZsYWdzX3ByaW50KHN0YXRlLT50eXBlX2ZsYWdzKTsKKwlkc3RfdHlwZV9mbGFnc19wcmludChzdGF0ZSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTkxMSwxNSArMTE3OCwxNSBAQAogc3RhdGljIGludCBkc3RfcHJvYmUoc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUpCiB7CiAJbXV0ZXhfaW5pdCgmc3RhdGUtPmRzdF9tdXRleCk7Ci0JaWYgKChyZGNfODgyMF9yZXNldChzdGF0ZSkpIDwgMCkgewotCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9FUlJPUiwgMSwgIlJEQyA4ODIwIFJFU0VUIEZhaWxlZC4iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoZHN0X2FkZG9ucyAmIERTVF9UWVBFX0hBU19DQSkKKwlpZiAoZHN0X2FkZG9ucyAmIERTVF9UWVBFX0hBU19DQSkgeworCQlpZiAoKHJkY184ODIwX3Jlc2V0KHN0YXRlKSkgPCAwKSB7CisJCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9FUlJPUiwgMSwgIlJEQyA4ODIwIFJFU0VUIEZhaWxlZC4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQogCQltc2xlZXAoNDAwMCk7Ci0JZWxzZQorCX0gZWxzZSB7CiAJCW1zbGVlcCgxMDApOwotCisJfQogCWlmICgoZHN0X2NvbW1faW5pdChzdGF0ZSkpIDwgMCkgewogCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9FUlJPUiwgMSwgIkRTVCBJbml0aWFsaXphdGlvbiBGYWlsZWQuIik7CiAJCXJldHVybiAtMTsKQEAgLTkzMSw3ICsxMTk4LDYgQEAKIAl9CiAJaWYgKGRzdF9nZXRfbWFjKHN0YXRlKSA8IDApIHsKIAkJZHByaW50ayh2ZXJib3NlLCBEU1RfSU5GTywgMSwgIk1BQzogVW5zdXBwb3J0ZWQgY29tbWFuZCIpOwotCQlyZXR1cm4gMDsKIAl9CiAJaWYgKChzdGF0ZS0+dHlwZV9mbGFncyAmIERTVF9UWVBFX0hBU19NVUxUSV9GRSkgfHwgKHN0YXRlLT50eXBlX2ZsYWdzICYgRFNUX1RZUEVfSEFTX0ZXX0JVSUxEKSkgewogCQlpZiAoZHN0X2dldF90dW5lcl9pbmZvKHN0YXRlKSA8IDApCkBAIC0xMDQ4LDYgKzEzMTQsMTAgQEAKIAkJCXN0YXRlLT5kZWNvZGVfbG9jayA9IChzdGF0ZS0+cnhidWZmZXJbMV0pID8gMSA6IDA7CiAJCQlzdGF0ZS0+ZGVjb2RlX3N0cmVuZ3RoID0gc3RhdGUtPnJ4YnVmZmVyWzRdIDw8IDg7CiAJCQlzdGF0ZS0+ZGVjb2RlX3NuciA9IHN0YXRlLT5yeGJ1ZmZlclszXSA8PCA4OworCQl9IGVsc2UgaWYgKHN0YXRlLT5kc3RfdHlwZSA9PSBEU1RfVFlQRV9JU19BVFNDKSB7CisJCQlzdGF0ZS0+ZGVjb2RlX2xvY2sgPSAoc3RhdGUtPnJ4YnVmZmVyWzZdID09IDB4MDApID8gMSA6IDA7CisJCQlzdGF0ZS0+ZGVjb2RlX3N0cmVuZ3RoID0gc3RhdGUtPnJ4YnVmZmVyWzRdIDw8IDg7CisJCQlzdGF0ZS0+ZGVjb2RlX3NuciA9IHN0YXRlLT5yeGJ1ZmZlclsyXSA8PCA4IHwgc3RhdGUtPnJ4YnVmZmVyWzNdOwogCQl9CiAJCXN0YXRlLT5jdXJfamlmZiA9IGppZmZpZXM7CiAJfQpAQCAtMTA3OCw4ICsxMzQ4LDkgQEAKIAlzdGF0ZS0+ZGlzZXFfZmxhZ3MgJj0gfihIQVNfTE9DSyk7CiAJaWYgKCFkc3Rfd2FpdF9kc3RfcmVhZHkoc3RhdGUsIE5PX0RFTEFZKSkKIAkJcmV0dXJuIC1FSU87Ci0JaWYgKHN0YXRlLT50eXBlX2ZsYWdzICYgRFNUX1RZUEVfSEFTX05FV1RVTkUpCi0JCS8qIGhvdyB0byBnZXQgdmFyaWFibGUgbGVuZ3RoIHJlcGx5ID8/Pz8gKi8KKwlpZiAoKHN0YXRlLT50eXBlX2ZsYWdzICYgRFNUX1RZUEVfSEFTX1ZMRikgJiYKKwkJIShzdGF0ZS0+ZHN0X3R5cGUgPT0gRFNUX1RZUEVfSVNfQVRTQykpCisKIAkJcmV0dmFsID0gcmVhZF9kc3Qoc3RhdGUsIHN0YXRlLT5yeF90dW5hLCAxMCk7CiAJZWxzZQogCQlyZXR2YWwgPSByZWFkX2RzdChzdGF0ZSwgJnN0YXRlLT5yeF90dW5hWzJdLCBGSVhFRF9DT01NKTsKQEAgLTEwODcsNyArMTM1OCwxMCBAQAogCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9ERUJVRywgMSwgInJlYWQgbm90IHN1Y2Nlc3NmdWwiKTsKIAkJcmV0dXJuIHJldHZhbDsKIAl9Ci0JaWYgKHN0YXRlLT50eXBlX2ZsYWdzICYgRFNUX1RZUEVfSEFTX05FV1RVTkUpIHsKKwlpZiAoKHN0YXRlLT50eXBlX2ZsYWdzICYgRFNUX1RZUEVfSEFTX1ZMRikgJiYKKwkJIShzdGF0ZS0+ZHN0X3R5cGUgPT0gRFNUX1RZUEVfSVNfQ0FCTEUpICYmCisJCSEoc3RhdGUtPmRzdF90eXBlID09IERTVF9UWVBFX0lTX0FUU0MpKSB7CisKIAkJaWYgKHN0YXRlLT5yeF90dW5hWzldICE9IGRzdF9jaGVja19zdW0oJnN0YXRlLT5yeF90dW5hWzBdLCA5KSkgewogCQkJZHByaW50ayh2ZXJib3NlLCBEU1RfSU5GTywgMSwgImNoZWNrc3VtIGZhaWx1cmUgPyAiKTsKIAkJCXJldHVybiAtRUlPOwpAQCAtMTEzMyw3ICsxNDA3LDEwIEBACiAJCWRwcmludGsodmVyYm9zZSwgRFNUX0RFQlVHLCAxLCAiRFNUIENvbW11bmljYXRpb24gaW5pdGlhbGl6YXRpb24gZmFpbGVkLiIpOwogCQlnb3RvIGVycm9yOwogCX0KLQlpZiAoc3RhdGUtPnR5cGVfZmxhZ3MgJiBEU1RfVFlQRV9IQVNfTkVXVFVORSkgeworLy8JaWYgKHN0YXRlLT50eXBlX2ZsYWdzICYgRFNUX1RZUEVfSEFTX05FV1RVTkUpIHsKKwlpZiAoKHN0YXRlLT50eXBlX2ZsYWdzICYgRFNUX1RZUEVfSEFTX1ZMRikgJiYKKwkJKCEoc3RhdGUtPmRzdF90eXBlID09IERTVF9UWVBFX0lTX0FUU0MpKSkgeworCiAJCXN0YXRlLT50eF90dW5hWzldID0gZHN0X2NoZWNrX3N1bSgmc3RhdGUtPnR4X3R1bmFbMF0sIDkpOwogCQlyZXR2YWwgPSB3cml0ZV9kc3Qoc3RhdGUsICZzdGF0ZS0+dHhfdHVuYVswXSwgMTApOwogCX0gZWxzZSB7CkBAIC0xMTg5LDkgKzE0NjYsMTIgQEAKIAogCWlmIChzdGF0ZS0+ZHN0X3R5cGUgIT0gRFNUX1RZUEVfSVNfU0FUKQogCQlyZXR1cm4gMDsKLQlpZiAoY21kLT5tc2dfbGVuID09IDAgfHwgY21kLT5tc2dfbGVuID4gNCkKKwlpZiAoY21kLT5tc2dfbGVuID4gMCAmJiBjbWQtPm1zZ19sZW4gPCA1KQorCQltZW1jcHkoJnBha2V0WzNdLCBjbWQtPm1zZywgY21kLT5tc2dfbGVuKTsKKwllbHNlIGlmIChjbWQtPm1zZ19sZW4gPT0gNSAmJiBzdGF0ZS0+ZHN0X2h3X2NhcCAmIERTVF9UWVBFX0hBU19ESVNFUUM1KQorCQltZW1jcHkoJnBha2V0WzJdLCBjbWQtPm1zZywgY21kLT5tc2dfbGVuKTsKKwllbHNlCiAJCXJldHVybiAtRUlOVkFMOwotCW1lbWNweSgmcGFrZXRbM10sIGNtZC0+bXNnLCBjbWQtPm1zZ19sZW4pOwogCXBha2V0WzddID0gZHN0X2NoZWNrX3N1bSgmcGFrZXRbMF0sIDcpOwogCWRzdF9jb21tYW5kKHN0YXRlLCBwYWtldCwgOCk7CiAJcmV0dXJuIDA7CkBAIC0xMjg3LDggKzE1NjcsOSBAQAogCXN0YXRpYyB1OCBzYXRfdHVuYV8yMDRbXSA9IHsgMHgwMCwgMHgwMCwgMHgwMywgMHhiNiwgMHgwMSwgMHg1NSwgMHhiZCwgMHg1MCwgMHgwMCwgMHgwMCB9OwogCXN0YXRpYyB1OCB0ZXJfdHVuYV8xODhbXSA9IHsgMHgwOSwgMHgwMCwgMHgwMywgMHhiNiwgMHgwMSwgMHgwNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9OwogCXN0YXRpYyB1OCB0ZXJfdHVuYV8yMDRbXSA9IHsgMHgwMCwgMHgwMCwgMHgwMywgMHhiNiwgMHgwMSwgMHgwNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9OwotCXN0YXRpYyB1OCBjYWJfdHVuYV8yMDRbXSA9IHsgMHgwMCwgMHgwMCwgMHgwMywgMHhiNiwgMHgwMSwgMHgwNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9OwogCXN0YXRpYyB1OCBjYWJfdHVuYV8xODhbXSA9IHsgMHgwOSwgMHgwMCwgMHgwMywgMHhiNiwgMHgwMSwgMHgwNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9OworCXN0YXRpYyB1OCBjYWJfdHVuYV8yMDRbXSA9IHsgMHgwMCwgMHgwMCwgMHgwMywgMHhiNiwgMHgwMSwgMHgwNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9OworCXN0YXRpYyB1OCBhdHNjX3R1bmVyW10gPSB7IDB4MDAsIDB4MDAsIDB4MDMsIDB4YjYsIDB4MDEsIDB4MDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfTsKIAogCXN0YXRlLT5pbnZlcnNpb24gPSBJTlZFUlNJT05fT0ZGOwogCXN0YXRlLT52b2x0YWdlID0gU0VDX1ZPTFRBR0VfMTM7CkBAIC0xMjk4LDExICsxNTc5LDEzIEBACiAJc3RhdGUtPmJhbmR3aWR0aCA9IEJBTkRXSURUSF83X01IWjsKIAlzdGF0ZS0+Y3VyX2ppZmYgPSBqaWZmaWVzOwogCWlmIChzdGF0ZS0+ZHN0X3R5cGUgPT0gRFNUX1RZUEVfSVNfU0FUKQotCQltZW1jcHkoc3RhdGUtPnR4X3R1bmEsICgoc3RhdGUtPnR5cGVfZmxhZ3MgJiBEU1RfVFlQRV9IQVNfTkVXVFVORSkgPyBzYXRfdHVuYV8xODggOiBzYXRfdHVuYV8yMDQpLCBzaXplb2YgKHNhdF90dW5hXzIwNCkpOworCQltZW1jcHkoc3RhdGUtPnR4X3R1bmEsICgoc3RhdGUtPnR5cGVfZmxhZ3MgJiBEU1RfVFlQRV9IQVNfVkxGKSA/IHNhdF90dW5hXzE4OCA6IHNhdF90dW5hXzIwNCksIHNpemVvZiAoc2F0X3R1bmFfMjA0KSk7CiAJZWxzZSBpZiAoc3RhdGUtPmRzdF90eXBlID09IERTVF9UWVBFX0lTX1RFUlIpCi0JCW1lbWNweShzdGF0ZS0+dHhfdHVuYSwgKChzdGF0ZS0+dHlwZV9mbGFncyAmIERTVF9UWVBFX0hBU19ORVdUVU5FKSA/IHRlcl90dW5hXzE4OCA6IHRlcl90dW5hXzIwNCksIHNpemVvZiAodGVyX3R1bmFfMjA0KSk7CisJCW1lbWNweShzdGF0ZS0+dHhfdHVuYSwgKChzdGF0ZS0+dHlwZV9mbGFncyAmIERTVF9UWVBFX0hBU19WTEYpID8gdGVyX3R1bmFfMTg4IDogdGVyX3R1bmFfMjA0KSwgc2l6ZW9mICh0ZXJfdHVuYV8yMDQpKTsKIAllbHNlIGlmIChzdGF0ZS0+ZHN0X3R5cGUgPT0gRFNUX1RZUEVfSVNfQ0FCTEUpCi0JCW1lbWNweShzdGF0ZS0+dHhfdHVuYSwgKChzdGF0ZS0+dHlwZV9mbGFncyAmIERTVF9UWVBFX0hBU19ORVdUVU5FKSA/IGNhYl90dW5hXzE4OCA6IGNhYl90dW5hXzIwNCksIHNpemVvZiAoY2FiX3R1bmFfMjA0KSk7CisJCW1lbWNweShzdGF0ZS0+dHhfdHVuYSwgKChzdGF0ZS0+dHlwZV9mbGFncyAmIERTVF9UWVBFX0hBU19WTEYpID8gY2FiX3R1bmFfMTg4IDogY2FiX3R1bmFfMjA0KSwgc2l6ZW9mIChjYWJfdHVuYV8yMDQpKTsKKwllbHNlIGlmIChzdGF0ZS0+ZHN0X3R5cGUgPT0gRFNUX1RZUEVfSVNfQVRTQykKKwkJbWVtY3B5KHN0YXRlLT50eF90dW5hLCBhdHNjX3R1bmVyLCBzaXplb2YgKGF0c2NfdHVuZXIpKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTM0MSw3ICsxNjI0LDM2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZHN0X3NldF9mcm9udGVuZChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwKK3N0YXRpYyBpbnQgZHN0X3NldF9mcm9udGVuZChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwKQoreworCXN0cnVjdCBkc3Rfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisKKwlpZiAocCAhPSBOVUxMKSB7CisJCWRzdF9zZXRfZnJlcShzdGF0ZSwgcC0+ZnJlcXVlbmN5KTsKKwkJZHByaW50ayh2ZXJib3NlLCBEU1RfREVCVUcsIDEsICJTZXQgRnJlcXVlbmN5PVslZF0iLCBwLT5mcmVxdWVuY3kpOworCisJCWlmIChzdGF0ZS0+ZHN0X3R5cGUgPT0gRFNUX1RZUEVfSVNfU0FUKSB7CisJCQlpZiAoc3RhdGUtPnR5cGVfZmxhZ3MgJiBEU1RfVFlQRV9IQVNfT0JTX1JFR1MpCisJCQkJZHN0X3NldF9pbnZlcnNpb24oc3RhdGUsIHAtPmludmVyc2lvbik7CisJCQlkc3Rfc2V0X2ZlYyhzdGF0ZSwgcC0+dS5xcHNrLmZlY19pbm5lcik7CisJCQlkc3Rfc2V0X3N5bWJvbHJhdGUoc3RhdGUsIHAtPnUucXBzay5zeW1ib2xfcmF0ZSk7CisJCQlkc3Rfc2V0X3BvbGFyaXphdGlvbihzdGF0ZSk7CisJCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9ERUJVRywgMSwgIlNldCBTeW1ib2xyYXRlPVslZF0iLCBwLT51LnFwc2suc3ltYm9sX3JhdGUpOworCisJCX0gZWxzZSBpZiAoc3RhdGUtPmRzdF90eXBlID09IERTVF9UWVBFX0lTX1RFUlIpCisJCQlkc3Rfc2V0X2JhbmR3aWR0aChzdGF0ZSwgcC0+dS5vZmRtLmJhbmR3aWR0aCk7CisJCWVsc2UgaWYgKHN0YXRlLT5kc3RfdHlwZSA9PSBEU1RfVFlQRV9JU19DQUJMRSkgeworCQkJZHN0X3NldF9mZWMoc3RhdGUsIHAtPnUucWFtLmZlY19pbm5lcik7CisJCQlkc3Rfc2V0X3N5bWJvbHJhdGUoc3RhdGUsIHAtPnUucWFtLnN5bWJvbF9yYXRlKTsKKwkJCWRzdF9zZXRfbW9kdWxhdGlvbihzdGF0ZSwgcC0+dS5xYW0ubW9kdWxhdGlvbik7CisJCX0KKwkJZHN0X3dyaXRlX3R1bmEoZmUpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRzdF90dW5lX2Zyb250ZW5kKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLAogCQkJICAgIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyogcCwKIAkJCSAgICB1bnNpZ25lZCBpbnQgbW9kZV9mbGFncywKIAkJCSAgICBpbnQgKmRlbGF5LApAQCAtMTM3OCw2ICsxNjkwLDExIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgZHN0X2dldF90dW5pbmdfYWxnbyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3sKKwlyZXR1cm4gZHN0X2FsZ287Cit9CisKIHN0YXRpYyBpbnQgZHN0X2dldF9mcm9udGVuZChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwKQogewogCXN0cnVjdCBkc3Rfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CkBAIC0xNDA4LDYgKzE3MjUsNyBAQAogc3RhdGljIHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzIGRzdF9kdmJ0X29wczsKIHN0YXRpYyBzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyBkc3RfZHZic19vcHM7CiBzdGF0aWMgc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMgZHN0X2R2YmNfb3BzOworc3RhdGljIHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzIGRzdF9hdHNjX29wczsKIAogc3RydWN0IGRzdF9zdGF0ZSAqZHN0X2F0dGFjaChzdHJ1Y3QgZHN0X3N0YXRlICpzdGF0ZSwgc3RydWN0IGR2Yl9hZGFwdGVyICpkdmJfYWRhcHRlcikKIHsKQEAgLTE0MTcsMjQgKzE3MzUsMjUgQEAKIAkJcmV0dXJuIE5VTEw7CiAJfQogCS8qIGRldGVybWluZSBzZXR0aW5ncyBiYXNlZCBvbiB0eXBlICovCisJLyogY3JlYXRlIGR2Yl9mcm9udGVuZCAqLwogCXN3aXRjaCAoc3RhdGUtPmRzdF90eXBlKSB7CiAJY2FzZSBEU1RfVFlQRV9JU19URVJSOgotCQltZW1jcHkoJnN0YXRlLT5vcHMsICZkc3RfZHZidF9vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOworCQltZW1jcHkoJnN0YXRlLT5mcm9udGVuZC5vcHMsICZkc3RfZHZidF9vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOwogCQlicmVhazsKIAljYXNlIERTVF9UWVBFX0lTX0NBQkxFOgotCQltZW1jcHkoJnN0YXRlLT5vcHMsICZkc3RfZHZiY19vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOworCQltZW1jcHkoJnN0YXRlLT5mcm9udGVuZC5vcHMsICZkc3RfZHZiY19vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOwogCQlicmVhazsKIAljYXNlIERTVF9UWVBFX0lTX1NBVDoKLQkJbWVtY3B5KCZzdGF0ZS0+b3BzLCAmZHN0X2R2YnNfb3BzLCBzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMpKTsKKwkJbWVtY3B5KCZzdGF0ZS0+ZnJvbnRlbmQub3BzLCAmZHN0X2R2YnNfb3BzLCBzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMpKTsKKwkJYnJlYWs7CisJY2FzZSBEU1RfVFlQRV9JU19BVFNDOgorCQltZW1jcHkoJnN0YXRlLT5mcm9udGVuZC5vcHMsICZkc3RfYXRzY19vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9FUlJPUiwgMSwgInVua25vd24gRFNUIHR5cGUuIHBsZWFzZSByZXBvcnQgdG8gdGhlIExpbnV4VFYub3JnIERWQiBtYWlsaW5nbGlzdC4iKTsKIAkJa2ZyZWUoc3RhdGUpOwogCQlyZXR1cm4gTlVMTDsKIAl9Ci0KLQkvKiBjcmVhdGUgZHZiX2Zyb250ZW5kICovCi0Jc3RhdGUtPmZyb250ZW5kLm9wcyA9ICZzdGF0ZS0+b3BzOwogCXN0YXRlLT5mcm9udGVuZC5kZW1vZHVsYXRvcl9wcml2ID0gc3RhdGU7CiAKIAlyZXR1cm4gc3RhdGU7CQkJCS8qCU1hbnUgKERTVCBpcyBhIGNhcmQgbm90IGEgZnJvbnRlbmQpCSovCkBAIC0xNDU1LDggKzE3NzQsMTAgQEAKIAogCS5yZWxlYXNlID0gZHN0X3JlbGVhc2UsCiAJLmluaXQgPSBkc3RfaW5pdCwKLQkudHVuZSA9IGRzdF9zZXRfZnJvbnRlbmQsCisJLnR1bmUgPSBkc3RfdHVuZV9mcm9udGVuZCwKKwkuc2V0X2Zyb250ZW5kID0gZHN0X3NldF9mcm9udGVuZCwKIAkuZ2V0X2Zyb250ZW5kID0gZHN0X2dldF9mcm9udGVuZCwKKwkuZ2V0X2Zyb250ZW5kX2FsZ28gPSBkc3RfZ2V0X3R1bmluZ19hbGdvLAogCS5yZWFkX3N0YXR1cyA9IGRzdF9yZWFkX3N0YXR1cywKIAkucmVhZF9zaWduYWxfc3RyZW5ndGggPSBkc3RfcmVhZF9zaWduYWxfc3RyZW5ndGgsCiAJLnJlYWRfc25yID0gZHN0X3JlYWRfc25yLApAQCAtMTQ3OSw4ICsxODAwLDEwIEBACiAKIAkucmVsZWFzZSA9IGRzdF9yZWxlYXNlLAogCS5pbml0ID0gZHN0X2luaXQsCi0JLnR1bmUgPSBkc3Rfc2V0X2Zyb250ZW5kLAorCS50dW5lID0gZHN0X3R1bmVfZnJvbnRlbmQsCisJLnNldF9mcm9udGVuZCA9IGRzdF9zZXRfZnJvbnRlbmQsCiAJLmdldF9mcm9udGVuZCA9IGRzdF9nZXRfZnJvbnRlbmQsCisJLmdldF9mcm9udGVuZF9hbGdvID0gZHN0X2dldF90dW5pbmdfYWxnbywKIAkucmVhZF9zdGF0dXMgPSBkc3RfcmVhZF9zdGF0dXMsCiAJLnJlYWRfc2lnbmFsX3N0cmVuZ3RoID0gZHN0X3JlYWRfc2lnbmFsX3N0cmVuZ3RoLAogCS5yZWFkX3NuciA9IGRzdF9yZWFkX3NuciwKQEAgLTE1MDYsMTMgKzE4MjksMzggQEAKIAogCS5yZWxlYXNlID0gZHN0X3JlbGVhc2UsCiAJLmluaXQgPSBkc3RfaW5pdCwKLQkudHVuZSA9IGRzdF9zZXRfZnJvbnRlbmQsCisJLnR1bmUgPSBkc3RfdHVuZV9mcm9udGVuZCwKKwkuc2V0X2Zyb250ZW5kID0gZHN0X3NldF9mcm9udGVuZCwKIAkuZ2V0X2Zyb250ZW5kID0gZHN0X2dldF9mcm9udGVuZCwKKwkuZ2V0X2Zyb250ZW5kX2FsZ28gPSBkc3RfZ2V0X3R1bmluZ19hbGdvLAogCS5yZWFkX3N0YXR1cyA9IGRzdF9yZWFkX3N0YXR1cywKIAkucmVhZF9zaWduYWxfc3RyZW5ndGggPSBkc3RfcmVhZF9zaWduYWxfc3RyZW5ndGgsCiAJLnJlYWRfc25yID0gZHN0X3JlYWRfc25yLAogfTsKIAotTU9EVUxFX0RFU0NSSVBUSU9OKCJEU1QgRFZCLVMvVC9DIENvbWJvIEZyb250ZW5kIGRyaXZlciIpOworc3RhdGljIHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzIGRzdF9hdHNjX29wcyA9IHsKKwkuaW5mbyA9IHsKKwkJLm5hbWUgPSAiRFNUIEFUU0MiLAorCQkudHlwZSA9IEZFX0FUU0MsCisJCS5mcmVxdWVuY3lfc3RlcHNpemUgPSA2MjUwMCwKKwkJLmZyZXF1ZW5jeV9taW4gPSA1MTAwMDAwMDAsCisJCS5mcmVxdWVuY3lfbWF4ID0gODU4MDAwMDAwLAorCQkuc3ltYm9sX3JhdGVfbWluID0gMTAwMDAwMCwKKwkJLnN5bWJvbF9yYXRlX21heCA9IDQ1MDAwMDAwLAorCQkuY2FwcyA9IEZFX0NBTl9GRUNfQVVUTyB8IEZFX0NBTl9RQU1fQVVUTyB8IEZFX0NBTl9RQU1fNjQgfCBGRV9DQU5fUUFNXzI1NiB8IEZFX0NBTl84VlNCCisJfSwKKworCS5yZWxlYXNlID0gZHN0X3JlbGVhc2UsCisJLmluaXQgPSBkc3RfaW5pdCwKKwkudHVuZSA9IGRzdF90dW5lX2Zyb250ZW5kLAorCS5zZXRfZnJvbnRlbmQgPSBkc3Rfc2V0X2Zyb250ZW5kLAorCS5nZXRfZnJvbnRlbmQgPSBkc3RfZ2V0X2Zyb250ZW5kLAorCS5nZXRfZnJvbnRlbmRfYWxnbyA9IGRzdF9nZXRfdHVuaW5nX2FsZ28sCisJLnJlYWRfc3RhdHVzID0gZHN0X3JlYWRfc3RhdHVzLAorCS5yZWFkX3NpZ25hbF9zdHJlbmd0aCA9IGRzdF9yZWFkX3NpZ25hbF9zdHJlbmd0aCwKKwkucmVhZF9zbnIgPSBkc3RfcmVhZF9zbnIsCit9OworCitNT0RVTEVfREVTQ1JJUFRJT04oIkRTVCBEVkItUy9UL0MvQVRTQyBDb21ibyBGcm9udGVuZCBkcml2ZXIiKTsKIE1PRFVMRV9BVVRIT1IoIkphbWllIEhvbmFuLCBNYW51IEFicmFoYW0iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2RzdF9jYS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvZHN0X2NhLmMKaW5kZXggZjZiNDlhOC4uZmE5MjNiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvZHN0X2NhLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvZHN0X2NhLmMKQEAgLTY4LDYgKzY4LDEzIEBACiAJcmV0dXJuIC1FT1BOT1RTVVBQOwogfQogCitzdGF0aWMgdm9pZCBwdXRfY29tbWFuZF9hbmRfbGVuZ3RoKHU4ICpkYXRhLCBpbnQgY29tbWFuZCwgaW50IGxlbmd0aCkKK3sKKwlkYXRhWzBdID0gKGNvbW1hbmQgPj4gMTYpICYgMHhmZjsKKwlkYXRhWzFdID0gKGNvbW1hbmQgPj4gOCkgJiAweGZmOworCWRhdGFbMl0gPSBjb21tYW5kICYgMHhmZjsKKwlkYXRhWzNdID0gbGVuZ3RoOworfQogCiBzdGF0aWMgdm9pZCBwdXRfY2hlY2tzdW0odTggKmNoZWNrX3N0cmluZywgaW50IGxlbmd0aCkKIHsKQEAgLTEyNCwxNSArMTMxLDE4IEBACiAJdTggZHN0X2NhX2NvbW1fZXJyID0gMDsKIAogCXdoaWxlIChkc3RfY2FfY29tbV9lcnIgPCBSRVRSSUVTKSB7Ci0JCWRzdF9jb21tX2luaXQoc3RhdGUpOwogCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9DQV9OT1RJQ0UsIDEsICIgUHV0IENvbW1hbmQiKTsKIAkJaWYgKGRzdF9jaV9jb21tYW5kKHN0YXRlLCBkYXRhLCBjYV9zdHJpbmcsIGxlbiwgcmVhZCkpIHsJLy8gSWYgZXJyb3IKIAkJCWRzdF9lcnJvcl9yZWNvdmVyeShzdGF0ZSk7CiAJCQlkc3RfY2FfY29tbV9lcnIrKzsgLy8gd29yayByZXF1aXJlZCBoZXJlLgorCQl9IGVsc2UgeworCQkJYnJlYWs7CiAJCX0KLQkJYnJlYWs7CiAJfQogCisJaWYoZHN0X2NhX2NvbW1fZXJyID09IFJFVFJJRVMpCisJCXJldHVybiAtMTsKKwogCXJldHVybiAwOwogfQogCkBAIC0xNDAsNiArMTUwLDcgQEAKIAogc3RhdGljIGludCBjYV9nZXRfYXBwX2luZm8oc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUpCiB7CisJaW50IGxlbmd0aCwgc3RyX2xlbmd0aDsKIAlzdGF0aWMgdTggY29tbWFuZFs4XSA9IHsweDA3LCAweDQwLCAweDAxLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweGZmfTsKIAogCXB1dF9jaGVja3N1bSgmY29tbWFuZFswXSwgY29tbWFuZFswXSk7CkBAIC0xNTQsNiArMTY1LDY4IEBACiAJCShzdGF0ZS0+bWVzc2FnZXNbMTBdIDw8IDgpIHwgc3RhdGUtPm1lc3NhZ2VzWzExXSwgX19GVU5DVElPTl9fLCAoY2hhciAqKSgmc3RhdGUtPm1lc3NhZ2VzWzEyXSkpOwogCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0lORk8sIDEsICIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsKIAorCS8vIFRyYW5zZm9ybSBkc3QgbWVzc2FnZSB0byBjb3JyZWN0IGFwcGxpY2F0aW9uX2luZm8gbWVzc2FnZQorCWxlbmd0aCA9IHN0YXRlLT5tZXNzYWdlc1s1XTsKKwlzdHJfbGVuZ3RoID0gbGVuZ3RoIC0gNjsKKwlpZiAoc3RyX2xlbmd0aCA8IDApIHsKKwkJc3RyX2xlbmd0aCA9IDA7CisJCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0VSUk9SLCAxLCAiSW52YWxpZCBzdHJpbmcgbGVuZ3RoIHJldHVybmVkIGluIGNhX2dldF9hcHBfaW5mbygpLiBSZWNvdmVyaW5nLiIpOworCX0KKworCS8vIEZpcnN0LCB0aGUgY29tbWFuZCBhbmQgbGVuZ3RoIGZpZWxkcworCXB1dF9jb21tYW5kX2FuZF9sZW5ndGgoJnN0YXRlLT5tZXNzYWdlc1swXSwgQ0FfQVBQX0lORk8sIGxlbmd0aCk7CisKKwkvLyBDb3B5IGFwcGxpY2F0aW9uX3R5cGUsIGFwcGxpY2F0aW9uX21hbnVmYWN0dXJlciBhbmQgbWFudWZhY3R1cmVyX2NvZGUKKwltZW1jcHkoJnN0YXRlLT5tZXNzYWdlc1s0XSwgJnN0YXRlLT5tZXNzYWdlc1s3XSwgNSk7CisKKwkvLyBTZXQgc3RyaW5nIGxlbmd0aCBhbmQgY29weSBzdHJpbmcKKwlzdGF0ZS0+bWVzc2FnZXNbOV0gPSBzdHJfbGVuZ3RoOworCW1lbWNweSgmc3RhdGUtPm1lc3NhZ2VzWzEwXSwgJnN0YXRlLT5tZXNzYWdlc1sxMl0sIHN0cl9sZW5ndGgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2FfZ2V0X2NhX2luZm8oc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUpCit7CisJaW50IHNyY1B0ciwgZHN0UHRyLCBpLCBudW1faWRzOworCXN0YXRpYyB1OCBzbG90X2NvbW1hbmRbOF0gPSB7MHgwNywgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHhmZn07CisJY29uc3QgaW50IGluX3N5c3RlbV9pZF9wb3MgPSA4LCBvdXRfc3lzdGVtX2lkX3BvcyA9IDQsIGluX251bV9pZHNfcG9zID0gNzsKKworCXB1dF9jaGVja3N1bSgmc2xvdF9jb21tYW5kWzBdLCBzbG90X2NvbW1hbmRbMF0pOworCWlmICgoZHN0X3B1dF9jaShzdGF0ZSwgc2xvdF9jb21tYW5kLCBzaXplb2YgKHNsb3RfY29tbWFuZCksIHN0YXRlLT5tZXNzYWdlcywgR0VUX1JFUExZKSkgPCAwKSB7CisJCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0VSUk9SLCAxLCAiIC0tPmRzdF9wdXRfY2kgRkFJTEVEICEiKTsKKwkJcmV0dXJuIC0xOworCX0KKwlkcHJpbnRrKHZlcmJvc2UsIERTVF9DQV9JTkZPLCAxLCAiIC0tPmRzdF9wdXRfY2kgU1VDQ0VTUyAhIik7CisKKwkvLyBQcmludCByYXcgZGF0YQorCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0lORk8sIDAsICIgRFNUIGRhdGEgPSBbIik7CisJZm9yIChpID0gMDsgaSA8IHN0YXRlLT5tZXNzYWdlc1swXSArIDE7IGkrKykgeworCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9DQV9JTkZPLCAwLCAiIDB4JTAyeCIsIHN0YXRlLT5tZXNzYWdlc1tpXSk7CisJfQorCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0lORk8sIDAsICJdXG4iKTsKKworCS8vIFNldCB0aGUgY29tbWFuZCBhbmQgbGVuZ3RoIG9mIHRoZSBvdXRwdXQKKwludW1faWRzID0gc3RhdGUtPm1lc3NhZ2VzW2luX251bV9pZHNfcG9zXTsKKwlpZiAobnVtX2lkcyA+PSAxMDApIHsKKwkJbnVtX2lkcyA9IDEwMDsKKwkJZHByaW50ayh2ZXJib3NlLCBEU1RfQ0FfRVJST1IsIDEsICJJbnZhbGlkIG51bWJlciBvZiBpZHMgKD4xMDApLiBSZWNvdmVyaW5nLiIpOworCX0KKwlwdXRfY29tbWFuZF9hbmRfbGVuZ3RoKCZzdGF0ZS0+bWVzc2FnZXNbMF0sIENBX0lORk8sIG51bV9pZHMgKiAyKTsKKworCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0lORk8sIDAsICIgQ0FfSU5GTyA9IFsiKTsKKwlzcmNQdHIgPSBpbl9zeXN0ZW1faWRfcG9zOworCWRzdFB0ciA9IG91dF9zeXN0ZW1faWRfcG9zOworCWZvcihpID0gMDsgaSA8IG51bV9pZHM7IGkrKykgeworCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9DQV9JTkZPLCAwLCAiIDB4JTAyeCUwMngiLCBzdGF0ZS0+bWVzc2FnZXNbc3JjUHRyICsgMF0sIHN0YXRlLT5tZXNzYWdlc1tzcmNQdHIgKyAxXSk7CisJCS8vIEFwcGVuZCB0byBvdXRwdXQKKwkJc3RhdGUtPm1lc3NhZ2VzW2RzdFB0ciArIDBdID0gc3RhdGUtPm1lc3NhZ2VzW3NyY1B0ciArIDBdOworCQlzdGF0ZS0+bWVzc2FnZXNbZHN0UHRyICsgMV0gPSBzdGF0ZS0+bWVzc2FnZXNbc3JjUHRyICsgMV07CisJCXNyY1B0ciArPSAyOworCQlkc3RQdHIgKz0gMjsKKwl9CisJZHByaW50ayh2ZXJib3NlLCBEU1RfQ0FfSU5GTywgMCwgIl1cbiIpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE3NCw3ICsyNDcsNyBAQAogCiAJZHByaW50ayh2ZXJib3NlLCBEU1RfQ0FfSU5GTywgMSwgIiBTbG90IGNhcCA9IFslZF0iLCBzbG90X2NhcFs3XSk7CiAJZHByaW50ayh2ZXJib3NlLCBEU1RfQ0FfSU5GTywgMCwgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKLQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCWZvciAoaSA9IDA7IGkgPCBzbG90X2NhcFswXSArIDE7IGkrKykKIAkJZHByaW50ayh2ZXJib3NlLCBEU1RfQ0FfSU5GTywgMCwgIiAlZCIsIHNsb3RfY2FwW2ldKTsKIAlkcHJpbnRrKHZlcmJvc2UsIERTVF9DQV9JTkZPLCAwLCAiXG4iKTsKIApAQCAtMjYwLDYgKzMzMywxMSBAQAogCQkJaWYgKGNvcHlfdG9fdXNlcihhcmcsIHBfY2FfbWVzc2FnZSwgc2l6ZW9mIChzdHJ1Y3QgY2FfbXNnKSkgKQogCQkJCXJldHVybiAtRUZBVUxUOwogCQkJYnJlYWs7CisJCWNhc2UgQ0FfSU5GTzoKKwkJCW1lbWNweShwX2NhX21lc3NhZ2UtPm1zZywgc3RhdGUtPm1lc3NhZ2VzLCAxMjgpOworCQkJaWYgKGNvcHlfdG9fdXNlcihhcmcsIHBfY2FfbWVzc2FnZSwgc2l6ZW9mIChzdHJ1Y3QgY2FfbXNnKSkgKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJYnJlYWs7CiAJCX0KIAl9CiAKQEAgLTMwMiw3ICszODAsNyBAQAogCQlyZGNfcmVzZXRfc3RhdGUoc3RhdGUpOwogCQlyZXR1cm4gLTE7CiAJfQotCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX05PVElDRSwgMSwgIiBEU1QtQ0kgQ29tbWFuZCBzdWNjZXMuIik7CisJZHByaW50ayh2ZXJib3NlLCBEU1RfQ0FfTk9USUNFLCAxLCAiIERTVC1DSSBDb21tYW5kIHN1Y2Nlc3MuIik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTM0MCw2ICs0MTgsNyBAQAogCXJldHVybiAwOwogfQogCisKIHN0YXRpYyBpbnQgY2Ffc2V0X3BtdChzdHJ1Y3QgZHN0X3N0YXRlICpzdGF0ZSwgc3RydWN0IGNhX21zZyAqcF9jYV9tZXNzYWdlLCBzdHJ1Y3QgY2FfbXNnICpod19idWZmZXIsIHU4IHJlcGx5LCB1OCBxdWVyeSkKIHsKIAl1MzIgbGVuZ3RoID0gMDsKQEAgLTQ1NSw2ICs1MzQsMTYgQEAKIAkJCX0KIAkJCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0lORk8sIDEsICIgLS0+Q0FfQVBQX0lORk9fRU5RVUlSWSBTdWNjZXNzICEiKTsKIAkJCWJyZWFrOworCQljYXNlIENBX0lORk9fRU5RVUlSWToKKwkJCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0lORk8sIDEsICIgR2V0dGluZyBDQSBJbmZvcm1hdGlvbiIpOworCisJCQlpZiAoKGNhX2dldF9jYV9pbmZvKHN0YXRlKSkgPCAwKSB7CisJCQkJZHByaW50ayh2ZXJib3NlLCBEU1RfQ0FfRVJST1IsIDEsICIgLS0+Q0FfSU5GT19FTlFVSVJZIEZhaWxlZCAhIik7CisJCQkJcmVzdWx0ID0gLTE7CisJCQkJZ290byBmcmVlX21lbV9hbmRfZXhpdDsKKwkJCX0KKwkJCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0lORk8sIDEsICIgLS0+Q0FfSU5GT19FTlFVSVJZIFN1Y2Nlc3MgISIpOworCQkJYnJlYWs7CiAJCX0KIAl9CiBmcmVlX21lbV9hbmRfZXhpdDoKQEAgLTQ3MywxOCArNTYyLDE1IEBACiAJdm9pZCBfX3VzZXIgKmFyZyA9ICh2b2lkIF9fdXNlciAqKWlvY3RsX2FyZzsKIAlpbnQgcmVzdWx0ID0gMDsKIAotCWlmICgocF9jYV9tZXNzYWdlID0gKHN0cnVjdCBjYV9tc2cgKikga21hbGxvYyhzaXplb2YgKHN0cnVjdCBjYV9tc2cpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkgeworCXBfY2FfbWVzc2FnZSA9IGttYWxsb2Moc2l6ZW9mIChzdHJ1Y3QgY2FfbXNnKSwgR0ZQX0tFUk5FTCk7CisJcF9jYV9zbG90X2luZm8gPSBrbWFsbG9jKHNpemVvZiAoc3RydWN0IGNhX3Nsb3RfaW5mbyksIEdGUF9LRVJORUwpOworCXBfY2FfY2FwcyA9IGttYWxsb2Moc2l6ZW9mIChzdHJ1Y3QgY2FfY2FwcyksIEdGUF9LRVJORUwpOworCWlmICghcF9jYV9tZXNzYWdlIHx8ICFwX2NhX3Nsb3RfaW5mbyB8fCAhcF9jYV9jYXBzKSB7CiAJCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0VSUk9SLCAxLCAiIE1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUiKTsKLQkJcmV0dXJuIC1FTk9NRU07CisJCXJlc3VsdCA9IC1FTk9NRU07CisJCWdvdG8gZnJlZV9tZW1fYW5kX2V4aXQ7CiAJfQotCWlmICgocF9jYV9zbG90X2luZm8gPSAoc3RydWN0IGNhX3Nsb3RfaW5mbyAqKSBrbWFsbG9jKHNpemVvZiAoc3RydWN0IGNhX3Nsb3RfaW5mbyksIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7Ci0JCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0VSUk9SLCAxLCAiIE1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUiKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCWlmICgocF9jYV9jYXBzID0gKHN0cnVjdCBjYV9jYXBzICopIGttYWxsb2Moc2l6ZW9mIChzdHJ1Y3QgY2FfY2FwcyksIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7Ci0JCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0VSUk9SLCAxLCAiIE1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUiKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQorCiAJLyoJV2UgaGF2ZSBub3cgb25seSB0aGUgc3RhbmRhcmQgaW9jdGwncywgdGhlIGRyaXZlciBpcyB1cHBvc2VkIHRvIGhhbmRsZSBpbnRlcm5hbHMuCSovCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIENBX1NFTkRfTVNHOgpAQCAtNTgyLDcgKzY2OCw3IEBACiAKIHN0YXRpYyBzc2l6ZV90IGRzdF9jYV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgbGVuZ3RoLCBsb2ZmX3QgKm9mZnNldCkKIHsKLQlpbnQgYnl0ZXNfcmVhZCA9IDA7CisJc3NpemVfdCBieXRlc19yZWFkID0gMDsKIAogCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0RFQlVHLCAxLCAiIERldmljZSByZWFkLiIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9kc3RfY29tbW9uLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9kc3RfY29tbW9uLmgKaW5kZXggNTFkNGUwNC4uMDY3N2IwNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvZHN0X2NvbW1vbi5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2RzdF9jb21tb24uaApAQCAtNDIsNyArNDIsNyBAQAogI2RlZmluZSBEU1RfVFlQRV9JU19DQUJMRQkyCiAjZGVmaW5lIERTVF9UWVBFX0lTX0FUU0MJMwogCi0jZGVmaW5lIERTVF9UWVBFX0hBU19ORVdUVU5FCTEKKyNkZWZpbmUgRFNUX1RZUEVfSEFTX1RTMTg4CTEKICNkZWZpbmUgRFNUX1RZUEVfSEFTX1RTMjA0CTIKICNkZWZpbmUgRFNUX1RZUEVfSEFTX1NZTURJVgk0CiAjZGVmaW5lIERTVF9UWVBFX0hBU19GV18xCTgKQEAgLTUyLDYgKzUyLDkgQEAKICNkZWZpbmUgRFNUX1RZUEVfSEFTX09CU19SRUdTCTEyOAogI2RlZmluZSBEU1RfVFlQRV9IQVNfSU5DX0NPVU5UCTI1NgogI2RlZmluZSBEU1RfVFlQRV9IQVNfTVVMVElfRkUJNTEyCisjZGVmaW5lIERTVF9UWVBFX0hBU19ORVdUVU5FXzIJMTAyNAorI2RlZmluZSBEU1RfVFlQRV9IQVNfREJPQVJECTIwNDgKKyNkZWZpbmUgRFNUX1RZUEVfSEFTX1ZMRgk0MDk2CiAKIC8qCUNhcmQgY2FwYWJpbGl0eSBsaXN0CSovCiAKQEAgLTY0LDYgKzY3LDIwIEBACiAjZGVmaW5lCURTVF9UWVBFX0hBU19BTkFMT0cJNjQJLyoJQW5hbG9nIGlucHV0cwkqLwogI2RlZmluZSBEU1RfVFlQRV9IQVNfU0VTU0lPTgkxMjgKIAorI2RlZmluZSBUVU5FUl9UWVBFX01VTFRJCTEKKyNkZWZpbmUgVFVORVJfVFlQRV9VTktOT1dOCTIKKy8qCURWQi1TCQkqLworI2RlZmluZSBUVU5FUl9UWVBFX0w2NDcyNAk0CisjZGVmaW5lIFRVTkVSX1RZUEVfU1RWMDI5OQk4CisjZGVmaW5lIFRVTkVSX1RZUEVfTUI4NkExNQkxNgorCisvKglEVkItVAkJKi8KKyNkZWZpbmUgVFVORVJfVFlQRV9UREExMDA0NgkzMgorCisvKglBVFNDCQkqLworI2RlZmluZSBUVU5FUl9UWVBFX05YVDIwMHgJNjQKKworCiAjZGVmaW5lIFJEQ184ODIwX1BJT18wX0RJU0FCTEUJMAogI2RlZmluZSBSRENfODgyMF9QSU9fMF9FTkFCTEUJMQogI2RlZmluZSBSRENfODgyMF9JTlQJCTIKQEAgLTg0LDggKzEwMSw2IEBACiAKIAlzdHJ1Y3QgYnQ4NzgqIGJ0OwogCi0Jc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMgb3BzOwotCiAJLyogY29uZmlndXJhdGlvbiBzZXR0aW5ncyAqLwogCWNvbnN0IHN0cnVjdCBkc3RfY29uZmlnKiBjb25maWc7CiAKQEAgLTEyMSw4ICsxMzYsMTcgQEAKIAl1OCBjYXJkX2luZm9bOF07CiAJdTggdmVuZG9yWzhdOwogCXU4IGJvYXJkX2luZm9bOF07Ci0KKwl1MzIgdHVuZXJfdHlwZTsKKwljaGFyICp0dW5lcl9uYW1lOwogCXN0cnVjdCBtdXRleCBkc3RfbXV0ZXg7CisJdTggZndfbmFtZVs4XTsKK307CisKK3N0cnVjdCB0dW5lcl90eXBlcyB7CisJdTMyIHR1bmVyX3R5cGU7CisJY2hhciAqdHVuZXJfbmFtZTsKKwljaGFyICpib2FyZF9uYW1lOworCWNoYXIgKmZ3X25hbWU7CiB9OwogCiBzdHJ1Y3QgZHN0X3R5cGVzIHsKQEAgLTEzMSw2ICsxNTUsNyBAQAogCXU4IGRzdF90eXBlOwogCXUzMiB0eXBlX2ZsYWdzOwogCXUzMiBkc3RfZmVhdHVyZTsKKwl1MzIgdHVuZXJfdHlwZTsKIH07CiAKIHN0cnVjdCBkc3RfY29uZmlnCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9kdmItYnQ4eHguYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2R2Yi1idDh4eC5jCmluZGV4IGNjYzdiMmUuLmI3MTViOTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2R2Yi1idDh4eC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2R2Yi1idDh4eC5jCkBAIC0xNDcsMTIgKzE0NywxNSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHRob21zb25fZHR0NzU3OV9wbGxfc2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcywgdTgqIHBsbGJ1ZikKK3N0YXRpYyBpbnQgdGhvbXNvbl9kdHQ3NTc5X3R1bmVyX2NhbGNfcmVncyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMsIHU4KiBwbGxidWYsIGludCBidWZfbGVuKQogewogCXUzMiBkaXY7CiAJdW5zaWduZWQgY2hhciBicyA9IDA7CiAJdW5zaWduZWQgY2hhciBjcCA9IDA7CiAKKwlpZiAoYnVmX2xlbiA8IDUpCisJCXJldHVybiAtRUlOVkFMOworCiAJZGl2ID0gKCgocGFyYW1zLT5mcmVxdWVuY3kgKyA4MzMzMykgKiAzKSAvIDUwMDAwMCkgKyBJRl9GUkVRVUVOQ1l4NjsKIAogCWlmIChwYXJhbXMtPmZyZXF1ZW5jeSA8IDU0MjAwMDAwMCkKQEAgLTE2OSwyMiArMTcyLDI1IEBACiAJZWxzZQogCQlicyA9IDB4MDg7CiAKLQlwbGxidWZbMF0gPSAweGMwOyAvLyBOb3RlOiBub24tbGludXggc3RhbmRhcmQgUExMIGkyYyBhZGRyZXNzCisJcGxsYnVmWzBdID0gMHg2MDsKIAlwbGxidWZbMV0gPSBkaXYgPj4gODsKIAlwbGxidWZbMl0gPSBkaXYgJiAweGZmOwogCXBsbGJ1ZlszXSA9IGNwOwogCXBsbGJ1Zls0XSA9IGJzOwogCi0JcmV0dXJuIDA7CisJcmV0dXJuIDU7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbXQzNTJfY29uZmlnIHRob21zb25fZHR0NzU3OV9jb25maWcgPSB7CiAJLmRlbW9kX2FkZHJlc3MgPSAweDBmLAogCS5kZW1vZF9pbml0ID0gdGhvbXNvbl9kdHQ3NTc5X2RlbW9kX2luaXQsCi0JLnBsbF9zZXQgPSB0aG9tc29uX2R0dDc1NzlfcGxsX3NldCwKIH07CiAKLXN0YXRpYyBpbnQgY3gyNDEwOF9wbGxfc2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcykKK3N0YXRpYyBzdHJ1Y3QgemwxMDM1M19jb25maWcgdGhvbXNvbl9kdHQ3NTc5X3psMTAzNTNfY29uZmlnID0geworCS5kZW1vZF9hZGRyZXNzID0gMHgwZiwKK307CisKK3N0YXRpYyBpbnQgY3gyNDEwOF90dW5lcl9zZXRfcGFyYW1zKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcykKIHsKIAl1MzIgZnJlcSA9IHBhcmFtcy0+ZnJlcXVlbmN5OwogCkBAIC0yMzcsNyArMjQzLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBwaW5uc2F0X3BsbF9pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKQorc3RhdGljIGludCBwaW5uc2F0X3R1bmVyX2luaXQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCiB7CiAJc3RydWN0IGR2Yl9idDh4eF9jYXJkICpjYXJkID0gZmUtPmR2Yi0+cHJpdjsKIApAQCAtMjQ3LDcgKzI1Myw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcGlubnNhdF9wbGxfc2xlZXAoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCitzdGF0aWMgaW50IHBpbm5zYXRfdHVuZXJfc2xlZXAoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCiB7CiAJc3RydWN0IGR2Yl9idDh4eF9jYXJkICpjYXJkID0gZmUtPmR2Yi0+cHJpdjsKIApAQCAtMjU4LDEyICsyNjQsOSBAQAogCiBzdGF0aWMgc3RydWN0IGN4MjQxMTBfY29uZmlnIHBjdHZzYXRfY29uZmlnID0gewogCS5kZW1vZF9hZGRyZXNzID0gMHg1NSwKLQkucGxsX2luaXQgPSBwaW5uc2F0X3BsbF9pbml0LAotCS5wbGxfc2V0ID0gY3gyNDEwOF9wbGxfc2V0LAotCS5wbGxfc2xlZXAgPSBwaW5uc2F0X3BsbF9zbGVlcCwKIH07CiAKLXN0YXRpYyBpbnQgbWljcm90dW5lX210NzIwMmR0Zl9wbGxfc2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcykKK3N0YXRpYyBpbnQgbWljcm90dW5lX210NzIwMmR0Zl90dW5lcl9zZXRfcGFyYW1zKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcykKIHsKIAlzdHJ1Y3QgZHZiX2J0OHh4X2NhcmQgKmNhcmQgPSAoc3RydWN0IGR2Yl9idDh4eF9jYXJkICopIGZlLT5kdmItPnByaXY7CiAJdTggY2ZnLCBjcHVtcCwgYmFuZF9zZWxlY3Q7CkBAIC0yOTcsNiArMzAwLDggQEAKIAlkYXRhWzJdID0gKChkaXYgPj4gMTApICYgMHg2MCkgfCBjZmc7CiAJZGF0YVszXSA9IChjcHVtcCA8PCA2KSB8IGJhbmRfc2VsZWN0OwogCisJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKIAlpMmNfdHJhbnNmZXIoY2FyZC0+aTJjX2FkYXB0ZXIsICZtc2csIDEpOwogCXJldHVybiAoZGl2ICogMTY2NjY2IC0gMzYwMDAwMDApOwogfQpAQCAtMzEwLDcgKzMxNSw2IEBACiAKIHN0YXRpYyBzdHJ1Y3Qgc3A4ODd4X2NvbmZpZyBtaWNyb3R1bmVfbXQ3MjAyZHRmX2NvbmZpZyA9IHsKIAkuZGVtb2RfYWRkcmVzcyA9IDB4NzAsCi0JLnBsbF9zZXQgPSBtaWNyb3R1bmVfbXQ3MjAyZHRmX3BsbF9zZXQsCiAJLnJlcXVlc3RfZmlybXdhcmUgPSBtaWNyb3R1bmVfbXQ3MjAyZHRmX3JlcXVlc3RfZmlybXdhcmUsCiB9OwogCkBAIC0zMzcsMTIgKzM0MSwxNCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGFkdmJ0NzcxX3NhbXN1bmdfdGR0YzkyNTFkaDBfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMsIHU4KiBwbGxidWYpCitzdGF0aWMgaW50IGFkdmJ0NzcxX3NhbXN1bmdfdGR0YzkyNTFkaDBfdHVuZXJfY2FsY19yZWdzKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcywgdTgqIHBsbGJ1ZiwgaW50IGJ1Zl9sZW4pCiB7CiAJdTMyIGRpdjsKIAl1bnNpZ25lZCBjaGFyIGJzID0gMDsKIAl1bnNpZ25lZCBjaGFyIGNwID0gMDsKIAorCWlmIChidWZfbGVuIDwgNSkgcmV0dXJuIC1FSU5WQUw7CisKIAlkaXYgPSAoKChwYXJhbXMtPmZyZXF1ZW5jeSArIDgzMzMzKSAqIDMpIC8gNTAwMDAwKSArIElGX0ZSRVFVRU5DWXg2OwogCiAJaWYgKHBhcmFtcy0+ZnJlcXVlbmN5IDwgMTUwMDAwMDAwKQpAQCAtMzgzLDE5ICszODksMTggQEAKIAllbHNlCiAJCWJzID0gMHgwODsKIAotCXBsbGJ1ZlswXSA9IDB4YzI7IC8vIE5vdGU6IG5vbi1saW51eCBzdGFuZGFyZCBQTEwgaTJjIGFkZHJlc3MKKwlwbGxidWZbMF0gPSAweDYxOwogCXBsbGJ1ZlsxXSA9IGRpdiA+PiA4OwogCXBsbGJ1ZlsyXSA9IGRpdiAmIDB4ZmY7CiAJcGxsYnVmWzNdID0gY3A7CiAJcGxsYnVmWzRdID0gYnM7CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gNTsKIH0KIAogc3RhdGljIHN0cnVjdCBtdDM1Ml9jb25maWcgYWR2YnQ3NzFfc2Ftc3VuZ190ZHRjOTI1MWRoMF9jb25maWcgPSB7CiAJLmRlbW9kX2FkZHJlc3MgPSAweDBmLAogCS5kZW1vZF9pbml0ID0gYWR2YnQ3NzFfc2Ftc3VuZ190ZHRjOTI1MWRoMF9kZW1vZF9pbml0LAotCS5wbGxfc2V0ID0gYWR2YnQ3NzFfc2Ftc3VuZ190ZHRjOTI1MWRoMF9wbGxfc2V0LAogfTsKIAogc3RhdGljIHN0cnVjdCBkc3RfY29uZmlnIGRzdF9jb25maWcgPSB7CkBAIC00NTUsNyArNDYwLDcgQEAKIAkuc2xlZXAgPSBvcjUxMjExX3NsZWVwLAogfTsKIAotc3RhdGljIGludCB2cDMwMjFfYWxwc190ZGVkNF9wbGxfc2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcykKK3N0YXRpYyBpbnQgdnAzMDIxX2FscHNfdGRlZDRfdHVuZXJfc2V0X3BhcmFtcyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMpCiB7CiAJc3RydWN0IGR2Yl9idDh4eF9jYXJkICpjYXJkID0gKHN0cnVjdCBkdmJfYnQ4eHhfY2FyZCAqKSBmZS0+ZHZiLT5wcml2OwogCXU4IGJ1Zls0XTsKQEAgLTQ3OCw2ICs0ODMsOCBAQAogCWVsc2UKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDEpOwogCWkyY190cmFuc2ZlcihjYXJkLT5pMmNfYWRhcHRlciwgJm1zZywgMSk7CiAJcmV0dXJuIDA7CiB9CkBAIC00ODUsNyArNDkyLDYgQEAKIHN0YXRpYyBzdHJ1Y3Qgbnh0NjAwMF9jb25maWcgdnAzMDIxX2FscHNfdGRlZDRfY29uZmlnID0gewogCS5kZW1vZF9hZGRyZXNzID0gMHgwYSwKIAkuY2xvY2tfaW52ZXJzaW9uID0gMSwKLQkucGxsX3NldCA9IHZwMzAyMV9hbHBzX3RkZWQ0X3BsbF9zZXQsCiB9OwogCiBzdGF0aWMgaW50IGRpZ2l0dl9hbHBzX3RkZWQ0X2RlbW9kX2luaXQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCkBAIC01MDYsMTQgKzUxMiwxNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGRpZ2l0dl9hbHBzX3RkZWQ0X3BsbF9zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyogcGFyYW1zLCB1OCogcGxsYnVmKQorc3RhdGljIGludCBkaWdpdHZfYWxwc190ZGVkNF90dW5lcl9jYWxjX3JlZ3Moc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyogcGFyYW1zLCB1OCogcGxsYnVmLCBpbnQgYnVmX2xlbikKIHsKIAl1MzIgZGl2OwogCXN0cnVjdCBkdmJfb2ZkbV9wYXJhbWV0ZXJzICpvcCA9ICZwYXJhbXMtPnUub2ZkbTsKIAorCWlmIChidWZfbGVuIDwgNSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAlkaXYgPSAoKChwYXJhbXMtPmZyZXF1ZW5jeSArIDgzMzMzKSAqIDMpIC8gNTAwMDAwKSArIElGX0ZSRVFVRU5DWXg2OwogCi0JcGxsYnVmWzBdID0gMHhjMjsKKwlwbGxidWZbMF0gPSAweDYxOwogCXBsbGJ1ZlsxXSA9IChkaXYgPj4gOCkgJiAweDdGOwogCXBsbGJ1ZlsyXSA9IGRpdiAmIDB4RkY7CiAJcGxsYnVmWzNdID0gMHg4NTsKQEAgLTUzMCw3ICs1MzksNyBAQAogCWlmIChvcC0+YmFuZHdpZHRoID09IDgpCiAJCXBsbGJ1Zls0XSB8PSAweDA0OwogCi0JcmV0dXJuIDA7CisJcmV0dXJuIDU7CiB9CiAKIHN0YXRpYyB2b2lkIGRpZ2l0dl9hbHBzX3RkZWQ0X3Jlc2V0KHN0cnVjdCBkdmJfYnQ4eHhfY2FyZCAqYnQpCkBAIC01NTcsNDMgKzU2NiwxOCBAQAogc3RhdGljIHN0cnVjdCBtdDM1Ml9jb25maWcgZGlnaXR2X2FscHNfdGRlZDRfY29uZmlnID0gewogCS5kZW1vZF9hZGRyZXNzID0gMHgwYSwKIAkuZGVtb2RfaW5pdCA9IGRpZ2l0dl9hbHBzX3RkZWQ0X2RlbW9kX2luaXQsCi0JLnBsbF9zZXQgPSBkaWdpdHZfYWxwc190ZGVkNF9wbGxfc2V0LAogfTsKIAotc3RhdGljIGludCB0ZHZzX3R1YTYwMzRfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMpCitzdGF0aWMgaW50IHRkdnNfdHVhNjAzNF90dW5lcl9zZXRfcGFyYW1zKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcykKIHsKIAlzdHJ1Y3QgZHZiX2J0OHh4X2NhcmQgKmNhcmQgPSAoc3RydWN0IGR2Yl9idDh4eF9jYXJkICopIGZlLT5kdmItPnByaXY7Ci0JdTggYnVmWzRdOwotCXN0cnVjdCBpMmNfbXNnIG1zZyA9IHsgLmFkZHIgPSAweDYxLCAuZmxhZ3MgPSAwLCAuYnVmID0gYnVmLCAubGVuID0gc2l6ZW9mKGJ1ZikgfTsKLQlpbnQgZXJyOwotCi0JZHZiX3BsbF9jb25maWd1cmUoJmR2Yl9wbGxfdGR2c190dWE2MDM0LCBidWYsIHBhcmFtcy0+ZnJlcXVlbmN5LCAwKTsKLQlkcHJpbnRrKCIlczogdHVuZXIgYXQgMHglMDJ4IGJ5dGVzOiAweCUwMnggMHglMDJ4IDB4JTAyeCAweCUwMnhcbiIsCi0JCV9fRlVOQ1RJT05fXywgbXNnLmFkZHIsIGJ1ZlswXSxidWZbMV0sYnVmWzJdLGJ1ZlszXSk7Ci0JaWYgKChlcnIgPSBpMmNfdHJhbnNmZXIoY2FyZC0+aTJjX2FkYXB0ZXIsICZtc2csIDEpKSAhPSAxKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgImR2Yi1idDh4eDogJXMgZXJyb3IgIgotCQkJIihhZGRyICUwMnggPC0gJTAyeCwgZXJyID0gJWkpXG4iLAotCQkJX19GVU5DVElPTl9fLCBidWZbMF0sIGJ1ZlsxXSwgZXJyKTsKLQkJaWYgKGVyciA8IDApCi0JCQlyZXR1cm4gZXJyOwotCQllbHNlCi0JCQlyZXR1cm4gLUVSRU1PVEVJTzsKLQl9Ci0KLQkvKiBTZXQgdGhlIEF1eGlsaWFyeSBCeXRlLiAqLwotCWJ1ZlsyXSAmPSB+MHgyMDsKLQlidWZbMl0gfD0gMHgxODsKLQlidWZbM10gPSAweDUwOwotCWkyY190cmFuc2ZlcihjYXJkLT5pMmNfYWRhcHRlciwgJm1zZywgMSk7Ci0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gbGdfaDA2eGZfcGxsX3NldChmZSwgY2FyZC0+aTJjX2FkYXB0ZXIsIHBhcmFtcyk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbGdkdDMzMHhfY29uZmlnIHRkdnNfdHVhNjAzNF9jb25maWcgPSB7CiAJLmRlbW9kX2FkZHJlc3MgICAgPSAweDBlLAogCS5kZW1vZF9jaGlwICAgICAgID0gTEdEVDMzMDMsCiAJLnNlcmlhbF9tcGVnICAgICAgPSAweDQwLCAvKiBUUFNFUklBTCBmb3IgMzMwMyBpbiBUT1BfQ09OVFJPTCAqLwotCS5wbGxfc2V0ICAgICAgICAgID0gdGR2c190dWE2MDM0X3BsbF9zZXQsCiB9OwogCiBzdGF0aWMgdm9pZCBsZ2R0MzMweF9yZXNldChzdHJ1Y3QgZHZiX2J0OHh4X2NhcmQgKmJ0KQpAQCAtNjE3LDE3ICs2MDEsMjUgQEAKIAlzd2l0Y2godHlwZSkgewogCWNhc2UgQlRUVl9CT0FSRF9EVklDT19EVkJUX0xJVEU6CiAJCWNhcmQtPmZlID0gbXQzNTJfYXR0YWNoKCZ0aG9tc29uX2R0dDc1NzlfY29uZmlnLCBjYXJkLT5pMmNfYWRhcHRlcik7CisKKwkJaWYgKGNhcmQtPmZlID09IE5VTEwpCisJCQljYXJkLT5mZSA9IHpsMTAzNTNfYXR0YWNoKCZ0aG9tc29uX2R0dDc1NzlfemwxMDM1M19jb25maWcsCisJCQkJCQkgIGNhcmQtPmkyY19hZGFwdGVyKTsKKwogCQlpZiAoY2FyZC0+ZmUgIT0gTlVMTCkgewotCQkJY2FyZC0+ZmUtPm9wcy0+aW5mby5mcmVxdWVuY3lfbWluID0gMTc0MDAwMDAwOwotCQkJY2FyZC0+ZmUtPm9wcy0+aW5mby5mcmVxdWVuY3lfbWF4ID0gODYyMDAwMDAwOworCQkJY2FyZC0+ZmUtPm9wcy50dW5lcl9vcHMuY2FsY19yZWdzID0gdGhvbXNvbl9kdHQ3NTc5X3R1bmVyX2NhbGNfcmVnczsKKwkJCWNhcmQtPmZlLT5vcHMuaW5mby5mcmVxdWVuY3lfbWluID0gMTc0MDAwMDAwOworCQkJY2FyZC0+ZmUtPm9wcy5pbmZvLmZyZXF1ZW5jeV9tYXggPSA4NjIwMDAwMDA7CiAJCX0KIAkJYnJlYWs7CiAKIAljYXNlIEJUVFZfQk9BUkRfRFZJQ09fRlVTSU9OSERUVl81X0xJVEU6CiAJCWxnZHQzMzB4X3Jlc2V0KGNhcmQpOwogCQljYXJkLT5mZSA9IGxnZHQzMzB4X2F0dGFjaCgmdGR2c190dWE2MDM0X2NvbmZpZywgY2FyZC0+aTJjX2FkYXB0ZXIpOwotCQlpZiAoY2FyZC0+ZmUgIT0gTlVMTCkKKwkJaWYgKGNhcmQtPmZlICE9IE5VTEwpIHsKKwkJCWNhcmQtPmZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSB0ZHZzX3R1YTYwMzRfdHVuZXJfc2V0X3BhcmFtczsKIAkJCWRwcmludGsgKCJkdmJfYnQ4eHg6IGxnZHQzMzB4IGRldGVjdGVkXG4iKTsKKwkJfQogCQlicmVhazsKIAogCWNhc2UgQlRUVl9CT0FSRF9ORUJVTEFfRElHSVRWOgpAQCAtNjQwLDYgKzYzMiw3IEBACiAJCWRpZ2l0dl9hbHBzX3RkZWQ0X3Jlc2V0KGNhcmQpOwogCQljYXJkLT5mZSA9IG54dDYwMDBfYXR0YWNoKCZ2cDMwMjFfYWxwc190ZGVkNF9jb25maWcsIGNhcmQtPmkyY19hZGFwdGVyKTsKIAkJaWYgKGNhcmQtPmZlICE9IE5VTEwpIHsKKwkJCWNhcmQtPmZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSB2cDMwMjFfYWxwc190ZGVkNF90dW5lcl9zZXRfcGFyYW1zOwogCQkJZHByaW50ayAoImR2Yl9idDh4eDogYW4gbnh0NjAwMCB3YXMgZGV0ZWN0ZWQgb24geW91ciBkaWdpdHYgY2FyZFxuIik7CiAJCQlicmVhazsKIAkJfQpAQCAtNjQ4LDE5ICs2NDEsMjUgQEAKIAkJZGlnaXR2X2FscHNfdGRlZDRfcmVzZXQoY2FyZCk7CiAJCWNhcmQtPmZlID0gbXQzNTJfYXR0YWNoKCZkaWdpdHZfYWxwc190ZGVkNF9jb25maWcsIGNhcmQtPmkyY19hZGFwdGVyKTsKIAotCQlpZiAoY2FyZC0+ZmUgIT0gTlVMTCkKKwkJaWYgKGNhcmQtPmZlICE9IE5VTEwpIHsKKwkJCWNhcmQtPmZlLT5vcHMudHVuZXJfb3BzLmNhbGNfcmVncyA9IGRpZ2l0dl9hbHBzX3RkZWQ0X3R1bmVyX2NhbGNfcmVnczsKIAkJCWRwcmludGsgKCJkdmJfYnQ4eHg6IGFuIG10MzUyIHdhcyBkZXRlY3RlZCBvbiB5b3VyIGRpZ2l0diBjYXJkXG4iKTsKKwkJfQogCQlicmVhazsKIAogCWNhc2UgQlRUVl9CT0FSRF9BVkRWQlRfNzYxOgogCQljYXJkLT5mZSA9IHNwODg3eF9hdHRhY2goJm1pY3JvdHVuZV9tdDcyMDJkdGZfY29uZmlnLCBjYXJkLT5pMmNfYWRhcHRlcik7CisJCWlmIChjYXJkLT5mZSkgeworCQkJY2FyZC0+ZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IG1pY3JvdHVuZV9tdDcyMDJkdGZfdHVuZXJfc2V0X3BhcmFtczsKKwkJfQogCQlicmVhazsKIAogCWNhc2UgQlRUVl9CT0FSRF9BVkRWQlRfNzcxOgogCQljYXJkLT5mZSA9IG10MzUyX2F0dGFjaCgmYWR2YnQ3NzFfc2Ftc3VuZ190ZHRjOTI1MWRoMF9jb25maWcsIGNhcmQtPmkyY19hZGFwdGVyKTsKIAkJaWYgKGNhcmQtPmZlICE9IE5VTEwpIHsKLQkJCWNhcmQtPmZlLT5vcHMtPmluZm8uZnJlcXVlbmN5X21pbiA9IDE3NDAwMDAwMDsKLQkJCWNhcmQtPmZlLT5vcHMtPmluZm8uZnJlcXVlbmN5X21heCA9IDg2MjAwMDAwMDsKKwkJCWNhcmQtPmZlLT5vcHMudHVuZXJfb3BzLmNhbGNfcmVncyA9IGFkdmJ0NzcxX3NhbXN1bmdfdGR0YzkyNTFkaDBfdHVuZXJfY2FsY19yZWdzOworCQkJY2FyZC0+ZmUtPm9wcy5pbmZvLmZyZXF1ZW5jeV9taW4gPSAxNzQwMDAwMDA7CisJCQljYXJkLT5mZS0+b3BzLmluZm8uZnJlcXVlbmN5X21heCA9IDg2MjAwMDAwMDsKIAkJfQogCQlicmVhazsKIApAQCAtNjg3LDYgKzY4NiwxMSBAQAogCiAJY2FzZSBCVFRWX0JPQVJEX1BJTk5BQ0xFU0FUOgogCQljYXJkLT5mZSA9IGN4MjQxMTBfYXR0YWNoKCZwY3R2c2F0X2NvbmZpZywgY2FyZC0+aTJjX2FkYXB0ZXIpOworCQlpZiAoY2FyZC0+ZmUpIHsKKwkJCWNhcmQtPmZlLT5vcHMudHVuZXJfb3BzLmluaXQgPSBwaW5uc2F0X3R1bmVyX2luaXQ7CisJCQljYXJkLT5mZS0+b3BzLnR1bmVyX29wcy5zbGVlcCA9IHBpbm5zYXRfdHVuZXJfc2xlZXA7CisJCQljYXJkLT5mZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gY3gyNDEwOF90dW5lcl9zZXRfcGFyYW1zOworCQl9CiAJCWJyZWFrOwogCiAJY2FzZSBCVFRWX0JPQVJEX1BDX0hEVFY6CkBAIC03MDMsOCArNzA3LDggQEAKIAllbHNlCiAJCWlmIChkdmJfcmVnaXN0ZXJfZnJvbnRlbmQoJmNhcmQtPmR2Yl9hZGFwdGVyLCBjYXJkLT5mZSkpIHsKIAkJCXByaW50aygiZHZiLWJ0OHh4OiBGcm9udGVuZCByZWdpc3RyYXRpb24gZmFpbGVkIVxuIik7Ci0JCQlpZiAoY2FyZC0+ZmUtPm9wcy0+cmVsZWFzZSkKLQkJCQljYXJkLT5mZS0+b3BzLT5yZWxlYXNlKGNhcmQtPmZlKTsKKwkJCWlmIChjYXJkLT5mZS0+b3BzLnJlbGVhc2UpCisJCQkJY2FyZC0+ZmUtPm9wcy5yZWxlYXNlKGNhcmQtPmZlKTsKIAkJCWNhcmQtPmZlID0gTlVMTDsKIAkJfQogfQpAQCAtNzEzLDcgKzcxNyw3IEBACiB7CiAJaW50IHJlc3VsdDsKIAotCWlmICgocmVzdWx0ID0gZHZiX3JlZ2lzdGVyX2FkYXB0ZXIoJmNhcmQtPmR2Yl9hZGFwdGVyLCBjYXJkLT5jYXJkX25hbWUsIFRISVNfTU9EVUxFKSkgPCAwKSB7CisJaWYgKChyZXN1bHQgPSBkdmJfcmVnaXN0ZXJfYWRhcHRlcigmY2FyZC0+ZHZiX2FkYXB0ZXIsIGNhcmQtPmNhcmRfbmFtZSwgVEhJU19NT0RVTEUsICZjYXJkLT5idC0+ZGV2LT5kZXYpKSA8IDApIHsKIAkJcHJpbnRrKCJkdmJfYnQ4eHg6IGR2Yl9yZWdpc3Rlcl9hZGFwdGVyIGZhaWxlZCAoZXJybm8gPSAlZClcbiIsIHJlc3VsdCk7CiAJCXJldHVybiByZXN1bHQ7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvZHZiLWJ0OHh4LmggYi9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9kdmItYnQ4eHguaAppbmRleCAwMGRkOWZhLi40NzQ1YTkwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9kdmItYnQ4eHguaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9kdmItYnQ4eHguaApAQCAtMzcsNiArMzcsOCBAQAogI2luY2x1ZGUgImN4MjQxMTAuaCIKICNpbmNsdWRlICJvcjUxMjExLmgiCiAjaW5jbHVkZSAibGdkdDMzMHguaCIKKyNpbmNsdWRlICJsZ19oMDZ4Zi5oIgorI2luY2x1ZGUgInpsMTAzNTMuaCIKIAogc3RydWN0IGR2Yl9idDh4eF9jYXJkIHsKIAlzdHJ1Y3QgbXV0ZXggbG9jazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2NpbmVyZ3lUMi9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS9kdmIvY2luZXJneVQyL0tjb25maWcKaW5kZXggNjAxOGZjZC4uYjVjZGQ1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvY2luZXJneVQyL0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvY2luZXJneVQyL0tjb25maWcKQEAgLTY0LDcgKzY0LDcgQEAKIGNvbmZpZyBEVkJfQ0lORVJHWVQyX0VOQUJMRV9SQ19JTlBVVF9ERVZJQ0UKIAlib29sICJSZWdpc3RlciB0aGUgb25ib2FyZCBJUiBSZW1vdGUgQ29udHJvbCBSZWNlaXZlciBhcyBJbnB1dCBEZXZpY2UiCiAJZGVwZW5kcyBvbiBEVkJfQ0lORVJHWVQyX1RVTklORwotCWRlZmF1bHQgInllcyIKKwlkZWZhdWx0IHkKIAloZWxwCiAJICBFbmFibGUgdGhpcyBvcHRpb24gaWYgeW91IHdhbnQgdG8gdXNlIHRoZSBvbmJvYXJkIEluZnJhcmVkIFJlbW90ZQogCSAgQ29udHJvbCBSZWNlaXZlciBhcyBMaW51eC1JbnB1dCBkZXZpY2UuCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9jaW5lcmd5VDIvY2luZXJneVQyLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9jaW5lcmd5VDIvY2luZXJneVQyLmMKaW5kZXggOTMyNWQwMy4uMWI4OTUzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvY2luZXJneVQyL2NpbmVyZ3lUMi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2NpbmVyZ3lUMi9jaW5lcmd5VDIuYwpAQCAtNTQ0LDE1ICs1NDQsMTkgQEAKIHsKIAlzdHJ1Y3QgZHZiX2RldmljZSAqZHZiZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBjaW5lcmd5dDIgKmNpbmVyZ3l0MiA9IGR2YmRldi0+cHJpdjsKKyAgICAgICB1bnNpZ25lZCBpbnQgbWFzayA9IDA7CiAKIAlpZiAoY2luZXJneXQyLT5kaXNjb25uZWN0X3BlbmRpbmcgfHwgbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZjaW5lcmd5dDItPnNlbSkpCiAJCXJldHVybiAtRVJFU1RBUlRTWVM7CiAKIAlwb2xsX3dhaXQoZmlsZSwgJmNpbmVyZ3l0Mi0+cG9sbF93cSwgd2FpdCk7CiAKKyAgICAgICBpZiAoY2luZXJneXQyLT5wZW5kaW5nX2ZlX2V2ZW50cyAhPSAwKQorCQltYXNrIHw9IChQT0xMSU4gfCBQT0xMUkROT1JNIHwgUE9MTFBSSSk7CisKIAltdXRleF91bmxvY2soJmNpbmVyZ3l0Mi0+c2VtKTsKIAotCXJldHVybiAoUE9MTElOIHwgUE9MTFJETk9STSB8IFBPTExQUkkpOworICAgICAgIHJldHVybiBtYXNrOwogfQogCiAKQEAgLTkwMiw3ICs5MDYsNyBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQlpZiAoKGVyciA9IGR2Yl9yZWdpc3Rlcl9hZGFwdGVyKCZjaW5lcmd5dDItPmFkYXB0ZXIsIERSSVZFUl9OQU1FLCBUSElTX01PRFVMRSkpIDwgMCkgeworCWlmICgoZXJyID0gZHZiX3JlZ2lzdGVyX2FkYXB0ZXIoJmNpbmVyZ3l0Mi0+YWRhcHRlciwgRFJJVkVSX05BTUUsIFRISVNfTU9EVUxFLCAmY2luZXJneXQyLT51ZGV2LT5kZXYpKSA8IDApIHsKIAkJa2ZyZWUoY2luZXJneXQyKTsKIAkJcmV0dXJuIGVycjsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL01ha2VmaWxlCmluZGV4IDdhZGI1MGMuLjExMDU0NjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL01ha2VmaWxlCkBAIC0yLDggKzIsOCBAQAogIyBNYWtlZmlsZSBmb3IgdGhlIGtlcm5lbCBEVkIgZGV2aWNlIGRyaXZlcnMuCiAjCiAKLWR2Yi1jb3JlLW9ianMgPSBkdmJkZXYubyBkbXhkZXYubyBkdmJfZGVtdXgubyBkdmJfZmlsdGVyLm8gXAotCQlkdmJfY2FfZW41MDIyMS5vIGR2Yl9mcm9udGVuZC5vIFwKLQkJZHZiX25ldC5vIGR2Yl9yaW5nYnVmZmVyLm8KK2R2Yi1jb3JlLW9ianMgPSBkdmJkZXYubyBkbXhkZXYubyBkdmJfZGVtdXgubyBkdmJfZmlsdGVyLm8gCVwKKwkJZHZiX2NhX2VuNTAyMjEubyBkdmJfZnJvbnRlbmQubyAJCVwKKwkJZHZiX25ldC5vIGR2Yl9yaW5nYnVmZmVyLm8gZHZiX21hdGgubwogCiBvYmotJChDT05GSUdfRFZCX0NPUkUpICs9IGR2Yi1jb3JlLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2RteGRldi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZG14ZGV2LmMKaW5kZXggMDQ1NzhkZi4uOTg4NDk5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZG14ZGV2LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZG14ZGV2LmMKQEAgLTg3Miw5ICs4NzIsNiBAQAogCQltdXRleF91bmxvY2soJmRteGRldmZpbHRlci0+bXV0ZXgpOwogCQlicmVhazsKIAotCWNhc2UgRE1YX0dFVF9FVkVOVDoKLQkJYnJlYWs7Ci0KIAljYXNlIERNWF9HRVRfUEVTX1BJRFM6CiAJCWlmICghZG14ZGV2LT5kZW11eC0+Z2V0X3Blc19waWRzKSB7CiAJCQlyZXQgPSAtRUlOVkFMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2NhX2VuNTAyMjEuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9jYV9lbjUwMjIxLmMKaW5kZXggMDAzNDdhNy4uMmEwM2JmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2NhX2VuNTAyMjEuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfY2FfZW41MDIyMS5jCkBAIC0xMDYwLDggKzEwNjAsMTggQEAKIAkJCQlicmVhazsKIAogCQkJY2FzZSBEVkJfQ0FfU0xPVFNUQVRFX1ZBTElEQVRFOgotCQkJCWlmIChkdmJfY2FfZW41MDIyMV9wYXJzZV9hdHRyaWJ1dGVzKGNhLCBzbG90KQotCQkJCSAgICAhPSAwKSB7CisJCQkJaWYgKGR2Yl9jYV9lbjUwMjIxX3BhcnNlX2F0dHJpYnV0ZXMoY2EsIHNsb3QpICE9IDApIHsKKwkJCQkJLyogd2UgbmVlZCB0aGlzIGV4dHJhIGNoZWNrIGZvciBhbm5veWluZyBpbnRlcmZhY2VzIGxpa2UgdGhlIGJ1ZGdldC1hdiAqLworCQkJCQlpZiAoKCEoY2EtPmZsYWdzICYgRFZCX0NBX0VONTAyMjFfRkxBR19JUlFfQ0FNQ0hBTkdFKSkgJiYKKwkJCQkJICAgIChjYS0+cHViLT5wb2xsX3Nsb3Rfc3RhdHVzKSkgeworCQkJCQkJaW50IHN0YXR1cyA9IGNhLT5wdWItPnBvbGxfc2xvdF9zdGF0dXMoY2EtPnB1Yiwgc2xvdCwgMCk7CisJCQkJCQlpZiAoIShzdGF0dXMgJiBEVkJfQ0FfRU41MDIyMV9QT0xMX0NBTV9QUkVTRU5UKSkgeworCQkJCQkJCWNhLT5zbG90X2luZm9bc2xvdF0uc2xvdF9zdGF0ZSA9IERWQl9DQV9TTE9UU1RBVEVfTk9ORTsKKwkJCQkJCQlkdmJfY2FfZW41MDIyMV90aHJlYWRfdXBkYXRlX2RlbGF5KGNhKTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJfQorCiAJCQkJCXByaW50aygiZHZiX2NhIGFkYXB0ZXIgJWQ6IEludmFsaWQgUEMgY2FyZCBpbnNlcnRlZCA6KFxuIiwKIAkJCQkJICAgICAgIGNhLT5kdmJkZXYtPmFkYXB0ZXItPm51bSk7CiAJCQkJCWNhLT5zbG90X2luZm9bc2xvdF0uc2xvdF9zdGF0ZSA9IERWQl9DQV9TTE9UU1RBVEVfSU5WQUxJRDsKQEAgLTExMDgsNiArMTExOCwxNyBAQAogCiAJCQljYXNlIERWQl9DQV9TTE9UU1RBVEVfTElOS0lOSVQ6CiAJCQkJaWYgKGR2Yl9jYV9lbjUwMjIxX2xpbmtfaW5pdChjYSwgc2xvdCkgIT0gMCkgeworCQkJCQkvKiB3ZSBuZWVkIHRoaXMgZXh0cmEgY2hlY2sgZm9yIGFubm95aW5nIGludGVyZmFjZXMgbGlrZSB0aGUgYnVkZ2V0LWF2ICovCisJCQkJCWlmICgoIShjYS0+ZmxhZ3MgJiBEVkJfQ0FfRU41MDIyMV9GTEFHX0lSUV9DQU1DSEFOR0UpKSAmJgorCQkJCQkgICAgKGNhLT5wdWItPnBvbGxfc2xvdF9zdGF0dXMpKSB7CisJCQkJCQlpbnQgc3RhdHVzID0gY2EtPnB1Yi0+cG9sbF9zbG90X3N0YXR1cyhjYS0+cHViLCBzbG90LCAwKTsKKwkJCQkJCWlmICghKHN0YXR1cyAmIERWQl9DQV9FTjUwMjIxX1BPTExfQ0FNX1BSRVNFTlQpKSB7CisJCQkJCQkJY2EtPnNsb3RfaW5mb1tzbG90XS5zbG90X3N0YXRlID0gRFZCX0NBX1NMT1RTVEFURV9OT05FOworCQkJCQkJCWR2Yl9jYV9lbjUwMjIxX3RocmVhZF91cGRhdGVfZGVsYXkoY2EpOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisKIAkJCQkJcHJpbnRrKCJkdmJfY2EgYWRhcHRlciAlZDogRFZCIENBTSBsaW5rIGluaXRpYWxpc2F0aW9uIGZhaWxlZCA6KFxuIiwgY2EtPmR2YmRldi0+YWRhcHRlci0+bnVtKTsKIAkJCQkJY2EtPnNsb3RfaW5mb1tzbG90XS5zbG90X3N0YXRlID0gRFZCX0NBX1NMT1RTVEFURV9JTlZBTElEOwogCQkJCQlkdmJfY2FfZW41MDIyMV90aHJlYWRfdXBkYXRlX2RlbGF5KGNhKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9kZW11eC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2RlbXV4LmMKaW5kZXggODNlYzVlMC4uZmNmZjVlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2RlbXV4LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2RlbXV4LmMKQEAgLTQ3Myw3ICs0NzMsNyBAQAogCQkJZ290byBiYWlsb3V0OwogCQl9CiAJCW1lbWNweSgmZGVtdXgtPnRzYnVmW2ldLCBidWYsIGopOwotCQlpZiAoKGRlbXV4LT50c2J1ZlswXSA9PSAweDQ3KSB8IChkZW11eC0+dHNidWZbMF0gPT0gMHhCOCkpIHsKKwkJaWYgKChkZW11eC0+dHNidWZbMF0gPT0gMHg0NykgfHwgKGRlbXV4LT50c2J1ZlswXSA9PSAweEI4KSkgewogCQkJbWVtY3B5KHRtcHBhY2ssIGRlbXV4LT50c2J1ZiwgMTg4KTsKIAkJCWlmICh0bXBwYWNrWzBdID09IDB4QjgpCiAJCQkJdG1wcGFja1swXSA9IDB4NDc7CkBAIC00ODQsNyArNDg0LDcgQEAKIAl9CiAKIAl3aGlsZSAocCA8IGNvdW50KSB7Ci0JCWlmICgoYnVmW3BdID09IDB4NDcpIHwgKGJ1ZltwXSA9PSAweEI4KSkgeworCQlpZiAoKGJ1ZltwXSA9PSAweDQ3KSB8fCAoYnVmW3BdID09IDB4QjgpKSB7CiAJCQlpZiAoY291bnQgLSBwID49IDIwNCkgewogCQkJCW1lbWNweSh0bXBwYWNrLCAmYnVmW3BdLCAxODgpOwogCQkJCWlmICh0bXBwYWNrWzBdID09IDB4QjgpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfZnJvbnRlbmQuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9mcm9udGVuZC5jCmluZGV4IGEwNTE3OTAuLjVlOGJiNDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9mcm9udGVuZC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9mcm9udGVuZC5jCkBAIC01Niw3ICs1Niw3IEBACiBtb2R1bGVfcGFyYW0oZHZiX292ZXJyaWRlX3R1bmVfZGVsYXksIGludCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGR2Yl9vdmVycmlkZV90dW5lX2RlbGF5LCAiMDogbm9ybWFsIChkZWZhdWx0KSwgPjAgPT4gZGVsYXkgaW4gbWlsbGlzZWNvbmRzIHRvIHdhaXQgZm9yIGxvY2sgYWZ0ZXIgYSB0dW5lIGF0dGVtcHQiKTsKIG1vZHVsZV9wYXJhbShkdmJfcG93ZXJkb3duX29uX3NsZWVwLCBpbnQsIDA2NDQpOwotTU9EVUxFX1BBUk1fREVTQyhkdmJfcG93ZXJkb3duX29uX3NsZWVwLCAiMDogZG8gbm90IHBvd2VyIGRvd24sIDE6IHR1cm4gTE5CIHZvbGF0YWdlIG9mZiBvbiBzbGVlcCAoZGVmYXVsdCkiKTsKK01PRFVMRV9QQVJNX0RFU0MoZHZiX3Bvd2VyZG93bl9vbl9zbGVlcCwgIjA6IGRvIG5vdCBwb3dlciBkb3duLCAxOiB0dXJuIExOQiB2b2x0YWdlIG9mZiBvbiBzbGVlcCAoZGVmYXVsdCkiKTsKIAogI2RlZmluZSBkcHJpbnRrIGlmIChkdmJfZnJvbnRlbmRfZGVidWcpIHByaW50awogCkBAIC03Miw2ICs3Miw4IEBACiAjZGVmaW5lIEZFU1RBVEVfU0VBUkNISU5HX0ZBU1QgKEZFU1RBVEVfVFVOSU5HX0ZBU1QgfCBGRVNUQVRFX1pJR1pBR19GQVNUKQogI2RlZmluZSBGRVNUQVRFX1NFQVJDSElOR19TTE9XIChGRVNUQVRFX1RVTklOR19TTE9XIHwgRkVTVEFURV9aSUdaQUdfU0xPVykKICNkZWZpbmUgRkVTVEFURV9MT1NUTE9DSyAoRkVTVEFURV9aSUdaQUdfRkFTVCB8IEZFU1RBVEVfWklHWkFHX1NMT1cpCisKKyNkZWZpbmUgRkVfQUxHT19IVwkJMQogLyoKICAqIEZFU1RBVEVfSURMRS4gTm8gdHVuaW5nIHBhcmFtZXRlcnMgaGF2ZSBiZWVuIHN1cHBsaWVkIGFuZCB0aGUgbG9vcCBpcyBpZGxpbmcuCiAgKiBGRVNUQVRFX1JFVFVORS4gUGFyYW1ldGVycyBoYXZlIGJlZW4gc3VwcGxpZWQsIGJ1dCB3ZSBoYXZlIG5vdCB5ZXQgcGVyZm9ybWVkIHRoZSBmaXJzdCB0dW5lLgpAQCAtMTUxLDggKzE1Myw4IEBACiAJCXNpemVvZiAoc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKSk7CiAKIAlpZiAoc3RhdHVzICYgRkVfSEFTX0xPQ0spCi0JCWlmIChmZS0+b3BzLT5nZXRfZnJvbnRlbmQpCi0JCQlmZS0+b3BzLT5nZXRfZnJvbnRlbmQoZmUsICZlLT5wYXJhbWV0ZXJzKTsKKwkJaWYgKGZlLT5vcHMuZ2V0X2Zyb250ZW5kKQorCQkJZmUtPm9wcy5nZXRfZnJvbnRlbmQoZmUsICZlLT5wYXJhbWV0ZXJzKTsKIAogCWV2ZW50cy0+ZXZlbnR3ID0gd3A7CiAKQEAgLTIxMSwxMCArMjEzLDE1IEBACiB7CiAJZHByaW50ayAoIkRWQjogaW5pdGlhbGlzaW5nIGZyb250ZW5kICVpICglcykuLi5cbiIsCiAJCSBmZS0+ZHZiLT5udW0sCi0JCSBmZS0+b3BzLT5pbmZvLm5hbWUpOworCQkgZmUtPm9wcy5pbmZvLm5hbWUpOwogCi0JaWYgKGZlLT5vcHMtPmluaXQpCi0JCWZlLT5vcHMtPmluaXQoZmUpOworCWlmIChmZS0+b3BzLmluaXQpCisJCWZlLT5vcHMuaW5pdChmZSk7CisJaWYgKGZlLT5vcHMudHVuZXJfb3BzLmluaXQpIHsKKwkJZmUtPm9wcy50dW5lcl9vcHMuaW5pdChmZSk7CisJCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDApOworCX0KIH0KIAogdm9pZCBkdmJfZnJvbnRlbmRfcmVpbml0aWFsaXNlKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQpAQCAtMjU5LDcgKzI2Niw3IEBACiAJdTMyIG9yaWdpbmFsX2ZyZXF1ZW5jeSA9IGZlcHJpdi0+cGFyYW1ldGVycy5mcmVxdWVuY3k7CiAKIAkvKiBhcmUgd2UgdXNpbmcgYXV0b2ludmVyc2lvbj8gKi8KLQlhdXRvaW52ZXJzaW9uID0gKCghKGZlLT5vcHMtPmluZm8uY2FwcyAmIEZFX0NBTl9JTlZFUlNJT05fQVVUTykpICYmCisJYXV0b2ludmVyc2lvbiA9ICgoIShmZS0+b3BzLmluZm8uY2FwcyAmIEZFX0NBTl9JTlZFUlNJT05fQVVUTykpICYmCiAJCQkgKGZlcHJpdi0+cGFyYW1ldGVycy5pbnZlcnNpb24gPT0gSU5WRVJTSU9OX0FVVE8pKTsKIAogCS8qIHNldHVwIHBhcmFtZXRlcnMgY29ycmVjdGx5ICovCkBAIC0zMjksOCArMzM2LDggQEAKIAlmZXByaXYtPnBhcmFtZXRlcnMuZnJlcXVlbmN5ICs9IGZlcHJpdi0+bG5iX2RyaWZ0OwogCWlmIChhdXRvaW52ZXJzaW9uKQogCQlmZXByaXYtPnBhcmFtZXRlcnMuaW52ZXJzaW9uID0gZmVwcml2LT5pbnZlcnNpb247Ci0JaWYgKGZlLT5vcHMtPnNldF9mcm9udGVuZCkKLQkJZmUtPm9wcy0+c2V0X2Zyb250ZW5kKGZlLCAmZmVwcml2LT5wYXJhbWV0ZXJzKTsKKwlpZiAoZmUtPm9wcy5zZXRfZnJvbnRlbmQpCisJCWZlLT5vcHMuc2V0X2Zyb250ZW5kKGZlLCAmZmVwcml2LT5wYXJhbWV0ZXJzKTsKIAogCWZlcHJpdi0+cGFyYW1ldGVycy5mcmVxdWVuY3kgPSBvcmlnaW5hbF9mcmVxdWVuY3k7CiAJZmVwcml2LT5wYXJhbWV0ZXJzLmludmVyc2lvbiA9IG9yaWdpbmFsX2ludmVyc2lvbjsKQEAgLTM1NCw4ICszNjEsOCBAQAogCS8qIGluIFNDQU4gbW9kZSwgd2UganVzdCBzZXQgdGhlIGZyb250ZW5kIHdoZW4gYXNrZWQgYW5kIGxlYXZlIGl0IGFsb25lICovCiAJaWYgKGZlcHJpdi0+dHVuZV9tb2RlX2ZsYWdzICYgRkVfVFVORV9NT0RFX09ORVNIT1QpIHsKIAkJaWYgKGZlcHJpdi0+c3RhdGUgJiBGRVNUQVRFX1JFVFVORSkgewotCQkJaWYgKGZlLT5vcHMtPnNldF9mcm9udGVuZCkKLQkJCQlmZS0+b3BzLT5zZXRfZnJvbnRlbmQoZmUsICZmZXByaXYtPnBhcmFtZXRlcnMpOworCQkJaWYgKGZlLT5vcHMuc2V0X2Zyb250ZW5kKQorCQkJCWZlLT5vcHMuc2V0X2Zyb250ZW5kKGZlLCAmZmVwcml2LT5wYXJhbWV0ZXJzKTsKIAkJCWZlcHJpdi0+c3RhdGUgPSBGRVNUQVRFX1RVTkVEOwogCQl9CiAJCWZlcHJpdi0+ZGVsYXkgPSAzKkhaOwpAQCAtMzY3LDggKzM3NCw4IEBACiAJaWYgKGZlcHJpdi0+c3RhdGUgJiBGRVNUQVRFX1JFVFVORSkgewogCQlzID0gMDsKIAl9IGVsc2UgewotCQlpZiAoZmUtPm9wcy0+cmVhZF9zdGF0dXMpCi0JCQlmZS0+b3BzLT5yZWFkX3N0YXR1cyhmZSwgJnMpOworCQlpZiAoZmUtPm9wcy5yZWFkX3N0YXR1cykKKwkJCWZlLT5vcHMucmVhZF9zdGF0dXMoZmUsICZzKTsKIAkJaWYgKHMgIT0gZmVwcml2LT5zdGF0dXMpIHsKIAkJCWR2Yl9mcm9udGVuZF9hZGRfZXZlbnQoZmUsIHMpOwogCQkJZmVwcml2LT5zdGF0dXMgPSBzOwpAQCAtMzgxLDcgKzM4OCw3IEBACiAJCWZlcHJpdi0+c3RhdGUgPSBGRVNUQVRFX1RVTkVEOwogCiAJCS8qIGlmIHdlJ3JlIHR1bmVkLCB0aGVuIHdlIGhhdmUgZGV0ZXJtaW5lZCB0aGUgY29ycmVjdCBpbnZlcnNpb24gKi8KLQkJaWYgKCghKGZlLT5vcHMtPmluZm8uY2FwcyAmIEZFX0NBTl9JTlZFUlNJT05fQVVUTykpICYmCisJCWlmICgoIShmZS0+b3BzLmluZm8uY2FwcyAmIEZFX0NBTl9JTlZFUlNJT05fQVVUTykpICYmCiAJCSAgICAoZmVwcml2LT5wYXJhbWV0ZXJzLmludmVyc2lvbiA9PSBJTlZFUlNJT05fQVVUTykpIHsKIAkJCWZlcHJpdi0+cGFyYW1ldGVycy5pbnZlcnNpb24gPSBmZXByaXYtPmludmVyc2lvbjsKIAkJfQpAQCAtNDA1LDcgKzQxMiw3IEBACiAJLyogZG9uJ3QgYWN0dWFsbHkgZG8gYW55dGhpbmcgaWYgd2UncmUgaW4gdGhlIExPU1RMT0NLIHN0YXRlLAogCSAqIHRoZSBmcm9udGVuZCBpcyBzZXQgdG8gRkVfQ0FOX1JFQ09WRVIsIGFuZCB0aGUgbWF4X2RyaWZ0IGlzIDAgKi8KIAlpZiAoKGZlcHJpdi0+c3RhdGUgJiBGRVNUQVRFX0xPU1RMT0NLKSAmJgotCSAgICAoZmUtPm9wcy0+aW5mby5jYXBzICYgRkVfQ0FOX1JFQ09WRVIpICYmIChmZXByaXYtPm1heF9kcmlmdCA9PSAwKSkgeworCSAgICAoZmUtPm9wcy5pbmZvLmNhcHMgJiBGRV9DQU5fUkVDT1ZFUikgJiYgKGZlcHJpdi0+bWF4X2RyaWZ0ID09IDApKSB7CiAJCWR2Yl9mcm9udGVuZF9zd3ppZ3phZ191cGRhdGVfZGVsYXkoZmVwcml2LCBzICYgRkVfSEFTX0xPQ0spOwogCQlyZXR1cm47CiAJfQpAQCAtNTQwLDM5ICs1NDcsNDUgQEAKIAkJaWYgKGZlcHJpdi0+cmVpbml0aWFsaXNlKSB7CiAJCQlkdmJfZnJvbnRlbmRfaW5pdChmZSk7CiAJCQlpZiAoZmVwcml2LT50b25lICE9IC0xKSB7Ci0JCQkJZmUtPm9wcy0+c2V0X3RvbmUoZmUsIGZlcHJpdi0+dG9uZSk7CisJCQkJZmUtPm9wcy5zZXRfdG9uZShmZSwgZmVwcml2LT50b25lKTsKIAkJCX0KIAkJCWlmIChmZXByaXYtPnZvbHRhZ2UgIT0gLTEpIHsKLQkJCQlmZS0+b3BzLT5zZXRfdm9sdGFnZShmZSwgZmVwcml2LT52b2x0YWdlKTsKKwkJCQlmZS0+b3BzLnNldF92b2x0YWdlKGZlLCBmZXByaXYtPnZvbHRhZ2UpOwogCQkJfQogCQkJZmVwcml2LT5yZWluaXRpYWxpc2UgPSAwOwogCQl9CiAKIAkJLyogZG8gYW4gaXRlcmF0aW9uIG9mIHRoZSB0dW5pbmcgbG9vcCAqLwotCQlpZiAoZmUtPm9wcy0+dHVuZSkgewotCQkJLyogaGF2ZSB3ZSBiZWVuIGFza2VkIHRvIHJldHVuZT8gKi8KLQkJCXBhcmFtcyA9IE5VTEw7Ci0JCQlpZiAoZmVwcml2LT5zdGF0ZSAmIEZFU1RBVEVfUkVUVU5FKSB7Ci0JCQkJcGFyYW1zID0gJmZlcHJpdi0+cGFyYW1ldGVyczsKLQkJCQlmZXByaXYtPnN0YXRlID0gRkVTVEFURV9UVU5FRDsKLQkJCX0KKwkJaWYgKGZlLT5vcHMuZ2V0X2Zyb250ZW5kX2FsZ28pIHsKKwkJCWlmIChmZS0+b3BzLmdldF9mcm9udGVuZF9hbGdvKGZlKSA9PSBGRV9BTEdPX0hXKSB7CisJCQkJLyogaGF2ZSB3ZSBiZWVuIGFza2VkIHRvIHJldHVuZT8gKi8KKwkJCQlwYXJhbXMgPSBOVUxMOworCQkJCWlmIChmZXByaXYtPnN0YXRlICYgRkVTVEFURV9SRVRVTkUpIHsKKwkJCQkJcGFyYW1zID0gJmZlcHJpdi0+cGFyYW1ldGVyczsKKwkJCQkJZmVwcml2LT5zdGF0ZSA9IEZFU1RBVEVfVFVORUQ7CisJCQkJfQogCi0JCQlmZS0+b3BzLT50dW5lKGZlLCBwYXJhbXMsIGZlcHJpdi0+dHVuZV9tb2RlX2ZsYWdzLCAmZmVwcml2LT5kZWxheSwgJnMpOwotCQkJaWYgKHMgIT0gZmVwcml2LT5zdGF0dXMpIHsKLQkJCQlkdmJfZnJvbnRlbmRfYWRkX2V2ZW50KGZlLCBzKTsKLQkJCQlmZXByaXYtPnN0YXR1cyA9IHM7CisJCQkJZmUtPm9wcy50dW5lKGZlLCBwYXJhbXMsIGZlcHJpdi0+dHVuZV9tb2RlX2ZsYWdzLCAmZmVwcml2LT5kZWxheSwgJnMpOworCQkJCWlmIChzICE9IGZlcHJpdi0+c3RhdHVzKSB7CisJCQkJCWR2Yl9mcm9udGVuZF9hZGRfZXZlbnQoZmUsIHMpOworCQkJCQlmZXByaXYtPnN0YXR1cyA9IHM7CisJCQkJfQogCQkJfQotCQl9IGVsc2UgeworCQl9IGVsc2UKIAkJCWR2Yl9mcm9udGVuZF9zd3ppZ3phZyhmZSk7Ci0JCX0KIAl9CiAKIAlpZiAoZHZiX3NodXRkb3duX3RpbWVvdXQpIHsKIAkJaWYgKGR2Yl9wb3dlcmRvd25fb25fc2xlZXApCi0JCQlpZiAoZmUtPm9wcy0+c2V0X3ZvbHRhZ2UpCi0JCQkJZmUtPm9wcy0+c2V0X3ZvbHRhZ2UoZmUsIFNFQ19WT0xUQUdFX09GRik7Ci0JCWlmIChmZS0+b3BzLT5zbGVlcCkKLQkJCWZlLT5vcHMtPnNsZWVwKGZlKTsKKwkJCWlmIChmZS0+b3BzLnNldF92b2x0YWdlKQorCQkJCWZlLT5vcHMuc2V0X3ZvbHRhZ2UoZmUsIFNFQ19WT0xUQUdFX09GRik7CisJCWlmIChmZS0+b3BzLnR1bmVyX29wcy5zbGVlcCkgeworCQkJZmUtPm9wcy50dW5lcl9vcHMuc2xlZXAoZmUpOworCQkJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDApOworCQl9CisJCWlmIChmZS0+b3BzLnNsZWVwKQorCQkJZmUtPm9wcy5zbGVlcChmZSk7CiAJfQogCiAJZmVwcml2LT50aHJlYWRfcGlkID0gMDsKQEAgLTcyNCw3ICs3MzcsNyBAQAogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBGRV9HRVRfSU5GTzogewogCQlzdHJ1Y3QgZHZiX2Zyb250ZW5kX2luZm8qIGluZm8gPSBwYXJnOwotCQltZW1jcHkoaW5mbywgJmZlLT5vcHMtPmluZm8sIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX2luZm8pKTsKKwkJbWVtY3B5KGluZm8sICZmZS0+b3BzLmluZm8sIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX2luZm8pKTsKIAogCQkvKiBGb3JjZSB0aGUgQ0FOX0lOVkVSU0lPTl9BVVRPIGJpdCBvbi4gSWYgdGhlIGZyb250ZW5kIGRvZXNuJ3QKIAkJICogZG8gaXQsIGl0IGlzIGRvbmUgZm9yIGl0LiAqLwpAQCAtNzQ0LDU4ICs3NTcsNTggQEAKIAkJCWJyZWFrOwogCQl9CiAKLQkJaWYgKGZlLT5vcHMtPnJlYWRfc3RhdHVzKQotCQkJZXJyID0gZmUtPm9wcy0+cmVhZF9zdGF0dXMoZmUsIHN0YXR1cyk7CisJCWlmIChmZS0+b3BzLnJlYWRfc3RhdHVzKQorCQkJZXJyID0gZmUtPm9wcy5yZWFkX3N0YXR1cyhmZSwgc3RhdHVzKTsKIAkJYnJlYWs7CiAJfQogCWNhc2UgRkVfUkVBRF9CRVI6Ci0JCWlmIChmZS0+b3BzLT5yZWFkX2JlcikKLQkJCWVyciA9IGZlLT5vcHMtPnJlYWRfYmVyKGZlLCAoX191MzIqKSBwYXJnKTsKKwkJaWYgKGZlLT5vcHMucmVhZF9iZXIpCisJCQllcnIgPSBmZS0+b3BzLnJlYWRfYmVyKGZlLCAoX191MzIqKSBwYXJnKTsKIAkJYnJlYWs7CiAKIAljYXNlIEZFX1JFQURfU0lHTkFMX1NUUkVOR1RIOgotCQlpZiAoZmUtPm9wcy0+cmVhZF9zaWduYWxfc3RyZW5ndGgpCi0JCQllcnIgPSBmZS0+b3BzLT5yZWFkX3NpZ25hbF9zdHJlbmd0aChmZSwgKF9fdTE2KikgcGFyZyk7CisJCWlmIChmZS0+b3BzLnJlYWRfc2lnbmFsX3N0cmVuZ3RoKQorCQkJZXJyID0gZmUtPm9wcy5yZWFkX3NpZ25hbF9zdHJlbmd0aChmZSwgKF9fdTE2KikgcGFyZyk7CiAJCWJyZWFrOwogCiAJY2FzZSBGRV9SRUFEX1NOUjoKLQkJaWYgKGZlLT5vcHMtPnJlYWRfc25yKQotCQkJZXJyID0gZmUtPm9wcy0+cmVhZF9zbnIoZmUsIChfX3UxNiopIHBhcmcpOworCQlpZiAoZmUtPm9wcy5yZWFkX3NucikKKwkJCWVyciA9IGZlLT5vcHMucmVhZF9zbnIoZmUsIChfX3UxNiopIHBhcmcpOwogCQlicmVhazsKIAogCWNhc2UgRkVfUkVBRF9VTkNPUlJFQ1RFRF9CTE9DS1M6Ci0JCWlmIChmZS0+b3BzLT5yZWFkX3VjYmxvY2tzKQotCQkJZXJyID0gZmUtPm9wcy0+cmVhZF91Y2Jsb2NrcyhmZSwgKF9fdTMyKikgcGFyZyk7CisJCWlmIChmZS0+b3BzLnJlYWRfdWNibG9ja3MpCisJCQllcnIgPSBmZS0+b3BzLnJlYWRfdWNibG9ja3MoZmUsIChfX3UzMiopIHBhcmcpOwogCQlicmVhazsKIAogCiAJY2FzZSBGRV9ESVNFUUNfUkVTRVRfT1ZFUkxPQUQ6Ci0JCWlmIChmZS0+b3BzLT5kaXNlcWNfcmVzZXRfb3ZlcmxvYWQpIHsKLQkJCWVyciA9IGZlLT5vcHMtPmRpc2VxY19yZXNldF9vdmVybG9hZChmZSk7CisJCWlmIChmZS0+b3BzLmRpc2VxY19yZXNldF9vdmVybG9hZCkgeworCQkJZXJyID0gZmUtPm9wcy5kaXNlcWNfcmVzZXRfb3ZlcmxvYWQoZmUpOwogCQkJZmVwcml2LT5zdGF0ZSA9IEZFU1RBVEVfRElTRVFDOwogCQkJZmVwcml2LT5zdGF0dXMgPSAwOwogCQl9CiAJCWJyZWFrOwogCiAJY2FzZSBGRV9ESVNFUUNfU0VORF9NQVNURVJfQ01EOgotCQlpZiAoZmUtPm9wcy0+ZGlzZXFjX3NlbmRfbWFzdGVyX2NtZCkgewotCQkJZXJyID0gZmUtPm9wcy0+ZGlzZXFjX3NlbmRfbWFzdGVyX2NtZChmZSwgKHN0cnVjdCBkdmJfZGlzZXFjX21hc3Rlcl9jbWQqKSBwYXJnKTsKKwkJaWYgKGZlLT5vcHMuZGlzZXFjX3NlbmRfbWFzdGVyX2NtZCkgeworCQkJZXJyID0gZmUtPm9wcy5kaXNlcWNfc2VuZF9tYXN0ZXJfY21kKGZlLCAoc3RydWN0IGR2Yl9kaXNlcWNfbWFzdGVyX2NtZCopIHBhcmcpOwogCQkJZmVwcml2LT5zdGF0ZSA9IEZFU1RBVEVfRElTRVFDOwogCQkJZmVwcml2LT5zdGF0dXMgPSAwOwogCQl9CiAJCWJyZWFrOwogCiAJY2FzZSBGRV9ESVNFUUNfU0VORF9CVVJTVDoKLQkJaWYgKGZlLT5vcHMtPmRpc2VxY19zZW5kX2J1cnN0KSB7Ci0JCQllcnIgPSBmZS0+b3BzLT5kaXNlcWNfc2VuZF9idXJzdChmZSwgKGZlX3NlY19taW5pX2NtZF90KSBwYXJnKTsKKwkJaWYgKGZlLT5vcHMuZGlzZXFjX3NlbmRfYnVyc3QpIHsKKwkJCWVyciA9IGZlLT5vcHMuZGlzZXFjX3NlbmRfYnVyc3QoZmUsIChmZV9zZWNfbWluaV9jbWRfdCkgcGFyZyk7CiAJCQlmZXByaXYtPnN0YXRlID0gRkVTVEFURV9ESVNFUUM7CiAJCQlmZXByaXYtPnN0YXR1cyA9IDA7CiAJCX0KIAkJYnJlYWs7CiAKIAljYXNlIEZFX1NFVF9UT05FOgotCQlpZiAoZmUtPm9wcy0+c2V0X3RvbmUpIHsKLQkJCWVyciA9IGZlLT5vcHMtPnNldF90b25lKGZlLCAoZmVfc2VjX3RvbmVfbW9kZV90KSBwYXJnKTsKKwkJaWYgKGZlLT5vcHMuc2V0X3RvbmUpIHsKKwkJCWVyciA9IGZlLT5vcHMuc2V0X3RvbmUoZmUsIChmZV9zZWNfdG9uZV9tb2RlX3QpIHBhcmcpOwogCQkJZmVwcml2LT50b25lID0gKGZlX3NlY190b25lX21vZGVfdCkgcGFyZzsKIAkJCWZlcHJpdi0+c3RhdGUgPSBGRVNUQVRFX0RJU0VRQzsKIAkJCWZlcHJpdi0+c3RhdHVzID0gMDsKQEAgLTgwMyw4ICs4MTYsOCBAQAogCQlicmVhazsKIAogCWNhc2UgRkVfU0VUX1ZPTFRBR0U6Ci0JCWlmIChmZS0+b3BzLT5zZXRfdm9sdGFnZSkgewotCQkJZXJyID0gZmUtPm9wcy0+c2V0X3ZvbHRhZ2UoZmUsIChmZV9zZWNfdm9sdGFnZV90KSBwYXJnKTsKKwkJaWYgKGZlLT5vcHMuc2V0X3ZvbHRhZ2UpIHsKKwkJCWVyciA9IGZlLT5vcHMuc2V0X3ZvbHRhZ2UoZmUsIChmZV9zZWNfdm9sdGFnZV90KSBwYXJnKTsKIAkJCWZlcHJpdi0+dm9sdGFnZSA9IChmZV9zZWNfdm9sdGFnZV90KSBwYXJnOwogCQkJZmVwcml2LT5zdGF0ZSA9IEZFU1RBVEVfRElTRVFDOwogCQkJZmVwcml2LT5zdGF0dXMgPSAwOwpAQCAtODEyLDExICs4MjUsMTEgQEAKIAkJYnJlYWs7CiAKIAljYXNlIEZFX0RJU0hORVRXT1JLX1NFTkRfTEVHQUNZX0NNRDoKLQkJaWYgKGZlLT5vcHMtPmRpc2huZXR3b3JrX3NlbmRfbGVnYWN5X2NvbW1hbmQpIHsKLQkJCWVyciA9IGZlLT5vcHMtPmRpc2huZXR3b3JrX3NlbmRfbGVnYWN5X2NvbW1hbmQoZmUsICh1bnNpZ25lZCBsb25nKSBwYXJnKTsKKwkJaWYgKGZlLT5vcHMuZGlzaG5ldHdvcmtfc2VuZF9sZWdhY3lfY29tbWFuZCkgeworCQkJZXJyID0gZmUtPm9wcy5kaXNobmV0d29ya19zZW5kX2xlZ2FjeV9jb21tYW5kKGZlLCAodW5zaWduZWQgbG9uZykgcGFyZyk7CiAJCQlmZXByaXYtPnN0YXRlID0gRkVTVEFURV9ESVNFUUM7CiAJCQlmZXByaXYtPnN0YXR1cyA9IDA7Ci0JCX0gZWxzZSBpZiAoZmUtPm9wcy0+c2V0X3ZvbHRhZ2UpIHsKKwkJfSBlbHNlIGlmIChmZS0+b3BzLnNldF92b2x0YWdlKSB7CiAJCQkvKgogCQkJICogTk9URTogVGhpcyBpcyBhIGZhbGxiYWNrIGNvbmRpdGlvbi4gIFNvbWUgZnJvbnRlbmRzCiAJCQkgKiAoc3R2MDI5OSBmb3IgaW5zdGFuY2UpIHRha2UgbG9uZ2VyIHRoYW4gOG1zZWMgdG8KQEAgLTg0Niw3ICs4NTksNyBAQAogCQkJLyogYmVmb3JlIHNlbmRpbmcgYSBjb21tYW5kLCBpbml0aWFsaXplIGJ5IHNlbmRpbmcKIAkJCSAqIGEgMzJtcyAxOFYgdG8gdGhlIHN3aXRjaAogCQkJICovCi0JCQlmZS0+b3BzLT5zZXRfdm9sdGFnZShmZSwgU0VDX1ZPTFRBR0VfMTgpOworCQkJZmUtPm9wcy5zZXRfdm9sdGFnZShmZSwgU0VDX1ZPTFRBR0VfMTgpOwogCQkJZHZiX2Zyb250ZW5kX3NsZWVwX3VudGlsKCZuZXh0dGltZSwgMzIwMDApOwogCiAJCQlmb3IgKGkgPSAwOyBpIDwgOTsgaSsrKSB7CkBAIC04NTQsNyArODY3LDcgQEAKIAkJCQkJZG9fZ2V0dGltZW9mZGF5KCZ0dltpICsgMV0pOwogCQkJCWlmICgoY21kICYgMHgwMSkgIT0gbGFzdCkgewogCQkJCQkvKiBzZXQgdm9sdGFnZSB0byAobGFzdCA/IDEzViA6IDE4VikgKi8KLQkJCQkJZmUtPm9wcy0+c2V0X3ZvbHRhZ2UoZmUsIChsYXN0KSA/IFNFQ19WT0xUQUdFXzEzIDogU0VDX1ZPTFRBR0VfMTgpOworCQkJCQlmZS0+b3BzLnNldF92b2x0YWdlKGZlLCAobGFzdCkgPyBTRUNfVk9MVEFHRV8xMyA6IFNFQ19WT0xUQUdFXzE4KTsKIAkJCQkJbGFzdCA9IChsYXN0KSA/IDAgOiAxOwogCQkJCX0KIAkJCQljbWQgPSBjbWQgPj4gMTsKQEAgLTg3NCwxMyArODg3LDEzIEBACiAJCWJyZWFrOwogCiAJY2FzZSBGRV9ESVNFUUNfUkVDVl9TTEFWRV9SRVBMWToKLQkJaWYgKGZlLT5vcHMtPmRpc2VxY19yZWN2X3NsYXZlX3JlcGx5KQotCQkJZXJyID0gZmUtPm9wcy0+ZGlzZXFjX3JlY3Zfc2xhdmVfcmVwbHkoZmUsIChzdHJ1Y3QgZHZiX2Rpc2VxY19zbGF2ZV9yZXBseSopIHBhcmcpOworCQlpZiAoZmUtPm9wcy5kaXNlcWNfcmVjdl9zbGF2ZV9yZXBseSkKKwkJCWVyciA9IGZlLT5vcHMuZGlzZXFjX3JlY3Zfc2xhdmVfcmVwbHkoZmUsIChzdHJ1Y3QgZHZiX2Rpc2VxY19zbGF2ZV9yZXBseSopIHBhcmcpOwogCQlicmVhazsKIAogCWNhc2UgRkVfRU5BQkxFX0hJR0hfTE5CX1ZPTFRBR0U6Ci0JCWlmIChmZS0+b3BzLT5lbmFibGVfaGlnaF9sbmJfdm9sdGFnZSkKLQkJCWVyciA9IGZlLT5vcHMtPmVuYWJsZV9oaWdoX2xuYl92b2x0YWdlKGZlLCAobG9uZykgcGFyZyk7CisJCWlmIChmZS0+b3BzLmVuYWJsZV9oaWdoX2xuYl92b2x0YWdlKQorCQkJZXJyID0gZmUtPm9wcy5lbmFibGVfaGlnaF9sbmJfdm9sdGFnZShmZSwgKGxvbmcpIHBhcmcpOwogCQlicmVhazsKIAogCWNhc2UgRkVfU0VUX0ZST05URU5EOiB7CkBAIC04OTgsNyArOTExLDcgQEAKIAkJCWZlcHJpdi0+cGFyYW1ldGVycy5pbnZlcnNpb24gPSBJTlZFUlNJT05fQVVUTzsKIAkJCWZldHVuZXNldHRpbmdzLnBhcmFtZXRlcnMuaW52ZXJzaW9uID0gSU5WRVJTSU9OX0FVVE87CiAJCX0KLQkJaWYgKGZlLT5vcHMtPmluZm8udHlwZSA9PSBGRV9PRkRNKSB7CisJCWlmIChmZS0+b3BzLmluZm8udHlwZSA9PSBGRV9PRkRNKSB7CiAJCQkvKiB3aXRob3V0IGhpZXJhY2hpY2FsIGNvZGluZyBjb2RlX3JhdGVfTFAgaXMgaXJyZWxldmFudCwKIAkJCSAqIHNvIHdlIHRvbGVyYXRlIHRoZSBvdGhlcndpc2UgaW52YWxpZCBGRUNfTk9ORSBzZXR0aW5nICovCiAJCQlpZiAoZmVwcml2LT5wYXJhbWV0ZXJzLnUub2ZkbS5oaWVyYXJjaHlfaW5mb3JtYXRpb24gPT0gSElFUkFSQ0hZX05PTkUgJiYKQEAgLTkwNywxMyArOTIwLDEzIEBACiAJCX0KIAogCQkvKiBnZXQgZnJvbnRlbmQtc3BlY2lmaWMgdHVuaW5nIHNldHRpbmdzICovCi0JCWlmIChmZS0+b3BzLT5nZXRfdHVuZV9zZXR0aW5ncyAmJiAoZmUtPm9wcy0+Z2V0X3R1bmVfc2V0dGluZ3MoZmUsICZmZXR1bmVzZXR0aW5ncykgPT0gMCkpIHsKKwkJaWYgKGZlLT5vcHMuZ2V0X3R1bmVfc2V0dGluZ3MgJiYgKGZlLT5vcHMuZ2V0X3R1bmVfc2V0dGluZ3MoZmUsICZmZXR1bmVzZXR0aW5ncykgPT0gMCkpIHsKIAkJCWZlcHJpdi0+bWluX2RlbGF5ID0gKGZldHVuZXNldHRpbmdzLm1pbl9kZWxheV9tcyAqIEhaKSAvIDEwMDA7CiAJCQlmZXByaXYtPm1heF9kcmlmdCA9IGZldHVuZXNldHRpbmdzLm1heF9kcmlmdDsKIAkJCWZlcHJpdi0+c3RlcF9zaXplID0gZmV0dW5lc2V0dGluZ3Muc3RlcF9zaXplOwogCQl9IGVsc2UgewogCQkJLyogZGVmYXVsdCB2YWx1ZXMgKi8KLQkJCXN3aXRjaChmZS0+b3BzLT5pbmZvLnR5cGUpIHsKKwkJCXN3aXRjaChmZS0+b3BzLmluZm8udHlwZSkgewogCQkJY2FzZSBGRV9RUFNLOgogCQkJCWZlcHJpdi0+bWluX2RlbGF5ID0gSFovMjA7CiAJCQkJZmVwcml2LT5zdGVwX3NpemUgPSBmZXByaXYtPnBhcmFtZXRlcnMudS5xcHNrLnN5bWJvbF9yYXRlIC8gMTYwMDA7CkBAIC05MjgsMTEgKzk0MSwxMyBAQAogCiAJCQljYXNlIEZFX09GRE06CiAJCQkJZmVwcml2LT5taW5fZGVsYXkgPSBIWi8yMDsKLQkJCQlmZXByaXYtPnN0ZXBfc2l6ZSA9IGZlLT5vcHMtPmluZm8uZnJlcXVlbmN5X3N0ZXBzaXplICogMjsKLQkJCQlmZXByaXYtPm1heF9kcmlmdCA9IChmZS0+b3BzLT5pbmZvLmZyZXF1ZW5jeV9zdGVwc2l6ZSAqIDIpICsgMTsKKwkJCQlmZXByaXYtPnN0ZXBfc2l6ZSA9IGZlLT5vcHMuaW5mby5mcmVxdWVuY3lfc3RlcHNpemUgKiAyOworCQkJCWZlcHJpdi0+bWF4X2RyaWZ0ID0gKGZlLT5vcHMuaW5mby5mcmVxdWVuY3lfc3RlcHNpemUgKiAyKSArIDE7CiAJCQkJYnJlYWs7CiAJCQljYXNlIEZFX0FUU0M6Ci0JCQkJcHJpbnRrKCJkdmItY29yZTogRkVfQVRTQyBub3QgaGFuZGxlZCB5ZXQuXG4iKTsKKwkJCQlmZXByaXYtPm1pbl9kZWxheSA9IEhaLzIwOworCQkJCWZlcHJpdi0+c3RlcF9zaXplID0gMDsKKwkJCQlmZXByaXYtPm1heF9kcmlmdCA9IDA7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0KQEAgLTk1Miw5ICs5NjcsOSBAQAogCQlicmVhazsKIAogCWNhc2UgRkVfR0VUX0ZST05URU5EOgotCQlpZiAoZmUtPm9wcy0+Z2V0X2Zyb250ZW5kKSB7CisJCWlmIChmZS0+b3BzLmdldF9mcm9udGVuZCkgewogCQkJbWVtY3B5IChwYXJnLCAmZmVwcml2LT5wYXJhbWV0ZXJzLCBzaXplb2YgKHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycykpOwotCQkJZXJyID0gZmUtPm9wcy0+Z2V0X2Zyb250ZW5kKGZlLCAoc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKikgcGFyZyk7CisJCQllcnIgPSBmZS0+b3BzLmdldF9mcm9udGVuZChmZSwgKHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyopIHBhcmcpOwogCQl9CiAJCWJyZWFrOwogCkBAIC0xMDY3LDcgKzEwODIsNyBAQAogCiAJcHJpbnRrICgiRFZCOiByZWdpc3RlcmluZyBmcm9udGVuZCAlaSAoJXMpLi4uXG4iLAogCQlmZS0+ZHZiLT5udW0sCi0JCWZlLT5vcHMtPmluZm8ubmFtZSk7CisJCWZlLT5vcHMuaW5mby5uYW1lKTsKIAogCWR2Yl9yZWdpc3Rlcl9kZXZpY2UgKGZlLT5kdmIsICZmZXByaXYtPmR2YmRldiwgJmR2YmRldl90ZW1wbGF0ZSwKIAkJCSAgICAgZmUsIERWQl9ERVZJQ0VfRlJPTlRFTkQpOwpAQCAtMTA4NSwxMCArMTEwMCwxNSBAQAogCW11dGV4X2xvY2soJmZyb250ZW5kX211dGV4KTsKIAlkdmJfdW5yZWdpc3Rlcl9kZXZpY2UgKGZlcHJpdi0+ZHZiZGV2KTsKIAlkdmJfZnJvbnRlbmRfc3RvcCAoZmUpOwotCWlmIChmZS0+b3BzLT5yZWxlYXNlKQotCQlmZS0+b3BzLT5yZWxlYXNlKGZlKTsKKwlpZiAoZmUtPm9wcy50dW5lcl9vcHMucmVsZWFzZSkgeworCQlmZS0+b3BzLnR1bmVyX29wcy5yZWxlYXNlKGZlKTsKKwkJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMCk7CisJfQorCWlmIChmZS0+b3BzLnJlbGVhc2UpCisJCWZlLT5vcHMucmVsZWFzZShmZSk7CiAJZWxzZQotCQlwcmludGsoImR2Yl9mcm9udGVuZDogRGVtb2R1bGF0b3IgKCVzKSBkb2VzIG5vdCBoYXZlIGEgcmVsZWFzZSBjYWxsYmFjayFcbiIsIGZlLT5vcHMtPmluZm8ubmFtZSk7CisJCXByaW50aygiZHZiX2Zyb250ZW5kOiBEZW1vZHVsYXRvciAoJXMpIGRvZXMgbm90IGhhdmUgYSByZWxlYXNlIGNhbGxiYWNrIVxuIiwgZmUtPm9wcy5pbmZvLm5hbWUpOwogCS8qIGZlIGlzIGludmFsaWQgbm93ICovCiAJa2ZyZWUoZmVwcml2KTsKIAltdXRleF91bmxvY2soJmZyb250ZW5kX211dGV4KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9mcm9udGVuZC5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2Zyb250ZW5kLmgKaW5kZXggNTkyNmEzYi4uMjg4N2UyYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2Zyb250ZW5kLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2Zyb250ZW5kLmgKQEAgLTQ5LDYgKzQ5LDQ0IEBACiAKIHN0cnVjdCBkdmJfZnJvbnRlbmQ7CiAKK3N0cnVjdCBkdmJfdHVuZXJfaW5mbyB7CisJY2hhciBuYW1lWzEyOF07CisKKwl1MzIgZnJlcXVlbmN5X21pbjsKKwl1MzIgZnJlcXVlbmN5X21heDsKKwl1MzIgZnJlcXVlbmN5X3N0ZXA7CisKKwl1MzIgYmFuZHdpZHRoX21pbjsKKwl1MzIgYmFuZHdpZHRoX21heDsKKwl1MzIgYmFuZHdpZHRoX3N0ZXA7Cit9OworCitzdHJ1Y3QgZHZiX3R1bmVyX29wcyB7CisKKwlzdHJ1Y3QgZHZiX3R1bmVyX2luZm8gaW5mbzsKKworCWludCAoKnJlbGVhc2UpKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKTsKKwlpbnQgKCppbml0KShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSk7CisJaW50ICgqc2xlZXApKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKTsKKworCS8qKiBUaGlzIGlzIGZvciBzaW1wbGUgUExMcyAtIHNldCBhbGwgcGFyYW1ldGVycyBpbiBvbmUgZ28uICovCisJaW50ICgqc2V0X3BhcmFtcykoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcCk7CisKKwkvKiogVGhpcyBpcyBzdXBwb3J0IGZvciBkZW1vZHMgbGlrZSB0aGUgbXQzNTIgLSBmaWxscyBvdXQgdGhlIHN1cHBsaWVkIGJ1ZmZlciB3aXRoIHdoYXQgdG8gd3JpdGUuICovCisJaW50ICgqY2FsY19yZWdzKShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwLCB1OCAqYnVmLCBpbnQgYnVmX2xlbik7CisKKwlpbnQgKCpnZXRfZnJlcXVlbmN5KShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTMyICpmcmVxdWVuY3kpOworCWludCAoKmdldF9iYW5kd2lkdGgpKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCB1MzIgKmJhbmR3aWR0aCk7CisKKyNkZWZpbmUgVFVORVJfU1RBVFVTX0xPQ0tFRCAxCisJaW50ICgqZ2V0X3N0YXR1cykoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHUzMiAqc3RhdHVzKTsKKworCS8qKiBUaGVzZSBhcmUgcHJvdmlkZWQgc2VwZXJhdGVseSBmcm9tIHNldF9wYXJhbXMgaW4gb3JkZXIgdG8gZmFjaWxpdGF0ZSBzaWxpY29uCisJICogdHVuZXJzIHdoaWNoIHJlcXVpcmUgc29waGlzdGljYXRlZCB0dW5pbmcgbG9vcHMsIGNvbnRyb2xsaW5nIGVhY2ggcGFyYW1ldGVyIHNlcGVyYXRlbHkuICovCisJaW50ICgqc2V0X2ZyZXF1ZW5jeSkoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHUzMiBmcmVxdWVuY3kpOworCWludCAoKnNldF9iYW5kd2lkdGgpKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCB1MzIgYmFuZHdpZHRoKTsKK307CisKIHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzIHsKIAogCXN0cnVjdCBkdmJfZnJvbnRlbmRfaW5mbyBpbmZvOwpAQCAtNjQsNiArMTAyLDggQEAKIAkJICAgIHVuc2lnbmVkIGludCBtb2RlX2ZsYWdzLAogCQkgICAgaW50ICpkZWxheSwKIAkJICAgIGZlX3N0YXR1c190ICpzdGF0dXMpOworCS8qIGdldCBmcm9udGVuZCB0dW5pbmcgYWxnb3JpdGhtIGZyb20gdGhlIG1vZHVsZSAqLworCWludCAoKmdldF9mcm9udGVuZF9hbGdvKShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSk7CiAKIAkvKiB0aGVzZSB0d28gYXJlIG9ubHkgdXNlZCBmb3IgdGhlIHN3emlnemFnIGNvZGUgKi8KIAlpbnQgKCpzZXRfZnJvbnRlbmQpKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcyk7CkBAIC04Niw2ICsxMjYsOCBAQAogCWludCAoKmVuYWJsZV9oaWdoX2xuYl92b2x0YWdlKShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgbG9uZyBhcmcpOwogCWludCAoKmRpc2huZXR3b3JrX3NlbmRfbGVnYWN5X2NvbW1hbmQpKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCB1bnNpZ25lZCBsb25nIGNtZCk7CiAJaW50ICgqaTJjX2dhdGVfY3RybCkoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGludCBlbmFibGUpOworCisJc3RydWN0IGR2Yl90dW5lcl9vcHMgdHVuZXJfb3BzOwogfTsKIAogI2RlZmluZSBNQVhfRVZFTlQgOApAQCAtMTAwLDkgKzE0MiwxMCBAQAogfTsKIAogc3RydWN0IGR2Yl9mcm9udGVuZCB7Ci0Jc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMqIG9wczsKKwlzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyBvcHM7CiAJc3RydWN0IGR2Yl9hZGFwdGVyICpkdmI7CiAJdm9pZCogZGVtb2R1bGF0b3JfcHJpdjsKKwl2b2lkKiB0dW5lcl9wcml2OwogCXZvaWQqIGZyb250ZW5kX3ByaXY7CiAJdm9pZCogbWlzY19wcml2OwogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9tYXRoLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfbWF0aC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlYjdjOTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfbWF0aC5jCkBAIC0wLDAgKzEsMTQ1IEBACisvKgorICogZHZiLW1hdGggcHJvdmlkZXMgc29tZSBjb21wbGV4IGZpeGVkLXBvaW50IG1hdGgKKyAqIG9wZXJhdGlvbnMgc2hhcmVkIGJldHdlZW4gdGhlIGR2YiByZWxhdGVkIHN0dWZmCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2IENocmlzdG9waCBQZmlzdGVyIChjaHJpc3RvcGhwZmlzdGVyQGdtYWlsLmNvbSkKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8YXNtL2J1Zy5oPgorI2luY2x1ZGUgImR2Yl9tYXRoLmgiCisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBsb2d0YWJsZVsyNTZdID0geworCTB4MDAwMCwgMHgwMTcxLCAweDAyZTAsIDB4MDQ0ZSwgMHgwNWJhLCAweDA3MjUsIDB4MDg4ZSwgMHgwOWY3LAorCTB4MGI1ZCwgMHgwY2MzLCAweDBlMjcsIDB4MGY4YSwgMHgxMGViLCAweDEyNGIsIDB4MTNhYSwgMHgxNTA4LAorCTB4MTY2NCwgMHgxN2JmLCAweDE5MTksIDB4MWE3MSwgMHgxYmM4LCAweDFkMWUsIDB4MWU3MywgMHgxZmM2LAorCTB4MjExOSwgMHgyMjZhLCAweDIzYmEsIDB4MjUwOCwgMHgyNjU2LCAweDI3YTIsIDB4MjhlZCwgMHgyYTM3LAorCTB4MmI4MCwgMHgyY2M4LCAweDJlMGYsIDB4MmY1NCwgMHgzMDk4LCAweDMxZGMsIDB4MzMxZSwgMHgzNDVmLAorCTB4MzU5ZiwgMHgzNmRlLCAweDM4MWIsIDB4Mzk1OCwgMHgzYTk0LCAweDNiY2UsIDB4M2QwOCwgMHgzZTQxLAorCTB4M2Y3OCwgMHg0MGFmLCAweDQxZTQsIDB4NDMxOSwgMHg0NDRjLCAweDQ1N2YsIDB4NDZiMCwgMHg0N2UxLAorCTB4NDkxMCwgMHg0YTNmLCAweDRiNmMsIDB4NGM5OSwgMHg0ZGM1LCAweDRlZWYsIDB4NTAxOSwgMHg1MTQyLAorCTB4NTI2YSwgMHg1MzkxLCAweDU0YjcsIDB4NTVkYywgMHg1NzAwLCAweDU4MjQsIDB4NTk0NiwgMHg1YTY4LAorCTB4NWI4OSwgMHg1Y2E4LCAweDVkYzcsIDB4NWVlNSwgMHg2MDAzLCAweDYxMWYsIDB4NjIzYSwgMHg2MzU1LAorCTB4NjQ2ZiwgMHg2NTg4LCAweDY2YTAsIDB4NjdiNywgMHg2OGNlLCAweDY5ZTQsIDB4NmFmOCwgMHg2YzBjLAorCTB4NmQyMCwgMHg2ZTMyLCAweDZmNDQsIDB4NzA1NSwgMHg3MTY1LCAweDcyNzQsIDB4NzM4MywgMHg3NDkwLAorCTB4NzU5ZCwgMHg3NmFhLCAweDc3YjUsIDB4NzhjMCwgMHg3OWNhLCAweDdhZDMsIDB4N2JkYiwgMHg3Y2UzLAorCTB4N2RlYSwgMHg3ZWYwLCAweDdmZjYsIDB4ODBmYiwgMHg4MWZmLCAweDgzMDIsIDB4ODQwNSwgMHg4NTA3LAorCTB4ODYwOCwgMHg4NzA5LCAweDg4MDksIDB4ODkwOCwgMHg4YTA2LCAweDhiMDQsIDB4OGMwMSwgMHg4Y2ZlLAorCTB4OGRmYSwgMHg4ZWY1LCAweDhmZWYsIDB4OTBlOSwgMHg5MWUyLCAweDkyZGIsIDB4OTNkMiwgMHg5NGNhLAorCTB4OTVjMCwgMHg5NmI2LCAweDk3YWIsIDB4OThhMCwgMHg5OTk0LCAweDlhODcsIDB4OWI3YSwgMHg5YzZjLAorCTB4OWQ1ZSwgMHg5ZTRmLCAweDlmM2YsIDB4YTAyZSwgMHhhMTFlLCAweGEyMGMsIDB4YTJmYSwgMHhhM2U3LAorCTB4YTRkNCwgMHhhNWMwLCAweGE2YWIsIDB4YTc5NiwgMHhhODgxLCAweGE5NmEsIDB4YWE1MywgMHhhYjNjLAorCTB4YWMyNCwgMHhhZDBjLCAweGFkZjIsIDB4YWVkOSwgMHhhZmJlLCAweGIwYTQsIDB4YjE4OCwgMHhiMjZjLAorCTB4YjM1MCwgMHhiNDMzLCAweGI1MTUsIDB4YjVmNywgMHhiNmQ5LCAweGI3YmEsIDB4Yjg5YSwgMHhiOTdhLAorCTB4YmE1OSwgMHhiYjM4LCAweGJjMTYsIDB4YmNmNCwgMHhiZGQxLCAweGJlYWQsIDB4YmY4YSwgMHhjMDY1LAorCTB4YzE0MCwgMHhjMjFiLCAweGMyZjUsIDB4YzNjZiwgMHhjNGE4LCAweGM1ODAsIDB4YzY1OCwgMHhjNzMwLAorCTB4YzgwNywgMHhjOGRlLCAweGM5YjQsIDB4Y2E4YSwgMHhjYjVmLCAweGNjMzQsIDB4Y2QwOCwgMHhjZGRjLAorCTB4Y2VhZiwgMHhjZjgyLCAweGQwNTQsIDB4ZDEyNiwgMHhkMWY3LCAweGQyYzgsIDB4ZDM5OSwgMHhkNDY5LAorCTB4ZDUzOCwgMHhkNjA3LCAweGQ2ZDYsIDB4ZDdhNCwgMHhkODcyLCAweGQ5M2YsIDB4ZGEwYywgMHhkYWQ5LAorCTB4ZGJhNSwgMHhkYzcwLCAweGRkM2IsIDB4ZGUwNiwgMHhkZWQwLCAweGRmOWEsIDB4ZTA2MywgMHhlMTJjLAorCTB4ZTFmNSwgMHhlMmJkLCAweGUzODUsIDB4ZTQ0YywgMHhlNTEzLCAweGU1ZDksIDB4ZTY5ZiwgMHhlNzY1LAorCTB4ZTgyYSwgMHhlOGVmLCAweGU5YjMsIDB4ZWE3NywgMHhlYjNiLCAweGViZmUsIDB4ZWNjMSwgMHhlZDgzLAorCTB4ZWU0NSwgMHhlZjA2LCAweGVmYzgsIDB4ZjA4OCwgMHhmMTQ5LCAweGYyMDksIDB4ZjJjOCwgMHhmMzg3LAorCTB4ZjQ0NiwgMHhmNTA1LCAweGY1YzMsIDB4ZjY4MCwgMHhmNzNlLCAweGY3ZmIsIDB4ZjhiNywgMHhmOTczLAorCTB4ZmEyZiwgMHhmYWVhLCAweGZiYTUsIDB4ZmM2MCwgMHhmZDFhLCAweGZkZDQsIDB4ZmU4ZSwgMHhmZjQ3Cit9OworCit1bnNpZ25lZCBpbnQgaW50bG9nMih1MzIgdmFsdWUpCit7CisJLyoqCisJICoJcmV0dXJuczogbG9nMih2YWx1ZSkgKiAyXjI0CisJICoJd3JvbmcgcmVzdWx0IGlmIHZhbHVlID0gMCAobG9nMigwKSBpcyB1bmRlZmluZWQpCisJICovCisJdW5zaWduZWQgaW50IG1zYjsKKwl1bnNpZ25lZCBpbnQgbG9nZW50cnk7CisJdW5zaWduZWQgaW50IHNpZ25pZmljYW5kOworCXVuc2lnbmVkIGludCBpbnRlcnBvbGF0aW9uOworCisJaWYgKHVubGlrZWx5KHZhbHVlID09IDApKSB7CisJCVdBUk5fT04oMSk7CisJCXJldHVybiAwOworCX0KKworCS8qIGZpcnN0IGRldGVjdCB0aGUgbXNiIChjb3VudCBiZWdpbnMgYXQgMCkgKi8KKwltc2IgPSBmbHModmFsdWUpIC0gMTsKKworCS8qKgorCSAqCW5vdyB3ZSB1c2UgYSBsb2d0YWJsZSBhZnRlciB0aGUgZm9sbG93aW5nIG1ldGhvZDoKKwkgKgorCSAqCWxvZzIoMl54ICogeSkgKiAyXjI0ID0geCAqIDJeMjQgKyBsb2cyKHkpICogMl4yNAorCSAqCXdoZXJlIHggPSBtc2IgYW5kIHRoZXJlZm9yZSAxIDw9IHkgPCAyCisJICoJZmlyc3QgeSBpcyBkZXRlcm1pbmVkIGJ5IHNoaWZ0aW5nIHRoZSB2YWx1ZSBsZWZ0CisJICoJc28gdGhhdCBtc2IgaXMgYml0IDMxCisJICoJCTB4MDAyMzFmNTYgLT4gMHg4QzdENTgwMAorCSAqCXRoZSByZXN1bHQgaXMgeSAqIDJeMzEgLT4gInNpZ25pZmljYW5kIgorCSAqCXRoZW4gdGhlIGhpZ2hlc3QgOSBiaXRzIGFyZSB1c2VkIGZvciBhIHRhYmxlIGxvb2t1cAorCSAqCXRoZSBoaWdoZXN0IGJpdCBpcyBkaXNjYXJkZWQgYmVjYXVzZSBpdCdzIGFsd2F5cyBzZXQKKwkgKgl0aGUgaGlnaGVzdCBuaW5lIGJpdHMgaW4gb3VyIGV4YW1wbGUgYXJlIDEwMDAxMTAwMAorCSAqCXNvIHdlIHdvdWxkIHVzZSB0aGUgZW50cnkgMHgxOAorCSAqLworCXNpZ25pZmljYW5kID0gdmFsdWUgPDwgKDMxIC0gbXNiKTsKKwlsb2dlbnRyeSA9IChzaWduaWZpY2FuZCA+PiAyMykgJiAweGZmOworCisJLyoqCisJICoJbGFzdCBzdGVwIHdlIGRvIGlzIGludGVycG9sYXRpb24gYmVjYXVzZSBvZiB0aGUKKwkgKglsaW1pdGF0aW9ucyBvZiB0aGUgbG9nIHRhYmxlIHRoZSBlcnJvciBpcyB0aGF0IHBhcnQgb2YKKwkgKgl0aGUgc2lnbmlmaWNhbmQgd2hpY2ggaXNuJ3QgdXNlZCBmb3IgbG9va3VwIHRoZW4gd2UKKwkgKgljb21wdXRlIHRoZSByYXRpbyBiZXR3ZWVuIHRoZSBlcnJvciBhbmQgdGhlIG5leHQgdGFibGUgZW50cnkKKwkgKglhbmQgaW50ZXJwb2xhdGUgaXQgYmV0d2VlbiB0aGUgbG9nIHRhYmxlIGVudHJ5IHVzZWQgYW5kIHRoZQorCSAqCW5leHQgb25lIHRoZSBiaWdnZXN0IGVycm9yIHBvc3NpYmxlIGlzIDB4N2ZmZmZmCisJICoJKGluIG91ciBleGFtcGxlIGl0J3MgMHg3RDU4MDApCisJICoJbmVlZGVkIHZhbHVlIGZvciBuZXh0IHRhYmxlIGVudHJ5IGlzIDB4ODAwMDAwCisJICoJc28gdGhlIGludGVycG9sYXRpb24gaXMKKwkgKgkoZXJyb3IgLyAweDgwMDAwMCkgKiAobG9ndGFibGVfbmV4dCAtIGxvZ3RhYmxlX2N1cnJlbnQpCisJICoJaW4gdGhlIGltcGxlbWVudGF0aW9uIHRoZSBkaXZpc2lvbiBpcyBtb3ZlZCB0byB0aGUgZW5kIGZvcgorCSAqCWJldHRlciBhY2N1cmFjeSB0aGVyZSBpcyBhbHNvIGFuIG92ZXJmbG93IGNvcnJlY3Rpb24gaWYKKwkgKglsb2d0YWJsZV9uZXh0IGlzIDI1NgorCSAqLworCWludGVycG9sYXRpb24gPSAoKHNpZ25pZmljYW5kICYgMHg3ZmZmZmYpICoKKwkJCSgobG9ndGFibGVbKGxvZ2VudHJ5ICsgMSkgJiAweGZmXSAtCisJCQkgIGxvZ3RhYmxlW2xvZ2VudHJ5XSkgJiAweGZmZmYpKSA+PiAxNTsKKworCS8qIG5vdyB3ZSByZXR1cm4gdGhlIHJlc3VsdCAqLworCXJldHVybiAoKG1zYiA8PCAyNCkgKyAobG9ndGFibGVbbG9nZW50cnldIDw8IDgpICsgaW50ZXJwb2xhdGlvbik7Cit9CitFWFBPUlRfU1lNQk9MKGludGxvZzIpOworCit1bnNpZ25lZCBpbnQgaW50bG9nMTAodTMyIHZhbHVlKQoreworCS8qKgorCSAqCXJldHVybnM6IGxvZzEwKHZhbHVlKSAqIDJeMjQKKwkgKgl3cm9uZyByZXN1bHQgaWYgdmFsdWUgPSAwIChsb2cxMCgwKSBpcyB1bmRlZmluZWQpCisJICovCisJdTY0IGxvZzsKKworCWlmICh1bmxpa2VseSh2YWx1ZSA9PSAwKSkgeworCQlXQVJOX09OKDEpOworCQlyZXR1cm4gMDsKKwl9CisKKwlsb2cgPSBpbnRsb2cyKHZhbHVlKTsKKworCS8qKgorCSAqCXdlIHVzZSB0aGUgZm9sbG93aW5nIG1ldGhvZDoKKwkgKglsb2cxMCh4KSA9IGxvZzIoeCkgKiBsb2cxMCgyKQorCSAqLworCisJcmV0dXJuIChsb2cgKiA2NDY0NTY5OTMpID4+IDMxOworfQorRVhQT1JUX1NZTUJPTChpbnRsb2cxMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfbWF0aC5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX21hdGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWNjODY3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX21hdGguaApAQCAtMCwwICsxLDU4IEBACisvKgorICogZHZiLW1hdGggcHJvdmlkZXMgc29tZSBjb21wbGV4IGZpeGVkLXBvaW50IG1hdGgKKyAqIG9wZXJhdGlvbnMgc2hhcmVkIGJldHdlZW4gdGhlIGR2YiByZWxhdGVkIHN0dWZmCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2IENocmlzdG9waCBQZmlzdGVyIChjaHJpc3RvcGhwZmlzdGVyQGdtYWlsLmNvbSkKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaWZuZGVmIF9fRFZCX01BVEhfSAorI2RlZmluZSBfX0RWQl9NQVRIX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qKgorICogY29tcHV0ZXMgbG9nMiBvZiBhIHZhbHVlOyB0aGUgcmVzdWx0IGlzIHNoaWZ0ZWQgbGVmdCBieSAyNCBiaXRzCisgKgorICogdG8gdXNlIHJhdGlvbmFsIHZhbHVlcyB5b3UgY2FuIHVzZSB0aGUgZm9sbG93aW5nIG1ldGhvZDoKKyAqICAgaW50bG9nMih2YWx1ZSkgPSBpbnRsb2cyKHZhbHVlICogMl54KSAtIHggKiAyXjI0CisgKgorICogZXhhbXBsZTogaW50bG9nMig4KSB3aWxsIGdpdmUgMyA8PCAyNCA9IDMgKiAyXjI0CisgKiBleGFtcGxlOiBpbnRsb2cyKDkpIHdpbGwgZ2l2ZSAzIDw8IDI0ICsgLi4uID0gMy4xNi4uLiAqIDJeMjQKKyAqIGV4YW1wbGU6IGludGxvZzIoMS41KSA9IGludGxvZzIoMykgLSAyXjI0ID0gMC41ODQuLi4gKiAyXjI0CisgKgorICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSAobXVzdCBiZSAhPSAwKQorICogQHJldHVybiBsb2cyKHZhbHVlKSAqIDJeMjQKKyAqLworZXh0ZXJuIHVuc2lnbmVkIGludCBpbnRsb2cyKHUzMiB2YWx1ZSk7CisKKy8qKgorICogY29tcHV0ZXMgbG9nMTAgb2YgYSB2YWx1ZTsgdGhlIHJlc3VsdCBpcyBzaGlmdGVkIGxlZnQgYnkgMjQgYml0cworICoKKyAqIHRvIHVzZSByYXRpb25hbCB2YWx1ZXMgeW91IGNhbiB1c2UgdGhlIGZvbGxvd2luZyBtZXRob2Q6CisgKiAgIGludGxvZzEwKHZhbHVlKSA9IGludGxvZzEwKHZhbHVlICogMTBeeCkgLSB4ICogMl4yNAorICoKKyAqIGV4YW1wbGU6IGludGxvZzEwKDEwMDApIHdpbGwgZ2l2ZSAzIDw8IDI0ID0gMyAqIDJeMjQKKyAqICAgZHVlIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBpbnRsb2cxMCgxMDAwKSBtaWdodCBiZSBub3QgZXhhY3RseSAzICogMl4yNAorICoKKyAqIGxvb2sgYXQgaW50bG9nMiBmb3Igc2ltaWxhciBleGFtcGxlcworICoKKyAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgKG11c3QgYmUgIT0gMCkKKyAqIEByZXR1cm4gbG9nMTAodmFsdWUpICogMl4yNAorICovCitleHRlcm4gdW5zaWduZWQgaW50IGludGxvZzEwKHUzMiB2YWx1ZSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX25ldC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX25ldC5jCmluZGV4IDlmZDg3NTIuLjg4NTlhYjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9uZXQuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfbmV0LmMKQEAgLTEyLDcgKzEyLDcgQEAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICBIaWxtYXIgTGluZGVyIDxobGluZGVyQGNvc3kuc2JnLmFjLmF0PgogICogICAgICAgICAgICAgICAgICAgICAgYW5kIFdvbGZyYW0gU3RlcmluZyA8d3N0ZXJpbmdAY29zeS5zYmcuYWMuYXQ+CiAgKgotICogVUxFIERlY2FwcyBhY2NvcmRpbmcgdG8gZHJhZnQtaWV0Zi1pcGR2Yi11bGUtMDMudHh0LgorICogVUxFIERlY2FwcyBhY2NvcmRpbmcgdG8gUkZDIDQzMjYuCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKQEAgLTQyLDYgKzQyLDkgQEAKICAqICAgICAgICAgICAgICAgICAgICAgQnVnZml4ZXMgYW5kIHJvYnVzdG5lc3MgaW1wcm92ZW1lbnRzLgogICogICAgICAgICAgICAgICAgICAgICBGaWx0ZXJpbmcgb24gZGVzdCBNQUMgYWRkcmVzc2VzLCBpZiBwcmVzZW50IChELUJpdCA9IDApCiAgKiAgICAgICAgICAgICAgICAgICAgIFVMRV9ERUJVRyBjb21waWxlLXRpbWUgb3B0aW9uLgorICogQXByIDIwMDY6IGNwIHYzOiAgICBCdWdmaXhlcyBhbmQgY29tcGxpZW5jeSB3aXRoIFJGQyA0MzI2IChVTEUpIGJ5CisgKiAgICAgICAgICAgICAgICAgICAgICAgQ2hyaXN0aWFuIFByYWVoYXVzZXIgPGNwcmFlaGF1c0Bjb3N5LnNiZy5hYy5hdD4sCisgKiAgICAgICAgICAgICAgICAgICAgICAgUGFyaXMgTG9kcm9uIFVuaXZlcnNpdHkgb2YgU2FsemJ1cmcuCiAgKi8KIAogLyoKQEAgLTQ5LDkgKzUyLDYgQEAKICAqCiAgKiBVbmxvYWRpbmcgZG9lcyBub3Qgd29yayBmb3IgMi42Ljkga2VybmVsczogYSByZWZjb3VudCBkb2Vzbid0IGdvIHRvIHplcm8uCiAgKgotICogVFNfRkVFRCBjYWxsYmFjayBpcyBjYWxsZWQgb25jZSBmb3IgZXZlcnkgc2luZ2xlIFRTIGNlbGwgYWx0aG91Z2ggaXQgaXMKLSAqIHJlZ2lzdGVyZWQgKGluIGR2Yl9uZXRfZmVlZF9zdGFydCgpKSBmb3IgMTAwIFRTIGNlbGxzICh1c2VkIGZvciBkdmJfbmV0X3VsZSgpKS4KLSAqCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtODksNiArODksOSBAQAogCiAjaWZkZWYgVUxFX0RFQlVHCiAKKyNkZWZpbmUgTUFDX0FERFJfUFJJTlRGTVQgIiUuMng6JS4yeDolLjJ4OiUuMng6JS4yeDolLjJ4IgorI2RlZmluZSBNQVhfQUREUl9QUklOVEZNVF9BUkdTKG1hY2FwKSAobWFjYXApWzBdLChtYWNhcClbMV0sKG1hY2FwKVsyXSwobWFjYXApWzNdLChtYWNhcClbNF0sKG1hY2FwKVs1XQorCiAjZGVmaW5lIGlzcHJpbnQoYykJKChjID49ICdhJyAmJiBjIDw9ICd6JykgfHwgKGMgPj0gJ0EnICYmIGMgPD0gJ1onKSB8fCAoYyA+PSAnMCcgJiYgYyA8PSAnOScpKQogCiBzdGF0aWMgdm9pZCBoZXhkdW1wKCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIHVuc2lnbmVkIHNob3J0IGxlbiApCkBAIC0yMTQsNiArMjE3LDggQEAKICNkZWZpbmUgVUxFX1RFU1QJMAogI2RlZmluZSBVTEVfQlJJREdFRAkxCiAKKyNkZWZpbmUgVUxFX09QVEVYVEhEUl9QQURESU5HIDAKKwogc3RhdGljIGludCB1bGVfdGVzdF9zbmR1KCBzdHJ1Y3QgZHZiX25ldF9wcml2ICpwICkKIHsKIAlyZXR1cm4gLTE7CkBAIC0yMjEsMTQgKzIyNiwyOCBAQAogCiBzdGF0aWMgaW50IHVsZV9icmlkZ2VkX3NuZHUoIHN0cnVjdCBkdmJfbmV0X3ByaXYgKnAgKQogewotCS8qIEJSSURHRSBTTkRVIGhhbmRsaW5nIHN1Y2tzIGluIGRyYWZ0LWlldGYtaXBkdmItdWxlLTAzLnR4dC4KLQkgKiBUaGlzIGhhcyB0byBiZSB0aGUgbGFzdCBleHRlbnNpb24gaGVhZGVyLCBvdGhlcndpc2UgaXQgd29uJ3Qgd29yay4KLQkgKiBCbGFtZSB0aGUgYXV0aG9ycyEKKwlzdHJ1Y3QgZXRoaGRyICpoZHIgPSAoc3RydWN0IGV0aGhkciopIHAtPnVsZV9uZXh0X2hkcjsKKwlpZihudG9ocyhoZHItPmhfcHJvdG8pIDwgMTUzNikgeworCQlpbnQgZnJhbWVsZW4gPSBwLT51bGVfc25kdV9sZW4gLSAoKHAtPnVsZV9uZXh0X2hkcitzaXplb2Yoc3RydWN0IGV0aGhkcikpIC0gcC0+dWxlX3NrYi0+ZGF0YSk7CisJCS8qIEEgZnJhbWUgVHlwZSA8IDE1MzYgZm9yIGEgYnJpZGdlZCBmcmFtZSwgaW50cm9kdWNlcyBhIExMQyBMZW5ndGggZmllbGQuICovCisJCWlmKGZyYW1lbGVuICE9IG50b2hzKGhkci0+aF9wcm90bykpIHsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKwkvKiBOb3RlOgorCSAqIEZyb20gUkZDNDMyNjoKKwkgKiAgIkEgYnJpZGdlZCBTTkRVIGlzIGEgTWFuZGF0b3J5IEV4dGVuc2lvbiBIZWFkZXIgb2YgVHlwZSAxLgorCSAqICAgSXQgbXVzdCBiZSB0aGUgZmluYWwgKG9yIG9ubHkpIGV4dGVuc2lvbiBoZWFkZXIgc3BlY2lmaWVkIGluIHRoZSBoZWFkZXIgY2hhaW4gb2YgYSBTTkRVLiIKKwkgKiBUaGUgJ3VsZV9icmlkZ2VkJyBmbGFnIHdpbGwgY2F1c2UgdGhlIGV4dGVuc2lvbiBoZWFkZXIgcHJvY2Vzc2luZyBsb29wIHRvIHRlcm1pbmF0ZS4KIAkgKi8KIAlwLT51bGVfYnJpZGdlZCA9IDE7CiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgdWxlX2V4dGhkcl9wYWRkaW5nKHN0cnVjdCBkdmJfbmV0X3ByaXYgKnApCit7CisJcmV0dXJuIDA7Cit9CiAKIC8qKiBIYW5kbGUgVUxFIGV4dGVuc2lvbiBoZWFkZXJzLgogICogIEZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlciBhIHN1Y2Nlc3NmdWwgQ1JDMzIgdmVyaWZpY2F0aW9uIG9mIGFuIFVMRSBTTkRVIHRvIGNvbXBsZXRlIGl0cyBkZWNvZGluZy4KQEAgLTI0Miw3ICsyNjEsOCBAQAogCQl7IFswXSA9IHVsZV90ZXN0X3NuZHUsIFsxXSA9IHVsZV9icmlkZ2VkX3NuZHUsIFsyXSA9IE5VTEwsICB9OwogCiAJLyogVGFibGUgb2Ygb3B0aW9uYWwgZXh0ZW5zaW9uIGhlYWRlciBoYW5kbGVycy4gIFRoZSBoZWFkZXIgdHlwZSBpcyB0aGUgaW5kZXguICovCi0Jc3RhdGljIGludCAoKnVsZV9vcHRpb25hbF9leHRfaGFuZGxlcnNbMjU1XSkoIHN0cnVjdCBkdmJfbmV0X3ByaXYgKnAgKSA9IHsgTlVMTCwgfTsKKwlzdGF0aWMgaW50ICgqdWxlX29wdGlvbmFsX2V4dF9oYW5kbGVyc1syNTVdKSggc3RydWN0IGR2Yl9uZXRfcHJpdiAqcCApID0KKwkJeyBbMF0gPSB1bGVfZXh0aGRyX3BhZGRpbmcsIFsxXSA9IE5VTEwsIH07CiAKIAlpbnQgZXh0X2xlbiA9IDA7CiAJdW5zaWduZWQgY2hhciBobGVuID0gKHAtPnVsZV9zbmR1X3R5cGUgJiAweDA3MDApID4+IDg7CkBAIC0yNTMsMjUgKzI3MywzMSBAQAogCQkvKiBNYW5kYXRvcnkgZXh0ZW5zaW9uIGhlYWRlciAqLwogCQlpZiAodWxlX21hbmRhdG9yeV9leHRfaGFuZGxlcnNbaHR5cGVdKSB7CiAJCQlleHRfbGVuID0gdWxlX21hbmRhdG9yeV9leHRfaGFuZGxlcnNbaHR5cGVdKCBwICk7Ci0JCQlwLT51bGVfbmV4dF9oZHIgKz0gZXh0X2xlbjsKLQkJCWlmICghIHAtPnVsZV9icmlkZ2VkKSB7Ci0JCQkJcC0+dWxlX3NuZHVfdHlwZSA9IG50b2hzKCAqKHVuc2lnbmVkIHNob3J0ICopcC0+dWxlX25leHRfaGRyICk7Ci0JCQkJcC0+dWxlX25leHRfaGRyICs9IDI7Ci0JCQl9IGVsc2UgewotCQkJCXAtPnVsZV9zbmR1X3R5cGUgPSBudG9ocyggKih1bnNpZ25lZCBzaG9ydCAqKShwLT51bGVfbmV4dF9oZHIgKyAoKHAtPnVsZV9kYml0ID8gMiA6IDMpICogRVRIX0FMRU4pKSApOwotCQkJCS8qIFRoaXMgYXNzdXJlcyB0aGUgZXh0ZW5zaW9uIGhhbmRsaW5nIGxvb3Agd2lsbCB0ZXJtaW5hdGUuICovCisJCQlpZihleHRfbGVuID49IDApIHsKKwkJCQlwLT51bGVfbmV4dF9oZHIgKz0gZXh0X2xlbjsKKwkJCQlpZiAoIXAtPnVsZV9icmlkZ2VkKSB7CisJCQkJCXAtPnVsZV9zbmR1X3R5cGUgPSBudG9ocygqKHVuc2lnbmVkIHNob3J0ICopcC0+dWxlX25leHRfaGRyKTsKKwkJCQkJcC0+dWxlX25leHRfaGRyICs9IDI7CisJCQkJfSBlbHNlIHsKKwkJCQkJcC0+dWxlX3NuZHVfdHlwZSA9IG50b2hzKCoodW5zaWduZWQgc2hvcnQgKikocC0+dWxlX25leHRfaGRyICsgKChwLT51bGVfZGJpdCA/IDIgOiAzKSAqIEVUSF9BTEVOKSkpOworCQkJCQkvKiBUaGlzIGFzc3VyZXMgdGhlIGV4dGVuc2lvbiBoYW5kbGluZyBsb29wIHdpbGwgdGVybWluYXRlLiAqLworCQkJCX0KIAkJCX0KKwkJCS8vIGVsc2U6IGV4dGVuc2lvbiBoYW5kbGVyIGZhaWxlZCBvciBTTkRVIHNob3VsZCBiZSBkaXNjYXJkZWQKIAkJfSBlbHNlCiAJCQlleHRfbGVuID0gLTE7CS8qIFNORFUgaGFzIHRvIGJlIGRpc2NhcmRlZC4gKi8KIAl9IGVsc2UgewogCQkvKiBPcHRpb25hbCBleHRlbnNpb24gaGVhZGVyLiAgQ2FsY3VsYXRlIHRoZSBsZW5ndGguICovCi0JCWV4dF9sZW4gPSBobGVuIDw8IDI7CisJCWV4dF9sZW4gPSBobGVuIDw8IDE7CiAJCS8qIFByb2Nlc3MgdGhlIG9wdGlvbmFsIGV4dGVuc2lvbiBoZWFkZXIgYWNjb3JkaW5nIHRvIGl0cyB0eXBlLiAqLwogCQlpZiAodWxlX29wdGlvbmFsX2V4dF9oYW5kbGVyc1todHlwZV0pCiAJCQkodm9pZCl1bGVfb3B0aW9uYWxfZXh0X2hhbmRsZXJzW2h0eXBlXSggcCApOwogCQlwLT51bGVfbmV4dF9oZHIgKz0gZXh0X2xlbjsKLQkJcC0+dWxlX3NuZHVfdHlwZSA9IG50b2hzKCAqKHVuc2lnbmVkIHNob3J0ICopcC0+dWxlX25leHRfaGRyICk7Ci0JCXAtPnVsZV9uZXh0X2hkciArPSAyOworCQlwLT51bGVfc25kdV90eXBlID0gbnRvaHMoICoodW5zaWduZWQgc2hvcnQgKikocC0+dWxlX25leHRfaGRyLTIpICk7CisJCS8qCisJCSAqIG5vdGU6IHRoZSBsZW5ndGggb2YgdGhlIG5leHQgaGVhZGVyIHR5cGUgaXMgaW5jbHVkZWQgaW4gdGhlCisJCSAqIGxlbmd0aCBvZiBUSElTIG9wdGlvbmFsIGV4dGVuc2lvbiBoZWFkZXIKKwkJICovCiAJfQogCiAJcmV0dXJuIGV4dF9sZW47CkBAIC0yODQsOCArMzEwLDE0IEBACiAJcC0+dWxlX25leHRfaGRyID0gcC0+dWxlX3NrYi0+ZGF0YTsKIAlkbyB7CiAJCWwgPSBoYW5kbGVfb25lX3VsZV9leHRlbnNpb24oIHAgKTsKLQkJaWYgKGwgPT0gLTEpIHJldHVybiAtMTsJLyogU3RvcCBleHRlbnNpb24gaGVhZGVyIHByb2Nlc3NpbmcgYW5kIGRpc2NhcmQgU05EVS4gKi8KKwkJaWYgKGwgPCAwKQorCQkJcmV0dXJuIGw7CS8qIFN0b3AgZXh0ZW5zaW9uIGhlYWRlciBwcm9jZXNzaW5nIGFuZCBkaXNjYXJkIFNORFUuICovCiAJCXRvdGFsX2V4dF9sZW4gKz0gbDsKKyNpZmRlZiBVTEVfREVCVUcKKwkJZHByaW50aygiaGFuZGxlX3VsZV9leHRlbnNpb25zOiB1bGVfbmV4dF9oZHI9JXAsIHVsZV9zbmR1X3R5cGU9JWksICIKKwkJCSJsPSVpLCB0b3RhbF9leHRfbGVuPSVpXG4iLCBwLT51bGVfbmV4dF9oZHIsCisJCQkoaW50KSBwLT51bGVfc25kdV90eXBlLCBsLCB0b3RhbF9leHRfbGVuKTsKKyNlbmRpZgogCiAJfSB3aGlsZSAocC0+dWxlX3NuZHVfdHlwZSA8IDE1MzYpOwogCkBAIC0zNTUsOCArMzg3LDggQEAKIAkJCQlpZiAocHJpdi0+dWxlX3NrYikgewogCQkJCQlkZXZfa2ZyZWVfc2tiKCBwcml2LT51bGVfc2tiICk7CiAJCQkJCS8qIFByZXBhcmUgZm9yIG5leHQgU05EVS4gKi8KLQkJCQkJKChzdHJ1Y3QgZHZiX25ldF9wcml2ICopIGRldi0+cHJpdiktPnN0YXRzLnJ4X2Vycm9ycysrOwotCQkJCQkoKHN0cnVjdCBkdmJfbmV0X3ByaXYgKikgZGV2LT5wcml2KS0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCQkJCXByaXYtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJCQlwcml2LT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKIAkJCQl9CiAJCQkJcmVzZXRfdWxlKHByaXYpOwogCQkJCXByaXYtPm5lZWRfcHVzaSA9IDE7CkBAIC0zOTYsMjcgKzQyOCwyNSBAQAogCQkJfQogCQl9CiAKLQkJLyogQ2hlY2sgY29udGludWl0eSBjb3VudGVyLiAqLwogCQlpZiAobmV3X3RzKSB7CisJCQkvKiBDaGVjayBjb250aW51aXR5IGNvdW50ZXIuICovCiAJCQlpZiAoKHRzWzNdICYgMHgwRikgPT0gcHJpdi0+dHNjYykKIAkJCQlwcml2LT50c2NjID0gKHByaXYtPnRzY2MgKyAxKSAmIDB4MEY7CiAJCQllbHNlIHsKIAkJCQkvKiBUUyBkaXNjb250aW51aXR5IGhhbmRsaW5nOiAqLwogCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVsdTogVFMgZGlzY29udGludWl0eTogZ290ICUjeCwgIgotCQkJCSAgICAgICAiZXhwdGVjdGVkICUjeC5cbiIsIHByaXYtPnRzX2NvdW50LCB0c1szXSAmIDB4MEYsIHByaXYtPnRzY2MpOworCQkJCSAgICAgICAiZXhwZWN0ZWQgJSN4LlxuIiwgcHJpdi0+dHNfY291bnQsIHRzWzNdICYgMHgwRiwgcHJpdi0+dHNjYyk7CiAJCQkJLyogRHJvcCBwYXJ0bHkgZGVjb2RlZCBTTkRVLCByZXNldCBzdGF0ZSwgcmVzeW5jIG9uIFBVU0kuICovCiAJCQkJaWYgKHByaXYtPnVsZV9za2IpIHsKIAkJCQkJZGV2X2tmcmVlX3NrYiggcHJpdi0+dWxlX3NrYiApOwogCQkJCQkvKiBQcmVwYXJlIGZvciBuZXh0IFNORFUuICovCiAJCQkJCS8vIHJlc2V0X3VsZShwcml2KTsgIG1vdmVkIHRvIGJlbG93LgotCQkJCQkoKHN0cnVjdCBkdmJfbmV0X3ByaXYgKikgZGV2LT5wcml2KS0+c3RhdHMucnhfZXJyb3JzKys7Ci0JCQkJCSgoc3RydWN0IGR2Yl9uZXRfcHJpdiAqKSBkZXYtPnByaXYpLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJCQkJcHJpdi0+c3RhdHMucnhfZXJyb3JzKys7CisJCQkJCXByaXYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOwogCQkJCX0KIAkJCQlyZXNldF91bGUocHJpdik7CiAJCQkJLyogc2tpcCB0byBuZXh0IFBVU0kuICovCiAJCQkJcHJpdi0+bmVlZF9wdXNpID0gMTsKLQkJCQl0cyArPSBUU19TWjsKLQkJCQlwcml2LT50c19jb3VudCsrOwogCQkJCWNvbnRpbnVlOwogCQkJfQogCQkJLyogSWYgd2Ugc3RpbGwgaGF2ZSBhbiBpbmNvbXBsZXRlIHBheWxvYWQsIGJ1dCBQVVNJIGlzCkBAIC00MjUsNyArNDU1LDcgQEAKIAkJCSAqIGNlbGxzIChjb250aW51aXR5IGNvdW50ZXIgd3JhcCkuICovCiAJCQlpZiAodHNbMV0gJiBUU19QVVNJKSB7CiAJCQkJaWYgKCEgcHJpdi0+bmVlZF9wdXNpKSB7Ci0JCQkJCWlmICgqZnJvbV93aGVyZSA+IDE4MSkgeworCQkJCQlpZiAoISgqZnJvbV93aGVyZSA8ICh0c19yZW1haW4tMSkpIHx8ICpmcm9tX3doZXJlICE9IHByaXYtPnVsZV9zbmR1X3JlbWFpbikgewogCQkJCQkJLyogUG9pbnRlciBmaWVsZCBpcyBpbnZhbGlkLiAgRHJvcCB0aGlzIFRTIGNlbGwgYW5kIGFueSBzdGFydGVkIFVMRSBTTkRVLiAqLwogCQkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJWx1OiBJbnZhbGlkIHBvaW50ZXIgIgogCQkJCQkJICAgICAgICJmaWVsZDogJXUuXG4iLCBwcml2LT50c19jb3VudCwgKmZyb21fd2hlcmUpOwpAQCAtNDM4LDggKzQ2OCw2IEBACiAJCQkJCQl9CiAJCQkJCQlyZXNldF91bGUocHJpdik7CiAJCQkJCQlwcml2LT5uZWVkX3B1c2kgPSAxOwotCQkJCQkJdHMgKz0gVFNfU1o7Ci0JCQkJCQlwcml2LT50c19jb3VudCsrOwogCQkJCQkJY29udGludWU7CiAJCQkJCX0KIAkJCQkJLyogU2tpcCBwb2ludGVyIGZpZWxkICh3ZSdyZSBwcm9jZXNzaW5nIGEKQEAgLTQ1Miw4ICs0ODAsOCBAQAogCQkJCWlmIChwcml2LT51bGVfc25kdV9yZW1haW4gPiAxODMpIHsKIAkJCQkJLyogQ3VycmVudCBTTkRVIGxhY2tzIG1vcmUgZGF0YSB0aGFuIHRoZXJlIGNvdWxkIGJlIGF2YWlsYWJsZSBpbiB0aGUKIAkJCQkJICogY3VycmVudCBUUyBjZWxsLiAqLwotCQkJCQkoKHN0cnVjdCBkdmJfbmV0X3ByaXYgKikgZGV2LT5wcml2KS0+c3RhdHMucnhfZXJyb3JzKys7Ci0JCQkJCSgoc3RydWN0IGR2Yl9uZXRfcHJpdiAqKSBkZXYtPnByaXYpLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCQkJCXByaXYtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJCQlwcml2LT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CiAJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVsdTogRXhwZWN0ZWQgJWQgbW9yZSBTTkRVIGJ5dGVzLCBidXQgIgogCQkJCQkgICAgICAgImdvdCBQVVNJIChwZiAlZCwgdHNfcmVtYWluICVkKS4gIEZsdXNoaW5nIGluY29tcGxldGUgcGF5bG9hZC5cbiIsCiAJCQkJCSAgICAgICBwcml2LT50c19jb3VudCwgcHJpdi0+dWxlX3NuZHVfcmVtYWluLCB0c1s0XSwgdHNfcmVtYWluKTsKQEAgLTQ5Miw5ICs1MjAsMTEgQEAKIAkJCQl9IGVsc2UKIAkJCQkJcHJpdi0+dWxlX2RiaXQgPSAwOwogCi0JCQkJaWYgKHByaXYtPnVsZV9zbmR1X2xlbiA+IDMyNzYzKSB7CisJCQkJaWYgKHByaXYtPnVsZV9zbmR1X2xlbiA8IDUpIHsKIAkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJWx1OiBJbnZhbGlkIFVMRSBTTkRVIGxlbmd0aCAldS4gIgogCQkJCQkgICAgICAgIlJlc3luY2luZy5cbiIsIHByaXYtPnRzX2NvdW50LCBwcml2LT51bGVfc25kdV9sZW4pOworCQkJCQlwcml2LT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCQkJcHJpdi0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOwogCQkJCQlwcml2LT51bGVfc25kdV9sZW4gPSAwOwogCQkJCQlwcml2LT5uZWVkX3B1c2kgPSAxOwogCQkJCQluZXdfdHMgPSAxOwpAQCAtNjA4LDU4ICs2MzgsMTAzIEBACiAJCQkJdWxlX2R1bXAgPSAxOwogI2VuZGlmCiAKLQkJCQkoKHN0cnVjdCBkdmJfbmV0X3ByaXYgKikgZGV2LT5wcml2KS0+c3RhdHMucnhfZXJyb3JzKys7Ci0JCQkJKChzdHJ1Y3QgZHZiX25ldF9wcml2ICopIGRldi0+cHJpdiktPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJCQlwcml2LT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCQlwcml2LT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CiAJCQkJZGV2X2tmcmVlX3NrYihwcml2LT51bGVfc2tiKTsKIAkJCX0gZWxzZSB7CiAJCQkJLyogQ1JDMzIgdmVyaWZpZWQgT0suICovCi0JCQkJLyogSGFuZGxlIFVMRSBFeHRlbnNpb24gSGVhZGVycy4gKi8KLQkJCQlpZiAocHJpdi0+dWxlX3NuZHVfdHlwZSA8IDE1MzYpIHsKLQkJCQkJLyogVGhlcmUgaXMgYW4gZXh0ZW5zaW9uIGhlYWRlci4gIEhhbmRsZSBpdCBhY2NvcmRpbmdseS4gKi8KLQkJCQkJaW50IGwgPSBoYW5kbGVfdWxlX2V4dGVuc2lvbnMoIHByaXYgKTsKLQkJCQkJaWYgKGwgPCAwKSB7Ci0JCQkJCQkvKiBNYW5kYXRvcnkgZXh0ZW5zaW9uIGhlYWRlciB1bmtub3duIG9yIFRFU1QgU05EVS4gIERyb3AgaXQuICovCi0JCQkJCQkvLyBwcmludGsoIEtFUk5fV0FSTklORyAiRHJvcHBpbmcgU05EVSwgZXh0ZW5zaW9uIGhlYWRlcnMuXG4iICk7Ci0JCQkJCQlkZXZfa2ZyZWVfc2tiKCBwcml2LT51bGVfc2tiICk7Ci0JCQkJCQlnb3RvIHNuZHVfZG9uZTsKLQkJCQkJfQotCQkJCQlza2JfcHVsbCggcHJpdi0+dWxlX3NrYiwgbCApOwotCQkJCX0KKwkJCQl1OCBkZXN0X2FkZHJbRVRIX0FMRU5dOworCQkJCXN0YXRpYyBjb25zdCB1OCBiY19hZGRyW0VUSF9BTEVOXSA9CisJCQkJCXsgWyAwIC4uLiBFVEhfQUxFTi0xXSA9IDB4ZmYgfTsKIAogCQkJCS8qIENSQzMyIHdhcyBPSy4gUmVtb3ZlIGl0IGZyb20gc2tiLiAqLwogCQkJCXByaXYtPnVsZV9za2ItPnRhaWwgLT0gNDsKIAkJCQlwcml2LT51bGVfc2tiLT5sZW4gLT0gNDsKIAotCQkJCS8qIEZpbHRlciBvbiByZWNlaXZlcidzIGRlc3RpbmF0aW9uIE1BQyBhZGRyZXNzLCBpZiBwcmVzZW50LiAqLwogCQkJCWlmICghcHJpdi0+dWxlX2RiaXQpIHsKLQkJCQkJLyogVGhlIGRlc3RpbmF0aW9uIE1BQyBhZGRyZXNzIGlzIHRoZSBuZXh0IGRhdGEgaW4gdGhlIHNrYi4gKi8KLQkJCQkJaWYgKG1lbWNtcCggcHJpdi0+dWxlX3NrYi0+ZGF0YSwgZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4gKSkgewotCQkJCQkJLyogTUFDIGFkZHJlc3NlcyBkb24ndCBtYXRjaC4gIERyb3AgU05EVS4gKi8KLQkJCQkJCS8vIHByaW50ayggS0VSTl9XQVJOSU5HICJEcm9wcGluZyBTTkRVLCBNQUMgYWRkcmVzcy5cbiIgKTsKLQkJCQkJCWRldl9rZnJlZV9za2IoIHByaXYtPnVsZV9za2IgKTsKKwkJCQkJLyoKKwkJCQkJICogVGhlIGRlc3RpbmF0aW9uIE1BQyBhZGRyZXNzIGlzIHRoZQorCQkJCQkgKiBuZXh0IGRhdGEgaW4gdGhlIHNrYi4gIEl0IGNvbWVzCisJCQkJCSAqIGJlZm9yZSBhbnkgZXh0ZW5zaW9uIGhlYWRlcnMuCisJCQkJCSAqCisJCQkJCSAqIENoZWNrIGlmIHRoZSBwYXlsb2FkIG9mIHRoaXMgU05EVQorCQkJCQkgKiBzaG91bGQgYmUgcGFzc2VkIHVwIHRoZSBzdGFjay4KKwkJCQkJICovCisJCQkJCXJlZ2lzdGVyIGludCBkcm9wID0gMDsKKwkJCQkJaWYgKHByaXYtPnJ4X21vZGUgIT0gUlhfTU9ERV9QUk9NSVNDKSB7CisJCQkJCQlpZiAocHJpdi0+dWxlX3NrYi0+ZGF0YVswXSAmIDB4MDEpIHsKKwkJCQkJCQkvKiBtdWx0aWNhc3Qgb3IgYnJvYWRjYXN0ICovCisJCQkJCQkJaWYgKG1lbWNtcChwcml2LT51bGVfc2tiLT5kYXRhLCBiY19hZGRyLCBFVEhfQUxFTikpIHsKKwkJCQkJCQkJLyogbXVsdGljYXN0ICovCisJCQkJCQkJCWlmIChwcml2LT5yeF9tb2RlID09IFJYX01PREVfTVVMVEkpIHsKKwkJCQkJCQkJCWludCBpOworCQkJCQkJCQkJZm9yKGkgPSAwOyBpIDwgcHJpdi0+bXVsdGlfbnVtICYmIG1lbWNtcChwcml2LT51bGVfc2tiLT5kYXRhLCBwcml2LT5tdWx0aV9tYWNzW2ldLCBFVEhfQUxFTik7IGkrKykKKwkJCQkJCQkJCQk7CisJCQkJCQkJCQlpZiAoaSA9PSBwcml2LT5tdWx0aV9udW0pCisJCQkJCQkJCQkJZHJvcCA9IDE7CisJCQkJCQkJCX0gZWxzZSBpZiAocHJpdi0+cnhfbW9kZSAhPSBSWF9NT0RFX0FMTF9NVUxUSSkKKwkJCQkJCQkJCWRyb3AgPSAxOyAvKiBubyBicm9hZGNhc3Q7ICovCisJCQkJCQkJCS8qIGVsc2U6IGFsbCBtdWx0aWNhc3QgbW9kZTogYWNjZXB0IGFsbCBtdWx0aWNhc3QgcGFja2V0cyAqLworCQkJCQkJCX0KKwkJCQkJCQkvKiBlbHNlOiBicm9hZGNhc3QgKi8KKwkJCQkJCX0KKwkJCQkJCWVsc2UgaWYgKG1lbWNtcChwcml2LT51bGVfc2tiLT5kYXRhLCBkZXYtPmRldl9hZGRyLCBFVEhfQUxFTikpCisJCQkJCQkJZHJvcCA9IDE7CisJCQkJCQkvKiBlbHNlOiBkZXN0aW5hdGlvbiBhZGRyZXNzIG1hdGNoZXMgdGhlIE1BQyBhZGRyZXNzIG9mIG91ciByZWNlaXZlciBkZXZpY2UgKi8KKwkJCQkJfQorCQkJCQkvKiBlbHNlOiBwcm9taXNjaW91cyBtb2RlOyBwYXNzIGV2ZXJ5dGhpbmcgdXAgdGhlIHN0YWNrICovCisKKwkJCQkJaWYgKGRyb3ApIHsKKyNpZmRlZiBVTEVfREVCVUcKKwkJCQkJCWRwcmludGsoIkRyb3BwaW5nIFNORFU6IE1BQyBkZXN0aW5hdGlvbiBhZGRyZXNzIGRvZXMgbm90IG1hdGNoOiBkZXN0IGFkZHI6ICJNQUNfQUREUl9QUklOVEZNVCIsIGRldiBhZGRyOiAiTUFDX0FERFJfUFJJTlRGTVQiXG4iLAorCQkJCQkJCU1BWF9BRERSX1BSSU5URk1UX0FSR1MocHJpdi0+dWxlX3NrYi0+ZGF0YSksIE1BWF9BRERSX1BSSU5URk1UX0FSR1MoZGV2LT5kZXZfYWRkcikpOworI2VuZGlmCisJCQkJCQlkZXZfa2ZyZWVfc2tiKHByaXYtPnVsZV9za2IpOwogCQkJCQkJZ290byBzbmR1X2RvbmU7CiAJCQkJCX0KLQkJCQkJaWYgKCEgcHJpdi0+dWxlX2JyaWRnZWQpIHsKLQkJCQkJCXNrYl9wdXNoKCBwcml2LT51bGVfc2tiLCBFVEhfQUxFTiArIDIgKTsKLQkJCQkJCWV0aGggPSAoc3RydWN0IGV0aGhkciAqKXByaXYtPnVsZV9za2ItPmRhdGE7Ci0JCQkJCQltZW1jcHkoIGV0aGgtPmhfZGVzdCwgZXRoaC0+aF9zb3VyY2UsIEVUSF9BTEVOICk7Ci0JCQkJCQltZW1zZXQoIGV0aGgtPmhfc291cmNlLCAwLCBFVEhfQUxFTiApOwotCQkJCQkJZXRoaC0+aF9wcm90byA9IGh0b25zKCBwcml2LT51bGVfc25kdV90eXBlICk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvKiBTa2lwIHRoZSBSZWNlaXZlciBkZXN0aW5hdGlvbiBNQUMgYWRkcmVzcy4gKi8KLQkJCQkJCXNrYl9wdWxsKCBwcml2LT51bGVfc2tiLCBFVEhfQUxFTiApOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKCEgcHJpdi0+dWxlX2JyaWRnZWQpIHsKLQkJCQkJCXNrYl9wdXNoKCBwcml2LT51bGVfc2tiLCBFVEhfSExFTiApOwotCQkJCQkJZXRoaCA9IChzdHJ1Y3QgZXRoaGRyICopcHJpdi0+dWxlX3NrYi0+ZGF0YTsKLQkJCQkJCW1lbWNweSggZXRoaC0+aF9kZXN0LCBkZXYtPmRldl9hZGRyLCBFVEhfQUxFTiApOwotCQkJCQkJbWVtc2V0KCBldGhoLT5oX3NvdXJjZSwgMCwgRVRIX0FMRU4gKTsKLQkJCQkJCWV0aGgtPmhfcHJvdG8gPSBodG9ucyggcHJpdi0+dWxlX3NuZHVfdHlwZSApOwotCQkJCQl9IGVsc2UgewotCQkJCQkJLyogc2tiIGlzIGluIGNvcnJlY3Qgc3RhdGU7IG5vdGhpbmcgdG8gZG8uICovCisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJbWVtY3B5KGRlc3RfYWRkciwgIHByaXYtPnVsZV9za2ItPmRhdGEsIEVUSF9BTEVOKTsKKwkJCQkJCXNrYl9wdWxsKHByaXYtPnVsZV9za2IsIEVUSF9BTEVOKTsKIAkJCQkJfQogCQkJCX0KKworCQkJCS8qIEhhbmRsZSBVTEUgRXh0ZW5zaW9uIEhlYWRlcnMuICovCisJCQkJaWYgKHByaXYtPnVsZV9zbmR1X3R5cGUgPCAxNTM2KSB7CisJCQkJCS8qIFRoZXJlIGlzIGFuIGV4dGVuc2lvbiBoZWFkZXIuICBIYW5kbGUgaXQgYWNjb3JkaW5nbHkuICovCisJCQkJCWludCBsID0gaGFuZGxlX3VsZV9leHRlbnNpb25zKHByaXYpOworCQkJCQlpZiAobCA8IDApIHsKKwkJCQkJCS8qIE1hbmRhdG9yeSBleHRlbnNpb24gaGVhZGVyIHVua25vd24gb3IgVEVTVCBTTkRVLiAgRHJvcCBpdC4gKi8KKwkJCQkJCS8vIHByaW50ayggS0VSTl9XQVJOSU5HICJEcm9wcGluZyBTTkRVLCBleHRlbnNpb24gaGVhZGVycy5cbiIgKTsKKwkJCQkJCWRldl9rZnJlZV9za2IocHJpdi0+dWxlX3NrYik7CisJCQkJCQlnb3RvIHNuZHVfZG9uZTsKKwkJCQkJfQorCQkJCQlza2JfcHVsbChwcml2LT51bGVfc2tiLCBsKTsKKwkJCQl9CisKKwkJCQkvKgorCQkJCSAqIENvbnN0cnVjdC9hc3N1cmUgY29ycmVjdCBldGhlcm5ldCBoZWFkZXIuCisJCQkJICogTm90ZTogaW4gYnJpZGdlZCBtb2RlIChwcml2LT51bGVfYnJpZGdlZCAhPQorCQkJCSAqIDApIHdlIGFscmVhZHkgaGF2ZSB0aGUgKG9yaWdpbmFsKSBldGhlcm5ldAorCQkJCSAqIGhlYWRlciBhdCB0aGUgc3RhcnQgb2YgdGhlIHBheWxvYWQgKGFmdGVyCisJCQkJICogb3B0aW9uYWwgZGVzdC4gYWRkcmVzcyBhbmQgYW55IGV4dGVuc2lvbgorCQkJCSAqIGhlYWRlcnMpLgorCQkJCSAqLworCisJCQkJaWYgKCFwcml2LT51bGVfYnJpZGdlZCkgeworCQkJCQlza2JfcHVzaChwcml2LT51bGVfc2tiLCBFVEhfSExFTik7CisJCQkJCWV0aGggPSAoc3RydWN0IGV0aGhkciAqKXByaXYtPnVsZV9za2ItPmRhdGE7CisJCQkJCWlmICghcHJpdi0+dWxlX2RiaXQpIHsKKwkJCQkJCSAvKiBkZXN0X2FkZHIgYnVmZmVyIGlzIG9ubHkgdmFsaWQgaWYgcHJpdi0+dWxlX2RiaXQgPT0gMCAqLworCQkJCQkJbWVtY3B5KGV0aGgtPmhfZGVzdCwgZGVzdF9hZGRyLCBFVEhfQUxFTik7CisJCQkJCQltZW1zZXQoZXRoaC0+aF9zb3VyY2UsIDAsIEVUSF9BTEVOKTsKKwkJCQkJfQorCQkJCQllbHNlIC8qIHplcm9pemUgc291cmNlIGFuZCBkZXN0ICovCisJCQkJCQltZW1zZXQoIGV0aGgsIDAsIEVUSF9BTEVOKjIgKTsKKworCQkJCQlldGhoLT5oX3Byb3RvID0gaHRvbnMocHJpdi0+dWxlX3NuZHVfdHlwZSk7CisJCQkJfQorCQkJCS8qIGVsc2U6ICBza2IgaXMgaW4gY29ycmVjdCBzdGF0ZTsgbm90aGluZyB0byBkby4gKi8KIAkJCQlwcml2LT51bGVfYnJpZGdlZCA9IDA7CiAKIAkJCQkvKiBTdHVmZiBpbnRvIGtlcm5lbCdzIHByb3RvY29sIHN0YWNrLiAqLwpAQCAtNjY4LDggKzc0Myw4IEBACiAJCQkJICogcmVjZWl2ZSB0aGUgcGFja2V0IGFueWhvdy4gKi8KIAkJCQkvKiBpZiAocHJpdi0+dWxlX2RiaXQgJiYgc2tiLT5wa3RfdHlwZSA9PSBQQUNLRVRfT1RIRVJIT1NUKQogCQkJCQlwcml2LT51bGVfc2tiLT5wa3RfdHlwZSA9IFBBQ0tFVF9IT1NUOyAqLwotCQkJCSgoc3RydWN0IGR2Yl9uZXRfcHJpdiAqKSBkZXYtPnByaXYpLT5zdGF0cy5yeF9wYWNrZXRzKys7Ci0JCQkJKChzdHJ1Y3QgZHZiX25ldF9wcml2ICopIGRldi0+cHJpdiktPnN0YXRzLnJ4X2J5dGVzICs9IHByaXYtPnVsZV9za2ItPmxlbjsKKwkJCQlwcml2LT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCQkJcHJpdi0+c3RhdHMucnhfYnl0ZXMgKz0gcHJpdi0+dWxlX3NrYi0+bGVuOwogCQkJCW5ldGlmX3J4KHByaXYtPnVsZV9za2IpOwogCQkJfQogCQkJc25kdV9kb25lOgpAQCAtOTQ0LDcgKzEwMTksNyBAQAogCQlkcHJpbnRrKCIlczogc3RhcnQgZmlsdGVyaW5nXG4iLCBfX0ZVTkNUSU9OX18pOwogCQlwcml2LT5zZWNmZWVkLT5zdGFydF9maWx0ZXJpbmcocHJpdi0+c2VjZmVlZCk7CiAJfSBlbHNlIGlmIChwcml2LT5mZWVkdHlwZSA9PSBEVkJfTkVUX0ZFRURUWVBFX1VMRSkgewotCQlzdHJ1Y3QgdGltZXNwZWMgdGltZW91dCA9IHsgMCwgMzAwMDAwMDAgfTsgLy8gMzAgbXNlYworCQlzdHJ1Y3QgdGltZXNwZWMgdGltZW91dCA9IHsgMCwgMTAwMDAwMDAgfTsgLy8gMTAgbXNlYwogCiAJCS8qIHdlIGhhdmUgcGF5bG9hZHMgZW5jYXBzdWxhdGVkIGluIFRTICovCiAJCWRwcmludGsoIiVzOiBhbGxvYyB0c2ZlZWRcbiIsIF9fRlVOQ1RJT05fXyk7CkBAIC05NTYsMTAgKzEwMzEsMTMgQEAKIAogCQkvKiBTZXQgbmV0ZGV2aWNlIHBvaW50ZXIgZm9yIHRzIGRlY2FwcyBjYWxsYmFjay4gKi8KIAkJcHJpdi0+dHNmZWVkLT5wcml2ID0gKHZvaWQgKilkZXY7Ci0JCXJldCA9IHByaXYtPnRzZmVlZC0+c2V0KHByaXYtPnRzZmVlZCwgcHJpdi0+cGlkLAotCQkJCQlUU19QQUNLRVQsIERNWF9UU19QRVNfT1RIRVIsCisJCXJldCA9IHByaXYtPnRzZmVlZC0+c2V0KHByaXYtPnRzZmVlZCwKKwkJCQkJcHJpdi0+cGlkLCAvKiBwaWQgKi8KKwkJCQkJVFNfUEFDS0VULCAvKiB0eXBlICovCisJCQkJCURNWF9UU19QRVNfT1RIRVIsIC8qIHBlcyB0eXBlICovCiAJCQkJCTMyNzY4LCAgICAgLyogY2lyY3VsYXIgYnVmZmVyIHNpemUgKi8KLQkJCQkJdGltZW91dCk7CisJCQkJCXRpbWVvdXQgICAgLyogdGltZW91dCAqLworCQkJCQkpOwogCiAJCWlmIChyZXQgPCAwKSB7CiAJCQlwcmludGsoIiVzOiBjb3VsZCBub3Qgc2V0IHRzIGZlZWRcbiIsIGRldi0+bmFtZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJkZXYuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2YmRldi5jCmluZGV4IDM4NTI0MzAuLjEzNGMyYmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2YmRldi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2YmRldi5jCkBAIC0yMzYsNyArMjM2LDcgQEAKIAkJCSJkdmIvYWRhcHRlciVkLyVzJWQiLCBhZGFwLT5udW0sIGRuYW1lc1t0eXBlXSwgaWQpOwogCiAJY2xhc3NfZGV2aWNlX2NyZWF0ZShkdmJfY2xhc3MsIE5VTEwsIE1LREVWKERWQl9NQUpPUiwgbnVtczJtaW5vcihhZGFwLT5udW0sIHR5cGUsIGlkKSksCi0JCQkgICAgTlVMTCwgImR2YiVkLiVzJWQiLCBhZGFwLT5udW0sIGRuYW1lc1t0eXBlXSwgaWQpOworCQkJICAgIGFkYXAtPmRldmljZSwgImR2YiVkLiVzJWQiLCBhZGFwLT5udW0sIGRuYW1lc1t0eXBlXSwgaWQpOwogCiAJZHByaW50aygiRFZCOiByZWdpc3RlciBhZGFwdGVyJWQvJXMlZCBAIG1pbm9yOiAlaSAoMHglMDJ4KVxuIiwKIAkJYWRhcC0+bnVtLCBkbmFtZXNbdHlwZV0sIGlkLCBudW1zMm1pbm9yKGFkYXAtPm51bSwgdHlwZSwgaWQpLApAQCAtMjg1LDcgKzI4NSw3IEBACiB9CiAKIAotaW50IGR2Yl9yZWdpc3Rlcl9hZGFwdGVyKHN0cnVjdCBkdmJfYWRhcHRlciAqYWRhcCwgY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IG1vZHVsZSAqbW9kdWxlKQoraW50IGR2Yl9yZWdpc3Rlcl9hZGFwdGVyKHN0cnVjdCBkdmJfYWRhcHRlciAqYWRhcCwgY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IG1vZHVsZSAqbW9kdWxlLCBzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCiB7CiAJaW50IG51bTsKIApAQCAtMzA2LDYgKzMwNiw3IEBACiAJYWRhcC0+bnVtID0gbnVtOwogCWFkYXAtPm5hbWUgPSBuYW1lOwogCWFkYXAtPm1vZHVsZSA9IG1vZHVsZTsKKwlhZGFwLT5kZXZpY2UgPSBkZXZpY2U7CiAKIAlsaXN0X2FkZF90YWlsICgmYWRhcC0+bGlzdF9oZWFkLCAmZHZiX2FkYXB0ZXJfbGlzdCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2YmRldi5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiZGV2LmgKaW5kZXggNzRlZDU4NS4uZDdhOTc2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiZGV2LmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiZGV2LmgKQEAgLTUxLDYgKzUxLDggQEAKIAl1OCBwcm9wb3NlZF9tYWMgWzZdOwogCXZvaWQqIHByaXY7CiAKKwlzdHJ1Y3QgZGV2aWNlICpkZXZpY2U7CisKIAlzdHJ1Y3QgbW9kdWxlICptb2R1bGU7CiB9OwogCkBAIC03Niw3ICs3OCw3IEBACiB9OwogCiAKLWV4dGVybiBpbnQgZHZiX3JlZ2lzdGVyX2FkYXB0ZXIgKHN0cnVjdCBkdmJfYWRhcHRlciAqYWRhcCwgY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IG1vZHVsZSAqbW9kdWxlKTsKK2V4dGVybiBpbnQgZHZiX3JlZ2lzdGVyX2FkYXB0ZXIgKHN0cnVjdCBkdmJfYWRhcHRlciAqYWRhcCwgY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IG1vZHVsZSAqbW9kdWxlLCBzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpOwogZXh0ZXJuIGludCBkdmJfdW5yZWdpc3Rlcl9hZGFwdGVyIChzdHJ1Y3QgZHZiX2FkYXB0ZXIgKmFkYXApOwogCiBleHRlcm4gaW50IGR2Yl9yZWdpc3Rlcl9kZXZpY2UgKHN0cnVjdCBkdmJfYWRhcHRlciAqYWRhcCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvS2NvbmZpZwppbmRleCBlMzg4ZmIxLi4zYmM2NzIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9LY29uZmlnCkBAIC04OCw2ICs4OCw3IEBACiAJc2VsZWN0IERWQl9DWDIyNzAyCiAJc2VsZWN0IERWQl9MR0RUMzMwWAogCXNlbGVjdCBEVkJfTVQzNTIKKwlzZWxlY3QgRFZCX1pMMTAzNTMKIAloZWxwCiAJICBTYXkgWSBoZXJlIHRvIHN1cHBvcnQgdGhlIENvbmV4YW50IFVTQjIuMCBoeWJyaWQgcmVmZXJlbmNlIGRlc2lnbi4KIAkgIEN1cnJlbnRseSwgb25seSBEVkIgYW5kIEFUU0MgbW9kZXMgYXJlIHN1cHBvcnRlZCwgYW5hbG9nIG1vZGUKQEAgLTEzMCw2ICsxMzEsMTUgQEAKIAogCSAgRFZCLVMgVVNCMi4wIHJlY2VpdmVycy4KIAorY29uZmlnIERWQl9VU0JfR1A4UFNLCisJdHJpc3RhdGUgIkdFTlBJWCA4UFNLLT5VU0IgbW9kdWxlIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBEVkJfVVNCCisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBzdXBwb3J0IHRoZQorCSAgICBHRU5QSVggOHBzayBtb2R1bGUKKworCSAgRFZCLVMgVVNCMi4wIHJlY2VpdmVycy4KKwogY29uZmlnIERWQl9VU0JfTk9WQV9UX1VTQjIKIAl0cmlzdGF0ZSAiSGF1cHBhdWdlIFdpblRWLU5PVkEtVCB1c2IyIERWQi1UIFVTQjIuMCBzdXBwb3J0IgogCWRlcGVuZHMgb24gRFZCX1VTQgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvTWFrZWZpbGUKaW5kZXggMmRjOWFhZC4uOTY0M2Y1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL01ha2VmaWxlCkBAIC03LDYgKzcsOSBAQAogZHZiLXVzYi12cDcwMngtb2JqcyA9IHZwNzAyeC5vIHZwNzAyeC1mZS5vCiBvYmotJChDT05GSUdfRFZCX1VTQl9WUDcwMlgpICs9IGR2Yi11c2ItdnA3MDJ4Lm8KIAorZHZiLXVzYi1ncDhwc2stb2JqcyA9IGdwOHBzay5vIGdwOHBzay1mZS5vCitvYmotJChDT05GSUdfRFZCX1VTQl9HUDhQU0spICs9IGR2Yi11c2ItZ3A4cHNrLm8KKwogZHZiLXVzYi1kdHQyMDB1LW9ianMgPSBkdHQyMDB1Lm8gZHR0MjAwdS1mZS5vCiBvYmotJChDT05GSUdfRFZCX1VTQl9EVFQyMDBVKSArPSBkdmItdXNiLWR0dDIwMHUubwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2N4dXNiLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2N4dXNiLmMKaW5kZXggMWYwZDNlOS4uYWUyM2JkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9jeHVzYi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvY3h1c2IuYwpAQCAtMjcsOCArMjcsMTAgQEAKIAogI2luY2x1ZGUgImN4MjI3MDIuaCIKICNpbmNsdWRlICJsZ2R0MzMweC5oIgorI2luY2x1ZGUgImxnX2gwNnhmLmgiCiAjaW5jbHVkZSAibXQzNTIuaCIKICNpbmNsdWRlICJtdDM1Ml9wcml2LmgiCisjaW5jbHVkZSAiemwxMDM1My5oIgogCiAvKiBkZWJ1ZyAqLwogaW50IGR2Yl91c2JfY3h1c2JfZGVidWc7CkBAIC0zMjIsMzIgKzMyNCwzNyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGN4dXNiX2xnaDA2NGZfdHVuZXJfc2V0X3BhcmFtcyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwkJCQkJICBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKmZlcCkKK3sKKwlzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQgPSBmZS0+ZHZiLT5wcml2OworCXJldHVybiBsZ19oMDZ4Zl9wbGxfc2V0KGZlLCAmZC0+aTJjX2FkYXAsIGZlcCk7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgY3gyMjcwMl9jb25maWcgY3h1c2JfY3gyMjcwMl9jb25maWcgPSB7CiAJLmRlbW9kX2FkZHJlc3MgPSAweDYzLAogCiAJLm91dHB1dF9tb2RlID0gQ1gyMjcwMl9QQVJBTExFTF9PVVRQVVQsCi0KLQkucGxsX2luaXQgPSBkdmJfdXNiX3BsbF9pbml0X2kyYywKLQkucGxsX3NldCAgPSBkdmJfdXNiX3BsbF9zZXRfaTJjLAogfTsKIAogc3RhdGljIHN0cnVjdCBsZ2R0MzMweF9jb25maWcgY3h1c2JfbGdkdDMzMDNfY29uZmlnID0gewogCS5kZW1vZF9hZGRyZXNzID0gMHgwZSwKIAkuZGVtb2RfY2hpcCAgICA9IExHRFQzMzAzLAotCS5wbGxfc2V0ICAgICAgID0gZHZiX3VzYl9wbGxfc2V0X2kyYywKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgbXQzNTJfY29uZmlnIGN4dXNiX2RlZTE2MDFfY29uZmlnID0gewogCS5kZW1vZF9hZGRyZXNzID0gMHgwZiwKIAkuZGVtb2RfaW5pdCAgICA9IGN4dXNiX2RlZTE2MDFfZGVtb2RfaW5pdCwKLQkucGxsX3NldCAgICAgICA9IGR2Yl91c2JfcGxsX3NldCwKIH07CiAKLXN0cnVjdCBtdDM1Ml9jb25maWcgY3h1c2JfbXQzNTJfY29uZmlnID0geworc3RhdGljIHN0cnVjdCB6bDEwMzUzX2NvbmZpZyBjeHVzYl96bDEwMzUzX2RlZTE2MDFfY29uZmlnID0geworCS5kZW1vZF9hZGRyZXNzID0gMHgwZiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbXQzNTJfY29uZmlnIGN4dXNiX210MzUyX2NvbmZpZyA9IHsKIAkvKiB1c2VkIGluIGJvdGggbGd6MjAxIGFuZCB0aDc1NzkgKi8KIAkuZGVtb2RfYWRkcmVzcyA9IDB4MGYsCiAJLmRlbW9kX2luaXQgICAgPSBjeHVzYl9tdDM1Ml9kZW1vZF9pbml0LAotCS5wbGxfc2V0ICAgICAgID0gZHZiX3VzYl9wbGxfc2V0LAogfTsKIAogLyogQ2FsbGJhY2tzIGZvciBEVkIgVVNCICovCkBAIC0zNTcsMTcgKzM2NCwxMCBAQAogCWQtPnBsbF9hZGRyID0gMHg2MTsKIAltZW1jcHkoZC0+cGxsX2luaXQsIGJwbGwsIDQpOwogCWQtPnBsbF9kZXNjID0gJmR2Yl9wbGxfZm1kMTIxNm1lOwotCXJldHVybiAwOwotfQogCi1zdGF0aWMgaW50IGN4dXNiX2xnaDA2NGZfdHVuZXJfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCkKLXsKLQl1OCBicGxsWzRdID0geyAweDAwLCAweDAwLCAweDE4LCAweDUwIH07Ci0JLyogYnBsbFsyXSA6IHVuc2V0IGJpdCAzLCBzZXQgYml0cyA0JjUKLQkgICBicGxsWzNdIDogMHg1MCAtIGRpZ2l0YWwsIDB4MjAgLSBhbmFsb2cgKi8KLQlkLT5wbGxfYWRkciA9IDB4NjE7Ci0JbWVtY3B5KGQtPnBsbF9pbml0LCBicGxsLCA0KTsKLQlkLT5wbGxfZGVzYyA9ICZkdmJfcGxsX3RkdnNfdHVhNjAzNDsKKwlkLT5mZS0+b3BzLnR1bmVyX29wcy5pbml0ID0gZHZiX3VzYl90dW5lcl9pbml0X2kyYzsKKwlkLT5mZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gZHZiX3VzYl90dW5lcl9zZXRfcGFyYW1zX2kyYzsKKwogCXJldHVybiAwOwogfQogCkBAIC0zNzUsNiArMzc1LDcgQEAKIHsKIAlkLT5wbGxfYWRkciA9IDB4NjE7CiAJZC0+cGxsX2Rlc2MgPSAmZHZiX3BsbF90aG9tc29uX2R0dDc1Nzk7CisJZC0+ZmUtPm9wcy50dW5lcl9vcHMuY2FsY19yZWdzID0gZHZiX3VzYl90dW5lcl9jYWxjX3JlZ3M7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTM4Miw2ICszODMsNyBAQAogewogCWQtPnBsbF9hZGRyID0gMHg2MTsKIAlkLT5wbGxfZGVzYyA9ICZkdmJfcGxsX2xnX3oyMDE7CisJZC0+ZmUtPm9wcy50dW5lcl9vcHMuY2FsY19yZWdzID0gZHZiX3VzYl90dW5lcl9jYWxjX3JlZ3M7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTM4OSw2ICszOTEsMTMgQEAKIHsKIAlkLT5wbGxfYWRkciA9IDB4NjA7CiAJZC0+cGxsX2Rlc2MgPSAmZHZiX3BsbF90aG9tc29uX2R0dDc1Nzk7CisJZC0+ZmUtPm9wcy50dW5lcl9vcHMuY2FsY19yZWdzID0gZHZiX3VzYl90dW5lcl9jYWxjX3JlZ3M7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3h1c2JfbGdkdDMzMDNfdHVuZXJfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCkKK3sKKwlkLT5mZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gY3h1c2JfbGdoMDY0Zl90dW5lcl9zZXRfcGFyYW1zOwogCXJldHVybiAwOwogfQogCkBAIC00MzksNyArNDQ4LDggQEAKIAogCWN4dXNiX2N0cmxfbXNnKGQsQ01EX0RJR0lUQUwsIE5VTEwsIDAsIE5VTEwsIDApOwogCi0JaWYgKChkLT5mZSA9IG10MzUyX2F0dGFjaCgmY3h1c2JfZGVlMTYwMV9jb25maWcsICZkLT5pMmNfYWRhcCkpICE9IE5VTEwpCisJaWYgKCgoZC0+ZmUgPSBtdDM1Ml9hdHRhY2goJmN4dXNiX2RlZTE2MDFfY29uZmlnLCAmZC0+aTJjX2FkYXApKSAhPSBOVUxMKSB8fAorCSAgICAoKGQtPmZlID0gemwxMDM1M19hdHRhY2goJmN4dXNiX3psMTAzNTNfZGVlMTYwMV9jb25maWcsICZkLT5pMmNfYWRhcCkpICE9IE5VTEwpKQogCQlyZXR1cm4gMDsKIAogCXJldHVybiAtRUlPOwpAQCAtNTU1LDcgKzU2NSw3IEBACiAJLnN0cmVhbWluZ19jdHJsICAgPSBjeHVzYl9zdHJlYW1pbmdfY3RybCwKIAkucG93ZXJfY3RybCAgICAgICA9IGN4dXNiX2JsdWViaXJkX3Bvd2VyX2N0cmwsCiAJLmZyb250ZW5kX2F0dGFjaCAgPSBjeHVzYl9sZ2R0MzMwM19mcm9udGVuZF9hdHRhY2gsCi0JLnR1bmVyX2F0dGFjaCAgICAgPSBjeHVzYl9sZ2gwNjRmX3R1bmVyX2F0dGFjaCwKKwkudHVuZXJfYXR0YWNoICAgICA9IGN4dXNiX2xnZHQzMzAzX3R1bmVyX2F0dGFjaCwKIAogCS5pMmNfYWxnbyAgICAgICAgID0gJmN4dXNiX2kyY19hbGdvLAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpYnVzYi1jb21tb24uYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGlidXNiLWNvbW1vbi5jCmluZGV4IDJkNTJiNzYuLmFiZDc1YjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGlidXNiLWNvbW1vbi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGlidXNiLWNvbW1vbi5jCkBAIC0xNzMsMTEgKzE3MywxMCBAQAogCXN0cnVjdCBkaWIzMDAwX2NvbmZpZyBkZW1vZF9jZmc7CiAJc3RydWN0IGRpYnVzYl9zdGF0ZSAqc3QgPSBkLT5wcml2OwogCi0JZGVtb2RfY2ZnLnBsbF9zZXQgPSBkdmJfdXNiX3BsbF9zZXRfaTJjOwotCWRlbW9kX2NmZy5wbGxfaW5pdCA9IGR2Yl91c2JfcGxsX2luaXRfaTJjOwotCiAJZm9yIChkZW1vZF9jZmcuZGVtb2RfYWRkcmVzcyA9IDB4ODsgZGVtb2RfY2ZnLmRlbW9kX2FkZHJlc3MgPCAweGQ7IGRlbW9kX2NmZy5kZW1vZF9hZGRyZXNzKyspCiAJCWlmICgoZC0+ZmUgPSBkaWIzMDAwbWNfYXR0YWNoKCZkZW1vZF9jZmcsJmQtPmkyY19hZGFwLCZzdC0+b3BzKSkgIT0gTlVMTCkgeworCQkJZC0+ZmUtPm9wcy50dW5lcl9vcHMuaW5pdCA9IGR2Yl91c2JfdHVuZXJfaW5pdF9pMmM7CisJCQlkLT5mZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gZHZiX3VzYl90dW5lcl9zZXRfcGFyYW1zX2kyYzsKIAkJCWQtPnR1bmVyX3Bhc3NfY3RybCA9IHN0LT5vcHMudHVuZXJfcGFzc19jdHJsOwogCQkJcmV0dXJuIDA7CiAJCX0KQEAgLTE5MCw2ICsxODksMTAgQEAKIHsKIAlkLT5wbGxfYWRkciA9IDB4NjA7CiAJZC0+cGxsX2Rlc2MgPSAmZHZiX3BsbF9lbnY1N2gxeGQ1OworCisJZC0+ZmUtPm9wcy50dW5lcl9vcHMuaW5pdCA9IGR2Yl91c2JfdHVuZXJfaW5pdF9pMmM7CisJZC0+ZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IGR2Yl91c2JfdHVuZXJfc2V0X3BhcmFtc19pMmM7CisKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0woZGlidXNiX2RpYjMwMDBtY190dW5lcl9hdHRhY2gpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWJ1c2ItbWIuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGlidXNiLW1iLmMKaW5kZXggZGQ1YTEzMS4uZjRjNDVmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWJ1c2ItbWIuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpYnVzYi1tYi5jCkBAIC0yMCwxMSArMjAsMTIgQEAKIAlzdHJ1Y3QgZGlidXNiX3N0YXRlICpzdCA9IGQtPnByaXY7CiAKIAlkZW1vZF9jZmcuZGVtb2RfYWRkcmVzcyA9IDB4ODsKLQlkZW1vZF9jZmcucGxsX3NldCA9IGR2Yl91c2JfcGxsX3NldF9pMmM7Ci0JZGVtb2RfY2ZnLnBsbF9pbml0ID0gZHZiX3VzYl9wbGxfaW5pdF9pMmM7CiAKLQlpZiAoKGQtPmZlID0gZGliMzAwMG1iX2F0dGFjaCgmZGVtb2RfY2ZnLCZkLT5pMmNfYWRhcCwmc3QtPm9wcykpID09IE5VTEwpCisJaWYgKChkLT5mZSA9IGRpYjMwMDBtYl9hdHRhY2goJmRlbW9kX2NmZywmZC0+aTJjX2FkYXAsJnN0LT5vcHMpKSA9PSBOVUxMKSB7CisJCWQtPmZlLT5vcHMudHVuZXJfb3BzLmluaXQgPSBkdmJfdXNiX3R1bmVyX2luaXRfaTJjOworCQlkLT5mZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gZHZiX3VzYl90dW5lcl9zZXRfcGFyYW1zX2kyYzsKIAkJcmV0dXJuIC1FTk9ERVY7CisJfQogCiAJZC0+dHVuZXJfcGFzc19jdHJsID0gc3QtPm9wcy50dW5lcl9wYXNzX2N0cmw7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGlnaXR2LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpZ2l0di5jCmluZGV4IDkxMTM2YzAuLmMxNGQ5ZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGlnaXR2LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWdpdHYuYwpAQCAtMTEyLDI3ICsxMTIsMzAgQEAKIAogc3RhdGljIHN0cnVjdCBtdDM1Ml9jb25maWcgZGlnaXR2X210MzUyX2NvbmZpZyA9IHsKIAkuZGVtb2RfaW5pdCA9IGRpZ2l0dl9tdDM1Ml9kZW1vZF9pbml0LAotCS5wbGxfc2V0ID0gZHZiX3VzYl9wbGxfc2V0LAogfTsKIAotc3RhdGljIGludCBkaWdpdHZfbnh0NjAwMF9wbGxfc2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKmZlcCkKK3N0YXRpYyBpbnQgZGlnaXR2X254dDYwMDBfdHVuZXJfc2V0X3BhcmFtcyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpmZXApCiB7CiAJc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkID0gZmUtPmR2Yi0+cHJpdjsKIAl1OCBiWzVdOwotCWR2Yl91c2JfcGxsX3NldChmZSxmZXAsYik7CisJZHZiX3VzYl90dW5lcl9jYWxjX3JlZ3MoZmUsZmVwLGIsIDUpOwogCXJldHVybiBkaWdpdHZfY3RybF9tc2coZCxVU0JfV1JJVEVfVFVORVIsMCwmYlsxXSw0LE5VTEwsMCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgbnh0NjAwMF9jb25maWcgZGlnaXR2X254dDYwMDBfY29uZmlnID0gewogCS5jbG9ja19pbnZlcnNpb24gPSAxLAotCS5wbGxfc2V0ID0gZGlnaXR2X254dDYwMDBfcGxsX3NldCwKIH07CiAKIHN0YXRpYyBpbnQgZGlnaXR2X2Zyb250ZW5kX2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQpCiB7Ci0JaWYgKChkLT5mZSA9IG10MzUyX2F0dGFjaCgmZGlnaXR2X210MzUyX2NvbmZpZywgJmQtPmkyY19hZGFwKSkgIT0gTlVMTCB8fAotCQkoZC0+ZmUgPSBueHQ2MDAwX2F0dGFjaCgmZGlnaXR2X254dDYwMDBfY29uZmlnLCAmZC0+aTJjX2FkYXApKSAhPSBOVUxMKQorCWlmICgoZC0+ZmUgPSBtdDM1Ml9hdHRhY2goJmRpZ2l0dl9tdDM1Ml9jb25maWcsICZkLT5pMmNfYWRhcCkpICE9IE5VTEwpIHsKKwkJZC0+ZmUtPm9wcy50dW5lcl9vcHMuY2FsY19yZWdzID0gZHZiX3VzYl90dW5lcl9jYWxjX3JlZ3M7CiAJCXJldHVybiAwOworCX0KKwlpZiAoKGQtPmZlID0gbnh0NjAwMF9hdHRhY2goJmRpZ2l0dl9ueHQ2MDAwX2NvbmZpZywgJmQtPmkyY19hZGFwKSkgIT0gTlVMTCkgeworCQlkLT5mZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gZGlnaXR2X254dDYwMDBfdHVuZXJfc2V0X3BhcmFtczsKKwkJcmV0dXJuIDA7CisJfQogCXJldHVybiAtRUlPOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R0dDIwMHUtZmUuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHR0MjAwdS1mZS5jCmluZGV4IGNkMjFkZGIuLjE3NDEzYWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHR0MjAwdS1mZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHR0MjAwdS1mZS5jCkBAIC0xOCw3ICsxOCw2IEBACiAKIAlzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgZmVwOwogCXN0cnVjdCBkdmJfZnJvbnRlbmQgZnJvbnRlbmQ7Ci0Jc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMgb3BzOwogfTsKIAogc3RhdGljIGludCBkdHQyMDB1X2ZlX3JlYWRfc3RhdHVzKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBmZV9zdGF0dXNfdCAqc3RhdCkKQEAgLTE2MywxNiArMTYyLDEzIEBACiAJZGViX2luZm8oImF0dGFjaGluZyBmcm9udGVuZCBkdHQyMDB1XG4iKTsKIAogCXN0YXRlLT5kID0gZDsKLQltZW1jcHkoJnN0YXRlLT5vcHMsJmR0dDIwMHVfZmVfb3BzLHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOwogCi0Jc3RhdGUtPmZyb250ZW5kLm9wcyA9ICZzdGF0ZS0+b3BzOworCW1lbWNweSgmc3RhdGUtPmZyb250ZW5kLm9wcywmZHR0MjAwdV9mZV9vcHMsc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzKSk7CiAJc3RhdGUtPmZyb250ZW5kLmRlbW9kdWxhdG9yX3ByaXYgPSBzdGF0ZTsKIAotCWdvdG8gc3VjY2VzczsKKwlyZXR1cm4gJnN0YXRlLT5mcm9udGVuZDsKIGVycm9yOgogCXJldHVybiBOVUxMOwotc3VjY2VzczoKLQlyZXR1cm4gJnN0YXRlLT5mcm9udGVuZDsKIH0KIAogc3RhdGljIHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzIGR0dDIwMHVfZmVfb3BzID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLWR2Yi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLWR2Yi5jCmluZGV4IDZmYTkyMTAuLmVjNjMxNzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi1kdmIuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2ItZHZiLmMKQEAgLTgyLDcgKzgyLDcgQEAKIAlpbnQgcmV0OwogCiAJaWYgKChyZXQgPSBkdmJfcmVnaXN0ZXJfYWRhcHRlcigmZC0+ZHZiX2FkYXAsIGQtPmRlc2MtPm5hbWUsCi0JCQlkLT5vd25lcikpIDwgMCkgeworCQkJZC0+b3duZXIsICZkLT51ZGV2LT5kZXYpKSA8IDApIHsKIAkJZGViX2luZm8oImR2Yl9yZWdpc3Rlcl9hZGFwdGVyIGZhaWxlZDogZXJyb3IgJWQiLCByZXQpOwogCQlnb3RvIGVycjsKIAl9CkBAIC0xMjEsMTYgKzEyMSwxNSBAQAogCiAJZHZiX25ldF9pbml0KCZkLT5kdmJfYWRhcCwgJmQtPmR2Yl9uZXQsICZkLT5kZW11eC5kbXgpOwogCi0JZ290byBzdWNjZXNzOworCWQtPnN0YXRlIHw9IERWQl9VU0JfU1RBVEVfRFZCOworCXJldHVybiAwOworCiBlcnJfZG14X2RldjoKIAlkdmJfZG14X3JlbGVhc2UoJmQtPmRlbXV4KTsKIGVycl9kbXg6CiAJZHZiX3VucmVnaXN0ZXJfYWRhcHRlcigmZC0+ZHZiX2FkYXApOwogZXJyOgogCXJldHVybiByZXQ7Ci1zdWNjZXNzOgotCWQtPnN0YXRlIHw9IERWQl9VU0JfU1RBVEVfRFZCOwotCXJldHVybiAwOwogfQogCiBpbnQgZHZiX3VzYl9kdmJfZXhpdChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQpCkBAIC0xODQsMTMgKzE4MywxMyBAQAogCiAJLyogcmUtYXNzaWduIHNsZWVwIGFuZCB3YWtldXAgZnVuY3Rpb25zICovCiAJaWYgKGQtPmZlICE9IE5VTEwpIHsKLQkJZC0+ZmVfaW5pdCA9IGQtPmZlLT5vcHMtPmluaXQ7ICAgZC0+ZmUtPm9wcy0+aW5pdCAgPSBkdmJfdXNiX2ZlX3dha2V1cDsKLQkJZC0+ZmVfc2xlZXAgPSBkLT5mZS0+b3BzLT5zbGVlcDsgZC0+ZmUtPm9wcy0+c2xlZXAgPSBkdmJfdXNiX2ZlX3NsZWVwOworCQlkLT5mZV9pbml0ID0gZC0+ZmUtPm9wcy5pbml0OyAgIGQtPmZlLT5vcHMuaW5pdCAgPSBkdmJfdXNiX2ZlX3dha2V1cDsKKwkJZC0+ZmVfc2xlZXAgPSBkLT5mZS0+b3BzLnNsZWVwOyBkLT5mZS0+b3BzLnNsZWVwID0gZHZiX3VzYl9mZV9zbGVlcDsKIAogCQlpZiAoZHZiX3JlZ2lzdGVyX2Zyb250ZW5kKCZkLT5kdmJfYWRhcCwgZC0+ZmUpKSB7CiAJCQllcnIoIkZyb250ZW5kIHJlZ2lzdHJhdGlvbiBmYWlsZWQuIik7Ci0JCQlpZiAoZC0+ZmUtPm9wcy0+cmVsZWFzZSkKLQkJCQlkLT5mZS0+b3BzLT5yZWxlYXNlKGQtPmZlKTsKKwkJCWlmIChkLT5mZS0+b3BzLnJlbGVhc2UpCisJCQkJZC0+ZmUtPm9wcy5yZWxlYXNlKGQtPmZlKTsKIAkJCWQtPmZlID0gTlVMTDsKIAkJCXJldHVybiAtRU5PREVWOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2ItaTJjLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2ItaTJjLmMKaW5kZXggOWIyNTQ1My4uNmI2MTFhNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLWkyYy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi1pMmMuYwpAQCAtNDYsNyArNDYsNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQgZHZiX3VzYl9wbGxfaW5pdF9pMmMoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCitpbnQgZHZiX3VzYl90dW5lcl9pbml0X2kyYyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKIHsKIAlzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQgPSBmZS0+ZHZiLT5wcml2OwogCXN0cnVjdCBpMmNfbXNnIG1zZyA9IHsgLmFkZHIgPSBkLT5wbGxfYWRkciwgLmZsYWdzID0gMCwgLmJ1ZiA9IGQtPnBsbF9pbml0LCAubGVuID0gNCB9OwpAQCAtNjMsNiArNjMsOCBAQAogCWRlYl9wbGwoInBsbC1idWY6ICV4ICV4ICV4ICV4XG4iLGQtPnBsbF9pbml0WzBdLGQtPnBsbF9pbml0WzFdLAogCQkJZC0+cGxsX2luaXRbMl0sZC0+cGxsX2luaXRbM10pOwogCisJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKIAlpZiAoaTJjX3RyYW5zZmVyICgmZC0+aTJjX2FkYXAsICZtc2csIDEpICE9IDEpIHsKIAkJZXJyKCJ0dW5lciBpMmMgd3JpdGUgZmFpbGVkIGZvciBwbGxfaW5pdC4iKTsKIAkJcmV0ID0gLUVSRU1PVEVJTzsKQEAgLTczLDM4ICs3NSw0MiBAQAogCQlkLT50dW5lcl9wYXNzX2N0cmwoZmUsMCxkLT5wbGxfYWRkcik7CiAJcmV0dXJuIHJldDsKIH0KLUVYUE9SVF9TWU1CT0woZHZiX3VzYl9wbGxfaW5pdF9pMmMpOworRVhQT1JUX1NZTUJPTChkdmJfdXNiX3R1bmVyX2luaXRfaTJjKTsKIAotaW50IGR2Yl91c2JfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpmZXAsIHU4IGJbNV0pCitpbnQgZHZiX3VzYl90dW5lcl9jYWxjX3JlZ3Moc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqZmVwLCB1OCAqYiwgaW50IGJ1Zl9sZW4pCiB7CiAJc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkID0gZmUtPmR2Yi0+cHJpdjsKIAorCWlmIChidWZfbGVuICE9IDUpCisJCXJldHVybiAtRUlOVkFMOwogCWlmIChkLT5wbGxfZGVzYyA9PSBOVUxMKQogCQlyZXR1cm4gMDsKIAogCWRlYl9wbGwoInBsbCBhZGRyOiAleCwgZnJlcTogJWQgJXBcbiIsZC0+cGxsX2FkZHIsZmVwLT5mcmVxdWVuY3ksZC0+cGxsX2Rlc2MpOwogCi0JYlswXSA9IGQtPnBsbF9hZGRyIDw8IDE7CisJYlswXSA9IGQtPnBsbF9hZGRyOwogCWR2Yl9wbGxfY29uZmlndXJlKGQtPnBsbF9kZXNjLCZiWzFdLGZlcC0+ZnJlcXVlbmN5LGZlcC0+dS5vZmRtLmJhbmR3aWR0aCk7CiAKIAlkZWJfcGxsKCJwbGwtYnVmOiAleCAleCAleCAleCAleFxuIixiWzBdLGJbMV0sYlsyXSxiWzNdLGJbNF0pOwogCi0JcmV0dXJuIDA7CisJcmV0dXJuIDU7CiB9Ci1FWFBPUlRfU1lNQk9MKGR2Yl91c2JfcGxsX3NldCk7CitFWFBPUlRfU1lNQk9MKGR2Yl91c2JfdHVuZXJfY2FsY19yZWdzKTsKIAotaW50IGR2Yl91c2JfcGxsX3NldF9pMmMoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqZmVwKQoraW50IGR2Yl91c2JfdHVuZXJfc2V0X3BhcmFtc19pMmMoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqZmVwKQogewogCXN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCA9IGZlLT5kdmItPnByaXY7CiAJaW50IHJldCA9IDA7CiAJdTggYls1XTsKIAlzdHJ1Y3QgaTJjX21zZyBtc2cgPSB7IC5hZGRyID0gZC0+cGxsX2FkZHIsIC5mbGFncyA9IDAsIC5idWYgPSAmYlsxXSwgLmxlbiA9IDQgfTsKIAotCWR2Yl91c2JfcGxsX3NldChmZSxmZXAsYik7CisJZHZiX3VzYl90dW5lcl9jYWxjX3JlZ3MoZmUsZmVwLGIsNSk7CiAKIAlpZiAoZC0+dHVuZXJfcGFzc19jdHJsKQogCQlkLT50dW5lcl9wYXNzX2N0cmwoZmUsMSxkLT5wbGxfYWRkcik7CiAKKwlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDEpOwogCWlmIChpMmNfdHJhbnNmZXIgKCZkLT5pMmNfYWRhcCwgJm1zZywgMSkgIT0gMSkgewogCQllcnIoInR1bmVyIGkyYyB3cml0ZSBmYWlsZWQgZm9yIHBsbF9zZXQuIik7CiAJCXJldCA9IC1FUkVNT1RFSU87CkBAIC0xMTYsNCArMTIyLDQgQEAKIAogCXJldHVybiByZXQ7CiB9Ci1FWFBPUlRfU1lNQk9MKGR2Yl91c2JfcGxsX3NldF9pMmMpOworRVhQT1JUX1NZTUJPTChkdmJfdXNiX3R1bmVyX3NldF9wYXJhbXNfaTJjKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi1pZHMuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi1pZHMuaAppbmRleCBjYjIzOTA0Li45NTY5ODkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2ItaWRzLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLWlkcy5oCkBAIC0zMSw2ICszMSw3IEBACiAjZGVmaW5lIFVTQl9WSURfVklTSU9OUExVUwkJCQkJMHgxM2QzCiAjZGVmaW5lIFVTQl9WSURfVFdJTkhBTgkJCQkJCTB4MTgyMgogI2RlZmluZSBVU0JfVklEX1VMVElNQV9FTEVDVFJPTklDCQkJMHgwNWQ4CisjZGVmaW5lIFVTQl9WSURfR0VOUElYCQkJCQkweDA5YzAKIAogLyogUHJvZHVjdCBJRHMgKi8KICNkZWZpbmUgVVNCX1BJRF9BRFNURUNIX1VTQjJfQ09MRAkJCTB4YTMzMwpAQCAtMTA0LDUgKzEwNSw2IEBACiAjZGVmaW5lIFVTQl9QSURfS1lFX0RWQl9UX1dBUk0JCQkJMHg3MDFmCiAjZGVmaW5lIFVTQl9QSURfUENUVl8yMDBFCQkJCQkweDAyMGUKICNkZWZpbmUgVVNCX1BJRF9QQ1RWXzQwMEUJCQkJCTB4MDIwZgotCisjZGVmaW5lIFVTQl9QSURfR0VOUElYXzhQU0tfQ09MRAkJCQkweDAyMDAKKyNkZWZpbmUgVVNCX1BJRF9HRU5QSVhfOFBTS19XQVJNCQkJCTB4MDIwMQogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2IuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi5oCmluZGV4IGZlYWQ5NTguLjRjZjlmODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi5oCkBAIC0zMzAsOSArMzMwLDkgQEAKIGV4dGVybiBpbnQgZHZiX3VzYl9uZWNfcmNfa2V5X3RvX2V2ZW50KHN0cnVjdCBkdmJfdXNiX2RldmljZSAqLCB1OFtdLCB1MzIgKiwgaW50ICopOwogCiAvKiBjb21tb25seSB1c2VkIHBsbCBpbml0IGFuZCBzZXQgZnVuY3Rpb25zICovCi1leHRlcm4gaW50IGR2Yl91c2JfcGxsX2luaXRfaTJjKHN0cnVjdCBkdmJfZnJvbnRlbmQgKik7Ci1leHRlcm4gaW50IGR2Yl91c2JfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kICosIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqLCB1OFtdKTsKLWV4dGVybiBpbnQgZHZiX3VzYl9wbGxfc2V0X2kyYyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICosIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqKTsKK2V4dGVybiBpbnQgZHZiX3VzYl90dW5lcl9pbml0X2kyYyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICopOworZXh0ZXJuIGludCBkdmJfdXNiX3R1bmVyX2NhbGNfcmVncyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICosIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqLCB1OCAqYnVmLCBpbnQgYnVmX2xlbik7CitleHRlcm4gaW50IGR2Yl91c2JfdHVuZXJfc2V0X3BhcmFtc19pMmMoc3RydWN0IGR2Yl9mcm9udGVuZCAqLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKik7CiAKIC8qIGNvbW1vbmx5IHVzZWQgZmlybXdhcmUgZG93bmxvYWQgdHlwZXMgYW5kIGZ1bmN0aW9uICovCiBzdHJ1Y3QgaGV4bGluZSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2dwOHBzay1mZS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9ncDhwc2stZmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2NiZGM5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9ncDhwc2stZmUuYwpAQCAtMCwwICsxLDI3MiBAQAorLyogRFZCIFVTQiBjb21wbGlhbnQgTGludXggZHJpdmVyIGZvciB0aGUKKyAqICAtIEdFTlBJWCA4cGtzL3Fwc2sgVVNCMi4wIERWQi1TIG1vZHVsZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBBbGFuIE5pc290YSAoYWxhbm5pc290YUBnbWFpbC5jb20pCisgKgorICogVGhhbmtzIHRvIEdFTlBJWCBmb3IgdGhlIHNhbXBsZSBjb2RlIHVzZWQgdG8gaW1wbGVtZW50IHRoaXMgbW9kdWxlLgorICoKKyAqIFRoaXMgbW9kdWxlIGlzIGJhc2VkIG9mZiB0aGUgdnA3MDQ1IGFuZCB2cDcwMnggbW9kdWxlcworICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKgl1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICoJU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorICoKKyAqIHNlZSBEb2N1bWVudGF0aW9uL2R2Yi9SRUFETUUuZHZiLXVzYiBmb3IgbW9yZSBpbmZvcm1hdGlvbgorICovCisjaW5jbHVkZSAiZ3A4cHNrLmgiCisKK3N0cnVjdCBncDhwc2tfZmVfc3RhdGUgeworCXN0cnVjdCBkdmJfZnJvbnRlbmQgZmU7CisKKwlzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQ7CisKKwl1MTYgc25yOworCisJdW5zaWduZWQgbG9uZyBuZXh0X3Nucl9jaGVjazsKK307CisKK3N0YXRpYyBpbnQgZ3A4cHNrX2ZlX3JlYWRfc3RhdHVzKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBmZV9zdGF0dXNfdCAqc3RhdHVzKQoreworCXN0cnVjdCBncDhwc2tfZmVfc3RhdGUgKnN0ID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJdTggbG9jazsKKworCWlmIChncDhwc2tfdXNiX2luX29wKHN0LT5kLCBHRVRfU0lHTkFMX0xPQ0ssIDAsIDAsICZsb2NrLDEpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChsb2NrKQorCQkqc3RhdHVzID0gRkVfSEFTX0xPQ0sgfCBGRV9IQVNfU1lOQyB8IEZFX0hBU19WSVRFUkJJIHwgRkVfSEFTX1NJR05BTCB8IEZFX0hBU19DQVJSSUVSOworCWVsc2UKKwkJKnN0YXR1cyA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworLyogbm90IHN1cHBvcnRlZCBieSB0aGlzIEZyb250ZW5kICovCitzdGF0aWMgaW50IGdwOHBza19mZV9yZWFkX2JlcihzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTMyICpiZXIpCit7CisJKHZvaWQpIGZlOworCSpiZXIgPSAwOworCXJldHVybiAwOworfQorCisvKiBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgRnJvbnRlbmQgKi8KK3N0YXRpYyBpbnQgZ3A4cHNrX2ZlX3JlYWRfdW5jX2Jsb2NrcyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTMyICp1bmMpCit7CisJKHZvaWQpIGZlOworCSp1bmMgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdwOHBza19mZV9yZWFkX3NucihzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTE2ICpzbnIpCit7CisJc3RydWN0IGdwOHBza19mZV9zdGF0ZSAqc3QgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwl1OCBidWZbMl07CisKKwlpZiAodGltZV9hZnRlcihqaWZmaWVzLHN0LT5uZXh0X3Nucl9jaGVjaykpIHsKKwkJZ3A4cHNrX3VzYl9pbl9vcChzdC0+ZCxHRVRfU0lHTkFMX1NUUkVOR1RILDAsMCxidWYsMik7CisJCSpzbnIgPSAoaW50KShidWZbMV0pIDw8IDggfCBidWZbMF07CisJCS8qIHNuciBpcyByZXBvcnRlZCBpbiBkQnUqMjU2ICovCisJCS8qIHNuciAvIDM4LjQgfj0gMTAwJSBzdHJlbmd0aCAqLworCQkvKiBzbnIgKiAxNyByZXR1cm5zIDEwMCUgc3RyZW5ndGggYXMgNjU1MzUgKi8KKwkJaWYgKCpzbnIgPD0gMzg1NSkKKwkJCSpzbnIgPSAoKnNucjw8NCkgKyAqc25yOyAvLyBzbnIgKiAxNworCQllbHNlCisJCQkqc25yID0gNjU1MzU7CisJCXN0LT5uZXh0X3Nucl9jaGVjayA9IGppZmZpZXMgKyAoMTAqSFopLzEwMDA7CisJfSBlbHNlIHsKKwkJKnNuciA9IHN0LT5zbnI7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdwOHBza19mZV9yZWFkX3NpZ25hbF9zdHJlbmd0aChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTE2ICpzdHJlbmd0aCkKK3sKKwlyZXR1cm4gZ3A4cHNrX2ZlX3JlYWRfc25yKGZlLCBzdHJlbmd0aCk7Cit9CisKK3N0YXRpYyBpbnQgZ3A4cHNrX2ZlX2dldF90dW5lX3NldHRpbmdzKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3R1bmVfc2V0dGluZ3MgKnR1bmUpCit7CisJdHVuZS0+bWluX2RlbGF5X21zID0gODAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdwOHBza19mZV9zZXRfZnJvbnRlbmQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsCisJCQkJICBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKmZlcCkKK3sKKwlzdHJ1Y3QgZ3A4cHNrX2ZlX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXU4IGNtZFsxMF07CisJdTMyIGZyZXEgPSBmZXAtPmZyZXF1ZW5jeSAqIDEwMDA7CisKKwljbWRbNF0gPSBmcmVxICAgICAgICAgJiAweGZmOworCWNtZFs1XSA9IChmcmVxID4+IDgpICAmIDB4ZmY7CisJY21kWzZdID0gKGZyZXEgPj4gMTYpICYgMHhmZjsKKwljbWRbN10gPSAoZnJlcSA+PiAyNCkgJiAweGZmOworCisJc3dpdGNoKGZlLT5vcHMuaW5mby50eXBlKSB7CisJY2FzZSBGRV9RUFNLOgorCQljbWRbMF0gPSAgZmVwLT51LnFwc2suc3ltYm9sX3JhdGUgICAgICAgICYgMHhmZjsKKwkJY21kWzFdID0gKGZlcC0+dS5xcHNrLnN5bWJvbF9yYXRlID4+ICA4KSAmIDB4ZmY7CisJCWNtZFsyXSA9IChmZXAtPnUucXBzay5zeW1ib2xfcmF0ZSA+PiAxNikgJiAweGZmOworCQljbWRbM10gPSAoZmVwLT51LnFwc2suc3ltYm9sX3JhdGUgPj4gMjQpICYgMHhmZjsKKwkJY21kWzhdID0gQURWX01PRF9EVkJfUVBTSzsKKwkJY21kWzldID0gMHgwMzsgLypBRFZfTU9EX0ZFQ19YWFgqLworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvLyBvdGhlciBtb2RlcyBhcmUgdW5zdXBvcnRlZCByaWdodCBub3cKKwkJY21kWzBdID0gMDsKKwkJY21kWzFdID0gMDsKKwkJY21kWzJdID0gMDsKKwkJY21kWzNdID0gMDsKKwkJY21kWzhdID0gMDsKKwkJY21kWzldID0gMDsKKwkJYnJlYWs7CisJfQorCisJZ3A4cHNrX3VzYl9vdXRfb3Aoc3RhdGUtPmQsVFVORV84UFNLLDAsMCxjbWQsMTApOworCisJc3RhdGUtPm5leHRfc25yX2NoZWNrID0gamlmZmllczsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdwOHBza19mZV9nZXRfZnJvbnRlbmQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsCisJCQkJICBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKmZlcCkKK3sKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGdwOHBza19mZV9zZW5kX2Rpc2VxY19tc2cgKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLAorCQkJCSAgICBzdHJ1Y3QgZHZiX2Rpc2VxY19tYXN0ZXJfY21kICptKQoreworCXN0cnVjdCBncDhwc2tfZmVfc3RhdGUgKnN0ID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisKKwlkZWJfZmUoIiVzXG4iLF9fRlVOQ1RJT05fXyk7CisKKwlpZiAoZ3A4cHNrX3VzYl9vdXRfb3Aoc3QtPmQsU0VORF9ESVNFUUNfQ09NTUFORCwgbS0+bXNnWzBdLCAwLAorCQkJbS0+bXNnLCBtLT5tc2dfbGVuKSkgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ3A4cHNrX2ZlX3NlbmRfZGlzZXFjX2J1cnN0IChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwKKwkJCQkgICAgZmVfc2VjX21pbmlfY21kX3QgYnVyc3QpCit7CisJc3RydWN0IGdwOHBza19mZV9zdGF0ZSAqc3QgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwl1OCBjbWQ7CisKKwlkZWJfZmUoIiVzXG4iLF9fRlVOQ1RJT05fXyk7CisKKwkvKiBUaGVzZSBjb21tYW5kcyBhcmUgY2VydGFpbmx5IHdyb25nICovCisJY21kID0gKGJ1cnN0ID09IFNFQ19NSU5JX0EpID8gMHgwMCA6IDB4MDE7CisKKwlpZiAoZ3A4cHNrX3VzYl9vdXRfb3Aoc3QtPmQsU0VORF9ESVNFUUNfQ09NTUFORCwgY21kLCAwLAorCQkJJmNtZCwgMCkpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdwOHBza19mZV9zZXRfdG9uZSAoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGZlX3NlY190b25lX21vZGVfdCB0b25lKQoreworCXN0cnVjdCBncDhwc2tfZmVfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisKKwlpZiAoZ3A4cHNrX3VzYl9vdXRfb3Aoc3RhdGUtPmQsU0VUXzIyS0haX1RPTkUsCisJCSAodG9uZSA9PSBTRUNfVE9ORV9PTiksIDAsIE5VTEwsIDApKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBncDhwc2tfZmVfc2V0X3ZvbHRhZ2UgKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBmZV9zZWNfdm9sdGFnZV90IHZvbHRhZ2UpCit7CisJc3RydWN0IGdwOHBza19mZV9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKworCWlmIChncDhwc2tfdXNiX291dF9vcChzdGF0ZS0+ZCxTRVRfTE5CX1ZPTFRBR0UsCisJCQkgdm9sdGFnZSA9PSBTRUNfVk9MVEFHRV8xOCwgMCwgTlVMTCwgMCkpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdwOHBza19mZV9zZW5kX2xlZ2FjeV9kaXNoX2NtZCAoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHVuc2lnbmVkIGxvbmcgc3dfY21kKQoreworCXN0cnVjdCBncDhwc2tfZmVfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJdTggY21kID0gc3dfY21kICYgMHg3ZjsKKworCWlmIChncDhwc2tfdXNiX291dF9vcChzdGF0ZS0+ZCxTRVRfRE5fU1dJVENILCBjbWQsIDAsCisJCQlOVUxMLCAwKSkgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKGdwOHBza191c2Jfb3V0X29wKHN0YXRlLT5kLFNFVF9MTkJfVk9MVEFHRSwgISEoc3dfY21kICYgMHg4MCksCisJCQkwLCBOVUxMLCAwKSkgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZ3A4cHNrX2ZlX3JlbGVhc2Uoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCit7CisJc3RydWN0IGdwOHBza19mZV9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlrZnJlZShzdGF0ZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyBncDhwc2tfZmVfb3BzOworCitzdHJ1Y3QgZHZiX2Zyb250ZW5kICogZ3A4cHNrX2ZlX2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQpCit7CisJc3RydWN0IGdwOHBza19mZV9zdGF0ZSAqcyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBncDhwc2tfZmVfc3RhdGUpLCBHRlBfS0VSTkVMKTsKKwlpZiAocyA9PSBOVUxMKQorCQlnb3RvIGVycm9yOworCisJcy0+ZCA9IGQ7CisJbWVtY3B5KCZzLT5mZS5vcHMsICZncDhwc2tfZmVfb3BzLCBzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMpKTsKKwlzLT5mZS5kZW1vZHVsYXRvcl9wcml2ID0gczsKKworCWdvdG8gc3VjY2VzczsKK2Vycm9yOgorCXJldHVybiBOVUxMOworc3VjY2VzczoKKwlyZXR1cm4gJnMtPmZlOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyBncDhwc2tfZmVfb3BzID0geworCS5pbmZvID0geworCQkubmFtZQkJCT0gIkdlbnBpeCA4cHNrLVVTQiBEVkItUyIsCisJCS50eXBlCQkJPSBGRV9RUFNLLAorCQkuZnJlcXVlbmN5X21pbgkJPSA5NTAwMDAsCisJCS5mcmVxdWVuY3lfbWF4CQk9IDIxNTAwMDAsCisJCS5mcmVxdWVuY3lfc3RlcHNpemUJPSAxMDAsCisJCS5zeW1ib2xfcmF0ZV9taW4gICAgICAgID0gMTAwMDAwMCwKKwkJLnN5bWJvbF9yYXRlX21heCAgICAgICAgPSA0NTAwMDAwMCwKKwkJLnN5bWJvbF9yYXRlX3RvbGVyYW5jZSAgPSA1MDAsICAvKiBwcG0gKi8KKwkJLmNhcHMgPSBGRV9DQU5fSU5WRVJTSU9OX0FVVE8gfAorCQkJCUZFX0NBTl9GRUNfMV8yIHwgRkVfQ0FOX0ZFQ18yXzMgfCBGRV9DQU5fRkVDXzNfNCB8CisJCQkJRkVfQ0FOX0ZFQ181XzYgfCBGRV9DQU5fRkVDXzdfOCB8IEZFX0NBTl9GRUNfQVVUTyB8CisJCQkJRkVfQ0FOX1FQU0sKKwl9LAorCisJLnJlbGVhc2UgPSBncDhwc2tfZmVfcmVsZWFzZSwKKworCS5pbml0ID0gTlVMTCwKKwkuc2xlZXAgPSBOVUxMLAorCisJLnNldF9mcm9udGVuZCA9IGdwOHBza19mZV9zZXRfZnJvbnRlbmQsCisJLmdldF9mcm9udGVuZCA9IGdwOHBza19mZV9nZXRfZnJvbnRlbmQsCisJLmdldF90dW5lX3NldHRpbmdzID0gZ3A4cHNrX2ZlX2dldF90dW5lX3NldHRpbmdzLAorCisJLnJlYWRfc3RhdHVzID0gZ3A4cHNrX2ZlX3JlYWRfc3RhdHVzLAorCS5yZWFkX2JlciA9IGdwOHBza19mZV9yZWFkX2JlciwKKwkucmVhZF9zaWduYWxfc3RyZW5ndGggPSBncDhwc2tfZmVfcmVhZF9zaWduYWxfc3RyZW5ndGgsCisJLnJlYWRfc25yID0gZ3A4cHNrX2ZlX3JlYWRfc25yLAorCS5yZWFkX3VjYmxvY2tzID0gZ3A4cHNrX2ZlX3JlYWRfdW5jX2Jsb2NrcywKKworCS5kaXNlcWNfc2VuZF9tYXN0ZXJfY21kID0gZ3A4cHNrX2ZlX3NlbmRfZGlzZXFjX21zZywKKwkuZGlzZXFjX3NlbmRfYnVyc3QgPSBncDhwc2tfZmVfc2VuZF9kaXNlcWNfYnVyc3QsCisJLnNldF90b25lID0gZ3A4cHNrX2ZlX3NldF90b25lLAorCS5zZXRfdm9sdGFnZSA9IGdwOHBza19mZV9zZXRfdm9sdGFnZSwKKwkuZGlzaG5ldHdvcmtfc2VuZF9sZWdhY3lfY29tbWFuZCA9IGdwOHBza19mZV9zZW5kX2xlZ2FjeV9kaXNoX2NtZCwKK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2dwOHBzay5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9ncDhwc2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTk4ZjNmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9ncDhwc2suYwpAQCAtMCwwICsxLDI1NiBAQAorLyogRFZCIFVTQiBjb21wbGlhbnQgTGludXggZHJpdmVyIGZvciB0aGUKKyAqICAtIEdFTlBJWCA4cGtzL3Fwc2sgVVNCMi4wIERWQi1TIG1vZHVsZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBBbGFuIE5pc290YSAoYWxhbm5pc290YUBnbWFpbC5jb20pCisgKgorICogVGhhbmtzIHRvIEdFTlBJWCBmb3IgdGhlIHNhbXBsZSBjb2RlIHVzZWQgdG8gaW1wbGVtZW50IHRoaXMgbW9kdWxlLgorICoKKyAqIFRoaXMgbW9kdWxlIGlzIGJhc2VkIG9mZiB0aGUgdnA3MDQ1IGFuZCB2cDcwMnggbW9kdWxlcworICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKgl1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICoJU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorICoKKyAqIHNlZSBEb2N1bWVudGF0aW9uL2R2Yi9SRUFETUUuZHZiLXVzYiBmb3IgbW9yZSBpbmZvcm1hdGlvbgorICovCisjaW5jbHVkZSAiZ3A4cHNrLmgiCisKKy8qIGRlYnVnICovCitzdGF0aWMgY2hhciBiY200NTAwX2Zpcm13YXJlW10gPSAiZHZiLXVzYi1ncDhwc2stMDIuZnciOworaW50IGR2Yl91c2JfZ3A4cHNrX2RlYnVnOworbW9kdWxlX3BhcmFtX25hbWVkKGRlYnVnLGR2Yl91c2JfZ3A4cHNrX2RlYnVnLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgInNldCBkZWJ1Z2dpbmcgbGV2ZWwgKDE9aW5mbyx4ZmVyPTIscmM9NCAob3ItYWJsZSkpLiIgRFZCX1VTQl9ERUJVR19TVEFUVVMpOworCitpbnQgZ3A4cHNrX3VzYl9pbl9vcChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQsIHU4IHJlcSwgdTE2IHZhbHVlLCB1MTYgaW5kZXgsIHU4ICpiLCBpbnQgYmxlbikKK3sKKwlpbnQgcmV0ID0gMCx0cnkgPSAwOworCisJaWYgKChyZXQgPSBtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmQtPnVzYl9tdXRleCkpKQorCQlyZXR1cm4gcmV0OworCisJd2hpbGUgKHJldCA+PSAwICYmIHJldCAhPSBibGVuICYmIHRyeSA8IDMpIHsKKwkJcmV0ID0gdXNiX2NvbnRyb2xfbXNnKGQtPnVkZXYsCisJCQl1c2JfcmN2Y3RybHBpcGUoZC0+dWRldiwwKSwKKwkJCXJlcSwKKwkJCVVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9ESVJfSU4sCisJCQl2YWx1ZSxpbmRleCxiLGJsZW4sCisJCQkyMDAwKTsKKwkJZGViX2luZm8oInJlYWRpbmcgbnVtYmVyICVkIChyZXQ6ICVkKVxuIix0cnkscmV0KTsKKwkJdHJ5Kys7CisJfQorCisJaWYgKHJldCA8IDAgfHwgcmV0ICE9IGJsZW4pIHsKKwkJd2FybigidXNiIGluIG9wZXJhdGlvbiBmYWlsZWQuIik7CisJCXJldCA9IC1FSU87CisJfSBlbHNlCisJCXJldCA9IDA7CisKKwlkZWJfeGZlcigiaW46IHJlcS4gJXgsIHZhbDogJXgsIGluZDogJXgsIGJ1ZmZlcjogIixyZXEsdmFsdWUsaW5kZXgpOworCWRlYnVnX2R1bXAoYixibGVuLGRlYl94ZmVyKTsKKworCW11dGV4X3VubG9jaygmZC0+dXNiX211dGV4KTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCBncDhwc2tfdXNiX291dF9vcChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQsIHU4IHJlcSwgdTE2IHZhbHVlLAorCQkJICAgICB1MTYgaW5kZXgsIHU4ICpiLCBpbnQgYmxlbikKK3sKKwlpbnQgcmV0OworCisJZGViX3hmZXIoIm91dDogcmVxLiAleCwgdmFsOiAleCwgaW5kOiAleCwgYnVmZmVyOiAiLHJlcSx2YWx1ZSxpbmRleCk7CisJZGVidWdfZHVtcChiLGJsZW4sZGViX3hmZXIpOworCisJaWYgKChyZXQgPSBtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmQtPnVzYl9tdXRleCkpKQorCQlyZXR1cm4gcmV0OworCisJaWYgKHVzYl9jb250cm9sX21zZyhkLT51ZGV2LAorCQkJdXNiX3NuZGN0cmxwaXBlKGQtPnVkZXYsMCksCisJCQlyZXEsCisJCQlVU0JfVFlQRV9WRU5ET1IgfCBVU0JfRElSX09VVCwKKwkJCXZhbHVlLGluZGV4LGIsYmxlbiwKKwkJCTIwMDApICE9IGJsZW4pIHsKKwkJd2FybigidXNiIG91dCBvcGVyYXRpb24gZmFpbGVkLiIpOworCQlyZXQgPSAtRUlPOworCX0gZWxzZQorCQlyZXQgPSAwOworCW11dGV4X3VubG9jaygmZC0+dXNiX211dGV4KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZ3A4cHNrX2xvYWRfYmNtNDUwMGZ3KHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCkKK3sKKwlpbnQgcmV0OworCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncgPSBOVUxMOworCXU4ICpwdHIsICpidWY7CisJaWYgKChyZXQgPSByZXF1ZXN0X2Zpcm13YXJlKCZmdywgYmNtNDUwMF9maXJtd2FyZSwKKwkJCQkJJmQtPnVkZXYtPmRldikpICE9IDApIHsKKwkJZXJyKCJkaWQgbm90IGZpbmQgdGhlIGJjbTQ1MDAgZmlybXdhcmUgZmlsZS4gKCVzKSAiCisJCQkiUGxlYXNlIHNlZSBsaW51eC9Eb2N1bWVudGF0aW9uL2R2Yi8gZm9yIG1vcmUgZGV0YWlscyBvbiBmaXJtd2FyZS1wcm9ibGVtcy4gKCVkKSIsCisJCQliY200NTAwX2Zpcm13YXJlLHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gLUVJTlZBTDsKKworCWlmIChncDhwc2tfdXNiX291dF9vcChkLCBMT0FEX0JDTTQ1MDAsMSwwLE5VTEwsIDApKQorCQlnb3RvIG91dF9yZWxfZnc7CisKKwlpbmZvKCJkb3dubG9haWRuZyBiY200NTAwIGZpcm13YXJlIGZyb20gZmlsZSAnJXMnIixiY200NTAwX2Zpcm13YXJlKTsKKworCXB0ciA9IGZ3LT5kYXRhOworCWJ1ZiA9IGttYWxsb2MoNTEyLCBHRlBfS0VSTkVMIHwgR0ZQX0RNQSk7CisKKwl3aGlsZSAocHRyWzBdICE9IDB4ZmYpIHsKKwkJdTE2IGJ1ZmxlbiA9IHB0clswXSArIDQ7CisJCWlmIChwdHIgKyBidWZsZW4gPj0gZnctPmRhdGEgKyBmdy0+c2l6ZSkgeworCQkJZXJyKCJmYWlsZWQgdG8gbG9hZCBiY200NTAwIGZpcm13YXJlLiIpOworCQkJZ290byBvdXRfZnJlZTsKKwkJfQorCQltZW1jcHkoYnVmLCBwdHIsIGJ1Zmxlbik7CisJCWlmIChkdmJfdXNiX2dlbmVyaWNfd3JpdGUoZCwgYnVmLCBidWZsZW4pKSB7CisJCQllcnIoImZhaWxlZCB0byBsb2FkIGJjbTQ1MDAgZmlybXdhcmUuIik7CisJCQlnb3RvIG91dF9mcmVlOworCQl9CisJCXB0ciArPSBidWZsZW47CisJfQorCisJcmV0ID0gMDsKKworb3V0X2ZyZWU6CisJa2ZyZWUoYnVmKTsKK291dF9yZWxfZnc6CisJcmVsZWFzZV9maXJtd2FyZShmdyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGdwOHBza19wb3dlcl9jdHJsKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCwgaW50IG9ub2ZmKQoreworCXU4IHN0YXR1cywgYnVmOworCWlmIChvbm9mZikgeworCQlncDhwc2tfdXNiX2luX29wKGQsIEdFVF84UFNLX0NPTkZJRywwLDAsJnN0YXR1cywxKTsKKwkJaWYgKCEgKHN0YXR1cyAmIDB4MDEpKSAgLyogc3RhcnRlZCAqLworCQkJaWYgKGdwOHBza191c2JfaW5fb3AoZCwgQk9PVF84UFNLLCAxLCAwLCAmYnVmLCAxKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlpZiAoISAoc3RhdHVzICYgMHgwMikpIC8qIEJDTTQ1MDAgZmlybXdhcmUgbG9hZGVkICovCisJCQlpZihncDhwc2tfbG9hZF9iY200NTAwZncoZCkpCisJCQkJcmV0dXJuIEVJTlZBTDsKKworCQlpZiAoISAoc3RhdHVzICYgMHgwNCkpIC8qIExOQiBQb3dlciAqLworCQkJaWYgKGdwOHBza191c2JfaW5fb3AoZCwgU1RBUlRfSU5URVJTSUwsIDEsIDAsCisJCQkJCSZidWYsIDEpKQorCQkJCXJldHVybiBFSU5WQUw7CisKKwkJLyogU2V0IERWQiBtb2RlICovCisJCWlmKGdwOHBza191c2Jfb3V0X29wKGQsIFNFVF9EVkJfTU9ERSwgMSwgMCwgTlVMTCwgMCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJZ3A4cHNrX3VzYl9pbl9vcChkLCBHRVRfOFBTS19DT05GSUcsMCwwLCZzdGF0dXMsMSk7CisJfSBlbHNlIHsKKwkJLyogVHVybiBvZmYgTE5CIHBvd2VyICovCisJCWlmIChncDhwc2tfdXNiX2luX29wKGQsIFNUQVJUX0lOVEVSU0lMLCAwLCAwLCAmYnVmLCAxKSkKKwkJCXJldHVybiBFSU5WQUw7CisJCS8qIFR1cm4gb2ZmIDhwc2sgcG93ZXIgKi8KKwkJaWYgKGdwOHBza191c2JfaW5fb3AoZCwgQk9PVF84UFNLLCAwLCAwLCAmYnVmLCAxKSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJfQorCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgZ3A4cHNrX3N0cmVhbWluZ19jdHJsKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCwgaW50IG9ub2ZmKQoreworCXJldHVybiBncDhwc2tfdXNiX291dF9vcChkLCBBUk1fVFJBTlNGRVIsIG9ub2ZmLCAwICwgTlVMTCwgMCk7Cit9CisKK3N0YXRpYyBpbnQgZ3A4cHNrX2Zyb250ZW5kX2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQpCit7CisJZC0+ZmUgPSBncDhwc2tfZmVfYXR0YWNoKGQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZHZiX3VzYl9wcm9wZXJ0aWVzIGdwOHBza19wcm9wZXJ0aWVzOworCitzdGF0aWMgaW50IGdwOHBza191c2JfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCisJCWNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKK3sKKwlyZXR1cm4gZHZiX3VzYl9kZXZpY2VfaW5pdChpbnRmLCZncDhwc2tfcHJvcGVydGllcyxUSElTX01PRFVMRSxOVUxMKTsKK30KKworc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIGdwOHBza191c2JfdGFibGUgW10gPSB7CisJICAgIHsgVVNCX0RFVklDRShVU0JfVklEX0dFTlBJWCwgVVNCX1BJRF9HRU5QSVhfOFBTS19DT0xEKSB9LAorCSAgICB7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9HRU5QSVgsIFVTQl9QSURfR0VOUElYXzhQU0tfV0FSTSkgfSwKKwkgICAgeyAwIH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIGdwOHBza191c2JfdGFibGUpOworCitzdGF0aWMgc3RydWN0IGR2Yl91c2JfcHJvcGVydGllcyBncDhwc2tfcHJvcGVydGllcyA9IHsKKwkuY2FwcyA9IDAsCisKKwkudXNiX2N0cmwgPSBDWVBSRVNTX0ZYMiwKKwkuZmlybXdhcmUgPSAiZHZiLXVzYi1ncDhwc2stMDEuZnciLAorCisJLnN0cmVhbWluZ19jdHJsICAgPSBncDhwc2tfc3RyZWFtaW5nX2N0cmwsCisJLnBvd2VyX2N0cmwgICAgICAgPSBncDhwc2tfcG93ZXJfY3RybCwKKwkuZnJvbnRlbmRfYXR0YWNoICA9IGdwOHBza19mcm9udGVuZF9hdHRhY2gsCisKKwkuZ2VuZXJpY19idWxrX2N0cmxfZW5kcG9pbnQgPSAweDAxLAorCS8qIHBhcmFtZXRlciBmb3IgdGhlIE1QRUcyLWRhdGEgdHJhbnNmZXIgKi8KKwkudXJiID0geworCQkudHlwZSA9IERWQl9VU0JfQlVMSywKKwkJLmNvdW50ID0gNywKKwkJLmVuZHBvaW50ID0gMHg4MiwKKwkJLnUgPSB7CisJCQkuYnVsayA9IHsKKwkJCQkuYnVmZmVyc2l6ZSA9IDgxOTIsCisJCQl9CisJCX0KKwl9LAorCisJLm51bV9kZXZpY2VfZGVzY3MgPSAxLAorCS5kZXZpY2VzID0geworCQl7IC5uYW1lID0gIkdlbnBpeCA4UFNLLVVTQiBEVkItUyBVU0IyLjAgcmVjZWl2ZXIiLAorCQkgIC5jb2xkX2lkcyA9IHsgJmdwOHBza191c2JfdGFibGVbMF0sIE5VTEwgfSwKKwkJICAud2FybV9pZHMgPSB7ICZncDhwc2tfdXNiX3RhYmxlWzFdLCBOVUxMIH0sCisJCX0sCisJCXsgMCB9LAorCX0KK307CisKKy8qIHVzYiBzcGVjaWZpYyBvYmplY3QgbmVlZGVkIHRvIHJlZ2lzdGVyIHRoaXMgZHJpdmVyIHdpdGggdGhlIHVzYiBzdWJzeXN0ZW0gKi8KK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBncDhwc2tfdXNiX2RyaXZlciA9IHsKKwkubmFtZQkJPSAiZHZiX3VzYl9ncDhwc2siLAorCS5wcm9iZQkJPSBncDhwc2tfdXNiX3Byb2JlLAorCS5kaXNjb25uZWN0ID0gZHZiX3VzYl9kZXZpY2VfZXhpdCwKKwkuaWRfdGFibGUJPSBncDhwc2tfdXNiX3RhYmxlLAorfTsKKworLyogbW9kdWxlIHN0dWZmICovCitzdGF0aWMgaW50IF9faW5pdCBncDhwc2tfdXNiX21vZHVsZV9pbml0KHZvaWQpCit7CisJaW50IHJlc3VsdDsKKwlpZiAoKHJlc3VsdCA9IHVzYl9yZWdpc3RlcigmZ3A4cHNrX3VzYl9kcml2ZXIpKSkgeworCQllcnIoInVzYl9yZWdpc3RlciBmYWlsZWQuICglZCkiLHJlc3VsdCk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBncDhwc2tfdXNiX21vZHVsZV9leGl0KHZvaWQpCit7CisJLyogZGVyZWdpc3RlciB0aGlzIGRyaXZlciBmcm9tIHRoZSBVU0Igc3Vic3lzdGVtICovCisJdXNiX2RlcmVnaXN0ZXIoJmdwOHBza191c2JfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoZ3A4cHNrX3VzYl9tb2R1bGVfaW5pdCk7Cittb2R1bGVfZXhpdChncDhwc2tfdXNiX21vZHVsZV9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiQWxhbiBOaXNvdGEgPGFsYW5uaXNvdGFAZ2FtaWwuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgZm9yIEdlbnBpeCA4cHNrLVVTQiBEVkItUyBVU0IyLjAiKTsKK01PRFVMRV9WRVJTSU9OKCIxLjAiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZ3A4cHNrLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2dwOHBzay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlYmE3MDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2dwOHBzay5oCkBAIC0wLDAgKzEsNzkgQEAKKy8qIERWQiBVU0IgY29tcGxpYW50IExpbnV4IGRyaXZlciBmb3IgdGhlCisgKiAgLSBHRU5QSVggOHBrcy9xcHNrIFVTQjIuMCBEVkItUyBtb2R1bGUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgQWxhbiBOaXNvdGEgKGFsYW5uaXNvdGFAZ21haWwuY29tKQorICoKKyAqIFRoYW5rcyB0byBHRU5QSVggZm9yIHRoZSBzYW1wbGUgY29kZSB1c2VkIHRvIGltcGxlbWVudCB0aGlzIG1vZHVsZS4KKyAqCisgKiBUaGlzIG1vZHVsZSBpcyBiYXNlZCBvZmYgdGhlIHZwNzA0NSBhbmQgdnA3MDJ4IG1vZHVsZXMKKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICoJdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqCVNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4KKyAqCisgKiBzZWUgRG9jdW1lbnRhdGlvbi9kdmIvUkVBRE1FLmR2Yi11c2IgZm9yIG1vcmUgaW5mb3JtYXRpb24KKyAqLworI2lmbmRlZiBfRFZCX1VTQl9HUDhQU0tfSF8KKyNkZWZpbmUgX0RWQl9VU0JfR1A4UFNLX0hfCisKKyNkZWZpbmUgRFZCX1VTQl9MT0dfUFJFRklYICJncDhwc2siCisjaW5jbHVkZSAiZHZiLXVzYi5oIgorCitleHRlcm4gaW50IGR2Yl91c2JfZ3A4cHNrX2RlYnVnOworI2RlZmluZSBkZWJfaW5mbyhhcmdzLi4uKSBkcHJpbnRrKGR2Yl91c2JfZ3A4cHNrX2RlYnVnLDB4MDEsYXJncykKKyNkZWZpbmUgZGViX3hmZXIoYXJncy4uLikgZHByaW50ayhkdmJfdXNiX2dwOHBza19kZWJ1ZywweDAyLGFyZ3MpCisjZGVmaW5lIGRlYl9yYyhhcmdzLi4uKSAgIGRwcmludGsoZHZiX3VzYl9ncDhwc2tfZGVidWcsMHgwNCxhcmdzKQorI2RlZmluZSBkZWJfZmUoYXJncy4uLikgICBkcHJpbnRrKGR2Yl91c2JfZ3A4cHNrX2RlYnVnLDB4MDgsYXJncykKKy8qIGdwOHBzayBjb21tYW5kcyAqLworCisvKiBUd2luaGFuIFZlbmRvciByZXF1ZXN0cyAqLworI2RlZmluZSBUSF9DT01NQU5EX0lOICAgICAgICAgICAgICAgICAgICAgMHhDMAorI2RlZmluZSBUSF9DT01NQU5EX09VVCAgICAgICAgICAgICAgICAgICAgMHhDMQorCisvKiBjb21tYW5kIGJ5dGVzICovCisjZGVmaW5lIEdFVF84UFNLX0NPTkZJRyAgICAgICAgICAgICAgICAgMHg4MAorI2RlZmluZSBTRVRfOFBTS19DT05GSUcgICAgICAgICAgICAgICAgIDB4ODEKKyNkZWZpbmUgQVJNX1RSQU5TRkVSICAgICAgICAgICAgICAgICAgICAweDg1CisjZGVmaW5lIFRVTkVfOFBTSyAgICAgICAgICAgICAgICAgICAgICAgMHg4NgorI2RlZmluZSBHRVRfU0lHTkFMX1NUUkVOR1RIICAgICAgICAgICAgIDB4ODcKKyNkZWZpbmUgTE9BRF9CQ000NTAwICAgICAgICAgICAgICAgICAgICAweDg4CisjZGVmaW5lIEJPT1RfOFBTSyAgICAgICAgICAgICAgICAgICAgICAgMHg4OQorI2RlZmluZSBTVEFSVF9JTlRFUlNJTCAgICAgICAgICAgICAgICAgIDB4OEEKKyNkZWZpbmUgU0VUX0xOQl9WT0xUQUdFICAgICAgICAgICAgICAgICAweDhCCisjZGVmaW5lIFNFVF8yMktIWl9UT05FICAgICAgICAgICAgICAgICAgMHg4QworI2RlZmluZSBTRU5EX0RJU0VRQ19DT01NQU5EICAgICAgICAgICAgIDB4OEQKKyNkZWZpbmUgU0VUX0RWQl9NT0RFICAgICAgICAgICAgICAgICAgICAweDhFCisjZGVmaW5lIFNFVF9ETl9TV0lUQ0ggICAgICAgICAgICAgICAgICAgMHg4RgorI2RlZmluZSBHRVRfU0lHTkFMX0xPQ0sgICAgICAgICAgICAgICAgIDB4OTAKKworLyogU2F0ZWxsaXRlIG1vZHVsYXRpb24gbW9kZXMgKi8KKyNkZWZpbmUgQURWX01PRF9EVkJfUVBTSyAwICAgICAvKiBEVkItUyBRUFNLICovCisjZGVmaW5lIEFEVl9NT0RfVFVSQk9fUVBTSyAxICAgLyogVHVyYm8gUVBTSyAqLworI2RlZmluZSBBRFZfTU9EX1RVUkJPXzhQU0sgMiAgIC8qIFR1cmJvIDhQU0sgKGFsc28gdXNlZCBmb3IgVHJlbGxpcyA4UFNLKSAqLworI2RlZmluZSBBRFZfTU9EX1RVUkJPXzE2UUFNIDMgIC8qIFR1cmJvIDE2UUFNIChhbHNvIHVzZWQgZm9yIFRyZWxsaXMgOFBTSykgKi8KKworI2RlZmluZSBBRFZfTU9EX0RDSUlfQ19RUFNLIDQgIC8qIERpZ2ljaXBoZXIgSUkgQ29tYm8gKi8KKyNkZWZpbmUgQURWX01PRF9EQ0lJX0lfUVBTSyA1ICAvKiBEaWdpY2lwaGVyIElJIEktc3RyZWFtICovCisjZGVmaW5lIEFEVl9NT0RfRENJSV9RX1FQU0sgNiAgLyogRGlnaWNpcGhlciBJSSBRLXN0cmVhbSAqLworI2RlZmluZSBBRFZfTU9EX0RDSUlfQ19PUVBTSyA3IC8qIERpZ2ljaXBoZXIgSUkgb2Zmc2V0IFFQU0sgKi8KKyNkZWZpbmUgQURWX01PRF9EU1NfUVBTSyA4ICAgICAvKiBEU1MgKERJUkVDVFYpIFFQU0sgKi8KKyNkZWZpbmUgQURWX01PRF9EVkJfQlBTSyA5ICAgICAvKiBEVkItUyBCUFNLICovCisKKyNkZWZpbmUgR0VUX1VTQl9TUEVFRCAgICAgICAgICAgICAgICAgICAgIDB4MDcKKyAjZGVmaW5lIFVTQl9TUEVFRF9MT1cgICAgICAgICAgICAgICAgICAgIDAKKyAjZGVmaW5lIFVTQl9TUEVFRF9GVUxMICAgICAgICAgICAgICAgICAgIDEKKyAjZGVmaW5lIFVTQl9TUEVFRF9ISUdIICAgICAgICAgICAgICAgICAgIDIKKworI2RlZmluZSBSRVNFVF9GWDIgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMworCisjZGVmaW5lIEZXX1ZFUlNJT05fUkVBRCAgICAgICAgICAgICAgICAgICAweDBCCisjZGVmaW5lIFZFTkRPUl9TVFJJTkdfUkVBRCAgICAgICAgICAgICAgICAweDBDCisjZGVmaW5lIFBST0RVQ1RfU1RSSU5HX1JFQUQgICAgICAgICAgICAgICAweDBECisjZGVmaW5lIEZXX0JDRF9WRVJTSU9OX1JFQUQgICAgICAgICAgICAgICAweDE0CisKK2V4dGVybiBzdHJ1Y3QgZHZiX2Zyb250ZW5kICogZ3A4cHNrX2ZlX2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQpOworZXh0ZXJuIGludCBncDhwc2tfdXNiX2luX29wKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCwgdTggcmVxLCB1MTYgdmFsdWUsIHUxNiBpbmRleCwgdTggKmIsIGludCBibGVuKTsKK2V4dGVybiBpbnQgZ3A4cHNrX3VzYl9vdXRfb3Aoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkLCB1OCByZXEsIHUxNiB2YWx1ZSwKKwkJCSAgICAgdTE2IGluZGV4LCB1OCAqYiwgaW50IGJsZW4pOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvdW10LTAxMC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi91bXQtMDEwLmMKaW5kZXggMTRmMTkxMS4uOTdkNzRkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi91bXQtMDEwLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi91bXQtMDEwLmMKQEAgLTU3LDcgKzU3LDYgQEAKIAltZW1zZXQoJnVtdF9jb25maWcsMCxzaXplb2Yoc3RydWN0IG10MzUyX2NvbmZpZykpOwogCXVtdF9jb25maWcuZGVtb2RfaW5pdCA9IHVtdF9tdDM1Ml9kZW1vZF9pbml0OwogCXVtdF9jb25maWcuZGVtb2RfYWRkcmVzcyA9IDB4ZjsKLQl1bXRfY29uZmlnLnBsbF9zZXQgPSBkdmJfdXNiX3BsbF9zZXQ7CiAKIAlkLT5mZSA9IG10MzUyX2F0dGFjaCgmdW10X2NvbmZpZywgJmQtPmkyY19hZGFwKTsKIApAQCAtNjgsNiArNjcsNyBAQAogewogCWQtPnBsbF9hZGRyID0gMHg2MTsKIAlkLT5wbGxfZGVzYyA9ICZkdmJfcGxsX3R1YTYwMzQ7CisJZC0+ZmUtPm9wcy50dW5lcl9vcHMuY2FsY19yZWdzID0gZHZiX3VzYl90dW5lcl9jYWxjX3JlZ3M7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvdnA3MDJ4LWZlLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL3ZwNzAyeC1mZS5jCmluZGV4IDJhODlmOGMuLmQ0ZGE0OTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvdnA3MDJ4LWZlLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi92cDcwMngtZmUuYwpAQCAtMjg3LDE3ICsyODcsMTYgQEAKIAkJZ290byBlcnJvcjsKIAogCXMtPmQgPSBkOwotCXMtPmZlLm9wcyA9ICZ2cDcwMnhfZmVfb3BzOworCisJbWVtY3B5KCZzLT5mZS5vcHMsJnZwNzAyeF9mZV9vcHMsc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzKSk7CiAJcy0+ZmUuZGVtb2R1bGF0b3JfcHJpdiA9IHM7CiAKIAlzLT5sbmJfYnVmWzFdID0gU0VUX0xOQl9QT1dFUjsKIAlzLT5sbmJfYnVmWzNdID0gMHhmZjsgLyogMD10b25lIGJ1cnN0LCAyPWRhdGEgYnVyc3QsIGZmPW9mZiAqLwogCi0JZ290byBzdWNjZXNzOworCXJldHVybiAmcy0+ZmU7CiBlcnJvcjoKIAlyZXR1cm4gTlVMTDsKLXN1Y2Nlc3M6Ci0JcmV0dXJuICZzLT5mZTsKIH0KIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL3ZwNzA0NS1mZS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi92cDcwNDUtZmUuYwppbmRleCA5OTk5MzM2Li44NDUyZWVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL3ZwNzA0NS1mZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvdnA3MDQ1LWZlLmMKQEAgLTIzLDggKzIzLDYgQEAKIAogc3RydWN0IHZwNzA0NV9mZV9zdGF0ZSB7CiAJc3RydWN0IGR2Yl9mcm9udGVuZCBmZTsKLQlzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyBvcHM7Ci0KIAlzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQ7CiB9OwogCkBAIC0xNTEsMTUgKzE0OSwxMiBAQAogCQlnb3RvIGVycm9yOwogCiAJcy0+ZCA9IGQ7Ci0JbWVtY3B5KCZzLT5vcHMsICZ2cDcwNDVfZmVfb3BzLCBzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMpKTsKLQlzLT5mZS5vcHMgPSAmcy0+b3BzOworCW1lbWNweSgmcy0+ZmUub3BzLCAmdnA3MDQ1X2ZlX29wcywgc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzKSk7CiAJcy0+ZmUuZGVtb2R1bGF0b3JfcHJpdiA9IHM7CiAKLQlnb3RvIHN1Y2Nlc3M7CisJcmV0dXJuICZzLT5mZTsKIGVycm9yOgogCXJldHVybiBOVUxMOwotc3VjY2VzczoKLQlyZXR1cm4gJnMtPmZlOwogfQogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL0tjb25maWcKaW5kZXggMzdkNWUwYS4uMGVmMzYxZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL0tjb25maWcKQEAgLTE1Nyw3ICsxNTcsNyBAQAogCWhlbHAKIAkgIEEgRFZCLUMgdHVuZXIgbW9kdWxlLiBTYXkgWSB3aGVuIHlvdSB3YW50IHRvIHN1cHBvcnQgdGhpcyBmcm9udGVuZC4KIAotY29tbWVudCAiQVRTQyAoTm9ydGggQW1lcmljYW4vS29yZWFuIFRlcnJlc3RlcmlhbCBEVFYpIGZyb250ZW5kcyIKK2NvbW1lbnQgIkFUU0MgKE5vcnRoIEFtZXJpY2FuL0tvcmVhbiBUZXJyZXN0cmlhbC9DYWJsZSBEVFYpIGZyb250ZW5kcyIKIAlkZXBlbmRzIG9uIERWQl9DT1JFCiAKIGNvbmZpZyBEVkJfTlhUMjAwWApAQCAtMjE2LDQgKzIxNiwyMCBAQAogCSAgQW4gQVRTQyA4VlNCIGFuZCBRQU02NC8yNTYgdHVuZXIgbW9kdWxlLiBTYXkgWSB3aGVuIHlvdSB3YW50CiAJICB0byBzdXBwb3J0IHRoaXMgZnJvbnRlbmQuCiAKKworY29tbWVudCAiTWlzY2VsbGFuZW91cyBkZXZpY2VzIgorCWRlcGVuZHMgb24gRFZCX0NPUkUKKworY29uZmlnIERWQl9MTkJQMjEKKwl0cmlzdGF0ZSAiTE5CUDIxIFNFQyBjb250cm9sbGVyIgorCWRlcGVuZHMgb24gRFZCX0NPUkUKKwloZWxwCisJICBBbiBTRUMgY29udHJvbCBjaGlwLgorCitjb25maWcgRFZCX0lTTDY0MjEKKwl0cmlzdGF0ZSAiSVNMNjQyMSBTRUMgY29udHJvbGxlciIKKwlkZXBlbmRzIG9uIERWQl9DT1JFCisJaGVscAorCSAgQW4gU0VDIGNvbnRyb2wgY2hpcC4KKwogZW5kbWVudQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL01ha2VmaWxlCmluZGV4IGQwOWI2MDcuLjUyMjIyNDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvTWFrZWZpbGUKQEAgLTMxLDMgKzMxLDUgQEAKIG9iai0kKENPTkZJR19EVkJfUzVIMTQyMCkgKz0gczVoMTQyMC5vCiBvYmotJChDT05GSUdfRFZCX0xHRFQzMzBYKSArPSBsZ2R0MzMweC5vCiBvYmotJChDT05GSUdfRFZCX0NYMjQxMjMpICs9IGN4MjQxMjMubworb2JqLSQoQ09ORklHX0RWQl9MTkJQMjEpICs9IGxuYnAyMS5vCitvYmotJChDT05GSUdfRFZCX0lTTDY0MjEpICs9IGlzbDY0MjEubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2JjbTM1MTAuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9iY20zNTEwLmMKaW5kZXggMTcwOGExZC4uYmFlYjMxMWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9iY20zNTEwLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2JjbTM1MTAuYwpAQCAtNDgsNyArNDgsNiBAQAogc3RydWN0IGJjbTM1MTBfc3RhdGUgewogCiAJc3RydWN0IGkyY19hZGFwdGVyKiBpMmM7Ci0Jc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMgb3BzOwogCWNvbnN0IHN0cnVjdCBiY20zNTEwX2NvbmZpZyogY29uZmlnOwogCXN0cnVjdCBkdmJfZnJvbnRlbmQgZnJvbnRlbmQ7CiAKQEAgLTc5MSwxMCArNzkwLDkgQEAKIAogCXN0YXRlLT5jb25maWcgPSBjb25maWc7CiAJc3RhdGUtPmkyYyA9IGkyYzsKLQltZW1jcHkoJnN0YXRlLT5vcHMsICZiY20zNTEwX29wcywgc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzKSk7CiAKIAkvKiBjcmVhdGUgZHZiX2Zyb250ZW5kICovCi0Jc3RhdGUtPmZyb250ZW5kLm9wcyA9ICZzdGF0ZS0+b3BzOworCW1lbWNweSgmc3RhdGUtPmZyb250ZW5kLm9wcywgJmJjbTM1MTBfb3BzLCBzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMpKTsKIAlzdGF0ZS0+ZnJvbnRlbmQuZGVtb2R1bGF0b3JfcHJpdiA9IHN0YXRlOwogCiAJbXV0ZXhfaW5pdCgmc3RhdGUtPmhhYl9tdXRleCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvYnNiZTEuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9ic2JlMS5oCmluZGV4IDc4NTczYjIuLmQ4ZjY1NzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9ic2JlMS5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9ic2JlMS5oCkBAIC04OSwxMiArODksMTMgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBhbHBzX2JzYmUxX3BsbF9zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcykKK3N0YXRpYyBpbnQgYWxwc19ic2JlMV90dW5lcl9zZXRfcGFyYW1zKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnBhcmFtcykKIHsKIAlpbnQgcmV0OwogCXU4IGRhdGFbNF07CiAJdTMyIGRpdjsKIAlzdHJ1Y3QgaTJjX21zZyBtc2cgPSB7IC5hZGRyID0gMHg2MSwgLmZsYWdzID0gMCwgLmJ1ZiA9IGRhdGEsIC5sZW4gPSBzaXplb2YoZGF0YSkgfTsKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYyA9IGZlLT50dW5lcl9wcml2OwogCiAJaWYgKChwYXJhbXMtPmZyZXF1ZW5jeSA8IDk1MDAwMCkgfHwgKHBhcmFtcy0+ZnJlcXVlbmN5ID4gMjE1MDAwMCkpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTA1LDYgKzEwNiw4IEBACiAJZGF0YVsyXSA9IDB4ODAgfCAoKGRpdiAmIDB4MTgwMDApID4+IDEwKSB8IDQ7CiAJZGF0YVszXSA9IChwYXJhbXMtPmZyZXF1ZW5jeSA+IDE1MzAwMDApID8gMHhFMCA6IDB4RTQ7CiAKKwlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDEpOwogCXJldCA9IGkyY190cmFuc2ZlcihpMmMsICZtc2csIDEpOwogCXJldHVybiAocmV0ICE9IDEpID8gLUVJTyA6IDA7CiB9CkBAIC0xMTcsNyArMTIwLDYgQEAKIAkuc2tpcF9yZWluaXQgPSAwLAogCS5taW5fZGVsYXlfbXMgPSAxMDAsCiAJLnNldF9zeW1ib2xfcmF0ZSA9IGFscHNfYnNiZTFfc2V0X3N5bWJvbF9yYXRlLAotCS5wbGxfc2V0ID0gYWxwc19ic2JlMV9wbGxfc2V0LAogfTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvYnNydTYuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9ic3J1Ni5oCmluZGV4IDJhNTM2NmMuLmUyMzFjZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9ic3J1Ni5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9ic3J1Ni5oCkBAIC0xMDEsMTEgKzEwMSwxMiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGFscHNfYnNydTZfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGkyY19hZGFwdGVyICppMmMsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcGFyYW1zKQorc3RhdGljIGludCBhbHBzX2JzcnU2X3R1bmVyX3NldF9wYXJhbXMoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcGFyYW1zKQogewogCXU4IGJ1Zls0XTsKIAl1MzIgZGl2OwogCXN0cnVjdCBpMmNfbXNnIG1zZyA9IHsgLmFkZHIgPSAweDYxLCAuZmxhZ3MgPSAwLCAuYnVmID0gYnVmLCAubGVuID0gc2l6ZW9mKGJ1ZikgfTsKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYyA9IGZlLT50dW5lcl9wcml2OwogCiAJaWYgKChwYXJhbXMtPmZyZXF1ZW5jeSA8IDk1MDAwMCkgfHwgKHBhcmFtcy0+ZnJlcXVlbmN5ID4gMjE1MDAwMCkpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTE5LDYgKzEyMCw4IEBACiAJaWYgKHBhcmFtcy0+ZnJlcXVlbmN5ID4gMTUzMDAwMCkKIAkJYnVmWzNdID0gMHhjMDsKIAorCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMSk7CiAJaWYgKGkyY190cmFuc2ZlcihpMmMsICZtc2csIDEpICE9IDEpCiAJCXJldHVybiAtRUlPOwogCXJldHVybiAwOwpAQCAtMTM0LDcgKzEzNyw2IEBACiAJLnZvbHQxM19vcDBfb3AxID0gU1RWMDI5OV9WT0xUMTNfT1AxLAogCS5taW5fZGVsYXlfbXMgPSAxMDAsCiAJLnNldF9zeW1ib2xfcmF0ZSA9IGFscHNfYnNydTZfc2V0X3N5bWJvbF9yYXRlLAotCS5wbGxfc2V0ID0gYWxwc19ic3J1Nl9wbGxfc2V0LAogfTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3gyMjcwMC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjI3MDAuYwppbmRleCA3NTVmNzc0Li4zYzdjMDlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3gyMjcwMC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDIyNzAwLmMKQEAgLTM0LDggKzM0LDYgQEAKIAogCXN0cnVjdCBpMmNfYWRhcHRlciogaTJjOwogCi0Jc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMgb3BzOwotCiAJY29uc3Qgc3RydWN0IGN4MjI3MDBfY29uZmlnKiBjb25maWc7CiAKIAlzdHJ1Y3QgZHZiX2Zyb250ZW5kIGZyb250ZW5kOwpAQCAtMjQ3LDEyICsyNDUsNiBAQAogCiAJY3gyMjcwMF93cml0ZXJlZyAoc3RhdGUsIDB4MDAsIDB4MDEpOwogCi0JaWYgKHN0YXRlLT5jb25maWctPnBsbF9pbml0KSB7Ci0JCWN4MjI3MDBfd3JpdGVyZWcgKHN0YXRlLCAweDBhLCAweDAwKTsgIC8qIG9wZW4gaTJjIGJ1cyBzd2l0Y2ggKi8KLQkJc3RhdGUtPmNvbmZpZy0+cGxsX2luaXQoZmUpOwotCQljeDIyNzAwX3dyaXRlcmVnIChzdGF0ZSwgMHgwYSwgMHgwMSk7ICAvKiBjbG9zZSBpMmMgYnVzIHN3aXRjaCAqLwotCX0KLQogCXJldHVybiAwOwogfQogCkBAIC0zMzMsOSArMzI1LDExIEBACiAJY3gyMjcwMF93cml0ZXJlZyAoc3RhdGUsIDB4MDAsIDB4MDIpOyAvKiBYWFggQ0hFQ0tNRTogc29mdCByZXNldCovCiAJY3gyMjcwMF93cml0ZXJlZyAoc3RhdGUsIDB4MDAsIDB4MDApOwogCi0JY3gyMjcwMF93cml0ZXJlZyAoc3RhdGUsIDB4MGEsIDB4MDApOyAgLyogb3BlbiBpMmMgYnVzIHN3aXRjaCAqLwotCXN0YXRlLT5jb25maWctPnBsbF9zZXQoZmUsIHApOwotCWN4MjI3MDBfd3JpdGVyZWcgKHN0YXRlLCAweDBhLCAweDAxKTsgIC8qIGNsb3NlIGkyYyBidXMgc3dpdGNoICovCisJaWYgKGZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMpIHsKKwkJZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyhmZSwgcCk7CisJCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpIGZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMCk7CisJfQorCiAJY3gyMjcwMF9zZXRfaW52ZXJzaW9uIChzdGF0ZSwgcC0+aW52ZXJzaW9uKTsKIAljeDIyNzAwX3NldF90cHMgKHN0YXRlLCAmcC0+dS5vZmRtKTsKIAljeDIyNzAwX3dyaXRlcmVnIChzdGF0ZSwgMHgzNywgMHgwMSk7ICAvKiBQQUwgbG9vcCBmaWx0ZXIgb2ZmICovCkBAIC0zNTMsNiArMzQ3LDE3IEBACiAJcmV0dXJuIGN4MjI3MDBfZ2V0X3RwcyAoc3RhdGUsICZwLT51Lm9mZG0pOwogfQogCitzdGF0aWMgaW50IGN4MjI3MDBfaTJjX2dhdGVfY3RybChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgaW50IGVuYWJsZSkKK3sKKwlzdHJ1Y3QgY3gyMjcwMF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKworCWlmIChlbmFibGUpIHsKKwkJcmV0dXJuIGN4MjI3MDBfd3JpdGVyZWcoc3RhdGUsIDB4MGEsIDB4MDApOworCX0gZWxzZSB7CisJCXJldHVybiBjeDIyNzAwX3dyaXRlcmVnKHN0YXRlLCAweDBhLCAweDAxKTsKKwl9Cit9CisKIHN0YXRpYyBpbnQgY3gyMjcwMF9nZXRfdHVuZV9zZXR0aW5ncyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF90dW5lX3NldHRpbmdzKiBmZXNldHRpbmdzKQogewogCWZlc2V0dGluZ3MtPm1pbl9kZWxheV9tcyA9IDE1MDsKQEAgLTM4MSwxMyArMzg2LDEyIEBACiAJLyogc2V0dXAgdGhlIHN0YXRlICovCiAJc3RhdGUtPmNvbmZpZyA9IGNvbmZpZzsKIAlzdGF0ZS0+aTJjID0gaTJjOwotCW1lbWNweSgmc3RhdGUtPm9wcywgJmN4MjI3MDBfb3BzLCBzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMpKTsKIAogCS8qIGNoZWNrIGlmIHRoZSBkZW1vZCBpcyB0aGVyZSAqLwogCWlmIChjeDIyNzAwX3JlYWRyZWcoc3RhdGUsIDB4MDcpIDwgMCkgZ290byBlcnJvcjsKIAogCS8qIGNyZWF0ZSBkdmJfZnJvbnRlbmQgKi8KLQlzdGF0ZS0+ZnJvbnRlbmQub3BzID0gJnN0YXRlLT5vcHM7CisJbWVtY3B5KCZzdGF0ZS0+ZnJvbnRlbmQub3BzLCAmY3gyMjcwMF9vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOwogCXN0YXRlLT5mcm9udGVuZC5kZW1vZHVsYXRvcl9wcml2ID0gc3RhdGU7CiAJcmV0dXJuICZzdGF0ZS0+ZnJvbnRlbmQ7CiAKQEAgLTQxMyw2ICs0MTcsNyBAQAogCS5yZWxlYXNlID0gY3gyMjcwMF9yZWxlYXNlLAogCiAJLmluaXQgPSBjeDIyNzAwX2luaXQsCisJLmkyY19nYXRlX2N0cmwgPSBjeDIyNzAwX2kyY19nYXRlX2N0cmwsCiAKIAkuc2V0X2Zyb250ZW5kID0gY3gyMjcwMF9zZXRfZnJvbnRlbmQsCiAJLmdldF9mcm9udGVuZCA9IGN4MjI3MDBfZ2V0X2Zyb250ZW5kLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjI3MDAuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDIyNzAwLmgKaW5kZXggYzkxNDViNC4uZGNkODk3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjI3MDAuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3gyMjcwMC5oCkBAIC0yOSwxMCArMjksNiBAQAogewogCS8qIHRoZSBkZW1vZHVsYXRvcidzIGkyYyBhZGRyZXNzICovCiAJdTggZGVtb2RfYWRkcmVzczsKLQotCS8qIFBMTCBtYWludGVuYW5jZSAqLwotCWludCAoKnBsbF9pbml0KShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSk7Ci0JaW50ICgqcGxsX3NldCkoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyogcGFyYW1zKTsKIH07CiAKIGV4dGVybiBzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBjeDIyNzAwX2F0dGFjaChjb25zdCBzdHJ1Y3QgY3gyMjcwMF9jb25maWcqIGNvbmZpZywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDIyNzAyLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3gyMjcwMi5jCmluZGV4IDBmYzg5OWYuLjQxMDZkNDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDIyNzAyLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjI3MDIuYwpAQCAtNDAsOCArNDAsNiBAQAogCiAJc3RydWN0IGkyY19hZGFwdGVyKiBpMmM7CiAKLQlzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyBvcHM7Ci0KIAkvKiBjb25maWd1cmF0aW9uIHNldHRpbmdzICovCiAJY29uc3Qgc3RydWN0IGN4MjI3MDJfY29uZmlnKiBjb25maWc7CiAKQEAgLTIxMSwyMiArMjA5LDEwIEBACiAJdTggdmFsOwogCXN0cnVjdCBjeDIyNzAyX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCi0JLyogc2V0IFBMTCAqLwotCWN4MjI3MDJfaTJjX2dhdGVfY3RybChmZSwgMSk7Ci0JaWYgKHN0YXRlLT5jb25maWctPnBsbF9zZXQpIHsKLQkJc3RhdGUtPmNvbmZpZy0+cGxsX3NldChmZSwgcCk7Ci0JfSBlbHNlIGlmIChzdGF0ZS0+Y29uZmlnLT5wbGxfZGVzYykgewotCQl1OCBwbGxidWZbNF07Ci0JCXN0cnVjdCBpMmNfbXNnIG1zZyA9IHsgLmFkZHIgPSBzdGF0ZS0+Y29uZmlnLT5wbGxfYWRkcmVzcywKLQkJCQkgICAgICAgLmJ1ZiA9IHBsbGJ1ZiwgLmxlbiA9IDQgfTsKLQkJZHZiX3BsbF9jb25maWd1cmUoc3RhdGUtPmNvbmZpZy0+cGxsX2Rlc2MsIHBsbGJ1ZiwKLQkJCQkgIHAtPmZyZXF1ZW5jeSwKLQkJCQkgIHAtPnUub2ZkbS5iYW5kd2lkdGgpOwotCQlpMmNfdHJhbnNmZXIoc3RhdGUtPmkyYywgJm1zZywgMSk7Ci0JfSBlbHNlIHsKLQkJQlVHKCk7CisJaWYgKGZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMpIHsKKwkJZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyhmZSwgcCk7CisJCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpIGZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMCk7CiAJfQotCWN4MjI3MDJfaTJjX2dhdGVfY3RybChmZSwgMCk7CiAKIAkvKiBzZXQgaW52ZXJzaW9uICovCiAJY3gyMjcwMl9zZXRfaW52ZXJzaW9uIChzdGF0ZSwgcC0+aW52ZXJzaW9uKTsKQEAgLTM1OCwxMCArMzQ0LDYgQEAKIAogCWN4MjI3MDJfd3JpdGVyZWcgKHN0YXRlLCAweGY4LCAoc3RhdGUtPmNvbmZpZy0+b3V0cHV0X21vZGUgPDwgMSkgJiAweDAyKTsKIAotCS8qIGluaXQgUExMICovCi0JaWYgKHN0YXRlLT5jb25maWctPnBsbF9pbml0KQotCQlzdGF0ZS0+Y29uZmlnLT5wbGxfaW5pdChmZSk7Ci0KIAljeDIyNzAyX2kyY19nYXRlX2N0cmwoZmUsIDApOwogCiAJcmV0dXJuIDA7CkBAIC00OTUsNyArNDc3LDYgQEAKIAkvKiBzZXR1cCB0aGUgc3RhdGUgKi8KIAlzdGF0ZS0+Y29uZmlnID0gY29uZmlnOwogCXN0YXRlLT5pMmMgPSBpMmM7Ci0JbWVtY3B5KCZzdGF0ZS0+b3BzLCAmY3gyMjcwMl9vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOwogCXN0YXRlLT5wcmV2VUNCbG9ja3MgPSAwOwogCiAJLyogY2hlY2sgaWYgdGhlIGRlbW9kIGlzIHRoZXJlICovCkBAIC01MDMsNyArNDg0LDcgQEAKIAkJZ290byBlcnJvcjsKIAogCS8qIGNyZWF0ZSBkdmJfZnJvbnRlbmQgKi8KLQlzdGF0ZS0+ZnJvbnRlbmQub3BzID0gJnN0YXRlLT5vcHM7CisJbWVtY3B5KCZzdGF0ZS0+ZnJvbnRlbmQub3BzLCAmY3gyMjcwMl9vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOwogCXN0YXRlLT5mcm9udGVuZC5kZW1vZHVsYXRvcl9wcml2ID0gc3RhdGU7CiAJcmV0dXJuICZzdGF0ZS0+ZnJvbnRlbmQ7CiAKQEAgLTUzMCw2ICs1MTEsNyBAQAogCS5yZWxlYXNlID0gY3gyMjcwMl9yZWxlYXNlLAogCiAJLmluaXQgPSBjeDIyNzAyX2luaXQsCisJLmkyY19nYXRlX2N0cmwgPSBjeDIyNzAyX2kyY19nYXRlX2N0cmwsCiAKIAkuc2V0X2Zyb250ZW5kID0gY3gyMjcwMl9zZXRfdHBzLAogCS5nZXRfZnJvbnRlbmQgPSBjeDIyNzAyX2dldF9mcm9udGVuZCwKQEAgLTU0MCw3ICs1MjIsNiBAQAogCS5yZWFkX3NpZ25hbF9zdHJlbmd0aCA9IGN4MjI3MDJfcmVhZF9zaWduYWxfc3RyZW5ndGgsCiAJLnJlYWRfc25yID0gY3gyMjcwMl9yZWFkX3NuciwKIAkucmVhZF91Y2Jsb2NrcyA9IGN4MjI3MDJfcmVhZF91Y2Jsb2NrcywKLQkuaTJjX2dhdGVfY3RybCA9IGN4MjI3MDJfaTJjX2dhdGVfY3RybCwKIH07CiAKIG1vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwNjQ0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDIyNzAyLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3gyMjcwMi5oCmluZGV4IDU2MzM5NzYuLjdmMmYyNDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDIyNzAyLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjI3MDIuaApAQCAtMzksMTMgKzM5LDYgQEAKICNkZWZpbmUgQ1gyMjcwMl9QQVJBTExFTF9PVVRQVVQgMAogI2RlZmluZSBDWDIyNzAyX1NFUklBTF9PVVRQVVQgICAxCiAJdTggb3V0cHV0X21vZGU7Ci0KLQkvKiBQTEwgbWFpbnRlbmFuY2UgKi8KLQl1OCBwbGxfYWRkcmVzczsKLQlzdHJ1Y3QgZHZiX3BsbF9kZXNjICpwbGxfZGVzYzsKLQotCWludCAoKnBsbF9pbml0KShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSk7Ci0JaW50ICgqcGxsX3NldCkoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyogcGFyYW1zKTsKIH07CiAKIGV4dGVybiBzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBjeDIyNzAyX2F0dGFjaChjb25zdCBzdHJ1Y3QgY3gyMjcwMl9jb25maWcqIGNvbmZpZywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDI0MTEwLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3gyNDExMC5jCmluZGV4IGYzZWRmOGIuLmNlM2M3MzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDI0MTEwLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjQxMTAuYwpAQCAtMzYsOCArMzYsNiBAQAogCiAJc3RydWN0IGkyY19hZGFwdGVyKiBpMmM7CiAKLQlzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyBvcHM7Ci0KIAljb25zdCBzdHJ1Y3QgY3gyNDExMF9jb25maWcqIGNvbmZpZzsKIAogCXN0cnVjdCBkdmJfZnJvbnRlbmQgZnJvbnRlbmQ7CkBAIC0yNTAsNyArMjQ4LDcgQEAKIAlzdGF0aWMgY29uc3QgdTMyIGJhbmRzW109ezUwMDAwMDBVTCwxNTAwMDAwMFVMLDkwOTk5MDAwVUwvMn07CiAJaW50IGk7CiAKLWRwcmludGsoImN4MjQxMTAgZGVidWc6IGVudGVyaW5nICVzKCVkKVxuIixfX0ZVTkNUSU9OX18sc3JhdGUpOworCWRwcmludGsoImN4MjQxMTAgZGVidWc6IGVudGVyaW5nICVzKCVkKVxuIixfX0ZVTkNUSU9OX18sc3JhdGUpOwogCWlmIChzcmF0ZT45MDk5OTAwMFVMLzIpCiAJCXNyYXRlPTkwOTk5MDAwVUwvMjsKIAlpZiAoc3JhdGU8NTAwMDAwKQpAQCAtMzY2LDE3ICszNjQsNiBAQAogCQljeDI0MTEwX3dyaXRlcmVnKHN0YXRlLCBjeDI0MTEwX3JlZ2RhdGFbaV0ucmVnLCBjeDI0MTEwX3JlZ2RhdGFbaV0uZGF0YSk7CiAJfTsKIAotCWlmIChzdGF0ZS0+Y29uZmlnLT5wbGxfaW5pdCkgc3RhdGUtPmNvbmZpZy0+cGxsX2luaXQoZmUpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgY3gyNDExMF9zbGVlcChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKLXsKLQlzdHJ1Y3QgY3gyNDExMF9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKLQotCWlmIChzdGF0ZS0+Y29uZmlnLT5wbGxfc2xlZXApCi0JCSAgcmV0dXJuIHN0YXRlLT5jb25maWctPnBsbF9zbGVlcChmZSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTU0OCw3ICs1MzUsMTIgQEAKIHsKIAlzdHJ1Y3QgY3gyNDExMF9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAotCXN0YXRlLT5jb25maWctPnBsbF9zZXQoZmUsIHApOworCisJaWYgKGZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMpIHsKKwkJZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyhmZSwgcCk7CisJCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpIGZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMCk7CisJfQorCiAJY3gyNDExMF9zZXRfaW52ZXJzaW9uIChzdGF0ZSwgcC0+aW52ZXJzaW9uKTsKIAljeDI0MTEwX3NldF9mZWMgKHN0YXRlLCBwLT51LnFwc2suZmVjX2lubmVyKTsKIAljeDI0MTEwX3NldF9zeW1ib2xyYXRlIChzdGF0ZSwgcC0+dS5xcHNrLnN5bWJvbF9yYXRlKTsKQEAgLTYxMiw3ICs2MDQsNiBAQAogCS8qIHNldHVwIHRoZSBzdGF0ZSAqLwogCXN0YXRlLT5jb25maWcgPSBjb25maWc7CiAJc3RhdGUtPmkyYyA9IGkyYzsKLQltZW1jcHkoJnN0YXRlLT5vcHMsICZjeDI0MTEwX29wcywgc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzKSk7CiAJc3RhdGUtPmxhc3RiZXIgPSAwOwogCXN0YXRlLT5sYXN0YmxlciA9IDA7CiAJc3RhdGUtPmxhc3Rlc24wID0gMDsKQEAgLTYyMiw3ICs2MTMsNyBAQAogCWlmICgocmV0ICE9IDB4NWEpICYmIChyZXQgIT0gMHg2OSkpIGdvdG8gZXJyb3I7CiAKIAkvKiBjcmVhdGUgZHZiX2Zyb250ZW5kICovCi0Jc3RhdGUtPmZyb250ZW5kLm9wcyA9ICZzdGF0ZS0+b3BzOworCW1lbWNweSgmc3RhdGUtPmZyb250ZW5kLm9wcywgJmN4MjQxMTBfb3BzLCBzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMpKTsKIAlzdGF0ZS0+ZnJvbnRlbmQuZGVtb2R1bGF0b3JfcHJpdiA9IHN0YXRlOwogCXJldHVybiAmc3RhdGUtPmZyb250ZW5kOwogCkBAIC02NTEsNyArNjQyLDYgQEAKIAkucmVsZWFzZSA9IGN4MjQxMTBfcmVsZWFzZSwKIAogCS5pbml0ID0gY3gyNDExMF9pbml0ZmUsCi0JLnNsZWVwID0gY3gyNDExMF9zbGVlcCwKIAkuc2V0X2Zyb250ZW5kID0gY3gyNDExMF9zZXRfZnJvbnRlbmQsCiAJLmdldF9mcm9udGVuZCA9IGN4MjQxMTBfZ2V0X2Zyb250ZW5kLAogCS5yZWFkX3N0YXR1cyA9IGN4MjQxMTBfcmVhZF9zdGF0dXMsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3gyNDExMC5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjQxMTAuaAppbmRleCA2MDlhYzY0Li5iMzU0YTY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3gyNDExMC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDI0MTEwLmgKQEAgLTMxLDExICszMSw2IEBACiB7CiAJLyogdGhlIGRlbW9kdWxhdG9yJ3MgaTJjIGFkZHJlc3MgKi8KIAl1OCBkZW1vZF9hZGRyZXNzOwotCi0JLyogUExMIG1haW50ZW5hbmNlICovCi0JaW50ICgqcGxsX2luaXQpKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKTsKLQlpbnQgKCpwbGxfc2V0KShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMpOwotCWludCAoKnBsbF9zbGVlcCkoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpOwogfTsKIAogZXh0ZXJuIHN0cnVjdCBkdmJfZnJvbnRlbmQqIGN4MjQxMTBfYXR0YWNoKGNvbnN0IHN0cnVjdCBjeDI0MTEwX2NvbmZpZyogY29uZmlnLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjQxMjMuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDI0MTIzLmMKaW5kZXggNjkxZGM4NC4uZjJmNzk1YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjQxMjMuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3gyNDEyMy5jCkBAIC00MSwxNCArNDEsMTIgQEAKIHN0cnVjdCBjeDI0MTIzX3N0YXRlCiB7CiAJc3RydWN0IGkyY19hZGFwdGVyKiBpMmM7Ci0Jc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMgb3BzOwogCWNvbnN0IHN0cnVjdCBjeDI0MTIzX2NvbmZpZyogY29uZmlnOwogCiAJc3RydWN0IGR2Yl9mcm9udGVuZCBmcm9udGVuZDsKIAogCXUzMiBsYXN0YmVyOwogCXUxNiBzbnI7Ci0JdTggIGxuYnJlZzsKIAogCS8qIFNvbWUgUExMIHNwZWNpZmljcyBmb3IgdHVuaW5nICovCiAJdTMyIFZDQWFyZzsKQEAgLTI0OSwyOSArMjQ3LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBjeDI0MTIzX3dyaXRlbG5icmVnKHN0cnVjdCBjeDI0MTIzX3N0YXRlKiBzdGF0ZSwgaW50IHJlZywgaW50IGRhdGEpCi17Ci0JdTggYnVmW10gPSB7IHJlZywgZGF0YSB9OwotCS8qIGZpeG1lOiBwdXQgdGhlIGludGVyc2lsIGFkZHIgaW50IHRoZSBjb25maWcgKi8KLQlzdHJ1Y3QgaTJjX21zZyBtc2cgPSB7IC5hZGRyID0gMHgwOCwgLmZsYWdzID0gMCwgLmJ1ZiA9IGJ1ZiwgLmxlbiA9IDIgfTsKLQlpbnQgZXJyOwotCi0JaWYgKGRlYnVnPjEpCi0JCXByaW50aygiY3gyNDEyMzogJXM6ICB3cml0ZWxuIGFkZHI9MHgwOCwgcmVnIDB4JTAyeCwgdmFsdWUgMHglMDJ4XG4iLAotCQkJCQkJX19GVU5DVElPTl9fLHJlZywgZGF0YSk7Ci0KLQlpZiAoKGVyciA9IGkyY190cmFuc2ZlcihzdGF0ZS0+aTJjLCAmbXNnLCAxKSkgIT0gMSkgewotCQlwcmludGsoIiVzOiB3cml0ZWxuYnJlZyBlcnJvciAoZXJyID09ICVpLCByZWcgPT0gMHglMDJ4LCIKLQkJCSAiIGRhdGEgPT0gMHglMDJ4KVxuIiwgX19GVU5DVElPTl9fLCBlcnIsIHJlZywgZGF0YSk7Ci0JCXJldHVybiAtRVJFTU9URUlPOwotCX0KLQotCS8qIGNhY2hlIHRoZSB3cml0ZSwgbm8gd2F5IHRvIHJlYWQgYmFjayAqLwotCXN0YXRlLT5sbmJyZWcgPSBkYXRhOwotCi0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbnQgY3gyNDEyM19yZWFkcmVnKHN0cnVjdCBjeDI0MTIzX3N0YXRlKiBzdGF0ZSwgdTggcmVnKQogewogCWludCByZXQ7CkBAIC0yOTUsMTEgKzI3MCw2IEBACiAJcmV0dXJuIGIxWzBdOwogfQogCi1zdGF0aWMgaW50IGN4MjQxMjNfcmVhZGxuYnJlZyhzdHJ1Y3QgY3gyNDEyM19zdGF0ZSogc3RhdGUsIHU4IHJlZykKLXsKLQlyZXR1cm4gc3RhdGUtPmxuYnJlZzsKLX0KLQogc3RhdGljIGludCBjeDI0MTIzX3NldF9pbnZlcnNpb24oc3RydWN0IGN4MjQxMjNfc3RhdGUqIHN0YXRlLCBmZV9zcGVjdHJhbF9pbnZlcnNpb25fdCBpbnZlcnNpb24pCiB7CiAJdTggbm9tX3JlZyA9IGN4MjQxMjNfcmVhZHJlZyhzdGF0ZSwgMHgwZSk7CkBAIC00NTgsOCArNDI4LDggQEAKIAl1OCBwbGxfbXVsdDsKIAogCS8qICBjaGVjayBpZiBzeW1ib2wgcmF0ZSBpcyB3aXRoaW4gbGltaXRzICovCi0JaWYgKChzcmF0ZSA+IHN0YXRlLT5vcHMuaW5mby5zeW1ib2xfcmF0ZV9tYXgpIHx8Ci0JICAgIChzcmF0ZSA8IHN0YXRlLT5vcHMuaW5mby5zeW1ib2xfcmF0ZV9taW4pKQorCWlmICgoc3JhdGUgPiBzdGF0ZS0+ZnJvbnRlbmQub3BzLmluZm8uc3ltYm9sX3JhdGVfbWF4KSB8fAorCSAgICAoc3JhdGUgPCBzdGF0ZS0+ZnJvbnRlbmQub3BzLmluZm8uc3ltYm9sX3JhdGVfbWluKSkKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOzsKIAogCS8qIGNob29zZSB0aGUgc2FtcGxpbmcgcmF0ZSBoaWdoIGVub3VnaCBmb3IgdGhlIHJlcXVpcmVkIG9wZXJhdGlvbiwKQEAgLTY4NywxMyArNjU3LDYgQEAKIAlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGN4MjQxMjNfcmVnZGF0YSkgLyBzaXplb2YoY3gyNDEyM19yZWdkYXRhWzBdKTsgaSsrKQogCQljeDI0MTIzX3dyaXRlcmVnKHN0YXRlLCBjeDI0MTIzX3JlZ2RhdGFbaV0ucmVnLCBjeDI0MTIzX3JlZ2RhdGFbaV0uZGF0YSk7CiAKLQlpZiAoc3RhdGUtPmNvbmZpZy0+cGxsX2luaXQpCi0JCXN0YXRlLT5jb25maWctPnBsbF9pbml0KGZlKTsKLQotCS8qIENvbmZpZ3VyZSB0aGUgTE5CIGZvciAxNFYgKi8KLQlpZiAoc3RhdGUtPmNvbmZpZy0+dXNlX2lzbDY0MjEpCi0JCWN4MjQxMjNfd3JpdGVsbmJyZWcoc3RhdGUsIDB4MCwgMHgyYSk7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtNzAyLDUwICs2NjUsMTggQEAKIAlzdHJ1Y3QgY3gyNDEyM19zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAl1OCB2YWw7CiAKLQlzd2l0Y2ggKHN0YXRlLT5jb25maWctPnVzZV9pc2w2NDIxKSB7CisJdmFsID0gY3gyNDEyM19yZWFkcmVnKHN0YXRlLCAweDI5KSAmIH4weDQwOwogCi0JY2FzZSAxOgotCi0JCXZhbCA9IGN4MjQxMjNfcmVhZGxuYnJlZyhzdGF0ZSwgMHgwKTsKLQotCQlzd2l0Y2ggKHZvbHRhZ2UpIHsKLQkJY2FzZSBTRUNfVk9MVEFHRV8xMzoKLQkJCWRwcmludGsoIiVzOiAgaXNsNjQyMSB2b2x0YWdlID0gMTNWXG4iLF9fRlVOQ1RJT05fXyk7Ci0JCQlyZXR1cm4gY3gyNDEyM193cml0ZWxuYnJlZyhzdGF0ZSwgMHgwLCB2YWwgJiAweDMyKTsgLyogViAxM3YgKi8KLQkJY2FzZSBTRUNfVk9MVEFHRV8xODoKLQkJCWRwcmludGsoIiVzOiAgaXNsNjQyMSB2b2x0YWdlID0gMThWXG4iLF9fRlVOQ1RJT05fXyk7Ci0JCQlyZXR1cm4gY3gyNDEyM193cml0ZWxuYnJlZyhzdGF0ZSwgMHgwLCB2YWwgfCAweDA0KTsgLyogSCAxOHYgKi8KLQkJY2FzZSBTRUNfVk9MVEFHRV9PRkY6Ci0JCQlkcHJpbnRrKCIlczogIGlzbDU0MjEgdm9sdGFnZSBvZmZcbiIsX19GVU5DVElPTl9fKTsKLQkJCXJldHVybiBjeDI0MTIzX3dyaXRlbG5icmVnKHN0YXRlLCAweDAsIHZhbCAmIDB4MzApOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX07Ci0KLQljYXNlIDA6Ci0KLQkJdmFsID0gY3gyNDEyM19yZWFkcmVnKHN0YXRlLCAweDI5KTsKLQotCQlzd2l0Y2ggKHZvbHRhZ2UpIHsKLQkJY2FzZSBTRUNfVk9MVEFHRV8xMzoKLQkJCWRwcmludGsoIiVzOiBzZXR0aW5nIHZvbHRhZ2UgMTNWXG4iLCBfX0ZVTkNUSU9OX18pOwotCQkJaWYgKHN0YXRlLT5jb25maWctPmVuYWJsZV9sbmJfdm9sdGFnZSkKLQkJCQlzdGF0ZS0+Y29uZmlnLT5lbmFibGVfbG5iX3ZvbHRhZ2UoZmUsIDEpOwotCQkJcmV0dXJuIGN4MjQxMjNfd3JpdGVyZWcoc3RhdGUsIDB4MjksIHZhbCB8IDB4ODApOwotCQljYXNlIFNFQ19WT0xUQUdFXzE4OgotCQkJZHByaW50aygiJXM6IHNldHRpbmcgdm9sdGFnZSAxOFZcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCQlpZiAoc3RhdGUtPmNvbmZpZy0+ZW5hYmxlX2xuYl92b2x0YWdlKQotCQkJCXN0YXRlLT5jb25maWctPmVuYWJsZV9sbmJfdm9sdGFnZShmZSwgMSk7Ci0JCQlyZXR1cm4gY3gyNDEyM193cml0ZXJlZyhzdGF0ZSwgMHgyOSwgdmFsICYgMHg3Zik7Ci0JCWNhc2UgU0VDX1ZPTFRBR0VfT0ZGOgotCQkJZHByaW50aygiJXM6IHNldHRpbmcgdm9sdGFnZSBvZmZcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCQlpZiAoc3RhdGUtPmNvbmZpZy0+ZW5hYmxlX2xuYl92b2x0YWdlKQotCQkJCXN0YXRlLT5jb25maWctPmVuYWJsZV9sbmJfdm9sdGFnZShmZSwgMCk7Ci0JCQlyZXR1cm4gMDsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9OwotCX0KKwlzd2l0Y2ggKHZvbHRhZ2UpIHsKKwljYXNlIFNFQ19WT0xUQUdFXzEzOgorCQlkcHJpbnRrKCIlczogc2V0dGluZyB2b2x0YWdlIDEzVlxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIGN4MjQxMjNfd3JpdGVyZWcoc3RhdGUsIDB4MjksIHZhbCB8IDB4ODApOworCWNhc2UgU0VDX1ZPTFRBR0VfMTg6CisJCWRwcmludGsoIiVzOiBzZXR0aW5nIHZvbHRhZ2UgMThWXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gY3gyNDEyM193cml0ZXJlZyhzdGF0ZSwgMHgyOSwgdmFsICYgMHg3Zik7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfTsKIAogCXJldHVybiAwOwogfQpAQCAtNzY2LDI3ICs2OTcsMjAgQEAKIHN0YXRpYyBpbnQgY3gyNDEyM19zZW5kX2Rpc2VxY19tc2coc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZGlzZXFjX21hc3Rlcl9jbWQgKmNtZCkKIHsKIAlzdHJ1Y3QgY3gyNDEyM19zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKLQlpbnQgaSwgdmFsOworCWludCBpLCB2YWwsIHRvbmU7CiAKIAlkcHJpbnRrKCIlczpcbiIsX19GVU5DVElPTl9fKTsKIAotCS8qIGNoZWNrIGlmIGNvbnRpbnVvdXMgdG9uZSBoYXMgYmVlbiBzdG9wcGVkICovCi0JaWYgKHN0YXRlLT5jb25maWctPnVzZV9pc2w2NDIxKQotCQl2YWwgPSBjeDI0MTIzX3JlYWRsbmJyZWcoc3RhdGUsIDB4MDApICYgMHgxMDsKLQllbHNlCi0JCXZhbCA9IGN4MjQxMjNfcmVhZHJlZyhzdGF0ZSwgMHgyOSkgJiAweDEwOwotCi0KLQlpZiAodmFsKSB7Ci0JCXByaW50aygiJXM6IEVSUk9SOiBhdHRlbXB0IHRvIHNlbmQgZGlzZXFjIGNvbW1hbmQgYmVmb3JlIHRvbmUgaXMgb2ZmXG4iLCBfX0ZVTkNUSU9OX18pOwotCQlyZXR1cm4gLUVOT1RTVVBQOwotCX0KKwkvKiBzdG9wIGNvbnRpbnVvdXMgdG9uZSBpZiBlbmFibGVkICovCisJdG9uZSA9IGN4MjQxMjNfcmVhZHJlZyhzdGF0ZSwgMHgyOSk7CisJaWYgKHRvbmUgJiAweDEwKQorCQljeDI0MTIzX3dyaXRlcmVnKHN0YXRlLCAweDI5LCB0b25lICYgfjB4NTApOwogCiAJLyogd2FpdCBmb3IgZGlzZXFjIHF1ZXVlIHJlYWR5ICovCiAJY3gyNDEyM193YWl0X2Zvcl9kaXNlcWMoc3RhdGUpOwogCiAJLyogc2VsZWN0IHRvbmUgbW9kZSAqLwotCWN4MjQxMjNfd3JpdGVyZWcoc3RhdGUsIDB4MmEsIGN4MjQxMjNfcmVhZHJlZyhzdGF0ZSwgMHgyYSkgJiAweGY4KTsKKwljeDI0MTIzX3dyaXRlcmVnKHN0YXRlLCAweDJhLCBjeDI0MTIzX3JlYWRyZWcoc3RhdGUsIDB4MmEpICYgMHhmYik7CiAKIAlmb3IgKGkgPSAwOyBpIDwgY21kLT5tc2dfbGVuOyBpKyspCiAJCWN4MjQxMjNfd3JpdGVyZWcoc3RhdGUsIDB4MkMgKyBpLCBjbWQtPm1zZ1tpXSk7CkBAIC03OTcsMzYgKzcyMSwzMyBAQAogCS8qIHdhaXQgZm9yIGRpc2VxYyBtZXNzYWdlIHRvIGZpbmlzaCBzZW5kaW5nICovCiAJY3gyNDEyM193YWl0X2Zvcl9kaXNlcWMoc3RhdGUpOwogCisJLyogcmVzdGFydCBjb250aW51b3VzIHRvbmUgaWYgZW5hYmxlZCAqLworCWlmICh0b25lICYgMHgxMCkgeworCQljeDI0MTIzX3dyaXRlcmVnKHN0YXRlLCAweDI5LCB0b25lICYgfjB4NDApOworCX0KKwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGN4MjQxMjNfZGlzZXFjX3NlbmRfYnVyc3Qoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGZlX3NlY19taW5pX2NtZF90IGJ1cnN0KQogewogCXN0cnVjdCBjeDI0MTIzX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwotCWludCB2YWw7CisJaW50IHZhbCwgdG9uZTsKIAogCWRwcmludGsoIiVzOlxuIiwgX19GVU5DVElPTl9fKTsKIAotCS8qIGNoZWNrIGlmIGNvbnRpbnVvdXMgdG9uZSBoYXMgYmVlbiBzdG9wZWQgKi8KLQlpZiAoc3RhdGUtPmNvbmZpZy0+dXNlX2lzbDY0MjEpCi0JCXZhbCA9IGN4MjQxMjNfcmVhZGxuYnJlZyhzdGF0ZSwgMHgwMCkgJiAweDEwOwotCWVsc2UKLQkJdmFsID0gY3gyNDEyM19yZWFkcmVnKHN0YXRlLCAweDI5KSAmIDB4MTA7CisJLyogc3RvcCBjb250aW51b3VzIHRvbmUgaWYgZW5hYmxlZCAqLworCXRvbmUgPSBjeDI0MTIzX3JlYWRyZWcoc3RhdGUsIDB4MjkpOworCWlmICh0b25lICYgMHgxMCkKKwkJY3gyNDEyM193cml0ZXJlZyhzdGF0ZSwgMHgyOSwgdG9uZSAmIH4weDUwKTsKIAotCi0JaWYgKHZhbCkgewotCQlwcmludGsoIiVzOiBFUlJPUjogYXR0ZW1wdCB0byBzZW5kIGRpc2VxYyBjb21tYW5kIGJlZm9yZSB0b25lIGlzIG9mZlxuIiwgX19GVU5DVElPTl9fKTsKLQkJcmV0dXJuIC1FTk9UU1VQUDsKLQl9Ci0KKwkvKiB3YWl0IGZvciBkaXNlcWMgcXVldWUgcmVhZHkgKi8KIAljeDI0MTIzX3dhaXRfZm9yX2Rpc2VxYyhzdGF0ZSk7CiAKIAkvKiBzZWxlY3QgdG9uZSBtb2RlICovCi0JdmFsID0gY3gyNDEyM19yZWFkcmVnKHN0YXRlLCAweDJhKSAmIDB4Zjg7Ci0JY3gyNDEyM193cml0ZXJlZyhzdGF0ZSwgMHgyYSwgdmFsIHwgMHgwNCk7Ci0KKwljeDI0MTIzX3dyaXRlcmVnKHN0YXRlLCAweDJhLCBjeDI0MTIzX3JlYWRyZWcoc3RhdGUsIDB4MmEpIHwgMHg0KTsKKwltc2xlZXAoMzApOwogCXZhbCA9IGN4MjQxMjNfcmVhZHJlZyhzdGF0ZSwgMHgyOSk7Ci0KIAlpZiAoYnVyc3QgPT0gU0VDX01JTklfQSkKIAkJY3gyNDEyM193cml0ZXJlZyhzdGF0ZSwgMHgyOSwgKCh2YWwgJiAweDkwKSB8IDB4NDAgfCAweDAwKSk7CiAJZWxzZSBpZiAoYnVyc3QgPT0gU0VDX01JTklfQikKQEAgLTgzNSw3ICs3NTYsMTIgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAljeDI0MTIzX3dhaXRfZm9yX2Rpc2VxYyhzdGF0ZSk7CisJY3gyNDEyM193cml0ZXJlZyhzdGF0ZSwgMHgyYSwgY3gyNDEyM19yZWFkcmVnKHN0YXRlLCAweDJhKSAmIDB4ZmIpOwogCisJLyogcmVzdGFydCBjb250aW51b3VzIHRvbmUgaWYgZW5hYmxlZCAqLworCWlmICh0b25lICYgMHgxMCkgeworCQljeDI0MTIzX3dyaXRlcmVnKHN0YXRlLCAweDI5LCB0b25lICYgfjB4NDApOworCX0KIAlyZXR1cm4gMDsKIH0KIApAQCAtOTc2LDM4ICs5MDIsMjEgQEAKIAlzdHJ1Y3QgY3gyNDEyM19zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAl1OCB2YWw7CiAKLQlzd2l0Y2ggKHN0YXRlLT5jb25maWctPnVzZV9pc2w2NDIxKSB7Ci0JY2FzZSAxOgorCS8qIHdhaXQgZm9yIGRpc2VxYyBxdWV1ZSByZWFkeSAqLworCWN4MjQxMjNfd2FpdF9mb3JfZGlzZXFjKHN0YXRlKTsKIAotCQl2YWwgPSBjeDI0MTIzX3JlYWRsbmJyZWcoc3RhdGUsIDB4MCk7CisJdmFsID0gY3gyNDEyM19yZWFkcmVnKHN0YXRlLCAweDI5KSAmIH4weDQwOwogCi0JCXN3aXRjaCAodG9uZSkgewotCQljYXNlIFNFQ19UT05FX09OOgotCQkJZHByaW50aygiJXM6ICBpc2w2NDIxIHNlYyB0b25lIG9uXG4iLF9fRlVOQ1RJT05fXyk7Ci0JCQlyZXR1cm4gY3gyNDEyM193cml0ZWxuYnJlZyhzdGF0ZSwgMHgwLCB2YWwgfCAweDEwKTsKLQkJY2FzZSBTRUNfVE9ORV9PRkY6Ci0JCQlkcHJpbnRrKCIlczogIGlzbDY0MjEgc2VjIHRvbmUgb2ZmXG4iLF9fRlVOQ1RJT05fXyk7Ci0JCQlyZXR1cm4gY3gyNDEyM193cml0ZWxuYnJlZyhzdGF0ZSwgMHgwLCB2YWwgJiAweDJmKTsKLQkJZGVmYXVsdDoKLQkJCXByaW50aygiJXM6IENBU0UgcmVhY2hlZCBkZWZhdWx0IHdpdGggdG9uZT0lZFxuIiwgX19GVU5DVElPTl9fLCB0b25lKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0KLQljYXNlIDA6Ci0KLQkJdmFsID0gY3gyNDEyM19yZWFkcmVnKHN0YXRlLCAweDI5KTsKLQotCQlzd2l0Y2ggKHRvbmUpIHsKLQkJY2FzZSBTRUNfVE9ORV9PTjoKLQkJCWRwcmludGsoIiVzOiBzZXR0aW5nIHRvbmUgb25cbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCQlyZXR1cm4gY3gyNDEyM193cml0ZXJlZyhzdGF0ZSwgMHgyOSwgdmFsIHwgMHgxMCk7Ci0JCWNhc2UgU0VDX1RPTkVfT0ZGOgotCQkJZHByaW50aygiJXM6IHNldHRpbmcgdG9uZSBvZmZcbiIsX19GVU5DVElPTl9fKTsKLQkJCXJldHVybiBjeDI0MTIzX3dyaXRlcmVnKHN0YXRlLCAweDI5LCB2YWwgJiAweGVmKTsKLQkJZGVmYXVsdDoKLQkJCXByaW50aygiJXM6IENBU0UgcmVhY2hlZCBkZWZhdWx0IHdpdGggdG9uZT0lZFxuIiwgX19GVU5DVElPTl9fLCB0b25lKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9CisJc3dpdGNoICh0b25lKSB7CisJY2FzZSBTRUNfVE9ORV9PTjoKKwkJZHByaW50aygiJXM6IHNldHRpbmcgdG9uZSBvblxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIGN4MjQxMjNfd3JpdGVyZWcoc3RhdGUsIDB4MjksIHZhbCB8IDB4MTApOworCWNhc2UgU0VDX1RPTkVfT0ZGOgorCQlkcHJpbnRrKCIlczogc2V0dGluZyB0b25lIG9mZlxuIixfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gY3gyNDEyM193cml0ZXJlZyhzdGF0ZSwgMHgyOSwgdmFsICYgMHhlZik7CisJZGVmYXVsdDoKKwkJcHJpbnRrKCIlczogQ0FTRSByZWFjaGVkIGRlZmF1bHQgd2l0aCB0b25lPSVkXG4iLCBfX0ZVTkNUSU9OX18sIHRvbmUpOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTEwNDAsMTAgKzk0OSw4IEBACiAJLyogc2V0dXAgdGhlIHN0YXRlICovCiAJc3RhdGUtPmNvbmZpZyA9IGNvbmZpZzsKIAlzdGF0ZS0+aTJjID0gaTJjOwotCW1lbWNweSgmc3RhdGUtPm9wcywgJmN4MjQxMjNfb3BzLCBzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMpKTsKIAlzdGF0ZS0+bGFzdGJlciA9IDA7CiAJc3RhdGUtPnNuciA9IDA7Ci0Jc3RhdGUtPmxuYnJlZyA9IDA7CiAJc3RhdGUtPlZDQWFyZyA9IDA7CiAJc3RhdGUtPlZHQWFyZyA9IDA7CiAJc3RhdGUtPmJhbmRzZWxlY3RhcmcgPSAwOwpAQCAtMTA1OSw3ICs5NjYsNyBAQAogCX0KIAogCS8qIGNyZWF0ZSBkdmJfZnJvbnRlbmQgKi8KLQlzdGF0ZS0+ZnJvbnRlbmQub3BzID0gJnN0YXRlLT5vcHM7CisJbWVtY3B5KCZzdGF0ZS0+ZnJvbnRlbmQub3BzLCAmY3gyNDEyM19vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOwogCXN0YXRlLT5mcm9udGVuZC5kZW1vZHVsYXRvcl9wcml2ID0gc3RhdGU7CiAJcmV0dXJuICZzdGF0ZS0+ZnJvbnRlbmQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDI0MTIzLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3gyNDEyMy5oCmluZGV4IDBjOTIyYjUuLjk2MDZmODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDI0MTIzLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjQxMjMuaApAQCAtMjgsMjEgKzI4LDggQEAKIAkvKiB0aGUgZGVtb2R1bGF0b3IncyBpMmMgYWRkcmVzcyAqLwogCXU4IGRlbW9kX2FkZHJlc3M7CiAKLQkvKgotCSAgIGNhcmRzIGxpa2UgSGF1cHBhdWdlIE5vdmEtUyBQbHVzL05vdmEtU0UyIHVzZSBhbiBJbnRlcnNpbCBJU0w2NDIxIGNoaXAKLQkgICBmb3IgTE5CIGNvbnRyb2wsIHdoaWxlIEtXb3JsZCBEVkItUyAxMDAgdXNlIHRoZSBMTkJEQyBhbmQgTE5CVG9uZSBiaXRzCi0JICAgZnJvbSByZWdpc3RlciAweDI5IG9mIHRoZSBDWDI0MTIzIGRlbW9kdWxhdG9yCi0JKi8KLQlpbnQgdXNlX2lzbDY0MjE7Ci0KLQkvKiBQTEwgbWFpbnRlbmFuY2UgKi8KLQlpbnQgKCpwbGxfaW5pdCkoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpOwotCWludCAoKnBsbF9zZXQpKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcyk7Ci0KIAkvKiBOZWVkIHRvIHNldCBkZXZpY2UgcGFyYW0gZm9yIHN0YXJ0X2RtYSAqLwogCWludCAoKnNldF90c19wYXJhbXMpKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBpbnQgaXNfcHVuY3R1cmVkKTsKLQotCXZvaWQgKCplbmFibGVfbG5iX3ZvbHRhZ2UpKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBpbnQgb24pOwogfTsKIAogZXh0ZXJuIHN0cnVjdCBkdmJfZnJvbnRlbmQqIGN4MjQxMjNfYXR0YWNoKGNvbnN0IHN0cnVjdCBjeDI0MTIzX2NvbmZpZyogY29uZmlnLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYjMwMDAtY29tbW9uLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliMzAwMC1jb21tb24uaAppbmRleCBjMzFkNmRmLi5iZTFjMGQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliMzAwMC1jb21tb24uaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliMzAwMC1jb21tb24uaApAQCAtMzgsOCArMzgsNiBAQAogc3RydWN0IGRpYjMwMDBfc3RhdGUgewogCXN0cnVjdCBpMmNfYWRhcHRlciogaTJjOwogCi0Jc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMgb3BzOwotCiAvKiBjb25maWd1cmF0aW9uIHNldHRpbmdzICovCiAJc3RydWN0IGRpYjMwMDBfY29uZmlnIGNvbmZpZzsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYjMwMDAuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWIzMDAwLmgKaW5kZXggMmQ1NDc1Yi4uZWM5Mjc2MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYjMwMDAuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliMzAwMC5oCkBAIC0zMCwxMCArMzAsNiBAQAogewogCS8qIHRoZSBkZW1vZHVsYXRvcidzIGkyYyBhZGRyZXNzICovCiAJdTggZGVtb2RfYWRkcmVzczsKLQotCS8qIFBMTCBtYWludGVuYW5jZSBhbmQgdGhlIGkyYyBhZGRyZXNzIG9mIHRoZSBQTEwgKi8KLQlpbnQgKCpwbGxfaW5pdCkoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpOwotCWludCAoKnBsbF9zZXQpKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcyk7CiB9OwogCiBzdHJ1Y3QgZGliX2ZlX3hmZXJfb3BzCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliMzAwMG1iLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliMzAwMG1iLmMKaW5kZXggYWU1ODlhZC4uN2M2ZGM3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYjMwMDBtYi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWIzMDAwbWIuYwpAQCAtNjAsOCArNjAsOSBAQAogCWZlX2NvZGVfcmF0ZV90IGZlX2NyID0gRkVDX05PTkU7CiAJaW50IHNlYXJjaF9zdGF0ZSwgc2VxOwogCi0JaWYgKHR1bmVyICYmIHN0YXRlLT5jb25maWcucGxsX3NldCkgewotCQlzdGF0ZS0+Y29uZmlnLnBsbF9zZXQoZmUsIGZlcCk7CisJaWYgKHR1bmVyICYmIGZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMpIHsKKwkJZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyhmZSwgZmVwKTsKKwkJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkgZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAwKTsKIAogCQlkZWJfc2V0ZigiYmFuZHdpZHRoOiAiKTsKIAkJc3dpdGNoIChvZmRtLT5iYW5kd2lkdGgpIHsKQEAgLTM4Niw5ICszODcsNiBAQAogCiAJd3IoRElCMzAwME1CX1JFR19EQVRBX0lOX0RJVkVSU0lUWSwgRElCMzAwME1CX0RBVEFfRElWRVJTSVRZX0lOX09GRik7CiAKLQlpZiAoc3RhdGUtPmNvbmZpZy5wbGxfaW5pdCkKLQkJc3RhdGUtPmNvbmZpZy5wbGxfaW5pdChmZSk7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtNzA3LDcgKzcwNSw2IEBACiAJLyogc2V0dXAgdGhlIHN0YXRlICovCiAJc3RhdGUtPmkyYyA9IGkyYzsKIAltZW1jcHkoJnN0YXRlLT5jb25maWcsY29uZmlnLHNpemVvZihzdHJ1Y3QgZGliMzAwMF9jb25maWcpKTsKLQltZW1jcHkoJnN0YXRlLT5vcHMsICZkaWIzMDAwbWJfb3BzLCBzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMpKTsKIAogCS8qIGNoZWNrIGZvciB0aGUgY29ycmVjdCBkZW1vZCAqLwogCWlmIChyZChESUIzMDAwX1JFR19NQU5VRkFDVE9SX0lEKSAhPSBESUIzMDAwX0kyQ19JRF9ESUJDT00pCkBAIC03MTcsNyArNzE0LDcgQEAKIAkJZ290byBlcnJvcjsKIAogCS8qIGNyZWF0ZSBkdmJfZnJvbnRlbmQgKi8KLQlzdGF0ZS0+ZnJvbnRlbmQub3BzID0gJnN0YXRlLT5vcHM7CisJbWVtY3B5KCZzdGF0ZS0+ZnJvbnRlbmQub3BzLCAmZGliMzAwMG1iX29wcywgc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzKSk7CiAJc3RhdGUtPmZyb250ZW5kLmRlbW9kdWxhdG9yX3ByaXYgPSBzdGF0ZTsKIAogCS8qIHNldCB0aGUgeGZlciBvcGVyYXRpb25zICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliMzAwMG1jLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliMzAwMG1jLmMKaW5kZXggM2IzMDNkYi4uNmMzYmUyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYjMwMDBtYy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWIzMDAwbWMuYwpAQCAtNDYyLDggKzQ2Miw5IEBACiAJaW50IHNlYXJjaF9zdGF0ZSxhdXRvX3ZhbDsKIAl1MTYgdmFsOwogCi0JaWYgKHR1bmVyICYmIHN0YXRlLT5jb25maWcucGxsX3NldCkgeyAvKiBpbml0aWFsIGNhbGwgZnJvbSBkdmIgKi8KLQkJc3RhdGUtPmNvbmZpZy5wbGxfc2V0KGZlLGZlcCk7CisJaWYgKHR1bmVyICYmIGZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMpIHsgLyogaW5pdGlhbCBjYWxsIGZyb20gZHZiICovCisJCWZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMoZmUsIGZlcCk7CisJCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpIGZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMCk7CiAKIAkJc3RhdGUtPmxhc3RfdHVuZWRfZnJlcSA9IGZlcC0+ZnJlcXVlbmN5OwogCS8vCWlmICghc2NhbmJvb3N0KSB7CkBAIC02NDIsOSArNjQzLDYgQEAKIAogCXNldF9vcihESUIzMDAwTUNfUkVHX0NMS19DRkdfNyxESUIzMDAwTUNfQ0xLX0NGR183X0RJVl9JTl9PRkYpOwogCi0JaWYgKHN0YXRlLT5jb25maWcucGxsX2luaXQpCi0JCXN0YXRlLT5jb25maWcucGxsX2luaXQoZmUpOwotCiAJZGViX2luZm8oImluaXQgZW5kXG4iKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTgzOSw3ICs4MzcsNiBAQAogCS8qIHNldHVwIHRoZSBzdGF0ZSAqLwogCXN0YXRlLT5pMmMgPSBpMmM7CiAJbWVtY3B5KCZzdGF0ZS0+Y29uZmlnLGNvbmZpZyxzaXplb2Yoc3RydWN0IGRpYjMwMDBfY29uZmlnKSk7Ci0JbWVtY3B5KCZzdGF0ZS0+b3BzLCAmZGliMzAwMG1jX29wcywgc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzKSk7CiAKIAkvKiBjaGVjayBmb3IgdGhlIGNvcnJlY3QgZGVtb2QgKi8KIAlpZiAocmQoRElCMzAwMF9SRUdfTUFOVUZBQ1RPUl9JRCkgIT0gRElCMzAwMF9JMkNfSURfRElCQ09NKQpAQCAtODU5LDcgKzg1Niw3IEBACiAJfQogCiAJLyogY3JlYXRlIGR2Yl9mcm9udGVuZCAqLwotCXN0YXRlLT5mcm9udGVuZC5vcHMgPSAmc3RhdGUtPm9wczsKKwltZW1jcHkoJnN0YXRlLT5mcm9udGVuZC5vcHMsICZkaWIzMDAwbWNfb3BzLCBzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMpKTsKIAlzdGF0ZS0+ZnJvbnRlbmQuZGVtb2R1bGF0b3JfcHJpdiA9IHN0YXRlOwogCiAJLyogc2V0IHRoZSB4ZmVyIG9wZXJhdGlvbnMgKi8KQEAgLTg3Niw2ICs4NzMsNyBAQAogCWtmcmVlKHN0YXRlKTsKIAlyZXR1cm4gTlVMTDsKIH0KK0VYUE9SVF9TWU1CT0woZGliMzAwMG1jX2F0dGFjaCk7CiAKIHN0YXRpYyBzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyBkaWIzMDAwbWNfb3BzID0gewogCkBAIC05MTQsNSArOTEyLDMgQEAKIE1PRFVMRV9BVVRIT1IoRFJJVkVSX0FVVEhPUik7CiBNT0RVTEVfREVTQ1JJUFRJT04oRFJJVkVSX0RFU0MpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi1FWFBPUlRfU1lNQk9MKGRpYjMwMDBtY19hdHRhY2gpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2R2Yi1wbGwuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kdmItcGxsLmMKaW5kZXggNzkxNzA2ZS4uYTE4OTY4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2R2Yi1wbGwuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZHZiLXBsbC5jCkBAIC0yMjcsMTAgKzIyNywxMCBAQAogRVhQT1JUX1NZTUJPTChkdmJfcGxsX3R1YTYwMzQpOwogCiAvKiBJbmZpbmVvbiBUVUE2MDM0Ci0gKiB1c2VkIGluIExHIFREVlMgSDA2MUYgYW5kIExHIFREVlMgSDA2MkYKKyAqIHVzZWQgaW4gTEcgVERWUy1IMDYxRiwgTEcgVERWUy1IMDYyRiBhbmQgTEcgVERWUy1IMDY0RgogICovCi1zdHJ1Y3QgZHZiX3BsbF9kZXNjIGR2Yl9wbGxfdGR2c190dWE2MDM0ID0gewotCS5uYW1lICA9ICJMRy9JbmZpbmVvbiBUVUE2MDM0IiwKK3N0cnVjdCBkdmJfcGxsX2Rlc2MgZHZiX3BsbF9sZ190ZHZzX2gwNnhmID0geworCS5uYW1lICA9ICJMRyBURFZTLUgwNnhGIiwKIAkubWluICAgPSAgNTQwMDAwMDAsCiAJLm1heCAgID0gODYzMDAwMDAwLAogCS5jb3VudCA9IDMsCkBAIC0yNDAsNyArMjQwLDcgQEAKIAkJeyAgOTk5OTk5OTk5LCA0NDAwMDAwMCwgNjI1MDAsIDB4Y2UsIDB4MDQgfSwKIAl9LAogfTsKLUVYUE9SVF9TWU1CT0woZHZiX3BsbF90ZHZzX3R1YTYwMzQpOworRVhQT1JUX1NZTUJPTChkdmJfcGxsX2xnX3RkdnNfaDA2eGYpOwogCiAvKiBQaGlsaXBzIEZNRDEyMTZNRQogICogdXNlZCBpbiBNZWRpb24gSHlicmlkIFBDTUNJQSBjYXJkIGFuZCBVU0IgQm94CkBAIC00MTksNiArNDE5LDE5IEBACiB9OwogRVhQT1JUX1NZTUJPTChkdmJfcGxsX3Rob21zb25fZmU2NjAwKTsKIAorc3RydWN0IGR2Yl9wbGxfcHJpdiB7CisJLyogaTJjIGRldGFpbHMgKi8KKwlpbnQgcGxsX2kyY19hZGRyZXNzOworCXN0cnVjdCBpMmNfYWRhcHRlciAqaTJjOworCisJLyogdGhlIFBMTCBkZXNjcmlwdG9yICovCisJc3RydWN0IGR2Yl9wbGxfZGVzYyAqcGxsX2Rlc2M7CisKKwkvKiBjYWNoZWQgZnJlcXVlbmN5L2JhbmR3aWR0aCAqLworCXUzMiBmcmVxdWVuY3k7CisJdTMyIGJhbmR3aWR0aDsKK307CisKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAvKiBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogCkBAIC00NDMsNyArNDU2LDggQEAKIAlpZiAoZGVidWcpCiAJCXByaW50aygicGxsOiAlczogZnJlcT0lZCBidz0lZCB8IGk9JWQvJWRcbiIsCiAJCSAgICAgICBkZXNjLT5uYW1lLCBmcmVxLCBiYW5kd2lkdGgsIGksIGRlc2MtPmNvdW50KTsKLQlCVUdfT04oaSA9PSBkZXNjLT5jb3VudCk7CisJaWYgKGkgPT0gZGVzYy0+Y291bnQpCisJCXJldHVybiAtRUlOVkFMOwogCiAJZGl2ID0gKGZyZXEgKyBkZXNjLT5lbnRyaWVzW2ldLm9mZnNldCkgLyBkZXNjLT5lbnRyaWVzW2ldLnN0ZXBzaXplOwogCWJ1ZlswXSA9IGRpdiA+PiA4OwpAQCAtNDYyLDYgKzQ3NiwxNjMgQEAKIH0KIEVYUE9SVF9TWU1CT0woZHZiX3BsbF9jb25maWd1cmUpOwogCitzdGF0aWMgaW50IGR2Yl9wbGxfcmVsZWFzZShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3sKKwlpZiAoZmUtPnR1bmVyX3ByaXYpCisJCWtmcmVlKGZlLT50dW5lcl9wcml2KTsKKwlmZS0+dHVuZXJfcHJpdiA9IE5VTEw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHZiX3BsbF9zbGVlcChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3sKKwlzdHJ1Y3QgZHZiX3BsbF9wcml2ICpwcml2ID0gZmUtPnR1bmVyX3ByaXY7CisJdTggYnVmWzRdOworCXN0cnVjdCBpMmNfbXNnIG1zZyA9CisJCXsgLmFkZHIgPSBwcml2LT5wbGxfaTJjX2FkZHJlc3MsIC5mbGFncyA9IDAsIC5idWYgPSBidWYsIC5sZW4gPSBzaXplb2YoYnVmKSB9OworCWludCBpOworCWludCByZXN1bHQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+cGxsX2Rlc2MtPmNvdW50OyBpKyspIHsKKwkJaWYgKHByaXYtPnBsbF9kZXNjLT5lbnRyaWVzW2ldLmxpbWl0ID09IDApCisJCQlicmVhazsKKwl9CisJaWYgKGkgPT0gcHJpdi0+cGxsX2Rlc2MtPmNvdW50KQorCQlyZXR1cm4gMDsKKworCWJ1ZlswXSA9IDA7CisJYnVmWzFdID0gMDsKKwlidWZbMl0gPSBwcml2LT5wbGxfZGVzYy0+ZW50cmllc1tpXS5jb25maWc7CisJYnVmWzNdID0gcHJpdi0+cGxsX2Rlc2MtPmVudHJpZXNbaV0uY2I7CisKKwlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDEpOworCWlmICgocmVzdWx0ID0gaTJjX3RyYW5zZmVyKHByaXYtPmkyYywgJm1zZywgMSkpICE9IDEpIHsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkdmJfcGxsX3NldF9wYXJhbXMoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcGFyYW1zKQoreworCXN0cnVjdCBkdmJfcGxsX3ByaXYgKnByaXYgPSBmZS0+dHVuZXJfcHJpdjsKKwl1OCBidWZbNF07CisJc3RydWN0IGkyY19tc2cgbXNnID0KKwkJeyAuYWRkciA9IHByaXYtPnBsbF9pMmNfYWRkcmVzcywgLmZsYWdzID0gMCwgLmJ1ZiA9IGJ1ZiwgLmxlbiA9IHNpemVvZihidWYpIH07CisJaW50IHJlc3VsdDsKKwl1MzIgZGl2OworCWludCBpOworCXUzMiBiYW5kd2lkdGggPSAwOworCisJaWYgKHByaXYtPmkyYyA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8vIERWQlQgYmFuZHdpZHRoIG9ubHkganVzdCBub3cKKwlpZiAoZmUtPm9wcy5pbmZvLnR5cGUgPT0gRkVfT0ZETSkgeworCQliYW5kd2lkdGggPSBwYXJhbXMtPnUub2ZkbS5iYW5kd2lkdGg7CisJfQorCisJaWYgKChyZXN1bHQgPSBkdmJfcGxsX2NvbmZpZ3VyZShwcml2LT5wbGxfZGVzYywgYnVmLCBwYXJhbXMtPmZyZXF1ZW5jeSwgYmFuZHdpZHRoKSkgIT0gMCkKKwkJcmV0dXJuIHJlc3VsdDsKKworCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMSk7CisJaWYgKChyZXN1bHQgPSBpMmNfdHJhbnNmZXIocHJpdi0+aTJjLCAmbXNnLCAxKSkgIT0gMSkgeworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8vIGNhbGN1bGF0ZSB0aGUgZnJlcXVlbmN5IHdlIHNldCBpdCB0bworCWZvciAoaSA9IDA7IGkgPCBwcml2LT5wbGxfZGVzYy0+Y291bnQ7IGkrKykgeworCQlpZiAocGFyYW1zLT5mcmVxdWVuY3kgPiBwcml2LT5wbGxfZGVzYy0+ZW50cmllc1tpXS5saW1pdCkKKwkJCWNvbnRpbnVlOworCQlicmVhazsKKwl9CisJZGl2ID0gKHBhcmFtcy0+ZnJlcXVlbmN5ICsgcHJpdi0+cGxsX2Rlc2MtPmVudHJpZXNbaV0ub2Zmc2V0KSAvIHByaXYtPnBsbF9kZXNjLT5lbnRyaWVzW2ldLnN0ZXBzaXplOworCXByaXYtPmZyZXF1ZW5jeSA9IChkaXYgKiBwcml2LT5wbGxfZGVzYy0+ZW50cmllc1tpXS5zdGVwc2l6ZSkgLSBwcml2LT5wbGxfZGVzYy0+ZW50cmllc1tpXS5vZmZzZXQ7CisJcHJpdi0+YmFuZHdpZHRoID0gYmFuZHdpZHRoOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHZiX3BsbF9jYWxjX3JlZ3Moc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcGFyYW1zLCB1OCAqYnVmLCBpbnQgYnVmX2xlbikKK3sKKwlzdHJ1Y3QgZHZiX3BsbF9wcml2ICpwcml2ID0gZmUtPnR1bmVyX3ByaXY7CisJaW50IHJlc3VsdDsKKwl1MzIgZGl2OworCWludCBpOworCXUzMiBiYW5kd2lkdGggPSAwOworCisJaWYgKGJ1Zl9sZW4gPCA1KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8vIERWQlQgYmFuZHdpZHRoIG9ubHkganVzdCBub3cKKwlpZiAoZmUtPm9wcy5pbmZvLnR5cGUgPT0gRkVfT0ZETSkgeworCQliYW5kd2lkdGggPSBwYXJhbXMtPnUub2ZkbS5iYW5kd2lkdGg7CisJfQorCisJaWYgKChyZXN1bHQgPSBkdmJfcGxsX2NvbmZpZ3VyZShwcml2LT5wbGxfZGVzYywgYnVmKzEsIHBhcmFtcy0+ZnJlcXVlbmN5LCBiYW5kd2lkdGgpKSAhPSAwKQorCQlyZXR1cm4gcmVzdWx0OworCWJ1ZlswXSA9IHByaXYtPnBsbF9pMmNfYWRkcmVzczsKKworCS8vIGNhbGN1bGF0ZSB0aGUgZnJlcXVlbmN5IHdlIHNldCBpdCB0bworCWZvciAoaSA9IDA7IGkgPCBwcml2LT5wbGxfZGVzYy0+Y291bnQ7IGkrKykgeworCQlpZiAocGFyYW1zLT5mcmVxdWVuY3kgPiBwcml2LT5wbGxfZGVzYy0+ZW50cmllc1tpXS5saW1pdCkKKwkJCWNvbnRpbnVlOworCQlicmVhazsKKwl9CisJZGl2ID0gKHBhcmFtcy0+ZnJlcXVlbmN5ICsgcHJpdi0+cGxsX2Rlc2MtPmVudHJpZXNbaV0ub2Zmc2V0KSAvIHByaXYtPnBsbF9kZXNjLT5lbnRyaWVzW2ldLnN0ZXBzaXplOworCXByaXYtPmZyZXF1ZW5jeSA9IChkaXYgKiBwcml2LT5wbGxfZGVzYy0+ZW50cmllc1tpXS5zdGVwc2l6ZSkgLSBwcml2LT5wbGxfZGVzYy0+ZW50cmllc1tpXS5vZmZzZXQ7CisJcHJpdi0+YmFuZHdpZHRoID0gYmFuZHdpZHRoOworCisJcmV0dXJuIDU7Cit9CisKK3N0YXRpYyBpbnQgZHZiX3BsbF9nZXRfZnJlcXVlbmN5KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCB1MzIgKmZyZXF1ZW5jeSkKK3sKKwlzdHJ1Y3QgZHZiX3BsbF9wcml2ICpwcml2ID0gZmUtPnR1bmVyX3ByaXY7CisJKmZyZXF1ZW5jeSA9IHByaXYtPmZyZXF1ZW5jeTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkdmJfcGxsX2dldF9iYW5kd2lkdGgoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHUzMiAqYmFuZHdpZHRoKQoreworCXN0cnVjdCBkdmJfcGxsX3ByaXYgKnByaXYgPSBmZS0+dHVuZXJfcHJpdjsKKwkqYmFuZHdpZHRoID0gcHJpdi0+YmFuZHdpZHRoOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGR2Yl90dW5lcl9vcHMgZHZiX3BsbF90dW5lcl9vcHMgPSB7CisJLnJlbGVhc2UgPSBkdmJfcGxsX3JlbGVhc2UsCisJLnNsZWVwID0gZHZiX3BsbF9zbGVlcCwKKwkuc2V0X3BhcmFtcyA9IGR2Yl9wbGxfc2V0X3BhcmFtcywKKwkuY2FsY19yZWdzID0gZHZiX3BsbF9jYWxjX3JlZ3MsCisJLmdldF9mcmVxdWVuY3kgPSBkdmJfcGxsX2dldF9mcmVxdWVuY3ksCisJLmdldF9iYW5kd2lkdGggPSBkdmJfcGxsX2dldF9iYW5kd2lkdGgsCit9OworCitpbnQgZHZiX3BsbF9hdHRhY2goc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIGludCBwbGxfYWRkciwgc3RydWN0IGkyY19hZGFwdGVyICppMmMsIHN0cnVjdCBkdmJfcGxsX2Rlc2MgKmRlc2MpCit7CisJc3RydWN0IGR2Yl9wbGxfcHJpdiAqcHJpdiA9IE5VTEw7CisKKwlwcml2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGR2Yl9wbGxfcHJpdiksIEdGUF9LRVJORUwpOworCWlmIChwcml2ID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJcHJpdi0+cGxsX2kyY19hZGRyZXNzID0gcGxsX2FkZHI7CisJcHJpdi0+aTJjID0gaTJjOworCXByaXYtPnBsbF9kZXNjID0gZGVzYzsKKworCW1lbWNweSgmZmUtPm9wcy50dW5lcl9vcHMsICZkdmJfcGxsX3R1bmVyX29wcywgc2l6ZW9mKHN0cnVjdCBkdmJfdHVuZXJfb3BzKSk7CisJc3RybmNweShmZS0+b3BzLnR1bmVyX29wcy5pbmZvLm5hbWUsIGRlc2MtPm5hbWUsIDEyOCk7CisJZmUtPm9wcy50dW5lcl9vcHMuaW5mby5mcmVxdWVuY3lfbWluID0gZGVzYy0+bWluOworCWZlLT5vcHMudHVuZXJfb3BzLmluZm8uZnJlcXVlbmN5X21pbiA9IGRlc2MtPm1heDsKKworCWZlLT50dW5lcl9wcml2ID0gcHJpdjsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woZHZiX3BsbF9hdHRhY2gpOworCiBNT0RVTEVfREVTQ1JJUFRJT04oImR2YiBwbGwgbGlicmFyeSIpOwogTU9EVUxFX0FVVEhPUigiR2VyZCBLbm9yciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2R2Yi1wbGwuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kdmItcGxsLmgKaW5kZXggMmI4NDYxNy4uNjYzNjFjZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2R2Yi1wbGwuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZHZiLXBsbC5oCkBAIC01LDYgKzUsOSBAQAogI2lmbmRlZiBfX0RWQl9QTExfSF9fCiAjZGVmaW5lIF9fRFZCX1BMTF9IX18KIAorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgImR2Yl9mcm9udGVuZC5oIgorCiBzdHJ1Y3QgZHZiX3BsbF9kZXNjIHsKIAljaGFyICpuYW1lOwogCXUzMiAgbWluOwpAQCAtMzEsNyArMzQsNyBAQAogZXh0ZXJuIHN0cnVjdCBkdmJfcGxsX2Rlc2MgZHZiX3BsbF90dWE2MDEweHM7CiBleHRlcm4gc3RydWN0IGR2Yl9wbGxfZGVzYyBkdmJfcGxsX2VudjU3aDF4ZDU7CiBleHRlcm4gc3RydWN0IGR2Yl9wbGxfZGVzYyBkdmJfcGxsX3R1YTYwMzQ7Ci1leHRlcm4gc3RydWN0IGR2Yl9wbGxfZGVzYyBkdmJfcGxsX3RkdnNfdHVhNjAzNDsKK2V4dGVybiBzdHJ1Y3QgZHZiX3BsbF9kZXNjIGR2Yl9wbGxfbGdfdGR2c19oMDZ4ZjsKIGV4dGVybiBzdHJ1Y3QgZHZiX3BsbF9kZXNjIGR2Yl9wbGxfdGRhNjY1eDsKIGV4dGVybiBzdHJ1Y3QgZHZiX3BsbF9kZXNjIGR2Yl9wbGxfZm1kMTIxNm1lOwogZXh0ZXJuIHN0cnVjdCBkdmJfcGxsX2Rlc2MgZHZiX3BsbF90ZGVkNDsKQEAgLTQ0LDcgKzQ3LDE4IEBACiAKIGV4dGVybiBzdHJ1Y3QgZHZiX3BsbF9kZXNjIGR2Yl9wbGxfdGhvbXNvbl9mZTY2MDA7CiAKLWludCBkdmJfcGxsX2NvbmZpZ3VyZShzdHJ1Y3QgZHZiX3BsbF9kZXNjICpkZXNjLCB1OCAqYnVmLAorZXh0ZXJuIGludCBkdmJfcGxsX2NvbmZpZ3VyZShzdHJ1Y3QgZHZiX3BsbF9kZXNjICpkZXNjLCB1OCAqYnVmLAogCQkgICAgICB1MzIgZnJlcSwgaW50IGJhbmR3aWR0aCk7CiAKKy8qKgorICogQXR0YWNoIGEgZHZiLXBsbCB0byB0aGUgc3VwcGxpZWQgZnJvbnRlbmQgc3RydWN0dXJlLgorICoKKyAqIEBwYXJhbSBmZSBGcm9udGVuZCB0byBhdHRhY2ggdG8uCisgKiBAcGFyYW0gcGxsX2FkZHIgaTJjIGFkZHJlc3Mgb2YgdGhlIFBMTCAoaWYgdXNlZCkuCisgKiBAcGFyYW0gaTJjIGkyYyBhZGFwdGVyIHRvIHVzZSAoc2V0IHRvIE5VTEwgaWYgbm90IHVzZWQpLgorICogQHBhcmFtIGRlc2MgZHZiX3BsbF9kZXNjIHRvIHVzZS4KKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCBub256ZXJvIG9uIGZhaWx1cmUuCisgKi8KK2V4dGVybiBpbnQgZHZiX3BsbF9hdHRhY2goc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIGludCBwbGxfYWRkciwgc3RydWN0IGkyY19hZGFwdGVyICppMmMsIHN0cnVjdCBkdmJfcGxsX2Rlc2MgKmRlc2MpOworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kdmJfZHVtbXlfZmUuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kdmJfZHVtbXlfZmUuYwppbmRleCA2NDU5NDZhLi42MjcxYjFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZHZiX2R1bW15X2ZlLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2R2Yl9kdW1teV9mZS5jCkBAIC0zMCw3ICszMCw2IEBACiAKIAogc3RydWN0IGR2Yl9kdW1teV9mZV9zdGF0ZSB7Ci0Jc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMgb3BzOwogCXN0cnVjdCBkdmJfZnJvbnRlbmQgZnJvbnRlbmQ7CiB9OwogCkBAIC03Nyw2ICs3NiwxMSBAQAogCiBzdGF0aWMgaW50IGR2Yl9kdW1teV9mZV9zZXRfZnJvbnRlbmQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcCkKIHsKKwlpZiAoZmUtPm9wcy0+dHVuZXJfb3BzLT5zZXRfcGFyYW1zKSB7CisJCWZlLT5vcHMtPnR1bmVyX29wcy0+c2V0X3BhcmFtcyhmZSwgcCk7CisJCWlmIChmZS0+b3BzLT5pMmNfZ2F0ZV9jdHJsKSBmZS0+b3BzLT5pMmNfZ2F0ZV9jdHJsKGZlLCAwKTsKKwl9CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTE2LDExICsxMjAsOCBAQAogCXN0YXRlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGR2Yl9kdW1teV9mZV9zdGF0ZSksIEdGUF9LRVJORUwpOwogCWlmIChzdGF0ZSA9PSBOVUxMKSBnb3RvIGVycm9yOwogCi0JLyogc2V0dXAgdGhlIHN0YXRlICovCi0JbWVtY3B5KCZzdGF0ZS0+b3BzLCAmZHZiX2R1bW15X2ZlX29mZG1fb3BzLCBzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMpKTsKLQogCS8qIGNyZWF0ZSBkdmJfZnJvbnRlbmQgKi8KLQlzdGF0ZS0+ZnJvbnRlbmQub3BzID0gJnN0YXRlLT5vcHM7CisJbWVtY3B5KCZzdGF0ZS0+ZnJvbnRlbmQub3BzLCAmZHZiX2R1bW15X2ZlX29mZG1fb3BzLCBzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMpKTsKIAlzdGF0ZS0+ZnJvbnRlbmQuZGVtb2R1bGF0b3JfcHJpdiA9IHN0YXRlOwogCXJldHVybiAmc3RhdGUtPmZyb250ZW5kOwogCkBAIC0xMzksMTEgKzE0MCw4IEBACiAJc3RhdGUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZHZiX2R1bW15X2ZlX3N0YXRlKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHN0YXRlID09IE5VTEwpIGdvdG8gZXJyb3I7CiAKLQkvKiBzZXR1cCB0aGUgc3RhdGUgKi8KLQltZW1jcHkoJnN0YXRlLT5vcHMsICZkdmJfZHVtbXlfZmVfcXBza19vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOwotCiAJLyogY3JlYXRlIGR2Yl9mcm9udGVuZCAqLwotCXN0YXRlLT5mcm9udGVuZC5vcHMgPSAmc3RhdGUtPm9wczsKKwltZW1jcHkoJnN0YXRlLT5mcm9udGVuZC5vcHMsICZkdmJfZHVtbXlfZmVfcXBza19vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOwogCXN0YXRlLT5mcm9udGVuZC5kZW1vZHVsYXRvcl9wcml2ID0gc3RhdGU7CiAJcmV0dXJuICZzdGF0ZS0+ZnJvbnRlbmQ7CiAKQEAgLTE2MiwxMSArMTYwLDggQEAKIAlzdGF0ZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBkdmJfZHVtbXlfZmVfc3RhdGUpLCBHRlBfS0VSTkVMKTsKIAlpZiAoc3RhdGUgPT0gTlVMTCkgZ290byBlcnJvcjsKIAotCS8qIHNldHVwIHRoZSBzdGF0ZSAqLwotCW1lbWNweSgmc3RhdGUtPm9wcywgJmR2Yl9kdW1teV9mZV9xYW1fb3BzLCBzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMpKTsKLQogCS8qIGNyZWF0ZSBkdmJfZnJvbnRlbmQgKi8KLQlzdGF0ZS0+ZnJvbnRlbmQub3BzID0gJnN0YXRlLT5vcHM7CisJbWVtY3B5KCZzdGF0ZS0+ZnJvbnRlbmQub3BzLCAmZHZiX2R1bW15X2ZlX3FhbV9vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOwogCXN0YXRlLT5mcm9udGVuZC5kZW1vZHVsYXRvcl9wcml2ID0gc3RhdGU7CiAJcmV0dXJuICZzdGF0ZS0+ZnJvbnRlbmQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9pc2w2NDIxLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvaXNsNjQyMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4YzM0ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvaXNsNjQyMS5jCkBAIC0wLDAgKzEsMTQ5IEBACisvKgorICogaXNsNjQyMS5oIC0gZHJpdmVyIGZvciBsbmIgc3VwcGx5IGFuZCBjb250cm9sIGljIElTTDY0MjEKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgQW5kcmV3IGRlIFF1aW5jZXkKKyAqIENvcHlyaWdodCAoQykgMjAwNiBPbGl2ZXIgRW5kcmlzcworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorICogb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqIE9yLCBwb2ludCB5b3VyIGJyb3dzZXIgdG8gaHR0cDovL3d3dy5nbnUub3JnL2NvcHlsZWZ0L2dwbC5odG1sCisgKgorICoKKyAqIHRoZSBwcm9qZWN0J3MgcGFnZSBpcyBhdCBodHRwOi8vd3d3LmxpbnV4dHYub3JnCisgKi8KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSAiZHZiX2Zyb250ZW5kLmgiCisjaW5jbHVkZSAiaXNsNjQyMS5oIgorCitzdHJ1Y3QgaXNsNjQyMSB7CisJdTgJCQljb25maWc7CisJdTgJCQlvdmVycmlkZV9vcjsKKwl1OAkJCW92ZXJyaWRlX2FuZDsKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIJKmkyYzsKKwl1OAkJCWkyY19hZGRyOworCXZvaWQJCQkoKnJlbGVhc2VfY2hhaW4pKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKTsKK307CisKK3N0YXRpYyBpbnQgaXNsNjQyMV9zZXRfdm9sdGFnZShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgZmVfc2VjX3ZvbHRhZ2VfdCB2b2x0YWdlKQoreworCXN0cnVjdCBpc2w2NDIxICppc2w2NDIxID0gKHN0cnVjdCBpc2w2NDIxICopIGZlLT5taXNjX3ByaXY7CisJc3RydWN0IGkyY19tc2cgbXNnID0gewkuYWRkciA9IGlzbDY0MjEtPmkyY19hZGRyLCAuZmxhZ3MgPSAwLAorCQkJCS5idWYgPSAmaXNsNjQyMS0+Y29uZmlnLAorCQkJCS5sZW4gPSBzaXplb2YoaXNsNjQyMS0+Y29uZmlnKSB9OworCisJaXNsNjQyMS0+Y29uZmlnICY9IH4oSVNMNjQyMV9WU0VMMSB8IElTTDY0MjFfRU4xKTsKKworCXN3aXRjaCh2b2x0YWdlKSB7CisJY2FzZSBTRUNfVk9MVEFHRV9PRkY6CisJCWJyZWFrOworCWNhc2UgU0VDX1ZPTFRBR0VfMTM6CisJCWlzbDY0MjEtPmNvbmZpZyB8PSBJU0w2NDIxX0VOMTsKKwkJYnJlYWs7CisJY2FzZSBTRUNfVk9MVEFHRV8xODoKKwkJaXNsNjQyMS0+Y29uZmlnIHw9IChJU0w2NDIxX0VOMSB8IElTTDY0MjFfVlNFTDEpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9OworCisJaXNsNjQyMS0+Y29uZmlnIHw9IGlzbDY0MjEtPm92ZXJyaWRlX29yOworCWlzbDY0MjEtPmNvbmZpZyAmPSBpc2w2NDIxLT5vdmVycmlkZV9hbmQ7CisKKwlyZXR1cm4gKGkyY190cmFuc2Zlcihpc2w2NDIxLT5pMmMsICZtc2csIDEpID09IDEpID8gMCA6IC1FSU87Cit9CisKK3N0YXRpYyBpbnQgaXNsNjQyMV9lbmFibGVfaGlnaF9sbmJfdm9sdGFnZShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgbG9uZyBhcmcpCit7CisJc3RydWN0IGlzbDY0MjEgKmlzbDY0MjEgPSAoc3RydWN0IGlzbDY0MjEgKikgZmUtPm1pc2NfcHJpdjsKKwlzdHJ1Y3QgaTJjX21zZyBtc2cgPSB7CS5hZGRyID0gaXNsNjQyMS0+aTJjX2FkZHIsIC5mbGFncyA9IDAsCisJCQkJLmJ1ZiA9ICZpc2w2NDIxLT5jb25maWcsCisJCQkJLmxlbiA9IHNpemVvZihpc2w2NDIxLT5jb25maWcpIH07CisKKwlpZiAoYXJnKQorCQlpc2w2NDIxLT5jb25maWcgfD0gSVNMNjQyMV9MTEMxOworCWVsc2UKKwkJaXNsNjQyMS0+Y29uZmlnICY9IH5JU0w2NDIxX0xMQzE7CisKKwlpc2w2NDIxLT5jb25maWcgfD0gaXNsNjQyMS0+b3ZlcnJpZGVfb3I7CisJaXNsNjQyMS0+Y29uZmlnICY9IGlzbDY0MjEtPm92ZXJyaWRlX2FuZDsKKworCXJldHVybiAoaTJjX3RyYW5zZmVyKGlzbDY0MjEtPmkyYywgJm1zZywgMSkgPT0gMSkgPyAwIDogLUVJTzsKK30KKworc3RhdGljIHZvaWQgaXNsNjQyMV9yZWxlYXNlKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQoreworCXN0cnVjdCBpc2w2NDIxICppc2w2NDIxID0gKHN0cnVjdCBpc2w2NDIxICopIGZlLT5taXNjX3ByaXY7CisKKwkvKiBwb3dlciBvZmYgKi8KKwlpc2w2NDIxX3NldF92b2x0YWdlKGZlLCBTRUNfVk9MVEFHRV9PRkYpOworCisJLyogZnJlZSBkYXRhICYgY2FsbCBuZXh0IHJlbGVhc2Ugcm91dGluZSAqLworCWZlLT5vcHMucmVsZWFzZSA9IGlzbDY0MjEtPnJlbGVhc2VfY2hhaW47CisJa2ZyZWUoZmUtPm1pc2NfcHJpdik7CisJZmUtPm1pc2NfcHJpdiA9IE5VTEw7CisJaWYgKGZlLT5vcHMucmVsZWFzZSkKKwkJZmUtPm9wcy5yZWxlYXNlKGZlKTsKK30KKworaW50IGlzbDY0MjFfYXR0YWNoKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYywgdTggaTJjX2FkZHIsCisJCSAgIHU4IG92ZXJyaWRlX3NldCwgdTggb3ZlcnJpZGVfY2xlYXIpCit7CisJc3RydWN0IGlzbDY0MjEgKmlzbDY0MjEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaXNsNjQyMSksIEdGUF9LRVJORUwpOworCWlmICghaXNsNjQyMSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gKi8KKwlpc2w2NDIxLT5jb25maWcgPSBJU0w2NDIxX0lTRUwxOworCWlzbDY0MjEtPmkyYyA9IGkyYzsKKwlpc2w2NDIxLT5pMmNfYWRkciA9IGkyY19hZGRyOworCWZlLT5taXNjX3ByaXYgPSBpc2w2NDIxOworCisJLyogYml0cyB3aGljaCBzaG91bGQgYmUgZm9yY2VkIHRvICcxJyAqLworCWlzbDY0MjEtPm92ZXJyaWRlX29yID0gb3ZlcnJpZGVfc2V0OworCisJLyogYml0cyB3aGljaCBzaG91bGQgYmUgZm9yY2VkIHRvICcwJyAqLworCWlzbDY0MjEtPm92ZXJyaWRlX2FuZCA9IH5vdmVycmlkZV9jbGVhcjsKKworCS8qIGRldGVjdCBpZiBpdCBpcyBwcmVzZW50IG9yIG5vdCAqLworCWlmIChpc2w2NDIxX3NldF92b2x0YWdlKGZlLCBTRUNfVk9MVEFHRV9PRkYpKSB7CisJCWtmcmVlKGlzbDY0MjEpOworCQlmZS0+bWlzY19wcml2ID0gTlVMTDsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogaW5zdGFsbCByZWxlYXNlIGNhbGxiYWNrICovCisJaXNsNjQyMS0+cmVsZWFzZV9jaGFpbiA9IGZlLT5vcHMucmVsZWFzZTsKKwlmZS0+b3BzLnJlbGVhc2UgPSBpc2w2NDIxX3JlbGVhc2U7CisKKwkvKiBvdmVycmlkZSBmcm9udGVuZCBvcHMgKi8KKwlmZS0+b3BzLnNldF92b2x0YWdlID0gaXNsNjQyMV9zZXRfdm9sdGFnZTsKKwlmZS0+b3BzLmVuYWJsZV9oaWdoX2xuYl92b2x0YWdlID0gaXNsNjQyMV9lbmFibGVfaGlnaF9sbmJfdm9sdGFnZTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChpc2w2NDIxX2F0dGFjaCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIGZvciBsbmIgc3VwcGx5IGFuZCBjb250cm9sIGljIGlzbDY0MjEiKTsKK01PRFVMRV9BVVRIT1IoIkFuZHJldyBkZSBRdWluY2V5ICYgT2xpdmVyIEVuZHJpc3MiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9pc2w2NDIxLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvaXNsNjQyMS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3NWY4MGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvaXNsNjQyMS5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBpc2w2NDIxLmggLSBkcml2ZXIgZm9yIGxuYiBzdXBwbHkgYW5kIGNvbnRyb2wgaWMgSVNMNjQyMQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBBbmRyZXcgZGUgUXVpbmNleQorICogQ29weXJpZ2h0IChDKSAyMDA2IE9saXZlciBFbmRyaXNzCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisgKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICogT3IsIHBvaW50IHlvdXIgYnJvd3NlciB0byBodHRwOi8vd3d3LmdudS5vcmcvY29weWxlZnQvZ3BsLmh0bWwKKyAqCisgKgorICogdGhlIHByb2plY3QncyBwYWdlIGlzIGF0IGh0dHA6Ly93d3cubGludXh0di5vcmcKKyAqLworCisjaWZuZGVmIF9JU0w2NDIxX0gKKyNkZWZpbmUgX0lTTDY0MjFfSAorCisjaW5jbHVkZSA8bGludXgvZHZiL2Zyb250ZW5kLmg+CisKKy8qIHN5c3RlbSByZWdpc3RlciBiaXRzICovCisjZGVmaW5lIElTTDY0MjFfT0xGMQkweDAxCisjZGVmaW5lIElTTDY0MjFfRU4xCTB4MDIKKyNkZWZpbmUgSVNMNjQyMV9WU0VMMQkweDA0CisjZGVmaW5lIElTTDY0MjFfTExDMQkweDA4CisjZGVmaW5lIElTTDY0MjFfRU5UMQkweDEwCisjZGVmaW5lIElTTDY0MjFfSVNFTDEJMHgyMAorI2RlZmluZSBJU0w2NDIxX0RDTAkweDQwCisKKy8qIG92ZXJyaWRlX3NldCBhbmQgb3ZlcnJpZGVfY2xlYXIgY29udHJvbCB3aGljaCBzeXN0ZW0gcmVnaXN0ZXIgYml0cyAoYWJvdmUpIHRvIGFsd2F5cyBzZXQgJiBjbGVhciAqLworZXh0ZXJuIGludCBpc2w2NDIxX2F0dGFjaChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGkyY19hZGFwdGVyICppMmMsIHU4IGkyY19hZGRyLAorCQkJICB1OCBvdmVycmlkZV9zZXQsIHU4IG92ZXJyaWRlX2NsZWFyKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbDY0NzgxLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbDY0NzgxLmMKaW5kZXggMWM3YzkxMi4uZjNiYzgyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2w2NDc4MS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9sNjQ3ODEuYwpAQCAtMzIsNyArMzIsNiBAQAogCiBzdHJ1Y3QgbDY0NzgxX3N0YXRlIHsKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIqIGkyYzsKLQlzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyBvcHM7CiAJY29uc3Qgc3RydWN0IGw2NDc4MV9jb25maWcqIGNvbmZpZzsKIAlzdHJ1Y3QgZHZiX2Zyb250ZW5kIGZyb250ZW5kOwogCkBAIC0xNDEsNyArMTQwLDEwIEBACiAJdTggdmFsMHgwNjsKIAlpbnQgYncgPSBwLT5iYW5kd2lkdGggLSBCQU5EV0lEVEhfOF9NSFo7CiAKLQlzdGF0ZS0+Y29uZmlnLT5wbGxfc2V0KGZlLCBwYXJhbSk7CisJaWYgKGZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMpIHsKKwkJZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyhmZSwgcGFyYW0pOworCQlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKSBmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDApOworCX0KIAogCWlmIChwYXJhbS0+aW52ZXJzaW9uICE9IElOVkVSU0lPTl9PTiAmJgogCSAgICBwYXJhbS0+aW52ZXJzaW9uICE9IElOVkVSU0lPTl9PRkYpCkBAIC00NjMsOCArNDY1LDYgQEAKIAkvKiBFdmVyeXRoaW5nIGlzIHR3bydzIGNvbXBsZW1lbnQsIHNvZnQgYml0IGFuZCBDU0lfT1VUIHRvbyAqLwogCWw2NDc4MV93cml0ZXJlZyAoc3RhdGUsIDB4MWUsIDB4MDkpOwogCi0JaWYgKHN0YXRlLT5jb25maWctPnBsbF9pbml0KSBzdGF0ZS0+Y29uZmlnLT5wbGxfaW5pdChmZSk7Ci0KIAkvKiBkZWxheSBhIGJpdCBhZnRlciBmaXJzdCBpbml0IGF0dGVtcHQgKi8KIAlpZiAoc3RhdGUtPmZpcnN0KSB7CiAJCXN0YXRlLT5maXJzdCA9IDA7CkBAIC01MDgsNyArNTA4LDYgQEAKIAkvKiBzZXR1cCB0aGUgc3RhdGUgKi8KIAlzdGF0ZS0+Y29uZmlnID0gY29uZmlnOwogCXN0YXRlLT5pMmMgPSBpMmM7Ci0JbWVtY3B5KCZzdGF0ZS0+b3BzLCAmbDY0NzgxX29wcywgc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzKSk7CiAJc3RhdGUtPmZpcnN0ID0gMTsKIAogCS8qKgpAQCAtNTU0LDcgKzU1Myw3IEBACiAJfQogCiAJLyogY3JlYXRlIGR2Yl9mcm9udGVuZCAqLwotCXN0YXRlLT5mcm9udGVuZC5vcHMgPSAmc3RhdGUtPm9wczsKKwltZW1jcHkoJnN0YXRlLT5mcm9udGVuZC5vcHMsICZsNjQ3ODFfb3BzLCBzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMpKTsKIAlzdGF0ZS0+ZnJvbnRlbmQuZGVtb2R1bGF0b3JfcHJpdiA9IHN0YXRlOwogCXJldHVybiAmc3RhdGUtPmZyb250ZW5kOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbDY0NzgxLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbDY0NzgxLmgKaW5kZXggOTQ3ZjY1Zi4uODNiOGJjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2w2NDc4MS5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9sNjQ3ODEuaApAQCAtMjksMTAgKzI5LDYgQEAKIHsKIAkvKiB0aGUgZGVtb2R1bGF0b3IncyBpMmMgYWRkcmVzcyAqLwogCXU4IGRlbW9kX2FkZHJlc3M7Ci0KLQkvKiBQTEwgbWFpbnRlbmFuY2UgKi8KLQlpbnQgKCpwbGxfaW5pdCkoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpOwotCWludCAoKnBsbF9zZXQpKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcyk7CiB9OwogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9sZ19oMDZ4Zi5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2xnX2gwNnhmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU0ZDUxZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9sZ19oMDZ4Zi5oCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiAgbGdfaDA2eGYuaCAtIEFUU0MgVHVuZXIgc3VwcG9ydCBmb3IgTEcgVERWUy1IMDZ4RgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTEdfSDA2WEZfSF8KKyNkZWZpbmUgX0xHX0gwNlhGX0hfCisjaW5jbHVkZSAiZHZiLXBsbC5oIgorCitzdGF0aWMgaW50IGxnX2gwNnhmX3BsbF9zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBpMmNfYWRhcHRlciogaTJjX2FkYXAsCisJCSAgICAgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMpCit7CisJdTggYnVmWzRdOworCXN0cnVjdCBpMmNfbXNnIG1zZyA9IHsgLmFkZHIgPSAweDYxLCAuZmxhZ3MgPSAwLAorCQkJICAgICAgIC5idWYgPSBidWYsIC5sZW4gPSBzaXplb2YoYnVmKSB9OworCWludCBlcnI7CisKKwlkdmJfcGxsX2NvbmZpZ3VyZSgmZHZiX3BsbF9sZ190ZHZzX2gwNnhmLCBidWYsIHBhcmFtcy0+ZnJlcXVlbmN5LCAwKTsKKwlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDEpOworCWlmICgoZXJyID0gaTJjX3RyYW5zZmVyKGkyY19hZGFwLCAmbXNnLCAxKSkgIT0gMSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJsZ19oMDZ4ZjogJXMgZXJyb3IgIgorCQkJIihhZGRyICUwMnggPC0gJTAyeCwgZXJyID0gJWkpXG4iLAorCQkJX19GVU5DVElPTl9fLCBidWZbMF0sIGJ1ZlsxXSwgZXJyKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCQllbHNlCisJCQlyZXR1cm4gLUVSRU1PVEVJTzsKKwl9CisKKwkvKiBTZXQgdGhlIEF1eGlsaWFyeSBCeXRlLiAqLworCWJ1ZlswXSA9IGJ1ZlsyXTsKKwlidWZbMF0gJj0gfjB4MjA7CisJYnVmWzBdIHw9IDB4MTg7CisJYnVmWzFdID0gMHg1MDsKKwltc2cubGVuID0gMjsKKwlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDEpOworCWlmICgoZXJyID0gaTJjX3RyYW5zZmVyKGkyY19hZGFwLCAmbXNnLCAxKSkgIT0gMSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJsZ19oMDZ4ZjogJXMgZXJyb3IgIgorCQkJIihhZGRyICUwMnggPC0gJTAyeCwgZXJyID0gJWkpXG4iLAorCQkJX19GVU5DVElPTl9fLCBidWZbMF0sIGJ1ZlsxXSwgZXJyKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCQllbHNlCisJCQlyZXR1cm4gLUVSRU1PVEVJTzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2xnZHQzMzB4LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbGdkdDMzMHguYwppbmRleCA0NjkxYWM1Li42ZThhZDE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbGdkdDMzMHguYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbGdkdDMzMHguYwpAQCAtMjksNiArMjksNyBAQAogICogICBEVmlDTyBGdXNpb25IRFRWIDUgTGl0ZQogICogICBEVmlDTyBGdXNpb25IRFRWIDUgVVNCIEdvbGQKICAqICAgQWlyMlBDL0FpclN0YXIgMiBBVFNDIDNyZCBnZW5lcmF0aW9uIChIRDUwMDApCisgKiAgIHBjSERUViBIRDU1MDAKICAqCiAgKiBUT0RPOgogICogc2lnbmFsIHN0cmVuZ3RoIGFsd2F5cyByZXR1cm5zIDAuCkBAIC01OSw3ICs2MCw2IEBACiBzdHJ1Y3QgbGdkdDMzMHhfc3RhdGUKIHsKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIqIGkyYzsKLQlzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyBvcHM7CiAKIAkvKiBDb25maWd1cmF0aW9uIHNldHRpbmdzICovCiAJY29uc3Qgc3RydWN0IGxnZHQzMzB4X2NvbmZpZyogY29uZmlnOwpAQCAtMzk5LDggKzM5OSwxMCBAQAogCX0KIAogCS8qIFR1bmUgdG8gdGhlIHNwZWNpZmllZCBmcmVxdWVuY3kgKi8KLQlpZiAoc3RhdGUtPmNvbmZpZy0+cGxsX3NldCkKLQkJc3RhdGUtPmNvbmZpZy0+cGxsX3NldChmZSwgcGFyYW0pOworCWlmIChmZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zKSB7CisJCWZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMoZmUsIHBhcmFtKTsKKwkJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkgZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAwKTsKKwl9CiAKIAkvKiBLZWVwIHRyYWNrIG9mIHRoZSBuZXcgZnJlcXVlbmN5ICovCiAJLyogRklYTUUgdGhpcyBpcyB0aGUgd3Jvbmcgd2F5IHRvIGRvIHRoaXMuLi4gICAgICAgICAgICovCkBAIC02NzIsNiArNjc0LDcgQEAKIAogCWlmIChzdGF0ZS0+Y3VycmVudF9tb2R1bGF0aW9uID09IFZTQl84KSB7CiAKKwkJaTJjX3JlYWRfZGVtb2RfYnl0ZXMoc3RhdGUsIDB4NmUsIGJ1ZiwgNSk7CiAJCS8qIFBoYXNlIFRyYWNrZXIgTWVhbi1TcXVhcmUgRXJyb3IgUmVnaXN0ZXIgZm9yIFZTQiAqLwogCQlub2lzZSA9ICgoYnVmWzBdICYgNykgPDwgMTYpIHwgKGJ1ZlszXSA8PCA4KSB8IGJ1Zls0XTsKIAl9IGVsc2UgewpAQCAtNzIxLDE2ICs3MjQsMTkgQEAKIAkvKiBTZXR1cCB0aGUgc3RhdGUgKi8KIAlzdGF0ZS0+Y29uZmlnID0gY29uZmlnOwogCXN0YXRlLT5pMmMgPSBpMmM7CisKKwkvKiBDcmVhdGUgZHZiX2Zyb250ZW5kICovCiAJc3dpdGNoIChjb25maWctPmRlbW9kX2NoaXApIHsKIAljYXNlIExHRFQzMzAyOgotCQltZW1jcHkoJnN0YXRlLT5vcHMsICZsZ2R0MzMwMl9vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOworCQltZW1jcHkoJnN0YXRlLT5mcm9udGVuZC5vcHMsICZsZ2R0MzMwMl9vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOwogCQlicmVhazsKIAljYXNlIExHRFQzMzAzOgotCQltZW1jcHkoJnN0YXRlLT5vcHMsICZsZ2R0MzMwM19vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOworCQltZW1jcHkoJnN0YXRlLT5mcm9udGVuZC5vcHMsICZsZ2R0MzMwM19vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlnb3RvIGVycm9yOwogCX0KKwlzdGF0ZS0+ZnJvbnRlbmQuZGVtb2R1bGF0b3JfcHJpdiA9IHN0YXRlOwogCiAJLyogVmVyaWZ5IGNvbW11bmljYXRpb24gd2l0aCBkZW1vZCBjaGlwICovCiAJaWYgKGkyY19yZWFkX2RlbW9kX2J5dGVzKHN0YXRlLCAyLCBidWYsIDEpKQpAQCAtNzM5LDkgKzc0NSw2IEBACiAJc3RhdGUtPmN1cnJlbnRfZnJlcXVlbmN5ID0gLTE7CiAJc3RhdGUtPmN1cnJlbnRfbW9kdWxhdGlvbiA9IC0xOwogCi0JLyogQ3JlYXRlIGR2Yl9mcm9udGVuZCAqLwotCXN0YXRlLT5mcm9udGVuZC5vcHMgPSAmc3RhdGUtPm9wczsKLQlzdGF0ZS0+ZnJvbnRlbmQuZGVtb2R1bGF0b3JfcHJpdiA9IHN0YXRlOwogCXJldHVybiAmc3RhdGUtPmZyb250ZW5kOwogCiBlcnJvcjoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9sZ2R0MzMweC5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2xnZHQzMzB4LmgKaW5kZXggMmE2NTI5Yy4uYmFkOTAzYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2xnZHQzMzB4LmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2xnZHQzMzB4LmgKQEAgLTQzLDcgKzQzLDYgQEAKIAogCS8qIFBMTCBpbnRlcmZhY2UgKi8KIAlpbnQgKCpwbGxfcmZfc2V0KSAoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGludCBpbmRleCk7Ci0JaW50ICgqcGxsX3NldCkoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyogcGFyYW1zKTsKIAogCS8qIE5lZWQgdG8gc2V0IGRldmljZSBwYXJhbSBmb3Igc3RhcnRfZG1hICovCiAJaW50ICgqc2V0X3RzX3BhcmFtcykoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGludCBpc19wdW5jdHVyZWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2xuYnAyMS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2xuYnAyMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5MzNlZGMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbG5icDIxLmMKQEAgLTAsMCArMSwxNDUgQEAKKy8qCisgKiBsbmJwMjEuaCAtIGRyaXZlciBmb3IgbG5iIHN1cHBseSBhbmQgY29udHJvbCBpYyBsbmJwMjEKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgT2xpdmVyIEVuZHJpc3MKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKyAqIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKiBPciwgcG9pbnQgeW91ciBicm93c2VyIHRvIGh0dHA6Ly93d3cuZ251Lm9yZy9jb3B5bGVmdC9ncGwuaHRtbAorICoKKyAqCisgKiB0aGUgcHJvamVjdCdzIHBhZ2UgaXMgYXQgaHR0cDovL3d3dy5saW51eHR2Lm9yZworICovCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2luY2x1ZGUgImR2Yl9mcm9udGVuZC5oIgorI2luY2x1ZGUgImxuYnAyMS5oIgorCitzdHJ1Y3QgbG5icDIxIHsKKwl1OAkJCWNvbmZpZzsKKwl1OAkJCW92ZXJyaWRlX29yOworCXU4CQkJb3ZlcnJpZGVfYW5kOworCXN0cnVjdCBpMmNfYWRhcHRlcgkqaTJjOworCXZvaWQJCQkoKnJlbGVhc2VfY2hhaW4pKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKTsKK307CisKK3N0YXRpYyBpbnQgbG5icDIxX3NldF92b2x0YWdlKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBmZV9zZWNfdm9sdGFnZV90IHZvbHRhZ2UpCit7CisJc3RydWN0IGxuYnAyMSAqbG5icDIxID0gKHN0cnVjdCBsbmJwMjEgKikgZmUtPm1pc2NfcHJpdjsKKwlzdHJ1Y3QgaTJjX21zZyBtc2cgPSB7CS5hZGRyID0gMHgwOCwgLmZsYWdzID0gMCwKKwkJCQkuYnVmID0gJmxuYnAyMS0+Y29uZmlnLAorCQkJCS5sZW4gPSBzaXplb2YobG5icDIxLT5jb25maWcpIH07CisKKwlsbmJwMjEtPmNvbmZpZyAmPSB+KExOQlAyMV9WU0VMIHwgTE5CUDIxX0VOKTsKKworCXN3aXRjaCh2b2x0YWdlKSB7CisJY2FzZSBTRUNfVk9MVEFHRV9PRkY6CisJCWJyZWFrOworCWNhc2UgU0VDX1ZPTFRBR0VfMTM6CisJCWxuYnAyMS0+Y29uZmlnIHw9IExOQlAyMV9FTjsKKwkJYnJlYWs7CisJY2FzZSBTRUNfVk9MVEFHRV8xODoKKwkJbG5icDIxLT5jb25maWcgfD0gKExOQlAyMV9FTiB8IExOQlAyMV9WU0VMKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfTsKKworCWxuYnAyMS0+Y29uZmlnIHw9IGxuYnAyMS0+b3ZlcnJpZGVfb3I7CisJbG5icDIxLT5jb25maWcgJj0gbG5icDIxLT5vdmVycmlkZV9hbmQ7CisKKwlyZXR1cm4gKGkyY190cmFuc2ZlcihsbmJwMjEtPmkyYywgJm1zZywgMSkgPT0gMSkgPyAwIDogLUVJTzsKK30KKworc3RhdGljIGludCBsbmJwMjFfZW5hYmxlX2hpZ2hfbG5iX3ZvbHRhZ2Uoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIGxvbmcgYXJnKQoreworCXN0cnVjdCBsbmJwMjEgKmxuYnAyMSA9IChzdHJ1Y3QgbG5icDIxICopIGZlLT5taXNjX3ByaXY7CisJc3RydWN0IGkyY19tc2cgbXNnID0gewkuYWRkciA9IDB4MDgsIC5mbGFncyA9IDAsCisJCQkJLmJ1ZiA9ICZsbmJwMjEtPmNvbmZpZywKKwkJCQkubGVuID0gc2l6ZW9mKGxuYnAyMS0+Y29uZmlnKSB9OworCisJaWYgKGFyZykKKwkJbG5icDIxLT5jb25maWcgfD0gTE5CUDIxX0xMQzsKKwllbHNlCisJCWxuYnAyMS0+Y29uZmlnICY9IH5MTkJQMjFfTExDOworCisJbG5icDIxLT5jb25maWcgfD0gbG5icDIxLT5vdmVycmlkZV9vcjsKKwlsbmJwMjEtPmNvbmZpZyAmPSBsbmJwMjEtPm92ZXJyaWRlX2FuZDsKKworCXJldHVybiAoaTJjX3RyYW5zZmVyKGxuYnAyMS0+aTJjLCAmbXNnLCAxKSA9PSAxKSA/IDAgOiAtRUlPOworfQorCitzdGF0aWMgdm9pZCBsbmJwMjFfcmVsZWFzZShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3sKKwlzdHJ1Y3QgbG5icDIxICpsbmJwMjEgPSAoc3RydWN0IGxuYnAyMSAqKSBmZS0+bWlzY19wcml2OworCisJLyogTE5CUCBwb3dlciBvZmYgKi8KKwlsbmJwMjFfc2V0X3ZvbHRhZ2UoZmUsIFNFQ19WT0xUQUdFX09GRik7CisKKwkvKiBmcmVlIGRhdGEgJiBjYWxsIG5leHQgcmVsZWFzZSByb3V0aW5lICovCisJZmUtPm9wcy5yZWxlYXNlID0gbG5icDIxLT5yZWxlYXNlX2NoYWluOworCWtmcmVlKGZlLT5taXNjX3ByaXYpOworCWZlLT5taXNjX3ByaXYgPSBOVUxMOworCWlmIChmZS0+b3BzLnJlbGVhc2UpCisJCWZlLT5vcHMucmVsZWFzZShmZSk7Cit9CisKK2ludCBsbmJwMjFfYXR0YWNoKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYywgdTggb3ZlcnJpZGVfc2V0LCB1OCBvdmVycmlkZV9jbGVhcikKK3sKKwlzdHJ1Y3QgbG5icDIxICpsbmJwMjEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbG5icDIxKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFsbmJwMjEpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogZGVmYXVsdCBjb25maWd1cmF0aW9uICovCisJbG5icDIxLT5jb25maWcgPSBMTkJQMjFfSVNFTDsKKwlsbmJwMjEtPmkyYyA9IGkyYzsKKwlmZS0+bWlzY19wcml2ID0gbG5icDIxOworCisJLyogYml0cyB3aGljaCBzaG91bGQgYmUgZm9yY2VkIHRvICcxJyAqLworCWxuYnAyMS0+b3ZlcnJpZGVfb3IgPSBvdmVycmlkZV9zZXQ7CisKKwkvKiBiaXRzIHdoaWNoIHNob3VsZCBiZSBmb3JjZWQgdG8gJzAnICovCisJbG5icDIxLT5vdmVycmlkZV9hbmQgPSB+b3ZlcnJpZGVfY2xlYXI7CisKKwkvKiBkZXRlY3QgaWYgaXQgaXMgcHJlc2VudCBvciBub3QgKi8KKwlpZiAobG5icDIxX3NldF92b2x0YWdlKGZlLCBTRUNfVk9MVEFHRV9PRkYpKSB7CisJCWtmcmVlKGxuYnAyMSk7CisJCWZlLT5taXNjX3ByaXYgPSBOVUxMOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBpbnN0YWxsIHJlbGVhc2UgY2FsbGJhY2sgKi8KKwlsbmJwMjEtPnJlbGVhc2VfY2hhaW4gPSBmZS0+b3BzLnJlbGVhc2U7CisJZmUtPm9wcy5yZWxlYXNlID0gbG5icDIxX3JlbGVhc2U7CisKKwkvKiBvdmVycmlkZSBmcm9udGVuZCBvcHMgKi8KKwlmZS0+b3BzLnNldF92b2x0YWdlID0gbG5icDIxX3NldF92b2x0YWdlOworCWZlLT5vcHMuZW5hYmxlX2hpZ2hfbG5iX3ZvbHRhZ2UgPSBsbmJwMjFfZW5hYmxlX2hpZ2hfbG5iX3ZvbHRhZ2U7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wobG5icDIxX2F0dGFjaCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIGZvciBsbmIgc3VwcGx5IGFuZCBjb250cm9sIGljIGxuYnAyMSIpOworTU9EVUxFX0FVVEhPUigiT2xpdmVyIEVuZHJpc3MiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9sbmJwMjEuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9sbmJwMjEuaAppbmRleCAwZGNiZTYxLi4wNDdhNGFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbG5icDIxLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2xuYnAyMS5oCkBAIC0yNyw3ICsyNyw3IEBACiAjaWZuZGVmIF9MTkJQMjFfSAogI2RlZmluZSBfTE5CUDIxX0gKIAotLyogc3lzdGVtIHJlZ2lzdGVyICovCisvKiBzeXN0ZW0gcmVnaXN0ZXIgYml0cyAqLwogI2RlZmluZSBMTkJQMjFfT0xGCTB4MDEKICNkZWZpbmUgTE5CUDIxX09URgkweDAyCiAjZGVmaW5lIExOQlAyMV9FTgkweDA0CkBAIC0zNywxMDMgKzM3LDkgQEAKICNkZWZpbmUgTE5CUDIxX0lTRUwJMHg0MAogI2RlZmluZSBMTkJQMjFfUENMCTB4ODAKIAotc3RydWN0IGxuYnAyMSB7Ci0JdTgJCQljb25maWc7Ci0JdTgJCQlvdmVycmlkZV9vcjsKLQl1OAkJCW92ZXJyaWRlX2FuZDsKLQlzdHJ1Y3QgaTJjX2FkYXB0ZXIJKmkyYzsKLQl2b2lkCQkJKCpyZWxlYXNlX2NoYWluKShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSk7Ci19OworI2luY2x1ZGUgPGxpbnV4L2R2Yi9mcm9udGVuZC5oPgogCi1zdGF0aWMgaW50IGxuYnAyMV9zZXRfdm9sdGFnZShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgZmVfc2VjX3ZvbHRhZ2VfdCB2b2x0YWdlKQotewotCXN0cnVjdCBsbmJwMjEgKmxuYnAyMSA9IChzdHJ1Y3QgbG5icDIxICopIGZlLT5taXNjX3ByaXY7Ci0Jc3RydWN0IGkyY19tc2cgbXNnID0gewkuYWRkciA9IDB4MDgsIC5mbGFncyA9IDAsCi0JCQkJLmJ1ZiA9ICZsbmJwMjEtPmNvbmZpZywKLQkJCQkubGVuID0gc2l6ZW9mKGxuYnAyMS0+Y29uZmlnKSB9OwotCi0JbG5icDIxLT5jb25maWcgJj0gfihMTkJQMjFfVlNFTCB8IExOQlAyMV9FTik7Ci0KLQlzd2l0Y2godm9sdGFnZSkgewotCWNhc2UgU0VDX1ZPTFRBR0VfT0ZGOgotCQlicmVhazsKLQljYXNlIFNFQ19WT0xUQUdFXzEzOgotCQlsbmJwMjEtPmNvbmZpZyB8PSBMTkJQMjFfRU47Ci0JCWJyZWFrOwotCWNhc2UgU0VDX1ZPTFRBR0VfMTg6Ci0JCWxuYnAyMS0+Y29uZmlnIHw9IChMTkJQMjFfRU4gfCBMTkJQMjFfVlNFTCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRUlOVkFMOwotCX07Ci0KLQlsbmJwMjEtPmNvbmZpZyB8PSBsbmJwMjEtPm92ZXJyaWRlX29yOwotCWxuYnAyMS0+Y29uZmlnICY9IGxuYnAyMS0+b3ZlcnJpZGVfYW5kOwotCi0JcmV0dXJuIChpMmNfdHJhbnNmZXIobG5icDIxLT5pMmMsICZtc2csIDEpID09IDEpID8gMCA6IC1FSU87Ci19Ci0KLXN0YXRpYyBpbnQgbG5icDIxX2VuYWJsZV9oaWdoX2xuYl92b2x0YWdlKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBsb25nIGFyZykKLXsKLQlzdHJ1Y3QgbG5icDIxICpsbmJwMjEgPSAoc3RydWN0IGxuYnAyMSAqKSBmZS0+bWlzY19wcml2OwotCXN0cnVjdCBpMmNfbXNnIG1zZyA9IHsJLmFkZHIgPSAweDA4LCAuZmxhZ3MgPSAwLAotCQkJCS5idWYgPSAmbG5icDIxLT5jb25maWcsCi0JCQkJLmxlbiA9IHNpemVvZihsbmJwMjEtPmNvbmZpZykgfTsKLQotCWlmIChhcmcpCi0JCWxuYnAyMS0+Y29uZmlnIHw9IExOQlAyMV9MTEM7Ci0JZWxzZQotCQlsbmJwMjEtPmNvbmZpZyAmPSB+TE5CUDIxX0xMQzsKLQotCWxuYnAyMS0+Y29uZmlnIHw9IGxuYnAyMS0+b3ZlcnJpZGVfb3I7Ci0JbG5icDIxLT5jb25maWcgJj0gbG5icDIxLT5vdmVycmlkZV9hbmQ7Ci0KLQlyZXR1cm4gKGkyY190cmFuc2ZlcihsbmJwMjEtPmkyYywgJm1zZywgMSkgPT0gMSkgPyAwIDogLUVJTzsKLX0KLQotc3RhdGljIHZvaWQgbG5icDIxX2V4aXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCi17Ci0Jc3RydWN0IGxuYnAyMSAqbG5icDIxID0gKHN0cnVjdCBsbmJwMjEgKikgZmUtPm1pc2NfcHJpdjsKLQotCS8qIExOQlAgcG93ZXIgb2ZmICovCi0JbG5icDIxX3NldF92b2x0YWdlKGZlLCBTRUNfVk9MVEFHRV9PRkYpOwotCi0JLyogZnJlZSBkYXRhICYgY2FsbCBuZXh0IHJlbGVhc2Ugcm91dGluZSAqLwotCWZlLT5vcHMtPnJlbGVhc2UgPSBsbmJwMjEtPnJlbGVhc2VfY2hhaW47Ci0Ja2ZyZWUoZmUtPm1pc2NfcHJpdik7Ci0JZmUtPm1pc2NfcHJpdiA9IE5VTEw7Ci0JaWYgKGZlLT5vcHMtPnJlbGVhc2UpCi0JCWZlLT5vcHMtPnJlbGVhc2UoZmUpOwotfQotCi1zdGF0aWMgaW50IGxuYnAyMV9pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYywgdTggb3ZlcnJpZGVfc2V0LCB1OCBvdmVycmlkZV9jbGVhcikKLXsKLQlzdHJ1Y3QgbG5icDIxICpsbmJwMjEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbG5icDIxKSwgR0ZQX0tFUk5FTCk7Ci0KLQlpZiAoIWxuYnAyMSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkvKiBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gKi8KLQlsbmJwMjEtPmNvbmZpZyA9IExOQlAyMV9JU0VMOwotCi0JLyogYml0cyB3aGljaCBzaG91bGQgYmUgZm9yY2VkIHRvICcxJyAqLwotCWxuYnAyMS0+b3ZlcnJpZGVfb3IgPSBvdmVycmlkZV9zZXQ7Ci0KLQkvKiBiaXRzIHdoaWNoIHNob3VsZCBiZSBmb3JjZWQgdG8gJzAnICovCi0JbG5icDIxLT5vdmVycmlkZV9hbmQgPSB+b3ZlcnJpZGVfY2xlYXI7Ci0KLQkvKiBpbnN0YWxsIHJlbGVhc2UgY2FsbGJhY2sgKi8KLQlsbmJwMjEtPnJlbGVhc2VfY2hhaW4gPSBmZS0+b3BzLT5yZWxlYXNlOwotCWZlLT5vcHMtPnJlbGVhc2UgPSBsbmJwMjFfZXhpdDsKLQotCS8qIG92ZXJyaWRlIGZyb250ZW5kIG9wcyAqLwotCWZlLT5vcHMtPnNldF92b2x0YWdlID0gbG5icDIxX3NldF92b2x0YWdlOwotCWZlLT5vcHMtPmVuYWJsZV9oaWdoX2xuYl92b2x0YWdlID0gbG5icDIxX2VuYWJsZV9oaWdoX2xuYl92b2x0YWdlOwotCi0JbG5icDIxLT5pMmMgPSBpMmM7Ci0JZmUtPm1pc2NfcHJpdiA9IGxuYnAyMTsKLQotCXJldHVybiBsbmJwMjFfc2V0X3ZvbHRhZ2UoZmUsIFNFQ19WT0xUQUdFX09GRik7Ci19CisvKiBvdmVycmlkZV9zZXQgYW5kIG92ZXJyaWRlX2NsZWFyIGNvbnRyb2wgd2hpY2ggc3lzdGVtIHJlZ2lzdGVyIGJpdHMgKGFib3ZlKSB0byBhbHdheXMgc2V0ICYgY2xlYXIgKi8KK2V4dGVybiBpbnQgbG5icDIxX2F0dGFjaChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGkyY19hZGFwdGVyICppMmMsIHU4IG92ZXJyaWRlX3NldCwgdTggb3ZlcnJpZGVfY2xlYXIpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9tdDMxMi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL210MzEyLmMKaW5kZXggZDNhZWE4My4uMWVmODIxOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL210MzEyLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL210MzEyLmMKQEAgLTM5LDcgKzM5LDYgQEAKIAogc3RydWN0IG10MzEyX3N0YXRlIHsKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIqIGkyYzsKLQlzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyBvcHM7CiAJLyogY29uZmlndXJhdGlvbiBzZXR0aW5ncyAqLwogCWNvbnN0IHN0cnVjdCBtdDMxMl9jb25maWcqIGNvbmZpZzsKIAlzdHJ1Y3QgZHZiX2Zyb250ZW5kIGZyb250ZW5kOwpAQCAtMjc3LDEyICsyNzYsNiBAQAogCWlmICgocmV0ID0gbXQzMTJfd3JpdGVyZWcoc3RhdGUsIENTX1NXX0xJTSwgMHg2OSkpIDwgMCkKIAkJcmV0dXJuIHJldDsKIAotCWlmIChzdGF0ZS0+Y29uZmlnLT5wbGxfaW5pdCkgewotCQltdDMxMl93cml0ZXJlZyhzdGF0ZSwgR1BQX0NUUkwsIDB4NDApOwotCQlzdGF0ZS0+Y29uZmlnLT5wbGxfaW5pdChmZSk7Ci0JCW10MzEyX3dyaXRlcmVnKHN0YXRlLCBHUFBfQ1RSTCwgMHgwMCk7Ci0JfQotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQ3NywxNiArNDcwLDE2IEBACiAKIAlkcHJpbnRrKCIlczogRnJlcSAlZFxuIiwgX19GVU5DVElPTl9fLCBwLT5mcmVxdWVuY3kpOwogCi0JaWYgKChwLT5mcmVxdWVuY3kgPCBmZS0+b3BzLT5pbmZvLmZyZXF1ZW5jeV9taW4pCi0JICAgIHx8IChwLT5mcmVxdWVuY3kgPiBmZS0+b3BzLT5pbmZvLmZyZXF1ZW5jeV9tYXgpKQorCWlmICgocC0+ZnJlcXVlbmN5IDwgZmUtPm9wcy5pbmZvLmZyZXF1ZW5jeV9taW4pCisJICAgIHx8IChwLT5mcmVxdWVuY3kgPiBmZS0+b3BzLmluZm8uZnJlcXVlbmN5X21heCkpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKChwLT5pbnZlcnNpb24gPCBJTlZFUlNJT05fT0ZGKQogCSAgICB8fCAocC0+aW52ZXJzaW9uID4gSU5WRVJTSU9OX09OKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoKHAtPnUucXBzay5zeW1ib2xfcmF0ZSA8IGZlLT5vcHMtPmluZm8uc3ltYm9sX3JhdGVfbWluKQotCSAgICB8fCAocC0+dS5xcHNrLnN5bWJvbF9yYXRlID4gZmUtPm9wcy0+aW5mby5zeW1ib2xfcmF0ZV9tYXgpKQorCWlmICgocC0+dS5xcHNrLnN5bWJvbF9yYXRlIDwgZmUtPm9wcy5pbmZvLnN5bWJvbF9yYXRlX21pbikKKwkgICAgfHwgKHAtPnUucXBzay5zeW1ib2xfcmF0ZSA+IGZlLT5vcHMuaW5mby5zeW1ib2xfcmF0ZV9tYXgpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmICgocC0+dS5xcHNrLmZlY19pbm5lciA8IEZFQ19OT05FKQpAQCAtNTI5LDkgKzUyMiwxMCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQltdDMxMl93cml0ZXJlZyhzdGF0ZSwgR1BQX0NUUkwsIDB4NDApOwotCXN0YXRlLT5jb25maWctPnBsbF9zZXQoZmUsIHApOwotCW10MzEyX3dyaXRlcmVnKHN0YXRlLCBHUFBfQ1RSTCwgMHgwMCk7CisJaWYgKGZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMpIHsKKwkJZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyhmZSwgcCk7CisJCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpIGZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMCk7CisJfQogCiAJLyogc3IgPSAodTE2KShzciAqIDI1Ni4wIC8gMTAwMDAwMC4wKSAqLwogCXNyID0gbXQzMTJfZGl2KHAtPnUucXBzay5zeW1ib2xfcmF0ZSAqIDQsIDE1NjI1KTsKQEAgLTU3OCw2ICs1NzIsMTcgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBtdDMxMl9pMmNfZ2F0ZV9jdHJsKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBpbnQgZW5hYmxlKQoreworCXN0cnVjdCBtdDMxMl9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKworCWlmIChlbmFibGUpIHsKKwkJcmV0dXJuIG10MzEyX3dyaXRlcmVnKHN0YXRlLCBHUFBfQ1RSTCwgMHg0MCk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIG10MzEyX3dyaXRlcmVnKHN0YXRlLCBHUFBfQ1RSTCwgMHgwMCk7CisJfQorfQorCiBzdGF0aWMgaW50IG10MzEyX3NsZWVwKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKQogewogCXN0cnVjdCBtdDMxMl9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKQEAgLTYzMyw2ICs2MzgsNyBAQAogCiAJLmluaXQgPSBtdDMxMl9pbml0ZmUsCiAJLnNsZWVwID0gbXQzMTJfc2xlZXAsCisJLmkyY19nYXRlX2N0cmwgPSBtdDMxMl9pMmNfZ2F0ZV9jdHJsLAogCiAJLnNldF9mcm9udGVuZCA9IG10MzEyX3NldF9mcm9udGVuZCwKIAkuZ2V0X2Zyb250ZW5kID0gbXQzMTJfZ2V0X2Zyb250ZW5kLApAQCAtNjYzLDE5ICs2NjksMjIgQEAKIAkvKiBzZXR1cCB0aGUgc3RhdGUgKi8KIAlzdGF0ZS0+Y29uZmlnID0gY29uZmlnOwogCXN0YXRlLT5pMmMgPSBpMmM7Ci0JbWVtY3B5KCZzdGF0ZS0+b3BzLCAmdnAzMTBfbXQzMTJfb3BzLCBzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMpKTsKIAogCS8qIGNoZWNrIGlmIHRoZSBkZW1vZCBpcyB0aGVyZSAqLwogCWlmIChtdDMxMl9yZWFkcmVnKHN0YXRlLCBJRCwgJnN0YXRlLT5pZCkgPCAwKQogCQlnb3RvIGVycm9yOwogCisJLyogY3JlYXRlIGR2Yl9mcm9udGVuZCAqLworCW1lbWNweSgmc3RhdGUtPmZyb250ZW5kLm9wcywgJnZwMzEwX210MzEyX29wcywgc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzKSk7CisJc3RhdGUtPmZyb250ZW5kLmRlbW9kdWxhdG9yX3ByaXYgPSBzdGF0ZTsKKwogCXN3aXRjaCAoc3RhdGUtPmlkKSB7CiAJY2FzZSBJRF9WUDMxMDoKLQkJc3RyY3B5KHN0YXRlLT5vcHMuaW5mby5uYW1lLCAiWmFybGluayBWUDMxMCBEVkItUyIpOworCQlzdHJjcHkoc3RhdGUtPmZyb250ZW5kLm9wcy5pbmZvLm5hbWUsICJaYXJsaW5rIFZQMzEwIERWQi1TIik7CiAJCXN0YXRlLT5mcmVxdWVuY3kgPSA5MDsKIAkJYnJlYWs7CiAJY2FzZSBJRF9NVDMxMjoKLQkJc3RyY3B5KHN0YXRlLT5vcHMuaW5mby5uYW1lLCAiWmFybGluayBNVDMxMiBEVkItUyIpOworCQlzdHJjcHkoc3RhdGUtPmZyb250ZW5kLm9wcy5pbmZvLm5hbWUsICJaYXJsaW5rIE1UMzEyIERWQi1TIik7CiAJCXN0YXRlLT5mcmVxdWVuY3kgPSA2MDsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKQEAgLTY4Myw5ICs2OTIsNiBAQAogCQlnb3RvIGVycm9yOwogCX0KIAotCS8qIGNyZWF0ZSBkdmJfZnJvbnRlbmQgKi8KLQlzdGF0ZS0+ZnJvbnRlbmQub3BzID0gJnN0YXRlLT5vcHM7Ci0Jc3RhdGUtPmZyb250ZW5kLmRlbW9kdWxhdG9yX3ByaXYgPSBzdGF0ZTsKIAlyZXR1cm4gJnN0YXRlLT5mcm9udGVuZDsKIAogZXJyb3I6CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbXQzMTIuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9tdDMxMi5oCmluZGV4IDA3NGQ4NDQuLjY2NmExYmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9tdDMxMi5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9tdDMxMi5oCkBAIC0zMiwxMCArMzIsNiBAQAogewogCS8qIHRoZSBkZW1vZHVsYXRvcidzIGkyYyBhZGRyZXNzICovCiAJdTggZGVtb2RfYWRkcmVzczsKLQotCS8qIFBMTCBtYWludGVuYW5jZSAqLwotCWludCAoKnBsbF9pbml0KShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSk7Ci0JaW50ICgqcGxsX3NldCkoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyogcGFyYW1zKTsKIH07CiAKIHN0cnVjdCBkdmJfZnJvbnRlbmQqIHZwMzEwX210MzEyX2F0dGFjaChjb25zdCBzdHJ1Y3QgbXQzMTJfY29uZmlnKiBjb25maWcsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbXQzNTIuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9tdDM1Mi5jCmluZGV4IGFhYWVjOTAuLjVkZTczNzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9tdDM1Mi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9tdDM1Mi5jCkBAIC00NSw3ICs0NSw2IEBACiBzdHJ1Y3QgbXQzNTJfc3RhdGUgewogCXN0cnVjdCBpMmNfYWRhcHRlciogaTJjOwogCXN0cnVjdCBkdmJfZnJvbnRlbmQgZnJvbnRlbmQ7Ci0Jc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMgb3BzOwogCiAJLyogY29uZmlndXJhdGlvbiBzZXR0aW5ncyAqLwogCXN0cnVjdCBtdDM1Ml9jb25maWcgY29uZmlnOwpAQCAtMjg2LDE2ICsyODUsMjUgQEAKIAogCW10MzUyX2NhbGNfbm9taW5hbF9yYXRlKHN0YXRlLCBvcC0+YmFuZHdpZHRoLCBidWYrNCk7CiAJbXQzNTJfY2FsY19pbnB1dF9mcmVxKHN0YXRlLCBidWYrNik7Ci0Jc3RhdGUtPmNvbmZpZy5wbGxfc2V0KGZlLCBwYXJhbSwgYnVmKzgpOwogCi0JbXQzNTJfd3JpdGUoZmUsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwogCWlmIChzdGF0ZS0+Y29uZmlnLm5vX3R1bmVyKSB7Ci0JCS8qIHN0YXJ0IGRlY29kaW5nICovCisJCWlmIChmZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zKSB7CisJCQlmZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zKGZlLCBwYXJhbSk7CisJCQlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQkJCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMCk7CisJCX0KKworCQltdDM1Ml93cml0ZShmZSwgYnVmLCA4KTsKIAkJbXQzNTJfd3JpdGUoZmUsIGZzbV9nbywgMik7CiAJfSBlbHNlIHsKLQkJLyogc3RhcnQgdHVuaW5nICovCi0JCW10MzUyX3dyaXRlKGZlLCB0dW5lcl9nbywgMik7CisJCWlmIChmZS0+b3BzLnR1bmVyX29wcy5jYWxjX3JlZ3MpIHsKKwkJCWZlLT5vcHMudHVuZXJfb3BzLmNhbGNfcmVncyhmZSwgcGFyYW0sIGJ1Zis4LCA1KTsKKwkJCWJ1Zls4XSA8PD0gMTsKKwkJCW10MzUyX3dyaXRlKGZlLCBidWYsIHNpemVvZihidWYpKTsKKwkJCW10MzUyX3dyaXRlKGZlLCB0dW5lcl9nbywgMik7CisJCX0KIAl9CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtNTQxLDEzICs1NDksMTIgQEAKIAkvKiBzZXR1cCB0aGUgc3RhdGUgKi8KIAlzdGF0ZS0+aTJjID0gaTJjOwogCW1lbWNweSgmc3RhdGUtPmNvbmZpZyxjb25maWcsc2l6ZW9mKHN0cnVjdCBtdDM1Ml9jb25maWcpKTsKLQltZW1jcHkoJnN0YXRlLT5vcHMsICZtdDM1Ml9vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOwogCiAJLyogY2hlY2sgaWYgdGhlIGRlbW9kIGlzIHRoZXJlICovCiAJaWYgKG10MzUyX3JlYWRfcmVnaXN0ZXIoc3RhdGUsIENISVBfSUQpICE9IElEX01UMzUyKSBnb3RvIGVycm9yOwogCiAJLyogY3JlYXRlIGR2Yl9mcm9udGVuZCAqLwotCXN0YXRlLT5mcm9udGVuZC5vcHMgPSAmc3RhdGUtPm9wczsKKwltZW1jcHkoJnN0YXRlLT5mcm9udGVuZC5vcHMsICZtdDM1Ml9vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOwogCXN0YXRlLT5mcm9udGVuZC5kZW1vZHVsYXRvcl9wcml2ID0gc3RhdGU7CiAJcmV0dXJuICZzdGF0ZS0+ZnJvbnRlbmQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9tdDM1Mi5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL210MzUyLmgKaW5kZXggMDMwNDBjZC4uOWU3ZmY0YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL210MzUyLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL210MzUyLmgKQEAgLTQ5LDEyICs0OSw2IEBACiAKIAkvKiBJbml0aWFsaXNlIHRoZSBkZW1vZHVsYXRvciBhbmQgUExMLiBDYW5ub3QgYmUgTlVMTCAqLwogCWludCAoKmRlbW9kX2luaXQpKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKTsKLQotCS8qIFBMTCBzZXR1cCAtIGZpbGwgb3V0IHRoZSBzdXBwbGllZCA1IGJ5dGUgYnVmZmVyIHdpdGggeW91ciBQTEwgc2V0dGluZ3MuCi0JICogYnl0ZTA6IFNldCB0byBwbGwgaTJjIGFkZHJlc3MgKG5vbmxpbnV4OyBsZWZ0IHNoaWZ0ZWQgYnkgMSkKLQkgKiBieXRlMS00OiBQTEwgY29uZmlndXJhdGlvbi4KLQkgKi8KLQlpbnQgKCpwbGxfc2V0KShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMsIHU4KiBwbGxidWYpOwogfTsKIAogZXh0ZXJuIHN0cnVjdCBkdmJfZnJvbnRlbmQqIG10MzUyX2F0dGFjaChjb25zdCBzdHJ1Y3QgbXQzNTJfY29uZmlnKiBjb25maWcsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbnh0MjAweC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL254dDIwMHguYwppbmRleCA5ZTM1MzUzOS4uNTU2NzFjYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL254dDIwMHguYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbnh0MjAweC5jCkBAIC01NSw3ICs1NSw2IEBACiBzdHJ1Y3Qgbnh0MjAweF9zdGF0ZSB7CiAKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIqIGkyYzsKLQlzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyBvcHM7CiAJY29uc3Qgc3RydWN0IG54dDIwMHhfY29uZmlnKiBjb25maWc7CiAJc3RydWN0IGR2Yl9mcm9udGVuZCBmcm9udGVuZDsKIApAQCAtMzMzLDE3ICszMzIsMTcgQEAKIAogCWRwcmludGsoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOwogCi0JZHByaW50aygiVHVuZXIgQnl0ZXM6ICUwMlggJTAyWCAlMDJYICUwMlhcbiIsIGRhdGFbMF0sIGRhdGFbMV0sIGRhdGFbMl0sIGRhdGFbM10pOworCWRwcmludGsoIlR1bmVyIEJ5dGVzOiAlMDJYICUwMlggJTAyWCAlMDJYXG4iLCBkYXRhWzFdLCBkYXRhWzJdLCBkYXRhWzNdLCBkYXRhWzRdKTsKIAogCS8qIGlmIE5YVDIwMDQsIHdyaXRlIGRpcmVjdGx5IHRvIHR1bmVyLiBpZiBOWFQyMDAyLCB3cml0ZSB0aHJvdWdoIE5YVCBjaGlwLgogCSAqIGRpcmVjdCB3cml0ZSBpcyByZXF1aXJlZCBmb3IgUGhpbGlwcyBUVVYxMjM2RCBhbmQgQUxQUyBUREhVMiAqLwogCXN3aXRjaCAoc3RhdGUtPmRlbW9kX2NoaXApIHsKIAkJY2FzZSBOWFQyMDA0OgotCQkJaWYgKGkyY193cml0ZWJ5dGVzKHN0YXRlLCBzdGF0ZS0+Y29uZmlnLT5wbGxfYWRkcmVzcywgZGF0YSwgNCkpCisJCQlpZiAoaTJjX3dyaXRlYnl0ZXMoc3RhdGUsIGRhdGFbMF0sIGRhdGErMSwgNCkpCiAJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibnh0MjAweDogZXJyb3Igd3JpdGluZyB0byB0dW5lclxuIik7CiAJCQkvKiB3YWl0IHVudGlsIHdlIGhhdmUgYSBsb2NrICovCiAJCQl3aGlsZSAoY291bnQgPCAyMCkgewotCQkJCWkyY19yZWFkYnl0ZXMoc3RhdGUsIHN0YXRlLT5jb25maWctPnBsbF9hZGRyZXNzLCAmYnVmLCAxKTsKKwkJCQlpMmNfcmVhZGJ5dGVzKHN0YXRlLCBkYXRhWzBdLCAmYnVmLCAxKTsKIAkJCQlpZiAoYnVmICYgMHg0MCkKIAkJCQkJcmV0dXJuIDA7CiAJCQkJbXNsZWVwKDEwMCk7CkBAIC0zNjEsMTAgKzM2MCwxMCBAQAogCQkJbnh0MjAweF93cml0ZWJ5dGVzKHN0YXRlLCAweDM0LCAmYnVmLCAxKTsKIAogCQkJLyogd3JpdGUgYWN0dWFsIHR1bmVyIGJ5dGVzICovCi0JCQlueHQyMDB4X3dyaXRlYnl0ZXMoc3RhdGUsIDB4MzYsIGRhdGEsIDQpOworCQkJbnh0MjAweF93cml0ZWJ5dGVzKHN0YXRlLCAweDM2LCBkYXRhKzEsIDQpOwogCiAJCQkvKiBzZXQgdHVuZXIgaTJjIGFkZHJlc3MgKi8KLQkJCWJ1ZiA9IHN0YXRlLT5jb25maWctPnBsbF9hZGRyZXNzOworCQkJYnVmID0gZGF0YVswXSA8PCAxOwogCQkJbnh0MjAweF93cml0ZWJ5dGVzKHN0YXRlLCAweDM1LCAmYnVmLCAxKTsKIAogCQkJLyogd3JpdGUgVUMgT3Btb2RlIHRvIGJlZ2luIHRyYW5zZmVyICovCkBAIC01MzQsNyArNTMzLDcgQEAKIAkJCQkJICAgICBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnApCiB7CiAJc3RydWN0IG54dDIwMHhfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7Ci0JdTggYnVmWzRdOworCXU4IGJ1Zls1XTsKIAogCS8qIHN0b3AgdGhlIG1pY3JvIGZpcnN0ICovCiAJbnh0MjAweF9taWNyb2NvbnRyb2xsZXJfc3RvcChzdGF0ZSk7CkBAIC01NDgsNyArNTQ3LDkgQEAKIAl9CiAKIAkvKiBnZXQgdHVuaW5nIGluZm9ybWF0aW9uICovCi0JZHZiX3BsbF9jb25maWd1cmUoc3RhdGUtPmNvbmZpZy0+cGxsX2Rlc2MsIGJ1ZiwgcC0+ZnJlcXVlbmN5LCAwKTsKKwlpZiAoZmUtPm9wcy50dW5lcl9vcHMuY2FsY19yZWdzKSB7CisJCWZlLT5vcHMudHVuZXJfb3BzLmNhbGNfcmVncyhmZSwgcCwgYnVmLCA1KTsKKwl9CiAKIAkvKiBzZXQgYWRkaXRpb25hbCBwYXJhbXMgKi8KIAlzd2l0Y2ggKHAtPnUudnNiLm1vZHVsYXRpb24pIHsKQEAgLTExNTksNyArMTE2MCw2IEBACiAJLyogc2V0dXAgdGhlIHN0YXRlICovCiAJc3RhdGUtPmNvbmZpZyA9IGNvbmZpZzsKIAlzdGF0ZS0+aTJjID0gaTJjOwotCW1lbWNweSgmc3RhdGUtPm9wcywgJm54dDIwMHhfb3BzLCBzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMpKTsKIAlzdGF0ZS0+aW5pdGlhbGlzZWQgPSAwOwogCiAJLyogcmVhZCBjYXJkIGlkICovCkBAIC0xMTk4LDcgKzExOTgsNyBAQAogCX0KIAogCS8qIGNyZWF0ZSBkdmJfZnJvbnRlbmQgKi8KLQlzdGF0ZS0+ZnJvbnRlbmQub3BzID0gJnN0YXRlLT5vcHM7CisJbWVtY3B5KCZzdGF0ZS0+ZnJvbnRlbmQub3BzLCAmbnh0MjAweF9vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOwogCXN0YXRlLT5mcm9udGVuZC5kZW1vZHVsYXRvcl9wcml2ID0gc3RhdGU7CiAJcmV0dXJuICZzdGF0ZS0+ZnJvbnRlbmQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9ueHQyMDB4LmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbnh0MjAweC5oCmluZGV4IDFkOWQ3MGIuLjM0ZDYxNzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9ueHQyMDB4LmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL254dDIwMHguaApAQCAtMzgsMTAgKzM4LDYgQEAKIAkvKiB0aGUgZGVtb2R1bGF0b3IncyBpMmMgYWRkcmVzcyAqLwogCXU4IGRlbW9kX2FkZHJlc3M7CiAKLQkvKiB0dW5lciBpbmZvcm1hdGlvbiAqLwotCXU4IHBsbF9hZGRyZXNzOwotCXN0cnVjdCBkdmJfcGxsX2Rlc2MgKnBsbF9kZXNjOwotCiAJLyogdXNlZCB0byBzZXQgcGxsIGlucHV0ICovCiAJaW50ICgqc2V0X3BsbF9pbnB1dCkodTgqIGJ1ZiwgaW50IGlucHV0KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL254dDYwMDAuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9ueHQ2MDAwLmMKaW5kZXggYTE2ZWViYS4uZDMxM2Q3ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL254dDYwMDAuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbnh0NjAwMC5jCkBAIC0zMyw3ICszMyw2IEBACiAKIHN0cnVjdCBueHQ2MDAwX3N0YXRlIHsKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIqIGkyYzsKLQlzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyBvcHM7CiAJLyogY29uZmlndXJhdGlvbiBzZXR0aW5ncyAqLwogCWNvbnN0IHN0cnVjdCBueHQ2MDAwX2NvbmZpZyogY29uZmlnOwogCXN0cnVjdCBkdmJfZnJvbnRlbmQgZnJvbnRlbmQ7CkBAIC0yMDcsMTIgKzIwNiw2IEBACiAJCW54dDYwMDBfd3JpdGVyZWcoc3RhdGUsIFNVQl9ESUFHX01PREVfU0VMLCAwKTsKIAogCW54dDYwMDBfd3JpdGVyZWcoc3RhdGUsIFRTX0ZPUk1BVCwgMCk7Ci0KLQlpZiAoc3RhdGUtPmNvbmZpZy0+cGxsX2luaXQpIHsKLQkJbnh0NjAwMF93cml0ZXJlZyhzdGF0ZSwgRU5BQkxFX1RVTkVSX0lJQywgMHgwMSk7CS8qIG9wZW4gaTJjIGJ1cyBzd2l0Y2ggKi8KLQkJc3RhdGUtPmNvbmZpZy0+cGxsX2luaXQoZmUpOwotCQlueHQ2MDAwX3dyaXRlcmVnKHN0YXRlLCBFTkFCTEVfVFVORVJfSUlDLCAweDAwKTsJLyogY2xvc2UgaTJjIGJ1cyBzd2l0Y2ggKi8KLQl9CiB9CiAKIHN0YXRpYyB2b2lkIG54dDYwMDBfZHVtcF9zdGF0dXMoc3RydWN0IG54dDYwMDBfc3RhdGUgKnN0YXRlKQpAQCAtNDY5LDkgKzQ2MiwxMCBAQAogCXN0cnVjdCBueHQ2MDAwX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCWludCByZXN1bHQ7CiAKLQlueHQ2MDAwX3dyaXRlcmVnKHN0YXRlLCBFTkFCTEVfVFVORVJfSUlDLCAweDAxKTsJLyogb3BlbiBpMmMgYnVzIHN3aXRjaCAqLwotCXN0YXRlLT5jb25maWctPnBsbF9zZXQoZmUsIHBhcmFtKTsKLQlueHQ2MDAwX3dyaXRlcmVnKHN0YXRlLCBFTkFCTEVfVFVORVJfSUlDLCAweDAwKTsJLyogY2xvc2UgaTJjIGJ1cyBzd2l0Y2ggKi8KKwlpZiAoZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcykgeworCQlmZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zKGZlLCBwYXJhbSk7CisJCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpIGZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMCk7CisJfQogCiAJaWYgKChyZXN1bHQgPSBueHQ2MDAwX3NldF9iYW5kd2lkdGgoc3RhdGUsIHBhcmFtLT51Lm9mZG0uYmFuZHdpZHRoKSkgPCAwKQogCQlyZXR1cm4gcmVzdWx0OwpAQCAtNTMyLDYgKzUyNiwxNyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IG54dDYwMDBfaTJjX2dhdGVfY3RybChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgaW50IGVuYWJsZSkKK3sKKwlzdHJ1Y3Qgbnh0NjAwMF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKworCWlmIChlbmFibGUpIHsKKwkJcmV0dXJuIG54dDYwMDBfd3JpdGVyZWcoc3RhdGUsIEVOQUJMRV9UVU5FUl9JSUMsIDB4MDEpOworCX0gZWxzZSB7CisJCXJldHVybiBueHQ2MDAwX3dyaXRlcmVnKHN0YXRlLCBFTkFCTEVfVFVORVJfSUlDLCAweDAwKTsKKwl9Cit9CisKIHN0YXRpYyBzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyBueHQ2MDAwX29wczsKIAogc3RydWN0IGR2Yl9mcm9udGVuZCogbnh0NjAwMF9hdHRhY2goY29uc3Qgc3RydWN0IG54dDYwMDBfY29uZmlnKiBjb25maWcsCkBAIC01NDYsMTMgKzU1MSwxMiBAQAogCS8qIHNldHVwIHRoZSBzdGF0ZSAqLwogCXN0YXRlLT5jb25maWcgPSBjb25maWc7CiAJc3RhdGUtPmkyYyA9IGkyYzsKLQltZW1jcHkoJnN0YXRlLT5vcHMsICZueHQ2MDAwX29wcywgc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzKSk7CiAKIAkvKiBjaGVjayBpZiB0aGUgZGVtb2QgaXMgdGhlcmUgKi8KIAlpZiAobnh0NjAwMF9yZWFkcmVnKHN0YXRlLCBPRkRNX01TQ19SRVYpICE9IE5YVDYwMDBBU0lDREVWSUNFKSBnb3RvIGVycm9yOwogCiAJLyogY3JlYXRlIGR2Yl9mcm9udGVuZCAqLwotCXN0YXRlLT5mcm9udGVuZC5vcHMgPSAmc3RhdGUtPm9wczsKKwltZW1jcHkoJnN0YXRlLT5mcm9udGVuZC5vcHMsICZueHQ2MDAwX29wcywgc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzKSk7CiAJc3RhdGUtPmZyb250ZW5kLmRlbW9kdWxhdG9yX3ByaXYgPSBzdGF0ZTsKIAlyZXR1cm4gJnN0YXRlLT5mcm9udGVuZDsKIApAQCAtNTg0LDYgKzU4OCw3IEBACiAJLnJlbGVhc2UgPSBueHQ2MDAwX3JlbGVhc2UsCiAKIAkuaW5pdCA9IG54dDYwMDBfaW5pdCwKKwkuaTJjX2dhdGVfY3RybCA9IG54dDYwMDBfaTJjX2dhdGVfY3RybCwKIAogCS5nZXRfdHVuZV9zZXR0aW5ncyA9IG54dDYwMDBfZmVfZ2V0X3R1bmVfc2V0dGluZ3MsCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9ueHQ2MDAwLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbnh0NjAwMC5oCmluZGV4IGI3ZDliZWEuLjExNzAzMWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9ueHQ2MDAwLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL254dDYwMDAuaApAQCAtMzEsMTAgKzMxLDYgQEAKIAogCS8qIHNob3VsZCBjbG9jayBpbnZlcnNpb24gYmUgdXNlZD8gKi8KIAl1OCBjbG9ja19pbnZlcnNpb246MTsKLQotCS8qIFBMTCBtYWludGVuYW5jZSAqLwotCWludCAoKnBsbF9pbml0KShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSk7Ci0JaW50ICgqcGxsX3NldCkoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyogcGFyYW1zKTsKIH07CiAKIGV4dGVybiBzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBueHQ2MDAwX2F0dGFjaChjb25zdCBzdHJ1Y3Qgbnh0NjAwMF9jb25maWcqIGNvbmZpZywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9vcjUxMTMyLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvb3I1MTEzMi5jCmluZGV4IDgwZTBmMjguLmQyMGFiMzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9vcjUxMTMyLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL29yNTExMzIuYwpAQCAtNTQsNyArNTQsNiBAQAogc3RydWN0IG9yNTExMzJfc3RhdGUKIHsKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIqIGkyYzsKLQlzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyBvcHM7CiAKIAkvKiBDb25maWd1cmF0aW9uIHNldHRpbmdzICovCiAJY29uc3Qgc3RydWN0IG9yNTExMzJfY29uZmlnKiBjb25maWc7CkBAIC0xMDYsOSArMTA1LDggQEAKIHsKIAlzdHJ1Y3Qgb3I1MTEzMl9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAlzdGF0aWMgdTggcnVuX2J1ZltdID0gezB4N0YsMHgwMX07Ci0Jc3RhdGljIHU4IGdldF92ZXJfYnVmW10gPSB7MHgwNCwweDAwLDB4MzAsMHgwMCwweDAwfTsKLQl1OCByZWNfYnVmWzE0XTsKLQl1OCBjbWRfYnVmWzE0XTsKKwl1OCByZWNfYnVmWzhdOworCXU4IGNtZF9idWZbM107CiAJdTMyIGZpcm13YXJlQXNpemUsIGZpcm13YXJlQnNpemU7CiAJaW50IGkscmV0OwogCkBAIC0xNTcsNyArMTU1LDYgQEAKIAljbWRfYnVmWzBdID0gMHgxMDsKIAljbWRfYnVmWzFdID0gMHgxMDsKIAljbWRfYnVmWzJdID0gMHgwMDsKLQljbWRfYnVmWzNdID0gMHgwMDsKIAltc2xlZXAoMjApOyAvKiAyMG1zICovCiAJaWYgKChyZXQgPSBpMmNfd3JpdGVieXRlcyhzdGF0ZSxzdGF0ZS0+Y29uZmlnLT5kZW1vZF9hZGRyZXNzLAogCQkJCSBjbWRfYnVmLDMpKSkgewpAQCAtMTY3LDggKzE2NCw2IEBACiAKIAljbWRfYnVmWzBdID0gMHgwNDsKIAljbWRfYnVmWzFdID0gMHgxNzsKLQljbWRfYnVmWzJdID0gMHgwMDsKLQljbWRfYnVmWzNdID0gMHgwMDsKIAltc2xlZXAoMjApOyAvKiAyMG1zICovCiAJaWYgKChyZXQgPSBpMmNfd3JpdGVieXRlcyhzdGF0ZSxzdGF0ZS0+Y29uZmlnLT5kZW1vZF9hZGRyZXNzLAogCQkJCSBjbWRfYnVmLDIpKSkgewpAQCAtMTc4LDggKzE3Myw2IEBACiAKIAljbWRfYnVmWzBdID0gMHgwMDsKIAljbWRfYnVmWzFdID0gMHgwMDsKLQljbWRfYnVmWzJdID0gMHgwMDsKLQljbWRfYnVmWzNdID0gMHgwMDsKIAltc2xlZXAoMjApOyAvKiAyMG1zICovCiAJaWYgKChyZXQgPSBpMmNfd3JpdGVieXRlcyhzdGF0ZSxzdGF0ZS0+Y29uZmlnLT5kZW1vZF9hZGRyZXNzLAogCQkJCSBjbWRfYnVmLDIpKSkgewpAQCAtMTg5LDcgKzE4MiwxMSBAQAogCiAJZm9yKGk9MDtpPDQ7aSsrKSB7CiAJCW1zbGVlcCgyMCk7IC8qIDIwbXMgKi8KLQkJZ2V0X3Zlcl9idWZbNF0gPSBpKzE7CisJCS8qIE9uY2UgdXBvbiBhIHRpbWUsIHRoaXMgY29tbWFuZCBtaWdodCBoYXZlIGhhZCBzb21ldGhpbmcKKwkJICAgdG8gZG8gd2l0aCBnZXR0aW5nIHRoZSBmaXJtd2FyZSB2ZXJzaW9uLCBidXQgaXQncworCQkgICBub3QgdXNlZCBhbnltb3JlOgorCQkgICB7MHgwNCwweDAwLDB4MzAsMHgwMCxpKzF9ICovCisJCS8qIFJlYWQgOCBieXRlcywgdHdvIGJ5dGVzIGF0IGEgdGltZSAqLwogCQlpZiAoKHJldCA9IGkyY19yZWFkYnl0ZXMoc3RhdGUsc3RhdGUtPmNvbmZpZy0+ZGVtb2RfYWRkcmVzcywKIAkJCQkJJnJlY19idWZbaSoyXSwyKSkpIHsKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcKQEAgLTIwOCw3ICsyMDUsNiBAQAogCWNtZF9idWZbMF0gPSAweDEwOwogCWNtZF9idWZbMV0gPSAweDAwOwogCWNtZF9idWZbMl0gPSAweDAwOwotCWNtZF9idWZbM10gPSAweDAwOwogCW1zbGVlcCgyMCk7IC8qIDIwbXMgKi8KIAlpZiAoKHJldCA9IGkyY193cml0ZWJ5dGVzKHN0YXRlLHN0YXRlLT5jb25maWctPmRlbW9kX2FkZHJlc3MsCiAJCQkJIGNtZF9idWYsMykpKSB7CkBAIC0yNDMsNyArMjM5LDcgQEAKIHN0YXRpYyBpbnQgb3I1MTEzMl9zZXRtb2RlKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKQogewogCXN0cnVjdCBvcjUxMTMyX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwotCXVuc2lnbmVkIGNoYXIgY21kX2J1Zls0XTsKKwl1bnNpZ25lZCBjaGFyIGNtZF9idWZbM107CiAKIAlkcHJpbnRrKCJzZXRtb2RlICVkXG4iLChpbnQpc3RhdGUtPmN1cnJlbnRfbW9kdWxhdGlvbik7CiAJLyogc2V0IG9wZXJhdGlvbiBtb2RlIGluIFJlY2VpdmVyIDEgcmVnaXN0ZXI7ICovCkBAIC0yNjMsNyArMjU5LDYgQEAKIAlkZWZhdWx0OgogCQlwcmludGsoInNldG1vZGU6TW9kdWxhdGlvbiBzZXQgdG8gdW5zdXBwb3J0ZWQgdmFsdWVcbiIpOwogCX07Ci0JY21kX2J1ZlszXSA9IDB4MDA7CiAJaWYgKGkyY193cml0ZWJ5dGVzKHN0YXRlLHN0YXRlLT5jb25maWctPmRlbW9kX2FkZHJlc3MsCiAJCQkgICBjbWRfYnVmLDMpKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIm9yNTExMzI6IHNldF9tb2RlIGVycm9yIDFcbiIpOwpAQCAtMzAxLDcgKzI5Niw2IEBACiAJZGVmYXVsdDoKIAkJcHJpbnRrKCJzZXRtb2RlOiBNb2R1bGF0aW9uIHNldCB0byB1bnN1cHBvcnRlZCB2YWx1ZVxuIik7CiAJfTsKLQljbWRfYnVmWzNdID0gMHgwMDsKIAltc2xlZXAoMjApOyAvKiAyMG1zICovCiAJaWYgKGkyY193cml0ZWJ5dGVzKHN0YXRlLHN0YXRlLT5jb25maWctPmRlbW9kX2FkZHJlc3MsCiAJCQkgICBjbWRfYnVmLDMpKSB7CkBAIC0zMTMsNTIgKzMwNyw2NSBAQAogCXJldHVybiAwOwogfQogCisvKiBTb21lIG1vZHVsYXRpb25zIHVzZSB0aGUgc2FtZSBmaXJtd2FyZS4gIFRoaXMgY2xhc3NpZmllcyBtb2R1bGF0aW9ucworICAgYnkgdGhlIGZpcm13YXJlIHRoZXkgdXNlLiAqLworI2RlZmluZSBNT0RfRldDTEFTU19VTktOT1dOCTAKKyNkZWZpbmUgTU9EX0ZXQ0xBU1NfVlNCCQkxCisjZGVmaW5lIE1PRF9GV0NMQVNTX1FBTQkJMgorc3RhdGljIGludCBtb2R1bGF0aW9uX2Z3X2NsYXNzKGZlX21vZHVsYXRpb25fdCBtb2R1bGF0aW9uKQoreworCXN3aXRjaChtb2R1bGF0aW9uKSB7CisJY2FzZSBWU0JfODoKKwkJcmV0dXJuIE1PRF9GV0NMQVNTX1ZTQjsKKwljYXNlIFFBTV9BVVRPOgorCWNhc2UgUUFNXzY0OgorCWNhc2UgUUFNXzI1NjoKKwkJcmV0dXJuIE1PRF9GV0NMQVNTX1FBTTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gTU9EX0ZXQ0xBU1NfVU5LTk9XTjsKKwl9Cit9CisKIHN0YXRpYyBpbnQgb3I1MTEzMl9zZXRfcGFyYW1ldGVycyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwKIAkJCQkgIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcGFyYW0pCiB7CiAJaW50IHJldDsKLQl1OCBidWZbNF07CiAJc3RydWN0IG9yNTExMzJfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdzsKKwljb25zdCBjaGFyICpmd25hbWU7CisJaW50IGNsb2NrX21vZGU7CiAKLQkvKiBDaGFuZ2Ugb25seSBpZiB3ZSBhcmUgYWN0dWFsbHkgY2hhbmdpbmcgdGhlIG1vZHVsYXRpb24gKi8KLQlpZiAoc3RhdGUtPmN1cnJlbnRfbW9kdWxhdGlvbiAhPSBwYXJhbS0+dS52c2IubW9kdWxhdGlvbikgewotCQlzd2l0Y2gocGFyYW0tPnUudnNiLm1vZHVsYXRpb24pIHsKLQkJY2FzZSBWU0JfODoKKwkvKiBVcGxvYWQgbmV3IGZpcm13YXJlIG9ubHkgaWYgd2UgbmVlZCBhIGRpZmZlcmVudCBvbmUgKi8KKwlpZiAobW9kdWxhdGlvbl9md19jbGFzcyhzdGF0ZS0+Y3VycmVudF9tb2R1bGF0aW9uKSAhPQorCSAgICBtb2R1bGF0aW9uX2Z3X2NsYXNzKHBhcmFtLT51LnZzYi5tb2R1bGF0aW9uKSkgeworCQlzd2l0Y2gobW9kdWxhdGlvbl9md19jbGFzcyhwYXJhbS0+dS52c2IubW9kdWxhdGlvbikpIHsKKwkJY2FzZSBNT0RfRldDTEFTU19WU0I6CiAJCQlkcHJpbnRrKCJzZXRfcGFyYW1ldGVycyBWU0IgTU9ERVxuIik7Ci0JCQlwcmludGsoIm9yNTExMzI6IFdhaXRpbmcgZm9yIGZpcm13YXJlIHVwbG9hZCglcykuLi5cbiIsCi0JCQkgICAgICAgT1I1MTEzMl9WU0JfRklSTVdBUkUpOwotCQkJcmV0ID0gcmVxdWVzdF9maXJtd2FyZSgmZncsIE9SNTExMzJfVlNCX0ZJUk1XQVJFLAotCQkJCQkgICAgICAgJnN0YXRlLT5pMmMtPmRldik7Ci0JCQlpZiAocmV0KXsKLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJvcjUxMTMyOiBObyBmaXJtd2FyZSB1cCIKLQkJCQkgICAgICAgImxvYWRlZCh0aW1lb3V0IG9yIGZpbGUgbm90IGZvdW5kPylcbiIpOwotCQkJCXJldHVybiByZXQ7Ci0JCQl9CisJCQlmd25hbWUgPSBPUjUxMTMyX1ZTQl9GSVJNV0FSRTsKKwogCQkJLyogU2V0IG5vbi1wdW5jdHVyZWQgY2xvY2sgZm9yIFZTQiAqLwotCQkJc3RhdGUtPmNvbmZpZy0+c2V0X3RzX3BhcmFtcyhmZSwgMCk7CisJCQljbG9ja19tb2RlID0gMDsKIAkJCWJyZWFrOwotCQljYXNlIFFBTV9BVVRPOgotCQljYXNlIFFBTV82NDoKLQkJY2FzZSBRQU1fMjU2OgorCQljYXNlIE1PRF9GV0NMQVNTX1FBTToKIAkJCWRwcmludGsoInNldF9wYXJhbWV0ZXJzIFFBTSBNT0RFXG4iKTsKLQkJCXByaW50aygib3I1MTEzMjogV2FpdGluZyBmb3IgZmlybXdhcmUgdXBsb2FkKCVzKS4uLlxuIiwKLQkJCSAgICAgICBPUjUxMTMyX1FBTV9GSVJNV0FSRSk7Ci0JCQlyZXQgPSByZXF1ZXN0X2Zpcm13YXJlKCZmdywgT1I1MTEzMl9RQU1fRklSTVdBUkUsCi0JCQkJCSAgICAgICAmc3RhdGUtPmkyYy0+ZGV2KTsKLQkJCWlmIChyZXQpewotCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIm9yNTExMzI6IE5vIGZpcm13YXJlIHVwIgotCQkJCSAgICAgICAibG9hZGVkKHRpbWVvdXQgb3IgZmlsZSBub3QgZm91bmQ/KVxuIik7Ci0JCQkJcmV0dXJuIHJldDsKLQkJCX0KKwkJCWZ3bmFtZSA9IE9SNTExMzJfUUFNX0ZJUk1XQVJFOworCiAJCQkvKiBTZXQgcHVuY3R1cmVkIGNsb2NrIGZvciBRQU0gKi8KLQkJCXN0YXRlLT5jb25maWctPnNldF90c19wYXJhbXMoZmUsIDEpOworCQkJY2xvY2tfbW9kZSA9IDE7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCXByaW50aygib3I1MTEzMjpNb2R1bGF0aW9uIHR5cGUoJWQpIFVOU1VQUE9SVEVEXG4iLAorCQkJcHJpbnRrKCJvcjUxMTMyOiBNb2R1bGF0aW9uIHR5cGUoJWQpIFVOU1VQUE9SVEVEXG4iLAogCQkJICAgICAgIHBhcmFtLT51LnZzYi5tb2R1bGF0aW9uKTsKIAkJCXJldHVybiAtMTsKLQkJfTsKKwkJfQorCQlwcmludGsoIm9yNTExMzI6IFdhaXRpbmcgZm9yIGZpcm13YXJlIHVwbG9hZCglcykuLi5cbiIsCisJCSAgICAgICBmd25hbWUpOworCQlyZXQgPSByZXF1ZXN0X2Zpcm13YXJlKCZmdywgZnduYW1lLCAmc3RhdGUtPmkyYy0+ZGV2KTsKKwkJaWYgKHJldCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAib3I1MTEzMjogTm8gZmlybXdhcmUgdXAiCisJCQkgICAgICAgImxvYWRlZCh0aW1lb3V0IG9yIGZpbGUgbm90IGZvdW5kPylcbiIpOworCQkJcmV0dXJuIHJldDsKKwkJfQogCQlyZXQgPSBvcjUxMTMyX2xvYWRfZmlybXdhcmUoZmUsIGZ3KTsKIAkJcmVsZWFzZV9maXJtd2FyZShmdyk7CiAJCWlmIChyZXQpIHsKQEAgLTM2NywxOCArMzc0LDE4IEBACiAJCQlyZXR1cm4gcmV0OwogCQl9CiAJCXByaW50aygib3I1MTEzMjogRmlybXdhcmUgdXBsb2FkIGNvbXBsZXRlLlxuIik7Ci0KKwkJc3RhdGUtPmNvbmZpZy0+c2V0X3RzX3BhcmFtcyhmZSwgY2xvY2tfbW9kZSk7CisJfQorCS8qIENoYW5nZSBvbmx5IGlmIHdlIGFyZSBhY3R1YWxseSBjaGFuZ2luZyB0aGUgbW9kdWxhdGlvbiAqLworCWlmIChzdGF0ZS0+Y3VycmVudF9tb2R1bGF0aW9uICE9IHBhcmFtLT51LnZzYi5tb2R1bGF0aW9uKSB7CiAJCXN0YXRlLT5jdXJyZW50X21vZHVsYXRpb24gPSBwYXJhbS0+dS52c2IubW9kdWxhdGlvbjsKIAkJb3I1MTEzMl9zZXRtb2RlKGZlKTsKIAl9CiAKLQlkdmJfcGxsX2NvbmZpZ3VyZShzdGF0ZS0+Y29uZmlnLT5wbGxfZGVzYywgYnVmLAotCQkJICBwYXJhbS0+ZnJlcXVlbmN5LCAwKTsKLQlkcHJpbnRrKCJzZXRfcGFyYW1ldGVycyB0dW5lciBieXRlczogMHglMDJ4IDB4JTAyeCAiCi0JCSIweCUwMnggMHglMDJ4XG4iLGJ1ZlswXSxidWZbMV0sYnVmWzJdLGJ1ZlszXSk7Ci0JaWYgKGkyY193cml0ZWJ5dGVzKHN0YXRlLCBzdGF0ZS0+Y29uZmlnLT5wbGxfYWRkcmVzcyAsYnVmLCA0KSkKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAib3I1MTEzMjogc2V0X3BhcmFtZXRlcnMgZXJyb3IgIgotCQkgICAgICAgIndyaXRpbmcgdG8gdHVuZXJcbiIpOworCWlmIChmZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zKSB7CisJCWZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMoZmUsIHBhcmFtKTsKKwkJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkgZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAwKTsKKwl9CiAKIAkvKiBTZXQgdG8gY3VycmVudCBtb2RlICovCiAJb3I1MTEzMl9zZXRtb2RlKGZlKTsKQEAgLTM4OCw2ICszOTUsNDQgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBvcjUxMTMyX2dldF9wYXJhbWV0ZXJzKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLAorCQkJCSAgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbSkKK3sKKwlzdHJ1Y3Qgb3I1MTEzMl9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwl1OCBidWZbMl07CisKKwkvKiBSZWNlaXZlciBTdGF0dXMgKi8KKwlidWZbMF09MHgwNDsKKwlidWZbMV09MHgwMDsKKwltc2xlZXAoMzApOyAvKiAzMG1zICovCisJaWYgKGkyY193cml0ZWJ5dGVzKHN0YXRlLHN0YXRlLT5jb25maWctPmRlbW9kX2FkZHJlc3MsYnVmLDIpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm9yNTExMzI6IGdldF9wYXJhbWV0ZXJzIHdyaXRlIGVycm9yXG4iKTsKKwkJcmV0dXJuIC1FUkVNT1RFSU87CisJfQorCW1zbGVlcCgzMCk7IC8qIDMwbXMgKi8KKwlpZiAoaTJjX3JlYWRieXRlcyhzdGF0ZSxzdGF0ZS0+Y29uZmlnLT5kZW1vZF9hZGRyZXNzLGJ1ZiwyKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJvcjUxMTMyOiBnZXRfcGFyYW1ldGVycyByZWFkIGVycm9yXG4iKTsKKwkJcmV0dXJuIC1FUkVNT1RFSU87CisJfQorCXN3aXRjaChidWZbMF0pIHsKKwkJY2FzZSAweDA2OiBwYXJhbS0+dS52c2IubW9kdWxhdGlvbiA9IFZTQl84OyBicmVhazsKKwkJY2FzZSAweDQzOiBwYXJhbS0+dS52c2IubW9kdWxhdGlvbiA9IFFBTV82NDsgYnJlYWs7CisJCWNhc2UgMHg0NTogcGFyYW0tPnUudnNiLm1vZHVsYXRpb24gPSBRQU1fMjU2OyBicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIm9yNTExMzI6IHVua25vd24gc3RhdHVzIDB4JTAyeFxuIiwKKwkJCSAgICAgICBidWZbMF0pOworCQkJcmV0dXJuIC1FUkVNT1RFSU87CisJfQorCisJLyogRklYTUU6IFJlYWQgZnJlcXVlbmN5IGZyb20gZnJvbnRlbmQsIHRha2UgQUZDIGludG8gYWNjb3VudCAqLworCXBhcmFtLT5mcmVxdWVuY3kgPSBzdGF0ZS0+Y3VycmVudF9mcmVxdWVuY3k7CisKKwkvKiBGSVhNRTogSG93IHRvIHJlYWQgaW52ZXJzaW9uIHNldHRpbmc/IFJlY2VpdmVyIDYgcmVnaXN0ZXI/ICovCisJcGFyYW0tPmludmVyc2lvbiA9IElOVkVSU0lPTl9BVVRPOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgb3I1MTEzMl9yZWFkX3N0YXR1cyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgZmVfc3RhdHVzX3QqIHN0YXR1cykKIHsKIAlzdHJ1Y3Qgb3I1MTEzMl9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKQEAgLTU3MiwxMiArNjE3LDExIEBACiAJLyogU2V0dXAgdGhlIHN0YXRlICovCiAJc3RhdGUtPmNvbmZpZyA9IGNvbmZpZzsKIAlzdGF0ZS0+aTJjID0gaTJjOwotCW1lbWNweSgmc3RhdGUtPm9wcywgJm9yNTExMzJfb3BzLCBzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMpKTsKIAlzdGF0ZS0+Y3VycmVudF9mcmVxdWVuY3kgPSAtMTsKIAlzdGF0ZS0+Y3VycmVudF9tb2R1bGF0aW9uID0gLTE7CiAKIAkvKiBDcmVhdGUgZHZiX2Zyb250ZW5kICovCi0Jc3RhdGUtPmZyb250ZW5kLm9wcyA9ICZzdGF0ZS0+b3BzOworCW1lbWNweSgmc3RhdGUtPmZyb250ZW5kLm9wcywgJm9yNTExMzJfb3BzLCBzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMpKTsKIAlzdGF0ZS0+ZnJvbnRlbmQuZGVtb2R1bGF0b3JfcHJpdiA9IHN0YXRlOwogCXJldHVybiAmc3RhdGUtPmZyb250ZW5kOwogCkBAIC01OTAsNyArNjM0LDcgQEAKIAogCS5pbmZvID0gewogCQkubmFtZQkJCT0gIk9yZW4gT1I1MTEzMiBWU0IvUUFNIEZyb250ZW5kIiwKLQkJLnR5cGUgCQkJPSBGRV9BVFNDLAorCQkudHlwZQkJCT0gRkVfQVRTQywKIAkJLmZyZXF1ZW5jeV9taW4JCT0gNDQwMDAwMDAsCiAJCS5mcmVxdWVuY3lfbWF4CQk9IDk1ODAwMDAwMCwKIAkJLmZyZXF1ZW5jeV9zdGVwc2l6ZQk9IDE2NjY2NiwKQEAgLTYwNiw2ICs2NTAsNyBAQAogCS5zbGVlcCA9IG9yNTExMzJfc2xlZXAsCiAKIAkuc2V0X2Zyb250ZW5kID0gb3I1MTEzMl9zZXRfcGFyYW1ldGVycywKKwkuZ2V0X2Zyb250ZW5kID0gb3I1MTEzMl9nZXRfcGFyYW1ldGVycywKIAkuZ2V0X3R1bmVfc2V0dGluZ3MgPSBvcjUxMTMyX2dldF90dW5lX3NldHRpbmdzLAogCiAJLnJlYWRfc3RhdHVzID0gb3I1MTEzMl9yZWFkX3N0YXR1cywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9vcjUxMTMyLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvb3I1MTEzMi5oCmluZGV4IDYyMmNkZDEuLjg5NjU4ODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9vcjUxMTMyLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL29yNTExMzIuaApAQCAtMjksOCArMjksNiBAQAogewogCS8qIFRoZSBkZW1vZHVsYXRvcidzIGkyYyBhZGRyZXNzICovCiAJdTggZGVtb2RfYWRkcmVzczsKLQl1OCBwbGxfYWRkcmVzczsKLQlzdHJ1Y3QgZHZiX3BsbF9kZXNjICpwbGxfZGVzYzsKIAogCS8qIE5lZWQgdG8gc2V0IGRldmljZSBwYXJhbSBmb3Igc3RhcnRfZG1hICovCiAJaW50ICgqc2V0X3RzX3BhcmFtcykoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGludCBpc19wdW5jdHVyZWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL29yNTEyMTEuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9vcjUxMjExLmMKaW5kZXggN2MzYWVkMS4uMjZiZWQ2MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL29yNTEyMTEuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvb3I1MTIxMS5jCkBAIC01NCw3ICs1NCw2IEBACiBzdHJ1Y3Qgb3I1MTIxMV9zdGF0ZSB7CiAKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIqIGkyYzsKLQlzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyBvcHM7CiAKIAkvKiBDb25maWd1cmF0aW9uIHNldHRpbmdzICovCiAJY29uc3Qgc3RydWN0IG9yNTEyMTFfY29uZmlnKiBjb25maWc7CkBAIC01ODUsMTIgKzU4NCwxMSBAQAogCS8qIFNldHVwIHRoZSBzdGF0ZSAqLwogCXN0YXRlLT5jb25maWcgPSBjb25maWc7CiAJc3RhdGUtPmkyYyA9IGkyYzsKLQltZW1jcHkoJnN0YXRlLT5vcHMsICZvcjUxMjExX29wcywgc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzKSk7CiAJc3RhdGUtPmluaXRpYWxpemVkID0gMDsKIAlzdGF0ZS0+Y3VycmVudF9mcmVxdWVuY3kgPSAwOwogCiAJLyogQ3JlYXRlIGR2Yl9mcm9udGVuZCAqLwotCXN0YXRlLT5mcm9udGVuZC5vcHMgPSAmc3RhdGUtPm9wczsKKwltZW1jcHkoJnN0YXRlLT5mcm9udGVuZC5vcHMsICZvcjUxMjExX29wcywgc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzKSk7CiAJc3RhdGUtPmZyb250ZW5kLmRlbW9kdWxhdG9yX3ByaXYgPSBzdGF0ZTsKIAlyZXR1cm4gJnN0YXRlLT5mcm9udGVuZDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3M1aDE0MjAuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zNWgxNDIwLmMKaW5kZXggZDY5NDc3NS4uMmMyYzM0NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3M1aDE0MjAuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvczVoMTQyMC5jCkBAIC0zOCw3ICszOCw2IEBACiAKIHN0cnVjdCBzNWgxNDIwX3N0YXRlIHsKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIqIGkyYzsKLQlzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyBvcHM7CiAJY29uc3Qgc3RydWN0IHM1aDE0MjBfY29uZmlnKiBjb25maWc7CiAJc3RydWN0IGR2Yl9mcm9udGVuZCBmcm9udGVuZDsKIApAQCAtNTg0LDcgKzU4Myw2IEBACiAJc3RydWN0IHM1aDE0MjBfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAJaW50IGZyZXF1ZW5jeV9kZWx0YTsKIAlzdHJ1Y3QgZHZiX2Zyb250ZW5kX3R1bmVfc2V0dGluZ3MgZmVzZXR0aW5nczsKLQl1MzIgdG1wOwogCiAJLyogY2hlY2sgaWYgd2Ugc2hvdWxkIGRvIGEgZmFzdC10dW5lICovCiAJbWVtY3B5KCZmZXNldHRpbmdzLnBhcmFtZXRlcnMsIHAsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMpKTsKQEAgLTU5NiwxMCArNTk0LDE3IEBACiAJICAgIChzdGF0ZS0+ZmVjX2lubmVyID09IHAtPnUucXBzay5mZWNfaW5uZXIpICYmCiAJICAgIChzdGF0ZS0+c3ltYm9sX3JhdGUgPT0gcC0+dS5xcHNrLnN5bWJvbF9yYXRlKSkgewogCi0JCWlmIChzdGF0ZS0+Y29uZmlnLT5wbGxfc2V0KSB7Ci0JCQlzNWgxNDIwX3dyaXRlcmVnIChzdGF0ZSwgMHgwMiwgczVoMTQyMF9yZWFkcmVnKHN0YXRlLDB4MDIpIHwgMSk7Ci0JCQlzdGF0ZS0+Y29uZmlnLT5wbGxfc2V0KGZlLCBwLCAmdG1wKTsKKwkJaWYgKGZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMpIHsKKwkJCWZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMoZmUsIHApOworCQkJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkgZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAwKTsKKwkJfQorCQlpZiAoZmUtPm9wcy50dW5lcl9vcHMuZ2V0X2ZyZXF1ZW5jeSkgeworCQkJdTMyIHRtcDsKKwkJCWZlLT5vcHMudHVuZXJfb3BzLmdldF9mcmVxdWVuY3koZmUsICZ0bXApOworCQkJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkgZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAwKTsKIAkJCXM1aDE0MjBfc2V0ZnJlcW9mZnNldChzdGF0ZSwgcC0+ZnJlcXVlbmN5IC0gdG1wKTsKKwkJfSBlbHNlIHsKKwkJCXM1aDE0MjBfc2V0ZnJlcW9mZnNldChzdGF0ZSwgMCk7CiAJCX0KIAkJcmV0dXJuIDA7CiAJfQpAQCAtNjQ2LDkgKzY1MSw5IEBACiAJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgwNSwgczVoMTQyMF9yZWFkcmVnKHN0YXRlLCAweDA1KSB8IDEpOwogCiAJLyogc2V0IHR1bmVyIFBMTCAqLwotCWlmIChzdGF0ZS0+Y29uZmlnLT5wbGxfc2V0KSB7Ci0JCXM1aDE0MjBfd3JpdGVyZWcgKHN0YXRlLCAweDAyLCBzNWgxNDIwX3JlYWRyZWcoc3RhdGUsMHgwMikgfCAxKTsKLQkJc3RhdGUtPmNvbmZpZy0+cGxsX3NldChmZSwgcCwgJnRtcCk7CisJaWYgKGZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMpIHsKKwkJZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyhmZSwgcCk7CisJCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpIGZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMCk7CiAJCXM1aDE0MjBfc2V0ZnJlcW9mZnNldChzdGF0ZSwgMCk7CiAJfQogCkBAIC03MDgsNiArNzEzLDE3IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgczVoMTQyMF9pMmNfZ2F0ZV9jdHJsKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBpbnQgZW5hYmxlKQoreworCXN0cnVjdCBzNWgxNDIwX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCisJaWYgKGVuYWJsZSkgeworCQlyZXR1cm4gczVoMTQyMF93cml0ZXJlZyAoc3RhdGUsIDB4MDIsIHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwweDAyKSB8IDEpOworCX0gZWxzZSB7CisJCXJldHVybiBzNWgxNDIwX3dyaXRlcmVnIChzdGF0ZSwgMHgwMiwgczVoMTQyMF9yZWFkcmVnKHN0YXRlLDB4MDIpICYgMHhmZSk7CisJfQorfQorCiBzdGF0aWMgaW50IHM1aDE0MjBfaW5pdCAoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCiB7CiAJc3RydWN0IHM1aDE0MjBfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CkBAIC03MTcsMTMgKzczMyw2IEBACiAJbXNsZWVwKDEwKTsKIAlzNWgxNDIwX3Jlc2V0KHN0YXRlKTsKIAotCS8qIGluaXQgUExMICovCi0JaWYgKHN0YXRlLT5jb25maWctPnBsbF9pbml0KSB7Ci0JCXM1aDE0MjBfd3JpdGVyZWcgKHN0YXRlLCAweDAyLCBzNWgxNDIwX3JlYWRyZWcoc3RhdGUsMHgwMikgfCAxKTsKLQkJc3RhdGUtPmNvbmZpZy0+cGxsX2luaXQoZmUpOwotCQlzNWgxNDIwX3dyaXRlcmVnIChzdGF0ZSwgMHgwMiwgczVoMTQyMF9yZWFkcmVnKHN0YXRlLDB4MDIpICYgMHhmZSk7Ci0JfQotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTc1Niw3ICs3NjUsNiBAQAogCS8qIHNldHVwIHRoZSBzdGF0ZSAqLwogCXN0YXRlLT5jb25maWcgPSBjb25maWc7CiAJc3RhdGUtPmkyYyA9IGkyYzsKLQltZW1jcHkoJnN0YXRlLT5vcHMsICZzNWgxNDIwX29wcywgc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzKSk7CiAJc3RhdGUtPnBvc3Rsb2NrZWQgPSAwOwogCXN0YXRlLT5mY2xrID0gODgwMDAwMDA7CiAJc3RhdGUtPnR1bmVkZnJlcSA9IDA7CkBAIC03NjksNyArNzc3LDcgQEAKIAkJZ290byBlcnJvcjsKIAogCS8qIGNyZWF0ZSBkdmJfZnJvbnRlbmQgKi8KLQlzdGF0ZS0+ZnJvbnRlbmQub3BzID0gJnN0YXRlLT5vcHM7CisJbWVtY3B5KCZzdGF0ZS0+ZnJvbnRlbmQub3BzLCAmczVoMTQyMF9vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOwogCXN0YXRlLT5mcm9udGVuZC5kZW1vZHVsYXRvcl9wcml2ID0gc3RhdGU7CiAJcmV0dXJuICZzdGF0ZS0+ZnJvbnRlbmQ7CiAKQEAgLTgwMCw2ICs4MDgsNyBAQAogCiAJLmluaXQgPSBzNWgxNDIwX2luaXQsCiAJLnNsZWVwID0gczVoMTQyMF9zbGVlcCwKKwkuaTJjX2dhdGVfY3RybCA9IHM1aDE0MjBfaTJjX2dhdGVfY3RybCwKIAogCS5zZXRfZnJvbnRlbmQgPSBzNWgxNDIwX3NldF9mcm9udGVuZCwKIAkuZ2V0X2Zyb250ZW5kID0gczVoMTQyMF9nZXRfZnJvbnRlbmQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvczVoMTQyMC5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3M1aDE0MjAuaAppbmRleCA3MzI5NmYxLi40ZTM5MDE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvczVoMTQyMC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zNWgxNDIwLmgKQEAgLTMyLDEwICszMiw2IEBACiAKIAkvKiBkb2VzIHRoZSBpbnZlcnNpb24gcmVxdWlyZSBpbnZlcnNpb24/ICovCiAJdTggaW52ZXJ0OjE7Ci0KLQkvKiBQTEwgbWFpbnRlbmFuY2UgKi8KLQlpbnQgKCpwbGxfaW5pdCkoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpOwotCWludCAoKnBsbF9zZXQpKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcywgdTMyKiBmcmVxb3V0KTsKIH07CiAKIGV4dGVybiBzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBzNWgxNDIwX2F0dGFjaChjb25zdCBzdHJ1Y3QgczVoMTQyMF9jb25maWcqIGNvbmZpZywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zcDg4NzAuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zcDg4NzAuYwppbmRleCA3MzgyOWU2Li40NGVjNWI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3A4ODcwLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3NwODg3MC5jCkBAIC00NCw4ICs0NCw2IEBACiAKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIqIGkyYzsKIAotCXN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzIG9wczsKLQogCWNvbnN0IHN0cnVjdCBzcDg4NzBfY29uZmlnKiBjb25maWc7CiAKIAlzdHJ1Y3QgZHZiX2Zyb250ZW5kIGZyb250ZW5kOwpAQCAtMjYyLDkgKzI2MCwxMCBAQAogCXNwODg3MF9taWNyb2NvbnRyb2xsZXJfc3RvcChzdGF0ZSk7CiAKIAkvLyBzZXQgdHVuZXIgcGFyYW1ldGVycwotCXNwODg3MF93cml0ZXJlZyhzdGF0ZSwgMHgyMDYsIDB4MDAxKTsKLQlzdGF0ZS0+Y29uZmlnLT5wbGxfc2V0KGZlLCBwKTsKLQlzcDg4NzBfd3JpdGVyZWcoc3RhdGUsIDB4MjA2LCAweDAwMCk7CisJaWYgKGZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMpIHsKKwkJZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyhmZSwgcCk7CisJCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpIGZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMCk7CisJfQogCiAJLy8gc2FtcGxlIHJhdGUgY29ycmVjdGlvbiBiaXQgWzIzLi4xN10KIAlzcDg4NzBfd3JpdGVyZWcoc3RhdGUsIDB4MDMxOSwgMHgwMDBBKTsKQEAgLTM0OSwxMyArMzQ4LDYgQEAKIAlzcDg4NzBfd3JpdGVyZWcoc3RhdGUsIDB4MEQwMCwgMHgwMTApOwogCXNwODg3MF93cml0ZXJlZyhzdGF0ZSwgMHgwRDAxLCAweDAwMCk7CiAKLQkvKiBzZXR1cCBQTEwgKi8KLQlpZiAoc3RhdGUtPmNvbmZpZy0+cGxsX2luaXQpIHsKLQkJc3A4ODcwX3dyaXRlcmVnKHN0YXRlLCAweDIwNiwgMHgwMDEpOwotCQlzdGF0ZS0+Y29uZmlnLT5wbGxfaW5pdChmZSk7Ci0JCXNwODg3MF93cml0ZXJlZyhzdGF0ZSwgMHgyMDYsIDB4MDAwKTsKLQl9Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtNTQxLDYgKzUzMywxNyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHNwODg3MF9pMmNfZ2F0ZV9jdHJsKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBpbnQgZW5hYmxlKQoreworCXN0cnVjdCBzcDg4NzBfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisKKwlpZiAoZW5hYmxlKSB7CisJCXJldHVybiBzcDg4NzBfd3JpdGVyZWcoc3RhdGUsIDB4MjA2LCAweDAwMSk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIHNwODg3MF93cml0ZXJlZyhzdGF0ZSwgMHgyMDYsIDB4MDAwKTsKKwl9Cit9CisKIHN0YXRpYyB2b2lkIHNwODg3MF9yZWxlYXNlKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKQogewogCXN0cnVjdCBzcDg4NzBfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CkBAIC01NjEsMTQgKzU2NCwxMyBAQAogCS8qIHNldHVwIHRoZSBzdGF0ZSAqLwogCXN0YXRlLT5jb25maWcgPSBjb25maWc7CiAJc3RhdGUtPmkyYyA9IGkyYzsKLQltZW1jcHkoJnN0YXRlLT5vcHMsICZzcDg4NzBfb3BzLCBzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMpKTsKIAlzdGF0ZS0+aW5pdGlhbGlzZWQgPSAwOwogCiAJLyogY2hlY2sgaWYgdGhlIGRlbW9kIGlzIHRoZXJlICovCiAJaWYgKHNwODg3MF9yZWFkcmVnKHN0YXRlLCAweDAyMDApIDwgMCkgZ290byBlcnJvcjsKIAogCS8qIGNyZWF0ZSBkdmJfZnJvbnRlbmQgKi8KLQlzdGF0ZS0+ZnJvbnRlbmQub3BzID0gJnN0YXRlLT5vcHM7CisJbWVtY3B5KCZzdGF0ZS0+ZnJvbnRlbmQub3BzLCAmc3A4ODcwX29wcywgc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzKSk7CiAJc3RhdGUtPmZyb250ZW5kLmRlbW9kdWxhdG9yX3ByaXYgPSBzdGF0ZTsKIAlyZXR1cm4gJnN0YXRlLT5mcm9udGVuZDsKIApAQCAtNTk3LDYgKzU5OSw3IEBACiAKIAkuaW5pdCA9IHNwODg3MF9pbml0LAogCS5zbGVlcCA9IHNwODg3MF9zbGVlcCwKKwkuaTJjX2dhdGVfY3RybCA9IHNwODg3MF9pMmNfZ2F0ZV9jdHJsLAogCiAJLnNldF9mcm9udGVuZCA9IHNwODg3MF9zZXRfZnJvbnRlbmQsCiAJLmdldF90dW5lX3NldHRpbmdzID0gc3A4ODcwX2dldF90dW5lX3NldHRpbmdzLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3NwODg3MC5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3NwODg3MC5oCmluZGV4IGYzYjU1NWQuLjkzYWZiYjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zcDg4NzAuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3A4ODcwLmgKQEAgLTMxLDEwICszMSw2IEBACiAJLyogdGhlIGRlbW9kdWxhdG9yJ3MgaTJjIGFkZHJlc3MgKi8KIAl1OCBkZW1vZF9hZGRyZXNzOwogCi0JLyogUExMIG1haW50ZW5hbmNlICovCi0JaW50ICgqcGxsX2luaXQpKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKTsKLQlpbnQgKCpwbGxfc2V0KShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMpOwotCiAJLyogcmVxdWVzdCBmaXJtd2FyZSBmb3IgZGV2aWNlICovCiAJaW50ICgqcmVxdWVzdF9maXJtd2FyZSkoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqKmZ3LCBjaGFyKiBuYW1lKTsKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3A4ODd4LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3A4ODd4LmMKaW5kZXggZWI4YTYwMi4uYjBhMmIwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3NwODg3eC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zcDg4N3guYwpAQCAtMjQsNyArMjQsNiBAQAogCiBzdHJ1Y3Qgc3A4ODd4X3N0YXRlIHsKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIqIGkyYzsKLQlzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyBvcHM7CiAJY29uc3Qgc3RydWN0IHNwODg3eF9jb25maWcqIGNvbmZpZzsKIAlzdHJ1Y3QgZHZiX2Zyb250ZW5kIGZyb250ZW5kOwogCkBAIC0yMDgsMTUgKzIwNyw2IEBACiAJLyogYml0IDB4MDEwOiBlbmFibGUgZGF0YSB2YWxpZCBzaWduYWwgKi8KIAlzcDg4N3hfd3JpdGVyZWcoc3RhdGUsIDB4ZDAwLCAweDAxMCk7CiAJc3A4ODd4X3dyaXRlcmVnKHN0YXRlLCAweDBkMSwgMHgwMDApOwotCi0JLyogc2V0dXAgdGhlIFBMTCAqLwotCWlmIChzdGF0ZS0+Y29uZmlnLT5wbGxfaW5pdCkgewotCQlzcDg4N3hfd3JpdGVyZWcoc3RhdGUsIDB4MjA2LCAweDAwMSk7Ci0JCXN0YXRlLT5jb25maWctPnBsbF9pbml0KGZlKTsKLQkJc3A4ODd4X3dyaXRlcmVnKHN0YXRlLCAweDIwNiwgMHgwMDApOwotCX0KLQotCXByaW50ayAoImRvbmUuXG4iKTsKIAlyZXR1cm4gMDsKIH07CiAKQEAgLTM2Miw5ICszNTIsMTYgQEAKIAlzcDg4N3hfbWljcm9jb250cm9sbGVyX3N0b3Aoc3RhdGUpOwogCiAJLyogc2V0dXAgdGhlIFBMTCAqLwotCXNwODg3eF93cml0ZXJlZyhzdGF0ZSwgMHgyMDYsIDB4MDAxKTsKLQlhY3R1YWxfZnJlcSA9IHN0YXRlLT5jb25maWctPnBsbF9zZXQoZmUsIHApOwotCXNwODg3eF93cml0ZXJlZyhzdGF0ZSwgMHgyMDYsIDB4MDAwKTsKKwlpZiAoZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcykgeworCQlmZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zKGZlLCBwKTsKKwkJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkgZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAwKTsKKwl9CisJaWYgKGZlLT5vcHMudHVuZXJfb3BzLmdldF9mcmVxdWVuY3kpIHsKKwkJZmUtPm9wcy50dW5lcl9vcHMuZ2V0X2ZyZXF1ZW5jeShmZSwgJmFjdHVhbF9mcmVxKTsKKwkJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkgZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAwKTsKKwl9IGVsc2UgeworCQlhY3R1YWxfZnJlcSA9IHAtPmZyZXF1ZW5jeTsKKwl9CiAKIAkvKiByZWFkIHN0YXR1cyByZWcgaW4gb3JkZXIgdG8gY2xlYXIgPHBlbmRpbmcgaXJxcyAqLwogCXNwODg3eF9yZWFkcmVnKHN0YXRlLCAweDIwMCk7CkBAIC00ODYsNiArNDgzLDE3IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgc3A4ODd4X2kyY19nYXRlX2N0cmwoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGludCBlbmFibGUpCit7CisJc3RydWN0IHNwODg3eF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKworCWlmIChlbmFibGUpIHsKKwkJcmV0dXJuIHNwODg3eF93cml0ZXJlZyhzdGF0ZSwgMHgyMDYsIDB4MDAxKTsKKwl9IGVsc2UgeworCQlyZXR1cm4gc3A4ODd4X3dyaXRlcmVnKHN0YXRlLCAweDIwNiwgMHgwMDApOworCX0KK30KKwogc3RhdGljIGludCBzcDg4N3hfc2xlZXAoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCiB7CiAJc3RydWN0IHNwODg3eF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKQEAgLTU1NSwxNCArNTYzLDEzIEBACiAJLyogc2V0dXAgdGhlIHN0YXRlICovCiAJc3RhdGUtPmNvbmZpZyA9IGNvbmZpZzsKIAlzdGF0ZS0+aTJjID0gaTJjOwotCW1lbWNweSgmc3RhdGUtPm9wcywgJnNwODg3eF9vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOwogCXN0YXRlLT5pbml0aWFsaXNlZCA9IDA7CiAKIAkvKiBjaGVjayBpZiB0aGUgZGVtb2QgaXMgdGhlcmUgKi8KIAlpZiAoc3A4ODd4X3JlYWRyZWcoc3RhdGUsIDB4MDIwMCkgPCAwKSBnb3RvIGVycm9yOwogCiAJLyogY3JlYXRlIGR2Yl9mcm9udGVuZCAqLwotCXN0YXRlLT5mcm9udGVuZC5vcHMgPSAmc3RhdGUtPm9wczsKKwltZW1jcHkoJnN0YXRlLT5mcm9udGVuZC5vcHMsICZzcDg4N3hfb3BzLCBzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMpKTsKIAlzdGF0ZS0+ZnJvbnRlbmQuZGVtb2R1bGF0b3JfcHJpdiA9IHN0YXRlOwogCXJldHVybiAmc3RhdGUtPmZyb250ZW5kOwogCkBAIC01ODksNiArNTk2LDcgQEAKIAogCS5pbml0ID0gc3A4ODd4X2luaXQsCiAJLnNsZWVwID0gc3A4ODd4X3NsZWVwLAorCS5pMmNfZ2F0ZV9jdHJsID0gc3A4ODd4X2kyY19nYXRlX2N0cmwsCiAKIAkuc2V0X2Zyb250ZW5kID0gc3A4ODd4X3NldHVwX2Zyb250ZW5kX3BhcmFtZXRlcnMsCiAJLmdldF90dW5lX3NldHRpbmdzID0gc3A4ODd4X2dldF90dW5lX3NldHRpbmdzLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3NwODg3eC5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3NwODg3eC5oCmluZGV4IDZhMDVkOGYuLmM0NGIwZWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zcDg4N3guaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3A4ODd4LmgKQEAgLTEzLDEyICsxMyw2IEBACiAJLyogdGhlIGRlbW9kdWxhdG9yJ3MgaTJjIGFkZHJlc3MgKi8KIAl1OCBkZW1vZF9hZGRyZXNzOwogCi0JLyogUExMIG1haW50ZW5hbmNlICovCi0JaW50ICgqcGxsX2luaXQpKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKTsKLQotCS8qIHRoaXMgc2hvdWxkIHJldHVybiB0aGUgYWN0dWFsIGZyZXF1ZW5jeSB0dW5lZCB0byAqLwotCWludCAoKnBsbF9zZXQpKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcyk7Ci0KIAkvKiByZXF1ZXN0IGZpcm13YXJlIGZvciBkZXZpY2UgKi8KIAlpbnQgKCpyZXF1ZXN0X2Zpcm13YXJlKShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgY29uc3Qgc3RydWN0IGZpcm13YXJlICoqZncsIGNoYXIqIG5hbWUpOwogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdHYwMjk3LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3R2MDI5Ny5jCmluZGV4IGViMTU2NzYuLjFjYTY0MjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdHYwMjk3LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0djAyOTcuYwpAQCAtMzIsNyArMzIsNiBAQAogCiBzdHJ1Y3Qgc3R2MDI5N19zdGF0ZSB7CiAJc3RydWN0IGkyY19hZGFwdGVyICppMmM7Ci0Jc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMgb3BzOwogCWNvbnN0IHN0cnVjdCBzdHYwMjk3X2NvbmZpZyAqY29uZmlnOwogCXN0cnVjdCBkdmJfZnJvbnRlbmQgZnJvbnRlbmQ7CiAKQEAgLTY4LDE5ICs2NywyNSBAQAogCWludCByZXQ7CiAJdTggYjBbXSA9IHsgcmVnIH07CiAJdTggYjFbXSA9IHsgMCB9OwotCXN0cnVjdCBpMmNfbXNnIG1zZ1tdID0geyB7LmFkZHIgPSBzdGF0ZS0+Y29uZmlnLT5kZW1vZF9hZGRyZXNzLC5mbGFncyA9IDAsLmJ1ZiA9IGIwLC5sZW4gPQotCQkJCSAgMX0sCi0Jey5hZGRyID0gc3RhdGUtPmNvbmZpZy0+ZGVtb2RfYWRkcmVzcywuZmxhZ3MgPSBJMkNfTV9SRCwuYnVmID0gYjEsLmxlbiA9IDF9Ci0JfTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2dbXSA9IHsgey5hZGRyID0gc3RhdGUtPmNvbmZpZy0+ZGVtb2RfYWRkcmVzcywuZmxhZ3MgPSAwLC5idWYgPSBiMCwubGVuID0gMX0sCisJCQkJIHsuYWRkciA9IHN0YXRlLT5jb25maWctPmRlbW9kX2FkZHJlc3MsLmZsYWdzID0gSTJDX01fUkQsLmJ1ZiA9IGIxLC5sZW4gPSAxfQorCQkJICAgICAgIH07CiAKIAkvLyB0aGlzIGRldmljZSBuZWVkcyBhIFNUT1AgYmV0d2VlbiB0aGUgcmVnaXN0ZXIgYW5kIGRhdGEKLQlpZiAoKHJldCA9IGkyY190cmFuc2ZlcihzdGF0ZS0+aTJjLCAmbXNnWzBdLCAxKSkgIT0gMSkgewotCQlkcHJpbnRrKCIlczogcmVhZHJlZyBlcnJvciAocmVnID09IDB4JTAyeCwgcmV0ID09ICVpKVxuIiwgX19GVU5DVElPTl9fLCByZWcsIHJldCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKChyZXQgPSBpMmNfdHJhbnNmZXIoc3RhdGUtPmkyYywgJm1zZ1sxXSwgMSkpICE9IDEpIHsKLQkJZHByaW50aygiJXM6IHJlYWRyZWcgZXJyb3IgKHJlZyA9PSAweCUwMngsIHJldCA9PSAlaSlcbiIsIF9fRlVOQ1RJT05fXywgcmVnLCByZXQpOwotCQlyZXR1cm4gLTE7CisJaWYgKHN0YXRlLT5jb25maWctPnN0b3BfZHVyaW5nX3JlYWQpIHsKKwkJaWYgKChyZXQgPSBpMmNfdHJhbnNmZXIoc3RhdGUtPmkyYywgJm1zZ1swXSwgMSkpICE9IDEpIHsKKwkJCWRwcmludGsoIiVzOiByZWFkcmVnIGVycm9yIChyZWcgPT0gMHglMDJ4LCByZXQgPT0gJWkpXG4iLCBfX0ZVTkNUSU9OX18sIHJlZywgcmV0KTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlpZiAoKHJldCA9IGkyY190cmFuc2ZlcihzdGF0ZS0+aTJjLCAmbXNnWzFdLCAxKSkgIT0gMSkgeworCQkJZHByaW50aygiJXM6IHJlYWRyZWcgZXJyb3IgKHJlZyA9PSAweCUwMngsIHJldCA9PSAlaSlcbiIsIF9fRlVOQ1RJT05fXywgcmVnLCByZXQpOworCQkJcmV0dXJuIC0xOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKChyZXQgPSBpMmNfdHJhbnNmZXIoc3RhdGUtPmkyYywgbXNnLCAyKSkgIT0gMikgeworCQkJZHByaW50aygiJXM6IHJlYWRyZWcgZXJyb3IgKHJlZyA9PSAweCUwMngsIHJldCA9PSAlaSlcbiIsIF9fRlVOQ1RJT05fXywgcmVnLCByZXQpOworCQkJcmV0dXJuIC0xOworCQl9CiAJfQogCiAJcmV0dXJuIGIxWzBdOwpAQCAtMTA3LDEzICsxMTIsMjAgQEAKIAl9OwogCiAJLy8gdGhpcyBkZXZpY2UgbmVlZHMgYSBTVE9QIGJldHdlZW4gdGhlIHJlZ2lzdGVyIGFuZCBkYXRhCi0JaWYgKChyZXQgPSBpMmNfdHJhbnNmZXIoc3RhdGUtPmkyYywgJm1zZ1swXSwgMSkpICE9IDEpIHsKLQkJZHByaW50aygiJXM6IHJlYWRyZWcgZXJyb3IgKHJlZyA9PSAweCUwMngsIHJldCA9PSAlaSlcbiIsIF9fRlVOQ1RJT05fXywgcmVnMSwgcmV0KTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoKHJldCA9IGkyY190cmFuc2ZlcihzdGF0ZS0+aTJjLCAmbXNnWzFdLCAxKSkgIT0gMSkgewotCQlkcHJpbnRrKCIlczogcmVhZHJlZyBlcnJvciAocmVnID09IDB4JTAyeCwgcmV0ID09ICVpKVxuIiwgX19GVU5DVElPTl9fLCByZWcxLCByZXQpOwotCQlyZXR1cm4gLTE7CisJaWYgKHN0YXRlLT5jb25maWctPnN0b3BfZHVyaW5nX3JlYWQpIHsKKwkJaWYgKChyZXQgPSBpMmNfdHJhbnNmZXIoc3RhdGUtPmkyYywgJm1zZ1swXSwgMSkpICE9IDEpIHsKKwkJCWRwcmludGsoIiVzOiByZWFkcmVnIGVycm9yIChyZWcgPT0gMHglMDJ4LCByZXQgPT0gJWkpXG4iLCBfX0ZVTkNUSU9OX18sIHJlZzEsIHJldCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJaWYgKChyZXQgPSBpMmNfdHJhbnNmZXIoc3RhdGUtPmkyYywgJm1zZ1sxXSwgMSkpICE9IDEpIHsKKwkJCWRwcmludGsoIiVzOiByZWFkcmVnIGVycm9yIChyZWcgPT0gMHglMDJ4LCByZXQgPT0gJWkpXG4iLCBfX0ZVTkNUSU9OX18sIHJlZzEsIHJldCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoKHJldCA9IGkyY190cmFuc2ZlcihzdGF0ZS0+aTJjLCBtc2csIDIpKSAhPSAyKSB7CisJCQlkcHJpbnRrKCIlczogcmVhZHJlZyBlcnJvciAocmVnID09IDB4JTAyeCwgcmV0ID09ICVpKVxuIiwgX19GVU5DVElPTl9fLCByZWcxLCByZXQpOworCQkJcmV0dXJuIC0xOworCQl9CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0yNzYsMTIgKzI4OCwxNCBAQAogCXJldHVybiAwOwogfQogCi1pbnQgc3R2MDI5N19lbmFibGVfcGxsaTJjKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQorc3RhdGljIGludCBzdHYwMjk3X2kyY19nYXRlX2N0cmwoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIGludCBlbmFibGUpCiB7CiAJc3RydWN0IHN0djAyOTdfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAKLQlzdHYwMjk3X3dyaXRlcmVnKHN0YXRlLCAweDg3LCAweDc4KTsKLQlzdHYwMjk3X3dyaXRlcmVnKHN0YXRlLCAweDg2LCAweGM4KTsKKwlpZiAoZW5hYmxlKSB7CisJCXN0djAyOTdfd3JpdGVyZWcoc3RhdGUsIDB4ODcsIDB4NzgpOworCQlzdHYwMjk3X3dyaXRlcmVnKHN0YXRlLCAweDg2LCAweGM4KTsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTI5Niw5ICszMTAsNiBAQAogCQlzdHYwMjk3X3dyaXRlcmVnKHN0YXRlLCBzdGF0ZS0+Y29uZmlnLT5pbml0dGFiW2ldLCBzdGF0ZS0+Y29uZmlnLT5pbml0dGFiW2krMV0pOwogCW1zbGVlcCgyMDApOwogCi0JaWYgKHN0YXRlLT5jb25maWctPnBsbF9pbml0KQotCQlzdGF0ZS0+Y29uZmlnLT5wbGxfaW5pdChmZSk7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMzg5LDcgKzQwMCw3IEBACiAJY2FzZSBRQU1fMzI6CiAJY2FzZSBRQU1fNjQ6CiAJCWRlbGF5ID0gMTAwOwotCQlzd2VlcHJhdGUgPSAxNTAwOworCQlzd2VlcHJhdGUgPSAxMDAwOwogCQlicmVhazsKIAogCWNhc2UgUUFNXzEyODoKQEAgLTQyMSw3ICs0MzIsMTAgQEAKIAl9CiAKIAlzdHYwMjk3X2luaXQoZmUpOwotCXN0YXRlLT5jb25maWctPnBsbF9zZXQoZmUsIHApOworCWlmIChmZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zKSB7CisJCWZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMoZmUsIHApOworCQlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKSBmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDApOworCX0KIAogCS8qIGNsZWFyIHNvZnR3YXJlIGludGVycnVwdHMgKi8KIAlzdHYwMjk3X3dyaXRlcmVnKHN0YXRlLCAweDgyLCAweDApOwpAQCAtNjM0LDcgKzY0OCw2IEBACiAJLyogc2V0dXAgdGhlIHN0YXRlICovCiAJc3RhdGUtPmNvbmZpZyA9IGNvbmZpZzsKIAlzdGF0ZS0+aTJjID0gaTJjOwotCW1lbWNweSgmc3RhdGUtPm9wcywgJnN0djAyOTdfb3BzLCBzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMpKTsKIAlzdGF0ZS0+YmFzZV9mcmVxID0gMDsKIAogCS8qIGNoZWNrIGlmIHRoZSBkZW1vZCBpcyB0aGVyZSAqLwpAQCAtNjQyLDcgKzY1NSw3IEBACiAJCWdvdG8gZXJyb3I7CiAKIAkvKiBjcmVhdGUgZHZiX2Zyb250ZW5kICovCi0Jc3RhdGUtPmZyb250ZW5kLm9wcyA9ICZzdGF0ZS0+b3BzOworCW1lbWNweSgmc3RhdGUtPmZyb250ZW5kLm9wcywgJnN0djAyOTdfb3BzLCBzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMpKTsKIAlzdGF0ZS0+ZnJvbnRlbmQuZGVtb2R1bGF0b3JfcHJpdiA9IHN0YXRlOwogCXJldHVybiAmc3RhdGUtPmZyb250ZW5kOwogCkBAIC02NjgsNiArNjgxLDcgQEAKIAogCS5pbml0ID0gc3R2MDI5N19pbml0LAogCS5zbGVlcCA9IHN0djAyOTdfc2xlZXAsCisJLmkyY19nYXRlX2N0cmwgPSBzdHYwMjk3X2kyY19nYXRlX2N0cmwsCiAKIAkuc2V0X2Zyb250ZW5kID0gc3R2MDI5N19zZXRfZnJvbnRlbmQsCiAJLmdldF9mcm9udGVuZCA9IHN0djAyOTdfZ2V0X2Zyb250ZW5kLApAQCAtNjg0LDQgKzY5OCwzIEBACiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKIEVYUE9SVF9TWU1CT0woc3R2MDI5N19hdHRhY2gpOwotRVhQT1JUX1NZTUJPTChzdHYwMjk3X2VuYWJsZV9wbGxpMmMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0djAyOTcuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdHYwMjk3LmgKaW5kZXggOWU1M2YwMS4uMWRhNTM4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0djAyOTcuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3R2MDI5Ny5oCkBAIC0zOCwxMyArMzgsMTEgQEAKIAkvKiBkb2VzIHRoZSAiaW52ZXJzaW9uIiBuZWVkIGludmVydGVkPyAqLwogCXU4IGludmVydDoxOwogCi0JLyogUExMIG1haW50ZW5hbmNlICovCi0JaW50ICgqcGxsX2luaXQpKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKTsKLQlpbnQgKCpwbGxfc2V0KShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMpOworCS8qIHNldCB0byAxIGlmIHRoZSBkZXZpY2UgcmVxdWlyZXMgYW4gaTJjIFNUT1AgZHVyaW5nIHJlYWRpbmcgKi8KKwl1OCBzdG9wX2R1cmluZ19yZWFkOjE7CiB9OwogCiBleHRlcm4gc3RydWN0IGR2Yl9mcm9udGVuZCogc3R2MDI5N19hdHRhY2goY29uc3Qgc3RydWN0IHN0djAyOTdfY29uZmlnKiBjb25maWcsCiAJCQkJCSAgIHN0cnVjdCBpMmNfYWRhcHRlciogaTJjKTsKLWV4dGVybiBpbnQgc3R2MDI5N19lbmFibGVfcGxsaTJjKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKTsKIAogI2VuZGlmIC8vIFNUVjAyOTdfSApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0djAyOTkuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdHYwMjk5LmMKaW5kZXggNWJjZDAwZi4uOTY2NDhhNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0djAyOTkuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3R2MDI5OS5jCkBAIC01Niw3ICs1Niw2IEBACiAKIHN0cnVjdCBzdHYwMjk5X3N0YXRlIHsKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIqIGkyYzsKLQlzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyBvcHM7CiAJY29uc3Qgc3RydWN0IHN0djAyOTlfY29uZmlnKiBjb25maWc7CiAJc3RydWN0IGR2Yl9mcm9udGVuZCBmcm9udGVuZDsKIApAQCAtMTMxLDEzICsxMzAsNiBAQAogCXJldHVybiByZXQgPT0gMiA/IDAgOiByZXQ7CiB9CiAKLWludCBzdHYwMjk5X2VuYWJsZV9wbGxpMmMgKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKQotewotCXN0cnVjdCBzdHYwMjk5X3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwotCi0JcmV0dXJuIHN0djAyOTlfd3JpdGVyZWdJKHN0YXRlLCAweDA1LCAweGI1KTsJLyogIGVuYWJsZSBpMmMgcmVwZWF0ZXIgb24gc3R2MDI5OSAgKi8KLX0KLQogc3RhdGljIGludCBzdHYwMjk5X3NldF9GRUMgKHN0cnVjdCBzdHYwMjk5X3N0YXRlKiBzdGF0ZSwgZmVfY29kZV9yYXRlX3QgZmVjKQogewogCWRwcmludGsgKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKQEAgLTQ1NywxMiArNDQ5LDYgQEAKIAlmb3IgKGk9MDsgIShzdGF0ZS0+Y29uZmlnLT5pbml0dGFiW2ldID09IDB4ZmYgJiYgc3RhdGUtPmNvbmZpZy0+aW5pdHRhYltpKzFdID09IDB4ZmYpOyBpKz0yKQogCQlzdHYwMjk5X3dyaXRlcmVnSShzdGF0ZSwgc3RhdGUtPmNvbmZpZy0+aW5pdHRhYltpXSwgc3RhdGUtPmNvbmZpZy0+aW5pdHRhYltpKzFdKTsKIAotCWlmIChzdGF0ZS0+Y29uZmlnLT5wbGxfaW5pdCkgewotCQlzdHYwMjk5X3dyaXRlcmVnSShzdGF0ZSwgMHgwNSwgMHhiNSk7CS8qICBlbmFibGUgaTJjIHJlcGVhdGVyIG9uIHN0djAyOTkgICovCi0JCXN0YXRlLT5jb25maWctPnBsbF9pbml0KGZlLCBzdGF0ZS0+aTJjKTsKLQkJc3R2MDI5OV93cml0ZXJlZ0koc3RhdGUsIDB4MDUsIDB4MzUpOwkvKiAgZGlzYWJsZSBpMmMgcmVwZWF0ZXIgb24gc3R2MDI5OSAgKi8KLQl9Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtNTYwLDkgKzU0NiwxMCBAQAogCWlmIChzdGF0ZS0+Y29uZmlnLT5pbnZlcnQpIGludnZhbCA9ICh+aW52dmFsKSAmIDE7CiAJc3R2MDI5OV93cml0ZXJlZ0koc3RhdGUsIDB4MGMsIChzdHYwMjk5X3JlYWRyZWcoc3RhdGUsIDB4MGMpICYgMHhmZSkgfCBpbnZ2YWwpOwogCi0Jc3R2MDI5OV93cml0ZXJlZ0koc3RhdGUsIDB4MDUsIDB4YjUpOwkvKiAgZW5hYmxlIGkyYyByZXBlYXRlciBvbiBzdHYwMjk5ICAqLwotCXN0YXRlLT5jb25maWctPnBsbF9zZXQoZmUsIHN0YXRlLT5pMmMsIHApOwotCXN0djAyOTlfd3JpdGVyZWdJKHN0YXRlLCAweDA1LCAweDM1KTsJLyogIGRpc2FibGUgaTJjIHJlcGVhdGVyIG9uIHN0djAyOTkgICovCisJaWYgKGZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMpIHsKKwkJZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyhmZSwgcCk7CisJCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpIGZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMCk7CisJfQogCiAJc3R2MDI5OV9zZXRfRkVDIChzdGF0ZSwgcC0+dS5xcHNrLmZlY19pbm5lcik7CiAJc3R2MDI5OV9zZXRfc3ltYm9scmF0ZSAoZmUsIHAtPnUucXBzay5zeW1ib2xfcmF0ZSk7CkBAIC02MTEsNiArNTk4LDE5IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgc3R2MDI5OV9pMmNfZ2F0ZV9jdHJsKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBpbnQgZW5hYmxlKQoreworCXN0cnVjdCBzdHYwMjk5X3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCisJaWYgKGVuYWJsZSkgeworCQlzdHYwMjk5X3dyaXRlcmVnSShzdGF0ZSwgMHgwNSwgMHhiNSk7CisJfSBlbHNlIHsKKwkJc3R2MDI5OV93cml0ZXJlZ0koc3RhdGUsIDB4MDUsIDB4MzUpOworCX0KKwl1ZGVsYXkoMSk7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgc3R2MDI5OV9nZXRfdHVuZV9zZXR0aW5ncyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF90dW5lX3NldHRpbmdzKiBmZXNldHRpbmdzKQogewogCXN0cnVjdCBzdHYwMjk5X3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwpAQCAtNjQ3LDcgKzY0Nyw2IEBACiAJLyogc2V0dXAgdGhlIHN0YXRlICovCiAJc3RhdGUtPmNvbmZpZyA9IGNvbmZpZzsKIAlzdGF0ZS0+aTJjID0gaTJjOwotCW1lbWNweSgmc3RhdGUtPm9wcywgJnN0djAyOTlfb3BzLCBzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMpKTsKIAlzdGF0ZS0+aW5pdGlhbGlzZWQgPSAwOwogCXN0YXRlLT50dW5lcl9mcmVxdWVuY3kgPSAwOwogCXN0YXRlLT5zeW1ib2xfcmF0ZSA9IDA7CkBAIC02NjQsNyArNjYzLDcgQEAKIAlpZiAoaWQgIT0gMHhhMSAmJiBpZCAhPSAweDgwKSBnb3RvIGVycm9yOwogCiAJLyogY3JlYXRlIGR2Yl9mcm9udGVuZCAqLwotCXN0YXRlLT5mcm9udGVuZC5vcHMgPSAmc3RhdGUtPm9wczsKKwltZW1jcHkoJnN0YXRlLT5mcm9udGVuZC5vcHMsICZzdHYwMjk5X29wcywgc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzKSk7CiAJc3RhdGUtPmZyb250ZW5kLmRlbW9kdWxhdG9yX3ByaXYgPSBzdGF0ZTsKIAlyZXR1cm4gJnN0YXRlLT5mcm9udGVuZDsKIApAQCAtNjk1LDYgKzY5NCw3IEBACiAKIAkuaW5pdCA9IHN0djAyOTlfaW5pdCwKIAkuc2xlZXAgPSBzdHYwMjk5X3NsZWVwLAorCS5pMmNfZ2F0ZV9jdHJsID0gc3R2MDI5OV9pMmNfZ2F0ZV9jdHJsLAogCiAJLnNldF9mcm9udGVuZCA9IHN0djAyOTlfc2V0X2Zyb250ZW5kLAogCS5nZXRfZnJvbnRlbmQgPSBzdHYwMjk5X2dldF9mcm9udGVuZCwKQEAgLTcyMSw5ICs3MjEsOCBAQAogCiBNT0RVTEVfREVTQ1JJUFRJT04oIlNUIFNUVjAyOTkgRFZCIERlbW9kdWxhdG9yIGRyaXZlciIpOwogTU9EVUxFX0FVVEhPUigiUmFscGggTWV0emxlciwgSG9sZ2VyIFdhZWNodGxlciwgUGV0ZXIgU2NoaWxkbWFubiwgRmVsaXggRG9ta2UsICIKLQkgICAgICAiQW5kcmVhcyBPYmVycml0dGVyLCBBbmRyZXcgZGUgUXVpbmNleSwgS2VubmV0aCBBYWZs+HkiKTsKKwkgICAgICAiQW5kcmVhcyBPYmVycml0dGVyLCBBbmRyZXcgZGUgUXVpbmNleSwgS2VubmV0aCBBYWZseSIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCi1FWFBPUlRfU1lNQk9MKHN0djAyOTlfZW5hYmxlX3BsbGkyYyk7CiBFWFBPUlRfU1lNQk9MKHN0djAyOTlfd3JpdGVyZWcpOwogRVhQT1JUX1NZTUJPTChzdHYwMjk5X2F0dGFjaCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3R2MDI5OS5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0djAyOTkuaAppbmRleCAzMmM4N2I0Li4xNTA0ODI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3R2MDI5OS5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdHYwMjk5LmgKQEAgLTg3LDE0ICs4Nyw5IEBACiAKIAkvKiBTZXQgdGhlIHN5bWJvbCByYXRlICovCiAJaW50ICgqc2V0X3N5bWJvbF9yYXRlKShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTMyIHNyYXRlLCB1MzIgcmF0aW8pOwotCi0JLyogUExMIG1haW50ZW5hbmNlICovCi0JaW50ICgqcGxsX2luaXQpKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYyk7Ci0JaW50ICgqcGxsX3NldCkoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnBhcmFtcyk7CiB9OwogCiBleHRlcm4gaW50IHN0djAyOTlfd3JpdGVyZWcgKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCB1OCByZWcsIHU4IGRhdGEpOwotZXh0ZXJuIGludCBzdHYwMjk5X2VuYWJsZV9wbGxpMmMgKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKTsKIAogZXh0ZXJuIHN0cnVjdCBkdmJfZnJvbnRlbmQqIHN0djAyOTlfYXR0YWNoKGNvbnN0IHN0cnVjdCBzdHYwMjk5X2NvbmZpZyogY29uZmlnLAogCQkJCQkgICBzdHJ1Y3QgaTJjX2FkYXB0ZXIqIGkyYyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhMTAwMjEuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGExMDAyMS5jCmluZGV4IDIxMjU1Y2EuLmU4M2ZmMjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGExMDAyMS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGExMDAyMS5jCkBAIC0zNiw3ICszNiw2IEBACiAKIHN0cnVjdCB0ZGExMDAyMV9zdGF0ZSB7CiAJc3RydWN0IGkyY19hZGFwdGVyKiBpMmM7Ci0Jc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMgb3BzOwogCS8qIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgKi8KIAljb25zdCBzdHJ1Y3QgdGRhMTAwMjFfY29uZmlnKiBjb25maWc7CiAJc3RydWN0IGR2Yl9mcm9udGVuZCBmcm9udGVuZDsKQEAgLTkwLDYgKzg5LDE0IEBACiAJcmV0dXJuIChyZXQgIT0gMSkgPyAtRVJFTU9URUlPIDogMDsKIH0KIAoraW50IHRkYTEwMDIxX3dyaXRlX2J5dGUoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGludCByZWcsIGludCBkYXRhKQoreworCXN0cnVjdCB0ZGExMDAyMV9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKworCXJldHVybiB0ZGExMDAyMV93cml0ZXJlZyhzdGF0ZSwgcmVnLCBkYXRhKTsKK30KK0VYUE9SVF9TWU1CT0wodGRhMTAwMjFfd3JpdGVfYnl0ZSk7CisKIHN0YXRpYyB1OCB0ZGExMDAyMV9yZWFkcmVnIChzdHJ1Y3QgdGRhMTAwMjFfc3RhdGUqIHN0YXRlLCB1OCByZWcpCiB7CiAJdTggYjAgW10gPSB7IHJlZyB9OwpAQCAtMjI1LDEzICsyMzIsNiBAQAogCiAJLy9BY3RpdmF0ZSBQTEwKIAl0ZGExMDAyMV93cml0ZXJlZyhzdGF0ZSwgMHgyYSwgdGRhMTAwMjFfaW5pdHRhYlsweDJhXSAmIDB4ZWYpOwotCi0JaWYgKHN0YXRlLT5jb25maWctPnBsbF9pbml0KSB7Ci0JCWxvY2tfdHVuZXIoc3RhdGUpOwotCQlzdGF0ZS0+Y29uZmlnLT5wbGxfaW5pdChmZSk7Ci0JCXVubG9ja190dW5lcihzdGF0ZSk7Ci0JfQotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI1OSw5ICsyNTksMTAgQEAKIAogCS8vcHJpbnRrKCJ0ZGExMDAyMTogc2V0IGZyZXF1ZW5jeSB0byAlZCBxYW09JWQgc3ltcmF0ZT0lZFxuIiwgcC0+ZnJlcXVlbmN5LHFhbSxwLT51LnFhbS5zeW1ib2xfcmF0ZSk7CiAKLQlsb2NrX3R1bmVyKHN0YXRlKTsKLQlzdGF0ZS0+Y29uZmlnLT5wbGxfc2V0KGZlLCBwKTsKLQl1bmxvY2tfdHVuZXIoc3RhdGUpOworCWlmIChmZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zKSB7CisJCWZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMoZmUsIHApOworCQlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKSBmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDApOworCX0KIAogCXRkYTEwMDIxX3NldF9zeW1ib2xyYXRlIChzdGF0ZSwgcC0+dS5xYW0uc3ltYm9sX3JhdGUpOwogCXRkYTEwMDIxX3dyaXRlcmVnIChzdGF0ZSwgMHgzNCwgc3RhdGUtPnB3bSk7CkBAIC0zNzYsNiArMzc3LDE4IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgdGRhMTAwMjFfaTJjX2dhdGVfY3RybChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgaW50IGVuYWJsZSkKK3sKKwlzdHJ1Y3QgdGRhMTAwMjFfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisKKwlpZiAoZW5hYmxlKSB7CisJCWxvY2tfdHVuZXIoc3RhdGUpOworCX0gZWxzZSB7CisJCXVubG9ja190dW5lcihzdGF0ZSk7CisJfQorCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IHRkYTEwMDIxX3NsZWVwKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKQogewogCXN0cnVjdCB0ZGExMDAyMV9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKQEAgLTQwNyw3ICs0MjAsNiBAQAogCS8qIHNldHVwIHRoZSBzdGF0ZSAqLwogCXN0YXRlLT5jb25maWcgPSBjb25maWc7CiAJc3RhdGUtPmkyYyA9IGkyYzsKLQltZW1jcHkoJnN0YXRlLT5vcHMsICZ0ZGExMDAyMV9vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOwogCXN0YXRlLT5wd20gPSBwd207CiAJc3RhdGUtPnJlZzAgPSB0ZGExMDAyMV9pbml0dGFiWzBdOwogCkBAIC00MTUsNyArNDI3LDcgQEAKIAlpZiAoKHRkYTEwMDIxX3JlYWRyZWcoc3RhdGUsIDB4MWEpICYgMHhmMCkgIT0gMHg3MCkgZ290byBlcnJvcjsKIAogCS8qIGNyZWF0ZSBkdmJfZnJvbnRlbmQgKi8KLQlzdGF0ZS0+ZnJvbnRlbmQub3BzID0gJnN0YXRlLT5vcHM7CisJbWVtY3B5KCZzdGF0ZS0+ZnJvbnRlbmQub3BzLCAmdGRhMTAwMjFfb3BzLCBzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMpKTsKIAlzdGF0ZS0+ZnJvbnRlbmQuZGVtb2R1bGF0b3JfcHJpdiA9IHN0YXRlOwogCXJldHVybiAmc3RhdGUtPmZyb250ZW5kOwogCkBAIC00NDgsNiArNDYwLDcgQEAKIAogCS5pbml0ID0gdGRhMTAwMjFfaW5pdCwKIAkuc2xlZXAgPSB0ZGExMDAyMV9zbGVlcCwKKwkuaTJjX2dhdGVfY3RybCA9IHRkYTEwMDIxX2kyY19nYXRlX2N0cmwsCiAKIAkuc2V0X2Zyb250ZW5kID0gdGRhMTAwMjFfc2V0X3BhcmFtZXRlcnMsCiAJLmdldF9mcm9udGVuZCA9IHRkYTEwMDIxX2dldF9mcm9udGVuZCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGExMDAyMS5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTEwMDIxLmgKaW5kZXggNTNiZTkzOS4uYjFkZjQyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTEwMDIxLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTEwMDIxLmgKQEAgLTMwLDEzICszMCwxMSBAQAogewogCS8qIHRoZSBkZW1vZHVsYXRvcidzIGkyYyBhZGRyZXNzICovCiAJdTggZGVtb2RfYWRkcmVzczsKLQotCS8qIFBMTCBtYWludGVuYW5jZSAqLwotCWludCAoKnBsbF9pbml0KShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSk7Ci0JaW50ICgqcGxsX3NldCkoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyogcGFyYW1zKTsKIH07CiAKIGV4dGVybiBzdHJ1Y3QgZHZiX2Zyb250ZW5kKiB0ZGExMDAyMV9hdHRhY2goY29uc3Qgc3RydWN0IHRkYTEwMDIxX2NvbmZpZyogY29uZmlnLAogCQkJCQkgICAgc3RydWN0IGkyY19hZGFwdGVyKiBpMmMsIHU4IHB3bSk7CiAKK2V4dGVybiBpbnQgdGRhMTAwMjFfd3JpdGVfYnl0ZShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgaW50IHJlZywgaW50IGRhdGEpOworCiAjZW5kaWYgLy8gVERBMTAwMjFfSApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTEwMDR4LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhMTAwNHguYwppbmRleCBiODNkYWZhLi41OWEyZWQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhMTAwNHguYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhMTAwNHguYwpAQCAtNDcsNyArNDcsNiBAQAogCiBzdHJ1Y3QgdGRhMTAwNHhfc3RhdGUgewogCXN0cnVjdCBpMmNfYWRhcHRlciogaTJjOwotCXN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzIG9wczsKIAljb25zdCBzdHJ1Y3QgdGRhMTAwNHhfY29uZmlnKiBjb25maWc7CiAJc3RydWN0IGR2Yl9mcm9udGVuZCBmcm9udGVuZDsKIApAQCAtNjAwLDEzICs1OTksNiBAQAogCiAJdGRhMTAwNHhfd3JpdGVfbWFzayhzdGF0ZSwgVERBMTAwNFhfQ09ORkFEQzEsIDB4MTAsIDApOyAvLyB3YWtlIHVwIHRoZSBBREMKIAotCS8vIEluaXQgdGhlIFBMTAotCWlmIChzdGF0ZS0+Y29uZmlnLT5wbGxfaW5pdCkgewotCQl0ZGExMDA0eF9lbmFibGVfdHVuZXJfaTJjKHN0YXRlKTsKLQkJc3RhdGUtPmNvbmZpZy0+cGxsX2luaXQoZmUpOwotCQl0ZGExMDA0eF9kaXNhYmxlX3R1bmVyX2kyYyhzdGF0ZSk7Ci0JfQotCiAJLy8gdGRhIHNldHVwCiAJdGRhMTAwNHhfd3JpdGVfbWFzayhzdGF0ZSwgVERBMTAwNFhfQ09ORkM0LCAweDIwLCAwKTsgLy8gZGlzYWJsZSBEU1Agd2F0Y2hkb2cgdGltZXIKIAl0ZGExMDA0eF93cml0ZV9tYXNrKHN0YXRlLCBUREExMDA0WF9BVVRPLCA4LCAwKTsgLy8gc2VsZWN0IEhQIHN0cmVhbQpAQCAtNjM1LDE2ICs2MjcsNiBAQAogCQkJcmV0dXJuIC1FSU87CiAJfQogCi0JLy8gSW5pdCB0aGUgdHVuZXIgUExMCi0JaWYgKHN0YXRlLT5jb25maWctPnBsbF9pbml0KSB7Ci0JCXRkYTEwMDR4X2VuYWJsZV90dW5lcl9pMmMoc3RhdGUpOwotCQlpZiAoc3RhdGUtPmNvbmZpZy0+cGxsX2luaXQoZmUpKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgInRkYTEwMDR4OiBwbGwgaW5pdCBmYWlsZWRcbiIpOwotCQkJcmV0dXJuIAktRUlPOwotCQl9Ci0JCXRkYTEwMDR4X2Rpc2FibGVfdHVuZXJfaTJjKHN0YXRlKTsKLQl9Ci0KIAkvLyB0ZGEgc2V0dXAKIAl0ZGExMDA0eF93cml0ZV9tYXNrKHN0YXRlLCBUREExMDA0WF9DT05GQzQsIDB4MjAsIDApOyAvLyBkaXNhYmxlIERTUCB3YXRjaGRvZyB0aW1lcgogCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0WF9BVVRPLCAweDg3KTsgICAgLy8gMTAwIHBwbSBjcnlzdGFsLCBzZWxlY3QgSFAgc3RyZWFtCkBAIC03MTIsMTIgKzY5NCwxMCBAQAogCX0KIAogCS8vIHNldCBmcmVxdWVuY3kKLQl0ZGExMDA0eF9lbmFibGVfdHVuZXJfaTJjKHN0YXRlKTsKLQlpZiAoc3RhdGUtPmNvbmZpZy0+cGxsX3NldChmZSwgZmVfcGFyYW1zKSkgewotCQlwcmludGsoS0VSTl9FUlIgInRkYTEwMDR4OiBwbGwgc2V0IGZhaWxlZFxuIik7Ci0JCXJldHVybiAJLUVJTzsKKwlpZiAoZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcykgeworCQlmZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zKGZlLCBmZV9wYXJhbXMpOworCQlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKSBmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDApOwogCX0KLQl0ZGExMDA0eF9kaXNhYmxlX3R1bmVyX2kyYyhzdGF0ZSk7CiAKIAkvLyBIYXJkY29kZWQgdG8gdXNlIGF1dG8gYXMgbXVjaCBhcyBwb3NzaWJsZSBvbiB0aGUgVERBMTAwNDUgYXMgaXQKIAkvLyBpcyB2ZXJ5IHVucmVsaWFibGUgaWYgQVVUTyBtb2RlIGlzIF9ub3RfIHVzZWQuCkBAIC0xMTgzLDE2ICsxMTYzLDYgQEAKIAkJYnJlYWs7CiAKIAljYXNlIFREQTEwMDRYX0RFTU9EX1REQTEwMDQ2OgotCQlpZiAoc3RhdGUtPmNvbmZpZy0+cGxsX3NsZWVwICE9IE5VTEwpIHsKLQkJCXRkYTEwMDR4X2VuYWJsZV90dW5lcl9pMmMoc3RhdGUpOwotCQkJc3RhdGUtPmNvbmZpZy0+cGxsX3NsZWVwKGZlKTsKLQkJCWlmIChzdGF0ZS0+Y29uZmlnLT5pZl9mcmVxICE9IFREQTEwMDQ2X0ZSRVFfMDUyKSB7Ci0JCQkJLyogc3BlY2lhbCBoYWNrIGZvciBQaGlsaXBzIEVVUk9QQSBCYXNlZCBib2FyZHM6Ci0JCQkJICoga2VlcCB0aGUgSTJjIGJyaWRnZSBvcGVuIGZvciB0dW5lciBhY2Nlc3MgaW4gYW5hbG9nIG1vZGUKLQkJCQkgKi8KLQkJCQl0ZGExMDA0eF9kaXNhYmxlX3R1bmVyX2kyYyhzdGF0ZSk7Ci0JCQl9Ci0JCX0KIAkJLyogc2V0IG91dHB1dHMgdG8gdHJpc3RhdGUgKi8KIAkJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9DT05GX1RSSVNUQVRFMSwgMHhmZik7CiAJCXRkYTEwMDR4X3dyaXRlX21hc2soc3RhdGUsIFREQTEwMDRYX0NPTkZDNCwgMSwgMSk7CkBAIC0xMjAyLDYgKzExNzIsMTcgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCB0ZGExMDA0eF9pMmNfZ2F0ZV9jdHJsKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBpbnQgZW5hYmxlKQoreworCXN0cnVjdCB0ZGExMDA0eF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKworCWlmIChlbmFibGUpIHsKKwkJcmV0dXJuIHRkYTEwMDR4X2VuYWJsZV90dW5lcl9pMmMoc3RhdGUpOworCX0gZWxzZSB7CisJCXJldHVybiB0ZGExMDA0eF9kaXNhYmxlX3R1bmVyX2kyYyhzdGF0ZSk7CisJfQorfQorCiBzdGF0aWMgaW50IHRkYTEwMDR4X2dldF90dW5lX3NldHRpbmdzKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3R1bmVfc2V0dGluZ3MqIGZlc2V0dGluZ3MpCiB7CiAJZmVzZXR0aW5ncy0+bWluX2RlbGF5X21zID0gODAwOwpAQCAtMTIzNSw2ICsxMjE2LDcgQEAKIAogCS5pbml0ID0gdGRhMTAwNDVfaW5pdCwKIAkuc2xlZXAgPSB0ZGExMDA0eF9zbGVlcCwKKwkuaTJjX2dhdGVfY3RybCA9IHRkYTEwMDR4X2kyY19nYXRlX2N0cmwsCiAKIAkuc2V0X2Zyb250ZW5kID0gdGRhMTAwNHhfc2V0X2ZlLAogCS5nZXRfZnJvbnRlbmQgPSB0ZGExMDA0eF9nZXRfZmUsCkBAIC0xMjYwLDcgKzEyNDIsNiBAQAogCS8qIHNldHVwIHRoZSBzdGF0ZSAqLwogCXN0YXRlLT5jb25maWcgPSBjb25maWc7CiAJc3RhdGUtPmkyYyA9IGkyYzsKLQltZW1jcHkoJnN0YXRlLT5vcHMsICZ0ZGExMDA0NV9vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOwogCXN0YXRlLT5kZW1vZF90eXBlID0gVERBMTAwNFhfREVNT0RfVERBMTAwNDU7CiAKIAkvKiBjaGVjayBpZiB0aGUgZGVtb2QgaXMgdGhlcmUgKi8KQEAgLTEyNzAsNyArMTI1MSw3IEBACiAJfQogCiAJLyogY3JlYXRlIGR2Yl9mcm9udGVuZCAqLwotCXN0YXRlLT5mcm9udGVuZC5vcHMgPSAmc3RhdGUtPm9wczsKKwltZW1jcHkoJnN0YXRlLT5mcm9udGVuZC5vcHMsICZ0ZGExMDA0NV9vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOwogCXN0YXRlLT5mcm9udGVuZC5kZW1vZHVsYXRvcl9wcml2ID0gc3RhdGU7CiAJcmV0dXJuICZzdGF0ZS0+ZnJvbnRlbmQ7CiB9CkBAIC0xMjkzLDYgKzEyNzQsNyBAQAogCiAJLmluaXQgPSB0ZGExMDA0Nl9pbml0LAogCS5zbGVlcCA9IHRkYTEwMDR4X3NsZWVwLAorCS5pMmNfZ2F0ZV9jdHJsID0gdGRhMTAwNHhfaTJjX2dhdGVfY3RybCwKIAogCS5zZXRfZnJvbnRlbmQgPSB0ZGExMDA0eF9zZXRfZmUsCiAJLmdldF9mcm9udGVuZCA9IHRkYTEwMDR4X2dldF9mZSwKQEAgLTEzMTgsNyArMTMwMCw2IEBACiAJLyogc2V0dXAgdGhlIHN0YXRlICovCiAJc3RhdGUtPmNvbmZpZyA9IGNvbmZpZzsKIAlzdGF0ZS0+aTJjID0gaTJjOwotCW1lbWNweSgmc3RhdGUtPm9wcywgJnRkYTEwMDQ2X29wcywgc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzKSk7CiAJc3RhdGUtPmRlbW9kX3R5cGUgPSBUREExMDA0WF9ERU1PRF9UREExMDA0NjsKIAogCS8qIGNoZWNrIGlmIHRoZSBkZW1vZCBpcyB0aGVyZSAqLwpAQCAtMTMyOCw3ICsxMzA5LDcgQEAKIAl9CiAKIAkvKiBjcmVhdGUgZHZiX2Zyb250ZW5kICovCi0Jc3RhdGUtPmZyb250ZW5kLm9wcyA9ICZzdGF0ZS0+b3BzOworCW1lbWNweSgmc3RhdGUtPmZyb250ZW5kLm9wcywgJnRkYTEwMDQ2X29wcywgc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzKSk7CiAJc3RhdGUtPmZyb250ZW5kLmRlbW9kdWxhdG9yX3ByaXYgPSBzdGF0ZTsKIAlyZXR1cm4gJnN0YXRlLT5mcm9udGVuZDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGExMDA0eC5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTEwMDR4LmgKaW5kZXggY2MwYzRhZi4uYjg3N2IyMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTEwMDR4LmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTEwMDR4LmgKQEAgLTY2LDExICs2Niw2IEBACiAJLyogQUdDIGNvbmZpZ3VyYXRpb24gKi8KIAllbnVtIHRkYTEwMDQ2X2FnYyBhZ2NfY29uZmlnOwogCi0JLyogUExMIG1haW50ZW5hbmNlICovCi0JaW50ICgqcGxsX2luaXQpKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKTsKLQl2b2lkICgqcGxsX3NsZWVwKShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSk7Ci0JaW50ICgqcGxsX3NldCkoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyogcGFyYW1zKTsKLQogCS8qIHJlcXVlc3QgZmlybXdhcmUgZm9yIGRldmljZSAqLwogCS8qIHNldCB0aGlzIHRvIE5VTEwgaWYgdGhlIGNhcmQgaGFzIGEgZmlybXdhcmUgRUVQUk9NICovCiAJaW50ICgqcmVxdWVzdF9maXJtd2FyZSkoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqKmZ3LCBjaGFyKiBuYW1lKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGE4MDgzLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhODA4My5jCmluZGV4IDkxYmFhOWMuLjNhYTQ1ZWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGE4MDgzLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTgwODMuYwpAQCAtMzcsNyArMzcsNiBAQAogCiBzdHJ1Y3QgdGRhODA4M19zdGF0ZSB7CiAJc3RydWN0IGkyY19hZGFwdGVyKiBpMmM7Ci0Jc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMgb3BzOwogCS8qIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgKi8KIAljb25zdCBzdHJ1Y3QgdGRhODA4M19jb25maWcqIGNvbmZpZzsKIAlzdHJ1Y3QgZHZiX2Zyb250ZW5kIGZyb250ZW5kOwpAQCAtMjkzLDcgKzI5MiwxMSBAQAogewogCXN0cnVjdCB0ZGE4MDgzX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCi0Jc3RhdGUtPmNvbmZpZy0+cGxsX3NldChmZSwgcCk7CisJaWYgKGZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMpIHsKKwkJZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyhmZSwgcCk7CisJCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpIGZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMCk7CisJfQorCiAJdGRhODA4M19zZXRfaW52ZXJzaW9uIChzdGF0ZSwgcC0+aW52ZXJzaW9uKTsKIAl0ZGE4MDgzX3NldF9mZWMgKHN0YXRlLCBwLT51LnFwc2suZmVjX2lubmVyKTsKIAl0ZGE4MDgzX3NldF9zeW1ib2xyYXRlIChzdGF0ZSwgcC0+dS5xcHNrLnN5bWJvbF9yYXRlKTsKQEAgLTMzNCw4ICszMzcsNiBAQAogCWZvciAoaT0wOyBpPDQ0OyBpKyspCiAJCXRkYTgwODNfd3JpdGVyZWcgKHN0YXRlLCBpLCB0ZGE4MDgzX2luaXRfdGFiW2ldKTsKIAotCWlmIChzdGF0ZS0+Y29uZmlnLT5wbGxfaW5pdCkgc3RhdGUtPmNvbmZpZy0+cGxsX2luaXQoZmUpOwotCiAJdGRhODA4M193cml0ZXJlZyAoc3RhdGUsIDB4MDAsIDB4M2MpOwogCXRkYTgwODNfd3JpdGVyZWcgKHN0YXRlLCAweDAwLCAweDA0KTsKIApAQCAtMzk1LDEzICszOTYsMTIgQEAKIAkvKiBzZXR1cCB0aGUgc3RhdGUgKi8KIAlzdGF0ZS0+Y29uZmlnID0gY29uZmlnOwogCXN0YXRlLT5pMmMgPSBpMmM7Ci0JbWVtY3B5KCZzdGF0ZS0+b3BzLCAmdGRhODA4M19vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOwogCiAJLyogY2hlY2sgaWYgdGhlIGRlbW9kIGlzIHRoZXJlICovCiAJaWYgKCh0ZGE4MDgzX3JlYWRyZWcoc3RhdGUsIDB4MDApKSAhPSAweDA1KSBnb3RvIGVycm9yOwogCiAJLyogY3JlYXRlIGR2Yl9mcm9udGVuZCAqLwotCXN0YXRlLT5mcm9udGVuZC5vcHMgPSAmc3RhdGUtPm9wczsKKwltZW1jcHkoJnN0YXRlLT5mcm9udGVuZC5vcHMsICZ0ZGE4MDgzX29wcywgc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzKSk7CiAJc3RhdGUtPmZyb250ZW5kLmRlbW9kdWxhdG9yX3ByaXYgPSBzdGF0ZTsKIAlyZXR1cm4gJnN0YXRlLT5mcm9udGVuZDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTgwODMuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGE4MDgzLmgKaW5kZXggNDY2NjYzMy4uZTdhNDhmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTgwODMuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhODA4My5oCkBAIC0zMywxMCArMzMsNiBAQAogewogCS8qIHRoZSBkZW1vZHVsYXRvcidzIGkyYyBhZGRyZXNzICovCiAJdTggZGVtb2RfYWRkcmVzczsKLQotCS8qIFBMTCBtYWludGVuYW5jZSAqLwotCWludCAoKnBsbF9pbml0KShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSk7Ci0JaW50ICgqcGxsX3NldCkoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyogcGFyYW1zKTsKIH07CiAKIGV4dGVybiBzdHJ1Y3QgZHZiX2Zyb250ZW5kKiB0ZGE4MDgzX2F0dGFjaChjb25zdCBzdHJ1Y3QgdGRhODA4M19jb25maWcqIGNvbmZpZywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy92ZXMxODIwLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdmVzMTgyMC5jCmluZGV4IGFkODY0N2EzLi42YmZmZTg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdmVzMTgyMC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy92ZXMxODIwLmMKQEAgLTM1LDcgKzM1LDYgQEAKIAogc3RydWN0IHZlczE4MjBfc3RhdGUgewogCXN0cnVjdCBpMmNfYWRhcHRlciogaTJjOwotCXN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzIG9wczsKIAkvKiBjb25maWd1cmF0aW9uIHNldHRpbmdzICovCiAJY29uc3Qgc3RydWN0IHZlczE4MjBfY29uZmlnKiBjb25maWc7CiAJc3RydWN0IGR2Yl9mcm9udGVuZCBmcm9udGVuZDsKQEAgLTIwNCw5ICsyMDMsNiBAQAogCiAJdmVzMTgyMF93cml0ZXJlZyhzdGF0ZSwgMHgzNCwgc3RhdGUtPnB3bSk7CiAKLQlpZiAoc3RhdGUtPmNvbmZpZy0+cGxsX2luaXQpCi0JCXN0YXRlLT5jb25maWctPnBsbF9pbml0KGZlKTsKLQogCXJldHVybiAwOwogfQogCkBAIC0yMjMsNyArMjE5LDExIEBACiAJaWYgKHJlYWxfcWFtIDwgMCB8fCByZWFsX3FhbSA+IDQpCiAJCXJldHVybiAtRUlOVkFMOwogCi0Jc3RhdGUtPmNvbmZpZy0+cGxsX3NldChmZSwgcCk7CisJaWYgKGZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMpIHsKKwkJZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyhmZSwgcCk7CisJCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpIGZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMCk7CisJfQorCiAJdmVzMTgyMF9zZXRfc3ltYm9scmF0ZShzdGF0ZSwgcC0+dS5xYW0uc3ltYm9sX3JhdGUpOwogCXZlczE4MjBfd3JpdGVyZWcoc3RhdGUsIDB4MzQsIHN0YXRlLT5wd20pOwogCkBAIC0zODAsNyArMzgwLDYgQEAKIAkJZ290byBlcnJvcjsKIAogCS8qIHNldHVwIHRoZSBzdGF0ZSAqLwotCW1lbWNweSgmc3RhdGUtPm9wcywgJnZlczE4MjBfb3BzLCBzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMpKTsKIAlzdGF0ZS0+cmVnMCA9IHZlczE4MjBfaW5pdHRhYlswXTsKIAlzdGF0ZS0+Y29uZmlnID0gY29uZmlnOwogCXN0YXRlLT5pMmMgPSBpMmM7CkBAIC0zOTMsMTIgKzM5MiwxMiBAQAogCWlmICh2ZXJib3NlKQogCQlwcmludGsoInZlczE4MjA6IHB3bT0weCUwMnhcbiIsIHN0YXRlLT5wd20pOwogCi0Jc3RhdGUtPm9wcy5pbmZvLnN5bWJvbF9yYXRlX21pbiA9IChzdGF0ZS0+Y29uZmlnLT54aW4gLyAyKSAvIDY0OyAgICAgIC8qIFNBQ0xLLzY0ID09IChYSU4vMikvNjQgKi8KLQlzdGF0ZS0+b3BzLmluZm8uc3ltYm9sX3JhdGVfbWF4ID0gKHN0YXRlLT5jb25maWctPnhpbiAvIDIpIC8gNDsgICAgICAgLyogU0FDTEsvNCAqLwotCiAJLyogY3JlYXRlIGR2Yl9mcm9udGVuZCAqLwotCXN0YXRlLT5mcm9udGVuZC5vcHMgPSAmc3RhdGUtPm9wczsKKwltZW1jcHkoJnN0YXRlLT5mcm9udGVuZC5vcHMsICZ2ZXMxODIwX29wcywgc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzKSk7CisJc3RhdGUtPmZyb250ZW5kLm9wcy5pbmZvLnN5bWJvbF9yYXRlX21pbiA9IChzdGF0ZS0+Y29uZmlnLT54aW4gLyAyKSAvIDY0OyAgICAgIC8qIFNBQ0xLLzY0ID09IChYSU4vMikvNjQgKi8KKwlzdGF0ZS0+ZnJvbnRlbmQub3BzLmluZm8uc3ltYm9sX3JhdGVfbWF4ID0gKHN0YXRlLT5jb25maWctPnhpbiAvIDIpIC8gNDsgICAgICAgLyogU0FDTEsvNCAqLwogCXN0YXRlLT5mcm9udGVuZC5kZW1vZHVsYXRvcl9wcml2ID0gc3RhdGU7CisKIAlyZXR1cm4gJnN0YXRlLT5mcm9udGVuZDsKIAogZXJyb3I6CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdmVzMTgyMC5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3ZlczE4MjAuaAppbmRleCAzNTVmMTMwLi41MjBmMDk1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdmVzMTgyMC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy92ZXMxODIwLmgKQEAgLTM5LDEwICszOSw2IEBACiAKIAkvKiBTRUxBR0MgY29udHJvbCAqLwogCXU4IHNlbGFnYzoxOwotCi0JLyogUExMIG1haW50ZW5hbmNlICovCi0JaW50ICgqcGxsX2luaXQpKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKTsKLQlpbnQgKCpwbGxfc2V0KShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMpOwogfTsKIAogZXh0ZXJuIHN0cnVjdCBkdmJfZnJvbnRlbmQqIHZlczE4MjBfYXR0YWNoKGNvbnN0IHN0cnVjdCB2ZXMxODIwX2NvbmZpZyogY29uZmlnLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3ZlczF4OTMuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy92ZXMxeDkzLmMKaW5kZXggODIxZGY4ZS4uNTRkN2IwNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3ZlczF4OTMuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdmVzMXg5My5jCkBAIC0zNiw3ICszNiw2IEBACiAKIHN0cnVjdCB2ZXMxeDkzX3N0YXRlIHsKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIqIGkyYzsKLQlzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyBvcHM7CiAJLyogY29uZmlndXJhdGlvbiBzZXR0aW5ncyAqLwogCWNvbnN0IHN0cnVjdCB2ZXMxeDkzX2NvbmZpZyogY29uZmlnOwogCXN0cnVjdCBkdmJfZnJvbnRlbmQgZnJvbnRlbmQ7CkBAIC0yNzgsMTIgKzI3Nyw2IEBACiAJCX0KIAl9CiAKLQlpZiAoc3RhdGUtPmNvbmZpZy0+cGxsX2luaXQpIHsKLQkJdmVzMXg5M193cml0ZXJlZyhzdGF0ZSwgMHgwMCwgMHgxMSk7Ci0JCXN0YXRlLT5jb25maWctPnBsbF9pbml0KGZlKTsKLQkJdmVzMXg5M193cml0ZXJlZyhzdGF0ZSwgMHgwMCwgMHgwMSk7Ci0JfQotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTM5NSw5ICszODgsMTAgQEAKIHsKIAlzdHJ1Y3QgdmVzMXg5M19zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAotCXZlczF4OTNfd3JpdGVyZWcoc3RhdGUsIDB4MDAsIDB4MTEpOwotCXN0YXRlLT5jb25maWctPnBsbF9zZXQoZmUsIHApOwotCXZlczF4OTNfd3JpdGVyZWcoc3RhdGUsIDB4MDAsIDB4MDEpOworCWlmIChmZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zKSB7CisJCWZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMoZmUsIHApOworCQlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKSBmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDApOworCX0KIAl2ZXMxeDkzX3NldF9pbnZlcnNpb24gKHN0YXRlLCBwLT5pbnZlcnNpb24pOwogCXZlczF4OTNfc2V0X2ZlYyAoc3RhdGUsIHAtPnUucXBzay5mZWNfaW5uZXIpOwogCXZlczF4OTNfc2V0X3N5bWJvbHJhdGUgKHN0YXRlLCBwLT51LnFwc2suc3ltYm9sX3JhdGUpOwpAQCAtNDQyLDYgKzQzNiwxNyBAQAogCWtmcmVlKHN0YXRlKTsKIH0KIAorc3RhdGljIGludCB2ZXMxeDkzX2kyY19nYXRlX2N0cmwoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGludCBlbmFibGUpCit7CisJc3RydWN0IHZlczF4OTNfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisKKwlpZiAoZW5hYmxlKSB7CisJCXJldHVybiB2ZXMxeDkzX3dyaXRlcmVnKHN0YXRlLCAweDAwLCAweDExKTsKKwl9IGVsc2UgeworCQlyZXR1cm4gdmVzMXg5M193cml0ZXJlZyhzdGF0ZSwgMHgwMCwgMHgwMSk7CisJfQorfQorCiBzdGF0aWMgc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMgdmVzMXg5M19vcHM7CiAKIHN0cnVjdCBkdmJfZnJvbnRlbmQqIHZlczF4OTNfYXR0YWNoKGNvbnN0IHN0cnVjdCB2ZXMxeDkzX2NvbmZpZyogY29uZmlnLApAQCAtNDU3LDcgKzQ2Miw2IEBACiAJLyogc2V0dXAgdGhlIHN0YXRlICovCiAJc3RhdGUtPmNvbmZpZyA9IGNvbmZpZzsKIAlzdGF0ZS0+aTJjID0gaTJjOwotCW1lbWNweSgmc3RhdGUtPm9wcywgJnZlczF4OTNfb3BzLCBzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMpKTsKIAlzdGF0ZS0+aW52ZXJzaW9uID0gSU5WRVJTSU9OX09GRjsKIAogCS8qIGNoZWNrIGlmIHRoZSBkZW1vZCBpcyB0aGVyZSArIGlkZW50aWZ5IGl0ICovCkBAIC00OTIsNyArNDk2LDcgQEAKIAl9CiAKIAkvKiBjcmVhdGUgZHZiX2Zyb250ZW5kICovCi0Jc3RhdGUtPmZyb250ZW5kLm9wcyA9ICZzdGF0ZS0+b3BzOworCW1lbWNweSgmc3RhdGUtPmZyb250ZW5kLm9wcywgJnZlczF4OTNfb3BzLCBzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMpKTsKIAlzdGF0ZS0+ZnJvbnRlbmQuZGVtb2R1bGF0b3JfcHJpdiA9IHN0YXRlOwogCXJldHVybiAmc3RhdGUtPmZyb250ZW5kOwogCkBAIC01MjMsNiArNTI3LDcgQEAKIAogCS5pbml0ID0gdmVzMXg5M19pbml0LAogCS5zbGVlcCA9IHZlczF4OTNfc2xlZXAsCisJLmkyY19nYXRlX2N0cmwgPSB2ZXMxeDkzX2kyY19nYXRlX2N0cmwsCiAKIAkuc2V0X2Zyb250ZW5kID0gdmVzMXg5M19zZXRfZnJvbnRlbmQsCiAJLmdldF9mcm9udGVuZCA9IHZlczF4OTNfZ2V0X2Zyb250ZW5kLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3ZlczF4OTMuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy92ZXMxeDkzLmgKaW5kZXggMTYyN2UzNy4uYmE4OGFlMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3ZlczF4OTMuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdmVzMXg5My5oCkBAIC0zOCwxMCArMzgsNiBAQAogCiAJLyogc2hvdWxkIFBXTSBiZSBpbnZlcnRlZD8gKi8KIAl1OCBpbnZlcnRfcHdtOjE7Ci0KLQkvKiBQTEwgbWFpbnRlbmFuY2UgKi8KLQlpbnQgKCpwbGxfaW5pdCkoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpOwotCWludCAoKnBsbF9zZXQpKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcyk7CiB9OwogCiBleHRlcm4gc3RydWN0IGR2Yl9mcm9udGVuZCogdmVzMXg5M19hdHRhY2goY29uc3Qgc3RydWN0IHZlczF4OTNfY29uZmlnKiBjb25maWcsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvemwxMDM1My5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3psMTAzNTMuYwppbmRleCBkN2Q5ZjU5Li4yYjk1ZThiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvemwxMDM1My5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy96bDEwMzUzLmMKQEAgLTM0LDcgKzM0LDYgQEAKIHN0cnVjdCB6bDEwMzUzX3N0YXRlIHsKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYzsKIAlzdHJ1Y3QgZHZiX2Zyb250ZW5kIGZyb250ZW5kOwotCXN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzIG9wczsKIAogCXN0cnVjdCB6bDEwMzUzX2NvbmZpZyBjb25maWc7CiB9OwpAQCAtMTI2LDYgKzEyNSw3IEBACiAJCQkJICBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnBhcmFtKQogewogCXN0cnVjdCB6bDEwMzUzX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCiAJdTggcGxsYnVmWzZdID0geyAweDY3IH07CiAKIAkvKiBUaGVzZSBzZXR0aW5ncyBzZXQgImF1dG8tZXZlcnl0aGluZyIgYW5kIHN0YXJ0IHRoZSBGU00uICovCkBAIC0xNDIsNyArMTQyLDMwIEBACiAJemwxMDM1M19zaW5nbGVfd3JpdGUoZmUsIDB4NjYsIDB4RTkpOwogCXpsMTAzNTNfc2luZ2xlX3dyaXRlKGZlLCAweDYyLCAweDBBKTsKIAotCXN0YXRlLT5jb25maWcucGxsX3NldChmZSwgcGFyYW0sIHBsbGJ1ZiArIDEpOworCS8vIGlmIHRoZXJlIGlzIG5vIGF0dGFjaGVkIHNlY29uZGFyeSB0dW5lciwgd2UgY2FsbCBzZXRfcGFyYW1zIHRvIHByb2dyYW0KKwkvLyBhIHBvdGVudGlhbCB0dW5lciBhdHRhY2hlZCBzb21ld2hlcmUgZWxzZQorCWlmIChzdGF0ZS0+Y29uZmlnLm5vX3R1bmVyKSB7CisJCWlmIChmZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zKSB7CisJCQlmZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zKGZlLCBwYXJhbSk7CisJCQlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKSBmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDApOworCQl9CisJfQorCisJLy8gaWYgcGxsYnVmIGlzIGRlZmluZWQsIHJldHJpZXZlIHRoZSBzZXR0aW5ncworCWlmIChmZS0+b3BzLnR1bmVyX29wcy5jYWxjX3JlZ3MpIHsKKwkJZmUtPm9wcy50dW5lcl9vcHMuY2FsY19yZWdzKGZlLCBwYXJhbSwgcGxsYnVmKzEsIDUpOworCQlwbGxidWZbMV0gPDw9IDE7CisJfSBlbHNlIHsKKwkJLy8gZmFrZSBwbGxidWYgc2V0dGluZ3MKKwkJcGxsYnVmWzFdID0gMHg2MSA8PCAxOworCQlwbGxidWZbMl0gPSAwOworCQlwbGxidWZbM10gPSAwOworCQlwbGxidWZbM10gPSAwOworCQlwbGxidWZbNF0gPSAwOworCX0KKworCS8vIHRoZXJlIGlzIG5vIGNhbGwgdG8gX2p1c3RfIHN0YXJ0IGRlY29kaW5nLCBzbyB3ZSBzZW5kIHRoZSBwbGxidWYgYW55d2F5CisJLy8gZXZlbiBpZiB0aGVyZSBpc24ndCBhIFBMTCBhdHRhY2hlZCB0byB0aGUgc2Vjb25kYXJ5IGJ1cwogCXpsMTAzNTNfd3JpdGUoZmUsIHBsbGJ1Ziwgc2l6ZW9mKHBsbGJ1ZikpOwogCiAJemwxMDM1M19zaW5nbGVfd3JpdGUoZmUsIDB4NzAsIDB4MDEpOwpAQCAtMjU0LDE0ICsyNzcsMTMgQEAKIAkvKiBzZXR1cCB0aGUgc3RhdGUgKi8KIAlzdGF0ZS0+aTJjID0gaTJjOwogCW1lbWNweSgmc3RhdGUtPmNvbmZpZywgY29uZmlnLCBzaXplb2Yoc3RydWN0IHpsMTAzNTNfY29uZmlnKSk7Ci0JbWVtY3B5KCZzdGF0ZS0+b3BzLCAmemwxMDM1M19vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOwogCiAJLyogY2hlY2sgaWYgdGhlIGRlbW9kIGlzIHRoZXJlICovCiAJaWYgKHpsMTAzNTNfcmVhZF9yZWdpc3RlcihzdGF0ZSwgQ0hJUF9JRCkgIT0gSURfWkwxMDM1MykKIAkJZ290byBlcnJvcjsKIAogCS8qIGNyZWF0ZSBkdmJfZnJvbnRlbmQgKi8KLQlzdGF0ZS0+ZnJvbnRlbmQub3BzID0gJnN0YXRlLT5vcHM7CisJbWVtY3B5KCZzdGF0ZS0+ZnJvbnRlbmQub3BzLCAmemwxMDM1M19vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOwogCXN0YXRlLT5mcm9udGVuZC5kZW1vZHVsYXRvcl9wcml2ID0gc3RhdGU7CiAKIAlyZXR1cm4gJnN0YXRlLT5mcm9udGVuZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy96bDEwMzUzLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvemwxMDM1My5oCmluZGV4IDVjYzRhZTcxLi45NzcwY2I4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvemwxMDM1My5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy96bDEwMzUzLmgKQEAgLTI5LDEwICsyOSw4IEBACiAJLyogZGVtb2R1bGF0b3IncyBJMkMgYWRkcmVzcyAqLwogCXU4IGRlbW9kX2FkZHJlc3M7CiAKLQkvKiBmdW5jdGlvbiB3aGljaCBjb25maWd1cmVzIHRoZSBQTEwgYnVmZmVyIChmb3Igc2Vjb25kYXJ5IEkyQwotCSAqIGNvbm5lY3RlZCB0dW5lcikgb3IgdHVuZXMgdGhlIFBMTCAoZm9yIGRpcmVjdCBjb25uZWN0ZWQgdHVuZXIpICovCi0JaW50ICgqcGxsX3NldCkoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCi0JCSAgICAgICBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnBhcmFtcywgdTggKnBsbGJ1Zik7CisJLyogc2V0IGlmIG5vIHBsbCBpcyBjb25uZWN0ZWQgdG8gdGhlIHNlY29uZGFyeSBpMmMgYnVzICovCisJaW50IG5vX3R1bmVyOwogfTsKIAogZXh0ZXJuIHN0cnVjdCBkdmJfZnJvbnRlbmQqIHpsMTAzNTNfYXR0YWNoKGNvbnN0IHN0cnVjdCB6bDEwMzUzX2NvbmZpZyAqY29uZmlnLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvcGx1dG8yL3BsdXRvMi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvcGx1dG8yL3BsdXRvMi5jCmluZGV4IDFjNTMxNmUuLmFjYWJlYTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL3BsdXRvMi9wbHV0bzIuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9wbHV0bzIvcGx1dG8yLmMKQEAgLTQyNCw4ICs0MjQsOCBAQAogfQogCiAvKiBMRyBJbm5vdGVrIFREVEUtRTAwMVAgKEluZmluZW9uIFRVQTYwMzQpICovCi1zdGF0aWMgaW50IGxnX3RkdHBlMDAxcF9wbGxfc2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAotCQkJCXN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcCkKK3N0YXRpYyBpbnQgbGdfdGR0cGUwMDFwX3R1bmVyX3NldF9wYXJhbXMoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCisJCQkJCSBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnApCiB7CiAJc3RydWN0IHBsdXRvICpwbHV0byA9IGZyb250ZW5kX3RvX3BsdXRvKGZlKTsKIAlzdHJ1Y3QgaTJjX21zZyBtc2c7CkBAIC00NzMsNiArNDczLDggQEAKIAltc2cuYnVmID0gYnVmOwogCW1zZy5sZW4gPSBzaXplb2YoYnVmKTsKIAorCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMSk7CiAJcmV0ID0gaTJjX3RyYW5zZmVyKCZwbHV0by0+aTJjX2FkYXAsICZtc2csIDEpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwpAQCAtNDk3LDggKzQ5OSw2IEBACiAJLnh0YWxfZnJlcSA9IFREQTEwMDQ2X1hUQUxfMTZNLAogCS5hZ2NfY29uZmlnID0gVERBMTAwNDZfQUdDX0RFRkFVTFQsCiAJLmlmX2ZyZXEgPSBUREExMDA0Nl9GUkVRXzM2MTcsCi0JLnBsbF9zZXQgPSBsZ190ZHRwZTAwMXBfcGxsX3NldCwKLQkucGxsX3NsZWVwID0gTlVMTCwKIAkucmVxdWVzdF9maXJtd2FyZSA9IHBsdXRvMl9yZXF1ZXN0X2Zpcm13YXJlLAogfTsKIApAQCAtNTExLDExICs1MTEsMTIgQEAKIAkJZGV2X2VycigmcGx1dG8tPnBkZXYtPmRldiwgImNvdWxkIG5vdCBhdHRhY2ggZnJvbnRlbmRcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CisJcGx1dG8tPmZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBsZ190ZHRwZTAwMXBfdHVuZXJfc2V0X3BhcmFtczsKIAogCXJldCA9IGR2Yl9yZWdpc3Rlcl9mcm9udGVuZCgmcGx1dG8tPmR2Yl9hZGFwdGVyLCBwbHV0by0+ZmUpOwogCWlmIChyZXQgPCAwKSB7Ci0JCWlmIChwbHV0by0+ZmUtPm9wcy0+cmVsZWFzZSkKLQkJCXBsdXRvLT5mZS0+b3BzLT5yZWxlYXNlKHBsdXRvLT5mZSk7CisJCWlmIChwbHV0by0+ZmUtPm9wcy5yZWxlYXNlKQorCQkJcGx1dG8tPmZlLT5vcHMucmVsZWFzZShwbHV0by0+ZmUpOwogCQlyZXR1cm4gcmV0OwogCX0KIApAQCAtNjQ3LDcgKzY0OCw3IEBACiAJCWdvdG8gZXJyX3BsdXRvX2h3X2V4aXQ7CiAKIAkvKiBkdmIgKi8KLQlyZXQgPSBkdmJfcmVnaXN0ZXJfYWRhcHRlcigmcGx1dG8tPmR2Yl9hZGFwdGVyLCBEUklWRVJfTkFNRSwgVEhJU19NT0RVTEUpOworCXJldCA9IGR2Yl9yZWdpc3Rlcl9hZGFwdGVyKCZwbHV0by0+ZHZiX2FkYXB0ZXIsIERSSVZFUl9OQU1FLCBUSElTX01PRFVMRSwgJnBkZXYtPmRldik7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gZXJyX2kyY19iaXRfZGVsX2J1czsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL0tjb25maWcKaW5kZXggYjVhYzdkZi4uOTg3ODgxZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvS2NvbmZpZworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9LY29uZmlnCkBAIC0xMCw2ICsxMCw3IEBACiAJc2VsZWN0IERWQl9TUDg4NzAKIAlzZWxlY3QgRFZCX1NUVjAyOTcKIAlzZWxlY3QgRFZCX0w2NDc4MQorCXNlbGVjdCBEVkJfTE5CUDIxCiAJaGVscAogCSAgU3VwcG9ydCBmb3IgU0FBNzE0NiBhbmQgQVY3MTEwIGJhc2VkIERWQiBjYXJkcyBhcyBwcm9kdWNlZAogCSAgYnkgRnVqaXRzdS1TaWVtZW5zLCBUZWNobm90cmVuZCwgSGF1cHBhdWdlIGFuZCBvdGhlcnMuCkBAIC02Nyw2ICs2OCw3IEBACiAJc2VsZWN0IERWQl9UREE4MDgzCiAJc2VsZWN0IERWQl9UREExMDAyMQogCXNlbGVjdCBEVkJfUzVIMTQyMAorCXNlbGVjdCBEVkJfTE5CUDIxCiAJaGVscAogCSAgU3VwcG9ydCBmb3Igc2ltcGxlIFNBQTcxNDYgYmFzZWQgRFZCIGNhcmRzCiAJICAoc28gY2FsbGVkIEJ1ZGdldC0gb3IgTm92YS1QQ0kgY2FyZHMpIHdpdGhvdXQgb25ib2FyZApAQCAtODQsNiArODYsNyBAQAogCXNlbGVjdCBEVkJfU1RWMDI5NwogCXNlbGVjdCBEVkJfU1RWMDI5OQogCXNlbGVjdCBEVkJfVERBMTAwNFgKKwlzZWxlY3QgRFZCX0xOQlAyMQogCWhlbHAKIAkgIFN1cHBvcnQgZm9yIHNpbXBsZSBTQUE3MTQ2IGJhc2VkIERWQiBjYXJkcwogCSAgKHNvIGNhbGxlZCBCdWRnZXQtIG9yIE5vdmEtUENJIGNhcmRzKSB3aXRob3V0IG9uYm9hcmQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvTWFrZWZpbGUKaW5kZXggYTY5MDczMC4uYWE4NWVjZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvTWFrZWZpbGUKQEAgLTE1LDkgKzE1LDkgQEAKIAogaG9zdHByb2dzLXkJOj0gZmR1bXAKIAotaWZkZWYgQ09ORklHX0RWQl9BVjcxMTBfRklSTVdBUkUKLSQob2JqKS9hdjcxMTAubzogJChvYmopL2ZkdW1wICQob2JqKS9hdjcxMTBfZmlybS5oCitpZmVxICgkKENPTkZJR19EVkJfQVY3MTEwX0ZJUk1XQVJFKSx5KQorJChvYmopL2F2NzExMC5vOiAkKG9iaikvYXY3MTEwX2Zpcm0uaAogCi0kKG9iaikvYXY3MTEwX2Zpcm0uaDoKKyQob2JqKS9hdjcxMTBfZmlybS5oOiAkKG9iaikvZmR1bXAKIAkkKG9iaikvZmR1bXAgJChDT05GSUdfRFZCX0FWNzExMF9GSVJNV0FSRV9GSUxFKSBkdmJfdHRwY2lfZncgJEAKIGVuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9hdjcxMTAuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMC5jCmluZGV4IGQwMjgyNDUuLjdhNWM5OWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMC5jCkBAIC0xNTIsMTMgKzE1Miw5IEBACiAJLyogcmVtYWluaW5nIGluaXRzIGFjY29yZGluZyB0byBjYXJkIGFuZCBmcm9udGVuZCB0eXBlICovCiAJYXY3MTEwLT5hbmFsb2dfdHVuZXJfZmxhZ3MgPSAwOwogCWF2NzExMC0+Y3VycmVudF9pbnB1dCA9IDA7Ci0JaWYgKGRldi0+cGNpLT5zdWJzeXN0ZW1fdmVuZG9yID09IDB4MTNjMiAmJiBkZXYtPnBjaS0+c3Vic3lzdGVtX2RldmljZSA9PSAweDAwMGEpIHsKLQkJcHJpbnRrKCJkdmItdHRwY2k6IE1TUDM0MTUgYXVkaW8gREFDIEAgY2FyZCAlZFxuIiwKLQkJCWF2NzExMC0+ZHZiX2FkYXB0ZXIubnVtKTsKLQkJYXY3MTEwLT5hZGFjX3R5cGUgPSBEVkJfQURBQ19NU1AzNHg1OworCWlmIChkZXYtPnBjaS0+c3Vic3lzdGVtX3ZlbmRvciA9PSAweDEzYzIgJiYgZGV2LT5wY2ktPnN1YnN5c3RlbV9kZXZpY2UgPT0gMHgwMDBhKQogCQlhdjcxMTBfZndfY21kKGF2NzExMCwgQ09NVFlQRV9BVURJT0RBQywgQURTd2l0Y2gsIDEsIDApOyAvLyBTUERJRiBvbgotCX0KLQllbHNlIGlmIChpMmNfd3JpdGVyZWcoYXY3MTEwLCAweDIwLCAweDAwLCAweDAwKSA9PSAxKSB7CisJaWYgKGkyY193cml0ZXJlZyhhdjcxMTAsIDB4MjAsIDB4MDAsIDB4MDApID09IDEpIHsKIAkJcHJpbnRrICgiZHZiLXR0cGNpOiBDcnlzdGFsIGF1ZGlvIERBQyBAIGNhcmQgJWQgZGV0ZWN0ZWRcbiIsCiAJCQlhdjcxMTAtPmR2Yl9hZGFwdGVyLm51bSk7CiAJCWF2NzExMC0+YWRhY190eXBlID0gRFZCX0FEQUNfQ1JZU1RBTDsKQEAgLTE1NTIsNyArMTU0OCw3IEBACiAjZW5kaWYKIAogCi1zdGF0aWMgaW50IGFscHNfYnNydjJfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMpCitzdGF0aWMgaW50IGFscHNfYnNydjJfdHVuZXJfc2V0X3BhcmFtcyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMpCiB7CiAJc3RydWN0IGF2NzExMCogYXY3MTEwID0gKHN0cnVjdCBhdjcxMTAqKSBmZS0+ZHZiLT5wcml2OwogCXU4IHB3ciA9IDA7CkBAIC0xNTc1LDYgKzE1NzEsOCBAQAogCS8vIE5PVEU6IHNpbmNlIHdlJ3JlIHVzaW5nIGEgcHJlc2NhbGVyIG9mIDIsIHdlIHNldCB0aGUKIAkvLyBkaXZpc29yIGZyZXF1ZW5jeSB0byA2Mi41a0h6IGFuZCBkaXZpZGUgYnkgMTI1IGFib3ZlCiAKKwlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDEpOwogCWlmIChpMmNfdHJhbnNmZXIgKCZhdjcxMTAtPmkyY19hZGFwLCAmbXNnLCAxKSAhPSAxKQogCQlyZXR1cm4gLUVJTzsKIAlyZXR1cm4gMDsKQEAgLTE1ODQsMTAgKzE1ODIsOSBAQAogCS5kZW1vZF9hZGRyZXNzID0gMHgwOCwKIAkueGluID0gOTAxMDAwMDBVTCwKIAkuaW52ZXJ0X3B3bSA9IDAsCi0JLnBsbF9zZXQgPSBhbHBzX2JzcnYyX3BsbF9zZXQsCiB9OwogCi1zdGF0aWMgaW50IGFscHNfdGRiZTJfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMpCitzdGF0aWMgaW50IGFscHNfdGRiZTJfdHVuZXJfc2V0X3BhcmFtcyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMpCiB7CiAJc3RydWN0IGF2NzExMCogYXY3MTEwID0gZmUtPmR2Yi0+cHJpdjsKIAl1MzIgZGl2OwpAQCAtMTYwMSw2ICsxNTk4LDggQEAKIAlkYXRhWzJdID0gMHg4NSB8ICgoZGl2ID4+IDEwKSAmIDB4NjApOwogCWRhdGFbM10gPSAocGFyYW1zLT5mcmVxdWVuY3kgPCAxNzQwMDAwMDAgPyAweDg4IDogcGFyYW1zLT5mcmVxdWVuY3kgPCA0NzAwMDAwMDAgPyAweDg0IDogMHg4MSk7CiAKKwlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDEpOwogCWlmIChpMmNfdHJhbnNmZXIoJmF2NzExMC0+aTJjX2FkYXAsICZtc2csIDEpICE9IDEpCiAJCXJldHVybiAtRUlPOwogCXJldHVybiAwOwpAQCAtMTYxMSwxNCArMTYxMCwxMiBAQAogCS54aW4gPSA1Nzg0MDAwMFVMLAogCS5pbnZlcnQgPSAxLAogCS5zZWxhZ2MgPSBWRVMxODIwX1NFTEFHQ19TSUdOQU1QRVJSLAotCS5wbGxfc2V0ID0gYWxwc190ZGJlMl9wbGxfc2V0LAogfTsKIAogCiAKIAotc3RhdGljIGludCBncnVuZGlnXzI5NTA0XzQ1MV9wbGxfc2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLAotCQkJCSAgICAgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMpCitzdGF0aWMgaW50IGdydW5kaWdfMjk1MDRfNDUxX3R1bmVyX3NldF9wYXJhbXMoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcGFyYW1zKQogewogCXN0cnVjdCBhdjcxMTAqIGF2NzExMCA9IGZlLT5kdmItPnByaXY7CiAJdTMyIGRpdjsKQEAgLTE2MzEsNiArMTYyOCw4IEBACiAJZGF0YVsyXSA9IDB4OGU7CiAJZGF0YVszXSA9IDB4MDA7CiAKKwlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDEpOwogCWlmIChpMmNfdHJhbnNmZXIoJmF2NzExMC0+aTJjX2FkYXAsICZtc2csIDEpICE9IDEpCiAJCXJldHVybiAtRUlPOwogCXJldHVybiAwOwpAQCAtMTYzOCwxMyArMTYzNywxMSBAQAogCiBzdGF0aWMgc3RydWN0IHRkYTgwODNfY29uZmlnIGdydW5kaWdfMjk1MDRfNDUxX2NvbmZpZyA9IHsKIAkuZGVtb2RfYWRkcmVzcyA9IDB4NjgsCi0JLnBsbF9zZXQgPSBncnVuZGlnXzI5NTA0XzQ1MV9wbGxfc2V0LAogfTsKIAogCiAKLXN0YXRpYyBpbnQgcGhpbGlwc19jZDE1MTZfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwKLQkJCQkgIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyogcGFyYW1zKQorc3RhdGljIGludCBwaGlsaXBzX2NkMTUxNl90dW5lcl9zZXRfcGFyYW1zKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnBhcmFtcykKIHsKIAlzdHJ1Y3QgYXY3MTEwKiBhdjcxMTAgPSBmZS0+ZHZiLT5wcml2OwogCXUzMiBkaXY7CkBAIC0xNjU5LDYgKzE2NTYsOCBAQAogCWRhdGFbMl0gPSAweDhlOwogCWRhdGFbM10gPSAoZiA8IDE3NDAwMDAwMCA/IDB4YTEgOiBmIDwgNDcwMDAwMDAwID8gMHg5MiA6IDB4MzQpOwogCisJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKIAlpZiAoaTJjX3RyYW5zZmVyKCZhdjcxMTAtPmkyY19hZGFwLCAmbXNnLCAxKSAhPSAxKQogCQlyZXR1cm4gLUVJTzsKIAlyZXR1cm4gMDsKQEAgLTE2NjksMTIgKzE2NjgsMTEgQEAKIAkueGluID0gNTc4NDAwMDBVTCwKIAkuaW52ZXJ0ID0gMSwKIAkuc2VsYWdjID0gVkVTMTgyMF9TRUxBR0NfU0lHTkFNUEVSUiwKLQkucGxsX3NldCA9IHBoaWxpcHNfY2QxNTE2X3BsbF9zZXQsCiB9OwogCiAKIAotc3RhdGljIGludCBhbHBzX3RkbGI3X3BsbF9zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyogcGFyYW1zKQorc3RhdGljIGludCBhbHBzX3RkbGI3X3R1bmVyX3NldF9wYXJhbXMoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcGFyYW1zKQogewogCXN0cnVjdCBhdjcxMTAqIGF2NzExMCA9IGZlLT5kdmItPnByaXY7CiAJdTMyIGRpdiwgcHdyOwpAQCAtMTY5Myw2ICsxNjkxLDggQEAKIAlkYXRhWzJdID0gMHg4NTsKIAlkYXRhWzNdID0gcHdyIDw8IDY7CiAKKwlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDEpOwogCWlmIChpMmNfdHJhbnNmZXIoJmF2NzExMC0+aTJjX2FkYXAsICZtc2csIDEpICE9IDEpCiAJCXJldHVybiAtRUlPOwogCXJldHVybiAwOwpAQCAtMTcwOCw3ICsxNzA4LDYgQEAKIHN0YXRpYyBzdHJ1Y3Qgc3A4ODcwX2NvbmZpZyBhbHBzX3RkbGI3X2NvbmZpZyA9IHsKIAogCS5kZW1vZF9hZGRyZXNzID0gMHg3MSwKLQkucGxsX3NldCA9IGFscHNfdGRsYjdfcGxsX3NldCwKIAkucmVxdWVzdF9maXJtd2FyZSA9IGFscHNfdGRsYjdfcmVxdWVzdF9maXJtd2FyZSwKIH07CiAKQEAgLTE4MDYsNyArMTgwNSw3IEBACiAJMHhmZiwgMHhmZiwKIH07CiAKLXN0YXRpYyBpbnQgbmV4dXNjYV9zdHYwMjk3X3BsbF9zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyogcGFyYW1zKQorc3RhdGljIGludCBuZXh1c2NhX3N0djAyOTdfdHVuZXJfc2V0X3BhcmFtcyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMpCiB7CiAJc3RydWN0IGF2NzExMCogYXY3MTEwID0gZmUtPmR2Yi0+cHJpdjsKIAl1MzIgZGl2OwpAQCAtMTgzMiw3ICsxODMxLDggQEAKIAllbHNlCiAJCXJldHVybiAtRUlOVkFMOwogCi0Jc3R2MDI5N19lbmFibGVfcGxsaTJjKGZlKTsKKwlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDEpOwogCWlmIChpMmNfdHJhbnNmZXIoJmF2NzExMC0+aTJjX2FkYXAsICZtc2csIDEpICE9IDEpIHsKIAkJcHJpbnRrKCJuZXh1c2NhOiBwbGwgdHJhbnNmZXIgZmFpbGVkIVxuIik7CiAJCXJldHVybiAtRUlPOwpAQCAtMTg0MCw4ICsxODQwLDggQEAKIAogCS8vIHdhaXQgZm9yIFBMTCBsb2NrCiAJZm9yKGkgPSAwOyBpIDwgMjA7IGkrKykgewotCi0JCXN0djAyOTdfZW5hYmxlX3BsbGkyYyhmZSk7CisJCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDEpOwogCQlpZiAoaTJjX3RyYW5zZmVyKCZhdjcxMTAtPmkyY19hZGFwLCAmcmVhZG1zZywgMSkgPT0gMSkKIAkJCWlmIChkYXRhWzBdICYgMHg0MCkgYnJlYWs7CiAJCW1zbGVlcCgxMCk7CkBAIC0xODU1LDEyICsxODU1LDEyIEBACiAJLmRlbW9kX2FkZHJlc3MgPSAweDFDLAogCS5pbml0dGFiID0gbmV4dXNjYV9zdHYwMjk3X2luaXR0YWIsCiAJLmludmVydCA9IDEsCi0JLnBsbF9zZXQgPSBuZXh1c2NhX3N0djAyOTdfcGxsX3NldCwKKwkuc3RvcF9kdXJpbmdfcmVhZCA9IDEsCiB9OwogCiAKIAotc3RhdGljIGludCBncnVuZGlnXzI5NTA0XzQwMV9wbGxfc2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcykKK3N0YXRpYyBpbnQgZ3J1bmRpZ18yOTUwNF80MDFfdHVuZXJfc2V0X3BhcmFtcyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMpCiB7CiAJc3RydWN0IGF2NzExMCogYXY3MTEwID0gKHN0cnVjdCBhdjcxMTAqKSBmZS0+ZHZiLT5wcml2OwogCXUzMiBkaXY7CkBAIC0xODg3LDEzICsxODg3LDE0IEBACiAJZGF0YVsyXSA9ICgoZGl2ID4+IDEwKSAmIDB4NjApIHwgY2ZnOwogCWRhdGFbM10gPSAoY3B1bXAgPDwgNikgfCBiYW5kX3NlbGVjdDsKIAorCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMSk7CiAJaWYgKGkyY190cmFuc2ZlciAoJmF2NzExMC0+aTJjX2FkYXAsICZtc2csIDEpICE9IDEpIHJldHVybiAtRUlPOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3RydWN0IGw2NDc4MV9jb25maWcgZ3J1bmRpZ18yOTUwNF80MDFfY29uZmlnID0gewogCS5kZW1vZF9hZGRyZXNzID0gMHg1NSwKLQkucGxsX3NldCA9IGdydW5kaWdfMjk1MDRfNDAxX3BsbF9zZXQsCiB9OwogCiAKQEAgLTIwNzksNiArMjA4MCw5IEBACiAJCWNhc2UgMHgwMDAwOiAvLyBGdWppdHN1L1NpZW1lbnMgRFZCLUNhYmxlICh2ZXMxODIwL1BoaWxpcHMgQ0QxNTE2KD8/KSkKIAkJCWF2NzExMC0+ZmUgPSB2ZXMxODIwX2F0dGFjaCgmcGhpbGlwc19jZDE1MTZfY29uZmlnLAogCQkJCQkJICAgICZhdjcxMTAtPmkyY19hZGFwLCByZWFkX3B3bShhdjcxMTApKTsKKwkJCWlmIChhdjcxMTAtPmZlKSB7CisJCQkJYXY3MTEwLT5mZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gcGhpbGlwc19jZDE1MTZfdHVuZXJfc2V0X3BhcmFtczsKKwkJCX0KIAkJCWJyZWFrOwogCQl9CiAKQEAgLTIwOTEsOSArMjA5NSwxMCBAQAogCQkJLy8gdHJ5IHRoZSBBTFBTIEJTUlYyIGZpcnN0IG9mIGFsbAogCQkJYXY3MTEwLT5mZSA9IHZlczF4OTNfYXR0YWNoKCZhbHBzX2JzcnYyX2NvbmZpZywgJmF2NzExMC0+aTJjX2FkYXApOwogCQkJaWYgKGF2NzExMC0+ZmUpIHsKLQkJCQlhdjcxMTAtPmZlLT5vcHMtPmRpc2VxY19zZW5kX21hc3Rlcl9jbWQgPSBhdjcxMTBfZGlzZXFjX3NlbmRfbWFzdGVyX2NtZDsKLQkJCQlhdjcxMTAtPmZlLT5vcHMtPmRpc2VxY19zZW5kX2J1cnN0ID0gYXY3MTEwX2Rpc2VxY19zZW5kX2J1cnN0OwotCQkJCWF2NzExMC0+ZmUtPm9wcy0+c2V0X3RvbmUgPSBhdjcxMTBfc2V0X3RvbmU7CisJCQkJYXY3MTEwLT5mZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gYWxwc19ic3J2Ml90dW5lcl9zZXRfcGFyYW1zOworCQkJCWF2NzExMC0+ZmUtPm9wcy5kaXNlcWNfc2VuZF9tYXN0ZXJfY21kID0gYXY3MTEwX2Rpc2VxY19zZW5kX21hc3Rlcl9jbWQ7CisJCQkJYXY3MTEwLT5mZS0+b3BzLmRpc2VxY19zZW5kX2J1cnN0ID0gYXY3MTEwX2Rpc2VxY19zZW5kX2J1cnN0OworCQkJCWF2NzExMC0+ZmUtPm9wcy5zZXRfdG9uZSA9IGF2NzExMF9zZXRfdG9uZTsKIAkJCQlhdjcxMTAtPnJlY292ZXIgPSBkdmJfc19yZWNvdmVyOwogCQkJCWJyZWFrOwogCQkJfQpAQCAtMjEwMSw5ICsyMTA2LDEyIEBACiAJCQkvLyB0cnkgdGhlIEFMUFMgQlNSVTYgbm93CiAJCQlhdjcxMTAtPmZlID0gc3R2MDI5OV9hdHRhY2goJmFscHNfYnNydTZfY29uZmlnLCAmYXY3MTEwLT5pMmNfYWRhcCk7CiAJCQlpZiAoYXY3MTEwLT5mZSkgewotCQkJCWF2NzExMC0+ZmUtPm9wcy0+ZGlzZXFjX3NlbmRfbWFzdGVyX2NtZCA9IGF2NzExMF9kaXNlcWNfc2VuZF9tYXN0ZXJfY21kOwotCQkJCWF2NzExMC0+ZmUtPm9wcy0+ZGlzZXFjX3NlbmRfYnVyc3QgPSBhdjcxMTBfZGlzZXFjX3NlbmRfYnVyc3Q7Ci0JCQkJYXY3MTEwLT5mZS0+b3BzLT5zZXRfdG9uZSA9IGF2NzExMF9zZXRfdG9uZTsKKwkJCQlhdjcxMTAtPmZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBhbHBzX2JzcnU2X3R1bmVyX3NldF9wYXJhbXM7CisJCQkJYXY3MTEwLT5mZS0+dHVuZXJfcHJpdiA9ICZhdjcxMTAtPmkyY19hZGFwOworCisJCQkJYXY3MTEwLT5mZS0+b3BzLmRpc2VxY19zZW5kX21hc3Rlcl9jbWQgPSBhdjcxMTBfZGlzZXFjX3NlbmRfbWFzdGVyX2NtZDsKKwkJCQlhdjcxMTAtPmZlLT5vcHMuZGlzZXFjX3NlbmRfYnVyc3QgPSBhdjcxMTBfZGlzZXFjX3NlbmRfYnVyc3Q7CisJCQkJYXY3MTEwLT5mZS0+b3BzLnNldF90b25lID0gYXY3MTEwX3NldF90b25lOwogCQkJCWF2NzExMC0+cmVjb3ZlciA9IGR2Yl9zX3JlY292ZXI7CiAJCQkJYnJlYWs7CiAJCQl9CkBAIC0yMTExLDkgKzIxMTksMTAgQEAKIAkJCS8vIFRyeSB0aGUgZ3J1bmRpZyAyOTUwNC00NTEKIAkJCWF2NzExMC0+ZmUgPSB0ZGE4MDgzX2F0dGFjaCgmZ3J1bmRpZ18yOTUwNF80NTFfY29uZmlnLCAmYXY3MTEwLT5pMmNfYWRhcCk7CiAJCQlpZiAoYXY3MTEwLT5mZSkgewotCQkJCWF2NzExMC0+ZmUtPm9wcy0+ZGlzZXFjX3NlbmRfbWFzdGVyX2NtZCA9IGF2NzExMF9kaXNlcWNfc2VuZF9tYXN0ZXJfY21kOwotCQkJCWF2NzExMC0+ZmUtPm9wcy0+ZGlzZXFjX3NlbmRfYnVyc3QgPSBhdjcxMTBfZGlzZXFjX3NlbmRfYnVyc3Q7Ci0JCQkJYXY3MTEwLT5mZS0+b3BzLT5zZXRfdG9uZSA9IGF2NzExMF9zZXRfdG9uZTsKKwkJCQlhdjcxMTAtPmZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBncnVuZGlnXzI5NTA0XzQ1MV90dW5lcl9zZXRfcGFyYW1zOworCQkJCWF2NzExMC0+ZmUtPm9wcy5kaXNlcWNfc2VuZF9tYXN0ZXJfY21kID0gYXY3MTEwX2Rpc2VxY19zZW5kX21hc3Rlcl9jbWQ7CisJCQkJYXY3MTEwLT5mZS0+b3BzLmRpc2VxY19zZW5kX2J1cnN0ID0gYXY3MTEwX2Rpc2VxY19zZW5kX2J1cnN0OworCQkJCWF2NzExMC0+ZmUtPm9wcy5zZXRfdG9uZSA9IGF2NzExMF9zZXRfdG9uZTsKIAkJCQlhdjcxMTAtPnJlY292ZXIgPSBkdmJfc19yZWNvdmVyOwogCQkJCWJyZWFrOwogCQkJfQpAQCAtMjEyNCwxMSArMjEzMywxNyBAQAogCQkJCS8qIFNpZW1lbnMgRFZCLUMgKGZ1bGwtbGVuZ3RoIGNhcmQpIFZFUzE4MjAvUGhpbGlwcyBDRDE1MTYgKi8KIAkJCQlhdjcxMTAtPmZlID0gdmVzMTgyMF9hdHRhY2goJnBoaWxpcHNfY2QxNTE2X2NvbmZpZywgJmF2NzExMC0+aTJjX2FkYXAsCiAJCQkJCQkJcmVhZF9wd20oYXY3MTEwKSk7CisJCQkJaWYgKGF2NzExMC0+ZmUpIHsKKwkJCQkJYXY3MTEwLT5mZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gcGhpbGlwc19jZDE1MTZfdHVuZXJfc2V0X3BhcmFtczsKKwkJCQl9CiAJCQkJYnJlYWs7CiAJCQljYXNlIDB4MDAwMzoKIAkJCQkvKiBIYXVwcGF1Z2UgRFZCLUMgMi4xIFZFUzE4MjAvQUxQUyBUREJFMiAqLwogCQkJCWF2NzExMC0+ZmUgPSB2ZXMxODIwX2F0dGFjaCgmYWxwc190ZGJlMl9jb25maWcsICZhdjcxMTAtPmkyY19hZGFwLAogCQkJCQkJCXJlYWRfcHdtKGF2NzExMCkpOworCQkJCWlmIChhdjcxMTAtPmZlKSB7CisJCQkJCWF2NzExMC0+ZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IGFscHNfdGRiZTJfdHVuZXJfc2V0X3BhcmFtczsKKwkJCQl9CiAJCQkJYnJlYWs7CiAJCQl9CiAJCQlicmVhazsKQEAgLTIxMzcsMjAgKzIxNTIsMjcgQEAKIAogCQkJLy8gQUxQUyBURExCNwogCQkJYXY3MTEwLT5mZSA9IHNwODg3MF9hdHRhY2goJmFscHNfdGRsYjdfY29uZmlnLCAmYXY3MTEwLT5pMmNfYWRhcCk7CisJCQlpZiAoYXY3MTEwLT5mZSkgeworCQkJCWF2NzExMC0+ZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IGFscHNfdGRsYjdfdHVuZXJfc2V0X3BhcmFtczsKKwkJCX0KIAkJCWJyZWFrOwogCiAJCWNhc2UgMHgwMDAyOiAvLyBIYXVwcGF1Z2UvVFQgRFZCLUMgcHJlbWl1bSByZXYyLlgKIAogCQkJYXY3MTEwLT5mZSA9IHZlczE4MjBfYXR0YWNoKCZhbHBzX3RkYmUyX2NvbmZpZywgJmF2NzExMC0+aTJjX2FkYXAsIHJlYWRfcHdtKGF2NzExMCkpOworCQkJaWYgKGF2NzExMC0+ZmUpIHsKKwkJCQlhdjcxMTAtPmZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBhbHBzX3RkYmUyX3R1bmVyX3NldF9wYXJhbXM7CisJCQl9CiAJCQlicmVhazsKIAogCQljYXNlIDB4MDAwNDogLy8gR2FsYXhpcyBEVkItUyByZXYxLjMKIAkJCS8qIEFMUFMgQlNSVjIgKi8KIAkJCWF2NzExMC0+ZmUgPSB2ZXMxeDkzX2F0dGFjaCgmYWxwc19ic3J2Ml9jb25maWcsICZhdjcxMTAtPmkyY19hZGFwKTsKIAkJCWlmIChhdjcxMTAtPmZlKSB7Ci0JCQkJYXY3MTEwLT5mZS0+b3BzLT5kaXNlcWNfc2VuZF9tYXN0ZXJfY21kID0gYXY3MTEwX2Rpc2VxY19zZW5kX21hc3Rlcl9jbWQ7Ci0JCQkJYXY3MTEwLT5mZS0+b3BzLT5kaXNlcWNfc2VuZF9idXJzdCA9IGF2NzExMF9kaXNlcWNfc2VuZF9idXJzdDsKLQkJCQlhdjcxMTAtPmZlLT5vcHMtPnNldF90b25lID0gYXY3MTEwX3NldF90b25lOworCQkJCWF2NzExMC0+ZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IGFscHNfYnNydjJfdHVuZXJfc2V0X3BhcmFtczsKKwkJCQlhdjcxMTAtPmZlLT5vcHMuZGlzZXFjX3NlbmRfbWFzdGVyX2NtZCA9IGF2NzExMF9kaXNlcWNfc2VuZF9tYXN0ZXJfY21kOworCQkJCWF2NzExMC0+ZmUtPm9wcy5kaXNlcWNfc2VuZF9idXJzdCA9IGF2NzExMF9kaXNlcWNfc2VuZF9idXJzdDsKKwkJCQlhdjcxMTAtPmZlLT5vcHMuc2V0X3RvbmUgPSBhdjcxMTBfc2V0X3RvbmU7CiAJCQkJYXY3MTEwLT5yZWNvdmVyID0gZHZiX3NfcmVjb3ZlcjsKIAkJCX0KIAkJCWJyZWFrOwpAQCAtMjE1OSw5ICsyMTgxLDEwIEBACiAJCQkvKiBHcnVuZGlnIDI5NTA0LTQ1MSAqLwogCQkJYXY3MTEwLT5mZSA9IHRkYTgwODNfYXR0YWNoKCZncnVuZGlnXzI5NTA0XzQ1MV9jb25maWcsICZhdjcxMTAtPmkyY19hZGFwKTsKIAkJCWlmIChhdjcxMTAtPmZlKSB7Ci0JCQkJYXY3MTEwLT5mZS0+b3BzLT5kaXNlcWNfc2VuZF9tYXN0ZXJfY21kID0gYXY3MTEwX2Rpc2VxY19zZW5kX21hc3Rlcl9jbWQ7Ci0JCQkJYXY3MTEwLT5mZS0+b3BzLT5kaXNlcWNfc2VuZF9idXJzdCA9IGF2NzExMF9kaXNlcWNfc2VuZF9idXJzdDsKLQkJCQlhdjcxMTAtPmZlLT5vcHMtPnNldF90b25lID0gYXY3MTEwX3NldF90b25lOworCQkJCWF2NzExMC0+ZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IGdydW5kaWdfMjk1MDRfNDUxX3R1bmVyX3NldF9wYXJhbXM7CisJCQkJYXY3MTEwLT5mZS0+b3BzLmRpc2VxY19zZW5kX21hc3Rlcl9jbWQgPSBhdjcxMTBfZGlzZXFjX3NlbmRfbWFzdGVyX2NtZDsKKwkJCQlhdjcxMTAtPmZlLT5vcHMuZGlzZXFjX3NlbmRfYnVyc3QgPSBhdjcxMTBfZGlzZXFjX3NlbmRfYnVyc3Q7CisJCQkJYXY3MTEwLT5mZS0+b3BzLnNldF90b25lID0gYXY3MTEwX3NldF90b25lOwogCQkJCWF2NzExMC0+cmVjb3ZlciA9IGR2Yl9zX3JlY292ZXI7CiAJCQl9CiAJCQlicmVhazsKQEAgLTIxNjksMTIgKzIxOTIsMTcgQEAKIAkJY2FzZSAweDAwMDg6IC8vIEhhdXBwYXVnZS9UVCBEVkItVAogCiAJCQlhdjcxMTAtPmZlID0gbDY0NzgxX2F0dGFjaCgmZ3J1bmRpZ18yOTUwNF80MDFfY29uZmlnLCAmYXY3MTEwLT5pMmNfYWRhcCk7CisJCQlpZiAoYXY3MTEwLT5mZSkgeworCQkJCWF2NzExMC0+ZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IGdydW5kaWdfMjk1MDRfNDAxX3R1bmVyX3NldF9wYXJhbXM7CisJCQl9CiAJCQlicmVhazsKIAogCQljYXNlIDB4MDAwQTogLy8gSGF1cHBhdWdlL1RUIE5leHVzLUNBIHJldjEuWAogCiAJCQlhdjcxMTAtPmZlID0gc3R2MDI5N19hdHRhY2goJm5leHVzY2Ffc3R2MDI5N19jb25maWcsICZhdjcxMTAtPmkyY19hZGFwKTsKIAkJCWlmIChhdjcxMTAtPmZlKSB7CisJCQkJYXY3MTEwLT5mZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gbmV4dXNjYV9zdHYwMjk3X3R1bmVyX3NldF9wYXJhbXM7CisKIAkJCQkvKiBzZXQgVERBOTgxOSBpbnRvIERWQiBtb2RlICovCiAJCQkJc2FhNzE0Nl9zZXRncGlvKGF2NzExMC0+ZGV2LCAxLCBTQUE3MTQ2X0dQSU9fT1VUTE8pOyAvLyBUREE5MTk4IHBpbjkoU1REKQogCQkJCXNhYTcxNDZfc2V0Z3BpbyhhdjcxMTAtPmRldiwgMywgU0FBNzE0Nl9HUElPX09VVExPKTsgLy8gVERBOTE5OCBwaW4zMChWSUYpCkBAIC0yMTg5LDEzICsyMjE3LDE2IEBACiAJCQkvKiBBTFBTIEJTQkUxICovCiAJCQlhdjcxMTAtPmZlID0gc3R2MDI5OV9hdHRhY2goJmFscHNfYnNiZTFfY29uZmlnLCAmYXY3MTEwLT5pMmNfYWRhcCk7CiAJCQlpZiAoYXY3MTEwLT5mZSkgewotCQkJCWlmIChsbmJwMjFfaW5pdChhdjcxMTAtPmZlLCAmYXY3MTEwLT5pMmNfYWRhcCwgMCwgMCkpIHsKKwkJCQlhdjcxMTAtPmZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBhbHBzX2JzYmUxX3R1bmVyX3NldF9wYXJhbXM7CisJCQkJYXY3MTEwLT5mZS0+dHVuZXJfcHJpdiA9ICZhdjcxMTAtPmkyY19hZGFwOworCisJCQkJaWYgKGxuYnAyMV9hdHRhY2goYXY3MTEwLT5mZSwgJmF2NzExMC0+aTJjX2FkYXAsIDAsIDApKSB7CiAJCQkJCXByaW50aygiZHZiLXR0cGNpOiBMTkJQMjEgbm90IGZvdW5kIVxuIik7Ci0JCQkJCWlmIChhdjcxMTAtPmZlLT5vcHMtPnJlbGVhc2UpCi0JCQkJCQlhdjcxMTAtPmZlLT5vcHMtPnJlbGVhc2UoYXY3MTEwLT5mZSk7CisJCQkJCWlmIChhdjcxMTAtPmZlLT5vcHMucmVsZWFzZSkKKwkJCQkJCWF2NzExMC0+ZmUtPm9wcy5yZWxlYXNlKGF2NzExMC0+ZmUpOwogCQkJCQlhdjcxMTAtPmZlID0gTlVMTDsKIAkJCQl9IGVsc2UgewotCQkJCQlhdjcxMTAtPmZlLT5vcHMtPmRpc2huZXR3b3JrX3NlbmRfbGVnYWN5X2NvbW1hbmQgPSBOVUxMOworCQkJCQlhdjcxMTAtPmZlLT5vcHMuZGlzaG5ldHdvcmtfc2VuZF9sZWdhY3lfY29tbWFuZCA9IE5VTEw7CiAJCQkJCWF2NzExMC0+cmVjb3ZlciA9IGR2Yl9zX3JlY292ZXI7CiAJCQkJfQogCQkJfQpAQCAtMjIxMiwyMSArMjI0MywyMSBAQAogCQkgICAgICAgYXY3MTEwLT5kZXYtPnBjaS0+c3Vic3lzdGVtX3ZlbmRvciwKIAkJICAgICAgIGF2NzExMC0+ZGV2LT5wY2ktPnN1YnN5c3RlbV9kZXZpY2UpOwogCX0gZWxzZSB7Ci0JCUZFX0ZVTkNfT1ZFUlJJREUoYXY3MTEwLT5mZS0+b3BzLT5pbml0LCBhdjcxMTAtPmZlX2luaXQsIGF2NzExMF9mZV9pbml0KTsKLQkJRkVfRlVOQ19PVkVSUklERShhdjcxMTAtPmZlLT5vcHMtPnJlYWRfc3RhdHVzLCBhdjcxMTAtPmZlX3JlYWRfc3RhdHVzLCBhdjcxMTBfZmVfcmVhZF9zdGF0dXMpOwotCQlGRV9GVU5DX09WRVJSSURFKGF2NzExMC0+ZmUtPm9wcy0+ZGlzZXFjX3Jlc2V0X292ZXJsb2FkLCBhdjcxMTAtPmZlX2Rpc2VxY19yZXNldF9vdmVybG9hZCwgYXY3MTEwX2ZlX2Rpc2VxY19yZXNldF9vdmVybG9hZCk7Ci0JCUZFX0ZVTkNfT1ZFUlJJREUoYXY3MTEwLT5mZS0+b3BzLT5kaXNlcWNfc2VuZF9tYXN0ZXJfY21kLCBhdjcxMTAtPmZlX2Rpc2VxY19zZW5kX21hc3Rlcl9jbWQsIGF2NzExMF9mZV9kaXNlcWNfc2VuZF9tYXN0ZXJfY21kKTsKLQkJRkVfRlVOQ19PVkVSUklERShhdjcxMTAtPmZlLT5vcHMtPmRpc2VxY19zZW5kX2J1cnN0LCBhdjcxMTAtPmZlX2Rpc2VxY19zZW5kX2J1cnN0LCBhdjcxMTBfZmVfZGlzZXFjX3NlbmRfYnVyc3QpOwotCQlGRV9GVU5DX09WRVJSSURFKGF2NzExMC0+ZmUtPm9wcy0+c2V0X3RvbmUsIGF2NzExMC0+ZmVfc2V0X3RvbmUsIGF2NzExMF9mZV9zZXRfdG9uZSk7Ci0JCUZFX0ZVTkNfT1ZFUlJJREUoYXY3MTEwLT5mZS0+b3BzLT5zZXRfdm9sdGFnZSwgYXY3MTEwLT5mZV9zZXRfdm9sdGFnZSwgYXY3MTEwX2ZlX3NldF92b2x0YWdlOykKLQkJRkVfRlVOQ19PVkVSUklERShhdjcxMTAtPmZlLT5vcHMtPmRpc2huZXR3b3JrX3NlbmRfbGVnYWN5X2NvbW1hbmQsIGF2NzExMC0+ZmVfZGlzaG5ldHdvcmtfc2VuZF9sZWdhY3lfY29tbWFuZCwgYXY3MTEwX2ZlX2Rpc2huZXR3b3JrX3NlbmRfbGVnYWN5X2NvbW1hbmQpOwotCQlGRV9GVU5DX09WRVJSSURFKGF2NzExMC0+ZmUtPm9wcy0+c2V0X2Zyb250ZW5kLCBhdjcxMTAtPmZlX3NldF9mcm9udGVuZCwgYXY3MTEwX2ZlX3NldF9mcm9udGVuZCk7CisJCUZFX0ZVTkNfT1ZFUlJJREUoYXY3MTEwLT5mZS0+b3BzLmluaXQsIGF2NzExMC0+ZmVfaW5pdCwgYXY3MTEwX2ZlX2luaXQpOworCQlGRV9GVU5DX09WRVJSSURFKGF2NzExMC0+ZmUtPm9wcy5yZWFkX3N0YXR1cywgYXY3MTEwLT5mZV9yZWFkX3N0YXR1cywgYXY3MTEwX2ZlX3JlYWRfc3RhdHVzKTsKKwkJRkVfRlVOQ19PVkVSUklERShhdjcxMTAtPmZlLT5vcHMuZGlzZXFjX3Jlc2V0X292ZXJsb2FkLCBhdjcxMTAtPmZlX2Rpc2VxY19yZXNldF9vdmVybG9hZCwgYXY3MTEwX2ZlX2Rpc2VxY19yZXNldF9vdmVybG9hZCk7CisJCUZFX0ZVTkNfT1ZFUlJJREUoYXY3MTEwLT5mZS0+b3BzLmRpc2VxY19zZW5kX21hc3Rlcl9jbWQsIGF2NzExMC0+ZmVfZGlzZXFjX3NlbmRfbWFzdGVyX2NtZCwgYXY3MTEwX2ZlX2Rpc2VxY19zZW5kX21hc3Rlcl9jbWQpOworCQlGRV9GVU5DX09WRVJSSURFKGF2NzExMC0+ZmUtPm9wcy5kaXNlcWNfc2VuZF9idXJzdCwgYXY3MTEwLT5mZV9kaXNlcWNfc2VuZF9idXJzdCwgYXY3MTEwX2ZlX2Rpc2VxY19zZW5kX2J1cnN0KTsKKwkJRkVfRlVOQ19PVkVSUklERShhdjcxMTAtPmZlLT5vcHMuc2V0X3RvbmUsIGF2NzExMC0+ZmVfc2V0X3RvbmUsIGF2NzExMF9mZV9zZXRfdG9uZSk7CisJCUZFX0ZVTkNfT1ZFUlJJREUoYXY3MTEwLT5mZS0+b3BzLnNldF92b2x0YWdlLCBhdjcxMTAtPmZlX3NldF92b2x0YWdlLCBhdjcxMTBfZmVfc2V0X3ZvbHRhZ2U7KQorCQlGRV9GVU5DX09WRVJSSURFKGF2NzExMC0+ZmUtPm9wcy5kaXNobmV0d29ya19zZW5kX2xlZ2FjeV9jb21tYW5kLCBhdjcxMTAtPmZlX2Rpc2huZXR3b3JrX3NlbmRfbGVnYWN5X2NvbW1hbmQsIGF2NzExMF9mZV9kaXNobmV0d29ya19zZW5kX2xlZ2FjeV9jb21tYW5kKTsKKwkJRkVfRlVOQ19PVkVSUklERShhdjcxMTAtPmZlLT5vcHMuc2V0X2Zyb250ZW5kLCBhdjcxMTAtPmZlX3NldF9mcm9udGVuZCwgYXY3MTEwX2ZlX3NldF9mcm9udGVuZCk7CiAKIAkJcmV0ID0gZHZiX3JlZ2lzdGVyX2Zyb250ZW5kKCZhdjcxMTAtPmR2Yl9hZGFwdGVyLCBhdjcxMTAtPmZlKTsKIAkJaWYgKHJldCA8IDApIHsKIAkJCXByaW50aygiYXY3MTEwOiBGcm9udGVuZCByZWdpc3RyYXRpb24gZmFpbGVkIVxuIik7Ci0JCQlpZiAoYXY3MTEwLT5mZS0+b3BzLT5yZWxlYXNlKQotCQkJCWF2NzExMC0+ZmUtPm9wcy0+cmVsZWFzZShhdjcxMTAtPmZlKTsKKwkJCWlmIChhdjcxMTAtPmZlLT5vcHMucmVsZWFzZSkKKwkJCQlhdjcxMTAtPmZlLT5vcHMucmVsZWFzZShhdjcxMTAtPmZlKTsKIAkJCWF2NzExMC0+ZmUgPSBOVUxMOwogCQl9CiAJfQpAQCAtMjQxMyw3ICsyNDQ0LDcgQEAKIAkJZ290byBlcnJfa2ZyZWVfMDsKIAogCXJldCA9IGR2Yl9yZWdpc3Rlcl9hZGFwdGVyKCZhdjcxMTAtPmR2Yl9hZGFwdGVyLCBhdjcxMTAtPmNhcmRfbmFtZSwKLQkJCQkgICBUSElTX01PRFVMRSk7CisJCQkJICAgVEhJU19NT0RVTEUsICZkZXYtPnBjaS0+ZGV2KTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBlcnJfcHV0X2Zpcm13YXJlXzE7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMF9hdi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwX2F2LmMKaW5kZXggMmVmZjA5Zi4uMGYzYTA0NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwX2F2LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwX2F2LmMKQEAgLTMxOCw3ICszMTgsMTcgQEAKIAkJbXNwX3dyaXRlcmVnKGF2NzExMCwgTVNQX1dSX0RTUCwgMHgwMDAwLCB2YWwpOyAvKiBsb3Vkc3BlYWtlciAqLwogCQltc3Bfd3JpdGVyZWcoYXY3MTEwLCBNU1BfV1JfRFNQLCAweDAwMDYsIHZhbCk7IC8qIGhlYWRwaG9uZXNyICovCiAJCXJldHVybiAwOworCisJY2FzZSBEVkJfQURBQ19NU1AzNHg1OgorCQl2b2wgPSAodm9sbGVmdCA+IHZvbHJpZ2h0KSA/IHZvbGxlZnQgOiB2b2xyaWdodDsKKwkJdmFsID0gKHZvbCAqIDB4NzMgLyAyNTUpIDw8IDg7CisJCWlmICh2b2wgPiAwKQorCQkJYmFsYW5jZSA9ICgodm9scmlnaHQgLSB2b2xsZWZ0KSAqIDEyNykgLyB2b2w7CisJCW1zcF93cml0ZXJlZyhhdjcxMTAsIE1TUF9XUl9EU1AsIDB4MDAwMSwgYmFsYW5jZSA8PCA4KTsKKwkJbXNwX3dyaXRlcmVnKGF2NzExMCwgTVNQX1dSX0RTUCwgMHgwMDAwLCB2YWwpOyAvKiBsb3Vkc3BlYWtlciAqLworCQlyZXR1cm4gMDsKIAl9CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTI2NywyMyArMTI3NywzMiBAQAogCQlzd2l0Y2goYXY3MTEwLT5hdWRpb3N0YXRlLmNoYW5uZWxfc2VsZWN0KSB7CiAJCWNhc2UgQVVESU9fU1RFUkVPOgogCQkJcmV0ID0gYXVkY29tKGF2NzExMCwgQVVESU9fQ01EX1NURVJFTyk7Ci0JCQlpZiAoIXJldCkKKwkJCWlmICghcmV0KSB7CiAJCQkJaWYgKGF2NzExMC0+YWRhY190eXBlID09IERWQl9BREFDX0NSWVNUQUwpCiAJCQkJCWkyY193cml0ZXJlZyhhdjcxMTAsIDB4MjAsIDB4MDIsIDB4NDkpOworCQkJCWVsc2UgaWYgKGF2NzExMC0+YWRhY190eXBlID09IERWQl9BREFDX01TUDM0eDUpCisJCQkJCW1zcF93cml0ZXJlZyhhdjcxMTAsIE1TUF9XUl9EU1AsIDB4MDAwOCwgMHgwMjIwKTsKKwkJCX0KIAkJCWJyZWFrOwogCiAJCWNhc2UgQVVESU9fTU9OT19MRUZUOgogCQkJcmV0ID0gYXVkY29tKGF2NzExMCwgQVVESU9fQ01EX01PTk9fTCk7Ci0JCQlpZiAoIXJldCkKKwkJCWlmICghcmV0KSB7CiAJCQkJaWYgKGF2NzExMC0+YWRhY190eXBlID09IERWQl9BREFDX0NSWVNUQUwpCiAJCQkJCWkyY193cml0ZXJlZyhhdjcxMTAsIDB4MjAsIDB4MDIsIDB4NGEpOworCQkJCWVsc2UgaWYgKGF2NzExMC0+YWRhY190eXBlID09IERWQl9BREFDX01TUDM0eDUpCisJCQkJCW1zcF93cml0ZXJlZyhhdjcxMTAsIE1TUF9XUl9EU1AsIDB4MDAwOCwgMHgwMjAwKTsKKwkJCX0KIAkJCWJyZWFrOwogCiAJCWNhc2UgQVVESU9fTU9OT19SSUdIVDoKIAkJCXJldCA9IGF1ZGNvbShhdjcxMTAsIEFVRElPX0NNRF9NT05PX1IpOwotCQkJaWYgKCFyZXQpCisJCQlpZiAoIXJldCkgewogCQkJCWlmIChhdjcxMTAtPmFkYWNfdHlwZSA9PSBEVkJfQURBQ19DUllTVEFMKQogCQkJCQlpMmNfd3JpdGVyZWcoYXY3MTEwLCAweDIwLCAweDAyLCAweDQ1KTsKKwkJCQllbHNlIGlmIChhdjcxMTAtPmFkYWNfdHlwZSA9PSBEVkJfQURBQ19NU1AzNHg1KQorCQkJCQltc3Bfd3JpdGVyZWcoYXY3MTEwLCBNU1BfV1JfRFNQLCAweDAwMDgsIDB4MDIxMCk7CisJCQl9CiAJCQlicmVhazsKIAogCQlkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwX3Y0bC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwX3Y0bC5jCmluZGV4IDYwM2EyMmUuLjY0MDU1NDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMF92NGwuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9hdjcxMTBfdjRsLmMKQEAgLTQyLDcgKzQyLDE4IEBACiBpbnQgbXNwX3dyaXRlcmVnKHN0cnVjdCBhdjcxMTAgKmF2NzExMCwgdTggZGV2LCB1MTYgcmVnLCB1MTYgdmFsKQogewogCXU4IG1zZ1s1XSA9IHsgZGV2LCByZWcgPj4gOCwgcmVnICYgMHhmZiwgdmFsID4+IDggLCB2YWwgJiAweGZmIH07Ci0Jc3RydWN0IGkyY19tc2cgbXNncyA9IHsgLmZsYWdzID0gMCwgLmFkZHIgPSAweDQwLCAubGVuID0gNSwgLmJ1ZiA9IG1zZyB9OworCXN0cnVjdCBpMmNfbXNnIG1zZ3MgPSB7IC5mbGFncyA9IDAsIC5sZW4gPSA1LCAuYnVmID0gbXNnIH07CisKKwlzd2l0Y2ggKGF2NzExMC0+YWRhY190eXBlKSB7CisJY2FzZSBEVkJfQURBQ19NU1AzNHgwOgorCQltc2dzLmFkZHIgPSAweDQwOworCQlicmVhazsKKwljYXNlIERWQl9BREFDX01TUDM0eDU6CisJCW1zZ3MuYWRkciA9IDB4NDI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KIAogCWlmIChpMmNfdHJhbnNmZXIoJmF2NzExMC0+aTJjX2FkYXAsICZtc2dzLCAxKSAhPSAxKSB7CiAJCWRwcmludGsoMSwgImR2Yi10dHBjaTogZmFpbGVkIEAgY2FyZCAlZCwgJXUgPSAldVxuIiwKQEAgLTU3LDEwICs2OCwyMyBAQAogCXU4IG1zZzFbM10gPSB7IGRldiwgcmVnID4+IDgsIHJlZyAmIDB4ZmYgfTsKIAl1OCBtc2cyWzJdOwogCXN0cnVjdCBpMmNfbXNnIG1zZ3NbMl0gPSB7Ci0JCXsgLmZsYWdzID0gMCwJICAgICAuYWRkciA9IDB4NDAsIC5sZW4gPSAzLCAuYnVmID0gbXNnMSB9LAotCQl7IC5mbGFncyA9IEkyQ19NX1JELCAuYWRkciA9IDB4NDAsIC5sZW4gPSAyLCAuYnVmID0gbXNnMiB9CisJCXsgLmZsYWdzID0gMAkgICAsIC5sZW4gPSAzLCAuYnVmID0gbXNnMSB9LAorCQl7IC5mbGFncyA9IEkyQ19NX1JELCAubGVuID0gMiwgLmJ1ZiA9IG1zZzIgfQogCX07CiAKKwlzd2l0Y2ggKGF2NzExMC0+YWRhY190eXBlKSB7CisJY2FzZSBEVkJfQURBQ19NU1AzNHgwOgorCQltc2dzWzBdLmFkZHIgPSAweDQwOworCQltc2dzWzFdLmFkZHIgPSAweDQwOworCQlicmVhazsKKwljYXNlIERWQl9BREFDX01TUDM0eDU6CisJCW1zZ3NbMF0uYWRkciA9IDB4NDI7CisJCW1zZ3NbMV0uYWRkciA9IDB4NDI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KKwogCWlmIChpMmNfdHJhbnNmZXIoJmF2NzExMC0+aTJjX2FkYXAsICZtc2dzWzBdLCAyKSAhPSAyKSB7CiAJCWRwcmludGsoMSwgImR2Yi10dHBjaTogZmFpbGVkIEAgY2FyZCAlZCwgJXVcbiIsCiAJCSAgICAgICBhdjcxMTAtPmR2Yl9hZGFwdGVyLm51bSwgcmVnKTsKQEAgLTY3OCwxNyArNzAyLDIzIEBACiB7CiAJdTE2IHZlcnNpb24xLCB2ZXJzaW9uMjsKIAotCWlmIChpMmNfd3JpdGVyZWcoYXY3MTEwLCAweDgwLCAweDAsIDB4ODApICE9IDEKLQkgICAgfHwgaTJjX3dyaXRlcmVnKGF2NzExMCwgMHg4MCwgMHgwLCAwKSAhPSAxKQorCWlmIChpMmNfd3JpdGVyZWcoYXY3MTEwLCAweDgwLCAweDAsIDB4ODApID09IDEgJiYKKwkgICAgaTJjX3dyaXRlcmVnKGF2NzExMCwgMHg4MCwgMHgwLCAwKSA9PSAxKSB7CisJCXByaW50aygiZHZiLXR0cGNpOiBEVkItQyBhbmFsb2cgbW9kdWxlIEAgY2FyZCAlZCBkZXRlY3RlZCwgaW5pdGlhbGl6aW5nIE1TUDM0MDBcbiIsCisJCQlhdjcxMTAtPmR2Yl9hZGFwdGVyLm51bSk7CisJCWF2NzExMC0+YWRhY190eXBlID0gRFZCX0FEQUNfTVNQMzR4MDsKKwl9IGVsc2UgaWYgKGkyY193cml0ZXJlZyhhdjcxMTAsIDB4ODQsIDB4MCwgMHg4MCkgPT0gMSAmJgorCQkgICBpMmNfd3JpdGVyZWcoYXY3MTEwLCAweDg0LCAweDAsIDApID09IDEpIHsKKwkJcHJpbnRrKCJkdmItdHRwY2k6IERWQi1DIGFuYWxvZyBtb2R1bGUgQCBjYXJkICVkIGRldGVjdGVkLCBpbml0aWFsaXppbmcgTVNQMzQxNVxuIiwKKwkJCWF2NzExMC0+ZHZiX2FkYXB0ZXIubnVtKTsKKwkJYXY3MTEwLT5hZGFjX3R5cGUgPSBEVkJfQURBQ19NU1AzNHg1OworCX0gZWxzZQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCXByaW50aygiZHZiLXR0cGNpOiBEVkItQyBhbmFsb2cgbW9kdWxlIEAgY2FyZCAlZCBkZXRlY3RlZCwgaW5pdGlhbGl6aW5nIE1TUDM0MDBcbiIsCi0JCWF2NzExMC0+ZHZiX2FkYXB0ZXIubnVtKTsKLQlhdjcxMTAtPmFkYWNfdHlwZSA9IERWQl9BREFDX01TUDM0eDA7CiAJbXNsZWVwKDEwMCk7IC8vIHRoZSBwcm9iaW5nIGFib3ZlIHJlc2V0cyB0aGUgbXNwLi4uCiAJbXNwX3JlYWRyZWcoYXY3MTEwLCBNU1BfUkRfRFNQLCAweDAwMWUsICZ2ZXJzaW9uMSk7CiAJbXNwX3JlYWRyZWcoYXY3MTEwLCBNU1BfUkRfRFNQLCAweDAwMWYsICZ2ZXJzaW9uMik7Ci0JZHByaW50aygxLCAiZHZiLXR0cGNpOiBAIGNhcmQgJWQgTVNQMzQwMCB2ZXJzaW9uIDB4JTA0eCAweCUwNHhcbiIsCisJZHByaW50aygxLCAiZHZiLXR0cGNpOiBAIGNhcmQgJWQgTVNQMzR4eCB2ZXJzaW9uIDB4JTA0eCAweCUwNHhcbiIsCiAJCWF2NzExMC0+ZHZiX2FkYXB0ZXIubnVtLCB2ZXJzaW9uMSwgdmVyc2lvbjIpOwogCW1zcF93cml0ZXJlZyhhdjcxMTAsIE1TUF9XUl9EU1AsIDB4MDAxMywgMHgwYzAwKTsKIAltc3Bfd3JpdGVyZWcoYXY3MTEwLCBNU1BfV1JfRFNQLCAweDAwMDAsIDB4N2YwMCk7IC8vIGxvdWRzcGVha2VyICsgaGVhZHBob25lCkBAIC02OTcsNyArNzI3LDcgQEAKIAltc3Bfd3JpdGVyZWcoYXY3MTEwLCBNU1BfV1JfRFNQLCAweDAwMDQsIDB4N2YwMCk7IC8vIGxvdWRzcGVha2VyIHZvbHVtZQogCW1zcF93cml0ZXJlZyhhdjcxMTAsIE1TUF9XUl9EU1AsIDB4MDAwYSwgMHgwMjIwKTsgLy8gU0NBUlQgMSBzb3VyY2UKIAltc3Bfd3JpdGVyZWcoYXY3MTEwLCBNU1BfV1JfRFNQLCAweDAwMDcsIDB4N2YwMCk7IC8vIFNDQVJUIDEgdm9sdW1lCi0JbXNwX3dyaXRlcmVnKGF2NzExMCwgTVNQX1dSX0RTUCwgMHgwMDBkLCAweDQ4MDApOyAvLyBwcmVzY2FsZSBTQ0FSVAorCW1zcF93cml0ZXJlZyhhdjcxMTAsIE1TUF9XUl9EU1AsIDB4MDAwZCwgMHgxOTAwKTsgLy8gcHJlc2NhbGUgU0NBUlQKIAogCWlmIChpMmNfd3JpdGVyZWcoYXY3MTEwLCAweDQ4LCAweDAxLCAweDAwKSE9MSkgewogCQlJTkZPKCgic2FhNzExMyBub3QgYWNjZXNzaWJsZS5cbiIpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC1hdi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LWF2LmMKaW5kZXggOGE3Y2Q3ZC4uNjE2M2NiMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LWF2LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LWF2LmMKQEAgLTUwLDYgKzUwLDEyIEBACiAKICNkZWZpbmUgREVCSUNJQ0FNCQkweDAyNDIwMDAwCiAKKyNkZWZpbmUgU0xPVFNUQVRVU19OT05FICAgICAgICAgMQorI2RlZmluZSBTTE9UU1RBVFVTX1BSRVNFTlQgICAgICAyCisjZGVmaW5lIFNMT1RTVEFUVVNfUkVTRVQgICAgICAgIDQKKyNkZWZpbmUgU0xPVFNUQVRVU19SRUFEWSAgICAgICAgOAorI2RlZmluZSBTTE9UU1RBVFVTX09DQ1VQSUVEICAgICAoU0xPVFNUQVRVU19QUkVTRU5UfFNMT1RTVEFUVVNfUkVTRVR8U0xPVFNUQVRVU19SRUFEWSkKKwogc3RydWN0IGJ1ZGdldF9hdiB7CiAJc3RydWN0IGJ1ZGdldCBidWRnZXQ7CiAJc3RydWN0IHZpZGVvX2RldmljZSAqdmQ7CkBAIC01OCw4ICs2NCwxNSBAQAogCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCBjaWludGZfaXJxX3Rhc2tsZXQ7CiAJaW50IHNsb3Rfc3RhdHVzOwogCXN0cnVjdCBkdmJfY2FfZW41MDIyMSBjYTsKKwl1OCByZWluaXRpYWxpc2VfZGVtb2Q6MTsKKwl1OCB0ZGExMDAyMV9wb2Nsa3A6MTsKKwl1OCB0ZGExMDAyMV90c19lbmFibGVkOworCWludCAoKnRkYTEwMDIxX3NldF9mcm9udGVuZCkoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcCk7CiB9OwogCitzdGF0aWMgaW50IGNpaW50Zl9zbG90X3NodXRkb3duKHN0cnVjdCBkdmJfY2FfZW41MDIyMSAqY2EsIGludCBzbG90KTsKKworCiAvKiBHUElPIENvbm5lY3Rpb25zOgogICogMCAtIFZjYy9SZXNldCAoUmVzZXQgaXMgY29udHJvbGxlZCBieSBjYXBhY2l0b3IpLiBSZXNldHMgdGhlIGZyb250ZW5kICpBUyBXRUxMKiEKICAqIDEgLSBDSSBtZW1vcnkgc2VsZWN0IDA9PklPIG1lbW9yeSwgMT0+QXR0cmlidXRlIE1lbW9yeQpAQCAtMTI5LDkgKzE0MiwxMCBAQAogCXVkZWxheSgxKTsKIAogCXJlc3VsdCA9IHR0cGNpX2J1ZGdldF9kZWJpcmVhZCgmYnVkZ2V0X2F2LT5idWRnZXQsIERFQklDSUNBTSwgYWRkcmVzcyAmIDB4ZmZmLCAxLCAwLCAxKTsKLQotCWlmIChyZXN1bHQgPT0gLUVUSU1FRE9VVCkKLQkJYnVkZ2V0X2F2LT5zbG90X3N0YXR1cyA9IDA7CisJaWYgKHJlc3VsdCA9PSAtRVRJTUVET1VUKSB7CisJCWNpaW50Zl9zbG90X3NodXRkb3duKGNhLCBzbG90KTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYnVkZ2V0LWF2OiBjYW0gZWplY3RlZCAxXG4iKTsKKwl9CiAJcmV0dXJuIHJlc3VsdDsKIH0KIApAQCAtMTQ3LDkgKzE2MSwxMCBAQAogCXVkZWxheSgxKTsKIAogCXJlc3VsdCA9IHR0cGNpX2J1ZGdldF9kZWJpd3JpdGUoJmJ1ZGdldF9hdi0+YnVkZ2V0LCBERUJJQ0lDQU0sIGFkZHJlc3MgJiAweGZmZiwgMSwgdmFsdWUsIDAsIDEpOwotCi0JaWYgKHJlc3VsdCA9PSAtRVRJTUVET1VUKQotCQlidWRnZXRfYXYtPnNsb3Rfc3RhdHVzID0gMDsKKwlpZiAocmVzdWx0ID09IC1FVElNRURPVVQpIHsKKwkJY2lpbnRmX3Nsb3Rfc2h1dGRvd24oY2EsIHNsb3QpOworCQlwcmludGsoS0VSTl9JTkZPICJidWRnZXQtYXY6IGNhbSBlamVjdGVkIDJcbiIpOworCX0KIAlyZXR1cm4gcmVzdWx0OwogfQogCkBAIC0xNjUsOSArMTgwLDExIEBACiAJdWRlbGF5KDEpOwogCiAJcmVzdWx0ID0gdHRwY2lfYnVkZ2V0X2RlYmlyZWFkKCZidWRnZXRfYXYtPmJ1ZGdldCwgREVCSUNJQ0FNLCBhZGRyZXNzICYgMywgMSwgMCwgMCk7Ci0KLQlpZiAocmVzdWx0ID09IC1FVElNRURPVVQpCi0JCWJ1ZGdldF9hdi0+c2xvdF9zdGF0dXMgPSAwOworCWlmICgocmVzdWx0ID09IC1FVElNRURPVVQpIHx8ICgocmVzdWx0ID09IDB4ZmYpICYmICgoYWRkcmVzcyAmIDMpIDwgMikpKSB7CisJCWNpaW50Zl9zbG90X3NodXRkb3duKGNhLCBzbG90KTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYnVkZ2V0LWF2OiBjYW0gZWplY3RlZCAzXG4iKTsKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisJfQogCXJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTE4Myw5ICsyMDAsMTAgQEAKIAl1ZGVsYXkoMSk7CiAKIAlyZXN1bHQgPSB0dHBjaV9idWRnZXRfZGViaXdyaXRlKCZidWRnZXRfYXYtPmJ1ZGdldCwgREVCSUNJQ0FNLCBhZGRyZXNzICYgMywgMSwgdmFsdWUsIDAsIDApOwotCi0JaWYgKHJlc3VsdCA9PSAtRVRJTUVET1VUKQotCQlidWRnZXRfYXYtPnNsb3Rfc3RhdHVzID0gMDsKKwlpZiAocmVzdWx0ID09IC1FVElNRURPVVQpIHsKKwkJY2lpbnRmX3Nsb3Rfc2h1dGRvd24oY2EsIHNsb3QpOworCQlwcmludGsoS0VSTl9JTkZPICJidWRnZXQtYXY6IGNhbSBlamVjdGVkIDVcbiIpOworCX0KIAlyZXR1cm4gcmVzdWx0OwogfQogCkBAIC0xOTMsMTIgKzIxMSwxMiBAQAogewogCXN0cnVjdCBidWRnZXRfYXYgKmJ1ZGdldF9hdiA9IChzdHJ1Y3QgYnVkZ2V0X2F2ICopIGNhLT5kYXRhOwogCXN0cnVjdCBzYWE3MTQ2X2RldiAqc2FhID0gYnVkZ2V0X2F2LT5idWRnZXQuZGV2OwotCWludCB0aW1lb3V0ID0gNTA7IC8vIDUgc2Vjb25kcyAoNC40LjYgUmVhZHkpCiAKIAlpZiAoc2xvdCAhPSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWRwcmludGsoMSwgImNpaW50Zl9zbG90X3Jlc2V0XG4iKTsKKwlidWRnZXRfYXYtPnNsb3Rfc3RhdHVzID0gU0xPVFNUQVRVU19SRVNFVDsKIAogCXNhYTcxNDZfc2V0Z3BpbyhzYWEsIDIsIFNBQTcxNDZfR1BJT19PVVRISSk7IC8qIGRpc2FibGUgY2FyZCAqLwogCkBAIC0yMDgsMjAgKzIyNiwxNyBAQAogCW1zbGVlcCgyMCk7IC8qIDIwIG1zIFZjYyBzZXR0bGluZyB0aW1lICovCiAKIAlzYWE3MTQ2X3NldGdwaW8oc2FhLCAyLCBTQUE3MTQ2X0dQSU9fT1VUTE8pOyAvKiBlbmFibGUgY2FyZCAqLworCXR0cGNpX2J1ZGdldF9zZXRfdmlkZW9fcG9ydChzYWEsIEJVREdFVF9WSURFT19QT1JUQik7CisJbXNsZWVwKDIwKTsKIAotCS8qIFRoaXMgc2hvdWxkIGhhdmUgYmVlbiBiYXNlZCBvbiBwaW4gMTYgUkVBRFkgb2YgdGhlIHBjbWNpYSBwb3J0LAotCSAqIGJ1dCBBRkFJQ1MgaXQgaXMgbm90IHJvdXRlZCB0byB0aGUgc2FhNzE0NiAqLwotCXdoaWxlICgtLXRpbWVvdXQgPiAwICYmIGNpaW50Zl9yZWFkX2F0dHJpYnV0ZV9tZW0oY2EsIHNsb3QsIDApICE9IDB4MWQpCi0JCW1zbGVlcCgxMDApOworCS8qIHJlaW5pdGlhbGlzZSB0aGUgZnJvbnRlbmQgaWYgbmVjZXNzYXJ5ICovCisJaWYgKGJ1ZGdldF9hdi0+cmVpbml0aWFsaXNlX2RlbW9kKQorCQlkdmJfZnJvbnRlbmRfcmVpbml0aWFsaXNlKGJ1ZGdldF9hdi0+YnVkZ2V0LmR2Yl9mcm9udGVuZCk7CiAKLQkvKiByZWluaXRpYWxpc2UgdGhlIGZyb250ZW5kICovCi0JZHZiX2Zyb250ZW5kX3JlaW5pdGlhbGlzZShidWRnZXRfYXYtPmJ1ZGdldC5kdmJfZnJvbnRlbmQpOwotCi0JaWYgKHRpbWVvdXQgPD0gMCkKLQl7Ci0JCXByaW50ayhLRVJOX0VSUiAiYnVkZ2V0LWF2OiBjYW0gcmVzZXQgZmFpbGVkICh0aW1lb3V0KS5cbiIpOwotCQlzYWE3MTQ2X3NldGdwaW8oc2FhLCAyLCBTQUE3MTQ2X0dQSU9fT1VUSEkpOyAvKiBkaXNhYmxlIGNhcmQgKi8KLQkJcmV0dXJuIC1FVElNRURPVVQ7CisJLyogc2V0IHRkYTEwMDIxIGJhY2sgdG8gb3JpZ2luYWwgY2xvY2sgY29uZmlndXJhdGlvbiBvbiByZXNldCAqLworCWlmIChidWRnZXRfYXYtPnRkYTEwMDIxX3BvY2xrcCkgeworCQl0ZGExMDAyMV93cml0ZV9ieXRlKGJ1ZGdldF9hdi0+YnVkZ2V0LmR2Yl9mcm9udGVuZCwgMHgxMiwgMHhhMCk7CisJCWJ1ZGdldF9hdi0+dGRhMTAwMjFfdHNfZW5hYmxlZCA9IDA7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0yMzgsNyArMjUzLDEzIEBACiAJZHByaW50aygxLCAiY2lpbnRmX3Nsb3Rfc2h1dGRvd25cbiIpOwogCiAJdHRwY2lfYnVkZ2V0X3NldF92aWRlb19wb3J0KHNhYSwgQlVER0VUX1ZJREVPX1BPUlRCKTsKLQlidWRnZXRfYXYtPnNsb3Rfc3RhdHVzID0gMDsKKwlidWRnZXRfYXYtPnNsb3Rfc3RhdHVzID0gU0xPVFNUQVRVU19OT05FOworCisJLyogc2V0IHRkYTEwMDIxIGJhY2sgdG8gb3JpZ2luYWwgY2xvY2sgY29uZmlndXJhdGlvbiB3aGVuIGNhbSByZW1vdmVkICovCisJaWYgKGJ1ZGdldF9hdi0+dGRhMTAwMjFfcG9jbGtwKSB7CisJCXRkYTEwMDIxX3dyaXRlX2J5dGUoYnVkZ2V0X2F2LT5idWRnZXQuZHZiX2Zyb250ZW5kLCAweDEyLCAweGEwKTsKKwkJYnVkZ2V0X2F2LT50ZGExMDAyMV90c19lbmFibGVkID0gMDsKKwl9CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI1Myw2ICsyNzQsMTMgQEAKIAlkcHJpbnRrKDEsICJjaWludGZfc2xvdF90c19lbmFibGU6ICVkXG4iLCBidWRnZXRfYXYtPnNsb3Rfc3RhdHVzKTsKIAogCXR0cGNpX2J1ZGdldF9zZXRfdmlkZW9fcG9ydChzYWEsIEJVREdFVF9WSURFT19QT1JUQSk7CisKKwkvKiB0ZGExMDAyMSBzZWVtcyB0byBuZWVkIGEgZGlmZmVyZW50IFRTIGNsb2NrIGNvbmZpZyB3aGVuIGRhdGEgaXMgcm91dGVkIHRvIHRoZSBDQU0gKi8KKwlpZiAoYnVkZ2V0X2F2LT50ZGExMDAyMV9wb2Nsa3ApIHsKKwkJdGRhMTAwMjFfd3JpdGVfYnl0ZShidWRnZXRfYXYtPmJ1ZGdldC5kdmJfZnJvbnRlbmQsIDB4MTIsIDB4YTEpOworCQlidWRnZXRfYXYtPnRkYTEwMDIxX3RzX2VuYWJsZWQgPSAxOworCX0KKwogCXJldHVybiAwOwogfQogCkBAIC0yNjAsNTAgKzI4OCw2MSBAQAogewogCXN0cnVjdCBidWRnZXRfYXYgKmJ1ZGdldF9hdiA9IChzdHJ1Y3QgYnVkZ2V0X2F2ICopIGNhLT5kYXRhOwogCXN0cnVjdCBzYWE3MTQ2X2RldiAqc2FhID0gYnVkZ2V0X2F2LT5idWRnZXQuZGV2OwotCWludCBjYW1fcHJlc2VudCA9IDA7CisJaW50IHJlc3VsdDsKIAogCWlmIChzbG90ICE9IDApCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKCFidWRnZXRfYXYtPnNsb3Rfc3RhdHVzKQotCXsKLQkJLy8gZmlyc3Qgb2YgYWxsIHRlc3QgdGhlIGNhcmQgZGV0ZWN0IGxpbmUKKwkvKiB0ZXN0IHRoZSBjYXJkIGRldGVjdCBsaW5lIC0gbmVlZHMgdG8gYmUgZG9uZSBjYXJlZnVsbHkKKwkgKiBzaW5jZSBpdCBuZXZlciBnb2VzIGhpZ2ggZm9yIHNvbWUgQ0FNcyBvbiB0aGlzIGludGVyZmFjZSAoZS5nLiB0b3B1cHR2KSAqLworCWlmIChidWRnZXRfYXYtPnNsb3Rfc3RhdHVzID09IFNMT1RTVEFUVVNfTk9ORSkgewogCQlzYWE3MTQ2X3NldGdwaW8oc2FhLCAzLCBTQUE3MTQ2X0dQSU9fSU5QVVQpOwogCQl1ZGVsYXkoMSk7Ci0JCWlmIChzYWE3MTQ2X3JlYWQoc2FhLCBQU1IpICYgTUFTS18wNikKLQkJewotCQkJY2FtX3ByZXNlbnQgPSAxOwotCQl9Ci0JCXNhYTcxNDZfc2V0Z3BpbyhzYWEsIDMsIFNBQTcxNDZfR1BJT19PVVRMTyk7Ci0KLQkJLy8gdGhhdCBpcyB1bnJlbGlhYmxlIGhvd2V2ZXIsIHNvIHRyeSBhbmQgcmVhZCBmcm9tIElPIG1lbW9yeQotCQlpZiAoIWNhbV9wcmVzZW50KQotCQl7Ci0JCQlzYWE3MTQ2X3NldGdwaW8oYnVkZ2V0X2F2LT5idWRnZXQuZGV2LCAxLCBTQUE3MTQ2X0dQSU9fT1VUTE8pOwotCQkJaWYgKHR0cGNpX2J1ZGdldF9kZWJpcmVhZCgmYnVkZ2V0X2F2LT5idWRnZXQsIERFQklDSUNBTSwgMCwgMSwgMCwgMSkgIT0gLUVUSU1FRE9VVCkKLQkJCXsKLQkJCQljYW1fcHJlc2VudCA9IDE7CisJCWlmIChzYWE3MTQ2X3JlYWQoc2FhLCBQU1IpICYgTUFTS18wNikgeworCQkJaWYgKGJ1ZGdldF9hdi0+c2xvdF9zdGF0dXMgPT0gU0xPVFNUQVRVU19OT05FKSB7CisJCQkJYnVkZ2V0X2F2LT5zbG90X3N0YXR1cyA9IFNMT1RTVEFUVVNfUFJFU0VOVDsKKwkJCQlwcmludGsoS0VSTl9JTkZPICJidWRnZXQtYXY6IGNhbSBpbnNlcnRlZCBBXG4iKTsKIAkJCX0KIAkJfQorCQlzYWE3MTQ2X3NldGdwaW8oc2FhLCAzLCBTQUE3MTQ2X0dQSU9fT1VUTE8pOworCX0KIAotCQkvLyBkaWQgd2UgZmluZCBzb21ldGhpbmc/Ci0JCWlmIChjYW1fcHJlc2VudCkgewotCQkJcHJpbnRrKEtFUk5fSU5GTyAiYnVkZ2V0LWF2OiBjYW0gaW5zZXJ0ZWRcbiIpOwotCQkJYnVkZ2V0X2F2LT5zbG90X3N0YXR1cyA9IDE7Ci0JCX0KLQl9IGVsc2UgaWYgKCFvcGVuKSB7CisJLyogV2UgYWxzbyB0cnkgYW5kIHJlYWQgZnJvbSBJTyBtZW1vcnkgdG8gd29yayByb3VuZCB0aGUgYWJvdmUgZGV0ZWN0aW9uIGJ1Zy4gSWYKKwkgKiB0aGVyZSBpcyBubyBDQU0sIHdlIHdpbGwgZ2V0IGEgdGltZW91dC4gT25seSBkb25lIGlmIHRoZXJlIGlzIG5vIGNhbQorCSAqIHByZXNlbnQsIHNpbmNlIHRoaXMgdGVzdCBhY3R1YWxseSBicmVha3Mgc29tZSBjYW1zIDooCisJICoKKwkgKiBpZiB0aGUgQ0kgaW50ZXJmYWNlIGlzIG5vdCBvcGVuLCB3ZSBhbHNvIGRvIHRoZSBhYm92ZSB0ZXN0IHNpbmNlIHdlCisJICogZG9uJ3QgY2FyZSBpZiB0aGUgY2FtIGhhcyBwcm9ibGVtcyAtIHdlJ2xsIGJlIHJlc2V0dGluZyBpdCBvbiBvcGVuKCkgYW55d2F5ICovCisJaWYgKChidWRnZXRfYXYtPnNsb3Rfc3RhdHVzID09IFNMT1RTVEFUVVNfTk9ORSkgfHwgKCFvcGVuKSkgewogCQlzYWE3MTQ2X3NldGdwaW8oYnVkZ2V0X2F2LT5idWRnZXQuZGV2LCAxLCBTQUE3MTQ2X0dQSU9fT1VUTE8pOwotCQlpZiAodHRwY2lfYnVkZ2V0X2RlYmlyZWFkKCZidWRnZXRfYXYtPmJ1ZGdldCwgREVCSUNJQ0FNLCAwLCAxLCAwLCAxKSA9PSAtRVRJTUVET1VUKQotCQl7Ci0JCQlwcmludGsoS0VSTl9JTkZPICJidWRnZXQtYXY6IGNhbSBlamVjdGVkXG4iKTsKLQkJCXNhYTcxNDZfc2V0Z3BpbyhzYWEsIDIsIFNBQTcxNDZfR1BJT19PVVRISSk7IC8qIGRpc2FibGUgY2FyZCAqLwotCQkJYnVkZ2V0X2F2LT5zbG90X3N0YXR1cyA9IDA7CisJCXJlc3VsdCA9IHR0cGNpX2J1ZGdldF9kZWJpcmVhZCgmYnVkZ2V0X2F2LT5idWRnZXQsIERFQklDSUNBTSwgMCwgMSwgMCwgMSk7CisJCWlmICgocmVzdWx0ID49IDApICYmIChidWRnZXRfYXYtPnNsb3Rfc3RhdHVzID09IFNMT1RTVEFUVVNfTk9ORSkpIHsKKwkJCWJ1ZGdldF9hdi0+c2xvdF9zdGF0dXMgPSBTTE9UU1RBVFVTX1BSRVNFTlQ7CisJCQlwcmludGsoS0VSTl9JTkZPICJidWRnZXQtYXY6IGNhbSBpbnNlcnRlZCBCXG4iKTsKKwkJfSBlbHNlIGlmIChyZXN1bHQgPCAwKSB7CisJCQlpZiAoYnVkZ2V0X2F2LT5zbG90X3N0YXR1cyAhPSBTTE9UU1RBVFVTX05PTkUpIHsKKwkJCQljaWludGZfc2xvdF9zaHV0ZG93bihjYSwgc2xvdCk7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiYnVkZ2V0LWF2OiBjYW0gZWplY3RlZCA1XG4iKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KIAkJfQogCX0KIAotCWlmIChidWRnZXRfYXYtPnNsb3Rfc3RhdHVzID09IDEpCi0JCXJldHVybiBEVkJfQ0FfRU41MDIyMV9QT0xMX0NBTV9QUkVTRU5UIHwgRFZCX0NBX0VONTAyMjFfUE9MTF9DQU1fUkVBRFk7CisJLyogcmVhZCBmcm9tIGF0dHJpYnV0ZSBtZW1vcnkgaW4gcmVzZXQvcmVhZHkgc3RhdGUgdG8ga25vdyB3aGVuIHRoZSBDQU0gaXMgcmVhZHkgKi8KKwlpZiAoYnVkZ2V0X2F2LT5zbG90X3N0YXR1cyA9PSBTTE9UU1RBVFVTX1JFU0VUKSB7CisJCXJlc3VsdCA9IGNpaW50Zl9yZWFkX2F0dHJpYnV0ZV9tZW0oY2EsIHNsb3QsIDApOworCQlpZiAocmVzdWx0ID09IDB4MWQpIHsKKwkJCWJ1ZGdldF9hdi0+c2xvdF9zdGF0dXMgPSBTTE9UU1RBVFVTX1JFQURZOworCQl9CisJfQogCisJLyogd29yayBvdXQgY29ycmVjdCByZXR1cm4gY29kZSAqLworCWlmIChidWRnZXRfYXYtPnNsb3Rfc3RhdHVzICE9IFNMT1RTVEFUVVNfTk9ORSkgeworCQlpZiAoYnVkZ2V0X2F2LT5zbG90X3N0YXR1cyAmIFNMT1RTVEFUVVNfUkVBRFkpIHsKKwkJCXJldHVybiBEVkJfQ0FfRU41MDIyMV9QT0xMX0NBTV9QUkVTRU5UIHwgRFZCX0NBX0VONTAyMjFfUE9MTF9DQU1fUkVBRFk7CisJCX0KKwkJcmV0dXJuIERWQl9DQV9FTjUwMjIxX1BPTExfQ0FNX1BSRVNFTlQ7CisJfQogCXJldHVybiAwOwogfQogCkBAIC0zMzMsNiArMzcyLDggQEAKIAlidWRnZXRfYXYtPmNhLnNsb3RfdHNfZW5hYmxlID0gY2lpbnRmX3Nsb3RfdHNfZW5hYmxlOwogCWJ1ZGdldF9hdi0+Y2EucG9sbF9zbG90X3N0YXR1cyA9IGNpaW50Zl9wb2xsX3Nsb3Rfc3RhdHVzOwogCWJ1ZGdldF9hdi0+Y2EuZGF0YSA9IGJ1ZGdldF9hdjsKKwlidWRnZXRfYXYtPmJ1ZGdldC5jaV9wcmVzZW50ID0gMTsKKwlidWRnZXRfYXYtPnNsb3Rfc3RhdHVzID0gU0xPVFNUQVRVU19OT05FOwogCiAJaWYgKChyZXN1bHQgPSBkdmJfY2FfZW41MDIyMV9pbml0KCZidWRnZXRfYXYtPmJ1ZGdldC5kdmJfYWRhcHRlciwKIAkJCQkJICAmYnVkZ2V0X2F2LT5jYSwgMCwgMSkpICE9IDApIHsKQEAgLTM0MSw3ICszODIsNiBAQAogCX0KIAogCXByaW50ayhLRVJOX0lORk8gImJ1ZGdldC1hdjogY2kgaW50ZXJmYWNlIGluaXRpYWxpc2VkLlxuIik7Ci0JYnVkZ2V0X2F2LT5idWRnZXQuY2lfcHJlc2VudCA9IDE7CiAJcmV0dXJuIDA7CiAKIGVycm9yOgpAQCAtNDcyLDEyICs1MTIsMTIgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBwaGlsaXBzX3N1MTI3OF90eV9jaV9wbGxfc2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAotCQkJCQlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYywKLQkJCQkJc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMpCitzdGF0aWMgaW50IHBoaWxpcHNfc3UxMjc4X3R5X2NpX3R1bmVyX3NldF9wYXJhbXMoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCisJCQkJCQkgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMpCiB7CiAJdTMyIGRpdjsKIAl1OCBidWZbNF07CisJc3RydWN0IGJ1ZGdldCAqYnVkZ2V0ID0gKHN0cnVjdCBidWRnZXQgKikgZmUtPmR2Yi0+cHJpdjsKIAlzdHJ1Y3QgaTJjX21zZyBtc2cgPSB7LmFkZHIgPSAweDYxLC5mbGFncyA9IDAsLmJ1ZiA9IGJ1ZiwubGVuID0gc2l6ZW9mKGJ1ZikgfTsKIAogCWlmICgocGFyYW1zLT5mcmVxdWVuY3kgPCA5NTAwMDApIHx8IChwYXJhbXMtPmZyZXF1ZW5jeSA+IDIxNTAwMDApKQpAQCAtNTAxLDcgKzU0MSw5IEBACiAJZWxzZSBpZiAocGFyYW1zLT5mcmVxdWVuY3kgPCAyMTUwMDAwKQogCQlidWZbM10gfD0gMHhDMDsKIAotCWlmIChpMmNfdHJhbnNmZXIoaTJjLCAmbXNnLCAxKSAhPSAxKQorCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMSk7CisJaWYgKGkyY190cmFuc2ZlcigmYnVkZ2V0LT5pMmNfYWRhcCwgJm1zZywgMSkgIT0gMSkKIAkJcmV0dXJuIC1FSU87CiAJcmV0dXJuIDA7CiB9CkBAIC01MDksOSArNTUxLDggQEAKICNkZWZpbmUgTUlOMihhLGIpICgoYSkgPCAoYikgPyAoYSkgOiAoYikpCiAjZGVmaW5lIE1JTjMoYSxiLGMpIE1JTjIoTUlOMihhLGIpLGMpCiAKLXN0YXRpYyBpbnQgcGhpbGlwc19zdTEyNzhzaDJfdHVhNjEwMF9wbGxfc2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAotCQkJCQlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYywKLQkJCQkJc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMpCitzdGF0aWMgaW50IHBoaWxpcHNfc3UxMjc4c2gyX3R1YTYxMDBfdHVuZXJfc2V0X3BhcmFtcyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwkJCQkJCSAgICAgIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcGFyYW1zKQogewogCXU4IHJlZzAgWzJdID0geyAweDAwLCAweDAwIH07CiAJdTggcmVnMSBbNF0gPSB7IDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAgfTsKQEAgLTUyMSw2ICs1NjIsNyBAQAogCWludCBSLCBBLCBOLCBQLCBNOwogCXN0cnVjdCBpMmNfbXNnIG1zZyA9IHsuYWRkciA9IDB4NjAsLmZsYWdzID0gMCwuYnVmID0gTlVMTCwubGVuID0gMCB9OwogCWludCBmcmVxID0gcGFyYW1zLT5mcmVxdWVuY3k7CisJc3RydWN0IGJ1ZGdldCAqYnVkZ2V0ID0gKHN0cnVjdCBidWRnZXQgKikgZmUtPmR2Yi0+cHJpdjsKIAogCWZpcnN0X1pGID0gKGZyZXEpIC8gMTAwMDsKIApAQCAtNjIwLDIxICs2NjIsMjUgQEAKIAlyZWcwWzFdIHw9IDB4MDM7CiAKIAkvKiBhbHJlYWR5IGVuYWJsZWQgLSBkbyBub3QgcmVlbmFibGUgaTJjIHJlcGVhdGVyIG9yIFRYIGZhaWxzICovCisJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKIAltc2cuYnVmID0gcmVnMDsKIAltc2cubGVuID0gc2l6ZW9mKHJlZzApOwotCWlmIChpMmNfdHJhbnNmZXIoaTJjLCAmbXNnLCAxKSAhPSAxKQorCWlmIChpMmNfdHJhbnNmZXIoJmJ1ZGdldC0+aTJjX2FkYXAsICZtc2csIDEpICE9IDEpCiAJCXJldHVybiAtRUlPOwogCi0Jc3R2MDI5OV9lbmFibGVfcGxsaTJjKGZlKTsKKwlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDEpOwogCW1zZy5idWYgPSByZWcxOwogCW1zZy5sZW4gPSBzaXplb2YocmVnMSk7Ci0JaWYgKGkyY190cmFuc2ZlcihpMmMsICZtc2csIDEpICE9IDEpCisJaWYgKGkyY190cmFuc2ZlcigmYnVkZ2V0LT5pMmNfYWRhcCwgJm1zZywgMSkgIT0gMSkKIAkJcmV0dXJuIC1FSU87CiAKLQlzdHYwMjk5X2VuYWJsZV9wbGxpMmMoZmUpOworCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMSk7CiAJbXNnLmJ1ZiA9IHJlZzI7CiAJbXNnLmxlbiA9IHNpemVvZihyZWcyKTsKLQlpZiAoaTJjX3RyYW5zZmVyKGkyYywgJm1zZywgMSkgIT0gMSkKKwlpZiAoaTJjX3RyYW5zZmVyKCZidWRnZXQtPmkyY19hZGFwLCAmbXNnLCAxKSAhPSAxKQogCQlyZXR1cm4gLUVJTzsKIAogCXJldHVybiAwOwpAQCAtNjkyLDcgKzczOCw2IEBACiAJLnZvbHQxM19vcDBfb3AxID0gU1RWMDI5OV9WT0xUMTNfT1AwLAogCS5taW5fZGVsYXlfbXMgPSAxMDAsCiAJLnNldF9zeW1ib2xfcmF0ZSA9IHBoaWxpcHNfc3UxMjc4X3R5X2NpX3NldF9zeW1ib2xfcmF0ZSwKLQkucGxsX3NldCA9IHBoaWxpcHNfc3UxMjc4X3R5X2NpX3BsbF9zZXQsCiB9OwogCiAKQEAgLTcwNiw3ICs3NTEsNiBAQAogCS52b2x0MTNfb3AwX29wMSA9IFNUVjAyOTlfVk9MVDEzX09QMCwKIAkubWluX2RlbGF5X21zID0gMTAwLAogCS5zZXRfc3ltYm9sX3JhdGUgPSBwaGlsaXBzX3N1MTI3OF90eV9jaV9zZXRfc3ltYm9sX3JhdGUsCi0JLnBsbF9zZXQgPSBwaGlsaXBzX3N1MTI3OF90eV9jaV9wbGxfc2V0LAogfTsKIAogc3RhdGljIHN0cnVjdCBzdHYwMjk5X2NvbmZpZyBjaW5lcmd5XzEyMDBzXzE4OTRfMDAxMF9jb25maWcgPSB7CkBAIC03MTksMTAgKzc2Myw5IEBACiAJLnZvbHQxM19vcDBfb3AxID0gU1RWMDI5OV9WT0xUMTNfT1AwLAogCS5taW5fZGVsYXlfbXMgPSAxMDAsCiAJLnNldF9zeW1ib2xfcmF0ZSA9IHBoaWxpcHNfc3UxMjc4X3R5X2NpX3NldF9zeW1ib2xfcmF0ZSwKLQkucGxsX3NldCA9IHBoaWxpcHNfc3UxMjc4c2gyX3R1YTYxMDBfcGxsX3NldCwKIH07CiAKLXN0YXRpYyBpbnQgcGhpbGlwc19jdTEyMTZfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMpCitzdGF0aWMgaW50IHBoaWxpcHNfY3UxMjE2X3R1bmVyX3NldF9wYXJhbXMoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcGFyYW1zKQogewogCXN0cnVjdCBidWRnZXQgKmJ1ZGdldCA9IChzdHJ1Y3QgYnVkZ2V0ICopIGZlLT5kdmItPnByaXY7CiAJdTggYnVmWzRdOwpAQCAtNzM4LDYgKzc4MSw4IEBACiAJYnVmWzNdID0gKHBhcmFtcy0+ZnJlcXVlbmN5IDwgMTUwMDAwMDAwID8gMHgwMSA6CiAJCSAgcGFyYW1zLT5mcmVxdWVuY3kgPCA0NDUwMDAwMDAgPyAweDAyIDogMHgwNCk7CiAKKwlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDEpOwogCWlmIChpMmNfdHJhbnNmZXIoJmJ1ZGdldC0+aTJjX2FkYXAsICZtc2csIDEpICE9IDEpCiAJCXJldHVybiAtRUlPOwogCXJldHVybiAwOwpAQCAtNzQ1LDE5ICs3OTAsMjAgQEAKIAogc3RhdGljIHN0cnVjdCB0ZGExMDAyMV9jb25maWcgcGhpbGlwc19jdTEyMTZfY29uZmlnID0gewogCS5kZW1vZF9hZGRyZXNzID0gMHgwYywKLQkucGxsX3NldCA9IHBoaWxpcHNfY3UxMjE2X3BsbF9zZXQsCiB9OwogCiAKIAogCi1zdGF0aWMgaW50IHBoaWxpcHNfdHUxMjE2X3BsbF9pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQorc3RhdGljIGludCBwaGlsaXBzX3R1MTIxNl90dW5lcl9pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQogewogCXN0cnVjdCBidWRnZXQgKmJ1ZGdldCA9IChzdHJ1Y3QgYnVkZ2V0ICopIGZlLT5kdmItPnByaXY7CiAJc3RhdGljIHU4IHR1MTIxNl9pbml0W10gPSB7IDB4MGIsIDB4ZjUsIDB4ODUsIDB4YWIgfTsKIAlzdHJ1Y3QgaTJjX21zZyB0dW5lcl9tc2cgPSB7LmFkZHIgPSAweDYwLC5mbGFncyA9IDAsLmJ1ZiA9IHR1MTIxNl9pbml0LC5sZW4gPSBzaXplb2YodHUxMjE2X2luaXQpIH07CiAKIAkvLyBzZXR1cCBQTEwgY29uZmlndXJhdGlvbgorCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMSk7CiAJaWYgKGkyY190cmFuc2ZlcigmYnVkZ2V0LT5pMmNfYWRhcCwgJnR1bmVyX21zZywgMSkgIT0gMSkKIAkJcmV0dXJuIC1FSU87CiAJbXNsZWVwKDEpOwpAQCAtNzY1LDcgKzgxMSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcGhpbGlwc190dTEyMTZfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMpCitzdGF0aWMgaW50IHBoaWxpcHNfdHUxMjE2X3R1bmVyX3NldF9wYXJhbXMoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcGFyYW1zKQogewogCXN0cnVjdCBidWRnZXQgKmJ1ZGdldCA9IChzdHJ1Y3QgYnVkZ2V0ICopIGZlLT5kdmItPnByaXY7CiAJdTggdHVuZXJfYnVmWzRdOwpAQCAtODM5LDYgKzg4NSw4IEBACiAJdHVuZXJfYnVmWzJdID0gMHhjYTsKIAl0dW5lcl9idWZbM10gPSAoY3AgPDwgNSkgfCAoZmlsdGVyIDw8IDMpIHwgYmFuZDsKIAorCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMSk7CiAJaWYgKGkyY190cmFuc2ZlcigmYnVkZ2V0LT5pMmNfYWRhcCwgJnR1bmVyX21zZywgMSkgIT0gMSkKIAkJcmV0dXJuIC1FSU87CiAKQEAgLTg2Miw5ICs5MTAsNiBAQAogCS54dGFsX2ZyZXEgPSBUREExMDA0Nl9YVEFMXzRNLAogCS5hZ2NfY29uZmlnID0gVERBMTAwNDZfQUdDX0RFRkFVTFQsCiAJLmlmX2ZyZXEgPSBUREExMDA0Nl9GUkVRXzM2MTcsCi0JLnBsbF9pbml0ID0gcGhpbGlwc190dTEyMTZfcGxsX2luaXQsCi0JLnBsbF9zZXQgPSBwaGlsaXBzX3R1MTIxNl9wbGxfc2V0LAotCS5wbGxfc2xlZXAgPSBOVUxMLAogCS5yZXF1ZXN0X2Zpcm13YXJlID0gcGhpbGlwc190dTEyMTZfcmVxdWVzdF9maXJtd2FyZSwKIH07CiAKQEAgLTkxMSwxMyArOTU2LDEzIEBACiAJMHhmZiwgMHhmZgogfTsKIAotc3RhdGljIGludCBwaGlsaXBzX3NkMTg3OF90ZGE4MjYxX3BsbF9zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCi0JCXN0cnVjdCBpMmNfYWRhcHRlciAqaTJjLAotCQlzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnBhcmFtcykKK3N0YXRpYyBpbnQgcGhpbGlwc19zZDE4NzhfdGRhODI2MV90dW5lcl9zZXRfcGFyYW1zKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorCQkJCQkJICAgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMpCiB7CiAJdTggICAgICAgICAgICAgIGJ1Zls0XTsKIAlpbnQgICAgICAgICAgICAgcmM7CiAJc3RydWN0IGkyY19tc2cgIHR1bmVyX21zZyA9IHsuYWRkcj0weDYwLC5mbGFncz0wLC5idWY9YnVmLC5sZW49c2l6ZW9mKGJ1Zil9OworCXN0cnVjdCBidWRnZXQgKmJ1ZGdldCA9IChzdHJ1Y3QgYnVkZ2V0ICopIGZlLT5kdmItPnByaXY7CiAKIAlpZigocGFyYW1zLT5mcmVxdWVuY3kgPCA5NTAwMDApIHx8IChwYXJhbXMtPmZyZXF1ZW5jeSA+IDIxNTAwMDApKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTkyNiw3ICs5NzEsOSBAQAogCQkJcGFyYW1zLT5mcmVxdWVuY3ksIDApOwogCWlmKHJjIDwgMCkgcmV0dXJuIHJjOwogCi0JaWYoaTJjX3RyYW5zZmVyKGkyYywgJnR1bmVyX21zZywgMSkgIT0gMSkKKwlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDEpOworCWlmKGkyY190cmFuc2ZlcigmYnVkZ2V0LT5pMmNfYWRhcCwgJnR1bmVyX21zZywgMSkgIT0gMSkKIAkJcmV0dXJuIC1FSU87CiAKICAgICByZXR1cm4gMDsKQEAgLTk2OSw3ICsxMDE2LDcgQEAKIAogc3RhdGljIHN0cnVjdCBzdHYwMjk5X2NvbmZpZyBwaGlsaXBzX3NkMTg3OF9jb25maWcgPSB7CiAJLmRlbW9kX2FkZHJlc3MgPSAweDY4LAotCS5pbml0dGFiID0gcGhpbGlwc19zZDE4NzhfaW5pdHRhYiwKKyAgICAgLmluaXR0YWIgPSBwaGlsaXBzX3NkMTg3OF9pbml0dGFiLAogCS5tY2xrID0gODgwMDAwMDBVTCwKIAkuaW52ZXJ0ID0gMCwKIAkuc2tpcF9yZWluaXQgPSAwLApAQCAtOTc3LDcgKzEwMjQsNiBAQAogCS52b2x0MTNfb3AwX29wMSA9IFNUVjAyOTlfVk9MVDEzX09QMCwKIAkubWluX2RlbGF5X21zID0gMTAwLAogCS5zZXRfc3ltYm9sX3JhdGUgPSBwaGlsaXBzX3NkMTg3OF9jaV9zZXRfc3ltYm9sX3JhdGUsCi0JLnBsbF9zZXQgPSBwaGlsaXBzX3NkMTg3OF90ZGE4MjYxX3BsbF9zZXQsCiB9OwogCiBzdGF0aWMgdTggcmVhZF9wd20oc3RydWN0IGJ1ZGdldF9hdiAqYnVkZ2V0X2F2KQpAQCAtMTAwMyw2ICsxMDQ5LDcgQEAKIAogI2RlZmluZSBTVUJJRF9EVkJTX1RWX1NUQVIJMHgwMDE0CiAjZGVmaW5lIFNVQklEX0RWQlNfVFZfU1RBUl9DSQkweDAwMTYKKyNkZWZpbmUgU1VCSURfRFZCU19FQVNZV0FUQ0hfMSAgMHgwMDFhCiAjZGVmaW5lIFNVQklEX0RWQlNfRUFTWVdBVENICTB4MDAxZQogI2RlZmluZSBTVUJJRF9EVkJDX0tOQzEJCTB4MDAyMAogI2RlZmluZSBTVUJJRF9EVkJDX0tOQzFfUExVUwkweDAwMjEKQEAgLTEwMTIsMTcgKzEwNTksMzYgQEAKICNkZWZpbmUgU1VCSURfRFZCVF9LTkMxCQkweDAwMzAKICNkZWZpbmUgU1VCSURfRFZCVF9DSU5FUkdZMTIwMAkweDExNTcKIAorCitzdGF0aWMgaW50IHRkYTEwMDIxX3NldF9mcm9udGVuZChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwkJCQkgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwKQoreworCXN0cnVjdCBidWRnZXRfYXYqIGJ1ZGdldF9hdiA9IGZlLT5kdmItPnByaXY7CisJaW50IHJlc3VsdDsKKworCXJlc3VsdCA9IGJ1ZGdldF9hdi0+dGRhMTAwMjFfc2V0X2Zyb250ZW5kKGZlLCBwKTsKKwlpZiAoYnVkZ2V0X2F2LT50ZGExMDAyMV90c19lbmFibGVkKSB7CisJCXRkYTEwMDIxX3dyaXRlX2J5dGUoYnVkZ2V0X2F2LT5idWRnZXQuZHZiX2Zyb250ZW5kLCAweDEyLCAweGExKTsKKwl9IGVsc2UgeworCQl0ZGExMDAyMV93cml0ZV9ieXRlKGJ1ZGdldF9hdi0+YnVkZ2V0LmR2Yl9mcm9udGVuZCwgMHgxMiwgMHhhMCk7CisJfQorCisJcmV0dXJuIHJlc3VsdDsKK30KKwogc3RhdGljIHZvaWQgZnJvbnRlbmRfaW5pdChzdHJ1Y3QgYnVkZ2V0X2F2ICpidWRnZXRfYXYpCiB7CiAJc3RydWN0IHNhYTcxNDZfZGV2ICogc2FhID0gYnVkZ2V0X2F2LT5idWRnZXQuZGV2OwogCXN0cnVjdCBkdmJfZnJvbnRlbmQgKiBmZSA9IE5VTEw7CiAKKwkvKiBFbmFibGUgLyBQb3dlck9OIEZyb250ZW5kICovCisJc2FhNzE0Nl9zZXRncGlvKHNhYSwgMCwgU0FBNzE0Nl9HUElPX09VVExPKTsKKworCS8qIGFkZGl0aW9uYWwgc2V0dXAgbmVjZXNzYXJ5IGZvciB0aGUgUExVUyBjYXJkcyAqLwogCXN3aXRjaCAoc2FhLT5wY2ktPnN1YnN5c3RlbV9kZXZpY2UpIHsKIAkJY2FzZSBTVUJJRF9EVkJTX0tOQzFfUExVUzoKIAkJY2FzZSBTVUJJRF9EVkJDX0tOQzFfUExVUzoKIAkJY2FzZSBTVUJJRF9EVkJUX0tOQzFfUExVUzoKLQkJCS8vIEVuYWJsZSAvIFBvd2VyT04gRnJvbnRlbmQKLQkJCXNhYTcxNDZfc2V0Z3BpbyhzYWEsIDAsIFNBQTcxNDZfR1BJT19PVVRMTyk7CiAJCQlzYWE3MTQ2X3NldGdwaW8oc2FhLCAzLCBTQUE3MTQ2X0dQSU9fT1VUSEkpOwogCQkJYnJlYWs7CiAJfQpAQCAtMTAzMCwxMiArMTA5NiwxOSBAQAogCXN3aXRjaCAoc2FhLT5wY2ktPnN1YnN5c3RlbV9kZXZpY2UpIHsKIAogCWNhc2UgU1VCSURfRFZCU19LTkMxOgorCWNhc2UgU1VCSURfRFZCU19FQVNZV0FUQ0hfMToKIAkJaWYgKHNhYS0+cGNpLT5zdWJzeXN0ZW1fdmVuZG9yID09IDB4MTg5NCkgewogCQkJZmUgPSBzdHYwMjk5X2F0dGFjaCgmY2luZXJneV8xMjAwc18xODk0XzAwMTBfY29uZmlnLAogCQkJCQkgICAgICZidWRnZXRfYXYtPmJ1ZGdldC5pMmNfYWRhcCk7CisJCQlpZiAoZmUpIHsKKwkJCQlmZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gcGhpbGlwc19zdTEyNzhzaDJfdHVhNjEwMF90dW5lcl9zZXRfcGFyYW1zOworCQkJfQogCQl9IGVsc2UgewogCQkJZmUgPSBzdHYwMjk5X2F0dGFjaCgmdHlwaG9vbl9jb25maWcsCiAJCQkJCSAgICAgJmJ1ZGdldF9hdi0+YnVkZ2V0LmkyY19hZGFwKTsKKwkJCWlmIChmZSkgeworCQkJCWZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBwaGlsaXBzX3N1MTI3OF90eV9jaV90dW5lcl9zZXRfcGFyYW1zOworCQkJfQogCQl9CiAJCWJyZWFrOwogCkBAIC0xMDQ1LDQxICsxMTE4LDUzIEBACiAJY2FzZSBTVUJJRF9EVkJTX0VBU1lXQVRDSDoKIAkJZmUgPSBzdHYwMjk5X2F0dGFjaCgmcGhpbGlwc19zZDE4NzhfY29uZmlnLAogCQkJCSZidWRnZXRfYXYtPmJ1ZGdldC5pMmNfYWRhcCk7CisJCWlmIChmZSkgeworCQkJZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IHBoaWxpcHNfc2QxODc4X3RkYTgyNjFfdHVuZXJfc2V0X3BhcmFtczsKKwkJfQogCQlicmVhazsKIAogCWNhc2UgU1VCSURfRFZCU19LTkMxX1BMVVM6CiAJY2FzZSBTVUJJRF9EVkJTX1RZUEhPT046CiAJCWZlID0gc3R2MDI5OV9hdHRhY2goJnR5cGhvb25fY29uZmlnLAogCQkJCSAgICAmYnVkZ2V0X2F2LT5idWRnZXQuaTJjX2FkYXApOworCQlpZiAoZmUpIHsKKwkJCWZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBwaGlsaXBzX3N1MTI3OF90eV9jaV90dW5lcl9zZXRfcGFyYW1zOworCQl9CiAJCWJyZWFrOwogCiAJY2FzZSBTVUJJRF9EVkJTX0NJTkVSR1kxMjAwOgogCQlmZSA9IHN0djAyOTlfYXR0YWNoKCZjaW5lcmd5XzEyMDBzX2NvbmZpZywKIAkJCQkgICAgJmJ1ZGdldF9hdi0+YnVkZ2V0LmkyY19hZGFwKTsKKwkJaWYgKGZlKSB7CisJCQlmZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gcGhpbGlwc19zdTEyNzhfdHlfY2lfdHVuZXJfc2V0X3BhcmFtczsKKwkJfQogCQlicmVhazsKIAogCWNhc2UgU1VCSURfRFZCQ19LTkMxOgogCWNhc2UgU1VCSURfRFZCQ19LTkMxX1BMVVM6CisJY2FzZSBTVUJJRF9EVkJDX0NJTkVSR1kxMjAwOgorCQlidWRnZXRfYXYtPnJlaW5pdGlhbGlzZV9kZW1vZCA9IDE7CiAJCWZlID0gdGRhMTAwMjFfYXR0YWNoKCZwaGlsaXBzX2N1MTIxNl9jb25maWcsCiAJCQkJICAgICAmYnVkZ2V0X2F2LT5idWRnZXQuaTJjX2FkYXAsCiAJCQkJICAgICByZWFkX3B3bShidWRnZXRfYXYpKTsKKwkJaWYgKGZlKSB7CisJCQlidWRnZXRfYXYtPnRkYTEwMDIxX3BvY2xrcCA9IDE7CisJCQlidWRnZXRfYXYtPnRkYTEwMDIxX3NldF9mcm9udGVuZCA9IGZlLT5vcHMuc2V0X2Zyb250ZW5kOworCQkJZmUtPm9wcy5zZXRfZnJvbnRlbmQgPSB0ZGExMDAyMV9zZXRfZnJvbnRlbmQ7CisJCQlmZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gcGhpbGlwc19jdTEyMTZfdHVuZXJfc2V0X3BhcmFtczsKKwkJfQogCQlicmVhazsKIAogCWNhc2UgU1VCSURfRFZCVF9LTkMxOgogCWNhc2UgU1VCSURfRFZCVF9LTkMxX1BMVVM6Ci0JCWZlID0gdGRhMTAwNDZfYXR0YWNoKCZwaGlsaXBzX3R1MTIxNl9jb25maWcsCi0JCQkJICAgICAmYnVkZ2V0X2F2LT5idWRnZXQuaTJjX2FkYXApOwotCQlicmVhazsKLQotCWNhc2UgU1VCSURfRFZCQ19DSU5FUkdZMTIwMDoKLQkJZmUgPSB0ZGExMDAyMV9hdHRhY2goJnBoaWxpcHNfY3UxMjE2X2NvbmZpZywKLQkJCQkgICAgICZidWRnZXRfYXYtPmJ1ZGdldC5pMmNfYWRhcCwKLQkJCQkgICAgIHJlYWRfcHdtKGJ1ZGdldF9hdikpOwotCQlicmVhazsKLQogCWNhc2UgU1VCSURfRFZCVF9DSU5FUkdZMTIwMDoKKwkJYnVkZ2V0X2F2LT5yZWluaXRpYWxpc2VfZGVtb2QgPSAxOwogCQlmZSA9IHRkYTEwMDQ2X2F0dGFjaCgmcGhpbGlwc190dTEyMTZfY29uZmlnLAogCQkJCSAgICAgJmJ1ZGdldF9hdi0+YnVkZ2V0LmkyY19hZGFwKTsKKwkJaWYgKGZlKSB7CisJCQlmZS0+b3BzLnR1bmVyX29wcy5pbml0ID0gcGhpbGlwc190dTEyMTZfdHVuZXJfaW5pdDsKKwkJCWZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBwaGlsaXBzX3R1MTIxNl90dW5lcl9zZXRfcGFyYW1zOworCQl9CiAJCWJyZWFrOwogCX0KIApAQCAtMTA5OCw4ICsxMTgzLDggQEAKIAlpZiAoZHZiX3JlZ2lzdGVyX2Zyb250ZW5kKCZidWRnZXRfYXYtPmJ1ZGdldC5kdmJfYWRhcHRlciwKIAkJCQkgIGJ1ZGdldF9hdi0+YnVkZ2V0LmR2Yl9mcm9udGVuZCkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJidWRnZXQtYXY6IEZyb250ZW5kIHJlZ2lzdHJhdGlvbiBmYWlsZWQhXG4iKTsKLQkJaWYgKGJ1ZGdldF9hdi0+YnVkZ2V0LmR2Yl9mcm9udGVuZC0+b3BzLT5yZWxlYXNlKQotCQkJYnVkZ2V0X2F2LT5idWRnZXQuZHZiX2Zyb250ZW5kLT5vcHMtPnJlbGVhc2UoYnVkZ2V0X2F2LT5idWRnZXQuZHZiX2Zyb250ZW5kKTsKKwkJaWYgKGJ1ZGdldF9hdi0+YnVkZ2V0LmR2Yl9mcm9udGVuZC0+b3BzLnJlbGVhc2UpCisJCQlidWRnZXRfYXYtPmJ1ZGdldC5kdmJfZnJvbnRlbmQtPm9wcy5yZWxlYXNlKGJ1ZGdldF9hdi0+YnVkZ2V0LmR2Yl9mcm9udGVuZCk7CiAJCWJ1ZGdldF9hdi0+YnVkZ2V0LmR2Yl9mcm9udGVuZCA9IE5VTEw7CiAJfQogfQpAQCAtMTI5Myw2ICsxMzc4LDcgQEAKIE1BS0VfQlVER0VUX0lORk8oa25jMXQsICJLTkMxIERWQi1UIiwgQlVER0VUX0tOQzFUKTsKIE1BS0VfQlVER0VUX0lORk8oa25jeHMsICJLTkMgVFYgU1RBUiBEVkItUyIsIEJVREdFVF9UVlNUQVIpOwogTUFLRV9CVURHRVRfSU5GTyhzYXRld3BscywgIlNhdGVsY28gRWFzeVdhdGNoIERWQi1TIGxpZ2h0IiwgQlVER0VUX1RWU1RBUik7CitNQUtFX0JVREdFVF9JTkZPKHNhdGV3cGxzMSwgIlNhdGVsY28gRWFzeVdhdGNoIERWQi1TIGxpZ2h0IiwgQlVER0VUX0tOQzFTKTsKIE1BS0VfQlVER0VUX0lORk8oa25jMXNwLCAiS05DMSBEVkItUyBQbHVzIiwgQlVER0VUX0tOQzFTUCk7CiBNQUtFX0JVREdFVF9JTkZPKGtuYzFjcCwgIktOQzEgRFZCLUMgUGx1cyIsIEJVREdFVF9LTkMxQ1ApOwogTUFLRV9CVURHRVRfSU5GTyhrbmMxdHAsICJLTkMxIERWQi1UIFBsdXMiLCBCVURHRVRfS05DMVRQKTsKQEAgLTEzMDksNiArMTM5NSw3IEBACiAJTUFLRV9FWFRFTlNJT05fUENJKGtuY3hzLCAweDE4OTQsIDB4MDAxNCksCiAJTUFLRV9FWFRFTlNJT05fUENJKGtuY3hzLCAweDE4OTQsIDB4MDAxNiksCiAJTUFLRV9FWFRFTlNJT05fUENJKHNhdGV3cGxzLCAweDE4OTQsIDB4MDAxZSksCisJTUFLRV9FWFRFTlNJT05fUENJKHNhdGV3cGxzMSwgMHgxODk0LCAweDAwMWEpLAogCU1BS0VfRVhURU5TSU9OX1BDSShrbmMxYywgMHgxODk0LCAweDAwMjApLAogCU1BS0VfRVhURU5TSU9OX1BDSShrbmMxY3AsIDB4MTg5NCwgMHgwMDIxKSwKIAlNQUtFX0VYVEVOU0lPTl9QQ0koa25jMXQsIDB4MTg5NCwgMHgwMDMwKSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC1jaS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LWNpLmMKaW5kZXggZTY0YTYwOS4uNGI5NjZlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LWNpLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LWNpLmMKQEAgLTYyMCwxMCArNjIwLDEwIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcGhpbGlwc19zdTEyNzhfdHRfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKLQkJCQkgICAgIHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjLAotCQkJCSAgICAgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMpCitzdGF0aWMgaW50IHBoaWxpcHNfc3UxMjc4X3R0X3R1bmVyX3NldF9wYXJhbXMoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCisJCQkJCSAgIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcGFyYW1zKQogeworCXN0cnVjdCBidWRnZXRfY2kgKmJ1ZGdldF9jaSA9IChzdHJ1Y3QgYnVkZ2V0X2NpICopIGZlLT5kdmItPnByaXY7CiAJdTMyIGRpdjsKIAl1OCBidWZbNF07CiAJc3RydWN0IGkyY19tc2cgbXNnID0gey5hZGRyID0gMHg2MCwuZmxhZ3MgPSAwLC5idWYgPSBidWYsLmxlbiA9IHNpemVvZihidWYpIH07CkBAIC02NDksNyArNjQ5LDkgQEAKIAllbHNlIGlmIChwYXJhbXMtPmZyZXF1ZW5jeSA8IDIxNTAwMDApCiAJCWJ1ZlszXSB8PSAweEMwOwogCi0JaWYgKGkyY190cmFuc2ZlcihpMmMsICZtc2csIDEpICE9IDEpCisJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKKwlpZiAoaTJjX3RyYW5zZmVyKCZidWRnZXRfY2ktPmJ1ZGdldC5pMmNfYWRhcCwgJm1zZywgMSkgIT0gMSkKIAkJcmV0dXJuIC1FSU87CiAJcmV0dXJuIDA7CiB9CkBAIC02NjUsMTIgKzY2NywxMSBAQAogCS52b2x0MTNfb3AwX29wMSA9IFNUVjAyOTlfVk9MVDEzX09QMSwKIAkubWluX2RlbGF5X21zID0gNTAsCiAJLnNldF9zeW1ib2xfcmF0ZSA9IHBoaWxpcHNfc3UxMjc4X3R0X3NldF9zeW1ib2xfcmF0ZSwKLQkucGxsX3NldCA9IHBoaWxpcHNfc3UxMjc4X3R0X3BsbF9zZXQsCiB9OwogCiAKIAotc3RhdGljIGludCBwaGlsaXBzX3RkbTEzMTZsX3BsbF9pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQorc3RhdGljIGludCBwaGlsaXBzX3RkbTEzMTZsX3R1bmVyX2luaXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCiB7CiAJc3RydWN0IGJ1ZGdldF9jaSAqYnVkZ2V0X2NpID0gKHN0cnVjdCBidWRnZXRfY2kgKikgZmUtPmR2Yi0+cHJpdjsKIAlzdGF0aWMgdTggdGQxMzE2X2luaXRbXSA9IHsgMHgwYiwgMHhmNSwgMHg4NSwgMHhhYiB9OwpAQCAtNjc5LDYgKzY4MCw4IEBACiAJCQlzaXplb2YodGQxMzE2X2luaXQpIH07CiAKIAkvLyBzZXR1cCBQTEwgY29uZmlndXJhdGlvbgorCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMSk7CiAJaWYgKGkyY190cmFuc2ZlcigmYnVkZ2V0X2NpLT5idWRnZXQuaTJjX2FkYXAsICZ0dW5lcl9tc2csIDEpICE9IDEpCiAJCXJldHVybiAtRUlPOwogCW1zbGVlcCgxKTsKQEAgLTY4NywxNCArNjkwLDE4IEBACiAJdHVuZXJfbXNnLmFkZHIgPSAweDY1OwogCXR1bmVyX21zZy5idWYgPSBkaXNhYmxlX21jNDRCQzM3NGM7CiAJdHVuZXJfbXNnLmxlbiA9IHNpemVvZihkaXNhYmxlX21jNDRCQzM3NGMpOworCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMSk7CiAJaWYgKGkyY190cmFuc2ZlcigmYnVkZ2V0X2NpLT5idWRnZXQuaTJjX2FkYXAsICZ0dW5lcl9tc2csIDEpICE9IDEpIHsKKwkJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMSk7CiAJCWkyY190cmFuc2ZlcigmYnVkZ2V0X2NpLT5idWRnZXQuaTJjX2FkYXAsICZ0dW5lcl9tc2csIDEpOwogCX0KIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHBoaWxpcHNfdGRtMTMxNmxfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMpCitzdGF0aWMgaW50IHBoaWxpcHNfdGRtMTMxNmxfdHVuZXJfc2V0X3BhcmFtcyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMpCiB7CiAJc3RydWN0IGJ1ZGdldF9jaSAqYnVkZ2V0X2NpID0gKHN0cnVjdCBidWRnZXRfY2kgKikgZmUtPmR2Yi0+cHJpdjsKIAl1OCB0dW5lcl9idWZbNF07CkBAIC03NzAsNiArNzc3LDggQEAKIAl0dW5lcl9idWZbMl0gPSAweGNhOwogCXR1bmVyX2J1ZlszXSA9IChjcCA8PCA1KSB8IChmaWx0ZXIgPDwgMykgfCBiYW5kOwogCisJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKIAlpZiAoaTJjX3RyYW5zZmVyKCZidWRnZXRfY2ktPmJ1ZGdldC5pMmNfYWRhcCwgJnR1bmVyX21zZywgMSkgIT0gMSkKIAkJcmV0dXJuIC1FSU87CiAKQEAgLTc5MywxMyArODAyLDEwIEBACiAJLnh0YWxfZnJlcSA9IFREQTEwMDQ2X1hUQUxfNE0sCiAJLmFnY19jb25maWcgPSBUREExMDA0Nl9BR0NfREVGQVVMVCwKIAkuaWZfZnJlcSA9IFREQTEwMDQ2X0ZSRVFfMzYxNywKLQkucGxsX2luaXQgPSBwaGlsaXBzX3RkbTEzMTZsX3BsbF9pbml0LAotCS5wbGxfc2V0ID0gcGhpbGlwc190ZG0xMzE2bF9wbGxfc2V0LAotCS5wbGxfc2xlZXAgPSBOVUxMLAogCS5yZXF1ZXN0X2Zpcm13YXJlID0gcGhpbGlwc190ZG0xMzE2bF9yZXF1ZXN0X2Zpcm13YXJlLAogfTsKIAotc3RhdGljIGludCBkdmJjX3BoaWxpcHNfdGRtMTMxNmxfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMpCitzdGF0aWMgaW50IGR2YmNfcGhpbGlwc190ZG0xMzE2bF90dW5lcl9zZXRfcGFyYW1zKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnBhcmFtcykKIHsKIAlzdHJ1Y3QgYnVkZ2V0X2NpICpidWRnZXRfY2kgPSAoc3RydWN0IGJ1ZGdldF9jaSAqKSBmZS0+ZHZiLT5wcml2OwogCXU4IHR1bmVyX2J1Zls1XTsKQEAgLTg1NywxMyArODYzLDE1IEBACiAJdHVuZXJfYnVmWzNdID0gKGNwIDw8IDUpIHwgKGZpbHRlciA8PCAzKSB8IGJhbmQ7CiAJdHVuZXJfYnVmWzRdID0gMHg4MDsKIAotCXN0djAyOTdfZW5hYmxlX3BsbGkyYyhmZSk7CisJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKIAlpZiAoaTJjX3RyYW5zZmVyKCZidWRnZXRfY2ktPmJ1ZGdldC5pMmNfYWRhcCwgJnR1bmVyX21zZywgMSkgIT0gMSkKIAkJcmV0dXJuIC1FSU87CiAKIAltc2xlZXAoNTApOwogCi0Jc3R2MDI5N19lbmFibGVfcGxsaTJjKGZlKTsKKwlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDEpOwogCWlmIChpMmNfdHJhbnNmZXIoJmJ1ZGdldF9jaS0+YnVkZ2V0LmkyY19hZGFwLCAmdHVuZXJfbXNnLCAxKSAhPSAxKQogCQlyZXR1cm4gLUVJTzsKIApAQCAtOTY5LDcgKzk3Nyw3IEBACiAJLmRlbW9kX2FkZHJlc3MgPSAweDFjLAogCS5pbml0dGFiID0gZHZiY19waGlsaXBzX3RkbTEzMTZsX2luaXR0YWIsCiAJLmludmVydCA9IDAsCi0JLnBsbF9zZXQgPSBkdmJjX3BoaWxpcHNfdGRtMTMxNmxfcGxsX3NldCwKKwkuc3RvcF9kdXJpbmdfcmVhZCA9IDEsCiB9OwogCiAKQEAgLTk4Miw2ICs5OTAsOCBAQAogCQlidWRnZXRfY2ktPmJ1ZGdldC5kdmJfZnJvbnRlbmQgPQogCQkJc3R2MDI5OV9hdHRhY2goJmFscHNfYnNydTZfY29uZmlnLCAmYnVkZ2V0X2NpLT5idWRnZXQuaTJjX2FkYXApOwogCQlpZiAoYnVkZ2V0X2NpLT5idWRnZXQuZHZiX2Zyb250ZW5kKSB7CisJCQlidWRnZXRfY2ktPmJ1ZGdldC5kdmJfZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IGFscHNfYnNydTZfdHVuZXJfc2V0X3BhcmFtczsKKwkJCWJ1ZGdldF9jaS0+YnVkZ2V0LmR2Yl9mcm9udGVuZC0+dHVuZXJfcHJpdiA9ICZidWRnZXRfY2ktPmJ1ZGdldC5pMmNfYWRhcDsKIAkJCWJyZWFrOwogCQl9CiAJCWJyZWFrOwpAQCAtOTkwLDYgKzEwMDAsNyBAQAogCQlidWRnZXRfY2ktPmJ1ZGdldC5kdmJfZnJvbnRlbmQgPQogCQkJc3R2MDI5OV9hdHRhY2goJnBoaWxpcHNfc3UxMjc4X3R0X2NvbmZpZywgJmJ1ZGdldF9jaS0+YnVkZ2V0LmkyY19hZGFwKTsKIAkJaWYgKGJ1ZGdldF9jaS0+YnVkZ2V0LmR2Yl9mcm9udGVuZCkgeworCQkJYnVkZ2V0X2NpLT5idWRnZXQuZHZiX2Zyb250ZW5kLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBwaGlsaXBzX3N1MTI3OF90dF90dW5lcl9zZXRfcGFyYW1zOwogCQkJYnJlYWs7CiAJCX0KIAkJYnJlYWs7CkBAIC05OTksNiArMTAxMCw3IEBACiAJCWJ1ZGdldF9jaS0+YnVkZ2V0LmR2Yl9mcm9udGVuZCA9CiAJCQlzdHYwMjk3X2F0dGFjaCgmZHZiY19waGlsaXBzX3RkbTEzMTZsX2NvbmZpZywgJmJ1ZGdldF9jaS0+YnVkZ2V0LmkyY19hZGFwKTsKIAkJaWYgKGJ1ZGdldF9jaS0+YnVkZ2V0LmR2Yl9mcm9udGVuZCkgeworCQkJYnVkZ2V0X2NpLT5idWRnZXQuZHZiX2Zyb250ZW5kLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBkdmJjX3BoaWxpcHNfdGRtMTMxNmxfdHVuZXJfc2V0X3BhcmFtczsKIAkJCWJyZWFrOwogCQl9CiAJCWJyZWFrOwpAQCAtMTAwOCw2ICsxMDIwLDggQEAKIAkJYnVkZ2V0X2NpLT5idWRnZXQuZHZiX2Zyb250ZW5kID0KIAkJCXRkYTEwMDQ1X2F0dGFjaCgmcGhpbGlwc190ZG0xMzE2bF9jb25maWcsICZidWRnZXRfY2ktPmJ1ZGdldC5pMmNfYWRhcCk7CiAJCWlmIChidWRnZXRfY2ktPmJ1ZGdldC5kdmJfZnJvbnRlbmQpIHsKKwkJCWJ1ZGdldF9jaS0+YnVkZ2V0LmR2Yl9mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5pbml0ID0gcGhpbGlwc190ZG0xMzE2bF90dW5lcl9pbml0OworCQkJYnVkZ2V0X2NpLT5idWRnZXQuZHZiX2Zyb250ZW5kLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBwaGlsaXBzX3RkbTEzMTZsX3R1bmVyX3NldF9wYXJhbXM7CiAJCQlicmVhazsKIAkJfQogCQlicmVhazsKQEAgLTEwMTcsNiArMTAzMSw4IEBACiAJCWJ1ZGdldF9jaS0+YnVkZ2V0LmR2Yl9mcm9udGVuZCA9CiAJCQl0ZGExMDA0Nl9hdHRhY2goJnBoaWxpcHNfdGRtMTMxNmxfY29uZmlnLCAmYnVkZ2V0X2NpLT5idWRnZXQuaTJjX2FkYXApOwogCQlpZiAoYnVkZ2V0X2NpLT5idWRnZXQuZHZiX2Zyb250ZW5kKSB7CisJCQlidWRnZXRfY2ktPmJ1ZGdldC5kdmJfZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuaW5pdCA9IHBoaWxpcHNfdGRtMTMxNmxfdHVuZXJfaW5pdDsKKwkJCWJ1ZGdldF9jaS0+YnVkZ2V0LmR2Yl9mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gcGhpbGlwc190ZG0xMzE2bF90dW5lcl9zZXRfcGFyYW1zOwogCQkJYnJlYWs7CiAJCX0KIAkJYnJlYWs7CkBAIC0xMDI0LDExICsxMDQwLDE0IEBACiAJY2FzZSAweDEwMTc6CQkvLyBUVCBTLTE1MDAgUENJCiAJCWJ1ZGdldF9jaS0+YnVkZ2V0LmR2Yl9mcm9udGVuZCA9IHN0djAyOTlfYXR0YWNoKCZhbHBzX2JzYmUxX2NvbmZpZywgJmJ1ZGdldF9jaS0+YnVkZ2V0LmkyY19hZGFwKTsKIAkJaWYgKGJ1ZGdldF9jaS0+YnVkZ2V0LmR2Yl9mcm9udGVuZCkgewotCQkJYnVkZ2V0X2NpLT5idWRnZXQuZHZiX2Zyb250ZW5kLT5vcHMtPmRpc2huZXR3b3JrX3NlbmRfbGVnYWN5X2NvbW1hbmQgPSBOVUxMOwotCQkJaWYgKGxuYnAyMV9pbml0KGJ1ZGdldF9jaS0+YnVkZ2V0LmR2Yl9mcm9udGVuZCwgJmJ1ZGdldF9jaS0+YnVkZ2V0LmkyY19hZGFwLCBMTkJQMjFfTExDLCAwKSkgeworCQkJYnVkZ2V0X2NpLT5idWRnZXQuZHZiX2Zyb250ZW5kLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBhbHBzX2JzYmUxX3R1bmVyX3NldF9wYXJhbXM7CisJCQlidWRnZXRfY2ktPmJ1ZGdldC5kdmJfZnJvbnRlbmQtPnR1bmVyX3ByaXYgPSAmYnVkZ2V0X2NpLT5idWRnZXQuaTJjX2FkYXA7CisKKwkJCWJ1ZGdldF9jaS0+YnVkZ2V0LmR2Yl9mcm9udGVuZC0+b3BzLmRpc2huZXR3b3JrX3NlbmRfbGVnYWN5X2NvbW1hbmQgPSBOVUxMOworCQkJaWYgKGxuYnAyMV9hdHRhY2goYnVkZ2V0X2NpLT5idWRnZXQuZHZiX2Zyb250ZW5kLCAmYnVkZ2V0X2NpLT5idWRnZXQuaTJjX2FkYXAsIExOQlAyMV9MTEMsIDApKSB7CiAJCQkJcHJpbnRrKCIlczogTm8gTE5CUDIxIGZvdW5kIVxuIiwgX19GVU5DVElPTl9fKTsKLQkJCQlpZiAoYnVkZ2V0X2NpLT5idWRnZXQuZHZiX2Zyb250ZW5kLT5vcHMtPnJlbGVhc2UpCi0JCQkJCWJ1ZGdldF9jaS0+YnVkZ2V0LmR2Yl9mcm9udGVuZC0+b3BzLT5yZWxlYXNlKGJ1ZGdldF9jaS0+YnVkZ2V0LmR2Yl9mcm9udGVuZCk7CisJCQkJaWYgKGJ1ZGdldF9jaS0+YnVkZ2V0LmR2Yl9mcm9udGVuZC0+b3BzLnJlbGVhc2UpCisJCQkJCWJ1ZGdldF9jaS0+YnVkZ2V0LmR2Yl9mcm9udGVuZC0+b3BzLnJlbGVhc2UoYnVkZ2V0X2NpLT5idWRnZXQuZHZiX2Zyb250ZW5kKTsKIAkJCQlidWRnZXRfY2ktPmJ1ZGdldC5kdmJfZnJvbnRlbmQgPSBOVUxMOwogCQkJfQogCQl9CkBAIC0xMDQ2LDggKzEwNjUsOCBAQAogCQlpZiAoZHZiX3JlZ2lzdGVyX2Zyb250ZW5kCiAJCSAgICAoJmJ1ZGdldF9jaS0+YnVkZ2V0LmR2Yl9hZGFwdGVyLCBidWRnZXRfY2ktPmJ1ZGdldC5kdmJfZnJvbnRlbmQpKSB7CiAJCQlwcmludGsoImJ1ZGdldC1jaTogRnJvbnRlbmQgcmVnaXN0cmF0aW9uIGZhaWxlZCFcbiIpOwotCQkJaWYgKGJ1ZGdldF9jaS0+YnVkZ2V0LmR2Yl9mcm9udGVuZC0+b3BzLT5yZWxlYXNlKQotCQkJCWJ1ZGdldF9jaS0+YnVkZ2V0LmR2Yl9mcm9udGVuZC0+b3BzLT5yZWxlYXNlKGJ1ZGdldF9jaS0+YnVkZ2V0LmR2Yl9mcm9udGVuZCk7CisJCQlpZiAoYnVkZ2V0X2NpLT5idWRnZXQuZHZiX2Zyb250ZW5kLT5vcHMucmVsZWFzZSkKKwkJCQlidWRnZXRfY2ktPmJ1ZGdldC5kdmJfZnJvbnRlbmQtPm9wcy5yZWxlYXNlKGJ1ZGdldF9jaS0+YnVkZ2V0LmR2Yl9mcm9udGVuZCk7CiAJCQlidWRnZXRfY2ktPmJ1ZGdldC5kdmJfZnJvbnRlbmQgPSBOVUxMOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LWNvcmUuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC1jb3JlLmMKaW5kZXggZWEyMDY2ZC4uZTRjZjc3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LWNvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQtY29yZS5jCkBAIC00MDAsNyArNDAwLDkgQEAKIAkJYnVkZ2V0LT5kZXYtPm5hbWUsIGJ1ZGdldC0+YnVmZmVyX3dpZHRoLCBidWRnZXQtPmJ1ZmZlcl9oZWlnaHQpOwogCXByaW50aygiJXM6IGRtYSBidWZmZXIgc2l6ZSAldVxuIiwgYnVkZ2V0LT5kZXYtPm5hbWUsIGJ1ZGdldC0+YnVmZmVyX3NpemUpOwogCi0JZHZiX3JlZ2lzdGVyX2FkYXB0ZXIoJmJ1ZGdldC0+ZHZiX2FkYXB0ZXIsIGJ1ZGdldC0+Y2FyZC0+bmFtZSwgb3duZXIpOworCWlmICgocmV0ID0gZHZiX3JlZ2lzdGVyX2FkYXB0ZXIoJmJ1ZGdldC0+ZHZiX2FkYXB0ZXIsIGJ1ZGdldC0+Y2FyZC0+bmFtZSwgb3duZXIsICZidWRnZXQtPmRldi0+cGNpLT5kZXYpKSA8IDApIHsKKwkJcmV0dXJuIHJldDsKKwl9CiAKIAkvKiBzZXQgZGQxIHN0cmVhbSBhICYgYiAqLwogCXNhYTcxNDZfd3JpdGUoZGV2LCBERDFfU1RSRUFNX0IsIDB4MDAwMDAwMDApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LXBhdGNoLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQtcGF0Y2guYwppbmRleCAxYjNhYWFjLi5lZTYwY2U5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQtcGF0Y2guYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQtcGF0Y2guYwpAQCAtMjU4LDcgKzI1OCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYWxwc19ic3J2Ml9wbGxfc2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcykKK3N0YXRpYyBpbnQgYWxwc19ic3J2Ml90dW5lcl9zZXRfcGFyYW1zKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcykKIHsKIAlzdHJ1Y3QgYnVkZ2V0X3BhdGNoKiBidWRnZXQgPSAoc3RydWN0IGJ1ZGdldF9wYXRjaCopIGZlLT5kdmItPnByaXY7CiAJdTggcHdyID0gMDsKQEAgLTI4MSw3ICsyODEsMTAgQEAKIAkvLyBOT1RFOiBzaW5jZSB3ZSdyZSB1c2luZyBhIHByZXNjYWxlciBvZiAyLCB3ZSBzZXQgdGhlCiAJLy8gZGl2aXNvciBmcmVxdWVuY3kgdG8gNjIuNWtIeiBhbmQgZGl2aWRlIGJ5IDEyNSBhYm92ZQogCi0JaWYgKGkyY190cmFuc2ZlciAoJmJ1ZGdldC0+aTJjX2FkYXAsICZtc2csIDEpICE9IDEpIHJldHVybiAtRUlPOworCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMSk7CisJaWYgKGkyY190cmFuc2ZlciAoJmJ1ZGdldC0+aTJjX2FkYXAsICZtc2csIDEpICE9IDEpCisJCXJldHVybiAtRUlPOwogCXJldHVybiAwOwogfQogCkBAIC0yODksMTAgKzI5Miw5IEBACiAJLmRlbW9kX2FkZHJlc3MgPSAweDA4LAogCS54aW4gPSA5MDEwMDAwMFVMLAogCS5pbnZlcnRfcHdtID0gMCwKLQkucGxsX3NldCA9IGFscHNfYnNydjJfcGxsX3NldCwKIH07CiAKLXN0YXRpYyBpbnQgZ3J1bmRpZ18yOTUwNF80NTFfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMpCitzdGF0aWMgaW50IGdydW5kaWdfMjk1MDRfNDUxX3R1bmVyX3NldF9wYXJhbXMoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyogcGFyYW1zKQogewogCXN0cnVjdCBidWRnZXRfcGF0Y2gqIGJ1ZGdldCA9IChzdHJ1Y3QgYnVkZ2V0X3BhdGNoKikgZmUtPmR2Yi0+cHJpdjsKIAl1MzIgZGl2OwpAQCAtMzA1LDEzICszMDcsMTUgQEAKIAlkYXRhWzJdID0gMHg4ZTsKIAlkYXRhWzNdID0gMHgwMDsKIAotCWlmIChpMmNfdHJhbnNmZXIgKCZidWRnZXQtPmkyY19hZGFwLCAmbXNnLCAxKSAhPSAxKSByZXR1cm4gLUVJTzsKKwlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDEpOworCWlmIChpMmNfdHJhbnNmZXIgKCZidWRnZXQtPmkyY19hZGFwLCAmbXNnLCAxKSAhPSAxKQorCQlyZXR1cm4gLUVJTzsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHN0cnVjdCB0ZGE4MDgzX2NvbmZpZyBncnVuZGlnXzI5NTA0XzQ1MV9jb25maWcgPSB7CiAJLmRlbW9kX2FkZHJlc3MgPSAweDY4LAotCS5wbGxfc2V0ID0gZ3J1bmRpZ18yOTUwNF80NTFfcGxsX3NldCwKIH07CiAKIHN0YXRpYyB2b2lkIGZyb250ZW5kX2luaXQoc3RydWN0IGJ1ZGdldF9wYXRjaCogYnVkZ2V0KQpAQCAtMzIzLDI3ICszMjcsMzIgQEAKIAkJLy8gdHJ5IHRoZSBBTFBTIEJTUlYyIGZpcnN0IG9mIGFsbAogCQlidWRnZXQtPmR2Yl9mcm9udGVuZCA9IHZlczF4OTNfYXR0YWNoKCZhbHBzX2JzcnYyX2NvbmZpZywgJmJ1ZGdldC0+aTJjX2FkYXApOwogCQlpZiAoYnVkZ2V0LT5kdmJfZnJvbnRlbmQpIHsKLQkJCWJ1ZGdldC0+ZHZiX2Zyb250ZW5kLT5vcHMtPmRpc2VxY19zZW5kX21hc3Rlcl9jbWQgPSBidWRnZXRfcGF0Y2hfZGlzZXFjX3NlbmRfbWFzdGVyX2NtZDsKLQkJCWJ1ZGdldC0+ZHZiX2Zyb250ZW5kLT5vcHMtPmRpc2VxY19zZW5kX2J1cnN0ID0gYnVkZ2V0X3BhdGNoX2Rpc2VxY19zZW5kX2J1cnN0OwotCQkJYnVkZ2V0LT5kdmJfZnJvbnRlbmQtPm9wcy0+c2V0X3RvbmUgPSBidWRnZXRfcGF0Y2hfc2V0X3RvbmU7CisJCQlidWRnZXQtPmR2Yl9mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gYWxwc19ic3J2Ml90dW5lcl9zZXRfcGFyYW1zOworCQkJYnVkZ2V0LT5kdmJfZnJvbnRlbmQtPm9wcy5kaXNlcWNfc2VuZF9tYXN0ZXJfY21kID0gYnVkZ2V0X3BhdGNoX2Rpc2VxY19zZW5kX21hc3Rlcl9jbWQ7CisJCQlidWRnZXQtPmR2Yl9mcm9udGVuZC0+b3BzLmRpc2VxY19zZW5kX2J1cnN0ID0gYnVkZ2V0X3BhdGNoX2Rpc2VxY19zZW5kX2J1cnN0OworCQkJYnVkZ2V0LT5kdmJfZnJvbnRlbmQtPm9wcy5zZXRfdG9uZSA9IGJ1ZGdldF9wYXRjaF9zZXRfdG9uZTsKIAkJCWJyZWFrOwogCQl9CiAKIAkJLy8gdHJ5IHRoZSBBTFBTIEJTUlU2IG5vdwogCQlidWRnZXQtPmR2Yl9mcm9udGVuZCA9IHN0djAyOTlfYXR0YWNoKCZhbHBzX2JzcnU2X2NvbmZpZywgJmJ1ZGdldC0+aTJjX2FkYXApOwogCQlpZiAoYnVkZ2V0LT5kdmJfZnJvbnRlbmQpIHsKLQkJCWJ1ZGdldC0+ZHZiX2Zyb250ZW5kLT5vcHMtPmRpc2VxY19zZW5kX21hc3Rlcl9jbWQgPSBidWRnZXRfZGlzZXFjX3NlbmRfbWFzdGVyX2NtZDsKLQkJCWJ1ZGdldC0+ZHZiX2Zyb250ZW5kLT5vcHMtPmRpc2VxY19zZW5kX2J1cnN0ID0gYnVkZ2V0X2Rpc2VxY19zZW5kX2J1cnN0OwotCQkJYnVkZ2V0LT5kdmJfZnJvbnRlbmQtPm9wcy0+c2V0X3RvbmUgPSBidWRnZXRfc2V0X3RvbmU7CisJCQlidWRnZXQtPmR2Yl9mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gYWxwc19ic3J1Nl90dW5lcl9zZXRfcGFyYW1zOworCQkJYnVkZ2V0LT5kdmJfZnJvbnRlbmQtPnR1bmVyX3ByaXYgPSAmYnVkZ2V0LT5pMmNfYWRhcDsKKworCQkJYnVkZ2V0LT5kdmJfZnJvbnRlbmQtPm9wcy5kaXNlcWNfc2VuZF9tYXN0ZXJfY21kID0gYnVkZ2V0X2Rpc2VxY19zZW5kX21hc3Rlcl9jbWQ7CisJCQlidWRnZXQtPmR2Yl9mcm9udGVuZC0+b3BzLmRpc2VxY19zZW5kX2J1cnN0ID0gYnVkZ2V0X2Rpc2VxY19zZW5kX2J1cnN0OworCQkJYnVkZ2V0LT5kdmJfZnJvbnRlbmQtPm9wcy5zZXRfdG9uZSA9IGJ1ZGdldF9zZXRfdG9uZTsKIAkJCWJyZWFrOwogCQl9CiAKIAkJLy8gVHJ5IHRoZSBncnVuZGlnIDI5NTA0LTQ1MQogCQlidWRnZXQtPmR2Yl9mcm9udGVuZCA9IHRkYTgwODNfYXR0YWNoKCZncnVuZGlnXzI5NTA0XzQ1MV9jb25maWcsICZidWRnZXQtPmkyY19hZGFwKTsKIAkJaWYgKGJ1ZGdldC0+ZHZiX2Zyb250ZW5kKSB7Ci0JCQlidWRnZXQtPmR2Yl9mcm9udGVuZC0+b3BzLT5kaXNlcWNfc2VuZF9tYXN0ZXJfY21kID0gYnVkZ2V0X2Rpc2VxY19zZW5kX21hc3Rlcl9jbWQ7Ci0JCQlidWRnZXQtPmR2Yl9mcm9udGVuZC0+b3BzLT5kaXNlcWNfc2VuZF9idXJzdCA9IGJ1ZGdldF9kaXNlcWNfc2VuZF9idXJzdDsKLQkJCWJ1ZGdldC0+ZHZiX2Zyb250ZW5kLT5vcHMtPnNldF90b25lID0gYnVkZ2V0X3NldF90b25lOworCQkJYnVkZ2V0LT5kdmJfZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IGdydW5kaWdfMjk1MDRfNDUxX3R1bmVyX3NldF9wYXJhbXM7CisJCQlidWRnZXQtPmR2Yl9mcm9udGVuZC0+b3BzLmRpc2VxY19zZW5kX21hc3Rlcl9jbWQgPSBidWRnZXRfZGlzZXFjX3NlbmRfbWFzdGVyX2NtZDsKKwkJCWJ1ZGdldC0+ZHZiX2Zyb250ZW5kLT5vcHMuZGlzZXFjX3NlbmRfYnVyc3QgPSBidWRnZXRfZGlzZXFjX3NlbmRfYnVyc3Q7CisJCQlidWRnZXQtPmR2Yl9mcm9udGVuZC0+b3BzLnNldF90b25lID0gYnVkZ2V0X3NldF90b25lOwogCQkJYnJlYWs7CiAJCX0KIAkJYnJlYWs7CkBAIC0zNTgsOCArMzY3LDggQEAKIAl9IGVsc2UgewogCQlpZiAoZHZiX3JlZ2lzdGVyX2Zyb250ZW5kKCZidWRnZXQtPmR2Yl9hZGFwdGVyLCBidWRnZXQtPmR2Yl9mcm9udGVuZCkpIHsKIAkJCXByaW50aygiYnVkZ2V0LWF2OiBGcm9udGVuZCByZWdpc3RyYXRpb24gZmFpbGVkIVxuIik7Ci0JCQlpZiAoYnVkZ2V0LT5kdmJfZnJvbnRlbmQtPm9wcy0+cmVsZWFzZSkKLQkJCQlidWRnZXQtPmR2Yl9mcm9udGVuZC0+b3BzLT5yZWxlYXNlKGJ1ZGdldC0+ZHZiX2Zyb250ZW5kKTsKKwkJCWlmIChidWRnZXQtPmR2Yl9mcm9udGVuZC0+b3BzLnJlbGVhc2UpCisJCQkJYnVkZ2V0LT5kdmJfZnJvbnRlbmQtPm9wcy5yZWxlYXNlKGJ1ZGdldC0+ZHZiX2Zyb250ZW5kKTsKIAkJCWJ1ZGdldC0+ZHZiX2Zyb250ZW5kID0gTlVMTDsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LmMKaW5kZXggYzIzYzAyZC4uMzU3NjFmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LmMKQEAgLTE4Niw3ICsxODYsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGFscHNfYnNydjJfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMpCitzdGF0aWMgaW50IGFscHNfYnNydjJfdHVuZXJfc2V0X3BhcmFtcyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMpCiB7CiAJc3RydWN0IGJ1ZGdldCogYnVkZ2V0ID0gKHN0cnVjdCBidWRnZXQqKSBmZS0+ZHZiLT5wcml2OwogCXU4IHB3ciA9IDA7CkBAIC0yMDksNiArMjA5LDggQEAKIAkvLyBOT1RFOiBzaW5jZSB3ZSdyZSB1c2luZyBhIHByZXNjYWxlciBvZiAyLCB3ZSBzZXQgdGhlCiAJLy8gZGl2aXNvciBmcmVxdWVuY3kgdG8gNjIuNWtIeiBhbmQgZGl2aWRlIGJ5IDEyNSBhYm92ZQogCisJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKIAlpZiAoaTJjX3RyYW5zZmVyICgmYnVkZ2V0LT5pMmNfYWRhcCwgJm1zZywgMSkgIT0gMSkgcmV0dXJuIC1FSU87CiAJcmV0dXJuIDA7CiB9CkBAIC0yMTgsMTAgKzIyMCw5IEBACiAJLmRlbW9kX2FkZHJlc3MgPSAweDA4LAogCS54aW4gPSA5MDEwMDAwMFVMLAogCS5pbnZlcnRfcHdtID0gMCwKLQkucGxsX3NldCA9IGFscHNfYnNydjJfcGxsX3NldCwKIH07CiAKLXN0YXRpYyBpbnQgYWxwc190ZGJlMl9wbGxfc2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcykKK3N0YXRpYyBpbnQgYWxwc190ZGJlMl90dW5lcl9zZXRfcGFyYW1zKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcykKIHsKIAlzdHJ1Y3QgYnVkZ2V0KiBidWRnZXQgPSAoc3RydWN0IGJ1ZGdldCopIGZlLT5kdmItPnByaXY7CiAJdTMyIGRpdjsKQEAgLTIzNSw2ICsyMzYsOCBAQAogCWRhdGFbMl0gPSAweDg1IHwgKChkaXYgPj4gMTApICYgMHg2MCk7CiAJZGF0YVszXSA9IChwYXJhbXMtPmZyZXF1ZW5jeSA8IDE3NDAwMDAwMCA/IDB4ODggOiBwYXJhbXMtPmZyZXF1ZW5jeSA8IDQ3MDAwMDAwMCA/IDB4ODQgOiAweDgxKTsKIAorCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMSk7CiAJaWYgKGkyY190cmFuc2ZlciAoJmJ1ZGdldC0+aTJjX2FkYXAsICZtc2csIDEpICE9IDEpIHJldHVybiAtRUlPOwogCXJldHVybiAwOwogfQpAQCAtMjQ0LDEwICsyNDcsOSBAQAogCS54aW4gPSA1Nzg0MDAwMFVMLAogCS5pbnZlcnQgPSAxLAogCS5zZWxhZ2MgPSBWRVMxODIwX1NFTEFHQ19TSUdOQU1QRVJSLAotCS5wbGxfc2V0ID0gYWxwc190ZGJlMl9wbGxfc2V0LAogfTsKIAotc3RhdGljIGludCBncnVuZGlnXzI5NTA0XzQwMV9wbGxfc2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcykKK3N0YXRpYyBpbnQgZ3J1bmRpZ18yOTUwNF80MDFfdHVuZXJfc2V0X3BhcmFtcyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMpCiB7CiAJc3RydWN0IGJ1ZGdldCogYnVkZ2V0ID0gKHN0cnVjdCBidWRnZXQqKSBmZS0+ZHZiLT5wcml2OwogCXUzMiBkaXY7CkBAIC0yNzQsMTYgKzI3NiwxNyBAQAogCWRhdGFbMl0gPSAoKGRpdiA+PiAxMCkgJiAweDYwKSB8IGNmZzsKIAlkYXRhWzNdID0gKGNwdW1wIDw8IDYpIHwgYmFuZF9zZWxlY3Q7CiAKKwlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDEpOwogCWlmIChpMmNfdHJhbnNmZXIgKCZidWRnZXQtPmkyY19hZGFwLCAmbXNnLCAxKSAhPSAxKSByZXR1cm4gLUVJTzsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHN0cnVjdCBsNjQ3ODFfY29uZmlnIGdydW5kaWdfMjk1MDRfNDAxX2NvbmZpZyA9IHsKIAkuZGVtb2RfYWRkcmVzcyA9IDB4NTUsCi0JLnBsbF9zZXQgPSBncnVuZGlnXzI5NTA0XzQwMV9wbGxfc2V0LAogfTsKIAotc3RhdGljIGludCBncnVuZGlnXzI5NTA0XzQ1MV9wbGxfc2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcykKK3N0YXRpYyBpbnQgZ3J1bmRpZ18yOTUwNF80NTFfdHVuZXJfc2V0X3BhcmFtcyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMpCiB7CiAJc3RydWN0IGJ1ZGdldCogYnVkZ2V0ID0gKHN0cnVjdCBidWRnZXQqKSBmZS0+ZHZiLT5wcml2OwogCXUzMiBkaXY7CkBAIC0yOTYsMTYgKzI5OSwxNyBAQAogCWRhdGFbMl0gPSAweDhlOwogCWRhdGFbM10gPSAweDAwOwogCisJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKIAlpZiAoaTJjX3RyYW5zZmVyICgmYnVkZ2V0LT5pMmNfYWRhcCwgJm1zZywgMSkgIT0gMSkgcmV0dXJuIC1FSU87CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgdGRhODA4M19jb25maWcgZ3J1bmRpZ18yOTUwNF80NTFfY29uZmlnID0gewogCS5kZW1vZF9hZGRyZXNzID0gMHg2OCwKLQkucGxsX3NldCA9IGdydW5kaWdfMjk1MDRfNDUxX3BsbF9zZXQsCiB9OwogCi1zdGF0aWMgaW50IHM1aDE0MjBfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMsIHUzMiogZnJlcW91dCkKK3N0YXRpYyBpbnQgczVoMTQyMF90dW5lcl9zZXRfcGFyYW1zKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcykKIHsKIAlzdHJ1Y3QgYnVkZ2V0KiBidWRnZXQgPSAoc3RydWN0IGJ1ZGdldCopIGZlLT5kdmItPnByaXY7CiAJdTMyIGRpdjsKQEAgLTMyNiwxNiArMzMwLDE2IEBACiAJZWxzZQogCQlkYXRhWzNdID0gMHhjMDsKIAorCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMSk7CiAJaWYgKGkyY190cmFuc2ZlciAoJmJ1ZGdldC0+aTJjX2FkYXAsICZtc2csIDEpICE9IDEpIHJldHVybiAtRUlPOwogCi0JKmZyZXFvdXQgPSBkaXYgKiAxMDAwOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3RydWN0IHM1aDE0MjBfY29uZmlnIHM1aDE0MjBfY29uZmlnID0gewogCS5kZW1vZF9hZGRyZXNzID0gMHg1MywKIAkuaW52ZXJ0ID0gMSwKLQkucGxsX3NldCA9IHM1aDE0MjBfcGxsX3NldCwKIH07CiAKIHN0YXRpYyB1OCByZWFkX3B3bShzdHJ1Y3QgYnVkZ2V0KiBidWRnZXQpCkBAIC0zNTksMTggKzM2MywyMSBAQAogCQkvLyB0cnkgdGhlIEFMUFMgQlNSVjIgZmlyc3Qgb2YgYWxsCiAJCWJ1ZGdldC0+ZHZiX2Zyb250ZW5kID0gdmVzMXg5M19hdHRhY2goJmFscHNfYnNydjJfY29uZmlnLCAmYnVkZ2V0LT5pMmNfYWRhcCk7CiAJCWlmIChidWRnZXQtPmR2Yl9mcm9udGVuZCkgewotCQkJYnVkZ2V0LT5kdmJfZnJvbnRlbmQtPm9wcy0+ZGlzZXFjX3NlbmRfbWFzdGVyX2NtZCA9IGJ1ZGdldF9kaXNlcWNfc2VuZF9tYXN0ZXJfY21kOwotCQkJYnVkZ2V0LT5kdmJfZnJvbnRlbmQtPm9wcy0+ZGlzZXFjX3NlbmRfYnVyc3QgPSBidWRnZXRfZGlzZXFjX3NlbmRfYnVyc3Q7Ci0JCQlidWRnZXQtPmR2Yl9mcm9udGVuZC0+b3BzLT5zZXRfdG9uZSA9IGJ1ZGdldF9zZXRfdG9uZTsKKwkJCWJ1ZGdldC0+ZHZiX2Zyb250ZW5kLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBhbHBzX2JzcnYyX3R1bmVyX3NldF9wYXJhbXM7CisJCQlidWRnZXQtPmR2Yl9mcm9udGVuZC0+b3BzLmRpc2VxY19zZW5kX21hc3Rlcl9jbWQgPSBidWRnZXRfZGlzZXFjX3NlbmRfbWFzdGVyX2NtZDsKKwkJCWJ1ZGdldC0+ZHZiX2Zyb250ZW5kLT5vcHMuZGlzZXFjX3NlbmRfYnVyc3QgPSBidWRnZXRfZGlzZXFjX3NlbmRfYnVyc3Q7CisJCQlidWRnZXQtPmR2Yl9mcm9udGVuZC0+b3BzLnNldF90b25lID0gYnVkZ2V0X3NldF90b25lOwogCQkJYnJlYWs7CiAJCX0KIAogCQkvLyB0cnkgdGhlIEFMUFMgQlNSVTYgbm93CiAJCWJ1ZGdldC0+ZHZiX2Zyb250ZW5kID0gc3R2MDI5OV9hdHRhY2goJmFscHNfYnNydTZfY29uZmlnLCAmYnVkZ2V0LT5pMmNfYWRhcCk7CiAJCWlmIChidWRnZXQtPmR2Yl9mcm9udGVuZCkgewotCQkJYnVkZ2V0LT5kdmJfZnJvbnRlbmQtPm9wcy0+ZGlzZXFjX3NlbmRfbWFzdGVyX2NtZCA9IGJ1ZGdldF9kaXNlcWNfc2VuZF9tYXN0ZXJfY21kOwotCQkJYnVkZ2V0LT5kdmJfZnJvbnRlbmQtPm9wcy0+ZGlzZXFjX3NlbmRfYnVyc3QgPSBidWRnZXRfZGlzZXFjX3NlbmRfYnVyc3Q7Ci0JCQlidWRnZXQtPmR2Yl9mcm9udGVuZC0+b3BzLT5zZXRfdG9uZSA9IGJ1ZGdldF9zZXRfdG9uZTsKKwkJCWJ1ZGdldC0+ZHZiX2Zyb250ZW5kLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBhbHBzX2JzcnU2X3R1bmVyX3NldF9wYXJhbXM7CisJCQlidWRnZXQtPmR2Yl9mcm9udGVuZC0+dHVuZXJfcHJpdiA9ICZidWRnZXQtPmkyY19hZGFwOworCQkJYnVkZ2V0LT5kdmJfZnJvbnRlbmQtPm9wcy5kaXNlcWNfc2VuZF9tYXN0ZXJfY21kID0gYnVkZ2V0X2Rpc2VxY19zZW5kX21hc3Rlcl9jbWQ7CisJCQlidWRnZXQtPmR2Yl9mcm9udGVuZC0+b3BzLmRpc2VxY19zZW5kX2J1cnN0ID0gYnVkZ2V0X2Rpc2VxY19zZW5kX2J1cnN0OworCQkJYnVkZ2V0LT5kdmJfZnJvbnRlbmQtPm9wcy5zZXRfdG9uZSA9IGJ1ZGdldF9zZXRfdG9uZTsKIAkJCWJyZWFrOwogCQl9CiAJCWJyZWFrOwpAQCAtMzc4LDM1ICszODUsNDUgQEAKIAljYXNlIDB4MTAwNDogLy8gSGF1cHBhdWdlL1RUIERWQi1DIGJ1ZGdldCAodmVzMTgyMC9BTFBTIFREQkUyKHNwNTY1OSkpCiAKIAkJYnVkZ2V0LT5kdmJfZnJvbnRlbmQgPSB2ZXMxODIwX2F0dGFjaCgmYWxwc190ZGJlMl9jb25maWcsICZidWRnZXQtPmkyY19hZGFwLCByZWFkX3B3bShidWRnZXQpKTsKLQkJaWYgKGJ1ZGdldC0+ZHZiX2Zyb250ZW5kKSBicmVhazsKKwkJaWYgKGJ1ZGdldC0+ZHZiX2Zyb250ZW5kKSB7CisJCQlidWRnZXQtPmR2Yl9mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gYWxwc190ZGJlMl90dW5lcl9zZXRfcGFyYW1zOworCQkJYnJlYWs7CisJCX0KIAkJYnJlYWs7CiAKIAljYXNlIDB4MTAwNTogLy8gSGF1cHBhdWdlL1RUIE5vdmEtVCBidWRnZXQgKEw2NDc4MS9HcnVuZGlnIDI5NTA0LTQwMSh0c2E1MDYwKSkKIAogCQlidWRnZXQtPmR2Yl9mcm9udGVuZCA9IGw2NDc4MV9hdHRhY2goJmdydW5kaWdfMjk1MDRfNDAxX2NvbmZpZywgJmJ1ZGdldC0+aTJjX2FkYXApOwotCQlpZiAoYnVkZ2V0LT5kdmJfZnJvbnRlbmQpIGJyZWFrOworCQlpZiAoYnVkZ2V0LT5kdmJfZnJvbnRlbmQpIHsKKwkJCWJ1ZGdldC0+ZHZiX2Zyb250ZW5kLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBncnVuZGlnXzI5NTA0XzQwMV90dW5lcl9zZXRfcGFyYW1zOworCQkJYnJlYWs7CisJCX0KIAkJYnJlYWs7CiAKIAljYXNlIDB4NGY2MDogLy8gRnVqaXRzdSBTaWVtZW5zIEFjdGl2eSBCdWRnZXQtUyBQQ0kgcmV2IEFMIChzdHYwMjk5L0FMUFMgQlNSVTYodHNhNTA1OSkpCiAJCWJ1ZGdldC0+ZHZiX2Zyb250ZW5kID0gc3R2MDI5OV9hdHRhY2goJmFscHNfYnNydTZfY29uZmlnLCAmYnVkZ2V0LT5pMmNfYWRhcCk7CiAJCWlmIChidWRnZXQtPmR2Yl9mcm9udGVuZCkgewotCQkJYnVkZ2V0LT5kdmJfZnJvbnRlbmQtPm9wcy0+c2V0X3ZvbHRhZ2UgPSBzaWVtZW5zX2J1ZGdldF9zZXRfdm9sdGFnZTsKLQkJCWJ1ZGdldC0+ZHZiX2Zyb250ZW5kLT5vcHMtPmRpc2huZXR3b3JrX3NlbmRfbGVnYWN5X2NvbW1hbmQgPSBOVUxMOworCQkJYnVkZ2V0LT5kdmJfZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IGFscHNfYnNydTZfdHVuZXJfc2V0X3BhcmFtczsKKwkJCWJ1ZGdldC0+ZHZiX2Zyb250ZW5kLT50dW5lcl9wcml2ID0gJmJ1ZGdldC0+aTJjX2FkYXA7CisJCQlidWRnZXQtPmR2Yl9mcm9udGVuZC0+b3BzLnNldF92b2x0YWdlID0gc2llbWVuc19idWRnZXRfc2V0X3ZvbHRhZ2U7CisJCQlidWRnZXQtPmR2Yl9mcm9udGVuZC0+b3BzLmRpc2huZXR3b3JrX3NlbmRfbGVnYWN5X2NvbW1hbmQgPSBOVUxMOwogCQl9CiAJCWJyZWFrOwogCiAJY2FzZSAweDRmNjE6IC8vIEZ1aml0c3UgU2llbWVucyBBY3RpdnkgQnVkZ2V0LVMgUENJIHJldiBHUiAodGRhODA4My9HcnVuZGlnIDI5NTA0LTQ1MSh0c2E1NTIyKSkKIAkJYnVkZ2V0LT5kdmJfZnJvbnRlbmQgPSB0ZGE4MDgzX2F0dGFjaCgmZ3J1bmRpZ18yOTUwNF80NTFfY29uZmlnLCAmYnVkZ2V0LT5pMmNfYWRhcCk7CiAJCWlmIChidWRnZXQtPmR2Yl9mcm9udGVuZCkgewotCQkJYnVkZ2V0LT5kdmJfZnJvbnRlbmQtPm9wcy0+c2V0X3ZvbHRhZ2UgPSBzaWVtZW5zX2J1ZGdldF9zZXRfdm9sdGFnZTsKLQkJCWJ1ZGdldC0+ZHZiX2Zyb250ZW5kLT5vcHMtPmRpc2huZXR3b3JrX3NlbmRfbGVnYWN5X2NvbW1hbmQgPSBOVUxMOworCQkJYnVkZ2V0LT5kdmJfZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IGdydW5kaWdfMjk1MDRfNDUxX3R1bmVyX3NldF9wYXJhbXM7CisJCQlidWRnZXQtPmR2Yl9mcm9udGVuZC0+b3BzLnNldF92b2x0YWdlID0gc2llbWVuc19idWRnZXRfc2V0X3ZvbHRhZ2U7CisJCQlidWRnZXQtPmR2Yl9mcm9udGVuZC0+b3BzLmRpc2huZXR3b3JrX3NlbmRfbGVnYWN5X2NvbW1hbmQgPSBOVUxMOwogCQl9CiAJCWJyZWFrOwogCiAJY2FzZSAweDEwMTY6IC8vIEhhdXBwYXVnZS9UVCBOb3ZhLVMgU0UgKHNhbXN1bmcgczVoMTQyMC8/Pz8/KHRkYTgyNjApKQogCQlidWRnZXQtPmR2Yl9mcm9udGVuZCA9IHM1aDE0MjBfYXR0YWNoKCZzNWgxNDIwX2NvbmZpZywgJmJ1ZGdldC0+aTJjX2FkYXApOwogCQlpZiAoYnVkZ2V0LT5kdmJfZnJvbnRlbmQpIHsKLQkJCWlmIChsbmJwMjFfaW5pdChidWRnZXQtPmR2Yl9mcm9udGVuZCwgJmJ1ZGdldC0+aTJjX2FkYXAsIDAsIDApKSB7CisJCQlidWRnZXQtPmR2Yl9mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gczVoMTQyMF90dW5lcl9zZXRfcGFyYW1zOworCQkJaWYgKGxuYnAyMV9hdHRhY2goYnVkZ2V0LT5kdmJfZnJvbnRlbmQsICZidWRnZXQtPmkyY19hZGFwLCAwLCAwKSkgewogCQkJCXByaW50aygiJXM6IE5vIExOQlAyMSBmb3VuZCFcbiIsIF9fRlVOQ1RJT05fXyk7CiAJCQkJZ290byBlcnJvcl9vdXQ7CiAJCQl9CkBAIC00MjgsOCArNDQ1LDggQEAKIAogZXJyb3Jfb3V0OgogCXByaW50aygiYnVkZ2V0OiBGcm9udGVuZCByZWdpc3RyYXRpb24gZmFpbGVkIVxuIik7Ci0JaWYgKGJ1ZGdldC0+ZHZiX2Zyb250ZW5kLT5vcHMtPnJlbGVhc2UpCi0JCWJ1ZGdldC0+ZHZiX2Zyb250ZW5kLT5vcHMtPnJlbGVhc2UoYnVkZ2V0LT5kdmJfZnJvbnRlbmQpOworCWlmIChidWRnZXQtPmR2Yl9mcm9udGVuZC0+b3BzLnJlbGVhc2UpCisJCWJ1ZGdldC0+ZHZiX2Zyb250ZW5kLT5vcHMucmVsZWFzZShidWRnZXQtPmR2Yl9mcm9udGVuZCk7CiAJYnVkZ2V0LT5kdmJfZnJvbnRlbmQgPSBOVUxMOwogCXJldHVybjsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0dXNiLWJ1ZGdldC9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS9kdmIvdHR1c2ItYnVkZ2V0L0tjb25maWcKaW5kZXggOTE0NTg3ZC4uOTJjN2NkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHR1c2ItYnVkZ2V0L0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHR1c2ItYnVkZ2V0L0tjb25maWcKQEAgLTYsNiArNiw4IEBACiAJc2VsZWN0IERWQl9WRVMxODIwCiAJc2VsZWN0IERWQl9UREE4MDgzCiAJc2VsZWN0IERWQl9TVFYwMjk5CisJc2VsZWN0IERWQl9TVFYwMjk3CisJc2VsZWN0IERWQl9MTkJQMjEKIAloZWxwCiAJICBTdXBwb3J0IGZvciBleHRlcm5hbCBVU0IgYWRhcHRlcnMgZGVzaWduZWQgYnkgVGVjaG5vdHJlbmQgYW5kCiAJICBwcm9kdWNlZCBieSBIYXVwcGF1Z2UsIHNoaXBwZWQgdW5kZXIgdGhlIGJyYW5kIG5hbWUgJ05vdmEtVVNCJy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0dXNiLWJ1ZGdldC9kdmItdHR1c2ItYnVkZ2V0LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHVzYi1idWRnZXQvZHZiLXR0dXNiLWJ1ZGdldC5jCmluZGV4IDZjZWFlMzguLjE0NTU5ZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0dXNiLWJ1ZGdldC9kdmItdHR1c2ItYnVkZ2V0LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHR1c2ItYnVkZ2V0L2R2Yi10dHVzYi1idWRnZXQuYwpAQCAtMzAsNiArMzAsOCBAQAogI2luY2x1ZGUgInRkYTEwMDR4LmgiCiAjaW5jbHVkZSAic3R2MDI5OS5oIgogI2luY2x1ZGUgInRkYTgwODMuaCIKKyNpbmNsdWRlICJzdHYwMjk3LmgiCisjaW5jbHVkZSAibG5icDIxLmgiCiAKICNpbmNsdWRlIDxsaW51eC9kdmIvZnJvbnRlbmQuaD4KICNpbmNsdWRlIDxsaW51eC9kdmIvZG14Lmg+CkBAIC00ODYsMzEgKzQ4OCw2IEBACiB9CiAjZW5kaWYKIAotc3RhdGljIGludCBsbmJwMjFfc2V0X3ZvbHRhZ2Uoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGZlX3NlY192b2x0YWdlX3Qgdm9sdGFnZSkKLXsKLQlzdHJ1Y3QgIHR0dXNiKiB0dHVzYiA9IChzdHJ1Y3QgdHR1c2IqKSAgZmUtPmR2Yi0+cHJpdjsKLQlpbnQgcmV0OwotCXU4IGRhdGFbMV07Ci0Jc3RydWN0IGkyY19tc2cgbXNnID0geyAuYWRkciA9IDB4MDgsIC5mbGFncyA9IDAsIC5idWYgPSBkYXRhLCAubGVuID0gc2l6ZW9mKGRhdGEpIH07Ci0KLQlzd2l0Y2godm9sdGFnZSkgewotCWNhc2UgU0VDX1ZPTFRBR0VfT0ZGOgotCQlkYXRhWzBdID0gMHgwMDsKLQkJYnJlYWs7Ci0JY2FzZSBTRUNfVk9MVEFHRV8xMzoKLQkJZGF0YVswXSA9IDB4NDQ7Ci0JCWJyZWFrOwotCWNhc2UgU0VDX1ZPTFRBR0VfMTg6Ci0JCWRhdGFbMF0gPSAweDRjOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9OwotCi0JcmV0ID0gaTJjX3RyYW5zZmVyKCZ0dHVzYi0+aTJjX2FkYXAsICZtc2csIDEpOwotCXJldHVybiAocmV0ICE9IDEpID8gLUVJTyA6IDA7Ci19Ci0KIHN0YXRpYyBpbnQgdHR1c2JfdXBkYXRlX2xuYihzdHJ1Y3QgdHR1c2IgKnR0dXNiKQogewogCXU4IGJbXSA9IHsgMHhhYSwgKyt0dHVzYi0+YywgMHgxNiwgNSwgLypwb3dlcjogKi8gMSwKQEAgLTEwNDgsNyArMTAyNSw3IEBACiAKIAogCi1zdGF0aWMgaW50IGFscHNfdGRtYjdfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMpCitzdGF0aWMgaW50IGFscHNfdGRtYjdfdHVuZXJfc2V0X3BhcmFtcyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMpCiB7CiAJc3RydWN0IHR0dXNiKiB0dHVzYiA9IChzdHJ1Y3QgdHR1c2IqKSBmZS0+ZHZiLT5wcml2OwogCXU4IGRhdGFbNF07CkBAIC0xMDYyLDIwICsxMDM5LDIxIEBACiAJZGF0YVsyXSA9ICgoZGl2ID4+IDEwKSAmIDB4NjApIHwgMHg4NTsKIAlkYXRhWzNdID0gcGFyYW1zLT5mcmVxdWVuY3kgPCA1OTIwMDAwMDAgPyAweDQwIDogMHg4MDsKIAorCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMSk7CiAJaWYgKGkyY190cmFuc2ZlcigmdHR1c2ItPmkyY19hZGFwLCAmbXNnLCAxKSAhPSAxKSByZXR1cm4gLUVJTzsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHN0cnVjdCBjeDIyNzAwX2NvbmZpZyBhbHBzX3RkbWI3X2NvbmZpZyA9IHsKIAkuZGVtb2RfYWRkcmVzcyA9IDB4NDMsCi0JLnBsbF9zZXQgPSBhbHBzX3RkbWI3X3BsbF9zZXQsCiB9OwogCiAKIAogCiAKLXN0YXRpYyBpbnQgcGhpbGlwc190ZG0xMzE2bF9wbGxfaW5pdChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSkKK3N0YXRpYyBpbnQgcGhpbGlwc190ZG0xMzE2bF90dW5lcl9pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKQogewogCXN0cnVjdCB0dHVzYiogdHR1c2IgPSAoc3RydWN0IHR0dXNiKikgZmUtPmR2Yi0+cHJpdjsKIAlzdGF0aWMgdTggdGQxMzE2X2luaXRbXSA9IHsgMHgwYiwgMHhmNSwgMHg4NSwgMHhhYiB9OwpAQCAtMTA4Myw2ICsxMDYxLDggQEAKIAlzdHJ1Y3QgaTJjX21zZyB0dW5lcl9tc2cgPSB7IC5hZGRyPTB4NjAsIC5mbGFncz0wLCAuYnVmPXRkMTMxNl9pbml0LCAubGVuPXNpemVvZih0ZDEzMTZfaW5pdCkgfTsKIAogCS8vIHNldHVwIFBMTCBjb25maWd1cmF0aW9uCisJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKIAlpZiAoaTJjX3RyYW5zZmVyKCZ0dHVzYi0+aTJjX2FkYXAsICZ0dW5lcl9tc2csIDEpICE9IDEpIHJldHVybiAtRUlPOwogCW1zbGVlcCgxKTsKIApAQCAtMTA5MCw2ICsxMDcwLDggQEAKIAl0dW5lcl9tc2cuYWRkciA9IDB4NjU7CiAJdHVuZXJfbXNnLmJ1ZiA9IGRpc2FibGVfbWM0NEJDMzc0YzsKIAl0dW5lcl9tc2cubGVuID0gc2l6ZW9mKGRpc2FibGVfbWM0NEJDMzc0Yyk7CisJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKIAlpZiAoaTJjX3RyYW5zZmVyKCZ0dHVzYi0+aTJjX2FkYXAsICZ0dW5lcl9tc2csIDEpICE9IDEpIHsKIAkJaTJjX3RyYW5zZmVyKCZ0dHVzYi0+aTJjX2FkYXAsICZ0dW5lcl9tc2csIDEpOwogCX0KQEAgLTEwOTcsNyArMTA3OSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcGhpbGlwc190ZG0xMzE2bF9wbGxfc2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcykKK3N0YXRpYyBpbnQgcGhpbGlwc190ZG0xMzE2bF90dW5lcl9zZXRfcGFyYW1zKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcykKIHsKIAlzdHJ1Y3QgdHR1c2IqIHR0dXNiID0gKHN0cnVjdCB0dHVzYiopIGZlLT5kdmItPnByaXY7CiAJdTggdHVuZXJfYnVmWzRdOwpAQCAtMTE1Nyw2ICsxMTM5LDggQEAKIAl0dW5lcl9idWZbMl0gPSAweGNhOwogCXR1bmVyX2J1ZlszXSA9IChjcCA8PCA1KSB8IChmaWx0ZXIgPDwgMykgfCBiYW5kOwogCisJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKIAlpZiAoaTJjX3RyYW5zZmVyKCZ0dHVzYi0+aTJjX2FkYXAsICZ0dW5lcl9tc2csIDEpICE9IDEpCiAJCXJldHVybiAtRUlPOwogCkBAIC0xMTc2LDggKzExNjAsNiBAQAogCS5kZW1vZF9hZGRyZXNzID0gMHg4LAogCS5pbnZlcnQgPSAxLAogCS5pbnZlcnRfb2NsayA9IDAsCi0JLnBsbF9pbml0ID0gcGhpbGlwc190ZG0xMzE2bF9wbGxfaW5pdCwKLQkucGxsX3NldCA9IHBoaWxpcHNfdGRtMTMxNmxfcGxsX3NldCwKIAkucmVxdWVzdF9maXJtd2FyZSA9IHBoaWxpcHNfdGRtMTMxNmxfcmVxdWVzdF9maXJtd2FyZSwKIH07CiAKQEAgLTEyOTksNyArMTI4MSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcGhpbGlwc190c2E1MDU5X3BsbF9zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnBhcmFtcykKK3N0YXRpYyBpbnQgcGhpbGlwc190c2E1MDU5X3R1bmVyX3NldF9wYXJhbXMoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcGFyYW1zKQogewogCXN0cnVjdCB0dHVzYiogdHR1c2IgPSAoc3RydWN0IHR0dXNiKikgZmUtPmR2Yi0+cHJpdjsKIAl1OCBidWZbNF07CkBAIC0xMzIyLDcgKzEzMDQsOSBAQAogCWlmICh0dHVzYi0+cmV2aXNpb24gPT0gVFRVU0JfUkVWXzJfMikKIAkJYnVmWzNdIHw9IDB4MjA7CiAKLQlpZiAoaTJjX3RyYW5zZmVyKGkyYywgJm1zZywgMSkgIT0gMSkKKwlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDEpOworCWlmIChpMmNfdHJhbnNmZXIoJnR0dXNiLT5pMmNfYWRhcCwgJm1zZywgMSkgIT0gMSkKIAkJcmV0dXJuIC1FSU87CiAKIAlyZXR1cm4gMDsKQEAgLTEzMzgsMTAgKzEzMjIsOSBAQAogCS52b2x0MTNfb3AwX29wMSA9IFNUVjAyOTlfVk9MVDEzX09QMSwKIAkubWluX2RlbGF5X21zID0gMTAwLAogCS5zZXRfc3ltYm9sX3JhdGUgPSBhbHBzX3N0djAyOTlfc2V0X3N5bWJvbF9yYXRlLAotCS5wbGxfc2V0ID0gcGhpbGlwc190c2E1MDU5X3BsbF9zZXQsCiB9OwogCi1zdGF0aWMgaW50IHR0dXNiX25vdmFzX2dydW5kaWdfMjk1MDRfNDkxX3BsbF9zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcGFyYW1zKQorc3RhdGljIGludCB0dHVzYl9ub3Zhc19ncnVuZGlnXzI5NTA0XzQ5MV90dW5lcl9zZXRfcGFyYW1zKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnBhcmFtcykKIHsKIAlzdHJ1Y3QgdHR1c2IqIHR0dXNiID0gKHN0cnVjdCB0dHVzYiopIGZlLT5kdmItPnByaXY7CiAJdTggYnVmWzRdOwpAQCAtMTM1NSw2ICsxMzM4LDggQEAKIAlidWZbMl0gPSAweDhlOwogCWJ1ZlszXSA9IDB4MDA7CiAKKwlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDEpOwogCWlmIChpMmNfdHJhbnNmZXIoJnR0dXNiLT5pMmNfYWRhcCwgJm1zZywgMSkgIT0gMSkKIAkJcmV0dXJuIC1FSU87CiAKQEAgLTEzNjQsMTAgKzEzNDksOSBAQAogc3RhdGljIHN0cnVjdCB0ZGE4MDgzX2NvbmZpZyB0dHVzYl9ub3Zhc19ncnVuZGlnXzI5NTA0XzQ5MV9jb25maWcgPSB7CiAKIAkuZGVtb2RfYWRkcmVzcyA9IDB4NjgsCi0JLnBsbF9zZXQgPSB0dHVzYl9ub3Zhc19ncnVuZGlnXzI5NTA0XzQ5MV9wbGxfc2V0LAogfTsKIAotc3RhdGljIGludCBhbHBzX3RkYmUyX3BsbF9zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyogcGFyYW1zKQorc3RhdGljIGludCBhbHBzX3RkYmUyX3R1bmVyX3NldF9wYXJhbXMoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyogcGFyYW1zKQogewogCXN0cnVjdCB0dHVzYiogdHR1c2IgPSBmZS0+ZHZiLT5wcml2OwogCXUzMiBkaXY7CkBAIC0xMzgxLDYgKzEzNjUsOCBAQAogCWRhdGFbMl0gPSAweDg1IHwgKChkaXYgPj4gMTApICYgMHg2MCk7CiAJZGF0YVszXSA9IChwYXJhbXMtPmZyZXF1ZW5jeSA8IDE3NDAwMDAwMCA/IDB4ODggOiBwYXJhbXMtPmZyZXF1ZW5jeSA8IDQ3MDAwMDAwMCA/IDB4ODQgOiAweDgxKTsKIAorCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMSk7CiAJaWYgKGkyY190cmFuc2ZlciAoJnR0dXNiLT5pMmNfYWRhcCwgJm1zZywgMSkgIT0gMSkKIAkJcmV0dXJuIC1FSU87CiAKQEAgLTEzOTMsNyArMTM3OSw2IEBACiAJLnhpbiA9IDU3ODQwMDAwVUwsCiAJLmludmVydCA9IDEsCiAJLnNlbGFnYyA9IFZFUzE4MjBfU0VMQUdDX1NJR05BTVBFUlIsCi0JLnBsbF9zZXQgPSBhbHBzX3RkYmUyX3BsbF9zZXQsCiB9OwogCiBzdGF0aWMgdTggcmVhZF9wd20oc3RydWN0IHR0dXNiKiB0dHVzYikKQEAgLTE0MTAsNiArMTM5NSwxNzQgQEAKIH0KIAogCitzdGF0aWMgaW50IGR2YmNfcGhpbGlwc190ZG0xMzE2bF90dW5lcl9zZXRfcGFyYW1zKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnBhcmFtcykKK3sKKwlzdHJ1Y3QgdHR1c2IgKnR0dXNiID0gKHN0cnVjdCB0dHVzYiAqKSBmZS0+ZHZiLT5wcml2OworCXU4IHR1bmVyX2J1Zls1XTsKKwlzdHJ1Y3QgaTJjX21zZyB0dW5lcl9tc2cgPSB7LmFkZHIgPSAweDYwLAorCQkJCSAgICAuZmxhZ3MgPSAwLAorCQkJCSAgICAuYnVmID0gdHVuZXJfYnVmLAorCQkJCSAgICAubGVuID0gc2l6ZW9mKHR1bmVyX2J1ZikgfTsKKwlpbnQgdHVuZXJfZnJlcXVlbmN5ID0gMDsKKwl1OCBiYW5kLCBjcCwgZmlsdGVyOworCisJLy8gZGV0ZXJtaW5lIGNoYXJnZSBwdW1wCisJdHVuZXJfZnJlcXVlbmN5ID0gcGFyYW1zLT5mcmVxdWVuY3k7CisJaWYgICAgICAodHVuZXJfZnJlcXVlbmN5IDwgIDg3MDAwMDAwKSB7cmV0dXJuIC1FSU5WQUw7fQorCWVsc2UgaWYgKHR1bmVyX2ZyZXF1ZW5jeSA8IDEzMDAwMDAwMCkge2NwID0gMzsgYmFuZCA9IDE7fQorCWVsc2UgaWYgKHR1bmVyX2ZyZXF1ZW5jeSA8IDE2MDAwMDAwMCkge2NwID0gNTsgYmFuZCA9IDE7fQorCWVsc2UgaWYgKHR1bmVyX2ZyZXF1ZW5jeSA8IDIwMDAwMDAwMCkge2NwID0gNjsgYmFuZCA9IDE7fQorCWVsc2UgaWYgKHR1bmVyX2ZyZXF1ZW5jeSA8IDI5MDAwMDAwMCkge2NwID0gMzsgYmFuZCA9IDI7fQorCWVsc2UgaWYgKHR1bmVyX2ZyZXF1ZW5jeSA8IDQyMDAwMDAwMCkge2NwID0gNTsgYmFuZCA9IDI7fQorCWVsc2UgaWYgKHR1bmVyX2ZyZXF1ZW5jeSA8IDQ4MDAwMDAwMCkge2NwID0gNjsgYmFuZCA9IDI7fQorCWVsc2UgaWYgKHR1bmVyX2ZyZXF1ZW5jeSA8IDYyMDAwMDAwMCkge2NwID0gMzsgYmFuZCA9IDQ7fQorCWVsc2UgaWYgKHR1bmVyX2ZyZXF1ZW5jeSA8IDgzMDAwMDAwMCkge2NwID0gNTsgYmFuZCA9IDQ7fQorCWVsc2UgaWYgKHR1bmVyX2ZyZXF1ZW5jeSA8IDg5NTAwMDAwMCkge2NwID0gNzsgYmFuZCA9IDQ7fQorCWVsc2Uge3JldHVybiAtRUlOVkFMO30KKworCS8vIGFzc3VtZSBQTEwgZmlsdGVyIHNob3VsZCBhbHdheXMgYmUgOE1IeiBmb3IgdGhlIG1vbWVudC4KKwlmaWx0ZXIgPSAxOworCisJLy8gY2FsY3VsYXRlIGRpdmlzb3IKKwkvLyAoRmlucHV0ICsgRmlmKS9GcmVmOyBGaWYgPSAzNjEyNTAwMCBIeiwgRnJlZiA9IDYyNTAwIEh6CisJdHVuZXJfZnJlcXVlbmN5ID0gKChwYXJhbXMtPmZyZXF1ZW5jeSArIDM2MTI1MDAwKSAvIDYyNTAwKTsKKworCS8vIHNldHVwIHR1bmVyIGJ1ZmZlcgorCXR1bmVyX2J1ZlswXSA9IHR1bmVyX2ZyZXF1ZW5jeSA+PiA4OworCXR1bmVyX2J1ZlsxXSA9IHR1bmVyX2ZyZXF1ZW5jeSAmIDB4ZmY7CisJdHVuZXJfYnVmWzJdID0gMHhjODsKKwl0dW5lcl9idWZbM10gPSAoY3AgPDwgNSkgfCAoZmlsdGVyIDw8IDMpIHwgYmFuZDsKKwl0dW5lcl9idWZbNF0gPSAweDgwOworCisJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKKwlpZiAoaTJjX3RyYW5zZmVyKCZ0dHVzYi0+aTJjX2FkYXAsICZ0dW5lcl9tc2csIDEpICE9IDEpIHsKKwkJcHJpbnRrKCJkdmItdHR1c2ItYnVkZ2V0OiBkdmJjX3BoaWxpcHNfdGRtMTMxNmxfcGxsX3NldCBFcnJvciAxXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJbXNsZWVwKDUwKTsKKworCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMSk7CisJaWYgKGkyY190cmFuc2ZlcigmdHR1c2ItPmkyY19hZGFwLCAmdHVuZXJfbXNnLCAxKSAhPSAxKSB7CisJCXByaW50aygiZHZiLXR0dXNiLWJ1ZGdldDogZHZiY19waGlsaXBzX3RkbTEzMTZsX3BsbF9zZXQgRXJyb3IgMlxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCW1zbGVlcCgxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdTggZHZiY19waGlsaXBzX3RkbTEzMTZsX2luaXR0YWJbXSA9IHsKKwkweDgwLCAweDIxLAorCTB4ODAsIDB4MjAsCisJMHg4MSwgMHgwMSwKKwkweDgxLCAweDAwLAorCTB4MDAsIDB4MDksCisJMHgwMSwgMHg2OSwKKwkweDAzLCAweDAwLAorCTB4MDQsIDB4MDAsCisJMHgwNywgMHgwMCwKKwkweDA4LCAweDAwLAorCTB4MjAsIDB4MDAsCisJMHgyMSwgMHg0MCwKKwkweDIyLCAweDAwLAorCTB4MjMsIDB4MDAsCisJMHgyNCwgMHg0MCwKKwkweDI1LCAweDg4LAorCTB4MzAsIDB4ZmYsCisJMHgzMSwgMHgwMCwKKwkweDMyLCAweGZmLAorCTB4MzMsIDB4MDAsCisJMHgzNCwgMHg1MCwKKwkweDM1LCAweDdmLAorCTB4MzYsIDB4MDAsCisJMHgzNywgMHgyMCwKKwkweDM4LCAweDAwLAorCTB4NDAsIDB4MWMsCisJMHg0MSwgMHhmZiwKKwkweDQyLCAweDI5LAorCTB4NDMsIDB4MjAsCisJMHg0NCwgMHhmZiwKKwkweDQ1LCAweDAwLAorCTB4NDYsIDB4MDAsCisJMHg0OSwgMHgwNCwKKwkweDRhLCAweGZmLAorCTB4NGIsIDB4N2YsCisJMHg1MiwgMHgzMCwKKwkweDU1LCAweGFlLAorCTB4NTYsIDB4NDcsCisJMHg1NywgMHhlMSwKKwkweDU4LCAweDNhLAorCTB4NWEsIDB4MWUsCisJMHg1YiwgMHgzNCwKKwkweDYwLCAweDAwLAorCTB4NjMsIDB4MDAsCisJMHg2NCwgMHgwMCwKKwkweDY1LCAweDAwLAorCTB4NjYsIDB4MDAsCisJMHg2NywgMHgwMCwKKwkweDY4LCAweDAwLAorCTB4NjksIDB4MDAsCisJMHg2YSwgMHgwMiwKKwkweDZiLCAweDAwLAorCTB4NzAsIDB4ZmYsCisJMHg3MSwgMHgwMCwKKwkweDcyLCAweDAwLAorCTB4NzMsIDB4MDAsCisJMHg3NCwgMHgwYywKKwkweDgwLCAweDAwLAorCTB4ODEsIDB4MDAsCisJMHg4MiwgMHgwMCwKKwkweDgzLCAweDAwLAorCTB4ODQsIDB4MDQsCisJMHg4NSwgMHg4MCwKKwkweDg2LCAweDI0LAorCTB4ODcsIDB4NzgsCisJMHg4OCwgMHgwMCwKKwkweDg5LCAweDAwLAorCTB4OTAsIDB4MDEsCisJMHg5MSwgMHgwMSwKKwkweGEwLCAweDAwLAorCTB4YTEsIDB4MDAsCisJMHhhMiwgMHgwMCwKKwkweGIwLCAweDkxLAorCTB4YjEsIDB4MGIsCisJMHhjMCwgMHg0YiwKKwkweGMxLCAweDAwLAorCTB4YzIsIDB4MDAsCisJMHhkMCwgMHgwMCwKKwkweGQxLCAweDAwLAorCTB4ZDIsIDB4MDAsCisJMHhkMywgMHgwMCwKKwkweGQ0LCAweDAwLAorCTB4ZDUsIDB4MDAsCisJMHhkZSwgMHgwMCwKKwkweGRmLCAweDAwLAorCTB4NjEsIDB4MzgsCisJMHg2MiwgMHgwYSwKKwkweDUzLCAweDEzLAorCTB4NTksIDB4MDgsCisJMHg1NSwgMHgwMCwKKwkweDU2LCAweDQwLAorCTB4NTcsIDB4MDgsCisJMHg1OCwgMHgzZCwKKwkweDg4LCAweDEwLAorCTB4YTAsIDB4MDAsCisJMHhhMCwgMHgwMCwKKwkweGEwLCAweDAwLAorCTB4YTAsIDB4MDQsCisJMHhmZiwgMHhmZiwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3R2MDI5N19jb25maWcgZHZiY19waGlsaXBzX3RkbTEzMTZsX2NvbmZpZyA9IHsKKwkuZGVtb2RfYWRkcmVzcyA9IDB4MWMsCisJLmluaXR0YWIgPSBkdmJjX3BoaWxpcHNfdGRtMTMxNmxfaW5pdHRhYiwKKwkuaW52ZXJ0ID0gMCwKK307CisKIHN0YXRpYyB2b2lkIGZyb250ZW5kX2luaXQoc3RydWN0IHR0dXNiKiB0dHVzYikKIHsKIAlzd2l0Y2gobGUxNl90b19jcHUodHR1c2ItPmRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpKSB7CkBAIC0xNDE3LDExICsxNTcwLDEzIEBACiAJCS8vIHRyeSB0aGUgc3R2MDI5OSBiYXNlZCBmaXJzdAogCQl0dHVzYi0+ZmUgPSBzdHYwMjk5X2F0dGFjaCgmYWxwc19zdHYwMjk5X2NvbmZpZywgJnR0dXNiLT5pMmNfYWRhcCk7CiAJCWlmICh0dHVzYi0+ZmUgIT0gTlVMTCkgeworCQkJdHR1c2ItPmZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBwaGlsaXBzX3RzYTUwNTlfdHVuZXJfc2V0X3BhcmFtczsKKwogCQkJaWYodHR1c2ItPnJldmlzaW9uID09IFRUVVNCX1JFVl8yXzIpIHsgLy8gQUxQUyBCU0JFMQogCQkJCWFscHNfc3R2MDI5OV9jb25maWcuaW5pdHRhYiA9IGFscHNfYnNiZTFfaW5pdHRhYjsKLQkJCQl0dHVzYi0+ZmUtPm9wcy0+c2V0X3ZvbHRhZ2UgPSBsbmJwMjFfc2V0X3ZvbHRhZ2U7CisJCQkJbG5icDIxX2F0dGFjaCh0dHVzYi0+ZmUsICZ0dHVzYi0+aTJjX2FkYXAsIDAsIDApOwogCQkJfSBlbHNlIHsgLy8gQUxQUyBCU1JVNgotCQkJCXR0dXNiLT5mZS0+b3BzLT5zZXRfdm9sdGFnZSA9IHR0dXNiX3NldF92b2x0YWdlOworCQkJCXR0dXNiLT5mZS0+b3BzLnNldF92b2x0YWdlID0gdHR1c2Jfc2V0X3ZvbHRhZ2U7CiAJCQl9CiAJCQlicmVhazsKIAkJfQpAQCAtMTQyOSwyOCArMTU4NCw0MSBAQAogCQkvLyBHcnVuZGlnIDI5NTA0LTQ5MQogCQl0dHVzYi0+ZmUgPSB0ZGE4MDgzX2F0dGFjaCgmdHR1c2Jfbm92YXNfZ3J1bmRpZ18yOTUwNF80OTFfY29uZmlnLCAmdHR1c2ItPmkyY19hZGFwKTsKIAkJaWYgKHR0dXNiLT5mZSAhPSBOVUxMKSB7Ci0JCQl0dHVzYi0+ZmUtPm9wcy0+c2V0X3ZvbHRhZ2UgPSB0dHVzYl9zZXRfdm9sdGFnZTsKKwkJCXR0dXNiLT5mZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gdHR1c2Jfbm92YXNfZ3J1bmRpZ18yOTUwNF80OTFfdHVuZXJfc2V0X3BhcmFtczsKKwkJCXR0dXNiLT5mZS0+b3BzLnNldF92b2x0YWdlID0gdHR1c2Jfc2V0X3ZvbHRhZ2U7CiAJCQlicmVhazsKIAkJfQotCiAJCWJyZWFrOwogCiAJY2FzZSAweDEwMDQ6IC8vIEhhdXBwYXVnZS9UVCBEVkItQyBidWRnZXQgKHZlczE4MjAvQUxQUyBUREJFMihzcDU2NTkpKQogCQl0dHVzYi0+ZmUgPSB2ZXMxODIwX2F0dGFjaCgmYWxwc190ZGJlMl9jb25maWcsICZ0dHVzYi0+aTJjX2FkYXAsIHJlYWRfcHdtKHR0dXNiKSk7Ci0JCWlmICh0dHVzYi0+ZmUgIT0gTlVMTCkKKwkJaWYgKHR0dXNiLT5mZSAhPSBOVUxMKSB7CisJCQl0dHVzYi0+ZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IGFscHNfdGRiZTJfdHVuZXJfc2V0X3BhcmFtczsKIAkJCWJyZWFrOworCQl9CisKKwkJdHR1c2ItPmZlID0gc3R2MDI5N19hdHRhY2goJmR2YmNfcGhpbGlwc190ZG0xMzE2bF9jb25maWcsICZ0dHVzYi0+aTJjX2FkYXApOworCQlpZiAodHR1c2ItPmZlICE9IE5VTEwpIHsKKwkJCXR0dXNiLT5mZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gZHZiY19waGlsaXBzX3RkbTEzMTZsX3R1bmVyX3NldF9wYXJhbXM7CisJCQlicmVhazsKKwkJfQogCQlicmVhazsKIAogCWNhc2UgMHgxMDA1OiAvLyBIYXVwcGF1Z2UvVFQgTm92YS1VU0ItdCBidWRnZXQgKHRkYTEwMDQ2L1BoaWxpcHMgdGQxMzE2KHRkYTY2NTF0dCkgT1IgY3gyMjcwMC9BTFBTIFRETUI3KD8/KSkKIAkJLy8gdHJ5IHRoZSBBTFBTIFRETUI3IGZpcnN0CiAJCXR0dXNiLT5mZSA9IGN4MjI3MDBfYXR0YWNoKCZhbHBzX3RkbWI3X2NvbmZpZywgJnR0dXNiLT5pMmNfYWRhcCk7Ci0JCWlmICh0dHVzYi0+ZmUgIT0gTlVMTCkKKwkJaWYgKHR0dXNiLT5mZSAhPSBOVUxMKSB7CisJCQl0dHVzYi0+ZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IGFscHNfdGRtYjdfdHVuZXJfc2V0X3BhcmFtczsKIAkJCWJyZWFrOworCQl9CiAKIAkJLy8gUGhpbGlwcyB0ZDEzMTYKIAkJdHR1c2ItPmZlID0gdGRhMTAwNDZfYXR0YWNoKCZwaGlsaXBzX3RkbTEzMTZsX2NvbmZpZywgJnR0dXNiLT5pMmNfYWRhcCk7Ci0JCWlmICh0dHVzYi0+ZmUgIT0gTlVMTCkKKwkJaWYgKHR0dXNiLT5mZSAhPSBOVUxMKSB7CisJCQl0dHVzYi0+ZmUtPm9wcy50dW5lcl9vcHMuaW5pdCA9IHBoaWxpcHNfdGRtMTMxNmxfdHVuZXJfaW5pdDsKKwkJCXR0dXNiLT5mZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gcGhpbGlwc190ZG0xMzE2bF90dW5lcl9zZXRfcGFyYW1zOwogCQkJYnJlYWs7CisJCX0KIAkJYnJlYWs7CiAJfQogCkBAIC0xNDYxLDggKzE2MjksOCBAQAogCX0gZWxzZSB7CiAJCWlmIChkdmJfcmVnaXN0ZXJfZnJvbnRlbmQoJnR0dXNiLT5hZGFwdGVyLCB0dHVzYi0+ZmUpKSB7CiAJCQlwcmludGsoImR2Yi10dHVzYi1idWRnZXQ6IEZyb250ZW5kIHJlZ2lzdHJhdGlvbiBmYWlsZWQhXG4iKTsKLQkJCWlmICh0dHVzYi0+ZmUtPm9wcy0+cmVsZWFzZSkKLQkJCQl0dHVzYi0+ZmUtPm9wcy0+cmVsZWFzZSh0dHVzYi0+ZmUpOworCQkJaWYgKHR0dXNiLT5mZS0+b3BzLnJlbGVhc2UpCisJCQkJdHR1c2ItPmZlLT5vcHMucmVsZWFzZSh0dHVzYi0+ZmUpOwogCQkJdHR1c2ItPmZlID0gTlVMTDsKIAkJfQogCX0KQEAgLTE1MDcsNyArMTY3NSw3IEBACiAKIAltdXRleF91bmxvY2soJnR0dXNiLT5zZW1pMmMpOwogCi0JaWYgKChyZXN1bHQgPSBkdmJfcmVnaXN0ZXJfYWRhcHRlcigmdHR1c2ItPmFkYXB0ZXIsICJUZWNobm90cmVuZC9IYXVwcGF1Z2UgTm92YS1VU0IiLCBUSElTX01PRFVMRSkpIDwgMCkgeworCWlmICgocmVzdWx0ID0gZHZiX3JlZ2lzdGVyX2FkYXB0ZXIoJnR0dXNiLT5hZGFwdGVyLCAiVGVjaG5vdHJlbmQvSGF1cHBhdWdlIE5vdmEtVVNCIiwgVEhJU19NT0RVTEUsICZ1ZGV2LT5kZXYpKSA8IDApIHsKIAkJdHR1c2JfZnJlZV9pc29fdXJicyh0dHVzYik7CiAJCWtmcmVlKHR0dXNiKTsKIAkJcmV0dXJuIHJlc3VsdDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0dXNiLWRlYy90dHVzYl9kZWMuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0dXNiLWRlYy90dHVzYl9kZWMuYwppbmRleCA0NGRlYTMyLi42YzFjYjc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi90dHVzYi1kZWMvdHR1c2JfZGVjLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHR1c2ItZGVjL3R0dXNiX2RlYy5jCkBAIC0xNDMyLDcgKzE0MzIsNyBAQAogCWRwcmludGsoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOwogCiAJaWYgKChyZXN1bHQgPSBkdmJfcmVnaXN0ZXJfYWRhcHRlcigmZGVjLT5hZGFwdGVyLAotCQkJCQkgICBkZWMtPm1vZGVsX25hbWUsIFRISVNfTU9EVUxFKSkgPCAwKSB7CisJCQkJCSAgIGRlYy0+bW9kZWxfbmFtZSwgVEhJU19NT0RVTEUsICZkZWMtPnVkZXYtPmRldikpIDwgMCkgewogCQlwcmludGsoIiVzOiBkdmJfcmVnaXN0ZXJfYWRhcHRlciBmYWlsZWQ6IGVycm9yICVkXG4iLAogCQkgICAgICAgX19GVU5DVElPTl9fLCByZXN1bHQpOwogCkBAIC0xNjU3LDggKzE2NTcsOCBAQAogCX0gZWxzZSB7CiAJCWlmIChkdmJfcmVnaXN0ZXJfZnJvbnRlbmQoJmRlYy0+YWRhcHRlciwgZGVjLT5mZSkpIHsKIAkJCXByaW50aygiYnVkZ2V0LWNpOiBGcm9udGVuZCByZWdpc3RyYXRpb24gZmFpbGVkIVxuIik7Ci0JCQlpZiAoZGVjLT5mZS0+b3BzLT5yZWxlYXNlKQotCQkJCWRlYy0+ZmUtPm9wcy0+cmVsZWFzZShkZWMtPmZlKTsKKwkJCWlmIChkZWMtPmZlLT5vcHMucmVsZWFzZSkKKwkJCQlkZWMtPmZlLT5vcHMucmVsZWFzZShkZWMtPmZlKTsKIAkJCWRlYy0+ZmUgPSBOVUxMOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvdHR1c2ItZGVjL3R0dXNiZGVjZmUuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0dXNiLWRlYy90dHVzYmRlY2ZlLmMKaW5kZXggYTVhNDYxNy4uNDJmMzlhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHR1c2ItZGVjL3R0dXNiZGVjZmUuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHVzYi1kZWMvdHR1c2JkZWNmZS5jCkBAIC0yOCw4ICsyOCw2IEBACiAKIHN0cnVjdCB0dHVzYmRlY2ZlX3N0YXRlIHsKIAotCXN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzIG9wczsKLQogCS8qIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgKi8KIAljb25zdCBzdHJ1Y3QgdHR1c2JkZWNmZV9jb25maWcqIGNvbmZpZzsKIApAQCAtMjAzLDEwICsyMDEsOSBAQAogCiAJLyogc2V0dXAgdGhlIHN0YXRlICovCiAJc3RhdGUtPmNvbmZpZyA9IGNvbmZpZzsKLQltZW1jcHkoJnN0YXRlLT5vcHMsICZ0dHVzYmRlY2ZlX2R2YnRfb3BzLCBzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMpKTsKIAogCS8qIGNyZWF0ZSBkdmJfZnJvbnRlbmQgKi8KLQlzdGF0ZS0+ZnJvbnRlbmQub3BzID0gJnN0YXRlLT5vcHM7CisJbWVtY3B5KCZzdGF0ZS0+ZnJvbnRlbmQub3BzLCAmdHR1c2JkZWNmZV9kdmJ0X29wcywgc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzKSk7CiAJc3RhdGUtPmZyb250ZW5kLmRlbW9kdWxhdG9yX3ByaXYgPSBzdGF0ZTsKIAlyZXR1cm4gJnN0YXRlLT5mcm9udGVuZDsKIH0KQEAgLTIyNiwxMCArMjIzLDkgQEAKIAlzdGF0ZS0+Y29uZmlnID0gY29uZmlnOwogCXN0YXRlLT52b2x0YWdlID0gMDsKIAlzdGF0ZS0+aGlfYmFuZCA9IDA7Ci0JbWVtY3B5KCZzdGF0ZS0+b3BzLCAmdHR1c2JkZWNmZV9kdmJzX29wcywgc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzKSk7CiAKIAkvKiBjcmVhdGUgZHZiX2Zyb250ZW5kICovCi0Jc3RhdGUtPmZyb250ZW5kLm9wcyA9ICZzdGF0ZS0+b3BzOworCW1lbWNweSgmc3RhdGUtPmZyb250ZW5kLm9wcywgJnR0dXNiZGVjZmVfZHZic19vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOwogCXN0YXRlLT5mcm9udGVuZC5kZW1vZHVsYXRvcl9wcml2ID0gc3RhdGU7CiAJcmV0dXJuICZzdGF0ZS0+ZnJvbnRlbmQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JhZGlvL0tjb25maWcgYi9kcml2ZXJzL21lZGlhL3JhZGlvL0tjb25maWcKaW5kZXggM2ZmZjc1Ny4uZGUzMTI4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYWRpby9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vS2NvbmZpZwpAQCAtMTM2LDcgKzEzNiw3IEBACiAJICBDaG9vc2UgWSBoZXJlIGlmIHlvdSBoYXZlIHRoaXMgUENJIEZNIHJhZGlvIGNhcmQuCiAKIAkgIEluIG9yZGVyIHRvIGNvbnRyb2wgeW91ciByYWRpbyBjYXJkLCB5b3Ugd2lsbCBuZWVkIHRvIHVzZSBwcm9ncmFtcwotCSAgdGhhdCBhcmUgY29tcGF0aWJsZSB3aXRoIHRoZSBWaWRlbyBmb3IgTGludXggQVBJLiAgSW5mb3JtYXRpb24gb24gCisJICB0aGF0IGFyZSBjb21wYXRpYmxlIHdpdGggdGhlIFZpZGVvIGZvciBMaW51eCBBUEkuICBJbmZvcm1hdGlvbiBvbgogCSAgdGhpcyBBUEkgYW5kIHBvaW50ZXJzIHRvICJ2NGwiIHByb2dyYW1zIG1heSBiZSBmb3VuZCBhdAogCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9BUEkuaHRtbD4uCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL3JhZGlvL01ha2VmaWxlCmluZGV4IDhiMzUxOTQuLmU5NWI2ODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS9yYWRpby9NYWtlZmlsZQpAQCAtMjAsMyArMjAsNSBAQAogb2JqLSQoQ09ORklHX1JBRElPX0dFTVRFS19QQ0kpICs9IHJhZGlvLWdlbXRlay1wY2kubwogb2JqLSQoQ09ORklHX1JBRElPX1RSVVNUKSArPSByYWRpby10cnVzdC5vCiBvYmotJChDT05GSUdfUkFESU9fTUFFU1RSTykgKz0gcmFkaW8tbWFlc3Ryby5vCisKK0VYVFJBX0NGTEFHUyArPSAtSXNvdW5kCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JhZGlvL21pcm9wY20yMC1yYWRpby5jIGIvZHJpdmVycy9tZWRpYS9yYWRpby9taXJvcGNtMjAtcmFkaW8uYwppbmRleCBkYzI5MmRhLi5jNDMxMmZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JhZGlvL21pcm9wY20yMC1yYWRpby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vbWlyb3BjbTIwLXJhZGlvLmMKQEAgLTE2LDEzICsxNiwxNCBAQAogCiAvKiBXaGF0IGV2ZXIgeW91IHRoaW5rIGFib3V0IHRoZSBBQ0ksIHZlcnNpb24gMHgwNyBpcyBub3QgdmVyeSB3ZWxsIQogICogSSBjYW4ndCBnZXQgZnJlcXVlbmN5LCAndHVuZXIgc3RhdHVzJywgJ3R1bmVyIGZsYWdzJyBvciBtdXRlL21vbm8KLSAqIGNvbmRpdGlvbnMuLi4gICAgICAgICAgICAgICAgUm9iZXJ0IAorICogY29uZGl0aW9ucy4uLiAgICAgICAgICAgICAgICBSb2JlcnQKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+Ci0jaW5jbHVkZSAiLi4vLi4vLi4vc291bmQvb3NzL2FjaS5oIgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CisjaW5jbHVkZSAib3NzL2FjaS5oIgogI2luY2x1ZGUgIm1pcm9wY20yMC1yZHMtY29yZS5oIgogCiBzdGF0aWMgaW50IHJhZGlvX25yID0gLTE7CkBAIC0xMjMsNyArMTI0LDcgQEAKIAlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwogCXN0cnVjdCBwY20yMF9kZXZpY2UgKnBjbTIwID0gZGV2LT5wcml2OwogCWludCBpOwotCQorCiAJc3dpdGNoKGNtZCkKIAl7CiAJCWNhc2UgVklESU9DR0NBUDoKQEAgLTEzOSw3ICsxNDAsNyBAQAogCQljYXNlIFZJRElPQ0dUVU5FUjoKIAkJewogCQkJc3RydWN0IHZpZGVvX3R1bmVyICp2ID0gYXJnOwotCQkJaWYodi0+dHVuZXIpCS8qIE9ubHkgMSB0dW5lciAqLyAKKwkJCWlmKHYtPnR1bmVyKQkvKiBPbmx5IDEgdHVuZXIgKi8KIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCXYtPnJhbmdlbG93PTg3KjE2MDAwOwogCQkJdi0+cmFuZ2VoaWdoPTEwOCoxNjAwMDsKQEAgLTE3Miw3ICsxNzMsNyBAQAogCQkJcmV0dXJuIGk7CiAJCX0KIAkJY2FzZSBWSURJT0NHQVVESU86Ci0JCXsJCisJCXsKIAkJCXN0cnVjdCB2aWRlb19hdWRpbyAqdiA9IGFyZzsKIAkJCW1lbXNldCh2LDAsIHNpemVvZigqdikpOwogCQkJdi0+ZmxhZ3M9VklERU9fQVVESU9fTVVUQUJMRTsKQEAgLTE4MywxMiArMTg0LDEyIEBACiAJCQkJdi0+bW9kZXw9VklERU9fU09VTkRfTU9OTzsKIAkJCS8qIHYtPnN0ZXA9MjA0ODsgKi8KIAkJCXN0cmNweSh2LT5uYW1lLCAiUmFkaW8iKTsKLQkJCXJldHVybiAwOwkJCQorCQkJcmV0dXJuIDA7CiAJCX0KIAkJY2FzZSBWSURJT0NTQVVESU86CiAJCXsKIAkJCXN0cnVjdCB2aWRlb19hdWRpbyAqdiA9IGFyZzsKLQkJCWlmKHYtPmF1ZGlvKSAKKwkJCWlmKHYtPmF1ZGlvKQogCQkJCXJldHVybiAtRUlOVkFMOwogCiAJCQlwY20yMF9tdXRlKHBjbTIwLCAhISh2LT5mbGFncyZWSURFT19BVURJT19NVVRFKSk7CkBAIC0yMzcsNyArMjM4LDcgQEAKIHsKIAlpZih2aWRlb19yZWdpc3Rlcl9kZXZpY2UoJnBjbTIwX3JhZGlvLCBWRkxfVFlQRV9SQURJTywgcmFkaW9fbnIpPT0tMSkKIAkJZ290byB2aWRlb19yZWdpc3Rlcl9kZXZpY2U7Ci0JCQorCiAJaWYoYXR0YWNoX2FjaV9yZHMoKTwwKQogCQlnb3RvIGF0dGFjaF9hY2lfcmRzOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JhZGlvL21pcm9wY20yMC1yZHMtY29yZS5jIGIvZHJpdmVycy9tZWRpYS9yYWRpby9taXJvcGNtMjAtcmRzLWNvcmUuYwppbmRleCBiNjAyYzczLi45NDI4ZDhiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JhZGlvL21pcm9wY20yMC1yZHMtY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vbWlyb3BjbTIwLXJkcy1jb3JlLmMKQEAgLTIxLDcgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogCiAjaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSAiLi4vLi4vLi4vc291bmQvb3NzL2FjaS5oIgorI2luY2x1ZGUgIm9zcy9hY2kuaCIKICNpbmNsdWRlICJtaXJvcGNtMjAtcmRzLWNvcmUuaCIKIAogI2RlZmluZSBERUJVRyAwCkBAIC0zMywyNCArMzMsMjQgQEAKICNkZWZpbmUgUkRTX0JVU1lNQVNLICAgICAgICAweDEwICAgLyogQml0IDQgKi8KICNkZWZpbmUgUkRTX0NMT0NLTUFTSyAgICAgICAweDA4ICAgLyogQml0IDMgKi8KIAotI2RlZmluZSBSRFNfREFUQSh4KSAgICAgICAgICgoKHgpID4+IFJEU19EQVRBU0hJRlQpICYgMSkgCisjZGVmaW5lIFJEU19EQVRBKHgpICAgICAgICAgKCgoeCkgPj4gUkRTX0RBVEFTSElGVCkgJiAxKQogCiAKICNpZiBERUJVRwogc3RhdGljIHZvaWQgcHJpbnRfbWF0cml4KGNoYXIgYXJyYXlbXSwgdW5zaWduZWQgaW50IGxlbmd0aCkKIHsKLSAgICAgICAgaW50IGksIGo7CisJaW50IGksIGo7CiAKLSAgICAgICAgZm9yIChpPTA7IGk8bGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiYWNpLXJkczogIik7Ci0gICAgICAgICAgICAgICAgZm9yIChqPTc7IGo+PTA7IGotLSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCIlZCIsIChhcnJheVtpXSA+PiBqKSAmIDB4MSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChpJTggPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiIGJ5dGUtYm9yZGVyXG4iKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoIlxuIik7Ci0gICAgICAgIH0KKwlmb3IgKGk9MDsgaTxsZW5ndGg7IGkrKykgeworCQlwcmludGsoS0VSTl9ERUJVRyAiYWNpLXJkczogIik7CisJCWZvciAoaj03OyBqPj0wOyBqLS0pIHsKKwkJCXByaW50aygiJWQiLCAoYXJyYXlbaV0gPj4gaikgJiAweDEpOworCQl9CisJCWlmIChpJTggPT0gMCkKKwkJCXByaW50aygiIGJ5dGUtYm9yZGVyXG4iKTsKKwkJZWxzZQorCQkJcHJpbnRrKCJcbiIpOworCX0KIH0KICNlbmRpZiAvKiBERUJVRyAqLwogCkBAIC0xMTQsNyArMTE0LDcgQEAKIHsKIAl1bnNpZ25lZCBjaGFyIHNlbmRidWZmZXJbOF07CiAJaW50IGk7Ci0JCisKIAlpZiAoYnl0ZTJ0cmFucyhjbWQsIHNlbmRidWZmZXIsIDgpICE9IDApewogCQlyZXR1cm4gLTE7CiAJfSBlbHNlIHsKQEAgLTE1MSw3ICsxNTEsNyBAQAogCSAgIEkgaGF2ZSB0byB3YWl0cmVhZCgpIGhlcmUgKi8KIAlpZiAocmRzX3dhaXRyZWFkKCkgPCAwKQogCQlyZXR1cm4gLTE7Ci0JCisKIAltZW1zZXQoZGF0YWJ1ZmZlciwgMCwgZGF0YXNpemUpOwogCiAJZm9yIChpPTA7IGk8IFJFQURTSVpFOyBpKyspCkBAIC0xOTQsNyArMTk0LDcgQEAKIAkJcmV0ID0gMDsKIAogCW11dGV4X3VubG9jaygmYWNpX3Jkc19tdXRleCk7Ci0JCisKIAlyZXR1cm4gcmV0OwogfQogRVhQT1JUX1NZTUJPTChhY2lfcmRzX2NtZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JhZGlvL21pcm9wY20yMC1yZHMuYyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vbWlyb3BjbTIwLXJkcy5jCmluZGV4IGUwOTIxNDAuLjg3YjM3YjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vbWlyb3BjbTIwLXJkcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vbWlyb3BjbTIwLXJkcy5jCkBAIC00OCw3ICs0OCw3IEBACiAKIHN0YXRpYyB2b2lkIHByaW50X21hdHJpeChjaGFyICpjaCwgY2hhciBvdXRbXSkKIHsKLSAgICAgICAgaW50IGo7CisJaW50IGo7CiAKIAlmb3IgKGo9Nzsgaj49MDsgai0tKSB7CiAJCSBvdXRbNy1qXSA9ICgoKmNoID4+IGopICYgMHgxKSArICcwJzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tYWltc2xhYi5jIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1haW1zbGFiLmMKaW5kZXggNTU3ZmI1Yy4uZGYyMmE1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1haW1zbGFiLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1haW1zbGFiLmMKQEAgLTI0LDcgKzI0LDcgQEAKICAqICAgb3V0KHBvcnQsIHN0YXJ0X2luY3JlYXNpbmdfdm9sdW1lKTsKICAqICAgd2FpdChhX3dlZV93aGlsZSk7CiAgKiAgIG91dChwb3J0LCBzdG9wX2NoYW5naW5nX3RoZV92b2x1bWUpOwotICogIAorICoKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CS8qIE1vZHVsZXMgCQkJKi8KQEAgLTM0LDYgKzM0LDcgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4JCS8qIG91dGIsIG91dGJfcAkJCSovCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4JLyogY29weSB0by9mcm9tIHVzZXIJCSovCiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4JLyoga2VybmVsIHJhZGlvIHN0cnVjdHMJCSovCisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4JLyogQ09ORklHX1JBRElPX1JUUkFDS19QT1JUIAkqLwogI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4JLyogTG9jayBmb3IgdGhlIEkvTyAJCSovCiAKQEAgLTQxLDcgKzQyLDcgQEAKICNkZWZpbmUgQ09ORklHX1JBRElPX1JUUkFDS19QT1JUIC0xCiAjZW5kaWYKIAotc3RhdGljIGludCBpbyA9IENPTkZJR19SQURJT19SVFJBQ0tfUE9SVDsgCitzdGF0aWMgaW50IGlvID0gQ09ORklHX1JBRElPX1JUUkFDS19QT1JUOwogc3RhdGljIGludCByYWRpb19uciA9IC0xOwogc3RhdGljIHN0cnVjdCBtdXRleCBsb2NrOwogCkBAIC05MywxMiArOTQsMTIgQEAKIAlpbnQgaTsKIAogCW11dGV4X2xvY2soJmxvY2spOwotCQorCiAJaWYodm9sID09IGRldi0+Y3Vydm9sKSB7CS8qIHJlcXVlc3RlZCB2b2x1bWUgPSBjdXJyZW50ICovCiAJCWlmIChkZXYtPm11dGVkKSB7CS8qIHVzZXIgaXMgdW5tdXRpbmcgdGhlIGNhcmQgICovCiAJCQlkZXYtPm11dGVkID0gMDsKIAkJCW91dGIgKDB4ZDgsIGlvKTsJLyogZW5hYmxlIGNhcmQgKi8KLQkJfQkKKwkJfQogCQltdXRleF91bmxvY2soJmxvY2spOwogCQlyZXR1cm4gMDsKIAl9CkBAIC0xMTQsMTAgKzExNSwxMCBAQAogCiAJZGV2LT5tdXRlZCA9IDA7CiAJaWYodm9sID4gZGV2LT5jdXJ2b2wpCi0JCWZvcihpID0gZGV2LT5jdXJ2b2w7IGkgPCB2b2w7IGkrKykgCisJCWZvcihpID0gZGV2LT5jdXJ2b2w7IGkgPCB2b2w7IGkrKykKIAkJCXJ0X2luY3ZvbCgpOwogCWVsc2UKLQkJZm9yKGkgPSBkZXYtPmN1cnZvbDsgaSA+IHZvbDsgaS0tKSAKKwkJZm9yKGkgPSBkZXYtPmN1cnZvbDsgaSA+IHZvbDsgaS0tKQogCQkJcnRfZGVjdm9sKCk7CiAKIAlkZXYtPmN1cnZvbCA9IHZvbDsKQEAgLTEyNSw3ICsxMjYsNyBAQAogCXJldHVybiAwOwogfQogCi0vKiB0aGUgMTI4KzY0IG9uIHRoZXNlIG91dGIncyBpcyB0byBrZWVwIHRoZSB2b2x1bWUgc3RhYmxlIHdoaWxlIHR1bmluZyAKKy8qIHRoZSAxMjgrNjQgb24gdGhlc2Ugb3V0YidzIGlzIHRvIGtlZXAgdGhlIHZvbHVtZSBzdGFibGUgd2hpbGUgdHVuaW5nCiAgKiB3aXRob3V0IHRoZW0sIHRoZSB2b2x1bWUgX3dpbGxfIGNyZWVwIHVwIHdpdGggZWFjaCBmcmVxdWVuY3kgY2hhbmdlCiAgKiBhbmQgYml0IDQgKCsxNikgaXMgdG8ga2VlcCB0aGUgc2lnbmFsIHN0cmVuZ3RoIG1ldGVyIGVuYWJsZWQKICAqLwpAQCAtMTQwLDcgKzE0MSw3IEBACiAJCW91dGJfcCgxMjgrNjQrMTYrOCsgIDEsIHBvcnQpOyAgLyogb24gKyB3ci1lbmFibGUgKyBkYXRhIGxvdyAqLwogCQlvdXRiX3AoMTI4KzY0KzE2KzgrMisxLCBwb3J0KTsgIC8qIGNsb2NrICovCiAJfQotCXNsZWVwX2RlbGF5KDEwMDApOyAKKwlzbGVlcF9kZWxheSgxMDAwKTsKIH0KIAogc3RhdGljIHZvaWQgc2VuZF8xX2J5dGUoaW50IHBvcnQsIHN0cnVjdCBydF9kZXZpY2UgKmRldikKQEAgLTE0OCwxMyArMTQ5LDEzIEBACiAJaWYgKChkZXYtPmN1cnZvbCA9PSAwKSB8fCAoZGV2LT5tdXRlZCkpIHsKIAkJb3V0Yl9wKDEyOCs2NCsxNis0ICArMSwgcG9ydCk7ICAgLyogd3ItZW5hYmxlK2RhdGEgaGlnaCAqLwogCQlvdXRiX3AoMTI4KzY0KzE2KzQrMisxLCBwb3J0KTsgICAvKiBjbG9jayAqLwotCX0gCisJfQogCWVsc2UgewogCQlvdXRiX3AoMTI4KzY0KzE2KzgrNCAgKzEsIHBvcnQpOyAvKiBvbit3ci1lbmFibGUrZGF0YSBoaWdoICovCiAJCW91dGJfcCgxMjgrNjQrMTYrOCs0KzIrMSwgcG9ydCk7IC8qIGNsb2NrICovCiAJfQogCi0Jc2xlZXBfZGVsYXkoMTAwMCk7IAorCXNsZWVwX2RlbGF5KDEwMDApOwogfQogCiBzdGF0aWMgaW50IHJ0X3NldGZyZXEoc3RydWN0IHJ0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIGZyZXEpCkBAIC0xNjcsOSArMTY4LDkgQEAKIAogCWZyZXEgKz0gMTcxMjAwOwkJCS8qIEFkZCAxMC43IE1IeiBJRiAJCSovCiAJZnJlcSAvPSA4MDA7CQkJLyogQ29udmVydCB0byA1MCBrSHogdW5pdHMJKi8KLQkKKwogCW11dGV4X2xvY2soJmxvY2spOwkJCS8qIFN0b3Agb3RoZXIgb3BzIGludGVyZmVyaW5nICovCi0JIAorCiAJc2VuZF8wX2J5dGUgKGlvLCBkZXYpOwkJLyogIDA6IExTQiBvZiBmcmVxdWVuY3kJCSovCiAKIAlmb3IgKGkgPSAwOyBpIDwgMTM7IGkrKykJLyogICA6IGZyZXF1ZW5jeSBiaXRzICgxLTEzKQkqLwpAQCAtMTk1LDcgKzE5Niw3IEBACiAJCW91dGIgKDB4ZDAsIGlvKTsJLyogdm9sdW1lIHN0ZWFkeSArIHNpZ3N0ciAqLwogCWVsc2UKIAkJb3V0YiAoMHhkOCwgaW8pOwkvKiB2b2x1bWUgc3RlYWR5ICsgc2lnc3RyICsgb24gKi8KLQkJCisKIAltdXRleF91bmxvY2soJmxvY2spOwogCiAJcmV0dXJuIDA7CkBAIC0yMTMsNyArMjE0LDcgQEAKIHsKIAlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwogCXN0cnVjdCBydF9kZXZpY2UgKnJ0PWRldi0+cHJpdjsKLQkKKwogCXN3aXRjaChjbWQpCiAJewogCQljYXNlIFZJRElPQ0dDQVA6CkBAIC0yMjksNyArMjMwLDcgQEAKIAkJY2FzZSBWSURJT0NHVFVORVI6CiAJCXsKIAkJCXN0cnVjdCB2aWRlb190dW5lciAqdiA9IGFyZzsKLQkJCWlmKHYtPnR1bmVyKQkvKiBPbmx5IDEgdHVuZXIgKi8gCisJCQlpZih2LT50dW5lcikJLyogT25seSAxIHR1bmVyICovCiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl2LT5yYW5nZWxvdz0oODcqMTYwMDApOwogCQkJdi0+cmFuZ2VoaWdoPSgxMDgqMTYwMDApOwpAQCAtMjYxLDIxICsyNjIsMjEgQEAKIAkJCXJldHVybiAwOwogCQl9CiAJCWNhc2UgVklESU9DR0FVRElPOgotCQl7CQorCQl7CiAJCQlzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYgPSBhcmc7CiAJCQltZW1zZXQodiwwLCBzaXplb2YoKnYpKTsKIAkJCXYtPmZsYWdzfD1WSURFT19BVURJT19NVVRBQkxFfFZJREVPX0FVRElPX1ZPTFVNRTsKIAkJCXYtPnZvbHVtZT1ydC0+Y3Vydm9sICogNjU1NDsKIAkJCXYtPnN0ZXA9NjU1NDsKIAkJCXN0cmNweSh2LT5uYW1lLCAiUmFkaW8iKTsKLQkJCXJldHVybiAwOwkJCQorCQkJcmV0dXJuIDA7CiAJCX0KIAkJY2FzZSBWSURJT0NTQVVESU86CiAJCXsKIAkJCXN0cnVjdCB2aWRlb19hdWRpbyAqdiA9IGFyZzsKLQkJCWlmKHYtPmF1ZGlvKSAKKwkJCWlmKHYtPmF1ZGlvKQogCQkJCXJldHVybiAtRUlOVkFMOwotCQkJaWYodi0+ZmxhZ3MmVklERU9fQVVESU9fTVVURSkgCisJCQlpZih2LT5mbGFncyZWSURFT19BVURJT19NVVRFKQogCQkJCXJ0X211dGUocnQpOwogCQkJZWxzZQogCQkJCXJ0X3NldHZvbChydCx2LT52b2x1bWUvNjU1NCk7CkBAIC0yOTgsNyArMjk5LDcgQEAKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLm9wZW4gICAgICAgICAgID0gdmlkZW9fZXhjbHVzaXZlX29wZW4sCiAJLnJlbGVhc2UgICAgICAgID0gdmlkZW9fZXhjbHVzaXZlX3JlbGVhc2UsCi0JLmlvY3RsCSAgICAgICAgPSBydF9pb2N0bCwKKwkuaW9jdGwJCT0gcnRfaW9jdGwsCiAJLmNvbXBhdF9pb2N0bAk9IHY0bF9jb21wYXRfaW9jdGwzMiwKIAkubGxzZWVrICAgICAgICAgPSBub19sbHNlZWssCiB9OwpAQCAtMzIwLDE0ICszMjEsMTQgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JaWYgKCFyZXF1ZXN0X3JlZ2lvbihpbywgMiwgInJ0cmFjayIpKSAKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvLCAyLCAicnRyYWNrIikpCiAJewogCQlwcmludGsoS0VSTl9FUlIgInJ0cmFjazogcG9ydCAweCV4IGFscmVhZHkgaW4gdXNlXG4iLCBpbyk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCiAJcnRyYWNrX3JhZGlvLnByaXY9JnJ0cmFja191bml0OwotCQorCiAJaWYodmlkZW9fcmVnaXN0ZXJfZGV2aWNlKCZydHJhY2tfcmFkaW8sIFZGTF9UWVBFX1JBRElPLCByYWRpb19ucik9PS0xKQogCXsKIAkJcmVsZWFzZV9yZWdpb24oaW8sIDIpOwpAQCAtMzM2LDEwICszMzcsMTAgQEAKIAlwcmludGsoS0VSTl9JTkZPICJBSU1TbGFiIFJhZGlvVHJhY2svUmFkaW9SZXZlYWwgY2FyZCBkcml2ZXIuXG4iKTsKIAogCS8qIFNldCB1cCB0aGUgSS9PIGxvY2tpbmcgKi8KLQkKKwogCW11dGV4X2luaXQoJmxvY2spOwotCQotIAkvKiBtdXRlIGNhcmQgLSBwcmV2ZW50cyBub2lzeSBib290dXBzICovCisKKwkvKiBtdXRlIGNhcmQgLSBwcmV2ZW50cyBub2lzeSBib290dXBzICovCiAKIAkvKiB0aGlzIGVuc3VyZXMgdGhhdCB0aGUgdm9sdW1lIGlzIGFsbCB0aGUgd2F5IGRvd24gICovCiAJb3V0YigweDQ4LCBpbyk7CQkvKiB2b2x1bWUgZG93biBidXQgc3RpbGwgIm9uIgkqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1henRlY2guYyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tYXp0ZWNoLmMKaW5kZXggODNiZGFlMi4uOTVlNjMyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1henRlY2guYworKysgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLWF6dGVjaC5jCkBAIC0xLDExICsxLDExIEBACi0vKiByYWRpby1henRlY2guYyAtIEF6dGVjaCByYWRpbyBjYXJkIGRyaXZlciBmb3IgTGludXggMi4yIAorLyogcmFkaW8tYXp0ZWNoLmMgLSBBenRlY2ggcmFkaW8gY2FyZCBkcml2ZXIgZm9yIExpbnV4IDIuMgogICoKLSAqIEFkYXB0ZWQgdG8gc3VwcG9ydCB0aGUgVmlkZW8gZm9yIExpbnV4IEFQSSBieSAKKyAqIEFkYXB0ZWQgdG8gc3VwcG9ydCB0aGUgVmlkZW8gZm9yIExpbnV4IEFQSSBieQogICogUnVzc2VsbCBLcm9sbCA8cmtyb2xsQGV4cGxvaXRzLm9yZz4uICBCYXNlZCBvbiBvcmlnaW5hbCB0dW5lciBjb2RlIGJ5OgogICoKICAqIFF1YXkgTHkKICAqIERvbmFsZCBTb25nCi0gKiBKYXNvbiBMZXdpcyAgICAgIChqbGV3aXNAdHdpbGlnaHQudnRjLnZzYy5lZHUpIAorICogSmFzb24gTGV3aXMgICAgICAoamxld2lzQHR3aWxpZ2h0LnZ0Yy52c2MuZWR1KQogICogU2NvdHQgTWNHcmF0aCAgICAoc21jZ3JhdGhAdHdpbGlnaHQudnRjLnZzYy5lZHUpCiAgKiBXaWxsaWFtIE1jR3JhdGggICh3bWNncmF0aEB0d2lsaWdodC52dGMudnNjLmVkdSkKICAqCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSA8YXNtL2lvLmg+CQkvKiBvdXRiLCBvdXRiX3AJCQkqLwogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CS8qIGNvcHkgdG8vZnJvbSB1c2VyCQkqLwogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CS8qIGtlcm5lbCByYWRpbyBzdHJ1Y3RzCQkqLworI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CS8qIENPTkZJR19SQURJT19BWlRFQ0hfUE9SVCAJKi8KIAogLyogYWNjZXB0YWJsZSBwb3J0czogMHgzNTAgKEpQMyBzaG9ydGVkKSwgMHgzNTggKEpQMyBvcGVuKSAqLwpAQCAtMzksNyArNDAsNyBAQAogI2RlZmluZSBDT05GSUdfUkFESU9fQVpURUNIX1BPUlQgLTEKICNlbmRpZgogCi1zdGF0aWMgaW50IGlvID0gQ09ORklHX1JBRElPX0FaVEVDSF9QT1JUOyAKK3N0YXRpYyBpbnQgaW8gPSBDT05GSUdfUkFESU9fQVpURUNIX1BPUlQ7CiBzdGF0aWMgaW50IHJhZGlvX25yID0gLTE7CiBzdGF0aWMgaW50IHJhZGlvX3dhaXRfdGltZSA9IDEwMDA7CiBzdGF0aWMgc3RydWN0IG11dGV4IGxvY2s7CkBAIC01MywxNSArNTQsMTUgQEAKIAogc3RhdGljIGludCB2b2xjb252ZXJ0KGludCBsZXZlbCkKIHsKLQlsZXZlbD4+PTE0OwkgCS8qIE1hcCAxNmJpdHMgZG93biB0byAyIGJpdCAqLwotIAlsZXZlbCY9MzsKLQkKKwlsZXZlbD4+PTE0OwkJLyogTWFwIDE2Yml0cyBkb3duIHRvIDIgYml0ICovCisJbGV2ZWwmPTM7CisKIAkvKiBjb252ZXJ0IHRvIGNhcmQtZnJpZW5kbHkgdmFsdWVzICovCi0Jc3dpdGNoIChsZXZlbCkgCisJc3dpdGNoIChsZXZlbCkKIAl7Ci0JCWNhc2UgMDogCisJCWNhc2UgMDoKIAkJCXJldHVybiAwOwotCQljYXNlIDE6IAorCQljYXNlIDE6CiAJCQlyZXR1cm4gMTsKIAkJY2FzZSAyOgogCQkJcmV0dXJuIDQ7CkBAIC0xMjEsOSArMTIyLDkgQEAKIAogCWZyZXF1ZW5jeSArPSAxNzEyMDA7CQkvKiBBZGQgMTAuNyBNSHogSUYJCSovCiAJZnJlcXVlbmN5IC89IDgwMDsJCS8qIENvbnZlcnQgdG8gNTAga0h6IHVuaXRzCSovCi0JCQkJCQorCiAJbXV0ZXhfbG9jaygmbG9jayk7Ci0JCisKIAlzZW5kXzBfYnl0ZSAoZGV2KTsJCS8qICAwOiBMU0Igb2YgZnJlcXVlbmN5ICAgICAgICovCiAKIAlmb3IgKGkgPSAwOyBpIDwgMTM7IGkrKykJLyogICA6IGZyZXF1ZW5jeSBiaXRzICgxLTEzKSAgKi8KQEAgLTE1MSw3ICsxNTIsNyBAQAogCiAJdWRlbGF5IChyYWRpb193YWl0X3RpbWUpOwogCW91dGJfcCgxMjgrNjQrdm9sY29udmVydChkZXYtPmN1cnZvbCksIGlvKTsKLQkKKwogCW11dGV4X3VubG9jaygmbG9jayk7CiAKIAlyZXR1cm4gMDsKQEAgLTE2Miw3ICsxNjMsNyBAQAogewogCXN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7CiAJc3RydWN0IGF6X2RldmljZSAqYXogPSBkZXYtPnByaXY7Ci0JCisKIAlzd2l0Y2goY21kKQogCXsKIAkJY2FzZSBWSURJT0NHQ0FQOgpAQCAtMTc4LDcgKzE3OSw3IEBACiAJCWNhc2UgVklESU9DR1RVTkVSOgogCQl7CiAJCQlzdHJ1Y3QgdmlkZW9fdHVuZXIgKnYgPSBhcmc7Ci0JCQlpZih2LT50dW5lcikJLyogT25seSAxIHR1bmVyICovIAorCQkJaWYodi0+dHVuZXIpCS8qIE9ubHkgMSB0dW5lciAqLwogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJdi0+cmFuZ2Vsb3c9KDg3KjE2MDAwKTsKIAkJCXYtPnJhbmdlaGlnaD0oMTA4KjE2MDAwKTsKQEAgLTIxMSw3ICsyMTIsNyBAQAogCQkJcmV0dXJuIDA7CiAJCX0KIAkJY2FzZSBWSURJT0NHQVVESU86Ci0JCXsJCisJCXsKIAkJCXN0cnVjdCB2aWRlb19hdWRpbyAqdiA9IGFyZzsKIAkJCW1lbXNldCh2LDAsIHNpemVvZigqdikpOwogCQkJdi0+ZmxhZ3N8PVZJREVPX0FVRElPX01VVEFCTEV8VklERU9fQVVESU9fVk9MVU1FOwpAQCAtMjIyLDE3ICsyMjMsMTcgQEAKIAkJCXYtPnZvbHVtZT1hei0+Y3Vydm9sOwogCQkJdi0+c3RlcD0xNjM4NDsKIAkJCXN0cmNweSh2LT5uYW1lLCAiUmFkaW8iKTsKLQkJCXJldHVybiAwOwkJCQorCQkJcmV0dXJuIDA7CiAJCX0KIAkJY2FzZSBWSURJT0NTQVVESU86CiAJCXsKIAkJCXN0cnVjdCB2aWRlb19hdWRpbyAqdiA9IGFyZzsKLQkJCWlmKHYtPmF1ZGlvKSAKKwkJCWlmKHYtPmF1ZGlvKQogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJYXotPmN1cnZvbD12LT52b2x1bWU7CiAKIAkJCWF6LT5zdGVyZW89KHYtPm1vZGUmVklERU9fU09VTkRfU1RFUkVPKT8xOjA7Ci0JCQlpZih2LT5mbGFncyZWSURFT19BVURJT19NVVRFKSAKKwkJCWlmKHYtPmZsYWdzJlZJREVPX0FVRElPX01VVEUpCiAJCQkJYXpfc2V0dm9sKGF6LDApOwogCQkJZWxzZQogCQkJCWF6X3NldHZvbChheixhei0+Y3Vydm9sKTsKQEAgLTI3Nyw3ICsyNzgsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvLCAyLCAiYXp0ZWNoIikpIAorCWlmICghcmVxdWVzdF9yZWdpb24oaW8sIDIsICJhenRlY2giKSkKIAl7CiAJCXByaW50ayhLRVJOX0VSUiAiYXp0ZWNoOiBwb3J0IDB4JXggYWxyZWFkeSBpbiB1c2VcbiIsIGlvKTsKIAkJcmV0dXJuIC1FQlVTWTsKQEAgLTI4NSwxMyArMjg2LDEzIEBACiAKIAltdXRleF9pbml0KCZsb2NrKTsKIAlhenRlY2hfcmFkaW8ucHJpdj0mYXp0ZWNoX3VuaXQ7Ci0JCisKIAlpZih2aWRlb19yZWdpc3Rlcl9kZXZpY2UoJmF6dGVjaF9yYWRpbywgVkZMX1RZUEVfUkFESU8sIHJhZGlvX25yKT09LTEpCiAJewogCQlyZWxlYXNlX3JlZ2lvbihpbywyKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCQkKKwogCXByaW50ayhLRVJOX0lORk8gIkF6dGVjaCByYWRpbyBjYXJkIGRyaXZlciB2MS4wMC8xOTk5MDIyNCBya3JvbGxAZXhwbG9pdHMub3JnXG4iKTsKIAkvKiBtdXRlIGNhcmQgLSBwcmV2ZW50cyBub2lzeSBib290dXBzICovCiAJb3V0YiAoMCwgaW8pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1jYWRldC5jIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1jYWRldC5jCmluZGV4IGYxYjVhYzguLjg2NDFhZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tY2FkZXQuYworKysgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLWNhZGV0LmMKQEAgLTgsNyArOCw3IEBACiAgKiBSdXNzZWxsIEtyb2xsICAgIChya3JvbGxAZXhwbG9pdHMub3JnKQogICogUXVheSBMeQogICogRG9uYWxkIFNvbmcKLSAqIEphc29uIExld2lzICAgICAgKGpsZXdpc0B0d2lsaWdodC52dGMudnNjLmVkdSkgCisgKiBKYXNvbiBMZXdpcyAgICAgIChqbGV3aXNAdHdpbGlnaHQudnRjLnZzYy5lZHUpCiAgKiBTY290dCBNY0dyYXRoICAgIChzbWNncmF0aEB0d2lsaWdodC52dGMudnNjLmVkdSkKICAqIFdpbGxpYW0gTWNHcmF0aCAgKHdtY2dyYXRoQHR3aWxpZ2h0LnZ0Yy52c2MuZWR1KQogICoKQEAgLTM0LDYgKzM0LDcgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4JCS8qIG91dGIsIG91dGJfcAkJCSovCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4JLyogY29weSB0by9mcm9tIHVzZXIJCSovCiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4JLyoga2VybmVsIHJhZGlvIHN0cnVjdHMJCSovCisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KICNpbmNsdWRlIDxsaW51eC9wYXJhbS5oPgogI2luY2x1ZGUgPGxpbnV4L3BucC5oPgogCkBAIC01NSwyOSArNTYsMjkgQEAKIAogLyoKICAqIFNpZ25hbCBTdHJlbmd0aCBUaHJlc2hvbGQgVmFsdWVzCi0gKiBUaGUgVjRMIEFQSSBzcGVjIGRvZXMgbm90IGRlZmluZSBhbnkgcGFydGljdWxhciB1bml0IGZvciB0aGUgc2lnbmFsIAorICogVGhlIFY0TCBBUEkgc3BlYyBkb2VzIG5vdCBkZWZpbmUgYW55IHBhcnRpY3VsYXIgdW5pdCBmb3IgdGhlIHNpZ25hbAogICogc3RyZW5ndGggdmFsdWUuICBUaGVzZSB2YWx1ZXMgYXJlIGluIG1pY3Jvdm9sdHMgb2YgUkYgYXQgdGhlIHR1bmVyJ3MgaW5wdXQuCiAgKi8KIHN0YXRpYyBfX3UxNiBzaWd0YWJsZVsyXVs0XT17ezUsMTAsMzAsMTUwfSx7MjgsNDAsNjMsMTAwMH19OwogCiBzdGF0aWMgaW50IGNhZGV0X2dldHJkcyh2b2lkKQogewotICAgICAgICBpbnQgcmRzc3RhdD0wOworCWludCByZHNzdGF0PTA7CiAKIAlzcGluX2xvY2soJmNhZGV0X2lvX2xvY2spOwotICAgICAgICBvdXRiKDMsaW8pOyAgICAgICAgICAgICAgICAgLyogU2VsZWN0IERlY29kZXIgQ29udHJvbC9TdGF0dXMgKi8KKwlvdXRiKDMsaW8pOyAgICAgICAgICAgICAgICAgLyogU2VsZWN0IERlY29kZXIgQ29udHJvbC9TdGF0dXMgKi8KIAlvdXRiKGluYihpbysxKSYweDdmLGlvKzEpOyAgLyogUmVzZXQgUkRTIGRldGVjdGlvbiAqLwogCXNwaW5fdW5sb2NrKCZjYWRldF9pb19sb2NrKTsKLQkKKwogCW1zbGVlcCgxMDApOwogCi0Jc3Bpbl9sb2NrKCZjYWRldF9pb19sb2NrKTsJCi0gICAgICAgIG91dGIoMyxpbyk7ICAgICAgICAgICAgICAgICAvKiBTZWxlY3QgRGVjb2RlciBDb250cm9sL1N0YXR1cyAqLworCXNwaW5fbG9jaygmY2FkZXRfaW9fbG9jayk7CisJb3V0YigzLGlvKTsgICAgICAgICAgICAgICAgIC8qIFNlbGVjdCBEZWNvZGVyIENvbnRyb2wvU3RhdHVzICovCiAJaWYoKGluYihpbysxKSYweDgwKSE9MCkgewotCSAgICAgICAgcmRzc3RhdHw9VklERU9fVFVORVJfUkRTX09OOworCQlyZHNzdGF0fD1WSURFT19UVU5FUl9SRFNfT047CiAJfQogCWlmKChpbmIoaW8rMSkmMHgxMCkhPTApIHsKLQkgICAgICAgIHJkc3N0YXR8PVZJREVPX1RVTkVSX01CU19PTjsKKwkJcmRzc3RhdHw9VklERU9fVFVORVJfTUJTX09OOwogCX0KIAlzcGluX3VubG9jaygmY2FkZXRfaW9fbG9jayk7CiAJcmV0dXJuIHJkc3N0YXQ7CkBAIC04Niw0OSArODcsNDkgQEAKIHN0YXRpYyBpbnQgY2FkZXRfZ2V0c3RlcmVvKHZvaWQpCiB7CiAJaW50IHJldCA9IDA7Ci0gICAgICAgIGlmKGN1cnR1bmVyICE9IDApCS8qIE9ubHkgRk0gaGFzIHN0ZXJlbyBjYXBhYmlsaXR5ISAqLwotCSAgICAgICAgcmV0dXJuIDA7CisJaWYoY3VydHVuZXIgIT0gMCkJLyogT25seSBGTSBoYXMgc3RlcmVvIGNhcGFiaWxpdHkhICovCisJCXJldHVybiAwOwogCiAJc3Bpbl9sb2NrKCZjYWRldF9pb19sb2NrKTsKLSAgICAgICAgb3V0Yig3LGlvKTsgICAgICAgICAgLyogU2VsZWN0IHR1bmVyIGNvbnRyb2wgKi8KKwlvdXRiKDcsaW8pOyAgICAgICAgICAvKiBTZWxlY3QgdHVuZXIgY29udHJvbCAqLwogCWlmKCAoaW5iKGlvKzEpICYgMHg0MCkgPT0gMCkKLSAgICAgICAgCXJldCA9IDE7Ci0gICAgICAgIHNwaW5fdW5sb2NrKCZjYWRldF9pb19sb2NrKTsKLSAgICAgICAgcmV0dXJuIHJldDsKKwkJcmV0ID0gMTsKKwlzcGluX3VubG9jaygmY2FkZXRfaW9fbG9jayk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGNhZGV0X2dldHR1bmUodm9pZCkKIHsKLSAgICAgICAgaW50IGN1cnZvbCxpOworCWludCBjdXJ2b2wsaTsKIAl1bnNpZ25lZCBmaWZvPTA7CiAKLSAgICAgICAgLyoKLSAgICAgICAgICogUHJlcGFyZSBmb3IgcmVhZAotICAgICAgICAgKi8KKwkvKgorCSAqIFByZXBhcmUgZm9yIHJlYWQKKwkgKi8KIAogCXNwaW5fbG9jaygmY2FkZXRfaW9fbG9jayk7Ci0JCi0gICAgICAgIG91dGIoNyxpbyk7ICAgICAgIC8qIFNlbGVjdCB0dW5lciBjb250cm9sICovCi0gICAgICAgIGN1cnZvbD1pbmIoaW8rMSk7IC8qIFNhdmUgY3VycmVudCB2b2x1bWUvbXV0ZSBzZXR0aW5nICovCi0gICAgICAgIG91dGIoMHgwMCxpbysxKTsgIC8qIEVuc3VyZSBXUklURS1FTkFCTEUgaXMgTE9XICovCisKKwlvdXRiKDcsaW8pOyAgICAgICAvKiBTZWxlY3QgdHVuZXIgY29udHJvbCAqLworCWN1cnZvbD1pbmIoaW8rMSk7IC8qIFNhdmUgY3VycmVudCB2b2x1bWUvbXV0ZSBzZXR0aW5nICovCisJb3V0YigweDAwLGlvKzEpOyAgLyogRW5zdXJlIFdSSVRFLUVOQUJMRSBpcyBMT1cgKi8KIAl0dW5lc3RhdD0weGZmZmY7CiAKLSAgICAgICAgLyoKLSAgICAgICAgICogUmVhZCB0aGUgc2hpZnQgcmVnaXN0ZXIKLSAgICAgICAgICovCi0gICAgICAgIGZvcihpPTA7aTwyNTtpKyspIHsKLSAgICAgICAgICAgICAgICBmaWZvPShmaWZvPDwxKXwoKGluYihpbysxKT4+NykmMHgwMSk7Ci0gICAgICAgICAgICAgICAgaWYoaTwyNCkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3V0YigweDAxLGlvKzEpOworCS8qCisJICogUmVhZCB0aGUgc2hpZnQgcmVnaXN0ZXIKKwkgKi8KKwlmb3IoaT0wO2k8MjU7aSsrKSB7CisJCWZpZm89KGZpZm88PDEpfCgoaW5iKGlvKzEpPj43KSYweDAxKTsKKwkJaWYoaTwyNCkgeworCQkJb3V0YigweDAxLGlvKzEpOwogCQkJdHVuZXN0YXQmPWluYihpbysxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dGIoMHgwMCxpbysxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KKwkJCW91dGIoMHgwMCxpbysxKTsKKwkJfQorCX0KIAotICAgICAgICAvKgotICAgICAgICAgKiBSZXN0b3JlIHZvbHVtZS9tdXRlIHNldHRpbmcKLSAgICAgICAgICovCi0gICAgICAgIG91dGIoY3Vydm9sLGlvKzEpOworCS8qCisJICogUmVzdG9yZSB2b2x1bWUvbXV0ZSBzZXR0aW5nCisJICovCisJb3V0YihjdXJ2b2wsaW8rMSk7CiAJc3Bpbl91bmxvY2soJmNhZGV0X2lvX2xvY2spOwogCiAJcmV0dXJuIGZpZm87CkBAIC0xMzYsNDMgKzEzNyw0MyBAQAogCiBzdGF0aWMgdW5zaWduZWQgY2FkZXRfZ2V0ZnJlcSh2b2lkKQogewotICAgICAgICBpbnQgaTsKLSAgICAgICAgdW5zaWduZWQgZnJlcT0wLHRlc3QsZmlmbz0wOworCWludCBpOworCXVuc2lnbmVkIGZyZXE9MCx0ZXN0LGZpZm89MDsKIAogCS8qCiAJICogUmVhZCBjdXJyZW50IHR1bmluZwogCSAqLwogCWZpZm89Y2FkZXRfZ2V0dHVuZSgpOwogCi0gICAgICAgIC8qCi0gICAgICAgICAqIENvbnZlcnQgdG8gYWN0dWFsIGZyZXF1ZW5jeQotICAgICAgICAgKi8KKwkvKgorCSAqIENvbnZlcnQgdG8gYWN0dWFsIGZyZXF1ZW5jeQorCSAqLwogCWlmKGN1cnR1bmVyPT0wKSB7ICAgIC8qIEZNICovCi0JICAgICAgICB0ZXN0PTEyNTAwOwotICAgICAgICAgICAgICAgIGZvcihpPTA7aTwxNDtpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKChmaWZvJjB4MDEpIT0wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZXErPXRlc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZXN0PXRlc3Q8PDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaWZvPWZpZm8+PjE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZyZXEtPTEwNzAwMDAwOyAgICAgICAgICAgLyogSUYgZnJlcXVlbmN5IGlzIDEwLjcgTUh6ICovCi0gICAgICAgICAgICAgICAgZnJlcT0oZnJlcSoxNikvMTAwMDAwMDsgICAvKiBNYWtlIGl0IDEvMTYgTUh6ICovCisJCXRlc3Q9MTI1MDA7CisJCWZvcihpPTA7aTwxNDtpKyspIHsKKwkJCWlmKChmaWZvJjB4MDEpIT0wKSB7CisJCQkJZnJlcSs9dGVzdDsKKwkJCX0KKwkJCXRlc3Q9dGVzdDw8MTsKKwkJCWZpZm89Zmlmbz4+MTsKKwkJfQorCQlmcmVxLT0xMDcwMDAwMDsgICAgICAgICAgIC8qIElGIGZyZXF1ZW5jeSBpcyAxMC43IE1IeiAqLworCQlmcmVxPShmcmVxKjE2KS8xMDAwMDAwOyAgIC8qIE1ha2UgaXQgMS8xNiBNSHogKi8KIAl9CiAJaWYoY3VydHVuZXI9PTEpIHsgICAgLyogQU0gKi8KLQkgICAgICAgIGZyZXE9KChmaWZvJjB4N2ZmZiktMjAxMCkqMTY7CisJCWZyZXE9KChmaWZvJjB4N2ZmZiktMjAxMCkqMTY7CiAJfQogCi0gICAgICAgIHJldHVybiBmcmVxOworCXJldHVybiBmcmVxOwogfQogCiBzdGF0aWMgdm9pZCBjYWRldF9zZXR0dW5lKHVuc2lnbmVkIGZpZm8pCiB7Ci0gICAgICAgIGludCBpOwotCXVuc2lnbmVkIHRlc3Q7ICAKKwlpbnQgaTsKKwl1bnNpZ25lZCB0ZXN0OwogCiAJc3Bpbl9sb2NrKCZjYWRldF9pb19sb2NrKTsKLQkKKwogCW91dGIoNyxpbyk7ICAgICAgICAgICAgICAgIC8qIFNlbGVjdCB0dW5lciBjb250cm9sICovCiAJLyoKIAkgKiBXcml0ZSB0aGUgc2hpZnQgcmVnaXN0ZXIKQEAgLTE4Myw3ICsxODQsNyBAQAogCW91dGIoNyxpbyk7ICAgICAgICAgICAgICAgIC8qIFNlbGVjdCB0dW5lciBjb250cm9sICovCiAJb3V0Yih0ZXN0LGlvKzEpOyAgICAgICAgICAgLyogSW5pdGlhbGl6ZSBmb3Igd3JpdGUgKi8KIAlmb3IoaT0wO2k8MjU7aSsrKSB7Ci0gICAJICAgICAgICB0ZXN0fD0weDAxOyAgICAgICAgICAgICAgLyogVG9nZ2xlIFNDSyBIaWdoICovCisJCXRlc3R8PTB4MDE7ICAgICAgICAgICAgICAvKiBUb2dnbGUgU0NLIEhpZ2ggKi8KIAkJb3V0Yih0ZXN0LGlvKzEpOwogCQl0ZXN0Jj0weGZlOyAgICAgICAgICAgICAgLyogVG9nZ2xlIFNDSyBMb3cgKi8KIAkJb3V0Yih0ZXN0LGlvKzEpOwpAQCAtMTk2LDU3ICsxOTcsNTcgQEAKIAogc3RhdGljIHZvaWQgY2FkZXRfc2V0ZnJlcSh1bnNpZ25lZCBmcmVxKQogewotICAgICAgICB1bnNpZ25lZCBmaWZvOwotICAgICAgICBpbnQgaSxqLHRlc3Q7Ci0gICAgICAgIGludCBjdXJ2b2w7CisJdW5zaWduZWQgZmlmbzsKKwlpbnQgaSxqLHRlc3Q7CisJaW50IGN1cnZvbDsKIAotICAgICAgICAvKiAKLSAgICAgICAgICogRm9ybXVsYXRlIGEgZmlmbyBjb21tYW5kCi0gICAgICAgICAqLworCS8qCisJICogRm9ybXVsYXRlIGEgZmlmbyBjb21tYW5kCisJICovCiAJZmlmbz0wOwogCWlmKGN1cnR1bmVyPT0wKSB7ICAgIC8qIEZNICovCi0gICAgICAgIAl0ZXN0PTEwMjQwMDsKLSAgICAgICAgICAgICAgICBmcmVxPShmcmVxKjEwMDApLzE2OyAgICAgICAvKiBNYWtlIGl0IGtIeiAqLwotICAgICAgICAgICAgICAgIGZyZXErPTEwNzAwOyAgICAgICAgICAgICAgIC8qIElGIGlzIDEwNzAwIGtIeiAqLwotICAgICAgICAgICAgICAgIGZvcihpPTA7aTwxNDtpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpZm89Zmlmbzw8MTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKGZyZXE+PXRlc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlmb3w9MHgwMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlcS09dGVzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Q9dGVzdD4+MTsKLSAgICAgICAgICAgICAgICB9CisJCXRlc3Q9MTAyNDAwOworCQlmcmVxPShmcmVxKjEwMDApLzE2OyAgICAgICAvKiBNYWtlIGl0IGtIeiAqLworCQlmcmVxKz0xMDcwMDsgICAgICAgICAgICAgICAvKiBJRiBpcyAxMDcwMCBrSHogKi8KKwkJZm9yKGk9MDtpPDE0O2krKykgeworCQkJZmlmbz1maWZvPDwxOworCQkJaWYoZnJlcT49dGVzdCkgeworCQkJCWZpZm98PTB4MDE7CisJCQkJZnJlcS09dGVzdDsKKwkJCX0KKwkJCXRlc3Q9dGVzdD4+MTsKKwkJfQogCX0KIAlpZihjdXJ0dW5lcj09MSkgeyAgICAvKiBBTSAqLwotICAgICAgICAgICAgICAgIGZpZm89KGZyZXEvMTYpKzIwMTA7ICAgICAgICAgICAgLyogTWFrZSBpdCBrSHogKi8KKwkJZmlmbz0oZnJlcS8xNikrMjAxMDsgICAgICAgICAgICAvKiBNYWtlIGl0IGtIeiAqLwogCQlmaWZvfD0weDEwMDAwMDsgICAgICAgICAgICAvKiBTZWxlY3QgQU0gQmFuZCAqLwogCX0KIAotICAgICAgICAvKgotICAgICAgICAgKiBTYXZlIGN1cnJlbnQgdm9sdW1lL211dGUgc2V0dGluZwotICAgICAgICAgKi8KKwkvKgorCSAqIFNhdmUgY3VycmVudCB2b2x1bWUvbXV0ZSBzZXR0aW5nCisJICovCiAKIAlzcGluX2xvY2soJmNhZGV0X2lvX2xvY2spOwogCW91dGIoNyxpbyk7ICAgICAgICAgICAgICAgIC8qIFNlbGVjdCB0dW5lciBjb250cm9sICovCi0gICAgICAgIGN1cnZvbD1pbmIoaW8rMSk7IAotICAgICAgICBzcGluX3VubG9jaygmY2FkZXRfaW9fbG9jayk7CisJY3Vydm9sPWluYihpbysxKTsKKwlzcGluX3VubG9jaygmY2FkZXRfaW9fbG9jayk7CiAKIAkvKgogCSAqIFR1bmUgdGhlIGNhcmQKIAkgKi8KIAlmb3Ioaj0zO2o+LTE7ai0tKSB7Ci0JICAgICAgICBjYWRldF9zZXR0dW5lKGZpZm98KGo8PDE2KSk7Ci0JICAgICAgICAKLQkgICAgICAgIHNwaW5fbG9jaygmY2FkZXRfaW9fbG9jayk7CisJCWNhZGV0X3NldHR1bmUoZmlmb3woajw8MTYpKTsKKworCQlzcGluX2xvY2soJmNhZGV0X2lvX2xvY2spOwogCQlvdXRiKDcsaW8pOyAgICAgICAgIC8qIFNlbGVjdCB0dW5lciBjb250cm9sICovCiAJCW91dGIoY3Vydm9sLGlvKzEpOwogCQlzcGluX3VubG9jaygmY2FkZXRfaW9fbG9jayk7Ci0JCQorCiAJCW1zbGVlcCgxMDApOwogCiAJCWNhZGV0X2dldHR1bmUoKTsKIAkJaWYoKHR1bmVzdGF0ICYgMHg0MCkgPT0gMCkgeyAgIC8qIFR1bmVkICovCi0JCSAgICAgICAgc2lnc3RyZW5ndGg9c2lndGFibGVbY3VydHVuZXJdW2pdOworCQkJc2lnc3RyZW5ndGg9c2lndGFibGVbY3VydHVuZXJdW2pdOwogCQkJcmV0dXJuOwogCQl9CiAJfQpAQCAtMjU3LDI4ICsyNTgsMjggQEAKIHN0YXRpYyBpbnQgY2FkZXRfZ2V0dm9sKHZvaWQpCiB7CiAJaW50IHJldCA9IDA7Ci0JCisKIAlzcGluX2xvY2soJmNhZGV0X2lvX2xvY2spOwotCQotICAgICAgICBvdXRiKDcsaW8pOyAgICAgICAgICAgICAgICAvKiBTZWxlY3QgdHVuZXIgY29udHJvbCAqLwotICAgICAgICBpZigoaW5iKGlvICsgMSkgJiAweDIwKSAhPSAwKQotICAgICAgICAJcmV0ID0gMHhmZmZmOwotICAgICAgICAKLSAgICAgICAgc3Bpbl91bmxvY2soJmNhZGV0X2lvX2xvY2spOwotICAgICAgICByZXR1cm4gcmV0OworCisJb3V0Yig3LGlvKTsgICAgICAgICAgICAgICAgLyogU2VsZWN0IHR1bmVyIGNvbnRyb2wgKi8KKwlpZigoaW5iKGlvICsgMSkgJiAweDIwKSAhPSAwKQorCQlyZXQgPSAweGZmZmY7CisKKwlzcGluX3VubG9jaygmY2FkZXRfaW9fbG9jayk7CisJcmV0dXJuIHJldDsKIH0KIAogCiBzdGF0aWMgdm9pZCBjYWRldF9zZXR2b2woaW50IHZvbCkKIHsKIAlzcGluX2xvY2soJmNhZGV0X2lvX2xvY2spOwotICAgICAgICBvdXRiKDcsaW8pOyAgICAgICAgICAgICAgICAvKiBTZWxlY3QgdHVuZXIgY29udHJvbCAqLwotICAgICAgICBpZih2b2w+MCkKLSAgICAgICAgICAgICAgICBvdXRiKDB4MjAsaW8rMSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBvdXRiKDB4MDAsaW8rMSk7CisJb3V0Yig3LGlvKTsgICAgICAgICAgICAgICAgLyogU2VsZWN0IHR1bmVyIGNvbnRyb2wgKi8KKwlpZih2b2w+MCkKKwkJb3V0YigweDIwLGlvKzEpOworCWVsc2UKKwkJb3V0YigweDAwLGlvKzEpOwogCXNwaW5fdW5sb2NrKCZjYWRldF9pb19sb2NrKTsKLX0gIAorfQogCiBzdGF0aWMgdm9pZCBjYWRldF9oYW5kbGVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKQEAgLTI4OCwxNSArMjg5LDE1IEBACiAKIAlpZihzcGluX3RyeWxvY2soJmNhZGV0X2lvX2xvY2spKQogCXsKLQkgICAgICAgIG91dGIoMHgzLGlvKTsgICAgICAgLyogU2VsZWN0IFJEUyBEZWNvZGVyIENvbnRyb2wgKi8KKwkJb3V0YigweDMsaW8pOyAgICAgICAvKiBTZWxlY3QgUkRTIERlY29kZXIgQ29udHJvbCAqLwogCQlpZigoaW5iKGlvKzEpJjB4MjApIT0wKSB7Ci0JCSAgICAgICAgcHJpbnRrKEtFUk5fQ1JJVCAiY2FkZXQ6IFJEUyBmaWZvIG92ZXJmbG93XG4iKTsKKwkJCXByaW50ayhLRVJOX0NSSVQgImNhZGV0OiBSRFMgZmlmbyBvdmVyZmxvd1xuIik7CiAJCX0KIAkJb3V0YigweDgwLGlvKTsgICAgICAvKiBTZWxlY3QgUkRTIGZpZm8gKi8KIAkJd2hpbGUoKGluYihpbykmMHg4MCkhPTApIHsKLQkJICAgICAgICByZHNidWZbcmRzaW5dPWluYihpbysxKTsKKwkJCXJkc2J1ZltyZHNpbl09aW5iKGlvKzEpOwogCQkJaWYocmRzaW49PXJkc291dCkKLQkJCSAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiY2FkZXQ6IFJEUyBidWZmZXIgb3ZlcmZsb3dcbiIpOworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImNhZGV0OiBSRFMgYnVmZmVyIG92ZXJmbG93XG4iKTsKIAkJCWVsc2UKIAkJCQlyZHNpbisrOwogCQl9CkBAIC0zMDcsOSArMzA4LDkgQEAKIAkgKiBTZXJ2aWNlIHBlbmRpbmcgcmVhZAogCSAqLwogCWlmKCByZHNpbiE9cmRzb3V0KQotCSAgICAgICAgd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZyZWFkX3F1ZXVlKTsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZyZWFkX3F1ZXVlKTsKIAotCS8qIAorCS8qCiAJICogQ2xlYW4gdXAgYW5kIGV4aXQKIAkgKi8KIAlpbml0X3RpbWVyKCZyZWFkdGltZXIpOwpAQCAtMzI0LDEyICszMjUsMTIgQEAKIHN0YXRpYyBzc2l6ZV90IGNhZGV0X3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpkYXRhLAogCQkJICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKLSAgICAgICAgaW50IGk9MDsKKwlpbnQgaT0wOwogCXVuc2lnbmVkIGNoYXIgcmVhZGJ1ZltSRFNfQlVGRkVSXTsKIAotICAgICAgICBpZihyZHNzdGF0PT0wKSB7CisJaWYocmRzc3RhdD09MCkgewogCQlzcGluX2xvY2soJmNhZGV0X2lvX2xvY2spOwotCSAgICAgICAgcmRzc3RhdD0xOworCQlyZHNzdGF0PTE7CiAJCW91dGIoMHg4MCxpbyk7ICAgICAgICAvKiBTZWxlY3QgUkRTIGZpZm8gKi8KIAkJc3Bpbl91bmxvY2soJmNhZGV0X2lvX2xvY2spOwogCQlpbml0X3RpbWVyKCZyZWFkdGltZXIpOwpAQCAtMzM5LDE1ICszNDAsMTUgQEAKIAkJYWRkX3RpbWVyKCZyZWFkdGltZXIpOwogCX0KIAlpZihyZHNpbj09cmRzb3V0KSB7Ci0gIAkgICAgICAgIGlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykKLQkJICAgICAgICByZXR1cm4gLUVXT1VMREJMT0NLOwotCSAgICAgICAgaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmcmVhZF9xdWV1ZSk7Ci0JfQkJCisJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykKKwkJCXJldHVybiAtRVdPVUxEQkxPQ0s7CisJCWludGVycnVwdGlibGVfc2xlZXBfb24oJnJlYWRfcXVldWUpOworCX0KIAl3aGlsZSggaTxjb3VudCAmJiByZHNpbiE9cmRzb3V0KQotCSAgICAgICAgcmVhZGJ1ZltpKytdPXJkc2J1ZltyZHNvdXQrK107CisJCXJlYWRidWZbaSsrXT1yZHNidWZbcmRzb3V0KytdOwogCiAJaWYgKGNvcHlfdG9fdXNlcihkYXRhLHJlYWRidWYsaSkpCi0JICAgICAgICByZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIC1FRkFVTFQ7CiAJcmV0dXJuIGk7CiB9CiAKQEAgLTM3NSwyOSArMzc2LDI5IEBACiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9CiAJCQlzd2l0Y2godi0+dHVuZXIpIHsKLQkJCSAgICAgICAgY2FzZSAwOgotCQkJICAgICAgICBzdHJjcHkodi0+bmFtZSwiRk0iKTsKLQkJCSAgICAgICAgdi0+cmFuZ2Vsb3c9MTQwMDsgICAgIC8qIDg3LjUgTUh6ICovCi0JCQkgICAgICAgIHYtPnJhbmdlaGlnaD0xNzI4OyAgICAvKiAxMDguMCBNSHogKi8KLQkJCSAgICAgICAgdi0+ZmxhZ3M9MDsKLQkJCSAgICAgICAgdi0+bW9kZT0wOwotCQkJICAgICAgICB2LT5tb2RlfD1WSURFT19NT0RFX0FVVE87Ci0JCQkgICAgICAgIHYtPnNpZ25hbD1zaWdzdHJlbmd0aDsKLQkJCSAgICAgICAgaWYoY2FkZXRfZ2V0c3RlcmVvKCk9PTEpIHsKLQkJCQkgICAgICAgIHYtPmZsYWdzfD1WSURFT19UVU5FUl9TVEVSRU9fT047Ci0JCQkgICAgICAgIH0KKwkJCQljYXNlIDA6CisJCQkJc3RyY3B5KHYtPm5hbWUsIkZNIik7CisJCQkJdi0+cmFuZ2Vsb3c9MTQwMDsgICAgIC8qIDg3LjUgTUh6ICovCisJCQkJdi0+cmFuZ2VoaWdoPTE3Mjg7ICAgIC8qIDEwOC4wIE1IeiAqLworCQkJCXYtPmZsYWdzPTA7CisJCQkJdi0+bW9kZT0wOworCQkJCXYtPm1vZGV8PVZJREVPX01PREVfQVVUTzsKKwkJCQl2LT5zaWduYWw9c2lnc3RyZW5ndGg7CisJCQkJaWYoY2FkZXRfZ2V0c3RlcmVvKCk9PTEpIHsKKwkJCQkJdi0+ZmxhZ3N8PVZJREVPX1RVTkVSX1NURVJFT19PTjsKKwkJCQl9CiAJCQkJdi0+ZmxhZ3N8PWNhZGV0X2dldHJkcygpOwotCQkJICAgICAgICBicmVhazsKLQkJCSAgICAgICAgY2FzZSAxOgotCQkJICAgICAgICBzdHJjcHkodi0+bmFtZSwiQU0iKTsKLQkJCSAgICAgICAgdi0+cmFuZ2Vsb3c9ODMyMDsgICAgICAvKiA1MjAga0h6ICovCi0JCQkgICAgICAgIHYtPnJhbmdlaGlnaD0yNjQwMDsgICAgLyogMTY1MCBrSHogKi8KLQkJCSAgICAgICAgdi0+ZmxhZ3M9MDsKLQkJCSAgICAgICAgdi0+ZmxhZ3N8PVZJREVPX1RVTkVSX0xPVzsKLQkJCSAgICAgICAgdi0+bW9kZT0wOwotCQkJICAgICAgICB2LT5tb2RlfD1WSURFT19NT0RFX0FVVE87Ci0JCQkgICAgICAgIHYtPnNpZ25hbD1zaWdzdHJlbmd0aDsKLQkJCSAgICAgICAgYnJlYWs7CisJCQkJYnJlYWs7CisJCQkJY2FzZSAxOgorCQkJCXN0cmNweSh2LT5uYW1lLCJBTSIpOworCQkJCXYtPnJhbmdlbG93PTgzMjA7ICAgICAgLyogNTIwIGtIeiAqLworCQkJCXYtPnJhbmdlaGlnaD0yNjQwMDsgICAgLyogMTY1MCBrSHogKi8KKwkJCQl2LT5mbGFncz0wOworCQkJCXYtPmZsYWdzfD1WSURFT19UVU5FUl9MT1c7CisJCQkJdi0+bW9kZT0wOworCQkJCXYtPm1vZGV8PVZJREVPX01PREVfQVVUTzsKKwkJCQl2LT5zaWduYWw9c2lnc3RyZW5ndGg7CisJCQkJYnJlYWs7CiAJCQl9CiAJCQlyZXR1cm4gMDsKIAkJfQpAQCAtNDA3LDQ5ICs0MDgsNDkgQEAKIAkJCWlmKCh2LT50dW5lcjwwKXx8KHYtPnR1bmVyPjEpKSB7CiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9Ci0JCQljdXJ0dW5lcj12LT50dW5lcjsJCisJCQljdXJ0dW5lcj12LT50dW5lcjsKIAkJCXJldHVybiAwOwogCQl9CiAJCWNhc2UgVklESU9DR0ZSRVE6CiAJCXsKLQkJICAgICAgICB1bnNpZ25lZCBsb25nICpmcmVxID0gYXJnOworCQkJdW5zaWduZWQgbG9uZyAqZnJlcSA9IGFyZzsKIAkJCSpmcmVxID0gY2FkZXRfZ2V0ZnJlcSgpOwogCQkJcmV0dXJuIDA7CiAJCX0KIAkJY2FzZSBWSURJT0NTRlJFUToKIAkJewotCQkgICAgICAgIHVuc2lnbmVkIGxvbmcgKmZyZXEgPSBhcmc7CisJCQl1bnNpZ25lZCBsb25nICpmcmVxID0gYXJnOwogCQkJaWYoKGN1cnR1bmVyPT0wKSYmKCgqZnJlcTwxNDAwKXx8KCpmcmVxPjE3MjgpKSkgewotCQkJICAgICAgICByZXR1cm4gLUVJTlZBTDsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCX0KIAkJCWlmKChjdXJ0dW5lcj09MSkmJigoKmZyZXE8ODMyMCl8fCgqZnJlcT4yNjQwMCkpKSB7Ci0JCQkgICAgICAgIHJldHVybiAtRUlOVkFMOworCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQogCQkJY2FkZXRfc2V0ZnJlcSgqZnJlcSk7CiAJCQlyZXR1cm4gMDsKIAkJfQogCQljYXNlIFZJRElPQ0dBVURJTzoKLQkJewkKKwkJewogCQkJc3RydWN0IHZpZGVvX2F1ZGlvICp2ID0gYXJnOwogCQkJbWVtc2V0KHYsMCwgc2l6ZW9mKCp2KSk7CiAJCQl2LT5mbGFncz1WSURFT19BVURJT19NVVRBQkxFfFZJREVPX0FVRElPX1ZPTFVNRTsKIAkJCWlmKGNhZGV0X2dldHN0ZXJlbygpPT0wKSB7Ci0JCQkgICAgICAgIHYtPm1vZGU9VklERU9fU09VTkRfTU9OTzsKKwkJCQl2LT5tb2RlPVZJREVPX1NPVU5EX01PTk87CiAJCQl9IGVsc2UgewogCQkJCXYtPm1vZGU9VklERU9fU09VTkRfU1RFUkVPOwogCQkJfQogCQkJdi0+dm9sdW1lPWNhZGV0X2dldHZvbCgpOwogCQkJdi0+c3RlcD0weGZmZmY7CiAJCQlzdHJjcHkodi0+bmFtZSwgIlJhZGlvIik7Ci0JCQlyZXR1cm4gMDsJCQkKKwkJCXJldHVybiAwOwogCQl9CiAJCWNhc2UgVklESU9DU0FVRElPOgogCQl7CiAJCQlzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYgPSBhcmc7Ci0JCQlpZih2LT5hdWRpbykgCisJCQlpZih2LT5hdWRpbykKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCWNhZGV0X3NldHZvbCh2LT52b2x1bWUpOwotCQkJaWYodi0+ZmxhZ3MmVklERU9fQVVESU9fTVVURSkgCisJCQlpZih2LT5mbGFncyZWSURFT19BVURJT19NVVRFKQogCQkJCWNhZGV0X3NldHZvbCgwKTsKIAkJCWVsc2UKIAkJCQljYWRldF9zZXR2b2woMHhmZmZmKTsKQEAgLTUzOSwxNiArNTQwLDE2IEBACiAKIHN0YXRpYyBpbnQgY2FkZXRfcHJvYmUodm9pZCkKIHsKLSAgICAgICAgc3RhdGljIGludCBpb3ZhbHNbOF09ezB4MzMwLDB4MzMyLDB4MzM0LDB4MzM2LDB4MzM4LDB4MzNhLDB4MzNjLDB4MzNlfTsKKwlzdGF0aWMgaW50IGlvdmFsc1s4XT17MHgzMzAsMHgzMzIsMHgzMzQsMHgzMzYsMHgzMzgsMHgzM2EsMHgzM2MsMHgzM2V9OwogCWludCBpOwogCiAJZm9yKGk9MDtpPDg7aSsrKSB7Ci0JICAgICAgICBpbz1pb3ZhbHNbaV07CisJCWlvPWlvdmFsc1tpXTsKIAkJaWYgKHJlcXVlc3RfcmVnaW9uKGlvLCAyLCAiY2FkZXQtcHJvYmUiKSkgewotCQkgICAgICAgIGNhZGV0X3NldGZyZXEoMTQxMCk7CisJCQljYWRldF9zZXRmcmVxKDE0MTApOwogCQkJaWYoY2FkZXRfZ2V0ZnJlcSgpPT0xNDEwKSB7CiAJCQkJcmVsZWFzZV9yZWdpb24oaW8sIDIpOwotCQkJICAgICAgICByZXR1cm4gaW87CisJCQkJcmV0dXJuIGlvOwogCQkJfQogCQkJcmVsZWFzZV9yZWdpb24oaW8sIDIpOwogCQl9CkBAIC01NTYsNyArNTU3LDcgQEAKIAlyZXR1cm4gLTE7CiB9CiAKLS8qIAorLyoKICAqIGlvIHNob3VsZCBvbmx5IGJlIHNldCBpZiB0aGUgdXNlciBoYXMgdXNlZCBzb21ldGhpbmcgbGlrZQogICogaXNhcG5wICh0aGUgdXNlcnNwYWNlIHByb2dyYW0pIHRvIGluaXRpYWxpemUgdGhpcyBjYXJkIGZvciB1cwogICovCkBAIC01NjQsNyArNTY1LDcgQEAKIHN0YXRpYyBpbnQgX19pbml0IGNhZGV0X2luaXQodm9pZCkKIHsKIAlzcGluX2xvY2tfaW5pdCgmY2FkZXRfaW9fbG9jayk7Ci0JCisKIAkvKgogCSAqCUlmIGEgcHJvYmUgd2FzIHJlcXVlc3RlZCB0aGVuIHByb2JlIElTQVBuUCBmaXJzdCAoc2FmZXN0KQogCSAqLwpAQCAtNTc5LDEyICs1ODAsMTIgQEAKIAkvKgogCSAqCUVsc2Ugd2UgYmFpbCBvdXQKIAkgKi8KLQkgCi0gICAgICAgIGlmKGlvIDwgMCkgewotI2lmZGVmIE1PRFVMRSAgICAgICAgCisKKwlpZihpbyA8IDApIHsKKyNpZmRlZiBNT0RVTEUKIAkJcHJpbnRrKEtFUk5fRVJSICJZb3UgbXVzdCBzZXQgYW4gSS9PIGFkZHJlc3Mgd2l0aCBpbz0weD8/P1xuIik7CiAjZW5kaWYKLQkgICAgICAgIGdvdG8gZmFpbDsKKwkJZ290byBmYWlsOwogCX0KIAlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvLDIsImNhZGV0IikpCiAJCWdvdG8gZmFpbDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tZ2VtdGVrLXBjaS5jIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1nZW10ZWstcGNpLmMKaW5kZXggOGU0OTliOC4uOWYyNDllN2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tZ2VtdGVrLXBjaS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tZ2VtdGVrLXBjaS5jCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAKKyAqCiAgKiAgICAgcmFkaW8tZ2VtdGVrLXBjaS5jIC0gR2VtdGVrIFBDSSBSYWRpbyBkcml2ZXIKICAqICAgICAoQykgMjAwMSBWbGFkaW1pciBTaGVib3JkYWV2IDx2c2hlYm9yZGFldkBtYWlsLnJ1PgogICoKQEAgLTMxLDcgKzMxLDcgQEAKICAqICAgICByYWRpbyBkZXZpY2UgZHJpdmVyLgogICoKICAqICAgICBQbGVhc2UsIGxldCBtZSBrbm93IGlmIHRoaXMgcGllY2Ugb2YgY29kZSB3YXMgdXNlZnVsIDopCi0gKiAKKyAqCiAgKiAgICAgVE9ETzogbXVsdGlwbGUgZGV2aWNlIHN1cHBvcnQgYW5kIHBvcnRhYmlsaXR5IHdlcmUgbm90IHRlc3RlZAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTQ0LDYgKzQ0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAKICNpbmNsdWRlIDxhc20vaW8uaD4KQEAgLTY5LDE4ICs3MCwxOCBAQAogI2RlZmluZSBUUlVFICgxKQogI2VuZGlmCiAKLSNpZm5kZWYgRkFMU0UgCisjaWZuZGVmIEZBTFNFCiAjZGVmaW5lIEZBTFNFICgwKQogI2VuZGlmCiAKIHN0cnVjdCBnZW10ZWtfcGNpX2NhcmQgewogCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZpZGVvZGV2OwotCQorCiAJdTMyIGlvYmFzZTsKIAl1MzIgbGVuZ3RoOwogCXU4ICBjaGlwcmV2OwogCXUxNiBtb2RlbDsKLQkKKwogCXUzMiBjdXJyZW50X2ZyZXF1ZW5jeTsKIAl1OCAgbXV0ZTsKIH07CkBAIC05Niw3ICs5Nyw3IEBACiAJcmV0dXJuICh1OCl2YWx1ZTsKIH0KIAotI2RlZmluZSBfYjAoIHYgKSAqKCh1OCAqKSZ2KSAgCisjZGVmaW5lIF9iMCggdiApICooKHU4ICopJnYpCiBzdGF0aWMgdm9pZCBfX2dlbXRla19wY2lfY21kKCB1MTYgdmFsdWUsIHUzMiBwb3J0LCB1OCAqbGFzdF9ieXRlLCBpbnQga2VlcCApCiB7CiAJcmVnaXN0ZXIgdTggYnl0ZSA9ICpsYXN0X2J5dGU7CkBAIC0xMDQsNyArMTA1LDcgQEAKIAlpZiAoICF2YWx1ZSApIHsKIAkJaWYgKCAha2VlcCApCiAJCQl2YWx1ZSA9ICh1MTYpcG9ydDsKLQkJYnl0ZSAmPSAweGZkOwkKKwkJYnl0ZSAmPSAweGZkOwogCX0gZWxzZQogCQlieXRlIHw9IDI7CiAKQEAgLTExNiw3ICsxMTcsNyBAQAogCWJ5dGUgJj0gMHhmZTsKIAlfYjAoIHZhbHVlICkgPSBieXRlOwogCW91dHcoIHZhbHVlLCBwb3J0ICk7Ci0JCisKIAkqbGFzdF9ieXRlID0gYnl0ZTsKIH0KIApAQCAtMTkzLDEzICsxOTQsMTMgQEAKIAkJCWMtPmF1ZGlvcyA9IDE7CiAJCQlzdHJjcHkoIGMtPm5hbWUsICJHZW10ZWsgUENJIFJhZGlvIiApOwogCQkJcmV0dXJuIDA7Ci0JCX0gCisJCX0KIAogCQljYXNlIFZJRElPQ0dUVU5FUjoKIAkJewogCQkJc3RydWN0IHZpZGVvX3R1bmVyICp0ID0gYXJnOwogCi0JCQlpZiAoIHQtPnR1bmVyICkgCisJCQlpZiAoIHQtPnR1bmVyICkKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAogCQkJdC0+cmFuZ2Vsb3cgPSBHRU1URUtfUENJX1JBTkdFX0xPVzsKQEAgLTIyOCw3ICsyMjksNyBAQAogCQljYXNlIFZJRElPQ1NGUkVROgogCQl7CiAJCQl1bnNpZ25lZCBsb25nICpmcmVxID0gYXJnOwotCSAKKwogCQkJaWYgKCAoKmZyZXEgPCBHRU1URUtfUENJX1JBTkdFX0xPVykgfHwKIAkJCSAgICAgKCpmcmVxID4gR0VNVEVLX1BDSV9SQU5HRV9ISUdIKSApCiAJCQkJcmV0dXJuIC1FSU5WQUw7CkBAIC0yMzksOSArMjQwLDkgQEAKIAogCQkJcmV0dXJuIDA7CiAJCX0KLSAgCisKIAkJY2FzZSBWSURJT0NHQVVESU86Ci0JCXsJCisJCXsKIAkJCXN0cnVjdCB2aWRlb19hdWRpbyAqYSA9IGFyZzsKIAogCQkJbWVtc2V0KCBhLCAwLCBzaXplb2YoICphICkgKTsKQEAgLTI0OSwxNyArMjUwLDE3IEBACiAJCQlhLT52b2x1bWUgPSAxOwogCQkJYS0+c3RlcCA9IDY1NTM1OwogCQkJc3RyY3B5KCBhLT5uYW1lLCAiUmFkaW8iICk7Ci0JCQlyZXR1cm4gMDsJCQkKKwkJCXJldHVybiAwOwogCQl9CiAKIAkJY2FzZSBWSURJT0NTQVVESU86CiAJCXsKIAkJCXN0cnVjdCB2aWRlb19hdWRpbyAqYSA9IGFyZzsKIAotCQkJaWYgKCBhLT5hdWRpbyApIAorCQkJaWYgKCBhLT5hdWRpbyApCiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAKLQkJCWlmICggYS0+ZmxhZ3MgJiBWSURFT19BVURJT19NVVRFICkgCisJCQlpZiAoIGEtPmZsYWdzICYgVklERU9fQVVESU9fTVVURSApCiAJCQkJZ2VtdGVrX3BjaV9tdXRlKCBjYXJkICk7CiAJCQllbHNlCiAJCQkJZ2VtdGVrX3BjaV91bm11dGUoIGNhcmQgKTsKQEAgLTMyMyw5ICszMjQsOSBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQlpZiAoIHBjaV9lbmFibGVfZGV2aWNlKCBwY2lfZGV2ICkgKSAKKwlpZiAoIHBjaV9lbmFibGVfZGV2aWNlKCBwY2lfZGV2ICkgKQogCQlnb3RvIGVycl9wY2k7Ci0JCisKIAljYXJkLT5pb2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoIHBjaV9kZXYsIDAgKTsKIAljYXJkLT5sZW5ndGggPSBwY2lfcmVzb3VyY2VfbGVuKCBwY2lfZGV2LCAwICk7CiAKQEAgLTMzOCw3ICszMzksNyBAQAogCXBjaV9yZWFkX2NvbmZpZ193b3JkKCBwY2lfZGV2LCBQQ0lfU1VCU1lTVEVNX0lELCAmY2FyZC0+bW9kZWwgKTsKIAogCXBjaV9zZXRfZHJ2ZGF0YSggcGNpX2RldiwgY2FyZCApOwotIAorCiAJaWYgKCAoZGV2cmFkaW8gPSBrbWFsbG9jKCBzaXplb2YoIHN0cnVjdCB2aWRlb19kZXZpY2UgKSwgR0ZQX0tFUk5FTCApKSA9PSBOVUxMICkgewogCQlwcmludGsoIEtFUk5fRVJSICJnZW10ZWtfcGNpOiBvdXQgb2YgbWVtb3J5XG4iICk7CiAJCWdvdG8gZXJyX3ZpZGVvOwpAQCAtMzU0LDcgKzM1NSw3IEBACiAJZGV2cmFkaW8tPnByaXYgPSBjYXJkOwogCWdlbXRla19wY2lfbXV0ZSggY2FyZCApOwogCi0JcHJpbnRrKCBLRVJOX0lORk8gIkdlbXRlayBQQ0kgUmFkaW8gKHJldi4gJWQpIGZvdW5kIGF0IDB4JTA0eC0weCUwNHguXG4iLCAKKwlwcmludGsoIEtFUk5fSU5GTyAiR2VtdGVrIFBDSSBSYWRpbyAocmV2LiAlZCkgZm91bmQgYXQgMHglMDR4LTB4JTA0eC5cbiIsCiAJCWNhcmQtPmNoaXByZXYsIGNhcmQtPmlvYmFzZSwgY2FyZC0+aW9iYXNlICsgY2FyZC0+bGVuZ3RoIC0gMSApOwogCiAJcmV0dXJuIDA7CkBAIC0zNjQsNyArMzY1LDcgQEAKIAogZXJyX3BjaToKIAlrZnJlZSggY2FyZCApOwotCXJldHVybiAtRU5PREVWOyAgICAgICAgCisJcmV0dXJuIC1FTk9ERVY7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZGV2ZXhpdCBnZW10ZWtfcGNpX3JlbW92ZSggc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYgKQpAQCAtMzc1LDEyICszNzYsMTIgQEAKIAlrZnJlZSggY2FyZC0+dmlkZW9kZXYgKTsKIAogCXJlbGVhc2VfcmVnaW9uKCBjYXJkLT5pb2Jhc2UsIGNhcmQtPmxlbmd0aCApOwotCQorCiAJaWYgKCBteCApCiAJCWdlbXRla19wY2lfbXV0ZSggY2FyZCApOwogCiAJa2ZyZWUoIGNhcmQgKTsKLQkKKwogCXBjaV9zZXRfZHJ2ZGF0YSggcGNpX2RldiwgTlVMTCApOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLWdlbXRlay5jIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1nZW10ZWsuYwppbmRleCA0NzE3M2JlLi4xNjJmMzdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLWdlbXRlay5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tZ2VtdGVrLmMKQEAgLTYsNyArNiw3IEBACiAgKiBCZXNpZGVzIHRoZSBwcm90b2NvbCBjaGFuZ2VzLCB0aGlzIGlzIG1vc3RseSBhIGNvcHkgb2Y6CiAgKgogICogICAgUmFkaW9UcmFjayBJSSBkcml2ZXIgZm9yIExpbnV4IHJhZGlvIHN1cHBvcnQgKEMpIDE5OTggQmVuIFBmYWZmCi0gKiAKKyAqCiAgKiAgICBCYXNlZCBvbiBSYWRpb1RyYWNrIEkvUmFkaW9SZXZlYWwgKEMpIDE5OTcgTS4gS2lya3dvb2QKICAqICAgIENvbnZlcnRlZCB0byBuZXcgQVBJIGJ5IEFsYW4gQ294IDxBbGFuLkNveEBsaW51eC5vcmc+CiAgKiAgICBWYXJpb3VzIGJ1Z2ZpeGVzIGFuZCBlbmhhbmNlbWVudHMgYnkgUnVzc2VsbCBLcm9sbCA8cmtyb2xsQGV4cGxvaXRzLm9yZz4KQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4JCS8qIG91dGIsIG91dGJfcAkJCSovCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4JLyogY29weSB0by9mcm9tIHVzZXIJCSovCiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4JLyoga2VybmVsIHJhZGlvIHN0cnVjdHMJCSovCisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4JLyogQ09ORklHX1JBRElPX0dFTVRFS19QT1JUIAkqLwogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAKQEAgLTI5LDcgKzMwLDcgQEAKICNkZWZpbmUgQ09ORklHX1JBRElPX0dFTVRFS19QT1JUIC0xCiAjZW5kaWYKIAotc3RhdGljIGludCBpbyA9IENPTkZJR19SQURJT19HRU1URUtfUE9SVDsgCitzdGF0aWMgaW50IGlvID0gQ09ORklHX1JBRElPX0dFTVRFS19QT1JUOwogc3RhdGljIGludCByYWRpb19uciA9IC0xOwogc3RhdGljIHNwaW5sb2NrX3QgbG9jazsKIApAQCAtNDgsNyArNDksNyBAQAogICovCiBzdGF0aWMgdm9pZCBnZW10ZWtfbXV0ZShzdHJ1Y3QgZ2VtdGVrX2RldmljZSAqZGV2KQogewotICAgICAgICBpZihkZXYtPm11dGVkKQorCWlmKGRldi0+bXV0ZWQpCiAJCXJldHVybjsKIAlzcGluX2xvY2soJmxvY2spOwogCW91dGIoMHgxMCwgaW8pOwpAQCAtOTQsMjAgKzk1LDIwIEBACiAJZnJlcSAvPSAxMDAwMDA7CiAKIAlzcGluX2xvY2soJmxvY2spOwotCQorCiAJLyogMiBzdGFydCBiaXRzICovCiAJb3V0Yl9wKDB4MDMsIGlvKTsKIAl1ZGVsYXkoNSk7CiAJb3V0Yl9wKDB4MDcsIGlvKTsKIAl1ZGVsYXkoNSk7CiAKLSAgICAgICAgLyogMjggZnJlcXVlbmN5IGJpdHMgKGxzYiBmaXJzdCkgKi8KKwkvKiAyOCBmcmVxdWVuY3kgYml0cyAobHNiIGZpcnN0KSAqLwogCWZvciAoaSA9IDA7IGkgPCAxNDsgaSsrKQogCQlpZiAoZnJlcSAmICgxIDw8IGkpKQogCQkJb25lKCk7CiAJCWVsc2UKIAkJCXplcm8oKTsKLSAgICAgICAgLyogMzYgdW5rbm93biBiaXRzICovCisJLyogMzYgdW5rbm93biBiaXRzICovCiAJZm9yIChpID0gMDsgaSA8IDExOyBpKyspCiAJCXplcm8oKTsKIAlvbmUoKTsKQEAgLTEyMyw3ICsxMjQsNyBAQAogCXVkZWxheSg1KTsKIAogCXNwaW5fdW5sb2NrKCZsb2NrKTsKLQkKKwogCXJldHVybiAwOwogfQogCkBAIC0xNTksNyArMTYwLDcgQEAKIAkJY2FzZSBWSURJT0NHVFVORVI6CiAJCXsKIAkJCXN0cnVjdCB2aWRlb190dW5lciAqdiA9IGFyZzsKLQkJCWlmKHYtPnR1bmVyKQkvKiBPbmx5IDEgdHVuZXIgKi8gCisJCQlpZih2LT50dW5lcikJLyogT25seSAxIHR1bmVyICovCiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl2LT5yYW5nZWxvdz04NyoxNjAwMDsKIAkJCXYtPnJhbmdlaGlnaD0xMDgqMTYwMDA7CkBAIC0xOTMsMjUgKzE5NCwyNSBAQAogCQkJcmV0dXJuIDA7CiAJCX0KIAkJY2FzZSBWSURJT0NHQVVESU86Ci0JCXsJCisJCXsKIAkJCXN0cnVjdCB2aWRlb19hdWRpbyAqdiA9IGFyZzsKIAkJCW1lbXNldCh2LDAsIHNpemVvZigqdikpOwogCQkJdi0+ZmxhZ3N8PVZJREVPX0FVRElPX01VVEFCTEU7CiAJCQl2LT52b2x1bWU9MTsKIAkJCXYtPnN0ZXA9NjU1MzU7CiAJCQlzdHJjcHkodi0+bmFtZSwgIlJhZGlvIik7Ci0JCQlyZXR1cm4gMDsJCQkKKwkJCXJldHVybiAwOwogCQl9CiAJCWNhc2UgVklESU9DU0FVRElPOgogCQl7CiAJCQlzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYgPSBhcmc7Ci0JCQlpZih2LT5hdWRpbykgCisJCQlpZih2LT5hdWRpbykKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAotCQkJaWYodi0+ZmxhZ3MmVklERU9fQVVESU9fTVVURSkgCisJCQlpZih2LT5mbGFncyZWSURFT19BVURJT19NVVRFKQogCQkJCWdlbXRla19tdXRlKHJ0KTsKIAkJCWVsc2UKLQkJCSAgICAgICAgZ2VtdGVrX3VubXV0ZShydCk7CisJCQkJZ2VtdGVrX3VubXV0ZShydCk7CiAKIAkJCXJldHVybiAwOwogCQl9CkBAIC0yNTQsMTQgKzI1NSwxNCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvLCA0LCAiZ2VtdGVrIikpIAorCWlmICghcmVxdWVzdF9yZWdpb24oaW8sIDQsICJnZW10ZWsiKSkKIAl7CiAJCXByaW50ayhLRVJOX0VSUiAiZ2VtdGVrOiBwb3J0IDB4JXggYWxyZWFkeSBpbiB1c2VcbiIsIGlvKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAKIAlnZW10ZWtfcmFkaW8ucHJpdj0mZ2VtdGVrX3VuaXQ7Ci0JCisKIAlpZih2aWRlb19yZWdpc3Rlcl9kZXZpY2UoJmdlbXRla19yYWRpbywgVkZMX1RZUEVfUkFESU8sIHJhZGlvX25yKT09LTEpCiAJewogCQlyZWxlYXNlX3JlZ2lvbihpbywgNCk7CkBAIC0yNzQsNyArMjc1LDcgQEAKIAkvKiB0aGlzIGlzIF9tYXliZV8gdW5uZWNlc3NhcnkgKi8KIAlvdXRiKDB4MDEsIGlvKTsKIAotIAkvKiBtdXRlIGNhcmQgLSBwcmV2ZW50cyBub2lzeSBib290dXBzICovCisJLyogbXV0ZSBjYXJkIC0gcHJldmVudHMgbm9pc3kgYm9vdHVwcyAqLwogCWdlbXRla191bml0Lm11dGVkID0gMDsKIAlnZW10ZWtfbXV0ZSgmZ2VtdGVrX3VuaXQpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLW1hZXN0cm8uYyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tbWFlc3Ryby5jCmluZGV4IDM5YzFkOTEuLmZjZmE2YzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tbWFlc3Ryby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tbWFlc3Ryby5jCkBAIC0yLDcgKzIsNyBAQAogICogKGMpIDIwMDAgQS4gVGxhbGthLCBhdGxrYUBwZy5nZGEucGwKICAqIE5vdGVzIG9uIHRoZSBoYXJkd2FyZQogICoKLSAqICArIEZyZXF1ZW5jeSBjb250cm9sIGlzIGRvbmUgZGlnaXRhbGx5IAorICogICsgRnJlcXVlbmN5IGNvbnRyb2wgaXMgZG9uZSBkaWdpdGFsbHkKICAqICArIE5vIHZvbHVtZSBjb250cm9sIC0gb25seSBtdXRlL3VubXV0ZSAtIHlvdSBoYXZlIHRvIHVzZSBBdXggbGluZSB2b2x1bWUKICAqICBjb250cm9sIG9uIE1hZXN0cm8gY2FyZCB0byBzZXQgdGhlIHZvbHVtZQogICogICsgUmFkaW8gc3RhdHVzICh0dW5lZC9ub3RfdHVuZWQgYW5kIHN0ZXJlby9tb25vKSBpcyB2YWxpZCBzb21lIHRpbWUgYWZ0ZXIKQEAgLTI2LDcgKzI2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+Ci0KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgogCiAjZGVmaW5lIERSSVZFUl9WRVJTSU9OCSIwLjA1IgogCkBAIC0xMDMsNyArMTAzLDcgQEAKIHN0cnVjdCByYWRpb19kZXZpY2UgewogCXUxNglpbywJLyogYmFzZSBvZiBNYWVzdHJvIGNhcmQgcmFkaW8gaW8gKEdQSU9fREFUQSkqLwogCQltdXRlZCwJLyogVklERU9fQVVESU9fTVVURSAqLwotCQlzdGVyZW8sCS8qIFZJREVPX1RVTkVSX1NURVJFT19PTiAqLwkKKwkJc3RlcmVvLAkvKiBWSURFT19UVU5FUl9TVEVSRU9fT04gKi8KIAkJdHVuZWQ7CS8qIHNpZ25hbCBzdHJlbmd0aCAoMCBvciAweGZmZmYpICovCiAJc3RydWN0IG11dGV4IGxvY2s7CiB9OwpAQCAtMTIyLDE0ICsxMjIsMTQgQEAKIAlmb3IgKGw9MjQ7bC0tOykgewogCQlvdXR3KFNUUl9DTEssIGlvKTsJCS8qIEhJIHN0YXRlICovCiAJCXVkZWxheSgyKTsKLQkJaWYoIWwpIAorCQlpZighbCkKIAkJCWRldi0+dHVuZWQgPSBpbncoaW8pICYgU1RSX01PU1QgPyAwIDogMHhmZmZmOwogCQlvdXR3KDAsIGlvKTsJCQkvKiBMTyBzdGF0ZSAqLwogCQl1ZGVsYXkoMik7CiAJCWRhdGEgPDw9IDE7CQkJLyogc2hpZnQgZGF0YSAqLwogCQlyZGF0YSA9IGludyhpbyk7CiAJCWlmKCFsKQotCQkJZGV2LT5zdGVyZW8gPSAgcmRhdGEgJiBTVFJfTU9TVCA/IAorCQkJZGV2LT5zdGVyZW8gPSAgcmRhdGEgJiBTVFJfTU9TVCA/CiAJCQkwIDogVklERU9fVFVORVJfU1RFUkVPX09OOwogCQllbHNlCiAJCQlpZihyZGF0YSAmIFNUUl9EQVRBKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1tYXhpcmFkaW8uYyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tbWF4aXJhZGlvLmMKaW5kZXggZjBiZjQ3Yi4uZjkzZDdhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1tYXhpcmFkaW8uYworKysgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLW1heGlyYWRpby5jCkBAIC0xLDE1ICsxLDE1IEBACi0vKiAKLSAqIEd1aWxsZW1vdCBNYXhpIFJhZGlvIEZNIDIwMDAgUENJIHJhZGlvIGNhcmQgZHJpdmVyIGZvciBMaW51eCAKKy8qCisgKiBHdWlsbGVtb3QgTWF4aSBSYWRpbyBGTSAyMDAwIFBDSSByYWRpbyBjYXJkIGRyaXZlciBmb3IgTGludXgKICAqIChDKSAyMDAxIERpbWl0cm9tYW5vbGFraXMgQXBvc3RvbG9zIDxhcGRpbUBncmVjaWFuLm5ldD4KICAqCiAgKiBCYXNlZCBpbiB0aGUgcmFkaW8gTWFlc3RybyBQQ0kgZHJpdmVyLiBBY3R1YWxseSBpdCB1c2VzIHRoZSBzYW1lIGNoaXAKICAqIGZvciByYWRpbyBidXQgZGlmZmVyZW50IHBjaSBjb250cm9sbGVyLgogICoKICAqIEkgZGlkbid0IGhhdmUgYW55IHNwZWNzIEkgcmV2ZXJzZWQgZW5naW5lZXJlZCB0aGUgcHJvdG9jb2wgZnJvbQotICogdGhlIHdpbmRvd3MgZHJpdmVyIChyYWRpby5kbGwpLiAKKyAqIHRoZSB3aW5kb3dzIGRyaXZlciAocmFkaW8uZGxsKS4KICAqCiAgKiBUaGUgY2FyZCB1c2VzIHRoZSBURUE1NzU3IGNoaXAgdGhhdCBpbmNsdWRlcyBhIHNlYXJjaCBmdW5jdGlvbiBidXQgaXQKLSAqIGlzIHVzZWxlc3MgYXMgSSBoYXZlbid0IGZvdW5kIGFueSB3YXkgdG8gcmVhZCBiYWNrIHRoZSBmcmVxdWVuY3kuIElmIAorICogaXMgdXNlbGVzcyBhcyBJIGhhdmVuJ3QgZm91bmQgYW55IHdheSB0byByZWFkIGJhY2sgdGhlIGZyZXF1ZW5jeS4gSWYKICAqIGFueWJvZHkgZG9lcyBwbGVhc2UgbWFpbCBtZS4KICAqCiAgKiBGb3IgdGhlIHBkZiBmaWxlIHNlZToKQEAgLTI0LDcgKzI0LDcgQEAKICAqICAgICAtIHRpZGluZyB1cAogICogICAgIC0gcmVtb3ZlZCBzdXBwb3J0IGZvciBtdWx0aXBsZSBkZXZpY2VzIGFzIGl0IGRpZG4ndCB3b3JrIGFueXdheQogICoKLSAqIEJVR1M6IAorICogQlVHUzoKICAqICAgLSBjYXJkIHVubXV0ZXMgaWYgeW91IGNoYW5nZSBmcmVxdWVuY3kKICAqCiAgKi8KQEAgLTQxLDYgKzQxLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KIAogLyogdmVyc2lvbiAwLjc1ICAgICAgU3VuIEZlYiAgNCAyMjo1MToyNyBFRVQgMjAwMSAqLwogI2RlZmluZSBEUklWRVJfVkVSU0lPTgkiMC43NSIKQEAgLTgwLDcgKzgxLDcgQEAKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLm9wZW4gICAgICAgICAgID0gdmlkZW9fZXhjbHVzaXZlX29wZW4sCiAJLnJlbGVhc2UgICAgICAgID0gdmlkZW9fZXhjbHVzaXZlX3JlbGVhc2UsCi0JLmlvY3RsCSAgICAgICAgPSByYWRpb19pb2N0bCwKKwkuaW9jdGwJCT0gcmFkaW9faW9jdGwsCiAJLmNvbXBhdF9pb2N0bAk9IHY0bF9jb21wYXRfaW9jdGwzMiwKIAkubGxzZWVrICAgICAgICAgPSBub19sbHNlZWssCiB9OwpAQCAtOTcsMTEgKzk4LDExIEBACiB7CiAJX191MTYJaW8sCS8qIGJhc2Ugb2YgcmFkaW8gaW8gKi8KIAkJbXV0ZWQsCS8qIFZJREVPX0FVRElPX01VVEUgKi8KLQkJc3RlcmVvLAkvKiBWSURFT19UVU5FUl9TVEVSRU9fT04gKi8JCisJCXN0ZXJlbywJLyogVklERU9fVFVORVJfU1RFUkVPX09OICovCiAJCXR1bmVkOwkvKiBzaWduYWwgc3RyZW5ndGggKDAgb3IgMHhmZmZmKSAqLwotCQkKKwogCXVuc2lnbmVkIGxvbmcgZnJlcTsKLQkKKwogCXN0cnVjdCBtdXRleCBsb2NrOwogfSByYWRpb191bml0ID0gezAsIDAsIDAsIDAsIH07CiAKQEAgLTExNCw3ICsxMTUsNyBAQAogCQkJb3V0YiggIHBvd2VyfHdyZW58ZGF0YXxjbGsgLGlvKTsgdWRlbGF5KDQpOwogCQkJb3V0YiggIHBvd2VyfHdyZW58ZGF0YSAgICAgLGlvKTsgdWRlbGF5KDQpOwogCQl9Ci0JZWxzZQkKKwllbHNlCiAJCXsKIAkJCW91dGIoICBwb3dlcnx3cmVuICAgICAgICAgICxpbyk7IHVkZWxheSg0KTsKIAkJCW91dGIoICBwb3dlcnx3cmVufGNsayAgICAgICxpbyk7IHVkZWxheSg0KTsKQEAgLTEzMiwxMiArMTMzLDEyIEBACiB7CiAJdW5zaWduZWQgbG9uZyBpbnQgc2k7CiAJaW50IGJsOwotCQorCiAJLyogVEVBNTc1NyBzaGlmdCByZWdpc3RlciBiaXRzIChzZWUgcGRmKSAqLwogCi0Jb3V0Yml0KDAsaW8pOyAvLyAyNCAgc2VhcmNoIAorCW91dGJpdCgwLGlvKTsgLy8gMjQgIHNlYXJjaAogCW91dGJpdCgxLGlvKTsgLy8gMjMgIHNlYXJjaCB1cC9kb3duCi0JCisKIAlvdXRiaXQoMCxpbyk7IC8vIDIyICBzdGVyZW8vbW9ubwogCiAJb3V0Yml0KDAsaW8pOyAvLyAyMSAgYmFuZApAQCAtMTQ1LDI0ICsxNDYsMjQgQEAKIAogCW91dGJpdCgwLGlvKTsgLy8gMTkgIHBvcnQgPwogCW91dGJpdCgwLGlvKTsgLy8gMTggIHBvcnQgPwotCQorCiAJb3V0Yml0KDAsaW8pOyAvLyAxNyAgc2VhcmNoIGxldmVsCiAJb3V0Yml0KDAsaW8pOyAvLyAxNiAgc2VhcmNoIGxldmVsCi0gCisKIAlzaSA9IDB4ODAwMDsKIAlmb3IoYmwgPSAxOyBibCA8PSAxNiA7IGJsKyspIHsgb3V0Yml0KGRhdGEgJiBzaSxpbyk7IHNpID4+PTE7IH0KLQkKKwogCW91dGIocG93ZXIsaW8pOwogfQogCiBzdGF0aWMgaW50IGdldF9zdGVyZW8oX191MTYgaW8pCi17CQorewogCW91dGIocG93ZXIsaW8pOyB1ZGVsYXkoNCk7CiAJcmV0dXJuICEoaW5iKGlvKSAmIG1vX3N0KTsKIH0KIAogc3RhdGljIGludCBnZXRfdHVuZShfX3UxNiBpbykKLXsJCit7CiAJb3V0Yihwb3dlcitjbGssaW8pOyB1ZGVsYXkoNCk7CiAJcmV0dXJuICEoaW5iKGlvKSAmIG1vX3N0KTsKIH0KQEAgLTE3Nyw3ICsxNzgsNyBAQAogCXN3aXRjaChjbWQpIHsKIAkJY2FzZSBWSURJT0NHQ0FQOiB7CiAJCQlzdHJ1Y3QgdmlkZW9fY2FwYWJpbGl0eSAqdiA9IGFyZzsKLQkJCQorCiAJCQltZW1zZXQodiwwLHNpemVvZigqdikpOwogCQkJc3RyY3B5KHYtPm5hbWUsICJNYXhpIFJhZGlvIEZNMjAwMCByYWRpbyIpOwogCQkJdi0+dHlwZT1WSURfVFlQRV9UVU5FUjsKQEAgLTE4NiwyMiArMTg3LDIyIEBACiAJCX0KIAkJY2FzZSBWSURJT0NHVFVORVI6IHsKIAkJCXN0cnVjdCB2aWRlb190dW5lciAqdiA9IGFyZzsKLQkJCQorCiAJCQlpZih2LT50dW5lcikKIAkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCQkKKwogCQkJY2FyZC0+c3RlcmVvID0gMHhmZmZmICogZ2V0X3N0ZXJlbyhjYXJkLT5pbyk7CiAJCQljYXJkLT50dW5lZCA9IDB4ZmZmZiAqIGdldF90dW5lKGNhcmQtPmlvKTsKLQkJCQorCiAJCQl2LT5mbGFncyA9IFZJREVPX1RVTkVSX0xPVyB8IGNhcmQtPnN0ZXJlbzsKIAkJCXYtPnNpZ25hbCA9IGNhcmQtPnR1bmVkOwotCQkJCisKIAkJCXN0cmNweSh2LT5uYW1lLCAiRk0iKTsKLQkJCQorCiAJCQl2LT5yYW5nZWxvdyA9IEZSRVFfTE87CiAJCQl2LT5yYW5nZWhpZ2ggPSBGUkVRX0hJOwogCQkJdi0+bW9kZSA9IFZJREVPX01PREVfQVVUTzsKLQkJCQorCiAJCQlyZXR1cm4gMDsKIAkJfQogCQljYXNlIFZJRElPQ1NUVU5FUjogewpAQCAtMjEyLDEzICsyMTMsMTMgQEAKIAkJfQogCQljYXNlIFZJRElPQ0dGUkVROiB7CiAJCQl1bnNpZ25lZCBsb25nICpmcmVxID0gYXJnOwotCQkJCisKIAkJCSpmcmVxID0gY2FyZC0+ZnJlcTsKIAkJCXJldHVybiAwOwogCQl9CiAJCWNhc2UgVklESU9DU0ZSRVE6IHsKIAkJCXVuc2lnbmVkIGxvbmcgKmZyZXEgPSBhcmc7Ci0JCQkKKwogCQkJaWYgKCpmcmVxIDwgRlJFUV9MTyB8fCAqZnJlcSA+IEZSRVFfSEkpCiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQljYXJkLT5mcmVxID0gKmZyZXE7CkBAIC0yMjYsMTggKzIyNywxOCBAQAogCQkJbXNsZWVwKDEyNSk7CiAJCQlyZXR1cm4gMDsKIAkJfQotCQljYXNlIFZJRElPQ0dBVURJTzogewkKKwkJY2FzZSBWSURJT0NHQVVESU86IHsKIAkJCXN0cnVjdCB2aWRlb19hdWRpbyAqdiA9IGFyZzsKIAkJCW1lbXNldCh2LDAsc2l6ZW9mKCp2KSk7CiAJCQlzdHJjcHkodi0+bmFtZSwgIlJhZGlvIik7CiAJCQl2LT5mbGFncz1WSURFT19BVURJT19NVVRBQkxFIHwgY2FyZC0+bXV0ZWQ7CiAJCQl2LT5tb2RlPVZJREVPX1NPVU5EX1NURVJFTzsKLQkJCXJldHVybiAwOwkJCisJCQlyZXR1cm4gMDsKIAkJfQotCQkKKwogCQljYXNlIFZJRElPQ1NBVURJTzogewogCQkJc3RydWN0IHZpZGVvX2F1ZGlvICp2ID0gYXJnOwotCQkJCisKIAkJCWlmKHYtPmF1ZGlvKQogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJY2FyZC0+bXV0ZWQgPSB2LT5mbGFncyAmIFZJREVPX0FVRElPX01VVEU7CkBAIC0yNDksMTMgKzI1MCwxMyBAQAogCQl9CiAJCWNhc2UgVklESU9DR1VOSVQ6IHsKIAkJCXN0cnVjdCB2aWRlb191bml0ICp2ID0gYXJnOwotCQkJCisKIAkJCXYtPnZpZGVvPVZJREVPX05PX1VOSVQ7CiAJCQl2LT52Ymk9VklERU9fTk9fVU5JVDsKIAkJCXYtPnJhZGlvPWRldi0+bWlub3I7CiAJCQl2LT5hdWRpbz0wOwogCQkJdi0+dGVsZXRleHQ9VklERU9fTk9fVU5JVDsKLQkJCXJldHVybiAwOwkJCisJCQlyZXR1cm4gMDsKIAkJfQogCQlkZWZhdWx0OiByZXR1cm4gLUVOT0lPQ1RMQ01EOwogCX0KQEAgLTI2Nyw3ICsyNjgsNyBAQAogCXN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7CiAJc3RydWN0IHJhZGlvX2RldmljZSAqY2FyZD1kZXYtPnByaXY7CiAJaW50IHJldDsKLQkKKwogCW11dGV4X2xvY2soJmNhcmQtPmxvY2spOwogCXJldCA9IHZpZGVvX3VzZXJjb3B5KGlub2RlLCBmaWxlLCBjbWQsIGFyZywgcmFkaW9fZnVuY3Rpb24pOwogCW11dGV4X3VubG9jaygmY2FyZC0+bG9jayk7CkBAIC0yODIsMjEgKzI4MywyMSBAQAogc3RhdGljIGludCBfX2RldmluaXQgbWF4aXJhZGlvX2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQogewogCWlmKCFyZXF1ZXN0X3JlZ2lvbihwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCksCi0JICAgICAgICAgICAgICAgICAgIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCksICJNYXhpIFJhZGlvIEZNIDIwMDAiKSkgewotCSAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJyYWRpby1tYXhpcmFkaW86IGNhbid0IHJlc2VydmUgSS9PIHBvcnRzXG4iKTsKLQkgICAgICAgIGdvdG8gZXJyX291dDsKKwkJCSAgIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCksICJNYXhpIFJhZGlvIEZNIDIwMDAiKSkgeworCQlwcmludGsoS0VSTl9FUlIgInJhZGlvLW1heGlyYWRpbzogY2FuJ3QgcmVzZXJ2ZSBJL08gcG9ydHNcbiIpOworCQlnb3RvIGVycl9vdXQ7CiAJfQogCiAJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKQotCSAgICAgICAgZ290byBlcnJfb3V0X2ZyZWVfcmVnaW9uOworCQlnb3RvIGVycl9vdXRfZnJlZV9yZWdpb247CiAKIAlyYWRpb191bml0LmlvID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOwogCW11dGV4X2luaXQoJnJhZGlvX3VuaXQubG9jayk7CiAJbWF4aXJhZGlvX3JhZGlvLnByaXYgPSAmcmFkaW9fdW5pdDsKIAogCWlmKHZpZGVvX3JlZ2lzdGVyX2RldmljZSgmbWF4aXJhZGlvX3JhZGlvLCBWRkxfVFlQRV9SQURJTywgcmFkaW9fbnIpPT0tMSkgewotCSAgICAgICAgcHJpbnRrKCJyYWRpby1tYXhpcmFkaW86IGNhbid0IHJlZ2lzdGVyIGRldmljZSEiKTsKLQkgICAgICAgIGdvdG8gZXJyX291dF9mcmVlX3JlZ2lvbjsKKwkJcHJpbnRrKCJyYWRpby1tYXhpcmFkaW86IGNhbid0IHJlZ2lzdGVyIGRldmljZSEiKTsKKwkJZ290byBlcnJfb3V0X2ZyZWVfcmVnaW9uOwogCX0KIAogCXByaW50ayhLRVJOX0lORk8gInJhZGlvLW1heGlyYWRpbzogdmVyc2lvbiAiCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXJ0cmFjazIuYyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tcnRyYWNrMi5jCmluZGV4IDI4YTQ3YzkuLjViNjhhYzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tcnRyYWNrMi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tcnRyYWNrMi5jCkBAIC0xLDUgKzEsNSBAQAogLyogUmFkaW9UcmFjayBJSSBkcml2ZXIgZm9yIExpbnV4IHJhZGlvIHN1cHBvcnQgKEMpIDE5OTggQmVuIFBmYWZmCi0gKiAKKyAqCiAgKiBCYXNlZCBvbiBSYWRpb1RyYWNrIEkvUmFkaW9SZXZlYWwgKEMpIDE5OTcgTS4gS2lya3dvb2QKICAqIENvbnZlcnRlZCB0byBuZXcgQVBJIGJ5IEFsYW4gQ294IDxBbGFuLkNveEBsaW51eC5vcmc+CiAgKiBWYXJpb3VzIGJ1Z2ZpeGVzIGFuZCBlbmhhbmNlbWVudHMgYnkgUnVzc2VsbCBLcm9sbCA8cmtyb2xsQGV4cGxvaXRzLm9yZz4KQEAgLTE1LDYgKzE1LDcgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4JCS8qIG91dGIsIG91dGJfcAkJCSovCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4JLyogY29weSB0by9mcm9tIHVzZXIJCSovCiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4JLyoga2VybmVsIHJhZGlvIHN0cnVjdHMJCSovCisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4JLyogQ09ORklHX1JBRElPX1JUUkFDSzJfUE9SVCAJKi8KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogCkBAIC0yMiw3ICsyMyw3IEBACiAjZGVmaW5lIENPTkZJR19SQURJT19SVFJBQ0syX1BPUlQgLTEKICNlbmRpZgogCi1zdGF0aWMgaW50IGlvID0gQ09ORklHX1JBRElPX1JUUkFDSzJfUE9SVDsgCitzdGF0aWMgaW50IGlvID0gQ09ORklHX1JBRElPX1JUUkFDSzJfUE9SVDsKIHN0YXRpYyBpbnQgcmFkaW9fbnIgPSAtMTsKIHN0YXRpYyBzcGlubG9ja190IGxvY2s7CiAKQEAgLTM4LDcgKzM5LDcgQEAKIAogc3RhdGljIHZvaWQgcnRfbXV0ZShzdHJ1Y3QgcnRfZGV2aWNlICpkZXYpCiB7Ci0gICAgICAgIGlmKGRldi0+bXV0ZWQpCisJaWYoZGV2LT5tdXRlZCkKIAkJcmV0dXJuOwogCXNwaW5fbG9jaygmbG9jayk7CiAJb3V0YigxLCBpbyk7CkBAIC01OCwxNCArNTksMTQgQEAKIAogc3RhdGljIHZvaWQgemVybyh2b2lkKQogewotICAgICAgICBvdXRiX3AoMSwgaW8pOworCW91dGJfcCgxLCBpbyk7CiAJb3V0Yl9wKDMsIGlvKTsKIAlvdXRiX3AoMSwgaW8pOwogfQogCiBzdGF0aWMgdm9pZCBvbmUodm9pZCkKIHsKLSAgICAgICAgb3V0Yl9wKDUsIGlvKTsKKwlvdXRiX3AoNSwgaW8pOwogCW91dGJfcCg3LCBpbyk7CiAJb3V0Yl9wKDUsIGlvKTsKIH0KQEAgLTc1LDcgKzc2LDcgQEAKIAlpbnQgaTsKIAogCWZyZXEgPSBmcmVxIC8gMjAwICsgODU2OwotCQorCiAJc3Bpbl9sb2NrKCZsb2NrKTsKIAogCW91dGJfcCgweGM4LCBpbyk7CkBAIC05NCw3ICs5NSw3IEBACiAJb3V0Yl9wKDB4YzgsIGlvKTsKIAlpZiAoIWRldi0+bXV0ZWQpCiAJCW91dGJfcCgwLCBpbyk7Ci0JCQorCiAJc3Bpbl91bmxvY2soJmxvY2spOwogCXJldHVybiAwOwogfQpAQCAtMTI3LDcgKzEyOCw3IEBACiAJCWNhc2UgVklESU9DR1RVTkVSOgogCQl7CiAJCQlzdHJ1Y3QgdmlkZW9fdHVuZXIgKnYgPSBhcmc7Ci0JCQlpZih2LT50dW5lcikJLyogT25seSAxIHR1bmVyICovIAorCQkJaWYodi0+dHVuZXIpCS8qIE9ubHkgMSB0dW5lciAqLwogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJdi0+cmFuZ2Vsb3c9ODgqMTYwMDA7CiAJCQl2LT5yYW5nZWhpZ2g9MTA4KjE2MDAwOwpAQCAtMTU5LDI1ICsxNjAsMjUgQEAKIAkJCXJldHVybiAwOwogCQl9CiAJCWNhc2UgVklESU9DR0FVRElPOgotCQl7CQorCQl7CiAJCQlzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYgPSBhcmc7CiAJCQltZW1zZXQodiwwLCBzaXplb2YoKnYpKTsKIAkJCXYtPmZsYWdzfD1WSURFT19BVURJT19NVVRBQkxFOwogCQkJdi0+dm9sdW1lPTE7CiAJCQl2LT5zdGVwPTY1NTM1OwogCQkJc3RyY3B5KHYtPm5hbWUsICJSYWRpbyIpOwotCQkJcmV0dXJuIDA7CQkJCisJCQlyZXR1cm4gMDsKIAkJfQogCQljYXNlIFZJRElPQ1NBVURJTzoKIAkJewogCQkJc3RydWN0IHZpZGVvX2F1ZGlvICp2ID0gYXJnOwotCQkJaWYodi0+YXVkaW8pIAorCQkJaWYodi0+YXVkaW8pCiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAKLQkJCWlmKHYtPmZsYWdzJlZJREVPX0FVRElPX01VVEUpIAorCQkJaWYodi0+ZmxhZ3MmVklERU9fQVVESU9fTVVURSkKIAkJCQlydF9tdXRlKHJ0KTsKIAkJCWVsc2UKLQkJCSAgICAgICAgcnRfdW5tdXRlKHJ0KTsKKwkJCQlydF91bm11dGUocnQpOwogCiAJCQlyZXR1cm4gMDsKIAkJfQpAQCAtMjE5LDcgKzIyMCw3IEBACiAJCXByaW50ayhLRVJOX0VSUiAiWW91IG11c3Qgc2V0IGFuIEkvTyBhZGRyZXNzIHdpdGggaW89MHgyMGMgb3IgaW89MHgzMGNcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JaWYgKCFyZXF1ZXN0X3JlZ2lvbihpbywgNCwgInJ0cmFjazIiKSkgCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihpbywgNCwgInJ0cmFjazIiKSkKIAl7CiAJCXByaW50ayhLRVJOX0VSUiAicnRyYWNrMjogcG9ydCAweCV4IGFscmVhZHkgaW4gdXNlXG4iLCBpbyk7CiAJCXJldHVybiAtRUJVU1k7CkBAIC0yMjcsMTYgKzIyOCwxNiBAQAogCiAJcnRyYWNrMl9yYWRpby5wcml2PSZydHJhY2syX3VuaXQ7CiAKLQlzcGluX2xvY2tfaW5pdCgmbG9jayk7CQorCXNwaW5fbG9ja19pbml0KCZsb2NrKTsKIAlpZih2aWRlb19yZWdpc3Rlcl9kZXZpY2UoJnJ0cmFjazJfcmFkaW8sIFZGTF9UWVBFX1JBRElPLCByYWRpb19ucik9PS0xKQogCXsKIAkJcmVsZWFzZV9yZWdpb24oaW8sIDQpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JCQorCiAJcHJpbnRrKEtFUk5fSU5GTyAiQUlNU2xhYiBSYWRpb3RyYWNrIElJIGNhcmQgZHJpdmVyLlxuIik7CiAKLSAJLyogbXV0ZSBjYXJkIC0gcHJldmVudHMgbm9pc3kgYm9vdHVwcyAqLworCS8qIG11dGUgY2FyZCAtIHByZXZlbnRzIG5vaXN5IGJvb3R1cHMgKi8KIAlvdXRiKDEsIGlvKTsKIAlydHJhY2syX3VuaXQubXV0ZWQgPSAxOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXNmMTZmbWkuYyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tc2YxNmZtaS5jCmluZGV4IDUzMDczYjQuLmVmZWU2ZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tc2YxNmZtaS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tc2YxNmZtaS5jCkBAIC0xMiw3ICsxMiw3IEBACiAgKiAgRnJlcXVlbmN5IGNvbnRyb2wgaXMgZG9uZSBkaWdpdGFsbHkgLS0gaWUgb3V0KHBvcnQsZW5jb2RlZnJlcSg5NS44KSk7CiAgKiAgTm8gdm9sdW1lIGNvbnRyb2wgLSBvbmx5IG11dGUvdW5tdXRlIC0geW91IGhhdmUgdG8gdXNlIGxpbmUgdm9sdW1lCiAgKiAgY29udHJvbCBvbiBTQi1wYXJ0IG9mIFNGMTZGTUkKLSAqICAKKyAqCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgkvKiBfX3NldHVwCQkJKi8KQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4JLyogcmVxdWVzdF9yZWdpb24JCSovCiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4JLyogdWRlbGF5CQkJKi8KICNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgkvKiBrZXJuZWwgcmFkaW8gc3RydWN0cwkJKi8KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgogI2luY2x1ZGUgPGxpbnV4L2lzYXBucC5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgkJLyogb3V0Yiwgb3V0Yl9wCQkJKi8KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgkvKiBjb3B5IHRvL2Zyb20gdXNlcgkJKi8KQEAgLTI5LDE5ICszMCwxOSBAQAogc3RydWN0IGZtaV9kZXZpY2UKIHsKIAlpbnQgcG9ydDsKLSAgICAgICAgaW50IGN1cnZvbDsgLyogMSBvciAwICovCi0gICAgICAgIHVuc2lnbmVkIGxvbmcgY3VyZnJlcTsgLyogZnJlcSBpbiBrSHogKi8KLSAgICAgICAgX191MzIgZmxhZ3M7CisJaW50IGN1cnZvbDsgLyogMSBvciAwICovCisJdW5zaWduZWQgbG9uZyBjdXJmcmVxOyAvKiBmcmVxIGluIGtIeiAqLworCV9fdTMyIGZsYWdzOwogfTsKIAotc3RhdGljIGludCBpbyA9IC0xOyAKK3N0YXRpYyBpbnQgaW8gPSAtMTsKIHN0YXRpYyBpbnQgcmFkaW9fbnIgPSAtMTsKIHN0YXRpYyBzdHJ1Y3QgcG5wX2RldiAqZGV2ID0gTlVMTDsKIHN0YXRpYyBzdHJ1Y3QgbXV0ZXggbG9jazsKIAogLyogZnJlcSBpcyBpbiAxLzE2IGtIeiB0byBpbnRlcm5hbCBudW1iZXIsIGh3IHByZWNpc2lvbiBpcyA1MCBrSHogKi8KIC8qIEl0IGlzIG9ubHkgdXNlZnVsIHRvIGdpdmUgZnJlcSBpbiBpbnRlcnZhbGwgb2YgODAwICg9MC4wNU1oeiksCi0gKiBvdGhlciBiaXRzIHdpbGwgYmUgdHJ1bmNhdGVkLCBlLmcgOTIuNzQwMDAxNiAtPiA5Mi43LCBidXQgCisgKiBvdGhlciBiaXRzIHdpbGwgYmUgdHJ1bmNhdGVkLCBlLmcgOTIuNzQwMDAxNiAtPiA5Mi43LCBidXQKICAqIDkyLjc0MDAwMTcgLT4gOTIuNzUKICAqLwogI2RlZmluZSBSU0YxNl9FTkNPREUoeCkJKCh4KS84MDArMjE0KQpAQCAtNTEsNyArNTIsNyBAQAogc3RhdGljIHZvaWQgb3V0Yml0cyhpbnQgYml0cywgdW5zaWduZWQgaW50IGRhdGEsIGludCBwb3J0KQogewogCXdoaWxlKGJpdHMtLSkgewotIAkJaWYoZGF0YSAmIDEpIHsKKwkJaWYoZGF0YSAmIDEpIHsKIAkJCW91dGIoNSwgcG9ydCk7CiAJCQl1ZGVsYXkoNik7CiAJCQlvdXRiKDcsIHBvcnQpOwpAQCAtMTAxLDcgKzEwMiw3IEBACiAJaW50IHJlczsKIAlpbnQgbXlwb3J0ID0gZGV2LT5wb3J0OwogCi0JCisKIAltdXRleF9sb2NrKCZsb2NrKTsKIAl2YWwgPSBkZXYtPmN1cnZvbCA/IDB4MDggOiAweDAwOwkvKiB1bm11dGUvbXV0ZSAqLwogCW91dGIodmFsLCBteXBvcnQpOwpAQCAtMTA5LDcgKzExMCw3IEBACiAJbXNsZWVwKDE0Myk7IAkJLyogd2FzIHNjaGVkdWxlX3RpbWVvdXQoSFovNykgKi8KIAlyZXMgPSAoaW50KWluYihteXBvcnQrMSk7CiAJb3V0Yih2YWwsIG15cG9ydCk7Ci0JCisKIAltdXRleF91bmxvY2soJmxvY2spOwogCXJldHVybiAocmVzICYgMikgPyAwIDogMHhGRkZGOwogfQpAQCAtMTE5LDcgKzEyMCw3IEBACiB7CiAJc3RydWN0IHZpZGVvX2RldmljZSAqZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKIAlzdHJ1Y3QgZm1pX2RldmljZSAqZm1pPWRldi0+cHJpdjsKLQkKKwogCXN3aXRjaChjbWQpCiAJewogCQljYXNlIFZJRElPQ0dDQVA6CkBAIC0xNzQsMTggKzE3NSwxOCBAQAogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJLypyb3VuZGluZyBpbiBzdGVwcyBvZiA4MDAgdG8gbWF0Y2ggdGggZnJlcQogCQkJICB0aGF0IHdpbGwgYmUgdXNlZCAqLwotCQkJZm1pLT5jdXJmcmVxID0gKCpmcmVxLzgwMCkqODAwOyAKKwkJCWZtaS0+Y3VyZnJlcSA9ICgqZnJlcS84MDApKjgwMDsKIAkJCWZtaV9zZXRmcmVxKGZtaSk7CiAJCQlyZXR1cm4gMDsKIAkJfQogCQljYXNlIFZJRElPQ0dBVURJTzoKLQkJewkKKwkJewogCQkJc3RydWN0IHZpZGVvX2F1ZGlvICp2ID0gYXJnOwogCQkJbWVtc2V0KHYsMCxzaXplb2YoKnYpKTsKIAkJCXYtPmZsYWdzPSggKCFmbWktPmN1cnZvbCkqVklERU9fQVVESU9fTVVURSB8IFZJREVPX0FVRElPX01VVEFCTEUpOwogCQkJc3RyY3B5KHYtPm5hbWUsICJSYWRpbyIpOwogCQkJdi0+bW9kZT1WSURFT19TT1VORF9TVEVSRU87Ci0JCQlyZXR1cm4gMDsJCQkKKwkJCXJldHVybiAwOwogCQl9CiAJCWNhc2UgVklESU9DU0FVRElPOgogCQl7CkBAIC0xOTMsMTkgKzE5NCwxOSBAQAogCQkJaWYodi0+YXVkaW8pCiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQlmbWktPmN1cnZvbD0gdi0+ZmxhZ3MmVklERU9fQVVESU9fTVVURSA/IDAgOiAxOwotCQkJZm1pLT5jdXJ2b2wgPyAKKwkJCWZtaS0+Y3Vydm9sID8KIAkJCQlmbWlfdW5tdXRlKGZtaS0+cG9ydCkgOiBmbWlfbXV0ZShmbWktPnBvcnQpOwogCQkJcmV0dXJuIDA7CiAJCX0KLQkgICAgICAgIGNhc2UgVklESU9DR1VOSVQ6CisJCWNhc2UgVklESU9DR1VOSVQ6CiAJCXsKLSAgICAgICAgICAgICAgIAkJc3RydWN0IHZpZGVvX3VuaXQgKnYgPSBhcmc7CisJCQlzdHJ1Y3QgdmlkZW9fdW5pdCAqdiA9IGFyZzsKIAkJCXYtPnZpZGVvPVZJREVPX05PX1VOSVQ7CiAJCQl2LT52Ymk9VklERU9fTk9fVU5JVDsKIAkJCXYtPnJhZGlvPWRldi0+bWlub3I7CiAJCQl2LT5hdWRpbz0wOyAvKiBIb3cgZG8gd2UgZmluZCBvdXQgdGhpcz8/PyAqLwogCQkJdi0+dGVsZXRleHQ9VklERU9fTk9fVU5JVDsKLQkJCXJldHVybiAwOwkJCQorCQkJcmV0dXJuIDA7CiAJCX0KIAkJZGVmYXVsdDoKIAkJCXJldHVybiAtRU5PSU9DVExDTUQ7CkBAIC0yOTUsMTQgKzI5NiwxNCBAQAogCWZtaV91bml0LmN1cmZyZXEgPSAwOwogCWZtaV91bml0LmZsYWdzID0gVklERU9fVFVORVJfTE9XOwogCWZtaV9yYWRpby5wcml2ID0gJmZtaV91bml0OwotCQorCiAJbXV0ZXhfaW5pdCgmbG9jayk7Ci0JCisKIAlpZiAodmlkZW9fcmVnaXN0ZXJfZGV2aWNlKCZmbWlfcmFkaW8sIFZGTF9UWVBFX1JBRElPLCByYWRpb19ucikgPT0gLTEpIHsKIAkJcmVsZWFzZV9yZWdpb24oaW8sIDIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JCQorCiAJcHJpbnRrKEtFUk5fSU5GTyAiU0YxNkZNeCByYWRpbyBjYXJkIGRyaXZlciBhdCAweCV4XG4iLCBpbyk7CiAJLyogbXV0ZSBjYXJkIC0gcHJldmVudHMgbm9pc3kgYm9vdHVwcyAqLwogCWZtaV9tdXRlKGlvKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tc2YxNmZtcjIuYyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tc2YxNmZtcjIuYwppbmRleCBiY2ViZDhjLi4zNDgzYjJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXNmMTZmbXIyLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1zZjE2Zm1yMi5jCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8YXNtL2lvLmg+CQkvKiBvdXRiLCBvdXRiX3AJCQkqLwogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CS8qIGNvcHkgdG8vZnJvbSB1c2VyCQkqLwogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CS8qIGtlcm5lbCByYWRpbyBzdHJ1Y3RzCQkqLworI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIAogc3RhdGljIHN0cnVjdCBtdXRleCBsb2NrOwpAQCAtMjAyLDcgKzIwMyw3IEBACiB9CiAKIHN0YXRpYyBpbnQgZm1yMl9kb19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCisJCSAgICAgIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKIHsKIAlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwogCXN0cnVjdCBmbXIyX2RldmljZSAqZm1yMiA9IGRldi0+cHJpdjsKQEAgLTM0NCw3ICszNDUsNyBAQAogfQogCiBzdGF0aWMgaW50IGZtcjJfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCisJCSAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogIHsKIAlyZXR1cm4gdmlkZW9fdXNlcmNvcHkoaW5vZGUsIGZpbGUsIGNtZCwgYXJnLCBmbXIyX2RvX2lvY3RsKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tdGVycmF0ZWMuYyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tdGVycmF0ZWMuYwppbmRleCBmY2ZkZTJlLi5kZmJhNGFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXRlcnJhdGVjLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby10ZXJyYXRlYy5jCkBAIC0yLDExICsyLDExIEBACiAgKiAoYykgMTk5OSBSLiBPZmZlcm1hbm5zIChyb2xmQG9mZmVybWFubnMuZGUpCiAgKiBiYXNlZCBvbiB0aGUgYWltc2xhYiByYWRpbyBkcml2ZXIgZnJvbSBNLiBLaXJrd29vZAogICogbWFueSB0aGFua3MgdG8gTWljaGFlbCBCZWNrZXIgYW5kIEZyaWVkaGVsbSBCaXJ0aCAoZnJvbSBUZXJyYVRlYykKLSAqIAorICoKICAqCiAgKiBIaXN0b3J5OgogICogMTk5OS0wNS0yMQlGaXJzdCBwcmV2aWV3IHJlbGVhc2UKLSAqIAorICoKICAqICBOb3RlcyBvbiB0aGUgaGFyZHdhcmU6CiAgKiAgVGhlcmUgYXJlIHR3byAibWFpbiIgY2hpcHMgb24gdGhlIGNhcmQ6CiAgKiAgLSBQaGlsaXBzIE9NNTYxMCAoaHR0cDovL3d3dy11cy5zZW1pY29uZHVjdG9ycy5waGlsaXBzLmNvbS9hY3JvYmF0L2RhdGFzaGVldHMvT001NjEwXzIucGRmKQpAQCAtMjAsNyArMjAsNyBAQAogICogIChhcyBzb29uIGkgaGF2ZSB1bmRlcnN0YW5kIGhvdyB0byBnZXQgc3RhcnRlZCA6KQogICogIElmIHlvdSBjYW4gaGVscCBtZSBvdXQgd2l0aCB0aGF0LCBwbGVhc2UgY29udGFjdCBtZSEhCiAgKgotICogIAorICoKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CS8qIE1vZHVsZXMgCQkJKi8KQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4JCS8qIG91dGIsIG91dGJfcAkJCSovCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4JLyogY29weSB0by9mcm9tIHVzZXIJCSovCiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4JLyoga2VybmVsIHJhZGlvIHN0cnVjdHMJCSovCisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4JLyogQ09ORklHX1JBRElPX1RFUlJBVEVDX1BPUlQgCSovCiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KIApAQCAtNDksNyArNTAsNyBAQAogI2RlZmluZSBXUlRfRU4JCTB4MTAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgaW50IGlvID0gQ09ORklHX1JBRElPX1RFUlJBVEVDX1BPUlQ7IAorc3RhdGljIGludCBpbyA9IENPTkZJR19SQURJT19URVJSQVRFQ19QT1JUOwogc3RhdGljIGludCByYWRpb19uciA9IC0xOwogc3RhdGljIHNwaW5sb2NrX3QgbG9jazsKIApAQCAtODgsMTUgKzg5LDE1IEBACiAKIHN0YXRpYyBpbnQgdHRfc2V0dm9sKHN0cnVjdCB0dF9kZXZpY2UgKmRldiwgaW50IHZvbCkKIHsKLQkKKwogLy8JcHJpbnRrKEtFUk5fRVJSICJzZXR2b2wgY2FsbGVkLCB2b2wgPSAlZFxuIiwgdm9sKTsKIAogCWlmKHZvbCA9PSBkZXYtPmN1cnZvbCkgewkvKiByZXF1ZXN0ZWQgdm9sdW1lID0gY3VycmVudCAqLwogCQlpZiAoZGV2LT5tdXRlZCkgewkvKiB1c2VyIGlzIHVubXV0aW5nIHRoZSBjYXJkICAqLwogCQkJZGV2LT5tdXRlZCA9IDA7CiAJCQljYXJkV3JpdGVWb2wodm9sKTsJLyogZW5hYmxlIGNhcmQgKi8KLQkJfQkKLQkKKwkJfQorCiAJCXJldHVybiAwOwogCX0KIApAQCAtMTA3LDkgKzEwOCw5IEBACiAJfQogCiAJZGV2LT5tdXRlZCA9IDA7Ci0JCisKIAljYXJkV3JpdGVWb2wodm9sKTsKLQkgCisKIAlkZXYtPmN1cnZvbCA9IHZvbDsKIAogCXJldHVybiAwOwpAQCAtMTIxLDEzICsxMjIsMTMgQEAKIC8qIG1hbnkgbW9yZSBvciBsZXNzIHN0cmFuZ2UgdGhpbmdzIGFyZSBnb2luZyBvbiBoZXJlLCBidXQgaGV5LCBpdCB3b3JrcyA6KSAqLwogCiBzdGF0aWMgaW50IHR0X3NldGZyZXEoc3RydWN0IHR0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIGZyZXExKQotewkKK3sKIAlpbnQgZnJlcTsKIAlpbnQgaTsKIAlpbnQgcDsKIAlpbnQgIHRlbXA7CiAJbG9uZyByZXN0OwotICAgICAKKwogCXVuc2lnbmVkIGNoYXIgYnVmZmVyWzI1XTsJCS8qIHdlIGhhdmUgdG8gYml0IHNoaWZ0IDI1IHJlZ2lzdGVycyAqLwogCWZyZXEgPSBmcmVxMS8xNjA7CQkJLyogY29udmVydCB0aGUgZnJlcS4gdG8gYSBuaWNlIHRvIGhhbmRsZSB2YWx1ZSAqLwogCWZvcihpPTI0O2k+LTE7aS0tKQpAQCAtMTQyLDkgKzE0Myw5IEBACiAJewogCQlpZiAocmVzdCV0ZW1wICA9PSByZXN0KQogCQkJYnVmZmVyW2ldID0gMDsKLQkJZWxzZSAKKwkJZWxzZQogCQl7Ci0JCQlidWZmZXJbaV0gPSAxOyAKKwkJCWJ1ZmZlcltpXSA9IDE7CiAJCQlyZXN0ID0gcmVzdC10ZW1wOwogCQl9CiAJCWktLTsKQEAgLTE1MywxMCArMTU0LDEwIEBACiAgICAgICAgfQogCiAJc3Bpbl9sb2NrKCZsb2NrKTsKLQkKKwogCWZvciAoaT0yNDtpPi0xO2ktLSkJCQkvKiBiaXQgc2hpZnQgdGhlIHZhbHVlcyB0byB0aGUgcmFkaW9jYXJkICovCiAJewotCQlpZiAoYnVmZmVyW2ldPT0xKSAKKwkJaWYgKGJ1ZmZlcltpXT09MSkKIAkJewogCQkJb3V0YihXUlRfRU58REFUQSwgQkFTRVBPUlQpOwogCQkJb3V0YihXUlRfRU58REFUQXxDTEtfT04gICwgQkFTRVBPUlQpOwpAQCAtMTY4LDExICsxNjksMTEgQEAKIAkJCW91dGIoV1JUX0VOfDB4MDB8Q0xLX09OICAsIEJBU0VQT1JUKTsKIAkJfQogCX0KLQlvdXRiKDB4MDAsIEJBU0VQT1JUKTsgICAgIAotCQorCW91dGIoMHgwMCwgQkFTRVBPUlQpOworCiAJc3Bpbl91bmxvY2soJmxvY2spOwotICAKLSAgCXJldHVybiAwOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgdHRfZ2V0c2lnc3RyKHN0cnVjdCB0dF9kZXZpY2UgKmRldikJCS8qIFRPRE8gKi8KQEAgLTE5MCw3ICsxOTEsNyBAQAogewogCXN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7CiAJc3RydWN0IHR0X2RldmljZSAqdHQ9ZGV2LT5wcml2OwotCQorCiAJc3dpdGNoKGNtZCkKIAl7CiAJCWNhc2UgVklESU9DR0NBUDoKQEAgLTIwNiw3ICsyMDcsNyBAQAogCQljYXNlIFZJRElPQ0dUVU5FUjoKIAkJewogCQkJc3RydWN0IHZpZGVvX3R1bmVyICp2ID0gYXJnOwotCQkJaWYodi0+dHVuZXIpCS8qIE9ubHkgMSB0dW5lciAqLyAKKwkJCWlmKHYtPnR1bmVyKQkvKiBPbmx5IDEgdHVuZXIgKi8KIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCXYtPnJhbmdlbG93PSg4NyoxNjAwMCk7CiAJCQl2LT5yYW5nZWhpZ2g9KDEwOCoxNjAwMCk7CkBAIC0yMzgsMjEgKzIzOSwyMSBAQAogCQkJcmV0dXJuIDA7CiAJCX0KIAkJY2FzZSBWSURJT0NHQVVESU86Ci0JCXsJCisJCXsKIAkJCXN0cnVjdCB2aWRlb19hdWRpbyAqdiA9IGFyZzsKIAkJCW1lbXNldCh2LDAsIHNpemVvZigqdikpOwogCQkJdi0+ZmxhZ3N8PVZJREVPX0FVRElPX01VVEFCTEV8VklERU9fQVVESU9fVk9MVU1FOwogCQkJdi0+dm9sdW1lPXR0LT5jdXJ2b2wgKiA2NTU0OwogCQkJdi0+c3RlcD02NTU0OwogCQkJc3RyY3B5KHYtPm5hbWUsICJSYWRpbyIpOwotCQkJcmV0dXJuIDA7CQkJCisJCQlyZXR1cm4gMDsKIAkJfQogCQljYXNlIFZJRElPQ1NBVURJTzoKIAkJewogCQkJc3RydWN0IHZpZGVvX2F1ZGlvICp2ID0gYXJnOwotCQkJaWYodi0+YXVkaW8pIAorCQkJaWYodi0+YXVkaW8pCiAJCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQlpZih2LT5mbGFncyZWSURFT19BVURJT19NVVRFKSAKKwkJCWlmKHYtPmZsYWdzJlZJREVPX0FVRElPX01VVEUpCiAJCQkJdHRfbXV0ZSh0dCk7CiAJCQllbHNlCiAJCQkJdHRfc2V0dm9sKHR0LHYtPnZvbHVtZS82NTU0KTsKQEAgLTI5NiwyNSArMjk3LDI1IEBACiAJCXByaW50ayhLRVJOX0VSUiAiWW91IG11c3Qgc2V0IGFuIEkvTyBhZGRyZXNzIHdpdGggaW89MHg/Pz9cbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JaWYgKCFyZXF1ZXN0X3JlZ2lvbihpbywgMiwgInRlcnJhdGVjIikpIAorCWlmICghcmVxdWVzdF9yZWdpb24oaW8sIDIsICJ0ZXJyYXRlYyIpKQogCXsKIAkJcHJpbnRrKEtFUk5fRVJSICJUZXJyYVRlYzogcG9ydCAweCV4IGFscmVhZHkgaW4gdXNlXG4iLCBpbyk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCiAJdGVycmF0ZWNfcmFkaW8ucHJpdj0mdGVycmF0ZWNfdW5pdDsKLQkKKwogCXNwaW5fbG9ja19pbml0KCZsb2NrKTsKLQkKKwogCWlmKHZpZGVvX3JlZ2lzdGVyX2RldmljZSgmdGVycmF0ZWNfcmFkaW8sIFZGTF9UWVBFX1JBRElPLCByYWRpb19ucik9PS0xKQogCXsKIAkJcmVsZWFzZV9yZWdpb24oaW8sMik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQkJCisKIAlwcmludGsoS0VSTl9JTkZPICJURVJSQVRFQyBBY3RpdlJhZGlvIFN0YW5kYWxvbmUgY2FyZCBkcml2ZXIuXG4iKTsKIAotIAkvKiBtdXRlIGNhcmQgLSBwcmV2ZW50cyBub2lzeSBib290dXBzICovCisJLyogbXV0ZSBjYXJkIC0gcHJldmVudHMgbm9pc3kgYm9vdHVwcyAqLwogCiAJLyogdGhpcyBlbnN1cmVzIHRoYXQgdGhlIHZvbHVtZSBpcyBhbGwgdGhlIHdheSBkb3duICAqLwogCWNhcmRXcml0ZVZvbCgwKTsKQEAgLTMzNCw3ICszMzUsNyBAQAogewogCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKCZ0ZXJyYXRlY19yYWRpbyk7CiAJcmVsZWFzZV9yZWdpb24oaW8sMik7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiVEVSUkFURUMgQWN0aXZSYWRpbyBTdGFuZGFsb25lIGNhcmQgZHJpdmVyIHVubG9hZGVkLlxuIik7CQorCXByaW50ayhLRVJOX0lORk8gIlRFUlJBVEVDIEFjdGl2UmFkaW8gU3RhbmRhbG9uZSBjYXJkIGRyaXZlciB1bmxvYWRlZC5cbiIpOwogfQogCiBtb2R1bGVfaW5pdCh0ZXJyYXRlY19pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tdHJ1c3QuYyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tdHJ1c3QuYwppbmRleCA1YTA5OWE1Li44ZGE0YmFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXRydXN0LmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby10cnVzdC5jCkBAIC0xLDE0ICsxLDE0IEBACi0vKiByYWRpby10cnVzdC5jIC0gVHJ1c3QgRk0gUmFkaW8gY2FyZCBkcml2ZXIgZm9yIExpbnV4IDIuMiAKKy8qIHJhZGlvLXRydXN0LmMgLSBUcnVzdCBGTSBSYWRpbyBjYXJkIGRyaXZlciBmb3IgTGludXggMi4yCiAgKiBieSBFcmljIExhbW1lcnRzIDxlcmljQHNjaW50aWxsYS51dHdlbnRlLm5sPgogICoKICAqIEJhc2VkIG9uIHJhZGlvLWF6dGVjaC5jLiBPcmlnaW5hbCBub3RlczoKICAqCi0gKiBBZGFwdGVkIHRvIHN1cHBvcnQgdGhlIFZpZGVvIGZvciBMaW51eCBBUEkgYnkgCisgKiBBZGFwdGVkIHRvIHN1cHBvcnQgdGhlIFZpZGVvIGZvciBMaW51eCBBUEkgYnkKICAqIFJ1c3NlbGwgS3JvbGwgPHJrcm9sbEBleHBsb2l0cy5vcmc+LiAgQmFzZWQgb24gb3JpZ2luYWwgdHVuZXIgY29kZSBieToKICAqCiAgKiBRdWF5IEx5CiAgKiBEb25hbGQgU29uZwotICogSmFzb24gTGV3aXMgICAgICAoamxld2lzQHR3aWxpZ2h0LnZ0Yy52c2MuZWR1KSAKKyAqIEphc29uIExld2lzICAgICAgKGpsZXdpc0B0d2lsaWdodC52dGMudnNjLmVkdSkKICAqIFNjb3R0IE1jR3JhdGggICAgKHNtY2dyYXRoQHR3aWxpZ2h0LnZ0Yy52c2MuZWR1KQogICogV2lsbGlhbSBNY0dyYXRoICAod21jZ3JhdGhAdHdpbGlnaHQudnRjLnZzYy5lZHUpCiAgKgpAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgkvKiBDT05GSUdfUkFESU9fVFJVU1RfUE9SVCAJKi8KIAogLyogYWNjZXB0YWJsZSBwb3J0czogMHgzNTAgKEpQMyBzaG9ydGVkKSwgMHgzNTggKEpQMyBvcGVuKSAqLwpAQCAtMzAsNyArMzEsNyBAQAogI2RlZmluZSBDT05GSUdfUkFESU9fVFJVU1RfUE9SVCAtMQogI2VuZGlmCiAKLXN0YXRpYyBpbnQgaW8gPSBDT05GSUdfUkFESU9fVFJVU1RfUE9SVDsgCitzdGF0aWMgaW50IGlvID0gQ09ORklHX1JBRElPX1RSVVNUX1BPUlQ7CiBzdGF0aWMgaW50IHJhZGlvX25yID0gLTE7CiBzdGF0aWMgaW50IGlvdmFsID0gMHhmOwogc3RhdGljIF9fdTE2IGN1cnZvbDsKQEAgLTEzNSw3ICsxMzYsNyBAQAogc3RhdGljIGludCB0cl9nZXRzaWdzdHIodm9pZCkKIHsKIAlpbnQgaSwgdjsKLQkKKwogCWZvcihpID0gMCwgdiA9IDA7IGkgPCAxMDA7IGkrKykgdiB8PSBpbmIoaW8pOwogCXJldHVybiAodiAmIDEpPyAwIDogMHhmZmZmOwogfQpAQCAtMTc1LDcgKzE3Niw3IEBACiAJCXsKIAkJCXN0cnVjdCB2aWRlb190dW5lciAqdiA9IGFyZzsKIAotCQkJaWYodi0+dHVuZXIpCS8qIE9ubHkgMSB0dW5lciAqLyAKKwkJCWlmKHYtPnR1bmVyKQkvKiBPbmx5IDEgdHVuZXIgKi8KIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAogCQkJdi0+cmFuZ2Vsb3cgPSA4NzUwMCAqIDE2OwpAQCAtMjExLDI4ICsyMTIsMjggQEAKIAkJCXJldHVybiAwOwogCQl9CiAJCWNhc2UgVklESU9DR0FVRElPOgotCQl7CQorCQl7CiAJCQlzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYgPSBhcmc7CiAKIAkJCW1lbXNldCh2LDAsIHNpemVvZigqdikpOwogCQkJdi0+ZmxhZ3MgPSBWSURFT19BVURJT19NVVRBQkxFIHwgVklERU9fQVVESU9fVk9MVU1FIHwKLQkJCSAgICAgICAgICBWSURFT19BVURJT19CQVNTIHwgVklERU9fQVVESU9fVFJFQkxFOworCQkJCSAgVklERU9fQVVESU9fQkFTUyB8IFZJREVPX0FVRElPX1RSRUJMRTsKIAkJCXYtPm1vZGUgPSBjdXJzdGVyZW8/IFZJREVPX1NPVU5EX1NURVJFTyA6IFZJREVPX1NPVU5EX01PTk87CiAJCQl2LT52b2x1bWUgPSBjdXJ2b2wgKiAyMDQ4OwogCQkJdi0+c3RlcCA9IDIwNDg7CiAJCQl2LT5iYXNzID0gY3VyYmFzcyAqIDQzNzA7CiAJCQl2LT50cmVibGUgPSBjdXJ0cmVibGUgKiA0MzcwOwotCQkJCisKIAkJCXN0cmNweSh2LT5uYW1lLCAiVHJ1c3QgRk0gUmFkaW8iKTsKLQkJCXJldHVybiAwOwkJCQorCQkJcmV0dXJuIDA7CiAJCX0KIAkJY2FzZSBWSURJT0NTQVVESU86CiAJCXsKIAkJCXN0cnVjdCB2aWRlb19hdWRpbyAqdiA9IGFyZzsKIAotCQkJaWYodi0+YXVkaW8pIAorCQkJaWYodi0+YXVkaW8pCiAJCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl0cl9zZXR2b2wodi0+dm9sdW1lKTsJCQkJCQorCQkJdHJfc2V0dm9sKHYtPnZvbHVtZSk7CiAJCQl0cl9zZXRiYXNzKHYtPmJhc3MpOwogCQkJdHJfc2V0dHJlYmxlKHYtPnRyZWJsZSk7CiAJCQl0cl9zZXRzdGVyZW8odi0+bW9kZSAmIFZJREVPX1NPVU5EX1NURVJFTyk7CkBAIC0yOTIsNyArMjkzLDcgQEAKIAl3cml0ZV9pMmMoMiwgVERBNzMxOF9BRERSLCAweGUwKTsJLyogc3BlYWtlciBhdHQuIFJSID0gMCBkQiAqLwogCXdyaXRlX2kyYygyLCBUREE3MzE4X0FERFIsIDB4NDApOwkvKiBzdGVyZW8gMSBpbnB1dCwgZ2FpbiA9IDE4Ljc1IGRCICovCiAKLQl0cl9zZXR2b2woMHg4MDAwKTsJCQkJCQorCXRyX3NldHZvbCgweDgwMDApOwogCXRyX3NldGJhc3MoMHg4MDAwKTsKIAl0cl9zZXR0cmVibGUoMHg4MDAwKTsKIAl0cl9zZXRzdGVyZW8oMSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXR5cGhvb24uYyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tdHlwaG9vbi5jCmluZGV4IGU1MDk1NTguLmVkZDAxMjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tdHlwaG9vbi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tdHlwaG9vbi5jCkBAIC0zNiw2ICszNiw3IEBACiAjaW5jbHVkZSA8YXNtL2lvLmg+CQkvKiBvdXRiLCBvdXRiX3AgICAgICAgICAgICAgICAgICAgKi8KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgkvKiBjb3B5IHRvL2Zyb20gdXNlciAgICAgICAgICAgICAgKi8KICNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgkvKiBrZXJuZWwgcmFkaW8gc3RydWN0cyAgICAgICAgICAgKi8KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgkvKiBDT05GSUdfUkFESU9fVFlQSE9PTl8qICAgICAgICAgKi8KIAogI2RlZmluZSBCQU5ORVIgIlR5cGhvb24gUmFkaW8gQ2FyZCBkcml2ZXIgdjAuMVxuIgpAQCAtMzYxLDggKzM2Miw4IEBACiAKICNpZmRlZiBDT05GSUdfUkFESU9fVFlQSE9PTl9QUk9DX0ZTCiAJaWYgKCFjcmVhdGVfcHJvY19pbmZvX2VudHJ5KCJkcml2ZXIvcmFkaW8tdHlwaG9vbiIsIDAsIE5VTEwsCi0JCQkJICAgIHR5cGhvb25fZ2V0X2luZm8pKSAKLQkgICAgCXByaW50ayhLRVJOX0VSUiAicmFkaW8tdHlwaG9vbjogcmVnaXN0ZXJpbmcgL3Byb2MvZHJpdmVyL3JhZGlvLXR5cGhvb24gZmFpbGVkXG4iKTsKKwkJCQkgICAgdHlwaG9vbl9nZXRfaW5mbykpCisJCXByaW50ayhLRVJOX0VSUiAicmFkaW8tdHlwaG9vbjogcmVnaXN0ZXJpbmcgL3Byb2MvZHJpdmVyL3JhZGlvLXR5cGhvb24gZmFpbGVkXG4iKTsKICNlbmRpZgogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXpvbHRyaXguYyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tem9sdHJpeC5jCmluZGV4IDdiZjFhNDIuLjU5Yjg2YTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tem9sdHJpeC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tem9sdHJpeC5jCkBAIC0xLDcgKzEsNyBAQAogLyogem9sdHJpeCByYWRpbyBwbHVzIGRyaXZlciBmb3IgTGludXggcmFkaW8gc3VwcG9ydAogICogKGMpIDE5OTggQy4gdmFuIFNjaGFpayA8Y2FybEBsZWcudWN0LmFjLnphPgogICoKLSAqIEJVR1MgIAorICogQlVHUwogICogIER1ZSB0byB0aGUgaW5jb25zaXN0ZW5jeSBpbiByZWFkaW5nIGZyb20gdGhlIHNpZ25hbCBmbGFncwogICogIGl0IGlzIGRpZmZpY3VsdCB0byBnZXQgYW4gYWNjdXJhdGUgdHVuZWQgc2lnbmFsLgogICoKQEAgLTE0LDcgKzE0LDcgQEAKICAqCiAgKiAxOTk5LTA1LTA2IC0gKEMuIHZhbiBTY2hhaWspCiAgKgkgICAgICAtIE1ha2Ugc2lnbmFsIHN0cmVuZ3RoIGFuZCBzdGVyZW8gc2NhbnMKLSAqCSAgICAgICAga2luZGVyIHRvIGNwdSB3aGlsZSBpbiBkZWxheQorICoJCWtpbmRlciB0byBjcHUgd2hpbGUgaW4gZGVsYXkKICAqIDE5OTktMDEtMDUgLSAoQy4gdmFuIFNjaGFpaykKICAqCSAgICAgIC0gQ2hhbmdlZCB0dW5pbmcgdG8gMS8xNjBNaHogYWNjdXJhY3kKICAqCSAgICAgIC0gQWRkZWQgc3RlcmVvIHN1cHBvcnQKQEAgLTMzLDYgKzMzLDcgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4JCS8qIG91dGIsIG91dGJfcCAgICAgICAgICAgICAgICAgICAqLwogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CS8qIGNvcHkgdG8vZnJvbSB1c2VyICAgICAgICAgICAgICAqLwogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CS8qIGtlcm5lbCByYWRpbyBzdHJ1Y3RzICAgICAgICAgICAqLworI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CS8qIENPTkZJR19SQURJT19aT0xUUklYX1BPUlQgICAgICAqLwogCiAjaWZuZGVmIENPTkZJR19SQURJT19aT0xUUklYX1BPUlQKQEAgLTEwNSw3ICsxMDYsNyBAQAogCWkgPSA0NTsKIAogCW11dGV4X2xvY2soJmRldi0+bG9jayk7Ci0JCisKIAlvdXRiKDAsIGlvKTsKIAlvdXRiKDAsIGlvKTsKIAlpbmIoaW8gKyAzKTsgICAgICAgICAgICAvKiBab2x0cml4IG5lZWRzIHRvIGJlIHJlYWQgdG8gY29uZmlybSAqLwpAQCAtMTM5LDggKzE0MCw4IEBACiAJdWRlbGF5KDEwMDApOwogCWluYihpbysyKTsKIAotICAgICAgICB1ZGVsYXkoMTAwMCk7Ci0gICAgICAgIAorCXVkZWxheSgxMDAwKTsKKwogCWlmIChkZXYtPm11dGVkKQogCXsKIAkJb3V0YigwLCBpbyk7CkBAIC0xNDgsMTIgKzE0OSwxMiBAQAogCQlpbmIoaW8gKyAzKTsKIAkJdWRlbGF5KDEwMDApOwogCX0KLQkKKwogCW11dGV4X3VubG9jaygmZGV2LT5sb2NrKTsKLQkKKwogCWlmKCFkZXYtPm11dGVkKQogCXsKLQkgICAgICAgIHpvbF9zZXR2b2woZGV2LCBkZXYtPmN1cnZvbCk7CisJCXpvbF9zZXR2b2woZGV2LCBkZXYtPmN1cnZvbCk7CiAJfQogCXJldHVybiAwOwogfQpAQCAtMTc0LDE0ICsxNzUsMTQgQEAKIAliID0gaW5iKGlvKTsKIAogCW11dGV4X3VubG9jaygmZGV2LT5sb2NrKTsKLQkKKwogCWlmIChhICE9IGIpCiAJCXJldHVybiAoMCk7CiAKLSAgICAgICAgaWYgKChhID09IDB4Y2YpIHx8IChhID09IDB4ZGYpICAvKiBJIGZvdW5kIHRoaXMgb3V0IGJ5IHBsYXlpbmcgKi8KKwlpZiAoKGEgPT0gMHhjZikgfHwgKGEgPT0gMHhkZikgIC8qIEkgZm91bmQgdGhpcyBvdXQgYnkgcGxheWluZyAqLwogCQl8fCAoYSA9PSAweGVmKSkgICAgICAgLyogd2l0aCBhIGJpbmFyeSBzY2FubmVyIG9uIHRoZSBjYXJkIGlvICovCiAJCXJldHVybiAoMSk7Ci0gCXJldHVybiAoMCk7CisJcmV0dXJuICgwKTsKIH0KIAogc3RhdGljIGludCB6b2xfaXNfc3RlcmVvIChzdHJ1Y3Qgem9sX2RldmljZSAqZGV2KQpAQCAtMTg5LDcgKzE5MCw3IEBACiAJaW50IHgxLCB4MjsKIAogCW11dGV4X2xvY2soJmRldi0+bG9jayk7Ci0JCisKIAlvdXRiKDB4MDAsIGlvKTsKIAlvdXRiKGRldi0+Y3Vydm9sLCBpbyk7CiAJbXNsZWVwKDIwKTsKQEAgLTE5OSw3ICsyMDAsNyBAQAogCXgyID0gaW5iKGlvKTsKIAogCW11dGV4X3VubG9jaygmZGV2LT5sb2NrKTsKLQkKKwogCWlmICgoeDEgPT0geDIpICYmICh4MSA9PSAweGNmKSkKIAkJcmV0dXJuIDE7CiAJcmV0dXJuIDA7CkBAIC0yMjYsNyArMjI3LDcgQEAKIAljYXNlIFZJRElPQ0dUVU5FUjoKIAkJewogCQkJc3RydWN0IHZpZGVvX3R1bmVyICp2ID0gYXJnOwotCQkJaWYgKHYtPnR1bmVyKQkKKwkJCWlmICh2LT50dW5lcikKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCXN0cmNweSh2LT5uYW1lLCAiRk0iKTsKIAkJCXYtPnJhbmdlbG93ID0gKGludCkgKDg4LjAgKiAxNjAwMCk7CkBAIC0zNTEsNyArMzUyLDcgQEAKIAlwcmludGsoS0VSTl9JTkZPICJab2x0cml4IFJhZGlvIFBsdXMgY2FyZCBkcml2ZXIuXG4iKTsKIAogCW11dGV4X2luaXQoJnpvbHRyaXhfdW5pdC5sb2NrKTsKLQkKKwogCS8qIG11dGUgY2FyZCAtIHByZXZlbnRzIG5vaXN5IGJvb3R1cHMgKi8KIAogCS8qIHRoaXMgZW5zdXJlcyB0aGF0IHRoZSB2b2x1bWUgaXMgYWxsIHRoZSB3YXkgZG93biAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vS2NvbmZpZwppbmRleCA2YjQxOTcwLi5lNDI5MDQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9LY29uZmlnCkBAIC0yMjQsNiArMjI0LDEyIEBACiAJICBzdXBwb3J0IGZvciB0aGUgTGludXggTWVkaWEgTGFicyBMTUwzM1IxMCBNSlBFRyBjYXB0dXJlL3BsYXliYWNrCiAJICBjYXJkLgogCitjb25maWcgVklERU9fWk9SQU5fQVZTNkVZRVMKKwl0cmlzdGF0ZSAiQXZlck1lZGlhIDYgRXllcyBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gVklERU9fWk9SQU4gJiYgRVhQRVJJTUVOVEFMICYmIFZJREVPX1Y0TDEKKwloZWxwCisJICBTdXBwb3J0IGZvciB0aGUgQXZlck1lZGlhIDYgRXllcyB2aWRlbyBzdXJ2ZWlsbGFuY2UgY2FyZC4KKwogY29uZmlnIFZJREVPX1pSMzYxMjAKIAl0cmlzdGF0ZSAiWm9yYW4gWlIzNjEyMC8zNjEyNSBWaWRlbyBGb3IgTGludXgiCiAJZGVwZW5kcyBvbiBQQ0kgJiYgSTJDICYmIFZJREVPX1Y0TDEgJiYgQlJPS0VOCkBAIC0zMDYsMTcgKzMxMiw2IEBACiAKIHNvdXJjZSAiZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L0tjb25maWciCiAKLWNvbmZpZyBWSURFT19PVkNBTUNISVAKLQl0cmlzdGF0ZSAiT21uaVZpc2lvbiBDYW1lcmEgQ2hpcCBzdXBwb3J0IgotCWRlcGVuZHMgb24gSTJDICYmIFZJREVPX1Y0TDEKLQktLS1oZWxwLS0tCi0JICBTdXBwb3J0IGZvciB0aGUgT21uaVZpc2lvbiBPVjZ4eHggYW5kIE9WN3h4eCBzZXJpZXMgb2YgY2FtZXJhIGNoaXBzLgotCSAgVGhpcyBkcml2ZXIgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB3aXRoIHRoZSBvdjUxMSBhbmQgdzk5NjhjZiBVU0IKLQkgIGNhbWVyYSBkcml2ZXJzLgotCi0JICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKLQkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBvdmNhbWNoaXAuCi0KIGNvbmZpZyBWSURFT19NMzJSX0FSCiAJdHJpc3RhdGUgIkFSIGRldmljZXMiCiAJZGVwZW5kcyBvbiBNMzJSICYmIFZJREVPX1Y0TDEKQEAgLTM1Nyw2ICszNTIsMTUgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGNzNTNsMzJhLgogCitjb25maWcgVklERU9fVExWMzIwQUlDMjNCCisJdHJpc3RhdGUgIlRleGFzIEluc3RydW1lbnRzIFRMVjMyMEFJQzIzQiBhdWRpbyBjb2RlYyIKKwlkZXBlbmRzIG9uIFZJREVPX0RFViAmJiBJMkMgJiYgRVhQRVJJTUVOVEFMCisJLS0taGVscC0tLQorCSAgU3VwcG9ydCBmb3IgdGhlIFRleGFzIEluc3RydW1lbnRzIFRMVjMyMEFJQzIzQiBhdWRpbyBjb2RlYy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgdGx2MzIwYWljMjNiLgorCiBjb25maWcgVklERU9fV004Nzc1CiAJdHJpc3RhdGUgIldvbGZzb24gTWljcm9lbGVjdHJvbmljcyBXTTg3NzUgYXVkaW8gQURDIHdpdGggaW5wdXQgbWl4ZXIiCiAJZGVwZW5kcyBvbiBWSURFT19ERVYgJiYgSTJDICYmIEVYUEVSSU1FTlRBTApAQCAtMzc3LDEzICszODEsMjUgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHdtODczOS4KIAorY29uZmlnIFZJREVPX0NYMjM0MVgKKwl0cmlzdGF0ZSAiQ29uZXhhbnQgQ1gyMzQxeCBNUEVHIGVuY29kZXJzIgorCWRlcGVuZHMgb24gVklERU9fVjRMMiAmJiBFWFBFUklNRU5UQUwKKwktLS1oZWxwLS0tCisJICBTdXBwb3J0IGZvciB0aGUgQ29uZXhhbnQgQ1gyMzQxNiBNUEVHIGVuY29kZXJzCisJICBhbmQgQ1gyMzQxNSBNUEVHIGVuY29kZXIvZGVjb2RlcnMuCisKKwkgIFRoaXMgbW9kdWxlIGN1cnJlbnRseSBzdXBwb3J0cyB0aGUgZW5jb2RpbmcgZnVuY3Rpb25zIG9ubHkuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGN4MjM0MXguCisKIHNvdXJjZSAiZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODQwL0tjb25maWciCiAKIGNvbmZpZyBWSURFT19TQUE3MTFYCi0JdHJpc3RhdGUgIlBoaWxpcHMgU0FBNzExMy80LzUgdmlkZW8gZGVjb2RlcnMgKE9CU09MRVRFRCkiCi0JZGVwZW5kcyBvbiBWSURFT19WNEwxICYmIEkyQyAmJiBFWFBFUklNRU5UQUwKKwl0cmlzdGF0ZSAiUGhpbGlwcyBTQUE3MTEzLzQvNSB2aWRlbyBkZWNvZGVycyIKKwlkZXBlbmRzIG9uIFZJREVPX0RFViAmJiBJMkMgJiYgRVhQRVJJTUVOVEFMCiAJLS0taGVscC0tLQotCSAgT2xkIHN1cHBvcnQgZm9yIHRoZSBQaGlsaXBzIFNBQTcxMTMvNCB2aWRlbyBkZWNvZGVycy4KKwkgIFN1cHBvcnQgZm9yIHRoZSBQaGlsaXBzIFNBQTcxMTMvNC81IHZpZGVvIGRlY29kZXJzLgogCiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBzYWE3MTE1LgpAQCAtNDQ3LDYgKzQ2MywzNSBAQAogCiBzb3VyY2UgImRyaXZlcnMvbWVkaWEvdmlkZW8vZXQ2MXgyNTEvS2NvbmZpZyIKIAorY29uZmlnIFZJREVPX09WQ0FNQ0hJUAorCXRyaXN0YXRlICJPbW5pVmlzaW9uIENhbWVyYSBDaGlwIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBJMkMgJiYgVklERU9fVjRMMQorCS0tLWhlbHAtLS0KKwkgIFN1cHBvcnQgZm9yIHRoZSBPbW5pVmlzaW9uIE9WNnh4eCBhbmQgT1Y3eHh4IHNlcmllcyBvZiBjYW1lcmEgY2hpcHMuCisJICBUaGlzIGRyaXZlciBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIHdpdGggdGhlIG92NTExIGFuZCB3OTk2OGNmIFVTQgorCSAgY2FtZXJhIGRyaXZlcnMuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIG92Y2FtY2hpcC4KKworY29uZmlnIFVTQl9XOTk2OENGCisJdHJpc3RhdGUgIlVTQiBXOTk2Wzg3XUNGIEpQRUcgRHVhbCBNb2RlIENhbWVyYSBzdXBwb3J0IgorCWRlcGVuZHMgb24gVVNCICYmIFZJREVPX1Y0TDEgJiYgSTJDCisJc2VsZWN0IFZJREVPX09WQ0FNQ0hJUAorCS0tLWhlbHAtLS0KKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgc3VwcG9ydCBmb3IgY2FtZXJhcyBiYXNlZCBvbiBPVjY4MSBvcgorCSAgV2luYm9uZCBXOTk2N0NGL1c5OTY4Q0YgSlBFRyBVU0IgRHVhbCBNb2RlIENhbWVyYSBDaGlwcy4KKworCSAgVGhpcyBkcml2ZXIgaGFzIGFuIG9wdGlvbmFsIHBsdWdpbiwgd2hpY2ggaXMgZGlzdHJpYnV0ZWQgYXMgYQorCSAgc2VwYXJhdGUgbW9kdWxlIG9ubHkgKHJlbGVhc2VkIHVuZGVyIEdQTCkuIEl0IGFsbG93cyB0byB1c2UgaGlnaGVyCisJICByZXNvbHV0aW9ucyBhbmQgZnJhbWVyYXRlcywgYnV0IGNhbm5vdCBiZSBpbmNsdWRlZCBpbiB0aGUgb2ZmaWNpYWwKKwkgIExpbnV4IGtlcm5lbCBmb3IgcGVyZm9ybWFuY2UgcHVycG9zZXMuCisKKwkgIFNlZSA8ZmlsZTpEb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L3c5OTY4Y2YudHh0PiBmb3IgbW9yZSBpbmZvLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB3OTk2OGNmLgorCiBjb25maWcgVVNCX09WNTExCiAJdHJpc3RhdGUgIlVTQiBPVjUxMSBDYW1lcmEgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFVTQiAmJiBWSURFT19WNEwxCkBAIC00ODMsMjQgKzUyOCw2IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBzdHY2ODAuCiAKLWNvbmZpZyBVU0JfVzk5NjhDRgotCXRyaXN0YXRlICJVU0IgVzk5Nls4N11DRiBKUEVHIER1YWwgTW9kZSBDYW1lcmEgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFVTQiAmJiBWSURFT19WNEwxICYmIEkyQwotCXNlbGVjdCBWSURFT19PVkNBTUNISVAKLQktLS1oZWxwLS0tCi0JICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHN1cHBvcnQgZm9yIGNhbWVyYXMgYmFzZWQgb24gT1Y2ODEgb3IKLQkgIFdpbmJvbmQgVzk5NjdDRi9XOTk2OENGIEpQRUcgVVNCIER1YWwgTW9kZSBDYW1lcmEgQ2hpcHMuCi0KLQkgIFRoaXMgZHJpdmVyIGhhcyBhbiBvcHRpb25hbCBwbHVnaW4sIHdoaWNoIGlzIGRpc3RyaWJ1dGVkIGFzIGEKLQkgIHNlcGFyYXRlIG1vZHVsZSBvbmx5IChyZWxlYXNlZCB1bmRlciBHUEwpLiBJdCBhbGxvd3MgdG8gdXNlIGhpZ2hlcgotCSAgcmVzb2x1dGlvbnMgYW5kIGZyYW1lcmF0ZXMsIGJ1dCBjYW5ub3QgYmUgaW5jbHVkZWQgaW4gdGhlIG9mZmljaWFsCi0JICBMaW51eCBrZXJuZWwgZm9yIHBlcmZvcm1hbmNlIHB1cnBvc2VzLgotCi0JICBTZWUgPGZpbGU6RG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC93OTk2OGNmLnR4dD4gZm9yIG1vcmUgaW5mby4KLQotCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCi0JICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgdzk5NjhjZi4KLQogc291cmNlICJkcml2ZXJzL21lZGlhL3ZpZGVvL3pjMDMwMS9LY29uZmlnIgogCiBzb3VyY2UgImRyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL0tjb25maWciCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS92aWRlby9NYWtlZmlsZQppbmRleCBlNWJmMjY4Li42YzQwMWI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vTWFrZWZpbGUKQEAgLTYsNyArNiw3IEBACiB6cjM2MDY3LW9ianMJOj0Jem9yYW5fcHJvY2ZzLm8gem9yYW5fZGV2aWNlLm8gXAogCQkJem9yYW5fZHJpdmVyLm8gem9yYW5fY2FyZC5vCiB0dW5lci1vYmpzCTo9CXR1bmVyLWNvcmUubyB0dW5lci10eXBlcy5vIHR1bmVyLXNpbXBsZS5vIFwKLQkJCW10MjB4eC5vIHRkYTgyOTAubyB0ZWE1NzY3Lm8KKwkJCW10MjB4eC5vIHRkYTgyOTAubyB0ZWE1NzY3Lm8gdGRhOTg4Ny5vCiAKIG1zcDM0MDAtb2Jqcwk6PQltc3AzNDAwLWRyaXZlci5vIG1zcDM0MDAta3RocmVhZHMubwogCkBAIC0zMyw2ICszMyw3IEBACiAJenIzNjAxNi5vCiBvYmotJChDT05GSUdfVklERU9fWk9SQU5fTE1MMzMpICs9IGJ0ODE5Lm8gYnQ4NTYubyB6cjM2MDYwLm8KIG9iai0kKENPTkZJR19WSURFT19aT1JBTl9MTUwzM1IxMCkgKz0gc2FhNzExNC5vIGFkdjcxNzAubyB6cjM2MDYwLm8KK29iai0kKENPTkZJR19WSURFT19aT1JBTl9BVlM2RVlFUykgKz0gYnQ4NjYubyBrczAxMjcubyB6cjM2MDYwLm8KIG9iai0kKENPTkZJR19WSURFT19aT1JBTikgKz0genIzNjA2Ny5vIHZpZGVvY29kZWMubwogb2JqLSQoQ09ORklHX1ZJREVPX1BNUykgKz0gcG1zLm8KIG9iai0kKENPTkZJR19WSURFT19QTEFOQikgKz0gcGxhbmIubwpAQCAtNDgsNiArNDksNyBAQAogb2JqLSQoQ09ORklHX1ZJREVPX0VNMjhYWCkgKz0gdHZwNTE1MC5vCiBvYmotJChDT05GSUdfVklERU9fTVNQMzQwMCkgKz0gbXNwMzQwMC5vCiBvYmotJChDT05GSUdfVklERU9fQ1M1M0wzMkEpICs9IGNzNTNsMzJhLm8KK29iai0kKENPTkZJR19WSURFT19UTFYzMjBBSUMyM0IpICs9IHRsdjMyMGFpYzIzYi5vCiBvYmotJChDT05GSUdfVklERU9fV004Nzc1KSArPSB3bTg3NzUubwogb2JqLSQoQ09ORklHX1ZJREVPX1dNODczOSkgKz0gd204NzM5Lm8KIG9iai0kKENPTkZJR19WSURFT19PVkNBTUNISVApICs9IG92Y2FtY2hpcC8KQEAgLTU4LDcgKzYwLDcgQEAKIG9iai0kKENPTkZJR19WSURFT19EUEMpICs9IHNhYTcxMTEubyBkcGM3MTQ2Lm8KIG9iai0kKENPTkZJR19UVU5FUl8zMDM2KSArPSB0dW5lci0zMDM2Lm8KIAotb2JqLSQoQ09ORklHX1ZJREVPX1RVTkVSKSArPSB0dW5lci5vIHRkYTk4ODcubworb2JqLSQoQ09ORklHX1ZJREVPX1RVTkVSKSArPSB0dW5lci5vCiBvYmotJChDT05GSUdfVklERU9fQlVGKSAgICs9IHZpZGVvLWJ1Zi5vCiBvYmotJChDT05GSUdfVklERU9fQlVGX0RWQikgKz0gdmlkZW8tYnVmLWR2Yi5vCiBvYmotJChDT05GSUdfVklERU9fQlRDWCkgICs9IGJ0Y3gtcmlzYy5vCkBAIC03MSw2ICs3Myw3IEBACiBvYmotJChDT05GSUdfVklERU9fU0FBNzEyNykgKz0gc2FhNzEyNy5vCiBvYmotJChDT05GSUdfVklERU9fVVBENjQwMzFBKSArPSB1cGQ2NDAzMWEubwogb2JqLSQoQ09ORklHX1ZJREVPX1VQRDY0MDgzKSArPSB1cGQ2NDA4My5vCitvYmotJChDT05GSUdfVklERU9fQ1gyMzQxWCkgKz0gY3gyMzQxeC5vCiAKIG9iai0kKENPTkZJR19VU0JfREFCVVNCKSAgICAgICAgKz0gZGFidXNiLm8KIG9iai0kKENPTkZJR19VU0JfRFNCUikgICAgICAgICAgKz0gZHNicjEwMC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2Fydi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9hcnYuYwppbmRleCBkYmUwMjUxLi42ZTA4ZTMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2Fydi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYXJ2LmMKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgpAQCAtMjEyLDcgKzIxMyw3IEBACiAJYXJfb3V0bCgweDAzMDAsIFBMREkyQ01PRCk7IAkvKiBJMkNNT0QgQUNLLzhiLWRhdGEvN2ItYWRkci9hdXRvICovCiAJYXJfb3V0bCgweDEsIFBMREkyQ0FDSyk7CS8qIEkyQ0FDSyBBQ0sgICAgICAgICAgICAgICAgICAgICAgKi8KIAotICAgIAkvKiBJMkMgQ0xLICovCisJLyogSTJDIENMSyAqLwogCS8qIDUwTUgtMTAwayAqLwogCWlmIChmcmVxID09IDc1KSB7CiAJCWFyX291dGwoMzY5LCBQTERJMkNGUkVRKTsJLyogQkNMSyA9IDc1TUh6ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0ODY2LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0ODY2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVlNDJiYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4NjYuYwpAQCAtMCwwICsxLDM3NyBAQAorLyoKKyAgICBidDg2NiAtIEJUODY2IERpZ2l0YWwgVmlkZW8gRW5jb2RlciAoUm9ja3dlbGwgUGFydCkKKworICAgIENvcHlyaWdodCAoQykgMTk5OSBNaWtlIEJlcm5zb24gPG1pa2VAbWxiLm9yZz4KKyAgICBDb3B5cmlnaHQgKEMpIDE5OTggRGF2ZSBQZXJrcyA8ZHBlcmtzQGlibS5uZXQ+CisKKyAgICBNb2RpZmljYXRpb25zIGZvciBMTUwzMy9EQzEwcGx1cyB1bmlmaWVkIGRyaXZlcgorICAgIENvcHlyaWdodCAoQykgMjAwMCBTZXJndWVpIE1pcmlkb25vdiA8bWlyc2V2QGNpY2VzZS5teD4KKworICAgIFRoaXMgY29kZSB3YXMgbW9kaWZ5L3BvcnRlZCBmcm9tIHRoZSBzYWE3MTExIGRyaXZlciB3cml0dGVuCisgICAgYnkgRGF2ZSBQZXJrcy4KKworICAgIFRoaXMgY29kZSB3YXMgYWRhcHRlZCBmb3IgdGhlIGJ0ODY2IGJ5IENocmlzdGVyIFdlaW5pZ2VsIGFuZCBwb3J0ZWQKKyAgICB0byAyLjYgYnkgTWFydGluIFNhbXVlbHNzb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorCisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSA8bGludXgvdmlkZW9fZW5jb2Rlci5oPgorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKyNkZWZpbmUJQlQ4NjZfREVWTkFNRQkiYnQ4NjYiCisjZGVmaW5lIEkyQ19CVDg2NgkweDg4CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworI2RlZmluZSBERUJVRyh4KQkJLyogRGVidWcgZHJpdmVyICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0cnVjdCBidDg2NiB7CisJc3RydWN0IGkyY19jbGllbnQgKmkyYzsKKwlpbnQgYWRkcjsKKwl1bnNpZ25lZCBjaGFyIHJlZ1sxMjhdOworCisJaW50IG5vcm07CisJaW50IGVuYWJsZTsKKwlpbnQgYnJpZ2h0OworCWludCBjb250cmFzdDsKKwlpbnQgaHVlOworCWludCBzYXQ7Cit9OworCitzdGF0aWMgaW50IGJ0ODY2X3dyaXRlKHN0cnVjdCBidDg2NiAqZGV2LAorCQkJdW5zaWduZWQgY2hhciBzdWJhZGRyLCB1bnNpZ25lZCBjaGFyIGRhdGEpOworCitzdGF0aWMgaW50IGJ0ODY2X2RvX2NvbW1hbmQoc3RydWN0IGJ0ODY2ICplbmNvZGVyLAorCQkJdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQoreworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBFTkNPREVSX0dFVF9DQVBBQklMSVRJRVM6CisJeworCQlzdHJ1Y3QgdmlkZW9fZW5jb2Rlcl9jYXBhYmlsaXR5ICpjYXAgPSBhcmc7CisKKwkJREVCVUcocHJpbnRrCisJCSAgICAgIChLRVJOX0lORk8gIiVzOiBnZXQgY2FwYWJpbGl0aWVzXG4iLAorCQkgICAgICAgZW5jb2Rlci0+aTJjLT5uYW1lKSk7CisKKwkJY2FwLT5mbGFncworCQkJPSBWSURFT19FTkNPREVSX1BBTAorCQkJfCBWSURFT19FTkNPREVSX05UU0MKKwkJCXwgVklERU9fRU5DT0RFUl9DQ0lSOworCQljYXAtPmlucHV0cyA9IDI7CisJCWNhcC0+b3V0cHV0cyA9IDE7CisJfQorCWJyZWFrOworCisJY2FzZSBFTkNPREVSX1NFVF9OT1JNOgorCXsKKwkJaW50ICppYXJnID0gYXJnOworCisJCURFQlVHKHByaW50ayhLRVJOX0lORk8gIiVzOiBzZXQgbm9ybSAlZFxuIiwKKwkJCSAgICAgZW5jb2Rlci0+aTJjLT5uYW1lLCAqaWFyZykpOworCisJCXN3aXRjaCAoKmlhcmcpIHsKKworCQljYXNlIFZJREVPX01PREVfTlRTQzoKKwkJCWJyZWFrOworCisJCWNhc2UgVklERU9fTU9ERV9QQUw6CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJfQorCQllbmNvZGVyLT5ub3JtID0gKmlhcmc7CisJfQorCWJyZWFrOworCisJY2FzZSBFTkNPREVSX1NFVF9JTlBVVDoKKwl7CisJCWludCAqaWFyZyA9IGFyZzsKKwkJc3RhdGljIGNvbnN0IF9fdTggaW5pdFtdID0geworCQkJMHhjOCwgMHhjYywgLyogQ1JTQ0FMRSAqLworCQkJMHhjYSwgMHg5MSwgLyogQ0JTQ0FMRSAqLworCQkJMHhjYywgMHgyNCwgLyogWUMxNiB8IE9TRE5VTSAqLworCQkJMHhkYSwgMHgwMCwgLyogICovCisJCQkweGRjLCAweDI0LCAvKiBTRVRNT0RFIHwgUEFMICovCisJCQkweGRlLCAweDAyLCAvKiBFQUNUSVZFICovCisKKwkJCS8qIG92ZXJsYXkgY29sb3JzICovCisJCQkweDcwLCAweEVCLCAweDkwLCAweDgwLCAweEIwLCAweDgwLCAvKiB3aGl0ZSAqLworCQkJMHg3MiwgMHhBMiwgMHg5MiwgMHg4RSwgMHhCMiwgMHgyQywgLyogeWVsbG93ICovCisJCQkweDc0LCAweDgzLCAweDk0LCAweDJDLCAweEI0LCAweDlDLCAvKiBjeWFuICovCisJCQkweDc2LCAweDcwLCAweDk2LCAweDNBLCAweEI2LCAweDQ4LCAvKiBncmVlbiAqLworCQkJMHg3OCwgMHg1NCwgMHg5OCwgMHhDNiwgMHhCOCwgMHhCOCwgLyogbWFnZW50YSAqLworCQkJMHg3QSwgMHg0MSwgMHg5QSwgMHhENCwgMHhCQSwgMHg2NCwgLyogcmVkICovCisJCQkweDdDLCAweDIzLCAweDlDLCAweDcyLCAweEJDLCAweEQ0LCAvKiBibHVlICovCisJCQkweDdFLCAweDEwLCAweDlFLCAweDgwLCAweEJFLCAweDgwLCAvKiBibGFjayAqLworCisJCQkweDYwLCAweEVCLCAweDgwLCAweDgwLCAweGMwLCAweDgwLCAvKiB3aGl0ZSAqLworCQkJMHg2MiwgMHhBMiwgMHg4MiwgMHg4RSwgMHhjMiwgMHgyQywgLyogeWVsbG93ICovCisJCQkweDY0LCAweDgzLCAweDg0LCAweDJDLCAweGM0LCAweDlDLCAvKiBjeWFuICovCisJCQkweDY2LCAweDcwLCAweDg2LCAweDNBLCAweGM2LCAweDQ4LCAvKiBncmVlbiAqLworCQkJMHg2OCwgMHg1NCwgMHg4OCwgMHhDNiwgMHhjOCwgMHhCOCwgLyogbWFnZW50YSAqLworCQkJMHg2QSwgMHg0MSwgMHg4QSwgMHhENCwgMHhjQSwgMHg2NCwgLyogcmVkICovCisJCQkweDZDLCAweDIzLCAweDhDLCAweDcyLCAweGNDLCAweEQ0LCAvKiBibHVlICovCisJCQkweDZFLCAweDEwLCAweDhFLCAweDgwLCAweGNFLCAweDgwLCAvKiBibGFjayAqLworCQl9OworCQlpbnQgaTsKKwkJdTggdmFsOworCisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGluaXQpIC8gMjsgaSArPSAyKQorCQkJYnQ4NjZfd3JpdGUoZW5jb2RlciwgaW5pdFtpXSwgaW5pdFtpKzFdKTsKKworCQl2YWwgPSBlbmNvZGVyLT5yZWdbMHhkY107CisKKwkJaWYgKCppYXJnID09IDApCisJCQl2YWwgfD0gMHg0MDsgLyogQ0JTV0FQICovCisJCWVsc2UKKwkJCXZhbCAmPSB+MHg0MDsgLyogIUNCU1dBUCAqLworCisJCWJ0ODY2X3dyaXRlKGVuY29kZXIsIDB4ZGMsIHZhbCk7CisKKwkJdmFsID0gZW5jb2Rlci0+cmVnWzB4Y2NdOworCQlpZiAoKmlhcmcgPT0gMikKKwkJCXZhbCB8PSAweDAxOyAvKiBPU0RCQVIgKi8KKwkJZWxzZQorCQkJdmFsICY9IH4weDAxOyAvKiAhT1NEQkFSICovCisJCWJ0ODY2X3dyaXRlKGVuY29kZXIsIDB4Y2MsIHZhbCk7CisKKwkJREVCVUcocHJpbnRrKEtFUk5fSU5GTyAiJXM6IHNldCBpbnB1dCAlZFxuIiwKKwkJCSAgICAgZW5jb2Rlci0+aTJjLT5uYW1lLCAqaWFyZykpOworCisJCXN3aXRjaCAoKmlhcmcpIHsKKwkJY2FzZSAwOgorCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJfQorCX0KKwlicmVhazsKKworCWNhc2UgRU5DT0RFUl9TRVRfT1VUUFVUOgorCXsKKwkJaW50ICppYXJnID0gYXJnOworCisJCURFQlVHKHByaW50ayhLRVJOX0lORk8gIiVzOiBzZXQgb3V0cHV0ICVkXG4iLAorCQkJICAgICBlbmNvZGVyLT5pMmMtPm5hbWUsICppYXJnKSk7CisKKwkJLyogbm90IG11Y2ggY2hvaWNlIG9mIG91dHB1dHMgKi8KKwkJaWYgKCppYXJnICE9IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJYnJlYWs7CisKKwljYXNlIEVOQ09ERVJfRU5BQkxFX09VVFBVVDoKKwl7CisJCWludCAqaWFyZyA9IGFyZzsKKwkJZW5jb2Rlci0+ZW5hYmxlID0gISEqaWFyZzsKKworCQlERUJVRyhwcmludGsKKwkJICAgICAgKEtFUk5fSU5GTyAiJXM6IGVuYWJsZSBvdXRwdXQgJWRcbiIsCisJCSAgICAgICBlbmNvZGVyLT5pMmMtPm5hbWUsIGVuY29kZXItPmVuYWJsZSkpOworCX0KKwlicmVhazsKKworCWNhc2UgNDcxMToKKwl7CisJCWludCAqaWFyZyA9IGFyZzsKKwkJX191OCB2YWw7CisKKwkJcHJpbnRrKCJidDg2Njogc3F1YXJlID0gJWRcbiIsICppYXJnKTsKKworCQl2YWwgPSBlbmNvZGVyLT5yZWdbMHhkY107CisJCWlmICgqaWFyZykKKwkJCXZhbCB8PSAxOyAvKiBTUVVBUkUgKi8KKwkJZWxzZQorCQkJdmFsICY9IH4xOyAvKiAhU1FVQVJFICovCisJCWJ0ODY2X3dyaXRlKGVuY29kZXIsIDB4ZGMsIHZhbCk7CisJCWJyZWFrOworCX0KKworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJ0ODY2X3dyaXRlKHN0cnVjdCBidDg2NiAqZW5jb2RlciwKKwkJCXVuc2lnbmVkIGNoYXIgc3ViYWRkciwgdW5zaWduZWQgY2hhciBkYXRhKQoreworCXVuc2lnbmVkIGNoYXIgYnVmZmVyWzJdOworCWludCBlcnI7CisKKwlidWZmZXJbMF0gPSBzdWJhZGRyOworCWJ1ZmZlclsxXSA9IGRhdGE7CisKKwllbmNvZGVyLT5yZWdbc3ViYWRkcl0gPSBkYXRhOworCisJREVCVUcocHJpbnRrCisJICAgICAgKCIlczogd3JpdGUgMHglMDJYID0gMHglMDJYXG4iLAorCSAgICAgICBlbmNvZGVyLT5pMmMtPm5hbWUsIHN1YmFkZHIsIGRhdGEpKTsKKworCWZvciAoZXJyID0gMDsgZXJyIDwgMzspIHsKKwkJaWYgKGkyY19tYXN0ZXJfc2VuZChlbmNvZGVyLT5pMmMsIGJ1ZmZlciwgMikgPT0gMikKKwkJCWJyZWFrOworCQllcnIrKzsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEkvTyBlcnJvciAjJWQgIgorCQkgICAgICAgIih3cml0ZSAweCUwMngvMHglMDJ4KVxuIiwKKwkJICAgICAgIGVuY29kZXItPmkyYy0+bmFtZSwgZXJyLCBlbmNvZGVyLT5hZGRyLCBzdWJhZGRyKTsKKwkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKEhaLzEwKTsKKwl9CisJaWYgKGVyciA9PSAzKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBnaXZpbmcgdXBcbiIsCisJCSAgICAgICBlbmNvZGVyLT5pMmMtPm5hbWUpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYnQ4NjZfYXR0YWNoKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcik7CitzdGF0aWMgaW50IGJ0ODY2X2RldGFjaChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKK3N0YXRpYyBpbnQgYnQ4NjZfY29tbWFuZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZyk7CisKKworLyogQWRkcmVzc2VzIHRvIHNjYW4gKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10JPSB7STJDX0JUODY2Pj4xLCBJMkNfQ0xJRU5UX0VORH07CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgcHJvYmVbMl0JCT0ge0kyQ19DTElFTlRfRU5ELCBJMkNfQ0xJRU5UX0VORH07CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgaWdub3JlWzJdCQk9IHtJMkNfQ0xJRU5UX0VORCwgSTJDX0NMSUVOVF9FTkR9OworCitzdGF0aWMgc3RydWN0IGkyY19jbGllbnRfYWRkcmVzc19kYXRhIGFkZHJfZGF0YSA9IHsKKwlub3JtYWxfaTJjLAorCXByb2JlLAorCWlnbm9yZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBpMmNfZHJpdmVyX2J0ODY2ID0geworCS5kcml2ZXIubmFtZSA9IEJUODY2X0RFVk5BTUUsCisJLmlkID0gSTJDX0RSSVZFUklEX0JUODY2LAorCS5hdHRhY2hfYWRhcHRlciA9IGJ0ODY2X2F0dGFjaCwKKwkuZGV0YWNoX2NsaWVudCA9IGJ0ODY2X2RldGFjaCwKKwkuY29tbWFuZCA9IGJ0ODY2X2NvbW1hbmQKK307CisKKworc3RhdGljIHN0cnVjdCBpMmNfY2xpZW50IGJ0ODY2X2NsaWVudF90bXBsID0KK3sKKwkubmFtZSA9ICIobmlsKSIsCisJLmFkZHIgPSAwLAorCS5hZGFwdGVyID0gTlVMTCwKKwkuZHJpdmVyID0gJmkyY19kcml2ZXJfYnQ4NjYsCisJLnVzYWdlX2NvdW50ID0gMAorfTsKKworc3RhdGljIGludCBidDg2Nl9mb3VuZF9wcm9jKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwKKwkJCSAgICBpbnQgYWRkciwgaW50IGtpbmQpCit7CisJc3RydWN0IGJ0ODY2ICplbmNvZGVyOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CisKKwljbGllbnQgPSBremFsbG9jKHNpemVvZigqY2xpZW50KSwgR0ZQX0tFUk5FTCk7CisJaWYgKGNsaWVudCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1jcHkoY2xpZW50LCAmYnQ4NjZfY2xpZW50X3RtcGwsIHNpemVvZigqY2xpZW50KSk7CisKKwllbmNvZGVyID0ga3phbGxvYyhzaXplb2YoKmVuY29kZXIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoZW5jb2RlciA9PSBOVUxMKSB7CisJCWtmcmVlKGNsaWVudCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGVuY29kZXIpOworCWNsaWVudC0+YWRhcHRlciA9IGFkYXB0ZXI7CisJY2xpZW50LT5hZGRyID0gYWRkcjsKKwlzcHJpbnRmKGNsaWVudC0+bmFtZSwgIiVzLSUwMngiLCBCVDg2Nl9ERVZOQU1FLCBhZGFwdGVyLT5pZCk7CisKKwllbmNvZGVyLT5pMmMgPSBjbGllbnQ7CisJZW5jb2Rlci0+YWRkciA9IGFkZHI7CisJLy9lbmNvZGVyLT5lbmNvZGVyX3R5cGUgPSBFTkNPREVSX1RZUEVfVU5LTk9XTjsKKworCS8qIGluaXRpYWxpemUgKi8KKworCWkyY19hdHRhY2hfY2xpZW50KGNsaWVudCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBidDg2Nl9hdHRhY2goc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQoreworCWlmIChhZGFwdGVyLT5pZCA9PSBJMkNfSFdfQl9aUjM2MDY3KQorCQlyZXR1cm4gaTJjX3Byb2JlKGFkYXB0ZXIsICZhZGRyX2RhdGEsIGJ0ODY2X2ZvdW5kX3Byb2MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJ0ODY2X2RldGFjaChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBidDg2NiAqZW5jb2RlciA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KTsKKwlrZnJlZShlbmNvZGVyKTsKKwlrZnJlZShjbGllbnQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYnQ4NjZfY29tbWFuZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgYnQ4NjYgKmVuY29kZXIgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlyZXR1cm4gYnQ4NjZfZG9fY29tbWFuZChlbmNvZGVyLCBjbWQsIGFyZyk7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGJ0ODY2X2luaXQodm9pZCkKK3sKKwlpMmNfYWRkX2RyaXZlcigmaTJjX2RyaXZlcl9idDg2Nik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBidDg2Nl9leGl0KHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJmkyY19kcml2ZXJfYnQ4NjYpOworfQorCittb2R1bGVfaW5pdChidDg2Nl9pbml0KTsKK21vZHVsZV9leGl0KGJ0ODY2X2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2LWNhcmRzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYtY2FyZHMuYwppbmRleCAyYjY0YWE4Li5lNjhhNmQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYtY2FyZHMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYtY2FyZHMuYwpAQCAtMjY5LDcgKzI2OSw3IEBACiAJeyAweDQxYTBhMDUxLCBCVFRWX0JPQVJEX0ZMWVZJREVPXzk4Rk0sICJMaWZldmlldyBGbHlWaWRlbyA5OCBMUjUwIFJldiBRIiB9LAogCXsgMHgxODUwMWY3ZiwgQlRUVl9CT0FSRF9GTFlWSURFT185OCwgICAiTGlmZXZpZXcgRmx5dmlkZW8gOTgiIH0sCiAKLSAgICAJeyAweDAxMDExNWNiLCBCVFRWX0JPQVJEX0dNVjEsICAgICAgICAgICJBRyBHTVYxIiB9LAorCXsgMHgwMTAxMTVjYiwgQlRUVl9CT0FSRF9HTVYxLCAgICAgICAgICAiQUcgR01WMSIgfSwKIAl7IDB4MDEwMTE0YzcsIEJUVFZfQk9BUkRfTU9EVEVDXzIwNSwgICAgIk1vZHVsYXIgVGVjaG5vbG9neSBNTTIwMS9NTTIwMi9NTTIwNS9NTTIxMC9NTTIxNSBQQ1RWIiB9LAogCiAJeyAweDEwYjQyNjM2LCBCVFRWX0JPQVJEX0hBVVBQQVVHRTg3OCwgICJTVEIgPz8/IiB9LApAQCAtMzA5LDYgKzMwOSw3IEBACiAJeyAweDA3NjExNDYxLCBCVFRWX0JPQVJEX0FWRFZCVF83NjEsICAgICJBdmVyTWVkaWEgQXZlclRWIERWQi1UIDc2MSIgfSwKIAl7IDB4ZGIxMDE4YWMsIEJUVFZfQk9BUkRfRFZJQ09fRFZCVF9MSVRFLCAgICAiRFZpQ08gRnVzaW9uSERUViBEVkItVCBMaXRlIiB9LAogCXsgMHhkNTAwMThhYywgQlRUVl9CT0FSRF9EVklDT19GVVNJT05IRFRWXzVfTElURSwgICAgIkRWaUNPIEZ1c2lvbkhEVFYgNSBMaXRlIiB9LAorCXsgMHgwMDI2MTgyMiwgQlRUVl9CT0FSRF9UV0lOSEFOX0RTVCwJIkROVFYgTGl2ZSEgTWluaSAifSwKIAogCXsgMCwgLTEsIE5VTEwgfQogfTsKQEAgLTE5MDMsNyArMTkwNCw3IEBACiAJCS5ub190ZGE3NDMyICAgICA9IDEsCiAJfSwKIAlbQlRUVl9CT0FSRF9PU1BSRVkyeDBdID0gewotCQkubmFtZSAgICAgICAgICAgPSAiT3NwcmV5IDIxMC8yMjAiLCAgIC8qIDB4MShBfEIpLTA0QzAtQzEgKi8KKwkJLm5hbWUgICAgICAgICAgID0gIk9zcHJleSAyMTAvMjIwLzIzMCIsICAgLyogMHgxKEF8QiktMDRDMC1DMSAqLwogCQkudmlkZW9faW5wdXRzICAgPSAyLAogCQkuYXVkaW9faW5wdXRzICAgPSAxLAogCQkudHVuZXIgICAgICAgICAgPSAtMSwKQEAgLTI3NDUsNyArMjc0Niw3IEBACiAJCS8qIE1pY2hhZWwgS3J1Zmt5IDxta3J1Zmt5QG0xay5uZXQ+ICovCiAJCS5uYW1lICAgICAgICAgICA9ICJEVmlDTyBGdXNpb25IRFRWIDUgTGl0ZSIsCiAJCS50dW5lciAgICAgICAgICA9IDAsCi0JCS50dW5lcl90eXBlICAgICA9IFRVTkVSX0xHX1REVlNfSDA2MkYsCisJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX0xHX1REVlNfSDA2WEYsIC8qIFREVlMtSDA2NEYgKi8KIAkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAogCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAogCQkudmlkZW9faW5wdXRzICAgPSAzLApAQCAtMjc2Miw3ICsyNzYzLDcgQEAKIAl9LAogCQkvKiAtLS0tIGNhcmQgMHg4OC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAlbQlRUVl9CT0FSRF9BQ09SUF9ZODc4Rl0gPSB7Ci0JCS8qIE1hdXJvIENhcnZhbGhvIENoZWhhYiA8bWNoZWhhYkBicnR1cmJvLmNvbS5icj4gKi8KKwkJLyogTWF1cm8gQ2FydmFsaG8gQ2hlaGFiIDxtY2hlaGFiQGluZnJhZGVhZC5vcmc+ICovCiAJCS5uYW1lCQk9ICJBY29ycCBZODc4RiIsCiAJCS52aWRlb19pbnB1dHMJPSAzLAogCQkuYXVkaW9faW5wdXRzCT0gMSwKQEAgLTM3OTAsNiArMzc5MSw3IEBACiAJCSAgICAgICBicmVhazsKIAkgICAgICAgY2FzZSAweDAwNjA6CiAJICAgICAgIGNhc2UgMHgwMDcwOgorCSAgICAgICBjYXNlIDB4MDBBMDoKIAkJICAgICAgIGJ0di0+Yy50eXBlID0gQlRUVl9CT0FSRF9PU1BSRVkyeDA7CiAJCSAgICAgICAvKiBlbmFibGUgb3V0cHV0IG9uIHNlbGVjdCBjb250cm9sIGxpbmVzICovCiAJCSAgICAgICBncGlvX2lub3V0KDB4ZmZmZmZmLDB4MDAwMzAzKTsKQEAgLTQ4NDYsNyArNDg0OCw3IEBACiAgKgogICogVGhlIElWQzEyMEcgc2VjdXJpdHkgY2FyZCBoYXMgNCBpMmMgY29udHJvbGxlZCBUREE4NTQwIG1hdHJpeAogICogc3dpY2hlcnMgdG8gcHJvdmlkZSAxNiBjaGFubmVscyB0byBNVVgwLiBUaGUgVERBODU0MCdzIGhhdmUKLSAqIDQgaW5kZXBlZGFudCBvdXRwdXRzIGFuZCBhcyBzdWNoIHRoZSBJVkMxMjBHIGFsc28gaGFzIHRoZQorICogNCBpbmRlcGVuZGVudCBvdXRwdXRzIGFuZCBhcyBzdWNoIHRoZSBJVkMxMjBHIGFsc28gaGFzIHRoZQogICogb3B0aW9uYWwgIk1vbml0b3IgT3V0IiBidXMuIFRoaXMgYWxsb3dzIHRoZSBjYXJkIHRvIGJlIGxvb2tpbmcKICAqIGF0IG9uZSBpbnB1dCB3aGlsZSB0aGUgbW9uaXRvciBpcyBsb29raW5nIGF0IGFub3RoZXIuCiAgKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2LWdwaW8uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnR0di1ncGlvLmMKaW5kZXggYzRkNWUyYi4uYmEwODFmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2LWdwaW8uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYtZ3Bpby5jCkBAIC0xMTgsMjAgKzExOCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgYnR0dl9ncGlvX2lycShzdHJ1Y3QgYnR0dl9jb3JlICpjb3JlKQotewotCXN0cnVjdCBidHR2X3N1Yl9kcml2ZXIgKmRydjsKLQlzdHJ1Y3QgYnR0dl9zdWJfZGV2aWNlICpkZXY7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqaXRlbTsKLQotCWxpc3RfZm9yX2VhY2goaXRlbSwmY29yZS0+c3VicykgewotCQlkZXYgPSBsaXN0X2VudHJ5KGl0ZW0sc3RydWN0IGJ0dHZfc3ViX2RldmljZSxsaXN0KTsKLQkJZHJ2ID0gdG9fYnR0dl9zdWJfZHJ2KGRldi0+ZGV2LmRyaXZlcik7Ci0JCWlmIChkcnYgJiYgZHJ2LT5ncGlvX2lycSkKLQkJCWRydi0+Z3Bpb19pcnEoZGV2KTsKLQl9Ci19Ci0KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAvKiBleHRlcm5hbDogc3ViLWRyaXZlciByZWdpc3Rlci91bnJlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYtaW5wdXQuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnR0di1pbnB1dC5jCmluZGV4IDY5ZWZhMGUuLmI0MWY4MWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnR0di1pbnB1dC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnR0di1pbnB1dC5jCkBAIC0zNTUsNyArMzU1LDcgQEAKIAogCWlmIChpci0+cmM1X2dwaW8pIHsKIAkJdTMyIGdwaW87Ci0JICAgIAkvKiBlbmFibGUgcmVtb3RlIGlycSAqLworCQkvKiBlbmFibGUgcmVtb3RlIGlycSAqLwogCQlidHR2X2dwaW9faW5vdXQoJmJ0di0+YywgKDEgPDwgNCksIDEgPDwgNCk7CiAJCWdwaW8gPSBidHR2X2dwaW9fcmVhZCgmYnR2LT5jKTsKIAkJYnR0dl9ncGlvX3dyaXRlKCZidHYtPmMsIGdwaW8gJiB+KDEgPDwgNCkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2LmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYuaAppbmRleCAzYTIzMjY1Li5mOWM5ZTNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYuaApAQCAtMzUwLDcgKzM1MCw2IEBACiAJY2hhciAgICAgICAgICAgICAgICAgICB3YW50ZWRbQlVTX0lEX1NJWkVdOwogCWludCAgICAgICAgICAgICAgICAgICAgKCpwcm9iZSkoc3RydWN0IGJ0dHZfc3ViX2RldmljZSAqc3ViKTsKIAl2b2lkICAgICAgICAgICAgICAgICAgICgqcmVtb3ZlKShzdHJ1Y3QgYnR0dl9zdWJfZGV2aWNlICpzdWIpOwotCXZvaWQgICAgICAgICAgICAgICAgICAgKCpncGlvX2lycSkoc3RydWN0IGJ0dHZfc3ViX2RldmljZSAqc3ViKTsKIH07CiAjZGVmaW5lIHRvX2J0dHZfc3ViX2Rydih4KSBjb250YWluZXJfb2YoKHgpLCBzdHJ1Y3QgYnR0dl9zdWJfZHJpdmVyLCBkcnYpCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnR0dnAuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnR0dnAuaAppbmRleCBlZTk4OWQyLi5kMjk1NjAxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHZwLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2cC5oCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLWFsZ28tYml0Lmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KQEAgLTIxNCw3ICsyMTUsNiBAQAogZXh0ZXJuIHN0cnVjdCBidXNfdHlwZSBidHR2X3N1Yl9idXNfdHlwZTsKIGludCBidHR2X3N1Yl9hZGRfZGV2aWNlKHN0cnVjdCBidHR2X2NvcmUgKmNvcmUsIGNoYXIgKm5hbWUpOwogaW50IGJ0dHZfc3ViX2RlbF9kZXZpY2VzKHN0cnVjdCBidHR2X2NvcmUgKmNvcmUpOwotdm9pZCBidHR2X2dwaW9faXJxKHN0cnVjdCBidHR2X2NvcmUgKmNvcmUpOwogCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnctcWNhbS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9idy1xY2FtLmMKaW5kZXggY2Y2MWM1OS4uN2QwYjZlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9idy1xY2FtLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9idy1xY2FtLmMKQEAgLTczLDYgKzczLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wYXJwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCkBAIC03NTksNyArNzYwLDcgQEAKIAkJewogCQkJc3RydWN0IHZpZGVvX3BpY3R1cmUgKnAgPSBhcmc7CiAJCQlpZihwLT5wYWxldHRlIT1WSURFT19QQUxFVFRFX0dSRVkpCi0JCQkgICAgCXJldHVybiAtRUlOVkFMOworCQkJCXJldHVybiAtRUlOVkFMOwogCQkJaWYocC0+ZGVwdGghPTQgJiYgcC0+ZGVwdGghPTYpCiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYy1xY2FtLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2MtcWNhbS5jCmluZGV4IDIyYTczODYuLmEzOTg5YmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYy1xY2FtLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jLXFjYW0uYwpAQCAtMzQsNiArMzQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BhcnBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3BpYS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jcGlhLmMKaW5kZXggODVkODRlOC4uOTVjNWFjZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jcGlhLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jcGlhLmMKQEAgLTQ3LDEzICs0Nyw2IEBACiAKICNpbmNsdWRlICJjcGlhLmgiCiAKLSNpZmRlZiBDT05GSUdfVklERU9fQ1BJQV9QUAotZXh0ZXJuIGludCBjcGlhX3BwX2luaXQodm9pZCk7Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfVklERU9fQ1BJQV9VU0IKLWV4dGVybiBpbnQgY3BpYV91c2JfaW5pdCh2b2lkKTsKLSNlbmRpZgotCiBzdGF0aWMgaW50IHZpZGVvX25yID0gLTE7CiAKICNpZmRlZiBNT0RVTEUKQEAgLTY3LDEwICs2MCwxMCBAQAogc3RhdGljIHVuc2lnbmVkIHNob3J0IGNvbG9yc3BhY2VfY29udjsKIG1vZHVsZV9wYXJhbShjb2xvcnNwYWNlX2NvbnYsIHVzaG9ydCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGNvbG9yc3BhY2VfY29udiwKLSAgICAgICAgICAgICAgICAgIiBDb2xvcnNwYWNlIGNvbnZlcnNpb246IgotICAgICAgICAgICAgICAgICAiXG4gIDAgPSBkaXNhYmxlLCAxID0gZW5hYmxlIgotICAgICAgICAgICAgICAgICAiXG4gIERlZmF1bHQgdmFsdWUgaXMgMCIKLSAgICAgICAgICAgICAgICAgKTsKKwkJICIgQ29sb3JzcGFjZSBjb252ZXJzaW9uOiIKKwkJICJcbiAgMCA9IGRpc2FibGUsIDEgPSBlbmFibGUiCisJCSAiXG4gIERlZmF1bHQgdmFsdWUgaXMgMCIKKwkJICk7CiAKICNkZWZpbmUgQUJPVVQgIlY0TC1Ecml2ZXIgZm9yIFZpc2lvbiBDUGlBIGJhc2VkIGNhbWVyYXMiCiAKQEAgLTQwNDcsMTMgKzQwNDAsNiBAQAogCXByb2NfY3BpYV9jcmVhdGUoKTsKICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX1ZJREVPX0NQSUFfUFAKLQljcGlhX3BwX2luaXQoKTsKLSNlbmRpZgotI2lmZGVmIENPTkZJR19WSURFT19DUElBX1VTQgotCWNwaWFfdXNiX2luaXQoKTsKLSNlbmRpZgotCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3BpYS5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9jcGlhLmgKaW5kZXggZGRlMjdhNi4uNmVhYTY5MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jcGlhLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jcGlhLmgKQEAgLTQ1LDYgKzQ1LDcgQEAKIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CkBAIC0yNDcsNyArMjQ4LDcgQEAKIHN0cnVjdCBjYW1fZGF0YSB7CiAJc3RydWN0IGxpc3RfaGVhZCBjYW1fZGF0YV9saXN0OwogCi0Jc3RydWN0IG11dGV4IGJ1c3lfbG9jazsgICAgIC8qIGd1YXJkIGFnYWluc3QgU01QIG11bHRpdGhyZWFkaW5nICovCisJc3RydWN0IG11dGV4IGJ1c3lfbG9jazsJCS8qIGd1YXJkIGFnYWluc3QgU01QIG11bHRpdGhyZWFkaW5nICovCiAJc3RydWN0IGNwaWFfY2FtZXJhX29wcyAqb3BzOwkvKiBsb3dsZXZlbCBkcml2ZXIgb3BlcmF0aW9ucyAqLwogCXZvaWQgKmxvd2xldmVsX2RhdGE7CQkvKiBwcml2YXRlIGRhdGEgZm9yIGxvd2xldmVsIGRyaXZlciAqLwogCXU4ICpyYXdfaW1hZ2U7CQkJLyogYnVmZmVyIGZvciByYXcgaW1hZ2UgZGF0YSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jcGlhMi9jcGlhMi5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9jcGlhMi9jcGlhMi5oCmluZGV4IDE3NjQ5OTEuLmM1ZWNiMmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3BpYTIvY3BpYTIuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2NwaWEyL2NwaWEyLmgKQEAgLTMzLDYgKzMzLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CiAjaW5jbHVkZSA8bGludXgvcG9sbC5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2NwaWEyL2NwaWEyX3Y0bC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jcGlhMi9jcGlhMl92NGwuYwppbmRleCA0ODFlMTc4Li5kMTI5ZGI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2NwaWEyL2NwaWEyX3Y0bC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3BpYTIvY3BpYTJfdjRsLmMKQEAgLTM0Myw3ICszNDMsOSBAQAogCQljcGlhMl9mcmVlX2J1ZmZlcnMoY2FtKTsKIAkJaWYgKCFjYW0tPnByZXNlbnQpIHsKIAkJCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKGRldik7CisJCQltdXRleF91bmxvY2soJmNhbS0+YnVzeV9sb2NrKTsKIAkJCWtmcmVlKGNhbSk7CisJCQlyZXR1cm4gMDsKIAkJfQogCX0KIApAQCAtMTE2Nyw5ICsxMTY5LDkgQEAKIAkJfSBlbHNlIHsKIAkJICAgIGlmKGNhbS0+cGFyYW1zLmZsaWNrZXJfY29udHJvbC5jYW1fcmVnaXN0ZXIgJgogCQkgICAgICAgQ1BJQTJfVlBfRkxJQ0tFUl9NT0RFU181MEhaKSB7Ci0JCSAgICAJbW9kZSA9IEZMSUNLRVJfNTA7CisJCQltb2RlID0gRkxJQ0tFUl81MDsKIAkJICAgIH0gZWxzZSB7Ci0JCSAgICAJbW9kZSA9IEZMSUNLRVJfNjA7CisJCQltb2RlID0gRkxJQ0tFUl82MDsKIAkJICAgIH0KIAkJfQogCQlmb3IoaT0wOyBpPE5VTV9GTElDS0VSX0NPTlRST0xTOyBpKyspIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3BpYV9wcC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jcGlhX3BwLmMKaW5kZXggMGIwMGU2MC4uNGM4OWJkMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jcGlhX3BwLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jcGlhX3BwLmMKQEAgLTgwMyw3ICs4MDMsNyBAQAogCS5kZXRhY2ggPSBjcGlhX3BwX2RldGFjaCwKIH07CiAKLWludCBjcGlhX3BwX2luaXQodm9pZCkKK3N0YXRpYyBpbnQgY3BpYV9wcF9pbml0KHZvaWQpCiB7CiAJcHJpbnRrKEtFUk5fSU5GTyAiJXMgdiVkLiVkLiVkXG4iLEFCT1VULAogCSAgICAgICBDUElBX1BQX01BSl9WRVIsQ1BJQV9QUF9NSU5fVkVSLENQSUFfUFBfUEFUQ0hfVkVSKTsKQEAgLTg2MCw2ICs4NjAsOCBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBjcGlhX3BwX3NldHVwKGNoYXIgKnN0cikKIHsKKwlpbnQgZXJyOworCiAJaWYgKCFzdHJuY21wKHN0ciwgInBhcnBvcnQiLCA3KSkgewogCQlpbnQgbiA9IHNpbXBsZV9zdHJ0b3VsKHN0ciArIDcsIE5VTEwsIDEwKTsKIAkJaWYgKHBhcnBvcnRfcHRyIDwgUEFSUE9SVF9NQVgpIHsKQEAgLTg3Myw2ICs4NzUsMTAgQEAKIAkJcGFycG9ydF9ucltwYXJwb3J0X3B0cisrXSA9IFBQQ1BJQV9QQVJQT1JUX05PTkU7CiAJfQogCisJZXJyPWNwaWFfcHBfaW5pdCgpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKIAlyZXR1cm4gMTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jcGlhX3VzYi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jcGlhX3VzYi5jCmluZGV4IDljNDlhNGIuLjJlZTM0YTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3BpYV91c2IuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2NwaWFfdXNiLmMKQEAgLTQ3NCwxMiArNDc0LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGNwaWFfdXNiX2luaXQodm9pZCkKLXsKLQkvKiByZXR1cm4gLUVOT0RFVjsgKi8KLQlyZXR1cm4gMDsKLX0KLQogLyogUHJvYmluZyBhbmQgaW5pdGlhbGl6aW5nICovCiAKIHN0YXRpYyBpbnQgY3BpYV9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzQxeC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzNDF4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFiMjJlYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzQxeC5jCkBAIC0wLDAgKzEsOTMyIEBACisvKgorICogY3gyMzQxeCAtIGdlbmVyaWMgY29kZSBmb3IgY3gyMzQxNS82IGJhc2VkIGRldmljZXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgSGFucyBWZXJrdWlsIDxodmVya3VpbEB4czRhbGwubmw+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorCisjaW5jbHVkZSA8bWVkaWEvdHVuZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9jeDIzNDF4Lmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KKworTU9EVUxFX0RFU0NSSVBUSU9OKCJjeDIzNDE1LzYgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJIYW5zIFZlcmt1aWwiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIGludCBkZWJ1ZyA9IDA7Cittb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiRGVidWcgbGV2ZWwgKDAtMSkiKTsKKworY29uc3QgdTMyIGN4MjM0MXhfbXBlZ19jdHJsc1tdID0geworCVY0TDJfQ0lEX01QRUdfQ0xBU1MsCisJVjRMMl9DSURfTVBFR19TVFJFQU1fVFlQRSwKKwlWNEwyX0NJRF9NUEVHX1NUUkVBTV9WQklfRk1ULAorCVY0TDJfQ0lEX01QRUdfQVVESU9fU0FNUExJTkdfRlJFUSwKKwlWNEwyX0NJRF9NUEVHX0FVRElPX0VOQ09ESU5HLAorCVY0TDJfQ0lEX01QRUdfQVVESU9fTDJfQklUUkFURSwKKwlWNEwyX0NJRF9NUEVHX0FVRElPX01PREUsCisJVjRMMl9DSURfTVBFR19BVURJT19NT0RFX0VYVEVOU0lPTiwKKwlWNEwyX0NJRF9NUEVHX0FVRElPX0VNUEhBU0lTLAorCVY0TDJfQ0lEX01QRUdfQVVESU9fQ1JDLAorCVY0TDJfQ0lEX01QRUdfVklERU9fRU5DT0RJTkcsCisJVjRMMl9DSURfTVBFR19WSURFT19BU1BFQ1QsCisJVjRMMl9DSURfTVBFR19WSURFT19CX0ZSQU1FUywKKwlWNEwyX0NJRF9NUEVHX1ZJREVPX0dPUF9TSVpFLAorCVY0TDJfQ0lEX01QRUdfVklERU9fR09QX0NMT1NVUkUsCisJVjRMMl9DSURfTVBFR19WSURFT19QVUxMRE9XTiwKKwlWNEwyX0NJRF9NUEVHX1ZJREVPX0JJVFJBVEVfTU9ERSwKKwlWNEwyX0NJRF9NUEVHX1ZJREVPX0JJVFJBVEUsCisJVjRMMl9DSURfTVBFR19WSURFT19CSVRSQVRFX1BFQUssCisJVjRMMl9DSURfTVBFR19WSURFT19URU1QT1JBTF9ERUNJTUFUSU9OLAorCVY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19TUEFUSUFMX0ZJTFRFUl9NT0RFLAorCVY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19TUEFUSUFMX0ZJTFRFUiwKKwlWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fTFVNQV9TUEFUSUFMX0ZJTFRFUl9UWVBFLAorCVY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19DSFJPTUFfU1BBVElBTF9GSUxURVJfVFlQRSwKKwlWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fVEVNUE9SQUxfRklMVEVSX01PREUsCisJVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX1RFTVBPUkFMX0ZJTFRFUiwKKwlWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fTUVESUFOX0ZJTFRFUl9UWVBFLAorCVY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19MVU1BX01FRElBTl9GSUxURVJfQk9UVE9NLAorCVY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19MVU1BX01FRElBTl9GSUxURVJfVE9QLAorCVY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19DSFJPTUFfTUVESUFOX0ZJTFRFUl9CT1RUT00sCisJVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX0NIUk9NQV9NRURJQU5fRklMVEVSX1RPUCwKKwkwCit9OworCisKKy8qIE1hcCB0aGUgY29udHJvbCBJRCB0byB0aGUgY29ycmVjdCBmaWVsZCBpbiB0aGUgY3gyMzQxeF9tcGVnX3BhcmFtcworICAgc3RydWN0LiBSZXR1cm4gLUVJTlZBTCBpZiB0aGUgSUQgaXMgdW5rbm93biwgZWxzZSByZXR1cm4gMC4gKi8KK3N0YXRpYyBpbnQgY3gyMzQxeF9nZXRfY3RybChzdHJ1Y3QgY3gyMzQxeF9tcGVnX3BhcmFtcyAqcGFyYW1zLAorCQlzdHJ1Y3QgdjRsMl9leHRfY29udHJvbCAqY3RybCkKK3sKKwlzd2l0Y2ggKGN0cmwtPmlkKSB7CisJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX1NBTVBMSU5HX0ZSRVE6CisJCWN0cmwtPnZhbHVlID0gcGFyYW1zLT5hdWRpb19zYW1wbGluZ19mcmVxOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fRU5DT0RJTkc6CisJCWN0cmwtPnZhbHVlID0gcGFyYW1zLT5hdWRpb19lbmNvZGluZzsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0wyX0JJVFJBVEU6CisJCWN0cmwtPnZhbHVlID0gcGFyYW1zLT5hdWRpb19sMl9iaXRyYXRlOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fTU9ERToKKwkJY3RybC0+dmFsdWUgPSBwYXJhbXMtPmF1ZGlvX21vZGU7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19NT0RFX0VYVEVOU0lPTjoKKwkJY3RybC0+dmFsdWUgPSBwYXJhbXMtPmF1ZGlvX21vZGVfZXh0ZW5zaW9uOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fRU1QSEFTSVM6CisJCWN0cmwtPnZhbHVlID0gcGFyYW1zLT5hdWRpb19lbXBoYXNpczsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0NSQzoKKwkJY3RybC0+dmFsdWUgPSBwYXJhbXMtPmF1ZGlvX2NyYzsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0VOQ09ESU5HOgorCQljdHJsLT52YWx1ZSA9IHBhcmFtcy0+dmlkZW9fZW5jb2Rpbmc7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19BU1BFQ1Q6CisJCWN0cmwtPnZhbHVlID0gcGFyYW1zLT52aWRlb19hc3BlY3Q7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19CX0ZSQU1FUzoKKwkJY3RybC0+dmFsdWUgPSBwYXJhbXMtPnZpZGVvX2JfZnJhbWVzOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fR09QX1NJWkU6CisJCWN0cmwtPnZhbHVlID0gcGFyYW1zLT52aWRlb19nb3Bfc2l6ZTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0dPUF9DTE9TVVJFOgorCQljdHJsLT52YWx1ZSA9IHBhcmFtcy0+dmlkZW9fZ29wX2Nsb3N1cmU7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19QVUxMRE9XTjoKKwkJY3RybC0+dmFsdWUgPSBwYXJhbXMtPnZpZGVvX3B1bGxkb3duOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fQklUUkFURV9NT0RFOgorCQljdHJsLT52YWx1ZSA9IHBhcmFtcy0+dmlkZW9fYml0cmF0ZV9tb2RlOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fQklUUkFURToKKwkJY3RybC0+dmFsdWUgPSBwYXJhbXMtPnZpZGVvX2JpdHJhdGU7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19CSVRSQVRFX1BFQUs6CisJCWN0cmwtPnZhbHVlID0gcGFyYW1zLT52aWRlb19iaXRyYXRlX3BlYWs7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19URU1QT1JBTF9ERUNJTUFUSU9OOgorCQljdHJsLT52YWx1ZSA9IHBhcmFtcy0+dmlkZW9fdGVtcG9yYWxfZGVjaW1hdGlvbjsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9UWVBFOgorCQljdHJsLT52YWx1ZSA9IHBhcmFtcy0+c3RyZWFtX3R5cGU7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19TVFJFQU1fVkJJX0ZNVDoKKwkJY3RybC0+dmFsdWUgPSBwYXJhbXMtPnN0cmVhbV92YmlfZm10OworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19TUEFUSUFMX0ZJTFRFUl9NT0RFOgorCQljdHJsLT52YWx1ZSA9IHBhcmFtcy0+dmlkZW9fc3BhdGlhbF9maWx0ZXJfbW9kZTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fU1BBVElBTF9GSUxURVI6CisJCWN0cmwtPnZhbHVlID0gcGFyYW1zLT52aWRlb19zcGF0aWFsX2ZpbHRlcjsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fTFVNQV9TUEFUSUFMX0ZJTFRFUl9UWVBFOgorCQljdHJsLT52YWx1ZSA9IHBhcmFtcy0+dmlkZW9fbHVtYV9zcGF0aWFsX2ZpbHRlcl90eXBlOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19DSFJPTUFfU1BBVElBTF9GSUxURVJfVFlQRToKKwkJY3RybC0+dmFsdWUgPSBwYXJhbXMtPnZpZGVvX2Nocm9tYV9zcGF0aWFsX2ZpbHRlcl90eXBlOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19URU1QT1JBTF9GSUxURVJfTU9ERToKKwkJY3RybC0+dmFsdWUgPSBwYXJhbXMtPnZpZGVvX3RlbXBvcmFsX2ZpbHRlcl9tb2RlOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19URU1QT1JBTF9GSUxURVI6CisJCWN0cmwtPnZhbHVlID0gcGFyYW1zLT52aWRlb190ZW1wb3JhbF9maWx0ZXI7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX01FRElBTl9GSUxURVJfVFlQRToKKwkJY3RybC0+dmFsdWUgPSBwYXJhbXMtPnZpZGVvX21lZGlhbl9maWx0ZXJfdHlwZTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fTFVNQV9NRURJQU5fRklMVEVSX1RPUDoKKwkJY3RybC0+dmFsdWUgPSBwYXJhbXMtPnZpZGVvX2x1bWFfbWVkaWFuX2ZpbHRlcl90b3A7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX0xVTUFfTUVESUFOX0ZJTFRFUl9CT1RUT006CisJCWN0cmwtPnZhbHVlID0gcGFyYW1zLT52aWRlb19sdW1hX21lZGlhbl9maWx0ZXJfYm90dG9tOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19DSFJPTUFfTUVESUFOX0ZJTFRFUl9UT1A6CisJCWN0cmwtPnZhbHVlID0gcGFyYW1zLT52aWRlb19jaHJvbWFfbWVkaWFuX2ZpbHRlcl90b3A7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX0NIUk9NQV9NRURJQU5fRklMVEVSX0JPVFRPTToKKwkJY3RybC0+dmFsdWUgPSBwYXJhbXMtPnZpZGVvX2Nocm9tYV9tZWRpYW5fZmlsdGVyX2JvdHRvbTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCisvKiBNYXAgdGhlIGNvbnRyb2wgSUQgdG8gdGhlIGNvcnJlY3QgZmllbGQgaW4gdGhlIGN4MjM0MXhfbXBlZ19wYXJhbXMKKyAgIHN0cnVjdC4gUmV0dXJuIC1FSU5WQUwgaWYgdGhlIElEIGlzIHVua25vd24sIGVsc2UgcmV0dXJuIDAuICovCitzdGF0aWMgaW50IGN4MjM0MXhfc2V0X2N0cmwoc3RydWN0IGN4MjM0MXhfbXBlZ19wYXJhbXMgKnBhcmFtcywKKwkJc3RydWN0IHY0bDJfZXh0X2NvbnRyb2wgKmN0cmwpCit7CisJc3dpdGNoIChjdHJsLT5pZCkgeworCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19TQU1QTElOR19GUkVROgorCQlwYXJhbXMtPmF1ZGlvX3NhbXBsaW5nX2ZyZXEgPSBjdHJsLT52YWx1ZTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0VOQ09ESU5HOgorCQlwYXJhbXMtPmF1ZGlvX2VuY29kaW5nID0gY3RybC0+dmFsdWU7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19MMl9CSVRSQVRFOgorCQlwYXJhbXMtPmF1ZGlvX2wyX2JpdHJhdGUgPSBjdHJsLT52YWx1ZTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX01PREU6CisJCXBhcmFtcy0+YXVkaW9fbW9kZSA9IGN0cmwtPnZhbHVlOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fTU9ERV9FWFRFTlNJT046CisJCXBhcmFtcy0+YXVkaW9fbW9kZV9leHRlbnNpb24gPSBjdHJsLT52YWx1ZTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0VNUEhBU0lTOgorCQlwYXJhbXMtPmF1ZGlvX2VtcGhhc2lzID0gY3RybC0+dmFsdWU7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19DUkM6CisJCXBhcmFtcy0+YXVkaW9fY3JjID0gY3RybC0+dmFsdWU7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19BU1BFQ1Q6CisJCXBhcmFtcy0+dmlkZW9fYXNwZWN0ID0gY3RybC0+dmFsdWU7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19CX0ZSQU1FUzogeworCQlpbnQgYiA9IGN0cmwtPnZhbHVlICsgMTsKKwkJaW50IGdvcCA9IHBhcmFtcy0+dmlkZW9fZ29wX3NpemU7CisJCXBhcmFtcy0+dmlkZW9fYl9mcmFtZXMgPSBjdHJsLT52YWx1ZTsKKwkJcGFyYW1zLT52aWRlb19nb3Bfc2l6ZSA9IGIgKiAoKGdvcCArIGIgLSAxKSAvIGIpOworCQkvKiBNYXggR09QIHNpemUgPSAzNCAqLworCQl3aGlsZSAocGFyYW1zLT52aWRlb19nb3Bfc2l6ZSA+IDM0KQorCQkJcGFyYW1zLT52aWRlb19nb3Bfc2l6ZSAtPSBiOworCQlicmVhazsKKwl9CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0dPUF9TSVpFOiB7CisJCWludCBiID0gcGFyYW1zLT52aWRlb19iX2ZyYW1lcyArIDE7CisJCWludCBnb3AgPSBjdHJsLT52YWx1ZTsKKwkJcGFyYW1zLT52aWRlb19nb3Bfc2l6ZSA9IGIgKiAoKGdvcCArIGIgLSAxKSAvIGIpOworCQkvKiBNYXggR09QIHNpemUgPSAzNCAqLworCQl3aGlsZSAocGFyYW1zLT52aWRlb19nb3Bfc2l6ZSA+IDM0KQorCQkJcGFyYW1zLT52aWRlb19nb3Bfc2l6ZSAtPSBiOworCQljdHJsLT52YWx1ZSA9IHBhcmFtcy0+dmlkZW9fZ29wX3NpemU7CisJCWJyZWFrOworCX0KKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fR09QX0NMT1NVUkU6CisJCXBhcmFtcy0+dmlkZW9fZ29wX2Nsb3N1cmUgPSBjdHJsLT52YWx1ZTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX1BVTExET1dOOgorCQlwYXJhbXMtPnZpZGVvX3B1bGxkb3duID0gY3RybC0+dmFsdWU7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19CSVRSQVRFX01PREU6CisJCS8qIE1QRUctMSBvbmx5IGFsbG93cyBDQlIgKi8KKwkJaWYgKHBhcmFtcy0+dmlkZW9fZW5jb2RpbmcgPT0gVjRMMl9NUEVHX1ZJREVPX0VOQ09ESU5HX01QRUdfMSAmJgorCQkgICAgY3RybC0+dmFsdWUgIT0gVjRMMl9NUEVHX1ZJREVPX0JJVFJBVEVfTU9ERV9DQlIpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJcGFyYW1zLT52aWRlb19iaXRyYXRlX21vZGUgPSBjdHJsLT52YWx1ZTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0JJVFJBVEU6CisJCXBhcmFtcy0+dmlkZW9fYml0cmF0ZSA9IGN0cmwtPnZhbHVlOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fQklUUkFURV9QRUFLOgorCQlwYXJhbXMtPnZpZGVvX2JpdHJhdGVfcGVhayA9IGN0cmwtPnZhbHVlOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fVEVNUE9SQUxfREVDSU1BVElPTjoKKwkJcGFyYW1zLT52aWRlb190ZW1wb3JhbF9kZWNpbWF0aW9uID0gY3RybC0+dmFsdWU7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19TVFJFQU1fVFlQRToKKwkJcGFyYW1zLT5zdHJlYW1fdHlwZSA9IGN0cmwtPnZhbHVlOworCQlwYXJhbXMtPnZpZGVvX2VuY29kaW5nID0KKwkJCShwYXJhbXMtPnN0cmVhbV90eXBlID09IFY0TDJfTVBFR19TVFJFQU1fVFlQRV9NUEVHMV9TUyB8fAorCQkJIHBhcmFtcy0+c3RyZWFtX3R5cGUgPT0gVjRMMl9NUEVHX1NUUkVBTV9UWVBFX01QRUcxX1ZDRCkgPworCQkJVjRMMl9NUEVHX1ZJREVPX0VOQ09ESU5HX01QRUdfMSA6IFY0TDJfTVBFR19WSURFT19FTkNPRElOR19NUEVHXzI7CisJCWlmIChwYXJhbXMtPnZpZGVvX2VuY29kaW5nID09IFY0TDJfTVBFR19WSURFT19FTkNPRElOR19NUEVHXzEpIHsKKwkJCS8qIE1QRUctMSBpbXBsaWVzIENCUiAqLworCQkJcGFyYW1zLT52aWRlb19iaXRyYXRlX21vZGUgPSBWNEwyX01QRUdfVklERU9fQklUUkFURV9NT0RFX0NCUjsKKwkJfQorCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1ZCSV9GTVQ6CisJCXBhcmFtcy0+c3RyZWFtX3ZiaV9mbXQgPSBjdHJsLT52YWx1ZTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fU1BBVElBTF9GSUxURVJfTU9ERToKKwkJcGFyYW1zLT52aWRlb19zcGF0aWFsX2ZpbHRlcl9tb2RlID0gY3RybC0+dmFsdWU7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX1NQQVRJQUxfRklMVEVSOgorCQlwYXJhbXMtPnZpZGVvX3NwYXRpYWxfZmlsdGVyID0gY3RybC0+dmFsdWU7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX0xVTUFfU1BBVElBTF9GSUxURVJfVFlQRToKKwkJcGFyYW1zLT52aWRlb19sdW1hX3NwYXRpYWxfZmlsdGVyX3R5cGUgPSBjdHJsLT52YWx1ZTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fQ0hST01BX1NQQVRJQUxfRklMVEVSX1RZUEU6CisJCXBhcmFtcy0+dmlkZW9fY2hyb21hX3NwYXRpYWxfZmlsdGVyX3R5cGUgPSBjdHJsLT52YWx1ZTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fVEVNUE9SQUxfRklMVEVSX01PREU6CisJCXBhcmFtcy0+dmlkZW9fdGVtcG9yYWxfZmlsdGVyX21vZGUgPSBjdHJsLT52YWx1ZTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fVEVNUE9SQUxfRklMVEVSOgorCQlwYXJhbXMtPnZpZGVvX3RlbXBvcmFsX2ZpbHRlciA9IGN0cmwtPnZhbHVlOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19NRURJQU5fRklMVEVSX1RZUEU6CisJCXBhcmFtcy0+dmlkZW9fbWVkaWFuX2ZpbHRlcl90eXBlID0gY3RybC0+dmFsdWU7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX0xVTUFfTUVESUFOX0ZJTFRFUl9UT1A6CisJCXBhcmFtcy0+dmlkZW9fbHVtYV9tZWRpYW5fZmlsdGVyX3RvcCA9IGN0cmwtPnZhbHVlOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19MVU1BX01FRElBTl9GSUxURVJfQk9UVE9NOgorCQlwYXJhbXMtPnZpZGVvX2x1bWFfbWVkaWFuX2ZpbHRlcl9ib3R0b20gPSBjdHJsLT52YWx1ZTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fQ0hST01BX01FRElBTl9GSUxURVJfVE9QOgorCQlwYXJhbXMtPnZpZGVvX2Nocm9tYV9tZWRpYW5fZmlsdGVyX3RvcCA9IGN0cmwtPnZhbHVlOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19DSFJPTUFfTUVESUFOX0ZJTFRFUl9CT1RUT006CisJCXBhcmFtcy0+dmlkZW9fY2hyb21hX21lZGlhbl9maWx0ZXJfYm90dG9tID0gY3RybC0+dmFsdWU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjeDIzNDF4X2N0cmxfcXVlcnlfZmlsbChzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKnFjdHJsLCBzMzIgbWluLCBzMzIgbWF4LCBzMzIgc3RlcCwgczMyIGRlZikKK3sKKwljb25zdCBjaGFyICpuYW1lOworCisJcWN0cmwtPmZsYWdzID0gMDsKKwlzd2l0Y2ggKHFjdHJsLT5pZCkgeworCS8qIE1QRUcgY29udHJvbHMgKi8KKwljYXNlIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19TUEFUSUFMX0ZJTFRFUl9NT0RFOgorCQluYW1lID0gIlNwYXRpYWwgRmlsdGVyIE1vZGUiOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19TUEFUSUFMX0ZJTFRFUjoKKwkJbmFtZSA9ICJTcGF0aWFsIEZpbHRlciI7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX0xVTUFfU1BBVElBTF9GSUxURVJfVFlQRToKKwkJbmFtZSA9ICJTcGF0aWFsIEx1bWEgRmlsdGVyIFR5cGUiOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19DSFJPTUFfU1BBVElBTF9GSUxURVJfVFlQRToKKwkJbmFtZSA9ICJTcGF0aWFsIENocm9tYSBGaWx0ZXIgVHlwZSI7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX1RFTVBPUkFMX0ZJTFRFUl9NT0RFOgorCQluYW1lID0gIlRlbXBvcmFsIEZpbHRlciBNb2RlIjsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fVEVNUE9SQUxfRklMVEVSOgorCQluYW1lID0gIlRlbXBvcmFsIEZpbHRlciI7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX01FRElBTl9GSUxURVJfVFlQRToKKwkJbmFtZSA9ICJNZWRpYW4gRmlsdGVyIFR5cGUiOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19MVU1BX01FRElBTl9GSUxURVJfVE9QOgorCQluYW1lID0gIk1lZGlhbiBMdW1hIEZpbHRlciBNYXhpbXVtIjsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fTFVNQV9NRURJQU5fRklMVEVSX0JPVFRPTToKKwkJbmFtZSA9ICJNZWRpYW4gTHVtYSBGaWx0ZXIgTWluaW11bSI7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX0NIUk9NQV9NRURJQU5fRklMVEVSX1RPUDoKKwkJbmFtZSA9ICJNZWRpYW4gQ2hyb21hIEZpbHRlciBNYXhpbXVtIjsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fQ0hST01BX01FRElBTl9GSUxURVJfQk9UVE9NOgorCQluYW1lID0gIk1lZGlhbiBDaHJvbWEgRmlsdGVyIE1pbmltdW0iOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChxY3RybCwgbWluLCBtYXgsIHN0ZXAsIGRlZik7CisJfQorCXN3aXRjaCAocWN0cmwtPmlkKSB7CisJY2FzZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fU1BBVElBTF9GSUxURVJfTU9ERToKKwljYXNlIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19MVU1BX1NQQVRJQUxfRklMVEVSX1RZUEU6CisJY2FzZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fQ0hST01BX1NQQVRJQUxfRklMVEVSX1RZUEU6CisJY2FzZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fVEVNUE9SQUxfRklMVEVSX01PREU6CisJY2FzZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fTUVESUFOX0ZJTFRFUl9UWVBFOgorCQlxY3RybC0+dHlwZSA9IFY0TDJfQ1RSTF9UWVBFX01FTlU7CisJCW1pbiA9IDA7CisJCXN0ZXAgPSAxOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlxY3RybC0+dHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVI7CisJCWJyZWFrOworCX0KKwlzd2l0Y2ggKHFjdHJsLT5pZCkgeworCWNhc2UgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX1NQQVRJQUxfRklMVEVSX01PREU6CisJY2FzZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fVEVNUE9SQUxfRklMVEVSX01PREU6CisJY2FzZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fTUVESUFOX0ZJTFRFUl9UWVBFOgorCQlxY3RybC0+ZmxhZ3MgfD0gVjRMMl9DVFJMX0ZMQUdfVVBEQVRFOworCQlicmVhazsKKwl9CisJcWN0cmwtPm1pbmltdW0gPSBtaW47CisJcWN0cmwtPm1heGltdW0gPSBtYXg7CisJcWN0cmwtPnN0ZXAgPSBzdGVwOworCXFjdHJsLT5kZWZhdWx0X3ZhbHVlID0gZGVmOworCXFjdHJsLT5yZXNlcnZlZFswXSA9IHFjdHJsLT5yZXNlcnZlZFsxXSA9IDA7CisJc25wcmludGYocWN0cmwtPm5hbWUsIHNpemVvZihxY3RybC0+bmFtZSksIG5hbWUpOworCXJldHVybiAwOworfQorCitpbnQgY3gyMzQxeF9jdHJsX3F1ZXJ5KHN0cnVjdCBjeDIzNDF4X21wZWdfcGFyYW1zICpwYXJhbXMsIHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWN0cmwpCit7CisJaW50IGVycjsKKworCXN3aXRjaCAocWN0cmwtPmlkKSB7CisJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0VOQ09ESU5HOgorCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsCisJCQkJVjRMMl9NUEVHX0FVRElPX0VOQ09ESU5HX0xBWUVSXzIsCisJCQkJVjRMMl9NUEVHX0FVRElPX0VOQ09ESU5HX0xBWUVSXzIsIDEsCisJCQkJVjRMMl9NUEVHX0FVRElPX0VOQ09ESU5HX0xBWUVSXzIpOworCisJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0wyX0JJVFJBVEU6CisJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChxY3RybCwKKwkJCQlWNEwyX01QRUdfQVVESU9fTDJfQklUUkFURV8xOTJLLAorCQkJCVY0TDJfTVBFR19BVURJT19MMl9CSVRSQVRFXzM4NEssIDEsCisJCQkJVjRMMl9NUEVHX0FVRElPX0wyX0JJVFJBVEVfMjI0Syk7CisKKwljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fTDFfQklUUkFURToKKwljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fTDNfQklUUkFURToKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fTU9ERV9FWFRFTlNJT046CisJCWVyciA9IHY0bDJfY3RybF9xdWVyeV9maWxsX3N0ZChxY3RybCk7CisJCWlmIChlcnIgPT0gMCAmJiBwYXJhbXMtPmF1ZGlvX21vZGUgIT0gVjRMMl9NUEVHX0FVRElPX01PREVfSk9JTlRfU1RFUkVPKQorCQkJcWN0cmwtPmZsYWdzIHw9IFY0TDJfQ1RSTF9GTEFHX0lOQUNUSVZFOworCQlyZXR1cm4gZXJyOworCisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0VOQ09ESU5HOgorCQkvKiB0aGlzIHNldHRpbmcgaXMgcmVhZC1vbmx5IGZvciB0aGUgY3gyMzQxeCBzaW5jZSB0aGUKKwkJICAgVjRMMl9DSURfTVBFR19TVFJFQU1fVFlQRSByZWFsbHkgZGV0ZXJtaW5lcyB0aGUKKwkJICAgTVBFRy0xLzIgc2V0dGluZyAqLworCQllcnIgPSB2NGwyX2N0cmxfcXVlcnlfZmlsbF9zdGQocWN0cmwpOworCQlpZiAoZXJyID09IDApCisJCQlxY3RybC0+ZmxhZ3MgfD0gVjRMMl9DVFJMX0ZMQUdfUkVBRF9PTkxZOworCQlyZXR1cm4gZXJyOworCisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0JJVFJBVEVfTU9ERToKKwkJZXJyID0gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGxfc3RkKHFjdHJsKTsKKwkJaWYgKGVyciA9PSAwICYmIHBhcmFtcy0+dmlkZW9fZW5jb2RpbmcgPT0gVjRMMl9NUEVHX1ZJREVPX0VOQ09ESU5HX01QRUdfMSkKKwkJCXFjdHJsLT5mbGFncyB8PSBWNEwyX0NUUkxfRkxBR19JTkFDVElWRTsKKwkJcmV0dXJuIGVycjsKKworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19CSVRSQVRFX1BFQUs6CisJCWVyciA9IHY0bDJfY3RybF9xdWVyeV9maWxsX3N0ZChxY3RybCk7CisJCWlmIChlcnIgPT0gMCAmJiBwYXJhbXMtPnZpZGVvX2JpdHJhdGVfbW9kZSA9PSBWNEwyX01QRUdfVklERU9fQklUUkFURV9NT0RFX0NCUikKKwkJCXFjdHJsLT5mbGFncyB8PSBWNEwyX0NUUkxfRkxBR19JTkFDVElWRTsKKwkJcmV0dXJuIGVycjsKKworCWNhc2UgVjRMMl9DSURfTVBFR19TVFJFQU1fVkJJX0ZNVDoKKwkJaWYgKHBhcmFtcy0+Y2FwYWJpbGl0aWVzICYgQ1gyMzQxWF9DQVBfSEFTX1NMSUNFRF9WQkkpCisJCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGxfc3RkKHFjdHJsKTsKKwkJcmV0dXJuIGN4MjM0MXhfY3RybF9xdWVyeV9maWxsKHFjdHJsLAorCQkJCVY0TDJfTVBFR19TVFJFQU1fVkJJX0ZNVF9OT05FLAorCQkJCVY0TDJfTVBFR19TVFJFQU1fVkJJX0ZNVF9OT05FLCAxLAorCQkJCVY0TDJfTVBFR19TVFJFQU1fVkJJX0ZNVF9OT05FKTsKKworCS8qIENYMjM0MTUvNiBzcGVjaWZpYyAqLworCWNhc2UgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX1NQQVRJQUxfRklMVEVSX01PREU6CisJCXJldHVybiBjeDIzNDF4X2N0cmxfcXVlcnlfZmlsbChxY3RybCwKKwkJCQlWNEwyX01QRUdfQ1gyMzQxWF9WSURFT19TUEFUSUFMX0ZJTFRFUl9NT0RFX01BTlVBTCwKKwkJCQlWNEwyX01QRUdfQ1gyMzQxWF9WSURFT19TUEFUSUFMX0ZJTFRFUl9NT0RFX0FVVE8sIDEsCisJCQkJVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fU1BBVElBTF9GSUxURVJfTU9ERV9NQU5VQUwpOworCisJY2FzZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fU1BBVElBTF9GSUxURVI6CisJCWN4MjM0MXhfY3RybF9xdWVyeV9maWxsKHFjdHJsLCAwLCAxNSwgMSwgMCk7CisJCXFjdHJsLT5mbGFncyB8PSBWNEwyX0NUUkxfRkxBR19TTElERVI7CisJCWlmIChwYXJhbXMtPnZpZGVvX3NwYXRpYWxfZmlsdGVyX21vZGUgPT0gVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fU1BBVElBTF9GSUxURVJfTU9ERV9BVVRPKQorCQkgICAgICAgcWN0cmwtPmZsYWdzIHw9IFY0TDJfQ1RSTF9GTEFHX0lOQUNUSVZFOworCQlyZXR1cm4gMDsKKworCWNhc2UgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX0xVTUFfU1BBVElBTF9GSUxURVJfVFlQRToKKwkJY3gyMzQxeF9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsCisJCQkJVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fTFVNQV9TUEFUSUFMX0ZJTFRFUl9UWVBFX09GRiwKKwkJCQlWNEwyX01QRUdfQ1gyMzQxWF9WSURFT19MVU1BX1NQQVRJQUxfRklMVEVSX1RZUEVfMkRfU1lNX05PTl9TRVBBUkFCTEUsIDEsCisJCQkJVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fTFVNQV9TUEFUSUFMX0ZJTFRFUl9UWVBFX09GRik7CisJCWlmIChwYXJhbXMtPnZpZGVvX3NwYXRpYWxfZmlsdGVyX21vZGUgPT0gVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fU1BBVElBTF9GSUxURVJfTU9ERV9BVVRPKQorCQkgICAgICAgcWN0cmwtPmZsYWdzIHw9IFY0TDJfQ1RSTF9GTEFHX0lOQUNUSVZFOworCQlyZXR1cm4gMDsKKworCWNhc2UgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX0NIUk9NQV9TUEFUSUFMX0ZJTFRFUl9UWVBFOgorCQljeDIzNDF4X2N0cmxfcXVlcnlfZmlsbChxY3RybCwKKwkJCQlWNEwyX01QRUdfQ1gyMzQxWF9WSURFT19DSFJPTUFfU1BBVElBTF9GSUxURVJfVFlQRV9PRkYsCisJCQkJVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fQ0hST01BX1NQQVRJQUxfRklMVEVSX1RZUEVfMURfSE9SLCAxLAorCQkJCVY0TDJfTVBFR19DWDIzNDFYX1ZJREVPX0NIUk9NQV9TUEFUSUFMX0ZJTFRFUl9UWVBFX09GRik7CisJCWlmIChwYXJhbXMtPnZpZGVvX3NwYXRpYWxfZmlsdGVyX21vZGUgPT0gVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fU1BBVElBTF9GSUxURVJfTU9ERV9BVVRPKQorCQkgICAgICAgcWN0cmwtPmZsYWdzIHw9IFY0TDJfQ1RSTF9GTEFHX0lOQUNUSVZFOworCQlyZXR1cm4gMDsKKworCWNhc2UgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX1RFTVBPUkFMX0ZJTFRFUl9NT0RFOgorCQlyZXR1cm4gY3gyMzQxeF9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsCisJCQkJVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fVEVNUE9SQUxfRklMVEVSX01PREVfTUFOVUFMLAorCQkJCVY0TDJfTVBFR19DWDIzNDFYX1ZJREVPX1RFTVBPUkFMX0ZJTFRFUl9NT0RFX0FVVE8sIDEsCisJCQkJVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fVEVNUE9SQUxfRklMVEVSX01PREVfTUFOVUFMKTsKKworCWNhc2UgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX1RFTVBPUkFMX0ZJTFRFUjoKKwkJY3gyMzQxeF9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsIDAsIDMxLCAxLCAwKTsKKwkJcWN0cmwtPmZsYWdzIHw9IFY0TDJfQ1RSTF9GTEFHX1NMSURFUjsKKwkJaWYgKHBhcmFtcy0+dmlkZW9fdGVtcG9yYWxfZmlsdGVyX21vZGUgPT0gVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fVEVNUE9SQUxfRklMVEVSX01PREVfQVVUTykKKwkJICAgICAgIHFjdHJsLT5mbGFncyB8PSBWNEwyX0NUUkxfRkxBR19JTkFDVElWRTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19NRURJQU5fRklMVEVSX1RZUEU6CisJCXJldHVybiBjeDIzNDF4X2N0cmxfcXVlcnlfZmlsbChxY3RybCwKKwkJCQlWNEwyX01QRUdfQ1gyMzQxWF9WSURFT19NRURJQU5fRklMVEVSX1RZUEVfT0ZGLAorCQkJCVY0TDJfTVBFR19DWDIzNDFYX1ZJREVPX01FRElBTl9GSUxURVJfVFlQRV9ESUFHLCAxLAorCQkJCVY0TDJfTVBFR19DWDIzNDFYX1ZJREVPX01FRElBTl9GSUxURVJfVFlQRV9PRkYpOworCisJY2FzZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fTFVNQV9NRURJQU5fRklMVEVSX1RPUDoKKwkJY3gyMzQxeF9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsIDAsIDI1NSwgMSwgMjU1KTsKKwkJcWN0cmwtPmZsYWdzIHw9IFY0TDJfQ1RSTF9GTEFHX1NMSURFUjsKKwkJaWYgKHBhcmFtcy0+dmlkZW9fbWVkaWFuX2ZpbHRlcl90eXBlID09IFY0TDJfTVBFR19DWDIzNDFYX1ZJREVPX01FRElBTl9GSUxURVJfVFlQRV9PRkYpCisJCSAgICAgICBxY3RybC0+ZmxhZ3MgfD0gVjRMMl9DVFJMX0ZMQUdfSU5BQ1RJVkU7CisJCXJldHVybiAwOworCisJY2FzZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fTFVNQV9NRURJQU5fRklMVEVSX0JPVFRPTToKKwkJY3gyMzQxeF9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsIDAsIDI1NSwgMSwgMCk7CisJCXFjdHJsLT5mbGFncyB8PSBWNEwyX0NUUkxfRkxBR19TTElERVI7CisJCWlmIChwYXJhbXMtPnZpZGVvX21lZGlhbl9maWx0ZXJfdHlwZSA9PSBWNEwyX01QRUdfQ1gyMzQxWF9WSURFT19NRURJQU5fRklMVEVSX1RZUEVfT0ZGKQorCQkgICAgICAgcWN0cmwtPmZsYWdzIHw9IFY0TDJfQ1RSTF9GTEFHX0lOQUNUSVZFOworCQlyZXR1cm4gMDsKKworCWNhc2UgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX0NIUk9NQV9NRURJQU5fRklMVEVSX1RPUDoKKwkJY3gyMzQxeF9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsIDAsIDI1NSwgMSwgMjU1KTsKKwkJcWN0cmwtPmZsYWdzIHw9IFY0TDJfQ1RSTF9GTEFHX1NMSURFUjsKKwkJaWYgKHBhcmFtcy0+dmlkZW9fbWVkaWFuX2ZpbHRlcl90eXBlID09IFY0TDJfTVBFR19DWDIzNDFYX1ZJREVPX01FRElBTl9GSUxURVJfVFlQRV9PRkYpCisJCSAgICAgICBxY3RybC0+ZmxhZ3MgfD0gVjRMMl9DVFJMX0ZMQUdfSU5BQ1RJVkU7CisJCXJldHVybiAwOworCisJY2FzZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fQ0hST01BX01FRElBTl9GSUxURVJfQk9UVE9NOgorCQljeDIzNDF4X2N0cmxfcXVlcnlfZmlsbChxY3RybCwgMCwgMjU1LCAxLCAwKTsKKwkJcWN0cmwtPmZsYWdzIHw9IFY0TDJfQ1RSTF9GTEFHX1NMSURFUjsKKwkJaWYgKHBhcmFtcy0+dmlkZW9fbWVkaWFuX2ZpbHRlcl90eXBlID09IFY0TDJfTVBFR19DWDIzNDFYX1ZJREVPX01FRElBTl9GSUxURVJfVFlQRV9PRkYpCisJCSAgICAgICBxY3RybC0+ZmxhZ3MgfD0gVjRMMl9DVFJMX0ZMQUdfSU5BQ1RJVkU7CisJCXJldHVybiAwOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsX3N0ZChxY3RybCk7CisKKwl9Cit9CisKK2NvbnN0IGNoYXIgKipjeDIzNDF4X2N0cmxfZ2V0X21lbnUodTMyIGlkKQoreworCXN0YXRpYyBjb25zdCBjaGFyICptcGVnX3N0cmVhbV90eXBlW10gPSB7CisJCSJNUEVHLTIgUHJvZ3JhbSBTdHJlYW0iLAorCQkiIiwKKwkJIk1QRUctMSBTeXN0ZW0gU3RyZWFtIiwKKwkJIk1QRUctMiBEVkQtY29tcGF0aWJsZSBTdHJlYW0iLAorCQkiTVBFRy0xIFZDRC1jb21wYXRpYmxlIFN0cmVhbSIsCisJCSJNUEVHLTIgU1ZDRC1jb21wYXRpYmxlIFN0cmVhbSIsCisJCU5VTEwKKwl9OworCisJc3RhdGljIGNvbnN0IGNoYXIgKmN4MjM0MXhfdmlkZW9fc3BhdGlhbF9maWx0ZXJfbW9kZV9tZW51W10gPSB7CisJCSJNYW51YWwiLAorCQkiQXV0byIsCisJCU5VTEwKKwl9OworCisJc3RhdGljIGNvbnN0IGNoYXIgKmN4MjM0MXhfdmlkZW9fbHVtYV9zcGF0aWFsX2ZpbHRlcl90eXBlX21lbnVbXSA9IHsKKwkJIk9mZiIsCisJCSIxRCBIb3Jpem9udGFsIiwKKwkJIjFEIFZlcnRpY2FsIiwKKwkJIjJEIEgvViBTZXBhcmFibGUiLAorCQkiMkQgU3ltbWV0cmljIG5vbi1zZXBhcmFibGUiLAorCQlOVUxMCisJfTsKKworCXN0YXRpYyBjb25zdCBjaGFyICpjeDIzNDF4X3ZpZGVvX2Nocm9tYV9zcGF0aWFsX2ZpbHRlcl90eXBlX21lbnVbXSA9IHsKKwkJIk9mZiIsCisJCSIxRCBIb3Jpem9udGFsIiwKKwkJTlVMTAorCX07CisKKwlzdGF0aWMgY29uc3QgY2hhciAqY3gyMzQxeF92aWRlb190ZW1wb3JhbF9maWx0ZXJfbW9kZV9tZW51W10gPSB7CisJCSJNYW51YWwiLAorCQkiQXV0byIsCisJCU5VTEwKKwl9OworCisJc3RhdGljIGNvbnN0IGNoYXIgKmN4MjM0MXhfdmlkZW9fbWVkaWFuX2ZpbHRlcl90eXBlX21lbnVbXSA9IHsKKwkJIk9mZiIsCisJCSJIb3Jpem9udGFsIiwKKwkJIlZlcnRpY2FsIiwKKwkJIkhvcml6b250YWwvVmVydGljYWwiLAorCQkiRGlhZ29uYWwiLAorCQlOVUxMCisJfTsKKworCXN3aXRjaCAoaWQpIHsKKwljYXNlIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1RZUEU6CisJCXJldHVybiBtcGVnX3N0cmVhbV90eXBlOworCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19MMV9CSVRSQVRFOgorCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19MM19CSVRSQVRFOgorCQlyZXR1cm4gTlVMTDsKKwljYXNlIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19TUEFUSUFMX0ZJTFRFUl9NT0RFOgorCQlyZXR1cm4gY3gyMzQxeF92aWRlb19zcGF0aWFsX2ZpbHRlcl9tb2RlX21lbnU7CisJY2FzZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fTFVNQV9TUEFUSUFMX0ZJTFRFUl9UWVBFOgorCQlyZXR1cm4gY3gyMzQxeF92aWRlb19sdW1hX3NwYXRpYWxfZmlsdGVyX3R5cGVfbWVudTsKKwljYXNlIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19DSFJPTUFfU1BBVElBTF9GSUxURVJfVFlQRToKKwkJcmV0dXJuIGN4MjM0MXhfdmlkZW9fY2hyb21hX3NwYXRpYWxfZmlsdGVyX3R5cGVfbWVudTsKKwljYXNlIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19URU1QT1JBTF9GSUxURVJfTU9ERToKKwkJcmV0dXJuIGN4MjM0MXhfdmlkZW9fdGVtcG9yYWxfZmlsdGVyX21vZGVfbWVudTsKKwljYXNlIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19NRURJQU5fRklMVEVSX1RZUEU6CisJCXJldHVybiBjeDIzNDF4X3ZpZGVvX21lZGlhbl9maWx0ZXJfdHlwZV9tZW51OworCWRlZmF1bHQ6CisJCXJldHVybiB2NGwyX2N0cmxfZ2V0X21lbnUoaWQpOworCX0KK30KKworc3RhdGljIHZvaWQgY3gyMzQxeF9jYWxjX2F1ZGlvX3Byb3BlcnRpZXMoc3RydWN0IGN4MjM0MXhfbXBlZ19wYXJhbXMgKnBhcmFtcykKK3sKKwlwYXJhbXMtPmF1ZGlvX3Byb3BlcnRpZXMgPSAocGFyYW1zLT5hdWRpb19zYW1wbGluZ19mcmVxIDw8IDApIHwKKwkJKCgzIC0gcGFyYW1zLT5hdWRpb19lbmNvZGluZykgPDwgMikgfAorCQkoKDEgKyBwYXJhbXMtPmF1ZGlvX2wyX2JpdHJhdGUpIDw8IDQpIHwKKwkJKHBhcmFtcy0+YXVkaW9fbW9kZSA8PCA4KSB8CisJCShwYXJhbXMtPmF1ZGlvX21vZGVfZXh0ZW5zaW9uIDw8IDEwKSB8CisJCSgoKHBhcmFtcy0+YXVkaW9fZW1waGFzaXMgPT0gVjRMMl9NUEVHX0FVRElPX0VNUEhBU0lTX0NDSVRUX0oxNykgPworCQkgIDMgOgorCQkgIHBhcmFtcy0+YXVkaW9fZW1waGFzaXMpIDw8IDEyKSB8CisJCShwYXJhbXMtPmF1ZGlvX2NyYyA8PCAxNCk7Cit9CisKK2ludCBjeDIzNDF4X2V4dF9jdHJscyhzdHJ1Y3QgY3gyMzQxeF9tcGVnX3BhcmFtcyAqcGFyYW1zLAorCQkgIHN0cnVjdCB2NGwyX2V4dF9jb250cm9scyAqY3RybHMsIGludCBjbWQpCit7CisJaW50IGVyciA9IDA7CisJaW50IGk7CisKKwlpZiAoY21kID09IFZJRElPQ19HX0VYVF9DVFJMUykgeworCQlmb3IgKGkgPSAwOyBpIDwgY3RybHMtPmNvdW50OyBpKyspIHsKKwkJCXN0cnVjdCB2NGwyX2V4dF9jb250cm9sICpjdHJsID0gY3RybHMtPmNvbnRyb2xzICsgaTsKKworCQkJZXJyID0gY3gyMzQxeF9nZXRfY3RybChwYXJhbXMsIGN0cmwpOworCQkJaWYgKGVycikgeworCQkJCWN0cmxzLT5lcnJvcl9pZHggPSBpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXJldHVybiBlcnI7CisJfQorCWZvciAoaSA9IDA7IGkgPCBjdHJscy0+Y291bnQ7IGkrKykgeworCQlzdHJ1Y3QgdjRsMl9leHRfY29udHJvbCAqY3RybCA9IGN0cmxzLT5jb250cm9scyArIGk7CisJCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCBxY3RybDsKKwkJY29uc3QgY2hhciAqKm1lbnVfaXRlbXMgPSBOVUxMOworCisJCXFjdHJsLmlkID0gY3RybC0+aWQ7CisJCWVyciA9IGN4MjM0MXhfY3RybF9xdWVyeShwYXJhbXMsICZxY3RybCk7CisJCWlmIChlcnIpCisJCQlicmVhazsKKwkJaWYgKHFjdHJsLnR5cGUgPT0gVjRMMl9DVFJMX1RZUEVfTUVOVSkKKwkJCW1lbnVfaXRlbXMgPSBjeDIzNDF4X2N0cmxfZ2V0X21lbnUocWN0cmwuaWQpOworCQllcnIgPSB2NGwyX2N0cmxfY2hlY2soY3RybCwgJnFjdHJsLCBtZW51X2l0ZW1zKTsKKwkJaWYgKGVycikKKwkJCWJyZWFrOworCQllcnIgPSBjeDIzNDF4X3NldF9jdHJsKHBhcmFtcywgY3RybCk7CisJCWlmIChlcnIpCisJCQlicmVhazsKKwl9CisJaWYgKGVyciA9PSAwICYmIHBhcmFtcy0+dmlkZW9fYml0cmF0ZV9tb2RlID09IFY0TDJfTVBFR19WSURFT19CSVRSQVRFX01PREVfVkJSICYmCisJCQlwYXJhbXMtPnZpZGVvX2JpdHJhdGVfcGVhayA8IHBhcmFtcy0+dmlkZW9fYml0cmF0ZSkgeworCQllcnIgPSAtRVJBTkdFOworCQljdHJscy0+ZXJyb3JfaWR4ID0gY3RybHMtPmNvdW50OworCX0KKwlpZiAoZXJyKSB7CisJCWN0cmxzLT5lcnJvcl9pZHggPSBpOworCX0KKwllbHNlIHsKKwkJY3gyMzQxeF9jYWxjX2F1ZGlvX3Byb3BlcnRpZXMocGFyYW1zKTsKKwl9CisJcmV0dXJuIGVycjsKK30KKwordm9pZCBjeDIzNDF4X2ZpbGxfZGVmYXVsdHMoc3RydWN0IGN4MjM0MXhfbXBlZ19wYXJhbXMgKnApCit7CisJc3RhdGljIHN0cnVjdCBjeDIzNDF4X21wZWdfcGFyYW1zIGRlZmF1bHRfcGFyYW1zID0geworCS8qIG1pc2MgKi8KKwkuY2FwYWJpbGl0aWVzID0gMCwKKwkucG9ydCA9IENYMjM0MVhfUE9SVF9NRU1PUlksCisJLndpZHRoID0gNzIwLAorCS5oZWlnaHQgPSA0ODAsCisJLmlzXzUwaHogPSAwLAorCisJLyogc3RyZWFtICovCisJLnN0cmVhbV90eXBlID0gVjRMMl9NUEVHX1NUUkVBTV9UWVBFX01QRUcyX1BTLAorCS5zdHJlYW1fdmJpX2ZtdCA9IFY0TDJfTVBFR19TVFJFQU1fVkJJX0ZNVF9OT05FLAorCisJLyogYXVkaW8gKi8KKwkuYXVkaW9fc2FtcGxpbmdfZnJlcSA9IFY0TDJfTVBFR19BVURJT19TQU1QTElOR19GUkVRXzQ4MDAwLAorCS5hdWRpb19lbmNvZGluZyA9IFY0TDJfTVBFR19BVURJT19FTkNPRElOR19MQVlFUl8yLAorCS5hdWRpb19sMl9iaXRyYXRlID0gVjRMMl9NUEVHX0FVRElPX0wyX0JJVFJBVEVfMjI0SywKKwkuYXVkaW9fbW9kZSA9IFY0TDJfTVBFR19BVURJT19NT0RFX1NURVJFTywKKwkuYXVkaW9fbW9kZV9leHRlbnNpb24gPSBWNEwyX01QRUdfQVVESU9fTU9ERV9FWFRFTlNJT05fQk9VTkRfNCwKKwkuYXVkaW9fZW1waGFzaXMgPSBWNEwyX01QRUdfQVVESU9fRU1QSEFTSVNfTk9ORSwKKwkuYXVkaW9fY3JjID0gVjRMMl9NUEVHX0FVRElPX0NSQ19OT05FLAorCisJLyogdmlkZW8gKi8KKwkudmlkZW9fZW5jb2RpbmcgPSBWNEwyX01QRUdfVklERU9fRU5DT0RJTkdfTVBFR18yLAorCS52aWRlb19hc3BlY3QgPSBWNEwyX01QRUdfVklERU9fQVNQRUNUXzR4MywKKwkudmlkZW9fYl9mcmFtZXMgPSAyLAorCS52aWRlb19nb3Bfc2l6ZSA9IDEyLAorCS52aWRlb19nb3BfY2xvc3VyZSA9IDEsCisJLnZpZGVvX3B1bGxkb3duID0gMCwKKwkudmlkZW9fYml0cmF0ZV9tb2RlID0gVjRMMl9NUEVHX1ZJREVPX0JJVFJBVEVfTU9ERV9WQlIsCisJLnZpZGVvX2JpdHJhdGUgPSA2MDAwMDAwLAorCS52aWRlb19iaXRyYXRlX3BlYWsgPSA4MDAwMDAwLAorCS52aWRlb190ZW1wb3JhbF9kZWNpbWF0aW9uID0gMCwKKworCS8qIGVuY29kaW5nIGZpbHRlcnMgKi8KKwkudmlkZW9fc3BhdGlhbF9maWx0ZXJfbW9kZSA9IFY0TDJfTVBFR19DWDIzNDFYX1ZJREVPX1NQQVRJQUxfRklMVEVSX01PREVfTUFOVUFMLAorCS52aWRlb19zcGF0aWFsX2ZpbHRlciA9IDAsCisJLnZpZGVvX2x1bWFfc3BhdGlhbF9maWx0ZXJfdHlwZSA9IFY0TDJfTVBFR19DWDIzNDFYX1ZJREVPX0xVTUFfU1BBVElBTF9GSUxURVJfVFlQRV8xRF9IT1IsCisJLnZpZGVvX2Nocm9tYV9zcGF0aWFsX2ZpbHRlcl90eXBlID0gVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fQ0hST01BX1NQQVRJQUxfRklMVEVSX1RZUEVfMURfSE9SLAorCS52aWRlb190ZW1wb3JhbF9maWx0ZXJfbW9kZSA9IFY0TDJfTVBFR19DWDIzNDFYX1ZJREVPX1RFTVBPUkFMX0ZJTFRFUl9NT0RFX01BTlVBTCwKKwkudmlkZW9fdGVtcG9yYWxfZmlsdGVyID0gMCwKKwkudmlkZW9fbWVkaWFuX2ZpbHRlcl90eXBlID0gVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fTUVESUFOX0ZJTFRFUl9UWVBFX09GRiwKKwkudmlkZW9fbHVtYV9tZWRpYW5fZmlsdGVyX3RvcCA9IDI1NSwKKwkudmlkZW9fbHVtYV9tZWRpYW5fZmlsdGVyX2JvdHRvbSA9IDAsCisJLnZpZGVvX2Nocm9tYV9tZWRpYW5fZmlsdGVyX3RvcCA9IDI1NSwKKwkudmlkZW9fY2hyb21hX21lZGlhbl9maWx0ZXJfYm90dG9tID0gMCwKKwl9OworCisJKnAgPSBkZWZhdWx0X3BhcmFtczsKKwljeDIzNDF4X2NhbGNfYXVkaW9fcHJvcGVydGllcyhwKTsKK30KKworc3RhdGljIGludCBjeDIzNDF4X2FwaSh2b2lkICpwcml2LCBjeDIzNDF4X21ib3hfZnVuYyBmdW5jLCBpbnQgY21kLCBpbnQgYXJncywgLi4uKQoreworCXUzMiBkYXRhW0NYMjM0MVhfTUJPWF9NQVhfREFUQV07CisJdmFfbGlzdCB2YXJnczsKKwlpbnQgaTsKKworCXZhX3N0YXJ0KHZhcmdzLCBhcmdzKTsKKworCWZvciAoaSA9IDA7IGkgPCBhcmdzOyBpKyspIHsKKwkJZGF0YVtpXSA9IHZhX2FyZyh2YXJncywgaW50KTsKKwl9CisJdmFfZW5kKHZhcmdzKTsKKwlyZXR1cm4gZnVuYyhwcml2LCBjbWQsIGFyZ3MsIDAsIGRhdGEpOworfQorCitpbnQgY3gyMzQxeF91cGRhdGUodm9pZCAqcHJpdiwgY3gyMzQxeF9tYm94X2Z1bmMgZnVuYywKKwkJY29uc3Qgc3RydWN0IGN4MjM0MXhfbXBlZ19wYXJhbXMgKm9sZCwgY29uc3Qgc3RydWN0IGN4MjM0MXhfbXBlZ19wYXJhbXMgKm5ldykKK3sKKwlzdGF0aWMgaW50IG1wZWdfc3RyZWFtX3R5cGVbXSA9IHsKKwkJMCwJLyogTVBFRy0yIFBTICovCisJCTEsCS8qIE1QRUctMiBUUyAqLworCQkyLAkvKiBNUEVHLTEgU1MgKi8KKwkJMTQsCS8qIERWRCAqLworCQkxMSwJLyogVkNEICovCisJCTEyLAkvKiBTVkNEICovCisJfTsKKworCWludCBlcnIgPSAwOworCisJY3gyMzQxeF9hcGkocHJpdiwgZnVuYywgQ1gyMzQxWF9FTkNfU0VUX09VVFBVVF9QT1JULCAyLCBuZXctPnBvcnQsIDApOworCisJaWYgKG9sZCA9PSBOVUxMIHx8IG9sZC0+aXNfNTBoeiAhPSBuZXctPmlzXzUwaHopIHsKKwkJZXJyID0gY3gyMzQxeF9hcGkocHJpdiwgZnVuYywgQ1gyMzQxWF9FTkNfU0VUX0ZSQU1FX1JBVEUsIDEsIG5ldy0+aXNfNTBoeik7CisJCWlmIChlcnIpIHJldHVybiBlcnI7CisJfQorCisJaWYgKG9sZCA9PSBOVUxMIHx8IG9sZC0+d2lkdGggIT0gbmV3LT53aWR0aCB8fCBvbGQtPmhlaWdodCAhPSBuZXctPmhlaWdodCB8fAorCQkJb2xkLT52aWRlb19lbmNvZGluZyAhPSBuZXctPnZpZGVvX2VuY29kaW5nKSB7CisJCXUxNiB3ID0gbmV3LT53aWR0aDsKKwkJdTE2IGggPSBuZXctPmhlaWdodDsKKworCQlpZiAobmV3LT52aWRlb19lbmNvZGluZyA9PSBWNEwyX01QRUdfVklERU9fRU5DT0RJTkdfTVBFR18xKSB7CisJCQl3IC89IDI7CisJCQloIC89IDI7CisJCX0KKwkJZXJyID0gY3gyMzQxeF9hcGkocHJpdiwgZnVuYywgQ1gyMzQxWF9FTkNfU0VUX0ZSQU1FX1NJWkUsIDIsIGgsIHcpOworCQlpZiAoZXJyKSByZXR1cm4gZXJyOworCX0KKworCWlmIChvbGQgPT0gTlVMTCB8fCBvbGQtPnN0cmVhbV90eXBlICE9IG5ldy0+c3RyZWFtX3R5cGUpIHsKKwkJZXJyID0gY3gyMzQxeF9hcGkocHJpdiwgZnVuYywgQ1gyMzQxWF9FTkNfU0VUX1NUUkVBTV9UWVBFLCAxLCBtcGVnX3N0cmVhbV90eXBlW25ldy0+c3RyZWFtX3R5cGVdKTsKKwkJaWYgKGVycikgcmV0dXJuIGVycjsKKwl9CisJaWYgKG9sZCA9PSBOVUxMIHx8IG9sZC0+dmlkZW9fYXNwZWN0ICE9IG5ldy0+dmlkZW9fYXNwZWN0KSB7CisJCWVyciA9IGN4MjM0MXhfYXBpKHByaXYsIGZ1bmMsIENYMjM0MVhfRU5DX1NFVF9BU1BFQ1RfUkFUSU8sIDEsIDEgKyBuZXctPnZpZGVvX2FzcGVjdCk7CisJCWlmIChlcnIpIHJldHVybiBlcnI7CisJfQorCWlmIChvbGQgPT0gTlVMTCB8fCBvbGQtPnZpZGVvX2JfZnJhbWVzICE9IG5ldy0+dmlkZW9fYl9mcmFtZXMgfHwKKwkJb2xkLT52aWRlb19nb3Bfc2l6ZSAhPSBuZXctPnZpZGVvX2dvcF9zaXplKSB7CisJCWVyciA9IGN4MjM0MXhfYXBpKHByaXYsIGZ1bmMsIENYMjM0MVhfRU5DX1NFVF9HT1BfUFJPUEVSVElFUywgMiwKKwkJCQluZXctPnZpZGVvX2dvcF9zaXplLCBuZXctPnZpZGVvX2JfZnJhbWVzICsgMSk7CisJCWlmIChlcnIpIHJldHVybiBlcnI7CisJfQorCWlmIChvbGQgPT0gTlVMTCB8fCBvbGQtPnZpZGVvX2dvcF9jbG9zdXJlICE9IG5ldy0+dmlkZW9fZ29wX2Nsb3N1cmUpIHsKKwkJZXJyID0gY3gyMzQxeF9hcGkocHJpdiwgZnVuYywgQ1gyMzQxWF9FTkNfU0VUX0dPUF9DTE9TVVJFLCAxLCBuZXctPnZpZGVvX2dvcF9jbG9zdXJlKTsKKwkJaWYgKGVycikgcmV0dXJuIGVycjsKKwl9CisJaWYgKG9sZCA9PSBOVUxMIHx8IG9sZC0+dmlkZW9fcHVsbGRvd24gIT0gbmV3LT52aWRlb19wdWxsZG93bikgeworCQllcnIgPSBjeDIzNDF4X2FwaShwcml2LCBmdW5jLCBDWDIzNDFYX0VOQ19TRVRfM18yX1BVTExET1dOLCAxLCBuZXctPnZpZGVvX3B1bGxkb3duKTsKKwkJaWYgKGVycikgcmV0dXJuIGVycjsKKwl9CisJaWYgKG9sZCA9PSBOVUxMIHx8IG9sZC0+YXVkaW9fcHJvcGVydGllcyAhPSBuZXctPmF1ZGlvX3Byb3BlcnRpZXMpIHsKKwkJZXJyID0gY3gyMzQxeF9hcGkocHJpdiwgZnVuYywgQ1gyMzQxWF9FTkNfU0VUX0FVRElPX1BST1BFUlRJRVMsIDEsIG5ldy0+YXVkaW9fcHJvcGVydGllcyk7CisJCWlmIChlcnIpIHJldHVybiBlcnI7CisJfQorCWlmIChvbGQgPT0gTlVMTCB8fCBvbGQtPnZpZGVvX2JpdHJhdGVfbW9kZSAhPSBuZXctPnZpZGVvX2JpdHJhdGVfbW9kZSB8fAorCQlvbGQtPnZpZGVvX2JpdHJhdGUgIT0gbmV3LT52aWRlb19iaXRyYXRlIHx8CisJCW9sZC0+dmlkZW9fYml0cmF0ZV9wZWFrICE9IG5ldy0+dmlkZW9fYml0cmF0ZV9wZWFrKSB7CisJCWVyciA9IGN4MjM0MXhfYXBpKHByaXYsIGZ1bmMsIENYMjM0MVhfRU5DX1NFVF9CSVRfUkFURSwgNSwKKwkJCQluZXctPnZpZGVvX2JpdHJhdGVfbW9kZSwgbmV3LT52aWRlb19iaXRyYXRlLAorCQkJCW5ldy0+dmlkZW9fYml0cmF0ZV9wZWFrIC8gNDAwLCAwLCAwKTsKKwkJaWYgKGVycikgcmV0dXJuIGVycjsKKwl9CisJaWYgKG9sZCA9PSBOVUxMIHx8IG9sZC0+dmlkZW9fc3BhdGlhbF9maWx0ZXJfbW9kZSAhPSBuZXctPnZpZGVvX3NwYXRpYWxfZmlsdGVyX21vZGUgfHwKKwkJb2xkLT52aWRlb190ZW1wb3JhbF9maWx0ZXJfbW9kZSAhPSBuZXctPnZpZGVvX3RlbXBvcmFsX2ZpbHRlcl9tb2RlIHx8CisJCW9sZC0+dmlkZW9fbWVkaWFuX2ZpbHRlcl90eXBlICE9IG5ldy0+dmlkZW9fbWVkaWFuX2ZpbHRlcl90eXBlKSB7CisJCWVyciA9IGN4MjM0MXhfYXBpKHByaXYsIGZ1bmMsIENYMjM0MVhfRU5DX1NFVF9ETlJfRklMVEVSX01PREUsIDIsCisJCQkJbmV3LT52aWRlb19zcGF0aWFsX2ZpbHRlcl9tb2RlIHwgKG5ldy0+dmlkZW9fdGVtcG9yYWxfZmlsdGVyX21vZGUgPDwgMSksCisJCQkJbmV3LT52aWRlb19tZWRpYW5fZmlsdGVyX3R5cGUpOworCQlpZiAoZXJyKSByZXR1cm4gZXJyOworCX0KKwlpZiAob2xkID09IE5VTEwgfHwKKwkJb2xkLT52aWRlb19sdW1hX21lZGlhbl9maWx0ZXJfYm90dG9tICE9IG5ldy0+dmlkZW9fbHVtYV9tZWRpYW5fZmlsdGVyX2JvdHRvbSB8fAorCQlvbGQtPnZpZGVvX2x1bWFfbWVkaWFuX2ZpbHRlcl90b3AgIT0gbmV3LT52aWRlb19sdW1hX21lZGlhbl9maWx0ZXJfdG9wIHx8CisJCW9sZC0+dmlkZW9fY2hyb21hX21lZGlhbl9maWx0ZXJfYm90dG9tICE9IG5ldy0+dmlkZW9fY2hyb21hX21lZGlhbl9maWx0ZXJfYm90dG9tIHx8CisJCW9sZC0+dmlkZW9fY2hyb21hX21lZGlhbl9maWx0ZXJfdG9wICE9IG5ldy0+dmlkZW9fY2hyb21hX21lZGlhbl9maWx0ZXJfdG9wKSB7CisJCWVyciA9IGN4MjM0MXhfYXBpKHByaXYsIGZ1bmMsIENYMjM0MVhfRU5DX1NFVF9DT1JJTkdfTEVWRUxTLCA0LAorCQkJCW5ldy0+dmlkZW9fbHVtYV9tZWRpYW5fZmlsdGVyX2JvdHRvbSwKKwkJCQluZXctPnZpZGVvX2x1bWFfbWVkaWFuX2ZpbHRlcl90b3AsCisJCQkJbmV3LT52aWRlb19jaHJvbWFfbWVkaWFuX2ZpbHRlcl9ib3R0b20sCisJCQkJbmV3LT52aWRlb19jaHJvbWFfbWVkaWFuX2ZpbHRlcl90b3ApOworCQlpZiAoZXJyKSByZXR1cm4gZXJyOworCX0KKwlpZiAob2xkID09IE5VTEwgfHwKKwkJb2xkLT52aWRlb19sdW1hX3NwYXRpYWxfZmlsdGVyX3R5cGUgIT0gbmV3LT52aWRlb19sdW1hX3NwYXRpYWxfZmlsdGVyX3R5cGUgfHwKKwkJb2xkLT52aWRlb19jaHJvbWFfc3BhdGlhbF9maWx0ZXJfdHlwZSAhPSBuZXctPnZpZGVvX2Nocm9tYV9zcGF0aWFsX2ZpbHRlcl90eXBlKSB7CisJCWVyciA9IGN4MjM0MXhfYXBpKHByaXYsIGZ1bmMsIENYMjM0MVhfRU5DX1NFVF9TUEFUSUFMX0ZJTFRFUl9UWVBFLCAyLAorCQkJbmV3LT52aWRlb19sdW1hX3NwYXRpYWxfZmlsdGVyX3R5cGUsIG5ldy0+dmlkZW9fY2hyb21hX3NwYXRpYWxfZmlsdGVyX3R5cGUpOworCQlpZiAoZXJyKSByZXR1cm4gZXJyOworCX0KKwlpZiAob2xkID09IE5VTEwgfHwKKwkJb2xkLT52aWRlb19zcGF0aWFsX2ZpbHRlciAhPSBuZXctPnZpZGVvX3NwYXRpYWxfZmlsdGVyIHx8CisJCW9sZC0+dmlkZW9fdGVtcG9yYWxfZmlsdGVyICE9IG5ldy0+dmlkZW9fdGVtcG9yYWxfZmlsdGVyKSB7CisJCWVyciA9IGN4MjM0MXhfYXBpKHByaXYsIGZ1bmMsIENYMjM0MVhfRU5DX1NFVF9ETlJfRklMVEVSX1BST1BTLCAyLAorCQkJbmV3LT52aWRlb19zcGF0aWFsX2ZpbHRlciwgbmV3LT52aWRlb190ZW1wb3JhbF9maWx0ZXIpOworCQlpZiAoZXJyKSByZXR1cm4gZXJyOworCX0KKwlpZiAob2xkID09IE5VTEwgfHwgb2xkLT52aWRlb190ZW1wb3JhbF9kZWNpbWF0aW9uICE9IG5ldy0+dmlkZW9fdGVtcG9yYWxfZGVjaW1hdGlvbikgeworCQllcnIgPSBjeDIzNDF4X2FwaShwcml2LCBmdW5jLCBDWDIzNDFYX0VOQ19TRVRfRlJBTUVfRFJPUF9SQVRFLCAxLAorCQkJbmV3LT52aWRlb190ZW1wb3JhbF9kZWNpbWF0aW9uKTsKKwkJaWYgKGVycikgcmV0dXJuIGVycjsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpjeDIzNDF4X21lbnVfaXRlbShzdHJ1Y3QgY3gyMzQxeF9tcGVnX3BhcmFtcyAqcCwgdTMyIGlkKQoreworCWNvbnN0IGNoYXIgKiptZW51ID0gY3gyMzQxeF9jdHJsX2dldF9tZW51KGlkKTsKKwlzdHJ1Y3QgdjRsMl9leHRfY29udHJvbCBjdHJsOworCisJaWYgKG1lbnUgPT0gTlVMTCkKKwkJZ290byBpbnZhbGlkOworCWN0cmwuaWQgPSBpZDsKKwlpZiAoY3gyMzQxeF9nZXRfY3RybChwLCAmY3RybCkpCisJCWdvdG8gaW52YWxpZDsKKwl3aGlsZSAoY3RybC52YWx1ZS0tICYmICptZW51KSBtZW51Kys7CisJaWYgKCptZW51ID09IE5VTEwpCisJCWdvdG8gaW52YWxpZDsKKwlyZXR1cm4gKm1lbnU7CisKK2ludmFsaWQ6CisJcmV0dXJuICI8aW52YWxpZD4iOworfQorCit2b2lkIGN4MjM0MXhfbG9nX3N0YXR1cyhzdHJ1Y3QgY3gyMzQxeF9tcGVnX3BhcmFtcyAqcCwgaW50IGNhcmRfaWQpCit7CisJaW50IGlzX21wZWcxID0gcC0+dmlkZW9fZW5jb2RpbmcgPT0gVjRMMl9NUEVHX1ZJREVPX0VOQ09ESU5HX01QRUdfMTsKKworCS8qIFN0cmVhbSAqLworCXByaW50ayhLRVJOX0lORk8gImN4MjM0MXgtJWQ6IFN0cmVhbTogJXNcbiIsCisJCWNhcmRfaWQsCisJCWN4MjM0MXhfbWVudV9pdGVtKHAsIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1RZUEUpKTsKKworCS8qIFZpZGVvICovCisJcHJpbnRrKEtFUk5fSU5GTyAiY3gyMzQxeC0lZDogVmlkZW86ICAlZHglZCwgJWQgZnBzXG4iLAorCQljYXJkX2lkLAorCQlwLT53aWR0aCAvIChpc19tcGVnMSA/IDIgOiAxKSwgcC0+aGVpZ2h0IC8gKGlzX21wZWcxID8gMiA6IDEpLAorCQlwLT5pc181MGh6ID8gMjUgOiAzMCk7CisJcHJpbnRrKEtFUk5fSU5GTyAiY3gyMzQxeC0lZDogVmlkZW86ICAlcywgJXMsICVzLCAlZCIsCisJCWNhcmRfaWQsCisJCWN4MjM0MXhfbWVudV9pdGVtKHAsIFY0TDJfQ0lEX01QRUdfVklERU9fRU5DT0RJTkcpLAorCQljeDIzNDF4X21lbnVfaXRlbShwLCBWNEwyX0NJRF9NUEVHX1ZJREVPX0FTUEVDVCksCisJCWN4MjM0MXhfbWVudV9pdGVtKHAsIFY0TDJfQ0lEX01QRUdfVklERU9fQklUUkFURV9NT0RFKSwKKwkJcC0+dmlkZW9fYml0cmF0ZSk7CisJaWYgKHAtPnZpZGVvX2JpdHJhdGVfbW9kZSA9PSBWNEwyX01QRUdfVklERU9fQklUUkFURV9NT0RFX1ZCUikgeworCQlwcmludGsoIiwgUGVhayAlZCIsIHAtPnZpZGVvX2JpdHJhdGVfcGVhayk7CisJfQorCXByaW50aygiXG4iKTsKKwlwcmludGsoS0VSTl9JTkZPICJjeDIzNDF4LSVkOiBWaWRlbzogIEdPUCBTaXplICVkLCAlZCBCLUZyYW1lcywgJXNHT1AgQ2xvc3VyZSwgJXMzOjIgUHVsbGRvd25cbiIsCisJCWNhcmRfaWQsCisJCXAtPnZpZGVvX2dvcF9zaXplLCBwLT52aWRlb19iX2ZyYW1lcywKKwkJcC0+dmlkZW9fZ29wX2Nsb3N1cmUgPyAiIiA6ICJObyAiLAorCQlwLT52aWRlb19wdWxsZG93biA/ICIiIDogIk5vICIpOworCWlmIChwLT52aWRlb190ZW1wb3JhbF9kZWNpbWF0aW9uKSB7CisJCXByaW50ayhLRVJOX0lORk8gImN4MjM0MXgtJWQ6IFZpZGVvOiBUZW1wb3JhbCBEZWNpbWF0aW9uICVkXG4iLAorCQkJY2FyZF9pZCwgcC0+dmlkZW9fdGVtcG9yYWxfZGVjaW1hdGlvbik7CisJfQorCisJLyogQXVkaW8gKi8KKwlwcmludGsoS0VSTl9JTkZPICJjeDIzNDF4LSVkOiBBdWRpbzogICVzLCAlcywgJXMsICVzIiwKKwkJY2FyZF9pZCwKKwkJY3gyMzQxeF9tZW51X2l0ZW0ocCwgVjRMMl9DSURfTVBFR19BVURJT19TQU1QTElOR19GUkVRKSwKKwkJY3gyMzQxeF9tZW51X2l0ZW0ocCwgVjRMMl9DSURfTVBFR19BVURJT19FTkNPRElORyksCisJCWN4MjM0MXhfbWVudV9pdGVtKHAsIFY0TDJfQ0lEX01QRUdfQVVESU9fTDJfQklUUkFURSksCisJCWN4MjM0MXhfbWVudV9pdGVtKHAsIFY0TDJfQ0lEX01QRUdfQVVESU9fTU9ERSkpOworCWlmIChwLT5hdWRpb19tb2RlID09IFY0TDJfTVBFR19BVURJT19NT0RFX0pPSU5UX1NURVJFTykgeworCQlwcmludGsoIiwgJXMiLAorCQkJY3gyMzQxeF9tZW51X2l0ZW0ocCwgVjRMMl9DSURfTVBFR19BVURJT19NT0RFX0VYVEVOU0lPTikpOworCX0KKwlwcmludGsoIiwgJXMsICVzXG4iLAorCQljeDIzNDF4X21lbnVfaXRlbShwLCBWNEwyX0NJRF9NUEVHX0FVRElPX0VNUEhBU0lTKSwKKwkJY3gyMzQxeF9tZW51X2l0ZW0ocCwgVjRMMl9DSURfTVBFR19BVURJT19DUkMpKTsKKworCS8qIEVuY29kaW5nIGZpbHRlcnMgKi8KKwlwcmludGsoS0VSTl9JTkZPICJjeDIzNDF4LSVkOiBTcGF0aWFsIEZpbHRlcjogICVzLCBMdW1hICVzLCBDaHJvbWEgJXMsICVkXG4iLAorCQljYXJkX2lkLAorCQljeDIzNDF4X21lbnVfaXRlbShwLCBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fU1BBVElBTF9GSUxURVJfTU9ERSksCisJCWN4MjM0MXhfbWVudV9pdGVtKHAsIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19MVU1BX1NQQVRJQUxfRklMVEVSX1RZUEUpLAorCQljeDIzNDF4X21lbnVfaXRlbShwLCBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fQ0hST01BX1NQQVRJQUxfRklMVEVSX1RZUEUpLAorCQlwLT52aWRlb19zcGF0aWFsX2ZpbHRlcik7CisJcHJpbnRrKEtFUk5fSU5GTyAiY3gyMzQxeC0lZDogVGVtcG9yYWwgRmlsdGVyOiAlcywgJWRcbiIsCisJCWNhcmRfaWQsCisJCWN4MjM0MXhfbWVudV9pdGVtKHAsIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19URU1QT1JBTF9GSUxURVJfTU9ERSksCisJCXAtPnZpZGVvX3RlbXBvcmFsX2ZpbHRlcik7CisJcHJpbnRrKEtFUk5fSU5GTyAiY3gyMzQxeC0lZDogTWVkaWFuIEZpbHRlcjogICAlcywgTHVtYSBbJWQsICVkXSwgQ2hyb21hIFslZCwgJWRdXG4iLAorCQljYXJkX2lkLAorCQljeDIzNDF4X21lbnVfaXRlbShwLCBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fTUVESUFOX0ZJTFRFUl9UWVBFKSwKKwkJcC0+dmlkZW9fbHVtYV9tZWRpYW5fZmlsdGVyX2JvdHRvbSwKKwkJcC0+dmlkZW9fbHVtYV9tZWRpYW5fZmlsdGVyX3RvcCwKKwkJcC0+dmlkZW9fY2hyb21hX21lZGlhbl9maWx0ZXJfYm90dG9tLAorCQlwLT52aWRlb19jaHJvbWFfbWVkaWFuX2ZpbHRlcl90b3ApOworfQorCitFWFBPUlRfU1lNQk9MKGN4MjM0MXhfZmlsbF9kZWZhdWx0cyk7CitFWFBPUlRfU1lNQk9MKGN4MjM0MXhfY3RybF9xdWVyeSk7CitFWFBPUlRfU1lNQk9MKGN4MjM0MXhfY3RybF9nZXRfbWVudSk7CitFWFBPUlRfU1lNQk9MKGN4MjM0MXhfZXh0X2N0cmxzKTsKK0VYUE9SVF9TWU1CT0woY3gyMzQxeF91cGRhdGUpOworRVhQT1JUX1NZTUJPTChjeDIzNDF4X2xvZ19zdGF0dXMpOworRVhQT1JUX1NZTUJPTChjeDIzNDF4X21wZWdfY3RybHMpOworCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIEVuZDoKKyAqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4NDAvY3gyNTg0MC1hdWRpby5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODQwL2N4MjU4NDAtYXVkaW8uYwppbmRleCA5YTRiODEzLi5mODk3YzFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4NDAvY3gyNTg0MC1hdWRpby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyNTg0MC9jeDI1ODQwLWF1ZGlvLmMKQEAgLTMwLDkgKzMwLDYgQEAKIAlpZiAoZnJlcSAhPSAzMjAwMCAmJiBmcmVxICE9IDQ0MTAwICYmIGZyZXEgIT0gNDgwMDApCiAJCXJldHVybiAtRUlOVkFMOwogCi0JLyogYXNzZXJ0IHNvZnQgcmVzZXQgKi8KLQljeDI1ODQwX2FuZF9vcihjbGllbnQsIDB4ODEwLCB+MHgxLCAweDAxKTsKLQogCS8qIGNvbW1vbiBmb3IgYWxsIGlucHV0cyBhbmQgcmF0ZXMgKi8KIAkvKiBTQV9NQ0xLX1NFTD0xLCBTQV9NQ0xLX0RJVj0weDEwICovCiAJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4MTI3LCAweDUwKTsKQEAgLTQ2LDYgKzQzLDkgQEAKIAkJCS8qIEFVWF9QTExfRlJBQyAqLwogCQkJY3gyNTg0MF93cml0ZTQoY2xpZW50LCAweDExMCwgMHhlZTM5YmIwMSk7CiAKKwkJCWlmIChzdGF0ZS0+aXNfY3gyNTgzNikKKwkJCQlicmVhazsKKwogCQkJLyogc3JjMy80LzZfY3RsID0gMHgwODAxZjc3ZiAqLwogCQkJY3gyNTg0MF93cml0ZTQoY2xpZW50LCAweDkwMCwgMHg3ZmY3MDEwOCk7CiAJCQljeDI1ODQwX3dyaXRlNChjbGllbnQsIDB4OTA0LCAweDdmZjcwMTA4KTsKQEAgLTU5LDYgKzU5LDkgQEAKIAkJCS8qIEFVWF9QTExfRlJBQyAqLwogCQkJY3gyNTg0MF93cml0ZTQoY2xpZW50LCAweDExMCwgMHhkNjZiZWMwMCk7CiAKKwkJCWlmIChzdGF0ZS0+aXNfY3gyNTgzNikKKwkJCQlicmVhazsKKwogCQkJLyogc3JjMy80LzZfY3RsID0gMHgwODAxNmQ1OSAqLwogCQkJY3gyNTg0MF93cml0ZTQoY2xpZW50LCAweDkwMCwgMHg1OTZkMDEwOCk7CiAJCQljeDI1ODQwX3dyaXRlNChjbGllbnQsIDB4OTA0LCAweDU5NmQwMTA4KTsKQEAgLTcyLDYgKzc1LDkgQEAKIAkJCS8qIEFVWF9QTExfRlJBQyAqLwogCQkJY3gyNTg0MF93cml0ZTQoY2xpZW50LCAweDExMCwgMHhlNWQ2OTgwMCk7CiAKKwkJCWlmIChzdGF0ZS0+aXNfY3gyNTgzNikKKwkJCQlicmVhazsKKwogCQkJLyogc3JjMy80LzZfY3RsID0gMHgwODAxNGZhYSAqLwogCQkJY3gyNTg0MF93cml0ZTQoY2xpZW50LCAweDkwMCwgMHhhYTRmMDEwOCk7CiAJCQljeDI1ODQwX3dyaXRlNChjbGllbnQsIDB4OTA0LCAweGFhNGYwMTA4KTsKQEAgLTg3LDYgKzkzLDkgQEAKIAkJCS8qIEFVWF9QTExfRlJBQyAqLwogCQkJY3gyNTg0MF93cml0ZTQoY2xpZW50LCAweDExMCwgMHg2OTA4MmEwMSk7CiAKKwkJCWlmIChzdGF0ZS0+aXNfY3gyNTgzNikKKwkJCQlicmVhazsKKwogCQkJLyogc3JjMV9jdGwgPSAweDA4MDEwMDAwICovCiAJCQljeDI1ODQwX3dyaXRlNChjbGllbnQsIDB4OGY4LCAweDAwMDAwMTA4KTsKIApAQCAtMTA2LDYgKzExNSw5IEBACiAJCQkvKiBBVVhfUExMX0ZSQUMgKi8KIAkJCWN4MjU4NDBfd3JpdGU0KGNsaWVudCwgMHgxMTAsIDB4ZDY2YmVjMDApOwogCisJCQlpZiAoc3RhdGUtPmlzX2N4MjU4MzYpCisJCQkJYnJlYWs7CisKIAkJCS8qIHNyYzFfY3RsID0gMHgwODAxMDAwMCAqLwogCQkJY3gyNTg0MF93cml0ZTQoY2xpZW50LCAweDhmOCwgMHhjZDYwMDEwOCk7CiAKQEAgLTEyMiw2ICsxMzQsOSBAQAogCQkJLyogQVVYX1BMTF9GUkFDICovCiAJCQljeDI1ODQwX3dyaXRlNChjbGllbnQsIDB4MTEwLCAweGU1ZDY5ODAwKTsKIAorCQkJaWYgKHN0YXRlLT5pc19jeDI1ODM2KQorCQkJCWJyZWFrOworCiAJCQkvKiBzcmMxX2N0bCA9IDB4MDgwMTAwMDAgKi8KIAkJCWN4MjU4NDBfd3JpdGU0KGNsaWVudCwgMHg4ZjgsIDB4MDA4MDAxMDgpOwogCkBAIC0xMzMsOSArMTQ4LDYgQEAKIAkJfQogCX0KIAotCS8qIGRlYXNzZXJ0IHNvZnQgcmVzZXQgKi8KLQljeDI1ODQwX2FuZF9vcihjbGllbnQsIDB4ODEwLCB+MHgxLCAweDAwKTsKLQogCXN0YXRlLT5hdWRjbGtfZnJlcSA9IGZyZXE7CiAKIAlyZXR1cm4gMDsKQEAgLTE0OCw2ICsxNjAsMTAgQEAKIAkvKiBzdG9wIG1pY3JvY29udHJvbGxlciAqLwogCWN4MjU4NDBfYW5kX29yKGNsaWVudCwgMHg4MDMsIH4weDEwLCAwKTsKIAorCS8qIGFzc2VydCBzb2Z0IHJlc2V0ICovCisJaWYgKCFzdGF0ZS0+aXNfY3gyNTgzNikKKwkJY3gyNTg0MF9hbmRfb3IoY2xpZW50LCAweDgxMCwgfjB4MSwgMHgwMSk7CisKIAkvKiBNdXRlIGV2ZXJ5dGhpbmcgdG8gcHJldmVudCB0aGUgUEZGVCEgKi8KIAljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHg4ZDMsIDB4MWYpOwogCkBAIC0xNjEsMTMgKzE3NywxOSBAQAogCX0gZWxzZSB7CiAJCS8qIFNldCBQYXRoMSB0byBBbmFsb2cgRGVtb2QgTWFpbiBDaGFubmVsICovCiAJCWN4MjU4NDBfd3JpdGU0KGNsaWVudCwgMHg4ZDAsIDB4NzAzODA2MWYpOworCX0KIAorCXNldF9hdWRjbGtfZnJlcShjbGllbnQsIHN0YXRlLT5hdWRjbGtfZnJlcSk7CisKKwkvKiBkZWFzc2VydCBzb2Z0IHJlc2V0ICovCisJaWYgKCFzdGF0ZS0+aXNfY3gyNTgzNikKKwkJY3gyNTg0MF9hbmRfb3IoY2xpZW50LCAweDgxMCwgfjB4MSwgMHgwMCk7CisKKwlpZiAoc3RhdGUtPmF1ZF9pbnB1dCAhPSBDWDI1ODQwX0FVRElPX1NFUklBTCkgewogCQkvKiBXaGVuIHRoZSBtaWNyb2NvbnRyb2xsZXIgZGV0ZWN0cyB0aGUKIAkJICogYXVkaW8gZm9ybWF0LCBpdCB3aWxsIHVubXV0ZSB0aGUgbGluZXMgKi8KIAkJY3gyNTg0MF9hbmRfb3IoY2xpZW50LCAweDgwMywgfjB4MTAsIDB4MTApOwogCX0KLQotCXNldF9hdWRjbGtfZnJlcShjbGllbnQsIHN0YXRlLT5hdWRjbGtfZnJlcSk7CiB9CiAKIHN0YXRpYyBpbnQgZ2V0X3ZvbHVtZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQpAQCAtMjkxLDExICszMTMsMjUgQEAKIAogaW50IGN4MjU4NDBfYXVkaW8oc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQogeworCXN0cnVjdCBjeDI1ODQwX3N0YXRlICpzdGF0ZSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwogCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwgPSBhcmc7CisJaW50IHJldHZhbDsKIAogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBWSURJT0NfSU5UX0FVRElPX0NMT0NLX0ZSRVE6Ci0JCXJldHVybiBzZXRfYXVkY2xrX2ZyZXEoY2xpZW50LCAqKHUzMiAqKWFyZyk7CisJCWlmIChzdGF0ZS0+YXVkX2lucHV0ICE9IENYMjU4NDBfQVVESU9fU0VSSUFMKSB7CisJCQljeDI1ODQwX2FuZF9vcihjbGllbnQsIDB4ODAzLCB+MHgxMCwgMCk7CisJCQljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHg4ZDMsIDB4MWYpOworCQl9CisJCWlmICghc3RhdGUtPmlzX2N4MjU4MzYpCisJCQljeDI1ODQwX2FuZF9vcihjbGllbnQsIDB4ODEwLCB+MHgxLCAxKTsKKwkJcmV0dmFsID0gc2V0X2F1ZGNsa19mcmVxKGNsaWVudCwgKih1MzIgKilhcmcpOworCQlpZiAoIXN0YXRlLT5pc19jeDI1ODM2KQorCQkJY3gyNTg0MF9hbmRfb3IoY2xpZW50LCAweDgxMCwgfjB4MSwgMCk7CisJCWlmIChzdGF0ZS0+YXVkX2lucHV0ICE9IENYMjU4NDBfQVVESU9fU0VSSUFMKSB7CisJCQljeDI1ODQwX2FuZF9vcihjbGllbnQsIDB4ODAzLCB+MHgxMCwgMHgxMCk7CisJCX0KKwkJcmV0dXJuIHJldHZhbDsKIAogCWNhc2UgVklESU9DX0dfQ1RSTDoKIAkJc3dpdGNoIChjdHJsLT5pZCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODQwL2N4MjU4NDAtY29yZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODQwL2N4MjU4NDAtY29yZS5jCmluZGV4IGE5NjFiYjIuLjVjMjAzNmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyNTg0MC9jeDI1ODQwLWNvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4NDAvY3gyNTg0MC1jb3JlLmMKQEAgLTEwLDYgKzEwLDkgQEAKICAqCiAgKiBWQkkgc3VwcG9ydCBieSBIYW5zIFZlcmt1aWwgPGh2ZXJrdWlsQHhzNGFsbC5ubD4uCiAgKgorICogTlRTQyBzbGljZWQgVkJJIHN1cHBvcnQgYnkgQ2hyaXN0b3BoZXIgTmV1ZmVsZCA8dGVsZXZpc2lvbkBjbmV1ZmVsZC5jYT4KKyAqIHdpdGggYWRkaXRpb25hbCBmaXhlcyBieSBIYW5zIFZlcmt1aWwgPGh2ZXJrdWlsQHhzNGFsbC5ubD4uCisgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCkBAIC00Myw3ICs0Niw3IEBACiBzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyAweDg4ID4+IDEsIEkyQ19DTElFTlRfRU5EIH07CiAKIAotc3RhdGljIGludCBjeDI1ODQwX2RlYnVnOworaW50IGN4MjU4NDBfZGVidWc7CiAKIG1vZHVsZV9wYXJhbV9uYW1lZChkZWJ1ZyxjeDI1ODQwX2RlYnVnLCBpbnQsIDA2NDQpOwogCkBAIC0xMDUsNyArMTA4LDcgQEAKIAkgICAgKGJ1ZmZlclsyXSA8PCA4KSB8IGJ1ZmZlclszXTsKIH0KIAotaW50IGN4MjU4NDBfYW5kX29yKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHUxNiBhZGRyLCB1OCBhbmRfbWFzaywKK2ludCBjeDI1ODQwX2FuZF9vcihzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1MTYgYWRkciwgdW5zaWduZWQgYW5kX21hc2ssCiAJCSAgIHU4IG9yX3ZhbHVlKQogewogCXJldHVybiBjeDI1ODQwX3dyaXRlKGNsaWVudCwgYWRkciwKQEAgLTExNyw3ICsxMjAsOCBAQAogCiBzdGF0aWMgaW50IHNldF9pbnB1dChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBlbnVtIGN4MjU4NDBfdmlkZW9faW5wdXQgdmlkX2lucHV0LAogCQkJCQkJZW51bSBjeDI1ODQwX2F1ZGlvX2lucHV0IGF1ZF9pbnB1dCk7Ci1zdGF0aWMgdm9pZCBsb2dfc3RhdHVzKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOworc3RhdGljIHZvaWQgbG9nX2F1ZGlvX3N0YXR1cyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKK3N0YXRpYyB2b2lkIGxvZ192aWRlb19zdGF0dXMoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCk7CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKQEAgLTE0Nyw2ICsxNTEsMzMgQEAKIAljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHgxNWQsIDB4ZTEpOwogfQogCitzdGF0aWMgdm9pZCBjeDI1ODM2X2luaXRpYWxpemUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwkvKiByZXNldCBjb25maWd1cmF0aW9uIGlzIGRlc2NyaWJlZCBvbiBwYWdlIDMtNzcgb2YgdGhlIENYMjU4MzYgZGF0YXNoZWV0ICovCisJLyogMi4gKi8KKwljeDI1ODQwX2FuZF9vcihjbGllbnQsIDB4MDAwLCB+MHgwMSwgMHgwMSk7CisJY3gyNTg0MF9hbmRfb3IoY2xpZW50LCAweDAwMCwgfjB4MDEsIDB4MDApOworCS8qIDNhLiAqLworCWN4MjU4NDBfYW5kX29yKGNsaWVudCwgMHgxNWEsIH4weDcwLCAweDAwKTsKKwkvKiAzYi4gKi8KKwljeDI1ODQwX2FuZF9vcihjbGllbnQsIDB4MTViLCB+MHgxZSwgMHgwNik7CisJLyogM2MuICovCisJY3gyNTg0MF9hbmRfb3IoY2xpZW50LCAweDE1OSwgfjB4MDIsIDB4MDIpOworCS8qIDNkLiAqLworCS8qIFRoZXJlIHNob3VsZCBiZSBhIDEwLXVzIGRlbGF5IGhlcmUsIGJ1dCBzaW5jZSB0aGUKKwkgICBpMmMgYnVzIGFscmVhZHkgaGFzIGEgMTAtdXMgZGVsYXkgd2UgZG9uJ3QgbmVlZCB0byBkbworCSAgIGFueXRoaW5nICovCisJLyogM2UuICovCisJY3gyNTg0MF9hbmRfb3IoY2xpZW50LCAweDE1OSwgfjB4MDIsIDB4MDApOworCS8qIDNmLiAqLworCWN4MjU4NDBfYW5kX29yKGNsaWVudCwgMHgxNTksIH4weGMwLCAweGMwKTsKKwkvKiAzZy4gKi8KKwljeDI1ODQwX2FuZF9vcihjbGllbnQsIDB4MTU5LCB+MHgwMSwgMHgwMCk7CisJY3gyNTg0MF9hbmRfb3IoY2xpZW50LCAweDE1OSwgfjB4MDEsIDB4MDEpOworCS8qIDNoLiAqLworCWN4MjU4NDBfYW5kX29yKGNsaWVudCwgMHgxNWIsIH4weDFlLCAweDEwKTsKK30KKwogc3RhdGljIHZvaWQgY3gyNTg0MF9pbml0aWFsaXplKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBsb2FkZncpCiB7CiAJc3RydWN0IGN4MjU4NDBfc3RhdGUgKnN0YXRlID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CkBAIC0yMjAsMTcgKzI1MSw3IEBACiAJY3gyNTg0MF9hbmRfb3IoY2xpZW50LCAweDQwMSwgfjB4NjAsIDApOwogCWN4MjU4NDBfYW5kX29yKGNsaWVudCwgMHg0MDEsIH4weDYwLCAweDYwKTsKIAotCS8qIE5vdGU6IHBlcmhhcHMgVjRMMl9TVERfUEFMX00gc2hvdWxkIGJlIGhhbmRsZWQgYXMgVjRMMl9TVERfTlRTQwotCSAgIGluc3RlYWQgb2YgVjRMMl9TVERfUEFMLiBTb21lb25lIG5lZWRzIHRvIHRlc3QgdGhpcy4gKi8KLQlpZiAoc3RkICYgVjRMMl9TVERfUEFMKSB7Ci0JCS8qIEZvbGxvdyB0dW5lciBjaGFuZ2UgcHJvY2VkdXJlIGZvciBQQUwgKi8KLQkJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4ODA4LCAweGZmKTsKLQkJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4ODBiLCAweDEwKTsKLQl9IGVsc2UgaWYgKHN0ZCAmIFY0TDJfU1REX1NFQ0FNKSB7Ci0JCS8qIFNlbGVjdCBhdXRvZGV0ZWN0IGZvciBTRUNBTSAqLwotCQljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHg4MDgsIDB4ZmYpOwotCQljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHg4MGIsIDB4MTApOwotCX0gZWxzZSBpZiAoc3RkICYgVjRMMl9TVERfTlRTQykgeworCWlmIChzdGQgJiBWNEwyX1NURF81MjVfNjApIHsKIAkJLyogQ2VydGFpbiBIYXVwcGF1Z2UgUFZSMTUwIG1vZGVscyBoYXZlIGEgaGFyZHdhcmUgYnVnCiAJCSAgIHRoYXQgY2F1c2VzIGF1ZGlvIHRvIGRyb3Agb3V0LiBGb3IgdGhlc2UgbW9kZWxzIHRoZQogCQkgICBhdWRpbyBzdGFuZGFyZCBtdXN0IGJlIHNldCBleHBsaWNpdGx5LgpAQCAtMjQ5LDYgKzI3MCwxNCBAQAogCQkJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4ODA4LCBod19maXggPyAweDFmIDogMHhmNik7CiAJCX0KIAkJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4ODBiLCAweDAwKTsKKwl9IGVsc2UgaWYgKHN0ZCAmIFY0TDJfU1REX1BBTCkgeworCQkvKiBGb2xsb3cgdHVuZXIgY2hhbmdlIHByb2NlZHVyZSBmb3IgUEFMICovCisJCWN4MjU4NDBfd3JpdGUoY2xpZW50LCAweDgwOCwgMHhmZik7CisJCWN4MjU4NDBfd3JpdGUoY2xpZW50LCAweDgwYiwgMHgxMCk7CisJfSBlbHNlIGlmIChzdGQgJiBWNEwyX1NURF9TRUNBTSkgeworCQkvKiBTZWxlY3QgYXV0b2RldGVjdCBmb3IgU0VDQU0gKi8KKwkJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4ODA4LCAweGZmKTsKKwkJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4ODBiLCAweDEwKTsKIAl9CiAKIAlpZiAoY3gyNTg0MF9yZWFkKGNsaWVudCwgMHg4MDMpICYgMHgxMCkgewpAQCAtMzE5LDggKzM0OCwxMCBAQAogCiAJc3RhdGUtPnZpZF9pbnB1dCA9IHZpZF9pbnB1dDsKIAlzdGF0ZS0+YXVkX2lucHV0ID0gYXVkX2lucHV0OwotCWN4MjU4NDBfYXVkaW9fc2V0X3BhdGgoY2xpZW50KTsKLQlpbnB1dF9jaGFuZ2UoY2xpZW50KTsKKwlpZiAoIXN0YXRlLT5pc19jeDI1ODM2KSB7CisJCWN4MjU4NDBfYXVkaW9fc2V0X3BhdGgoY2xpZW50KTsKKwkJaW5wdXRfY2hhbmdlKGNsaWVudCk7CisJfQogCXJldHVybiAwOwogfQogCkBAIC0zNTQsNiArMzg1LDggQEAKIAkJfQogCX0KIAorCXY0bF9kYmcoMSwgY3gyNTg0MF9kZWJ1ZywgY2xpZW50LCAiY2hhbmdpbmcgdmlkZW8gc3RkIHRvIGZtdCAlaVxuIixmbXQpOworCiAJLyogRm9sbG93IHN0ZXAgOSBvZiBzZWN0aW9uIDMuMTYgaW4gdGhlIGN4MjU4NDAgZGF0YXNoZWV0LgogCSAgIFdpdGhvdXQgdGhpcyBQQUwgbWF5IGRpc3BsYXkgYSB2ZXJ0aWNhbCBnaG9zdGluZyBlZmZlY3QuCiAJICAgVGhpcyBoYXBwZW5zIGZvciBleGFtcGxlIHdpdGggdGhlIFl1YW4gTVBDNjIyLiAqLwpAQCAtMzcwLDYgKzQwMyw3IEBACiAKIHY0bDJfc3RkX2lkIGN4MjU4NDBfZ2V0X3Y0bHN0ZChzdHJ1Y3QgaTJjX2NsaWVudCAqIGNsaWVudCkKIHsKKwlzdHJ1Y3QgY3gyNTg0MF9zdGF0ZSAqc3RhdGUgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKIAkvKiBjaGVjayBWSURfRk1UX1NFTCBmaXJzdCAqLwogCXU4IGZtdCA9IGN4MjU4NDBfcmVhZChjbGllbnQsIDB4NDAwKSAmIDB4ZjsKIApAQCAtMzgzLDcgKzQxNyw3IEBACiAJewogCQkvKiBpZiB0aGUgYXVkaW8gc3RkIGlzIEEyLU0sIHRoZW4gdGhpcyBpcyB0aGUgU291dGggS29yZWFuCiAJCSAgIE5UU0Mgc3RhbmRhcmQgKi8KLQkJaWYgKGN4MjU4NDBfcmVhZChjbGllbnQsIDB4ODA1KSA9PSAyKQorCQlpZiAoIXN0YXRlLT5pc19jeDI1ODM2ICYmIGN4MjU4NDBfcmVhZChjbGllbnQsIDB4ODA1KSA9PSAyKQogCQkJcmV0dXJuIFY0TDJfU1REX05UU0NfTV9LUjsKIAkJcmV0dXJuIFY0TDJfU1REX05UU0NfTTsKIAl9CkBAIC00NTYsNiArNDkwLDggQEAKIAljYXNlIFY0TDJfQ0lEX0FVRElPX1RSRUJMRToKIAljYXNlIFY0TDJfQ0lEX0FVRElPX0JBTEFOQ0U6CiAJY2FzZSBWNEwyX0NJRF9BVURJT19NVVRFOgorCQlpZiAoc3RhdGUtPmlzX2N4MjU4MzYpCisJCQlyZXR1cm4gLUVJTlZBTDsKIAkJcmV0dXJuIGN4MjU4NDBfYXVkaW8oY2xpZW50LCBWSURJT0NfU19DVFJMLCBjdHJsKTsKIAogCWRlZmF1bHQ6CkBAIC00OTAsNiArNTI2LDggQEAKIAljYXNlIFY0TDJfQ0lEX0FVRElPX1RSRUJMRToKIAljYXNlIFY0TDJfQ0lEX0FVRElPX0JBTEFOQ0U6CiAJY2FzZSBWNEwyX0NJRF9BVURJT19NVVRFOgorCQlpZiAoc3RhdGUtPmlzX2N4MjU4MzYpCisJCQlyZXR1cm4gLUVJTlZBTDsKIAkJcmV0dXJuIGN4MjU4NDBfYXVkaW8oY2xpZW50LCBWSURJT0NfR19DVFJMLCBjdHJsKTsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTU3OSw5MSArNjE3LDYgQEAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotc3RhdGljIHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCBjeDI1ODQwX3FjdHJsW10gPSB7Ci0JewotCQkuaWQgICAgICAgICAgICA9IFY0TDJfQ0lEX0JSSUdIVE5FU1MsCi0JCS50eXBlICAgICAgICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKLQkJLm5hbWUgICAgICAgICAgPSAiQnJpZ2h0bmVzcyIsCi0JCS5taW5pbXVtICAgICAgID0gMCwKLQkJLm1heGltdW0gICAgICAgPSAyNTUsCi0JCS5zdGVwICAgICAgICAgID0gMSwKLQkJLmRlZmF1bHRfdmFsdWUgPSAxMjgsCi0JCS5mbGFncyAgICAgICAgID0gMCwKLQl9LCB7Ci0JCS5pZCAgICAgICAgICAgID0gVjRMMl9DSURfQ09OVFJBU1QsCi0JCS50eXBlICAgICAgICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKLQkJLm5hbWUgICAgICAgICAgPSAiQ29udHJhc3QiLAotCQkubWluaW11bSAgICAgICA9IDAsCi0JCS5tYXhpbXVtICAgICAgID0gMTI3LAotCQkuc3RlcCAgICAgICAgICA9IDEsCi0JCS5kZWZhdWx0X3ZhbHVlID0gNjQsCi0JCS5mbGFncyAgICAgICAgID0gMCwKLQl9LCB7Ci0JCS5pZCAgICAgICAgICAgID0gVjRMMl9DSURfU0FUVVJBVElPTiwKLQkJLnR5cGUgICAgICAgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAotCQkubmFtZSAgICAgICAgICA9ICJTYXR1cmF0aW9uIiwKLQkJLm1pbmltdW0gICAgICAgPSAwLAotCQkubWF4aW11bSAgICAgICA9IDEyNywKLQkJLnN0ZXAgICAgICAgICAgPSAxLAotCQkuZGVmYXVsdF92YWx1ZSA9IDY0LAotCQkuZmxhZ3MgICAgICAgICA9IDAsCi0JfSwgewotCQkuaWQgICAgICAgICAgICA9IFY0TDJfQ0lEX0hVRSwKLQkJLnR5cGUgICAgICAgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAotCQkubmFtZSAgICAgICAgICA9ICJIdWUiLAotCQkubWluaW11bSAgICAgICA9IC0xMjgsCi0JCS5tYXhpbXVtICAgICAgID0gMTI3LAotCQkuc3RlcCAgICAgICAgICA9IDEsCi0JCS5kZWZhdWx0X3ZhbHVlID0gMCwKLQkJLmZsYWdzIAkgICAgICAgPSAwLAotCX0sIHsKLQkJLmlkICAgICAgICAgICAgPSBWNEwyX0NJRF9BVURJT19WT0xVTUUsCi0JCS50eXBlICAgICAgICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKLQkJLm5hbWUgICAgICAgICAgPSAiVm9sdW1lIiwKLQkJLm1pbmltdW0gICAgICAgPSAwLAotCQkubWF4aW11bSAgICAgICA9IDY1NTM1LAotCQkuc3RlcCAgICAgICAgICA9IDY1NTM1LzEwMCwKLQkJLmRlZmF1bHRfdmFsdWUgPSA1ODg4MCwKLQkJLmZsYWdzICAgICAgICAgPSAwLAotCX0sIHsKLQkJLmlkICAgICAgICAgICAgPSBWNEwyX0NJRF9BVURJT19CQUxBTkNFLAotCQkudHlwZSAgICAgICAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCi0JCS5uYW1lICAgICAgICAgID0gIkJhbGFuY2UiLAotCQkubWluaW11bSAgICAgICA9IDAsCi0JCS5tYXhpbXVtICAgICAgID0gNjU1MzUsCi0JCS5zdGVwICAgICAgICAgID0gNjU1MzUvMTAwLAotCQkuZGVmYXVsdF92YWx1ZSA9IDMyNzY4LAotCQkuZmxhZ3MgICAgICAgICA9IDAsCi0JfSwgewotCQkuaWQgICAgICAgICAgICA9IFY0TDJfQ0lEX0FVRElPX01VVEUsCi0JCS50eXBlICAgICAgICAgID0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKLQkJLm5hbWUgICAgICAgICAgPSAiTXV0ZSIsCi0JCS5taW5pbXVtICAgICAgID0gMCwKLQkJLm1heGltdW0gICAgICAgPSAxLAotCQkuc3RlcCAgICAgICAgICA9IDEsCi0JCS5kZWZhdWx0X3ZhbHVlID0gMSwKLQkJLmZsYWdzICAgICAgICAgPSAwLAotCX0sIHsKLQkJLmlkICAgICAgICAgICAgPSBWNEwyX0NJRF9BVURJT19CQVNTLAotCQkudHlwZSAgICAgICAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCi0JCS5uYW1lICAgICAgICAgID0gIkJhc3MiLAotCQkubWluaW11bSAgICAgICA9IDAsCi0JCS5tYXhpbXVtICAgICAgID0gNjU1MzUsCi0JCS5zdGVwICAgICAgICAgID0gNjU1MzUvMTAwLAotCQkuZGVmYXVsdF92YWx1ZSA9IDMyNzY4LAotCX0sIHsKLQkJLmlkICAgICAgICAgICAgPSBWNEwyX0NJRF9BVURJT19UUkVCTEUsCi0JCS50eXBlICAgICAgICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKLQkJLm5hbWUgICAgICAgICAgPSAiVHJlYmxlIiwKLQkJLm1pbmltdW0gICAgICAgPSAwLAotCQkubWF4aW11bSAgICAgICA9IDY1NTM1LAotCQkuc3RlcCAgICAgICAgICA9IDY1NTM1LzEwMCwKLQkJLmRlZmF1bHRfdmFsdWUgPSAzMjc2OCwKLQl9LAotfTsKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQogc3RhdGljIGludCBjeDI1ODQwX2NvbW1hbmQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdW5zaWduZWQgaW50IGNtZCwKIAkJCSAgIHZvaWQgKmFyZykKIHsKQEAgLTcwNiw4ICs2NTksOCBAQAogCiAJY2FzZSBWSURJT0NfU1RSRUFNT046CiAJCXY0bF9kYmcoMSwgY3gyNTg0MF9kZWJ1ZywgY2xpZW50LCAiZW5hYmxlIG91dHB1dFxuIik7Ci0JCWN4MjU4NDBfd3JpdGUoY2xpZW50LCAweDExNSwgMHg4Yyk7Ci0JCWN4MjU4NDBfd3JpdGUoY2xpZW50LCAweDExNiwgMHgwNyk7CisJCWN4MjU4NDBfd3JpdGUoY2xpZW50LCAweDExNSwgc3RhdGUtPmlzX2N4MjU4MzYgPyAweDBjIDogMHg4Yyk7CisJCWN4MjU4NDBfd3JpdGUoY2xpZW50LCAweDExNiwgc3RhdGUtPmlzX2N4MjU4MzYgPyAweDA0IDogMHgwNyk7CiAJCWJyZWFrOwogCiAJY2FzZSBWSURJT0NfU1RSRUFNT0ZGOgpAQCAtNzE3LDcgKzY3MCw5IEBACiAJCWJyZWFrOwogCiAJY2FzZSBWSURJT0NfTE9HX1NUQVRVUzoKLQkJbG9nX3N0YXR1cyhjbGllbnQpOworCQlsb2dfdmlkZW9fc3RhdHVzKGNsaWVudCk7CisJCWlmICghc3RhdGUtPmlzX2N4MjU4MzYpCisJCQlsb2dfYXVkaW9fc3RhdHVzKGNsaWVudCk7CiAJCWJyZWFrOwogCiAJY2FzZSBWSURJT0NfR19DVFJMOgpAQCAtNzI5LDEzICs2ODQsMjkgQEAKIAljYXNlIFZJRElPQ19RVUVSWUNUUkw6CiAJewogCQlzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKnFjID0gYXJnOwotCQlpbnQgaTsKIAotCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjeDI1ODQwX3FjdHJsKTsgaSsrKQotCQkJaWYgKHFjLT5pZCAmJiBxYy0+aWQgPT0gY3gyNTg0MF9xY3RybFtpXS5pZCkgewotCQkJCW1lbWNweShxYywgJmN4MjU4NDBfcWN0cmxbaV0sIHNpemVvZigqcWMpKTsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KKwkJc3dpdGNoIChxYy0+aWQpIHsKKwkJCWNhc2UgVjRMMl9DSURfQlJJR0hUTkVTUzoKKwkJCWNhc2UgVjRMMl9DSURfQ09OVFJBU1Q6CisJCQljYXNlIFY0TDJfQ0lEX1NBVFVSQVRJT046CisJCQljYXNlIFY0TDJfQ0lEX0hVRToKKwkJCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGxfc3RkKHFjKTsKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKHN0YXRlLT5pc19jeDI1ODM2KQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJc3dpdGNoIChxYy0+aWQpIHsKKwkJCWNhc2UgVjRMMl9DSURfQVVESU9fVk9MVU1FOgorCQkJY2FzZSBWNEwyX0NJRF9BVURJT19NVVRFOgorCQkJY2FzZSBWNEwyX0NJRF9BVURJT19CQUxBTkNFOgorCQkJY2FzZSBWNEwyX0NJRF9BVURJT19CQVNTOgorCQkJY2FzZSBWNEwyX0NJRF9BVURJT19UUkVCTEU6CisJCQkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsX3N0ZChxYyk7CisJCQlkZWZhdWx0OgorCQkJCXJldHVybiAtRUlOVkFMOworCQl9CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtNzYwLDMxICs3MzEsNDEgQEAKIAkJcmV0dXJuIHNldF9pbnB1dChjbGllbnQsIHJvdXRlLT5pbnB1dCwgc3RhdGUtPmF1ZF9pbnB1dCk7CiAKIAljYXNlIFZJRElPQ19JTlRfR19BVURJT19ST1VUSU5HOgorCQlpZiAoc3RhdGUtPmlzX2N4MjU4MzYpCisJCQlyZXR1cm4gLUVJTlZBTDsKIAkJcm91dGUtPmlucHV0ID0gc3RhdGUtPmF1ZF9pbnB1dDsKIAkJcm91dGUtPm91dHB1dCA9IDA7CiAJCWJyZWFrOwogCiAJY2FzZSBWSURJT0NfSU5UX1NfQVVESU9fUk9VVElORzoKKwkJaWYgKHN0YXRlLT5pc19jeDI1ODM2KQorCQkJcmV0dXJuIC1FSU5WQUw7CiAJCXJldHVybiBzZXRfaW5wdXQoY2xpZW50LCBzdGF0ZS0+dmlkX2lucHV0LCByb3V0ZS0+aW5wdXQpOwogCiAJY2FzZSBWSURJT0NfU19GUkVRVUVOQ1k6Ci0JCWlucHV0X2NoYW5nZShjbGllbnQpOworCQlpZiAoIXN0YXRlLT5pc19jeDI1ODM2KSB7CisJCQlpbnB1dF9jaGFuZ2UoY2xpZW50KTsKKwkJfQogCQlicmVhazsKIAogCWNhc2UgVklESU9DX0dfVFVORVI6CiAJewotCQl1OCBtb2RlID0gY3gyNTg0MF9yZWFkKGNsaWVudCwgMHg4MDQpOwotCQl1OCB2cHJlcyA9IGN4MjU4NDBfcmVhZChjbGllbnQsIDB4ODBhKSAmIDB4MTA7CisJCXU4IHZwcmVzID0gY3gyNTg0MF9yZWFkKGNsaWVudCwgMHg0MGUpICYgMHgyMDsKKwkJdTggbW9kZTsKIAkJaW50IHZhbCA9IDA7CiAKIAkJaWYgKHN0YXRlLT5yYWRpbykKIAkJCWJyZWFrOwogCisJCXZ0LT5zaWduYWwgPSB2cHJlcyA/IDB4ZmZmZiA6IDB4MDsKKwkJaWYgKHN0YXRlLT5pc19jeDI1ODM2KQorCQkJYnJlYWs7CisKIAkJdnQtPmNhcGFiaWxpdHkgfD0KIAkJICAgIFY0TDJfVFVORVJfQ0FQX1NURVJFTyB8IFY0TDJfVFVORVJfQ0FQX0xBTkcxIHwKIAkJICAgIFY0TDJfVFVORVJfQ0FQX0xBTkcyIHwgVjRMMl9UVU5FUl9DQVBfU0FQOwogCi0JCXZ0LT5zaWduYWwgPSB2cHJlcyA/IDB4ZmZmZiA6IDB4MDsKKwkJbW9kZSA9IGN4MjU4NDBfcmVhZChjbGllbnQsIDB4ODA0KTsKIAogCQkvKiBnZXQgcnhzdWJjaGFucyBhbmQgYXVkbW9kZSAqLwogCQlpZiAoKG1vZGUgJiAweGYpID09IDEpCkBAIC04MDQsNyArNzg1LDcgQEAKIAl9CiAKIAljYXNlIFZJRElPQ19TX1RVTkVSOgotCQlpZiAoc3RhdGUtPnJhZGlvKQorCQlpZiAoc3RhdGUtPnJhZGlvIHx8IHN0YXRlLT5pc19jeDI1ODM2KQogCQkJYnJlYWs7CiAKIAkJc3dpdGNoICh2dC0+YXVkbW9kZSkgewpAQCAtODQ2LDEyICs4MjcsMTQgQEAKIAkJcmV0dXJuIHNldF92NGxmbXQoY2xpZW50LCAoc3RydWN0IHY0bDJfZm9ybWF0ICopYXJnKTsKIAogCWNhc2UgVklESU9DX0lOVF9SRVNFVDoKLQkJY3gyNTg0MF9pbml0aWFsaXplKGNsaWVudCwgMCk7CisJCWlmIChzdGF0ZS0+aXNfY3gyNTgzNikKKwkJCWN4MjU4MzZfaW5pdGlhbGl6ZShjbGllbnQpOworCQllbHNlCisJCQljeDI1ODQwX2luaXRpYWxpemUoY2xpZW50LCAwKTsKIAkJYnJlYWs7CiAKIAljYXNlIFZJRElPQ19JTlRfR19DSElQX0lERU5UOgotCQkqKGVudW0gdjRsMl9jaGlwX2lkZW50ICopYXJnID0KLQkJCVY0TDJfSURFTlRfQ1gyNTg0MCArICgoY3gyNTg0MF9yZWFkKGNsaWVudCwgMHgxMDApID4+IDQpICYgMHhmKTsKKwkJKihlbnVtIHY0bDJfY2hpcF9pZGVudCAqKWFyZyA9IHN0YXRlLT5pZDsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpAQCAtODcwLDYgKzg1Myw3IEBACiB7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKIAlzdHJ1Y3QgY3gyNTg0MF9zdGF0ZSAqc3RhdGU7CisJZW51bSB2NGwyX2NoaXBfaWRlbnQgaWQ7CiAJdTE2IGRldmljZV9pZDsKIAogCS8qIENoZWNrIGlmIHRoZSBhZGFwdGVyIHN1cHBvcnRzIHRoZSBuZWVkZWQgZmVhdHVyZXMKQEAgLTg3OCwxMCArODYyLDExIEBACiAJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19JMkMpKQogCQlyZXR1cm4gMDsKIAotCWNsaWVudCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpMmNfY2xpZW50KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGNsaWVudCA9PSAwKQorCXN0YXRlID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGN4MjU4NDBfc3RhdGUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3RhdGUgPT0gMCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKKwljbGllbnQgPSAmc3RhdGUtPmM7CiAJY2xpZW50LT5hZGRyID0gYWRkcmVzczsKIAljbGllbnQtPmFkYXB0ZXIgPSBhZGFwdGVyOwogCWNsaWVudC0+ZHJpdmVyID0gJmkyY19kcml2ZXJfY3gyNTg0MDsKQEAgLTg5MywxMCArODc4LDE4IEBACiAJZGV2aWNlX2lkIHw9IGN4MjU4NDBfcmVhZChjbGllbnQsIDB4MTAwKTsKIAogCS8qIFRoZSBoaWdoIGJ5dGUgb2YgdGhlIGRldmljZSBJRCBzaG91bGQgYmUKLQkgKiAweDg0IGlmIGNoaXAgaXMgcHJlc2VudCAqLwotCWlmICgoZGV2aWNlX2lkICYgMHhmZjAwKSAhPSAweDg0MDApIHsKKwkgKiAweDgzIGZvciB0aGUgY3gyNTgzeCBhbmQgMHg4NCBmb3IgdGhlIGN4MjU4NHggKi8KKwlpZiAoKGRldmljZV9pZCAmIDB4ZmYwMCkgPT0gMHg4MzAwKSB7CisJCWlkID0gVjRMMl9JREVOVF9DWDI1ODM2ICsgKChkZXZpY2VfaWQgPj4gNCkgJiAweGYpIC0gNjsKKwkJc3RhdGUtPmlzX2N4MjU4MzYgPSAxOworCX0KKwllbHNlIGlmICgoZGV2aWNlX2lkICYgMHhmZjAwKSA9PSAweDg0MDApIHsKKwkJaWQgPSBWNEwyX0lERU5UX0NYMjU4NDAgKyAoKGRldmljZV9pZCA+PiA0KSAmIDB4Zik7CisJCXN0YXRlLT5pc19jeDI1ODM2ID0gMDsKKwl9CisJZWxzZSB7CiAJCXY0bF9kYmcoMSwgY3gyNTg0MF9kZWJ1ZywgY2xpZW50LCAiY3gyNTg0MCBub3QgZm91bmRcbiIpOwotCQlrZnJlZShjbGllbnQpOworCQlrZnJlZShzdGF0ZSk7CiAJCXJldHVybiAwOwogCX0KIApAQCAtOTA1LDIxICs4OTgsMTkgQEAKIAkJICAgIChkZXZpY2VfaWQgJiAweDBmKSA8IDMgPyAoZGV2aWNlX2lkICYgMHgwZikgKyAxIDogMywKIAkJICAgIGFkZHJlc3MgPDwgMSwgYWRhcHRlci0+bmFtZSk7CiAKLQlzdGF0ZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBjeDI1ODQwX3N0YXRlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHN0YXRlID09IE5VTEwpIHsKLQkJa2ZyZWUoY2xpZW50KTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCiAJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgc3RhdGUpOwotCW1lbXNldChzdGF0ZSwgMCwgc2l6ZW9mKHN0cnVjdCBjeDI1ODQwX3N0YXRlKSk7CiAJc3RhdGUtPnZpZF9pbnB1dCA9IENYMjU4NDBfQ09NUE9TSVRFNzsKIAlzdGF0ZS0+YXVkX2lucHV0ID0gQ1gyNTg0MF9BVURJTzg7CiAJc3RhdGUtPmF1ZGNsa19mcmVxID0gNDgwMDA7CiAJc3RhdGUtPnB2cjE1MF93b3JrYXJvdW5kID0gMDsKIAlzdGF0ZS0+YXVkbW9kZSA9IFY0TDJfVFVORVJfTU9ERV9MQU5HMTsKKwlzdGF0ZS0+dmJpX2xpbmVfb2Zmc2V0ID0gODsKKwlzdGF0ZS0+aWQgPSBpZDsKIAotCWN4MjU4NDBfaW5pdGlhbGl6ZShjbGllbnQsIDEpOworCWlmIChzdGF0ZS0+aXNfY3gyNTgzNikKKwkJY3gyNTgzNl9pbml0aWFsaXplKGNsaWVudCk7CisJZWxzZQorCQljeDI1ODQwX2luaXRpYWxpemUoY2xpZW50LCAxKTsKIAogCWkyY19hdHRhY2hfY2xpZW50KGNsaWVudCk7CiAKQEAgLTk0NCw3ICs5MzUsNiBAQAogCX0KIAogCWtmcmVlKHN0YXRlKTsKLQlrZnJlZShjbGllbnQpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC05NzcsNyArOTY3LDcgQEAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotc3RhdGljIHZvaWQgbG9nX3N0YXR1cyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQorc3RhdGljIHZvaWQgbG9nX3ZpZGVvX3N0YXR1cyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewogCXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBmbXRfc3Ryc1tdID0gewogCQkiMHgwIiwKQEAgLTk4OSw5ICs5NzksMzYgQEAKIAl9OwogCiAJc3RydWN0IGN4MjU4NDBfc3RhdGUgKnN0YXRlID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Ci0JdTggbWljcm9jdHJsX3ZpZGZtdCA9IGN4MjU4NDBfcmVhZChjbGllbnQsIDB4ODBhKTsKIAl1OCB2aWRmbXRfc2VsID0gY3gyNTg0MF9yZWFkKGNsaWVudCwgMHg0MDApICYgMHhmOwogCXU4IGdlbl9zdGF0MSA9IGN4MjU4NDBfcmVhZChjbGllbnQsIDB4NDBkKTsKKwl1OCBnZW5fc3RhdDIgPSBjeDI1ODQwX3JlYWQoY2xpZW50LCAweDQwZSk7CisJaW50IHZpZF9pbnB1dCA9IHN0YXRlLT52aWRfaW5wdXQ7CisKKwl2NGxfaW5mbyhjbGllbnQsICJWaWRlbyBzaWduYWw6ICAgICAgICAgICAgICAlc3ByZXNlbnRcbiIsCisJCSAgICAoZ2VuX3N0YXQyICYgMHgyMCkgPyAiIiA6ICJub3QgIik7CisJdjRsX2luZm8oY2xpZW50LCAiRGV0ZWN0ZWQgZm9ybWF0OiAgICAgICAgICAgJXNcbiIsCisJCSAgICBmbXRfc3Ryc1tnZW5fc3RhdDEgJiAweGZdKTsKKworCXY0bF9pbmZvKGNsaWVudCwgIlNwZWNpZmllZCBzdGFuZGFyZDogICAgICAgICVzXG4iLAorCQkgICAgdmlkZm10X3NlbCA/IGZtdF9zdHJzW3ZpZGZtdF9zZWxdIDogImF1dG9tYXRpYyBkZXRlY3Rpb24iKTsKKworCWlmICh2aWRfaW5wdXQgPj0gQ1gyNTg0MF9DT01QT1NJVEUxICYmCisJICAgIHZpZF9pbnB1dCA8PSBDWDI1ODQwX0NPTVBPU0lURTgpIHsKKwkJdjRsX2luZm8oY2xpZW50LCAiU3BlY2lmaWVkIHZpZGVvIGlucHV0OiAgICAgQ29tcG9zaXRlICVkXG4iLAorCQkJdmlkX2lucHV0IC0gQ1gyNTg0MF9DT01QT1NJVEUxICsgMSk7CisJfSBlbHNlIHsKKwkJdjRsX2luZm8oY2xpZW50LCAiU3BlY2lmaWVkIHZpZGVvIGlucHV0OiAgICAgUy1WaWRlbyAoTHVtYSBJbiVkLCBDaHJvbWEgSW4lZClcbiIsCisJCQkodmlkX2lucHV0ICYgMHhmMCkgPj4gNCwgKHZpZF9pbnB1dCAmIDB4ZjAwKSA+PiA4KTsKKwl9CisKKwl2NGxfaW5mbyhjbGllbnQsICJTcGVjaWZpZWQgYXVkaW9jbG9jayBmcmVxOiAlZCBIelxuIiwgc3RhdGUtPmF1ZGNsa19mcmVxKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgbG9nX2F1ZGlvX3N0YXR1cyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBjeDI1ODQwX3N0YXRlICpzdGF0ZSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwogCXU4IGRvd25sb2FkX2N0bCA9IGN4MjU4NDBfcmVhZChjbGllbnQsIDB4ODAzKTsKIAl1OCBtb2RfZGV0X3N0YXQwID0gY3gyNTg0MF9yZWFkKGNsaWVudCwgMHg4MDQpOwogCXU4IG1vZF9kZXRfc3RhdDEgPSBjeDI1ODQwX3JlYWQoY2xpZW50LCAweDgwNSk7CkBAIC05OTksMTUgKzEwMTYsOSBAQAogCXU4IHByZWZfbW9kZSA9IGN4MjU4NDBfcmVhZChjbGllbnQsIDB4ODA5KTsKIAl1OCBhZmMwID0gY3gyNTg0MF9yZWFkKGNsaWVudCwgMHg4MGIpOwogCXU4IG11dGVfY3RsID0gY3gyNTg0MF9yZWFkKGNsaWVudCwgMHg4ZDMpOwotCWludCB2aWRfaW5wdXQgPSBzdGF0ZS0+dmlkX2lucHV0OwogCWludCBhdWRfaW5wdXQgPSBzdGF0ZS0+YXVkX2lucHV0OwogCWNoYXIgKnA7CiAKLQl2NGxfaW5mbyhjbGllbnQsICJWaWRlbyBzaWduYWw6ICAgICAgICAgICAgICAlc3ByZXNlbnRcbiIsCi0JCSAgICAobWljcm9jdHJsX3ZpZGZtdCAmIDB4MTApID8gIiIgOiAibm90ICIpOwotCXY0bF9pbmZvKGNsaWVudCwgIkRldGVjdGVkIGZvcm1hdDogICAgICAgICAgICVzXG4iLAotCQkgICAgZm10X3N0cnNbZ2VuX3N0YXQxICYgMHhmXSk7Ci0KIAlzd2l0Y2ggKG1vZF9kZXRfc3RhdDApIHsKIAljYXNlIDB4MDA6IHAgPSAibW9ubyI7IGJyZWFrOwogCWNhc2UgMHgwMTogcCA9ICJzdGVyZW8iOyBicmVhazsKQEAgLTExMDcsMjUgKzExMTgsMTIgQEAKIAkJdjRsX2luZm8oY2xpZW50LCAiQ29uZmlndXJlZCBhdWRpbyBzeXN0ZW06ICAgJXNcbiIsIHApOwogCX0KIAotCXY0bF9pbmZvKGNsaWVudCwgIlNwZWNpZmllZCBzdGFuZGFyZDogICAgICAgICVzXG4iLAotCQkgICAgdmlkZm10X3NlbCA/IGZtdF9zdHJzW3ZpZGZtdF9zZWxdIDogImF1dG9tYXRpYyBkZXRlY3Rpb24iKTsKLQotCWlmICh2aWRfaW5wdXQgPj0gQ1gyNTg0MF9DT01QT1NJVEUxICYmCi0JICAgIHZpZF9pbnB1dCA8PSBDWDI1ODQwX0NPTVBPU0lURTgpIHsKLQkJdjRsX2luZm8oY2xpZW50LCAiU3BlY2lmaWVkIHZpZGVvIGlucHV0OiAgICAgQ29tcG9zaXRlICVkXG4iLAotCQkJdmlkX2lucHV0IC0gQ1gyNTg0MF9DT01QT1NJVEUxICsgMSk7Ci0JfSBlbHNlIHsKLQkJdjRsX2luZm8oY2xpZW50LCAiU3BlY2lmaWVkIHZpZGVvIGlucHV0OiAgICAgUy1WaWRlbyAoTHVtYSBJbiVkLCBDaHJvbWEgSW4lZClcbiIsCi0JCQkodmlkX2lucHV0ICYgMHhmMCkgPj4gNCwgKHZpZF9pbnB1dCAmIDB4ZjAwKSA+PiA4KTsKLQl9CiAJaWYgKGF1ZF9pbnB1dCkgewogCQl2NGxfaW5mbyhjbGllbnQsICJTcGVjaWZpZWQgYXVkaW8gaW5wdXQ6ICAgICBUdW5lciAoSW4lZClcbiIsIGF1ZF9pbnB1dCk7CiAJfSBlbHNlIHsKIAkJdjRsX2luZm8oY2xpZW50LCAiU3BlY2lmaWVkIGF1ZGlvIGlucHV0OiAgICAgRXh0ZXJuYWxcbiIpOwogCX0KIAotCXY0bF9pbmZvKGNsaWVudCwgIlNwZWNpZmllZCBhdWRpb2Nsb2NrIGZyZXE6ICVkIEh6XG4iLCBzdGF0ZS0+YXVkY2xrX2ZyZXEpOwotCiAJc3dpdGNoIChwcmVmX21vZGUgJiAweGYpIHsKIAljYXNlIDA6IHAgPSAibW9uby9sYW5ndWFnZSBBIjsgYnJlYWs7CiAJY2FzZSAxOiBwID0gImxhbmd1YWdlIEIiOyBicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyNTg0MC9jeDI1ODQwLWNvcmUuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyNTg0MC9jeDI1ODQwLWNvcmUuaAppbmRleCAxNzM2OTI5Li4yODA0OTA2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4NDAvY3gyNTg0MC1jb3JlLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODQwL2N4MjU4NDAtY29yZS5oCkBAIC0yNCw2ICsyNCw4IEBACiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAKK2V4dGVybiBpbnQgY3gyNTg0MF9kZWJ1ZzsKKwogLyogRU5BQkxFX1BWUjE1MF9XT1JLQVJPVU5EIGFjdGl2YXRlcyBhIHdvcmthcm91bmQgZm9yIGEgaGFyZHdhcmUgYnVnIHRoYXQgaXMKICAgIHByZXNlbnQgaW4gSGF1cHBhdWdlIFBWUi0xNTAgKGFuZCBwb3NzaWJseSBQVlItNTAwKSBjYXJkcyB0aGF0IGhhdmUKICAgIGNlcnRhaW4gTlRTQyB0dW5lcnMgKHR2ZWVwcm9tIHR1bmVyIG1vZGVsIG51bWJlcnMgODUsIDk5IGFuZCAxMTIpLiBUaGUKQEAgLTMzLDEyICszNSwxNiBAQAogI2RlZmluZSBDWDI1ODQwX0NJRF9FTkFCTEVfUFZSMTUwX1dPUktBUk9VTkQgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSswKQogCiBzdHJ1Y3QgY3gyNTg0MF9zdGF0ZSB7CisJc3RydWN0IGkyY19jbGllbnQgYzsKIAlpbnQgcHZyMTUwX3dvcmthcm91bmQ7CiAJaW50IHJhZGlvOwogCWVudW0gY3gyNTg0MF92aWRlb19pbnB1dCB2aWRfaW5wdXQ7CiAJZW51bSBjeDI1ODQwX2F1ZGlvX2lucHV0IGF1ZF9pbnB1dDsKIAl1MzIgYXVkY2xrX2ZyZXE7CiAJaW50IGF1ZG1vZGU7CisJaW50IHZiaV9saW5lX29mZnNldDsKKwllbnVtIHY0bDJfY2hpcF9pZGVudCBpZDsKKwlpbnQgaXNfY3gyNTgzNjsKIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC00Nyw3ICs1Myw3IEBACiBpbnQgY3gyNTg0MF93cml0ZTQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTE2IGFkZHIsIHUzMiB2YWx1ZSk7CiB1OCBjeDI1ODQwX3JlYWQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTE2IGFkZHIpOwogdTMyIGN4MjU4NDBfcmVhZDQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTE2IGFkZHIpOwotaW50IGN4MjU4NDBfYW5kX29yKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHUxNiBhZGRyLCB1OCBtYXNrLCB1OCB2YWx1ZSk7CitpbnQgY3gyNTg0MF9hbmRfb3Ioc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTE2IGFkZHIsIHVuc2lnbmVkIG1hc2ssIHU4IHZhbHVlKTsKIHY0bDJfc3RkX2lkIGN4MjU4NDBfZ2V0X3Y0bHN0ZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyNTg0MC9jeDI1ODQwLXZiaS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODQwL2N4MjU4NDAtdmJpLmMKaW5kZXggNTdmZWNhMi4uNmNjOGJmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODQwL2N4MjU4NDAtdmJpLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODQwL2N4MjU4NDAtdmJpLmMKQEAgLTg0LDY3ICs4NCwxNDAgQEAKIAogdm9pZCBjeDI1ODQwX3ZiaV9zZXR1cChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogeworCXN0cnVjdCBjeDI1ODQwX3N0YXRlICpzdGF0ZSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwogCXY0bDJfc3RkX2lkIHN0ZCA9IGN4MjU4NDBfZ2V0X3Y0bHN0ZChjbGllbnQpOworCWludCBoYmxhbmssaGFjdGl2ZSxidXJzdCx2YmxhbmssdmFjdGl2ZSxzYyx2Ymxhbms2NTYsc3JjX2RlY2ltYXRpb247CisJaW50IGx1bWFfbHBmLHV2X2xwZiwgY29tYjsKKwl1MzIgcGxsX2ludCxwbGxfZnJhYyxwbGxfcG9zdDsKIAorCS8qIGRhdGFzaGVldCBzdGFydHVwLCBzdGVwIDhkICovCiAJaWYgKHN0ZCAmIH5WNEwyX1NURF9OVFNDKSB7Ci0JCS8qIGRhdGFzaGVldCBzdGFydHVwLCBzdGVwIDhkICovCiAJCWN4MjU4NDBfd3JpdGUoY2xpZW50LCAweDQ5ZiwgMHgxMSk7Ci0KLQkJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4NDcwLCAweDg0KTsKLQkJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4NDcxLCAweDAwKTsKLQkJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4NDcyLCAweDJkKTsKLQkJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4NDczLCAweDVkKTsKLQotCQljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHg0NzQsIDB4MjQpOwotCQljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHg0NzUsIDB4NDApOwotCQljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHg0NzYsIDB4MjQpOwotCQljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHg0NzcsIDB4MjgpOwotCi0JCWN4MjU4NDBfd3JpdGUoY2xpZW50LCAweDQ3OCwgMHgxZik7Ci0JCWN4MjU4NDBfd3JpdGUoY2xpZW50LCAweDQ3OSwgMHgwMik7Ci0KLQkJaWYgKHN0ZCAmIFY0TDJfU1REX1NFQ0FNKSB7Ci0JCQljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHg0N2EsIDB4ODApOwotCQkJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4NDdiLCAweDAwKTsKLQkJCWN4MjU4NDBfd3JpdGUoY2xpZW50LCAweDQ3YywgMHg1Zik7Ci0JCQljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHg0N2QsIDB4NDIpOwotCQl9IGVsc2UgewotCQkJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4NDdhLCAweDkwKTsKLQkJCWN4MjU4NDBfd3JpdGUoY2xpZW50LCAweDQ3YiwgMHgyMCk7Ci0JCQljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHg0N2MsIDB4NjMpOwotCQkJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4NDdkLCAweDgyKTsKLQkJfQotCi0JCWN4MjU4NDBfd3JpdGUoY2xpZW50LCAweDQ3ZSwgMHgwYSk7Ci0JCWN4MjU4NDBfd3JpdGUoY2xpZW50LCAweDQ3ZiwgMHgwMSk7CiAJfSBlbHNlIHsKLQkJLyogZGF0YXNoZWV0IHN0YXJ0dXAsIHN0ZXAgOGQgKi8KIAkJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4NDlmLCAweDE0KTsKKwl9CiAKLQkJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4NDcwLCAweDdhKTsKLQkJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4NDcxLCAweDAwKTsKLQkJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4NDcyLCAweDJkKTsKLQkJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4NDczLCAweDViKTsKKwlpZiAoc3RkICYgVjRMMl9TVERfNjI1XzUwKSB7CisJCWhibGFuaz0weDA4NDsKKwkJaGFjdGl2ZT0weDJkMDsKKwkJYnVyc3Q9MHg1ZDsKKwkJdmJsYW5rPTB4MDI0OworCQl2YWN0aXZlPTB4MjQ0OworCQl2Ymxhbms2NTY9MHgyODsKKwkJc3JjX2RlY2ltYXRpb249MHgyMWY7CiAKLQkJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4NDc0LCAweDFhKTsKLQkJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4NDc1LCAweDcwKTsKLQkJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4NDc2LCAweDFlKTsKLQkJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4NDc3LCAweDFlKTsKKwkJbHVtYV9scGY9MjsKKwkJaWYgKHN0ZCAmIFY0TDJfU1REX1NFQ0FNKSB7CisJCQl1dl9scGY9MDsKKwkJCWNvbWI9MDsKKwkJCXNjPTB4MGE0MjVmOworCQl9IGVsc2UgeworCQkJdXZfbHBmPTE7CisJCQljb21iPTB4MjA7CisJCQlzYz0weDBhODI2MzsKKwkJfQorCX0gZWxzZSB7CisJCWhhY3RpdmU9NzIwOworCQloYmxhbms9MTIyOworCQl2YWN0aXZlPTQ4NzsKKwkJbHVtYV9scGY9MTsKKwkJdXZfbHBmPTE7CiAKLQkJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4NDc4LCAweDFmKTsKLQkJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4NDc5LCAweDAyKTsKLQkJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4NDdhLCAweDUwKTsKLQkJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4NDdiLCAweDY2KTsKKwkJc3JjX2RlY2ltYXRpb249MHgyMWY7CisJCWlmIChzdGQgPT0gVjRMMl9TVERfUEFMX00pIHsKKwkJCXZibGFuaz0yMDsKKwkJCXZibGFuazY1Nj0yNDsKKwkJCWJ1cnN0PTB4NjE7CisJCQljb21iPTB4MjA7CiAKLQkJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4NDdjLCAweDFmKTsKLQkJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4NDdkLCAweDdjKTsKLQkJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4NDdlLCAweDA4KTsKKwkJCXNjPTU1NTQ1MjsKKwkJfSBlbHNlIHsKKwkJCXZibGFuaz0yNjsKKwkJCXZibGFuazY1Nj0yNjsKKwkJCWJ1cnN0PTB4NWI7CisJCQljb21iPTB4NjY7CisJCQlzYz01NTYwNjM7CisJCX0KKwl9CisKKwkvKiBERUJVRzogRGlzcGxheXMgY29uZmlndXJlZCBQTEwgZnJlcXVlbmN5ICovCisJcGxsX2ludD1jeDI1ODQwX3JlYWQoY2xpZW50LCAweDEwOCk7CisJcGxsX2ZyYWM9Y3gyNTg0MF9yZWFkNChjbGllbnQsIDB4MTBjKSYweDFmZmZmZmY7CisJcGxsX3Bvc3Q9Y3gyNTg0MF9yZWFkKGNsaWVudCwgMHgxMDkpOworCXY0bF9kYmcoMSwgY3gyNTg0MF9kZWJ1ZywgY2xpZW50LAorCQkJCSJQTEwgcmVncyA9IGludDogJXUsIGZyYWM6ICV1LCBwb3N0OiAldVxuIiwKKwkJCQlwbGxfaW50LHBsbF9mcmFjLHBsbF9wb3N0KTsKKworCWlmIChwbGxfcG9zdCkgeworCQlpbnQgZmluLCBmc2M7CisJCWludCBwbGw9ICgyODYzNjM2M0wqKCgoKHU2NClwbGxfaW50KTw8MjVMKStwbGxfZnJhYykpID4+MjVMOworCisJCXBsbC89cGxsX3Bvc3Q7CisJCXY0bF9kYmcoMSwgY3gyNTg0MF9kZWJ1ZywgY2xpZW50LCAiUExMID0gJWQuJTA2ZCBNSHpcbiIsCisJCQkJCQlwbGwvMTAwMDAwMCwgcGxsJTEwMDAwMDApOworCQl2NGxfZGJnKDEsIGN4MjU4NDBfZGVidWcsIGNsaWVudCwgIlBMTC84ID0gJWQuJTA2ZCBNSHpcbiIsCisJCQkJCQlwbGwvODAwMDAwMCwgKHBsbC84KSUxMDAwMDAwKTsKKworCQlmaW49KCh1NjQpc3JjX2RlY2ltYXRpb24qcGxsKT4+MTI7CisJCXY0bF9kYmcoMSwgY3gyNTg0MF9kZWJ1ZywgY2xpZW50LCAiQURDIFNhbXBsaW5nIGZyZXEgPSAiCisJCQkJCQkiJWQuJTA2ZCBNSHpcbiIsCisJCQkJCQlmaW4vMTAwMDAwMCxmaW4lMTAwMDAwMCk7CisKKwkJZnNjPSAoKCh1NjQpc2MpKnBsbCkgPj4gMjRMOworCQl2NGxfZGJnKDEsIGN4MjU4NDBfZGVidWcsIGNsaWVudCwgIkNocm9tYSBzdWItY2FycmllciBmcmVxID0gIgorCQkJCQkJIiVkLiUwNmQgTUh6XG4iLAorCQkJCQkJZnNjLzEwMDAwMDAsZnNjJTEwMDAwMDApOworCisJCXY0bF9kYmcoMSwgY3gyNTg0MF9kZWJ1ZywgY2xpZW50LCAiaGJsYW5rICVpLCBoYWN0aXZlICVpLCAiCisJCQkidmJsYW5rICVpICwgdmFjdGl2ZSAlaSwgdmJsYW5rNjU2ICVpLCBzcmNfZGVjICVpLCIKKwkJCSJidXJzdCAweCUwMngsIGx1bWFfbHBmICVpLCB1dl9scGYgJWksIGNvbWIgMHglMDJ4LCIKKwkJCSIgc2MgMHglMDZ4XG4iLAorCQkJaGJsYW5rLCBoYWN0aXZlLCB2YmxhbmssIHZhY3RpdmUsIHZibGFuazY1NiwKKwkJCXNyY19kZWNpbWF0aW9uLCBidXJzdCwgbHVtYV9scGYsIHV2X2xwZiwgY29tYiwgc2MpOworCX0KKworCS8qIFNldHMgaG9yaXpvbnRhbCBibGFua2luZyBkZWxheSBhbmQgYWN0aXZlIGxpbmVzICovCisJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4NDcwLCBoYmxhbmspOworCWN4MjU4NDBfd3JpdGUoY2xpZW50LCAweDQ3MSwgMHhmZiYoKChoYmxhbms+PjgpJjB4Myl8KGhhY3RpdmUgPDw0KSkpOworCWN4MjU4NDBfd3JpdGUoY2xpZW50LCAweDQ3MiwgaGFjdGl2ZT4+NCk7CisKKwkvKiBTZXRzIGJ1cnN0IGdhdGUgZGVsYXkgKi8KKwljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHg0NzMsIGJ1cnN0KTsKKworCS8qIFNldHMgdmVydGljYWwgYmxhbmtpbmcgZGVsYXkgYW5kIGFjdGl2ZSBkdXJhdGlvbiAqLworCWN4MjU4NDBfd3JpdGUoY2xpZW50LCAweDQ3NCwgdmJsYW5rKTsKKwljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHg0NzUsIDB4ZmYmKCgodmJsYW5rPj44KSYweDMpfCh2YWN0aXZlIDw8NCkpKTsKKwljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHg0NzYsIHZhY3RpdmU+PjQpOworCWN4MjU4NDBfd3JpdGUoY2xpZW50LCAweDQ3NywgdmJsYW5rNjU2KTsKKworCS8qIFNldHMgc3JjIGRlY2ltYXRpb24gcmF0ZSAqLworCWN4MjU4NDBfd3JpdGUoY2xpZW50LCAweDQ3OCwgMHhmZiZzcmNfZGVjaW1hdGlvbik7CisJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4NDc5LCAweGZmJihzcmNfZGVjaW1hdGlvbj4+OCkpOworCisJLyogU2V0cyBMdW1hIGFuZCBVViBMb3cgcGFzcyBmaWx0ZXJzICovCisJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4NDdhLCBsdW1hX2xwZjw8NnwoKHV2X2xwZjw8NCkmMHgzMCkpOworCisJLyogRW5hYmxlcyBjb21iIGZpbHRlcnMgKi8KKwljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHg0N2IsIGNvbWIpOworCisJLyogU2V0cyBTQyBTdGVwKi8KKwljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHg0N2MsIHNjKTsKKwljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHg0N2QsIDB4ZmYmc2M+PjgpOworCWN4MjU4NDBfd3JpdGUoY2xpZW50LCAweDQ3ZSwgMHhmZiZzYz4+MTYpOworCisJLyogU2V0cyBWQkkgcGFyYW1ldGVycyAqLworCWlmIChzdGQgJiBWNEwyX1NURF82MjVfNTApIHsKKwkJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4NDdmLCAweDAxKTsKKwkJc3RhdGUtPnZiaV9saW5lX29mZnNldCA9IDU7CisJfSBlbHNlIHsKIAkJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4NDdmLCAweDAwKTsKKwkJc3RhdGUtPnZiaV9saW5lX29mZnNldCA9IDg7CiAJfQogfQogCiBpbnQgY3gyNTg0MF92Ymkoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQogeworCXN0cnVjdCBjeDI1ODQwX3N0YXRlICpzdGF0ZSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwogCXN0cnVjdCB2NGwyX2Zvcm1hdCAqZm10OwogCXN0cnVjdCB2NGwyX3NsaWNlZF92YmlfZm9ybWF0ICpzdmJpOwogCkBAIC0xODIsNyArMjU1LDcgQEAKIAogCWNhc2UgVklESU9DX1NfRk1UOgogCXsKLQkJaW50IGlzX3BhbCA9ICEoY3gyNTg0MF9nZXRfdjRsc3RkKGNsaWVudCkgJiBWNEwyX1NURF9OVFNDKTsKKwkJaW50IGlzX3BhbCA9ICEoY3gyNTg0MF9nZXRfdjRsc3RkKGNsaWVudCkgJiBWNEwyX1NURF81MjVfNjApOwogCQlpbnQgdmJpX29mZnNldCA9IGlzX3BhbCA/IDEgOiAwOwogCQlpbnQgaSwgeDsKIAkJdTggbGNyWzI0XTsKQEAgLTIxMSw3ICsyODQsNyBAQAogCQljeDI1ODQwX3ZiaV9zZXR1cChjbGllbnQpOwogCiAJCS8qIFNsaWNlZCBWQkkgKi8KLQkJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4NDA0LCAweDM2KTsJLyogQW5jaWxsZXJ5IGRhdGEgKi8KKwkJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4NDA0LCAweDMyKTsJLyogQW5jaWxsYXJ5IGRhdGEgKi8KIAkJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4NDA2LCAweDEzKTsKIAkJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4NDdmLCB2Ymlfb2Zmc2V0KTsKIApAQCAtMjQ4LDggKzMyMSwxOCBAQAogCQkJfQogCQl9CiAKLQkJZm9yICh4ID0gMSwgaSA9IDB4NDI0OyBpIDw9IDB4NDM0OyBpKyssIHgrKykgewotCQkJY3gyNTg0MF93cml0ZShjbGllbnQsIGksIGxjcls2ICsgeF0pOworCQlpZiAoaXNfcGFsKSB7CisJCQlmb3IgKHggPSAxLCBpID0gMHg0MjQ7IGkgPD0gMHg0MzQ7IGkrKywgeCsrKSB7CisJCQkJY3gyNTg0MF93cml0ZShjbGllbnQsIGksIGxjcls2ICsgeF0pOworCQkJfQorCQl9CisJCWVsc2UgeworCQkJZm9yICh4ID0gMSwgaSA9IDB4NDI0OyBpIDw9IDB4NDMwOyBpKyssIHgrKykgeworCQkJCWN4MjU4NDBfd3JpdGUoY2xpZW50LCBpLCBsY3JbOSArIHhdKTsKKwkJCX0KKwkJCWZvciAoaSA9IDB4NDMxOyBpIDw9IDB4NDM0OyBpKyspIHsKKwkJCQljeDI1ODQwX3dyaXRlKGNsaWVudCwgaSwgMCk7CisJCQl9CiAJCX0KIAogCQljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHg0M2MsIDB4MTYpOwpAQCAtMjU3LDcgKzM0MCw3IEBACiAJCWlmIChpc19wYWwpIHsKIAkJCWN4MjU4NDBfd3JpdGUoY2xpZW50LCAweDQ3NCwgMHgyYSk7CiAJCX0gZWxzZSB7Ci0JCQljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHg0NzQsIDB4MWEgKyA2KTsKKwkJCWN4MjU4NDBfd3JpdGUoY2xpZW50LCAweDQ3NCwgMHgyMik7CiAJCX0KIAkJYnJlYWs7CiAJfQpAQCAtMjc4LDcgKzM2MSw3IEBACiAJCWlkMSA9IHBbLTFdOwogCQlpZDIgPSBwWzBdICYgMHhmOwogCQlsID0gcFsyXSAmIDB4M2Y7Ci0JCWwgKz0gNTsKKwkJbCArPSBzdGF0ZS0+dmJpX2xpbmVfb2Zmc2V0OwogCQlwICs9IDQ7CiAKIAkJc3dpdGNoIChpZDIpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L0tjb25maWcKaW5kZXggNjMwMjczOS4uODBlMjNlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L0tjb25maWcKQEAgLTM1LDEzICszNSwyNSBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgY3g4OC1hbHNhLgogCitjb25maWcgVklERU9fQ1g4OF9CTEFDS0JJUkQKKwl0cmlzdGF0ZSAiQmxhY2tiaXJkIE1QRUcgZW5jb2RlciBzdXBwb3J0IChjeDIzODh4ICsgY3gyMzQxNikiCisJZGVwZW5kcyBvbiBWSURFT19DWDg4CisJc2VsZWN0IFZJREVPX0NYMjM0MVgKKwktLS1oZWxwLS0tCisJICBUaGlzIGFkZHMgc3VwcG9ydCBmb3IgTVBFRyBlbmNvZGVyIGNhcmRzIGJhc2VkIG9uIHRoZQorCSAgQmxhY2tiaXJkIHJlZmVyZW5jZSBkZXNpZ24sIHVzaW5nIHRoZSBDb25leGFudCAyMzg4eAorCSAgYW5kIDIzNDE2IGNoaXBzLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBjeDg4LWJsYWNrYmlyZC4KKwogY29uZmlnIFZJREVPX0NYODhfRFZCCiAJdHJpc3RhdGUgIkRWQi9BVFNDIFN1cHBvcnQgZm9yIGN4MjM4OHggYmFzZWQgVFYgY2FyZHMiCiAJZGVwZW5kcyBvbiBWSURFT19DWDg4ICYmIERWQl9DT1JFCiAJc2VsZWN0IFZJREVPX0JVRl9EVkIKIAktLS1oZWxwLS0tCiAJICBUaGlzIGFkZHMgc3VwcG9ydCBmb3IgRFZCL0FUU0MgY2FyZHMgYmFzZWQgb24gdGhlCi0JICBDb25uZXhhbnQgMjM4OHggY2hpcC4KKwkgIENvbmV4YW50IDIzODh4IGNoaXAuCiAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGN4ODgtZHZiLgpAQCAtNjEsNiArNzMsNyBAQAogCXNlbGVjdCBEVkJfTEdEVDMzMFgKIAlzZWxlY3QgRFZCX05YVDIwMFgKIAlzZWxlY3QgRFZCX0NYMjQxMjMKKwlzZWxlY3QgRFZCX0lTTDY0MjEKIAktLS1oZWxwLS0tCiAJICBUaGlzIGJ1aWxkcyBjeDg4LWR2YiB3aXRoIGFsbCBjdXJyZW50bHkgc3VwcG9ydGVkIGZyb250ZW5kCiAJICBkZW1vZHVsYXRvcnMuICBJZiB5b3Ugd2lzaCB0byB0d2VhayB5b3VyIGNvbmZpZ3VyYXRpb24sIGFuZApAQCAtMTM5LDYgKzE1Miw3IEBACiAJZGVmYXVsdCB5CiAJZGVwZW5kcyBvbiBWSURFT19DWDg4X0RWQiAmJiAhVklERU9fQ1g4OF9EVkJfQUxMX0ZST05URU5EUwogCXNlbGVjdCBEVkJfQ1gyNDEyMworCXNlbGVjdCBEVkJfSVNMNjQyMQogCS0tLWhlbHAtLS0KIAkgIFRoaXMgYWRkcyBEVkItUyBzdXBwb3J0IGZvciBjYXJkcyBiYXNlZCBvbiB0aGUKIAkgIENvbm5leGFudCAyMzg4eCBjaGlwIGFuZCB0aGUgQ1gyNDEyMyBkZW1vZHVsYXRvci4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9NYWtlZmlsZQppbmRleCAwZGNkMDliLi4zNTJiOTE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L01ha2VmaWxlCkBAIC0zLDkgKzMsMTAgQEAKIGN4ODgwMC1vYmpzCTo9IGN4ODgtdmlkZW8ubyBjeDg4LXZiaS5vCiBjeDg4MDItb2Jqcwk6PSBjeDg4LW1wZWcubwogCi1vYmotJChDT05GSUdfVklERU9fQ1g4OCkgKz0gY3g4OHh4Lm8gY3g4ODAwLm8gY3g4ODAyLm8gY3g4OC1ibGFja2JpcmQubwotb2JqLSQoQ09ORklHX1ZJREVPX0NYODhfRFZCKSArPSBjeDg4LWR2Yi5vCitvYmotJChDT05GSUdfVklERU9fQ1g4OCkgKz0gY3g4OHh4Lm8gY3g4ODAwLm8gY3g4ODAyLm8KIG9iai0kKENPTkZJR19WSURFT19DWDg4X0FMU0EpICs9IGN4ODgtYWxzYS5vCitvYmotJChDT05GSUdfVklERU9fQ1g4OF9CTEFDS0JJUkQpICs9IGN4ODgtYmxhY2tiaXJkLm8KK29iai0kKENPTkZJR19WSURFT19DWDg4X0RWQikgKz0gY3g4OC1kdmIubwogb2JqLSQoQ09ORklHX1ZJREVPX0NYODhfVlAzMDU0KSArPSBjeDg4LXZwMzA1NC1pMmMubwogCiBFWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL3ZpZGVvCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1hbHNhLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1hbHNhLmMKaW5kZXggMzIwYjNkOS4uMjE5NGNiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtYWxzYS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWFsc2EuYwpAQCAtNCw3ICs0LDcgQEAKICAqICBQQ0kgZnVuY3Rpb24gIzEgb2YgdGhlIGN4MjM4OHguCiAgKgogICogICAgKGMpIDIwMDUsMjAwNiBSaWNhcmRvIENlcnF1ZWlyYSA8djRsQGNlcnF1ZWlyYS5vcmc+Ci0gKiAgICAoYykgMjAwNSBNYXVybyBDYXJ2YWxobyBDaGVoYWIgPG1jaGVoYWJAYnJ0dXJiby5jb20uYnI+CisgKiAgICAoYykgMjAwNSBNYXVybyBDYXJ2YWxobyBDaGVoYWIgPG1jaGVoYWJAaW5mcmFkZWFkLm9yZz4KICAqICAgIEJhc2VkIG9uIGEgZHVtbXkgY3g4OCBtb2R1bGUgYnkgR2VyZCBLbm9yciA8a3JheGVsQGJ5dGVzZXgub3JnPgogICogICAgQmFzZWQgb24gZHVtbXkuYyBieSBKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHN1c2UuY3o+CiAgKgpAQCAtMTExLDcgKzExMSw3IEBACiAKIE1PRFVMRV9ERVNDUklQVElPTigiQUxTQSBkcml2ZXIgbW9kdWxlIGZvciBjeDIzODh4IGJhc2VkIFRWIGNhcmRzIik7CiBNT0RVTEVfQVVUSE9SKCJSaWNhcmRvIENlcnF1ZWlyYSIpOwotTU9EVUxFX0FVVEhPUigiTWF1cm8gQ2FydmFsaG8gQ2hlaGFiIDxtY2hlaGFiQGJydHVyYm8uY29tLmJyPiIpOworTU9EVUxFX0FVVEhPUigiTWF1cm8gQ2FydmFsaG8gQ2hlaGFiIDxtY2hlaGFiQGluZnJhZGVhZC5vcmc+Iik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgie3tDb25leGFudCwyMzg4MX0sIgogCQkJInt7Q29uZXhhbnQsMjM4ODJ9LCIKQEAgLTY5Niw3ICs2OTYsNiBAQAogCWNoaXAtPmlycSA9IC0xOwogCXNwaW5fbG9ja19pbml0KCZjaGlwLT5yZWdfbG9jayk7CiAKLQljeDg4X3Jlc2V0KGNvcmUpOwogCWNoaXAtPmNvcmUgPSBjb3JlOwogCiAJLyogZ2V0IGlycSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtYmxhY2tiaXJkLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1ibGFja2JpcmQuYwppbmRleCBlMTAwZDhlLi43OGRmNjY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1ibGFja2JpcmQuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1ibGFja2JpcmQuYwpAQCAtMzAsOSArMzAsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KKyNpbmNsdWRlIDxtZWRpYS9jeDIzNDF4Lmg+CiAKICNpbmNsdWRlICJjeDg4LmgiCi0jaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KIAogTU9EVUxFX0RFU0NSSVBUSU9OKCJkcml2ZXIgZm9yIGN4MjM4OHgvY3gyMzQxNiBiYXNlZCBtcGVnIGVuY29kZXIgY2FyZHMiKTsKIE1PRFVMRV9BVVRIT1IoIkplbGxlIEZva3MgPGplbGxlQGZva3MuOG0uY29tPiwgR2VyZCBLbm9yciA8a3JheGVsQGJ5dGVzZXgub3JnPiBbU3VTRSBMYWJzXSIpOwpAQCAtNTMsNyArNTQsNiBAQAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotI2RlZmluZSBCTEFDS0JJUkRfRklSTV9FTkNfRklMRU5BTUUgImJsYWNrYmlyZC1mdy1lbmMuYmluIgogI2RlZmluZSBCTEFDS0JJUkRfRklSTV9JTUFHRV9TSVpFIDI1NioxMDI0CiAKIC8qIGRlZmluZXMgYmVsb3cgYXJlIGZyb20gaXZ0di1kcml2ZXIuaCAqLwpAQCAtNjMsOCArNjMsNiBAQAogLyogRmlybXdhcmUgQVBJIGNvbW1hbmRzICovCiAjZGVmaW5lIElWVFZfQVBJX1NURF9USU1FT1VUIDUwMAogCi0jZGVmaW5lIEJMQUNLQklSRF9BUElfUElORyAgICAgICAgICAgICAgIDB4ODAKLSNkZWZpbmUgQkxBQ0tCSVJEX0FQSV9CRUdJTl9DQVBUVVJFICAgICAgMHg4MQogZW51bSBibGFja2JpcmRfY2FwdHVyZV90eXBlIHsKIAlCTEFDS0JJUkRfTVBFR19DQVBUVVJFLAogCUJMQUNLQklSRF9SQVdfQ0FQVFVSRSwKQEAgLTc4LDIwNSArNzYsMjkgQEAKIAlCTEFDS0JJUkRfUkFXX0JJVFNfUEFTU1RIUlVfQ0FQVFVSRSA9IDB4MDgsCiAJQkxBQ0tCSVJEX1JBV19CSVRTX1RPX0hPU1RfQ0FQVFVSRSAgPSAweDEwCiB9OwotI2RlZmluZSBCTEFDS0JJUkRfQVBJX0VORF9DQVBUVVJFICAgICAgICAweDgyCiBlbnVtIGJsYWNrYmlyZF9jYXB0dXJlX2VuZCB7CiAJQkxBQ0tCSVJEX0VORF9BVF9HT1AsIC8qIHN0b3AgYXQgdGhlIGVuZCBvZiBnb3AsIGdlbmVyYXRlIGlycSAqLwogCUJMQUNLQklSRF9FTkRfTk9XLCAvKiBzdG9wIGltbWVkaWF0ZWx5LCBubyBpcnEgKi8KIH07Ci0jZGVmaW5lIEJMQUNLQklSRF9BUElfU0VUX0FVRElPX0lEICAgICAgIDB4ODkKLSNkZWZpbmUgQkxBQ0tCSVJEX0FQSV9TRVRfVklERU9fSUQgICAgICAgMHg4QgotI2RlZmluZSBCTEFDS0JJUkRfQVBJX1NFVF9QQ1JfSUQgICAgICAgICAweDhECi0jZGVmaW5lIEJMQUNLQklSRF9BUElfU0VUX0ZSQU1FUkFURSAgICAgIDB4OEYKIGVudW0gYmxhY2tiaXJkX2ZyYW1lcmF0ZSB7CiAJQkxBQ0tCSVJEX0ZSQU1FUkFURV9OVFNDXzMwLCAvKiBOVFNDOiAzMGZwcyAqLwogCUJMQUNLQklSRF9GUkFNRVJBVEVfUEFMXzI1ICAgLyogUEFMOiAyNWZwcyAqLwogfTsKLSNkZWZpbmUgQkxBQ0tCSVJEX0FQSV9TRVRfUkVTT0xVVElPTiAgICAgMHg5MQotI2RlZmluZSBCTEFDS0JJUkRfQVBJX1NFVF9WSURFT19CSVRSQVRFICAweDk1Ci1lbnVtIGJsYWNrYmlyZF92aWRlb19iaXRyYXRlX3R5cGUgewotCUJMQUNLQklSRF9WSURFT19WQlIsCi0JQkxBQ0tCSVJEX1ZJREVPX0NCUgotfTsKLSNkZWZpbmUgQkxBQ0tCSVJEX1BFQUtfUkFURV9ESVZJU09SIDQwMAotZW51bSBibGFja2JpcmRfbXV4X3JhdGUgewotCUJMQUNLQklSRF9NVVhfUkFURV9ERUZBVUxULAotCSAvKiBkdmQgbXV4IHJhdGU6IG11bHRpcGx5IGJ5IDQwMCB0byBnZXQgdGhlIGFjdHVhbCByYXRlICovCi0JQkxBQ0tCSVJEX01VWF9SQVRFX0RWRCA9IDI1MjAwCi19OwotI2RlZmluZSBCTEFDS0JJUkRfQVBJX1NFVF9HT1BfU1RSVUNUVVJFICAweDk3Ci0jZGVmaW5lIEJMQUNLQklSRF9BUElfU0VUX0FTUEVDVF9SQVRJTyAgIDB4OTkKLWVudW0gYmxhY2tiaXJkX2FzcGVjdF9yYXRpbyB7Ci0JQkxBQ0tCSVJEX0FTUEVDVF9SQVRJT19GT1JCSURERU4sCi0JQkxBQ0tCSVJEX0FTUEVDVF9SQVRJT18xXzFfU1FVQVJFLAotCUJMQUNLQklSRF9BU1BFQ1RfUkFUSU9fNF8zLAotCUJMQUNLQklSRF9BU1BFQ1RfUkFUSU9fMTZfOSwKLQlCTEFDS0JJUkRfQVNQRUNUX1JBVElPXzIyMV8xMDAsCi0JQkxBQ0tCSVJEX0FTUEVDVF9SQVRJT19SRVNFUlZFRAotfTsKLSNkZWZpbmUgQkxBQ0tCSVJEX0FQSV9TRVRfRE5SX01PREUgICAgICAgMHg5QgotZW51bSBibGFja2JpcmRfZG5yX2JpdHMgewotCUJMQUNLQklSRF9ETlJfQklUU19NQU5VQUwsCi0JQkxBQ0tCSVJEX0ROUl9CSVRTX0FVVE9fU1BBVElBTCwKLQlCTEFDS0JJUkRfRE5SX0JJVFNfQVVUT19URU1QT1JBTCwKLQlCTEFDS0JJUkRfRE5SX0JJVFNfQVVUTwotfTsKLWVudW0gYmxhY2tiaXJkX21lZGlhbl9maWx0ZXIgewotCUJMQUNLQklSRF9NRURJQU5fRklMVEVSX0RJU0FCTEVELAotCUJMQUNLQklSRF9NRURJQU5fRklMVEVSX0hPUklaT05UQUwsCi0JQkxBQ0tCSVJEX01FRElBTl9GSUxURVJfVkVSVElDQUwsCi0JQkxBQ0tCSVJEX01FRElBTl9GSUxURVJfSFYsCi0JQkxBQ0tCSVJEX01FRElBTl9GSUxURVJfRElBR09OQUwKLX07Ci0jZGVmaW5lIEJMQUNLQklSRF9BUElfU0VUX01BTlVBTF9ETlIgICAgIDB4OUQKLSNkZWZpbmUgQkxBQ0tCSVJEX0FQSV9TRVRfRE5SX01FRElBTiAgICAgMHg5RgotI2RlZmluZSBCTEFDS0JJUkRfQVBJX1NFVF9TUEFUSUFMX0ZJTFRFUiAweEExCi1lbnVtIGJsYWNrYmlyZF9zcGF0aWFsX2ZpbHRlcl9sdW1hIHsKLQlCTEFDS0JJUkRfU1BBVElBTF9GSUxURVJfTFVNQV9ESVNBQkxFRCwKLQlCTEFDS0JJUkRfU1BBVElBTF9GSUxURVJfTFVNQV8xRF9IT1JJWiwKLQlCTEFDS0JJUkRfU1BBVElBTF9GSUxURVJfTFVNQV8xRF9WRVJULAotCUJMQUNLQklSRF9TUEFUSUFMX0ZJTFRFUl9MVU1BXzJEX0hWLCAvKiBzZXBhcmFibGUsIGRlZmF1bHQgKi8KLQlCTEFDS0JJUkRfU1BBVElBTF9GSUxURVJfTFVNQV8yRF9TWU1NIC8qIHN5bW1ldHJpYyBub24tc2VwYXJhYmxlICovCi19OwotZW51bSBibGFja2JpcmRfc3BhdGlhbF9maWx0ZXJfY2hyb21hIHsKLQlCTEFDS0JJUkRfU1BBVElBTF9GSUxURVJfQ0hST01BX0RJU0FCTEVELAotCUJMQUNLQklSRF9TUEFUSUFMX0ZJTFRFUl9DSFJPTUFfMURfSE9SSVogLyogZGVmYXVsdCAqLwotfTsKLSNkZWZpbmUgQkxBQ0tCSVJEX0FQSV9TRVRfM18yX1BVTExET1dOICAgMHhCMQotZW51bSBibGFja2JpcmRfcHVsbGRvd24gewotCUJMQUNLQklSRF8zXzJfUFVMTERPV05fRElTQUJMRUQsCi0JQkxBQ0tCSVJEXzNfMl9QVUxMRE9XTl9FTkFCTEVECi19OwotI2RlZmluZSBCTEFDS0JJUkRfQVBJX1NFVF9WQklfTElORV9OTyAgICAweEI3Ci1lbnVtIGJsYWNrYmlyZF92YmlfbGluZV9iaXRzIHsKLQlCTEFDS0JJUkRfVkJJX0xJTkVfQklUU19UT1BfRklFTEQsCi0JQkxBQ0tCSVJEX1ZCSV9MSU5FX0JJVFNfQk9UX0ZJRUxEID0gKDEgPDwgMzEpLAotCUJMQUNLQklSRF9WQklfTElORV9CSVRTX0FMTF9MSU5FUyA9IDB4RkZGRkZGRkYKLX07Ci1lbnVtIGJsYWNrYmlyZF92YmlfbGluZSB7Ci0JQkxBQ0tCSVJEX1ZCSV9MSU5FX0RJU0FCTEVELAotCUJMQUNLQklSRF9WQklfTElORV9FTkFCTEVECi19OwotZW51bSBibGFja2JpcmRfdmJpX3NsaWNpbmcgewotCUJMQUNLQklSRF9WQklfU0xJQ0lOR19OT05FLAotCUJMQUNLQklSRF9WQklfU0xJQ0lOR19DTE9TRURfQ0FQVElPTgotfTsKLSNkZWZpbmUgQkxBQ0tCSVJEX0FQSV9TRVRfU1RSRUFNX1RZUEUgICAgMHhCOQotZW51bSBibGFja2JpcmRfc3RyZWFtX3R5cGUgewotCUJMQUNLQklSRF9TVFJFQU1fUFJPR1JBTSwKLQlCTEFDS0JJUkRfU1RSRUFNX1RSQU5TUE9SVCwKLQlCTEFDS0JJUkRfU1RSRUFNX01QRUcxLAotCUJMQUNLQklSRF9TVFJFQU1fUEVTX0FWLAotCUJMQUNLQklSRF9TVFJFQU1fVU5LTk9XTjQsCi0JQkxBQ0tCSVJEX1NUUkVBTV9QRVNfVklERU8sCi0JQkxBQ0tCSVJEX1NUUkVBTV9VTktOT1dONiwKLQlCTEFDS0JJUkRfU1RSRUFNX1BFU19BVURJTywKLQlCTEFDS0JJUkRfU1RSRUFNX1VOS05PV044LAotCUJMQUNLQklSRF9TVFJFQU1fVU5LTk9XTjksIC8qIGF1ZGlvL3BjbSA/ICovCi0JQkxBQ0tCSVJEX1NUUkVBTV9EVkQsCi0JQkxBQ0tCSVJEX1NUUkVBTV9WQ0QsCi0JQkxBQ0tCSVJEX1NUUkVBTV9VTktOT1dOMTIgLyogc3ZjZC94dmNkID8gKi8KLX07Ci0jZGVmaW5lIEJMQUNLQklSRF9BUElfU0VUX09VVFBVVF9QT1JUICAgIDB4QkIKIGVudW0gYmxhY2tiaXJkX3N0cmVhbV9wb3J0IHsKIAlCTEFDS0JJUkRfT1VUUFVUX1BPUlRfTUVNT1JZLAogCUJMQUNLQklSRF9PVVRQVVRfUE9SVF9TVFJFQU1JTkcsCiAJQkxBQ0tCSVJEX09VVFBVVF9QT1JUX1NFUklBTAogfTsKLSNkZWZpbmUgQkxBQ0tCSVJEX0FQSV9TRVRfQVVESU9fUEFSQU1TICAgMHhCRAotZW51bSBibGFja2JpcmRfYXVkaW9fYml0c19zYW1wbGVfcmF0ZSB7Ci0JQkxBQ0tCSVJEX0FVRElPX0JJVFNfNDQxMDBIWiwKLQlCTEFDS0JJUkRfQVVESU9fQklUU180ODAwMEhaLAotCUJMQUNLQklSRF9BVURJT19CSVRTXzMyMDAwSFosCi0JQkxBQ0tCSVJEX0FVRElPX0JJVFNfUkVTRVJWRURfSFosCi19OwotZW51bSBibGFja2JpcmRfYXVkaW9fYml0c19lbmNvZGluZyB7Ci0JQkxBQ0tCSVJEX0FVRElPX0JJVFNfTEFZRVJfMSA9IDB4MSA8PCAyLAotCUJMQUNLQklSRF9BVURJT19CSVRTX0xBWUVSXzIgPSAweDIgPDwgMiwKLX07Ci1lbnVtIGJsYWNrYmlyZF9hdWRpb19iaXRzX2JpdHJhdGVfbGF5ZXJfMSB7Ci0JQkxBQ0tCSVJEX0FVRElPX0JJVFNfTEFZRVJfMV9GUkVFX0ZPUk1BVCwKLQlCTEFDS0JJUkRfQVVESU9fQklUU19MQVlFUl8xXzMyICA9IDB4MDEgPDwgNCwKLQlCTEFDS0JJUkRfQVVESU9fQklUU19MQVlFUl8xXzY0ICA9IDB4MDIgPDwgNCwKLQlCTEFDS0JJUkRfQVVESU9fQklUU19MQVlFUl8xXzk2ICA9IDB4MDMgPDwgNCwKLQlCTEFDS0JJUkRfQVVESU9fQklUU19MQVlFUl8xXzEyOCA9IDB4MDQgPDwgNCwKLQlCTEFDS0JJUkRfQVVESU9fQklUU19MQVlFUl8xXzE2MCA9IDB4MDUgPDwgNCwKLQlCTEFDS0JJUkRfQVVESU9fQklUU19MQVlFUl8xXzE5MiA9IDB4MDYgPDwgNCwKLQlCTEFDS0JJUkRfQVVESU9fQklUU19MQVlFUl8xXzIyNCA9IDB4MDcgPDwgNCwKLQlCTEFDS0JJUkRfQVVESU9fQklUU19MQVlFUl8xXzI1NiA9IDB4MDggPDwgNCwKLQlCTEFDS0JJUkRfQVVESU9fQklUU19MQVlFUl8xXzI4OCA9IDB4MDkgPDwgNCwKLQlCTEFDS0JJUkRfQVVESU9fQklUU19MQVlFUl8xXzMyMCA9IDB4MEEgPDwgNCwKLQlCTEFDS0JJUkRfQVVESU9fQklUU19MQVlFUl8xXzM1MiA9IDB4MEIgPDwgNCwKLQlCTEFDS0JJUkRfQVVESU9fQklUU19MQVlFUl8xXzM4NCA9IDB4MEMgPDwgNCwKLQlCTEFDS0JJUkRfQVVESU9fQklUU19MQVlFUl8xXzQxNiA9IDB4MEQgPDwgNCwKLQlCTEFDS0JJUkRfQVVESU9fQklUU19MQVlFUl8xXzQ0OCA9IDB4MEUgPDwgNCwKLX07Ci1lbnVtIGJsYWNrYmlyZF9hdWRpb19iaXRzX2JpdHJhdGVfbGF5ZXJfMiB7Ci0JQkxBQ0tCSVJEX0FVRElPX0JJVFNfTEFZRVJfMl9GUkVFX0ZPUk1BVCwKLQlCTEFDS0JJUkRfQVVESU9fQklUU19MQVlFUl8yXzMyICA9IDB4MDEgPDwgNCwKLQlCTEFDS0JJUkRfQVVESU9fQklUU19MQVlFUl8yXzQ4ICA9IDB4MDIgPDwgNCwKLQlCTEFDS0JJUkRfQVVESU9fQklUU19MQVlFUl8yXzU2ICA9IDB4MDMgPDwgNCwKLQlCTEFDS0JJUkRfQVVESU9fQklUU19MQVlFUl8yXzY0ICA9IDB4MDQgPDwgNCwKLQlCTEFDS0JJUkRfQVVESU9fQklUU19MQVlFUl8yXzgwICA9IDB4MDUgPDwgNCwKLQlCTEFDS0JJUkRfQVVESU9fQklUU19MQVlFUl8yXzk2ICA9IDB4MDYgPDwgNCwKLQlCTEFDS0JJUkRfQVVESU9fQklUU19MQVlFUl8yXzExMiA9IDB4MDcgPDwgNCwKLQlCTEFDS0JJUkRfQVVESU9fQklUU19MQVlFUl8yXzEyOCA9IDB4MDggPDwgNCwKLQlCTEFDS0JJUkRfQVVESU9fQklUU19MQVlFUl8yXzE2MCA9IDB4MDkgPDwgNCwKLQlCTEFDS0JJUkRfQVVESU9fQklUU19MQVlFUl8yXzE5MiA9IDB4MEEgPDwgNCwKLQlCTEFDS0JJUkRfQVVESU9fQklUU19MQVlFUl8yXzIyNCA9IDB4MEIgPDwgNCwKLQlCTEFDS0JJUkRfQVVESU9fQklUU19MQVlFUl8yXzI1NiA9IDB4MEMgPDwgNCwKLQlCTEFDS0JJUkRfQVVESU9fQklUU19MQVlFUl8yXzMyMCA9IDB4MEQgPDwgNCwKLQlCTEFDS0JJUkRfQVVESU9fQklUU19MQVlFUl8yXzM4NCA9IDB4MEUgPDwgNCwKLX07Ci1lbnVtIGJsYWNrYmlyZF9hdWRpb19iaXRzX21vZGUgewotCUJMQUNLQklSRF9BVURJT19CSVRTX1NURVJFTywKLQlCTEFDS0JJUkRfQVVESU9fQklUU19KT0lOVF9TVEVSRU8gPSAweDEgPDwgOCwKLQlCTEFDS0JJUkRfQVVESU9fQklUU19EVUFMICAgICAgICAgPSAweDIgPDwgOCwKLQlCTEFDS0JJUkRfQVVESU9fQklUU19NT05PICAgICAgICAgPSAweDMgPDwgOCwKLX07Ci1lbnVtIGJsYWNrYmlyZF9hdWRpb19iaXRzX21vZGVfZXh0ZW5zaW9uIHsKLQlCTEFDS0JJUkRfQVVESU9fQklUU19CT1VORF80LAotCUJMQUNLQklSRF9BVURJT19CSVRTX0JPVU5EXzggID0gMHgxIDw8IDEwLAotCUJMQUNLQklSRF9BVURJT19CSVRTX0JPVU5EXzEyID0gMHgyIDw8IDEwLAotCUJMQUNLQklSRF9BVURJT19CSVRTX0JPVU5EXzE2ID0gMHgzIDw8IDEwLAotfTsKLWVudW0gYmxhY2tiaXJkX2F1ZGlvX2JpdHNfZW1waGFzaXMgewotCUJMQUNLQklSRF9BVURJT19CSVRTX0VNUEhBU0lTX05PTkUsCi0JQkxBQ0tCSVJEX0FVRElPX0JJVFNfRU1QSEFTSVNfNTBfMTUgICAgID0gMHgxIDw8IDEyLAotCUJMQUNLQklSRF9BVURJT19CSVRTX0VNUEhBU0lTX1JFU0VSVkVEICA9IDB4MiA8PCAxMiwKLQlCTEFDS0JJUkRfQVVESU9fQklUU19FTVBIQVNJU19DQ0lUVF9KMTcgPSAweDMgPDwgMTIsCi19OwotZW51bSBibGFja2JpcmRfYXVkaW9fYml0c19jcmMgewotCUJMQUNLQklSRF9BVURJT19CSVRTX0NSQ19PRkYsCi0JQkxBQ0tCSVJEX0FVRElPX0JJVFNfQ1JDX09OID0gMHgxIDw8IDE0LAotfTsKLWVudW0gYmxhY2tiaXJkX2F1ZGlvX2JpdHNfY29weXJpZ2h0IHsKLQlCTEFDS0JJUkRfQVVESU9fQklUU19DT1BZUklHSFRfT0ZGLAotCUJMQUNLQklSRF9BVURJT19CSVRTX0NPUFlSSUdIVF9PTiA9IDB4MSA8PCAxNSwKLX07Ci1lbnVtIGJsYWNrYmlyZF9hdWRpb19iaXRzX29yaWdpbmFsIHsKLQlCTEFDS0JJUkRfQVVESU9fQklUU19DT1BZLAotCUJMQUNLQklSRF9BVURJT19CSVRTX09SSUdJTkFMID0gMHgxIDw8IDE2LAotfTsKLSNkZWZpbmUgQkxBQ0tCSVJEX0FQSV9IQUxUICAgICAgICAgICAgICAgMHhDMwotI2RlZmluZSBCTEFDS0JJUkRfQVBJX0dFVF9WRVJTSU9OICAgICAgICAweEM0Ci0jZGVmaW5lIEJMQUNLQklSRF9BUElfU0VUX0dPUF9DTE9TVVJFICAgIDB4QzUKLWVudW0gYmxhY2tiaXJkX2dvcF9jbG9zdXJlIHsKLQlCTEFDS0JJUkRfR09QX0NMT1NVUkVfT0ZGLAotCUJMQUNLQklSRF9HT1BfQ0xPU1VSRV9PTiwKLX07Ci0jZGVmaW5lIEJMQUNLQklSRF9BUElfREFUQV9YRkVSX1NUQVRVUyAgIDB4QzYKIGVudW0gYmxhY2tiaXJkX2RhdGFfeGZlcl9zdGF0dXMgewogCUJMQUNLQklSRF9NT1JFX0JVRkZFUlNfRk9MTE9XLAogCUJMQUNLQklSRF9MQVNUX0JVRkZFUiwKIH07Ci0jZGVmaW5lIEJMQUNLQklSRF9BUElfUFJPR1JBTV9JTkRFWF9JTkZPIDB4QzcKIGVudW0gYmxhY2tiaXJkX3BpY3R1cmVfbWFzayB7CiAJQkxBQ0tCSVJEX1BJQ1RVUkVfTUFTS19OT05FLAogCUJMQUNLQklSRF9QSUNUVVJFX01BU0tfSV9GUkFNRVMsCiAJQkxBQ0tCSVJEX1BJQ1RVUkVfTUFTS19JX1BfRlJBTUVTID0gMHgzLAogCUJMQUNLQklSRF9QSUNUVVJFX01BU0tfQUxMX0ZSQU1FUyA9IDB4NywKIH07Ci0jZGVmaW5lIEJMQUNLQklSRF9BUElfU0VUX1ZCSV9QQVJBTVMgICAgIDB4QzgKIGVudW0gYmxhY2tiaXJkX3ZiaV9tb2RlX2JpdHMgewogCUJMQUNLQklSRF9WQklfQklUU19TTElDRUQsCiAJQkxBQ0tCSVJEX1ZCSV9CSVRTX1JBVywKQEAgLTI4OCwzMyArMTEwLDIzIEBACiAJQkxBQ0tCSVJEX1ZCSV9CSVRTX1NFUEFSQVRFX1NUUkVBTV9VU1JfREFUQSA9IDB4NCA8PCAxLAogCUJMQUNLQklSRF9WQklfQklUU19TRVBBUkFURV9TVFJFQU1fUFJWX0RBVEEgPSAweDUgPDwgMSwKIH07Ci0jZGVmaW5lIEJMQUNLQklSRF9BUElfU0VUX0RNQV9CTE9DS19TSVpFIDB4QzkKIGVudW0gYmxhY2tiaXJkX2RtYV91bml0IHsKIAlCTEFDS0JJUkRfRE1BX0JZVEVTLAogCUJMQUNLQklSRF9ETUFfRlJBTUVTLAogfTsKLSNkZWZpbmUgQkxBQ0tCSVJEX0FQSV9ETUFfVFJBTlNGRVJfSU5GTyAgMHhDQQotI2RlZmluZSBCTEFDS0JJUkRfQVBJX0RNQV9UUkFOU0ZFUl9TVEFUICAweENCCiBlbnVtIGJsYWNrYmlyZF9kbWFfdHJhbnNmZXJfc3RhdHVzX2JpdHMgewogCUJMQUNLQklSRF9ETUFfVFJBTlNGRVJfQklUU19ET05FID0gMHgwMSwKIAlCTEFDS0JJUkRfRE1BX1RSQU5TRkVSX0JJVFNfRVJST1IgPSAweDA0LAogCUJMQUNLQklSRF9ETUFfVFJBTlNGRVJfQklUU19MTF9FUlJPUiA9IDB4MTAsCiB9OwotI2RlZmluZSBCTEFDS0JJUkRfQVBJX1NFVF9ETUEySE9TVF9BRERSICAweENDCi0jZGVmaW5lIEJMQUNLQklSRF9BUElfSU5JVF9WSURFT19JTlBVVCAgIDB4Q0QKLSNkZWZpbmUgQkxBQ0tCSVJEX0FQSV9TRVRfRlJBTUVTS0lQICAgICAgMHhEMAotI2RlZmluZSBCTEFDS0JJUkRfQVBJX1BBVVNFICAgICAgICAgICAgICAweEQyCiBlbnVtIGJsYWNrYmlyZF9wYXVzZSB7CiAJQkxBQ0tCSVJEX1BBVVNFX0VOQ09ESU5HLAogCUJMQUNLQklSRF9SRVNVTUVfRU5DT0RJTkcsCiB9OwotI2RlZmluZSBCTEFDS0JJUkRfQVBJX1JFRlJFU0hfSU5QVVQgICAgICAweEQzCi0jZGVmaW5lIEJMQUNLQklSRF9BUElfU0VUX0NPUFlSSUdIVCAgICAgIDB4RDQKIGVudW0gYmxhY2tiaXJkX2NvcHlyaWdodCB7CiAJQkxBQ0tCSVJEX0NPUFlSSUdIVF9PRkYsCiAJQkxBQ0tCSVJEX0NPUFlSSUdIVF9PTiwKIH07Ci0jZGVmaW5lIEJMQUNLQklSRF9BUElfU0VUX05PVElGSUNBVElPTiAgIDB4RDUKIGVudW0gYmxhY2tiaXJkX25vdGlmaWNhdGlvbl90eXBlIHsKIAlCTEFDS0JJUkRfTk9USUZJQ0FUSU9OX1JFRlJFU0gsCiB9OwpAQCAtMzI1LDcgKzEzNyw2IEBACiBlbnVtIGJsYWNrYmlyZF9ub3RpZmljYXRpb25fbWFpbGJveCB7CiAJQkxBQ0tCSVJEX05PVElGSUNBVElPTl9OT19NQUlMQk9YID0gLTEsCiB9OwotI2RlZmluZSBCTEFDS0JJUkRfQVBJX1NFVF9DQVBUVVJFX0xJTkVTICAweEQ2CiBlbnVtIGJsYWNrYmlyZF9maWVsZDFfbGluZXMgewogCUJMQUNLQklSRF9GSUVMRDFfU0FBNzExNCA9IDB4MDBFRiwgLyogMjM5ICovCiAJQkxBQ0tCSVJEX0ZJRUxEMV9TQUE3MTE1ID0gMHgwMEYwLCAvKiAyNDAgKi8KQEAgLTMzNiwxMiArMTQ3LDEwIEBACiAJQkxBQ0tCSVJEX0ZJRUxEMl9TQUE3MTE1ID0gMHgwMEYwLCAvKiAyNDAgKi8KIAlCTEFDS0JJUkRfRklFTEQyX01JQ1JPTkFTID0gMHgwMTA2LCAvKiAyNjIgKi8KIH07Ci0jZGVmaW5lIEJMQUNLQklSRF9BUElfU0VUX0NVU1RPTV9EQVRBICAgIDB4RDcKIGVudW0gYmxhY2tiaXJkX2N1c3RvbV9kYXRhX3R5cGUgewogCUJMQUNLQklSRF9DVVNUT01fRVhURU5TSU9OX1VTUl9EQVRBLAogCUJMQUNLQklSRF9DVVNUT01fUFJJVkFURV9QQUNLRVQsCiB9OwotI2RlZmluZSBCTEFDS0JJUkRfQVBJX01VVEVfVklERU8gICAgICAgICAweEQ5CiBlbnVtIGJsYWNrYmlyZF9tdXRlIHsKIAlCTEFDS0JJUkRfVU5NVVRFLAogCUJMQUNLQklSRF9NVVRFLApAQCAtMzU2LDcgKzE2NSw2IEBACiAJQkxBQ0tCSVJEX01VVEVfVklERU9fVV9TSElGVCA9IDE2LAogCUJMQUNLQklSRF9NVVRFX1ZJREVPX1lfU0hJRlQgPSAyNCwKIH07Ci0jZGVmaW5lIEJMQUNLQklSRF9BUElfTVVURV9BVURJTyAgICAgICAgIDB4REEKIAogLyogUmVnaXN0ZXJzICovCiAjZGVmaW5lIElWVFZfUkVHX0VOQ19TRFJBTV9SRUZSRVNIICgweDA3RjggLyp8IElWVFZfUkVHX09GRlNFVCovKQpAQCAtNDk4LDE1ICszMDYsMTIgQEAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qIFdlIGRvbid0IG5lZWQgdG8gY2FsbCB0aGUgQVBJIG9mdGVuLCBzbyB1c2luZyBqdXN0IG9uZSBtYWlsYm94IHdpbGwgcHJvYmFibHkgc3VmZmljZSAqLwotc3RhdGljIGludCBibGFja2JpcmRfYXBpX2NtZChzdHJ1Y3QgY3g4ODAyX2RldiAqZGV2LCB1MzIgY29tbWFuZCwKLQkJCSAgICAgdTMyIGlucHV0Y250LCB1MzIgb3V0cHV0Y250LCAuLi4pCitzdGF0aWMgaW50IGJsYWNrYmlyZF9tYm94X2Z1bmModm9pZCAqcHJpdiwgaW50IGNvbW1hbmQsIGludCBpbiwgaW50IG91dCwgdTMyIGRhdGFbQ1gyMzQxWF9NQk9YX01BWF9EQVRBXSkKIHsKKwlzdHJ1Y3QgY3g4ODAyX2RldiAqZGV2ID0gcHJpdjsKIAl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CiAJdTMyIHZhbHVlLCBmbGFnLCByZXR2YWw7CiAJaW50IGk7Ci0JdmFfbGlzdCBhcmdzOwotCXZhX3N0YXJ0KGFyZ3MsIG91dHB1dGNudCk7CiAKIAlkcHJpbnRrKDEsIiVzOiAweCVYXG4iLCBfX0ZVTkNUSU9OX18sIGNvbW1hbmQpOwogCkBAIC01MzAsMTIgKzMzNSwxMSBAQAogCS8qIHdyaXRlIGNvbW1hbmQgKyBhcmdzICsgZmlsbCByZW1haW5pbmcgd2l0aCB6ZXJvcyAqLwogCW1lbW9yeV93cml0ZShkZXYtPmNvcmUsIGRldi0+bWFpbGJveCArIDEsIGNvbW1hbmQpOyAvKiBjb21tYW5kIGNvZGUgKi8KIAltZW1vcnlfd3JpdGUoZGV2LT5jb3JlLCBkZXYtPm1haWxib3ggKyAzLCBJVlRWX0FQSV9TVERfVElNRU9VVCk7IC8qIHRpbWVvdXQgKi8KLQlmb3IgKGkgPSAwOyBpIDwgaW5wdXRjbnQgOyBpKyspIHsKLQkJdmFsdWUgPSB2YV9hcmcoYXJncywgaW50KTsKLQkJbWVtb3J5X3dyaXRlKGRldi0+Y29yZSwgZGV2LT5tYWlsYm94ICsgNCArIGksIHZhbHVlKTsKLQkJZHByaW50aygxLCAiQVBJIElucHV0ICVkID0gJWRcbiIsIGksIHZhbHVlKTsKKwlmb3IgKGkgPSAwOyBpIDwgaW47IGkrKykgeworCQltZW1vcnlfd3JpdGUoZGV2LT5jb3JlLCBkZXYtPm1haWxib3ggKyA0ICsgaSwgZGF0YVtpXSk7CisJCWRwcmludGsoMSwgIkFQSSBJbnB1dCAlZCA9ICVkXG4iLCBpLCBkYXRhW2ldKTsKIAl9Ci0JZm9yICg7IGkgPCAxNiA7IGkrKykKKwlmb3IgKDsgaSA8IENYMjM0MVhfTUJPWF9NQVhfREFUQTsgaSsrKQogCQltZW1vcnlfd3JpdGUoZGV2LT5jb3JlLCBkZXYtPm1haWxib3ggKyA0ICsgaSwgMCk7CiAKIAlmbGFnIHw9IDM7IC8qIHRlbGwgJ2VtIHdlJ3JlIGRvbmUgd3JpdGluZyAqLwpAQCAtNTU1LDEyICszNTksMTAgQEAKIAl9CiAKIAkvKiByZWFkIG91dHB1dCB2YWx1ZXMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgb3V0cHV0Y250IDsgaSsrKSB7Ci0JCWludCAqdnB0ciA9IHZhX2FyZyhhcmdzLCBpbnQgKik7Ci0JCW1lbW9yeV9yZWFkKGRldi0+Y29yZSwgZGV2LT5tYWlsYm94ICsgNCArIGksIHZwdHIpOwotCQlkcHJpbnRrKDEsICJBUEkgT3V0cHV0ICVkID0gJWRcbiIsIGksICp2cHRyKTsKKwlmb3IgKGkgPSAwOyBpIDwgb3V0OyBpKyspIHsKKwkJbWVtb3J5X3JlYWQoZGV2LT5jb3JlLCBkZXYtPm1haWxib3ggKyA0ICsgaSwgZGF0YSArIGkpOworCQlkcHJpbnRrKDEsICJBUEkgT3V0cHV0ICVkID0gJWRcbiIsIGksIGRhdGFbaV0pOwogCX0KLQl2YV9lbmQoYXJncyk7CiAKIAltZW1vcnlfcmVhZChkZXYtPmNvcmUsIGRldi0+bWFpbGJveCArIDIsICZyZXR2YWwpOwogCWRwcmludGsoMSwgIkFQSSByZXN1bHQgPSAlZFxuIixyZXR2YWwpOwpAQCAtNTY5LDcgKzM3MSwyOSBAQAogCW1lbW9yeV93cml0ZShkZXYtPmNvcmUsIGRldi0+bWFpbGJveCwgZmxhZyk7CiAJcmV0dXJuIHJldHZhbDsKIH0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCisvKiBXZSBkb24ndCBuZWVkIHRvIGNhbGwgdGhlIEFQSSBvZnRlbiwgc28gdXNpbmcganVzdCBvbmUgbWFpbGJveCB3aWxsIHByb2JhYmx5IHN1ZmZpY2UgKi8KK3N0YXRpYyBpbnQgYmxhY2tiaXJkX2FwaV9jbWQoc3RydWN0IGN4ODgwMl9kZXYgKmRldiwgdTMyIGNvbW1hbmQsCisJCQkgICAgIHUzMiBpbnB1dGNudCwgdTMyIG91dHB1dGNudCwgLi4uKQoreworCXUzMiBkYXRhW0NYMjM0MVhfTUJPWF9NQVhfREFUQV07CisJdmFfbGlzdCB2YXJnczsKKwlpbnQgaSwgZXJyOworCisJdmFfc3RhcnQodmFyZ3MsIG91dHB1dGNudCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgaW5wdXRjbnQ7IGkrKykgeworCQlkYXRhW2ldID0gdmFfYXJnKHZhcmdzLCBpbnQpOworCX0KKwllcnIgPSBibGFja2JpcmRfbWJveF9mdW5jKGRldiwgY29tbWFuZCwgaW5wdXRjbnQsIG91dHB1dGNudCwgZGF0YSk7CisJZm9yIChpID0gMDsgaSA8IG91dHB1dGNudDsgaSsrKSB7CisJCWludCAqdnB0ciA9IHZhX2FyZyh2YXJncywgaW50ICopOworCQkqdnB0ciA9IGRhdGFbaV07CisJfQorCXZhX2VuZCh2YXJncyk7CisJcmV0dXJuIGVycjsKK30KIAogc3RhdGljIGludCBibGFja2JpcmRfZmluZF9tYWlsYm94KHN0cnVjdCBjeDg4MDJfZGV2ICpkZXYpCiB7CkBAIC02MTQsMTMgKzQzOCwxMyBAQAogCWlmIChyZXR2YWwgPCAwKQogCQlkcHJpbnRrKDAsICJFcnJvciB3aXRoIHJlZ2lzdGVyX3dyaXRlXG4iKTsKIAotCXJldHZhbCA9IHJlcXVlc3RfZmlybXdhcmUoJmZpcm13YXJlLCBCTEFDS0JJUkRfRklSTV9FTkNfRklMRU5BTUUsCisJcmV0dmFsID0gcmVxdWVzdF9maXJtd2FyZSgmZmlybXdhcmUsIENYMjM0MVhfRklSTV9FTkNfRklMRU5BTUUsCiAJCQkJICAmZGV2LT5wY2ktPmRldik7CiAKIAogCWlmIChyZXR2YWwgIT0gMCkgewogCQlkcHJpbnRrKDAsICJFUlJPUjogSG90cGx1ZyBmaXJtd2FyZSByZXF1ZXN0IGZhaWxlZCAoJXMpLlxuIiwKLQkJCUJMQUNLQklSRF9GSVJNX0VOQ19GSUxFTkFNRSk7CisJCQlDWDIzNDFYX0ZJUk1fRU5DX0ZJTEVOQU1FKTsKIAkJZHByaW50aygwLCAiUGxlYXNlIGZpeCB5b3VyIGhvdHBsdWcgc2V0dXAsIHRoZSBib2FyZCB3aWxsICIKIAkJCSJub3Qgd29yayB3aXRob3V0IGZpcm13YXJlIGxvYWRlZCFcbiIpOwogCQlyZXR1cm4gLTE7CkBAIC02ODYsMTIgKzUxMCwxOSBAQAogKkRCOiAiRGlyZWN0QnVybiIKICovCiAKLXN0YXRpYyBzdHJ1Y3QgYmxhY2tiaXJkX2RuciBkZWZhdWx0X2Rucl9wYXJhbXMgPSB7Ci0JLm1vZGUgICAgID0gQkxBQ0tCSVJEX0ROUl9CSVRTX01BTlVBTCwKLQkudHlwZSAgICAgPSBCTEFDS0JJUkRfTUVESUFOX0ZJTFRFUl9ESVNBQkxFRCwKLQkuc3BhdGlhbCAgPSAwLAotCS50ZW1wb3JhbCA9IDAKLX07CitzdGF0aWMgdm9pZCBibGFja2JpcmRfY29kZWNfc2V0dGluZ3Moc3RydWN0IGN4ODgwMl9kZXYgKmRldikKK3sKKwkvKiBhc3NpZ24gZnJhbWUgc2l6ZSAqLworCWJsYWNrYmlyZF9hcGlfY21kKGRldiwgQ1gyMzQxWF9FTkNfU0VUX0ZSQU1FX1NJWkUsIDIsIDAsCisJCQkJZGV2LT5oZWlnaHQsIGRldi0+d2lkdGgpOworCisJZGV2LT5wYXJhbXMud2lkdGggPSBkZXYtPndpZHRoOworCWRldi0+cGFyYW1zLmhlaWdodCA9IGRldi0+aGVpZ2h0OworCWRldi0+cGFyYW1zLmlzXzUwaHogPSAoZGV2LT5jb3JlLT50dm5vcm0tPmlkICYgVjRMMl9TVERfNjI1XzUwKSAhPSAwOworCisJY3gyMzQxeF91cGRhdGUoZGV2LCBibGFja2JpcmRfbWJveF9mdW5jLCBOVUxMLCAmZGV2LT5wYXJhbXMpOworfQorCiBzdGF0aWMgc3RydWN0IHY0bDJfbXBlZ19jb21wcmVzc2lvbiBkZWZhdWx0X21wZWdfcGFyYW1zID0gewogCS5zdF90eXBlICAgICAgICAgID0gVjRMMl9NUEVHX1BTXzIsCiAJLnN0X2JpdHJhdGUgICAgICAgPSB7CkBAIC03MTIsNyArNTQzLDcgQEAKIAkJLnRhcmdldCAgID0gMjI0LAogCQkubWF4ICAgICAgPSAyMjQKIAl9LAotCS5hdV9zYW1wbGVfcmF0ZSAgICA9IDQ0MTAwLAorCS5hdV9zYW1wbGVfcmF0ZSAgICA9IDQ4MDAwLAogCS5hdV9wZXNpZCAgICAgICAgICA9IDAsCiAJLnZpX3R5cGUgICAgICAgICAgID0gVjRMMl9NUEVHX1ZJXzIsCiAJLnZpX2FzcGVjdF9yYXRpbyAgID0gVjRMMl9NUEVHX0FTUEVDVF80XzMsCkBAIC03MjMsNTI0ICs1NTQsMTMgQEAKIAkJLm1heCAgICAgICA9IDYwMDAKIAl9LAogCS52aV9mcmFtZV9yYXRlICAgICA9IDI1LAotCS52aV9mcmFtZXNfcGVyX2dvcCA9IDE1LAorCS52aV9mcmFtZXNfcGVyX2dvcCA9IDEyLAogCS52aV9iZnJhbWVzX2NvdW50ICA9IDIsCiAJLnZpX3Blc2lkICAgICAgICAgID0gMCwKLQkuY2xvc2VkX2dvcHMgICAgICAgPSAwLAorCS5jbG9zZWRfZ29wcyAgICAgICA9IDEsCiAJLnB1bGxkb3duICAgICAgICAgID0gMAogfTsKIAotc3RhdGljIGVudW0gYmxhY2tiaXJkX3N0cmVhbV90eXBlIG1wZWdfc3RyZWFtX3R5cGVzW10gPSB7Ci0JW1Y0TDJfTVBFR19TU18xXSAgID0gQkxBQ0tCSVJEX1NUUkVBTV9NUEVHMSwKLQlbVjRMMl9NUEVHX1BTXzJdICAgPSBCTEFDS0JJUkRfU1RSRUFNX1BST0dSQU0sCi0JW1Y0TDJfTVBFR19UU18yXSAgID0gQkxBQ0tCSVJEX1NUUkVBTV9UUkFOU1BPUlQsCi0JW1Y0TDJfTVBFR19QU19EVkRdID0gQkxBQ0tCSVJEX1NUUkVBTV9EVkQsCi19Owotc3RhdGljIGVudW0gYmxhY2tiaXJkX2FzcGVjdF9yYXRpbyBtcGVnX3N0cmVhbV9yYXRpb3NbXSA9IHsKLQlbVjRMMl9NUEVHX0FTUEVDVF9TUVVBUkVdID0gQkxBQ0tCSVJEX0FTUEVDVF9SQVRJT18xXzFfU1FVQVJFLAotCVtWNEwyX01QRUdfQVNQRUNUXzRfM10gICAgPSBCTEFDS0JJUkRfQVNQRUNUX1JBVElPXzRfMywKLQlbVjRMMl9NUEVHX0FTUEVDVF8xNl85XSAgID0gQkxBQ0tCSVJEX0FTUEVDVF9SQVRJT18xNl85LAotCVtWNEwyX01QRUdfQVNQRUNUXzFfMjIxXSAgPSBCTEFDS0JJUkRfQVNQRUNUX1JBVElPXzIyMV8xMDAsCi19Owotc3RhdGljIGVudW0gYmxhY2tiaXJkX3ZpZGVvX2JpdHJhdGVfdHlwZSBtcGVnX3ZpZGVvX2JpdHJhdGVzW10gPSB7Ci0JW1Y0TDJfQklUUkFURV9OT05FXSA9IEJMQUNLQklSRF9WSURFT19DQlIsCi0JW1Y0TDJfQklUUkFURV9DQlJdICA9IEJMQUNLQklSRF9WSURFT19DQlIsCi0JW1Y0TDJfQklUUkFURV9WQlJdICA9IEJMQUNLQklSRF9WSURFT19WQlIsCi19OwotLyogZmluZCB0aGUgYmVzdCBsYXllciBJL0lJIGJpdHJhdGUgdG8gZml0IGEgZ2l2ZW4gbnVtZXJpYyB2YWx1ZSAqLwotc3RydWN0IGJpdHJhdGVfYml0cyB7Ci0JdTMyIGJpdHM7IC8qIGxheWVyIGJpdHMgZm9yIHRoZSBiZXN0IGZpdCAqLwotCXUzMiByYXRlOyAvKiBhY3R1YWwgbnVtZXJpYyB2YWx1ZSBmb3IgdGhlIGxheWVyIGJlc3QgZml0ICovCi19Owotc3RydWN0IGJpdHJhdGVfYXBwcm94aW1hdGlvbiB7Ci0JdTMyICAgICAgICAgICAgICAgICB0YXJnZXQ7ICAgLyogbnVtZXJpYyB2YWx1ZSBvZiB0aGUgcmF0ZSB3ZSB3YW50ICovCi0Jc3RydWN0IGJpdHJhdGVfYml0cyBsYXllclsyXTsKLX07Ci1zdGF0aWMgc3RydWN0IGJpdHJhdGVfYXBwcm94aW1hdGlvbiBtcGVnX2F1ZGlvX2JpdHJhdGVzW10gPSB7Ci0JLyogdGFyZ2V0ICBsYXllclswXS5iaXRzICAgICAgICAgICBsYXllclswXS5yYXRlICAgICAgIGxheWVyWzFdLmJpdHMgICAgICAgICAgIGxheWVyWzFdLnJhdGUgKi8KLQl7ICAgMCwgeyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgIDAsIH0sIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgMCwgfSwgfSwgfSwKLQl7ICAzMiwgeyB7IEJMQUNLQklSRF9BVURJT19CSVRTX0xBWUVSXzFfMzIgLCAgMzIsIH0sIHsgQkxBQ0tCSVJEX0FVRElPX0JJVFNfTEFZRVJfMl8zMiAsICAzMiwgfSwgfSwgfSwKLQl7ICA0OCwgeyB7IEJMQUNLQklSRF9BVURJT19CSVRTX0xBWUVSXzFfNjQgLCAgNjQsIH0sIHsgQkxBQ0tCSVJEX0FVRElPX0JJVFNfTEFZRVJfMl80OCAsICA0OCwgfSwgfSwgfSwKLQl7ICA1NiwgeyB7IEJMQUNLQklSRF9BVURJT19CSVRTX0xBWUVSXzFfNjQgLCAgNjQsIH0sIHsgQkxBQ0tCSVJEX0FVRElPX0JJVFNfTEFZRVJfMl81NiAsICA1NiwgfSwgfSwgfSwKLQl7ICA2NCwgeyB7IEJMQUNLQklSRF9BVURJT19CSVRTX0xBWUVSXzFfNjQgLCAgNjQsIH0sIHsgQkxBQ0tCSVJEX0FVRElPX0JJVFNfTEFZRVJfMl82NCAsICA2NCwgfSwgfSwgfSwKLQl7ICA4MCwgeyB7IEJMQUNLQklSRF9BVURJT19CSVRTX0xBWUVSXzFfOTYgLCAgOTYsIH0sIHsgQkxBQ0tCSVJEX0FVRElPX0JJVFNfTEFZRVJfMl84MCAsICA4MCwgfSwgfSwgfSwKLQl7ICA5NiwgeyB7IEJMQUNLQklSRF9BVURJT19CSVRTX0xBWUVSXzFfOTYgLCAgOTYsIH0sIHsgQkxBQ0tCSVJEX0FVRElPX0JJVFNfTEFZRVJfMl85NiAsICA5NiwgfSwgfSwgfSwKLQl7IDExMiwgeyB7IEJMQUNLQklSRF9BVURJT19CSVRTX0xBWUVSXzFfMTI4LCAxMjgsIH0sIHsgQkxBQ0tCSVJEX0FVRElPX0JJVFNfTEFZRVJfMl8xMTIsIDExMiwgfSwgfSwgfSwKLQl7IDEyOCwgeyB7IEJMQUNLQklSRF9BVURJT19CSVRTX0xBWUVSXzFfMTI4LCAxMjgsIH0sIHsgQkxBQ0tCSVJEX0FVRElPX0JJVFNfTEFZRVJfMl8xMjgsIDEyOCwgfSwgfSwgfSwKLQl7IDE2MCwgeyB7IEJMQUNLQklSRF9BVURJT19CSVRTX0xBWUVSXzFfMTYwLCAxNjAsIH0sIHsgQkxBQ0tCSVJEX0FVRElPX0JJVFNfTEFZRVJfMl8xNjAsIDE2MCwgfSwgfSwgfSwKLQl7IDE5MiwgeyB7IEJMQUNLQklSRF9BVURJT19CSVRTX0xBWUVSXzFfMTkyLCAxOTIsIH0sIHsgQkxBQ0tCSVJEX0FVRElPX0JJVFNfTEFZRVJfMl8xOTIsIDE5MiwgfSwgfSwgfSwKLQl7IDIyNCwgeyB7IEJMQUNLQklSRF9BVURJT19CSVRTX0xBWUVSXzFfMjI0LCAyMjQsIH0sIHsgQkxBQ0tCSVJEX0FVRElPX0JJVFNfTEFZRVJfMl8yMjQsIDIyNCwgfSwgfSwgfSwKLQl7IDI1NiwgeyB7IEJMQUNLQklSRF9BVURJT19CSVRTX0xBWUVSXzFfMjU2LCAyNTYsIH0sIHsgQkxBQ0tCSVJEX0FVRElPX0JJVFNfTEFZRVJfMl8yNTYsIDI1NiwgfSwgfSwgfSwKLQl7IDI4OCwgeyB7IEJMQUNLQklSRF9BVURJT19CSVRTX0xBWUVSXzFfMjg4LCAyODgsIH0sIHsgQkxBQ0tCSVJEX0FVRElPX0JJVFNfTEFZRVJfMl8zMjAsIDMyMCwgfSwgfSwgfSwKLQl7IDMyMCwgeyB7IEJMQUNLQklSRF9BVURJT19CSVRTX0xBWUVSXzFfMzIwLCAzMjAsIH0sIHsgQkxBQ0tCSVJEX0FVRElPX0JJVFNfTEFZRVJfMl8zMjAsIDMyMCwgfSwgfSwgfSwKLQl7IDM1MiwgeyB7IEJMQUNLQklSRF9BVURJT19CSVRTX0xBWUVSXzFfMzUyLCAzNTIsIH0sIHsgQkxBQ0tCSVJEX0FVRElPX0JJVFNfTEFZRVJfMl8zODQsIDM4NCwgfSwgfSwgfSwKLQl7IDM4NCwgeyB7IEJMQUNLQklSRF9BVURJT19CSVRTX0xBWUVSXzFfMzg0LCAzODQsIH0sIHsgQkxBQ0tCSVJEX0FVRElPX0JJVFNfTEFZRVJfMl8zODQsIDM4NCwgfSwgfSwgfSwKLQl7IDQxNiwgeyB7IEJMQUNLQklSRF9BVURJT19CSVRTX0xBWUVSXzFfNDE2LCA0MTYsIH0sIHsgQkxBQ0tCSVJEX0FVRElPX0JJVFNfTEFZRVJfMl8zODQsIDM4NCwgfSwgfSwgfSwKLQl7IDQ0OCwgeyB7IEJMQUNLQklSRF9BVURJT19CSVRTX0xBWUVSXzFfNDQ4LCA0NDgsIH0sIHsgQkxBQ0tCSVJEX0FVRElPX0JJVFNfTEFZRVJfMl8zODQsIDM4NCwgfSwgfSwgfSwKLX07Ci1zdGF0aWMgY29uc3QgaW50IEJJVFJBVEVTX1NJWkUgPSBBUlJBWV9TSVpFKG1wZWdfYXVkaW9fYml0cmF0ZXMpOwotCi1zdGF0aWMgdm9pZCBibGFja2JpcmRfc2V0X2RlZmF1bHRfcGFyYW1zKHN0cnVjdCBjeDg4MDJfZGV2ICpkZXYpCi17Ci0Jc3RydWN0IHY0bDJfbXBlZ19jb21wcmVzc2lvbiAqcGFyYW1zID0gJmRldi0+cGFyYW1zOwotCXUzMiBhdV9wYXJhbXM7Ci0KLQkvKiBhc3NpZ24gc3RyZWFtIHR5cGUgKi8KLQlpZiggcGFyYW1zLT5zdF90eXBlID49IEFSUkFZX1NJWkUobXBlZ19zdHJlYW1fdHlwZXMpICkKLQkJcGFyYW1zLT5zdF90eXBlID0gVjRMMl9NUEVHX1BTXzI7Ci0JaWYoIHBhcmFtcy0+c3RfdHlwZSA9PSBWNEwyX01QRUdfU1NfMSApCi0JCXBhcmFtcy0+dmlfdHlwZSA9IFY0TDJfTVBFR19WSV8xOwotCWVsc2UKLQkJcGFyYW1zLT52aV90eXBlID0gVjRMMl9NUEVHX1ZJXzI7Ci0JYmxhY2tiaXJkX2FwaV9jbWQoZGV2LCBCTEFDS0JJUkRfQVBJX1NFVF9TVFJFQU1fVFlQRSwgMSwgMCwgbXBlZ19zdHJlYW1fdHlwZXNbcGFyYW1zLT5zdF90eXBlXSk7Ci0KLQkvKiBhc3NpZ24gZnJhbWVyYXRlICovCi0JaWYoIHBhcmFtcy0+dmlfZnJhbWVfcmF0ZSA8PSAyNSApCi0JewotCQlwYXJhbXMtPnZpX2ZyYW1lX3JhdGUgPSAyNTsKLQkJYmxhY2tiaXJkX2FwaV9jbWQoZGV2LCBCTEFDS0JJUkRfQVBJX1NFVF9GUkFNRVJBVEUsIDEsIDAsIEJMQUNLQklSRF9GUkFNRVJBVEVfUEFMXzI1KTsKLQl9Ci0JZWxzZQotCXsKLQkJcGFyYW1zLT52aV9mcmFtZV9yYXRlID0gMzA7Ci0JCWJsYWNrYmlyZF9hcGlfY21kKGRldiwgQkxBQ0tCSVJEX0FQSV9TRVRfRlJBTUVSQVRFLCAxLCAwLCBCTEFDS0JJUkRfRlJBTUVSQVRFX05UU0NfMzApOwotCX0KLQotCS8qIGFzc2lnbiBhc3BlY3QgcmF0aW8gKi8KLQlpZiggcGFyYW1zLT52aV9hc3BlY3RfcmF0aW8gPj0gQVJSQVlfU0laRShtcGVnX3N0cmVhbV9yYXRpb3MpICkKLQkJcGFyYW1zLT52aV9hc3BlY3RfcmF0aW8gPSBWNEwyX01QRUdfQVNQRUNUXzRfMzsKLQlibGFja2JpcmRfYXBpX2NtZChkZXYsIEJMQUNLQklSRF9BUElfU0VUX0FTUEVDVF9SQVRJTywgMSwgMCwgbXBlZ19zdHJlYW1fcmF0aW9zW3BhcmFtcy0+dmlfYXNwZWN0X3JhdGlvXSk7Ci0KLQkvKiBhc3NpZ24gZ29wIHByb3BlcnRpZXMgKi8KLQlibGFja2JpcmRfYXBpX2NtZChkZXYsIEJMQUNLQklSRF9BUElfU0VUX0dPUF9TVFJVQ1RVUkUsIDIsIDAsIHBhcmFtcy0+dmlfZnJhbWVzX3Blcl9nb3AsIHBhcmFtcy0+dmlfYmZyYW1lc19jb3VudCsxKTsKLQotCS8qIGFzc2lnbiBnb3AgY2xvc3VyZSAqLwotCWJsYWNrYmlyZF9hcGlfY21kKGRldiwgQkxBQ0tCSVJEX0FQSV9TRVRfR09QX0NMT1NVUkUsIDEsIDAsIHBhcmFtcy0+Y2xvc2VkX2dvcHMpOwotCi0JLyogYXNzaWduIDMgMiBwdWxsZG93biAqLwotCWJsYWNrYmlyZF9hcGlfY21kKGRldiwgQkxBQ0tCSVJEX0FQSV9TRVRfM18yX1BVTExET1dOLCAxLCAwLCBwYXJhbXMtPnB1bGxkb3duKTsKLQotCS8qIG1ha2Ugc3VyZSB0aGUgcGFyYW1zIGFyZSB3aXRoaW4gYm91bmRzICovCi0JaWYoIHBhcmFtcy0+c3RfYml0cmF0ZS5tb2RlID49IEFSUkFZX1NJWkUobXBlZ192aWRlb19iaXRyYXRlcykgKQotCQlwYXJhbXMtPnZpX2JpdHJhdGUubW9kZSA9IFY0TDJfQklUUkFURV9OT05FOwotCWlmKCBwYXJhbXMtPnZpX2JpdHJhdGUubW9kZSA+PSBBUlJBWV9TSVpFKG1wZWdfdmlkZW9fYml0cmF0ZXMpICkKLQkJcGFyYW1zLT52aV9iaXRyYXRlLm1vZGUgPSBWNEwyX0JJVFJBVEVfTk9ORTsKLQlpZiggcGFyYW1zLT5hdV9iaXRyYXRlLm1vZGUgPj0gQVJSQVlfU0laRShtcGVnX3ZpZGVvX2JpdHJhdGVzKSApCi0JCXBhcmFtcy0+YXVfYml0cmF0ZS5tb2RlID0gVjRMMl9CSVRSQVRFX05PTkU7Ci0KLQkvKiBhc3NpZ24gYXVkaW8gcHJvcGVydGllcyAqLwotCS8qIG5vdGU6IGl0J3Mgbm90IG5lY2Vzc2FyeSB0byBzZXQgdGhlIHNhbXBsZXJhdGUsIHRoZSBtcGVnIGVuY29kZXIgc2VlbXMgdG8gYXV0b2RldGVjdC9hZGp1c3QgKi8KLQlhdV9wYXJhbXMgPSBCTEFDS0JJUkRfQVVESU9fQklUU19TVEVSRU8gfAotCQkJLyogQkxBQ0tCSVJEX0FVRElPX0JJVFNfQk9VTkRfNCB8ICovCi0JCQlCTEFDS0JJUkRfQVVESU9fQklUU19FTVBIQVNJU19OT05FIHwKLQkJCUJMQUNLQklSRF9BVURJT19CSVRTX0NSQ19PRkYgfAotCQkJQkxBQ0tCSVJEX0FVRElPX0JJVFNfQ09QWVJJR0hUX09GRiB8Ci0JCQlCTEFDS0JJUkRfQVVESU9fQklUU19DT1BZIHwKLQkJCTA7Ci0JaWYoIHBhcmFtcy0+YXVfc2FtcGxlX3JhdGUgPD0gMzIwMDAgKQotCXsKLQkJcGFyYW1zLT5hdV9zYW1wbGVfcmF0ZSA9IDMyMDAwOwotCQlhdV9wYXJhbXMgfD0gQkxBQ0tCSVJEX0FVRElPX0JJVFNfMzIwMDBIWjsKLQl9Ci0JZWxzZSBpZiggcGFyYW1zLT5hdV9zYW1wbGVfcmF0ZSA8PSA0NDEwMCApCi0JewotCQlwYXJhbXMtPmF1X3NhbXBsZV9yYXRlID0gNDQxMDA7Ci0JCWF1X3BhcmFtcyB8PSBCTEFDS0JJUkRfQVVESU9fQklUU180NDEwMEhaOwotCX0KLQllbHNlCi0JewotCQlwYXJhbXMtPmF1X3NhbXBsZV9yYXRlID0gNDgwMDA7Ci0JCWF1X3BhcmFtcyB8PSBCTEFDS0JJUkRfQVVESU9fQklUU180ODAwMEhaOwotCX0KLQlpZiggcGFyYW1zLT5hdV90eXBlID09IFY0TDJfTVBFR19BVV8yX0kgKQotCXsKLQkJYXVfcGFyYW1zIHw9IEJMQUNLQklSRF9BVURJT19CSVRTX0xBWUVSXzE7Ci0JfQotCWVsc2UKLQl7Ci0JCS8qIFRPRE86IHRyeSB0byBoYW5kbGUgdGhlIG90aGVyIGZvcm1hdHMgbW9yZSBncmFjZWZ1bGx5ICovCi0JCXBhcmFtcy0+YXVfdHlwZSA9IFY0TDJfTVBFR19BVV8yX0lJOwotCQlhdV9wYXJhbXMgfD0gQkxBQ0tCSVJEX0FVRElPX0JJVFNfTEFZRVJfMjsKLQl9Ci0JaWYoIHBhcmFtcy0+YXVfYml0cmF0ZS5tb2RlICkKLQl7Ci0JCWludCBsYXllcjsKLQotCQlpZiggcGFyYW1zLT5hdV9iaXRyYXRlLm1vZGUgPT0gVjRMMl9CSVRSQVRFX0NCUiApCi0JCQlwYXJhbXMtPmF1X2JpdHJhdGUubWF4ID0gcGFyYW1zLT52aV9iaXRyYXRlLnRhcmdldDsKLQkJZWxzZQotCQkJcGFyYW1zLT5hdV9iaXRyYXRlLnRhcmdldCA9IHBhcmFtcy0+dmlfYml0cmF0ZS5tYXg7Ci0KLQkJbGF5ZXIgPSBwYXJhbXMtPmF1X3R5cGU7Ci0JCWlmKCBwYXJhbXMtPmF1X2JpdHJhdGUudGFyZ2V0ID09IDAgKQotCQl7Ci0JCQkvKiBUT0RPOiB1c2UgdGhlIG1pbmltdW0gcG9zc2libGUgYml0cmF0ZSBpbnN0ZWFkIG9mIDAgPyAqLwotCQkJYXVfcGFyYW1zIHw9IDA7Ci0JCX0KLQkJZWxzZSBpZiggcGFyYW1zLT5hdV9iaXRyYXRlLnRhcmdldCA+PQotCQkJIG1wZWdfYXVkaW9fYml0cmF0ZXNbQklUUkFURVNfU0laRS0xXS5sYXllcltsYXllcl0ucmF0ZSApCi0JCXsKLQkJCS8qIGNsYW1wIHRoZSBiaXRyYXRlIHRvIHRoZSBtYXggc3VwcG9ydGVkIGJ5IHRoZSBzdGFuZGFyZCAqLwotCQkJcGFyYW1zLT5hdV9iaXRyYXRlLnRhcmdldCA9IG1wZWdfYXVkaW9fYml0cmF0ZXNbQklUUkFURVNfU0laRS0xXS5sYXllcltsYXllcl0ucmF0ZTsKLQkJCXBhcmFtcy0+YXVfYml0cmF0ZS5tYXggPSBwYXJhbXMtPmF1X2JpdHJhdGUudGFyZ2V0OwotCQkJYXVfcGFyYW1zIHw9IG1wZWdfYXVkaW9fYml0cmF0ZXNbQklUUkFURVNfU0laRS0xXS5sYXllcltsYXllcl0uYml0czsKLQkJfQotCQllbHNlCi0JCXsKLQkJCS8qIHJvdW5kIHVwIHRvIHRoZSBuZWFyZXN0IHN1cHBvcnRlZCBiaXRyYXRlICovCi0JCQlpbnQgaTsKLQkJCWZvcihpID0gMTsgaSA8IEJJVFJBVEVTX1NJWkU7IGkrKykKLQkJCXsKLQkJCQlpZiggcGFyYW1zLT5hdV9iaXRyYXRlLnRhcmdldCA+IG1wZWdfYXVkaW9fYml0cmF0ZXNbaS0xXS5sYXllcltsYXllcl0ucmF0ZSAmJgotCQkJCSAgICBwYXJhbXMtPmF1X2JpdHJhdGUudGFyZ2V0IDw9IG1wZWdfYXVkaW9fYml0cmF0ZXNbaV0ubGF5ZXJbbGF5ZXJdLnJhdGUgKQotCQkJCXsKLQkJCQkJcGFyYW1zLT5hdV9iaXRyYXRlLnRhcmdldCA9IG1wZWdfYXVkaW9fYml0cmF0ZXNbaV0ubGF5ZXJbbGF5ZXJdLnJhdGU7Ci0JCQkJCXBhcmFtcy0+YXVfYml0cmF0ZS5tYXggPSBwYXJhbXMtPmF1X2JpdHJhdGUudGFyZ2V0OwotCQkJCQlhdV9wYXJhbXMgfD0gbXBlZ19hdWRpb19iaXRyYXRlc1tpXS5sYXllcltsYXllcl0uYml0czsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCS8qIFRPRE86ID8/PyAqLwotCQlwYXJhbXMtPmF1X2JpdHJhdGUudGFyZ2V0ID0gcGFyYW1zLT5hdV9iaXRyYXRlLm1heCA9IDA7Ci0JCWF1X3BhcmFtcyB8PSAwOwotCX0KLQlibGFja2JpcmRfYXBpX2NtZChkZXYsIEJMQUNLQklSRF9BUElfU0VUX0FVRElPX1BBUkFNUywgMSwgMCwgYXVfcGFyYW1zICk7Ci0KLQkvKiBhc3NpZ24gYml0cmF0ZXMgKi8KLQlpZiggcGFyYW1zLT52aV9iaXRyYXRlLm1vZGUgKQotCXsKLQkJLyogYml0cmF0ZSBpcyBzZXQsIGxldCdzIGZpZ3VyZSBvdXQgdGhlIGNici92YnIgbWVzcyAqLwotCQlpZiggcGFyYW1zLT52aV9iaXRyYXRlLm1heCA8IHBhcmFtcy0+dmlfYml0cmF0ZS50YXJnZXQgKQotCQl7Ci0JCQlpZiggcGFyYW1zLT52aV9iaXRyYXRlLm1vZGUgPT0gVjRMMl9CSVRSQVRFX0NCUiApCi0JCQkJcGFyYW1zLT52aV9iaXRyYXRlLm1heCA9IHBhcmFtcy0+dmlfYml0cmF0ZS50YXJnZXQ7Ci0JCQllbHNlCi0JCQkJcGFyYW1zLT52aV9iaXRyYXRlLnRhcmdldCA9IHBhcmFtcy0+dmlfYml0cmF0ZS5tYXg7Ci0JCX0KLQl9Ci0JZWxzZQotCXsKLQkJaWYoIHBhcmFtcy0+c3RfYml0cmF0ZS5tYXggPCBwYXJhbXMtPnN0X2JpdHJhdGUudGFyZ2V0ICkKLQkJewotCQkJaWYoIHBhcmFtcy0+c3RfYml0cmF0ZS5tb2RlID09IFY0TDJfQklUUkFURV9WQlIgKQotCQkJCXBhcmFtcy0+c3RfYml0cmF0ZS50YXJnZXQgPSBwYXJhbXMtPnN0X2JpdHJhdGUubWF4OwotCQkJZWxzZQotCQkJCXBhcmFtcy0+c3RfYml0cmF0ZS5tYXggPSBwYXJhbXMtPnN0X2JpdHJhdGUudGFyZ2V0OwotCQl9Ci0JCS8qIGNhbGN1bGF0ZSB2aV9iaXRyYXRlID0gc3RfYml0cmF0ZSAtIGF1X2JpdHJhdGUgKi8KLQkJcGFyYW1zLT52aV9iaXRyYXRlLm1heCA9IHBhcmFtcy0+c3RfYml0cmF0ZS5tYXggLSBwYXJhbXMtPmF1X2JpdHJhdGUubWF4OwotCQlwYXJhbXMtPnZpX2JpdHJhdGUudGFyZ2V0ID0gcGFyYW1zLT5zdF9iaXRyYXRlLnRhcmdldCAtIHBhcmFtcy0+YXVfYml0cmF0ZS50YXJnZXQ7Ci0JfQotCWJsYWNrYmlyZF9hcGlfY21kKGRldiwgQkxBQ0tCSVJEX0FQSV9TRVRfVklERU9fQklUUkFURSwgNCwgMCwKLQkJCQltcGVnX3ZpZGVvX2JpdHJhdGVzW3BhcmFtcy0+dmlfYml0cmF0ZS5tb2RlXSwKLQkJCQlwYXJhbXMtPnZpX2JpdHJhdGUudGFyZ2V0ICogMTAwMCwgLyoga2JwcyAtPiBicHMgKi8KLQkJCQlwYXJhbXMtPnZpX2JpdHJhdGUubWF4ICogMTAwMCAvIEJMQUNLQklSRF9QRUFLX1JBVEVfRElWSVNPUiwgLyogcGVhay80MDAgKi8KLQkJCQlCTEFDS0JJUkRfTVVYX1JBVEVfREVGQVVMVCAvKiwgMHg3MCovKTsgLyogZW5jb2RpbmcgYnVmZmVyLCBja2VubmVkeSAqLwotCi0JLyogVE9ETzogaW1wbGVtZW50IHRoZSBzdHJlYW0gSUQgc3R1ZmY6Ci0JCXRzX3BpZF9wbXQsIHRzX3BpZF9hdWRpbywgdHNfcGlkX3ZpZGVvLCB0c19waWRfcGNyLAotCQlwc19zaXplLCBhdV9wZXNpZCwgdmlfcGVzaWQKLQkqLwotfQotI2RlZmluZSBDSEVDS19QQVJBTSggbmFtZSApICggZGV2LT5wYXJhbXMubmFtZSAhPSBwYXJhbXMtPm5hbWUgKQotI2RlZmluZSBJRl9QQVJBTSggbmFtZSApIGlmKCBDSEVDS19QQVJBTSggbmFtZSApICkKLSNkZWZpbmUgVVBEQVRFX1BBUkFNKCBuYW1lICkgZGV2LT5wYXJhbXMubmFtZSA9IHBhcmFtcy0+bmFtZQotdm9pZCBibGFja2JpcmRfc2V0X3BhcmFtcyhzdHJ1Y3QgY3g4ODAyX2RldiAqZGV2LCBzdHJ1Y3QgdjRsMl9tcGVnX2NvbXByZXNzaW9uICpwYXJhbXMpCi17Ci0JdTMyIGF1X3BhcmFtczsKLQotCS8qIGFzc2lnbiBzdHJlYW0gdHlwZSAqLwotCWlmKCBwYXJhbXMtPnN0X3R5cGUgPj0gQVJSQVlfU0laRShtcGVnX3N0cmVhbV90eXBlcykgKQotCQlwYXJhbXMtPnN0X3R5cGUgPSBWNEwyX01QRUdfUFNfMjsKLQlpZiggcGFyYW1zLT5zdF90eXBlID09IFY0TDJfTVBFR19TU18xICkKLQkJcGFyYW1zLT52aV90eXBlID0gVjRMMl9NUEVHX1ZJXzE7Ci0JZWxzZQotCQlwYXJhbXMtPnZpX3R5cGUgPSBWNEwyX01QRUdfVklfMjsKLQlpZiggQ0hFQ0tfUEFSQU0oIHN0X3R5cGUgKSB8fCBDSEVDS19QQVJBTSggdmlfdHlwZSApICkKLQl7Ci0JCVVQREFURV9QQVJBTSggc3RfdHlwZSApOwotCQlVUERBVEVfUEFSQU0oIHZpX3R5cGUgKTsKLQkJYmxhY2tiaXJkX2FwaV9jbWQoZGV2LCBCTEFDS0JJUkRfQVBJX1NFVF9TVFJFQU1fVFlQRSwgMSwgMCwgbXBlZ19zdHJlYW1fdHlwZXNbcGFyYW1zLT5zdF90eXBlXSk7Ci0JfQotCi0JLyogYXNzaWduIGZyYW1lcmF0ZSAqLwotCWlmKCBwYXJhbXMtPnZpX2ZyYW1lX3JhdGUgPD0gMjUgKQotCQlwYXJhbXMtPnZpX2ZyYW1lX3JhdGUgPSAyNTsKLQllbHNlCi0JCXBhcmFtcy0+dmlfZnJhbWVfcmF0ZSA9IDMwOwotCUlGX1BBUkFNKCB2aV9mcmFtZV9yYXRlICkKLQl7Ci0JCVVQREFURV9QQVJBTSggdmlfZnJhbWVfcmF0ZSApOwotCQlpZiggcGFyYW1zLT52aV9mcmFtZV9yYXRlID09IDI1ICkKLQkJCWJsYWNrYmlyZF9hcGlfY21kKGRldiwgQkxBQ0tCSVJEX0FQSV9TRVRfRlJBTUVSQVRFLCAxLCAwLCBCTEFDS0JJUkRfRlJBTUVSQVRFX1BBTF8yNSk7Ci0JCWVsc2UKLQkJCWJsYWNrYmlyZF9hcGlfY21kKGRldiwgQkxBQ0tCSVJEX0FQSV9TRVRfRlJBTUVSQVRFLCAxLCAwLCBCTEFDS0JJUkRfRlJBTUVSQVRFX05UU0NfMzApOwotCX0KLQotCS8qIGFzc2lnbiBhc3BlY3QgcmF0aW8gKi8KLQlpZiggcGFyYW1zLT52aV9hc3BlY3RfcmF0aW8gPj0gQVJSQVlfU0laRShtcGVnX3N0cmVhbV9yYXRpb3MpICkKLQkJcGFyYW1zLT52aV9hc3BlY3RfcmF0aW8gPSBWNEwyX01QRUdfQVNQRUNUXzRfMzsKLQlJRl9QQVJBTSggdmlfYXNwZWN0X3JhdGlvICkKLQl7Ci0JCVVQREFURV9QQVJBTSggdmlfYXNwZWN0X3JhdGlvICk7Ci0JCWJsYWNrYmlyZF9hcGlfY21kKGRldiwgQkxBQ0tCSVJEX0FQSV9TRVRfQVNQRUNUX1JBVElPLCAxLCAwLCBtcGVnX3N0cmVhbV9yYXRpb3NbcGFyYW1zLT52aV9hc3BlY3RfcmF0aW9dKTsKLQl9Ci0KLQkvKiBhc3NpZ24gZ29wIHByb3BlcnRpZXMgKi8KLQlpZiggQ0hFQ0tfUEFSQU0oIHZpX2ZyYW1lc19wZXJfZ29wICkgfHwgQ0hFQ0tfUEFSQU0oIHZpX2JmcmFtZXNfY291bnQgKSApCi0JewotCQlVUERBVEVfUEFSQU0oIHZpX2ZyYW1lc19wZXJfZ29wICk7Ci0JCVVQREFURV9QQVJBTSggdmlfYmZyYW1lc19jb3VudCApOwotCQlibGFja2JpcmRfYXBpX2NtZChkZXYsIEJMQUNLQklSRF9BUElfU0VUX0dPUF9TVFJVQ1RVUkUsIDIsIDAsIHBhcmFtcy0+dmlfZnJhbWVzX3Blcl9nb3AsIHBhcmFtcy0+dmlfYmZyYW1lc19jb3VudCsxKTsKLQl9Ci0KLQkvKiBhc3NpZ24gZ29wIGNsb3N1cmUgKi8KLQlJRl9QQVJBTSggY2xvc2VkX2dvcHMgKQotCXsKLQkJVVBEQVRFX1BBUkFNKCBjbG9zZWRfZ29wcyApOwotCQlibGFja2JpcmRfYXBpX2NtZChkZXYsIEJMQUNLQklSRF9BUElfU0VUX0dPUF9DTE9TVVJFLCAxLCAwLCBwYXJhbXMtPmNsb3NlZF9nb3BzKTsKLQl9Ci0KLQkvKiBhc3NpZ24gMyAyIHB1bGxkb3duICovCi0JSUZfUEFSQU0oIHB1bGxkb3duICkKLQl7Ci0JCVVQREFURV9QQVJBTSggcHVsbGRvd24gKTsKLQkJYmxhY2tiaXJkX2FwaV9jbWQoZGV2LCBCTEFDS0JJUkRfQVBJX1NFVF8zXzJfUFVMTERPV04sIDEsIDAsIHBhcmFtcy0+cHVsbGRvd24pOwotCX0KLQotCS8qIG1ha2Ugc3VyZSB0aGUgcGFyYW1zIGFyZSB3aXRoaW4gYm91bmRzICovCi0JaWYoIHBhcmFtcy0+c3RfYml0cmF0ZS5tb2RlID49IEFSUkFZX1NJWkUobXBlZ192aWRlb19iaXRyYXRlcykgKQotCQlwYXJhbXMtPnZpX2JpdHJhdGUubW9kZSA9IFY0TDJfQklUUkFURV9OT05FOwotCWlmKCBwYXJhbXMtPnZpX2JpdHJhdGUubW9kZSA+PSBBUlJBWV9TSVpFKG1wZWdfdmlkZW9fYml0cmF0ZXMpICkKLQkJcGFyYW1zLT52aV9iaXRyYXRlLm1vZGUgPSBWNEwyX0JJVFJBVEVfTk9ORTsKLQlpZiggcGFyYW1zLT5hdV9iaXRyYXRlLm1vZGUgPj0gQVJSQVlfU0laRShtcGVnX3ZpZGVvX2JpdHJhdGVzKSApCi0JCXBhcmFtcy0+YXVfYml0cmF0ZS5tb2RlID0gVjRMMl9CSVRSQVRFX05PTkU7Ci0KLQkvKiBhc3NpZ24gYXVkaW8gcHJvcGVydGllcyAqLwotCS8qIG5vdGU6IGl0J3Mgbm90IG5lY2Vzc2FyeSB0byBzZXQgdGhlIHNhbXBsZXJhdGUsIHRoZSBtcGVnIGVuY29kZXIgc2VlbXMgdG8gYXV0b2RldGVjdC9hZGp1c3QgKi8KLQlhdV9wYXJhbXMgPSBCTEFDS0JJUkRfQVVESU9fQklUU19TVEVSRU8gfAotCQkJLyogQkxBQ0tCSVJEX0FVRElPX0JJVFNfQk9VTkRfNCB8ICovCi0JQkxBQ0tCSVJEX0FVRElPX0JJVFNfRU1QSEFTSVNfTk9ORSB8Ci0JCUJMQUNLQklSRF9BVURJT19CSVRTX0NSQ19PRkYgfAotCQlCTEFDS0JJUkRfQVVESU9fQklUU19DT1BZUklHSFRfT0ZGIHwKLQkJQkxBQ0tCSVJEX0FVRElPX0JJVFNfQ09QWSB8Ci0JCTA7Ci0JaWYoIHBhcmFtcy0+YXVfc2FtcGxlX3JhdGUgPCAzMjAwMCApCi0JewotCQlwYXJhbXMtPmF1X3NhbXBsZV9yYXRlID0gMzIwMDA7Ci0JCWF1X3BhcmFtcyB8PSBCTEFDS0JJUkRfQVVESU9fQklUU18zMjAwMEhaOwotCX0KLQllbHNlIGlmKCBwYXJhbXMtPmF1X3NhbXBsZV9yYXRlIDwgNDQxMDAgKQotCXsKLQkJcGFyYW1zLT5hdV9zYW1wbGVfcmF0ZSA9IDQ0MTAwOwotCQlhdV9wYXJhbXMgfD0gQkxBQ0tCSVJEX0FVRElPX0JJVFNfNDQxMDBIWjsKLQl9Ci0JZWxzZQotCXsKLQkJcGFyYW1zLT5hdV9zYW1wbGVfcmF0ZSA9IDQ4MDAwOwotCQlhdV9wYXJhbXMgfD0gQkxBQ0tCSVJEX0FVRElPX0JJVFNfNDgwMDBIWjsKLQl9Ci0JaWYoIHBhcmFtcy0+YXVfdHlwZSA9PSBWNEwyX01QRUdfQVVfMl9JICkKLQl7Ci0JCWF1X3BhcmFtcyB8PSBCTEFDS0JJUkRfQVVESU9fQklUU19MQVlFUl8xOwotCX0KLQllbHNlCi0JewotCQkvKiBUT0RPOiB0cnkgdG8gaGFuZGxlIHRoZSBvdGhlciBmb3JtYXRzIG1vcmUgZ3JhY2VmdWxseSAqLwotCQlwYXJhbXMtPmF1X3R5cGUgPSBWNEwyX01QRUdfQVVfMl9JSTsKLQkJYXVfcGFyYW1zIHw9IEJMQUNLQklSRF9BVURJT19CSVRTX0xBWUVSXzI7Ci0JfQotCWlmKCBwYXJhbXMtPmF1X2JpdHJhdGUubW9kZSApCi0JewotCQlpbnQgbGF5ZXI7Ci0KLQkJaWYoIHBhcmFtcy0+YXVfYml0cmF0ZS5tb2RlID09IFY0TDJfQklUUkFURV9DQlIgKQotCQkJcGFyYW1zLT5hdV9iaXRyYXRlLm1heCA9IHBhcmFtcy0+dmlfYml0cmF0ZS50YXJnZXQ7Ci0JCWVsc2UKLQkJCXBhcmFtcy0+YXVfYml0cmF0ZS50YXJnZXQgPSBwYXJhbXMtPnZpX2JpdHJhdGUubWF4OwotCi0JCWxheWVyID0gcGFyYW1zLT5hdV90eXBlOwotCQlpZiggcGFyYW1zLT5hdV9iaXRyYXRlLnRhcmdldCA9PSAwICkKLQkJewotCQkJLyogVE9ETzogdXNlIHRoZSBtaW5pbXVtIHBvc3NpYmxlIGJpdHJhdGUgaW5zdGVhZCBvZiAwID8gKi8KLQkJCWF1X3BhcmFtcyB8PSAwOwotCQl9Ci0JCWVsc2UgaWYoIHBhcmFtcy0+YXVfYml0cmF0ZS50YXJnZXQgPj0KLQkJCSBtcGVnX2F1ZGlvX2JpdHJhdGVzW0JJVFJBVEVTX1NJWkUtMV0ubGF5ZXJbbGF5ZXJdLnJhdGUgKQotCQl7Ci0JCQkvKiBjbGFtcCB0aGUgYml0cmF0ZSB0byB0aGUgbWF4IHN1cHBvcnRlZCBieSB0aGUgc3RhbmRhcmQgKi8KLQkJCXBhcmFtcy0+YXVfYml0cmF0ZS50YXJnZXQgPSBtcGVnX2F1ZGlvX2JpdHJhdGVzW0JJVFJBVEVTX1NJWkUtMV0ubGF5ZXJbbGF5ZXJdLnJhdGU7Ci0JCQlwYXJhbXMtPmF1X2JpdHJhdGUubWF4ID0gcGFyYW1zLT5hdV9iaXRyYXRlLnRhcmdldDsKLQkJCWF1X3BhcmFtcyB8PSBtcGVnX2F1ZGlvX2JpdHJhdGVzW0JJVFJBVEVTX1NJWkUtMV0ubGF5ZXJbbGF5ZXJdLmJpdHM7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQkvKiByb3VuZCB1cCB0byB0aGUgbmVhcmVzdCBzdXBwb3J0ZWQgYml0cmF0ZSAqLwotCQkJaW50IGk7Ci0JCQlmb3IoaSA9IDE7IGkgPCBCSVRSQVRFU19TSVpFOyBpKyspCi0JCQl7Ci0JCQkJaWYoIHBhcmFtcy0+YXVfYml0cmF0ZS50YXJnZXQgPiBtcGVnX2F1ZGlvX2JpdHJhdGVzW2ktMV0ubGF5ZXJbbGF5ZXJdLnJhdGUgJiYKLQkJCQkgICAgcGFyYW1zLT5hdV9iaXRyYXRlLnRhcmdldCA8PSBtcGVnX2F1ZGlvX2JpdHJhdGVzW2ldLmxheWVyW2xheWVyXS5yYXRlICkKLQkJCQl7Ci0JCQkJCXBhcmFtcy0+YXVfYml0cmF0ZS50YXJnZXQgPSBtcGVnX2F1ZGlvX2JpdHJhdGVzW2ldLmxheWVyW2xheWVyXS5yYXRlOwotCQkJCQlwYXJhbXMtPmF1X2JpdHJhdGUubWF4ID0gcGFyYW1zLT5hdV9iaXRyYXRlLnRhcmdldDsKLQkJCQkJYXVfcGFyYW1zIHw9IG1wZWdfYXVkaW9fYml0cmF0ZXNbaV0ubGF5ZXJbbGF5ZXJdLmJpdHM7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQllbHNlCi0JewotCQkvKiBUT0RPOiA/Pz8gKi8KLQkJcGFyYW1zLT5hdV9iaXRyYXRlLnRhcmdldCA9IHBhcmFtcy0+YXVfYml0cmF0ZS5tYXggPSAwOwotCQlhdV9wYXJhbXMgfD0gMDsKLQl9Ci0JaWYoIENIRUNLX1BBUkFNKCBhdV90eXBlICkgfHwgQ0hFQ0tfUEFSQU0oIGF1X3NhbXBsZV9yYXRlICkKLQkJfHwgQ0hFQ0tfUEFSQU0oIGF1X2JpdHJhdGUubW9kZSApIHx8IENIRUNLX1BBUkFNKCBhdV9iaXRyYXRlLm1heCApCi0JCXx8IENIRUNLX1BBUkFNKCBhdV9iaXRyYXRlLnRhcmdldCApCi0JKQotCXsKLQkJVVBEQVRFX1BBUkFNKCBhdV90eXBlICk7Ci0JCVVQREFURV9QQVJBTSggYXVfc2FtcGxlX3JhdGUgKTsKLQkJVVBEQVRFX1BBUkFNKCBhdV9iaXRyYXRlICk7Ci0JCWJsYWNrYmlyZF9hcGlfY21kKGRldiwgQkxBQ0tCSVJEX0FQSV9TRVRfQVVESU9fUEFSQU1TLCAxLCAwLCBhdV9wYXJhbXMgKTsKLQl9Ci0KLQkvKiBhc3NpZ24gYml0cmF0ZXMgKi8KLQlpZiggcGFyYW1zLT52aV9iaXRyYXRlLm1vZGUgKQotCXsKLQkJLyogYml0cmF0ZSBpcyBzZXQsIGxldCdzIGZpZ3VyZSBvdXQgdGhlIGNici92YnIgbWVzcyAqLwotCQlpZiggcGFyYW1zLT52aV9iaXRyYXRlLm1heCA8IHBhcmFtcy0+dmlfYml0cmF0ZS50YXJnZXQgKQotCQl7Ci0JCQlpZiggcGFyYW1zLT52aV9iaXRyYXRlLm1vZGUgPT0gVjRMMl9CSVRSQVRFX0NCUiApCi0JCQkJcGFyYW1zLT52aV9iaXRyYXRlLm1heCA9IHBhcmFtcy0+dmlfYml0cmF0ZS50YXJnZXQ7Ci0JCQllbHNlCi0JCQkJcGFyYW1zLT52aV9iaXRyYXRlLnRhcmdldCA9IHBhcmFtcy0+dmlfYml0cmF0ZS5tYXg7Ci0JCX0KLQl9Ci0JZWxzZQotCXsKLQkJaWYoIHBhcmFtcy0+c3RfYml0cmF0ZS5tYXggPCBwYXJhbXMtPnN0X2JpdHJhdGUudGFyZ2V0ICkKLQkJewotCQkJaWYoIHBhcmFtcy0+c3RfYml0cmF0ZS5tb2RlID09IFY0TDJfQklUUkFURV9WQlIgKQotCQkJCXBhcmFtcy0+c3RfYml0cmF0ZS50YXJnZXQgPSBwYXJhbXMtPnN0X2JpdHJhdGUubWF4OwotCQkJZWxzZQotCQkJCXBhcmFtcy0+c3RfYml0cmF0ZS5tYXggPSBwYXJhbXMtPnN0X2JpdHJhdGUudGFyZ2V0OwotCQl9Ci0JCS8qIGNhbGN1bGF0ZSB2aV9iaXRyYXRlID0gc3RfYml0cmF0ZSAtIGF1X2JpdHJhdGUgKi8KLQkJcGFyYW1zLT52aV9iaXRyYXRlLm1heCA9IHBhcmFtcy0+c3RfYml0cmF0ZS5tYXggLSBwYXJhbXMtPmF1X2JpdHJhdGUubWF4OwotCQlwYXJhbXMtPnZpX2JpdHJhdGUudGFyZ2V0ID0gcGFyYW1zLT5zdF9iaXRyYXRlLnRhcmdldCAtIHBhcmFtcy0+YXVfYml0cmF0ZS50YXJnZXQ7Ci0JfQotCVVQREFURV9QQVJBTSggc3RfYml0cmF0ZSApOwotCWlmKCBDSEVDS19QQVJBTSggdmlfYml0cmF0ZS5tb2RlICkgfHwgQ0hFQ0tfUEFSQU0oIHZpX2JpdHJhdGUubWF4ICkKLQkJfHwgQ0hFQ0tfUEFSQU0oIHZpX2JpdHJhdGUudGFyZ2V0ICkKLQkpCi0JewotCQlVUERBVEVfUEFSQU0oIHZpX2JpdHJhdGUgKTsKLQkJYmxhY2tiaXJkX2FwaV9jbWQoZGV2LCBCTEFDS0JJUkRfQVBJX1NFVF9WSURFT19CSVRSQVRFLCA0LCAwLAotCQkJCW1wZWdfdmlkZW9fYml0cmF0ZXNbcGFyYW1zLT52aV9iaXRyYXRlLm1vZGVdLAotCQkJCXBhcmFtcy0+dmlfYml0cmF0ZS50YXJnZXQgKiAxMDAwLCAvKiBrYnBzIC0+IGJwcyAqLwotCQkJCXBhcmFtcy0+dmlfYml0cmF0ZS5tYXggKiAxMDAwIC8gQkxBQ0tCSVJEX1BFQUtfUkFURV9ESVZJU09SLCAvKiBwZWFrLzQwMCAqLwotCQkJCUJMQUNLQklSRF9NVVhfUkFURV9ERUZBVUxUIC8qLCAweDcwKi8pOyAvKiBlbmNvZGluZyBidWZmZXIsIGNrZW5uZWR5ICovCi0JfQotCi0JLyogVE9ETzogaW1wbGVtZW50IHRoZSBzdHJlYW0gSUQgc3R1ZmY6Ci0JCXRzX3BpZF9wbXQsIHRzX3BpZF9hdWRpbywgdHNfcGlkX3ZpZGVvLCB0c19waWRfcGNyLAotCQlwc19zaXplLCBhdV9wZXNpZCwgdmlfcGVzaWQKLQkqLwotCVVQREFURV9QQVJBTSggdHNfcGlkX3BtdCApOwotCVVQREFURV9QQVJBTSggdHNfcGlkX2F1ZGlvICk7Ci0JVVBEQVRFX1BBUkFNKCB0c19waWRfdmlkZW8gKTsKLQlVUERBVEVfUEFSQU0oIHRzX3BpZF9wY3IgKTsKLQlVUERBVEVfUEFSQU0oIHBzX3NpemUgKTsKLQlVUERBVEVfUEFSQU0oIGF1X3Blc2lkICk7Ci0JVVBEQVRFX1BBUkFNKCB2aV9wZXNpZCApOwotfQotCi1zdGF0aWMgdm9pZCBibGFja2JpcmRfc2V0X2RlZmF1bHRfZG5yX3BhcmFtcyhzdHJ1Y3QgY3g4ODAyX2RldiAqZGV2KQotewotCS8qIGFzc2lnbiBkbnIgZmlsdGVyIG1vZGUgKi8KLQlpZiggZGV2LT5kbnJfcGFyYW1zLm1vZGUgPiBCTEFDS0JJUkRfRE5SX0JJVFNfQVVUTyApCi0JCWRldi0+ZG5yX3BhcmFtcy5tb2RlID0gQkxBQ0tCSVJEX0ROUl9CSVRTX01BTlVBTDsKLQlpZiggZGV2LT5kbnJfcGFyYW1zLnR5cGUgPiBCTEFDS0JJUkRfTUVESUFOX0ZJTFRFUl9ESUFHT05BTCApCi0JCWRldi0+ZG5yX3BhcmFtcy50eXBlID0gQkxBQ0tCSVJEX01FRElBTl9GSUxURVJfRElTQUJMRUQ7Ci0JYmxhY2tiaXJkX2FwaV9jbWQoZGV2LCBCTEFDS0JJUkRfQVBJX1NFVF9ETlJfTU9ERSwgMiwgMCwKLQkJCQlkZXYtPmRucl9wYXJhbXMubW9kZSwKLQkJCQlkZXYtPmRucl9wYXJhbXMudHlwZQotCQkJKTsKLQotCS8qIGFzc2lnbiBkbnIgZmlsdGVyIHByb3BzKi8KLQlpZiggZGV2LT5kbnJfcGFyYW1zLnNwYXRpYWwgPiAxNSApCi0JCWRldi0+ZG5yX3BhcmFtcy5zcGF0aWFsID0gMTU7Ci0JaWYoIGRldi0+ZG5yX3BhcmFtcy50ZW1wb3JhbCA+IDMxICkKLQkJZGV2LT5kbnJfcGFyYW1zLnRlbXBvcmFsID0gMzE7Ci0JYmxhY2tiaXJkX2FwaV9jbWQoZGV2LCBCTEFDS0JJUkRfQVBJX1NFVF9NQU5VQUxfRE5SLCAyLCAwLAotCQkJCWRldi0+ZG5yX3BhcmFtcy5zcGF0aWFsLAotCQkJCWRldi0+ZG5yX3BhcmFtcy50ZW1wb3JhbAotCQkJKTsKLX0KLSNkZWZpbmUgQ0hFQ0tfRE5SX1BBUkFNKCBuYW1lICkgKCBkZXYtPmRucl9wYXJhbXMubmFtZSAhPSBkbnJfcGFyYW1zLT5uYW1lICkKLSNkZWZpbmUgVVBEQVRFX0ROUl9QQVJBTSggbmFtZSApIGRldi0+ZG5yX3BhcmFtcy5uYW1lID0gZG5yX3BhcmFtcy0+bmFtZQotdm9pZCBibGFja2JpcmRfc2V0X2Rucl9wYXJhbXMoc3RydWN0IGN4ODgwMl9kZXYgKmRldiwgc3RydWN0IGJsYWNrYmlyZF9kbnIqIGRucl9wYXJhbXMpCi17Ci0JLyogYXNzaWduIGRuciBmaWx0ZXIgbW9kZSAqLwotCS8qIGNsYW1wIHZhbHVlcyAqLwotCWlmKCBkbnJfcGFyYW1zLT5tb2RlID4gQkxBQ0tCSVJEX0ROUl9CSVRTX0FVVE8gKQotCQlkbnJfcGFyYW1zLT5tb2RlID0gQkxBQ0tCSVJEX0ROUl9CSVRTX01BTlVBTDsKLQlpZiggZG5yX3BhcmFtcy0+dHlwZSA+IEJMQUNLQklSRF9NRURJQU5fRklMVEVSX0RJQUdPTkFMICkKLQkJZG5yX3BhcmFtcy0+dHlwZSA9IEJMQUNLQklSRF9NRURJQU5fRklMVEVSX0RJU0FCTEVEOwotCS8qIGNoZWNrIGlmIHRoZSBwYXJhbXMgYWN0dWFsbHkgY2hhbmdlZCAqLwotCWlmKCBDSEVDS19ETlJfUEFSQU0oIG1vZGUgKSB8fCBDSEVDS19ETlJfUEFSQU0oIHR5cGUgKSApCi0JewotCQlVUERBVEVfRE5SX1BBUkFNKCBtb2RlICk7Ci0JCVVQREFURV9ETlJfUEFSQU0oIHR5cGUgKTsKLQkJYmxhY2tiaXJkX2FwaV9jbWQoZGV2LCBCTEFDS0JJUkRfQVBJX1NFVF9ETlJfTU9ERSwgMiwgMCwgZG5yX3BhcmFtcy0+bW9kZSwgZG5yX3BhcmFtcy0+dHlwZSk7Ci0JfQotCi0JLyogYXNzaWduIGRuciBmaWx0ZXIgcHJvcHMqLwotCWlmKCBkbnJfcGFyYW1zLT5zcGF0aWFsID4gMTUgKQotCQlkbnJfcGFyYW1zLT5zcGF0aWFsID0gMTU7Ci0JaWYoIGRucl9wYXJhbXMtPnRlbXBvcmFsID4gMzEgKQotCQlkbnJfcGFyYW1zLT50ZW1wb3JhbCA9IDMxOwotCWlmKCBDSEVDS19ETlJfUEFSQU0oIHNwYXRpYWwgKSB8fCBDSEVDS19ETlJfUEFSQU0oIHRlbXBvcmFsICkgKQotCXsKLQkJVVBEQVRFX0ROUl9QQVJBTSggc3BhdGlhbCApOwotCQlVUERBVEVfRE5SX1BBUkFNKCB0ZW1wb3JhbCApOwotCQlibGFja2JpcmRfYXBpX2NtZChkZXYsIEJMQUNLQklSRF9BUElfU0VUX01BTlVBTF9ETlIsIDIsIDAsIGRucl9wYXJhbXMtPnNwYXRpYWwsIGRucl9wYXJhbXMtPnRlbXBvcmFsKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGJsYWNrYmlyZF9jb2RlY19zZXR0aW5ncyhzdHJ1Y3QgY3g4ODAyX2RldiAqZGV2KQotewotCi0JLyogYXNzaWduIG91dHB1dCBwb3J0ICovCi0JYmxhY2tiaXJkX2FwaV9jbWQoZGV2LCBCTEFDS0JJUkRfQVBJX1NFVF9PVVRQVVRfUE9SVCwgMSwgMCwgQkxBQ0tCSVJEX09VVFBVVF9QT1JUX1NUUkVBTUlORyk7IC8qIEhvc3QgKi8KLQotCS8qIGFzc2lnbiBmcmFtZSBzaXplICovCi0JYmxhY2tiaXJkX2FwaV9jbWQoZGV2LCBCTEFDS0JJUkRfQVBJX1NFVF9SRVNPTFVUSU9OLCAyLCAwLAotCQkJCWRldi0+aGVpZ2h0LCBkZXYtPndpZHRoKTsKLQotCS8qIGFzc2lnbiBjb3JpbmcgbGV2ZWxzIChsdW1hX2gsIGx1bWFfbCwgY2hyb21hX2gsIGNocm9tYV9sKSAqLwotCWJsYWNrYmlyZF9hcGlfY21kKGRldiwgQkxBQ0tCSVJEX0FQSV9TRVRfRE5SX01FRElBTiwgNCwgMCwgMCwgMjU1LCAwLCAyNTUpOwotCi0JLyogYXNzaWduIHNwYXRpYWwgZmlsdGVyIHR5cGU6IGx1bWFfdDogaG9yaXpfb25seSwgY2hyb21hX3Q6IGhvcml6X29ubHkgKi8KLQlibGFja2JpcmRfYXBpX2NtZChkZXYsIEJMQUNLQklSRF9BUElfU0VUX1NQQVRJQUxfRklMVEVSLCAyLCAwLAotCQkJCUJMQUNLQklSRF9TUEFUSUFMX0ZJTFRFUl9MVU1BXzFEX0hPUklaLAotCQkJCUJMQUNLQklSRF9TUEFUSUFMX0ZJTFRFUl9DSFJPTUFfMURfSE9SSVoKLQkJCSk7Ci0KLQkvKiBhc3NpZ24gZnJhbWUgZHJvcCByYXRlICovCi0JLyogYmxhY2tiaXJkX2FwaV9jbWQoZGV2LCBJVlRWX0FQSV9BU1NJR05fRlJBTUVfRFJPUF9SQVRFLCAxLCAwLCAwKTsgKi8KLQotCWJsYWNrYmlyZF9zZXRfZGVmYXVsdF9wYXJhbXMoZGV2KTsKLQlibGFja2JpcmRfc2V0X2RlZmF1bHRfZG5yX3BhcmFtcyhkZXYpOwotfQotCiBzdGF0aWMgaW50IGJsYWNrYmlyZF9pbml0aWFsaXplX2NvZGVjKHN0cnVjdCBjeDg4MDJfZGV2ICpkZXYpCiB7CiAJc3RydWN0IGN4ODhfY29yZSAqY29yZSA9IGRldi0+Y29yZTsKQEAgLTEyNDgsNyArNTY4LDcgQEAKIAlpbnQgcmV0dmFsOwogCiAJZHByaW50aygxLCJJbml0aWFsaXplIGNvZGVjXG4iKTsKLQlyZXR2YWwgPSBibGFja2JpcmRfYXBpX2NtZChkZXYsIEJMQUNLQklSRF9BUElfUElORywgMCwgMCk7IC8qIHBpbmcgKi8KKwlyZXR2YWwgPSBibGFja2JpcmRfYXBpX2NtZChkZXYsIENYMjM0MVhfRU5DX1BJTkdfRlcsIDAsIDApOyAvKiBwaW5nICovCiAJaWYgKHJldHZhbCA8IDApIHsKIAkJLyogcGluZyB3YXMgbm90IHN1Y2Nlc3NmdWwsIHJlc2V0IGFuZCB1cGxvYWQgZmlybXdhcmUgKi8KIAkJY3hfd3JpdGUoTU9fU1JTVF9JTywgMCk7IC8qIFNZU19SU1RPPTAgKi8KQEAgLTEyNjMsMTMgKzU4MywxMyBAQAogCQlpZiAoZGV2LT5tYWlsYm94IDwgMCkKIAkJCXJldHVybiAtMTsKIAotCQlyZXR2YWwgPSBibGFja2JpcmRfYXBpX2NtZChkZXYsIEJMQUNLQklSRF9BUElfUElORywgMCwgMCk7IC8qIHBpbmcgKi8KKwkJcmV0dmFsID0gYmxhY2tiaXJkX2FwaV9jbWQoZGV2LCBDWDIzNDFYX0VOQ19QSU5HX0ZXLCAwLCAwKTsgLyogcGluZyAqLwogCQlpZiAocmV0dmFsIDwgMCkgewogCQkJZHByaW50aygwLCAiRVJST1I6IEZpcm13YXJlIHBpbmcgZmFpbGVkIVxuIik7CiAJCQlyZXR1cm4gLTE7CiAJCX0KIAotCQlyZXR2YWwgPSBibGFja2JpcmRfYXBpX2NtZChkZXYsIEJMQUNLQklSRF9BUElfR0VUX1ZFUlNJT04sIDAsIDEsICZ2ZXJzaW9uKTsKKwkJcmV0dmFsID0gYmxhY2tiaXJkX2FwaV9jbWQoZGV2LCBDWDIzNDFYX0VOQ19HRVRfVkVSU0lPTiwgMCwgMSwgJnZlcnNpb24pOwogCQlpZiAocmV0dmFsIDwgMCkgewogCQkJZHByaW50aygwLCAiRVJST1I6IEZpcm13YXJlIGdldCBlbmNvZGVyIHZlcnNpb24gZmFpbGVkIVxuIik7CiAJCQlyZXR1cm4gLTE7CkBAIC0xMjg5LDM1ICs2MDksMzUgQEAKIAkvKiBibGFja2JpcmRfYXBpX2NtZChkZXYsIElWVFZfQVBJX0FTU0lHTl9OVU1fVlNZTkNfTElORVMsIDQsIDAsIDB4ZWYsIDB4ZWYpOwogCSAgIGJsYWNrYmlyZF9hcGlfY21kKGRldiwgSVZUVl9BUElfQVNTSUdOX05VTV9WU1lOQ19MSU5FUywgNCwgMCwgMHhmMCwgMHhmMCk7CiAJICAgYmxhY2tiaXJkX2FwaV9jbWQoZGV2LCBJVlRWX0FQSV9BU1NJR05fTlVNX1ZTWU5DX0xJTkVTLCA0LCAwLCAweDE4MCwgMHgxODApOyAqLwotCWJsYWNrYmlyZF9hcGlfY21kKGRldiwgQkxBQ0tCSVJEX0FQSV9TRVRfQ0FQVFVSRV9MSU5FUywgMiwgMCwKKwlibGFja2JpcmRfYXBpX2NtZChkZXYsIENYMjM0MVhfRU5DX1NFVF9OVU1fVlNZTkNfTElORVMsIDIsIDAsCiAJCQlCTEFDS0JJUkRfRklFTEQxX1NBQTcxMTUsCi0JCQlCTEFDS0JJUkRfRklFTEQxX1NBQTcxMTUKKwkJCUJMQUNLQklSRF9GSUVMRDJfU0FBNzExNQogCQkpOwogCiAJLyogYmxhY2tiaXJkX2FwaV9jbWQoZGV2LCBJVlRWX0FQSV9BU1NJR05fUExBQ0VIT0xERVIsIDEyLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwKTsgKi8KLQlibGFja2JpcmRfYXBpX2NtZChkZXYsIEJMQUNLQklSRF9BUElfU0VUX0NVU1RPTV9EQVRBLCAxMiwgMCwKKwlibGFja2JpcmRfYXBpX2NtZChkZXYsIENYMjM0MVhfRU5DX1NFVF9QTEFDRUhPTERFUiwgMTIsIDAsCiAJCQlCTEFDS0JJUkRfQ1VTVE9NX0VYVEVOU0lPTl9VU1JfREFUQSwKIAkJCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDApOwogCiAJLyogaW5pdGlhbGl6ZSB0aGUgdmlkZW8gaW5wdXQgKi8KLQlibGFja2JpcmRfYXBpX2NtZChkZXYsIEJMQUNLQklSRF9BUElfSU5JVF9WSURFT19JTlBVVCwgMCwgMCk7CisJYmxhY2tiaXJkX2FwaV9jbWQoZGV2LCBDWDIzNDFYX0VOQ19JTklUSUFMSVpFX0lOUFVULCAwLCAwKTsKIAogCW1zbGVlcCgxKTsKIAotCWJsYWNrYmlyZF9hcGlfY21kKGRldiwgQkxBQ0tCSVJEX0FQSV9NVVRFX1ZJREVPLCAxLCAwLCBCTEFDS0JJUkRfVU5NVVRFKTsKKwlibGFja2JpcmRfYXBpX2NtZChkZXYsIENYMjM0MVhfRU5DX01VVEVfVklERU8sIDEsIDAsIEJMQUNLQklSRF9VTk1VVEUpOwogCW1zbGVlcCgxKTsKLQlibGFja2JpcmRfYXBpX2NtZChkZXYsIEJMQUNLQklSRF9BUElfTVVURV9BVURJTywgMSwgMCwgQkxBQ0tCSVJEX1VOTVVURSk7CisJYmxhY2tiaXJkX2FwaV9jbWQoZGV2LCBDWDIzNDFYX0VOQ19NVVRFX0FVRElPLCAxLCAwLCBCTEFDS0JJUkRfVU5NVVRFKTsKIAltc2xlZXAoMSk7CiAKIAkvKiBzdGFydCBjYXB0dXJpbmcgdG8gdGhlIGhvc3QgaW50ZXJmYWNlICovCi0JLyogYmxhY2tiaXJkX2FwaV9jbWQoZGV2LCBCTEFDS0JJUkRfQVBJX0JFR0lOX0NBUFRVUkUsIDIsIDAsIDAsIDB4MTMpOyAqLwotCWJsYWNrYmlyZF9hcGlfY21kKGRldiwgQkxBQ0tCSVJEX0FQSV9CRUdJTl9DQVBUVVJFLCAyLCAwLAorCS8qIGJsYWNrYmlyZF9hcGlfY21kKGRldiwgQ1gyMzQxWF9FTkNfU1RBUlRfQ0FQVFVSRSwgMiwgMCwgMCwgMHgxMyk7ICovCisJYmxhY2tiaXJkX2FwaV9jbWQoZGV2LCBDWDIzNDFYX0VOQ19TVEFSVF9DQVBUVVJFLCAyLCAwLAogCQkJQkxBQ0tCSVJEX01QRUdfQ0FQVFVSRSwKIAkJCUJMQUNLQklSRF9SQVdfQklUU19OT05FCiAJCSk7CiAJbXNsZWVwKDEwKTsKIAotCWJsYWNrYmlyZF9hcGlfY21kKGRldiwgQkxBQ0tCSVJEX0FQSV9SRUZSRVNIX0lOUFVULCAwLDApOworCWJsYWNrYmlyZF9hcGlfY21kKGRldiwgQ1gyMzQxWF9FTkNfUkVGUkVTSF9JTlBVVCwgMCwwKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTQ4NSwyNyArODA1LDYxIEBACiAJewogCQlzdHJ1Y3QgdjRsMl9tcGVnX2NvbXByZXNzaW9uICpmID0gYXJnOwogCi0JCW1lbWNweShmLCZkZXYtPnBhcmFtcyxzaXplb2YoKmYpKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiVklESU9DX0dfTVBFR0NPTVAgaXMgb2Jzb2xldGUuICIKKwkJCQkgICAgIlJlcGxhY2Ugd2l0aCBWSURJT0NfR19FWFRfQ1RSTFMhIik7CisJCW1lbWNweShmLCZkZWZhdWx0X21wZWdfcGFyYW1zLHNpemVvZigqZikpOwogCQlyZXR1cm4gMDsKIAl9CiAJY2FzZSBWSURJT0NfU19NUEVHQ09NUDoKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiVklESU9DX1NfTVBFR0NPTVAgaXMgb2Jzb2xldGUuICIKKwkJCQkgICAgIlJlcGxhY2Ugd2l0aCBWSURJT0NfU19FWFRfQ1RSTFMhIik7CisJCXJldHVybiAwOworCWNhc2UgVklESU9DX0dfRVhUX0NUUkxTOgogCXsKLQkJc3RydWN0IHY0bDJfbXBlZ19jb21wcmVzc2lvbiAqZiA9IGFyZzsKKwkJc3RydWN0IHY0bDJfZXh0X2NvbnRyb2xzICpmID0gYXJnOwogCi0JCWJsYWNrYmlyZF9zZXRfcGFyYW1zKGRldiwgZik7CisJCWlmIChmLT5jdHJsX2NsYXNzICE9IFY0TDJfQ1RSTF9DTEFTU19NUEVHKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiBjeDIzNDF4X2V4dF9jdHJscygmZGV2LT5wYXJhbXMsIGYsIGNtZCk7CisJfQorCWNhc2UgVklESU9DX1NfRVhUX0NUUkxTOgorCWNhc2UgVklESU9DX1RSWV9FWFRfQ1RSTFM6CisJeworCQlzdHJ1Y3QgdjRsMl9leHRfY29udHJvbHMgKmYgPSBhcmc7CisJCXN0cnVjdCBjeDIzNDF4X21wZWdfcGFyYW1zIHA7CisJCWludCBlcnI7CisKKwkJaWYgKGYtPmN0cmxfY2xhc3MgIT0gVjRMMl9DVFJMX0NMQVNTX01QRUcpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJcCA9IGRldi0+cGFyYW1zOworCQllcnIgPSBjeDIzNDF4X2V4dF9jdHJscygmcCwgZiwgY21kKTsKKwkJaWYgKGVyciA9PSAwICYmIGNtZCA9PSBWSURJT0NfU19FWFRfQ1RSTFMpIHsKKwkJCWVyciA9IGN4MjM0MXhfdXBkYXRlKGRldiwgYmxhY2tiaXJkX21ib3hfZnVuYywgJmRldi0+cGFyYW1zLCAmcCk7CisJCQlkZXYtPnBhcmFtcyA9IHA7CisJCX0KKwkJcmV0dXJuIGVycjsKKwl9CisJY2FzZSBWSURJT0NfU19GUkVRVUVOQ1k6CisJeworCQlibGFja2JpcmRfYXBpX2NtZChmaC0+ZGV2LCBDWDIzNDFYX0VOQ19TVE9QX0NBUFRVUkUsIDMsIDAsCisJCQkJICBCTEFDS0JJUkRfRU5EX05PVywKKwkJCQkgIEJMQUNLQklSRF9NUEVHX0NBUFRVUkUsCisJCQkJICBCTEFDS0JJUkRfUkFXX0JJVFNfTk9ORSk7CisKKwkJY3g4OF9kb19pb2N0bChpbm9kZSwgZmlsZSwgMCwgZGV2LT5jb3JlLCBjbWQsIGFyZywgbXBlZ19kb19pb2N0bCk7CisKKwkJYmxhY2tiaXJkX2luaXRpYWxpemVfY29kZWMoZGV2KTsKKwkJY3g4OF9zZXRfc2NhbGUoZGV2LT5jb3JlLCBkZXYtPndpZHRoLCBkZXYtPmhlaWdodCwKKwkJCSAgICAgICBmaC0+bXBlZ3EuZmllbGQpOwogCQlyZXR1cm4gMDsKIAl9CiAKIAlkZWZhdWx0OgotCQlyZXR1cm4gY3g4OF9kb19pb2N0bCggaW5vZGUsIGZpbGUsIDAsIGRldi0+Y29yZSwgY21kLCBhcmcsIGN4ODhfaW9jdGxfaG9vayApOworCQlyZXR1cm4gY3g4OF9kb19pb2N0bChpbm9kZSwgZmlsZSwgMCwgZGV2LT5jb3JlLCBjbWQsIGFyZywgbXBlZ19kb19pb2N0bCk7CiAJfQogCXJldHVybiAwOwogfQogCi1pbnQgKCpjeDg4X2lvY3RsX2hvb2spKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAotCQkJdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKTsKLXVuc2lnbmVkIGludCAoKmN4ODhfaW9jdGxfdHJhbnNsYXRvcikodW5zaWduZWQgaW50IGNtZCk7Ci0KIHN0YXRpYyB1bnNpZ25lZCBpbnQgbXBlZ190cmFuc2xhdGVfaW9jdGwodW5zaWduZWQgaW50IGNtZCkKIHsKIAlyZXR1cm4gY21kOwpAQCAtMTUxNCw4ICs4NjgsOCBAQAogc3RhdGljIGludCBtcGVnX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAogCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JY21kID0gY3g4OF9pb2N0bF90cmFuc2xhdG9yKCBjbWQgKTsKLQlyZXR1cm4gdmlkZW9fdXNlcmNvcHkoaW5vZGUsIGZpbGUsIGNtZCwgYXJnLCBjeDg4X2lvY3RsX2hvb2spOworCWNtZCA9IG1wZWdfdHJhbnNsYXRlX2lvY3RsKCBjbWQgKTsKKwlyZXR1cm4gdmlkZW9fdXNlcmNvcHkoaW5vZGUsIGZpbGUsIGNtZCwgYXJnLCBtcGVnX2RvX2lvY3RsKTsKIH0KIAogc3RhdGljIGludCBtcGVnX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCkBAIC0xNTYyLDEzICs5MTYsMTQgQEAKIHsKIAlzdHJ1Y3QgY3g4ODAyX2ZoICAqZmggID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCi0JLyogYmxhY2tiaXJkX2FwaV9jbWQoZmgtPmRldiwgQkxBQ0tCSVJEX0FQSV9FTkRfQ0FQVFVSRSwgMywgMCwgQkxBQ0tCSVJEX0VORF9OT1csIDAsIDB4MTMpOyAqLwotCWJsYWNrYmlyZF9hcGlfY21kKGZoLT5kZXYsIEJMQUNLQklSRF9BUElfRU5EX0NBUFRVUkUsIDMsIDAsCisJLyogYmxhY2tiaXJkX2FwaV9jbWQoZmgtPmRldiwgQ1gyMzQxWF9FTkNfU1RPUF9DQVBUVVJFLCAzLCAwLCBCTEFDS0JJUkRfRU5EX05PVywgMCwgMHgxMyk7ICovCisJYmxhY2tiaXJkX2FwaV9jbWQoZmgtPmRldiwgQ1gyMzQxWF9FTkNfU1RPUF9DQVBUVVJFLCAzLCAwLAogCQkJQkxBQ0tCSVJEX0VORF9OT1csCiAJCQlCTEFDS0JJUkRfTVBFR19DQVBUVVJFLAogCQkJQkxBQ0tCSVJEX1JBV19CSVRTX05PTkUKIAkJKTsKIAorCWN4ODgwMl9jYW5jZWxfYnVmZmVycyhmaC0+ZGV2KTsKIAkvKiBzdG9wIG1wZWcgY2FwdHVyZSAqLwogCWlmIChmaC0+bXBlZ3Euc3RyZWFtaW5nKQogCQl2aWRlb2J1Zl9zdHJlYW1vZmYoJmZoLT5tcGVncSk7CkBAIC0xNjgzLDE5ICsxMDM4LDEzIEBACiAJZGV2LT5jb3JlID0gY29yZTsKIAlkZXYtPndpZHRoID0gNzIwOwogCWRldi0+aGVpZ2h0ID0gNTc2OwotCW1lbWNweSgmZGV2LT5wYXJhbXMsJmRlZmF1bHRfbXBlZ19wYXJhbXMsc2l6ZW9mKGRlZmF1bHRfbXBlZ19wYXJhbXMpKTsKLQltZW1jcHkoJmRldi0+ZG5yX3BhcmFtcywmZGVmYXVsdF9kbnJfcGFyYW1zLHNpemVvZihkZWZhdWx0X2Rucl9wYXJhbXMpKTsKKwljeDIzNDF4X2ZpbGxfZGVmYXVsdHMoJmRldi0+cGFyYW1zKTsKKwlkZXYtPnBhcmFtcy5wb3J0ID0gQ1gyMzQxWF9QT1JUX1NUUkVBTUlORzsKIAotCWlmIChjb3JlLT5ib2FyZCA9PSBDWDg4X0JPQVJEX0hBVVBQQVVHRV9ST1NMWU4pIHsKLQotCQlpZiAoY29yZS0+dHVuZXJfZm9ybWF0cyAmIFY0TDJfU1REXzUyNV82MCkgewotCQkJZGV2LT5oZWlnaHQgPSA0ODA7Ci0JCQlkZXYtPnBhcmFtcy52aV9mcmFtZV9yYXRlID0gMzA7Ci0JCX0gZWxzZSB7Ci0JCQlkZXYtPmhlaWdodCA9IDU3NjsKLQkJCWRldi0+cGFyYW1zLnZpX2ZyYW1lX3JhdGUgPSAyNTsKLQkJfQotCisJaWYgKGNvcmUtPnR2bm9ybS0+aWQgJiBWNEwyX1NURF81MjVfNjApIHsKKwkJZGV2LT5oZWlnaHQgPSA0ODA7CisJfSBlbHNlIHsKKwkJZGV2LT5oZWlnaHQgPSA1NzY7CiAJfQogCiAJZXJyID0gY3g4ODAyX2luaXRfY29tbW9uKGRldik7CkBAIC0xNzY2LDggKzExMTUsNiBAQAogCXByaW50ayhLRVJOX0lORk8gImN4MjM4OHg6IHNuYXBzaG90IGRhdGUgJTA0ZC0lMDJkLSUwMmRcbiIsCiAJICAgICAgIFNOQVBTSE9ULzEwMDAwLCAoU05BUFNIT1QvMTAwKSUxMDAsIFNOQVBTSE9UJTEwMCk7CiAjZW5kaWYKLQljeDg4X2lvY3RsX2hvb2sgPSBtcGVnX2RvX2lvY3RsOwotCWN4ODhfaW9jdGxfdHJhbnNsYXRvciA9IG1wZWdfdHJhbnNsYXRlX2lvY3RsOwogCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZibGFja2JpcmRfcGNpX2RyaXZlcik7CiB9CiAKQEAgLTE3NzksMTEgKzExMjYsNiBAQAogbW9kdWxlX2luaXQoYmxhY2tiaXJkX2luaXQpOwogbW9kdWxlX2V4aXQoYmxhY2tiaXJkX2ZpbmkpOwogCi1FWFBPUlRfU1lNQk9MKGN4ODhfaW9jdGxfaG9vayk7Ci1FWFBPUlRfU1lNQk9MKGN4ODhfaW9jdGxfdHJhbnNsYXRvcik7Ci1FWFBPUlRfU1lNQk9MKGJsYWNrYmlyZF9zZXRfcGFyYW1zKTsKLUVYUE9SVF9TWU1CT0woYmxhY2tiaXJkX3NldF9kbnJfcGFyYW1zKTsKLQogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qCiAgKiBMb2NhbCB2YXJpYWJsZXM6CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1jYXJkcy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtY2FyZHMuYwppbmRleCBmODAxNTRiLi5mOWQ2OGYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1jYXJkcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWNhcmRzLmMKQEAgLTExNCw3ICsxMTQsNyBAQAogCQkucmFkaW8gPSB7CiAJCQkgLnR5cGUgID0gQ1g4OF9SQURJTywKIAkJCSAuZ3BpbzAgPSAweGZmMTAsCi0JCSB9LAorCQl9LAogCX0sCiAJW0NYODhfQk9BUkRfQVRJX1dPTkRFUl9QUk9dID0gewogCQkubmFtZSAgICAgICAgICAgPSAiQVRJIFRWIFdvbmRlciBQcm8iLApAQCAtMjY3LDcgKzI2Nyw3IEBACiAJCQkuZ3BpbzEgID0gMHgwMDAwNzAwNCwKIAkJCS5ncGlvMiAgPSAweDAwMzVkNzAwLAogCQkJLmdwaW8zICA9IDB4MDIwMDAwMDAsCi0JCSB9LAorCQl9LAogCX0sCiAJW0NYODhfQk9BUkRfTEVBRFRFS19QVlIyMDAwXSA9IHsKIAkJLy8gZ3BpbyB2YWx1ZXMgZm9yIFBBTCB2ZXJzaW9uIGZyb20gcmVnc3B5IGJ5IERTY2FsZXIKQEAgLTQxMyw3ICs0MTMsNyBAQAogCQkJLnR5cGUgICA9IENYODhfVk1VWF9DT01QT1NJVEUxLAogCQkJLnZtdXggICA9IDEsCiAJCQkuZ3BpbzAgID0gMHgwMDAwMjdkZiwKLQkJIH0seworCQl9LHsKIAkJCS50eXBlICAgPSBDWDg4X1ZNVVhfU1ZJREVPLAogCQkJLnZtdXggICA9IDIsCiAJCQkuZ3BpbzAgID0gMHgwMDAwMjdkZiwKQEAgLTUzNiw3ICs1MzYsNyBAQAogCQkJLnR5cGUgICA9IENYODhfVk1VWF9DT01QT1NJVEUxLAogCQkJLnZtdXggICA9IDEsCiAJCQkuZ3BpbzAgID0gMHgwMDAwMjdkZiwKLQkJIH0seworCQl9LHsKIAkJCS50eXBlICAgPSBDWDg4X1ZNVVhfU1ZJREVPLAogCQkJLnZtdXggICA9IDIsCiAJCQkuZ3BpbzAgID0gMHgwMDAwMjdkZiwKQEAgLTc1OSw3ICs3NTksNyBAQAogCX0sCiAJW0NYODhfQk9BUkRfRFZJQ09fRlVTSU9OSERUVl81X0dPTERdID0gewogCQkubmFtZSAgICAgICAgICAgPSAiRFZpQ08gRnVzaW9uSERUViA1IEdvbGQiLAotCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9MR19URFZTX0gwNjJGLAorCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9MR19URFZTX0gwNlhGLCAvKiBURFZTLUgwNjJGICovCiAJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAogCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiAJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKQEAgLTEwNTAsMTEgKzEwNTAsNyBAQAogCQkuZHZiICAgICAgICAgICAgPSAxLAogCX0sCiAJW0NYODhfQk9BUkRfS1dPUkxEX0hBUkRXQVJFX01QRUdfVFZfWFBFUlRdID0gewotCQkvKiBGSVhNRTogU3RhbmRhcmQgdmlkZW8gdXNpbmcgdGhlIGN4ODggYnJvYWRjYXN0IGRlY29kZXIgaXMKLQkJICogd29ya2luZywgYnV0IGJsYWNrYmlyZCBpc24ndCB3b3JraW5nIHlldCwgYXVkaW8gaXMgb25seQotCQkgKiB3b3JraW5nIGNvcnJlY3RseSBmb3IgdGVsZXZpc2lvbiBtb2RlLiBTLVZpZGVvIGFuZCBDb21wb3NpdGUKLQkJICogYXJlIHdvcmtpbmcgZm9yIHZpZGVvLW9ubHksIHNvIEkgaGF2ZSB0aGVtIGRpc2FibGVkIGZvciBub3cuCi0JCSAqLworCQkvKiBGSVhNRTogQXVkaW8gbm90IHdvcmtpbmcgZm9yIHMtdmlkZW8gLyBjb21wb3NpdGUgaW5wdXRzLiAqLwogCQkubmFtZSAgICAgICAgICAgPSAiS1dvcmxkIEhhcmR3YXJlTXBlZ1RWIFhQZXJ0IiwKIAkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19UREE4MjkwLAogCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKQEAgLTEwNjUsMTIgKzEwNjEsMjEgQEAKIAkJCS52bXV4ICAgPSAwLAogCQkJLmdwaW8wICA9IDB4M2RlMiwKIAkJCS5ncGlvMiAgPSAweDAwZmYsCisJCX0seworCQkJLnR5cGUgICA9IENYODhfVk1VWF9DT01QT1NJVEUxLAorCQkJLnZtdXggICA9IDEsCisJCQkuZ3BpbzAgID0gMHgzZGU2LAorCQl9LHsKKwkJCS50eXBlICAgPSBDWDg4X1ZNVVhfU1ZJREVPLAorCQkJLnZtdXggICA9IDIsCisJCQkuZ3BpbzAgID0gMHgzZGU2LAogCQl9fSwKIAkJLnJhZGlvID0gewogCQkJLnR5cGUgICA9IENYODhfUkFESU8sCiAJCQkuZ3BpbzAgID0gMHgzZGU2LAogCQkJLmdwaW8yICA9IDB4MDBmZiwKIAkJfSwKKwkJLmJsYWNrYmlyZCAgICAgID0gMSwKIAl9LAogCVtDWDg4X0JPQVJEX0RWSUNPX0ZVU0lPTkhEVFZfRFZCX1RfSFlCUklEXSA9IHsKIAkJLm5hbWUgICAgICAgICAgID0gIkRWaUNPIEZ1c2lvbkhEVFYgRFZCLVQgSHlicmlkIiwKQEAgLTEwOTMsNyArMTA5OCwxMDIgQEAKIAkJfX0sCiAJCS5kdmIgICAgICAgICAgICA9IDEsCiAJfSwKLQorCVtDWDg4X0JPQVJEX1BDSERUVl9IRDU1MDBdID0geworCQkubmFtZSAgICAgICAgICAgPSAicGNIRFRWIEhENTUwMCBIRFRWIiwKKwkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfTEdfVERWU19IMDZYRiwgLyogVERWUy1IMDY0RiAqLworCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCisJCS50ZGE5ODg3X2NvbmYgICA9IFREQTk4ODdfUFJFU0VOVCwKKwkJLmlucHV0ICAgICAgICAgID0ge3sKKwkJCS50eXBlICAgPSBDWDg4X1ZNVVhfVEVMRVZJU0lPTiwKKwkJCS52bXV4ICAgPSAwLAorCQkJLmdwaW8wICA9IDB4ODdmZCwKKwkJfSx7CisJCQkudHlwZSAgID0gQ1g4OF9WTVVYX0NPTVBPU0lURTEsCisJCQkudm11eCAgID0gMSwKKwkJCS5ncGlvMCAgPSAweDg3ZjksCisJCX0seworCQkJLnR5cGUgICA9IENYODhfVk1VWF9TVklERU8sCisJCQkudm11eCAgID0gMiwKKwkJCS5ncGlvMCAgPSAweDg3ZjksCisJCX19LAorCQkuZHZiICAgICAgICAgICAgPSAxLAorCX0sCisJW0NYODhfQk9BUkRfS1dPUkxEX01DRTIwMF9ERUxVWEVdID0geworCQkvKiBGSVhNRTogdGVzdGVkIFRWIGlucHV0IG9ubHksIGRpc2FibGVkIGNvbXBvc2l0ZSwKKwkJICAgc3ZpZGVvIGFuZCByYWRpbyB1bnRpbCB0aGV5IGNhbiBiZSB0ZXN0ZWQgYWxzby4gKi8KKwkJLm5hbWUgICAgICAgICAgID0gIkt3b3JsZCBNQ0UgMjAwIERlbHV4ZSIsCisJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1RFTkFfOTUzM19ESSwKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50ZGE5ODg3X2NvbmYgICA9IFREQTk4ODdfUFJFU0VOVCwKKwkJLnR1bmVyX2FkZHIgICAgID0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKKwkJLmlucHV0ICAgICAgICAgID0ge3sKKwkJCS50eXBlICAgPSBDWDg4X1ZNVVhfVEVMRVZJU0lPTiwKKwkJCS52bXV4ICAgPSAwLAorCQkJLmdwaW8wICA9IDB4MDAwMEJERTYKKwkJfX0sCisJCS5ibGFja2JpcmQgPSAxLAorCX0sCisJW0NYODhfQk9BUkRfUElYRUxWSUVXX1BMQVlUVl9QNzAwMF0gPSB7CisJCS8qIEZJWE1FOiBTVmlkZW8sIENvbXBvc2l0ZSBhbmQgRk0gaW5wdXRzIGFyZSB1bnRlc3RlZCAqLworCQkubmFtZSAgICAgICAgICAgPSAiUGl4ZWxWaWV3IFBsYXlUViBQNzAwMCIsCisJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfRk0xMjE2TUVfTUszLAorCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCisJCS50ZGE5ODg3X2NvbmYgICA9IFREQTk4ODdfUFJFU0VOVCB8IFREQTk4ODdfUE9SVDFfQUNUSVZFIHwKKwkJCQkgIFREQTk4ODdfUE9SVDJfQUNUSVZFLAorCQkuaW5wdXQgICAgICAgICAgPSB7eworCQkJLnR5cGUgICA9IENYODhfVk1VWF9URUxFVklTSU9OLAorCQkJLnZtdXggICA9IDAsCisJCQkuZ3BpbzAgID0gMHg1ZGE2LAorCQl9fSwKKwkJLmJsYWNrYmlyZCA9IDEsCisJfSwKKwlbQ1g4OF9CT0FSRF9OUEdURUNIX1JFQUxUVl9UT1AxMEZNXSA9IHsKKwkJLm5hbWUgICAgICAgICAgID0gIk5QRyBUZWNoIFJlYWwgVFYgRk0gVG9wIDEwIiwKKwkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfVE5GXzUzMzVNRiwgLyogQWN0dWFsbHkgYSBUTkY5NTM1ICovCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKKwkJLmlucHV0ICAgICAgICAgID0ge3sKKwkJCS50eXBlICAgPSBDWDg4X1ZNVVhfVEVMRVZJU0lPTiwKKwkJCS52bXV4ICAgPSAwLAorCQkJLmdwaW8wCT0gMHgwNzg4LAorCQl9LHsKKwkJCS50eXBlICAgPSBDWDg4X1ZNVVhfQ09NUE9TSVRFMSwKKwkJCS52bXV4ICAgPSAxLAorCQkJLmdwaW8wCT0gMHgwNzhiLAorCQl9LHsKKwkJCS50eXBlICAgPSBDWDg4X1ZNVVhfU1ZJREVPLAorCQkJLnZtdXggICA9IDIsCisJCQkuZ3BpbzAJPSAweDA3OGIsCisJCX19LAorCQkucmFkaW8gPSB7CisJCQkgLnR5cGUgID0gQ1g4OF9SQURJTywKKwkJCSAuZ3BpbzAgPSAweDA3NGEsCisJCX0sCisJfSwKKwlbQ1g4OF9CT0FSRF9XSU5GQVNUX0RUVjIwMDBIXSA9IHsKKwkJLyogdmlkZW8gaW5wdXRzIGFuZCByYWRpbyBzdGlsbCBpbiB0ZXN0aW5nICovCisJCS5uYW1lICAgICAgICAgICA9ICJXaW5GYXN0IERUVjIwMDAgSCIsCisJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfRk1EMTIxNk1FX01LMywKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyICAgICA9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCisJCS50ZGE5ODg3X2NvbmYgICA9IFREQTk4ODdfUFJFU0VOVCwKKwkJLmlucHV0ICAgICAgICAgID0ge3sKKwkJCS50eXBlICAgPSBDWDg4X1ZNVVhfVEVMRVZJU0lPTiwKKwkJCS52bXV4ICAgPSAwLAorCQkJLmdwaW8wICA9IDB4MDAwMTczMDQsCisJCQkuZ3BpbzEgID0gMHgwMDAwODIwMywKKwkJCS5ncGlvMiAgPSAweDAwMDE3MzA0LAorCQkJLmdwaW8zICA9IDB4MDIwMDAwMDAsCisJCX19LAorCQkuZHZiICAgICAgICAgICAgPSAxLAorCX0sCiB9OwogY29uc3QgdW5zaWduZWQgaW50IGN4ODhfYmNvdW50ID0gQVJSQVlfU0laRShjeDg4X2JvYXJkcyk7CiAKQEAgLTEzMTEsNiArMTQxMSwzNCBAQAogCQkuc3VidmVuZG9yID0gMHgxOGFjLAogCQkuc3ViZGV2aWNlID0gMHhkYjQ0LAogCQkuY2FyZCAgICAgID0gQ1g4OF9CT0FSRF9EVklDT19GVVNJT05IRFRWX0RWQl9UX0hZQlJJRCwKKwl9LHsKKwkJLnN1YnZlbmRvciA9IDB4NzA2MywKKwkJLnN1YmRldmljZSA9IDB4NTUwMCwKKwkJLmNhcmQgICAgICA9IENYODhfQk9BUkRfUENIRFRWX0hENTUwMCwKKwl9LHsKKwkJLnN1YnZlbmRvciA9IDB4MTdkZSwKKwkJLnN1YmRldmljZSA9IDB4MDg0MSwKKwkJLmNhcmQgICAgICA9IENYODhfQk9BUkRfS1dPUkxEX01DRTIwMF9ERUxVWEUsCisJfSx7CisJCS5zdWJ2ZW5kb3IgPSAweDE4MjIsCisJCS5zdWJkZXZpY2UgPSAweDAwMTksCisJCS5jYXJkICAgICAgPSBDWDg4X0JPQVJEX0ROVFZfTElWRV9EVkJfVF9QUk8sCisJfSx7CisJCS5zdWJ2ZW5kb3IgPSAweDE1NTQsCisJCS5zdWJkZXZpY2UgPSAweDQ4MTMsCisJCS5jYXJkICAgICAgPSBDWDg4X0JPQVJEX1BJWEVMVklFV19QTEFZVFZfUDcwMDAsCisJfSx7CisJCS5zdWJ2ZW5kb3IgPSAweDE0ZjEsCisJCS5zdWJkZXZpY2UgPSAweDA4NDIsCisJCS5jYXJkICAgICAgPSBDWDg4X0JPQVJEX05QR1RFQ0hfUkVBTFRWX1RPUDEwRk0sCisJfSx7CisJCS5zdWJ2ZW5kb3IgPSAweDEwN2QsCisJCS5zdWJkZXZpY2UgPSAweDY2NWUsCisJCS5jYXJkICAgICAgPSBDWDg4X0JPQVJEX1dJTkZBU1RfRFRWMjAwMEgsCisJfSx7CisJCS5zdWJ2ZW5kb3IgPSAweDE4YWMsCisJCS5zdWJkZXZpY2UgPSAweGQ4MDAsIC8qIEZ1c2lvbkhEVFYgMyBHb2xkIChvcmlnaW5hbCByZXZpc2lvbikgKi8KKwkJLmNhcmQgICAgICA9IENYODhfQk9BUkRfRFZJQ09fRlVTSU9OSERUVl8zX0dPTERfUSwKIAl9LAogfTsKIGNvbnN0IHVuc2lnbmVkIGludCBjeDg4X2lkY291bnQgPSBBUlJBWV9TSVpFKGN4ODhfc3ViaWRzKTsKQEAgLTE1NzIsMTEgKzE3MDAsNiBAQAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIEVYUE9SVF9TWU1CT0woY3g4OF9ib2FyZHMpOwotRVhQT1JUX1NZTUJPTChjeDg4X2Jjb3VudCk7Ci1FWFBPUlRfU1lNQk9MKGN4ODhfc3ViaWRzKTsKLUVYUE9SVF9TWU1CT0woY3g4OF9pZGNvdW50KTsKLUVYUE9SVF9TWU1CT0woY3g4OF9jYXJkX2xpc3QpOwotRVhQT1JUX1NZTUJPTChjeDg4X2NhcmRfc2V0dXApOwogCiAvKgogICogTG9jYWwgdmFyaWFibGVzOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtY29yZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtY29yZS5jCmluZGV4IGUxMDkyZDUuLjI2ZjRjMGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWNvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1jb3JlLmMKQEAgLTY3Nyw3ICs2NzcsNyBAQAogCiBzdGF0aWMgdW5zaWduZWQgaW50IGlubGluZSBub3JtX3ZiaXBhY2soc3RydWN0IGN4ODhfdHZub3JtICpub3JtKQogewotCXJldHVybiAobm9ybS0+aWQgJiBWNEwyX1NURF82MjVfNTApID8gNTExIDogMjg4OworCXJldHVybiAobm9ybS0+aWQgJiBWNEwyX1NURF82MjVfNTApID8gNTExIDogNDAwOwogfQogCiBpbnQgY3g4OF9zZXRfc2NhbGUoc3RydWN0IGN4ODhfY29yZSAqY29yZSwgdW5zaWduZWQgaW50IHdpZHRoLCB1bnNpZ25lZCBpbnQgaGVpZ2h0LApAQCAtOTMyLDkgKzkzMiw5IEBACiAJCWh0b3RhbCwgY3hfcmVhZChNT19IVE9UQUwpLCAodTMyKXRtcDY0KTsKIAljeF93cml0ZShNT19IVE9UQUwsIGh0b3RhbCk7CiAKLQkvLyB2Ymkgc3R1ZmYKLQljeF93cml0ZShNT19WQklfUEFDS0VULCAoKDEgPDwgMTEpIHwgLyogKG5vcm1fdmRlbGF5KG5vcm0pICAgPDwgMTEpIHwgKi8KLQkJCQkgbm9ybV92YmlwYWNrKG5vcm0pKSk7CisJLy8gdmJpIHN0dWZmLCBzZXQgdmJpIG9mZnNldCB0byAxMCAoZm9yIDIwIENsayoyIHBpeGVscyksIHRoaXMgbWFrZXMKKwkvLyB0aGUgZWZmZWN0aXZlIHZiaSBvZmZzZXQgfjI0NCBzYW1wbGVzLCB0aGUgc2FtZSBhcyB0aGUgQnQ4eDgKKwljeF93cml0ZShNT19WQklfUEFDS0VULCAoMTA8PDExKSB8IG5vcm1fdmJpcGFjayhub3JtKSk7CiAKIAkvLyB0aGlzIGlzIG5lZWRlZCBhcyB3ZWxsIHRvIHNldCBhbGwgdHZub3JtIHBhcmFtZXRlcgogCWN4ODhfc2V0X3NjYWxlKGNvcmUsIDMyMCwgMjQwLCBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQpOwpAQCAtMTE4MSw4ICsxMTgxLDYgQEAKIEVYUE9SVF9TWU1CT0woY3g4OF92ZGV2X2luaXQpOwogRVhQT1JUX1NZTUJPTChjeDg4X2NvcmVfZ2V0KTsKIEVYUE9SVF9TWU1CT0woY3g4OF9jb3JlX3B1dCk7Ci1FWFBPUlRfU1lNQk9MKGN4ODhfc3RhcnRfYXVkaW9fZG1hKTsKLUVYUE9SVF9TWU1CT0woY3g4OF9zdG9wX2F1ZGlvX2RtYSk7CiAKIC8qCiAgKiBMb2NhbCB2YXJpYWJsZXM6CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1kdmIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWR2Yi5jCmluZGV4IDM2MTlhNDQuLmRjZTFmZWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWR2Yi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWR2Yi5jCkBAIC01MSw2ICs1MSw3IEBACiAjZW5kaWYKICNpZmRlZiBIQVZFX0xHRFQzMzBYCiAjIGluY2x1ZGUgImxnZHQzMzB4LmgiCisjIGluY2x1ZGUgImxnX2gwNnhmLmgiCiAjZW5kaWYKICNpZmRlZiBIQVZFX05YVDIwMFgKICMgaW5jbHVkZSAibnh0MjAweC5oIgpAQCAtNTgsNiArNTksNyBAQAogI2lmZGVmIEhBVkVfQ1gyNDEyMwogIyBpbmNsdWRlICJjeDI0MTIzLmgiCiAjZW5kaWYKKyNpbmNsdWRlICJpc2w2NDIxLmgiCiAKIE1PRFVMRV9ERVNDUklQVElPTigiZHJpdmVyIGZvciBjeDIzODh4IGJhc2VkIERWQiBjYXJkcyIpOwogTU9EVUxFX0FVVEhPUigiQ2hyaXMgUGFzY29lIDxjLnBhc2NvZUBpdGVlLnVxLmVkdS5hdT4iKTsKQEAgLTExMywyMSArMTE1LDYgQEAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLSNpZiBkZWZpbmVkKEhBVkVfTVQzNTIpIHx8IGRlZmluZWQoSEFWRV9aTDEwMzUzKQotc3RhdGljIGludCB6YXJsaW5rX3BsbF9zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCi0JCQkgICAgICBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnBhcmFtcywKLQkJCSAgICAgIHU4ICpwbGxidWYpCi17Ci0Jc3RydWN0IGN4ODgwMl9kZXYgKmRldiA9IGZlLT5kdmItPnByaXY7Ci0KLQlwbGxidWZbMF0gPSBkZXYtPmNvcmUtPnBsbF9hZGRyIDw8IDE7Ci0JZHZiX3BsbF9jb25maWd1cmUoZGV2LT5jb3JlLT5wbGxfZGVzYywgcGxsYnVmICsgMSwKLQkJCSAgcGFyYW1zLT5mcmVxdWVuY3ksCi0JCQkgIHBhcmFtcy0+dS5vZmRtLmJhbmR3aWR0aCk7Ci0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQogI2lmZGVmIEhBVkVfTVQzNTIKIHN0YXRpYyBpbnQgZHZpY29fZnVzaW9uaGR0dl9kZW1vZF9pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKQogewpAQCAtMTk2LDE5ICsxODMsMTYgQEAKIHN0YXRpYyBzdHJ1Y3QgbXQzNTJfY29uZmlnIGR2aWNvX2Z1c2lvbmhkdHYgPSB7CiAJLmRlbW9kX2FkZHJlc3MgPSAweDBGLAogCS5kZW1vZF9pbml0ICAgID0gZHZpY29fZnVzaW9uaGR0dl9kZW1vZF9pbml0LAotCS5wbGxfc2V0ICAgICAgID0gemFybGlua19wbGxfc2V0LAogfTsKIAogc3RhdGljIHN0cnVjdCBtdDM1Ml9jb25maWcgZG50dl9saXZlX2R2YnRfY29uZmlnID0gewogCS5kZW1vZF9hZGRyZXNzID0gMHgwZiwKIAkuZGVtb2RfaW5pdCAgICA9IGRudHZfbGl2ZV9kdmJ0X2RlbW9kX2luaXQsCi0JLnBsbF9zZXQgICAgICAgPSB6YXJsaW5rX3BsbF9zZXQsCiB9OwogCiBzdGF0aWMgc3RydWN0IG10MzUyX2NvbmZpZyBkdmljb19mdXNpb25oZHR2X2R1YWwgPSB7CiAJLmRlbW9kX2FkZHJlc3MgPSAweDBGLAogCS5kZW1vZF9pbml0ICAgID0gZHZpY29fZHVhbF9kZW1vZF9pbml0LAotCS5wbGxfc2V0ICAgICAgID0gemFybGlua19wbGxfc2V0LAogfTsKIAogI2lmZGVmIEhBVkVfVlAzMDU0X0kyQwpAQCAtMjQ2LDYgKzIzMCw4IEBACiAJCSAgLmJ1ZiA9IGZtZDEyMTZfaW5pdCwgLmxlbiA9IHNpemVvZihmbWQxMjE2X2luaXQpIH07CiAJaW50IGVycjsKIAorCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMSk7CiAJaWYgKChlcnIgPSBpMmNfdHJhbnNmZXIoJmRldi0+Y29yZS0+aTJjX2FkYXAsICZtc2csIDEpKSAhPSAxKSB7CiAJCWlmIChlcnIgPCAwKQogCQkJcmV0dXJuIGVycjsKQEAgLTI1NiwxNCArMjQyLDE0IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZG50dl9saXZlX2R2YnRfcHJvX3BsbF9zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsCi0JCQkJICAgICAgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMsCi0JCQkJICAgICAgdTgqIHBsbGJ1ZikKK3N0YXRpYyBpbnQgZG50dl9saXZlX2R2YnRfcHJvX3R1bmVyX3NldF9wYXJhbXMoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsCisJCQkJCSAgICAgICBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcykKIHsKIAlzdHJ1Y3QgY3g4ODAyX2RldiAqZGV2PSBmZS0+ZHZiLT5wcml2OworCXU4IGJ1Zls0XTsKIAlzdHJ1Y3QgaTJjX21zZyBtc2cgPQogCQl7IC5hZGRyID0gZGV2LT5jb3JlLT5wbGxfYWRkciwgLmZsYWdzID0gMCwKLQkJICAuYnVmID0gcGxsYnVmKzEsIC5sZW4gPSA0IH07CisJCSAgLmJ1ZiA9IGJ1ZiwgLmxlbiA9IDQgfTsKIAlpbnQgZXJyOwogCiAJLyogU3dpdGNoIFBMTCB0byBEVkIgbW9kZSAqLwpAQCAtMjcyLDE0ICsyNTgsMTYgQEAKIAkJcmV0dXJuIGVycjsKIAogCS8qIFR1bmUgUExMICovCi0JcGxsYnVmWzBdID0gZGV2LT5jb3JlLT5wbGxfYWRkciA8PCAxOwotCWR2Yl9wbGxfY29uZmlndXJlKGRldi0+Y29yZS0+cGxsX2Rlc2MsIHBsbGJ1ZisxLAorCWR2Yl9wbGxfY29uZmlndXJlKGRldi0+Y29yZS0+cGxsX2Rlc2MsIGJ1ZiwKIAkJCSAgcGFyYW1zLT5mcmVxdWVuY3ksCiAJCQkgIHBhcmFtcy0+dS5vZmRtLmJhbmR3aWR0aCk7CisJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKIAlpZiAoKGVyciA9IGkyY190cmFuc2ZlcigmZGV2LT5jb3JlLT5pMmNfYWRhcCwgJm1zZywgMSkpICE9IDEpIHsKKwogCQlwcmludGsoS0VSTl9XQVJOSU5HICJjeDg4LWR2YjogJXMgZXJyb3IgIgogCQkJICAgIihhZGRyICUwMnggPC0gJTAyeCwgZXJyID0gJWkpXG4iLAotCQkJICAgX19GVU5DVElPTl9fLCBwbGxidWZbMF0sIHBsbGJ1ZlsxXSwgZXJyKTsKKwkJCSAgIF9fRlVOQ1RJT05fXywgZGV2LT5jb3JlLT5wbGxfYWRkciwgYnVmWzBdLCBlcnIpOwogCQlpZiAoZXJyIDwgMCkKIAkJCXJldHVybiBlcnI7CiAJCWVsc2UKQEAgLTI5MywyNyArMjgxLDI3IEBACiAJLmRlbW9kX2FkZHJlc3MgPSAweDBmLAogCS5ub190dW5lciAgICAgID0gMSwKIAkuZGVtb2RfaW5pdCAgICA9IGRudHZfbGl2ZV9kdmJ0X3Byb19kZW1vZF9pbml0LAotCS5wbGxfc2V0ICAgICAgID0gZG50dl9saXZlX2R2YnRfcHJvX3BsbF9zZXQsCiB9OwogI2VuZGlmCiAjZW5kaWYKIAogI2lmZGVmIEhBVkVfWkwxMDM1Mwotc3RhdGljIGludCBkdmljb19oeWJyaWRfdHVuZV9wbGwoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCi0JCQkJIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcGFyYW1zLAotCQkJCSB1OCAqcGxsYnVmKQorc3RhdGljIGludCBkdmljb19oeWJyaWRfdHVuZXJfc2V0X3BhcmFtcyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwkJCQkJIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcGFyYW1zKQogeworCXU4IHBsbGJ1Zls0XTsKIAlzdHJ1Y3QgY3g4ODAyX2RldiAqZGV2PSBmZS0+ZHZiLT5wcml2OwogCXN0cnVjdCBpMmNfbXNnIG1zZyA9CiAJCXsgLmFkZHIgPSBkZXYtPmNvcmUtPnBsbF9hZGRyLCAuZmxhZ3MgPSAwLAotCQkgIC5idWYgPSBwbGxidWYgKyAxLCAubGVuID0gNCB9OworCQkgIC5idWYgPSBwbGxidWYsIC5sZW4gPSA0IH07CiAJaW50IGVycjsKIAotCXBsbGJ1ZlswXSA9IGRldi0+Y29yZS0+cGxsX2FkZHIgPDwgMTsKLQlkdmJfcGxsX2NvbmZpZ3VyZShkZXYtPmNvcmUtPnBsbF9kZXNjLCBwbGxidWYgKyAxLAorCWR2Yl9wbGxfY29uZmlndXJlKGRldi0+Y29yZS0+cGxsX2Rlc2MsIHBsbGJ1ZiwKIAkJCSAgcGFyYW1zLT5mcmVxdWVuY3ksCiAJCQkgIHBhcmFtcy0+dS5vZmRtLmJhbmR3aWR0aCk7CiAKKwlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDEpOwogCWlmICgoZXJyID0gaTJjX3RyYW5zZmVyKCZkZXYtPmNvcmUtPmkyY19hZGFwLCAmbXNnLCAxKSkgIT0gMSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJjeDg4LWR2YjogJXMgZXJyb3IgIgogCQkJICAgIihhZGRyICUwMnggPC0gJTAyeCwgZXJyID0gJWkpXG4iLApAQCAtMzI5LDEyICszMTcsMTEgQEAKIAogc3RhdGljIHN0cnVjdCB6bDEwMzUzX2NvbmZpZyBkdmljb19mdXNpb25oZHR2X2h5YnJpZCA9IHsKIAkuZGVtb2RfYWRkcmVzcyA9IDB4MEYsCi0JLnBsbF9zZXQgICAgICAgPSBkdmljb19oeWJyaWRfdHVuZV9wbGwsCisJLm5vX3R1bmVyICAgICAgPSAxLAogfTsKIAogc3RhdGljIHN0cnVjdCB6bDEwMzUzX2NvbmZpZyBkdmljb19mdXNpb25oZHR2X3BsdXNfdjFfMSA9IHsKIAkuZGVtb2RfYWRkcmVzcyA9IDB4MEYsCi0JLnBsbF9zZXQgICAgICAgPSB6YXJsaW5rX3BsbF9zZXQsCiB9OwogI2VuZGlmCiAKQEAgLTM0MiwyMSArMzI5LDE1IEBACiBzdGF0aWMgc3RydWN0IGN4MjI3MDJfY29uZmlnIGNvbm5leGFudF9yZWZib2FyZF9jb25maWcgPSB7CiAJLmRlbW9kX2FkZHJlc3MgPSAweDQzLAogCS5vdXRwdXRfbW9kZSAgID0gQ1gyMjcwMl9TRVJJQUxfT1VUUFVULAotCS5wbGxfYWRkcmVzcyAgID0gMHg2MCwKLQkucGxsX2Rlc2MgICAgICA9ICZkdmJfcGxsX3Rob21zb25fZHR0NzU3OSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY3gyMjcwMl9jb25maWcgaGF1cHBhdWdlX25vdmF0X2NvbmZpZyA9IHsKIAkuZGVtb2RfYWRkcmVzcyA9IDB4NDMsCiAJLm91dHB1dF9tb2RlICAgPSBDWDIyNzAyX1NFUklBTF9PVVRQVVQsCi0JLnBsbF9hZGRyZXNzICAgPSAweDYxLAotCS5wbGxfZGVzYyAgICAgID0gJmR2Yl9wbGxfdGhvbXNvbl9kdHQ3NTl4LAogfTsKIHN0YXRpYyBzdHJ1Y3QgY3gyMjcwMl9jb25maWcgaGF1cHBhdWdlX2h2cjExMDBfY29uZmlnID0gewogCS5kZW1vZF9hZGRyZXNzID0gMHg2MywKIAkub3V0cHV0X21vZGUgICA9IENYMjI3MDJfU0VSSUFMX09VVFBVVCwKLQkucGxsX2FkZHJlc3MgICA9IDB4NjEsCi0JLnBsbF9kZXNjICAgICAgPSAmZHZiX3BsbF9mbWQxMjE2bWUsCiB9OwogI2VuZGlmCiAKQEAgLTM3MSwxNSArMzUyLDEzIEBACiAKIHN0YXRpYyBzdHJ1Y3Qgb3I1MTEzMl9jb25maWcgcGNoZHR2X2hkMzAwMCA9IHsKIAkuZGVtb2RfYWRkcmVzcyAgICA9IDB4MTUsCi0JLnBsbF9hZGRyZXNzICAgICAgPSAweDYxLAotCS5wbGxfZGVzYyAgICAgICAgID0gJmR2Yl9wbGxfdGhvbXNvbl9kdHQ3NjF4LAogCS5zZXRfdHNfcGFyYW1zICAgID0gb3I1MTEzMl9zZXRfdHNfcGFyYW0sCiB9OwogI2VuZGlmCiAKICNpZmRlZiBIQVZFX0xHRFQzMzBYCi1zdGF0aWMgaW50IGxnZHQzMzB4X3BsbF9zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsCi0JCQkgICAgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMpCitzdGF0aWMgaW50IGxnZHQzMzAyX3R1bmVyX3NldF9wYXJhbXMoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsCisJCQkJICAgICBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcykKIHsKIAkvKiBGSVhNRSBtYWtlIHRoaXMgcm91dGluZSB1c2UgdGhlIHR1bmVyLXNpbXBsZSBjb2RlLgogCSAqIEl0IGNvdWxkIHByb2JhYmx5IGJlIHNoYXJlZCB3aXRoIGEgbnVtYmVyIG9mIEFUU0MKQEAgLTM5MiwxMiArMzcxLDEyIEBACiAJCXsgLmFkZHIgPSBkZXYtPmNvcmUtPnBsbF9hZGRyLCAuZmxhZ3MgPSAwLCAuYnVmID0gYnVmLCAubGVuID0gNCB9OwogCWludCBlcnI7CiAKLQkvKiBQdXQgdGhlIGFuYWxvZyBkZWNvZGVyIGluIHN0YW5kYnkgdG8ga2VlcCBpdCBxdWlldCAqLwotCWN4ODhfY2FsbF9pMmNfY2xpZW50cyAoZGV2LT5jb3JlLCBUVU5FUl9TRVRfU1RBTkRCWSwgTlVMTCk7Ci0KIAlkdmJfcGxsX2NvbmZpZ3VyZShjb3JlLT5wbGxfZGVzYywgYnVmLCBwYXJhbXMtPmZyZXF1ZW5jeSwgMCk7CiAJZHByaW50aygxLCAiJXM6IHR1bmVyIGF0IDB4JTAyeCBieXRlczogMHglMDJ4IDB4JTAyeCAweCUwMnggMHglMDJ4XG4iLAogCQkJX19GVU5DVElPTl9fLCBtc2cuYWRkciwgYnVmWzBdLGJ1ZlsxXSxidWZbMl0sYnVmWzNdKTsKKworCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMSk7CiAJaWYgKChlcnIgPSBpMmNfdHJhbnNmZXIoJmNvcmUtPmkyY19hZGFwLCAmbXNnLCAxKSkgIT0gMSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJjeDg4LWR2YjogJXMgZXJyb3IgIgogCQkJICAgIihhZGRyICUwMnggPC0gJTAyeCwgZXJyID0gJWkpXG4iLApAQCAtNDA3LDE2ICszODYsMjEgQEAKIAkJZWxzZQogCQkJcmV0dXJuIC1FUkVNT1RFSU87CiAJfQotCWlmIChjb3JlLT50dW5lcl90eXBlID09IFRVTkVSX0xHX1REVlNfSDA2MkYpIHsKLQkJLyogU2V0IHRoZSBBdXhpbGlhcnkgQnl0ZS4gKi8KLQkJYnVmWzJdICY9IH4weDIwOwotCQlidWZbMl0gfD0gMHgxODsKLQkJYnVmWzNdID0gMHg1MDsKLQkJaTJjX3RyYW5zZmVyKCZjb3JlLT5pMmNfYWRhcCwgJm1zZywgMSk7Ci0JfQogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGxnZHQzMzAzX3R1bmVyX3NldF9wYXJhbXMoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsCisJCQkJICAgICBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcykKK3sKKwlzdHJ1Y3QgY3g4ODAyX2RldiAqZGV2PSBmZS0+ZHZiLT5wcml2OworCXN0cnVjdCBjeDg4X2NvcmUgKmNvcmUgPSBkZXYtPmNvcmU7CisKKwkvKiBQdXQgdGhlIGFuYWxvZyBkZWNvZGVyIGluIHN0YW5kYnkgdG8ga2VlcCBpdCBxdWlldCAqLworCWN4ODhfY2FsbF9pMmNfY2xpZW50cyAoZGV2LT5jb3JlLCBUVU5FUl9TRVRfU1RBTkRCWSwgTlVMTCk7CisKKwlyZXR1cm4gbGdfaDA2eGZfcGxsX3NldChmZSwgJmNvcmUtPmkyY19hZGFwLCBwYXJhbXMpOworfQorCiBzdGF0aWMgaW50IGxnZHQzMzB4X3BsbF9yZl9zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGludCBpbmRleCkKIHsKIAlzdHJ1Y3QgY3g4ODAyX2RldiAqZGV2PSBmZS0+ZHZiLT5wcml2OwpAQCAtNDQ0LDcgKzQyOCw2IEBACiAJLmRlbW9kX2FkZHJlc3MgICAgPSAweDBlLAogCS5kZW1vZF9jaGlwICAgICAgID0gTEdEVDMzMDIsCiAJLnNlcmlhbF9tcGVnICAgICAgPSAweDA0LCAvKiBUUFNFUklBTCBmb3IgMzMwMiBpbiBUT1BfQ09OVFJPTCAqLwotCS5wbGxfc2V0ICAgICAgICAgID0gbGdkdDMzMHhfcGxsX3NldCwKIAkuc2V0X3RzX3BhcmFtcyAgICA9IGxnZHQzMzB4X3NldF90c19wYXJhbSwKIH07CiAKQEAgLTQ1Miw3ICs0MzUsMTMgQEAKIAkuZGVtb2RfYWRkcmVzcyAgICA9IDB4MGUsCiAJLmRlbW9kX2NoaXAgICAgICAgPSBMR0RUMzMwMywKIAkuc2VyaWFsX21wZWcgICAgICA9IDB4NDAsIC8qIFRQU0VSSUFMIGZvciAzMzAzIGluIFRPUF9DT05UUk9MICovCi0JLnBsbF9zZXQgICAgICAgICAgPSBsZ2R0MzMweF9wbGxfc2V0LAorCS5zZXRfdHNfcGFyYW1zICAgID0gbGdkdDMzMHhfc2V0X3RzX3BhcmFtLAorfTsKKworc3RhdGljIHN0cnVjdCBsZ2R0MzMweF9jb25maWcgcGNoZHR2X2hkNTUwMCA9IHsKKwkuZGVtb2RfYWRkcmVzcyAgICA9IDB4NTksCisJLmRlbW9kX2NoaXAgICAgICAgPSBMR0RUMzMwMywKKwkuc2VyaWFsX21wZWcgICAgICA9IDB4NDAsIC8qIFRQU0VSSUFMIGZvciAzMzAzIGluIFRPUF9DT05UUk9MICovCiAJLnNldF90c19wYXJhbXMgICAgPSBsZ2R0MzMweF9zZXRfdHNfcGFyYW0sCiB9OwogI2VuZGlmCkBAIC00NzcsOCArNDY2LDYgQEAKIAogc3RhdGljIHN0cnVjdCBueHQyMDB4X2NvbmZpZyBhdGlfaGR0dndvbmRlciA9IHsKIAkuZGVtb2RfYWRkcmVzcyAgICA9IDB4MGEsCi0JLnBsbF9hZGRyZXNzICAgICAgPSAweDYxLAotCS5wbGxfZGVzYyAgICAgICAgID0gJmR2Yl9wbGxfdHV2MTIzNmQsCiAJLnNldF9wbGxfaW5wdXQgICAgPSBueHQyMDB4X3NldF9wbGxfaW5wdXQsCiAJLnNldF90c19wYXJhbXMgICAgPSBueHQyMDB4X3NldF90c19wYXJhbSwKIH07CkBAIC00OTMsMjggKzQ4MCwzMCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBjeDI0MTIzX2VuYWJsZV9sbmJfdm9sdGFnZShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgaW50IG9uKQorc3RhdGljIGludCBrd29ybGRfZHZic18xMDBfc2V0X3ZvbHRhZ2Uoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGZlX3NlY192b2x0YWdlX3Qgdm9sdGFnZSkKIHsKIAlzdHJ1Y3QgY3g4ODAyX2RldiAqZGV2PSBmZS0+ZHZiLT5wcml2OwogCXN0cnVjdCBjeDg4X2NvcmUgKmNvcmUgPSBkZXYtPmNvcmU7CiAKLQlpZiAob24pCi0JCWN4X3dyaXRlKE1PX0dQMF9JTywgMHgwMDAwMDZmOSk7Ci0JZWxzZQorCWlmICh2b2x0YWdlID09IFNFQ19WT0xUQUdFX09GRikgewogCQljeF93cml0ZShNT19HUDBfSU8sIDB4MDAwMDA2ZkIpOworCX0gZWxzZSB7CisJCWN4X3dyaXRlKE1PX0dQMF9JTywgMHgwMDAwMDZmOSk7CisJfQorCisJaWYgKGNvcmUtPnByZXZfc2V0X3ZvbHRhZ2UpCisJCXJldHVybiBjb3JlLT5wcmV2X3NldF92b2x0YWdlKGZlLCB2b2x0YWdlKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHN0cnVjdCBjeDI0MTIzX2NvbmZpZyBoYXVwcGF1Z2Vfbm92YXNfY29uZmlnID0gewogCS5kZW1vZF9hZGRyZXNzCQk9IDB4NTUsCi0JLnVzZV9pc2w2NDIxCQk9IDEsCiAJLnNldF90c19wYXJhbXMJCT0gY3gyNDEyM19zZXRfdHNfcGFyYW0sCiB9OwogCiBzdGF0aWMgc3RydWN0IGN4MjQxMjNfY29uZmlnIGt3b3JsZF9kdmJzXzEwMF9jb25maWcgPSB7CiAJLmRlbW9kX2FkZHJlc3MJCT0gMHgxNSwKLQkudXNlX2lzbDY0MjEJCT0gMCwKIAkuc2V0X3RzX3BhcmFtcwkJPSBjeDI0MTIzX3NldF90c19wYXJhbSwKLQkuZW5hYmxlX2xuYl92b2x0YWdlCT0gY3gyNDEyM19lbmFibGVfbG5iX3ZvbHRhZ2UsCiB9OwogI2VuZGlmCiAKQEAgLTUzMCw2ICs1MTksMTEgQEAKIAljYXNlIENYODhfQk9BUkRfSEFVUFBBVUdFX0RWQl9UMToKIAkJZGV2LT5kdmIuZnJvbnRlbmQgPSBjeDIyNzAyX2F0dGFjaCgmaGF1cHBhdWdlX25vdmF0X2NvbmZpZywKIAkJCQkJCSAgICZkZXYtPmNvcmUtPmkyY19hZGFwKTsKKwkJaWYgKGRldi0+ZHZiLmZyb250ZW5kICE9IE5VTEwpIHsKKwkJCWR2Yl9wbGxfYXR0YWNoKGRldi0+ZHZiLmZyb250ZW5kLCAweDYxLAorCQkJCSAgICAgICAmZGV2LT5jb3JlLT5pMmNfYWRhcCwKKwkJCQkgICAgICAgJmR2Yl9wbGxfdGhvbXNvbl9kdHQ3NTl4KTsKKwkJfQogCQlicmVhazsKIAljYXNlIENYODhfQk9BUkRfVEVSUkFURUNfQ0lORVJHWV8xNDAwX0RWQl9UMToKIAljYXNlIENYODhfQk9BUkRfQ09ORVhBTlRfRFZCX1QxOgpAQCAtNTM3LDQ0ICs1MzEsOTIgQEAKIAljYXNlIENYODhfQk9BUkRfV0lORkFTVF9EVFYxMDAwOgogCQlkZXYtPmR2Yi5mcm9udGVuZCA9IGN4MjI3MDJfYXR0YWNoKCZjb25uZXhhbnRfcmVmYm9hcmRfY29uZmlnLAogCQkJCQkJICAgJmRldi0+Y29yZS0+aTJjX2FkYXApOworCQlpZiAoZGV2LT5kdmIuZnJvbnRlbmQgIT0gTlVMTCkgeworCQkJZHZiX3BsbF9hdHRhY2goZGV2LT5kdmIuZnJvbnRlbmQsIDB4NjAsCisJCQkJICAgICAgICZkZXYtPmNvcmUtPmkyY19hZGFwLAorCQkJCSAgICAgICAmZHZiX3BsbF90aG9tc29uX2R0dDc1NzkpOworCQl9CiAJCWJyZWFrOworCWNhc2UgQ1g4OF9CT0FSRF9XSU5GQVNUX0RUVjIwMDBIOgogCWNhc2UgQ1g4OF9CT0FSRF9IQVVQUEFVR0VfSFZSMTEwMDoKIAljYXNlIENYODhfQk9BUkRfSEFVUFBBVUdFX0hWUjExMDBMUDoKIAkJZGV2LT5kdmIuZnJvbnRlbmQgPSBjeDIyNzAyX2F0dGFjaCgmaGF1cHBhdWdlX2h2cjExMDBfY29uZmlnLAogCQkJCQkJICAgJmRldi0+Y29yZS0+aTJjX2FkYXApOworCQlpZiAoZGV2LT5kdmIuZnJvbnRlbmQgIT0gTlVMTCkgeworCQkJZHZiX3BsbF9hdHRhY2goZGV2LT5kdmIuZnJvbnRlbmQsIDB4NjEsCisJCQkJICAgICAgICZkZXYtPmNvcmUtPmkyY19hZGFwLAorCQkJCSAgICAgICAmZHZiX3BsbF9mbWQxMjE2bWUpOworCQl9CiAJCWJyZWFrOwogI2VuZGlmCiAjaWYgZGVmaW5lZChIQVZFX01UMzUyKSB8fCBkZWZpbmVkKEhBVkVfWkwxMDM1MykKIAljYXNlIENYODhfQk9BUkRfRFZJQ09fRlVTSU9OSERUVl9EVkJfVF9QTFVTOgotCQlkZXYtPmNvcmUtPnBsbF9hZGRyID0gMHg2MDsKLQkJZGV2LT5jb3JlLT5wbGxfZGVzYyA9ICZkdmJfcGxsX3Rob21zb25fZHR0NzU3OTsKICNpZmRlZiBIQVZFX01UMzUyCiAJCWRldi0+ZHZiLmZyb250ZW5kID0gbXQzNTJfYXR0YWNoKCZkdmljb19mdXNpb25oZHR2LAogCQkJCQkJICZkZXYtPmNvcmUtPmkyY19hZGFwKTsKLQkJaWYgKGRldi0+ZHZiLmZyb250ZW5kICE9IE5VTEwpCisJCWlmIChkZXYtPmR2Yi5mcm9udGVuZCAhPSBOVUxMKSB7CisJCQlkdmJfcGxsX2F0dGFjaChkZXYtPmR2Yi5mcm9udGVuZCwgMHg2MCwKKwkJCQkgICAgICAgJmRldi0+Y29yZS0+aTJjX2FkYXAsCisJCQkJICAgICAgICZkdmJfcGxsX3Rob21zb25fZHR0NzU3OSk7CiAJCQlicmVhazsKKwkJfQogI2VuZGlmCiAjaWZkZWYgSEFWRV9aTDEwMzUzCiAJCS8qIFpMMTAzNTMgcmVwbGFjZXMgTVQzNTIgb24gbGF0ZXIgY2FyZHMgKi8KIAkJZGV2LT5kdmIuZnJvbnRlbmQgPSB6bDEwMzUzX2F0dGFjaCgmZHZpY29fZnVzaW9uaGR0dl9wbHVzX3YxXzEsCiAJCQkJCQkgICAmZGV2LT5jb3JlLT5pMmNfYWRhcCk7CisJCWlmIChkZXYtPmR2Yi5mcm9udGVuZCAhPSBOVUxMKSB7CisJCQlkdmJfcGxsX2F0dGFjaChkZXYtPmR2Yi5mcm9udGVuZCwgMHg2MCwKKwkJCQkgICAgICAgJmRldi0+Y29yZS0+aTJjX2FkYXAsCisJCQkJICAgICAgICZkdmJfcGxsX3Rob21zb25fZHR0NzU3OSk7CisJCX0KKyNlbmRpZgorCQlicmVhazsKKwljYXNlIENYODhfQk9BUkRfRFZJQ09fRlVTSU9OSERUVl9EVkJfVF9EVUFMOgorI2lmZGVmIEhBVkVfTVQzNTIKKwkJLyogVGhlIHRpbiBib3ggc2F5cyBERUUxNjAxLCBidXQgaXQgc2VlbXMgdG8gYmUgRFRUNzU3OQorCQkgKiBjb21wYXRpYmxlLCB3aXRoIGEgc2xpZ2h0bHkgZGlmZmVyZW50IE1UMzUyIEFHQyBnYWluLiAqLworCQlkZXYtPmR2Yi5mcm9udGVuZCA9IG10MzUyX2F0dGFjaCgmZHZpY29fZnVzaW9uaGR0dl9kdWFsLAorCQkJCQkJICZkZXYtPmNvcmUtPmkyY19hZGFwKTsKKwkJaWYgKGRldi0+ZHZiLmZyb250ZW5kICE9IE5VTEwpIHsKKwkJCWR2Yl9wbGxfYXR0YWNoKGRldi0+ZHZiLmZyb250ZW5kLCAweDYxLAorCQkJCSAgICAgICAmZGV2LT5jb3JlLT5pMmNfYWRhcCwKKwkJCQkgICAgICAgJmR2Yl9wbGxfdGhvbXNvbl9kdHQ3NTc5KTsKKwkJCWJyZWFrOworCQl9CisjZW5kaWYKKyNpZmRlZiBIQVZFX1pMMTAzNTMKKwkJLyogWkwxMDM1MyByZXBsYWNlcyBNVDM1MiBvbiBsYXRlciBjYXJkcyAqLworCQlkZXYtPmR2Yi5mcm9udGVuZCA9IHpsMTAzNTNfYXR0YWNoKCZkdmljb19mdXNpb25oZHR2X3BsdXNfdjFfMSwKKwkJCQkJCSAgICZkZXYtPmNvcmUtPmkyY19hZGFwKTsKKwkJaWYgKGRldi0+ZHZiLmZyb250ZW5kICE9IE5VTEwpIHsKKwkJCWR2Yl9wbGxfYXR0YWNoKGRldi0+ZHZiLmZyb250ZW5kLCAweDYxLAorCQkJCSAgICAgICAmZGV2LT5jb3JlLT5pMmNfYWRhcCwKKwkJCQkgICAgICAgJmR2Yl9wbGxfdGhvbXNvbl9kdHQ3NTc5KTsKKwkJfQogI2VuZGlmCiAJCWJyZWFrOwogI2VuZGlmIC8qIEhBVkVfTVQzNTIgfHwgSEFWRV9aTDEwMzUzICovCiAjaWZkZWYgSEFWRV9NVDM1MgogCWNhc2UgQ1g4OF9CT0FSRF9EVklDT19GVVNJT05IRFRWX0RWQl9UMToKLQkJZGV2LT5jb3JlLT5wbGxfYWRkciA9IDB4NjE7Ci0JCWRldi0+Y29yZS0+cGxsX2Rlc2MgPSAmZHZiX3BsbF9sZ196MjAxOwogCQlkZXYtPmR2Yi5mcm9udGVuZCA9IG10MzUyX2F0dGFjaCgmZHZpY29fZnVzaW9uaGR0diwKIAkJCQkJCSAmZGV2LT5jb3JlLT5pMmNfYWRhcCk7CisJCWlmIChkZXYtPmR2Yi5mcm9udGVuZCAhPSBOVUxMKSB7CisJCQlkdmJfcGxsX2F0dGFjaChkZXYtPmR2Yi5mcm9udGVuZCwgMHg2MSwKKwkJCQkgICAgICAgJmRldi0+Y29yZS0+aTJjX2FkYXAsCisJCQkJICAgICAgICZkdmJfcGxsX2xnX3oyMDEpOworCQl9CiAJCWJyZWFrOwogCWNhc2UgQ1g4OF9CT0FSRF9LV09STERfRFZCX1Q6CiAJY2FzZSBDWDg4X0JPQVJEX0ROVFZfTElWRV9EVkJfVDoKIAljYXNlIENYODhfQk9BUkRfQURTVEVDSF9EVkJfVF9QQ0k6Ci0JCWRldi0+Y29yZS0+cGxsX2FkZHIgPSAweDYxOwotCQlkZXYtPmNvcmUtPnBsbF9kZXNjID0gJmR2Yl9wbGxfdW5rbm93bl8xOwogCQlkZXYtPmR2Yi5mcm9udGVuZCA9IG10MzUyX2F0dGFjaCgmZG50dl9saXZlX2R2YnRfY29uZmlnLAogCQkJCQkJICZkZXYtPmNvcmUtPmkyY19hZGFwKTsKKwkJaWYgKGRldi0+ZHZiLmZyb250ZW5kICE9IE5VTEwpIHsKKwkJCWR2Yl9wbGxfYXR0YWNoKGRldi0+ZHZiLmZyb250ZW5kLCAweDYxLAorCQkJCSAgICAgICAmZGV2LT5jb3JlLT5pMmNfYWRhcCwKKwkJCQkgICAgICAgJmR2Yl9wbGxfdW5rbm93bl8xKTsKKwkJfQogCQlicmVhazsKIAljYXNlIENYODhfQk9BUkRfRE5UVl9MSVZFX0RWQl9UX1BSTzoKICNpZmRlZiBIQVZFX1ZQMzA1NF9JMkMKQEAgLTU4MiwxOCArNjI0LDEzIEBACiAJCWRldi0+Y29yZS0+cGxsX2Rlc2MgPSAmZHZiX3BsbF9mbWQxMjE2bWU7CiAJCWRldi0+ZHZiLmZyb250ZW5kID0gbXQzNTJfYXR0YWNoKCZkbnR2X2xpdmVfZHZidF9wcm9fY29uZmlnLAogCQkJJigoc3RydWN0IHZwMzA1NF9pMmNfc3RhdGUgKilkZXYtPmNhcmRfcHJpdiktPmFkYXApOworCQlpZiAoZGV2LT5kdmIuZnJvbnRlbmQgIT0gTlVMTCkgeworCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IGRudHZfbGl2ZV9kdmJ0X3Byb190dW5lcl9zZXRfcGFyYW1zOworCQl9CiAjZWxzZQogCQlwcmludGsoIiVzOiBidWlsdCB3aXRob3V0IHZwMzA1NCBzdXBwb3J0XG4iLCBkZXYtPmNvcmUtPm5hbWUpOwogI2VuZGlmCiAJCWJyZWFrOwotCWNhc2UgQ1g4OF9CT0FSRF9EVklDT19GVVNJT05IRFRWX0RWQl9UX0RVQUw6Ci0JCS8qIFRoZSB0aW4gYm94IHNheXMgREVFMTYwMSwgYnV0IGl0IHNlZW1zIHRvIGJlIERUVDc1NzkKLQkJICogY29tcGF0aWJsZSwgd2l0aCBhIHNsaWdodGx5IGRpZmZlcmVudCBNVDM1MiBBR0MgZ2Fpbi4gKi8KLQkJZGV2LT5jb3JlLT5wbGxfYWRkciA9IDB4NjE7Ci0JCWRldi0+Y29yZS0+cGxsX2Rlc2MgPSAmZHZiX3BsbF90aG9tc29uX2R0dDc1Nzk7Ci0JCWRldi0+ZHZiLmZyb250ZW5kID0gbXQzNTJfYXR0YWNoKCZkdmljb19mdXNpb25oZHR2X2R1YWwsCi0JCQkJCQkgJmRldi0+Y29yZS0+aTJjX2FkYXApOwotCQlicmVhazsKICNlbmRpZgogI2lmZGVmIEhBVkVfWkwxMDM1MwogCWNhc2UgQ1g4OF9CT0FSRF9EVklDT19GVVNJT05IRFRWX0RWQl9UX0hZQlJJRDoKQEAgLTYwMSwxMiArNjM4LDIwIEBACiAJCWRldi0+Y29yZS0+cGxsX2Rlc2MgPSAmZHZiX3BsbF90aG9tc29uX2ZlNjYwMDsKIAkJZGV2LT5kdmIuZnJvbnRlbmQgPSB6bDEwMzUzX2F0dGFjaCgmZHZpY29fZnVzaW9uaGR0dl9oeWJyaWQsCiAJCQkJCQkgICAmZGV2LT5jb3JlLT5pMmNfYWRhcCk7CisJCWlmIChkZXYtPmR2Yi5mcm9udGVuZCAhPSBOVUxMKSB7CisJCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gZHZpY29faHlicmlkX3R1bmVyX3NldF9wYXJhbXM7CisJCX0KIAkJYnJlYWs7CiAjZW5kaWYKICNpZmRlZiBIQVZFX09SNTExMzIKIAljYXNlIENYODhfQk9BUkRfUENIRFRWX0hEMzAwMDoKIAkJZGV2LT5kdmIuZnJvbnRlbmQgPSBvcjUxMTMyX2F0dGFjaCgmcGNoZHR2X2hkMzAwMCwKIAkJCQkJCSAmZGV2LT5jb3JlLT5pMmNfYWRhcCk7CisJCWlmIChkZXYtPmR2Yi5mcm9udGVuZCAhPSBOVUxMKSB7CisJCQlkdmJfcGxsX2F0dGFjaChkZXYtPmR2Yi5mcm9udGVuZCwgMHg2MSwKKwkJCQkgICAgICAgJmRldi0+Y29yZS0+aTJjX2FkYXAsCisJCQkJICAgICAgICZkdmJfcGxsX3Rob21zb25fZHR0NzYxeCk7CisJCX0KIAkJYnJlYWs7CiAjZW5kaWYKICNpZmRlZiBIQVZFX0xHRFQzMzBYCkBAIC02MjcsNiArNjcyLDkgQEAKIAkJZGV2LT5jb3JlLT5wbGxfZGVzYyA9ICZkdmJfcGxsX21pY3JvdHVuZV80MDQyOwogCQlkZXYtPmR2Yi5mcm9udGVuZCA9IGxnZHQzMzB4X2F0dGFjaCgmZnVzaW9uaGR0dl8zX2dvbGQsCiAJCQkJCQkgICAgJmRldi0+Y29yZS0+aTJjX2FkYXApOworCQlpZiAoZGV2LT5kdmIuZnJvbnRlbmQgIT0gTlVMTCkgeworCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IGxnZHQzMzAyX3R1bmVyX3NldF9wYXJhbXM7CisJCX0KIAkJfQogCQlicmVhazsKIAljYXNlIENYODhfQk9BUkRfRFZJQ09fRlVTSU9OSERUVl8zX0dPTERfVDoKQEAgLTY0Myw2ICs2OTEsOSBAQAogCQlkZXYtPmNvcmUtPnBsbF9kZXNjID0gJmR2Yl9wbGxfdGhvbXNvbl9kdHQ3NjF4OwogCQlkZXYtPmR2Yi5mcm9udGVuZCA9IGxnZHQzMzB4X2F0dGFjaCgmZnVzaW9uaGR0dl8zX2dvbGQsCiAJCQkJCQkgICAgJmRldi0+Y29yZS0+aTJjX2FkYXApOworCQlpZiAoZGV2LT5kdmIuZnJvbnRlbmQgIT0gTlVMTCkgeworCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IGxnZHQzMzAyX3R1bmVyX3NldF9wYXJhbXM7CisJCX0KIAkJfQogCQlicmVhazsKIAljYXNlIENYODhfQk9BUkRfRFZJQ09fRlVTSU9OSERUVl81X0dPTEQ6CkBAIC02NTUsMTAgKzcwNiwyOCBAQAogCQltZGVsYXkoMTAwKTsKIAkJY3hfc2V0KE1PX0dQMF9JTywgMSk7CiAJCW1kZWxheSgyMDApOwotCQlkZXYtPmNvcmUtPnBsbF9hZGRyID0gMHg2MTsKLQkJZGV2LT5jb3JlLT5wbGxfZGVzYyA9ICZkdmJfcGxsX3RkdnNfdHVhNjAzNDsKIAkJZGV2LT5kdmIuZnJvbnRlbmQgPSBsZ2R0MzMweF9hdHRhY2goJmZ1c2lvbmhkdHZfNV9nb2xkLAogCQkJCQkJICAgICZkZXYtPmNvcmUtPmkyY19hZGFwKTsKKwkJaWYgKGRldi0+ZHZiLmZyb250ZW5kICE9IE5VTEwpIHsKKwkJCWRldi0+ZHZiLmZyb250ZW5kLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBsZ2R0MzMwM190dW5lcl9zZXRfcGFyYW1zOworCQl9CisJCX0KKwkJYnJlYWs7CisJY2FzZSBDWDg4X0JPQVJEX1BDSERUVl9IRDU1MDA6CisJCWRldi0+dHNfZ2VuX2NudHJsID0gMHgwODsKKwkJeworCQkvKiBEbyBhIGhhcmR3YXJlIHJlc2V0IG9mIGNoaXAgYmVmb3JlIHVzaW5nIGl0LiAqLworCQlzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlID0gZGV2LT5jb3JlOworCisJCWN4X2NsZWFyKE1PX0dQMF9JTywgMSk7CisJCW1kZWxheSgxMDApOworCQljeF9zZXQoTU9fR1AwX0lPLCAxKTsKKwkJbWRlbGF5KDIwMCk7CisJCWRldi0+ZHZiLmZyb250ZW5kID0gbGdkdDMzMHhfYXR0YWNoKCZwY2hkdHZfaGQ1NTAwLAorCQkJCQkJICAgICZkZXYtPmNvcmUtPmkyY19hZGFwKTsKKwkJaWYgKGRldi0+ZHZiLmZyb250ZW5kICE9IE5VTEwpIHsKKwkJCWRldi0+ZHZiLmZyb250ZW5kLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBsZ2R0MzMwM190dW5lcl9zZXRfcGFyYW1zOworCQl9CiAJCX0KIAkJYnJlYWs7CiAjZW5kaWYKQEAgLTY2Niw2ICs3MzUsMTEgQEAKIAljYXNlIENYODhfQk9BUkRfQVRJX0hEVFZXT05ERVI6CiAJCWRldi0+ZHZiLmZyb250ZW5kID0gbnh0MjAweF9hdHRhY2goJmF0aV9oZHR2d29uZGVyLAogCQkJCQkJICZkZXYtPmNvcmUtPmkyY19hZGFwKTsKKwkJaWYgKGRldi0+ZHZiLmZyb250ZW5kICE9IE5VTEwpIHsKKwkJCWR2Yl9wbGxfYXR0YWNoKGRldi0+ZHZiLmZyb250ZW5kLCAweDYxLAorCQkJCSAgICAgICAmZGV2LT5jb3JlLT5pMmNfYWRhcCwKKwkJCQkgICAgICAgJmR2Yl9wbGxfdHV2MTIzNmQpOworCQl9CiAJCWJyZWFrOwogI2VuZGlmCiAjaWZkZWYgSEFWRV9DWDI0MTIzCkBAIC02NzMsMTAgKzc0NywxOCBAQAogCWNhc2UgQ1g4OF9CT0FSRF9IQVVQUEFVR0VfTk9WQVNFMl9TMToKIAkJZGV2LT5kdmIuZnJvbnRlbmQgPSBjeDI0MTIzX2F0dGFjaCgmaGF1cHBhdWdlX25vdmFzX2NvbmZpZywKIAkJCSZkZXYtPmNvcmUtPmkyY19hZGFwKTsKKwkJaWYgKGRldi0+ZHZiLmZyb250ZW5kKSB7CisJCQlpc2w2NDIxX2F0dGFjaChkZXYtPmR2Yi5mcm9udGVuZCwgJmRldi0+Y29yZS0+aTJjX2FkYXAsCisJCQkJICAgICAgIDB4MDgsIDB4MDAsIDB4MDApOworCQl9CiAJCWJyZWFrOwogCWNhc2UgQ1g4OF9CT0FSRF9LV09STERfRFZCU18xMDA6CiAJCWRldi0+ZHZiLmZyb250ZW5kID0gY3gyNDEyM19hdHRhY2goJmt3b3JsZF9kdmJzXzEwMF9jb25maWcsCiAJCQkmZGV2LT5jb3JlLT5pMmNfYWRhcCk7CisJCWlmIChkZXYtPmR2Yi5mcm9udGVuZCkgeworCQkJZGV2LT5jb3JlLT5wcmV2X3NldF92b2x0YWdlID0gZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy5zZXRfdm9sdGFnZTsKKwkJCWRldi0+ZHZiLmZyb250ZW5kLT5vcHMuc2V0X3ZvbHRhZ2UgPSBrd29ybGRfZHZic18xMDBfc2V0X3ZvbHRhZ2U7CisJCX0KIAkJYnJlYWs7CiAjZW5kaWYKIAlkZWZhdWx0OgpAQCAtNjkwLDE1ICs3NzIsMTUgQEAKIAl9CiAKIAlpZiAoZGV2LT5jb3JlLT5wbGxfZGVzYykgewotCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLT5pbmZvLmZyZXF1ZW5jeV9taW4gPSBkZXYtPmNvcmUtPnBsbF9kZXNjLT5taW47Ci0JCWRldi0+ZHZiLmZyb250ZW5kLT5vcHMtPmluZm8uZnJlcXVlbmN5X21heCA9IGRldi0+Y29yZS0+cGxsX2Rlc2MtPm1heDsKKwkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy5pbmZvLmZyZXF1ZW5jeV9taW4gPSBkZXYtPmNvcmUtPnBsbF9kZXNjLT5taW47CisJCWRldi0+ZHZiLmZyb250ZW5kLT5vcHMuaW5mby5mcmVxdWVuY3lfbWF4ID0gZGV2LT5jb3JlLT5wbGxfZGVzYy0+bWF4OwogCX0KIAogCS8qIFB1dCB0aGUgYW5hbG9nIGRlY29kZXIgaW4gc3RhbmRieSB0byBrZWVwIGl0IHF1aWV0ICovCiAJY3g4OF9jYWxsX2kyY19jbGllbnRzIChkZXYtPmNvcmUsIFRVTkVSX1NFVF9TVEFOREJZLCBOVUxMKTsKIAogCS8qIHJlZ2lzdGVyIGV2ZXJ5dGhpbmcgKi8KLQlyZXR1cm4gdmlkZW9idWZfZHZiX3JlZ2lzdGVyKCZkZXYtPmR2YiwgVEhJU19NT0RVTEUsIGRldik7CisJcmV0dXJuIHZpZGVvYnVmX2R2Yl9yZWdpc3RlcigmZGV2LT5kdmIsIFRISVNfTU9EVUxFLCBkZXYsICZkZXYtPnBjaS0+ZGV2KTsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWkyYy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtaTJjLmMKaW5kZXggZjcyMDkwMS4uNzA2NjM4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtaTJjLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtaTJjLmMKQEAgLTEzOCwxMyArMTM4LDEzIEBACiAJCXJldHVybjsKIAogCWlmIChjb3JlLT5kdmJkZXYpIHsKLQkJaWYgKGNvcmUtPmR2YmRldi0+ZHZiLmZyb250ZW5kLT5vcHMtPmkyY19nYXRlX2N0cmwpCi0JCQljb3JlLT5kdmJkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLT5pMmNfZ2F0ZV9jdHJsKGNvcmUtPmR2YmRldi0+ZHZiLmZyb250ZW5kLCAxKTsKKwkJaWYgKGNvcmUtPmR2YmRldi0+ZHZiLmZyb250ZW5kLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJCWNvcmUtPmR2YmRldi0+ZHZiLmZyb250ZW5kLT5vcHMuaTJjX2dhdGVfY3RybChjb3JlLT5kdmJkZXYtPmR2Yi5mcm9udGVuZCwgMSk7CiAKIAkJaTJjX2NsaWVudHNfY29tbWFuZCgmY29yZS0+aTJjX2FkYXAsIGNtZCwgYXJnKTsKIAotCQlpZiAoY29yZS0+ZHZiZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy0+aTJjX2dhdGVfY3RybCkKLQkJCWNvcmUtPmR2YmRldi0+ZHZiLmZyb250ZW5kLT5vcHMtPmkyY19nYXRlX2N0cmwoY29yZS0+ZHZiZGV2LT5kdmIuZnJvbnRlbmQsIDApOworCQlpZiAoY29yZS0+ZHZiZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQkJY29yZS0+ZHZiZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy5pMmNfZ2F0ZV9jdHJsKGNvcmUtPmR2YmRldi0+ZHZiLmZyb250ZW5kLCAwKTsKIAl9IGVsc2UKIAkJaTJjX2NsaWVudHNfY29tbWFuZCgmY29yZS0+aTJjX2FkYXAsIGNtZCwgYXJnKTsKIH0KQEAgLTIzNCw3ICsyMzQsNiBAQAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogRVhQT1JUX1NZTUJPTChjeDg4X2NhbGxfaTJjX2NsaWVudHMpOwotRVhQT1JUX1NZTUJPTChjeDg4X2kyY19pbml0KTsKIAogLyoKICAqIExvY2FsIHZhcmlhYmxlczoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWlucHV0LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1pbnB1dC5jCmluZGV4IDc4YTYzYjcuLjcyYjYzMGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWlucHV0LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtaW5wdXQuYwpAQCAtNzAsMTQgKzcwLDMzIEBACiBzdGF0aWMgdm9pZCBjeDg4X2lyX2hhbmRsZV9rZXkoc3RydWN0IGN4ODhfSVIgKmlyKQogewogCXN0cnVjdCBjeDg4X2NvcmUgKmNvcmUgPSBpci0+Y29yZTsKLQl1MzIgZ3BpbywgZGF0YTsKKwl1MzIgZ3BpbywgZGF0YSwgYXV4Z3BpbzsKIAogCS8qIHJlYWQgZ3BpbyB2YWx1ZSAqLwogCWdwaW8gPSBjeF9yZWFkKGlyLT5ncGlvX2FkZHIpOworCWlmIChjb3JlLT5ib2FyZCA9PSBDWDg4X0JPQVJEX05QR1RFQ0hfUkVBTFRWX1RPUDEwRk0pIHsKKwkJLyogVGhpcyBib2FyZCBhcHBhcmVudGx5IHVzZXMgYSBjb21iaW5hdGlvbiBvZiAyIEdQSU8KKwkJICAgdG8gcmVwcmVzZW50IHRoZSBrZXlzLiBBZGRpdGlvbmFsbHksIHRoZSBzZWNvbmQgR1BJTworCQkgICBjYW4gYmUgdXNlZCBmb3IgcGFyaXR5LgorCisJCSAgIEV4YW1wbGU6CisKKwkJICAgZm9yIGtleSAiNSIKKwkJCWdwaW8gPSAweDc1OCwgYXV4Z3BpbyA9IDB4ZTUgb3IgMHhmNQorCQkgICBmb3Iga2V5ICJQb3dlciIKKwkJCWdwaW8gPSAweDc1OCwgYXV4Z3BpbyA9IDB4ZWQgb3IgMHhmZAorCQkgKi8KKworCQlhdXhncGlvID0gY3hfcmVhZChNT19HUDFfSU8pOworCQkvKiBUYWtlIG91dCB0aGUgcGFyaXR5IHBhcnQgKi8KKwkJZ3Bpbys9KGdwaW8gJiAweDdmZCkgKyAoYXV4Z3BpbyAmIDB4ZWYpOworCX0gZWxzZQorCQlhdXhncGlvID0gZ3BpbzsKKwogCWlmIChpci0+cG9sbGluZykgewotCQlpZiAoaXItPmxhc3RfZ3BpbyA9PSBncGlvKQorCQlpZiAoaXItPmxhc3RfZ3BpbyA9PSBhdXhncGlvKQogCQkJcmV0dXJuOwotCQlpci0+bGFzdF9ncGlvID0gZ3BpbzsKKwkJaXItPmxhc3RfZ3BpbyA9IGF1eGdwaW87CiAJfQogCiAJLyogZXh0cmFjdCBkYXRhICovCkBAIC0xNzIsMTIgKzE5MSwxMyBAQAogCQlpcl90eXBlID0gSVJfVFlQRV9SQzU7CiAJCWlyLT5zYW1wbGluZyA9IDE7CiAJCWJyZWFrOworCWNhc2UgQ1g4OF9CT0FSRF9XSU5GQVNUX0RUVjIwMDBIOgogCWNhc2UgQ1g4OF9CT0FSRF9XSU5GQVNUMjAwMFhQX0VYUEVSVDoKIAkJaXJfY29kZXMgPSBpcl9jb2Rlc193aW5mYXN0OwogCQlpci0+Z3Bpb19hZGRyID0gTU9fR1AwX0lPOwogCQlpci0+bWFza19rZXljb2RlID0gMHg4Zjg7CiAJCWlyLT5tYXNrX2tleXVwID0gMHgxMDA7Ci0JCWlyLT5wb2xsaW5nID0gMTsgLyogbXMgKi8KKwkJaXItPnBvbGxpbmcgPSA1MDsgLyogbXMgKi8KIAkJYnJlYWs7CiAJY2FzZSBDWDg4X0JPQVJEX0lPREFUQV9HVkJDVFY3RToKIAkJaXJfY29kZXMgPSBpcl9jb2Rlc19pb2RhdGFfYmN0djdlOwpAQCAtMjI4LDYgKzI0OCwxMiBAQAogCQlpcl90eXBlID0gSVJfVFlQRV9QRDsKIAkJaXItPnNhbXBsaW5nID0gMHhmZjAwOyAvKiBhZGRyZXNzICovCiAJCWJyZWFrOworCWNhc2UgQ1g4OF9CT0FSRF9OUEdURUNIX1JFQUxUVl9UT1AxMEZNOgorCQlpcl9jb2RlcyA9IGlyX2NvZGVzX25wZ3RlY2g7CisJCWlyLT5ncGlvX2FkZHIgPSBNT19HUDBfSU87CisJCWlyLT5tYXNrX2tleWNvZGUgPSAweGZhOworCQlpci0+cG9sbGluZyA9IDUwOyAvKiBtcyAqLworCQlicmVhazsKIAl9CiAKIAlpZiAoTlVMTCA9PSBpcl9jb2RlcykgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtbXBlZy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtbXBlZy5jCmluZGV4IDdkMTY4ODguLmE5ZDc3OTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LW1wZWcuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1tcGVnLmMKQEAgLTU0LDcgKzU0LDcgQEAKIHsKIAlzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlID0gZGV2LT5jb3JlOwogCi0JZHByaW50aygwLCAiY3g4ODAyX3N0YXJ0X2RtYSB3OiAlZCwgaDogJWQsIGY6ICVkXG4iLCBkZXYtPndpZHRoLCBkZXYtPmhlaWdodCwgYnVmLT52Yi5maWVsZCk7CisJZHByaW50aygxLCAiY3g4ODAyX3N0YXJ0X2RtYSB3OiAlZCwgaDogJWQsIGY6ICVkXG4iLCBkZXYtPndpZHRoLCBkZXYtPmhlaWdodCwgYnVmLT52Yi5maWVsZCk7CiAKIAkvKiBzZXR1cCBmaWZvICsgZm9ybWF0ICovCiAJY3g4OF9zcmFtX2NoYW5uZWxfc2V0dXAoY29yZSwgJmN4ODhfc3JhbV9jaGFubmVsc1tTUkFNX0NIMjhdLApAQCAtNzYsNiArNzYsNyBAQAogCQljYXNlIENYODhfQk9BUkRfRFZJQ09fRlVTSU9OSERUVl8zX0dPTERfUToKIAkJY2FzZSBDWDg4X0JPQVJEX0RWSUNPX0ZVU0lPTkhEVFZfM19HT0xEX1Q6CiAJCWNhc2UgQ1g4OF9CT0FSRF9EVklDT19GVVNJT05IRFRWXzVfR09MRDoKKwkJY2FzZSBDWDg4X0JPQVJEX1BDSERUVl9IRDU1MDA6CiAJCQljeF93cml0ZShUU19TT1BfU1RBVCwgMTw8MTMpOwogCQkJYnJlYWs7CiAJCWNhc2UgQ1g4OF9CT0FSRF9IQVVQUEFVR0VfTk9WQVNQTFVTX1MxOgpAQCAtMTA5LDcgKzExMCw3IEBACiAJcS0+Y291bnQgPSAxOwogCiAJLyogZW5hYmxlIGlycXMgKi8KLQlkcHJpbnRrKCAwLCAic2V0dGluZyB0aGUgaW50ZXJydXB0IG1hc2tcbiIgKTsKKwlkcHJpbnRrKCAxLCAic2V0dGluZyB0aGUgaW50ZXJydXB0IG1hc2tcbiIgKTsKIAljeF9zZXQoTU9fUENJX0lOVE1TSywgY29yZS0+cGNpX2lycW1hc2sgfCAweDA0KTsKIAljeF9zZXQoTU9fVFNfSU5UTVNLLCAgMHgxZjAwMTEpOwogCkBAIC0xMjIsNyArMTIzLDcgQEAKIHN0YXRpYyBpbnQgY3g4ODAyX3N0b3BfZG1hKHN0cnVjdCBjeDg4MDJfZGV2ICpkZXYpCiB7CiAJc3RydWN0IGN4ODhfY29yZSAqY29yZSA9IGRldi0+Y29yZTsKLQlkcHJpbnRrKCAwLCAiY3g4ODAyX3N0b3BfZG1hXG4iICk7CisJZHByaW50ayggMSwgImN4ODgwMl9zdG9wX2RtYVxuIiApOwogCiAJLyogc3RvcCBkbWEgKi8KIAljeF9jbGVhcihNT19UU19ETUFDTlRSTCwgMHgxMSk7CkBAIC0xNDIsMTAgKzE0Myw0MyBAQAogCXN0cnVjdCBjeDg4X2J1ZmZlciAqYnVmOwogCXN0cnVjdCBsaXN0X2hlYWQgKml0ZW07CiAKLQlkcHJpbnRrKCAwLCAiY3g4ODAyX3Jlc3RhcnRfcXVldWVcbiIgKTsKKyAgICAgICBkcHJpbnRrKCAxLCAiY3g4ODAyX3Jlc3RhcnRfcXVldWVcbiIgKTsKIAlpZiAobGlzdF9lbXB0eSgmcS0+YWN0aXZlKSkKIAl7Ci0JCWRwcmludGsoIDAsICJjeDg4MDJfcmVzdGFydF9xdWV1ZTogcXVldWUgaXMgZW1wdHlcbiIgKTsKKwkgICAgICAgc3RydWN0IGN4ODhfYnVmZmVyICpwcmV2OworCSAgICAgICBwcmV2ID0gTlVMTDsKKworCSAgICAgICBkcHJpbnRrKDEsICJjeDg4MDJfcmVzdGFydF9xdWV1ZTogcXVldWUgaXMgZW1wdHlcbiIgKTsKKworCSAgICAgICBmb3IgKDs7KSB7CisJCSAgICAgICBpZiAobGlzdF9lbXB0eSgmcS0+cXVldWVkKSkKKwkJCSAgICAgICByZXR1cm4gMDsKKwkJICAgICAgIGJ1ZiA9IGxpc3RfZW50cnkocS0+cXVldWVkLm5leHQsIHN0cnVjdCBjeDg4X2J1ZmZlciwgdmIucXVldWUpOworCQkgICAgICAgaWYgKE5VTEwgPT0gcHJldikgeworCQkJICAgICAgIGxpc3RfZGVsKCZidWYtPnZiLnF1ZXVlKTsKKwkJCSAgICAgICBsaXN0X2FkZF90YWlsKCZidWYtPnZiLnF1ZXVlLCZxLT5hY3RpdmUpOworCQkJICAgICAgIGN4ODgwMl9zdGFydF9kbWEoZGV2LCBxLCBidWYpOworCQkJICAgICAgIGJ1Zi0+dmIuc3RhdGUgPSBTVEFURV9BQ1RJVkU7CisJCQkgICAgICAgYnVmLT5jb3VudCAgICA9IHEtPmNvdW50Kys7CisJCQkgICAgICAgbW9kX3RpbWVyKCZxLT50aW1lb3V0LCBqaWZmaWVzK0JVRkZFUl9USU1FT1VUKTsKKwkJCSAgICAgICBkcHJpbnRrKDEsIlslcC8lZF0gcmVzdGFydF9xdWV1ZSAtIGZpcnN0IGFjdGl2ZVxuIiwKKwkJCQkgICAgICAgYnVmLGJ1Zi0+dmIuaSk7CisKKwkJICAgICAgIH0gZWxzZSBpZiAocHJldi0+dmIud2lkdGggID09IGJ1Zi0+dmIud2lkdGggICYmCisJCQkJICBwcmV2LT52Yi5oZWlnaHQgPT0gYnVmLT52Yi5oZWlnaHQgJiYKKwkJCQkgIHByZXYtPmZtdCAgICAgICA9PSBidWYtPmZtdCkgeworCQkJICAgICAgIGxpc3RfZGVsKCZidWYtPnZiLnF1ZXVlKTsKKwkJCSAgICAgICBsaXN0X2FkZF90YWlsKCZidWYtPnZiLnF1ZXVlLCZxLT5hY3RpdmUpOworCQkJICAgICAgIGJ1Zi0+dmIuc3RhdGUgPSBTVEFURV9BQ1RJVkU7CisJCQkgICAgICAgYnVmLT5jb3VudCAgICA9IHEtPmNvdW50Kys7CisJCQkgICAgICAgcHJldi0+cmlzYy5qbXBbMV0gPSBjcHVfdG9fbGUzMihidWYtPnJpc2MuZG1hKTsKKwkJCSAgICAgICBkcHJpbnRrKDEsIlslcC8lZF0gcmVzdGFydF9xdWV1ZSAtIG1vdmUgdG8gYWN0aXZlXG4iLAorCQkJCSAgICAgICBidWYsYnVmLT52Yi5pKTsKKwkJICAgICAgIH0gZWxzZSB7CisJCQkgICAgICAgcmV0dXJuIDA7CisJCSAgICAgICB9CisJCSAgICAgICBwcmV2ID0gYnVmOworCSAgICAgICB9CiAJCXJldHVybiAwOwogCX0KIApAQCAtMjA0LDEzICsyMzgsMTMgQEAKIAlidWYtPnJpc2Muam1wWzFdID0gY3B1X3RvX2xlMzIoY3g4OHEtPnN0b3BwZXIuZG1hKTsKIAogCWlmIChsaXN0X2VtcHR5KCZjeDg4cS0+YWN0aXZlKSkgewotCQlkcHJpbnRrKCAwLCAicXVldWUgaXMgZW1wdHkgLSBmaXJzdCBhY3RpdmVcbiIgKTsKKwkJZHByaW50ayggMSwgInF1ZXVlIGlzIGVtcHR5IC0gZmlyc3QgYWN0aXZlXG4iICk7CiAJCWxpc3RfYWRkX3RhaWwoJmJ1Zi0+dmIucXVldWUsJmN4ODhxLT5hY3RpdmUpOwogCQljeDg4MDJfc3RhcnRfZG1hKGRldiwgY3g4OHEsIGJ1Zik7CiAJCWJ1Zi0+dmIuc3RhdGUgPSBTVEFURV9BQ1RJVkU7CiAJCWJ1Zi0+Y291bnQgICAgPSBjeDg4cS0+Y291bnQrKzsKIAkJbW9kX3RpbWVyKCZjeDg4cS0+dGltZW91dCwgamlmZmllcytCVUZGRVJfVElNRU9VVCk7Ci0JCWRwcmludGsoMCwiWyVwLyVkXSAlcyAtIGZpcnN0IGFjdGl2ZVxuIiwKKwkJZHByaW50aygxLCJbJXAvJWRdICVzIC0gZmlyc3QgYWN0aXZlXG4iLAogCQkJYnVmLCBidWYtPnZiLmksIF9fRlVOQ1RJT05fXyk7CiAKIAl9IGVsc2UgewpAQCAtMjQ0LDcgKzI3OCw3IEBACiAJfQogCWlmIChyZXN0YXJ0KQogCXsKLQkJZHByaW50aygwLCAicmVzdGFydGluZyBxdWV1ZVxuIiApOworCQlkcHJpbnRrKDEsICJyZXN0YXJ0aW5nIHF1ZXVlXG4iICk7CiAJCWN4ODgwMl9yZXN0YXJ0X3F1ZXVlKGRldixxKTsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5zbG9jayxmbGFncyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC10dmF1ZGlvLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC10dmF1ZGlvLmMKaW5kZXggNjQxYTBjNS4uNTc4NWMzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtdHZhdWRpby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LXR2YXVkaW8uYwpAQCAtNTIsNiArNTIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogCiAjaW5jbHVkZSAiY3g4OC5oIgpAQCAtMTM3LDIxICsxMzgsMjggQEAKIHsKIAl1MzIgdm9sdW1lOwogCi0jaWZuZGVmIFVTSU5HX0NYODhfQUxTQQorI2lmbmRlZiBDT05GSUdfVklERU9fQ1g4OF9BTFNBCiAJLyogcmVzdGFydCBkbWE7IFRoaXMgYXZvaWRzIGJ1enogaW4gTklDQU0gYW5kIGlzIGdvb2QgaW4gb3RoZXJzICAqLwogCWN4ODhfc3RvcF9hdWRpb19kbWEoY29yZSk7CiAjZW5kaWYKIAljeF93cml0ZShBVURfUkFURV9USFJFU19ETUQsIDB4MDAwMDAwQzApOwotI2lmbmRlZiBVU0lOR19DWDg4X0FMU0EKKyNpZm5kZWYgQ09ORklHX1ZJREVPX0NYODhfQUxTQQogCWN4ODhfc3RhcnRfYXVkaW9fZG1hKGNvcmUpOwogI2VuZGlmCiAKIAlpZiAoY3g4OF9ib2FyZHNbY29yZS0+Ym9hcmRdLmJsYWNrYmlyZCkgewogCQkvKiBzZXRzIHNvdW5kIGlucHV0IGZyb20gZXh0ZXJuYWwgYWRjICovCi0JCWlmIChjb3JlLT5ib2FyZCA9PSBDWDg4X0JPQVJEX0hBVVBQQVVHRV9ST1NMWU4pCisJCXN3aXRjaCAoY29yZS0+Ym9hcmQpIHsKKwkJY2FzZSBDWDg4X0JPQVJEX0hBVVBQQVVHRV9ST1NMWU46CisJCWNhc2UgQ1g4OF9CT0FSRF9LV09STERfTUNFMjAwX0RFTFVYRToKKwkJY2FzZSBDWDg4X0JPQVJEX0tXT1JMRF9IQVJEV0FSRV9NUEVHX1RWX1hQRVJUOgorCQljYXNlIENYODhfQk9BUkRfUElYRUxWSUVXX1BMQVlUVl9QNzAwMDoKKwkJY2FzZSBDWDg4X0JPQVJEX0FTVVNfUFZSXzQxNjoKIAkJCWN4X2NsZWFyKEFVRF9DVEwsIEVOX0kyU0lOX0VOQUJMRSk7Ci0JCWVsc2UKKwkJCWJyZWFrOworCQlkZWZhdWx0OgogCQkJY3hfc2V0KEFVRF9DVEwsIEVOX0kyU0lOX0VOQUJMRSk7CisJCX0KIAogCQljeF93cml0ZShBVURfSTJTSU5QVVRDTlRMLCA0KTsKIAkJY3hfd3JpdGUoQVVEX0JBVURSQVRFLCAxKTsKQEAgLTcxOCw3ICs3MjYsNyBAQAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1pbnQgY3g4OF9kZXRlY3RfbmljYW0oc3RydWN0IGN4ODhfY29yZSAqY29yZSkKK3N0YXRpYyBpbnQgY3g4OF9kZXRlY3RfbmljYW0oc3RydWN0IGN4ODhfY29yZSAqY29yZSkKIHsKIAlpbnQgaSwgaiA9IDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LXZiaS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtdmJpLmMKaW5kZXggODQ2ZmFhZC4uYWEyYTY5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtdmJpLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtdmJpLmMKQEAgLTM0LDggKzM0LDggQEAKIAlpZiAoZGV2LT5jb3JlLT50dm5vcm0tPmlkICYgVjRMMl9TVERfNTI1XzYwKSB7CiAJCS8qIG50c2MgKi8KIAkJZi0+Zm10LnZiaS5zYW1wbGluZ19yYXRlID0gMjg2MzYzNjM7Ci0JCWYtPmZtdC52Ymkuc3RhcnRbMF0gPSAxMCAtMTsKLQkJZi0+Zm10LnZiaS5zdGFydFsxXSA9IDI3MyAtMTsKKwkJZi0+Zm10LnZiaS5zdGFydFswXSA9IDEwOworCQlmLT5mbXQudmJpLnN0YXJ0WzFdID0gMjczOwogCiAJfSBlbHNlIGlmIChkZXYtPmNvcmUtPnR2bm9ybS0+aWQgJiBWNEwyX1NURF82MjVfNTApIHsKIAkJLyogcGFsICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC12aWRlby5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtdmlkZW8uYwppbmRleCA2OTRkMWQ4Li5kY2RhNTI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC12aWRlby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LXZpZGVvLmMKQEAgLTQ5NCw4ICs0OTQsNyBAQAogCQkJcmV0dXJuIDA7CiAJCWJ1ZiA9IGxpc3RfZW50cnkocS0+cXVldWVkLm5leHQsIHN0cnVjdCBjeDg4X2J1ZmZlciwgdmIucXVldWUpOwogCQlpZiAoTlVMTCA9PSBwcmV2KSB7Ci0JCQlsaXN0X2RlbCgmYnVmLT52Yi5xdWV1ZSk7Ci0JCQlsaXN0X2FkZF90YWlsKCZidWYtPnZiLnF1ZXVlLCZxLT5hY3RpdmUpOworCQkJbGlzdF9tb3ZlX3RhaWwoJmJ1Zi0+dmIucXVldWUsICZxLT5hY3RpdmUpOwogCQkJc3RhcnRfdmlkZW9fZG1hKGRldiwgcSwgYnVmKTsKIAkJCWJ1Zi0+dmIuc3RhdGUgPSBTVEFURV9BQ1RJVkU7CiAJCQlidWYtPmNvdW50ICAgID0gcS0+Y291bnQrKzsKQEAgLTUwNiw4ICs1MDUsNyBAQAogCQl9IGVsc2UgaWYgKHByZXYtPnZiLndpZHRoICA9PSBidWYtPnZiLndpZHRoICAmJgogCQkJICAgcHJldi0+dmIuaGVpZ2h0ID09IGJ1Zi0+dmIuaGVpZ2h0ICYmCiAJCQkgICBwcmV2LT5mbXQgICAgICAgPT0gYnVmLT5mbXQpIHsKLQkJCWxpc3RfZGVsKCZidWYtPnZiLnF1ZXVlKTsKLQkJCWxpc3RfYWRkX3RhaWwoJmJ1Zi0+dmIucXVldWUsJnEtPmFjdGl2ZSk7CisJCQlsaXN0X21vdmVfdGFpbCgmYnVmLT52Yi5xdWV1ZSwgJnEtPmFjdGl2ZSk7CiAJCQlidWYtPnZiLnN0YXRlID0gU1RBVEVfQUNUSVZFOwogCQkJYnVmLT5jb3VudCAgICA9IHEtPmNvdW50Kys7CiAJCQlwcmV2LT5yaXNjLmptcFsxXSA9IGNwdV90b19sZTMyKGJ1Zi0+cmlzYy5kbWEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODguaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LmgKaW5kZXggMzI2YTI1Zi4uOWE5YTBmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODguaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC5oCkBAIC0yNSw5ICsyNSwxMSBAQAogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgogI2luY2x1ZGUgPGxpbnV4L2tkZXZfdC5oPgogCisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KICNpbmNsdWRlIDxtZWRpYS90dW5lci5oPgogI2luY2x1ZGUgPG1lZGlhL3R2ZWVwcm9tLmg+CiAjaW5jbHVkZSA8bWVkaWEvdmlkZW8tYnVmLmg+CisjaW5jbHVkZSA8bWVkaWEvY3gyMzQxeC5oPgogI2luY2x1ZGUgPG1lZGlhL3ZpZGVvLWJ1Zi1kdmIuaD4KIAogI2luY2x1ZGUgImJ0Y3gtcmlzYy5oIgpAQCAtMzUsNyArMzcsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jZGVmaW5lIENYODhfVkVSU0lPTl9DT0RFIEtFUk5FTF9WRVJTSU9OKDAsMCw1KQorI2RlZmluZSBDWDg4X1ZFUlNJT05fQ09ERSBLRVJORUxfVkVSU0lPTigwLDAsNikKIAogI2lmbmRlZiBUUlVFCiAjIGRlZmluZSBUUlVFICgxPT0xKQpAQCAtMTg5LDYgKzE5MSwxMSBAQAogI2RlZmluZSBDWDg4X0JPQVJEX0RWSUNPX0ZVU0lPTkhEVFZfRFZCX1RfRFVBTCA0NAogI2RlZmluZSBDWDg4X0JPQVJEX0tXT1JMRF9IQVJEV0FSRV9NUEVHX1RWX1hQRVJUIDQ1CiAjZGVmaW5lIENYODhfQk9BUkRfRFZJQ09fRlVTSU9OSERUVl9EVkJfVF9IWUJSSUQgNDYKKyNkZWZpbmUgQ1g4OF9CT0FSRF9QQ0hEVFZfSEQ1NTAwICAgICAgICAgICA0NworI2RlZmluZSBDWDg4X0JPQVJEX0tXT1JMRF9NQ0UyMDBfREVMVVhFICAgIDQ4CisjZGVmaW5lIENYODhfQk9BUkRfUElYRUxWSUVXX1BMQVlUVl9QNzAwMCAgNDkKKyNkZWZpbmUgQ1g4OF9CT0FSRF9OUEdURUNIX1JFQUxUVl9UT1AxMEZNICA1MAorI2RlZmluZSBDWDg4X0JPQVJEX1dJTkZBU1RfRFRWMjAwMEggICAgICAgIDUxCiAKIGVudW0gY3g4OF9pdHlwZSB7CiAJQ1g4OF9WTVVYX0NPTVBPU0lURTEgPSAxLApAQCAtMjk2LDYgKzMwMyw3IEBACiAJLyogY29uZmlnIGluZm8gLS0gZHZiICovCiAJc3RydWN0IGR2Yl9wbGxfZGVzYyAgICAgICAgKnBsbF9kZXNjOwogCXVuc2lnbmVkIGludCAgICAgICAgICAgICAgIHBsbF9hZGRyOworCWludCAJCQkgICAoKnByZXZfc2V0X3ZvbHRhZ2UpKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBmZV9zZWNfdm9sdGFnZV90IHZvbHRhZ2UpOwogCiAJLyogc3RhdGUgaW5mbyAqLwogCXN0cnVjdCB0YXNrX3N0cnVjdCAgICAgICAgICprdGhyZWFkOwpAQCAtMzkxLDE0ICszOTksNiBAQAogCWludCAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkOwogfTsKIAotLyogVE9ETzogbW92ZSB0aGlzIHRvIHN0cnVjdCB2NGwyX21wZWdfY29tcHJlc3Npb24gPyAqLwotc3RydWN0IGJsYWNrYmlyZF9kbnIgewotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgbW9kZTsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgIHR5cGU7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICBzcGF0aWFsOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgdGVtcG9yYWw7Ci19OwotCiBzdHJ1Y3QgY3g4ODAyX2RldiB7CiAJc3RydWN0IGN4ODhfY29yZSAgICAgICAgICAgKmNvcmU7CiAJc3BpbmxvY2tfdCAgICAgICAgICAgICAgICAgc2xvY2s7CkBAIC00MzIsOCArNDMyLDcgQEAKIAl1bnNpZ25lZCBjaGFyICAgICAgICAgICAgICB0c19nZW5fY250cmw7CiAKIAkvKiBtcGVnIHBhcmFtcyAqLwotCXN0cnVjdCB2NGwyX21wZWdfY29tcHJlc3Npb24gcGFyYW1zOwotCXN0cnVjdCBibGFja2JpcmRfZG5yICAgICAgIGRucl9wYXJhbXM7CisJc3RydWN0IGN4MjM0MXhfbXBlZ19wYXJhbXMgcGFyYW1zOwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTU2NCw3ICs1NjMsNiBAQAogdm9pZCBjeDg4X2dldF9zdGVyZW8oc3RydWN0IGN4ODhfY29yZSAqY29yZSwgc3RydWN0IHY0bDJfdHVuZXIgKnQpOwogdm9pZCBjeDg4X3NldF9zdGVyZW8oc3RydWN0IGN4ODhfY29yZSAqY29yZSwgdTMyIG1vZGUsIGludCBtYW51YWwpOwogaW50IGN4ODhfYXVkaW9fdGhyZWFkKHZvaWQgKmRhdGEpOwotaW50IGN4ODhfZGV0ZWN0X25pY2FtKHN0cnVjdCBjeDg4X2NvcmUgKmNvcmUpOwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogLyogY3g4OC1pbnB1dC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTU5MywxNiArNTkxLDYgQEAKIAkJCQlzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlLCB1bnNpZ25lZCBpbnQgY21kLAogCQkJCXZvaWQgKmFyZywgdjRsMl9raW9jdGwgZHJpdmVyX2lvY3RsKTsKIAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qIGN4ODgtYmxhY2tiaXJkLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1leHRlcm4gaW50ICgqY3g4OF9pb2N0bF9ob29rKShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQl1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpOwotZXh0ZXJuIHVuc2lnbmVkIGludCAoKmN4ODhfaW9jdGxfdHJhbnNsYXRvcikodW5zaWduZWQgaW50IGNtZCk7Ci12b2lkIGJsYWNrYmlyZF9zZXRfcGFyYW1zKHN0cnVjdCBjeDg4MDJfZGV2ICpkZXYsCi0JCQkJc3RydWN0IHY0bDJfbXBlZ19jb21wcmVzc2lvbiAqcGFyYW1zKTsKLXZvaWQgYmxhY2tiaXJkX3NldF9kbnJfcGFyYW1zKHN0cnVjdCBjeDg4MDJfZGV2ICpkZXYsCi0JCQkJc3RydWN0IGJsYWNrYmlyZF9kbnIqIGRucl9wYXJhbXMpOwotCiAvKgogICogTG9jYWwgdmFyaWFibGVzOgogICogYy1iYXNpYy1vZmZzZXQ6IDgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZHNicjEwMC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9kc2JyMTAwLmMKaW5kZXggM2I0ZTk5OC4uZjdlMzNmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9kc2JyMTAwLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9kc2JyMTAwLmMKQEAgLTcyLDYgKzcyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KICNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CiAjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LWNhcmRzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtY2FyZHMuYwppbmRleCAzYmEzNDM5Li5lZDg4MmViIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtY2FyZHMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtY2FyZHMuYwpAQCAtMyw3ICszLDcgQEAKIAogICAgQ29weXJpZ2h0IChDKSAyMDA1IEx1ZG92aWNvIENhdmVkb24gPGNhdmVkb25Ac3NzdXAuaXQ+CiAJCSAgICAgIE1hcmt1cyBSZWNoYmVyZ2VyIDxtcmVjaGJlcmdlckBnbWFpbC5jb20+Ci0JCSAgICAgIE1hdXJvIENhcnZhbGhvIENoZWhhYiA8bWNoZWhhYkBicnR1cmJvLmNvbS5icj4KKwkJICAgICAgTWF1cm8gQ2FydmFsaG8gQ2hlaGFiIDxtY2hlaGFiQGluZnJhZGVhZC5vcmc+CiAJCSAgICAgIFNhc2NoYSBTb21tZXIgPHNhc2NoYXNvbW1lckBmcmVlbmV0LmRlPgogCiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQpAQCAtMjksNiArMjksOCBAQAogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgogI2luY2x1ZGUgPG1lZGlhL3R1bmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvbXNwMzQwMC5oPgorI2luY2x1ZGUgPG1lZGlhL3NhYTcxMTUuaD4KKyNpbmNsdWRlIDxtZWRpYS90dnA1MTUwLmg+CiAjaW5jbHVkZSA8bWVkaWEvdHZlZXByb20uaD4KICNpbmNsdWRlIDxtZWRpYS9hdWRpb2NoaXAuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgpAQCAtNDYsMTEgKzQ4LDExIEBACiAJCS5kZWNvZGVyICAgICAgPSBFTTI4WFhfU0FBNzExMywKIAkJLmlucHV0ICAgICAgICAgICA9IHt7CiAJCQkudHlwZSAgICAgPSBFTTI4WFhfVk1VWF9DT01QT1NJVEUxLAotCQkJLnZtdXggICAgID0gMCwKKwkJCS52bXV4ICAgICA9IFNBQTcxMTVfQ09NUE9TSVRFMCwKIAkJCS5hbXV4ICAgICA9IDEsCiAJCX0sewogCQkJLnR5cGUgICAgID0gRU0yOFhYX1ZNVVhfU1ZJREVPLAotCQkJLnZtdXggICAgID0gOSwKKwkJCS52bXV4ICAgICA9IFNBQTcxMTVfU1ZJREVPMywKIAkJCS5hbXV4ICAgICA9IDEsCiAJCX19LAogCX0sCkBAIC02NCwxMSArNjYsMTEgQEAKIAkJLmRlY29kZXIgICAgICA9IEVNMjhYWF9TQUE3MTEzLAogCQkuaW5wdXQgICAgICAgICAgID0ge3sKIAkJCS50eXBlICAgICA9IEVNMjhYWF9WTVVYX0NPTVBPU0lURTEsCi0JCQkudm11eCAgICAgPSAwLAorCQkJLnZtdXggICAgID0gU0FBNzExNV9DT01QT1NJVEUwLAogCQkJLmFtdXggICAgID0gMSwKIAkJfSx7CiAJCQkudHlwZSAgICAgPSBFTTI4WFhfVk1VWF9TVklERU8sCi0JCQkudm11eCAgICAgPSA5LAorCQkJLnZtdXggICAgID0gU0FBNzExNV9TVklERU8zLAogCQkJLmFtdXggICAgID0gMSwKIAkJfX0sCiAJfSwKQEAgLTgyLDExICs4NCwxMSBAQAogCQkuZGVjb2RlciAgICAgID0gRU0yOFhYX1NBQTcxMTMsCiAJCS5pbnB1dCAgICAgICAgICAgPSB7ewogCQkJLnR5cGUgICAgID0gRU0yOFhYX1ZNVVhfQ09NUE9TSVRFMSwKLQkJCS52bXV4ICAgICA9IDAsCisJCQkudm11eCAgICAgPSBTQUE3MTE1X0NPTVBPU0lURTAsCiAJCQkuYW11eCAgICAgPSAxLAogCQl9LHsKIAkJCS50eXBlICAgICA9IEVNMjhYWF9WTVVYX1NWSURFTywKLQkJCS52bXV4ICAgICA9IDksCisJCQkudm11eCAgICAgPSBTQUE3MTE1X1NWSURFTzMsCiAJCQkuYW11eCAgICAgPSAxLAogCQl9fSwKIAl9LApAQCAtMTAwLDE1ICsxMDIsMTUgQEAKIAkJLmRlY29kZXIgICAgICA9IEVNMjhYWF9TQUE3MTEzLAogCQkuaW5wdXQgICAgICAgICAgPSB7ewogCQkJLnR5cGUgICAgID0gRU0yOFhYX1ZNVVhfVEVMRVZJU0lPTiwKLQkJCS52bXV4ICAgICA9IDIsCisJCQkudm11eCAgICAgPSBTQUE3MTE1X0NPTVBPU0lURTIsCiAJCQkuYW11eCAgICAgPSAxLAogCQl9LHsKIAkJCS50eXBlICAgICA9IEVNMjhYWF9WTVVYX0NPTVBPU0lURTEsCi0JCQkudm11eCAgICAgPSAwLAorCQkJLnZtdXggICAgID0gU0FBNzExNV9DT01QT1NJVEUwLAogCQkJLmFtdXggICAgID0gMSwKIAkJfSx7CiAJCQkudHlwZSAgICAgPSBFTTI4WFhfVk1VWF9TVklERU8sCi0JCQkudm11eCAgICAgPSA5LAorCQkJLnZtdXggICAgID0gU0FBNzExNV9TVklERU8zLAogCQkJLmFtdXggICAgID0gMSwKIAkJfX0sCiAJfSwKQEAgLTEyMiwxNSArMTI0LDE1IEBACiAJCS5kZWNvZGVyICAgICAgPSBFTTI4WFhfU0FBNzExMywKIAkJLmlucHV0ICAgICAgICAgID0ge3sKIAkJCS50eXBlICAgICA9IEVNMjhYWF9WTVVYX1RFTEVWSVNJT04sCi0JCQkudm11eCAgICAgPSAyLAorCQkJLnZtdXggICAgID0gU0FBNzExNV9DT01QT1NJVEUyLAogCQkJLmFtdXggICAgID0gMCwKIAkJfSx7CiAJCQkudHlwZSAgICAgPSBFTTI4WFhfVk1VWF9DT01QT1NJVEUxLAotCQkJLnZtdXggICAgID0gMCwKKwkJCS52bXV4ICAgICA9IFNBQTcxMTVfQ09NUE9TSVRFMCwKIAkJCS5hbXV4ICAgICA9IDEsCiAJCX0sewogCQkJLnR5cGUgICAgID0gRU0yOFhYX1ZNVVhfU1ZJREVPLAotCQkJLnZtdXggICAgID0gOSwKKwkJCS52bXV4ICAgICA9IFNBQTcxMTVfU1ZJREVPMywKIAkJCS5hbXV4ICAgICA9IDEsCiAJCX19LAogCX0sCkBAIC0xNDYsMTEgKzE0OCwxMSBAQAogCQkvKkZJWE1FOiBTLVZpZGVvIG5vdCB0ZXN0ZWQgKi8KIAkJLmlucHV0ICAgICAgICAgID0ge3sKIAkJCS50eXBlICAgICA9IEVNMjhYWF9WTVVYX1RFTEVWSVNJT04sCi0JCQkudm11eCAgICAgPSAwLAorCQkJLnZtdXggICAgID0gVFZQNTE1MF9DT01QT1NJVEUwLAogCQkJLmFtdXggICAgID0gTVNQX0lOUFVUX0RFRkFVTFQsCiAJCX0sewogCQkJLnR5cGUgICAgID0gRU0yOFhYX1ZNVVhfU1ZJREVPLAotCQkJLnZtdXggICAgID0gMiwKKwkJCS52bXV4ICAgICA9IFRWUDUxNTBfU1ZJREVPLAogCQkJLmFtdXggICAgID0gTVNQX0lOUFVUKE1TUF9JTl9TQ0FSVDEsIE1TUF9JTl9UVU5FUjEsCiAJCQkJCU1TUF9EU1BfSU5fU0NBUlQsIE1TUF9EU1BfSU5fU0NBUlQpLAogCQl9fSwKQEAgLTE2NSwxNSArMTY3LDE1IEBACiAJCS5kZWNvZGVyICAgICAgICA9IEVNMjhYWF9TQUE3MTE0LAogCQkuaW5wdXQgICAgICAgICAgPSB7ewogCQkJLnR5cGUgICAgID0gRU0yOFhYX1ZNVVhfVEVMRVZJU0lPTiwKLQkJCS52bXV4ICAgICA9IDQsCisJCQkudm11eCAgICAgPSBTQUE3MTE1X0NPTVBPU0lURTQsCiAJCQkuYW11eCAgICAgPSAwLAogCQl9LHsKIAkJCS50eXBlICAgICA9IEVNMjhYWF9WTVVYX0NPTVBPU0lURTEsCi0JCQkudm11eCAgICAgPSAwLAorCQkJLnZtdXggICAgID0gU0FBNzExNV9DT01QT1NJVEUwLAogCQkJLmFtdXggICAgID0gMSwKIAkJfSx7CiAJCQkudHlwZSAgICAgPSBFTTI4WFhfVk1VWF9TVklERU8sCi0JCQkudm11eCAgICAgPSA5LAorCQkJLnZtdXggICAgID0gU0FBNzExNV9TVklERU8zLAogCQkJLmFtdXggICAgID0gMSwKIAkJfX0sCiAJfSwKQEAgLTE4OCwxNSArMTkwLDE1IEBACiAJCS5kZWNvZGVyICAgICAgPSBFTTI4WFhfU0FBNzExMywKIAkJLmlucHV0ICAgICAgICAgID0ge3sKIAkJCS50eXBlICAgICA9IEVNMjhYWF9WTVVYX1RFTEVWSVNJT04sCi0JCQkudm11eCAgICAgPSAyLAorCQkJLnZtdXggICAgID0gU0FBNzExNV9DT01QT1NJVEUyLAogCQkJLmFtdXggICAgID0gMCwKIAkJfSx7CiAJCQkudHlwZSAgICAgPSBFTTI4WFhfVk1VWF9DT01QT1NJVEUxLAotCQkJLnZtdXggICAgID0gMCwKKwkJCS52bXV4ICAgICA9IFNBQTcxMTVfQ09NUE9TSVRFMCwKIAkJCS5hbXV4ICAgICA9IDEsCiAJCX0sewogCQkJLnR5cGUgICAgID0gRU0yOFhYX1ZNVVhfU1ZJREVPLAotCQkJLnZtdXggICAgID0gOSwKKwkJCS52bXV4ICAgICA9IFNBQTcxMTVfU1ZJREVPMywKIAkJCS5hbXV4ICAgICA9IDEsCiAJCX19LAogCX0sCkBAIC0yMTEsMTUgKzIxMywxNSBAQAogCQkuZGVjb2RlciAgICAgID0gRU0yOFhYX1NBQTcxMTMsCiAJCS5pbnB1dCAgICAgICAgICA9IHt7CiAJCQkudHlwZSAgICAgPSBFTTI4WFhfVk1VWF9URUxFVklTSU9OLAotCQkJLnZtdXggICAgID0gMiwKKwkJCS52bXV4ICAgICA9IFNBQTcxMTVfQ09NUE9TSVRFMiwKIAkJCS5hbXV4ICAgICA9IDAsCiAJCX0sewogCQkJLnR5cGUgICAgID0gRU0yOFhYX1ZNVVhfQ09NUE9TSVRFMSwKLQkJCS52bXV4ICAgICA9IDAsCisJCQkudm11eCAgICAgPSBTQUE3MTE1X0NPTVBPU0lURTAsCiAJCQkuYW11eCAgICAgPSAxLAogCQl9LHsKIAkJCS50eXBlICAgICA9IEVNMjhYWF9WTVVYX1NWSURFTywKLQkJCS52bXV4ICAgICA9IDksCisJCQkudm11eCAgICAgPSBTQUE3MTE1X1NWSURFTzMsCiAJCQkuYW11eCAgICAgPSAxLAogCQl9fSwKIAl9LApAQCAtMjM0LDE1ICsyMzYsMTUgQEAKIAkJLmRlY29kZXIgICAgICA9IEVNMjhYWF9TQUE3MTEzLAogCQkuaW5wdXQgICAgICAgICAgPSB7ewogCQkJLnR5cGUgICAgID0gRU0yOFhYX1ZNVVhfVEVMRVZJU0lPTiwKLQkJCS52bXV4ICAgICA9IDIsCisJCQkudm11eCAgICAgPSBTQUE3MTE1X0NPTVBPU0lURTIsCiAJCQkuYW11eCAgICAgPSAwLAogCQl9LHsKIAkJCS50eXBlICAgICA9IEVNMjhYWF9WTVVYX0NPTVBPU0lURTEsCi0JCQkudm11eCAgICAgPSAwLAorCQkJLnZtdXggICAgID0gU0FBNzExNV9DT01QT1NJVEUwLAogCQkJLmFtdXggICAgID0gMSwKIAkJfSx7CiAJCQkudHlwZSAgICAgPSBFTTI4WFhfVk1VWF9TVklERU8sCi0JCQkudm11eCAgICAgPSA5LAorCQkJLnZtdXggICAgID0gU0FBNzExNV9TVklERU8zLAogCQkJLmFtdXggICAgID0gMSwKIAkJfX0sCiAJfSwKQEAgLTI1NCwxMSArMjU2LDExIEBACiAJCS5kZWNvZGVyICAgICAgPSBFTTI4WFhfU0FBNzExMywKIAkJLmlucHV0ICAgICAgICAgID0ge3sKIAkJCS50eXBlICAgICA9IEVNMjhYWF9WTVVYX0NPTVBPU0lURTEsCi0JCQkudm11eCAgICAgPSAwLAorCQkJLnZtdXggICAgID0gU0FBNzExNV9DT01QT1NJVEUwLAogCQkJLmFtdXggICAgID0gMSwKIAkJfSx7CiAJCQkudHlwZSAgICAgPSBFTTI4WFhfVk1VWF9TVklERU8sCi0JCQkudm11eCAgICAgPSA5LAorCQkJLnZtdXggICAgID0gU0FBNzExNV9TVklERU8zLAogCQkJLmFtdXggICAgID0gMSwKIAkJfX0sCiAJfSwKQEAgLTMyNCw4ICszMjYsNCBAQAogCX0KIH0KIAotRVhQT1JUX1NZTUJPTChlbTI4eHhfYm9hcmRzKTsKLUVYUE9SVF9TWU1CT0woZW0yOHh4X2Jjb3VudCk7Ci1FWFBPUlRfU1lNQk9MKGVtMjh4eF9pZF90YWJsZSk7Ci0KIE1PRFVMRV9ERVZJQ0VfVEFCTEUgKHVzYiwgZW0yOHh4X2lkX3RhYmxlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtY29yZS5jCmluZGV4IGU1ZWU4YmMuLjQzNTBjYzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1jb3JlLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LWNvcmUuYwpAQCAtMyw3ICszLDcgQEAKIAogICAgQ29weXJpZ2h0IChDKSAyMDA1IEx1ZG92aWNvIENhdmVkb24gPGNhdmVkb25Ac3NzdXAuaXQ+CiAJCSAgICAgIE1hcmt1cyBSZWNoYmVyZ2VyIDxtcmVjaGJlcmdlckBnbWFpbC5jb20+Ci0JCSAgICAgIE1hdXJvIENhcnZhbGhvIENoZWhhYiA8bWNoZWhhYkBicnR1cmJvLmNvbS5icj4KKwkJICAgICAgTWF1cm8gQ2FydmFsaG8gQ2hlaGFiIDxtY2hlaGFiQGluZnJhZGVhZC5vcmc+CiAJCSAgICAgIFNhc2NoYSBTb21tZXIgPHNhc2NoYXNvbW1lckBmcmVlbmV0LmRlPgogCiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQpAQCAtMzE3LDggKzMxNyw4IEBACiAJcmV0dXJuIGVtMjh4eF93cml0ZV9yZWdzKGRldiwgVklOQ1RSTF9SRUcsICJceDExIiwgMSk7CiB9CiAKLWludCBlbTI4eHhfYWNjdW11bGF0b3Jfc2V0KHN0cnVjdCBlbTI4eHggKmRldiwgdTggeG1pbiwgdTggeG1heCwgdTggeW1pbiwKLQkJCQkgIHU4IHltYXgpCitzdGF0aWMgaW50IGVtMjh4eF9hY2N1bXVsYXRvcl9zZXQoc3RydWN0IGVtMjh4eCAqZGV2LCB1OCB4bWluLCB1OCB4bWF4LAorCQkJCSAgdTggeW1pbiwgdTggeW1heCkKIHsKIAllbTI4eHhfY29yZWRiZygiZW0yOHh4IFNjYWxlOiAoJWQsJWQpLSglZCwlZClcbiIsIHhtaW4sIHltaW4sIHhtYXgsIHltYXgpOwogCkBAIC0zMjgsNyArMzI4LDcgQEAKIAlyZXR1cm4gZW0yOHh4X3dyaXRlX3JlZ3MoZGV2LCBZTUFYX1JFRywgJnltYXgsIDEpOwogfQogCi1pbnQgZW0yOHh4X2NhcHR1cmVfYXJlYV9zZXQoc3RydWN0IGVtMjh4eCAqZGV2LCB1OCBoc3RhcnQsIHU4IHZzdGFydCwKK3N0YXRpYyBpbnQgZW0yOHh4X2NhcHR1cmVfYXJlYV9zZXQoc3RydWN0IGVtMjh4eCAqZGV2LCB1OCBoc3RhcnQsIHU4IHZzdGFydCwKIAkJCQkgICB1MTYgd2lkdGgsIHUxNiBoZWlnaHQpCiB7CiAJdTggY3dpZHRoID0gd2lkdGg7CkBAIC0zNDUsNyArMzQ1LDcgQEAKIAlyZXR1cm4gZW0yOHh4X3dyaXRlX3JlZ3MoZGV2LCBPRkxPV19SRUcsICZvdmVyZmxvdywgMSk7CiB9CiAKLWludCBlbTI4eHhfc2NhbGVyX3NldChzdHJ1Y3QgZW0yOHh4ICpkZXYsIHUxNiBoLCB1MTYgdikKK3N0YXRpYyBpbnQgZW0yOHh4X3NjYWxlcl9zZXQoc3RydWN0IGVtMjh4eCAqZGV2LCB1MTYgaCwgdTE2IHYpCiB7CiAJdTggbW9kZTsKIAkvKiB0aGUgZW0yODAwIHNjYWxlciBvbmx5IHN1cHBvcnRzIHNjYWxpbmcgZG93biB0byA1MCUgKi8KQEAgLTUzNCw3ICs1MzQsNyBAQAogICogZW0yOHh4X2lzb0lycSgpCiAgKiBoYW5kbGVzIHRoZSBpbmNvbWluZyBpc29jIHVyYnMgYW5kIGZpbGxzIHRoZSBmcmFtZXMgZnJvbSBvdXIgaW5xdWV1ZQogICovCi12b2lkIGVtMjh4eF9pc29jSXJxKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitzdGF0aWMgdm9pZCBlbTI4eHhfaXNvY0lycShzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXN0cnVjdCBlbTI4eHggKmRldiA9IHVyYi0+Y29udGV4dDsKIAlpbnQgaSwgc3RhdHVzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LWkyYy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LWkyYy5jCmluZGV4IDViNmNlY2UuLmQ4MjlkOGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1pMmMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtaTJjLmMKQEAgLTMsNyArMyw3IEBACiAKICAgIENvcHlyaWdodCAoQykgMjAwNSBMdWRvdmljbyBDYXZlZG9uIDxjYXZlZG9uQHNzc3VwLml0PgogCQkgICAgICBNYXJrdXMgUmVjaGJlcmdlciA8bXJlY2hiZXJnZXJAZ21haWwuY29tPgotCQkgICAgICBNYXVybyBDYXJ2YWxobyBDaGVoYWIgPG1jaGVoYWJAYnJ0dXJiby5jb20uYnI+CisJCSAgICAgIE1hdXJvIENhcnZhbGhvIENoZWhhYiA8bWNoZWhhYkBpbmZyYWRlYWQub3JnPgogCQkgICAgICBTYXNjaGEgU29tbWVyIDxzYXNjaGFzb21tZXJAZnJlZW5ldC5kZT4KIAogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKQEAgLTM5OSwxNyArMzk5LDYgQEAKIAlyZXR1cm4gSTJDX0ZVTkNfU01CVVNfRU1VTDsKIH0KIAotI2lmbmRlZiBJMkNfUEVDCi1zdGF0aWMgdm9pZCBpbmNfdXNlKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKLXsKLQlNT0RfSU5DX1VTRV9DT1VOVDsKLX0KLQotc3RhdGljIHZvaWQgZGVjX3VzZShzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCi17Ci0JTU9EX0RFQ19VU0VfQ09VTlQ7Ci19Ci0jZW5kaWYKIAogc3RhdGljIGludCBlbTI4eHhfc2V0X3R1bmVyKGludCBjaGVja19lZXByb20sIHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7CkBAIC00MzYsOSArNDI1LDE5IEBACiAJc3RydWN0IGVtMjh4eCAqZGV2ID0gY2xpZW50LT5hZGFwdGVyLT5hbGdvX2RhdGE7CiAKIAlzd2l0Y2ggKGNsaWVudC0+YWRkciA8PCAxKSB7Ci0JCWNhc2UgMHg4NjoKKwkJY2FzZSAweDQzOgorCQljYXNlIDB4NGI6CisJCXsKKwkJCXN0cnVjdCB0dW5lcl9zZXR1cCB0dW5fc2V0dXA7CisKKwkJCXR1bl9zZXR1cC5tb2RlX21hc2sgPSBUX0FOQUxPR19UViB8IFRfUkFESU87CisJCQl0dW5fc2V0dXAudHlwZSA9IFRVTkVSX1REQTk4ODc7CisJCQl0dW5fc2V0dXAuYWRkciA9IGNsaWVudC0+YWRkcjsKKworCQkJZW0yOHh4X2kyY19jYWxsX2NsaWVudHMoZGV2LCBUVU5FUl9TRVRfVFlQRV9BRERSLCAmdHVuX3NldHVwKTsKIAkJCWVtMjh4eF9pMmNfY2FsbF9jbGllbnRzKGRldiwgVERBOTg4N19TRVRfQ09ORklHLCAmZGV2LT50ZGE5ODg3X2NvbmYpOwogCQkJYnJlYWs7CisJCX0KIAkJY2FzZSAweDQyOgogCQkJZHByaW50azEoMSwiYXR0YWNoX2luZm9ybTogc2FhNzExNCBkZXRlY3RlZC5cbiIpOwogCQkJYnJlYWs7CkBAIC00NjQsNiArNDYzLDcgQEAKIAkJY2FzZSAweGJhOgogCQkJZHByaW50azEoMSwiYXR0YWNoX2luZm9ybTogdHZwNTE1MCBkZXRlY3RlZC5cbiIpOwogCQkJYnJlYWs7CisKIAkJZGVmYXVsdDoKIAkJCWRwcmludGsxKDEsImF0dGFjaCBpbmZvcm06IGRldGVjdGVkIEkyQyBhZGRyZXNzICV4XG4iLCBjbGllbnQtPmFkZHIgPDwgMSk7CiAJCQlkZXYtPnR1bmVyX2FkZHIgPSBjbGllbnQtPmFkZHI7CkBAIC00ODAsMTIgKzQ4MCw3IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IGkyY19hZGFwdGVyIGVtMjh4eF9hZGFwX3RlbXBsYXRlID0gewotI2lmZGVmIEkyQ19QRUMKIAkub3duZXIgPSBUSElTX01PRFVMRSwKLSNlbHNlCi0JLmluY191c2UgPSBpbmNfdXNlLAotCS5kZWNfdXNlID0gZGVjX3VzZSwKLSNlbmRpZgogCS5jbGFzcyA9IEkyQ19DTEFTU19UVl9BTkFMT0csCiAJLm5hbWUgPSAiZW0yOHh4IiwKIAkuaWQgPSBJMkNfSFdfQl9FTTI4WFgsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtaW5wdXQuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1pbnB1dC5jCmluZGV4IDMxZTg5ZTQuLjNmZmI1NjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1pbnB1dC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1pbnB1dC5jCkBAIC0zLDcgKzMsNyBAQAogCiAgICBDb3B5cmlnaHQgKEMpIDIwMDUgTHVkb3ZpY28gQ2F2ZWRvbiA8Y2F2ZWRvbkBzc3N1cC5pdD4KIAkJICAgICAgTWFya3VzIFJlY2hiZXJnZXIgPG1yZWNoYmVyZ2VyQGdtYWlsLmNvbT4KLQkJICAgICAgTWF1cm8gQ2FydmFsaG8gQ2hlaGFiIDxtY2hlaGFiQGJydHVyYm8uY29tLmJyPgorCQkgICAgICBNYXVybyBDYXJ2YWxobyBDaGVoYWIgPG1jaGVoYWJAaW5mcmFkZWFkLm9yZz4KIAkJICAgICAgU2FzY2hhIFNvbW1lciA8c2FzY2hhc29tbWVyQGZyZWVuZXQuZGU+CiAKICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKQEAgLTEwNSw3ICsxMDUsNyBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgaW50IGdldF9rZXlfcGlubmFjbGVfdXNiKHN0cnVjdCBJUl9pMmMgKmlyLCB1MzIgKmlyX2tleSwgdTMyICppcl9yYXcpCitzdGF0aWMgaW50IGdldF9rZXlfcGlubmFjbGVfdXNiX2dyZXkoc3RydWN0IElSX2kyYyAqaXIsIHUzMiAqaXJfa2V5LCB1MzIgKmlyX3JhdykKIHsKIAl1bnNpZ25lZCBjaGFyIGJ1ZlszXTsKIApAQCAtMTQ4LDggKzE0OCw4IEBACiAJCXNucHJpbnRmKGlyLT5jLm5hbWUsIHNpemVvZihpci0+Yy5uYW1lKSwgImkyYyBJUiAoRU0yOFhYIFRlcnJhdGVjKSIpOwogCQlicmVhazsKIAljYXNlIChFTTI4MjBfQk9BUkRfUElOTkFDTEVfVVNCXzIpOgotCQlpci0+aXJfY29kZXMgPSBpcl9jb2Rlc19lbV9waW5uYWNsZV91c2I7Ci0JCWlyLT5nZXRfa2V5ID0gZ2V0X2tleV9waW5uYWNsZV91c2I7CisJCWlyLT5pcl9jb2RlcyA9IGlyX2NvZGVzX3Bpbm5hY2xlX2dyZXk7CisJCWlyLT5nZXRfa2V5ID0gZ2V0X2tleV9waW5uYWNsZV91c2JfZ3JleTsKIAkJc25wcmludGYoaXItPmMubmFtZSwgc2l6ZW9mKGlyLT5jLm5hbWUpLCAiaTJjIElSIChFTTI4WFggUGlubmFjbGUgUENUVikiKTsKIAkJYnJlYWs7CiAJY2FzZSAoRU0yODIwX0JPQVJEX0hBVVBQQVVHRV9XSU5UVl9VU0JfMik6CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtdmlkZW8uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC12aWRlby5jCmluZGV4IGNmN2NkZjkuLjkyODYwOTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC12aWRlby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC12aWRlby5jCkBAIC0zLDcgKzMsNyBAQAogCiAgICBDb3B5cmlnaHQgKEMpIDIwMDUgTHVkb3ZpY28gQ2F2ZWRvbiA8Y2F2ZWRvbkBzc3N1cC5pdD4KIAkJICAgICAgTWFya3VzIFJlY2hiZXJnZXIgPG1yZWNoYmVyZ2VyQGdtYWlsLmNvbT4KLQkJICAgICAgTWF1cm8gQ2FydmFsaG8gQ2hlaGFiIDxtY2hlaGFiQGJydHVyYm8uY29tLmJyPgorCQkgICAgICBNYXVybyBDYXJ2YWxobyBDaGVoYWIgPG1jaGVoYWJAaW5mcmFkZWFkLm9yZz4KIAkJICAgICAgU2FzY2hhIFNvbW1lciA8c2FzY2hhc29tbWVyQGZyZWVuZXQuZGU+CiAKIAlTb21lIHBhcnRzIGJhc2VkIG9uIFNOOUMxMHggUEMgQ2FtZXJhIENvbnRyb2xsZXJzIEdQTCBkcml2ZXIgbWFkZQpAQCAtNDIsNyArNDIsNyBAQAogCiAjZGVmaW5lIERSSVZFUl9BVVRIT1IgIkx1ZG92aWNvIENhdmVkb24gPGNhdmVkb25Ac3NzdXAuaXQ+LCAiIFwKIAkJICAgICAgIk1hcmt1cyBSZWNoYmVyZ2VyIDxtcmVjaGJlcmdlckBnbWFpbC5jb20+LCAiIFwKLQkJICAgICAgIk1hdXJvIENhcnZhbGhvIENoZWhhYiA8bWNoZWhhYkBicnR1cmJvLmNvbS5icj4sICIgXAorCQkgICAgICAiTWF1cm8gQ2FydmFsaG8gQ2hlaGFiIDxtY2hlaGFiQGluZnJhZGVhZC5vcmc+LCAiIFwKIAkJICAgICAgIlNhc2NoYSBTb21tZXIgPHNhc2NoYXNvbW1lckBmcmVlbmV0LmRlPiIKIAogI2RlZmluZSBEUklWRVJfTkFNRSAgICAgICAgICJlbTI4eHgiCkBAIC0xNzAsOCArMTcwLDEyIEBACiBzdGF0aWMgdm9pZCBlbTI4eHhfY29uZmlnX2kyYyhzdHJ1Y3QgZW0yOHh4ICpkZXYpCiB7CiAJc3RydWN0IHY0bDJfZnJlcXVlbmN5IGY7CisJc3RydWN0IHY0bDJfcm91dGluZyByb3V0ZTsKKworCXJvdXRlLmlucHV0ID0gSU5QVVQoZGV2LT5jdGxfaW5wdXQpLT52bXV4OworCXJvdXRlLm91dHB1dCA9IDA7CiAJZW0yOHh4X2kyY19jYWxsX2NsaWVudHMoZGV2LCBWSURJT0NfSU5UX1JFU0VULCBOVUxMKTsKLQllbTI4eHhfaTJjX2NhbGxfY2xpZW50cyhkZXYsIFZJRElPQ19TX0lOUFVULCAmZGV2LT5jdGxfaW5wdXQpOworCWVtMjh4eF9pMmNfY2FsbF9jbGllbnRzKGRldiwgVklESU9DX0lOVF9TX1ZJREVPX1JPVVRJTkcsICZyb3V0ZSk7CiAJZW0yOHh4X2kyY19jYWxsX2NsaWVudHMoZGV2LCBWSURJT0NfU1RSRUFNT04sIE5VTEwpOwogCiAJLyogY29uZmlndXJlIHR1bmVyICovCkBAIC0yMDYsMTkgKzIxMCwxOSBAQAogCiBzdGF0aWMgdm9pZCB2aWRlb19tdXgoc3RydWN0IGVtMjh4eCAqZGV2LCBpbnQgaW5kZXgpCiB7Ci0JaW50IGlucHV0LCBhaW5wdXQ7CisJaW50IGFpbnB1dDsKKwlzdHJ1Y3QgdjRsMl9yb3V0aW5nIHJvdXRlOwogCi0JaW5wdXQgPSBJTlBVVChpbmRleCktPnZtdXg7CisJcm91dGUuaW5wdXQgPSBJTlBVVChpbmRleCktPnZtdXg7CisJcm91dGUub3V0cHV0ID0gMDsKIAlkZXYtPmN0bF9pbnB1dCA9IGluZGV4OwogCWRldi0+Y3RsX2FpbnB1dCA9IElOUFVUKGluZGV4KS0+YW11eDsKIAotCWVtMjh4eF9pMmNfY2FsbF9jbGllbnRzKGRldiwgVklESU9DX1NfSU5QVVQsICZpbnB1dCk7CisJZW0yOHh4X2kyY19jYWxsX2NsaWVudHMoZGV2LCBWSURJT0NfSU5UX1NfVklERU9fUk9VVElORywgJnJvdXRlKTsKIAotCWVtMjh4eF92aWRlb2RiZygiU2V0dGluZyBpbnB1dCBpbmRleD0lZCwgdm11eD0lZCwgYW11eD0lZFxuIixpbmRleCxpbnB1dCxkZXYtPmN0bF9haW5wdXQpOworCWVtMjh4eF92aWRlb2RiZygiU2V0dGluZyBpbnB1dCBpbmRleD0lZCwgdm11eD0lZCwgYW11eD0lZFxuIixpbmRleCxyb3V0ZS5pbnB1dCxkZXYtPmN0bF9haW5wdXQpOwogCiAJaWYgKGRldi0+aGFzX21zcDM0eHgpIHsKLQkJc3RydWN0IHY0bDJfcm91dGluZyByb3V0ZTsKLQogCQlpZiAoZGV2LT5pMnNfc3BlZWQpCiAJCQllbTI4eHhfaTJjX2NhbGxfY2xpZW50cyhkZXYsIFZJRElPQ19JTlRfSTJTX0NMT0NLX0ZSRVEsICZkZXYtPmkyc19zcGVlZCk7CiAJCXJvdXRlLmlucHV0ID0gZGV2LT5jdGxfYWlucHV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHguaAppbmRleCBlMWRkYzJmLi5kOGZjYzllIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHguaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHguaApAQCAtMyw3ICszLDcgQEAKIAogICAgQ29weXJpZ2h0IChDKSAyMDA1IE1hcmt1cyBSZWNoYmVyZ2VyIDxtcmVjaGJlcmdlckBnbWFpbC5jb20+CiAJCSAgICAgIEx1ZG92aWNvIENhdmVkb24gPGNhdmVkb25Ac3NzdXAuaXQ+Ci0JCSAgICAgIE1hdXJvIENhcnZhbGhvIENoZWhhYiA8bWNoZWhhYkBicnR1cmJvLmNvbS5icj4KKwkJICAgICAgTWF1cm8gQ2FydmFsaG8gQ2hlaGFiIDxtY2hlaGFiQGluZnJhZGVhZC5vcmc+CiAKICAgIEJhc2VkIG9uIHRoZSBlbTI4MDAgZHJpdmVyIGZyb20gU2FzY2hhIFNvbW1lciA8c2FzY2hhc29tbWVyQGZyZWVuZXQuZGU+CiAKQEAgLTMxOSwxMyArMzE5LDcgQEAKIGludCBlbTI4eHhfY29sb3JsZXZlbHNfc2V0X2RlZmF1bHQoc3RydWN0IGVtMjh4eCAqZGV2KTsKIGludCBlbTI4eHhfY2FwdHVyZV9zdGFydChzdHJ1Y3QgZW0yOHh4ICpkZXYsIGludCBzdGFydCk7CiBpbnQgZW0yOHh4X291dGZtdF9zZXRfeXV2NDIyKHN0cnVjdCBlbTI4eHggKmRldik7Ci1pbnQgZW0yOHh4X2FjY3VtdWxhdG9yX3NldChzdHJ1Y3QgZW0yOHh4ICpkZXYsIHU4IHhtaW4sIHU4IHhtYXgsIHU4IHltaW4sCi0JCQkgICB1OCB5bWF4KTsKLWludCBlbTI4eHhfY2FwdHVyZV9hcmVhX3NldChzdHJ1Y3QgZW0yOHh4ICpkZXYsIHU4IGhzdGFydCwgdTggdnN0YXJ0LAotCQkJICAgIHUxNiB3aWR0aCwgdTE2IGhlaWdodCk7Ci1pbnQgZW0yOHh4X3NjYWxlcl9zZXQoc3RydWN0IGVtMjh4eCAqZGV2LCB1MTYgaCwgdTE2IHYpOwogaW50IGVtMjh4eF9yZXNvbHV0aW9uX3NldChzdHJ1Y3QgZW0yOHh4ICpkZXYpOwotdm9pZCBlbTI4eHhfaXNvY0lycShzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKIGludCBlbTI4eHhfaW5pdF9pc29jKHN0cnVjdCBlbTI4eHggKmRldik7CiB2b2lkIGVtMjh4eF91bmluaXRfaXNvYyhzdHJ1Y3QgZW0yOHh4ICpkZXYpOwogaW50IGVtMjh4eF9zZXRfYWx0ZXJuYXRlKHN0cnVjdCBlbTI4eHggKmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2V0NjF4MjUxL2V0NjF4MjUxX2NvcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZXQ2MXgyNTEvZXQ2MXgyNTFfY29yZS5jCmluZGV4IGRmYzlkZDcuLjg5OTJiNmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZXQ2MXgyNTEvZXQ2MXgyNTFfY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZXQ2MXgyNTEvZXQ2MXgyNTFfY29yZS5jCkBAIC0yMzQxLDExICsyMzQxLDkgQEAKIAljYXNlIFZJRElPQ19HX0NUUkw6CiAJCXJldHVybiBldDYxeDI1MV92aWRpb2NfZ19jdHJsKGNhbSwgYXJnKTsKIAotCWNhc2UgVklESU9DX1NfQ1RSTF9PTEQ6CiAJY2FzZSBWSURJT0NfU19DVFJMOgogCQlyZXR1cm4gZXQ2MXgyNTFfdmlkaW9jX3NfY3RybChjYW0sIGFyZyk7CiAKLQljYXNlIFZJRElPQ19DUk9QQ0FQX09MRDoKIAljYXNlIFZJRElPQ19DUk9QQ0FQOgogCQlyZXR1cm4gZXQ2MXgyNTFfdmlkaW9jX2Nyb3BjYXAoY2FtLCBhcmcpOwogCkBAIC0yMzkyLDcgKzIzOTAsNiBAQAogCWNhc2UgVklESU9DX0dfUEFSTToKIAkJcmV0dXJuIGV0NjF4MjUxX3ZpZGlvY19nX3Bhcm0oY2FtLCBhcmcpOwogCi0JY2FzZSBWSURJT0NfU19QQVJNX09MRDoKIAljYXNlIFZJRElPQ19TX1BBUk06CiAJCXJldHVybiBldDYxeDI1MV92aWRpb2Nfc19wYXJtKGNhbSwgYXJnKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9pci1rYmQtaTJjLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2lyLWtiZC1pMmMuYwppbmRleCA3ZTY2ZDgzLi5mYmEzMGE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2lyLWtiZC1pMmMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2lyLWtiZC1pMmMuYwpAQCAtMTUwLDEyICsxNTAsMTEgQEAKIAlyZXR1cm4gMTsKIH0KIAotLyogVGhlIG5ldyBwaW5uYWNsZSBQQ1RWIHJlbW90ZSAod2l0aCB0aGUgY29sb3JlZCBidXR0b25zKQorLyogQ29tbW9uIChncmV5IG9yIGNvbG91cmVkKSBwaW5uYWNsZSBQQ1RWIHJlbW90ZSBoYW5kbGluZwogICoKLSAqIFJpY2FyZG8gQ2VycXVlaXJhIDx2NGxAY2VycXVlaXJhLm9yZz4KICAqLwotCi1pbnQgZ2V0X2tleV9waW5uYWNsZShzdHJ1Y3QgSVJfaTJjICppciwgdTMyICppcl9rZXksIHUzMiAqaXJfcmF3KQorc3RhdGljIGludCBnZXRfa2V5X3Bpbm5hY2xlKHN0cnVjdCBJUl9pMmMgKmlyLCB1MzIgKmlyX2tleSwgdTMyICppcl9yYXcsCisJCQkgICAgaW50IHBhcml0eV9vZmZzZXQsIGludCBtYXJrZXIsIGludCBjb2RlX21vZHVsbykKIHsKIAl1bnNpZ25lZCBjaGFyIGJbNF07CiAJdW5zaWduZWQgaW50IHN0YXJ0ID0gMCxwYXJpdHkgPSAwLGNvZGUgPSAwOwpAQCAtMTY3LDkgKzE2Niw5IEBACiAJfQogCiAJZm9yIChzdGFydCA9IDA7IHN0YXJ0PDQ7IHN0YXJ0KyspIHsKLQkJaWYgKGJbc3RhcnRdID09IDB4ODApIHsKLQkJCWNvZGU9Ylsoc3RhcnQrMyklNF07Ci0JCQlwYXJpdHk9Ylsoc3RhcnQrMiklNF07CisJCWlmIChiW3N0YXJ0XSA9PSBtYXJrZXIpIHsKKwkJCWNvZGU9Ylsoc3RhcnQrcGFyaXR5X29mZnNldCsxKSU0XTsKKwkJCXBhcml0eT1iWyhzdGFydCtwYXJpdHlfb2Zmc2V0KSU0XTsKIAkJfQogCX0KIApAQCAtMTgxLDE2ICsxODAsMTQgQEAKIAlpZiAoaXItPm9sZCA9PSBwYXJpdHkpCiAJCXJldHVybiAwOwogCi0KIAlpci0+b2xkID0gcGFyaXR5OwogCi0JLyogUmVkdWNlIGNvZGUgdmFsdWUgdG8gZml0IGluc2lkZSBJUl9LRVlUQUJfU0laRQotCSAqCi0JICogdGhpcyBpcyB0aGUgb25seSB2YWx1ZSB0aGF0IHJlc3VsdHMgaW4gNDIgdW5pcXVlCi0JICogY29kZXMgPCAxMjgKLQkgKi8KKwkvKiBkcm9wIHNwZWNpYWwgY29kZXMgd2hlbiBhIGtleSBpcyBoZWxkIGRvd24gYSBsb25nIHRpbWUgZm9yIHRoZSBncmV5IGNvbnRyb2xsZXIKKwkgICBJbiB0aGlzIGNhc2UsIHRoZSBzZWNvbmQgYml0IG9mIHRoZSBjb2RlIGlzIGFzc2VydGVkICovCisJaWYgKG1hcmtlciA9PSAweGZlICYmIChjb2RlICYgMHg0MCkpCisJCXJldHVybiAwOwogCi0JY29kZSAlPSAweDg4OworCWNvZGUgJT0gY29kZV9tb2R1bG87CiAKIAkqaXJfcmF3ID0gY29kZTsKIAkqaXJfa2V5ID0gY29kZTsKQEAgLTIwMCw3ICsxOTcsNDAgQEAKIAlyZXR1cm4gMTsKIH0KIAotRVhQT1JUX1NZTUJPTF9HUEwoZ2V0X2tleV9waW5uYWNsZSk7CisvKiBUaGUgZ3JleSBwaW5uYWNsZSBQQ1RWIHJlbW90ZQorICoKKyAqICBUaGVyZSBhcmUgb25lIGlzc3VlIHdpdGggdGhpcyByZW1vdGU6CisgKiAgIC0gSTJjIHBhY2tldCBkb2VzIG5vdCBjaGFuZ2Ugd2hlbiB0aGUgc2FtZSBrZXkgaXMgcHJlc3NlZCBxdWlja2x5LiBUaGUgd29ya2Fyb3VuZAorICogICAgIGlzIHRvIGhvbGQgZG93biBlYWNoIGtleSBmb3IgYWJvdXQgaGFsZiBhIHNlY29uZCwgc28gdGhhdCBhbm90aGVyIGNvZGUgaXMgZ2VuZXJhdGVkCisgKiAgICAgaW4gdGhlIGkyYyBwYWNrZXQsIGFuZCB0aGUgZnVuY3Rpb24gY2FuIGRpc3Rpbmd1aXNoIGtleSBwcmVzc2VzLgorICoKKyAqIFN5bHZhaW4gUGFzY2hlIDxzeWx2YWluLnBhc2NoZUBnbWFpbC5jb20+CisgKi8KK2ludCBnZXRfa2V5X3Bpbm5hY2xlX2dyZXkoc3RydWN0IElSX2kyYyAqaXIsIHUzMiAqaXJfa2V5LCB1MzIgKmlyX3JhdykKK3sKKworCXJldHVybiBnZXRfa2V5X3Bpbm5hY2xlKGlyLCBpcl9rZXksIGlyX3JhdywgMSwgMHhmZSwgMHhmZik7Cit9CisKK0VYUE9SVF9TWU1CT0xfR1BMKGdldF9rZXlfcGlubmFjbGVfZ3JleSk7CisKKworLyogVGhlIG5ldyBwaW5uYWNsZSBQQ1RWIHJlbW90ZSAod2l0aCB0aGUgY29sb3JlZCBidXR0b25zKQorICoKKyAqIFJpY2FyZG8gQ2VycXVlaXJhIDx2NGxAY2VycXVlaXJhLm9yZz4KKyAqLworaW50IGdldF9rZXlfcGlubmFjbGVfY29sb3Ioc3RydWN0IElSX2kyYyAqaXIsIHUzMiAqaXJfa2V5LCB1MzIgKmlyX3JhdykKK3sKKwkvKiBjb2RlX21vZHVsbyBwYXJhbWV0ZXIgKDB4ODgpIGlzIHVzZWQgdG8gcmVkdWNlIGNvZGUgdmFsdWUgdG8gZml0IGluc2lkZSBJUl9LRVlUQUJfU0laRQorCSAqCisJICogdGhpcyBpcyB0aGUgb25seSB2YWx1ZSB0aGF0IHJlc3VsdHMgaW4gNDIgdW5pcXVlCisJICogY29kZXMgPCAxMjgKKwkgKi8KKworCXJldHVybiBnZXRfa2V5X3Bpbm5hY2xlKGlyLCBpcl9rZXksIGlyX3JhdywgMiwgMHg4MCwgMHg4OCk7Cit9CisKK0VYUE9SVF9TWU1CT0xfR1BMKGdldF9rZXlfcGlubmFjbGVfY29sb3IpOwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2tzMDEyNy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9rczAxMjcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmY3YWM0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9rczAxMjcuYwpAQCAtMCwwICsxLDg0NiBAQAorLyoKKyAqIFZpZGVvIENhcHR1cmUgRHJpdmVyIChWaWRlbyBmb3IgTGludXggMS8yKQorICogZm9yIHRoZSBNYXRyb3ggTWFydmVsIEcyMDAsRzQwMCBhbmQgUmFpbmJvdyBSdW5uZXItRyBzZXJpZXMKKyAqCisgKiBUaGlzIG1vZHVsZSBpcyBhbiBpbnRlcmZhY2UgdG8gdGhlIEtTMDEyNyB2aWRlbyBkZWNvZGVyIGNoaXAuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5ICBSeWFuIERyYWtlIDxzdGlsZXR0b0BtZWRpYW9uZS5uZXQ+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisgKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTW9kaWZpZWQgYW5kIGV4dGVuZGVkIGJ5CisgKglNaWtlIEJlcm5zb24gPG1pa2VAbWxiLm9yZz4KKyAqCUdlcmFyZCB2LmQuIEhvcnN0CisgKglMZW9uIHZhbiBTdHVpdmVuYmVyZyA8bC52YW5zdHVpdmVuYmVyZ0BjaGVsbG8ubmw+CisgKglHZXJub3QgWmllZ2xlciA8Z3pAbHlzYXRvci5saXUuc2U+CisgKgorICogVmVyc2lvbiBIaXN0b3J5OgorICogVjEuMCBSeWFuIERyYWtlCSAgIEluaXRpYWwgdmVyc2lvbiBieSBSeWFuIERyYWtlCisgKiBWMS4xIEdlcmFyZCB2LmQuIEhvcnN0ICBBZGRlZCBzb21lIGRlYnVnb3V0cHV0LCByZXNldCB0aGUgdmlkZW8tc3RhbmRhcmQKKyAqLworCisjaWZuZGVmIF9fS0VSTkVMX18KKyNkZWZpbmUgX19LRVJORUxfXworI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSAia3MwMTI3LmgiCisKKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC92aWRlb19kZWNvZGVyLmg+CisKKyNkZWZpbmUgZHByaW50ayAgICAgaWYgKGRlYnVnKSBwcmludGsKKworLyogaTJjIGlkZW50aWZpY2F0aW9uICovCisjZGVmaW5lIEkyQ19LUzAxMjdfQURET04gICAweEQ4CisjZGVmaW5lIEkyQ19LUzAxMjdfT05CT0FSRCAweERBCisKKyNkZWZpbmUgS1NfVFlQRV9VTktOT1dOCTAKKyNkZWZpbmUgS1NfVFlQRV8wMTIyUwkxCisjZGVmaW5lIEtTX1RZUEVfMDEyNwkyCisjZGVmaW5lIEtTX1RZUEVfMDEyN0IJMworCisvKiBrczAxMjcgY29udHJvbCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgS1NfU1RBVCAgICAgMHgwMAorI2RlZmluZSBLU19DTURBICAgICAweDAxCisjZGVmaW5lIEtTX0NNREIgICAgIDB4MDIKKyNkZWZpbmUgS1NfQ01EQyAgICAgMHgwMworI2RlZmluZSBLU19DTUREICAgICAweDA0CisjZGVmaW5lIEtTX0hBVkIgICAgIDB4MDUKKyNkZWZpbmUgS1NfSEFWRSAgICAgMHgwNgorI2RlZmluZSBLU19IUzFCICAgICAweDA3CisjZGVmaW5lIEtTX0hTMUUgICAgIDB4MDgKKyNkZWZpbmUgS1NfSFMyQiAgICAgMHgwOQorI2RlZmluZSBLU19IUzJFICAgICAweDBhCisjZGVmaW5lIEtTX0FHQyAgICAgIDB4MGIKKyNkZWZpbmUgS1NfSFhUUkEgICAgMHgwYworI2RlZmluZSBLU19DREVNICAgICAweDBkCisjZGVmaW5lIEtTX1BPUlRBQiAgIDB4MGUKKyNkZWZpbmUgS1NfTFVNQSAgICAgMHgwZgorI2RlZmluZSBLU19DT04gICAgICAweDEwCisjZGVmaW5lIEtTX0JSVCAgICAgIDB4MTEKKyNkZWZpbmUgS1NfQ0hST01BICAgMHgxMgorI2RlZmluZSBLU19DSFJPTUIgICAweDEzCisjZGVmaW5lIEtTX0RFTU9EICAgIDB4MTQKKyNkZWZpbmUgS1NfU0FUICAgICAgMHgxNQorI2RlZmluZSBLU19IVUUgICAgICAweDE2CisjZGVmaW5lIEtTX1ZFUlRJQSAgIDB4MTcKKyNkZWZpbmUgS1NfVkVSVElCICAgMHgxOAorI2RlZmluZSBLU19WRVJUSUMgICAweDE5CisjZGVmaW5lIEtTX0hTQ0xMICAgIDB4MWEKKyNkZWZpbmUgS1NfSFNDTEggICAgMHgxYgorI2RlZmluZSBLU19WU0NMTCAgICAweDFjCisjZGVmaW5lIEtTX1ZTQ0xIICAgIDB4MWQKKyNkZWZpbmUgS1NfT0ZNVEEgICAgMHgxZQorI2RlZmluZSBLU19PRk1UQiAgICAweDFmCisjZGVmaW5lIEtTX1ZCSUNUTCAgIDB4MjAKKyNkZWZpbmUgS1NfQ0NEQVQyICAgMHgyMQorI2RlZmluZSBLU19DQ0RBVDEgICAweDIyCisjZGVmaW5lIEtTX1ZCSUwzMCAgIDB4MjMKKyNkZWZpbmUgS1NfVkJJTDc0ICAgMHgyNAorI2RlZmluZSBLU19WQklMMTE4ICAweDI1CisjZGVmaW5lIEtTX1ZCSUwxNTEyIDB4MjYKKyNkZWZpbmUgS1NfVFRGUkFNICAgMHgyNworI2RlZmluZSBLU19URVNUQSAgICAweDI4CisjZGVmaW5lIEtTX1VWT0ZGSCAgIDB4MjkKKyNkZWZpbmUgS1NfVVZPRkZMICAgMHgyYQorI2RlZmluZSBLU19VR0FJTiAgICAweDJiCisjZGVmaW5lIEtTX1ZHQUlOICAgIDB4MmMKKyNkZWZpbmUgS1NfVkFWQiAgICAgMHgyZAorI2RlZmluZSBLU19WQVZFICAgICAweDJlCisjZGVmaW5lIEtTX0NUUkFDSyAgIDB4MmYKKyNkZWZpbmUgS1NfUE9MQ1RMICAgMHgzMAorI2RlZmluZSBLU19SRUZDT0QgICAweDMxCisjZGVmaW5lIEtTX0lOVkFMWSAgIDB4MzIKKyNkZWZpbmUgS1NfSU5WQUxVICAgMHgzMworI2RlZmluZSBLU19JTlZBTFYgICAweDM0CisjZGVmaW5lIEtTX1VOVVNFWSAgIDB4MzUKKyNkZWZpbmUgS1NfVU5VU0VVICAgMHgzNgorI2RlZmluZSBLU19VTlVTRVYgICAweDM3CisjZGVmaW5lIEtTX1VTUlNBViAgIDB4MzgKKyNkZWZpbmUgS1NfVVNSRUFWICAgMHgzOQorI2RlZmluZSBLU19TSFMxQSAgICAweDNhCisjZGVmaW5lIEtTX1NIUzFCICAgIDB4M2IKKyNkZWZpbmUgS1NfU0hTMUMgICAgMHgzYworI2RlZmluZSBLU19DTURFICAgICAweDNkCisjZGVmaW5lIEtTX1ZTREVMICAgIDB4M2UKKyNkZWZpbmUgS1NfQ01ERiAgICAgMHgzZgorI2RlZmluZSBLU19HQU1NQTAgICAweDQwCisjZGVmaW5lIEtTX0dBTU1BMSAgIDB4NDEKKyNkZWZpbmUgS1NfR0FNTUEyICAgMHg0MgorI2RlZmluZSBLU19HQU1NQTMgICAweDQzCisjZGVmaW5lIEtTX0dBTU1BNCAgIDB4NDQKKyNkZWZpbmUgS1NfR0FNTUE1ICAgMHg0NQorI2RlZmluZSBLU19HQU1NQTYgICAweDQ2CisjZGVmaW5lIEtTX0dBTU1BNyAgIDB4NDcKKyNkZWZpbmUgS1NfR0FNTUE4ICAgMHg0OAorI2RlZmluZSBLU19HQU1NQTkgICAweDQ5CisjZGVmaW5lIEtTX0dBTU1BMTAgIDB4NGEKKyNkZWZpbmUgS1NfR0FNTUExMSAgMHg0YgorI2RlZmluZSBLU19HQU1NQTEyICAweDRjCisjZGVmaW5lIEtTX0dBTU1BMTMgIDB4NGQKKyNkZWZpbmUgS1NfR0FNTUExNCAgMHg0ZQorI2RlZmluZSBLU19HQU1NQTE1ICAweDRmCisjZGVmaW5lIEtTX0dBTU1BMTYgIDB4NTAKKyNkZWZpbmUgS1NfR0FNTUExNyAgMHg1MQorI2RlZmluZSBLU19HQU1NQTE4ICAweDUyCisjZGVmaW5lIEtTX0dBTU1BMTkgIDB4NTMKKyNkZWZpbmUgS1NfR0FNTUEyMCAgMHg1NAorI2RlZmluZSBLU19HQU1NQTIxICAweDU1CisjZGVmaW5lIEtTX0dBTU1BMjIgIDB4NTYKKyNkZWZpbmUgS1NfR0FNTUEyMyAgMHg1NworI2RlZmluZSBLU19HQU1NQTI0ICAweDU4CisjZGVmaW5lIEtTX0dBTU1BMjUgIDB4NTkKKyNkZWZpbmUgS1NfR0FNTUEyNiAgMHg1YQorI2RlZmluZSBLU19HQU1NQTI3ICAweDViCisjZGVmaW5lIEtTX0dBTU1BMjggIDB4NWMKKyNkZWZpbmUgS1NfR0FNTUEyOSAgMHg1ZAorI2RlZmluZSBLU19HQU1NQTMwICAweDVlCisjZGVmaW5lIEtTX0dBTU1BMzEgIDB4NWYKKyNkZWZpbmUgS1NfR0FNTUFEMCAgMHg2MAorI2RlZmluZSBLU19HQU1NQUQxICAweDYxCisjZGVmaW5lIEtTX0dBTU1BRDIgIDB4NjIKKyNkZWZpbmUgS1NfR0FNTUFEMyAgMHg2MworI2RlZmluZSBLU19HQU1NQUQ0ICAweDY0CisjZGVmaW5lIEtTX0dBTU1BRDUgIDB4NjUKKyNkZWZpbmUgS1NfR0FNTUFENiAgMHg2NgorI2RlZmluZSBLU19HQU1NQUQ3ICAweDY3CisjZGVmaW5lIEtTX0dBTU1BRDggIDB4NjgKKyNkZWZpbmUgS1NfR0FNTUFEOSAgMHg2OQorI2RlZmluZSBLU19HQU1NQUQxMCAweDZhCisjZGVmaW5lIEtTX0dBTU1BRDExIDB4NmIKKyNkZWZpbmUgS1NfR0FNTUFEMTIgMHg2YworI2RlZmluZSBLU19HQU1NQUQxMyAweDZkCisjZGVmaW5lIEtTX0dBTU1BRDE0IDB4NmUKKyNkZWZpbmUgS1NfR0FNTUFEMTUgMHg2ZgorI2RlZmluZSBLU19HQU1NQUQxNiAweDcwCisjZGVmaW5lIEtTX0dBTU1BRDE3IDB4NzEKKyNkZWZpbmUgS1NfR0FNTUFEMTggMHg3MgorI2RlZmluZSBLU19HQU1NQUQxOSAweDczCisjZGVmaW5lIEtTX0dBTU1BRDIwIDB4NzQKKyNkZWZpbmUgS1NfR0FNTUFEMjEgMHg3NQorI2RlZmluZSBLU19HQU1NQUQyMiAweDc2CisjZGVmaW5lIEtTX0dBTU1BRDIzIDB4NzcKKyNkZWZpbmUgS1NfR0FNTUFEMjQgMHg3OAorI2RlZmluZSBLU19HQU1NQUQyNSAweDc5CisjZGVmaW5lIEtTX0dBTU1BRDI2IDB4N2EKKyNkZWZpbmUgS1NfR0FNTUFEMjcgMHg3YgorI2RlZmluZSBLU19HQU1NQUQyOCAweDdjCisjZGVmaW5lIEtTX0dBTU1BRDI5IDB4N2QKKyNkZWZpbmUgS1NfR0FNTUFEMzAgMHg3ZQorI2RlZmluZSBLU19HQU1NQUQzMSAweDdmCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbWdhX2RldiA6IHJlcHJlc2VudHMgb25lIGtzMDEyNyBjaGlwLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IGFkanVzdCB7CisJaW50CWNvbnRyYXN0OworCWludAlicmlnaHQ7CisJaW50CWh1ZTsKKwlpbnQJdWdhaW47CisJaW50CXZnYWluOworfTsKKworc3RydWN0IGtzMDEyNyB7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKKwl1bnNpZ25lZCBjaGFyCWFkZHI7CisJaW50CQlmb3JtYXRfd2lkdGg7CisJaW50CQlmb3JtYXRfaGVpZ2h0OworCWludAkJY2FwX3dpZHRoOworCWludAkJY2FwX2hlaWdodDsKKwlpbnQJCW5vcm07CisJaW50CQlrc190eXBlOworCXU4IAkJcmVnc1syNTZdOworfTsKKworCitzdGF0aWMgaW50IGRlYnVnOyAvKiBpbnNtb2QgcGFyYW1ldGVyICovCisKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJEZWJ1ZyBvdXRwdXQiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIHU4IHJlZ19kZWZhdWx0c1s2NF07CisKKworCitzdGF0aWMgdm9pZCBpbml0X3JlZ19kZWZhdWx0cyh2b2lkKQoreworCXU4ICp0YWJsZSA9IHJlZ19kZWZhdWx0czsKKworCXRhYmxlW0tTX0NNREFdICAgICA9IDB4MmM7ICAvKiBWU0U9MCwgQ0NJUiA2MDEsIGF1dG9kZXRlY3Qgc3RhbmRhcmQgKi8KKwl0YWJsZVtLU19DTURCXSAgICAgPSAweDEyOyAgLyogVkFMSUdOPTAsIEFHQyBjb250cm9sIGFuZCBpbnB1dCAqLworCXRhYmxlW0tTX0NNRENdICAgICA9IDB4MDA7ICAvKiBUZXN0IG9wdGlvbnMgKi8KKwkvKiBjbG9jayAmIGlucHV0IHNlbGVjdCwgd3JpdGUgMSB0byBQT1JUQSAqLworCXRhYmxlW0tTX0NNRERdICAgICA9IDB4MDE7CisJdGFibGVbS1NfSEFWQl0gICAgID0gMHgwMDsgIC8qIEhBViBTdGFydCBDb250cm9sICovCisJdGFibGVbS1NfSEFWRV0gICAgID0gMHgwMDsgIC8qIEhBViBFbmQgQ29udHJvbCAqLworCXRhYmxlW0tTX0hTMUJdICAgICA9IDB4MTA7ICAvKiBIUzEgU3RhcnQgQ29udHJvbCAqLworCXRhYmxlW0tTX0hTMUVdICAgICA9IDB4MDA7ICAvKiBIUzEgRW5kIENvbnRyb2wgKi8KKwl0YWJsZVtLU19IUzJCXSAgICAgPSAweDAwOyAgLyogSFMyIFN0YXJ0IENvbnRyb2wgKi8KKwl0YWJsZVtLU19IUzJFXSAgICAgPSAweDAwOyAgLyogSFMyIEVuZCBDb250cm9sICovCisJdGFibGVbS1NfQUdDXSAgICAgID0gMHg1MzsgIC8qIE1hbnVhbCBzZXR0aW5nIGZvciBBR0MgKi8KKwl0YWJsZVtLU19IWFRSQV0gICAgPSAweDAwOyAgLyogRXh0cmEgQml0cyBmb3IgSEFWIGFuZCBIUzEvMiAqLworCXRhYmxlW0tTX0NERU1dICAgICA9IDB4MDA7ICAvKiBDaHJvbWEgRGVtb2R1bGF0aW9uIENvbnRyb2wgKi8KKwl0YWJsZVtLU19QT1JUQUJdICAgPSAweDBmOyAgLyogcG9ydCBCIGlzIGlucHV0LCBwb3J0IEEgb3V0cHV0IEdQUE9SVCAqLworCXRhYmxlW0tTX0xVTUFdICAgICA9IDB4MDE7ICAvKiBMdW1hIGNvbnRyb2wgKi8KKwl0YWJsZVtLU19DT05dICAgICAgPSAweDAwOyAgLyogQ29udHJhc3QgQ29udHJvbCAqLworCXRhYmxlW0tTX0JSVF0gICAgICA9IDB4MDA7ICAvKiBCcmlnaHRuZXNzIENvbnRyb2wgKi8KKwl0YWJsZVtLU19DSFJPTUFdICAgPSAweDJhOyAgLyogQ2hyb21hIGNvbnRyb2wgQSAqLworCXRhYmxlW0tTX0NIUk9NQl0gICA9IDB4OTA7ICAvKiBDaHJvbWEgY29udHJvbCBCICovCisJdGFibGVbS1NfREVNT0RdICAgID0gMHgwMDsgIC8qIENocm9tYSBEZW1vZHVsYXRpb24gQ29udHJvbCAmIFN0YXR1cyAqLworCXRhYmxlW0tTX1NBVF0gICAgICA9IDB4MDA7ICAvKiBDb2xvciBTYXR1cmF0aW9uIENvbnRyb2wqLworCXRhYmxlW0tTX0hVRV0gICAgICA9IDB4MDA7ICAvKiBIdWUgQ29udHJvbCAqLworCXRhYmxlW0tTX1ZFUlRJQV0gICA9IDB4MDA7ICAvKiBWZXJ0aWNhbCBQcm9jZXNzaW5nIENvbnRyb2wgQSAqLworCS8qIFZlcnRpY2FsIFByb2Nlc3NpbmcgQ29udHJvbCBCLCBsdW1hIDEgbGluZSBkZWxheWVkICovCisJdGFibGVbS1NfVkVSVElCXSAgID0gMHgxMjsKKwl0YWJsZVtLU19WRVJUSUNdICAgPSAweDBiOyAgLyogVmVydGljYWwgUHJvY2Vzc2luZyBDb250cm9sIEMgKi8KKwl0YWJsZVtLU19IU0NMTF0gICAgPSAweDAwOyAgLyogSG9yaXpvbnRhbCBTY2FsaW5nIFJhdGlvIExvdyAqLworCXRhYmxlW0tTX0hTQ0xIXSAgICA9IDB4MDA7ICAvKiBIb3Jpem9udGFsIFNjYWxpbmcgUmF0aW8gSGlnaCAqLworCXRhYmxlW0tTX1ZTQ0xMXSAgICA9IDB4MDA7ICAvKiBWZXJ0aWNhbCBTY2FsaW5nIFJhdGlvIExvdyAqLworCXRhYmxlW0tTX1ZTQ0xIXSAgICA9IDB4MDA7ICAvKiBWZXJ0aWNhbCBTY2FsaW5nIFJhdGlvIEhpZ2ggKi8KKwkvKiAxNiBiaXQgWUNiQ3IgNDoyOjIgb3V0cHV0OyBJIGNhbid0IG1ha2UgdGhlIGJ0ODY2IGxpa2UgOCBiaXQgL1NhbSAqLworCXRhYmxlW0tTX09GTVRBXSAgICA9IDB4MzA7CisJdGFibGVbS1NfT0ZNVEJdICAgID0gMHgwMDsgIC8qIE91dHB1dCBDb250cm9sIEIgKi8KKwkvKiBWQkkgRGVjb2RlciBDb250cm9sOyA0Yml0IGZtdDogYXZvaWQgWSBvdmVyZmxvdyAqLworCXRhYmxlW0tTX1ZCSUNUTF0gICA9IDB4NWQ7CisJdGFibGVbS1NfQ0NEQVQyXSAgID0gMHgwMDsgIC8qIFJlYWQgT25seSByZWdpc3RlciAqLworCXRhYmxlW0tTX0NDREFUMV0gICA9IDB4MDA7ICAvKiBSZWFkIE9ubHkgcmVnaXN0ZXIgKi8KKwl0YWJsZVtLU19WQklMMzBdICAgPSAweGE4OyAgLyogVkJJIGRhdGEgZGVjb2Rpbmcgb3B0aW9ucyAqLworCXRhYmxlW0tTX1ZCSUw3NF0gICA9IDB4YWE7ICAvKiBWQkkgZGF0YSBkZWNvZGluZyBvcHRpb25zICovCisJdGFibGVbS1NfVkJJTDExOF0gID0gMHgyYTsgIC8qIFZCSSBkYXRhIGRlY29kaW5nIG9wdGlvbnMgKi8KKwl0YWJsZVtLU19WQklMMTUxMl0gPSAweDAwOyAgLyogVkJJIGRhdGEgZGVjb2Rpbmcgb3B0aW9ucyAqLworCXRhYmxlW0tTX1RURlJBTV0gICA9IDB4MDA7ICAvKiBUZWxldGV4dCBmcmFtZSBhbGlnbm1lbnQgcGF0dGVybiAqLworCXRhYmxlW0tTX1RFU1RBXSAgICA9IDB4MDA7ICAvKiB0ZXN0IHJlZ2lzdGVyLCBzaG91bGRuJ3QgYmUgd3JpdHRlbiAqLworCXRhYmxlW0tTX1VWT0ZGSF0gICA9IDB4MDA7ICAvKiBVViBPZmZzZXQgQWRqdXN0bWVudCBIaWdoICovCisJdGFibGVbS1NfVVZPRkZMXSAgID0gMHgwMDsgIC8qIFVWIE9mZnNldCBBZGp1c3RtZW50IExvdyAqLworCXRhYmxlW0tTX1VHQUlOXSAgICA9IDB4MDA7ICAvKiBVIENvbXBvbmVudCBHYWluIEFkanVzdG1lbnQgKi8KKwl0YWJsZVtLU19WR0FJTl0gICAgPSAweDAwOyAgLyogViBDb21wb25lbnQgR2FpbiBBZGp1c3RtZW50ICovCisJdGFibGVbS1NfVkFWQl0gICAgID0gMHgwNzsgIC8qIFZBViBCZWdpbiAqLworCXRhYmxlW0tTX1ZBVkVdICAgICA9IDB4MDA7ICAvKiBWQVYgRW5kICovCisJdGFibGVbS1NfQ1RSQUNLXSAgID0gMHgwMDsgIC8qIENocm9tYSBUcmFja2luZyBDb250cm9sICovCisJdGFibGVbS1NfUE9MQ1RMXSAgID0gMHg0MTsgIC8qIFRpbWluZyBTaWduYWwgUG9sYXJpdHkgQ29udHJvbCAqLworCXRhYmxlW0tTX1JFRkNPRF0gICA9IDB4ODA7ICAvKiBSZWZlcmVuY2UgQ29kZSBJbnNlcnRpb24gQ29udHJvbCAqLworCXRhYmxlW0tTX0lOVkFMWV0gICA9IDB4MTA7ICAvKiBJbnZhbGlkIFkgQ29kZSAqLworCXRhYmxlW0tTX0lOVkFMVV0gICA9IDB4ODA7ICAvKiBJbnZhbGlkIFUgQ29kZSAqLworCXRhYmxlW0tTX0lOVkFMVl0gICA9IDB4ODA7ICAvKiBJbnZhbGlkIFYgQ29kZSAqLworCXRhYmxlW0tTX1VOVVNFWV0gICA9IDB4MTA7ICAvKiBVbnVzZWQgWSBDb2RlICovCisJdGFibGVbS1NfVU5VU0VVXSAgID0gMHg4MDsgIC8qIFVudXNlZCBVIENvZGUgKi8KKwl0YWJsZVtLU19VTlVTRVZdICAgPSAweDgwOyAgLyogVW51c2VkIFYgQ29kZSAqLworCXRhYmxlW0tTX1VTUlNBVl0gICA9IDB4MDA7ICAvKiByZXNlcnZlZCAqLworCXRhYmxlW0tTX1VTUkVBVl0gICA9IDB4MDA7ICAvKiByZXNlcnZlZCAqLworCXRhYmxlW0tTX1NIUzFBXSAgICA9IDB4MDA7ICAvKiBVc2VyIERlZmluZWQgU0hTMSBBICovCisJLyogVXNlciBEZWZpbmVkIFNIUzEgQiwgQUxUNjU2PTEgb24gMDEyN0IgKi8KKwl0YWJsZVtLU19TSFMxQl0gICAgPSAweDgwOworCXRhYmxlW0tTX1NIUzFDXSAgICA9IDB4MDA7ICAvKiBVc2VyIERlZmluZWQgU0hTMSBDICovCisJdGFibGVbS1NfQ01ERV0gICAgID0gMHgwMDsgIC8qIENvbW1hbmQgUmVnaXN0ZXIgRSAqLworCXRhYmxlW0tTX1ZTREVMXSAgICA9IDB4MDA7ICAvKiBWUyBEZWxheSBDb250cm9sICovCisJLyogQ29tbWFuZCBSZWdpc3RlciBGLCB1cGRhdGUgLWltbWVkaWF0ZWx5LSAqLworCS8qICh0aGVyZSBtaWdodCBjb21lIG5vIHZzeW5jKSovCisJdGFibGVbS1NfQ01ERl0gICAgID0gMHgwMjsKK30KKworCisvKiBXZSBuZWVkIHRvIG1hbnVhbGx5IHJlYWQgYmVjYXVzZSBvZiBhIGJ1ZyBpbiB0aGUgS1MwMTI3IGNoaXAuCisgKgorICogQW4gZXhwbGFuYXRpb24gZnJvbSBrYXlvcmtAbWFpbC51dGV4YXMuZWR1OgorICoKKyAqIER1cmluZyBJMkMgcmVhZHMsIHRoZSBLUzAxMjcgb25seSBzYW1wbGVzIGZvciBhIHN0b3AgY29uZGl0aW9uCisgKiBkdXJpbmcgdGhlIHBsYWNlIHdoZXJlIHRoZSBhY2tub2xlZGdlIGJpdCBzaG91bGQgYmUuIEFueSBzdGFuZGFyZAorICogSTJDIGltcGxlbWVudGF0aW9uIChjb3JyZWN0bHkpIHRocm93cyBpbiBhbm90aGVyIGNsb2NrIHRyYW5zaXRpb24KKyAqIGF0IHRoZSA5dGggYml0LCBhbmQgdGhlIEtTMDEyNyB3aWxsIG5vdCByZWNvZ25pemUgdGhlIHN0b3AgY29uZGl0aW9uCisgKiBhbmQgd2lsbCBjb250aW51ZSB0byBjbG9jayBvdXQgZGF0YS4KKyAqCisgKiBTbyB3ZSBoYXZlIHRvIGRvIHRoZSByZWFkIG91cnNlbGYuICBCaWcgZGVhbC4KKwkgICB3b3JrYXJvdW5kIGluIGkyYy1hbGdvLWJpdAorICovCisKKworc3RhdGljIHU4IGtzMDEyN19yZWFkKHN0cnVjdCBrczAxMjcgKmtzLCB1OCByZWcpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmMgPSBrcy0+Y2xpZW50OworCWNoYXIgdmFsID0gMDsKKwlzdHJ1Y3QgaTJjX21zZyBtc2dzW10gPSB7CisJCXtjLT5hZGRyLCAwLCBzaXplb2YocmVnKSwgJnJlZ30sCisJCXtjLT5hZGRyLCBJMkNfTV9SRCB8IEkyQ19NX05PX1JEX0FDSywgc2l6ZW9mKHZhbCksICZ2YWx9fTsKKwlpbnQgcmV0OworCisJcmV0ID0gaTJjX3RyYW5zZmVyKGMtPmFkYXB0ZXIsIG1zZ3MsIEFSUkFZX1NJWkUobXNncykpOworCWlmIChyZXQgIT0gQVJSQVlfU0laRShtc2dzKSkKKwkJZHByaW50aygia3MwMTI3X3dyaXRlIGVycm9yXG4iKTsKKworCXJldHVybiB2YWw7Cit9CisKKworc3RhdGljIHZvaWQga3MwMTI3X3dyaXRlKHN0cnVjdCBrczAxMjcgKmtzLCB1OCByZWcsIHU4IHZhbCkKK3sKKwljaGFyIG1zZ1tdID0ge3JlZywgdmFsfTsKKworCWlmIChpMmNfbWFzdGVyX3NlbmQoa3MtPmNsaWVudCwgbXNnLCBzaXplb2YobXNnKSkgIT0gc2l6ZW9mKG1zZykpCisJCWRwcmludGsoImtzMDEyN193cml0ZSBlcnJvclxuIik7CisKKwlrcy0+cmVnc1tyZWddID0gdmFsOworfQorCisKKy8qIGdlbmVyaWMgYml0LXR3aWRkbGluZyAqLworc3RhdGljIHZvaWQga3MwMTI3X2FuZF9vcihzdHJ1Y3Qga3MwMTI3ICprcywgdTggcmVnLCB1OCBhbmRfdiwgdTggb3JfdikKK3sKKwl1OCB2YWwgPSBrcy0+cmVnc1tyZWddOworCXZhbCA9ICh2YWwgJiBhbmRfdikgfCBvcl92OworCWtzMDEyN193cml0ZShrcywgcmVnLCB2YWwpOworfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoga3MwMTI3IHByaXZhdGUgYXBpCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQga3MwMTI3X3Jlc2V0KHN0cnVjdCBrczAxMjcqIGtzKQoreworCWludCBpOworCXU4ICp0YWJsZSA9IHJlZ19kZWZhdWx0czsKKworCWtzLT5rc190eXBlID0gS1NfVFlQRV9VTktOT1dOOworCisJZHByaW50aygia3MwMTI3OiByZXNldFxuIik7CisJbXNsZWVwKDEpOworCisJLyogaW5pdGlhbGl6ZSBhbGwgcmVnaXN0ZXJzIHRvIGtub3duIHZhbHVlcyAqLworCS8qIChleGNlcHQgU1RBVCwgMHgyMSwgMHgyMiwgVEVTVCBhbmQgMHgzOCwweDM5KSAqLworCisJZm9yKGkgPSAxOyBpIDwgMzM7IGkrKykKKwkJa3MwMTI3X3dyaXRlKGtzLCBpLCB0YWJsZVtpXSk7CisKKwlmb3IoaSA9IDM1OyBpIDwgNDA7IGkrKykKKwkJa3MwMTI3X3dyaXRlKGtzLCBpLCB0YWJsZVtpXSk7CisKKwlmb3IoaSA9IDQxOyBpIDwgNTY7IGkrKykKKwkJa3MwMTI3X3dyaXRlKGtzLCBpLCB0YWJsZVtpXSk7CisKKwlmb3IoaSA9IDU4OyBpIDwgNjQ7IGkrKykKKwkJa3MwMTI3X3dyaXRlKGtzLCBpLCB0YWJsZVtpXSk7CisKKworCWlmICgoa3MwMTI3X3JlYWQoa3MsIEtTX1NUQVQpICYgMHg4MCkgPT0gMCkgeworCQlrcy0+a3NfdHlwZSA9IEtTX1RZUEVfMDEyMlM7CisJCWRwcmludGsoImtzMDEyNzoga3MwMTIycyBGb3VuZFxuIik7CisJCXJldHVybjsKKwl9CisKKwlzd2l0Y2goa3MwMTI3X3JlYWQoa3MsIEtTX0NNREUpICYgMHgwZikgeworCisJY2FzZSAwOgorCQlrcy0+a3NfdHlwZSA9IEtTX1RZUEVfMDEyNzsKKwkJZHByaW50aygia3MwMTI3OiBrczAxMjcgZm91bmRcbiIpOworCQlicmVhazsKKworCWNhc2UgOToKKwkJa3MtPmtzX3R5cGUgPSBLU19UWVBFXzAxMjdCOworCQlkcHJpbnRrKCJrczAxMjc6IGtzMDEyN0IgUmV2aXNpb24gQSBmb3VuZFxuIik7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZHByaW50aygia3MwMTI3OiB1bmtub3duIHJldmlzaW9uXG4iKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgaW50IGtzMDEyN19jb21tYW5kKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkgIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3Qga3MwMTI3ICprcyA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJaW50CQkqaWFyZyA9IChpbnQqKWFyZzsKKworCWludAkJc3RhdHVzOworCisJaWYgKCFrcykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlzd2l0Y2ggKGNtZCkgeworCisJY2FzZSBERUNPREVSX0lOSVQ6CisJCWRwcmludGsoImtzMDEyNzogY29tbWFuZCBERUNPREVSX0lOSVRcbiIpOworCQlrczAxMjdfcmVzZXQoa3MpOworCQlicmVhazsKKworCWNhc2UgREVDT0RFUl9TRVRfSU5QVVQ6CisJCXN3aXRjaCgqaWFyZykgeworCQljYXNlIEtTX0lOUFVUX0NPTVBPU0lURV8xOgorCQljYXNlIEtTX0lOUFVUX0NPTVBPU0lURV8yOgorCQljYXNlIEtTX0lOUFVUX0NPTVBPU0lURV8zOgorCQljYXNlIEtTX0lOUFVUX0NPTVBPU0lURV80OgorCQljYXNlIEtTX0lOUFVUX0NPTVBPU0lURV81OgorCQljYXNlIEtTX0lOUFVUX0NPTVBPU0lURV82OgorCQkJZHByaW50aygia3MwMTI3OiBjb21tYW5kIERFQ09ERVJfU0VUX0lOUFVUICVkOiAiCisJCQkJIkNvbXBvc2l0ZVxuIiwgKmlhcmcpOworCQkJLyogYXV0b2RldGVjdCA1MC82MCBIeiAqLworCQkJa3MwMTI3X2FuZF9vcihrcywgS1NfQ01EQSwgICAweGZjLCAweDAwKTsKKwkJCS8qIFZTRT0wICovCisJCQlrczAxMjdfYW5kX29yKGtzLCBLU19DTURBLCAgIH4weDQwLCAweDAwKTsKKwkJCS8qIHNldCBpbnB1dCBsaW5lICovCisJCQlrczAxMjdfYW5kX29yKGtzLCBLU19DTURCLCAgIDB4YjAsICppYXJnKTsKKwkJCS8qIG5vbi1mcmVlcnVubmluZyBtb2RlICovCisJCQlrczAxMjdfYW5kX29yKGtzLCBLU19DTURDLCAgIDB4NzAsIDB4MGEpOworCQkJLyogYW5hbG9nIGlucHV0ICovCisJCQlrczAxMjdfYW5kX29yKGtzLCBLU19DTURELCAgIDB4MDMsIDB4MDApOworCQkJLyogZW5hYmxlIGNocm9tYSBkZW1vZHVsYXRpb24gKi8KKwkJCWtzMDEyN19hbmRfb3Ioa3MsIEtTX0NUUkFDSywgMHhjZiwgMHgwMCk7CisJCQkvKiBjaHJvbWEgdHJhcCwgSFlCV1I9MSAqLworCQkJa3MwMTI3X2FuZF9vcihrcywgS1NfTFVNQSwgICAweDAwLAorCQkJCSAgICAgICAocmVnX2RlZmF1bHRzW0tTX0xVTUFdKXwweDBjKTsKKwkJCS8qIHNjYWxlciBmdWxsYncsIGx1bWEgY29tYiBvZmYgKi8KKwkJCWtzMDEyN19hbmRfb3Ioa3MsIEtTX1ZFUlRJQSwgMHgwOCwgMHg4MSk7CisJCQkvKiBtYW51YWwgY2hyb21hIGNvbWIgLjI1IC41IC4yNSAqLworCQkJa3MwMTI3X2FuZF9vcihrcywgS1NfVkVSVElDLCAweDBmLCAweDkwKTsKKworCQkJLyogY2hyb21hIHBhdGggZGVsYXkgKi8KKwkJCWtzMDEyN19hbmRfb3Ioa3MsIEtTX0NIUk9NQiwgMHgwZiwgMHg5MCk7CisKKwkJCWtzMDEyN193cml0ZShrcywgS1NfVUdBSU4sIHJlZ19kZWZhdWx0c1tLU19VR0FJTl0pOworCQkJa3MwMTI3X3dyaXRlKGtzLCBLU19WR0FJTiwgcmVnX2RlZmF1bHRzW0tTX1ZHQUlOXSk7CisJCQlrczAxMjdfd3JpdGUoa3MsIEtTX1VWT0ZGSCwgcmVnX2RlZmF1bHRzW0tTX1VWT0ZGSF0pOworCQkJa3MwMTI3X3dyaXRlKGtzLCBLU19VVk9GRkwsIHJlZ19kZWZhdWx0c1tLU19VVk9GRkxdKTsKKwkJCWJyZWFrOworCisJCWNhc2UgS1NfSU5QVVRfU1ZJREVPXzE6CisJCWNhc2UgS1NfSU5QVVRfU1ZJREVPXzI6CisJCWNhc2UgS1NfSU5QVVRfU1ZJREVPXzM6CisJCQlkcHJpbnRrKCJrczAxMjc6IGNvbW1hbmQgREVDT0RFUl9TRVRfSU5QVVQgJWQ6ICIKKwkJCQkiUy1WaWRlb1xuIiwgKmlhcmcpOworCQkJLyogYXV0b2RldGVjdCA1MC82MCBIeiAqLworCQkJa3MwMTI3X2FuZF9vcihrcywgS1NfQ01EQSwgICAweGZjLCAweDAwKTsKKwkJCS8qIFZTRT0wICovCisJCQlrczAxMjdfYW5kX29yKGtzLCBLU19DTURBLCAgIH4weDQwLCAweDAwKTsKKwkJCS8qIHNldCBpbnB1dCBsaW5lICovCisJCQlrczAxMjdfYW5kX29yKGtzLCBLU19DTURCLCAgIDB4YjAsICppYXJnKTsKKwkJCS8qIG5vbi1mcmVlcnVubmluZyBtb2RlICovCisJCQlrczAxMjdfYW5kX29yKGtzLCBLU19DTURDLCAgIDB4NzAsIDB4MGEpOworCQkJLyogYW5hbG9nIGlucHV0ICovCisJCQlrczAxMjdfYW5kX29yKGtzLCBLU19DTURELCAgIDB4MDMsIDB4MDApOworCQkJLyogZW5hYmxlIGNocm9tYSBkZW1vZHVsYXRpb24gKi8KKwkJCWtzMDEyN19hbmRfb3Ioa3MsIEtTX0NUUkFDSywgMHhjZiwgMHgwMCk7CisJCQlrczAxMjdfYW5kX29yKGtzLCBLU19MVU1BLCAweDAwLAorCQkJCSAgICAgICByZWdfZGVmYXVsdHNbS1NfTFVNQV0pOworCQkJLyogZGlzYWJsZSBsdW1hIGNvbWIgKi8KKwkJCWtzMDEyN19hbmRfb3Ioa3MsIEtTX1ZFUlRJQSwgMHgwOCwKKwkJCQkgICAgICAgKHJlZ19kZWZhdWx0c1tLU19WRVJUSUFdJjB4ZjApfDB4MDEpOworCQkJa3MwMTI3X2FuZF9vcihrcywgS1NfVkVSVElDLCAweDBmLAorCQkJCSAgICAgICByZWdfZGVmYXVsdHNbS1NfVkVSVElDXSYweGYwKTsKKworCQkJa3MwMTI3X2FuZF9vcihrcywgS1NfQ0hST01CLCAweDBmLAorCQkJCSAgICAgICByZWdfZGVmYXVsdHNbS1NfQ0hST01CXSYweGYwKTsKKworCQkJa3MwMTI3X3dyaXRlKGtzLCBLU19VR0FJTiwgcmVnX2RlZmF1bHRzW0tTX1VHQUlOXSk7CisJCQlrczAxMjdfd3JpdGUoa3MsIEtTX1ZHQUlOLCByZWdfZGVmYXVsdHNbS1NfVkdBSU5dKTsKKwkJCWtzMDEyN193cml0ZShrcywgS1NfVVZPRkZILCByZWdfZGVmYXVsdHNbS1NfVVZPRkZIXSk7CisJCQlrczAxMjdfd3JpdGUoa3MsIEtTX1VWT0ZGTCwgcmVnX2RlZmF1bHRzW0tTX1VWT0ZGTF0pOworCQkJYnJlYWs7CisKKwkJY2FzZSBLU19JTlBVVF9ZVVY2NTY6CisJCQlkcHJpbnRrKCJrczAxMjc6IGNvbW1hbmQgREVDT0RFUl9TRVRfSU5QVVQgMTU6ICIKKwkJCQkiWVVWNjU2XG4iKTsKKwkJCWlmIChrcy0+bm9ybSA9PSBWSURFT19NT0RFX05UU0MgfHwKKwkJCSAgICBrcy0+bm9ybSA9PSBLU19TVERfUEFMX00pCisJCQkJLyogZm9yY2UgNjAgSHogKi8KKwkJCQlrczAxMjdfYW5kX29yKGtzLCBLU19DTURBLCAgIDB4ZmMsIDB4MDMpOworCQkJZWxzZQorCQkJCS8qIGZvcmNlIDUwIEh6ICovCisJCQkJa3MwMTI3X2FuZF9vcihrcywgS1NfQ01EQSwgICAweGZjLCAweDAyKTsKKworCQkJa3MwMTI3X2FuZF9vcihrcywgS1NfQ01EQSwgICAweGZmLCAweDQwKTsgLyogVlNFPTEgKi8KKwkJCS8qIHNldCBpbnB1dCBsaW5lIGFuZCBWQUxJR04gKi8KKwkJCWtzMDEyN19hbmRfb3Ioa3MsIEtTX0NNREIsICAgMHhiMCwgKCppYXJnIHwgMHg0MCkpOworCQkJLyogZnJlZXJ1bm5pbmcgbW9kZSwgKi8KKwkJCS8qIFRTVEdFTiA9IDEgVFNUR0ZSPTExIFRTVEdQSD0wIFRTVEdQSz0wICBWTUVNPTEqLworCQkJa3MwMTI3X2FuZF9vcihrcywgS1NfQ01EQywgICAweDcwLCAweDg3KTsKKwkJCS8qIGRpZ2l0YWwgaW5wdXQsIFNZTkRJUiA9IDAgSU5QU0w9MDEgQ0xLRElSPTAgRUFWPTAgKi8KKwkJCWtzMDEyN19hbmRfb3Ioa3MsIEtTX0NNREQsICAgMHgwMywgMHgwOCk7CisJCQkvKiBkaXNhYmxlIGNocm9tYSBkZW1vZHVsYXRpb24gKi8KKwkJCWtzMDEyN19hbmRfb3Ioa3MsIEtTX0NUUkFDSywgMHhjZiwgMHgzMCk7CisJCQkvKiBIWVBLID0wMSBDVFJBUCA9IDAgSFlCV1I9MCBQRUQ9MSBSR0JIPTEgVU5JVD0xICovCisJCQlrczAxMjdfYW5kX29yKGtzLCBLU19MVU1BLCAgIDB4MDAsIDB4NzEpOworCQkJa3MwMTI3X2FuZF9vcihrcywgS1NfVkVSVElDLCAweDBmLAorCQkJCSAgICAgICByZWdfZGVmYXVsdHNbS1NfVkVSVElDXSYweGYwKTsKKworCQkJLyogc2NhbGVyIGZ1bGxidywgbHVtYSBjb21iIG9mZiAqLworCQkJa3MwMTI3X2FuZF9vcihrcywgS1NfVkVSVElBLCAweDA4LCAweDgxKTsKKworCQkJa3MwMTI3X2FuZF9vcihrcywgS1NfQ0hST01CLCAweDBmLAorCQkJCSAgICAgICByZWdfZGVmYXVsdHNbS1NfQ0hST01CXSYweGYwKTsKKworCQkJa3MwMTI3X2FuZF9vcihrcywgS1NfQ09OLCAweDAwLCAweDAwKTsKKwkJCWtzMDEyN19hbmRfb3Ioa3MsIEtTX0JSVCwgMHgwMCwgMzIpOwkvKiBzcGVjOiAzNCAqLworCQkJCS8qIHNwZWM6IDIyOSAoZTUpICovCisJCQlrczAxMjdfYW5kX29yKGtzLCBLU19TQVQsIDB4MDAsIDB4ZTgpOworCQkJa3MwMTI3X2FuZF9vcihrcywgS1NfSFVFLCAweDAwLCAwKTsKKworCQkJa3MwMTI3X2FuZF9vcihrcywgS1NfVUdBSU4sIDB4MDAsIDIzOCk7CisJCQlrczAxMjdfYW5kX29yKGtzLCBLU19WR0FJTiwgMHgwMCwgMHgwMCk7CisKKwkJCS8qVU9GRjoweDMwLCBWT0ZGOjB4MzAsIFRTVENHTj0xICovCisJCQlrczAxMjdfYW5kX29yKGtzLCBLU19VVk9GRkgsIDB4MDAsIDB4NGYpOworCQkJa3MwMTI3X2FuZF9vcihrcywgS1NfVVZPRkZMLCAweDAwLCAweDAwKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlkcHJpbnRrKCJrczAxMjc6IGNvbW1hbmQgREVDT0RFUl9TRVRfSU5QVVQ6ICIKKwkJCQkiVW5rbm93biBpbnB1dCAlZFxuIiwgKmlhcmcpOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBoYWNrOiBDRE1MUEYgc29tZXRpbWVzIHNwb250YW5lb3VzbHkgc3dpdGNoZXMgb247ICovCisJCS8qIGZvcmNlIGJhY2sgb2ZmICovCisJCWtzMDEyN193cml0ZShrcywgS1NfREVNT0QsIHJlZ19kZWZhdWx0c1tLU19ERU1PRF0pOworCQlicmVhazsKKworCWNhc2UgREVDT0RFUl9TRVRfT1VUUFVUOgorCQlzd2l0Y2goKmlhcmcpIHsKKwkJY2FzZSBLU19PVVRQVVRfWVVWNjU2RToKKwkJCWRwcmludGsoImtzMDEyNzogY29tbWFuZCBERUNPREVSX1NFVF9PVVRQVVQ6ICIKKwkJCQkiT1VUUFVUX1lVVjY1NkUgKE1pc3NpbmcpXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQkJYnJlYWs7CisKKwkJY2FzZSBLU19PVVRQVVRfRVhWOgorCQkJZHByaW50aygia3MwMTI3OiBjb21tYW5kIERFQ09ERVJfU0VUX09VVFBVVDogIgorCQkJCSJPVVRQVVRfRVhWXG4iKTsKKwkJCWtzMDEyN19hbmRfb3Ioa3MsIEtTX09GTVRBLCAweGYwLCAweDA5KTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCisJY2FzZSBERUNPREVSX1NFVF9OT1JNOiAvL3NhbSBUaGlzIGJsb2NrIG1peGVzIG9sZCBhbmQgbmV3IG5vcm0gbmFtZXMuLi4KKwkJLyogU2V0IHRvIGF1dG9tYXRpYyBTRUNBTS9Gc2MgbW9kZSAqLworCQlrczAxMjdfYW5kX29yKGtzLCBLU19ERU1PRCwgMHhmMCwgMHgwMCk7CisKKwkJa3MtPm5vcm0gPSAqaWFyZzsKKwkJc3dpdGNoKCppYXJnKQorCQl7CisJCS8qIHRoaXMgaXMgdW50ZXN0ZWQgISEgKi8KKwkJLyogSXQganVzdCBkZXRlY3RzIFBBTF9OL05UU0NfTSAobm8gc3BlY2lhbCBmcmVxdWVuY2llcykgKi8KKwkJLyogQW5kIHlvdSBoYXZlIHRvIHNldCB0aGUgc3RhbmRhcmQgYSBzZWNvbmQgdGltZSBhZnRlcndhcmRzICovCisJCWNhc2UgVklERU9fTU9ERV9BVVRPOgorCQkJZHByaW50aygia3MwMTI3OiBjb21tYW5kIERFQ09ERVJfU0VUX05PUk06IEFVVE9cbiIpOworCisJCQkvKiBUaGUgY2hpcCBkZXRlcm1pbmVzIHRoZSBmb3JtYXQgKi8KKwkJCS8qIGJhc2VkIG9uIHRoZSBjdXJyZW50IGZpZWxkIHJhdGUgKi8KKwkJCWtzMDEyN19hbmRfb3Ioa3MsIEtTX0NNREEsICAgMHhmYywgMHgwMCk7CisJCQlrczAxMjdfYW5kX29yKGtzLCBLU19DSFJPTUEsIDB4OWYsIDB4MjApOworCQkJLyogVGhpcyBpcyB3cm9uZyBmb3IgUEFMICEgQXMgSSBzYWlkLCAqLworCQkJLyogeW91IG5lZWQgdG8gc2V0IHRoZSBzdGFuZGFyZCBvbmNlIGFnYWluICEhICovCisJCQlrcy0+Zm9ybWF0X2hlaWdodCA9IDI0MDsKKwkJCWtzLT5mb3JtYXRfd2lkdGggPSA3MDQ7CisJCQlicmVhazsKKworCQljYXNlIFZJREVPX01PREVfTlRTQzoKKwkJCWRwcmludGsoImtzMDEyNzogY29tbWFuZCBERUNPREVSX1NFVF9OT1JNOiBOVFNDX01cbiIpOworCQkJa3MwMTI3X2FuZF9vcihrcywgS1NfQ0hST01BLCAweDlmLCAweDIwKTsKKwkJCWtzLT5mb3JtYXRfaGVpZ2h0ID0gMjQwOworCQkJa3MtPmZvcm1hdF93aWR0aCA9IDcwNDsKKwkJCWJyZWFrOworCisJCWNhc2UgS1NfU1REX05UU0NfTjoKKwkJCWRwcmludGsoImtzMDEyNzogY29tbWFuZCBLUzAxMjdfU0VUX1NUQU5EQVJEOiAiCisJCQkJIk5UU0NfTiAoZml4bWUpXG4iKTsKKwkJCWtzMDEyN19hbmRfb3Ioa3MsIEtTX0NIUk9NQSwgMHg5ZiwgMHg0MCk7CisJCQlrcy0+Zm9ybWF0X2hlaWdodCA9IDI0MDsKKwkJCWtzLT5mb3JtYXRfd2lkdGggPSA3MDQ7CisJCQlicmVhazsKKworCQljYXNlIFZJREVPX01PREVfUEFMOgorCQkJZHByaW50aygia3MwMTI3OiBjb21tYW5kIERFQ09ERVJfU0VUX05PUk06IFBBTF9OXG4iKTsKKwkJCWtzMDEyN19hbmRfb3Ioa3MsIEtTX0NIUk9NQSwgMHg5ZiwgMHgyMCk7CisJCQlrcy0+Zm9ybWF0X2hlaWdodCA9IDI5MDsKKwkJCWtzLT5mb3JtYXRfd2lkdGggPSA3MDQ7CisJCQlicmVhazsKKworCQljYXNlIEtTX1NURF9QQUxfTToKKwkJCWRwcmludGsoImtzMDEyNzogY29tbWFuZCBLUzAxMjdfU0VUX1NUQU5EQVJEOiAiCisJCQkJIlBBTF9NIChmaXhtZSlcbiIpOworCQkJa3MwMTI3X2FuZF9vcihrcywgS1NfQ0hST01BLCAweDlmLCAweDQwKTsKKwkJCWtzLT5mb3JtYXRfaGVpZ2h0ID0gMjkwOworCQkJa3MtPmZvcm1hdF93aWR0aCA9IDcwNDsKKwkJCWJyZWFrOworCisJCWNhc2UgVklERU9fTU9ERV9TRUNBTToKKwkJCWRwcmludGsoImtzMDEyNzogY29tbWFuZCBLUzAxMjdfU0VUX1NUQU5EQVJEOiAiCisJCQkJIlNFQ0FNXG4iKTsKKwkJCWtzLT5mb3JtYXRfaGVpZ2h0ID0gMjkwOworCQkJa3MtPmZvcm1hdF93aWR0aCA9IDcwNDsKKworCQkJLyogc2V0IHRvIHNlY2FtIGF1dG9kZXRlY3Rpb24gKi8KKwkJCWtzMDEyN19hbmRfb3Ioa3MsIEtTX0NIUk9NQSwgMHhkZiwgMHgyMCk7CisJCQlrczAxMjdfYW5kX29yKGtzLCBLU19ERU1PRCwgMHhmMCwgMHgwMCk7CisJCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUoSFovMTArMSk7CisKKwkJCS8qIGRpZCBpdCBhdXRvZGV0ZWN0PyAqLworCQkJaWYgKGtzMDEyN19yZWFkKGtzLCBLU19ERU1PRCkgJiAweDQwKQorCQkJCWJyZWFrOworCisJCQkvKiBmb3JjZSB0byBzZWNhbSBtb2RlICovCisJCQlrczAxMjdfYW5kX29yKGtzLCBLU19ERU1PRCwgMHhmMCwgMHgwZik7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJZHByaW50aygia3MwMTI3OiBjb21tYW5kIERFQ09ERVJfU0VUX05PUk06ICIKKwkJCQkiVW5rbm93biBub3JtICVkXG4iLCAqaWFyZyk7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKworCWNhc2UgREVDT0RFUl9TRVRfUElDVFVSRToKKwkJZHByaW50aygia3MwMTI3OiBjb21tYW5kIERFQ09ERVJfU0VUX1BJQ1RVUkUgIgorCQkJIm5vdCB5ZXQgc3VwcG9ydGVkIChmaXhtZSlcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKworCS8vc2FtIHRvZG86IEtTMDEyN19TRVRfQlJJR0hUTkVTUzogTWVyZ2UgaW50byBERUNPREVSX1NFVF9QSUNUVVJFCisJLy9zYW0gdG9kbzogS1MwMTI3X1NFVF9DT05UUkFTVDogTWVyZ2UgaW50byBERUNPREVSX1NFVF9QSUNUVVJFCisJLy9zYW0gdG9kbzogS1MwMTI3X1NFVF9IVUU6IE1lcmdlIGludG8gREVDT0RFUl9TRVRfUElDVFVSRT8KKwkvL3NhbSB0b2RvOiBLUzAxMjdfU0VUX1NBVFVSQVRJT046IE1lcmdlIGludG8gREVDT0RFUl9TRVRfUElDVFVSRQorCS8vc2FtIHRvZG86IEtTMDEyN19TRVRfQUdDX01PREU6CisJLy9zYW0gdG9kbzogS1MwMTI3X1NFVF9BR0M6CisJLy9zYW0gdG9kbzogS1MwMTI3X1NFVF9DSFJPTUFfTU9ERToKKwkvL3NhbSB0b2RvOiBLUzAxMjdfU0VUX1BJWENMS19NT0RFOgorCS8vc2FtIHRvZG86IEtTMDEyN19TRVRfR0FNTUFfTU9ERToKKwkvL3NhbSB0b2RvOiBLUzAxMjdfU0VUX1VHQUlOOgorCS8vc2FtIHRvZG86IEtTMDEyN19TRVRfVkdBSU46CisJLy9zYW0gdG9kbzogS1MwMTI3X1NFVF9JTlZBTFk6CisJLy9zYW0gdG9kbzogS1MwMTI3X1NFVF9JTlZBTFU6CisJLy9zYW0gdG9kbzogS1MwMTI3X1NFVF9JTlZBTFY6CisJLy9zYW0gdG9kbzogS1MwMTI3X1NFVF9VTlVTRVk6CisJLy9zYW0gdG9kbzogS1MwMTI3X1NFVF9VTlVTRVU6CisJLy9zYW0gdG9kbzogS1MwMTI3X1NFVF9VTlVTRVY6CisJLy9zYW0gdG9kbzogS1MwMTI3X1NFVF9WU0FMSUdOX01PREU6CisKKwljYXNlIERFQ09ERVJfRU5BQkxFX09VVFBVVDoKKwl7CisKKwkJaW50ICppYXJnID0gYXJnOworCQlpbnQgZW5hYmxlID0gKCppYXJnICE9IDApOworCQkJaWYgKGVuYWJsZSkgeworCQkJCWRwcmludGsoImtzMDEyNzogY29tbWFuZCAiCisJCQkJCSJERUNPREVSX0VOQUJMRV9PVVRQVVQgb24gIgorCQkJCQkiKCVkKVxuIiwgZW5hYmxlKTsKKwkJCQkvKiBBbGwgb3V0cHV0IHBpbnMgb24gKi8KKwkJCQlrczAxMjdfYW5kX29yKGtzLCBLU19PRk1UQSwgMHhjZiwgMHgzMCk7CisJCQkJLyogT2JleSB0aGUgT0VOIHBpbiAqLworCQkJCWtzMDEyN19hbmRfb3Ioa3MsIEtTX0NERU0sIDB4N2YsIDB4MDApOworCQkJfSBlbHNlIHsKKwkJCQlkcHJpbnRrKCJrczAxMjc6IGNvbW1hbmQgIgorCQkJCQkiREVDT0RFUl9FTkFCTEVfT1VUUFVUIG9mZiAiCisJCQkJCSIoJWQpXG4iLCBlbmFibGUpOworCQkJCS8qIFZpZGVvIG91dHB1dCBwaW5zIG9mZiAqLworCQkJCWtzMDEyN19hbmRfb3Ioa3MsIEtTX09GTVRBLCAweGNmLCAweDAwKTsKKwkJCQkvKiBJZ25vcmUgdGhlIE9FTiBwaW4gKi8KKwkJCQlrczAxMjdfYW5kX29yKGtzLCBLU19DREVNLCAweDdmLCAweDgwKTsKKwkJCX0KKwl9CisJCWJyZWFrOworCisJLy9zYW0gdG9kbzogS1MwMTI3X1NFVF9PVVRQVVRfTU9ERToKKwkvL3NhbSB0b2RvOiBLUzAxMjdfU0VUX1dJRFRIOgorCS8vc2FtIHRvZG86IEtTMDEyN19TRVRfSEVJR0hUOgorCS8vc2FtIHRvZG86IEtTMDEyN19TRVRfSFNDQUxFOgorCisJY2FzZSBERUNPREVSX0dFVF9TVEFUVVM6CisJCWRwcmludGsoImtzMDEyNzogY29tbWFuZCBERUNPREVSX0dFVF9TVEFUVVNcbiIpOworCQkqaWFyZyA9IDA7CisJCXN0YXR1cyA9IGtzMDEyN19yZWFkKGtzLCBLU19TVEFUKTsKKwkJaWYgKCEoc3RhdHVzICYgMHgyMCkpCQkgLyogTk9WSUQgbm90IHNldCAqLworCQkJKmlhcmcgPSAoKmlhcmcgJiBERUNPREVSX1NUQVRVU19HT09EKTsKKwkJaWYgKChzdGF0dXMgJiAweDAxKSkJCSAgICAgIC8qIENMT0NLIHNldCAqLworCQkJKmlhcmcgPSAoKmlhcmcgJiBERUNPREVSX1NUQVRVU19DT0xPUik7CisJCWlmICgoc3RhdHVzICYgMHgwOCkpCQkgICAvKiBQQUxERVQgc2V0ICovCisJCQkqaWFyZyA9ICgqaWFyZyAmIERFQ09ERVJfU1RBVFVTX1BBTCk7CisJCWVsc2UKKwkJCSppYXJnID0gKCppYXJnICYgREVDT0RFUl9TVEFUVVNfTlRTQyk7CisJCWJyZWFrOworCisJLy9DYXRjaCBhbnkgdW5rbm93biBjb21tYW5kCisJZGVmYXVsdDoKKwkJZHByaW50aygia3MwMTI3OiBjb21tYW5kIHVua25vd246ICUwNFhcbiIsIGNtZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworCisKKworc3RhdGljIGludCBrczAxMjdfcHJvYmUoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKTsKK3N0YXRpYyBpbnQga3MwMTI3X2RldGFjaChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKK3N0YXRpYyBpbnQga3MwMTI3X2NvbW1hbmQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCSAgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKTsKKworCisKKy8qIEFkZHJlc3NlcyB0byBzY2FuICovCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0ge0kyQ19LUzAxMjdfQURET04+PjEsCisJCQkJICAgICAgIEkyQ19LUzAxMjdfT05CT0FSRD4+MSwgSTJDX0NMSUVOVF9FTkR9Oworc3RhdGljIHVuc2lnbmVkIHNob3J0IHByb2JlWzJdID0Je0kyQ19DTElFTlRfRU5ELCBJMkNfQ0xJRU5UX0VORH07CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgaWdub3JlWzJdID0gCXtJMkNfQ0xJRU5UX0VORCwgSTJDX0NMSUVOVF9FTkR9Oworc3RhdGljIHN0cnVjdCBpMmNfY2xpZW50X2FkZHJlc3NfZGF0YSBhZGRyX2RhdGEgPSB7CisJbm9ybWFsX2kyYywKKwlwcm9iZSwKKwlpZ25vcmUsCit9OworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgaTJjX2RyaXZlcl9rczAxMjcgPSB7CisJLmRyaXZlci5uYW1lID0gImtzMDEyNyIsCisJLmlkICAgICAgICAgICAgID0gSTJDX0RSSVZFUklEX0tTMDEyNywKKwkuYXR0YWNoX2FkYXB0ZXIgPSBrczAxMjdfcHJvYmUsCisJLmRldGFjaF9jbGllbnQgID0ga3MwMTI3X2RldGFjaCwKKwkuY29tbWFuZCAgICAgICAgPSBrczAxMjdfY29tbWFuZAorfTsKKworc3RhdGljIHN0cnVjdCBpMmNfY2xpZW50IGtzMDEyN19jbGllbnRfdG1wbCA9Cit7CisJLm5hbWUgPSAiKGtzMDEyNyB1bnNldCkiLAorCS5hZGRyID0gMCwKKwkuYWRhcHRlciA9IE5VTEwsCisJLmRyaXZlciA9ICZpMmNfZHJpdmVyX2tzMDEyNywKKwkudXNhZ2VfY291bnQgPSAwCit9OworCitzdGF0aWMgaW50IGtzMDEyN19mb3VuZF9wcm9jKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHIsIGludCBraW5kKQoreworCXN0cnVjdCBrczAxMjcgKmtzOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CisKKwljbGllbnQgPSBremFsbG9jKHNpemVvZigqY2xpZW50KSwgR0ZQX0tFUk5FTCk7CisJaWYgKGNsaWVudCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1jcHkoY2xpZW50LCAma3MwMTI3X2NsaWVudF90bXBsLCBzaXplb2YoKmNsaWVudCkpOworCisJa3MgPSBremFsbG9jKHNpemVvZigqa3MpLCBHRlBfS0VSTkVMKTsKKwlpZiAoa3MgPT0gTlVMTCkgeworCQlrZnJlZShjbGllbnQpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBrcyk7CisJY2xpZW50LT5hZGFwdGVyID0gYWRhcHRlcjsKKwljbGllbnQtPmFkZHIgPSBhZGRyOworCXNwcmludGYoY2xpZW50LT5uYW1lLCAia3MwMTI3LSUwMngiLCBhZGFwdGVyLT5pZCk7CisKKwlrcy0+Y2xpZW50ID0gY2xpZW50OworCWtzLT5hZGRyID0gYWRkcjsKKwlrcy0+a3NfdHlwZSA9IEtTX1RZUEVfVU5LTk9XTjsKKworCS8qIHBvd2VyIHVwICovCisJa3MwMTI3X3dyaXRlKGtzLCBLU19DTURBLCAweDJjKTsKKwltZGVsYXkoMTApOworCisJLyogcmVzZXQgdGhlIGRldmljZSAqLworCWtzMDEyN19yZXNldChrcyk7CisJcHJpbnRrKEtFUk5fSU5GTyAia3MwMTI3OiBhdHRhY2g6ICVzIHZpZGVvIGRlY29kZXJcbiIsCisJICAgICAgIGtzLT5hZGRyPT0oSTJDX0tTMDEyN19BRERPTj4+MSkgPyAiYWRkb24iIDogIm9uLWJvYXJkIik7CisKKwlpMmNfYXR0YWNoX2NsaWVudChjbGllbnQpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQga3MwMTI3X3Byb2JlKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpZiAoYWRhcHRlci0+aWQgPT0gSTJDX0hXX0JfWlIzNjA2NykKKwkJcmV0dXJuIGkyY19wcm9iZShhZGFwdGVyLCAmYWRkcl9kYXRhLCBrczAxMjdfZm91bmRfcHJvYyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQga3MwMTI3X2RldGFjaChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBrczAxMjcgKmtzID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlrczAxMjdfd3JpdGUoa3MsIEtTX09GTVRBLCAweDIwKTsgLyp0cmlzdGF0ZSovCisJa3MwMTI3X3dyaXRlKGtzLCBLU19DTURBLCAweDJjIHwgMHg4MCk7IC8qIHBvd2VyIGRvd24gKi8KKworCWkyY19kZXRhY2hfY2xpZW50KGNsaWVudCk7CisJa2ZyZWUoa3MpOworCWtmcmVlKGNsaWVudCk7CisKKwlkcHJpbnRrKCJrczAxMjc6IGRldGFjaFxuIik7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBfX2RldmluaXQga3MwMTI3X2luaXRfbW9kdWxlKHZvaWQpCit7CisJaW5pdF9yZWdfZGVmYXVsdHMoKTsKKwlpMmNfYWRkX2RyaXZlcigmaTJjX2RyaXZlcl9rczAxMjcpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQga3MwMTI3X2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJmkyY19kcml2ZXJfa3MwMTI3KTsKK30KKworCittb2R1bGVfaW5pdChrczAxMjdfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoa3MwMTI3X2NsZWFudXBfbW9kdWxlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8va3MwMTI3LmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2tzMDEyNy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlYzU3ODgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2tzMDEyNy5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBWaWRlbyBDYXB0dXJlIERyaXZlciAoIFZpZGVvIGZvciBMaW51eCAxLzIgKQorICogZm9yIHRoZSBNYXRyb3ggTWFydmVsIEcyMDAsRzQwMCBhbmQgUmFpbmJvdyBSdW5uZXItRyBzZXJpZXMKKyAqCisgKiBUaGlzIG1vZHVsZSBpcyBhbiBpbnRlcmZhY2UgdG8gdGhlIEtTMDEyNyB2aWRlbyBkZWNvZGVyIGNoaXAuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5ICBSeWFuIERyYWtlIDxzdGlsZXR0b0BtZWRpYW9uZS5uZXQ+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisgKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2lmbmRlZiBLUzAxMjdfSAorI2RlZmluZSBLUzAxMjdfSAorCisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KKworLyogaW5wdXQgY2hhbm5lbHMgKi8KKyNkZWZpbmUgS1NfSU5QVVRfQ09NUE9TSVRFXzEgICAgMAorI2RlZmluZSBLU19JTlBVVF9DT01QT1NJVEVfMiAgICAxCisjZGVmaW5lIEtTX0lOUFVUX0NPTVBPU0lURV8zICAgIDIKKyNkZWZpbmUgS1NfSU5QVVRfQ09NUE9TSVRFXzQgICAgNAorI2RlZmluZSBLU19JTlBVVF9DT01QT1NJVEVfNSAgICA1CisjZGVmaW5lIEtTX0lOUFVUX0NPTVBPU0lURV82ICAgIDYKKworI2RlZmluZSBLU19JTlBVVF9TVklERU9fMSAgICAgICA4CisjZGVmaW5lIEtTX0lOUFVUX1NWSURFT18yICAgICAgIDkKKyNkZWZpbmUgS1NfSU5QVVRfU1ZJREVPXzMgICAgICAgMTAKKworI2RlZmluZSBLU19JTlBVVF9ZVVY2NTYJCTE1CisjZGVmaW5lIEtTX0lOUFVUX0NPVU5UICAgICAgICAgIDEwCisKKy8qIG91dHB1dCBjaGFubmVscyAqLworI2RlZmluZSBLU19PVVRQVVRfWVVWNjU2RSAgICAgICAwCisjZGVmaW5lIEtTX09VVFBVVF9FWFYgICAgICAgICAgIDEKKworLyogdmlkZW8gc3RhbmRhcmRzICovCisjZGVmaW5lIEtTX1NURF9OVFNDX04gICAgICAgICAgIDExMiAgICAgICAvKiA1MCBIeiBOVFNDICovCisjZGVmaW5lIEtTX1NURF9QQUxfTSAgICAgICAgICAgIDExMyAgICAgICAvKiA2MCBIeiBQQUwgICovCisKKyNlbmRpZiAvKiBLUzAxMjdfSCAqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL21leWUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbWV5ZS5jCmluZGV4IDg1MGJlZTkuLmY2OGNhN2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbWV5ZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbWV5ZS5jCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KQEAgLTE2ODIsMTMgKzE2ODMsMTMgQEAKIAogc3RhdGljIHZvaWQgbWV5ZV92bV9vcGVuKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQogewotCWludCBpZHggPSAoaW50KXZtYS0+dm1fcHJpdmF0ZV9kYXRhOworCWxvbmcgaWR4ID0gKGxvbmcpdm1hLT52bV9wcml2YXRlX2RhdGE7CiAJbWV5ZS52bWFfdXNlX2NvdW50W2lkeF0rKzsKIH0KIAogc3RhdGljIHZvaWQgbWV5ZV92bV9jbG9zZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKLQlpbnQgaWR4ID0gKGludCl2bWEtPnZtX3ByaXZhdGVfZGF0YTsKKwlsb25nIGlkeCA9IChsb25nKXZtYS0+dm1fcHJpdmF0ZV9kYXRhOwogCW1leWUudm1hX3VzZV9jb3VudFtpZHhdLS07CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXNwMzQwMC1kcml2ZXIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXNwMzQwMC1kcml2ZXIuYwppbmRleCBiODA2OTk5Li5kYmI3NWE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL21zcDM0MDAtZHJpdmVyLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9tc3AzNDAwLWRyaXZlci5jCkBAIC0zODUsNjcgKzM4NSw2IEBACiAJcmV0dXJuIFY0TDJfVFVORVJfTU9ERV9NT05POwogfQogCi1zdGF0aWMgc3RydWN0IHY0bDJfcXVlcnljdHJsIG1zcF9xY3RybF9zdGRbXSA9IHsKLQl7Ci0JCS5pZCAgICAgICAgICAgID0gVjRMMl9DSURfQVVESU9fVk9MVU1FLAotCQkubmFtZSAgICAgICAgICA9ICJWb2x1bWUiLAotCQkubWluaW11bSAgICAgICA9IDAsCi0JCS5tYXhpbXVtICAgICAgID0gNjU1MzUsCi0JCS5zdGVwICAgICAgICAgID0gNjU1MzUvMTAwLAotCQkuZGVmYXVsdF92YWx1ZSA9IDU4ODgwLAotCQkuZmxhZ3MgICAgICAgICA9IDAsCi0JCS50eXBlICAgICAgICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKLQl9LHsKLQkJLmlkICAgICAgICAgICAgPSBWNEwyX0NJRF9BVURJT19NVVRFLAotCQkubmFtZSAgICAgICAgICA9ICJNdXRlIiwKLQkJLm1pbmltdW0gICAgICAgPSAwLAotCQkubWF4aW11bSAgICAgICA9IDEsCi0JCS5zdGVwICAgICAgICAgID0gMSwKLQkJLmRlZmF1bHRfdmFsdWUgPSAxLAotCQkuZmxhZ3MgICAgICAgICA9IDAsCi0JCS50eXBlICAgICAgICAgID0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCBtc3BfcWN0cmxfc291bmRfcHJvY2Vzc2luZ1tdID0gewotCXsKLQkJLmlkICAgICAgICAgICAgPSBWNEwyX0NJRF9BVURJT19CQUxBTkNFLAotCQkubmFtZSAgICAgICAgICA9ICJCYWxhbmNlIiwKLQkJLm1pbmltdW0gICAgICAgPSAwLAotCQkubWF4aW11bSAgICAgICA9IDY1NTM1LAotCQkuc3RlcCAgICAgICAgICA9IDY1NTM1LzEwMCwKLQkJLmRlZmF1bHRfdmFsdWUgPSAzMjc2OCwKLQkJLmZsYWdzICAgICAgICAgPSAwLAotCQkudHlwZSAgICAgICAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCi0JfSx7Ci0JCS5pZCAgICAgICAgICAgID0gVjRMMl9DSURfQVVESU9fQkFTUywKLQkJLm5hbWUgICAgICAgICAgPSAiQmFzcyIsCi0JCS5taW5pbXVtICAgICAgID0gMCwKLQkJLm1heGltdW0gICAgICAgPSA2NTUzNSwKLQkJLnN0ZXAgICAgICAgICAgPSA2NTUzNS8xMDAsCi0JCS5kZWZhdWx0X3ZhbHVlID0gMzI3NjgsCi0JCS50eXBlICAgICAgICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKLQl9LHsKLQkJLmlkICAgICAgICAgICAgPSBWNEwyX0NJRF9BVURJT19UUkVCTEUsCi0JCS5uYW1lICAgICAgICAgID0gIlRyZWJsZSIsCi0JCS5taW5pbXVtICAgICAgID0gMCwKLQkJLm1heGltdW0gICAgICAgPSA2NTUzNSwKLQkJLnN0ZXAgICAgICAgICAgPSA2NTUzNS8xMDAsCi0JCS5kZWZhdWx0X3ZhbHVlID0gMzI3NjgsCi0JCS50eXBlICAgICAgICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKLQl9LHsKLQkJLmlkICAgICAgICAgICAgPSBWNEwyX0NJRF9BVURJT19MT1VETkVTUywKLQkJLm5hbWUgICAgICAgICAgPSAiTG91ZG5lc3MiLAotCQkubWluaW11bSAgICAgICA9IDAsCi0JCS5tYXhpbXVtICAgICAgID0gMSwKLQkJLnN0ZXAgICAgICAgICAgPSAxLAotCQkuZGVmYXVsdF92YWx1ZSA9IDEsCi0JCS5mbGFncyAgICAgICAgID0gMCwKLQkJLnR5cGUgICAgICAgICAgPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAotCX0sCi19OwotCi0KIHN0YXRpYyBpbnQgbXNwX2dldF9jdHJsKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCiB7CiAJc3RydWN0IG1zcF9zdGF0ZSAqc3RhdGUgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKQEAgLTY3NCwyMiArNjEzLDMxIEBACiAJCWludCBzYzFfb3V0ID0gcnQtPm91dHB1dCAmIDB4ZjsKIAkJaW50IHNjMl9vdXQgPSAocnQtPm91dHB1dCA+PiA0KSAmIDB4ZjsKIAkJdTE2IHZhbCwgcmVnOworCQlpbnQgaTsKKwkJaW50IGV4dGVybl9pbnB1dCA9IDE7CiAKIAkJaWYgKHN0YXRlLT5yb3V0aW5nLmlucHV0ID09IHJ0LT5pbnB1dCAmJgogCQkgICAgc3RhdGUtPnJvdXRpbmcub3V0cHV0ID09IHJ0LT5vdXRwdXQpCiAJCQlicmVhazsKIAkJc3RhdGUtPnJvdXRpbmcgPSAqcnQ7CisJCS8qIGNoZWNrIGlmIHRoZSB0dW5lciBpbnB1dCBpcyB1c2VkICovCisJCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKKwkJCWlmICgoKHJ0LT5pbnB1dCA+PiAoNCArIGkgKiA0KSkgJiAweGYpID09IDApCisJCQkJZXh0ZXJuX2lucHV0ID0gMDsKKwkJfQorCQlpZiAoZXh0ZXJuX2lucHV0KQorCQkJc3RhdGUtPm1vZGUgPSBNU1BfTU9ERV9FWFRFUk47CisJCWVsc2UKKwkJCXN0YXRlLT5tb2RlID0gTVNQX01PREVfQU1fREVURUNUOwogCQltc3Bfc2V0X3NjYXJ0KGNsaWVudCwgc2NfaW4sIDApOwogCQltc3Bfc2V0X3NjYXJ0KGNsaWVudCwgc2MxX291dCwgMSk7CiAJCW1zcF9zZXRfc2NhcnQoY2xpZW50LCBzYzJfb3V0LCAyKTsKIAkJbXNwX3NldF9hdWRtb2RlKGNsaWVudCk7CiAJCXJlZyA9IChzdGF0ZS0+b3Btb2RlID09IE9QTU9ERV9BVVRPU0VMRUNUKSA/IDB4MzAgOiAweGJiOwogCQl2YWwgPSBtc3BfcmVhZF9kZW0oY2xpZW50LCByZWcpOwotCQlpZiAodHVuZXIgIT0gKCh2YWwgPj4gOCkgJiAxKSkgewotCQkJbXNwX3dyaXRlX2RlbShjbGllbnQsIHJlZywgKHZhbCAmIH4weDEwMCkgfCAodHVuZXIgPDwgOCkpOwotCQkJLyogd2FrZSB0aHJlYWQgd2hlbiBhIG5ldyB0dW5lciBpbnB1dCBpcyBjaG9zZW4gKi8KLQkJCW1zcF93YWtlX3RocmVhZChjbGllbnQpOwotCQl9CisJCW1zcF93cml0ZV9kZW0oY2xpZW50LCByZWcsICh2YWwgJiB+MHgxMDApIHwgKHR1bmVyIDw8IDgpKTsKKwkJLyogd2FrZSB0aHJlYWQgd2hlbiBhIG5ldyBpbnB1dCBpcyBjaG9zZW4gKi8KKwkJbXNwX3dha2VfdGhyZWFkKGNsaWVudCk7CiAJCWJyZWFrOwogCX0KIApAQCAtNzQ0LDIxICs2OTIsMjUgQEAKIAljYXNlIFZJRElPQ19RVUVSWUNUUkw6CiAJewogCQlzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKnFjID0gYXJnOwotCQlpbnQgaTsKIAotCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtc3BfcWN0cmxfc3RkKTsgaSsrKQotCQkJaWYgKHFjLT5pZCAmJiBxYy0+aWQgPT0gbXNwX3FjdHJsX3N0ZFtpXS5pZCkgewotCQkJCW1lbWNweShxYywgJm1zcF9xY3RybF9zdGRbaV0sIHNpemVvZigqcWMpKTsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KKwkJc3dpdGNoIChxYy0+aWQpIHsKKwkJCWNhc2UgVjRMMl9DSURfQVVESU9fVk9MVU1FOgorCQkJY2FzZSBWNEwyX0NJRF9BVURJT19NVVRFOgorCQkJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbF9zdGQocWMpOworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJfQogCQlpZiAoIXN0YXRlLT5oYXNfc291bmRfcHJvY2Vzc2luZykKIAkJCXJldHVybiAtRUlOVkFMOwotCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtc3BfcWN0cmxfc291bmRfcHJvY2Vzc2luZyk7IGkrKykKLQkJCWlmIChxYy0+aWQgJiYgcWMtPmlkID09IG1zcF9xY3RybF9zb3VuZF9wcm9jZXNzaW5nW2ldLmlkKSB7Ci0JCQkJbWVtY3B5KHFjLCAmbXNwX3FjdHJsX3NvdW5kX3Byb2Nlc3NpbmdbaV0sIHNpemVvZigqcWMpKTsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJcmV0dXJuIC1FSU5WQUw7CisJCXN3aXRjaCAocWMtPmlkKSB7CisJCQljYXNlIFY0TDJfQ0lEX0FVRElPX0xPVURORVNTOgorCQkJY2FzZSBWNEwyX0NJRF9BVURJT19CQUxBTkNFOgorCQkJY2FzZSBWNEwyX0NJRF9BVURJT19CQVNTOgorCQkJY2FzZSBWNEwyX0NJRF9BVURJT19UUkVCTEU6CisJCQkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsX3N0ZChxYyk7CisJCQlkZWZhdWx0OgorCQkJCXJldHVybiAtRUlOVkFMOworCQl9CiAJfQogCiAJY2FzZSBWSURJT0NfR19DVFJMOgpAQCAtNzk0LDcgKzc0Niw5IEBACiAJCWNhc2UgTVNQX01PREVfRVhURVJOOiBwID0gIkV4dGVybmFsIGlucHV0IjsgYnJlYWs7CiAJCWRlZmF1bHQ6IHAgPSAidW5rbm93biI7IGJyZWFrOwogCQl9Ci0JCWlmIChzdGF0ZS0+b3Btb2RlID09IE9QTU9ERV9NQU5VQUwpIHsKKwkJaWYgKHN0YXRlLT5tb2RlID09IE1TUF9NT0RFX0VYVEVSTikgeworCQkJdjRsX2luZm8oY2xpZW50LCAiTW9kZTogICAgICVzXG4iLCBwKTsKKwkJfSBlbHNlIGlmIChzdGF0ZS0+b3Btb2RlID09IE9QTU9ERV9NQU5VQUwpIHsKIAkJCXY0bF9pbmZvKGNsaWVudCwgIk1vZGU6ICAgICAlcyAoJXMlcylcbiIsIHAsCiAJCQkJKHN0YXRlLT5yeHN1YmNoYW5zICYgVjRMMl9UVU5FUl9TVUJfU1RFUkVPKSA/ICJzdGVyZW8iIDogIm1vbm8iLAogCQkJCShzdGF0ZS0+cnhzdWJjaGFucyAmIFY0TDJfVFVORVJfU1VCX0xBTkcyKSA/ICIsIGR1YWwiIDogIiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9tc3AzNDAwLWt0aHJlYWRzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL21zcDM0MDAta3RocmVhZHMuYwppbmRleCA2MzNhMTAyLi5mMmZkOTE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL21zcDM0MDAta3RocmVhZHMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL21zcDM0MDAta3RocmVhZHMuYwpAQCAtMjQ0LDE5ICsyNDQsMjEgQEAKIAkgICB0aGUgaGFyZHdhcmUgZG9lcyBub3Qgc3VwcG9ydCBTQVAuIFNvIHRoZSByeHN1YmNoYW5zIGNvbWJpbmF0aW9uCiAJICAgb2YgU1RFUkVPIHwgTEFORzIgZG9lcyBub3Qgb2NjdXIuICovCiAKLQkvKiBzd2l0Y2ggdG8gbW9ubyBpZiBvbmx5IG1vbm8gaXMgYXZhaWxhYmxlICovCi0JaWYgKHN0YXRlLT5yeHN1YmNoYW5zID09IFY0TDJfVFVORVJfU1VCX01PTk8pCi0JCWF1ZG1vZGUgPSBWNEwyX1RVTkVSX01PREVfTU9OTzsKLQkvKiBpZiBiaWxpbmd1YWwgKi8KLQllbHNlIGlmIChzdGF0ZS0+cnhzdWJjaGFucyAmIFY0TDJfVFVORVJfU1VCX0xBTkcyKSB7Ci0JCS8qIGFuZCBtb25vIG9yIHN0ZXJlbywgdGhlbiBmYWxsYmFjayB0byBsYW5nMSAqLwotCQlpZiAoYXVkbW9kZSA9PSBWNEwyX1RVTkVSX01PREVfTU9OTyB8fAotCQkgICAgYXVkbW9kZSA9PSBWNEwyX1RVTkVSX01PREVfU1RFUkVPKQotCQkJYXVkbW9kZSA9IFY0TDJfVFVORVJfTU9ERV9MQU5HMTsKKwlpZiAoc3RhdGUtPm1vZGUgIT0gTVNQX01PREVfRVhURVJOKSB7CisJCS8qIHN3aXRjaCB0byBtb25vIGlmIG9ubHkgbW9ubyBpcyBhdmFpbGFibGUgKi8KKwkJaWYgKHN0YXRlLT5yeHN1YmNoYW5zID09IFY0TDJfVFVORVJfU1VCX01PTk8pCisJCQlhdWRtb2RlID0gVjRMMl9UVU5FUl9NT0RFX01PTk87CisJCS8qIGlmIGJpbGluZ3VhbCAqLworCQllbHNlIGlmIChzdGF0ZS0+cnhzdWJjaGFucyAmIFY0TDJfVFVORVJfU1VCX0xBTkcyKSB7CisJCQkvKiBhbmQgbW9ubyBvciBzdGVyZW8sIHRoZW4gZmFsbGJhY2sgdG8gbGFuZzEgKi8KKwkJCWlmIChhdWRtb2RlID09IFY0TDJfVFVORVJfTU9ERV9NT05PIHx8CisJCQkgICAgYXVkbW9kZSA9PSBWNEwyX1RVTkVSX01PREVfU1RFUkVPKQorCQkJCWF1ZG1vZGUgPSBWNEwyX1RVTkVSX01PREVfTEFORzE7CisJCX0KKwkJLyogaWYgc3RlcmVvLCBhbmQgYXVkbW9kZSBpcyBub3QgbW9ubywgdGhlbiBzd2l0Y2ggdG8gc3RlcmVvICovCisJCWVsc2UgaWYgKGF1ZG1vZGUgIT0gVjRMMl9UVU5FUl9NT0RFX01PTk8pCisJCQlhdWRtb2RlID0gVjRMMl9UVU5FUl9NT0RFX1NURVJFTzsKIAl9Ci0JLyogaWYgc3RlcmVvLCBhbmQgYXVkbW9kZSBpcyBub3QgbW9ubywgdGhlbiBzd2l0Y2ggdG8gc3RlcmVvICovCi0JZWxzZSBpZiAoYXVkbW9kZSAhPSBWNEwyX1RVTkVSX01PREVfTU9OTykKLQkJYXVkbW9kZSA9IFY0TDJfVFVORVJfTU9ERV9TVEVSRU87CiAKIAkvKiBzd2l0Y2ggZGVtb2R1bGF0b3IgKi8KIAlzd2l0Y2ggKHN0YXRlLT5tb2RlKSB7CkBAIC00ODEsNiArNDgzLDcgQEAKIAkJCS8qIG5vIGNhcnJpZXIgc2NhbiwganVzdCB1bm11dGUgKi8KIAkJCXY0bF9kYmcoMSwgbXNwX2RlYnVnLCBjbGllbnQsICJ0aHJlYWQ6IG5vIGNhcnJpZXIgc2NhblxuIik7CiAJCQlzdGF0ZS0+c2Nhbl9pbl9wcm9ncmVzcyA9IDA7CisJCQlzdGF0ZS0+cnhzdWJjaGFucyA9IFY0TDJfVFVORVJfU1VCX1NURVJFTzsKIAkJCW1zcF9zZXRfYXVkaW8oY2xpZW50KTsKIAkJCWNvbnRpbnVlOwogCQl9CkBAIC05NDcsNiArOTUwLDE0IEBACiAJCWlmIChrdGhyZWFkX3Nob3VsZF9zdG9wKCkpCiAJCQlicmVhazsKIAorCQlpZiAoc3RhdGUtPm1vZGUgPT0gTVNQX01PREVfRVhURVJOKSB7CisJCQkvKiBubyBjYXJyaWVyIHNjYW4gbmVlZGVkLCBqdXN0IHVubXV0ZSAqLworCQkJdjRsX2RiZygxLCBtc3BfZGVidWcsIGNsaWVudCwgInRocmVhZDogbm8gY2FycmllciBzY2FuXG4iKTsKKwkJCXN0YXRlLT5zY2FuX2luX3Byb2dyZXNzID0gMDsKKwkJCW1zcF9zZXRfYXVkaW8oY2xpZW50KTsKKwkJCWNvbnRpbnVlOworCQl9CisKIAkJLyogc2V0dXAgdGhlIGNoaXAqLwogCQltc3AzNHh4Z19yZXNldChjbGllbnQpOwogCQlzdGF0ZS0+c3RkID0gc3RhdGUtPnJhZGlvID8gMHg0MCA6IG1zcF9zdGFuZGFyZDsKQEAgLTk3OCw2ICs5ODksMTEgQEAKIAkJdjRsX2RiZygxLCBtc3BfZGVidWcsIGNsaWVudCwgImRldGVjdGVkIHN0YW5kYXJkOiAlcyAoMHglMDR4KVxuIiwKIAkJCW1zcF9zdGFuZGFyZF9zdGRfbmFtZShzdGF0ZS0+c3RkKSwgc3RhdGUtPnN0ZCk7CiAKKwkJaWYgKHN0YXRlLT5zdGQgPT0gOSkgeworCQkJLyogQU0gTklDQU0gbW9kZSAqLworCQkJbXNwX3dyaXRlX2RzcChjbGllbnQsIDB4MGUsIDB4N2MwMCk7CisJCX0KKwogCQkvKiB1bm11dGU6IGRpc3BhdGNoIHNvdW5kIHRvIHNjYXJ0IG91dHB1dCwgc2V0IHNjYXJ0IHZvbHVtZSAqLwogCQltc3Bfc2V0X2F1ZGlvKGNsaWVudCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3Y1MTEuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3Y1MTEuYwppbmRleCBmZGM4ZTNmLi5hOTg4ZGYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL292NTExLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9vdjUxMS5jCkBAIC0zMjM5LDcgKzMyMzksNyBAQAogCQlSRVNUUklDVF9UT19SQU5HRShmcmFtZS0+Ynl0ZXNfcmVjdmQsIDgsIG1heF9yYXcpOwogCiAJCWlmIChmcmFtZS0+c2NhbnN0YXRlID09IFNUQVRFX0xJTkVTKSB7Ci0JICAgIAkJaW50IG5leHRmOworCQkJaW50IG5leHRmOwogCiAJCQlmcmFtZS0+Z3JhYnN0YXRlID0gRlJBTUVfRE9ORTsKIAkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZnJhbWUtPndxKTsKQEAgLTM0MDUsNyArMzQwNSw3IEBACiAJUkVTVFJJQ1RfVE9fUkFOR0UoZnJhbWUtPmJ5dGVzX3JlY3ZkLCA4LCBtYXhfcmF3KTsKIAogCWlmIChmcmFtZS0+c2NhbnN0YXRlID09IFNUQVRFX0xJTkVTKSB7Ci0gICAgCQlpbnQgbmV4dGY7CisJCWludCBuZXh0ZjsKIAogCQlmcmFtZS0+Z3JhYnN0YXRlID0gRlJBTUVfRE9ORTsKIAkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZmcmFtZS0+d3EpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9vdjUxMS5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9vdjUxMS5oCmluZGV4IDEyYjNkNTEuLjY4YjA4MmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3Y1MTEuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL292NTExLmgKQEAgLTMsNiArMyw3IEBACiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3BsYW5iLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3BsYW5iLmMKaW5kZXggZDllM2NhZC4uMzQ4NGUzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9wbGFuYi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcGxhbmIuYwpAQCAtNDAsNiArNDAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Btcy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9wbXMuYwppbmRleCAwOTgzNWNhLi41ZDY4MWZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Btcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcG1zLmMKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KQEAgLTgwNCw3ICs4MDUsNyBAQAogCQkJc3RydWN0IHZpZGVvX3BpY3R1cmUgKnAgPSBhcmc7CiAJCQlpZighKChwLT5wYWxldHRlPT1WSURFT19QQUxFVFRFX1JHQjU2NSAmJiBwLT5kZXB0aD09MTYpCiAJCQkgICAgfHwocC0+cGFsZXR0ZT09VklERU9fUEFMRVRURV9SR0I1NTUgJiYgcC0+ZGVwdGg9PTE1KSkpCi0JCQkgICAgCXJldHVybiAtRUlOVkFMOworCQkJCXJldHVybiAtRUlOVkFMOwogCQkJcGQtPnBpY3R1cmU9ICpwOwogCiAJCQkvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL0tjb25maWcKaW5kZXggNTNjYmM5NS4uNjk3MTQ1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvS2NvbmZpZworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9LY29uZmlnCkBAIC03LDYgKzcsNyBAQAogCSAgICogUGhpbGlwcyBQQ0E2NDUsIFBDQTY0NgogCSAgICogUGhpbGlwcyBQQ1ZDNjc1LCBQQ1ZDNjgwLCBQQ1ZDNjkwCiAJICAgKiBQaGlsaXBzIFBDVkM3MjAvNDAsIFBDVkM3MzAsIFBDVkM3NDAsIFBDVkM3NTAKKwkgICAqIFBoaWxpcHMgU1BDOTAwTkMKIAkgICAqIEFza2V5IFZDMDEwCiAJICAgKiBMb2dpdGVjaCBRdWlja0NhbSBQcm8gMzAwMCwgNDAwMCwgJ1pvb20nLCAnTm90ZWJvb2sgUHJvJwogCSAgICAgYW5kICdPcmJpdCcvJ1NwaGVyZScKQEAgLTE5LDEwICsyMCwxOCBAQAogCSAgYW5kIG5ldmVyIHdpbGwgYmUsIGJ1dCB0aGUgNjY1IGFuZCA3MjAvMjAgYXJlIHN1cHBvcnRlZCBieSBvdGhlcgogCSAgZHJpdmVycy4KIAotCSAgU2VlIDxmaWxlOkRvY3VtZW50YXRpb24vdXNiL3BoaWxpcHMudHh0PiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhbmQKLQkgIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMuCisJICBTb21lIG5ld2VyIGxvZ2l0ZWNoIHdlYmNhbXMgYXJlIG5vdCBoYW5kbGVkIGJ5IHRoaXMgZHJpdmVyIGJ1dCBieSB0aGUKKwkgIFVzYiBWaWRlbyBDbGFzcyBkcml2ZXIgKGxpbnV4LXV2YykuCiAKIAkgIFRoZSBidWlsdC1pbiBtaWNyb3Bob25lIGlzIGVuYWJsZWQgYnkgc2VsZWN0aW5nIFVTQiBBdWRpbyBzdXBwb3J0LgogCiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBwd2MuCisKK2NvbmZpZyBVU0JfUFdDX0RFQlVHCisJYm9vbCAiVVNCIFBoaWxpcHMgQ2FtZXJhcyB2ZXJib3NlIGRlYnVnIgorCWRlcGVuZHMgVVNCX1BXQworCWhlbHAKKwkgIFNheSBZIGhlcmUgaW4gb3JkZXIgdG8gaGF2ZSB0aGUgcHdjIGRyaXZlciBnZW5lcmF0ZSB2ZXJib3NlIGRlYnVnZ2luZworCSAgbWVzc2FnZXMuCisJICBBIHNwZWNpYWwgbW9kdWxlIG9wdGlvbnMgJ3RyYWNlJyBpcyB1c2VkIHRvIGNvbnRyb2wgdGhlIHZlcmJvc2l0eS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvTWFrZWZpbGUKaW5kZXggMzNkNjAxMi4uOWRiMjI2MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvTWFrZWZpbGUKQEAgLTEsMyArMSwxMiBAQAotcHdjLW9ianMJOj0gcHdjLWlmLm8gcHdjLW1pc2MubyBwd2MtY3RybC5vIHB3Yy11bmNvbXByZXNzLm8gcHdjLXRpbW9uLm8gcHdjLWtpYXJhLm8KK3B3Yy1vYmpzCTo9IHB3Yy1pZi5vIHB3Yy1taXNjLm8gcHdjLWN0cmwubyBwd2MtdjRsLm8gcHdjLXVuY29tcHJlc3MubworcHdjLW9ianMJKz0gcHdjLWRlYzEubyBwd2MtZGVjMjMubyBwd2Mta2lhcmEubyBwd2MtdGltb24ubwogCiBvYmotJChDT05GSUdfVVNCX1BXQykgKz0gcHdjLm8KKworaWZlcSAoJChDT05GSUdfVVNCX1BXQ19ERUJVRykseSkKK0VYVFJBX0NGTEFHUyArPSAtRENPTkZJR19QV0NfREVCVUc9MQorZWxzZQorRVhUUkFfQ0ZMQUdTICs9IC1EQ09ORklHX1BXQ19ERUJVRz0wCitlbmRpZgorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1jdHJsLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtY3RybC5jCmluZGV4IDRiYTU0OWIuLjBiZDExNTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1jdHJsLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLWN0cmwuYwpAQCAtMiw3ICsyLDcgQEAKICAgIEZ1bmN0aW9ucyB0aGF0IHNlbmQgdmFyaW91cyBjb250cm9sIG1lc3NhZ2VzIHRvIHRoZSB3ZWJjYW0sIGluY2x1ZGluZwogICAgdmlkZW8gbW9kZXMuCiAgICAoQykgMTk5OS0yMDAzIE5lbW9zb2Z0IFVudi4KLSAgIChDKSAyMDA0ICAgICAgTHVjIFNhaWxsYXJkIChsdWNAc2FpbGxhcmQub3JnKQorICAgKEMpIDIwMDQtMjAwNiBMdWMgU2FpbGxhcmQgKGx1Y0BzYWlsbGFyZC5vcmcpCiAKICAgIE5PVEU6IHRoaXMgdmVyc2lvbiBvZiBwd2MgaXMgYW4gdW5vZmZpY2lhbCAobW9kaWZpZWQpIHJlbGVhc2Ugb2YgcHdjICYgcGN3eAogICAgZHJpdmVyIGFuZCB0aHVzIG1heSBoYXZlIGJ1Z3MgdGhhdCBhcmUgbm90IHByZXNlbnQgaW4gdGhlIG9yaWdpbmFsIHZlcnNpb24uCkBAIC00MSwxMiArNDEsMTQgQEAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2VuZGlmCiAjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogCiAjaW5jbHVkZSAicHdjLmgiCi0jaW5jbHVkZSAicHdjLWlvY3RsLmgiCiAjaW5jbHVkZSAicHdjLXVuY29tcHJlc3MuaCIKICNpbmNsdWRlICJwd2Mta2lhcmEuaCIKICNpbmNsdWRlICJwd2MtdGltb24uaCIKKyNpbmNsdWRlICJwd2MtZGVjMS5oIgorI2luY2x1ZGUgInB3Yy1kZWMyMy5oIgogCiAvKiBSZXF1ZXN0IHR5cGVzOiB2aWRlbyAqLwogI2RlZmluZSBTRVRfTFVNX0NUTAkJCTB4MDEKQEAgLTU3LDYgKzU5LDEwIEBACiAjZGVmaW5lIEdFVF9TVEFUVVNfQ1RMCQkJMHgwNgogI2RlZmluZSBTRVRfRVBfU1RSRUFNX0NUTAkJMHgwNwogI2RlZmluZSBHRVRfRVBfU1RSRUFNX0NUTAkJMHgwOAorI2RlZmluZSBHRVRfWFhfQ1RMCQkJMHgwOQorI2RlZmluZSBTRVRfWFhfQ1RMCQkJMHgwQQorI2RlZmluZSBHRVRfWFlfQ1RMCQkJMHgwQgorI2RlZmluZSBTRVRfWFlfQ1RMCQkJMHgwQwogI2RlZmluZSBTRVRfTVBUX0NUTAkJCTB4MEQKICNkZWZpbmUgR0VUX01QVF9DVEwJCQkweDBFCiAKQEAgLTkzLDEyICs5OSwyMCBAQAogI2RlZmluZSBSRUFEX1NIVVRURVJfRk9STUFUVEVSCQkJMHgwNjAwCiAjZGVmaW5lIFJFQURfUkVEX0dBSU5fRk9STUFUVEVSCQkJMHgwNzAwCiAjZGVmaW5lIFJFQURfQkxVRV9HQUlOX0ZPUk1BVFRFUgkJMHgwODAwCisjZGVmaW5lIEdFVF9TVEFUVVNfQjAwCQkJCTB4MEIwMAogI2RlZmluZSBTRU5TT1JfVFlQRV9GT1JNQVRURVIxCQkJMHgwQzAwCisjZGVmaW5lIEdFVF9TVEFUVVNfMzAwMAkJCQkweDMwMDAKICNkZWZpbmUgUkVBRF9SQVdfWV9NRUFOX0ZPUk1BVFRFUgkJMHgzMTAwCiAjZGVmaW5lIFNFVF9QT1dFUl9TQVZFX01PREVfRk9STUFUVEVSCQkweDMyMDAKICNkZWZpbmUgTUlSUk9SX0lNQUdFX0ZPUk1BVFRFUgkJCTB4MzMwMAogI2RlZmluZSBMRURfRk9STUFUVEVSCQkJCTB4MzQwMAorI2RlZmluZSBMT1dMSUdIVAkJCQkweDM1MDAKKyNkZWZpbmUgR0VUX1NUQVRVU18zNjAwCQkJCTB4MzYwMAogI2RlZmluZSBTRU5TT1JfVFlQRV9GT1JNQVRURVIyCQkJMHgzNzAwCisjZGVmaW5lIEdFVF9TVEFUVVNfMzgwMAkJCQkweDM4MDAKKyNkZWZpbmUgR0VUX1NUQVRVU180MDAwCQkJCTB4NDAwMAorI2RlZmluZSBHRVRfU1RBVFVTXzQxMDAJCQkJMHg0MTAwCS8qIEdldCAqLworI2RlZmluZSBDVExfU1RBVFVTXzQyMDAJCQkJMHg0MjAwCS8qIFtHU10gMSAqLwogCiAvKiBGb3JtYXR0ZXJzIGZvciB0aGUgVmlkZW8gRW5kcG9pbnQgY29udHJvbHMgW0dTXUVUX0VQX1NUUkVBTV9DVEwgKi8KICNkZWZpbmUgVklERU9fT1VUUFVUX0NPTlRST0xfRk9STUFUVEVSCQkweDAxMDAKQEAgLTEzOCw2ICsxNTIsNyBAQAogI2luY2x1ZGUgInB3Yy1uYWxhLmgiCiB9OwogCitzdGF0aWMgdm9pZCBwd2Nfc2V0X2ltYWdlX2J1ZmZlcl9zaXplKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKQEAgLTE1OSwzMSArMTc0LDcgQEAKIAkJJmJ1ZiwgYnVmbGVuLCA1MDApCiAKIAotI2lmIFBXQ19ERUJVRwotdm9pZCBwd2NfaGV4ZHVtcCh2b2lkICpwLCBpbnQgbGVuKQotewotCWludCBpOwotCXVuc2lnbmVkIGNoYXIgKnM7Ci0JY2hhciBidWZbMTAwXSwgKmQ7Ci0KLQlzID0gKHVuc2lnbmVkIGNoYXIgKilwOwotCWQgPSBidWY7Ci0JKmQgPSAnXDAnOwotCURlYnVnKCJEb2luZyBoZXhkdW1wIEAgJXAsICVkIGJ5dGVzLlxuIiwgcCwgbGVuKTsKLQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJZCArPSBzcHJpbnRmKGQsICIlMDJYICIsICpzKyspOwotCQlpZiAoKGkgJiAweEYpID09IDB4RikgewotCQkJRGVidWcoIiVzXG4iLCBidWYpOwotCQkJZCA9IGJ1ZjsKLQkJCSpkID0gJ1wwJzsKLQkJfQotCX0KLQlpZiAoKGkgJiAweEYpICE9IDApCi0JCURlYnVnKCIlc1xuIiwgYnVmKTsKLX0KLSNlbmRpZgotCi1zdGF0aWMgaW5saW5lIGludCBzZW5kX3ZpZGVvX2NvbW1hbmQoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsIGludCBpbmRleCwgdm9pZCAqYnVmLCBpbnQgYnVmbGVuKQorc3RhdGljIGludCBzZW5kX3ZpZGVvX2NvbW1hbmQoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsIGludCBpbmRleCwgdm9pZCAqYnVmLCBpbnQgYnVmbGVuKQogewogCXJldHVybiB1c2JfY29udHJvbF9tc2codWRldiwKIAkJdXNiX3NuZGN0cmxwaXBlKHVkZXYsIDApLApAQCAtMTk2LDcgKzE4Nyw3IEBACiAKIAogCi1zdGF0aWMgaW5saW5lIGludCBzZXRfdmlkZW9fbW9kZV9OYWxhKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgc2l6ZSwgaW50IGZyYW1lcykKK3N0YXRpYyBpbnQgc2V0X3ZpZGVvX21vZGVfTmFsYShzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IHNpemUsIGludCBmcmFtZXMpCiB7CiAJdW5zaWduZWQgY2hhciBidWZbM107CiAJaW50IHJldCwgZnBzOwpAQCAtMjI5LDM0ICsyMjAsMTQgQEAKIAlpZiAocEVudHJ5LT5hbHRlcm5hdGUgPT0gMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAocEVudHJ5LT5jb21wcmVzc2VkKQotCQlyZXR1cm4gLUVOT0VOVDsgLyogTm90IHN1cHBvcnRlZC4gKi8KLQogCW1lbWNweShidWYsIHBFbnRyeS0+bW9kZSwgMyk7CiAJcmV0ID0gc2VuZF92aWRlb19jb21tYW5kKHBkZXYtPnVkZXYsIHBkZXYtPnZlbmRwb2ludCwgYnVmLCAzKTsKIAlpZiAocmV0IDwgMCkgewotCQlEZWJ1ZygiRmFpbGVkIHRvIHNlbmQgdmlkZW8gY29tbWFuZC4uLiAlZFxuIiwgcmV0KTsKKwkJUFdDX0RFQlVHX01PRFVMRSgiRmFpbGVkIHRvIHNlbmQgdmlkZW8gY29tbWFuZC4uLiAlZFxuIiwgcmV0KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAJaWYgKHBFbnRyeS0+Y29tcHJlc3NlZCAmJiBwZGV2LT52cGFsZXR0ZSAhPSBWSURFT19QQUxFVFRFX1JBVykKLQkgewotCSAgIHN3aXRjaChwZGV2LT50eXBlKSB7Ci0JICAgICBjYXNlIDY0NToKLQkgICAgIGNhc2UgNjQ2OgotLyoJICAgICAgIHB3Y19kZWMxX2luaXQocGRldi0+dHlwZSwgcGRldi0+cmVsZWFzZSwgYnVmLCBwZGV2LT5kZWNvbXByZXNzX2RhdGEpOyAqLwotCSAgICAgICBicmVhazsKLQotCSAgICAgY2FzZSA2NzU6Ci0JICAgICBjYXNlIDY4MDoKLQkgICAgIGNhc2UgNjkwOgotCSAgICAgY2FzZSA3MjA6Ci0JICAgICBjYXNlIDczMDoKLQkgICAgIGNhc2UgNzQwOgotCSAgICAgY2FzZSA3NTA6Ci0vKgkgICAgICAgcHdjX2RlYzIzX2luaXQocGRldi0+dHlwZSwgcGRldi0+cmVsZWFzZSwgYnVmLCBwZGV2LT5kZWNvbXByZXNzX2RhdGEpOyAqLwotCSAgICAgICBicmVhazsKLQkgICB9Ci0JfQorCQlwd2NfZGVjMV9pbml0KHBkZXYtPnR5cGUsIHBkZXYtPnJlbGVhc2UsIGJ1ZiwgcGRldi0+ZGVjb21wcmVzc19kYXRhKTsKIAogCXBkZXYtPmNtZF9sZW4gPSAzOwogCW1lbWNweShwZGV2LT5jbWRfYnVmLCBidWYsIDMpOwpAQCAtMjgzLDcgKzI1NCw3IEBACiB9CiAKIAotc3RhdGljIGlubGluZSBpbnQgc2V0X3ZpZGVvX21vZGVfVGltb24oc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCBzaXplLCBpbnQgZnJhbWVzLCBpbnQgY29tcHJlc3Npb24sIGludCBzbmFwc2hvdCkKK3N0YXRpYyBpbnQgc2V0X3ZpZGVvX21vZGVfVGltb24oc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCBzaXplLCBpbnQgZnJhbWVzLCBpbnQgY29tcHJlc3Npb24sIGludCBzbmFwc2hvdCkKIHsKIAl1bnNpZ25lZCBjaGFyIGJ1ZlsxM107CiAJY29uc3Qgc3RydWN0IFRpbW9uX3RhYmxlX2VudHJ5ICpwQ2hvb3NlOwpAQCAtMzE1LDggKzI4Niw4IEBACiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKLS8qIAlpZiAocENob29zZS0+YmFuZGxlbmd0aCA+IDAgJiYgcGRldi0+dnBhbGV0dGUgIT0gVklERU9fUEFMRVRURV9SQVcpCi0JICAgcHdjX2RlYzIzX2luaXQocGRldi0+dHlwZSwgcGRldi0+cmVsZWFzZSwgYnVmLCBwZGV2LT5kZWNvbXByZXNzX2RhdGEpOyAqLworCWlmIChwQ2hvb3NlLT5iYW5kbGVuZ3RoID4gMCAmJiBwZGV2LT52cGFsZXR0ZSAhPSBWSURFT19QQUxFVFRFX1JBVykKKwkJcHdjX2RlYzIzX2luaXQocGRldiwgcGRldi0+dHlwZSwgYnVmKTsKIAogCXBkZXYtPmNtZF9sZW4gPSAxMzsKIAltZW1jcHkocGRldi0+Y21kX2J1ZiwgYnVmLCAxMyk7CkBAIC0zMzYsNyArMzA3LDcgQEAKIH0KIAogCi1zdGF0aWMgaW5saW5lIGludCBzZXRfdmlkZW9fbW9kZV9LaWFyYShzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IHNpemUsIGludCBmcmFtZXMsIGludCBjb21wcmVzc2lvbiwgaW50IHNuYXBzaG90KQorc3RhdGljIGludCBzZXRfdmlkZW9fbW9kZV9LaWFyYShzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IHNpemUsIGludCBmcmFtZXMsIGludCBjb21wcmVzc2lvbiwgaW50IHNuYXBzaG90KQogewogCWNvbnN0IHN0cnVjdCBLaWFyYV90YWJsZV9lbnRyeSAqcENob29zZSA9IE5VTEw7CiAJaW50IGZwcywgcmV0OwpAQCAtMzUwLDIxICszMjEsMTQgQEAKIAlmcHMgPSAoZnJhbWVzIC8gNSkgLSAxOwogCiAJLyogc3BlY2lhbCBjYXNlOiBWR0EgQCA1IGZwcyBhbmQgc25hcHNob3QgaXMgcmF3IGJheWVyIG1vZGUgKi8KLQlpZiAoc2l6ZSA9PSBQU1pfVkdBICYmIGZyYW1lcyA9PSA1ICYmIHNuYXBzaG90KQorCWlmIChzaXplID09IFBTWl9WR0EgJiYgZnJhbWVzID09IDUgJiYgc25hcHNob3QgJiYgcGRldi0+dnBhbGV0dGUgPT0gVklERU9fUEFMRVRURV9SQVcpCiAJewogCQkvKiBPbmx5IGF2YWlsYWJsZSBpbiBjYXNlIHRoZSByYXcgcGFsZXR0ZSBpcyBzZWxlY3RlZCBvcgogCQkgICB3ZSBoYXZlIHRoZSBkZWNvbXByZXNzb3IgYXZhaWxhYmxlLiBUaGlzIG1vZGUgaXMKIAkJICAgb25seSBhdmFpbGFibGUgaW4gY29tcHJlc3NlZCBmb3JtCiAJCSovCi0JCWlmIChwZGV2LT52cGFsZXR0ZSA9PSBWSURFT19QQUxFVFRFX1JBVykKLQkJewotCQkJSW5mbygiQ2hvb3NpbmcgVkdBLzUgQkFZRVIgbW9kZSAoJWQpLlxuIiwgcGRldi0+dnBhbGV0dGUpOwotCQkJcENob29zZSA9ICZSYXdFbnRyeTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCUluZm8oIlZHQS81IEJBWUVSIG1vZGUgX211c3RfIGhhdmUgYSBkZWNvbXByZXNzb3IgYXZhaWxhYmxlLCBvciB1c2UgUkFXIHBhbGV0dGUuXG4iKTsKLQkJfQorCQlQV0NfREVCVUdfU0laRSgiQ2hvb3NpbmcgVkdBLzUgQkFZRVIgbW9kZS5cbiIpOworCQlwQ2hvb3NlID0gJlJhd0VudHJ5OwogCX0KIAllbHNlCiAJewpAQCAtMzcyLDYgKzMzNiw3IEBACiAJCSAgIGlmIHRoZSBwcmVmZXJyZWQgcmF0aW8gaXMgbm90IGF2YWlsYWJsZS4KIAkJICAgU2tpcCB0aGlzIHN0ZXAgd2hlbiB1c2luZyBSQVcgbW9kZXMuCiAJCSovCisJCXNuYXBzaG90ID0gMDsKIAkJd2hpbGUgKGNvbXByZXNzaW9uIDw9IDMpIHsKIAkJCXBDaG9vc2UgPSAmS2lhcmFfdGFibGVbc2l6ZV1bZnBzXVtjb21wcmVzc2lvbl07CiAJCQlpZiAocENob29zZS0+YWx0ZXJuYXRlICE9IDApCkBAIC0zODIsNyArMzQ3LDcgQEAKIAlpZiAocENob29zZSA9PSBOVUxMIHx8IHBDaG9vc2UtPmFsdGVybmF0ZSA9PSAwKQogCQlyZXR1cm4gLUVOT0VOVDsgLyogTm90IHN1cHBvcnRlZC4gKi8KIAotCURlYnVnKCJVc2luZyBhbHRlcm5hdGUgc2V0dGluZyAlZC5cbiIsIHBDaG9vc2UtPmFsdGVybmF0ZSk7CisJUFdDX1RSQUNFKCJVc2luZyBhbHRlcm5hdGUgc2V0dGluZyAlZC5cbiIsIHBDaG9vc2UtPmFsdGVybmF0ZSk7CiAKIAkvKiB1c2JfY29udHJvbF9tc2cgd29uJ3QgdGFrZSBzdGF0aWNseSBhbGxvY2F0ZWQgYXJyYXlzIGFzIGFyZ3VtZW50Pz8gKi8KIAltZW1jcHkoYnVmLCBwQ2hvb3NlLT5tb2RlLCAxMik7CkBAIC0zOTQsOCArMzU5LDggQEAKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAotLyoJaWYgKHBDaG9vc2UtPmJhbmRsZW5ndGggPiAwICYmIHBkZXYtPnZwYWxldHRlICE9IFZJREVPX1BBTEVUVEVfUkFXKQotCSAgcHdjX2RlYzIzX2luaXQocGRldi0+dHlwZSwgcGRldi0+cmVsZWFzZSwgYnVmLCBwZGV2LT5kZWNvbXByZXNzX2RhdGEpOyAqLworCWlmIChwQ2hvb3NlLT5iYW5kbGVuZ3RoID4gMCAmJiBwZGV2LT52cGFsZXR0ZSAhPSBWSURFT19QQUxFVFRFX1JBVykKKwkJcHdjX2RlYzIzX2luaXQocGRldiwgcGRldi0+dHlwZSwgYnVmKTsKIAogCXBkZXYtPmNtZF9sZW4gPSAxMjsKIAltZW1jcHkocGRldi0+Y21kX2J1ZiwgYnVmLCAxMik7CkBAIC00MTAsNDkgKzM3NSwxMyBAQAogCQlwZGV2LT5mcmFtZV9zaXplID0gKHBkZXYtPnZiYW5kbGVuZ3RoICogcGRldi0+aW1hZ2UueSkgLyA0OwogCWVsc2UKIAkJcGRldi0+ZnJhbWVfc2l6ZSA9IChwZGV2LT5pbWFnZS54ICogcGRldi0+aW1hZ2UueSAqIDEyKSAvIDg7CisJUFdDX1RSQUNFKCJmcmFtZV9zaXplPSVkLCB2ZnJhbWVzPSVkLCB2c2l6ZT0lZCwgdnNuYXBzaG90PSVkLCB2YmFuZGxlbmd0aD0lZFxuIiwKKwkgICAgcGRldi0+ZnJhbWVfc2l6ZSxwZGV2LT52ZnJhbWVzLHBkZXYtPnZzaXplLHBkZXYtPnZzbmFwc2hvdCxwZGV2LT52YmFuZGxlbmd0aCk7CiAJcmV0dXJuIDA7CiB9CiAKIAogCi1zdGF0aWMgdm9pZCBwd2Nfc2V0X2ltYWdlX2J1ZmZlcl9zaXplKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KQotewotCWludCBpLCBmYWN0b3IgPSAwLCBmaWxsZXIgPSAwOwotCi0JLyogZm9yIFBBTEVUVEVfWVVWNDIwUCAqLwotCXN3aXRjaChwZGV2LT52cGFsZXR0ZSkKLQl7Ci0JY2FzZSBWSURFT19QQUxFVFRFX1lVVjQyMFA6Ci0JCWZhY3RvciA9IDY7Ci0JCWZpbGxlciA9IDEyODsKLQkJYnJlYWs7Ci0JY2FzZSBWSURFT19QQUxFVFRFX1JBVzoKLQkJZmFjdG9yID0gNjsgLyogY2FuIGJlIHVuY29tcHJlc3NlZCBZVVY0MjBQICovCi0JCWZpbGxlciA9IDA7Ci0JCWJyZWFrOwotCX0KLQotCS8qIFNldCBzaXplcyBpbiBieXRlcyAqLwotCXBkZXYtPmltYWdlLnNpemUgPSBwZGV2LT5pbWFnZS54ICogcGRldi0+aW1hZ2UueSAqIGZhY3RvciAvIDQ7Ci0JcGRldi0+dmlldy5zaXplICA9IHBkZXYtPnZpZXcueCAgKiBwZGV2LT52aWV3LnkgICogZmFjdG9yIC8gNDsKLQotCS8qIEFsaWduIG9mZnNldCwgb3IgeW91J2xsIGdldCBzb21lIHZlcnkgd2VpcmQgcmVzdWx0cyBpbgotCSAgIFlVVjQyMCBtb2RlLi4uIHggbXVzdCBiZSBtdWx0aXBsZSBvZiA0ICh0byBnZXQgdGhlIFkncyBpbgotCSAgIHBsYWNlKSwgYW5kIHkgZXZlbiAob3IgeW91J2xsIG1peHVwIFUgJiBWKS4gVGhpcyBpcyBsZXNzIG9mIGEKLQkgICBwcm9ibGVtIGZvciBZVVY0MjBQLgotCSAqLwotCXBkZXYtPm9mZnNldC54ID0gKChwZGV2LT52aWV3LnggLSBwZGV2LT5pbWFnZS54KSAvIDIpICYgMHhGRkZDOwotCXBkZXYtPm9mZnNldC55ID0gKChwZGV2LT52aWV3LnkgLSBwZGV2LT5pbWFnZS55KSAvIDIpICYgMHhGRkZFOwotCi0JLyogRmlsbCBidWZmZXJzIHdpdGggZ3JheSBvciBibGFjayAqLwotCWZvciAoaSA9IDA7IGkgPCBNQVhfSU1BR0VTOyBpKyspIHsKLQkJaWYgKHBkZXYtPmltYWdlX3B0cltpXSAhPSBOVUxMKQotCQkJbWVtc2V0KHBkZXYtPmltYWdlX3B0cltpXSwgZmlsbGVyLCBwZGV2LT52aWV3LnNpemUpOwotCX0KLX0KLQotCi0KIC8qKgogICAgQHBkZXY6IGRldmljZSBzdHJ1Y3R1cmUKICAgIEB3aWR0aDogdmlld3BvcnQgd2lkdGgKQEAgLTQ2NSw1MCArMzk0LDc4IEBACiB7CiAJaW50IHJldCwgc2l6ZTsKIAotCVRyYWNlKFRSQUNFX0ZMT1csICJzZXRfdmlkZW9fbW9kZSglZHglZCBAICVkLCBwYWxldHRlICVkKS5cbiIsIHdpZHRoLCBoZWlnaHQsIGZyYW1lcywgcGRldi0+dnBhbGV0dGUpOworCVBXQ19ERUJVR19GTE9XKCJzZXRfdmlkZW9fbW9kZSglZHglZCBAICVkLCBwYWxldHRlICVkKS5cbiIsIHdpZHRoLCBoZWlnaHQsIGZyYW1lcywgcGRldi0+dnBhbGV0dGUpOwogCXNpemUgPSBwd2NfZGVjb2RlX3NpemUocGRldiwgd2lkdGgsIGhlaWdodCk7CiAJaWYgKHNpemUgPCAwKSB7Ci0JCURlYnVnKCJDb3VsZCBub3QgZmluZCBzdWl0YWJsZSBzaXplLlxuIik7CisJCVBXQ19ERUJVR19NT0RVTEUoIkNvdWxkIG5vdCBmaW5kIHN1aXRhYmxlIHNpemUuXG4iKTsKIAkJcmV0dXJuIC1FUkFOR0U7CiAJfQotCURlYnVnKCJkZWNvZGVfc2l6ZSA9ICVkLlxuIiwgc2l6ZSk7CisJUFdDX1RSQUNFKCJkZWNvZGVfc2l6ZSA9ICVkLlxuIiwgc2l6ZSk7CiAKLQlyZXQgPSAtRUlOVkFMOwotCXN3aXRjaChwZGV2LT50eXBlKSB7Ci0JY2FzZSA2NDU6Ci0JY2FzZSA2NDY6CisJaWYgKERFVklDRV9VU0VfQ09ERUMxKHBkZXYtPnR5cGUpKSB7CiAJCXJldCA9IHNldF92aWRlb19tb2RlX05hbGEocGRldiwgc2l6ZSwgZnJhbWVzKTsKLQkJYnJlYWs7CiAKLQljYXNlIDY3NToKLQljYXNlIDY4MDoKLQljYXNlIDY5MDoKLQkJcmV0ID0gc2V0X3ZpZGVvX21vZGVfVGltb24ocGRldiwgc2l6ZSwgZnJhbWVzLCBjb21wcmVzc2lvbiwgc25hcHNob3QpOwotCQlicmVhazsKLQotCWNhc2UgNzIwOgotCWNhc2UgNzMwOgotCWNhc2UgNzQwOgotCWNhc2UgNzUwOgorCX0gZWxzZSBpZiAoREVWSUNFX1VTRV9DT0RFQzMocGRldi0+dHlwZSkpIHsKIAkJcmV0ID0gc2V0X3ZpZGVvX21vZGVfS2lhcmEocGRldiwgc2l6ZSwgZnJhbWVzLCBjb21wcmVzc2lvbiwgc25hcHNob3QpOwotCQlicmVhazsKKworCX0gZWxzZSB7CisJCXJldCA9IHNldF92aWRlb19tb2RlX1RpbW9uKHBkZXYsIHNpemUsIGZyYW1lcywgY29tcHJlc3Npb24sIHNuYXBzaG90KTsKIAl9CiAJaWYgKHJldCA8IDApIHsKLQkJaWYgKHJldCA9PSAtRU5PRU5UKQotCQkJSW5mbygiVmlkZW8gbW9kZSAlc0AlZCBmcHMgaXMgb25seSBzdXBwb3J0ZWQgd2l0aCB0aGUgZGVjb21wcmVzc29yIG1vZHVsZSAocHdjeCkuXG4iLCBzaXplMm5hbWVbc2l6ZV0sIGZyYW1lcyk7Ci0JCWVsc2UgewotCQkJRXJyKCJGYWlsZWQgdG8gc2V0IHZpZGVvIG1vZGUgJXNAJWQgZnBzOyByZXR1cm4gY29kZSA9ICVkXG4iLCBzaXplMm5hbWVbc2l6ZV0sIGZyYW1lcywgcmV0KTsKLQkJfQorCQlQV0NfRVJST1IoIkZhaWxlZCB0byBzZXQgdmlkZW8gbW9kZSAlc0AlZCBmcHM7IHJldHVybiBjb2RlID0gJWRcbiIsIHNpemUybmFtZVtzaXplXSwgZnJhbWVzLCByZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KIAlwZGV2LT52aWV3LnggPSB3aWR0aDsKIAlwZGV2LT52aWV3LnkgPSBoZWlnaHQ7CiAJcGRldi0+ZnJhbWVfdG90YWxfc2l6ZSA9IHBkZXYtPmZyYW1lX3NpemUgKyBwZGV2LT5mcmFtZV9oZWFkZXJfc2l6ZSArIHBkZXYtPmZyYW1lX3RyYWlsZXJfc2l6ZTsKIAlwd2Nfc2V0X2ltYWdlX2J1ZmZlcl9zaXplKHBkZXYpOwotCVRyYWNlKFRSQUNFX1NJWkUsICJTZXQgdmlld3BvcnQgdG8gJWR4JWQsIGltYWdlIHNpemUgaXMgJWR4JWQuXG4iLCB3aWR0aCwgaGVpZ2h0LCBwd2NfaW1hZ2Vfc2l6ZXNbc2l6ZV0ueCwgcHdjX2ltYWdlX3NpemVzW3NpemVdLnkpOworCVBXQ19ERUJVR19TSVpFKCJTZXQgdmlld3BvcnQgdG8gJWR4JWQsIGltYWdlIHNpemUgaXMgJWR4JWQuXG4iLCB3aWR0aCwgaGVpZ2h0LCBwd2NfaW1hZ2Vfc2l6ZXNbc2l6ZV0ueCwgcHdjX2ltYWdlX3NpemVzW3NpemVdLnkpOwogCXJldHVybiAwOwogfQogCisjZGVmaW5lIEJMQUNLX1kgMAorI2RlZmluZSBCTEFDS19VIDEyOAorI2RlZmluZSBCTEFDS19WIDEyOAorCitzdGF0aWMgdm9pZCBwd2Nfc2V0X2ltYWdlX2J1ZmZlcl9zaXplKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KQoreworCWludCBpLCBmYWN0b3IgPSAwOworCisJLyogZm9yIFBBTEVUVEVfWVVWNDIwUCAqLworCXN3aXRjaChwZGV2LT52cGFsZXR0ZSkKKwl7CisJY2FzZSBWSURFT19QQUxFVFRFX1lVVjQyMFA6CisJCWZhY3RvciA9IDY7CisJCWJyZWFrOworCWNhc2UgVklERU9fUEFMRVRURV9SQVc6CisJCWZhY3RvciA9IDY7IC8qIGNhbiBiZSB1bmNvbXByZXNzZWQgWVVWNDIwUCAqLworCQlicmVhazsKKwl9CisKKwkvKiBTZXQgc2l6ZXMgaW4gYnl0ZXMgKi8KKwlwZGV2LT5pbWFnZS5zaXplID0gcGRldi0+aW1hZ2UueCAqIHBkZXYtPmltYWdlLnkgKiBmYWN0b3IgLyA0OworCXBkZXYtPnZpZXcuc2l6ZSAgPSBwZGV2LT52aWV3LnggICogcGRldi0+dmlldy55ICAqIGZhY3RvciAvIDQ7CisKKwkvKiBBbGlnbiBvZmZzZXQsIG9yIHlvdSdsbCBnZXQgc29tZSB2ZXJ5IHdlaXJkIHJlc3VsdHMgaW4KKwkgICBZVVY0MjAgbW9kZS4uLiB4IG11c3QgYmUgbXVsdGlwbGUgb2YgNCAodG8gZ2V0IHRoZSBZJ3MgaW4KKwkgICBwbGFjZSksIGFuZCB5IGV2ZW4gKG9yIHlvdSdsbCBtaXh1cCBVICYgVikuIFRoaXMgaXMgbGVzcyBvZiBhCisJICAgcHJvYmxlbSBmb3IgWVVWNDIwUC4KKwkgKi8KKwlwZGV2LT5vZmZzZXQueCA9ICgocGRldi0+dmlldy54IC0gcGRldi0+aW1hZ2UueCkgLyAyKSAmIDB4RkZGQzsKKwlwZGV2LT5vZmZzZXQueSA9ICgocGRldi0+dmlldy55IC0gcGRldi0+aW1hZ2UueSkgLyAyKSAmIDB4RkZGRTsKKworCS8qIEZpbGwgYnVmZmVycyB3aXRoIGJsYWNrIGNvbG9ycyAqLworCWZvciAoaSA9IDA7IGkgPCBwd2NfbWJ1ZnM7IGkrKykgeworCQl1bnNpZ25lZCBjaGFyICpwID0gcGRldi0+aW1hZ2VfZGF0YSArIHBkZXYtPmltYWdlc1tpXS5vZmZzZXQ7CisJCW1lbXNldChwLCBCTEFDS19ZLCBwZGV2LT52aWV3LnggKiBwZGV2LT52aWV3LnkpOworCQlwICs9IHBkZXYtPnZpZXcueCAqIHBkZXYtPnZpZXcueTsKKwkJbWVtc2V0KHAsIEJMQUNLX1UsIHBkZXYtPnZpZXcueCAqIHBkZXYtPnZpZXcueS80KTsKKwkJcCArPSBwZGV2LT52aWV3LnggKiBwZGV2LT52aWV3LnkvNDsKKwkJbWVtc2V0KHAsIEJMQUNLX1YsIHBkZXYtPnZpZXcueCAqIHBkZXYtPnZpZXcueS80KTsKKwl9Cit9CisKKwogCiAvKiBCUklHSFRORVNTICovCiAKQEAgLTUyMCw3ICs0NzcsNyBAQAogCXJldCA9IFJlY3ZDb250cm9sTXNnKEdFVF9MVU1fQ1RMLCBCUklHSFRORVNTX0ZPUk1BVFRFUiwgMSk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7Ci0JcmV0dXJuIGJ1ZiA8PCA5OworCXJldHVybiBidWY7CiB9CiAKIGludCBwd2Nfc2V0X2JyaWdodG5lc3Moc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCB2YWx1ZSkKQEAgLTU0NSw3ICs1MDIsNyBAQAogCXJldCA9IFJlY3ZDb250cm9sTXNnKEdFVF9MVU1fQ1RMLCBDT05UUkFTVF9GT1JNQVRURVIsIDEpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwotCXJldHVybiBidWYgPDwgMTA7CisJcmV0dXJuIGJ1ZjsKIH0KIAogaW50IHB3Y19zZXRfY29udHJhc3Qoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCB2YWx1ZSkKQEAgLTU3MCw3ICs1MjcsNyBAQAogCXJldCA9IFJlY3ZDb250cm9sTXNnKEdFVF9MVU1fQ1RMLCBHQU1NQV9GT1JNQVRURVIsIDEpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwotCXJldHVybiBidWYgPDwgMTE7CisJcmV0dXJuIGJ1ZjsKIH0KIAogaW50IHB3Y19zZXRfZ2FtbWEoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCB2YWx1ZSkKQEAgLTU4OCwzNyArNTQ1LDQ3IEBACiAKIC8qIFNBVFVSQVRJT04gKi8KIAotaW50IHB3Y19nZXRfc2F0dXJhdGlvbihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldikKKy8qIHJldHVybiBhIHZhbHVlIGJldHdlZW4gWy0xMDAgLCAxMDBdICovCitpbnQgcHdjX2dldF9zYXR1cmF0aW9uKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgKnZhbHVlKQogewogCWNoYXIgYnVmOwotCWludCByZXQ7Ci0KLQlpZiAocGRldi0+dHlwZSA8IDY3NSkKLQkJcmV0dXJuIC0xOwotCXJldCA9IFJlY3ZDb250cm9sTXNnKEdFVF9DSFJPTV9DVEwsIHBkZXYtPnR5cGUgPCA3MzAgPyBTQVRVUkFUSU9OX01PREVfRk9STUFUVEVSMiA6IFNBVFVSQVRJT05fTU9ERV9GT1JNQVRURVIxLCAxKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQlyZXR1cm4gMzI3NjggKyBidWYgKiAzMjc7Ci19Ci0KLWludCBwd2Nfc2V0X3NhdHVyYXRpb24oc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCB2YWx1ZSkKLXsKLQljaGFyIGJ1ZjsKKwlpbnQgcmV0LCBzYXR1cmF0aW9uX3JlZ2lzdGVyOwogCiAJaWYgKHBkZXYtPnR5cGUgPCA2NzUpCiAJCXJldHVybiAtRUlOVkFMOwotCWlmICh2YWx1ZSA8IDApCi0JCXZhbHVlID0gMDsKLQlpZiAodmFsdWUgPiAweGZmZmYpCi0JCXZhbHVlID0gMHhmZmZmOwotCS8qIHNhdHVyYXRpb24gcmFuZ2VzIGZyb20gLTEwMCB0byArMTAwICovCi0JYnVmID0gKHZhbHVlIC0gMzI3NjgpIC8gMzI3OwotCXJldHVybiBTZW5kQ29udHJvbE1zZyhTRVRfQ0hST01fQ1RMLCBwZGV2LT50eXBlIDwgNzMwID8gU0FUVVJBVElPTl9NT0RFX0ZPUk1BVFRFUjIgOiBTQVRVUkFUSU9OX01PREVfRk9STUFUVEVSMSwgMSk7CisJaWYgKHBkZXYtPnR5cGUgPCA3MzApCisJCXNhdHVyYXRpb25fcmVnaXN0ZXIgPSBTQVRVUkFUSU9OX01PREVfRk9STUFUVEVSMjsKKwllbHNlCisJCXNhdHVyYXRpb25fcmVnaXN0ZXIgPSBTQVRVUkFUSU9OX01PREVfRk9STUFUVEVSMTsKKwlyZXQgPSBSZWN2Q29udHJvbE1zZyhHRVRfQ0hST01fQ1RMLCBzYXR1cmF0aW9uX3JlZ2lzdGVyLCAxKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwkqdmFsdWUgPSAoc2lnbmVkKWJ1ZjsKKwlyZXR1cm4gMDsKK30KKworLyogQHBhcmFtIHZhbHVlIHNhdHVyYXRpb24gY29sb3IgYmV0d2VlbiBbLTEwMCAsIDEwMF0gKi8KK2ludCBwd2Nfc2V0X3NhdHVyYXRpb24oc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCB2YWx1ZSkKK3sKKwljaGFyIGJ1ZjsKKwlpbnQgc2F0dXJhdGlvbl9yZWdpc3RlcjsKKworCWlmIChwZGV2LT50eXBlIDwgNjc1KQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAodmFsdWUgPCAtMTAwKQorCQl2YWx1ZSA9IC0xMDA7CisJaWYgKHZhbHVlID4gMTAwKQorCQl2YWx1ZSA9IDEwMDsKKwlpZiAocGRldi0+dHlwZSA8IDczMCkKKwkJc2F0dXJhdGlvbl9yZWdpc3RlciA9IFNBVFVSQVRJT05fTU9ERV9GT1JNQVRURVIyOworCWVsc2UKKwkJc2F0dXJhdGlvbl9yZWdpc3RlciA9IFNBVFVSQVRJT05fTU9ERV9GT1JNQVRURVIxOworCXJldHVybiBTZW5kQ29udHJvbE1zZyhTRVRfQ0hST01fQ1RMLCBzYXR1cmF0aW9uX3JlZ2lzdGVyLCAxKTsKIH0KIAogLyogQUdDICovCiAKLXN0YXRpYyBpbmxpbmUgaW50IHB3Y19zZXRfYWdjKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgbW9kZSwgaW50IHZhbHVlKQoraW50IHB3Y19zZXRfYWdjKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgbW9kZSwgaW50IHZhbHVlKQogewogCWNoYXIgYnVmOwogCWludCByZXQ7CkBAIC02NDMsNyArNjEwLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgcHdjX2dldF9hZ2Moc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCAqdmFsdWUpCitpbnQgcHdjX2dldF9hZ2Moc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCAqdmFsdWUpCiB7CiAJdW5zaWduZWQgY2hhciBidWY7CiAJaW50IHJldDsKQEAgLTY3Myw3ICs2NDAsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBwd2Nfc2V0X3NodXR0ZXJfc3BlZWQoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCBtb2RlLCBpbnQgdmFsdWUpCitpbnQgcHdjX3NldF9zaHV0dGVyX3NwZWVkKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgbW9kZSwgaW50IHZhbHVlKQogewogCWNoYXIgYnVmWzJdOwogCWludCBzcGVlZCwgcmV0OwpAQCAtNjkxLDIzICs2NTgsMTYgQEAKIAkJCXZhbHVlID0gMDsKIAkJaWYgKHZhbHVlID4gMHhmZmZmKQogCQkJdmFsdWUgPSAweGZmZmY7Ci0JCXN3aXRjaChwZGV2LT50eXBlKSB7Ci0JCWNhc2UgNjc1OgotCQljYXNlIDY4MDoKLQkJY2FzZSA2OTA6CisKKwkJaWYgKERFVklDRV9VU0VfQ09ERUMyKHBkZXYtPnR5cGUpKSB7CiAJCQkvKiBzcGVlZCByYW5nZXMgZnJvbSAweDAgdG8gMHgyOTAgKDY1NikgKi8KIAkJCXNwZWVkID0gKHZhbHVlIC8gMTAwKTsKIAkJCWJ1ZlsxXSA9IHNwZWVkID4+IDg7CiAJCQlidWZbMF0gPSBzcGVlZCAmIDB4ZmY7Ci0JCQlicmVhazsKLQkJY2FzZSA3MjA6Ci0JCWNhc2UgNzMwOgotCQljYXNlIDc0MDoKLQkJY2FzZSA3NTA6CisJCX0gZWxzZSBpZiAoREVWSUNFX1VTRV9DT0RFQzMocGRldi0+dHlwZSkpIHsKIAkJCS8qIHNwZWVkIHNlZW1zIHRvIHJhbmdlIGZyb20gMHgwIHRvIDB4ZmYgKi8KIAkJCWJ1ZlsxXSA9IDA7CiAJCQlidWZbMF0gPSB2YWx1ZSA+PiA4OwotCQkJYnJlYWs7CiAJCX0KIAogCQlyZXQgPSBTZW5kQ29udHJvbE1zZyhTRVRfTFVNX0NUTCwgUFJFU0VUX1NIVVRURVJfRk9STUFUVEVSLCAyKTsKQEAgLTcxNSw2ICs2NzUsMjUgQEAKIAlyZXR1cm4gcmV0OwogfQogCisvKiBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBleHBvcnRlZCB0byB2NGwxLCBzbyBvdXRwdXQgdmFsdWVzIGJldHdlZW4gMCAtPiAyNTYgKi8KK2ludCBwd2NfZ2V0X3NodXR0ZXJfc3BlZWQoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCAqdmFsdWUpCit7CisJdW5zaWduZWQgY2hhciBidWZbMl07CisJaW50IHJldDsKKworCXJldCA9IFJlY3ZDb250cm9sTXNnKEdFVF9TVEFUVVNfQ1RMLCBSRUFEX1NIVVRURVJfRk9STUFUVEVSLCAyKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwkqdmFsdWUgPSBidWZbMF0gKyAoYnVmWzFdIDw8IDgpOworCWlmIChERVZJQ0VfVVNFX0NPREVDMihwZGV2LT50eXBlKSkgeworCQkvKiBzcGVlZCByYW5nZXMgZnJvbSAweDAgdG8gMHgyOTAgKDY1NikgKi8KKwkJKnZhbHVlICo9IDI1Ni82NTY7CisJfSBlbHNlIGlmIChERVZJQ0VfVVNFX0NPREVDMyhwZGV2LT50eXBlKSkgeworCQkvKiBzcGVlZCBzZWVtcyB0byByYW5nZSBmcm9tIDB4MCB0byAweGZmICovCisJfQorCXJldHVybiAwOworfQorCiAKIC8qIFBPV0VSICovCiAKQEAgLTczNiwxOSArNzE1LDE5IEBACiAKIC8qIHByaXZhdGUgY2FsbHMgKi8KIAotc3RhdGljIGlubGluZSBpbnQgcHdjX3Jlc3RvcmVfdXNlcihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldikKK2ludCBwd2NfcmVzdG9yZV91c2VyKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KQogewogCWNoYXIgYnVmOyAvKiBkdW1teSAqLwogCXJldHVybiBTZW5kQ29udHJvbE1zZyhTRVRfU1RBVFVTX0NUTCwgUkVTVE9SRV9VU0VSX0RFRkFVTFRTX0ZPUk1BVFRFUiwgMCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHB3Y19zYXZlX3VzZXIoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpCitpbnQgcHdjX3NhdmVfdXNlcihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldikKIHsKIAljaGFyIGJ1ZjsgLyogZHVtbXkgKi8KIAlyZXR1cm4gU2VuZENvbnRyb2xNc2coU0VUX1NUQVRVU19DVEwsIFNBVkVfVVNFUl9ERUZBVUxUU19GT1JNQVRURVIsIDApOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBwd2NfcmVzdG9yZV9mYWN0b3J5KHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KQoraW50IHB3Y19yZXN0b3JlX2ZhY3Rvcnkoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpCiB7CiAJY2hhciBidWY7IC8qIGR1bW15ICovCiAJcmV0dXJuIFNlbmRDb250cm9sTXNnKFNFVF9TVEFUVVNfQ1RMLCBSRVNUT1JFX0ZBQ1RPUllfREVGQVVMVFNfRk9STUFUVEVSLCAwKTsKQEAgLTc2Niw3ICs3NDUsNyBAQAogICAqIDAzOiBtYW51YWwKICAgKiAwNDogYXV0bwogICAqLwotc3RhdGljIGlubGluZSBpbnQgcHdjX3NldF9hd2Ioc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCBtb2RlKQoraW50IHB3Y19zZXRfYXdiKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgbW9kZSkKIHsKIAljaGFyIGJ1ZjsKIAlpbnQgcmV0OwpAQCAtNzg2LDcgKzc2NSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHB3Y19nZXRfYXdiKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KQoraW50IHB3Y19nZXRfYXdiKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KQogewogCXVuc2lnbmVkIGNoYXIgYnVmOwogCWludCByZXQ7CkBAIC03OTgsNyArNzc3LDcgQEAKIAlyZXR1cm4gYnVmOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBwd2Nfc2V0X3JlZF9nYWluKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgdmFsdWUpCitpbnQgcHdjX3NldF9yZWRfZ2FpbihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IHZhbHVlKQogewogCXVuc2lnbmVkIGNoYXIgYnVmOwogCkBAIC04MTEsNyArNzkwLDcgQEAKIAlyZXR1cm4gU2VuZENvbnRyb2xNc2coU0VUX0NIUk9NX0NUTCwgUFJFU0VUX01BTlVBTF9SRURfR0FJTl9GT1JNQVRURVIsIDEpOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBwd2NfZ2V0X3JlZF9nYWluKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgKnZhbHVlKQoraW50IHB3Y19nZXRfcmVkX2dhaW4oc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCAqdmFsdWUpCiB7CiAJdW5zaWduZWQgY2hhciBidWY7CiAJaW50IHJldDsKQEAgLTgyNCw3ICs4MDMsNyBAQAogfQogCiAKLXN0YXRpYyBpbmxpbmUgaW50IHB3Y19zZXRfYmx1ZV9nYWluKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgdmFsdWUpCitpbnQgcHdjX3NldF9ibHVlX2dhaW4oc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCB2YWx1ZSkKIHsKIAl1bnNpZ25lZCBjaGFyIGJ1ZjsKIApAQCAtODM3LDcgKzgxNiw3IEBACiAJcmV0dXJuIFNlbmRDb250cm9sTXNnKFNFVF9DSFJPTV9DVEwsIFBSRVNFVF9NQU5VQUxfQkxVRV9HQUlOX0ZPUk1BVFRFUiwgMSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHB3Y19nZXRfYmx1ZV9nYWluKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgKnZhbHVlKQoraW50IHB3Y19nZXRfYmx1ZV9nYWluKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgKnZhbHVlKQogewogCXVuc2lnbmVkIGNoYXIgYnVmOwogCWludCByZXQ7CkBAIC04NTQsNyArODMzLDcgQEAKICAgIGludGVybmFsIHJlZC9ibHVlIGdhaW5zLCB3aGljaCBtYXkgYmUgZGlmZmVyZW50IGZyb20gdGhlIG1hbnVhbAogICAgZ2FpbnMgc2V0IG9yIHJlYWQgYWJvdmUuCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IHB3Y19yZWFkX3JlZF9nYWluKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgKnZhbHVlKQorc3RhdGljIGludCBwd2NfcmVhZF9yZWRfZ2FpbihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50ICp2YWx1ZSkKIHsKIAl1bnNpZ25lZCBjaGFyIGJ1ZjsKIAlpbnQgcmV0OwpAQCAtODY2LDcgKzg0NSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHB3Y19yZWFkX2JsdWVfZ2FpbihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50ICp2YWx1ZSkKK3N0YXRpYyBpbnQgcHdjX3JlYWRfYmx1ZV9nYWluKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgKnZhbHVlKQogewogCXVuc2lnbmVkIGNoYXIgYnVmOwogCWludCByZXQ7CkBAIC04NzksNyArODU4LDcgQEAKIH0KIAogCi1zdGF0aWMgaW5saW5lIGludCBwd2Nfc2V0X3diX3NwZWVkKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgc3BlZWQpCitzdGF0aWMgaW50IHB3Y19zZXRfd2Jfc3BlZWQoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCBzcGVlZCkKIHsKIAl1bnNpZ25lZCBjaGFyIGJ1ZjsKIApAQCAtODg4LDcgKzg2Nyw3IEBACiAJcmV0dXJuIFNlbmRDb250cm9sTXNnKFNFVF9DSFJPTV9DVEwsIEFXQl9DT05UUk9MX1NQRUVEX0ZPUk1BVFRFUiwgMSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHB3Y19nZXRfd2Jfc3BlZWQoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCAqdmFsdWUpCitzdGF0aWMgaW50IHB3Y19nZXRfd2Jfc3BlZWQoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCAqdmFsdWUpCiB7CiAJdW5zaWduZWQgY2hhciBidWY7CiAJaW50IHJldDsKQEAgLTkwMSw3ICs4ODAsNyBAQAogfQogCiAKLXN0YXRpYyBpbmxpbmUgaW50IHB3Y19zZXRfd2JfZGVsYXkoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCBkZWxheSkKK3N0YXRpYyBpbnQgcHdjX3NldF93Yl9kZWxheShzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IGRlbGF5KQogewogCXVuc2lnbmVkIGNoYXIgYnVmOwogCkBAIC05MTAsNyArODg5LDcgQEAKIAlyZXR1cm4gU2VuZENvbnRyb2xNc2coU0VUX0NIUk9NX0NUTCwgQVdCX0NPTlRST0xfREVMQVlfRk9STUFUVEVSLCAxKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgcHdjX2dldF93Yl9kZWxheShzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50ICp2YWx1ZSkKK3N0YXRpYyBpbnQgcHdjX2dldF93Yl9kZWxheShzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50ICp2YWx1ZSkKIHsKIAl1bnNpZ25lZCBjaGFyIGJ1ZjsKIAlpbnQgcmV0OwpAQCAtOTY1LDcgKzk0NCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHB3Y19zZXRfY29udG91cihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IGNvbnRvdXIpCitpbnQgcHdjX3NldF9jb250b3VyKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgY29udG91cikKIHsKIAl1bnNpZ25lZCBjaGFyIGJ1ZjsKIAlpbnQgcmV0OwpAQCAtOTkwLDcgKzk2OSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHB3Y19nZXRfY29udG91cihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50ICpjb250b3VyKQoraW50IHB3Y19nZXRfY29udG91cihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50ICpjb250b3VyKQogewogCXVuc2lnbmVkIGNoYXIgYnVmOwogCWludCByZXQ7CkBAIC0xMDEyLDcgKzk5MSw3IEBACiB9CiAKIAotc3RhdGljIGlubGluZSBpbnQgcHdjX3NldF9iYWNrbGlnaHQoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCBiYWNrbGlnaHQpCitpbnQgcHdjX3NldF9iYWNrbGlnaHQoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCBiYWNrbGlnaHQpCiB7CiAJdW5zaWduZWQgY2hhciBidWY7CiAKQEAgLTEwMjMsNyArMTAwMiw3IEBACiAJcmV0dXJuIFNlbmRDb250cm9sTXNnKFNFVF9MVU1fQ1RMLCBCQUNLX0xJR0hUX0NPTVBFTlNBVElPTl9GT1JNQVRURVIsIDEpOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBwd2NfZ2V0X2JhY2tsaWdodChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50ICpiYWNrbGlnaHQpCitpbnQgcHdjX2dldF9iYWNrbGlnaHQoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCAqYmFja2xpZ2h0KQogewogCWludCByZXQ7CiAJdW5zaWduZWQgY2hhciBidWY7CkBAIC0xMDMxLDEyICsxMDEwLDM1IEBACiAJcmV0ID0gUmVjdkNvbnRyb2xNc2coR0VUX0xVTV9DVEwsIEJBQ0tfTElHSFRfQ09NUEVOU0FUSU9OX0ZPUk1BVFRFUiwgMSk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7Ci0JKmJhY2tsaWdodCA9IGJ1ZjsKKwkqYmFja2xpZ2h0ID0gISFidWY7CisJcmV0dXJuIDA7Cit9CisKK2ludCBwd2Nfc2V0X2NvbG91cl9tb2RlKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgY29sb3VyKQoreworCXVuc2lnbmVkIGNoYXIgYnVmOworCisJaWYgKGNvbG91cikKKwkJYnVmID0gMHhmZjsKKwllbHNlCisJCWJ1ZiA9IDB4MDsKKwlyZXR1cm4gU2VuZENvbnRyb2xNc2coU0VUX0NIUk9NX0NUTCwgQ09MT1VSX01PREVfRk9STUFUVEVSLCAxKTsKK30KKworaW50IHB3Y19nZXRfY29sb3VyX21vZGUoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCAqY29sb3VyKQoreworCWludCByZXQ7CisJdW5zaWduZWQgY2hhciBidWY7CisKKwlyZXQgPSBSZWN2Q29udHJvbE1zZyhHRVRfQ0hST01fQ1RMLCBDT0xPVVJfTU9ERV9GT1JNQVRURVIsIDEpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCSpjb2xvdXIgPSAhIWJ1ZjsKIAlyZXR1cm4gMDsKIH0KIAogCi1zdGF0aWMgaW5saW5lIGludCBwd2Nfc2V0X2ZsaWNrZXIoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCBmbGlja2VyKQoraW50IHB3Y19zZXRfZmxpY2tlcihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IGZsaWNrZXIpCiB7CiAJdW5zaWduZWQgY2hhciBidWY7CiAKQEAgLTEwNDcsNyArMTA0OSw3IEBACiAJcmV0dXJuIFNlbmRDb250cm9sTXNnKFNFVF9MVU1fQ1RMLCBGTElDS0VSTEVTU19NT0RFX0ZPUk1BVFRFUiwgMSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHB3Y19nZXRfZmxpY2tlcihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50ICpmbGlja2VyKQoraW50IHB3Y19nZXRfZmxpY2tlcihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50ICpmbGlja2VyKQogewogCWludCByZXQ7CiAJdW5zaWduZWQgY2hhciBidWY7CkBAIC0xMDU1LDEyICsxMDU3LDExIEBACiAJcmV0ID0gUmVjdkNvbnRyb2xNc2coR0VUX0xVTV9DVEwsIEZMSUNLRVJMRVNTX01PREVfRk9STUFUVEVSLCAxKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKLQkqZmxpY2tlciA9IGJ1ZjsKKwkqZmxpY2tlciA9ICEhYnVmOwogCXJldHVybiAwOwogfQogCi0KLXN0YXRpYyBpbmxpbmUgaW50IHB3Y19zZXRfZHluYW1pY19ub2lzZShzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IG5vaXNlKQoraW50IHB3Y19zZXRfZHluYW1pY19ub2lzZShzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IG5vaXNlKQogewogCXVuc2lnbmVkIGNoYXIgYnVmOwogCkBAIC0xMDcyLDcgKzEwNzMsNyBAQAogCXJldHVybiBTZW5kQ29udHJvbE1zZyhTRVRfTFVNX0NUTCwgRFlOQU1JQ19OT0lTRV9DT05UUk9MX0ZPUk1BVFRFUiwgMSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHB3Y19nZXRfZHluYW1pY19ub2lzZShzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50ICpub2lzZSkKK2ludCBwd2NfZ2V0X2R5bmFtaWNfbm9pc2Uoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCAqbm9pc2UpCiB7CiAJaW50IHJldDsKIAl1bnNpZ25lZCBjaGFyIGJ1ZjsKQEAgLTEwODQsNyArMTA4NSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcHdjX21wdF9yZXNldChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IGZsYWdzKQorc3RhdGljIGludCBfcHdjX21wdF9yZXNldChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IGZsYWdzKQogewogCXVuc2lnbmVkIGNoYXIgYnVmOwogCkBAIC0xMDkyLDcgKzEwOTMsMTggQEAKIAlyZXR1cm4gU2VuZENvbnRyb2xNc2coU0VUX01QVF9DVEwsIFBUX1JFU0VUX0NPTlRST0xfRk9STUFUVEVSLCAxKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgcHdjX21wdF9zZXRfYW5nbGUoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCBwYW4sIGludCB0aWx0KQoraW50IHB3Y19tcHRfcmVzZXQoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCBmbGFncykKK3sKKwlpbnQgcmV0OworCXJldCA9IF9wd2NfbXB0X3Jlc2V0KHBkZXYsIGZsYWdzKTsKKwlpZiAocmV0ID49IDApIHsKKwkJcGRldi0+cGFuX2FuZ2xlID0gMDsKKwkJcGRldi0+dGlsdF9hbmdsZSA9IDA7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX3B3Y19tcHRfc2V0X2FuZ2xlKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgcGFuLCBpbnQgdGlsdCkKIHsKIAl1bnNpZ25lZCBjaGFyIGJ1Zls0XTsKIApAQCAtMTExMCw3ICsxMTIyLDM1IEBACiAJcmV0dXJuIFNlbmRDb250cm9sTXNnKFNFVF9NUFRfQ1RMLCBQVF9SRUxBVElWRV9DT05UUk9MX0ZPUk1BVFRFUiwgNCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHB3Y19tcHRfZ2V0X3N0YXR1cyhzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgc3RydWN0IHB3Y19tcHRfc3RhdHVzICpzdGF0dXMpCitpbnQgcHdjX21wdF9zZXRfYW5nbGUoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCBwYW4sIGludCB0aWx0KQoreworCWludCByZXQ7CisKKwkvKiBjaGVjayBhYnNvbHV0ZSByYW5nZXMgKi8KKwlpZiAocGFuICA8IHBkZXYtPmFuZ2xlX3JhbmdlLnBhbl9taW4gIHx8CisJICAgIHBhbiAgPiBwZGV2LT5hbmdsZV9yYW5nZS5wYW5fbWF4ICB8fAorCSAgICB0aWx0IDwgcGRldi0+YW5nbGVfcmFuZ2UudGlsdF9taW4gfHwKKwkgICAgdGlsdCA+IHBkZXYtPmFuZ2xlX3JhbmdlLnRpbHRfbWF4KQorCQlyZXR1cm4gLUVSQU5HRTsKKworCS8qIGdvIHRvIHJlbGF0aXZlIHJhbmdlLCBjaGVjayBhZ2FpbiAqLworCXBhbiAgLT0gcGRldi0+cGFuX2FuZ2xlOworCXRpbHQgLT0gcGRldi0+dGlsdF9hbmdsZTsKKwkvKiBhbmdsZXMgYXJlIHNwZWNpZmllZCBpbiBkZWdyZWVzICogMTAwLCB0aHVzIHRoZSBsaW1pdCA9IDM2MDAwICovCisJaWYgKHBhbiA8IC0zNjAwMCB8fCBwYW4gPiAzNjAwMCB8fCB0aWx0IDwgLTM2MDAwIHx8IHRpbHQgPiAzNjAwMCkKKwkJcmV0dXJuIC1FUkFOR0U7CisKKwlyZXQgPSBfcHdjX21wdF9zZXRfYW5nbGUocGRldiwgcGFuLCB0aWx0KTsKKwlpZiAocmV0ID49IDApIHsKKwkJcGRldi0+cGFuX2FuZ2xlICArPSBwYW47CisJCXBkZXYtPnRpbHRfYW5nbGUgKz0gdGlsdDsKKwl9CisJaWYgKHJldCA9PSAtRVBJUEUpIC8qIHN0YWxsIC0+IG91dCBvZiByYW5nZSAqLworCQlyZXQgPSAtRVJBTkdFOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcHdjX21wdF9nZXRfc3RhdHVzKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBzdHJ1Y3QgcHdjX21wdF9zdGF0dXMgKnN0YXR1cykKIHsKIAlpbnQgcmV0OwogCXVuc2lnbmVkIGNoYXIgYnVmWzVdOwpAQCAtMTE1MSw2ICsxMTkxLDI2IEBACiAgLyogRW5kIG9mIEFkZC1PbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KIAorLyogTGludXggMi41LnNvbWV0aGluZyBhbmQgMi42IHBhc3MgZGlyZWN0IHBvaW50ZXJzIHRvIGFyZ3VtZW50cyBvZgorICAgaW9jdGwoKSBjYWxscy4gV2l0aCAyLjQsIHlvdSBoYXZlIHRvIGRvIHRlZGlvdXMgY29weV9mcm9tX3VzZXIoKQorICAgYW5kIGNvcHlfdG9fdXNlcigpIGNhbGxzLiBXaXRoIHRoZXNlIG1hY3JvcyB3ZSBjaXJjdW12ZW50IHRoaXMsCisgICBhbmQgbGV0IG1lIG1haW50YWluIG9ubHkgb25lIHNvdXJjZSBmaWxlLiBUaGUgZnVuY3Rpb25hbGl0eSBpcworICAgZXhhY3RseSB0aGUgc2FtZSBvdGhlcndpc2UuCisgKi8KKworCisvKiBkZWZpbmUgbG9jYWwgdmFyaWFibGUgZm9yIGFyZyAqLworI2RlZmluZSBBUkdfREVGKEFSR190eXBlLCBBUkdfbmFtZSlcCisJQVJHX3R5cGUgKkFSR19uYW1lID0gYXJnOworLyogY29weSBhcmcgdG8gbG9jYWwgdmFyaWFibGUgKi8KKyNkZWZpbmUgQVJHX0lOKEFSR19uYW1lKSAvKiBub3RoaW5nICovCisvKiBhcmd1bWVudCBpdHNlbGYgKHJlZmVyZW5jZWQpICovCisjZGVmaW5lIEFSR1IoQVJHX25hbWUpICgqQVJHX25hbWUpCisvKiBhcmd1bWVudCBhZGRyZXNzICovCisjZGVmaW5lIEFSR0EoQVJHX25hbWUpIEFSR19uYW1lCisvKiBjb3B5IGxvY2FsIHZhcmlhYmxlIHRvIGFyZyAqLworI2RlZmluZSBBUkdfT1VUKEFSR19uYW1lKSAvKiBub3RoaW5nICovCisKIAogaW50IHB3Y19pb2N0bChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQogewpAQCAtMTE4MCwyMDYgKzEyNDAsMjQzIEBACiAKIAljYXNlIFZJRElPQ1BXQ1NDUVVBTDoKIAl7Ci0JCWludCAqcXVhbCA9IGFyZzsKKwkJQVJHX0RFRihpbnQsIHF1YWwpCiAKLQkJaWYgKCpxdWFsIDwgMCB8fCAqcXVhbCA+IDMpCisJCUFSR19JTihxdWFsKQorCQlpZiAoQVJHUihxdWFsKSA8IDAgfHwgQVJHUihxdWFsKSA+IDMpCiAJCQlyZXQgPSAtRUlOVkFMOwogCQllbHNlCi0JCQlyZXQgPSBwd2NfdHJ5X3ZpZGVvX21vZGUocGRldiwgcGRldi0+dmlldy54LCBwZGV2LT52aWV3LnksIHBkZXYtPnZmcmFtZXMsICpxdWFsLCBwZGV2LT52c25hcHNob3QpOworCQkJcmV0ID0gcHdjX3RyeV92aWRlb19tb2RlKHBkZXYsIHBkZXYtPnZpZXcueCwgcGRldi0+dmlldy55LCBwZGV2LT52ZnJhbWVzLCBBUkdSKHF1YWwpLCBwZGV2LT52c25hcHNob3QpOwogCQlpZiAocmV0ID49IDApCi0JCQlwZGV2LT52Y29tcHJlc3Npb24gPSAqcXVhbDsKKwkJCXBkZXYtPnZjb21wcmVzc2lvbiA9IEFSR1IocXVhbCk7CiAJCWJyZWFrOwogCX0KIAogCWNhc2UgVklESU9DUFdDR0NRVUFMOgogCXsKLQkJaW50ICpxdWFsID0gYXJnOwotCQkqcXVhbCA9IHBkZXYtPnZjb21wcmVzc2lvbjsKKwkJQVJHX0RFRihpbnQsIHF1YWwpCisKKwkJQVJHUihxdWFsKSA9IHBkZXYtPnZjb21wcmVzc2lvbjsKKwkJQVJHX09VVChxdWFsKQogCQlicmVhazsKIAl9CiAKIAljYXNlIFZJRElPQ1BXQ1BST0JFOgogCXsKLQkJc3RydWN0IHB3Y19wcm9iZSAqcHJvYmUgPSBhcmc7Ci0JCXN0cmNweShwcm9iZS0+bmFtZSwgcGRldi0+dmRldi0+bmFtZSk7Ci0JCXByb2JlLT50eXBlID0gcGRldi0+dHlwZTsKKwkJQVJHX0RFRihzdHJ1Y3QgcHdjX3Byb2JlLCBwcm9iZSkKKworCQlzdHJjcHkoQVJHUihwcm9iZSkubmFtZSwgcGRldi0+dmRldi0+bmFtZSk7CisJCUFSR1IocHJvYmUpLnR5cGUgPSBwZGV2LT50eXBlOworCQlBUkdfT1VUKHByb2JlKQogCQlicmVhazsKIAl9CiAKIAljYXNlIFZJRElPQ1BXQ0dTRVJJQUw6CiAJewotCQlzdHJ1Y3QgcHdjX3NlcmlhbCAqc2VyaWFsID0gYXJnOwotCQlzdHJjcHkoc2VyaWFsLT5zZXJpYWwsIHBkZXYtPnNlcmlhbCk7CisJCUFSR19ERUYoc3RydWN0IHB3Y19zZXJpYWwsIHNlcmlhbCkKKworCQlzdHJjcHkoQVJHUihzZXJpYWwpLnNlcmlhbCwgcGRldi0+c2VyaWFsKTsKKwkJQVJHX09VVChzZXJpYWwpCiAJCWJyZWFrOwogCX0KIAogCWNhc2UgVklESU9DUFdDU0FHQzoKIAl7Ci0JCWludCAqYWdjID0gYXJnOwotCQlpZiAocHdjX3NldF9hZ2MocGRldiwgKmFnYyA8IDAgPyAxIDogMCwgKmFnYykpCisJCUFSR19ERUYoaW50LCBhZ2MpCisKKwkJQVJHX0lOKGFnYykKKwkJaWYgKHB3Y19zZXRfYWdjKHBkZXYsIEFSR1IoYWdjKSA8IDAgPyAxIDogMCwgQVJHUihhZ2MpKSkKIAkJCXJldCA9IC1FSU5WQUw7CiAJCWJyZWFrOwogCX0KIAogCWNhc2UgVklESU9DUFdDR0FHQzoKIAl7Ci0JCWludCAqYWdjID0gYXJnOworCQlBUkdfREVGKGludCwgYWdjKQogCi0JCWlmIChwd2NfZ2V0X2FnYyhwZGV2LCBhZ2MpKQorCQlpZiAocHdjX2dldF9hZ2MocGRldiwgQVJHQShhZ2MpKSkKIAkJCXJldCA9IC1FSU5WQUw7CisJCUFSR19PVVQoYWdjKQogCQlicmVhazsKIAl9CiAKIAljYXNlIFZJRElPQ1BXQ1NTSFVUVEVSOgogCXsKLQkJaW50ICpzaHV0dGVyX3NwZWVkID0gYXJnOwotCQlyZXQgPSBwd2Nfc2V0X3NodXR0ZXJfc3BlZWQocGRldiwgKnNodXR0ZXJfc3BlZWQgPCAwID8gMSA6IDAsICpzaHV0dGVyX3NwZWVkKTsKKwkJQVJHX0RFRihpbnQsIHNodXR0ZXJfc3BlZWQpCisKKwkJQVJHX0lOKHNodXR0ZXJfc3BlZWQpCisJCXJldCA9IHB3Y19zZXRfc2h1dHRlcl9zcGVlZChwZGV2LCBBUkdSKHNodXR0ZXJfc3BlZWQpIDwgMCA/IDEgOiAwLCBBUkdSKHNodXR0ZXJfc3BlZWQpKTsKIAkJYnJlYWs7CiAJfQogCiAJY2FzZSBWSURJT0NQV0NTQVdCOgogCXsKLQkJc3RydWN0IHB3Y193aGl0ZWJhbGFuY2UgKndiID0gYXJnOworCQlBUkdfREVGKHN0cnVjdCBwd2Nfd2hpdGViYWxhbmNlLCB3YikKIAotCQlyZXQgPSBwd2Nfc2V0X2F3YihwZGV2LCB3Yi0+bW9kZSk7Ci0JCWlmIChyZXQgPj0gMCAmJiB3Yi0+bW9kZSA9PSBQV0NfV0JfTUFOVUFMKSB7Ci0JCQlwd2Nfc2V0X3JlZF9nYWluKHBkZXYsIHdiLT5tYW51YWxfcmVkKTsKLQkJCXB3Y19zZXRfYmx1ZV9nYWluKHBkZXYsIHdiLT5tYW51YWxfYmx1ZSk7CisJCUFSR19JTih3YikKKwkJcmV0ID0gcHdjX3NldF9hd2IocGRldiwgQVJHUih3YikubW9kZSk7CisJCWlmIChyZXQgPj0gMCAmJiBBUkdSKHdiKS5tb2RlID09IFBXQ19XQl9NQU5VQUwpIHsKKwkJCXB3Y19zZXRfcmVkX2dhaW4ocGRldiwgQVJHUih3YikubWFudWFsX3JlZCk7CisJCQlwd2Nfc2V0X2JsdWVfZ2FpbihwZGV2LCBBUkdSKHdiKS5tYW51YWxfYmx1ZSk7CiAJCX0KIAkJYnJlYWs7CiAJfQogCiAJY2FzZSBWSURJT0NQV0NHQVdCOgogCXsKLQkJc3RydWN0IHB3Y193aGl0ZWJhbGFuY2UgKndiID0gYXJnOworCQlBUkdfREVGKHN0cnVjdCBwd2Nfd2hpdGViYWxhbmNlLCB3YikKIAotCQltZW1zZXQod2IsIDAsIHNpemVvZihzdHJ1Y3QgcHdjX3doaXRlYmFsYW5jZSkpOwotCQl3Yi0+bW9kZSA9IHB3Y19nZXRfYXdiKHBkZXYpOwotCQlpZiAod2ItPm1vZGUgPCAwKQorCQltZW1zZXQoQVJHQSh3YiksIDAsIHNpemVvZihzdHJ1Y3QgcHdjX3doaXRlYmFsYW5jZSkpOworCQlBUkdSKHdiKS5tb2RlID0gcHdjX2dldF9hd2IocGRldik7CisJCWlmIChBUkdSKHdiKS5tb2RlIDwgMCkKIAkJCXJldCA9IC1FSU5WQUw7CiAJCWVsc2UgewotCQkJaWYgKHdiLT5tb2RlID09IFBXQ19XQl9NQU5VQUwpIHsKLQkJCQlyZXQgPSBwd2NfZ2V0X3JlZF9nYWluKHBkZXYsICZ3Yi0+bWFudWFsX3JlZCk7CisJCQlpZiAoQVJHUih3YikubW9kZSA9PSBQV0NfV0JfTUFOVUFMKSB7CisJCQkJcmV0ID0gcHdjX2dldF9yZWRfZ2FpbihwZGV2LCAmQVJHUih3YikubWFudWFsX3JlZCk7CiAJCQkJaWYgKHJldCA8IDApCiAJCQkJCWJyZWFrOwotCQkJCXJldCA9IHB3Y19nZXRfYmx1ZV9nYWluKHBkZXYsICZ3Yi0+bWFudWFsX2JsdWUpOworCQkJCXJldCA9IHB3Y19nZXRfYmx1ZV9nYWluKHBkZXYsICZBUkdSKHdiKS5tYW51YWxfYmx1ZSk7CiAJCQkJaWYgKHJldCA8IDApCiAJCQkJCWJyZWFrOwogCQkJfQotCQkJaWYgKHdiLT5tb2RlID09IFBXQ19XQl9BVVRPKSB7Ci0JCQkJcmV0ID0gcHdjX3JlYWRfcmVkX2dhaW4ocGRldiwgJndiLT5yZWFkX3JlZCk7CisJCQlpZiAoQVJHUih3YikubW9kZSA9PSBQV0NfV0JfQVVUTykgeworCQkJCXJldCA9IHB3Y19yZWFkX3JlZF9nYWluKHBkZXYsICZBUkdSKHdiKS5yZWFkX3JlZCk7CiAJCQkJaWYgKHJldCA8IDApCiAJCQkJCWJyZWFrOwotCQkJCXJldCA9IHB3Y19yZWFkX2JsdWVfZ2FpbihwZGV2LCAmd2ItPnJlYWRfYmx1ZSk7CisJCQkJcmV0ID1wd2NfcmVhZF9ibHVlX2dhaW4ocGRldiwgJkFSR1Iod2IpLnJlYWRfYmx1ZSk7CiAJCQkJaWYgKHJldCA8IDApCiAJCQkJCWJyZWFrOwogCQkJfQogCQl9CisJCUFSR19PVVQod2IpCiAJCWJyZWFrOwogCX0KIAogCWNhc2UgVklESU9DUFdDU0FXQlNQRUVEOgogCXsKLQkJc3RydWN0IHB3Y193Yl9zcGVlZCAqd2JzID0gYXJnOworCQlBUkdfREVGKHN0cnVjdCBwd2Nfd2Jfc3BlZWQsIHdicykKIAotCQlpZiAod2JzLT5jb250cm9sX3NwZWVkID4gMCkgewotCQkJcmV0ID0gcHdjX3NldF93Yl9zcGVlZChwZGV2LCB3YnMtPmNvbnRyb2xfc3BlZWQpOworCQlpZiAoQVJHUih3YnMpLmNvbnRyb2xfc3BlZWQgPiAwKSB7CisJCQlyZXQgPSBwd2Nfc2V0X3diX3NwZWVkKHBkZXYsIEFSR1Iod2JzKS5jb250cm9sX3NwZWVkKTsKIAkJfQotCQlpZiAod2JzLT5jb250cm9sX2RlbGF5ID4gMCkgewotCQkJcmV0ID0gcHdjX3NldF93Yl9kZWxheShwZGV2LCB3YnMtPmNvbnRyb2xfZGVsYXkpOworCQlpZiAoQVJHUih3YnMpLmNvbnRyb2xfZGVsYXkgPiAwKSB7CisJCQlyZXQgPSBwd2Nfc2V0X3diX2RlbGF5KHBkZXYsIEFSR1Iod2JzKS5jb250cm9sX2RlbGF5KTsKIAkJfQogCQlicmVhazsKIAl9CiAKIAljYXNlIFZJRElPQ1BXQ0dBV0JTUEVFRDoKIAl7Ci0JCXN0cnVjdCBwd2Nfd2Jfc3BlZWQgKndicyA9IGFyZzsKKwkJQVJHX0RFRihzdHJ1Y3QgcHdjX3diX3NwZWVkLCB3YnMpCiAKLQkJcmV0ID0gcHdjX2dldF93Yl9zcGVlZChwZGV2LCAmd2JzLT5jb250cm9sX3NwZWVkKTsKKwkJcmV0ID0gcHdjX2dldF93Yl9zcGVlZChwZGV2LCAmQVJHUih3YnMpLmNvbnRyb2xfc3BlZWQpOwogCQlpZiAocmV0IDwgMCkKIAkJCWJyZWFrOwotCQlyZXQgPSBwd2NfZ2V0X3diX2RlbGF5KHBkZXYsICZ3YnMtPmNvbnRyb2xfZGVsYXkpOworCQlyZXQgPSBwd2NfZ2V0X3diX2RlbGF5KHBkZXYsICZBUkdSKHdicykuY29udHJvbF9kZWxheSk7CiAJCWlmIChyZXQgPCAwKQogCQkJYnJlYWs7CisJCUFSR19PVVQod2JzKQogCQlicmVhazsKIAl9CiAKIAljYXNlIFZJRElPQ1BXQ1NMRUQ6CiAJewotCQlzdHJ1Y3QgcHdjX2xlZHMgKmxlZHMgPSBhcmc7Ci0JCXJldCA9IHB3Y19zZXRfbGVkcyhwZGV2LCBsZWRzLT5sZWRfb24sIGxlZHMtPmxlZF9vZmYpOwotCSAgICAJYnJlYWs7CisJCUFSR19ERUYoc3RydWN0IHB3Y19sZWRzLCBsZWRzKQorCisJCUFSR19JTihsZWRzKQorCQlyZXQgPSBwd2Nfc2V0X2xlZHMocGRldiwgQVJHUihsZWRzKS5sZWRfb24sIEFSR1IobGVkcykubGVkX29mZik7CisJCWJyZWFrOwogCX0KIAogCiAJY2FzZSBWSURJT0NQV0NHTEVEOgogCXsKLQkJc3RydWN0IHB3Y19sZWRzICpsZWRzID0gYXJnOwotCQlyZXQgPSBwd2NfZ2V0X2xlZHMocGRldiwgJmxlZHMtPmxlZF9vbiwgJmxlZHMtPmxlZF9vZmYpOworCQlBUkdfREVGKHN0cnVjdCBwd2NfbGVkcywgbGVkcykKKworCQlyZXQgPSBwd2NfZ2V0X2xlZHMocGRldiwgJkFSR1IobGVkcykubGVkX29uLCAmQVJHUihsZWRzKS5sZWRfb2ZmKTsKKwkJQVJHX09VVChsZWRzKQogCQlicmVhazsKIAl9CiAKIAljYXNlIFZJRElPQ1BXQ1NDT05UT1VSOgogCXsKLQkJaW50ICpjb250b3VyID0gYXJnOwotCQlyZXQgPSBwd2Nfc2V0X2NvbnRvdXIocGRldiwgKmNvbnRvdXIpOworCQlBUkdfREVGKGludCwgY29udG91cikKKworCQlBUkdfSU4oY29udG91cikKKwkJcmV0ID0gcHdjX3NldF9jb250b3VyKHBkZXYsIEFSR1IoY29udG91cikpOwogCQlicmVhazsKIAl9CiAKIAljYXNlIFZJRElPQ1BXQ0dDT05UT1VSOgogCXsKLQkJaW50ICpjb250b3VyID0gYXJnOwotCQlyZXQgPSBwd2NfZ2V0X2NvbnRvdXIocGRldiwgY29udG91cik7CisJCUFSR19ERUYoaW50LCBjb250b3VyKQorCisJCXJldCA9IHB3Y19nZXRfY29udG91cihwZGV2LCBBUkdBKGNvbnRvdXIpKTsKKwkJQVJHX09VVChjb250b3VyKQogCQlicmVhazsKIAl9CiAKIAljYXNlIFZJRElPQ1BXQ1NCQUNLTElHSFQ6CiAJewotCQlpbnQgKmJhY2tsaWdodCA9IGFyZzsKLQkJcmV0ID0gcHdjX3NldF9iYWNrbGlnaHQocGRldiwgKmJhY2tsaWdodCk7CisJCUFSR19ERUYoaW50LCBiYWNrbGlnaHQpCisKKwkJQVJHX0lOKGJhY2tsaWdodCkKKwkJcmV0ID0gcHdjX3NldF9iYWNrbGlnaHQocGRldiwgQVJHUihiYWNrbGlnaHQpKTsKIAkJYnJlYWs7CiAJfQogCiAJY2FzZSBWSURJT0NQV0NHQkFDS0xJR0hUOgogCXsKLQkJaW50ICpiYWNrbGlnaHQgPSBhcmc7Ci0JCXJldCA9IHB3Y19nZXRfYmFja2xpZ2h0KHBkZXYsIGJhY2tsaWdodCk7CisJCUFSR19ERUYoaW50LCBiYWNrbGlnaHQpCisKKwkJcmV0ID0gcHdjX2dldF9iYWNrbGlnaHQocGRldiwgQVJHQShiYWNrbGlnaHQpKTsKKwkJQVJHX09VVChiYWNrbGlnaHQpCiAJCWJyZWFrOwogCX0KIAogCWNhc2UgVklESU9DUFdDU0ZMSUNLRVI6CiAJewotCQlpbnQgKmZsaWNrZXIgPSBhcmc7Ci0JCXJldCA9IHB3Y19zZXRfZmxpY2tlcihwZGV2LCAqZmxpY2tlcik7CisJCUFSR19ERUYoaW50LCBmbGlja2VyKQorCisJCUFSR19JTihmbGlja2VyKQorCQlyZXQgPSBwd2Nfc2V0X2ZsaWNrZXIocGRldiwgQVJHUihmbGlja2VyKSk7CiAJCWJyZWFrOwogCX0KIAogCWNhc2UgVklESU9DUFdDR0ZMSUNLRVI6CiAJewotCQlpbnQgKmZsaWNrZXIgPSBhcmc7Ci0JCXJldCA9IHB3Y19nZXRfZmxpY2tlcihwZGV2LCBmbGlja2VyKTsKKwkJQVJHX0RFRihpbnQsIGZsaWNrZXIpCisKKwkJcmV0ID0gcHdjX2dldF9mbGlja2VyKHBkZXYsIEFSR0EoZmxpY2tlcikpOworCQlBUkdfT1VUKGZsaWNrZXIpCiAJCWJyZWFrOwogCX0KIAogCWNhc2UgVklESU9DUFdDU0RZTk5PSVNFOgogCXsKLQkJaW50ICpkeW5ub2lzZSA9IGFyZzsKLQkJcmV0ID0gcHdjX3NldF9keW5hbWljX25vaXNlKHBkZXYsICpkeW5ub2lzZSk7CisJCUFSR19ERUYoaW50LCBkeW5ub2lzZSkKKworCQlBUkdfSU4oZHlubm9pc2UpCisJCXJldCA9IHB3Y19zZXRfZHluYW1pY19ub2lzZShwZGV2LCBBUkdSKGR5bm5vaXNlKSk7CiAJCWJyZWFrOwogCX0KIAogCWNhc2UgVklESU9DUFdDR0RZTk5PSVNFOgogCXsKLQkJaW50ICpkeW5ub2lzZSA9IGFyZzsKLQkJcmV0ID0gcHdjX2dldF9keW5hbWljX25vaXNlKHBkZXYsIGR5bm5vaXNlKTsKKwkJQVJHX0RFRihpbnQsIGR5bm5vaXNlKQorCisJCXJldCA9IHB3Y19nZXRfZHluYW1pY19ub2lzZShwZGV2LCBBUkdBKGR5bm5vaXNlKSk7CisJCUFSR19PVVQoZHlubm9pc2UpOwogCQlicmVhazsKIAl9CiAKIAljYXNlIFZJRElPQ1BXQ0dSRUFMU0laRToKIAl7Ci0JCXN0cnVjdCBwd2NfaW1hZ2VzaXplICpzaXplID0gYXJnOwotCQlzaXplLT53aWR0aCA9IHBkZXYtPmltYWdlLng7Ci0JCXNpemUtPmhlaWdodCA9IHBkZXYtPmltYWdlLnk7CisJCUFSR19ERUYoc3RydWN0IHB3Y19pbWFnZXNpemUsIHNpemUpCisKKwkJQVJHUihzaXplKS53aWR0aCA9IHBkZXYtPmltYWdlLng7CisJCUFSR1Ioc2l6ZSkuaGVpZ2h0ID0gcGRldi0+aW1hZ2UueTsKKwkJQVJHX09VVChzaXplKQogCQlicmVhazsKIAl9CiAKQEAgLTEzODcsMTQgKzE0ODQsMTAgQEAKIAl7CiAJCWlmIChwZGV2LT5mZWF0dXJlcyAmIEZFQVRVUkVfTU9UT1JfUEFOVElMVCkKIAkJewotCQkJaW50ICpmbGFncyA9IGFyZzsKKwkJCUFSR19ERUYoaW50LCBmbGFncykKIAotCQkJcmV0ID0gcHdjX21wdF9yZXNldChwZGV2LCAqZmxhZ3MpOwotCQkJaWYgKHJldCA+PSAwKQotCQkJewotCQkJCXBkZXYtPnBhbl9hbmdsZSA9IDA7Ci0JCQkJcGRldi0+dGlsdF9hbmdsZSA9IDA7Ci0JCQl9CisJCQlBUkdfSU4oZmxhZ3MpCisJCQlyZXQgPSBwd2NfbXB0X3Jlc2V0KHBkZXYsIEFSR1IoZmxhZ3MpKTsKIAkJfQogCQllbHNlCiAJCXsKQEAgLTE0MDcsOCArMTUwMCwxMCBAQAogCXsKIAkJaWYgKHBkZXYtPmZlYXR1cmVzICYgRkVBVFVSRV9NT1RPUl9QQU5USUxUKQogCQl7Ci0JCQlzdHJ1Y3QgcHdjX21wdF9yYW5nZSAqcmFuZ2UgPSBhcmc7Ci0JCQkqcmFuZ2UgPSBwZGV2LT5hbmdsZV9yYW5nZTsKKwkJCUFSR19ERUYoc3RydWN0IHB3Y19tcHRfcmFuZ2UsIHJhbmdlKQorCisJCQlBUkdSKHJhbmdlKSA9IHBkZXYtPmFuZ2xlX3JhbmdlOworCQkJQVJHX09VVChyYW5nZSkKIAkJfQogCQllbHNlCiAJCXsKQEAgLTE0MjMsNDggKzE1MTgsMjMgQEAKIAogCQlpZiAocGRldi0+ZmVhdHVyZXMgJiBGRUFUVVJFX01PVE9SX1BBTlRJTFQpCiAJCXsKLQkJCXN0cnVjdCBwd2NfbXB0X2FuZ2xlcyAqYW5nbGVzID0gYXJnOworCQkJQVJHX0RFRihzdHJ1Y3QgcHdjX21wdF9hbmdsZXMsIGFuZ2xlcykKKworCQkJQVJHX0lOKGFuZ2xlcykKIAkJCS8qIFRoZSBjYW1lcmEgY2FuIG9ubHkgc2V0IHJlbGF0aXZlIGFuZ2xlcywgc28KIAkJCSAgIGRvIHNvbWUgY2FsY3VsYXRpb25zIHdoZW4gZ2V0dGluZyBhbiBhYnNvbHV0ZSBhbmdsZSAuCiAJCQkgKi8KLQkJCWlmIChhbmdsZXMtPmFic29sdXRlKQorCQkJaWYgKEFSR1IoYW5nbGVzKS5hYnNvbHV0ZSkKIAkJCXsKLQkJCQluZXdfcGFuICA9IGFuZ2xlcy0+cGFuOwotCQkJCW5ld190aWx0ID0gYW5nbGVzLT50aWx0OworCQkJCW5ld19wYW4gID0gQVJHUihhbmdsZXMpLnBhbjsKKwkJCQluZXdfdGlsdCA9IEFSR1IoYW5nbGVzKS50aWx0OwogCQkJfQogCQkJZWxzZQogCQkJewotCQkJCW5ld19wYW4gID0gcGRldi0+cGFuX2FuZ2xlICArIGFuZ2xlcy0+cGFuOwotCQkJCW5ld190aWx0ID0gcGRldi0+dGlsdF9hbmdsZSArIGFuZ2xlcy0+dGlsdDsKKwkJCQluZXdfcGFuICA9IHBkZXYtPnBhbl9hbmdsZSAgKyBBUkdSKGFuZ2xlcykucGFuOworCQkJCW5ld190aWx0ID0gcGRldi0+dGlsdF9hbmdsZSArIEFSR1IoYW5nbGVzKS50aWx0OwogCQkJfQotCQkJLyogY2hlY2sgYWJzb2x1dGUgcmFuZ2VzICovCi0JCQlpZiAobmV3X3BhbiAgPCBwZGV2LT5hbmdsZV9yYW5nZS5wYW5fbWluICB8fAotCQkJICAgIG5ld19wYW4gID4gcGRldi0+YW5nbGVfcmFuZ2UucGFuX21heCAgfHwKLQkJCSAgICBuZXdfdGlsdCA8IHBkZXYtPmFuZ2xlX3JhbmdlLnRpbHRfbWluIHx8Ci0JCQkgICAgbmV3X3RpbHQgPiBwZGV2LT5hbmdsZV9yYW5nZS50aWx0X21heCkKLQkJCXsKLQkJCQlyZXQgPSAtRVJBTkdFOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCS8qIGdvIHRvIHJlbGF0aXZlIHJhbmdlLCBjaGVjayBhZ2FpbiAqLwotCQkJCW5ld19wYW4gIC09IHBkZXYtPnBhbl9hbmdsZTsKLQkJCQluZXdfdGlsdCAtPSBwZGV2LT50aWx0X2FuZ2xlOwotCQkJCS8qIGFuZ2xlcyBhcmUgc3BlY2lmaWVkIGluIGRlZ3JlZXMgKiAxMDAsIHRodXMgdGhlIGxpbWl0ID0gMzYwMDAgKi8KLQkJCQlpZiAobmV3X3BhbiA8IC0zNjAwMCB8fCBuZXdfcGFuID4gMzYwMDAgfHwgbmV3X3RpbHQgPCAtMzYwMDAgfHwgbmV3X3RpbHQgPiAzNjAwMCkKLQkJCQkJcmV0ID0gLUVSQU5HRTsKLQkJCX0KLQkJCWlmIChyZXQgPT0gMCkgLyogbm8gZXJyb3JzIHNvIGZhciAqLwotCQkJewotCQkJCXJldCA9IHB3Y19tcHRfc2V0X2FuZ2xlKHBkZXYsIG5ld19wYW4sIG5ld190aWx0KTsKLQkJCQlpZiAocmV0ID49IDApCi0JCQkJewotCQkJCQlwZGV2LT5wYW5fYW5nbGUgICs9IG5ld19wYW47Ci0JCQkJCXBkZXYtPnRpbHRfYW5nbGUgKz0gbmV3X3RpbHQ7Ci0JCQkJfQotCQkJCWlmIChyZXQgPT0gLUVQSVBFKSAvKiBzdGFsbCAtPiBvdXQgb2YgcmFuZ2UgKi8KLQkJCQkJcmV0ID0gLUVSQU5HRTsKLQkJCX0KKwkJCXJldCA9IHB3Y19tcHRfc2V0X2FuZ2xlKHBkZXYsIG5ld19wYW4sIG5ld190aWx0KTsKIAkJfQogCQllbHNlCiAJCXsKQEAgLTE0NzgsMTEgKzE1NDgsMTIgQEAKIAogCQlpZiAocGRldi0+ZmVhdHVyZXMgJiBGRUFUVVJFX01PVE9SX1BBTlRJTFQpCiAJCXsKLQkJCXN0cnVjdCBwd2NfbXB0X2FuZ2xlcyAqYW5nbGVzID0gYXJnOworCQkJQVJHX0RFRihzdHJ1Y3QgcHdjX21wdF9hbmdsZXMsIGFuZ2xlcykKIAotCQkJYW5nbGVzLT5hYnNvbHV0ZSA9IDE7Ci0JCQlhbmdsZXMtPnBhbiAgPSBwZGV2LT5wYW5fYW5nbGU7Ci0JCQlhbmdsZXMtPnRpbHQgPSBwZGV2LT50aWx0X2FuZ2xlOworCQkJQVJHUihhbmdsZXMpLmFic29sdXRlID0gMTsKKwkJCUFSR1IoYW5nbGVzKS5wYW4gID0gcGRldi0+cGFuX2FuZ2xlOworCQkJQVJHUihhbmdsZXMpLnRpbHQgPSBwZGV2LT50aWx0X2FuZ2xlOworCQkJQVJHX09VVChhbmdsZXMpCiAJCX0KIAkJZWxzZQogCQl7CkBAIC0xNDk1LDggKzE1NjYsMTAgQEAKIAl7CiAJCWlmIChwZGV2LT5mZWF0dXJlcyAmIEZFQVRVUkVfTU9UT1JfUEFOVElMVCkKIAkJewotCQkJc3RydWN0IHB3Y19tcHRfc3RhdHVzICpzdGF0dXMgPSBhcmc7Ci0JCQlyZXQgPSBwd2NfbXB0X2dldF9zdGF0dXMocGRldiwgc3RhdHVzKTsKKwkJCUFSR19ERUYoc3RydWN0IHB3Y19tcHRfc3RhdHVzLCBzdGF0dXMpCisKKwkJCXJldCA9IHB3Y19tcHRfZ2V0X3N0YXR1cyhwZGV2LCBBUkdBKHN0YXR1cykpOworCQkJQVJHX09VVChzdGF0dXMpCiAJCX0KIAkJZWxzZQogCQl7CkBAIC0xNTA3LDIyICsxNTgwLDI0IEBACiAKIAljYXNlIFZJRElPQ1BXQ0dWSURDTUQ6CiAJewotCQlzdHJ1Y3QgcHdjX3ZpZGVvX2NvbW1hbmQgKmNtZCA9IGFyZzsKKwkJQVJHX0RFRihzdHJ1Y3QgcHdjX3ZpZGVvX2NvbW1hbmQsIGNtZCk7CiAKLQkJY21kLT50eXBlID0gcGRldi0+dHlwZTsKLQkJY21kLT5yZWxlYXNlID0gcGRldi0+cmVsZWFzZTsKLQkJY21kLT5jb21tYW5kX2xlbiA9IHBkZXYtPmNtZF9sZW47Ci0JCW1lbWNweSgmY21kLT5jb21tYW5kX2J1ZiwgcGRldi0+Y21kX2J1ZiwgcGRldi0+Y21kX2xlbik7Ci0JCWNtZC0+YmFuZGxlbmd0aCA9IHBkZXYtPnZiYW5kbGVuZ3RoOwotCQljbWQtPmZyYW1lX3NpemUgPSBwZGV2LT5mcmFtZV9zaXplOworCQlBUkdSKGNtZCkudHlwZSA9IHBkZXYtPnR5cGU7CisJCUFSR1IoY21kKS5yZWxlYXNlID0gcGRldi0+cmVsZWFzZTsKKwkJQVJHUihjbWQpLmNvbW1hbmRfbGVuID0gcGRldi0+Y21kX2xlbjsKKwkJbWVtY3B5KCZBUkdSKGNtZCkuY29tbWFuZF9idWYsIHBkZXYtPmNtZF9idWYsIHBkZXYtPmNtZF9sZW4pOworCQlBUkdSKGNtZCkuYmFuZGxlbmd0aCA9IHBkZXYtPnZiYW5kbGVuZ3RoOworCQlBUkdSKGNtZCkuZnJhbWVfc2l6ZSA9IHBkZXYtPmZyYW1lX3NpemU7CisJCUFSR19PVVQoY21kKQogCQlicmVhazsKIAl9CiAgICAgICAgLyoKIAljYXNlIFZJRElPQ1BXQ0dWSURUQUJMRToKIAl7Ci0JCXN0cnVjdCBwd2NfdGFibGVfaW5pdF9idWZmZXIgKnRhYmxlID0gYXJnOwotCQl0YWJsZS0+bGVuID0gcGRldi0+Y21kX2xlbjsKLQkJbWVtY3B5KCZ0YWJsZS0+YnVmZmVyLCBwZGV2LT5kZWNvbXByZXNzX2RhdGEsIHBkZXYtPmRlY29tcHJlc3Nvci0+dGFibGVfc2l6ZSk7CisJCUFSR19ERUYoc3RydWN0IHB3Y190YWJsZV9pbml0X2J1ZmZlciwgdGFibGUpOworCQlBUkdSKHRhYmxlKS5sZW4gPSBwZGV2LT5jbWRfbGVuOworCQltZW1jcHkoJkFSR1IodGFibGUpLmJ1ZmZlciwgcGRldi0+ZGVjb21wcmVzc19kYXRhLCBwZGV2LT5kZWNvbXByZXNzb3ItPnRhYmxlX3NpemUpOworCQlBUkdfT1VUKHRhYmxlKQogCQlicmVhazsKIAl9CiAJKi8KQEAgLTE1MzgsNCArMTYxMyw0IEBACiB9CiAKIAotCisvKiB2aW06IHNldCBjaW5vcHRpb25zPSBmb3JtYXRvcHRpb25zPWNyb3FsIGNpbmRlbnQgc2hpZnR3aWR0aD04IHRhYnN0b3A9ODogKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1kZWMxLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtZGVjMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyOTU5M2YKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtZGVjMS5jCkBAIC0wLDAgKzEsNTAgQEAKKy8qIExpbnV4IGRyaXZlciBmb3IgUGhpbGlwcyB3ZWJjYW0KKyAgIERlY29tcHJlc3Npb24gZm9yIGNoaXBzZXQgdmVyc2lvbiAxCisgICAoQykgMjAwNC0yMDA2IEx1YyBTYWlsbGFyZCAobHVjQHNhaWxsYXJkLm9yZykKKworICAgTk9URTogdGhpcyB2ZXJzaW9uIG9mIHB3YyBpcyBhbiB1bm9mZmljaWFsIChtb2RpZmllZCkgcmVsZWFzZSBvZiBwd2MgJiBwY3d4CisgICBkcml2ZXIgYW5kIHRodXMgbWF5IGhhdmUgYnVncyB0aGF0IGFyZSBub3QgcHJlc2VudCBpbiB0aGUgb3JpZ2luYWwgdmVyc2lvbi4KKyAgIFBsZWFzZSBzZW5kIGJ1ZyByZXBvcnRzIGFuZCBzdXBwb3J0IHJlcXVlc3RzIHRvIDxsdWNAc2FpbGxhcmQub3JnPi4KKyAgIFRoZSBkZWNvbXByZXNzaW9uIHJvdXRpbmVzIGhhdmUgYmVlbiBpbXBsZW1lbnRlZCBieSByZXZlcnNlLWVuZ2luZWVyaW5nIHRoZQorICAgTmVtb3NvZnQgYmluYXJ5IHB3Y3ggbW9kdWxlLiBDYXZlYXQgZW1wdG9yLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyovCisKKworCisjaW5jbHVkZSAicHdjLWRlYzEuaCIKKworCit2b2lkIHB3Y19kZWMxX2luaXQoaW50IHR5cGUsIGludCByZWxlYXNlLCB2b2lkICpidWZmZXIsIHZvaWQgKnRhYmxlKQoreworCit9CisKK3ZvaWQgcHdjX2RlYzFfZXhpdCh2b2lkKQoreworCisKKworfQorCitpbnQgcHdjX2RlYzFfYWxsb2Moc3RydWN0IHB3Y19kZXZpY2UgKnB3YykKK3sKKwlwd2MtPmRlY29tcHJlc3NfZGF0YSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwd2NfZGVjMV9wcml2YXRlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHB3Yy0+ZGVjb21wcmVzc19kYXRhID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtZGVjMS5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLWRlYzEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjYyZGRjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLWRlYzEuaApAQCAtMCwwICsxLDQzIEBACisvKiBMaW51eCBkcml2ZXIgZm9yIFBoaWxpcHMgd2ViY2FtCisgICAoQykgMjAwNC0yMDA2IEx1YyBTYWlsbGFyZCAobHVjQHNhaWxsYXJkLm9yZykKKworICAgTk9URTogdGhpcyB2ZXJzaW9uIG9mIHB3YyBpcyBhbiB1bm9mZmljaWFsIChtb2RpZmllZCkgcmVsZWFzZSBvZiBwd2MgJiBwY3d4CisgICBkcml2ZXIgYW5kIHRodXMgbWF5IGhhdmUgYnVncyB0aGF0IGFyZSBub3QgcHJlc2VudCBpbiB0aGUgb3JpZ2luYWwgdmVyc2lvbi4KKyAgIFBsZWFzZSBzZW5kIGJ1ZyByZXBvcnRzIGFuZCBzdXBwb3J0IHJlcXVlc3RzIHRvIDxsdWNAc2FpbGxhcmQub3JnPi4KKyAgIFRoZSBkZWNvbXByZXNzaW9uIHJvdXRpbmVzIGhhdmUgYmVlbiBpbXBsZW1lbnRlZCBieSByZXZlcnNlLWVuZ2luZWVyaW5nIHRoZQorICAgTmVtb3NvZnQgYmluYXJ5IHB3Y3ggbW9kdWxlLiBDYXZlYXQgZW1wdG9yLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyovCisKKworCisjaWZuZGVmIFBXQ19ERUMxX0gKKyNkZWZpbmUgUFdDX0RFQzFfSAorCisjaW5jbHVkZSAicHdjLmgiCisKK3N0cnVjdCBwd2NfZGVjMV9wcml2YXRlCit7CisJaW50IHZlcnNpb247CisKK307CisKK2ludCAgcHdjX2RlYzFfYWxsb2Moc3RydWN0IHB3Y19kZXZpY2UgKnB3Yyk7Cit2b2lkIHB3Y19kZWMxX2luaXQoaW50IHR5cGUsIGludCByZWxlYXNlLCB2b2lkICpidWZmZXIsIHZvaWQgKnByaXZhdGVfZGF0YSk7Cit2b2lkIHB3Y19kZWMxX2V4aXQodm9pZCk7CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtZGVjMjMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1kZWMyMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllMmQ5MWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtZGVjMjMuYwpAQCAtMCwwICsxLDk0MSBAQAorLyogTGludXggZHJpdmVyIGZvciBQaGlsaXBzIHdlYmNhbQorICAgRGVjb21wcmVzc2lvbiBmb3IgY2hpcHNldCB2ZXJzaW9uIDIgZXQgMworICAgKEMpIDIwMDQtMjAwNiAgTHVjIFNhaWxsYXJkIChsdWNAc2FpbGxhcmQub3JnKQorCisgICBOT1RFOiB0aGlzIHZlcnNpb24gb2YgcHdjIGlzIGFuIHVub2ZmaWNpYWwgKG1vZGlmaWVkKSByZWxlYXNlIG9mIHB3YyAmIHBjd3gKKyAgIGRyaXZlciBhbmQgdGh1cyBtYXkgaGF2ZSBidWdzIHRoYXQgYXJlIG5vdCBwcmVzZW50IGluIHRoZSBvcmlnaW5hbCB2ZXJzaW9uLgorICAgUGxlYXNlIHNlbmQgYnVnIHJlcG9ydHMgYW5kIHN1cHBvcnQgcmVxdWVzdHMgdG8gPGx1Y0BzYWlsbGFyZC5vcmc+LgorICAgVGhlIGRlY29tcHJlc3Npb24gcm91dGluZXMgaGF2ZSBiZWVuIGltcGxlbWVudGVkIGJ5IHJldmVyc2UtZW5naW5lZXJpbmcgdGhlCisgICBOZW1vc29mdCBiaW5hcnkgcHdjeCBtb2R1bGUuIENhdmVhdCBlbXB0b3IuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorCisqLworCisjaW5jbHVkZSAicHdjLXRpbW9uLmgiCisjaW5jbHVkZSAicHdjLWtpYXJhLmgiCisjaW5jbHVkZSAicHdjLWRlYzIzLmgiCisjaW5jbHVkZSA8bWVkaWEvcHdjLWlvY3RsLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKworLyoKKyAqIFVTRV9MT09LVVBfVEFCTEVfVE9fQ0xBTVAKKyAqICAgMDogdXNlIGEgQyB2ZXJzaW9uIG9mIHRoaXMgdGVzdHM6ICB7ICBhPDA/MDooYT4yNTU/MjU1OmEpIH0KKyAqICAgMTogdXNlIGEgZmFzdGVyIGxvb2t1cCB0YWJsZSBmb3IgY3B1IHdpdGggYSBiaWcgY2FjaGUgKGludGVsKQorICovCisjZGVmaW5lIFVTRV9MT09LVVBfVEFCTEVfVE9fQ0xBTVAJMQorLyoKKyAqIFVOUk9MTF9MT09QX0ZPUl9DT1BZSU5HX0JMT0NLCisgKiAgIDA6IHVzZSBhIGxvb3AgZm9yIGEgc21hbGxlciBjb2RlIChidXQgbGl0dGxlIHNsb3dlcikKKyAqICAgMTogd2hlbiB1bnJvbGxpbmcgdGhlIGxvb3AsIGdjYyBwcm9kdWNlcyBzb21lIGZhc3RlciBjb2RlIChwZXJoYXBzIG9ubHkKKyAqICAgdmFsaWQgZm9yIGludGVsIHByb2Nlc3NvciBjbGFzcykuIEFjdGl2YXRpbmcgdGhpcyBvcHRpb24sIGF1dG9tYXRpY2FseQorICogICBhY3RpdmF0ZSBVU0VfTE9PS1VQX1RBQkxFX1RPX0NMQU1QCisgKi8KKyNkZWZpbmUgVU5ST0xMX0xPT1BfRk9SX0NPUFkJCTEKKyNpZiBVTlJPTExfTE9PUF9GT1JfQ09QWQorIyB1bmRlZiBVU0VfTE9PS1VQX1RBQkxFX1RPX0NMQU1QCisjIGRlZmluZSBVU0VfTE9PS1VQX1RBQkxFX1RPX0NMQU1QIDEKKyNlbmRpZgorCisvKgorICogRU5BQkxFX0JBWUVSX0RFQ09ERVIKKyAqICAgMDogYmF5ZXIgZGVjb2RlciBpcyBub3QgYnVpbGQgKHNhdmUgc29tZSBzcGFjZSkKKyAqICAgMTogYmF5ZXIgZGVjb2RlciBpcyBidWlsZCBhbmQgY2FuIGJlIHVzZWQKKyAqLworI2RlZmluZSBFTkFCTEVfQkFZRVJfREVDT0RFUiAwCisKK3N0YXRpYyB2b2lkIGJ1aWxkX3N1YmJsb2NrX3BhdHRlcm4oc3RydWN0IHB3Y19kZWMyM19wcml2YXRlICpwZGVjKQoreworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgaW5pdGlhbF92YWx1ZXNbMTJdID0geworCQktMHg1MjY1MDAsIC0weDIyMTIwMCwgMHgyMjEyMDAsIDB4NTI2NTAwLAorCQkJICAgLTB4M2RlMjAwLCAweDNkZTIwMCwKKwkJLTB4NmRiNDgwLCAtMHgyZDVkMDAsIDB4MmQ1ZDAwLCAweDZkYjQ4MCwKKwkJCSAgIC0weDEyYzIwMCwgMHgxMmMyMDAKKworCX07CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB2YWx1ZXNfZGVyaXZhdGVkWzEyXSA9IHsKKwkJMHhhNGNhLCAweDQ0MjQsIC0weDQ0MjQsIC0weGE0Y2EsCisJCQkweDdiYzQsIC0weDdiYzQsCisJCTB4ZGI2OSwgMHg1YWJhLCAtMHg1YWJhLCAtMHhkYjY5LAorCQkJMHgyNTg0LCAtMHgyNTg0CisJfTsKKwl1bnNpZ25lZCBpbnQgdGVtcF92YWx1ZXNbMTJdOworCWludCBpLCBqOworCisJbWVtY3B5KHRlbXBfdmFsdWVzLCBpbml0aWFsX3ZhbHVlcywgc2l6ZW9mKGluaXRpYWxfdmFsdWVzKSk7CisJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisJCWZvciAoaiA9IDA7IGogPCAxMjsgaisrKSB7CisJCQlwZGVjLT50YWJsZV9zdWJibG9ja1tpXVtqXSA9IHRlbXBfdmFsdWVzW2pdOworCQkJdGVtcF92YWx1ZXNbal0gKz0gdmFsdWVzX2Rlcml2YXRlZFtqXTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgYnVpbGRfYml0X3Bvd2VybWFza190YWJsZShzdHJ1Y3QgcHdjX2RlYzIzX3ByaXZhdGUgKnBkZWMpCit7CisJdW5zaWduZWQgY2hhciAqcDsKKwl1bnNpZ25lZCBpbnQgYml0LCBieXRlLCBtYXNrLCB2YWw7CisJdW5zaWduZWQgaW50IGJpdHBvd2VyID0gMTsKKworCWZvciAoYml0ID0gMDsgYml0IDwgODsgYml0KyspIHsKKwkJbWFzayA9IGJpdHBvd2VyIC0gMTsKKwkJcCA9IHBkZWMtPnRhYmxlX2JpdHBvd2VybWFza1tiaXRdOworCQlmb3IgKGJ5dGUgPSAwOyBieXRlIDwgMjU2OyBieXRlKyspIHsKKwkJCXZhbCA9IChieXRlICYgbWFzayk7CisJCQlpZiAoYnl0ZSAmIGJpdHBvd2VyKQorCQkJCXZhbCA9IC12YWw7CisJCQkqcCsrID0gdmFsOworCQl9CisJCWJpdHBvd2VyPDw9MTsKKwl9Cit9CisKKworc3RhdGljIHZvaWQgYnVpbGRfdGFibGVfY29sb3IoY29uc3QgdW5zaWduZWQgaW50IHJvbXRhYmxlWzE2XVs4XSwKKwkJCSAgICAgIHVuc2lnbmVkIGNoYXIgcDAwMDRbMTZdWzEwMjRdLAorCQkJICAgICAgdW5zaWduZWQgY2hhciBwODAwNFsxNl1bMjU2XSkKK3sKKwlpbnQgY29tcHJlc3Npb25fbW9kZSwgaiwgaywgYml0LCBwdzsKKwl1bnNpZ25lZCBjaGFyICpwMCwgKnA4OworCWNvbnN0IHVuc2lnbmVkIGludCAqcjsKKworCS8qIFdlIGhhdmUgMTYgY29tcHJlc3Npb25zIHRhYmxlcyAqLworCWZvciAoY29tcHJlc3Npb25fbW9kZSA9IDA7IGNvbXByZXNzaW9uX21vZGUgPCAxNjsgY29tcHJlc3Npb25fbW9kZSsrKSB7CisJCXAwID0gcDAwMDRbY29tcHJlc3Npb25fbW9kZV07CisJCXA4ID0gcDgwMDRbY29tcHJlc3Npb25fbW9kZV07CisJCXIgID0gcm9tdGFibGVbY29tcHJlc3Npb25fbW9kZV07CisKKwkJZm9yIChqID0gMDsgaiA8IDg7IGorKywgcisrLCBwMCArPSAxMjgpIHsKKworCQkJZm9yIChrID0gMDsgayA8IDE2OyBrKyspIHsKKwkJCQlpZiAoayA9PSAwKQorCQkJCQliaXQgPSAxOworCQkJCWVsc2UgaWYgKGsgPj0gMSAmJiBrIDwgMykKKwkJCQkJYml0ID0gKHJbMF0gPj4gMTUpICYgNzsKKwkJCQllbHNlIGlmIChrID49IDMgJiYgayA8IDYpCisJCQkJCWJpdCA9IChyWzBdID4+IDEyKSAmIDc7CisJCQkJZWxzZSBpZiAoayA+PSA2ICYmIGsgPCAxMCkKKwkJCQkJYml0ID0gKHJbMF0gPj4gOSkgJiA3OworCQkJCWVsc2UgaWYgKGsgPj0gMTAgJiYgayA8IDEzKQorCQkJCQliaXQgPSAoclswXSA+PiA2KSAmIDc7CisJCQkJZWxzZSBpZiAoayA+PSAxMyAmJiBrIDwgMTUpCisJCQkJCWJpdCA9IChyWzBdID4+IDMpICYgNzsKKwkJCQllbHNlCisJCQkJCWJpdCA9IChyWzBdKSAmIDc7CisJCQkJaWYgKGsgPT0gMCkKKwkJCQkJKnA4KysgPSA4OworCQkJCWVsc2UKKwkJCQkJKnA4KysgPSBqIC0gYml0OworCQkJCSpwOCsrID0gYml0OworCisJCQkJcHcgPSAxIDw8IGJpdDsKKwkJCQlwMFtrICsgMHgwMF0gPSAoMSAqIHB3KSArIDB4ODA7CisJCQkJcDBbayArIDB4MTBdID0gKDIgKiBwdykgKyAweDgwOworCQkJCXAwW2sgKyAweDIwXSA9ICgzICogcHcpICsgMHg4MDsKKwkJCQlwMFtrICsgMHgzMF0gPSAoNCAqIHB3KSArIDB4ODA7CisJCQkJcDBbayArIDB4NDBdID0gKC0xICogcHcpICsgMHg4MDsKKwkJCQlwMFtrICsgMHg1MF0gPSAoLTIgKiBwdykgKyAweDgwOworCQkJCXAwW2sgKyAweDYwXSA9ICgtMyAqIHB3KSArIDB4ODA7CisJCQkJcDBbayArIDB4NzBdID0gKC00ICogcHcpICsgMHg4MDsKKwkJCX0JLyogZW5kIG9mIGZvciAoaz0wOyBrPDE2OyBrKyssIHA4KyspICovCisJCX0JLyogZW5kIG9mIGZvciAoaj0wOyBqPDg7IGorKyAsIHRhYmxlKyspICovCisJfSAvKiBlbmQgb2YgZm9yZWFjaCBjb21wcmVzc2lvbl9tb2RlICovCit9CisKKy8qCisgKgorICovCitzdGF0aWMgdm9pZCBmaWxsX3RhYmxlX2RjMDBfZDgwMChzdHJ1Y3QgcHdjX2RlYzIzX3ByaXZhdGUgKnBkZWMpCit7CisjZGVmaW5lIFNDQUxFQklUUyAxNQorI2RlZmluZSBPTkVfSEFMRiAgKDFVTCA8PCAoU0NBTEVCSVRTIC0gMSkpCisJaW50IGk7CisJdW5zaWduZWQgaW50IG9mZnNldDEgPSBPTkVfSEFMRjsKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0MiA9IDB4MDAwMDsKKworCWZvciAoaT0wOyBpPDI1NjsgaSsrKSB7CisJCXBkZWMtPnRhYmxlX2RjMDBbaV0gPSBvZmZzZXQxICYgfihPTkVfSEFMRik7CisJCXBkZWMtPnRhYmxlX2Q4MDBbaV0gPSBvZmZzZXQyOworCisJCW9mZnNldDEgKz0gMHg3YmM0OworCQlvZmZzZXQyICs9IDB4N2JjNDsKKwl9Cit9CisKKy8qCisgKiBUbyBkZWNvZGUgdGhlIHN0cmVhbToKKyAqICAgaWYgbG9va19iaXRzKDIpID09IDA6CSMgb3AgPT0gMiBpbiB0aGUgbG9va3VwIHRhYmxlCisgKiAgICAgIHNraXBfYml0cygyKQorICogICAgICBlbmQgb2YgdGhlIHN0cmVhbQorICogICBlbGlmIGxvb2tfYml0cygzKSA9PSA3OgkjIG9wID09IDEgaW4gdGhlIGxvb2t1cCB0YWJsZQorICogICAgICBza2lwX2JpdHMoMykKKyAqICAgICAgeXl5eSA9IGdldF9iaXRzKDQpCisgKiAgICAgIHh4eHggPSBnZXRfYml0cyg4KQorICogICBlbHNlOgkJCSMgb3AgPT0gMCBpbiB0aGUgbG9va3VwIHRhYmxlCisgKiAgICAgIHNraXBfYml0cyh4KQorICoKKyAqIEZvciBzcGVlZHVwIHByb2Nlc3NpbmcsIHdlIGJ1aWxkIGEgbG9va3VwIHRhYmxlIGFuZCB3ZSB0YWtlcyB0aGUgZmlyc3QgNiBiaXRzLgorICoKKyAqIHN0cnVjdCB7CisgKiAgIHVuc2lnbmVkIGNoYXIgb3A7CSAgICAvLyBvcGVyYXRpb24gdG8gZXhlY3V0ZQorICogICB1bnNpZ25lZCBjaGFyIGJpdHM7ICAgIC8vIGJpdHMgdXNlIHRvIHBlcmZvcm0gb3BlcmF0aW9uCisgKiAgIHVuc2lnbmVkIGNoYXIgb2Zmc2V0MTsgLy8gb2Zmc2V0IHRvIGFkZCB0byBhY2Nlc3MgaW4gdGhlIHRhYmxlXzAwMDQgJSAxNgorICogICB1bnNpZ25lZCBjaGFyIG9mZnNldDI7IC8vIG9mZnNldCB0byBhZGQgdG8gYWNjZXNzIGluIHRoZSB0YWJsZV8wMDA0CisgKiB9CisgKgorICogSG93IHRvIGJ1aWxkIHRoaXMgdGFibGUgPworICogICBvcCA9PSAyIHdoZW4gKGklNCk9PTAKKyAqICAgb3AgPT0gMSB3aGVuIChpJTgpPT03CisgKiAgIG9wID09IDAgb3RoZXJ3aXNlCisgKgorICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBoYXNoX3RhYmxlX29wc1s2NCo0XSA9IHsKKwkweDAyLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDMsIDB4MDEsIDB4MDAsCisJMHgwMCwgMHgwNCwgMHgwMSwgMHgxMCwKKwkweDAwLCAweDA2LCAweDAxLCAweDMwLAorCTB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMywgMHgwMSwgMHg0MCwKKwkweDAwLCAweDA1LCAweDAxLCAweDIwLAorCTB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAzLCAweDAxLCAweDAwLAorCTB4MDAsIDB4MDQsIDB4MDEsIDB4NTAsCisJMHgwMCwgMHgwNSwgMHgwMiwgMHgwMCwKKwkweDAyLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDMsIDB4MDEsIDB4NDAsCisJMHgwMCwgMHgwNSwgMHgwMywgMHgwMCwKKwkweDAxLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMywgMHgwMSwgMHgwMCwKKwkweDAwLCAweDA0LCAweDAxLCAweDEwLAorCTB4MDAsIDB4MDYsIDB4MDIsIDB4MTAsCisJMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAzLCAweDAxLCAweDQwLAorCTB4MDAsIDB4MDUsIDB4MDEsIDB4NjAsCisJMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAyLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDMsIDB4MDEsIDB4MDAsCisJMHgwMCwgMHgwNCwgMHgwMSwgMHg1MCwKKwkweDAwLCAweDA1LCAweDAyLCAweDQwLAorCTB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMywgMHgwMSwgMHg0MCwKKwkweDAwLCAweDA1LCAweDAzLCAweDQwLAorCTB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAzLCAweDAxLCAweDAwLAorCTB4MDAsIDB4MDQsIDB4MDEsIDB4MTAsCisJMHgwMCwgMHgwNiwgMHgwMSwgMHg3MCwKKwkweDAyLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDMsIDB4MDEsIDB4NDAsCisJMHgwMCwgMHgwNSwgMHgwMSwgMHgyMCwKKwkweDAxLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMywgMHgwMSwgMHgwMCwKKwkweDAwLCAweDA0LCAweDAxLCAweDUwLAorCTB4MDAsIDB4MDUsIDB4MDIsIDB4MDAsCisJMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAzLCAweDAxLCAweDQwLAorCTB4MDAsIDB4MDUsIDB4MDMsIDB4MDAsCisJMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAyLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDMsIDB4MDEsIDB4MDAsCisJMHgwMCwgMHgwNCwgMHgwMSwgMHgxMCwKKwkweDAwLCAweDA2LCAweDAyLCAweDUwLAorCTB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMywgMHgwMSwgMHg0MCwKKwkweDAwLCAweDA1LCAweDAxLCAweDYwLAorCTB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAzLCAweDAxLCAweDAwLAorCTB4MDAsIDB4MDQsIDB4MDEsIDB4NTAsCisJMHgwMCwgMHgwNSwgMHgwMiwgMHg0MCwKKwkweDAyLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDMsIDB4MDEsIDB4NDAsCisJMHgwMCwgMHgwNSwgMHgwMywgMHg0MCwKKwkweDAxLCAweDAwLCAweDAwLCAweDAwCit9OworCisvKgorICoKKyAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBNdWxJZHhbMTZdWzE2XSA9IHsKKwl7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCx9LAorCXswLCAxLCAyLCAzLCAwLCAxLCAyLCAzLCAwLCAxLCAyLCAzLCAwLCAxLCAyLCAzLH0sCisJezAsIDAsIDAsIDAsIDEsIDEsIDEsIDEsIDIsIDIsIDIsIDIsIDMsIDMsIDMsIDMsfSwKKwl7NCwgNCwgNCwgNCwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNCwgNCwgNCwgNCx9LAorCXs2LCA3LCA4LCA5LCA3LCAxMCwgMTEsIDgsIDgsIDExLCAxMCwgNywgOSwgOCwgNywgNix9LAorCXs0LCA1LCA1LCA0LCA0LCA1LCA1LCA0LCA0LCA1LCA1LCA0LCA0LCA1LCA1LCA0LH0sCisJezEsIDMsIDAsIDIsIDEsIDMsIDAsIDIsIDEsIDMsIDAsIDIsIDEsIDMsIDAsIDIsfSwKKwl7MCwgMywgMywgMCwgMSwgMiwgMiwgMSwgMiwgMSwgMSwgMiwgMywgMCwgMCwgMyx9LAorCXswLCAxLCAyLCAzLCAzLCAyLCAxLCAwLCAzLCAyLCAxLCAwLCAwLCAxLCAyLCAzLH0sCisJezEsIDEsIDEsIDEsIDMsIDMsIDMsIDMsIDAsIDAsIDAsIDAsIDIsIDIsIDIsIDIsfSwKKwl7NywgMTAsIDExLCA4LCA5LCA4LCA3LCA2LCA2LCA3LCA4LCA5LCA4LCAxMSwgMTAsIDcsfSwKKwl7NCwgNSwgNSwgNCwgNSwgNCwgNCwgNSwgNSwgNCwgNCwgNSwgNCwgNSwgNSwgNCx9LAorCXs3LCA5LCA2LCA4LCAxMCwgOCwgNywgMTEsIDExLCA3LCA4LCAxMCwgOCwgNiwgOSwgNyx9LAorCXsxLCAzLCAwLCAyLCAyLCAwLCAzLCAxLCAyLCAwLCAzLCAxLCAxLCAzLCAwLCAyLH0sCisJezEsIDIsIDIsIDEsIDMsIDAsIDAsIDMsIDAsIDMsIDMsIDAsIDIsIDEsIDEsIDIsfSwKKwl7MTAsIDgsIDcsIDExLCA4LCA2LCA5LCA3LCA3LCA5LCA2LCA4LCAxMSwgNywgOCwgMTB9Cit9OworCisjaWYgVVNFX0xPT0tVUF9UQUJMRV9UT19DTEFNUAorI2RlZmluZSBNQVhfT1VURVJfQ1JPUF9WQUxVRQkoNTEyKQorc3RhdGljIHVuc2lnbmVkIGNoYXIgcHdjX2Nyb3BfdGFibGVbMjU2ICsgMipNQVhfT1VURVJfQ1JPUF9WQUxVRV07CisjZGVmaW5lIENMQU1QKHgpIChwd2NfY3JvcF90YWJsZVtNQVhfT1VURVJfQ1JPUF9WQUxVRSsoeCldKQorI2Vsc2UKKyNkZWZpbmUgQ0xBTVAoeCkgKCh4KT4yNTU/MjU1OigoeCk8MD8wOngpKQorI2VuZGlmCisKKworLyogSWYgdGhlIHR5cGUgb3IgdGhlIGNvbW1hbmQgY2hhbmdlLCB3ZSByZWJ1aWxkIHRoZSBsb29rdXAgdGFibGUgKi8KK2ludCBwd2NfZGVjMjNfaW5pdChzdHJ1Y3QgcHdjX2RldmljZSAqcHdjLCBpbnQgdHlwZSwgdW5zaWduZWQgY2hhciAqY21kKQoreworCWludCBmbGFncywgdmVyc2lvbiwgc2hpZnQsIGk7CisJc3RydWN0IHB3Y19kZWMyM19wcml2YXRlICpwZGVjOworCisJaWYgKHB3Yy0+ZGVjb21wcmVzc19kYXRhID09IE5VTEwpIHsKKwkJcGRlYyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwd2NfZGVjMjNfcHJpdmF0ZSksIEdGUF9LRVJORUwpOworCQlpZiAocGRlYyA9PSBOVUxMKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCXB3Yy0+ZGVjb21wcmVzc19kYXRhID0gcGRlYzsKKwl9CisJcGRlYyA9IHB3Yy0+ZGVjb21wcmVzc19kYXRhOworCisJaWYgKERFVklDRV9VU0VfQ09ERUMzKHR5cGUpKSB7CisJCWZsYWdzID0gY21kWzJdICYgMHgxODsKKwkJaWYgKGZsYWdzID09IDgpCisJCQlwZGVjLT5uYml0cyA9IDc7CS8qIE1vcmUgYml0cywgbWVhbiBtb3JlIGJpdHMgdG8gZW5jb2RlIHRoZSBzdHJlYW0sIGJ1dCBiZXR0ZXIgcXVhbGl0eSAqLworCQllbHNlIGlmIChmbGFncyA9PSAweDEwKQorCQkJcGRlYy0+bmJpdHMgPSA4OworCQllbHNlCisJCQlwZGVjLT5uYml0cyA9IDY7CisKKwkJdmVyc2lvbiA9IGNtZFsyXSA+PiA1OworCQlidWlsZF90YWJsZV9jb2xvcihLaWFyYVJvbVRhYmxlW3ZlcnNpb25dWzBdLCBwZGVjLT50YWJsZV8wMDA0X3Bhc3MxLCBwZGVjLT50YWJsZV84MDA0X3Bhc3MxKTsKKwkJYnVpbGRfdGFibGVfY29sb3IoS2lhcmFSb21UYWJsZVt2ZXJzaW9uXVsxXSwgcGRlYy0+dGFibGVfMDAwNF9wYXNzMiwgcGRlYy0+dGFibGVfODAwNF9wYXNzMik7CisKKwl9IGVsc2UgeworCisJCWZsYWdzID0gY21kWzJdICYgNjsKKwkJaWYgKGZsYWdzID09IDIpCisJCQlwZGVjLT5uYml0cyA9IDc7CisJCWVsc2UgaWYgKGZsYWdzID09IDQpCisJCQlwZGVjLT5uYml0cyA9IDg7CisJCWVsc2UKKwkJCXBkZWMtPm5iaXRzID0gNjsKKworCQl2ZXJzaW9uID0gY21kWzJdID4+IDM7CisJCWJ1aWxkX3RhYmxlX2NvbG9yKFRpbW9uUm9tVGFibGVbdmVyc2lvbl1bMF0sIHBkZWMtPnRhYmxlXzAwMDRfcGFzczEsIHBkZWMtPnRhYmxlXzgwMDRfcGFzczEpOworCQlidWlsZF90YWJsZV9jb2xvcihUaW1vblJvbVRhYmxlW3ZlcnNpb25dWzFdLCBwZGVjLT50YWJsZV8wMDA0X3Bhc3MyLCBwZGVjLT50YWJsZV84MDA0X3Bhc3MyKTsKKwl9CisKKwkvKiBJbmZvcm1hdGlvbnMgY2FuIGJlIGNvZGVkIG9uIGEgdmFyaWFibGUgbnVtYmVyIG9mIGJpdHMgYnV0IG5ldmVyIGxlc3MgdGhhbiA4ICovCisJc2hpZnQgPSA4IC0gcGRlYy0+bmJpdHM7CisJcGRlYy0+c2NhbGViaXRzID0gU0NBTEVCSVRTIC0gc2hpZnQ7CisJcGRlYy0+bmJpdHNtYXNrID0gMHhGRiA+PiBzaGlmdDsKKworCWZpbGxfdGFibGVfZGMwMF9kODAwKHBkZWMpOworCWJ1aWxkX3N1YmJsb2NrX3BhdHRlcm4ocGRlYyk7CisJYnVpbGRfYml0X3Bvd2VybWFza190YWJsZShwZGVjKTsKKworI2lmIFVTRV9MT09LVVBfVEFCTEVfVE9fQ0xBTVAKKwkvKiBCdWlsZCB0aGUgc3RhdGljIHRhYmxlIHRvIGNsYW1wIHZhbHVlIFswLTI1NV0gKi8KKwlmb3IgKGk9MDtpPE1BWF9PVVRFUl9DUk9QX1ZBTFVFO2krKykKKwkJcHdjX2Nyb3BfdGFibGVbaV0gPSAwOworCWZvciAoaT0wOyBpPDI1NjsgaSsrKQorCQlwd2NfY3JvcF90YWJsZVtNQVhfT1VURVJfQ1JPUF9WQUxVRStpXSA9IGk7CisJZm9yIChpPTA7IGk8TUFYX09VVEVSX0NST1BfVkFMVUU7IGkrKykKKwkJcHdjX2Nyb3BfdGFibGVbTUFYX09VVEVSX0NST1BfVkFMVUUrMjU2K2ldID0gMjU1OworI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENvcHkgdGhlIDR4NCBpbWFnZSBibG9jayB0byBZIHBsYW5lIGJ1ZmZlcgorICovCitzdGF0aWMgdm9pZCBjb3B5X2ltYWdlX2Jsb2NrX1koY29uc3QgaW50ICpzcmMsIHVuc2lnbmVkIGNoYXIgKmRzdCwgdW5zaWduZWQgaW50IGJ5dGVzX3Blcl9saW5lLCB1bnNpZ25lZCBpbnQgc2NhbGViaXRzKQoreworI2lmIFVOUk9MTF9MT09QX0ZPUl9DT1BZCisJY29uc3QgdW5zaWduZWQgY2hhciAqY20gPSBwd2NfY3JvcF90YWJsZStNQVhfT1VURVJfQ1JPUF9WQUxVRTsKKwljb25zdCBpbnQgKmMgPSBzcmM7CisJdW5zaWduZWQgY2hhciAqZCA9IGRzdDsKKworCSpkKysgPSBjbVtjWzBdID4+IHNjYWxlYml0c107CisJKmQrKyA9IGNtW2NbMV0gPj4gc2NhbGViaXRzXTsKKwkqZCsrID0gY21bY1syXSA+PiBzY2FsZWJpdHNdOworCSpkKysgPSBjbVtjWzNdID4+IHNjYWxlYml0c107CisKKwlkID0gZHN0ICsgYnl0ZXNfcGVyX2xpbmU7CisJKmQrKyA9IGNtW2NbNF0gPj4gc2NhbGViaXRzXTsKKwkqZCsrID0gY21bY1s1XSA+PiBzY2FsZWJpdHNdOworCSpkKysgPSBjbVtjWzZdID4+IHNjYWxlYml0c107CisJKmQrKyA9IGNtW2NbN10gPj4gc2NhbGViaXRzXTsKKworCWQgPSBkc3QgKyBieXRlc19wZXJfbGluZSoyOworCSpkKysgPSBjbVtjWzhdID4+IHNjYWxlYml0c107CisJKmQrKyA9IGNtW2NbOV0gPj4gc2NhbGViaXRzXTsKKwkqZCsrID0gY21bY1sxMF0gPj4gc2NhbGViaXRzXTsKKwkqZCsrID0gY21bY1sxMV0gPj4gc2NhbGViaXRzXTsKKworCWQgPSBkc3QgKyBieXRlc19wZXJfbGluZSozOworCSpkKysgPSBjbVtjWzEyXSA+PiBzY2FsZWJpdHNdOworCSpkKysgPSBjbVtjWzEzXSA+PiBzY2FsZWJpdHNdOworCSpkKysgPSBjbVtjWzE0XSA+PiBzY2FsZWJpdHNdOworCSpkKysgPSBjbVtjWzE1XSA+PiBzY2FsZWJpdHNdOworI2Vsc2UKKwlpbnQgaTsKKwljb25zdCBpbnQgKmMgPSBzcmM7CisJdW5zaWduZWQgY2hhciAqZCA9IGRzdDsKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrLCBjKyspCisJCSpkKysgPSBDTEFNUCgoKmMpID4+IHNjYWxlYml0cyk7CisKKwlkID0gZHN0ICsgYnl0ZXNfcGVyX2xpbmU7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKywgYysrKQorCQkqZCsrID0gQ0xBTVAoKCpjKSA+PiBzY2FsZWJpdHMpOworCisJZCA9IGRzdCArIGJ5dGVzX3Blcl9saW5lKjI7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKywgYysrKQorCQkqZCsrID0gQ0xBTVAoKCpjKSA+PiBzY2FsZWJpdHMpOworCisJZCA9IGRzdCArIGJ5dGVzX3Blcl9saW5lKjM7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKywgYysrKQorCQkqZCsrID0gQ0xBTVAoKCpjKSA+PiBzY2FsZWJpdHMpOworI2VuZGlmCit9CisKKy8qCisgKiBDb3B5IHRoZSA0eDQgaW1hZ2UgYmxvY2sgdG8gYSBDckNiIHBsYW5lIGJ1ZmZlcgorICoKKyAqLworc3RhdGljIHZvaWQgY29weV9pbWFnZV9ibG9ja19DckNiKGNvbnN0IGludCAqc3JjLCB1bnNpZ25lZCBjaGFyICpkc3QsIHVuc2lnbmVkIGludCBieXRlc19wZXJfbGluZSwgdW5zaWduZWQgaW50IHNjYWxlYml0cykKK3sKKyNpZiBVTlJPTExfTE9PUF9GT1JfQ09QWQorCS8qIFVucm9sbCBhbGwgbG9vcHMgKi8KKwljb25zdCB1bnNpZ25lZCBjaGFyICpjbSA9IHB3Y19jcm9wX3RhYmxlK01BWF9PVVRFUl9DUk9QX1ZBTFVFOworCWNvbnN0IGludCAqYyA9IHNyYzsKKwl1bnNpZ25lZCBjaGFyICpkID0gZHN0OworCisJKmQrKyA9IGNtW2NbMF0gPj4gc2NhbGViaXRzXTsKKwkqZCsrID0gY21bY1s0XSA+PiBzY2FsZWJpdHNdOworCSpkKysgPSBjbVtjWzFdID4+IHNjYWxlYml0c107CisJKmQrKyA9IGNtW2NbNV0gPj4gc2NhbGViaXRzXTsKKwkqZCsrID0gY21bY1syXSA+PiBzY2FsZWJpdHNdOworCSpkKysgPSBjbVtjWzZdID4+IHNjYWxlYml0c107CisJKmQrKyA9IGNtW2NbM10gPj4gc2NhbGViaXRzXTsKKwkqZCsrID0gY21bY1s3XSA+PiBzY2FsZWJpdHNdOworCisJZCA9IGRzdCArIGJ5dGVzX3Blcl9saW5lOworCSpkKysgPSBjbVtjWzEyXSA+PiBzY2FsZWJpdHNdOworCSpkKysgPSBjbVtjWzhdID4+IHNjYWxlYml0c107CisJKmQrKyA9IGNtW2NbMTNdID4+IHNjYWxlYml0c107CisJKmQrKyA9IGNtW2NbOV0gPj4gc2NhbGViaXRzXTsKKwkqZCsrID0gY21bY1sxNF0gPj4gc2NhbGViaXRzXTsKKwkqZCsrID0gY21bY1sxMF0gPj4gc2NhbGViaXRzXTsKKwkqZCsrID0gY21bY1sxNV0gPj4gc2NhbGViaXRzXTsKKwkqZCsrID0gY21bY1sxMV0gPj4gc2NhbGViaXRzXTsKKyNlbHNlCisJaW50IGk7CisJY29uc3QgaW50ICpjMSA9IHNyYzsKKwljb25zdCBpbnQgKmMyID0gc3JjICsgNDsKKwl1bnNpZ25lZCBjaGFyICpkID0gZHN0OworCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKywgYzErKywgYzIrKykgeworCQkqZCsrID0gQ0xBTVAoKCpjMSkgPj4gc2NhbGViaXRzKTsKKwkJKmQrKyA9IENMQU1QKCgqYzIpID4+IHNjYWxlYml0cyk7CisJfQorCWMxID0gc3JjICsgMTI7CisJZCA9IGRzdCArIGJ5dGVzX3Blcl9saW5lOworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyssIGMxKyssIGMyKyspIHsKKwkJKmQrKyA9IENMQU1QKCgqYzEpID4+IHNjYWxlYml0cyk7CisJCSpkKysgPSBDTEFNUCgoKmMyKSA+PiBzY2FsZWJpdHMpOworCX0KKyNlbmRpZgorfQorCisjaWYgRU5BQkxFX0JBWUVSX0RFQ09ERVIKKy8qCisgKiBGb3JtYXQ6IDh4MiBwaXhlbHMKKyAqICAgLiBHIC4gRyAuIEcgLiBHIC4gRyAuIEcgLiBHCisgKiAgIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLgorICogICAuIEcgLiBHIC4gRyAuIEcgLiBHIC4gRyAuIEcKKyAqICAgLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuCisgKiAgIG9yCisgKiAgIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLgorICogICBHIC4gRyAuIEcgLiBHIC4gRyAuIEcgLiBHIC4KKyAqICAgLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuCisgKiAgIEcgLiBHIC4gRyAuIEcgLiBHIC4gRyAuIEcgLgorKi8KK3N0YXRpYyB2b2lkIGNvcHlfaW1hZ2VfYmxvY2tfR3JlZW4oY29uc3QgaW50ICpzcmMsIHVuc2lnbmVkIGNoYXIgKmRzdCwgdW5zaWduZWQgaW50IGJ5dGVzX3Blcl9saW5lLCB1bnNpZ25lZCBpbnQgc2NhbGViaXRzKQoreworI2lmIFVOUk9MTF9MT09QX0ZPUl9DT1BZCisJLyogVW5yb2xsIGFsbCBsb29wcyAqLworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmNtID0gcHdjX2Nyb3BfdGFibGUrTUFYX09VVEVSX0NST1BfVkFMVUU7CisJdW5zaWduZWQgY2hhciAqZCA9IGRzdDsKKwljb25zdCBpbnQgKmMgPSBzcmM7CisKKwlkWzBdID0gY21bY1swXSA+PiBzY2FsZWJpdHNdOworCWRbMl0gPSBjbVtjWzFdID4+IHNjYWxlYml0c107CisJZFs0XSA9IGNtW2NbMl0gPj4gc2NhbGViaXRzXTsKKwlkWzZdID0gY21bY1szXSA+PiBzY2FsZWJpdHNdOworCWRbOF0gPSBjbVtjWzRdID4+IHNjYWxlYml0c107CisJZFsxMF0gPSBjbVtjWzVdID4+IHNjYWxlYml0c107CisJZFsxMl0gPSBjbVtjWzZdID4+IHNjYWxlYml0c107CisJZFsxNF0gPSBjbVtjWzddID4+IHNjYWxlYml0c107CisKKwlkID0gZHN0ICsgYnl0ZXNfcGVyX2xpbmU7CisJZFswXSA9IGNtW2NbOF0gPj4gc2NhbGViaXRzXTsKKwlkWzJdID0gY21bY1s5XSA+PiBzY2FsZWJpdHNdOworCWRbNF0gPSBjbVtjWzEwXSA+PiBzY2FsZWJpdHNdOworCWRbNl0gPSBjbVtjWzExXSA+PiBzY2FsZWJpdHNdOworCWRbOF0gPSBjbVtjWzEyXSA+PiBzY2FsZWJpdHNdOworCWRbMTBdID0gY21bY1sxM10gPj4gc2NhbGViaXRzXTsKKwlkWzEyXSA9IGNtW2NbMTRdID4+IHNjYWxlYml0c107CisJZFsxNF0gPSBjbVtjWzE1XSA+PiBzY2FsZWJpdHNdOworI2Vsc2UKKwlpbnQgaTsKKwl1bnNpZ25lZCBjaGFyICpkOworCWNvbnN0IGludCAqYyA9IHNyYzsKKworCWQgPSBkc3Q7CisJZm9yIChpID0gMDsgaSA8IDg7IGkrKywgYysrKQorCQlkW2kqMl0gPSBDTEFNUCgoKmMpID4+IHNjYWxlYml0cyk7CisKKwlkID0gZHN0ICsgYnl0ZXNfcGVyX2xpbmU7CisJZm9yIChpID0gMDsgaSA8IDg7IGkrKywgYysrKQorCQlkW2kqMl0gPSBDTEFNUCgoKmMpID4+IHNjYWxlYml0cyk7CisjZW5kaWYKK30KKyNlbmRpZgorCisjaWYgRU5BQkxFX0JBWUVSX0RFQ09ERVIKKy8qCisgKiBGb3JtYXQ6IDR4NCBwaXhlbHMKKyAqICAgUiAuIFIgLiBSIC4gUgorICogICAuIEIgLiBCIC4gQiAuCisgKiAgIFIgLiBSIC4gUiAuIFIKKyAqICAgLiBCIC4gQiAuIEIgLgorICovCitzdGF0aWMgdm9pZCBjb3B5X2ltYWdlX2Jsb2NrX1JlZEJsdWUoY29uc3QgaW50ICpzcmMsIHVuc2lnbmVkIGNoYXIgKmRzdCwgdW5zaWduZWQgaW50IGJ5dGVzX3Blcl9saW5lLCB1bnNpZ25lZCBpbnQgc2NhbGViaXRzKQoreworI2lmIFVOUk9MTF9MT09QX0ZPUl9DT1BZCisJLyogVW5yb2xsIGFsbCBsb29wcyAqLworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmNtID0gcHdjX2Nyb3BfdGFibGUrTUFYX09VVEVSX0NST1BfVkFMVUU7CisJdW5zaWduZWQgY2hhciAqZCA9IGRzdDsKKwljb25zdCBpbnQgKmMgPSBzcmM7CisKKwlkWzBdID0gY21bY1swXSA+PiBzY2FsZWJpdHNdOworCWRbMl0gPSBjbVtjWzFdID4+IHNjYWxlYml0c107CisJZFs0XSA9IGNtW2NbMl0gPj4gc2NhbGViaXRzXTsKKwlkWzZdID0gY21bY1szXSA+PiBzY2FsZWJpdHNdOworCisJZCA9IGRzdCArIGJ5dGVzX3Blcl9saW5lOworCWRbMV0gPSBjbVtjWzRdID4+IHNjYWxlYml0c107CisJZFszXSA9IGNtW2NbNV0gPj4gc2NhbGViaXRzXTsKKwlkWzVdID0gY21bY1s2XSA+PiBzY2FsZWJpdHNdOworCWRbN10gPSBjbVtjWzddID4+IHNjYWxlYml0c107CisKKwlkID0gZHN0ICsgYnl0ZXNfcGVyX2xpbmUqMjsKKwlkWzBdID0gY21bY1s4XSA+PiBzY2FsZWJpdHNdOworCWRbMl0gPSBjbVtjWzldID4+IHNjYWxlYml0c107CisJZFs0XSA9IGNtW2NbMTBdID4+IHNjYWxlYml0c107CisJZFs2XSA9IGNtW2NbMTFdID4+IHNjYWxlYml0c107CisKKwlkID0gZHN0ICsgYnl0ZXNfcGVyX2xpbmUqMzsKKwlkWzFdID0gY21bY1sxMl0gPj4gc2NhbGViaXRzXTsKKwlkWzNdID0gY21bY1sxM10gPj4gc2NhbGViaXRzXTsKKwlkWzVdID0gY21bY1sxNF0gPj4gc2NhbGViaXRzXTsKKwlkWzddID0gY21bY1sxNV0gPj4gc2NhbGViaXRzXTsKKyNlbHNlCisJaW50IGk7CisJdW5zaWduZWQgY2hhciAqZDsKKwljb25zdCBpbnQgKmMgPSBzcmM7CisKKwlkID0gZHN0OworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyssIGMrKykKKwkJZFtpKjJdID0gQ0xBTVAoKCpjKSA+PiBzY2FsZWJpdHMpOworCisJZCA9IGRzdCArIGJ5dGVzX3Blcl9saW5lOworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyssIGMrKykKKwkJZFtpKjIrMV0gPSBDTEFNUCgoKmMpID4+IHNjYWxlYml0cyk7CisKKwlkID0gZHN0ICsgYnl0ZXNfcGVyX2xpbmUqMjsKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrLCBjKyspCisJCWRbaSoyXSA9IENMQU1QKCgqYykgPj4gc2NhbGViaXRzKTsKKworCWQgPSBkc3QgKyBieXRlc19wZXJfbGluZSozOworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyssIGMrKykKKwkJZFtpKjIrMV0gPSBDTEFNUCgoKmMpID4+IHNjYWxlYml0cyk7CisjZW5kaWYKK30KKyNlbmRpZgorCisvKgorICogVG8gbWFuYWdlIHRoZSBzdHJlYW0sIHdlIGtlZXAgYml0cyBpbiBhIDMyIGJpdHMgcmVnaXN0ZXIuCisgKiBmaWxsX25iaXRzKG4pOiBmaWxsIHRoZSByZXNlcnZvaXIgd2l0aCBhdCBsZWFzdCBuIGJpdHMKKyAqIHNraXBfYml0cyhuKTogZGlzY2FyZCBuIGJpdHMgZnJvbSB0aGUgcmVzZXJ2b2lyCisgKiBnZXRfYml0cyhuKTogZmlsbCB0aGUgcmVzZXJ2b2lyLCByZXR1cm5zIHRoZSBmaXJzdCBuIGJpdHMgYW5kIGRpc2NhcmQgdGhlCisgKiAgICAgICAgICAgICAgYml0cyBmcm9tIHRoZSByZXNlcnZvaXIuCisgKiBfX2dldF9uYml0cyhuKTogZmFzdGVyIHZlcnNpb24gb2YgZ2V0X2JpdHMobiksIGJ1dCBhc3VtZXMgdGhhdCB0aGUgcmVzZXJ2b2lyCisgKiAgICAgICAgICAgICAgICAgY29udGFpbnMgYXQgbGVhc3QgbiBiaXRzLiBiaXRzIHJldHVybmVkIGlzIGRpc2NhcmRlZC4KKyAqLworI2RlZmluZSBmaWxsX25iaXRzKHBkZWMsIG5iaXRzX3dhbnRlZCkgZG8geyBcCisgICB3aGlsZSAocGRlYy0+bmJpdHNfaW5fcmVzZXJ2b2lyPChuYml0c193YW50ZWQpKSBcCisgICAgeyBcCisgICAgICBwZGVjLT5yZXNlcnZvaXIgfD0gKCoocGRlYy0+c3RyZWFtKSsrKSA8PCAocGRlYy0+bmJpdHNfaW5fcmVzZXJ2b2lyKTsgXAorICAgICAgcGRlYy0+bmJpdHNfaW5fcmVzZXJ2b2lyICs9IDg7IFwKKyAgICB9IFwKK30gIHdoaWxlKDApOworCisjZGVmaW5lIHNraXBfbmJpdHMocGRlYywgbmJpdHNfdG9fc2tpcCkgZG8geyBcCisgICBwZGVjLT5yZXNlcnZvaXIgPj49IChuYml0c190b19za2lwKTsgXAorICAgcGRlYy0+bmJpdHNfaW5fcmVzZXJ2b2lyIC09IChuYml0c190b19za2lwKTsgXAorfSAgd2hpbGUoMCk7CisKKyNkZWZpbmUgZ2V0X25iaXRzKHBkZWMsIG5iaXRzX3dhbnRlZCwgcmVzdWx0KSBkbyB7IFwKKyAgIGZpbGxfbmJpdHMocGRlYywgbmJpdHNfd2FudGVkKTsgXAorICAgcmVzdWx0ID0gKHBkZWMtPnJlc2Vydm9pcikgJiAoKDFVPDwobmJpdHNfd2FudGVkKSktMSk7IFwKKyAgIHNraXBfbmJpdHMocGRlYywgbmJpdHNfd2FudGVkKTsgXAorfSAgd2hpbGUoMCk7CisKKyNkZWZpbmUgX19nZXRfbmJpdHMocGRlYywgbmJpdHNfd2FudGVkLCByZXN1bHQpIGRvIHsgXAorICAgcmVzdWx0ID0gKHBkZWMtPnJlc2Vydm9pcikgJiAoKDFVPDwobmJpdHNfd2FudGVkKSktMSk7IFwKKyAgIHNraXBfbmJpdHMocGRlYywgbmJpdHNfd2FudGVkKTsgXAorfSAgd2hpbGUoMCk7CisKKyNkZWZpbmUgbG9va19uYml0cyhwZGVjLCBuYml0c193YW50ZWQpIFwKKyAgICgocGRlYy0+cmVzZXJ2b2lyKSAmICgoMVU8PChuYml0c193YW50ZWQpKS0xKSkKKworLyoKKyAqIERlY29kZSBhIDR4NCBwaXhlbCBibG9jaworICovCitzdGF0aWMgdm9pZCBkZWNvZGVfYmxvY2soc3RydWN0IHB3Y19kZWMyM19wcml2YXRlICpwZGVjLAorCQkJIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0YWJsZTAwMDQsCisJCQkgY29uc3QgdW5zaWduZWQgY2hhciAqcHRhYmxlODAwNCkKK3sKKwl1bnNpZ25lZCBpbnQgcHJpbWFyeV9jb2xvcjsKKwl1bnNpZ25lZCBpbnQgY2hhbm5lbF92LCBvZmZzZXQxLCBvcDsKKwlpbnQgaTsKKworCWZpbGxfbmJpdHMocGRlYywgMTYpOworCV9fZ2V0X25iaXRzKHBkZWMsIHBkZWMtPm5iaXRzLCBwcmltYXJ5X2NvbG9yKTsKKworCWlmIChsb29rX25iaXRzKHBkZWMsMikgPT0gMCkgeworCQlza2lwX25iaXRzKHBkZWMsIDIpOworCQkvKiBWZXJ5IHNpbXBsZSwgdGhlIGNvbG9yIGlzIHRoZSBzYW1lIGZvciBhbGwgcGl4ZWxzIG9mIHRoZSBzcXVhcmUgKi8KKwkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisJCQlwZGVjLT50ZW1wX2NvbG9yc1tpXSA9IHBkZWMtPnRhYmxlX2RjMDBbcHJpbWFyeV9jb2xvcl07CisKKwkJcmV0dXJuOworCX0KKworCS8qIFRoaXMgYmxvY2sgaXMgZW5jb2RlZCB3aXRoIHNtYWxsIHBhdHRlcm4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKwkJcGRlYy0+dGVtcF9jb2xvcnNbaV0gPSBwZGVjLT50YWJsZV9kODAwW3ByaW1hcnlfY29sb3JdOworCisJX19nZXRfbmJpdHMocGRlYywgMywgY2hhbm5lbF92KTsKKwljaGFubmVsX3YgPSAoKGNoYW5uZWxfdiAmIDEpIDw8IDIpIHwgKGNoYW5uZWxfdiAmIDIpIHwgKChjaGFubmVsX3YgJiA0KSA+PiAyKTsKKworCXB0YWJsZTAwMDQgKz0gKGNoYW5uZWxfdiAqIDEyOCk7CisJcHRhYmxlODAwNCArPSAoY2hhbm5lbF92ICogMzIpOworCisJb2Zmc2V0MSA9IDA7CisJZG8KKwl7CisJCXVuc2lnbmVkIGludCBodGFibGVfaWR4LCByb3dzID0gMDsKKwkJY29uc3QgdW5zaWduZWQgaW50ICpibG9jazsKKworCQkvKiBbICB6enp6IHkgeCB4IF0KKwkJICogICAgIHh4ID09IDAwIDo9PiBlbmQgb2YgdGhlIGJsb2NrIGRlZiwgcmVtb3ZlIHRoZSB0d28gYml0cyBmcm9tIHRoZSBzdHJlYW0KKwkJICogICAgeXh4ID09IDExMQorCQkgKiAgICB5eHggPT0gYW55IG90aGVyIHZhbHVlCisJCSAqCisJCSAqLworCQlmaWxsX25iaXRzKHBkZWMsIDE2KTsKKwkJaHRhYmxlX2lkeCA9IGxvb2tfbmJpdHMocGRlYywgNik7CisJCW9wID0gaGFzaF90YWJsZV9vcHNbaHRhYmxlX2lkeCAqIDRdOworCisJCWlmIChvcCA9PSAyKSB7CisJCQlza2lwX25iaXRzKHBkZWMsIDIpOworCisJCX0gZWxzZSBpZiAob3AgPT0gMSkgeworCQkJLyogMTViaXRzIFsgeHh4eCB4eHh4IHl5eXkgMTExIF0KKwkJCSAqIHl5eSA9PiBvZmZzZXQgaW4gdGhlIHRhYmxlODAwNAorCQkJICogeHh4ID0+IG9mZnNldCBpbiB0aGUgdGFibGVkMDA0ICh0cmVlKQorCQkJICovCisJCQl1bnNpZ25lZCBpbnQgbWFzaywgc2hpZnQ7CisJCQl1bnNpZ25lZCBpbnQgbmJpdHMsIGNvbDE7CisJCQl1bnNpZ25lZCBpbnQgeXl5eTsKKworCQkJc2tpcF9uYml0cyhwZGVjLCAzKTsKKwkJCS8qIG9mZnNldDEgKz0geXl5eSAqLworCQkJX19nZXRfbmJpdHMocGRlYywgNCwgeXl5eSk7CisJCQlvZmZzZXQxICs9IDEgKyB5eXl5OworCQkJb2Zmc2V0MSAmPSAweDBGOworCQkJbmJpdHMgPSBwdGFibGU4MDA0W29mZnNldDEgKiAyXTsKKworCQkJLyogY29sMSA9IHh4eHggeHh4eCAqLworCQkJX19nZXRfbmJpdHMocGRlYywgbmJpdHMrMSwgY29sMSk7CisKKwkJCS8qIEJpdCBtYXNrIHRhYmxlICovCisJCQltYXNrID0gcGRlYy0+dGFibGVfYml0cG93ZXJtYXNrW25iaXRzXVtjb2wxXTsKKwkJCXNoaWZ0ID0gcHRhYmxlODAwNFtvZmZzZXQxICogMiArIDFdOworCQkJcm93cyA9ICgobWFzayA8PCBzaGlmdCkgKyAweDgwKSAmIDB4RkY7CisKKwkJCWJsb2NrID0gcGRlYy0+dGFibGVfc3ViYmxvY2tbcm93c107CisJCQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKwkJCQlwZGVjLT50ZW1wX2NvbG9yc1tpXSArPSBibG9ja1tNdWxJZHhbb2Zmc2V0MV1baV1dOworCisJCX0gZWxzZSB7CisJCQkvKiBvcCA9PSAwCisJCQkgKiBvZmZzZXQxIGlzIGNvZGVkIG9uIDMgYml0cworCQkJICovCisJCQl1bnNpZ25lZCBpbnQgc2hpZnQ7CisKKwkJCW9mZnNldDEgKz0gaGFzaF90YWJsZV9vcHMgW2h0YWJsZV9pZHggKiA0ICsgMl07CisJCQlvZmZzZXQxICY9IDB4MEY7CisKKwkJCXJvd3MgPSBwdGFibGUwMDA0W29mZnNldDEgKyBoYXNoX3RhYmxlX29wcyBbaHRhYmxlX2lkeCAqIDQgKyAzXV07CisJCQlibG9jayA9IHBkZWMtPnRhYmxlX3N1YmJsb2NrW3Jvd3NdOworCQkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisJCQkJcGRlYy0+dGVtcF9jb2xvcnNbaV0gKz0gYmxvY2tbTXVsSWR4W29mZnNldDFdW2ldXTsKKworCQkJc2hpZnQgPSBoYXNoX3RhYmxlX29wc1todGFibGVfaWR4ICogNCArIDFdOworCQkJc2tpcF9uYml0cyhwZGVjLCBzaGlmdCk7CisJCX0KKworCX0gd2hpbGUgKG9wICE9IDIpOworCit9CisKK3N0YXRpYyB2b2lkIERlY29tcHJlc3NCYW5kMjMoc3RydWN0IHB3Y19kZWMyM19wcml2YXRlICpwZGVjLAorCQkJICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpyYXd5dXYsCisJCQkgICAgIHVuc2lnbmVkIGNoYXIgKnBsYW5hcl95LAorCQkJICAgICB1bnNpZ25lZCBjaGFyICpwbGFuYXJfdSwKKwkJCSAgICAgdW5zaWduZWQgY2hhciAqcGxhbmFyX3YsCisJCQkgICAgIHVuc2lnbmVkIGludCAgIGNvbXByZXNzZWRfaW1hZ2Vfd2lkdGgsCisJCQkgICAgIHVuc2lnbmVkIGludCAgIHJlYWxfaW1hZ2Vfd2lkdGgpCit7CisJaW50IGNvbXByZXNzaW9uX2luZGV4LCBuYmxvY2tzOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0YWJsZTAwMDQ7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcHRhYmxlODAwNDsKKworCXBkZWMtPnJlc2Vydm9pciA9IDA7CisJcGRlYy0+bmJpdHNfaW5fcmVzZXJ2b2lyID0gMDsKKwlwZGVjLT5zdHJlYW0gPSByYXd5dXYgKyAxOwkvKiBUaGUgZmlyc3QgYnl0ZSBvZiB0aGUgc3RyZWFtIGlzIHNraXBwZWQgKi8KKworCWdldF9uYml0cyhwZGVjLCA0LCBjb21wcmVzc2lvbl9pbmRleCk7CisKKwkvKiBwYXNzIDE6IHVuY29tcHJlc3MgWSBjb21wb25lbnQgKi8KKwluYmxvY2tzID0gY29tcHJlc3NlZF9pbWFnZV93aWR0aCAvIDQ7CisKKwlwdGFibGUwMDA0ID0gcGRlYy0+dGFibGVfMDAwNF9wYXNzMVtjb21wcmVzc2lvbl9pbmRleF07CisJcHRhYmxlODAwNCA9IHBkZWMtPnRhYmxlXzgwMDRfcGFzczFbY29tcHJlc3Npb25faW5kZXhdOworCisJLyogRWFjaCBibG9jayBkZWNvZGUgYSBzcXVhcmUgb2YgNHg0ICovCisJd2hpbGUgKG5ibG9ja3MpIHsKKwkJZGVjb2RlX2Jsb2NrKHBkZWMsIHB0YWJsZTAwMDQsIHB0YWJsZTgwMDQpOworCQljb3B5X2ltYWdlX2Jsb2NrX1kocGRlYy0+dGVtcF9jb2xvcnMsIHBsYW5hcl95LCByZWFsX2ltYWdlX3dpZHRoLCBwZGVjLT5zY2FsZWJpdHMpOworCQlwbGFuYXJfeSArPSA0OworCQluYmxvY2tzLS07CisJfQorCisJLyogcGFzcyAyOiB1bmNvbXByZXNzIFVWIGNvbXBvbmVudCAqLworCW5ibG9ja3MgPSBjb21wcmVzc2VkX2ltYWdlX3dpZHRoIC8gODsKKworCXB0YWJsZTAwMDQgPSBwZGVjLT50YWJsZV8wMDA0X3Bhc3MyW2NvbXByZXNzaW9uX2luZGV4XTsKKwlwdGFibGU4MDA0ID0gcGRlYy0+dGFibGVfODAwNF9wYXNzMltjb21wcmVzc2lvbl9pbmRleF07CisKKwkvKiBFYWNoIGJsb2NrIGRlY29kZSBhIHNxdWFyZSBvZiA0eDQgKi8KKwl3aGlsZSAobmJsb2NrcykgeworCQlkZWNvZGVfYmxvY2socGRlYywgcHRhYmxlMDAwNCwgcHRhYmxlODAwNCk7CisJCWNvcHlfaW1hZ2VfYmxvY2tfQ3JDYihwZGVjLT50ZW1wX2NvbG9ycywgcGxhbmFyX3UsIHJlYWxfaW1hZ2Vfd2lkdGgvMiwgcGRlYy0+c2NhbGViaXRzKTsKKworCQlkZWNvZGVfYmxvY2socGRlYywgcHRhYmxlMDAwNCwgcHRhYmxlODAwNCk7CisJCWNvcHlfaW1hZ2VfYmxvY2tfQ3JDYihwZGVjLT50ZW1wX2NvbG9ycywgcGxhbmFyX3YsIHJlYWxfaW1hZ2Vfd2lkdGgvMiwgcGRlYy0+c2NhbGViaXRzKTsKKworCQlwbGFuYXJfdiArPSA4OworCQlwbGFuYXJfdSArPSA4OworCQluYmxvY2tzIC09IDI7CisJfQorCit9CisKKyNpZiBFTkFCTEVfQkFZRVJfREVDT0RFUgorLyoKKyAqIFNpemUgbmVlZCB0byBiZSBhIG11bHRpcGxlIG9mIDggaW4gd2lkdGgKKyAqCisgKiBSZXR1cm4gYSBibG9jayBvZiBmb3VyIGxpbmUgZW5jb2RlZCBsaWtlIHRoaXM6CisgKgorICogICBHIFIgRyBSIEcgUiBHIFIgRyBSIEcgUiBHIFIgRyBSCisgKiAgIEIgRyBCIEcgQiBHIEIgRyBCIEcgQiBHIEIgRyBCIEcKKyAqICAgRyBSIEcgUiBHIFIgRyBSIEcgUiBHIFIgRyBSIEcgUgorICogICBCIEcgQiBHIEIgRyBCIEcgQiBHIEIgRyBCIEcgQiBHCisgKgorICovCitzdGF0aWMgdm9pZCBEZWNvbXByZXNzQmFuZEJheWVyKHN0cnVjdCBwd2NfZGVjMjNfcHJpdmF0ZSAqcGRlYywKKwkJCQljb25zdCB1bnNpZ25lZCBjaGFyICpyYXd5dXYsCisJCQkJdW5zaWduZWQgY2hhciAqcmdiYmF5ZXIsCisJCQkJdW5zaWduZWQgaW50ICAgY29tcHJlc3NlZF9pbWFnZV93aWR0aCwKKwkJCQl1bnNpZ25lZCBpbnQgICByZWFsX2ltYWdlX3dpZHRoKQoreworCWludCBjb21wcmVzc2lvbl9pbmRleCwgbmJsb2NrczsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpwdGFibGUwMDA0OworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0YWJsZTgwMDQ7CisJdW5zaWduZWQgY2hhciAqZGVzdDsKKworCXBkZWMtPnJlc2Vydm9pciA9IDA7CisJcGRlYy0+bmJpdHNfaW5fcmVzZXJ2b2lyID0gMDsKKwlwZGVjLT5zdHJlYW0gPSByYXd5dXYgKyAxOwkvKiBUaGUgZmlyc3QgYnl0ZSBvZiB0aGUgc3RyZWFtIGlzIHNraXBwZWQgKi8KKworCWdldF9uYml0cyhwZGVjLCA0LCBjb21wcmVzc2lvbl9pbmRleCk7CisKKwkvKiBwYXNzIDE6IHVuY29tcHJlc3MgUkIgY29tcG9uZW50ICovCisJbmJsb2NrcyA9IGNvbXByZXNzZWRfaW1hZ2Vfd2lkdGggLyA0OworCisJcHRhYmxlMDAwNCA9IHBkZWMtPnRhYmxlXzAwMDRfcGFzczFbY29tcHJlc3Npb25faW5kZXhdOworCXB0YWJsZTgwMDQgPSBwZGVjLT50YWJsZV84MDA0X3Bhc3MxW2NvbXByZXNzaW9uX2luZGV4XTsKKwlkZXN0ID0gcmdiYmF5ZXI7CisKKwkvKiBFYWNoIGJsb2NrIGRlY29kZSBhIHNxdWFyZSBvZiA0eDQgKi8KKwl3aGlsZSAobmJsb2NrcykgeworCQlkZWNvZGVfYmxvY2socGRlYywgcHRhYmxlMDAwNCwgcHRhYmxlODAwNCk7CisJCWNvcHlfaW1hZ2VfYmxvY2tfUmVkQmx1ZShwZGVjLT50ZW1wX2NvbG9ycywgcmdiYmF5ZXIsIHJlYWxfaW1hZ2Vfd2lkdGgsIHBkZWMtPnNjYWxlYml0cyk7CisJCWRlc3QgKz0gODsKKwkJbmJsb2Nrcy0tOworCX0KKworCS8qIHBhc3MgMjogdW5jb21wcmVzcyBHIGNvbXBvbmVudCAqLworCW5ibG9ja3MgPSBjb21wcmVzc2VkX2ltYWdlX3dpZHRoIC8gODsKKworCXB0YWJsZTAwMDQgPSBwZGVjLT50YWJsZV8wMDA0X3Bhc3MyW2NvbXByZXNzaW9uX2luZGV4XTsKKwlwdGFibGU4MDA0ID0gcGRlYy0+dGFibGVfODAwNF9wYXNzMltjb21wcmVzc2lvbl9pbmRleF07CisKKwkvKiBFYWNoIGJsb2NrIGRlY29kZSBhIHNxdWFyZSBvZiA0eDQgKi8KKwl3aGlsZSAobmJsb2NrcykgeworCQlkZWNvZGVfYmxvY2socGRlYywgcHRhYmxlMDAwNCwgcHRhYmxlODAwNCk7CisJCWNvcHlfaW1hZ2VfYmxvY2tfR3JlZW4ocGRlYy0+dGVtcF9jb2xvcnMsIHJnYmJheWVyKzEsIHJlYWxfaW1hZ2Vfd2lkdGgsIHBkZWMtPnNjYWxlYml0cyk7CisKKwkJZGVjb2RlX2Jsb2NrKHBkZWMsIHB0YWJsZTAwMDQsIHB0YWJsZTgwMDQpOworCQljb3B5X2ltYWdlX2Jsb2NrX0dyZWVuKHBkZWMtPnRlbXBfY29sb3JzLCByZ2JiYXllcityZWFsX2ltYWdlX3dpZHRoLCByZWFsX2ltYWdlX3dpZHRoLCBwZGVjLT5zY2FsZWJpdHMpOworCisJCXJnYmJheWVyICs9IDE2OworCQluYmxvY2tzIC09IDI7CisJfQorfQorI2VuZGlmCisKKworLyoqCisgKgorICogVW5jb21wcmVzcyBhIHB3YzIzIGJ1ZmZlci4KKyAqCisgKiBwd2Mudmlldzogc2l6ZSBvZiB0aGUgaW1hZ2Ugd2FudGVkCisgKiBwd2MuaW1hZ2U6IHNpemUgb2YgdGhlIGltYWdlIHJldHVybmVkIGJ5IHRoZSBjYW1lcmEKKyAqIHB3Yy5vZmZzZXQ6ICh4LHkpIHRvIGRpc3BsYXllciBpbWFnZSBpbiB0aGUgdmlldworICoKKyAqIHNyYzogcmF3IGRhdGEKKyAqIGRzdDogaW1hZ2Ugb3V0cHV0CisgKiBmbGFnczogUFdDWF9GTEFHX1BMQU5BUiBvciBQV0NYX0ZMQUdfQkFZRVIKKyAqLwordm9pZCBwd2NfZGVjMjNfZGVjb21wcmVzcyhjb25zdCBzdHJ1Y3QgcHdjX2RldmljZSAqcHdjLAorCQkJICBjb25zdCB2b2lkICpzcmMsCisJCQkgIHZvaWQgKmRzdCwKKwkJCSAgaW50IGZsYWdzKQoreworCWludCBiYW5kbGluZXNfbGVmdCwgc3RyaWRlLCBieXRlc19wZXJfYmxvY2s7CisKKwliYW5kbGluZXNfbGVmdCA9IHB3Yy0+aW1hZ2UueSAvIDQ7CisJYnl0ZXNfcGVyX2Jsb2NrID0gcHdjLT52aWV3LnggKiA0OworCisJaWYgKGZsYWdzICYgUFdDWF9GTEFHX0JBWUVSKSB7CisjaWYgRU5BQkxFX0JBWUVSX0RFQ09ERVIKKwkJLyogUkdCIEJheWVyIGZvcm1hdCAqLworCQl1bnNpZ25lZCBjaGFyICpyZ2JvdXQ7CisKKwkJc3RyaWRlID0gcHdjLT52aWV3LnggKiBwd2MtPm9mZnNldC55OworCQlyZ2JvdXQgPSBkc3QgKyBzdHJpZGUgKyBwd2MtPm9mZnNldC54OworCisKKwkJd2hpbGUgKGJhbmRsaW5lc19sZWZ0LS0pIHsKKworCQkJRGVjb21wcmVzc0JhbmRCYXllcihwd2MtPmRlY29tcHJlc3NfZGF0YSwKKwkJCQkJICAgIHNyYywKKwkJCQkJICAgIHJnYm91dCwKKwkJCQkJICAgIHB3Yy0+aW1hZ2UueCwgcHdjLT52aWV3LngpOworCisJCQlzcmMgKz0gcHdjLT52YmFuZGxlbmd0aDsKKwkJCXJnYm91dCArPSBieXRlc19wZXJfYmxvY2s7CisKKwkJfQorI2Vsc2UKKwkJbWVtc2V0KGRzdCwgMCwgcHdjLT52aWV3LnggKiBwd2MtPnZpZXcueSk7CisjZW5kaWYKKworCX0gZWxzZSB7CisJCS8qIFlVVjQyMFAgaW1hZ2UgZm9ybWF0ICovCisJCXVuc2lnbmVkIGNoYXIgKnBvdXRfcGxhbmFyX3k7CisJCXVuc2lnbmVkIGNoYXIgKnBvdXRfcGxhbmFyX3U7CisJCXVuc2lnbmVkIGNoYXIgKnBvdXRfcGxhbmFyX3Y7CisJCXVuc2lnbmVkIGludCAgIHBsYW5lX3NpemU7CisKKwkJcGxhbmVfc2l6ZSA9IHB3Yy0+dmlldy54ICogcHdjLT52aWV3Lnk7CisKKwkJLyogb2Zmc2V0IGluIFkgcGxhbmUgKi8KKwkJc3RyaWRlID0gcHdjLT52aWV3LnggKiBwd2MtPm9mZnNldC55OworCQlwb3V0X3BsYW5hcl95ID0gZHN0ICsgc3RyaWRlICsgcHdjLT5vZmZzZXQueDsKKworCQkvKiBvZmZzZXRzIGluIFUvViBwbGFuZXMgKi8KKwkJc3RyaWRlID0gKHB3Yy0+dmlldy54ICogcHdjLT5vZmZzZXQueSkgLyA0ICsgcHdjLT5vZmZzZXQueCAvIDI7CisJCXBvdXRfcGxhbmFyX3UgPSBkc3QgKyBwbGFuZV9zaXplICsgc3RyaWRlOworCQlwb3V0X3BsYW5hcl92ID0gZHN0ICsgcGxhbmVfc2l6ZSArIHBsYW5lX3NpemUgLyA0ICsgc3RyaWRlOworCisJCXdoaWxlIChiYW5kbGluZXNfbGVmdC0tKSB7CisKKwkJCURlY29tcHJlc3NCYW5kMjMocHdjLT5kZWNvbXByZXNzX2RhdGEsCisJCQkJCSBzcmMsCisJCQkJCSBwb3V0X3BsYW5hcl95LCBwb3V0X3BsYW5hcl91LCBwb3V0X3BsYW5hcl92LAorCQkJCQkgcHdjLT5pbWFnZS54LCBwd2MtPnZpZXcueCk7CisJCQlzcmMgKz0gcHdjLT52YmFuZGxlbmd0aDsKKwkJCXBvdXRfcGxhbmFyX3kgKz0gYnl0ZXNfcGVyX2Jsb2NrOworCQkJcG91dF9wbGFuYXJfdSArPSBwd2MtPnZpZXcueDsKKwkJCXBvdXRfcGxhbmFyX3YgKz0gcHdjLT52aWV3Lng7CisKKwkJfQorCisJfQorCit9CisKK3ZvaWQgcHdjX2RlYzIzX2V4aXQodm9pZCkKK3sKKwkvKiBEbyBub3RoaW5nICovCisKK30KKworLyoqCisgKiBBbGxvY2F0ZSBhIHByaXZhdGUgc3RydWN0dXJlIHVzZWQgYnkgbG9va3VwIHRhYmxlLgorICogWW91IG11c3QgY2FsbCBrZnJlZSgpIHRvIGZyZWUgdGhlIG1lbW9yeSBhbGxvY2F0ZWQuCisgKi8KK2ludCBwd2NfZGVjMjNfYWxsb2Moc3RydWN0IHB3Y19kZXZpY2UgKnB3YykKK3sKKwlwd2MtPmRlY29tcHJlc3NfZGF0YSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwd2NfZGVjMjNfcHJpdmF0ZSksIEdGUF9LRVJORUwpOworCWlmIChwd2MtPmRlY29tcHJlc3NfZGF0YSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlyZXR1cm4gMDsKK30KKworLyogdmltOiBzZXQgY2lubz0gZm9ybWF0b3B0aW9ucz1jcm9xbCBjaW5kZW50IHNoaWZ0d2lkdGg9OCB0YWJzdG9wPTg6ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtZGVjMjMuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1kZWMyMy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjNTUyOTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtZGVjMjMuaApAQCAtMCwwICsxLDY3IEBACisvKiBMaW51eCBkcml2ZXIgZm9yIFBoaWxpcHMgd2ViY2FtCisgICAoQykgMjAwNC0yMDA2IEx1YyBTYWlsbGFyZCAobHVjQHNhaWxsYXJkLm9yZykKKworICAgTk9URTogdGhpcyB2ZXJzaW9uIG9mIHB3YyBpcyBhbiB1bm9mZmljaWFsIChtb2RpZmllZCkgcmVsZWFzZSBvZiBwd2MgJiBwY3d4CisgICBkcml2ZXIgYW5kIHRodXMgbWF5IGhhdmUgYnVncyB0aGF0IGFyZSBub3QgcHJlc2VudCBpbiB0aGUgb3JpZ2luYWwgdmVyc2lvbi4KKyAgIFBsZWFzZSBzZW5kIGJ1ZyByZXBvcnRzIGFuZCBzdXBwb3J0IHJlcXVlc3RzIHRvIDxsdWNAc2FpbGxhcmQub3JnPi4KKyAgIFRoZSBkZWNvbXByZXNzaW9uIHJvdXRpbmVzIGhhdmUgYmVlbiBpbXBsZW1lbnRlZCBieSByZXZlcnNlLWVuZ2luZWVyaW5nIHRoZQorICAgTmVtb3NvZnQgYmluYXJ5IHB3Y3ggbW9kdWxlLiBDYXZlYXQgZW1wdG9yLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyovCisKKyNpZm5kZWYgUFdDX0RFQzIzX0gKKyNkZWZpbmUgUFdDX0RFQzIzX0gKKworI2luY2x1ZGUgInB3Yy5oIgorCitzdHJ1Y3QgcHdjX2RlYzIzX3ByaXZhdGUKK3sKKyAgdW5zaWduZWQgaW50IHNjYWxlYml0czsKKyAgdW5zaWduZWQgaW50IG5iaXRzbWFzaywgbmJpdHM7IC8qIE51bWJlciBvZiBiaXRzIG9mIGEgY29sb3IgaW4gdGhlIGNvbXByZXNzZWQgc3RyZWFtICovCisKKyAgdW5zaWduZWQgaW50IHJlc2Vydm9pcjsKKyAgdW5zaWduZWQgaW50IG5iaXRzX2luX3Jlc2Vydm9pcjsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqc3RyZWFtOworICBpbnQgdGVtcF9jb2xvcnNbMTZdOworCisgIHVuc2lnbmVkIGNoYXIgdGFibGVfMDAwNF9wYXNzMVsxNl1bMTAyNF07CisgIHVuc2lnbmVkIGNoYXIgdGFibGVfMDAwNF9wYXNzMlsxNl1bMTAyNF07CisgIHVuc2lnbmVkIGNoYXIgdGFibGVfODAwNF9wYXNzMVsxNl1bMjU2XTsKKyAgdW5zaWduZWQgY2hhciB0YWJsZV84MDA0X3Bhc3MyWzE2XVsyNTZdOworICB1bnNpZ25lZCBpbnQgIHRhYmxlX3N1YmJsb2NrWzI1Nl1bMTJdOworCisgIHVuc2lnbmVkIGNoYXIgdGFibGVfYml0cG93ZXJtYXNrWzhdWzI1Nl07CisgIHVuc2lnbmVkIGludCAgdGFibGVfZDgwMFsyNTZdOworICB1bnNpZ25lZCBpbnQgIHRhYmxlX2RjMDBbMjU2XTsKKworfTsKKworCitpbnQgcHdjX2RlYzIzX2FsbG9jKHN0cnVjdCBwd2NfZGV2aWNlICpwd2MpOworaW50IHB3Y19kZWMyM19pbml0KHN0cnVjdCBwd2NfZGV2aWNlICpwd2MsIGludCB0eXBlLCB1bnNpZ25lZCBjaGFyICpjbWQpOwordm9pZCBwd2NfZGVjMjNfZXhpdCh2b2lkKTsKK3ZvaWQgcHdjX2RlYzIzX2RlY29tcHJlc3MoY29uc3Qgc3RydWN0IHB3Y19kZXZpY2UgKnB3YywKKwkJCSAgY29uc3Qgdm9pZCAqc3JjLAorCQkJICB2b2lkICpkc3QsCisJCQkgIGludCBmbGFncyk7CisKKworCisjZW5kaWYKKworCisvKiB2aW06IHNldCBjaW5vPSBmb3JtYXRvcHRpb25zPWNyb3FsIGNpbmRlbnQgc2hpZnR3aWR0aD04IHRhYnN0b3A9ODogKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLWlmLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtaWYuYwppbmRleCA0MTQxODI5Li40N2QwZDgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtaWYuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtaWYuYwpAQCAtMSw3ICsxLDcgQEAKIC8qIExpbnV4IGRyaXZlciBmb3IgUGhpbGlwcyB3ZWJjYW0KICAgIFVTQiBhbmQgVmlkZW80TGludXggaW50ZXJmYWNlIHBhcnQuCiAgICAoQykgMTk5OS0yMDA0IE5lbW9zb2Z0IFVudi4KLSAgIChDKSAyMDA0ICAgICAgTHVjIFNhaWxsYXJkIChsdWNAc2FpbGxhcmQub3JnKQorICAgKEMpIDIwMDQtMjAwNiBMdWMgU2FpbGxhcmQgKGx1Y0BzYWlsbGFyZC5vcmcpCiAKICAgIE5PVEU6IHRoaXMgdmVyc2lvbiBvZiBwd2MgaXMgYW4gdW5vZmZpY2lhbCAobW9kaWZpZWQpIHJlbGVhc2Ugb2YgcHdjICYgcGN3eAogICAgZHJpdmVyIGFuZCB0aHVzIG1heSBoYXZlIGJ1Z3MgdGhhdCBhcmUgbm90IHByZXNlbnQgaW4gdGhlIG9yaWdpbmFsIHZlcnNpb24uCkBAIC02MiwxOCArNjIsMjEgQEAKICNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KIAogI2luY2x1ZGUgInB3Yy5oIgotI2luY2x1ZGUgInB3Yy1pb2N0bC5oIgogI2luY2x1ZGUgInB3Yy1raWFyYS5oIgogI2luY2x1ZGUgInB3Yy10aW1vbi5oIgorI2luY2x1ZGUgInB3Yy1kZWMyMy5oIgorI2luY2x1ZGUgInB3Yy1kZWMxLmgiCiAjaW5jbHVkZSAicHdjLXVuY29tcHJlc3MuaCIKIAogLyogRnVuY3Rpb24gcHJvdG90eXBlcyBhbmQgZHJpdmVyIHRlbXBsYXRlcyAqLwogCiAvKiBob3RwbHVnIGRldmljZSB0YWJsZSBzdXBwb3J0ICovCi1zdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgcHdjX2RldmljZV90YWJsZSBbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCBwd2NfZGV2aWNlX3RhYmxlIFtdID0gewogCXsgVVNCX0RFVklDRSgweDA0NzEsIDB4MDMwMikgfSwgLyogUGhpbGlwcyBtb2RlbHMgKi8KIAl7IFVTQl9ERVZJQ0UoMHgwNDcxLCAweDAzMDMpIH0sCiAJeyBVU0JfREVWSUNFKDB4MDQ3MSwgMHgwMzA0KSB9LApAQCAtODEsOSArODQsMTAgQEAKIAl7IFVTQl9ERVZJQ0UoMHgwNDcxLCAweDAzMDgpIH0sCiAJeyBVU0JfREVWSUNFKDB4MDQ3MSwgMHgwMzBDKSB9LAogCXsgVVNCX0RFVklDRSgweDA0NzEsIDB4MDMxMCkgfSwKLQl7IFVTQl9ERVZJQ0UoMHgwNDcxLCAweDAzMTEpIH0sCisJeyBVU0JfREVWSUNFKDB4MDQ3MSwgMHgwMzExKSB9LCAvKiBQaGlsaXBzIFRvVWNhbSBQUk8gSUkgKi8KIAl7IFVTQl9ERVZJQ0UoMHgwNDcxLCAweDAzMTIpIH0sCiAJeyBVU0JfREVWSUNFKDB4MDQ3MSwgMHgwMzEzKSB9LCAvKiB0aGUgJ25ldycgNzIwSyAqLworCXsgVVNCX0RFVklDRSgweDA0NzEsIDB4MDMyOSkgfSwgLyogUGhpbGlwcyBTUEMgOTAwTkMgUEMgQ2FtZXJhICovCiAJeyBVU0JfREVWSUNFKDB4MDY5QSwgMHgwMDAxKSB9LCAvKiBBc2tleSAqLwogCXsgVVNCX0RFVklDRSgweDA0NkQsIDB4MDhCMCkgfSwgLyogTG9naXRlY2ggUXVpY2tDYW0gUHJvIDMwMDAgKi8KIAl7IFVTQl9ERVZJQ0UoMHgwNDZELCAweDA4QjEpIH0sIC8qIExvZ2l0ZWNoIFF1aWNrQ2FtIE5vdGVib29rIFBybyAqLwpAQCAtOTQsOCArOTgsOSBAQAogCXsgVVNCX0RFVklDRSgweDA0NkQsIDB4MDhCNikgfSwgLyogTG9naXRlY2ggKHJlc2VydmVkKSAqLwogCXsgVVNCX0RFVklDRSgweDA0NkQsIDB4MDhCNykgfSwgLyogTG9naXRlY2ggKHJlc2VydmVkKSAqLwogCXsgVVNCX0RFVklDRSgweDA0NkQsIDB4MDhCOCkgfSwgLyogTG9naXRlY2ggKHJlc2VydmVkKSAqLwotCXsgVVNCX0RFVklDRSgweDA1NUQsIDB4OTAwMCkgfSwgLyogU2Ftc3VuZyAqLwotCXsgVVNCX0RFVklDRSgweDA1NUQsIDB4OTAwMSkgfSwKKwl7IFVTQl9ERVZJQ0UoMHgwNTVELCAweDkwMDApIH0sIC8qIFNhbXN1bmcgTVBDLUMxMCAqLworCXsgVVNCX0RFVklDRSgweDA1NUQsIDB4OTAwMSkgfSwgLyogU2Ftc3VuZyBNUEMtQzMwICovCisJeyBVU0JfREVWSUNFKDB4MDU1RCwgMHg5MDAyKSB9LAkvKiBTYW1zdW5nIFNOQy0zNUUgKFZlcjMuMCkgKi8KIAl7IFVTQl9ERVZJQ0UoMHgwNDFFLCAweDQwMEMpIH0sIC8qIENyZWF0aXZlIFdlYmNhbSA1ICovCiAJeyBVU0JfREVWSUNFKDB4MDQxRSwgMHg0MDExKSB9LCAvKiBDcmVhdGl2ZSBXZWJjYW0gUHJvIEV4ICovCiAJeyBVU0JfREVWSUNFKDB4MDRDQywgMHg4MTE2KSB9LCAvKiBBZmluYSBFeWUgKi8KQEAgLTEyMiwxMSArMTI3LDEzIEBACiBzdGF0aWMgaW50IGRlZmF1bHRfc2l6ZSA9IFBTWl9RQ0lGOwogc3RhdGljIGludCBkZWZhdWx0X2ZwcyA9IDEwOwogc3RhdGljIGludCBkZWZhdWx0X2ZidWZzID0gMzsgICAvKiBEZWZhdWx0IG51bWJlciBvZiBmcmFtZSBidWZmZXJzICovCi1zdGF0aWMgaW50IGRlZmF1bHRfbWJ1ZnMgPSAyOwkvKiBEZWZhdWx0IG51bWJlciBvZiBtbWFwKCkgYnVmZmVycyAqLwotICAgICAgIGludCBwd2NfdHJhY2UgPSBUUkFDRV9NT0RVTEUgfCBUUkFDRV9GTE9XIHwgVFJBQ0VfUFdDWDsKKyAgICAgICBpbnQgcHdjX21idWZzID0gMjsJLyogRGVmYXVsdCBudW1iZXIgb2YgbW1hcCgpIGJ1ZmZlcnMgKi8KKyNpZiBDT05GSUdfUFdDX0RFQlVHCisgICAgICAgaW50IHB3Y190cmFjZSA9IFBXQ19ERUJVR19MRVZFTDsKKyNlbmRpZgogc3RhdGljIGludCBwb3dlcl9zYXZlID0gMDsKIHN0YXRpYyBpbnQgbGVkX29uID0gMTAwLCBsZWRfb2ZmID0gMDsgLyogZGVmYXVsdHMgdG8gTEVEIHRoYXQgaXMgb24gd2hpbGUgaW4gdXNlICovCi1zdGF0aWMgaW50IHB3Y19wcmVmZXJyZWRfY29tcHJlc3Npb24gPSAyOyAvKiAwLi4zID0gdW5jb21wcmVzc2VkLi5oaWdoICovCitzdGF0aWMgaW50IHB3Y19wcmVmZXJyZWRfY29tcHJlc3Npb24gPSAxOyAvKiAwLi4zID0gdW5jb21wcmVzc2VkLi5oaWdoICovCiBzdGF0aWMgc3RydWN0IHsKIAlpbnQgdHlwZTsKIAljaGFyIHNlcmlhbF9udW1iZXJbMzBdOwpAQCAtMTM4LDcgKzE0NSw3IEBACiAKIHN0YXRpYyBpbnQgcHdjX3ZpZGVvX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOwogc3RhdGljIGludCBwd2NfdmlkZW9fY2xvc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOwotc3RhdGljIHNzaXplX3QgcHdjX3ZpZGVvX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICogYnVmLAorc3RhdGljIHNzaXplX3QgcHdjX3ZpZGVvX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCiAJCQkgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKTsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgcHdjX3ZpZGVvX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpOwogc3RhdGljIGludCAgcHdjX3ZpZGVvX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLApAQCAtMTUzLDcgKzE2MCw2IEBACiAJLnBvbGwgPQkJcHdjX3ZpZGVvX3BvbGwsCiAJLm1tYXAgPQkJcHdjX3ZpZGVvX21tYXAsCiAJLmlvY3RsID0gICAgICAgIHB3Y192aWRlb19pb2N0bCwKLQkuY29tcGF0X2lvY3RsID0gdjRsX2NvbXBhdF9pb2N0bDMyLAogCS5sbHNlZWsgPSAgICAgICBub19sbHNlZWssCiB9Owogc3RhdGljIHN0cnVjdCB2aWRlb19kZXZpY2UgcHdjX3RlbXBsYXRlID0gewpAQCAtMjAzLDUyICsyMDksNDQgQEAKIC8qIEhlcmUgd2Ugd2FudCB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgbWVtb3J5LgogICogVGhpcyBpcyB1c2VkIHdoZW4gaW5pdGlhbGl6aW5nIHRoZSBjb250ZW50cyBvZiB0aGUgYXJlYS4KICAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGt2aXJ0X3RvX3BhKHVuc2lnbmVkIGxvbmcgYWRyKQotewotCXVuc2lnbmVkIGxvbmcga3ZhLCByZXQ7CiAKLQlrdmEgPSAodW5zaWduZWQgbG9uZykgcGFnZV9hZGRyZXNzKHZtYWxsb2NfdG9fcGFnZSgodm9pZCAqKWFkcikpOwotCWt2YSB8PSBhZHIgJiAoUEFHRV9TSVpFLTEpOyAvKiByZXN0b3JlIHRoZSBvZmZzZXQgKi8KLQlyZXQgPSBfX3BhKGt2YSk7Ci0JcmV0dXJuIHJldDsKLX0KIAotc3RhdGljIHZvaWQgKiBydm1hbGxvYyh1bnNpZ25lZCBsb25nIHNpemUpCisKK3N0YXRpYyB2b2lkICpwd2NfcnZtYWxsb2ModW5zaWduZWQgbG9uZyBzaXplKQogewogCXZvaWQgKiBtZW07CiAJdW5zaWduZWQgbG9uZyBhZHI7CiAKLQlzaXplPVBBR0VfQUxJR04oc2l6ZSk7CiAJbWVtPXZtYWxsb2NfMzIoc2l6ZSk7Ci0JaWYgKG1lbSkKLQl7Ci0JCW1lbXNldChtZW0sIDAsIHNpemUpOyAvKiBDbGVhciB0aGUgcmFtIG91dCwgbm8ganVuayB0byB0aGUgdXNlciAqLwotCQlhZHI9KHVuc2lnbmVkIGxvbmcpIG1lbTsKLQkJd2hpbGUgKHNpemUgPiAwKQotCQl7Ci0JCQlTZXRQYWdlUmVzZXJ2ZWQodm1hbGxvY190b19wYWdlKCh2b2lkICopYWRyKSk7Ci0JCQlhZHIrPVBBR0VfU0laRTsKLQkJCXNpemUtPVBBR0VfU0laRTsKLQkJfQotCX0KKwlpZiAoIW1lbSkKKwkJcmV0dXJuIE5VTEw7CisKKwltZW1zZXQobWVtLCAwLCBzaXplKTsgLyogQ2xlYXIgdGhlIHJhbSBvdXQsIG5vIGp1bmsgdG8gdGhlIHVzZXIgKi8KKwlhZHI9KHVuc2lnbmVkIGxvbmcpIG1lbTsKKwl3aGlsZSAoc2l6ZSA+IDApCisJIHsKKwkgICBTZXRQYWdlUmVzZXJ2ZWQodm1hbGxvY190b19wYWdlKCh2b2lkICopYWRyKSk7CisJICAgYWRyICArPSBQQUdFX1NJWkU7CisJICAgc2l6ZSAtPSBQQUdFX1NJWkU7CisJIH0KIAlyZXR1cm4gbWVtOwogfQogCi1zdGF0aWMgdm9pZCBydmZyZWUodm9pZCAqIG1lbSwgdW5zaWduZWQgbG9uZyBzaXplKQorc3RhdGljIHZvaWQgcHdjX3J2ZnJlZSh2b2lkICogbWVtLCB1bnNpZ25lZCBsb25nIHNpemUpCiB7CiAJdW5zaWduZWQgbG9uZyBhZHI7CiAKLQlpZiAobWVtKQotCXsKLQkJYWRyPSh1bnNpZ25lZCBsb25nKSBtZW07Ci0JCXdoaWxlICgobG9uZykgc2l6ZSA+IDApCi0JCXsKLQkJCUNsZWFyUGFnZVJlc2VydmVkKHZtYWxsb2NfdG9fcGFnZSgodm9pZCAqKWFkcikpOwotCQkJYWRyKz1QQUdFX1NJWkU7Ci0JCQlzaXplLT1QQUdFX1NJWkU7Ci0JCX0KLQkJdmZyZWUobWVtKTsKLQl9CisJaWYgKCFtZW0pCisJCXJldHVybjsKKworCWFkcj0odW5zaWduZWQgbG9uZykgbWVtOworCXdoaWxlICgobG9uZykgc2l6ZSA+IDApCisJIHsKKwkgICBDbGVhclBhZ2VSZXNlcnZlZCh2bWFsbG9jX3RvX3BhZ2UoKHZvaWQgKilhZHIpKTsKKwkgICBhZHIgICs9IFBBR0VfU0laRTsKKwkgICBzaXplIC09IFBBR0VfU0laRTsKKwkgfQorCXZmcmVlKG1lbSk7CiB9CiAKIApAQCAtMjU2LDEwMCArMjU0LDgzIEBACiAKIHN0YXRpYyBpbnQgcHdjX2FsbG9jYXRlX2J1ZmZlcnMoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpCiB7Ci0JaW50IGk7CisJaW50IGksIGVycjsKIAl2b2lkICprYnVmOwogCi0JVHJhY2UoVFJBQ0VfTUVNT1JZLCAiPj4gcHdjX2FsbG9jYXRlX2J1ZmZlcnMocGRldiA9IDB4JXApXG4iLCBwZGV2KTsKKwlQV0NfREVCVUdfTUVNT1JZKCI+PiBwd2NfYWxsb2NhdGVfYnVmZmVycyhwZGV2ID0gMHglcClcbiIsIHBkZXYpOwogCiAJaWYgKHBkZXYgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTlhJTzsKIAotI2lmZGVmIFBXQ19NQUdJQwotCWlmIChwZGV2LT5tYWdpYyAhPSBQV0NfTUFHSUMpIHsKLQkJRXJyKCJhbGxvY2F0ZV9idWZmZXJzKCk6IG1hZ2ljIGZhaWxlZC5cbiIpOwotCQlyZXR1cm4gLUVOWElPOwotCX0KLSNlbmRpZgotCS8qIEFsbG9jYXRlIElzb2Nocm9ub3VzIHBpcGUgYnVmZmVycyAqLworCS8qIEFsbG9jYXRlIElzb2Nocm9udW91cyBwaXBlIGJ1ZmZlcnMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgTUFYX0lTT19CVUZTOyBpKyspIHsKIAkJaWYgKHBkZXYtPnNidWZbaV0uZGF0YSA9PSBOVUxMKSB7Ci0JCQlrYnVmID0ga21hbGxvYyhJU09fQlVGRkVSX1NJWkUsIEdGUF9LRVJORUwpOworCQkJa2J1ZiA9IGt6YWxsb2MoSVNPX0JVRkZFUl9TSVpFLCBHRlBfS0VSTkVMKTsKIAkJCWlmIChrYnVmID09IE5VTEwpIHsKLQkJCQlFcnIoIkZhaWxlZCB0byBhbGxvY2F0ZSBpc28gYnVmZmVyICVkLlxuIiwgaSk7CisJCQkJUFdDX0VSUk9SKCJGYWlsZWQgdG8gYWxsb2NhdGUgaXNvIGJ1ZmZlciAlZC5cbiIsIGkpOwogCQkJCXJldHVybiAtRU5PTUVNOwogCQkJfQotCQkJVHJhY2UoVFJBQ0VfTUVNT1JZLCAiQWxsb2NhdGVkIGlzbyBidWZmZXIgYXQgJXAuXG4iLCBrYnVmKTsKKwkJCVBXQ19ERUJVR19NRU1PUlkoIkFsbG9jYXRlZCBpc28gYnVmZmVyIGF0ICVwLlxuIiwga2J1Zik7CiAJCQlwZGV2LT5zYnVmW2ldLmRhdGEgPSBrYnVmOwotCQkJbWVtc2V0KGtidWYsIDAsIElTT19CVUZGRVJfU0laRSk7CiAJCX0KIAl9CiAKIAkvKiBBbGxvY2F0ZSBmcmFtZSBidWZmZXIgc3RydWN0dXJlICovCiAJaWYgKHBkZXYtPmZidWYgPT0gTlVMTCkgewotCQlrYnVmID0ga21hbGxvYyhkZWZhdWx0X2ZidWZzICogc2l6ZW9mKHN0cnVjdCBwd2NfZnJhbWVfYnVmKSwgR0ZQX0tFUk5FTCk7CisJCWtidWYgPSBremFsbG9jKGRlZmF1bHRfZmJ1ZnMgKiBzaXplb2Yoc3RydWN0IHB3Y19mcmFtZV9idWYpLCBHRlBfS0VSTkVMKTsKIAkJaWYgKGtidWYgPT0gTlVMTCkgewotCQkJRXJyKCJGYWlsZWQgdG8gYWxsb2NhdGUgZnJhbWUgYnVmZmVyIHN0cnVjdHVyZS5cbiIpOworCQkJUFdDX0VSUk9SKCJGYWlsZWQgdG8gYWxsb2NhdGUgZnJhbWUgYnVmZmVyIHN0cnVjdHVyZS5cbiIpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KLQkJVHJhY2UoVFJBQ0VfTUVNT1JZLCAiQWxsb2NhdGVkIGZyYW1lIGJ1ZmZlciBzdHJ1Y3R1cmUgYXQgJXAuXG4iLCBrYnVmKTsKKwkJUFdDX0RFQlVHX01FTU9SWSgiQWxsb2NhdGVkIGZyYW1lIGJ1ZmZlciBzdHJ1Y3R1cmUgYXQgJXAuXG4iLCBrYnVmKTsKIAkJcGRldi0+ZmJ1ZiA9IGtidWY7Ci0JCW1lbXNldChrYnVmLCAwLCBkZWZhdWx0X2ZidWZzICogc2l6ZW9mKHN0cnVjdCBwd2NfZnJhbWVfYnVmKSk7CiAJfQorCiAJLyogY3JlYXRlIGZyYW1lIGJ1ZmZlcnMsIGFuZCBtYWtlIGNpcmN1bGFyIHJpbmcgKi8KIAlmb3IgKGkgPSAwOyBpIDwgZGVmYXVsdF9mYnVmczsgaSsrKSB7CiAJCWlmIChwZGV2LT5mYnVmW2ldLmRhdGEgPT0gTlVMTCkgewogCQkJa2J1ZiA9IHZtYWxsb2MoUFdDX0ZSQU1FX1NJWkUpOyAvKiBuZWVkIHZtYWxsb2Mgc2luY2UgZnJhbWUgYnVmZmVyID4gMTI4SyAqLwogCQkJaWYgKGtidWYgPT0gTlVMTCkgewotCQkJCUVycigiRmFpbGVkIHRvIGFsbG9jYXRlIGZyYW1lIGJ1ZmZlciAlZC5cbiIsIGkpOworCQkJCVBXQ19FUlJPUigiRmFpbGVkIHRvIGFsbG9jYXRlIGZyYW1lIGJ1ZmZlciAlZC5cbiIsIGkpOwogCQkJCXJldHVybiAtRU5PTUVNOwogCQkJfQotCQkJVHJhY2UoVFJBQ0VfTUVNT1JZLCAiQWxsb2NhdGVkIGZyYW1lIGJ1ZmZlciAlZCBhdCAlcC5cbiIsIGksIGtidWYpOworCQkJUFdDX0RFQlVHX01FTU9SWSgiQWxsb2NhdGVkIGZyYW1lIGJ1ZmZlciAlZCBhdCAlcC5cbiIsIGksIGtidWYpOwogCQkJcGRldi0+ZmJ1ZltpXS5kYXRhID0ga2J1ZjsKLQkJCW1lbXNldChrYnVmLCAxMjgsIFBXQ19GUkFNRV9TSVpFKTsKKwkJCW1lbXNldChrYnVmLCAwLCBQV0NfRlJBTUVfU0laRSk7CiAJCX0KIAl9CiAKIAkvKiBBbGxvY2F0ZSBkZWNvbXByZXNzb3IgdGFibGUgc3BhY2UgKi8KLQlrYnVmID0gTlVMTDsKLQlzd2l0Y2ggKHBkZXYtPnR5cGUpCi0JIHsKLQkgIGNhc2UgNjc1OgotCSAgY2FzZSA2ODA6Ci0JICBjYXNlIDY5MDoKLQkgIGNhc2UgNzIwOgotCSAgY2FzZSA3MzA6Ci0JICBjYXNlIDc0MDoKLQkgIGNhc2UgNzUwOgotI2lmIDAKLQkgICAgVHJhY2UoVFJBQ0VfTUVNT1JZLCJwcml2YXRlX2RhdGEoJXp1KVxuIixzaXplb2Yoc3RydWN0IHB3Y19kZWMyM19wcml2YXRlKSk7Ci0JICAgIGtidWYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcHdjX2RlYzIzX3ByaXZhdGUpLCBHRlBfS0VSTkVMKTsJLyogVGltb24gJiBLaWFyYSAqLwotCSAgICBicmVhazsKLQkgIGNhc2UgNjQ1OgotCSAgY2FzZSA2NDY6Ci0JICAgIC8qIFRPRE8gJiBGSVhNRSAqLwotCSAgICBrYnVmID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHB3Y19kZWMyM19wcml2YXRlKSwgR0ZQX0tFUk5FTCk7Ci0JICAgIGJyZWFrOwotI2VuZGlmCi0JOwotCSB9Ci0JcGRldi0+ZGVjb21wcmVzc19kYXRhID0ga2J1ZjsKKwlpZiAoREVWSUNFX1VTRV9DT0RFQzEocGRldi0+dHlwZSkpCisJCWVyciA9IHB3Y19kZWMxX2FsbG9jKHBkZXYpOworCWVsc2UKKwkJZXJyID0gcHdjX2RlYzIzX2FsbG9jKHBkZXYpOworCisJaWYgKGVycikgeworCQlQV0NfRVJST1IoIkZhaWxlZCB0byBhbGxvY2F0ZSBkZWNvbXByZXNzIHRhYmxlLlxuIik7CisJCXJldHVybiBlcnI7CisJfQogCiAJLyogQWxsb2NhdGUgaW1hZ2UgYnVmZmVyOyBkb3VibGUgYnVmZmVyIGZvciBtbWFwKCkgKi8KLQlrYnVmID0gcnZtYWxsb2MoZGVmYXVsdF9tYnVmcyAqIHBkZXYtPmxlbl9wZXJfaW1hZ2UpOworCWtidWYgPSBwd2NfcnZtYWxsb2MocHdjX21idWZzICogcGRldi0+bGVuX3Blcl9pbWFnZSk7CiAJaWYgKGtidWYgPT0gTlVMTCkgewotCQlFcnIoIkZhaWxlZCB0byBhbGxvY2F0ZSBpbWFnZSBidWZmZXIocykuIG5lZWRlZCAoJWQpXG4iLGRlZmF1bHRfbWJ1ZnMgKiBwZGV2LT5sZW5fcGVyX2ltYWdlKTsKKwkJUFdDX0VSUk9SKCJGYWlsZWQgdG8gYWxsb2NhdGUgaW1hZ2UgYnVmZmVyKHMpLiBuZWVkZWQgKCVkKVxuIiwKKwkJCQlwd2NfbWJ1ZnMgKiBwZGV2LT5sZW5fcGVyX2ltYWdlKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQotCVRyYWNlKFRSQUNFX01FTU9SWSwgIkFsbG9jYXRlZCBpbWFnZSBidWZmZXIgYXQgJXAuXG4iLCBrYnVmKTsKKwlQV0NfREVCVUdfTUVNT1JZKCJBbGxvY2F0ZWQgaW1hZ2UgYnVmZmVyIGF0ICVwLlxuIiwga2J1Zik7CiAJcGRldi0+aW1hZ2VfZGF0YSA9IGtidWY7Ci0JZm9yIChpID0gMDsgaSA8IGRlZmF1bHRfbWJ1ZnM7IGkrKykKLQkJcGRldi0+aW1hZ2VfcHRyW2ldID0ga2J1ZiArIGkgKiBwZGV2LT5sZW5fcGVyX2ltYWdlOwotCWZvciAoOyBpIDwgTUFYX0lNQUdFUzsgaSsrKQotCQlwZGV2LT5pbWFnZV9wdHJbaV0gPSBOVUxMOworCWZvciAoaSA9IDA7IGkgPCBwd2NfbWJ1ZnM7IGkrKykgeworCQlwZGV2LT5pbWFnZXNbaV0ub2Zmc2V0ID0gaSAqIHBkZXYtPmxlbl9wZXJfaW1hZ2U7CisJCXBkZXYtPmltYWdlc1tpXS52bWFfdXNlX2NvdW50ID0gMDsKKwl9CisJZm9yICg7IGkgPCBNQVhfSU1BR0VTOyBpKyspIHsKKwkJcGRldi0+aW1hZ2VzW2ldLm9mZnNldCA9IDA7CisJfQogCiAJa2J1ZiA9IE5VTEw7CiAKLQlUcmFjZShUUkFDRV9NRU1PUlksICI8PCBwd2NfYWxsb2NhdGVfYnVmZmVycygpXG4iKTsKKwlQV0NfREVCVUdfTUVNT1JZKCI8PCBwd2NfYWxsb2NhdGVfYnVmZmVycygpXG4iKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzU3LDIxICszMzgsMTQgQEAKIHsKIAlpbnQgaTsKIAotCVRyYWNlKFRSQUNFX01FTU9SWSwgIkVudGVyaW5nIGZyZWVfYnVmZmVycyglcCkuXG4iLCBwZGV2KTsKKwlQV0NfREVCVUdfTUVNT1JZKCJFbnRlcmluZyBmcmVlX2J1ZmZlcnMoJXApLlxuIiwgcGRldik7CiAKIAlpZiAocGRldiA9PSBOVUxMKQogCQlyZXR1cm47Ci0jaWZkZWYgUFdDX01BR0lDCi0JaWYgKHBkZXYtPm1hZ2ljICE9IFBXQ19NQUdJQykgewotCQlFcnIoImZyZWVfYnVmZmVycygpOiBtYWdpYyBmYWlsZWQuXG4iKTsKLQkJcmV0dXJuOwotCX0KLSNlbmRpZgotCiAJLyogUmVsZWFzZSBJc28tcGlwZSBidWZmZXJzICovCiAJZm9yIChpID0gMDsgaSA8IE1BWF9JU09fQlVGUzsgaSsrKQogCQlpZiAocGRldi0+c2J1ZltpXS5kYXRhICE9IE5VTEwpIHsKLQkJCVRyYWNlKFRSQUNFX01FTU9SWSwgIkZyZWVpbmcgSVNPIGJ1ZmZlciBhdCAlcC5cbiIsIHBkZXYtPnNidWZbaV0uZGF0YSk7CisJCQlQV0NfREVCVUdfTUVNT1JZKCJGcmVlaW5nIElTTyBidWZmZXIgYXQgJXAuXG4iLCBwZGV2LT5zYnVmW2ldLmRhdGEpOwogCQkJa2ZyZWUocGRldi0+c2J1ZltpXS5kYXRhKTsKIAkJCXBkZXYtPnNidWZbaV0uZGF0YSA9IE5VTEw7CiAJCX0KQEAgLTM4MCw3ICszNTQsNyBAQAogCWlmIChwZGV2LT5mYnVmICE9IE5VTEwpIHsKIAkJZm9yIChpID0gMDsgaSA8IGRlZmF1bHRfZmJ1ZnM7IGkrKykgewogCQkJaWYgKHBkZXYtPmZidWZbaV0uZGF0YSAhPSBOVUxMKSB7Ci0JCQkJVHJhY2UoVFJBQ0VfTUVNT1JZLCAiRnJlZWluZyBmcmFtZSBidWZmZXIgJWQgYXQgJXAuXG4iLCBpLCBwZGV2LT5mYnVmW2ldLmRhdGEpOworCQkJCVBXQ19ERUJVR19NRU1PUlkoIkZyZWVpbmcgZnJhbWUgYnVmZmVyICVkIGF0ICVwLlxuIiwgaSwgcGRldi0+ZmJ1ZltpXS5kYXRhKTsKIAkJCQl2ZnJlZShwZGV2LT5mYnVmW2ldLmRhdGEpOwogCQkJCXBkZXYtPmZidWZbaV0uZGF0YSA9IE5VTEw7CiAJCQl9CkBAIC0zOTEsMjAgKzM2NSwxOSBAQAogCiAJLyogSW50ZXJtZWRpYXRlIGRlY29tcHJlc3Npb24gYnVmZmVyICYgdGFibGVzICovCiAJaWYgKHBkZXYtPmRlY29tcHJlc3NfZGF0YSAhPSBOVUxMKSB7Ci0JCVRyYWNlKFRSQUNFX01FTU9SWSwgIkZyZWVpbmcgZGVjb21wcmVzc2lvbiBidWZmZXIgYXQgJXAuXG4iLCBwZGV2LT5kZWNvbXByZXNzX2RhdGEpOworCQlQV0NfREVCVUdfTUVNT1JZKCJGcmVlaW5nIGRlY29tcHJlc3Npb24gYnVmZmVyIGF0ICVwLlxuIiwgcGRldi0+ZGVjb21wcmVzc19kYXRhKTsKIAkJa2ZyZWUocGRldi0+ZGVjb21wcmVzc19kYXRhKTsKIAkJcGRldi0+ZGVjb21wcmVzc19kYXRhID0gTlVMTDsKIAl9Ci0JcGRldi0+ZGVjb21wcmVzc29yID0gTlVMTDsKIAogCS8qIFJlbGVhc2UgaW1hZ2UgYnVmZmVycyAqLwogCWlmIChwZGV2LT5pbWFnZV9kYXRhICE9IE5VTEwpIHsKLQkJVHJhY2UoVFJBQ0VfTUVNT1JZLCAiRnJlZWluZyBpbWFnZSBidWZmZXIgYXQgJXAuXG4iLCBwZGV2LT5pbWFnZV9kYXRhKTsKLQkJcnZmcmVlKHBkZXYtPmltYWdlX2RhdGEsIGRlZmF1bHRfbWJ1ZnMgKiBwZGV2LT5sZW5fcGVyX2ltYWdlKTsKKwkJUFdDX0RFQlVHX01FTU9SWSgiRnJlZWluZyBpbWFnZSBidWZmZXIgYXQgJXAuXG4iLCBwZGV2LT5pbWFnZV9kYXRhKTsKKwkJcHdjX3J2ZnJlZShwZGV2LT5pbWFnZV9kYXRhLCBwd2NfbWJ1ZnMgKiBwZGV2LT5sZW5fcGVyX2ltYWdlKTsKIAl9CiAJcGRldi0+aW1hZ2VfZGF0YSA9IE5VTEw7CiAKLQlUcmFjZShUUkFDRV9NRU1PUlksICJMZWF2aW5nIGZyZWVfYnVmZmVycygpLlxuIik7CisJUFdDX0RFQlVHX01FTU9SWSgiTGVhdmluZyBmcmVlX2J1ZmZlcnMoKS5cbiIpOwogfQogCiAvKiBUaGUgZnJhbWUgJiBpbWFnZSBidWZmZXIgbWVzcy4KQEAgLTQ2NCw3ICs0MzcsNyBAQAogLyoqCiAgIFxicmllZiBGaW5kIG5leHQgZnJhbWUgYnVmZmVyIHRvIGZpbGwuIFRha2UgZnJvbSBlbXB0eSBvciBmdWxsIGxpc3QsIHdoaWNoZXZlciBjb21lcyBmaXJzdC4KICAqLwotc3RhdGljIGlubGluZSBpbnQgcHdjX25leHRfZmlsbF9mcmFtZShzdHJ1Y3QgcHdjX2RldmljZSAqcGRldikKK3N0YXRpYyBpbnQgcHdjX25leHRfZmlsbF9mcmFtZShzdHJ1Y3QgcHdjX2RldmljZSAqcGRldikKIHsKIAlpbnQgcmV0OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC00ODksMjMgKzQ2MiwxNyBAQAogCX0KIAllbHNlIHsKIAkJLyogSG1tLiBUYWtlIGl0IGZyb20gdGhlIGZ1bGwgbGlzdCAqLwotI2lmIFBXQ19ERUJVRwogCQkvKiBzYW5pdHkgY2hlY2sgKi8KIAkJaWYgKHBkZXYtPmZ1bGxfZnJhbWVzID09IE5VTEwpIHsKLQkJCUVycigiTmVpdGhlciBlbXB0eSBvciBmdWxsIGZyYW1lcyBhdmFpbGFibGUhXG4iKTsKKwkJCVBXQ19FUlJPUigiTmVpdGhlciBlbXB0eSBvciBmdWxsIGZyYW1lcyBhdmFpbGFibGUhXG4iKTsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBkZXYtPnB0cmxvY2ssIGZsYWdzKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9Ci0jZW5kaWYKIAkJcGRldi0+ZmlsbF9mcmFtZSA9IHBkZXYtPmZ1bGxfZnJhbWVzOwogCQlwZGV2LT5mdWxsX2ZyYW1lcyA9IHBkZXYtPmZ1bGxfZnJhbWVzLT5uZXh0OwogCQlyZXQgPSAxOwogCX0KIAlwZGV2LT5maWxsX2ZyYW1lLT5uZXh0ID0gTlVMTDsKLSNpZiBQV0NfREVCVUcKLQlUcmFjZShUUkFDRV9TRVFVRU5DRSwgIkFzc2lnbmluZyBzZXF1ZW5jZSBudW1iZXIgJWQuXG4iLCBwZGV2LT5zZXF1ZW5jZSk7Ci0JcGRldi0+ZmlsbF9mcmFtZS0+c2VxdWVuY2UgPSBwZGV2LT5zZXF1ZW5jZSsrOwotI2VuZGlmCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGRldi0+cHRybG9jaywgZmxhZ3MpOwogCXJldHVybiByZXQ7CiB9CkBAIC01MjEsNiArNDg4LDggQEAKIAlpbnQgaTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCisJUFdDX0RFQlVHX01FTU9SWSgiPj4gJXMgX19lbnRlcl9fXG4iLCBfX0ZVTkNUSU9OX18pOworCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBkZXYtPnB0cmxvY2ssIGZsYWdzKTsKIAlwZGV2LT5mdWxsX2ZyYW1lcyA9IE5VTEw7CiAJcGRldi0+ZnVsbF9mcmFtZXNfdGFpbCA9IE5VTEw7CkBAIC01NDAsMTMgKzUwOSwxNSBAQAogCXBkZXYtPmltYWdlX3JlYWRfcG9zID0gMDsKIAlwZGV2LT5maWxsX2ltYWdlID0gMDsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZGV2LT5wdHJsb2NrLCBmbGFncyk7CisKKwlQV0NfREVCVUdfTUVNT1JZKCI8PCAlcyBfX2xlYXZpbmdfX1xuIiwgX19GVU5DVElPTl9fKTsKIH0KIAogCiAvKioKICAgXGJyaWVmIERvIGFsbCB0aGUgaGFuZGxpbmcgZm9yIGdldHRpbmcgb25lIGZyYW1lOiBnZXQgcG9pbnRlciwgZGVjb21wcmVzcywgYWR2YW5jZSBwb2ludGVycy4KICAqLwotc3RhdGljIGludCBwd2NfaGFuZGxlX2ZyYW1lKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KQoraW50IHB3Y19oYW5kbGVfZnJhbWUoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpCiB7CiAJaW50IHJldCA9IDA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTU1Niw0MSArNTI3LDQwIEBACiAJICAgd2UgY2FuIHJlbGVhc2UgdGhlIGxvY2sgYWZ0ZXIgdGhpcyB3aXRob3V0IHByb2JsZW1zICovCiAJaWYgKHBkZXYtPnJlYWRfZnJhbWUgIT0gTlVMTCkgewogCQkvKiBUaGlzIGNhbid0IHRoZW9yZXRpY2FsbHkgaGFwcGVuICovCi0JCUVycigiSHVoPyBSZWFkIGZyYW1lIHN0aWxsIGluIHVzZT9cbiIpOworCQlQV0NfRVJST1IoIkh1aD8gUmVhZCBmcmFtZSBzdGlsbCBpbiB1c2U/XG4iKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGRldi0+cHRybG9jaywgZmxhZ3MpOworCQlyZXR1cm4gcmV0OworCX0KKworCisJaWYgKHBkZXYtPmZ1bGxfZnJhbWVzID09IE5VTEwpIHsKKwkJUFdDX0VSUk9SKCJXb29wcy4gTm8gZnJhbWVzIHJlYWR5LlxuIik7CiAJfQogCWVsc2UgewotCQlpZiAocGRldi0+ZnVsbF9mcmFtZXMgPT0gTlVMTCkgewotCQkJRXJyKCJXb29wcy4gTm8gZnJhbWVzIHJlYWR5LlxuIik7CisJCXBkZXYtPnJlYWRfZnJhbWUgPSBwZGV2LT5mdWxsX2ZyYW1lczsKKwkJcGRldi0+ZnVsbF9mcmFtZXMgPSBwZGV2LT5mdWxsX2ZyYW1lcy0+bmV4dDsKKwkJcGRldi0+cmVhZF9mcmFtZS0+bmV4dCA9IE5VTEw7CisJfQorCisJaWYgKHBkZXYtPnJlYWRfZnJhbWUgIT0gTlVMTCkgeworCQkvKiBEZWNvbXByZXNzaW9uIGlzIGEgbGVuZ2h0eSBwcm9jZXNzLCBzbyBpdCdzIG91dHNpZGUgb2YgdGhlIGxvY2suCisJCSAgIFRoaXMgZ2l2ZXMgdGhlIGlzb2NfaGFuZGxlciB0aGUgb3Bwb3J0dW5pdHkgdG8gZmlsbCBtb3JlIGZyYW1lcworCQkgICBpbiB0aGUgbWVhbiB0aW1lLgorCQkqLworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZGV2LT5wdHJsb2NrLCBmbGFncyk7CisJCXJldCA9IHB3Y19kZWNvbXByZXNzKHBkZXYpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcGRldi0+cHRybG9jaywgZmxhZ3MpOworCisJCS8qIFdlJ3JlIGRvbmUgd2l0aCByZWFkX2J1ZmZlciwgdGFjayBpdCB0byB0aGUgZW5kIG9mIHRoZSBlbXB0eSBidWZmZXIgbGlzdCAqLworCQlpZiAocGRldi0+ZW1wdHlfZnJhbWVzID09IE5VTEwpIHsKKwkJCXBkZXYtPmVtcHR5X2ZyYW1lcyA9IHBkZXYtPnJlYWRfZnJhbWU7CisJCQlwZGV2LT5lbXB0eV9mcmFtZXNfdGFpbCA9IHBkZXYtPmVtcHR5X2ZyYW1lczsKIAkJfQogCQllbHNlIHsKLQkJCXBkZXYtPnJlYWRfZnJhbWUgPSBwZGV2LT5mdWxsX2ZyYW1lczsKLQkJCXBkZXYtPmZ1bGxfZnJhbWVzID0gcGRldi0+ZnVsbF9mcmFtZXMtPm5leHQ7Ci0JCQlwZGV2LT5yZWFkX2ZyYW1lLT5uZXh0ID0gTlVMTDsKKwkJCXBkZXYtPmVtcHR5X2ZyYW1lc190YWlsLT5uZXh0ID0gcGRldi0+cmVhZF9mcmFtZTsKKwkJCXBkZXYtPmVtcHR5X2ZyYW1lc190YWlsID0gcGRldi0+cmVhZF9mcmFtZTsKIAkJfQotCi0JCWlmIChwZGV2LT5yZWFkX2ZyYW1lICE9IE5VTEwpIHsKLSNpZiBQV0NfREVCVUcKLQkJCVRyYWNlKFRSQUNFX1NFUVVFTkNFLCAiRGVjb21wcmVzc2luZyBmcmFtZSAlZFxuIiwgcGRldi0+cmVhZF9mcmFtZS0+c2VxdWVuY2UpOwotI2VuZGlmCi0JCQkvKiBEZWNvbXByZXNzaW9uIGlzIGEgbGVuZ2h0eSBwcm9jZXNzLCBzbyBpdCdzIG91dHNpZGUgb2YgdGhlIGxvY2suCi0JCQkgICBUaGlzIGdpdmVzIHRoZSBpc29jX2hhbmRsZXIgdGhlIG9wcG9ydHVuaXR5IHRvIGZpbGwgbW9yZSBmcmFtZXMKLQkJCSAgIGluIHRoZSBtZWFuIHRpbWUuCi0JCQkqLwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGRldi0+cHRybG9jaywgZmxhZ3MpOwotCQkJcmV0ID0gcHdjX2RlY29tcHJlc3MocGRldik7Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmcGRldi0+cHRybG9jaywgZmxhZ3MpOwotCi0JCQkvKiBXZSdyZSBkb25lIHdpdGggcmVhZF9idWZmZXIsIHRhY2sgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZW1wdHkgYnVmZmVyIGxpc3QgKi8KLQkJCWlmIChwZGV2LT5lbXB0eV9mcmFtZXMgPT0gTlVMTCkgewotCQkJCXBkZXYtPmVtcHR5X2ZyYW1lcyA9IHBkZXYtPnJlYWRfZnJhbWU7Ci0JCQkJcGRldi0+ZW1wdHlfZnJhbWVzX3RhaWwgPSBwZGV2LT5lbXB0eV9mcmFtZXM7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlwZGV2LT5lbXB0eV9mcmFtZXNfdGFpbC0+bmV4dCA9IHBkZXYtPnJlYWRfZnJhbWU7Ci0JCQkJcGRldi0+ZW1wdHlfZnJhbWVzX3RhaWwgPSBwZGV2LT5yZWFkX2ZyYW1lOwotCQkJfQotCQkJcGRldi0+cmVhZF9mcmFtZSA9IE5VTEw7Ci0JCX0KKwkJcGRldi0+cmVhZF9mcmFtZSA9IE5VTEw7CiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBkZXYtPnB0cmxvY2ssIGZsYWdzKTsKIAlyZXR1cm4gcmV0OwpAQCAtNTk5LDEyICs1NjksMTE0IEBACiAvKioKICAgXGJyaWVmIEFkdmFuY2UgcG9pbnRlcnMgb2YgaW1hZ2UgYnVmZmVyIChhZnRlciBlYWNoIHVzZXIgcmVxdWVzdCkKICovCi1zdGF0aWMgaW5saW5lIHZvaWQgcHdjX25leHRfaW1hZ2Uoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpCit2b2lkIHB3Y19uZXh0X2ltYWdlKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KQogewogCXBkZXYtPmltYWdlX3VzZWRbcGRldi0+ZmlsbF9pbWFnZV0gPSAwOwotCXBkZXYtPmZpbGxfaW1hZ2UgPSAocGRldi0+ZmlsbF9pbWFnZSArIDEpICUgZGVmYXVsdF9tYnVmczsKKwlwZGV2LT5maWxsX2ltYWdlID0gKHBkZXYtPmZpbGxfaW1hZ2UgKyAxKSAlIHB3Y19tYnVmczsKIH0KIAorLyoqCisgKiBQcmludCBkZWJ1ZyBpbmZvcm1hdGlvbiB3aGVuIGEgZnJhbWUgaXMgZGlzY2FyZGVkIGJlY2F1c2UgYWxsIG9mIG91ciBidWZmZXIKKyAqIGlzIGZ1bGwKKyAqLworc3RhdGljIHZvaWQgcHdjX2ZyYW1lX2R1bXBlZChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldikKK3sKKwlwZGV2LT52ZnJhbWVzX2R1bXBlZCsrOworCWlmIChwZGV2LT52ZnJhbWVfY291bnQgPCBGUkFNRV9MT1dNQVJLKQorCQlyZXR1cm47CisKKwlpZiAocGRldi0+dmZyYW1lc19kdW1wZWQgPCAyMCkKKwkJUFdDX0RFQlVHX0ZMT1coIkR1bXBpbmcgZnJhbWUgJWRcbiIsIHBkZXYtPnZmcmFtZV9jb3VudCk7CisJZWxzZSBpZiAocGRldi0+dmZyYW1lc19kdW1wZWQgPT0gMjApCisJCVBXQ19ERUJVR19GTE9XKCJEdW1waW5nIGZyYW1lICVkIChsYXN0IG1lc3NhZ2UpXG4iLAorCQkJCXBkZXYtPnZmcmFtZV9jb3VudCk7Cit9CisKK3N0YXRpYyBpbnQgcHdjX3Jjdl9zaG9ydF9wYWNrZXQoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGNvbnN0IHN0cnVjdCBwd2NfZnJhbWVfYnVmICpmYnVmKQoreworCWludCBhd2FrZSA9IDA7CisKKwkvKiBUaGUgVG9VQ2FtIEZ1biBDTU9TIHNlbnNvciBjYXVzZXMgdGhlIGZpcm13YXJlIHRvIHNlbmQgMiBvciAzIGJvZ3VzCisJICAgZnJhbWVzIG9uIHRoZSBVU0Igd2lyZSBhZnRlciBhbiBleHBvc3VyZSBjaGFuZ2UuIFRoaXMgY29uZGl0aXRpb24gaXMKKwkgICBob3dldmVyIGRldGVjdGVkICBpbiB0aGUgY2FtIGFuZCBhIGJpdCBpcyBzZXQgaW4gdGhlIGhlYWRlci4KKwkgICAqLworCWlmIChwZGV2LT50eXBlID09IDczMCkgeworCQl1bnNpZ25lZCBjaGFyICpwdHIgPSAodW5zaWduZWQgY2hhciAqKWZidWYtPmRhdGE7CisKKwkJaWYgKHB0clsxXSA9PSAxICYmIHB0clswXSAmIDB4MTApIHsKKwkJCVBXQ19UUkFDRSgiSHl1bmRhaSBDTU9TIHNlbnNvciBidWcuIERyb3BwaW5nIGZyYW1lLlxuIik7CisJCQlwZGV2LT5kcm9wX2ZyYW1lcyArPSAyOworCQkJcGRldi0+dmZyYW1lc19lcnJvcisrOworCQl9CisJCWlmICgocHRyWzBdIF4gcGRldi0+dm1pcnJvcikgJiAweDAxKSB7CisJCQlpZiAocHRyWzBdICYgMHgwMSkgeworCQkJCXBkZXYtPnNuYXBzaG90X2J1dHRvbl9zdGF0dXMgPSAxOworCQkJCVBXQ19UUkFDRSgiU25hcHNob3QgYnV0dG9uIHByZXNzZWQuXG4iKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCVBXQ19UUkFDRSgiU25hcHNob3QgYnV0dG9uIHJlbGVhc2VkLlxuIik7CisJCQl9CisJCX0KKwkJaWYgKChwdHJbMF0gXiBwZGV2LT52bWlycm9yKSAmIDB4MDIpIHsKKwkJCWlmIChwdHJbMF0gJiAweDAyKQorCQkJCVBXQ19UUkFDRSgiSW1hZ2UgaXMgbWlycm9yZWQuXG4iKTsKKwkJCWVsc2UKKwkJCQlQV0NfVFJBQ0UoIkltYWdlIGlzIG5vcm1hbC5cbiIpOworCQl9CisJCXBkZXYtPnZtaXJyb3IgPSBwdHJbMF0gJiAweDAzOworCQkvKiBTb21ldGltZXMgdGhlIHRyYWlsZXIgb2YgdGhlIDczMCBpcyBzdGlsbCBzZW50IGFzIGEgNCBieXRlIHBhY2tldAorCQkgICBhZnRlciBhIHNob3J0IGZyYW1lOyB0aGlzIGNvbmRpdGlvbiBpcyBmaWx0ZXJlZCBvdXQgc3BlY2lmaWNhbGx5LiBBIDQgYnl0ZQorCQkgICBmcmFtZSBkb2Vzbid0IG1ha2Ugc2Vuc2UgYW55d2F5LgorCQkgICBTbyB3ZSBnZXQgZWl0aGVyIHRoaXMgc2VxdWVuY2U6CisJCSAgIGRyb3BfYml0IHNldCAtPiA0IGJ5dGUgZnJhbWUgLT4gc2hvcnQgZnJhbWUgLT4gZ29vZCBmcmFtZQorCQkgICBPciB0aGlzIG9uZToKKwkJICAgZHJvcF9iaXQgc2V0IC0+IHNob3J0IGZyYW1lIC0+IGdvb2QgZnJhbWUKKwkJICAgU28gd2UgZHJvcCBlaXRoZXIgMyBvciAyIGZyYW1lcyBpbiBhbGwhCisJCSAgICovCisJCWlmIChmYnVmLT5maWxsZWQgPT0gNCkKKwkJCXBkZXYtPmRyb3BfZnJhbWVzKys7CisJfQorCWVsc2UgaWYgKHBkZXYtPnR5cGUgPT0gNzQwIHx8IHBkZXYtPnR5cGUgPT0gNzIwKSB7CisJCXVuc2lnbmVkIGNoYXIgKnB0ciA9ICh1bnNpZ25lZCBjaGFyICopZmJ1Zi0+ZGF0YTsKKwkJaWYgKChwdHJbMF0gXiBwZGV2LT52bWlycm9yKSAmIDB4MDEpIHsKKwkJCWlmIChwdHJbMF0gJiAweDAxKSB7CisJCQkJcGRldi0+c25hcHNob3RfYnV0dG9uX3N0YXR1cyA9IDE7CisJCQkJUFdDX1RSQUNFKCJTbmFwc2hvdCBidXR0b24gcHJlc3NlZC5cbiIpOworCQkJfQorCQkJZWxzZQorCQkJCVBXQ19UUkFDRSgiU25hcHNob3QgYnV0dG9uIHJlbGVhc2VkLlxuIik7CisJCX0KKwkJcGRldi0+dm1pcnJvciA9IHB0clswXSAmIDB4MDM7CisJfQorCisJLyogSW4gY2FzZSB3ZSB3ZXJlIGluc3RydWN0ZWQgdG8gZHJvcCB0aGUgZnJhbWUsIGRvIHNvIHNpbGVudGx5LgorCSAgIFRoZSBidWZmZXIgcG9pbnRlcnMgYXJlIG5vdCB1cGRhdGVkIGVpdGhlciAoYnV0IHRoZSBjb3VudGVycyBhcmUgcmVzZXQgYmVsb3cpLgorCSAgICovCisJaWYgKHBkZXYtPmRyb3BfZnJhbWVzID4gMCkKKwkJcGRldi0+ZHJvcF9mcmFtZXMtLTsKKwllbHNlIHsKKwkJLyogQ2hlY2sgZm9yIHVuZGVyZmxvdyBmaXJzdCAqLworCQlpZiAoZmJ1Zi0+ZmlsbGVkIDwgcGRldi0+ZnJhbWVfdG90YWxfc2l6ZSkgeworCQkJUFdDX0RFQlVHX0ZMT1coIkZyYW1lIGJ1ZmZlciB1bmRlcmZsb3cgKCVkIGJ5dGVzKTsiCisJCQkJICAgICAgICIgZGlzY2FyZGVkLlxuIiwgZmJ1Zi0+ZmlsbGVkKTsKKwkJCXBkZXYtPnZmcmFtZXNfZXJyb3IrKzsKKwkJfQorCQllbHNlIHsKKwkJCS8qIFNlbmQgb25seSBvbmNlIHBlciBFT0YgKi8KKwkJCWF3YWtlID0gMTsgLyogZGVsYXkgd2FrZV91cHMgKi8KKworCQkJLyogRmluZCBvdXIgbmV4dCBmcmFtZSB0byBmaWxsLiBUaGlzIHdpbGwgYWx3YXlzIHN1Y2NlZWQsIHNpbmNlIHdlCisJCQkgKiBuaWNrIGEgZnJhbWUgZnJvbSBlaXRoZXIgZW1wdHkgb3IgZnVsbCBsaXN0LCBidXQgaWYgd2UgaGFkIHRvCisJCQkgKiB0YWtlIGl0IGZyb20gdGhlIGZ1bGwgbGlzdCwgaXQgbWVhbnMgYSBmcmFtZSBnb3QgZHJvcHBlZC4KKwkJCSAqLworCQkJaWYgKHB3Y19uZXh0X2ZpbGxfZnJhbWUocGRldikpCisJCQkJcHdjX2ZyYW1lX2R1bXBlZChwZGV2KTsKKworCQl9CisJfSAvKiAhZHJvcF9mcmFtZXMgKi8KKwlwZGV2LT52ZnJhbWVfY291bnQrKzsKKwlyZXR1cm4gYXdha2U7Cit9CiAKIC8qIFRoaXMgZ2V0cyBjYWxsZWQgZm9yIHRoZSBJc29jaHJvbm91cyBwaXBlICh2aWRlbykuIFRoaXMgaXMgZG9uZSBpbgogICogaW50ZXJydXB0IHRpbWUsIHNvIGl0IGhhcyB0byBiZSBmYXN0LCBub3QgY3Jhc2gsIGFuZCBub3Qgc3RhbGwuIE5lYXQuCkBAIC02MjAsMTcgKzY5MiwxMiBAQAogCWF3YWtlID0gMDsKIAlwZGV2ID0gKHN0cnVjdCBwd2NfZGV2aWNlICopdXJiLT5jb250ZXh0OwogCWlmIChwZGV2ID09IE5VTEwpIHsKLQkJRXJyKCJpc29jX2hhbmRsZXIoKSBjYWxsZWQgd2l0aCBOVUxMIGRldmljZT8hXG4iKTsKKwkJUFdDX0VSUk9SKCJpc29jX2hhbmRsZXIoKSBjYWxsZWQgd2l0aCBOVUxMIGRldmljZT8hXG4iKTsKIAkJcmV0dXJuOwogCX0KLSNpZmRlZiBQV0NfTUFHSUMKLQlpZiAocGRldi0+bWFnaWMgIT0gUFdDX01BR0lDKSB7Ci0JCUVycigiaXNvY19oYW5kbGVyKCkgY2FsbGVkIHdpdGggYmFkIG1hZ2ljIVxuIik7Ci0JCXJldHVybjsKLQl9Ci0jZW5kaWYKKwogCWlmICh1cmItPnN0YXR1cyA9PSAtRU5PRU5UIHx8IHVyYi0+c3RhdHVzID09IC1FQ09OTlJFU0VUKSB7Ci0JCVRyYWNlKFRSQUNFX09QRU4sICJwd2NfaXNvY19oYW5kbGVyKCk6IFVSQiAoJXApIHVubGlua2VkICVzc3luY2hyb251b3VzbHkuXG4iLCB1cmIsIHVyYi0+c3RhdHVzID09IC1FTk9FTlQgPyAiIiA6ICJhIik7CisJCVBXQ19ERUJVR19PUEVOKCJVUkIgKCVwKSB1bmxpbmtlZCAlc3N5bmNocm9udW91c2x5LlxuIiwgdXJiLCB1cmItPnN0YXR1cyA9PSAtRU5PRU5UID8gIiIgOiAiYSIpOwogCQlyZXR1cm47CiAJfQogCWlmICh1cmItPnN0YXR1cyAhPSAtRUlOUFJPR1JFU1MgJiYgdXJiLT5zdGF0dXMgIT0gMCkgewpAQCAtNjQ1LDEzICs3MTIsMTMgQEAKIAkJCWNhc2UgLUVJTFNFUToJCWVycm1zZyA9ICJDUkMvVGltZW91dCAoY291bGQgYmUgYW55dGhpbmcpIjsgYnJlYWs7CiAJCQljYXNlIC1FVElNRURPVVQ6CWVycm1zZyA9ICJOQUsgKGRldmljZSBkb2VzIG5vdCByZXNwb25kKSI7IGJyZWFrOwogCQl9Ci0JCVRyYWNlKFRSQUNFX0ZMT1csICJwd2NfaXNvY19oYW5kbGVyKCkgY2FsbGVkIHdpdGggc3RhdHVzICVkIFslc10uXG4iLCB1cmItPnN0YXR1cywgZXJybXNnKTsKKwkJUFdDX0RFQlVHX0ZMT1coInB3Y19pc29jX2hhbmRsZXIoKSBjYWxsZWQgd2l0aCBzdGF0dXMgJWQgWyVzXS5cbiIsIHVyYi0+c3RhdHVzLCBlcnJtc2cpOwogCQkvKiBHaXZlIHVwIGFmdGVyIGEgbnVtYmVyIG9mIGNvbnRpZ3VvdXMgZXJyb3JzIG9uIHRoZSBVU0IgYnVzLgogCQkgICBBcHBlYXJhbnRseSBzb21ldGhpbmcgaXMgd3Jvbmcgc28gd2Ugc2ltdWxhdGUgYW4gdW5wbHVnIGV2ZW50LgogCQkgKi8KIAkJaWYgKCsrcGRldi0+dmlzb2NfZXJyb3JzID4gTUFYX0lTT0NfRVJST1JTKQogCQl7Ci0JCQlJbmZvKCJUb28gbWFueSBJU09DIGVycm9ycywgYmFpbGluZyBvdXQuXG4iKTsKKwkJCVBXQ19JTkZPKCJUb28gbWFueSBJU09DIGVycm9ycywgYmFpbGluZyBvdXQuXG4iKTsKIAkJCXBkZXYtPmVycm9yX3N0YXR1cyA9IEVJTzsKIAkJCWF3YWtlID0gMTsKIAkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcGRldi0+ZnJhbWVxKTsKQEAgLTY2MSw3ICs3MjgsNyBAQAogCiAJZmJ1ZiA9IHBkZXYtPmZpbGxfZnJhbWU7CiAJaWYgKGZidWYgPT0gTlVMTCkgewotCQlFcnIoInB3Y19pc29jX2hhbmRsZXIgd2l0aG91dCB2YWxpZCBmaWxsIGZyYW1lLlxuIik7CisJCVBXQ19FUlJPUigicHdjX2lzb2NfaGFuZGxlciB3aXRob3V0IHZhbGlkIGZpbGwgZnJhbWUuXG4iKTsKIAkJYXdha2UgPSAxOwogCQlnb3RvIGhhbmRsZXJfZW5kOwogCX0KQEAgLTY4OCw3ICs3NTUsNyBAQAogCiAJCQkJCS8qIC4uLmNvcHkgZGF0YSB0byBmcmFtZSBidWZmZXIsIGlmIHBvc3NpYmxlICovCiAJCQkJCWlmIChmbGVuICsgZmJ1Zi0+ZmlsbGVkID4gcGRldi0+ZnJhbWVfdG90YWxfc2l6ZSkgewotCQkJCQkJVHJhY2UoVFJBQ0VfRkxPVywgIkZyYW1lIGJ1ZmZlciBvdmVyZmxvdyAoZmxlbiA9ICVkLCBmcmFtZV90b3RhbF9zaXplID0gJWQpLlxuIiwgZmxlbiwgcGRldi0+ZnJhbWVfdG90YWxfc2l6ZSk7CisJCQkJCQlQV0NfREVCVUdfRkxPVygiRnJhbWUgYnVmZmVyIG92ZXJmbG93IChmbGVuID0gJWQsIGZyYW1lX3RvdGFsX3NpemUgPSAlZCkuXG4iLCBmbGVuLCBwZGV2LT5mcmFtZV90b3RhbF9zaXplKTsKIAkJCQkJCXBkZXYtPnZzeW5jID0gMDsgLyogSG1tLCBsZXQncyB3YWl0IGZvciBhbiBFT0YgKGVuZC1vZi1mcmFtZSkgKi8KIAkJCQkJCXBkZXYtPnZmcmFtZXNfZXJyb3IrKzsKIAkJCQkJfQpAQCAtNzA0LDk2ICs3NzEsMjggQEAKIAkJCQkvKiBTaG9ydGVyIHBhY2tldC4uLiBXZSBwcm9iYWJseSBoYXZlIHRoZSBlbmQgb2YgYW4gaW1hZ2UtZnJhbWU7CiAJCQkJICAgd2FrZSB1cCByZWFkKCkgcHJvY2VzcyBhbmQgbGV0IHNlbGVjdCgpL3BvbGwoKSBkbyBzb21ldGhpbmcuCiAJCQkJICAgRGVjb21wcmVzc2lvbiBpcyBkb25lIGluIHVzZXIgdGltZSBvdmVyIHRoZXJlLgotCQkJCSAqLworCQkJCSAgICovCiAJCQkJaWYgKHBkZXYtPnZzeW5jID09IDIpIHsKLQkJCQkJLyogVGhlIFRvVUNhbSBGdW4gQ01PUyBzZW5zb3IgY2F1c2VzIHRoZSBmaXJtd2FyZSB0byBzZW5kIDIgb3IgMyBib2d1cwotCQkJCQkgICBmcmFtZXMgb24gdGhlIFVTQiB3aXJlIGFmdGVyIGFuIGV4cG9zdXJlIGNoYW5nZS4gVGhpcyBjb25kaXRpdGlvbiBpcwotCQkJCQkgICBob3dldmVyIGRldGVjdGVkICBpbiB0aGUgY2FtIGFuZCBhIGJpdCBpcyBzZXQgaW4gdGhlIGhlYWRlci4KLQkJCQkJICovCi0JCQkJCWlmIChwZGV2LT50eXBlID09IDczMCkgewotCQkJCQkJdW5zaWduZWQgY2hhciAqcHRyID0gKHVuc2lnbmVkIGNoYXIgKilmYnVmLT5kYXRhOwotCi0JCQkJCQlpZiAocHRyWzFdID09IDEgJiYgcHRyWzBdICYgMHgxMCkgewotI2lmIFBXQ19ERUJVRwotCQkJCQkJCURlYnVnKCJIeXVuZGFpIENNT1Mgc2Vuc29yIGJ1Zy4gRHJvcHBpbmcgZnJhbWUgJWQuXG4iLCBmYnVmLT5zZXF1ZW5jZSk7Ci0jZW5kaWYKLQkJCQkJCQlwZGV2LT5kcm9wX2ZyYW1lcyArPSAyOwotCQkJCQkJCXBkZXYtPnZmcmFtZXNfZXJyb3IrKzsKLQkJCQkJCX0KLQkJCQkJCWlmICgocHRyWzBdIF4gcGRldi0+dm1pcnJvcikgJiAweDAxKSB7Ci0JCQkJCQkJaWYgKHB0clswXSAmIDB4MDEpCi0JCQkJCQkJCUluZm8oIlNuYXBzaG90IGJ1dHRvbiBwcmVzc2VkLlxuIik7Ci0JCQkJCQkJZWxzZQotCQkJCQkJCQlJbmZvKCJTbmFwc2hvdCBidXR0b24gcmVsZWFzZWQuXG4iKTsKLQkJCQkJCX0KLQkJCQkJCWlmICgocHRyWzBdIF4gcGRldi0+dm1pcnJvcikgJiAweDAyKSB7Ci0JCQkJCQkJaWYgKHB0clswXSAmIDB4MDIpCi0JCQkJCQkJCUluZm8oIkltYWdlIGlzIG1pcnJvcmVkLlxuIik7Ci0JCQkJCQkJZWxzZQotCQkJCQkJCQlJbmZvKCJJbWFnZSBpcyBub3JtYWwuXG4iKTsKLQkJCQkJCX0KLQkJCQkJCXBkZXYtPnZtaXJyb3IgPSBwdHJbMF0gJiAweDAzOwotCQkJCQkJLyogU29tZXRpbWVzIHRoZSB0cmFpbGVyIG9mIHRoZSA3MzAgaXMgc3RpbGwgc2VudCBhcyBhIDQgYnl0ZSBwYWNrZXQKLQkJCQkJCSAgIGFmdGVyIGEgc2hvcnQgZnJhbWU7IHRoaXMgY29uZGl0aW9uIGlzIGZpbHRlcmVkIG91dCBzcGVjaWZpY2FsbHkuIEEgNCBieXRlCi0JCQkJCQkgICBmcmFtZSBkb2Vzbid0IG1ha2Ugc2Vuc2UgYW55d2F5LgotCQkJCQkJICAgU28gd2UgZ2V0IGVpdGhlciB0aGlzIHNlcXVlbmNlOgotCQkJCQkJCWRyb3BfYml0IHNldCAtPiA0IGJ5dGUgZnJhbWUgLT4gc2hvcnQgZnJhbWUgLT4gZ29vZCBmcmFtZQotCQkJCQkJICAgT3IgdGhpcyBvbmU6Ci0JCQkJCQkJZHJvcF9iaXQgc2V0IC0+IHNob3J0IGZyYW1lIC0+IGdvb2QgZnJhbWUKLQkJCQkJCSAgIFNvIHdlIGRyb3AgZWl0aGVyIDMgb3IgMiBmcmFtZXMgaW4gYWxsIQotCQkJCQkJICovCi0JCQkJCQlpZiAoZmJ1Zi0+ZmlsbGVkID09IDQpCi0JCQkJCQkJcGRldi0+ZHJvcF9mcmFtZXMrKzsKKwkJCQkJaWYgKHB3Y19yY3Zfc2hvcnRfcGFja2V0KHBkZXYsIGZidWYpKSB7CisJCQkJCQlhd2FrZSA9IDE7CisJCQkJCQlmYnVmID0gcGRldi0+ZmlsbF9mcmFtZTsKIAkJCQkJfQotCi0JCQkJCS8qIEluIGNhc2Ugd2Ugd2VyZSBpbnN0cnVjdGVkIHRvIGRyb3AgdGhlIGZyYW1lLCBkbyBzbyBzaWxlbnRseS4KLQkJCQkJICAgVGhlIGJ1ZmZlciBwb2ludGVycyBhcmUgbm90IHVwZGF0ZWQgZWl0aGVyIChidXQgdGhlIGNvdW50ZXJzIGFyZSByZXNldCBiZWxvdykuCi0JCQkJCSAqLwotCQkJCQlpZiAocGRldi0+ZHJvcF9mcmFtZXMgPiAwKQotCQkJCQkJcGRldi0+ZHJvcF9mcmFtZXMtLTsKLQkJCQkJZWxzZSB7Ci0JCQkJCQkvKiBDaGVjayBmb3IgdW5kZXJmbG93IGZpcnN0ICovCi0JCQkJCQlpZiAoZmJ1Zi0+ZmlsbGVkIDwgcGRldi0+ZnJhbWVfdG90YWxfc2l6ZSkgewotCQkJCQkJCVRyYWNlKFRSQUNFX0ZMT1csICJGcmFtZSBidWZmZXIgdW5kZXJmbG93ICglZCBieXRlcyk7IGRpc2NhcmRlZC5cbiIsIGZidWYtPmZpbGxlZCk7Ci0JCQkJCQkJcGRldi0+dmZyYW1lc19lcnJvcisrOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJLyogU2VuZCBvbmx5IG9uY2UgcGVyIEVPRiAqLwotCQkJCQkJCWF3YWtlID0gMTsgLyogZGVsYXkgd2FrZV91cHMgKi8KLQotCQkJCQkJCS8qIEZpbmQgb3VyIG5leHQgZnJhbWUgdG8gZmlsbC4gVGhpcyB3aWxsIGFsd2F5cyBzdWNjZWVkLCBzaW5jZSB3ZQotCQkJCQkJCSAqIG5pY2sgYSBmcmFtZSBmcm9tIGVpdGhlciBlbXB0eSBvciBmdWxsIGxpc3QsIGJ1dCBpZiB3ZSBoYWQgdG8KLQkJCQkJCQkgKiB0YWtlIGl0IGZyb20gdGhlIGZ1bGwgbGlzdCwgaXQgbWVhbnMgYSBmcmFtZSBnb3QgZHJvcHBlZC4KLQkJCQkJCQkgKi8KLQkJCQkJCQlpZiAocHdjX25leHRfZmlsbF9mcmFtZShwZGV2KSkgewotCQkJCQkJCQlwZGV2LT52ZnJhbWVzX2R1bXBlZCsrOwotCQkJCQkJCQlpZiAoKHBkZXYtPnZmcmFtZV9jb3VudCA+IEZSQU1FX0xPV01BUkspICYmIChwd2NfdHJhY2UgJiBUUkFDRV9GTE9XKSkgewotCQkJCQkJCQkJaWYgKHBkZXYtPnZmcmFtZXNfZHVtcGVkIDwgMjApCi0JCQkJCQkJCQkJVHJhY2UoVFJBQ0VfRkxPVywgIkR1bXBpbmcgZnJhbWUgJWQuXG4iLCBwZGV2LT52ZnJhbWVfY291bnQpOwotCQkJCQkJCQkJaWYgKHBkZXYtPnZmcmFtZXNfZHVtcGVkID09IDIwKQotCQkJCQkJCQkJCVRyYWNlKFRSQUNFX0ZMT1csICJEdW1waW5nIGZyYW1lICVkIChsYXN0IG1lc3NhZ2UpLlxuIiwgcGRldi0+dmZyYW1lX2NvdW50KTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlmYnVmID0gcGRldi0+ZmlsbF9mcmFtZTsKLQkJCQkJCX0KLQkJCQkJfSAvKiAhZHJvcF9mcmFtZXMgKi8KLQkJCQkJcGRldi0+dmZyYW1lX2NvdW50Kys7CiAJCQkJfQogCQkJCWZidWYtPmZpbGxlZCA9IDA7CiAJCQkJZmlsbHB0ciA9IGZidWYtPmRhdGE7CiAJCQkJcGRldi0+dnN5bmMgPSAxOwotCQkJfSAvKiAuLiBmbGVuIDwgbGFzdF9wYWNrZXRfc2l6ZSAqLworCQkJfQorCiAJCQlwZGV2LT52bGFzdF9wYWNrZXRfc2l6ZSA9IGZsZW47CiAJCX0gLyogLi5zdGF0dXMgPT0gMCAqLwotI2lmIFBXQ19ERUJVRwotCQkvKiBUaGlzIGlzIG5vcm1hbGx5IG5vdCBpbnRlcmVzdGluZyB0byB0aGUgdXNlciwgdW5sZXNzIHlvdSBhcmUgcmVhbGx5IGRlYnVnZ2luZyBzb21ldGhpbmcgKi8KIAkJZWxzZSB7CisJCQkvKiBUaGlzIGlzIG5vcm1hbGx5IG5vdCBpbnRlcmVzdGluZyB0byB0aGUgdXNlciwgdW5sZXNzCisJCQkgKiB5b3UgYXJlIHJlYWxseSBkZWJ1Z2dpbmcgc29tZXRoaW5nICovCiAJCQlzdGF0aWMgaW50IGlzb19lcnJvciA9IDA7CiAJCQlpc29fZXJyb3IrKzsKIAkJCWlmIChpc29fZXJyb3IgPCAyMCkKLQkJCQlUcmFjZShUUkFDRV9GTE9XLCAiSXNvIGZyYW1lICVkIG9mIFVTQiBoYXMgZXJyb3IgJWRcbiIsIGksIGZzdCk7CisJCQkJUFdDX0RFQlVHX0ZMT1coIklzbyBmcmFtZSAlZCBvZiBVU0IgaGFzIGVycm9yICVkXG4iLCBpLCBmc3QpOwogCQl9Ci0jZW5kaWYKIAl9CiAKIGhhbmRsZXJfZW5kOgpAQCAtODAzLDExICs4MDIsMTEgQEAKIAl1cmItPmRldiA9IHBkZXYtPnVkZXY7CiAJaSA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CiAJaWYgKGkgIT0gMCkKLQkJRXJyKCJFcnJvciAoJWQpIHJlLXN1Ym1pdHRpbmcgdXJiIGluIHB3Y19pc29jX2hhbmRsZXIuXG4iLCBpKTsKKwkJUFdDX0VSUk9SKCJFcnJvciAoJWQpIHJlLXN1Ym1pdHRpbmcgdXJiIGluIHB3Y19pc29jX2hhbmRsZXIuXG4iLCBpKTsKIH0KIAogCi1zdGF0aWMgaW50IHB3Y19pc29jX2luaXQoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpCitpbnQgcHdjX2lzb2NfaW5pdChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldjsKIAlzdHJ1Y3QgdXJiICp1cmI7CkBAIC04MjYsNyArODI1LDYgQEAKIAkvKiBHZXQgdGhlIGN1cnJlbnQgYWx0ZXJuYXRlIGludGVyZmFjZSwgYWRqdXN0IHBhY2tldCBzaXplICovCiAJaWYgKCF1ZGV2LT5hY3Rjb25maWcpCiAJCXJldHVybiAtRUZBVUxUOwotCiAJaW50ZiA9IHVzYl9pZm51bV90b19pZih1ZGV2LCAwKTsKIAlpZiAoaW50ZikKIAkJaWRlc2MgPSB1c2JfYWx0bnVtX3RvX2FsdHNldHRpbmcoaW50ZiwgcGRldi0+dmFsdGVybmF0ZSk7CkBAIC04MzYsMjAgKzgzNCwyMSBAQAogCiAJLyogU2VhcmNoIHZpZGVvIGVuZHBvaW50ICovCiAJcGRldi0+dm1heF9wYWNrZXRfc2l6ZSA9IC0xOwotCWZvciAoaSA9IDA7IGkgPCBpZGVzYy0+ZGVzYy5iTnVtRW5kcG9pbnRzOyBpKyspCisJZm9yIChpID0gMDsgaSA8IGlkZXNjLT5kZXNjLmJOdW1FbmRwb2ludHM7IGkrKykgewogCQlpZiAoKGlkZXNjLT5lbmRwb2ludFtpXS5kZXNjLmJFbmRwb2ludEFkZHJlc3MgJiAweEYpID09IHBkZXYtPnZlbmRwb2ludCkgewogCQkJcGRldi0+dm1heF9wYWNrZXRfc2l6ZSA9IGxlMTZfdG9fY3B1KGlkZXNjLT5lbmRwb2ludFtpXS5kZXNjLndNYXhQYWNrZXRTaXplKTsKIAkJCWJyZWFrOwogCQl9CisJfQogCiAJaWYgKHBkZXYtPnZtYXhfcGFja2V0X3NpemUgPCAwIHx8IHBkZXYtPnZtYXhfcGFja2V0X3NpemUgPiBJU09fTUFYX0ZSQU1FX1NJWkUpIHsKLQkJRXJyKCJGYWlsZWQgdG8gZmluZCBwYWNrZXQgc2l6ZSBmb3IgdmlkZW8gZW5kcG9pbnQgaW4gY3VycmVudCBhbHRlcm5hdGUgc2V0dGluZy5cbiIpOworCQlQV0NfRVJST1IoIkZhaWxlZCB0byBmaW5kIHBhY2tldCBzaXplIGZvciB2aWRlbyBlbmRwb2ludCBpbiBjdXJyZW50IGFsdGVybmF0ZSBzZXR0aW5nLlxuIik7CiAJCXJldHVybiAtRU5GSUxFOyAvKiBPZGQgZXJyb3IsIHRoYXQgc2hvdWxkIGJlIG5vdGljZWFibGUgKi8KIAl9CiAKIAkvKiBTZXQgYWx0ZXJuYXRlIGludGVyZmFjZSAqLwogCXJldCA9IDA7Ci0JVHJhY2UoVFJBQ0VfT1BFTiwgIlNldHRpbmcgYWx0ZXJuYXRlIGludGVyZmFjZSAlZFxuIiwgcGRldi0+dmFsdGVybmF0ZSk7CisJUFdDX0RFQlVHX09QRU4oIlNldHRpbmcgYWx0ZXJuYXRlIGludGVyZmFjZSAlZFxuIiwgcGRldi0+dmFsdGVybmF0ZSk7CiAJcmV0ID0gdXNiX3NldF9pbnRlcmZhY2UocGRldi0+dWRldiwgMCwgcGRldi0+dmFsdGVybmF0ZSk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CkBAIC04NTcsMTIgKzg1NiwxMiBAQAogCWZvciAoaSA9IDA7IGkgPCBNQVhfSVNPX0JVRlM7IGkrKykgewogCQl1cmIgPSB1c2JfYWxsb2NfdXJiKElTT19GUkFNRVNfUEVSX0RFU0MsIEdGUF9LRVJORUwpOwogCQlpZiAodXJiID09IE5VTEwpIHsKLQkJCUVycigiRmFpbGVkIHRvIGFsbG9jYXRlIHVyYiAlZFxuIiwgaSk7CisJCQlQV0NfRVJST1IoIkZhaWxlZCB0byBhbGxvY2F0ZSB1cmIgJWRcbiIsIGkpOwogCQkJcmV0ID0gLUVOT01FTTsKIAkJCWJyZWFrOwogCQl9CiAJCXBkZXYtPnNidWZbaV0udXJiID0gdXJiOwotCQlUcmFjZShUUkFDRV9NRU1PUlksICJBbGxvY2F0ZWQgVVJCIGF0IDB4JXBcbiIsIHVyYik7CisJCVBXQ19ERUJVR19NRU1PUlkoIkFsbG9jYXRlZCBVUkIgYXQgMHglcFxuIiwgdXJiKTsKIAl9CiAJaWYgKHJldCkgewogCQkvKiBEZS1hbGxvY2F0ZSBpbiByZXZlcnNlIG9yZGVyICovCkBAIC04OTksMjQgKzg5OCwyNiBAQAogCWZvciAoaSA9IDA7IGkgPCBNQVhfSVNPX0JVRlM7IGkrKykgewogCQlyZXQgPSB1c2Jfc3VibWl0X3VyYihwZGV2LT5zYnVmW2ldLnVyYiwgR0ZQX0tFUk5FTCk7CiAJCWlmIChyZXQpCi0JCQlFcnIoImlzb2NfaW5pdCgpIHN1Ym1pdF91cmIgJWQgZmFpbGVkIHdpdGggZXJyb3IgJWRcbiIsIGksIHJldCk7CisJCQlQV0NfRVJST1IoImlzb2NfaW5pdCgpIHN1Ym1pdF91cmIgJWQgZmFpbGVkIHdpdGggZXJyb3IgJWRcbiIsIGksIHJldCk7CiAJCWVsc2UKLQkJCVRyYWNlKFRSQUNFX01FTU9SWSwgIlVSQiAweCVwIHN1Ym1pdHRlZC5cbiIsIHBkZXYtPnNidWZbaV0udXJiKTsKKwkJCVBXQ19ERUJVR19NRU1PUlkoIlVSQiAweCVwIHN1Ym1pdHRlZC5cbiIsIHBkZXYtPnNidWZbaV0udXJiKTsKIAl9CiAKIAkvKiBBbGwgaXMgZG9uZS4uLiAqLwogCXBkZXYtPmlzb19pbml0ID0gMTsKLQlUcmFjZShUUkFDRV9PUEVOLCAiPDwgcHdjX2lzb2NfaW5pdCgpXG4iKTsKKwlQV0NfREVCVUdfT1BFTigiPDwgcHdjX2lzb2NfaW5pdCgpXG4iKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgcHdjX2lzb2NfY2xlYW51cChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldikKK3ZvaWQgcHdjX2lzb2NfY2xlYW51cChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldikKIHsKIAlpbnQgaTsKIAotCVRyYWNlKFRSQUNFX09QRU4sICI+PiBwd2NfaXNvY19jbGVhbnVwKClcbiIpOworCVBXQ19ERUJVR19PUEVOKCI+PiBwd2NfaXNvY19jbGVhbnVwKClcbiIpOwogCWlmIChwZGV2ID09IE5VTEwpCiAJCXJldHVybjsKKwlpZiAocGRldi0+aXNvX2luaXQgPT0gMCkKKwkJcmV0dXJuOwogCiAJLyogVW5saW5raW5nIElTT0MgYnVmZmVycyBvbmUgYnkgb25lICovCiAJZm9yIChpID0gMDsgaSA8IE1BWF9JU09fQlVGUzsgaSsrKSB7CkBAIC05MjUsMTAgKzkyNiwxMCBAQAogCQl1cmIgPSBwZGV2LT5zYnVmW2ldLnVyYjsKIAkJaWYgKHVyYiAhPSAwKSB7CiAJCQlpZiAocGRldi0+aXNvX2luaXQpIHsKLQkJCQlUcmFjZShUUkFDRV9NRU1PUlksICJVbmxpbmtpbmcgVVJCICVwXG4iLCB1cmIpOworCQkJCVBXQ19ERUJVR19NRU1PUlkoIlVubGlua2luZyBVUkIgJXBcbiIsIHVyYik7CiAJCQkJdXNiX2tpbGxfdXJiKHVyYik7CiAJCQl9Ci0JCQlUcmFjZShUUkFDRV9NRU1PUlksICJGcmVlaW5nIFVSQlxuIik7CisJCQlQV0NfREVCVUdfTUVNT1JZKCJGcmVlaW5nIFVSQlxuIik7CiAJCQl1c2JfZnJlZV91cmIodXJiKTsKIAkJCXBkZXYtPnNidWZbaV0udXJiID0gTlVMTDsKIAkJfQpAQCAtOTM4LDEyICs5MzksMTIgQEAKIAkgICBpcyBzaWduYWxsZWQgYnkgRVBJUEUpCiAJICovCiAJaWYgKHBkZXYtPmVycm9yX3N0YXR1cyAmJiBwZGV2LT5lcnJvcl9zdGF0dXMgIT0gRVBJUEUpIHsKLQkJVHJhY2UoVFJBQ0VfT1BFTiwgIlNldHRpbmcgYWx0ZXJuYXRlIGludGVyZmFjZSAwLlxuIik7CisJCVBXQ19ERUJVR19PUEVOKCJTZXR0aW5nIGFsdGVybmF0ZSBpbnRlcmZhY2UgMC5cbiIpOwogCQl1c2Jfc2V0X2ludGVyZmFjZShwZGV2LT51ZGV2LCAwLCAwKTsKIAl9CiAKIAlwZGV2LT5pc29faW5pdCA9IDA7Ci0JVHJhY2UoVFJBQ0VfT1BFTiwgIjw8IHB3Y19pc29jX2NsZWFudXAoKVxuIik7CisJUFdDX0RFQlVHX09QRU4oIjw8IHB3Y19pc29jX2NsZWFudXAoKVxuIik7CiB9CiAKIGludCBwd2NfdHJ5X3ZpZGVvX21vZGUoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IG5ld19mcHMsIGludCBuZXdfY29tcHJlc3Npb24sIGludCBuZXdfc25hcHNob3QpCkBAIC05NTcsMTggKzk1OCwxOCBAQAogCS8qIFRyeSB0byBzZXQgdmlkZW8gbW9kZS4uLiAqLwogCXN0YXJ0ID0gcmV0ID0gcHdjX3NldF92aWRlb19tb2RlKHBkZXYsIHdpZHRoLCBoZWlnaHQsIG5ld19mcHMsIG5ld19jb21wcmVzc2lvbiwgbmV3X3NuYXBzaG90KTsKIAlpZiAocmV0KSB7Ci0JCVRyYWNlKFRSQUNFX0ZMT1csICJwd2Nfc2V0X3ZpZGVvX21vZGUgYXR0ZW1wdCAxIGZhaWxlZC5cbiIpOworCQlQV0NfREVCVUdfRkxPVygicHdjX3NldF92aWRlb19tb2RlIGF0dGVtcHQgMSBmYWlsZWQuXG4iKTsKIAkJLyogVGhhdCBmYWlsZWQuLi4gcmVzdG9yZSBvbGQgbW9kZSAod2Uga25vdyB0aGF0IHdvcmtlZCkgKi8KIAkJc3RhcnQgPSBwd2Nfc2V0X3ZpZGVvX21vZGUocGRldiwgcGRldi0+dmlldy54LCBwZGV2LT52aWV3LnksIHBkZXYtPnZmcmFtZXMsIHBkZXYtPnZjb21wcmVzc2lvbiwgcGRldi0+dnNuYXBzaG90KTsKIAkJaWYgKHN0YXJ0KSB7Ci0JCQlUcmFjZShUUkFDRV9GTE9XLCAicHdjX3NldF92aWRlb19tb2RlIGF0dGVtcHQgMiBmYWlsZWQuXG4iKTsKKwkJCVBXQ19ERUJVR19GTE9XKCJwd2Nfc2V0X3ZpZGVvX21vZGUgYXR0ZW1wdCAyIGZhaWxlZC5cbiIpOwogCQl9CiAJfQogCWlmIChzdGFydCA9PSAwKQogCXsKIAkJaWYgKHB3Y19pc29jX2luaXQocGRldikgPCAwKQogCQl7Ci0JCQlJbmZvKCJGYWlsZWQgdG8gcmVzdGFydCBJU09DIHRyYW5zZmVycyBpbiBwd2NfdHJ5X3ZpZGVvX21vZGUuXG4iKTsKKwkJCVBXQ19XQVJOSU5HKCJGYWlsZWQgdG8gcmVzdGFydCBJU09DIHRyYW5zZmVycyBpbiBwd2NfdHJ5X3ZpZGVvX21vZGUuXG4iKTsKIAkJCXJldCA9IC1FQUdBSU47IC8qIGxldCdzIHRyeSBhZ2Fpbiwgd2hvIGtub3dzIGlmIGl0IHdvcmtzIGEgc2Vjb25kIHRpbWUgKi8KIAkJfQogCX0KQEAgLTk3Niw1NCArOTc3LDEyOSBAQAogCXJldHVybiByZXQ7IC8qIFJldHVybiBvcmlnaW5hbCBlcnJvciBjb2RlICovCiB9CiAKKy8qKioqKioqKioKKyAqIHN5c2ZzCisgKioqKioqKioqLworc3RhdGljIHN0cnVjdCBwd2NfZGV2aWNlICpjZF90b19wd2Moc3RydWN0IGNsYXNzX2RldmljZSAqY2QpCit7CisJc3RydWN0IHZpZGVvX2RldmljZSAqdmRldiA9IHRvX3ZpZGVvX2RldmljZShjZCk7CisJcmV0dXJuIHZpZGVvX2dldF9kcnZkYXRhKHZkZXYpOworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X3Bhbl90aWx0KHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBwd2NfZGV2aWNlICpwZGV2ID0gY2RfdG9fcHdjKGNsYXNzX2Rldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWQgJWRcbiIsIHBkZXYtPnBhbl9hbmdsZSwgcGRldi0+dGlsdF9hbmdsZSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX3Bhbl90aWx0KHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldiwgY29uc3QgY2hhciAqYnVmLAorCQkJIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiA9IGNkX3RvX3B3YyhjbGFzc19kZXYpOworCWludCBwYW4sIHRpbHQ7CisJaW50IHJldCA9IC1FSU5WQUw7CisKKwlpZiAoc3RybmNtcChidWYsICJyZXNldCIsIDUpID09IDApCisJCXJldCA9IHB3Y19tcHRfcmVzZXQocGRldiwgMHgzKTsKKworCWVsc2UgaWYgKHNzY2FuZihidWYsICIlZCAlZCIsICZwYW4sICZ0aWx0KSA+IDApCisJCXJldCA9IHB3Y19tcHRfc2V0X2FuZ2xlKHBkZXYsIHBhbiwgdGlsdCk7CisKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlyZXR1cm4gc3RybGVuKGJ1Zik7Cit9CitzdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIocGFuX3RpbHQsIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X3Bhbl90aWx0LAorCQkJIHN0b3JlX3Bhbl90aWx0KTsKKworc3RhdGljIHNzaXplX3Qgc2hvd19zbmFwc2hvdF9idXR0b25fc3RhdHVzKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBwd2NfZGV2aWNlICpwZGV2ID0gY2RfdG9fcHdjKGNsYXNzX2Rldik7CisJaW50IHN0YXR1cyA9IHBkZXYtPnNuYXBzaG90X2J1dHRvbl9zdGF0dXM7CisJcGRldi0+c25hcHNob3RfYnV0dG9uX3N0YXR1cyA9IDA7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHN0YXR1cyk7Cit9CisKK3N0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihidXR0b24sIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X3NuYXBzaG90X2J1dHRvbl9zdGF0dXMsCisJCQkgTlVMTCk7CisKK3N0YXRpYyB2b2lkIHB3Y19jcmVhdGVfc3lzZnNfZmlsZXMoc3RydWN0IHZpZGVvX2RldmljZSAqdmRldikKK3sKKwlzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiA9IHZpZGVvX2dldF9kcnZkYXRhKHZkZXYpOworCWlmIChwZGV2LT5mZWF0dXJlcyAmIEZFQVRVUkVfTU9UT1JfUEFOVElMVCkKKwkJdmlkZW9fZGV2aWNlX2NyZWF0ZV9maWxlKHZkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9wYW5fdGlsdCk7CisJdmlkZW9fZGV2aWNlX2NyZWF0ZV9maWxlKHZkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9idXR0b24pOworfQorCitzdGF0aWMgdm9pZCBwd2NfcmVtb3ZlX3N5c2ZzX2ZpbGVzKHN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYpCit7CisJc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYgPSB2aWRlb19nZXRfZHJ2ZGF0YSh2ZGV2KTsKKwlpZiAocGRldi0+ZmVhdHVyZXMgJiBGRUFUVVJFX01PVE9SX1BBTlRJTFQpCisJCXZpZGVvX2RldmljZV9yZW1vdmVfZmlsZSh2ZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfcGFuX3RpbHQpOworCXZpZGVvX2RldmljZV9yZW1vdmVfZmlsZSh2ZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfYnV0dG9uKTsKK30KKworI2lmIENPTkZJR19QV0NfREVCVUcKK3N0YXRpYyBjb25zdCBjaGFyICpwd2Nfc2Vuc29yX3R5cGVfdG9fc3RyaW5nKHVuc2lnbmVkIGludCBzZW5zb3JfdHlwZSkKK3sKKwlzd2l0Y2goc2Vuc29yX3R5cGUpIHsKKwkJY2FzZSAweDAwOgorCQkJcmV0dXJuICJIeXVuZGFpIENNT1Mgc2Vuc29yIjsKKwkJY2FzZSAweDIwOgorCQkJcmV0dXJuICJTb255IENDRCBzZW5zb3IgKyBUREE4Nzg3IjsKKwkJY2FzZSAweDJFOgorCQkJcmV0dXJuICJTb255IENDRCBzZW5zb3IgKyBFeGFzIDk4TDU5IjsKKwkJY2FzZSAweDJGOgorCQkJcmV0dXJuICJTb255IENDRCBzZW5zb3IgKyBBREkgOTgwNCI7CisJCWNhc2UgMHgzMDoKKwkJCXJldHVybiAiU2hhcnAgQ0NEIHNlbnNvciArIFREQTg3ODciOworCQljYXNlIDB4M0U6CisJCQlyZXR1cm4gIlNoYXJwIENDRCBzZW5zb3IgKyBFeGFzIDk4TDU5IjsKKwkJY2FzZSAweDNGOgorCQkJcmV0dXJuICJTaGFycCBDQ0Qgc2Vuc29yICsgQURJIDk4MDQiOworCQljYXNlIDB4NDA6CisJCQlyZXR1cm4gIlVQQSAxMDIxIHNlbnNvciI7CisJCWNhc2UgMHgxMDA6CisJCQlyZXR1cm4gIlZHQSBzZW5zb3IiOworCQljYXNlIDB4MTAxOgorCQkJcmV0dXJuICJQQUwgTVIgc2Vuc29yIjsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAidW5rbm93biB0eXBlIG9mIHNlbnNvciI7CisJfQorfQorI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBWaWRlbzRMaW51eCBmdW5jdGlvbnMgKi8KIAogc3RhdGljIGludCBwd2NfdmlkZW9fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlpbnQgaTsKKwlpbnQgaSwgcmV0OwogCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwogCXN0cnVjdCBwd2NfZGV2aWNlICpwZGV2OwogCi0JVHJhY2UoVFJBQ0VfT1BFTiwgIj4+IHZpZGVvX29wZW4gY2FsbGVkKHZkZXYgPSAweCVwKS5cbiIsIHZkZXYpOworCVBXQ19ERUJVR19PUEVOKCI+PiB2aWRlb19vcGVuIGNhbGxlZCh2ZGV2ID0gMHglcCkuXG4iLCB2ZGV2KTsKIAogCXBkZXYgPSAoc3RydWN0IHB3Y19kZXZpY2UgKil2ZGV2LT5wcml2OwogCWlmIChwZGV2ID09IE5VTEwpCiAJCUJVRygpOwotCWlmIChwZGV2LT52b3BlbikKKwlpZiAocGRldi0+dm9wZW4pIHsKKwkJUFdDX0RFQlVHX09QRU4oIkknbSBidXN5LCBzb21lb25lIGlzIHVzaW5nIHRoZSBkZXZpY2UuXG4iKTsKIAkJcmV0dXJuIC1FQlVTWTsKKwl9CiAKIAlkb3duKCZwZGV2LT5tb2Rsb2NrKTsKIAlpZiAoIXBkZXYtPnVzYl9pbml0KSB7Ci0JCVRyYWNlKFRSQUNFX09QRU4sICJEb2luZyBmaXJzdCB0aW1lIGluaXRpYWxpemF0aW9uLlxuIik7CisJCVBXQ19ERUJVR19PUEVOKCJEb2luZyBmaXJzdCB0aW1lIGluaXRpYWxpemF0aW9uLlxuIik7CiAJCXBkZXYtPnVzYl9pbml0ID0gMTsKIAotCQlpZiAocHdjX3RyYWNlICYgVFJBQ0VfT1BFTikKKwkJLyogUXVlcnkgc2Vuc29yIHR5cGUgKi8KKwkJcmV0ID0gcHdjX2dldF9jbW9zX3NlbnNvcihwZGV2LCAmaSk7CisJCWlmIChyZXQgPj0gMCkKIAkJewotCQkJLyogUXVlcnkgc2Vuc29yIHR5cGUgKi8KLQkJCWNvbnN0IGNoYXIgKnNlbnNvcl90eXBlID0gTlVMTDsKLQkJCWludCByZXQ7Ci0KLQkJCXJldCA9IHB3Y19nZXRfY21vc19zZW5zb3IocGRldiwgJmkpOwotCQkJaWYgKHJldCA+PSAwKQotCQkJewotCQkJCXN3aXRjaChpKSB7Ci0JCQkJY2FzZSAweDAwOiAgc2Vuc29yX3R5cGUgPSAiSHl1bmRhaSBDTU9TIHNlbnNvciI7IGJyZWFrOwotCQkJCWNhc2UgMHgyMDogIHNlbnNvcl90eXBlID0gIlNvbnkgQ0NEIHNlbnNvciArIFREQTg3ODciOyBicmVhazsKLQkJCQljYXNlIDB4MkU6ICBzZW5zb3JfdHlwZSA9ICJTb255IENDRCBzZW5zb3IgKyBFeGFzIDk4TDU5IjsgYnJlYWs7Ci0JCQkJY2FzZSAweDJGOiAgc2Vuc29yX3R5cGUgPSAiU29ueSBDQ0Qgc2Vuc29yICsgQURJIDk4MDQiOyBicmVhazsKLQkJCQljYXNlIDB4MzA6ICBzZW5zb3JfdHlwZSA9ICJTaGFycCBDQ0Qgc2Vuc29yICsgVERBODc4NyI7IGJyZWFrOwotCQkJCWNhc2UgMHgzRTogIHNlbnNvcl90eXBlID0gIlNoYXJwIENDRCBzZW5zb3IgKyBFeGFzIDk4TDU5IjsgYnJlYWs7Ci0JCQkJY2FzZSAweDNGOiAgc2Vuc29yX3R5cGUgPSAiU2hhcnAgQ0NEIHNlbnNvciArIEFESSA5ODA0IjsgYnJlYWs7Ci0JCQkJY2FzZSAweDQwOiAgc2Vuc29yX3R5cGUgPSAiVVBBIDEwMjEgc2Vuc29yIjsgYnJlYWs7Ci0JCQkJY2FzZSAweDEwMDogc2Vuc29yX3R5cGUgPSAiVkdBIHNlbnNvciI7IGJyZWFrOwotCQkJCWNhc2UgMHgxMDE6IHNlbnNvcl90eXBlID0gIlBBTCBNUiBzZW5zb3IiOyBicmVhazsKLQkJCQlkZWZhdWx0OiAgICBzZW5zb3JfdHlwZSA9ICJ1bmtub3duIHR5cGUgb2Ygc2Vuc29yIjsgYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHNlbnNvcl90eXBlICE9IE5VTEwpCi0JCQkJSW5mbygiVGhpcyAlcyBjYW1lcmEgaXMgZXF1aXBwZWQgd2l0aCBhICVzICglZCkuXG4iLCBwZGV2LT52ZGV2LT5uYW1lLCBzZW5zb3JfdHlwZSwgaSk7CisJCQlQV0NfREVCVUdfT1BFTigiVGhpcyAlcyBjYW1lcmEgaXMgZXF1aXBwZWQgd2l0aCBhICVzICglZCkuXG4iLAorCQkJCQlwZGV2LT52ZGV2LT5uYW1lLAorCQkJCQlwd2Nfc2Vuc29yX3R5cGVfdG9fc3RyaW5nKGkpLCBpKTsKIAkJfQogCX0KIApAQCAtMTAzMSwzNCArMTEwNywzMiBAQAogCWlmIChwb3dlcl9zYXZlKSB7CiAJCWkgPSBwd2NfY2FtZXJhX3Bvd2VyKHBkZXYsIDEpOwogCQlpZiAoaSA8IDApCi0JCQlJbmZvKCJGYWlsZWQgdG8gcmVzdG9yZSBwb3dlciB0byB0aGUgY2FtZXJhISAoJWQpXG4iLCBpKTsKKwkJCVBXQ19ERUJVR19PUEVOKCJGYWlsZWQgdG8gcmVzdG9yZSBwb3dlciB0byB0aGUgY2FtZXJhISAoJWQpXG4iLCBpKTsKIAl9CiAJLyogU2V0IExFRCBvbi9vZmYgdGltZSAqLwogCWlmIChwd2Nfc2V0X2xlZHMocGRldiwgbGVkX29uLCBsZWRfb2ZmKSA8IDApCi0JCUluZm8oIkZhaWxlZCB0byBzZXQgTEVEIG9uL29mZiB0aW1lLlxuIik7CisJCVBXQ19ERUJVR19PUEVOKCJGYWlsZWQgdG8gc2V0IExFRCBvbi9vZmYgdGltZS5cbiIpOwogCiAJcHdjX2NvbnN0cnVjdChwZGV2KTsgLyogc2V0IG1pbi9tYXggc2l6ZXMgY29ycmVjdCAqLwogCiAJLyogU28gZmFyLCBzbyBnb29kLiBBbGxvY2F0ZSBtZW1vcnkuICovCiAJaSA9IHB3Y19hbGxvY2F0ZV9idWZmZXJzKHBkZXYpOwogCWlmIChpIDwgMCkgewotCQlUcmFjZShUUkFDRV9PUEVOLCAiRmFpbGVkIHRvIGFsbG9jYXRlIGJ1ZmZlciBtZW1vcnkuXG4iKTsKKwkJUFdDX0RFQlVHX09QRU4oIkZhaWxlZCB0byBhbGxvY2F0ZSBidWZmZXJzIG1lbW9yeS5cbiIpOworCQlwd2NfZnJlZV9idWZmZXJzKHBkZXYpOwogCQl1cCgmcGRldi0+bW9kbG9jayk7CiAJCXJldHVybiBpOwogCX0KIAogCS8qIFJlc2V0IGJ1ZmZlcnMgJiBwYXJhbWV0ZXJzICovCiAJcHdjX3Jlc2V0X2J1ZmZlcnMocGRldik7Ci0JZm9yIChpID0gMDsgaSA8IGRlZmF1bHRfbWJ1ZnM7IGkrKykKKwlmb3IgKGkgPSAwOyBpIDwgcHdjX21idWZzOyBpKyspCiAJCXBkZXYtPmltYWdlX3VzZWRbaV0gPSAwOwogCXBkZXYtPnZmcmFtZV9jb3VudCA9IDA7CiAJcGRldi0+dmZyYW1lc19kdW1wZWQgPSAwOwogCXBkZXYtPnZmcmFtZXNfZXJyb3IgPSAwOwogCXBkZXYtPnZpc29jX2Vycm9ycyA9IDA7CiAJcGRldi0+ZXJyb3Jfc3RhdHVzID0gMDsKLSNpZiBQV0NfREVCVUcKLQlwZGV2LT5zZXF1ZW5jZSA9IDA7Ci0jZW5kaWYKIAlwd2NfY29uc3RydWN0KHBkZXYpOyAvKiBzZXQgbWluL21heCBzaXplcyBjb3JyZWN0ICovCiAKIAkvKiBTZXQgc29tZSBkZWZhdWx0cyAqLwpAQCAtMTA3MCwyOSArMTE0NCw0NCBAQAogCSAqLwogCWkgPSBwd2Nfc2V0X3ZpZGVvX21vZGUocGRldiwgcHdjX2ltYWdlX3NpemVzW3BkZXYtPnZzaXplXS54LCBwd2NfaW1hZ2Vfc2l6ZXNbcGRldi0+dnNpemVdLnksIHBkZXYtPnZmcmFtZXMsIHBkZXYtPnZjb21wcmVzc2lvbiwgMCk7CiAJaWYgKGkpCXsKLQkJVHJhY2UoVFJBQ0VfT1BFTiwgIkZpcnN0IGF0dGVtcHQgYXQgc2V0X3ZpZGVvX21vZGUgZmFpbGVkLlxuIik7Ci0JCWlmIChwZGV2LT50eXBlID09IDczMCB8fCBwZGV2LT50eXBlID09IDc0MCB8fCBwZGV2LT50eXBlID09IDc1MCkKLQkJCWkgPSBwd2Nfc2V0X3ZpZGVvX21vZGUocGRldiwgcHdjX2ltYWdlX3NpemVzW1BTWl9RU0lGXS54LCBwd2NfaW1hZ2Vfc2l6ZXNbUFNaX1FTSUZdLnksIDEwLCBwZGV2LT52Y29tcHJlc3Npb24sIDApOworCQl1bnNpZ25lZCBpbnQgZGVmYXVsdF9yZXNvbHV0aW9uOworCQlQV0NfREVCVUdfT1BFTigiRmlyc3QgYXR0ZW1wdCBhdCBzZXRfdmlkZW9fbW9kZSBmYWlsZWQuXG4iKTsKKwkJaWYgKHBkZXYtPnR5cGU+PSA3MzApCisJCQlkZWZhdWx0X3Jlc29sdXRpb24gPSBQU1pfUVNJRjsKIAkJZWxzZQotCQkJaSA9IHB3Y19zZXRfdmlkZW9fbW9kZShwZGV2LCBwd2NfaW1hZ2Vfc2l6ZXNbUFNaX1FDSUZdLngsIHB3Y19pbWFnZV9zaXplc1tQU1pfUUNJRl0ueSwgMTAsIHBkZXYtPnZjb21wcmVzc2lvbiwgMCk7CisJCQlkZWZhdWx0X3Jlc29sdXRpb24gPSBQU1pfUUNJRjsKKworCQlpID0gcHdjX3NldF92aWRlb19tb2RlKHBkZXYsCisJCQkJICAgICAgIHB3Y19pbWFnZV9zaXplc1tkZWZhdWx0X3Jlc29sdXRpb25dLngsCisJCQkJICAgICAgIHB3Y19pbWFnZV9zaXplc1tkZWZhdWx0X3Jlc29sdXRpb25dLnksCisJCQkJICAgICAgIDEwLAorCQkJCSAgICAgICBwZGV2LT52Y29tcHJlc3Npb24sCisJCQkJICAgICAgIDApOwogCX0KIAlpZiAoaSkgewotCQlUcmFjZShUUkFDRV9PUEVOLCAiU2Vjb25kIGF0dGVtcHQgYXQgc2V0X3ZpZGVvX21vZGUgZmFpbGVkLlxuIik7CisJCVBXQ19ERUJVR19PUEVOKCJTZWNvbmQgYXR0ZW1wdCBhdCBzZXRfdmlkZW9fbW9kZSBmYWlsZWQuXG4iKTsKKwkJcHdjX2ZyZWVfYnVmZmVycyhwZGV2KTsKIAkJdXAoJnBkZXYtPm1vZGxvY2spOwogCQlyZXR1cm4gaTsKIAl9CiAKIAlpID0gcHdjX2lzb2NfaW5pdChwZGV2KTsKIAlpZiAoaSkgewotCQlUcmFjZShUUkFDRV9PUEVOLCAiRmFpbGVkIHRvIGluaXQgSVNPQyBzdHVmZiA9ICVkLlxuIiwgaSk7CisJCVBXQ19ERUJVR19PUEVOKCJGYWlsZWQgdG8gaW5pdCBJU09DIHN0dWZmID0gJWQuXG4iLCBpKTsKKwkJcHdjX2lzb2NfY2xlYW51cChwZGV2KTsKKwkJcHdjX2ZyZWVfYnVmZmVycyhwZGV2KTsKIAkJdXAoJnBkZXYtPm1vZGxvY2spOwogCQlyZXR1cm4gaTsKIAl9CiAKKwkvKiBJbml0aWFsaXplIHRoZSB3ZWJjYW0gdG8gc2FuZSB2YWx1ZSAqLworCXB3Y19zZXRfYnJpZ2h0bmVzcyhwZGV2LCAweDdmZmYpOworCXB3Y19zZXRfYWdjKHBkZXYsIDEsIDApOworCiAJcGRldi0+dm9wZW4rKzsKIAlmaWxlLT5wcml2YXRlX2RhdGEgPSB2ZGV2OwogCXVwKCZwZGV2LT5tb2Rsb2NrKTsKLQlUcmFjZShUUkFDRV9PUEVOLCAiPDwgdmlkZW9fb3BlbigpIHJldHVybnMgMC5cbiIpOworCVBXQ19ERUJVR19PUEVOKCI8PCB2aWRlb19vcGVuKCkgcmV0dXJucyAwLlxuIik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTExMDMsMzUgKzExOTIsMjMgQEAKIAlzdHJ1Y3QgcHdjX2RldmljZSAqcGRldjsKIAlpbnQgaTsKIAotCVRyYWNlKFRSQUNFX09QRU4sICI+PiB2aWRlb19jbG9zZSBjYWxsZWQodmRldiA9IDB4JXApLlxuIiwgdmRldik7CisJUFdDX0RFQlVHX09QRU4oIj4+IHZpZGVvX2Nsb3NlIGNhbGxlZCh2ZGV2ID0gMHglcCkuXG4iLCB2ZGV2KTsKIAogCXBkZXYgPSAoc3RydWN0IHB3Y19kZXZpY2UgKil2ZGV2LT5wcml2OwogCWlmIChwZGV2LT52b3BlbiA9PSAwKQotCQlJbmZvKCJ2aWRlb19jbG9zZSgpIGNhbGxlZCBvbiBjbG9zZWQgZGV2aWNlP1xuIik7CisJCVBXQ19ERUJVR19NT0RVTEUoInZpZGVvX2Nsb3NlKCkgY2FsbGVkIG9uIGNsb3NlZCBkZXZpY2U/XG4iKTsKIAogCS8qIER1bXAgc3RhdGlzdGljcywgYnV0IG9ubHkgaWYgYSByZWFzb25hYmxlIGFtb3VudCBvZiBmcmFtZXMgd2VyZQogCSAgIHByb2Nlc3NlZCAodG8gcHJldmVudCBlbmRsZXNzIGxvZy1lbnRyaWVzIGluIGNhc2Ugb2Ygc25hcC1zaG90CiAJICAgcHJvZ3JhbXMpCiAJICovCiAJaWYgKHBkZXYtPnZmcmFtZV9jb3VudCA+IDIwKQotCQlJbmZvKCJDbG9zaW5nIHZpZGVvIGRldmljZTogJWQgZnJhbWVzIHJlY2VpdmVkLCBkdW1wZWQgJWQgZnJhbWVzLCAlZCBmcmFtZXMgd2l0aCBlcnJvcnMuXG4iLCBwZGV2LT52ZnJhbWVfY291bnQsIHBkZXYtPnZmcmFtZXNfZHVtcGVkLCBwZGV2LT52ZnJhbWVzX2Vycm9yKTsKKwkJUFdDX0RFQlVHX01PRFVMRSgiQ2xvc2luZyB2aWRlbyBkZXZpY2U6ICVkIGZyYW1lcyByZWNlaXZlZCwgZHVtcGVkICVkIGZyYW1lcywgJWQgZnJhbWVzIHdpdGggZXJyb3JzLlxuIiwgcGRldi0+dmZyYW1lX2NvdW50LCBwZGV2LT52ZnJhbWVzX2R1bXBlZCwgcGRldi0+dmZyYW1lc19lcnJvcik7CiAKLQlzd2l0Y2ggKHBkZXYtPnR5cGUpCi0JIHsKLQkgIGNhc2UgNjc1OgotCSAgY2FzZSA2ODA6Ci0JICBjYXNlIDY5MDoKLQkgIGNhc2UgNzIwOgotCSAgY2FzZSA3MzA6Ci0JICBjYXNlIDc0MDoKLQkgIGNhc2UgNzUwOgotLyoJICAgIHB3Y19kZWMyM19leGl0KCk7CSovLyogVGltb24gJiBLaWFyYSAqLwotCSAgICBicmVhazsKLQkgIGNhc2UgNjQ1OgotCSAgY2FzZSA2NDY6Ci0vKgkgICAgcHdjX2RlYzFfZXhpdCgpOyAqLwotCSAgICBicmVhazsKLQkgfQorCWlmIChERVZJQ0VfVVNFX0NPREVDMShwZGV2LT50eXBlKSkKKwkgICAgcHdjX2RlYzFfZXhpdCgpOworCWVsc2UKKwkgICAgcHdjX2RlYzIzX2V4aXQoKTsKIAogCXB3Y19pc29jX2NsZWFudXAocGRldik7CiAJcHdjX2ZyZWVfYnVmZmVycyhwZGV2KTsKQEAgLTExNDAsMTUgKzEyMTcsMTUgQEAKIAlpZiAocGRldi0+ZXJyb3Jfc3RhdHVzICE9IEVQSVBFKSB7CiAJCS8qIFR1cm4gTEVEcyBvZmYgKi8KIAkJaWYgKHB3Y19zZXRfbGVkcyhwZGV2LCAwLCAwKSA8IDApCi0JCQlJbmZvKCJGYWlsZWQgdG8gc2V0IExFRCBvbi9vZmYgdGltZS5cbiIpOworCQkJUFdDX0RFQlVHX01PRFVMRSgiRmFpbGVkIHRvIHNldCBMRUQgb24vb2ZmIHRpbWUuXG4iKTsKIAkJaWYgKHBvd2VyX3NhdmUpIHsKIAkJCWkgPSBwd2NfY2FtZXJhX3Bvd2VyKHBkZXYsIDApOwogCQkJaWYgKGkgPCAwKQotCQkJCUVycigiRmFpbGVkIHRvIHBvd2VyIGRvd24gY2FtZXJhICglZClcbiIsIGkpOworCQkJCVBXQ19FUlJPUigiRmFpbGVkIHRvIHBvd2VyIGRvd24gY2FtZXJhICglZClcbiIsIGkpOwogCQl9CiAJfQotCXBkZXYtPnZvcGVuID0gMDsKLQlUcmFjZShUUkFDRV9PUEVOLCAiPDwgdmlkZW9fY2xvc2UoKVxuIik7CisJcGRldi0+dm9wZW4tLTsKKwlQV0NfREVCVUdfT1BFTigiPDwgdmlkZW9fY2xvc2UoKSB2b3Blbj0lZFxuIiwgcGRldi0+dm9wZW4pOwogCXJldHVybiAwOwogfQogCkBAIC0xMTY0LDcgKzEyNDEsNyBAQAogCQlkZXZpY2UgaXMgdHJpY2t5IGFueWhvdy4KICAqLwogCi1zdGF0aWMgc3NpemVfdCBwd2NfdmlkZW9fcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKiBidWYsCitzdGF0aWMgc3NpemVfdCBwd2NfdmlkZW9fcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKIAkJCSAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7CiAJc3RydWN0IHZpZGVvX2RldmljZSAqdmRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKQEAgLTExNzIsOCArMTI0OSwxMCBAQAogCWludCBub2Jsb2NrID0gZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0s7CiAJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CiAJaW50IGJ5dGVzX3RvX3JlYWQ7CisJdm9pZCAqaW1hZ2VfYnVmZmVyX2FkZHI7CiAKLQlUcmFjZShUUkFDRV9SRUFELCAidmlkZW9fcmVhZCgweCVwLCAlcCwgJXp1KSBjYWxsZWQuXG4iLCB2ZGV2LCBidWYsIGNvdW50KTsKKwlQV0NfREVCVUdfUkVBRCgicHdjX3ZpZGVvX3JlYWQodmRldj0weCVwLCBidWY9JXAsIGNvdW50PSV6ZCkgY2FsbGVkLlxuIiwKKwkJCXZkZXYsIGJ1ZiwgY291bnQpOwogCWlmICh2ZGV2ID09IE5VTEwpCiAJCXJldHVybiAtRUZBVUxUOwogCXBkZXYgPSB2ZGV2LT5wcml2OwpAQCAtMTIxNCwxNiArMTI5MywxOSBAQAogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCi0JVHJhY2UoVFJBQ0VfUkVBRCwgIkNvcHlpbmcgZGF0YSB0byB1c2VyIHNwYWNlLlxuIik7CisJUFdDX0RFQlVHX1JFQUQoIkNvcHlpbmcgZGF0YSB0byB1c2VyIHNwYWNlLlxuIik7CiAJaWYgKHBkZXYtPnZwYWxldHRlID09IFZJREVPX1BBTEVUVEVfUkFXKQotCQlieXRlc190b19yZWFkID0gcGRldi0+ZnJhbWVfc2l6ZTsKKwkJYnl0ZXNfdG9fcmVhZCA9IHBkZXYtPmZyYW1lX3NpemUgKyBzaXplb2Yoc3RydWN0IHB3Y19yYXdfZnJhbWUpOwogCWVsc2UKIAkJYnl0ZXNfdG9fcmVhZCA9IHBkZXYtPnZpZXcuc2l6ZTsKIAogCS8qIGNvcHkgYnl0ZXMgdG8gdXNlciBzcGFjZTsgd2UgYWxsb3cgZm9yIHBhcnRpYWwgcmVhZHMgKi8KIAlpZiAoY291bnQgKyBwZGV2LT5pbWFnZV9yZWFkX3BvcyA+IGJ5dGVzX3RvX3JlYWQpCiAJCWNvdW50ID0gYnl0ZXNfdG9fcmVhZCAtIHBkZXYtPmltYWdlX3JlYWRfcG9zOwotCWlmIChjb3B5X3RvX3VzZXIoYnVmLCBwZGV2LT5pbWFnZV9wdHJbcGRldi0+ZmlsbF9pbWFnZV0gKyBwZGV2LT5pbWFnZV9yZWFkX3BvcywgY291bnQpKQorCWltYWdlX2J1ZmZlcl9hZGRyID0gcGRldi0+aW1hZ2VfZGF0YTsKKwlpbWFnZV9idWZmZXJfYWRkciArPSBwZGV2LT5pbWFnZXNbcGRldi0+ZmlsbF9pbWFnZV0ub2Zmc2V0OworCWltYWdlX2J1ZmZlcl9hZGRyICs9IHBkZXYtPmltYWdlX3JlYWRfcG9zOworCWlmIChjb3B5X3RvX3VzZXIoYnVmLCBpbWFnZV9idWZmZXJfYWRkciwgY291bnQpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAlwZGV2LT5pbWFnZV9yZWFkX3BvcyArPSBjb3VudDsKIAlpZiAocGRldi0+aW1hZ2VfcmVhZF9wb3MgPj0gYnl0ZXNfdG9fcmVhZCkgeyAvKiBBbGwgZGF0YSBoYXMgYmVlbiByZWFkICovCkBAIC0xMjUzLDM3MCArMTMzNSw1NiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHB3Y192aWRlb19kb19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCSAgICAgIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKLXsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBwd2NfZGV2aWNlICpwZGV2OwotCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOwotCi0JaWYgKHZkZXYgPT0gTlVMTCkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JcGRldiA9IHZkZXYtPnByaXY7Ci0JaWYgKHBkZXYgPT0gTlVMTCkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlzd2l0Y2ggKGNtZCkgewotCQkvKiBRdWVyeSBjYWJhcGlsaXRpZXMgKi8KLQkJY2FzZSBWSURJT0NHQ0FQOgotCQl7Ci0JCQlzdHJ1Y3QgdmlkZW9fY2FwYWJpbGl0eSAqY2FwcyA9IGFyZzsKLQotCQkJc3RyY3B5KGNhcHMtPm5hbWUsIHZkZXYtPm5hbWUpOwotCQkJY2Fwcy0+dHlwZSA9IFZJRF9UWVBFX0NBUFRVUkU7Ci0JCQljYXBzLT5jaGFubmVscyA9IDE7Ci0JCQljYXBzLT5hdWRpb3MgPSAxOwotCQkJY2Fwcy0+bWlud2lkdGggID0gcGRldi0+dmlld19taW4ueDsKLQkJCWNhcHMtPm1pbmhlaWdodCA9IHBkZXYtPnZpZXdfbWluLnk7Ci0JCQljYXBzLT5tYXh3aWR0aCAgPSBwZGV2LT52aWV3X21heC54OwotCQkJY2Fwcy0+bWF4aGVpZ2h0ID0gcGRldi0+dmlld19tYXgueTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJLyogQ2hhbm5lbCBmdW5jdGlvbnMgKHNpbXVsYXRlIDEgY2hhbm5lbCkgKi8KLQkJY2FzZSBWSURJT0NHQ0hBTjoKLQkJewotCQkJc3RydWN0IHZpZGVvX2NoYW5uZWwgKnYgPSBhcmc7Ci0KLQkJCWlmICh2LT5jaGFubmVsICE9IDApCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl2LT5mbGFncyA9IDA7Ci0JCQl2LT50dW5lcnMgPSAwOwotCQkJdi0+dHlwZSA9IFZJREVPX1RZUEVfQ0FNRVJBOwotCQkJc3RyY3B5KHYtPm5hbWUsICJXZWJjYW0iKTsKLQkJCXJldHVybiAwOwotCQl9Ci0KLQkJY2FzZSBWSURJT0NTQ0hBTjoKLQkJewotCQkJLyogVGhlIHNwZWMgc2F5cyB0aGUgYXJndW1lbnQgaXMgYW4gaW50ZWdlciwgYnV0Ci0JCQkgICB0aGUgYnR0diBkcml2ZXIgdXNlcyBhIHZpZGVvX2NoYW5uZWwgYXJnLCB3aGljaAotCQkJICAgbWFrZXMgc2Vuc2UgYmVjYXN1ZSBpdCBhbHNvIGhhcyB0aGUgbm9ybSBmbGFnLgotCQkJICovCi0JCQlzdHJ1Y3QgdmlkZW9fY2hhbm5lbCAqdiA9IGFyZzsKLQkJCWlmICh2LT5jaGFubmVsICE9IDApCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0KLQkJLyogUGljdHVyZSBmdW5jdGlvbnM7IGNvbnRyYXN0IGV0Yy4gKi8KLQkJY2FzZSBWSURJT0NHUElDVDoKLQkJewotCQkJc3RydWN0IHZpZGVvX3BpY3R1cmUgKnAgPSBhcmc7Ci0JCQlpbnQgdmFsOwotCi0JCQl2YWwgPSBwd2NfZ2V0X2JyaWdodG5lc3MocGRldik7Ci0JCQlpZiAodmFsID49IDApCi0JCQkJcC0+YnJpZ2h0bmVzcyA9IHZhbDsKLQkJCWVsc2UKLQkJCQlwLT5icmlnaHRuZXNzID0gMHhmZmZmOwotCQkJdmFsID0gcHdjX2dldF9jb250cmFzdChwZGV2KTsKLQkJCWlmICh2YWwgPj0gMCkKLQkJCQlwLT5jb250cmFzdCA9IHZhbDsKLQkJCWVsc2UKLQkJCQlwLT5jb250cmFzdCA9IDB4ZmZmZjsKLQkJCS8qIEdhbW1hLCBXaGl0ZW5lc3MsIHdoYXQncyB0aGUgZGlmZmVyZW5jZT8gOikgKi8KLQkJCXZhbCA9IHB3Y19nZXRfZ2FtbWEocGRldik7Ci0JCQlpZiAodmFsID49IDApCi0JCQkJcC0+d2hpdGVuZXNzID0gdmFsOwotCQkJZWxzZQotCQkJCXAtPndoaXRlbmVzcyA9IDB4ZmZmZjsKLQkJCXZhbCA9IHB3Y19nZXRfc2F0dXJhdGlvbihwZGV2KTsKLQkJCWlmICh2YWwgPj0gMCkKLQkJCQlwLT5jb2xvdXIgPSB2YWw7Ci0JCQllbHNlCi0JCQkJcC0+Y29sb3VyID0gMHhmZmZmOwotCQkJcC0+ZGVwdGggPSAyNDsKLQkJCXAtPnBhbGV0dGUgPSBwZGV2LT52cGFsZXR0ZTsKLQkJCXAtPmh1ZSA9IDB4RkZGRjsgLyogTi9BICovCi0JCQlicmVhazsKLQkJfQotCi0JCWNhc2UgVklESU9DU1BJQ1Q6Ci0JCXsKLQkJCXN0cnVjdCB2aWRlb19waWN0dXJlICpwID0gYXJnOwotCQkJLyoKLQkJCSAqCUZJWE1FOglTdXBwb3NlIHdlIGFyZSBtaWQgcmVhZAotCQkJCUFOU1dFUjogTm8gcHJvYmxlbTogdGhlIGZpcm13YXJlIG9mIHRoZSBjYW1lcmEKLQkJCQkJY2FuIGhhbmRsZSBicmlnaHRuZXNzL2NvbnRyYXN0L2V0YwotCQkJCQljaGFuZ2VzIGF0IF9hbnlfIHRpbWUsIGFuZCB0aGUgcGFsZXR0ZQotCQkJCQlpcyB1c2VkIGV4YWN0bHkgb25jZSBpbiB0aGUgdW5jb21wcmVzcwotCQkJCQlyb3V0aW5lLgotCQkJICovCi0JCQlwd2Nfc2V0X2JyaWdodG5lc3MocGRldiwgcC0+YnJpZ2h0bmVzcyk7Ci0JCQlwd2Nfc2V0X2NvbnRyYXN0KHBkZXYsIHAtPmNvbnRyYXN0KTsKLQkJCXB3Y19zZXRfZ2FtbWEocGRldiwgcC0+d2hpdGVuZXNzKTsKLQkJCXB3Y19zZXRfc2F0dXJhdGlvbihwZGV2LCBwLT5jb2xvdXIpOwotCQkJaWYgKHAtPnBhbGV0dGUgJiYgcC0+cGFsZXR0ZSAhPSBwZGV2LT52cGFsZXR0ZSkgewotCQkJCXN3aXRjaCAocC0+cGFsZXR0ZSkgewotCQkJCQljYXNlIFZJREVPX1BBTEVUVEVfWVVWNDIwUDoKLQkJCQkJY2FzZSBWSURFT19QQUxFVFRFX1JBVzoKLQkJCQkJCXBkZXYtPnZwYWxldHRlID0gcC0+cGFsZXR0ZTsKLQkJCQkJCXJldHVybiBwd2NfdHJ5X3ZpZGVvX21vZGUocGRldiwgcGRldi0+aW1hZ2UueCwgcGRldi0+aW1hZ2UueSwgcGRldi0+dmZyYW1lcywgcGRldi0+dmNvbXByZXNzaW9uLCBwZGV2LT52c25hcHNob3QpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWRlZmF1bHQ6Ci0JCQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0KLQkJLyogV2luZG93L3NpemUgcGFyYW1ldGVycyAqLwotCQljYXNlIFZJRElPQ0dXSU46Ci0JCXsKLQkJCXN0cnVjdCB2aWRlb193aW5kb3cgKnZ3ID0gYXJnOwotCi0JCQl2dy0+eCA9IDA7Ci0JCQl2dy0+eSA9IDA7Ci0JCQl2dy0+d2lkdGggPSBwZGV2LT52aWV3Lng7Ci0JCQl2dy0+aGVpZ2h0ID0gcGRldi0+dmlldy55OwotCQkJdnctPmNocm9tYWtleSA9IDA7Ci0JCQl2dy0+ZmxhZ3MgPSAocGRldi0+dmZyYW1lcyA8PCBQV0NfRlBTX1NISUZUKSB8Ci0JCQkJICAgKHBkZXYtPnZzbmFwc2hvdCA/IFBXQ19GUFNfU05BUFNIT1QgOiAwKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJY2FzZSBWSURJT0NTV0lOOgotCQl7Ci0JCQlzdHJ1Y3QgdmlkZW9fd2luZG93ICp2dyA9IGFyZzsKLQkJCWludCBmcHMsIHNuYXBzaG90LCByZXQ7Ci0KLQkJCWZwcyA9ICh2dy0+ZmxhZ3MgJiBQV0NfRlBTX0ZSTUFTSykgPj4gUFdDX0ZQU19TSElGVDsKLQkJCXNuYXBzaG90ID0gdnctPmZsYWdzICYgUFdDX0ZQU19TTkFQU0hPVDsKLQkJCWlmIChmcHMgPT0gMCkKLQkJCQlmcHMgPSBwZGV2LT52ZnJhbWVzOwotCQkJaWYgKHBkZXYtPnZpZXcueCA9PSB2dy0+d2lkdGggJiYgcGRldi0+dmlldy55ICYmIGZwcyA9PSBwZGV2LT52ZnJhbWVzICYmIHNuYXBzaG90ID09IHBkZXYtPnZzbmFwc2hvdCkKLQkJCQlyZXR1cm4gMDsKLQkJCXJldCA9IHB3Y190cnlfdmlkZW9fbW9kZShwZGV2LCB2dy0+d2lkdGgsIHZ3LT5oZWlnaHQsIGZwcywgcGRldi0+dmNvbXByZXNzaW9uLCBzbmFwc2hvdCk7Ci0JCQlpZiAocmV0KQotCQkJCXJldHVybiByZXQ7Ci0JCQlicmVhazsKLQkJfQotCi0JCS8qIFdlIGRvbid0IGhhdmUgb3ZlcmxheSBzdXBwb3J0ICh5ZXQpICovCi0JCWNhc2UgVklESU9DR0ZCVUY6Ci0JCXsKLQkJCXN0cnVjdCB2aWRlb19idWZmZXIgKnZiID0gYXJnOwotCi0JCQltZW1zZXQodmIsMCxzaXplb2YoKnZiKSk7Ci0JCQlicmVhazsKLQkJfQotCi0JCS8qIG1tYXAoKSBmdW5jdGlvbnMgKi8KLQkJY2FzZSBWSURJT0NHTUJVRjoKLQkJewotCQkJLyogVGVsbCB0aGUgdXNlciBwcm9ncmFtIGhvdyBtdWNoIG1lbW9yeSBpcyBuZWVkZWQgZm9yIGEgbW1hcCgpICovCi0JCQlzdHJ1Y3QgdmlkZW9fbWJ1ZiAqdm0gPSBhcmc7Ci0JCQlpbnQgaTsKLQotCQkJbWVtc2V0KHZtLCAwLCBzaXplb2YoKnZtKSk7Ci0JCQl2bS0+c2l6ZSA9IGRlZmF1bHRfbWJ1ZnMgKiBwZGV2LT5sZW5fcGVyX2ltYWdlOwotCQkJdm0tPmZyYW1lcyA9IGRlZmF1bHRfbWJ1ZnM7IC8qIGRvdWJsZSBidWZmZXJpbmcgc2hvdWxkIGJlIGVub3VnaCBmb3IgbW9zdCBhcHBsaWNhdGlvbnMgKi8KLQkJCWZvciAoaSA9IDA7IGkgPCBkZWZhdWx0X21idWZzOyBpKyspCi0JCQkJdm0tPm9mZnNldHNbaV0gPSBpICogcGRldi0+bGVuX3Blcl9pbWFnZTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJY2FzZSBWSURJT0NNQ0FQVFVSRToKLQkJewotCQkJLyogU3RhcnQgY2FwdHVyZSBpbnRvIGEgZ2l2ZW4gaW1hZ2UgYnVmZmVyIChjYWxsZWQgJ2ZyYW1lJyBpbiB2aWRlb19tbWFwIHN0cnVjdHVyZSkgKi8KLQkJCXN0cnVjdCB2aWRlb19tbWFwICp2bSA9IGFyZzsKLQotCQkJVHJhY2UoVFJBQ0VfUkVBRCwgIlZJRElPQ01DQVBUVVJFOiAlZHglZCwgZnJhbWUgJWQsIGZvcm1hdCAlZFxuIiwgdm0tPndpZHRoLCB2bS0+aGVpZ2h0LCB2bS0+ZnJhbWUsIHZtLT5mb3JtYXQpOwotCQkJaWYgKHZtLT5mcmFtZSA8IDAgfHwgdm0tPmZyYW1lID49IGRlZmF1bHRfbWJ1ZnMpCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJCS8qIHhhd3R2IGlzIG5hc3R5LiBJdCBwcm9iZXMgdGhlIGF2YWlsYWJsZSBwYWxldHRlcwotCQkJICAgYnkgc2V0dGluZyBhIHZlcnkgc21hbGwgaW1hZ2Ugc2l6ZSBhbmQgdHJ5aW5nCi0JCQkgICB2YXJpb3VzIHBhbGV0dGVzLi4uIFRoZSBkcml2ZXIgZG9lc24ndCBzdXBwb3J0Ci0JCQkgICBzdWNoIHNtYWxsIGltYWdlcywgc28gSSdtIHdvcmtpbmcgYXJvdW5kIGl0LgotCQkJICovCi0JCQlpZiAodm0tPmZvcm1hdCkKLQkJCXsKLQkJCQlzd2l0Y2ggKHZtLT5mb3JtYXQpCi0JCQkJewotCQkJCQljYXNlIFZJREVPX1BBTEVUVEVfWVVWNDIwUDoKLQkJCQkJY2FzZSBWSURFT19QQUxFVFRFX1JBVzoKLQkJCQkJCWJyZWFrOwotCQkJCQlkZWZhdWx0OgotCQkJCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmICgodm0tPndpZHRoICE9IHBkZXYtPnZpZXcueCB8fCB2bS0+aGVpZ2h0ICE9IHBkZXYtPnZpZXcueSkgJiYKLQkJCSAgICAodm0tPndpZHRoID49IHBkZXYtPnZpZXdfbWluLnggJiYgdm0tPmhlaWdodCA+PSBwZGV2LT52aWV3X21pbi55KSkgewotCQkJCWludCByZXQ7Ci0KLQkJCQlUcmFjZShUUkFDRV9PUEVOLCAiVklESU9DTUNBUFRVUkU6IGNoYW5naW5nIHNpemUgdG8gcGxlYXNlIHhhd3R2IDotKC5cbiIpOwotCQkJCXJldCA9IHB3Y190cnlfdmlkZW9fbW9kZShwZGV2LCB2bS0+d2lkdGgsIHZtLT5oZWlnaHQsIHBkZXYtPnZmcmFtZXMsIHBkZXYtPnZjb21wcmVzc2lvbiwgcGRldi0+dnNuYXBzaG90KTsKLQkJCQlpZiAocmV0KQotCQkJCQlyZXR1cm4gcmV0OwotCQkJfSAvKiAuLi4gc2l6ZSBtaXNtYXRjaCAqLwotCi0JCQkvKiBGSVhNRTogc2hvdWxkIHdlIGxvY2sgaGVyZT8gKi8KLQkJCWlmIChwZGV2LT5pbWFnZV91c2VkW3ZtLT5mcmFtZV0pCi0JCQkJcmV0dXJuIC1FQlVTWTsJLyogYnVmZmVyIHdhc24ndCBhdmFpbGFibGUuIEJ1bW1lciAqLwotCQkJcGRldi0+aW1hZ2VfdXNlZFt2bS0+ZnJhbWVdID0gMTsKLQotCQkJLyogT2theSwgd2UncmUgZG9uZSBoZXJlLiBJbiB0aGUgU1lOQyBjYWxsIHdlIHdhaXQgdW50aWwgYQotCQkJICAgZnJhbWUgY29tZXMgYXZhaWxhYmxlLCB0aGVuIGV4cGFuZCBpbWFnZSBpbnRvIHRoZSBnaXZlbgotCQkJICAgYnVmZmVyLgotCQkJICAgSW4gY29udHJhc3QgdG8gdGhlIENQaUEgY2FtIHRoZSBQaGlsaXBzIGNhbXMgZGVsaXZlciBhCi0JCQkgICBjb25zdGFudCBzdHJlYW0sIGFsbW9zdCBsaWtlIGEgZ3JhYmJlciBjYXJkLiBBbHNvLAotCQkJICAgd2UgaGF2ZSBzZXBhcmF0ZSBidWZmZXJzIGZvciB0aGUgcmF3ZGF0YSBhbmQgdGhlIGltYWdlLAotCQkJICAgbWVhbmluZyB3ZSBjYW4gbmVhcmx5IGFsd2F5cyBleHBhbmQgaW50byB0aGUgcmVxdWVzdGVkIGJ1ZmZlci4KLQkJCSAqLwotCQkJVHJhY2UoVFJBQ0VfUkVBRCwgIlZJRElPQ01DQVBUVVJFIGRvbmUuXG4iKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJY2FzZSBWSURJT0NTWU5DOgotCQl7Ci0JCQkvKiBUaGUgZG9jIHNheXM6ICJXaGVuZXZlciBhIGJ1ZmZlciBpcyB1c2VkIGl0IHNob3VsZAotCQkJICAgY2FsbCBWSURJT0NTWU5DIHRvIGZyZWUgdGhpcyBmcmFtZSB1cCBhbmQgY29udGludWUuIgotCi0JCQkgICBUaGUgb25seSBvZGQgdGhpbmcgYWJvdXQgdGhpcyB3aG9sZSBwcm9jZWR1cmUgaXMKLQkJCSAgIHRoYXQgTUNBUFRVUkUgZmxhZ3MgdGhlIGJ1ZmZlciBhcyAiaW4gdXNlIiwgYW5kCi0JCQkgICBTWU5DIGltbWVkaWF0ZWx5IHVubWFya3MgaXQsIHdoaWxlIGl0IGlzbid0Ci0JCQkgICBhZnRlciBTWU5DIHRoYXQgeW91IGtub3cgdGhhdCB0aGUgYnVmZmVyIGFjdHVhbGx5Ci0JCQkgICBnb3QgZmlsbGVkISBTbyB5b3UgYmV0dGVyIG5vdCBzdGFydCBhIENBUFRVUkUgaW4KLQkJCSAgIHRoZSBzYW1lIGZyYW1lIGltbWVkaWF0ZWx5ICh1c2UgZG91YmxlIGJ1ZmZlcmluZykuCi0JCQkgICBUaGlzIGlzIG5vdCBhIHByb2JsZW0gZm9yIHRoaXMgY2FtLCBzaW5jZSBpdCBoYXMKLQkJCSAgIGV4dHJhIGludGVybWVkaWF0ZSBidWZmZXJzLCBidXQgYSBoYXJkd2FyZQotCQkJICAgZ3JhYmJlciBjYXJkIHdpbGwgdGhlbiBvdmVyd3JpdGUgdGhlIGJ1ZmZlcgotCQkJICAgeW91J3JlIHdvcmtpbmcgb24uCi0JCQkgKi8KLQkJCWludCAqbWJ1ZiA9IGFyZzsKLQkJCWludCByZXQ7Ci0KLQkJCVRyYWNlKFRSQUNFX1JFQUQsICJWSURJT0NTWU5DIGNhbGxlZCAoJWQpLlxuIiwgKm1idWYpOwotCi0JCQkvKiBib3VuZHMgY2hlY2sgKi8KLQkJCWlmICgqbWJ1ZiA8IDAgfHwgKm1idWYgPj0gZGVmYXVsdF9tYnVmcykKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCS8qIGNoZWNrIGlmIHRoaXMgYnVmZmVyIHdhcyByZXF1ZXN0ZWQgYW55d2F5ICovCi0JCQlpZiAocGRldi0+aW1hZ2VfdXNlZFsqbWJ1Zl0gPT0gMCkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQotCQkJLyogQWRkIG91cnNlbHZlcyB0byB0aGUgZnJhbWUgd2FpdC1xdWV1ZS4KLQotCQkJICAgRklYTUU6IG5lZWRzIGF1ZGl0aW5nIGZvciBzYWZldHkuCi0JCQkgICBRVUVTVElPTjogSW4gd2hhdCByZXNwZWN0PyBJIHRoaW5rIHRoYXQgdXNpbmcgdGhlCi0JCQkJICAgICBmcmFtZXEgaXMgc2FmZSBub3cuCi0JCQkgKi8KLQkJCWFkZF93YWl0X3F1ZXVlKCZwZGV2LT5mcmFtZXEsICZ3YWl0KTsKLQkJCXdoaWxlIChwZGV2LT5mdWxsX2ZyYW1lcyA9PSBOVUxMKSB7Ci0JCQkJaWYgKHBkZXYtPmVycm9yX3N0YXR1cykgewotCQkJCQlyZW1vdmVfd2FpdF9xdWV1ZSgmcGRldi0+ZnJhbWVxLCAmd2FpdCk7Ci0JCQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7Ci0JCQkJCXJldHVybiAtcGRldi0+ZXJyb3Jfc3RhdHVzOwotCQkJCX0KLQotCQkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgewotCQkJCQlyZW1vdmVfd2FpdF9xdWV1ZSgmcGRldi0+ZnJhbWVxLCAmd2FpdCk7Ci0JCQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7Ci0JCQkJCXJldHVybiAtRVJFU1RBUlRTWVM7Ci0JCQkJfQotCQkJCXNjaGVkdWxlKCk7Ci0JCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJCX0KLQkJCXJlbW92ZV93YWl0X3F1ZXVlKCZwZGV2LT5mcmFtZXEsICZ3YWl0KTsKLQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7Ci0KLQkJCS8qIFRoZSBmcmFtZSBpcyByZWFkeS4gRXhwYW5kIGluIHRoZSBpbWFnZSBidWZmZXIKLQkJCSAgIHJlcXVlc3RlZCBieSB0aGUgdXNlci4gSSBkb24ndCBjYXJlIGlmIHlvdQotCQkJICAgbW1hcCgpIDUgYnVmZmVycyBhbmQgcmVxdWVzdCBkYXRhIGluIHRoaXMgb3JkZXI6Ci0JCQkgICBidWZmZXIgNCAyIDMgMCAxIDIgMyAwIDQgMyAxIC4gLiAuCi0JCQkgICBHcmFiYmVyIGhhcmR3YXJlIG1heSBub3QgYmUgc28gZm9yZ2l2aW5nLgotCQkJICovCi0JCQlUcmFjZShUUkFDRV9SRUFELCAiVklESU9DU1lOQzogZnJhbWUgcmVhZHkuXG4iKTsKLQkJCXBkZXYtPmZpbGxfaW1hZ2UgPSAqbWJ1ZjsgLyogdGVsbCBpbiB3aGljaCBidWZmZXIgd2Ugd2FudCB0aGUgaW1hZ2UgdG8gYmUgZXhwYW5kZWQgKi8KLQkJCS8qIERlY29tcHJlc3MsIGV0YyAqLwotCQkJcmV0ID0gcHdjX2hhbmRsZV9mcmFtZShwZGV2KTsKLQkJCXBkZXYtPmltYWdlX3VzZWRbKm1idWZdID0gMDsKLQkJCWlmIChyZXQpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCi0JCWNhc2UgVklESU9DR0FVRElPOgotCQl7Ci0JCQlzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYgPSBhcmc7Ci0KLQkJCXN0cmNweSh2LT5uYW1lLCAiTWljcm9waG9uZSIpOwotCQkJdi0+YXVkaW8gPSAtMTsgLyogdW5rbm93biBhdWRpbyBtaW5vciAqLwotCQkJdi0+ZmxhZ3MgPSAwOwotCQkJdi0+bW9kZSA9IFZJREVPX1NPVU5EX01PTk87Ci0JCQl2LT52b2x1bWUgPSAwOwotCQkJdi0+YmFzcyA9IDA7Ci0JCQl2LT50cmVibGUgPSAwOwotCQkJdi0+YmFsYW5jZSA9IDB4ODAwMDsKLQkJCXYtPnN0ZXAgPSAxOwotCQkJYnJlYWs7Ci0JCX0KLQotCQljYXNlIFZJRElPQ1NBVURJTzoKLQkJewotCQkJLyogRHVtbXk6IG5vdGhpbmcgY2FuIGJlIHNldCAqLwotCQkJYnJlYWs7Ci0JCX0KLQotCQljYXNlIFZJRElPQ0dVTklUOgotCQl7Ci0JCQlzdHJ1Y3QgdmlkZW9fdW5pdCAqdnUgPSBhcmc7Ci0KLQkJCXZ1LT52aWRlbyA9IHBkZXYtPnZkZXYtPm1pbm9yICYgMHgzRjsKLQkJCXZ1LT5hdWRpbyA9IC0xOyAvKiBub3Qga25vd24geWV0ICovCi0JCQl2dS0+dmJpID0gLTE7Ci0JCQl2dS0+cmFkaW8gPSAtMTsKLQkJCXZ1LT50ZWxldGV4dCA9IC0xOwotCQkJYnJlYWs7Ci0JCX0KLQkJZGVmYXVsdDoKLQkJCXJldHVybiBwd2NfaW9jdGwocGRldiwgY21kLCBhcmcpOwotCX0gLyogLi5zd2l0Y2ggKi8KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBwd2NfdmlkZW9faW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCiAJCQkgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKIAlyZXR1cm4gdmlkZW9fdXNlcmNvcHkoaW5vZGUsIGZpbGUsIGNtZCwgYXJnLCBwd2NfdmlkZW9fZG9faW9jdGwpOwogfQogCi0KIHN0YXRpYyBpbnQgcHdjX3ZpZGVvX21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQogewogCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IHB3Y19kZXZpY2UgKnBkZXY7Ci0JdW5zaWduZWQgbG9uZyBzdGFydCA9IHZtYS0+dm1fc3RhcnQ7Ci0JdW5zaWduZWQgbG9uZyBzaXplICA9IHZtYS0+dm1fZW5kLXZtYS0+dm1fc3RhcnQ7Ci0JdW5zaWduZWQgbG9uZyBwYWdlLCBwb3M7CisJdW5zaWduZWQgbG9uZyBzdGFydDsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisJdW5zaWduZWQgbG9uZyBwYWdlLCBwb3MgPSAwOworCWludCBpbmRleDsKIAotCVRyYWNlKFRSQUNFX01FTU9SWSwgIm1tYXAoMHglcCwgMHglbHgsICVsdSkgY2FsbGVkLlxuIiwgdmRldiwgc3RhcnQsIHNpemUpOworCVBXQ19ERUJVR19NRU1PUlkoIj4+ICVzXG4iLCBfX0ZVTkNUSU9OX18pOwogCXBkZXYgPSB2ZGV2LT5wcml2OworCXNpemUgPSB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQ7CisJc3RhcnQgPSB2bWEtPnZtX3N0YXJ0OwogCi0Jdm1hLT52bV9mbGFncyB8PSBWTV9JTzsKKwkvKiBGaW5kIHRoZSBpZHggYnVmZmVyIGZvciB0aGlzIG1hcHBpbmcgKi8KKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBwd2NfbWJ1ZnM7IGluZGV4KyspIHsKKwkJcG9zID0gcGRldi0+aW1hZ2VzW2luZGV4XS5vZmZzZXQ7CisJCWlmICgocG9zPj5QQUdFX1NISUZUKSA9PSB2bWEtPnZtX3Bnb2ZmKQorCQkJYnJlYWs7CisJfQorCWlmIChpbmRleCA9PSBNQVhfSU1BR0VTKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoaW5kZXggPT0gMCkgeworCQkvKgorCQkgKiBTcGVjaWFsIGNhc2UgZm9yIHY0bDEuIEluIHY0bDEsIHdlIG1hcCBvbmx5IG9uZSBiaWcgYnVmZmVyLAorCQkgKiBidXQgaW4gdjRsMiBlYWNoIGJ1ZmZlciBpcyBtYXBwZWQKKwkJICovCisJCXVuc2lnbmVkIGxvbmcgdG90YWxfc2l6ZTsKKwkJdG90YWxfc2l6ZSA9IHB3Y19tYnVmcyAqIHBkZXYtPmxlbl9wZXJfaW1hZ2U7CisJCWlmIChzaXplICE9IHBkZXYtPmxlbl9wZXJfaW1hZ2UgJiYgc2l6ZSAhPSB0b3RhbF9zaXplKSB7CisJCQlQV0NfRVJST1IoIldyb25nIHNpemUgKCVsdSkgbmVlZGVkIHRvIGJlIGxlbl9wZXJfaW1hZ2U9JWQgb3IgdG90YWxfc2l6ZT0lbHVcbiIsCisJCQkJICAgc2l6ZSwgcGRldi0+bGVuX3Blcl9pbWFnZSwgdG90YWxfc2l6ZSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0gZWxzZSBpZiAoc2l6ZSA+IHBkZXYtPmxlbl9wZXJfaW1hZ2UpCisJCXJldHVybiAtRUlOVkFMOwogCi0JcG9zID0gKHVuc2lnbmVkIGxvbmcpcGRldi0+aW1hZ2VfZGF0YTsKKwl2bWEtPnZtX2ZsYWdzIHw9IFZNX0lPOwkvKiBmcm9tIDIuNi45LWFjWCAqLworCisJcG9zICs9ICh1bnNpZ25lZCBsb25nKXBkZXYtPmltYWdlX2RhdGE7CiAJd2hpbGUgKHNpemUgPiAwKSB7CiAJCXBhZ2UgPSB2bWFsbG9jX3RvX3Bmbigodm9pZCAqKXBvcyk7CiAJCWlmIChyZW1hcF9wZm5fcmFuZ2Uodm1hLCBzdGFydCwgcGFnZSwgUEFHRV9TSVpFLCBQQUdFX1NIQVJFRCkpCiAJCQlyZXR1cm4gLUVBR0FJTjsKLQogCQlzdGFydCArPSBQQUdFX1NJWkU7CiAJCXBvcyArPSBQQUdFX1NJWkU7CiAJCWlmIChzaXplID4gUEFHRV9TSVpFKQpAQCAtMTYyNCw3ICsxMzkyLDYgQEAKIAkJZWxzZQogCQkJc2l6ZSA9IDA7CiAJfQotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE2NDUsMTAgKzE0MTIsMTIgQEAKIAlpbnQgdmlkZW9fbnIgPSAtMTsgLyogZGVmYXVsdDogdXNlIG5leHQgYXZhaWxhYmxlIGRldmljZSAqLwogCWNoYXIgc2VyaWFsX251bWJlclszMF0sICpuYW1lOwogCisJdmVuZG9yX2lkID0gbGUxNl90b19jcHUodWRldi0+ZGVzY3JpcHRvci5pZFZlbmRvcik7CisJcHJvZHVjdF9pZCA9IGxlMTZfdG9fY3B1KHVkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KTsKKwogCS8qIENoZWNrIGlmIHdlIGNhbiBoYW5kbGUgdGhpcyBkZXZpY2UgKi8KLQlUcmFjZShUUkFDRV9QUk9CRSwgInByb2JlKCkgY2FsbGVkIFslMDRYICUwNFhdLCBpZiAlZFxuIiwKLQkJbGUxNl90b19jcHUodWRldi0+ZGVzY3JpcHRvci5pZFZlbmRvciksCi0JCWxlMTZfdG9fY3B1KHVkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KSwKKwlQV0NfREVCVUdfUFJPQkUoInByb2JlKCkgY2FsbGVkIFslMDRYICUwNFhdLCBpZiAlZFxuIiwKKwkJdmVuZG9yX2lkLCBwcm9kdWN0X2lkLAogCQlpbnRmLT5hbHRzZXR0aW5nLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXIpOwogCiAJLyogdGhlIGludGVyZmFjZXMgYXJlIHByb2JlZCBvbmUgYnkgb25lLiBXZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIHRoZQpAQCAtMTY1OCw2MSArMTQyNyw2MyBAQAogCWlmIChpbnRmLT5hbHRzZXR0aW5nLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXIgPiAwKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCXZlbmRvcl9pZCA9IGxlMTZfdG9fY3B1KHVkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IpOwotCXByb2R1Y3RfaWQgPSBsZTE2X3RvX2NwdSh1ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCk7Ci0KIAlpZiAodmVuZG9yX2lkID09IDB4MDQ3MSkgewogCQlzd2l0Y2ggKHByb2R1Y3RfaWQpIHsKIAkJY2FzZSAweDAzMDI6Ci0JCQlJbmZvKCJQaGlsaXBzIFBDQTY0NVZDIFVTQiB3ZWJjYW0gZGV0ZWN0ZWQuXG4iKTsKKwkJCVBXQ19JTkZPKCJQaGlsaXBzIFBDQTY0NVZDIFVTQiB3ZWJjYW0gZGV0ZWN0ZWQuXG4iKTsKIAkJCW5hbWUgPSAiUGhpbGlwcyA2NDUgd2ViY2FtIjsKIAkJCXR5cGVfaWQgPSA2NDU7CiAJCQlicmVhazsKIAkJY2FzZSAweDAzMDM6Ci0JCQlJbmZvKCJQaGlsaXBzIFBDQTY0NlZDIFVTQiB3ZWJjYW0gZGV0ZWN0ZWQuXG4iKTsKKwkJCVBXQ19JTkZPKCJQaGlsaXBzIFBDQTY0NlZDIFVTQiB3ZWJjYW0gZGV0ZWN0ZWQuXG4iKTsKIAkJCW5hbWUgPSAiUGhpbGlwcyA2NDYgd2ViY2FtIjsKIAkJCXR5cGVfaWQgPSA2NDY7CiAJCQlicmVhazsKIAkJY2FzZSAweDAzMDQ6Ci0JCQlJbmZvKCJBc2tleSBWQzAxMCB0eXBlIDIgVVNCIHdlYmNhbSBkZXRlY3RlZC5cbiIpOworCQkJUFdDX0lORk8oIkFza2V5IFZDMDEwIHR5cGUgMiBVU0Igd2ViY2FtIGRldGVjdGVkLlxuIik7CiAJCQluYW1lID0gIkFza2V5IFZDMDEwIHdlYmNhbSI7CiAJCQl0eXBlX2lkID0gNjQ2OwogCQkJYnJlYWs7CiAJCWNhc2UgMHgwMzA3OgotCQkJSW5mbygiUGhpbGlwcyBQQ1ZDNjc1SyAoVmVzdGEpIFVTQiB3ZWJjYW0gZGV0ZWN0ZWQuXG4iKTsKKwkJCVBXQ19JTkZPKCJQaGlsaXBzIFBDVkM2NzVLIChWZXN0YSkgVVNCIHdlYmNhbSBkZXRlY3RlZC5cbiIpOwogCQkJbmFtZSA9ICJQaGlsaXBzIDY3NSB3ZWJjYW0iOwogCQkJdHlwZV9pZCA9IDY3NTsKIAkJCWJyZWFrOwogCQljYXNlIDB4MDMwODoKLQkJCUluZm8oIlBoaWxpcHMgUENWQzY4MEsgKFZlc3RhIFBybykgVVNCIHdlYmNhbSBkZXRlY3RlZC5cbiIpOworCQkJUFdDX0lORk8oIlBoaWxpcHMgUENWQzY4MEsgKFZlc3RhIFBybykgVVNCIHdlYmNhbSBkZXRlY3RlZC5cbiIpOwogCQkJbmFtZSA9ICJQaGlsaXBzIDY4MCB3ZWJjYW0iOwogCQkJdHlwZV9pZCA9IDY4MDsKIAkJCWJyZWFrOwogCQljYXNlIDB4MDMwQzoKLQkJCUluZm8oIlBoaWxpcHMgUENWQzY5MEsgKFZlc3RhIFBybyBTY2FuKSBVU0Igd2ViY2FtIGRldGVjdGVkLlxuIik7CisJCQlQV0NfSU5GTygiUGhpbGlwcyBQQ1ZDNjkwSyAoVmVzdGEgUHJvIFNjYW4pIFVTQiB3ZWJjYW0gZGV0ZWN0ZWQuXG4iKTsKIAkJCW5hbWUgPSAiUGhpbGlwcyA2OTAgd2ViY2FtIjsKIAkJCXR5cGVfaWQgPSA2OTA7CiAJCQlicmVhazsKIAkJY2FzZSAweDAzMTA6Ci0JCQlJbmZvKCJQaGlsaXBzIFBDVkM3MzBLIChUb1VDYW0gRnVuKS9QQ1ZDODMwIChUb1VDYW0gSUkpIFVTQiB3ZWJjYW0gZGV0ZWN0ZWQuXG4iKTsKKwkJCVBXQ19JTkZPKCJQaGlsaXBzIFBDVkM3MzBLIChUb1VDYW0gRnVuKS9QQ1ZDODMwIChUb1VDYW0gSUkpIFVTQiB3ZWJjYW0gZGV0ZWN0ZWQuXG4iKTsKIAkJCW5hbWUgPSAiUGhpbGlwcyA3MzAgd2ViY2FtIjsKIAkJCXR5cGVfaWQgPSA3MzA7CiAJCQlicmVhazsKIAkJY2FzZSAweDAzMTE6Ci0JCQlJbmZvKCJQaGlsaXBzIFBDVkM3NDBLIChUb1VDYW0gUHJvKS9QQ1ZDODQwIChUb1VDYW0gSUkpIFVTQiB3ZWJjYW0gZGV0ZWN0ZWQuXG4iKTsKKwkJCVBXQ19JTkZPKCJQaGlsaXBzIFBDVkM3NDBLIChUb1VDYW0gUHJvKS9QQ1ZDODQwIChUb1VDYW0gSUkpIFVTQiB3ZWJjYW0gZGV0ZWN0ZWQuXG4iKTsKIAkJCW5hbWUgPSAiUGhpbGlwcyA3NDAgd2ViY2FtIjsKIAkJCXR5cGVfaWQgPSA3NDA7CiAJCQlicmVhazsKIAkJY2FzZSAweDAzMTI6Ci0JCQlJbmZvKCJQaGlsaXBzIFBDVkM3NTBLIChUb1VDYW0gUHJvIFNjYW4pIFVTQiB3ZWJjYW0gZGV0ZWN0ZWQuXG4iKTsKKwkJCVBXQ19JTkZPKCJQaGlsaXBzIFBDVkM3NTBLIChUb1VDYW0gUHJvIFNjYW4pIFVTQiB3ZWJjYW0gZGV0ZWN0ZWQuXG4iKTsKIAkJCW5hbWUgPSAiUGhpbGlwcyA3NTAgd2ViY2FtIjsKIAkJCXR5cGVfaWQgPSA3NTA7CiAJCQlicmVhazsKIAkJY2FzZSAweDAzMTM6Ci0JCQlJbmZvKCJQaGlsaXBzIFBDVkM3MjBLLzQwIChUb1VDYW0gWFMpIFVTQiB3ZWJjYW0gZGV0ZWN0ZWQuXG4iKTsKKwkJCVBXQ19JTkZPKCJQaGlsaXBzIFBDVkM3MjBLLzQwIChUb1VDYW0gWFMpIFVTQiB3ZWJjYW0gZGV0ZWN0ZWQuXG4iKTsKIAkJCW5hbWUgPSAiUGhpbGlwcyA3MjBLLzQwIHdlYmNhbSI7CiAJCQl0eXBlX2lkID0gNzIwOwogCQkJYnJlYWs7CisJCWNhc2UgMHgwMzI5OgorCQkJUFdDX0lORk8oIlBoaWxpcHMgU1BDIDkwME5DIFVTQiB3ZWJjYW0gZGV0ZWN0ZWQuXG4iKTsKKwkJCW5hbWUgPSAiUGhpbGlwcyBTUEMgOTAwTkMgd2ViY2FtIjsKKwkJCXR5cGVfaWQgPSA3MjA7CisJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCXJldHVybiAtRU5PREVWOwogCQkJYnJlYWs7CkBAIC0xNzIxLDcgKzE0OTIsNyBAQAogCWVsc2UgaWYgKHZlbmRvcl9pZCA9PSAweDA2OUEpIHsKIAkJc3dpdGNoKHByb2R1Y3RfaWQpIHsKIAkJY2FzZSAweDAwMDE6Ci0JCQlJbmZvKCJBc2tleSBWQzAxMCB0eXBlIDEgVVNCIHdlYmNhbSBkZXRlY3RlZC5cbiIpOworCQkJUFdDX0lORk8oIkFza2V5IFZDMDEwIHR5cGUgMSBVU0Igd2ViY2FtIGRldGVjdGVkLlxuIik7CiAJCQluYW1lID0gIkFza2V5IFZDMDEwIHdlYmNhbSI7CiAJCQl0eXBlX2lkID0gNjQ1OwogCQkJYnJlYWs7CkBAIC0xNzMzLDMyICsxNTA0LDMzIEBACiAJZWxzZSBpZiAodmVuZG9yX2lkID09IDB4MDQ2ZCkgewogCQlzd2l0Y2gocHJvZHVjdF9pZCkgewogCQljYXNlIDB4MDhiMDoKLQkJCUluZm8oIkxvZ2l0ZWNoIFF1aWNrQ2FtIFBybyAzMDAwIFVTQiB3ZWJjYW0gZGV0ZWN0ZWQuXG4iKTsKKwkJCVBXQ19JTkZPKCJMb2dpdGVjaCBRdWlja0NhbSBQcm8gMzAwMCBVU0Igd2ViY2FtIGRldGVjdGVkLlxuIik7CiAJCQluYW1lID0gIkxvZ2l0ZWNoIFF1aWNrQ2FtIFBybyAzMDAwIjsKIAkJCXR5cGVfaWQgPSA3NDA7IC8qIENDRCBzZW5zb3IgKi8KIAkJCWJyZWFrOwogCQljYXNlIDB4MDhiMToKLQkJCUluZm8oIkxvZ2l0ZWNoIFF1aWNrQ2FtIE5vdGVib29rIFBybyBVU0Igd2ViY2FtIGRldGVjdGVkLlxuIik7CisJCQlQV0NfSU5GTygiTG9naXRlY2ggUXVpY2tDYW0gTm90ZWJvb2sgUHJvIFVTQiB3ZWJjYW0gZGV0ZWN0ZWQuXG4iKTsKIAkJCW5hbWUgPSAiTG9naXRlY2ggUXVpY2tDYW0gTm90ZWJvb2sgUHJvIjsKIAkJCXR5cGVfaWQgPSA3NDA7IC8qIENDRCBzZW5zb3IgKi8KIAkJCWJyZWFrOwogCQljYXNlIDB4MDhiMjoKLQkJCUluZm8oIkxvZ2l0ZWNoIFF1aWNrQ2FtIDQwMDAgUHJvIFVTQiB3ZWJjYW0gZGV0ZWN0ZWQuXG4iKTsKKwkJCVBXQ19JTkZPKCJMb2dpdGVjaCBRdWlja0NhbSA0MDAwIFBybyBVU0Igd2ViY2FtIGRldGVjdGVkLlxuIik7CiAJCQluYW1lID0gIkxvZ2l0ZWNoIFF1aWNrQ2FtIFBybyA0MDAwIjsKIAkJCXR5cGVfaWQgPSA3NDA7IC8qIENDRCBzZW5zb3IgKi8KIAkJCWJyZWFrOwogCQljYXNlIDB4MDhiMzoKLQkJCUluZm8oIkxvZ2l0ZWNoIFF1aWNrQ2FtIFpvb20gVVNCIHdlYmNhbSBkZXRlY3RlZC5cbiIpOworCQkJUFdDX0lORk8oIkxvZ2l0ZWNoIFF1aWNrQ2FtIFpvb20gVVNCIHdlYmNhbSBkZXRlY3RlZC5cbiIpOwogCQkJbmFtZSA9ICJMb2dpdGVjaCBRdWlja0NhbSBab29tIjsKIAkJCXR5cGVfaWQgPSA3NDA7IC8qIENDRCBzZW5zb3IgKi8KIAkJCWJyZWFrOwogCQljYXNlIDB4MDhCNDoKLQkJCUluZm8oIkxvZ2l0ZWNoIFF1aWNrQ2FtIFpvb20gKG5ldyBtb2RlbCkgVVNCIHdlYmNhbSBkZXRlY3RlZC5cbiIpOworCQkJUFdDX0lORk8oIkxvZ2l0ZWNoIFF1aWNrQ2FtIFpvb20gKG5ldyBtb2RlbCkgVVNCIHdlYmNhbSBkZXRlY3RlZC5cbiIpOwogCQkJbmFtZSA9ICJMb2dpdGVjaCBRdWlja0NhbSBab29tIjsKIAkJCXR5cGVfaWQgPSA3NDA7IC8qIENDRCBzZW5zb3IgKi8KKwkJCXBvd2VyX3NhdmUgPSAxOwogCQkJYnJlYWs7CiAJCWNhc2UgMHgwOGI1OgotCQkJSW5mbygiTG9naXRlY2ggUXVpY2tDYW0gT3JiaXQvU3BoZXJlIFVTQiB3ZWJjYW0gZGV0ZWN0ZWQuXG4iKTsKKwkJCVBXQ19JTkZPKCJMb2dpdGVjaCBRdWlja0NhbSBPcmJpdC9TcGhlcmUgVVNCIHdlYmNhbSBkZXRlY3RlZC5cbiIpOwogCQkJbmFtZSA9ICJMb2dpdGVjaCBRdWlja0NhbSBPcmJpdCI7CiAJCQl0eXBlX2lkID0gNzQwOyAvKiBDQ0Qgc2Vuc29yICovCiAJCQlmZWF0dXJlcyB8PSBGRUFUVVJFX01PVE9SX1BBTlRJTFQ7CkBAIC0xNzY2LDcgKzE1MzgsNyBAQAogCQljYXNlIDB4MDhiNjoKIAkJY2FzZSAweDA4Yjc6CiAJCWNhc2UgMHgwOGI4OgotCQkJSW5mbygiTG9naXRlY2ggUXVpY2tDYW0gZGV0ZWN0ZWQgKHJlc2VydmVkIElEKS5cbiIpOworCQkJUFdDX0lORk8oIkxvZ2l0ZWNoIFF1aWNrQ2FtIGRldGVjdGVkIChyZXNlcnZlZCBJRCkuXG4iKTsKIAkJCW5hbWUgPSAiTG9naXRlY2ggUXVpY2tDYW0gKHJlcy4pIjsKIAkJCXR5cGVfaWQgPSA3MzA7IC8qIEFzc3VtaW5nIENNT1MgKi8KIAkJCWJyZWFrOwpAQCAtMTc4MiwxNSArMTU1NCwyMCBAQAogCQkgKi8KIAkJc3dpdGNoKHByb2R1Y3RfaWQpIHsKIAkJY2FzZSAweDkwMDA6Ci0JCQlJbmZvKCJTYW1zdW5nIE1QQy1DMTAgVVNCIHdlYmNhbSBkZXRlY3RlZC5cbiIpOworCQkJUFdDX0lORk8oIlNhbXN1bmcgTVBDLUMxMCBVU0Igd2ViY2FtIGRldGVjdGVkLlxuIik7CiAJCQluYW1lID0gIlNhbXN1bmcgTVBDLUMxMCI7CiAJCQl0eXBlX2lkID0gNjc1OwogCQkJYnJlYWs7CiAJCWNhc2UgMHg5MDAxOgotCQkJSW5mbygiU2Ftc3VuZyBNUEMtQzMwIFVTQiB3ZWJjYW0gZGV0ZWN0ZWQuXG4iKTsKKwkJCVBXQ19JTkZPKCJTYW1zdW5nIE1QQy1DMzAgVVNCIHdlYmNhbSBkZXRlY3RlZC5cbiIpOwogCQkJbmFtZSA9ICJTYW1zdW5nIE1QQy1DMzAiOwogCQkJdHlwZV9pZCA9IDY3NTsKIAkJCWJyZWFrOworCQljYXNlIDB4OTAwMjoKKwkJCVBXQ19JTkZPKCJTYW1zdW5nIFNOQy0zNUUgKHYzLjApIFVTQiB3ZWJjYW0gZGV0ZWN0ZWQuXG4iKTsKKwkJCW5hbWUgPSAiU2Ftc3VuZyBNUEMtQzMwIjsKKwkJCXR5cGVfaWQgPSA3NDA7CisJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCXJldHVybiAtRU5PREVWOwogCQkJYnJlYWs7CkBAIC0xNzk5LDEyICsxNTc2LDEyIEBACiAJZWxzZSBpZiAodmVuZG9yX2lkID09IDB4MDQxZSkgewogCQlzd2l0Y2gocHJvZHVjdF9pZCkgewogCQljYXNlIDB4NDAwYzoKLQkJCUluZm8oIkNyZWF0aXZlIExhYnMgV2ViY2FtIDUgZGV0ZWN0ZWQuXG4iKTsKKwkJCVBXQ19JTkZPKCJDcmVhdGl2ZSBMYWJzIFdlYmNhbSA1IGRldGVjdGVkLlxuIik7CiAJCQluYW1lID0gIkNyZWF0aXZlIExhYnMgV2ViY2FtIDUiOwogCQkJdHlwZV9pZCA9IDczMDsKIAkJCWJyZWFrOwogCQljYXNlIDB4NDAxMToKLQkJCUluZm8oIkNyZWF0aXZlIExhYnMgV2ViY2FtIFBybyBFeCBkZXRlY3RlZC5cbiIpOworCQkJUFdDX0lORk8oIkNyZWF0aXZlIExhYnMgV2ViY2FtIFBybyBFeCBkZXRlY3RlZC5cbiIpOwogCQkJbmFtZSA9ICJDcmVhdGl2ZSBMYWJzIFdlYmNhbSBQcm8gRXgiOwogCQkJdHlwZV9pZCA9IDc0MDsKIAkJCWJyZWFrOwpAQCAtMTgxNiw3ICsxNTkzLDcgQEAKIAllbHNlIGlmICh2ZW5kb3JfaWQgPT0gMHgwNGNjKSB7CiAJCXN3aXRjaChwcm9kdWN0X2lkKSB7CiAJCWNhc2UgMHg4MTE2OgotCQkJSW5mbygiU290ZWMgQWZpbmEgRXllIFVTQiB3ZWJjYW0gZGV0ZWN0ZWQuXG4iKTsKKwkJCVBXQ19JTkZPKCJTb3RlYyBBZmluYSBFeWUgVVNCIHdlYmNhbSBkZXRlY3RlZC5cbiIpOwogCQkJbmFtZSA9ICJTb3RlYyBBZmluYSBFeWUiOwogCQkJdHlwZV9pZCA9IDczMDsKIAkJCWJyZWFrOwpAQCAtMTgyOSw3ICsxNjA2LDcgQEAKIAkJc3dpdGNoKHByb2R1Y3RfaWQpIHsKIAkJY2FzZSAweDgxMTY6CiAJCQkvKiBUaGlzIGlzIGVzc2VudGlhbGx5IHRoZSBzYW1lIGNhbSBhcyB0aGUgU290ZWMgQWZpbmEgRXllICovCi0JCQlJbmZvKCJBTUUgQ28uIEFmaW5hIEV5ZSBVU0Igd2ViY2FtIGRldGVjdGVkLlxuIik7CisJCQlQV0NfSU5GTygiQU1FIENvLiBBZmluYSBFeWUgVVNCIHdlYmNhbSBkZXRlY3RlZC5cbiIpOwogCQkJbmFtZSA9ICJBTUUgQ28uIEFmaW5hIEV5ZSI7CiAJCQl0eXBlX2lkID0gNzUwOwogCQkJYnJlYWs7CkBAIC0xODQyLDEyICsxNjE5LDEyIEBACiAJZWxzZSBpZiAodmVuZG9yX2lkID09IDB4MGQ4MSkgewogCQlzd2l0Y2gocHJvZHVjdF9pZCkgewogCQljYXNlIDB4MTkwMDoKLQkJCUluZm8oIlZpc2lvbml0ZSBWQ1MtVUMzMDAgVVNCIHdlYmNhbSBkZXRlY3RlZC5cbiIpOworCQkJUFdDX0lORk8oIlZpc2lvbml0ZSBWQ1MtVUMzMDAgVVNCIHdlYmNhbSBkZXRlY3RlZC5cbiIpOwogCQkJbmFtZSA9ICJWaXNpb25pdGUgVkNTLVVDMzAwIjsKIAkJCXR5cGVfaWQgPSA3NDA7IC8qIENDRCBzZW5zb3IgKi8KIAkJCWJyZWFrOwogCQljYXNlIDB4MTkxMDoKLQkJCUluZm8oIlZpc2lvbml0ZSBWQ1MtVU0xMDAgVVNCIHdlYmNhbSBkZXRlY3RlZC5cbiIpOworCQkJUFdDX0lORk8oIlZpc2lvbml0ZSBWQ1MtVU0xMDAgVVNCIHdlYmNhbSBkZXRlY3RlZC5cbiIpOwogCQkJbmFtZSA9ICJWaXNpb25pdGUgVkNTLVVNMTAwIjsKIAkJCXR5cGVfaWQgPSA3MzA7IC8qIENNT1Mgc2Vuc29yICovCiAJCQlicmVhazsKQEAgLTE4NjEsMTUgKzE2MzgsMTUgQEAKIAogCW1lbXNldChzZXJpYWxfbnVtYmVyLCAwLCAzMCk7CiAJdXNiX3N0cmluZyh1ZGV2LCB1ZGV2LT5kZXNjcmlwdG9yLmlTZXJpYWxOdW1iZXIsIHNlcmlhbF9udW1iZXIsIDI5KTsKLQlUcmFjZShUUkFDRV9QUk9CRSwgIkRldmljZSBzZXJpYWwgbnVtYmVyIGlzICVzXG4iLCBzZXJpYWxfbnVtYmVyKTsKKwlQV0NfREVCVUdfUFJPQkUoIkRldmljZSBzZXJpYWwgbnVtYmVyIGlzICVzXG4iLCBzZXJpYWxfbnVtYmVyKTsKIAogCWlmICh1ZGV2LT5kZXNjcmlwdG9yLmJOdW1Db25maWd1cmF0aW9ucyA+IDEpCi0JCUluZm8oIldhcm5pbmc6IG1vcmUgdGhhbiAxIGNvbmZpZ3VyYXRpb24gYXZhaWxhYmxlLlxuIik7CisJCVBXQ19XQVJOSU5HKCJXYXJuaW5nOiBtb3JlIHRoYW4gMSBjb25maWd1cmF0aW9uIGF2YWlsYWJsZS5cbiIpOwogCiAJLyogQWxsb2NhdGUgc3RydWN0dXJlLCBpbml0aWFsaXplIHBvaW50ZXJzLCBtdXRleGVzLCBldGMuIGFuZCBsaW5rIGl0IHRvIHRoZSB1c2JfZGV2aWNlICovCiAJcGRldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwd2NfZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHBkZXYgPT0gTlVMTCkgewotCQlFcnIoIk9vcHMsIGNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHB3Y19kZXZpY2UuXG4iKTsKKwkJUFdDX0VSUk9SKCJPb3BzLCBjb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBwd2NfZGV2aWNlLlxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAlwZGV2LT50eXBlID0gdHlwZV9pZDsKQEAgLTE5MDAsMTcgKzE2NzcsMTggQEAKIAlwZGV2LT52ZGV2ID0gdmlkZW9fZGV2aWNlX2FsbG9jKCk7CiAJaWYgKHBkZXYtPnZkZXYgPT0gMCkKIAl7Ci0JCUVycigiRXJyLCBjYW5ub3QgYWxsb2NhdGUgdmlkZW9fZGV2aWNlIHN0cnV0dXJlLiBGYWlsaW5nIHByb2JlLiIpOworCQlQV0NfRVJST1IoIkVyciwgY2Fubm90IGFsbG9jYXRlIHZpZGVvX2RldmljZSBzdHJ1dHVyZS4gRmFpbGluZyBwcm9iZS4iKTsKIAkJa2ZyZWUocGRldik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAltZW1jcHkocGRldi0+dmRldiwgJnB3Y190ZW1wbGF0ZSwgc2l6ZW9mKHB3Y190ZW1wbGF0ZSkpOworCXBkZXYtPnZkZXYtPmRldiA9ICYodWRldi0+ZGV2KTsKIAlzdHJjcHkocGRldi0+dmRldi0+bmFtZSwgbmFtZSk7CiAJcGRldi0+dmRldi0+b3duZXIgPSBUSElTX01PRFVMRTsKIAl2aWRlb19zZXRfZHJ2ZGF0YShwZGV2LT52ZGV2LCBwZGV2KTsKIAogCXBkZXYtPnJlbGVhc2UgPSBsZTE2X3RvX2NwdSh1ZGV2LT5kZXNjcmlwdG9yLmJjZERldmljZSk7Ci0JVHJhY2UoVFJBQ0VfUFJPQkUsICJSZWxlYXNlOiAlMDR4XG4iLCBwZGV2LT5yZWxlYXNlKTsKKwlQV0NfREVCVUdfUFJPQkUoIlJlbGVhc2U6ICUwNHhcbiIsIHBkZXYtPnJlbGVhc2UpOwogCiAJLyogTm93IHNlYXJjaCBkZXZpY2VfaGludFtdIHRhYmxlIGZvciBhIG1hdGNoLCBzbyB3ZSBjYW4gaGludCBhIG5vZGUgbnVtYmVyLiAqLwogCWZvciAoaGludCA9IDA7IGhpbnQgPCBNQVhfREVWX0hJTlRTOyBoaW50KyspIHsKQEAgLTE5MTgsMTAgKzE2OTYsMTAgQEAKIAkJICAgICAoZGV2aWNlX2hpbnRbaGludF0ucGRldiA9PSBOVUxMKSkgewogCQkJLyogc28gZmFyLCBzbyBnb29kLi4uIHRyeSBzZXJpYWwgbnVtYmVyICovCiAJCQlpZiAoKGRldmljZV9oaW50W2hpbnRdLnNlcmlhbF9udW1iZXJbMF0gPT0gJyonKSB8fCAhc3RyY21wKGRldmljZV9oaW50W2hpbnRdLnNlcmlhbF9udW1iZXIsIHNlcmlhbF9udW1iZXIpKSB7Ci0JCQkgICAgCS8qIG1hdGNoISAqLwotCQkJICAgIAl2aWRlb19uciA9IGRldmljZV9oaW50W2hpbnRdLmRldmljZV9ub2RlOwotCQkJICAgIAlUcmFjZShUUkFDRV9QUk9CRSwgIkZvdW5kIGhpbnQsIHdpbGwgdHJ5IHRvIHJlZ2lzdGVyIGFzIC9kZXYvdmlkZW8lZFxuIiwgdmlkZW9fbnIpOwotCQkJICAgIAlicmVhazsKKwkJCQkvKiBtYXRjaCEgKi8KKwkJCQl2aWRlb19uciA9IGRldmljZV9oaW50W2hpbnRdLmRldmljZV9ub2RlOworCQkJCVBXQ19ERUJVR19QUk9CRSgiRm91bmQgaGludCwgd2lsbCB0cnkgdG8gcmVnaXN0ZXIgYXMgL2Rldi92aWRlbyVkXG4iLCB2aWRlb19ucik7CisJCQkJYnJlYWs7CiAJCQl9CiAJCX0KIAl9CkBAIC0xOTI5LDIxICsxNzA3LDI3IEBACiAJcGRldi0+dmRldi0+cmVsZWFzZSA9IHZpZGVvX2RldmljZV9yZWxlYXNlOwogCWkgPSB2aWRlb19yZWdpc3Rlcl9kZXZpY2UocGRldi0+dmRldiwgVkZMX1RZUEVfR1JBQkJFUiwgdmlkZW9fbnIpOwogCWlmIChpIDwgMCkgewotCQlFcnIoIkZhaWxlZCB0byByZWdpc3RlciBhcyB2aWRlbyBkZXZpY2UgKCVkKS5cbiIsIGkpOworCQlQV0NfRVJST1IoIkZhaWxlZCB0byByZWdpc3RlciBhcyB2aWRlbyBkZXZpY2UgKCVkKS5cbiIsIGkpOwogCQl2aWRlb19kZXZpY2VfcmVsZWFzZShwZGV2LT52ZGV2KTsgLyogRHJpcC4uLiBkcmlwLi4uIGRyaXAuLi4gKi8KIAkJa2ZyZWUocGRldik7IC8qIE9vcHMsIG5vIG1lbW9yeSBsZWFrcyBwbGVhc2UgKi8KIAkJcmV0dXJuIC1FSU87CiAJfQogCWVsc2UgewotCQlJbmZvKCJSZWdpc3RlcmVkIGFzIC9kZXYvdmlkZW8lZC5cbiIsIHBkZXYtPnZkZXYtPm1pbm9yICYgMHgzRik7CisJCVBXQ19JTkZPKCJSZWdpc3RlcmVkIGFzIC9kZXYvdmlkZW8lZC5cbiIsIHBkZXYtPnZkZXYtPm1pbm9yICYgMHgzRik7CiAJfQogCiAJLyogb2NjdXB5IHNsb3QgKi8KIAlpZiAoaGludCA8IE1BWF9ERVZfSElOVFMpCiAJCWRldmljZV9oaW50W2hpbnRdLnBkZXYgPSBwZGV2OwogCi0JVHJhY2UoVFJBQ0VfUFJPQkUsICJwcm9iZSgpIGZ1bmN0aW9uIHJldHVybmluZyBzdHJ1Y3QgYXQgMHglcC5cbiIsIHBkZXYpOworCVBXQ19ERUJVR19QUk9CRSgicHJvYmUoKSBmdW5jdGlvbiByZXR1cm5pbmcgc3RydWN0IGF0IDB4JXAuXG4iLCBwZGV2KTsKIAl1c2Jfc2V0X2ludGZkYXRhIChpbnRmLCBwZGV2KTsKKwlwd2NfY3JlYXRlX3N5c2ZzX2ZpbGVzKHBkZXYtPnZkZXYpOworCisJLyogU2V0IHRoZSBsZWRzIG9mZiAqLworCXB3Y19zZXRfbGVkcyhwZGV2LCAwLCAwKTsKKwlwd2NfY2FtZXJhX3Bvd2VyKHBkZXYsIDApOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE5NTcsMjcgKzE3NDEsMjEgQEAKIAlwZGV2ID0gdXNiX2dldF9pbnRmZGF0YSAoaW50Zik7CiAJdXNiX3NldF9pbnRmZGF0YSAoaW50ZiwgTlVMTCk7CiAJaWYgKHBkZXYgPT0gTlVMTCkgewotCQlFcnIoInB3Y19kaXNjb25uZWN0KCkgQ2FsbGVkIHdpdGhvdXQgcHJpdmF0ZSBwb2ludGVyLlxuIik7CisJCVBXQ19FUlJPUigicHdjX2Rpc2Nvbm5lY3QoKSBDYWxsZWQgd2l0aG91dCBwcml2YXRlIHBvaW50ZXIuXG4iKTsKIAkJZ290byBkaXNjb25uZWN0X291dDsKIAl9CiAJaWYgKHBkZXYtPnVkZXYgPT0gTlVMTCkgewotCQlFcnIoInB3Y19kaXNjb25uZWN0KCkgYWxyZWFkeSBjYWxsZWQgZm9yICVwXG4iLCBwZGV2KTsKKwkJUFdDX0VSUk9SKCJwd2NfZGlzY29ubmVjdCgpIGFscmVhZHkgY2FsbGVkIGZvciAlcFxuIiwgcGRldik7CiAJCWdvdG8gZGlzY29ubmVjdF9vdXQ7CiAJfQogCWlmIChwZGV2LT51ZGV2ICE9IGludGVyZmFjZV90b191c2JkZXYoaW50ZikpIHsKLQkJRXJyKCJwd2NfZGlzY29ubmVjdCgpIFdvb3BzOiBwb2ludGVyIG1pc21hdGNoIHVkZXYvcGRldi5cbiIpOworCQlQV0NfRVJST1IoInB3Y19kaXNjb25uZWN0KCkgV29vcHM6IHBvaW50ZXIgbWlzbWF0Y2ggdWRldi9wZGV2LlxuIik7CiAJCWdvdG8gZGlzY29ubmVjdF9vdXQ7CiAJfQotI2lmZGVmIFBXQ19NQUdJQwotCWlmIChwZGV2LT5tYWdpYyAhPSBQV0NfTUFHSUMpIHsKLQkJRXJyKCJwd2NfZGlzY29ubmVjdCgpIE1hZ2ljIG51bWJlciBmYWlsZWQuIENvbnN1bHQgeW91ciBzY3JvbGxzIGFuZCB0cnkgYWdhaW4uXG4iKTsKLQkJZ290byBkaXNjb25uZWN0X291dDsKLQl9Ci0jZW5kaWYKIAogCS8qIFdlIGdvdCB1bnBsdWdnZWQ7IHRoaXMgaXMgc2lnbmFsbGVkIGJ5IGFuIEVQSVBFIGVycm9yIGNvZGUgKi8KIAlpZiAocGRldi0+dm9wZW4pIHsKLQkJSW5mbygiRGlzY29ubmVjdGVkIHdoaWxlIHdlYmNhbSBpcyBpbiB1c2UhXG4iKTsKKwkJUFdDX0lORk8oIkRpc2Nvbm5lY3RlZCB3aGlsZSB3ZWJjYW0gaXMgaW4gdXNlIVxuIik7CiAJCXBkZXYtPmVycm9yX3N0YXR1cyA9IEVQSVBFOwogCX0KIApAQCAtMTk4Nyw3ICsxNzY1LDggQEAKIAl3aGlsZSAocGRldi0+dm9wZW4pCiAJCXNjaGVkdWxlKCk7CiAJLyogRGV2aWNlIGlzIG5vdyBjbG9zZWQsIHNvIHdlIGNhbiBzYWZlbHkgdW5yZWdpc3RlciBpdCAqLwotCVRyYWNlKFRSQUNFX1BST0JFLCAiVW5yZWdpc3RlcmluZyB2aWRlbyBkZXZpY2UgaW4gZGlzY29ubmVjdCgpLlxuIik7CisJUFdDX0RFQlVHX1BST0JFKCJVbnJlZ2lzdGVyaW5nIHZpZGVvIGRldmljZSBpbiBkaXNjb25uZWN0KCkuXG4iKTsKKwlwd2NfcmVtb3ZlX3N5c2ZzX2ZpbGVzKHBkZXYtPnZkZXYpOwogCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKHBkZXYtPnZkZXYpOwogCiAJLyogRnJlZSBtZW1vcnkgKGRvbid0IHNldCBwZGV2IHRvIDAganVzdCB5ZXQpICovCkBAIC0yMDIxLDU4ICsxODAwLDY0IEBACiAgKiBJbml0aWFsaXphdGlvbiBjb2RlICYgbW9kdWxlIHN0dWZmCiAgKi8KIAotc3RhdGljIGNoYXIgc2l6ZVsxMF07Ci1zdGF0aWMgaW50IGZwcyA9IDA7Ci1zdGF0aWMgaW50IGZidWZzID0gMDsKLXN0YXRpYyBpbnQgbWJ1ZnMgPSAwOwotc3RhdGljIGludCB0cmFjZSA9IC0xOworc3RhdGljIGNoYXIgKnNpemU7CitzdGF0aWMgaW50IGZwczsKK3N0YXRpYyBpbnQgZmJ1ZnM7CitzdGF0aWMgaW50IG1idWZzOwogc3RhdGljIGludCBjb21wcmVzc2lvbiA9IC0xOwogc3RhdGljIGludCBsZWRzWzJdID0geyAtMSwgLTEgfTsKLXN0YXRpYyBjaGFyICpkZXZfaGludFtNQVhfREVWX0hJTlRTXSA9IHsgfTsKK3N0YXRpYyBpbnQgbGVkc19uYXJnczsKK3N0YXRpYyBjaGFyICpkZXZfaGludFtNQVhfREVWX0hJTlRTXTsKK3N0YXRpYyBpbnQgZGV2X2hpbnRfbmFyZ3M7CiAKLW1vZHVsZV9wYXJhbV9zdHJpbmcoc2l6ZSwgc2l6ZSwgc2l6ZW9mKHNpemUpLCAwKTsKK21vZHVsZV9wYXJhbShzaXplLCBjaGFycCwgMDQ0NCk7Cittb2R1bGVfcGFyYW0oZnBzLCBpbnQsIDA0NDQpOworbW9kdWxlX3BhcmFtKGZidWZzLCBpbnQsIDA0NDQpOworbW9kdWxlX3BhcmFtKG1idWZzLCBpbnQsIDA0NDQpOworI2lmIENPTkZJR19QV0NfREVCVUcKK21vZHVsZV9wYXJhbV9uYW1lZCh0cmFjZSwgcHdjX3RyYWNlLCBpbnQsIDA2NDQpOworI2VuZGlmCittb2R1bGVfcGFyYW0ocG93ZXJfc2F2ZSwgaW50LCAwNDQ0KTsKK21vZHVsZV9wYXJhbShjb21wcmVzc2lvbiwgaW50LCAwNDQ0KTsKK21vZHVsZV9wYXJhbV9hcnJheShsZWRzLCBpbnQsICZsZWRzX25hcmdzLCAwNDQ0KTsKK21vZHVsZV9wYXJhbV9hcnJheShkZXZfaGludCwgY2hhcnAsICZkZXZfaGludF9uYXJncywgMDQ0NCk7CisKIE1PRFVMRV9QQVJNX0RFU0Moc2l6ZSwgIkluaXRpYWwgaW1hZ2Ugc2l6ZS4gT25lIG9mIHNxY2lmLCBxc2lmLCBxY2lmLCBzaWYsIGNpZiwgdmdhIik7Ci1tb2R1bGVfcGFyYW0oZnBzLCBpbnQsIDAwMDApOwogTU9EVUxFX1BBUk1fREVTQyhmcHMsICJJbml0aWFsIGZyYW1lcyBwZXIgc2Vjb25kLiBWYXJpZXMgd2l0aCBtb2RlbCwgdXNlZnVsIHJhbmdlIDUtMzAiKTsKLW1vZHVsZV9wYXJhbShmYnVmcywgaW50LCAwMDAwKTsKIE1PRFVMRV9QQVJNX0RFU0MoZmJ1ZnMsICJOdW1iZXIgb2YgaW50ZXJuYWwgZnJhbWUgYnVmZmVycyB0byByZXNlcnZlIik7Ci1tb2R1bGVfcGFyYW0obWJ1ZnMsIGludCwgMDAwMCk7CiBNT0RVTEVfUEFSTV9ERVNDKG1idWZzLCAiTnVtYmVyIG9mIGV4dGVybmFsIChtbWFwKCllZCkgaW1hZ2UgYnVmZmVycyIpOwotbW9kdWxlX3BhcmFtKHRyYWNlLCBpbnQsIDAwMDApOwogTU9EVUxFX1BBUk1fREVTQyh0cmFjZSwgIkZvciBkZWJ1Z2dpbmcgcHVycG9zZXMiKTsKLW1vZHVsZV9wYXJhbShwb3dlcl9zYXZlLCBib29sLCAwMDAwKTsKIE1PRFVMRV9QQVJNX0RFU0MocG93ZXJfc2F2ZSwgIlR1cm4gcG93ZXIgc2F2ZSBmZWF0dXJlIGluIGNhbWVyYSBvbiBvciBvZmYiKTsKLW1vZHVsZV9wYXJhbShjb21wcmVzc2lvbiwgaW50LCAwMDAwKTsKIE1PRFVMRV9QQVJNX0RFU0MoY29tcHJlc3Npb24sICJQcmVmZXJyZWQgY29tcHJlc3Npb24gcXVhbGl0eS4gUmFuZ2UgMCAodW5jb21wcmVzc2VkKSB0byAzIChoaWdoIGNvbXByZXNzaW9uKSIpOwotbW9kdWxlX3BhcmFtX2FycmF5KGxlZHMsIGludCwgTlVMTCwgMDAwMCk7CiBNT0RVTEVfUEFSTV9ERVNDKGxlZHMsICJMRUQgb24sb2ZmIHRpbWUgaW4gbWlsbGlzZWNvbmRzIik7Ci1tb2R1bGVfcGFyYW1fYXJyYXkoZGV2X2hpbnQsIGNoYXJwLCBOVUxMLCAwMDAwKTsKIE1PRFVMRV9QQVJNX0RFU0MoZGV2X2hpbnQsICJEZXZpY2Ugbm9kZSBoaW50cyIpOwogCiBNT0RVTEVfREVTQ1JJUFRJT04oIlBoaWxpcHMgJiBPRU0gVVNCIHdlYmNhbSBkcml2ZXIiKTsKIE1PRFVMRV9BVVRIT1IoIkx1YyBTYWlsbGFyZCA8bHVjQHNhaWxsYXJkLm9yZz4iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygicHdjeCIpOworTU9EVUxFX1ZFUlNJT04oIFBXQ19WRVJTSU9OICk7CiAKIHN0YXRpYyBpbnQgX19pbml0IHVzYl9wd2NfaW5pdCh2b2lkKQogewogCWludCBpLCBzejsKIAljaGFyICpzaXplbmFtZXNbUFNaX01BWF0gPSB7ICJzcWNpZiIsICJxc2lmIiwgInFjaWYiLCAic2lmIiwgImNpZiIsICJ2Z2EiIH07CiAKLQlJbmZvKCJQaGlsaXBzIHdlYmNhbSBtb2R1bGUgdmVyc2lvbiAiIFBXQ19WRVJTSU9OICIgbG9hZGVkLlxuIik7Ci0JSW5mbygiU3VwcG9ydHMgUGhpbGlwcyBQQ0E2NDUvNjQ2LCBQQ1ZDNjc1LzY4MC82OTAsIFBDVkM3MjBbNDBdLzczMC83NDAvNzUwICYgUENWQzgzMC84NDAuXG4iKTsKLQlJbmZvKCJBbHNvIHN1cHBvcnRzIHRoZSBBc2tleSBWQzAxMCwgdmFyaW91cyBMb2dpdGVjaCBRdWlja2NhbXMsIFNhbXN1bmcgTVBDLUMxMCBhbmQgTVBDLUMzMCxcbiIpOwotCUluZm8oInRoZSBDcmVhdGl2ZSBXZWJDYW0gNSAmIFBybyBFeCwgU09URUMgQWZpbmEgRXllIGFuZCBWaXNpb25pdGUgVkNTLVVDMzAwIGFuZCBWQ1MtVU0xMDAuXG4iKTsKKwlQV0NfSU5GTygiUGhpbGlwcyB3ZWJjYW0gbW9kdWxlIHZlcnNpb24gIiBQV0NfVkVSU0lPTiAiIGxvYWRlZC5cbiIpOworCVBXQ19JTkZPKCJTdXBwb3J0cyBQaGlsaXBzIFBDQTY0NS82NDYsIFBDVkM2NzUvNjgwLzY5MCwgUENWQzcyMFs0MF0vNzMwLzc0MC83NTAgJiBQQ1ZDODMwLzg0MC5cbiIpOworCVBXQ19JTkZPKCJBbHNvIHN1cHBvcnRzIHRoZSBBc2tleSBWQzAxMCwgdmFyaW91cyBMb2dpdGVjaCBRdWlja2NhbXMsIFNhbXN1bmcgTVBDLUMxMCBhbmQgTVBDLUMzMCxcbiIpOworCVBXQ19JTkZPKCJ0aGUgQ3JlYXRpdmUgV2ViQ2FtIDUgJiBQcm8gRXgsIFNPVEVDIEFmaW5hIEV5ZSBhbmQgVmlzaW9uaXRlIFZDUy1VQzMwMCBhbmQgVkNTLVVNMTAwLlxuIik7CiAKIAlpZiAoZnBzKSB7CiAJCWlmIChmcHMgPCA0IHx8IGZwcyA+IDMwKSB7Ci0JCQlFcnIoIkZyYW1lcmF0ZSBvdXQgb2YgYm91bmRzICg0LTMwKS5cbiIpOworCQkJUFdDX0VSUk9SKCJGcmFtZXJhdGUgb3V0IG9mIGJvdW5kcyAoNC0zMCkuXG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJCWRlZmF1bHRfZnBzID0gZnBzOwotCQlJbmZvKCJEZWZhdWx0IGZyYW1lcmF0ZSBzZXQgdG8gJWQuXG4iLCBkZWZhdWx0X2Zwcyk7CisJCVBXQ19ERUJVR19NT0RVTEUoIkRlZmF1bHQgZnJhbWVyYXRlIHNldCB0byAlZC5cbiIsIGRlZmF1bHRfZnBzKTsKIAl9CiAKLQlpZiAoc2l6ZVswXSkgeworCWlmIChzaXplKSB7CiAJCS8qIHN0cmluZzsgdHJ5IG1hdGNoaW5nIHdpdGggYXJyYXkgKi8KIAkJZm9yIChzeiA9IDA7IHN6IDwgUFNaX01BWDsgc3orKykgewogCQkJaWYgKCFzdHJjbXAoc2l6ZW5hbWVzW3N6XSwgc2l6ZSkpIHsgLyogRm91bmQhICovCkBAIC0yMDgxLDQxICsxODY2LDQyIEBACiAJCQl9CiAJCX0KIAkJaWYgKHN6ID09IFBTWl9NQVgpIHsKLQkJCUVycigiU2l6ZSBub3QgcmVjb2duaXplZDsgdHJ5IHNpemU9W3NxY2lmIHwgcXNpZiB8IHFjaWYgfCBzaWYgfCBjaWYgfCB2Z2FdLlxuIik7CisJCQlQV0NfRVJST1IoIlNpemUgbm90IHJlY29nbml6ZWQ7IHRyeSBzaXplPVtzcWNpZiB8IHFzaWYgfCBxY2lmIHwgc2lmIHwgY2lmIHwgdmdhXS5cbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KLQkJSW5mbygiRGVmYXVsdCBpbWFnZSBzaXplIHNldCB0byAlcyBbJWR4JWRdLlxuIiwgc2l6ZW5hbWVzW2RlZmF1bHRfc2l6ZV0sIHB3Y19pbWFnZV9zaXplc1tkZWZhdWx0X3NpemVdLngsIHB3Y19pbWFnZV9zaXplc1tkZWZhdWx0X3NpemVdLnkpOworCQlQV0NfREVCVUdfTU9EVUxFKCJEZWZhdWx0IGltYWdlIHNpemUgc2V0IHRvICVzIFslZHglZF0uXG4iLCBzaXplbmFtZXNbZGVmYXVsdF9zaXplXSwgcHdjX2ltYWdlX3NpemVzW2RlZmF1bHRfc2l6ZV0ueCwgcHdjX2ltYWdlX3NpemVzW2RlZmF1bHRfc2l6ZV0ueSk7CiAJfQogCWlmIChtYnVmcykgewogCQlpZiAobWJ1ZnMgPCAxIHx8IG1idWZzID4gTUFYX0lNQUdFUykgewotCQkJRXJyKCJJbGxlZ2FsIG51bWJlciBvZiBtbWFwKCkgYnVmZmVyczsgdXNlIGEgbnVtYmVyIGJldHdlZW4gMSBhbmQgJWQuXG4iLCBNQVhfSU1BR0VTKTsKKwkJCVBXQ19FUlJPUigiSWxsZWdhbCBudW1iZXIgb2YgbW1hcCgpIGJ1ZmZlcnM7IHVzZSBhIG51bWJlciBiZXR3ZWVuIDEgYW5kICVkLlxuIiwgTUFYX0lNQUdFUyk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQotCQlkZWZhdWx0X21idWZzID0gbWJ1ZnM7Ci0JCUluZm8oIk51bWJlciBvZiBpbWFnZSBidWZmZXJzIHNldCB0byAlZC5cbiIsIGRlZmF1bHRfbWJ1ZnMpOworCQlwd2NfbWJ1ZnMgPSBtYnVmczsKKwkJUFdDX0RFQlVHX01PRFVMRSgiTnVtYmVyIG9mIGltYWdlIGJ1ZmZlcnMgc2V0IHRvICVkLlxuIiwgcHdjX21idWZzKTsKIAl9CiAJaWYgKGZidWZzKSB7CiAJCWlmIChmYnVmcyA8IDIgfHwgZmJ1ZnMgPiBNQVhfRlJBTUVTKSB7Ci0JCQlFcnIoIklsbGVnYWwgbnVtYmVyIG9mIGZyYW1lIGJ1ZmZlcnM7IHVzZSBhIG51bWJlciBiZXR3ZWVuIDIgYW5kICVkLlxuIiwgTUFYX0ZSQU1FUyk7CisJCQlQV0NfRVJST1IoIklsbGVnYWwgbnVtYmVyIG9mIGZyYW1lIGJ1ZmZlcnM7IHVzZSBhIG51bWJlciBiZXR3ZWVuIDIgYW5kICVkLlxuIiwgTUFYX0ZSQU1FUyk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCQlkZWZhdWx0X2ZidWZzID0gZmJ1ZnM7Ci0JCUluZm8oIk51bWJlciBvZiBmcmFtZSBidWZmZXJzIHNldCB0byAlZC5cbiIsIGRlZmF1bHRfZmJ1ZnMpOworCQlQV0NfREVCVUdfTU9EVUxFKCJOdW1iZXIgb2YgZnJhbWUgYnVmZmVycyBzZXQgdG8gJWQuXG4iLCBkZWZhdWx0X2ZidWZzKTsKIAl9Ci0JaWYgKHRyYWNlID49IDApIHsKLQkJSW5mbygiVHJhY2Ugb3B0aW9uczogMHglMDR4XG4iLCB0cmFjZSk7Ci0JCXB3Y190cmFjZSA9IHRyYWNlOworI2lmIENPTkZJR19QV0NfREVCVUcKKwlpZiAocHdjX3RyYWNlID49IDApIHsKKwkJUFdDX0RFQlVHX01PRFVMRSgiVHJhY2Ugb3B0aW9uczogMHglMDR4XG4iLCBwd2NfdHJhY2UpOwogCX0KKyNlbmRpZgogCWlmIChjb21wcmVzc2lvbiA+PSAwKSB7CiAJCWlmIChjb21wcmVzc2lvbiA+IDMpIHsKLQkJCUVycigiSW52YWxpZCBjb21wcmVzc2lvbiBzZXR0aW5nOyB1c2UgYSBudW1iZXIgYmV0d2VlbiAwICh1bmNvbXByZXNzZWQpIGFuZCAzIChoaWdoKS5cbiIpOworCQkJUFdDX0VSUk9SKCJJbnZhbGlkIGNvbXByZXNzaW9uIHNldHRpbmc7IHVzZSBhIG51bWJlciBiZXR3ZWVuIDAgKHVuY29tcHJlc3NlZCkgYW5kIDMgKGhpZ2gpLlxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCQlwd2NfcHJlZmVycmVkX2NvbXByZXNzaW9uID0gY29tcHJlc3Npb247Ci0JCUluZm8oIlByZWZlcnJlZCBjb21wcmVzc2lvbiBzZXQgdG8gJWQuXG4iLCBwd2NfcHJlZmVycmVkX2NvbXByZXNzaW9uKTsKKwkJUFdDX0RFQlVHX01PRFVMRSgiUHJlZmVycmVkIGNvbXByZXNzaW9uIHNldCB0byAlZC5cbiIsIHB3Y19wcmVmZXJyZWRfY29tcHJlc3Npb24pOwogCX0KIAlpZiAocG93ZXJfc2F2ZSkKLQkJSW5mbygiRW5hYmxpbmcgcG93ZXIgc2F2ZSBvbiBvcGVuL2Nsb3NlLlxuIik7CisJCVBXQ19ERUJVR19NT0RVTEUoIkVuYWJsaW5nIHBvd2VyIHNhdmUgb24gb3Blbi9jbG9zZS5cbiIpOwogCWlmIChsZWRzWzBdID49IDApCiAJCWxlZF9vbiA9IGxlZHNbMF07CiAJaWYgKGxlZHNbMV0gPj0gMCkKQEAgLTIxNDYsMTQgKzE5MzIsMTQgQEAKIAkJCQlkb3QrKzsKIAkJCS8qIEZldyBzYW5pdHkgY2hlY2tzICovCiAJCQlpZiAoKmRvdCAhPSAnXDAnICYmIGRvdCA+IGNvbG9uKSB7Ci0JCQkJRXJyKCJNYWxmb3JtZWQgY2FtZXJhIGhpbnQ6IHRoZSBjb2xvbiBtdXN0IGJlIGFmdGVyIHRoZSBkb3QuXG4iKTsKKwkJCQlQV0NfRVJST1IoIk1hbGZvcm1lZCBjYW1lcmEgaGludDogdGhlIGNvbG9uIG11c3QgYmUgYWZ0ZXIgdGhlIGRvdC5cbiIpOwogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQogCiAJCQlpZiAoKmNvbG9uID09ICdcMCcpIHsKIAkJCQkvKiBObyBjb2xvbiAqLwogCQkJCWlmICgqZG90ICE9ICdcMCcpIHsKLQkJCQkJRXJyKCJNYWxmb3JtZWQgY2FtZXJhIGhpbnQ6IG5vIGNvbG9uICsgZGV2aWNlIG5vZGUgZ2l2ZW4uXG4iKTsKKwkJCQkJUFdDX0VSUk9SKCJNYWxmb3JtZWQgY2FtZXJhIGhpbnQ6IG5vIGNvbG9uICsgZGV2aWNlIG5vZGUgZ2l2ZW4uXG4iKTsKIAkJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQkJfQogCQkJCWVsc2UgewpAQCAtMjE3OCwyOCArMTk2NCwyNyBAQAogCQkJCQlkZXZpY2VfaGludFtpXS5zZXJpYWxfbnVtYmVyW2tdID0gJ1wwJzsKIAkJCQl9CiAJCQl9Ci0jaWYgUFdDX0RFQlVHCi0JCQlEZWJ1ZygiZGV2aWNlX2hpbnRbJWRdOlxuIiwgaSk7Ci0JCQlEZWJ1ZygiICB0eXBlICAgIDogJWRcbiIsIGRldmljZV9oaW50W2ldLnR5cGUpOwotCQkJRGVidWcoIiAgc2VyaWFsIyA6ICVzXG4iLCBkZXZpY2VfaGludFtpXS5zZXJpYWxfbnVtYmVyKTsKLQkJCURlYnVnKCIgIG5vZGUgICAgOiAlZFxuIiwgZGV2aWNlX2hpbnRbaV0uZGV2aWNlX25vZGUpOwotI2VuZGlmCisJCQlQV0NfVFJBQ0UoImRldmljZV9oaW50WyVkXTpcbiIsIGkpOworCQkJUFdDX1RSQUNFKCIgIHR5cGUgICAgOiAlZFxuIiwgZGV2aWNlX2hpbnRbaV0udHlwZSk7CisJCQlQV0NfVFJBQ0UoIiAgc2VyaWFsIyA6ICVzXG4iLCBkZXZpY2VfaGludFtpXS5zZXJpYWxfbnVtYmVyKTsKKwkJCVBXQ19UUkFDRSgiICBub2RlICAgIDogJWRcbiIsIGRldmljZV9oaW50W2ldLmRldmljZV9ub2RlKTsKIAkJfQogCQllbHNlCiAJCQlkZXZpY2VfaGludFtpXS50eXBlID0gMDsgLyogbm90IGZpbGxlZCAqLwogCX0gLyogLi5mb3IgTUFYX0RFVl9ISU5UUyAqLwogCi0JVHJhY2UoVFJBQ0VfUFJPQkUsICJSZWdpc3RlcmluZyBkcml2ZXIgYXQgYWRkcmVzcyAweCVwLlxuIiwgJnB3Y19kcml2ZXIpOworCVBXQ19ERUJVR19QUk9CRSgiUmVnaXN0ZXJpbmcgZHJpdmVyIGF0IGFkZHJlc3MgMHglcC5cbiIsICZwd2NfZHJpdmVyKTsKIAlyZXR1cm4gdXNiX3JlZ2lzdGVyKCZwd2NfZHJpdmVyKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IHVzYl9wd2NfZXhpdCh2b2lkKQogewotCVRyYWNlKFRSQUNFX01PRFVMRSwgIkRlcmVnaXN0ZXJpbmcgZHJpdmVyLlxuIik7CisJUFdDX0RFQlVHX01PRFVMRSgiRGVyZWdpc3RlcmluZyBkcml2ZXIuXG4iKTsKIAl1c2JfZGVyZWdpc3RlcigmcHdjX2RyaXZlcik7Ci0JSW5mbygiUGhpbGlwcyB3ZWJjYW0gbW9kdWxlIHJlbW92ZWQuXG4iKTsKKwlQV0NfSU5GTygiUGhpbGlwcyB3ZWJjYW0gbW9kdWxlIHJlbW92ZWQuXG4iKTsKIH0KIAogbW9kdWxlX2luaXQodXNiX3B3Y19pbml0KTsKIG1vZHVsZV9leGl0KHVzYl9wd2NfZXhpdCk7CiAKKy8qIHZpbTogc2V0IGNpbm89IGZvcm1hdG9wdGlvbnM9Y3JvcWwgY2luZGVudCBzaGlmdHdpZHRoPTggdGFic3RvcD04OiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLWtpYXJhLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2Mta2lhcmEuYwppbmRleCA0Yzk2MDM3Li5mZWMzOWNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2Mta2lhcmEuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2Mta2lhcmEuYwpAQCAtMSw1ICsxLDUgQEAKIC8qIExpbnV4IGRyaXZlciBmb3IgUGhpbGlwcyB3ZWJjYW0KLSAgIChDKSAyMDA0ICAgICAgTHVjIFNhaWxsYXJkIChsdWNAc2FpbGxhcmQub3JnKQorICAgKEMpIDIwMDQtMjAwNiBMdWMgU2FpbGxhcmQgKGx1Y0BzYWlsbGFyZC5vcmcpCiAKICAgIE5PVEU6IHRoaXMgdmVyc2lvbiBvZiBwd2MgaXMgYW4gdW5vZmZpY2lhbCAobW9kaWZpZWQpIHJlbGVhc2Ugb2YgcHdjICYgcGN3eAogICAgZHJpdmVyIGFuZCB0aHVzIG1heSBoYXZlIGJ1Z3MgdGhhdCBhcmUgbm90IHByZXNlbnQgaW4gdGhlIG9yaWdpbmFsIHZlcnNpb24uCkBAIC0zMTYsMyArMzE2LDU3NiBAQAogICAgfSwKIH07CiAKKworLyoKKyAqIFJvbSB0YWJsZSBmb3Iga2lhcmEgY2hpcHMKKyAqCisgKiAzMiByb21zIHRhYmxlcyAob25lIGZvciBlYWNoIHJlc29sdXRpb24gPykKKyAqICAyIHRhYmxlcyBwZXIgcm9tcyAob25lIGZvciBlYWNoIHBhc3NlcykgKFksIGFuZCBVJlYpCisgKiAxMjggYnl0ZXMgcGVyIHBhc3NlcworICovCisKK2NvbnN0IHVuc2lnbmVkIGludCBLaWFyYVJvbVRhYmxlIFs4XVsyXVsxNl1bOF0gPQoreworIHsgLyogdmVyc2lvbiAwICovCisgIHsgLyogdmVyc2lvbiAwLCBwYXNzZXMgMCAqLworICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDEsMHgwMDAwMDAwMX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDksMHgwMDAwMDAwOSwKKyAgICAweDAwMDAwMDA5LDB4MDAwMDAwMDksMHgwMDAwMDAwOSwweDAwMDAwMDA5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwOSwweDAwMDAwMDQ5LAorICAgIDB4MDAwMDAwNDksMHgwMDAwMDA0OSwweDAwMDAwMDQ5LDB4MDAwMDAwNDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDQ5LDB4MDAwMDAwNDksCisgICAgMHgwMDAwMDA0OSwweDAwMDAwMjQ5LDB4MDAwMDAyNGEsMHgwMDAwMDA0OX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwNDksMHgwMDAwMDA0OSwKKyAgICAweDAwMDAwMjQ5LDB4MDAwMDAyNDksMHgwMDAwMDI0YSwweDAwMDAwMjRhfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDA0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDAyNDksMHgwMDAwMTI0YSwweDAwMDAwMjRhLDB4MDAwMDAyNGF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDA5MjUyLDB4MDAwMDEyNTIsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDA5MjUyLDB4MDAwMDkyOTIsMHgwMDAwOTI5MiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyOTIsMHgwMDAwOTI5MiwweDAwMDA5NDkzLDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDkyNGEsCisgICAgMHgwMDAwOTQ5MiwweDAwMDBhNDliLDB4MDAwMGE0OWIsMHgwMDAxMjRkYn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI1MiwKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI0ZGIsMHgwMDAxMjRkYiwweDAwMDEyNmRjfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5NDkzLAorICAgIDB4MDAwMTI0ZGIsMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMTI2ZGN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjkyLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjRkYiwweDAwMDEzNmU0LDB4MDAwMTM2ZTQsMHgwMDAxMzZlNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyOTIsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMWI3MjQsMHgwMDAxYjkyZCwweDAwMDFiOTI1fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDEyNGRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxYjkyNSwweDAwMDFjOTZlLDB4MDAwMWM5MmR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0KKyAgfSwKKyAgeyAvKiB2ZXJzaW9uIDAsIHBhc3NlcyAxICovCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDB9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAxLDB4MDAwMDAwMDksCisgICAgMHgwMDAwMDAwOSwweDAwMDAwMDA5LDB4MDAwMDAwMDksMHgwMDAwMDAwMX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDksMHgwMDAwMDAwOSwKKyAgICAweDAwMDAwMDQ5LDB4MDAwMDAwNDksMHgwMDAwMDA0OSwweDAwMDAwMDQ5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDA0OSwweDAwMDAwMDQ5LAorICAgIDB4MDAwMDAwNDksMHgwMDAwMDA0OSwweDAwMDAwMjRhLDB4MDAwMDAyNGF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDQ5LDB4MDAwMDAwNDksCisgICAgMHgwMDAwMDI0OSwweDAwMDAwMjQ5LDB4MDAwMDAyNGEsMHgwMDAwMDI0YX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAwMjQ5LDB4MDAwMDAyNDksMHgwMDAwMDI0YSwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDA0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwMTI0YSwweDAwMDAxMjUyLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwOTI1MiwweDAwMDA5MjUyLDB4MDAwMDkyOTIsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwOTI0YSwKKyAgICAweDAwMDA5MjkyLDB4MDAwMDkyOTIsMHgwMDAwOTI5MiwweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDA5MjkyLAorICAgIDB4MDAwMDk0OTIsMHgwMDAwOTQ5MywweDAwMDBhNDliLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyOTIsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNGRiLDB4MDAwMTI2ZGMsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDEzNmU0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI1MiwweDAwMDA5NDkzLAorICAgIDB4MDAwMTI2ZGMsMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMTM2ZTR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjkyLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMzZlNCwweDAwMDEzNmU0LDB4MDAwMWI3MjUsMHgwMDAxYjcyNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfQorICB9CisgfSwKKyB7IC8qIHZlcnNpb24gMSAqLworICB7IC8qIHZlcnNpb24gMSwgcGFzc2VzIDAgKi8KKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDA5LDB4MDAwMDAwMDksCisgICAgMHgwMDAwMDAwOSwweDAwMDAwMDA5LDB4MDAwMDAwMDksMHgwMDAwMDAwOX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwNDksMHgwMDAwMDA0OSwKKyAgICAweDAwMDAwMDQ5LDB4MDAwMDAwNDksMHgwMDAwMDA0OSwweDAwMDAwMDQ5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDA0OSwweDAwMDAwMDQ5LAorICAgIDB4MDAwMDAwNDksMHgwMDAwMDI0OSwweDAwMDAwMjRhLDB4MDAwMDAyNGF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMDI0OSwweDAwMDAwMjQ5LDB4MDAwMDAyNGEsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAwMjQ5LDB4MDAwMDEyNGEsMHgwMDAwMTI1MiwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwMTI0YSwweDAwMDA5MjkyLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDA5MjUyLDB4MDAwMDkyOTIsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDA5MjUyLDB4MDAwMDkyOTIsMHgwMDAwOTI5MiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyNTIsMHgwMDAwOTI5MiwweDAwMDA5NDkzLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDkyNGEsCisgICAgMHgwMDAwOTI1MiwweDAwMDA5NDkzLDB4MDAwMDk0OTMsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwOTI0YSwKKyAgICAweDAwMDA5MjkyLDB4MDAwMDk0OTMsMHgwMDAwOTQ5MywweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDA5MjUyLAorICAgIDB4MDAwMDk0OTIsMHgwMDAwOTQ5MywweDAwMDBhNDliLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyOTIsCisgICAgMHgwMDAwOTQ5MiwweDAwMDEyNGRiLDB4MDAwMTI0ZGIsMHgwMDAxMjRkYn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI2ZGMsMHgwMDAxMjZkYywweDAwMDEyNmRjfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDB9CisgIH0sCisgIHsgLyogdmVyc2lvbiAxLCBwYXNzZXMgMSAqLworICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwNDksMHgwMDAwMDAwOSwKKyAgICAweDAwMDAwMDQ5LDB4MDAwMDAwMDksMHgwMDAwMDAwMSwweDAwMDAwMDAwfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDA0OSwweDAwMDAwMDQ5LAorICAgIDB4MDAwMDAwNDksMHgwMDAwMDA0OSwweDAwMDAwMDQ5LDB4MDAwMDAwMDB9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAwNDksCisgICAgMHgwMDAwMDI0OSwweDAwMDAwMDQ5LDB4MDAwMDAyNGEsMHgwMDAwMDAwMX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAwMjQ5LDB4MDAwMDAyNDksMHgwMDAwMDI0YSwweDAwMDAwMDAxfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDAyNDksMHgwMDAwMDI0OSwweDAwMDAwMjRhLDB4MDAwMDAwMDF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMDI0OSwweDAwMDAwMjQ5LDB4MDAwMDAyNGEsMHgwMDAwMDAwOX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAxMjRhLDB4MDAwMDEyNGEsMHgwMDAwMDI0YSwweDAwMDAwMDA5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwMTI0YSwweDAwMDAwMjRhLDB4MDAwMDAwMDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDA5MjUyLDB4MDAwMDEyNTIsMHgwMDAwMDA0OX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDAxMjRhLDB4MDAwMDkyOTIsMHgwMDAwMTI1MiwweDAwMDAwMDQ5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwOTI5MiwweDAwMDAxMjUyLDB4MDAwMDAwNDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwOTI1MiwweDAwMDA5MjkyLDB4MDAwMDEyNTIsMHgwMDAwMDI0YX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDA5MjkyLDB4MDAwMDkyOTIsMHgwMDAwMTI1MiwweDAwMDAwMjRhfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDA5MjRhLAorICAgIDB4MDAwMDk0OTIsMHgwMDAwOTQ5MywweDAwMDA5MjkyLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0KKyAgfQorIH0sCisgeyAvKiB2ZXJzaW9uIDIgKi8KKyAgeyAvKiB2ZXJzaW9uIDIsIHBhc3NlcyAwICovCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwNDksMHgwMDAwMDA0OSwKKyAgICAweDAwMDAwMDQ5LDB4MDAwMDAwNDksMHgwMDAwMDI0YSwweDAwMDAwMjRhfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDAyNDksMHgwMDAwMTI0YSwweDAwMDAxMjUyLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDA5MjUyLDB4MDAwMDkyOTIsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDAxMjRhLDB4MDAwMDkyOTIsMHgwMDAwOTQ5MywweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyNTIsMHgwMDAwOTQ5MywweDAwMDA5NDkzLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDkyNGEsCisgICAgMHgwMDAwOTI5MiwweDAwMDA5NDkzLDB4MDAwMGE0OWIsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI0YSwKKyAgICAweDAwMDA5MjkyLDB4MDAwMDk0OTMsMHgwMDAwYTQ5YiwweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjUyLAorICAgIDB4MDAwMDk0OTIsMHgwMDAwYTQ5YiwweDAwMDBhNDliLDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyOTIsCisgICAgMHgwMDAwOTQ5MiwweDAwMDEyNGRiLDB4MDAwMTI0ZGIsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI5MiwKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI0ZGIsMHgwMDAxMjZkYywweDAwMDEyNmRjfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjRkYiwweDAwMDEyNmRjLDB4MDAwMTM2ZTR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNmRjLDB4MDAwMTM2ZTQsMHgwMDAxMzZlNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTQ5MywKKyAgICAweDAwMDEyNDliLDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDEzNmU0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0ZGIsMHgwMDAxMzZlNCwweDAwMDEzNmU0LDB4MDAwMWI3MjR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjUyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMjZkYywweDAwMDFiNzI0LDB4MDAwMWI3MjUsMHgwMDAxYjkyNX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfQorICB9LAorICB7IC8qIHZlcnNpb24gMiwgcGFzc2VzIDEgKi8KKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDA0OSwweDAwMDAwMDQ5LAorICAgIDB4MDAwMDAwNDksMHgwMDAwMDA0OSwweDAwMDAwMDQ5LDB4MDAwMDAwNDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMDI0OSwweDAwMDAwMjQ5LDB4MDAwMDAyNGEsMHgwMDAwMDA0OX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAxMjRhLDB4MDAwMDEyNGEsMHgwMDAwMTI1MiwweDAwMDAwMDQ5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwMTI0YSwweDAwMDA5MjkyLDB4MDAwMDAyNGF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwOTI1MiwweDAwMDA5MjkyLDB4MDAwMDkyOTIsMHgwMDAwMDI0YX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDA5MjUyLDB4MDAwMDkyOTIsMHgwMDAwYTQ5YiwweDAwMDAwMjRhfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyOTIsMHgwMDAwOTQ5MywweDAwMDBhNDliLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwOTI5MiwweDAwMDA5NDkzLDB4MDAwMGE0OWIsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI0YSwKKyAgICAweDAwMDA5NDkyLDB4MDAwMGE0OWIsMHgwMDAwYTQ5YiwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjUyLAorICAgIDB4MDAwMDk0OTIsMHgwMDAwYTQ5YiwweDAwMDBhNDliLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyOTIsCisgICAgMHgwMDAwOTQ5MiwweDAwMDBhNDliLDB4MDAwMGE0OWIsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMGE0OWIsMHgwMDAwYTQ5YiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAwYTQ5YiwweDAwMDBhNDliLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNGRiLDB4MDAwMGE0OWIsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNTIsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNDliLDB4MDAwMTI2ZGMsMHgwMDAxMjRkYiwweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDB9CisgIH0KKyB9LAorIHsgLyogdmVyc2lvbiAzICovCisgIHsgLyogdmVyc2lvbiAzLCBwYXNzZXMgMCAqLworICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDAxMjRhLDB4MDAwMDkyOTIsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDA5MjkyLDB4MDAwMDk0OTMsMHgwMDAwYTQ5YiwweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjRhLAorICAgIDB4MDAwMDk0OTIsMHgwMDAwYTQ5YiwweDAwMDBhNDliLDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyOTIsCisgICAgMHgwMDAwOTQ5MiwweDAwMDEyNGRiLDB4MDAwMTI2ZGMsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI0ZGIsMHgwMDAxMjZkYywweDAwMDEyNmRjfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMTM2ZTR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNmRjLDB4MDAwMTM2ZTQsMHgwMDAxYjcyNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTQ5MywKKyAgICAweDAwMDEyNDliLDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDFiNzI0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0OWIsMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMWI3MjR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjQ5YiwweDAwMDEzNmU0LDB4MDAwMWI3MjUsMHgwMDAxYjcyNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNGRiLDB4MDAwMTM2ZTQsMHgwMDAxYjcyNSwweDAwMDFiOTI1fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI5MiwweDAwMDBhNDliLAorICAgIDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDFiOTJkLDB4MDAwMWI5MjV9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjkyLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjZkYywweDAwMDFiNzI0LDB4MDAwMWI5MmQsMHgwMDAxYzkyZH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDk0OTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMWI3MjQsMHgwMDAxYzk2ZSwweDAwMDFjOTJkfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwYTQ5MiwweDAwMDEyNmRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxYjkyNSwweDAwMDI1YmI2LDB4MDAwMjRiNzd9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0KKyAgfSwKKyAgeyAvKiB2ZXJzaW9uIDMsIHBhc3NlcyAxICovCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAxMjRhLDB4MDAwMDEyNGEsMHgwMDAwMTI1MiwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyNTIsMHgwMDAwOTI5MiwweDAwMDA5MjkyLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyNGEsCisgICAgMHgwMDAwOTQ5MiwweDAwMDA5NDkzLDB4MDAwMGE0OWIsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI1MiwKKyAgICAweDAwMDA5NDkyLDB4MDAwMGE0OWIsMHgwMDAwYTQ5YiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjkyLAorICAgIDB4MDAwMDk0OTIsMHgwMDAwYTQ5YiwweDAwMDBhNDliLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDBhNDliLDB4MDAwMTI2ZGMsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMGE0OWIsMHgwMDAxMjZkYywweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAwYTQ5YiwweDAwMDEyNmRjLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNGRiLDB4MDAwMTI2ZGMsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI0ZGIsMHgwMDAxMjZkYywweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjRkYiwweDAwMDEyNmRjLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjQ5YiwweDAwMDEyNmRjLDB4MDAwMTI2ZGMsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNGRiLDB4MDAwMTM2ZTQsMHgwMDAxMjZkYywweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDBhNDliLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxMzZlNCwweDAwMDEyNmRjLDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxYjcyNCwweDAwMDFiNzI0LDB4MDAwMTM2ZTQsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfQorICB9CisgfSwKKyB7IC8qIHZlcnNpb24gNCAqLworICB7IC8qIHZlcnNpb24gNCwgcGFzc2VzIDAgKi8KKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDA0OSwweDAwMDAwMDQ5LAorICAgIDB4MDAwMDAwNDksMHgwMDAwMDA0OSwweDAwMDAwMDQ5LDB4MDAwMDAwNDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAwNDksCisgICAgMHgwMDAwMDI0OSwweDAwMDAwMjQ5LDB4MDAwMDAyNGEsMHgwMDAwMDA0OX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAxMjRhLDB4MDAwMDkyNTIsMHgwMDAwMTI1MiwweDAwMDAwMjRhfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyNTIsMHgwMDAwOTI5MiwweDAwMDA5NDkzLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyNGEsCisgICAgMHgwMDAwOTI5MiwweDAwMDA5NDkzLDB4MDAwMDk0OTMsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI5MiwKKyAgICAweDAwMDA5NDkyLDB4MDAwMGE0OWIsMHgwMDAwYTQ5YiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjRkYiwweDAwMDEyNGRiLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNGRiLDB4MDAwMTI2ZGMsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI0ZGIsMHgwMDAxMjZkYywweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDA5NDkzLAorICAgIDB4MDAwMTI0OWIsMHgwMDAxMjZkYywweDAwMDEyNmRjLDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjUyLDB4MDAwMDk0OTMsCisgICAgMHgwMDAxMjRkYiwweDAwMDEzNmU0LDB4MDAwMTM2ZTQsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNTIsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNGRiLDB4MDAwMTM2ZTQsMHgwMDAxMzZlNCwweDAwMDEyNmRjfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI5MiwweDAwMDBhNDliLAorICAgIDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDEzNmU0LDB4MDAwMTM2ZTR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5NDkyLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjZkYywweDAwMDFiNzI0LDB4MDAwMWI3MjUsMHgwMDAxYjcyNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE0OTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMWI5MjUsMHgwMDAxYjkyZCwweDAwMDFiOTI1fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDB9CisgIH0sCisgIHsgLyogdmVyc2lvbiA0LCBwYXNzZXMgMSAqLworICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAwNDksCisgICAgMHgwMDAwMDAwOSwweDAwMDAwMDA5LDB4MDAwMDAwMDksMHgwMDAwMDAwOX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAwMDQ5LDB4MDAwMDAwNDksMHgwMDAwMDAwOSwweDAwMDAwMDA5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwMDI0OSwweDAwMDAwMDQ5LDB4MDAwMDAwNDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDAxMjRhLDB4MDAwMDAwNDksMHgwMDAwMDA0OX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDA5MjUyLDB4MDAwMDEyNGEsMHgwMDAwMDI0YSwweDAwMDAwMjRhfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjRhLAorICAgIDB4MDAwMDkyNTIsMHgwMDAwMTI0YSwweDAwMDAwMjRhLDB4MDAwMDAyNGF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyOTIsCisgICAgMHgwMDAwOTQ5MiwweDAwMDA5MjUyLDB4MDAwMDEyNTIsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMDkyOTIsMHgwMDAwOTI5MiwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAwOTI5MiwweDAwMDA5MjkyLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDA5NDkzLDB4MDAwMDk0OTMsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDBhNDkzLDB4MDAwMGE0OWIsMHgwMDAwOTQ5MywweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMGE0OTMsMHgwMDAwYTQ5YiwweDAwMDBhNDliLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjQ5YiwweDAwMDEyNGRiLDB4MDAwMGE0OWIsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMTI2ZGMsMHgwMDAxMjRkYiwweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI1MiwweDAwMDEyNGRiLAorICAgIDB4MDAwMWI3MjQsMHgwMDAxMzZlNCwweDAwMDEyNmRjLDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0KKyAgfQorIH0sCisgeyAvKiB2ZXJzaW9uIDUgKi8KKyAgeyAvKiB2ZXJzaW9uIDUsIHBhc3NlcyAwICovCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAwMjQ5LDB4MDAwMDAyNDksMHgwMDAwMTI1MiwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyNTIsMHgwMDAwOTI5MiwweDAwMDA5MjkyLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyNGEsCisgICAgMHgwMDAwOTQ5MiwweDAwMDBhNDliLDB4MDAwMGE0OWIsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMGE0OWIsMHgwMDAxMjRkYiwweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjRkYiwweDAwMDEyNmRjLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNmRjLDB4MDAwMTI2ZGMsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNDliLDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDEzNmU0LDB4MDAwMTI2ZGN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjkyLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMTM2ZTQsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyOTIsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMWI3MjQsMHgwMDAxYjcyNSwweDAwMDEzNmU0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI5MiwweDAwMDBhNDliLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxYjcyNCwweDAwMDFiOTJkLDB4MDAwMWI3MjR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5NDkyLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMzZlNCwweDAwMDFiNzI0LDB4MDAwMWI5MmQsMHgwMDAxYjcyNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDk0OTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMWI5MjUsMHgwMDAxYzk2ZSwweDAwMDFiOTI1fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDEyNGRiLAorICAgIDB4MDAwMWI3MjQsMHgwMDAxYjkyNSwweDAwMDFjOTZlLDB4MDAwMWM5MmR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTI2ZGIsCisgICAgMHgwMDAxYzkyNCwweDAwMDI0OTZkLDB4MDAwMjViYjYsMHgwMDAyNGI3N30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfQorICB9LAorICB7IC8qIHZlcnNpb24gNSwgcGFzc2VzIDEgKi8KKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDAyNDksMHgwMDAwMDI0OSwweDAwMDAwMjRhLDB4MDAwMDAyNGF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDAxMjRhLDB4MDAwMDAyNGEsMHgwMDAwMDI0YX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI0YSwKKyAgICAweDAwMDA5MjUyLDB4MDAwMDkyNTIsMHgwMDAwMDI0YSwweDAwMDAwMjRhfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjkyLAorICAgIDB4MDAwMDk0OTIsMHgwMDAwYTQ5YiwweDAwMDAxMjUyLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDBhNDliLDB4MDAwMDEyNTIsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMGE0OWIsMHgwMDAwOTI5MiwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMGE0OTMsMHgwMDAwYTQ5YiwweDAwMDA5MjkyLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAwYTQ5MywweDAwMDBhNDliLDB4MDAwMDk0OTMsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNDliLDB4MDAwMTI0ZGIsMHgwMDAwOTQ5MywweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0OWIsMHgwMDAxMjRkYiwweDAwMDA5NDkzLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjRkYiwweDAwMDEyNGRiLDB4MDAwMGE0OWIsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMTI2ZGMsMHgwMDAwYTQ5YiwweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDEyNGRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxMjZkYywweDAwMDEyNGRiLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjkyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMzZlNCwweDAwMDEyNmRjLDB4MDAwMTI0ZGIsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDk0OTIsMHgwMDAxMjZkYiwKKyAgICAweDAwMDFiNzI0LDB4MDAwMTM2ZTQsMHgwMDAxMjZkYywweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDB9CisgIH0KKyB9LAorIHsgLyogdmVyc2lvbiA2ICovCisgIHsgLyogdmVyc2lvbiA2LCBwYXNzZXMgMCAqLworICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwOTI1MiwweDAwMDA5MjkyLDB4MDAwMDk0OTMsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI5MiwKKyAgICAweDAwMDBhNDkzLDB4MDAwMGE0OWIsMHgwMDAwYTQ5YiwweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjRkYiwweDAwMDEyNGRiLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNmRjLDB4MDAwMTI2ZGMsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNDliLDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDEzNmU0LDB4MDAwMTI2ZGN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjkyLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjZkYywweDAwMDFiNzI0LDB4MDAwMWI3MjUsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyOTIsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMWI3MjQsMHgwMDAxYjkyZCwweDAwMDEzNmU0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDBhNDliLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxYjcyNCwweDAwMDFiOTJkLDB4MDAwMWI3MjR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5NDkyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMzZlNCwweDAwMDFiNzI0LDB4MDAwMWI5MmQsMHgwMDAxYjcyNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDk0OTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMWI5MjUsMHgwMDAxYjkyZCwweDAwMDFiOTI1fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDEyNGRiLAorICAgIDB4MDAwMWI3MjQsMHgwMDAxYjkyNSwweDAwMDFjOTZlLDB4MDAwMWM5MmR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxYjcyNCwweDAwMDFjOTJkLDB4MDAwMWM5NmUsMHgwMDAxYzkyZH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE0OTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDFiNzI0LDB4MDAwMWM5MmQsMHgwMDAyNGI3NiwweDAwMDI0OTZlfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAxMjQ5MiwweDAwMDEyNmRiLAorICAgIDB4MDAwMWM5MjQsMHgwMDAyNGI2ZCwweDAwMDJkZGI2LDB4MDAwMjViYmZ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0KKyAgfSwKKyAgeyAvKiB2ZXJzaW9uIDYsIHBhc3NlcyAxICovCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDAxMjRhLDB4MDAwMDEyNGEsMHgwMDAwMTI1MiwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjkyLAorICAgIDB4MDAwMDk0OTIsMHgwMDAwOTI1MiwweDAwMDAxMjUyLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDA5MjkyLDB4MDAwMDEyNTIsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDBhNDkzLDB4MDAwMGE0OWIsMHgwMDAwOTI5MiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMGE0OTMsMHgwMDAwYTQ5YiwweDAwMDA5MjkyLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjQ5YiwweDAwMDBhNDliLDB4MDAwMDk0OTMsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNGRiLDB4MDAwMTI0ZGIsMHgwMDAwOTQ5MywweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0ZGIsMHgwMDAxMjRkYiwweDAwMDBhNDliLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMjZkYywweDAwMDEyNGRiLDB4MDAwMGE0OWIsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMTI2ZGMsMHgwMDAwYTQ5YiwweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDEyNGRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxMjZkYywweDAwMDEyNGRiLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5NDkyLDB4MDAwMTI2ZGIsCisgICAgMHgwMDAxMzZlNCwweDAwMDEyNmRjLDB4MDAwMTI0ZGIsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDk0OTIsMHgwMDAxMjZkYiwKKyAgICAweDAwMDFiNzI0LDB4MDAwMTM2ZTQsMHgwMDAxMjZkYywweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDEyNmRiLAorICAgIDB4MDAwMWI3MjQsMHgwMDAxMzZlNCwweDAwMDEyNmRjLDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTM2ZGIsCisgICAgMHgwMDAxYzkyNCwweDAwMDFiNzI0LDB4MDAwMTM2ZTQsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfQorICB9CisgfSwKKyB7IC8qIHZlcnNpb24gNyAqLworICB7IC8qIHZlcnNpb24gNywgcGFzc2VzIDAgKi8KKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyNTIsMHgwMDAwOTI5MiwweDAwMDA5NDkzLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNGRiLDB4MDAwMTI2ZGMsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNDliLDB4MDAwMTI2ZGMsMHgwMDAxMjZkYywweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0OWIsMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMWI3MjUsMHgwMDAxMjRkYn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyOTIsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMWI3MjQsMHgwMDAxYjcyNSwweDAwMDEyNmRjfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI5MiwweDAwMDEyNGRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxYjcyNCwweDAwMDFiNzI1LDB4MDAwMTI2ZGN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5NDkyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMzZlNCwweDAwMDFiNzI0LDB4MDAwMWM5NmUsMHgwMDAxMzZlNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDk0OTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMWM5MmQsMHgwMDAxYzk2ZSwweDAwMDFiNzI0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwYTQ5MiwweDAwMDEyNGRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxYzkyZCwweDAwMDFjOTZlLDB4MDAwMWI3MjR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxYjcyNCwweDAwMDFjOTJkLDB4MDAwMWM5NmUsMHgwMDAxYjkyNX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE0OTIsMHgwMDAxMjZkYiwKKyAgICAweDAwMDFiNzI0LDB4MDAwMWM5MmQsMHgwMDAyNGI3NiwweDAwMDFjOTJkfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwYTQ5MiwweDAwMDEyNmRiLAorICAgIDB4MDAwMWI5MjQsMHgwMDAxYzkyZCwweDAwMDI0Yjc2LDB4MDAwMWM5MmR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTI2ZGIsCisgICAgMHgwMDAxYjkyNCwweDAwMDFjOTJkLDB4MDAwMjRiNzYsMHgwMDAyNDk2ZX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMTI0OTIsMHgwMDAxMzZkYiwKKyAgICAweDAwMDI0OTI0LDB4MDAwMjRiNmQsMHgwMDAyZGRiNiwweDAwMDI1YmJmfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDB9CisgIH0sCisgIHsgLyogdmVyc2lvbiA3LCBwYXNzZXMgMSAqLworICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDAxMjRhLDB4MDAwMDEyNTIsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTQ5MywKKyAgICAweDAwMDA5NDkyLDB4MDAwMDkyOTIsMHgwMDAwMTI1MiwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMGE0OTMsMHgwMDAwYTQ5YiwweDAwMDAxMjUyLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAwYTQ5MywweDAwMDBhNDliLDB4MDAwMDkyOTIsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDBhNDkzLDB4MDAwMGE0OWIsMHgwMDAwOTI5MiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI2ZGMsMHgwMDAwYTQ5YiwweDAwMDA5NDkzLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMjZkYywweDAwMDEyNGRiLDB4MDAwMDk0OTMsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMTI0ZGIsMHgwMDAwYTQ5YiwweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDEzNmRiLAorICAgIDB4MDAwMWI3MjQsMHgwMDAxMjRkYiwweDAwMDBhNDliLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMTM2ZGIsCisgICAgMHgwMDAxYjcyNCwweDAwMDEyNmRjLDB4MDAwMGE0OWIsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyOTIsMHgwMDAxMzZkYiwKKyAgICAweDAwMDFiNzI0LDB4MDAwMTI2ZGMsMHgwMDAxMjRkYiwweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDEzNmRiLAorICAgIDB4MDAwMWI3MjQsMHgwMDAxMjZkYywweDAwMDEyNGRiLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTM2ZGIsCisgICAgMHgwMDAxYjcyNCwweDAwMDEzNmU0LDB4MDAwMTI2ZGMsMHgwMDAxMjRkYn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE0OTIsMHgwMDAxMzZkYiwKKyAgICAweDAwMDFiNzI0LDB4MDAwMTM2ZTQsMHgwMDAxMjZkYywweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAxMjQ5MiwweDAwMDFiNmRiLAorICAgIDB4MDAwMWM5MjQsMHgwMDAxYjcyNCwweDAwMDEzNmU0LDB4MDAwMTI2ZGN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0KKyAgfQorIH0KK307CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1raWFyYS5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLWtpYXJhLmgKaW5kZXggMTI5MjlhYi4uMGJkYjIyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLWtpYXJhLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLWtpYXJhLmgKQEAgLTEsNSArMSw1IEBACiAvKiBMaW51eCBkcml2ZXIgZm9yIFBoaWxpcHMgd2ViY2FtCi0gICAoQykgMjAwNCAgICAgIEx1YyBTYWlsbGFyZCAobHVjQHNhaWxsYXJkLm9yZykKKyAgIChDKSAyMDA0LTIwMDYgTHVjIFNhaWxsYXJkIChsdWNAc2FpbGxhcmQub3JnKQogCiAgICBOT1RFOiB0aGlzIHZlcnNpb24gb2YgcHdjIGlzIGFuIHVub2ZmaWNpYWwgKG1vZGlmaWVkKSByZWxlYXNlIG9mIHB3YyAmIHBjd3gKICAgIGRyaXZlciBhbmQgdGh1cyBtYXkgaGF2ZSBidWdzIHRoYXQgYXJlIG5vdCBwcmVzZW50IGluIHRoZSBvcmlnaW5hbCB2ZXJzaW9uLgpAQCAtMjcsNyArMjcsNyBAQAogI2lmbmRlZiBQV0NfS0lBUkFfSAogI2RlZmluZSBQV0NfS0lBUkFfSAogCi0jaW5jbHVkZSAicHdjLWlvY3RsLmgiCisjaW5jbHVkZSA8bWVkaWEvcHdjLWlvY3RsLmg+CiAKIHN0cnVjdCBLaWFyYV90YWJsZV9lbnRyeQogewpAQCAtMzcsOCArMzcsOCBAQAogCXVuc2lnbmVkIGNoYXIgbW9kZVsxMl07CQkvKiBwcmVjb21wdXRlZCBtb2RlIHNldHRpbmdzIGZvciBjYW0gKi8KIH07CiAKLWNvbnN0IGV4dGVybiBzdHJ1Y3QgS2lhcmFfdGFibGVfZW50cnkgS2lhcmFfdGFibGVbUFNaX01BWF1bNl1bNF07Ci1jb25zdCBleHRlcm4gdW5zaWduZWQgaW50IEtpYXJhUm9tVGFibGVbOF1bMl1bMTZdWzhdOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBLaWFyYV90YWJsZV9lbnRyeSBLaWFyYV90YWJsZVtQU1pfTUFYXVs2XVs0XTsKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBpbnQgS2lhcmFSb21UYWJsZVs4XVsyXVsxNl1bOF07CiAKICNlbmRpZgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtbWlzYy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLW1pc2MuYwppbmRleCA1OGZlNzk3Li41ODljNjg3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtbWlzYy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1taXNjLmMKQEAgLTEsNyArMSw3IEBACiAvKiBMaW51eCBkcml2ZXIgZm9yIFBoaWxpcHMgd2ViY2FtCiAgICBWYXJpb3VzIG1pc2NlbGxhbmVvdXMgZnVuY3Rpb25zIGFuZCB0YWJsZXMuCiAgICAoQykgMTk5OS0yMDAzIE5lbW9zb2Z0IFVudi4KLSAgIChDKSAyMDA0ICAgICAgTHVjIFNhaWxsYXJkIChsdWNAc2FpbGxhcmQub3JnKQorICAgKEMpIDIwMDQtMjAwNiBMdWMgU2FpbGxhcmQgKGx1Y0BzYWlsbGFyZC5vcmcpCiAKICAgIE5PVEU6IHRoaXMgdmVyc2lvbiBvZiBwd2MgaXMgYW4gdW5vZmZpY2lhbCAobW9kaWZpZWQpIHJlbGVhc2Ugb2YgcHdjICYgcGN3eAogICAgZHJpdmVyIGFuZCB0aHVzIG1heSBoYXZlIGJ1Z3MgdGhhdCBhcmUgbm90IHByZXNlbnQgaW4gdGhlIG9yaWdpbmFsIHZlcnNpb24uCkBAIC0yNCwxOCArMjQsMTcgQEAKICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICovCiAKLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKICNpbmNsdWRlICJwd2MuaCIKIAotc3RydWN0IHB3Y19jb29yZCBwd2NfaW1hZ2Vfc2l6ZXNbUFNaX01BWF0gPQorY29uc3Qgc3RydWN0IHB3Y19jb29yZCBwd2NfaW1hZ2Vfc2l6ZXNbUFNaX01BWF0gPQogewotCXsgMTI4LCAgOTYsIDAgfSwKLQl7IDE2MCwgMTIwLCAwIH0sCi0JeyAxNzYsIDE0NCwgMCB9LAotCXsgMzIwLCAyNDAsIDAgfSwKLQl7IDM1MiwgMjg4LCAwIH0sCi0JeyA2NDAsIDQ4MCwgMCB9LAorCXsgMTI4LCAgOTYsIDAgfSwgLyogc3FjaWYgKi8KKwl7IDE2MCwgMTIwLCAwIH0sIC8qIHFzaWYgKi8KKwl7IDE3NiwgMTQ0LCAwIH0sIC8qIHFjaWYgKi8KKwl7IDMyMCwgMjQwLCAwIH0sIC8qIHNpZiAqLworCXsgMzUyLCAyODgsIDAgfSwgLyogY2lmICovCisJeyA2NDAsIDQ4MCwgMCB9LCAvKiB2Z2EgKi8KIH07CiAKIC8qIHgseSAtPiBQU1pfICovCkBAIC01Miw3ICs1MSw3IEBACiAJewogCQlpZiAod2lkdGggPiBwZGV2LT5hYnNfbWF4LnggfHwgaGVpZ2h0ID4gcGRldi0+YWJzX21heC55KQogCQl7Ci0JCQlEZWJ1ZygiVklERU9fUEFMRVRURV9SQVc6IGdvaW5nIGJleW9uZCBhYnNfbWF4LlxuIik7CisJCQlQV0NfREVCVUdfU0laRSgiVklERU9fUEFMRVRURV9SQVc6IGdvaW5nIGJleW9uZCBhYnNfbWF4LlxuIik7CiAJCQlyZXR1cm4gLTE7CiAJCX0KIAl9CkBAIC02MCw3ICs1OSw3IEBACiAJewogCQlpZiAod2lkdGggPiBwZGV2LT52aWV3X21heC54IHx8IGhlaWdodCA+IHBkZXYtPnZpZXdfbWF4LnkpCiAJCXsKLQkJCURlYnVnKCJWSURFT19QQUxFVFRFXyBub3QgUkFXOiBnb2luZyBiZXlvbmQgdmlld19tYXguXG4iKTsKKwkJCVBXQ19ERUJVR19TSVpFKCJWSURFT19QQUxFVFRFX25vdCBSQVc6IGdvaW5nIGJleW9uZCB2aWV3X21heC5cbiIpOwogCQkJcmV0dXJuIC0xOwogCQl9CiAJfQpAQCAtODEsOSArODAsOCBAQAogLyogaW5pdGlhbGl6ZSB2YXJpYWJsZXMgZGVwZW5kaW5nIG9uIHR5cGUgYW5kIGRlY29tcHJlc3NvciovCiB2b2lkIHB3Y19jb25zdHJ1Y3Qoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpCiB7Ci0Jc3dpdGNoKHBkZXYtPnR5cGUpIHsKLQljYXNlIDY0NToKLQljYXNlIDY0NjoKKwlpZiAoREVWSUNFX1VTRV9DT0RFQzEocGRldi0+dHlwZSkpIHsKKwogCQlwZGV2LT52aWV3X21pbi54ID0gMTI4OwogCQlwZGV2LT52aWV3X21pbi55ID0gIDk2OwogCQlwZGV2LT52aWV3X21heC54ID0gMzUyOwpAQCAtOTUsMTAgKzkzLDIzIEBACiAJCXBkZXYtPnZlbmRwb2ludCA9IDQ7CiAJCXBkZXYtPmZyYW1lX2hlYWRlcl9zaXplID0gMDsKIAkJcGRldi0+ZnJhbWVfdHJhaWxlcl9zaXplID0gMDsKLQkJYnJlYWs7Ci0JY2FzZSA2NzU6Ci0JY2FzZSA2ODA6Ci0JY2FzZSA2OTA6CisKKwl9IGVsc2UgaWYgKERFVklDRV9VU0VfQ09ERUMzKHBkZXYtPnR5cGUpKSB7CisKKwkJcGRldi0+dmlld19taW4ueCA9IDE2MDsKKwkJcGRldi0+dmlld19taW4ueSA9IDEyMDsKKwkJcGRldi0+dmlld19tYXgueCA9IDY0MDsKKwkJcGRldi0+dmlld19tYXgueSA9IDQ4MDsKKwkJcGRldi0+aW1hZ2VfbWFzayA9IDEgPDwgUFNaX1FTSUYgfCAxIDw8IFBTWl9TSUYgfCAxIDw8IFBTWl9WR0E7CisJCXBkZXYtPmFic19tYXgueCA9IDY0MDsKKwkJcGRldi0+YWJzX21heC55ID0gNDgwOworCQlwZGV2LT52Y2ludGVyZmFjZSA9IDM7CisJCXBkZXYtPnZlbmRwb2ludCA9IDU7CisJCXBkZXYtPmZyYW1lX2hlYWRlcl9zaXplID0gVE9VQ0FNX0hFQURFUl9TSVpFOworCQlwZGV2LT5mcmFtZV90cmFpbGVyX3NpemUgPSBUT1VDQU1fVFJBSUxFUl9TSVpFOworCisJfSBlbHNlIC8qIGlmIChERVZJQ0VfVVNFX0NPREVDMihwZGV2LT50eXBlKSkgKi8geworCiAJCXBkZXYtPnZpZXdfbWluLnggPSAxMjg7CiAJCXBkZXYtPnZpZXdfbWluLnkgPSAgOTY7CiAJCS8qIEFudGhpbGwgYnVnICMzODogUFdDIGFsd2F5cyByZXBvcnRzIG1heCBzaXplLCBldmVuIHdpdGhvdXQgUFdDWCAqLwpAQCAtMTExLDMwICsxMjIsMTIgQEAKIAkJcGRldi0+dmVuZHBvaW50ID0gNDsKIAkJcGRldi0+ZnJhbWVfaGVhZGVyX3NpemUgPSAwOwogCQlwZGV2LT5mcmFtZV90cmFpbGVyX3NpemUgPSAwOwotCQlicmVhazsKLQljYXNlIDcyMDoKLQljYXNlIDczMDoKLQljYXNlIDc0MDoKLQljYXNlIDc1MDoKLQkJcGRldi0+dmlld19taW4ueCA9IDE2MDsKLQkJcGRldi0+dmlld19taW4ueSA9IDEyMDsKLQkJcGRldi0+dmlld19tYXgueCA9IDY0MDsKLQkJcGRldi0+dmlld19tYXgueSA9IDQ4MDsKLQkJcGRldi0+aW1hZ2VfbWFzayA9IDEgPDwgUFNaX1FTSUYgfCAxIDw8IFBTWl9TSUYgfCAxIDw8IFBTWl9WR0E7Ci0JCXBkZXYtPmFic19tYXgueCA9IDY0MDsKLQkJcGRldi0+YWJzX21heC55ID0gNDgwOwotCQlwZGV2LT52Y2ludGVyZmFjZSA9IDM7Ci0JCXBkZXYtPnZlbmRwb2ludCA9IDU7Ci0JCXBkZXYtPmZyYW1lX2hlYWRlcl9zaXplID0gVE9VQ0FNX0hFQURFUl9TSVpFOwotCQlwZGV2LT5mcmFtZV90cmFpbGVyX3NpemUgPSBUT1VDQU1fVFJBSUxFUl9TSVpFOwotCQlicmVhazsKIAl9Ci0JRGVidWcoInR5cGUgPSAlZFxuIixwZGV2LT50eXBlKTsKIAlwZGV2LT52cGFsZXR0ZSA9IFZJREVPX1BBTEVUVEVfWVVWNDIwUDsgLyogZGVmYXVsdCAqLwogCXBkZXYtPnZpZXdfbWluLnNpemUgPSBwZGV2LT52aWV3X21pbi54ICogcGRldi0+dmlld19taW4ueTsKIAlwZGV2LT52aWV3X21heC5zaXplID0gcGRldi0+dmlld19tYXgueCAqIHBkZXYtPnZpZXdfbWF4Lnk7CiAJLyogbGVuZ3RoIG9mIGltYWdlLCBpbiBZVVYgZm9ybWF0OyBhbHdheXMgYWxsb2NhdGUgZW5vdWdoIG1lbW9yeS4gKi8KLQlwZGV2LT5sZW5fcGVyX2ltYWdlID0gKHBkZXYtPmFic19tYXgueCAqIHBkZXYtPmFic19tYXgueSAqIDMpIC8gMjsKKwlwZGV2LT5sZW5fcGVyX2ltYWdlID0gUEFHRV9BTElHTigocGRldi0+YWJzX21heC54ICogcGRldi0+YWJzX21heC55ICogMykgLyAyKTsKIH0KIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtdGltb24uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy10aW1vbi5jCmluZGV4IDE3NTI1MGQuLmJlNjViZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy10aW1vbi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy10aW1vbi5jCkBAIC0xLDUgKzEsNSBAQAogLyogTGludXggZHJpdmVyIGZvciBQaGlsaXBzIHdlYmNhbQotICAgKEMpIDIwMDQgICAgICBMdWMgU2FpbGxhcmQgKGx1Y0BzYWlsbGFyZC5vcmcpCisgICAoQykgMjAwNC0yMDA2IEx1YyBTYWlsbGFyZCAobHVjQHNhaWxsYXJkLm9yZykKIAogICAgTk9URTogdGhpcyB2ZXJzaW9uIG9mIHB3YyBpcyBhbiB1bm9mZmljaWFsIChtb2RpZmllZCkgcmVsZWFzZSBvZiBwd2MgJiBwY3d4CiAgICBkcml2ZXIgYW5kIHRodXMgbWF5IGhhdmUgYnVncyB0aGF0IGFyZSBub3QgcHJlc2VudCBpbiB0aGUgb3JpZ2luYWwgdmVyc2lvbi4KQEAgLTMxNCwzICszMTQsMTEzMyBAQAogICAgfSwKIH07CiAKKy8qCisgKiAxNiB2ZXJzaW9uczoKKyAqICAgMiB0YWJsZXMgIChvbmUgZm9yIFksIGFuZCBvbmUgZm9yIFUmVikKKyAqICAgMTYgbGV2ZWxzIG9mIGRldGFpbHMgcGVyIHRhYmxlcworICogICA4IGJsb2NzCisgKi8KKworY29uc3QgdW5zaWduZWQgaW50IFRpbW9uUm9tVGFibGUgWzE2XVsyXVsxNl1bOF0gPQoreworIHsgLyogdmVyc2lvbiAwICovCisgIHsgLyogdmVyc2lvbiAwLCBwYXNzZXMgMCAqLworICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDEsMHgwMDAwMDAwMSwKKyAgICAweDAwMDAwMDAxLDB4MDAwMDAwMDEsMHgwMDAwMDAwMSwweDAwMDAwMDAxfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMSwweDAwMDAwMDAxLAorICAgIDB4MDAwMDAwMDEsMHgwMDAwMDAwOSwweDAwMDAwMDA5LDB4MDAwMDAwMDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDA5LDB4MDAwMDAwMDEsCisgICAgMHgwMDAwMDAwOSwweDAwMDAwMDA5LDB4MDAwMDAwMDksMHgwMDAwMDAwOX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDksMHgwMDAwMDAwOSwKKyAgICAweDAwMDAwMDA5LDB4MDAwMDAwMDksMHgwMDAwMDA0OSwweDAwMDAwMDA5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwOSwweDAwMDAwMDA5LAorICAgIDB4MDAwMDAwMDksMHgwMDAwMDA0OSwweDAwMDAwMDQ5LDB4MDAwMDAwNDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDA5LDB4MDAwMDAwMDksCisgICAgMHgwMDAwMDA0OSwweDAwMDAwMDQ5LDB4MDAwMDAwNDksMHgwMDAwMDA0OX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDksMHgwMDAwMDA0OSwKKyAgICAweDAwMDAwMDQ5LDB4MDAwMDAwNDksMHgwMDAwMDA0OSwweDAwMDAwMDQ5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDA0OSwweDAwMDAwMDQ5LAorICAgIDB4MDAwMDAwNDksMHgwMDAwMDA0OSwweDAwMDAwMjRhLDB4MDAwMDAyNGF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDQ5LDB4MDAwMDAwNDksCisgICAgMHgwMDAwMDA0OSwweDAwMDAwMjQ5LDB4MDAwMDAyNGEsMHgwMDAwMDI0YX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwNDksMHgwMDAwMDA0OSwKKyAgICAweDAwMDAwMjQ5LDB4MDAwMDAyNDksMHgwMDAwMDI0YSwweDAwMDAwMjRhfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDA0OSwweDAwMDAwMDQ5LAorICAgIDB4MDAwMDAyNDksMHgwMDAwMDI0OSwweDAwMDAxMjUyLDB4MDAwMDAyNGF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDQ5LDB4MDAwMDAwNDksCisgICAgMHgwMDAwMDI0OSwweDAwMDAxMjRhLDB4MDAwMDEyNTIsMHgwMDAwMDI0YX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAwMjQ5LDB4MDAwMDEyNGEsMHgwMDAwMTI1MiwweDAwMDAwMjRhfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwOTI1MiwweDAwMDA5MjkyLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0KKyAgfSwKKyAgeyAvKiB2ZXJzaW9uIDAsIHBhc3NlcyAxICovCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMSwweDAwMDAwMDAxLAorICAgIDB4MDAwMDAwMDEsMHgwMDAwMDAwMSwweDAwMDAwMDAwLDB4MDAwMDAwMDB9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDA5LDB4MDAwMDAwMDEsCisgICAgMHgwMDAwMDAwMSwweDAwMDAwMDA5LDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDksMHgwMDAwMDAwOSwKKyAgICAweDAwMDAwMDA5LDB4MDAwMDAwMDksMHgwMDAwMDAwMCwweDAwMDAwMDAwfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwOSwweDAwMDAwMDA5LAorICAgIDB4MDAwMDAwMDksMHgwMDAwMDAwOSwweDAwMDAwMDAxLDB4MDAwMDAwMDB9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDQ5LDB4MDAwMDAwMDksCisgICAgMHgwMDAwMDAwOSwweDAwMDAwMDQ5LDB4MDAwMDAwMDEsMHgwMDAwMDAwMX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwNDksMHgwMDAwMDAwOSwKKyAgICAweDAwMDAwMDA5LDB4MDAwMDAwNDksMHgwMDAwMDAwMSwweDAwMDAwMDAxfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDA0OSwweDAwMDAwMDQ5LAorICAgIDB4MDAwMDAwNDksMHgwMDAwMDA0OSwweDAwMDAwMDA5LDB4MDAwMDAwMDF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDQ5LDB4MDAwMDAwNDksCisgICAgMHgwMDAwMDA0OSwweDAwMDAwMDQ5LDB4MDAwMDAwMDksMHgwMDAwMDAwMX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwNDksMHgwMDAwMDA0OSwKKyAgICAweDAwMDAwMDQ5LDB4MDAwMDAwNDksMHgwMDAwMDAwOSwweDAwMDAwMDAxfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDA0OSwweDAwMDAwMDQ5LAorICAgIDB4MDAwMDAwNDksMHgwMDAwMDA0OSwweDAwMDAwMDA5LDB4MDAwMDAwMDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDQ5LDB4MDAwMDAwNDksCisgICAgMHgwMDAwMDA0OSwweDAwMDAwMjQ5LDB4MDAwMDAwNDksMHgwMDAwMDAwOX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwNDksMHgwMDAwMDA0OSwKKyAgICAweDAwMDAwMDQ5LDB4MDAwMDAyNDksMHgwMDAwMDA0OSwweDAwMDAwMDA5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAwMDQ5LAorICAgIDB4MDAwMDAyNDksMHgwMDAwMDI0OSwweDAwMDAwMDQ5LDB4MDAwMDAwMDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDAxMjRhLDB4MDAwMDAyNGEsMHgwMDAwMDA0OX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfQorICB9CisgfSwKKyB7IC8qIHZlcnNpb24gMSAqLworICB7IC8qIHZlcnNpb24gMSwgcGFzc2VzIDAgKi8KKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAxLDB4MDAwMDAwMDEsCisgICAgMHgwMDAwMDAwMSwweDAwMDAwMDA5LDB4MDAwMDAwMDksMHgwMDAwMDAwOX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDksMHgwMDAwMDAwOSwKKyAgICAweDAwMDAwMDA5LDB4MDAwMDAwMDksMHgwMDAwMDAwOSwweDAwMDAwMDA5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwOSwweDAwMDAwMDA5LAorICAgIDB4MDAwMDAwMDksMHgwMDAwMDA0OSwweDAwMDAwMDQ5LDB4MDAwMDAwNDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDA5LDB4MDAwMDAwNDksCisgICAgMHgwMDAwMDA0OSwweDAwMDAwMDQ5LDB4MDAwMDAwNDksMHgwMDAwMDA0OX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwNDksMHgwMDAwMDA0OSwKKyAgICAweDAwMDAwMDQ5LDB4MDAwMDAyNDksMHgwMDAwMDI0YSwweDAwMDAwMjRhfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDA0OSwweDAwMDAwMDQ5LAorICAgIDB4MDAwMDAyNDksMHgwMDAwMDI0OSwweDAwMDAwMjRhLDB4MDAwMDAyNGF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMDI0OSwweDAwMDAwMjQ5LDB4MDAwMDAyNGEsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAwMjQ5LDB4MDAwMDEyNGEsMHgwMDAwMTI1MiwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDA0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwMTI0YSwweDAwMDAxMjUyLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDAxMjRhLDB4MDAwMDkyOTIsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDAxMjRhLDB4MDAwMDkyNTIsMHgwMDAwOTI5MiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyNTIsMHgwMDAwOTI1MiwweDAwMDA5MjkyLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDkyNGEsCisgICAgMHgwMDAwOTI5MiwweDAwMDA5NDkzLDB4MDAwMDk0OTMsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI1MiwKKyAgICAweDAwMDA5NDkyLDB4MDAwMGE0OWIsMHgwMDAwYTQ5YiwweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDB9CisgIH0sCisgIHsgLyogdmVyc2lvbiAxLCBwYXNzZXMgMSAqLworICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDksMHgwMDAwMDAwOSwKKyAgICAweDAwMDAwMDA5LDB4MDAwMDAwMDEsMHgwMDAwMDAwMSwweDAwMDAwMDAwfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwOSwweDAwMDAwMDA5LAorICAgIDB4MDAwMDAwMDksMHgwMDAwMDAwOSwweDAwMDAwMDAxLDB4MDAwMDAwMDB9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDQ5LDB4MDAwMDAwNDksCisgICAgMHgwMDAwMDA0OSwweDAwMDAwMDA5LDB4MDAwMDAwMDEsMHgwMDAwMDAwMH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwNDksMHgwMDAwMDA0OSwKKyAgICAweDAwMDAwMDQ5LDB4MDAwMDAwNDksMHgwMDAwMDAwMSwweDAwMDAwMDAxfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDA0OSwweDAwMDAwMDQ5LAorICAgIDB4MDAwMDAwNDksMHgwMDAwMDA0OSwweDAwMDAwMDA5LDB4MDAwMDAwMDF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAwNDksCisgICAgMHgwMDAwMDA0OSwweDAwMDAwMjQ5LDB4MDAwMDAwMDksMHgwMDAwMDAwMX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMDA0OSwKKyAgICAweDAwMDAwMjQ5LDB4MDAwMDAyNDksMHgwMDAwMDAwOSwweDAwMDAwMDA5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDAyNDksMHgwMDAwMDI0OSwweDAwMDAwMDQ5LDB4MDAwMDAwMDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMDI0OSwweDAwMDAxMjRhLDB4MDAwMDAwNDksMHgwMDAwMDAwOX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAwMjQ5LDB4MDAwMDEyNGEsMHgwMDAwMDA0OSwweDAwMDAwMDA5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDAyNDksMHgwMDAwMTI0YSwweDAwMDAwMjRhLDB4MDAwMDAwNDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDAxMjRhLDB4MDAwMDAyNGEsMHgwMDAwMDA0OX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAxMjRhLDB4MDAwMDEyNGEsMHgwMDAwMDI0YSwweDAwMDAwMDQ5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyNTIsMHgwMDAwOTI1MiwweDAwMDAxMjUyLDB4MDAwMDAyNGF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0KKyAgfQorIH0sCisgeyAvKiB2ZXJzaW9uIDIgKi8KKyAgeyAvKiB2ZXJzaW9uIDIsIHBhc3NlcyAwICovCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAxfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwOSwweDAwMDAwMDA5LAorICAgIDB4MDAwMDAwMDksMHgwMDAwMDAwOSwweDAwMDAwMDA5LDB4MDAwMDAwMDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDQ5LDB4MDAwMDAwNDksCisgICAgMHgwMDAwMDA0OSwweDAwMDAwMDQ5LDB4MDAwMDAwNDksMHgwMDAwMDA0OX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwNDksMHgwMDAwMDA0OSwKKyAgICAweDAwMDAwMDQ5LDB4MDAwMDAyNDksMHgwMDAwMDI0YSwweDAwMDAwMjRhfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDA0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDAyNDksMHgwMDAwMDI0OSwweDAwMDAwMjRhLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMDI0OSwweDAwMDAxMjRhLDB4MDAwMDEyNTIsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAxMjRhLDB4MDAwMDEyNGEsMHgwMDAwOTI5MiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwOTI1MiwweDAwMDA5MjkyLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwOTI1MiwweDAwMDA5MjkyLDB4MDAwMDkyOTIsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDA5MjUyLDB4MDAwMDkyOTIsMHgwMDAwOTQ5MywweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDA5MjRhLAorICAgIDB4MDAwMDkyNTIsMHgwMDAwOTQ5MywweDAwMDA5NDkzLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDkyNGEsCisgICAgMHgwMDAwOTI5MiwweDAwMDA5NDkzLDB4MDAwMDk0OTMsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwOTI1MiwKKyAgICAweDAwMDA5NDkyLDB4MDAwMDk0OTMsMHgwMDAwYTQ5YiwweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjkyLAorICAgIDB4MDAwMDk0OTIsMHgwMDAxMjRkYiwweDAwMDEyNGRiLDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNmRjLDB4MDAwMTI2ZGMsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfQorICB9LAorICB7IC8qIHZlcnNpb24gMiwgcGFzc2VzIDEgKi8KKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDB9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDQ5LDB4MDAwMDAwMDksCisgICAgMHgwMDAwMDA0OSwweDAwMDAwMDA5LDB4MDAwMDAwMDEsMHgwMDAwMDAwMH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwNDksMHgwMDAwMDA0OSwKKyAgICAweDAwMDAwMDQ5LDB4MDAwMDAwNDksMHgwMDAwMDA0OSwweDAwMDAwMDAwfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAwMDQ5LAorICAgIDB4MDAwMDAyNDksMHgwMDAwMDA0OSwweDAwMDAwMjRhLDB4MDAwMDAwMDF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMDI0OSwweDAwMDAwMjQ5LDB4MDAwMDAyNGEsMHgwMDAwMDAwMX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAwMjQ5LDB4MDAwMDAyNDksMHgwMDAwMDI0YSwweDAwMDAwMDAxfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDAyNDksMHgwMDAwMDI0OSwweDAwMDAwMjRhLDB4MDAwMDAwMDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDAxMjRhLDB4MDAwMDAyNGEsMHgwMDAwMDAwOX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAxMjRhLDB4MDAwMDEyNGEsMHgwMDAwMDI0YSwweDAwMDAwMDA5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwOTI1MiwweDAwMDAxMjUyLDB4MDAwMDAwNDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDA5MjkyLDB4MDAwMDEyNTIsMHgwMDAwMDA0OX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDAxMjRhLDB4MDAwMDkyOTIsMHgwMDAwMTI1MiwweDAwMDAwMDQ5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyNTIsMHgwMDAwOTI5MiwweDAwMDAxMjUyLDB4MDAwMDAyNGF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwOTI5MiwweDAwMDA5MjkyLDB4MDAwMDEyNTIsMHgwMDAwMDI0YX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTI0YSwKKyAgICAweDAwMDA5NDkyLDB4MDAwMDk0OTMsMHgwMDAwOTI5MiwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDB9CisgIH0KKyB9LAorIHsgLyogdmVyc2lvbiAzICovCisgIHsgLyogdmVyc2lvbiAzLCBwYXNzZXMgMCAqLworICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwNDksMHgwMDAwMDA0OSwKKyAgICAweDAwMDAwMDQ5LDB4MDAwMDAwNDksMHgwMDAwMDA0OSwweDAwMDAwMDQ5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDA0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDAyNDksMHgwMDAwMDI0OSwweDAwMDAxMjUyLDB4MDAwMDAyNGF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMDI0OSwweDAwMDAxMjRhLDB4MDAwMDEyNTIsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAxMjRhLDB4MDAwMDkyNTIsMHgwMDAwOTI5MiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwOTI5MiwweDAwMDA5MjkyLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwOTI1MiwweDAwMDA5MjkyLDB4MDAwMDk0OTMsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDA5MjkyLDB4MDAwMDk0OTMsMHgwMDAwOTQ5MywweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDA5MjUyLAorICAgIDB4MDAwMDkyOTIsMHgwMDAwOTQ5MywweDAwMDBhNDliLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyNTIsCisgICAgMHgwMDAwOTI5MiwweDAwMDBhNDliLDB4MDAwMGE0OWIsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI1MiwKKyAgICAweDAwMDA5NDkyLDB4MDAwMGE0OWIsMHgwMDAwYTQ5YiwweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjkyLAorICAgIDB4MDAwMDk0OTIsMHgwMDAwYTQ5YiwweDAwMDEyNGRiLDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyOTIsCisgICAgMHgwMDAwYTQ5MywweDAwMDBhNDliLDB4MDAwMTI0ZGIsMHgwMDAxMjRkYn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTQ5MywKKyAgICAweDAwMDEyNDliLDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDEyNmRjfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0ZGIsMHgwMDAxMzZlNCwweDAwMDFiNzI1LDB4MDAwMTM2ZTR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0KKyAgfSwKKyAgeyAvKiB2ZXJzaW9uIDMsIHBhc3NlcyAxICovCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDA0OSwweDAwMDAwMDQ5LAorICAgIDB4MDAwMDAwNDksMHgwMDAwMDA0OSwweDAwMDAwMDAxLDB4MDAwMDAwMDB9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMDI0OSwweDAwMDAwMjQ5LDB4MDAwMDAwNDksMHgwMDAwMDAwMX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAwMjQ5LDB4MDAwMDEyNGEsMHgwMDAwMTI1MiwweDAwMDAwMDAxfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwMTI0YSwweDAwMDAxMjUyLDB4MDAwMDAwMDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDA5MjUyLDB4MDAwMDkyOTIsMHgwMDAwMDAwOX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDAxMjRhLDB4MDAwMDkyNTIsMHgwMDAwOTI5MiwweDAwMDAwMDQ5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyNTIsMHgwMDAwOTI1MiwweDAwMDA5MjkyLDB4MDAwMDAwNDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwOTI1MiwweDAwMDA5NDkzLDB4MDAwMDkyOTIsMHgwMDAwMDI0YX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDA5MjUyLDB4MDAwMDk0OTMsMHgwMDAwOTI5MiwweDAwMDAwMjRhfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyNTIsMHgwMDAwOTQ5MywweDAwMDA5NDkzLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyNGEsCisgICAgMHgwMDAwOTI5MiwweDAwMDA5NDkzLDB4MDAwMDk0OTMsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI0YSwKKyAgICAweDAwMDA5NDkyLDB4MDAwMDk0OTMsMHgwMDAwOTQ5MywweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjUyLAorICAgIDB4MDAwMDk0OTIsMHgwMDAwYTQ5YiwweDAwMDA5NDkzLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDkyOTIsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNGRiLDB4MDAwMGE0OWIsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfQorICB9CisgfSwKKyB7IC8qIHZlcnNpb24gNCAqLworICB7IC8qIHZlcnNpb24gNCwgcGFzc2VzIDAgKi8KKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDA0OSwweDAwMDAwMDQ5LAorICAgIDB4MDAwMDAwNDksMHgwMDAwMDA0OSwweDAwMDAwMjRhLDB4MDAwMDAyNGF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMDI0OSwweDAwMDAxMjRhLDB4MDAwMDEyNTIsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAxMjRhLDB4MDAwMDkyNTIsMHgwMDAwOTI5MiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwOTI5MiwweDAwMDA5NDkzLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwOTI1MiwweDAwMDA5NDkzLDB4MDAwMDk0OTMsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwOTI0YSwKKyAgICAweDAwMDA5MjkyLDB4MDAwMDk0OTMsMHgwMDAwYTQ5YiwweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjRhLAorICAgIDB4MDAwMDkyOTIsMHgwMDAwOTQ5MywweDAwMDBhNDliLDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyNTIsCisgICAgMHgwMDAwOTQ5MiwweDAwMDBhNDliLDB4MDAwMGE0OWIsMHgwMDAxMjRkYn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI5MiwKKyAgICAweDAwMDA5NDkyLDB4MDAwMTI0ZGIsMHgwMDAxMjRkYiwweDAwMDEyNmRjfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjkyLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjRkYiwweDAwMDEyNmRjLDB4MDAwMTI2ZGN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNGRiLDB4MDAwMTI2ZGMsMHgwMDAxMzZlNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDEzNmU0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDA5NDkzLAorICAgIDB4MDAwMTI0OWIsMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMTM2ZTR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjRkYiwweDAwMDEzNmU0LDB4MDAwMTM2ZTQsMHgwMDAxYjcyNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMWI3MjQsMHgwMDAxYjcyNSwweDAwMDFiOTI1fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDB9CisgIH0sCisgIHsgLyogdmVyc2lvbiA0LCBwYXNzZXMgMSAqLworICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDQ5LDB4MDAwMDAwNDksCisgICAgMHgwMDAwMDA0OSwweDAwMDAwMDQ5LDB4MDAwMDAwNDksMHgwMDAwMDA0OX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAwMjQ5LDB4MDAwMDAyNDksMHgwMDAwMDI0YSwweDAwMDAwMDQ5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwMTI0YSwweDAwMDAxMjUyLDB4MDAwMDAwNDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDAxMjRhLDB4MDAwMDkyOTIsMHgwMDAwMDI0YX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDA5MjUyLDB4MDAwMDkyOTIsMHgwMDAwOTI5MiwweDAwMDAwMjRhfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyNTIsMHgwMDAwOTI5MiwweDAwMDBhNDliLDB4MDAwMDAyNGF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwOTI5MiwweDAwMDA5NDkzLDB4MDAwMGE0OWIsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDA5MjkyLDB4MDAwMDk0OTMsMHgwMDAwYTQ5YiwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjRhLAorICAgIDB4MDAwMDk0OTIsMHgwMDAwYTQ5YiwweDAwMDBhNDliLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyNTIsCisgICAgMHgwMDAwOTQ5MiwweDAwMDBhNDliLDB4MDAwMGE0OWIsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI5MiwKKyAgICAweDAwMDA5NDkyLDB4MDAwMGE0OWIsMHgwMDAwYTQ5YiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAwYTQ5YiwweDAwMDBhNDliLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDBhNDliLDB4MDAwMGE0OWIsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI0ZGIsMHgwMDAwYTQ5YiwweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI1MiwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0OWIsMHgwMDAxMjZkYywweDAwMDEyNGRiLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0KKyAgfQorIH0sCisgeyAvKiB2ZXJzaW9uIDUgKi8KKyAgeyAvKiB2ZXJzaW9uIDUsIHBhc3NlcyAwICovCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAwMjQ5LDB4MDAwMDEyNGEsMHgwMDAwMTI1MiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwOTI5MiwweDAwMDA5MjkyLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDkyNGEsCisgICAgMHgwMDAwOTI5MiwweDAwMDA5NDkzLDB4MDAwMGE0OWIsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI0YSwKKyAgICAweDAwMDA5MjkyLDB4MDAwMDk0OTMsMHgwMDAwYTQ5YiwweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjRhLAorICAgIDB4MDAwMDk0OTIsMHgwMDAwYTQ5YiwweDAwMDBhNDliLDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyOTIsCisgICAgMHgwMDAwOTQ5MiwweDAwMDBhNDliLDB4MDAwMTI0ZGIsMHgwMDAxMjRkYn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI5MiwKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI0ZGIsMHgwMDAxMjRkYiwweDAwMDEyNmRjfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjRkYiwweDAwMDEyNmRjLDB4MDAwMTI2ZGN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNmRjLDB4MDAwMTM2ZTQsMHgwMDAxMzZlNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTQ5MywKKyAgICAweDAwMDEyNDliLDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDEzNmU0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5NDkzLAorICAgIDB4MDAwMTI0OWIsMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMTM2ZTR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAxMjQ5YiwweDAwMDEyNmRjLDB4MDAwMWI3MjUsMHgwMDAxYjcyNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNGRiLDB4MDAwMTI2ZGMsMHgwMDAxYjcyNSwweDAwMDFiNzI0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI5MiwweDAwMDBhNDliLAorICAgIDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDFiOTJkLDB4MDAwMWI5MjV9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5NDkyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMzZlNCwweDAwMDFiNzI0LDB4MDAwMWM5NmUsMHgwMDAxYzkyZH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfQorICB9LAorICB7IC8qIHZlcnNpb24gNSwgcGFzc2VzIDEgKi8KKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwMDI0OSwweDAwMDAwMjRhLDB4MDAwMDAyNGF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDAxMjRhLDB4MDAwMDEyNTIsMHgwMDAwMDI0YX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDA5MjkyLDB4MDAwMDk0OTMsMHgwMDAwOTQ5MywweDAwMDAwMjRhfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyOTIsMHgwMDAwOTQ5MywweDAwMDA5NDkzLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwOTI5MiwweDAwMDA5NDkzLDB4MDAwMGE0OWIsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI0YSwKKyAgICAweDAwMDA5NDkyLDB4MDAwMDk0OTMsMHgwMDAxMjRkYiwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjkyLAorICAgIDB4MDAwMDk0OTIsMHgwMDAwOTQ5MywweDAwMDEyNGRiLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyOTIsCisgICAgMHgwMDAwOTQ5MiwweDAwMDBhNDliLDB4MDAwMTI0ZGIsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMGE0OWIsMHgwMDAxMjRkYiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjRkYiwweDAwMDEyNGRiLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNGRiLDB4MDAwMTI0ZGIsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI0ZGIsMHgwMDAxMjRkYiwweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjRkYiwweDAwMDEyNGRiLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjRkYiwweDAwMDEyNmRjLDB4MDAwMTI0ZGIsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMTM2ZTQsMHgwMDAxMjZkYywweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDB9CisgIH0KKyB9LAorIHsgLyogdmVyc2lvbiA2ICovCisgIHsgLyogdmVyc2lvbiA2LCBwYXNzZXMgMCAqLworICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDAxMjRhLDB4MDAwMDkyOTIsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDA5MjkyLDB4MDAwMDk0OTMsMHgwMDAwYTQ5YiwweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjRhLAorICAgIDB4MDAwMDk0OTIsMHgwMDAwYTQ5YiwweDAwMDBhNDliLDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyOTIsCisgICAgMHgwMDAwOTQ5MiwweDAwMDEyNGRiLDB4MDAwMTI2ZGMsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI0ZGIsMHgwMDAxMjZkYywweDAwMDEyNmRjfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMTM2ZTR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNmRjLDB4MDAwMTM2ZTQsMHgwMDAxYjcyNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTQ5MywKKyAgICAweDAwMDEyNDliLDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDFiNzI0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0OWIsMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMWI3MjR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjQ5YiwweDAwMDEzNmU0LDB4MDAwMWI3MjUsMHgwMDAxYjcyNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNGRiLDB4MDAwMTM2ZTQsMHgwMDAxYjcyNSwweDAwMDFiOTI1fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI5MiwweDAwMDBhNDliLAorICAgIDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDFiOTJkLDB4MDAwMWI5MjV9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjkyLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjZkYywweDAwMDFiNzI0LDB4MDAwMWI5MmQsMHgwMDAxYzkyZH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDk0OTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMWI3MjQsMHgwMDAxYzk2ZSwweDAwMDFjOTJkfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwYTQ5MiwweDAwMDEyNmRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxYjkyNSwweDAwMDI1YmI2LDB4MDAwMjRiNzd9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0KKyAgfSwKKyAgeyAvKiB2ZXJzaW9uIDYsIHBhc3NlcyAxICovCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAxMjRhLDB4MDAwMDEyNGEsMHgwMDAwMTI1MiwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyNTIsMHgwMDAwOTI5MiwweDAwMDA5MjkyLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyNGEsCisgICAgMHgwMDAwOTQ5MiwweDAwMDA5NDkzLDB4MDAwMGE0OWIsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI1MiwKKyAgICAweDAwMDA5NDkyLDB4MDAwMGE0OWIsMHgwMDAwYTQ5YiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjkyLAorICAgIDB4MDAwMDk0OTIsMHgwMDAwYTQ5YiwweDAwMDBhNDliLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDBhNDliLDB4MDAwMTI2ZGMsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMGE0OWIsMHgwMDAxMjZkYywweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAwYTQ5YiwweDAwMDEyNmRjLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNGRiLDB4MDAwMTI2ZGMsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI0ZGIsMHgwMDAxMjZkYywweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjRkYiwweDAwMDEyNmRjLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjQ5YiwweDAwMDEyNmRjLDB4MDAwMTI2ZGMsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNGRiLDB4MDAwMTM2ZTQsMHgwMDAxMjZkYywweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDBhNDliLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxMzZlNCwweDAwMDEyNmRjLDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxYjcyNCwweDAwMDFiNzI0LDB4MDAwMTM2ZTQsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfQorICB9CisgfSwKKyB7IC8qIHZlcnNpb24gNyAqLworICB7IC8qIHZlcnNpb24gNywgcGFzc2VzIDAgKi8KKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyOTIsMHgwMDAwOTQ5MywweDAwMDBhNDliLDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyOTIsCisgICAgMHgwMDAwYTQ5MywweDAwMDBhNDliLDB4MDAwMTI0ZGIsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI0ZGIsMHgwMDAxMjZkYywweDAwMDEzNmU0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjRkYiwweDAwMDEzNmU0LDB4MDAwMTM2ZTR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDk0OTMsCisgICAgMHgwMDAxMjQ5YiwweDAwMDEyNmRjLDB4MDAwMTM2ZTQsMHgwMDAxMzZlNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNDliLDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDFiNzI0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0OWIsMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMWI3MjR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjRkYiwweDAwMDEzNmU0LDB4MDAwMWI3MjUsMHgwMDAxYjcyNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMTM2ZTQsMHgwMDAxYjcyNSwweDAwMDFiOTI1fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI2ZGMsMHgwMDAxYjcyNCwweDAwMDFiOTJkLDB4MDAwMWI5MjV9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjkyLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjZkYywweDAwMDFiNzI0LDB4MDAwMWM5NmUsMHgwMDAxYzkyZH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyOTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMWI3MjQsMHgwMDAxYzk2ZSwweDAwMDFjOTJkfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDEyNGRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxYjcyNCwweDAwMDFjOTZlLDB4MDAwMjQ5NmV9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5NDkyLDB4MDAwMTI2ZGIsCisgICAgMHgwMDAxMzZlNCwweDAwMDFiOTI1LDB4MDAwMWM5NmUsMHgwMDAyNDk2ZX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE0OTIsMHgwMDAxMzZkYiwKKyAgICAweDAwMDFiNzI0LDB4MDAwMjQ5NmQsMHgwMDAyNWJiNiwweDAwMDI1YmJmfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDB9CisgIH0sCisgIHsgLyogdmVyc2lvbiA3LCBwYXNzZXMgMSAqLworICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwOTI1MiwweDAwMDA5MjkyLDB4MDAwMDkyOTIsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI0YSwKKyAgICAweDAwMDA5NDkyLDB4MDAwMDk0OTMsMHgwMDAwOTQ5MywweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAwYTQ5YiwweDAwMDBhNDliLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDBhNDliLDB4MDAwMTI0ZGIsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI0ZGIsMHgwMDAxMjRkYiwweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjRkYiwweDAwMDEzNmU0LDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNGRiLDB4MDAwMTM2ZTQsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNDliLDB4MDAwMTI0ZGIsMHgwMDAxMzZlNCwweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0OWIsMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjQ5YiwweDAwMDEyNmRjLDB4MDAwMTM2ZTQsMHgwMDAxMjRkYn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMTM2ZTQsMHgwMDAxMzZlNCwweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDEzNmU0LDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMzZlNCwweDAwMDEzNmU0LDB4MDAwMTM2ZTQsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE0OTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMWI3MjQsMHgwMDAxMzZlNCwweDAwMDEyNmRjfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAxMjQ5MiwweDAwMDEyNmRiLAorICAgIDB4MDAwMWI3MjQsMHgwMDAxYjkyNSwweDAwMDFiNzI1LDB4MDAwMTM2ZTR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0KKyAgfQorIH0sCisgeyAvKiB2ZXJzaW9uIDggKi8KKyAgeyAvKiB2ZXJzaW9uIDgsIHBhc3NlcyAwICovCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDA5MjkyLDB4MDAwMDk0OTMsMHgwMDAwYTQ5YiwweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjkyLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjRkYiwweDAwMDEyNmRjLDB4MDAwMTI2ZGN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNGRiLDB4MDAwMTI2ZGMsMHgwMDAxMzZlNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNDliLDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDFiNzI0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0OWIsMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMWI3MjR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjRkYiwweDAwMDEzNmU0LDB4MDAwMWI3MjUsMHgwMDAxYjcyNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMTM2ZTQsMHgwMDAxYjcyNSwweDAwMDFiOTI1fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI2ZGMsMHgwMDAxYjcyNCwweDAwMDFiOTJkLDB4MDAwMWM5MmR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjUyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMjZkYywweDAwMDFiNzI0LDB4MDAwMWI5MmQsMHgwMDAxYzkyZH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyOTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMWI5MjUsMHgwMDAxYzk2ZSwweDAwMDFjOTJkfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDEyNGRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxYjkyNSwweDAwMDFjOTZlLDB4MDAwMWM5MmR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5NDkyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMzZlNCwweDAwMDFiOTI1LDB4MDAwMjRiNzYsMHgwMDAyNGI3N30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDk0OTIsMHgwMDAxMjZkYiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMWI5MjUsMHgwMDAyNGI3NiwweDAwMDI1YmJmfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwYTQ5MiwweDAwMDEyNmRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxYzkyZCwweDAwMDI0Yjc2LDB4MDAwMjViYmZ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDEyNDkyLDB4MDAwMTM2ZGIsCisgICAgMHgwMDAxYjcyNCwweDAwMDI0YjZkLDB4MDAwMmRkYjYsMHgwMDAyZWZmZn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfQorICB9LAorICB7IC8qIHZlcnNpb24gOCwgcGFzc2VzIDEgKi8KKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyNTIsMHgwMDAwOTQ5MywweDAwMDA5NDkzLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyOTIsCisgICAgMHgwMDAwYTQ5MywweDAwMDBhNDliLDB4MDAwMGE0OWIsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMGE0OWIsMHgwMDAxMjRkYiwweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjRkYiwweDAwMDEyNmRjLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNGRiLDB4MDAwMTI2ZGMsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI0ZGIsMHgwMDAxMzZlNCwweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0OWIsMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjZkYywweDAwMDEyNmRjLDB4MDAwMTM2ZTQsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMTM2ZTQsMHgwMDAxMzZlNCwweDAwMDEyNmRjfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDEyNGRiLAorICAgIDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDEzNmU0LDB4MDAwMTI2ZGN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMTM2ZTQsMHgwMDAxMzZlNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyOTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMWI3MjQsMHgwMDAxYjcyNSwweDAwMDEzNmU0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDEyNmRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxYjkyNSwweDAwMDFiNzI1LDB4MDAwMWI3MjR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5NDkyLDB4MDAwMTI2ZGIsCisgICAgMHgwMDAxMzZlNCwweDAwMDFiOTI1LDB4MDAwMWI3MjUsMHgwMDAxYjcyNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE0OTIsMHgwMDAxMzZkYiwKKyAgICAweDAwMDFiNzI0LDB4MDAwMjQ5NmQsMHgwMDAxYjkyZCwweDAwMDFiOTI1fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDB9CisgIH0KKyB9LAorIHsgLyogdmVyc2lvbiA5ICovCisgIHsgLyogdmVyc2lvbiA5LCBwYXNzZXMgMCAqLworICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDQ5LDB4MDAwMDAwNDksCisgICAgMHgwMDAwMDA0OSwweDAwMDAwMDQ5LDB4MDAwMDAwNDksMHgwMDAwMDA0OX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMDA0OSwKKyAgICAweDAwMDAwMjQ5LDB4MDAwMDAyNDksMHgwMDAwMDI0YSwweDAwMDAwMDQ5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwOTI1MiwweDAwMDAxMjUyLDB4MDAwMDAyNGF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwOTI1MiwweDAwMDA5MjkyLDB4MDAwMDk0OTMsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI0YSwKKyAgICAweDAwMDA5MjkyLDB4MDAwMDk0OTMsMHgwMDAwOTQ5MywweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjkyLAorICAgIDB4MDAwMDk0OTIsMHgwMDAwYTQ5YiwweDAwMDBhNDliLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNGRiLDB4MDAwMTI0ZGIsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI0ZGIsMHgwMDAxMjZkYywweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjRkYiwweDAwMDEyNmRjLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAxMjQ5YiwweDAwMDEyNmRjLDB4MDAwMTI2ZGMsMHgwMDAxMjRkYn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNTIsMHgwMDAwOTQ5MywKKyAgICAweDAwMDEyNGRiLDB4MDAwMTM2ZTQsMHgwMDAxMzZlNCwweDAwMDEyNmRjfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI1MiwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0ZGIsMHgwMDAxMzZlNCwweDAwMDEzNmU0LDB4MDAwMTI2ZGN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjkyLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMTM2ZTQsMHgwMDAxMzZlNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDk0OTIsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMWI3MjQsMHgwMDAxYjcyNSwweDAwMDFiNzI0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwYTQ5MiwweDAwMDEyNGRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxYjkyNSwweDAwMDFiOTJkLDB4MDAwMWI5MjV9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0KKyAgfSwKKyAgeyAvKiB2ZXJzaW9uIDksIHBhc3NlcyAxICovCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMDA0OSwKKyAgICAweDAwMDAwMDA5LDB4MDAwMDAwMDksMHgwMDAwMDAwOSwweDAwMDAwMDA5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDAwNDksMHgwMDAwMDA0OSwweDAwMDAwMDA5LDB4MDAwMDAwMDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDAwMjQ5LDB4MDAwMDAwNDksMHgwMDAwMDA0OX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDAxMjRhLDB4MDAwMDEyNGEsMHgwMDAwMDA0OSwweDAwMDAwMDQ5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyNTIsMHgwMDAwMTI0YSwweDAwMDAwMjRhLDB4MDAwMDAyNGF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyNGEsCisgICAgMHgwMDAwOTI1MiwweDAwMDAxMjRhLDB4MDAwMDAyNGEsMHgwMDAwMDI0YX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI5MiwKKyAgICAweDAwMDA5NDkyLDB4MDAwMDkyNTIsMHgwMDAwMTI1MiwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAwOTI5MiwweDAwMDA5MjkyLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDA5MjkyLDB4MDAwMDkyOTIsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMDk0OTMsMHgwMDAwOTQ5MywweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMGE0OTMsMHgwMDAwYTQ5YiwweDAwMDA5NDkzLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAwYTQ5MywweDAwMDBhNDliLDB4MDAwMGE0OWIsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNDliLDB4MDAwMTI0ZGIsMHgwMDAwYTQ5YiwweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxMjZkYywweDAwMDEyNGRiLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjUyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxYjcyNCwweDAwMDEzNmU0LDB4MDAwMTI2ZGMsMHgwMDAxMjRkYn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfQorICB9CisgfSwKKyB7IC8qIHZlcnNpb24gMTAgKi8KKyAgeyAvKiB2ZXJzaW9uIDEwLCBwYXNzZXMgMCAqLworICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMDI0OSwweDAwMDAwMjQ5LDB4MDAwMDAyNGEsMHgwMDAwMDI0YX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDA5MjUyLDB4MDAwMDkyOTIsMHgwMDAwOTI5MiwweDAwMDAwMjRhfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyNTIsMHgwMDAwOTI5MiwweDAwMDA5MjkyLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyNGEsCisgICAgMHgwMDAwOTQ5MiwweDAwMDA5NDkzLDB4MDAwMGE0OWIsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI5MiwKKyAgICAweDAwMDA5NDkyLDB4MDAwMTI0ZGIsMHgwMDAxMjRkYiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjRkYiwweDAwMDEyNGRiLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNGRiLDB4MDAwMTI2ZGMsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI0ZGIsMHgwMDAxMjZkYywweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDA5NDkzLAorICAgIDB4MDAwMTI0OWIsMHgwMDAxMjZkYywweDAwMDEyNmRjLDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjRkYiwweDAwMDEyNmRjLDB4MDAwMTM2ZTQsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNTIsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNGRiLDB4MDAwMTM2ZTQsMHgwMDAxMzZlNCwweDAwMDEzNmU0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI5MiwweDAwMDBhNDliLAorICAgIDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDEzNmU0LDB4MDAwMTM2ZTR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5NDkyLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjZkYywweDAwMDFiNzI0LDB4MDAwMWI5MmQsMHgwMDAxYjcyNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDk0OTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMWI5MjUsMHgwMDAxYjkyZCwweDAwMDFiOTI1fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwYTQ5MiwweDAwMDEyNmRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAyNDk2ZCwweDAwMDFjOTZlLDB4MDAwMWM5MmR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0KKyAgfSwKKyAgeyAvKiB2ZXJzaW9uIDEwLCBwYXNzZXMgMSAqLworICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMDA0OSwweDAwMDAwMDQ5LDB4MDAwMDAwNDksMHgwMDAwMDA0OX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDAxMjRhLDB4MDAwMDAyNDksMHgwMDAwMDA0OSwweDAwMDAwMDQ5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwOTI1MiwweDAwMDAwMjRhLDB4MDAwMDAwNDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwOTI1MiwweDAwMDA5NDkzLDB4MDAwMDAyNGEsMHgwMDAwMDI0YX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI1MiwKKyAgICAweDAwMDA5NDkyLDB4MDAwMDk0OTMsMHgwMDAwMTI1MiwweDAwMDAwMjRhfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjkyLAorICAgIDB4MDAwMDk0OTIsMHgwMDAwOTQ5MywweDAwMDAxMjUyLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAwOTQ5MiwweDAwMDA5NDkzLDB4MDAwMDkyOTIsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMDk0OTMsMHgwMDAwOTI5MiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAwYTQ5YiwweDAwMDA5NDkzLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDBhNDliLDB4MDAwMDk0OTMsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI0ZGIsMHgwMDAwYTQ5YiwweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjRkYiwweDAwMDBhNDliLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMzZlNCwweDAwMDEyNmRjLDB4MDAwMTI0ZGIsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMTI2ZGMsMHgwMDAxMjRkYiwweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI1MiwweDAwMDEyNmRiLAorICAgIDB4MDAwMWI3MjQsMHgwMDAxMzZlNCwweDAwMDEyNmRjLDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0KKyAgfQorIH0sCisgeyAvKiB2ZXJzaW9uIDExICovCisgIHsgLyogdmVyc2lvbiAxMSwgcGFzc2VzIDAgKi8KKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDAyNDksMHgwMDAwMDI0OSwweDAwMDAxMjUyLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwOTI1MiwweDAwMDA5MjkyLDB4MDAwMDkyOTIsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI0YSwKKyAgICAweDAwMDA5NDkyLDB4MDAwMGE0OWIsMHgwMDAwYTQ5YiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAwYTQ5YiwweDAwMDEyNGRiLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNGRiLDB4MDAwMTI2ZGMsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI2ZGMsMHgwMDAxMjZkYywweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0OWIsMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMTM2ZTQsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyOTIsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMTM2ZTQsMHgwMDAxMzZlNCwweDAwMDEyNmRjfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI5MiwweDAwMDBhNDliLAorICAgIDB4MDAwMTI2ZGMsMHgwMDAxYjcyNCwweDAwMDFiNzI1LDB4MDAwMTM2ZTR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjkyLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMzZlNCwweDAwMDFiNzI0LDB4MDAwMWI5MmQsMHgwMDAxYjcyNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDk0OTIsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMWI3MjQsMHgwMDAxYjkyZCwweDAwMDFiNzI0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDEyNGRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxYjkyNSwweDAwMDFjOTZlLDB4MDAwMWI5MjV9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5NDkyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxYjcyNCwweDAwMDFiOTI1LDB4MDAwMWM5NmUsMHgwMDAxYzkyZH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE0OTIsMHgwMDAxMjZkYiwKKyAgICAweDAwMDFjOTI0LDB4MDAwMjQ5NmQsMHgwMDAyNWJiNiwweDAwMDI0Yjc3fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDB9CisgIH0sCisgIHsgLyogdmVyc2lvbiAxMSwgcGFzc2VzIDEgKi8KKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDAyNDksMHgwMDAwMDI0OSwweDAwMDAwMjRhLDB4MDAwMDAyNGF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDAxMjRhLDB4MDAwMDAyNGEsMHgwMDAwMDI0YX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI0YSwKKyAgICAweDAwMDA5MjUyLDB4MDAwMDkyNTIsMHgwMDAwMDI0YSwweDAwMDAwMjRhfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjkyLAorICAgIDB4MDAwMDk0OTIsMHgwMDAwYTQ5YiwweDAwMDAxMjUyLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDBhNDliLDB4MDAwMDEyNTIsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMGE0OWIsMHgwMDAwOTI5MiwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMGE0OTMsMHgwMDAwYTQ5YiwweDAwMDA5MjkyLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAwYTQ5MywweDAwMDBhNDliLDB4MDAwMDk0OTMsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNDliLDB4MDAwMTI0ZGIsMHgwMDAwOTQ5MywweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0OWIsMHgwMDAxMjRkYiwweDAwMDA5NDkzLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjRkYiwweDAwMDEyNGRiLDB4MDAwMGE0OWIsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMTI2ZGMsMHgwMDAwYTQ5YiwweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDEyNGRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxMjZkYywweDAwMDEyNGRiLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjkyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMzZlNCwweDAwMDEyNmRjLDB4MDAwMTI0ZGIsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDk0OTIsMHgwMDAxMjZkYiwKKyAgICAweDAwMDFiNzI0LDB4MDAwMTM2ZTQsMHgwMDAxMjZkYywweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDB9CisgIH0KKyB9LAorIHsgLyogdmVyc2lvbiAxMiAqLworICB7IC8qIHZlcnNpb24gMTIsIHBhc3NlcyAwICovCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDA5MjUyLDB4MDAwMDkyOTIsMHgwMDAwOTQ5MywweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjkyLAorICAgIDB4MDAwMGE0OTMsMHgwMDAwYTQ5YiwweDAwMDBhNDliLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNGRiLDB4MDAwMTI0ZGIsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI2ZGMsMHgwMDAxMjZkYywweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0OWIsMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMTM2ZTQsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyOTIsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMWI3MjQsMHgwMDAxYjcyNSwweDAwMDEyNmRjfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI5MiwweDAwMDBhNDliLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxYjcyNCwweDAwMDFiOTJkLDB4MDAwMTM2ZTR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5NDkyLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMzZlNCwweDAwMDFiNzI0LDB4MDAwMWI5MmQsMHgwMDAxYjcyNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDk0OTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMWI3MjQsMHgwMDAxYjkyZCwweDAwMDFiNzI0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDEyNGRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxYjkyNSwweDAwMDFiOTJkLDB4MDAwMWI5MjV9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5NDkyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxYjcyNCwweDAwMDFiOTI1LDB4MDAwMWM5NmUsMHgwMDAxYzkyZH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE0OTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDFiNzI0LDB4MDAwMWM5MmQsMHgwMDAxYzk2ZSwweDAwMDFjOTJkfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwYTQ5MiwweDAwMDEyNGRiLAorICAgIDB4MDAwMWI3MjQsMHgwMDAxYzkyZCwweDAwMDI0Yjc2LDB4MDAwMjQ5NmV9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDEyNDkyLDB4MDAwMTI2ZGIsCisgICAgMHgwMDAxYzkyNCwweDAwMDI0YjZkLDB4MDAwMmRkYjYsMHgwMDAyNWJiZn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfQorICB9LAorICB7IC8qIHZlcnNpb24gMTIsIHBhc3NlcyAxICovCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDAxMjRhLDB4MDAwMDEyNGEsMHgwMDAwMTI1MiwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjkyLAorICAgIDB4MDAwMDk0OTIsMHgwMDAwOTI1MiwweDAwMDAxMjUyLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDA5MjkyLDB4MDAwMDEyNTIsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDBhNDkzLDB4MDAwMGE0OWIsMHgwMDAwOTI5MiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMGE0OTMsMHgwMDAwYTQ5YiwweDAwMDA5MjkyLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjQ5YiwweDAwMDBhNDliLDB4MDAwMDk0OTMsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNGRiLDB4MDAwMTI0ZGIsMHgwMDAwOTQ5MywweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0ZGIsMHgwMDAxMjRkYiwweDAwMDBhNDliLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMjZkYywweDAwMDEyNGRiLDB4MDAwMGE0OWIsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMTI2ZGMsMHgwMDAwYTQ5YiwweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDEyNGRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxMjZkYywweDAwMDEyNGRiLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5NDkyLDB4MDAwMTI2ZGIsCisgICAgMHgwMDAxMzZlNCwweDAwMDEyNmRjLDB4MDAwMTI0ZGIsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDk0OTIsMHgwMDAxMjZkYiwKKyAgICAweDAwMDFiNzI0LDB4MDAwMTM2ZTQsMHgwMDAxMjZkYywweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDEyNmRiLAorICAgIDB4MDAwMWI3MjQsMHgwMDAxMzZlNCwweDAwMDEyNmRjLDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTM2ZGIsCisgICAgMHgwMDAxYzkyNCwweDAwMDFiNzI0LDB4MDAwMTM2ZTQsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfQorICB9CisgfSwKKyB7IC8qIHZlcnNpb24gMTMgKi8KKyAgeyAvKiB2ZXJzaW9uIDEzLCBwYXNzZXMgMCAqLworICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwOTI1MiwweDAwMDA5MjkyLDB4MDAwMDk0OTMsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI0ZGIsMHgwMDAxMjZkYywweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0OWIsMHgwMDAxMjZkYywweDAwMDEyNmRjLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjQ5YiwweDAwMDEyNmRjLDB4MDAwMTM2ZTQsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMTM2ZTQsMHgwMDAxYjcyNSwweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI5MiwweDAwMDBhNDliLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxYjcyNCwweDAwMDFiNzI1LDB4MDAwMTI2ZGN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjkyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMzZlNCwweDAwMDFiNzI0LDB4MDAwMWI3MjUsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDk0OTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMWI3MjQsMHgwMDAxYzk2ZSwweDAwMDEzNmU0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDEyNGRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxYzkyZCwweDAwMDFjOTZlLDB4MDAwMWI3MjR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMzZlNCwweDAwMDFjOTJkLDB4MDAwMWM5NmUsMHgwMDAxYjcyNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE0OTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDFiNzI0LDB4MDAwMWM5MmQsMHgwMDAxYzk2ZSwweDAwMDFiOTI1fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwYTQ5MiwweDAwMDEyNmRiLAorICAgIDB4MDAwMWI3MjQsMHgwMDAxYzkyZCwweDAwMDI0Yjc2LDB4MDAwMWM5MmR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTI2ZGIsCisgICAgMHgwMDAxYjkyNCwweDAwMDFjOTJkLDB4MDAwMjRiNzYsMHgwMDAxYzkyZH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE0OTIsMHgwMDAxMjZkYiwKKyAgICAweDAwMDFiOTI0LDB4MDAwMWM5MmQsMHgwMDAyNGI3NiwweDAwMDI0OTZlfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAxMjQ5MiwweDAwMDEzNmRiLAorICAgIDB4MDAwMjQ5MjQsMHgwMDAyNGI2ZCwweDAwMDJkZGI2LDB4MDAwMjViYmZ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0KKyAgfSwKKyAgeyAvKiB2ZXJzaW9uIDEzLCBwYXNzZXMgMSAqLworICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDAxMjRhLDB4MDAwMDEyNTIsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTQ5MywKKyAgICAweDAwMDA5NDkyLDB4MDAwMDkyOTIsMHgwMDAwMTI1MiwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMGE0OTMsMHgwMDAwYTQ5YiwweDAwMDAxMjUyLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAwYTQ5MywweDAwMDBhNDliLDB4MDAwMDkyOTIsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDBhNDkzLDB4MDAwMGE0OWIsMHgwMDAwOTI5MiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI2ZGMsMHgwMDAwYTQ5YiwweDAwMDA5NDkzLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMjZkYywweDAwMDEyNGRiLDB4MDAwMDk0OTMsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMTI0ZGIsMHgwMDAwYTQ5YiwweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDEzNmRiLAorICAgIDB4MDAwMWI3MjQsMHgwMDAxMjRkYiwweDAwMDBhNDliLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMTM2ZGIsCisgICAgMHgwMDAxYjcyNCwweDAwMDEyNmRjLDB4MDAwMGE0OWIsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyOTIsMHgwMDAxMzZkYiwKKyAgICAweDAwMDFiNzI0LDB4MDAwMTI2ZGMsMHgwMDAxMjRkYiwweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDEzNmRiLAorICAgIDB4MDAwMWI3MjQsMHgwMDAxMjZkYywweDAwMDEyNGRiLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTM2ZGIsCisgICAgMHgwMDAxYjcyNCwweDAwMDEzNmU0LDB4MDAwMTI2ZGMsMHgwMDAxMjRkYn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE0OTIsMHgwMDAxMzZkYiwKKyAgICAweDAwMDFiNzI0LDB4MDAwMTM2ZTQsMHgwMDAxMjZkYywweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAxMjQ5MiwweDAwMDFiNmRiLAorICAgIDB4MDAwMWM5MjQsMHgwMDAxYjcyNCwweDAwMDEzNmU0LDB4MDAwMTI2ZGN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0KKyAgfQorIH0sCisgeyAvKiB2ZXJzaW9uIDE0ICovCisgIHsgLyogdmVyc2lvbiAxNCwgcGFzc2VzIDAgKi8KKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjRhLAorICAgIDB4MDAwMDkyOTIsMHgwMDAwOTQ5MywweDAwMDA5NDkzLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMGE0OWIsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNGRiLDB4MDAwMTI2ZGMsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNDliLDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDEyNGRiLAorICAgIDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDFiNzI1LDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjkyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMjZkYywweDAwMDFiNzI0LDB4MDAwMWI5MmQsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDk0OTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMWI3MjQsMHgwMDAxYjkyZCwweDAwMDEyNmRjfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDEyNGRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxYzkyZCwweDAwMDFjOTZlLDB4MDAwMTM2ZTR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5NDkyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxYjcyNCwweDAwMDFjOTJkLDB4MDAwMWM5NmUsMHgwMDAxYjcyNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE0OTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDFiNzI0LDB4MDAwMWM5MmQsMHgwMDAyNGI3NiwweDAwMDFiOTI1fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwYTQ5MiwweDAwMDEyNmRiLAorICAgIDB4MDAwMWI3MjQsMHgwMDAxYzkyZCwweDAwMDI0Yjc2LDB4MDAwMWM5MmR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTI2ZGIsCisgICAgMHgwMDAxYjcyNCwweDAwMDFjOTJkLDB4MDAwMjRiNzYsMHgwMDAxYzkyZH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE0OTIsMHgwMDAxMzZkYiwKKyAgICAweDAwMDFiNzI0LDB4MDAwMWM5MmQsMHgwMDAyNGI3NiwweDAwMDI0OTZlfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwYTQ5MiwweDAwMDEzNmRiLAorICAgIDB4MDAwMWI5MjQsMHgwMDAyNDk2ZCwweDAwMDI0Yjc2LDB4MDAwMjRiNzd9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTM2ZGIsCisgICAgMHgwMDAxYjkyNCwweDAwMDI0YjZkLDB4MDAwMmRkYjYsMHgwMDAyNWJiZn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMTI0OTIsMHgwMDAxYjZkYiwKKyAgICAweDAwMDI0OTI0LDB4MDAwMmRiNmQsMHgwMDAzNmRiNiwweDAwMDJlZmZmfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDB9CisgIH0sCisgIHsgLyogdmVyc2lvbiAxNCwgcGFzc2VzIDEgKi8KKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwMTI0YSwweDAwMDAxMjUyLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDA5MjkyLDB4MDAwMDEyNTIsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDBhNDkzLDB4MDAwMGE0OWIsMHgwMDAwMTI1MiwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0OWIsMHgwMDAxMzZlNCwweDAwMDA5MjkyLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjQ5YiwweDAwMDEzNmU0LDB4MDAwMDkyOTIsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMTM2ZTQsMHgwMDAwOTQ5MywweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDEzNmRiLAorICAgIDB4MDAwMWI3MjQsMHgwMDAxMzZlNCwweDAwMDA5NDkzLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5NDkyLDB4MDAwMTM2ZGIsCisgICAgMHgwMDAxYjcyNCwweDAwMDEzNmU0LDB4MDAwMGE0OWIsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDk0OTIsMHgwMDAxMzZkYiwKKyAgICAweDAwMDFiNzI0LDB4MDAwMTM2ZTQsMHgwMDAwYTQ5YiwweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDEzNmRiLAorICAgIDB4MDAwMWI3MjQsMHgwMDAxMzZlNCwweDAwMDBhNDliLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTM2ZGIsCisgICAgMHgwMDAxYjcyNCwweDAwMDEzNmU0LDB4MDAwMTI0ZGIsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE0OTIsMHgwMDAxMzZkYiwKKyAgICAweDAwMDFiNzI0LDB4MDAwMTM2ZTQsMHgwMDAxMjRkYiwweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwYTQ5MiwweDAwMDEzNmRiLAorICAgIDB4MDAwMWI3MjQsMHgwMDAxMzZlNCwweDAwMDEyNmRjLDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTM2ZGIsCisgICAgMHgwMDAxYjcyNCwweDAwMDEzNmU0LDB4MDAwMTI2ZGMsMHgwMDAxMjRkYn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMTI0OTIsMHgwMDAxYjZkYiwKKyAgICAweDAwMDFjOTI0LDB4MDAwMWI3MjQsMHgwMDAxMzZlNCwweDAwMDEyNmRjfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDB9CisgIH0KKyB9LAorIHsgLyogdmVyc2lvbiAxNSAqLworICB7IC8qIHZlcnNpb24gMTUsIHBhc3NlcyAwICovCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMGE0OWIsMHgwMDAxMjRkYiwweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0OWIsMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjZkYywweDAwMDFiNzI0LDB4MDAwMWI3MjUsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMWI3MjQsMHgwMDAxYjkyZCwweDAwMDEyNmRjfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDEyNGRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxYjkyNSwweDAwMDFjOTZlLDB4MDAwMTM2ZTR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5NDkyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxYjcyNCwweDAwMDFjOTJkLDB4MDAwMWM5NmUsMHgwMDAxYjcyNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE0OTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDFiNzI0LDB4MDAwMWM5MmQsMHgwMDAxYzk2ZSwweDAwMDFiNzI0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwYTQ5MiwweDAwMDEyNmRiLAorICAgIDB4MDAwMWI3MjQsMHgwMDAxYzkyZCwweDAwMDFjOTZlLDB4MDAwMWI5MjV9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTI2ZGIsCisgICAgMHgwMDAxYjkyNCwweDAwMDFjOTJkLDB4MDAwMjRiNzYsMHgwMDAxYzkyZH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE0OTIsMHgwMDAxMzZkYiwKKyAgICAweDAwMDFiOTI0LDB4MDAwMWM5MmQsMHgwMDAyNGI3NiwweDAwMDFjOTJkfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwYTQ5MiwweDAwMDEzNmRiLAorICAgIDB4MDAwMWI5MjQsMHgwMDAyNDk2ZCwweDAwMDI0Yjc2LDB4MDAwMjQ5NmV9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTM2ZGIsCisgICAgMHgwMDAxYzkyNCwweDAwMDI0OTZkLDB4MDAwMjViYjYsMHgwMDAyNGI3N30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE0OTIsMHgwMDAxMzZkYiwKKyAgICAweDAwMDFjOTI0LDB4MDAwMjRiNmQsMHgwMDAyNWJiNiwweDAwMDI0Yjc3fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAxMjQ5MiwweDAwMDEzNmRiLAorICAgIDB4MDAwMWM5MjQsMHgwMDAyNGI2ZCwweDAwMDJkZGI2LDB4MDAwMjViYmZ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDEyNDkyLDB4MDAwMWI2ZGIsCisgICAgMHgwMDAyNDkyNCwweDAwMDJkYjZkLDB4MDAwMzZkYjYsMHgwMDAyZWZmZn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfQorICB9LAorICB7IC8qIHZlcnNpb24gMTUsIHBhc3NlcyAxICovCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTI0YSwKKyAgICAweDAwMDA5MjkyLDB4MDAwMDkyOTIsMHgwMDAwOTI5MiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjRkYiwweDAwMDA5MjkyLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMjRkYiwweDAwMDFiNzI0LDB4MDAwMDk0OTMsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMWI3MjQsMHgwMDAwOTQ5MywweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDEyNGRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxYjcyNCwweDAwMDBhNDliLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjkyLDB4MDAwMTM2ZGIsCisgICAgMHgwMDAxYjcyNCwweDAwMDFiNzI0LDB4MDAwMGE0OWIsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDk0OTIsMHgwMDAxMzZkYiwKKyAgICAweDAwMDFjOTI0LDB4MDAwMWI3MjQsMHgwMDAxMjRkYiwweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDEzNmRiLAorICAgIDB4MDAwMWM5MjQsMHgwMDAxYjcyNCwweDAwMDEyNGRiLDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTM2ZGIsCisgICAgMHgwMDAxYzkyNCwweDAwMDFiNzI0LDB4MDAwMTI2ZGMsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE0OTIsMHgwMDAxMzZkYiwKKyAgICAweDAwMDFjOTI0LDB4MDAwMWI5MjUsMHgwMDAxMjZkYywweDAwMDEyNmRjfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwYTQ5MiwweDAwMDEzNmRiLAorICAgIDB4MDAwMWM5MjQsMHgwMDAxYjkyNSwweDAwMDEzNmU0LDB4MDAwMTM2ZTR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTM2ZGIsCisgICAgMHgwMDAxYzkyNCwweDAwMDFiOTI1LDB4MDAwMTM2ZTQsMHgwMDAxMzZlNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE0OTIsMHgwMDAxMzZkYiwKKyAgICAweDAwMDFjOTI0LDB4MDAwMWI5MjUsMHgwMDAxYjcyNSwweDAwMDFiNzI0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAxMjQ5MiwweDAwMDEzNmRiLAorICAgIDB4MDAwMWM5MjQsMHgwMDAxYjkyNSwweDAwMDFiNzI1LDB4MDAwMWI3MjR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDEyNDkyLDB4MDAwMWI2ZGIsCisgICAgMHgwMDAyNDkyNCwweDAwMDI0OTZkLDB4MDAwMWI5MmQsMHgwMDAxYjkyNX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfQorICB9CisgfQorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy10aW1vbi5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLXRpbW9uLmgKaW5kZXggYTg2YjM3OC4uZWVmOWUyYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLXRpbW9uLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLXRpbW9uLmgKQEAgLTEsNSArMSw1IEBACiAvKiBMaW51eCBkcml2ZXIgZm9yIFBoaWxpcHMgd2ViY2FtCi0gICAoQykgMjAwNCAgICAgIEx1YyBTYWlsbGFyZCAobHVjQHNhaWxsYXJkLm9yZykKKyAgIChDKSAyMDA0LTIwMDYgTHVjIFNhaWxsYXJkIChsdWNAc2FpbGxhcmQub3JnKQogCiAgICBOT1RFOiB0aGlzIHZlcnNpb24gb2YgcHdjIGlzIGFuIHVub2ZmaWNpYWwgKG1vZGlmaWVkKSByZWxlYXNlIG9mIHB3YyAmIHBjd3gKICAgIGRyaXZlciBhbmQgdGh1cyBtYXkgaGF2ZSBidWdzIHRoYXQgYXJlIG5vdCBwcmVzZW50IGluIHRoZSBvcmlnaW5hbCB2ZXJzaW9uLgpAQCAtNDIsNyArNDIsNyBAQAogI2lmbmRlZiBQV0NfVElNT05fSAogI2RlZmluZSBQV0NfVElNT05fSAogCi0jaW5jbHVkZSAicHdjLWlvY3RsLmgiCisjaW5jbHVkZSA8bWVkaWEvcHdjLWlvY3RsLmg+CiAKIHN0cnVjdCBUaW1vbl90YWJsZV9lbnRyeQogewpAQCAtNTIsOCArNTIsOCBAQAogCXVuc2lnbmVkIGNoYXIgbW9kZVsxM107CQkvKiBwcmVjb21wdXRlZCBtb2RlIHNldHRpbmdzIGZvciBjYW0gKi8KIH07CiAKLWNvbnN0IGV4dGVybiBzdHJ1Y3QgVGltb25fdGFibGVfZW50cnkgVGltb25fdGFibGVbUFNaX01BWF1bNl1bNF07Ci1jb25zdCBleHRlcm4gdW5zaWduZWQgaW50IFRpbW9uUm9tVGFibGUgWzE2XVsyXVsxNl1bOF07CitleHRlcm4gY29uc3Qgc3RydWN0IFRpbW9uX3RhYmxlX2VudHJ5IFRpbW9uX3RhYmxlW1BTWl9NQVhdWzZdWzRdOworZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGludCBUaW1vblJvbVRhYmxlIFsxNl1bMl1bMTZdWzhdOwogCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLXVuY29tcHJlc3MuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy11bmNvbXByZXNzLmMKaW5kZXggYjM3YTg5YS4uNWQ4MjAyOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLXVuY29tcHJlc3MuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtdW5jb21wcmVzcy5jCkBAIC0xLDcgKzEsNyBAQAogLyogTGludXggZHJpdmVyIGZvciBQaGlsaXBzIHdlYmNhbQogICAgRGVjb21wcmVzc2lvbiBmcm9udGVuZC4KICAgIChDKSAxOTk5LTIwMDMgTmVtb3NvZnQgVW52LgotICAgKEMpIDIwMDQgICAgICBMdWMgU2FpbGxhcmQgKGx1Y0BzYWlsbGFyZC5vcmcpCisgICAoQykgMjAwNC0yMDA2IEx1YyBTYWlsbGFyZCAobHVjQHNhaWxsYXJkLm9yZykKIAogICAgTk9URTogdGhpcyB2ZXJzaW9uIG9mIHB3YyBpcyBhbiB1bm9mZmljaWFsIChtb2RpZmllZCkgcmVsZWFzZSBvZiBwd2MgJiBwY3d4CiAgICBkcml2ZXIgYW5kIHRodXMgbWF5IGhhdmUgYnVncyB0aGF0IGFyZSBub3QgcHJlc2VudCBpbiB0aGUgb3JpZ2luYWwgdmVyc2lvbi4KQEAgLTIyLDYgKzIyLDggQEAKICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorCisgICB2aW06IHNldCB0cz04OgogKi8KIAogI2luY2x1ZGUgPGFzbS9jdXJyZW50Lmg+CkBAIC0yOSw2ICszMSw4IEBACiAKICNpbmNsdWRlICJwd2MuaCIKICNpbmNsdWRlICJwd2MtdW5jb21wcmVzcy5oIgorI2luY2x1ZGUgInB3Yy1kZWMxLmgiCisjaW5jbHVkZSAicHdjLWRlYzIzLmgiCiAKIGludCBwd2NfZGVjb21wcmVzcyhzdHJ1Y3QgcHdjX2RldmljZSAqcGRldikKIHsKQEAgLTQwLDEwNyArNDQsOTUgQEAKIAogCWlmIChwZGV2ID09IE5VTEwpCiAJCXJldHVybiAtRUZBVUxUOwotI2lmIGRlZmluZWQoX19LRVJORUxfXykgJiYgZGVmaW5lZChQV0NfTUFHSUMpCi0JaWYgKHBkZXYtPm1hZ2ljICE9IFBXQ19NQUdJQykgewotCQlFcnIoInB3Y19kZWNvbXByZXNzKCk6IG1hZ2ljIGZhaWxlZC5cbiIpOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0jZW5kaWYKIAogCWZidWYgPSBwZGV2LT5yZWFkX2ZyYW1lOwogCWlmIChmYnVmID09IE5VTEwpCiAJCXJldHVybiAtRUZBVUxUOwotCWltYWdlID0gcGRldi0+aW1hZ2VfcHRyW3BkZXYtPmZpbGxfaW1hZ2VdOwotCWlmICghaW1hZ2UpCi0JCXJldHVybiAtRUZBVUxUOworCWltYWdlICA9IHBkZXYtPmltYWdlX2RhdGE7CisJaW1hZ2UgKz0gcGRldi0+aW1hZ2VzW3BkZXYtPmZpbGxfaW1hZ2VdLm9mZnNldDsKIAogCXl1diA9IGZidWYtPmRhdGEgKyBwZGV2LT5mcmFtZV9oZWFkZXJfc2l6ZTsgIC8qIFNraXAgaGVhZGVyICovCiAKIAkvKiBSYXcgZm9ybWF0OyB0aGF0J3MgZWFzeS4uLiAqLwogCWlmIChwZGV2LT52cGFsZXR0ZSA9PSBWSURFT19QQUxFVFRFX1JBVykKIAl7Ci0JCW1lbWNweShpbWFnZSwgeXV2LCBwZGV2LT5mcmFtZV9zaXplKTsKKwkJc3RydWN0IHB3Y19yYXdfZnJhbWUgKnJhd19mcmFtZSA9IGltYWdlOworCQlyYXdfZnJhbWUtPnR5cGUgPSBjcHVfdG9fbGUxNihwZGV2LT50eXBlKTsKKwkJcmF3X2ZyYW1lLT52YmFuZGxlbmd0aCA9IGNwdV90b19sZTE2KHBkZXYtPnZiYW5kbGVuZ3RoKTsKKwkJCS8qIGNtZF9idWYgaXMgYWx3YXlzIDQgYnl0ZXMsIGJ1dCBzb21ldGltZXMsIG9ubHkgdGhlCisJCQkgKiBmaXJzdCAzIGJ5dGVzIGlzIGZpbGxlZCAoTmFsYSBjYXNlKS4gV2UgY2FuCisJCQkgKiBkZXRlcm1pbmUgdGhpcyB1c2luZyB0aGUgdHlwZSBvZiB0aGUgd2ViY2FtICovCisJCW1lbWNweShyYXdfZnJhbWUtPmNtZCwgcGRldi0+Y21kX2J1ZiwgNCk7CisJCW1lbWNweShyYXdfZnJhbWUrMSwgeXV2LCBwZGV2LT5mcmFtZV9zaXplKTsKIAkJcmV0dXJuIDA7CiAJfQogCiAJaWYgKHBkZXYtPnZiYW5kbGVuZ3RoID09IDApIHsKLQkJLyogVW5jb21wcmVzc2VkIG1vZGUuIFdlIGNvcHkgdGhlIGRhdGEgaW50byB0aGUgb3V0cHV0IGJ1ZmZlciwKLQkJICAgdXNpbmcgdGhlIHZpZXdwb3J0IHNpemUgKHdoaWNoIG1heSBiZSBsYXJnZXIgdGhhbiB0aGUgaW1hZ2UKLQkJICAgc2l6ZSkuIFVuZm9ydHVuYXRlbHkgd2UgaGF2ZSB0byBkbyBhIGJpdCBvZiBieXRlIHN0dWZmaW5nCi0JCSAgIHRvIGdldCB0aGUgZGVzaXJlZCBvdXRwdXQgZm9ybWF0L3NpemUuCisJCS8qIFVuY29tcHJlc3NlZCBtb2RlLgorCQkgKiBXZSBjb3B5IHRoZSBkYXRhIGludG8gdGhlIG91dHB1dCBidWZmZXIsIHVzaW5nIHRoZSB2aWV3cG9ydAorCQkgKiBzaXplICh3aGljaCBtYXkgYmUgbGFyZ2VyIHRoYW4gdGhlIGltYWdlIHNpemUpLgorCQkgKiBVbmZvcnR1bmF0ZWx5IHdlIGhhdmUgdG8gZG8gYSBiaXQgb2YgYnl0ZSBzdHVmZmluZyB0byBnZXQKKwkJICogdGhlIGRlc2lyZWQgb3V0cHV0IGZvcm1hdC9zaXplLgorCQkgKgorCQkgKiBXZSBkbyBzb21lIGJ5dGUgc2h1ZmZsaW5nIGhlcmUgdG8gZ28gZnJvbSB0aGUKKwkJICogbmF0aXZlIGZvcm1hdCB0byBZVVY0MjBQLgogCQkgKi8KLQkJCS8qCi0JCQkgKiBXZSBkbyBzb21lIGJ5dGUgc2h1ZmZsaW5nIGhlcmUgdG8gZ28gZnJvbSB0aGUKLQkJCSAqIG5hdGl2ZSBmb3JtYXQgdG8gWVVWNDIwUC4KLQkJCSAqLwotCQkJc3JjID0gKHUxNiAqKXl1djsKLQkJCW4gPSBwZGV2LT52aWV3LnggKiBwZGV2LT52aWV3Lnk7CisJCXNyYyA9ICh1MTYgKil5dXY7CisJCW4gPSBwZGV2LT52aWV3LnggKiBwZGV2LT52aWV3Lnk7CiAKLQkJCS8qIG9mZnNldCBpbiBZIHBsYW5lICovCi0JCQlzdHJpZGUgPSBwZGV2LT52aWV3LnggKiBwZGV2LT5vZmZzZXQueSArIHBkZXYtPm9mZnNldC54OwotCQkJZHN0eSA9ICh1MTYgKikoaW1hZ2UgKyBzdHJpZGUpOworCQkvKiBvZmZzZXQgaW4gWSBwbGFuZSAqLworCQlzdHJpZGUgPSBwZGV2LT52aWV3LnggKiBwZGV2LT5vZmZzZXQueSArIHBkZXYtPm9mZnNldC54OworCQlkc3R5ID0gKHUxNiAqKShpbWFnZSArIHN0cmlkZSk7CiAKLQkJCS8qIG9mZnNldHMgaW4gVS9WIHBsYW5lcyAqLwotCQkJc3RyaWRlID0gcGRldi0+dmlldy54ICogcGRldi0+b2Zmc2V0LnkgLyA0ICsgcGRldi0+b2Zmc2V0LnggLyAyOwotCQkJZHN0dSA9ICh1MTYgKikoaW1hZ2UgKyBuICsgICAgICAgICBzdHJpZGUpOwotCQkJZHN0diA9ICh1MTYgKikoaW1hZ2UgKyBuICsgbiAvIDQgKyBzdHJpZGUpOworCQkvKiBvZmZzZXRzIGluIFUvViBwbGFuZXMgKi8KKwkJc3RyaWRlID0gcGRldi0+dmlldy54ICogcGRldi0+b2Zmc2V0LnkgLyA0ICsgcGRldi0+b2Zmc2V0LnggLyAyOworCQlkc3R1ID0gKHUxNiAqKShpbWFnZSArIG4gKyAgICAgICAgIHN0cmlkZSk7CisJCWRzdHYgPSAodTE2ICopKGltYWdlICsgbiArIG4gLyA0ICsgc3RyaWRlKTsKIAotCQkJLyogaW5jcmVtZW50IGFmdGVyIGVhY2ggbGluZSAqLwotCQkJc3RyaWRlID0gKHBkZXYtPnZpZXcueCAtIHBkZXYtPmltYWdlLngpIC8gMjsgLyogdTE2IGlzIDIgYnl0ZXMgKi8KKwkJLyogaW5jcmVtZW50IGFmdGVyIGVhY2ggbGluZSAqLworCQlzdHJpZGUgPSAocGRldi0+dmlldy54IC0gcGRldi0+aW1hZ2UueCkgLyAyOyAvKiB1MTYgaXMgMiBieXRlcyAqLwogCi0JCQlmb3IgKGxpbmUgPSAwOyBsaW5lIDwgcGRldi0+aW1hZ2UueTsgbGluZSsrKSB7Ci0JCQkJZm9yIChjb2wgPSAwOyBjb2wgPCBwZGV2LT5pbWFnZS54OyBjb2wgKz0gNCkgewotCQkJCQkqZHN0eSsrID0gKnNyYysrOwotCQkJCQkqZHN0eSsrID0gKnNyYysrOwotCQkJCQlpZiAobGluZSAmIDEpCi0JCQkJCQkqZHN0disrID0gKnNyYysrOwotCQkJCQllbHNlCi0JCQkJCQkqZHN0dSsrID0gKnNyYysrOwotCQkJCX0KLQkJCQlkc3R5ICs9IHN0cmlkZTsKKwkJZm9yIChsaW5lID0gMDsgbGluZSA8IHBkZXYtPmltYWdlLnk7IGxpbmUrKykgeworCQkJZm9yIChjb2wgPSAwOyBjb2wgPCBwZGV2LT5pbWFnZS54OyBjb2wgKz0gNCkgeworCQkJCSpkc3R5KysgPSAqc3JjKys7CisJCQkJKmRzdHkrKyA9ICpzcmMrKzsKIAkJCQlpZiAobGluZSAmIDEpCi0JCQkJCWRzdHYgKz0gKHN0cmlkZSA+PiAxKTsKKwkJCQkJKmRzdHYrKyA9ICpzcmMrKzsKIAkJCQllbHNlCi0JCQkJCWRzdHUgKz0gKHN0cmlkZSA+PiAxKTsKKwkJCQkJKmRzdHUrKyA9ICpzcmMrKzsKIAkJCX0KKwkJCWRzdHkgKz0gc3RyaWRlOworCQkJaWYgKGxpbmUgJiAxKQorCQkJCWRzdHYgKz0gKHN0cmlkZSA+PiAxKTsKKwkJCWVsc2UKKwkJCQlkc3R1ICs9IChzdHJpZGUgPj4gMSk7CisJCX0KKworCQlyZXR1cm4gMDsKIAl9Ci0JZWxzZSB7Ci0JCS8qIENvbXByZXNzZWQ7IHRoZSBkZWNvbXByZXNzb3Igcm91dGluZXMgd2lsbCB3cml0ZSB0aGUgZGF0YQotCQkgICBpbiBwbGFuYXIgZm9ybWF0IGltbWVkaWF0ZWx5LgotCQkgKi8KLQkJaW50IGZsYWdzOwogCi0JCWZsYWdzID0gUFdDWF9GTEFHX1BMQU5BUjsKLQkJaWYgKHBkZXYtPnZzaXplID09IFBTWl9WR0EgJiYgcGRldi0+dmZyYW1lcyA9PSA1ICYmIHBkZXYtPnZzbmFwc2hvdCkKLQkJIHsKLQkJICAgcHJpbnRrKEtFUk5fRVJSICJwd2M6IE1vZGUgQmF5ZXIgaXMgbm90IHN1cHBvcnRlZCBmb3Igbm93XG4iKTsKLQkJICAgZmxhZ3MgfD0gUFdDWF9GTEFHX0JBWUVSOwotCQkgICByZXR1cm4gLUVOWElPOyAvKiBObyBzdWNoIGRldmljZSBvciBhZGRyZXNzOiBtaXNzaW5nIGRlY29tcHJlc3NvciAqLwotCQkgfQorCS8qCisJICogQ29tcHJlc3NlZDsKKwkgKiB0aGUgZGVjb21wcmVzc29yIHJvdXRpbmVzIHdpbGwgd3JpdGUgdGhlIGRhdGEgaW4gcGxhbmFyIGZvcm1hdAorCSAqIGltbWVkaWF0ZWx5LgorCSAqLworCWlmIChwZGV2LT52c2l6ZSA9PSBQU1pfVkdBICYmIHBkZXYtPnZmcmFtZXMgPT0gNSAmJiBwZGV2LT52c25hcHNob3QpIHsKKwkJUFdDX0VSUk9SKCJNb2RlIEJheWVyIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIG5vd1xuIik7CisJCS8qIGZsYWdzIHw9IFBXQ1hfRkxBR19CQVlFUjsgKi8KKwkJcmV0dXJuIC1FTlhJTzsgLyogTm8gc3VjaCBkZXZpY2Ugb3IgYWRkcmVzczogbWlzc2luZyBkZWNvbXByZXNzb3IgKi8KKwl9CiAKLSNpZiAwCi0JCXN3aXRjaCAocGRldi0+dHlwZSkKLQkJIHsKLQkJICBjYXNlIDY3NToKLQkJICBjYXNlIDY4MDoKLQkJICBjYXNlIDY5MDoKLQkJICBjYXNlIDcyMDoKLQkJICBjYXNlIDczMDoKLQkJICBjYXNlIDc0MDoKLQkJICBjYXNlIDc1MDoKLQkJICAgIHB3Y19kZWMyM19kZWNvbXByZXNzKCZwZGV2LT5pbWFnZSwgJnBkZXYtPnZpZXcsCi0JCQkJJnBkZXYtPm9mZnNldCwgeXV2LCBpbWFnZSwgZmxhZ3MsCi0JCQkJcGRldi0+ZGVjb21wcmVzc19kYXRhLCBwZGV2LT52YmFuZGxlbmd0aCk7Ci0JCSAgICBicmVhazsKLQkJICBjYXNlIDY0NToKLQkJICBjYXNlIDY0NjoKLQkJICAgIC8qIFRPRE8gJiBGSVhNRSAqLwotCQkgICAgcmV0dXJuIC1FTlhJTzsgLyogTWlzc2luZyBkZWNvbXByZXNzb3IgKi8KLQkJICAgIGJyZWFrOwotCQkgfQotI2VuZGlmCisJaWYgKERFVklDRV9VU0VfQ09ERUMxKHBkZXYtPnR5cGUpKSB7CisKKwkJLyogVE9ETyAmIEZJWE1FICovCisJCVBXQ19FUlJPUigiVGhpcyBjaGlwc2V0IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIG5vd1xuIik7CisJCXJldHVybiAtRU5YSU87IC8qIE5vIHN1Y2ggZGV2aWNlIG9yIGFkZHJlc3M6IG1pc3NpbmcgZGVjb21wcmVzc29yICovCisKKwl9IGVsc2UgeworCQlwd2NfZGVjMjNfZGVjb21wcmVzcyhwZGV2LCB5dXYsIGltYWdlLCBQV0NYX0ZMQUdfUExBTkFSKTsKIAl9CiAJcmV0dXJuIDA7CiB9CiAKIAorLyogdmltOiBzZXQgY2lubz0gZm9ybWF0b3B0aW9ucz1jcm9xbCBjaW5kZW50IHNoaWZ0d2lkdGg9OCB0YWJzdG9wPTg6ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtdW5jb21wcmVzcy5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLXVuY29tcHJlc3MuaAppbmRleCBmNzVlMWI2Li4wNDEyMjdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtdW5jb21wcmVzcy5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy11bmNvbXByZXNzLmgKQEAgLTEsNSArMSw1IEBACiAvKiAoQykgMTk5OS0yMDAzIE5lbW9zb2Z0IFVudi4KLSAgIChDKSAyMDA0ICAgICAgTHVjIFNhaWxsYXJkIChsdWNAc2FpbGxhcmQub3JnKQorICAgKEMpIDIwMDQtMjAwNiBMdWMgU2FpbGxhcmQgKGx1Y0BzYWlsbGFyZC5vcmcpCiAKICAgIE5PVEU6IHRoaXMgdmVyc2lvbiBvZiBwd2MgaXMgYW4gdW5vZmZpY2lhbCAobW9kaWZpZWQpIHJlbGVhc2Ugb2YgcHdjICYgcGN3eAogICAgZHJpdmVyIGFuZCB0aHVzIG1heSBoYXZlIGJ1Z3MgdGhhdCBhcmUgbm90IHByZXNlbnQgaW4gdGhlIG9yaWdpbmFsIHZlcnNpb24uCkBAIC0zMiw3ICszMiw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KIAotI2luY2x1ZGUgInB3Yy1pb2N0bC5oIgorI2luY2x1ZGUgPG1lZGlhL3B3Yy1pb2N0bC5oPgogCiAvKiBmcm9tIHB3Yy1kZWMuaCAqLwogI2RlZmluZSBQV0NYX0ZMQUdfUExBTkFSICAgICAgICAweDAwMDEKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy12NGwuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy12NGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2ViM2NlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLXY0bC5jCkBAIC0wLDAgKzEsMTIwMiBAQAorLyogTGludXggZHJpdmVyIGZvciBQaGlsaXBzIHdlYmNhbQorICAgVVNCIGFuZCBWaWRlbzRMaW51eCBpbnRlcmZhY2UgcGFydC4KKyAgIChDKSAxOTk5LTIwMDQgTmVtb3NvZnQgVW52LgorICAgKEMpIDIwMDQtMjAwNiBMdWMgU2FpbGxhcmQgKGx1Y0BzYWlsbGFyZC5vcmcpCisKKyAgIE5PVEU6IHRoaXMgdmVyc2lvbiBvZiBwd2MgaXMgYW4gdW5vZmZpY2lhbCAobW9kaWZpZWQpIHJlbGVhc2Ugb2YgcHdjICYgcGN3eAorICAgZHJpdmVyIGFuZCB0aHVzIG1heSBoYXZlIGJ1Z3MgdGhhdCBhcmUgbm90IHByZXNlbnQgaW4gdGhlIG9yaWdpbmFsIHZlcnNpb24uCisgICBQbGVhc2Ugc2VuZCBidWcgcmVwb3J0cyBhbmQgc3VwcG9ydCByZXF1ZXN0cyB0byA8bHVjQHNhaWxsYXJkLm9yZz4uCisgICBUaGUgZGVjb21wcmVzc2lvbiByb3V0aW5lcyBoYXZlIGJlZW4gaW1wbGVtZW50ZWQgYnkgcmV2ZXJzZS1lbmdpbmVlcmluZyB0aGUKKyAgIE5lbW9zb2Z0IGJpbmFyeSBwd2N4IG1vZHVsZS4gQ2F2ZWF0IGVtcHRvci4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKyovCisKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSAicHdjLmgiCisKK3N0YXRpYyBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgcHdjX2NvbnRyb2xzW10gPSB7CisJeworCSAgICAuaWQgICAgICA9IFY0TDJfQ0lEX0JSSUdIVE5FU1MsCisJICAgIC50eXBlICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkgICAgLm5hbWUgICAgPSAiQnJpZ2h0bmVzcyIsCisJICAgIC5taW5pbXVtID0gMCwKKwkgICAgLm1heGltdW0gPSAxMjgsCisJICAgIC5zdGVwICAgID0gMSwKKwkgICAgLmRlZmF1bHRfdmFsdWUgPSA2NCwKKwl9LAorCXsKKwkgICAgLmlkICAgICAgPSBWNEwyX0NJRF9DT05UUkFTVCwKKwkgICAgLnR5cGUgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCSAgICAubmFtZSAgICA9ICJDb250cmFzdCIsCisJICAgIC5taW5pbXVtID0gMCwKKwkgICAgLm1heGltdW0gPSA2NCwKKwkgICAgLnN0ZXAgICAgPSAxLAorCSAgICAuZGVmYXVsdF92YWx1ZSA9IDAsCisJfSwKKwl7CisJICAgIC5pZCAgICAgID0gVjRMMl9DSURfU0FUVVJBVElPTiwKKwkgICAgLnR5cGUgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCSAgICAubmFtZSAgICA9ICJTYXR1cmF0aW9uIiwKKwkgICAgLm1pbmltdW0gPSAtMTAwLAorCSAgICAubWF4aW11bSA9IDEwMCwKKwkgICAgLnN0ZXAgICAgPSAxLAorCSAgICAuZGVmYXVsdF92YWx1ZSA9IDAsCisJfSwKKwl7CisJICAgIC5pZCAgICAgID0gVjRMMl9DSURfR0FNTUEsCisJICAgIC50eXBlICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkgICAgLm5hbWUgICAgPSAiR2FtbWEiLAorCSAgICAubWluaW11bSA9IDAsCisJICAgIC5tYXhpbXVtID0gMzIsCisJICAgIC5zdGVwICAgID0gMSwKKwkgICAgLmRlZmF1bHRfdmFsdWUgPSAwLAorCX0sCisJeworCSAgICAuaWQgICAgICA9IFY0TDJfQ0lEX1JFRF9CQUxBTkNFLAorCSAgICAudHlwZSAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJICAgIC5uYW1lICAgID0gIlJlZCBHYWluIiwKKwkgICAgLm1pbmltdW0gPSAwLAorCSAgICAubWF4aW11bSA9IDI1NiwKKwkgICAgLnN0ZXAgICAgPSAxLAorCSAgICAuZGVmYXVsdF92YWx1ZSA9IDAsCisJfSwKKwl7CisJICAgIC5pZCAgICAgID0gVjRMMl9DSURfQkxVRV9CQUxBTkNFLAorCSAgICAudHlwZSAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJICAgIC5uYW1lICAgID0gIkJsdWUgR2FpbiIsCisJICAgIC5taW5pbXVtID0gMCwKKwkgICAgLm1heGltdW0gPSAyNTYsCisJICAgIC5zdGVwICAgID0gMSwKKwkgICAgLmRlZmF1bHRfdmFsdWUgPSAwLAorCX0sCisJeworCSAgICAuaWQgICAgICA9IFY0TDJfQ0lEX0FVVE9fV0hJVEVfQkFMQU5DRSwKKwkgICAgLnR5cGUgICAgPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAorCSAgICAubmFtZSAgICA9ICJBdXRvIFdoaXRlIEJhbGFuY2UiLAorCSAgICAubWluaW11bSA9IDAsCisJICAgIC5tYXhpbXVtID0gMSwKKwkgICAgLnN0ZXAgICAgPSAxLAorCSAgICAuZGVmYXVsdF92YWx1ZSA9IDAsCisJfSwKKwl7CisJICAgIC5pZCAgICAgID0gVjRMMl9DSURfRVhQT1NVUkUsCisJICAgIC50eXBlICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkgICAgLm5hbWUgICAgPSAiU2h1dHRlciBTcGVlZCAoRXhwb3N1cmUpIiwKKwkgICAgLm1pbmltdW0gPSAwLAorCSAgICAubWF4aW11bSA9IDI1NiwKKwkgICAgLnN0ZXAgICAgPSAxLAorCSAgICAuZGVmYXVsdF92YWx1ZSA9IDIwMCwKKwl9LAorCXsKKwkgICAgLmlkICAgICAgPSBWNEwyX0NJRF9BVVRPR0FJTiwKKwkgICAgLnR5cGUgICAgPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAorCSAgICAubmFtZSAgICA9ICJBdXRvIEdhaW4gRW5hYmxlZCIsCisJICAgIC5taW5pbXVtID0gMCwKKwkgICAgLm1heGltdW0gPSAxLAorCSAgICAuc3RlcCAgICA9IDEsCisJICAgIC5kZWZhdWx0X3ZhbHVlID0gMSwKKwl9LAorCXsKKwkgICAgLmlkICAgICAgPSBWNEwyX0NJRF9HQUlOLAorCSAgICAudHlwZSAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJICAgIC5uYW1lICAgID0gIkdhaW4gTGV2ZWwiLAorCSAgICAubWluaW11bSA9IDAsCisJICAgIC5tYXhpbXVtID0gMjU2LAorCSAgICAuc3RlcCAgICA9IDEsCisJICAgIC5kZWZhdWx0X3ZhbHVlID0gMCwKKwl9LAorCXsKKwkgICAgLmlkICAgICAgPSBWNEwyX0NJRF9QUklWQVRFX1NBVkVfVVNFUiwKKwkgICAgLnR5cGUgICAgPSBWNEwyX0NUUkxfVFlQRV9CVVRUT04sCisJICAgIC5uYW1lICAgID0gIlNhdmUgVXNlciBTZXR0aW5ncyIsCisJICAgIC5taW5pbXVtID0gMCwKKwkgICAgLm1heGltdW0gPSAwLAorCSAgICAuc3RlcCAgICA9IDAsCisJICAgIC5kZWZhdWx0X3ZhbHVlID0gMCwKKwl9LAorCXsKKwkgICAgLmlkICAgICAgPSBWNEwyX0NJRF9QUklWQVRFX1JFU1RPUkVfVVNFUiwKKwkgICAgLnR5cGUgICAgPSBWNEwyX0NUUkxfVFlQRV9CVVRUT04sCisJICAgIC5uYW1lICAgID0gIlJlc3RvcmUgVXNlciBTZXR0aW5ncyIsCisJICAgIC5taW5pbXVtID0gMCwKKwkgICAgLm1heGltdW0gPSAwLAorCSAgICAuc3RlcCAgICA9IDAsCisJICAgIC5kZWZhdWx0X3ZhbHVlID0gMCwKKwl9LAorCXsKKwkgICAgLmlkICAgICAgPSBWNEwyX0NJRF9QUklWQVRFX1JFU1RPUkVfRkFDVE9SWSwKKwkgICAgLnR5cGUgICAgPSBWNEwyX0NUUkxfVFlQRV9CVVRUT04sCisJICAgIC5uYW1lICAgID0gIlJlc3RvcmUgRmFjdG9yeSBTZXR0aW5ncyIsCisJICAgIC5taW5pbXVtID0gMCwKKwkgICAgLm1heGltdW0gPSAwLAorCSAgICAuc3RlcCAgICA9IDAsCisJICAgIC5kZWZhdWx0X3ZhbHVlID0gMCwKKwl9LAorCXsKKwkgICAgLmlkICAgICAgPSBWNEwyX0NJRF9QUklWQVRFX0NPTE9VUl9NT0RFLAorCSAgICAudHlwZSAgICA9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCisJICAgIC5uYW1lICAgID0gIkNvbG91ciBtb2RlIiwKKwkgICAgLm1pbmltdW0gPSAwLAorCSAgICAubWF4aW11bSA9IDEsCisJICAgIC5zdGVwICAgID0gMSwKKwkgICAgLmRlZmF1bHRfdmFsdWUgPSAwLAorCX0sCisJeworCSAgICAuaWQgICAgICA9IFY0TDJfQ0lEX1BSSVZBVEVfQVVUT0NPTlRPVVIsCisJICAgIC50eXBlICAgID0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKKwkgICAgLm5hbWUgICAgPSAiQXV0byBjb250b3VyIiwKKwkgICAgLm1pbmltdW0gPSAwLAorCSAgICAubWF4aW11bSA9IDEsCisJICAgIC5zdGVwICAgID0gMSwKKwkgICAgLmRlZmF1bHRfdmFsdWUgPSAwLAorCX0sCisJeworCSAgICAuaWQgICAgICA9IFY0TDJfQ0lEX1BSSVZBVEVfQ09OVE9VUiwKKwkgICAgLnR5cGUgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCSAgICAubmFtZSAgICA9ICJDb250b3VyIiwKKwkgICAgLm1pbmltdW0gPSAwLAorCSAgICAubWF4aW11bSA9IDYzLAorCSAgICAuc3RlcCAgICA9IDEsCisJICAgIC5kZWZhdWx0X3ZhbHVlID0gMCwKKwl9LAorCXsKKwkgICAgLmlkICAgICAgPSBWNEwyX0NJRF9QUklWQVRFX0JBQ0tMSUdIVCwKKwkgICAgLnR5cGUgICAgPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAorCSAgICAubmFtZSAgICA9ICJCYWNrbGlnaHQgY29tcGVuc2F0aW9uIiwKKwkgICAgLm1pbmltdW0gPSAwLAorCSAgICAubWF4aW11bSA9IDEsCisJICAgIC5zdGVwICAgID0gMSwKKwkgICAgLmRlZmF1bHRfdmFsdWUgPSAwLAorCX0sCisJeworCSAgLmlkICAgICAgPSBWNEwyX0NJRF9QUklWQVRFX0ZMSUNLRVJMRVNTLAorCSAgICAudHlwZSAgICA9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCisJICAgIC5uYW1lICAgID0gIkZsaWNrZXJsZXNzIiwKKwkgICAgLm1pbmltdW0gPSAwLAorCSAgICAubWF4aW11bSA9IDEsCisJICAgIC5zdGVwICAgID0gMSwKKwkgICAgLmRlZmF1bHRfdmFsdWUgPSAwLAorCX0sCisJeworCSAgICAuaWQgICAgICA9IFY0TDJfQ0lEX1BSSVZBVEVfTk9JU0VfUkVEVUNUSU9OLAorCSAgICAudHlwZSAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJICAgIC5uYW1lICAgID0gIk5vaXNlIHJlZHVjdGlvbiIsCisJICAgIC5taW5pbXVtID0gMCwKKwkgICAgLm1heGltdW0gPSAzLAorCSAgICAuc3RlcCAgICA9IDEsCisJICAgIC5kZWZhdWx0X3ZhbHVlID0gMCwKKwl9LAorfTsKKworCitzdGF0aWMgdm9pZCBwd2NfdmlkaW9jX2ZpbGxfZm10KGNvbnN0IHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCit7CisJbWVtc2V0KCZmLT5mbXQucGl4LCAwLCBzaXplb2Yoc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCkpOworCWYtPmZtdC5waXgud2lkdGggICAgICAgID0gcGRldi0+dmlldy54OworCWYtPmZtdC5waXguaGVpZ2h0ICAgICAgID0gcGRldi0+dmlldy55OworCWYtPmZtdC5waXguZmllbGQgICAgICAgID0gVjRMMl9GSUVMRF9OT05FOworCWlmIChwZGV2LT52cGFsZXR0ZSA9PSBWSURFT19QQUxFVFRFX1lVVjQyMFApIHsKKwkJZi0+Zm10LnBpeC5waXhlbGZvcm1hdCAgPSBWNEwyX1BJWF9GTVRfWVVWNDIwOworCQlmLT5mbXQucGl4LmJ5dGVzcGVybGluZSA9IChmLT5mbXQucGl4LndpZHRoICogMykvMjsKKwkJZi0+Zm10LnBpeC5zaXplaW1hZ2UgPSBmLT5mbXQucGl4LmhlaWdodCAqIGYtPmZtdC5waXguYnl0ZXNwZXJsaW5lOworCX0gZWxzZSB7CisJCS8qIHZiYW5kbGVuZ3RoIGNvbnRhaW5zIDQgbGluZXMgLi4uICAqLworCQlmLT5mbXQucGl4LmJ5dGVzcGVybGluZSA9IHBkZXYtPnZiYW5kbGVuZ3RoLzQ7CisJCWYtPmZtdC5waXguc2l6ZWltYWdlID0gcGRldi0+ZnJhbWVfc2l6ZSArIHNpemVvZihzdHJ1Y3QgcHdjX3Jhd19mcmFtZSk7CisJCWlmIChERVZJQ0VfVVNFX0NPREVDMShwZGV2LT50eXBlKSkKKwkJCWYtPmZtdC5waXgucGl4ZWxmb3JtYXQgID0gVjRMMl9QSVhfRk1UX1BXQzE7CisJCWVsc2UKKwkJCWYtPmZtdC5waXgucGl4ZWxmb3JtYXQgID0gVjRMMl9QSVhfRk1UX1BXQzI7CisJfQorCVBXQ19ERUJVR19JT0NUTCgicHdjX3ZpZGlvY19maWxsX2ZtdCgpICIKKwkJCSJ3aWR0aD0lZCwgaGVpZ2h0PSVkLCBieXRlc3BlcmxpbmU9JWQsIHNpemVpbWFnZT0lZCwgcGl4ZWxmb3JtYXQ9JWMlYyVjJWNcbiIsCisJCQlmLT5mbXQucGl4LndpZHRoLAorCQkJZi0+Zm10LnBpeC5oZWlnaHQsCisJCQlmLT5mbXQucGl4LmJ5dGVzcGVybGluZSwKKwkJCWYtPmZtdC5waXguc2l6ZWltYWdlLAorCQkJKGYtPmZtdC5waXgucGl4ZWxmb3JtYXQpJjI1NSwKKwkJCShmLT5mbXQucGl4LnBpeGVsZm9ybWF0Pj44KSYyNTUsCisJCQkoZi0+Zm10LnBpeC5waXhlbGZvcm1hdD4+MTYpJjI1NSwKKwkJCShmLT5mbXQucGl4LnBpeGVsZm9ybWF0Pj4yNCkmMjU1KTsKK30KKworLyogaW9jdGwoVklESU9DX1RSWV9GTVQpICovCitzdGF0aWMgaW50IHB3Y192aWRpb2NfdHJ5X2ZtdChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgc3RydWN0IHY0bDJfZm9ybWF0ICpmKQoreworCWlmIChmLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkgeworCQlQV0NfREVCVUdfSU9DVEwoIkJhZCB2aWRlbyB0eXBlIG11c3QgYmUgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3dpdGNoIChmLT5mbXQucGl4LnBpeGVsZm9ybWF0KSB7CisJCWNhc2UgVjRMMl9QSVhfRk1UX1lVVjQyMDoKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfUElYX0ZNVF9QV0MxOgorCQkJaWYgKERFVklDRV9VU0VfQ09ERUMyMyhwZGV2LT50eXBlKSkgeworCQkJCVBXQ19ERUJVR19JT0NUTCgiY29kZWMxIGlzIG9ubHkgc3VwcG9ydGVkIGZvciBvbGQgcHdjIHdlYmNhbVxuIik7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX1BJWF9GTVRfUFdDMjoKKwkJCWlmIChERVZJQ0VfVVNFX0NPREVDMShwZGV2LT50eXBlKSkgeworCQkJCVBXQ19ERUJVR19JT0NUTCgiY29kZWMyMyBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgbmV3IHB3YyB3ZWJjYW1cbiIpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlQV0NfREVCVUdfSU9DVEwoIlVuc3VwcG9ydGVkIHBpeGVsIGZvcm1hdFxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKworCX0KKworCWlmIChmLT5mbXQucGl4LndpZHRoID4gcGRldi0+dmlld19tYXgueCkKKwkJZi0+Zm10LnBpeC53aWR0aCA9IHBkZXYtPnZpZXdfbWF4Lng7CisJZWxzZSBpZiAoZi0+Zm10LnBpeC53aWR0aCA8IHBkZXYtPnZpZXdfbWluLngpCisJCWYtPmZtdC5waXgud2lkdGggPSBwZGV2LT52aWV3X21pbi54OworCisJaWYgKGYtPmZtdC5waXguaGVpZ2h0ID4gcGRldi0+dmlld19tYXgueSkKKwkJZi0+Zm10LnBpeC5oZWlnaHQgPSBwZGV2LT52aWV3X21heC55OworCWVsc2UgaWYgKGYtPmZtdC5waXguaGVpZ2h0IDwgcGRldi0+dmlld19taW4ueSkKKwkJZi0+Zm10LnBpeC5oZWlnaHQgPSBwZGV2LT52aWV3X21pbi55OworCisJcmV0dXJuIDA7Cit9CisKKy8qIGlvY3RsKFZJRElPQ19TRVRfRk1UKSAqLworc3RhdGljIGludCBwd2NfdmlkaW9jX3NldF9mbXQoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKK3sKKwlpbnQgcmV0LCBmcHMsIHNuYXBzaG90LCBjb21wcmVzc2lvbiwgcGl4ZWxmb3JtYXQ7CisKKwlyZXQgPSBwd2NfdmlkaW9jX3RyeV9mbXQocGRldiwgZik7CisJaWYgKHJldDwwKQorCQlyZXR1cm4gcmV0OworCisJcGl4ZWxmb3JtYXQgPSBmLT5mbXQucGl4LnBpeGVsZm9ybWF0OworCWNvbXByZXNzaW9uID0gcGRldi0+dmNvbXByZXNzaW9uOworCXNuYXBzaG90ID0gMDsKKwlmcHMgPSBwZGV2LT52ZnJhbWVzOworCWlmIChmLT5mbXQucGl4LnByaXYpIHsKKwkJY29tcHJlc3Npb24gPSAoZi0+Zm10LnBpeC5wcml2ICYgUFdDX1FMVF9NQVNLKSA+PiBQV0NfUUxUX1NISUZUOworCQlzbmFwc2hvdCA9ICEhKGYtPmZtdC5waXgucHJpdiAmIFBXQ19GUFNfU05BUFNIT1QpOworCQlmcHMgPSAoZi0+Zm10LnBpeC5wcml2ICYgUFdDX0ZQU19GUk1BU0spID4+IFBXQ19GUFNfU0hJRlQ7CisJCWlmIChmcHMgPT0gMCkKKwkJCWZwcyA9IHBkZXYtPnZmcmFtZXM7CisJfQorCisJaWYgKHBpeGVsZm9ybWF0ID09IFY0TDJfUElYX0ZNVF9ZVVY0MjApCisJCXBkZXYtPnZwYWxldHRlID0gVklERU9fUEFMRVRURV9ZVVY0MjBQOworCWVsc2UKKwkJcGRldi0+dnBhbGV0dGUgPSBWSURFT19QQUxFVFRFX1JBVzsKKworCVBXQ19ERUJVR19JT0NUTCgiVHJ5IHRvIGNoYW5nZSBmb3JtYXQgdG86IHdpZHRoPSVkIGhlaWdodD0lZCBmcHM9JWQgIgorCQkJImNvbXByZXNzaW9uPSVkIHNuYXBzaG90PSVkIGZvcm1hdD0lYyVjJWMlY1xuIiwKKwkJCWYtPmZtdC5waXgud2lkdGgsIGYtPmZtdC5waXguaGVpZ2h0LCBmcHMsCisJCQljb21wcmVzc2lvbiwgc25hcHNob3QsCisJCQkocGl4ZWxmb3JtYXQpJjI1NSwKKwkJCShwaXhlbGZvcm1hdD4+OCkmMjU1LAorCQkJKHBpeGVsZm9ybWF0Pj4xNikmMjU1LAorCQkJKHBpeGVsZm9ybWF0Pj4yNCkmMjU1KTsKKworCXJldCA9IHB3Y190cnlfdmlkZW9fbW9kZShwZGV2LAorCQkJCSBmLT5mbXQucGl4LndpZHRoLAorCQkJCSBmLT5mbXQucGl4LmhlaWdodCwKKwkJCQkgZnBzLAorCQkJCSBjb21wcmVzc2lvbiwKKwkJCQkgc25hcHNob3QpOworCisJUFdDX0RFQlVHX0lPQ1RMKCJwd2NfdHJ5X3ZpZGVvX21vZGUoKSwgcmV0dXJuPSVkXG4iLCByZXQpOworCisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXB3Y192aWRpb2NfZmlsbF9mbXQocGRldiwgZik7CisKKwlyZXR1cm4gMDsKKworfQorCitpbnQgcHdjX3ZpZGVvX2RvX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQoreworCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOworCXN0cnVjdCBwd2NfZGV2aWNlICpwZGV2OworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCisJaWYgKHZkZXYgPT0gTlVMTCkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcGRldiA9IHZkZXYtPnByaXY7CisJaWYgKHBkZXYgPT0gTlVMTCkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKyNpZiBDT05GSUdfUFdDX0RFQlVHCisJaWYgKFBXQ19ERUJVR19MRVZFTF9JT0NUTCAmIHB3Y190cmFjZSkKKwkJdjRsX3ByaW50a19pb2N0bChjbWQpOworI2VuZGlmCisKKworCXN3aXRjaCAoY21kKSB7CisJCS8qIFF1ZXJ5IGNhYmFwaWxpdGllcyAqLworCQljYXNlIFZJRElPQ0dDQVA6CisJCXsKKwkJCXN0cnVjdCB2aWRlb19jYXBhYmlsaXR5ICpjYXBzID0gYXJnOworCisJCQlzdHJjcHkoY2Fwcy0+bmFtZSwgdmRldi0+bmFtZSk7CisJCQljYXBzLT50eXBlID0gVklEX1RZUEVfQ0FQVFVSRTsKKwkJCWNhcHMtPmNoYW5uZWxzID0gMTsKKwkJCWNhcHMtPmF1ZGlvcyA9IDE7CisJCQljYXBzLT5taW53aWR0aCAgPSBwZGV2LT52aWV3X21pbi54OworCQkJY2Fwcy0+bWluaGVpZ2h0ID0gcGRldi0+dmlld19taW4ueTsKKwkJCWNhcHMtPm1heHdpZHRoICA9IHBkZXYtPnZpZXdfbWF4Lng7CisJCQljYXBzLT5tYXhoZWlnaHQgPSBwZGV2LT52aWV3X21heC55OworCQkJYnJlYWs7CisJCX0KKworCQkvKiBDaGFubmVsIGZ1bmN0aW9ucyAoc2ltdWxhdGUgMSBjaGFubmVsKSAqLworCQljYXNlIFZJRElPQ0dDSEFOOgorCQl7CisJCQlzdHJ1Y3QgdmlkZW9fY2hhbm5lbCAqdiA9IGFyZzsKKworCQkJaWYgKHYtPmNoYW5uZWwgIT0gMCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXYtPmZsYWdzID0gMDsKKwkJCXYtPnR1bmVycyA9IDA7CisJCQl2LT50eXBlID0gVklERU9fVFlQRV9DQU1FUkE7CisJCQlzdHJjcHkodi0+bmFtZSwgIldlYmNhbSIpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQljYXNlIFZJRElPQ1NDSEFOOgorCQl7CisJCQkvKiBUaGUgc3BlYyBzYXlzIHRoZSBhcmd1bWVudCBpcyBhbiBpbnRlZ2VyLCBidXQKKwkJCSAgIHRoZSBidHR2IGRyaXZlciB1c2VzIGEgdmlkZW9fY2hhbm5lbCBhcmcsIHdoaWNoCisJCQkgICBtYWtlcyBzZW5zZSBiZWNhc3VlIGl0IGFsc28gaGFzIHRoZSBub3JtIGZsYWcuCisJCQkgKi8KKwkJCXN0cnVjdCB2aWRlb19jaGFubmVsICp2ID0gYXJnOworCQkJaWYgKHYtPmNoYW5uZWwgIT0gMCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXJldHVybiAwOworCQl9CisKKworCQkvKiBQaWN0dXJlIGZ1bmN0aW9uczsgY29udHJhc3QgZXRjLiAqLworCQljYXNlIFZJRElPQ0dQSUNUOgorCQl7CisJCQlzdHJ1Y3QgdmlkZW9fcGljdHVyZSAqcCA9IGFyZzsKKwkJCWludCB2YWw7CisKKwkJCXZhbCA9IHB3Y19nZXRfYnJpZ2h0bmVzcyhwZGV2KTsKKwkJCWlmICh2YWwgPj0gMCkKKwkJCQlwLT5icmlnaHRuZXNzID0gKHZhbDw8OSk7CisJCQllbHNlCisJCQkJcC0+YnJpZ2h0bmVzcyA9IDB4ZmZmZjsKKwkJCXZhbCA9IHB3Y19nZXRfY29udHJhc3QocGRldik7CisJCQlpZiAodmFsID49IDApCisJCQkJcC0+Y29udHJhc3QgPSAodmFsPDwxMCk7CisJCQllbHNlCisJCQkJcC0+Y29udHJhc3QgPSAweGZmZmY7CisJCQkvKiBHYW1tYSwgV2hpdGVuZXNzLCB3aGF0J3MgdGhlIGRpZmZlcmVuY2U/IDopICovCisJCQl2YWwgPSBwd2NfZ2V0X2dhbW1hKHBkZXYpOworCQkJaWYgKHZhbCA+PSAwKQorCQkJCXAtPndoaXRlbmVzcyA9ICh2YWw8PDExKTsKKwkJCWVsc2UKKwkJCQlwLT53aGl0ZW5lc3MgPSAweGZmZmY7CisJCQlpZiAocHdjX2dldF9zYXR1cmF0aW9uKHBkZXYsICZ2YWwpPDApCisJCQkJcC0+Y29sb3VyID0gMHhmZmZmOworCQkJZWxzZQorCQkJCXAtPmNvbG91ciA9IDMyNzY4ICsgdmFsICogMzI3OworCQkJcC0+ZGVwdGggPSAyNDsKKwkJCXAtPnBhbGV0dGUgPSBwZGV2LT52cGFsZXR0ZTsKKwkJCXAtPmh1ZSA9IDB4RkZGRjsgLyogTi9BICovCisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgVklESU9DU1BJQ1Q6CisJCXsKKwkJCXN0cnVjdCB2aWRlb19waWN0dXJlICpwID0gYXJnOworCQkJLyoKKwkJCSAqCUZJWE1FOglTdXBwb3NlIHdlIGFyZSBtaWQgcmVhZAorCQkJCUFOU1dFUjogTm8gcHJvYmxlbTogdGhlIGZpcm13YXJlIG9mIHRoZSBjYW1lcmEKKwkJCQkJY2FuIGhhbmRsZSBicmlnaHRuZXNzL2NvbnRyYXN0L2V0YworCQkJCQljaGFuZ2VzIGF0IF9hbnlfIHRpbWUsIGFuZCB0aGUgcGFsZXR0ZQorCQkJCQlpcyB1c2VkIGV4YWN0bHkgb25jZSBpbiB0aGUgdW5jb21wcmVzcworCQkJCQlyb3V0aW5lLgorCQkJICovCisJCQlwd2Nfc2V0X2JyaWdodG5lc3MocGRldiwgcC0+YnJpZ2h0bmVzcyk7CisJCQlwd2Nfc2V0X2NvbnRyYXN0KHBkZXYsIHAtPmNvbnRyYXN0KTsKKwkJCXB3Y19zZXRfZ2FtbWEocGRldiwgcC0+d2hpdGVuZXNzKTsKKwkJCXB3Y19zZXRfc2F0dXJhdGlvbihwZGV2LCAocC0+Y29sb3VyLTMyNzY4KS8zMjcpOworCQkJaWYgKHAtPnBhbGV0dGUgJiYgcC0+cGFsZXR0ZSAhPSBwZGV2LT52cGFsZXR0ZSkgeworCQkJCXN3aXRjaCAocC0+cGFsZXR0ZSkgeworCQkJCQljYXNlIFZJREVPX1BBTEVUVEVfWVVWNDIwUDoKKwkJCQkJY2FzZSBWSURFT19QQUxFVFRFX1JBVzoKKwkJCQkJCXBkZXYtPnZwYWxldHRlID0gcC0+cGFsZXR0ZTsKKwkJCQkJCXJldHVybiBwd2NfdHJ5X3ZpZGVvX21vZGUocGRldiwgcGRldi0+aW1hZ2UueCwgcGRldi0+aW1hZ2UueSwgcGRldi0+dmZyYW1lcywgcGRldi0+dmNvbXByZXNzaW9uLCBwZGV2LT52c25hcHNob3QpOworCQkJCQkJYnJlYWs7CisJCQkJCWRlZmF1bHQ6CisJCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwkJLyogV2luZG93L3NpemUgcGFyYW1ldGVycyAqLworCQljYXNlIFZJRElPQ0dXSU46CisJCXsKKwkJCXN0cnVjdCB2aWRlb193aW5kb3cgKnZ3ID0gYXJnOworCisJCQl2dy0+eCA9IDA7CisJCQl2dy0+eSA9IDA7CisJCQl2dy0+d2lkdGggPSBwZGV2LT52aWV3Lng7CisJCQl2dy0+aGVpZ2h0ID0gcGRldi0+dmlldy55OworCQkJdnctPmNocm9tYWtleSA9IDA7CisJCQl2dy0+ZmxhZ3MgPSAocGRldi0+dmZyYW1lcyA8PCBQV0NfRlBTX1NISUZUKSB8CisJCQkJICAgKHBkZXYtPnZzbmFwc2hvdCA/IFBXQ19GUFNfU05BUFNIT1QgOiAwKTsKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBWSURJT0NTV0lOOgorCQl7CisJCQlzdHJ1Y3QgdmlkZW9fd2luZG93ICp2dyA9IGFyZzsKKwkJCWludCBmcHMsIHNuYXBzaG90LCByZXQ7CisKKwkJCWZwcyA9ICh2dy0+ZmxhZ3MgJiBQV0NfRlBTX0ZSTUFTSykgPj4gUFdDX0ZQU19TSElGVDsKKwkJCXNuYXBzaG90ID0gdnctPmZsYWdzICYgUFdDX0ZQU19TTkFQU0hPVDsKKwkJCWlmIChmcHMgPT0gMCkKKwkJCQlmcHMgPSBwZGV2LT52ZnJhbWVzOworCQkJaWYgKHBkZXYtPnZpZXcueCA9PSB2dy0+d2lkdGggJiYgcGRldi0+dmlldy55ICYmIGZwcyA9PSBwZGV2LT52ZnJhbWVzICYmIHNuYXBzaG90ID09IHBkZXYtPnZzbmFwc2hvdCkKKwkJCQlyZXR1cm4gMDsKKwkJCXJldCA9IHB3Y190cnlfdmlkZW9fbW9kZShwZGV2LCB2dy0+d2lkdGgsIHZ3LT5oZWlnaHQsIGZwcywgcGRldi0+dmNvbXByZXNzaW9uLCBzbmFwc2hvdCk7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CisJCQlicmVhazsKKwkJfQorCisJCS8qIFdlIGRvbid0IGhhdmUgb3ZlcmxheSBzdXBwb3J0ICh5ZXQpICovCisJCWNhc2UgVklESU9DR0ZCVUY6CisJCXsKKwkJCXN0cnVjdCB2aWRlb19idWZmZXIgKnZiID0gYXJnOworCisJCQltZW1zZXQodmIsMCxzaXplb2YoKnZiKSk7CisJCQlicmVhazsKKwkJfQorCisJCS8qIG1tYXAoKSBmdW5jdGlvbnMgKi8KKwkJY2FzZSBWSURJT0NHTUJVRjoKKwkJeworCQkJLyogVGVsbCB0aGUgdXNlciBwcm9ncmFtIGhvdyBtdWNoIG1lbW9yeSBpcyBuZWVkZWQgZm9yIGEgbW1hcCgpICovCisJCQlzdHJ1Y3QgdmlkZW9fbWJ1ZiAqdm0gPSBhcmc7CisJCQlpbnQgaTsKKworCQkJbWVtc2V0KHZtLCAwLCBzaXplb2YoKnZtKSk7CisJCQl2bS0+c2l6ZSA9IHB3Y19tYnVmcyAqIHBkZXYtPmxlbl9wZXJfaW1hZ2U7CisJCQl2bS0+ZnJhbWVzID0gcHdjX21idWZzOyAvKiBkb3VibGUgYnVmZmVyaW5nIHNob3VsZCBiZSBlbm91Z2ggZm9yIG1vc3QgYXBwbGljYXRpb25zICovCisJCQlmb3IgKGkgPSAwOyBpIDwgcHdjX21idWZzOyBpKyspCisJCQkJdm0tPm9mZnNldHNbaV0gPSBpICogcGRldi0+bGVuX3Blcl9pbWFnZTsKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBWSURJT0NNQ0FQVFVSRToKKwkJeworCQkJLyogU3RhcnQgY2FwdHVyZSBpbnRvIGEgZ2l2ZW4gaW1hZ2UgYnVmZmVyIChjYWxsZWQgJ2ZyYW1lJyBpbiB2aWRlb19tbWFwIHN0cnVjdHVyZSkgKi8KKwkJCXN0cnVjdCB2aWRlb19tbWFwICp2bSA9IGFyZzsKKworCQkJUFdDX0RFQlVHX1JFQUQoIlZJRElPQ01DQVBUVVJFOiAlZHglZCwgZnJhbWUgJWQsIGZvcm1hdCAlZFxuIiwgdm0tPndpZHRoLCB2bS0+aGVpZ2h0LCB2bS0+ZnJhbWUsIHZtLT5mb3JtYXQpOworCQkJaWYgKHZtLT5mcmFtZSA8IDAgfHwgdm0tPmZyYW1lID49IHB3Y19tYnVmcykKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJLyogeGF3dHYgaXMgbmFzdHkuIEl0IHByb2JlcyB0aGUgYXZhaWxhYmxlIHBhbGV0dGVzCisJCQkgICBieSBzZXR0aW5nIGEgdmVyeSBzbWFsbCBpbWFnZSBzaXplIGFuZCB0cnlpbmcKKwkJCSAgIHZhcmlvdXMgcGFsZXR0ZXMuLi4gVGhlIGRyaXZlciBkb2Vzbid0IHN1cHBvcnQKKwkJCSAgIHN1Y2ggc21hbGwgaW1hZ2VzLCBzbyBJJ20gd29ya2luZyBhcm91bmQgaXQuCisJCQkgKi8KKwkJCWlmICh2bS0+Zm9ybWF0KQorCQkJeworCQkJCXN3aXRjaCAodm0tPmZvcm1hdCkKKwkJCQl7CisJCQkJCWNhc2UgVklERU9fUEFMRVRURV9ZVVY0MjBQOgorCQkJCQljYXNlIFZJREVPX1BBTEVUVEVfUkFXOgorCQkJCQkJYnJlYWs7CisJCQkJCWRlZmF1bHQ6CisJCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQkJaWYgKCh2bS0+d2lkdGggIT0gcGRldi0+dmlldy54IHx8IHZtLT5oZWlnaHQgIT0gcGRldi0+dmlldy55KSAmJgorCQkJICAgICh2bS0+d2lkdGggPj0gcGRldi0+dmlld19taW4ueCAmJiB2bS0+aGVpZ2h0ID49IHBkZXYtPnZpZXdfbWluLnkpKSB7CisJCQkJaW50IHJldDsKKworCQkJCVBXQ19ERUJVR19PUEVOKCJWSURJT0NNQ0FQVFVSRTogY2hhbmdpbmcgc2l6ZSB0byBwbGVhc2UgeGF3dHYgOi0oLlxuIik7CisJCQkJcmV0ID0gcHdjX3RyeV92aWRlb19tb2RlKHBkZXYsIHZtLT53aWR0aCwgdm0tPmhlaWdodCwgcGRldi0+dmZyYW1lcywgcGRldi0+dmNvbXByZXNzaW9uLCBwZGV2LT52c25hcHNob3QpOworCQkJCWlmIChyZXQpCisJCQkJCXJldHVybiByZXQ7CisJCQl9IC8qIC4uLiBzaXplIG1pc21hdGNoICovCisKKwkJCS8qIEZJWE1FOiBzaG91bGQgd2UgbG9jayBoZXJlPyAqLworCQkJaWYgKHBkZXYtPmltYWdlX3VzZWRbdm0tPmZyYW1lXSkKKwkJCQlyZXR1cm4gLUVCVVNZOwkvKiBidWZmZXIgd2Fzbid0IGF2YWlsYWJsZS4gQnVtbWVyICovCisJCQlwZGV2LT5pbWFnZV91c2VkW3ZtLT5mcmFtZV0gPSAxOworCisJCQkvKiBPa2F5LCB3ZSdyZSBkb25lIGhlcmUuIEluIHRoZSBTWU5DIGNhbGwgd2Ugd2FpdCB1bnRpbCBhCisJCQkgICBmcmFtZSBjb21lcyBhdmFpbGFibGUsIHRoZW4gZXhwYW5kIGltYWdlIGludG8gdGhlIGdpdmVuCisJCQkgICBidWZmZXIuCisJCQkgICBJbiBjb250cmFzdCB0byB0aGUgQ1BpQSBjYW0gdGhlIFBoaWxpcHMgY2FtcyBkZWxpdmVyIGEKKwkJCSAgIGNvbnN0YW50IHN0cmVhbSwgYWxtb3N0IGxpa2UgYSBncmFiYmVyIGNhcmQuIEFsc28sCisJCQkgICB3ZSBoYXZlIHNlcGFyYXRlIGJ1ZmZlcnMgZm9yIHRoZSByYXdkYXRhIGFuZCB0aGUgaW1hZ2UsCisJCQkgICBtZWFuaW5nIHdlIGNhbiBuZWFybHkgYWx3YXlzIGV4cGFuZCBpbnRvIHRoZSByZXF1ZXN0ZWQgYnVmZmVyLgorCQkJICovCisJCQlQV0NfREVCVUdfUkVBRCgiVklESU9DTUNBUFRVUkUgZG9uZS5cbiIpOworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIFZJRElPQ1NZTkM6CisJCXsKKwkJCS8qIFRoZSBkb2Mgc2F5czogIldoZW5ldmVyIGEgYnVmZmVyIGlzIHVzZWQgaXQgc2hvdWxkCisJCQkgICBjYWxsIFZJRElPQ1NZTkMgdG8gZnJlZSB0aGlzIGZyYW1lIHVwIGFuZCBjb250aW51ZS4iCisKKwkJCSAgIFRoZSBvbmx5IG9kZCB0aGluZyBhYm91dCB0aGlzIHdob2xlIHByb2NlZHVyZSBpcworCQkJICAgdGhhdCBNQ0FQVFVSRSBmbGFncyB0aGUgYnVmZmVyIGFzICJpbiB1c2UiLCBhbmQKKwkJCSAgIFNZTkMgaW1tZWRpYXRlbHkgdW5tYXJrcyBpdCwgd2hpbGUgaXQgaXNuJ3QKKwkJCSAgIGFmdGVyIFNZTkMgdGhhdCB5b3Uga25vdyB0aGF0IHRoZSBidWZmZXIgYWN0dWFsbHkKKwkJCSAgIGdvdCBmaWxsZWQhIFNvIHlvdSBiZXR0ZXIgbm90IHN0YXJ0IGEgQ0FQVFVSRSBpbgorCQkJICAgdGhlIHNhbWUgZnJhbWUgaW1tZWRpYXRlbHkgKHVzZSBkb3VibGUgYnVmZmVyaW5nKS4KKwkJCSAgIFRoaXMgaXMgbm90IGEgcHJvYmxlbSBmb3IgdGhpcyBjYW0sIHNpbmNlIGl0IGhhcworCQkJICAgZXh0cmEgaW50ZXJtZWRpYXRlIGJ1ZmZlcnMsIGJ1dCBhIGhhcmR3YXJlCisJCQkgICBncmFiYmVyIGNhcmQgd2lsbCB0aGVuIG92ZXJ3cml0ZSB0aGUgYnVmZmVyCisJCQkgICB5b3UncmUgd29ya2luZyBvbi4KKwkJCSAqLworCQkJaW50ICptYnVmID0gYXJnOworCQkJaW50IHJldDsKKworCQkJUFdDX0RFQlVHX1JFQUQoIlZJRElPQ1NZTkMgY2FsbGVkICglZCkuXG4iLCAqbWJ1Zik7CisKKwkJCS8qIGJvdW5kcyBjaGVjayAqLworCQkJaWYgKCptYnVmIDwgMCB8fCAqbWJ1ZiA+PSBwd2NfbWJ1ZnMpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkvKiBjaGVjayBpZiB0aGlzIGJ1ZmZlciB3YXMgcmVxdWVzdGVkIGFueXdheSAqLworCQkJaWYgKHBkZXYtPmltYWdlX3VzZWRbKm1idWZdID09IDApCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCS8qIEFkZCBvdXJzZWx2ZXMgdG8gdGhlIGZyYW1lIHdhaXQtcXVldWUuCisKKwkJCSAgIEZJWE1FOiBuZWVkcyBhdWRpdGluZyBmb3Igc2FmZXR5LgorCQkJICAgUVVFU1RJT046IEluIHdoYXQgcmVzcGVjdD8gSSB0aGluayB0aGF0IHVzaW5nIHRoZQorCQkJCSAgICAgZnJhbWVxIGlzIHNhZmUgbm93LgorCQkJICovCisJCQlhZGRfd2FpdF9xdWV1ZSgmcGRldi0+ZnJhbWVxLCAmd2FpdCk7CisJCQl3aGlsZSAocGRldi0+ZnVsbF9mcmFtZXMgPT0gTlVMTCkgeworCQkJCS8qIENoZWNrIGZvciB1bnBsdWdnZWQvZXRjLiBoZXJlICovCisJCQkJaWYgKHBkZXYtPmVycm9yX3N0YXR1cykgeworCQkJCQlyZW1vdmVfd2FpdF9xdWV1ZSgmcGRldi0+ZnJhbWVxLCAmd2FpdCk7CisJCQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJCQkJCXJldHVybiAtcGRldi0+ZXJyb3Jfc3RhdHVzOworCQkJCX0KKworCQkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCQlyZW1vdmVfd2FpdF9xdWV1ZSgmcGRldi0+ZnJhbWVxLCAmd2FpdCk7CisJCQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJCQkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJCQkJfQorCQkJCXNjaGVkdWxlKCk7CisJCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCX0KKwkJCXJlbW92ZV93YWl0X3F1ZXVlKCZwZGV2LT5mcmFtZXEsICZ3YWl0KTsKKwkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisKKwkJCS8qIFRoZSBmcmFtZSBpcyByZWFkeS4gRXhwYW5kIGluIHRoZSBpbWFnZSBidWZmZXIKKwkJCSAgIHJlcXVlc3RlZCBieSB0aGUgdXNlci4gSSBkb24ndCBjYXJlIGlmIHlvdQorCQkJICAgbW1hcCgpIDUgYnVmZmVycyBhbmQgcmVxdWVzdCBkYXRhIGluIHRoaXMgb3JkZXI6CisJCQkgICBidWZmZXIgNCAyIDMgMCAxIDIgMyAwIDQgMyAxIC4gLiAuCisJCQkgICBHcmFiYmVyIGhhcmR3YXJlIG1heSBub3QgYmUgc28gZm9yZ2l2aW5nLgorCQkJICovCisJCQlQV0NfREVCVUdfUkVBRCgiVklESU9DU1lOQzogZnJhbWUgcmVhZHkuXG4iKTsKKwkJCXBkZXYtPmZpbGxfaW1hZ2UgPSAqbWJ1ZjsgLyogdGVsbCBpbiB3aGljaCBidWZmZXIgd2Ugd2FudCB0aGUgaW1hZ2UgdG8gYmUgZXhwYW5kZWQgKi8KKwkJCS8qIERlY29tcHJlc3MsIGV0YyAqLworCQkJcmV0ID0gcHdjX2hhbmRsZV9mcmFtZShwZGV2KTsKKwkJCXBkZXYtPmltYWdlX3VzZWRbKm1idWZdID0gMDsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgVklESU9DR0FVRElPOgorCQl7CisJCQlzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYgPSBhcmc7CisKKwkJCXN0cmNweSh2LT5uYW1lLCAiTWljcm9waG9uZSIpOworCQkJdi0+YXVkaW8gPSAtMTsgLyogdW5rbm93biBhdWRpbyBtaW5vciAqLworCQkJdi0+ZmxhZ3MgPSAwOworCQkJdi0+bW9kZSA9IFZJREVPX1NPVU5EX01PTk87CisJCQl2LT52b2x1bWUgPSAwOworCQkJdi0+YmFzcyA9IDA7CisJCQl2LT50cmVibGUgPSAwOworCQkJdi0+YmFsYW5jZSA9IDB4ODAwMDsKKwkJCXYtPnN0ZXAgPSAxOworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIFZJRElPQ1NBVURJTzoKKwkJeworCQkJLyogRHVtbXk6IG5vdGhpbmcgY2FuIGJlIHNldCAqLworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIFZJRElPQ0dVTklUOgorCQl7CisJCQlzdHJ1Y3QgdmlkZW9fdW5pdCAqdnUgPSBhcmc7CisKKwkJCXZ1LT52aWRlbyA9IHBkZXYtPnZkZXYtPm1pbm9yICYgMHgzRjsKKwkJCXZ1LT5hdWRpbyA9IC0xOyAvKiBub3Qga25vd24geWV0ICovCisJCQl2dS0+dmJpID0gLTE7CisJCQl2dS0+cmFkaW8gPSAtMTsKKwkJCXZ1LT50ZWxldGV4dCA9IC0xOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBWNEwyIExheWVyICovCisJCWNhc2UgVklESU9DX1FVRVJZQ0FQOgorCQl7CisJCSAgICBzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5ICpjYXAgPSBhcmc7CisKKwkJICAgIFBXQ19ERUJVR19JT0NUTCgiaW9jdGwoVklESU9DX1FVRVJZQ0FQKSBUaGlzIGFwcGxpY2F0aW9uICJcCisJCQkJICAgICAgICJ0cnkgdG8gdXNlIHRoZSB2NGwyIGxheWVyXG4iKTsKKwkJICAgIHN0cmNweShjYXAtPmRyaXZlcixQV0NfTkFNRSk7CisJCSAgICBzdHJsY3B5KGNhcC0+Y2FyZCwgdmRldi0+bmFtZSwgc2l6ZW9mKGNhcC0+Y2FyZCkpOworCQkgICAgdXNiX21ha2VfcGF0aChwZGV2LT51ZGV2LGNhcC0+YnVzX2luZm8sc2l6ZW9mKGNhcC0+YnVzX2luZm8pKTsKKwkJICAgIGNhcC0+dmVyc2lvbiA9IFBXQ19WRVJTSU9OX0NPREU7CisJCSAgICBjYXAtPmNhcGFiaWxpdGllcyA9CisJCQlWNEwyX0NBUF9WSURFT19DQVBUVVJFCXwKKwkJCVY0TDJfQ0FQX1NUUkVBTUlORwl8CisJCQlWNEwyX0NBUF9SRUFEV1JJVEU7CisJCSAgICByZXR1cm4gMDsKKwkJfQorCisJCWNhc2UgVklESU9DX0VOVU1JTlBVVDoKKwkJeworCQkgICAgc3RydWN0IHY0bDJfaW5wdXQgKmkgPSBhcmc7CisKKwkJICAgIGlmICggaS0+aW5kZXggKQkvKiBPbmx5IG9uZSBJTlBVVCBpcyBzdXBwb3J0ZWQgKi8KKwkJCSAgcmV0dXJuIC1FSU5WQUw7CisKKwkJICAgIG1lbXNldChpLCAwLCBzaXplb2Yoc3RydWN0IHY0bDJfaW5wdXQpKTsKKwkJICAgIHN0cmNweShpLT5uYW1lLCAidXNiIik7CisJCSAgICByZXR1cm4gMDsKKwkJfQorCisJCWNhc2UgVklESU9DX0dfSU5QVVQ6CisJCXsKKwkJICAgIGludCAqaSA9IGFyZzsKKwkJICAgICppID0gMDsJLyogT25seSBvbmUgSU5QVVQgaXMgc3VwcG9ydGVkICovCisJCSAgICByZXR1cm4gMDsKKwkJfQorCQljYXNlIFZJRElPQ19TX0lOUFVUOgorCQl7CisJCQlpbnQgKmkgPSBhcmc7CisKKwkJCWlmICggKmkgKSB7CS8qIE9ubHkgb25lIElOUFVUIGlzIHN1cHBvcnRlZCAqLworCQkJCVBXQ19ERUJVR19JT0NUTCgiT25seSBvbmUgaW5wdXQgc291cmNlIGlzIlwKKwkJCQkJIiBzdXBwb3J0ZWQgd2l0aCB0aGlzIHdlYmNhbS5cbiIpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJcmV0dXJuIDA7CisJCX0KKworCQkvKiBUT0RPOiAqLworCQljYXNlIFZJRElPQ19RVUVSWUNUUkw6CisJCXsKKwkJCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqYyA9IGFyZzsKKwkJCWludCBpOworCisJCQlQV0NfREVCVUdfSU9DVEwoImlvY3RsKFZJRElPQ19RVUVSWUNUUkwpIHF1ZXJ5IGlkPSVkXG4iLCBjLT5pZCk7CisJCQlmb3IgKGk9MDsgaTxzaXplb2YocHdjX2NvbnRyb2xzKS9zaXplb2Yoc3RydWN0IHY0bDJfcXVlcnljdHJsKTsgaSsrKSB7CisJCQkJaWYgKHB3Y19jb250cm9sc1tpXS5pZCA9PSBjLT5pZCkgeworCQkJCQlQV0NfREVCVUdfSU9DVEwoImlvY3RsKFZJRElPQ19RVUVSWUNUUkwpIGZvdW5kXG4iKTsKKwkJCQkJbWVtY3B5KGMsJnB3Y19jb250cm9sc1tpXSxzaXplb2Yoc3RydWN0IHY0bDJfcXVlcnljdHJsKSk7CisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCX0KKwkJCVBXQ19ERUJVR19JT0NUTCgiaW9jdGwoVklESU9DX1FVRVJZQ1RSTCkgbm90IGZvdW5kXG4iKTsKKworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJY2FzZSBWSURJT0NfR19DVFJMOgorCQl7CisJCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjID0gYXJnOworCQkJaW50IHJldDsKKworCQkJc3dpdGNoIChjLT5pZCkKKwkJCXsKKwkJCQljYXNlIFY0TDJfQ0lEX0JSSUdIVE5FU1M6CisJCQkJCWMtPnZhbHVlID0gcHdjX2dldF9icmlnaHRuZXNzKHBkZXYpOworCQkJCQlpZiAoYy0+dmFsdWU8MCkKKwkJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCQlyZXR1cm4gMDsKKwkJCQljYXNlIFY0TDJfQ0lEX0NPTlRSQVNUOgorCQkJCQljLT52YWx1ZSA9IHB3Y19nZXRfY29udHJhc3QocGRldik7CisJCQkJCWlmIChjLT52YWx1ZTwwKQorCQkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJCXJldHVybiAwOworCQkJCWNhc2UgVjRMMl9DSURfU0FUVVJBVElPTjoKKwkJCQkJcmV0ID0gcHdjX2dldF9zYXR1cmF0aW9uKHBkZXYsICZjLT52YWx1ZSk7CisJCQkJCWlmIChyZXQ8MCkKKwkJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCQlyZXR1cm4gMDsKKwkJCQljYXNlIFY0TDJfQ0lEX0dBTU1BOgorCQkJCQljLT52YWx1ZSA9IHB3Y19nZXRfZ2FtbWEocGRldik7CisJCQkJCWlmIChjLT52YWx1ZTwwKQorCQkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJCXJldHVybiAwOworCQkJCWNhc2UgVjRMMl9DSURfUkVEX0JBTEFOQ0U6CisJCQkJCXJldCA9IHB3Y19nZXRfcmVkX2dhaW4ocGRldiwgJmMtPnZhbHVlKTsKKwkJCQkJaWYgKHJldDwwKQorCQkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJCWMtPnZhbHVlID4+PSA4OworCQkJCQlyZXR1cm4gMDsKKwkJCQljYXNlIFY0TDJfQ0lEX0JMVUVfQkFMQU5DRToKKwkJCQkJcmV0ID0gcHdjX2dldF9ibHVlX2dhaW4ocGRldiwgJmMtPnZhbHVlKTsKKwkJCQkJaWYgKHJldDwwKQorCQkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJCWMtPnZhbHVlID4+PSA4OworCQkJCQlyZXR1cm4gMDsKKwkJCQljYXNlIFY0TDJfQ0lEX0FVVE9fV0hJVEVfQkFMQU5DRToKKwkJCQkJcmV0ID0gcHdjX2dldF9hd2IocGRldik7CisJCQkJCWlmIChyZXQ8MCkKKwkJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCQljLT52YWx1ZSA9IChyZXQgPT0gUFdDX1dCX01BTlVBTCk/MDoxOworCQkJCQlyZXR1cm4gMDsKKwkJCQljYXNlIFY0TDJfQ0lEX0dBSU46CisJCQkJCXJldCA9IHB3Y19nZXRfYWdjKHBkZXYsICZjLT52YWx1ZSk7CisJCQkJCWlmIChyZXQ8MCkKKwkJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCQljLT52YWx1ZSA+Pj0gODsKKwkJCQkJcmV0dXJuIDA7CisJCQkJY2FzZSBWNEwyX0NJRF9BVVRPR0FJTjoKKwkJCQkJcmV0ID0gcHdjX2dldF9hZ2MocGRldiwgJmMtPnZhbHVlKTsKKwkJCQkJaWYgKHJldDwwKQorCQkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJCWMtPnZhbHVlID0gKGMtPnZhbHVlIDwgMCk/MTowOworCQkJCQlyZXR1cm4gMDsKKwkJCQljYXNlIFY0TDJfQ0lEX0VYUE9TVVJFOgorCQkJCQlyZXQgPSBwd2NfZ2V0X3NodXR0ZXJfc3BlZWQocGRldiwgJmMtPnZhbHVlKTsKKwkJCQkJaWYgKHJldDwwKQorCQkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJCXJldHVybiAwOworCQkJCWNhc2UgVjRMMl9DSURfUFJJVkFURV9DT0xPVVJfTU9ERToKKwkJCQkJcmV0ID0gcHdjX2dldF9jb2xvdXJfbW9kZShwZGV2LCAmYy0+dmFsdWUpOworCQkJCQlpZiAocmV0IDwgMCkKKwkJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCQlyZXR1cm4gMDsKKwkJCQljYXNlIFY0TDJfQ0lEX1BSSVZBVEVfQVVUT0NPTlRPVVI6CisJCQkJCXJldCA9IHB3Y19nZXRfY29udG91cihwZGV2LCAmYy0+dmFsdWUpOworCQkJCQlpZiAocmV0IDwgMCkKKwkJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCQljLT52YWx1ZT0oYy0+dmFsdWUgPT0gLTE/MTowKTsKKwkJCQkJcmV0dXJuIDA7CisJCQkJY2FzZSBWNEwyX0NJRF9QUklWQVRFX0NPTlRPVVI6CisJCQkJCXJldCA9IHB3Y19nZXRfY29udG91cihwZGV2LCAmYy0+dmFsdWUpOworCQkJCQlpZiAocmV0IDwgMCkKKwkJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCQljLT52YWx1ZSA+Pj0gMTA7CisJCQkJCXJldHVybiAwOworCQkJCWNhc2UgVjRMMl9DSURfUFJJVkFURV9CQUNLTElHSFQ6CisJCQkJCXJldCA9IHB3Y19nZXRfYmFja2xpZ2h0KHBkZXYsICZjLT52YWx1ZSk7CisJCQkJCWlmIChyZXQgPCAwKQorCQkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJCXJldHVybiAwOworCQkJCWNhc2UgVjRMMl9DSURfUFJJVkFURV9GTElDS0VSTEVTUzoKKwkJCQkJcmV0ID0gcHdjX2dldF9mbGlja2VyKHBkZXYsICZjLT52YWx1ZSk7CisJCQkJCWlmIChyZXQgPCAwKQorCQkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJCWMtPnZhbHVlPShjLT52YWx1ZT8xOjApOworCQkJCQlyZXR1cm4gMDsKKwkJCQljYXNlIFY0TDJfQ0lEX1BSSVZBVEVfTk9JU0VfUkVEVUNUSU9OOgorCQkJCQlyZXQgPSBwd2NfZ2V0X2R5bmFtaWNfbm9pc2UocGRldiwgJmMtPnZhbHVlKTsKKwkJCQkJaWYgKHJldCA8IDApCisJCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQkJcmV0dXJuIDA7CisKKwkJCQljYXNlIFY0TDJfQ0lEX1BSSVZBVEVfU0FWRV9VU0VSOgorCQkJCWNhc2UgVjRMMl9DSURfUFJJVkFURV9SRVNUT1JFX1VTRVI6CisJCQkJY2FzZSBWNEwyX0NJRF9QUklWQVRFX1JFU1RPUkVfRkFDVE9SWToKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQljYXNlIFZJRElPQ19TX0NUUkw6CisJCXsKKwkJCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmMgPSBhcmc7CisJCQlpbnQgcmV0OworCisJCQlzd2l0Y2ggKGMtPmlkKQorCQkJeworCQkJCWNhc2UgVjRMMl9DSURfQlJJR0hUTkVTUzoKKwkJCQkJYy0+dmFsdWUgPDw9IDk7CisJCQkJCXJldCA9IHB3Y19zZXRfYnJpZ2h0bmVzcyhwZGV2LCBjLT52YWx1ZSk7CisJCQkJCWlmIChyZXQ8MCkKKwkJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCQlyZXR1cm4gMDsKKwkJCQljYXNlIFY0TDJfQ0lEX0NPTlRSQVNUOgorCQkJCQljLT52YWx1ZSA8PD0gMTA7CisJCQkJCXJldCA9IHB3Y19zZXRfY29udHJhc3QocGRldiwgYy0+dmFsdWUpOworCQkJCQlpZiAocmV0PDApCisJCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQkJcmV0dXJuIDA7CisJCQkJY2FzZSBWNEwyX0NJRF9TQVRVUkFUSU9OOgorCQkJCQlyZXQgPSBwd2Nfc2V0X3NhdHVyYXRpb24ocGRldiwgYy0+dmFsdWUpOworCQkJCQlpZiAocmV0PDApCisJCQkJCSAgcmV0dXJuIC1FSU5WQUw7CisJCQkJCXJldHVybiAwOworCQkJCWNhc2UgVjRMMl9DSURfR0FNTUE6CisJCQkJCWMtPnZhbHVlIDw8PSAxMTsKKwkJCQkJcmV0ID0gcHdjX3NldF9nYW1tYShwZGV2LCBjLT52YWx1ZSk7CisJCQkJCWlmIChyZXQ8MCkKKwkJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCQlyZXR1cm4gMDsKKwkJCQljYXNlIFY0TDJfQ0lEX1JFRF9CQUxBTkNFOgorCQkJCQljLT52YWx1ZSA8PD0gODsKKwkJCQkJcmV0ID0gcHdjX3NldF9yZWRfZ2FpbihwZGV2LCBjLT52YWx1ZSk7CisJCQkJCWlmIChyZXQ8MCkKKwkJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCQlyZXR1cm4gMDsKKwkJCQljYXNlIFY0TDJfQ0lEX0JMVUVfQkFMQU5DRToKKwkJCQkJYy0+dmFsdWUgPDw9IDg7CisJCQkJCXJldCA9IHB3Y19zZXRfYmx1ZV9nYWluKHBkZXYsIGMtPnZhbHVlKTsKKwkJCQkJaWYgKHJldDwwKQorCQkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJCXJldHVybiAwOworCQkJCWNhc2UgVjRMMl9DSURfQVVUT19XSElURV9CQUxBTkNFOgorCQkJCQljLT52YWx1ZSA9IChjLT52YWx1ZSA9PSAwKT9QV0NfV0JfTUFOVUFMOlBXQ19XQl9BVVRPOworCQkJCQlyZXQgPSBwd2Nfc2V0X2F3YihwZGV2LCBjLT52YWx1ZSk7CisJCQkJCWlmIChyZXQ8MCkKKwkJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCQlyZXR1cm4gMDsKKwkJCQljYXNlIFY0TDJfQ0lEX0VYUE9TVVJFOgorCQkJCQljLT52YWx1ZSA8PD0gODsKKwkJCQkJcmV0ID0gcHdjX3NldF9zaHV0dGVyX3NwZWVkKHBkZXYsIGMtPnZhbHVlPzA6MSwgYy0+dmFsdWUpOworCQkJCQlpZiAocmV0PDApCisJCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQkJcmV0dXJuIDA7CisJCQkJY2FzZSBWNEwyX0NJRF9BVVRPR0FJTjoKKwkJCQkJLyogYXV0b2dhaW4gb2ZmIG1lYW5zIG5vdGhpbmcgd2l0aG91dCBhIGdhaW4gKi8KKwkJCQkJaWYgKGMtPnZhbHVlID09IDApCisJCQkJCQlyZXR1cm4gMDsKKwkJCQkJcmV0ID0gcHdjX3NldF9hZ2MocGRldiwgYy0+dmFsdWUsIDApOworCQkJCQlpZiAocmV0PDApCisJCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQkJcmV0dXJuIDA7CisJCQkJY2FzZSBWNEwyX0NJRF9HQUlOOgorCQkJCQljLT52YWx1ZSA8PD0gODsKKwkJCQkJcmV0ID0gcHdjX3NldF9hZ2MocGRldiwgMCwgYy0+dmFsdWUpOworCQkJCQlpZiAocmV0PDApCisJCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQkJcmV0dXJuIDA7CisJCQkJY2FzZSBWNEwyX0NJRF9QUklWQVRFX1NBVkVfVVNFUjoKKwkJCQkJaWYgKHB3Y19zYXZlX3VzZXIocGRldikpCisJCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQkJcmV0dXJuIDA7CisJCQkJY2FzZSBWNEwyX0NJRF9QUklWQVRFX1JFU1RPUkVfVVNFUjoKKwkJCQkJaWYgKHB3Y19yZXN0b3JlX3VzZXIocGRldikpCisJCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQkJcmV0dXJuIDA7CisJCQkJY2FzZSBWNEwyX0NJRF9QUklWQVRFX1JFU1RPUkVfRkFDVE9SWToKKwkJCQkJaWYgKHB3Y19yZXN0b3JlX2ZhY3RvcnkocGRldikpCisJCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQkJcmV0dXJuIDA7CisJCQkJY2FzZSBWNEwyX0NJRF9QUklWQVRFX0NPTE9VUl9NT0RFOgorCQkJCQlyZXQgPSBwd2Nfc2V0X2NvbG91cl9tb2RlKHBkZXYsIGMtPnZhbHVlKTsKKwkJCQkJaWYgKHJldCA8IDApCisJCQkJCSAgcmV0dXJuIC1FSU5WQUw7CisJCQkJCXJldHVybiAwOworCQkJCWNhc2UgVjRMMl9DSURfUFJJVkFURV9BVVRPQ09OVE9VUjoKKwkJCQkgIGMtPnZhbHVlPShjLT52YWx1ZSA9PSAxKT8tMTowOworCQkJCSAgcmV0ID0gcHdjX3NldF9jb250b3VyKHBkZXYsIGMtPnZhbHVlKTsKKwkJCQkgIGlmIChyZXQgPCAwKQorCQkJCSAgICByZXR1cm4gLUVJTlZBTDsKKwkJCQkgIHJldHVybiAwOworCQkJCWNhc2UgVjRMMl9DSURfUFJJVkFURV9DT05UT1VSOgorCQkJCSAgYy0+dmFsdWUgPDw9IDEwOworCQkJCSAgcmV0ID0gcHdjX3NldF9jb250b3VyKHBkZXYsIGMtPnZhbHVlKTsKKwkJCQkgIGlmIChyZXQgPCAwKQorCQkJCSAgICByZXR1cm4gLUVJTlZBTDsKKwkJCQkgIHJldHVybiAwOworCQkJCWNhc2UgVjRMMl9DSURfUFJJVkFURV9CQUNLTElHSFQ6CisJCQkJICByZXQgPSBwd2Nfc2V0X2JhY2tsaWdodChwZGV2LCBjLT52YWx1ZSk7CisJCQkJICBpZiAocmV0IDwgMCkKKwkJCQkgICAgcmV0dXJuIC1FSU5WQUw7CisJCQkJICByZXR1cm4gMDsKKwkJCQljYXNlIFY0TDJfQ0lEX1BSSVZBVEVfRkxJQ0tFUkxFU1M6CisJCQkJICByZXQgPSBwd2Nfc2V0X2ZsaWNrZXIocGRldiwgYy0+dmFsdWUpOworCQkJCSAgaWYgKHJldCA8IDApCisJCQkJICAgIHJldHVybiAtRUlOVkFMOworCQkJCWNhc2UgVjRMMl9DSURfUFJJVkFURV9OT0lTRV9SRURVQ1RJT046CisJCQkJICByZXQgPSBwd2Nfc2V0X2R5bmFtaWNfbm9pc2UocGRldiwgYy0+dmFsdWUpOworCQkJCSAgaWYgKHJldCA8IDApCisJCQkJICAgIHJldHVybiAtRUlOVkFMOworCQkJCSAgcmV0dXJuIDA7CisKKwkJCX0KKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJY2FzZSBWSURJT0NfRU5VTV9GTVQ6CisJCXsKKwkJCXN0cnVjdCB2NGwyX2ZtdGRlc2MgKmYgPSBhcmc7CisJCQlpbnQgaW5kZXg7CisKKwkJCWlmIChmLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKKwkJCSAgICAgIHJldHVybiAtRUlOVkFMOworCisJCQkvKiBXZSBvbmx5IHN1cHBvcnQgdHdvIGZvcm1hdDogdGhlIHJhdyBmb3JtYXQsIGFuZCBZVVYgKi8KKwkJCWluZGV4ID0gZi0+aW5kZXg7CisJCQltZW1zZXQoZiwwLHNpemVvZihzdHJ1Y3QgdjRsMl9mbXRkZXNjKSk7CisJCQlmLT50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOworCQkJZi0+aW5kZXggPSBpbmRleDsKKwkJCXN3aXRjaChpbmRleCkKKwkJCXsKKwkJCQljYXNlIDA6CisJCQkJCS8qIFJBVyBmb3JtYXQgKi8KKwkJCQkJZi0+cGl4ZWxmb3JtYXQgPSBwZGV2LT50eXBlPD02NDY/VjRMMl9QSVhfRk1UX1BXQzE6VjRMMl9QSVhfRk1UX1BXQzI7CisJCQkJCWYtPmZsYWdzID0gVjRMMl9GTVRfRkxBR19DT01QUkVTU0VEOworCQkJCQlzdHJsY3B5KGYtPmRlc2NyaXB0aW9uLCJSYXcgUGhpbGlwcyBXZWJjYW0iLHNpemVvZihmLT5kZXNjcmlwdGlvbikpOworCQkJCQlicmVhazsKKwkJCQljYXNlIDE6CisJCQkJCWYtPnBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX1lVVjQyMDsKKwkJCQkJc3RybGNweShmLT5kZXNjcmlwdGlvbiwiNDoyOjAsIHBsYW5hciwgWS1DYi1DciIsc2l6ZW9mKGYtPmRlc2NyaXB0aW9uKSk7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJcmV0dXJuIDA7CisJCX0KKworCQljYXNlIFZJRElPQ19HX0ZNVDoKKwkJeworCQkJc3RydWN0IHY0bDJfZm9ybWF0ICpmID0gYXJnOworCisJCQlQV0NfREVCVUdfSU9DVEwoImlvY3RsKFZJRElPQ19HX0ZNVCkgcmV0dXJuIHNpemUgJWR4JWRcbiIscGRldi0+aW1hZ2UueCxwZGV2LT5pbWFnZS55KTsKKwkJCWlmIChmLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKKwkJCSAgICAgIHJldHVybiAtRUlOVkFMOworCisJCQlwd2NfdmlkaW9jX2ZpbGxfZm10KHBkZXYsIGYpOworCisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWNhc2UgVklESU9DX1RSWV9GTVQ6CisJCQlyZXR1cm4gcHdjX3ZpZGlvY190cnlfZm10KHBkZXYsIGFyZyk7CisKKwkJY2FzZSBWSURJT0NfU19GTVQ6CisJCQlyZXR1cm4gcHdjX3ZpZGlvY19zZXRfZm10KHBkZXYsIGFyZyk7CisKKwkJY2FzZSBWSURJT0NfR19TVEQ6CisJCXsKKwkJCXY0bDJfc3RkX2lkICpzdGQgPSBhcmc7CisJCQkqc3RkID0gVjRMMl9TVERfVU5LTk9XTjsKKwkJCXJldHVybiAwOworCQl9CisKKwkJY2FzZSBWSURJT0NfU19TVEQ6CisJCXsKKwkJCXY0bDJfc3RkX2lkICpzdGQgPSBhcmc7CisJCQlpZiAoKnN0ZCAhPSBWNEwyX1NURF9VTktOT1dOKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJcmV0dXJuIDA7CisJCX0KKworCQljYXNlIFZJRElPQ19FTlVNU1REOgorCQl7CisJCQlzdHJ1Y3QgdjRsMl9zdGFuZGFyZCAqc3RkID0gYXJnOworCQkJaWYgKHN0ZC0+aW5kZXggIT0gMCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXN0ZC0+aWQgPSBWNEwyX1NURF9VTktOT1dOOworCQkJc3RybmNweShzdGQtPm5hbWUsICJ3ZWJjYW0iLCBzaXplb2Yoc3RkLT5uYW1lKSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWNhc2UgVklESU9DX1JFUUJVRlM6CisJCXsKKwkJCXN0cnVjdCB2NGwyX3JlcXVlc3RidWZmZXJzICpyYiA9IGFyZzsKKwkJCWludCBuYnVmZmVyczsKKworCQkJUFdDX0RFQlVHX0lPQ1RMKCJpb2N0bChWSURJT0NfUkVRQlVGUykgY291bnQ9JWRcbiIscmItPmNvdW50KTsKKwkJCWlmIChyYi0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlpZiAocmItPm1lbW9yeSAhPSBWNEwyX01FTU9SWV9NTUFQKQorCQkJCXJldHVybiAtRUlOVkFMOworCisJCQluYnVmZmVycyA9IHJiLT5jb3VudDsKKwkJCWlmIChuYnVmZmVycyA8IDIpCisJCQkJbmJ1ZmZlcnMgPSAyOworCQkJZWxzZSBpZiAobmJ1ZmZlcnMgPiBwd2NfbWJ1ZnMpCisJCQkJbmJ1ZmZlcnMgPSBwd2NfbWJ1ZnM7CisJCQkvKiBGb3JjZSB0byB1c2Ugb3VyICMgb2YgYnVmZmVycyAqLworCQkJcmItPmNvdW50ID0gcHdjX21idWZzOworCQkJcmV0dXJuIDA7CisJCX0KKworCQljYXNlIFZJRElPQ19RVUVSWUJVRjoKKwkJeworCQkJc3RydWN0IHY0bDJfYnVmZmVyICpidWYgPSBhcmc7CisJCQlpbnQgaW5kZXg7CisKKwkJCVBXQ19ERUJVR19JT0NUTCgiaW9jdGwoVklESU9DX1FVRVJZQlVGKSBpbmRleD0lZFxuIixidWYtPmluZGV4KTsKKwkJCWlmIChidWYtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKSB7CisJCQkJUFdDX0RFQlVHX0lPQ1RMKCJpb2N0bChWSURJT0NfUVVFUllCVUYpIEJhZCB0eXBlXG4iKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCWlmIChidWYtPm1lbW9yeSAhPSBWNEwyX01FTU9SWV9NTUFQKSB7CisJCQkJUFdDX0RFQlVHX0lPQ1RMKCJpb2N0bChWSURJT0NfUVVFUllCVUYpIEJhZCBtZW1vcnkgdHlwZVxuIik7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQlpbmRleCA9IGJ1Zi0+aW5kZXg7CisJCQlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHB3Y19tYnVmcykgeworCQkJCVBXQ19ERUJVR19JT0NUTCgiaW9jdGwoVklESU9DX1FVRVJZQlVGKSBCYWQgaW5kZXggJWRcbiIsIGJ1Zi0+aW5kZXgpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCisJCQltZW1zZXQoYnVmLCAwLCBzaXplb2Yoc3RydWN0IHY0bDJfYnVmZmVyKSk7CisJCQlidWYtPnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7CisJCQlidWYtPmluZGV4ID0gaW5kZXg7CisJCQlidWYtPm0ub2Zmc2V0ID0gaW5kZXggKiBwZGV2LT5sZW5fcGVyX2ltYWdlOworCQkJaWYgKHBkZXYtPnZwYWxldHRlID09IFZJREVPX1BBTEVUVEVfUkFXKQorCQkJCWJ1Zi0+Ynl0ZXN1c2VkID0gcGRldi0+ZnJhbWVfc2l6ZSArIHNpemVvZihzdHJ1Y3QgcHdjX3Jhd19mcmFtZSk7CisJCQllbHNlCisJCQkJYnVmLT5ieXRlc3VzZWQgPSBwZGV2LT52aWV3LnNpemU7CisJCQlidWYtPmZpZWxkID0gVjRMMl9GSUVMRF9OT05FOworCQkJYnVmLT5tZW1vcnkgPSBWNEwyX01FTU9SWV9NTUFQOworCQkJLy9idWYtPmZsYWdzID0gVjRMMl9CVUZfRkxBR19NQVBQRUQ7CisJCQlidWYtPmxlbmd0aCA9IHBkZXYtPmxlbl9wZXJfaW1hZ2U7CisKKwkJCVBXQ19ERUJVR19SRUFEKCJWSURJT0NfUVVFUllCVUY6IGluZGV4PSVkXG4iLGJ1Zi0+aW5kZXgpOworCQkJUFdDX0RFQlVHX1JFQUQoIlZJRElPQ19RVUVSWUJVRjogbS5vZmZzZXQ9JWRcbiIsYnVmLT5tLm9mZnNldCk7CisJCQlQV0NfREVCVUdfUkVBRCgiVklESU9DX1FVRVJZQlVGOiBieXRlc3VzZWQ9JWRcbiIsYnVmLT5ieXRlc3VzZWQpOworCisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWNhc2UgVklESU9DX1FCVUY6CisJCXsKKwkJCXN0cnVjdCB2NGwyX2J1ZmZlciAqYnVmID0gYXJnOworCisJCQlQV0NfREVCVUdfSU9DVEwoImlvY3RsKFZJRElPQ19RQlVGKSBpbmRleD0lZFxuIixidWYtPmluZGV4KTsKKwkJCWlmIChidWYtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJaWYgKGJ1Zi0+bWVtb3J5ICE9IFY0TDJfTUVNT1JZX01NQVApCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlpZiAoYnVmLT5pbmRleCA8IDAgfHwgYnVmLT5pbmRleCA+PSBwd2NfbWJ1ZnMpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCWJ1Zi0+ZmxhZ3MgfD0gVjRMMl9CVUZfRkxBR19RVUVVRUQ7CisJCQlidWYtPmZsYWdzICY9IH5WNEwyX0JVRl9GTEFHX0RPTkU7CisKKwkJCXJldHVybiAwOworCQl9CisKKwkJY2FzZSBWSURJT0NfRFFCVUY6CisJCXsKKwkJCXN0cnVjdCB2NGwyX2J1ZmZlciAqYnVmID0gYXJnOworCQkJaW50IHJldDsKKworCQkJUFdDX0RFQlVHX0lPQ1RMKCJpb2N0bChWSURJT0NfRFFCVUYpXG4iKTsKKworCQkJaWYgKGJ1Zi0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCS8qIEFkZCBvdXJzZWx2ZXMgdG8gdGhlIGZyYW1lIHdhaXQtcXVldWUuCisKKwkJCSAgIEZJWE1FOiBuZWVkcyBhdWRpdGluZyBmb3Igc2FmZXR5LgorCQkJICAgUVVFU1RJT046IEluIHdoYXQgcmVzcGVjdD8gSSB0aGluayB0aGF0IHVzaW5nIHRoZQorCQkJCSAgICAgZnJhbWVxIGlzIHNhZmUgbm93LgorCQkJICovCisJCQlhZGRfd2FpdF9xdWV1ZSgmcGRldi0+ZnJhbWVxLCAmd2FpdCk7CisJCQl3aGlsZSAocGRldi0+ZnVsbF9mcmFtZXMgPT0gTlVMTCkgeworCQkJCWlmIChwZGV2LT5lcnJvcl9zdGF0dXMpIHsKKwkJCQkJcmVtb3ZlX3dhaXRfcXVldWUoJnBkZXYtPmZyYW1lcSwgJndhaXQpOworCQkJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCQkJCQlyZXR1cm4gLXBkZXYtPmVycm9yX3N0YXR1czsKKwkJCQl9CisKKwkJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQkJcmVtb3ZlX3dhaXRfcXVldWUoJnBkZXYtPmZyYW1lcSwgJndhaXQpOworCQkJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCQkJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCQkJCX0KKwkJCQlzY2hlZHVsZSgpOworCQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCQl9CisJCQlyZW1vdmVfd2FpdF9xdWV1ZSgmcGRldi0+ZnJhbWVxLCAmd2FpdCk7CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCisJCQlQV0NfREVCVUdfSU9DVEwoIlZJRElPQ19EUUJVRjogZnJhbWUgcmVhZHkuXG4iKTsKKwkJCS8qIERlY29tcHJlc3MgZGF0YSBpbiBwZGV2LT5pbWFnZXNbcGRldi0+ZmlsbF9pbWFnZV0gKi8KKwkJCXJldCA9IHB3Y19oYW5kbGVfZnJhbWUocGRldik7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJUFdDX0RFQlVHX0lPQ1RMKCJWSURJT0NfRFFCVUY6IGFmdGVyIHB3Y19oYW5kbGVfZnJhbWVcbiIpOworCisJCQlidWYtPmluZGV4ID0gcGRldi0+ZmlsbF9pbWFnZTsKKwkJCWlmIChwZGV2LT52cGFsZXR0ZSA9PSBWSURFT19QQUxFVFRFX1JBVykKKwkJCQlidWYtPmJ5dGVzdXNlZCA9IHBkZXYtPmZyYW1lX3NpemUgKyBzaXplb2Yoc3RydWN0IHB3Y19yYXdfZnJhbWUpOworCQkJZWxzZQorCQkJCWJ1Zi0+Ynl0ZXN1c2VkID0gcGRldi0+dmlldy5zaXplOworCQkJYnVmLT5mbGFncyA9IFY0TDJfQlVGX0ZMQUdfTUFQUEVEOworCQkJYnVmLT5maWVsZCA9IFY0TDJfRklFTERfTk9ORTsKKwkJCWRvX2dldHRpbWVvZmRheSgmYnVmLT50aW1lc3RhbXApOworCQkJYnVmLT5zZXF1ZW5jZSA9IDA7CisJCQlidWYtPm1lbW9yeSA9IFY0TDJfTUVNT1JZX01NQVA7CisJCQlidWYtPm0ub2Zmc2V0ID0gcGRldi0+ZmlsbF9pbWFnZSAqIHBkZXYtPmxlbl9wZXJfaW1hZ2U7CisJCQlidWYtPmxlbmd0aCA9IGJ1Zi0+Ynl0ZXN1c2VkOworCQkJcHdjX25leHRfaW1hZ2UocGRldik7CisKKwkJCVBXQ19ERUJVR19JT0NUTCgiVklESU9DX0RRQlVGOiBidWYtPmluZGV4PSVkXG4iLGJ1Zi0+aW5kZXgpOworCQkJUFdDX0RFQlVHX0lPQ1RMKCJWSURJT0NfRFFCVUY6IGJ1Zi0+bGVuZ3RoPSVkXG4iLGJ1Zi0+bGVuZ3RoKTsKKwkJCVBXQ19ERUJVR19JT0NUTCgiVklESU9DX0RRQlVGOiBtLm9mZnNldD0lZFxuIixidWYtPm0ub2Zmc2V0KTsKKwkJCVBXQ19ERUJVR19JT0NUTCgiVklESU9DX0RRQlVGOiBieXRlc3VzZWQ9JWRcbiIsYnVmLT5ieXRlc3VzZWQpOworCQkJUFdDX0RFQlVHX0lPQ1RMKCJWSURJT0NfRFFCVUY6IGxlYXZpbmdcbiIpOworCQkJcmV0dXJuIDA7CisKKwkJfQorCisJCWNhc2UgVklESU9DX1NUUkVBTU9OOgorCQl7CisJCQkvKiBXQVJOSU5HOiBwd2NfdHJ5X3ZpZGVvX21vZGUoKSBjYWxsZWQgcHdjX2lzb2NfaW5pdCAqLworCQkJcHdjX2lzb2NfaW5pdChwZGV2KTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJY2FzZSBWSURJT0NfU1RSRUFNT0ZGOgorCQl7CisJCQlwd2NfaXNvY19jbGVhbnVwKHBkZXYpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlkZWZhdWx0OgorCQkJcmV0dXJuIHB3Y19pb2N0bChwZGV2LCBjbWQsIGFyZyk7CisJfSAvKiAuLnN3aXRjaCAqLworCXJldHVybiAwOworfQorCisvKiB2aW06IHNldCBjaW5vPSBmb3JtYXRvcHRpb25zPWNyb3FsIGNpbmRlbnQgc2hpZnR3aWR0aD04IHRhYnN0b3A9ODogKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLmgKaW5kZXggMWIwZWUwYy4uNjI5Zjc5ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLmgKQEAgLTEsNSArMSw1IEBACiAvKiAoQykgMTk5OS0yMDAzIE5lbW9zb2Z0IFVudi4KLSAgIChDKSAyMDA0ICAgICAgTHVjIFNhaWxsYXJkIChsdWNAc2FpbGxhcmQub3JnKQorICAgKEMpIDIwMDQtMjAwNiBMdWMgU2FpbGxhcmQgKGx1Y0BzYWlsbGFyZC5vcmcpCiAKICAgIE5PVEU6IHRoaXMgdmVyc2lvbiBvZiBwd2MgaXMgYW4gdW5vZmZpY2lhbCAobW9kaWZpZWQpIHJlbGVhc2Ugb2YgcHdjICYgcGN3eAogICAgZHJpdmVyIGFuZCB0aHVzIG1heSBoYXZlIGJ1Z3MgdGhhdCBhcmUgbm90IHByZXNlbnQgaW4gdGhlIG9yaWdpbmFsIHZlcnNpb24uCkBAIC0yOSw1MSArMjksODcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC91c2IuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KICNpbmNsdWRlIDxhc20vZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CiAKICNpbmNsdWRlICJwd2MtdW5jb21wcmVzcy5oIgotI2luY2x1ZGUgInB3Yy1pb2N0bC5oIgotCi0vKiBEZWZpbmVzIGFuZCBzdHJ1Y3R1cmVzIGZvciB0aGUgUGhpbGlwcyB3ZWJjYW0gKi8KLS8qIFVzZWQgZm9yIGNoZWNraW5nIG1lbW9yeSBjb3JydXB0aW9uL3BvaW50ZXIgdmFsaWRhdGlvbiAqLwotI2RlZmluZSBQV0NfTUFHSUMgMHg4OURDMTBBQlVMCi0jdW5kZWYgUFdDX01BR0lDCisjaW5jbHVkZSA8bWVkaWEvcHdjLWlvY3RsLmg+CiAKIC8qIFR1cm4gc29tZSBkZWJ1Z2dpbmcgb3B0aW9ucyBvbi9vZmYgKi8KLSNkZWZpbmUgUFdDX0RFQlVHIDAKKyNpZm5kZWYgQ09ORklHX1BXQ19ERUJVRworI2RlZmluZSBDT05GSUdfUFdDX0RFQlVHIDEKKyNlbmRpZgorCisvKiBWZXJzaW9uIGJsb2NrICovCisjZGVmaW5lIFBXQ19NQUpPUgkxMAorI2RlZmluZSBQV0NfTUlOT1IJMAorI2RlZmluZSBQV0NfRVhUUkFNSU5PUgkxMgorI2RlZmluZSBQV0NfVkVSU0lPTl9DT0RFIEtFUk5FTF9WRVJTSU9OKFBXQ19NQUpPUixQV0NfTUlOT1IsUFdDX0VYVFJBTUlOT1IpCisjZGVmaW5lIFBXQ19WRVJTSU9OIAkiMTAuMC4xMiIKKyNkZWZpbmUgUFdDX05BTUUgCSJwd2MiCisjZGVmaW5lIFBGWAkJUFdDX05BTUUgIjogIgorCiAKIC8qIFRyYWNlIGNlcnRhaW4gYWN0aW9ucyBpbiB0aGUgZHJpdmVyICovCi0jZGVmaW5lIFRSQUNFX01PRFVMRQkweDAwMDEKLSNkZWZpbmUgVFJBQ0VfUFJPQkUJMHgwMDAyCi0jZGVmaW5lIFRSQUNFX09QRU4JMHgwMDA0Ci0jZGVmaW5lIFRSQUNFX1JFQUQJMHgwMDA4Ci0jZGVmaW5lIFRSQUNFX01FTU9SWQkweDAwMTAKLSNkZWZpbmUgVFJBQ0VfRkxPVwkweDAwMjAKLSNkZWZpbmUgVFJBQ0VfU0laRQkweDAwNDAKLSNkZWZpbmUgVFJBQ0VfUFdDWAkweDAwODAKLSNkZWZpbmUgVFJBQ0VfU0VRVUVOQ0UJMHgxMDAwCisjZGVmaW5lIFBXQ19ERUJVR19MRVZFTF9NT0RVTEUJKDE8PDApCisjZGVmaW5lIFBXQ19ERUJVR19MRVZFTF9QUk9CRQkoMTw8MSkKKyNkZWZpbmUgUFdDX0RFQlVHX0xFVkVMX09QRU4JKDE8PDIpCisjZGVmaW5lIFBXQ19ERUJVR19MRVZFTF9SRUFECSgxPDwzKQorI2RlZmluZSBQV0NfREVCVUdfTEVWRUxfTUVNT1JZCSgxPDw0KQorI2RlZmluZSBQV0NfREVCVUdfTEVWRUxfRkxPVwkoMTw8NSkKKyNkZWZpbmUgUFdDX0RFQlVHX0xFVkVMX1NJWkUJKDE8PDYpCisjZGVmaW5lIFBXQ19ERUJVR19MRVZFTF9JT0NUTAkoMTw8NykKKyNkZWZpbmUgUFdDX0RFQlVHX0xFVkVMX1RSQUNFCSgxPDw4KQogCi0jZGVmaW5lIFRyYWNlKFIsIEEuLi4pIGlmIChwd2NfdHJhY2UgJiBSKSBwcmludGsoS0VSTl9ERUJVRyBQV0NfTkFNRSAiICIgQSkKLSNkZWZpbmUgRGVidWcoQS4uLikgcHJpbnRrKEtFUk5fREVCVUcgUFdDX05BTUUgIiAiIEEpCi0jZGVmaW5lIEluZm8oQS4uLikgIHByaW50ayhLRVJOX0lORk8gIFBXQ19OQU1FICIgIiBBKQotI2RlZmluZSBFcnIoQS4uLikgICBwcmludGsoS0VSTl9FUlIgICBQV0NfTkFNRSAiICIgQSkKKyNkZWZpbmUgUFdDX0RFQlVHX01PRFVMRShmbXQsIGFyZ3MuLi4pIFBXQ19ERUJVRyhNT0RVTEUsIGZtdCwgIyNhcmdzKQorI2RlZmluZSBQV0NfREVCVUdfUFJPQkUoZm10LCBhcmdzLi4uKSBQV0NfREVCVUcoUFJPQkUsIGZtdCwgIyNhcmdzKQorI2RlZmluZSBQV0NfREVCVUdfT1BFTihmbXQsIGFyZ3MuLi4pIFBXQ19ERUJVRyhPUEVOLCBmbXQsICMjYXJncykKKyNkZWZpbmUgUFdDX0RFQlVHX1JFQUQoZm10LCBhcmdzLi4uKSBQV0NfREVCVUcoUkVBRCwgZm10LCAjI2FyZ3MpCisjZGVmaW5lIFBXQ19ERUJVR19NRU1PUlkoZm10LCBhcmdzLi4uKSBQV0NfREVCVUcoTUVNT1JZLCBmbXQsICMjYXJncykKKyNkZWZpbmUgUFdDX0RFQlVHX0ZMT1coZm10LCBhcmdzLi4uKSBQV0NfREVCVUcoRkxPVywgZm10LCAjI2FyZ3MpCisjZGVmaW5lIFBXQ19ERUJVR19TSVpFKGZtdCwgYXJncy4uLikgUFdDX0RFQlVHKFNJWkUsIGZtdCwgIyNhcmdzKQorI2RlZmluZSBQV0NfREVCVUdfSU9DVEwoZm10LCBhcmdzLi4uKSBQV0NfREVCVUcoSU9DVEwsIGZtdCwgIyNhcmdzKQorI2RlZmluZSBQV0NfREVCVUdfVFJBQ0UoZm10LCBhcmdzLi4uKSBQV0NfREVCVUcoVFJBQ0UsIGZtdCwgIyNhcmdzKQogCiAKKyNpZiBDT05GSUdfUFdDX0RFQlVHCisKKyNkZWZpbmUgUFdDX0RFQlVHX0xFVkVMCShQV0NfREVCVUdfTEVWRUxfTU9EVUxFKQorCisjZGVmaW5lIFBXQ19ERUJVRyhsZXZlbCwgZm10LCBhcmdzLi4uKSBkbyB7XAorCSAgaWYgKChQV0NfREVCVUdfTEVWRUxfICMjbGV2ZWwpICYgcHdjX3RyYWNlKSBcCisJICAgICBwcmludGsoS0VSTl9ERUJVRyBQRlggZm10LCAjI2FyZ3MpOyBcCisJICB9IHdoaWxlKDApCisKKyNkZWZpbmUgUFdDX0VSUk9SKGZtdCwgYXJncy4uLikgcHJpbnRrKEtFUk5fRVJSIFBGWCBmbXQsICMjYXJncykKKyNkZWZpbmUgUFdDX1dBUk5JTkcoZm10LCBhcmdzLi4uKSBwcmludGsoS0VSTl9XQVJOSU5HIFBGWCBmbXQsICMjYXJncykKKyNkZWZpbmUgUFdDX0lORk8oZm10LCBhcmdzLi4uKSBwcmludGsoS0VSTl9JTkZPIFBGWCBmbXQsICMjYXJncykKKyNkZWZpbmUgUFdDX1RSQUNFKGZtdCwgYXJncy4uLikgUFdDX0RFQlVHKFRSQUNFLCBmbXQsICMjYXJncykKKworI2Vsc2UgLyogaWYgISBDT05GSUdfUFdDX0RFQlVHICovCisKKyNkZWZpbmUgUFdDX0VSUk9SKGZtdCwgYXJncy4uLikgcHJpbnRrKEtFUk5fRVJSIFBGWCBmbXQsICMjYXJncykKKyNkZWZpbmUgUFdDX1dBUk5JTkcoZm10LCBhcmdzLi4uKSBwcmludGsoS0VSTl9XQVJOSU5HIFBGWCBmbXQsICMjYXJncykKKyNkZWZpbmUgUFdDX0lORk8oZm10LCBhcmdzLi4uKSBwcmludGsoS0VSTl9JTkZPIFBGWCBmbXQsICMjYXJncykKKyNkZWZpbmUgUFdDX1RSQUNFKGZtdCwgYXJncy4uLikgZG8geyB9IHdoaWxlKDApCisjZGVmaW5lIFBXQ19ERUJVRyhsZXZlbCwgZm10LCBhcmdzLi4uKSBkbyB7IH0gd2hpbGUoMCkKKworI2RlZmluZSBwd2NfdHJhY2UgMAorCisjZW5kaWYKKwogLyogRGVmaW5lcyBmb3IgVG9VQ2FtIGNhbWVyYXMgKi8KICNkZWZpbmUgVE9VQ0FNX0hFQURFUl9TSVpFCQk4CiAjZGVmaW5lIFRPVUNBTV9UUkFJTEVSX1NJWkUJCTQKIAogI2RlZmluZSBGRUFUVVJFX01PVE9SX1BBTlRJTFQJCTB4MDAwMQotCi0vKiBWZXJzaW9uIGJsb2NrICovCi0jZGVmaW5lIFBXQ19NQUpPUgk5Ci0jZGVmaW5lIFBXQ19NSU5PUgkwCi0jZGVmaW5lIFBXQ19WRVJTSU9OIAkiOS4wLjItdW5vZmZpY2lhbCIKLSNkZWZpbmUgUFdDX05BTUUgCSJwd2MiCisjZGVmaW5lIEZFQVRVUkVfQ09ERUMxCQkJMHgwMDAyCisjZGVmaW5lIEZFQVRVUkVfQ09ERUMyCQkJMHgwMDA0CiAKIC8qIFR1cm4gY2VydGFpbiBmZWF0dXJlcyBvbi9vZmYgKi8KICNkZWZpbmUgUFdDX0lOVF9QSVBFIDAKQEAgLTk1LDYgKzEzMSwxOCBAQAogLyogQWJzb2x1dGUgbWF4aW11bSBudW1iZXIgb2YgYnVmZmVycyBhdmFpbGFibGUgZm9yIG1tYXAoKSAqLwogI2RlZmluZSBNQVhfSU1BR0VTIAkJMTAKIAorLyogU29tZSBtYWNyb3MgdG8gcXVpY2tseSBmaW5kIHRoZSB0eXBlIG9mIGEgd2ViY2FtICovCisjZGVmaW5lIERFVklDRV9VU0VfQ09ERUMxKHgpICgoeCk8Njc1KQorI2RlZmluZSBERVZJQ0VfVVNFX0NPREVDMih4KSAoKHgpPj02NzUgJiYgKHgpPDcwMCkKKyNkZWZpbmUgREVWSUNFX1VTRV9DT0RFQzMoeCkgKCh4KT49NzAwKQorI2RlZmluZSBERVZJQ0VfVVNFX0NPREVDMjMoeCkgKCh4KT49Njc1KQorCisKKyNpZm5kZWYgVjRMMl9QSVhfRk1UX1BXQzEKKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1BXQzEJdjRsMl9mb3VyY2MoJ1AnLCdXJywnQycsJzEnKQorI2RlZmluZSBWNEwyX1BJWF9GTVRfUFdDMgl2NGwyX2ZvdXJjYygnUCcsJ1cnLCdDJywnMicpCisjZW5kaWYKKwogLyogVGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmVzIHdlcmUgYmFzZWQgb24gY3BpYS5oLiBXaHkgcmVpbnZlbnQgdGhlIHdoZWVsPyA6LSkgKi8KIHN0cnVjdCBwd2NfaXNvX2J1ZgogewpAQCAtMTEwLDE3ICsxNTgsMTkgQEAKICAgIHZvaWQgKmRhdGE7CiAgICB2b2xhdGlsZSBpbnQgZmlsbGVkOwkJLyogbnVtYmVyIG9mIGJ5dGVzIGZpbGxlZCAqLwogICAgc3RydWN0IHB3Y19mcmFtZV9idWYgKm5leHQ7CS8qIGxpc3QgKi8KLSNpZiBQV0NfREVCVUcKLSAgIGludCBzZXF1ZW5jZTsJCS8qIFNlcXVlbmNlIG51bWJlciAqLwotI2VuZGlmCit9OworCisvKiBhZGRpdGlvbm5hbCBpbmZvcm1hdGlvbnMgdXNlZCB3aGVuIGRlYWxpbmcgaW1hZ2UgYmV0d2VlbiBrZXJuZWwgYW5kIHVzZXJsYW5kICovCitzdHJ1Y3QgcHdjX2ltZ2J1ZgoreworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwkvKiBvZmZzZXQgb2YgdGhpcyBidWZmZXIgaW4gdGhlIGJpZyBhcnJheSBvZiBpbWFnZV9kYXRhICovCisJaW50ICAgdm1hX3VzZV9jb3VudDsJLyogY291bnQgdGhlIG51bWJlciBvZiB0aW1lIHRoaXMgbWVtb3J5IGlzIG1hcHBlZCAqLwogfTsKIAogc3RydWN0IHB3Y19kZXZpY2UKIHsKICAgIHN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXY7Ci0jaWZkZWYgUFdDX01BR0lDCi0gICBpbnQgbWFnaWM7Ci0jZW5kaWYKKwogICAgLyogUG9pbnRlciB0byBvdXIgdXNiX2RldmljZSAqLwogICAgc3RydWN0IHVzYl9kZXZpY2UgKnVkZXY7CiAKQEAgLTE3NywxMiArMjI3LDggQEAKICAgIGludCBmcmFtZV9zaXplOwogICAgaW50IGZyYW1lX3RvdGFsX3NpemU7IC8qIGluY2x1ZGluZyBoZWFkZXIgJiB0cmFpbGVyICovCiAgICBpbnQgZHJvcF9mcmFtZXM7Ci0jaWYgUFdDX0RFQlVHCi0gICBpbnQgc2VxdWVuY2U7CQkJLyogRGVidWdnaW5nIGFpZCAqLwotI2VuZGlmCiAKICAgIC8qIDM6IGRlY29tcHJlc3Npb24gKi8KLSAgIHN0cnVjdCBwd2NfZGVjb21wcmVzc29yICpkZWNvbXByZXNzb3I7CS8qIGZ1bmN0aW9uIGJsb2NrIHdpdGggZGVjb21wcmVzc2lvbiByb3V0aW5lcyAqLwogICAgdm9pZCAqZGVjb21wcmVzc19kYXRhOwkJLyogcHJpdmF0ZSBkYXRhIGZvciBkZWNvbXByZXNzaW9uIGVuZ2luZSAqLwogCiAgICAvKiA0OiBpbWFnZSAqLwpAQCAtMTk4LDcgKzI0NCw3IEBACiAgICBzdHJ1Y3QgcHdjX2Nvb3JkIG9mZnNldDsJCS8qIG9mZnNldCB3aXRoaW4gdGhlIHZpZXdwb3J0ICovCiAKICAgIHZvaWQgKmltYWdlX2RhdGE7CQkJLyogdG90YWwgYnVmZmVyLCB3aGljaCBpcyBzdWJkaXZpZGVkIGludG8gLi4uICovCi0gICB2b2lkICppbWFnZV9wdHJbTUFYX0lNQUdFU107CQkvKiAuLi5zZXZlcmFsIGltYWdlcy4uLiAqLworICAgc3RydWN0IHB3Y19pbWdidWYgaW1hZ2VzW01BWF9JTUFHRVNdOy8qIC4uLnNldmVyYWwgaW1hZ2VzLi4uICovCiAgICBpbnQgZmlsbF9pbWFnZTsJCQkvKiAuLi53aGljaCBhcmUgcm90YXRlZC4gKi8KICAgIGludCBsZW5fcGVyX2ltYWdlOwkJCS8qIGxlbmd0aCBwZXIgaW1hZ2UgKi8KICAgIGludCBpbWFnZV9yZWFkX3BvczsJCQkvKiBJbiBjYXNlIHdlIHJlYWQgZGF0YSBpbiBwaWVjZXMsIGtlZXAgdHJhY2sgb2Ygd2VyZSB3ZSBhcmUgaW4gdGhlIGltYWdlYnVmZmVyICovCkBAIC0yMTEsNiArMjU3LDcgQEAKICAgIHN0cnVjdCBwd2NfbXB0X3JhbmdlIGFuZ2xlX3JhbmdlOwogICAgaW50IHBhbl9hbmdsZTsJCQkvKiBpbiBkZWdyZWVzICogMTAwICovCiAgICBpbnQgdGlsdF9hbmdsZTsJCQkvKiBhYnNvbHV0ZSBhbmdsZTsgMCwwIGlzIGhvbWUgcG9zaXRpb24gKi8KKyAgIGludCBzbmFwc2hvdF9idXR0b25fc3RhdHVzOwkJLyogc2V0IHRvIDEgd2hlbiB0aGUgdXNlciBwdXNoIHRoZSBidXR0b24sIHJlc2V0IHRvIDAgd2hlbiB0aGlzIHZhbHVlIGlzIHJlYWQgKi8KIAogICAgLyoqKiBNaXNjLiBkYXRhICoqKi8KICAgIHdhaXRfcXVldWVfaGVhZF90IGZyYW1lcTsJCS8qIFdoZW4gd2FpdGluZyBmb3IgYSBmcmFtZSB0byBmaW5pc2guLi4gKi8KQEAgLTIxOSwyMCArMjY2LDI2IEBACiAjZW5kaWYKIH07CiAKLQogI2lmZGVmIF9fY3BsdXNwbHVzCiBleHRlcm4gIkMiIHsKICNlbmRpZgogCi0vKiBHbG9iYWwgdmFyaWFibGUgKi8KKy8qIEdsb2JhbCB2YXJpYWJsZXMgKi8KKyNpZiBDT05GSUdfUFdDX0RFQlVHCiBleHRlcm4gaW50IHB3Y190cmFjZTsKKyNlbmRpZgorZXh0ZXJuIGludCBwd2NfbWJ1ZnM7CiAKIC8qKiBmdW5jdGlvbnMgaW4gcHdjLWlmLmMgKi8KIGludCBwd2NfdHJ5X3ZpZGVvX21vZGUoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IG5ld19mcHMsIGludCBuZXdfY29tcHJlc3Npb24sIGludCBuZXdfc25hcHNob3QpOworaW50IHB3Y19oYW5kbGVfZnJhbWUoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpOwordm9pZCBwd2NfbmV4dF9pbWFnZShzdHJ1Y3QgcHdjX2RldmljZSAqcGRldik7CitpbnQgcHdjX2lzb2NfaW5pdChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldik7Cit2b2lkIHB3Y19pc29jX2NsZWFudXAoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpOwogCiAvKiogRnVuY3Rpb25zIGluIHB3Yy1taXNjLmMgKi8KIC8qIHNpemVzIGluIHBpeGVscyAqLwotZXh0ZXJuIHN0cnVjdCBwd2NfY29vcmQgcHdjX2ltYWdlX3NpemVzW1BTWl9NQVhdOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBwd2NfY29vcmQgcHdjX2ltYWdlX3NpemVzW1BTWl9NQVhdOwogCiBpbnQgcHdjX2RlY29kZV9zaXplKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOwogdm9pZCBwd2NfY29uc3RydWN0KHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KTsKQEAgLTI0MCw2ICsyOTMsOSBAQAogLyoqIEZ1bmN0aW9ucyBpbiBwd2MtY3RybC5jICovCiAvKiBSZXF1ZXN0IGEgY2VydGFpbiB2aWRlbyBtb2RlLiBSZXR1cm5zIDwgMCBpZiBub3QgcG9zc2libGUgKi8KIGV4dGVybiBpbnQgcHdjX3NldF92aWRlb19tb2RlKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBmcmFtZXMsIGludCBjb21wcmVzc2lvbiwgaW50IHNuYXBzaG90KTsKKy8qIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHBlciBpbWFnZSAobm90IGZyYW1lKSAqLworZXh0ZXJuIGludCBwd2NfbXB0X3Jlc2V0KHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgZmxhZ3MpOworZXh0ZXJuIGludCBwd2NfbXB0X3NldF9hbmdsZShzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IHBhbiwgaW50IHRpbHQpOwogCiAvKiBWYXJpb3VzIGNvbnRyb2xzOyBzaG91bGQgYmUgb2J2aW91cy4gVmFsdWUgMC4uNjU1MzUsIG9yIDwgMCBvbiBlcnJvciAqLwogZXh0ZXJuIGludCBwd2NfZ2V0X2JyaWdodG5lc3Moc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpOwpAQCAtMjQ4LDEwICszMDQsMzYgQEAKIGV4dGVybiBpbnQgcHdjX3NldF9jb250cmFzdChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IHZhbHVlKTsKIGV4dGVybiBpbnQgcHdjX2dldF9nYW1tYShzdHJ1Y3QgcHdjX2RldmljZSAqcGRldik7CiBleHRlcm4gaW50IHB3Y19zZXRfZ2FtbWEoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCB2YWx1ZSk7Ci1leHRlcm4gaW50IHB3Y19nZXRfc2F0dXJhdGlvbihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldik7CitleHRlcm4gaW50IHB3Y19nZXRfc2F0dXJhdGlvbihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50ICp2YWx1ZSk7CiBleHRlcm4gaW50IHB3Y19zZXRfc2F0dXJhdGlvbihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IHZhbHVlKTsKIGV4dGVybiBpbnQgcHdjX3NldF9sZWRzKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgb25fdmFsdWUsIGludCBvZmZfdmFsdWUpOwogZXh0ZXJuIGludCBwd2NfZ2V0X2Ntb3Nfc2Vuc29yKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgKnNlbnNvcik7CitleHRlcm4gaW50IHB3Y19yZXN0b3JlX3VzZXIoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpOworZXh0ZXJuIGludCBwd2Nfc2F2ZV91c2VyKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KTsKK2V4dGVybiBpbnQgcHdjX3Jlc3RvcmVfZmFjdG9yeShzdHJ1Y3QgcHdjX2RldmljZSAqcGRldik7CisKKy8qIGV4cG9ydGVkIGZvciB1c2UgYnkgdjRsMiBjb250cm9scyAqLworZXh0ZXJuIGludCBwd2NfZ2V0X3JlZF9nYWluKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgKnZhbHVlKTsKK2V4dGVybiBpbnQgcHdjX3NldF9yZWRfZ2FpbihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IHZhbHVlKTsKK2V4dGVybiBpbnQgcHdjX2dldF9ibHVlX2dhaW4oc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCAqdmFsdWUpOworZXh0ZXJuIGludCBwd2Nfc2V0X2JsdWVfZ2FpbihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IHZhbHVlKTsKK2V4dGVybiBpbnQgcHdjX2dldF9hd2Ioc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpOworZXh0ZXJuIGludCBwd2Nfc2V0X2F3YihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IG1vZGUpOworZXh0ZXJuIGludCBwd2Nfc2V0X2FnYyhzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IG1vZGUsIGludCB2YWx1ZSk7CitleHRlcm4gaW50IHB3Y19nZXRfYWdjKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgKnZhbHVlKTsKK2V4dGVybiBpbnQgcHdjX3NldF9zaHV0dGVyX3NwZWVkKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgbW9kZSwgaW50IHZhbHVlKTsKK2V4dGVybiBpbnQgcHdjX2dldF9zaHV0dGVyX3NwZWVkKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgKnZhbHVlKTsKKworZXh0ZXJuIGludCBwd2Nfc2V0X2NvbG91cl9tb2RlKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgY29sb3VyKTsKK2V4dGVybiBpbnQgcHdjX2dldF9jb2xvdXJfbW9kZShzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50ICpjb2xvdXIpOworZXh0ZXJuIGludCBwd2Nfc2V0X2NvbnRvdXIoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCBjb250b3VyKTsKK2V4dGVybiBpbnQgcHdjX2dldF9jb250b3VyKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgKmNvbnRvdXIpOworZXh0ZXJuIGludCBwd2Nfc2V0X2JhY2tsaWdodChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IGJhY2tsaWdodCk7CitleHRlcm4gaW50IHB3Y19nZXRfYmFja2xpZ2h0KHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgKmJhY2tsaWdodCk7CitleHRlcm4gaW50IHB3Y19zZXRfZmxpY2tlcihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IGZsaWNrZXIpOworZXh0ZXJuIGludCBwd2NfZ2V0X2ZsaWNrZXIoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCAqZmxpY2tlcik7CitleHRlcm4gaW50IHB3Y19zZXRfZHluYW1pY19ub2lzZShzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IG5vaXNlKTsKK2V4dGVybiBpbnQgcHdjX2dldF9keW5hbWljX25vaXNlKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgKm5vaXNlKTsKIAogLyogUG93ZXIgZG93biBvciB1cCB0aGUgY2FtZXJhOyBub3Qgc3VwcG9ydGVkIGJ5IGFsbCBtb2RlbHMgKi8KIGV4dGVybiBpbnQgcHdjX2NhbWVyYV9wb3dlcihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IHBvd2VyKTsKQEAgLTI1OSw2ICszNDEsOSBAQAogLyogUHJpdmF0ZSBpb2N0bCgpczsgc2VlIHB3Yy1pb2N0bC5oICovCiBleHRlcm4gaW50IHB3Y19pb2N0bChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKTsKIAorLyoqIEZ1bmN0aW9ucyBpbiBwd2MtdjRsLmMgKi8KK2V4dGVybiBpbnQgcHdjX3ZpZGVvX2RvX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJICAgICAgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKTsKIAogLyoqIHB3Yy11bmNvbXByZXNzLmMgKi8KIC8qIEV4cGFuZCBmcmFtZSB0byBpbWFnZSwgcG9zc2libHkgaW5jbHVkaW5nIGRlY29tcHJlc3Npb24uIFVzZXMgcmVhZF9mcmFtZSBhbmQgZmlsbF9pbWFnZSAqLwpAQCAtMjcwLDMgKzM1NSw0IEBACiAKIAogI2VuZGlmCisvKiB2aW06IHNldCBjaW5vPSBmb3JtYXRvcHRpb25zPWNyb3FsIGNpbmRlbnQgc2hpZnR3aWR0aD04IHRhYnN0b3A9ODogKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNTI0NmEuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNTI0NmEuYwppbmRleCBkZDgzMGUwLi41OWExODcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTUyNDZhLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE1MjQ2YS5jCkBAIC00Niw2ICs0Niw3IEBACiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW90ZXh0Lmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAKICNpbmNsdWRlICJzYWE1MjQ2YS5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE1MjQ5LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTUyNDkuYwppbmRleCA1MzFlOTQ2Li4xOWE4ZDY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTUyNDkuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTUyNDkuYwpAQCAtNTYsNiArNTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvdGV4dC5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzExMC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTEwLmMKaW5kZXggNDFkOTUxZC4uNjc2Yjk5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTEwLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTEwLmMKQEAgLTQzLDYgKzQzLDcgQEAKICNkZWZpbmUgSTJDX05BTUUocykgKHMpLT5uYW1lCiAKICNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9fZGVjb2Rlci5oPgogCiBzdGF0aWMgaW50IGRlYnVnID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzExNS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTE1LmMKaW5kZXggZGNlZWJjMC4uYjU5YzExNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTE1LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTE1LmMKQEAgLTcyLDYgKzcyLDEwIEBACiAJaW50IHNhdDsKIAllbnVtIHY0bDJfY2hpcF9pZGVudCBpZGVudDsKIAl1MzIgYXVkY2xrX2ZyZXE7CisJdTMyIGNyeXN0YWxfZnJlcTsKKwl1OCB1Y2djOworCXU4IGNnY2RpdjsKKwl1OCBhcGxsOwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTM3NSwxMCArMzc5LDYgQEAKIH07CiAKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHNhYTcxMTVfaW5pdF9taXNjW10gPSB7Ci0JMHgzOCwgMHgwMywJCS8qIGF1ZGlvIHN0dWZmICovCi0JMHgzOSwgMHgxMCwKLQkweDNhLCAweDA4LAotCiAJMHg4MSwgMHgwMSwJCS8qIHJlZyAweDE1LDB4MTYgZGVmaW5lIGJsYW5raW5nIHdpbmRvdyAqLwogCTB4ODIsIDB4MDAsCiAJMHg4MywgMHgwMSwJCS8qIEkgcG9ydCBzZXR0aW5ncyAqLwpAQCAtNTg0LDYgKzU4NCw3IEBACiAJdTMyIGFjbmk7CiAJdTMyIGh6OwogCXU2NCBmOworCXU4IGFjYyA9IDA7IAkvKiByZWcgMHgzYSwgYXVkaW8gY2xvY2sgY29udHJvbCAqLwogCiAJdjRsX2RiZygxLCBkZWJ1ZywgY2xpZW50LCAic2V0IGF1ZGlvIGNsb2NrIGZyZXE6ICVkXG4iLCBmcmVxKTsKIApAQCAtNTkxLDE4ICs1OTIsMzQgQEAKIAlpZiAoZnJlcSA8IDMyMDAwIHx8IGZyZXEgPiA0ODAwMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwkvKiBUaGUgc2FhNzExMyBoYXMgbm8gYXVkaW8gY2xvY2sgKi8KKwlpZiAoc3RhdGUtPmlkZW50ID09IFY0TDJfSURFTlRfU0FBNzExMykKKwkJcmV0dXJuIDA7CisKIAkvKiBoeiBpcyB0aGUgcmVmcmVzaCByYXRlIHRpbWVzIDEwMCAqLwogCWh6ID0gKHN0YXRlLT5zdGQgJiBWNEwyX1NURF81MjVfNjApID8gNTk5NCA6IDUwMDA7CiAJLyogYWNwZiA9ICgyNTYgKiBmcmVxKSAvIGZpZWxkX2ZyZXF1ZW5jeSA9PSAoMjU2ICogMTAwICogZnJlcSkgLyBoeiAqLwogCWFjcGYgPSAoMjU2MDAgKiBmcmVxKSAvIGh6OwogCS8qIGFjbmkgPSAoMjU2ICogZnJlcSAqIDJeMjMpIC8gY3J5c3RhbF9mcmVxdWVuY3kgPQogCQkgIChmcmVxICogMl4oOCsyMykpIC8gY3J5c3RhbF9mcmVxdWVuY3kgPQotCQkgIChmcmVxIDw8IDMxKSAvIDMyLjExIE1IeiAqLworCQkgIChmcmVxIDw8IDMxKSAvIGNyeXN0YWxfZnJlcXVlbmN5ICovCiAJZiA9IGZyZXE7CiAJZiA9IGYgPDwgMzE7Ci0JZG9fZGl2KGYsIDMyMTEwMDAwKTsKKwlkb19kaXYoZiwgc3RhdGUtPmNyeXN0YWxfZnJlcSk7CiAJYWNuaSA9IGY7CisJaWYgKHN0YXRlLT51Y2djKSB7CisJCWFjcGYgPSBhY3BmICogc3RhdGUtPmNnY2RpdiAvIDE2OworCQlhY25pID0gYWNuaSAqIHN0YXRlLT5jZ2NkaXYgLyAxNjsKKwkJYWNjID0gMHg4MDsKKwkJaWYgKHN0YXRlLT5jZ2NkaXYgPT0gMykKKwkJCWFjYyB8PSAweDQwOworCX0KKwlpZiAoc3RhdGUtPmFwbGwpCisJCWFjYyB8PSAweDA4OwogCisJc2FhNzExNV93cml0ZShjbGllbnQsIDB4MzgsIDB4MDMpOworCXNhYTcxMTVfd3JpdGUoY2xpZW50LCAweDM5LCAweDEwKTsKKwlzYWE3MTE1X3dyaXRlKGNsaWVudCwgMHgzYSwgYWNjKTsKIAlzYWE3MTE1X3dyaXRlKGNsaWVudCwgMHgzMCwgYWNwZiAmIDB4ZmYpOwogCXNhYTcxMTVfd3JpdGUoY2xpZW50LCAweDMxLCAoYWNwZiA+PiA4KSAmIDB4ZmYpOwogCXNhYTcxMTVfd3JpdGUoY2xpZW50LCAweDMyLCAoYWNwZiA+PiAxNikgJiAweDAzKTsKQEAgLTEwNzMsNDggKzEwOTAsNiBAQAogCiAvKiA9PT09PT09PT09PT0gU0FBNzExNSBBVURJTyBzZXR0aW5ncyAoZW5kKSA9PT09PT09PT09PT09ICovCiAKLXN0YXRpYyBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgc2FhNzExNV9xY3RybFtdID0gewotCXsKLQkJLmlkICAgICAgICAgICAgPSBWNEwyX0NJRF9CUklHSFRORVNTLAotCQkudHlwZSAgICAgICAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCi0JCS5uYW1lICAgICAgICAgID0gIkJyaWdodG5lc3MiLAotCQkubWluaW11bSAgICAgICA9IDAsCi0JCS5tYXhpbXVtICAgICAgID0gMjU1LAotCQkuc3RlcCAgICAgICAgICA9IDEsCi0JCS5kZWZhdWx0X3ZhbHVlID0gMTI4LAotCQkuZmxhZ3MgICAgICAgICA9IDAsCi0JfSwgewotCQkuaWQgICAgICAgICAgICA9IFY0TDJfQ0lEX0NPTlRSQVNULAotCQkudHlwZSAgICAgICAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCi0JCS5uYW1lICAgICAgICAgID0gIkNvbnRyYXN0IiwKLQkJLm1pbmltdW0gICAgICAgPSAwLAotCQkubWF4aW11bSAgICAgICA9IDEyNywKLQkJLnN0ZXAgICAgICAgICAgPSAxLAotCQkuZGVmYXVsdF92YWx1ZSA9IDY0LAotCQkuZmxhZ3MgICAgICAgICA9IDAsCi0JfSwgewotCQkuaWQgICAgICAgICAgICA9IFY0TDJfQ0lEX1NBVFVSQVRJT04sCi0JCS50eXBlICAgICAgICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKLQkJLm5hbWUgICAgICAgICAgPSAiU2F0dXJhdGlvbiIsCi0JCS5taW5pbXVtICAgICAgID0gMCwKLQkJLm1heGltdW0gICAgICAgPSAxMjcsCi0JCS5zdGVwICAgICAgICAgID0gMSwKLQkJLmRlZmF1bHRfdmFsdWUgPSA2NCwKLQkJLmZsYWdzICAgICAgICAgPSAwLAotCX0sIHsKLQkJLmlkICAgICAgICAgICAgPSBWNEwyX0NJRF9IVUUsCi0JCS50eXBlICAgICAgICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKLQkJLm5hbWUgICAgICAgICAgPSAiSHVlIiwKLQkJLm1pbmltdW0gICAgICAgPSAtMTI4LAotCQkubWF4aW11bSAgICAgICA9IDEyNywKLQkJLnN0ZXAgICAgICAgICAgPSAxLAotCQkuZGVmYXVsdF92YWx1ZSA9IDAsCi0JCS5mbGFncyAJICAgICAgID0gMCwKLQl9LAotfTsKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQogc3RhdGljIGludCBzYWE3MTE1X2NvbW1hbmQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQogewogCXN0cnVjdCBzYWE3MTE1X3N0YXRlICpzdGF0ZSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwpAQCAtMTE1OCwxNCArMTEzMywxNiBAQAogCWNhc2UgVklESU9DX1FVRVJZQ1RSTDoKIAl7CiAJCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWMgPSBhcmc7Ci0JCWludCBpOwogCi0JCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNhYTcxMTVfcWN0cmwpOyBpKyspCi0JCQlpZiAocWMtPmlkICYmIHFjLT5pZCA9PSBzYWE3MTE1X3FjdHJsW2ldLmlkKSB7Ci0JCQkJbWVtY3B5KHFjLCAmc2FhNzExNV9xY3RybFtpXSwgc2l6ZW9mKCpxYykpOwotCQkJCXJldHVybiAwOwotCQkJfQotCQlyZXR1cm4gLUVJTlZBTDsKKwkJc3dpdGNoIChxYy0+aWQpIHsKKwkJCWNhc2UgVjRMMl9DSURfQlJJR0hUTkVTUzoKKwkJCWNhc2UgVjRMMl9DSURfQ09OVFJBU1Q6CisJCQljYXNlIFY0TDJfQ0lEX1NBVFVSQVRJT046CisJCQljYXNlIFY0TDJfQ0lEX0hVRToKKwkJCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGxfc3RkKHFjKTsKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KIAl9CiAKIAljYXNlIFZJRElPQ19HX1NURDoKQEAgLTEyMjEsMzQgKzExOTgsNiBAQAogCQlicmVhazsKIAl9CiAKLQljYXNlIFZJRElPQ19HX0lOUFVUOgotCQkqKGludCAqKWFyZyA9IHN0YXRlLT5pbnB1dDsKLQkJYnJlYWs7Ci0KLQljYXNlIFZJRElPQ19TX0lOUFVUOgotCQl2NGxfZGJnKDEsIGRlYnVnLCBjbGllbnQsICJkZWNvZGVyIHNldCBpbnB1dCAlZFxuIiwgKmlhcmcpOwotCQkvKiBpbnB1dHMgZnJvbSAwLTkgYXJlIGF2YWlsYWJsZSAqLwotCQlpZiAoKmlhcmcgPCAwIHx8ICppYXJnID4gOSkgewotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotCQlpZiAoc3RhdGUtPmlucHV0ID09ICppYXJnKQotCQkJYnJlYWs7Ci0JCXY0bF9kYmcoMSwgZGVidWcsIGNsaWVudCwgIm5vdyBzZXR0aW5nICVzIGlucHV0XG4iLAotCQkJKmlhcmcgPj0gNiA/ICJTLVZpZGVvIiA6ICJDb21wb3NpdGUiKTsKLQkJc3RhdGUtPmlucHV0ID0gKmlhcmc7Ci0KLQkJLyogc2VsZWN0IG1vZGUgKi8KLQkJc2FhNzExNV93cml0ZShjbGllbnQsIDB4MDIsCi0JCQkgICAgICAoc2FhNzExNV9yZWFkKGNsaWVudCwgMHgwMikgJiAweGYwKSB8Ci0JCQkgICAgICAgc3RhdGUtPmlucHV0KTsKLQotCQkvKiBieXBhc3MgY2hyb21pbmFuY2UgdHJhcCBmb3IgbW9kZXMgNi4uOSAqLwotCQlzYWE3MTE1X3dyaXRlKGNsaWVudCwgMHgwOSwKLQkJCSAgICAgIChzYWE3MTE1X3JlYWQoY2xpZW50LCAweDA5KSAmIDB4N2YpIHwKLQkJCSAgICAgICAoc3RhdGUtPmlucHV0IDwgNiA/IDB4MCA6IDB4ODApKTsKLQkJYnJlYWs7Ci0KIAljYXNlIFZJRElPQ19TVFJFQU1PTjoKIAljYXNlIFZJRElPQ19TVFJFQU1PRkY6CiAJCXY0bF9kYmcoMSwgZGVidWcsIGNsaWVudCwgIiVzIG91dHB1dFxuIiwKQEAgLTEyNjAsNiArMTIwOSwyMSBAQAogCQl9CiAJCWJyZWFrOwogCisJY2FzZSBWSURJT0NfSU5UX1NfQ1JZU1RBTF9GUkVROgorCXsKKwkJc3RydWN0IHY0bDJfY3J5c3RhbF9mcmVxICpmcmVxID0gYXJnOworCisJCWlmIChmcmVxLT5mcmVxICE9IFNBQTcxMTVfRlJFUV8zMl8xMV9NSFogJiYKKwkJICAgIGZyZXEtPmZyZXEgIT0gU0FBNzExNV9GUkVRXzI0XzU3Nl9NSFopCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJc3RhdGUtPmNyeXN0YWxfZnJlcSA9IGZyZXEtPmZyZXE7CisJCXN0YXRlLT5jZ2NkaXYgPSAoZnJlcS0+ZmxhZ3MgJiBTQUE3MTE1X0ZSRVFfRkxfQ0dDRElWKSA/IDMgOiA0OworCQlzdGF0ZS0+dWNnYyA9IChmcmVxLT5mbGFncyAmIFNBQTcxMTVfRlJFUV9GTF9VQ0dDKSA/IDEgOiAwOworCQlzdGF0ZS0+YXBsbCA9IChmcmVxLT5mbGFncyAmIFNBQTcxMTVfRlJFUV9GTF9BUExMKSA/IDEgOiAwOworCQlzYWE3MTE1X3NldF9hdWRpb19jbG9ja19mcmVxKGNsaWVudCwgc3RhdGUtPmF1ZGNsa19mcmVxKTsKKwkJYnJlYWs7CisJfQorCiAJY2FzZSBWSURJT0NfSU5UX0RFQ09ERV9WQklfTElORToKIAkJc2FhNzExNV9kZWNvZGVfdmJpX2xpbmUoY2xpZW50LCBhcmcpOwogCQlicmVhazsKQEAgLTE0MDEsMTAgKzEzNjUsMTMgQEAKIAl2NGxfZGJnKDEsIGRlYnVnLCBjbGllbnQsICJ3cml0aW5nIGluaXQgdmFsdWVzXG4iKTsKIAogCS8qIGluaXQgdG8gNjBoei80OGtoeiAqLwotCWlmIChzdGF0ZS0+aWRlbnQgPT0gVjRMMl9JREVOVF9TQUE3MTEzKQorCWlmIChzdGF0ZS0+aWRlbnQgPT0gVjRMMl9JREVOVF9TQUE3MTEzKSB7CisJCXN0YXRlLT5jcnlzdGFsX2ZyZXEgPSBTQUE3MTE1X0ZSRVFfMjRfNTc2X01IWjsKIAkJc2FhNzExNV93cml0ZXJlZ3MoY2xpZW50LCBzYWE3MTEzX2luaXRfYXV0b19pbnB1dCk7Ci0JZWxzZQorCX0gZWxzZSB7CisJCXN0YXRlLT5jcnlzdGFsX2ZyZXEgPSBTQUE3MTE1X0ZSRVFfMzJfMTFfTUhaOwogCQlzYWE3MTE1X3dyaXRlcmVncyhjbGllbnQsIHNhYTcxMTVfaW5pdF9hdXRvX2lucHV0KTsKKwl9CiAJc2FhNzExNV93cml0ZXJlZ3MoY2xpZW50LCBzYWE3MTE1X2luaXRfbWlzYyk7CiAJc2FhNzExNV93cml0ZXJlZ3MoY2xpZW50LCBzYWE3MTE1X2NmZ182MGh6X2Z1bGxyZXNfeCk7CiAJc2FhNzExNV93cml0ZXJlZ3MoY2xpZW50LCBzYWE3MTE1X2NmZ182MGh6X2Z1bGxyZXNfeSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMjcuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEyNy5jCmluZGV4IGMyNzFlMmUuLmFkNDAxYmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEyNy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEyNy5jCkBAIC0yNzAsNyArMjcwLDcgQEAKIAkibGV0dGVyYm94IDE2OjkgdG9wIiwKIAkiaW52YWxpZCIsCiAJImludmFsaWQiLAotCSIxNjo5IGZ1bGwgZm9ybWF0IGFuYW1vcnBoaWMiCisJIjE2OjkgZnVsbCBmb3JtYXQgYW5hbW9ycGhpYyIsCiAJIjQ6MyBmdWxsIGZvcm1hdCIsCiAJImludmFsaWQiLAogCSJpbnZhbGlkIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE2NzUyaHMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE2NzUyaHMuYwppbmRleCAwZTBiYTUwLi5kZTdiOWU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNjc1MmhzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTY3NTJocy5jCkBAIC0zOSw2ICszOSwyMyBAQAogCVNBQTY3NTJIU19WRl9VTktOT1dOLAogfTsKIAorc3RydWN0IHNhYTY3NTJoc19tcGVnX3BhcmFtcyB7CisJLyogdHJhbnNwb3J0IHN0cmVhbXMgKi8KKwlfX3UxNgkJCQl0c19waWRfcG10OworCV9fdTE2CQkJCXRzX3BpZF9hdWRpbzsKKwlfX3UxNgkJCQl0c19waWRfdmlkZW87CisJX191MTYJCQkJdHNfcGlkX3BjcjsKKworCS8qIGF1ZGlvICovCisJZW51bSB2NGwyX21wZWdfYXVkaW9fbDJfYml0cmF0ZSBhdV9sMl9iaXRyYXRlOworCisJLyogdmlkZW8gKi8KKwllbnVtIHY0bDJfbXBlZ192aWRlb19hc3BlY3QJdmlfYXNwZWN0OworCWVudW0gdjRsMl9tcGVnX3ZpZGVvX2JpdHJhdGVfbW9kZSB2aV9iaXRyYXRlX21vZGU7CisJX191MzIgCQkJCXZpX2JpdHJhdGU7CisJX191MzIgCQkJCXZpX2JpdHJhdGVfcGVhazsKK307CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9mb3JtYXQgdjRsMl9mb3JtYXRfdGFibGVbXSA9CiB7CiAJW1NBQTY3NTJIU19WRl9EMV0gPQpAQCAtNTUsMTggKzcyLDE5IEBACiAKIHN0cnVjdCBzYWE2NzUyaHNfc3RhdGUgewogCXN0cnVjdCBpMmNfY2xpZW50ICAgICAgICAgICAgIGNsaWVudDsKLQlzdHJ1Y3QgdjRsMl9tcGVnX2NvbXByZXNzaW9uICBwYXJhbXM7CisJc3RydWN0IHY0bDJfbXBlZ19jb21wcmVzc2lvbiAgb2xkX3BhcmFtczsKKwlzdHJ1Y3Qgc2FhNjc1MmhzX21wZWdfcGFyYW1zICBwYXJhbXM7CiAJZW51bSBzYWE2NzUyaHNfdmlkZW9mb3JtYXQgICAgdmlkZW9fZm9ybWF0OwogCXY0bDJfc3RkX2lkICAgICAgICAgICAgICAgICAgIHN0YW5kYXJkOwogfTsKIAogZW51bSBzYWE2NzUyaHNfY29tbWFuZCB7CiAJU0FBNjc1MkhTX0NPTU1BTkRfUkVTRVQgPSAwLAotICAgIAlTQUE2NzUySFNfQ09NTUFORF9TVE9QID0gMSwKLSAgICAJU0FBNjc1MkhTX0NPTU1BTkRfU1RBUlQgPSAyLAotICAgIAlTQUE2NzUySFNfQ09NTUFORF9QQVVTRSA9IDMsCi0gICAgCVNBQTY3NTJIU19DT01NQU5EX1JFQ09ORklHVVJFID0gNCwKLSAgICAJU0FBNjc1MkhTX0NPTU1BTkRfU0xFRVAgPSA1LAorCVNBQTY3NTJIU19DT01NQU5EX1NUT1AgPSAxLAorCVNBQTY3NTJIU19DT01NQU5EX1NUQVJUID0gMiwKKwlTQUE2NzUySFNfQ09NTUFORF9QQVVTRSA9IDMsCisJU0FBNjc1MkhTX0NPTU1BTkRfUkVDT05GSUdVUkUgPSA0LAorCVNBQTY3NTJIU19DT01NQU5EX1NMRUVQID0gNSwKIAlTQUE2NzUySFNfQ09NTUFORF9SRUNPTkZJR1VSRV9GT1JDRSA9IDYsCiAKIAlTQUE2NzUySFNfQ09NTUFORF9NQVgKQEAgLTEyOSw3ICsxNDcsMjIgQEAKIAkweDAwLCAweDAwLCAweDAwLCAweDAwIC8qIENSQzMyICovCiB9OwogCi1zdGF0aWMgc3RydWN0IHY0bDJfbXBlZ19jb21wcmVzc2lvbiBwYXJhbV9kZWZhdWx0cyA9CitzdGF0aWMgc3RydWN0IHNhYTY3NTJoc19tcGVnX3BhcmFtcyBwYXJhbV9kZWZhdWx0cyA9Cit7CisJLnRzX3BpZF9wbXQgICAgICA9IDE2LAorCS50c19waWRfdmlkZW8gICAgPSAyNjAsCisJLnRzX3BpZF9hdWRpbyAgICA9IDI1NiwKKwkudHNfcGlkX3BjciAgICAgID0gMjU5LAorCisJLnZpX2FzcGVjdCAgICAgICA9IFY0TDJfTVBFR19WSURFT19BU1BFQ1RfNHgzLAorCS52aV9iaXRyYXRlICAgICAgPSA0MDAwLAorCS52aV9iaXRyYXRlX3BlYWsgPSA2MDAwLAorCS52aV9iaXRyYXRlX21vZGUgPSBWNEwyX01QRUdfVklERU9fQklUUkFURV9NT0RFX1ZCUiwKKworCS5hdV9sMl9iaXRyYXRlICAgPSBWNEwyX01QRUdfQVVESU9fTDJfQklUUkFURV8yNTZLLAorfTsKKworc3RhdGljIHN0cnVjdCB2NGwyX21wZWdfY29tcHJlc3Npb24gb2xkX3BhcmFtX2RlZmF1bHRzID0KIHsKIAkuc3RfdHlwZSAgICAgICAgID0gVjRMMl9NUEVHX1RTXzIsCiAJLnN0X2JpdHJhdGUgICAgICA9IHsKQEAgLTIyOCw0NSArMjYxLDU3IEBACiAKIAogc3RhdGljIGludCBzYWE2NzUyaHNfc2V0X2JpdHJhdGUoc3RydWN0IGkyY19jbGllbnQqIGNsaWVudCwKLQkJCQkgc3RydWN0IHY0bDJfbXBlZ19jb21wcmVzc2lvbiogcGFyYW1zKQorCQkJCSBzdHJ1Y3Qgc2FhNjc1MmhzX21wZWdfcGFyYW1zKiBwYXJhbXMpCiB7CiAJdTggYnVmWzNdOworCWludCB0b3RfYml0cmF0ZTsKIAogCS8qIHNldCB0aGUgYml0cmF0ZSBtb2RlICovCiAJYnVmWzBdID0gMHg3MTsKLQlidWZbMV0gPSAocGFyYW1zLT52aV9iaXRyYXRlLm1vZGUgPT0gVjRMMl9CSVRSQVRFX1ZCUikgPyAwIDogMTsKKwlidWZbMV0gPSAocGFyYW1zLT52aV9iaXRyYXRlX21vZGUgPT0gVjRMMl9NUEVHX1ZJREVPX0JJVFJBVEVfTU9ERV9WQlIpID8gMCA6IDE7CiAJaTJjX21hc3Rlcl9zZW5kKGNsaWVudCwgYnVmLCAyKTsKIAogCS8qIHNldCB0aGUgdmlkZW8gYml0cmF0ZSAqLwotCWlmIChwYXJhbXMtPnZpX2JpdHJhdGUubW9kZSA9PSBWNEwyX0JJVFJBVEVfVkJSKSB7CisJaWYgKHBhcmFtcy0+dmlfYml0cmF0ZV9tb2RlID09IFY0TDJfTVBFR19WSURFT19CSVRSQVRFX01PREVfVkJSKSB7CiAJCS8qIHNldCB0aGUgdGFyZ2V0IGJpdHJhdGUgKi8KIAkJYnVmWzBdID0gMHg4MDsKLQkgICAgCWJ1ZlsxXSA9IHBhcmFtcy0+dmlfYml0cmF0ZS50YXJnZXQgPj4gODsKLQkJYnVmWzJdID0gcGFyYW1zLT52aV9iaXRyYXRlLnRhcmdldCAmIDB4ZmY7CisJCWJ1ZlsxXSA9IHBhcmFtcy0+dmlfYml0cmF0ZSA+PiA4OworCQlidWZbMl0gPSBwYXJhbXMtPnZpX2JpdHJhdGUgJiAweGZmOwogCQlpMmNfbWFzdGVyX3NlbmQoY2xpZW50LCBidWYsIDMpOwogCiAJCS8qIHNldCB0aGUgbWF4IGJpdHJhdGUgKi8KIAkJYnVmWzBdID0gMHg4MTsKLQkgICAgCWJ1ZlsxXSA9IHBhcmFtcy0+dmlfYml0cmF0ZS5tYXggPj4gODsKLQkJYnVmWzJdID0gcGFyYW1zLT52aV9iaXRyYXRlLm1heCAmIDB4ZmY7CisJCWJ1ZlsxXSA9IHBhcmFtcy0+dmlfYml0cmF0ZV9wZWFrID4+IDg7CisJCWJ1ZlsyXSA9IHBhcmFtcy0+dmlfYml0cmF0ZV9wZWFrICYgMHhmZjsKIAkJaTJjX21hc3Rlcl9zZW5kKGNsaWVudCwgYnVmLCAzKTsKKwkJdG90X2JpdHJhdGUgPSBwYXJhbXMtPnZpX2JpdHJhdGVfcGVhazsKIAl9IGVsc2UgewogCQkvKiBzZXQgdGhlIHRhcmdldCBiaXRyYXRlIChubyBtYXggYml0cmF0ZSBmb3IgQ0JSKSAqLwogCQlidWZbMF0gPSAweDgxOwotCSAgICAJYnVmWzFdID0gcGFyYW1zLT52aV9iaXRyYXRlLnRhcmdldCA+PiA4OwotCQlidWZbMl0gPSBwYXJhbXMtPnZpX2JpdHJhdGUudGFyZ2V0ICYgMHhmZjsKKwkJYnVmWzFdID0gcGFyYW1zLT52aV9iaXRyYXRlID4+IDg7CisJCWJ1ZlsyXSA9IHBhcmFtcy0+dmlfYml0cmF0ZSAmIDB4ZmY7CiAJCWkyY19tYXN0ZXJfc2VuZChjbGllbnQsIGJ1ZiwgMyk7CisJCXRvdF9iaXRyYXRlID0gcGFyYW1zLT52aV9iaXRyYXRlOwogCX0KIAogCS8qIHNldCB0aGUgYXVkaW8gYml0cmF0ZSAqLwogCWJ1ZlswXSA9IDB4OTQ7Ci0JYnVmWzFdID0gKDI1NiA9PSBwYXJhbXMtPmF1X2JpdHJhdGUudGFyZ2V0KSA/IDAgOiAxOworCWJ1ZlsxXSA9IChWNEwyX01QRUdfQVVESU9fTDJfQklUUkFURV8yNTZLID09IHBhcmFtcy0+YXVfbDJfYml0cmF0ZSkgPyAwIDogMTsKIAlpMmNfbWFzdGVyX3NlbmQoY2xpZW50LCBidWYsIDIpOworCXRvdF9iaXRyYXRlICs9IChWNEwyX01QRUdfQVVESU9fTDJfQklUUkFURV8yNTZLID09IHBhcmFtcy0+YXVfbDJfYml0cmF0ZSkgPyAyNTYgOiAzODQ7CisKKwkvKiBOb3RlOiB0aGUgdG90YWwgbWF4IGJpdHJhdGUgaXMgZGV0ZXJtaW5lZCBieSBhZGRpbmcgdGhlIHZpZGVvIGFuZCBhdWRpbworCSAgIGJpdHJhdGVzIHRvZ2V0aGVyIGFuZCBhbHNvIGFkZGluZyBhbiBleHRyYSA3NjhrYml0L3MgdG8gc3RheSBvbiB0aGUKKwkgICBzYWZlIHNpZGUuIElmIG1vcmUgY29udHJvbCBzaG91bGQgYmUgcmVxdWlyZWQsIHRoZW4gYW4gZXh0cmEgTVBFRyBjb250cm9sCisJICAgc2hvdWxkIGJlIGFkZGVkLiAqLworCXRvdF9iaXRyYXRlICs9IDc2ODsKKwlpZiAodG90X2JpdHJhdGUgPiBNUEVHX1RPVEFMX1RBUkdFVF9CSVRSQVRFX01BWCkKKwkJdG90X2JpdHJhdGUgPSBNUEVHX1RPVEFMX1RBUkdFVF9CSVRSQVRFX01BWDsKIAogCS8qIHNldCB0aGUgdG90YWwgYml0cmF0ZSAqLwogCWJ1ZlswXSA9IDB4YjE7Ci0JYnVmWzFdID0gcGFyYW1zLT5zdF9iaXRyYXRlLnRhcmdldCA+PiA4OwotCWJ1ZlsyXSA9IHBhcmFtcy0+c3RfYml0cmF0ZS50YXJnZXQgJiAweGZmOworCWJ1ZlsxXSA9IHRvdF9iaXRyYXRlID4+IDg7CisJYnVmWzJdID0gdG90X2JpdHJhdGUgJiAweGZmOwogCWkyY19tYXN0ZXJfc2VuZChjbGllbnQsIGJ1ZiwgMyk7CiAKIAlyZXR1cm4gMDsKQEAgLTMxOCw1MCArMzYzLDE4OCBAQAogfQogCiAKLXN0YXRpYyB2b2lkIHNhYTY3NTJoc19zZXRfcGFyYW1zKHN0cnVjdCBpMmNfY2xpZW50KiBjbGllbnQsCitzdGF0aWMgdm9pZCBzYWE2NzUyaHNfb2xkX3NldF9wYXJhbXMoc3RydWN0IGkyY19jbGllbnQqIGNsaWVudCwKIAkJCQkgc3RydWN0IHY0bDJfbXBlZ19jb21wcmVzc2lvbiogcGFyYW1zKQogewogCXN0cnVjdCBzYWE2NzUyaHNfc3RhdGUgKmggPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKIAogCS8qIGNoZWNrIFBJRHMgKi8KLQlpZiAocGFyYW1zLT50c19waWRfcG10IDw9IE1QRUdfUElEX01BWCkKKwlpZiAocGFyYW1zLT50c19waWRfcG10IDw9IE1QRUdfUElEX01BWCkgeworCQloLT5vbGRfcGFyYW1zLnRzX3BpZF9wbXQgPSBwYXJhbXMtPnRzX3BpZF9wbXQ7CiAJCWgtPnBhcmFtcy50c19waWRfcG10ID0gcGFyYW1zLT50c19waWRfcG10OwotCWlmIChwYXJhbXMtPnRzX3BpZF9wY3IgPD0gTVBFR19QSURfTUFYKQorCX0KKwlpZiAocGFyYW1zLT50c19waWRfcGNyIDw9IE1QRUdfUElEX01BWCkgeworCQloLT5vbGRfcGFyYW1zLnRzX3BpZF9wY3IgPSBwYXJhbXMtPnRzX3BpZF9wY3I7CiAJCWgtPnBhcmFtcy50c19waWRfcGNyID0gcGFyYW1zLT50c19waWRfcGNyOwotCWlmIChwYXJhbXMtPnRzX3BpZF92aWRlbyA8PSBNUEVHX1BJRF9NQVgpCisJfQorCWlmIChwYXJhbXMtPnRzX3BpZF92aWRlbyA8PSBNUEVHX1BJRF9NQVgpIHsKKwkJaC0+b2xkX3BhcmFtcy50c19waWRfdmlkZW8gPSBwYXJhbXMtPnRzX3BpZF92aWRlbzsKIAkJaC0+cGFyYW1zLnRzX3BpZF92aWRlbyA9IHBhcmFtcy0+dHNfcGlkX3ZpZGVvOwotCWlmIChwYXJhbXMtPnRzX3BpZF9hdWRpbyA8PSBNUEVHX1BJRF9NQVgpCisJfQorCWlmIChwYXJhbXMtPnRzX3BpZF9hdWRpbyA8PSBNUEVHX1BJRF9NQVgpIHsKKwkJaC0+b2xkX3BhcmFtcy50c19waWRfYXVkaW8gPSBwYXJhbXMtPnRzX3BpZF9hdWRpbzsKIAkJaC0+cGFyYW1zLnRzX3BpZF9hdWRpbyA9IHBhcmFtcy0+dHNfcGlkX2F1ZGlvOworCX0KIAogCS8qIGNoZWNrIGJpdHJhdGUgcGFyYW1ldGVycyAqLwogCWlmICgocGFyYW1zLT52aV9iaXRyYXRlLm1vZGUgPT0gVjRMMl9CSVRSQVRFX0NCUikgfHwKLQkgICAgKHBhcmFtcy0+dmlfYml0cmF0ZS5tb2RlID09IFY0TDJfQklUUkFURV9WQlIpKQotCQloLT5wYXJhbXMudmlfYml0cmF0ZS5tb2RlID0gcGFyYW1zLT52aV9iaXRyYXRlLm1vZGU7CisJICAgIChwYXJhbXMtPnZpX2JpdHJhdGUubW9kZSA9PSBWNEwyX0JJVFJBVEVfVkJSKSkgeworCQloLT5vbGRfcGFyYW1zLnZpX2JpdHJhdGUubW9kZSA9IHBhcmFtcy0+dmlfYml0cmF0ZS5tb2RlOworCQloLT5wYXJhbXMudmlfYml0cmF0ZV9tb2RlID0gKHBhcmFtcy0+dmlfYml0cmF0ZS5tb2RlID09IFY0TDJfQklUUkFURV9WQlIpID8KKwkJICAgICAgIFY0TDJfTVBFR19WSURFT19CSVRSQVRFX01PREVfVkJSIDogVjRMMl9NUEVHX1ZJREVPX0JJVFJBVEVfTU9ERV9DQlI7CisJfQogCWlmIChwYXJhbXMtPnZpX2JpdHJhdGUubW9kZSAhPSBWNEwyX0JJVFJBVEVfTk9ORSkKLQkJaC0+cGFyYW1zLnN0X2JpdHJhdGUudGFyZ2V0ID0gcGFyYW1zLT5zdF9iaXRyYXRlLnRhcmdldDsKKwkJaC0+b2xkX3BhcmFtcy5zdF9iaXRyYXRlLnRhcmdldCA9IHBhcmFtcy0+c3RfYml0cmF0ZS50YXJnZXQ7CiAJaWYgKHBhcmFtcy0+dmlfYml0cmF0ZS5tb2RlICE9IFY0TDJfQklUUkFURV9OT05FKQotCQloLT5wYXJhbXMudmlfYml0cmF0ZS50YXJnZXQgPSBwYXJhbXMtPnZpX2JpdHJhdGUudGFyZ2V0OworCQloLT5vbGRfcGFyYW1zLnZpX2JpdHJhdGUudGFyZ2V0ID0gcGFyYW1zLT52aV9iaXRyYXRlLnRhcmdldDsKIAlpZiAocGFyYW1zLT52aV9iaXRyYXRlLm1vZGUgPT0gVjRMMl9CSVRSQVRFX1ZCUikKLQkJaC0+cGFyYW1zLnZpX2JpdHJhdGUubWF4ID0gcGFyYW1zLT52aV9iaXRyYXRlLm1heDsKKwkJaC0+b2xkX3BhcmFtcy52aV9iaXRyYXRlLm1heCA9IHBhcmFtcy0+dmlfYml0cmF0ZS5tYXg7CiAJaWYgKHBhcmFtcy0+YXVfYml0cmF0ZS5tb2RlICE9IFY0TDJfQklUUkFURV9OT05FKQotCQloLT5wYXJhbXMuYXVfYml0cmF0ZS50YXJnZXQgPSBwYXJhbXMtPmF1X2JpdHJhdGUudGFyZ2V0OworCQloLT5vbGRfcGFyYW1zLmF1X2JpdHJhdGUudGFyZ2V0ID0gcGFyYW1zLT5hdV9iaXRyYXRlLnRhcmdldDsKIAogCS8qIGFzcGVjdCByYXRpbyAqLwogCWlmIChwYXJhbXMtPnZpX2FzcGVjdF9yYXRpbyA9PSBWNEwyX01QRUdfQVNQRUNUXzRfMyB8fAotCSAgICBwYXJhbXMtPnZpX2FzcGVjdF9yYXRpbyA9PSBWNEwyX01QRUdfQVNQRUNUXzE2XzkpCi0JCWgtPnBhcmFtcy52aV9hc3BlY3RfcmF0aW8gPSBwYXJhbXMtPnZpX2FzcGVjdF9yYXRpbzsKKwkgICAgcGFyYW1zLT52aV9hc3BlY3RfcmF0aW8gPT0gVjRMMl9NUEVHX0FTUEVDVF8xNl85KSB7CisJCWgtPm9sZF9wYXJhbXMudmlfYXNwZWN0X3JhdGlvID0gcGFyYW1zLT52aV9hc3BlY3RfcmF0aW87CisJCWlmIChwYXJhbXMtPnZpX2FzcGVjdF9yYXRpbyA9PSBWNEwyX01QRUdfQVNQRUNUXzRfMykKKwkJCWgtPnBhcmFtcy52aV9hc3BlY3QgPSBWNEwyX01QRUdfVklERU9fQVNQRUNUXzR4MzsKKwkJZWxzZQorCQkJaC0+cGFyYW1zLnZpX2FzcGVjdCA9IFY0TDJfTVBFR19WSURFT19BU1BFQ1RfMTZ4OTsKKwl9CiAKIAkvKiByYW5nZSBjaGVja3MgKi8KLQlpZiAoaC0+cGFyYW1zLnN0X2JpdHJhdGUudGFyZ2V0ID4gTVBFR19UT1RBTF9UQVJHRVRfQklUUkFURV9NQVgpCi0JCWgtPnBhcmFtcy5zdF9iaXRyYXRlLnRhcmdldCA9IE1QRUdfVE9UQUxfVEFSR0VUX0JJVFJBVEVfTUFYOwotCWlmIChoLT5wYXJhbXMudmlfYml0cmF0ZS50YXJnZXQgPiBNUEVHX1ZJREVPX1RBUkdFVF9CSVRSQVRFX01BWCkKLQkJaC0+cGFyYW1zLnZpX2JpdHJhdGUudGFyZ2V0ID0gTVBFR19WSURFT19UQVJHRVRfQklUUkFURV9NQVg7Ci0JaWYgKGgtPnBhcmFtcy52aV9iaXRyYXRlLm1heCA+IE1QRUdfVklERU9fTUFYX0JJVFJBVEVfTUFYKQotCQloLT5wYXJhbXMudmlfYml0cmF0ZS5tYXggPSBNUEVHX1ZJREVPX01BWF9CSVRSQVRFX01BWDsKLQlpZiAoaC0+cGFyYW1zLmF1X2JpdHJhdGUudGFyZ2V0IDw9IDI1NikKLQkJaC0+cGFyYW1zLmF1X2JpdHJhdGUudGFyZ2V0ID0gMjU2OworCWlmIChoLT5vbGRfcGFyYW1zLnN0X2JpdHJhdGUudGFyZ2V0ID4gTVBFR19UT1RBTF9UQVJHRVRfQklUUkFURV9NQVgpCisJCWgtPm9sZF9wYXJhbXMuc3RfYml0cmF0ZS50YXJnZXQgPSBNUEVHX1RPVEFMX1RBUkdFVF9CSVRSQVRFX01BWDsKKwlpZiAoaC0+b2xkX3BhcmFtcy52aV9iaXRyYXRlLnRhcmdldCA+IE1QRUdfVklERU9fVEFSR0VUX0JJVFJBVEVfTUFYKQorCQloLT5vbGRfcGFyYW1zLnZpX2JpdHJhdGUudGFyZ2V0ID0gTVBFR19WSURFT19UQVJHRVRfQklUUkFURV9NQVg7CisJaWYgKGgtPm9sZF9wYXJhbXMudmlfYml0cmF0ZS5tYXggPiBNUEVHX1ZJREVPX01BWF9CSVRSQVRFX01BWCkKKwkJaC0+b2xkX3BhcmFtcy52aV9iaXRyYXRlLm1heCA9IE1QRUdfVklERU9fTUFYX0JJVFJBVEVfTUFYOworCWgtPnBhcmFtcy52aV9iaXRyYXRlID0gcGFyYW1zLT52aV9iaXRyYXRlLnRhcmdldDsKKwloLT5wYXJhbXMudmlfYml0cmF0ZV9wZWFrID0gcGFyYW1zLT52aV9iaXRyYXRlLm1heDsKKwlpZiAoaC0+b2xkX3BhcmFtcy5hdV9iaXRyYXRlLnRhcmdldCA8PSAyNTYpIHsKKwkJaC0+b2xkX3BhcmFtcy5hdV9iaXRyYXRlLnRhcmdldCA9IDI1NjsKKwkJaC0+cGFyYW1zLmF1X2wyX2JpdHJhdGUgPSBWNEwyX01QRUdfQVVESU9fTDJfQklUUkFURV8yNTZLOworCX0KKwllbHNlIHsKKwkJaC0+b2xkX3BhcmFtcy5hdV9iaXRyYXRlLnRhcmdldCA9IDM4NDsKKwkJaC0+cGFyYW1zLmF1X2wyX2JpdHJhdGUgPSBWNEwyX01QRUdfQVVESU9fTDJfQklUUkFURV8zODRLOworCX0KK30KKworc3RhdGljIGludCBoYW5kbGVfY3RybChzdHJ1Y3Qgc2FhNjc1MmhzX21wZWdfcGFyYW1zICpwYXJhbXMsCisJCXN0cnVjdCB2NGwyX2V4dF9jb250cm9sICpjdHJsLCBpbnQgY21kKQoreworCWludCBvbGQgPSAwLCBuZXc7CisJaW50IHNldCA9IGNtZCA9PSBWSURJT0NfU19FWFRfQ1RSTFM7CisKKwluZXcgPSBjdHJsLT52YWx1ZTsKKwlzd2l0Y2ggKGN0cmwtPmlkKSB7CisJCWNhc2UgVjRMMl9DSURfTVBFR19TVFJFQU1fVFlQRToKKwkJCW9sZCA9IFY0TDJfTVBFR19TVFJFQU1fVFlQRV9NUEVHMl9UUzsKKwkJCWlmIChzZXQgJiYgbmV3ICE9IG9sZCkKKwkJCQlyZXR1cm4gLUVSQU5HRTsKKwkJCW5ldyA9IG9sZDsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1BJRF9QTVQ6CisJCQlvbGQgPSBwYXJhbXMtPnRzX3BpZF9wbXQ7CisJCQlpZiAoc2V0ICYmIG5ldyA+IE1QRUdfUElEX01BWCkKKwkJCQlyZXR1cm4gLUVSQU5HRTsKKwkJCWlmIChuZXcgPiBNUEVHX1BJRF9NQVgpCisJCQkJbmV3ID0gTVBFR19QSURfTUFYOworCQkJcGFyYW1zLT50c19waWRfcG10ID0gbmV3OworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9DSURfTVBFR19TVFJFQU1fUElEX0FVRElPOgorCQkJb2xkID0gcGFyYW1zLT50c19waWRfYXVkaW87CisJCQlpZiAoc2V0ICYmIG5ldyA+IE1QRUdfUElEX01BWCkKKwkJCQlyZXR1cm4gLUVSQU5HRTsKKwkJCWlmIChuZXcgPiBNUEVHX1BJRF9NQVgpCisJCQkJbmV3ID0gTVBFR19QSURfTUFYOworCQkJcGFyYW1zLT50c19waWRfYXVkaW8gPSBuZXc7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9QSURfVklERU86CisJCQlvbGQgPSBwYXJhbXMtPnRzX3BpZF92aWRlbzsKKwkJCWlmIChzZXQgJiYgbmV3ID4gTVBFR19QSURfTUFYKQorCQkJCXJldHVybiAtRVJBTkdFOworCQkJaWYgKG5ldyA+IE1QRUdfUElEX01BWCkKKwkJCQluZXcgPSBNUEVHX1BJRF9NQVg7CisJCQlwYXJhbXMtPnRzX3BpZF92aWRlbyA9IG5ldzsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1BJRF9QQ1I6CisJCQlvbGQgPSBwYXJhbXMtPnRzX3BpZF9wY3I7CisJCQlpZiAoc2V0ICYmIG5ldyA+IE1QRUdfUElEX01BWCkKKwkJCQlyZXR1cm4gLUVSQU5HRTsKKwkJCWlmIChuZXcgPiBNUEVHX1BJRF9NQVgpCisJCQkJbmV3ID0gTVBFR19QSURfTUFYOworCQkJcGFyYW1zLT50c19waWRfcGNyID0gbmV3OworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19FTkNPRElORzoKKwkJCW9sZCA9IFY0TDJfTVBFR19BVURJT19FTkNPRElOR19MQVlFUl8yOworCQkJaWYgKHNldCAmJiBuZXcgIT0gb2xkKQorCQkJCXJldHVybiAtRVJBTkdFOworCQkJbmV3ID0gb2xkOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19MMl9CSVRSQVRFOgorCQkJb2xkID0gcGFyYW1zLT5hdV9sMl9iaXRyYXRlOworCQkJaWYgKHNldCAmJiBuZXcgIT0gVjRMMl9NUEVHX0FVRElPX0wyX0JJVFJBVEVfMjU2SyAmJgorCQkJCSAgIG5ldyAhPSBWNEwyX01QRUdfQVVESU9fTDJfQklUUkFURV8zODRLKQorCQkJCXJldHVybiAtRVJBTkdFOworCQkJaWYgKG5ldyA8PSBWNEwyX01QRUdfQVVESU9fTDJfQklUUkFURV8yNTZLKQorCQkJCW5ldyA9IFY0TDJfTVBFR19BVURJT19MMl9CSVRSQVRFXzI1Nks7CisJCQllbHNlCisJCQkJbmV3ID0gVjRMMl9NUEVHX0FVRElPX0wyX0JJVFJBVEVfMzg0SzsKKwkJCXBhcmFtcy0+YXVfbDJfYml0cmF0ZSA9IG5ldzsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fU0FNUExJTkdfRlJFUToKKwkJCW9sZCA9IFY0TDJfTVBFR19BVURJT19TQU1QTElOR19GUkVRXzQ4MDAwOworCQkJaWYgKHNldCAmJiBuZXcgIT0gb2xkKQorCQkJCXJldHVybiAtRVJBTkdFOworCQkJbmV3ID0gb2xkOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19FTkNPRElORzoKKwkJCW9sZCA9IFY0TDJfTVBFR19WSURFT19FTkNPRElOR19NUEVHXzI7CisJCQlpZiAoc2V0ICYmIG5ldyAhPSBvbGQpCisJCQkJcmV0dXJuIC1FUkFOR0U7CisJCQluZXcgPSBvbGQ7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0FTUEVDVDoKKwkJCW9sZCA9IHBhcmFtcy0+dmlfYXNwZWN0OworCQkJaWYgKHNldCAmJiBuZXcgIT0gVjRMMl9NUEVHX1ZJREVPX0FTUEVDVF8xNng5ICYmCisJCQkJICAgbmV3ICE9IFY0TDJfTVBFR19WSURFT19BU1BFQ1RfNHgzKQorCQkJCXJldHVybiAtRVJBTkdFOworCQkJaWYgKG5ldyAhPSBWNEwyX01QRUdfVklERU9fQVNQRUNUXzE2eDkpCisJCQkJbmV3ID0gVjRMMl9NUEVHX1ZJREVPX0FTUEVDVF80eDM7CisJCQlwYXJhbXMtPnZpX2FzcGVjdCA9IG5ldzsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fQklUUkFURToKKwkJCW9sZCA9IHBhcmFtcy0+dmlfYml0cmF0ZSAqIDEwMDA7CisJCQluZXcgPSAxMDAwICogKG5ldyAvIDEwMDApOworCQkJaWYgKHNldCAmJiBuZXcgPiBNUEVHX1ZJREVPX1RBUkdFVF9CSVRSQVRFX01BWCAqIDEwMDApCisJCQkJcmV0dXJuIC1FUkFOR0U7CisJCQlpZiAobmV3ID4gTVBFR19WSURFT19UQVJHRVRfQklUUkFURV9NQVggKiAxMDAwKQorCQkJCW5ldyA9IE1QRUdfVklERU9fVEFSR0VUX0JJVFJBVEVfTUFYICogMTAwMDsKKwkJCXBhcmFtcy0+dmlfYml0cmF0ZSA9IG5ldyAvIDEwMDA7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0JJVFJBVEVfUEVBSzoKKwkJCW9sZCA9IHBhcmFtcy0+dmlfYml0cmF0ZV9wZWFrICogMTAwMDsKKwkJCW5ldyA9IDEwMDAgKiAobmV3IC8gMTAwMCk7CisJCQlpZiAoc2V0ICYmIG5ldyA+IE1QRUdfVklERU9fVEFSR0VUX0JJVFJBVEVfTUFYICogMTAwMCkKKwkJCQlyZXR1cm4gLUVSQU5HRTsKKwkJCWlmIChuZXcgPiBNUEVHX1ZJREVPX1RBUkdFVF9CSVRSQVRFX01BWCAqIDEwMDApCisJCQkJbmV3ID0gTVBFR19WSURFT19UQVJHRVRfQklUUkFURV9NQVggKiAxMDAwOworCQkJcGFyYW1zLT52aV9iaXRyYXRlX3BlYWsgPSBuZXcgLyAxMDAwOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19CSVRSQVRFX01PREU6CisJCQlvbGQgPSBwYXJhbXMtPnZpX2JpdHJhdGVfbW9kZTsKKwkJCXBhcmFtcy0+dmlfYml0cmF0ZV9tb2RlID0gbmV3OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKGNtZCA9PSBWSURJT0NfR19FWFRfQ1RSTFMpCisJCWN0cmwtPnZhbHVlID0gb2xkOwogCWVsc2UKLQkJaC0+cGFyYW1zLmF1X2JpdHJhdGUudGFyZ2V0ID0gMzg0OworCQljdHJsLT52YWx1ZSA9IG5ldzsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBzYWE2NzUyaHNfaW5pdChzdHJ1Y3QgaTJjX2NsaWVudCogY2xpZW50KQpAQCAtMzk1LDIyICs1NzgsMjIgQEAKIAlidWZbMl0gPSAweDBEOwogCWkyY19tYXN0ZXJfc2VuZChjbGllbnQsYnVmLDMpOwogCi0gICAgCS8qIFNldCBtaW5pbXVtIFEtc2NhbGUgezR9ICovCisJLyogU2V0IG1pbmltdW0gUS1zY2FsZSB7NH0gKi8KIAlidWZbMF0gPSAweDgyOwogCWJ1ZlsxXSA9IDB4MDQ7CiAJaTJjX21hc3Rlcl9zZW5kKGNsaWVudCxidWYsMik7CiAKLSAgICAJLyogU2V0IG1heGltdW0gUS1zY2FsZSB7MTJ9ICovCisJLyogU2V0IG1heGltdW0gUS1zY2FsZSB7MTJ9ICovCiAJYnVmWzBdID0gMHg4MzsKIAlidWZbMV0gPSAweDBDOwogCWkyY19tYXN0ZXJfc2VuZChjbGllbnQsYnVmLDIpOwogCi0gICAgCS8qIFNldCBPdXRwdXQgUHJvdG9jb2wgKi8KKwkvKiBTZXQgT3V0cHV0IFByb3RvY29sICovCiAJYnVmWzBdID0gMHhEMDsKIAlidWZbMV0gPSAweDgxOwogCWkyY19tYXN0ZXJfc2VuZChjbGllbnQsYnVmLDIpOwogCi0gICAgCS8qIFNldCB2aWRlbyBvdXRwdXQgc3RyZWFtIGZvcm1hdCB7VFN9ICovCisJLyogU2V0IHZpZGVvIG91dHB1dCBzdHJlYW0gZm9ybWF0IHtUU30gKi8KIAlidWZbMF0gPSAweEIwOwogCWJ1ZlsxXSA9IDB4MDU7CiAJaTJjX21hc3Rlcl9zZW5kKGNsaWVudCxidWYsMik7CkBAIC00NDEsNyArNjI0LDcgQEAKIAlsb2NhbFBNVFtzaXplb2YoUE1UKSAtIDJdID0gKGNyYyA+PiA4KSAmIDB4RkY7CiAJbG9jYWxQTVRbc2l6ZW9mKFBNVCkgLSAxXSA9IGNyYyAmIDB4RkY7CiAKLSAgICAJLyogU2V0IEF1ZGlvIFBJRCAqLworCS8qIFNldCBBdWRpbyBQSUQgKi8KIAlidWZbMF0gPSAweEMxOwogCWJ1ZlsxXSA9IChoLT5wYXJhbXMudHNfcGlkX2F1ZGlvID4+IDgpICYgMHhGRjsKIAlidWZbMl0gPSBoLT5wYXJhbXMudHNfcGlkX2F1ZGlvICYgMHhGRjsKQEAgLTQ4OSwxMSArNjcyLDExIEBACiAJYnVmWzNdID0gMHg4MjsKIAlidWZbNF0gPSAweEIwOwogCWJ1Zls1XSA9IGJ1ZjJbMF07Ci0Jc3dpdGNoKGgtPnBhcmFtcy52aV9hc3BlY3RfcmF0aW8pIHsKLQljYXNlIFY0TDJfTVBFR19BU1BFQ1RfMTZfOToKKwlzd2l0Y2goaC0+cGFyYW1zLnZpX2FzcGVjdCkgeworCWNhc2UgVjRMMl9NUEVHX1ZJREVPX0FTUEVDVF8xNng5OgogCQlidWZbNl0gPSBidWYyWzFdIHwgMHg0MDsKIAkJYnJlYWs7Ci0JY2FzZSBWNEwyX01QRUdfQVNQRUNUXzRfMzoKKwljYXNlIFY0TDJfTVBFR19WSURFT19BU1BFQ1RfNHgzOgogCWRlZmF1bHQ6CiAJCWJ1Zls2XSA9IGJ1ZjJbMV0gJiAweEJGOwogCQlicmVhazsKQEAgLTUxNSw2ICs2OTgsNyBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAloLT5jbGllbnQgPSBjbGllbnRfdGVtcGxhdGU7CiAJaC0+cGFyYW1zID0gcGFyYW1fZGVmYXVsdHM7CisJaC0+b2xkX3BhcmFtcyA9IG9sZF9wYXJhbV9kZWZhdWx0czsKIAloLT5jbGllbnQuYWRhcHRlciA9IGFkYXA7CiAJaC0+Y2xpZW50LmFkZHIgPSBhZGRyOwogCkBAIC01NTAsMjAgKzczNCw0NSBAQAogc2FhNjc1MmhzX2NvbW1hbmQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQogewogCXN0cnVjdCBzYWE2NzUyaHNfc3RhdGUgKmggPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKLQlzdHJ1Y3QgdjRsMl9tcGVnX2NvbXByZXNzaW9uICpwYXJhbXMgPSBhcmc7CisJc3RydWN0IHY0bDJfZXh0X2NvbnRyb2xzICpjdHJscyA9IGFyZzsKKwlzdHJ1Y3QgdjRsMl9tcGVnX2NvbXByZXNzaW9uICpvbGRfcGFyYW1zID0gYXJnOworCXN0cnVjdCBzYWE2NzUyaHNfbXBlZ19wYXJhbXMgcGFyYW1zOwogCWludCBlcnIgPSAwOworCWludCBpOwogCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIFZJRElPQ19TX01QRUdDT01QOgotCQlpZiAoTlVMTCA9PSBwYXJhbXMpIHsKKwkJaWYgKE5VTEwgPT0gb2xkX3BhcmFtcykgewogCQkJLyogYXBwbHkgc2V0dGluZ3MgYW5kIHN0YXJ0IGVuY29kZXIgKi8KIAkJCXNhYTY3NTJoc19pbml0KGNsaWVudCk7CiAJCQlicmVhazsKIAkJfQotCQlzYWE2NzUyaHNfc2V0X3BhcmFtcyhjbGllbnQsIHBhcmFtcyk7CisJCXNhYTY3NTJoc19vbGRfc2V0X3BhcmFtcyhjbGllbnQsIG9sZF9wYXJhbXMpOwogCQkvKiBmYWxsIHRocm91Z2ggKi8KIAljYXNlIFZJRElPQ19HX01QRUdDT01QOgotCQkqcGFyYW1zID0gaC0+cGFyYW1zOworCQkqb2xkX3BhcmFtcyA9IGgtPm9sZF9wYXJhbXM7CisJCWJyZWFrOworCWNhc2UgVklESU9DX1NfRVhUX0NUUkxTOgorCQlpZiAoY3RybHMtPmN0cmxfY2xhc3MgIT0gVjRMMl9DVFJMX0NMQVNTX01QRUcpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGN0cmxzLT5jb3VudCA9PSAwKSB7CisJCQkvKiBhcHBseSBzZXR0aW5ncyBhbmQgc3RhcnQgZW5jb2RlciAqLworCQkJc2FhNjc1MmhzX2luaXQoY2xpZW50KTsKKwkJCWJyZWFrOworCQl9CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgVklESU9DX1RSWV9FWFRfQ1RSTFM6CisJY2FzZSBWSURJT0NfR19FWFRfQ1RSTFM6CisJCWlmIChjdHJscy0+Y3RybF9jbGFzcyAhPSBWNEwyX0NUUkxfQ0xBU1NfTVBFRykKKwkJCXJldHVybiAtRUlOVkFMOworCQlwYXJhbXMgPSBoLT5wYXJhbXM7CisJCWZvciAoaSA9IDA7IGkgPCBjdHJscy0+Y291bnQ7IGkrKykgeworCQkJaWYgKChlcnIgPSBoYW5kbGVfY3RybCgmcGFyYW1zLCBjdHJscy0+Y29udHJvbHMgKyBpLCBjbWQpKSkgeworCQkJCWN0cmxzLT5lcnJvcl9pZHggPSBpOworCQkJCXJldHVybiBlcnI7CisJCQl9CisJCX0KKwkJaC0+cGFyYW1zID0gcGFyYW1zOwogCQlicmVhazsKIAljYXNlIFZJRElPQ19HX0ZNVDoKIAl7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1hbHNhLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1hbHNhLmMKaW5kZXggYmIzZTBiYS4uZDc3ZTZhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtYWxzYS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWFsc2EuYwpAQCAtODE4LDcgKzgxOCw3IEBACiAJCQkJYnJlYWs7CiAJCX0KIAotCSAgICAJLyogb3V0cHV0IHhiYXIgYWx3YXlzIG1haW4gY2hhbm5lbCAqLworCQkvKiBvdXRwdXQgeGJhciBhbHdheXMgbWFpbiBjaGFubmVsICovCiAJCXNhYV9kc3Bfd3JpdGVsKGRldiwgU0FBNzEzM19ESUdJVEFMX09VVFBVVF9TRUwxLCAweGJiYmIxMCk7CiAKIAkJaWYgKGxlZnQgfHwgcmlnaHQpIHsgLy8gV2UndmUgZ290IGRhdGEsIHR1cm4gdGhlIGlucHV0IG9uCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1jYXJkcy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtY2FyZHMuYwppbmRleCA4NmVhZTM1Li45Mjc0MTNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1jYXJkcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWNhcmRzLmMKQEAgLTIxNjAsNyArMjE2MCw3IEBACiAJCS5yYWRpbyA9IHsKIAkJCSAgLm5hbWUgPSBuYW1lX3JhZGlvLAogCQkJICAuYW11eCA9IExJTkUyLAotICAgIAkJfSwKKwkJfSwKIAl9LAogCVtTQUE3MTM0X0JPQVJEX0dPVFZJRVdfNzEzNV0gPSB7CiAJCS8qIE1pa2UgQmFpa292IDxtaWtlQGJhaWtvdi5jb20+ICovCkBAIC0yODQyLDYgKzI4NDIsNTUgQEAKIAkJCS5ncGlvID0gMHgwMDAwMDAsCS8qIEdQSU8yMT1Mb3cgZm9yIEZNIHJhZGlvIGFudGVubmEgKi8KIAkJfSwKIAl9LAorCVtTQUE3MTM0X0JPQVJEX0ZMWVZJREVPMzAwMF9OVFNDXSA9IHsKKwkJLyogIlphYyBCb3dsaW5nIiA8emFjQHphY2Jvd2xpbmcuY29tPiAqLworCQkubmFtZSAgICAgICAgICAgPSAiTGlmZVZpZXcgRmx5VklERU8zMDAwIChOVFNDKSIsCisJCS5hdWRpb19jbG9jayAgICA9IDB4MDAyMDAwMDAsCisJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfTlRTQywKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyICAgICA9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCisKKwkJLmdwaW9tYXNrICAgICAgID0gMHhlMDAwLAorCQkuaW5wdXRzICAgICAgICAgPSB7eworCQkJLm5hbWUgPSBuYW1lX3R2LAorCQkJLnZtdXggPSAxLAorCQkJLmFtdXggPSBUViwKKwkJCS5ncGlvID0gMHg4MDAwLAorCQkJLnR2ICAgPSAxLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV90dl9tb25vLAorCQkJLnZtdXggPSAxLAorCQkJLmFtdXggPSBMSU5FMiwKKwkJCS5ncGlvID0gMHgwMDAwLAorCQkJLnR2ICAgPSAxLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9jb21wMSwKKwkJCS52bXV4ID0gMCwKKwkJCS5hbXV4ID0gTElORTIsCisJCQkuZ3BpbyA9IDB4NDAwMCwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfY29tcDIsCisJCQkudm11eCA9IDMsCisJCQkuYW11eCA9IExJTkUyLAorCQkJLmdwaW8gPSAweDQwMDAsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX3N2aWRlbywKKwkJCS52bXV4ID0gOCwKKwkJCS5hbXV4ID0gTElORTIsCisJCQkuZ3BpbyA9IDB4NDAwMCwKKwkJfX0sCisJCS5yYWRpbyA9IHsKKwkJCS5uYW1lID0gbmFtZV9yYWRpbywKKwkJCS5hbXV4ID0gTElORTIsCisJCQkuZ3BpbyA9IDB4MjAwMCwKKwkJfSwKKwkJCS5tdXRlID0geworCQkJLm5hbWUgPSBuYW1lX211dGUsCisJCQkuYW11eCA9IFRWLAorCQkJLmdwaW8gPSAweDgwMDAsCisJCX0sCisJfSwKIH07CiAKIGNvbnN0IHVuc2lnbmVkIGludCBzYWE3MTM0X2Jjb3VudCA9IEFSUkFZX1NJWkUoc2FhNzEzNF9ib2FyZHMpOwpAQCAtMjkwMSw2ICsyOTUwLDEyIEBACiAJfSx7CiAJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCiAJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzNCwKKwkJLnN1YnZlbmRvciAgICA9IDB4NTE2OSwKKwkJLnN1YmRldmljZSAgICA9IDB4MDEzOCwKKwkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfRkxZVklERU8zMDAwX05UU0MsCisJfSx7CisJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCisJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzNCwKIAkJLnN1YnZlbmRvciAgICA9IDB4NTE2OCwKIAkJLnN1YmRldmljZSAgICA9IDB4MDEzOCwKIAkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfRkxZVklERU8zMDAwLApAQCAtMzQ1OSw2ICszNTE0LDcgQEAKIAlzd2l0Y2ggKGRldi0+Ym9hcmQpIHsKIAljYXNlIFNBQTcxMzRfQk9BUkRfRkxZVklERU8yMDAwOgogCWNhc2UgU0FBNzEzNF9CT0FSRF9GTFlWSURFTzMwMDA6CisJY2FzZSBTQUE3MTM0X0JPQVJEX0ZMWVZJREVPMzAwMF9OVFNDOgogCQlkZXYtPmhhc19yZW1vdGUgPSBTQUE3MTM0X1JFTU9URV9HUElPOwogCQlib2FyZF9mbHl2aWRlbyhkZXYpOwogCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWR2Yi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtZHZiLmMKaW5kZXggMjIyYTM2Yy4uMjc5ODI4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtZHZiLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtZHZiLmMKQEAgLTEzMiw5ICsxMzIsOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG10MzUyX3Bpbm5hY2xlX3BsbF9zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsCi0JCQkJICBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcywKLQkJCQkgIHU4KiBwbGxidWYpCitzdGF0aWMgaW50IG10MzUyX3Bpbm5hY2xlX3R1bmVyX3NldF9wYXJhbXMoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsCisJCQkJCSAgIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyogcGFyYW1zKQogewogCXU4IG9mZltdID0geyAweDAwLCAweGYxfTsKIAl1OCBvbltdICA9IHsgMHgwMCwgMHg3MX07CkBAIC0xNDcsMzAgKzE0NiwzMSBAQAogCWYudHVuZXIgICAgID0gMDsKIAlmLnR5cGUgICAgICA9IFY0TDJfVFVORVJfRElHSVRBTF9UVjsKIAlmLmZyZXF1ZW5jeSA9IHBhcmFtcy0+ZnJlcXVlbmN5IC8gMTAwMCAqIDE2IC8gMTAwMDsKKwlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDEpOwogCWkyY190cmFuc2ZlcigmZGV2LT5pMmNfYWRhcCwgJm1zZywgMSk7CiAJc2FhNzEzNF9pMmNfY2FsbF9jbGllbnRzKGRldixWSURJT0NfU19GUkVRVUVOQ1ksJmYpOwogCW1zZy5idWYgPSBvbjsKKwlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDEpOwogCWkyY190cmFuc2ZlcigmZGV2LT5pMmNfYWRhcCwgJm1zZywgMSk7CiAKIAlwaW5uYWNsZV9hbnRlbm5hX3B3cihkZXYsIGFudGVubmFfcHdyKTsKIAogCS8qIG10MzUyIHNldHVwICovCi0JbXQzNTJfcGlubmFjbGVfaW5pdChmZSk7Ci0JcGxsYnVmWzBdID0gMHhjMjsKLQlwbGxidWZbMV0gPSAweDAwOwotCXBsbGJ1ZlsyXSA9IDB4MDA7Ci0JcGxsYnVmWzNdID0gMHg4MDsKLQlwbGxidWZbNF0gPSAweDAwOwotCXJldHVybiAwOworCXJldHVybiBtdDM1Ml9waW5uYWNsZV9pbml0KGZlKTsKIH0KIAotc3RhdGljIGludCBtdDM1Ml9hdmVyNzc3X3BsbF9zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcGFyYW1zLCB1OCogcGxsYnVmKQorc3RhdGljIGludCBtdDM1Ml9hdmVyNzc3X3R1bmVyX2NhbGNfcmVncyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMsIHU4KiBwbGxidWYsIGludCBidWZfbGVuKQogewotCXBsbGJ1ZlswXSA9IDB4YzI7CisJaWYgKGJ1Zl9sZW4gPCA1KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXBsbGJ1ZlswXSA9IDB4NjE7CiAJZHZiX3BsbF9jb25maWd1cmUoJmR2Yl9wbGxfcGhpbGlwc190ZDEzMTYsIHBsbGJ1ZisxLAogCQkJICBwYXJhbXMtPmZyZXF1ZW5jeSwKIAkJCSAgcGFyYW1zLT51Lm9mZG0uYmFuZHdpZHRoKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gNTsKIH0KIAogc3RhdGljIHN0cnVjdCBtdDM1Ml9jb25maWcgcGlubmFjbGVfMzAwaSA9IHsKQEAgLTE3OSwxMyArMTc5LDExIEBACiAJLmlmMiAgICAgICAgICAgPSAzNjE1MCwKIAkubm9fdHVuZXIgICAgICA9IDEsCiAJLmRlbW9kX2luaXQgICAgPSBtdDM1Ml9waW5uYWNsZV9pbml0LAotCS5wbGxfc2V0ICAgICAgID0gbXQzNTJfcGlubmFjbGVfcGxsX3NldCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgbXQzNTJfY29uZmlnIGF2ZXJtZWRpYV83NzcgPSB7CiAJLmRlbW9kX2FkZHJlc3MgPSAweGYsCiAJLmRlbW9kX2luaXQgICAgPSBtdDM1Ml9hdmVyNzc3X2luaXQsCi0JLnBsbF9zZXQgICAgICAgPSBtdDM1Ml9hdmVyNzc3X3BsbF9zZXQsCiB9OwogI2VuZGlmCiAKQEAgLTI2OCw2ICsyNjYsOCBAQAogCXR1bmVyX2J1ZlsyXSA9IDB4Y2E7CiAJdHVuZXJfYnVmWzNdID0gKGNwIDw8IDUpIHwgKGZpbHRlciA8PCAzKSB8IGJhbmQ7CiAKKwlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDEpOwogCWlmIChpMmNfdHJhbnNmZXIoJmRldi0+aTJjX2FkYXAsICZ0dW5lcl9tc2csIDEpICE9IDEpCiAJCXJldHVybiAtRUlPOwogCW1zbGVlcCgxKTsKQEAgLTI4MSw2ICsyODEsOCBAQAogCXN0cnVjdCBpMmNfbXNnIHR1bmVyX21zZyA9IHsuYWRkciA9IGFkZHIsLmZsYWdzID0gMCwuYnVmID0gdHUxMjE2X2luaXQsLmxlbiA9IHNpemVvZih0dTEyMTZfaW5pdCkgfTsKIAogCS8qIHNldHVwIFBMTCBjb25maWd1cmF0aW9uICovCisJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKIAlpZiAoaTJjX3RyYW5zZmVyKCZkZXYtPmkyY19hZGFwLCAmdHVuZXJfbXNnLCAxKSAhPSAxKQogCQlyZXR1cm4gLUVJTzsKIAltc2xlZXAoMSk7CkBAIC0yOTAsMTIgKzI5MiwxMiBAQAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotc3RhdGljIGludCBwaGlsaXBzX3R1MTIxNl9wbGxfNjBfaW5pdChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3N0YXRpYyBpbnQgcGhpbGlwc190dTEyMTZfdHVuZXJfNjBfaW5pdChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKIHsKIAlyZXR1cm4gcGhpbGlwc190ZGE2NjUxX3BsbF9pbml0KDB4NjAsIGZlKTsKIH0KIAotc3RhdGljIGludCBwaGlsaXBzX3R1MTIxNl9wbGxfNjBfc2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnBhcmFtcykKK3N0YXRpYyBpbnQgcGhpbGlwc190dTEyMTZfdHVuZXJfNjBfc2V0X3BhcmFtcyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMpCiB7CiAJcmV0dXJuIHBoaWxpcHNfdGRhNjY1MV9wbGxfc2V0KDB4NjAsIGZlLCBwYXJhbXMpOwogfQpAQCAtMzE1LDIwICszMTcsMTcgQEAKIAkueHRhbF9mcmVxICAgICA9IFREQTEwMDQ2X1hUQUxfNE0sCiAJLmFnY19jb25maWcgICAgPSBUREExMDA0Nl9BR0NfREVGQVVMVCwKIAkuaWZfZnJlcSAgICAgICA9IFREQTEwMDQ2X0ZSRVFfMzYxNywKLQkucGxsX2luaXQgICAgICA9IHBoaWxpcHNfdHUxMjE2X3BsbF82MF9pbml0LAotCS5wbGxfc2V0ICAgICAgID0gcGhpbGlwc190dTEyMTZfcGxsXzYwX3NldCwKLQkucGxsX3NsZWVwICAgICA9IE5VTEwsCiAJLnJlcXVlc3RfZmlybXdhcmUgPSBwaGlsaXBzX3R1MTIxNl9yZXF1ZXN0X2Zpcm13YXJlLAogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyBpbnQgcGhpbGlwc190dTEyMTZfcGxsXzYxX2luaXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCitzdGF0aWMgaW50IHBoaWxpcHNfdHUxMjE2X3R1bmVyXzYxX2luaXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCiB7CiAJcmV0dXJuIHBoaWxpcHNfdGRhNjY1MV9wbGxfaW5pdCgweDYxLCBmZSk7CiB9CiAKLXN0YXRpYyBpbnQgcGhpbGlwc190dTEyMTZfcGxsXzYxX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMpCitzdGF0aWMgaW50IHBoaWxpcHNfdHUxMjE2X3R1bmVyXzYxX3NldF9wYXJhbXMoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcGFyYW1zKQogewogCXJldHVybiBwaGlsaXBzX3RkYTY2NTFfcGxsX3NldCgweDYxLCBmZSwgcGFyYW1zKTsKIH0KQEAgLTM0MSwyMSArMzQwLDIwIEBACiAJLnh0YWxfZnJlcSAgICAgPSBUREExMDA0Nl9YVEFMXzRNLAogCS5hZ2NfY29uZmlnICAgID0gVERBMTAwNDZfQUdDX0RFRkFVTFQsCiAJLmlmX2ZyZXEgICAgICAgPSBUREExMDA0Nl9GUkVRXzM2MTcsCi0JLnBsbF9pbml0ICAgICAgPSBwaGlsaXBzX3R1MTIxNl9wbGxfNjFfaW5pdCwKLQkucGxsX3NldCAgICAgICA9IHBoaWxpcHNfdHUxMjE2X3BsbF82MV9zZXQsCi0JLnBsbF9zbGVlcCAgICAgPSBOVUxMLAogCS5yZXF1ZXN0X2Zpcm13YXJlID0gcGhpbGlwc190dTEyMTZfcmVxdWVzdF9maXJtd2FyZSwKIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1zdGF0aWMgaW50IHBoaWxpcHNfZXVyb3BhX3BsbF9pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQorc3RhdGljIGludCBwaGlsaXBzX2V1cm9wYV90dW5lcl9pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQogewogCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gZmUtPmR2Yi0+cHJpdjsKIAlzdGF0aWMgdTggbXNnW10gPSB7IDB4MGIsIDB4ZjUsIDB4ODYsIDB4YWIgfTsKIAlzdHJ1Y3QgaTJjX21zZyBpbml0X21zZyA9IHsuYWRkciA9IDB4NjEsLmZsYWdzID0gMCwuYnVmID0gbXNnLC5sZW4gPSBzaXplb2YobXNnKSB9OwogCiAJLyogc2V0dXAgUExMIGNvbmZpZ3VyYXRpb24gKi8KKwlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDEpOwogCWlmIChpMmNfdHJhbnNmZXIoJmRldi0+aTJjX2FkYXAsICZpbml0X21zZywgMSkgIT0gMSkKIAkJcmV0dXJuIC1FSU87CiAJbXNsZWVwKDEpOwpAQCAtMzY1LDE4ICszNjMsMjAgQEAKIAlpbml0X21zZy5sZW4gID0gMHgwMjsKIAltc2dbMF0gPSAweDAwOwogCW1zZ1sxXSA9IDB4NDA7CisJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKIAlpZiAoaTJjX3RyYW5zZmVyKCZkZXYtPmkyY19hZGFwLCAmaW5pdF9tc2csIDEpICE9IDEpCiAJCXJldHVybiAtRUlPOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcGhpbGlwc190ZDEzMTZfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMpCitzdGF0aWMgaW50IHBoaWxpcHNfdGQxMzE2X3R1bmVyX3NldF9wYXJhbXMoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcGFyYW1zKQogewogCXJldHVybiBwaGlsaXBzX3RkYTY2NTFfcGxsX3NldCgweDYxLCBmZSwgcGFyYW1zKTsKIH0KIAotc3RhdGljIHZvaWQgcGhpbGlwc19ldXJvcGFfYW5hbG9nKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQorc3RhdGljIGludCBwaGlsaXBzX2V1cm9wYV90dW5lcl9zbGVlcChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKIHsKIAlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IGZlLT5kdmItPnByaXY7CiAJLyogdGhpcyBtZXNzYWdlIGFjdHVhbGx5IHR1cm5zIHRoZSB0dW5lciBiYWNrIHRvIGFuYWxvZyBtb2RlICovCkBAIC0zOTEsNyArMzkxLDIwIEBACiAJYW5hbG9nX21zZy5sZW4gID0gMHgwMjsKIAltc2dbMF0gPSAweDAwOwogCW1zZ1sxXSA9IDB4MTQ7CisJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKIAlpMmNfdHJhbnNmZXIoJmRldi0+aTJjX2FkYXAsICZhbmFsb2dfbXNnLCAxKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwaGlsaXBzX2V1cm9wYV9kZW1vZF9zbGVlcChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3sKKwlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IGZlLT5kdmItPnByaXY7CisKKwlpZiAoZGV2LT5vcmlnaW5hbF9kZW1vZF9zbGVlcCkKKwkJZGV2LT5vcmlnaW5hbF9kZW1vZF9zbGVlcChmZSk7CisJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHN0cnVjdCB0ZGExMDA0eF9jb25maWcgcGhpbGlwc19ldXJvcGFfY29uZmlnID0gewpAQCAtNDAyLDIxICs0MTUsMjAgQEAKIAkueHRhbF9mcmVxICAgICA9IFREQTEwMDQ2X1hUQUxfNE0sCiAJLmFnY19jb25maWcgICAgPSBUREExMDA0Nl9BR0NfSUZPX0FVVE9fUE9TLAogCS5pZl9mcmVxICAgICAgID0gVERBMTAwNDZfRlJFUV8wNTIsCi0JLnBsbF9pbml0ICAgICAgPSBwaGlsaXBzX2V1cm9wYV9wbGxfaW5pdCwKLQkucGxsX3NldCAgICAgICA9IHBoaWxpcHNfdGQxMzE2X3BsbF9zZXQsCi0JLnBsbF9zbGVlcCAgICAgPSBwaGlsaXBzX2V1cm9wYV9hbmFsb2csCiAJLnJlcXVlc3RfZmlybXdhcmUgPSBOVUxMLAogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyBpbnQgcGhpbGlwc19mbWQxMjE2X3BsbF9pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQorc3RhdGljIGludCBwaGlsaXBzX2ZtZDEyMTZfdHVuZXJfaW5pdChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKIHsKIAlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IGZlLT5kdmItPnByaXY7CiAJLyogdGhpcyBtZXNzYWdlIGlzIHRvIHNldCB1cCBBVEMgYW5kIEFMQyAqLwogCXN0YXRpYyB1OCBmbWQxMjE2X2luaXRbXSA9IHsgMHgwYiwgMHhkYywgMHg5YywgMHhhMCB9OwogCXN0cnVjdCBpMmNfbXNnIHR1bmVyX21zZyA9IHsuYWRkciA9IDB4NjEsLmZsYWdzID0gMCwuYnVmID0gZm1kMTIxNl9pbml0LC5sZW4gPSBzaXplb2YoZm1kMTIxNl9pbml0KSB9OwogCisJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKIAlpZiAoaTJjX3RyYW5zZmVyKCZkZXYtPmkyY19hZGFwLCAmdHVuZXJfbXNnLCAxKSAhPSAxKQogCQlyZXR1cm4gLUVJTzsKIAltc2xlZXAoMSk7CkBAIC00MjQsMjIgKzQzNiwyNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBwaGlsaXBzX2ZtZDEyMTZfYW5hbG9nKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQorc3RhdGljIGludCBwaGlsaXBzX2ZtZDEyMTZfdHVuZXJfc2xlZXAoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCiB7CiAJc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSBmZS0+ZHZiLT5wcml2OwogCS8qIHRoaXMgbWVzc2FnZSBhY3R1YWxseSB0dXJucyB0aGUgdHVuZXIgYmFjayB0byBhbmFsb2cgbW9kZSAqLwogCXN0YXRpYyB1OCBmbWQxMjE2X2luaXRbXSA9IHsgMHgwYiwgMHhkYywgMHg5YywgMHg2MCB9OwogCXN0cnVjdCBpMmNfbXNnIHR1bmVyX21zZyA9IHsuYWRkciA9IDB4NjEsLmZsYWdzID0gMCwuYnVmID0gZm1kMTIxNl9pbml0LC5sZW4gPSBzaXplb2YoZm1kMTIxNl9pbml0KSB9OwogCisJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKIAlpMmNfdHJhbnNmZXIoJmRldi0+aTJjX2FkYXAsICZ0dW5lcl9tc2csIDEpOwogCW1zbGVlcCgxKTsKIAlmbWQxMjE2X2luaXRbMl0gPSAweDg2OwogCWZtZDEyMTZfaW5pdFszXSA9IDB4NTQ7CisJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKIAlpMmNfdHJhbnNmZXIoJmRldi0+aTJjX2FkYXAsICZ0dW5lcl9tc2csIDEpOwogCW1zbGVlcCgxKTsKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBwaGlsaXBzX2ZtZDEyMTZfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMpCitzdGF0aWMgaW50IHBoaWxpcHNfZm1kMTIxNl90dW5lcl9zZXRfcGFyYW1zKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnBhcmFtcykKIHsKIAlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IGZlLT5kdmItPnByaXY7CiAJdTggdHVuZXJfYnVmWzRdOwpAQCAtNTE2LDYgKzUzMyw4IEBACiAJdHVuZXJfYnVmWzJdID0gMHg4MCB8IChjcCA8PCA2KSB8IChtb2RlICA8PCAzKSB8IDQ7CiAJdHVuZXJfYnVmWzNdID0gMHg0MCB8IGJhbmQ7CiAKKwlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDEpOwogCWlmIChpMmNfdHJhbnNmZXIoJmRldi0+aTJjX2FkYXAsICZ0dW5lcl9tc2csIDEpICE9IDEpCiAJCXJldHVybiAtRUlPOwogCXJldHVybiAwOwpAQCAtNTI4LDkgKzU0Nyw2IEBACiAJLnh0YWxfZnJlcSAgICAgPSBUREExMDA0Nl9YVEFMXzE2TSwKIAkuYWdjX2NvbmZpZyAgICA9IFREQTEwMDQ2X0FHQ19JRk9fQVVUT19ORUcsCiAJLmlmX2ZyZXEgICAgICAgPSBUREExMDA0Nl9GUkVRXzM2MTMsCi0JLnBsbF9pbml0ICAgICAgPSBwaGlsaXBzX2ZtZDEyMTZfcGxsX2luaXQsCi0JLnBsbF9zZXQgICAgICAgPSBwaGlsaXBzX2ZtZDEyMTZfcGxsX3NldCwKLQkucGxsX3NsZWVwCSAgID0gcGhpbGlwc19mbWQxMjE2X2FuYWxvZywKIAkucmVxdWVzdF9maXJtd2FyZSA9IE5VTEwsCiB9OwogCkBAIC01NzgsMTIgKzU5NCwxMiBAQAogCXsgLmxvbWF4ID0gICAgICAgICAwLCAuc3BkID0gMCwgLmJzID0gMCwgLmJwID0gMCwgLmNwID0gMCwgLmdjMyA9IDAsIC5kaXYxcDUgPSAwfQogfTsKIAotc3RhdGljIGludCBwaGlsaXBzX3RkYTgyN3hfcGxsX2luaXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCitzdGF0aWMgaW50IHBoaWxpcHNfdGRhODI3eF90dW5lcl9pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQogewogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHBoaWxpcHNfdGRhODI3eF9wbGxfc2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnBhcmFtcykKK3N0YXRpYyBpbnQgcGhpbGlwc190ZGE4Mjd4X3R1bmVyX3NldF9wYXJhbXMoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcGFyYW1zKQogewogCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gZmUtPmR2Yi0+cHJpdjsKIAl1OCB0dW5lcl9idWZbMTRdOwpAQCAtNjMwLDYgKzY0Niw4IEBACiAJdHVuZXJfYnVmWzEzXSA9IDB4NDA7CiAKIAl0dW5lcl9tc2cubGVuID0gMTQ7CisJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKIAlpZiAoaTJjX3RyYW5zZmVyKCZkZXYtPmkyY19hZGFwLCAmdHVuZXJfbXNnLCAxKSAhPSAxKQogCQlyZXR1cm4gLUVJTzsKIApAQCAtNjM4LDE4ICs2NTYsMjMgQEAKIAl0dW5lcl9idWZbMF0gPSAweDMwOwogCXR1bmVyX2J1ZlsxXSA9IDB4NTAgKyB0ZGE4Mjd4X2R2YnRbaV0uY3A7CiAJdHVuZXJfbXNnLmxlbiA9IDI7CisJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKIAlpMmNfdHJhbnNmZXIoJmRldi0+aTJjX2FkYXAsICZ0dW5lcl9tc2csIDEpOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHBoaWxpcHNfdGRhODI3eF9wbGxfc2xlZXAoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCitzdGF0aWMgaW50IHBoaWxpcHNfdGRhODI3eF90dW5lcl9zbGVlcChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKIHsKIAlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IGZlLT5kdmItPnByaXY7CiAJc3RhdGljIHU4IHRkYTgyN3hfc2xlZXBbXSA9IHsgMHgzMCwgMHhkMH07CiAJc3RydWN0IGkyY19tc2cgdHVuZXJfbXNnID0gey5hZGRyID0gMHg2MCwuZmxhZ3MgPSAwLC5idWYgPSB0ZGE4Mjd4X3NsZWVwLAogCQkJCSAgICAubGVuID0gc2l6ZW9mKHRkYTgyN3hfc2xlZXApIH07CisJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKIAlpMmNfdHJhbnNmZXIoJmRldi0+aTJjX2FkYXAsICZ0dW5lcl9tc2csIDEpOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3RydWN0IHRkYTEwMDR4X2NvbmZpZyB0ZGE4Mjd4X2xpZmV2aWV3X2NvbmZpZyA9IHsKQEAgLTY1OSw5ICs2ODIsNiBAQAogCS54dGFsX2ZyZXEgICAgID0gVERBMTAwNDZfWFRBTF8xNk0sCiAJLmFnY19jb25maWcgICAgPSBUREExMDA0Nl9BR0NfVERBODI3WCwKIAkuaWZfZnJlcSAgICAgICA9IFREQTEwMDQ2X0ZSRVFfMDQ1LAotCS5wbGxfaW5pdCAgICAgID0gcGhpbGlwc190ZGE4Mjd4X3BsbF9pbml0LAotCS5wbGxfc2V0ICAgICAgID0gcGhpbGlwc190ZGE4Mjd4X3BsbF9zZXQsCi0JLnBsbF9zbGVlcAkgICA9IHBoaWxpcHNfdGRhODI3eF9wbGxfc2xlZXAsCiAJLnJlcXVlc3RfZmlybXdhcmUgPSBOVUxMLAogfTsKIApAQCAtNzUzLDYgKzc3Myw4IEBACiAJdHVuZXJfYnVmWzEyXSA9IDB4MDA7CiAJdHVuZXJfYnVmWzEzXSA9IDB4Mzk7ICAvLyBscHNlbAogCW1zZy5sZW4gPSAxNDsKKwlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDEpOwogCWlmIChpMmNfdHJhbnNmZXIoJmRldi0+aTJjX2FkYXAsICZtc2csIDEpICE9IDEpCiAJCXJldHVybiAtRUlPOwogCkBAIC03NjAsMTAgKzc4MiwxNCBAQAogCW1zZy5sZW4gPSAyOwogCXJlZzJbMF0gPSAweDYwOwogCXJlZzJbMV0gPSAweDNjOworCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMSk7CiAJaTJjX3RyYW5zZmVyKCZkZXYtPmkyY19hZGFwLCAmbXNnLCAxKTsKIAogCXJlZzJbMF0gPSAweGEwOwogCXJlZzJbMV0gPSAweDQwOworCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMSk7CiAJaTJjX3RyYW5zZmVyKCZkZXYtPmkyY19hZGFwLCAmbXNnLCAxKTsKIAogCW1zbGVlcCgyKTsKQEAgLTc3MSwzNiArNzk3LDQzIEBACiAJcmVnMlswXSA9IDB4MzA7CiAJcmVnMlsxXSA9IDB4MTAgKyB0ZGE4Mjd4YV9kdmJ0W2ldLnNjcjsKIAltc2cubGVuID0gMjsKKwlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDEpOwogCWkyY190cmFuc2ZlcigmZGV2LT5pMmNfYWRhcCwgJm1zZywgMSk7CiAKIAltc2xlZXAoNTUwKTsKIAlyZWcyWzBdID0gMHg1MDsKIAlyZWcyWzFdID0gMHg0ZiArICh0ZGE4Mjd4YV9kdmJ0W2ldLmdjMyA8PCA0KTsKKwlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDEpOwogCWkyY190cmFuc2ZlcigmZGV2LT5pMmNfYWRhcCwgJm1zZywgMSk7CiAKIAlyZXR1cm4gMDsKIAogfQogCi1zdGF0aWMgdm9pZCBwaGlsaXBzX3RkYTgyN3hhX3BsbF9zbGVlcCh1OCBhZGRyLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3N0YXRpYyBpbnQgcGhpbGlwc190ZGE4Mjd4YV90dW5lcl9zbGVlcCh1OCBhZGRyLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKIHsKIAlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IGZlLT5kdmItPnByaXY7CiAJc3RhdGljIHU4IHRkYTgyN3hhX3NsZWVwW10gPSB7IDB4MzAsIDB4OTB9OwogCXN0cnVjdCBpMmNfbXNnIHR1bmVyX21zZyA9IHsuYWRkciA9IGFkZHIsLmZsYWdzID0gMCwuYnVmID0gdGRhODI3eGFfc2xlZXAsCiAJCQkJICAgIC5sZW4gPSBzaXplb2YodGRhODI3eGFfc2xlZXApIH07CisJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKIAlpMmNfdHJhbnNmZXIoJmRldi0+aTJjX2FkYXAsICZ0dW5lcl9tc2csIDEpOwotCisJcmV0dXJuIDA7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1zdGF0aWMgaW50IHBoaWxpcHNfdGlnZXJfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMpCitzdGF0aWMgaW50IHBoaWxpcHNfdGlnZXJfdHVuZXJfc2V0X3BhcmFtcyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMpCiB7CiAJaW50IHJldDsKIAlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IGZlLT5kdmItPnByaXY7CiAJc3RhdGljIHU4IHRkYTgyOTBfY2xvc2VbXSA9IHsgMHgyMSwgMHhjMH07CiAJc3RhdGljIHU4IHRkYTgyOTBfb3BlbltdICA9IHsgMHgyMSwgMHg4MH07CiAJc3RydWN0IGkyY19tc2cgdGRhODI5MF9tc2cgPSB7LmFkZHIgPSAweDRiLC5mbGFncyA9IDAsIC5sZW4gPSAyfTsKKwogCS8qIGNsb3NlIHRkYTgyOTAgaTJjIGJyaWRnZSAqLwogCXRkYTgyOTBfbXNnLmJ1ZiA9IHRkYTgyOTBfY2xvc2U7CiAJcmV0ID0gaTJjX3RyYW5zZmVyKCZkZXYtPmkyY19hZGFwLCAmdGRhODI5MF9tc2csIDEpOwpAQCAtODE2LDcgKzg0OSw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBwaGlsaXBzX3RpZ2VyX2R2Yl9tb2RlKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQorc3RhdGljIGludCBwaGlsaXBzX3RpZ2VyX3R1bmVyX2luaXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCiB7CiAJc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSBmZS0+ZHZiLT5wcml2OwogCXN0YXRpYyB1OCBkYXRhW10gPSB7IDB4M2MsIDB4MzMsIDB4NmF9OwpAQCAtODI3LDE0ICs4NjAsMTUgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgcGhpbGlwc190aWdlcl9hbmFsb2dfbW9kZShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3N0YXRpYyBpbnQgcGhpbGlwc190aWdlcl90dW5lcl9zbGVlcChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKIHsKIAlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IGZlLT5kdmItPnByaXY7CiAJc3RhdGljIHU4IGRhdGFbXSA9IHsgMHgzYywgMHgzMywgMHg2OH07CiAJc3RydWN0IGkyY19tc2cgbXNnID0gey5hZGRyPTB4MDgsIC5mbGFncz0wLCAuYnVmPWRhdGEsIC5sZW4gPSBzaXplb2YoZGF0YSl9OwogCiAJaTJjX3RyYW5zZmVyKCZkZXYtPmkyY19hZGFwLCAmbXNnLCAxKTsKLQlwaGlsaXBzX3RkYTgyN3hhX3BsbF9zbGVlcCggMHg2MSwgZmUpOworCXBoaWxpcHNfdGRhODI3eGFfdHVuZXJfc2xlZXAoIDB4NjEsIGZlKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHN0cnVjdCB0ZGExMDA0eF9jb25maWcgcGhpbGlwc190aWdlcl9jb25maWcgPSB7CkBAIC04NDQsMTUgKzg3OCwxMiBAQAogCS54dGFsX2ZyZXEgICAgID0gVERBMTAwNDZfWFRBTF8xNk0sCiAJLmFnY19jb25maWcgICAgPSBUREExMDA0Nl9BR0NfVERBODI3WCwKIAkuaWZfZnJlcSAgICAgICA9IFREQTEwMDQ2X0ZSRVFfMDQ1LAotCS5wbGxfaW5pdCAgICAgID0gcGhpbGlwc190aWdlcl9kdmJfbW9kZSwKLQkucGxsX3NldCAgICAgICA9IHBoaWxpcHNfdGlnZXJfcGxsX3NldCwKLQkucGxsX3NsZWVwICAgICA9IHBoaWxpcHNfdGlnZXJfYW5hbG9nX21vZGUsCiAJLnJlcXVlc3RfZmlybXdhcmUgPSBOVUxMLAogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyBpbnQgbGlmZXZpZXdfdHJpb19wbGxfc2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnBhcmFtcykKK3N0YXRpYyBpbnQgbGlmZXZpZXdfdHJpb190dW5lcl9zZXRfcGFyYW1zKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnBhcmFtcykKIHsKIAlpbnQgcmV0OwogCkBAIC04NjAsMTYgKzg5MSwxMiBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgbGlmZXZpZXdfdHJpb19kdmJfbW9kZShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3N0YXRpYyBpbnQgbGlmZXZpZXdfdHJpb190dW5lcl9zbGVlcChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKIHsKKwlwaGlsaXBzX3RkYTgyN3hhX3R1bmVyX3NsZWVwKDB4NjAsIGZlKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgbGlmZXZpZXdfdHJpb19hbmFsb2dfbW9kZShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKLXsKLQlwaGlsaXBzX3RkYTgyN3hhX3BsbF9zbGVlcCgweDYwLCBmZSk7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgdGRhMTAwNHhfY29uZmlnIGxpZmV2aWV3X3RyaW9fY29uZmlnID0gewogCS5kZW1vZF9hZGRyZXNzID0gMHgwOSwKIAkuaW52ZXJ0ICAgICAgICA9IDEsCkBAIC04NzcsMTUgKzkwNCwxMiBAQAogCS54dGFsX2ZyZXEgICAgID0gVERBMTAwNDZfWFRBTF8xNk0sCiAJLmFnY19jb25maWcgICAgPSBUREExMDA0Nl9BR0NfVERBODI3WF9HUEwsCiAJLmlmX2ZyZXEgICAgICAgPSBUREExMDA0Nl9GUkVRXzA0NSwKLQkucGxsX2luaXQgICAgICA9IGxpZmV2aWV3X3RyaW9fZHZiX21vZGUsCi0JLnBsbF9zZXQgICAgICAgPSBsaWZldmlld190cmlvX3BsbF9zZXQsCi0JLnBsbF9zbGVlcCAgICAgPSBsaWZldmlld190cmlvX2FuYWxvZ19tb2RlLAogCS5yZXF1ZXN0X2Zpcm13YXJlID0gTlVMTCwKIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1zdGF0aWMgaW50IGFkc19kdW9fcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMpCitzdGF0aWMgaW50IGFkc19kdW9fdHVuZXJfc2V0X3BhcmFtcyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMpCiB7CiAJaW50IHJldDsKIApAQCAtODkzLDcgKzkxNyw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBhZHNfZHVvX2R2Yl9tb2RlKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQorc3RhdGljIGludCBhZHNfZHVvX3R1bmVyX2luaXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCiB7CiAJc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSBmZS0+ZHZiLT5wcml2OwogCS8qIHJvdXRlIFREQTgyNzVhIEFHQyBpbnB1dCB0byB0aGUgY2hhbm5lbCBkZWNvZGVyICovCkBAIC05MDEsMTIgKzkyNSwxMyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBhZHNfZHVvX2FuYWxvZ19tb2RlKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQorc3RhdGljIGludCBhZHNfZHVvX3R1bmVyX3NsZWVwKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQogewogCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gZmUtPmR2Yi0+cHJpdjsKIAkvKiByb3V0ZSBUREE4Mjc1YSBBR0MgaW5wdXQgdG8gdGhlIGFuYWxvZyBJRiBjaGlwKi8KIAlzYWFfd3JpdGViKFNBQTcxMzRfR1BJT19HUFNUQVRVUzIsIDB4MjApOwotCXBoaWxpcHNfdGRhODI3eGFfcGxsX3NsZWVwKCAweDYxLCBmZSk7CisJcGhpbGlwc190ZGE4Mjd4YV90dW5lcl9zbGVlcCggMHg2MSwgZmUpOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3RydWN0IHRkYTEwMDR4X2NvbmZpZyBhZHNfdGVjaF9kdW9fY29uZmlnID0gewpAQCAtOTE2LDMxICs5NDEsMjQgQEAKIAkueHRhbF9mcmVxICAgICA9IFREQTEwMDQ2X1hUQUxfMTZNLAogCS5hZ2NfY29uZmlnICAgID0gVERBMTAwNDZfQUdDX1REQTgyN1hfR1BMLAogCS5pZl9mcmVxICAgICAgID0gVERBMTAwNDZfRlJFUV8wNDUsCi0JLnBsbF9pbml0ICAgICAgPSBhZHNfZHVvX2R2Yl9tb2RlLAotCS5wbGxfc2V0ICAgICAgID0gYWRzX2R1b19wbGxfc2V0LAotCS5wbGxfc2xlZXAgICAgID0gYWRzX2R1b19hbmFsb2dfbW9kZSwKIAkucmVxdWVzdF9maXJtd2FyZSA9IE5VTEwsCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotc3RhdGljIGludCB0ZXZpb25fZHZiMjIwcmZfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMpCitzdGF0aWMgaW50IHRldmlvbl9kdmIyMjByZl90dW5lcl9zZXRfcGFyYW1zKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnBhcmFtcykKIHsKIAlpbnQgcmV0OwogCXJldCA9IHBoaWxpcHNfdGRhODI3eGFfcGxsX3NldCgweDYwLCBmZSwgcGFyYW1zKTsKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHRldmlvbl9kdmIyMjByZl9wbGxfaW5pdChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3N0YXRpYyBpbnQgdGV2aW9uX2R2YjIyMHJmX3R1bmVyX3NsZWVwKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQogeworCXBoaWxpcHNfdGRhODI3eGFfdHVuZXJfc2xlZXAoIDB4NjEsIGZlKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgdGV2aW9uX2R2YjIyMHJmX3BsbF9zbGVlcChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKLXsKLQlwaGlsaXBzX3RkYTgyN3hhX3BsbF9zbGVlcCggMHg2MSwgZmUpOwotfQotCiBzdGF0aWMgc3RydWN0IHRkYTEwMDR4X2NvbmZpZyB0ZXZpb25fZHZidDIyMHJmX2NvbmZpZyA9IHsKIAkuZGVtb2RfYWRkcmVzcyA9IDB4MDgsCiAJLmludmVydCAgICAgICAgPSAxLApAQCAtOTQ4LDkgKzk2Niw2IEBACiAJLnh0YWxfZnJlcSAgICAgPSBUREExMDA0Nl9YVEFMXzE2TSwKIAkuYWdjX2NvbmZpZyAgICA9IFREQTEwMDQ2X0FHQ19UREE4MjdYLAogCS5pZl9mcmVxICAgICAgID0gVERBMTAwNDZfRlJFUV8wNDUsCi0JLnBsbF9pbml0ICAgICAgPSB0ZXZpb25fZHZiMjIwcmZfcGxsX2luaXQsCi0JLnBsbF9zZXQgICAgICAgPSB0ZXZpb25fZHZiMjIwcmZfcGxsX3NldCwKLQkucGxsX3NsZWVwICAgICA9IHRldmlvbl9kdmIyMjByZl9wbGxfc2xlZXAsCiAJLnJlcXVlc3RfZmlybXdhcmUgPSBOVUxMLAogfTsKIApAQCAtOTYxLDggKzk3Niw2IEBACiAjaWZkZWYgSEFWRV9OWFQyMDBYCiBzdGF0aWMgc3RydWN0IG54dDIwMHhfY29uZmlnIGF2ZXJ0dmhkYTE4MCA9IHsKIAkuZGVtb2RfYWRkcmVzcyAgICA9IDB4MGEsCi0JLnBsbF9hZGRyZXNzICAgICAgPSAweDYxLAotCS5wbGxfZGVzYyAgICAgICAgID0gJmR2Yl9wbGxfdGRodTIsCiB9OwogCiBzdGF0aWMgaW50IG54dDIwMHhfc2V0X3BsbF9pbnB1dCh1OCAqYnVmLCBpbnQgaW5wdXQpCkBAIC05NzYsOCArOTg5LDYgQEAKIAogc3RhdGljIHN0cnVjdCBueHQyMDB4X2NvbmZpZyBrd29ybGRhdHNjMTEwID0gewogCS5kZW1vZF9hZGRyZXNzICAgID0gMHgwYSwKLQkucGxsX2FkZHJlc3MgICAgICA9IDB4NjEsCi0JLnBsbF9kZXNjICAgICAgICAgPSAmZHZiX3BsbF90dXYxMjM2ZCwKIAkuc2V0X3BsbF9pbnB1dCAgICA9IG54dDIwMHhfc2V0X3BsbF9pbnB1dCwKIH07CiAjZW5kaWYKQEAgLTEwMDMsNzggKzEwMTQsMTU4IEBACiAJCXByaW50aygiJXM6IHBpbm5hY2xlIDMwMGkgZHZiIHNldHVwXG4iLGRldi0+bmFtZSk7CiAJCWRldi0+ZHZiLmZyb250ZW5kID0gbXQzNTJfYXR0YWNoKCZwaW5uYWNsZV8zMDBpLAogCQkJCQkJICZkZXYtPmkyY19hZGFwKTsKKwkJaWYgKGRldi0+ZHZiLmZyb250ZW5kKSB7CisJCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gbXQzNTJfcGlubmFjbGVfdHVuZXJfc2V0X3BhcmFtczsKKwkJfQogCQlicmVhazsKIAogCWNhc2UgU0FBNzEzNF9CT0FSRF9BVkVSTUVESUFfNzc3OgogCQlwcmludGsoIiVzOiBhdmVydHYgNzc3IGR2YiBzZXR1cFxuIixkZXYtPm5hbWUpOwogCQlkZXYtPmR2Yi5mcm9udGVuZCA9IG10MzUyX2F0dGFjaCgmYXZlcm1lZGlhXzc3NywKIAkJCQkJCSAmZGV2LT5pMmNfYWRhcCk7CisJCWlmIChkZXYtPmR2Yi5mcm9udGVuZCkgeworCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuY2FsY19yZWdzID0gbXQzNTJfYXZlcjc3N190dW5lcl9jYWxjX3JlZ3M7CisJCX0KIAkJYnJlYWs7CiAjZW5kaWYKICNpZmRlZiBIQVZFX1REQTEwMDRYCiAJY2FzZSBTQUE3MTM0X0JPQVJEX01ENzEzNDoKIAkJZGV2LT5kdmIuZnJvbnRlbmQgPSB0ZGExMDA0Nl9hdHRhY2goJm1lZGlvbl9jYXJkYnVzLAogCQkJCQkJICAgICZkZXYtPmkyY19hZGFwKTsKKwkJaWYgKGRldi0+ZHZiLmZyb250ZW5kKSB7CisJCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5pbml0ID0gcGhpbGlwc19mbWQxMjE2X3R1bmVyX2luaXQ7CisJCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5zbGVlcCA9IHBoaWxpcHNfZm1kMTIxNl90dW5lcl9zbGVlcDsKKwkJCWRldi0+ZHZiLmZyb250ZW5kLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBwaGlsaXBzX2ZtZDEyMTZfdHVuZXJfc2V0X3BhcmFtczsKKwkJfQogCQlicmVhazsKIAljYXNlIFNBQTcxMzRfQk9BUkRfUEhJTElQU19UT1VHSDoKIAkJZGV2LT5kdmIuZnJvbnRlbmQgPSB0ZGExMDA0Nl9hdHRhY2goJnBoaWxpcHNfdHUxMjE2XzYwX2NvbmZpZywKIAkJCQkJCSAgICAmZGV2LT5pMmNfYWRhcCk7CisJCWlmIChkZXYtPmR2Yi5mcm9udGVuZCkgeworCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuaW5pdCA9IHBoaWxpcHNfdHUxMjE2X3R1bmVyXzYwX2luaXQ7CisJCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gcGhpbGlwc190dTEyMTZfdHVuZXJfNjBfc2V0X3BhcmFtczsKKwkJfQogCQlicmVhazsKIAljYXNlIFNBQTcxMzRfQk9BUkRfRkxZRFZCVERVTzoKIAkJZGV2LT5kdmIuZnJvbnRlbmQgPSB0ZGExMDA0Nl9hdHRhY2goJnRkYTgyN3hfbGlmZXZpZXdfY29uZmlnLAogCQkJCQkJICAgICZkZXYtPmkyY19hZGFwKTsKKwkJaWYgKGRldi0+ZHZiLmZyb250ZW5kKSB7CisJCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5pbml0ID0gcGhpbGlwc190ZGE4Mjd4X3R1bmVyX2luaXQ7CisJCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5zbGVlcCA9IHBoaWxpcHNfdGRhODI3eF90dW5lcl9zbGVlcDsKKwkJCWRldi0+ZHZiLmZyb250ZW5kLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBwaGlsaXBzX3RkYTgyN3hfdHVuZXJfc2V0X3BhcmFtczsKKwkJfQogCQlicmVhazsKIAljYXNlIFNBQTcxMzRfQk9BUkRfRkxZRFZCVF9EVU9fQ0FSREJVUzoKIAkJZGV2LT5kdmIuZnJvbnRlbmQgPSB0ZGExMDA0Nl9hdHRhY2goJnRkYTgyN3hfbGlmZXZpZXdfY29uZmlnLAogCQkJCQkJICAgICZkZXYtPmkyY19hZGFwKTsKKwkJaWYgKGRldi0+ZHZiLmZyb250ZW5kKSB7CisJCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5pbml0ID0gcGhpbGlwc190ZGE4Mjd4X3R1bmVyX2luaXQ7CisJCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5zbGVlcCA9IHBoaWxpcHNfdGRhODI3eF90dW5lcl9zbGVlcDsKKwkJCWRldi0+ZHZiLmZyb250ZW5kLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBwaGlsaXBzX3RkYTgyN3hfdHVuZXJfc2V0X3BhcmFtczsKKwkJfQogCQlicmVhazsKIAljYXNlIFNBQTcxMzRfQk9BUkRfUEhJTElQU19FVVJPUEE6CiAJCWRldi0+ZHZiLmZyb250ZW5kID0gdGRhMTAwNDZfYXR0YWNoKCZwaGlsaXBzX2V1cm9wYV9jb25maWcsCiAJCQkJCQkgICAgJmRldi0+aTJjX2FkYXApOworCQlpZiAoZGV2LT5kdmIuZnJvbnRlbmQpIHsKKwkJCWRldi0+b3JpZ2luYWxfZGVtb2Rfc2xlZXAgPSBkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLnNsZWVwOworCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy5zbGVlcCA9IHBoaWxpcHNfZXVyb3BhX2RlbW9kX3NsZWVwOworCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuaW5pdCA9IHBoaWxpcHNfZXVyb3BhX3R1bmVyX2luaXQ7CisJCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5zbGVlcCA9IHBoaWxpcHNfZXVyb3BhX3R1bmVyX3NsZWVwOworCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IHBoaWxpcHNfdGQxMzE2X3R1bmVyX3NldF9wYXJhbXM7CisJCX0KIAkJYnJlYWs7CiAJY2FzZSBTQUE3MTM0X0JPQVJEX1ZJREVPTUFURV9EVkJUXzMwMDoKIAkJZGV2LT5kdmIuZnJvbnRlbmQgPSB0ZGExMDA0Nl9hdHRhY2goJnBoaWxpcHNfZXVyb3BhX2NvbmZpZywKIAkJCQkJCSAgICAmZGV2LT5pMmNfYWRhcCk7CisJCWlmIChkZXYtPmR2Yi5mcm9udGVuZCkgeworCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuaW5pdCA9IHBoaWxpcHNfZXVyb3BhX3R1bmVyX2luaXQ7CisJCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5zbGVlcCA9IHBoaWxpcHNfZXVyb3BhX3R1bmVyX3NsZWVwOworCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IHBoaWxpcHNfdGQxMzE2X3R1bmVyX3NldF9wYXJhbXM7CisJCX0KIAkJYnJlYWs7CiAJY2FzZSBTQUE3MTM0X0JPQVJEX1ZJREVPTUFURV9EVkJUXzIwMDoKIAkJZGV2LT5kdmIuZnJvbnRlbmQgPSB0ZGExMDA0Nl9hdHRhY2goJnBoaWxpcHNfdHUxMjE2XzYxX2NvbmZpZywKIAkJCQkJCSAgICAmZGV2LT5pMmNfYWRhcCk7CisJCWlmIChkZXYtPmR2Yi5mcm9udGVuZCkgeworCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuaW5pdCA9IHBoaWxpcHNfdHUxMjE2X3R1bmVyXzYxX2luaXQ7CisJCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gcGhpbGlwc190dTEyMTZfdHVuZXJfNjFfc2V0X3BhcmFtczsKKwkJfQogCQlicmVhazsKIAljYXNlIFNBQTcxMzRfQk9BUkRfUEhJTElQU19USUdFUjoKIAkJZGV2LT5kdmIuZnJvbnRlbmQgPSB0ZGExMDA0Nl9hdHRhY2goJnBoaWxpcHNfdGlnZXJfY29uZmlnLAogCQkJCQkJICAgICZkZXYtPmkyY19hZGFwKTsKKwkJaWYgKGRldi0+ZHZiLmZyb250ZW5kKSB7CisJCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5pbml0ID0gcGhpbGlwc190aWdlcl90dW5lcl9pbml0OworCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuc2xlZXAgPSBwaGlsaXBzX3RpZ2VyX3R1bmVyX3NsZWVwOworCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IHBoaWxpcHNfdGlnZXJfdHVuZXJfc2V0X3BhcmFtczsKKwkJfQogCQlicmVhazsKIAljYXNlIFNBQTcxMzRfQk9BUkRfQVNVU1RlS19QNzEzMV9EVUFMOgogCQlkZXYtPmR2Yi5mcm9udGVuZCA9IHRkYTEwMDQ2X2F0dGFjaCgmcGhpbGlwc190aWdlcl9jb25maWcsCiAJCQkJCQkgICAgJmRldi0+aTJjX2FkYXApOworCQlpZiAoZGV2LT5kdmIuZnJvbnRlbmQpIHsKKwkJCWRldi0+ZHZiLmZyb250ZW5kLT5vcHMudHVuZXJfb3BzLmluaXQgPSBwaGlsaXBzX3RpZ2VyX3R1bmVyX2luaXQ7CisJCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5zbGVlcCA9IHBoaWxpcHNfdGlnZXJfdHVuZXJfc2xlZXA7CisJCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gcGhpbGlwc190aWdlcl90dW5lcl9zZXRfcGFyYW1zOworCQl9CiAJCWJyZWFrOwogCWNhc2UgU0FBNzEzNF9CT0FSRF9GTFlEVkJUX0xSMzAxOgogCQlkZXYtPmR2Yi5mcm9udGVuZCA9IHRkYTEwMDQ2X2F0dGFjaCgmdGRhODI3eF9saWZldmlld19jb25maWcsCiAJCQkJCQkgICAgJmRldi0+aTJjX2FkYXApOworCQlpZiAoZGV2LT5kdmIuZnJvbnRlbmQpIHsKKwkJCWRldi0+ZHZiLmZyb250ZW5kLT5vcHMudHVuZXJfb3BzLmluaXQgPSBwaGlsaXBzX3RkYTgyN3hfdHVuZXJfaW5pdDsKKwkJCWRldi0+ZHZiLmZyb250ZW5kLT5vcHMudHVuZXJfb3BzLnNsZWVwID0gcGhpbGlwc190ZGE4Mjd4X3R1bmVyX3NsZWVwOworCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IHBoaWxpcHNfdGRhODI3eF90dW5lcl9zZXRfcGFyYW1zOworCQl9CiAJCWJyZWFrOwogCWNhc2UgU0FBNzEzNF9CT0FSRF9GTFlEVkJfVFJJTzoKIAkJZGV2LT5kdmIuZnJvbnRlbmQgPSB0ZGExMDA0Nl9hdHRhY2goJmxpZmV2aWV3X3RyaW9fY29uZmlnLAogCQkJCQkJICAgICZkZXYtPmkyY19hZGFwKTsKKwkJaWYgKGRldi0+ZHZiLmZyb250ZW5kKSB7CisJCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5zbGVlcCA9IGxpZmV2aWV3X3RyaW9fdHVuZXJfc2xlZXA7CisJCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gbGlmZXZpZXdfdHJpb190dW5lcl9zZXRfcGFyYW1zOworCQl9CiAJCWJyZWFrOwogCWNhc2UgU0FBNzEzNF9CT0FSRF9BRFNfRFVPX0NBUkRCVVNfUFRWMzMxOgogCQlkZXYtPmR2Yi5mcm9udGVuZCA9IHRkYTEwMDQ2X2F0dGFjaCgmYWRzX3RlY2hfZHVvX2NvbmZpZywKIAkJCQkJCSAgICAmZGV2LT5pMmNfYWRhcCk7CisJCWlmIChkZXYtPmR2Yi5mcm9udGVuZCkgeworCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuaW5pdCA9IGFkc19kdW9fdHVuZXJfaW5pdDsKKwkJCWRldi0+ZHZiLmZyb250ZW5kLT5vcHMudHVuZXJfb3BzLnNsZWVwID0gYWRzX2R1b190dW5lcl9zbGVlcDsKKwkJCWRldi0+ZHZiLmZyb250ZW5kLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBhZHNfZHVvX3R1bmVyX3NldF9wYXJhbXM7CisJCX0KIAkJYnJlYWs7CiAJY2FzZSBTQUE3MTM0X0JPQVJEX1RFVklPTl9EVkJUXzIyMFJGOgogCQlkZXYtPmR2Yi5mcm9udGVuZCA9IHRkYTEwMDQ2X2F0dGFjaCgmdGV2aW9uX2R2YnQyMjByZl9jb25maWcsCiAJCQkJCQkgICAgJmRldi0+aTJjX2FkYXApOworCQlpZiAoZGV2LT5kdmIuZnJvbnRlbmQpIHsKKwkJCWRldi0+ZHZiLmZyb250ZW5kLT5vcHMudHVuZXJfb3BzLnNsZWVwID0gdGV2aW9uX2R2YjIyMHJmX3R1bmVyX3NsZWVwOworCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IHRldmlvbl9kdmIyMjByZl90dW5lcl9zZXRfcGFyYW1zOworCQl9CiAJCWJyZWFrOwogCWNhc2UgU0FBNzEzNF9CT0FSRF9GTFlEVkJUX0hZQlJJRF9DQVJEQlVTOgogCQlkZXYtPmR2Yi5mcm9udGVuZCA9IHRkYTEwMDQ2X2F0dGFjaCgmYWRzX3RlY2hfZHVvX2NvbmZpZywKIAkJCQkJCSAgICAmZGV2LT5pMmNfYWRhcCk7CisJCWlmIChkZXYtPmR2Yi5mcm9udGVuZCkgeworCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuaW5pdCA9IGFkc19kdW9fdHVuZXJfaW5pdDsKKwkJCWRldi0+ZHZiLmZyb250ZW5kLT5vcHMudHVuZXJfb3BzLnNsZWVwID0gYWRzX2R1b190dW5lcl9zbGVlcDsKKwkJCWRldi0+ZHZiLmZyb250ZW5kLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBhZHNfZHVvX3R1bmVyX3NldF9wYXJhbXM7CisJCX0KIAkJYnJlYWs7CiAjZW5kaWYKICNpZmRlZiBIQVZFX05YVDIwMFgKIAljYXNlIFNBQTcxMzRfQk9BUkRfQVZFUk1FRElBX0FWRVJUVkhEX0ExODA6CiAJCWRldi0+ZHZiLmZyb250ZW5kID0gbnh0MjAweF9hdHRhY2goJmF2ZXJ0dmhkYTE4MCwgJmRldi0+aTJjX2FkYXApOworCQlpZiAoZGV2LT5kdmIuZnJvbnRlbmQpIHsKKwkJCWR2Yl9wbGxfYXR0YWNoKGRldi0+ZHZiLmZyb250ZW5kLCAweDYxLCAmZGV2LT5pMmNfYWRhcCwgJmR2Yl9wbGxfdGRodTIpOworCQl9CiAJCWJyZWFrOwogCWNhc2UgU0FBNzEzNF9CT0FSRF9LV09STERfQVRTQzExMDoKIAkJZGV2LT5kdmIuZnJvbnRlbmQgPSBueHQyMDB4X2F0dGFjaCgma3dvcmxkYXRzYzExMCwgJmRldi0+aTJjX2FkYXApOworCQlpZiAoZGV2LT5kdmIuZnJvbnRlbmQpIHsKKwkJCWR2Yl9wbGxfYXR0YWNoKGRldi0+ZHZiLmZyb250ZW5kLCAweDYxLCAmZGV2LT5pMmNfYWRhcCwgJmR2Yl9wbGxfdHV2MTIzNmQpOworCQl9CiAJCWJyZWFrOwogI2VuZGlmCiAJZGVmYXVsdDoKQEAgLTEwODgsNyArMTE3OSw3IEBACiAJfQogCiAJLyogcmVnaXN0ZXIgZXZlcnl0aGluZyBlbHNlICovCi0JcmV0dXJuIHZpZGVvYnVmX2R2Yl9yZWdpc3RlcigmZGV2LT5kdmIsIFRISVNfTU9EVUxFLCBkZXYpOworCXJldHVybiB2aWRlb2J1Zl9kdmJfcmVnaXN0ZXIoJmRldi0+ZHZiLCBUSElTX01PRFVMRSwgZGV2LCAmZGV2LT5wY2ktPmRldik7CiB9CiAKIHN0YXRpYyBpbnQgZHZiX2Zpbmkoc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1lbXByZXNzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1lbXByZXNzLmMKaW5kZXggMWQ5NzJlZC4uNjVkMDQ0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtZW1wcmVzcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWVtcHJlc3MuYwpAQCAtNjQsOCArNjQsMTAgQEAKIAogc3RhdGljIGludCB0c19pbml0X2VuY29kZXIoc3RydWN0IHNhYTcxMzRfZGV2KiBkZXYpCiB7CisJc3RydWN0IHY0bDJfZXh0X2NvbnRyb2xzIGN0cmxzID0geyBWNEwyX0NUUkxfQ0xBU1NfTVBFRywgMCB9OworCiAJdHNfcmVzZXRfZW5jb2RlcihkZXYpOwotCXNhYTcxMzRfaTJjX2NhbGxfY2xpZW50cyhkZXYsIFZJRElPQ19TX01QRUdDT01QLCBOVUxMKTsKKwlzYWE3MTM0X2kyY19jYWxsX2NsaWVudHMoZGV2LCBWSURJT0NfU19FWFRfQ1RSTFMsICZjdHJscyk7CiAJZGV2LT5lbXByZXNzX3N0YXJ0ZWQgPSAxOwogCXJldHVybiAwOwogfQpAQCAtMTYyLDYgKzE2NCw3IEBACiAJCSAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCiB7CiAJc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHY0bDJfZXh0X2NvbnRyb2xzICpjdHJscyA9IGFyZzsKIAogCWlmIChkZWJ1ZyA+IDEpCiAJCXY0bF9wcmludF9pb2N0bChkZXYtPm5hbWUsY21kKTsKQEAgLTI3OCwxMiArMjgxLDMxIEBACiAJCXJldHVybiBzYWE3MTM0X2NvbW1vbl9pb2N0bChkZXYsIGNtZCwgYXJnKTsKIAogCWNhc2UgVklESU9DX1NfTVBFR0NPTVA6CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlZJRElPQ19TX01QRUdDT01QIGlzIG9ic29sZXRlLiAiCisJCQkJICAgICJSZXBsYWNlIHdpdGggVklESU9DX1NfRVhUX0NUUkxTISIpOwogCQlzYWE3MTM0X2kyY19jYWxsX2NsaWVudHMoZGV2LCBWSURJT0NfU19NUEVHQ09NUCwgYXJnKTsKIAkJdHNfaW5pdF9lbmNvZGVyKGRldik7CiAJCXJldHVybiAwOwogCWNhc2UgVklESU9DX0dfTVBFR0NPTVA6CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlZJRElPQ19HX01QRUdDT01QIGlzIG9ic29sZXRlLiAiCisJCQkJICAgICJSZXBsYWNlIHdpdGggVklESU9DX0dfRVhUX0NUUkxTISIpOwogCQlzYWE3MTM0X2kyY19jYWxsX2NsaWVudHMoZGV2LCBWSURJT0NfR19NUEVHQ09NUCwgYXJnKTsKIAkJcmV0dXJuIDA7CisJY2FzZSBWSURJT0NfU19FWFRfQ1RSTFM6CisJCS8qIGNvdW50ID09IDAgaXMgYWJ1c2VkIGluIHNhYTY3NTJocy5jLCBzbyB0aGF0IHNwZWNpYWwKKwkJICAgY2FzZSBpcyBoYW5kbGVkIGhlcmUgZXhwbGljaXRseS4gKi8KKwkJaWYgKGN0cmxzLT5jb3VudCA9PSAwKQorCQkJcmV0dXJuIDA7CisJCWlmIChjdHJscy0+Y3RybF9jbGFzcyAhPSBWNEwyX0NUUkxfQ0xBU1NfTVBFRykKKwkJCXJldHVybiAtRUlOVkFMOworCQlzYWE3MTM0X2kyY19jYWxsX2NsaWVudHMoZGV2LCBWSURJT0NfU19FWFRfQ1RSTFMsIGFyZyk7CisJCXRzX2luaXRfZW5jb2RlcihkZXYpOworCQlyZXR1cm4gMDsKKwljYXNlIFZJRElPQ19HX0VYVF9DVFJMUzoKKwkJaWYgKGN0cmxzLT5jdHJsX2NsYXNzICE9IFY0TDJfQ1RSTF9DTEFTU19NUEVHKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXNhYTcxMzRfaTJjX2NhbGxfY2xpZW50cyhkZXYsIFZJRElPQ19HX0VYVF9DVFJMUywgYXJnKTsKKwkJcmV0dXJuIDA7CiAKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtaW5wdXQuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWlucHV0LmMKaW5kZXggMTQyNmU0Yy4uN2M1OTU0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtaW5wdXQuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1pbnB1dC5jCkBAIC0zNyw2ICszNywxMCBAQAogbW9kdWxlX3BhcmFtKGlyX2RlYnVnLCBpbnQsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhpcl9kZWJ1ZywiZW5hYmxlIGRlYnVnIG1lc3NhZ2VzIFtJUl0iKTsKIAorc3RhdGljIGludCBwaW5uYWNsZV9yZW1vdGUgPSAwOworbW9kdWxlX3BhcmFtKHBpbm5hY2xlX3JlbW90ZSwgaW50LCAwNjQ0KTsgICAgLyogQ2hvb3NlIFBpbm5hY2xlIFBDVFYgcmVtb3RlICovCitNT0RVTEVfUEFSTV9ERVNDKHBpbm5hY2xlX3JlbW90ZSwgIlNwZWNpZnkgUGlubmFjbGUgUENUViByZW1vdGU6IDA9Y29sb3VyZWQsIDE9Z3JleSAoZGVmYXVsdHMgdG8gMCkiKTsKKwogI2RlZmluZSBkcHJpbnRrKGZtdCwgYXJnLi4uKQlpZiAoaXJfZGVidWcpIFwKIAlwcmludGsoS0VSTl9ERUJVRyAiJXMvaXI6ICIgZm10LCBkZXYtPm5hbWUgLCAjIyBhcmcpCiAjZGVmaW5lIGkyY2RwcmludGsoZm10LCBhcmcuLi4pICAgIGlmIChpcl9kZWJ1ZykgXApAQCAtMzE2LDggKzMyMCwxMyBAQAogCXN3aXRjaCAoZGV2LT5ib2FyZCkgewogCWNhc2UgU0FBNzEzNF9CT0FSRF9QSU5OQUNMRV9QQ1RWXzExMGk6CiAJCXNucHJpbnRmKGlyLT5jLm5hbWUsIHNpemVvZihpci0+Yy5uYW1lKSwgIlBpbm5hY2xlIFBDVFYiKTsKLQkJaXItPmdldF9rZXkgICA9IGdldF9rZXlfcGlubmFjbGU7Ci0JCWlyLT5pcl9jb2RlcyAgPSBpcl9jb2Rlc19waW5uYWNsZTsKKwkJaWYgKHBpbm5hY2xlX3JlbW90ZSA9PSAwKSB7CisJCQlpci0+Z2V0X2tleSAgID0gZ2V0X2tleV9waW5uYWNsZV9jb2xvcjsKKwkJCWlyLT5pcl9jb2RlcyA9IGlyX2NvZGVzX3Bpbm5hY2xlX2NvbG9yOworCQl9IGVsc2UgeworCQkJaXItPmdldF9rZXkgICA9IGdldF9rZXlfcGlubmFjbGVfZ3JleTsKKwkJCWlyLT5pcl9jb2RlcyA9IGlyX2NvZGVzX3Bpbm5hY2xlX2dyZXk7CisJCX0KIAkJYnJlYWs7CiAJY2FzZSBTQUE3MTM0X0JPQVJEX1VQTU9TVF9QVVJQTEVfVFY6CiAJCXNucHJpbnRmKGlyLT5jLm5hbWUsIHNpemVvZihpci0+Yy5uYW1lKSwgIlB1cnBsZSBUViIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LmgKaW5kZXggMzUzYWYzYS4uZDVlZTk5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC5oCkBAIC0zMyw2ICszMyw3IEBACiAKICNpbmNsdWRlIDxhc20vaW8uaD4KIAorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CiAjaW5jbHVkZSA8bWVkaWEvdHVuZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9pci1jb21tb24uaD4KICNpbmNsdWRlIDxtZWRpYS9pci1rYmQtaTJjLmg+CkBAIC0yMjEsNiArMjIyLDcgQEAKICNkZWZpbmUgU0FBNzEzNF9CT0FSRF9BVkVSTUVESUFfQTE2OV9CMSA5MgogI2RlZmluZSBTQUE3MTM0X0JPQVJEX01ENzEzNF9CUklER0VfMiAgICAgOTMKICNkZWZpbmUgU0FBNzEzNF9CT0FSRF9GTFlEVkJUX0hZQlJJRF9DQVJEQlVTIDk0CisjZGVmaW5lIFNBQTcxMzRfQk9BUkRfRkxZVklERU8zMDAwX05UU0MgOTUKIAogI2RlZmluZSBTQUE3MTM0X01BWEJPQVJEUyA4CiAjZGVmaW5lIFNBQTcxMzRfSU5QVVRfTUFYIDgKQEAgLTUzMSw2ICs1MzMsNyBAQAogCiAJLyogU0FBNzEzNF9NUEVHX0RWQiBvbmx5ICovCiAJc3RydWN0IHZpZGVvYnVmX2R2YiAgICAgICAgZHZiOworCWludCAoKm9yaWdpbmFsX2RlbW9kX3NsZWVwKShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSk7CiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zZTQwMS5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9zZTQwMS5oCmluZGV4IGE3YTIxNmIuLmMwODkxYjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2U0MDEuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NlNDAxLmgKQEAgLTQsNiArNCw3IEBACiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX2NvcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX2NvcmUuYwppbmRleCBlYTQzOTRkLi40OGQxMzhhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvc245YzEwMl9jb3JlLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zbjljMTAyL3NuOWMxMDJfY29yZS5jCkBAIC0yNjA4LDExICsyNjA4LDkgQEAKIAljYXNlIFZJRElPQ19HX0NUUkw6CiAJCXJldHVybiBzbjljMTAyX3ZpZGlvY19nX2N0cmwoY2FtLCBhcmcpOwogCi0JY2FzZSBWSURJT0NfU19DVFJMX09MRDoKIAljYXNlIFZJRElPQ19TX0NUUkw6CiAJCXJldHVybiBzbjljMTAyX3ZpZGlvY19zX2N0cmwoY2FtLCBhcmcpOwogCi0JY2FzZSBWSURJT0NfQ1JPUENBUF9PTEQ6CiAJY2FzZSBWSURJT0NfQ1JPUENBUDoKIAkJcmV0dXJuIHNuOWMxMDJfdmlkaW9jX2Nyb3BjYXAoY2FtLCBhcmcpOwogCkBAIC0yNjU5LDcgKzI2NTcsNiBAQAogCWNhc2UgVklESU9DX0dfUEFSTToKIAkJcmV0dXJuIHNuOWMxMDJfdmlkaW9jX2dfcGFybShjYW0sIGFyZyk7CiAKLQljYXNlIFZJRElPQ19TX1BBUk1fT0xEOgogCWNhc2UgVklESU9DX1NfUEFSTToKIAkJcmV0dXJuIHNuOWMxMDJfdmlkaW9jX3NfcGFybShjYW0sIGFyZyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc3RyYWRpcy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zdHJhZGlzLmMKaW5kZXggMDc0NzZjNy4uNmJlOWMxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zdHJhZGlzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zdHJhZGlzLmMKQEAgLTQyLDYgKzQyLDcgQEAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CiAKICNpbmNsdWRlICJzYWE3MTQ2LmgiCiAjaW5jbHVkZSAic2FhNzE0NnJlZy5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zdHY2ODAuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc3R2NjgwLmMKaW5kZXggYjM4YmRhOC4uMzUxYjE4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zdHY2ODAuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3N0djY4MC5jCkBAIC02Niw2ICs2Niw3IEBACiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGRhOTg3NS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby90ZGE5ODc1LmMKaW5kZXggMTAzY2NiOS4uODI3NjMzYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby90ZGE5ODc1LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby90ZGE5ODc1LmMKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLWFsZ28tYml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpAQCAtMTYzLDcgKzE2NCw3IEBACiAJc3RydWN0IHRkYTk4NzUgKnQgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKIAlkcHJpbnRrKCJJbiB0ZGE5ODc1X2luaXRcbiIpOwogCXRkYTk4NzVfd3JpdGUoY2xpZW50LCBUREE5ODc1X0NGRywgMHhkMCApOyAvKnJlZyBkZSBjb25maWcgMCAocmVzZXQpKi8KLSAgICAJdGRhOTg3NV93cml0ZShjbGllbnQsIFREQTk4NzVfTVNSLCAweDAzICk7ICAgIC8qIE1vbml0b3IgMGIwMDAwMFhYWCovCisJdGRhOTg3NV93cml0ZShjbGllbnQsIFREQTk4NzVfTVNSLCAweDAzICk7ICAgIC8qIE1vbml0b3IgMGIwMDAwMFhYWCovCiAJdGRhOTg3NV93cml0ZShjbGllbnQsIFREQTk4NzVfQzFNU0IsIDB4MDAgKTsgIC8qQ2FyMShGTSkgTVNCIFhNSHoqLwogCXRkYTk4NzVfd3JpdGUoY2xpZW50LCBUREE5ODc1X0MxTUlCLCAweDAwICk7ICAvKkNhcjEoRk0pIE1JQiBYTUh6Ki8KIAl0ZGE5ODc1X3dyaXRlKGNsaWVudCwgVERBOTg3NV9DMUxTQiwgMHgwMCApOyAgLypDYXIxKEZNKSBMU0IgWE1IeiovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3RkYTk4ODcuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGRhOTg4Ny5jCmluZGV4IDBkNTRmNmMuLmI2YWU5NjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGRhOTg4Ny5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGRhOTg4Ny5jCkBAIC0xOCw0OSArMTgsMjEgQEAKICAgIFREQTk4ODYgKFBBTCwgU0VDQU0sIE5UU0MpCiAgICBUREE5ODg3IChQQUwsIFNFQ0FNLCBOVFNDLCBGTSBSYWRpbykKIAotICAgZm91bmQgb246Ci0gICAtIFBpbm5hY2xlIFBDVFYgKEp1bC4yMDAyIFZlcnNpb24gd2l0aCBNVDIwMzIsIGJ0dHYpCi0gICAgICBUREE5ODg3ICh3b3JsZCksIFREQTk4ODUgKFVTQSkKLSAgICAgIE5vdGU6IE9QMiBvZiB0ZGE5ODh4IG11c3QgYmUgc2V0IHRvIDEsIGVsc2UgTVQyMDMyIGlzIGRpc2FibGVkIQotICAgLSBLTkMgT25lIFRWLVN0YXRpb24gUkRTIChzYWE3MTM0KQotICAgLSBIYXVwcGF1Z2UgUFZSLTE1MC81MDAgKHBvc3NpYmx5IG1vcmUpCisgICBVc2VkIGFzIHBhcnQgb2Ygc2V2ZXJhbCB0dW5lcnMKICovCiAKKyNkZWZpbmUgdGRhOTg4N19pbmZvKGZtdCwgYXJnLi4uKSBkbyB7XAorCXByaW50ayhLRVJOX0lORk8gIiVzICVkLSUwNHggKHRkYTk4ODcpOiAiIGZtdCwgdC0+aTJjLm5hbWUsIFwKKwkJCWkyY19hZGFwdGVyX2lkKHQtPmkyYy5hZGFwdGVyKSwgdC0+aTJjLmFkZHIgLCAjI2FyZyk7IH0gd2hpbGUgKDApCisjZGVmaW5lIHRkYTk4ODdfZGJnKGZtdCwgYXJnLi4uKSBkbyB7XAorCWlmICh0dW5lcl9kZWJ1ZykgXAorCQlwcmludGsoS0VSTl9JTkZPICIlcyAlZC0lMDR4ICh0ZGE5ODg3KTogIiBmbXQsIHQtPmkyYy5uYW1lLCBcCisJCQlpMmNfYWRhcHRlcl9pZCh0LT5pMmMuYWRhcHRlciksIHQtPmkyYy5hZGRyICwgIyNhcmcpOyB9IHdoaWxlICgwKQogCi0vKiBBZGRyZXNzZXMgdG8gc2NhbiAqLwotc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsKLQkweDg0ID4+MSwKLQkweDg2ID4+MSwKLQkweDk2ID4+MSwKLQlJMkNfQ0xJRU5UX0VORCwKLX07Ci1JMkNfQ0xJRU5UX0lOU01PRDsKLQotLyogaW5zbW9kIG9wdGlvbnMgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgZGVidWcgPSAwOwotbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDA2NDQpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKICNkZWZpbmUgVU5TRVQgICAgICAgKC0xVSkKLSNkZWZpbmUgdGRhOTg4N19pbmZvKGZtdCwgYXJnLi4uKSBkbyB7XAotCXByaW50ayhLRVJOX0lORk8gIiVzICVkLSUwNHg6ICIgZm10LCB0LT5jbGllbnQubmFtZSwgXAotCQkJaTJjX2FkYXB0ZXJfaWQodC0+Y2xpZW50LmFkYXB0ZXIpLCB0LT5jbGllbnQuYWRkciAsICMjYXJnKTsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgdGRhOTg4N19kYmcoZm10LCBhcmcuLi4pIGRvIHtcCi0JaWYgKGRlYnVnKSBcCi0JCXByaW50ayhLRVJOX0lORk8gIiVzICVkLSUwNHg6ICIgZm10LCB0LT5jbGllbnQubmFtZSwgXAotCQkJaTJjX2FkYXB0ZXJfaWQodC0+Y2xpZW50LmFkYXB0ZXIpLCB0LT5jbGllbnQuYWRkciAsICMjYXJnKTsgfSB3aGlsZSAoMCkKLQotc3RydWN0IHRkYTk4ODcgewotCXN0cnVjdCBpMmNfY2xpZW50ICBjbGllbnQ7Ci0JdjRsMl9zdGRfaWQgICAgICAgIHN0ZDsKLQllbnVtIHR1bmVyX21vZGUgICAgbW9kZTsKLQl1bnNpZ25lZCBpbnQgICAgICAgY29uZmlnOwotCXVuc2lnbmVkIGludCAgICAgICB1c2luZ192NGwyOwotCXVuc2lnbmVkIGludCAJICAgcmFkaW9fbW9kZTsKLQl1bnNpZ25lZCBjaGFyIAkgICBkYXRhWzRdOwotfTsKIAogc3RydWN0IHR2bm9ybSB7CiAJdjRsMl9zdGRfaWQgICAgICAgc3RkOwpAQCAtNzAsOSArNDIsNiBAQAogCXVuc2lnbmVkIGNoYXIgICAgIGU7CiB9OwogCi1zdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgZHJpdmVyOwotc3RhdGljIHN0cnVjdCBpMmNfY2xpZW50IGNsaWVudF90ZW1wbGF0ZTsKLQogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiAvLwpAQCAtMjgxLDcgKzI1MCw3IEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotc3RhdGljIHZvaWQgZHVtcF9yZWFkX21lc3NhZ2Uoc3RydWN0IHRkYTk4ODcgKnQsIHVuc2lnbmVkIGNoYXIgKmJ1ZikKK3N0YXRpYyB2b2lkIGR1bXBfcmVhZF9tZXNzYWdlKHN0cnVjdCB0dW5lciAqdCwgdW5zaWduZWQgY2hhciAqYnVmKQogewogCXN0YXRpYyBjaGFyICphZmNbMTZdID0gewogCQkiLSAxMi41IGtIeiIsCkBAIC0zMDksNyArMjc4LDcgQEAKIAl0ZGE5ODg3X2luZm8oIiAgdmZpIGxldmVsICAgICAgOiAlc1xuIiwgKGJ1ZlswXSAmIDB4ODApID8gImhpZ2giIDogImxvdyIpOwogfQogCi1zdGF0aWMgdm9pZCBkdW1wX3dyaXRlX21lc3NhZ2Uoc3RydWN0IHRkYTk4ODcgKnQsIHVuc2lnbmVkIGNoYXIgKmJ1ZikKK3N0YXRpYyB2b2lkIGR1bXBfd3JpdGVfbWVzc2FnZShzdHJ1Y3QgdHVuZXIgKnQsIHVuc2lnbmVkIGNoYXIgKmJ1ZikKIHsKIAlzdGF0aWMgY2hhciAqc291bmRbNF0gPSB7CiAJCSJBTS9UViIsCkBAIC00MDUsMTMgKzM3NCwxMyBAQAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyBpbnQgdGRhOTg4N19zZXRfdHZub3JtKHN0cnVjdCB0ZGE5ODg3ICp0LCBjaGFyICpidWYpCitzdGF0aWMgaW50IHRkYTk4ODdfc2V0X3R2bm9ybShzdHJ1Y3QgdHVuZXIgKnQsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgdHZub3JtICpub3JtID0gTlVMTDsKIAlpbnQgaTsKIAotCWlmICh0LT5tb2RlID09IFRfUkFESU8pIHsKLQkJaWYgKHQtPnJhZGlvX21vZGUgPT0gVjRMMl9UVU5FUl9NT0RFX01PTk8pCisJaWYgKHQtPm1vZGUgPT0gVjRMMl9UVU5FUl9SQURJTykgeworCQlpZiAodC0+YXVkbW9kZSA9PSBWNEwyX1RVTkVSX01PREVfTU9OTykKIAkJCW5vcm0gPSAmcmFkaW9fbW9ubzsKIAkJZWxzZQogCQkJbm9ybSA9ICZyYWRpb19zdGVyZW87CkBAIC00NDUsNyArNDE0LDcgQEAKIG1vZHVsZV9wYXJhbShxc3MsIGludCwgMDY0NCk7CiBtb2R1bGVfcGFyYW0oYWRqdXN0LCBpbnQsIDA2NDQpOwogCi1zdGF0aWMgaW50IHRkYTk4ODdfc2V0X2luc21vZChzdHJ1Y3QgdGRhOTg4NyAqdCwgY2hhciAqYnVmKQorc3RhdGljIGludCB0ZGE5ODg3X3NldF9pbnNtb2Qoc3RydWN0IHR1bmVyICp0LCBjaGFyICpidWYpCiB7CiAJaWYgKFVOU0VUICE9IHBvcnQxKSB7CiAJCWlmIChwb3J0MSkKQEAgLTQ3NCwyNyArNDQzLDI3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgdGRhOTg4N19zZXRfY29uZmlnKHN0cnVjdCB0ZGE5ODg3ICp0LCBjaGFyICpidWYpCitzdGF0aWMgaW50IHRkYTk4ODdfc2V0X2NvbmZpZyhzdHJ1Y3QgdHVuZXIgKnQsIGNoYXIgKmJ1ZikKIHsKLQlpZiAodC0+Y29uZmlnICYgVERBOTg4N19QT1JUMV9BQ1RJVkUpCisJaWYgKHQtPnRkYTk4ODdfY29uZmlnICYgVERBOTg4N19QT1JUMV9BQ1RJVkUpCiAJCWJ1ZlsxXSAmPSB+Y091dHB1dFBvcnQxSW5hY3RpdmU7Ci0JaWYgKHQtPmNvbmZpZyAmIFREQTk4ODdfUE9SVDFfSU5BQ1RJVkUpCisJaWYgKHQtPnRkYTk4ODdfY29uZmlnICYgVERBOTg4N19QT1JUMV9JTkFDVElWRSkKIAkJYnVmWzFdIHw9IGNPdXRwdXRQb3J0MUluYWN0aXZlOwotCWlmICh0LT5jb25maWcgJiBUREE5ODg3X1BPUlQyX0FDVElWRSkKKwlpZiAodC0+dGRhOTg4N19jb25maWcgJiBUREE5ODg3X1BPUlQyX0FDVElWRSkKIAkJYnVmWzFdICY9IH5jT3V0cHV0UG9ydDJJbmFjdGl2ZTsKLQlpZiAodC0+Y29uZmlnICYgVERBOTg4N19QT1JUMl9JTkFDVElWRSkKKwlpZiAodC0+dGRhOTg4N19jb25maWcgJiBUREE5ODg3X1BPUlQyX0lOQUNUSVZFKQogCQlidWZbMV0gfD0gY091dHB1dFBvcnQySW5hY3RpdmU7CiAKLQlpZiAodC0+Y29uZmlnICYgVERBOTg4N19RU1MpCisJaWYgKHQtPnRkYTk4ODdfY29uZmlnICYgVERBOTg4N19RU1MpCiAJCWJ1ZlsxXSB8PSBjUVNTOwotCWlmICh0LT5jb25maWcgJiBUREE5ODg3X0lOVEVSQ0FSUklFUikKKwlpZiAodC0+dGRhOTg4N19jb25maWcgJiBUREE5ODg3X0lOVEVSQ0FSUklFUikKIAkJYnVmWzFdICY9IH5jUVNTOwogCi0JaWYgKHQtPmNvbmZpZyAmIFREQTk4ODdfQVVUT01VVEUpCisJaWYgKHQtPnRkYTk4ODdfY29uZmlnICYgVERBOTg4N19BVVRPTVVURSkKIAkJYnVmWzFdIHw9IGNBdXRvTXV0ZUZtQWN0aXZlOwotCWlmICh0LT5jb25maWcgJiBUREE5ODg3X0RFRU1QSEFTSVNfTUFTSykgeworCWlmICh0LT50ZGE5ODg3X2NvbmZpZyAmIFREQTk4ODdfREVFTVBIQVNJU19NQVNLKSB7CiAJCWJ1ZlsyXSAmPSB+MHg2MDsKLQkJc3dpdGNoICh0LT5jb25maWcgJiBUREE5ODg3X0RFRU1QSEFTSVNfTUFTSykgeworCQlzd2l0Y2ggKHQtPnRkYTk4ODdfY29uZmlnICYgVERBOTg4N19ERUVNUEhBU0lTX01BU0spIHsKIAkJY2FzZSBUREE5ODg3X0RFRU1QSEFTSVNfTk9ORToKIAkJCWJ1ZlsyXSB8PSBjRGVlbXBoYXNpc09GRjsKIAkJCWJyZWFrOwpAQCAtNTA2LDE1MyArNDc1LDM2IEBACiAJCQlicmVhazsKIAkJfQogCX0KLQlpZiAodC0+Y29uZmlnICYgVERBOTg4N19UT1BfU0VUKSB7CisJaWYgKHQtPnRkYTk4ODdfY29uZmlnICYgVERBOTg4N19UT1BfU0VUKSB7CiAJCWJ1ZlsyXSAmPSB+Y1RvcE1hc2s7Ci0JCWJ1ZlsyXSB8PSAodC0+Y29uZmlnID4+IDgpICYgY1RvcE1hc2s7CisJCWJ1ZlsyXSB8PSAodC0+dGRhOTg4N19jb25maWcgPj4gOCkgJiBjVG9wTWFzazsKIAl9Ci0JaWYgKCh0LT5jb25maWcgJiBUREE5ODg3X0lOVEVSQ0FSUklFUl9OVFNDKSAmJiAodC0+c3RkICYgVjRMMl9TVERfTlRTQykpCisJaWYgKCh0LT50ZGE5ODg3X2NvbmZpZyAmIFREQTk4ODdfSU5URVJDQVJSSUVSX05UU0MpICYmICh0LT5zdGQgJiBWNEwyX1NURF9OVFNDKSkKIAkJYnVmWzFdICY9IH5jUVNTOwogCXJldHVybiAwOwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyBjaGFyIHBhbFtdID0gIi0tIjsKLXN0YXRpYyBjaGFyIHNlY2FtW10gPSAiLS0iOwotc3RhdGljIGNoYXIgbnRzY1tdID0gIi0iOwotCi1tb2R1bGVfcGFyYW1fc3RyaW5nKHBhbCwgcGFsLCBzaXplb2YocGFsKSwgMDY0NCk7Ci1tb2R1bGVfcGFyYW1fc3RyaW5nKHNlY2FtLCBzZWNhbSwgc2l6ZW9mKHNlY2FtKSwgMDY0NCk7Ci1tb2R1bGVfcGFyYW1fc3RyaW5nKG50c2MsIG50c2MsIHNpemVvZihudHNjKSwgMDY0NCk7Ci0KLXN0YXRpYyBpbnQgdGRhOTg4N19maXh1cF9zdGQoc3RydWN0IHRkYTk4ODcgKnQpCi17Ci0JLyogZ2V0IG1vcmUgcHJlY2lzZSBub3JtIGluZm8gZnJvbSBpbnNtb2Qgb3B0aW9uICovCi0JaWYgKCh0LT5zdGQgJiBWNEwyX1NURF9QQUwpID09IFY0TDJfU1REX1BBTCkgewotCQlzd2l0Y2ggKHBhbFswXSkgewotCQljYXNlICdiJzoKLQkJY2FzZSAnQic6Ci0JCWNhc2UgJ2cnOgotCQljYXNlICdHJzoKLQkJY2FzZSAnaCc6Ci0JCWNhc2UgJ0gnOgotCQljYXNlICduJzoKLQkJY2FzZSAnTic6Ci0JCQlpZiAocGFsWzFdID09ICdjJyB8fCBwYWxbMV0gPT0gJ0MnKSB7Ci0JCQkJdGRhOTg4N19kYmcoImluc21vZCBmaXh1cDogUEFMID0+IFBBTC1OY1xuIik7Ci0JCQkJdC0+c3RkID0gVjRMMl9TVERfUEFMX05jOwotCQkJfSBlbHNlIHsKLQkJCQl0ZGE5ODg3X2RiZygiaW5zbW9kIGZpeHVwOiBQQUwgPT4gUEFMLUJHSE5cbiIpOwotCQkJCXQtPnN0ZCA9IFY0TDJfU1REX1BBTF9CRyB8IFY0TDJfU1REX1BBTF9IIHwgVjRMMl9TVERfUEFMX047Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSAnaSc6Ci0JCWNhc2UgJ0knOgotCQkJdGRhOTg4N19kYmcoImluc21vZCBmaXh1cDogUEFMID0+IFBBTC1JXG4iKTsKLQkJCXQtPnN0ZCA9IFY0TDJfU1REX1BBTF9JOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ2QnOgotCQljYXNlICdEJzoKLQkJY2FzZSAnayc6Ci0JCWNhc2UgJ0snOgotCQkJdGRhOTg4N19kYmcoImluc21vZCBmaXh1cDogUEFMID0+IFBBTC1ES1xuIik7Ci0JCQl0LT5zdGQgPSBWNEwyX1NURF9QQUxfREs7Ci0JCQlicmVhazsKLQkJY2FzZSAnbSc6Ci0JCWNhc2UgJ00nOgotCQkJdGRhOTg4N19kYmcoImluc21vZCBmaXh1cDogUEFMID0+IFBBTC1NXG4iKTsKLQkJCXQtPnN0ZCA9IFY0TDJfU1REX1BBTF9NOwotCQkJYnJlYWs7Ci0JCWNhc2UgJy0nOgotCQkJLyogZGVmYXVsdCBwYXJhbWV0ZXIsIGRvIG5vdGhpbmcgKi8KLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJdGRhOTg4N19pbmZvKCJwYWw9IGFyZ3VtZW50IG5vdCByZWNvZ25pc2VkXG4iKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWlmICgodC0+c3RkICYgVjRMMl9TVERfU0VDQU0pID09IFY0TDJfU1REX1NFQ0FNKSB7Ci0JCXN3aXRjaCAoc2VjYW1bMF0pIHsKLQkJY2FzZSAnYic6Ci0JCWNhc2UgJ0InOgotCQljYXNlICdnJzoKLQkJY2FzZSAnRyc6Ci0JCWNhc2UgJ2gnOgotCQljYXNlICdIJzoKLQkJCXRkYTk4ODdfZGJnKCJpbnNtb2QgZml4dXA6IFNFQ0FNID0+IFNFQ0FNLUJHSFxuIik7Ci0JCQl0LT5zdGQgPSBWNEwyX1NURF9TRUNBTV9CIHwgVjRMMl9TVERfU0VDQU1fRyB8IFY0TDJfU1REX1NFQ0FNX0g7Ci0JCQlicmVhazsKLQkJY2FzZSAnZCc6Ci0JCWNhc2UgJ0QnOgotCQljYXNlICdrJzoKLQkJY2FzZSAnSyc6Ci0JCQl0ZGE5ODg3X2RiZygiaW5zbW9kIGZpeHVwOiBTRUNBTSA9PiBTRUNBTS1ES1xuIik7Ci0JCQl0LT5zdGQgPSBWNEwyX1NURF9TRUNBTV9ESzsKLQkJCWJyZWFrOwotCQljYXNlICdsJzoKLQkJY2FzZSAnTCc6Ci0JCQlpZiAoc2VjYW1bMV0gPT0gJ2MnIHx8IHNlY2FtWzFdID09ICdDJykgewotCQkJCXRkYTk4ODdfZGJnKCJpbnNtb2QgZml4dXA6IFNFQ0FNID0+IFNFQ0FNLUwnXG4iKTsKLQkJCQl0LT5zdGQgPSBWNEwyX1NURF9TRUNBTV9MQzsKLQkJCX0gZWxzZSB7Ci0JCQkJdGRhOTg4N19kYmcoImluc21vZCBmaXh1cDogU0VDQU0gPT4gU0VDQU0tTFxuIik7Ci0JCQkJdC0+c3RkID0gVjRMMl9TVERfU0VDQU1fTDsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlICctJzoKLQkJCS8qIGRlZmF1bHQgcGFyYW1ldGVyLCBkbyBub3RoaW5nICovCi0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXRkYTk4ODdfaW5mbygic2VjYW09IGFyZ3VtZW50IG5vdCByZWNvZ25pc2VkXG4iKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWlmICgodC0+c3RkICYgVjRMMl9TVERfTlRTQykgPT0gVjRMMl9TVERfTlRTQykgewotCQlzd2l0Y2ggKG50c2NbMF0pIHsKLQkJY2FzZSAnbSc6Ci0JCWNhc2UgJ00nOgotCQkJdGRhOTg4N19kYmcoImluc21vZCBmaXh1cDogTlRTQyA9PiBOVFNDLU1cbiIpOwotCQkJdC0+c3RkID0gVjRMMl9TVERfTlRTQ19NOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ2onOgotCQljYXNlICdKJzoKLQkJCXRkYTk4ODdfZGJnKCJpbnNtb2QgZml4dXA6IE5UU0MgPT4gTlRTQ19NX0pQXG4iKTsKLQkJCXQtPnN0ZCA9IFY0TDJfU1REX05UU0NfTV9KUDsKLQkJCWJyZWFrOwotCQljYXNlICdrJzoKLQkJY2FzZSAnSyc6Ci0JCQl0ZGE5ODg3X2RiZygiaW5zbW9kIGZpeHVwOiBOVFNDID0+IE5UU0NfTV9LUlxuIik7Ci0JCQl0LT5zdGQgPSBWNEwyX1NURF9OVFNDX01fS1I7Ci0JCQlicmVhazsKLQkJY2FzZSAnLSc6Ci0JCQkvKiBkZWZhdWx0IHBhcmFtZXRlciwgZG8gbm90aGluZyAqLwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQl0ZGE5ODg3X2luZm8oIm50c2M9IGFyZ3VtZW50IG5vdCByZWNvZ25pc2VkXG4iKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHRkYTk4ODdfc3RhdHVzKHN0cnVjdCB0ZGE5ODg3ICp0KQorc3RhdGljIGludCB0ZGE5ODg3X3N0YXR1cyhzdHJ1Y3QgdHVuZXIgKnQpCiB7CiAJdW5zaWduZWQgY2hhciBidWZbMV07CiAJaW50IHJjOwogCiAJbWVtc2V0KGJ1ZiwwLHNpemVvZihidWYpKTsKLQlpZiAoMSAhPSAocmMgPSBpMmNfbWFzdGVyX3JlY3YoJnQtPmNsaWVudCxidWYsMSkpKQorCWlmICgxICE9IChyYyA9IGkyY19tYXN0ZXJfcmVjdigmdC0+aTJjLGJ1ZiwxKSkpCiAJCXRkYTk4ODdfaW5mbygiaTJjIGkvbyBlcnJvcjogcmMgPT0gJWQgKHNob3VsZCBiZSAxKVxuIixyYyk7CiAJZHVtcF9yZWFkX21lc3NhZ2UodCwgYnVmKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB0ZGE5ODg3X2NvbmZpZ3VyZShzdHJ1Y3QgdGRhOTg4NyAqdCkKK3N0YXRpYyB2b2lkIHRkYTk4ODdfY29uZmlndXJlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7CisJc3RydWN0IHR1bmVyICp0ID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAJaW50IHJjOwogCi0JbWVtc2V0KHQtPmRhdGEsMCxzaXplb2YodC0+ZGF0YSkpOwotCXRkYTk4ODdfc2V0X3R2bm9ybSh0LHQtPmRhdGEpOworCW1lbXNldCh0LT50ZGE5ODg3X2RhdGEsMCxzaXplb2YodC0+dGRhOTg4N19kYXRhKSk7CisJdGRhOTg4N19zZXRfdHZub3JtKHQsdC0+dGRhOTg4N19kYXRhKTsKIAogCS8qIEEgbm90ZSBvbiB0aGUgcG9ydCBzZXR0aW5nczoKIAkgICBUaGVzZSBzZXR0aW5ncyB0ZW5kIHRvIGRlcGVuZCBvbiB0aGUgc3BlY2lmaWNzIG9mIHRoZSBib2FyZC4KQEAgLTY2NywyNDkgKzUxOSw4NCBAQAogCSAgIHRoZSBwb3J0cyBzaG91bGQgYmUgc2V0IHRvIGFjdGl2ZSAoMCksIGJ1dCwgYWdhaW4sIHRoYXQgbWF5CiAJICAgZGlmZmVyIGRlcGVuZGluZyBvbiB0aGUgcHJlY2lzZSBoYXJkd2FyZSBjb25maWd1cmF0aW9uLgogCSAqLwotCXQtPmRhdGFbMV0gfD0gY091dHB1dFBvcnQxSW5hY3RpdmU7Ci0JdC0+ZGF0YVsxXSB8PSBjT3V0cHV0UG9ydDJJbmFjdGl2ZTsKKwl0LT50ZGE5ODg3X2RhdGFbMV0gfD0gY091dHB1dFBvcnQxSW5hY3RpdmU7CisJdC0+dGRhOTg4N19kYXRhWzFdIHw9IGNPdXRwdXRQb3J0MkluYWN0aXZlOwogCi0JdGRhOTg4N19zZXRfY29uZmlnKHQsdC0+ZGF0YSk7Ci0JdGRhOTg4N19zZXRfaW5zbW9kKHQsdC0+ZGF0YSk7CisJdGRhOTg4N19zZXRfY29uZmlnKHQsdC0+dGRhOTg4N19kYXRhKTsKKwl0ZGE5ODg3X3NldF9pbnNtb2QodCx0LT50ZGE5ODg3X2RhdGEpOwogCiAJaWYgKHQtPm1vZGUgPT0gVF9TVEFOREJZKSB7Ci0JCXQtPmRhdGFbMV0gfD0gY0ZvcmNlZE11dGVBdWRpb09OOworCQl0LT50ZGE5ODg3X2RhdGFbMV0gfD0gY0ZvcmNlZE11dGVBdWRpb09OOwogCX0KIAogCXRkYTk4ODdfZGJnKCJ3cml0aW5nOiBiPTB4JTAyeCBjPTB4JTAyeCBlPTB4JTAyeFxuIiwKLQkJdC0+ZGF0YVsxXSx0LT5kYXRhWzJdLHQtPmRhdGFbM10pOwotCWlmIChkZWJ1ZyA+IDEpCi0JCWR1bXBfd3JpdGVfbWVzc2FnZSh0LCB0LT5kYXRhKTsKKwkJdC0+dGRhOTg4N19kYXRhWzFdLHQtPnRkYTk4ODdfZGF0YVsyXSx0LT50ZGE5ODg3X2RhdGFbM10pOworCWlmICh0dW5lcl9kZWJ1ZyA+IDEpCisJCWR1bXBfd3JpdGVfbWVzc2FnZSh0LCB0LT50ZGE5ODg3X2RhdGEpOwogCi0JaWYgKDQgIT0gKHJjID0gaTJjX21hc3Rlcl9zZW5kKCZ0LT5jbGllbnQsdC0+ZGF0YSw0KSkpCisJaWYgKDQgIT0gKHJjID0gaTJjX21hc3Rlcl9zZW5kKCZ0LT5pMmMsdC0+dGRhOTg4N19kYXRhLDQpKSkKIAkJdGRhOTg4N19pbmZvKCJpMmMgaS9vIGVycm9yOiByYyA9PSAlZCAoc2hvdWxkIGJlIDQpXG4iLHJjKTsKIAotCWlmIChkZWJ1ZyA+IDIpIHsKKwlpZiAodHVuZXJfZGVidWcgPiAyKSB7CiAJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKDEwMDApOwogCQl0ZGE5ODg3X3N0YXR1cyh0KTsKIAl9Ci0JcmV0dXJuIDA7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotc3RhdGljIGludCB0ZGE5ODg3X2F0dGFjaChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsIGludCBhZGRyLCBpbnQga2luZCkKK3N0YXRpYyB2b2lkIHRkYTk4ODdfdHVuZXJfc3RhdHVzKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7Ci0Jc3RydWN0IHRkYTk4ODcgKnQ7CisJc3RydWN0IHR1bmVyICp0ID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJdGRhOTg4N19pbmZvKCJEYXRhIGJ5dGVzOiBiPTB4JTAyeCBjPTB4JTAyeCBlPTB4JTAyeFxuIiwgdC0+dGRhOTg4N19kYXRhWzFdLCB0LT50ZGE5ODg3X2RhdGFbMl0sIHQtPnRkYTk4ODdfZGF0YVszXSk7Cit9CiAKLQljbGllbnRfdGVtcGxhdGUuYWRhcHRlciA9IGFkYXA7Ci0JY2xpZW50X3RlbXBsYXRlLmFkZHIgICAgPSBhZGRyOworc3RhdGljIGludCB0ZGE5ODg3X2dldF9hZmMoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgdHVuZXIgKnQgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdGF0aWMgaW50IEFGQ19CSVRTXzJfa0h6W10gPSB7CisJCS0xMjUwMCwgIC0zNzUwMCwgIC02MjUwMCwgIC05NzUwMCwKKwkJLTExMjUwMCwgLTEzNzUwMCwgLTE2MjUwMCwgLTE4NzUwMCwKKwkJMTg3NTAwLCAgMTYyNTAwLCAgMTM3NTAwLCAgMTEyNTAwLAorCQk5NzUwMCAsICA2MjUwMCwgICAzNzUwMCAsICAxMjUwMAorCX07CisJaW50IGFmYz0wOworCV9fdTggcmVnID0gMDsKIAotCWlmIChOVUxMID09ICh0ID0ga3phbGxvYyhzaXplb2YoKnQpLCBHRlBfS0VSTkVMKSkpCi0JCXJldHVybiAtRU5PTUVNOworCWlmICgxID09IGkyY19tYXN0ZXJfcmVjdigmdC0+aTJjLCZyZWcsMSkpCisJCWFmYyA9IEFGQ19CSVRTXzJfa0h6WyhyZWc+PjEpJjB4MGZdOwogCi0JdC0+Y2xpZW50ICAgICAgPSBjbGllbnRfdGVtcGxhdGU7Ci0JdC0+c3RkICAgICAgICAgPSAwOwotCXQtPnJhZGlvX21vZGUgPSBWNEwyX1RVTkVSX01PREVfU1RFUkVPOworCXJldHVybiBhZmM7Cit9CiAKLQl0ZGE5ODg3X2luZm8oImNoaXAgZm91bmQgQCAweCV4ICglcylcbiIsIGFkZHI8PDEsIGFkYXAtPm5hbWUpOworc3RhdGljIHZvaWQgdGRhOTg4N19zdGFuZGJ5KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJdGRhOTg4N19jb25maWd1cmUoY2xpZW50KTsKK30KIAotCWkyY19zZXRfY2xpZW50ZGF0YSgmdC0+Y2xpZW50LCB0KTsKLQlpMmNfYXR0YWNoX2NsaWVudCgmdC0+Y2xpZW50KTsKK3N0YXRpYyB2b2lkIHRkYTk4ODdfc2V0X2ZyZXEoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdW5zaWduZWQgaW50IGZyZXEpCit7CisJdGRhOTg4N19jb25maWd1cmUoY2xpZW50KTsKK30KKworaW50IHRkYTk4ODdfdHVuZXJfaW5pdChzdHJ1Y3QgaTJjX2NsaWVudCAqYykKK3sKKwlzdHJ1Y3QgdHVuZXIgKnQgPSBpMmNfZ2V0X2NsaWVudGRhdGEoYyk7CisKKwlzdHJsY3B5KGMtPm5hbWUsICJ0ZGE5ODg3Iiwgc2l6ZW9mKGMtPm5hbWUpKTsKKworCXRkYTk4ODdfaW5mbygidGRhOTg4WzUvNi83XSBmb3VuZCBAIDB4JXggKCVzKVxuIiwgdC0+aTJjLmFkZHIsCisJCQkJCQl0LT5pMmMuZHJpdmVyLT5kcml2ZXIubmFtZSk7CisKKwl0LT5zZXRfdHZfZnJlcSA9IHRkYTk4ODdfc2V0X2ZyZXE7CisJdC0+c2V0X3JhZGlvX2ZyZXEgPSB0ZGE5ODg3X3NldF9mcmVxOworCXQtPnN0YW5kYnkgPSB0ZGE5ODg3X3N0YW5kYnk7CisJdC0+dHVuZXJfc3RhdHVzPXRkYTk4ODdfdHVuZXJfc3RhdHVzOworCXQtPmdldF9hZmM9dGRhOTg4N19nZXRfYWZjOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgdGRhOTg4N19wcm9iZShzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCi17Ci0JaWYgKGFkYXAtPmNsYXNzICYgSTJDX0NMQVNTX1RWX0FOQUxPRykKLQkJcmV0dXJuIGkyY19wcm9iZShhZGFwLCAmYWRkcl9kYXRhLCB0ZGE5ODg3X2F0dGFjaCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdGRhOTg4N19kZXRhY2goc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQlzdHJ1Y3QgdGRhOTg4NyAqdCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwotCi0JaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KTsKLQlrZnJlZSh0KTsKLQlyZXR1cm4gMDsKLX0KLQotI2RlZmluZSBTV0lUQ0hfVjRMMglpZiAoIXQtPnVzaW5nX3Y0bDIgJiYgZGVidWcpIFwKLQkJCSAgdGRhOTg4N19pbmZvKCJzd2l0Y2hpbmcgdG8gdjRsMlxuIik7IFwKLQkJCSAgdC0+dXNpbmdfdjRsMiA9IDE7Ci0jZGVmaW5lIENIRUNLX1Y0TDIJaWYgKHQtPnVzaW5nX3Y0bDIpIHsgaWYgKGRlYnVnKSBcCi0JCQkgIHRkYTk4ODdfaW5mbygiaWdub3JlIHY0bDEgY2FsbFxuIik7IFwKLQkJCSAgcmV0dXJuIDA7IH0KLQotc3RhdGljIGludAotdGRhOTg4N19jb21tYW5kKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKLXsKLQlzdHJ1Y3QgdGRhOTg4NyAqdCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwotCi0Jc3dpdGNoIChjbWQpIHsKLQotCS8qIC0tLSBjb25maWd1cmF0aW9uIC0tLSAqLwotCWNhc2UgQVVEQ19TRVRfUkFESU86Ci0JewotCQl0LT5tb2RlID0gVF9SQURJTzsKLQkJdGRhOTg4N19jb25maWd1cmUodCk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIFRVTkVSX1NFVF9TVEFOREJZOgotCXsKLQkJdC0+bW9kZSA9IFRfU1RBTkRCWTsKLQkJdGRhOTg4N19jb25maWd1cmUodCk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIFREQTk4ODdfU0VUX0NPTkZJRzoKLQl7Ci0JCWludCAqaSA9IGFyZzsKLQotCQl0LT5jb25maWcgPSAqaTsKLQkJdGRhOTg4N19jb25maWd1cmUodCk7Ci0JCWJyZWFrOwotCX0KLQkvKiAtLS0gdjRsIGlvY3RscyAtLS0gKi8KLQkvKiB0YWtlIGNhcmU6IGJ0dHYgZG9lcyB1c2Vyc3BhY2UgY29weWluZywgd2UnbGwgZ2V0IGEKLQkgICBrZXJuZWwgcG9pbnRlciBoZXJlLi4uICovCi0JY2FzZSBWSURJT0NTQ0hBTjoKLQl7Ci0JCXN0YXRpYyBjb25zdCB2NGwyX3N0ZF9pZCBtYXBbXSA9IHsKLQkJCVsgVklERU9fTU9ERV9QQUwgICBdID0gVjRMMl9TVERfUEFMLAotCQkJWyBWSURFT19NT0RFX05UU0MgIF0gPSBWNEwyX1NURF9OVFNDX00sCi0JCQlbIFZJREVPX01PREVfU0VDQU0gXSA9IFY0TDJfU1REX1NFQ0FNLAotCQkJWyA0IC8qIGJ0dHYgKi8gICAgIF0gPSBWNEwyX1NURF9QQUxfTSwKLQkJCVsgNSAvKiBidHR2ICovICAgICBdID0gVjRMMl9TVERfUEFMX04sCi0JCQlbIDYgLyogYnR0diAqLyAgICAgXSA9IFY0TDJfU1REX05UU0NfTV9KUCwKLQkJfTsKLQkJc3RydWN0IHZpZGVvX2NoYW5uZWwgKnZjID0gYXJnOwotCi0JCUNIRUNLX1Y0TDI7Ci0JCXQtPm1vZGUgPSBUX0FOQUxPR19UVjsKLQkJaWYgKHZjLT5ub3JtIDwgQVJSQVlfU0laRShtYXApKQotCQkJdC0+c3RkID0gbWFwW3ZjLT5ub3JtXTsKLQkJdGRhOTg4N19maXh1cF9zdGQodCk7Ci0JCXRkYTk4ODdfY29uZmlndXJlKHQpOwotCQlicmVhazsKLQl9Ci0JY2FzZSBWSURJT0NfU19TVEQ6Ci0JewotCQl2NGwyX3N0ZF9pZCAqaWQgPSBhcmc7Ci0KLQkJU1dJVENIX1Y0TDI7Ci0JCXQtPm1vZGUgPSBUX0FOQUxPR19UVjsKLQkJdC0+c3RkICAgPSAqaWQ7Ci0JCXRkYTk4ODdfZml4dXBfc3RkKHQpOwotCQl0ZGE5ODg3X2NvbmZpZ3VyZSh0KTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgVklESU9DX1NfRlJFUVVFTkNZOgotCXsKLQkJc3RydWN0IHY0bDJfZnJlcXVlbmN5ICpmID0gYXJnOwotCi0JCVNXSVRDSF9WNEwyOwotCQlpZiAoVjRMMl9UVU5FUl9BTkFMT0dfVFYgPT0gZi0+dHlwZSkgewotCQkJaWYgKHQtPm1vZGUgPT0gVF9BTkFMT0dfVFYpCi0JCQkJcmV0dXJuIDA7Ci0JCQl0LT5tb2RlID0gVF9BTkFMT0dfVFY7Ci0JCX0KLQkJaWYgKFY0TDJfVFVORVJfUkFESU8gPT0gZi0+dHlwZSkgewotCQkJaWYgKHQtPm1vZGUgPT0gVF9SQURJTykKLQkJCQlyZXR1cm4gMDsKLQkJCXQtPm1vZGUgPSBUX1JBRElPOwotCQl9Ci0JCXRkYTk4ODdfY29uZmlndXJlKHQpOwotCQlicmVhazsKLQl9Ci0JY2FzZSBWSURJT0NfR19UVU5FUjoKLQl7Ci0JCXN0YXRpYyBpbnQgQUZDX0JJVFNfMl9rSHpbXSA9IHsKLQkJCS0xMjUwMCwgIC0zNzUwMCwgIC02MjUwMCwgIC05NzUwMCwKLQkJCS0xMTI1MDAsIC0xMzc1MDAsIC0xNjI1MDAsIC0xODc1MDAsCi0JCQkxODc1MDAsICAxNjI1MDAsICAxMzc1MDAsICAxMTI1MDAsCi0JCQk5NzUwMCAsICA2MjUwMCwgICAzNzUwMCAsICAxMjUwMAotCQl9OwotCQlzdHJ1Y3QgdjRsMl90dW5lciogdHVuZXIgPSBhcmc7Ci0KLQkJaWYgKHQtPm1vZGUgPT0gVF9SQURJTykgewotCQkJX191OCByZWcgPSAwOwotCQkJdHVuZXItPmFmYz0wOwotCQkJaWYgKDEgPT0gaTJjX21hc3Rlcl9yZWN2KCZ0LT5jbGllbnQsJnJlZywxKSkKLQkJCQl0dW5lci0+YWZjID0gQUZDX0JJVFNfMl9rSHpbKHJlZz4+MSkmMHgwZl07Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCWNhc2UgVklESU9DX1NfVFVORVI6Ci0JewotCQlzdHJ1Y3QgdjRsMl90dW5lciogdHVuZXIgPSBhcmc7Ci0KLQkJaWYgKHQtPm1vZGUgPT0gVF9SQURJTykgewotCQkJdC0+cmFkaW9fbW9kZSA9IHR1bmVyLT5hdWRtb2RlOwotCQkJdGRhOTg4N19jb25maWd1cmUgKHQpOwotCQl9Ci0JCWJyZWFrOwotCX0KLQljYXNlIFZJRElPQ19MT0dfU1RBVFVTOgotCXsKLQkJdGRhOTg4N19pbmZvKCJEYXRhIGJ5dGVzOiBiPTB4JTAyeCBjPTB4JTAyeCBlPTB4JTAyeFxuIiwgdC0+ZGF0YVsxXSwgdC0+ZGF0YVsyXSwgdC0+ZGF0YVszXSk7Ci0JCWJyZWFrOwotCX0KLQlkZWZhdWx0OgotCQkvKiBub3RoaW5nICovCi0JCWJyZWFrOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB0ZGE5ODg3X3N1c3BlbmQoc3RydWN0IGRldmljZSAqIGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQotewotCXN0cnVjdCBpMmNfY2xpZW50ICpjID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IGkyY19jbGllbnQsIGRldik7Ci0Jc3RydWN0IHRkYTk4ODcgKnQgPSBpMmNfZ2V0X2NsaWVudGRhdGEoYyk7Ci0KLQl0ZGE5ODg3X2RiZygic3VzcGVuZFxuIik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdGRhOTg4N19yZXN1bWUoc3RydWN0IGRldmljZSAqIGRldikKLXsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqYyA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBpMmNfY2xpZW50LCBkZXYpOwotCXN0cnVjdCB0ZGE5ODg3ICp0ID0gaTJjX2dldF9jbGllbnRkYXRhKGMpOwotCi0JdGRhOTg4N19kYmcoInJlc3VtZVxuIik7Ci0JdGRhOTg4N19jb25maWd1cmUodCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLXN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBkcml2ZXIgPSB7Ci0JLmlkICAgICAgICAgICAgID0gSTJDX0RSSVZFUklEX1REQTk4ODcsCi0JLmF0dGFjaF9hZGFwdGVyID0gdGRhOTg4N19wcm9iZSwKLQkuZGV0YWNoX2NsaWVudCAgPSB0ZGE5ODg3X2RldGFjaCwKLQkuY29tbWFuZCAgICAgICAgPSB0ZGE5ODg3X2NvbW1hbmQsCi0JLmRyaXZlciA9IHsKLQkJLm5hbWUgICAgPSAidGRhOTg4NyIsCi0JCS5zdXNwZW5kID0gdGRhOTg4N19zdXNwZW5kLAotCQkucmVzdW1lICA9IHRkYTk4ODdfcmVzdW1lLAotCX0sCi19Owotc3RhdGljIHN0cnVjdCBpMmNfY2xpZW50IGNsaWVudF90ZW1wbGF0ZSA9Ci17Ci0JLm5hbWUgICAgICA9ICJ0ZGE5ODg3IiwKLQkuZHJpdmVyICAgID0gJmRyaXZlciwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IHRkYTk4ODdfaW5pdF9tb2R1bGUodm9pZCkKLXsKLQlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJmRyaXZlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCB0ZGE5ODg3X2NsZWFudXBfbW9kdWxlKHZvaWQpCi17Ci0JaTJjX2RlbF9kcml2ZXIoJmRyaXZlcik7Ci19Ci0KLW1vZHVsZV9pbml0KHRkYTk4ODdfaW5pdF9tb2R1bGUpOwotbW9kdWxlX2V4aXQodGRhOTg4N19jbGVhbnVwX21vZHVsZSk7Ci0KIC8qCiAgKiBPdmVycmlkZXMgZm9yIEVtYWNzIHNvIHRoYXQgd2UgZm9sbG93IExpbnVzJ3MgdGFiYmluZyBzdHlsZS4KICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby90ZWE1NzY3LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3RlYTU3NjcuYwppbmRleCBjMmI5OGY4Li5kMWM0MTc4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3RlYTU3NjcuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3RlYTU3NjcuYwpAQCAtMyw3ICszLDcgQEAKICAqIEkyQyBhZGRyZXNzIGlzIGFsbHdheXMgMHhDMC4KICAqCiAgKgotICogQ29weXJpZ2h0IChjKSAyMDA1IE1hdXJvIENhcnZhbGhvIENoZWhhYiAobWNoZWhhYkBicnR1cmJvLmNvbS5icikKKyAqIENvcHlyaWdodCAoYykgMjAwNSBNYXVybyBDYXJ2YWxobyBDaGVoYWIgKG1jaGVoYWJAaW5mcmFkZWFkLm9yZykKICAqIFRoaXMgY29kZSBpcyBwbGFjZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICoKICAqIHRlYTU3NjcgYXV0b2RldGVjdGlvbiB0aGFua3MgdG8gVG9yc3RlbiBTZWVib3RoIGFuZCBBdHN1c2hpIE5ha2FnYXdhCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3RsdjMyMGFpYzIzYi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby90bHYzMjBhaWMyM2IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmIyZTk2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby90bHYzMjBhaWMyM2IuYwpAQCAtMCwwICsxLDIxNyBAQAorLyoKKyAqIHRsdjMyMGFpYzIzYiAtIGRyaXZlciB2ZXJzaW9uIDAuMC4xCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2IFNjb3R0IEFsZnRlciA8c2FsZnRlckBzc2FpLnVzPgorICoKKyAqIEJhc2VkIG9uIHdtODc3NSBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgVWxmIEVrbHVuZCA8aXZ0diBhdCBla2x1bmQudG8+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgSGFucyBWZXJrdWlsIDxodmVya3VpbEB4czRhbGwubmw+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy1pZC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KKworTU9EVUxFX0RFU0NSSVBUSU9OKCJ0bHYzMjBhaWMyM2IgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJTY290dCBBbGZ0ZXIsIFVsZiBFa2x1bmQsIEhhbnMgVmVya3VpbCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyAweDM0ID4+IDEsIEkyQ19DTElFTlRfRU5EIH07CisKKworSTJDX0NMSUVOVF9JTlNNT0Q7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0cnVjdCB0bHYzMjBhaWMyM2Jfc3RhdGUgeworCXU4IG11dGVkOworfTsKKworc3RhdGljIGludCB0bHYzMjBhaWMyM2Jfd3JpdGUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IHJlZywgdTE2IHZhbCkKK3sKKwlpbnQgaTsKKworCWlmICgocmVnIDwgMCB8fCByZWcgPiA5KSAmJiAocmVnICE9IDE1KSkgeworCQl2NGxfZXJyKGNsaWVudCwgIkludmFsaWQgcmVnaXN0ZXIgUiVkXG4iLCByZWcpOworCQlyZXR1cm4gLTE7CisJfQorCisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQlpZiAoaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIChyZWcgPDwgMSkgfAorCQkJCQkodmFsID4+IDgpLCB2YWwgJiAweGZmKSA9PSAwKSB7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwl2NGxfZXJyKGNsaWVudCwgIkkyQzogY2Fubm90IHdyaXRlICUwM3ggdG8gcmVnaXN0ZXIgUiVkXG4iLCB2YWwsIHJlZyk7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IHRsdjMyMGFpYzIzYl9jb21tYW5kKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHVuc2lnbmVkIGludCBjbWQsCisJCQkgIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgdGx2MzIwYWljMjNiX3N0YXRlICpzdGF0ZSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwgPSBhcmc7CisJdTMyKiBmcmVxID0gYXJnOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFZJRElPQ19JTlRfQVVESU9fQ0xPQ0tfRlJFUToKKwkJc3dpdGNoICgqZnJlcSkgeworCQkJY2FzZSAzMjAwMDogLyogc2V0IHNhbXBsZSByYXRlIHRvIDMyIGtIeiAqLworCQkJCXRsdjMyMGFpYzIzYl93cml0ZShjbGllbnQsIDgsIDB4MDE4KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgNDQxMDA6IC8qIHNldCBzYW1wbGUgcmF0ZSB0byA0NC4xIGtIeiAqLworCQkJCXRsdjMyMGFpYzIzYl93cml0ZShjbGllbnQsIDgsIDB4MDIyKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgNDgwMDA6IC8qIHNldCBzYW1wbGUgcmF0ZSB0byA0OCBrSHogKi8KKwkJCQl0bHYzMjBhaWMyM2Jfd3JpdGUoY2xpZW50LCA4LCAweDAwMCk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWJyZWFrOworCisJY2FzZSBWSURJT0NfR19DVFJMOgorCQlpZiAoY3RybC0+aWQgIT0gVjRMMl9DSURfQVVESU9fTVVURSkKKwkJCXJldHVybiAtRUlOVkFMOworCQljdHJsLT52YWx1ZSA9IHN0YXRlLT5tdXRlZDsKKwkJYnJlYWs7CisKKwljYXNlIFZJRElPQ19TX0NUUkw6CisJCWlmIChjdHJsLT5pZCAhPSBWNEwyX0NJRF9BVURJT19NVVRFKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXN0YXRlLT5tdXRlZCA9IGN0cmwtPnZhbHVlOworCQl0bHYzMjBhaWMyM2Jfd3JpdGUoY2xpZW50LCAwLCAweDE4MCk7IC8qIG11dGUgYm90aCBjaGFubmVscyAqLworCQkvKiBzZXQgZ2FpbiBvbiBib3RoIGNoYW5uZWxzIHRvICszLjAgZEIgKi8KKwkJaWYgKCFzdGF0ZS0+bXV0ZWQpCisJCQl0bHYzMjBhaWMyM2Jfd3JpdGUoY2xpZW50LCAwLCAweDExOSk7CisJCWJyZWFrOworCisJY2FzZSBWSURJT0NfTE9HX1NUQVRVUzoKKwkJdjRsX2luZm8oY2xpZW50LCAiSW5wdXQ6ICVzXG4iLAorCQkJICAgIHN0YXRlLT5tdXRlZCA/ICJtdXRlZCIgOiAiYWN0aXZlIik7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBpMmMgaW1wbGVtZW50YXRpb24gKi8KKworLyoKKyAqIEdlbmVyaWMgaTJjIHByb2JlCisgKiBjb25jZXJuaW5nIHRoZSBhZGRyZXNzZXM6IGkyYyB3YW50cyA3IGJpdCAod2l0aG91dCB0aGUgci93IGJpdCksIHNvICc+PjEnCisgKi8KKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGkyY19kcml2ZXI7CisKK3N0YXRpYyBpbnQgdGx2MzIwYWljMjNiX2F0dGFjaChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLCBpbnQga2luZCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworCXN0cnVjdCB0bHYzMjBhaWMyM2Jfc3RhdGUgKnN0YXRlOworCisJLyogQ2hlY2sgaWYgdGhlIGFkYXB0ZXIgc3VwcG9ydHMgdGhlIG5lZWRlZCBmZWF0dXJlcyAqLworCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBKSkKKwkJcmV0dXJuIDA7CisKKwljbGllbnQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaTJjX2NsaWVudCksIEdGUF9LRVJORUwpOworCWlmIChjbGllbnQgPT0gMCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljbGllbnQtPmFkZHIgPSBhZGRyZXNzOworCWNsaWVudC0+YWRhcHRlciA9IGFkYXB0ZXI7CisJY2xpZW50LT5kcml2ZXIgPSAmaTJjX2RyaXZlcjsKKwlzbnByaW50ZihjbGllbnQtPm5hbWUsIHNpemVvZihjbGllbnQtPm5hbWUpIC0gMSwgInRsdjMyMGFpYzIzYiIpOworCisJdjRsX2luZm8oY2xpZW50LCAiY2hpcCBmb3VuZCBAIDB4JXggKCVzKVxuIiwgYWRkcmVzcyA8PCAxLCBhZGFwdGVyLT5uYW1lKTsKKworCXN0YXRlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHRsdjMyMGFpYzIzYl9zdGF0ZSksIEdGUF9LRVJORUwpOworCWlmIChzdGF0ZSA9PSBOVUxMKSB7CisJCWtmcmVlKGNsaWVudCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlzdGF0ZS0+bXV0ZWQgPSAwOworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIHN0YXRlKTsKKworCS8qIGluaXRpYWxpemUgdGx2MzIwYWljMjNiICovCisJdGx2MzIwYWljMjNiX3dyaXRlKGNsaWVudCwgMTUsIDB4MDAwKTsJLyogUkVTRVQgKi8KKwl0bHYzMjBhaWMyM2Jfd3JpdGUoY2xpZW50LCA2LCAweDAwQSk7ICAgLyogdHVybiBvZmYgREFDICYgbWljIGlucHV0ICovCisJdGx2MzIwYWljMjNiX3dyaXRlKGNsaWVudCwgNywgMHgwNDkpOyAgIC8qIGxlZnQtanVzdGlmaWVkLCAyNC1iaXQsIG1hc3RlciBtb2RlICovCisJdGx2MzIwYWljMjNiX3dyaXRlKGNsaWVudCwgMCwgMHgxMTkpOyAgIC8qIHNldCBnYWluIG9uIGJvdGggY2hhbm5lbHMgdG8gKzMuMCBkQiAqLworCXRsdjMyMGFpYzIzYl93cml0ZShjbGllbnQsIDgsIDB4MDAwKTsgICAvKiBzZXQgc2FtcGxlIHJhdGUgdG8gNDgga0h6ICovCisJdGx2MzIwYWljMjNiX3dyaXRlKGNsaWVudCwgOSwgMHgwMDEpOyAgIC8qIGFjdGl2YXRlIGRpZ2l0YWwgaW50ZXJmYWNlICovCisKKwlpMmNfYXR0YWNoX2NsaWVudChjbGllbnQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGx2MzIwYWljMjNiX3Byb2JlKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpZiAoYWRhcHRlci0+Y2xhc3MgJiBJMkNfQ0xBU1NfVFZfQU5BTE9HKQorCQlyZXR1cm4gaTJjX3Byb2JlKGFkYXB0ZXIsICZhZGRyX2RhdGEsIHRsdjMyMGFpYzIzYl9hdHRhY2gpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRsdjMyMGFpYzIzYl9kZXRhY2goc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlpbnQgZXJyOworCisJZXJyID0gaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KTsKKwlpZiAoZXJyKSB7CisJCXJldHVybiBlcnI7CisJfQorCWtmcmVlKGNsaWVudCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogaTJjIGltcGxlbWVudGF0aW9uICovCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgaTJjX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJ0bHYzMjBhaWMyM2IiLAorCX0sCisJLmlkICAgICAgICAgICAgID0gSTJDX0RSSVZFUklEX1RMVjMyMEFJQzIzQiwKKwkuYXR0YWNoX2FkYXB0ZXIgPSB0bHYzMjBhaWMyM2JfcHJvYmUsCisJLmRldGFjaF9jbGllbnQgID0gdGx2MzIwYWljMjNiX2RldGFjaCwKKwkuY29tbWFuZCAgICAgICAgPSB0bHYzMjBhaWMyM2JfY29tbWFuZCwKK307CisKKworc3RhdGljIGludCBfX2luaXQgdGx2MzIwYWljMjNiX2luaXRfbW9kdWxlKHZvaWQpCit7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZpMmNfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHRsdjMyMGFpYzIzYl9jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZpMmNfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQodGx2MzIwYWljMjNiX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KHRsdjMyMGFpYzIzYl9jbGVhbnVwX21vZHVsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3R1bmVyLTMwMzYuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHVuZXItMzAzNi5jCmluZGV4IDc0YWI0OGMuLmJkZjUwNmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHVuZXItMzAzNi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHVuZXItMzAzNi5jCkBAIC0yNSw2ICsyNSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CiAKICNpbmNsdWRlIDxtZWRpYS90dW5lci5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3R1bmVyLWNvcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHVuZXItY29yZS5jCmluZGV4IDEwMTNiNGQuLmEyNmRlZDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHVuZXItY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHVuZXItY29yZS5jCkBAIC0xOTksNyArMTk5LDcgQEAKIAkJaTJjX21hc3Rlcl9zZW5kKGMsIGJ1ZmZlciwgNCk7CiAJCWRlZmF1bHRfdHVuZXJfaW5pdChjKTsKIAkJYnJlYWs7Ci0JY2FzZSBUVU5FUl9MR19URFZTX0gwNjJGOgorCWNhc2UgVFVORVJfTEdfVERWU19IMDZYRjoKIAkJLyogU2V0IHRoZSBBdXhpbGlhcnkgQnl0ZS4gKi8KIAkJYnVmZmVyWzJdICY9IH4weDIwOwogCQlidWZmZXJbMl0gfD0gMHgxODsKQEAgLTIxNSw2ICsyMTUsOSBAQAogCQlpMmNfbWFzdGVyX3NlbmQoYyxidWZmZXIsNCk7CiAJCWRlZmF1bHRfdHVuZXJfaW5pdChjKTsKIAkJYnJlYWs7CisJY2FzZSBUVU5FUl9UREE5ODg3OgorCQl0ZGE5ODg3X3R1bmVyX2luaXQoYyk7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWRlZmF1bHRfdHVuZXJfaW5pdChjKTsKIAkJYnJlYWs7CkBAIC0yNDEsNiArMjQ0LDggQEAKIHsKIAlzdHJ1Y3QgdHVuZXIgKnQgPSBpMmNfZ2V0X2NsaWVudGRhdGEoYyk7CiAKKwl0dW5lcl9kYmcoInNldCBhZGRyIGZvciB0eXBlICVpXG4iLCB0LT50eXBlKTsKKwogCWlmICggdC0+dHlwZSA9PSBVTlNFVCAmJiAoKHR1bl9zZXR1cC0+YWRkciA9PSBBRERSX1VOU0VUICYmCiAJCSh0LT5tb2RlX21hc2sgJiB0dW5fc2V0dXAtPm1vZGVfbWFzaykpIHx8CiAJCXR1bl9zZXR1cC0+YWRkciA9PSBjLT5hZGRyKSkgewpAQCAtNDM2LDYgKzQ0MSw3IEBACiAJdC0+cmFkaW9faWYyID0gMTA3MDAgKiAxMDAwOwkvKiAxMC43TUh6IC0gRk0gcmFkaW8gKi8KIAl0LT5hdWRtb2RlID0gVjRMMl9UVU5FUl9NT0RFX1NURVJFTzsKIAl0LT5tb2RlX21hc2sgPSBUX1VOSU5JVElBTElaRUQ7CisJdC0+dHVuZXJfc3RhdHVzID0gdHVuZXJfc3RhdHVzOwogCWlmICh0dW5lcl9kZWJ1Z19vbGQpIHsKIAkJdHVuZXJfZGVidWcgPSB0dW5lcl9kZWJ1Z19vbGQ7CiAJCXByaW50ayhLRVJOX0VSUiAidHVuZXI6IHR1bmVyX2RlYnVnIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiAyLjYuMTcuXG4iKTsKQEAgLTQ2MiwxMCArNDY4LDE0IEBACiAJCWNhc2UgMHg0YjoKIAkJCS8qIElmIGNoaXAgaXMgbm90IHRkYTgyOTAsIGRvbid0IHJlZ2lzdGVyLgogCQkJICAgc2luY2UgaXQgY2FuIGJlIHRkYTk4ODcqLwotCQkJaWYgKHRkYTgyOTBfcHJvYmUoJnQtPmkyYykgIT0gMCkgewotCQkJCXR1bmVyX2RiZygiY2hpcCBhdCBhZGRyICV4IGlzIG5vdCBhIHRkYTgyOTBcbiIsIGFkZHIpOwotCQkJCWtmcmVlKHQpOwotCQkJCXJldHVybiAwOworCQkJaWYgKHRkYTgyOTBfcHJvYmUoJnQtPmkyYykgPT0gMCkgeworCQkJCXR1bmVyX2RiZygiY2hpcCBhdCBhZGRyICV4IGlzIGEgdGRhODI5MFxuIiwgYWRkcik7CisJCQl9IGVsc2UgeworCQkJCS8qIERlZmF1bHQgaXMgYmVpbmcgdGRhOTg4NyAqLworCQkJCXQtPnR5cGUgPSBUVU5FUl9UREE5ODg3OworCQkJCXQtPm1vZGVfbWFzayA9IFRfUkFESU8gfCBUX0FOQUxPR19UViB8IFRfRElHSVRBTF9UVjsKKwkJCQl0LT5tb2RlID0gVF9TVEFOREJZOworCQkJCWdvdG8gcmVnaXN0ZXJfY2xpZW50OwogCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgMHg2MDoKQEAgLTU5Miw2ICs2MDIsNyBAQAogCWNhc2UgVFVORVJfU0VUX1NUQU5EQlk6CiAJCWlmIChjaGVja19tb2RlKHQsICJUVU5FUl9TRVRfU1RBTkRCWSIpID09IEVJTlZBTCkKIAkJCXJldHVybiAwOworCQl0LT5tb2RlID0gVF9TVEFOREJZOwogCQlpZiAodC0+c3RhbmRieSkKIAkJCXQtPnN0YW5kYnkgKGNsaWVudCk7CiAJCWJyZWFrOwpAQCAtNjA0LDYgKzYxNSwxNCBAQAogCQkvKiBTaG91bGQgYmUgaW1wbGVtZW50ZWQsIHNpbmNlIGJ0dHYgY2FsbHMgaXQgKi8KIAkJdHVuZXJfZGJnKCJWSURJT0NTQVVESU8gbm90IGltcGxlbWVudGVkLlxuIik7CiAJCWJyZWFrOworCWNhc2UgVERBOTg4N19TRVRfQ09ORklHOgorCXsKKwkJaW50ICppID0gYXJnOworCisJCXQtPnRkYTk4ODdfY29uZmlnID0gKmk7CisJCXNldF9mcmVxKGNsaWVudCwgdC0+dHZfZnJlcSk7CisJCWJyZWFrOworCX0KIAkvKiAtLS0gdjRsIGlvY3RscyAtLS0gKi8KIAkvKiB0YWtlIGNhcmU6IGJ0dHYgZG9lcyB1c2Vyc3BhY2UgY29weWluZywgd2UnbGwgZ2V0IGEKIAkgICBrZXJuZWwgcG9pbnRlciBoZXJlLi4uICovCkBAIC03MTEsMTQgKzczMCwxMCBAQAogCQl7CiAJCQlzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgKmYgPSBhcmc7CiAKKwkJCWlmIChzZXRfbW9kZSAoY2xpZW50LCB0LCBmLT50eXBlLCAiVklESU9DX1NfRlJFUVVFTkNZIikKKwkJCQkJPT0gRUlOVkFMKQorCQkJCXJldHVybiAwOwogCQkJc3dpdGNoX3Y0bDIoKTsKLQkJCWlmICgoVjRMMl9UVU5FUl9SQURJTyA9PSBmLT50eXBlICYmIFY0TDJfVFVORVJfUkFESU8gIT0gdC0+bW9kZSkKLQkJCQl8fCAoVjRMMl9UVU5FUl9ESUdJVEFMX1RWID09IGYtPnR5cGUKLQkJCQkJJiYgVjRMMl9UVU5FUl9ESUdJVEFMX1RWICE9IHQtPm1vZGUpKSB7Ci0JCQkJaWYgKHNldF9tb2RlIChjbGllbnQsIHQsIGYtPnR5cGUsICJWSURJT0NfU19GUkVRVUVOQ1kiKQotCQkJCQkgICAgPT0gRUlOVkFMKQotCQkJCQlyZXR1cm4gMDsKLQkJCX0KIAkJCXNldF9mcmVxKGNsaWVudCxmLT5mcmVxdWVuY3kpOwogCiAJCQlicmVhazsKQEAgLTc0NCw2ICs3NTksOCBAQAogCQkJc3dpdGNoX3Y0bDIoKTsKIAogCQkJdHVuZXItPnR5cGUgPSB0LT5tb2RlOworCQkJaWYgKHQtPmdldF9hZmMpCisJCQkJdHVuZXItPmFmYz10LT5nZXRfYWZjKGNsaWVudCk7CiAJCQlpZiAodC0+bW9kZSA9PSBWNEwyX1RVTkVSX0FOQUxPR19UVikKIAkJCQl0dW5lci0+Y2FwYWJpbGl0eSB8PSBWNEwyX1RVTkVSX0NBUF9OT1JNOwogCQkJaWYgKHQtPm1vZGUgIT0gVjRMMl9UVU5FUl9SQURJTykgewpAQCAtNzg3LDcgKzgwNCw4IEBACiAJCQlicmVhazsKIAkJfQogCWNhc2UgVklESU9DX0xPR19TVEFUVVM6Ci0JCXR1bmVyX3N0YXR1cyhjbGllbnQpOworCQlpZiAodC0+dHVuZXJfc3RhdHVzKQorCQkJdC0+dHVuZXJfc3RhdHVzKGNsaWVudCk7CiAJCWJyZWFrOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby90dW5lci1zaW1wbGUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHVuZXItc2ltcGxlLmMKaW5kZXggNWQ3YWJlZC4uNmRhNmY4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby90dW5lci1zaW1wbGUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3R1bmVyLXNpbXBsZS5jCkBAIC0xMDUsNyArMTA1LDcgQEAKIAogCXN3aXRjaCAodC0+dHlwZSkgewogCQljYXNlIFRVTkVSX1BISUxJUFNfRk0xMjE2TUVfTUszOgotICAgIAkJY2FzZSBUVU5FUl9QSElMSVBTX0ZNMTIzNl9NSzM6CisJCWNhc2UgVFVORVJfUEhJTElQU19GTTEyMzZfTUszOgogCQljYXNlIFRVTkVSX1BISUxJUFNfRk0xMjU2X0lIMzoKIAkJCXN0ZXJlbyA9ICgoc3RhdHVzICYgVFVORVJfU0lHTkFMKSA9PSBUVU5FUl9TVEVSRU9fTUszKTsKIAkJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby90dW5lci10eXBlcy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby90dW5lci10eXBlcy5jCmluZGV4IGExYWUwMzYuLjlkOTIyNmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHVuZXItdHlwZXMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3R1bmVyLXR5cGVzLmMKQEAgLTg3NCw3ICs4NzQsNyBAQAogfTsKIAogCi0vKiAtLS0tLS0tLS0tLS0gVFVORVJfTEdfVERWU19IMDYyRiAtIElORklORU9OIEFUU0MgLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0gVFVORVJfTEdfVERWU19IMDZYRiAtIExHIElOTk9URUsgLyBJTkZJTkVPTiBBVFNDIC0tLS0tICovCiAKIHN0YXRpYyBzdHJ1Y3QgdHVuZXJfcmFuZ2UgdHVuZXJfdHVhNjAzNF9udHNjX3Jhbmdlc1tdID0gewogCXsgMTYgKiAxNjUuMDAgLypNSHoqLywgMHg4ZSwgMHgwMSB9LApAQCAtODgzLDcgKzg4Myw3IEBACiB9OwogCiAKLXN0YXRpYyBzdHJ1Y3QgdHVuZXJfcGFyYW1zIHR1bmVyX3R1YTYwMzRfcGFyYW1zW10gPSB7CitzdGF0aWMgc3RydWN0IHR1bmVyX3BhcmFtcyB0dW5lcl9sZ190ZHZzX2gwNnhmX3BhcmFtc1tdID0gewogCXsKIAkJLnR5cGUgICA9IFRVTkVSX1BBUkFNX1RZUEVfTlRTQywKIAkJLnJhbmdlcyA9IHR1bmVyX3R1YTYwMzRfbnRzY19yYW5nZXMsCkBAIC0xMDI0LDYgKzEwMjQsMjIgQEAKIAl9LAogfTsKIAorLyogLS0tLS0tLS0tLS0tIFRVTkVSX1NBTVNVTkdfVENQR182MTIxUDMwQSAtIFNhbXN1bmcgUEFMIC0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3RydWN0IHR1bmVyX3JhbmdlIHR1bmVyX3NhbXN1bmdfdGNwZ182MTIxcDMwYV9wYWxfcmFuZ2VzW10gPSB7CisJeyAxNiAqIDE0Ni4yNSAvKk1IeiovLCAweGNlLCAweDAxLCB9LAorCXsgMTYgKiA0MjguNTAgLypNSHoqLywgMHhjZSwgMHgwMiwgfSwKKwl7IDE2ICogOTk5Ljk5ICAgICAgICAsIDB4Y2UsIDB4MDgsIH0sCit9OworCitzdGF0aWMgc3RydWN0IHR1bmVyX3BhcmFtcyB0dW5lcl9zYW1zdW5nX3RjcGdfNjEyMXAzMGFfcGFyYW1zW10gPSB7CisJeworCQkudHlwZSAgID0gVFVORVJfUEFSQU1fVFlQRV9QQUwsCisJCS5yYW5nZXMgPSB0dW5lcl9zYW1zdW5nX3RjcGdfNjEyMXAzMGFfcGFsX3JhbmdlcywKKwkJLmNvdW50ICA9IEFSUkFZX1NJWkUodHVuZXJfc2Ftc3VuZ190Y3BnXzYxMjFwMzBhX3BhbF9yYW5nZXMpLAorCX0sCit9OworCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogc3RydWN0IHR1bmVydHlwZSB0dW5lcnNbXSA9IHsKQEAgLTEzNTQsMTAgKzEzNzAsMTAgQEAKIAkJLnBhcmFtcyA9IHR1bmVyX3BoaWxpcHNfZm1kMTIxNm1lX21rM19wYXJhbXMsCiAJCS5jb3VudCAgPSBBUlJBWV9TSVpFKHR1bmVyX3BoaWxpcHNfZm1kMTIxNm1lX21rM19wYXJhbXMpLAogCX0sCi0JW1RVTkVSX0xHX1REVlNfSDA2MkZdID0geyAvKiBMR0lOTk9URUsgQVRTQyAqLwotCQkubmFtZSAgID0gIkxHIFREVlMtSDA2MkYvVFVBNjAzNCIsCi0JCS5wYXJhbXMgPSB0dW5lcl90dWE2MDM0X3BhcmFtcywKLQkJLmNvdW50ICA9IEFSUkFZX1NJWkUodHVuZXJfdHVhNjAzNF9wYXJhbXMpLAorCVtUVU5FUl9MR19URFZTX0gwNlhGXSA9IHsgLyogTEdJTk5PVEVLIEFUU0MgKi8KKwkJLm5hbWUgICA9ICJMRyBURFZTLUgwNnhGIiwgLyogSDA2MUYsIEgwNjJGICYgSDA2NEYgKi8KKwkJLnBhcmFtcyA9IHR1bmVyX2xnX3RkdnNfaDA2eGZfcGFyYW1zLAorCQkuY291bnQgID0gQVJSQVlfU0laRSh0dW5lcl9sZ190ZHZzX2gwNnhmX3BhcmFtcyksCiAJfSwKIAlbVFVORVJfWU1FQ19UVkY2NlQ1X0JfREZGXSA9IHsgLyogUGhpbGlwcyBQQUwgKi8KIAkJLm5hbWUgICA9ICJZbWVjIFRWRjY2VDUtQi9ERkYiLApAQCAtMTQwMCw2ICsxNDE2LDE2IEBACiAJCS5wYXJhbXMgPSB0dW5lcl90aG9tc29uX2ZlNjYwMF9wYXJhbXMsCiAJCS5jb3VudCAgPSBBUlJBWV9TSVpFKHR1bmVyX3Rob21zb25fZmU2NjAwX3BhcmFtcyksCiAJfSwKKwlbVFVORVJfU0FNU1VOR19UQ1BHXzYxMjFQMzBBXSA9IHsgLyogU2Ftc3VuZyBQQUwgKi8KKwkJLm5hbWUgICA9ICJTYW1zdW5nIFRDUEcgNjEyMVAzMEEiLAorCQkucGFyYW1zID0gdHVuZXJfc2Ftc3VuZ190Y3BnXzYxMjFwMzBhX3BhcmFtcywKKwkJLmNvdW50ICA9IEFSUkFZX1NJWkUodHVuZXJfc2Ftc3VuZ190Y3BnXzYxMjFwMzBhX3BhcmFtcyksCisJfSwKKwlbVFVORVJfVERBOTg4N10gPSB7IC8qIFBoaWxpcHMgVERBIDk4ODcgSUYgUExMIERlbW9kdWxhdG9yLgorCQkJCVRoaXMgY2hpcCBpcyBwYXJ0IG9mIHNvbWUgbW9kZXJuIHR1bmVycyAqLworCQkubmFtZSAgID0gIlBoaWxpcHMgVERBOTg4WzUsNiw3XSBJRiBQTEwgRGVtb2R1bGF0b3IiLAorCQkvKiBzZWUgdGRhOTg4Ny5jIGZvciBkZXRhaWxzICovCisJfSwKIH07CiAKIHVuc2lnbmVkIGNvbnN0IGludCB0dW5lcl9jb3VudCA9IEFSUkFZX1NJWkUodHVuZXJzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHZlZXByb20uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHZlZXByb20uYwppbmRleCBiNDYzZTk5Li4zMGY4ZDgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3R2ZWVwcm9tLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby90dmVlcHJvbS5jCkBAIC0yMDAsNyArMjAwLDcgQEAKIAl7IFRVTkVSX0FCU0VOVCwgICAgICAgICJQaGlsaXBzIEZRMTI4NkEgTUs0In0sCiAJeyBUVU5FUl9BQlNFTlQsICAgICAgICAiUGhpbGlwcyBGUTEyMTZNRSBNSzUifSwKIAl7IFRVTkVSX0FCU0VOVCwgICAgICAgICJQaGlsaXBzIEZRMTIzNiBNSzUifSwKLQl7IFRVTkVSX0FCU0VOVCwgICAgICAgICJTYW1zdW5nIFRDUEdfNjEyMVAzMEEifSwKKwl7IFRVTkVSX1NBTVNVTkdfVENQR182MTIxUDMwQSwgIlNhbXN1bmcgVENQRyA2MTIxUDMwQSJ9LAogCXsgVFVORVJfVENMXzIwMDJNQiwgICAgIlRDTCAyMDAyTUJfM0gifSwKIAl7IFRVTkVSX0FCU0VOVCwgICAgICAgICJUQ0wgMjAwMk1JXzNIIn0sCiAJeyBUVU5FUl9UQ0xfMjAwMk4sICAgICAiVENMIDIwMDJOIDVIIn0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3R2bWl4ZXIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHZtaXhlci5jCmluZGV4IDllODZjYWUuLjE2NTQ1NzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHZtaXhlci5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHZtaXhlci5jCkBAIC0xOTgsMTAgKzE5OCw2IEBACiAKIAkvKiBsb2NrIGJ0dHYgaW4gbWVtb3J5IHdoaWxlIHRoZSBtaXhlciBpcyBpbiB1c2UgICovCiAJZmlsZS0+cHJpdmF0ZV9kYXRhID0gbWl4OwotI2lmbmRlZiBJMkNfUEVDCi0JaWYgKGNsaWVudC0+YWRhcHRlci0+aW5jX3VzZSkKLQkJY2xpZW50LT5hZGFwdGVyLT5pbmNfdXNlKGNsaWVudC0+YWRhcHRlcik7Ci0jZW5kaWYKIAlpZiAoY2xpZW50LT5hZGFwdGVyLT5vd25lcikKIAkJdHJ5X21vZHVsZV9nZXQoY2xpZW50LT5hZGFwdGVyLT5vd25lcik7CiAJcmV0dXJuIDA7CkBAIC0yMTcsMTAgKzIxMyw2IEBACiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotI2lmbmRlZiBJMkNfUEVDCi0JaWYgKGNsaWVudC0+YWRhcHRlci0+ZGVjX3VzZSkKLQkJY2xpZW50LT5hZGFwdGVyLT5kZWNfdXNlKGNsaWVudC0+YWRhcHRlcik7Ci0jZW5kaWYKIAlpZiAoY2xpZW50LT5hZGFwdGVyLT5vd25lcikKIAkJbW9kdWxlX3B1dChjbGllbnQtPmFkYXB0ZXItPm93bmVyKTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHZwNTE1MC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby90dnA1MTUwLmMKaW5kZXggZGFiNDk3My4uYjE2N2ZmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby90dnA1MTUwLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby90dnA1MTUwLmMKQEAgLTEwLDYgKzEwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvX2RlY29kZXIuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgorI2luY2x1ZGUgPG1lZGlhL3R2cDUxNTAuaD4KIAogI2luY2x1ZGUgInR2cDUxNTBfcmVnLmgiCiAKQEAgLTg5LDcgKzkwLDcgQEAKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OwogCiAJdjRsMl9zdGRfaWQgbm9ybTsJLyogQ3VycmVudCBzZXQgc3RhbmRhcmQgKi8KLQlpbnQgaW5wdXQ7CisJc3RydWN0IHY0bDJfcm91dGluZyByb3V0ZTsKIAlpbnQgZW5hYmxlOwogCWludCBicmlnaHQ7CiAJaW50IGNvbnRyYXN0OwpAQCAtMjgzLDI5ICsyODQsMjYgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAJCQlCYXNpYyBmdW5jdGlvbnMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZW51bSB0dnA1MTUwX2lucHV0IHsKLQlUVlA1MTUwX0FOQUxPR19DSDAgPSAwLAotCVRWUDUxNTBfU1ZJREVPID0gMSwKLQlUVlA1MTUwX0FOQUxPR19DSDEgPSAyLAotCVRWUDUxNTBfQkxBQ0tfU0NSRUVOID0gOAotfTsKIAotc3RhdGljIGlubGluZSB2b2lkIHR2cDUxNTBfc2VsbXV4KHN0cnVjdCBpMmNfY2xpZW50ICpjLAotCQkJCSAgZW51bSB0dnA1MTUwX2lucHV0IGlucHV0KQorc3RhdGljIGlubGluZSB2b2lkIHR2cDUxNTBfc2VsbXV4KHN0cnVjdCBpMmNfY2xpZW50ICpjKQogewogCWludCBvcG1vZGU9MDsKLQogCXN0cnVjdCB0dnA1MTUwICpkZWNvZGVyID0gaTJjX2dldF9jbGllbnRkYXRhKGMpOworCWludCBpbnB1dCA9IDA7CiAKLQlpZiAoIWRlY29kZXItPmVuYWJsZSkKLQkJaW5wdXQgfD0gVFZQNTE1MF9CTEFDS19TQ1JFRU47CisJaWYgKChkZWNvZGVyLT5yb3V0ZS5vdXRwdXQgJiBUVlA1MTUwX0JMQUNLX1NDUkVFTikgfHwgIWRlY29kZXItPmVuYWJsZSkKKwkJaW5wdXQgPSA4OwogCiAJc3dpdGNoIChpbnB1dCkgewotCWNhc2UgVFZQNTE1MF9BTkFMT0dfQ0gwOgotCWNhc2UgVFZQNTE1MF9BTkFMT0dfQ0gxOgorCWNhc2UgVFZQNTE1MF9DT01QT1NJVEUxOgorCQlpbnB1dCB8PSAyOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIFRWUDUxNTBfQ09NUE9TSVRFMDoKIAkJb3Btb2RlPTB4MzA7CQkvKiBUViBNb2RlICovCiAJCWJyZWFrOworCWNhc2UgVFZQNTE1MF9TVklERU86CiAJZGVmYXVsdDoKKwkJaW5wdXQgfD0gMTsKIAkJb3Btb2RlPTA7CQkvKiBBdXRvIE1vZGUgKi8KIAkJYnJlYWs7CiAJfQpAQCAtNzkwLDcgKzc4OCw3IEBACiAJdHZwNTE1MF92ZHBfaW5pdChjLCB2YmlfcmFtX2RlZmF1bHQpOwogCiAJLyogU2VsZWN0cyBkZWNvZGVyIGlucHV0ICovCi0JdHZwNTE1MF9zZWxtdXgoYywgZGVjb2Rlci0+aW5wdXQpOworCXR2cDUxNTBfc2VsbXV4KGMpOwogCiAJLyogSW5pdGlhbGl6ZXMgVFZQNTE1MCB0byBzdHJlYW0gZW5hYmxlZCB2YWx1ZXMgKi8KIAl0dnA1MTUwX3dyaXRlX2luaXR0YWIoYywgdHZwNTE1MF9pbml0X2VuYWJsZSk7CkBAIC04NjAsNiArODU4LDIxIEBACiAJY2FzZSBWSURJT0NfSU5UX1JFU0VUOgogCQl0dnA1MTUwX3Jlc2V0KGMpOwogCQlicmVhazsKKwljYXNlIFZJRElPQ19JTlRfR19WSURFT19ST1VUSU5HOgorCXsKKwkJc3RydWN0IHY0bDJfcm91dGluZyAqcm91dGUgPSBhcmc7CisKKwkJKnJvdXRlID0gZGVjb2Rlci0+cm91dGU7CisJCWJyZWFrOworCX0KKwljYXNlIFZJRElPQ19JTlRfU19WSURFT19ST1VUSU5HOgorCXsKKwkJc3RydWN0IHY0bDJfcm91dGluZyAqcm91dGUgPSBhcmc7CisKKwkJZGVjb2Rlci0+cm91dGUgPSAqcm91dGU7CisJCXR2cDUxNTBfc2VsbXV4KGMpOworCQlicmVhazsKKwl9CiAJY2FzZSBWSURJT0NfU19TVEQ6CiAJCWlmIChkZWNvZGVyLT5ub3JtID09ICoodjRsMl9zdGRfaWQgKilhcmcpCiAJCQlicmVhazsKQEAgLTEwNjMsNyArMTA3Niw3IEBACiAJcnYgPSBpMmNfYXR0YWNoX2NsaWVudChjKTsKIAogCWNvcmUtPm5vcm0gPSBWNEwyX1NURF9BTEw7CS8qIERlZmF1bHQgaXMgYXV0b2RldGVjdCAqLwotCWNvcmUtPmlucHV0ID0gMjsKKwljb3JlLT5yb3V0ZS5pbnB1dCA9IFRWUDUxNTBfQ09NUE9TSVRFMTsKIAljb3JlLT5lbmFibGUgPSAxOwogCWNvcmUtPmJyaWdodCA9IDMyNzY4OwogCWNvcmUtPmNvbnRyYXN0ID0gMzI3Njg7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpZGVvL0tjb25maWcgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpZGVvL0tjb25maWcKaW5kZXggMzkyNjlhMi4uNTlmYjg5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aWRlby9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlkZW8vS2NvbmZpZwpAQCAtMzYsMyArMzYsMTUgQEAKIAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQga29uaWNhd2MuCisKK2NvbmZpZyBVU0JfUVVJQ0tDQU1fTUVTU0VOR0VSCisJdHJpc3RhdGUgIlVTQiBMb2dpdGVjaCBRdWlja2NhbSBNZXNzZW5nZXIiCisJZGVwZW5kcyBvbiBVU0IgJiYgVklERU9fREVWCisJc2VsZWN0IFZJREVPX1VTQlZJREVPCisJLS0taGVscC0tLQorCSAgU2F5IFkgb3IgTSBoZXJlIHRvIGVuYWJsZSBzdXBwb3J0IGZvciB0aGUgVVNCIExvZ2l0ZWNoIFF1aWNrY2FtCisJICBNZXNzZW5nZXIgd2ViY2FtLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBxdWlja2NhbV9tZXNzZW5nZXIuCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlkZW8vTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpZGVvL01ha2VmaWxlCmluZGV4IGJiNTJlYjguLjRhMWIxNDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlkZW8vTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aWRlby9NYWtlZmlsZQpAQCAtMiwzICsyLDQgQEAKIG9iai0kKENPTkZJR19VU0JfSUJNQ0FNKSAgICAgICAgKz0gaWJtY2FtLm8gdWx0cmFjYW0ubwogb2JqLSQoQ09ORklHX1VTQl9LT05JQ0FXQykgICAgICArPSBrb25pY2F3Yy5vCiBvYmotJChDT05GSUdfVVNCX1ZJQ0FNKSAgICAgICAgICs9IHZpY2FtLm8KK29iai0kKENPTkZJR19VU0JfUVVJQ0tDQU1fTUVTU0VOR0VSKQkrPSBxdWlja2NhbV9tZXNzZW5nZXIubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aWRlby9xdWlja2NhbV9tZXNzZW5nZXIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlkZW8vcXVpY2tjYW1fbWVzc2VuZ2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZlMDFiNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlkZW8vcXVpY2tjYW1fbWVzc2VuZ2VyLmMKQEAgLTAsMCArMSwxMTIwIEBACisvKgorICogRHJpdmVyIGZvciBMb2dpdGVjaCBRdWlja2NhbSBNZXNzZW5nZXIgdXNiIHZpZGVvIGNhbWVyYQorICogQ29weXJpZ2h0IChDKSBKYXlhIEt1bWFyCisgKgorICogVGhpcyB3b3JrIHdhcyBzcG9uc29yZWQgYnkgQ0lTKE0pIFNkbiBCaGQuCisgKiBIaXN0b3J5OgorICogMDUvMDgvMjAwNiAtIEpheWEgS3VtYXIKKyAqIEkgd3JvdGUgdGhpcyBiYXNlZCBvbiB0aGUga29uaWNhd2MgYnkgU2ltb24gRXZhbnMuCisgKiAtCisgKiBGdWxsIGNyZWRpdCBmb3IgcmV2ZXJzZSBlbmdpbmVlcmluZyBhbmQgY3JlYXRpbmcgYW4gaW5pdGlhbAorICogd29ya2luZyBsaW51eCBkcml2ZXIgZm9yIHRoZSBWVjY0MjIgZ29lcyB0byB0aGUgcWNlLWdhIHByb2plY3QgYnkKKyAqIFR1dWtrYSBUb2l2b25lbiwgSm9jaGVuIEhvZW5pY2tlLCBQZXRlciBNY0Nvbm5lbGwsCisgKiBDcmlzdGlhbm8gRGUgTWljaGVsZSwgR2VvcmcgQWNoZXIsIEplYW4tRnJlZGVyaWMgQ2xlcmUgYXMgd2VsbCBhcworICogb3RoZXJzLgorICogLS0tCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi9pbnB1dC5oPgorCisjaW5jbHVkZSAidXNidmlkZW8uaCIKKyNpbmNsdWRlICJxdWlja2NhbV9tZXNzZW5nZXIuaCIKKworLyoKKyAqIFZlcnNpb24gSW5mb3JtYXRpb24KKyAqLworCisjaWZkZWYgQ09ORklHX1VTQl9ERUJVRworc3RhdGljIGludCBkZWJ1ZzsKKyNkZWZpbmUgREVCVUcobiwgZm9ybWF0LCBhcmcuLi4pIFwKKwlpZiAobiA8PSBkZWJ1ZykgewkgXAorCQlwcmludGsoS0VSTl9ERUJVRyBfX0ZJTEVfXyAiOiVzKCk6ICIgZm9ybWF0ICJcbiIsIF9fRlVOQ1RJT05fXyAsICMjIGFyZyk7IFwKKwl9CisjZWxzZQorI2RlZmluZSBERUJVRyhuLCBhcmcuLi4pCitzdGF0aWMgY29uc3QgaW50IGRlYnVnID0gMDsKKyNlbmRpZgorCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OICJ2MC4wMSIKKyNkZWZpbmUgRFJJVkVSX0RFU0MgIkxvZ2l0ZWNoIFF1aWNrY2FtIE1lc3NlbmdlciBVU0IiCisKKyNkZWZpbmUgVVNCX0xPR0lURUNIX1ZFTkRPUl9JRAkweDA0NkQKKyNkZWZpbmUgVVNCX1FDTV9QUk9EVUNUX0lECTB4MDhGMAorCisjZGVmaW5lIE1BWF9DQU1FUkFTCTEKKworI2RlZmluZSBNQVhfQ09MT1VSCTMyNzY4CisjZGVmaW5lIE1BWF9IVUUJCTMyNzY4CisjZGVmaW5lIE1BWF9CUklHSFRORVNTCTMyNzY4CisjZGVmaW5lIE1BWF9DT05UUkFTVAkzMjc2OAorI2RlZmluZSBNQVhfV0hJVEVORVNTCTMyNzY4CisKK3N0YXRpYyBpbnQgc2l6ZSA9IFNJWkVfMzIwWDI0MDsKK3N0YXRpYyBpbnQgY29sb3VyID0gTUFYX0NPTE9VUjsKK3N0YXRpYyBpbnQgaHVlID0gTUFYX0hVRTsKK3N0YXRpYyBpbnQgYnJpZ2h0bmVzcyA9CU1BWF9CUklHSFRORVNTOworc3RhdGljIGludCBjb250cmFzdCA9CU1BWF9DT05UUkFTVDsKK3N0YXRpYyBpbnQgd2hpdGVuZXNzID0JTUFYX1dISVRFTkVTUzsKKworc3RhdGljIHN0cnVjdCB1c2J2aWRlbyAqY2FtczsKKworc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIHFjbV90YWJsZSBbXSA9IHsKKwl7IFVTQl9ERVZJQ0UoVVNCX0xPR0lURUNIX1ZFTkRPUl9JRCwgVVNCX1FDTV9QUk9EVUNUX0lEKSB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBxY21fdGFibGUpOworCisjaWZkZWYgQ09ORklHX0lOUFVUCitzdGF0aWMgdm9pZCBxY21fcmVnaXN0ZXJfaW5wdXQoc3RydWN0IHFjbSAqY2FtLCBzdHJ1Y3QgdXNiX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldjsKKworCXVzYl9tYWtlX3BhdGgoZGV2LCBjYW0tPmlucHV0X3BoeXNuYW1lLCBzaXplb2YoY2FtLT5pbnB1dF9waHlzbmFtZSkpOworCXN0cm5jYXQoY2FtLT5pbnB1dF9waHlzbmFtZSwgIi9pbnB1dDAiLCBzaXplb2YoY2FtLT5pbnB1dF9waHlzbmFtZSkpOworCisJY2FtLT5pbnB1dCA9IGlucHV0X2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOworCWlmICghaW5wdXRfZGV2KSB7CisJCXdhcm4oImluc3VmZmljaWVudCBtZW0gZm9yIGNhbSBpbnB1dCBkZXZpY2UiKTsKKwkJcmV0dXJuOworCX0KKworCWlucHV0X2Rldi0+bmFtZSA9ICJRQ00gYnV0dG9uIjsKKwlpbnB1dF9kZXYtPnBoeXMgPSBjYW0tPmlucHV0X3BoeXNuYW1lOworCXVzYl90b19pbnB1dF9pZChkZXYsICZpbnB1dF9kZXYtPmlkKTsKKwlpbnB1dF9kZXYtPmNkZXYuZGV2ID0gJmRldi0+ZGV2OworCisJaW5wdXRfZGV2LT5ldmJpdFswXSA9IEJJVChFVl9LRVkpOworCWlucHV0X2Rldi0+a2V5Yml0W0xPTkcoQlROXzApXSA9IEJJVChCVE5fMCk7CisKKwlpbnB1dF9kZXYtPnByaXZhdGUgPSBjYW07CisKKwlpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoY2FtLT5pbnB1dCk7Cit9CisKK3N0YXRpYyB2b2lkIHFjbV91bnJlZ2lzdGVyX2lucHV0KHN0cnVjdCBxY20gKmNhbSkKK3sKKwlpZiAoY2FtLT5pbnB1dCkgeworCQlpbnB1dF91bnJlZ2lzdGVyX2RldmljZShjYW0tPmlucHV0KTsKKwkJY2FtLT5pbnB1dCA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgdm9pZCBxY21fcmVwb3J0X2J1dHRvbnN0YXQoc3RydWN0IHFjbSAqY2FtKQoreworCWlmIChjYW0tPmlucHV0KSB7CisJCWlucHV0X3JlcG9ydF9rZXkoY2FtLT5pbnB1dCwgQlROXzAsIGNhbS0+YnV0dG9uX3N0cyk7CisJCWlucHV0X3N5bmMoY2FtLT5pbnB1dCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBxY21faW50X2lycShzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWludCByZXQ7CisJc3RydWN0IHV2ZCAqdXZkID0gdXJiLT5jb250ZXh0OworCXN0cnVjdCBxY20gKmNhbTsKKworCWlmICghQ0FNRVJBX0lTX09QRVJBVElPTkFMKHV2ZCkpCisJCXJldHVybjsKKworCWlmICghdXZkLT5zdHJlYW1pbmcpCisJCXJldHVybjsKKworCXV2ZC0+c3RhdHMudXJiX2NvdW50Kys7CisKKwlpZiAodXJiLT5zdGF0dXMgPCAwKQorCQl1dmQtPnN0YXRzLmlzb19lcnJfY291bnQrKzsKKwllbHNlIHsKKwkJaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCA+IDAgKSB7CisJCQljYW0gPSAoc3RydWN0IHFjbSAqKSB1dmQtPnVzZXJfZGF0YTsKKwkJCWlmIChjYW0tPmJ1dHRvbl9zdHNfYnVmID09IDB4ODgpCisJCQkJY2FtLT5idXR0b25fc3RzID0gMHgwOworCQkJZWxzZSBpZiAoY2FtLT5idXR0b25fc3RzX2J1ZiA9PSAweDgwKQorCQkJCWNhbS0+YnV0dG9uX3N0cyA9IDB4MTsKKwkJCXFjbV9yZXBvcnRfYnV0dG9uc3RhdChjYW0pOworCQl9CisJfQorCisJcmV0ID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKKwlpZiAocmV0IDwgMCkKKwkJZXJyKCJ1c2Jfc3VibWl0X3VyYiBlcnJvciAoJWQpIiwgcmV0KTsKK30KKworc3RhdGljIGludCBxY21fc2V0dXBfaW5wdXRfaW50KHN0cnVjdCBxY20gKmNhbSwgc3RydWN0IHV2ZCAqdXZkKQoreworCWludCBlcnJmbGFnOworCXVzYl9maWxsX2ludF91cmIoY2FtLT5idXR0b25fdXJiLCB1dmQtPmRldiwKKwkJCXVzYl9yY3ZpbnRwaXBlKHV2ZC0+ZGV2LCB1dmQtPnZpZGVvX2VuZHAgKyAxKSwKKwkJCSZjYW0tPmJ1dHRvbl9zdHNfYnVmLAorCQkJMSwKKwkJCXFjbV9pbnRfaXJxLAorCQkJdXZkLCAxNik7CisKKwllcnJmbGFnID0gdXNiX3N1Ym1pdF91cmIoY2FtLT5idXR0b25fdXJiLCBHRlBfS0VSTkVMKTsKKwlpZiAoZXJyZmxhZykKKwkJZXJyICgidXNiX3N1Ym1pdF9pbnQgcmV0ICVkIiwgZXJyZmxhZyk7CisJcmV0dXJuIGVycmZsYWc7Cit9CisKK3N0YXRpYyB2b2lkIHFjbV9zdG9wX2ludF9kYXRhKHN0cnVjdCBxY20gKmNhbSkKK3sKKwl1c2Jfa2lsbF91cmIoY2FtLT5idXR0b25fdXJiKTsKK30KKworc3RhdGljIGludCBxY21fYWxsb2NfaW50X3VyYihzdHJ1Y3QgcWNtICpjYW0pCit7CisJY2FtLT5idXR0b25fdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKKworCWlmICghY2FtLT5idXR0b25fdXJiKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBxY21fZnJlZV9pbnQoc3RydWN0IHFjbSAqY2FtKQoreworCWlmIChjYW0tPmJ1dHRvbl91cmIpCisJCXVzYl9mcmVlX3VyYihjYW0tPmJ1dHRvbl91cmIpOworfQorI2VuZGlmIC8qIENPTkZJR19JTlBVVCAqLworCitzdGF0aWMgaW50IHFjbV9zdHZfc2V0YihzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCB1MTYgcmVnLCB1OCB2YWwpCit7CisJaW50IHJldDsKKworCS8qIHdlJ2xsIHdhaXQgdXAgdG8gMyBzbGljZXMgYnV0IG5vIG1vcmUgKi8KKwlyZXQgPSB1c2JfY29udHJvbF9tc2coZGV2LCB1c2Jfc25kY3RybHBpcGUoZGV2LCAwKSwKKwkJMHgwNCwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX0RJUl9PVVQgfCBVU0JfUkVDSVBfREVWSUNFLAorCQlyZWcsIDAsICZ2YWwsIDEsIDMqSFopOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcWNtX3N0dl9zZXR3KHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIHUxNiByZWcsIHUxNiB2YWwpCit7CisJaW50IHJldDsKKworCS8qIHdlJ2xsIHdhaXQgdXAgdG8gMyBzbGljZXMgYnV0IG5vIG1vcmUgKi8KKwlyZXQgPSB1c2JfY29udHJvbF9tc2coZGV2LCB1c2Jfc25kY3RybHBpcGUoZGV2LCAwKSwKKwkJMHgwNCwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX0RJUl9PVVQgfCBVU0JfUkVDSVBfREVWSUNFLAorCQlyZWcsIDAsICZ2YWwsIDIsIDMqSFopOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcWNtX3N0dl9nZXR3KHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0IHJlZywKKwkJCQkJCQlfX2xlMTYgKnZhbCkKK3sKKwlpbnQgcmV0OworCisJLyogd2UnbGwgd2FpdCB1cCB0byAzIHNsaWNlcyBidXQgbm8gbW9yZSAqLworCXJldCA9IHVzYl9jb250cm9sX21zZyhkZXYsIHVzYl9yY3ZjdHJscGlwZShkZXYsIDApLAorCQkweDA0LCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfRElSX0lOIHwgVVNCX1JFQ0lQX0RFVklDRSwKKwkJcmVnLCAwLCB2YWwsIDIsIDMqSFopOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcWNtX2NhbWVyYV9vbihzdHJ1Y3QgdXZkICp1dmQpCit7CisJaW50IHJldDsKKwlDSEVDS19SRVQocmV0LCBxY21fc3R2X3NldGIodXZkLT5kZXYsIFNUVl9JU09fRU5BQkxFLCAweDAxKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcWNtX2NhbWVyYV9vZmYoc3RydWN0IHV2ZCAqdXZkKQoreworCWludCByZXQ7CisJQ0hFQ0tfUkVUKHJldCwgcWNtX3N0dl9zZXRiKHV2ZC0+ZGV2LCBTVFZfSVNPX0VOQUJMRSwgMHgwMCkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBxY21faHN2MnJnYih1MTYgaHVlLCB1MTYgc2F0LCB1MTYgdmFsLCB1MTYgKnIsIHUxNiAqZywgdTE2ICpiKQoreworCXVuc2lnbmVkIGludCBzZWdtZW50LCB2YWxzYXQ7CisJc2lnbmVkIGludCAgIGggPSAoc2lnbmVkIGludCkgaHVlOworCXVuc2lnbmVkIGludCBzID0gKHNhdCAtIDMyNzY4KSAqIDI7CS8qIHJlc2NhbGUgKi8KKwl1bnNpZ25lZCBpbnQgdiA9IHZhbDsKKwl1bnNpZ25lZCBpbnQgcDsKKworCS8qCisJdGhlIHJlZ2lzdGVycyBjb250cm9saW5nIGdhaW4gYXJlIDggYml0IG9mIHdoaWNoCisJd2UgYWZmZWN0IG9ubHkgdGhlIGxhc3QgNCBiaXRzIHdpdGggb3VyIGdhaW4uCisJd2Uga25vdyB0aGF0IGlmIHNhdHVyYXRpb24gaXMgMCwgKHVuc2F0dXJhdGVkKSB0aGVuCisJd2UncmUgZ3JheXNjYWxlIChjZW50ZXIgYXhpcyBvZiB0aGUgY29sb3VyIGNvbmUpIHNvCisJd2Ugc2V0IHJnYj12YWx1ZS4gd2UgdXNlIGEgZm9ybXVsYSBvYnRhaW5lZCBmcm9tCisJd2lraXBlZGlhIHRvIG1hcCB0aGUgY29uZSB0byB0aGUgUkdCIHBsYW5lLiBpdCdzCisJYXMgZm9sbG93cyBmb3IgdGhlIGh1bWFuIHZhbHVlIGNhc2Ugb2YgaD0wLi4zNjAsCisJcz0wLi4xLCB2PTAuLjEKKwloX2kgPSBoLzYwICUgNiAsIGYgPSBoLzYwIC0gaF9pICwgcCA9IHYoMS1zKQorCXEgPSB2KDEgLSBmKnMpICwgdCA9IHYoMSAtICgxLWYpcykKKwloX2k9PTAgPT4gcj12ICwgZz10LCBiPXAKKwloX2k9PTEgPT4gcj1xICwgZz12LCBiPXAKKwloX2k9PTIgPT4gcj1wICwgZz12LCBiPXQKKwloX2k9PTMgPT4gcj1wICwgZz1xLCBiPXYKKwloX2k9PTQgPT4gcj10ICwgZz1wLCBiPXYKKwloX2k9PTUgPT4gcj12ICwgZz1wLCBiPXEKKwl0aGUgYm90dG9tIHNpZGUgKHRoZSBwb2ludCkgYW5kIHRoZSBzdHVmZiBqdXN0IHVwCisJb2YgdGhhdCBpcyBibGFjayBzbyB3ZSBzaW1wbGlmeSB0aG9zZSB0d28gY2FzZXMuCisJKi8KKwlpZiAoc2F0IDwgMzI3NjgpIHsKKwkJLyogYW55dGhpbmcgbGVzcyB0aGFuIHRoaXMgaXMgdW5zYXR1cmF0ZWQgKi8KKwkJKnIgPSB2YWw7CisJCSpnID0gdmFsOworCQkqYiA9IHZhbDsKKwkJcmV0dXJuOworCX0KKwlpZiAodmFsIDw9ICgweEZGRkYvOCkpIHsKKwkJLyogYW55dGhpbmcgbGVzcyB0aGFuIHRoaXMgaXMgYmxhY2sgKi8KKwkJKnIgPSAwOworCQkqZyA9IDA7CisJCSpiID0gMDsKKwkJcmV0dXJuOworCX0KKworCS8qIHRoZSByZXN0IG9mIHRoaXMgY29kZSBpcyBjb3B5aW5nIHR1a2thdCdzCisJaW1wbGVtZW50YXRpb24gb2YgdGhlIGhzdjJyZ2IgY29udmVyc2lvbiBhcyB0YWtlbgorCWZyb20gcWMtdXNiLW1lc3NlbmdlciBjb2RlLiB0aGUgMTA5MjMgaXMgMHhGRkZGLzYKKwl0byBkaXZpZGUgdGhlIGNvbmUgaW50byA2IHNlY3RvcnMuICAqLworCisJc2VnbWVudCA9IChoICsgMTA5MjMpICYgMHhGRkZGOworCXNlZ21lbnQgPSBzZWdtZW50KjMgPj4gMTY7CQkvKiAwLi4yOiAwPVIsIDE9RywgMj1CICovCisJaHVlIC09IHNlZ21lbnQgKiAyMTg0NTsJCQkvKiAtMTA5MjMuLjEwOTIzICovCisJaCA9IGh1ZTsKKwloICo9IDM7CisJdmFsc2F0ID0gdipzID4+IDE2OwkJCS8qIDAuLjY1NTM0ICovCisJcCA9IHYgLSB2YWxzYXQ7CisJaWYgKGggPj0gMCkgeworCQl1bnNpZ25lZCBpbnQgdCA9IHYgLSAodmFsc2F0ICogKDMyNzY5IC0gaCkgPj4gMTUpOworCQlzd2l0Y2ggKHNlZ21lbnQpIHsKKwkJY2FzZSAwOgkvKiBSLT4gKi8KKwkJCSpyID0gdjsKKwkJCSpnID0gdDsKKwkJCSpiID0gcDsKKwkJCWJyZWFrOworCQljYXNlIDE6CS8qIEctPiAqLworCQkJKnIgPSBwOworCQkJKmcgPSB2OworCQkJKmIgPSB0OworCQkJYnJlYWs7CisJCWNhc2UgMjoJLyogQi0+ICovCisJCQkqciA9IHQ7CisJCQkqZyA9IHA7CisJCQkqYiA9IHY7CisJCQlicmVhazsKKwkJfQorCX0gZWxzZSB7CisJCXVuc2lnbmVkIGludCBxID0gdiAtICh2YWxzYXQgKiAoMzI3NjkgKyBoKSA+PiAxNSk7CisJCXN3aXRjaCAoc2VnbWVudCkgeworCQljYXNlIDA6CS8qIC0+UiAqLworCQkJKnIgPSB2OworCQkJKmcgPSBwOworCQkJKmIgPSBxOworCQkJYnJlYWs7CisJCWNhc2UgMToJLyogLT5HICovCisJCQkqciA9IHE7CisJCQkqZyA9IHY7CisJCQkqYiA9IHA7CisJCQlicmVhazsKKwkJY2FzZSAyOgkvKiAtPkIgKi8KKwkJCSpyID0gcDsKKwkJCSpnID0gcTsKKwkJCSpiID0gdjsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCitzdGF0aWMgaW50IHFjbV9zZW5zb3Jfc2V0X2dhaW5zKHN0cnVjdCB1dmQgKnV2ZCwgdTE2IGh1ZSwKKwl1MTYgc2F0dXJhdGlvbiwgdTE2IHZhbHVlKQoreworCWludCByZXQ7CisJdTE2IHI9MCxnPTAsYj0wOworCisJLyogdGhpcyBjb2RlIGlzIGJhc2VkIG9uIHFjLXVzYi1tZXNzZW5nZXIgKi8KKwlxY21faHN2MnJnYihodWUsIHNhdHVyYXRpb24sIHZhbHVlLCAmciwgJmcsICZiKTsKKworCXIgPj49IDEyOworCWcgPj49IDEyOworCWIgPj49IDEyOworCisJLyogbWluIHZhbCBpcyA4ICovCisJciA9IG1heCgodTE2KSA4LCByKTsKKwlnID0gbWF4KCh1MTYpIDgsIGcpOworCWIgPSBtYXgoKHUxNikgOCwgYik7CisKKwlyIHw9IDB4MzA7CisJZyB8PSAweDMwOworCWIgfD0gMHgzMDsKKworCS8qIHNldCB0aGUgcixnLGIgZ2FpbiByZWdpc3RlcnMgKi8KKwlDSEVDS19SRVQocmV0LCBxY21fc3R2X3NldGIodXZkLT5kZXYsIDB4MDUwOSwgcikpOworCUNIRUNLX1JFVChyZXQsIHFjbV9zdHZfc2V0Yih1dmQtPmRldiwgMHgwNTBBLCBnKSk7CisJQ0hFQ0tfUkVUKHJldCwgcWNtX3N0dl9zZXRiKHV2ZC0+ZGV2LCAweDA1MEIsIGIpKTsKKworCS8qIGRvaW5nIGFzIHFjLXVzYiBkaWQgKi8KKwlDSEVDS19SRVQocmV0LCBxY21fc3R2X3NldGIodXZkLT5kZXYsIDB4MDUwQywgMHgyQSkpOworCUNIRUNLX1JFVChyZXQsIHFjbV9zdHZfc2V0Yih1dmQtPmRldiwgMHgwNTBELCAweDAxKSk7CisJQ0hFQ0tfUkVUKHJldCwgcWNtX3N0dl9zZXRiKHV2ZC0+ZGV2LCAweDE0M0YsIDB4MDEpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHFjbV9zZW5zb3Jfc2V0X2V4cG9zdXJlKHN0cnVjdCB1dmQgKnV2ZCwgaW50IGV4cG9zdXJlKQoreworCWludCByZXQ7CisJaW50IGZvcm1lZHZhbDsKKworCS8qIGNhbGN1bGF0aW9uIHdhcyBmcm9tIHFjLXVzYi1tZXNzZW5nZXIgZHJpdmVyICovCisJZm9ybWVkdmFsID0gKCBleHBvc3VyZSA+PiAxMiApOworCisJLyogbWF4IHZhbHVlIGZvciBmb3JtZWR2YWwgaXMgMTQgKi8KKwlmb3JtZWR2YWwgPSBtaW4oZm9ybWVkdmFsLCAxNCk7CisKKwlDSEVDS19SRVQocmV0LCBxY21fc3R2X3NldGIodXZkLT5kZXYsCisJCQkweDE0M0EsIDB4RjAgfCBmb3JtZWR2YWwpKTsKKwlDSEVDS19SRVQocmV0LCBxY21fc3R2X3NldGIodXZkLT5kZXYsIDB4MTQzRiwgMHgwMSkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHFjbV9zZW5zb3Jfc2V0bGV2ZWxzKHN0cnVjdCB1dmQgKnV2ZCwgaW50IGJyaWdodG5lc3MsIGludCBjb250cmFzdCwKKwkJCQkJaW50IGh1ZSwgaW50IGNvbG91cikKK3sKKwlpbnQgcmV0OworCS8qIGJyaWdodG5lc3MgaXMgZXhwb3N1cmUsIGNvbnRyYXN0IGlzIGdhaW4sIGNvbG91ciBpcyBzYXR1cmF0aW9uICovCisJQ0hFQ0tfUkVUKHJldCwKKwkJcWNtX3NlbnNvcl9zZXRfZXhwb3N1cmUodXZkLCBicmlnaHRuZXNzKSk7CisJQ0hFQ0tfUkVUKHJldCwgcWNtX3NlbnNvcl9zZXRfZ2FpbnModXZkLCBodWUsIGNvbG91ciwgY29udHJhc3QpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHFjbV9zZW5zb3Jfc2V0c2l6ZShzdHJ1Y3QgdXZkICp1dmQsIHU4IHNpemUpCit7CisJaW50IHJldDsKKworCUNIRUNLX1JFVChyZXQsIHFjbV9zdHZfc2V0Yih1dmQtPmRldiwgMHgxNTA1LCBzaXplKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcWNtX3NlbnNvcl9zZXRfc2h1dHRlcihzdHJ1Y3QgdXZkICp1dmQsIGludCB3aGl0ZW5lc3MpCit7CisJaW50IHJldDsKKwkvKiBzb21lIHJlc2NhbGluZyBhcyBkb25lIGJ5IHRoZSBxYy11c2ItbWVzc2VuZ2VyIGNvZGUgKi8KKwlpZiAod2hpdGVuZXNzID4gMHhDMDAwKQorCQl3aGl0ZW5lc3MgPSAweEMwMDAgKyAod2hpdGVuZXNzICYgMHgzRkZGKSo4OworCisJQ0hFQ0tfUkVUKHJldCwgcWNtX3N0dl9zZXRiKHV2ZC0+ZGV2LCAweDE0M0QsCisJCQkJKHdoaXRlbmVzcyA+PiA4KSAmIDB4RkYpKTsKKwlDSEVDS19SRVQocmV0LCBxY21fc3R2X3NldGIodXZkLT5kZXYsIDB4MTQzRSwKKwkJCQkod2hpdGVuZXNzID4+IDE2KSAmIDB4MDMpKTsKKwlDSEVDS19SRVQocmV0LCBxY21fc3R2X3NldGIodXZkLT5kZXYsIDB4MTQzRiwgMHgwMSkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcWNtX3NlbnNvcl9pbml0KHN0cnVjdCB1dmQgKnV2ZCkKK3sKKwlzdHJ1Y3QgcWNtICpjYW0gPSAoc3RydWN0IHFjbSAqKSB1dmQtPnVzZXJfZGF0YTsKKwlpbnQgcmV0OworCWludCBpOworCisJZm9yIChpPTA7IGkgPCBzaXplb2YocmVndmFsX3RhYmxlKS9zaXplb2YocmVndmFsX3RhYmxlWzBdKSA7IGkrKykgeworCQlDSEVDS19SRVQocmV0LCBxY21fc3R2X3NldGIodXZkLT5kZXYsCisJCQkJCXJlZ3ZhbF90YWJsZVtpXS5yZWcsCisJCQkJCXJlZ3ZhbF90YWJsZVtpXS52YWwpKTsKKwl9CisKKwlDSEVDS19SRVQocmV0LCBxY21fc3R2X3NldHcodXZkLT5kZXYsIDB4MTVjMSwKKwkJCQljcHVfdG9fbGUxNihJU09DX1BBQ0tFVF9TSVpFKSkpOworCUNIRUNLX1JFVChyZXQsIHFjbV9zdHZfc2V0Yih1dmQtPmRldiwgMHgxNWMzLCAweDA4KSk7CisJQ0hFQ0tfUkVUKHJldCwgcmV0ID0gcWNtX3N0dl9zZXRiKHV2ZC0+ZGV2LCAweDE0M2YsIDB4MDEpKTsKKworCUNIRUNLX1JFVChyZXQsIHFjbV9zdHZfc2V0Yih1dmQtPmRldiwgU1RWX0lTT19FTkFCTEUsIDB4MDApKTsKKworCUNIRUNLX1JFVChyZXQsIHFjbV9zZW5zb3Jfc2V0c2l6ZSh1dmQsIGNhbWVyYV9zaXplc1tjYW0tPnNpemVdLmNtZCkpOworCisJQ0hFQ0tfUkVUKHJldCwgcWNtX3NlbnNvcl9zZXRsZXZlbHModXZkLCB1dmQtPnZwaWMuYnJpZ2h0bmVzcywKKwkJCXV2ZC0+dnBpYy5jb250cmFzdCwgdXZkLT52cGljLmh1ZSwgdXZkLT52cGljLmNvbG91cikpOworCisJQ0hFQ0tfUkVUKHJldCwgcWNtX3NlbnNvcl9zZXRfc2h1dHRlcih1dmQsIHV2ZC0+dnBpYy53aGl0ZW5lc3MpKTsKKwlDSEVDS19SRVQocmV0LCBxY21fc2Vuc29yX3NldHNpemUodXZkLCBjYW1lcmFfc2l6ZXNbY2FtLT5zaXplXS5jbWQpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHFjbV9zZXRfY2FtZXJhX3NpemUoc3RydWN0IHV2ZCAqdXZkKQoreworCWludCByZXQ7CisJc3RydWN0IHFjbSAqY2FtID0gKHN0cnVjdCBxY20gKikgdXZkLT51c2VyX2RhdGE7CisKKwlDSEVDS19SRVQocmV0LCBxY21fc2Vuc29yX3NldHNpemUodXZkLCBjYW1lcmFfc2l6ZXNbY2FtLT5zaXplXS5jbWQpKTsKKwljYW0tPndpZHRoID0gY2FtZXJhX3NpemVzW2NhbS0+c2l6ZV0ud2lkdGg7CisJY2FtLT5oZWlnaHQgPSBjYW1lcmFfc2l6ZXNbY2FtLT5zaXplXS5oZWlnaHQ7CisJdXZkLT52aWRlb3NpemUgPSBWSURFT1NJWkUoY2FtLT53aWR0aCwgY2FtLT5oZWlnaHQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcWNtX3NldHVwX29uX29wZW4oc3RydWN0IHV2ZCAqdXZkKQoreworCWludCByZXQ7CisKKwlDSEVDS19SRVQocmV0LCBxY21fc2Vuc29yX3NldF9nYWlucyh1dmQsIHV2ZC0+dnBpYy5odWUsCisJCQkJdXZkLT52cGljLmNvbG91ciwgdXZkLT52cGljLmNvbnRyYXN0KSk7CisJQ0hFQ0tfUkVUKHJldCwgcWNtX3NlbnNvcl9zZXRfZXhwb3N1cmUodXZkLCB1dmQtPnZwaWMuYnJpZ2h0bmVzcykpOworCUNIRUNLX1JFVChyZXQsIHFjbV9zZW5zb3Jfc2V0X3NodXR0ZXIodXZkLCB1dmQtPnZwaWMud2hpdGVuZXNzKSk7CisJQ0hFQ0tfUkVUKHJldCwgcWNtX3NldF9jYW1lcmFfc2l6ZSh1dmQpKTsKKwlDSEVDS19SRVQocmV0LCBxY21fY2FtZXJhX29uKHV2ZCkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBxY21fYWRqdXN0X3BpY3R1cmUoc3RydWN0IHV2ZCAqdXZkKQoreworCWludCByZXQ7CisJc3RydWN0IHFjbSAqY2FtID0gKHN0cnVjdCBxY20gKikgdXZkLT51c2VyX2RhdGE7CisKKwlyZXQgPSBxY21fY2FtZXJhX29mZih1dmQpOworCWlmIChyZXQpIHsKKwkJZXJyKCJjYW4ndCB0dXJuIGNhbWVyYSBvZmYuIGFiYW5kb25pbmcgcGljIGFkanVzdG1lbnQiKTsKKwkJcmV0dXJuOworCX0KKworCS8qIGlmIHRoZXJlJ3MgYmVlbiBhIGNoYW5nZSBpbiBjb250cmFzdCwgaHVlLCBvcgorCWNvbG91ciB0aGVuIHdlIG5lZWQgdG8gcmVjYWxjdWxhdGUgaHN2IGluIG9yZGVyCisJdG8gdXBkYXRlIGdhaW5zICovCisJaWYgKChjYW0tPmNvbnRyYXN0ICE9IHV2ZC0+dnBpYy5jb250cmFzdCkgfHwKKwkJKGNhbS0+aHVlICE9IHV2ZC0+dnBpYy5odWUpIHx8CisJCShjYW0tPmNvbG91ciAhPSB1dmQtPnZwaWMuY29sb3VyKSkgeworCQljYW0tPmNvbnRyYXN0ID0gdXZkLT52cGljLmNvbnRyYXN0OworCQljYW0tPmh1ZSA9IHV2ZC0+dnBpYy5odWU7CisJCWNhbS0+Y29sb3VyID0gdXZkLT52cGljLmNvbG91cjsKKwkJcmV0ID0gcWNtX3NlbnNvcl9zZXRfZ2FpbnModXZkLCBjYW0tPmh1ZSwgY2FtLT5jb2xvdXIsCisJCQkJCQljYW0tPmNvbnRyYXN0KTsKKwkJaWYgKHJldCkgeworCQkJZXJyKCJjYW4ndCBzZXQgZ2FpbnMuIGFiYW5kb25pbmcgcGljIGFkanVzdG1lbnQiKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCWlmIChjYW0tPmJyaWdodG5lc3MgIT0gdXZkLT52cGljLmJyaWdodG5lc3MpIHsKKwkJY2FtLT5icmlnaHRuZXNzID0gdXZkLT52cGljLmJyaWdodG5lc3M7CisJCXJldCA9IHFjbV9zZW5zb3Jfc2V0X2V4cG9zdXJlKHV2ZCwgY2FtLT5icmlnaHRuZXNzKTsKKwkJaWYgKHJldCkgeworCQkJZXJyKCJjYW4ndCBzZXQgZXhwb3N1cmUuIGFiYW5kb25pbmcgcGljIGFkanVzdG1lbnQiKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCWlmIChjYW0tPndoaXRlbmVzcyAhPSB1dmQtPnZwaWMud2hpdGVuZXNzKSB7CisJCWNhbS0+d2hpdGVuZXNzID0gdXZkLT52cGljLndoaXRlbmVzczsKKwkJcWNtX3NlbnNvcl9zZXRfc2h1dHRlcih1dmQsIGNhbS0+d2hpdGVuZXNzKTsKKwkJaWYgKHJldCkgeworCQkJZXJyKCJjYW4ndCBzZXQgc2h1dHRlci4gYWJhbmRvbmluZyBwaWMgYWRqdXN0bWVudCIpOworCQkJcmV0dXJuOworCQl9CisJfQorCisJcmV0ID0gcWNtX2NhbWVyYV9vbih1dmQpOworCWlmIChyZXQpIHsKKwkJZXJyKCJjYW4ndCByZWVuYWJsZSBjYW1lcmEuIHBpYyBhZGp1c3RtZW50IGZhaWxlZCIpOworCQlyZXR1cm47CisJfQorfQorCitzdGF0aWMgaW50IHFjbV9wcm9jZXNzX2ZyYW1lKHN0cnVjdCB1dmQgKnV2ZCwgdTggKmNkYXRhLCBpbnQgZnJhbWVsZW4pCit7CisJaW50IGRhdGFsZW47CisJaW50IHRvdGFsZGF0YTsKKwlzdHJ1Y3QgZnJhbWVoZHIgeworCQlfX2JlMTYgaWQ7CisJCV9fYmUxNiBsZW47CisJfTsKKwlzdHJ1Y3QgZnJhbWVoZHIgKmZoZHI7CisKKwl0b3RhbGRhdGEgPSAwOworCXdoaWxlIChmcmFtZWxlbikgeworCQlmaGRyID0gKHN0cnVjdCBmcmFtZWhkciAqKSBjZGF0YTsKKwkJZGF0YWxlbiA9IGJlMTZfdG9fY3B1KGZoZHItPmxlbik7CisJCWZyYW1lbGVuIC09IDQ7CisJCWNkYXRhICs9IDQ7CisKKwkJaWYgKChmaGRyLT5pZCkgPT0gY3B1X3RvX2JlMTYoMHg4MDAxKSkgeworCQkJUmluZ1F1ZXVlX0VucXVldWUoJnV2ZC0+ZHAsIG1hcmtlciwgNCk7CisJCQl0b3RhbGRhdGEgKz0gNDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICgoZmhkci0+aWQgJiBjcHVfdG9fYmUxNigweEZGMDApKSA9PSBjcHVfdG9fYmUxNigweDAyMDApKSB7CisJCQlSaW5nUXVldWVfRW5xdWV1ZSgmdXZkLT5kcCwgY2RhdGEsIGRhdGFsZW4pOworCQkJdG90YWxkYXRhICs9IGRhdGFsZW47CisJCX0KKwkJZnJhbWVsZW4gLT0gZGF0YWxlbjsKKwkJY2RhdGEgKz0gZGF0YWxlbjsKKwl9CisJcmV0dXJuIHRvdGFsZGF0YTsKK30KKworc3RhdGljIGludCBxY21fY29tcHJlc3NfaXNvKHN0cnVjdCB1dmQgKnV2ZCwgc3RydWN0IHVyYiAqZGF0YXVyYikKK3sKKwlpbnQgdG90bGVuOworCWludCBpOworCXVuc2lnbmVkIGNoYXIgKmNkYXRhOworCisJdG90bGVuPTA7CisJZm9yIChpID0gMDsgaSA8IGRhdGF1cmItPm51bWJlcl9vZl9wYWNrZXRzOyBpKyspIHsKKwkJaW50IG4gPSBkYXRhdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5hY3R1YWxfbGVuZ3RoOworCQlpbnQgc3QgPSBkYXRhdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5zdGF0dXM7CisKKwkJY2RhdGEgPSBkYXRhdXJiLT50cmFuc2Zlcl9idWZmZXIgKworCQkJZGF0YXVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0ub2Zmc2V0OworCisJCWlmIChzdCA8IDApIHsKKwkJCXdhcm4oIkRhdGEgZXJyb3I6IHBhY2tldD0lZC4gbGVuPSVkLiBzdGF0dXM9JWQuIiwKKwkJCSAgICAgIGksIG4sIHN0KTsKKwkJCXV2ZC0+c3RhdHMuaXNvX2Vycl9jb3VudCsrOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFuKQorCQkJY29udGludWU7CisKKwkJdG90bGVuICs9IHFjbV9wcm9jZXNzX2ZyYW1lKHV2ZCwgY2RhdGEsIG4pOworCX0KKwlyZXR1cm4gdG90bGVuOworfQorCitzdGF0aWMgdm9pZCByZXN1Ym1pdF91cmIoc3RydWN0IHV2ZCAqdXZkLCBzdHJ1Y3QgdXJiICp1cmIpCit7CisJaW50IHJldDsKKworCXVyYi0+ZGV2ID0gdXZkLT5kZXY7CisJcmV0ID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKKwlpZiAocmV0KQorCQllcnIoInVzYl9zdWJtaXRfdXJiIGVycm9yICglZCkiLCByZXQpOworfQorCitzdGF0aWMgdm9pZCBxY21faXNvY19pcnEoc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpbnQgbGVuOworCXN0cnVjdCB1dmQgKnV2ZCA9IHVyYi0+Y29udGV4dDsKKworCWlmICghQ0FNRVJBX0lTX09QRVJBVElPTkFMKHV2ZCkpCisJCXJldHVybjsKKworCWlmICghdXZkLT5zdHJlYW1pbmcpCisJCXJldHVybjsKKworCXV2ZC0+c3RhdHMudXJiX2NvdW50Kys7CisKKwlpZiAoIXVyYi0+YWN0dWFsX2xlbmd0aCkgeworCQlyZXN1Ym1pdF91cmIodXZkLCB1cmIpOworCQlyZXR1cm47CisJfQorCisJbGVuID0gcWNtX2NvbXByZXNzX2lzbyh1dmQsIHVyYik7CisJcmVzdWJtaXRfdXJiKHV2ZCwgdXJiKTsKKwl1dmQtPnN0YXRzLnVyYl9sZW5ndGggPSBsZW47CisJdXZkLT5zdGF0cy5kYXRhX2NvdW50ICs9IGxlbjsKKwlpZiAobGVuKQorCQlSaW5nUXVldWVfV2FrZVVwSW50ZXJydXB0aWJsZSgmdXZkLT5kcCk7Cit9CisKK3N0YXRpYyBpbnQgcWNtX3N0YXJ0X2RhdGEoc3RydWN0IHV2ZCAqdXZkKQoreworCXN0cnVjdCBxY20gKmNhbSA9IChzdHJ1Y3QgcWNtICopIHV2ZC0+dXNlcl9kYXRhOworCWludCBpOworCWludCBlcnJmbGFnOworCWludCBwa3RzejsKKwlpbnQgZXJyOworCisJcGt0c3ogPSB1dmQtPmlzb19wYWNrZXRfbGVuOworCWlmICghQ0FNRVJBX0lTX09QRVJBVElPTkFMKHV2ZCkpIHsKKwkJZXJyKCJDYW1lcmEgaXMgbm90IG9wZXJhdGlvbmFsIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWVyciA9IHVzYl9zZXRfaW50ZXJmYWNlKHV2ZC0+ZGV2LCB1dmQtPmlmYWNlLCB1dmQtPmlmYWNlQWx0QWN0aXZlKTsKKwlpZiAoZXJyIDwgMCkgeworCQllcnIoInVzYl9zZXRfaW50ZXJmYWNlIGVycm9yIik7CisJCXV2ZC0+bGFzdF9lcnJvciA9IGVycjsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlmb3IgKGk9MDsgaSA8IFVTQlZJREVPX05VTVNCVUY7IGkrKykgeworCQlpbnQgaiwgazsKKwkJc3RydWN0IHVyYiAqdXJiID0gdXZkLT5zYnVmW2ldLnVyYjsKKwkJdXJiLT5kZXYgPSB1dmQtPmRldjsKKwkJdXJiLT5jb250ZXh0ID0gdXZkOworCQl1cmItPnBpcGUgPSB1c2JfcmN2aXNvY3BpcGUodXZkLT5kZXYsIHV2ZC0+dmlkZW9fZW5kcCk7CisJCXVyYi0+aW50ZXJ2YWwgPSAxOworCQl1cmItPnRyYW5zZmVyX2ZsYWdzID0gVVJCX0lTT19BU0FQOworCQl1cmItPnRyYW5zZmVyX2J1ZmZlciA9IHV2ZC0+c2J1ZltpXS5kYXRhOworCQl1cmItPmNvbXBsZXRlID0gcWNtX2lzb2NfaXJxOworCQl1cmItPm51bWJlcl9vZl9wYWNrZXRzID0gRlJBTUVTX1BFUl9ERVNDOworCQl1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBwa3RzeiAqIEZSQU1FU19QRVJfREVTQzsKKwkJZm9yIChqPWs9MDsgaiA8IEZSQU1FU19QRVJfREVTQzsgaisrLCBrICs9IHBrdHN6KSB7CisJCQl1cmItPmlzb19mcmFtZV9kZXNjW2pdLm9mZnNldCA9IGs7CisJCQl1cmItPmlzb19mcmFtZV9kZXNjW2pdLmxlbmd0aCA9IHBrdHN6OworCQl9CisJfQorCisJdXZkLT5zdHJlYW1pbmcgPSAxOworCXV2ZC0+Y3VyZnJhbWUgPSAtMTsKKwlmb3IgKGk9MDsgaSA8IFVTQlZJREVPX05VTVNCVUY7IGkrKykgeworCQllcnJmbGFnID0gdXNiX3N1Ym1pdF91cmIodXZkLT5zYnVmW2ldLnVyYiwgR0ZQX0tFUk5FTCk7CisJCWlmIChlcnJmbGFnKQorCQkJZXJyICgidXNiX3N1Ym1pdF9pc29jKCVkKSByZXQgJWQiLCBpLCBlcnJmbGFnKTsKKwl9CisKKwlDSEVDS19SRVQoZXJyLCBxY21fc2V0dXBfaW5wdXRfaW50KGNhbSwgdXZkKSk7CisJQ0hFQ0tfUkVUKGVyciwgcWNtX2NhbWVyYV9vbih1dmQpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcWNtX3N0b3BfZGF0YShzdHJ1Y3QgdXZkICp1dmQpCit7CisJc3RydWN0IHFjbSAqY2FtID0gKHN0cnVjdCBxY20gKikgdXZkLT51c2VyX2RhdGE7CisJaW50IGksIGo7CisJaW50IHJldDsKKworCWlmICgodXZkID09IE5VTEwpIHx8ICghdXZkLT5zdHJlYW1pbmcpIHx8ICh1dmQtPmRldiA9PSBOVUxMKSkKKwkJcmV0dXJuOworCisJcmV0ID0gcWNtX2NhbWVyYV9vZmYodXZkKTsKKwlpZiAocmV0KQorCQl3YXJuKCJjb3VsZG4ndCB0dXJuIHRoZSBjYW0gb2ZmLiIpOworCisJdXZkLT5zdHJlYW1pbmcgPSAwOworCisJLyogVW5zY2hlZHVsZSBhbGwgb2YgdGhlIGlzbyB0ZCdzICovCisJZm9yIChpPTA7IGkgPCBVU0JWSURFT19OVU1TQlVGOyBpKyspCisJCXVzYl9raWxsX3VyYih1dmQtPnNidWZbaV0udXJiKTsKKworCXFjbV9zdG9wX2ludF9kYXRhKGNhbSk7CisKKwlpZiAoIXV2ZC0+cmVtb3ZlX3BlbmRpbmcpIHsKKwkJLyogU2V0IHBhY2tldCBzaXplIHRvIDAgKi8KKwkJaiA9IHVzYl9zZXRfaW50ZXJmYWNlKHV2ZC0+ZGV2LCB1dmQtPmlmYWNlLAorCQkJCQl1dmQtPmlmYWNlQWx0SW5hY3RpdmUpOworCQlpZiAoaiA8IDApIHsKKwkJCWVycigidXNiX3NldF9pbnRlcmZhY2UoKSBlcnJvciAlZC4iLCBqKTsKKwkJCXV2ZC0+bGFzdF9lcnJvciA9IGo7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHFjbV9wcm9jZXNzX2lzb2Moc3RydWN0IHV2ZCAqdXZkLCBzdHJ1Y3QgdXNidmlkZW9fZnJhbWUgKmZyYW1lKQoreworCXN0cnVjdCBxY20gKmNhbSA9IChzdHJ1Y3QgcWNtICopIHV2ZC0+dXNlcl9kYXRhOworCWludCB4OworCXN0cnVjdCByZ2IgKnJnYkwwOworCXN0cnVjdCByZ2IgKnJnYkwxOworCXN0cnVjdCBiYXlMMCAqYmF5TDA7CisJc3RydWN0IGJheUwxICpiYXlMMTsKKwlpbnQgaG9yLHZlcixob3JkZWwsdmVyZGVsOworCWFzc2VydChmcmFtZSAhPSBOVUxMKTsKKworCXN3aXRjaCAoY2FtLT5zaXplKSB7CisJY2FzZSBTSVpFXzE2MFgxMjA6CisJCWhvciA9IDE2MjsgdmVyID0gMTI0OyBob3JkZWwgPSAxOyB2ZXJkZWwgPSAyOworCQlicmVhazsKKwljYXNlIFNJWkVfMzIwWDI0MDoKKwlkZWZhdWx0OgorCQlob3IgPSAzMjQ7IHZlciA9IDI0ODsgaG9yZGVsID0gMjsgdmVyZGVsID0gNDsKKwkJYnJlYWs7CisJfQorCisJaWYgKGZyYW1lLT5zY2Fuc3RhdGUgPT0gU2NhblN0YXRlX1NjYW5uaW5nKSB7CisJCXdoaWxlIChSaW5nUXVldWVfR2V0TGVuZ3RoKCZ1dmQtPmRwKSA+PQorCQkJIDQgKyAoaG9yKnZlcmRlbCArIGhvcmRlbCkpIHsKKwkJCWlmICgoUklOR19RVUVVRV9QRUVLKCZ1dmQtPmRwLCAwKSA9PSAweDAwKSAmJgorCQkJICAgIChSSU5HX1FVRVVFX1BFRUsoJnV2ZC0+ZHAsIDEpID09IDB4ZmYpICYmCisJCQkgICAgKFJJTkdfUVVFVUVfUEVFSygmdXZkLT5kcCwgMikgPT0gMHgwMCkgJiYKKwkJCSAgICAoUklOR19RVUVVRV9QRUVLKCZ1dmQtPmRwLCAzKSA9PSAweGZmKSkgeworCQkJCWZyYW1lLT5jdXJsaW5lID0gMDsKKwkJCQlmcmFtZS0+c2NhbnN0YXRlID0gU2NhblN0YXRlX0xpbmVzOworCQkJCWZyYW1lLT5mcmFtZVN0YXRlID0gRnJhbWVTdGF0ZV9HcmFiYmluZzsKKwkJCQlSSU5HX1FVRVVFX0RFUVVFVUVfQllURVMoJnV2ZC0+ZHAsIDQpOworCQkJLyoKKwkJCSogaWYgd2UncmUgc3RhcnRpbmcsIHdlIG5lZWQgdG8gZGlzY2FyZCB0aGUgZmlyc3QKKwkJCSogNCBsaW5lcyBvZiB5IGJheWVyIGRhdGEKKwkJCSogYW5kIHRoZSBmaXJzdCAyIGdyIGVsZW1lbnRzIG9mIHggYmF5ZXIgZGF0YQorCQkJKi8KKwkJCQlSSU5HX1FVRVVFX0RFUVVFVUVfQllURVMoJnV2ZC0+ZHAsCisJCQkJCQkJKGhvcip2ZXJkZWwgKyBob3JkZWwpKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCVJJTkdfUVVFVUVfREVRVUVVRV9CWVRFUygmdXZkLT5kcCwgMSk7CisJCX0KKwl9CisKKwlpZiAoZnJhbWUtPnNjYW5zdGF0ZSA9PSBTY2FuU3RhdGVfU2Nhbm5pbmcpCisJCXJldHVybjsKKworCS8qIG5vdyB3ZSBjYW4gc3RhcnQgcHJvY2Vzc2luZyBiYXllciBkYXRhIHNvIGxvbmcgYXMgd2UgaGF2ZSBhdCBsZWFzdAorCSogMiBsaW5lcyB3b3J0aCBvZiBkYXRhLiB0aGlzIGlzIHRoZSBzaW1wbGVzdCBkZW1vc2FpY2luZyBtZXRob2QgdGhhdAorCSogSSBjb3VsZCB0aGluayBvZi4gSSB1c2UgZWFjaCAyeDIgYmF5ZXIgZWxlbWVudCB3aXRob3V0IGludGVycG9sYXRpb24KKwkqIHRvIGdlbmVyYXRlIDQgcmdiIHBpeGVscy4KKwkqLworCXdoaWxlICggZnJhbWUtPmN1cmxpbmUgPCBjYW0tPmhlaWdodCAmJgorCQkoUmluZ1F1ZXVlX0dldExlbmd0aCgmdXZkLT5kcCkgPj0gaG9yKjIpKSB7CisJCS8qIGdldCAyIGxpbmVzIG9mIGJheWVyIGZvciBkZW1vc2FpY2luZworCQkgKiBpbnRvIDIgbGluZXMgb2YgUkdCICovCisJCVJpbmdRdWV1ZV9EZXF1ZXVlKCZ1dmQtPmRwLCBjYW0tPnNjcmF0Y2gsIGhvcioyKTsKKwkJYmF5TDAgPSAoc3RydWN0IGJheUwwICopIGNhbS0+c2NyYXRjaDsKKwkJYmF5TDEgPSAoc3RydWN0IGJheUwxICopIChjYW0tPnNjcmF0Y2ggKyBob3IpOworCQkvKiBmcmFtZS0+Y3VybGluZSBpcyB0aGUgcmdiIHkgbGluZSAqLworCQlyZ2JMMCA9IChzdHJ1Y3QgcmdiICopCisJCQkJKCBmcmFtZS0+ZGF0YSArIChjYW0tPndpZHRoKjMqZnJhbWUtPmN1cmxpbmUpKTsKKwkJLyogdy8yIGJlY2F1c2Ugd2UncmUgYWxyZWFkeSBkb2luZyAyIHBpeGVscyAqLworCQlyZ2JMMSA9IHJnYkwwICsgKGNhbS0+d2lkdGgvMik7CisKKwkJZm9yICh4PTA7IHggPCBjYW0tPndpZHRoOyB4Kz0yKSB7CisJCQlyZ2JMMC0+ciA9IGJheUwwLT5yOworCQkJcmdiTDAtPmcgPSBiYXlMMC0+ZzsKKwkJCXJnYkwwLT5iID0gYmF5TDEtPmI7CisKKwkJCXJnYkwwLT5yMiA9IGJheUwwLT5yOworCQkJcmdiTDAtPmcyID0gYmF5TDEtPmc7CisJCQlyZ2JMMC0+YjIgPSBiYXlMMS0+YjsKKworCQkJcmdiTDEtPnIgPSBiYXlMMC0+cjsKKwkJCXJnYkwxLT5nID0gYmF5TDEtPmc7CisJCQlyZ2JMMS0+YiA9IGJheUwxLT5iOworCisJCQlyZ2JMMS0+cjIgPSBiYXlMMC0+cjsKKwkJCXJnYkwxLT5nMiA9IGJheUwxLT5nOworCQkJcmdiTDEtPmIyID0gYmF5TDEtPmI7CisKKwkJCXJnYkwwKys7CisJCQlyZ2JMMSsrOworCisJCQliYXlMMCsrOworCQkJYmF5TDErKzsKKwkJfQorCisJCWZyYW1lLT5zZXFSZWFkX0xlbmd0aCArPSBjYW0tPndpZHRoKjMqMjsKKwkJZnJhbWUtPmN1cmxpbmUgKz0gMjsKKwl9CisJLyogU2VlIGlmIHdlIGZpbGxlZCB0aGUgZnJhbWUgKi8KKwlpZiAoZnJhbWUtPmN1cmxpbmUgPT0gY2FtLT5oZWlnaHQpIHsKKwkJZnJhbWUtPmZyYW1lU3RhdGUgPSBGcmFtZVN0YXRlX0RvbmVfSG9sZDsKKwkJZnJhbWUtPmN1cmxpbmUgPSAwOworCQl1dmQtPmN1cmZyYW1lID0gLTE7CisJCXV2ZC0+c3RhdHMuZnJhbWVfbnVtKys7CisJfQorfQorCisvKiB0YWtlbiBmcm9tIGtvbmljYXdjICovCitzdGF0aWMgaW50IHFjbV9zZXRfdmlkZW9fbW9kZShzdHJ1Y3QgdXZkICp1dmQsIHN0cnVjdCB2aWRlb193aW5kb3cgKnZ3KQoreworCWludCByZXQ7CisJaW50IG5ld3NpemU7CisJaW50IG9sZHNpemU7CisJaW50IHggPSB2dy0+d2lkdGg7CisJaW50IHkgPSB2dy0+aGVpZ2h0OworCXN0cnVjdCBxY20gKmNhbSA9IChzdHJ1Y3QgcWNtICopIHV2ZC0+dXNlcl9kYXRhOworCisJaWYgKHggPiAwICYmIHkgPiAwKSB7CisJCURFQlVHKDIsICJ0cnlpbmcgdG8gZmluZCBzaXplICVkLCVkIiwgeCwgeSk7CisJCWZvciAobmV3c2l6ZSA9IDA7IG5ld3NpemUgPD0gTUFYX0ZSQU1FX1NJWkU7IG5ld3NpemUrKykgeworCQkJaWYgKChjYW1lcmFfc2l6ZXNbbmV3c2l6ZV0ud2lkdGggPT0geCkgJiYKKwkJCQkoY2FtZXJhX3NpemVzW25ld3NpemVdLmhlaWdodCA9PSB5KSkKKwkJCQlicmVhazsKKwkJfQorCX0gZWxzZQorCQluZXdzaXplID0gY2FtLT5zaXplOworCisJaWYgKG5ld3NpemUgPiBNQVhfRlJBTUVfU0laRSkgeworCQlERUJVRygxLCAiY291bGRuJ3QgZmluZCBzaXplICVkLCVkIiwgeCwgeSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChuZXdzaXplID09IGNhbS0+c2l6ZSkgeworCQlERUJVRygxLCAiTm90aGluZyB0byBkbyIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlxY21fc3RvcF9kYXRhKHV2ZCk7CisKKwlpZiAoY2FtLT5zaXplICE9IG5ld3NpemUpIHsKKwkJb2xkc2l6ZSA9IGNhbS0+c2l6ZTsKKwkJY2FtLT5zaXplID0gbmV3c2l6ZTsKKwkJcmV0ID0gcWNtX3NldF9jYW1lcmFfc2l6ZSh1dmQpOworCQlpZiAocmV0KSB7CisJCQllcnIoIkNvdWxkbid0IHNldCBjYW1lcmEgc2l6ZSwgZXJyPSVkIixyZXQpOworCQkJLyogcmVzdG9yZSB0aGUgb3JpZ2luYWwgc2l6ZSAqLworCQkJY2FtLT5zaXplID0gb2xkc2l6ZTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwkvKiBGbHVzaCB0aGUgaW5wdXQgcXVldWUgYW5kIGNsZWFyIGFueSBjdXJyZW50IGZyYW1lIGluIHByb2dyZXNzICovCisKKwlSaW5nUXVldWVfRmx1c2goJnV2ZC0+ZHApOworCWlmICh1dmQtPmN1cmZyYW1lICE9IC0xKSB7CisJCXV2ZC0+ZnJhbWVbdXZkLT5jdXJmcmFtZV0uY3VybGluZSA9IDA7CisJCXV2ZC0+ZnJhbWVbdXZkLT5jdXJmcmFtZV0uc2VxUmVhZF9MZW5ndGggPSAwOworCQl1dmQtPmZyYW1lW3V2ZC0+Y3VyZnJhbWVdLnNlcVJlYWRfSW5kZXggPSAwOworCX0KKworCUNIRUNLX1JFVChyZXQsIHFjbV9zdGFydF9kYXRhKHV2ZCkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHFjbV9jb25maWd1cmVfdmlkZW8oc3RydWN0IHV2ZCAqdXZkKQoreworCWludCByZXQ7CisJbWVtc2V0KCZ1dmQtPnZwaWMsIDAsIHNpemVvZih1dmQtPnZwaWMpKTsKKwltZW1zZXQoJnV2ZC0+dnBpY19vbGQsIDB4NTUsIHNpemVvZih1dmQtPnZwaWNfb2xkKSk7CisKKwl1dmQtPnZwaWMuY29sb3VyID0gY29sb3VyOworCXV2ZC0+dnBpYy5odWUgPSBodWU7CisJdXZkLT52cGljLmJyaWdodG5lc3MgPSBicmlnaHRuZXNzOworCXV2ZC0+dnBpYy5jb250cmFzdCA9IGNvbnRyYXN0OworCXV2ZC0+dnBpYy53aGl0ZW5lc3MgPSB3aGl0ZW5lc3M7CisJdXZkLT52cGljLmRlcHRoID0gMjQ7CisJdXZkLT52cGljLnBhbGV0dGUgPSBWSURFT19QQUxFVFRFX1JHQjI0OworCisJbWVtc2V0KCZ1dmQtPnZjYXAsIDAsIHNpemVvZih1dmQtPnZjYXApKTsKKwlzdHJjcHkodXZkLT52Y2FwLm5hbWUsICJRQ00gVVNCIENhbWVyYSIpOworCXV2ZC0+dmNhcC50eXBlID0gVklEX1RZUEVfQ0FQVFVSRTsKKwl1dmQtPnZjYXAuY2hhbm5lbHMgPSAxOworCXV2ZC0+dmNhcC5hdWRpb3MgPSAwOworCisJdXZkLT52Y2FwLm1pbndpZHRoID0gY2FtZXJhX3NpemVzW1NJWkVfMTYwWDEyMF0ud2lkdGg7CisJdXZkLT52Y2FwLm1pbmhlaWdodCA9IGNhbWVyYV9zaXplc1tTSVpFXzE2MFgxMjBdLmhlaWdodDsKKwl1dmQtPnZjYXAubWF4d2lkdGggPSBjYW1lcmFfc2l6ZXNbU0laRV8zMjBYMjQwXS53aWR0aDsKKwl1dmQtPnZjYXAubWF4aGVpZ2h0ID0gY2FtZXJhX3NpemVzW1NJWkVfMzIwWDI0MF0uaGVpZ2h0OworCisJbWVtc2V0KCZ1dmQtPnZjaGFuLCAwLCBzaXplb2YodXZkLT52Y2hhbikpOworCXV2ZC0+dmNoYW4uZmxhZ3MgPSAwIDsKKwl1dmQtPnZjaGFuLnR1bmVycyA9IDA7CisJdXZkLT52Y2hhbi5jaGFubmVsID0gMDsKKwl1dmQtPnZjaGFuLnR5cGUgPSBWSURFT19UWVBFX0NBTUVSQTsKKwlzdHJjcHkodXZkLT52Y2hhbi5uYW1lLCAiQ2FtZXJhIik7CisKKwlDSEVDS19SRVQocmV0LCBxY21fc2Vuc29yX2luaXQodXZkKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcWNtX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLAorCQkJY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmRldmlkKQoreworCWludCBlcnI7CisJc3RydWN0IHV2ZCAqdXZkOworCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOworCXN0cnVjdCBxY20gKmNhbTsKKwlzaXplX3QgYnVmZmVyX3NpemU7CisJdW5zaWduZWQgY2hhciB2aWRlb19lcDsKKwlzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICppbnRlcmZhY2U7CisJc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplbmRwb2ludDsKKwlpbnQgaSxqOworCXVuc2lnbmVkIGludCBpZmFjZW51bSwgaWZhY2VudW1faW5hY3Q9MDsKKwlfX2xlMTYgc2Vuc29yX2lkOworCisJLyogd2UgZG9uJ3Qgc3VwcG9ydCBtdWx0aWNvbmZpZyBjYW1zICovCisJaWYgKGRldi0+ZGVzY3JpcHRvci5iTnVtQ29uZmlndXJhdGlvbnMgIT0gMSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBmaXJzdCBjaGVjayBmb3IgdGhlIHZpZGVvIGludGVyZmFjZSBhbmQgbm90CisJKiB0aGUgYXVkaW8gaW50ZXJmYWNlICovCisJaW50ZXJmYWNlID0gJmludGYtPmN1cl9hbHRzZXR0aW5nWzBdOworCWlmICgoaW50ZXJmYWNlLT5kZXNjLmJJbnRlcmZhY2VDbGFzcyAhPSBVU0JfQ0xBU1NfVkVORE9SX1NQRUMpCisJCXx8IChpbnRlcmZhY2UtPmRlc2MuYkludGVyZmFjZVN1YkNsYXNzICE9CisJCQlVU0JfQ0xBU1NfVkVORE9SX1NQRUMpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qCisJd2FsayB0aHJvdWdoIGVhY2ggZW5kcG9pbnQgaW4gZWFjaCBzZXR0aW5nIGluIHRoZSBpbnRlcmZhY2UKKwlzdG9wIHdoZW4gd2UgZmluZCB0aGUgb25lIHRoYXQncyBhbiBpc29jaHJvbm91cyBJTiBlbmRwb2ludC4KKwkqLworCWZvciAoaT0wOyBpIDwgaW50Zi0+bnVtX2FsdHNldHRpbmc7IGkrKykgeworCQlpbnRlcmZhY2UgPSAmaW50Zi0+Y3VyX2FsdHNldHRpbmdbaV07CisJCWlmYWNlbnVtID0gaW50ZXJmYWNlLT5kZXNjLmJBbHRlcm5hdGVTZXR0aW5nOworCQkvKiB3YWxrIHRoZSBlbmQgcG9pbnRzICovCisJCWZvciAoaj0wOyBqIDwgaW50ZXJmYWNlLT5kZXNjLmJOdW1FbmRwb2ludHM7IGorKykgeworCQkJZW5kcG9pbnQgPSAmaW50ZXJmYWNlLT5lbmRwb2ludFtqXS5kZXNjOworCisJCQlpZiAoKGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzICYKKwkJCQlVU0JfRU5EUE9JTlRfRElSX01BU0spICE9IFVTQl9ESVJfSU4pCisJCQkJY29udGludWU7IC8qIG5vdCBpbnB1dCB0aGVuIG5vdCBnb29kICovCisKKwkJCWJ1ZmZlcl9zaXplID0gbGUxNl90b19jcHUoZW5kcG9pbnQtPndNYXhQYWNrZXRTaXplKTsKKwkJCWlmICghYnVmZmVyX3NpemUpIHsKKwkJCQlpZmFjZW51bV9pbmFjdCA9IGlmYWNlbnVtOworCQkJCWNvbnRpbnVlOyAvKiAwIHBrdCBzaXplIGlzIG5vdCB3aGF0IHdlIHdhbnQgKi8KKwkJCX0KKworCQkJaWYgKChlbmRwb2ludC0+Ym1BdHRyaWJ1dGVzICYKKwkJCQlVU0JfRU5EUE9JTlRfWEZFUlRZUEVfTUFTSykgPT0KKwkJCQlVU0JfRU5EUE9JTlRfWEZFUl9JU09DKSB7CisJCQkJdmlkZW9fZXAgPSBlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzczsKKwkJCQkvKiBicmVhayBvdXQgb2YgdGhlIHNlYXJjaCAqLworCQkJCWdvdG8gZ29vZF92aWRlb2VwOworCQkJfQorCQl9CisJfQorCS8qIGZhaWxlZCBvdXQgc2luY2Ugbm90aGluZyB1c2VmdWwgd2FzIGZvdW5kICovCisJZXJyKCJObyBzdWl0YWJsZSBlbmRwb2ludCB3YXMgZm91bmRcbiIpOworCXJldHVybiAtRU5PREVWOworCitnb29kX3ZpZGVvZXA6CisJLyogZGlzYWJsZSBpc29jaHJvbm91cyBzdHJlYW0gYmVmb3JlIGRvaW5nIGFueXRoaW5nIGVsc2UgKi8KKwllcnIgPSBxY21fc3R2X3NldGIoZGV2LCBTVFZfSVNPX0VOQUJMRSwgMCk7CisJaWYgKGVyciA8IDApIHsKKwkJZXJyKCJGYWlsZWQgdG8gZGlzYWJsZSBzZW5zb3Igc3RyZWFtIik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qCisJQ2hlY2sgdGhhdCB0aGlzIGlzIHRoZSBzYW1lIHVua25vd24gc2Vuc29yIHRoYXQgaXMga25vd24gdG8gd29yay4gVGhpcworCXNlbnNvciBpcyBzdXNwZWN0ZWQgdG8gYmUgdGhlIFNUIFZWNjQyMkMwMDEuIEknbGwgY2hlY2sgdGhlIHNhbWUgdmFsdWUKKwl0aGF0IHRoZSBxYy11c2IgZHJpdmVyIGNoZWNrcy4gVGhpcyB2YWx1ZSBpcyBwcm9iYWJseSBub3QgZXZlbiB0aGUKKwlzZW5zb3IgSUQgc2luY2UgaXQgbWF0Y2hlcyB0aGUgVVNCIGRldiBJRC4gT2ggd2VsbC4gSWYgaXQgZG9lc24ndAorCW1hdGNoLCBpdCdzIHByb2JhYmx5IGEgZGlmZiBzZW5zb3Igc28gZXhpdCBhbmQgYXBvbG9naXplLgorCSovCisJZXJyID0gcWNtX3N0dl9nZXR3KGRldiwgQ01PU19TRU5TT1JfSURSRVYsICZzZW5zb3JfaWQpOworCWlmIChlcnIgPCAwKSB7CisJCWVycigiQ291bGRuJ3QgcmVhZCBzZW5zb3IgdmFsdWVzLiBFcnIgJWRcbiIsZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJaWYgKHNlbnNvcl9pZCAhPSBjcHVfdG9fbGUxNigweDA4RjApKSB7CisJCWVycigiU2Vuc29yIElEICV4ICE9ICV4LiBVbnN1cHBvcnRlZC4gU29ycnlcbiIsCisJCQlsZTE2X3RvX2NwdShzZW5zb3JfaWQpLCAoMHgwOEYwKSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXV2ZCA9IHVzYnZpZGVvX0FsbG9jYXRlRGV2aWNlKGNhbXMpOworCWlmICghdXZkKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNhbSA9IChzdHJ1Y3QgcWNtICopIHV2ZC0+dXNlcl9kYXRhOworCisJLyogYnVmIGZvciBkb2luZyBkZW1vc2FpY2luZyAqLworCWNhbS0+c2NyYXRjaCA9IGttYWxsb2MoMzI0KjIsIEdGUF9LRVJORUwpOworCWlmICghY2FtLT5zY3JhdGNoKSAvKiB1dmQgZnJlZWQgaW4gZGVyZWcgKi8KKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiB5ZXMsIGlmIHdlIGZhaWwgYWZ0ZXIgaGVyZSwgY2FtLT5zY3JhdGNoIGdldHMgZnJlZWQKKwlieSBxY21fZnJlZV91dmQgKi8KKworCWVyciA9IHFjbV9hbGxvY19pbnRfdXJiKGNhbSk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwkvKiB5ZXMsIGlmIHdlIGZhaWwgYWZ0ZXIgaGVyZSwgaW50IHVyYiBnZXRzIGZyZWVkCisJYnkgcWNtX2ZyZWVfdXZkICovCisKKwlSRVNUUklDVF9UT19SQU5HRShzaXplLCBTSVpFXzE2MFgxMjAsIFNJWkVfMzIwWDI0MCk7CisJY2FtLT53aWR0aCA9IGNhbWVyYV9zaXplc1tzaXplXS53aWR0aDsKKwljYW0tPmhlaWdodCA9IGNhbWVyYV9zaXplc1tzaXplXS5oZWlnaHQ7CisJY2FtLT5zaXplID0gc2l6ZTsKKworCXV2ZC0+ZGVidWcgPSBkZWJ1ZzsKKwl1dmQtPmZsYWdzID0gMDsKKwl1dmQtPmRldiA9IGRldjsKKwl1dmQtPmlmYWNlID0gaW50Zi0+YWx0c2V0dGluZy0+ZGVzYy5iSW50ZXJmYWNlTnVtYmVyOworCXV2ZC0+aWZhY2VBbHRBY3RpdmUgPSBpZmFjZW51bTsKKwl1dmQtPmlmYWNlQWx0SW5hY3RpdmUgPSBpZmFjZW51bV9pbmFjdDsKKwl1dmQtPnZpZGVvX2VuZHAgPSB2aWRlb19lcDsKKwl1dmQtPmlzb19wYWNrZXRfbGVuID0gYnVmZmVyX3NpemU7CisJdXZkLT5wYWxldHRlQml0cyA9IDFMIDw8IFZJREVPX1BBTEVUVEVfUkdCMjQ7CisJdXZkLT5kZWZhdWx0UGFsZXR0ZSA9IFZJREVPX1BBTEVUVEVfUkdCMjQ7CisJdXZkLT5jYW52YXMgPSBWSURFT1NJWkUoMzIwLCAyNDApOworCXV2ZC0+dmlkZW9zaXplID0gVklERU9TSVpFKGNhbS0+d2lkdGgsIGNhbS0+aGVpZ2h0KTsKKwllcnIgPSBxY21fY29uZmlndXJlX3ZpZGVvKHV2ZCk7CisJaWYgKGVycikgeworCQllcnIoImZhaWxlZCB0byBjb25maWd1cmUgdmlkZW8gc2V0dGluZ3MiKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwllcnIgPSB1c2J2aWRlb19SZWdpc3RlclZpZGVvRGV2aWNlKHV2ZCk7CisJaWYgKGVycikgeyAvKiB0aGUgdXZkIGdldHMgZnJlZWQgaW4gRGVyZWdpc3RlciAqLworCQllcnIoInVzYnZpZGVvX1JlZ2lzdGVyVmlkZW9EZXZpY2UoKSBmYWlsZWQuIik7CisJCXJldHVybiBlcnI7CisJfQorCisJdXZkLT5tYXhfZnJhbWVfc2l6ZSA9ICgzMjAgKiAyNDAgKiAzKTsKKwlxY21fcmVnaXN0ZXJfaW5wdXQoY2FtLCBkZXYpOworCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgdXZkKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcWNtX2ZyZWVfdXZkKHN0cnVjdCB1dmQgKnV2ZCkKK3sKKwlzdHJ1Y3QgcWNtICpjYW0gPSAoc3RydWN0IHFjbSAqKSB1dmQtPnVzZXJfZGF0YTsKKworCWtmcmVlKGNhbS0+c2NyYXRjaCk7CisJcWNtX3VucmVnaXN0ZXJfaW5wdXQoY2FtKTsKKwlxY21fZnJlZV9pbnQoY2FtKTsKK30KKworc3RhdGljIHN0cnVjdCB1c2J2aWRlb19jYiBxY21fZHJpdmVyID0geworCS5wcm9iZSA9IAkJcWNtX3Byb2JlLAorCS5zZXR1cE9uT3BlbiA9IAkJcWNtX3NldHVwX29uX29wZW4sCisJLnByb2Nlc3NEYXRhID0gCQlxY21fcHJvY2Vzc19pc29jLAorCS5zZXRWaWRlb01vZGUgPSAJcWNtX3NldF92aWRlb19tb2RlLAorCS5zdGFydERhdGFQdW1wID0gCXFjbV9zdGFydF9kYXRhLAorCS5zdG9wRGF0YVB1bXAgPSAJcWNtX3N0b3BfZGF0YSwKKwkuYWRqdXN0UGljdHVyZSA9IAlxY21fYWRqdXN0X3BpY3R1cmUsCisJLnVzZXJGcmVlID0gCQlxY21fZnJlZV91dmQKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHFjbV9pbml0KHZvaWQpCit7CisJaW5mbyhEUklWRVJfREVTQyAiICIgRFJJVkVSX1ZFUlNJT04pOworCisJcmV0dXJuIHVzYnZpZGVvX3JlZ2lzdGVyKAorCQkmY2FtcywKKwkJTUFYX0NBTUVSQVMsCisJCXNpemVvZihzdHJ1Y3QgcWNtKSwKKwkJIlFDTSIsCisJCSZxY21fZHJpdmVyLAorCQlUSElTX01PRFVMRSwKKwkJcWNtX3RhYmxlKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHFjbV9leGl0KHZvaWQpCit7CisJdXNidmlkZW9fRGVyZWdpc3RlcigmY2Ftcyk7Cit9CisKK21vZHVsZV9wYXJhbShzaXplLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhzaXplLCAiSW5pdGlhbCBTaXplIDA6IDE2MHgxMjAgMTogMzIweDI0MCIpOworbW9kdWxlX3BhcmFtKGNvbG91ciwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoY29sb3VyLCAiSW5pdGlhbCBjb2xvdXIiKTsKK21vZHVsZV9wYXJhbShodWUsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGh1ZSwgIkluaXRpYWwgaHVlIik7Cittb2R1bGVfcGFyYW0oYnJpZ2h0bmVzcywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoYnJpZ2h0bmVzcywgIkluaXRpYWwgYnJpZ2h0bmVzcyIpOworbW9kdWxlX3BhcmFtKGNvbnRyYXN0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhjb250cmFzdCwgIkluaXRpYWwgY29udHJhc3QiKTsKK21vZHVsZV9wYXJhbSh3aGl0ZW5lc3MsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHdoaXRlbmVzcywgIkluaXRpYWwgd2hpdGVuZXNzIik7CisKKyNpZmRlZiBDT05GSUdfVVNCX0RFQlVHCittb2R1bGVfcGFyYW0oZGVidWcsIGludCwgU19JUlVHTyB8IFNfSVdVU1IpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkRlYnVnIGxldmVsOiAwLTkgKGRlZmF1bHQ9MCkiKTsKKyNlbmRpZgorCittb2R1bGVfaW5pdChxY21faW5pdCk7Cittb2R1bGVfZXhpdChxY21fZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIkpheWEgS3VtYXIiKTsKK01PRFVMRV9ERVNDUklQVElPTigiUUNNIFVTQiBDYW1lcmEiKTsKK01PRFVMRV9TVVBQT1JURURfREVWSUNFKCJRQ00gVVNCIENhbWVyYSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aWRlby9xdWlja2NhbV9tZXNzZW5nZXIuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlkZW8vcXVpY2tjYW1fbWVzc2VuZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFhYjljMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlkZW8vcXVpY2tjYW1fbWVzc2VuZ2VyLmgKQEAgLTAsMCArMSwxMjYgQEAKKyNpZm5kZWYgcXVpY2tjYW1fbWVzc2VuZ2VyX2gKKyNkZWZpbmUgcXVpY2tjYW1fbWVzc2VuZ2VyX2gKKworI2lmbmRlZiBDT05GSUdfSU5QVVQKKy8qIGlmIHdlJ3JlIG5vdCB1c2luZyBpbnB1dCB3ZSBkdW1teSBvdXQgdGhlc2UgZnVuY3Rpb25zICovCisjZGVmaW5lIHFjbV9yZWdpc3Rlcl9pbnB1dCguLi4pCisjZGVmaW5lIHFjbV91bnJlZ2lzdGVyX2lucHV0KC4uLikKKyNkZWZpbmUgcWNtX3JlcG9ydF9idXR0b25zdGF0KC4uLikKKyNkZWZpbmUgcWNtX3NldHVwX2lucHV0X2ludCguLi4pIDAKKyNkZWZpbmUgcWNtX3N0b3BfaW50X2RhdGEoLi4uKQorI2RlZmluZSBxY21fYWxsb2NfaW50X3VyYiguLi4pIDAKKyNkZWZpbmUgcWNtX2ZyZWVfaW50KC4uLikKKyNlbmRpZgorCisKKyNkZWZpbmUgQ0hFQ0tfUkVUKHJldCwgZXhwcikgXAorCWlmICgocmV0ID0gZXhwcikgPCAwKSByZXR1cm4gcmV0CisKKy8qIENvbnRyb2wgUmVnaXN0ZXJzIGZvciB0aGUgU1RWVjY0MjIgQVNJQworICogLSB0aGlzIGRlZmluZSBpcyB0YWtlbiBmcm9tIHRoZSBxYy11c2ItbWVzc2VuZ2VyIGNvZGUKKyAqLworI2RlZmluZSBTVFZfSVNPX0VOQUJMRQkJMHgxNDQwCisjZGVmaW5lIElTT0NfUEFDS0VUX1NJWkUJMTAyMworCisvKiBDaGlwIGlkZW50aWZpY2F0aW9uIG51bWJlciBpbmNsdWRpbmcgcmV2aXNpb24gaW5kaWNhdG9yICovCisjZGVmaW5lIENNT1NfU0VOU09SX0lEUkVWCTB4RTAwQQorCitzdHJ1Y3QgcmdiIHsKKwl1OCBiOworCXU4IGc7CisJdTggcjsKKwl1OCBiMjsKKwl1OCBnMjsKKwl1OCByMjsKK307CisKK3N0cnVjdCBiYXlMMCB7CisjaWZkZWYgX19CSUdfRU5ESUFOCisJdTggcjsKKwl1OCBnOworI2VsaWYgX19MSVRUTEVfRU5ESUFOCisJdTggZzsKKwl1OCByOworI2Vsc2UKKyNlcnJvciBub3QgYnl0ZSBvcmRlciBkZWZpbmVkCisjZW5kaWYKK307CisKK3N0cnVjdCBiYXlMMSB7CisjaWZkZWYgX19CSUdfRU5ESUFOCisJdTggZzsKKwl1OCBiOworI2VsaWYgX19MSVRUTEVfRU5ESUFOCisJdTggYjsKKwl1OCBnOworI2Vsc2UKKyNlcnJvciBub3QgYnl0ZSBvcmRlciBkZWZpbmVkCisjZW5kaWYKK307CisKK3N0cnVjdCBjYW1fc2l6ZSB7CisJdTE2CXdpZHRoOworCXUxNgloZWlnaHQ7CisJdTgJY21kOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjYW1fc2l6ZSBjYW1lcmFfc2l6ZXNbXSA9IHsKKwl7IDE2MCwgMTIwLCAweGYgfSwKKwl7IDMyMCwgMjQwLCAweDIgfSwKK307CisKK2VudW0gZnJhbWVfc2l6ZXMgeworCVNJWkVfMTYwWDEyMAk9IDAsCisJU0laRV8zMjBYMjQwCT0gMSwKK307CisKKyNkZWZpbmUgTUFYX0ZSQU1FX1NJWkUgU0laRV8zMjBYMjQwCisKK3N0cnVjdCBxY20geworCXUxNiBjb2xvdXI7CisJdTE2IGh1ZTsKKwl1MTYgYnJpZ2h0bmVzczsKKwl1MTYgY29udHJhc3Q7CisJdTE2IHdoaXRlbmVzczsKKworCXU4IHNpemU7CisJaW50IGhlaWdodDsKKwlpbnQgd2lkdGg7CisJdTggKnNjcmF0Y2g7CisJc3RydWN0IHVyYiAqYnV0dG9uX3VyYjsKKwl1OCBidXR0b25fc3RzOworCXU4IGJ1dHRvbl9zdHNfYnVmOworCisjaWZkZWYgQ09ORklHX0lOUFVUCisJc3RydWN0IGlucHV0X2RldiAqaW5wdXQ7CisJY2hhciBpbnB1dF9waHlzbmFtZVs2NF07CisjZW5kaWYKK307CisKK3N0cnVjdCByZWd2YWwgeworCXUxNiByZWc7CisJdTggdmFsOworfTsKKy8qIHRoaXMgdGFibGUgaXMgZGVyaXZlZCBmcm9tIHRoZQorcWMtdXNiLW1lc3NlbmdlciBjb2RlICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ3ZhbCByZWd2YWxfdGFibGVbXSA9IHsKKwl7IFNUVl9JU09fRU5BQkxFLCAweDAwIH0sCisJeyAweDE0MzYsIDB4MDAgfSwgeyAweDE0MzIsIDB4MDMgfSwKKwl7IDB4MTQzYSwgMHhGOSB9LCB7IDB4MDUwOSwgMHgzOCB9LAorCXsgMHgwNTBhLCAweDM4IH0sIHsgMHgwNTBiLCAweDM4IH0sCisJeyAweDA1MGMsIDB4MkEgfSwgeyAweDA1MGQsIDB4MDEgfSwKKwl7IDB4MTQzMSwgMHgwMCB9LCB7IDB4MTQzMywgMHgzNCB9LAorCXsgMHgxNDM4LCAweDE4IH0sIHsgMHgxNDM5LCAweDAwIH0sCisJeyAweDE0M2IsIDB4MDUgfSwgeyAweDE0M2MsIDB4MDAgfSwKKwl7IDB4MTQzZSwgMHgwMSB9LCB7IDB4MTQzZCwgMHgwMCB9LAorCXsgMHgxNDQyLCAweGUyIH0sIHsgMHgxNTAwLCAweGQwIH0sCisJeyAweDE1MDAsIDB4ZDAgfSwgeyAweDE1MDAsIDB4NTAgfSwKKwl7IDB4MTUwMSwgMHhhZiB9LCB7IDB4MTUwMiwgMHhjMiB9LAorCXsgMHgxNTAzLCAweDQ1IH0sIHsgMHgxNTA1LCAweDAyIH0sCisJeyAweDE1MGUsIDB4OGUgfSwgeyAweDE1MGYsIDB4MzcgfSwKKwl7IDB4MTVjMCwgMHgwMCB9LAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbWFya2VyW10gPSB7IDB4MDAsIDB4ZmYsIDB4MDAsIDB4RkYgfTsKKworI2VuZGlmIC8qIHF1aWNrY2FtX21lc3Nlbmdlcl9oICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpZGVvL3VzYnZpZGVvLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpZGVvL3VzYnZpZGVvLmgKaW5kZXggM2NiZjRmYy4uNDlkYmVlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aWRlby91c2J2aWRlby5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlkZW8vdXNidmlkZW8uaApAQCAtMTgsNiArMTgsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMS1jb21wYXQuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMS1jb21wYXQuYwppbmRleCA0NzRhMjliLi4xOWQzYzIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDEtY29tcGF0LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby92NGwxLWNvbXBhdC5jCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgogCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItY29tbW9uLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItY29tbW9uLmMKaW5kZXggZDMzMGZhOS4uZjRiM2Q2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLWNvbW1vbi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1jb21tb24uYwpAQCAtNTksNiArNTksNyBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvX2RlY29kZXIuaD4KKyNkZWZpbmUgX19PTERfVklESU9DXyAvKiBUbyBhbGxvdyBmaXhpbmcgb2xkIGNhbGxzKi8KICNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgogCiAjaWZkZWYgQ09ORklHX0tNT0QKQEAgLTI5Myw3ICsyOTQsMTAgQEAKICNpZiAxCiAJW19JT0NfTlIoVklESU9DX0dfU0xJQ0VEX1ZCSV9DQVApXSA9ICJWSURJT0NfR19TTElDRURfVkJJX0NBUCIsCiAjZW5kaWYKLQlbX0lPQ19OUihWSURJT0NfTE9HX1NUQVRVUyldICAgICAgID0gIlZJRElPQ19MT0dfU1RBVFVTIgorCVtfSU9DX05SKFZJRElPQ19MT0dfU1RBVFVTKV0gICAgICAgPSAiVklESU9DX0xPR19TVEFUVVMiLAorCVtfSU9DX05SKFZJRElPQ19HX0VYVF9DVFJMUyldICAgICAgPSAiVklESU9DX0dfRVhUX0NUUkxTIiwKKwlbX0lPQ19OUihWSURJT0NfU19FWFRfQ1RSTFMpXSAgICAgID0gIlZJRElPQ19TX0VYVF9DVFJMUyIsCisJW19JT0NfTlIoVklESU9DX1RSWV9FWFRfQ1RSTFMpXSAgICA9ICJWSURJT0NfVFJZX0VYVF9DVFJMUyIKIH07CiAjZGVmaW5lIFY0TDJfSU9DVExTIEFSUkFZX1NJWkUodjRsMl9pb2N0bHMpCiAKQEAgLTMzMSw3ICszMzUsOCBAQAogCVtfSU9DX05SKFZJRElPQ19JTlRfU19BVURJT19ST1VUSU5HKV0gID0gIlZJRElPQ19JTlRfU19BVURJT19ST1VUSU5HIiwKIAlbX0lPQ19OUihWSURJT0NfSU5UX0dfQVVESU9fUk9VVElORyldICA9ICJWSURJT0NfSU5UX0dfQVVESU9fUk9VVElORyIsCiAJW19JT0NfTlIoVklESU9DX0lOVF9TX1ZJREVPX1JPVVRJTkcpXSAgPSAiVklESU9DX0lOVF9TX1ZJREVPX1JPVVRJTkciLAotCVtfSU9DX05SKFZJRElPQ19JTlRfR19WSURFT19ST1VUSU5HKV0gID0gIlZJRElPQ19JTlRfR19WSURFT19ST1VUSU5HIgorCVtfSU9DX05SKFZJRElPQ19JTlRfR19WSURFT19ST1VUSU5HKV0gID0gIlZJRElPQ19JTlRfR19WSURFT19ST1VUSU5HIiwKKwlbX0lPQ19OUihWSURJT0NfSU5UX1NfQ1JZU1RBTF9GUkVRKV0gICA9ICJWSURJT0NfSU5UX1NfQ1JZU1RBTF9GUkVRIgogfTsKICNkZWZpbmUgVjRMMl9JTlRfSU9DVExTIEFSUkFZX1NJWkUodjRsMl9pbnRfaW9jdGxzKQogCkBAIC00MjMsNyArNDI4LDkgQEAKIAljYXNlIFRVTkVSX1NFVF9UWVBFX0FERFI6CiAJY2FzZSBUVU5FUl9TRVRfU1RBTkRCWToKIAljYXNlIFREQTk4ODdfU0VUX0NPTkZJRzoKKyNpZmRlZiBfX09MRF9WSURJT0NfCiAJY2FzZSBWSURJT0NfT1ZFUkxBWV9PTEQ6CisjZW5kaWYKIAljYXNlIFZJRElPQ19TVFJFQU1PRkY6CiAJY2FzZSBWSURJT0NfR19PVVRQVVQ6CiAJY2FzZSBWSURJT0NfU19PVVRQVVQ6CkBAIC00MzksNyArNDQ2LDkgQEAKIAljYXNlIFZJRElPQ19HX0FVRElPOgogCWNhc2UgVklESU9DX1NfQVVESU86CiAJY2FzZSBWSURJT0NfRU5VTUFVRElPOgorI2lmZGVmIF9fT0xEX1ZJRElPQ18KIAljYXNlIFZJRElPQ19HX0FVRElPX09MRDoKKyNlbmRpZgogCXsKIAkJc3RydWN0IHY0bDJfYXVkaW8gKnA9YXJnOwogCkBAIC00NTAsNyArNDU5LDkgQEAKIAljYXNlIFZJRElPQ19HX0FVRE9VVDoKIAljYXNlIFZJRElPQ19TX0FVRE9VVDoKIAljYXNlIFZJRElPQ19FTlVNQVVET1VUOgorI2lmZGVmIF9fT0xEX1ZJRElPQ18KIAljYXNlIFZJRElPQ19HX0FVRE9VVF9PTEQ6CisjZW5kaWYKIAl7CiAJCXN0cnVjdCB2NGwyX2F1ZGlvb3V0ICpwPWFyZzsKIAkJcHJpbnRrICgiJXM6IGluZGV4PSVkLCBuYW1lPSVzLCBjYXBhYmlsaXR5PSVkLCBtb2RlPSVkXG4iLCBzLApAQCAtNDc4LDkgKzQ4OSw5IEBACiAJCQkJcHJ0X25hbWVzKHAtPm1lbW9yeSx2NGwyX21lbW9yeV9uYW1lcyksCiAJCQkJcC0+bS51c2VycHRyKTsKIAkJcHJpbnRrICgiJXM6IHRpbWVjb2RlPSAlMDJkOiUwMmQ6JTAyZCB0eXBlPSVkLCAiCi0JCQkiZmxhZ3M9MHglMDh4LCBmcmFtZXM9JWQsIHVzZXJiaXRzPTB4JXBcbiIsCisJCQkiZmxhZ3M9MHglMDh4LCBmcmFtZXM9JWQsIHVzZXJiaXRzPTB4JTA4eFxuIiwKIAkJCQlzLHRjLT5ob3Vycyx0Yy0+bWludXRlcyx0Yy0+c2Vjb25kcywKLQkJCQl0Yy0+dHlwZSwgdGMtPmZsYWdzLCB0Yy0+ZnJhbWVzLCB0Yy0+dXNlcmJpdHMpOworCQkJCXRjLT50eXBlLCB0Yy0+ZmxhZ3MsIHRjLT5mcmFtZXMsICooX191MzIgKikgdGMtPnVzZXJiaXRzKTsKIAkJYnJlYWs7CiAJfQogCWNhc2UgVklESU9DX1FVRVJZQ0FQOgpAQCAtNDk1LDEyICs1MDYsMzEgQEAKIAl9CiAJY2FzZSBWSURJT0NfR19DVFJMOgogCWNhc2UgVklESU9DX1NfQ1RSTDoKKyNpZmRlZiBfX09MRF9WSURJT0NfCiAJY2FzZSBWSURJT0NfU19DVFJMX09MRDoKKyNlbmRpZgogCXsKIAkJc3RydWN0IHY0bDJfY29udHJvbCAqcD1hcmc7CiAJCXByaW50ayAoIiVzOiBpZD0lZCwgdmFsdWU9JWRcbiIsIHMsIHAtPmlkLCBwLT52YWx1ZSk7CiAJCWJyZWFrOwogCX0KKwljYXNlIFZJRElPQ19HX0VYVF9DVFJMUzoKKwljYXNlIFZJRElPQ19TX0VYVF9DVFJMUzoKKwljYXNlIFZJRElPQ19UUllfRVhUX0NUUkxTOgorCXsKKwkJc3RydWN0IHY0bDJfZXh0X2NvbnRyb2xzICpwID0gYXJnOworCQlpbnQgaTsKKworCQlwcmludGsoIiVzOiBjdHJsX2NsYXNzPSVkLCBjb3VudD0lZFxuIiwgcywgcC0+Y3RybF9jbGFzcywgcC0+Y291bnQpOworCQlmb3IgKGkgPSAwOyBpIDwgcC0+Y291bnQ7IGkrKykgeworCQkJc3RydWN0IHY0bDJfZXh0X2NvbnRyb2wgKmMgPSAmcC0+Y29udHJvbHNbaV07CisJCQlpZiAoY21kID09IFZJRElPQ19HX0VYVF9DVFJMUykKKwkJCQlwcmludGsoIiVzOiBpZD0lZFxuIiwgcywgYy0+aWQpOworCQkJZWxzZQorCQkJCXByaW50aygiJXM6IGlkPSVkLCB2YWx1ZT0lZFxuIiwgcywgYy0+aWQsIGMtPnZhbHVlKTsKKwkJfQorCQlicmVhazsKKwl9CiAJY2FzZSBWSURJT0NfR19DUk9QOgogCWNhc2UgVklESU9DX1NfQ1JPUDoKIAl7CkBAIC01MTAsNyArNTQwLDkgQEAKIAkJYnJlYWs7CiAJfQogCWNhc2UgVklESU9DX0NST1BDQVA6CisjaWZkZWYgX19PTERfVklESU9DXwogCWNhc2UgVklESU9DX0NST1BDQVBfT0xEOgorI2VuZGlmCiAJewogCQlzdHJ1Y3QgdjRsMl9jcm9wY2FwICpwPWFyZzsKIAkJLypGSVhNRTogU2hvdWxkIGFsc28gc2hvdyByZWN0IHN0cnVjdHMgKi8KQEAgLTY2Nyw2ICs2OTksMTIgQEAKIAkJcHJpbnRrICgiJXM6IGlucHV0PTB4JXgsIG91dHB1dD0weCV4XG4iLCBzLCBwLT5pbnB1dCwgcC0+b3V0cHV0KTsKIAkJYnJlYWs7CiAJfQorCWNhc2UgVklESU9DX0lOVF9TX0NSWVNUQUxfRlJFUToKKwl7CisJCXN0cnVjdCB2NGwyX2NyeXN0YWxfZnJlcSAqcD1hcmc7CisJCXByaW50ayAoIiVzOiBmcmVxPSV1LCBmbGFncz0weCV4XG4iLCBzLCBwLT5mcmVxLCBwLT5mbGFncyk7CisJCWJyZWFrOworCX0KIAljYXNlIFZJRElPQ19HX1NMSUNFRF9WQklfQ0FQOgogCXsKIAkJc3RydWN0IHY0bDJfc2xpY2VkX3ZiaV9jYXAgKnA9YXJnOwpAQCAtNjk2LDcgKzczNCw5IEBACiAJfQogCWNhc2UgVklESU9DX0dfUEFSTToKIAljYXNlIFZJRElPQ19TX1BBUk06CisjaWZkZWYgX19PTERfVklESU9DXwogCWNhc2UgVklESU9DX1NfUEFSTV9PTEQ6CisjZW5kaWYKIAl7CiAJCXN0cnVjdCB2NGwyX3N0cmVhbXBhcm0gKnA9YXJnOwogCQlwcmludGsgKCIlczogdHlwZT0lZFxuIiwgcywgcC0+dHlwZSk7CkBAIC05MTUsNiArOTU1LDQ5OCBAQAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCisvKiBIZWxwZXIgZnVuY3Rpb25zIGZvciBjb250cm9sIGhhbmRsaW5nCQkJICAgICAqLworCisvKiBDaGVjayBmb3IgY29ycmVjdG5lc3Mgb2YgdGhlIGN0cmwncyB2YWx1ZSBiYXNlZCBvbiB0aGUgZGF0YSBmcm9tCisgICBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgYW5kIHRoZSBhdmFpbGFibGUgbWVudSBpdGVtcy4gTm90ZSB0aGF0CisgICBtZW51X2l0ZW1zIG1heSBiZSBOVUxMLCBpbiB0aGF0IGNhc2UgaXQgaXMgaWdub3JlZC4gKi8KK2ludCB2NGwyX2N0cmxfY2hlY2soc3RydWN0IHY0bDJfZXh0X2NvbnRyb2wgKmN0cmwsIHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWN0cmwsCisJCWNvbnN0IGNoYXIgKiptZW51X2l0ZW1zKQoreworCWlmIChxY3RybC0+ZmxhZ3MgJiBWNEwyX0NUUkxfRkxBR19ESVNBQkxFRCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHFjdHJsLT5mbGFncyAmIFY0TDJfQ1RSTF9GTEFHX0dSQUJCRUQpCisJCXJldHVybiAtRUJVU1k7CisJaWYgKHFjdHJsLT50eXBlID09IFY0TDJfQ1RSTF9UWVBFX0JVVFRPTiB8fAorCSAgICBxY3RybC0+dHlwZSA9PSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSNjQgfHwKKwkgICAgcWN0cmwtPnR5cGUgPT0gVjRMMl9DVFJMX1RZUEVfQ1RSTF9DTEFTUykKKwkJcmV0dXJuIDA7CisJaWYgKGN0cmwtPnZhbHVlIDwgcWN0cmwtPm1pbmltdW0gfHwgY3RybC0+dmFsdWUgPiBxY3RybC0+bWF4aW11bSkKKwkJcmV0dXJuIC1FUkFOR0U7CisJaWYgKHFjdHJsLT50eXBlID09IFY0TDJfQ1RSTF9UWVBFX01FTlUgJiYgbWVudV9pdGVtcyAhPSBOVUxMKSB7CisJCWlmIChtZW51X2l0ZW1zW2N0cmwtPnZhbHVlXSA9PSBOVUxMIHx8CisJCSAgICBtZW51X2l0ZW1zW2N0cmwtPnZhbHVlXVswXSA9PSAnXDAnKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCisvKiBSZXR1cm5zIE5VTEwgb3IgYSBjaGFyYWN0ZXIgcG9pbnRlciBhcnJheSBjb250YWluaW5nIHRoZSBtZW51IGZvcgorICAgdGhlIGdpdmVuIGNvbnRyb2wgSUQuIFRoZSBwb2ludGVyIGFycmF5IGVuZHMgd2l0aCBhIE5VTEwgcG9pbnRlci4KKyAgIEFuIGVtcHR5IHN0cmluZyBzaWduaWZpZXMgYSBtZW51IGVudHJ5IHRoYXQgaXMgaW52YWxpZC4gVGhpcyBhbGxvd3MKKyAgIGRyaXZlcnMgdG8gZGlzYWJsZSBjZXJ0YWluIG9wdGlvbnMgaWYgaXQgaXMgbm90IHN1cHBvcnRlZC4gKi8KK2NvbnN0IGNoYXIgKip2NGwyX2N0cmxfZ2V0X21lbnUodTMyIGlkKQoreworCXN0YXRpYyBjb25zdCBjaGFyICptcGVnX2F1ZGlvX3NhbXBsaW5nX2ZyZXFbXSA9IHsKKwkJIjQ0LjEga0h6IiwKKwkJIjQ4IGtIeiIsCisJCSIzMiBrSHoiLAorCQlOVUxMCisJfTsKKwlzdGF0aWMgY29uc3QgY2hhciAqbXBlZ19hdWRpb19lbmNvZGluZ1tdID0geworCQkiTGF5ZXIgSSIsCisJCSJMYXllciBJSSIsCisJCSJMYXllciBJSUkiLAorCQlOVUxMCisJfTsKKwlzdGF0aWMgY29uc3QgY2hhciAqbXBlZ19hdWRpb19sMV9iaXRyYXRlW10gPSB7CisJCSIzMiBrYnBzIiwKKwkJIjY0IGticHMiLAorCQkiOTYga2JwcyIsCisJCSIxMjgga2JwcyIsCisJCSIxNjAga2JwcyIsCisJCSIxOTIga2JwcyIsCisJCSIyMjQga2JwcyIsCisJCSIyNTYga2JwcyIsCisJCSIyODgga2JwcyIsCisJCSIzMjAga2JwcyIsCisJCSIzNTIga2JwcyIsCisJCSIzODQga2JwcyIsCisJCSI0MTYga2JwcyIsCisJCSI0NDgga2JwcyIsCisJCU5VTEwKKwl9OworCXN0YXRpYyBjb25zdCBjaGFyICptcGVnX2F1ZGlvX2wyX2JpdHJhdGVbXSA9IHsKKwkJIjMyIGticHMiLAorCQkiNDgga2JwcyIsCisJCSI1NiBrYnBzIiwKKwkJIjY0IGticHMiLAorCQkiODAga2JwcyIsCisJCSI5NiBrYnBzIiwKKwkJIjExMiBrYnBzIiwKKwkJIjEyOCBrYnBzIiwKKwkJIjE2MCBrYnBzIiwKKwkJIjE5MiBrYnBzIiwKKwkJIjIyNCBrYnBzIiwKKwkJIjI1NiBrYnBzIiwKKwkJIjMyMCBrYnBzIiwKKwkJIjM4NCBrYnBzIiwKKwkJTlVMTAorCX07CisJc3RhdGljIGNvbnN0IGNoYXIgKm1wZWdfYXVkaW9fbDNfYml0cmF0ZVtdID0geworCQkiMzIga2JwcyIsCisJCSI0MCBrYnBzIiwKKwkJIjQ4IGticHMiLAorCQkiNTYga2JwcyIsCisJCSI2NCBrYnBzIiwKKwkJIjgwIGticHMiLAorCQkiOTYga2JwcyIsCisJCSIxMTIga2JwcyIsCisJCSIxMjgga2JwcyIsCisJCSIxNjAga2JwcyIsCisJCSIxOTIga2JwcyIsCisJCSIyMjQga2JwcyIsCisJCSIyNTYga2JwcyIsCisJCSIzMjAga2JwcyIsCisJCU5VTEwKKwl9OworCXN0YXRpYyBjb25zdCBjaGFyICptcGVnX2F1ZGlvX21vZGVbXSA9IHsKKwkJIlN0ZXJlbyIsCisJCSJKb2ludCBTdGVyZW8iLAorCQkiRHVhbCIsCisJCSJNb25vIiwKKwkJTlVMTAorCX07CisJc3RhdGljIGNvbnN0IGNoYXIgKm1wZWdfYXVkaW9fbW9kZV9leHRlbnNpb25bXSA9IHsKKwkJIkJvdW5kIDQiLAorCQkiQm91bmQgOCIsCisJCSJCb3VuZCAxMiIsCisJCSJCb3VuZCAxNiIsCisJCU5VTEwKKwl9OworCXN0YXRpYyBjb25zdCBjaGFyICptcGVnX2F1ZGlvX2VtcGhhc2lzW10gPSB7CisJCSJObyBFbXBoYXNpcyIsCisJCSI1MC8xNSB1cyIsCisJCSJDQ0lUVCBKMTciLAorCQlOVUxMCisJfTsKKwlzdGF0aWMgY29uc3QgY2hhciAqbXBlZ19hdWRpb19jcmNbXSA9IHsKKwkJIk5vIENSQyIsCisJCSIxNi1iaXQgQ1JDIiwKKwkJTlVMTAorCX07CisJc3RhdGljIGNvbnN0IGNoYXIgKm1wZWdfdmlkZW9fZW5jb2RpbmdbXSA9IHsKKwkJIk1QRUctMSIsCisJCSJNUEVHLTIiLAorCQlOVUxMCisJfTsKKwlzdGF0aWMgY29uc3QgY2hhciAqbXBlZ192aWRlb19hc3BlY3RbXSA9IHsKKwkJIjF4MSIsCisJCSI0eDMiLAorCQkiMTZ4OSIsCisJCSIyLjIxeDEiLAorCQlOVUxMCisJfTsKKwlzdGF0aWMgY29uc3QgY2hhciAqbXBlZ192aWRlb19iaXRyYXRlX21vZGVbXSA9IHsKKwkJIlZhcmlhYmxlIEJpdHJhdGUiLAorCQkiQ29uc3RhbnQgQml0cmF0ZSIsCisJCU5VTEwKKwl9OworCXN0YXRpYyBjb25zdCBjaGFyICptcGVnX3N0cmVhbV90eXBlW10gPSB7CisJCSJNUEVHLTIgUHJvZ3JhbSBTdHJlYW0iLAorCQkiTVBFRy0yIFRyYW5zcG9ydCBTdHJlYW0iLAorCQkiTVBFRy0xIFN5c3RlbSBTdHJlYW0iLAorCQkiTVBFRy0yIERWRC1jb21wYXRpYmxlIFN0cmVhbSIsCisJCSJNUEVHLTEgVkNELWNvbXBhdGlibGUgU3RyZWFtIiwKKwkJIk1QRUctMiBTVkNELWNvbXBhdGlibGUgU3RyZWFtIiwKKwkJTlVMTAorCX07CisJc3RhdGljIGNvbnN0IGNoYXIgKm1wZWdfc3RyZWFtX3ZiaV9mbXRbXSA9IHsKKwkJIk5vIFZCSSIsCisJCSJWQkkgaW4gcHJpdmF0ZSBwYWNrZXRzLCBJVlRWIGZvcm1hdCIsCisJCU5VTEwKKwl9OworCisJc3dpdGNoIChpZCkgeworCQljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fU0FNUExJTkdfRlJFUToKKwkJCXJldHVybiBtcGVnX2F1ZGlvX3NhbXBsaW5nX2ZyZXE7CisJCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19FTkNPRElORzoKKwkJCXJldHVybiBtcGVnX2F1ZGlvX2VuY29kaW5nOworCQljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fTDFfQklUUkFURToKKwkJCXJldHVybiBtcGVnX2F1ZGlvX2wxX2JpdHJhdGU7CisJCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19MMl9CSVRSQVRFOgorCQkJcmV0dXJuIG1wZWdfYXVkaW9fbDJfYml0cmF0ZTsKKwkJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0wzX0JJVFJBVEU6CisJCQlyZXR1cm4gbXBlZ19hdWRpb19sM19iaXRyYXRlOworCQljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fTU9ERToKKwkJCXJldHVybiBtcGVnX2F1ZGlvX21vZGU7CisJCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19NT0RFX0VYVEVOU0lPTjoKKwkJCXJldHVybiBtcGVnX2F1ZGlvX21vZGVfZXh0ZW5zaW9uOworCQljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fRU1QSEFTSVM6CisJCQlyZXR1cm4gbXBlZ19hdWRpb19lbXBoYXNpczsKKwkJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0NSQzoKKwkJCXJldHVybiBtcGVnX2F1ZGlvX2NyYzsKKwkJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0VOQ09ESU5HOgorCQkJcmV0dXJuIG1wZWdfdmlkZW9fZW5jb2Rpbmc7CisJCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19BU1BFQ1Q6CisJCQlyZXR1cm4gbXBlZ192aWRlb19hc3BlY3Q7CisJCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19CSVRSQVRFX01PREU6CisJCQlyZXR1cm4gbXBlZ192aWRlb19iaXRyYXRlX21vZGU7CisJCWNhc2UgVjRMMl9DSURfTVBFR19TVFJFQU1fVFlQRToKKwkJCXJldHVybiBtcGVnX3N0cmVhbV90eXBlOworCQljYXNlIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1ZCSV9GTVQ6CisJCQlyZXR1cm4gbXBlZ19zdHJlYW1fdmJpX2ZtdDsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiBOVUxMOworCX0KK30KKworLyogRmlsbCBpbiBhIHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqLworaW50IHY0bDJfY3RybF9xdWVyeV9maWxsKHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWN0cmwsIHMzMiBtaW4sIHMzMiBtYXgsIHMzMiBzdGVwLCBzMzIgZGVmKQoreworCWNvbnN0IGNoYXIgKm5hbWU7CisKKwlxY3RybC0+ZmxhZ3MgPSAwOworCXN3aXRjaCAocWN0cmwtPmlkKSB7CisJLyogVVNFUiBjb250cm9scyAqLworCWNhc2UgVjRMMl9DSURfVVNFUl9DTEFTUzogCW5hbWUgPSAiVXNlciBDb250cm9scyI7IGJyZWFrOworCWNhc2UgVjRMMl9DSURfQVVESU9fVk9MVU1FOiAJbmFtZSA9ICJWb2x1bWUiOyBicmVhazsKKwljYXNlIFY0TDJfQ0lEX0FVRElPX01VVEU6IAluYW1lID0gIk11dGUiOyBicmVhazsKKwljYXNlIFY0TDJfQ0lEX0FVRElPX0JBTEFOQ0U6IAluYW1lID0gIkJhbGFuY2UiOyBicmVhazsKKwljYXNlIFY0TDJfQ0lEX0FVRElPX0JBU1M6IAluYW1lID0gIkJhc3MiOyBicmVhazsKKwljYXNlIFY0TDJfQ0lEX0FVRElPX1RSRUJMRTogCW5hbWUgPSAiVHJlYmxlIjsgYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9BVURJT19MT1VETkVTUzogCW5hbWUgPSAiTG91ZG5lc3MiOyBicmVhazsKKwljYXNlIFY0TDJfQ0lEX0JSSUdIVE5FU1M6IAluYW1lID0gIkJyaWdodG5lc3MiOyBicmVhazsKKwljYXNlIFY0TDJfQ0lEX0NPTlRSQVNUOiAJbmFtZSA9ICJDb250cmFzdCI7IGJyZWFrOworCWNhc2UgVjRMMl9DSURfU0FUVVJBVElPTjogCW5hbWUgPSAiU2F0dXJhdGlvbiI7IGJyZWFrOworCWNhc2UgVjRMMl9DSURfSFVFOiAJCW5hbWUgPSAiSHVlIjsgYnJlYWs7CisKKwkvKiBNUEVHIGNvbnRyb2xzICovCisJY2FzZSBWNEwyX0NJRF9NUEVHX0NMQVNTOiAJCW5hbWUgPSAiTVBFRyBFbmNvZGVyIENvbnRyb2xzIjsgYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX1NBTVBMSU5HX0ZSRVE6IG5hbWUgPSAiQXVkaW8gU2FtcGxpbmcgRnJlcXVlbmN5IjsgYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0VOQ09ESU5HOiAJbmFtZSA9ICJBdWRpbyBFbmNvZGluZyBMYXllciI7IGJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19MMV9CSVRSQVRFOiAJbmFtZSA9ICJBdWRpbyBMYXllciBJIEJpdHJhdGUiOyBicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fTDJfQklUUkFURTogCW5hbWUgPSAiQXVkaW8gTGF5ZXIgSUkgQml0cmF0ZSI7IGJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19MM19CSVRSQVRFOiAJbmFtZSA9ICJBdWRpbyBMYXllciBJSUkgQml0cmF0ZSI7IGJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19NT0RFOiAJCW5hbWUgPSAiQXVkaW8gU3RlcmVvIE1vZGUiOyBicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fTU9ERV9FWFRFTlNJT046IG5hbWUgPSAiQXVkaW8gU3RlcmVvIE1vZGUgRXh0ZW5zaW9uIjsgYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0VNUEhBU0lTOiAJbmFtZSA9ICJBdWRpbyBFbXBoYXNpcyI7IGJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19DUkM6IAkJbmFtZSA9ICJBdWRpbyBDUkMiOyBicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fRU5DT0RJTkc6IAluYW1lID0gIlZpZGVvIEVuY29kaW5nIjsgYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0FTUEVDVDogCW5hbWUgPSAiVmlkZW8gQXNwZWN0IjsgYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0JfRlJBTUVTOiAJbmFtZSA9ICJWaWRlbyBCIEZyYW1lcyI7IGJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19HT1BfU0laRTogCW5hbWUgPSAiVmlkZW8gR09QIFNpemUiOyBicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fR09QX0NMT1NVUkU6IAluYW1lID0gIlZpZGVvIEdPUCBDbG9zdXJlIjsgYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX1BVTExET1dOOiAJbmFtZSA9ICJWaWRlbyBQdWxsZG93biI7IGJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19CSVRSQVRFX01PREU6IAluYW1lID0gIlZpZGVvIEJpdHJhdGUgTW9kZSI7IGJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19CSVRSQVRFOiAJbmFtZSA9ICJWaWRlbyBCaXRyYXRlIjsgYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0JJVFJBVEVfUEVBSzogCW5hbWUgPSAiVmlkZW8gUGVhayBCaXRyYXRlIjsgYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX1RFTVBPUkFMX0RFQ0lNQVRJT046IG5hbWUgPSAiVmlkZW8gVGVtcG9yYWwgRGVjaW1hdGlvbiI7IGJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19TVFJFQU1fVFlQRTogCW5hbWUgPSAiU3RyZWFtIFR5cGUiOyBicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1BJRF9QTVQ6IAluYW1lID0gIlN0cmVhbSBQTVQgUHJvZ3JhbSBJRCI7IGJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19TVFJFQU1fUElEX0FVRElPOiAJbmFtZSA9ICJTdHJlYW0gQXVkaW8gUHJvZ3JhbSBJRCI7IGJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19TVFJFQU1fUElEX1ZJREVPOiAJbmFtZSA9ICJTdHJlYW0gVmlkZW8gUHJvZ3JhbSBJRCI7IGJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19TVFJFQU1fUElEX1BDUjogCW5hbWUgPSAiU3RyZWFtIFBDUiBQcm9ncmFtIElEIjsgYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9QRVNfSURfQVVESU86IG5hbWUgPSAiU3RyZWFtIFBFUyBBdWRpbyBJRCI7IGJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19TVFJFQU1fUEVTX0lEX1ZJREVPOiBuYW1lID0gIlN0cmVhbSBQRVMgVmlkZW8gSUQiOyBicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1ZCSV9GTVQ6CW5hbWUgPSAiU3RyZWFtIFZCSSBGb3JtYXQiOyBicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlzd2l0Y2ggKHFjdHJsLT5pZCkgeworCWNhc2UgVjRMMl9DSURfQVVESU9fTVVURToKKwljYXNlIFY0TDJfQ0lEX0FVRElPX0xPVURORVNTOgorCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19HT1BfQ0xPU1VSRToKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fUFVMTERPV046CisJCXFjdHJsLT50eXBlID0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTjsKKwkJbWluID0gMDsKKwkJbWF4ID0gc3RlcCA9IDE7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19TQU1QTElOR19GUkVROgorCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19FTkNPRElORzoKKwljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fTDFfQklUUkFURToKKwljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fTDJfQklUUkFURToKKwljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fTDNfQklUUkFURToKKwljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fTU9ERToKKwljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fTU9ERV9FWFRFTlNJT046CisJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0VNUEhBU0lTOgorCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19DUkM6CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0VOQ09ESU5HOgorCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19BU1BFQ1Q6CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0JJVFJBVEVfTU9ERToKKwljYXNlIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1RZUEU6CisJY2FzZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9WQklfRk1UOgorCQlxY3RybC0+dHlwZSA9IFY0TDJfQ1RSTF9UWVBFX01FTlU7CisJCXN0ZXAgPSAxOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX1VTRVJfQ0xBU1M6CisJY2FzZSBWNEwyX0NJRF9NUEVHX0NMQVNTOgorCQlxY3RybC0+dHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0NUUkxfQ0xBU1M7CisJCXFjdHJsLT5mbGFncyB8PSBWNEwyX0NUUkxfRkxBR19SRUFEX09OTFk7CisJCW1pbiA9IG1heCA9IHN0ZXAgPSBkZWYgPSAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlxY3RybC0+dHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVI7CisJCWJyZWFrOworCX0KKwlzd2l0Y2ggKHFjdHJsLT5pZCkgeworCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19FTkNPRElORzoKKwljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fTU9ERToKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fQklUUkFURV9NT0RFOgorCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19CX0ZSQU1FUzoKKwljYXNlIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1RZUEU6CisJCXFjdHJsLT5mbGFncyB8PSBWNEwyX0NUUkxfRkxBR19VUERBVEU7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfQVVESU9fVk9MVU1FOgorCWNhc2UgVjRMMl9DSURfQVVESU9fQkFMQU5DRToKKwljYXNlIFY0TDJfQ0lEX0FVRElPX0JBU1M6CisJY2FzZSBWNEwyX0NJRF9BVURJT19UUkVCTEU6CisJY2FzZSBWNEwyX0NJRF9CUklHSFRORVNTOgorCWNhc2UgVjRMMl9DSURfQ09OVFJBU1Q6CisJY2FzZSBWNEwyX0NJRF9TQVRVUkFUSU9OOgorCWNhc2UgVjRMMl9DSURfSFVFOgorCQlxY3RybC0+ZmxhZ3MgfD0gVjRMMl9DVFJMX0ZMQUdfU0xJREVSOworCQlicmVhazsKKwl9CisJcWN0cmwtPm1pbmltdW0gPSBtaW47CisJcWN0cmwtPm1heGltdW0gPSBtYXg7CisJcWN0cmwtPnN0ZXAgPSBzdGVwOworCXFjdHJsLT5kZWZhdWx0X3ZhbHVlID0gZGVmOworCXFjdHJsLT5yZXNlcnZlZFswXSA9IHFjdHJsLT5yZXNlcnZlZFsxXSA9IDA7CisJc25wcmludGYocWN0cmwtPm5hbWUsIHNpemVvZihxY3RybC0+bmFtZSksIG5hbWUpOworCXJldHVybiAwOworfQorCisvKiBGaWxsIGluIGEgc3RydWN0IHY0bDJfcXVlcnljdHJsIHdpdGggc3RhbmRhcmQgdmFsdWVzIGJhc2VkIG9uCisgICB0aGUgY29udHJvbCBJRC4gKi8KK2ludCB2NGwyX2N0cmxfcXVlcnlfZmlsbF9zdGQoc3RydWN0IHY0bDJfcXVlcnljdHJsICpxY3RybCkKK3sKKwlzd2l0Y2ggKHFjdHJsLT5pZCkgeworCS8qIFVTRVIgY29udHJvbHMgKi8KKwljYXNlIFY0TDJfQ0lEX1VTRVJfQ0xBU1M6CisJY2FzZSBWNEwyX0NJRF9NUEVHX0NMQVNTOgorCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsIDAsIDAsIDAsIDApOworCWNhc2UgVjRMMl9DSURfQVVESU9fVk9MVU1FOgorCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsIDAsIDY1NTM1LCA2NTUzNSAvIDEwMCwgNTg4ODApOworCWNhc2UgVjRMMl9DSURfQVVESU9fTVVURToKKwljYXNlIFY0TDJfQ0lEX0FVRElPX0xPVURORVNTOgorCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsIDAsIDEsIDEsIDApOworCWNhc2UgVjRMMl9DSURfQVVESU9fQkFMQU5DRToKKwljYXNlIFY0TDJfQ0lEX0FVRElPX0JBU1M6CisJY2FzZSBWNEwyX0NJRF9BVURJT19UUkVCTEU6CisJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChxY3RybCwgMCwgNjU1MzUsIDY1NTM1IC8gMTAwLCAzMjc2OCk7CisJY2FzZSBWNEwyX0NJRF9CUklHSFRORVNTOgorCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsIDAsIDI1NSwgMSwgMTI4KTsKKwljYXNlIFY0TDJfQ0lEX0NPTlRSQVNUOgorCWNhc2UgVjRMMl9DSURfU0FUVVJBVElPTjoKKwkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLCAwLCAxMjcsIDEsIDY0KTsKKwljYXNlIFY0TDJfQ0lEX0hVRToKKwkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLCAtMTI4LCAxMjcsIDEsIDApOworCisJLyogTVBFRyBjb250cm9scyAqLworCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19TQU1QTElOR19GUkVROgorCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsCisJCQkJVjRMMl9NUEVHX0FVRElPX1NBTVBMSU5HX0ZSRVFfNDQxMDAsCisJCQkJVjRMMl9NUEVHX0FVRElPX1NBTVBMSU5HX0ZSRVFfMzIwMDAsIDEsCisJCQkJVjRMMl9NUEVHX0FVRElPX1NBTVBMSU5HX0ZSRVFfNDgwMDApOworCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19FTkNPRElORzoKKwkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLAorCQkJCVY0TDJfTVBFR19BVURJT19FTkNPRElOR19MQVlFUl8xLAorCQkJCVY0TDJfTVBFR19BVURJT19FTkNPRElOR19MQVlFUl8zLCAxLAorCQkJCVY0TDJfTVBFR19BVURJT19FTkNPRElOR19MQVlFUl8yKTsKKwljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fTDFfQklUUkFURToKKwkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLAorCQkJCVY0TDJfTVBFR19BVURJT19MMV9CSVRSQVRFXzMySywKKwkJCQlWNEwyX01QRUdfQVVESU9fTDFfQklUUkFURV80NDhLLCAxLAorCQkJCVY0TDJfTVBFR19BVURJT19MMV9CSVRSQVRFXzI1NkspOworCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19MMl9CSVRSQVRFOgorCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsCisJCQkJVjRMMl9NUEVHX0FVRElPX0wyX0JJVFJBVEVfMzJLLAorCQkJCVY0TDJfTVBFR19BVURJT19MMl9CSVRSQVRFXzM4NEssIDEsCisJCQkJVjRMMl9NUEVHX0FVRElPX0wyX0JJVFJBVEVfMjI0Syk7CisJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0wzX0JJVFJBVEU6CisJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChxY3RybCwKKwkJCQlWNEwyX01QRUdfQVVESU9fTDNfQklUUkFURV8zMkssCisJCQkJVjRMMl9NUEVHX0FVRElPX0wzX0JJVFJBVEVfMzIwSywgMSwKKwkJCQlWNEwyX01QRUdfQVVESU9fTDNfQklUUkFURV8xOTJLKTsKKwljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fTU9ERToKKwkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLAorCQkJCVY0TDJfTVBFR19BVURJT19NT0RFX1NURVJFTywKKwkJCQlWNEwyX01QRUdfQVVESU9fTU9ERV9NT05PLCAxLAorCQkJCVY0TDJfTVBFR19BVURJT19NT0RFX1NURVJFTyk7CisJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX01PREVfRVhURU5TSU9OOgorCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsCisJCQkJVjRMMl9NUEVHX0FVRElPX01PREVfRVhURU5TSU9OX0JPVU5EXzQsCisJCQkJVjRMMl9NUEVHX0FVRElPX01PREVfRVhURU5TSU9OX0JPVU5EXzE2LCAxLAorCQkJCVY0TDJfTVBFR19BVURJT19NT0RFX0VYVEVOU0lPTl9CT1VORF80KTsKKwljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fRU1QSEFTSVM6CisJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChxY3RybCwKKwkJCQlWNEwyX01QRUdfQVVESU9fRU1QSEFTSVNfTk9ORSwKKwkJCQlWNEwyX01QRUdfQVVESU9fRU1QSEFTSVNfQ0NJVFRfSjE3LCAxLAorCQkJCVY0TDJfTVBFR19BVURJT19FTVBIQVNJU19OT05FKTsKKwljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fQ1JDOgorCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsCisJCQkJVjRMMl9NUEVHX0FVRElPX0NSQ19OT05FLAorCQkJCVY0TDJfTVBFR19BVURJT19DUkNfQ1JDMTYsIDEsCisJCQkJVjRMMl9NUEVHX0FVRElPX0NSQ19OT05FKTsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fRU5DT0RJTkc6CisJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChxY3RybCwKKwkJCQlWNEwyX01QRUdfVklERU9fRU5DT0RJTkdfTVBFR18xLAorCQkJCVY0TDJfTVBFR19WSURFT19FTkNPRElOR19NUEVHXzIsIDEsCisJCQkJVjRMMl9NUEVHX1ZJREVPX0VOQ09ESU5HX01QRUdfMik7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0FTUEVDVDoKKwkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLAorCQkJCVY0TDJfTVBFR19WSURFT19BU1BFQ1RfMXgxLAorCQkJCVY0TDJfTVBFR19WSURFT19BU1BFQ1RfMjIxeDEwMCwgMSwKKwkJCQlWNEwyX01QRUdfVklERU9fQVNQRUNUXzR4Myk7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0JfRlJBTUVTOgorCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsIDAsIDMzLCAxLCAyKTsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fR09QX1NJWkU6CisJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChxY3RybCwgMSwgMzQsIDEsIDEyKTsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fR09QX0NMT1NVUkU6CisJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChxY3RybCwgMCwgMSwgMSwgMSk7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX1BVTExET1dOOgorCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsIDAsIDEsIDEsIDApOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19CSVRSQVRFX01PREU6CisJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChxY3RybCwKKwkJCQlWNEwyX01QRUdfVklERU9fQklUUkFURV9NT0RFX1ZCUiwKKwkJCQlWNEwyX01QRUdfVklERU9fQklUUkFURV9NT0RFX0NCUiwgMSwKKwkJCQlWNEwyX01QRUdfVklERU9fQklUUkFURV9NT0RFX1ZCUik7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0JJVFJBVEU6CisJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChxY3RybCwgMCwgMjcwMDAwMDAsIDEsIDYwMDAwMDApOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19CSVRSQVRFX1BFQUs6CisJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChxY3RybCwgMCwgMjcwMDAwMDAsIDEsIDgwMDAwMDApOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19URU1QT1JBTF9ERUNJTUFUSU9OOgorCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsIDAsIDI1NSwgMSwgMCk7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9UWVBFOgorCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsCisJCQkJVjRMMl9NUEVHX1NUUkVBTV9UWVBFX01QRUcyX1BTLAorCQkJCVY0TDJfTVBFR19TVFJFQU1fVFlQRV9NUEVHMl9TVkNELCAxLAorCQkJCVY0TDJfTVBFR19TVFJFQU1fVFlQRV9NUEVHMl9QUyk7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9QSURfUE1UOgorCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsIDAsICgxIDw8IDE0KSAtIDEsIDEsIDE2KTsKKwljYXNlIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1BJRF9BVURJTzoKKwkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLCAwLCAoMSA8PCAxNCkgLSAxLCAxLCAyNjApOworCWNhc2UgVjRMMl9DSURfTVBFR19TVFJFQU1fUElEX1ZJREVPOgorCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsIDAsICgxIDw8IDE0KSAtIDEsIDEsIDI1Nik7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9QSURfUENSOgorCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsIDAsICgxIDw8IDE0KSAtIDEsIDEsIDI1OSk7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9QRVNfSURfQVVESU86CisJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChxY3RybCwgMCwgMjU1LCAxLCAwKTsKKwljYXNlIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1BFU19JRF9WSURFTzoKKwkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLCAwLCAyNTUsIDEsIDApOworCWNhc2UgVjRMMl9DSURfTVBFR19TVFJFQU1fVkJJX0ZNVDoKKwkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLAorCQkJCVY0TDJfTVBFR19TVFJFQU1fVkJJX0ZNVF9OT05FLAorCQkJCVY0TDJfTVBFR19TVFJFQU1fVkJJX0ZNVF9JVlRWLCAxLAorCQkJCVY0TDJfTVBFR19TVFJFQU1fVkJJX0ZNVF9OT05FKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKKy8qIEZpbGwgaW4gYSBzdHJ1Y3QgdjRsMl9xdWVyeW1lbnUgYmFzZWQgb24gdGhlIHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCBhbmQKKyAgIHRoZSBtZW51LiBUaGUgcWN0cmwgcG9pbnRlciBtYXkgYmUgTlVMTCwgaW4gd2hpY2ggY2FzZSBpdCBpcyBpZ25vcmVkLiAqLworaW50IHY0bDJfY3RybF9xdWVyeV9tZW51KHN0cnVjdCB2NGwyX3F1ZXJ5bWVudSAqcW1lbnUsIHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWN0cmwsCisJICAgICAgIGNvbnN0IGNoYXIgKiptZW51X2l0ZW1zKQoreworCWludCBpOworCisJaWYgKG1lbnVfaXRlbXMgPT0gTlVMTCB8fAorCSAgICAocWN0cmwgJiYgKHFtZW51LT5pbmRleCA8IHFjdHJsLT5taW5pbXVtIHx8IHFtZW51LT5pbmRleCA+IHFjdHJsLT5tYXhpbXVtKSkpCisJCXJldHVybiAtRUlOVkFMOworCWZvciAoaSA9IDA7IGkgPCBxbWVudS0+aW5kZXggJiYgbWVudV9pdGVtc1tpXTsgaSsrKSA7CisJaWYgKG1lbnVfaXRlbXNbaV0gPT0gTlVMTCB8fCBtZW51X2l0ZW1zW2ldWzBdID09ICdcMCcpCisJCXJldHVybiAtRUlOVkFMOworCXNucHJpbnRmKHFtZW51LT5uYW1lLCBzaXplb2YocW1lbnUtPm5hbWUpLCBtZW51X2l0ZW1zW3FtZW51LT5pbmRleF0pOworCXFtZW51LT5yZXNlcnZlZCA9IDA7CisJcmV0dXJuIDA7Cit9CisKKy8qIGN0cmxfY2xhc3NlcyBwb2ludHMgdG8gYW4gYXJyYXkgb2YgdTMyIHBvaW50ZXJzLCB0aGUgbGFzdCBlbGVtZW50IGlzCisgICBhIE5VTEwgcG9pbnRlci4gRWFjaCB1MzIgYXJyYXkgaXMgYSAwLXRlcm1pbmF0ZWQgYXJyYXkgb2YgY29udHJvbCBJRHMuCisgICBFYWNoIGFycmF5IG11c3QgYmUgc29ydGVkIGxvdyB0byBoaWdoIGFuZCBiZWxvbmcgdG8gdGhlIHNhbWUgY29udHJvbAorICAgY2xhc3MuIFRoZSBhcnJheSBvZiB1MzIgcG9pbnRlciBtdXN0IGFsc28gYmUgc29ydGVkLCBmcm9tIGxvdyBjbGFzcyBJRHMKKyAgIHRvIGhpZ2ggY2xhc3MgSURzLgorCisgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGZpcnN0IElEIHRoYXQgZm9sbG93cyBhZnRlciB0aGUgZ2l2ZW4gSUQuCisgICBXaGVuIG5vIG1vcmUgY29udHJvbHMgYXJlIGF2YWlsYWJsZSAwIGlzIHJldHVybmVkLiAqLwordTMyIHY0bDJfY3RybF9uZXh0KGNvbnN0IHUzMiAqIGNvbnN0ICogY3RybF9jbGFzc2VzLCB1MzIgaWQpCit7CisJdTMyIGN0cmxfY2xhc3M7CisJY29uc3QgdTMyICpwY3RybDsKKworCS8qIGlmIG5vIHF1ZXJ5IGlzIGRlc2lyZWQsIHRoZW4ganVzdCByZXR1cm4gdGhlIGNvbnRyb2wgSUQgKi8KKwlpZiAoKGlkICYgVjRMMl9DVFJMX0ZMQUdfTkVYVF9DVFJMKSA9PSAwKQorCQlyZXR1cm4gaWQ7CisJaWYgKGN0cmxfY2xhc3NlcyA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwlpZCAmPSBWNEwyX0NUUkxfSURfTUFTSzsKKwljdHJsX2NsYXNzID0gVjRMMl9DVFJMX0lEMkNMQVNTKGlkKTsKKwlpZCsrOwkvKiBzZWxlY3QgbmV4dCBjb250cm9sICovCisJLyogZmluZCBmaXJzdCBjbGFzcyB0aGF0IG1hdGNoZXMgKG9yIGlzIGdyZWF0ZXIgdGhhbikgdGhlIGNsYXNzIG9mCisJICAgdGhlIElEICovCisJd2hpbGUgKCpjdHJsX2NsYXNzZXMgJiYgVjRMMl9DVFJMX0lEMkNMQVNTKCoqY3RybF9jbGFzc2VzKSA8IGN0cmxfY2xhc3MpCisJCWN0cmxfY2xhc3NlcysrOworCS8qIG5vIG1vcmUgY2xhc3NlcyAqLworCWlmICgqY3RybF9jbGFzc2VzID09IE5VTEwpCisJCXJldHVybiAwOworCXBjdHJsID0gKmN0cmxfY2xhc3NlczsKKwkvKiBmaW5kIGZpcnN0IGN0cmwgd2l0aGluIHRoZSBjbGFzcyB0aGF0IGlzID49IElEICovCisJd2hpbGUgKCpwY3RybCAmJiAqcGN0cmwgPCBpZCkgcGN0cmwrKzsKKwlpZiAoKnBjdHJsKQorCQlyZXR1cm4gKnBjdHJsOworCS8qIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBjb250cm9scyBvZiB0aGUgY3VycmVudCBjbGFzcy4gKi8KKwkvKiBjb250aW51ZSB3aXRoIG5leHQgY2xhc3MgaWYgYXZhaWxhYmxlICovCisJY3RybF9jbGFzc2VzKys7CisJaWYgKCpjdHJsX2NsYXNzZXMgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuICoqY3RybF9jbGFzc2VzOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCiBFWFBPUlRfU1lNQk9MKHY0bDJfdmlkZW9fc3RkX2NvbnN0cnVjdCk7CiAKIEVYUE9SVF9TWU1CT0wodjRsMl9wcmlvX2luaXQpOwpAQCAtOTI5LDYgKzE0NjEsMTMgQEAKIEVYUE9SVF9TWU1CT0wodjRsX3ByaW50a19pb2N0bCk7CiBFWFBPUlRfU1lNQk9MKHY0bF9wcmludGtfaW9jdGxfYXJnKTsKIAorRVhQT1JUX1NZTUJPTCh2NGwyX2N0cmxfbmV4dCk7CitFWFBPUlRfU1lNQk9MKHY0bDJfY3RybF9jaGVjayk7CitFWFBPUlRfU1lNQk9MKHY0bDJfY3RybF9nZXRfbWVudSk7CitFWFBPUlRfU1lNQk9MKHY0bDJfY3RybF9xdWVyeV9tZW51KTsKK0VYUE9SVF9TWU1CT0wodjRsMl9jdHJsX3F1ZXJ5X2ZpbGwpOworRVhQT1JUX1NZTUJPTCh2NGwyX2N0cmxfcXVlcnlfZmlsbF9zdGQpOworCiAvKgogICogTG9jYWwgdmFyaWFibGVzOgogICogYy1iYXNpYy1vZmZzZXQ6IDgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW8tYnVmLWR2Yi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby92aWRlby1idWYtZHZiLmMKaW5kZXggY2FmM2U3ZS4uN2VlOGE1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby92aWRlby1idWYtZHZiLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby92aWRlby1idWYtZHZiLmMKQEAgLTEzNSwxNCArMTM1LDE1IEBACiAKIGludCB2aWRlb2J1Zl9kdmJfcmVnaXN0ZXIoc3RydWN0IHZpZGVvYnVmX2R2YiAqZHZiLAogCQkJICBzdHJ1Y3QgbW9kdWxlICptb2R1bGUsCi0JCQkgIHZvaWQgKmFkYXB0ZXJfcHJpdikKKwkJCSAgdm9pZCAqYWRhcHRlcl9wcml2LAorCQkJICBzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCiB7CiAJaW50IHJlc3VsdDsKIAogCW11dGV4X2luaXQoJmR2Yi0+bG9jayk7CiAKIAkvKiByZWdpc3RlciBhZGFwdGVyICovCi0JcmVzdWx0ID0gZHZiX3JlZ2lzdGVyX2FkYXB0ZXIoJmR2Yi0+YWRhcHRlciwgZHZiLT5uYW1lLCBtb2R1bGUpOworCXJlc3VsdCA9IGR2Yl9yZWdpc3Rlcl9hZGFwdGVyKCZkdmItPmFkYXB0ZXIsIGR2Yi0+bmFtZSwgbW9kdWxlLCBkZXZpY2UpOwogCWlmIChyZXN1bHQgPCAwKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBkdmJfcmVnaXN0ZXJfYWRhcHRlciBmYWlsZWQgKGVycm5vID0gJWQpXG4iLAogCQkgICAgICAgZHZiLT5uYW1lLCByZXN1bHQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby92aWRlb2Rldi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby92aWRlb2Rldi5jCmluZGV4IDVmODdkZDUuLjJkZmE3ZjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW9kZXYuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvZGV2LmMKQEAgLTEsMjAgKzEsMzEgQEAKIC8qCi0gKiBWaWRlbyBjYXB0dXJlIGludGVyZmFjZSBmb3IgTGludXgKKyAqIFZpZGVvIGNhcHR1cmUgaW50ZXJmYWNlIGZvciBMaW51eCB2ZXJzaW9uIDIKICAqCi0gKgkJQSBnZW5lcmljIHZpZGVvIGRldmljZSBpbnRlcmZhY2UgZm9yIHRoZSBMSU5VWCBvcGVyYXRpbmcgc3lzdGVtCi0gKgkJdXNpbmcgYSBzZXQgb2YgZGV2aWNlIHN0cnVjdHVyZXMvdmVjdG9ycyBmb3IgbG93IGxldmVsIG9wZXJhdGlvbnMuCisgKglBIGdlbmVyaWMgdmlkZW8gZGV2aWNlIGludGVyZmFjZSBmb3IgdGhlIExJTlVYIG9wZXJhdGluZyBzeXN0ZW0KKyAqCXVzaW5nIGEgc2V0IG9mIGRldmljZSBzdHJ1Y3R1cmVzL3ZlY3RvcnMgZm9yIGxvdyBsZXZlbCBvcGVyYXRpb25zLgogICoKLSAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqCi0gKiBBdXRob3I6CUFsYW4gQ294LCA8YWxhbkByZWRoYXQuY29tPgorICogQXV0aG9yczoJQWxhbiBDb3gsIDxhbGFuQHJlZGhhdC5jb20+ICh2ZXJzaW9uIDEpCisgKiAgICAgICAgICAgICAgTWF1cm8gQ2FydmFsaG8gQ2hlaGFiIDxtY2hlaGFiQGluZnJhZGVhZC5vcmc+ICh2ZXJzaW9uIDIpCiAgKgogICogRml4ZXM6CTIwMDAwNTE2ICBDbGF1ZGlvIE1hdHN1b2thIDxjbGF1ZGlvQGNvbmVjdGl2YS5jb20+CiAgKgkJLSBBZGRlZCBwcm9jZnMgc3VwcG9ydAogICovCiAKKyNkZWZpbmUgZGJnYXJnKGNtZCwgZm10LCBhcmcuLi4pIFwKKwkJaWYgKHZmZC0+ZGVidWcgJiBWNEwyX0RFQlVHX0lPQ1RMX0FSRykJCQlcCisJCQlwcmludGsgKEtFUk5fREVCVUcgIiVzOiAiLCAgdmZkLT5uYW1lKTsJCVwKKwkJCXY0bF9wcmludGtfaW9jdGwoY21kKTsJCQkJXAorCQkJcHJpbnRrIChLRVJOX0RFQlVHICIlczogIiBmbXQsIHZmZC0+bmFtZSwgIyMgYXJnKTsKKworI2RlZmluZSBkYmdhcmcyKGZtdCwgYXJnLi4uKSBcCisJCWlmICh2ZmQtPmRlYnVnICYgVjRMMl9ERUJVR19JT0NUTF9BUkcpCQkJXAorCQkJcHJpbnRrIChLRVJOX0RFQlVHICIlczogIiBmbXQsIHZmZC0+bmFtZSwgIyMgYXJnKTsKKwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CkBAIC0zMCw3ICs0MSwxMyBAQAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogCisjZGVmaW5lIF9fT0xEX1ZJRElPQ18gLyogVG8gYWxsb3cgZml4aW5nIG9sZCBjYWxscyovCisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CisKKyNpZmRlZiBDT05GSUdfVklERU9fVjRMMQogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CisjZW5kaWYKKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgogCiAjZGVmaW5lIFZJREVPX05VTV9ERVZJQ0VTCTI1NgogI2RlZmluZSBWSURFT19OQU1FICAgICAgICAgICAgICAidmlkZW80bGludXgiCkBAIC00MSw3ICs1OCw4IEBACiAKIHN0YXRpYyBzc2l6ZV90IHNob3dfbmFtZShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZCwgY2hhciAqYnVmKQogewotCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZmZCA9IGNvbnRhaW5lcl9vZihjZCwgc3RydWN0IHZpZGVvX2RldmljZSwgY2xhc3NfZGV2KTsKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZmQgPSBjb250YWluZXJfb2YoY2QsIHN0cnVjdCB2aWRlb19kZXZpY2UsCisJCQkJCQkJCWNsYXNzX2Rldik7CiAJcmV0dXJuIHNwcmludGYoYnVmLCIlLipzXG4iLChpbnQpc2l6ZW9mKHZmZC0+bmFtZSksdmZkLT5uYW1lKTsKIH0KIApAQCAtNjIsNyArODAsOCBAQAogCiBzdGF0aWMgdm9pZCB2aWRlb19yZWxlYXNlKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkKQogewotCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZmZCA9IGNvbnRhaW5lcl9vZihjZCwgc3RydWN0IHZpZGVvX2RldmljZSwgY2xhc3NfZGV2KTsKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZmQgPSBjb250YWluZXJfb2YoY2QsIHN0cnVjdCB2aWRlb19kZXZpY2UsCisJCQkJCQkJCWNsYXNzX2Rldik7CiAKICNpZiAxCiAJLyogbmVlZGVkIHVudGlsIGFsbCBkcml2ZXJzIGFyZSBmaXhlZCAqLwpAQCAtOTAsNyArMTA5LDcgQEAKIH0KIAogLyoKLSAqCU9wZW4gYSB2aWRlbyBkZXZpY2UuCisgKglPcGVuIGEgdmlkZW8gZGV2aWNlIC0gRklYTUU6IE9ic29sZXRlZAogICovCiBzdGF0aWMgaW50IHZpZGVvX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7CkBAIC0xMzAsNiArMTQ5LDcgQEAKICAqIGhlbHBlciBmdW5jdGlvbiAtLSBoYW5kbGVzIHVzZXJzcGFjZSBjb3B5aW5nIGZvciBpb2N0bCBhcmd1bWVudHMKICAqLwogCisjaWZkZWYgX19PTERfVklESU9DXwogc3RhdGljIHVuc2lnbmVkIGludAogdmlkZW9fZml4X2NvbW1hbmQodW5zaWduZWQgaW50IGNtZCkKIHsKQEAgLTE1NSw3ICsxNzUsMTEgQEAKIAl9CiAJcmV0dXJuIGNtZDsKIH0KKyNlbmRpZgogCisvKgorICogT2Jzb2xldGUgdXNlcmNvcHkgZnVuY3Rpb24gLSBTaG91bGQgYmUgcmVtb3ZlZCBzb29uCisgKi8KIGludAogdmlkZW9fdXNlcmNvcHkoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCiAJICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnLApAQCAtMTY2LDggKzE5MCwxMjE4IEBACiAJdm9pZCAgICAqbWJ1ZiA9IE5VTEw7CiAJdm9pZAkqcGFyZyA9IE5VTEw7CiAJaW50CWVyciAgPSAtRUlOVkFMOworCWludCAgICAgaXNfZXh0X2N0cmw7CisJc2l6ZV90ICBjdHJsc19zaXplID0gMDsKKwl2b2lkIF9fdXNlciAqdXNlcl9wdHIgPSBOVUxMOwogCisjaWZkZWYgX19PTERfVklESU9DXwogCWNtZCA9IHZpZGVvX2ZpeF9jb21tYW5kKGNtZCk7CisjZW5kaWYKKwlpc19leHRfY3RybCA9IChjbWQgPT0gVklESU9DX1NfRVhUX0NUUkxTIHx8IGNtZCA9PSBWSURJT0NfR19FWFRfQ1RSTFMgfHwKKwkJICAgICAgIGNtZCA9PSBWSURJT0NfVFJZX0VYVF9DVFJMUyk7CisKKwkvKiAgQ29weSBhcmd1bWVudHMgaW50byB0ZW1wIGtlcm5lbCBidWZmZXIgICovCisJc3dpdGNoIChfSU9DX0RJUihjbWQpKSB7CisJY2FzZSBfSU9DX05PTkU6CisJCXBhcmcgPSBOVUxMOworCQlicmVhazsKKwljYXNlIF9JT0NfUkVBRDoKKwljYXNlIF9JT0NfV1JJVEU6CisJY2FzZSAoX0lPQ19XUklURSB8IF9JT0NfUkVBRCk6CisJCWlmIChfSU9DX1NJWkUoY21kKSA8PSBzaXplb2Yoc2J1ZikpIHsKKwkJCXBhcmcgPSBzYnVmOworCQl9IGVsc2UgeworCQkJLyogdG9vIGJpZyB0byBhbGxvY2F0ZSBmcm9tIHN0YWNrICovCisJCQltYnVmID0ga21hbGxvYyhfSU9DX1NJWkUoY21kKSxHRlBfS0VSTkVMKTsKKwkJCWlmIChOVUxMID09IG1idWYpCisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQlwYXJnID0gbWJ1ZjsKKwkJfQorCisJCWVyciA9IC1FRkFVTFQ7CisJCWlmIChfSU9DX0RJUihjbWQpICYgX0lPQ19XUklURSkKKwkJCWlmIChjb3B5X2Zyb21fdXNlcihwYXJnLCAodm9pZCBfX3VzZXIgKilhcmcsIF9JT0NfU0laRShjbWQpKSkKKwkJCQlnb3RvIG91dDsKKwkJYnJlYWs7CisJfQorCWlmIChpc19leHRfY3RybCkgeworCQlzdHJ1Y3QgdjRsMl9leHRfY29udHJvbHMgKnAgPSBwYXJnOworCisJCS8qIEluIGNhc2Ugb2YgYW4gZXJyb3IsIHRlbGwgdGhlIGNhbGxlciB0aGF0IGl0IHdhc24ndAorCQkgICBhIHNwZWNpZmljIGNvbnRyb2wgdGhhdCBjYXVzZWQgaXQuICovCisJCXAtPmVycm9yX2lkeCA9IHAtPmNvdW50OworCQl1c2VyX3B0ciA9ICh2b2lkIF9fdXNlciAqKXAtPmNvbnRyb2xzOworCQlpZiAocC0+Y291bnQpIHsKKwkJCWN0cmxzX3NpemUgPSBzaXplb2Yoc3RydWN0IHY0bDJfZXh0X2NvbnRyb2wpICogcC0+Y291bnQ7CisJCQkvKiBOb3RlOiB2NGwyX2V4dF9jb250cm9scyBmaXRzIGluIHNidWZbXSBzbyBtYnVmIGlzIHN0aWxsIE5VTEwuICovCisJCQltYnVmID0ga21hbGxvYyhjdHJsc19zaXplLCBHRlBfS0VSTkVMKTsKKwkJCWVyciA9IC1FTk9NRU07CisJCQlpZiAoTlVMTCA9PSBtYnVmKQorCQkJCWdvdG8gb3V0X2V4dF9jdHJsOworCQkJZXJyID0gLUVGQVVMVDsKKwkJCWlmIChjb3B5X2Zyb21fdXNlcihtYnVmLCB1c2VyX3B0ciwgY3RybHNfc2l6ZSkpCisJCQkJZ290byBvdXRfZXh0X2N0cmw7CisJCQlwLT5jb250cm9scyA9IG1idWY7CisJCX0KKwl9CisKKwkvKiBjYWxsIGRyaXZlciAqLworCWVyciA9IGZ1bmMoaW5vZGUsIGZpbGUsIGNtZCwgcGFyZyk7CisJaWYgKGVyciA9PSAtRU5PSU9DVExDTUQpCisJCWVyciA9IC1FSU5WQUw7CisJaWYgKGlzX2V4dF9jdHJsKSB7CisJCXN0cnVjdCB2NGwyX2V4dF9jb250cm9scyAqcCA9IHBhcmc7CisKKwkJcC0+Y29udHJvbHMgPSAodm9pZCAqKXVzZXJfcHRyOworCQlpZiAocC0+Y291bnQgJiYgZXJyID09IDAgJiYgY29weV90b191c2VyKHVzZXJfcHRyLCBtYnVmLCBjdHJsc19zaXplKSkKKwkJCWVyciA9IC1FRkFVTFQ7CisJCWdvdG8gb3V0X2V4dF9jdHJsOworCX0KKwlpZiAoZXJyIDwgMCkKKwkJZ290byBvdXQ7CisKK291dF9leHRfY3RybDoKKwkvKiAgQ29weSByZXN1bHRzIGludG8gdXNlciBidWZmZXIgICovCisJc3dpdGNoIChfSU9DX0RJUihjbWQpKQorCXsKKwljYXNlIF9JT0NfUkVBRDoKKwljYXNlIChfSU9DX1dSSVRFIHwgX0lPQ19SRUFEKToKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsIHBhcmcsIF9JT0NfU0laRShjbWQpKSkKKwkJCWVyciA9IC1FRkFVTFQ7CisJCWJyZWFrOworCX0KKworb3V0OgorCWtmcmVlKG1idWYpOworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBvcGVuL3JlbGVhc2UgaGVscGVyIGZ1bmN0aW9ucyAtLSBoYW5kbGUgZXhjbHVzaXZlIG9wZW5zCisgKiBTaG91bGQgYmUgcmVtb3ZlZCBzb29uCisgKi8KK2ludCB2aWRlb19leGNsdXNpdmVfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgIHZpZGVvX2RldmljZSAqdmZsID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKKwlpbnQgcmV0dmFsID0gMDsKKworCW11dGV4X2xvY2soJnZmbC0+bG9jayk7CisJaWYgKHZmbC0+dXNlcnMpIHsKKwkJcmV0dmFsID0gLUVCVVNZOworCX0gZWxzZSB7CisJCXZmbC0+dXNlcnMrKzsKKwl9CisJbXV0ZXhfdW5sb2NrKCZ2ZmwtPmxvY2spOworCXJldHVybiByZXR2YWw7Cit9CisKK2ludCB2aWRlb19leGNsdXNpdmVfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgIHZpZGVvX2RldmljZSAqdmZsID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKKworCXZmbC0+dXNlcnMtLTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNoYXIgKnY0bDJfbWVtb3J5X25hbWVzW10gPSB7CisJW1Y0TDJfTUVNT1JZX01NQVBdICAgID0gIm1tYXAiLAorCVtWNEwyX01FTU9SWV9VU0VSUFRSXSA9ICJ1c2VycHRyIiwKKwlbVjRMMl9NRU1PUllfT1ZFUkxBWV0gPSAib3ZlcmxheSIsCit9OworCisKKy8qIEZJWE1FOiBUaG9zZSBzdHVmZiBhcmUgcmVwbGljYXRlZCBhbHNvIG9uIHY0bDItY29tbW9uLmMgKi8KK3N0YXRpYyBjaGFyICp2NGwyX3R5cGVfbmFtZXNfRklYTUVbXSA9IHsKKwlbVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFXSAgICAgID0gInZpZGVvLWNhcCIsCisJW1Y0TDJfQlVGX1RZUEVfVklERU9fT1ZFUkxBWV0gICAgICA9ICJ2aWRlby1vdmVyIiwKKwlbVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRdICAgICAgID0gInZpZGVvLW91dCIsCisJW1Y0TDJfQlVGX1RZUEVfVkJJX0NBUFRVUkVdICAgICAgICA9ICJ2YmktY2FwIiwKKwlbVjRMMl9CVUZfVFlQRV9WQklfT1VUUFVUXSAgICAgICAgID0gInZiaS1vdXQiLAorCVtWNEwyX0JVRl9UWVBFX1NMSUNFRF9WQklfT1VUUFVUXSAgPSAic2xpY2VkLXZiaS1vdXQiLAorCVtWNEwyX0JVRl9UWVBFX1NMSUNFRF9WQklfQ0FQVFVSRV0gPSAic2xpY2VkLXZiaS1jYXB0dXJlIiwKKwlbVjRMMl9CVUZfVFlQRV9QUklWQVRFXSAgICAgICAgICAgID0gInByaXZhdGUiLAorfTsKKworc3RhdGljIGNoYXIgKnY0bDJfZmllbGRfbmFtZXNfRklYTUVbXSA9IHsKKwlbVjRMMl9GSUVMRF9BTlldICAgICAgICA9ICJhbnkiLAorCVtWNEwyX0ZJRUxEX05PTkVdICAgICAgID0gIm5vbmUiLAorCVtWNEwyX0ZJRUxEX1RPUF0gICAgICAgID0gInRvcCIsCisJW1Y0TDJfRklFTERfQk9UVE9NXSAgICAgPSAiYm90dG9tIiwKKwlbVjRMMl9GSUVMRF9JTlRFUkxBQ0VEXSA9ICJpbnRlcmxhY2VkIiwKKwlbVjRMMl9GSUVMRF9TRVFfVEJdICAgICA9ICJzZXEtdGIiLAorCVtWNEwyX0ZJRUxEX1NFUV9CVF0gICAgID0gInNlcS1idCIsCisJW1Y0TDJfRklFTERfQUxURVJOQVRFXSAgPSAiYWx0ZXJuYXRlIiwKK307CisKKyNkZWZpbmUgcHJ0X25hbWVzKGEsYXJyKSAoKChhKT49MCkmJigoYSk8QVJSQVlfU0laRShhcnIpKSk/YXJyW2FdOiJ1bmtub3duIgorCitzdGF0aWMgdm9pZCBkYmdidWYodW5zaWduZWQgaW50IGNtZCwgc3RydWN0IHZpZGVvX2RldmljZSAqdmZkLAorCQkJCQlzdHJ1Y3QgdjRsMl9idWZmZXIgKnApCit7CisJc3RydWN0IHY0bDJfdGltZWNvZGUgKnRjPSZwLT50aW1lY29kZTsKKworCWRiZ2FyZyAoY21kLCAiJTAybGQ6JTAyZDolMDJkLiUwOGxkIGluZGV4PSVkLCB0eXBlPSVzLCAiCisJCSJieXRlc3VzZWQ9JWQsIGZsYWdzPTB4JTA4ZCwgIgorCQkiZmllbGQ9JTBkLCBzZXF1ZW5jZT0lZCwgbWVtb3J5PSVzLCBvZmZzZXQvdXNlcnB0cj0weCUwOGx4XG4iLAorCQkJKHAtPnRpbWVzdGFtcC50dl9zZWMvMzYwMCksCisJCQkoaW50KShwLT50aW1lc3RhbXAudHZfc2VjLzYwKSU2MCwKKwkJCShpbnQpKHAtPnRpbWVzdGFtcC50dl9zZWMlNjApLAorCQkJcC0+dGltZXN0YW1wLnR2X3VzZWMsCisJCQlwLT5pbmRleCwKKwkJCXBydF9uYW1lcyhwLT50eXBlLHY0bDJfdHlwZV9uYW1lc19GSVhNRSksCisJCQlwLT5ieXRlc3VzZWQscC0+ZmxhZ3MsCisJCQlwLT5maWVsZCxwLT5zZXF1ZW5jZSwKKwkJCXBydF9uYW1lcyhwLT5tZW1vcnksdjRsMl9tZW1vcnlfbmFtZXMpLAorCQkJcC0+bS51c2VycHRyKTsKKwlkYmdhcmcyICgidGltZWNvZGU9ICUwMmQ6JTAyZDolMDJkIHR5cGU9JWQsICIKKwkJImZsYWdzPTB4JTA4ZCwgZnJhbWVzPSVkLCB1c2VyYml0cz0weCUwOHhcbiIsCisJCQl0Yy0+aG91cnMsdGMtPm1pbnV0ZXMsdGMtPnNlY29uZHMsCisJCQl0Yy0+dHlwZSwgdGMtPmZsYWdzLCB0Yy0+ZnJhbWVzLCAqKF9fdTMyICopIHRjLT51c2VyYml0cyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkYmdyZWN0KHN0cnVjdCB2aWRlb19kZXZpY2UgKnZmZCwgY2hhciAqcywKKwkJCQkJCQlzdHJ1Y3QgdjRsMl9yZWN0ICpyKQoreworCWRiZ2FyZzIgKCIlc1JlY3Qgc3RhcnQgYXQgJWR4JWQsIHNpemU9ICVkeCVkXG4iLCBzLCByLT5sZWZ0LCByLT50b3AsCisJCQkJCQlyLT53aWR0aCwgci0+aGVpZ2h0KTsKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB2NGxfcHJpbnRfcGl4X2ZtdCAoc3RydWN0IHZpZGVvX2RldmljZSAqdmZkLAorCQkJCQkJc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCAqZm10KQoreworCWRiZ2FyZzIgKCJ3aWR0aD0lZCwgaGVpZ2h0PSVkLCBmb3JtYXQ9MHglMDh4LCBmaWVsZD0lcywgIgorCQkiYnl0ZXNwZXJsaW5lPSVkIHNpemVpbWFnZT0lZCwgY29sb3JzcGFjZT0lZFxuIiwKKwkJZm10LT53aWR0aCxmbXQtPmhlaWdodCxmbXQtPnBpeGVsZm9ybWF0LAorCQlwcnRfbmFtZXMoZm10LT5maWVsZCx2NGwyX2ZpZWxkX25hbWVzX0ZJWE1FKSwKKwkJZm10LT5ieXRlc3BlcmxpbmUsZm10LT5zaXplaW1hZ2UsZm10LT5jb2xvcnNwYWNlKTsKK307CisKKworc3RhdGljIGludCBjaGVja19mbXQgKHN0cnVjdCB2aWRlb19kZXZpY2UgKnZmZCwgZW51bSB2NGwyX2J1Zl90eXBlIHR5cGUpCit7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU6CisJCWlmICh2ZmQtPnZpZGlvY190cnlfZm10X2NhcCkKKwkJCXJldHVybiAoMCk7CisJCWJyZWFrOworCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19PVkVSTEFZOgorCQlpZiAodmZkLT52aWRpb2NfdHJ5X2ZtdF9vdmVybGF5KQorCQkJcmV0dXJuICgwKTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0JVRl9UWVBFX1ZCSV9DQVBUVVJFOgorCQlpZiAodmZkLT52aWRpb2NfdHJ5X2ZtdF92YmkpCisJCQlyZXR1cm4gKDApOworCQlicmVhazsKKwljYXNlIFY0TDJfQlVGX1RZUEVfU0xJQ0VEX1ZCSV9PVVRQVVQ6CisJCWlmICh2ZmQtPnZpZGlvY190cnlfZm10X3ZiaV9vdXRwdXQpCisJCQlyZXR1cm4gKDApOworCQlicmVhazsKKwljYXNlIFY0TDJfQlVGX1RZUEVfU0xJQ0VEX1ZCSV9DQVBUVVJFOgorCQlpZiAodmZkLT52aWRpb2NfdHJ5X2ZtdF92YmlfY2FwdHVyZSkKKwkJCXJldHVybiAoMCk7CisJCWJyZWFrOworCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQ6CisJCWlmICh2ZmQtPnZpZGlvY190cnlfZm10X3ZpZGVvX291dHB1dCkKKwkJCXJldHVybiAoMCk7CisJCWJyZWFrOworCWNhc2UgVjRMMl9CVUZfVFlQRV9WQklfT1VUUFVUOgorCQlpZiAodmZkLT52aWRpb2NfdHJ5X2ZtdF92Ymlfb3V0cHV0KQorCQkJcmV0dXJuICgwKTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0JVRl9UWVBFX1BSSVZBVEU6CisJCWlmICh2ZmQtPnZpZGlvY190cnlfZm10X3R5cGVfcHJpdmF0ZSkKKwkJCXJldHVybiAoMCk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gKC1FSU5WQUwpOworfQorCitzdGF0aWMgaW50IF9fdmlkZW9fZG9faW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCXVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZmQgPSB2aWRlb19kZXZkYXRhKGZpbGUpOworCXZvaWQgICAgICAgICAgICAgICAgICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgICAgICAgICAgICAgICAgICByZXQgPSAtRUlOVkFMOworCisJaWYgKCAodmZkLT5kZWJ1ZyAmIFY0TDJfREVCVUdfSU9DVEwpICYmCisJCQkJISh2ZmQtPmRlYnVnIHwgVjRMMl9ERUJVR19JT0NUTF9BUkcpKSB7CisJCXY0bF9wcmludF9pb2N0bCh2ZmQtPm5hbWUsIGNtZCk7CisJfQorCisJc3dpdGNoKGNtZCkgeworCS8qIC0tLSBjYXBhYmlsaXRpZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJY2FzZSBWSURJT0NfUVVFUllDQVA6CisJeworCQlzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5ICpjYXAgPSAoc3RydWN0IHY0bDJfY2FwYWJpbGl0eSopYXJnOworCQltZW1zZXQoY2FwLCAwLCBzaXplb2YoKmNhcCkpOworCisJCWlmICghdmZkLT52aWRpb2NfcXVlcnljYXApCisJCQlicmVhazsKKworCQlyZXQ9dmZkLT52aWRpb2NfcXVlcnljYXAoZmlsZSwgZmgsIGNhcCk7CisJCWlmICghcmV0KQorCQkJZGJnYXJnIChjbWQsICJkcml2ZXI9JXMsIGNhcmQ9JXMsIGJ1cz0lcywgIgorCQkJCQkidmVyc2lvbj0weCUwOHgsICIKKwkJCQkJImNhcGFiaWxpdGllcz0weCUwOHhcbiIsCisJCQkJCWNhcC0+ZHJpdmVyLGNhcC0+Y2FyZCxjYXAtPmJ1c19pbmZvLAorCQkJCQljYXAtPnZlcnNpb24sCisJCQkJCWNhcC0+Y2FwYWJpbGl0aWVzKTsKKwkJYnJlYWs7CisJfQorCisJLyogLS0tIHByaW9yaXR5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCWNhc2UgVklESU9DX0dfUFJJT1JJVFk6CisJeworCQllbnVtIHY0bDJfcHJpb3JpdHkgKnA9YXJnOworCisJCWlmICghdmZkLT52aWRpb2NfZ19wcmlvcml0eSkKKwkJCWJyZWFrOworCQlyZXQ9dmZkLT52aWRpb2NfZ19wcmlvcml0eShmaWxlLCBmaCwgcCk7CisJCWlmICghcmV0KQorCQkJZGJnYXJnKGNtZCwgInByaW9yaXR5IGlzICVkXG4iLCAqcCk7CisJCWJyZWFrOworCX0KKwljYXNlIFZJRElPQ19TX1BSSU9SSVRZOgorCXsKKwkJZW51bSB2NGwyX3ByaW9yaXR5ICpwPWFyZzsKKworCQlpZiAoIXZmZC0+dmlkaW9jX3NfcHJpb3JpdHkpCisJCQlicmVhazsKKwkJZGJnYXJnKGNtZCwgInNldHRpbmcgcHJpb3JpdHkgdG8gJWRcbiIsICpwKTsKKwkJcmV0PXZmZC0+dmlkaW9jX3NfcHJpb3JpdHkoZmlsZSwgZmgsICpwKTsKKwkJYnJlYWs7CisJfQorCisJLyogLS0tIGNhcHR1cmUgaW9jdGxzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwljYXNlIFZJRElPQ19FTlVNX0ZNVDoKKwl7CisJCXN0cnVjdCB2NGwyX2ZtdGRlc2MgKmYgPSBhcmc7CisJCWVudW0gdjRsMl9idWZfdHlwZSB0eXBlOworCQl1bnNpZ25lZCBpbnQgaW5kZXg7CisKKwkJaW5kZXggPSBmLT5pbmRleDsKKwkJdHlwZSAgPSBmLT50eXBlOworCQltZW1zZXQoZiwwLHNpemVvZigqZikpOworCQlmLT5pbmRleCA9IGluZGV4OworCQlmLT50eXBlICA9IHR5cGU7CisKKwkJc3dpdGNoICh0eXBlKSB7CisJCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOgorCQkJaWYgKHZmZC0+dmlkaW9jX2VudW1fZm10X2NhcCkKKwkJCQlyZXQ9dmZkLT52aWRpb2NfZW51bV9mbXRfY2FwKGZpbGUsIGZoLCBmKTsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fT1ZFUkxBWToKKwkJCWlmICh2ZmQtPnZpZGlvY19lbnVtX2ZtdF9vdmVybGF5KQorCQkJCXJldD12ZmQtPnZpZGlvY19lbnVtX2ZtdF9vdmVybGF5KGZpbGUsIGZoLCBmKTsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfQlVGX1RZUEVfVkJJX0NBUFRVUkU6CisJCQlpZiAodmZkLT52aWRpb2NfZW51bV9mbXRfdmJpKQorCQkJCXJldD12ZmQtPnZpZGlvY19lbnVtX2ZtdF92YmkoZmlsZSwgZmgsIGYpOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9CVUZfVFlQRV9TTElDRURfVkJJX09VVFBVVDoKKwkJCWlmICh2ZmQtPnZpZGlvY19lbnVtX2ZtdF92Ymlfb3V0cHV0KQorCQkJCXJldD12ZmQtPnZpZGlvY19lbnVtX2ZtdF92Ymlfb3V0cHV0KGZpbGUsCisJCQkJCQkJCWZoLCBmKTsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfQlVGX1RZUEVfU0xJQ0VEX1ZCSV9DQVBUVVJFOgorCQkJaWYgKHZmZC0+dmlkaW9jX2VudW1fZm10X3ZiaV9jYXB0dXJlKQorCQkJCXJldD12ZmQtPnZpZGlvY19lbnVtX2ZtdF92YmlfY2FwdHVyZShmaWxlLAorCQkJCQkJCQlmaCwgZik7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVDoKKwkJCWlmICh2ZmQtPnZpZGlvY19lbnVtX2ZtdF92aWRlb19vdXRwdXQpCisJCQkJcmV0PXZmZC0+dmlkaW9jX2VudW1fZm10X3ZpZGVvX291dHB1dChmaWxlLAorCQkJCQkJCQlmaCwgZik7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX0JVRl9UWVBFX1ZCSV9PVVRQVVQ6CisJCQlpZiAodmZkLT52aWRpb2NfZW51bV9mbXRfdmJpX291dHB1dCkKKwkJCQlyZXQ9dmZkLT52aWRpb2NfZW51bV9mbXRfdmJpX291dHB1dChmaWxlLAorCQkJCQkJCQlmaCwgZik7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX0JVRl9UWVBFX1BSSVZBVEU6CisJCQlpZiAodmZkLT52aWRpb2NfZW51bV9mbXRfdHlwZV9wcml2YXRlKQorCQkJCXJldD12ZmQtPnZpZGlvY19lbnVtX2ZtdF90eXBlX3ByaXZhdGUoZmlsZSwKKwkJCQkJCQkJZmgsIGYpOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKCFyZXQpCisJCQlkYmdhcmcgKGNtZCwgImluZGV4PSVkLCB0eXBlPSVkLCBmbGFncz0lZCwgIgorCQkJCQkiZGVzY3JpcHRpb249JXMsIgorCQkJCQkiIHBpeGVsZm9ybWF0PTB4JTh4XG4iLAorCQkJCQlmLT5pbmRleCwgZi0+dHlwZSwgZi0+ZmxhZ3MsCisJCQkJCWYtPmRlc2NyaXB0aW9uLAorCQkJCQlmLT5waXhlbGZvcm1hdCk7CisKKwkJYnJlYWs7CisJfQorCWNhc2UgVklESU9DX0dfRk1UOgorCXsKKwkJc3RydWN0IHY0bDJfZm9ybWF0ICpmID0gKHN0cnVjdCB2NGwyX2Zvcm1hdCAqKWFyZzsKKwkJZW51bSB2NGwyX2J1Zl90eXBlIHR5cGU9Zi0+dHlwZTsKKworCQltZW1zZXQoJmYtPmZtdC5waXgsMCxzaXplb2YoZi0+Zm10LnBpeCkpOworCQlmLT50eXBlPXR5cGU7CisKKwkJLyogRklYTUU6IFNob3VsZCBiZSBvbmUgZHVtcCBwZXIgdHlwZSAqLworCQlkYmdhcmcgKGNtZCwgInR5cGU9JXNcbiIsIHBydF9uYW1lcyh0eXBlLAorCQkJCQl2NGwyX3R5cGVfbmFtZXNfRklYTUUpKTsKKworCQlzd2l0Y2ggKHR5cGUpIHsKKwkJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU6CisJCQlpZiAodmZkLT52aWRpb2NfZ19mbXRfY2FwKQorCQkJCXJldD12ZmQtPnZpZGlvY19nX2ZtdF9jYXAoZmlsZSwgZmgsIGYpOworCQkJaWYgKCFyZXQpCisJCQkJdjRsX3ByaW50X3BpeF9mbXQodmZkLCZmLT5mbXQucGl4KTsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fT1ZFUkxBWToKKwkJCWlmICh2ZmQtPnZpZGlvY19nX2ZtdF9vdmVybGF5KQorCQkJCXJldD12ZmQtPnZpZGlvY19nX2ZtdF9vdmVybGF5KGZpbGUsIGZoLCBmKTsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfQlVGX1RZUEVfVkJJX0NBUFRVUkU6CisJCQlpZiAodmZkLT52aWRpb2NfZ19mbXRfdmJpKQorCQkJCXJldD12ZmQtPnZpZGlvY19nX2ZtdF92YmkoZmlsZSwgZmgsIGYpOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9CVUZfVFlQRV9TTElDRURfVkJJX09VVFBVVDoKKwkJCWlmICh2ZmQtPnZpZGlvY19nX2ZtdF92Ymlfb3V0cHV0KQorCQkJCXJldD12ZmQtPnZpZGlvY19nX2ZtdF92Ymlfb3V0cHV0KGZpbGUsIGZoLCBmKTsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfQlVGX1RZUEVfU0xJQ0VEX1ZCSV9DQVBUVVJFOgorCQkJaWYgKHZmZC0+dmlkaW9jX2dfZm10X3ZiaV9jYXB0dXJlKQorCQkJCXJldD12ZmQtPnZpZGlvY19nX2ZtdF92YmlfY2FwdHVyZShmaWxlLCBmaCwgZik7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVDoKKwkJCWlmICh2ZmQtPnZpZGlvY19nX2ZtdF92aWRlb19vdXRwdXQpCisJCQkJcmV0PXZmZC0+dmlkaW9jX2dfZm10X3ZpZGVvX291dHB1dChmaWxlLAorCQkJCQkJCQlmaCwgZik7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX0JVRl9UWVBFX1ZCSV9PVVRQVVQ6CisJCQlpZiAodmZkLT52aWRpb2NfZ19mbXRfdmJpX291dHB1dCkKKwkJCQlyZXQ9dmZkLT52aWRpb2NfZ19mbXRfdmJpX291dHB1dChmaWxlLCBmaCwgZik7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX0JVRl9UWVBFX1BSSVZBVEU6CisJCQlpZiAodmZkLT52aWRpb2NfZ19mbXRfdHlwZV9wcml2YXRlKQorCQkJCXJldD12ZmQtPnZpZGlvY19nX2ZtdF90eXBlX3ByaXZhdGUoZmlsZSwKKwkJCQkJCQkJZmgsIGYpOworCQkJYnJlYWs7CisJCX0KKworCQlicmVhazsKKwl9CisJY2FzZSBWSURJT0NfU19GTVQ6CisJeworCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYgPSAoc3RydWN0IHY0bDJfZm9ybWF0ICopYXJnOworCisJCS8qIEZJWE1FOiBTaG91bGQgYmUgb25lIGR1bXAgcGVyIHR5cGUgKi8KKwkJZGJnYXJnIChjbWQsICJ0eXBlPSVzXG4iLCBwcnRfbmFtZXMoZi0+dHlwZSwKKwkJCQkJdjRsMl90eXBlX25hbWVzX0ZJWE1FKSk7CisKKwkJc3dpdGNoIChmLT50eXBlKSB7CisJCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOgorCQkJdjRsX3ByaW50X3BpeF9mbXQodmZkLCZmLT5mbXQucGl4KTsKKwkJCWlmICh2ZmQtPnZpZGlvY19zX2ZtdF9jYXApCisJCQkJcmV0PXZmZC0+dmlkaW9jX3NfZm10X2NhcChmaWxlLCBmaCwgZik7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX09WRVJMQVk6CisJCQlpZiAodmZkLT52aWRpb2Nfc19mbXRfb3ZlcmxheSkKKwkJCQlyZXQ9dmZkLT52aWRpb2Nfc19mbXRfb3ZlcmxheShmaWxlLCBmaCwgZik7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX0JVRl9UWVBFX1ZCSV9DQVBUVVJFOgorCQkJaWYgKHZmZC0+dmlkaW9jX3NfZm10X3ZiaSkKKwkJCQlyZXQ9dmZkLT52aWRpb2Nfc19mbXRfdmJpKGZpbGUsIGZoLCBmKTsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfQlVGX1RZUEVfU0xJQ0VEX1ZCSV9PVVRQVVQ6CisJCQlpZiAodmZkLT52aWRpb2Nfc19mbXRfdmJpX291dHB1dCkKKwkJCQlyZXQ9dmZkLT52aWRpb2Nfc19mbXRfdmJpX291dHB1dChmaWxlLCBmaCwgZik7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX0JVRl9UWVBFX1NMSUNFRF9WQklfQ0FQVFVSRToKKwkJCWlmICh2ZmQtPnZpZGlvY19zX2ZtdF92YmlfY2FwdHVyZSkKKwkJCQlyZXQ9dmZkLT52aWRpb2Nfc19mbXRfdmJpX2NhcHR1cmUoZmlsZSwgZmgsIGYpOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQ6CisJCQlpZiAodmZkLT52aWRpb2Nfc19mbXRfdmlkZW9fb3V0cHV0KQorCQkJCXJldD12ZmQtPnZpZGlvY19zX2ZtdF92aWRlb19vdXRwdXQoZmlsZSwKKwkJCQkJCQkJZmgsIGYpOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9CVUZfVFlQRV9WQklfT1VUUFVUOgorCQkJaWYgKHZmZC0+dmlkaW9jX3NfZm10X3ZiaV9vdXRwdXQpCisJCQkJcmV0PXZmZC0+dmlkaW9jX3NfZm10X3ZiaV9vdXRwdXQoZmlsZSwKKwkJCQkJCQkJZmgsIGYpOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9CVUZfVFlQRV9QUklWQVRFOgorCQkJaWYgKHZmZC0+dmlkaW9jX3NfZm10X3R5cGVfcHJpdmF0ZSkKKwkJCQlyZXQ9dmZkLT52aWRpb2Nfc19mbXRfdHlwZV9wcml2YXRlKGZpbGUsCisJCQkJCQkJCWZoLCBmKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCX0KKwljYXNlIFZJRElPQ19UUllfRk1UOgorCXsKKwkJc3RydWN0IHY0bDJfZm9ybWF0ICpmID0gKHN0cnVjdCB2NGwyX2Zvcm1hdCAqKWFyZzsKKworCQkvKiBGSVhNRTogU2hvdWxkIGJlIG9uZSBkdW1wIHBlciB0eXBlICovCisJCWRiZ2FyZyAoY21kLCAidHlwZT0lc1xuIiwgcHJ0X25hbWVzKGYtPnR5cGUsCisJCQkJCQl2NGwyX3R5cGVfbmFtZXNfRklYTUUpKTsKKwkJc3dpdGNoIChmLT50eXBlKSB7CisJCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOgorCQkJaWYgKHZmZC0+dmlkaW9jX3RyeV9mbXRfY2FwKQorCQkJCXJldD12ZmQtPnZpZGlvY190cnlfZm10X2NhcChmaWxlLCBmaCwgZik7CisJCQlpZiAoIXJldCkKKwkJCQl2NGxfcHJpbnRfcGl4X2ZtdCh2ZmQsJmYtPmZtdC5waXgpOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19PVkVSTEFZOgorCQkJaWYgKHZmZC0+dmlkaW9jX3RyeV9mbXRfb3ZlcmxheSkKKwkJCQlyZXQ9dmZkLT52aWRpb2NfdHJ5X2ZtdF9vdmVybGF5KGZpbGUsIGZoLCBmKTsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfQlVGX1RZUEVfVkJJX0NBUFRVUkU6CisJCQlpZiAodmZkLT52aWRpb2NfdHJ5X2ZtdF92YmkpCisJCQkJcmV0PXZmZC0+dmlkaW9jX3RyeV9mbXRfdmJpKGZpbGUsIGZoLCBmKTsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfQlVGX1RZUEVfU0xJQ0VEX1ZCSV9PVVRQVVQ6CisJCQlpZiAodmZkLT52aWRpb2NfdHJ5X2ZtdF92Ymlfb3V0cHV0KQorCQkJCXJldD12ZmQtPnZpZGlvY190cnlfZm10X3ZiaV9vdXRwdXQoZmlsZSwKKwkJCQkJCQkJZmgsIGYpOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9CVUZfVFlQRV9TTElDRURfVkJJX0NBUFRVUkU6CisJCQlpZiAodmZkLT52aWRpb2NfdHJ5X2ZtdF92YmlfY2FwdHVyZSkKKwkJCQlyZXQ9dmZkLT52aWRpb2NfdHJ5X2ZtdF92YmlfY2FwdHVyZShmaWxlLAorCQkJCQkJCQlmaCwgZik7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVDoKKwkJCWlmICh2ZmQtPnZpZGlvY190cnlfZm10X3ZpZGVvX291dHB1dCkKKwkJCQlyZXQ9dmZkLT52aWRpb2NfdHJ5X2ZtdF92aWRlb19vdXRwdXQoZmlsZSwKKwkJCQkJCQkJZmgsIGYpOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9CVUZfVFlQRV9WQklfT1VUUFVUOgorCQkJaWYgKHZmZC0+dmlkaW9jX3RyeV9mbXRfdmJpX291dHB1dCkKKwkJCQlyZXQ9dmZkLT52aWRpb2NfdHJ5X2ZtdF92Ymlfb3V0cHV0KGZpbGUsCisJCQkJCQkJCWZoLCBmKTsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfQlVGX1RZUEVfUFJJVkFURToKKwkJCWlmICh2ZmQtPnZpZGlvY190cnlfZm10X3R5cGVfcHJpdmF0ZSkKKwkJCQlyZXQ9dmZkLT52aWRpb2NfdHJ5X2ZtdF90eXBlX3ByaXZhdGUoZmlsZSwKKwkJCQkJCQkJZmgsIGYpOworCQkJYnJlYWs7CisJCX0KKworCQlicmVhazsKKwl9CisJLyogRklYTUU6IFRob3NlIGJ1ZiByZXFzIGNvdWxkIGJlIGhhbmRsZWQgaGVyZSwKKwkgICB3aXRoIHNvbWUgY2hhbmdlcyBvbiB2aWRlb2J1ZiB0byBhbGxvdyBpdHMgaGVhZGVyIHRvIGJlIGluY2x1ZGVkIGF0CisJICAgdmlkZW9kZXYyLmggb3IgYmVpbmcgbWVyZ2VkIGF0IHZpZGVvZGV2Mi4KKwkgKi8KKwljYXNlIFZJRElPQ19SRVFCVUZTOgorCXsKKwkJc3RydWN0IHY0bDJfcmVxdWVzdGJ1ZmZlcnMgKnA9YXJnOworCisJCWlmICghdmZkLT52aWRpb2NfcmVxYnVmcykKKwkJCWJyZWFrOworCQlyZXQgPSBjaGVja19mbXQgKHZmZCwgcC0+dHlwZSk7CisJCWlmIChyZXQpCisJCQlicmVhazsKKworCQlyZXQ9dmZkLT52aWRpb2NfcmVxYnVmcyhmaWxlLCBmaCwgcCk7CisJCWRiZ2FyZyAoY21kLCAiY291bnQ9JWQsIHR5cGU9JXMsIG1lbW9yeT0lc1xuIiwKKwkJCQlwLT5jb3VudCwKKwkJCQlwcnRfbmFtZXMocC0+dHlwZSx2NGwyX3R5cGVfbmFtZXNfRklYTUUpLAorCQkJCXBydF9uYW1lcyhwLT5tZW1vcnksdjRsMl9tZW1vcnlfbmFtZXMpKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgVklESU9DX1FVRVJZQlVGOgorCXsKKwkJc3RydWN0IHY0bDJfYnVmZmVyICpwPWFyZzsKKworCQlpZiAoIXZmZC0+dmlkaW9jX3F1ZXJ5YnVmKQorCQkJYnJlYWs7CisJCXJldCA9IGNoZWNrX2ZtdCAodmZkLCBwLT50eXBlKTsKKwkJaWYgKHJldCkKKwkJCWJyZWFrOworCisJCXJldD12ZmQtPnZpZGlvY19xdWVyeWJ1ZihmaWxlLCBmaCwgcCk7CisJCWlmICghcmV0KQorCQkJZGJnYnVmKGNtZCx2ZmQscCk7CisJCWJyZWFrOworCX0KKwljYXNlIFZJRElPQ19RQlVGOgorCXsKKwkJc3RydWN0IHY0bDJfYnVmZmVyICpwPWFyZzsKKworCQlpZiAoIXZmZC0+dmlkaW9jX3FidWYpCisJCQlicmVhazsKKwkJcmV0ID0gY2hlY2tfZm10ICh2ZmQsIHAtPnR5cGUpOworCQlpZiAocmV0KQorCQkJYnJlYWs7CisKKwkJcmV0PXZmZC0+dmlkaW9jX3FidWYoZmlsZSwgZmgsIHApOworCQlpZiAoIXJldCkKKwkJCWRiZ2J1ZihjbWQsdmZkLHApOworCQlicmVhazsKKwl9CisJY2FzZSBWSURJT0NfRFFCVUY6CisJeworCQlzdHJ1Y3QgdjRsMl9idWZmZXIgKnA9YXJnOworCQlpZiAoIXZmZC0+dmlkaW9jX3FidWYpCisJCQlicmVhazsKKwkJcmV0ID0gY2hlY2tfZm10ICh2ZmQsIHAtPnR5cGUpOworCQlpZiAocmV0KQorCQkJYnJlYWs7CisKKwkJcmV0PXZmZC0+dmlkaW9jX3FidWYoZmlsZSwgZmgsIHApOworCQlpZiAoIXJldCkKKwkJCWRiZ2J1ZihjbWQsdmZkLHApOworCQlicmVhazsKKwl9CisJY2FzZSBWSURJT0NfT1ZFUkxBWToKKwl7CisJCWludCAqaSA9IGFyZzsKKworCQlpZiAoIXZmZC0+dmlkaW9jX292ZXJsYXkpCisJCQlicmVhazsKKwkJZGJnYXJnIChjbWQsICJ2YWx1ZT0lZFxuIiwqaSk7CisJCXJldD12ZmQtPnZpZGlvY19vdmVybGF5KGZpbGUsIGZoLCAqaSk7CisJCWJyZWFrOworCX0KKyNpZmRlZiBIQVZFX1Y0TDEKKwkvKiAtLS0gc3RyZWFtaW5nIGNhcHR1cmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCWNhc2UgVklESU9DR01CVUY6CisJeworCQlzdHJ1Y3QgdmlkZW9fbWJ1ZiAqcD1hcmc7CisKKwkJbWVtc2V0KHAsMCxzaXplb2YocCkpOworCisJCWlmICghdmZkLT52aWRpb2NnbWJ1ZikKKwkJCWJyZWFrOworCQlyZXQ9dmZkLT52aWRpb2NnbWJ1ZihmaWxlLCBmaCwgcCk7CisJCWlmICghcmV0KQorCQkJZGJnYXJnIChjbWQsICJzaXplPSVkLCBmcmFtZXM9JWQsIG9mZnNldHM9MHglMDhseFxuIiwKKwkJCQkJCXAtPnNpemUsIHAtPmZyYW1lcywKKwkJCQkJCSh1bnNpZ25lZCBsb25nKXAtPm9mZnNldHMpOworCQlicmVhazsKKwl9CisjZW5kaWYKKwljYXNlIFZJRElPQ19HX0ZCVUY6CisJeworCQlzdHJ1Y3QgdjRsMl9mcmFtZWJ1ZmZlciAqcD1hcmc7CisJCWlmICghdmZkLT52aWRpb2NfZ19mYnVmKQorCQkJYnJlYWs7CisJCXJldD12ZmQtPnZpZGlvY19nX2ZidWYoZmlsZSwgZmgsIGFyZyk7CisJCWlmICghcmV0KSB7CisJCQlkYmdhcmcgKGNtZCwgImNhcGFiaWxpdHk9JWQsIGZsYWdzPSVkLCBiYXNlPTB4JTA4bHhcbiIsCisJCQkJCXAtPmNhcGFiaWxpdHkscC0+ZmxhZ3MsCisJCQkJCSh1bnNpZ25lZCBsb25nKXAtPmJhc2UpOworCQkJdjRsX3ByaW50X3BpeF9mbXQgKHZmZCwgJnAtPmZtdCk7CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgVklESU9DX1NfRkJVRjoKKwl7CisJCXN0cnVjdCB2NGwyX2ZyYW1lYnVmZmVyICpwPWFyZzsKKwkJaWYgKCF2ZmQtPnZpZGlvY19zX2ZidWYpCisJCQlicmVhazsKKworCQlkYmdhcmcgKGNtZCwgImNhcGFiaWxpdHk9JWQsIGZsYWdzPSVkLCBiYXNlPTB4JTA4bHhcbiIsCisJCQkJcC0+Y2FwYWJpbGl0eSxwLT5mbGFncywodW5zaWduZWQgbG9uZylwLT5iYXNlKTsKKwkJdjRsX3ByaW50X3BpeF9mbXQgKHZmZCwgJnAtPmZtdCk7CisJCXJldD12ZmQtPnZpZGlvY19zX2ZidWYoZmlsZSwgZmgsIGFyZyk7CisKKwkJYnJlYWs7CisJfQorCWNhc2UgVklESU9DX1NUUkVBTU9OOgorCXsKKwkJZW51bSB2NGwyX2J1Zl90eXBlIGkgPSAqKGludCAqKWFyZzsKKwkJaWYgKCF2ZmQtPnZpZGlvY19zdHJlYW1vbikKKwkJCWJyZWFrOworCQlkYmdhcmcgKGNtZCwgInR5cGU9JXNcbiIsIHBydF9uYW1lcyhpLHY0bDJfdHlwZV9uYW1lc19GSVhNRSkpOworCQlyZXQ9dmZkLT52aWRpb2Nfc3RyZWFtb24oZmlsZSwgZmgsaSk7CisJCWJyZWFrOworCX0KKwljYXNlIFZJRElPQ19TVFJFQU1PRkY6CisJeworCQllbnVtIHY0bDJfYnVmX3R5cGUgaSA9ICooaW50ICopYXJnOworCisJCWlmICghdmZkLT52aWRpb2Nfc3RyZWFtb2ZmKQorCQkJYnJlYWs7CisJCWRiZ2FyZyAoY21kLCAidHlwZT0lc1xuIiwgcHJ0X25hbWVzKGksdjRsMl90eXBlX25hbWVzX0ZJWE1FKSk7CisJCXJldD12ZmQtPnZpZGlvY19zdHJlYW1vZmYoZmlsZSwgZmgsIGkpOworCQlicmVhazsKKwl9CisJLyogLS0tLS0tLS0tLSB0diBub3JtcyAtLS0tLS0tLS0tICovCisJY2FzZSBWSURJT0NfRU5VTVNURDoKKwl7CisJCXN0cnVjdCB2NGwyX3N0YW5kYXJkICpwID0gYXJnOworCQl1bnNpZ25lZCBpbnQgaW5kZXggPSBwLT5pbmRleDsKKworCQlpZiAoIXZmZC0+dHZub3Jtc2l6ZSkgeworCQkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIiVzOiBubyBUViBub3JtcyBkZWZpbmVkIVxuIiwKKwkJCQkJCXZmZC0+bmFtZSk7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChpbmRleDw9MCB8fCBpbmRleCA+PSB2ZmQtPnR2bm9ybXNpemUpIHsKKwkJCXJldD0tRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKwkJdjRsMl92aWRlb19zdGRfY29uc3RydWN0KHAsIHZmZC0+dHZub3Jtc1twLT5pbmRleF0uaWQsCisJCQkJCSB2ZmQtPnR2bm9ybXNbcC0+aW5kZXhdLm5hbWUpOworCQlwLT5pbmRleCA9IGluZGV4OworCisJCWRiZ2FyZyAoY21kLCAiaW5kZXg9JWQsIGlkPSVMZCwgbmFtZT0lcywgZnBzPSVkLyVkLCAiCisJCQkJImZyYW1lbGluZXM9JWRcbiIsIHAtPmluZGV4LAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpcC0+aWQsIHAtPm5hbWUsCisJCQkJcC0+ZnJhbWVwZXJpb2QubnVtZXJhdG9yLAorCQkJCXAtPmZyYW1lcGVyaW9kLmRlbm9taW5hdG9yLAorCQkJCXAtPmZyYW1lbGluZXMpOworCisJCXJldD0wOworCQlicmVhazsKKwl9CisJY2FzZSBWSURJT0NfR19TVEQ6CisJeworCQl2NGwyX3N0ZF9pZCAqaWQgPSBhcmc7CisKKwkJKmlkID0gdmZkLT5jdXJyZW50X25vcm07CisKKwkJZGJnYXJnIChjbWQsICJ2YWx1ZT0lTHVcbiIsIChsb25nIGxvbmcgdW5zaWduZWQpICppZCk7CisKKwkJcmV0PTA7CisJCWJyZWFrOworCX0KKwljYXNlIFZJRElPQ19TX1NURDoKKwl7CisJCXY0bDJfc3RkX2lkICppZCA9IGFyZzsKKwkJdW5zaWduZWQgaW50IGk7CisKKwkJaWYgKCF2ZmQtPnR2bm9ybXNpemUpIHsKKwkJCXByaW50ayAoS0VSTl9XQVJOSU5HICIlczogbm8gVFYgbm9ybXMgZGVmaW5lZCFcbiIsCisJCQkJCQl2ZmQtPm5hbWUpOworCQkJYnJlYWs7CisJCX0KKworCQlkYmdhcmcgKGNtZCwgInZhbHVlPSVMdVxuIiwgKGxvbmcgbG9uZyB1bnNpZ25lZCkgKmlkKTsKKworCQkvKiBGaXJzdCBzZWFyY2ggZm9yIGV4YWN0IG1hdGNoICovCisJCWZvciAoaSA9IDA7IGkgPCB2ZmQtPnR2bm9ybXNpemU7IGkrKykKKwkJCWlmICgqaWQgPT0gdmZkLT50dm5vcm1zW2ldLmlkKQorCQkJCWJyZWFrOworCQkvKiBUaGVuIGZvciBhIGdlbmVyaWMgdmlkZW8gc3RkIHRoYXQgY29udGFpbnMgZGVzaXJlZCBzdGQgKi8KKwkJaWYgKGkgPT0gdmZkLT50dm5vcm1zaXplKQorCQkJZm9yIChpID0gMDsgaSA8IHZmZC0+dHZub3Jtc2l6ZTsgaSsrKQorCQkJCWlmICgqaWQgJiB2ZmQtPnR2bm9ybXNbaV0uaWQpCisJCQkJCWJyZWFrOworCQlpZiAoaSA9PSB2ZmQtPnR2bm9ybXNpemUpIHsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogQ2FsbHMgdGhlIHNwZWNpZmljIGhhbmRsZXIgKi8KKwkJaWYgKHZmZC0+dmlkaW9jX3Nfc3RkKQorCQkJcmV0PXZmZC0+dmlkaW9jX3Nfc3RkKGZpbGUsIGZoLCBpKTsKKwkJZWxzZQorCQkJcmV0PS1FSU5WQUw7CisKKwkJLyogVXBkYXRlcyBzdGFuZGFyZCBpbmZvcm1hdGlvbiAqLworCQlpZiAoIXJldCkKKwkJCXZmZC0+Y3VycmVudF9ub3JtPSppZDsKKworCQlicmVhazsKKwl9CisJY2FzZSBWSURJT0NfUVVFUllTVEQ6CisJeworCQl2NGwyX3N0ZF9pZCAqcD1hcmc7CisKKwkJaWYgKCF2ZmQtPnZpZGlvY19xdWVyeXN0ZCkKKwkJCWJyZWFrOworCQlyZXQ9dmZkLT52aWRpb2NfcXVlcnlzdGQoZmlsZSwgZmgsIGFyZyk7CisJCWlmICghcmV0KQorCQkJZGJnYXJnIChjbWQsICJkZXRlY3RlZCBzdGQ9JUx1XG4iLAorCQkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykqcCk7CisJCWJyZWFrOworCX0KKwkvKiAtLS0tLS0gaW5wdXQgc3dpdGNoaW5nIC0tLS0tLS0tLS0gKi8KKwkvKiBGSVhNRTogSW5wdXRzIGNhbiBiZSBoYW5kbGVkIGluc2lkZSB2aWRlb2RldjIgKi8KKwljYXNlIFZJRElPQ19FTlVNSU5QVVQ6CisJeworCQlzdHJ1Y3QgdjRsMl9pbnB1dCAqcD1hcmc7CisJCWludCBpPXAtPmluZGV4OworCisJCWlmICghdmZkLT52aWRpb2NfZW51bV9pbnB1dCkKKwkJCWJyZWFrOworCQltZW1zZXQocCwgMCwgc2l6ZW9mKCpwKSk7CisJCXAtPmluZGV4PWk7CisKKwkJcmV0PXZmZC0+dmlkaW9jX2VudW1faW5wdXQoZmlsZSwgZmgsIHApOworCQlpZiAoIXJldCkKKwkJCWRiZ2FyZyAoY21kLCAiaW5kZXg9JWQsIG5hbWU9JXMsIHR5cGU9JWQsICIKKwkJCQkJImF1ZGlvc2V0PSVkLCAiCisJCQkJCSJ0dW5lcj0lZCwgc3RkPSVMZCwgc3RhdHVzPSVkXG4iLAorCQkJCQlwLT5pbmRleCxwLT5uYW1lLHAtPnR5cGUscC0+YXVkaW9zZXQsCisJCQkJCXAtPnR1bmVyLAorCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKXAtPnN0ZCwKKwkJCQkJcC0+c3RhdHVzKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgVklESU9DX0dfSU5QVVQ6CisJeworCQl1bnNpZ25lZCBpbnQgKmkgPSBhcmc7CisKKwkJaWYgKCF2ZmQtPnZpZGlvY19nX2lucHV0KQorCQkJYnJlYWs7CisJCXJldD12ZmQtPnZpZGlvY19nX2lucHV0KGZpbGUsIGZoLCBpKTsKKwkJaWYgKCFyZXQpCisJCQlkYmdhcmcgKGNtZCwgInZhbHVlPSVkXG4iLCppKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgVklESU9DX1NfSU5QVVQ6CisJeworCQl1bnNpZ25lZCBpbnQgKmkgPSBhcmc7CisKKwkJaWYgKCF2ZmQtPnZpZGlvY19zX2lucHV0KQorCQkJYnJlYWs7CisJCWRiZ2FyZyAoY21kLCAidmFsdWU9JWRcbiIsKmkpOworCQlyZXQ9dmZkLT52aWRpb2Nfc19pbnB1dChmaWxlLCBmaCwgKmkpOworCQlicmVhazsKKwl9CisKKwkvKiAtLS0tLS0gb3V0cHV0IHN3aXRjaGluZyAtLS0tLS0tLS0tICovCisJY2FzZSBWSURJT0NfR19PVVRQVVQ6CisJeworCQl1bnNpZ25lZCBpbnQgKmkgPSBhcmc7CisKKwkJaWYgKCF2ZmQtPnZpZGlvY19nX291dHB1dCkKKwkJCWJyZWFrOworCQlyZXQ9dmZkLT52aWRpb2NfZ19vdXRwdXQoZmlsZSwgZmgsIGkpOworCQlpZiAoIXJldCkKKwkJCWRiZ2FyZyAoY21kLCAidmFsdWU9JWRcbiIsKmkpOworCQlicmVhazsKKwl9CisJY2FzZSBWSURJT0NfU19PVVRQVVQ6CisJeworCQl1bnNpZ25lZCBpbnQgKmkgPSBhcmc7CisKKwkJaWYgKCF2ZmQtPnZpZGlvY19zX291dHB1dCkKKwkJCWJyZWFrOworCQlkYmdhcmcgKGNtZCwgInZhbHVlPSVkXG4iLCppKTsKKwkJcmV0PXZmZC0+dmlkaW9jX3Nfb3V0cHV0KGZpbGUsIGZoLCAqaSk7CisJCWJyZWFrOworCX0KKworCS8qIC0tLSBjb250cm9scyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJY2FzZSBWSURJT0NfUVVFUllDVFJMOgorCXsKKwkJc3RydWN0IHY0bDJfcXVlcnljdHJsICpwPWFyZzsKKworCQlpZiAoIXZmZC0+dmlkaW9jX3F1ZXJ5Y3RybCkKKwkJCWJyZWFrOworCQlyZXQ9dmZkLT52aWRpb2NfcXVlcnljdHJsKGZpbGUsIGZoLCBwKTsKKworCQlpZiAoIXJldCkKKwkJCWRiZ2FyZyAoY21kLCAiaWQ9JWQsIHR5cGU9JWQsIG5hbWU9JXMsICIKKwkJCQkJIm1pbi9tYXg9JWQvJWQsIgorCQkJCQkiIHN0ZXA9JWQsIGRlZmF1bHQ9JWQsIGZsYWdzPTB4JTA4eFxuIiwKKwkJCQkJcC0+aWQscC0+dHlwZSxwLT5uYW1lLHAtPm1pbmltdW0sCisJCQkJCXAtPm1heGltdW0scC0+c3RlcCxwLT5kZWZhdWx0X3ZhbHVlLAorCQkJCQlwLT5mbGFncyk7CisJCWJyZWFrOworCX0KKwljYXNlIFZJRElPQ19HX0NUUkw6CisJeworCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpwID0gYXJnOworCisJCWlmICghdmZkLT52aWRpb2NfZ19jdHJsKQorCQkJYnJlYWs7CisJCWRiZ2FyZyhjbWQsICJFbnVtIGZvciBpbmRleD0lZFxuIiwgcC0+aWQpOworCisJCXJldD12ZmQtPnZpZGlvY19nX2N0cmwoZmlsZSwgZmgsIHApOworCQlpZiAoIXJldCkKKwkJCWRiZ2FyZzIgKCAiaWQ9JWQsIHZhbHVlPSVkXG4iLCBwLT5pZCwgcC0+dmFsdWUpOworCQlicmVhazsKKwl9CisJY2FzZSBWSURJT0NfU19DVFJMOgorCXsKKwkJc3RydWN0IHY0bDJfY29udHJvbCAqcCA9IGFyZzsKKworCQlpZiAoIXZmZC0+dmlkaW9jX3NfY3RybCkKKwkJCWJyZWFrOworCQlkYmdhcmcgKGNtZCwgImlkPSVkLCB2YWx1ZT0lZFxuIiwgcC0+aWQsIHAtPnZhbHVlKTsKKworCQlyZXQ9dmZkLT52aWRpb2Nfc19jdHJsKGZpbGUsIGZoLCBwKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgVklESU9DX0dfRVhUX0NUUkxTOgorCXsKKwkJc3RydWN0IHY0bDJfZXh0X2NvbnRyb2xzICpwID0gYXJnOworCisJCWlmICh2ZmQtPnZpZGlvY19nX2V4dF9jdHJscykgeworCQkJZGJnYXJnKGNtZCwgImNvdW50PSVkXG4iLCBwLT5jb3VudCk7CisKKwkJCXJldD12ZmQtPnZpZGlvY19nX2V4dF9jdHJscyhmaWxlLCBmaCwgcCk7CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgVklESU9DX1NfRVhUX0NUUkxTOgorCXsKKwkJc3RydWN0IHY0bDJfZXh0X2NvbnRyb2xzICpwID0gYXJnOworCisJCWlmICh2ZmQtPnZpZGlvY19zX2V4dF9jdHJscykgeworCQkJZGJnYXJnKGNtZCwgImNvdW50PSVkXG4iLCBwLT5jb3VudCk7CisKKwkJCXJldD12ZmQtPnZpZGlvY19zX2V4dF9jdHJscyhmaWxlLCBmaCwgcCk7CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgVklESU9DX1RSWV9FWFRfQ1RSTFM6CisJeworCQlzdHJ1Y3QgdjRsMl9leHRfY29udHJvbHMgKnAgPSBhcmc7CisKKwkJaWYgKHZmZC0+dmlkaW9jX3RyeV9leHRfY3RybHMpIHsKKwkJCWRiZ2FyZyhjbWQsICJjb3VudD0lZFxuIiwgcC0+Y291bnQpOworCisJCQlyZXQ9dmZkLT52aWRpb2NfdHJ5X2V4dF9jdHJscyhmaWxlLCBmaCwgcCk7CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgVklESU9DX1FVRVJZTUVOVToKKwl7CisJCXN0cnVjdCB2NGwyX3F1ZXJ5bWVudSAqcD1hcmc7CisJCWlmICghdmZkLT52aWRpb2NfcXVlcnltZW51KQorCQkJYnJlYWs7CisJCXJldD12ZmQtPnZpZGlvY19xdWVyeW1lbnUoZmlsZSwgZmgsIHApOworCQlpZiAoIXJldCkKKwkJCWRiZ2FyZyAoY21kLCAiaWQ9JWQsIGluZGV4PSVkLCBuYW1lPSVzXG4iLAorCQkJCQkJcC0+aWQscC0+aW5kZXgscC0+bmFtZSk7CisJCWJyZWFrOworCX0KKwkvKiAtLS0gYXVkaW8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCWNhc2UgVklESU9DX0VOVU1BVURJTzoKKwl7CisJCXN0cnVjdCB2NGwyX2F1ZGlvICpwPWFyZzsKKworCQlpZiAoIXZmZC0+dmlkaW9jX2VudW1hdWRpbykKKwkJCWJyZWFrOworCQlkYmdhcmcoY21kLCAiRW51bSBmb3IgaW5kZXg9JWRcbiIsIHAtPmluZGV4KTsKKwkJcmV0PXZmZC0+dmlkaW9jX2VudW1hdWRpbyhmaWxlLCBmaCwgcCk7CisJCWlmICghcmV0KQorCQkJZGJnYXJnMigiaW5kZXg9JWQsIG5hbWU9JXMsIGNhcGFiaWxpdHk9JWQsICIKKwkJCQkJIm1vZGU9JWRcbiIscC0+aW5kZXgscC0+bmFtZSwKKwkJCQkJcC0+Y2FwYWJpbGl0eSwgcC0+bW9kZSk7CisJCWJyZWFrOworCX0KKwljYXNlIFZJRElPQ19HX0FVRElPOgorCXsKKwkJc3RydWN0IHY0bDJfYXVkaW8gKnA9YXJnOworCisJCWlmICghdmZkLT52aWRpb2NfZ19hdWRpbykKKwkJCWJyZWFrOworCQlkYmdhcmcoY21kLCAiR2V0IGZvciBpbmRleD0lZFxuIiwgcC0+aW5kZXgpOworCQlyZXQ9dmZkLT52aWRpb2NfZ19hdWRpbyhmaWxlLCBmaCwgcCk7CisJCWlmICghcmV0KQorCQkJZGJnYXJnMigiaW5kZXg9JWQsIG5hbWU9JXMsIGNhcGFiaWxpdHk9JWQsICIKKwkJCQkJIm1vZGU9JWRcbiIscC0+aW5kZXgsCisJCQkJCXAtPm5hbWUscC0+Y2FwYWJpbGl0eSwgcC0+bW9kZSk7CisJCWJyZWFrOworCX0KKwljYXNlIFZJRElPQ19TX0FVRElPOgorCXsKKwkJc3RydWN0IHY0bDJfYXVkaW8gKnA9YXJnOworCisJCWlmICghdmZkLT52aWRpb2Nfc19hdWRpbykKKwkJCWJyZWFrOworCQlkYmdhcmcoY21kLCAiaW5kZXg9JWQsIG5hbWU9JXMsIGNhcGFiaWxpdHk9JWQsICIKKwkJCQkJIm1vZGU9JWRcbiIsIHAtPmluZGV4LCBwLT5uYW1lLAorCQkJCQlwLT5jYXBhYmlsaXR5LCBwLT5tb2RlKTsKKwkJcmV0PXZmZC0+dmlkaW9jX3NfYXVkaW8oZmlsZSwgZmgsIHApOworCQlicmVhazsKKwl9CisJY2FzZSBWSURJT0NfRU5VTUFVRE9VVDoKKwl7CisJCXN0cnVjdCB2NGwyX2F1ZGlvb3V0ICpwPWFyZzsKKworCQlpZiAoIXZmZC0+dmlkaW9jX2VudW1hdWRvdXQpCisJCQlicmVhazsKKwkJZGJnYXJnKGNtZCwgIkVudW0gZm9yIGluZGV4PSVkXG4iLCBwLT5pbmRleCk7CisJCXJldD12ZmQtPnZpZGlvY19lbnVtYXVkb3V0KGZpbGUsIGZoLCBwKTsKKwkJaWYgKCFyZXQpCisJCQlkYmdhcmcyKCJpbmRleD0lZCwgbmFtZT0lcywgY2FwYWJpbGl0eT0lZCwgIgorCQkJCQkibW9kZT0lZFxuIiwgcC0+aW5kZXgsIHAtPm5hbWUsCisJCQkJCXAtPmNhcGFiaWxpdHkscC0+bW9kZSk7CisJCWJyZWFrOworCX0KKwljYXNlIFZJRElPQ19HX0FVRE9VVDoKKwl7CisJCXN0cnVjdCB2NGwyX2F1ZGlvb3V0ICpwPWFyZzsKKworCQlpZiAoIXZmZC0+dmlkaW9jX2dfYXVkb3V0KQorCQkJYnJlYWs7CisJCWRiZ2FyZyhjbWQsICJFbnVtIGZvciBpbmRleD0lZFxuIiwgcC0+aW5kZXgpOworCQlyZXQ9dmZkLT52aWRpb2NfZ19hdWRvdXQoZmlsZSwgZmgsIHApOworCQlpZiAoIXJldCkKKwkJCWRiZ2FyZzIoImluZGV4PSVkLCBuYW1lPSVzLCBjYXBhYmlsaXR5PSVkLCAiCisJCQkJCSJtb2RlPSVkXG4iLCBwLT5pbmRleCwgcC0+bmFtZSwKKwkJCQkJcC0+Y2FwYWJpbGl0eSxwLT5tb2RlKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgVklESU9DX1NfQVVET1VUOgorCXsKKwkJc3RydWN0IHY0bDJfYXVkaW9vdXQgKnA9YXJnOworCisJCWlmICghdmZkLT52aWRpb2Nfc19hdWRvdXQpCisJCQlicmVhazsKKwkJZGJnYXJnKGNtZCwgImluZGV4PSVkLCBuYW1lPSVzLCBjYXBhYmlsaXR5PSVkLCAiCisJCQkJCSJtb2RlPSVkXG4iLCBwLT5pbmRleCwgcC0+bmFtZSwKKwkJCQkJcC0+Y2FwYWJpbGl0eSxwLT5tb2RlKTsKKworCQlyZXQ9dmZkLT52aWRpb2Nfc19hdWRvdXQoZmlsZSwgZmgsIHApOworCQlicmVhazsKKwl9CisJY2FzZSBWSURJT0NfR19NT0RVTEFUT1I6CisJeworCQlzdHJ1Y3QgdjRsMl9tb2R1bGF0b3IgKnA9YXJnOworCQlpZiAoIXZmZC0+dmlkaW9jX2dfbW9kdWxhdG9yKQorCQkJYnJlYWs7CisJCXJldD12ZmQtPnZpZGlvY19nX21vZHVsYXRvcihmaWxlLCBmaCwgcCk7CisJCWlmICghcmV0KQorCQkJZGJnYXJnKGNtZCwgImluZGV4PSVkLCBuYW1lPSVzLCAiCisJCQkJCSJjYXBhYmlsaXR5PSVkLCByYW5nZWxvdz0lZCwiCisJCQkJCSIgcmFuZ2VoaWdoPSVkLCB0eHN1YmNoYW5zPSVkXG4iLAorCQkJCQlwLT5pbmRleCwgcC0+bmFtZSxwLT5jYXBhYmlsaXR5LAorCQkJCQlwLT5yYW5nZWxvdywgcC0+cmFuZ2VoaWdoLAorCQkJCQlwLT50eHN1YmNoYW5zKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgVklESU9DX1NfTU9EVUxBVE9SOgorCXsKKwkJc3RydWN0IHY0bDJfbW9kdWxhdG9yICpwPWFyZzsKKwkJaWYgKCF2ZmQtPnZpZGlvY19zX21vZHVsYXRvcikKKwkJCWJyZWFrOworCQlkYmdhcmcoY21kLCAiaW5kZXg9JWQsIG5hbWU9JXMsIGNhcGFiaWxpdHk9JWQsICIKKwkJCQkicmFuZ2Vsb3c9JWQsIHJhbmdlaGlnaD0lZCwgdHhzdWJjaGFucz0lZFxuIiwKKwkJCQlwLT5pbmRleCwgcC0+bmFtZSxwLT5jYXBhYmlsaXR5LHAtPnJhbmdlbG93LAorCQkJCXAtPnJhbmdlaGlnaCxwLT50eHN1YmNoYW5zKTsKKwkJCXJldD12ZmQtPnZpZGlvY19zX21vZHVsYXRvcihmaWxlLCBmaCwgcCk7CisJCWJyZWFrOworCX0KKwljYXNlIFZJRElPQ19HX0NST1A6CisJeworCQlzdHJ1Y3QgdjRsMl9jcm9wICpwPWFyZzsKKwkJaWYgKCF2ZmQtPnZpZGlvY19nX2Nyb3ApCisJCQlicmVhazsKKwkJcmV0PXZmZC0+dmlkaW9jX2dfY3JvcChmaWxlLCBmaCwgcCk7CisJCWlmICghcmV0KSB7CisJCQlkYmdhcmcoY21kLCAidHlwZT0lZFxuIiwgcC0+dHlwZSk7CisJCQlkYmdyZWN0KHZmZCwgIiIsICZwLT5jKTsKKwkJfQorCQlicmVhazsKKwl9CisJY2FzZSBWSURJT0NfU19DUk9QOgorCXsKKwkJc3RydWN0IHY0bDJfY3JvcCAqcD1hcmc7CisJCWlmICghdmZkLT52aWRpb2Nfc19jcm9wKQorCQkJYnJlYWs7CisJCWRiZ2FyZyhjbWQsICJ0eXBlPSVkXG4iLCBwLT50eXBlKTsKKwkJZGJncmVjdCh2ZmQsICIiLCAmcC0+Yyk7CisJCXJldD12ZmQtPnZpZGlvY19zX2Nyb3AoZmlsZSwgZmgsIHApOworCQlicmVhazsKKwl9CisJY2FzZSBWSURJT0NfQ1JPUENBUDoKKwl7CisJCXN0cnVjdCB2NGwyX2Nyb3BjYXAgKnA9YXJnOworCQkvKkZJWE1FOiBTaG91bGQgYWxzbyBzaG93IHY0bDJfZnJhY3QgcGl4ZWxhc3BlY3QgKi8KKwkJaWYgKCF2ZmQtPnZpZGlvY19jcm9wY2FwKQorCQkJYnJlYWs7CisJCWRiZ2FyZyhjbWQsICJ0eXBlPSVkXG4iLCBwLT50eXBlKTsKKwkJZGJncmVjdCh2ZmQsICJib3VuZHMgIiwgJnAtPmJvdW5kcyk7CisJCWRiZ3JlY3QodmZkLCAiZGVmcmVjdCAiLCAmcC0+ZGVmcmVjdCk7CisJCXJldD12ZmQtPnZpZGlvY19jcm9wY2FwKGZpbGUsIGZoLCBwKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgVklESU9DX0dfTVBFR0NPTVA6CisJeworCQlzdHJ1Y3QgdjRsMl9tcGVnX2NvbXByZXNzaW9uICpwPWFyZzsKKworCQkvKkZJWE1FOiBTZXZlcmFsIGZpZWxkcyBub3Qgc2hvd24gKi8KKwkJaWYgKCF2ZmQtPnZpZGlvY19nX21wZWdjb21wKQorCQkJYnJlYWs7CisJCXJldD12ZmQtPnZpZGlvY19nX21wZWdjb21wKGZpbGUsIGZoLCBwKTsKKwkJaWYgKCFyZXQpCisJCQlkYmdhcmcgKGNtZCwgInRzX3BpZF9wbXQ9JWQsIHRzX3BpZF9hdWRpbz0lZCwiCisJCQkJCSIgdHNfcGlkX3ZpZGVvPSVkLCB0c19waWRfcGNyPSVkLCAiCisJCQkJCSJwc19zaXplPSVkLCBhdV9zYW1wbGVfcmF0ZT0lZCwgIgorCQkJCQkiYXVfcGVzaWQ9JWMsIHZpX2ZyYW1lX3JhdGU9JWQsICIKKwkJCQkJInZpX2ZyYW1lc19wZXJfZ29wPSVkLCAiCisJCQkJCSJ2aV9iZnJhbWVzX2NvdW50PSVkLCB2aV9wZXNpZD0lY1xuIiwKKwkJCQkJcC0+dHNfcGlkX3BtdCxwLT50c19waWRfYXVkaW8sCisJCQkJCXAtPnRzX3BpZF92aWRlbyxwLT50c19waWRfcGNyLAorCQkJCQlwLT5wc19zaXplLCBwLT5hdV9zYW1wbGVfcmF0ZSwKKwkJCQkJcC0+YXVfcGVzaWQsIHAtPnZpX2ZyYW1lX3JhdGUsCisJCQkJCXAtPnZpX2ZyYW1lc19wZXJfZ29wLAorCQkJCQlwLT52aV9iZnJhbWVzX2NvdW50LCBwLT52aV9wZXNpZCk7CisJCWJyZWFrOworCX0KKwljYXNlIFZJRElPQ19TX01QRUdDT01QOgorCXsKKwkJc3RydWN0IHY0bDJfbXBlZ19jb21wcmVzc2lvbiAqcD1hcmc7CisJCS8qRklYTUU6IFNldmVyYWwgZmllbGRzIG5vdCBzaG93biAqLworCQlpZiAoIXZmZC0+dmlkaW9jX3NfbXBlZ2NvbXApCisJCQlicmVhazsKKwkJZGJnYXJnIChjbWQsICJ0c19waWRfcG10PSVkLCB0c19waWRfYXVkaW89JWQsICIKKwkJCQkidHNfcGlkX3ZpZGVvPSVkLCB0c19waWRfcGNyPSVkLCBwc19zaXplPSVkLCAiCisJCQkJImF1X3NhbXBsZV9yYXRlPSVkLCBhdV9wZXNpZD0lYywgIgorCQkJCSJ2aV9mcmFtZV9yYXRlPSVkLCB2aV9mcmFtZXNfcGVyX2dvcD0lZCwgIgorCQkJCSJ2aV9iZnJhbWVzX2NvdW50PSVkLCB2aV9wZXNpZD0lY1xuIiwKKwkJCQlwLT50c19waWRfcG10LHAtPnRzX3BpZF9hdWRpbywgcC0+dHNfcGlkX3ZpZGVvLAorCQkJCXAtPnRzX3BpZF9wY3IsIHAtPnBzX3NpemUsIHAtPmF1X3NhbXBsZV9yYXRlLAorCQkJCXAtPmF1X3Blc2lkLCBwLT52aV9mcmFtZV9yYXRlLAorCQkJCXAtPnZpX2ZyYW1lc19wZXJfZ29wLCBwLT52aV9iZnJhbWVzX2NvdW50LAorCQkJCXAtPnZpX3Blc2lkKTsKKwkJcmV0PXZmZC0+dmlkaW9jX3NfbXBlZ2NvbXAoZmlsZSwgZmgsIHApOworCQlicmVhazsKKwl9CisJY2FzZSBWSURJT0NfR19KUEVHQ09NUDoKKwl7CisJCXN0cnVjdCB2NGwyX2pwZWdjb21wcmVzc2lvbiAqcD1hcmc7CisJCWlmICghdmZkLT52aWRpb2NfZ19qcGVnY29tcCkKKwkJCWJyZWFrOworCQlyZXQ9dmZkLT52aWRpb2NfZ19qcGVnY29tcChmaWxlLCBmaCwgcCk7CisJCWlmICghcmV0KQorCQkJZGJnYXJnIChjbWQsICJxdWFsaXR5PSVkLCBBUFBuPSVkLCAiCisJCQkJCQkiQVBQX2xlbj0lZCwgQ09NX2xlbj0lZCwgIgorCQkJCQkJImpwZWdfbWFya2Vycz0lZFxuIiwKKwkJCQkJCXAtPnF1YWxpdHkscC0+QVBQbixwLT5BUFBfbGVuLAorCQkJCQkJcC0+Q09NX2xlbixwLT5qcGVnX21hcmtlcnMpOworCQlicmVhazsKKwl9CisJY2FzZSBWSURJT0NfU19KUEVHQ09NUDoKKwl7CisJCXN0cnVjdCB2NGwyX2pwZWdjb21wcmVzc2lvbiAqcD1hcmc7CisJCWlmICghdmZkLT52aWRpb2NfZ19qcGVnY29tcCkKKwkJCWJyZWFrOworCQlkYmdhcmcgKGNtZCwgInF1YWxpdHk9JWQsIEFQUG49JWQsIEFQUF9sZW49JWQsICIKKwkJCQkJIkNPTV9sZW49JWQsIGpwZWdfbWFya2Vycz0lZFxuIiwKKwkJCQkJcC0+cXVhbGl0eSxwLT5BUFBuLHAtPkFQUF9sZW4sCisJCQkJCXAtPkNPTV9sZW4scC0+anBlZ19tYXJrZXJzKTsKKwkJCXJldD12ZmQtPnZpZGlvY19zX2pwZWdjb21wKGZpbGUsIGZoLCBwKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgVklESU9DX0dfUEFSTToKKwl7CisJCXN0cnVjdCB2NGwyX3N0cmVhbXBhcm0gKnA9YXJnOworCQlpZiAoIXZmZC0+dmlkaW9jX2dfcGFybSkKKwkJCWJyZWFrOworCQlyZXQ9dmZkLT52aWRpb2NfZ19wYXJtKGZpbGUsIGZoLCBwKTsKKwkJZGJnYXJnIChjbWQsICJ0eXBlPSVkXG4iLCBwLT50eXBlKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgVklESU9DX1NfUEFSTToKKwl7CisJCXN0cnVjdCB2NGwyX3N0cmVhbXBhcm0gKnA9YXJnOworCQlpZiAoIXZmZC0+dmlkaW9jX3NfcGFybSkKKwkJCWJyZWFrOworCQlkYmdhcmcgKGNtZCwgInR5cGU9JWRcbiIsIHAtPnR5cGUpOworCQlyZXQ9dmZkLT52aWRpb2Nfc19wYXJtKGZpbGUsIGZoLCBwKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgVklESU9DX0dfVFVORVI6CisJeworCQlzdHJ1Y3QgdjRsMl90dW5lciAqcD1hcmc7CisJCWlmICghdmZkLT52aWRpb2NfZ190dW5lcikKKwkJCWJyZWFrOworCQlyZXQ9dmZkLT52aWRpb2NfZ190dW5lcihmaWxlLCBmaCwgcCk7CisJCWlmICghcmV0KQorCQkJZGJnYXJnIChjbWQsICJpbmRleD0lZCwgbmFtZT0lcywgdHlwZT0lZCwgIgorCQkJCQkiY2FwYWJpbGl0eT0lZCwgcmFuZ2Vsb3c9JWQsICIKKwkJCQkJInJhbmdlaGlnaD0lZCwgc2lnbmFsPSVkLCBhZmM9JWQsICIKKwkJCQkJInJ4c3ViY2hhbnM9JWQsIGF1ZG1vZGU9JWRcbiIsCisJCQkJCXAtPmluZGV4LCBwLT5uYW1lLCBwLT50eXBlLAorCQkJCQlwLT5jYXBhYmlsaXR5LCBwLT5yYW5nZWxvdywKKwkJCQkJcC0+cmFuZ2VoaWdoLCBwLT5yeHN1YmNoYW5zLAorCQkJCQlwLT5hdWRtb2RlLCBwLT5zaWduYWwsIHAtPmFmYyk7CisJCWJyZWFrOworCX0KKwljYXNlIFZJRElPQ19TX1RVTkVSOgorCXsKKwkJc3RydWN0IHY0bDJfdHVuZXIgKnA9YXJnOworCQlpZiAoIXZmZC0+dmlkaW9jX3NfdHVuZXIpCisJCQlicmVhazsKKwkJZGJnYXJnIChjbWQsICJpbmRleD0lZCwgbmFtZT0lcywgdHlwZT0lZCwgIgorCQkJCSJjYXBhYmlsaXR5PSVkLCByYW5nZWxvdz0lZCwgcmFuZ2VoaWdoPSVkLCAiCisJCQkJInNpZ25hbD0lZCwgYWZjPSVkLCByeHN1YmNoYW5zPSVkLCAiCisJCQkJImF1ZG1vZGU9JWRcbiIscC0+aW5kZXgsIHAtPm5hbWUsIHAtPnR5cGUsCisJCQkJcC0+Y2FwYWJpbGl0eSwgcC0+cmFuZ2Vsb3cscC0+cmFuZ2VoaWdoLAorCQkJCXAtPnJ4c3ViY2hhbnMsIHAtPmF1ZG1vZGUsIHAtPnNpZ25hbCwKKwkJCQlwLT5hZmMpOworCQlyZXQ9dmZkLT52aWRpb2Nfc190dW5lcihmaWxlLCBmaCwgcCk7CisJCWJyZWFrOworCX0KKwljYXNlIFZJRElPQ19HX0ZSRVFVRU5DWToKKwl7CisJCXN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqcD1hcmc7CisJCWlmICghdmZkLT52aWRpb2NfZ19mcmVxdWVuY3kpCisJCQlicmVhazsKKwkJcmV0PXZmZC0+dmlkaW9jX2dfZnJlcXVlbmN5KGZpbGUsIGZoLCBwKTsKKwkJaWYgKCFyZXQpCisJCQlkYmdhcmcgKGNtZCwgInR1bmVyPSVkLCB0eXBlPSVkLCBmcmVxdWVuY3k9JWRcbiIsCisJCQkJCQlwLT50dW5lcixwLT50eXBlLHAtPmZyZXF1ZW5jeSk7CisJCWJyZWFrOworCX0KKwljYXNlIFZJRElPQ19TX0ZSRVFVRU5DWToKKwl7CisJCXN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqcD1hcmc7CisJCWlmICghdmZkLT52aWRpb2Nfc19mcmVxdWVuY3kpCisJCQlicmVhazsKKwkJZGJnYXJnIChjbWQsICJ0dW5lcj0lZCwgdHlwZT0lZCwgZnJlcXVlbmN5PSVkXG4iLAorCQkJCXAtPnR1bmVyLHAtPnR5cGUscC0+ZnJlcXVlbmN5KTsKKwkJcmV0PXZmZC0+dmlkaW9jX3NfZnJlcXVlbmN5KGZpbGUsIGZoLCBwKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgVklESU9DX0dfU0xJQ0VEX1ZCSV9DQVA6CisJeworCQlzdHJ1Y3QgdjRsMl9zbGljZWRfdmJpX2NhcCAqcD1hcmc7CisJCWlmICghdmZkLT52aWRpb2NfZ19zbGljZWRfdmJpX2NhcCkKKwkJCWJyZWFrOworCQlyZXQ9dmZkLT52aWRpb2NfZ19zbGljZWRfdmJpX2NhcChmaWxlLCBmaCwgcCk7CisJCWlmICghcmV0KQorCQkJZGJnYXJnIChjbWQsICJzZXJ2aWNlX3NldD0lZFxuIiwgcC0+c2VydmljZV9zZXQpOworCQlicmVhazsKKwl9CisJY2FzZSBWSURJT0NfTE9HX1NUQVRVUzoKKwl7CisJCWlmICghdmZkLT52aWRpb2NfbG9nX3N0YXR1cykKKwkJCWJyZWFrOworCQlyZXQ9dmZkLT52aWRpb2NfbG9nX3N0YXR1cyhmaWxlLCBmaCk7CisJCWJyZWFrOworCX0KKworCS8qIC0tLSBPdGhlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwlkZWZhdWx0OgorCQlyZXQ9djRsX2NvbXBhdF90cmFuc2xhdGVfaW9jdGwoaW5vZGUsZmlsZSxjbWQsYXJnLF9fdmlkZW9fZG9faW9jdGwpOworCX0KKworCWlmICh2ZmQtPmRlYnVnICYgVjRMMl9ERUJVR19JT0NUTF9BUkcpIHsKKwkJaWYgKHJldDwwKSB7CisJCQlwcmludGsgKCIlczogZXJyOlxuIiwgdmZkLT5uYW1lKTsKKwkJCXY0bF9wcmludF9pb2N0bCh2ZmQtPm5hbWUsIGNtZCk7CisJCX0KKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgdmlkZW9faW9jdGwyIChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJY2hhcglzYnVmWzEyOF07CisJdm9pZCAgICAqbWJ1ZiA9IE5VTEw7CisJdm9pZAkqcGFyZyA9IE5VTEw7CisJaW50CWVyciAgPSAtRUlOVkFMOworCWludCAgICAgaXNfZXh0X2N0cmw7CisJc2l6ZV90ICBjdHJsc19zaXplID0gMDsKKwl2b2lkIF9fdXNlciAqdXNlcl9wdHIgPSBOVUxMOworCisjaWZkZWYgX19PTERfVklESU9DXworCWNtZCA9IHZpZGVvX2ZpeF9jb21tYW5kKGNtZCk7CisjZW5kaWYKKwlpc19leHRfY3RybCA9IChjbWQgPT0gVklESU9DX1NfRVhUX0NUUkxTIHx8IGNtZCA9PSBWSURJT0NfR19FWFRfQ1RSTFMgfHwKKwkJICAgICAgIGNtZCA9PSBWSURJT0NfVFJZX0VYVF9DVFJMUyk7CiAKIAkvKiAgQ29weSBhcmd1bWVudHMgaW50byB0ZW1wIGtlcm5lbCBidWZmZXIgICovCiAJc3dpdGNoIChfSU9DX0RJUihjbWQpKSB7CkBAIC0xOTQsMTMgKzE0MjgsNDMgQEAKIAkJYnJlYWs7CiAJfQogCi0JLyogY2FsbCBkcml2ZXIgKi8KLQllcnIgPSBmdW5jKGlub2RlLCBmaWxlLCBjbWQsIHBhcmcpOworCWlmIChpc19leHRfY3RybCkgeworCQlzdHJ1Y3QgdjRsMl9leHRfY29udHJvbHMgKnAgPSBwYXJnOworCisJCS8qIEluIGNhc2Ugb2YgYW4gZXJyb3IsIHRlbGwgdGhlIGNhbGxlciB0aGF0IGl0IHdhc24ndAorCQkgICBhIHNwZWNpZmljIGNvbnRyb2wgdGhhdCBjYXVzZWQgaXQuICovCisJCXAtPmVycm9yX2lkeCA9IHAtPmNvdW50OworCQl1c2VyX3B0ciA9ICh2b2lkIF9fdXNlciAqKXAtPmNvbnRyb2xzOworCQlpZiAocC0+Y291bnQpIHsKKwkJCWN0cmxzX3NpemUgPSBzaXplb2Yoc3RydWN0IHY0bDJfZXh0X2NvbnRyb2wpICogcC0+Y291bnQ7CisJCQkvKiBOb3RlOiB2NGwyX2V4dF9jb250cm9scyBmaXRzIGluIHNidWZbXSBzbyBtYnVmIGlzIHN0aWxsIE5VTEwuICovCisJCQltYnVmID0ga21hbGxvYyhjdHJsc19zaXplLCBHRlBfS0VSTkVMKTsKKwkJCWVyciA9IC1FTk9NRU07CisJCQlpZiAoTlVMTCA9PSBtYnVmKQorCQkJCWdvdG8gb3V0X2V4dF9jdHJsOworCQkJZXJyID0gLUVGQVVMVDsKKwkJCWlmIChjb3B5X2Zyb21fdXNlcihtYnVmLCB1c2VyX3B0ciwgY3RybHNfc2l6ZSkpCisJCQkJZ290byBvdXRfZXh0X2N0cmw7CisJCQlwLT5jb250cm9scyA9IG1idWY7CisJCX0KKwl9CisKKwkvKiBIYW5kbGVzIElPQ1RMICovCisJZXJyID0gX192aWRlb19kb19pb2N0bChpbm9kZSwgZmlsZSwgY21kLCBwYXJnKTsKIAlpZiAoZXJyID09IC1FTk9JT0NUTENNRCkKIAkJZXJyID0gLUVJTlZBTDsKKwlpZiAoaXNfZXh0X2N0cmwpIHsKKwkJc3RydWN0IHY0bDJfZXh0X2NvbnRyb2xzICpwID0gcGFyZzsKKworCQlwLT5jb250cm9scyA9ICh2b2lkICopdXNlcl9wdHI7CisJCWlmIChwLT5jb3VudCAmJiBlcnIgPT0gMCAmJiBjb3B5X3RvX3VzZXIodXNlcl9wdHIsIG1idWYsIGN0cmxzX3NpemUpKQorCQkJZXJyID0gLUVGQVVMVDsKKwkJZ290byBvdXRfZXh0X2N0cmw7CisJfQogCWlmIChlcnIgPCAwKQogCQlnb3RvIG91dDsKIAorb3V0X2V4dF9jdHJsOgogCS8qICBDb3B5IHJlc3VsdHMgaW50byB1c2VyIGJ1ZmZlciAgKi8KIAlzd2l0Y2ggKF9JT0NfRElSKGNtZCkpCiAJewpAQCAtMjE2LDMxICsxNDgwLDYgQEAKIAlyZXR1cm4gZXJyOwogfQogCi0vKgotICogb3Blbi9yZWxlYXNlIGhlbHBlciBmdW5jdGlvbnMgLS0gaGFuZGxlIGV4Y2x1c2l2ZSBvcGVucwotICovCi1pbnQgdmlkZW9fZXhjbHVzaXZlX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0ICB2aWRlb19kZXZpY2UgKnZmbCA9IHZpZGVvX2RldmRhdGEoZmlsZSk7Ci0JaW50IHJldHZhbCA9IDA7Ci0KLQltdXRleF9sb2NrKCZ2ZmwtPmxvY2spOwotCWlmICh2ZmwtPnVzZXJzKSB7Ci0JCXJldHZhbCA9IC1FQlVTWTsKLQl9IGVsc2UgewotCQl2ZmwtPnVzZXJzKys7Ci0JfQotCW11dGV4X3VubG9jaygmdmZsLT5sb2NrKTsKLQlyZXR1cm4gcmV0dmFsOwotfQotCi1pbnQgdmlkZW9fZXhjbHVzaXZlX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0ICB2aWRlb19kZXZpY2UgKnZmbCA9IHZpZGVvX2RldmRhdGEoZmlsZSk7Ci0KLQl2ZmwtPnVzZXJzLS07Ci0JcmV0dXJuIDA7Ci19CiAKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHZpZGVvX2ZvcHM7CiAKQEAgLTM3MSw3ICsxNjEwLDkgQEAKIAltdXRleF91bmxvY2soJnZpZGVvZGV2X2xvY2spOwogfQogCi0KKy8qCisgKiBWaWRlbyBmcyBvcGVyYXRpb25zCisgKi8KIHN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHZpZGVvX2ZvcHM9CiB7CiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLApAQCAtMzg3LDcgKzE2MjgsNyBAQAogewogCWludCByZXQ7CiAKLQlwcmludGsoS0VSTl9JTkZPICJMaW51eCB2aWRlbyBjYXB0dXJlIGludGVyZmFjZTogdjEuMDBcbiIpOworCXByaW50ayhLRVJOX0lORk8gIkxpbnV4IHZpZGVvIGNhcHR1cmUgaW50ZXJmYWNlOiB2Mi4wMFxuIik7CiAJaWYgKHJlZ2lzdGVyX2NocmRldihWSURFT19NQUpPUiwgVklERU9fTkFNRSwgJnZpZGVvX2ZvcHMpKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgInZpZGVvX2RldjogdW5hYmxlIHRvIGdldCBtYWpvciAlZFxuIiwgVklERU9fTUFKT1IpOwogCQlyZXR1cm4gLUVJTzsKQEAgLTQxOCwxMSArMTY1OSwxMiBAQAogRVhQT1JUX1NZTUJPTCh2aWRlb191c2VyY29weSk7CiBFWFBPUlRfU1lNQk9MKHZpZGVvX2V4Y2x1c2l2ZV9vcGVuKTsKIEVYUE9SVF9TWU1CT0wodmlkZW9fZXhjbHVzaXZlX3JlbGVhc2UpOworRVhQT1JUX1NZTUJPTCh2aWRlb19pb2N0bDIpOwogRVhQT1JUX1NZTUJPTCh2aWRlb19kZXZpY2VfYWxsb2MpOwogRVhQT1JUX1NZTUJPTCh2aWRlb19kZXZpY2VfcmVsZWFzZSk7CiAKLU1PRFVMRV9BVVRIT1IoIkFsYW4gQ294Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkRldmljZSByZWdpc3RyYXIgZm9yIFZpZGVvNExpbnV4IGRyaXZlcnMiKTsKK01PRFVMRV9BVVRIT1IoIkFsYW4gQ294LCBNYXVybyBDYXJ2YWxobyBDaGVoYWIgPG1jaGVoYWJAaW5mcmFkZWFkLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRGV2aWNlIHJlZ2lzdHJhciBmb3IgVmlkZW80TGludXggZHJpdmVycyB2MiIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmluby5jIGIvZHJpdmVycy9tZWRpYS92aWRlby92aW5vLmMKaW5kZXggYThjMTAxNC4uMjY4ZTY5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby92aW5vLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby92aW5vLmMKQEAgLTQwLDcgKzQwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pMmMtYWxnby1zZ2kuaD4KIAogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+Ci0jaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KICNpbmNsdWRlIDxsaW51eC92aWRlb19kZWNvZGVyLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby92aXZpLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpdmkuYwppbmRleCA3NzlkYjI2Li40MWQyM2M4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpdmkuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpdmkuYwpAQCAtNDgsMzQgKzQ4LDE1IEBACiAKICNpbmNsdWRlICJmb250LmgiCiAKLSNpZm5kZWYga3phbGxvYwotI2RlZmluZSBremFsbG9jKHNpemUsIGZsYWdzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0oeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQl2b2lkICpfX3JldCA9IGttYWxsb2Moc2l6ZSwgZmxhZ3MpOyAgICAgICAgICAgICBcCi0JaWYgKF9fcmV0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQltZW1zZXQoX19yZXQsIDAsIHNpemUpOyAgICAgICAgICAgICAgICAgXAotCV9fcmV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0pCi0jZW5kaWYKLQotTU9EVUxFX0RFU0NSSVBUSU9OKCJWaWRlbyBUZWNobm9sb2d5IE1hZ2F6aW5lIFZpcnR1YWwgVmlkZW8gQ2FwdHVyZSBCb2FyZCIpOwotTU9EVUxFX0FVVEhPUigiTWF1cm8gQ2FydmFsaG8gQ2hlaGFiLCBUZWQgV2FsdGhlciBhbmQgSm9obiBTb2tvbCIpOwotTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOwotCiAjZGVmaW5lIFZJVklfTUFKT1JfVkVSU0lPTiAwCiAjZGVmaW5lIFZJVklfTUlOT1JfVkVSU0lPTiA0CiAjZGVmaW5lIFZJVklfUkVMRUFTRSAwCiAjZGVmaW5lIFZJVklfVkVSU0lPTiBLRVJORUxfVkVSU0lPTihWSVZJX01BSk9SX1ZFUlNJT04sIFZJVklfTUlOT1JfVkVSU0lPTiwgVklWSV9SRUxFQVNFKQogCi1zdGF0aWMgaW50IHZpZGVvX25yID0gLTE7ICAgICAgICAvKiAvZGV2L3ZpZGVvTiwgLTEgZm9yIGF1dG9kZXRlY3QgKi8KLW1vZHVsZV9wYXJhbSh2aWRlb19uciwgaW50LCAwKTsKLQotc3RhdGljIGludCBkZWJ1ZyA9IDA7Ci1tb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMCk7Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgdmlkX2xpbWl0ID0gMTY7Ci1tb2R1bGVfcGFyYW0odmlkX2xpbWl0LGludCwwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0ModmlkX2xpbWl0LCJjYXB0dXJlIG1lbW9yeSBsaW1pdCBpbiBtZWdhYnl0ZXMiKTsKKy8qIERlY2xhcmUgc3RhdGljIHZhcnMgdGhhdCB3aWxsIGJlIHVzZWQgYXMgcGFyYW1ldGVycyAqLworc3RhdGljIHVuc2lnbmVkIGludCB2aWRfbGltaXQgPSAxNjsJLyogVmlkZW8gbWVtb3J5IGxpbWl0LCBpbiBNYiAqLworc3RhdGljIHN0cnVjdCB2aWRlb19kZXZpY2Ugdml2aTsJLyogVmlkZW8gZGV2aWNlICovCitzdGF0aWMgaW50IHZpZGVvX25yID0gLTE7CQkvKiAvZGV2L3ZpZGVvTiwgLTEgZm9yIGF1dG9kZXRlY3QgKi8KIAogLyogc3VwcG9ydGVkIGNvbnRyb2xzICovCiBzdGF0aWMgc3RydWN0IHY0bDJfcXVlcnljdHJsIHZpdmlfcWN0cmxbXSA9IHsKQEAgLTEyOSwxMCArMTEwLDEwIEBACiAKIHN0YXRpYyBpbnQgcWN0bF9yZWdzW0FSUkFZX1NJWkUodml2aV9xY3RybCldOwogCi0jZGVmaW5lIGRwcmludGsobGV2ZWwsZm10LCBhcmcuLi4pCQkJICAgICBcCi0JZG8geyAJCQkJCQkgICAgIFwKLQkJaWYgKGRlYnVnID49IChsZXZlbCkpCQkJICAgICBcCi0JCQlwcmludGsoS0VSTl9ERUJVRyAidml2aTogIiBmbXQgLCAjIyBhcmcpOyAgICBcCisjZGVmaW5lIGRwcmludGsobGV2ZWwsZm10LCBhcmcuLi4pCQkJCQlcCisJZG8gewkJCQkJCQkJXAorCQlpZiAodml2aS5kZWJ1ZyA+PSAobGV2ZWwpKQkJCQlcCisJCQlwcmludGsoS0VSTl9ERUJVRyAidml2aTogIiBmbXQgLCAjIyBhcmcpOwlcCiAJfSB3aGlsZSAoMCkKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xOTAsNyArMTcxLDcgQEAKIAogCS8qIHZhcmlvdXMgZGV2aWNlIGluZm8gKi8KIAl1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICByZXNvdXJjZXM7Ci0Jc3RydWN0IHZpZGVvX2RldmljZSAgICAgICAgdmlkZW9fZGV2OworCXN0cnVjdCB2aWRlb19kZXZpY2UgICAgICAgIHZmZDsKIAogCXN0cnVjdCB2aXZpX2RtYXF1ZXVlICAgICAgIHZpZHE7CiAKQEAgLTI0OCw3ICsyMjksOCBAQAogI2RlZmluZSBUU1RBTVBfTUFYX1kgVFNUQU1QX01JTl9ZKzE1CiAjZGVmaW5lIFRTVEFNUF9NSU5fWCA2NAogCi12b2lkIHByZXBfdG9fYWRkcihzdHJ1Y3Qgc2dfdG9fYWRkciB0b19hZGRyW10sc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqdmIpCitzdGF0aWMgdm9pZCBwcmVwX3RvX2FkZHIoc3RydWN0IHNnX3RvX2FkZHIgdG9fYWRkcltdLAorCQkJIHN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZiKQogewogCWludCBpLCBwb3M9MDsKIApAQCAtMjU5LDcgKzI0MSw3IEBACiAJfQogfQogCi1pbmxpbmUgaW50IGdldF9hZGRyX3BvcyhpbnQgcG9zLCBpbnQgcGFnZXMsIHN0cnVjdCBzZ190b19hZGRyIHRvX2FkZHJbXSkKK3N0YXRpYyBpbnQgZ2V0X2FkZHJfcG9zKGludCBwb3MsIGludCBwYWdlcywgc3RydWN0IHNnX3RvX2FkZHIgdG9fYWRkcltdKQogewogCWludCBwMT0wLHAyPXBhZ2VzLTEscDM9cGFnZXMvMjsKIApAQCAtMjgwLDggKzI2Miw4IEBACiAJcmV0dXJuIChwMSk7CiB9CiAKLXZvaWQgZ2VuX2xpbmUoc3RydWN0IHNnX3RvX2FkZHIgdG9fYWRkcltdLGludCBpbmlwb3MsaW50IHBhZ2VzLGludCB3bWF4LAotCQkJCQlpbnQgaG1heCwgaW50IGxpbmUsIGNoYXIgKnRpbWVzdHIpCitzdGF0aWMgdm9pZCBnZW5fbGluZShzdHJ1Y3Qgc2dfdG9fYWRkciB0b19hZGRyW10saW50IGluaXBvcyxpbnQgcGFnZXMsaW50IHdtYXgsCisJCSAgICAgaW50IGhtYXgsIGludCBsaW5lLCBjaGFyICp0aW1lc3RyKQogewogCWludCAgdyxpLGoscG9zPWluaXBvcyxwZ3BvcyxvbGRwZyx5OwogCWNoYXIgKnAsKnMsKmJhc2VwOwpAQCAtNDkxLDcgKzQ3Myw3IEBACiAJCWRwcmludGsoMSwiJXM6ICVkIGJ1ZmZlcnMgaGFuZGxlZCAoc2hvdWxkIGJlIDEpXG4iLF9fRlVOQ1RJT05fXyxiYyk7CiB9CiAKLXZvaWQgdml2aV9zbGVlcChzdHJ1Y3Qgdml2aV9kbWFxdWV1ZSAgKmRtYV9xKQorc3RhdGljIHZvaWQgdml2aV9zbGVlcChzdHJ1Y3Qgdml2aV9kbWFxdWV1ZSAgKmRtYV9xKQogewogCWludCB0aW1lb3V0OwogCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOwpAQCAtNTI2LDcgKzUwOCw3IEBACiAJdHJ5X3RvX2ZyZWV6ZSgpOwogfQogCi1pbnQgdml2aV90aHJlYWQodm9pZCAqZGF0YSkKK3N0YXRpYyBpbnQgdml2aV90aHJlYWQodm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3Qgdml2aV9kbWFxdWV1ZSAgKmRtYV9xPWRhdGE7CiAKQEAgLTU0Miw3ICs1MjQsNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQgdml2aV9zdGFydF90aHJlYWQoc3RydWN0IHZpdmlfZG1hcXVldWUgICpkbWFfcSkKK3N0YXRpYyBpbnQgdml2aV9zdGFydF90aHJlYWQoc3RydWN0IHZpdmlfZG1hcXVldWUgICpkbWFfcSkKIHsKIAlkbWFfcS0+ZnJhbWU9MDsKIAlkbWFfcS0+aW5pX2ppZmZpZXM9amlmZmllczsKQEAgLTU2MCw3ICs1NDIsNyBAQAogCXJldHVybiAwOwogfQogCi12b2lkIHZpdmlfc3RvcF90aHJlYWQoc3RydWN0IHZpdmlfZG1hcXVldWUgICpkbWFfcSkKK3N0YXRpYyB2b2lkIHZpdmlfc3RvcF90aHJlYWQoc3RydWN0IHZpdmlfZG1hcXVldWUgICpkbWFfcSkKIHsKIAlkcHJpbnRrKDEsIiVzXG4iLF9fRlVOQ1RJT05fXyk7CiAJLyogc2h1dGRvd24gY29udHJvbCB0aHJlYWQgKi8KQEAgLTY2Niw4ICs2NDgsNyBAQAogCXJldHVybiAwOwogfQogCi12b2lkCi1mcmVlX2J1ZmZlcihzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnZxLCBzdHJ1Y3Qgdml2aV9idWZmZXIgKmJ1ZikKK3N0YXRpYyB2b2lkIGZyZWVfYnVmZmVyKHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqdnEsIHN0cnVjdCB2aXZpX2J1ZmZlciAqYnVmKQogewogCWRwcmludGsoMSwiJXNcbiIsX19GVU5DVElPTl9fKTsKIApAQCAtNzkxLDggKzc3Miw4IEBACiAJZnJlZV9idWZmZXIodnEsYnVmKTsKIH0KIAotaW50IHZpdmlfbWFwX3NnICh2b2lkICpkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBuZW50cywKLQkgICBpbnQgZGlyZWN0aW9uKQorc3RhdGljIGludCB2aXZpX21hcF9zZyh2b2lkICpkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBuZW50cywKKwkJICAgICAgIGludCBkaXJlY3Rpb24pCiB7CiAJaW50IGk7CiAKQEAgLTgwOCwxNSArNzg5LDE1IEBACiAJcmV0dXJuIG5lbnRzOwogfQogCi1pbnQgdml2aV91bm1hcF9zZyh2b2lkICpkZXYsc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2xpc3QsaW50IG5yX3BhZ2VzLAotCQkJCQlpbnQgZGlyZWN0aW9uKQorc3RhdGljIGludCB2aXZpX3VubWFwX3NnKHZvaWQgKmRldixzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbGlzdCxpbnQgbnJfcGFnZXMsCisJCQkgaW50IGRpcmVjdGlvbikKIHsKIAlkcHJpbnRrKDEsIiVzXG4iLF9fRlVOQ1RJT05fXyk7CiAJcmV0dXJuIDA7CiB9CiAKLWludCB2aXZpX2RtYV9zeW5jX3NnKHZvaWQgKmRldixzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbGlzdCxpbnQgbnJfcGFnZXMsCi0JCQkJCWludCBkaXJlY3Rpb24pCitzdGF0aWMgaW50IHZpdmlfZG1hX3N5bmNfc2codm9pZCAqZGV2LHN0cnVjdCBzY2F0dGVybGlzdCAqc2dsaXN0LCBpbnQgbnJfcGFnZXMsCisJCQkgICAgaW50IGRpcmVjdGlvbikKIHsKIC8vCWRwcmludGsoMSwiJXNcbiIsX19GVU5DVElPTl9fKTsKIApAQCAtODQwLDcgKzgyMSw4MCBAQAogCUlPQ1RMIGhhbmRsaW5nCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi1zdGF0aWMgaW50IHZpdmlfdHJ5X2ZtdChzdHJ1Y3Qgdml2aV9kZXYgKmRldiwgc3RydWN0IHZpdmlfZmggKmZoLAorCitzdGF0aWMgaW50IHJlc19nZXQoc3RydWN0IHZpdmlfZGV2ICpkZXYsIHN0cnVjdCB2aXZpX2ZoICpmaCkKK3sKKwkvKiBpcyBpdCBmcmVlPyAqLworCWRvd24oJmRldi0+bG9jayk7CisJaWYgKGRldi0+cmVzb3VyY2VzKSB7CisJCS8qIG5vLCBzb21lb25lIGVsc2UgdXNlcyBpdCAqLworCQl1cCgmZGV2LT5sb2NrKTsKKwkJcmV0dXJuIDA7CisJfQorCS8qIGl0J3MgZnJlZSwgZ3JhYiBpdCAqLworCWRldi0+cmVzb3VyY2VzID0xOworCWRwcmludGsoMSwicmVzOiBnZXRcbiIpOworCXVwKCZkZXYtPmxvY2spOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IHJlc19sb2NrZWQoc3RydWN0IHZpdmlfZGV2ICpkZXYpCit7CisJcmV0dXJuIChkZXYtPnJlc291cmNlcyk7Cit9CisKK3N0YXRpYyB2b2lkIHJlc19mcmVlKHN0cnVjdCB2aXZpX2RldiAqZGV2LCBzdHJ1Y3Qgdml2aV9maCAqZmgpCit7CisJZG93bigmZGV2LT5sb2NrKTsKKwlkZXYtPnJlc291cmNlcyA9IDA7CisJZHByaW50aygxLCJyZXM6IHB1dFxuIik7CisJdXAoJmRldi0+bG9jayk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUlPQ1RMIHZpZGlvYyBoYW5kbGluZworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBpbnQgdmlkaW9jX3F1ZXJ5Y2FwIChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAgKnByaXYsCisJCQkJCXN0cnVjdCB2NGwyX2NhcGFiaWxpdHkgKmNhcCkKK3sKKwlzdHJjcHkoY2FwLT5kcml2ZXIsICJ2aXZpIik7CisJc3RyY3B5KGNhcC0+Y2FyZCwgInZpdmkiKTsKKwljYXAtPnZlcnNpb24gPSBWSVZJX1ZFUlNJT047CisJY2FwLT5jYXBhYmlsaXRpZXMgPQlWNEwyX0NBUF9WSURFT19DQVBUVVJFIHwKKwkJCQlWNEwyX0NBUF9TVFJFQU1JTkcgICAgIHwKKwkJCQlWNEwyX0NBUF9SRUFEV1JJVEU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX2VudW1fZm10X2NhcCAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgICpwcml2LAorCQkJCQlzdHJ1Y3QgdjRsMl9mbXRkZXNjICpmKQoreworCWlmIChmLT5pbmRleCA+IDApCisJCXJldHVybiAtRUlOVkFMOworCisJc3RybGNweShmLT5kZXNjcmlwdGlvbixmb3JtYXQubmFtZSxzaXplb2YoZi0+ZGVzY3JpcHRpb24pKTsKKwlmLT5waXhlbGZvcm1hdCA9IGZvcm1hdC5mb3VyY2M7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX2dfZm10X2NhcCAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJCXN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKK3sKKwlzdHJ1Y3Qgdml2aV9maCAgKmZoPXByaXY7CisKKwlmLT5mbXQucGl4LndpZHRoICAgICAgICA9IGZoLT53aWR0aDsKKwlmLT5mbXQucGl4LmhlaWdodCAgICAgICA9IGZoLT5oZWlnaHQ7CisJZi0+Zm10LnBpeC5maWVsZCAgICAgICAgPSBmaC0+dmJfdmlkcS5maWVsZDsKKwlmLT5mbXQucGl4LnBpeGVsZm9ybWF0ICA9IGZoLT5mbXQtPmZvdXJjYzsKKwlmLT5mbXQucGl4LmJ5dGVzcGVybGluZSA9CisJCShmLT5mbXQucGl4LndpZHRoICogZmgtPmZtdC0+ZGVwdGgpID4+IDM7CisJZi0+Zm10LnBpeC5zaXplaW1hZ2UgPQorCQlmLT5mbXQucGl4LmhlaWdodCAqIGYtPmZtdC5waXguYnl0ZXNwZXJsaW5lOworCisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludCB2aWRpb2NfdHJ5X2ZtdF9jYXAgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAogCQkJc3RydWN0IHY0bDJfZm9ybWF0ICpmKQogewogCXN0cnVjdCB2aXZpX2ZtdCAqZm10OwpAQCAtODQ4LDcgKzkwMiw4IEBACiAJdW5zaWduZWQgaW50IG1heHcsIG1heGg7CiAKIAlpZiAoZm9ybWF0LmZvdXJjYyAhPSBmLT5mbXQucGl4LnBpeGVsZm9ybWF0KSB7Ci0JCWRwcmludGsoMSwiRm91cmNjIGZvcm1hdCBpbnZhbGlkLlxuIik7CisJCWRwcmludGsoMSwiRm91cmNjIGZvcm1hdCAoMHglMDh4KSBpbnZhbGlkLiBEcml2ZXIgYWNjZXB0cyAiCisJCQkib25seSAweCUwOHhcbiIsZi0+Zm10LnBpeC5waXhlbGZvcm1hdCxmb3JtYXQuZm91cmNjKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWZtdD0mZm9ybWF0OwpAQCAtODg0LDM1NiArOTM5LDE5NiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHJlc19nZXQoc3RydWN0IHZpdmlfZGV2ICpkZXYsIHN0cnVjdCB2aXZpX2ZoICpmaCkKKy8qRklYTUU6IFRoaXMgc2VlbXMgdG8gYmUgZ2VuZXJpYyBlbm91Z2ggdG8gYmUgYXQgdmlkZW9kZXYyICovCitzdGF0aWMgaW50IHZpZGlvY19zX2ZtdF9jYXAgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCiB7Ci0JLyogaXMgaXQgZnJlZT8gKi8KLQlkb3duKCZkZXYtPmxvY2spOwotCWlmIChkZXYtPnJlc291cmNlcykgewotCQkvKiBubywgc29tZW9uZSBlbHNlIHVzZXMgaXQgKi8KLQkJdXAoJmRldi0+bG9jayk7Ci0JCXJldHVybiAwOwotCX0KLQkvKiBpdCdzIGZyZWUsIGdyYWIgaXQgKi8KLQlkZXYtPnJlc291cmNlcyA9MTsKLQlkcHJpbnRrKDEsInJlczogZ2V0XG4iKTsKLQl1cCgmZGV2LT5sb2NrKTsKLQlyZXR1cm4gMTsKKwlzdHJ1Y3Qgdml2aV9maCAgKmZoPXByaXY7CisJaW50IHJldCA9IHZpZGlvY190cnlfZm10X2NhcChmaWxlLGZoLGYpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gKHJldCk7CisKKwlmaC0+Zm10ICAgICAgICAgICA9ICZmb3JtYXQ7CisJZmgtPndpZHRoICAgICAgICAgPSBmLT5mbXQucGl4LndpZHRoOworCWZoLT5oZWlnaHQgICAgICAgID0gZi0+Zm10LnBpeC5oZWlnaHQ7CisJZmgtPnZiX3ZpZHEuZmllbGQgPSBmLT5mbXQucGl4LmZpZWxkOworCWZoLT50eXBlICAgICAgICAgID0gZi0+dHlwZTsKKworCXJldHVybiAoMCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHJlc19sb2NrZWQoc3RydWN0IHZpdmlfZGV2ICpkZXYpCitzdGF0aWMgaW50IHZpZGlvY19yZXFidWZzIChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgc3RydWN0IHY0bDJfcmVxdWVzdGJ1ZmZlcnMgKnApCiB7Ci0JcmV0dXJuIChkZXYtPnJlc291cmNlcyk7CisJc3RydWN0IHZpdmlfZmggICpmaD1wcml2OworCisJcmV0dXJuICh2aWRlb2J1Zl9yZXFidWZzKCZmaC0+dmJfdmlkcSwgcCkpOwogfQogCi1zdGF0aWMgdm9pZCByZXNfZnJlZShzdHJ1Y3Qgdml2aV9kZXYgKmRldiwgc3RydWN0IHZpdmlfZmggKmZoKQorc3RhdGljIGludCB2aWRpb2NfcXVlcnlidWYgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBzdHJ1Y3QgdjRsMl9idWZmZXIgKnApCiB7Ci0JZG93bigmZGV2LT5sb2NrKTsKLQlkZXYtPnJlc291cmNlcyA9IDA7Ci0JZHByaW50aygxLCJyZXM6IHB1dFxuIik7Ci0JdXAoJmRldi0+bG9jayk7CisJc3RydWN0IHZpdmlfZmggICpmaD1wcml2OworCisJcmV0dXJuICh2aWRlb2J1Zl9xdWVyeWJ1ZigmZmgtPnZiX3ZpZHEsIHApKTsKIH0KIAotc3RhdGljIGludCB2aXZpX2RvX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCitzdGF0aWMgaW50IHZpZGlvY19xYnVmIChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgc3RydWN0IHY0bDJfYnVmZmVyICpwKQogewotCXN0cnVjdCB2aXZpX2ZoICAqZmggICAgID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCB2aXZpX2RldiAqZGV2ICAgID0gZmgtPmRldjsKLQlpbnQgcmV0PTA7CisJc3RydWN0IHZpdmlfZmggICpmaD1wcml2OwogCi0JaWYgKGRlYnVnKSB7Ci0JCWlmIChfSU9DX0RJUihjbWQpICYgX0lPQ19XUklURSkKLQkJCXY0bF9wcmludGtfaW9jdGxfYXJnKCJ2aXZpKHcpIixjbWQsIGFyZyk7Ci0JCWVsc2UgaWYgKCFfSU9DX0RJUihjbWQpICYgX0lPQ19SRUFEKSB7Ci0JCQl2NGxfcHJpbnRfaW9jdGwoInZpdmkiLCBjbWQpOwotCQl9Ci0JfQorCXJldHVybiAodmlkZW9idWZfcWJ1ZigmZmgtPnZiX3ZpZHEsIHApKTsKK30KIAotCXN3aXRjaChjbWQpIHsKLQkvKiAtLS0gY2FwYWJpbGl0aWVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCWNhc2UgVklESU9DX1FVRVJZQ0FQOgotCXsKLQkJc3RydWN0IHY0bDJfY2FwYWJpbGl0eSAqY2FwID0gKHN0cnVjdCB2NGwyX2NhcGFiaWxpdHkqKWFyZzsKK3N0YXRpYyBpbnQgdmlkaW9jX2RxYnVmIChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgc3RydWN0IHY0bDJfYnVmZmVyICpwKQoreworCXN0cnVjdCB2aXZpX2ZoICAqZmg9cHJpdjsKIAotCQltZW1zZXQoY2FwLCAwLCBzaXplb2YoKmNhcCkpOworCXJldHVybiAodmlkZW9idWZfZHFidWYoJmZoLT52Yl92aWRxLCBwLAorCQkJCWZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSk7Cit9CiAKLQkJc3RyY3B5KGNhcC0+ZHJpdmVyLCAidml2aSIpOwotCQlzdHJjcHkoY2FwLT5jYXJkLCAidml2aSIpOwotCQljYXAtPnZlcnNpb24gPSBWSVZJX1ZFUlNJT047Ci0JCWNhcC0+Y2FwYWJpbGl0aWVzID0KLQkJCQkJVjRMMl9DQVBfVklERU9fQ0FQVFVSRSB8Ci0JCQkJCVY0TDJfQ0FQX1NUUkVBTUlORyAgICAgfAotCQkJCQlWNEwyX0NBUF9SRUFEV1JJVEU7Ci0JCWJyZWFrOwotCX0KLQkvKiAtLS0gY2FwdHVyZSBpb2N0bHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCWNhc2UgVklESU9DX0VOVU1fRk1UOgotCXsKLQkJc3RydWN0IHY0bDJfZm10ZGVzYyAqZiA9IGFyZzsKLQkJZW51bSB2NGwyX2J1Zl90eXBlIHR5cGU7Ci0JCXVuc2lnbmVkIGludCBpbmRleDsKLQotCQlpbmRleCA9IGYtPmluZGV4OwotCQl0eXBlICA9IGYtPnR5cGU7Ci0KLQkJaWYgKGYtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKSB7Ci0JCQlyZXQ9LUVJTlZBTDsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJc3dpdGNoICh0eXBlKSB7Ci0JCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOgotCQkJaWYgKGluZGV4ID4gMCl7Ci0JCQkJcmV0PS1FSU5WQUw7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQltZW1zZXQoZiwwLHNpemVvZigqZikpOwotCi0JCQlmLT5pbmRleCA9IGluZGV4OwotCQkJZi0+dHlwZSAgPSB0eXBlOwotCQkJc3RybGNweShmLT5kZXNjcmlwdGlvbixmb3JtYXQubmFtZSxzaXplb2YoZi0+ZGVzY3JpcHRpb24pKTsKLQkJCWYtPnBpeGVsZm9ybWF0ID0gZm9ybWF0LmZvdXJjYzsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcmV0PS1FSU5WQUw7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCWNhc2UgVklESU9DX0dfRk1UOgotCXsKLQkJc3RydWN0IHY0bDJfZm9ybWF0ICpmID0gKHN0cnVjdCB2NGwyX2Zvcm1hdCAqKWFyZzsKLQotCQlpZiAoZi0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpIHsKLQkJCXJldD0tRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQotCQltZW1zZXQoJmYtPmZtdC5waXgsMCxzaXplb2YoZi0+Zm10LnBpeCkpOwotCQlmLT5mbXQucGl4LndpZHRoICAgICAgICA9IGZoLT53aWR0aDsKLQkJZi0+Zm10LnBpeC5oZWlnaHQgICAgICAgPSBmaC0+aGVpZ2h0OwotCQlmLT5mbXQucGl4LmZpZWxkICAgICAgICA9IGZoLT52Yl92aWRxLmZpZWxkOwotCQlmLT5mbXQucGl4LnBpeGVsZm9ybWF0ICA9IGZoLT5mbXQtPmZvdXJjYzsKLQkJZi0+Zm10LnBpeC5ieXRlc3BlcmxpbmUgPQotCQkJKGYtPmZtdC5waXgud2lkdGggKiBmaC0+Zm10LT5kZXB0aCkgPj4gMzsKLQkJZi0+Zm10LnBpeC5zaXplaW1hZ2UgPQotCQkJZi0+Zm10LnBpeC5oZWlnaHQgKiBmLT5mbXQucGl4LmJ5dGVzcGVybGluZTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgVklESU9DX1NfRk1UOgotCXsKLQkJc3RydWN0IHY0bDJfZm9ybWF0ICpmID0gYXJnOwotCi0JCWlmIChmLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkgewotCQkJZHByaW50aygxLCJPbmx5IGNhcHR1cmUgc3VwcG9ydGVkLlxuIik7Ci0JCQlyZXQ9LUVJTlZBTDsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJcmV0ID0gdml2aV90cnlfZm10KGRldixmaCxmKTsKLQkJaWYgKHJldCA8IDApCi0JCQlicmVhazsKLQotCQlmaC0+Zm10ICAgICAgICAgICA9ICZmb3JtYXQ7Ci0JCWZoLT53aWR0aCAgICAgICAgID0gZi0+Zm10LnBpeC53aWR0aDsKLQkJZmgtPmhlaWdodCAgICAgICAgPSBmLT5mbXQucGl4LmhlaWdodDsKLQkJZmgtPnZiX3ZpZHEuZmllbGQgPSBmLT5mbXQucGl4LmZpZWxkOwotCQlmaC0+dHlwZSAgICAgICAgICA9IGYtPnR5cGU7Ci0KLQkJYnJlYWs7Ci0JfQotCWNhc2UgVklESU9DX1RSWV9GTVQ6Ci0JewotCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYgPSBhcmc7Ci0JCWlmIChmLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkgewotCQkJcmV0PS1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQotCi0JCXJldD12aXZpX3RyeV9mbXQoZGV2LGZoLGYpOwotCQlicmVhazsKLQl9Ci0JY2FzZSBWSURJT0NfUkVRQlVGUzoKLQkJaWYgKGZoLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkgewotCQkJcmV0PS1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQotCQlyZXQ9dmlkZW9idWZfcmVxYnVmcygmZmgtPnZiX3ZpZHEsIGFyZyk7Ci0JCWJyZWFrOwotCWNhc2UgVklESU9DX1FVRVJZQlVGOgotCQlpZiAoZmgtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKSB7Ci0JCQlyZXQ9LUVJTlZBTDsKLQkJCWJyZWFrOwotCQl9Ci0JCXJldD12aWRlb2J1Zl9xdWVyeWJ1ZigmZmgtPnZiX3ZpZHEsIGFyZyk7Ci0JCWJyZWFrOwotCWNhc2UgVklESU9DX1FCVUY6Ci0JCWlmIChmaC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpIHsKLQkJCXJldD0tRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQkJcmV0PXZpZGVvYnVmX3FidWYoJmZoLT52Yl92aWRxLCBhcmcpOwotCQlicmVhazsKLQljYXNlIFZJRElPQ19EUUJVRjoKLQkJaWYgKGZoLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkgewotCQkJcmV0PS1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQotCQlyZXQ9dmlkZW9idWZfZHFidWYoJmZoLT52Yl92aWRxLCBhcmcsCi0JCQkJCWZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKLQkJYnJlYWs7CiAjaWZkZWYgSEFWRV9WNEwxCi0JLyogLS0tIHN0cmVhbWluZyBjYXB0dXJlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQljYXNlIFZJRElPQ0dNQlVGOgotCXsKLQkJc3RydWN0IHZpZGVvX21idWYgKm1idWYgPSBhcmc7Ci0JCXN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqcT0mZmgtPnZiX3ZpZHE7Ci0JCXN0cnVjdCB2NGwyX3JlcXVlc3RidWZmZXJzIHJlcTsKLQkJdW5zaWduZWQgaW50IGk7CitzdGF0aWMgaW50IHZpZGlvY2dtYnVmIChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgc3RydWN0IHZpZGVvX21idWYgKm1idWYpCit7CisJc3RydWN0IHZpdmlfZmggICpmaD1wcml2OworCXN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqcT0mZmgtPnZiX3ZpZHE7CisJc3RydWN0IHY0bDJfcmVxdWVzdGJ1ZmZlcnMgcmVxOworCXVuc2lnbmVkIGludCBpLCByZXQ7CiAKLQkJbWVtc2V0KCZyZXEsMCxzaXplb2YocmVxKSk7Ci0JCXJlcS50eXBlICAgPSBxLT50eXBlOwotCQlyZXEuY291bnQgID0gODsKLQkJcmVxLm1lbW9yeSA9IFY0TDJfTUVNT1JZX01NQVA7Ci0JCXJldCA9IHZpZGVvYnVmX3JlcWJ1ZnMocSwmcmVxKTsKLQkJaWYgKHJldCA8IDApCi0JCQlicmVhazsKLQkJbWVtc2V0KG1idWYsMCxzaXplb2YoKm1idWYpKTsKLQkJbWJ1Zi0+ZnJhbWVzID0gcmVxLmNvdW50OwotCQltYnVmLT5zaXplICAgPSAwOwotCQlmb3IgKGkgPSAwOyBpIDwgbWJ1Zi0+ZnJhbWVzOyBpKyspIHsKLQkJCW1idWYtPm9mZnNldHNbaV0gID0gcS0+YnVmc1tpXS0+Ym9mZjsKLQkJCW1idWYtPnNpemUgICAgICAgKz0gcS0+YnVmc1tpXS0+YnNpemU7Ci0JCX0KLQkJYnJlYWs7CisJcmVxLnR5cGUgICA9IHEtPnR5cGU7CisJcmVxLmNvdW50ICA9IDg7CisJcmVxLm1lbW9yeSA9IFY0TDJfTUVNT1JZX01NQVA7CisJcmV0ID0gdmlkZW9idWZfcmVxYnVmcyhxLCZyZXEpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gKHJldCk7CisKKwltYnVmLT5mcmFtZXMgPSByZXEuY291bnQ7CisJbWJ1Zi0+c2l6ZSAgID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgbWJ1Zi0+ZnJhbWVzOyBpKyspIHsKKwkJbWJ1Zi0+b2Zmc2V0c1tpXSAgPSBxLT5idWZzW2ldLT5ib2ZmOworCQltYnVmLT5zaXplICAgICAgICs9IHEtPmJ1ZnNbaV0tPmJzaXplOwogCX0KKwlyZXR1cm4gKDApOworfQogI2VuZGlmCi0JY2FzZSBWSURJT0NfU1RSRUFNT046CisKK3N0YXRpYyBpbnQgdmlkaW9jX3N0cmVhbW9uKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBlbnVtIHY0bDJfYnVmX3R5cGUgaSkKK3sKKwlzdHJ1Y3Qgdml2aV9maCAgKmZoPXByaXY7CisJc3RydWN0IHZpdmlfZGV2ICpkZXYgICAgPSBmaC0+ZGV2OworCisJaWYgKGZoLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGkgIT0gZmgtPnR5cGUpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFyZXNfZ2V0KGRldixmaCkpCisJCXJldHVybiAtRUJVU1k7CisJcmV0dXJuICh2aWRlb2J1Zl9zdHJlYW1vbigmZmgtPnZiX3ZpZHEpKTsKK30KKworc3RhdGljIGludCB2aWRpb2Nfc3RyZWFtb2ZmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBlbnVtIHY0bDJfYnVmX3R5cGUgaSkKK3sKKwlzdHJ1Y3Qgdml2aV9maCAgKmZoPXByaXY7CisJc3RydWN0IHZpdmlfZGV2ICpkZXYgICAgPSBmaC0+ZGV2OworCisJaWYgKGZoLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGkgIT0gZmgtPnR5cGUpCisJCXJldHVybiAtRUlOVkFMOworCisJdmlkZW9idWZfc3RyZWFtb2ZmKCZmaC0+dmJfdmlkcSk7CisJcmVzX2ZyZWUoZGV2LGZoKTsKKworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdjRsMl90dm5vcm0gdHZub3Jtc1tdID0gewogCXsKLQkJaWYgKGZoLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlpZiAoIXJlc19nZXQoZGV2LGZoKSkKLQkJCXJldHVybiAtRUJVU1k7Ci0JCXJldD12aWRlb2J1Zl9zdHJlYW1vbigmZmgtPnZiX3ZpZHEpOwotCQlicmVhazsKKwkJLm5hbWUgICAgICA9ICJOVFNDLU0iLAorCQkuaWQgICAgICAgID0gVjRMMl9TVERfTlRTQ19NLAogCX0KLQljYXNlIFZJRElPQ19TVFJFQU1PRkY6Ci0JewotCQlpZiAoZmgtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKSB7Ci0JCQlyZXQ9LUVJTlZBTDsKLQkJCWJyZWFrOwotCQl9Ci0JCXJldCA9IHZpZGVvYnVmX3N0cmVhbW9mZigmZmgtPnZiX3ZpZHEpOwotCQlpZiAocmV0IDwgMCkKLQkJCWJyZWFrOwotCQlyZXNfZnJlZShkZXYsZmgpOwotCQlicmVhazsKLQl9Ci0JLyogLS0tLS0tLS0tLSB0diBub3JtcyAtLS0tLS0tLS0tICovCi0JY2FzZSBWSURJT0NfRU5VTVNURDoKLQl7Ci0JCXN0cnVjdCB2NGwyX3N0YW5kYXJkICplID0gYXJnOworfTsKIAotCQlpZiAoZS0+aW5kZXg+MCkgewotCQkJcmV0PS1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQotCQlyZXQgPSB2NGwyX3ZpZGVvX3N0ZF9jb25zdHJ1Y3QoZSwgVjRMMl9TVERfTlRTQ19NLCAiTlRTQy1NIik7CitzdGF0aWMgaW50IHZpZGlvY19zX3N0ZCAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHY0bDJfc3RkX2lkIGEpCit7CiAKLQkJLyogQWxsb3dzIHZpdmkgdG8gdXNlIGRpZmZlcmVudCBmcHMgZnJvbSB2aWRlbyBzdGQgKi8KLQkJZS0+ZnJhbWVwZXJpb2QubnVtZXJhdG9yID0gV0FLRV9OVU1FUkFUT1I7Ci0JCWUtPmZyYW1lcGVyaW9kLmRlbm9taW5hdG9yID0gV0FLRV9ERU5PTUlOQVRPUjsKKwlyZXR1cm4gMDsKK30KIAotCQlicmVhazsKLQl9Ci0JY2FzZSBWSURJT0NfR19TVEQ6Ci0JewotCQl2NGwyX3N0ZF9pZCAqaWQgPSBhcmc7CisvKiBvbmx5IG9uZSBpbnB1dCBpbiB0aGlzIHNhbXBsZSBkcml2ZXIgKi8KK3N0YXRpYyBpbnQgdmlkaW9jX2VudW1faW5wdXQgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCXN0cnVjdCB2NGwyX2lucHV0ICppbnApCit7CisJaWYgKGlucC0+aW5kZXggIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKLQkJKmlkID0gVjRMMl9TVERfTlRTQ19NOwotCQlicmVhazsKLQl9Ci0JY2FzZSBWSURJT0NfU19TVEQ6Ci0JewotCQlicmVhazsKLQl9Ci0JLyogLS0tLS0tIGlucHV0IHN3aXRjaGluZyAtLS0tLS0tLS0tICovCi0JY2FzZSBWSURJT0NfRU5VTUlOUFVUOgotCXsgLyogb25seSBvbmUgaW5wdXQgaW4gdGhpcyBzYW1wbGUgZHJpdmVyICovCi0JCXN0cnVjdCB2NGwyX2lucHV0ICppbnAgPSBhcmc7CisJaW5wLT50eXBlID0gVjRMMl9JTlBVVF9UWVBFX0NBTUVSQTsKKwlpbnAtPnN0ZCA9IFY0TDJfU1REX05UU0NfTTsKKwlzdHJjcHkoaW5wLT5uYW1lLCJDYW1lcmEiKTsKIAotCQlpZiAoaW5wLT5pbmRleCAhPSAwKSB7Ci0JCQlyZXQ9LUVJTlZBTDsKLQkJCWJyZWFrOwotCQl9Ci0JCW1lbXNldChpbnAsIDAsIHNpemVvZigqaW5wKSk7CisJcmV0dXJuICgwKTsKK30KIAotCQlpbnAtPmluZGV4ID0gMDsKLQkJaW5wLT50eXBlID0gVjRMMl9JTlBVVF9UWVBFX0NBTUVSQTsKLQkJaW5wLT5zdGQgPSBWNEwyX1NURF9OVFNDX007Ci0JCXN0cmNweShpbnAtPm5hbWUsIkNhbWVyYSIpOwotCQlicmVhazsKLQl9Ci0JY2FzZSBWSURJT0NfR19JTlBVVDoKLQl7Ci0JCXVuc2lnbmVkIGludCAqaSA9IGFyZzsKK3N0YXRpYyBpbnQgdmlkaW9jX2dfaW5wdXQgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCB1bnNpZ25lZCBpbnQgKmkpCit7CisJKmkgPSAwOwogCi0JCSppID0gMDsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgVklESU9DX1NfSU5QVVQ6Ci0JewotCQl1bnNpZ25lZCBpbnQgKmkgPSBhcmc7CisJcmV0dXJuICgwKTsKK30KK3N0YXRpYyBpbnQgdmlkaW9jX3NfaW5wdXQgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCB1bnNpZ25lZCBpbnQgaSkKK3sKKwlpZiAoaSA+IDApCisJCXJldHVybiAtRUlOVkFMOwogCi0JCWlmICgqaSA+IDApCi0JCQlyZXQ9LUVJTlZBTDsKLQkJYnJlYWs7Ci0JfQorCXJldHVybiAoMCk7Cit9CiAKIAkvKiAtLS0gY29udHJvbHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCWNhc2UgVklESU9DX1FVRVJZQ1RSTDoKLQl7Ci0JCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWMgPSBhcmc7Ci0JCWludCBpOworc3RhdGljIGludCB2aWRpb2NfcXVlcnljdHJsIChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQlzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKnFjKQoreworCWludCBpOwogCi0JCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHZpdmlfcWN0cmwpOyBpKyspCi0JCQlpZiAocWMtPmlkICYmIHFjLT5pZCA9PSB2aXZpX3FjdHJsW2ldLmlkKSB7Ci0JCQkJbWVtY3B5KHFjLCAmKHZpdmlfcWN0cmxbaV0pLAotCQkJCQlzaXplb2YoKnFjKSk7Ci0JCQkJYnJlYWs7Ci0JCQl9CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodml2aV9xY3RybCk7IGkrKykKKwkJaWYgKHFjLT5pZCAmJiBxYy0+aWQgPT0gdml2aV9xY3RybFtpXS5pZCkgeworCQkJbWVtY3B5KHFjLCAmKHZpdmlfcWN0cmxbaV0pLAorCQkJCXNpemVvZigqcWMpKTsKKwkJCXJldHVybiAoMCk7CisJCX0KIAotCQlyZXQ9LUVJTlZBTDsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgVklESU9DX0dfQ1RSTDoKLQl7Ci0JCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwgPSBhcmc7Ci0JCWludCBpOwotCi0JCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHZpdmlfcWN0cmwpOyBpKyspCi0JCQlpZiAoY3RybC0+aWQgPT0gdml2aV9xY3RybFtpXS5pZCkgewotCQkJCWN0cmwtPnZhbHVlPXFjdGxfcmVnc1tpXTsKLQkJCQlicmVhazsKLQkJCX0KLQotCQlyZXQ9LUVJTlZBTDsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgVklESU9DX1NfQ1RSTDoKLQl7Ci0JCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwgPSBhcmc7Ci0JCWludCBpOwotCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh2aXZpX3FjdHJsKTsgaSsrKQotCQkJaWYgKGN0cmwtPmlkID09IHZpdmlfcWN0cmxbaV0uaWQpIHsKLQkJCQlpZiAoY3RybC0+dmFsdWUgPAotCQkJCQl2aXZpX3FjdHJsW2ldLm1pbmltdW0KLQkJCQkJfHwgY3RybC0+dmFsdWUgPgotCQkJCQl2aXZpX3FjdHJsW2ldLm1heGltdW0pIHsKLQkJCQkJCXJldD0tRVJBTkdFOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQlxY3RsX3JlZ3NbaV09Y3RybC0+dmFsdWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCXJldD0tRUlOVkFMOwotCQlicmVhazsKLQl9Ci0JZGVmYXVsdDoKLQkJcmV0PXY0bF9jb21wYXRfdHJhbnNsYXRlX2lvY3RsKGlub2RlLGZpbGUsY21kLGFyZyx2aXZpX2RvX2lvY3RsKTsKLQl9Ci0KLQlpZiAoZGVidWcpIHsKLQkJaWYgKHJldDwwKSB7Ci0JCQl2NGxfcHJpbnRfaW9jdGwoInZpdmkoZXJyKSIsIGNtZCk7Ci0JCQlkcHJpbnRrKDEsImVycmNvZGU9JWRcbiIscmV0KTsKLQkJfSBlbHNlIGlmIChfSU9DX0RJUihjbWQpICYgX0lPQ19SRUFEKQotCQkJdjRsX3ByaW50a19pb2N0bF9hcmcoInZpdmkocikiLGNtZCwgYXJnKTsKLQl9Ci0KLQlyZXR1cm4gcmV0OworCXJldHVybiAtRUlOVkFMOwogfQogCi1zdGF0aWMgaW50IHZpdmlfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQorc3RhdGljIGludCB2aWRpb2NfZ19jdHJsIChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQogewotCXJldHVybiB2aWRlb191c2VyY29weShpbm9kZSwgZmlsZSwgY21kLCBhcmcsIHZpdmlfZG9faW9jdGwpOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodml2aV9xY3RybCk7IGkrKykKKwkJaWYgKGN0cmwtPmlkID09IHZpdmlfcWN0cmxbaV0uaWQpIHsKKwkJCWN0cmwtPnZhbHVlPXFjdGxfcmVnc1tpXTsKKwkJCXJldHVybiAoMCk7CisJCX0KKworCXJldHVybiAtRUlOVkFMOworfQorc3RhdGljIGludCB2aWRpb2Nfc19jdHJsIChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodml2aV9xY3RybCk7IGkrKykKKwkJaWYgKGN0cmwtPmlkID09IHZpdmlfcWN0cmxbaV0uaWQpIHsKKwkJCWlmIChjdHJsLT52YWx1ZSA8CisJCQkJdml2aV9xY3RybFtpXS5taW5pbXVtCisJCQkJfHwgY3RybC0+dmFsdWUgPgorCQkJCXZpdmlfcWN0cmxbaV0ubWF4aW11bSkgeworCQkJCQlyZXR1cm4gKC1FUkFOR0UpOworCQkJCX0KKwkJCXFjdGxfcmVnc1tpXT1jdHJsLT52YWx1ZTsKKwkJCXJldHVybiAoMCk7CisJCX0KKwlyZXR1cm4gLUVJTlZBTDsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xMjU1LDcgKzExNTAsNyBAQAogCiAJbGlzdF9mb3JfZWFjaChsaXN0LCZ2aXZpX2Rldmxpc3QpIHsKIAkJaCA9IGxpc3RfZW50cnkobGlzdCwgc3RydWN0IHZpdmlfZGV2LCB2aXZpX2Rldmxpc3QpOwotCQlpZiAoaC0+dmlkZW9fZGV2Lm1pbm9yID09IG1pbm9yKSB7CisJCWlmIChoLT52ZmQubWlub3IgPT0gbWlub3IpIHsKIAkJCWRldiAgPSBoOwogCQkJdHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKIAkJfQpAQCAtMTI2NCw2ICsxMTU5LDcgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAorCiAJLyogSWYgbW9yZSB0aGFuIG9uZSB1c2VyLCBtdXRleCBzaG91bGQgYmUgYWRkZWQgKi8KIAlkZXYtPnVzZXJzKys7CiAKQEAgLTEyNzksNiArMTE3NSw3IEBACiAKIAlmaWxlLT5wcml2YXRlX2RhdGEgPSBmaDsKIAlmaC0+ZGV2ICAgICAgPSBkZXY7CisKIAlmaC0+dHlwZSAgICAgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7CiAJZmgtPmZtdCAgICAgID0gJmZvcm1hdDsKIAlmaC0+d2lkdGggICAgPSA2NDA7CkBAIC0xMzE0LDcgKzEyMTEsNyBAQAogc3RhdGljIHNzaXplX3QKIHZpdmlfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmRhdGEsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewotCXN0cnVjdCB2aXZpX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgdml2aV9maCAgICAgICAgKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCiAJaWYgKGZoLT50eXBlPT1WNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpIHsKIAkJaWYgKHJlc19sb2NrZWQoZmgtPmRldikpCkBAIC0xMzI4LDggKzEyMjUsOCBAQAogc3RhdGljIHVuc2lnbmVkIGludAogdml2aV9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCiB7Ci0Jc3RydWN0IHZpdmlfZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCB2aXZpX2J1ZmZlciAqYnVmOworCXN0cnVjdCB2aXZpX2ZoICAgICAgICAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHZpdmlfYnVmZmVyICAgICpidWY7CiAKIAlkcHJpbnRrKDEsIiVzXG4iLF9fRlVOQ1RJT05fXyk7CiAKQEAgLTEzNTgsOCArMTI1NSw4IEBACiAKIHN0YXRpYyBpbnQgdml2aV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewotCXN0cnVjdCB2aXZpX2ZoICAqZmggICAgID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCB2aXZpX2RldiAqZGV2ICAgID0gZmgtPmRldjsKKwlzdHJ1Y3Qgdml2aV9maCAgICAgICAgICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgdml2aV9kZXYgKmRldiAgICAgICA9IGZoLT5kZXY7CiAJc3RydWN0IHZpdmlfZG1hcXVldWUgKnZpZHEgPSAmZGV2LT52aWRxOwogCiAJaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKQEAgLTEzNzksNyArMTI3Niw3IEBACiBzdGF0aWMgaW50CiB2aXZpX21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqIHZtYSkKIHsKLQlzdHJ1Y3Qgdml2aV9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHZpdmlfZmggICAgICAgICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlpbnQgcmV0OwogCiAJZHByaW50ayAoMSwibW1hcCBjYWxsZWQsIHZtYT0weCUwOGx4XG4iLCh1bnNpZ25lZCBsb25nKXZtYSk7CkBAIC0xNDAwLDIwICsxMjk3LDQ0IEBACiAJLnJlbGVhc2UgICAgICAgID0gdml2aV9yZWxlYXNlLAogCS5yZWFkICAgICAgICAgICA9IHZpdmlfcmVhZCwKIAkucG9sbAkJPSB2aXZpX3BvbGwsCi0JLmlvY3RsICAgICAgICAgID0gdml2aV9pb2N0bCwKKwkuaW9jdGwgICAgICAgICAgPSB2aWRlb19pb2N0bDIsIC8qIFY0TDIgaW9jdGwgaGFuZGxlciAqLwogCS5tbWFwCQk9IHZpdmlfbW1hcCwKIAkubGxzZWVrICAgICAgICAgPSBub19sbHNlZWssCiB9OwogCiBzdGF0aWMgc3RydWN0IHZpZGVvX2RldmljZSB2aXZpID0gewotCS5uYW1lCQk9ICJWVE0gVmlydHVhbCBWaWRlbyBDYXB0dXJlIEJvYXJkIiwKKwkubmFtZQkJPSAidml2aSIsCiAJLnR5cGUJCT0gVklEX1RZUEVfQ0FQVFVSRSwKIAkuaGFyZHdhcmUJPSAwLAogCS5mb3BzICAgICAgICAgICA9ICZ2aXZpX2ZvcHMsCiAJLm1pbm9yCQk9IC0xLAogLy8JLnJlbGVhc2UJPSB2aWRlb19kZXZpY2VfcmVsZWFzZSwKKworCS52aWRpb2NfcXVlcnljYXAgICAgICA9IHZpZGlvY19xdWVyeWNhcCwKKwkudmlkaW9jX2VudW1fZm10X2NhcCAgPSB2aWRpb2NfZW51bV9mbXRfY2FwLAorCS52aWRpb2NfZ19mbXRfY2FwICAgICA9IHZpZGlvY19nX2ZtdF9jYXAsCisJLnZpZGlvY190cnlfZm10X2NhcCAgID0gdmlkaW9jX3RyeV9mbXRfY2FwLAorCS52aWRpb2Nfc19mbXRfY2FwICAgICA9IHZpZGlvY19zX2ZtdF9jYXAsCisJLnZpZGlvY19yZXFidWZzICAgICAgID0gdmlkaW9jX3JlcWJ1ZnMsCisJLnZpZGlvY19xdWVyeWJ1ZiAgICAgID0gdmlkaW9jX3F1ZXJ5YnVmLAorCS52aWRpb2NfcWJ1ZiAgICAgICAgICA9IHZpZGlvY19xYnVmLAorCS52aWRpb2NfZHFidWYgICAgICAgICA9IHZpZGlvY19kcWJ1ZiwKKwkudmlkaW9jX3Nfc3RkICAgICAgICAgPSB2aWRpb2Nfc19zdGQsCisJLnZpZGlvY19lbnVtX2lucHV0ICAgID0gdmlkaW9jX2VudW1faW5wdXQsCisJLnZpZGlvY19nX2lucHV0ICAgICAgID0gdmlkaW9jX2dfaW5wdXQsCisJLnZpZGlvY19zX2lucHV0ICAgICAgID0gdmlkaW9jX3NfaW5wdXQsCisJLnZpZGlvY19xdWVyeWN0cmwgICAgID0gdmlkaW9jX3F1ZXJ5Y3RybCwKKwkudmlkaW9jX2dfY3RybCAgICAgICAgPSB2aWRpb2NfZ19jdHJsLAorCS52aWRpb2Nfc19jdHJsICAgICAgICA9IHZpZGlvY19zX2N0cmwsCisJLnZpZGlvY19zdHJlYW1vbiAgICAgID0gdmlkaW9jX3N0cmVhbW9uLAorCS52aWRpb2Nfc3RyZWFtb2ZmICAgICA9IHZpZGlvY19zdHJlYW1vZmYsCisjaWZkZWYgSEFWRV9WNEwxCisJLnZpZGlvY2dtYnVmICAgICAgICAgID0gdmlkaW9jZ21idWYsCisjZW5kaWYKKwkudHZub3JtcyAgICAgICAgICAgICAgPSB0dm5vcm1zLAorCS50dm5vcm1zaXplICAgICAgICAgICA9IEFSUkFZX1NJWkUodHZub3JtcyksCiB9OwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCUluaXRpYWxpemF0aW9uIGFuZCBtb2R1bGUgc3R1ZmYKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKQEAgLTE0NTcsMyArMTM3OCwxNiBAQAogCiBtb2R1bGVfaW5pdCh2aXZpX2luaXQpOwogbW9kdWxlX2V4aXQodml2aV9leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJWaWRlbyBUZWNobm9sb2d5IE1hZ2F6aW5lIFZpcnR1YWwgVmlkZW8gQ2FwdHVyZSBCb2FyZCIpOworTU9EVUxFX0FVVEhPUigiTWF1cm8gQ2FydmFsaG8gQ2hlaGFiLCBUZWQgV2FsdGhlciBhbmQgSm9obiBTb2tvbCIpOworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOworCittb2R1bGVfcGFyYW0odmlkZW9fbnIsIGludCwgMCk7CisKK21vZHVsZV9wYXJhbV9uYW1lZChkZWJ1Zyx2aXZpLmRlYnVnLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywiYWN0aXZhdGVzIGRlYnVnIGluZm8iKTsKKworbW9kdWxlX3BhcmFtKHZpZF9saW1pdCxpbnQsMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHZpZF9saW1pdCwiY2FwdHVyZSBtZW1vcnkgbGltaXQgaW4gbWVnYWJ5dGVzIik7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdnB4MzIyMC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby92cHgzMjIwLmMKaW5kZXggNDBiMjA1Yi4uMWVjYTdlNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby92cHgzMjIwLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby92cHgzMjIwLmMKQEAgLTM0LDYgKzM0LDcgQEAKICNkZWZpbmUgSTJDX05BTUUoeCkgKHgpLT5uYW1lCiAKICNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9fZGVjb2Rlci5oPgogCiAjZGVmaW5lIEkyQ19WUFgzMjIwICAgICAgICAweDg2CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3c5OTY2LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3c5OTY2LmMKaW5kZXggODBlZjhhMS4uNGJkYzg4NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby93OTk2Ni5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdzk5NjYuYwpAQCAtNTgsNiArNTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KICNpbmNsdWRlIDxsaW51eC9wYXJwb3J0Lmg+CiAKIC8vI2RlZmluZSBERUJVRwkJCQkvLyBVbmRlZiBtZSBmb3IgcHJvZHVjdGlvbgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby96YzAzMDEvS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vemMwMzAxL0tjb25maWcKaW5kZXggMTE1ODMzZS4uYTg1OWE2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby96YzAzMDEvS2NvbmZpZworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pjMDMwMS9LY29uZmlnCkBAIC0xLDkgKzEsOSBAQAogY29uZmlnIFVTQl9aQzAzMDEKLQl0cmlzdGF0ZSAiVVNCIFpDMDMwMSBJbWFnZSBQcm9jZXNzb3IgYW5kIENvbnRyb2wgQ2hpcCBzdXBwb3J0IgorCXRyaXN0YXRlICJVU0IgWkMwMzAxW1BdIEltYWdlIFByb2Nlc3NvciBhbmQgQ29udHJvbCBDaGlwIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBVU0IgJiYgVklERU9fVjRMMQogCS0tLWhlbHAtLS0KLQkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgc3VwcG9ydCBmb3IgY2FtZXJhcyBiYXNlZCBvbiB0aGUgWkMwMzAxCi0JICBJbWFnZSBQcm9jZXNzb3IgYW5kIENvbnRyb2wgQ2hpcC4KKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgc3VwcG9ydCBmb3IgY2FtZXJhcyBiYXNlZCBvbiB0aGUgWkMwMzAxIG9yCisJICBaQzAzMDFQIEltYWdlIFByb2Nlc3NvcnMgYW5kIENvbnRyb2wgQ2hpcHMuCiAKIAkgIFNlZSA8ZmlsZTpEb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L3pjMDMwMS50eHQ+IGZvciBtb3JlIGluZm8uCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vemMwMzAxL01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS92aWRlby96YzAzMDEvTWFrZWZpbGUKaW5kZXggZDc0OTE5OS4uZDllNmQ5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby96YzAzMDEvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby96YzAzMDEvTWFrZWZpbGUKQEAgLTEsMyArMSwzIEBACi16YzAzMDEtb2JqcyAgICAgOj0gemMwMzAxX2NvcmUubyB6YzAzMDFfcGFzMjAyYmNiLm8KK3pjMDMwMS1vYmpzICAgICA6PSB6YzAzMDFfY29yZS5vIHpjMDMwMV9wYjAzMzAubyB6YzAzMDFfcGFzMjAyYmNiLm8KIAogb2JqLSQoQ09ORklHX1VTQl9aQzAzMDEpICAgICAgICArPSB6YzAzMDEubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby96YzAzMDEvemMwMzAxX2NvcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vemMwMzAxL3pjMDMwMV9jb3JlLmMKaW5kZXggMGZhZDM5Ny4uMWIyYmUyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby96YzAzMDEvemMwMzAxX2NvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pjMDMwMS96YzAzMDFfY29yZS5jCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogVmlkZW80TGludXgyIGRyaXZlciBmb3IgWkMwMzAxIEltYWdlIFByb2Nlc3NvciBhbmQgQ29udHJvbCBDaGlwICAgICAgICAgKgorICogVmlkZW80TGludXgyIGRyaXZlciBmb3IgWkMwMzAxW1BdIEltYWdlIFByb2Nlc3NvciBhbmQgQ29udHJvbCBDaGlwICAgICAgKgogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgogICogQ29weXJpZ2h0IChDKSAyMDA2IGJ5IEx1Y2EgUmlzb2xpYSA8bHVjYS5yaXNvbGlhQHN0dWRpby51bmliby5pdD4gICAgICAgKgogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgpAQCAtNDcsMTMgKzQ3LDEzIEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2RlZmluZSBaQzAzMDFfTU9EVUxFX05BTUUgICAgIlY0TDIgZHJpdmVyIGZvciBaQzAzMDEgIiAgICAgICAgICAgICAgICAgICAgICAgXAorI2RlZmluZSBaQzAzMDFfTU9EVUxFX05BTUUgICAgIlY0TDIgZHJpdmVyIGZvciBaQzAzMDFbUF0gIiAgICAgICAgICAgICAgICAgICAgXAogCQkJICAgICAgIkltYWdlIFByb2Nlc3NvciBhbmQgQ29udHJvbCBDaGlwIgogI2RlZmluZSBaQzAzMDFfTU9EVUxFX0FVVEhPUiAgIihDKSAyMDA2IEx1Y2EgUmlzb2xpYSIKICNkZWZpbmUgWkMwMzAxX0FVVEhPUl9FTUFJTCAgICI8bHVjYS5yaXNvbGlhQHN0dWRpby51bmliby5pdD4iCiAjZGVmaW5lIFpDMDMwMV9NT0RVTEVfTElDRU5TRSAiR1BMIgotI2RlZmluZSBaQzAzMDFfTU9EVUxFX1ZFUlNJT04gIjE6MS4wMyIKLSNkZWZpbmUgWkMwMzAxX01PRFVMRV9WRVJTSU9OX0NPREUgIEtFUk5FTF9WRVJTSU9OKDEsIDAsIDMpCisjZGVmaW5lIFpDMDMwMV9NT0RVTEVfVkVSU0lPTiAiMToxLjA1IgorI2RlZmluZSBaQzAzMDFfTU9EVUxFX1ZFUlNJT05fQ09ERSAgS0VSTkVMX1ZFUlNJT04oMSwgMCwgNSkKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCkBAIC00MjcsMTAgKzQyNywxMSBAQAogc3RhdGljIGludCB6YzAzMDFfc3RhcnRfdHJhbnNmZXIoc3RydWN0IHpjMDMwMV9kZXZpY2UqIGNhbSkKIHsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGNhbS0+dXNiZGV2OworCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UqIGFsdHNldHRpbmcgPSB1c2JfYWx0bnVtX3RvX2FsdHNldHRpbmcoCisJCQkJCQkgICAgIHVzYl9pZm51bV90b19pZih1ZGV2LCAwKSwKKwkJCQkJCSAgICAgWkMwMzAxX0FMVEVSTkFURV9TRVRUSU5HKTsKKwljb25zdCB1bnNpZ25lZCBpbnQgcHN6ID0gYWx0c2V0dGluZy0+ZW5kcG9pbnRbMF0uZGVzYy53TWF4UGFja2V0U2l6ZTsKIAlzdHJ1Y3QgdXJiKiB1cmI7Ci0JY29uc3QgdW5zaWduZWQgaW50IHdNYXhQYWNrZXRTaXplW10gPSB7MCwgMTI4LCAxOTIsIDI1NiwgMzg0LAotCQkJCQkgICAgICAgNTEyLCA3NjgsIDEwMjN9OwotCWNvbnN0IHVuc2lnbmVkIGludCBwc3ogPSB3TWF4UGFja2V0U2l6ZVtaQzAzMDFfQUxURVJOQVRFX1NFVFRJTkddOwogCXM4IGksIGo7CiAJaW50IGVyciA9IDA7CiAKQEAgLTE3NzIsMTEgKzE3NzMsOSBAQAogCWNhc2UgVklESU9DX0dfQ1RSTDoKIAkJcmV0dXJuIHpjMDMwMV92aWRpb2NfZ19jdHJsKGNhbSwgYXJnKTsKIAotCWNhc2UgVklESU9DX1NfQ1RSTF9PTEQ6CiAJY2FzZSBWSURJT0NfU19DVFJMOgogCQlyZXR1cm4gemMwMzAxX3ZpZGlvY19zX2N0cmwoY2FtLCBhcmcpOwogCi0JY2FzZSBWSURJT0NfQ1JPUENBUF9PTEQ6CiAJY2FzZSBWSURJT0NfQ1JPUENBUDoKIAkJcmV0dXJuIHpjMDMwMV92aWRpb2NfY3JvcGNhcChjYW0sIGFyZyk7CiAKQEAgLTE4MjMsNyArMTgyMiw2IEBACiAJY2FzZSBWSURJT0NfR19QQVJNOgogCQlyZXR1cm4gemMwMzAxX3ZpZGlvY19nX3Bhcm0oY2FtLCBhcmcpOwogCi0JY2FzZSBWSURJT0NfU19QQVJNX09MRDoKIAljYXNlIFZJRElPQ19TX1BBUk06CiAJCXJldHVybiB6YzAzMDFfdmlkaW9jX3NfcGFybShjYW0sIGFyZyk7CiAKQEAgLTE5MTQsNyArMTkxMiw3IEBACiAKIAltdXRleF9pbml0KCZjYW0tPmRldl9tdXRleCk7CiAKLQlEQkcoMiwgIlpDMDMwMSBJbWFnZSBQcm9jZXNzb3IgYW5kIENvbnRyb2wgQ2hpcCBkZXRlY3RlZCAiCisJREJHKDIsICJaQzAzMDFbUF0gSW1hZ2UgUHJvY2Vzc29yIGFuZCBDb250cm9sIENoaXAgZGV0ZWN0ZWQgIgogCSAgICAgICAiKHZpZC9waWQgMHglMDRYLzB4JTA0WCkiLGlkLT5pZFZlbmRvciwgaWQtPmlkUHJvZHVjdCk7CiAKIAlmb3IgIChpID0gMDsgemMwMzAxX3NlbnNvcl90YWJsZVtpXTsgaSsrKSB7CkBAIC0xOTM2LDcgKzE5MzQsNyBAQAogCQljYW0tPnN0YXRlIHw9IERFVl9NSVNDT05GSUdVUkVEOwogCX0KIAotCXN0cmNweShjYW0tPnY0bGRldi0+bmFtZSwgIlpDMDMwMSBQQyBDYW1lcmEiKTsKKwlzdHJjcHkoY2FtLT52NGxkZXYtPm5hbWUsICJaQzAzMDFbUF0gUEMgQ2FtZXJhIik7CiAJY2FtLT52NGxkZXYtPm93bmVyID0gVEhJU19NT0RVTEU7CiAJY2FtLT52NGxkZXYtPnR5cGUgPSBWSURfVFlQRV9DQVBUVVJFIHwgVklEX1RZUEVfU0NBTEVTOwogCWNhbS0+djRsZGV2LT5oYXJkd2FyZSA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3pjMDMwMS96YzAzMDFfcGFzMjAyYmNiLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pjMDMwMS96YzAzMDFfcGFzMjAyYmNiLmMKaW5kZXggZWFhZGYwMi4uZWNmZDM5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby96YzAzMDEvemMwMzAxX3BhczIwMmJjYi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vemMwMzAxL3pjMDMwMV9wYXMyMDJiY2IuYwpAQCAtMSwxMCArMSwxMCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUGx1Zy1pbiBmb3IgUEFTMjAyQkNCIGltYWdlIHNlbnNvciBjb25uZWN0ZWQgdG8gdGhlIFpDMDMwISBJbWFnZSAgICAgICAgKgorICogUGx1Zy1pbiBmb3IgUEFTMjAyQkNCIGltYWdlIHNlbnNvciBjb25uZWN0ZWQgdG8gdGhlIFpDMDMwMVtQXSBJbWFnZSAgICAgKgogICogUHJvY2Vzc29yIGFuZCBDb250cm9sIENoaXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgogICogQ29weXJpZ2h0IChDKSAyMDA2IGJ5IEx1Y2EgUmlzb2xpYSA8bHVjYS5yaXNvbGlhQHN0dWRpby51bmliby5pdD4gICAgICAgKgogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogSW5pdGlhbGl6YXRpb24gdmFsdWVzIG9mIHRoZSBaQzAzMDEgaGF2ZSBiZWVuIHRha2VuIGZyb20gdGhlIFNQQ0E1WFggICAgKgorICogSW5pdGlhbGl6YXRpb24gdmFsdWVzIG9mIHRoZSBaQzAzMDFbUF0gaGF2ZSBiZWVuIHRha2VuIGZyb20gdGhlIFNQQ0E1WFggKgogICogZHJpdmVyIG1haW50YWluZWQgYnkgTWljaGVsIFhoYWFyZCA8bXhoYWFyZEBtYWdpYy5mcj4gICAgICAgICAgICAgICAgICAgKgogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICAgKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby96YzAzMDEvemMwMzAxX3BiMDMzMC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby96YzAzMDEvemMwMzAxX3BiMDMzMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkODU0MmUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pjMDMwMS96YzAzMDFfcGIwMzMwLmMKQEAgLTAsMCArMSwxODcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFBsdWctaW4gZm9yIFBCLTAzMzAgaW1hZ2Ugc2Vuc29yIGNvbm5lY3RlZCB0byB0aGUgWkMwMzAxW1BdIEltYWdlICAgICAgICoKKyAqIFByb2Nlc3NvciBhbmQgQ29udHJvbCBDaGlwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBieSBMdWNhIFJpc29saWEgPGx1Y2Eucmlzb2xpYUBzdHVkaW8udW5pYm8uaXQ+ICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEluaXRpYWxpemF0aW9uIHZhbHVlcyBvZiB0aGUgWkMwMzAxW1BdIGhhdmUgYmVlbiB0YWtlbiBmcm9tIHRoZSBTUENBNVhYICoKKyAqIGRyaXZlciBtYWludGFpbmVkIGJ5IE1pY2hlbCBYaGFhcmQgPG14aGFhcmRAbWFnaWMuZnI+ICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlICAgICAgICAgICAgICoKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLiAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgInpjMDMwMV9zZW5zb3IuaCIKKworCitzdGF0aWMgc3RydWN0IHpjMDMwMV9zZW5zb3IgcGIwMzMwOworCisKK3N0YXRpYyBpbnQgcGIwMzMwX2luaXQoc3RydWN0IHpjMDMwMV9kZXZpY2UqIGNhbSkKK3sKKwlpbnQgZXJyID0gMDsKKworCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMDAwLCAweDAxKTsKKwllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDAwOCwgMHgwMyk7CisJZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAwMTAsIDB4MEEpOworCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMDAyLCAweDAwKTsKKwllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDAwMywgMHgwMik7CisJZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAwMDQsIDB4ODApOworCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMDA1LCAweDAxKTsKKwllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDAwNiwgMHhFMCk7CisJZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAwMDEsIDB4MDEpOworCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMDEyLCAweDA1KTsKKwllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDAxMiwgMHgwNyk7CisJZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAwOTgsIDB4MDApOworCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMDlBLCAweDAwKTsKKwllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDExQSwgMHgwMCk7CisJZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAxMUMsIDB4MDApOworCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMDEyLCAweDA1KTsKKworCWVyciArPSB6YzAzMDFfaTJjX3dyaXRlKGNhbSwgMHgwMSwgMHgwMDA2KTsKKwllcnIgKz0gemMwMzAxX2kyY193cml0ZShjYW0sIDB4MDIsIDB4MDAxMSk7CisJZXJyICs9IHpjMDMwMV9pMmNfd3JpdGUoY2FtLCAweDAzLCAweDAxRTcpOworCWVyciArPSB6YzAzMDFfaTJjX3dyaXRlKGNhbSwgMHgwNCwgMHgwMjg3KTsKKwllcnIgKz0gemMwMzAxX2kyY193cml0ZShjYW0sIDB4MDYsIDB4MDAwMyk7CisJZXJyICs9IHpjMDMwMV9pMmNfd3JpdGUoY2FtLCAweDA3LCAweDMwMDIpOworCWVyciArPSB6YzAzMDFfaTJjX3dyaXRlKGNhbSwgMHgyMCwgMHgxMTAwKTsKKwllcnIgKz0gemMwMzAxX2kyY193cml0ZShjYW0sIDB4MkYsIDB4RjdCMCk7CisJZXJyICs9IHpjMDMwMV9pMmNfd3JpdGUoY2FtLCAweDMwLCAweDAwMDUpOworCWVyciArPSB6YzAzMDFfaTJjX3dyaXRlKGNhbSwgMHgzMSwgMHgwMDAwKTsKKwllcnIgKz0gemMwMzAxX2kyY193cml0ZShjYW0sIDB4MzQsIDB4MDEwMCk7CisJZXJyICs9IHpjMDMwMV9pMmNfd3JpdGUoY2FtLCAweDM1LCAweDAwNjApOworCWVyciArPSB6YzAzMDFfaTJjX3dyaXRlKGNhbSwgMHgzRCwgMHgwNjhGKTsKKwllcnIgKz0gemMwMzAxX2kyY193cml0ZShjYW0sIDB4NDAsIDB4MDFFMCk7CisJZXJyICs9IHpjMDMwMV9pMmNfd3JpdGUoY2FtLCAweDU4LCAweDAwNzgpOworCWVyciArPSB6YzAzMDFfaTJjX3dyaXRlKGNhbSwgMHg2MiwgMHgwNDExKTsKKworCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMDg3LCAweDEwKTsKKwllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDEwMSwgMHgzNyk7CisJZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAwMTIsIDB4MDUpOworCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMTAwLCAweDBEKTsKKwllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDE4OSwgMHgwNik7CisJZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAxQUQsIDB4MDApOworCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMUM1LCAweDAzKTsKKwllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDFDQiwgMHgxMyk7CisJZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAyNTAsIDB4MDgpOworCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMzAxLCAweDA4KTsKKwllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDFBOCwgMHg2MCk7CisJZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAxOEQsIDB4NkMpOworCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMUFELCAweDA5KTsKKwllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDFBRSwgMHgxNSk7CisJZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAxMEEsIDB4NTApOworCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMTBCLCAweEY4KTsKKwllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDEwQywgMHhGOCk7CisJZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAxMEQsIDB4RjgpOworCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMTBFLCAweDUwKTsKKwllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDEwRiwgMHhGOCk7CisJZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAxMTAsIDB4RjgpOworCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMTExLCAweEY4KTsKKwllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDExMiwgMHg1MCk7CisJZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAwMDgsIDB4MDMpOworCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMUM2LCAweDA4KTsKKwllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDFDQiwgMHgwRik7CisJZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAxMEEsIDB4NTApOworCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMTBCLCAweEY4KTsKKwllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDEwQywgMHhGOCk7CisJZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAxMEQsIDB4RjgpOworCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMTBFLCAweDUwKTsKKwllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDEwRiwgMHhGOCk7CisJZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAxMTAsIDB4RjgpOworCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMTExLCAweEY4KTsKKwllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDExMiwgMHg1MCk7CisJZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAxODAsIDB4MDApOworCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMDE5LCAweDAwKTsKKworCWVyciArPSB6YzAzMDFfaTJjX3dyaXRlKGNhbSwgMHgwNSwgMHgwMDY2KTsKKwllcnIgKz0gemMwMzAxX2kyY193cml0ZShjYW0sIDB4MDksIDB4MDJCMik7CisJZXJyICs9IHpjMDMwMV9pMmNfd3JpdGUoY2FtLCAweDEwLCAweDAwMDIpOworCisJZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAxMUQsIDB4NjApOworCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMTkwLCAweDAwKTsKKwllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDE5MSwgMHgwNyk7CisJZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAxOTIsIDB4OEMpOworCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMTk1LCAweDAwKTsKKwllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDE5NiwgMHgwMCk7CisJZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAxOTcsIDB4OEEpOworCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMThDLCAweDEwKTsKKwllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDE4RiwgMHgyMCk7CisJZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAxQTksIDB4MTQpOworCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMUFBLCAweDI0KTsKKwllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDAxRCwgMHhENyk7CisJZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAwMUUsIDB4RjApOworCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMDFGLCAweEY4KTsKKwllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDAyMCwgMHhGRik7CisJZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAxQUQsIDB4MDkpOworCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMUFFLCAweDE1KTsKKwllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDE4MCwgMHg0MCk7CisJZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAxODAsIDB4NDIpOworCisJbXNsZWVwKDEwMCk7CisKKwlyZXR1cm4gZXJyOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgemMwMzAxX3NlbnNvciBwYjAzMzAgPSB7CisJLm5hbWUgPSAiUEItMDMzMCIsCisJLmluaXQgPSAmcGIwMzMwX2luaXQsCisJLmNyb3BjYXAgPSB7CisJCS5ib3VuZHMgPSB7CisJCQkubGVmdCA9IDAsCisJCQkudG9wID0gMCwKKwkJCS53aWR0aCA9IDY0MCwKKwkJCS5oZWlnaHQgPSA0ODAsCisJCX0sCisJCS5kZWZyZWN0ID0geworCQkJLmxlZnQgPSAwLAorCQkJLnRvcCA9IDAsCisJCQkud2lkdGggPSA2NDAsCisJCQkuaGVpZ2h0ID0gNDgwLAorCQl9LAorCX0sCisJLnBpeF9mb3JtYXQgPSB7CisJCS53aWR0aCA9IDY0MCwKKwkJLmhlaWdodCA9IDQ4MCwKKwkJLnBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX0pQRUcsCisJCS5wcml2ID0gOCwKKwl9LAorfTsKKworCitpbnQgemMwMzAxX3Byb2JlX3BiMDMzMChzdHJ1Y3QgemMwMzAxX2RldmljZSogY2FtKQoreworCWludCByMCwgZXJyID0gMDsKKworCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMDAwLCAweDAxKTsKKwllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDAxMCwgMHgwYSk7CisJZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAwMDEsIDB4MDEpOworCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMDEyLCAweDAzKTsKKwllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDAxMiwgMHgwMSk7CisKKwltc2xlZXAoMTApOworCisJcjAgPSB6YzAzMDFfaTJjX3JlYWQoY2FtLCAweDAwLCAyKTsKKworCWlmIChyMCA8IDAgfHwgZXJyKQorCQlyZXR1cm4gLUVJTzsKKworCWlmIChyMCAhPSAweDgyNDMpCisJCXJldHVybiAtRU5PREVWOworCisJemMwMzAxX2F0dGFjaF9zZW5zb3IoY2FtLCAmcGIwMzMwKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby96YzAzMDEvemMwMzAxX3NlbnNvci5oIGIvZHJpdmVycy9tZWRpYS92aWRlby96YzAzMDEvemMwMzAxX3NlbnNvci5oCmluZGV4IDFmOTVjMjguLjQzNjNhOTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vemMwMzAxL3pjMDMwMV9zZW5zb3IuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pjMDMwMS96YzAzMDFfc2Vuc29yLmgKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBBUEkgZm9yIGltYWdlIHNlbnNvcnMgY29ubmVjdGVkIHRvIHRoZSBaQzAzMCEgSW1hZ2UgUHJvY2Vzc29yIGFuZCAgICAgICAqCisgKiBBUEkgZm9yIGltYWdlIHNlbnNvcnMgY29ubmVjdGVkIHRvIHRoZSBaQzAzMDEgSW1hZ2UgUHJvY2Vzc29yIGFuZCAgICAgICAqCiAgKiBDb250cm9sIENoaXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDYgYnkgTHVjYSBSaXNvbGlhIDxsdWNhLnJpc29saWFAc3R1ZGlvLnVuaWJvLml0PiAgICAgICAqCkBAIC0zNSwxMSArMzUsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogZXh0ZXJuIGludCB6YzAzMDFfcHJvYmVfcGFzMjAyYmNiKHN0cnVjdCB6YzAzMDFfZGV2aWNlKiBjYW0pOworZXh0ZXJuIGludCB6YzAzMDFfcHJvYmVfcGIwMzMwKHN0cnVjdCB6YzAzMDFfZGV2aWNlKiBjYW0pOwogCiAjZGVmaW5lIFpDMDMwMV9TRU5TT1JfVEFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAvKiBXZWFrIGRldGVjdGlvbnMgbXVzdCBnbyBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0ICovICAgICAgICAgICAgICAgICAgICAgICAgICBcCiBzdGF0aWMgaW50ICgqemMwMzAxX3NlbnNvcl90YWJsZVtdKShzdHJ1Y3QgemMwMzAxX2RldmljZSopID0geyAgICAgICAgICAgICAgICBcCiAJJnpjMDMwMV9wcm9iZV9wYXMyMDJiY2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkmemMwMzAxX3Byb2JlX3BiMDMzMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCU5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiB9OwogCkBAIC01OCwxNCArNjAsMjggQEAKIAogI2RlZmluZSBaQzAzMDFfSURfVEFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkIHpjMDMwMV9pZF90YWJsZVtdID0gIHsgICAgICAgICAgICAgICAgICAgICAgXAotCXsgWkMwMzAxX1VTQl9ERVZJQ0UoMHgwNDFlLCAweDQwMTcsIDB4ZmYpLCB9LCAgICAgICAgICAgICAgICAgICAgICAgICBcCisJeyBaQzAzMDFfVVNCX0RFVklDRSgweDA0MWUsIDB4NDAxNywgMHhmZiksIH0sIC8qIElDTTEwNSAqLyAgICAgICAgICAgIFwKIAl7IFpDMDMwMV9VU0JfREVWSUNFKDB4MDQxZSwgMHg0MDFjLCAweGZmKSwgfSwgLyogUEFTMTA2ICovICAgICAgICAgICAgXAotCXsgWkMwMzAxX1VTQl9ERVZJQ0UoMHgwNDFlLCAweDQwMWUsIDB4ZmYpLCB9LCAvKiBIVjcxMzFCICovICAgICAgICAgICBcCisJeyBaQzAzMDFfVVNCX0RFVklDRSgweDA0MWUsIDB4NDAxZSwgMHhmZiksIH0sIC8qIEhWNzEzMSAqLyAgICAgICAgICAgIFwKKwl7IFpDMDMwMV9VU0JfREVWSUNFKDB4MDQxZSwgMHg0MDFmLCAweGZmKSwgfSwgLyogVEFTNTEzMCAqLyAgICAgICAgICAgXAorCXsgWkMwMzAxX1VTQl9ERVZJQ0UoMHgwNDFlLCAweDQwMjIsIDB4ZmYpLCB9LCAgICAgICAgICAgICAgICAgICAgICAgICBcCiAJeyBaQzAzMDFfVVNCX0RFVklDRSgweDA0MWUsIDB4NDAzNCwgMHhmZiksIH0sIC8qIFBBUzEwNiAqLyAgICAgICAgICAgIFwKIAl7IFpDMDMwMV9VU0JfREVWSUNFKDB4MDQxZSwgMHg0MDM1LCAweGZmKSwgfSwgLyogUEFTMTA2ICovICAgICAgICAgICAgXAotCXsgWkMwMzAxX1VTQl9ERVZJQ0UoMHgwNDZkLCAweDA4YWUsIDB4ZmYpLCB9LCAvKiBQQVMyMDJCQ0IgKi8gICAgICAgICBcCisJeyBaQzAzMDFfVVNCX0RFVklDRSgweDA0MWUsIDB4NDAzNiwgMHhmZiksIH0sIC8qIEhWNzEzMSAqLyAgICAgICAgICAgIFwKKwl7IFpDMDMwMV9VU0JfREVWSUNFKDB4MDQxZSwgMHg0MDNhLCAweGZmKSwgfSwgLyogSFY3MTMxICovICAgICAgICAgICAgXAorCXsgWkMwMzAxX1VTQl9ERVZJQ0UoMHgwNDU4LCAweDcwMDcsIDB4ZmYpLCB9LCAvKiBUQVM1MTMwICovICAgICAgICAgICBcCisJeyBaQzAzMDFfVVNCX0RFVklDRSgweDA0NTgsIDB4NzAwQywgMHhmZiksIH0sIC8qIFRBUzUxMzAgKi8gICAgICAgICAgIFwKKwl7IFpDMDMwMV9VU0JfREVWSUNFKDB4MDQ1OCwgMHg3MDBmLCAweGZmKSwgfSwgLyogVEFTNTEzMCAqLyAgICAgICAgICAgXAorCXsgWkMwMzAxX1VTQl9ERVZJQ0UoMHgwNDZkLCAweDA4YWUsIDB4ZmYpLCB9LCAvKiBQQVMyMDIgKi8gICAgICAgICAgICBcCisJeyBaQzAzMDFfVVNCX0RFVklDRSgweDA1NWYsIDB4ZDAwMywgMHhmZiksIH0sIC8qIFRBUzUxMzAgKi8gICAgICAgICAgIFwKKwl7IFpDMDMwMV9VU0JfREVWSUNFKDB4MDU1ZiwgMHhkMDA0LCAweGZmKSwgfSwgLyogVEFTNTEzMCAqLyAgICAgICAgICAgXAorCXsgWkMwMzAxX1VTQl9ERVZJQ0UoMHgwNDZkLCAweDA4YWUsIDB4ZmYpLCB9LCAvKiBQQVMyMDIgKi8gICAgICAgICAgICBcCiAJeyBaQzAzMDFfVVNCX0RFVklDRSgweDBhYzgsIDB4MDMwMSwgMHhmZiksIH0sICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQl7IFpDMDMwMV9VU0JfREVWSUNFKDB4MTBmZCwgMHg4MDUwLCAweGZmKSwgfSwgLyogVEFTNTEzMEQgKi8gICAgICAgICAgXAorCXsgWkMwMzAxX1VTQl9ERVZJQ0UoMHgwYWM4LCAweDMwMWIsIDB4ZmYpLCB9LCAvKiBQQi0wMzMwL0hWNzEzMSAqLyAgICBcCisJeyBaQzAzMDFfVVNCX0RFVklDRSgweDBhYzgsIDB4MzAzYiwgMHhmZiksIH0sIC8qIFBCLTAzMzAgKi8gICAgICAgICAgIFwKKwl7IFpDMDMwMV9VU0JfREVWSUNFKDB4MTBmZCwgMHgwMTI4LCAweGZmKSwgfSwgLyogVEFTNTEzMCAqLyAgICAgICAgICAgXAorCXsgWkMwMzAxX1VTQl9ERVZJQ0UoMHgxMGZkLCAweDgwNTAsIDB4ZmYpLCB9LCAvKiBUQVM1MTMwICovICAgICAgICAgICBcCisJeyBaQzAzMDFfVVNCX0RFVklDRSgweDEwZmQsIDB4ODA0ZSwgMHhmZiksIH0sIC8qIFRBUzUxMzAgKi8gICAgICAgICAgIFwKIAl7IH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbi5oIGIvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbi5oCmluZGV4IDAxNjZmNTUuLmZmY2RhOTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vem9yYW4uaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pvcmFuLmgKQEAgLTE1OSw3ICsxNTksNyBAQAogI2RlZmluZSBCVVpfTUFYX0ZSQU1FICAgICAyNTYJLyogTXVzdCBiZSBhIHBvd2VyIG9mIDIgKi8KICNkZWZpbmUgQlVaX01BU0tfRlJBTUUgICAgMjU1CS8qIE11c3QgYmUgQlVaX01BWF9GUkFNRS0xICovCiAKLSNkZWZpbmUgQlVaX01BWF9JTlBVVCAgICAgICA4CisjZGVmaW5lIEJVWl9NQVhfSU5QVVQgICAgICAgMTYKIAogI2lmIFZJREVPX01BWF9GUkFNRSA8PSAzMgogIyAgIGRlZmluZSAgIFY0TF9NQVhfRlJBTUUgICAzMgpAQCAtMTkxLDYgKzE5MSw5IEBACiAJLyogSW9tZWdhICovCiAJQlVaLAogCisJLyogQXZlck1lZGlhICovCisJQVZTNkVZRVMsCisKIAkvKiB0b3RhbCBudW1iZXIgb2YgY2FyZHMgKi8KIAlOVU1fQ0FSRFMKIH07CkBAIC0zNzksNiArMzgyLDkgQEAKIAkvKiBpcyB0aGUgL0dXUyBsaW5lIGNvbmVjdGVkPyAqLwogCXU4IGd3c19ub3RfY29ubmVjdGVkOwogCisJLyogYXZzNmV5ZXMgbXV4IHNldHRpbmcgKi8KKwl1OCBpbnB1dF9tdXg7CisKIAl2b2lkICgqaW5pdCkgKHN0cnVjdCB6b3JhbiAqIHpyKTsKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vem9yYW5fY2FyZC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbl9jYXJkLmMKaW5kZXggMGE4NWM5ZS4uOTU4YzFlNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbl9jYXJkLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbl9jYXJkLmMKQEAgLTI3LDYgKzI3LDggQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KQEAgLTM4LDYgKzQwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMtYWxnby1iaXQuaD4KICNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9zZW0uaD4KICNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CkBAIC05Myw2ICs5NiwxMSBAQAogTU9EVUxFX1BBUk1fREVTQyhkZWZhdWx0X2lucHV0LAogCQkgIkRlZmF1bHQgaW5wdXQgKDA9Q29tcG9zaXRlLCAxPVMtVmlkZW8sIDI9SW50ZXJuYWwpIik7CiAKK3N0YXRpYyBpbnQgZGVmYXVsdF9tdXggPSAxOwkvKiA2IEV5ZXMgaW5wdXQgc2VsZWN0aW9uICovCittb2R1bGVfcGFyYW0oZGVmYXVsdF9tdXgsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlZmF1bHRfbXV4LAorCQkgIkRlZmF1bHQgNiBFeWVzIG11eCBzZXR0aW5nIChJbnB1dCBzZWxlY3Rpb24pIik7CisKIHN0YXRpYyBpbnQgZGVmYXVsdF9ub3JtID0gMDsJLyogMD1QQUwsIDE9TlRTQyAyPVNFQ0FNICovCiBtb2R1bGVfcGFyYW0oZGVmYXVsdF9ub3JtLCBpbnQsIDApOwogTU9EVUxFX1BBUk1fREVTQyhkZWZhdWx0X25vcm0sICJEZWZhdWx0IG5vcm0gKDA9UEFMLCAxPU5UU0MsIDI9U0VDQU0pIik7CkBAIC0zMDEsNiArMzA5LDMwIEBACiAJR1BJTyh6ciwgMiwgMSk7CQkvLyBTZXQgQ29tcG9zaXRlIGlucHV0L291dHB1dAogfQogCitzdGF0aWMgdm9pZAorYXZzNmV5ZXNfaW5pdCAoc3RydWN0IHpvcmFuICp6cikKK3sKKwkvLyBBdmVyTWVkaWEgNi1FeWVzIG9yaWdpbmFsIGRyaXZlciBieSBDaHJpc3RlciBXZWluaWdlbAorCisJLy8gTGlmdGVkIHN0cmFpZ2h0IGZyb20gQ2hyaXN0ZXIncyBvbGQgZHJpdmVyIGFuZAorCS8vIG1vZGlmaWVkIHNsaWdodGx5IGJ5IE1hcnRpbiBTYW11ZWxzc29uLgorCisJaW50IG11eCA9IGRlZmF1bHRfbXV4OyAvKiAxID0gQlQ4NjYsIDcgPSBWSUQxICovCisKKwlHUElPKHpyLCA0LCAxKTsgLyogQnQ4NjYgU0xFRVAgb24gKi8KKwl1ZGVsYXkoMik7CisKKwlHUElPKHpyLCAwLCAxKTsgLyogWlIzNjA2MCAvUkVTRVQgb24gKi8KKwlHUElPKHpyLCAxLCAwKTsgLyogWlIzNjA2MCAvU0xFRVAgb24gKi8KKwlHUElPKHpyLCAyLCBtdXggJiAxKTsgICAvKiBNVVggUzAgKi8KKwlHUElPKHpyLCAzLCAwKTsgLyogL0ZSQU1FIG9uICovCisJR1BJTyh6ciwgNCwgMCk7IC8qIEJ0ODY2IFNMRUVQIG9mZiAqLworCUdQSU8oenIsIDUsIG11eCAmIDIpOyAgIC8qIE1VWCBTMSAqLworCUdQSU8oenIsIDYsIDApOyAvKiA/ICovCisJR1BJTyh6ciwgNywgbXV4ICYgNCk7ICAgLyogTVVYIFMyICovCisKK30KKwogc3RhdGljIGNoYXIgKgogaTJjaWRfdG9fbW9kdWxlbmFtZSAodTE2IGkyY19pZCkKIHsKQEAgLTM5MSw2ICs0MjMsMTQgQEAKIHN0YXRpYyBzdHJ1Y3QgdHZub3JtIGY1MGNjaXI2MDFfbG0zM3IxMCA9IHsgODY0LCA3MjAsIDc0KzU0LCA4MDQsIDYyNSwgNTc2LCAxOCB9Owogc3RhdGljIHN0cnVjdCB0dm5vcm0gZjYwY2NpcjYwMV9sbTMzcjEwID0geyA4NTgsIDcyMCwgNTYrNTQsIDc4OCwgNTI1LCA0ODAsIDE2IH07CiAKKy8qIEZJWE1FOiBUaGUga3MwMTI3IHNlZW0gaW5jYXBhYmxlIG9mIHN3YXBwaW5nIFUgYW5kIFYsIHRvbywgd2hpY2ggaXMgd2h5IEkKKyAqIGNvcHkgTWF4aW0ncyBsZWZ0IHNoaWZ0IGhhY2sgZm9yIHRoZSA2IEV5ZXMuCisgKgorICogQ2hyaXN0ZXIncyBkcml2ZXIgdXNlZCB0aGUgdW5zaGlmdGVkIG5vcm1zLCB0aG91Z2guLi4KKyAqIC9TYW0gICovCitzdGF0aWMgc3RydWN0IHR2bm9ybSBmNTBjY2lyNjAxX2F2czZleWVzID0geyA4NjQsIDcyMCwgNzQsIDgwNCwgNjI1LCA1NzYsIDE4IH07CitzdGF0aWMgc3RydWN0IHR2bm9ybSBmNjBjY2lyNjAxX2F2czZleWVzID0geyA4NTgsIDcyMCwgNTYsIDc4OCwgNTI1LCA0ODAsIDE2IH07CisKIHN0YXRpYyBzdHJ1Y3QgY2FyZF9pbmZvIHpvcmFuX2NhcmRzW05VTV9DQVJEU10gX19kZXZpbml0ZGF0YSA9IHsKIAl7CiAJCS50eXBlID0gREMxMF9vbGQsCkBAIC00MTksNiArNDU5LDcgQEAKIAkJLmdwY3MgPSB7IC0xLCAwIH0sCiAJCS52ZmVfcG9sID0geyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH0sCiAJCS5nd3Nfbm90X2Nvbm5lY3RlZCA9IDAsCisJCS5pbnB1dF9tdXggPSAwLAogCQkuaW5pdCA9ICZkYzEwX2luaXQsCiAJfSwgewogCQkudHlwZSA9IERDMTBfbmV3LApAQCAtNDQ1LDYgKzQ4Niw3IEBACiAJCS5ncGNzID0geyAtMSwgMX0sCiAJCS52ZmVfcG9sID0geyAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwIH0sCiAJCS5nd3Nfbm90X2Nvbm5lY3RlZCA9IDAsCisJCS5pbnB1dF9tdXggPSAwLAogCQkuaW5pdCA9ICZkYzEwcGx1c19pbml0LAogCX0sIHsKIAkJLnR5cGUgPSBEQzEwcGx1cywKQEAgLTQ3NCw2ICs1MTYsNyBAQAogCQkuZ3BjcyA9IHsgLTEsIDEgfSwKIAkJLnZmZV9wb2wgPSB7IDEsIDEsIDEsIDEsIDAsIDAsIDAsIDAgfSwKIAkJLmd3c19ub3RfY29ubmVjdGVkID0gMCwKKwkJLmlucHV0X211eCA9IDAsCiAJCS5pbml0ID0gJmRjMTBwbHVzX2luaXQsCiAJfSwgewogCQkudHlwZSA9IERDMzAsCkBAIC01MDIsNiArNTQ1LDcgQEAKIAkJLmdwY3MgPSB7IC0xLCAwIH0sCiAJCS52ZmVfcG9sID0geyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH0sCiAJCS5nd3Nfbm90X2Nvbm5lY3RlZCA9IDAsCisJCS5pbnB1dF9tdXggPSAwLAogCQkuaW5pdCA9ICZkYzEwX2luaXQsCiAJfSwgewogCQkudHlwZSA9IERDMzBwbHVzLApAQCAtNTMyLDYgKzU3Niw3IEBACiAJCS5ncGNzID0geyAtMSwgMCB9LAogCQkudmZlX3BvbCA9IHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9LAogCQkuZ3dzX25vdF9jb25uZWN0ZWQgPSAwLAorCQkuaW5wdXRfbXV4ID0gMCwKIAkJLmluaXQgPSAmZGMxMF9pbml0LAogCX0sIHsKIAkJLnR5cGUgPSBMTUwzMywKQEAgLTU1OCw2ICs2MDMsNyBAQAogCQkuZ3BjcyA9IHsgMywgMSB9LAogCQkudmZlX3BvbCA9IHsgMSwgMSwgMCwgMCwgMCwgMSwgMCwgMCB9LAogCQkuZ3dzX25vdF9jb25uZWN0ZWQgPSAxLAorCQkuaW5wdXRfbXV4ID0gMCwKIAkJLmluaXQgPSAmbG1sMzNfaW5pdCwKIAl9LCB7CiAJCS50eXBlID0gTE1MMzNSMTAsCkBAIC01ODYsNiArNjMyLDcgQEAKIAkJLmdwY3MgPSB7IDMsIDEgfSwKIAkJLnZmZV9wb2wgPSB7IDEsIDEsIDAsIDAsIDAsIDEsIDAsIDAgfSwKIAkJLmd3c19ub3RfY29ubmVjdGVkID0gMSwKKwkJLmlucHV0X211eCA9IDAsCiAJCS5pbml0ID0gJmxtbDMzX2luaXQsCiAJfSwgewogCQkudHlwZSA9IEJVWiwKQEAgLTYxNCw4ICs2NjEsNDkgQEAKIAkJLmdwY3MgPSB7IDMsIDEgfSwKIAkJLnZmZV9wb2wgPSB7IDEsIDEsIDAsIDAsIDAsIDEsIDAsIDAgfSwKIAkJLmd3c19ub3RfY29ubmVjdGVkID0gMSwKKwkJLmlucHV0X211eCA9IDAsCiAJCS5pbml0ID0gJmJ1el9pbml0LAorCX0sIHsKKwkJLnR5cGUgPSBBVlM2RVlFUywKKwkJLm5hbWUgPSAiNi1FeWVzIiwKKwkJLyogQXZlck1lZGlhIGNob3NlIG5vdCB0byBicmFuZCB0aGUgNi1FeWVzLiBUaHVzIGl0CisJCSAgIGNhbid0IGJlIGF1dG9kZXRlY3RlZCwgYW5kIHJlcXVpcmVzIGNhcmQ9eC4gKi8KKwkJLnZlbmRvcl9pZCA9IC0xLAorCQkuZGV2aWNlX2lkID0gLTEsCisJCS5pMmNfZGVjb2RlciA9IEkyQ19EUklWRVJJRF9LUzAxMjcsCisJCS5pMmNfZW5jb2RlciA9IEkyQ19EUklWRVJJRF9CVDg2NiwKKwkJLnZpZGVvX2NvZGVjID0gQ09ERUNfVFlQRV9aUjM2MDYwLAorCisJCS5pbnB1dHMgPSAxMCwKKwkJLmlucHV0ID0geworCQkJeyAwLCAiQ29tcG9zaXRlIDEiIH0sCisJCQl7IDEsICJDb21wb3NpdGUgMiIgfSwKKwkJCXsgMiwgIkNvbXBvc2l0ZSAzIiB9LAorCQkJeyA0LCAiQ29tcG9zaXRlIDQiIH0sCisJCQl7IDUsICJDb21wb3NpdGUgNSIgfSwKKwkJCXsgNiwgIkNvbXBvc2l0ZSA2IiB9LAorCQkJeyA4LCAiUy1WaWRlbyAxIiB9LAorCQkJeyA5LCAiUy1WaWRlbyAyIiB9LAorCQkJezEwLCAiUy1WaWRlbyAzIiB9LAorCQkJezE1LCAiWUNiQ3IiIH0KKwkJfSwKKwkJLm5vcm1zID0gMiwKKwkJLnR2biA9IHsKKwkJCSZmNTBjY2lyNjAxX2F2czZleWVzLAorCQkJJmY2MGNjaXI2MDFfYXZzNmV5ZXMsCisJCQlOVUxMCisJCX0sCisJCS5qcGVnX2ludCA9IFpSMzYwNTdfSVNSX0dJUlExLAorCQkudnN5bmNfaW50ID0gWlIzNjA1N19JU1JfR0lSUTAsCisJCS5ncGlvID0geyAxLCAwLCAzLCAtMSwgLTEsIC0xLCAtMSwgLTEgfSwvLyBWYWxpZGl0eSB1bmtub3duIC9TYW0KKwkJLmdwaW9fcG9sID0geyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH0sIC8vIFZhbGlkaXR5IHVua25vd24gL1NhbQorCQkuZ3BjcyA9IHsgMywgMSB9LAkJCS8vIFZhbGlkaXR5IHVua25vd24gL1NhbQorCQkudmZlX3BvbCA9IHsgMSwgMCwgMCwgMCwgMCwgMSwgMCwgMCB9LCAgLy8gVmFsaWRpdHkgdW5rbm93biAvU2FtCisJCS5nd3Nfbm90X2Nvbm5lY3RlZCA9IDEsCisJCS5pbnB1dF9tdXggPSAxLAorCQkuaW5pdCA9ICZhdnM2ZXllc19pbml0LAogCX0KKwogfTsKIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vem9yYW5fZGV2aWNlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pvcmFuX2RldmljZS5jCmluZGV4IGM2OTBiMmUuLjAyMTY4ZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vem9yYW5fZGV2aWNlLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbl9kZXZpY2UuYwpAQCAtNTM2LDcgKzUzNiw3IEBACiAJCSAqIEFsbCBlcnJvciBtZXNzYWdlcyBhcmUgaW50ZXJuYWwgZHJpdmVyIGNoZWNraW5nIG9ubHkhICovCiAKIAkJLyogdmlkZW8gZGlzcGxheSB0b3AgYW5kIGJvdHRvbSByZWdpc3RlcnMgKi8KLQkJcmVnID0gKHUzMikgenItPmJ1ZmZlci5iYXNlICsKKwkJcmVnID0gKGxvbmcpIHpyLT5idWZmZXIuYmFzZSArCiAJCSAgICB6ci0+b3ZlcmxheV9zZXR0aW5ncy54ICoKIAkJICAgICgoenItPm92ZXJsYXlfc2V0dGluZ3MuZm9ybWF0LT5kZXB0aCArIDcpIC8gOCkgKwogCQkgICAgenItPm92ZXJsYXlfc2V0dGluZ3MueSAqCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3pvcmFuX2RyaXZlci5jIGIvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbl9kcml2ZXIuYwppbmRleCBiNWE1NzZhLi45NzExZjYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3pvcmFuX2RyaXZlci5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vem9yYW5fZHJpdmVyLmMKQEAgLTczLDYgKzczLDcgQEAKIAkJCSAgICAgKQogCiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgogI2luY2x1ZGUgInZpZGVvY29kZWMuaCIKIAogI2luY2x1ZGUgPGFzbS9pby5oPgpAQCAtMjA0Nyw3ICsyMDQ4LDcgQEAKIAkJZHByaW50aygzLCBLRVJOX0RFQlVHICIlczogVklESU9DR0NBUFxuIiwgWlJfREVWTkFNRSh6cikpOwogCiAJCW1lbXNldCh2Y2FwLCAwLCBzaXplb2Yoc3RydWN0IHZpZGVvX2NhcGFiaWxpdHkpKTsKLQkJc3RybmNweSh2Y2FwLT5uYW1lLCBaUl9ERVZOQU1FKHpyKSwgc2l6ZW9mKHZjYXAtPm5hbWUpKTsKKwkJc3RybmNweSh2Y2FwLT5uYW1lLCBaUl9ERVZOQU1FKHpyKSwgc2l6ZW9mKHZjYXAtPm5hbWUpLTEpOwogCQl2Y2FwLT50eXBlID0gWk9SQU5fVklEX1RZUEU7CiAKIAkJdmNhcC0+Y2hhbm5lbHMgPSB6ci0+Y2FyZC5pbnB1dHM7CkBAIC0yNjg5LDggKzI2OTAsOCBAQAogCQlkcHJpbnRrKDMsIEtFUk5fREVCVUcgIiVzOiBWSURJT0NfUVVFUllDQVBcbiIsIFpSX0RFVk5BTUUoenIpKTsKIAogCQltZW1zZXQoY2FwLCAwLCBzaXplb2YoKmNhcCkpOwotCQlzdHJuY3B5KGNhcC0+Y2FyZCwgWlJfREVWTkFNRSh6ciksIHNpemVvZihjYXAtPmNhcmQpKTsKLQkJc3RybmNweShjYXAtPmRyaXZlciwgInpvcmFuIiwgc2l6ZW9mKGNhcC0+ZHJpdmVyKSk7CisJCXN0cm5jcHkoY2FwLT5jYXJkLCBaUl9ERVZOQU1FKHpyKSwgc2l6ZW9mKGNhcC0+Y2FyZCktMSk7CisJCXN0cm5jcHkoY2FwLT5kcml2ZXIsICJ6b3JhbiIsIHNpemVvZihjYXAtPmRyaXZlciktMSk7CiAJCXNucHJpbnRmKGNhcC0+YnVzX2luZm8sIHNpemVvZihjYXAtPmJ1c19pbmZvKSwgIlBDSTolcyIsCiAJCQkgcGNpX25hbWUoenItPnBjaV9kZXYpKTsKIAkJY2FwLT52ZXJzaW9uID0KQEAgLTI3NDIsNyArMjc0Myw3IEBACiAJCW1lbXNldChmbXQsIDAsIHNpemVvZigqZm10KSk7CiAJCWZtdC0+aW5kZXggPSBpbmRleDsKIAkJZm10LT50eXBlID0gdHlwZTsKLQkJc3RybmNweShmbXQtPmRlc2NyaXB0aW9uLCB6b3Jhbl9mb3JtYXRzW2ldLm5hbWUsIDMxKTsKKwkJc3RybmNweShmbXQtPmRlc2NyaXB0aW9uLCB6b3Jhbl9mb3JtYXRzW2ldLm5hbWUsIHNpemVvZihmbXQtPmRlc2NyaXB0aW9uKS0xKTsKIAkJZm10LT5waXhlbGZvcm1hdCA9IHpvcmFuX2Zvcm1hdHNbaV0uZm91cmNjOwogCQlpZiAoem9yYW5fZm9ybWF0c1tpXS5mbGFncyAmIFpPUkFOX0ZPUk1BVF9DT01QUkVTU0VEKQogCQkJZm10LT5mbGFncyB8PSBWNEwyX0ZNVF9GTEFHX0NPTVBSRVNTRUQ7CkBAIC0zNTY2LDE2ICszNTY3LDE2IEBACiAKIAkJc3dpdGNoIChjdHJsLT5pZCkgewogCQljYXNlIFY0TDJfQ0lEX0JSSUdIVE5FU1M6Ci0JCQlzdHJuY3B5KGN0cmwtPm5hbWUsICJCcmlnaHRuZXNzIiwgMzEpOworCQkJc3RybmNweShjdHJsLT5uYW1lLCAiQnJpZ2h0bmVzcyIsIHNpemVvZihjdHJsLT5uYW1lKS0xKTsKIAkJCWJyZWFrOwogCQljYXNlIFY0TDJfQ0lEX0NPTlRSQVNUOgotCQkJc3RybmNweShjdHJsLT5uYW1lLCAiQ29udHJhc3QiLCAzMSk7CisJCQlzdHJuY3B5KGN0cmwtPm5hbWUsICJDb250cmFzdCIsIHNpemVvZihjdHJsLT5uYW1lKS0xKTsKIAkJCWJyZWFrOwogCQljYXNlIFY0TDJfQ0lEX1NBVFVSQVRJT046Ci0JCQlzdHJuY3B5KGN0cmwtPm5hbWUsICJTYXR1cmF0aW9uIiwgMzEpOworCQkJc3RybmNweShjdHJsLT5uYW1lLCAiU2F0dXJhdGlvbiIsIHNpemVvZihjdHJsLT5uYW1lKS0xKTsKIAkJCWJyZWFrOwogCQljYXNlIFY0TDJfQ0lEX0hVRToKLQkJCXN0cm5jcHkoY3RybC0+bmFtZSwgIkh1ZSIsIDMxKTsKKwkJCXN0cm5jcHkoY3RybC0+bmFtZSwgIkh1ZSIsIHNpemVvZihjdHJsLT5uYW1lKS0xKTsKIAkJCWJyZWFrOwogCQl9CiAKQEAgLTM2OTMsNyArMzY5NCw3IEBACiAJCQkJCSZjYXBzKTsKIAkJCWlmIChjYXBzLmZsYWdzICYgVklERU9fREVDT0RFUl9BVVRPKSB7CiAJCQkJc3RkLT5pZCA9IFY0TDJfU1REX0FMTDsKLQkJCQlzdHJuY3B5KHN0ZC0+bmFtZSwgIkF1dG9kZXRlY3QiLCAzMSk7CisJCQkJc3RybmNweShzdGQtPm5hbWUsICJBdXRvZGV0ZWN0Iiwgc2l6ZW9mKHN0ZC0+bmFtZSktMSk7CiAJCQkJcmV0dXJuIDA7CiAJCQl9IGVsc2UKIAkJCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTM3MDEsMjEgKzM3MDIsMjEgQEAKIAkJc3dpdGNoIChzdGQtPmluZGV4KSB7CiAJCWNhc2UgMDoKIAkJCXN0ZC0+aWQgPSBWNEwyX1NURF9QQUw7Ci0JCQlzdHJuY3B5KHN0ZC0+bmFtZSwgIlBBTCIsIDMxKTsKKwkJCXN0cm5jcHkoc3RkLT5uYW1lLCAiUEFMIiwgc2l6ZW9mKHN0ZC0+bmFtZSktMSk7CiAJCQlzdGQtPmZyYW1lcGVyaW9kLm51bWVyYXRvciA9IDE7CiAJCQlzdGQtPmZyYW1lcGVyaW9kLmRlbm9taW5hdG9yID0gMjU7CiAJCQlzdGQtPmZyYW1lbGluZXMgPSB6ci0+Y2FyZC50dm5bMF0tPkh0OwogCQkJYnJlYWs7CiAJCWNhc2UgMToKIAkJCXN0ZC0+aWQgPSBWNEwyX1NURF9OVFNDOwotCQkJc3RybmNweShzdGQtPm5hbWUsICJOVFNDIiwgMzEpOworCQkJc3RybmNweShzdGQtPm5hbWUsICJOVFNDIiwgc2l6ZW9mKHN0ZC0+bmFtZSktMSk7CiAJCQlzdGQtPmZyYW1lcGVyaW9kLm51bWVyYXRvciA9IDEwMDE7CiAJCQlzdGQtPmZyYW1lcGVyaW9kLmRlbm9taW5hdG9yID0gMzAwMDA7CiAJCQlzdGQtPmZyYW1lbGluZXMgPSB6ci0+Y2FyZC50dm5bMV0tPkh0OwogCQkJYnJlYWs7CiAJCWNhc2UgMjoKIAkJCXN0ZC0+aWQgPSBWNEwyX1NURF9TRUNBTTsKLQkJCXN0cm5jcHkoc3RkLT5uYW1lLCAiU0VDQU0iLCAzMSk7CisJCQlzdHJuY3B5KHN0ZC0+bmFtZSwgIlNFQ0FNIiwgc2l6ZW9mKHN0ZC0+bmFtZSktMSk7CiAJCQlzdGQtPmZyYW1lcGVyaW9kLm51bWVyYXRvciA9IDE7CiAJCQlzdGQtPmZyYW1lcGVyaW9kLmRlbm9taW5hdG9yID0gMjU7CiAJCQlzdGQtPmZyYW1lbGluZXMgPSB6ci0+Y2FyZC50dm5bMl0tPkh0OwpAQCAtMzg3MSw3ICszODcyLDcgQEAKIAkJbWVtc2V0KG91dHAsIDAsIHNpemVvZigqb3V0cCkpOwogCQlvdXRwLT5pbmRleCA9IDA7CiAJCW91dHAtPnR5cGUgPSBWNEwyX09VVFBVVF9UWVBFX0FOQUxPR1ZHQU9WRVJMQVk7Ci0JCXN0cm5jcHkob3V0cC0+bmFtZSwgIkF1dG9kZXRlY3QiLCAzMSk7CisJCXN0cm5jcHkob3V0cC0+bmFtZSwgIkF1dG9kZXRlY3QiLCBzaXplb2Yob3V0cC0+bmFtZSktMSk7CiAKIAkJcmV0dXJuIDA7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbl9wcm9jZnMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vem9yYW5fcHJvY2ZzLmMKaW5kZXggYTAwZmFlOS4uZjRmZmU3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbl9wcm9jZnMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pvcmFuX3Byb2Nmcy5jCkBAIC00Myw2ICs0Myw3IEBACiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KIAogI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogCiAjaW5jbHVkZSAidmlkZW9jb2RlYy5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvS2NvbmZpZyBiL2RyaXZlcnMvbXRkL0tjb25maWcKaW5kZXggNWFjMjY1ZC4uMTM0NGFkNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvS2NvbmZpZworKysgYi9kcml2ZXJzL210ZC9LY29uZmlnCkBAIC04NiwxNCArODYsMTQgQEAKIAkgIGJsb2NrIGFuZCAiLTIiIG1lYW5zIHRoZSBwZW51bHRpbWF0ZSBibG9jay4KIAogY29uZmlnIE1URF9SRURCT09UX1BBUlRTX1VOQUxMT0NBVEVECi0JYm9vbCAiICBJbmNsdWRlIHVuYWxsb2NhdGVkIGZsYXNoIHJlZ2lvbnMiCisJYm9vbCAiSW5jbHVkZSB1bmFsbG9jYXRlZCBmbGFzaCByZWdpb25zIgogCWRlcGVuZHMgb24gTVREX1JFREJPT1RfUEFSVFMKIAloZWxwCiAJICBJZiB5b3UgbmVlZCB0byByZWdpc3RlciBlYWNoIHVuYWxsb2NhdGVkIGZsYXNoIHJlZ2lvbiBhcyBhIE1URAogCSAgJ3BhcnRpdGlvbicsIGVuYWJsZSB0aGlzIG9wdGlvbi4KIAogY29uZmlnIE1URF9SRURCT09UX1BBUlRTX1JFQURPTkxZCi0JYm9vbCAiICBGb3JjZSByZWFkLW9ubHkgZm9yIFJlZEJvb3Qgc3lzdGVtIGltYWdlcyIKKwlib29sICJGb3JjZSByZWFkLW9ubHkgZm9yIFJlZEJvb3Qgc3lzdGVtIGltYWdlcyIKIAlkZXBlbmRzIG9uIE1URF9SRURCT09UX1BBUlRTCiAJaGVscAogCSAgSWYgeW91IG5lZWQgdG8gZm9yY2UgcmVhZC1vbmx5IGZvciAnUmVkQm9vdCcsICdSZWRCb290IENvbmZpZycgYW5kCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tYXBzL0tjb25maWcgYi9kcml2ZXJzL210ZC9tYXBzL0tjb25maWcKaW5kZXggNmJkYWFjYy4uODNkMGIyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbWFwcy9LY29uZmlnCisrKyBiL2RyaXZlcnMvbXRkL21hcHMvS2NvbmZpZwpAQCAtMjEyLDcgKzIxMiw3IEBACiAJICBTdXBwb3J0IGZvciBmbGFzaCBjaGlwcyBvbiBORVR0ZWwvU2VjdXJlRWRnZS9TbmFwR2VhciBib2FyZHMuCiAKIGNvbmZpZyBNVERfQUxDSEVNWQotCXRyaXN0YXRlICcgIEFNRCBBbGNoZW15IFBiMXh4eC9EYjF4eHgvUkRLIE1URCBzdXBwb3J0JworCXRyaXN0YXRlICJBTUQgQWxjaGVteSBQYjF4eHgvRGIxeHh4L1JESyBNVEQgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFNPQ19BVTFYMDAKIAloZWxwCiAJICBGbGFzaCBtZW1vcnkgYWNjZXNzIG9uIEFNRCBBbGNoZW15IFBiL0RiL1JESyBSZWZlcmVuY2UgQm9hcmRzCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tYXBzL3N1bl91Zmxhc2guYyBiL2RyaXZlcnMvbXRkL21hcHMvc3VuX3VmbGFzaC5jCmluZGV4IDA3NThjYjEuLjI0YTAzMTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL21hcHMvc3VuX3VmbGFzaC5jCisrKyBiL2RyaXZlcnMvbXRkL21hcHMvc3VuX3VmbGFzaC5jCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8YXNtL2VidXMuaD4KICNpbmNsdWRlIDxhc20vb3BsaWIuaD4KKyNpbmNsdWRlIDxhc20vcHJvbS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKQEAgLTMwLDE0NiArMzEsMTQwIEBACiAjZGVmaW5lIFVGTEFTSF9XSU5ET1dfU0laRQkweDIwMDAwMAogI2RlZmluZSBVRkxBU0hfQlVTV0lEVEgJCTEJCQkvKiBFQnVzIGlzIDgtYml0ICovCiAKLU1PRFVMRV9BVVRIT1IKLQkoIkVyaWMgQnJvd2VyIDxlYnJvd2VyQHVzYS5uZXQ+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04KLQkoIlVzZXItcHJvZ3JhbW1hYmxlIGZsYXNoIGRldmljZSBvbiBTdW4gTWljcm9zeXN0ZW1zIGJvYXJkc2V0cyIpOwotTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UKLQkoInVzZXJmbGFzaCIpOwotTU9EVUxFX0xJQ0VOU0UKLQkoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiRXJpYyBCcm93ZXIgPGVicm93ZXJAdXNhLm5ldD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiVXNlci1wcm9ncmFtbWFibGUgZmxhc2ggZGV2aWNlIG9uIFN1biBNaWNyb3N5c3RlbXMgYm9hcmRzZXRzIik7CitNT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgidXNlcmZsYXNoIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTigiMi4wIik7CiAKIHN0YXRpYyBMSVNUX0hFQUQoZGV2aWNlX2xpc3QpOwogc3RydWN0IHVmbGFzaF9kZXYgewotCWNoYXIgKgkJCW5hbWU7CS8qIGRldmljZSBuYW1lICovCisJY2hhcgkJCSpuYW1lOwkvKiBkZXZpY2UgbmFtZSAqLwogCXN0cnVjdCBtYXBfaW5mbyAJbWFwOwkvKiBtdGQgbWFwIGluZm8gKi8KLQlzdHJ1Y3QgbXRkX2luZm8gKgltdGQ7CS8qIG10ZCBpbmZvICovCi0Jc3RydWN0IGxpc3RfaGVhZAlsaXN0OworCXN0cnVjdCBtdGRfaW5mbwkJKm10ZDsJLyogbXRkIGluZm8gKi8KIH07CiAKIAogc3RydWN0IG1hcF9pbmZvIHVmbGFzaF9tYXBfdGVtcGwgPSB7Ci0JCS5uYW1lID0JCSJTVU5XLD8/Py0/Pz8/IiwKLQkJLnNpemUgPQkJVUZMQVNIX1dJTkRPV19TSVpFLAotCQkuYmFua3dpZHRoID0JVUZMQVNIX0JVU1dJRFRILAorCS5uYW1lID0JCSJTVU5XLD8/Py0/Pz8/IiwKKwkuc2l6ZSA9CQlVRkxBU0hfV0lORE9XX1NJWkUsCisJLmJhbmt3aWR0aCA9CVVGTEFTSF9CVVNXSURUSCwKIH07CiAKLWludCB1Zmxhc2hfZGV2aW5pdChzdHJ1Y3QgbGludXhfZWJ1c19kZXZpY2UqIGVkZXYpCitpbnQgdWZsYXNoX2RldmluaXQoc3RydWN0IGxpbnV4X2VidXNfZGV2aWNlICplZGV2LCBzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwKQogewotCWludCBpVG1wLCBucmVnczsKLQlzdHJ1Y3QgbGludXhfcHJvbV9yZWdpc3RlcnMgcmVnc1syXTsKLQlzdHJ1Y3QgdWZsYXNoX2RldiAqcGRldjsKKwlzdHJ1Y3QgdWZsYXNoX2RldiAqdXA7CisJc3RydWN0IHJlc291cmNlICpyZXM7CiAKLQlpVG1wID0gcHJvbV9nZXRwcm9wZXJ0eSgKLQkJZWRldi0+cHJvbV9ub2RlLCAicmVnIiwgKHZvaWQgKilyZWdzLCBzaXplb2YocmVncykpOwotCWlmICgoaVRtcCAlIHNpemVvZihyZWdzWzBdKSkgIT0gMCkgewotCQlwcmludGsoIiVzOiBTdHJhbmdlIHJlZyBwcm9wZXJ0eSBzaXplICVkXG4iLAotCQkJVUZMQVNIX0RFVk5BTUUsIGlUbXApOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9CisJcmVzID0gJmVkZXYtPnJlc291cmNlWzBdOwogCi0JbnJlZ3MgPSBpVG1wIC8gc2l6ZW9mKHJlZ3NbMF0pOwotCi0JaWYgKG5yZWdzICE9IDEpIHsKKwlpZiAoZWRldi0+bnVtX2FkZHJzICE9IDEpIHsKIAkJLyogTm9uLUNGSSB1c2VyZmxhc2ggZGV2aWNlLS0gb25jZSBJIGZpbmQgb25lIHdlCiAJCSAqIGNhbiB3b3JrIG9uIHN1cHBvcnRpbmcgaXQuCiAJCSAqLwogCQlwcmludGsoIiVzOiB1bnN1cHBvcnRlZCBkZXZpY2UgYXQgMHglbHggKCVkIHJlZ3MpOiAiIFwKIAkJCSJlbWFpbCBlYnJvd2VyQHVzYS5uZXRcbiIsCi0JCQlVRkxBU0hfREVWTkFNRSwgZWRldi0+cmVzb3VyY2VbMF0uc3RhcnQsIG5yZWdzKTsKKwkJICAgICAgIGRwLT5mdWxsX25hbWUsIHJlcy0+c3RhcnQsIGVkZXYtPm51bV9hZGRycyk7CisKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JaWYoMCA9PSAocGRldiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB1Zmxhc2hfZGV2KSwgR0ZQX0tFUk5FTCkpKSB7Ci0JCXByaW50aygiJXM6IHVuYWJsZSB0byBrbWFsbG9jIG5ldyBkZXZpY2VcbiIsIFVGTEFTSF9ERVZOQU1FKTsKLQkJcmV0dXJuKC1FTk9NRU0pOwotCX0KKwl1cCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB1Zmxhc2hfZGV2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF1cCkKKwkJcmV0dXJuIC1FTk9NRU07CiAKIAkvKiBjb3B5IGRlZmF1bHRzIGFuZCB0d2VhayBwYXJhbWV0ZXJzICovCi0JbWVtY3B5KCZwZGV2LT5tYXAsICZ1Zmxhc2hfbWFwX3RlbXBsLCBzaXplb2YodWZsYXNoX21hcF90ZW1wbCkpOwotCXBkZXYtPm1hcC5zaXplID0gcmVnc1swXS5yZWdfc2l6ZTsKKwltZW1jcHkoJnVwLT5tYXAsICZ1Zmxhc2hfbWFwX3RlbXBsLCBzaXplb2YodWZsYXNoX21hcF90ZW1wbCkpOworCXVwLT5tYXAuc2l6ZSA9IChyZXMtPmVuZCAtIHJlcy0+c3RhcnQpICsgMVVMOwogCi0JaVRtcCA9IHByb21fZ2V0cHJvcGxlbihlZGV2LT5wcm9tX25vZGUsICJtb2RlbCIpOwotCXBkZXYtPm5hbWUgPSBrbWFsbG9jKGlUbXAsIEdGUF9LRVJORUwpOwotCXByb21fZ2V0c3RyaW5nKGVkZXYtPnByb21fbm9kZSwgIm1vZGVsIiwgcGRldi0+bmFtZSwgaVRtcCk7Ci0JaWYoMCAhPSBwZGV2LT5uYW1lICYmIDAgPCBzdHJsZW4ocGRldi0+bmFtZSkpIHsKLQkJcGRldi0+bWFwLm5hbWUgPSBwZGV2LT5uYW1lOwotCX0KLQlwZGV2LT5tYXAucGh5cyA9IGVkZXYtPnJlc291cmNlWzBdLnN0YXJ0OwotCXBkZXYtPm1hcC52aXJ0ID0gaW9yZW1hcF9ub2NhY2hlKGVkZXYtPnJlc291cmNlWzBdLnN0YXJ0LCBwZGV2LT5tYXAuc2l6ZSk7Ci0JaWYoMCA9PSBwZGV2LT5tYXAudmlydCkgewotCQlwcmludGsoIiVzOiBmYWlsZWQgdG8gbWFwIGRldmljZVxuIiwgX19GVU5DVElPTl9fKTsKLQkJa2ZyZWUocGRldi0+bmFtZSk7Ci0JCWtmcmVlKHBkZXYpOwotCQlyZXR1cm4oLTEpOworCXVwLT5uYW1lID0gb2ZfZ2V0X3Byb3BlcnR5KGRwLCAibW9kZWwiLCBOVUxMKTsKKwlpZiAodXAtPm5hbWUgJiYgMCA8IHN0cmxlbih1cC0+bmFtZSkpCisJCXVwLT5tYXAubmFtZSA9IHVwLT5uYW1lOworCisJdXAtPm1hcC5waHlzID0gcmVzLT5zdGFydDsKKworCXVwLT5tYXAudmlydCA9IGlvcmVtYXBfbm9jYWNoZShyZXMtPnN0YXJ0LCB1cC0+bWFwLnNpemUpOworCWlmICghdXAtPm1hcC52aXJ0KSB7CisJCXByaW50aygiJXM6IEZhaWxlZCB0byBtYXAgZGV2aWNlLlxuIiwgZHAtPmZ1bGxfbmFtZSk7CisJCWtmcmVlKHVwKTsKKworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlzaW1wbGVfbWFwX2luaXQoJnBkZXYtPm1hcCk7CisJc2ltcGxlX21hcF9pbml0KCZ1cC0+bWFwKTsKIAogCS8qIE1URCByZWdpc3RyYXRpb24gKi8KLQlwZGV2LT5tdGQgPSBkb19tYXBfcHJvYmUoImNmaV9wcm9iZSIsICZwZGV2LT5tYXApOwotCWlmKDAgPT0gcGRldi0+bXRkKSB7Ci0JCWlvdW5tYXAocGRldi0+bWFwLnZpcnQpOwotCQlrZnJlZShwZGV2LT5uYW1lKTsKLQkJa2ZyZWUocGRldik7Ci0JCXJldHVybigtRU5YSU8pOworCXVwLT5tdGQgPSBkb19tYXBfcHJvYmUoImNmaV9wcm9iZSIsICZ1cC0+bWFwKTsKKwlpZiAoIXVwLT5tdGQpIHsKKwkJaW91bm1hcCh1cC0+bWFwLnZpcnQpOworCQlrZnJlZSh1cCk7CisKKwkJcmV0dXJuIC1FTlhJTzsKIAl9CiAKLQlsaXN0X2FkZCgmcGRldi0+bGlzdCwgJmRldmljZV9saXN0KTsKKwl1cC0+bXRkLT5vd25lciA9IFRISVNfTU9EVUxFOwogCi0JcGRldi0+bXRkLT5vd25lciA9IFRISVNfTU9EVUxFOworCWFkZF9tdGRfZGV2aWNlKHVwLT5tdGQpOwogCi0JYWRkX210ZF9kZXZpY2UocGRldi0+bXRkKTsKLQlyZXR1cm4oMCk7CisJZGV2X3NldF9kcnZkYXRhKCZlZGV2LT5vZmRldi5kZXYsIHVwKTsKKworCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IF9fZGV2aW5pdCB1Zmxhc2hfcHJvYmUoc3RydWN0IG9mX2RldmljZSAqZGV2LCBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKK3sKKwlzdHJ1Y3QgbGludXhfZWJ1c19kZXZpY2UgKmVkZXYgPSB0b19lYnVzX2RldmljZSgmZGV2LT5kZXYpOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAgPSBkZXYtPm5vZGU7CisKKwlpZiAob2ZfZmluZF9wcm9wZXJ0eShkcCwgInVzZXIiLCBOVUxMKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXR1cm4gdWZsYXNoX2RldmluaXQoZWRldiwgZHApOworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCB1Zmxhc2hfcmVtb3ZlKHN0cnVjdCBvZl9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdWZsYXNoX2RldiAqdXAgPSBkZXZfZ2V0X2RydmRhdGEoJmRldi0+ZGV2KTsKKworCWlmICh1cC0+bXRkKSB7CisJCWRlbF9tdGRfZGV2aWNlKHVwLT5tdGQpOworCQltYXBfZGVzdHJveSh1cC0+bXRkKTsKKwl9CisJaWYgKHVwLT5tYXAudmlydCkgeworCQlpb3VubWFwKHVwLT5tYXAudmlydCk7CisJCXVwLT5tYXAudmlydCA9IE5VTEw7CisJfQorCisJa2ZyZWUodXApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHVmbGFzaF9tYXRjaFtdID0geworCXsKKwkJLm5hbWUgPSBVRkxBU0hfT0JQTkFNRSwKKwl9LAorCXt9LAorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgdWZsYXNoX21hdGNoKTsKKworc3RhdGljIHN0cnVjdCBvZl9wbGF0Zm9ybV9kcml2ZXIgdWZsYXNoX2RyaXZlciA9IHsKKwkubmFtZQkJPSBVRkxBU0hfREVWTkFNRSwKKwkubWF0Y2hfdGFibGUJPSB1Zmxhc2hfbWF0Y2gsCisJLnByb2JlCQk9IHVmbGFzaF9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHVmbGFzaF9yZW1vdmUpLAorfTsKKwogc3RhdGljIGludCBfX2luaXQgdWZsYXNoX2luaXQodm9pZCkKIHsKLQlzdHJ1Y3QgbGludXhfZWJ1cyAqZWJ1cyA9IE5VTEw7Ci0Jc3RydWN0IGxpbnV4X2VidXNfZGV2aWNlICplZGV2ID0gTlVMTDsKLQotCWZvcl9lYWNoX2VidXMoZWJ1cykgewotCQlmb3JfZWFjaF9lYnVzZGV2KGVkZXYsIGVidXMpIHsKLQkJCWlmICghc3RyY21wKGVkZXYtPnByb21fbmFtZSwgVUZMQVNIX09CUE5BTUUpKSB7Ci0JCQkJaWYoMCA+IHByb21fZ2V0cHJvcGxlbihlZGV2LT5wcm9tX25vZGUsICJ1c2VyIikpIHsKLQkJCQkJREVCVUcoMiwgIiVzOiBpZ25vcmluZyBkZXZpY2UgYXQgMHglbHhcbiIsCi0JCQkJCQkJVUZMQVNIX0RFVk5BTUUsIGVkZXYtPnJlc291cmNlWzBdLnN0YXJ0KTsKLQkJCQl9IGVsc2UgewotCQkJCQl1Zmxhc2hfZGV2aW5pdChlZGV2KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlpZihsaXN0X2VtcHR5KCZkZXZpY2VfbGlzdCkpIHsKLQkJcHJpbnRrKCIlczogdW5hYmxlIHRvIGxvY2F0ZSBkZXZpY2VcbiIsIFVGTEFTSF9ERVZOQU1FKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCXJldHVybigwKTsKKwlyZXR1cm4gb2ZfcmVnaXN0ZXJfZHJpdmVyKCZ1Zmxhc2hfZHJpdmVyLCAmZWJ1c19idXNfdHlwZSk7CiB9CiAKLXN0YXRpYyB2b2lkIF9fZXhpdCB1Zmxhc2hfY2xlYW51cCh2b2lkKQorc3RhdGljIHZvaWQgX19leGl0IHVmbGFzaF9leGl0KHZvaWQpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqdWRldmxpc3Q7Ci0Jc3RydWN0IHVmbGFzaF9kZXYgKnVkZXY7Ci0KLQlsaXN0X2Zvcl9lYWNoKHVkZXZsaXN0LCAmZGV2aWNlX2xpc3QpIHsKLQkJdWRldiA9IGxpc3RfZW50cnkodWRldmxpc3QsIHN0cnVjdCB1Zmxhc2hfZGV2LCBsaXN0KTsKLQkJREVCVUcoMiwgIiVzOiByZW1vdmluZyBkZXZpY2UgJXNcbiIsCi0JCQlVRkxBU0hfREVWTkFNRSwgdWRldi0+bmFtZSk7Ci0KLQkJaWYoMCAhPSB1ZGV2LT5tdGQpIHsKLQkJCWRlbF9tdGRfZGV2aWNlKHVkZXYtPm10ZCk7Ci0JCQltYXBfZGVzdHJveSh1ZGV2LT5tdGQpOwotCQl9Ci0JCWlmKDAgIT0gdWRldi0+bWFwLnZpcnQpIHsKLQkJCWlvdW5tYXAodWRldi0+bWFwLnZpcnQpOwotCQkJdWRldi0+bWFwLnZpcnQgPSBOVUxMOwotCQl9Ci0JCWtmcmVlKHVkZXYtPm5hbWUpOwotCQlrZnJlZSh1ZGV2KTsKLQl9CisJb2ZfdW5yZWdpc3Rlcl9kcml2ZXIoJnVmbGFzaF9kcml2ZXIpOwogfQogCiBtb2R1bGVfaW5pdCh1Zmxhc2hfaW5pdCk7Ci1tb2R1bGVfZXhpdCh1Zmxhc2hfY2xlYW51cCk7Cittb2R1bGVfZXhpdCh1Zmxhc2hfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC8zYzUwMS5jIGIvZHJpdmVycy9uZXQvM2M1MDEuYwppbmRleCBiYjQ0NTA5Li4wNzEzNmVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC8zYzUwMS5jCisrKyBiL2RyaXZlcnMvbmV0LzNjNTAxLmMKQEAgLTUwOCwxMSArNTA4LDExIEBACiAgKiBzcGVhayBvZi4gV2Ugc2ltcGx5IHB1bGwgdGhlIHBhY2tldCBvdXQgb2YgaXRzIFBJTyBidWZmZXIgKHdoaWNoIGlzIHNsb3cpCiAgKiBhbmQgcXVldWUgaXQgZm9yIHRoZSBrZXJuZWwuIFRoZW4gd2UgcmVzZXQgdGhlIGNhcmQgZm9yIHRoZSBuZXh0IHBhY2tldC4KICAqCi0gKiBXZSBzb21ldGltZXMgZ2V0IHN1cHJpc2UgaW50ZXJydXB0cyBsYXRlIGJvdGggYmVjYXVzZSB0aGUgU01QIElSUSBkZWxpdmVyeQorICogV2Ugc29tZXRpbWVzIGdldCBzdXJwcmlzZSBpbnRlcnJ1cHRzIGxhdGUgYm90aCBiZWNhdXNlIHRoZSBTTVAgSVJRIGRlbGl2ZXJ5CiAgKiBpcyBtZXNzYWdlIHBhc3NpbmcgYW5kIGJlY2F1c2UgdGhlIGNhcmQgc29tZXRpbWVzIHNlZW1zIHRvIGRlbGl2ZXIgbGF0ZS4gSQogICogdGhpbmsgaWYgaXQgaXMgcGFydCB3YXkgdGhyb3VnaCBhIHJlY2VpdmUgYW5kIHRoZSBtb2RlIGlzIGNoYW5nZWQgaXQgY2FycmllcwogICogb24gcmVjZWl2aW5nIGFuZCBzZW5kcyB1cyBhbiBpbnRlcnJ1cHQuIFdlIGhhdmUgdG8gYmFuZCBhaWQgYWxsIHRoZXNlIGNhc2VzCi0gKiB0byBnZXQgYSBzZW5zaWJsZSAxNTBrYnl0ZXMvc2Vjb25kIHBlcmZvcm1hbmNlLiBFdmVuIHRoZW4geW91IHdhbnQgYSBzbWFsbAorICogdG8gZ2V0IGEgc2Vuc2libGUgMTUwa0J5dGVzL3NlY29uZCBwZXJmb3JtYW5jZS4gRXZlbiB0aGVuIHlvdSB3YW50IGEgc21hbGwKICAqIFRDUCB3aW5kb3cuCiAgKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZmVjLmggYi9kcml2ZXJzL25ldC9mZWMuaAppbmRleCA5NjVjNWM0Li4xZDQyMTYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9mZWMuaAorKysgYi9kcml2ZXJzL25ldC9mZWMuaApAQCAtMTQsNyArMTQsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpZiBkZWZpbmVkKENPTkZJR19NNTIzeCkgfHwgZGVmaW5lZChDT05GSUdfTTUyN3gpIHx8IGRlZmluZWQoQ09ORklHX001Mjh4KSB8fCBcCi0gICAgZGVmaW5lZChDT05GSUdfTTUyMHgpCisgICAgZGVmaW5lZChDT05GSUdfTTUyMHgpIHx8IGRlZmluZWQoQ09ORklHX001MzJ4KQogLyoKICAqCUp1c3QgZmlndXJlcywgTW90b3JvbGEgd291bGQgaGF2ZSB0byBjaGFuZ2UgdGhlIG9mZnNldHMgZm9yCiAgKglyZWdpc3RlcnMgaW4gdGhlIHNhbWUgcGVyaXBoZXJhbCBkZXZpY2Ugb24gZGlmZmVyZW50IG1vZGVscwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9pcmRhLXVzYi5jIGIvZHJpdmVycy9uZXQvaXJkYS9pcmRhLXVzYi5jCmluZGV4IDg0NGZhNzQuLjJhMGQ1MzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvaXJkYS11c2IuYworKysgYi9kcml2ZXJzL25ldC9pcmRhL2lyZGEtdXNiLmMKQEAgLTExMDUsNyArMTEwNSw3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKIAogICAgICAgICAvKiBXZSBnZXQgYSBwYXRjaCBmcm9tIHVzZXJzcGFjZSAqLwotICAgICAgICBJUkRBX01FU1NBR0UoIiVzKCk6IFJlY2VpdmVkIGZpcm13YXJlICVzICgldSBieXRlcylcbiIsCisgICAgICAgIElSREFfTUVTU0FHRSgiJXMoKTogUmVjZWl2ZWQgZmlybXdhcmUgJXMgKCV6dSBieXRlcylcbiIsCiAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0aXI0MjF4X2Z3X25hbWUsIGZ3LT5zaXplKTsKIAogICAgICAgICByZXQgPSAtRUlOVkFMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9pcnBvcnQuYyBiL2RyaXZlcnMvbmV0L2lyZGEvaXJwb3J0LmMKaW5kZXggOThmYTUzMS4uNDRlZmQ0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXJkYS9pcnBvcnQuYworKysgYi9kcml2ZXJzL25ldC9pcmRhL2lycG9ydC5jCkBAIC0zODYsNyArMzg2LDcgQEAKIAkvKiBMb2NraW5nIG5vdGVzIDogdGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIGZyb20gaXJxIGNvbnRleHQgd2l0aAogCSAqIHNwaW5sb2NrLCB2aWEgaXJwb3J0X3dyaXRlX3dha2V1cCgpLCBvciBmcm9tIG5vbi1pbnRlcnJ1cHQgd2l0aG91dAogCSAqIHNwaW5sb2NrIChmcm9tIHRoZSB0YXNrIHRpbWVyKS4gWXVjayAhCi0JICogVGhpcyBpcyB1Z2x5LCBhbmQgdW5zYWZlIGlzIHRoZSBzcGlubG9jayBpcyBub3QgYWxyZWFkeSBhcXVpcmVkLgorCSAqIFRoaXMgaXMgdWdseSwgYW5kIHVuc2FmZSBpcyB0aGUgc3BpbmxvY2sgaXMgbm90IGFscmVhZHkgYWNxdWlyZWQuCiAJICogVGhpcyB3aWxsIGJlIGZpeGVkIHdoZW4gaXJkYS10YXNrIGdldCByZXdyaXR0ZW4uCiAJICogSmVhbiBJSSAqLwogCWlmICghc3Bpbl9pc19sb2NrZWQoJnNlbGYtPmxvY2spKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL25zYy1pcmNjLmMgYi9kcml2ZXJzL25ldC9pcmRhL25zYy1pcmNjLmMKaW5kZXggY2M3ZmY4Zi4uY2I2MmYyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXJkYS9uc2MtaXJjYy5jCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvbnNjLWlyY2MuYwpAQCAtMTE1LDggKzExNSwxMiBAQAogCS8qIENvbnRyaWJ1dGVkIGJ5IEphbiBGcmV5IC0gSUJNIEEzMC9BMzEgKi8KIAl7ICJQQzg3Mzl4IiwgeyAweDJlLCAweDRlLCAweDAgfSwgMHgyMCwgMHhlYSwgMHhmZiwgCiAJICBuc2NfaXJjY19wcm9iZV8zOXgsIG5zY19pcmNjX2luaXRfMzl4IH0sCi0JeyAiSUJNIiwgeyAweDJlLCAweDRlLCAweDAgfSwgMHgyMCwgMHhmNCwgMHhmZiwKLSAJICBuc2NfaXJjY19wcm9iZV8zOXgsIG5zY19pcmNjX2luaXRfMzl4IH0sCisJLyogSUJNIFRoaW5rUGFkcyB1c2luZyBQQzg3Mzh4IChUNjAvWDYwL1o2MCkgKi8KKwl7ICJJQk0tUEM4NzM4eCIsIHsgMHgyZSwgMHg0ZSwgMHgwIH0sIDB4MjAsIDB4ZjQsIDB4ZmYsCisJICBuc2NfaXJjY19wcm9iZV8zOXgsIG5zY19pcmNjX2luaXRfMzl4IH0sCisJLyogSUJNIFRoaW5rUGFkcyB1c2luZyBQQzgzOTRUIChUNDMvUjUyLz8pICovCisJeyAiSUJNLVBDODM5NFQiLCB7IDB4MmUsIDB4NGUsIDB4MCB9LCAweDIwLCAweGY5LCAweGZmLAorCSAgbnNjX2lyY2NfcHJvYmVfMzl4LCBuc2NfaXJjY19pbml0XzM5eCB9LAogCXsgTlVMTCB9CiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wY21jaWEvc21jOTFjOTJfY3MuYyBiL2RyaXZlcnMvbmV0L3BjbWNpYS9zbWM5MWM5Ml9jcy5jCmluZGV4IGU3NGJmNTAuLmE3M2Q1NDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BjbWNpYS9zbWM5MWM5Ml9jcy5jCisrKyBiL2RyaXZlcnMvbmV0L3BjbWNpYS9zbWM5MWM5Ml9jcy5jCkBAIC0xODgzLDcgKzE4ODMsNyBAQAogICAgIC8qIFNldCB0aGUgV2luZG93IDEgY29udHJvbCwgY29uZmlndXJhdGlvbiBhbmQgc3RhdGlvbiBhZGRyIHJlZ2lzdGVycy4KICAgICAgICBObyBwb2ludCBpbiB3cml0aW5nIHRoZSBJL08gYmFzZSByZWdpc3RlciA7LT4gKi8KICAgICBTTUNfU0VMRUNUX0JBTksoMSk7Ci0gICAgLyogQXV0b21hdGljYWxseSByZWxlYXNlIHN1Y2Nlc2Z1bGx5IHRyYW5zbWl0dGVkIHBhY2tldHMsCisgICAgLyogQXV0b21hdGljYWxseSByZWxlYXNlIHN1Y2Nlc3NmdWxseSB0cmFuc21pdHRlZCBwYWNrZXRzLAogICAgICAgIEFjY2VwdCBsaW5rIGVycm9ycywgY291bnRlciBhbmQgVHggZXJyb3IgaW50ZXJydXB0cy4gKi8KICAgICBvdXR3KENUTF9BVVRPX1JFTEVBU0UgfCBDVExfVEVfRU5BQkxFIHwgQ1RMX0NSX0VOQUJMRSwKIAkgaW9hZGRyICsgQ09OVFJPTCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wcHBfZ2VuZXJpYy5jIGIvZHJpdmVycy9uZXQvcHBwX2dlbmVyaWMuYwppbmRleCAwMWNkOGVjLi5kNjQzYTA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9wcHBfZ2VuZXJpYy5jCisrKyBiL2RyaXZlcnMvbmV0L3BwcF9nZW5lcmljLmMKQEAgLTI1NzgsOCArMjU3OCw3IEBACiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBjaCwgJm5ld19jaGFubmVscywgbGlzdCkgewogCQlpZiAocGNoLT5maWxlLmluZGV4ID09IHVuaXQpIHsKLQkJCWxpc3RfZGVsKCZwY2gtPmxpc3QpOwotCQkJbGlzdF9hZGQoJnBjaC0+bGlzdCwgJmFsbF9jaGFubmVscyk7CisJCQlsaXN0X21vdmUoJnBjaC0+bGlzdCwgJmFsbF9jaGFubmVscyk7CiAJCQlyZXR1cm4gcGNoOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3VuM2xhbmNlLmMgYi9kcml2ZXJzL25ldC9zdW4zbGFuY2UuYwppbmRleCBkNGMwMDAyLi5hMmZhZDUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zdW4zbGFuY2UuYworKysgYi9kcml2ZXJzL25ldC9zdW4zbGFuY2UuYwpAQCAtNTUsNyArNTUsNyBAQAogLyogc3VuMy82MCBhZGRyL2lycSBmb3IgdGhlIGxhbmNlIGNoaXAuICBJZiB5b3VyIHN1biBpcyBkaWZmZXJlbnQsCiAgICBjaGFuZ2UgdGhpcy4gKi8KICNkZWZpbmUgTEFOQ0VfT0JJTyAweDEyMDAwMAotI2RlZmluZSBMQU5DRV9JUlEgSVJRMworI2RlZmluZSBMQU5DRV9JUlEgSVJRX0FVVE9fMwogCiAvKiBEZWJ1ZyBsZXZlbDoKICAqICAwID0gc2lsZW50LCBwcmludCBvbmx5IHNlcmlvdXMgZXJyb3JzCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vc2RsYS5jIGIvZHJpdmVycy9uZXQvd2FuL3NkbGEuYwppbmRleCAyMmU3OTQwLi43NjI4YzJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93YW4vc2RsYS5jCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9zZGxhLmMKQEAgLTYwLDkgKzYwLDkgQEAKIAogc3RhdGljIGNvbnN0IGNoYXIqIHZlcnNpb24gPSAiU0RMQSBkcml2ZXIgdjAuMzAsIDEyIFNlcCAxOTk2LCBtaWtlLm1jbGFnYW5AbGludXgub3JnIjsKIAotc3RhdGljIHVuc2lnbmVkIGludCB2YWxpZF9wb3J0W10gX19pbml0ZGF0YSA9IHsgMHgyNTAsIDB4MjcwLCAweDI4MCwgMHgzMDAsIDB4MzUwLCAweDM2MCwgMHgzODAsIDB4MzkwfTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdmFsaWRfcG9ydFtdID0geyAweDI1MCwgMHgyNzAsIDB4MjgwLCAweDMwMCwgMHgzNTAsIDB4MzYwLCAweDM4MCwgMHgzOTB9OwogCi1zdGF0aWMgdW5zaWduZWQgaW50IHZhbGlkX21lbVtdICBfX2luaXRkYXRhID0geworc3RhdGljIHVuc2lnbmVkIGludCB2YWxpZF9tZW1bXSA9IHsKIAkJCQkgICAgMHhBMDAwMCwgMHhBMjAwMCwgMHhBNDAwMCwgMHhBNjAwMCwgMHhBODAwMCwgMHhBQTAwMCwgMHhBQzAwMCwgMHhBRTAwMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEIwMDAwLCAweEIyMDAwLCAweEI0MDAwLCAweEI2MDAwLCAweEI4MDAwLCAweEJBMDAwLCAweEJDMDAwLCAweEJFMDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhDMDAwMCwgMHhDMjAwMCwgMHhDNDAwMCwgMHhDNjAwMCwgMHhDODAwMCwgMHhDQTAwMCwgMHhDQzAwMCwgMHhDRTAwMCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JjbTQzeHgvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JjbTQzeHgvS2NvbmZpZwppbmRleCAyNWVhNDc0Li41MzM5OTNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iY200M3h4L0tjb25maWcKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYmNtNDN4eC9LY29uZmlnCkBAIC0yLDYgKzIsNyBAQAogCXRyaXN0YXRlICJCcm9hZGNvbSBCQ000M3h4IHdpcmVsZXNzIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBQQ0kgJiYgSUVFRTgwMjExICYmIElFRUU4MDIxMV9TT0ZUTUFDICYmIE5FVF9SQURJTyAmJiBFWFBFUklNRU5UQUwKIAlzZWxlY3QgRldfTE9BREVSCisJc2VsZWN0IEhXX1JBTkRPTQogCS0tLWhlbHAtLS0KIAkgIFRoaXMgaXMgYW4gZXhwZXJpbWVudGFsIGRyaXZlciBmb3IgdGhlIEJyb2FkY29tIDQzeHggd2lyZWxlc3MgY2hpcCwKIAkgIGZvdW5kIGluIHRoZSBBcHBsZSBBaXJwb3J0IEV4dHJlbWUgYW5kIHZhcmlvdXMgb3RoZXIgZGV2aWNlcy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JjbTQzeHgvYmNtNDN4eC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYmNtNDN4eC9iY200M3h4LmgKaW5kZXggZDhmOTE3Yy4uMTdhNTY4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYmNtNDN4eC9iY200M3h4LmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYmNtNDN4eC9iY200M3h4LmgKQEAgLTEsNiArMSw3IEBACiAjaWZuZGVmIEJDTTQzeHhfSF8KICNkZWZpbmUgQkNNNDN4eF9IXwogCisjaW5jbHVkZSA8bGludXgvaHdfcmFuZG9tLmg+CiAjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CkBAIC04Miw2ICs4Myw3IEBACiAjZGVmaW5lIEJDTTQzeHhfTU1JT19UU0ZfMQkJMHg2MzQgLyogY29yZSByZXYgPCAzIG9ubHkgKi8KICNkZWZpbmUgQkNNNDN4eF9NTUlPX1RTRl8yCQkweDYzNiAvKiBjb3JlIHJldiA8IDMgb25seSAqLwogI2RlZmluZSBCQ000M3h4X01NSU9fVFNGXzMJCTB4NjM4IC8qIGNvcmUgcmV2IDwgMyBvbmx5ICovCisjZGVmaW5lIEJDTTQzeHhfTU1JT19STkcJCTB4NjVBCiAjZGVmaW5lIEJDTTQzeHhfTU1JT19QT1dFUlVQX0RFTEFZCTB4NkE4CiAKIC8qIFNQUk9NIG9mZnNldHMuICovCkBAIC03NTAsNiArNzUyLDEwIEBACiAJY29uc3Qgc3RydWN0IGZpcm13YXJlICppbml0dmFsczA7CiAJY29uc3Qgc3RydWN0IGZpcm13YXJlICppbml0dmFsczE7CiAKKwkvKiBSYW5kb20gTnVtYmVyIEdlbmVyYXRvci4gKi8KKwlzdHJ1Y3QgaHdybmcgcm5nOworCWNoYXIgcm5nX25hbWVbMjAgKyAxXTsKKwogCS8qIERlYnVnZ2luZyBzdHVmZiBmb2xsb3dzLiAqLwogI2lmZGVmIENPTkZJR19CQ000M1hYX0RFQlVHCiAJc3RydWN0IGJjbTQzeHhfZGZzZW50cnkgKmRmc2VudHJ5OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYmNtNDN4eC9iY200M3h4X21haW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JjbTQzeHgvYmNtNDN4eF9tYWluLmMKaW5kZXggMDg1ZDc4NS4uMjdiY2Y0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYmNtNDN4eC9iY200M3h4X21haW4uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iY200M3h4L2JjbTQzeHhfbWFpbi5jCkBAIC0zMjM3LDYgKzMyMzcsMzkgQEAKIAliY200M3h4X2NsZWFyX2tleXMoYmNtKTsKIH0KIAorc3RhdGljIGludCBiY200M3h4X3JuZ19yZWFkKHN0cnVjdCBod3JuZyAqcm5nLCB1MzIgKmRhdGEpCit7CisJc3RydWN0IGJjbTQzeHhfcHJpdmF0ZSAqYmNtID0gKHN0cnVjdCBiY200M3h4X3ByaXZhdGUgKilybmctPnByaXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWJjbTQzeHhfbG9ja19pcnFvbmx5KGJjbSwgZmxhZ3MpOworCSpkYXRhID0gYmNtNDN4eF9yZWFkMTYoYmNtLCBCQ000M3h4X01NSU9fUk5HKTsKKwliY200M3h4X3VubG9ja19pcnFvbmx5KGJjbSwgZmxhZ3MpOworCisJcmV0dXJuIChzaXplb2YodTE2KSk7Cit9CisKK3N0YXRpYyB2b2lkIGJjbTQzeHhfcm5nX2V4aXQoc3RydWN0IGJjbTQzeHhfcHJpdmF0ZSAqYmNtKQoreworCWh3cm5nX3VucmVnaXN0ZXIoJmJjbS0+cm5nKTsKK30KKworc3RhdGljIGludCBiY200M3h4X3JuZ19pbml0KHN0cnVjdCBiY200M3h4X3ByaXZhdGUgKmJjbSkKK3sKKwlpbnQgZXJyOworCisJc25wcmludGYoYmNtLT5ybmdfbmFtZSwgQVJSQVlfU0laRShiY20tPnJuZ19uYW1lKSwKKwkJICIlc18lcyIsIEtCVUlMRF9NT0ROQU1FLCBiY20tPm5ldF9kZXYtPm5hbWUpOworCWJjbS0+cm5nLm5hbWUgPSBiY20tPnJuZ19uYW1lOworCWJjbS0+cm5nLmRhdGFfcmVhZCA9IGJjbTQzeHhfcm5nX3JlYWQ7CisJYmNtLT5ybmcucHJpdiA9ICh1bnNpZ25lZCBsb25nKWJjbTsKKwllcnIgPSBod3JuZ19yZWdpc3RlcigmYmNtLT5ybmcpOworCWlmIChlcnIpCisJCXByaW50ayhLRVJOX0VSUiBQRlggIlJORyBpbml0IGZhaWxlZCAoJWQpXG4iLCBlcnIpOworCisJcmV0dXJuIGVycjsKK30KKwogLyogVGhpcyBpcyB0aGUgb3Bwb3NpdGUgb2YgYmNtNDN4eF9pbml0X2JvYXJkKCkgKi8KIHN0YXRpYyB2b2lkIGJjbTQzeHhfZnJlZV9ib2FyZChzdHJ1Y3QgYmNtNDN4eF9wcml2YXRlICpiY20pCiB7CkBAIC0zMjQ4LDYgKzMyODEsNyBAQAogCiAJYmNtNDN4eF9zZXRfc3RhdHVzKGJjbSwgQkNNNDN4eF9TVEFUX1NIVVRUSU5HRE9XTik7CiAKKwliY200M3h4X3JuZ19leGl0KGJjbSk7CiAJZm9yIChpID0gMDsgaSA8IEJDTTQzeHhfTUFYXzgwMjExX0NPUkVTOyBpKyspIHsKIAkJaWYgKCFiY20tPmNvcmVfODAyMTFbaV0uYXZhaWxhYmxlKQogCQkJY29udGludWU7CkBAIC0zMzI1LDYgKzMzNTksOSBAQAogCQliY200M3h4X3N3aXRjaF9jb3JlKGJjbSwgJmJjbS0+Y29yZV84MDIxMVswXSk7CiAJCWJjbTQzeHhfbWFjX2VuYWJsZShiY20pOwogCX0KKwllcnIgPSBiY200M3h4X3JuZ19pbml0KGJjbSk7CisJaWYgKGVycikKKwkJZ290byBlcnJfODAyMTFfdW53aW5kOwogCWJjbTQzeHhfbWFjZmlsdGVyX2NsZWFyKGJjbSwgQkNNNDN4eF9NQUNGSUxURVJfQVNTT0MpOwogCWJjbTQzeHhfbWFjZmlsdGVyX3NldChiY20sIEJDTTQzeHhfTUFDRklMVEVSX1NFTEYsICh1OCAqKShiY20tPm5ldF9kZXYtPmRldl9hZGRyKSk7CiAJZHByaW50ayhLRVJOX0lORk8gUEZYICI4MDIxMSBjb3JlcyBpbml0aWFsaXplZFxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyMTAwLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyMTAwLmMKaW5kZXggNzIzMzVjOC4uOTRhZWIyMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MjEwMC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzIxMDAuYwpAQCAtMTQ4NSw3ICsxNDg1LDcgQEAKIAkJICoKIAkJICogU2VuZGluZyB0aGUgUFJFUEFSRV9GT1JfUE9XRVJfRE9XTiB3aWxsIHJlc3RyaWN0IHRoZQogCQkgKiBoYXJkd2FyZSBmcm9tIGdvaW5nIGludG8gc3RhbmRieSBtb2RlIGFuZCB3aWxsIHRyYW5zaXRpb24KLQkJICogb3V0IG9mIEQwLXN0YW5keSBpZiBpdCBpcyBhbHJlYWR5IGluIHRoYXQgc3RhdGUuCisJCSAqIG91dCBvZiBEMC1zdGFuZGJ5IGlmIGl0IGlzIGFscmVhZHkgaW4gdGhhdCBzdGF0ZS4KIAkJICoKIAkJICogU1RBVFVTX1BSRVBBUkVfUE9XRVJfRE9XTl9DT01QTEVURSB3aWxsIGJlIHNlbnQgYnkgdGhlCiAJCSAqIGRyaXZlciB1cG9uIGNvbXBsZXRpb24uICBPbmNlIHJlY2VpdmVkLCB0aGUgZHJpdmVyIGNhbgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9vcHJvZmlsZS9idWZmZXJfc3luYy5jIGIvZHJpdmVycy9vcHJvZmlsZS9idWZmZXJfc3luYy5jCmluZGV4IGIyZThlNDkuLjQzZTUyMWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvb3Byb2ZpbGUvYnVmZmVyX3N5bmMuYworKysgYi9kcml2ZXJzL29wcm9maWxlL2J1ZmZlcl9zeW5jLmMKQEAgLTEwOCwxMCArMTA4LDEwIEBACiAJCXJldHVybiAwOwogCiAJLyogRklYTUU6IHNob3VsZCB3ZSBwcm9jZXNzIGFsbCBDUFUgYnVmZmVycyA/ICovCi0JZG93bigmYnVmZmVyX3NlbSk7CisJbXV0ZXhfbG9jaygmYnVmZmVyX211dGV4KTsKIAlhZGRfZXZlbnRfZW50cnkoRVNDQVBFX0NPREUpOwogCWFkZF9ldmVudF9lbnRyeShNT0RVTEVfTE9BREVEX0NPREUpOwotCXVwKCZidWZmZXJfc2VtKTsKKwltdXRleF91bmxvY2soJmJ1ZmZlcl9tdXRleCk7CiAjZW5kaWYKIAlyZXR1cm4gMDsKIH0KQEAgLTUwMSw3ICs1MDEsNyBAQAogCXN5bmNfYnVmZmVyX3N0YXRlIHN0YXRlID0gc2JfYnVmZmVyX3N0YXJ0OwogCXVuc2lnbmVkIGxvbmcgYXZhaWxhYmxlOwogCi0JZG93bigmYnVmZmVyX3NlbSk7CisJbXV0ZXhfbG9jaygmYnVmZmVyX211dGV4KTsKICAKIAlhZGRfY3B1X3N3aXRjaChjcHUpOwogCkBAIC01NTAsNSArNTUwLDUgQEAKIAogCW1hcmtfZG9uZShjcHUpOwogCi0JdXAoJmJ1ZmZlcl9zZW0pOworCW11dGV4X3VubG9jaygmYnVmZmVyX211dGV4KTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvb3Byb2ZpbGUvZXZlbnRfYnVmZmVyLmMgYi9kcml2ZXJzL29wcm9maWxlL2V2ZW50X2J1ZmZlci5jCmluZGV4IGI4MDMxOGYuLjA0ZDY0MTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvb3Byb2ZpbGUvZXZlbnRfYnVmZmVyLmMKKysrIGIvZHJpdmVycy9vcHJvZmlsZS9ldmVudF9idWZmZXIuYwpAQCAtMjQsNyArMjQsNyBAQAogI2luY2x1ZGUgImV2ZW50X2J1ZmZlci5oIgogI2luY2x1ZGUgIm9wcm9maWxlX3N0YXRzLmgiCiAKLURFQ0xBUkVfTVVURVgoYnVmZmVyX3NlbSk7CitERUZJTkVfTVVURVgoYnVmZmVyX211dGV4KTsKICAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGJ1ZmZlcl9vcGVuZWQ7CiBzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQoYnVmZmVyX3dhaXQpOwpAQCAtMzIsNyArMzIsNyBAQAogc3RhdGljIHVuc2lnbmVkIGxvbmcgYnVmZmVyX3NpemU7CiBzdGF0aWMgdW5zaWduZWQgbG9uZyBidWZmZXJfd2F0ZXJzaGVkOwogc3RhdGljIHNpemVfdCBidWZmZXJfcG9zOwotLyogYXRvbWljX3QgYmVjYXVzZSB3YWl0X2V2ZW50IGNoZWNrcyBpdCBvdXRzaWRlIG9mIGJ1ZmZlcl9zZW0gKi8KKy8qIGF0b21pY190IGJlY2F1c2Ugd2FpdF9ldmVudCBjaGVja3MgaXQgb3V0c2lkZSBvZiBidWZmZXJfbXV0ZXggKi8KIHN0YXRpYyBhdG9taWNfdCBidWZmZXJfcmVhZHkgPSBBVE9NSUNfSU5JVCgwKTsKIAogLyogQWRkIGFuIGVudHJ5IHRvIHRoZSBldmVudCBidWZmZXIuIFdoZW4gd2UKQEAgLTYwLDEwICs2MCwxMCBAQAogICovCiB2b2lkIHdha2VfdXBfYnVmZmVyX3dhaXRlcih2b2lkKQogewotCWRvd24oJmJ1ZmZlcl9zZW0pOworCW11dGV4X2xvY2soJmJ1ZmZlcl9tdXRleCk7CiAJYXRvbWljX3NldCgmYnVmZmVyX3JlYWR5LCAxKTsKIAl3YWtlX3VwKCZidWZmZXJfd2FpdCk7Ci0JdXAoJmJ1ZmZlcl9zZW0pOworCW11dGV4X3VubG9jaygmYnVmZmVyX211dGV4KTsKIH0KIAogIApAQCAtMTYyLDcgKzE2Miw3IEBACiAJaWYgKCFhdG9taWNfcmVhZCgmYnVmZmVyX3JlYWR5KSkKIAkJcmV0dXJuIC1FQUdBSU47CiAKLQlkb3duKCZidWZmZXJfc2VtKTsKKwltdXRleF9sb2NrKCZidWZmZXJfbXV0ZXgpOwogCiAJYXRvbWljX3NldCgmYnVmZmVyX3JlYWR5LCAwKTsKIApAQCAtMTc3LDcgKzE3Nyw3IEBACiAJYnVmZmVyX3BvcyA9IDA7CiAgCiBvdXQ6Ci0JdXAoJmJ1ZmZlcl9zZW0pOworCW11dGV4X3VubG9jaygmYnVmZmVyX211dGV4KTsKIAlyZXR1cm4gcmV0dmFsOwogfQogIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9vcHJvZmlsZS9ldmVudF9idWZmZXIuaCBiL2RyaXZlcnMvb3Byb2ZpbGUvZXZlbnRfYnVmZmVyLmgKaW5kZXggMDE4MDIzNi4uOTI0MTYyNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9vcHJvZmlsZS9ldmVudF9idWZmZXIuaAorKysgYi9kcml2ZXJzL29wcm9maWxlL2V2ZW50X2J1ZmZlci5oCkBAIC0xMSw3ICsxMSw3IEBACiAjZGVmaW5lIEVWRU5UX0JVRkZFUl9ICiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPiAKLSNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisjaW5jbHVkZSA8YXNtL211dGV4Lmg+CiAgCiBpbnQgYWxsb2NfZXZlbnRfYnVmZmVyKHZvaWQpOwogCkBAIC00Niw2ICs0Niw2IEBACiAvKiBtdXRleCBiZXR3ZWVuIHN5bmNfY3B1X2J1ZmZlcnMoKSBhbmQgdGhlCiAgKiBmaWxlIHJlYWRpbmcgY29kZS4KICAqLwotZXh0ZXJuIHN0cnVjdCBzZW1hcGhvcmUgYnVmZmVyX3NlbTsKK2V4dGVybiBzdHJ1Y3QgbXV0ZXggYnVmZmVyX211dGV4OwogIAogI2VuZGlmIC8qIEVWRU5UX0JVRkZFUl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL29wcm9maWxlL29wcm9mLmMgYi9kcml2ZXJzL29wcm9maWxlL29wcm9mLmMKaW5kZXggYjNmMWNkNi4uZTUxNjJhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9vcHJvZmlsZS9vcHJvZi5jCisrKyBiL2RyaXZlcnMvb3Byb2ZpbGUvb3Byb2YuYwpAQCAtMTIsNyArMTIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9vcHJvZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+Ci0jaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgorI2luY2x1ZGUgPGFzbS9tdXRleC5oPgogCiAjaW5jbHVkZSAib3Byb2YuaCIKICNpbmNsdWRlICJldmVudF9idWZmZXIuaCIKQEAgLTI1LDcgKzI1LDcgQEAKIHVuc2lnbmVkIGxvbmcgb3Byb2ZpbGVfc3RhcnRlZDsKIHVuc2lnbmVkIGxvbmcgYmFja3RyYWNlX2RlcHRoOwogc3RhdGljIHVuc2lnbmVkIGxvbmcgaXNfc2V0dXA7Ci1zdGF0aWMgREVDTEFSRV9NVVRFWChzdGFydF9zZW0pOworc3RhdGljIERFRklORV9NVVRFWChzdGFydF9tdXRleCk7CiAKIC8qIHRpbWVyCiAgICAwIC0gdXNlIHBlcmZvcm1hbmNlIG1vbml0b3JpbmcgaGFyZHdhcmUgaWYgYXZhaWxhYmxlCkBAIC0zNyw3ICszNyw3IEBACiB7CiAJaW50IGVycjsKICAKLQlkb3duKCZzdGFydF9zZW0pOworCW11dGV4X2xvY2soJnN0YXJ0X211dGV4KTsKIAogCWlmICgoZXJyID0gYWxsb2NfY3B1X2J1ZmZlcnMoKSkpCiAJCWdvdG8gb3V0OwpAQCAtNTcsNyArNTcsNyBAQAogCQlnb3RvIG91dDM7CiAKIAlpc19zZXR1cCA9IDE7Ci0JdXAoJnN0YXJ0X3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZzdGFydF9tdXRleCk7CiAJcmV0dXJuIDA7CiAgCiBvdXQzOgpAQCAtNjgsNyArNjgsNyBAQAogb3V0MToKIAlmcmVlX2NwdV9idWZmZXJzKCk7CiBvdXQ6Ci0JdXAoJnN0YXJ0X3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZzdGFydF9tdXRleCk7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtNzgsNyArNzgsNyBAQAogewogCWludCBlcnIgPSAtRUlOVkFMOwogIAotCWRvd24oJnN0YXJ0X3NlbSk7CisJbXV0ZXhfbG9jaygmc3RhcnRfbXV0ZXgpOwogIAogCWlmICghaXNfc2V0dXApCiAJCWdvdG8gb3V0OwpAQCAtOTUsNyArOTUsNyBAQAogCiAJb3Byb2ZpbGVfc3RhcnRlZCA9IDE7CiBvdXQ6Ci0JdXAoJnN0YXJ0X3NlbSk7IAorCW11dGV4X3VubG9jaygmc3RhcnRfbXV0ZXgpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTEwMyw3ICsxMDMsNyBAQAogLyogZWNobyAwPi9kZXYvb3Byb2ZpbGUvZW5hYmxlICovCiB2b2lkIG9wcm9maWxlX3N0b3Aodm9pZCkKIHsKLQlkb3duKCZzdGFydF9zZW0pOworCW11dGV4X2xvY2soJnN0YXJ0X211dGV4KTsKIAlpZiAoIW9wcm9maWxlX3N0YXJ0ZWQpCiAJCWdvdG8gb3V0OwogCW9wcm9maWxlX29wcy5zdG9wKCk7CkBAIC0xMTEsMjAgKzExMSwyMCBAQAogCS8qIHdha2UgdXAgdGhlIGRhZW1vbiB0byByZWFkIHdoYXQgcmVtYWlucyAqLwogCXdha2VfdXBfYnVmZmVyX3dhaXRlcigpOwogb3V0OgotCXVwKCZzdGFydF9zZW0pOworCW11dGV4X3VubG9jaygmc3RhcnRfbXV0ZXgpOwogfQogCiAKIHZvaWQgb3Byb2ZpbGVfc2h1dGRvd24odm9pZCkKIHsKLQlkb3duKCZzdGFydF9zZW0pOworCW11dGV4X2xvY2soJnN0YXJ0X211dGV4KTsKIAlzeW5jX3N0b3AoKTsKIAlpZiAob3Byb2ZpbGVfb3BzLnNodXRkb3duKQogCQlvcHJvZmlsZV9vcHMuc2h1dGRvd24oKTsKIAlpc19zZXR1cCA9IDA7CiAJZnJlZV9ldmVudF9idWZmZXIoKTsKIAlmcmVlX2NwdV9idWZmZXJzKCk7Ci0JdXAoJnN0YXJ0X3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZzdGFydF9tdXRleCk7CiB9CiAKIApAQCAtMTMyLDcgKzEzMiw3IEBACiB7CiAJaW50IGVyciA9IDA7CiAKLQlkb3duKCZzdGFydF9zZW0pOworCW11dGV4X2xvY2soJnN0YXJ0X211dGV4KTsKIAogCWlmIChvcHJvZmlsZV9zdGFydGVkKSB7CiAJCWVyciA9IC1FQlVTWTsKQEAgLTE0Nyw3ICsxNDcsNyBAQAogCWJhY2t0cmFjZV9kZXB0aCA9IHZhbDsKIAogb3V0OgotCXVwKCZzdGFydF9zZW0pOworCW11dGV4X3VubG9jaygmc3RhcnRfbXV0ZXgpOwogCXJldHVybiBlcnI7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGFycG9ydC9LY29uZmlnIGIvZHJpdmVycy9wYXJwb3J0L0tjb25maWcKaW5kZXggNGQ4ZGMyNy4uYzdmYTI4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wYXJwb3J0L0tjb25maWcKKysrIGIvZHJpdmVycy9wYXJwb3J0L0tjb25maWcKQEAgLTEzNiw2ICsxMzYsMTggQEAKIAkgIGZvdW5kIG9uIG1hbnkgU3VuIG1hY2hpbmVzLiBOb3RlIHRoYXQgbWFueSBvZiB0aGUgbmV3ZXIgVWx0cmFzCiAJICBhY3R1YWxseSBoYXZlIHBjIHN0eWxlIGhhcmR3YXJlIGluc3RlYWQuCiAKK2NvbmZpZyBQQVJQT1JUX0FYODg3OTYKKwl0cmlzdGF0ZSAiQVg4ODc5NiBQYXJhbGxlbCBQb3J0IgorCWRlcGVuZHMgb24gUEFSUE9SVAorCXNlbGVjdCBQQVJQT1JUX05PVF9QQworCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IG5lZWQgc3VwcG9ydCBmb3IgdGhlIHBhcmFsbGVsIHBvcnQgaGFyZHdhcmUgb24KKwkgIHRoZSBBWDg4Nzk2IG5ldHdvcmsgY29udHJvbGxlciBjaGlwLiBUaGlzIGNvZGUgaXMgYWxzbyBhdmFpbGFibGUKKwkgIGFzIGEgbW9kdWxlIChzYXkgTSksIGNhbGxlZCBwYXJwb3J0X2F4ODg3OTYuCisKKwkgIFRoZSBkcml2ZXIgaXMgbm90IGRlcGVuZGFudCBvbiB0aGUgQVg4ODc5NiBuZXR3b3JrIGRyaXZlciwgYW5kCisJICBzaG91bGQgbm90IGludGVyZmVyZSB3aXRoIHRoZSBuZXR3b3JraW5nIGZ1bmN0aW9ucyBvZiB0aGUgY2hpcC4KKwogY29uZmlnIFBBUlBPUlRfMTI4NAogCWJvb2wgIklFRUUgMTI4NCB0cmFuc2ZlciBtb2RlcyIKIAlkZXBlbmRzIG9uIFBBUlBPUlQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGFycG9ydC9NYWtlZmlsZSBiL2RyaXZlcnMvcGFycG9ydC9NYWtlZmlsZQppbmRleCBhMTlkZTM1Li42OTZiOGQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BhcnBvcnQvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9wYXJwb3J0L01ha2VmaWxlCkBAIC0xNyw0ICsxNyw1IEBACiBvYmotJChDT05GSUdfUEFSUE9SVF9BVEFSSSkJKz0gcGFycG9ydF9hdGFyaS5vCiBvYmotJChDT05GSUdfUEFSUE9SVF9TVU5CUFApCSs9IHBhcnBvcnRfc3VuYnBwLm8KIG9iai0kKENPTkZJR19QQVJQT1JUX0dTQykJKz0gcGFycG9ydF9nc2Mubwotb2JqLSQoQ09ORklHX1BBUlBPUlRfSVAzMikJKz0gcGFycG9ydF9pcDMyLm8KK29iai0kKENPTkZJR19QQVJQT1JUX0FYODg3OTYpCSs9IHBhcnBvcnRfYXg4ODc5Ni5vCitvYmotJChDT05GSUdfUEFSUE9SVF9JUDMyKQkrPSBwYXJwb3J0X2lwMzIubwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGFycG9ydC9kYWlzeS5jIGIvZHJpdmVycy9wYXJwb3J0L2RhaXN5LmMKaW5kZXggOWVlNjczMi4uZmQ0MWUyOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wYXJwb3J0L2RhaXN5LmMKKysrIGIvZHJpdmVycy9wYXJwb3J0L2RhaXN5LmMKQEAgLTI4Myw3ICsyODMsNyBAQAogICoKICAqCVRoaXMgdHJpZXMgdG8gbG9jYXRlIGEgZGV2aWNlIG9uIHRoZSBnaXZlbiBwYXJhbGxlbCBwb3J0LAogICoJbXVsdGlwbGV4b3IgcG9ydCBhbmQgZGFpc3kgY2hhaW4gYWRkcmVzcywgYW5kIHJldHVybnMgaXRzCi0gKglkZXZpY2UgbnVtYmVyIG9yIC1OWElPIGlmIG5vIGRldmljZSB3aXRoIHRob3NlIGNvb3JkaW5hdGVzCisgKglkZXZpY2UgbnVtYmVyIG9yICUtRU5YSU8gaWYgbm8gZGV2aWNlIHdpdGggdGhvc2UgY29vcmRpbmF0ZXMKICAqCWV4aXN0cy4KICAqKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wYXJwb3J0L3BhcnBvcnRfYXg4ODc5Ni5jIGIvZHJpdmVycy9wYXJwb3J0L3BhcnBvcnRfYXg4ODc5Ni5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiYWE3MTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3BhcnBvcnQvcGFycG9ydF9heDg4Nzk2LmMKQEAgLTAsMCArMSw0NDMgQEAKKy8qIGxpbnV4L2RyaXZlcnMvcGFycG9ydC9wYXJwb3J0X2F4ODg3OTYuYworICoKKyAqIChjKSAyMDA1LDIwMDYgU2ltdGVjIEVsZWN0cm9uaWNzCisgKglCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGFycG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKKyNkZWZpbmUgQVhfU1BSX0JVU1kJCSgxPDw3KQorI2RlZmluZSBBWF9TUFJfQUNLCQkoMTw8NikKKyNkZWZpbmUgQVhfU1BSX1BFCQkoMTw8NSkKKyNkZWZpbmUgQVhfU1BSX1NMQ1QJCSgxPDw0KQorI2RlZmluZSBBWF9TUFJfRVJSCQkoMTw8MykKKworI2RlZmluZSBBWF9DUFJfbkRPRQkJKDE8PDUpCisjZGVmaW5lIEFYX0NQUl9TTENUSU4JCSgxPDwzKQorI2RlZmluZSBBWF9DUFJfbklOSVQJCSgxPDwyKQorI2RlZmluZSBBWF9DUFJfQVRGRAkJKDE8PDEpCisjZGVmaW5lIEFYX0NQUl9TVFJCCQkoMTw8MCkKKworc3RydWN0IGF4X2RydmRhdGEgeworCXN0cnVjdCBwYXJwb3J0CQkqcGFycG9ydDsKKwlzdHJ1Y3QgcGFycG9ydF9zdGF0ZQkgc3VzcGVuZDsKKworCXN0cnVjdCBkZXZpY2UJCSpkZXY7CisJc3RydWN0IHJlc291cmNlCQkqaW87CisKKwl1bnNpZ25lZCBjaGFyCQkgaXJxX2VuYWJsZWQ7CisKKwl2b2lkIF9faW9tZW0JCSpiYXNlOworCXZvaWQgX19pb21lbQkJKnNwcF9kYXRhOworCXZvaWQgX19pb21lbQkJKnNwcF9zcHI7CisJdm9pZCBfX2lvbWVtCQkqc3BwX2NwcjsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGF4X2RydmRhdGEgKnBwX3RvX2RydihzdHJ1Y3QgcGFycG9ydCAqcCkKK3sKKwlyZXR1cm4gcC0+cHJpdmF0ZV9kYXRhOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhcgorcGFycG9ydF9heDg4Nzk2X3JlYWRfZGF0YShzdHJ1Y3QgcGFycG9ydCAqcCkKK3sKKwlzdHJ1Y3QgYXhfZHJ2ZGF0YSAqZGQgPSBwcF90b19kcnYocCk7CisKKwlyZXR1cm4gcmVhZGIoZGQtPnNwcF9kYXRhKTsKK30KKworc3RhdGljIHZvaWQKK3BhcnBvcnRfYXg4ODc5Nl93cml0ZV9kYXRhKHN0cnVjdCBwYXJwb3J0ICpwLCB1bnNpZ25lZCBjaGFyIGRhdGEpCit7CisJc3RydWN0IGF4X2RydmRhdGEgKmRkID0gcHBfdG9fZHJ2KHApOworCisJd3JpdGViKGRhdGEsIGRkLT5zcHBfZGF0YSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyCitwYXJwb3J0X2F4ODg3OTZfcmVhZF9jb250cm9sKHN0cnVjdCBwYXJwb3J0ICpwKQoreworCXN0cnVjdCBheF9kcnZkYXRhICpkZCA9IHBwX3RvX2RydihwKTsKKwl1bnNpZ25lZCBpbnQgY3ByID0gcmVhZGIoZGQtPnNwcF9jcHIpOworCXVuc2lnbmVkIGludCByZXQgPSAwOworCisJaWYgKCEoY3ByICYgQVhfQ1BSX1NUUkIpKQorCQlyZXQgfD0gUEFSUE9SVF9DT05UUk9MX1NUUk9CRTsKKworCWlmICghKGNwciAmIEFYX0NQUl9BVEZEKSkKKwkJcmV0IHw9IFBBUlBPUlRfQ09OVFJPTF9BVVRPRkQ7CisKKwlpZiAoY3ByICYgQVhfQ1BSX25JTklUKQorCQlyZXQgfD0gUEFSUE9SVF9DT05UUk9MX0lOSVQ7CisKKwlpZiAoIShjcHIgJiBBWF9DUFJfU0xDVElOKSkKKwkJcmV0IHw9IFBBUlBPUlRfQ09OVFJPTF9TRUxFQ1Q7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAorcGFycG9ydF9heDg4Nzk2X3dyaXRlX2NvbnRyb2woc3RydWN0IHBhcnBvcnQgKnAsIHVuc2lnbmVkIGNoYXIgY29udHJvbCkKK3sKKwlzdHJ1Y3QgYXhfZHJ2ZGF0YSAqZGQgPSBwcF90b19kcnYocCk7CisJdW5zaWduZWQgaW50IGNwciA9IHJlYWRiKGRkLT5zcHBfY3ByKTsKKworCWNwciAmPSBBWF9DUFJfbkRPRTsKKworCWlmICghKGNvbnRyb2wgJiBQQVJQT1JUX0NPTlRST0xfU1RST0JFKSkKKwkJY3ByIHw9IEFYX0NQUl9TVFJCOworCisJaWYgKCEoY29udHJvbCAmIFBBUlBPUlRfQ09OVFJPTF9BVVRPRkQpKQorCQljcHIgfD0gQVhfQ1BSX0FURkQ7CisKKwlpZiAoY29udHJvbCAmIFBBUlBPUlRfQ09OVFJPTF9JTklUKQorCQljcHIgfD0gQVhfQ1BSX25JTklUOworCisJaWYgKCEoY29udHJvbCAmIFBBUlBPUlRfQ09OVFJPTF9TRUxFQ1QpKQorCQljcHIgfD0gQVhfQ1BSX1NMQ1RJTjsKKworCWRldl9kYmcoZGQtPmRldiwgIndyaXRlX2NvbnRyb2w6IGN0cmw9JTAyeCwgY3ByPSUwMnhcbiIsIGNvbnRyb2wsIGNwcik7CisJd3JpdGViKGNwciwgZGQtPnNwcF9jcHIpOworCisJaWYgKHBhcnBvcnRfYXg4ODc5Nl9yZWFkX2NvbnRyb2wocCkgIT0gY29udHJvbCkgeworCQlkZXZfZXJyKGRkLT5kZXYsICJ3cml0ZV9jb250cm9sOiByZWFkICE9IHNldCAoJTAyeCwgJTAyeClcbiIsCisJCQlwYXJwb3J0X2F4ODg3OTZfcmVhZF9jb250cm9sKHApLCBjb250cm9sKTsKKwl9Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyCitwYXJwb3J0X2F4ODg3OTZfcmVhZF9zdGF0dXMoc3RydWN0IHBhcnBvcnQgKnApCit7CisJc3RydWN0IGF4X2RydmRhdGEgKmRkID0gcHBfdG9fZHJ2KHApOworCXVuc2lnbmVkIGludCBzdGF0dXMgPSByZWFkYihkZC0+c3BwX3Nwcik7CisJdW5zaWduZWQgaW50IHJldCA9IDA7CisKKwlpZiAoc3RhdHVzICYgQVhfU1BSX0JVU1kpCisJCXJldCB8PSBQQVJQT1JUX1NUQVRVU19CVVNZOworCisJaWYgKHN0YXR1cyAmIEFYX1NQUl9BQ0spCisJCXJldCB8PSBQQVJQT1JUX1NUQVRVU19BQ0s7CisKKwlpZiAoc3RhdHVzICYgQVhfU1BSX0VSUikKKwkJcmV0IHw9IFBBUlBPUlRfU1RBVFVTX0VSUk9SOworCisJaWYgKHN0YXR1cyAmIEFYX1NQUl9TTENUKQorCQlyZXQgfD0gUEFSUE9SVF9TVEFUVVNfU0VMRUNUOworCisJaWYgKHN0YXR1cyAmIEFYX1NQUl9QRSkKKwkJcmV0IHw9IFBBUlBPUlRfU1RBVFVTX1BBUEVST1VUOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIKK3BhcnBvcnRfYXg4ODc5Nl9mcm9iX2NvbnRyb2woc3RydWN0IHBhcnBvcnQgKnAsIHVuc2lnbmVkIGNoYXIgbWFzaywKKwkJCSAgICAgdW5zaWduZWQgY2hhciB2YWwpCit7CisJc3RydWN0IGF4X2RydmRhdGEgKmRkID0gcHBfdG9fZHJ2KHApOworCXVuc2lnbmVkIGNoYXIgb2xkID0gcGFycG9ydF9heDg4Nzk2X3JlYWRfY29udHJvbChwKTsKKworCWRldl9kYmcoZGQtPmRldiwgImZyb2I6IG1hc2s9JTAyeCwgdmFsPSUwMngsIG9sZD0lMDJ4XG4iLAorCQltYXNrLCB2YWwsIG9sZCk7CisKKwlwYXJwb3J0X2F4ODg3OTZfd3JpdGVfY29udHJvbChwLCAob2xkICYgfm1hc2spIHwgdmFsKTsKKwlyZXR1cm4gb2xkOworfQorCitzdGF0aWMgdm9pZAorcGFycG9ydF9heDg4Nzk2X2VuYWJsZV9pcnEoc3RydWN0IHBhcnBvcnQgKnApCit7CisJc3RydWN0IGF4X2RydmRhdGEgKmRkID0gcHBfdG9fZHJ2KHApOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJaWYgKCFkZC0+aXJxX2VuYWJsZWQpIHsKKwkJZW5hYmxlX2lycShwLT5pcnEpOworCQlkZC0+aXJxX2VuYWJsZWQgPSAxOworCX0KKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkCitwYXJwb3J0X2F4ODg3OTZfZGlzYWJsZV9pcnEoc3RydWN0IHBhcnBvcnQgKnApCit7CisJc3RydWN0IGF4X2RydmRhdGEgKmRkID0gcHBfdG9fZHJ2KHApOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJaWYgKGRkLT5pcnFfZW5hYmxlZCkgeworCQlkaXNhYmxlX2lycShwLT5pcnEpOworCQlkZC0+aXJxX2VuYWJsZWQgPSAwOworCX0KKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkCitwYXJwb3J0X2F4ODg3OTZfZGF0YV9mb3J3YXJkKHN0cnVjdCBwYXJwb3J0ICpwKQoreworCXN0cnVjdCBheF9kcnZkYXRhICpkZCA9IHBwX3RvX2RydihwKTsKKwl2b2lkIF9faW9tZW0gKmNwciA9IGRkLT5zcHBfY3ByOworCisJd3JpdGViKChyZWFkYihjcHIpICYgfkFYX0NQUl9uRE9FKSwgY3ByKTsKK30KKworc3RhdGljIHZvaWQKK3BhcnBvcnRfYXg4ODc5Nl9kYXRhX3JldmVyc2Uoc3RydWN0IHBhcnBvcnQgKnApCit7CisJc3RydWN0IGF4X2RydmRhdGEgKmRkID0gcHBfdG9fZHJ2KHApOworCXZvaWQgX19pb21lbSAqY3ByID0gZGQtPnNwcF9jcHI7CisKKwl3cml0ZWIocmVhZGIoY3ByKSB8IEFYX0NQUl9uRE9FLCBjcHIpOworfQorCitzdGF0aWMgdm9pZAorcGFycG9ydF9heDg4Nzk2X2luaXRfc3RhdGUoc3RydWN0IHBhcmRldmljZSAqZCwgc3RydWN0IHBhcnBvcnRfc3RhdGUgKnMpCit7CisJc3RydWN0IGF4X2RydmRhdGEgKmRkID0gcHBfdG9fZHJ2KGQtPnBvcnQpOworCisJbWVtc2V0KHMsIDAsIHNpemVvZihzdHJ1Y3QgcGFycG9ydF9zdGF0ZSkpOworCisJZGV2X2RiZyhkZC0+ZGV2LCAiaW5pdF9zdGF0ZTogJXA6IHN0YXRlPSVwXG4iLCBkLCBzKTsKKwlzLT51LmF4ODg3OTYuY3ByID0gcmVhZGIoZGQtPnNwcF9jcHIpOworfQorCitzdGF0aWMgdm9pZAorcGFycG9ydF9heDg4Nzk2X3NhdmVfc3RhdGUoc3RydWN0IHBhcnBvcnQgKnAsIHN0cnVjdCBwYXJwb3J0X3N0YXRlICpzKQoreworCXN0cnVjdCBheF9kcnZkYXRhICpkZCA9IHBwX3RvX2RydihwKTsKKworCWRldl9kYmcoZGQtPmRldiwgInNhdmVfc3RhdGU6ICVwOiBzdGF0ZT0lcFxuIiwgcCwgcyk7CisJcy0+dS5heDg4Nzk2LmNwciA9IHJlYWRiKGRkLT5zcHBfY3ByKTsKK30KKworc3RhdGljIHZvaWQKK3BhcnBvcnRfYXg4ODc5Nl9yZXN0b3JlX3N0YXRlKHN0cnVjdCBwYXJwb3J0ICpwLCBzdHJ1Y3QgcGFycG9ydF9zdGF0ZSAqcykKK3sKKwlzdHJ1Y3QgYXhfZHJ2ZGF0YSAqZGQgPSBwcF90b19kcnYocCk7CisKKwlkZXZfZGJnKGRkLT5kZXYsICJyZXN0b3JlX3N0YXRlOiAlcDogc3RhdGU9JXBcbiIsIHAsIHMpOworCXdyaXRlYihzLT51LmF4ODg3OTYuY3ByLCBkZC0+c3BwX2Nwcik7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdAorcGFycG9ydF9heDg4Nzk2X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworICAgICAgICBwYXJwb3J0X2dlbmVyaWNfaXJxKGlycSwgZGV2X2lkLCByZWdzKTsKKyAgICAgICAgcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgcGFycG9ydF9vcGVyYXRpb25zIHBhcnBvcnRfYXg4ODc5Nl9vcHMgPSB7CisJLndyaXRlX2RhdGEJPSBwYXJwb3J0X2F4ODg3OTZfd3JpdGVfZGF0YSwKKwkucmVhZF9kYXRhCT0gcGFycG9ydF9heDg4Nzk2X3JlYWRfZGF0YSwKKworCS53cml0ZV9jb250cm9sCT0gcGFycG9ydF9heDg4Nzk2X3dyaXRlX2NvbnRyb2wsCisJLnJlYWRfY29udHJvbAk9IHBhcnBvcnRfYXg4ODc5Nl9yZWFkX2NvbnRyb2wsCisJLmZyb2JfY29udHJvbAk9IHBhcnBvcnRfYXg4ODc5Nl9mcm9iX2NvbnRyb2wsCisKKwkucmVhZF9zdGF0dXMJPSBwYXJwb3J0X2F4ODg3OTZfcmVhZF9zdGF0dXMsCisKKwkuZW5hYmxlX2lycQk9IHBhcnBvcnRfYXg4ODc5Nl9lbmFibGVfaXJxLAorCS5kaXNhYmxlX2lycQk9IHBhcnBvcnRfYXg4ODc5Nl9kaXNhYmxlX2lycSwKKworCS5kYXRhX2ZvcndhcmQJPSBwYXJwb3J0X2F4ODg3OTZfZGF0YV9mb3J3YXJkLAorCS5kYXRhX3JldmVyc2UJPSBwYXJwb3J0X2F4ODg3OTZfZGF0YV9yZXZlcnNlLAorCisJLmluaXRfc3RhdGUJPSBwYXJwb3J0X2F4ODg3OTZfaW5pdF9zdGF0ZSwKKwkuc2F2ZV9zdGF0ZQk9IHBhcnBvcnRfYXg4ODc5Nl9zYXZlX3N0YXRlLAorCS5yZXN0b3JlX3N0YXRlCT0gcGFycG9ydF9heDg4Nzk2X3Jlc3RvcmVfc3RhdGUsCisKKwkuZXBwX3dyaXRlX2RhdGEJPSBwYXJwb3J0X2llZWUxMjg0X2VwcF93cml0ZV9kYXRhLAorCS5lcHBfcmVhZF9kYXRhCT0gcGFycG9ydF9pZWVlMTI4NF9lcHBfcmVhZF9kYXRhLAorCS5lcHBfd3JpdGVfYWRkcgk9IHBhcnBvcnRfaWVlZTEyODRfZXBwX3dyaXRlX2FkZHIsCisJLmVwcF9yZWFkX2FkZHIJPSBwYXJwb3J0X2llZWUxMjg0X2VwcF9yZWFkX2FkZHIsCisKKwkuZWNwX3dyaXRlX2RhdGEJPSBwYXJwb3J0X2llZWUxMjg0X2VjcF93cml0ZV9kYXRhLAorCS5lY3BfcmVhZF9kYXRhCT0gcGFycG9ydF9pZWVlMTI4NF9lY3BfcmVhZF9kYXRhLAorCS5lY3Bfd3JpdGVfYWRkcgk9IHBhcnBvcnRfaWVlZTEyODRfZWNwX3dyaXRlX2FkZHIsCisKKwkuY29tcGF0X3dyaXRlX2RhdGEJPSBwYXJwb3J0X2llZWUxMjg0X3dyaXRlX2NvbXBhdCwKKwkubmliYmxlX3JlYWRfZGF0YQk9IHBhcnBvcnRfaWVlZTEyODRfcmVhZF9uaWJibGUsCisJLmJ5dGVfcmVhZF9kYXRhCQk9IHBhcnBvcnRfaWVlZTEyODRfcmVhZF9ieXRlLAorCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBwYXJwb3J0X2F4ODg3OTZfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpfZGV2ID0gJnBkZXYtPmRldjsKKwlzdHJ1Y3QgYXhfZHJ2ZGF0YSAqZGQ7CisJc3RydWN0IHBhcnBvcnQgKnBwID0gTlVMTDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisJaW50IHNwYWNpbmc7CisJaW50IGlycTsKKwlpbnQgcmV0OworCisJZGQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYXhfZHJ2ZGF0YSksIEdGUF9LRVJORUwpOworCWlmIChkZCA9PSBOVUxMKSB7CisJCWRldl9lcnIoX2RldiwgIm5vIG1lbW9yeSBmb3IgcHJpdmF0ZSBkYXRhXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAocmVzID09IE5VTEwpIHsKKwkJZGV2X2VycihfZGV2LCAibm8gTUVNIHNwZWNpZmllZFxuIik7CisJCXJldCA9IC1FTlhJTzsKKwkJZ290byBleGl0X21lbTsKKwl9CisKKwlzaXplID0gKHJlcy0+ZW5kIC0gcmVzLT5zdGFydCkgKyAxOworCXNwYWNpbmcgPSBzaXplIC8gMzsKKworCWRkLT5pbyA9IHJlcXVlc3RfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCBzaXplLCBwZGV2LT5uYW1lKTsKKwlpZiAoZGQtPmlvID09IE5VTEwpIHsKKwkJZGV2X2VycihfZGV2LCAiY2Fubm90IHJlc2VydmUgbWVtb3J5XG4iKTsKKwkJcmV0ID0gLUVOWElPOworCQlnb3RvIGV4aXRfbWVtOworCX0KKworCWRkLT5iYXNlID0gaW9yZW1hcChyZXMtPnN0YXJ0LCBzaXplKTsKKwlpZiAoZGQtPmJhc2UgPT0gTlVMTCkgeworCQlkZXZfZXJyKF9kZXYsICJjYW5ub3QgaW9yZW1hcCByZWdpb25cbiIpOworCQlyZXQgPSAtRU5YSU87CisJCWdvdG8gZXhpdF9yZXM7CisJfQorCisJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAoaXJxIDw9IDApCisJCWlycSA9IFBBUlBPUlRfSVJRX05PTkU7CisKKwlwcCA9IHBhcnBvcnRfcmVnaXN0ZXJfcG9ydCgodW5zaWduZWQgbG9uZylkZC0+YmFzZSwgaXJxLAorCQkJCSAgIFBBUlBPUlRfRE1BX05PTkUsCisJCQkJICAgJnBhcnBvcnRfYXg4ODc5Nl9vcHMpOworCisJaWYgKHBwID09IE5VTEwpIHsKKwkJZGV2X2VycihfZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIHBhcmFsbGVsIHBvcnRcbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGV4aXRfdW5tYXA7CisJfQorCisJcHAtPnByaXZhdGVfZGF0YSA9IGRkOworCWRkLT5wYXJwb3J0ID0gcHA7CisJZGQtPmRldiA9IF9kZXY7CisKKwlkZC0+c3BwX2RhdGEgPSBkZC0+YmFzZTsKKwlkZC0+c3BwX3NwciAgPSBkZC0+YmFzZSArIChzcGFjaW5nICogMSk7CisJZGQtPnNwcF9jcHIgID0gZGQtPmJhc2UgKyAoc3BhY2luZyAqIDIpOworCisJLyogaW5pdGlhbGlzZSB0aGUgcG9ydCBjb250cm9scyAqLworCXdyaXRlYihBWF9DUFJfU1RSQiwgZGQtPnNwcF9jcHIpOworCisJaWYgKGlycSA+PSAwKSB7CisJCS8qIHJlcXVlc3QgaXJxICovCisJCXJldCA9IHJlcXVlc3RfaXJxKGlycSwgcGFycG9ydF9heDg4Nzk2X2ludGVycnVwdCwKKwkJCQkgIFNBX1RSSUdHRVJfRkFMTElORywgcGRldi0+bmFtZSwgcHApOworCisJCWlmIChyZXQgPCAwKQorCQkJZ290byBleGl0X3BvcnQ7CisKKwkJZGQtPmlycV9lbmFibGVkID0gMTsKKwl9CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBwcCk7CisKKwlkZXZfaW5mbyhfZGV2LCAiYXR0YWNoZWQgcGFyYWxsZWwgcG9ydCBkcml2ZXJcbiIpOworCXBhcnBvcnRfYW5ub3VuY2VfcG9ydChwcCk7CisKKwlyZXR1cm4gMDsKKworIGV4aXRfcG9ydDoKKwlwYXJwb3J0X3JlbW92ZV9wb3J0KHBwKTsKKyBleGl0X3VubWFwOgorCWlvdW5tYXAoZGQtPmJhc2UpOworIGV4aXRfcmVzOgorCXJlbGVhc2VfcmVzb3VyY2UoZGQtPmlvKTsKKwlrZnJlZShkZC0+aW8pOworIGV4aXRfbWVtOgorCWtmcmVlKGRkKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHBhcnBvcnRfYXg4ODc5Nl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcGFycG9ydCAqcCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBheF9kcnZkYXRhICpkZCA9IHBwX3RvX2RydihwKTsKKworCWZyZWVfaXJxKHAtPmlycSwgcCk7CisJcGFycG9ydF9yZW1vdmVfcG9ydChwKTsKKwlpb3VubWFwKGRkLT5iYXNlKTsKKwlyZWxlYXNlX3Jlc291cmNlKGRkLT5pbyk7CisJa2ZyZWUoZGQtPmlvKTsKKwlrZnJlZShkZCk7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19QTQorCitzdGF0aWMgaW50IHBhcnBvcnRfYXg4ODc5Nl9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldiwKKwkJCQkgICBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJc3RydWN0IHBhcnBvcnQgKnAgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBheF9kcnZkYXRhICpkZCA9IHBwX3RvX2RydihwKTsKKworCXBhcnBvcnRfYXg4ODc5Nl9zYXZlX3N0YXRlKHAsICZkZC0+c3VzcGVuZCk7CisJd3JpdGViKEFYX0NQUl9uRE9FIHwgQVhfQ1BSX1NUUkIsIGRkLT5zcHBfY3ByKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYXJwb3J0X2F4ODg3OTZfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGFycG9ydCAqcCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGF4X2RydmRhdGEgKmRkID0gcHBfdG9fZHJ2KHApOworCisJcGFycG9ydF9heDg4Nzk2X3Jlc3RvcmVfc3RhdGUocCwgJmRkLT5zdXNwZW5kKTsKKwlyZXR1cm4gMDsKK30KKworI2Vsc2UKKyNkZWZpbmUgcGFycG9ydF9heDg4Nzk2X3N1c3BlbmQgTlVMTAorI2RlZmluZSBwYXJwb3J0X2F4ODg3OTZfcmVzdW1lICBOVUxMCisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYXhkcnYgPSB7CisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gImF4ODg3OTYtcHAiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZQkJPSBwYXJwb3J0X2F4ODg3OTZfcHJvYmUsCisJLnJlbW92ZQkJPSBwYXJwb3J0X2F4ODg3OTZfcmVtb3ZlLAorCS5zdXNwZW5kCT0gcGFycG9ydF9heDg4Nzk2X3N1c3BlbmQsCisJLnJlc3VtZQkJPSBwYXJwb3J0X2F4ODg3OTZfcmVzdW1lLAorfTsKKworc3RhdGljIGludCBfX2luaXQgcGFycG9ydF9heDg4Nzk2X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZheGRydik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBwYXJwb3J0X2F4ODg3OTZfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZheGRydik7Cit9CisKK21vZHVsZV9pbml0KHBhcnBvcnRfYXg4ODc5Nl9pbml0KQorbW9kdWxlX2V4aXQocGFycG9ydF9heDg4Nzk2X2V4aXQpCisKK01PRFVMRV9BVVRIT1IoIkJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQVg4ODc5NiBQYXJwb3J0IHBhcmFsbGVsIHBvcnQgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BhcnBvcnQvcGFycG9ydF9nc2MuYyBiL2RyaXZlcnMvcGFycG9ydC9wYXJwb3J0X2dzYy5jCmluZGV4IDFkZTUyZDkuLjczNTIxMDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGFycG9ydC9wYXJwb3J0X2dzYy5jCisrKyBiL2RyaXZlcnMvcGFycG9ydC9wYXJwb3J0X2dzYy5jCkBAIC0xNSw3ICsxNSw3IEBACiAgKiAJICAgIFBoaWwgQmx1bmRlbGwgPHBoaWxiQGdudS5vcmc+CiAgKiAgICAgICAgICBUaW0gV2F1Z2ggPHRpbUBjeWJlcmVsay5kZW1vbi5jby51az4KICAqCSAgICBKb3NlIFJlbmF1IDxyZW5hdUBhY20ub3JnPgotICogICAgICAgICAgRGF2aWQgQ2FtcGJlbGwgPGNhbXBiZWxsQHRvcnF1ZS5uZXQ+CisgKiAgICAgICAgICBEYXZpZCBDYW1wYmVsbAogICogICAgICAgICAgQW5kcmVhIEFyY2FuZ2VsaQogICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGFycG9ydC9wYXJwb3J0X2dzYy5oIGIvZHJpdmVycy9wYXJwb3J0L3BhcnBvcnRfZ3NjLmgKaW5kZXggNjYyZjZjMS4uZmM5YzM3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wYXJwb3J0L3BhcnBvcnRfZ3NjLmgKKysrIGIvZHJpdmVycy9wYXJwb3J0L3BhcnBvcnRfZ3NjLmgKQEAgLTI0LDcgKzI0LDcgQEAKICAqIAkgICAgUGhpbCBCbHVuZGVsbCA8UGhpbGlwLkJsdW5kZWxsQHBvYm94LmNvbT4KICAqICAgICAgICAgIFRpbSBXYXVnaCA8dGltQGN5YmVyZWxrLmRlbW9uLmNvLnVrPgogICoJICAgIEpvc2UgUmVuYXUgPHJlbmF1QGFjbS5vcmc+Ci0gKiAgICAgICAgICBEYXZpZCBDYW1wYmVsbCA8Y2FtcGJlbGxAdG9ycXVlLm5ldD4KKyAqICAgICAgICAgIERhdmlkIENhbXBiZWxsCiAgKiAgICAgICAgICBBbmRyZWEgQXJjYW5nZWxpCiAgKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wYXJwb3J0L3BhcnBvcnRfcGMuYyBiL2RyaXZlcnMvcGFycG9ydC9wYXJwb3J0X3BjLmMKaW5kZXggNDhiYmYzMi4uNzMxOGU0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wYXJwb3J0L3BhcnBvcnRfcGMuYworKysgYi9kcml2ZXJzL3BhcnBvcnQvcGFycG9ydF9wYy5jCkBAIC0zLDcgKzMsNyBAQAogICogQXV0aG9yczogUGhpbCBCbHVuZGVsbCA8cGhpbGJAZ251Lm9yZz4KICAqICAgICAgICAgIFRpbSBXYXVnaCA8dGltQGN5YmVyZWxrLmRlbW9uLmNvLnVrPgogICoJICAgIEpvc2UgUmVuYXUgPHJlbmF1QGFjbS5vcmc+Ci0gKiAgICAgICAgICBEYXZpZCBDYW1wYmVsbCA8Y2FtcGJlbGxAdG9ycXVlLm5ldD4KKyAqICAgICAgICAgIERhdmlkIENhbXBiZWxsCiAgKiAgICAgICAgICBBbmRyZWEgQXJjYW5nZWxpCiAgKgogICogYmFzZWQgb24gd29yayBieSBHcmFudCBHdWVudGhlciA8Z3JhbnRAdG9ycXVlLm5ldD4gYW5kIFBoaWwgQmx1bmRlbGwuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BhcnBvcnQvcGFycG9ydF9zdW5icHAuYyBiL2RyaXZlcnMvcGFycG9ydC9wYXJwb3J0X3N1bmJwcC5jCmluZGV4IDY5YTRiYmQuLjdjNDNjNTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGFycG9ydC9wYXJwb3J0X3N1bmJwcC5jCisrKyBiL2RyaXZlcnMvcGFycG9ydC9wYXJwb3J0X3N1bmJwcC5jCkBAIC0zODksNyArMzg5LDcgQEAKIAl7fSwKIH07CiAKLU1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHFlY19zYnVzX21hdGNoKTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGJwcF9tYXRjaCk7CiAKIHN0YXRpYyBzdHJ1Y3Qgb2ZfcGxhdGZvcm1fZHJpdmVyIGJwcF9zYnVzX2RyaXZlciA9IHsKIAkubmFtZQkJPSAiYnBwIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGFycG9ydC9wcm9jZnMuYyBiL2RyaXZlcnMvcGFycG9ydC9wcm9jZnMuYwppbmRleCBjYmUxNzE4Li44NjEwYWU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BhcnBvcnQvcHJvY2ZzLmMKKysrIGIvZHJpdmVycy9wYXJwb3J0L3Byb2Nmcy5jCkBAIC0xLDYgKzEsNiBAQAogLyogU3lzY3RsIGludGVyZmFjZSBmb3IgcGFycG9ydCBkZXZpY2VzLgogICogCi0gKiBBdXRob3JzOiBEYXZpZCBDYW1wYmVsbCA8Y2FtcGJlbGxAdG9ycXVlLm5ldD4KKyAqIEF1dGhvcnM6IERhdmlkIENhbXBiZWxsCiAgKiAgICAgICAgICBUaW0gV2F1Z2ggPHRpbUBjeWJlcmVsay5kZW1vbi5jby51az4KICAqICAgICAgICAgIFBoaWxpcCBCbHVuZGVsbCA8cGhpbGJAZ251Lm9yZz4KICAqICAgICAgICAgIEFuZHJlYSBBcmNhbmdlbGkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGFycG9ydC9zaGFyZS5jIGIvZHJpdmVycy9wYXJwb3J0L3NoYXJlLmMKaW5kZXggYmJiZmQ3OS4uMmNiMjJjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wYXJwb3J0L3NoYXJlLmMKKysrIGIvZHJpdmVycy9wYXJwb3J0L3NoYXJlLmMKQEAgLTIxOCw3ICsyMTgsNyBAQAogICoJcGFycG9ydF9nZXRfcG9ydCAtIGluY3JlbWVudCBhIHBvcnQncyByZWZlcmVuY2UgY291bnQKICAqCUBwb3J0OiB0aGUgcG9ydAogICoKLSAqCVRoaXMgZW5zdXJlJ3MgdGhhdCBhIHN0cnVjdCBwYXJwb3J0IHBvaW50ZXIgcmVtYWlucyB2YWxpZAorICoJVGhpcyBlbnN1cmVzIHRoYXQgYSBzdHJ1Y3QgcGFycG9ydCBwb2ludGVyIHJlbWFpbnMgdmFsaWQKICAqCXVudGlsIHRoZSBtYXRjaGluZyBwYXJwb3J0X3B1dF9wb3J0KCkgY2FsbC4KICAqKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvbXNpLWFwaWMuYyBiL2RyaXZlcnMvcGNpL21zaS1hcGljLmMKaW5kZXggMGViNWZlOS4uNWVkNzk4YjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL21zaS1hcGljLmMKKysrIGIvZHJpdmVycy9wY2kvbXNpLWFwaWMuYwpAQCAtNCw2ICs0LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGFzbS9zbXAuaD4KIAogI2luY2x1ZGUgIm1zaS5oIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2kuYyBiL2RyaXZlcnMvcGNpL3BjaS5jCmluZGV4IGQ0MDhhM2MuLjIzZDNiMTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaS5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaS5jCkBAIC0zNjksNyArMzY5LDcgQEAKIAogCS8qCiAJICogR2l2ZSBmaXJtd2FyZSBhIGNoYW5jZSB0byBiZSBjYWxsZWQsIHN1Y2ggYXMgQUNQSSBfUFJ4LCBfUFN4Ci0JICogRmlybXdhcmUgbWV0aG9kIGFmdGVyIG5hdGljZSBtZXRob2QgPworCSAqIEZpcm13YXJlIG1ldGhvZCBhZnRlciBuYXRpdmUgbWV0aG9kID8KIAkgKi8KIAlpZiAocGxhdGZvcm1fcGNpX3NldF9wb3dlcl9zdGF0ZSkKIAkJcGxhdGZvcm1fcGNpX3NldF9wb3dlcl9zdGF0ZShkZXYsIHN0YXRlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG5wL2NhcmQuYyBiL2RyaXZlcnMvcG5wL2NhcmQuYwppbmRleCBiYjE5YzY0Li4wYjRhZGNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BucC9jYXJkLmMKKysrIGIvZHJpdmVycy9wbnAvY2FyZC5jCkBAIC02MCwzMCArNjAsMzQgQEAKIAljYXJkX3JlbW92ZShkZXYpOwogfQogCi1zdGF0aWMgaW50IGNhcmRfcHJvYmUoc3RydWN0IHBucF9jYXJkICogY2FyZCwgc3RydWN0IHBucF9jYXJkX2RyaXZlciAqIGRydikKK3N0YXRpYyBpbnQgY2FyZF9wcm9iZShzdHJ1Y3QgcG5wX2NhcmQgKmNhcmQsIHN0cnVjdCBwbnBfY2FyZF9kcml2ZXIgKmRydikKIHsKLQljb25zdCBzdHJ1Y3QgcG5wX2NhcmRfZGV2aWNlX2lkICppZCA9IG1hdGNoX2NhcmQoZHJ2LGNhcmQpOwotCWlmIChpZCkgewotCQlzdHJ1Y3QgcG5wX2NhcmRfbGluayAqIGNsaW5rID0gcG5wX2FsbG9jKHNpemVvZihzdHJ1Y3QgcG5wX2NhcmRfbGluaykpOwotCQlpZiAoIWNsaW5rKQotCQkJcmV0dXJuIDA7Ci0JCWNsaW5rLT5jYXJkID0gY2FyZDsKLQkJY2xpbmstPmRyaXZlciA9IGRydjsKLQkJY2xpbmstPnBtX3N0YXRlID0gUE1TR19PTjsKLQkJaWYgKGRydi0+cHJvYmUpIHsKLQkJCWlmIChkcnYtPnByb2JlKGNsaW5rLCBpZCk+PTApCi0JCQkJcmV0dXJuIDE7Ci0JCQllbHNlIHsKLQkJCQlzdHJ1Y3QgcG5wX2RldiAqIGRldjsKLQkJCQljYXJkX2Zvcl9lYWNoX2RldihjYXJkLCBkZXYpIHsKLQkJCQkJaWYgKGRldi0+Y2FyZF9saW5rID09IGNsaW5rKQotCQkJCQkJcG5wX3JlbGVhc2VfY2FyZF9kZXZpY2UoZGV2KTsKLQkJCQl9Ci0JCQkJa2ZyZWUoY2xpbmspOwotCQkJfQotCQl9IGVsc2UKLQkJCXJldHVybiAxOworCWNvbnN0IHN0cnVjdCBwbnBfY2FyZF9kZXZpY2VfaWQgKmlkOworCXN0cnVjdCBwbnBfY2FyZF9saW5rICpjbGluazsKKwlzdHJ1Y3QgcG5wX2RldiAqZGV2OworCisJaWYgKCFkcnYtPnByb2JlKQorCQlyZXR1cm4gMDsKKwlpZCA9IG1hdGNoX2NhcmQoZHJ2LGNhcmQpOworCWlmICghaWQpCisJCXJldHVybiAwOworCisJY2xpbmsgPSBwbnBfYWxsb2Moc2l6ZW9mKCpjbGluaykpOworCWlmICghY2xpbmspCisJCXJldHVybiAwOworCWNsaW5rLT5jYXJkID0gY2FyZDsKKwljbGluay0+ZHJpdmVyID0gZHJ2OworCWNsaW5rLT5wbV9zdGF0ZSA9IFBNU0dfT047CisKKwlpZiAoZHJ2LT5wcm9iZShjbGluaywgaWQpID49IDApCisJCXJldHVybiAxOworCisJLyogUmVjb3ZlcnkgKi8KKwljYXJkX2Zvcl9lYWNoX2RldihjYXJkLCBkZXYpIHsKKwkJaWYgKGRldi0+Y2FyZF9saW5rID09IGNsaW5rKQorCQkJcG5wX3JlbGVhc2VfY2FyZF9kZXZpY2UoZGV2KTsKIAl9CisJa2ZyZWUoY2xpbmspOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9LY29uZmlnIGIvZHJpdmVycy9ydGMvS2NvbmZpZwppbmRleCA2NWQwOTBkLi5iY2NmZjQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9LY29uZmlnCisrKyBiL2RyaXZlcnMvcnRjL0tjb25maWcKQEAgLTczLDYgKzczLDEzIEBACiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIHJ0Yy1kZXYuCiAKK2NvbmZpZyBSVENfSU5URl9ERVZfVUlFX0VNVUwKKwlib29sICJSVEMgVUlFIGVtdWxhdGlvbiBvbiBkZXYgaW50ZXJmYWNlIgorCWRlcGVuZHMgb24gUlRDX0lOVEZfREVWCisJaGVscAorCSAgUHJvdmlkZXMgYW4gZW11bGF0aW9uIGZvciBSVENfVUlFIGlmIHRoZSB1bmRlcmxheWluZyBydGMgY2hpcAorCSAgZHJpdmVyIGRpZCBub3QgcHJvdmlkZSBSVENfVUlFIGlvY3Rscy4KKwogY29tbWVudCAiUlRDIGRyaXZlcnMiCiAJZGVwZW5kcyBvbiBSVENfQ0xBU1MKIApAQCAtODYsNiArOTMsMzQgQEAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgcnRjLXgxMjA1LgogCitjb25maWcgUlRDX0RSVl9EUzEzMDcKKwl0cmlzdGF0ZSAiRGFsbGFzL01heGltIERTMTMwNyBhbmQgc2ltaWxhciBJMkMgUlRDIGNoaXBzIgorCWRlcGVuZHMgb24gUlRDX0NMQVNTICYmIEkyQworCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB2YXJpb3VzIGNvbXBhdGlibGUgUlRDCisJICBjaGlwcyAob2Z0ZW4gd2l0aCBiYXR0ZXJ5IGJhY2t1cCkgY29ubmVjdGVkIHdpdGggSTJDLiAgVGhpcyBkcml2ZXIKKwkgIHNob3VsZCBoYW5kbGUgRFMxMzA3LCBEUzEzMzcsIERTMTMzOCwgRFMxMzM5LCBEUzEzNDAsIFNUIE00MVQwMCwKKwkgIGFuZCBwcm9iYWJseSBvdGhlciBjaGlwcy4gIEluIHNvbWUgY2FzZXMgdGhlIFJUQyBtdXN0IGFscmVhZHkKKwkgIGhhdmUgYmVlbiBpbml0aWFsaXplZCAoYnkgbWFudWZhY3R1cmluZyBvciBhIGJvb3Rsb2FkZXIpLgorCisJICBUaGUgZmlyc3Qgc2V2ZW4gcmVnaXN0ZXJzIG9uIHRoZXNlIGNoaXBzIGhvbGQgYW4gUlRDLCBhbmQgb3RoZXIKKwkgIHJlZ2lzdGVycyBtYXkgYWRkIGZlYXR1cmVzIHN1Y2ggYXMgTlZSQU0sIGEgdHJpY2tsZSBjaGFyZ2VyIGZvcgorCSAgdGhlIFJUQy9OVlJBTSBiYWNrdXAgcG93ZXIsIGFuZCBhbGFybXMuICBUaGlzIGRyaXZlciBtYXkgbm90CisJICBleHBvc2UgYWxsIHRob3NlIGF2YWlsYWJsZSBjaGlwIGZlYXR1cmVzLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHJ0Yy1kczEzMDcuCisKK2NvbmZpZyBSVENfRFJWX0RTMTU1MworCXRyaXN0YXRlICJEYWxsYXMgRFMxNTUzIgorCWRlcGVuZHMgb24gUlRDX0NMQVNTCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZQorCSAgRGFsbGFzIERTMTU1MyB0aW1la2VlcGluZyBjaGlwLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHJ0Yy1kczE1NTMuCisKIGNvbmZpZyBSVENfRFJWX0RTMTY3MgogCXRyaXN0YXRlICJEYWxsYXMvTWF4aW0gRFMxNjcyIgogCWRlcGVuZHMgb24gUlRDX0NMQVNTICYmIEkyQwpAQCAtOTYsNiArMTMxLDE2IEBACiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIHJ0Yy1kczE2NzIuCiAKK2NvbmZpZyBSVENfRFJWX0RTMTc0MgorCXRyaXN0YXRlICJEYWxsYXMgRFMxNzQyIgorCWRlcGVuZHMgb24gUlRDX0NMQVNTCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZQorCSAgRGFsbGFzIERTMTc0MiB0aW1la2VlcGluZyBjaGlwLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHJ0Yy1kczE3NDIuCisKIGNvbmZpZyBSVENfRFJWX1BDRjg1NjMKIAl0cmlzdGF0ZSAiUGhpbGlwcyBQQ0Y4NTYzL0Vwc29uIFJUQzg1NjQiCiAJZGVwZW5kcyBvbiBSVENfQ0xBU1MgJiYgSTJDCkBAIC0xMDcsNiArMTUyLDE2IEBACiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIHJ0Yy1wY2Y4NTYzLgogCitjb25maWcgUlRDX0RSVl9QQ0Y4NTgzCisJdHJpc3RhdGUgIlBoaWxpcHMgUENGODU4MyIKKwlkZXBlbmRzIG9uIFJUQ19DTEFTUyAmJiBJMkMKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlCisJICBQaGlsaXBzIFBDRjg1ODMgUlRDIGNoaXAuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgcnRjLXBjZjg1ODMuCisKIGNvbmZpZyBSVENfRFJWX1JTNUMzNzIKIAl0cmlzdGF0ZSAiUmljb2ggUlM1QzM3MkEvQiIKIAlkZXBlbmRzIG9uIFJUQ19DTEFTUyAmJiBJMkMKQEAgLTE1Nyw2ICsyMTIsMjIgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHJ0Yy12cjQxeHguCiAKK2NvbmZpZyBSVENfRFJWX1BMMDMxCisJdHJpc3RhdGUgIkFSTSBBTUJBIFBMMDMxIFJUQyIKKwlkZXBlbmRzIG9uIFJUQ19DTEFTUyAmJiBBUk1fQU1CQQorCWhlbHAKKwkgIElmIHlvdSBzYXkgWSBoZXJlIHlvdSB3aWxsIGdldCBhY2Nlc3MgdG8gQVJNIEFNQkEKKwkgIFByaW1lQ2VsbCBQTDAzMSBVQVJUIGZvdW5kIG9uIGNlcnRhaW4gQVJNIFNPQ3MuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHJ0Yy1wbDAzMS4KKworY29uZmlnIFJUQ19EUlZfQVQ5MQorCXRyaXN0YXRlICJBVDkxUk05MjAwIgorCWRlcGVuZHMgb24gUlRDX0NMQVNTICYmIEFSQ0hfQVQ5MVJNOTIwMAorCWhlbHAKKwkgIERyaXZlciBmb3IgdGhlIEF0bWVsIEFUOTFSTTkyMDAncyBpbnRlcm5hbCBSVEMgKFJlYWx0aW1lIENsb2NrKS4KKwogY29uZmlnIFJUQ19EUlZfVEVTVAogCXRyaXN0YXRlICJUZXN0IGRyaXZlci9kZXZpY2UiCiAJZGVwZW5kcyBvbiBSVENfQ0xBU1MKQEAgLTE3Miw0ICsyNDMsMjQgQEAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgcnRjLXRlc3QuCiAKK2NvbmZpZyBSVENfRFJWX01BWDY5MDIKKwl0cmlzdGF0ZSAiTWF4aW0gNjkwMiIKKwlkZXBlbmRzIG9uIFJUQ19DTEFTUyAmJiBTUEkKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSB3aWxsIGdldCBzdXBwb3J0IGZvciB0aGUKKwkgIE1heGltIE1BWDY5MDIgc3BpIFJUQyBjaGlwLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHJ0Yy1tYXg2OTAyLgorCitjb25maWcgUlRDX0RSVl9WMzAyMAorCXRyaXN0YXRlICJFTSBNaWNyb2VsZWN0cm9uaWMgVjMwMjAiCisJZGVwZW5kcyBvbiBSVENfQ0xBU1MKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSB3aWxsIGdldCBzdXBwb3J0IGZvciB0aGUKKwkgIEVNIE1pY3JvZWxlY3Ryb25pYyB2MzAyMCBSVEMgY2hpcC4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBydGMtdjMwMjAuCisKIGVuZG1lbnUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL01ha2VmaWxlIGIvZHJpdmVycy9ydGMvTWFrZWZpbGUKaW5kZXggYTljYTBmMS4uOTAwZDIxMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9ydGMvTWFrZWZpbGUKQEAgLTEzLDEwICsxMywxOCBAQAogCiBvYmotJChDT05GSUdfUlRDX0RSVl9YMTIwNSkJKz0gcnRjLXgxMjA1Lm8KIG9iai0kKENPTkZJR19SVENfRFJWX1RFU1QpCSs9IHJ0Yy10ZXN0Lm8KK29iai0kKENPTkZJR19SVENfRFJWX0RTMTMwNykJKz0gcnRjLWRzMTMwNy5vCiBvYmotJChDT05GSUdfUlRDX0RSVl9EUzE2NzIpCSs9IHJ0Yy1kczE2NzIubworb2JqLSQoQ09ORklHX1JUQ19EUlZfRFMxNzQyKQkrPSBydGMtZHMxNzQyLm8KIG9iai0kKENPTkZJR19SVENfRFJWX1BDRjg1NjMpCSs9IHJ0Yy1wY2Y4NTYzLm8KK29iai0kKENPTkZJR19SVENfRFJWX1BDRjg1ODMpCSs9IHJ0Yy1wY2Y4NTgzLm8KIG9iai0kKENPTkZJR19SVENfRFJWX1JTNUMzNzIpCSs9IHJ0Yy1yczVjMzcyLm8KIG9iai0kKENPTkZJR19SVENfRFJWX000OFQ4NikJKz0gcnRjLW00OHQ4Ni5vCitvYmotJChDT05GSUdfUlRDX0RSVl9EUzE1NTMpCSs9IHJ0Yy1kczE1NTMubwogb2JqLSQoQ09ORklHX1JUQ19EUlZfRVA5M1hYKQkrPSBydGMtZXA5M3h4Lm8KIG9iai0kKENPTkZJR19SVENfRFJWX1NBMTEwMCkJKz0gcnRjLXNhMTEwMC5vCiBvYmotJChDT05GSUdfUlRDX0RSVl9WUjQxWFgpCSs9IHJ0Yy12cjQxeHgubworb2JqLSQoQ09ORklHX1JUQ19EUlZfUEwwMzEpCSs9IHJ0Yy1wbDAzMS5vCitvYmotJChDT05GSUdfUlRDX0RSVl9NQVg2OTAyKQkrPSBydGMtbWF4NjkwMi5vCitvYmotJChDT05GSUdfUlRDX0RSVl9WMzAyMCkJKz0gcnRjLXYzMDIwLm8KK29iai0kKENPTkZJR19SVENfRFJWX0FUOTEpCSs9IHJ0Yy1hdDkxLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL2NsYXNzLmMgYi9kcml2ZXJzL3J0Yy9jbGFzcy5jCmluZGV4IDQxM2M3ZDUuLjUzOTZiZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL2NsYXNzLmMKKysrIGIvZHJpdmVycy9ydGMvY2xhc3MuYwpAQCAtNjksNiArNjksNyBAQAogCXJ0Yy0+aWQgPSBpZDsKIAlydGMtPm9wcyA9IG9wczsKIAlydGMtPm93bmVyID0gb3duZXI7CisJcnRjLT5tYXhfdXNlcl9mcmVxID0gNjQ7CiAJcnRjLT5jbGFzc19kZXYuZGV2ID0gZGV2OwogCXJ0Yy0+Y2xhc3NfZGV2LmNsYXNzID0gcnRjX2NsYXNzOwogCXJ0Yy0+Y2xhc3NfZGV2LnJlbGVhc2UgPSBydGNfZGV2aWNlX3JlbGVhc2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9pbnRlcmZhY2UuYyBiL2RyaXZlcnMvcnRjL2ludGVyZmFjZS5jCmluZGV4IDU2ZTQ5MDcuLjU3OWNkNjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL2ludGVyZmFjZS5jCisrKyBiL2RyaXZlcnMvcnRjL2ludGVyZmFjZS5jCkBAIC0yMjksNiArMjI5LDkgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBydGNfZGV2aWNlICpydGMgPSB0b19ydGNfZGV2aWNlKGNsYXNzX2Rldik7CiAKKwlpZiAocnRjLT5vcHMtPmlycV9zZXRfc3RhdGUgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTlhJTzsKKwogCXNwaW5fbG9ja19pcnFzYXZlKCZydGMtPmlycV90YXNrX2xvY2ssIGZsYWdzKTsKIAlpZiAocnRjLT5pcnFfdGFzayAhPSB0YXNrKQogCQllcnIgPSAtRU5YSU87CkBAIC0yNDMsMjUgKzI0NiwxMiBAQAogCiBpbnQgcnRjX2lycV9zZXRfZnJlcShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXYsIHN0cnVjdCBydGNfdGFzayAqdGFzaywgaW50IGZyZXEpCiB7Ci0JaW50IGVyciA9IDAsIHRtcCA9IDA7CisJaW50IGVyciA9IDA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjID0gdG9fcnRjX2RldmljZShjbGFzc19kZXYpOwogCi0JLyogYWxsb3dlZCByYW5nZSBpcyAyLTgxOTIgKi8KLQlpZiAoZnJlcSA8IDIgfHwgZnJlcSA+IDgxOTIpCi0JCXJldHVybiAtRUlOVkFMOwotLyoKLQlGSVhNRTogdGhpcyBkb2VzIG5vdCBiZWxvbmcgaGVyZSwgd2lsbCBtb3ZlIHdoZXJlIGFwcHJvcHJpYXRlCi0JYXQgYSBsYXRlciBzdGFnZS4gSXQgY2Fubm90IGh1cnQgcmlnaHQgbm93LCB0cnVzdCBtZSA6KQotCWlmICgoZnJlcSA+IHJ0Y19tYXhfdXNlcl9mcmVxKSAmJiAoIWNhcGFibGUoQ0FQX1NZU19SRVNPVVJDRSkpKQotCQlyZXR1cm4gLUVBQ0NFUzsKLSovCi0JLyogY2hlY2sgaWYgZnJlcSBpcyBhIHBvd2VyIG9mIDIgKi8KLQl3aGlsZSAoZnJlcSA+ICgxIDw8IHRtcCkpCi0JCXRtcCsrOwotCi0JaWYgKGZyZXEgIT0gKDEgPDwgdG1wKSkKLQkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHJ0Yy0+b3BzLT5pcnFfc2V0X2ZyZXEgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTlhJTzsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZydGMtPmlycV90YXNrX2xvY2ssIGZsYWdzKTsKIAlpZiAocnRjLT5pcnFfdGFzayAhPSB0YXNrKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLWF0OTEuYyBiL2RyaXZlcnMvcnRjL3J0Yy1hdDkxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY3NmY0NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1hdDkxLmMKQEAgLTAsMCArMSw0MDcgQEAKKy8qCisgKglSZWFsIFRpbWUgQ2xvY2sgaW50ZXJmYWNlIGZvciBMaW51eCBvbiBBdG1lbCBBVDkxUk05MjAwCisgKgorICoJQ29weXJpZ2h0IChDKSAyMDAyIFJpY2sgQnJvbnNvbgorICoKKyAqCUNvbnZlcnRlZCB0byBSVEMgY2xhc3MgbW9kZWwgYnkgQW5kcmV3IFZpY3RvcgorICoKKyAqCVBvcnRlZCB0byBMaW51eCAyLjYgYnkgU3RldmVuIFNjaG9segorICoJQmFzZWQgb24gczNjMjQxMC1ydGMuYyBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqCisgKglCYXNlZCBvbiBzYTExMDAtcnRjLmMgYnkgTmlscyBGYWVyYmVyCisgKglCYXNlZCBvbiBydGMuYyBieSBQYXVsIEdvcnRtYWtlcgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKglhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisjaW5jbHVkZSA8bGludXgvYmNkLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9ydGMuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoL3RpbWUuaD4KKworCisjZGVmaW5lIEFUOTFfUlRDX0ZSRVEJCTEKKyNkZWZpbmUgQVQ5MV9SVENfRVBPQ0gJCTE5MDBVTAkvKiBqdXN0IGxpa2UgYXJjaC9hcm0vY29tbW9uL3J0Y3RpbWUuYyAqLworCitzdGF0aWMgREVDTEFSRV9DT01QTEVUSU9OKGF0OTFfcnRjX3VwZGF0ZWQpOworc3RhdGljIHVuc2lnbmVkIGludCBhdDkxX2FsYXJtX3llYXIgPSBBVDkxX1JUQ19FUE9DSDsKKworLyoKKyAqIERlY29kZSB0aW1lL2RhdGUgaW50byBydGNfdGltZSBzdHJ1Y3R1cmUKKyAqLworc3RhdGljIHZvaWQgYXQ5MV9ydGNfZGVjb2RldGltZSh1bnNpZ25lZCBpbnQgdGltZXJlZywgdW5zaWduZWQgaW50IGNhbHJlZywKKwkJCQlzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXVuc2lnbmVkIGludCB0aW1lLCBkYXRlOworCisJLyogbXVzdCByZWFkIHR3aWNlIGluIGNhc2UgaXQgY2hhbmdlcyAqLworCWRvIHsKKwkJdGltZSA9IGF0OTFfc3lzX3JlYWQodGltZXJlZyk7CisJCWRhdGUgPSBhdDkxX3N5c19yZWFkKGNhbHJlZyk7CisJfSB3aGlsZSAoKHRpbWUgIT0gYXQ5MV9zeXNfcmVhZCh0aW1lcmVnKSkgfHwKKwkJCShkYXRlICE9IGF0OTFfc3lzX3JlYWQoY2FscmVnKSkpOworCisJdG0tPnRtX3NlYyAgPSBCQ0QyQklOKCh0aW1lICYgQVQ5MV9SVENfU0VDKSA+PiAwKTsKKwl0bS0+dG1fbWluICA9IEJDRDJCSU4oKHRpbWUgJiBBVDkxX1JUQ19NSU4pID4+IDgpOworCXRtLT50bV9ob3VyID0gQkNEMkJJTigodGltZSAmIEFUOTFfUlRDX0hPVVIpID4+IDE2KTsKKworCS8qCisJICogVGhlIENhbGVuZGFyIEFsYXJtIHJlZ2lzdGVyIGRvZXMgbm90IGhhdmUgYSBmaWVsZCBmb3IKKwkgKiB0aGUgeWVhciAtIHNvIHRoZXNlIHdpbGwgcmV0dXJuIGFuIGludmFsaWQgdmFsdWUuICBXaGVuIGFuCisJICogYWxhcm0gaXMgc2V0LCBhdDkxX2FsYXJtX3llYXIgd2lsbGUgc3RvcmUgdGhlIGN1cnJlbnQgeWVhci4KKwkgKi8KKwl0bS0+dG1feWVhciAgPSBCQ0QyQklOKGRhdGUgJiBBVDkxX1JUQ19DRU5UKSAqIDEwMDsJLyogY2VudHVyeSAqLworCXRtLT50bV95ZWFyICs9IEJDRDJCSU4oKGRhdGUgJiBBVDkxX1JUQ19ZRUFSKSA+PiA4KTsJLyogeWVhciAqLworCisJdG0tPnRtX3dkYXkgPSBCQ0QyQklOKChkYXRlICYgQVQ5MV9SVENfREFZKSA+PiAyMSkgLSAxOwkvKiBkYXkgb2YgdGhlIHdlZWsgWzAtNl0sIFN1bmRheT0wICovCisJdG0tPnRtX21vbiAgPSBCQ0QyQklOKChkYXRlICYgQVQ5MV9SVENfTU9OVEgpID4+IDE2KSAtIDE7CisJdG0tPnRtX21kYXkgPSBCQ0QyQklOKChkYXRlICYgQVQ5MV9SVENfREFURSkgPj4gMjQpOworfQorCisvKgorICogUmVhZCBjdXJyZW50IHRpbWUgYW5kIGRhdGUgaW4gUlRDCisgKi8KK3N0YXRpYyBpbnQgYXQ5MV9ydGNfcmVhZHRpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCWF0OTFfcnRjX2RlY29kZXRpbWUoQVQ5MV9SVENfVElNUiwgQVQ5MV9SVENfQ0FMUiwgdG0pOworCXRtLT50bV95ZGF5ID0gcnRjX3llYXJfZGF5cyh0bS0+dG1fbWRheSwgdG0tPnRtX21vbiwgdG0tPnRtX3llYXIpOworCXRtLT50bV95ZWFyID0gdG0tPnRtX3llYXIgLSAxOTAwOworCisJcHJfZGVidWcoIiVzKCk6ICU0ZC0lMDJkLSUwMmQgJTAyZDolMDJkOiUwMmRcbiIsIF9fRlVOQ1RJT05fXywKKwkJMTkwMCArIHRtLT50bV95ZWFyLCB0bS0+dG1fbW9uLCB0bS0+dG1fbWRheSwKKwkJdG0tPnRtX2hvdXIsIHRtLT50bV9taW4sIHRtLT50bV9zZWMpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTZXQgY3VycmVudCB0aW1lIGFuZCBkYXRlIGluIFJUQworICovCitzdGF0aWMgaW50IGF0OTFfcnRjX3NldHRpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXVuc2lnbmVkIGxvbmcgY3I7CisKKwlwcl9kZWJ1ZygiJXMoKTogJTRkLSUwMmQtJTAyZCAlMDJkOiUwMmQ6JTAyZFxuIiwgX19GVU5DVElPTl9fLAorCQkxOTAwICsgdG0tPnRtX3llYXIsIHRtLT50bV9tb24sIHRtLT50bV9tZGF5LAorCQl0bS0+dG1faG91ciwgdG0tPnRtX21pbiwgdG0tPnRtX3NlYyk7CisKKwkvKiBTdG9wIFRpbWUvQ2FsZW5kYXIgZnJvbSBjb3VudGluZyAqLworCWNyID0gYXQ5MV9zeXNfcmVhZChBVDkxX1JUQ19DUik7CisJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9SVENfQ1IsIGNyIHwgQVQ5MV9SVENfVVBEQ0FMIHwgQVQ5MV9SVENfVVBEVElNKTsKKworCWF0OTFfc3lzX3dyaXRlKEFUOTFfUlRDX0lFUiwgQVQ5MV9SVENfQUNLVVBEKTsKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZhdDkxX3J0Y191cGRhdGVkKTsJLyogd2FpdCBmb3IgQUNLVVBEIGludGVycnVwdCAqLworCWF0OTFfc3lzX3dyaXRlKEFUOTFfUlRDX0lEUiwgQVQ5MV9SVENfQUNLVVBEKTsKKworCWF0OTFfc3lzX3dyaXRlKEFUOTFfUlRDX1RJTVIsCisJCQkgIEJJTjJCQ0QodG0tPnRtX3NlYykgPDwgMAorCQkJfCBCSU4yQkNEKHRtLT50bV9taW4pIDw8IDgKKwkJCXwgQklOMkJDRCh0bS0+dG1faG91cikgPDwgMTYpOworCisJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9SVENfQ0FMUiwKKwkJCSAgQklOMkJDRCgodG0tPnRtX3llYXIgKyAxOTAwKSAvIDEwMCkJLyogY2VudHVyeSAqLworCQkJfCBCSU4yQkNEKHRtLT50bV95ZWFyICUgMTAwKSA8PCA4CS8qIHllYXIgKi8KKwkJCXwgQklOMkJDRCh0bS0+dG1fbW9uICsgMSkgPDwgMTYJCS8qIHRtX21vbiBzdGFydHMgYXQgemVybyAqLworCQkJfCBCSU4yQkNEKHRtLT50bV93ZGF5ICsgMSkgPDwgMjEJLyogZGF5IG9mIHRoZSB3ZWVrIFswLTZdLCBTdW5kYXk9MCAqLworCQkJfCBCSU4yQkNEKHRtLT50bV9tZGF5KSA8PCAyNCk7CisKKwkvKiBSZXN0YXJ0IFRpbWUvQ2FsZW5kYXIgKi8KKwljciA9IGF0OTFfc3lzX3JlYWQoQVQ5MV9SVENfQ1IpOworCWF0OTFfc3lzX3dyaXRlKEFUOTFfUlRDX0NSLCBjciAmIH4oQVQ5MV9SVENfVVBEQ0FMIHwgQVQ5MV9SVENfVVBEVElNKSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFJlYWQgYWxhcm0gdGltZSBhbmQgZGF0ZSBpbiBSVEMKKyAqLworc3RhdGljIGludCBhdDkxX3J0Y19yZWFkYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3drYWxybSAqYWxybSkKK3sKKwlzdHJ1Y3QgcnRjX3RpbWUgKnRtID0gJmFscm0tPnRpbWU7CisKKwlhdDkxX3J0Y19kZWNvZGV0aW1lKEFUOTFfUlRDX1RJTUFMUiwgQVQ5MV9SVENfQ0FMQUxSLCB0bSk7CisJdG0tPnRtX3lkYXkgPSBydGNfeWVhcl9kYXlzKHRtLT50bV9tZGF5LCB0bS0+dG1fbW9uLCB0bS0+dG1feWVhcik7CisJdG0tPnRtX3llYXIgPSBhdDkxX2FsYXJtX3llYXIgLSAxOTAwOworCisJcHJfZGVidWcoIiVzKCk6ICU0ZC0lMDJkLSUwMmQgJTAyZDolMDJkOiUwMmRcbiIsIF9fRlVOQ1RJT05fXywKKwkJMTkwMCArIHRtLT50bV95ZWFyLCB0bS0+dG1fbW9uLCB0bS0+dG1fbWRheSwKKwkJdG0tPnRtX2hvdXIsIHRtLT50bV9taW4sIHRtLT50bV9zZWMpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTZXQgYWxhcm0gdGltZSBhbmQgZGF0ZSBpbiBSVEMKKyAqLworc3RhdGljIGludCBhdDkxX3J0Y19zZXRhbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICphbHJtKQoreworCXN0cnVjdCBydGNfdGltZSB0bTsKKworCWF0OTFfcnRjX2RlY29kZXRpbWUoQVQ5MV9SVENfVElNUiwgQVQ5MV9SVENfQ0FMUiwgJnRtKTsKKworCWF0OTFfYWxhcm1feWVhciA9IHRtLnRtX3llYXI7CisKKwl0bS50bV9ob3VyID0gYWxybS0+dGltZS50bV9ob3VyOworCXRtLnRtX21pbiA9IGFscm0tPnRpbWUudG1fbWluOworCXRtLnRtX3NlYyA9IGFscm0tPnRpbWUudG1fc2VjOworCisJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9SVENfVElNQUxSLAorCQkgIEJJTjJCQ0QodG0udG1fc2VjKSA8PCAwCisJCXwgQklOMkJDRCh0bS50bV9taW4pIDw8IDgKKwkJfCBCSU4yQkNEKHRtLnRtX2hvdXIpIDw8IDE2CisJCXwgQVQ5MV9SVENfSE9VUkVOIHwgQVQ5MV9SVENfTUlORU4gfCBBVDkxX1JUQ19TRUNFTik7CisJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9SVENfQ0FMQUxSLAorCQkgIEJJTjJCQ0QodG0udG1fbW9uICsgMSkgPDwgMTYJCS8qIHRtX21vbiBzdGFydHMgYXQgemVybyAqLworCQl8IEJJTjJCQ0QodG0udG1fbWRheSkgPDwgMjQKKwkJfCBBVDkxX1JUQ19EQVRFRU4gfCBBVDkxX1JUQ19NVEhFTik7CisKKwlwcl9kZWJ1ZygiJXMoKTogJTRkLSUwMmQtJTAyZCAlMDJkOiUwMmQ6JTAyZFxuIiwgX19GVU5DVElPTl9fLAorCQlhdDkxX2FsYXJtX3llYXIsIHRtLnRtX21vbiwgdG0udG1fbWRheSwgdG0udG1faG91ciwKKwkJdG0udG1fbWluLCB0bS50bV9zZWMpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBIYW5kbGUgY29tbWFuZHMgZnJvbSB1c2VyLXNwYWNlCisgKi8KK3N0YXRpYyBpbnQgYXQ5MV9ydGNfaW9jdGwoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgY21kLAorCQkJdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IHJldCA9IDA7CisKKwlwcl9kZWJ1ZygiJXMoKTogY21kPSUwOHgsIGFyZz0lMDhseC5cbiIsIF9fRlVOQ1RJT05fXywgY21kLCBhcmcpOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFJUQ19BSUVfT0ZGOgkvKiBhbGFybSBvZmYgKi8KKwkJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9SVENfSURSLCBBVDkxX1JUQ19BTEFSTSk7CisJCWJyZWFrOworCWNhc2UgUlRDX0FJRV9PTjoJLyogYWxhcm0gb24gKi8KKwkJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9SVENfSUVSLCBBVDkxX1JUQ19BTEFSTSk7CisJCWJyZWFrOworCWNhc2UgUlRDX1VJRV9PRkY6CS8qIHVwZGF0ZSBvZmYgKi8KKwljYXNlIFJUQ19QSUVfT0ZGOgkvKiBwZXJpb2RpYyBvZmYgKi8KKwkJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9SVENfSURSLCBBVDkxX1JUQ19TRUNFVik7CisJCWJyZWFrOworCWNhc2UgUlRDX1VJRV9PTjoJLyogdXBkYXRlIG9uICovCisJY2FzZSBSVENfUElFX09OOgkvKiBwZXJpb2RpYyBvbiAqLworCQlhdDkxX3N5c193cml0ZShBVDkxX1JUQ19JRVIsIEFUOTFfUlRDX1NFQ0VWKTsKKwkJYnJlYWs7CisJY2FzZSBSVENfSVJRUF9SRUFEOgkvKiByZWFkIHBlcmlvZGljIGFsYXJtIGZyZXF1ZW5jeSAqLworCQlyZXQgPSBwdXRfdXNlcihBVDkxX1JUQ19GUkVRLCAodW5zaWduZWQgbG9uZyAqKSBhcmcpOworCQlicmVhazsKKwljYXNlIFJUQ19JUlFQX1NFVDoJLyogc2V0IHBlcmlvZGljIGFsYXJtIGZyZXF1ZW5jeSAqLworCQlpZiAoYXJnICE9IEFUOTFfUlRDX0ZSRVEpCisJCQlyZXQgPSAtRUlOVkFMOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRU5PSU9DVExDTUQ7CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBQcm92aWRlIGFkZGl0aW9uYWwgUlRDIGluZm9ybWF0aW9uIGluIC9wcm9jL2RyaXZlci9ydGMKKyAqLworc3RhdGljIGludCBhdDkxX3J0Y19wcm9jKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNlcV9maWxlICpzZXEpCit7CisJdW5zaWduZWQgbG9uZyBpbXIgPSBhdDkxX3N5c19yZWFkKEFUOTFfUlRDX0lNUik7CisKKwlzZXFfcHJpbnRmKHNlcSwgImFsYXJtX0lSUVx0OiAlc1xuIiwKKwkJCShpbXIgJiBBVDkxX1JUQ19BTEFSTSkgPyAieWVzIiA6ICJubyIpOworCXNlcV9wcmludGYoc2VxLCAidXBkYXRlX0lSUVx0OiAlc1xuIiwKKwkJCShpbXIgJiBBVDkxX1JUQ19BQ0tVUEQpID8gInllcyIgOiAibm8iKTsKKwlzZXFfcHJpbnRmKHNlcSwgInBlcmlvZGljX0lSUVx0OiAlc1xuIiwKKwkJCShpbXIgJiBBVDkxX1JUQ19TRUNFVikgPyAieWVzIiA6ICJubyIpOworCXNlcV9wcmludGYoc2VxLCAicGVyaW9kaWNfZnJlcVx0OiAlbGRcbiIsCisJCQkodW5zaWduZWQgbG9uZykgQVQ5MV9SVENfRlJFUSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIElSUSBoYW5kbGVyIGZvciB0aGUgUlRDCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBhdDkxX3J0Y19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLAorCQkJCQlzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gZGV2X2lkOworCXN0cnVjdCBydGNfZGV2aWNlICpydGMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwl1bnNpZ25lZCBpbnQgcnRzcjsKKwl1bnNpZ25lZCBsb25nIGV2ZW50cyA9IDA7CisKKwlydHNyID0gYXQ5MV9zeXNfcmVhZChBVDkxX1JUQ19TUikgJiBhdDkxX3N5c19yZWFkKEFUOTFfUlRDX0lNUik7CisJaWYgKHJ0c3IpIHsJCS8qIHRoaXMgaW50ZXJydXB0IGlzIHNoYXJlZCEgIElzIGl0IG91cnM/ICovCisJCWlmIChydHNyICYgQVQ5MV9SVENfQUxBUk0pCisJCQlldmVudHMgfD0gKFJUQ19BRiB8IFJUQ19JUlFGKTsKKwkJaWYgKHJ0c3IgJiBBVDkxX1JUQ19TRUNFVikKKwkJCWV2ZW50cyB8PSAoUlRDX1VGIHwgUlRDX0lSUUYpOworCQlpZiAocnRzciAmIEFUOTFfUlRDX0FDS1VQRCkKKwkJCWNvbXBsZXRlKCZhdDkxX3J0Y191cGRhdGVkKTsKKworCQlhdDkxX3N5c193cml0ZShBVDkxX1JUQ19TQ0NSLCBydHNyKTsJLyogY2xlYXIgc3RhdHVzIHJlZyAqLworCisJCXJ0Y191cGRhdGVfaXJxKCZydGMtPmNsYXNzX2RldiwgMSwgZXZlbnRzKTsKKworCQlwcl9kZWJ1ZygiJXMoKTogbnVtPSVsZCwgZXZlbnRzPTB4JTAybHhcbiIsIF9fRlVOQ1RJT05fXywKKwkJCWV2ZW50cyA+PiA4LCBldmVudHMgJiAweDAwMDAwMEZGKTsKKworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCXJldHVybiBJUlFfTk9ORTsJCS8qIG5vdCBoYW5kbGVkICovCit9CisKK3N0YXRpYyBzdHJ1Y3QgcnRjX2NsYXNzX29wcyBhdDkxX3J0Y19vcHMgPSB7CisJLmlvY3RsCQk9IGF0OTFfcnRjX2lvY3RsLAorCS5yZWFkX3RpbWUJPSBhdDkxX3J0Y19yZWFkdGltZSwKKwkuc2V0X3RpbWUJPSBhdDkxX3J0Y19zZXR0aW1lLAorCS5yZWFkX2FsYXJtCT0gYXQ5MV9ydGNfcmVhZGFsYXJtLAorCS5zZXRfYWxhcm0JPSBhdDkxX3J0Y19zZXRhbGFybSwKKwkucHJvYwkJPSBhdDkxX3J0Y19wcm9jLAorfTsKKworLyoKKyAqIEluaXRpYWxpemUgYW5kIGluc3RhbGwgUlRDIGRyaXZlcgorICovCitzdGF0aWMgaW50IF9faW5pdCBhdDkxX3J0Y19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBydGNfZGV2aWNlICpydGM7CisJaW50IHJldDsKKworCWF0OTFfc3lzX3dyaXRlKEFUOTFfUlRDX0NSLCAwKTsKKwlhdDkxX3N5c193cml0ZShBVDkxX1JUQ19NUiwgMCk7CQkvKiAyNCBob3VyIG1vZGUgKi8KKworCS8qIERpc2FibGUgYWxsIGludGVycnVwdHMgKi8KKwlhdDkxX3N5c193cml0ZShBVDkxX1JUQ19JRFIsIEFUOTFfUlRDX0FDS1VQRCB8IEFUOTFfUlRDX0FMQVJNIHwKKwkJCQkJQVQ5MV9SVENfU0VDRVYgfCBBVDkxX1JUQ19USU1FViB8CisJCQkJCUFUOTFfUlRDX0NBTEVWKTsKKworCXJldCA9IHJlcXVlc3RfaXJxKEFUOTFfSURfU1lTLCBhdDkxX3J0Y19pbnRlcnJ1cHQsCisJCQkJU0FfU0hJUlEsICJhdDkxX3J0YyIsIHBkZXYpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhdDkxX3J0YzogSVJRICVkIGFscmVhZHkgaW4gdXNlLlxuIiwKKwkJCQlBVDkxX0lEX1NZUyk7CisJCXJldHVybiByZXQ7CisJfQorCisJcnRjID0gcnRjX2RldmljZV9yZWdpc3RlcihwZGV2LT5uYW1lLCAmcGRldi0+ZGV2LAorCQkJCSZhdDkxX3J0Y19vcHMsIFRISVNfTU9EVUxFKTsKKwlpZiAoSVNfRVJSKHJ0YykpIHsKKwkJZnJlZV9pcnEoQVQ5MV9JRF9TWVMsIHBkZXYpOworCQlyZXR1cm4gUFRSX0VSUihydGMpOworCX0KKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBydGMpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiQVQ5MSBSZWFsIFRpbWUgQ2xvY2sgZHJpdmVyLlxuIik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBEaXNhYmxlIGFuZCByZW1vdmUgdGhlIFJUQyBkcml2ZXIKKyAqLworc3RhdGljIGludCBfX2RldmV4aXQgYXQ5MV9ydGNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJLyogRGlzYWJsZSBhbGwgaW50ZXJydXB0cyAqLworCWF0OTFfc3lzX3dyaXRlKEFUOTFfUlRDX0lEUiwgQVQ5MV9SVENfQUNLVVBEIHwgQVQ5MV9SVENfQUxBUk0gfAorCQkJCQlBVDkxX1JUQ19TRUNFViB8IEFUOTFfUlRDX1RJTUVWIHwKKwkJCQkJQVQ5MV9SVENfQ0FMRVYpOworCWZyZWVfaXJxKEFUOTFfSURfU1lTLCBwZGV2KTsKKworCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihydGMpOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KKworLyogQVQ5MVJNOTIwMCBSVEMgUG93ZXIgbWFuYWdlbWVudCBjb250cm9sICovCisKK3N0YXRpYyBzdHJ1Y3QgdGltZXNwZWMgYXQ5MV9ydGNfZGVsdGE7CisKK3N0YXRpYyBpbnQgYXQ5MV9ydGNfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJc3RydWN0IHJ0Y190aW1lIHRtOworCXN0cnVjdCB0aW1lc3BlYyB0aW1lOworCisJdGltZS50dl9uc2VjID0gMDsKKworCS8qIGNhbGN1bGF0ZSB0aW1lIGRlbHRhIGZvciBzdXNwZW5kICovCisJYXQ5MV9ydGNfcmVhZHRpbWUoJnBkZXYtPmRldiwgJnRtKTsKKwlydGNfdG1fdG9fdGltZSgmdG0sICZ0aW1lLnR2X3NlYyk7CisJc2F2ZV90aW1lX2RlbHRhKCZhdDkxX3J0Y19kZWx0YSwgJnRpbWUpOworCisJcHJfZGVidWcoIiVzKCk6ICU0ZC0lMDJkLSUwMmQgJTAyZDolMDJkOiUwMmRcbiIsIF9fRlVOQ1RJT05fXywKKwkJMTkwMCArIHRtLnRtX3llYXIsIHRtLnRtX21vbiwgdG0udG1fbWRheSwKKwkJdG0udG1faG91ciwgdG0udG1fbWluLCB0bS50bV9zZWMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXQ5MV9ydGNfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHJ0Y190aW1lIHRtOworCXN0cnVjdCB0aW1lc3BlYyB0aW1lOworCisJdGltZS50dl9uc2VjID0gMDsKKworCWF0OTFfcnRjX3JlYWR0aW1lKCZwZGV2LT5kZXYsICZ0bSk7CisJcnRjX3RtX3RvX3RpbWUoJnRtLCAmdGltZS50dl9zZWMpOworCXJlc3RvcmVfdGltZV9kZWx0YSgmYXQ5MV9ydGNfZGVsdGEsICZ0aW1lKTsKKworCXByX2RlYnVnKCIlcygpOiAlNGQtJTAyZC0lMDJkICUwMmQ6JTAyZDolMDJkXG4iLCBfX0ZVTkNUSU9OX18sCisJCTE5MDAgKyB0bS50bV95ZWFyLCB0bS50bV9tb24sIHRtLnRtX21kYXksCisJCXRtLnRtX2hvdXIsIHRtLnRtX21pbiwgdG0udG1fc2VjKTsKKworCXJldHVybiAwOworfQorI2Vsc2UKKyNkZWZpbmUgYXQ5MV9ydGNfc3VzcGVuZCBOVUxMCisjZGVmaW5lIGF0OTFfcnRjX3Jlc3VtZSAgTlVMTAorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGF0OTFfcnRjX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gYXQ5MV9ydGNfcHJvYmUsCisJLnJlbW92ZQkJPSBhdDkxX3J0Y19yZW1vdmUsCisJLnN1c3BlbmQJPSBhdDkxX3J0Y19zdXNwZW5kLAorCS5yZXN1bWUJCT0gYXQ5MV9ydGNfcmVzdW1lLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJhdDkxX3J0YyIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhdDkxX3J0Y19pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmYXQ5MV9ydGNfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGF0OTFfcnRjX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmYXQ5MV9ydGNfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoYXQ5MV9ydGNfaW5pdCk7Cittb2R1bGVfZXhpdChhdDkxX3J0Y19leGl0KTsKKworTU9EVUxFX0FVVEhPUigiUmljayBCcm9uc29uIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlJUQyBkcml2ZXIgZm9yIEF0bWVsIEFUOTFSTTkyMDAiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1kZXYuYyBiL2RyaXZlcnMvcnRjL3J0Yy1kZXYuYwppbmRleCAyMDExNTY3Li42MWE1ODI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtZGV2LmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLWRldi5jCkBAIC00OCw2ICs0OCw5MyBAQAogCXJldHVybiBlcnI7CiB9CiAKKyNpZmRlZiBDT05GSUdfUlRDX0lOVEZfREVWX1VJRV9FTVVMCisvKgorICogUm91dGluZSB0byBwb2xsIFJUQyBzZWNvbmRzIGZpZWxkIGZvciBjaGFuZ2UgYXMgb2Z0ZW4gYXMgcG9zc2libGUsCisgKiBhZnRlciBmaXJzdCBSVENfVUlFIHVzZSB0aW1lciB0byByZWR1Y2UgcG9sbGluZworICovCitzdGF0aWMgdm9pZCBydGNfdWllX3Rhc2sodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjID0gZGF0YTsKKwlzdHJ1Y3QgcnRjX3RpbWUgdG07CisJaW50IG51bSA9IDA7CisJaW50IGVycjsKKworCWVyciA9IHJ0Y19yZWFkX3RpbWUoJnJ0Yy0+Y2xhc3NfZGV2LCAmdG0pOworCXNwaW5fbG9ja19pcnEoJnJ0Yy0+aXJxX2xvY2spOworCWlmIChydGMtPnN0b3BfdWllX3BvbGxpbmcgfHwgZXJyKSB7CisJCXJ0Yy0+dWllX3Rhc2tfYWN0aXZlID0gMDsKKwl9IGVsc2UgaWYgKHJ0Yy0+b2xkc2VjcyAhPSB0bS50bV9zZWMpIHsKKwkJbnVtID0gKHRtLnRtX3NlYyArIDYwIC0gcnRjLT5vbGRzZWNzKSAlIDYwOworCQlydGMtPm9sZHNlY3MgPSB0bS50bV9zZWM7CisJCXJ0Yy0+dWllX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgSFogLSAoSFovMTApOworCQlydGMtPnVpZV90aW1lcl9hY3RpdmUgPSAxOworCQlydGMtPnVpZV90YXNrX2FjdGl2ZSA9IDA7CisJCWFkZF90aW1lcigmcnRjLT51aWVfdGltZXIpOworCX0gZWxzZSBpZiAoc2NoZWR1bGVfd29yaygmcnRjLT51aWVfdGFzaykgPT0gMCkgeworCQlydGMtPnVpZV90YXNrX2FjdGl2ZSA9IDA7CisJfQorCXNwaW5fdW5sb2NrX2lycSgmcnRjLT5pcnFfbG9jayk7CisJaWYgKG51bSkKKwkJcnRjX3VwZGF0ZV9pcnEoJnJ0Yy0+Y2xhc3NfZGV2LCBudW0sIFJUQ19VRiB8IFJUQ19JUlFGKTsKK30KKworc3RhdGljIHZvaWQgcnRjX3VpZV90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YyA9IChzdHJ1Y3QgcnRjX2RldmljZSAqKWRhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZydGMtPmlycV9sb2NrLCBmbGFncyk7CisJcnRjLT51aWVfdGltZXJfYWN0aXZlID0gMDsKKwlydGMtPnVpZV90YXNrX2FjdGl2ZSA9IDE7CisJaWYgKChzY2hlZHVsZV93b3JrKCZydGMtPnVpZV90YXNrKSA9PSAwKSkKKwkJcnRjLT51aWVfdGFza19hY3RpdmUgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0Yy0+aXJxX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgY2xlYXJfdWllKHN0cnVjdCBydGNfZGV2aWNlICpydGMpCit7CisJc3Bpbl9sb2NrX2lycSgmcnRjLT5pcnFfbG9jayk7CisJaWYgKHJ0Yy0+aXJxX2FjdGl2ZSkgeworCQlydGMtPnN0b3BfdWllX3BvbGxpbmcgPSAxOworCQlpZiAocnRjLT51aWVfdGltZXJfYWN0aXZlKSB7CisJCQlzcGluX3VubG9ja19pcnEoJnJ0Yy0+aXJxX2xvY2spOworCQkJZGVsX3RpbWVyX3N5bmMoJnJ0Yy0+dWllX3RpbWVyKTsKKwkJCXNwaW5fbG9ja19pcnEoJnJ0Yy0+aXJxX2xvY2spOworCQkJcnRjLT51aWVfdGltZXJfYWN0aXZlID0gMDsKKwkJfQorCQlpZiAocnRjLT51aWVfdGFza19hY3RpdmUpIHsKKwkJCXNwaW5fdW5sb2NrX2lycSgmcnRjLT5pcnFfbG9jayk7CisJCQlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworCQkJc3Bpbl9sb2NrX2lycSgmcnRjLT5pcnFfbG9jayk7CisJCX0KKwkJcnRjLT5pcnFfYWN0aXZlID0gMDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZydGMtPmlycV9sb2NrKTsKK30KKworc3RhdGljIGludCBzZXRfdWllKHN0cnVjdCBydGNfZGV2aWNlICpydGMpCit7CisJc3RydWN0IHJ0Y190aW1lIHRtOworCWludCBlcnI7CisKKwllcnIgPSBydGNfcmVhZF90aW1lKCZydGMtPmNsYXNzX2RldiwgJnRtKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCXNwaW5fbG9ja19pcnEoJnJ0Yy0+aXJxX2xvY2spOworCWlmICghcnRjLT5pcnFfYWN0aXZlKSB7CisJCXJ0Yy0+aXJxX2FjdGl2ZSA9IDE7CisJCXJ0Yy0+c3RvcF91aWVfcG9sbGluZyA9IDA7CisJCXJ0Yy0+b2xkc2VjcyA9IHRtLnRtX3NlYzsKKwkJcnRjLT51aWVfdGFza19hY3RpdmUgPSAxOworCQlpZiAoc2NoZWR1bGVfd29yaygmcnRjLT51aWVfdGFzaykgPT0gMCkKKwkJCXJ0Yy0+dWllX3Rhc2tfYWN0aXZlID0gMDsKKwl9CisJcnRjLT5pcnFfZGF0YSA9IDA7CisJc3Bpbl91bmxvY2tfaXJxKCZydGMtPmlycV9sb2NrKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBDT05GSUdfUlRDX0lOVEZfREVWX1VJRV9FTVVMICovCiAKIHN0YXRpYyBzc2l6ZV90CiBydGNfZGV2X3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQpAQCAtMTI3LDYgKzIxNCwyOCBAQAogCXN0cnVjdCBydGNfd2thbHJtIGFsYXJtOwogCXZvaWQgX191c2VyICp1YXJnID0gKHZvaWQgX191c2VyICopIGFyZzsKIAorCS8qIGNoZWNrIHRoYXQgdGhlIGNhbGxlcyBoYXMgYXBwcm9wcmlhdGUgcGVybWlzc2lvbnMKKwkgKiBmb3IgY2VydGFpbiBpb2N0bHMuIGRvaW5nIHRoaXMgY2hlY2sgaGVyZSBpcyB1c2VmdWwKKwkgKiB0byBhdm9pZCBkdXBsaWNhdGUgY29kZSBpbiBlYWNoIGRyaXZlci4KKwkgKi8KKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgUlRDX0VQT0NIX1NFVDoKKwljYXNlIFJUQ19TRVRfVElNRToKKwkJaWYgKCFjYXBhYmxlKENBUF9TWVNfVElNRSkpCisJCQlyZXR1cm4gLUVBQ0NFUzsKKwkJYnJlYWs7CisKKwljYXNlIFJUQ19JUlFQX1NFVDoKKwkJaWYgKGFyZyA+IHJ0Yy0+bWF4X3VzZXJfZnJlcSAmJiAhY2FwYWJsZShDQVBfU1lTX1JFU09VUkNFKSkKKwkJCXJldHVybiAtRUFDQ0VTOworCQlicmVhazsKKworCWNhc2UgUlRDX1BJRV9PTjoKKwkJaWYgKCFjYXBhYmxlKENBUF9TWVNfUkVTT1VSQ0UpKQorCQkJcmV0dXJuIC1FQUNDRVM7CisJCWJyZWFrOworCX0KKwogCS8qIGF2b2lkIGNvbmZsaWN0aW5nIElSUSB1c2VycyAqLwogCWlmIChjbWQgPT0gUlRDX1BJRV9PTiB8fCBjbWQgPT0gUlRDX1BJRV9PRkYgfHwgY21kID09IFJUQ19JUlFQX1NFVCkgewogCQlzcGluX2xvY2soJnJ0Yy0+aXJxX3Rhc2tfbG9jayk7CkBAIC0xODUsOSArMjk0LDYgQEAKIAkJYnJlYWs7CiAKIAljYXNlIFJUQ19TRVRfVElNRToKLQkJaWYgKCFjYXBhYmxlKENBUF9TWVNfVElNRSkpCi0JCQlyZXR1cm4gLUVBQ0NFUzsKLQogCQlpZiAoY29weV9mcm9tX3VzZXIoJnRtLCB1YXJnLCBzaXplb2YodG0pKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCkBAIC0yMDMsMTAgKzMwOSw2IEBACiAJCQllcnIgPSAtRUlOVkFMOwogCQkJYnJlYWs7CiAJCX0KLQkJaWYgKCFjYXBhYmxlKENBUF9TWVNfVElNRSkpIHsKLQkJCWVyciA9IC1FQUNDRVM7Ci0JCQlicmVhazsKLQkJfQogCQlydGNfZXBvY2ggPSBhcmc7CiAJCWVyciA9IDA7CiAjZW5kaWYKQEAgLTIzMiw2ICszMzQsMTQgQEAKIAkJCXJldHVybiAtRUZBVUxUOwogCQlicmVhazsKIAorI2lmZGVmIENPTkZJR19SVENfSU5URl9ERVZfVUlFX0VNVUwKKwljYXNlIFJUQ19VSUVfT0ZGOgorCQljbGVhcl91aWUocnRjKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFJUQ19VSUVfT046CisJCXJldHVybiBzZXRfdWllKHJ0Yyk7CisjZW5kaWYKIAlkZWZhdWx0OgogCQllcnIgPSAtRU5PVFRZOwogCQlicmVhazsKQEAgLTI0NCw2ICszNTQsOSBAQAogewogCXN0cnVjdCBydGNfZGV2aWNlICpydGMgPSB0b19ydGNfZGV2aWNlKGZpbGUtPnByaXZhdGVfZGF0YSk7CiAKKyNpZmRlZiBDT05GSUdfUlRDX0lOVEZfREVWX1VJRV9FTVVMCisJY2xlYXJfdWllKHJ0Yyk7CisjZW5kaWYKIAlpZiAocnRjLT5vcHMtPnJlbGVhc2UpCiAJCXJ0Yy0+b3BzLT5yZWxlYXNlKHJ0Yy0+Y2xhc3NfZGV2LmRldik7CiAKQEAgLTI4NCw2ICszOTcsMTAgQEAKIAltdXRleF9pbml0KCZydGMtPmNoYXJfbG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJnJ0Yy0+aXJxX2xvY2spOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnJ0Yy0+aXJxX3F1ZXVlKTsKKyNpZmRlZiBDT05GSUdfUlRDX0lOVEZfREVWX1VJRV9FTVVMCisJSU5JVF9XT1JLKCZydGMtPnVpZV90YXNrLCBydGNfdWllX3Rhc2ssIHJ0Yyk7CisJc2V0dXBfdGltZXIoJnJ0Yy0+dWllX3RpbWVyLCBydGNfdWllX3RpbWVyLCAodW5zaWduZWQgbG9uZylydGMpOworI2VuZGlmCiAKIAljZGV2X2luaXQoJnJ0Yy0+Y2hhcl9kZXYsICZydGNfZGV2X2ZvcHMpOwogCXJ0Yy0+Y2hhcl9kZXYub3duZXIgPSBydGMtPm93bmVyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLWRzMTMwNy5jIGIvZHJpdmVycy9ydGMvcnRjLWRzMTMwNy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4YWZiOTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3J0Yy9ydGMtZHMxMzA3LmMKQEAgLTAsMCArMSwzODggQEAKKy8qCisgKiBydGMtZHMxMzA3LmMgLSBSVEMgZHJpdmVyIGZvciBzb21lIG1vc3RseS1jb21wYXRpYmxlIEkyQyBjaGlwcy4KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA1IEphbWVzIENoYXBtYW4gKGRzMTMzNyBjb3JlKQorICogIENvcHlyaWdodCAoQykgMjAwNiBEYXZpZCBCcm93bmVsbAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisjaW5jbHVkZSA8bGludXgvYmNkLmg+CisKKworCisvKiBXZSBjYW4ndCBkZXRlcm1pbmUgdHlwZSBieSBwcm9iaW5nLCBidXQgaWYgd2UgZXhwZWN0IHByZS1MaW51eCBjb2RlCisgKiB0byBoYXZlIHNldCB0aGUgY2hpcCB1cCBhcyBhIGNsb2NrICh0dXJuaW5nIG9uIHRoZSBvc2NpbGxhdG9yIGFuZAorICogc2V0dGluZyB0aGUgZGF0ZSBhbmQgdGltZSksIExpbnV4IGNhbiBpZ25vcmUgdGhlIG5vbi1jbG9jayBmZWF0dXJlcy4KKyAqIFRoYXQncyBhIG5hdHVyYWwgam9iIGZvciBhIGZhY3Rvcnkgb3IgcmVwYWlyIGJlbmNoLgorICoKKyAqIElmIHRoZSBJMkMgImZvcmNlIiBtZWNoYW5pc20gaXMgdXNlZCwgd2UgYXNzdW1lIHRoZSBjaGlwIGlzIGEgZHMxMzM3LgorICogKE11Y2ggYmV0dGVyIHdvdWxkIGJlIGJvYXJkLXNwZWNpZmljIHRhYmxlcyBvZiBJMkMgZGV2aWNlcywgYWxvbmcgd2l0aAorICogdGhlIHBsYXRmb3JtX2RhdGEgZHJpdmVycyB3b3VsZCB1c2UgdG8gc29ydCBzdWNoIGlzc3VlcyBvdXQuKQorICovCitlbnVtIGRzX3R5cGUgeworCXVua25vd24gPSAwLAorCWRzXzEzMDcsCQkvKiBvciBkczEzMzgsIC4uLiAqLworCWRzXzEzMzcsCQkvKiBvciBkczEzMzksIC4uLiAqLworCWRzXzEzNDAsCQkvKiBvciBzdCBtNDF0MDAsIC4uLiAqLworCS8vIHJzNWMzNzIgdG9vPyAgZGlmZmVyZW50IGFkZHJlc3MuLi4KK307CisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7IDB4NjgsIEkyQ19DTElFTlRfRU5EIH07CisKK0kyQ19DTElFTlRfSU5TTU9EOworCisKKworLyogUlRDIHJlZ2lzdGVycyBkb24ndCBkaWZmZXIgbXVjaCwgZXhjZXB0IGZvciB0aGUgY2VudHVyeSBmbGFnICovCisjZGVmaW5lIERTMTMwN19SRUdfU0VDUwkJMHgwMAkvKiAwMC01OSAqLworIwlkZWZpbmUgRFMxMzA3X0JJVF9DSAkJMHg4MAorI2RlZmluZSBEUzEzMDdfUkVHX01JTgkJMHgwMQkvKiAwMC01OSAqLworI2RlZmluZSBEUzEzMDdfUkVHX0hPVVIJCTB4MDIJLyogMDAtMjMsIG9yIDEtMTJ7YW0scG19ICovCisjCWRlZmluZSBEUzEzNDBfQklUX0NFTlRVUllfRU4JMHg4MAkvKiBpbiBSRUdfSE9VUiAqLworIwlkZWZpbmUgRFMxMzQwX0JJVF9DRU5UVVJZCTB4NDAJLyogaW4gUkVHX0hPVVIgKi8KKyNkZWZpbmUgRFMxMzA3X1JFR19XREFZCQkweDAzCS8qIDAxLTA3ICovCisjZGVmaW5lIERTMTMwN19SRUdfTURBWQkJMHgwNAkvKiAwMS0zMSAqLworI2RlZmluZSBEUzEzMDdfUkVHX01PTlRICTB4MDUJLyogMDEtMTIgKi8KKyMJZGVmaW5lIERTMTMzN19CSVRfQ0VOVFVSWQkweDgwCS8qIGluIFJFR19NT05USCAqLworI2RlZmluZSBEUzEzMDdfUkVHX1lFQVIJCTB4MDYJLyogMDAtOTkgKi8KKworLyogT3RoZXIgcmVnaXN0ZXJzIChjb250cm9sLCBzdGF0dXMsIGFsYXJtcywgdHJpY2tsZSBjaGFyZ2UsIE5WUkFNLCBldGMpCisgKiBzdGFydCBhdCA3LCBhbmQgdGhleSBkaWZmZXIgYSBsb3QuIE9ubHkgY29udHJvbCBhbmQgc3RhdHVzIG1hdHRlciBmb3IgUlRDOworICogYmUgY2FyZWZ1bCB1c2luZyB0aGVtLgorICovCisjZGVmaW5lIERTMTMwN19SRUdfQ09OVFJPTAkweDA3CisjCWRlZmluZSBEUzEzMDdfQklUX09VVAkJMHg4MAorIwlkZWZpbmUgRFMxMzA3X0JJVF9TUVdFCQkweDEwCisjCWRlZmluZSBEUzEzMDdfQklUX1JTMQkJMHgwMgorIwlkZWZpbmUgRFMxMzA3X0JJVF9SUzAJCTB4MDEKKyNkZWZpbmUgRFMxMzM3X1JFR19DT05UUk9MCTB4MGUKKyMJZGVmaW5lIERTMTMzN19CSVRfbkVPU0MJCTB4ODAKKyMJZGVmaW5lIERTMTMzN19CSVRfUlMyCQkweDEwCisjCWRlZmluZSBEUzEzMzdfQklUX1JTMQkJMHgwOAorIwlkZWZpbmUgRFMxMzM3X0JJVF9JTlRDTgkJMHgwNAorIwlkZWZpbmUgRFMxMzM3X0JJVF9BMklFCQkweDAyCisjCWRlZmluZSBEUzEzMzdfQklUX0ExSUUJCTB4MDEKKyNkZWZpbmUgRFMxMzM3X1JFR19TVEFUVVMJMHgwZgorIwlkZWZpbmUgRFMxMzM3X0JJVF9PU0YJCTB4ODAKKyMJZGVmaW5lIERTMTMzN19CSVRfQTJJCQkweDAyCisjCWRlZmluZSBEUzEzMzdfQklUX0ExSQkJMHgwMQorI2RlZmluZSBEUzEzMzlfUkVHX1RSSUNLTEUJMHgxMAorCisKKworc3RydWN0IGRzMTMwNyB7CisJdTgJCQlyZWdfYWRkcjsKKwl1OAkJCXJlZ3NbOF07CisJZW51bSBkc190eXBlCQl0eXBlOworCXN0cnVjdCBpMmNfbXNnCQltc2dbMl07CisJc3RydWN0IGkyY19jbGllbnQJY2xpZW50OworCXN0cnVjdCBydGNfZGV2aWNlCSpydGM7Cit9OworCisKK3N0YXRpYyBpbnQgZHMxMzA3X2dldF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0KQoreworCXN0cnVjdCBkczEzMDcJKmRzMTMwNyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludAkJdG1wOworCisJLyogcmVhZCB0aGUgUlRDIHJlZ2lzdGVycyBhbGwgYXQgb25jZSAqLworCWRzMTMwNy0+bXNnWzFdLmZsYWdzID0gSTJDX01fUkQ7CisJZHMxMzA3LT5tc2dbMV0ubGVuID0gNzsKKworCXRtcCA9IGkyY190cmFuc2ZlcihkczEzMDctPmNsaWVudC5hZGFwdGVyLCBkczEzMDctPm1zZywgMik7CisJaWYgKHRtcCAhPSAyKSB7CisJCWRldl9lcnIoZGV2LCAiJXMgZXJyb3IgJWRcbiIsICJyZWFkIiwgdG1wKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJZGV2X2RiZyhkZXYsICIlczogJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKKwkJCSJyZWFkIiwKKwkJCWRzMTMwNy0+cmVnc1swXSwgZHMxMzA3LT5yZWdzWzFdLAorCQkJZHMxMzA3LT5yZWdzWzJdLCBkczEzMDctPnJlZ3NbM10sCisJCQlkczEzMDctPnJlZ3NbNF0sIGRzMTMwNy0+cmVnc1s1XSwKKwkJCWRzMTMwNy0+cmVnc1s2XSk7CisKKwl0LT50bV9zZWMgPSBCQ0QyQklOKGRzMTMwNy0+cmVnc1tEUzEzMDdfUkVHX1NFQ1NdICYgMHg3Zik7CisJdC0+dG1fbWluID0gQkNEMkJJTihkczEzMDctPnJlZ3NbRFMxMzA3X1JFR19NSU5dICYgMHg3Zik7CisJdG1wID0gZHMxMzA3LT5yZWdzW0RTMTMwN19SRUdfSE9VUl0gJiAweDNmOworCXQtPnRtX2hvdXIgPSBCQ0QyQklOKHRtcCk7CisJdC0+dG1fd2RheSA9IEJDRDJCSU4oZHMxMzA3LT5yZWdzW0RTMTMwN19SRUdfV0RBWV0gJiAweDA3KSAtIDE7CisJdC0+dG1fbWRheSA9IEJDRDJCSU4oZHMxMzA3LT5yZWdzW0RTMTMwN19SRUdfTURBWV0gJiAweDNmKTsKKwl0bXAgPSBkczEzMDctPnJlZ3NbRFMxMzA3X1JFR19NT05USF0gJiAweDFmOworCXQtPnRtX21vbiA9IEJDRDJCSU4odG1wKSAtIDE7CisKKwkvKiBhc3N1bWUgMjBZWSBub3QgMTlZWSwgYW5kIGlnbm9yZSBEUzEzMzdfQklUX0NFTlRVUlkgKi8KKwl0LT50bV95ZWFyID0gQkNEMkJJTihkczEzMDctPnJlZ3NbRFMxMzA3X1JFR19ZRUFSXSkgKyAxMDA7CisKKwlkZXZfZGJnKGRldiwgIiVzIHNlY3M9JWQsIG1pbnM9JWQsICIKKwkJImhvdXJzPSVkLCBtZGF5PSVkLCBtb249JWQsIHllYXI9JWQsIHdkYXk9JWRcbiIsCisJCSJyZWFkIiwgdC0+dG1fc2VjLCB0LT50bV9taW4sCisJCXQtPnRtX2hvdXIsIHQtPnRtX21kYXksCisJCXQtPnRtX21vbiwgdC0+dG1feWVhciwgdC0+dG1fd2RheSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkczEzMDdfc2V0X3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnQpCit7CisJc3RydWN0IGRzMTMwNwkqZHMxMzA3ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50CQlyZXN1bHQ7CisJaW50CQl0bXA7CisJdTgJCSpidWYgPSBkczEzMDctPnJlZ3M7CisKKwlkZXZfZGJnKGRldiwgIiVzIHNlY3M9JWQsIG1pbnM9JWQsICIKKwkJImhvdXJzPSVkLCBtZGF5PSVkLCBtb249JWQsIHllYXI9JWQsIHdkYXk9JWRcbiIsCisJCSJ3cml0ZSIsIGR0LT50bV9zZWMsIGR0LT50bV9taW4sCisJCWR0LT50bV9ob3VyLCBkdC0+dG1fbWRheSwKKwkJZHQtPnRtX21vbiwgZHQtPnRtX3llYXIsIGR0LT50bV93ZGF5KTsKKworCSpidWYrKyA9IDA7CQkvKiBmaXJzdCByZWdpc3RlciBhZGRyICovCisJYnVmW0RTMTMwN19SRUdfU0VDU10gPSBCSU4yQkNEKHQtPnRtX3NlYyk7CisJYnVmW0RTMTMwN19SRUdfTUlOXSA9IEJJTjJCQ0QodC0+dG1fbWluKTsKKwlidWZbRFMxMzA3X1JFR19IT1VSXSA9IEJJTjJCQ0QodC0+dG1faG91cik7CisJYnVmW0RTMTMwN19SRUdfV0RBWV0gPSBCSU4yQkNEKHQtPnRtX3dkYXkgKyAxKTsKKwlidWZbRFMxMzA3X1JFR19NREFZXSA9IEJJTjJCQ0QodC0+dG1fbWRheSk7CisJYnVmW0RTMTMwN19SRUdfTU9OVEhdID0gQklOMkJDRCh0LT50bV9tb24gKyAxKTsKKworCS8qIGFzc3VtZSAyMFlZIG5vdCAxOVlZICovCisJdG1wID0gdC0+dG1feWVhciAtIDEwMDsKKwlidWZbRFMxMzA3X1JFR19ZRUFSXSA9IEJJTjJCQ0QodG1wKTsKKworCWlmIChkczEzMDctPnR5cGUgPT0gZHNfMTMzNykKKwkJYnVmW0RTMTMwN19SRUdfTU9OVEhdIHw9IERTMTMzN19CSVRfQ0VOVFVSWTsKKwllbHNlIGlmIChkczEzMDctPnR5cGUgPT0gZHNfMTM0MCkKKwkJYnVmW0RTMTMwN19SRUdfSE9VUl0gfD0gRFMxMzQwX0JJVF9DRU5UVVJZX0VOCisJCQkJfCBEUzEzNDBfQklUX0NFTlRVUlk7CisKKwlkczEzMDctPm1zZ1sxXS5mbGFncyA9IDA7CisJZHMxMzA3LT5tc2dbMV0ubGVuID0gODsKKworCWRldl9kYmcoZGV2LCAiJXM6ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsCisJCSJ3cml0ZSIsIGJ1ZlswXSwgYnVmWzFdLCBidWZbMl0sIGJ1ZlszXSwKKwkJYnVmWzRdLCBidWZbNV0sIGJ1Zls2XSk7CisKKwlyZXN1bHQgPSBpMmNfdHJhbnNmZXIoZHMxMzA3LT5jbGllbnQuYWRhcHRlciwgJmRzMTMwNy0+bXNnWzFdLCAxKTsKKwlpZiAocmVzdWx0ICE9IDEpIHsKKwkJZGV2X2VycihkZXYsICIlcyBlcnJvciAlZFxuIiwgIndyaXRlIiwgdG1wKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHJ0Y19jbGFzc19vcHMgZHMxM3h4X3J0Y19vcHMgPSB7CisJLnJlYWRfdGltZQk9IGRzMTMwN19nZXRfdGltZSwKKwkuc2V0X3RpbWUJPSBkczEzMDdfc2V0X3RpbWUsCit9OworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgZHMxMzA3X2RyaXZlcjsKKworc3RhdGljIGludCBfX2RldmluaXQKK2RzMTMwN19kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywgaW50IGtpbmQpCit7CisJc3RydWN0IGRzMTMwNwkJKmRzMTMwNzsKKwlpbnQJCQllcnIgPSAtRU5PREVWOworCXN0cnVjdCBpMmNfY2xpZW50CSpjbGllbnQ7CisJaW50CQkJdG1wOworCisJaWYgKCEoZHMxMzA3ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRzMTMwNyksIEdGUF9LRVJORUwpKSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGV4aXQ7CisJfQorCisJY2xpZW50ID0gJmRzMTMwNy0+Y2xpZW50OworCWNsaWVudC0+YWRkciA9IGFkZHJlc3M7CisJY2xpZW50LT5hZGFwdGVyID0gYWRhcHRlcjsKKwljbGllbnQtPmRyaXZlciA9ICZkczEzMDdfZHJpdmVyOworCWNsaWVudC0+ZmxhZ3MgPSAwOworCisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgZHMxMzA3KTsKKworCWRzMTMwNy0+bXNnWzBdLmFkZHIgPSBjbGllbnQtPmFkZHI7CisJZHMxMzA3LT5tc2dbMF0uZmxhZ3MgPSAwOworCWRzMTMwNy0+bXNnWzBdLmxlbiA9IDE7CisJZHMxMzA3LT5tc2dbMF0uYnVmID0gJmRzMTMwNy0+cmVnX2FkZHI7CisKKwlkczEzMDctPm1zZ1sxXS5hZGRyID0gY2xpZW50LT5hZGRyOworCWRzMTMwNy0+bXNnWzFdLmZsYWdzID0gSTJDX01fUkQ7CisJZHMxMzA3LT5tc2dbMV0ubGVuID0gc2l6ZW9mKGRzMTMwNy0+cmVncyk7CisJZHMxMzA3LT5tc2dbMV0uYnVmID0gZHMxMzA3LT5yZWdzOworCisJLyogSEFDSzogImZvcmNlIiBpbXBsaWVzICJuZWVkcyBkczEzMzctc3R5bGUtb3NjaWxsYXRvciBzZXR1cCIgKi8KKwlpZiAoa2luZCA+PSAwKSB7CisJCWRzMTMwNy0+dHlwZSA9IGRzXzEzMzc7CisKKwkJZHMxMzA3LT5yZWdfYWRkciA9IERTMTMzN19SRUdfQ09OVFJPTDsKKwkJZHMxMzA3LT5tc2dbMV0ubGVuID0gMjsKKworCQl0bXAgPSBpMmNfdHJhbnNmZXIoY2xpZW50LT5hZGFwdGVyLCBkczEzMDctPm1zZywgMik7CisJCWlmICh0bXAgIT0gMikgeworCQkJcHJfZGVidWcoInJlYWQgZXJyb3IgJWRcbiIsIHRtcCk7CisJCQllcnIgPSAtRUlPOworCQkJZ290byBleGl0X2ZyZWU7CisJCX0KKworCQlkczEzMDctPnJlZ19hZGRyID0gMDsKKwkJZHMxMzA3LT5tc2dbMV0ubGVuID0gc2l6ZW9mKGRzMTMwNy0+cmVncyk7CisKKwkJLyogb3NjaWxsYXRvciBpcyBvZmY7IG5lZWQgdG8gdHVybiBpdCBvbiAqLworCQlpZiAoKGRzMTMwNy0+cmVnc1swXSAmIERTMTMzN19CSVRfbkVPU0MpCisJCQkJfHwgKGRzMTMwNy0+cmVnc1sxXSAmIERTMTMzN19CSVRfT1NGKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJubyBkczEzMzcgb3NjaWxsYXRvciBjb2RlXG4iKTsKKwkJCWdvdG8gZXhpdF9mcmVlOworCQl9CisJfSBlbHNlCisJCWRzMTMwNy0+dHlwZSA9IGRzXzEzMDc7CisKK3JlYWRfcnRjOgorCS8qIHJlYWQgUlRDIHJlZ2lzdGVycyAqLworCisJdG1wID0gaTJjX3RyYW5zZmVyKGNsaWVudC0+YWRhcHRlciwgZHMxMzA3LT5tc2csIDIpOworCWlmICh0bXAgIT0gMikgeworCQlwcl9kZWJ1ZygicmVhZCBlcnJvciAlZFxuIiwgdG1wKTsKKwkJZXJyID0gLUVJTzsKKwkJZ290byBleGl0X2ZyZWU7CisJfQorCisJLyogbWluaW1hbCBzYW5pdHkgY2hlY2tpbmc7IHNvbWUgY2hpcHMgKGxpa2UgRFMxMzQwKSBkb24ndAorCSAqIHNwZWNpZnkgdGhlIGV4dHJhIGJpdHMgYXMgbXVzdC1iZS16ZXJvLCBidXQgdGhlcmUgYXJlCisJICogc3RpbGwgYSBmZXcgdmFsdWVzIHRoYXQgYXJlIGNsZWFybHkgb3V0LW9mLXJhbmdlLgorCSAqLworCXRtcCA9IGRzMTMwNy0+cmVnc1tEUzEzMDdfUkVHX1NFQ1NdOworCWlmICh0bXAgJiBEUzEzMDdfQklUX0NIKSB7CisJCWlmIChkczEzMDctPnR5cGUgJiYgZHMxMzA3LT50eXBlICE9IGRzXzEzMDcpIHsKKwkJCXByX2RlYnVnKCJub3QgYSBkczEzMDc/XG4iKTsKKwkJCWdvdG8gZXhpdF9mcmVlOworCQl9CisJCWRzMTMwNy0+dHlwZSA9IGRzXzEzMDc7CisKKwkJLyogdGhpcyBwYXJ0aWFsIGluaXRpYWxpemF0aW9uIHNob3VsZCB3b3JrIGZvciBkczEzMDcsCisJCSAqIGRzMTMzOCwgZHMxMzQwLCBzdCBtNDF0MDAsIGFuZCBtb3JlLgorCQkgKi8KKwkJZGV2X3dhcm4oJmNsaWVudC0+ZGV2LCAib3NjaWxsYXRvciBzdGFydGVkOyBTRVQgVElNRSFcbiIpOworCQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgMCwgMCk7CisJCWdvdG8gcmVhZF9ydGM7CisJfQorCXRtcCA9IEJDRDJCSU4odG1wICYgMHg3Zik7CisJaWYgKHRtcCA+IDYwKQorCQlnb3RvIGV4aXRfZnJlZTsKKwl0bXAgPSBCQ0QyQklOKGRzMTMwNy0+cmVnc1tEUzEzMDdfUkVHX01JTl0gJiAweDdmKTsKKwlpZiAodG1wID4gNjApCisJCWdvdG8gZXhpdF9mcmVlOworCisJdG1wID0gQkNEMkJJTihkczEzMDctPnJlZ3NbRFMxMzA3X1JFR19NREFZXSAmIDB4M2YpOworCWlmICh0bXAgPT0gMCB8fCB0bXAgPiAzMSkKKwkJZ290byBleGl0X2ZyZWU7CisKKwl0bXAgPSBCQ0QyQklOKGRzMTMwNy0+cmVnc1tEUzEzMDdfUkVHX01PTlRIXSAmIDB4MWYpOworCWlmICh0bXAgPT0gMCB8fCB0bXAgPiAxMikKKwkJZ290byBleGl0X2ZyZWU7CisKKwkvKiBmb3JjZSBpbnRvIGluIDI0IGhvdXIgbW9kZSAobW9zdCBjaGlwcykgb3IKKwkgKiBkaXNhYmxlIGNlbnR1cnkgYml0IChkczEzNDApCisJICovCisJdG1wID0gZHMxMzA3LT5yZWdzW0RTMTMwN19SRUdfSE9VUl07CisJaWYgKHRtcCAmICgxIDw8IDYpKSB7CisJCWlmICh0bXAgJiAoMSA8PCA1KSkKKwkJCXRtcCA9IEJDRDJCSU4odG1wICYgMHgxZikgKyAxMjsKKwkJZWxzZQorCQkJdG1wID0gQkNEMkJJTih0bXApOworCQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCQlEUzEzMDdfUkVHX0hPVVIsCisJCQkJQklOMkJDRCh0bXApKTsKKwl9CisKKwkvKiBGSVhNRSBjaGlwcyBsaWtlIDEzMzcgY2FuIGdlbmVyYXRlIGFsYXJtIGlycXMgdG9vOyB0aG9zZSBhcmUKKwkgKiB3b3J0aCBleHBvc2luZyB0aHJvdWdoIHRoZSBBUEkgKGVzcGVjaWFsbHkgd2hlbiB0aGUgaXJxIGlzCisJICogd2FrZXVwLWNhcGFibGUpLgorCSAqLworCisJc3dpdGNoIChkczEzMDctPnR5cGUpIHsKKwljYXNlIHVua25vd246CisJCXN0cmxjcHkoY2xpZW50LT5uYW1lLCAidW5rbm93biIsIEkyQ19OQU1FX1NJWkUpOworCQlicmVhazsKKwljYXNlIGRzXzEzMDc6CisJCXN0cmxjcHkoY2xpZW50LT5uYW1lLCAiZHMxMzA3IiwgSTJDX05BTUVfU0laRSk7CisJCWJyZWFrOworCWNhc2UgZHNfMTMzNzoKKwkJc3RybGNweShjbGllbnQtPm5hbWUsICJkczEzMzciLCBJMkNfTkFNRV9TSVpFKTsKKwkJYnJlYWs7CisJY2FzZSBkc18xMzQwOgorCQlzdHJsY3B5KGNsaWVudC0+bmFtZSwgImRzMTM0MCIsIEkyQ19OQU1FX1NJWkUpOworCQlicmVhazsKKwl9CisKKwkvKiBUZWxsIHRoZSBJMkMgbGF5ZXIgYSBuZXcgY2xpZW50IGhhcyBhcnJpdmVkICovCisJaWYgKChlcnIgPSBpMmNfYXR0YWNoX2NsaWVudChjbGllbnQpKSkKKwkJZ290byBleGl0X2ZyZWU7CisKKwlkczEzMDctPnJ0YyA9IHJ0Y19kZXZpY2VfcmVnaXN0ZXIoY2xpZW50LT5uYW1lLCAmY2xpZW50LT5kZXYsCisJCQkJJmRzMTN4eF9ydGNfb3BzLCBUSElTX01PRFVMRSk7CisJaWYgKElTX0VSUihkczEzMDctPnJ0YykpIHsKKwkJZXJyID0gUFRSX0VSUihkczEzMDctPnJ0Yyk7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LAorCQkJInVuYWJsZSB0byByZWdpc3RlciB0aGUgY2xhc3MgZGV2aWNlXG4iKTsKKwkJZ290byBleGl0X2RldGFjaDsKKwl9CisKKwlyZXR1cm4gMDsKKworZXhpdF9kZXRhY2g6CisJaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KTsKK2V4aXRfZnJlZToKKwlrZnJlZShkczEzMDcpOworZXhpdDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdAorZHMxMzA3X2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX0kyQykpCisJCXJldHVybiAwOworCXJldHVybiBpMmNfcHJvYmUoYWRhcHRlciwgJmFkZHJfZGF0YSwgZHMxMzA3X2RldGVjdCk7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGRzMTMwN19kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJaW50CQllcnI7CisJc3RydWN0IGRzMTMwNwkqZHMxMzA3ID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlydGNfZGV2aWNlX3VucmVnaXN0ZXIoZHMxMzA3LT5ydGMpOworCWlmICgoZXJyID0gaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KSkpCisJCXJldHVybiBlcnI7CisJa2ZyZWUoZHMxMzA3KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGRzMTMwN19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUJPSAiZHMxMzA3IiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKKwkuYXR0YWNoX2FkYXB0ZXIJPSBkczEzMDdfYXR0YWNoX2FkYXB0ZXIsCisJLmRldGFjaF9jbGllbnQJPSBfX2RldmV4aXRfcChkczEzMDdfZGV0YWNoX2NsaWVudCksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBkczEzMDdfaW5pdCh2b2lkKQoreworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmZHMxMzA3X2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChkczEzMDdfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkczEzMDdfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZkczEzMDdfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGRzMTMwN19leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJSVEMgZHJpdmVyIGZvciBEUzEzMDcgYW5kIHNpbWlsYXIgY2hpcHMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1kczE1NTMuYyBiL2RyaXZlcnMvcnRjL3J0Yy1kczE1NTMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2FmYmFkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ydGMvcnRjLWRzMTU1My5jCkBAIC0wLDAgKzEsNDE0IEBACisvKgorICogQW4gcnRjIGRyaXZlciBmb3IgdGhlIERhbGxhcyBEUzE1NTMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgQXRzdXNoaSBOZW1vdG8gPGFuZW1vQG1iYS5vY24ubmUuanA+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvYmNkLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisKKyNkZWZpbmUgRFJWX1ZFUlNJT04gIjAuMSIKKworI2RlZmluZSBSVENfUkVHX1NJWkUJCTB4MjAwMAorI2RlZmluZSBSVENfT0ZGU0VUCQkweDFmZjAKKworI2RlZmluZSBSVENfRkxBR1MJCShSVENfT0ZGU0VUICsgMCkKKyNkZWZpbmUgUlRDX1NFQ09ORFNfQUxBUk0JKFJUQ19PRkZTRVQgKyAyKQorI2RlZmluZSBSVENfTUlOVVRFU19BTEFSTQkoUlRDX09GRlNFVCArIDMpCisjZGVmaW5lIFJUQ19IT1VSU19BTEFSTQkJKFJUQ19PRkZTRVQgKyA0KQorI2RlZmluZSBSVENfREFURV9BTEFSTQkJKFJUQ19PRkZTRVQgKyA1KQorI2RlZmluZSBSVENfSU5URVJSVVBUUwkJKFJUQ19PRkZTRVQgKyA2KQorI2RlZmluZSBSVENfV0FUQ0hET0cJCShSVENfT0ZGU0VUICsgNykKKyNkZWZpbmUgUlRDX0NPTlRST0wJCShSVENfT0ZGU0VUICsgOCkKKyNkZWZpbmUgUlRDX0NFTlRVUlkJCShSVENfT0ZGU0VUICsgOCkKKyNkZWZpbmUgUlRDX1NFQ09ORFMJCShSVENfT0ZGU0VUICsgOSkKKyNkZWZpbmUgUlRDX01JTlVURVMJCShSVENfT0ZGU0VUICsgMTApCisjZGVmaW5lIFJUQ19IT1VSUwkJKFJUQ19PRkZTRVQgKyAxMSkKKyNkZWZpbmUgUlRDX0RBWQkJCShSVENfT0ZGU0VUICsgMTIpCisjZGVmaW5lIFJUQ19EQVRFCQkoUlRDX09GRlNFVCArIDEzKQorI2RlZmluZSBSVENfTU9OVEgJCShSVENfT0ZGU0VUICsgMTQpCisjZGVmaW5lIFJUQ19ZRUFSCQkoUlRDX09GRlNFVCArIDE1KQorCisjZGVmaW5lIFJUQ19DRU5UVVJZX01BU0sJMHgzZgorI2RlZmluZSBSVENfU0VDT05EU19NQVNLCTB4N2YKKyNkZWZpbmUgUlRDX0RBWV9NQVNLCQkweDA3CisKKy8qIEJpdHMgaW4gdGhlIENvbnRyb2wvQ2VudHVyeSByZWdpc3RlciAqLworI2RlZmluZSBSVENfV1JJVEUJCTB4ODAKKyNkZWZpbmUgUlRDX1JFQUQJCTB4NDAKKworLyogQml0cyBpbiB0aGUgU2Vjb25kcyByZWdpc3RlciAqLworI2RlZmluZSBSVENfU1RPUAkJMHg4MAorCisvKiBCaXRzIGluIHRoZSBGbGFncyByZWdpc3RlciAqLworI2RlZmluZSBSVENfRkxBR1NfQUYJCTB4NDAKKyNkZWZpbmUgUlRDX0ZMQUdTX0JMRgkJMHgxMAorCisvKiBCaXRzIGluIHRoZSBJbnRlcnJ1cHRzIHJlZ2lzdGVyICovCisjZGVmaW5lIFJUQ19JTlRTX0FFCQkweDgwCisKK3N0cnVjdCBydGNfcGxhdF9kYXRhIHsKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjOworCXZvaWQgX19pb21lbSAqaW9hZGRyOworCXVuc2lnbmVkIGxvbmcgYmFzZWFkZHI7CisJdW5zaWduZWQgbG9uZyBsYXN0X2ppZmZpZXM7CisJaW50IGlycTsKKwl1bnNpZ25lZCBpbnQgaXJxZW47CisJaW50IGFscm1fc2VjOworCWludCBhbHJtX21pbjsKKwlpbnQgYWxybV9ob3VyOworCWludCBhbHJtX21kYXk7Cit9OworCitzdGF0aWMgaW50IGRzMTU1M19ydGNfc2V0X3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgcnRjX3BsYXRfZGF0YSAqcGRhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHBkYXRhLT5pb2FkZHI7CisJdTggY2VudHVyeTsKKworCWNlbnR1cnkgPSBCSU4yQkNEKCh0bS0+dG1feWVhciArIDE5MDApIC8gMTAwKTsKKworCXdyaXRlYihSVENfV1JJVEUsIHBkYXRhLT5pb2FkZHIgKyBSVENfQ09OVFJPTCk7CisKKwl3cml0ZWIoQklOMkJDRCh0bS0+dG1feWVhciAlIDEwMCksIGlvYWRkciArIFJUQ19ZRUFSKTsKKwl3cml0ZWIoQklOMkJDRCh0bS0+dG1fbW9uICsgMSksIGlvYWRkciArIFJUQ19NT05USCk7CisJd3JpdGViKEJJTjJCQ0QodG0tPnRtX3dkYXkpICYgUlRDX0RBWV9NQVNLLCBpb2FkZHIgKyBSVENfREFZKTsKKwl3cml0ZWIoQklOMkJDRCh0bS0+dG1fbWRheSksIGlvYWRkciArIFJUQ19EQVRFKTsKKwl3cml0ZWIoQklOMkJDRCh0bS0+dG1faG91ciksIGlvYWRkciArIFJUQ19IT1VSUyk7CisJd3JpdGViKEJJTjJCQ0QodG0tPnRtX21pbiksIGlvYWRkciArIFJUQ19NSU5VVEVTKTsKKwl3cml0ZWIoQklOMkJDRCh0bS0+dG1fc2VjKSAmIFJUQ19TRUNPTkRTX01BU0ssIGlvYWRkciArIFJUQ19TRUNPTkRTKTsKKworCS8qIFJUQ19DRU5UVVJZIGFuZCBSVENfQ09OVFJPTCBzaGFyZSBzYW1lIHJlZ2lzdGVyICovCisJd3JpdGViKFJUQ19XUklURSB8IChjZW50dXJ5ICYgUlRDX0NFTlRVUllfTUFTSyksIGlvYWRkciArIFJUQ19DRU5UVVJZKTsKKwl3cml0ZWIoY2VudHVyeSAmIFJUQ19DRU5UVVJZX01BU0ssIGlvYWRkciArIFJUQ19DT05UUk9MKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkczE1NTNfcnRjX3JlYWRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBydGNfcGxhdF9kYXRhICpwZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gcGRhdGEtPmlvYWRkcjsKKwl1bnNpZ25lZCBpbnQgeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmQsIHdlZWs7CisJdW5zaWduZWQgaW50IGNlbnR1cnk7CisKKwkvKiBnaXZlIGVub3VnaCB0aW1lIHRvIHVwZGF0ZSBSVEMgaW4gY2FzZSBvZiBjb250aW51b3VzIHJlYWQgKi8KKwlpZiAocGRhdGEtPmxhc3RfamlmZmllcyA9PSBqaWZmaWVzKQorCQltc2xlZXAoMSk7CisJcGRhdGEtPmxhc3RfamlmZmllcyA9IGppZmZpZXM7CisJd3JpdGViKFJUQ19SRUFELCBpb2FkZHIgKyBSVENfQ09OVFJPTCk7CisJc2Vjb25kID0gcmVhZGIoaW9hZGRyICsgUlRDX1NFQ09ORFMpICYgUlRDX1NFQ09ORFNfTUFTSzsKKwltaW51dGUgPSByZWFkYihpb2FkZHIgKyBSVENfTUlOVVRFUyk7CisJaG91ciA9IHJlYWRiKGlvYWRkciArIFJUQ19IT1VSUyk7CisJZGF5ID0gcmVhZGIoaW9hZGRyICsgUlRDX0RBVEUpOworCXdlZWsgPSByZWFkYihpb2FkZHIgKyBSVENfREFZKSAmIFJUQ19EQVlfTUFTSzsKKwltb250aCA9IHJlYWRiKGlvYWRkciArIFJUQ19NT05USCk7CisJeWVhciA9IHJlYWRiKGlvYWRkciArIFJUQ19ZRUFSKTsKKwljZW50dXJ5ID0gcmVhZGIoaW9hZGRyICsgUlRDX0NFTlRVUlkpICYgUlRDX0NFTlRVUllfTUFTSzsKKwl3cml0ZWIoMCwgaW9hZGRyICsgUlRDX0NPTlRST0wpOworCXRtLT50bV9zZWMgPSBCQ0QyQklOKHNlY29uZCk7CisJdG0tPnRtX21pbiA9IEJDRDJCSU4obWludXRlKTsKKwl0bS0+dG1faG91ciA9IEJDRDJCSU4oaG91cik7CisJdG0tPnRtX21kYXkgPSBCQ0QyQklOKGRheSk7CisJdG0tPnRtX3dkYXkgPSBCQ0QyQklOKHdlZWspOworCXRtLT50bV9tb24gPSBCQ0QyQklOKG1vbnRoKSAtIDE7CisJLyogeWVhciBpcyAxOTAwICsgdG0tPnRtX3llYXIgKi8KKwl0bS0+dG1feWVhciA9IEJDRDJCSU4oeWVhcikgKyBCQ0QyQklOKGNlbnR1cnkpICogMTAwIC0gMTkwMDsKKworCWlmIChydGNfdmFsaWRfdG0odG0pIDwgMCkgeworCQlkZXZfZXJyKGRldiwgInJldHJpZXZlZCBkYXRlL3RpbWUgaXMgbm90IHZhbGlkLlxuIik7CisJCXJ0Y190aW1lX3RvX3RtKDAsIHRtKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRzMTU1M19ydGNfdXBkYXRlX2FsYXJtKHN0cnVjdCBydGNfcGxhdF9kYXRhICpwZGF0YSkKK3sKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHBkYXRhLT5pb2FkZHI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwZGF0YS0+cnRjLT5pcnFfbG9jaywgZmxhZ3MpOworCXdyaXRlYihwZGF0YS0+YWxybV9tZGF5IDwgMCB8fCAocGRhdGEtPmlycWVuICYgUlRDX1VGKSA/CisJICAgICAgIDB4ODAgOiBCSU4yQkNEKHBkYXRhLT5hbHJtX21kYXkpLAorCSAgICAgICBpb2FkZHIgKyBSVENfREFURV9BTEFSTSk7CisJd3JpdGViKHBkYXRhLT5hbHJtX2hvdXIgPCAwIHx8IChwZGF0YS0+aXJxZW4gJiBSVENfVUYpID8KKwkgICAgICAgMHg4MCA6IEJJTjJCQ0QocGRhdGEtPmFscm1faG91ciksCisJICAgICAgIGlvYWRkciArIFJUQ19IT1VSU19BTEFSTSk7CisJd3JpdGViKHBkYXRhLT5hbHJtX21pbiA8IDAgfHwgKHBkYXRhLT5pcnFlbiAmIFJUQ19VRikgPworCSAgICAgICAweDgwIDogQklOMkJDRChwZGF0YS0+YWxybV9taW4pLAorCSAgICAgICBpb2FkZHIgKyBSVENfTUlOVVRFU19BTEFSTSk7CisJd3JpdGViKHBkYXRhLT5hbHJtX3NlYyA8IDAgfHwgKHBkYXRhLT5pcnFlbiAmIFJUQ19VRikgPworCSAgICAgICAweDgwIDogQklOMkJDRChwZGF0YS0+YWxybV9zZWMpLAorCSAgICAgICBpb2FkZHIgKyBSVENfU0VDT05EU19BTEFSTSk7CisJd3JpdGViKHBkYXRhLT5pcnFlbiA/IFJUQ19JTlRTX0FFIDogMCwgaW9hZGRyICsgUlRDX0lOVEVSUlVQVFMpOworCXJlYWRiKGlvYWRkciArIFJUQ19GTEFHUyk7CS8qIGNsZWFyIGludGVycnVwdHMgKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZGF0YS0+cnRjLT5pcnFfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IGRzMTU1M19ydGNfc2V0X2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKmFscm0pCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBydGNfcGxhdF9kYXRhICpwZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJaWYgKHBkYXRhLT5pcnEgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlwZGF0YS0+YWxybV9tZGF5ID0gYWxybS0+dGltZS50bV9tZGF5OworCXBkYXRhLT5hbHJtX2hvdXIgPSBhbHJtLT50aW1lLnRtX2hvdXI7CisJcGRhdGEtPmFscm1fbWluID0gYWxybS0+dGltZS50bV9taW47CisJcGRhdGEtPmFscm1fc2VjID0gYWxybS0+dGltZS50bV9zZWM7CisJaWYgKGFscm0tPmVuYWJsZWQpCisJCXBkYXRhLT5pcnFlbiB8PSBSVENfQUY7CisJZHMxNTUzX3J0Y191cGRhdGVfYWxhcm0ocGRhdGEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRzMTU1M19ydGNfcmVhZF9hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICphbHJtKQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgcnRjX3BsYXRfZGF0YSAqcGRhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWlmIChwZGF0YS0+aXJxIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJYWxybS0+dGltZS50bV9tZGF5ID0gcGRhdGEtPmFscm1fbWRheSA8IDAgPyAwIDogcGRhdGEtPmFscm1fbWRheTsKKwlhbHJtLT50aW1lLnRtX2hvdXIgPSBwZGF0YS0+YWxybV9ob3VyIDwgMCA/IDAgOiBwZGF0YS0+YWxybV9ob3VyOworCWFscm0tPnRpbWUudG1fbWluID0gcGRhdGEtPmFscm1fbWluIDwgMCA/IDAgOiBwZGF0YS0+YWxybV9taW47CisJYWxybS0+dGltZS50bV9zZWMgPSBwZGF0YS0+YWxybV9zZWMgPCAwID8gMCA6IHBkYXRhLT5hbHJtX3NlYzsKKwlhbHJtLT5lbmFibGVkID0gKHBkYXRhLT5pcnFlbiAmIFJUQ19BRikgPyAxIDogMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlycXJldHVybl90IGRzMTU1M19ydGNfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwKKwkJCQkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IGRldl9pZDsKKwlzdHJ1Y3QgcnRjX3BsYXRfZGF0YSAqcGRhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHBkYXRhLT5pb2FkZHI7CisJdW5zaWduZWQgbG9uZyBldmVudHMgPSBSVENfSVJRRjsKKworCS8qIHJlYWQgYW5kIGNsZWFyIGludGVycnVwdCAqLworCWlmICghKHJlYWRiKGlvYWRkciArIFJUQ19GTEFHUykgJiBSVENfRkxBR1NfQUYpKQorCQlyZXR1cm4gSVJRX05PTkU7CisJaWYgKHJlYWRiKGlvYWRkciArIFJUQ19TRUNPTkRTX0FMQVJNKSAmIDB4ODApCisJCWV2ZW50cyB8PSBSVENfVUY7CisJZWxzZQorCQlldmVudHMgfD0gUlRDX0FGOworCXJ0Y191cGRhdGVfaXJxKCZwZGF0YS0+cnRjLT5jbGFzc19kZXYsIDEsIGV2ZW50cyk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgdm9pZCBkczE1NTNfcnRjX3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgcnRjX3BsYXRfZGF0YSAqcGRhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWlmIChwZGF0YS0+aXJxID49IDApIHsKKwkJcGRhdGEtPmlycWVuID0gMDsKKwkJZHMxNTUzX3J0Y191cGRhdGVfYWxhcm0ocGRhdGEpOworCX0KK30KKworc3RhdGljIGludCBkczE1NTNfcnRjX2lvY3RsKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGNtZCwKKwkJCSAgICB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IHJ0Y19wbGF0X2RhdGEgKnBkYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlpZiAocGRhdGEtPmlycSA8IDApCisJCXJldHVybiAtRU5PSU9DVExDTUQ7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFJUQ19BSUVfT0ZGOgorCQlwZGF0YS0+aXJxZW4gJj0gflJUQ19BRjsKKwkJZHMxNTUzX3J0Y191cGRhdGVfYWxhcm0ocGRhdGEpOworCQlicmVhazsKKwljYXNlIFJUQ19BSUVfT046CisJCXBkYXRhLT5pcnFlbiB8PSBSVENfQUY7CisJCWRzMTU1M19ydGNfdXBkYXRlX2FsYXJtKHBkYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBSVENfVUlFX09GRjoKKwkJcGRhdGEtPmlycWVuICY9IH5SVENfVUY7CisJCWRzMTU1M19ydGNfdXBkYXRlX2FsYXJtKHBkYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBSVENfVUlFX09OOgorCQlwZGF0YS0+aXJxZW4gfD0gUlRDX1VGOworCQlkczE1NTNfcnRjX3VwZGF0ZV9hbGFybShwZGF0YSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PSU9DVExDTUQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHJ0Y19jbGFzc19vcHMgZHMxNTUzX3J0Y19vcHMgPSB7CisJLnJlYWRfdGltZQk9IGRzMTU1M19ydGNfcmVhZF90aW1lLAorCS5zZXRfdGltZQk9IGRzMTU1M19ydGNfc2V0X3RpbWUsCisJLnJlYWRfYWxhcm0JPSBkczE1NTNfcnRjX3JlYWRfYWxhcm0sCisJLnNldF9hbGFybQk9IGRzMTU1M19ydGNfc2V0X2FsYXJtLAorCS5yZWxlYXNlCT0gZHMxNTUzX3J0Y19yZWxlYXNlLAorCS5pb2N0bAkJPSBkczE1NTNfcnRjX2lvY3RsLAorfTsKKworc3RhdGljIHNzaXplX3QgZHMxNTUzX252cmFtX3JlYWQoc3RydWN0IGtvYmplY3QgKmtvYmosIGNoYXIgKmJ1ZiwKKwkJCQkgbG9mZl90IHBvcywgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9CisJCXRvX3BsYXRmb3JtX2RldmljZShjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaikpOworCXN0cnVjdCBydGNfcGxhdF9kYXRhICpwZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gcGRhdGEtPmlvYWRkcjsKKwlzc2l6ZV90IGNvdW50OworCisJZm9yIChjb3VudCA9IDA7IHNpemUgPiAwICYmIHBvcyA8IFJUQ19PRkZTRVQ7IGNvdW50KyssIHNpemUtLSkKKwkJKmJ1ZisrID0gcmVhZGIoaW9hZGRyICsgcG9zKyspOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3QgZHMxNTUzX252cmFtX3dyaXRlKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBjaGFyICpidWYsCisJCQkJICBsb2ZmX3QgcG9zLCBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0KKwkJdG9fcGxhdGZvcm1fZGV2aWNlKGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKSk7CisJc3RydWN0IHJ0Y19wbGF0X2RhdGEgKnBkYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBwZGF0YS0+aW9hZGRyOworCXNzaXplX3QgY291bnQ7CisKKwlmb3IgKGNvdW50ID0gMDsgc2l6ZSA+IDAgJiYgcG9zIDwgUlRDX09GRlNFVDsgY291bnQrKywgc2l6ZS0tKQorCQl3cml0ZWIoKmJ1ZisrLCBpb2FkZHIgKyBwb3MrKyk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3RydWN0IGJpbl9hdHRyaWJ1dGUgZHMxNTUzX252cmFtX2F0dHIgPSB7CisJLmF0dHIgPSB7CisJCS5uYW1lID0gIm52cmFtIiwKKwkJLm1vZGUgPSBTX0lSVUdPIHwgU19JV1VHTywKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkuc2l6ZSA9IFJUQ19PRkZTRVQsCisJLnJlYWQgPSBkczE1NTNfbnZyYW1fcmVhZCwKKwkud3JpdGUgPSBkczE1NTNfbnZyYW1fd3JpdGUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBkczE1NTNfcnRjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YzsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwl1bnNpZ25lZCBpbnQgY2VuLCBzZWM7CisJc3RydWN0IHJ0Y19wbGF0X2RhdGEgKnBkYXRhID0gTlVMTDsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IE5VTEw7CisJaW50IHJldCA9IDA7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghcmVzKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlwZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKCpwZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghcGRhdGEpCisJCXJldHVybiAtRU5PTUVNOworCXBkYXRhLT5pcnEgPSAtMTsKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCBSVENfUkVHX1NJWkUsIHBkZXYtPm5hbWUpKSB7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBvdXQ7CisJfQorCXBkYXRhLT5iYXNlYWRkciA9IHJlcy0+c3RhcnQ7CisJaW9hZGRyID0gaW9yZW1hcChwZGF0YS0+YmFzZWFkZHIsIFJUQ19SRUdfU0laRSk7CisJaWYgKCFpb2FkZHIpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCXBkYXRhLT5pb2FkZHIgPSBpb2FkZHI7CisJcGRhdGEtPmlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisKKwkvKiB0dXJuIFJUQyBvbiBpZiBpdCB3YXMgbm90IG9uICovCisJc2VjID0gcmVhZGIoaW9hZGRyICsgUlRDX1NFQ09ORFMpOworCWlmIChzZWMgJiBSVENfU1RPUCkgeworCQlzZWMgJj0gUlRDX1NFQ09ORFNfTUFTSzsKKwkJY2VuID0gcmVhZGIoaW9hZGRyICsgUlRDX0NFTlRVUlkpICYgUlRDX0NFTlRVUllfTUFTSzsKKwkJd3JpdGViKFJUQ19XUklURSwgaW9hZGRyICsgUlRDX0NPTlRST0wpOworCQl3cml0ZWIoc2VjLCBpb2FkZHIgKyBSVENfU0VDT05EUyk7CisJCXdyaXRlYihjZW4gJiBSVENfQ0VOVFVSWV9NQVNLLCBpb2FkZHIgKyBSVENfQ09OVFJPTCk7CisJfQorCWlmIChyZWFkYihpb2FkZHIgKyBSVENfRkxBR1MpICYgUlRDX0ZMQUdTX0JMRikKKwkJZGV2X3dhcm4oJnBkZXYtPmRldiwgInZvbHRhZ2UtbG93IGRldGVjdGVkLlxuIik7CisKKwlpZiAocGRhdGEtPmlycSA+PSAwKSB7CisJCXdyaXRlYigwLCBpb2FkZHIgKyBSVENfSU5URVJSVVBUUyk7CisJCWlmIChyZXF1ZXN0X2lycShwZGF0YS0+aXJxLCBkczE1NTNfcnRjX2ludGVycnVwdCwgU0FfU0hJUlEsCisJCQkJcGRldi0+bmFtZSwgcGRldikgPCAwKSB7CisJCQlkZXZfd2FybigmcGRldi0+ZGV2LCAiaW50ZXJydXB0IG5vdCBhdmFpbGFibGUuXG4iKTsKKwkJCXBkYXRhLT5pcnEgPSAtMTsKKwkJfQorCX0KKworCXJ0YyA9IHJ0Y19kZXZpY2VfcmVnaXN0ZXIocGRldi0+bmFtZSwgJnBkZXYtPmRldiwKKwkJCQkgICZkczE1NTNfcnRjX29wcywgVEhJU19NT0RVTEUpOworCWlmIChJU19FUlIocnRjKSkgeworCQlyZXQgPSBQVFJfRVJSKHJ0Yyk7CisJCWdvdG8gb3V0OworCX0KKwlwZGF0YS0+cnRjID0gcnRjOworCXBkYXRhLT5sYXN0X2ppZmZpZXMgPSBqaWZmaWVzOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHBkYXRhKTsKKwlzeXNmc19jcmVhdGVfYmluX2ZpbGUoJnBkZXYtPmRldi5rb2JqLCAmZHMxNTUzX252cmFtX2F0dHIpOworCXJldHVybiAwOworIG91dDoKKwlpZiAocGRhdGEtPmlycSA+PSAwKQorCQlmcmVlX2lycShwZGF0YS0+aXJxLCBwZGV2KTsKKwlpZiAoaW9hZGRyKQorCQlpb3VubWFwKGlvYWRkcik7CisJaWYgKHBkYXRhLT5iYXNlYWRkcikKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKHBkYXRhLT5iYXNlYWRkciwgUlRDX1JFR19TSVpFKTsKKwlrZnJlZShwZGF0YSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgZHMxNTUzX3J0Y19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcnRjX3BsYXRfZGF0YSAqcGRhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmcGRldi0+ZGV2LmtvYmosICZkczE1NTNfbnZyYW1fYXR0cik7CisJcnRjX2RldmljZV91bnJlZ2lzdGVyKHBkYXRhLT5ydGMpOworCWlmIChwZGF0YS0+aXJxID49IDApIHsKKwkJd3JpdGViKDAsIHBkYXRhLT5pb2FkZHIgKyBSVENfSU5URVJSVVBUUyk7CisJCWZyZWVfaXJxKHBkYXRhLT5pcnEsIHBkZXYpOworCX0KKwlpb3VubWFwKHBkYXRhLT5pb2FkZHIpOworCXJlbGVhc2VfbWVtX3JlZ2lvbihwZGF0YS0+YmFzZWFkZHIsIFJUQ19SRUdfU0laRSk7CisJa2ZyZWUocGRhdGEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBkczE1NTNfcnRjX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gZHMxNTUzX3J0Y19wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGRzMTU1M19ydGNfcmVtb3ZlKSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAiZHMxNTUzIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK3N0YXRpYyBfX2luaXQgaW50IGRzMTU1M19pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmZHMxNTUzX3J0Y19kcml2ZXIpOworfQorCitzdGF0aWMgX19leGl0IHZvaWQgZHMxNTUzX2V4aXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmRzMTU1M19ydGNfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoZHMxNTUzX2luaXQpOworbW9kdWxlX2V4aXQoZHMxNTUzX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJBdHN1c2hpIE5lbW90byA8YW5lbW9AbWJhLm9jbi5uZS5qcD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRGFsbGFzIERTMTU1MyBSVEMgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtZHMxNzQyLmMgYi9kcml2ZXJzL3J0Yy9ydGMtZHMxNzQyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU0N2U1YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1kczE3NDIuYwpAQCAtMCwwICsxLDI1OSBAQAorLyoKKyAqIEFuIHJ0YyBkcml2ZXIgZm9yIHRoZSBEYWxsYXMgRFMxNzQyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2IEF0c3VzaGkgTmVtb3RvIDxhbmVtb0BtYmEub2NuLm5lLmpwPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2JjZC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorCisjZGVmaW5lIERSVl9WRVJTSU9OICIwLjEiCisKKyNkZWZpbmUgUlRDX1JFR19TSVpFCQkweDgwMAorI2RlZmluZSBSVENfT0ZGU0VUCQkweDdmOAorCisjZGVmaW5lIFJUQ19DT05UUk9MCQkoUlRDX09GRlNFVCArIDApCisjZGVmaW5lIFJUQ19DRU5UVVJZCQkoUlRDX09GRlNFVCArIDApCisjZGVmaW5lIFJUQ19TRUNPTkRTCQkoUlRDX09GRlNFVCArIDEpCisjZGVmaW5lIFJUQ19NSU5VVEVTCQkoUlRDX09GRlNFVCArIDIpCisjZGVmaW5lIFJUQ19IT1VSUwkJKFJUQ19PRkZTRVQgKyAzKQorI2RlZmluZSBSVENfREFZCQkJKFJUQ19PRkZTRVQgKyA0KQorI2RlZmluZSBSVENfREFURQkJKFJUQ19PRkZTRVQgKyA1KQorI2RlZmluZSBSVENfTU9OVEgJCShSVENfT0ZGU0VUICsgNikKKyNkZWZpbmUgUlRDX1lFQVIJCShSVENfT0ZGU0VUICsgNykKKworI2RlZmluZSBSVENfQ0VOVFVSWV9NQVNLCTB4M2YKKyNkZWZpbmUgUlRDX1NFQ09ORFNfTUFTSwkweDdmCisjZGVmaW5lIFJUQ19EQVlfTUFTSwkJMHgwNworCisvKiBCaXRzIGluIHRoZSBDb250cm9sL0NlbnR1cnkgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlRDX1dSSVRFCQkweDgwCisjZGVmaW5lIFJUQ19SRUFECQkweDQwCisKKy8qIEJpdHMgaW4gdGhlIFNlY29uZHMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlRDX1NUT1AJCTB4ODAKKworLyogQml0cyBpbiB0aGUgRGF5IHJlZ2lzdGVyICovCisjZGVmaW5lIFJUQ19CQVRUX0ZMQUcJCTB4ODAKKworc3RydWN0IHJ0Y19wbGF0X2RhdGEgeworCXN0cnVjdCBydGNfZGV2aWNlICpydGM7CisJdm9pZCBfX2lvbWVtICppb2FkZHI7CisJdW5zaWduZWQgbG9uZyBiYXNlYWRkcjsKKwl1bnNpZ25lZCBsb25nIGxhc3RfamlmZmllczsKK307CisKK3N0YXRpYyBpbnQgZHMxNzQyX3J0Y19zZXRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBydGNfcGxhdF9kYXRhICpwZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gcGRhdGEtPmlvYWRkcjsKKwl1OCBjZW50dXJ5OworCisJY2VudHVyeSA9IEJJTjJCQ0QoKHRtLT50bV95ZWFyICsgMTkwMCkgLyAxMDApOworCisJd3JpdGViKFJUQ19XUklURSwgaW9hZGRyICsgUlRDX0NPTlRST0wpOworCisJd3JpdGViKEJJTjJCQ0QodG0tPnRtX3llYXIgJSAxMDApLCBpb2FkZHIgKyBSVENfWUVBUik7CisJd3JpdGViKEJJTjJCQ0QodG0tPnRtX21vbiArIDEpLCBpb2FkZHIgKyBSVENfTU9OVEgpOworCXdyaXRlYihCSU4yQkNEKHRtLT50bV93ZGF5KSAmIFJUQ19EQVlfTUFTSywgaW9hZGRyICsgUlRDX0RBWSk7CisJd3JpdGViKEJJTjJCQ0QodG0tPnRtX21kYXkpLCBpb2FkZHIgKyBSVENfREFURSk7CisJd3JpdGViKEJJTjJCQ0QodG0tPnRtX2hvdXIpLCBpb2FkZHIgKyBSVENfSE9VUlMpOworCXdyaXRlYihCSU4yQkNEKHRtLT50bV9taW4pLCBpb2FkZHIgKyBSVENfTUlOVVRFUyk7CisJd3JpdGViKEJJTjJCQ0QodG0tPnRtX3NlYykgJiBSVENfU0VDT05EU19NQVNLLCBpb2FkZHIgKyBSVENfU0VDT05EUyk7CisKKwkvKiBSVENfQ0VOVFVSWSBhbmQgUlRDX0NPTlRST0wgc2hhcmUgc2FtZSByZWdpc3RlciAqLworCXdyaXRlYihSVENfV1JJVEUgfCAoY2VudHVyeSAmIFJUQ19DRU5UVVJZX01BU0spLCBpb2FkZHIgKyBSVENfQ0VOVFVSWSk7CisJd3JpdGViKGNlbnR1cnkgJiBSVENfQ0VOVFVSWV9NQVNLLCBpb2FkZHIgKyBSVENfQ09OVFJPTCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHMxNzQyX3J0Y19yZWFkX3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgcnRjX3BsYXRfZGF0YSAqcGRhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHBkYXRhLT5pb2FkZHI7CisJdW5zaWduZWQgaW50IHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCB3ZWVrOworCXVuc2lnbmVkIGludCBjZW50dXJ5OworCisJLyogZ2l2ZSBlbm91Z2ggdGltZSB0byB1cGRhdGUgUlRDIGluIGNhc2Ugb2YgY29udGludW91cyByZWFkICovCisJaWYgKHBkYXRhLT5sYXN0X2ppZmZpZXMgPT0gamlmZmllcykKKwkJbXNsZWVwKDEpOworCXBkYXRhLT5sYXN0X2ppZmZpZXMgPSBqaWZmaWVzOworCXdyaXRlYihSVENfUkVBRCwgaW9hZGRyICsgUlRDX0NPTlRST0wpOworCXNlY29uZCA9IHJlYWRiKGlvYWRkciArIFJUQ19TRUNPTkRTKSAmIFJUQ19TRUNPTkRTX01BU0s7CisJbWludXRlID0gcmVhZGIoaW9hZGRyICsgUlRDX01JTlVURVMpOworCWhvdXIgPSByZWFkYihpb2FkZHIgKyBSVENfSE9VUlMpOworCWRheSA9IHJlYWRiKGlvYWRkciArIFJUQ19EQVRFKTsKKwl3ZWVrID0gcmVhZGIoaW9hZGRyICsgUlRDX0RBWSkgJiBSVENfREFZX01BU0s7CisJbW9udGggPSByZWFkYihpb2FkZHIgKyBSVENfTU9OVEgpOworCXllYXIgPSByZWFkYihpb2FkZHIgKyBSVENfWUVBUik7CisJY2VudHVyeSA9IHJlYWRiKGlvYWRkciArIFJUQ19DRU5UVVJZKSAmIFJUQ19DRU5UVVJZX01BU0s7CisJd3JpdGViKDAsIGlvYWRkciArIFJUQ19DT05UUk9MKTsKKwl0bS0+dG1fc2VjID0gQkNEMkJJTihzZWNvbmQpOworCXRtLT50bV9taW4gPSBCQ0QyQklOKG1pbnV0ZSk7CisJdG0tPnRtX2hvdXIgPSBCQ0QyQklOKGhvdXIpOworCXRtLT50bV9tZGF5ID0gQkNEMkJJTihkYXkpOworCXRtLT50bV93ZGF5ID0gQkNEMkJJTih3ZWVrKTsKKwl0bS0+dG1fbW9uID0gQkNEMkJJTihtb250aCkgLSAxOworCS8qIHllYXIgaXMgMTkwMCArIHRtLT50bV95ZWFyICovCisJdG0tPnRtX3llYXIgPSBCQ0QyQklOKHllYXIpICsgQkNEMkJJTihjZW50dXJ5KSAqIDEwMCAtIDE5MDA7CisKKwlpZiAocnRjX3ZhbGlkX3RtKHRtKSA8IDApIHsKKwkJZGV2X2VycihkZXYsICJyZXRyaWV2ZWQgZGF0ZS90aW1lIGlzIG5vdCB2YWxpZC5cbiIpOworCQlydGNfdGltZV90b190bSgwLCB0bSk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHJ0Y19jbGFzc19vcHMgZHMxNzQyX3J0Y19vcHMgPSB7CisJLnJlYWRfdGltZQk9IGRzMTc0Ml9ydGNfcmVhZF90aW1lLAorCS5zZXRfdGltZQk9IGRzMTc0Ml9ydGNfc2V0X3RpbWUsCit9OworCitzdGF0aWMgc3NpemVfdCBkczE3NDJfbnZyYW1fcmVhZChzdHJ1Y3Qga29iamVjdCAqa29iaiwgY2hhciAqYnVmLAorCQkJCSBsb2ZmX3QgcG9zLCBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0KKwkJdG9fcGxhdGZvcm1fZGV2aWNlKGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKSk7CisJc3RydWN0IHJ0Y19wbGF0X2RhdGEgKnBkYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBwZGF0YS0+aW9hZGRyOworCXNzaXplX3QgY291bnQ7CisKKwlmb3IgKGNvdW50ID0gMDsgc2l6ZSA+IDAgJiYgcG9zIDwgUlRDX09GRlNFVDsgY291bnQrKywgc2l6ZS0tKQorCQkqYnVmKysgPSByZWFkYihpb2FkZHIgKyBwb3MrKyk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBkczE3NDJfbnZyYW1fd3JpdGUoc3RydWN0IGtvYmplY3QgKmtvYmosIGNoYXIgKmJ1ZiwKKwkJCQkgIGxvZmZfdCBwb3MsIHNpemVfdCBzaXplKQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPQorCQl0b19wbGF0Zm9ybV9kZXZpY2UoY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopKTsKKwlzdHJ1Y3QgcnRjX3BsYXRfZGF0YSAqcGRhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHBkYXRhLT5pb2FkZHI7CisJc3NpemVfdCBjb3VudDsKKworCWZvciAoY291bnQgPSAwOyBzaXplID4gMCAmJiBwb3MgPCBSVENfT0ZGU0VUOyBjb3VudCsrLCBzaXplLS0pCisJCXdyaXRlYigqYnVmKyssIGlvYWRkciArIHBvcysrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSBkczE3NDJfbnZyYW1fYXR0ciA9IHsKKwkuYXR0ciA9IHsKKwkJLm5hbWUgPSAibnZyYW0iLAorCQkubW9kZSA9IFNfSVJVR08gfCBTX0lXVUdPLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5zaXplID0gUlRDX09GRlNFVCwKKwkucmVhZCA9IGRzMTc0Ml9udnJhbV9yZWFkLAorCS53cml0ZSA9IGRzMTc0Ml9udnJhbV93cml0ZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGRzMTc0Ml9ydGNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCXVuc2lnbmVkIGludCBjZW4sIHNlYzsKKwlzdHJ1Y3QgcnRjX3BsYXRfZGF0YSAqcGRhdGEgPSBOVUxMOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gTlVMTDsKKwlpbnQgcmV0ID0gMDsKKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFyZXMpCisJCXJldHVybiAtRU5PREVWOworCXBkYXRhID0ga3phbGxvYyhzaXplb2YoKnBkYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24ocmVzLT5zdGFydCwgUlRDX1JFR19TSVpFLCBwZGV2LT5uYW1lKSkgeworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKwlwZGF0YS0+YmFzZWFkZHIgPSByZXMtPnN0YXJ0OworCWlvYWRkciA9IGlvcmVtYXAocGRhdGEtPmJhc2VhZGRyLCBSVENfUkVHX1NJWkUpOworCWlmICghaW9hZGRyKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKwlwZGF0YS0+aW9hZGRyID0gaW9hZGRyOworCisJLyogdHVybiBSVEMgb24gaWYgaXQgd2FzIG5vdCBvbiAqLworCXNlYyA9IHJlYWRiKGlvYWRkciArIFJUQ19TRUNPTkRTKTsKKwlpZiAoc2VjICYgUlRDX1NUT1ApIHsKKwkJc2VjICY9IFJUQ19TRUNPTkRTX01BU0s7CisJCWNlbiA9IHJlYWRiKGlvYWRkciArIFJUQ19DRU5UVVJZKSAmIFJUQ19DRU5UVVJZX01BU0s7CisJCXdyaXRlYihSVENfV1JJVEUsIGlvYWRkciArIFJUQ19DT05UUk9MKTsKKwkJd3JpdGViKHNlYywgaW9hZGRyICsgUlRDX1NFQ09ORFMpOworCQl3cml0ZWIoY2VuICYgUlRDX0NFTlRVUllfTUFTSywgaW9hZGRyICsgUlRDX0NPTlRST0wpOworCX0KKwlpZiAocmVhZGIoaW9hZGRyICsgUlRDX0RBWSkgJiBSVENfQkFUVF9GTEFHKQorCQlkZXZfd2FybigmcGRldi0+ZGV2LCAidm9sdGFnZS1sb3cgZGV0ZWN0ZWQuXG4iKTsKKworCXJ0YyA9IHJ0Y19kZXZpY2VfcmVnaXN0ZXIocGRldi0+bmFtZSwgJnBkZXYtPmRldiwKKwkJCQkgICZkczE3NDJfcnRjX29wcywgVEhJU19NT0RVTEUpOworCWlmIChJU19FUlIocnRjKSkgeworCQlyZXQgPSBQVFJfRVJSKHJ0Yyk7CisJCWdvdG8gb3V0OworCX0KKwlwZGF0YS0+cnRjID0gcnRjOworCXBkYXRhLT5sYXN0X2ppZmZpZXMgPSBqaWZmaWVzOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHBkYXRhKTsKKwlzeXNmc19jcmVhdGVfYmluX2ZpbGUoJnBkZXYtPmRldi5rb2JqLCAmZHMxNzQyX252cmFtX2F0dHIpOworCXJldHVybiAwOworIG91dDoKKwlpZiAoaW9hZGRyKQorCQlpb3VubWFwKGlvYWRkcik7CisJaWYgKHBkYXRhLT5iYXNlYWRkcikKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKHBkYXRhLT5iYXNlYWRkciwgUlRDX1JFR19TSVpFKTsKKwlrZnJlZShwZGF0YSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgZHMxNzQyX3J0Y19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcnRjX3BsYXRfZGF0YSAqcGRhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmcGRldi0+ZGV2LmtvYmosICZkczE3NDJfbnZyYW1fYXR0cik7CisJcnRjX2RldmljZV91bnJlZ2lzdGVyKHBkYXRhLT5ydGMpOworCWlvdW5tYXAocGRhdGEtPmlvYWRkcik7CisJcmVsZWFzZV9tZW1fcmVnaW9uKHBkYXRhLT5iYXNlYWRkciwgUlRDX1JFR19TSVpFKTsKKwlrZnJlZShwZGF0YSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGRzMTc0Ml9ydGNfZHJpdmVyID0geworCS5wcm9iZQkJPSBkczE3NDJfcnRjX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoZHMxNzQyX3J0Y19yZW1vdmUpLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJkczE3NDIiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKworc3RhdGljIF9faW5pdCBpbnQgZHMxNzQyX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZkczE3NDJfcnRjX2RyaXZlcik7Cit9CisKK3N0YXRpYyBfX2V4aXQgdm9pZCBkczE3NDJfZXhpdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmZHMxNzQyX3J0Y19kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChkczE3NDJfaW5pdCk7Cittb2R1bGVfZXhpdChkczE3NDJfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkF0c3VzaGkgTmVtb3RvIDxhbmVtb0BtYmEub2NuLm5lLmpwPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEYWxsYXMgRFMxNzQyIFJUQyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKERSVl9WRVJTSU9OKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1saWIuYyBiL2RyaXZlcnMvcnRjL3J0Yy1saWIuYwppbmRleCBjZmVkYzFkLi45ODEyMTIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtbGliLmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLWxpYi5jCkBAIC0xOCw5ICsxOCwxOSBAQAogCTMxLCAyOCwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzEKIH07CiAKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBydGNfeWRheXNbMl1bMTNdID0geworCS8qIE5vcm1hbCB5ZWFycyAqLworCXsgMCwgMzEsIDU5LCA5MCwgMTIwLCAxNTEsIDE4MSwgMjEyLCAyNDMsIDI3MywgMzA0LCAzMzQsIDM2NSB9LAorCS8qIExlYXAgeWVhcnMgKi8KKwl7IDAsIDMxLCA2MCwgOTEsIDEyMSwgMTUyLCAxODIsIDIxMywgMjQ0LCAyNzQsIDMwNSwgMzM1LCAzNjYgfQorfTsKKwogI2RlZmluZSBMRUFQU19USFJVX0VORF9PRih5KSAoKHkpLzQgLSAoeSkvMTAwICsgKHkpLzQwMCkKICNkZWZpbmUgTEVBUF9ZRUFSKHllYXIpICgoISh5ZWFyICUgNCkgJiYgKHllYXIgJSAxMDApKSB8fCAhKHllYXIgJSA0MDApKQogCisvKgorICogVGhlIG51bWJlciBvZiBkYXlzIGluIHRoZSBtb250aC4KKyAqLwogaW50IHJ0Y19tb250aF9kYXlzKHVuc2lnbmVkIGludCBtb250aCwgdW5zaWduZWQgaW50IHllYXIpCiB7CiAJcmV0dXJuIHJ0Y19kYXlzX2luX21vbnRoW21vbnRoXSArIChMRUFQX1lFQVIoeWVhcikgJiYgbW9udGggPT0gMSk7CkBAIC0yOCw2ICszOCwxNSBAQAogRVhQT1JUX1NZTUJPTChydGNfbW9udGhfZGF5cyk7CiAKIC8qCisgKiBUaGUgbnVtYmVyIG9mIGRheXMgc2luY2UgSmFudWFyeSAxLiAoMCB0byAzNjUpCisgKi8KK2ludCBydGNfeWVhcl9kYXlzKHVuc2lnbmVkIGludCBkYXksIHVuc2lnbmVkIGludCBtb250aCwgdW5zaWduZWQgaW50IHllYXIpCit7CisJcmV0dXJuIHJ0Y195ZGF5c1tMRUFQX1lFQVIoeWVhcildW21vbnRoXSArIGRheS0xOworfQorRVhQT1JUX1NZTUJPTChydGNfeWVhcl9kYXlzKTsKKworLyoKICAqIENvbnZlcnQgc2Vjb25kcyBzaW5jZSAwMS0wMS0xOTcwIDAwOjAwOjAwIHRvIEdyZWdvcmlhbiBkYXRlLgogICovCiB2b2lkIHJ0Y190aW1lX3RvX3RtKHVuc2lnbmVkIGxvbmcgdGltZSwgc3RydWN0IHJ0Y190aW1lICp0bSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1tYXg2OTAyLmMgYi9kcml2ZXJzL3J0Yy9ydGMtbWF4NjkwMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjOTczOTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3J0Yy9ydGMtbWF4NjkwMi5jCkBAIC0wLDAgKzEsMjg2IEBACisvKiBkcml2ZXJzL2NoYXIvbWF4NjkwMi5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2IDhEIFRlY2hub2xvZ2llcyBpbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgQ29tcHVsYWIgTHRkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogRHJpdmVyIGZvciBNQVg2OTAyIHNwaSBSVEMKKyAqCisgKiBDaGFuZ2Vsb2c6CisgKgorICogMjQtTWF5LTIwMDY6IFJhcGhhZWwgQXNzZW5hdCA8cmFwaEA4ZC5jb20+CisgKiAgICAgICAgICAgICAgICAtIE1ham9yIHJld29yaworICogICAJCQkJQ29udmVydGVkIHRvIHJ0Y19kZXZpY2UgYW5kIHVzZXMgdGhlIFNQSSBsYXllci4KKyAqCisgKiA/Py0/Pz8tMjAwNTogU29tZW9uZSBhdCBDb21wdWxhYgorICogICAgICAgICAgICAgICAgLSBJbml0aWFsIGRyaXZlciBjcmVhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9iY2QuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjZGVmaW5lIE1BWDY5MDJfUkVHX1NFQ09ORFMJCTB4MDEKKyNkZWZpbmUgTUFYNjkwMl9SRUdfTUlOVVRFUwkJMHgwMworI2RlZmluZSBNQVg2OTAyX1JFR19IT1VSUwkJMHgwNQorI2RlZmluZSBNQVg2OTAyX1JFR19EQVRFCQkweDA3CisjZGVmaW5lIE1BWDY5MDJfUkVHX01PTlRICQkweDA5CisjZGVmaW5lIE1BWDY5MDJfUkVHX0RBWQkJCTB4MEIKKyNkZWZpbmUgTUFYNjkwMl9SRUdfWUVBUgkJMHgwRAorI2RlZmluZSBNQVg2OTAyX1JFR19DT05UUk9MCQkweDBGCisjZGVmaW5lIE1BWDY5MDJfUkVHX0NFTlRVUlkJCTB4MTMKKworI3VuZGVmIE1BWDY5MDJfREVCVUcKKworc3RydWN0IG1heDY5MDIgeworCXN0cnVjdCBydGNfZGV2aWNlICpydGM7CisJdTggYnVmWzldOyAvKiBCdXJzdCByZWFkIGNtZCArIDggcmVnaXN0ZXJzICovCisJdTggdHhfYnVmWzJdOworCXU4IHJ4X2J1ZlsyXTsKK307CisKK3N0YXRpYyB2b2lkIG1heDY5MDJfc2V0X3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGNoYXIgYWRkcmVzcywKKwkJCQl1bnNpZ25lZCBjaGFyIGRhdGEpCit7CisJc3RydWN0IHNwaV9kZXZpY2UgKnNwaSA9IHRvX3NwaV9kZXZpY2UoZGV2KTsKKwl1bnNpZ25lZCBjaGFyIGJ1ZlsyXTsKKworCS8qIE1TQiBtdXN0IGJlICcwJyB0byB3cml0ZSAqLworCWJ1ZlswXSA9IGFkZHJlc3MgJiAweDdmOworCWJ1ZlsxXSA9IGRhdGE7CisKKwlzcGlfd3JpdGUoc3BpLCBidWYsIDIpOworfQorCitzdGF0aWMgaW50IG1heDY5MDJfZ2V0X3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGNoYXIgYWRkcmVzcywKKwkJCQl1bnNpZ25lZCBjaGFyICpkYXRhKQoreworCXN0cnVjdCBzcGlfZGV2aWNlICpzcGkgPSB0b19zcGlfZGV2aWNlKGRldik7CisJc3RydWN0IG1heDY5MDIgKmNoaXAgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbWVzc2FnZTsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXI7CisJaW50IHN0YXR1czsKKworCWlmICghZGF0YSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBCdWlsZCBvdXIgc3BpIG1lc3NhZ2UgKi8KKwlzcGlfbWVzc2FnZV9pbml0KCZtZXNzYWdlKTsKKwltZW1zZXQoJnhmZXIsIDAsIHNpemVvZih4ZmVyKSk7CisJeGZlci5sZW4gPSAyOworCS8qIENhbiB0eF9idWYgYW5kIHJ4X2J1ZiBiZSBlcXVhbD8gVGhlIGRvYyBpbiBzcGkuaCBpcyBub3Qgc3VyZS4uLiAqLworCXhmZXIudHhfYnVmID0gY2hpcC0+dHhfYnVmOworCXhmZXIucnhfYnVmID0gY2hpcC0+cnhfYnVmOworCisJLyogU2V0IE1TQiB0byBpbmRpY2F0ZSByZWFkICovCisJY2hpcC0+dHhfYnVmWzBdID0gYWRkcmVzcyB8IDB4ODA7CisKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlciwgJm1lc3NhZ2UpOworCisJLyogZG8gdGhlIGkvbyAqLworCXN0YXR1cyA9IHNwaV9zeW5jKHNwaSwgJm1lc3NhZ2UpOworCWlmIChzdGF0dXMgPT0gMCkKKwkJc3RhdHVzID0gbWVzc2FnZS5zdGF0dXM7CisJZWxzZQorCQlyZXR1cm4gc3RhdHVzOworCisJKmRhdGEgPSBjaGlwLT5yeF9idWZbMV07CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IG1heDY5MDJfZ2V0X2RhdGV0aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICpkdCkKK3sKKwl1bnNpZ25lZCBjaGFyIHRtcDsKKwlpbnQgY2VudHVyeTsKKwlpbnQgZXJyOworCXN0cnVjdCBzcGlfZGV2aWNlICpzcGkgPSB0b19zcGlfZGV2aWNlKGRldik7CisJc3RydWN0IG1heDY5MDIgKmNoaXAgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbWVzc2FnZTsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXI7CisJaW50IHN0YXR1czsKKworCWVyciA9IG1heDY5MDJfZ2V0X3JlZyhkZXYsIE1BWDY5MDJfUkVHX0NFTlRVUlksICZ0bXApOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkvKiBidWlsZCB0aGUgbWVzc2FnZSAqLworCXNwaV9tZXNzYWdlX2luaXQoJm1lc3NhZ2UpOworCW1lbXNldCgmeGZlciwgMCwgc2l6ZW9mKHhmZXIpKTsKKwl4ZmVyLmxlbiA9IDEgKyA3OwkvKiBCdXJzdCByZWFkIGNvbW1hbmQgKyA3IHJlZ2lzdGVycyAqLworCXhmZXIudHhfYnVmID0gY2hpcC0+YnVmOworCXhmZXIucnhfYnVmID0gY2hpcC0+YnVmOworCWNoaXAtPmJ1ZlswXSA9IDB4YmY7CS8qIEJ1cnN0IHJlYWQgKi8KKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlciwgJm1lc3NhZ2UpOworCisJLyogZG8gdGhlIGkvbyAqLworCXN0YXR1cyA9IHNwaV9zeW5jKHNwaSwgJm1lc3NhZ2UpOworCWlmIChzdGF0dXMgPT0gMCkKKwkJc3RhdHVzID0gbWVzc2FnZS5zdGF0dXM7CisJZWxzZQorCQlyZXR1cm4gc3RhdHVzOworCisJLyogVGhlIGNoaXAgc2VuZHMgZGF0YSBpbiB0aGlzIG9yZGVyOgorCSAqIFNlY29uZHMsIE1pbnV0ZXMsIEhvdXJzLCBEYXRlLCBNb250aCwgRGF5LCBZZWFyICovCisJZHQtPnRtX3NlYwk9IEJDRDJCSU4oY2hpcC0+YnVmWzFdKTsKKwlkdC0+dG1fbWluCT0gQkNEMkJJTihjaGlwLT5idWZbMl0pOworCWR0LT50bV9ob3VyCT0gQkNEMkJJTihjaGlwLT5idWZbM10pOworCWR0LT50bV9tZGF5CT0gQkNEMkJJTihjaGlwLT5idWZbNF0pOworCWR0LT50bV9tb24JPSBCQ0QyQklOKGNoaXAtPmJ1Zls1XSAtIDEpOworCWR0LT50bV93ZGF5CT0gQkNEMkJJTihjaGlwLT5idWZbNl0pOworCWR0LT50bV95ZWFyID0gQkNEMkJJTihjaGlwLT5idWZbN10pOworCisJY2VudHVyeSA9IEJDRDJCSU4odG1wKSAqIDEwMDsKKworCWR0LT50bV95ZWFyICs9IGNlbnR1cnk7CisJZHQtPnRtX3llYXIgLT0gMTkwMDsKKworI2lmZGVmIE1BWDY5MDJfREVCVUcKKwlwcmludGsoIlxuJXMgOiBSZWFkIFJUQyB2YWx1ZXNcbiIsX19GVU5DVElPTl9fKTsKKwlwcmludGsoInRtX2hvdXI6ICVpXG4iLGR0LT50bV9ob3VyKTsKKwlwcmludGsoInRtX21pbiA6ICVpXG4iLGR0LT50bV9taW4pOworCXByaW50aygidG1fc2VjIDogJWlcbiIsZHQtPnRtX3NlYyk7CisJcHJpbnRrKCJ0bV95ZWFyOiAlaVxuIixkdC0+dG1feWVhcik7CisJcHJpbnRrKCJ0bV9tb24gOiAlaVxuIixkdC0+dG1fbW9uKTsKKwlwcmludGsoInRtX21kYXk6ICVpXG4iLGR0LT50bV9tZGF5KTsKKwlwcmludGsoInRtX3dkYXk6ICVpXG4iLGR0LT50bV93ZGF5KTsKKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWF4NjkwMl9zZXRfZGF0ZXRpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKmR0KQoreworCWR0LT50bV95ZWFyID0gZHQtPnRtX3llYXIrMTkwMDsKKworI2lmZGVmIE1BWDY5MDJfREVCVUcKKwlwcmludGsoIlxuJXMgOiBTZXR0aW5nIFJUQyB2YWx1ZXNcbiIsX19GVU5DVElPTl9fKTsKKwlwcmludGsoInRtX3NlYyA6ICVpXG4iLGR0LT50bV9zZWMpOworCXByaW50aygidG1fbWluIDogJWlcbiIsZHQtPnRtX21pbik7CisJcHJpbnRrKCJ0bV9ob3VyOiAlaVxuIixkdC0+dG1faG91cik7CisJcHJpbnRrKCJ0bV9tZGF5OiAlaVxuIixkdC0+dG1fbWRheSk7CisJcHJpbnRrKCJ0bV93ZGF5OiAlaVxuIixkdC0+dG1fd2RheSk7CisJcHJpbnRrKCJ0bV95ZWFyOiAlaVxuIixkdC0+dG1feWVhcik7CisjZW5kaWYKKworCS8qIFJlbW92ZSB3cml0ZSBwcm90ZWN0aW9uICovCisJbWF4NjkwMl9zZXRfcmVnKGRldiwgMHhGLCAwKTsKKworCW1heDY5MDJfc2V0X3JlZyhkZXYsIDB4MDEsIEJJTjJCQ0QoZHQtPnRtX3NlYykpOworCW1heDY5MDJfc2V0X3JlZyhkZXYsIDB4MDMsIEJJTjJCQ0QoZHQtPnRtX21pbikpOworCW1heDY5MDJfc2V0X3JlZyhkZXYsIDB4MDUsIEJJTjJCQ0QoZHQtPnRtX2hvdXIpKTsKKworCW1heDY5MDJfc2V0X3JlZyhkZXYsIDB4MDcsIEJJTjJCQ0QoZHQtPnRtX21kYXkpKTsKKwltYXg2OTAyX3NldF9yZWcoZGV2LCAweDA5LCBCSU4yQkNEKGR0LT50bV9tb24rMSkpOworCW1heDY5MDJfc2V0X3JlZyhkZXYsIDB4MEIsIEJJTjJCQ0QoZHQtPnRtX3dkYXkpKTsKKwltYXg2OTAyX3NldF9yZWcoZGV2LCAweDBELCBCSU4yQkNEKGR0LT50bV95ZWFyJTEwMCkpOworCW1heDY5MDJfc2V0X3JlZyhkZXYsIDB4MTMsIEJJTjJCQ0QoZHQtPnRtX3llYXIvMTAwKSk7CisKKwkvKiBDb21wdWxhYiB1c2VkIGEgZGVsYXkgaGVyZS4gSG93ZXZlciwgdGhlIGRhdGFzaGVldAorCSAqIGRvZXMgbm90IG1lbnRpb24gYSBkZWxheSBiZWluZyByZXF1aXJlZCBhbnl3aGVyZS4uLiAqLworCS8qIGRlbGF5KDIwMDApOyAqLworCisJLyogV3JpdGUgcHJvdGVjdCAqLworCW1heDY5MDJfc2V0X3JlZyhkZXYsIDB4RiwgMHg4MCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtYXg2OTAyX3JlYWRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJcmV0dXJuIG1heDY5MDJfZ2V0X2RhdGV0aW1lKGRldiwgdG0pOworfQorCitzdGF0aWMgaW50IG1heDY5MDJfc2V0X3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXJldHVybiBtYXg2OTAyX3NldF9kYXRldGltZShkZXYsIHRtKTsKK30KKworc3RhdGljIHN0cnVjdCBydGNfY2xhc3Nfb3BzIG1heDY5MDJfcnRjX29wcyA9IHsKKwkucmVhZF90aW1lCT0gbWF4NjkwMl9yZWFkX3RpbWUsCisJLnNldF90aW1lCT0gbWF4NjkwMl9zZXRfdGltZSwKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IG1heDY5MDJfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjOworCXVuc2lnbmVkIGNoYXIgdG1wOworCXN0cnVjdCBtYXg2OTAyICpjaGlwOworCWludCByZXM7CisKKwlydGMgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKCJtYXg2OTAyIiwKKwkJCQkmc3BpLT5kZXYsICZtYXg2OTAyX3J0Y19vcHMsIFRISVNfTU9EVUxFKTsKKwlpZiAoSVNfRVJSKHJ0YykpCisJCXJldHVybiBQVFJfRVJSKHJ0Yyk7CisKKwlzcGktPm1vZGUgPSBTUElfTU9ERV8zOworCXNwaS0+Yml0c19wZXJfd29yZCA9IDg7CisJc3BpX3NldHVwKHNwaSk7CisKKwljaGlwID0ga3phbGxvYyhzaXplb2YgKmNoaXAsIEdGUF9LRVJORUwpOworCWlmICghY2hpcCkgeworCQlydGNfZGV2aWNlX3VucmVnaXN0ZXIocnRjKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWNoaXAtPnJ0YyA9IHJ0YzsKKwlkZXZfc2V0X2RydmRhdGEoJnNwaS0+ZGV2LCBjaGlwKTsKKworCXJlcyA9IG1heDY5MDJfZ2V0X3JlZygmc3BpLT5kZXYsIE1BWDY5MDJfUkVHX1NFQ09ORFMsICZ0bXApOworCWlmIChyZXMpIHsKKwkJcnRjX2RldmljZV91bnJlZ2lzdGVyKHJ0Yyk7CisJCXJldHVybiByZXM7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IG1heDY5MDJfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IG1heDY5MDIgKmNoaXAgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShzcGkpOworCXN0cnVjdCBydGNfZGV2aWNlICpydGMgPSBjaGlwLT5ydGM7CisKKwlpZiAocnRjKQorCQlydGNfZGV2aWNlX3VucmVnaXN0ZXIocnRjKTsKKworCWtmcmVlKGNoaXApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBtYXg2OTAyX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSAJPSAibWF4NjkwMiIsCisJCS5idXMJPSAmc3BpX2J1c190eXBlLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZSAJPSBtYXg2OTAyX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChtYXg2OTAyX3JlbW92ZSksCit9OworCitzdGF0aWMgX19pbml0IGludCBtYXg2OTAyX2luaXQodm9pZCkKK3sKKwlwcmludGsoIm1heDY5MDIgc3BpIGRyaXZlclxuIik7CisJcmV0dXJuIHNwaV9yZWdpc3Rlcl9kcml2ZXIoJm1heDY5MDJfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KG1heDY5MDJfaW5pdCk7CisKK3N0YXRpYyBfX2V4aXQgdm9pZCBtYXg2OTAyX2V4aXQodm9pZCkKK3sKKwlzcGlfdW5yZWdpc3Rlcl9kcml2ZXIoJm1heDY5MDJfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KG1heDY5MDJfZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTiAoIm1heDY5MDIgc3BpIFJUQyBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IgKCJSYXBoYWVsIEFzc2VuYXQiKTsKK01PRFVMRV9MSUNFTlNFICgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtcGNmODU4My5jIGIvZHJpdmVycy9ydGMvcnRjLXBjZjg1ODMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjM1YTMwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ydGMvcnRjLXBjZjg1ODMuYwpAQCAtMCwwICsxLDM5NCBAQAorLyoKKyAqICBkcml2ZXJzL3J0Yy9ydGMtcGNmODU4My5jCisgKgorICogIENvcHlyaWdodCAoQykgMjAwMCBSdXNzZWxsIEtpbmcKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICBEcml2ZXIgZm9yIFBDRjg1ODMgUlRDICYgUkFNIGNoaXAKKyAqCisgKiAgQ29udmVydGVkIHRvIHRoZSBnZW5lcmljIFJUQyBzdXNic3lzdGVtIGJ5IEcuIExpYWtob3ZldHNraSAoMjAwNikKKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9tYzE0NjgxOHJ0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2JjZC5oPgorCitzdHJ1Y3QgcnRjX21lbSB7CisJdW5zaWduZWQgaW50CWxvYzsKKwl1bnNpZ25lZCBpbnQJbnI7CisJdW5zaWduZWQgY2hhcgkqZGF0YTsKK307CisKK3N0cnVjdCBwY2Y4NTgzIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnQ7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YzsKKwl1bnNpZ25lZCBjaGFyIGN0cmw7Cit9OworCisjZGVmaW5lIENUUkxfU1RPUAkweDgwCisjZGVmaW5lIENUUkxfSE9MRAkweDQwCisjZGVmaW5lIENUUkxfMzJLSFoJMHgwMAorI2RlZmluZSBDVFJMX01BU0sJMHgwOAorI2RlZmluZSBDVFJMX0FMQVJNRU4JMHgwNAorI2RlZmluZSBDVFJMX0FMQVJNCTB4MDIKKyNkZWZpbmUgQ1RSTF9USU1FUgkweDAxCisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7IEkyQ19DTElFTlRfRU5EIH07CisKKy8qIE1vZHVsZSBwYXJhbWV0ZXJzICovCitJMkNfQ0xJRU5UX0lOU01PRDsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHBjZjg1ODNfZHJpdmVyOworCisjZGVmaW5lIGdldF9jdHJsKHgpICAgICgoc3RydWN0IHBjZjg1ODMgKilpMmNfZ2V0X2NsaWVudGRhdGEoeCkpLT5jdHJsCisjZGVmaW5lIHNldF9jdHJsKHgsIHYpIGdldF9jdHJsKHgpID0gdgorCisjZGVmaW5lIENNT1NfWUVBUgkoNjQgKyAxMjgpCisjZGVmaW5lIENNT1NfQ0hFQ0tTVU0JKDYzKQorCitzdGF0aWMgaW50IHBjZjg1ODNfZ2V0X2RhdGV0aW1lKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCBydGNfdGltZSAqZHQpCit7CisJdW5zaWduZWQgY2hhciBidWZbOF0sIGFkZHJbMV0gPSB7IDEgfTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2dzWzJdID0geworCQl7CisJCQkuYWRkciA9IGNsaWVudC0+YWRkciwKKwkJCS5mbGFncyA9IDAsCisJCQkubGVuID0gMSwKKwkJCS5idWYgPSBhZGRyLAorCQl9LCB7CisJCQkuYWRkciA9IGNsaWVudC0+YWRkciwKKwkJCS5mbGFncyA9IEkyQ19NX1JELAorCQkJLmxlbiA9IDYsCisJCQkuYnVmID0gYnVmLAorCQl9CisJfTsKKwlpbnQgcmV0OworCisJbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOworCisJcmV0ID0gaTJjX3RyYW5zZmVyKGNsaWVudC0+YWRhcHRlciwgbXNncywgMik7CisJaWYgKHJldCA9PSAyKSB7CisJCWR0LT50bV95ZWFyID0gYnVmWzRdID4+IDY7CisJCWR0LT50bV93ZGF5ID0gYnVmWzVdID4+IDU7CisKKwkJYnVmWzRdICY9IDB4M2Y7CisJCWJ1Zls1XSAmPSAweDFmOworCisJCWR0LT50bV9zZWMgPSBCQ0RfVE9fQklOKGJ1ZlsxXSk7CisJCWR0LT50bV9taW4gPSBCQ0RfVE9fQklOKGJ1ZlsyXSk7CisJCWR0LT50bV9ob3VyID0gQkNEX1RPX0JJTihidWZbM10pOworCQlkdC0+dG1fbWRheSA9IEJDRF9UT19CSU4oYnVmWzRdKTsKKwkJZHQtPnRtX21vbiA9IEJDRF9UT19CSU4oYnVmWzVdKTsKKwl9CisKKwlyZXR1cm4gcmV0ID09IDIgPyAwIDogLUVJTzsKK30KKworc3RhdGljIGludCBwY2Y4NTgzX3NldF9kYXRldGltZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgcnRjX3RpbWUgKmR0LCBpbnQgZGF0ZXRvbykKK3sKKwl1bnNpZ25lZCBjaGFyIGJ1Zls4XTsKKwlpbnQgcmV0LCBsZW4gPSA2OworCisJYnVmWzBdID0gMDsKKwlidWZbMV0gPSBnZXRfY3RybChjbGllbnQpIHwgMHg4MDsKKwlidWZbMl0gPSAwOworCWJ1ZlszXSA9IEJJTl9UT19CQ0QoZHQtPnRtX3NlYyk7CisJYnVmWzRdID0gQklOX1RPX0JDRChkdC0+dG1fbWluKTsKKwlidWZbNV0gPSBCSU5fVE9fQkNEKGR0LT50bV9ob3VyKTsKKworCWlmIChkYXRldG9vKSB7CisJCWxlbiA9IDg7CisJCWJ1Zls2XSA9IEJJTl9UT19CQ0QoZHQtPnRtX21kYXkpIHwgKGR0LT50bV95ZWFyIDw8IDYpOworCQlidWZbN10gPSBCSU5fVE9fQkNEKGR0LT50bV9tb24pICB8IChkdC0+dG1fd2RheSA8PCA1KTsKKwl9CisKKwlyZXQgPSBpMmNfbWFzdGVyX3NlbmQoY2xpZW50LCAoY2hhciAqKWJ1ZiwgbGVuKTsKKwlpZiAocmV0ICE9IGxlbikKKwkJcmV0dXJuIC1FSU87CisKKwlidWZbMV0gPSBnZXRfY3RybChjbGllbnQpOworCXJldCA9IGkyY19tYXN0ZXJfc2VuZChjbGllbnQsIChjaGFyICopYnVmLCAyKTsKKworCXJldHVybiByZXQgPT0gMiA/IDAgOiAtRUlPOworfQorCitzdGF0aWMgaW50IHBjZjg1ODNfZ2V0X2N0cmwoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdW5zaWduZWQgY2hhciAqY3RybCkKK3sKKwkqY3RybCA9IGdldF9jdHJsKGNsaWVudCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGNmODU4M19zZXRfY3RybChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1bnNpZ25lZCBjaGFyICpjdHJsKQoreworCXVuc2lnbmVkIGNoYXIgYnVmWzJdOworCisJYnVmWzBdID0gMDsKKwlidWZbMV0gPSAqY3RybDsKKwlzZXRfY3RybChjbGllbnQsICpjdHJsKTsKKworCXJldHVybiBpMmNfbWFzdGVyX3NlbmQoY2xpZW50LCAoY2hhciAqKWJ1ZiwgMik7Cit9CisKK3N0YXRpYyBpbnQgcGNmODU4M19yZWFkX21lbShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgcnRjX21lbSAqbWVtKQoreworCXVuc2lnbmVkIGNoYXIgYWRkclsxXTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2dzWzJdID0geworCQl7CisJCQkuYWRkciA9IGNsaWVudC0+YWRkciwKKwkJCS5mbGFncyA9IDAsCisJCQkubGVuID0gMSwKKwkJCS5idWYgPSBhZGRyLAorCQl9LCB7CisJCQkuYWRkciA9IGNsaWVudC0+YWRkciwKKwkJCS5mbGFncyA9IEkyQ19NX1JELAorCQkJLmxlbiA9IG1lbS0+bnIsCisJCQkuYnVmID0gbWVtLT5kYXRhLAorCQl9CisJfTsKKworCWlmIChtZW0tPmxvYyA8IDgpCisJCXJldHVybiAtRUlOVkFMOworCisJYWRkclswXSA9IG1lbS0+bG9jOworCisJcmV0dXJuIGkyY190cmFuc2ZlcihjbGllbnQtPmFkYXB0ZXIsIG1zZ3MsIDIpID09IDIgPyAwIDogLUVJTzsKK30KKworc3RhdGljIGludCBwY2Y4NTgzX3dyaXRlX21lbShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgcnRjX21lbSAqbWVtKQoreworCXVuc2lnbmVkIGNoYXIgYWRkclsxXTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2dzWzJdID0geworCQl7CisJCQkuYWRkciA9IGNsaWVudC0+YWRkciwKKwkJCS5mbGFncyA9IDAsCisJCQkubGVuID0gMSwKKwkJCS5idWYgPSBhZGRyLAorCQl9LCB7CisJCQkuYWRkciA9IGNsaWVudC0+YWRkciwKKwkJCS5mbGFncyA9IEkyQ19NX05PU1RBUlQsCisJCQkubGVuID0gbWVtLT5uciwKKwkJCS5idWYgPSBtZW0tPmRhdGEsCisJCX0KKwl9OworCisJaWYgKG1lbS0+bG9jIDwgOCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlhZGRyWzBdID0gbWVtLT5sb2M7CisKKwlyZXR1cm4gaTJjX3RyYW5zZmVyKGNsaWVudC0+YWRhcHRlciwgbXNncywgMikgPT0gMiA/IDAgOiAtRUlPOworfQorCitzdGF0aWMgaW50IHBjZjg1ODNfcnRjX3JlYWRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwl1bnNpZ25lZCBjaGFyIGN0cmwsIHllYXJbMl07CisJc3RydWN0IHJ0Y19tZW0gbWVtID0geyBDTU9TX1lFQVIsIHNpemVvZih5ZWFyKSwgeWVhciB9OworCWludCByZWFsX3llYXIsIHllYXJfb2Zmc2V0LCBlcnI7CisKKwkvKgorCSAqIEVuc3VyZSB0aGF0IHRoZSBSVEMgaXMgcnVubmluZy4KKwkgKi8KKwlwY2Y4NTgzX2dldF9jdHJsKGNsaWVudCwgJmN0cmwpOworCWlmIChjdHJsICYgKENUUkxfU1RPUCB8IENUUkxfSE9MRCkpIHsKKwkJdW5zaWduZWQgY2hhciBuZXdfY3RybCA9IGN0cmwgJiB+KENUUkxfU1RPUCB8IENUUkxfSE9MRCk7CisKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiUlRDOiByZXNldHRpbmcgY29udHJvbCAlMDJ4IC0+ICUwMnhcbiIsCisJCSAgICAgICBjdHJsLCBuZXdfY3RybCk7CisKKwkJaWYgKChlcnIgPSBwY2Y4NTgzX3NldF9jdHJsKGNsaWVudCwgJm5ld19jdHJsKSkgPCAwKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwlpZiAocGNmODU4M19nZXRfZGF0ZXRpbWUoY2xpZW50LCB0bSkgfHwKKwkgICAgcGNmODU4M19yZWFkX21lbShjbGllbnQsICZtZW0pKQorCQlyZXR1cm4gLUVJTzsKKworCXJlYWxfeWVhciA9IHllYXJbMF07CisKKwkvKgorCSAqIFRoZSBSVEMgeWVhciBob2xkcyB0aGUgTFNCIHR3byBiaXRzIG9mIHRoZSBjdXJyZW50CisJICogeWVhciwgd2hpY2ggc2hvdWxkIHJlZmxlY3QgdGhlIExTQiB0d28gYml0cyBvZiB0aGUKKwkgKiBDTU9TIGNvcHkgb2YgdGhlIHllYXIuICBBbnkgZGlmZmVyZW5jZSBpbmRpY2F0ZXMKKwkgKiB0aGF0IHdlIGhhdmUgdG8gY29ycmVjdCB0aGUgQ01PUyB2ZXJzaW9uLgorCSAqLworCXllYXJfb2Zmc2V0ID0gdG0tPnRtX3llYXIgLSAocmVhbF95ZWFyICYgMyk7CisJaWYgKHllYXJfb2Zmc2V0IDwgMCkKKwkJLyoKKwkJICogUlRDIHllYXIgd3JhcHBlZC4gIEFkanVzdCBpdCBhcHByb3ByaWF0ZWx5LgorCQkgKi8KKwkJeWVhcl9vZmZzZXQgKz0gNDsKKworCXRtLT50bV95ZWFyID0gcmVhbF95ZWFyICsgeWVhcl9vZmZzZXQgKyB5ZWFyWzFdICogMTAwOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGNmODU4M19ydGNfc2V0X3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJdW5zaWduZWQgY2hhciB5ZWFyWzJdLCBjaGs7CisJc3RydWN0IHJ0Y19tZW0gY21vc195ZWFyICA9IHsgQ01PU19ZRUFSLCBzaXplb2YoeWVhciksIHllYXIgfTsKKwlzdHJ1Y3QgcnRjX21lbSBjbW9zX2NoZWNrID0geyBDTU9TX0NIRUNLU1VNLCAxLCAmY2hrIH07CisJaW50IHJldDsKKworCS8qCisJICogVGhlIFJUQydzIG93biAyLWJpdCB5ZWFyIG11c3QgcmVmbGVjdCB0aGUgbGVhc3QKKwkgKiBzaWduaWZpY2FudCB0d28gYml0cyBvZiB0aGUgQ01PUyB5ZWFyLgorCSAqLworCisJcmV0ID0gcGNmODU4M19zZXRfZGF0ZXRpbWUoY2xpZW50LCB0bSwgMSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHBjZjg1ODNfcmVhZF9tZW0oY2xpZW50LCAmY21vc19jaGVjayk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHBjZjg1ODNfcmVhZF9tZW0oY2xpZW50LCAmY21vc195ZWFyKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJY2hrIC09IHllYXJbMV0gKyB5ZWFyWzBdOworCisJeWVhclsxXSA9IHRtLT50bV95ZWFyIC8gMTAwOworCXllYXJbMF0gPSB0bS0+dG1feWVhciAlIDEwMDsKKworCWNoayArPSB5ZWFyWzFdICsgeWVhclswXTsKKworCXJldCA9IHBjZjg1ODNfd3JpdGVfbWVtKGNsaWVudCwgJmNtb3NfeWVhcik7CisKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gcGNmODU4M193cml0ZV9tZW0oY2xpZW50LCAmY21vc19jaGVjayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IHJ0Y19jbGFzc19vcHMgcGNmODU4M19ydGNfb3BzID0geworCS5yZWFkX3RpbWUJPSBwY2Y4NTgzX3J0Y19yZWFkX3RpbWUsCisJLnNldF90aW1lCT0gcGNmODU4M19ydGNfc2V0X3RpbWUsCit9OworCitzdGF0aWMgaW50IHBjZjg1ODNfcHJvYmUoc3RydWN0IGkyY19hZGFwdGVyICphZGFwLCBpbnQgYWRkciwgaW50IGtpbmQpOworCitzdGF0aWMgaW50IHBjZjg1ODNfYXR0YWNoKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKK3sKKwlyZXR1cm4gaTJjX3Byb2JlKGFkYXAsICZhZGRyX2RhdGEsIHBjZjg1ODNfcHJvYmUpOworfQorCitzdGF0aWMgaW50IHBjZjg1ODNfZGV0YWNoKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgcGNmODU4MyAqcGNmID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YyA9IHBjZi0+cnRjOworCisJaWYgKHJ0YykKKwkJcnRjX2RldmljZV91bnJlZ2lzdGVyKHJ0Yyk7CisKKwlpZiAoKGVyciA9IGkyY19kZXRhY2hfY2xpZW50KGNsaWVudCkpKQorCQlyZXR1cm4gZXJyOworCisJa2ZyZWUocGNmKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHBjZjg1ODNfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lCT0gInBjZjg1ODMiLAorCX0sCisJLmlkCQk9IEkyQ19EUklWRVJJRF9QQ0Y4NTgzLAorCS5hdHRhY2hfYWRhcHRlcgk9IHBjZjg1ODNfYXR0YWNoLAorCS5kZXRhY2hfY2xpZW50CT0gcGNmODU4M19kZXRhY2gsCit9OworCitzdGF0aWMgaW50IHBjZjg1ODNfcHJvYmUoc3RydWN0IGkyY19hZGFwdGVyICphZGFwLCBpbnQgYWRkciwgaW50IGtpbmQpCit7CisJc3RydWN0IHBjZjg1ODMgKnBjZjsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworCXN0cnVjdCBydGNfZGV2aWNlICpydGM7CisJdW5zaWduZWQgY2hhciBidWZbMV0sIGFkWzFdID0geyAwIH07CisJaW50IGVycjsKKwlzdHJ1Y3QgaTJjX21zZyBtc2dzWzJdID0geworCQl7CisJCQkuYWRkciA9IGFkZHIsCisJCQkuZmxhZ3MgPSAwLAorCQkJLmxlbiA9IDEsCisJCQkuYnVmID0gYWQsCisJCX0sIHsKKwkJCS5hZGRyID0gYWRkciwKKwkJCS5mbGFncyA9IEkyQ19NX1JELAorCQkJLmxlbiA9IDEsCisJCQkuYnVmID0gYnVmLAorCQl9CisJfTsKKworCXBjZiA9IGt6YWxsb2Moc2l6ZW9mKCpwY2YpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBjZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljbGllbnQgPSAmcGNmLT5jbGllbnQ7CisKKwljbGllbnQtPmFkZHIJCT0gYWRkcjsKKwljbGllbnQtPmFkYXB0ZXIJPSBhZGFwOworCWNsaWVudC0+ZHJpdmVyCT0gJnBjZjg1ODNfZHJpdmVyOworCisJc3RybGNweShjbGllbnQtPm5hbWUsIHBjZjg1ODNfZHJpdmVyLmRyaXZlci5uYW1lLCBJMkNfTkFNRV9TSVpFKTsKKworCWlmIChpMmNfdHJhbnNmZXIoY2xpZW50LT5hZGFwdGVyLCBtc2dzLCAyKSAhPSAyKSB7CisJCWVyciA9IC1FSU87CisJCWdvdG8gZXhpdF9rZnJlZTsKKwl9CisKKwllcnIgPSBpMmNfYXR0YWNoX2NsaWVudChjbGllbnQpOworCisJaWYgKGVycikKKwkJZ290byBleGl0X2tmcmVlOworCisJcnRjID0gcnRjX2RldmljZV9yZWdpc3RlcihwY2Y4NTgzX2RyaXZlci5kcml2ZXIubmFtZSwgJmNsaWVudC0+ZGV2LAorCQkJCSAgJnBjZjg1ODNfcnRjX29wcywgVEhJU19NT0RVTEUpOworCisJaWYgKElTX0VSUihydGMpKSB7CisJCWVyciA9IFBUUl9FUlIocnRjKTsKKwkJZ290byBleGl0X2RldGFjaDsKKwl9CisKKwlwY2YtPnJ0YyA9IHJ0YzsKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBwY2YpOworCXNldF9jdHJsKGNsaWVudCwgYnVmWzBdKTsKKworCXJldHVybiAwOworCitleGl0X2RldGFjaDoKKwlpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpOworCitleGl0X2tmcmVlOgorCWtmcmVlKHBjZik7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgX19pbml0IGludCBwY2Y4NTgzX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJnBjZjg1ODNfZHJpdmVyKTsKK30KKworc3RhdGljIF9fZXhpdCB2b2lkIHBjZjg1ODNfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZwY2Y4NTgzX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHBjZjg1ODNfaW5pdCk7Cittb2R1bGVfZXhpdChwY2Y4NTgzX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJSdXNzZWxsIEtpbmciKTsKK01PRFVMRV9ERVNDUklQVElPTigiUENGODU4MyBJMkMgUlRDIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLXBsMDMxLmMgYi9kcml2ZXJzL3J0Yy9ydGMtcGwwMzEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTUzODYzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ydGMvcnRjLXBsMDMxLmMKQEAgLTAsMCArMSwyMzMgQEAKKy8qCisgKiBkcml2ZXJzL3J0Yy9ydGMtcGwwMzEuYworICoKKyAqIFJlYWwgVGltZSBDbG9jayBpbnRlcmZhY2UgZm9yIEFSTSBBTUJBIFByaW1lQ2VsbCAwMzEgUlRDCisgKgorICogQXV0aG9yOiBEZWVwYWsgU2F4ZW5hIDxkc2F4ZW5hQHBsZXhpdHkubmV0PgorICoKKyAqIENvcHlyaWdodCAyMDA2IChjKSBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvcG0uaD4KKworI2luY2x1ZGUgPGxpbnV4L2FtYmEvYnVzLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vYml0b3BzLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9ydGMuaD4KKworLyoKKyAqIFJlZ2lzdGVyIGRlZmluaXRpb25zCisgKi8KKyNkZWZpbmUJUlRDX0RSCQkweDAwCS8qIERhdGEgcmVhZCByZWdpc3RlciAqLworI2RlZmluZQlSVENfTVIJCTB4MDQJLyogTWF0Y2ggcmVnaXN0ZXIgKi8KKyNkZWZpbmUJUlRDX0xSCQkweDA4CS8qIERhdGEgbG9hZCByZWdpc3RlciAqLworI2RlZmluZQlSVENfQ1IJCTB4MGMJLyogQ29udHJvbCByZWdpc3RlciAqLworI2RlZmluZQlSVENfSU1TQwkweDEwCS8qIEludGVycnVwdCBtYXNrIGFuZCBzZXQgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJUlRDX1JJUwkJMHgxNAkvKiBSYXcgaW50ZXJydXB0IHN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZQlSVENfTUlTCQkweDE4CS8qIE1hc2tlZCBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lCVJUQ19JQ1IJCTB4MWMJLyogSW50ZXJydXB0IGNsZWFyIHJlZ2lzdGVyICovCisKK3N0cnVjdCBwbDAzMV9sb2NhbCB7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YzsKKwl2b2lkIF9faW9tZW0gKmJhc2U7Cit9OworCitzdGF0aWMgaXJxcmV0dXJuX3QgcGwwMzFfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YyA9IGRldl9pZDsKKworCXJ0Y191cGRhdGVfaXJxKCZydGMtPmNsYXNzX2RldiwgMSwgUlRDX0FGKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBwbDAzMV9vcGVuKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwkvKgorCSAqIFdlIHJlcXVlc3QgSVJRIGluIHBsMDMxX3Byb2JlLCBzbyBub3RoaW5nIHRvIGRvIGhlcmUuLi4KKwkgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcGwwMzFfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7Cit9CisKK3N0YXRpYyBpbnQgcGwwMzFfaW9jdGwoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgcGwwMzFfbG9jYWwgKmxkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgUlRDX0FJRV9PRkY6CisJCV9fcmF3X3dyaXRlbCgxLCBsZGF0YS0+YmFzZSArIFJUQ19NSVMpOworCQlyZXR1cm4gMDsKKwljYXNlIFJUQ19BSUVfT046CisJCV9fcmF3X3dyaXRlbCgwLCBsZGF0YS0+YmFzZSArIFJUQ19NSVMpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gLUVOT0lPQ1RMQ01EOworfQorCitzdGF0aWMgaW50IHBsMDMxX3JlYWRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJc3RydWN0IHBsMDMxX2xvY2FsICpsZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJcnRjX3RpbWVfdG9fdG0oX19yYXdfcmVhZGwobGRhdGEtPmJhc2UgKyBSVENfRFIpLCB0bSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwbDAzMV9zZXRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJdW5zaWduZWQgbG9uZyB0aW1lOworCXN0cnVjdCBwbDAzMV9sb2NhbCAqbGRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCXJ0Y190bV90b190aW1lKHRtLCAmdGltZSk7CisJX19yYXdfd3JpdGVsKHRpbWUsIGxkYXRhLT5iYXNlICsgUlRDX0xSKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBsMDMxX3JlYWRfYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3drYWxybSAqYWxhcm0pCit7CisJc3RydWN0IHBsMDMxX2xvY2FsICpsZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJcnRjX3RpbWVfdG9fdG0oX19yYXdfcmVhZGwobGRhdGEtPmJhc2UgKyBSVENfTVIpLCAmYWxhcm0tPnRpbWUpOworCWFsYXJtLT5wZW5kaW5nID0gX19yYXdfcmVhZGwobGRhdGEtPmJhc2UgKyBSVENfUklTKTsKKwlhbGFybS0+ZW5hYmxlZCA9IF9fcmF3X3JlYWRsKGxkYXRhLT5iYXNlICsgUlRDX0lNU0MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGwwMzFfc2V0X2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKmFsYXJtKQoreworCXN0cnVjdCBwbDAzMV9sb2NhbCAqbGRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1bnNpZ25lZCBsb25nIHRpbWU7CisKKwlydGNfdG1fdG9fdGltZSgmYWxhcm0tPnRpbWUsICZ0aW1lKTsKKworCV9fcmF3X3dyaXRlbCh0aW1lLCBsZGF0YS0+YmFzZSArIFJUQ19NUik7CisJX19yYXdfd3JpdGVsKCFhbGFybS0+ZW5hYmxlZCwgbGRhdGEtPmJhc2UgKyBSVENfTUlTKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHJ0Y19jbGFzc19vcHMgcGwwMzFfb3BzID0geworCS5vcGVuID0gcGwwMzFfb3BlbiwKKwkucmVsZWFzZSA9IHBsMDMxX3JlbGVhc2UsCisJLmlvY3RsID0gcGwwMzFfaW9jdGwsCisJLnJlYWRfdGltZSA9IHBsMDMxX3JlYWRfdGltZSwKKwkuc2V0X3RpbWUgPSBwbDAzMV9zZXRfdGltZSwKKwkucmVhZF9hbGFybSA9IHBsMDMxX3JlYWRfYWxhcm0sCisJLnNldF9hbGFybSA9IHBsMDMxX3NldF9hbGFybSwKK307CisKK3N0YXRpYyBpbnQgcGwwMzFfcmVtb3ZlKHN0cnVjdCBhbWJhX2RldmljZSAqYWRldikKK3sKKwlzdHJ1Y3QgcGwwMzFfbG9jYWwgKmxkYXRhID0gZGV2X2dldF9kcnZkYXRhKCZhZGV2LT5kZXYpOworCisJaWYgKGxkYXRhKSB7CisJCWRldl9zZXRfZHJ2ZGF0YSgmYWRldi0+ZGV2LCBOVUxMKTsKKwkJZnJlZV9pcnEoYWRldi0+aXJxWzBdLCBsZGF0YS0+cnRjKTsKKwkJcnRjX2RldmljZV91bnJlZ2lzdGVyKGxkYXRhLT5ydGMpOworCQlpb3VubWFwKGxkYXRhLT5iYXNlKTsKKwkJa2ZyZWUobGRhdGEpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBsMDMxX3Byb2JlKHN0cnVjdCBhbWJhX2RldmljZSAqYWRldiwgdm9pZCAqaWQpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgcGwwMzFfbG9jYWwgKmxkYXRhOworCisKKwlsZGF0YSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwbDAzMV9sb2NhbCksIEdGUF9LRVJORUwpOworCWlmICghbGRhdGEpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCWRldl9zZXRfZHJ2ZGF0YSgmYWRldi0+ZGV2LCBsZGF0YSk7CisKKwlsZGF0YS0+YmFzZSA9IGlvcmVtYXAoYWRldi0+cmVzLnN0YXJ0LAorCQkJICAgICAgYWRldi0+cmVzLmVuZCAtIGFkZXYtPnJlcy5zdGFydCArIDEpOworCWlmICghbGRhdGEtPmJhc2UpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXRfbm9fcmVtYXA7CisJfQorCisJaWYgKHJlcXVlc3RfaXJxKGFkZXYtPmlycVswXSwgcGwwMzFfaW50ZXJydXB0LCBTQV9JTlRFUlJVUFQsCisJCQkicnRjLXBsMDMxIiwgbGRhdGEtPnJ0YykpIHsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBvdXRfbm9faXJxOworCX0KKworCWxkYXRhLT5ydGMgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKCJwbDAzMSIsICZhZGV2LT5kZXYsICZwbDAzMV9vcHMsCisJCQkJCSBUSElTX01PRFVMRSk7CisJaWYgKElTX0VSUihsZGF0YS0+cnRjKSkgeworCQlyZXQgPSBQVFJfRVJSKGxkYXRhLT5ydGMpOworCQlnb3RvIG91dF9ub19ydGM7CisJfQorCisJcmV0dXJuIDA7CisKK291dF9ub19ydGM6CisJZnJlZV9pcnEoYWRldi0+aXJxWzBdLCBsZGF0YS0+cnRjKTsKK291dF9ub19pcnE6CisJaW91bm1hcChsZGF0YS0+YmFzZSk7CitvdXRfbm9fcmVtYXA6CisJZGV2X3NldF9kcnZkYXRhKCZhZGV2LT5kZXYsIE5VTEwpOworCWtmcmVlKGxkYXRhKTsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IGFtYmFfaWQgcGwwMzFfaWRzW10gX19pbml0ZGF0YSA9IHsKKwl7CisJCSAuaWQgPSAweDAwMDQxMDMxLAorCSAJLm1hc2sgPSAweDAwMGZmZmZmLCB9LAorCXswLCAwfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYW1iYV9kcml2ZXIgcGwwMzFfZHJpdmVyID0geworCS5kcnYgPSB7CisJCS5uYW1lID0gInJ0Yy1wbDAzMSIsCisJfSwKKwkuaWRfdGFibGUgPSBwbDAzMV9pZHMsCisJLnByb2JlID0gcGwwMzFfcHJvYmUsCisJLnJlbW92ZSA9IHBsMDMxX3JlbW92ZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHBsMDMxX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gYW1iYV9kcml2ZXJfcmVnaXN0ZXIoJnBsMDMxX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBwbDAzMV9leGl0KHZvaWQpCit7CisJYW1iYV9kcml2ZXJfdW5yZWdpc3RlcigmcGwwMzFfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQocGwwMzFfaW5pdCk7Cittb2R1bGVfZXhpdChwbDAzMV9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiRGVlcGFrIFNheGVuYSA8ZHNheGVuYUBwbGV4aXR5Lm5ldCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBUk0gQU1CQSBQTDAzMSBSVEMgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtc2ExMTAwLmMgYi9kcml2ZXJzL3J0Yy9ydGMtc2ExMTAwLmMKaW5kZXggYTk5NzUyOS4uYWI0ODZmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLXNhMTEwMC5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1zYTExMDAuYwpAQCAtMjI5LDggKzIyOSw2IEBACiAJCXNwaW5fdW5sb2NrX2lycSgmc2ExMTAwX3J0Y19sb2NrKTsKIAkJcmV0dXJuIDA7CiAJY2FzZSBSVENfUElFX09OOgotCQlpZiAoKHJ0Y19mcmVxID4gNjQpICYmICFjYXBhYmxlKENBUF9TWVNfUkVTT1VSQ0UpKQotCQkJcmV0dXJuIC1FQUNDRVM7CiAJCXNwaW5fbG9ja19pcnEoJnNhMTEwMF9ydGNfbG9jayk7CiAJCU9TTVIxID0gVElNRVJfRlJFUS9ydGNfZnJlcSArIE9TQ1I7CiAJCU9JRVIgfD0gT0lFUl9FMTsKQEAgLTI0Miw4ICsyNDAsNiBAQAogCWNhc2UgUlRDX0lSUVBfU0VUOgogCQlpZiAoYXJnIDwgMSB8fCBhcmcgPiBUSU1FUl9GUkVRKQogCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWlmICgoYXJnID4gNjQpICYmICghY2FwYWJsZShDQVBfU1lTX1JFU09VUkNFKSkpCi0JCQlyZXR1cm4gLUVBQ0NFUzsKIAkJcnRjX2ZyZXEgPSBhcmc7CiAJCXJldHVybiAwOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy12MzAyMC5jIGIvZHJpdmVycy9ydGMvcnRjLXYzMDIwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQwZjQwMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy12MzAyMC5jCkBAIC0wLDAgKzEsMjY0IEBACisvKiBkcml2ZXJzL3J0Yy9ydGMtdjMwMjAuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiA4RCBUZWNobm9sb2dpZXMgaW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA0IENvbXB1bGFiIEx0ZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIERyaXZlciBmb3IgdGhlIFYzMDIwIFJUQworICoKKyAqIENoYW5nZWxvZzoKKyAqCisgKiAgMTAtTWF5LTIwMDY6IFJhcGhhZWwgQXNzZW5hdCA8cmFwaEA4ZC5jb20+CisgKgkJCQktIENvbnZlcnRlZCB0byBwbGF0Zm9ybSBkcml2ZXIKKyAqCQkJCS0gVXNlIHRoZSBnZW5lcmljIHJ0YyBjbGFzcworICoKKyAqICA/Py0/Pz8tMjAwNDogU29tZW9uZSBhdCBDb21wdWxhYgorICogIAkJCS0gSW5pdGlhbCBkcml2ZXIgY3JlYXRpb24uCisgKgorICovCisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvYmNkLmg+CisjaW5jbHVkZSA8bGludXgvcnRjLXYzMDIwLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI3VuZGVmIERFQlVHCisKK3N0cnVjdCB2MzAyMCB7CisJdm9pZCBfX2lvbWVtICppb2FkZHJlc3M7CisJaW50IGxlZnRzaGlmdDsKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjOworfTsKKworc3RhdGljIHZvaWQgdjMwMjBfc2V0X3JlZyhzdHJ1Y3QgdjMwMjAgKmNoaXAsIHVuc2lnbmVkIGNoYXIgYWRkcmVzcywKKwkJCXVuc2lnbmVkIGNoYXIgZGF0YSkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBjaGFyIHRtcDsKKworCXRtcCA9IGFkZHJlc3M7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQl3cml0ZWwoKHRtcCAmIDEpIDw8IGNoaXAtPmxlZnRzaGlmdCwgY2hpcC0+aW9hZGRyZXNzKTsKKwkJdG1wID4+PSAxOworCX0KKworCS8qIENvbW1hbmRzIGRvbnQgaGF2ZSBkYXRhICovCisJaWYgKCFWMzAyMF9JU19DT01NQU5EKGFkZHJlc3MpKSB7CisJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJCXdyaXRlbCgoZGF0YSAmIDEpIDw8IGNoaXAtPmxlZnRzaGlmdCwgY2hpcC0+aW9hZGRyZXNzKTsKKwkJCWRhdGEgPj49IDE7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHYzMDIwX2dldF9yZWcoc3RydWN0IHYzMDIwICpjaGlwLCB1bnNpZ25lZCBjaGFyIGFkZHJlc3MpCit7CisJdW5zaWduZWQgaW50IGRhdGE9MDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJd3JpdGVsKChhZGRyZXNzICYgMSkgPDwgY2hpcC0+bGVmdHNoaWZ0LCBjaGlwLT5pb2FkZHJlc3MpOworCQlhZGRyZXNzID4+PSAxOworCX0KKworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJZGF0YSA+Pj0gMTsKKwkJaWYgKHJlYWRsKGNoaXAtPmlvYWRkcmVzcykgJiAoMSA8PCBjaGlwLT5sZWZ0c2hpZnQpKQorCQkJZGF0YSB8PSAweDgwOworCX0KKworCXJldHVybiBkYXRhOworfQorCitzdGF0aWMgaW50IHYzMDIwX3JlYWRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqZHQpCit7CisJc3RydWN0IHYzMDIwICpjaGlwID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IHRtcDsKKworCS8qIENvcHkgdGhlIGN1cnJlbnQgdGltZSB0byByYW0uLi4gKi8KKwl2MzAyMF9zZXRfcmVnKGNoaXAsIFYzMDIwX0NNRF9DTE9DSzJSQU0sIDApOworCisJLyogLi4uYW5kIHRoZW4gcmVhZCBjb25zdGFudCB2YWx1ZXMuICovCisJdG1wID0gdjMwMjBfZ2V0X3JlZyhjaGlwLCBWMzAyMF9TRUNPTkRTKTsKKwlkdC0+dG1fc2VjCT0gQkNEMkJJTih0bXApOworCXRtcCA9IHYzMDIwX2dldF9yZWcoY2hpcCwgVjMwMjBfTUlOVVRFUyk7CisJZHQtPnRtX21pbgk9IEJDRDJCSU4odG1wKTsKKwl0bXAgPSB2MzAyMF9nZXRfcmVnKGNoaXAsIFYzMDIwX0hPVVJTKTsKKwlkdC0+dG1faG91cgk9IEJDRDJCSU4odG1wKTsKKwl0bXAgPSB2MzAyMF9nZXRfcmVnKGNoaXAsIFYzMDIwX01PTlRIX0RBWSk7CisJZHQtPnRtX21kYXkJPSBCQ0QyQklOKHRtcCk7CisJdG1wID0gdjMwMjBfZ2V0X3JlZyhjaGlwLCBWMzAyMF9NT05USCk7CisJZHQtPnRtX21vbgk9IEJDRDJCSU4odG1wKTsKKwl0bXAgPSB2MzAyMF9nZXRfcmVnKGNoaXAsIFYzMDIwX1dFRUtfREFZKTsKKwlkdC0+dG1fd2RheQk9IEJDRDJCSU4odG1wKTsKKwl0bXAgPSB2MzAyMF9nZXRfcmVnKGNoaXAsIFYzMDIwX1lFQVIpOworCWR0LT50bV95ZWFyID0gQkNEMkJJTih0bXApKzEwMDsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJcbiVzIDogUmVhZCBSVEMgdmFsdWVzXG4iLF9fRlVOQ1RJT05fXyk7CisJcHJpbnRrKCJ0bV9ob3VyOiAlaVxuIixkdC0+dG1faG91cik7CisJcHJpbnRrKCJ0bV9taW4gOiAlaVxuIixkdC0+dG1fbWluKTsKKwlwcmludGsoInRtX3NlYyA6ICVpXG4iLGR0LT50bV9zZWMpOworCXByaW50aygidG1feWVhcjogJWlcbiIsZHQtPnRtX3llYXIpOworCXByaW50aygidG1fbW9uIDogJWlcbiIsZHQtPnRtX21vbik7CisJcHJpbnRrKCJ0bV9tZGF5OiAlaVxuIixkdC0+dG1fbWRheSk7CisJcHJpbnRrKCJ0bV93ZGF5OiAlaVxuIixkdC0+dG1fd2RheSk7CisjZW5kaWYKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgdjMwMjBfc2V0X3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKmR0KQoreworCXN0cnVjdCB2MzAyMCAqY2hpcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoIlxuJXMgOiBTZXR0aW5nIFJUQyB2YWx1ZXNcbiIsX19GVU5DVElPTl9fKTsKKwlwcmludGsoInRtX3NlYyA6ICVpXG4iLGR0LT50bV9zZWMpOworCXByaW50aygidG1fbWluIDogJWlcbiIsZHQtPnRtX21pbik7CisJcHJpbnRrKCJ0bV9ob3VyOiAlaVxuIixkdC0+dG1faG91cik7CisJcHJpbnRrKCJ0bV9tZGF5OiAlaVxuIixkdC0+dG1fbWRheSk7CisJcHJpbnRrKCJ0bV93ZGF5OiAlaVxuIixkdC0+dG1fd2RheSk7CisJcHJpbnRrKCJ0bV95ZWFyOiAlaVxuIixkdC0+dG1feWVhcik7CisjZW5kaWYKKworCS8qIFdyaXRlIGFsbCB0aGUgdmFsdWVzIHRvIHJhbS4uLiAqLworCXYzMDIwX3NldF9yZWcoY2hpcCwgVjMwMjBfU0VDT05EUywgCUJJTjJCQ0QoZHQtPnRtX3NlYykpOworCXYzMDIwX3NldF9yZWcoY2hpcCwgVjMwMjBfTUlOVVRFUywgCUJJTjJCQ0QoZHQtPnRtX21pbikpOworCXYzMDIwX3NldF9yZWcoY2hpcCwgVjMwMjBfSE9VUlMsIAlCSU4yQkNEKGR0LT50bV9ob3VyKSk7CisJdjMwMjBfc2V0X3JlZyhjaGlwLCBWMzAyMF9NT05USF9EQVksCUJJTjJCQ0QoZHQtPnRtX21kYXkpKTsKKwl2MzAyMF9zZXRfcmVnKGNoaXAsIFYzMDIwX01PTlRILCAJQklOMkJDRChkdC0+dG1fbW9uKSk7CisJdjMwMjBfc2V0X3JlZyhjaGlwLCBWMzAyMF9XRUVLX0RBWSwgCUJJTjJCQ0QoZHQtPnRtX3dkYXkpKTsKKwl2MzAyMF9zZXRfcmVnKGNoaXAsIFYzMDIwX1lFQVIsIAlCSU4yQkNEKGR0LT50bV95ZWFyICUgMTAwKSk7CisKKwkvKiAuLi5hbmQgc2V0IHRoZSBjbG9jay4gKi8KKwl2MzAyMF9zZXRfcmVnKGNoaXAsIFYzMDIwX0NNRF9SQU0yQ0xPQ0ssIDApOworCisJLyogQ29tcHVsYWIgdXNlZCB0aGlzIGRlbGF5IGhlcmUuIEkgZG9udCBrbm93IHdoeSwKKwkgKiB0aGUgZGF0YXNoZWV0IGRvZXMgbm90IHNwZWNpZnkgYSBkZWxheS4gKi8KKwkvKm1kZWxheSg1KTsqLworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcnRjX2NsYXNzX29wcyB2MzAyMF9ydGNfb3BzID0geworCS5yZWFkX3RpbWUJPSB2MzAyMF9yZWFkX3RpbWUsCisJLnNldF90aW1lCT0gdjMwMjBfc2V0X3RpbWUsCit9OworCitzdGF0aWMgaW50IHJ0Y19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCB2MzAyMF9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCB2MzAyMCAqY2hpcDsKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjOworCWludCByZXR2YWwgPSAtRUJVU1k7CisJaW50IGk7CisJaW50IHRlbXA7CisKKwlpZiAocGRldi0+bnVtX3Jlc291cmNlcyAhPSAxKQorCQlyZXR1cm4gLUVCVVNZOworCisJaWYgKHBkZXYtPnJlc291cmNlWzBdLmZsYWdzICE9IElPUkVTT1VSQ0VfTUVNKQorCQlyZXR1cm4gLUVCVVNZOworCisJaWYgKHBkZXYgPT0gTlVMTCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWNoaXAgPSBremFsbG9jKHNpemVvZiAqY2hpcCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjaGlwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNoaXAtPmxlZnRzaGlmdCA9IHBkYXRhLT5sZWZ0c2hpZnQ7CisJY2hpcC0+aW9hZGRyZXNzID0gaW9yZW1hcChwZGV2LT5yZXNvdXJjZVswXS5zdGFydCwgMSk7CisJaWYgKGNoaXAtPmlvYWRkcmVzcyA9PSBOVUxMKQorCQlnb3RvIGVycl9jaGlwOworCisJLyogTWFrZSBzdXJlIHRoZSB2MzAyMCBleHBlY3RzIGEgY29tbXVuaWNhdGlvbiBjeWNsZQorCSAqIGJ5IHJlYWRpbmcgOCB0aW1lcyAqLworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCXRlbXAgPSByZWFkbChjaGlwLT5pb2FkZHJlc3MpOworCisJLyogVGVzdCBjaGlwIGJ5IGRvaW5nIGEgd3JpdGUvcmVhZCBzZXF1ZW5jZQorCSAqIHRvIHRoZSBjaGlwIHJhbSAqLworCXYzMDIwX3NldF9yZWcoY2hpcCwgVjMwMjBfU0VDT05EUywgMHgzMyk7CisJaWYodjMwMjBfZ2V0X3JlZyhjaGlwLCBWMzAyMF9TRUNPTkRTKSAhPSAweDMzKSB7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX2lvOworCX0KKworCS8qIE1ha2Ugc3VyZSBmcmVxdWVuY3kgbWVhc3VybWVudCBtb2RlLCB0ZXN0IG1vZGVzLCBhbmQgbG9jaworCSAqIGFyZSBhbGwgZGlzYWJsZWQgKi8KKwl2MzAyMF9zZXRfcmVnKGNoaXAsIFYzMDIwX1NUQVRVU18wLCAweDApOworCisJZGV2X2luZm8oJnBkZXYtPmRldiwgIkNoaXAgYXZhaWxhYmxlIGF0IHBoeXNpY2FsIGFkZHJlc3MgMHglcCwiCisJCSJkYXRhIGNvbm5lY3RlZCB0byBEJWRcbiIsCisJCSh2b2lkKilwZGV2LT5yZXNvdXJjZVswXS5zdGFydCwKKwkJY2hpcC0+bGVmdHNoaWZ0KTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGNoaXApOworCisJcnRjID0gcnRjX2RldmljZV9yZWdpc3RlcigidjMwMjAiLAorCQkJCSZwZGV2LT5kZXYsICZ2MzAyMF9ydGNfb3BzLCBUSElTX01PRFVMRSk7CisJaWYgKElTX0VSUihydGMpKSB7CisJCXJldHZhbCA9IFBUUl9FUlIocnRjKTsKKwkJZ290byBlcnJfaW87CisJfQorCWNoaXAtPnJ0YyA9IHJ0YzsKKworCXJldHVybiAwOworCitlcnJfaW86CisJaW91bm1hcChjaGlwLT5pb2FkZHJlc3MpOworZXJyX2NoaXA6CisJa2ZyZWUoY2hpcCk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IHJ0Y19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCB2MzAyMCAqY2hpcCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YyA9IGNoaXAtPnJ0YzsKKworCWlmIChydGMpCisJCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihydGMpOworCisJaW91bm1hcChjaGlwLT5pb2FkZHJlc3MpOworCWtmcmVlKGNoaXApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHJ0Y19kZXZpY2VfZHJpdmVyID0geworCS5wcm9iZQk9IHJ0Y19wcm9iZSwKKwkucmVtb3ZlID0gcnRjX3JlbW92ZSwKKwkuZHJpdmVyID0geworCQkubmFtZQk9ICJ2MzAyMCIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCit9OworCitzdGF0aWMgX19pbml0IGludCB2MzAyMF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmcnRjX2RldmljZV9kcml2ZXIpOworfQorCitzdGF0aWMgX19leGl0IHZvaWQgdjMwMjBfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZydGNfZGV2aWNlX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHYzMDIwX2luaXQpOworbW9kdWxlX2V4aXQodjMwMjBfZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiVjMwMjAgUlRDIik7CitNT0RVTEVfQVVUSE9SKCJSYXBoYWVsIEFzc2VuYXQiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy12cjQxeHguYyBiL2RyaXZlcnMvcnRjL3J0Yy12cjQxeHguYwppbmRleCAyNzc1OTZjLi4zM2UwMjkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtdnI0MXh4LmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLXZyNDF4eC5jCkBAIC04MSw3ICs4MSw2IEBACiAKICNkZWZpbmUgUlRDX0ZSRVFVRU5DWQkJMzI3NjgKICNkZWZpbmUgTUFYX1BFUklPRElDX1JBVEUJNjU1MwotI2RlZmluZSBNQVhfVVNFUl9QRVJJT0RJQ19SQVRFCTY0CiAKIHN0YXRpYyB2b2lkIF9faW9tZW0gKnJ0YzFfYmFzZTsKIHN0YXRpYyB2b2lkIF9faW9tZW0gKnJ0YzJfYmFzZTsKQEAgLTI0MCw5ICsyMzksNiBAQAogCQlpZiAoYXJnID4gTUFYX1BFUklPRElDX1JBVEUpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAotCQlpZiAoYXJnID4gTUFYX1VTRVJfUEVSSU9ESUNfUkFURSAmJiBjYXBhYmxlKENBUF9TWVNfUkVTT1VSQ0UpID09IDApCi0JCQlyZXR1cm4gLUVBQ0NFUzsKLQogCQlwZXJpb2RpY19mcmVxdWVuY3kgPSBhcmc7CiAKIAkJY291bnQgPSBSVENfRlJFUVVFTkNZOwpAQCAtMjYzLDEwICsyNTksNiBAQAogCQkvKiBEb2Vzbid0IHN1cHBvcnQgYmVmb3JlIDE5MDAgKi8KIAkJaWYgKGFyZyA8IDE5MDApCiAJCQlyZXR1cm4gLUVJTlZBTDsKLQotCQlpZiAoY2FwYWJsZShDQVBfU1lTX1RJTUUpID09IDApCi0JCQlyZXR1cm4gLUVBQ0NFUzsKLQogCQllcG9jaCA9IGFyZzsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaGFyL3NjbHBfcXVpZXNjZS5jIGIvZHJpdmVycy9zMzkwL2NoYXIvc2NscF9xdWllc2NlLmMKaW5kZXggNTZmYTY5MS4uYTRjNTNjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NoYXIvc2NscF9xdWllc2NlLmMKKysrIGIvZHJpdmVycy9zMzkwL2NoYXIvc2NscF9xdWllc2NlLmMKQEAgLTEzLDYgKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CiAjaW5jbHVkZSA8YXNtL3NpZ3AuaD4KQEAgLTY2LDggKzY3LDYgQEAKIH0KICNlbmRpZgogCi1leHRlcm4gdm9pZCBjdHJsX2FsdF9kZWwodm9pZCk7Ci0KIC8qIEhhbmRsZXIgZm9yIHF1aWVzY2UgZXZlbnQuIFN0YXJ0IHNodXRkb3duIHByb2NlZHVyZS4gKi8KIHN0YXRpYyB2b2lkCiBzY2xwX3F1aWVzY2VfaGFuZGxlcihzdHJ1Y3QgZXZidWZfaGVhZGVyICpldmJ1ZikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9uZXQvbGNzLmMgYi9kcml2ZXJzL3MzOTAvbmV0L2xjcy5jCmluZGV4IGY5NDQxOWIuLjJlZGVkNTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9uZXQvbGNzLmMKKysrIGIvZHJpdmVycy9zMzkwL25ldC9sY3MuYwpAQCAtMTE0MCwxMCArMTE0MCw5IEBACiAJCX0KIAl9CiAJLyogcmUtaW5zZXJ0IGFsbCBlbnRyaWVzIGZyb20gdGhlIGZhaWxlZF9saXN0IGludG8gaXBtX2xpc3QgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaXBtLCB0bXAsICZmYWlsZWRfbGlzdCwgbGlzdCkgewotCQlsaXN0X2RlbF9pbml0KCZpcG0tPmxpc3QpOwotCQlsaXN0X2FkZF90YWlsKCZpcG0tPmxpc3QsICZjYXJkLT5pcG1fbGlzdCk7Ci0JfQorCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShpcG0sIHRtcCwgJmZhaWxlZF9saXN0LCBsaXN0KQorCQlsaXN0X21vdmVfdGFpbCgmaXBtLT5saXN0LCAmY2FyZC0+aXBtX2xpc3QpOworCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+aXBtX2xvY2ssIGZsYWdzKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9lcnAuYyBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZXJwLmMKaW5kZXggNDY4MmM4Yi4uOTA5NzMxYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9lcnAuYworKysgYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2VycC5jCkBAIC0xNjcsNyArMTY3LDcgQEAKICAqCQlpbml0aWF0ZXMgYWRhcHRlciByZWNvdmVyeSB3aGljaCBpcyBkb25lCiAgKgkJYXN5bmNocm9ub3VzbHkKICAqCi0gKiByZXR1cm5zOgkwCS0gaW5pdGlhdGVkIGFjdGlvbiBzdWNjZXNmdWxseQorICogcmV0dXJuczoJMAktIGluaXRpYXRlZCBhY3Rpb24gc3VjY2Vzc2Z1bGx5CiAgKgkJPDAJLSBmYWlsZWQgdG8gaW5pdGlhdGUgYWN0aW9uCiAgKi8KIGludApAQCAtMjAzLDcgKzIwMyw3IEBACiAgKiBwdXJwb3NlOglXcmFwcHBlciBmb3IgemZjcF9lcnBfYWRhcHRlcl9yZW9wZW5faW50ZXJuYWwKICAqICAgICAgICAgICAgICB1c2VkIHRvIGVuc3VyZSB0aGUgY29ycmVjdCBsb2NraW5nCiAgKgotICogcmV0dXJuczoJMAktIGluaXRpYXRlZCBhY3Rpb24gc3VjY2VzZnVsbHkKKyAqIHJldHVybnM6CTAJLSBpbml0aWF0ZWQgYWN0aW9uIHN1Y2Nlc3NmdWxseQogICoJCTwwCS0gZmFpbGVkIHRvIGluaXRpYXRlIGFjdGlvbgogICovCiBpbnQKQEAgLTQ2OSw3ICs0NjksNyBAQAogICoJCWluaXRpYXRlcyBGb3JjZWQgUmVvcGVuIHJlY292ZXJ5IHdoaWNoIGlzIGRvbmUKICAqCQlhc3luY2hyb25vdXNseQogICoKLSAqIHJldHVybnM6CTAJLSBpbml0aWF0ZWQgYWN0aW9uIHN1Y2Nlc2Z1bGx5CisgKiByZXR1cm5zOgkwCS0gaW5pdGlhdGVkIGFjdGlvbiBzdWNjZXNzZnVsbHkKICAqCQk8MAktIGZhaWxlZCB0byBpbml0aWF0ZSBhY3Rpb24KICAqLwogc3RhdGljIGludApAQCAtNTA5LDcgKzUwOSw3IEBACiAgKiBwdXJwb3NlOglXcmFwcHBlciBmb3IgemZjcF9lcnBfcG9ydF9mb3JjZWRfcmVvcGVuX2ludGVybmFsCiAgKiAgICAgICAgICAgICAgdXNlZCB0byBlbnN1cmUgdGhlIGNvcnJlY3QgbG9ja2luZwogICoKLSAqIHJldHVybnM6CTAJLSBpbml0aWF0ZWQgYWN0aW9uIHN1Y2Nlc2Z1bGx5CisgKiByZXR1cm5zOgkwCS0gaW5pdGlhdGVkIGFjdGlvbiBzdWNjZXNzZnVsbHkKICAqCQk8MAktIGZhaWxlZCB0byBpbml0aWF0ZSBhY3Rpb24KICAqLwogaW50CkBAIC01MzYsNyArNTM2LDcgQEAKICAqCQlpbml0aWF0ZXMgUmVvcGVuIHJlY292ZXJ5IHdoaWNoIGlzIGRvbmUKICAqCQlhc3luY2hyb25vdXNseQogICoKLSAqIHJldHVybnM6CTAJLSBpbml0aWF0ZWQgYWN0aW9uIHN1Y2Nlc2Z1bGx5CisgKiByZXR1cm5zOgkwCS0gaW5pdGlhdGVkIGFjdGlvbiBzdWNjZXNzZnVsbHkKICAqCQk8MAktIGZhaWxlZCB0byBpbml0aWF0ZSBhY3Rpb24KICAqLwogc3RhdGljIGludApAQCAtNjA1LDcgKzYwNSw3IEBACiAgKgkJaW5pdGlhdGVzIFJlb3BlbiByZWNvdmVyeSB3aGljaCBpcyBkb25lCiAgKgkJYXN5bmNocm9ub3VzbHkKICAqCi0gKiByZXR1cm5zOgkwCS0gaW5pdGlhdGVkIGFjdGlvbiBzdWNjZXNmdWxseQorICogcmV0dXJuczoJMAktIGluaXRpYXRlZCBhY3Rpb24gc3VjY2Vzc2Z1bGx5CiAgKgkJPDAJLSBmYWlsZWQgdG8gaW5pdGlhdGUgYWN0aW9uCiAgKi8KIHN0YXRpYyBpbnQKQEAgLTE4MDUsNyArMTgwNSw3IEBACiAgKiBwdXJwb3NlOglXcmFwcHBlciBmb3IgemZjcF9lcnBfcG9ydF9yZW9wZW5fYWxsX2ludGVybmFsCiAgKiAgICAgICAgICAgICAgdXNlZCB0byBlbnN1cmUgdGhlIGNvcnJlY3QgbG9ja2luZwogICoKLSAqIHJldHVybnM6CTAJLSBpbml0aWF0ZWQgYWN0aW9uIHN1Y2Nlc2Z1bGx5CisgKiByZXR1cm5zOgkwCS0gaW5pdGlhdGVkIGFjdGlvbiBzdWNjZXNzZnVsbHkKICAqCQk8MAktIGZhaWxlZCB0byBpbml0aWF0ZSBhY3Rpb24KICAqLwogaW50CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NidXMvY2hhci9jcHdhdGNoZG9nLmMgYi9kcml2ZXJzL3NidXMvY2hhci9jcHdhdGNoZG9nLmMKaW5kZXggNWJmM2RkOS4uMjE3MzdiNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zYnVzL2NoYXIvY3B3YXRjaGRvZy5jCisrKyBiL2RyaXZlcnMvc2J1cy9jaGFyL2Nwd2F0Y2hkb2cuYwpAQCAtNzU1LDcgKzc1NSw3IEBACiAKIAlmb3JfZWFjaF9lYnVzKGVidXMpIHsKIAkJZm9yX2VhY2hfZWJ1c2RldihlZGV2LCBlYnVzKSB7Ci0JCQlpZiAoIXN0cmNtcChlZGV2LT5wcm9tX25hbWUsIFdEX09CUE5BTUUpKQorCQkJaWYgKCFzdHJjbXAoZWRldi0+b2ZkZXYubm9kZS0+bmFtZSwgV0RfT0JQTkFNRSkpCiAJCQkJZ290byBlYnVzX2RvbmU7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NidXMvY2hhci9mbGFzaC5jIGIvZHJpdmVycy9zYnVzL2NoYXIvZmxhc2guYwppbmRleCA1YWU2ODRjLi4zMWI4YTVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NidXMvY2hhci9mbGFzaC5jCisrKyBiL2RyaXZlcnMvc2J1cy9jaGFyL2ZsYXNoLmMKQEAgLTcxLDcgKzcxLDYgQEAKIAlpZiAodm1hLT52bV9lbmQgLSAodm1hLT52bV9zdGFydCArICh2bWEtPnZtX3Bnb2ZmIDw8IFBBR0VfU0hJRlQpKSA+IHNpemUpCiAJCXNpemUgPSB2bWEtPnZtX2VuZCAtICh2bWEtPnZtX3N0YXJ0ICsgKHZtYS0+dm1fcGdvZmYgPDwgUEFHRV9TSElGVCkpOwogCi0Jdm1hLT52bV9mbGFncyB8PSAoVk1fU0hNIHwgVk1fTE9DS0VEKTsKIAl2bWEtPnZtX3BhZ2VfcHJvdCA9IHBncHJvdF9ub25jYWNoZWQodm1hLT52bV9wYWdlX3Byb3QpOwogCiAJaWYgKGlvX3JlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsIGFkZHIsIHNpemUsIHZtYS0+dm1fcGFnZV9wcm90KSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2J1cy9jaGFyL29wZW5wcm9tLmMgYi9kcml2ZXJzL3NidXMvY2hhci9vcGVucHJvbS5jCmluZGV4IGNmNWI0NzYuLmQ3ZTRiYjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2J1cy9jaGFyL29wZW5wcm9tLmMKKysrIGIvZHJpdmVycy9zYnVzL2NoYXIvb3BlbnByb20uYwpAQCAtMjksOCArMjksNiBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuIAogICovCiAKLSNkZWZpbmUgUFJPTUxJQl9JTlRFUk5BTAotCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CkBAIC0zOSwxMCArMzcsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8YXNtL29wbGliLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vb3BlbnByb21pby5oPgpAQCAtNTEsMTUgKzQ5LDIwIEBACiAjaW5jbHVkZSA8YXNtL3BibS5oPgogI2VuZGlmCiAKK01PRFVMRV9BVVRIT1IoIlRob21hcyBLLiBEeWFzICh0ZHlhc0Bub2MucnV0Z2Vycy5lZHUpIGFuZCBFZGRpZSBDLiBEb3N0ICAoZWNkQHNreW5ldC5iZSkiKTsKK01PRFVMRV9ERVNDUklQVElPTigiT1BFTlBST00gQ29uZmlndXJhdGlvbiBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKCIxLjAiKTsKKwogLyogUHJpdmF0ZSBkYXRhIGtlcHQgYnkgdGhlIGRyaXZlciBmb3IgZWFjaCBkZXNjcmlwdG9yLiAqLwogdHlwZWRlZiBzdHJ1Y3Qgb3BlbnByb21fcHJpdmF0ZV9kYXRhCiB7Ci0JaW50IGN1cnJlbnRfbm9kZTsJLyogQ3VycmVudCBub2RlIGZvciBTdW5PUyBpb2N0bHMuICovCi0JaW50IGxhc3Rub2RlOwkJLyogTGFzdCB2YWxpZCBub2RlIHVzZWQgYnkgQlNEIGlvY3Rscy4gKi8KKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmN1cnJlbnRfbm9kZTsgLyogQ3VycmVudCBub2RlIGZvciBTdW5PUyBpb2N0bHMuICovCisJc3RydWN0IGRldmljZV9ub2RlICpsYXN0bm9kZTsgLyogTGFzdCB2YWxpZCBub2RlIHVzZWQgYnkgQlNEIGlvY3Rscy4gKi8KIH0gREFUQTsKIAogLyogSUQgb2YgdGhlIFBST00gbm9kZSBjb250YWluaW5nIGFsbCBvZiB0aGUgRUVQUk9NIG9wdGlvbnMuICovCi1zdGF0aWMgaW50IG9wdGlvbnNfbm9kZSA9IDA7CitzdGF0aWMgc3RydWN0IGRldmljZV9ub2RlICpvcHRpb25zX25vZGU7CiAKIC8qCiAgKiBDb3B5IGFuIG9wZW5wcm9taW8gc3RydWN0dXJlIGludG8ga2VybmVsIHNwYWNlIGZyb20gdXNlciBzcGFjZS4KQEAgLTg3LDkgKzkwLDggQEAKIAlpZiAoYnVmc2l6ZSA+IE9QUk9NTUFYUEFSQU0pCiAJCWJ1ZnNpemUgPSBPUFJPTU1BWFBBUkFNOwogCi0JaWYgKCEoKm9wcF9wID0ga21hbGxvYyhzaXplb2YoaW50KSArIGJ1ZnNpemUgKyAxLCBHRlBfS0VSTkVMKSkpCisJaWYgKCEoKm9wcF9wID0ga3phbGxvYyhzaXplb2YoaW50KSArIGJ1ZnNpemUgKyAxLCBHRlBfS0VSTkVMKSkpCiAJCXJldHVybiAtRU5PTUVNOwotCW1lbXNldCgqb3BwX3AsIDAsIHNpemVvZihpbnQpICsgYnVmc2l6ZSArIDEpOwogCiAJaWYgKGNvcHlfZnJvbV91c2VyKCYoKm9wcF9wKS0+b3Byb21fYXJyYXksCiAJCQkgICAmaW5mby0+b3Byb21fYXJyYXksIGJ1ZnNpemUpKSB7CkBAIC0xMDcsMTAgKzEwOSw5IEBACiAJaWYgKCFpbmZvIHx8ICFvcHBfcCkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQlpZiAoISgqb3BwX3AgPSBrbWFsbG9jKHNpemVvZihpbnQpICsgT1BST01NQVhQQVJBTSArIDEsIEdGUF9LRVJORUwpKSkKKwlpZiAoISgqb3BwX3AgPSBremFsbG9jKHNpemVvZihpbnQpICsgT1BST01NQVhQQVJBTSArIDEsIEdGUF9LRVJORUwpKSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQltZW1zZXQoKm9wcF9wLCAwLCBzaXplb2YoaW50KSArIE9QUk9NTUFYUEFSQU0gKyAxKTsKIAkoKm9wcF9wKS0+b3Byb21fc2l6ZSA9IDA7CiAKIAluID0gYnVmc2l6ZSA9IDA7CkBAIC0xNDAsMTYgKzE0MSwxNjQgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBvcHJvbWdldHByb3Aodm9pZCBfX3VzZXIgKmFyZ3AsIHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAsIHN0cnVjdCBvcGVucHJvbWlvICpvcCwgaW50IGJ1ZnNpemUpCit7CisJdm9pZCAqcHZhbDsKKwlpbnQgbGVuOworCisJcHZhbCA9IG9mX2dldF9wcm9wZXJ0eShkcCwgb3AtPm9wcm9tX2FycmF5LCAmbGVuKTsKKwlpZiAoIXB2YWwgfHwgbGVuIDw9IDAgfHwgbGVuID4gYnVmc2l6ZSkKKwkJcmV0dXJuIGNvcHlvdXQoYXJncCwgb3AsIHNpemVvZihpbnQpKTsKKworCW1lbWNweShvcC0+b3Byb21fYXJyYXksIHB2YWwsIGxlbik7CisJb3AtPm9wcm9tX2FycmF5W2xlbl0gPSAnXDAnOworCW9wLT5vcHJvbV9zaXplID0gbGVuOworCisJcmV0dXJuIGNvcHlvdXQoYXJncCwgb3AsIHNpemVvZihpbnQpICsgYnVmc2l6ZSk7Cit9CisKK3N0YXRpYyBpbnQgb3Byb21ueHRwcm9wKHZvaWQgX191c2VyICphcmdwLCBzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwLCBzdHJ1Y3Qgb3BlbnByb21pbyAqb3AsIGludCBidWZzaXplKQoreworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKwlpbnQgbGVuOworCisJaWYgKG9wLT5vcHJvbV9hcnJheVswXSA9PSAnXDAnKSB7CisJCXByb3AgPSBkcC0+cHJvcGVydGllczsKKwkJaWYgKCFwcm9wKQorCQkJcmV0dXJuIGNvcHlvdXQoYXJncCwgb3AsIHNpemVvZihpbnQpKTsKKwkJbGVuID0gc3RybGVuKHByb3AtPm5hbWUpOworCX0gZWxzZSB7CisJCXByb3AgPSBvZl9maW5kX3Byb3BlcnR5KGRwLCBvcC0+b3Byb21fYXJyYXksIE5VTEwpOworCisJCWlmICghcHJvcCB8fAorCQkgICAgIXByb3AtPm5leHQgfHwKKwkJICAgIChsZW4gPSBzdHJsZW4ocHJvcC0+bmV4dC0+bmFtZSkpICsgMSA+IGJ1ZnNpemUpCisJCQlyZXR1cm4gY29weW91dChhcmdwLCBvcCwgc2l6ZW9mKGludCkpOworCisJCXByb3AgPSBwcm9wLT5uZXh0OworCX0KKworCW1lbWNweShvcC0+b3Byb21fYXJyYXksIHByb3AtPm5hbWUsIGxlbik7CisJb3AtPm9wcm9tX2FycmF5W2xlbl0gPSAnXDAnOworCW9wLT5vcHJvbV9zaXplID0gKytsZW47CisKKwlyZXR1cm4gY29weW91dChhcmdwLCBvcCwgc2l6ZW9mKGludCkgKyBidWZzaXplKTsKK30KKworc3RhdGljIGludCBvcHJvbXNldG9wdChzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwLCBzdHJ1Y3Qgb3BlbnByb21pbyAqb3AsIGludCBidWZzaXplKQoreworCWNoYXIgKmJ1ZiA9IG9wLT5vcHJvbV9hcnJheSArIHN0cmxlbihvcC0+b3Byb21fYXJyYXkpICsgMTsKKwlpbnQgbGVuID0gb3AtPm9wcm9tX2FycmF5ICsgYnVmc2l6ZSAtIGJ1ZjsKKworCXJldHVybiBvZl9zZXRfcHJvcGVydHkob3B0aW9uc19ub2RlLCBvcC0+b3Byb21fYXJyYXksIGJ1ZiwgbGVuKTsKK30KKworc3RhdGljIGludCBvcHJvbW5leHQodm9pZCBfX3VzZXIgKmFyZ3AsIHVuc2lnbmVkIGludCBjbWQsIHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAsIHN0cnVjdCBvcGVucHJvbWlvICpvcCwgaW50IGJ1ZnNpemUsIERBVEEgKmRhdGEpCit7CisJcGhhbmRsZSBwaDsKKworCUJVSUxEX0JVR19PTihzaXplb2YocGhhbmRsZSkgIT0gc2l6ZW9mKGludCkpOworCisJaWYgKGJ1ZnNpemUgPCBzaXplb2YocGhhbmRsZSkpCisJCXJldHVybiAtRUlOVkFMOworCisJcGggPSAqKChpbnQgKikgb3AtPm9wcm9tX2FycmF5KTsKKwlpZiAocGgpIHsKKwkJZHAgPSBvZl9maW5kX25vZGVfYnlfcGhhbmRsZShwaCk7CisJCWlmICghZHApCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlzd2l0Y2ggKGNtZCkgeworCQljYXNlIE9QUk9NTkVYVDoKKwkJCWRwID0gZHAtPnNpYmxpbmc7CisJCQlicmVhazsKKworCQljYXNlIE9QUk9NQ0hJTEQ6CisJCQlkcCA9IGRwLT5jaGlsZDsKKwkJCWJyZWFrOworCisJCWNhc2UgT1BST01TRVRDVVI6CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfTsKKwl9IGVsc2UgeworCQkvKiBTaWJsaW5nIG9mIG5vZGUgemVybyBpcyB0aGUgcm9vdCBub2RlLiAgKi8KKwkJaWYgKGNtZCAhPSBPUFJPTU5FWFQpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlkcCA9IG9mX2ZpbmRfbm9kZV9ieV9wYXRoKCIvIik7CisJfQorCisJcGggPSAwOworCWlmIChkcCkKKwkJcGggPSBkcC0+bm9kZTsKKworCWRhdGEtPmN1cnJlbnRfbm9kZSA9IGRwOworCSooKGludCAqKSBvcC0+b3Byb21fYXJyYXkpID0gcGg7CisJb3AtPm9wcm9tX3NpemUgPSBzaXplb2YocGhhbmRsZSk7CisKKwlyZXR1cm4gY29weW91dChhcmdwLCBvcCwgYnVmc2l6ZSArIHNpemVvZihpbnQpKTsKK30KKworc3RhdGljIGludCBvcHJvbXBjaTJub2RlKHZvaWQgX191c2VyICphcmdwLCBzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwLCBzdHJ1Y3Qgb3BlbnByb21pbyAqb3AsIGludCBidWZzaXplLCBEQVRBICpkYXRhKQoreworCWludCBlcnIgPSAtRUlOVkFMOworCisJaWYgKGJ1ZnNpemUgPj0gMipzaXplb2YoaW50KSkgeworI2lmZGVmIENPTkZJR19QQ0kKKwkJc3RydWN0IHBjaV9kZXYgKnBkZXY7CisJCXN0cnVjdCBwY2lkZXZfY29va2llICpwY3A7CisJCXBkZXYgPSBwY2lfZmluZF9zbG90ICgoKGludCAqKSBvcC0+b3Byb21fYXJyYXkpWzBdLAorCQkJCSAgICAgICgoaW50ICopIG9wLT5vcHJvbV9hcnJheSlbMV0pOworCisJCXBjcCA9IHBkZXYtPnN5c2RhdGE7CisJCWlmIChwY3AgIT0gTlVMTCkgeworCQkJZHAgPSBwY3AtPnByb21fbm9kZTsKKwkJCWRhdGEtPmN1cnJlbnRfbm9kZSA9IGRwOworCQkJKigoaW50ICopb3AtPm9wcm9tX2FycmF5KSA9IGRwLT5ub2RlOworCQkJb3AtPm9wcm9tX3NpemUgPSBzaXplb2YoaW50KTsKKwkJCWVyciA9IGNvcHlvdXQoYXJncCwgb3AsIGJ1ZnNpemUgKyBzaXplb2YoaW50KSk7CisJCX0KKyNlbmRpZgorCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgb3Byb21wYXRoMm5vZGUodm9pZCBfX3VzZXIgKmFyZ3AsIHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAsIHN0cnVjdCBvcGVucHJvbWlvICpvcCwgaW50IGJ1ZnNpemUsIERBVEEgKmRhdGEpCit7CisJZHAgPSBvZl9maW5kX25vZGVfYnlfcGF0aChvcC0+b3Byb21fYXJyYXkpOworCWRhdGEtPmN1cnJlbnRfbm9kZSA9IGRwOworCSooKGludCAqKW9wLT5vcHJvbV9hcnJheSkgPSBkcC0+bm9kZTsKKwlvcC0+b3Byb21fc2l6ZSA9IHNpemVvZihpbnQpOworCisJcmV0dXJuIGNvcHlvdXQoYXJncCwgb3AsIGJ1ZnNpemUgKyBzaXplb2YoaW50KSk7Cit9CisKK3N0YXRpYyBpbnQgb3Byb21nZXRib290YXJncyh2b2lkIF9fdXNlciAqYXJncCwgc3RydWN0IG9wZW5wcm9taW8gKm9wLCBpbnQgYnVmc2l6ZSkKK3sKKwljaGFyICpidWYgPSBzYXZlZF9jb21tYW5kX2xpbmU7CisJaW50IGxlbiA9IHN0cmxlbihidWYpOworCisJaWYgKGxlbiA+IGJ1ZnNpemUpCisJCXJldHVybiAtRUlOVkFMOworCisJc3RyY3B5KG9wLT5vcHJvbV9hcnJheSwgYnVmKTsKKwlvcC0+b3Byb21fc2l6ZSA9IGxlbjsKKworCXJldHVybiBjb3B5b3V0KGFyZ3AsIG9wLCBidWZzaXplICsgc2l6ZW9mKGludCkpOworfQorCiAvKgogICoJU3VuT1MgYW5kIFNvbGFyaXMgL2Rldi9vcGVucHJvbSBpb2N0bCBjYWxscy4KICAqLwogc3RhdGljIGludCBvcGVucHJvbV9zdW5vc19pb2N0bChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxlLAotCQkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnLCBpbnQgbm9kZSkKKwkJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZywKKwkJCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwKQogewotCURBVEEgKmRhdGEgPSAoREFUQSAqKSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JY2hhciBidWZmZXJbT1BST01NQVhQQVJBTSsxXSwgKmJ1ZjsKKwlEQVRBICpkYXRhID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBvcGVucHJvbWlvICpvcHA7Ci0JaW50IGJ1ZnNpemUsIGxlbiwgZXJyb3IgPSAwOworCWludCBidWZzaXplLCBlcnJvciA9IDA7CiAJc3RhdGljIGludCBjbnQ7CiAJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CiAKQEAgLTE2NCwxMTkgKzMxMywzNSBAQAogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBPUFJPTUdFVE9QVDoKIAljYXNlIE9QUk9NR0VUUFJPUDoKLQkJbGVuID0gcHJvbV9nZXRwcm9wbGVuKG5vZGUsIG9wcC0+b3Byb21fYXJyYXkpOwotCi0JCWlmIChsZW4gPD0gMCB8fCBsZW4gPiBidWZzaXplKSB7Ci0JCQllcnJvciA9IGNvcHlvdXQoYXJncCwgb3BwLCBzaXplb2YoaW50KSk7Ci0JCQlicmVhazsKLQkJfQotCi0JCWxlbiA9IHByb21fZ2V0cHJvcGVydHkobm9kZSwgb3BwLT5vcHJvbV9hcnJheSwgYnVmZmVyLCBidWZzaXplKTsKLQotCQltZW1jcHkob3BwLT5vcHJvbV9hcnJheSwgYnVmZmVyLCBsZW4pOwotCQlvcHAtPm9wcm9tX2FycmF5W2xlbl0gPSAnXDAnOwotCQlvcHAtPm9wcm9tX3NpemUgPSBsZW47Ci0KLQkJZXJyb3IgPSBjb3B5b3V0KGFyZ3AsIG9wcCwgc2l6ZW9mKGludCkgKyBidWZzaXplKTsKKwkJZXJyb3IgPSBvcHJvbWdldHByb3AoYXJncCwgZHAsIG9wcCwgYnVmc2l6ZSk7CiAJCWJyZWFrOwogCiAJY2FzZSBPUFJPTU5YVE9QVDoKIAljYXNlIE9QUk9NTlhUUFJPUDoKLQkJYnVmID0gcHJvbV9uZXh0cHJvcChub2RlLCBvcHAtPm9wcm9tX2FycmF5LCBidWZmZXIpOwotCi0JCWxlbiA9IHN0cmxlbihidWYpOwotCQlpZiAobGVuID09IDAgfHwgbGVuICsgMSA+IGJ1ZnNpemUpIHsKLQkJCWVycm9yID0gY29weW91dChhcmdwLCBvcHAsIHNpemVvZihpbnQpKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJbWVtY3B5KG9wcC0+b3Byb21fYXJyYXksIGJ1ZiwgbGVuKTsKLQkJb3BwLT5vcHJvbV9hcnJheVtsZW5dID0gJ1wwJzsKLQkJb3BwLT5vcHJvbV9zaXplID0gKytsZW47Ci0KLQkJZXJyb3IgPSBjb3B5b3V0KGFyZ3AsIG9wcCwgc2l6ZW9mKGludCkgKyBidWZzaXplKTsKKwkJZXJyb3IgPSBvcHJvbW54dHByb3AoYXJncCwgZHAsIG9wcCwgYnVmc2l6ZSk7CiAJCWJyZWFrOwogCiAJY2FzZSBPUFJPTVNFVE9QVDoKIAljYXNlIE9QUk9NU0VUT1BUMjoKLQkJYnVmID0gb3BwLT5vcHJvbV9hcnJheSArIHN0cmxlbihvcHAtPm9wcm9tX2FycmF5KSArIDE7Ci0JCWxlbiA9IG9wcC0+b3Byb21fYXJyYXkgKyBidWZzaXplIC0gYnVmOwotCi0JCWVycm9yID0gcHJvbV9zZXRwcm9wKG9wdGlvbnNfbm9kZSwgb3BwLT5vcHJvbV9hcnJheSwKLQkJCQkgICAgIGJ1ZiwgbGVuKTsKLQotCQlpZiAoZXJyb3IgPCAwKQotCQkJZXJyb3IgPSAtRUlOVkFMOworCQllcnJvciA9IG9wcm9tc2V0b3B0KGRwLCBvcHAsIGJ1ZnNpemUpOwogCQlicmVhazsKIAogCWNhc2UgT1BST01ORVhUOgogCWNhc2UgT1BST01DSElMRDoKIAljYXNlIE9QUk9NU0VUQ1VSOgotCQlpZiAoYnVmc2l6ZSA8IHNpemVvZihpbnQpKSB7Ci0JCQllcnJvciA9IC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQotCi0JCW5vZGUgPSAqKChpbnQgKikgb3BwLT5vcHJvbV9hcnJheSk7Ci0KLQkJc3dpdGNoIChjbWQpIHsKLQkJY2FzZSBPUFJPTU5FWFQ6IG5vZGUgPSBfX3Byb21fZ2V0c2libGluZyhub2RlKTsgYnJlYWs7Ci0JCWNhc2UgT1BST01DSElMRDogbm9kZSA9IF9fcHJvbV9nZXRjaGlsZChub2RlKTsgYnJlYWs7Ci0JCWNhc2UgT1BST01TRVRDVVI6IGJyZWFrOwotCQl9Ci0KLQkJZGF0YS0+Y3VycmVudF9ub2RlID0gbm9kZTsKLQkJKigoaW50ICopb3BwLT5vcHJvbV9hcnJheSkgPSBub2RlOwotCQlvcHAtPm9wcm9tX3NpemUgPSBzaXplb2YoaW50KTsKLQotCQllcnJvciA9IGNvcHlvdXQoYXJncCwgb3BwLCBidWZzaXplICsgc2l6ZW9mKGludCkpOworCQllcnJvciA9IG9wcm9tbmV4dChhcmdwLCBjbWQsIGRwLCBvcHAsIGJ1ZnNpemUsIGRhdGEpOwogCQlicmVhazsKIAogCWNhc2UgT1BST01QQ0kyTk9ERToKLQkJZXJyb3IgPSAtRUlOVkFMOwotCi0JCWlmIChidWZzaXplID49IDIqc2l6ZW9mKGludCkpIHsKLSNpZmRlZiBDT05GSUdfUENJCi0JCQlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKLQkJCXN0cnVjdCBwY2lkZXZfY29va2llICpwY3A7Ci0JCQlwZGV2ID0gcGNpX2ZpbmRfc2xvdCAoKChpbnQgKikgb3BwLT5vcHJvbV9hcnJheSlbMF0sCi0JCQkJCSAgICAgICgoaW50ICopIG9wcC0+b3Byb21fYXJyYXkpWzFdKTsKLQotCQkJcGNwID0gcGRldi0+c3lzZGF0YTsKLQkJCWlmIChwY3AgIT0gTlVMTCkgewotCQkJCW5vZGUgPSBwY3AtPnByb21fbm9kZS0+bm9kZTsKLQkJCQlkYXRhLT5jdXJyZW50X25vZGUgPSBub2RlOwotCQkJCSooKGludCAqKW9wcC0+b3Byb21fYXJyYXkpID0gbm9kZTsKLQkJCQlvcHAtPm9wcm9tX3NpemUgPSBzaXplb2YoaW50KTsKLQkJCQllcnJvciA9IGNvcHlvdXQoYXJncCwgb3BwLCBidWZzaXplICsgc2l6ZW9mKGludCkpOwotCQkJfQotI2VuZGlmCi0JCX0KKwkJZXJyb3IgPSBvcHJvbXBjaTJub2RlKGFyZ3AsIGRwLCBvcHAsIGJ1ZnNpemUsIGRhdGEpOwogCQlicmVhazsKIAogCWNhc2UgT1BST01QQVRIMk5PREU6Ci0JCW5vZGUgPSBwcm9tX2ZpbmRkZXZpY2Uob3BwLT5vcHJvbV9hcnJheSk7Ci0JCWRhdGEtPmN1cnJlbnRfbm9kZSA9IG5vZGU7Ci0JCSooKGludCAqKW9wcC0+b3Byb21fYXJyYXkpID0gbm9kZTsKLQkJb3BwLT5vcHJvbV9zaXplID0gc2l6ZW9mKGludCk7Ci0KLQkJZXJyb3IgPSBjb3B5b3V0KGFyZ3AsIG9wcCwgYnVmc2l6ZSArIHNpemVvZihpbnQpKTsKKwkJZXJyb3IgPSBvcHJvbXBhdGgybm9kZShhcmdwLCBkcCwgb3BwLCBidWZzaXplLCBkYXRhKTsKIAkJYnJlYWs7CiAKIAljYXNlIE9QUk9NR0VUQk9PVEFSR1M6Ci0JCWJ1ZiA9IHNhdmVkX2NvbW1hbmRfbGluZTsKLQotCQlsZW4gPSBzdHJsZW4oYnVmKTsKLQotCQlpZiAobGVuID4gYnVmc2l6ZSkgewotCQkJZXJyb3IgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlzdHJjcHkob3BwLT5vcHJvbV9hcnJheSwgYnVmKTsKLQkJb3BwLT5vcHJvbV9zaXplID0gbGVuOwotCi0JCWVycm9yID0gY29weW91dChhcmdwLCBvcHAsIGJ1ZnNpemUgKyBzaXplb2YoaW50KSk7CisJCWVycm9yID0gb3Byb21nZXRib290YXJncyhhcmdwLCBvcHAsIGJ1ZnNpemUpOwogCQlicmVhazsKIAogCWNhc2UgT1BST01VMlA6CkBAIC0yOTcsMjUgKzM2MiwxNCBAQAogCXJldHVybiBlcnJvcjsKIH0KIAotCi0vKiBSZXR1cm4gbm9uemVybyBpZiBhIHNwZWNpZmljIG5vZGUgaXMgaW4gdGhlIFBST00gZGV2aWNlIHRyZWUuICovCi1zdGF0aWMgaW50IGludHJlZShpbnQgcm9vdCwgaW50IG5vZGUpCitzdGF0aWMgc3RydWN0IGRldmljZV9ub2RlICpnZXRfbm9kZShwaGFuZGxlIG4sIERBVEEgKmRhdGEpCiB7Ci0JZm9yICg7IHJvb3QgIT0gMDsgcm9vdCA9IHByb21fZ2V0c2libGluZyhyb290KSkKLQkJaWYgKHJvb3QgPT0gbm9kZSB8fCBpbnRyZWUocHJvbV9nZXRjaGlsZChyb290KSxub2RlKSkKLQkJCXJldHVybiAxOwotCXJldHVybiAwOwotfQorCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAgPSBvZl9maW5kX25vZGVfYnlfcGhhbmRsZShuKTsKIAotLyogUmV0dXJuIG5vbnplcm8gaWYgYSBzcGVjaWZpYyBub2RlIGlzICJ2YWxpZCIuICovCi1zdGF0aWMgaW50IGdvb2Rub2RlKGludCBuLCBEQVRBICpkYXRhKQotewotCWlmIChuID09IGRhdGEtPmxhc3Rub2RlIHx8IG4gPT0gcHJvbV9yb290X25vZGUgfHwgbiA9PSBvcHRpb25zX25vZGUpCi0JCXJldHVybiAxOwotCWlmIChuID09IDAgfHwgbiA9PSAtMSB8fCAhaW50cmVlKHByb21fcm9vdF9ub2RlLG4pKQotCQlyZXR1cm4gMDsKLQlkYXRhLT5sYXN0bm9kZSA9IG47Ci0JcmV0dXJuIDE7CisJaWYgKGRwKQorCQlkYXRhLT5sYXN0bm9kZSA9IGRwOworCisJcmV0dXJuIGRwOwogfQogCiAvKiBDb3B5IGluIGEgd2hvbGUgc3RyaW5nIGZyb20gdXNlcnNwYWNlIGludG8ga2VybmVsc3BhY2UuICovCkBAIC0zMzAsNyArMzg0LDcgQEAKIAlpZiAoIXRtcCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlpZihjb3B5X2Zyb21fdXNlcih0bXAsIHVzZXIsIGxlbikpIHsKKwlpZiAoY29weV9mcm9tX3VzZXIodG1wLCB1c2VyLCBsZW4pKSB7CiAJCWtmcmVlKHRtcCk7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KQEAgLTM0NSwxNjIgKzM5OSwxODcgQEAKIC8qCiAgKglOZXRCU0QgL2Rldi9vcGVucHJvbSBpb2N0bCBjYWxscy4KICAqLworc3RhdGljIGludCBvcGlvY2dldCh2b2lkIF9fdXNlciAqYXJncCwgREFUQSAqZGF0YSkKK3sKKwlzdHJ1Y3Qgb3Bpb2NkZXNjIG9wOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHA7CisJY2hhciAqc3RyOworCXZvaWQgKnB2YWw7CisJaW50IGVyciwgbGVuOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZvcCwgYXJncCwgc2l6ZW9mKG9wKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJZHAgPSBnZXRfbm9kZShvcC5vcF9ub2RlaWQsIGRhdGEpOworCisJZXJyID0gY29weWluX3N0cmluZyhvcC5vcF9uYW1lLCBvcC5vcF9uYW1lbGVuLCAmc3RyKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJcHZhbCA9IG9mX2dldF9wcm9wZXJ0eShkcCwgc3RyLCAmbGVuKTsKKwllcnIgPSAwOworCWlmICghcHZhbCB8fCBsZW4gPiBvcC5vcF9idWZsZW4pIHsKKwkJZXJyID0gLUVJTlZBTDsKKwl9IGVsc2UgeworCQlvcC5vcF9idWZsZW4gPSBsZW47CisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJm9wLCBzaXplb2Yob3ApKSB8fAorCQkgICAgY29weV90b191c2VyKG9wLm9wX2J1ZiwgcHZhbCwgbGVuKSkKKwkJCWVyciA9IC1FRkFVTFQ7CisJfQorCWtmcmVlKHN0cik7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG9waW9jbmV4dHByb3Aodm9pZCBfX3VzZXIgKmFyZ3AsIERBVEEgKmRhdGEpCit7CisJc3RydWN0IG9waW9jZGVzYyBvcDsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwOworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKwljaGFyICpzdHI7CisJaW50IGVyciwgbGVuOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZvcCwgYXJncCwgc2l6ZW9mKG9wKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJZHAgPSBnZXRfbm9kZShvcC5vcF9ub2RlaWQsIGRhdGEpOworCWlmICghZHApCisJCXJldHVybiAtRUlOVkFMOworCisJZXJyID0gY29weWluX3N0cmluZyhvcC5vcF9uYW1lLCBvcC5vcF9uYW1lbGVuLCAmc3RyKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJaWYgKHN0clswXSA9PSAnXDAnKSB7CisJCXByb3AgPSBkcC0+cHJvcGVydGllczsKKwl9IGVsc2UgeworCQlwcm9wID0gb2ZfZmluZF9wcm9wZXJ0eShkcCwgc3RyLCBOVUxMKTsKKwkJaWYgKHByb3ApCisJCQlwcm9wID0gcHJvcC0+bmV4dDsKKwl9CisJa2ZyZWUoc3RyKTsKKworCWlmICghcHJvcCkKKwkJbGVuID0gMDsKKwllbHNlCisJCWxlbiA9IHByb3AtPmxlbmd0aDsKKworCWlmIChsZW4gPiBvcC5vcF9idWZsZW4pCisJCWxlbiA9IG9wLm9wX2J1ZmxlbjsKKworCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJm9wLCBzaXplb2Yob3ApKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAobGVuICYmCisJICAgIGNvcHlfdG9fdXNlcihvcC5vcF9idWYsIHByb3AtPnZhbHVlLCBsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9waW9jc2V0KHZvaWQgX191c2VyICphcmdwLCBEQVRBICpkYXRhKQoreworCXN0cnVjdCBvcGlvY2Rlc2Mgb3A7CisJc3RydWN0IGRldmljZV9ub2RlICpkcDsKKwljaGFyICpzdHIsICp0bXA7CisJaW50IGVycjsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmb3AsIGFyZ3AsIHNpemVvZihvcCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWRwID0gZ2V0X25vZGUob3Aub3Bfbm9kZWlkLCBkYXRhKTsKKwlpZiAoIWRwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWVyciA9IGNvcHlpbl9zdHJpbmcob3Aub3BfbmFtZSwgb3Aub3BfbmFtZWxlbiwgJnN0cik7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWVyciA9IGNvcHlpbl9zdHJpbmcob3Aub3BfYnVmLCBvcC5vcF9idWZsZW4sICZ0bXApOworCWlmIChlcnIpIHsKKwkJa2ZyZWUoc3RyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwllcnIgPSBvZl9zZXRfcHJvcGVydHkoZHAsIHN0ciwgdG1wLCBvcC5vcF9idWZsZW4pOworCisJa2ZyZWUoc3RyKTsKKwlrZnJlZSh0bXApOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBvcGlvY2dldG5leHQodW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZ3ApCit7CisJc3RydWN0IGRldmljZV9ub2RlICpkcDsKKwlwaGFuZGxlIG5kOworCisJQlVJTERfQlVHX09OKHNpemVvZihwaGFuZGxlKSAhPSBzaXplb2YoaW50KSk7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJm5kLCBhcmdwLCBzaXplb2YocGhhbmRsZSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChuZCA9PSAwKSB7CisJCWlmIChjbWQgIT0gT1BJT0NHRVRORVhUKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWRwID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgoIi8iKTsKKwl9IGVsc2UgeworCQlkcCA9IG9mX2ZpbmRfbm9kZV9ieV9waGFuZGxlKG5kKTsKKwkJbmQgPSAwOworCQlpZiAoZHApIHsKKwkJCWlmIChjbWQgPT0gT1BJT0NHRVRORVhUKQorCQkJCWRwID0gZHAtPnNpYmxpbmc7CisJCQllbHNlCisJCQkJZHAgPSBkcC0+Y2hpbGQ7CisJCX0KKwl9CisJaWYgKGRwKQorCQluZCA9IGRwLT5ub2RlOworCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJm5kLCBzaXplb2YocGhhbmRsZSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IG9wZW5wcm9tX2JzZF9pb2N0bChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxlLAogCQkJICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJREFUQSAqZGF0YSA9IChEQVRBICopIGZpbGUtPnByaXZhdGVfZGF0YTsKIAl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKLQlzdHJ1Y3Qgb3Bpb2NkZXNjIG9wOwotCWludCBlcnJvciwgbm9kZSwgbGVuOwotCWNoYXIgKnN0ciwgKnRtcDsKLQljaGFyIGJ1ZmZlcls2NF07Ci0Jc3RhdGljIGludCBjbnQ7CisJaW50IGVycjsKIAogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBPUElPQ0dFVDoKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZvcCwgYXJncCwgc2l6ZW9mKG9wKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQlpZiAoIWdvb2Rub2RlKG9wLm9wX25vZGVpZCxkYXRhKSkKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCWVycm9yID0gY29weWluX3N0cmluZyhvcC5vcF9uYW1lLCBvcC5vcF9uYW1lbGVuLCAmc3RyKTsKLQkJaWYgKGVycm9yKQotCQkJcmV0dXJuIGVycm9yOwotCi0JCWxlbiA9IHByb21fZ2V0cHJvcGxlbihvcC5vcF9ub2RlaWQsc3RyKTsKLQotCQlpZiAobGVuID4gb3Aub3BfYnVmbGVuKSB7Ci0JCQlrZnJlZShzdHIpOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KLQotCQlvcC5vcF9idWZsZW4gPSBsZW47Ci0KLQkJaWYgKGxlbiA8PSAwKSB7Ci0JCQlrZnJlZShzdHIpOwotCQkJLyogVmVyaWZpZWQgYnkgdGhlIGFib3ZlIGNvcHlfZnJvbV91c2VyICovCi0JCQlpZiAoX19jb3B5X3RvX3VzZXIoYXJncCwgJm9wLAotCQkJCSAgICAgICBzaXplb2Yob3ApKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCXJldHVybiAwOwotCQl9Ci0KLQkJdG1wID0ga21hbGxvYyhsZW4gKyAxLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCF0bXApIHsKLQkJCWtmcmVlKHN0cik7Ci0JCQlyZXR1cm4gLUVOT01FTTsKLQkJfQotCi0JCWNudCA9IHByb21fZ2V0cHJvcGVydHkob3Aub3Bfbm9kZWlkLCBzdHIsIHRtcCwgbGVuKTsKLQkJaWYgKGNudCA8PSAwKSB7Ci0JCQllcnJvciA9IC1FSU5WQUw7Ci0JCX0gZWxzZSB7Ci0JCQl0bXBbbGVuXSA9ICdcMCc7Ci0KLQkJCWlmIChfX2NvcHlfdG9fdXNlcihhcmdwLCAmb3AsIHNpemVvZihvcCkpICE9IDAgfHwKLQkJCSAgICBjb3B5X3RvX3VzZXIob3Aub3BfYnVmLCB0bXAsIGxlbikgIT0gMCkKLQkJCQllcnJvciA9IC1FRkFVTFQ7Ci0JCX0KLQotCQlrZnJlZSh0bXApOwotCQlrZnJlZShzdHIpOwotCi0JCXJldHVybiBlcnJvcjsKKwkJZXJyID0gb3Bpb2NnZXQoYXJncCwgZGF0YSk7CisJCWJyZWFrOwogCiAJY2FzZSBPUElPQ05FWFRQUk9QOgotCQlpZiAoY29weV9mcm9tX3VzZXIoJm9wLCBhcmdwLCBzaXplb2Yob3ApKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCWlmICghZ29vZG5vZGUob3Aub3Bfbm9kZWlkLGRhdGEpKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJZXJyb3IgPSBjb3B5aW5fc3RyaW5nKG9wLm9wX25hbWUsIG9wLm9wX25hbWVsZW4sICZzdHIpOwotCQlpZiAoZXJyb3IpCi0JCQlyZXR1cm4gZXJyb3I7Ci0KLQkJdG1wID0gcHJvbV9uZXh0cHJvcChvcC5vcF9ub2RlaWQsc3RyLGJ1ZmZlcik7Ci0KLQkJaWYgKHRtcCkgewotCQkJbGVuID0gc3RybGVuKHRtcCk7Ci0JCQlpZiAobGVuID4gb3Aub3BfYnVmbGVuKQotCQkJCWxlbiA9IG9wLm9wX2J1ZmxlbjsKLQkJCWVsc2UKLQkJCQlvcC5vcF9idWZsZW4gPSBsZW47Ci0JCX0gZWxzZSB7Ci0JCQlsZW4gPSBvcC5vcF9idWZsZW4gPSAwOwotCQl9Ci0KLQkJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBhcmdwLCBzaXplb2Yob3ApKSkgewotCQkJa2ZyZWUoc3RyKTsKLQkJCXJldHVybiAtRUZBVUxUOwotCQl9Ci0KLQkJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBvcC5vcF9idWYsIGxlbikpIHsKLQkJCWtmcmVlKHN0cik7Ci0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQotCi0JCWVycm9yID0gX19jb3B5X3RvX3VzZXIoYXJncCwgJm9wLCBzaXplb2Yob3ApKTsKLQkJaWYgKCFlcnJvcikgZXJyb3IgPSBfX2NvcHlfdG9fdXNlcihvcC5vcF9idWYsIHRtcCwgbGVuKTsKLQotCQlrZnJlZShzdHIpOwotCi0JCXJldHVybiBlcnJvcjsKKwkJZXJyID0gb3Bpb2NuZXh0cHJvcChhcmdwLCBkYXRhKTsKKwkJYnJlYWs7CiAKIAljYXNlIE9QSU9DU0VUOgotCQlpZiAoY29weV9mcm9tX3VzZXIoJm9wLCBhcmdwLCBzaXplb2Yob3ApKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCWlmICghZ29vZG5vZGUob3Aub3Bfbm9kZWlkLGRhdGEpKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJZXJyb3IgPSBjb3B5aW5fc3RyaW5nKG9wLm9wX25hbWUsIG9wLm9wX25hbWVsZW4sICZzdHIpOwotCQlpZiAoZXJyb3IpCi0JCQlyZXR1cm4gZXJyb3I7Ci0KLQkJZXJyb3IgPSBjb3B5aW5fc3RyaW5nKG9wLm9wX2J1Ziwgb3Aub3BfYnVmbGVuLCAmdG1wKTsKLQkJaWYgKGVycm9yKSB7Ci0JCQlrZnJlZShzdHIpOwotCQkJcmV0dXJuIGVycm9yOwotCQl9Ci0KLQkJbGVuID0gcHJvbV9zZXRwcm9wKG9wLm9wX25vZGVpZCxzdHIsdG1wLG9wLm9wX2J1ZmxlbisxKTsKLQotCQlpZiAobGVuICE9IG9wLm9wX2J1ZmxlbikKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCWtmcmVlKHN0cik7Ci0JCWtmcmVlKHRtcCk7Ci0KLQkJcmV0dXJuIDA7CisJCWVyciA9IG9waW9jc2V0KGFyZ3AsIGRhdGEpOworCQlicmVhazsKIAogCWNhc2UgT1BJT0NHRVRPUFROT0RFOgotCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZvcHRpb25zX25vZGUsIHNpemVvZihpbnQpKSkKKwkJQlVJTERfQlVHX09OKHNpemVvZihwaGFuZGxlKSAhPSBzaXplb2YoaW50KSk7CisKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmb3B0aW9uc19ub2RlLT5ub2RlLCBzaXplb2YocGhhbmRsZSkpKQogCQkJcmV0dXJuIC1FRkFVTFQ7CisKIAkJcmV0dXJuIDA7CiAKIAljYXNlIE9QSU9DR0VUTkVYVDoKIAljYXNlIE9QSU9DR0VUQ0hJTEQ6Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmbm9kZSwgYXJncCwgc2l6ZW9mKGludCkpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJaWYgKGNtZCA9PSBPUElPQ0dFVE5FWFQpCi0JCQlub2RlID0gX19wcm9tX2dldHNpYmxpbmcobm9kZSk7Ci0JCWVsc2UKLQkJCW5vZGUgPSBfX3Byb21fZ2V0Y2hpbGQobm9kZSk7Ci0KLQkJaWYgKF9fY29weV90b191c2VyKGFyZ3AsICZub2RlLCBzaXplb2YoaW50KSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQlyZXR1cm4gMDsKKwkJZXJyID0gb3Bpb2NnZXRuZXh0KGNtZCwgYXJncCk7CisJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJaWYgKGNudCsrIDwgMTApCi0JCQlwcmludGsoS0VSTl9JTkZPICJvcGVucHJvbV9ic2RfaW9jdGw6IGNtZCAweCVYXG4iLCBjbWQpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAotCX0KKwl9OworCisJcmV0dXJuIGVycjsKIH0KIAogCkBAIC01MTEsNyArNTkwLDYgQEAKIAkJCSAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJREFUQSAqZGF0YSA9IChEQVRBICopIGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdGF0aWMgaW50IGNudDsKIAogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBPUFJPTUdFVE9QVDoKQEAgLTU2MywxMCArNjQxLDggQEAKIAkJcmV0dXJuIG9wZW5wcm9tX2JzZF9pb2N0bChpbm9kZSxmaWxlLGNtZCxhcmcpOwogCiAJZGVmYXVsdDoKLQkJaWYgKGNudCsrIDwgMTApCi0JCQlwcmludGsoIm9wZW5wcm9tX2lvY3RsOiBjbWQgMHglWCwgYXJnIDB4JWxYXG4iLCBjbWQsIGFyZyk7CiAJCXJldHVybiAtRUlOVkFMOwotCX0KKwl9OwogfQogCiBzdGF0aWMgbG9uZyBvcGVucHJvbV9jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCkBAIC01OTQsOSArNjcwLDcgQEAKIAljYXNlIE9QUk9NU0VUQ1VSOgogCWNhc2UgT1BST01QQ0kyTk9ERToKIAljYXNlIE9QUk9NUEFUSDJOT0RFOgotCQlsb2NrX2tlcm5lbCgpOwogCQlydmFsID0gb3BlbnByb21faW9jdGwoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsIGZpbGUsIGNtZCwgYXJnKTsKLQkJbG9ja19rZXJuZWwoKTsKIAkJYnJlYWs7CiAJfQogCkBAIC02MDcsMTMgKzY4MSwxMyBAQAogewogCURBVEEgKmRhdGE7CiAKLQlkYXRhID0gKERBVEEgKikga21hbGxvYyhzaXplb2YoREFUQSksIEdGUF9LRVJORUwpOworCWRhdGEgPSBrbWFsbG9jKHNpemVvZihEQVRBKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFkYXRhKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWRhdGEtPmN1cnJlbnRfbm9kZSA9IHByb21fcm9vdF9ub2RlOwotCWRhdGEtPmxhc3Rub2RlID0gcHJvbV9yb290X25vZGU7Ci0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gKHZvaWQgKilkYXRhOworCWRhdGEtPmN1cnJlbnRfbm9kZSA9IG9mX2ZpbmRfbm9kZV9ieV9wYXRoKCIvIik7CisJZGF0YS0+bGFzdG5vZGUgPSBkYXRhLT5jdXJyZW50X25vZGU7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gKHZvaWQgKikgZGF0YTsKIAogCXJldHVybiAwOwogfQpAQCAtNjM0LDI0ICs3MDgsMzAgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBvcGVucHJvbV9kZXYgPSB7Ci0JU1VOX09QRU5QUk9NX01JTk9SLCAib3BlbnByb20iLCAmb3BlbnByb21fZm9wcworCS5taW5vcgkJPSBTVU5fT1BFTlBST01fTUlOT1IsCisJLm5hbWUJCT0gIm9wZW5wcm9tIiwKKwkuZm9wcwkJPSAmb3BlbnByb21fZm9wcywKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IG9wZW5wcm9tX2luaXQodm9pZCkKIHsKLQlpbnQgZXJyb3I7CisJc3RydWN0IGRldmljZV9ub2RlICpkcDsKKwlpbnQgZXJyOwogCi0JZXJyb3IgPSBtaXNjX3JlZ2lzdGVyKCZvcGVucHJvbV9kZXYpOwotCWlmIChlcnJvcikgewotCQlwcmludGsoS0VSTl9FUlIgIm9wZW5wcm9tOiB1bmFibGUgdG8gZ2V0IG1pc2MgbWlub3JcbiIpOwotCQlyZXR1cm4gZXJyb3I7CisJZXJyID0gbWlzY19yZWdpc3Rlcigmb3BlbnByb21fZGV2KTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJZHAgPSBvZl9maW5kX25vZGVfYnlfcGF0aCgiLyIpOworCWRwID0gZHAtPmNoaWxkOworCXdoaWxlIChkcCkgeworCQlpZiAoIXN0cmNtcChkcC0+bmFtZSwgIm9wdGlvbnMiKSkKKwkJCWJyZWFrOworCQlkcCA9IGRwLT5zaWJsaW5nOwogCX0KKwlvcHRpb25zX25vZGUgPSBkcDsKIAotCW9wdGlvbnNfbm9kZSA9IHByb21fZ2V0Y2hpbGQocHJvbV9yb290X25vZGUpOwotCW9wdGlvbnNfbm9kZSA9IHByb21fc2VhcmNoc2libGluZ3Mob3B0aW9uc19ub2RlLCJvcHRpb25zIik7Ci0KLQlpZiAob3B0aW9uc19ub2RlID09IDAgfHwgb3B0aW9uc19ub2RlID09IC0xKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAib3BlbnByb206IHVuYWJsZSB0byBmaW5kIG9wdGlvbnMgbm9kZVxuIik7CisJaWYgKCFvcHRpb25zX25vZGUpIHsKIAkJbWlzY19kZXJlZ2lzdGVyKCZvcGVucHJvbV9kZXYpOwogCQlyZXR1cm4gLUVJTzsKIAl9CkBAIC02NjYsNCArNzQ2LDMgQEAKIAogbW9kdWxlX2luaXQob3BlbnByb21faW5pdCk7CiBtb2R1bGVfZXhpdChvcGVucHJvbV9jbGVhbnVwKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2J1cy9jaGFyL3Jpb3dhdGNoZG9nLmMgYi9kcml2ZXJzL3NidXMvY2hhci9yaW93YXRjaGRvZy5jCmluZGV4IGQxYmFiZmYuLjJhOWNjODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2J1cy9jaGFyL3Jpb3dhdGNoZG9nLmMKKysrIGIvZHJpdmVycy9zYnVzL2NoYXIvcmlvd2F0Y2hkb2cuYwpAQCAtMjExLDcgKzIxMSw3IEBACiAKIAlmb3JfZWFjaF9lYnVzKGVidXMpIHsKIAkJZm9yX2VhY2hfZWJ1c2RldihlZGV2LCBlYnVzKSB7Ci0JCQlpZiAoIXN0cmNtcChlZGV2LT5wcm9tX25hbWUsICJiYmMiKSkKKwkJCWlmICghc3RyY21wKGVkZXYtPm9mZGV2Lm5vZGUtPm5hbWUsICJiYmMiKSkKIAkJCQlnb3RvIGZvdW5kX2JiYzsKIAkJfQogCX0KQEAgLTIzOCw3ICsyMzgsNyBAQAogCiAJZm9yX2VhY2hfZWJ1cyhlYnVzKSB7CiAJCWZvcl9lYWNoX2VidXNkZXYoZWRldiwgZWJ1cykgewotCQkJaWYgKCFzdHJjbXAoZWRldi0+cHJvbV9uYW1lLCBSSU9XRF9OQU1FKSkKKwkJCWlmICghc3RyY21wKGVkZXYtPm9mZGV2Lm5vZGUtPm5hbWUsIFJJT1dEX05BTUUpKQogCQkJCWdvdG8gZWJ1c19kb25lOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zYnVzL2NoYXIvdmZjX2Rldi5jIGIvZHJpdmVycy9zYnVzL2NoYXIvdmZjX2Rldi5jCmluZGV4IGRmZGQ2YmUuLmRkY2QzMzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2J1cy9jaGFyL3ZmY19kZXYuYworKysgYi9kcml2ZXJzL3NidXMvY2hhci92ZmNfZGV2LmMKQEAgLTYyMyw3ICs2MjMsNyBAQAogCQltYXBfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgdmZjX3JlZ3MpOwogCiAJdm1hLT52bV9mbGFncyB8PQotCQkoVk1fU0hNIHwgVk1fTE9DS0VEIHwgVk1fSU8gfCBWTV9NQVlSRUFEIHwgVk1fTUFZV1JJVEUgfCBWTV9NQVlTSEFSRSk7CisJCShWTV9NQVlSRUFEIHwgVk1fTUFZV1JJVEUgfCBWTV9NQVlTSEFSRSk7CiAJbWFwX29mZnNldCA9ICh1bnNpZ25lZCBpbnQpIChsb25nKWRldi0+cGh5c19yZWdzOwogCXJldCA9IGlvX3JlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsCiAJCQkJICBNS19JT1NQQUNFX1BGTihkZXYtPndoaWNoX2lvLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL0tjb25maWcgYi9kcml2ZXJzL3Njc2kvS2NvbmZpZwppbmRleCA0NDcyOGFlLi5jODRiMDJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvS2NvbmZpZworKysgYi9kcml2ZXJzL3Njc2kvS2NvbmZpZwpAQCAtMTE2OSw3ICsxMTY5LDcgQEAKIAkgIHlvdSBkbyBub3QgaGF2ZSB0aGlzIFNDU0kgY2FyZCwgc28gc2F5IE4uCiAKIGNvbmZpZyBTQ1NJX05DUjUzQzhYWF9ERUZBVUxUX1RBR1MKLQlpbnQgIiAgZGVmYXVsdCB0YWdnZWQgY29tbWFuZCBxdWV1ZSBkZXB0aCIKKwlpbnQgImRlZmF1bHQgdGFnZ2VkIGNvbW1hbmQgcXVldWUgZGVwdGgiCiAJZGVwZW5kcyBvbiBTQ1NJX1pBTE9OIHx8IFNDU0lfTkNSX1E3MjAKIAlkZWZhdWx0ICI4IgogCS0tLWhlbHAtLS0KQEAgLTExOTUsNyArMTE5NSw3IEBACiAJICBUaGVyZSBpcyBubyBzYWZlIG9wdGlvbiBvdGhlciB0aGFuIHVzaW5nIGdvb2QgU0NTSSBkZXZpY2VzLgogCiBjb25maWcgU0NTSV9OQ1I1M0M4WFhfTUFYX1RBR1MKLQlpbnQgIiAgbWF4aW11bSBudW1iZXIgb2YgcXVldWVkIGNvbW1hbmRzIgorCWludCAibWF4aW11bSBudW1iZXIgb2YgcXVldWVkIGNvbW1hbmRzIgogCWRlcGVuZHMgb24gU0NTSV9aQUxPTiB8fCBTQ1NJX05DUl9RNzIwCiAJZGVmYXVsdCAiMzIiCiAJLS0taGVscC0tLQpAQCAtMTIxMiw3ICsxMjEyLDcgQEAKIAkgIFRoZXJlIGlzIG5vIHNhZmUgb3B0aW9uIGFuZCB0aGUgZGVmYXVsdCBhbnN3ZXIgaXMgcmVjb21tZW5kZWQuCiAKIGNvbmZpZyBTQ1NJX05DUjUzQzhYWF9TWU5DCi0JaW50ICIgIHN5bmNocm9ub3VzIHRyYW5zZmVycyBmcmVxdWVuY3kgaW4gTUh6IgorCWludCAic3luY2hyb25vdXMgdHJhbnNmZXJzIGZyZXF1ZW5jeSBpbiBNSHoiCiAJZGVwZW5kcyBvbiBTQ1NJX1pBTE9OIHx8IFNDU0lfTkNSX1E3MjAKIAlkZWZhdWx0ICIyMCIKIAktLS1oZWxwLS0tCkBAIC0xMjQ2LDcgKzEyNDYsNyBAQAogCSAgdGVybWluYXRpb25zIGFuZCBTQ1NJIGNvbmZvcm1hbnQgZGV2aWNlcy4KIAogY29uZmlnIFNDU0lfTkNSNTNDOFhYX1BST0ZJTEUKLQlib29sICIgIGVuYWJsZSBwcm9maWxpbmciCisJYm9vbCAiZW5hYmxlIHByb2ZpbGluZyIKIAlkZXBlbmRzIG9uIFNDU0lfWkFMT04gfHwgU0NTSV9OQ1JfUTcyMAogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGFsbG93cyB5b3UgdG8gZW5hYmxlIHByb2ZpbGluZyBpbmZvcm1hdGlvbiBnYXRoZXJpbmcuCkBAIC0xMjU3LDcgKzEyNTcsNyBAQAogCSAgVGhlIG5vcm1hbCBhbnN3ZXIgdGhlcmVmb3JlIGlzIE4uCiAKIGNvbmZpZyBTQ1NJX05DUjUzQzhYWF9OT19ESVNDT05ORUNUCi0JYm9vbCAiICBub3QgYWxsb3cgdGFyZ2V0cyB0byBkaXNjb25uZWN0IgorCWJvb2wgIm5vdCBhbGxvdyB0YXJnZXRzIHRvIGRpc2Nvbm5lY3QiCiAJZGVwZW5kcyBvbiAoU0NTSV9aQUxPTiB8fCBTQ1NJX05DUl9RNzIwKSAmJiBTQ1NJX05DUjUzQzhYWF9ERUZBVUxUX1RBR1M9MAogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGlzIG9ubHkgcHJvdmlkZWQgZm9yIHNhZmV0eSBpZiB5b3Ugc3VzcGVjdCBzb21lIFNDU0kKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9NYWtlZmlsZSBiL2RyaXZlcnMvc2NzaS9NYWtlZmlsZQppbmRleCA4NGQ1NDYzLi5lYmQwY2YwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zY3NpL01ha2VmaWxlCkBAIC0zNCw2ICszNCw3IEBACiBvYmotJChDT05GSUdfU0NTSV9TQVNfQVRUUlMpCSs9IHNjc2lfdHJhbnNwb3J0X3Nhcy5vCiAKIG9iai0kKENPTkZJR19JU0NTSV9UQ1ApIAkrPSBsaWJpc2NzaS5vCWlzY3NpX3RjcC5vCitvYmotJChDT05GSUdfSU5GSU5JQkFORF9JU0VSKSAJKz0gbGliaXNjc2kubwogb2JqLSQoQ09ORklHX1NDU0lfQU1JR0E3WFgpCSs9IGFtaWdhN3h4Lm8JNTNjN3h4Lm8KIG9iai0kKENPTkZJR19BMzAwMF9TQ1NJKQkrPSBhMzAwMC5vCXdkMzNjOTMubwogb2JqLSQoQ09ORklHX0EyMDkxX1NDU0kpCSs9IGEyMDkxLm8Jd2QzM2M5My5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvTkNSNTM4MC5jIGIvZHJpdmVycy9zY3NpL05DUjUzODAuYwppbmRleCBmYTU3ZTBiLi43NWYyZjdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvTkNSNTM4MC5jCisrKyBiL2RyaXZlcnMvc2NzaS9OQ1I1MzgwLmMKQEAgLTUwMCw3ICs1MDAsNyBAQAogLyogCiAgKiBGdW5jdGlvbiA6IGludCBzaG91bGRfZGlzY29ubmVjdCAodW5zaWduZWQgY2hhciBjbWQpCiAgKgotICogUHVycG9zZSA6IGRlY2lkZSB3ZWF0aGVyIGEgY29tbWFuZCB3b3VsZCBub3JtYWxseSBkaXNjb25uZWN0IG9yIAorICogUHVycG9zZSA6IGRlY2lkZSB3aGV0aGVyIGEgY29tbWFuZCB3b3VsZCBub3JtYWxseSBkaXNjb25uZWN0IG9yIAogICogICAgICBub3QsIHNpbmNlIGlmIGl0IHdvbid0IGRpc2Nvbm5lY3Qgd2Ugc2hvdWxkIGdvIHRvIHNsZWVwLgogICoKICAqIElucHV0IDogY21kIC0gb3Bjb2RlIG9mIFNDU0kgY29tbWFuZApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FhY3JhaWQvY29tbWluaXQuYyBiL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2NvbW1pbml0LmMKaW5kZXggMzViMGE2ZS4uN2NlYTUxNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FhY3JhaWQvY29tbWluaXQuYworKysgYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9jb21taW5pdC5jCkBAIC0xMDQsOCArMTA0LDExIEBACiAJICogYWx3YXlzIHRydWUgb24gcmVhbCBjb21wdXRlcnMuIEl0IGFsc28gaGFzIHNvbWUgc2xpZ2h0IHByb2JsZW1zCiAJICogd2l0aCB0aGUgR0FSVCBvbiB4ODYtNjQuIEkndmUgYnR3IG5ldmVyIHRyaWVkIERNQSBmcm9tIFBDSSBzcGFjZQogCSAqIG9uIHRoaXMgcGxhdGZvcm0gYnV0IGRvbid0IGJlIHN1cnByaXNlZCBpZiBpdHMgcHJvYmxlbWF0aWMuCisJICogW0FLOiBzb21ldGhpbmcgaXMgdmVyeSB2ZXJ5IHdyb25nIHdoZW4gYSBkcml2ZXIgdGVzdHMgdGhpcyBzeW1ib2wuCisgCSAqICBTb21lb25lIHNob3VsZCBmaWd1cmUgb3V0IHdoYXQgdGhlIGNvbW1lbnQgd3JpdGVyIHJlYWxseSBtZWFudCBoZXJlIGFuZCBmaXgKKwkgKiAgdGhlIGNvZGUuIE9yIGp1c3QgcmVtb3ZlIHRoYXQgYmFkIGNvZGUuIF0KIAkgKi8KLSNpZm5kZWYgQ09ORklHX0dBUlRfSU9NTVUKKyNpZm5kZWYgQ09ORklHX0lPTU1VCiAJaWYgKChudW1fcGh5c3BhZ2VzIDw8IChQQUdFX1NISUZUIC0gMTIpKSA8PSBBQUNfTUFYX0hPU1RQSFlTTUVNUEFHRVMpIHsKIAkJaW5pdC0+SG9zdFBoeXNNZW1QYWdlcyA9IAogCQkJY3B1X3RvX2xlMzIobnVtX3BoeXNwYWdlcyA8PCAoUEFHRV9TSElGVC0xMikpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FkdmFuc3lzLmMgYi9kcml2ZXJzL3Njc2kvYWR2YW5zeXMuYwppbmRleCAyYTQxOTYzLi5kZDlmYjNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWR2YW5zeXMuYworKysgYi9kcml2ZXJzL3Njc2kvYWR2YW5zeXMuYwpAQCAtMTIzNzQsNyArMTIzNzQsNyBAQAogICAgICAgICAgICAgICAgIEFTQ19QUklOVDEoCiAiQXNjSW5pdEZyb21FRVA6IEZhaWxlZCB0byByZS13cml0ZSBFRVBST00gd2l0aCAlZCBlcnJvcnMuXG4iLCBpKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBU0NfUFJJTlQoIkFzY0luaXRGcm9tRUVQOiBTdWNjZXNmdWxseSByZS13cm90ZSBFRVBST00uIik7CisgICAgICAgICAgICAgICAgQVNDX1BSSU5UKCJBc2NJbml0RnJvbUVFUDogU3VjY2Vzc2Z1bGx5IHJlLXdyb3RlIEVFUFJPTS5cbiIpOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiAod2Fybl9jb2RlKTsKQEAgLTE3MzE2LDcgKzE3MzE2LDcgQEAKIC8qCiAgKiBXcml0ZSB0aGUgRUVQUk9NIGZyb20gJ2NmZ19idWYnLgogICovCi12b2lkCit2b2lkIF9faW5pdAogQWR2U2V0MzU1MEVFUENvbmZpZyhBZHZQb3J0QWRkciBpb3BfYmFzZSwgQURWRUVQXzM1NTBfQ09ORklHICpjZmdfYnVmKQogewogICAgIHVzaG9ydCAqd2J1ZjsKQEAgLTE3MzgzLDcgKzE3MzgzLDcgQEAKIC8qCiAgKiBXcml0ZSB0aGUgRUVQUk9NIGZyb20gJ2NmZ19idWYnLgogICovCi12b2lkCit2b2lkIF9faW5pdAogQWR2U2V0MzhDMDgwMEVFUENvbmZpZyhBZHZQb3J0QWRkciBpb3BfYmFzZSwKICAgICAgICAgICAgICAgICAgICAgICAgQURWRUVQXzM4QzA4MDBfQ09ORklHICpjZmdfYnVmKQogewpAQCAtMTc0NTEsNyArMTc0NTEsNyBAQAogLyoKICAqIFdyaXRlIHRoZSBFRVBST00gZnJvbSAnY2ZnX2J1ZicuCiAgKi8KLXZvaWQKK3ZvaWQgX19pbml0CiBBZHZTZXQzOEMxNjAwRUVQQ29uZmlnKEFkdlBvcnRBZGRyIGlvcF9iYXNlLAogICAgICAgICAgICAgICAgICAgICAgICBBRFZFRVBfMzhDMTYwMF9DT05GSUcgKmNmZ19idWYpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvZGMzOTV4LmMgYi9kcml2ZXJzL3Njc2kvZGMzOTV4LmMKaW5kZXggMTgzMjQ1Mi4uNThiMDc0OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2RjMzk1eC5jCisrKyBiL2RyaXZlcnMvc2NzaS9kYzM5NXguYwpAQCAtMzc3MSw3ICszNzcxLDcgQEAKICAqIEB0YXJnZXQ6IFRoZSB0YXJnZXQgZm9yIHRoZSBuZXcgZGV2aWNlLgogICogQGx1bjogVGhlIGx1biBmb3IgdGhlIG5ldyBkZXZpY2UuCiAgKgotICogUmV0dXJuIHRoZSBuZXcgZGV2aWNlIGlmIHN1Y2Nlc2Z1bGwgb3IgTlVMTCBvbiBmYWlsdXJlLgorICogUmV0dXJuIHRoZSBuZXcgZGV2aWNlIGlmIHN1Y2Nlc3NmdWwgb3IgTlVMTCBvbiBmYWlsdXJlLgogICoqLwogc3RhdGljIHN0cnVjdCBEZXZpY2VDdGxCbGsgKmRldmljZV9hbGxvYyhzdHJ1Y3QgQWRhcHRlckN0bEJsayAqYWNiLAogCQl1OCB0YXJnZXQsIHU4IGx1bikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pYm1tY2EuYyBiL2RyaXZlcnMvc2NzaS9pYm1tY2EuYwppbmRleCAxMTVmNTU0Li40OTdmNjY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvaWJtbWNhLmMKKysrIGIvZHJpdmVycy9zY3NpL2libW1jYS5jCkBAIC03NjAsNyArNzYwLDcgQEAKIAkJd2hpbGUgKCFnb3RfaW50ZXJydXB0KGhvc3RfaW5kZXgpKQogCQkJYmFycmllcigpOwogCi0JCS8qaWYgY29tbWFuZCBzdWNjZXNmdWwsIGJyZWFrICovCisJCS8qaWYgY29tbWFuZCBzdWNjZXNzZnVsLCBicmVhayAqLwogCQlpZiAoKHN0YXRfcmVzdWx0KGhvc3RfaW5kZXgpID09IElNX1NDQl9DTURfQ09NUExFVEVEKSB8fCAoc3RhdF9yZXN1bHQoaG9zdF9pbmRleCkgPT0gSU1fU0NCX0NNRF9DT01QTEVURURfV0lUSF9SRVRSSUVTKSkKIAkJCXJldHVybiAxOwogCX0KQEAgLTg4NSw3ICs4ODUsNyBAQAogCQl3aGlsZSAoIWdvdF9pbnRlcnJ1cHQoaG9zdF9pbmRleCkpCiAJCQliYXJyaWVyKCk7CiAKLQkJLyppZiBjb21tYW5kIHN1Y2Nlc2Z1bCwgYnJlYWsgKi8KKwkJLyppZiBjb21tYW5kIHN1Y2Nlc3NmdWwsIGJyZWFrICovCiAJCWlmIChzdGF0X3Jlc3VsdChob3N0X2luZGV4KSA9PSBJTV9JTU1FRElBVEVfQ01EX0NPTVBMRVRFRCkKIAkJCXJldHVybiAxOwogCX0KQEAgLTkyMSw3ICs5MjEsNyBAQAogCQkJcmV0dXJuIDI7CiAJCX0gZWxzZQogCQkJZ2xvYmFsX2NvbW1hbmRfZXJyb3JfZXhjdXNlID0gMDsKLQkJLyppZiBjb21tYW5kIHN1Y2Nlc2Z1bCwgYnJlYWsgKi8KKwkJLyppZiBjb21tYW5kIHN1Y2Nlc3NmdWwsIGJyZWFrICovCiAJCWlmIChzdGF0X3Jlc3VsdChob3N0X2luZGV4KSA9PSBJTV9JTU1FRElBVEVfQ01EX0NPTVBMRVRFRCkKIAkJCXJldHVybiAxOwogCX0KQEAgLTk1OSw3ICs5NTksNyBAQAogCQkJLyogZGlkIG5vdCB3b3JrLCBmaW5pc2ggKi8KIAkJCXJldHVybiAxOwogCQl9Ci0JCS8qaWYgY29tbWFuZCBzdWNjZXNmdWwsIGJyZWFrICovCisJCS8qaWYgY29tbWFuZCBzdWNjZXNzZnVsLCBicmVhayAqLwogCQlpZiAoc3RhdF9yZXN1bHQoaG9zdF9pbmRleCkgPT0gSU1fSU1NRURJQVRFX0NNRF9DT01QTEVURUQpCiAJCQlyZXR1cm4gMTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaW1tLmMgYi9kcml2ZXJzL3Njc2kvaW1tLmMKaW5kZXggY2QyZGZmZC4uNjgxYmQxOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2ltbS5jCisrKyBiL2RyaXZlcnMvc2NzaS9pbW0uYwpAQCAtMyw5ICszLDYgQEAKICAqIAogICogKFRoZSBJTU0gaXMgdGhlIGVtYmVkZGVkIGNvbnRyb2xsZXIgaW4gdGhlIFpJUCBQbHVzIGRyaXZlLikKICAqIAotICogQ3VycmVudCBNYWludGFpbmVyOiBEYXZpZCBDYW1wYmVsbCAoUGVydGgsIFdlc3Rlcm4gQXVzdHJhbGlhKQotICogICAgICAgICAgICAgICAgICAgICBjYW1wYmVsbEB0b3JxdWUubmV0Ci0gKgogICogTXkgdW5vZmZpY2FsIGNvbXBhbnkgYWNyb255bSBsaXN0IGlzIDIxIHBhZ2VzIGxvbmc6CiAgKiAgICAgIEZMQTogICAgRm91ciBsZXR0ZXIgYWNyb255bSB3aXRoIGJ1aWx0IGluIGZhY2lsaXR5IGZvcgogICogICAgICAgICAgICAgIGZ1dHVyZSBleHBhbnNpb24gdG8gZml2ZSBsZXR0ZXJzLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2ltbS5oIGIvZHJpdmVycy9zY3NpL2ltbS5oCmluZGV4IGRjM2FlYmYuLmVjZTkzNmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9pbW0uaAorKysgYi9kcml2ZXJzL3Njc2kvaW1tLmgKQEAgLTIsNyArMiw3IEBACiAvKiAgRHJpdmVyIGZvciB0aGUgSW9tZWdhIE1hdGNoTWFrZXIgcGFyYWxsZWwgcG9ydCBTQ1NJIEhCQSBlbWJlZGRlZCBpbiAKICAqIHRoZSBJb21lZ2EgWklQIFBsdXMgZHJpdmUKICAqIAotICogKGMpIDE5OTggICAgIERhdmlkIENhbXBiZWxsICAgICBjYW1wYmVsbEB0b3JxdWUubmV0CisgKiAoYykgMTk5OCAgICAgRGF2aWQgQ2FtcGJlbGwKICAqCiAgKiBQbGVhc2Ugbm90ZSB0aGF0IEkgbGl2ZSBpbiBQZXJ0aCwgV2VzdGVybiBBdXN0cmFsaWEuIEdNVCswODAwCiAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pcHMuYyBiL2RyaXZlcnMvc2NzaS9pcHMuYwppbmRleCA1MzUzYjI4Li43OGYyZmY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvaXBzLmMKKysrIGIvZHJpdmVycy9zY3NpL2lwcy5jCkBAIC02NDM4LDcgKzY0MzgsNyBAQAogCQkvKiBWUFAgZmFpbHVyZSAqLwogCQlyZXR1cm4gKDEpOwogCi0JLyogY2hlY2sgZm9yIHN1Y2Nlc2Z1bCBmbGFzaCAqLworCS8qIGNoZWNrIGZvciBzdWNjZXNzZnVsIGZsYXNoICovCiAJaWYgKHN0YXR1cyAmIDB4MzApCiAJCS8qIHNlcXVlbmNlIGVycm9yICovCiAJCXJldHVybiAoMSk7CkBAIC02NTUwLDcgKzY1NTAsNyBAQAogCQkvKiBWUFAgZmFpbHVyZSAqLwogCQlyZXR1cm4gKDEpOwogCi0JLyogY2hlY2sgZm9yIHN1Y2Nlc2Z1bCBmbGFzaCAqLworCS8qIGNoZWNrIGZvciBzdWNjZXNzZnVsIGZsYXNoICovCiAJaWYgKHN0YXR1cyAmIDB4MzApCiAJCS8qIHNlcXVlbmNlIGVycm9yICovCiAJCXJldHVybiAoMSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbWFjX2VzcC5jIGIvZHJpdmVycy9zY3NpL21hY19lc3AuYwppbmRleCBlMzFmYWRkLi4xMTgyMDZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbWFjX2VzcC5jCisrKyBiL2RyaXZlcnMvc2NzaS9tYWNfZXNwLmMKQEAgLTQzLDkgKzQzLDYgQEAKIAogLyogI2RlZmluZSBERUJVR19NQUNfRVNQICovCiAKLSNkZWZpbmUgbWFjX3R1cm5vbl9pcnEoeCkJbWFjX2VuYWJsZV9pcnEoeCkKLSNkZWZpbmUgbWFjX3R1cm5vZmZfaXJxKHgpCW1hY19kaXNhYmxlX2lycSh4KQotCiBleHRlcm4gdm9pZCBlc3BfaGFuZGxlKHN0cnVjdCBOQ1JfRVNQICplc3ApOwogZXh0ZXJuIHZvaWQgbWFjX2VzcF9pbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnByZWdzKTsKIApAQCAtNjM5LDEzICs2MzYsMTMgQEAKIAogc3RhdGljIHZvaWQgZG1hX2ludHNfb2ZmKHN0cnVjdCBOQ1JfRVNQICogZXNwKQogewotCW1hY190dXJub2ZmX2lycShlc3AtPmlycSk7CisJZGlzYWJsZV9pcnEoZXNwLT5pcnEpOwogfQogCiAKIHN0YXRpYyB2b2lkIGRtYV9pbnRzX29uKHN0cnVjdCBOQ1JfRVNQICogZXNwKQogewotCW1hY190dXJub25faXJxKGVzcC0+aXJxKTsKKwllbmFibGVfaXJxKGVzcC0+aXJxKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tYWNfc2NzaS5jIGIvZHJpdmVycy9zY3NpL21hY19zY3NpLmMKaW5kZXggNzc3ZjliYy4uYTk0MmEyMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL21hY19zY3NpLmMKKysrIGIvZHJpdmVycy9zY3NpL21hY19zY3NpLmMKQEAgLTY1LDkgKzY1LDYgQEAKICNkZWZpbmUgUkVTRVRfQk9PVAogI2RlZmluZSBEUklWRVJfU0VUVVAKIAotI2RlZmluZQlFTkFCTEVfSVJRKCkJbWFjX2VuYWJsZV9pcnEoIElSUV9NQUNfU0NTSSApOyAKLSNkZWZpbmUJRElTQUJMRV9JUlEoKQltYWNfZGlzYWJsZV9pcnEoIElSUV9NQUNfU0NTSSApOwotCiBleHRlcm4gdm9pZCB2aWFfc2NzaV9jbGVhcih2b2lkKTsKIAogI2lmZGVmIFJFU0VUX0JPT1QKQEAgLTM1MSw3ICszNDgsNyBAQAogCXByaW50ayhLRVJOX0lORk8gIk1hY2ludG9zaCBTQ1NJOiByZXNldHRpbmcgdGhlIFNDU0kgYnVzLi4uIiApOwogCiAJLyogc3dpdGNoIG9mZiBTQ1NJIElSUSAtIGNhdGNoIGFuIGludGVycnVwdCB3aXRob3V0IElSUSBiaXQgc2V0IGVsc2UgKi8KLQltYWNfZGlzYWJsZV9pcnEoSVJRX01BQ19TQ1NJKTsKKwlkaXNhYmxlX2lycShJUlFfTUFDX1NDU0kpOwogCiAJLyogZ2V0IGluIHBoYXNlICovCiAJTkNSNTM4MF93cml0ZSggVEFSR0VUX0NPTU1BTkRfUkVHLApAQCAtMzY5LDcgKzM2Niw3IEBACiAJCWJhcnJpZXIoKTsKIAogCS8qIHN3aXRjaCBvbiBTQ1NJIElSUSBhZ2FpbiAqLwotCW1hY19lbmFibGVfaXJxKElSUV9NQUNfU0NTSSk7CisJZW5hYmxlX2lycShJUlFfTUFDX1NDU0kpOwogCiAJcHJpbnRrKEtFUk5fSU5GTyAiIGRvbmVcbiIgKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9tYm94LmMgYi9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfbWJveC5jCmluZGV4IGJlYzE0MjQuLmI3Y2FmNjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9tYm94LmMKKysrIGIvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX21ib3guYwpAQCAtNzE0LDcgKzcxNCw3IEBACiAgKiAuIEFsbG9jYXRlIG1lbW9yeSByZXF1aXJlZCBmb3IgYWxsIHRoZSBjb21tYW5kcwogICogLiBVc2UgaW50ZXJuYWwgbGlicmFyeSBvZiBGVyByb3V0aW5lcywgYnVpbGQgdXAgY29tcGxldGUgc29mdCBzdGF0ZQogICovCi1zdGF0aWMgaW50IF9faW5pdAorc3RhdGljIGludCBfX2RldmluaXQKIG1lZ2FyYWlkX2luaXRfbWJveChhZGFwdGVyX3QgKmFkYXB0ZXIpCiB7CiAJc3RydWN0IHBjaV9kZXYJCSpwZGV2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL25jcjUzYzh4eC5jIGIvZHJpdmVycy9zY3NpL25jcjUzYzh4eC5jCmluZGV4IDZhYjAzNTUuLmIyODcxMmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9uY3I1M2M4eHguYworKysgYi9kcml2ZXJzL3Njc2kvbmNyNTNjOHh4LmMKQEAgLTUxMTgsOCArNTExOCw3IEBACiAJCWNwLT5ob3N0X3N0YXR1cyAmPSB+SFNfU0tJUE1BU0s7CiAJCWNwLT5zdGFydC5zY2hlZHVsZS5sX3BhZGRyID0gCiAJCQljcHVfdG9fc2NyKE5DQl9TQ1JJUFRfUEhZUyAobnAsIHNlbGVjdCkpOwotCQlsaXN0X2RlbCgmY3AtPmxpbmtfY2NicSk7Ci0JCWxpc3RfYWRkX3RhaWwoJmNwLT5saW5rX2NjYnEsICZscC0+c2tpcF9jY2JxKTsKKwkJbGlzdF9tb3ZlX3RhaWwoJmNwLT5saW5rX2NjYnEsICZscC0+c2tpcF9jY2JxKTsKIAkJaWYgKGNwLT5xdWV1ZWQpIHsKIAkJCS0tbHAtPnF1ZXVlZGNjYnM7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9wcGEuYyBiL2RyaXZlcnMvc2NzaS9wcGEuYwppbmRleCAxMDg5MTBmLi5kNThhYzVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcHBhLmMKKysrIGIvZHJpdmVycy9zY3NpL3BwYS5jCkBAIC02LDggKzYsNiBAQAogICogKGMpIDE5OTUsMTk5NiBHcmFudCBSLiBHdWVudGhlciwgZ3JhbnRAdG9ycXVlLm5ldCwKICAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCiAgKiAKLSAqIEN1cnJlbnQgTWFpbnRhaW5lcjogRGF2aWQgQ2FtcGJlbGwgKFBlcnRoLCBXZXN0ZXJuIEF1c3RyYWxpYSwgR01UKzA4MDApCi0gKiAgICAgICAgICAgICAgICAgICAgIGNhbXBiZWxsQHRvcnF1ZS5uZXQKICAqLwogCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcHBhLmggYi9kcml2ZXJzL3Njc2kvcHBhLmgKaW5kZXggZjZlMWExNS4uNzUxMWRmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3BwYS5oCisrKyBiL2RyaXZlcnMvc2NzaS9wcGEuaApAQCAtMiw3ICsyLDcgQEAKICAqIHRoZSBJb21lZ2EgWklQIGRyaXZlCiAgKiAKICAqIChjKSAxOTk2ICAgICBHcmFudCBSLiBHdWVudGhlciAgZ3JhbnRAdG9ycXVlLm5ldAotICogICAgICAgICAgICAgIERhdmlkIENhbXBiZWxsICAgICBjYW1wYmVsbEB0b3JxdWUubmV0CisgKiAgICAgICAgICAgICAgRGF2aWQgQ2FtcGJlbGwKICAqCiAgKiAgICAgIEFsbCBjb21tZW50cyB0byBEYXZpZC4KICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2luaXQuYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pbml0LmMKaW5kZXggYWVmMDkzZC4uM2Q0NDg3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2luaXQuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaW5pdC5jCkBAIC0yMjU4LDggKzIyNTgsNyBAQAogCQkJfQogCiAJCQkvKiBSZW1vdmUgZGV2aWNlIGZyb20gdGhlIG5ldyBsaXN0IGFuZCBhZGQgaXQgdG8gREIgKi8KLQkJCWxpc3RfZGVsKCZmY3BvcnQtPmxpc3QpOwotCQkJbGlzdF9hZGRfdGFpbCgmZmNwb3J0LT5saXN0LCAmaGEtPmZjcG9ydHMpOworCQkJbGlzdF9tb3ZlX3RhaWwoJmZjcG9ydC0+bGlzdCwgJmhhLT5mY3BvcnRzKTsKIAogCQkJLyogTG9naW4gYW5kIHVwZGF0ZSBkYXRhYmFzZSAqLwogCQkJcWxhMngwMF9mYWJyaWNfZGV2X2xvZ2luKGhhLCBmY3BvcnQsICZuZXh0X2xvb3BpZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc3QuYyBiL2RyaXZlcnMvc2NzaS9zdC5jCmluZGV4IDEyNzJkZDIuLmI1MjE4ZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zdC5jCisrKyBiL2RyaXZlcnMvc2NzaS9zdC5jCkBAIC0yODE4LDcgKzI4MTgsNyBAQAogCQkgICAgKGNtZHN0YXRwLT5zZW5zZV9oZHIuc2Vuc2Vfa2V5ID09IE5PX1NFTlNFIHx8CiAJCSAgICAgY21kc3RhdHAtPnNlbnNlX2hkci5zZW5zZV9rZXkgPT0gUkVDT1ZFUkVEX0VSUk9SKSAmJgogCQkgICAgdW5kb25lID09IDApIHsKLQkJCWlvY3RsX3Jlc3VsdCA9IDA7CS8qIEVPRiB3cml0dGVuIHN1Y2Nlc2Z1bGx5IGF0IEVPTSAqLworCQkJaW9jdGxfcmVzdWx0ID0gMDsJLyogRU9GIHdyaXR0ZW4gc3VjY2Vzc2Z1bGx5IGF0IEVPTSAqLwogCQkJaWYgKGZpbGVubyA+PSAwKQogCQkJCWZpbGVubysrOwogCQkJU1Rwcy0+ZHJ2X2ZpbGUgPSBmaWxlbm87CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc3VuM3hfZXNwLmMgYi9kcml2ZXJzL3Njc2kvc3VuM3hfZXNwLmMKaW5kZXggY2M5OTBiZS4uMmUyYzFlYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3N1bjN4X2VzcC5jCisrKyBiL2RyaXZlcnMvc2NzaS9zdW4zeF9lc3AuYwpAQCAtMzMyLDExICszMzIsMTEgQEAKICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnID0gc3AtPlNDcC5idWZmZXI7CiAKICAgICB3aGlsZSAoc3ogPj0gMCkgewotCSAgICBzZ1tzel0uZHZtYV9hZGRyZXNzID0gZHZtYV9tYXAoKHVuc2lnbmVkIGxvbmcpcGFnZV9hZGRyZXNzKHNnW3N6XS5wYWdlKSArCisJICAgIHNnW3N6XS5kbWFfYWRkcmVzcyA9IGR2bWFfbWFwKCh1bnNpZ25lZCBsb25nKXBhZ2VfYWRkcmVzcyhzZ1tzel0ucGFnZSkgKwogCQkJCQkgICBzZ1tzel0ub2Zmc2V0LCBzZ1tzel0ubGVuZ3RoKTsKIAkgICAgc3otLTsKICAgICB9Ci0gICAgc3AtPlNDcC5wdHI9KGNoYXIgKikoKHVuc2lnbmVkIGxvbmcpc3AtPlNDcC5idWZmZXItPmR2bWFfYWRkcmVzcyk7CisgICAgc3AtPlNDcC5wdHI9KGNoYXIgKikoKHVuc2lnbmVkIGxvbmcpc3AtPlNDcC5idWZmZXItPmRtYV9hZGRyZXNzKTsKIH0KIAogc3RhdGljIHZvaWQgZG1hX21tdV9yZWxlYXNlX3Njc2lfb25lIChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBTY3NpX0NtbmQgKnNwKQpAQCAtMzUwLDE0ICszNTAsMTQgQEAKICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnID0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKXNwLT5idWZmZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICB3aGlsZShzeiA+PSAwKSB7Ci0gICAgICAgIGR2bWFfdW5tYXAoKGNoYXIgKilzZ1tzel0uZHZtYV9hZGRyZXNzKTsKKyAgICAgICAgZHZtYV91bm1hcCgoY2hhciAqKXNnW3N6XS5kbWFfYWRkcmVzcyk7CiAgICAgICAgIHN6LS07CiAgICAgfQogfQogCiBzdGF0aWMgdm9pZCBkbWFfYWR2YW5jZV9zZyAoU2NzaV9DbW5kICpzcCkKIHsKLSAgICBzcC0+U0NwLnB0ciA9IChjaGFyICopKCh1bnNpZ25lZCBsb25nKXNwLT5TQ3AuYnVmZmVyLT5kdm1hX2FkZHJlc3MpOworICAgIHNwLT5TQ3AucHRyID0gKGNoYXIgKikoKHVuc2lnbmVkIGxvbmcpc3AtPlNDcC5idWZmZXItPmRtYV9hZGRyZXNzKTsKIH0KIAogc3RhdGljIGludCBzdW4zeF9lc3BfcmVsZWFzZShzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS93ZDcwMDAuYyBiL2RyaXZlcnMvc2NzaS93ZDcwMDAuYwppbmRleCBlNTVmMGVlLi41NzQ5NTViIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvd2Q3MDAwLmMKKysrIGIvZHJpdmVycy9zY3NpL3dkNzAwMC5jCkBAIC0xMzkxLDcgKzEzOTEsNyBAQAogICoKICAqLwogCi1zdGF0aWMgaW50IHdkNzAwMF9kZXRlY3Qoc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqdHBudCkKK3N0YXRpYyBfX2luaXQgaW50IHdkNzAwMF9kZXRlY3Qoc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqdHBudCkKIHsKIAlzaG9ydCBwcmVzZW50ID0gMCwgYmlvc2FkZHJfcHRyLCBzaWdfcHRyLCBpLCBwYXNzOwogCXNob3J0IGJpb3NwdHJbTlVNX0NPTkZJR1NdOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvODI1MF9wbnAuYyBiL2RyaXZlcnMvc2VyaWFsLzgyNTBfcG5wLmMKaW5kZXggYjc5ZWQwNi4uNzM5YmM4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvODI1MF9wbnAuYworKysgYi9kcml2ZXJzL3NlcmlhbC84MjUwX3BucC5jCkBAIC0zMjMsOCArMzIzLDEwIEBACiAJewkiVVNSOTE4MCIsCQkwCX0sCiAJLyogVS5TLiBSb2JvdGljcyA1NksgVm9pY2UgSU5UIFBuUCovCiAJewkiVVNSOTE5MCIsCQkwCX0sCi0JLyogSFAgQ29tcGFxIFRhYmxldCBQQyB0YzExMDAgV2Fjb20gdGFibGV0ICovCisJLyogV2Fjb20gdGFibGV0cyAqLworCXsJIldBQ0YwMDQiLAkJMAl9LAogCXsJIldBQ0YwMDUiLAkJMAl9LAorCXsgICAgICAgIldBQ0YwMDYiLCAgICAgICAgICAgICAgMCAgICAgICB9LAogCS8qIFJvY2t3ZWxsJ3MgKFBPUkFMaU5LKSAzMzYwMCBJTlQgUE5QICovCiAJewkiV0NJMDAwMyIsCQkwCX0sCiAJLyogVW5rb3duIFBuUCBtb2RlbXMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL21jZnNlcmlhbC5jIGIvZHJpdmVycy9zZXJpYWwvbWNmc2VyaWFsLmMKaW5kZXggOGNiYmI5NS4uOGFkMjQyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvbWNmc2VyaWFsLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvbWNmc2VyaWFsLmMKQEAgLTYwLDExICs2MCwxMSBAQAogI2lmIGRlZmluZWQoQ09ORklHX0hXX0ZFSVRIKQogI2RlZmluZQlDT05TT0xFX0JBVURfUkFURQkzODQwMAogI2RlZmluZQlERUZBVUxUX0NCQVVECQlCMzg0MDAKLSNlbGlmIGRlZmluZWQoQ09ORklHX01PRDUyNzIpIHx8IGRlZmluZWQoQ09ORklHX001MjA4RVZCKQorI2VsaWYgZGVmaW5lZChDT05GSUdfTU9ENTI3MikgfHwgZGVmaW5lZChDT05GSUdfTTUyMDhFVkIpIHx8IGRlZmluZWQoQ09ORklHX001MzI5RVZCKQogI2RlZmluZSBDT05TT0xFX0JBVURfUkFURSAJMTE1MjAwCiAjZGVmaW5lIERFRkFVTFRfQ0JBVUQJCUIxMTUyMDAKICNlbGlmIGRlZmluZWQoQ09ORklHX0FSTkVXU0gpIHx8IGRlZmluZWQoQ09ORklHX0ZSRUVTQ0FMRSkgfHwgXAotICAgICAgZGVmaW5lZChDT05GSUdfc2VuVGVjKSB8fCBkZWZpbmVkKENPTkZJR19TTkVIQSkKKyAgICAgIGRlZmluZWQoQ09ORklHX3NlblRlYykgfHwgZGVmaW5lZChDT05GSUdfU05FSEEpIHx8IGRlZmluZWQoQ09ORklHX0FWTkVUKQogI2RlZmluZQlDT05TT0xFX0JBVURfUkFURQkxOTIwMAogI2RlZmluZQlERUZBVUxUX0NCQVVECQlCMTkyMDAKICNlbmRpZgpAQCAtOTMsNyArOTMsNyBAQAogI3VuZGVmIFNFUklBTF9ERUJVR19GTE9XCiAKICNpZiBkZWZpbmVkKENPTkZJR19NNTIzeCkgfHwgZGVmaW5lZChDT05GSUdfTTUyN3gpIHx8IGRlZmluZWQoQ09ORklHX001Mjh4KSB8fCBcCi0gICAgZGVmaW5lZChDT05GSUdfTTUyMHgpCisgICAgZGVmaW5lZChDT05GSUdfTTUyMHgpIHx8IGRlZmluZWQoQ09ORklHX001MzJ4KQogI2RlZmluZQlJUlFCQVNFCShNQ0ZJTlRfVkVDQkFTRStNQ0ZJTlRfVUFSVDApCiAjZWxzZQogI2RlZmluZQlJUlFCQVNFCTczCkBAIC0xNTQ1LDYgKzE1NDUsMjggQEAKIAkJCSpmZWNpMmNfcGFyIHw9ICBNQ0ZfR1BJT19QQVJfRkVDSTJDX1BBUl9TQ0xfVVRYRDIKIAkJCQkgICAgfCBNQ0ZfR1BJT19QQVJfRkVDSTJDX1BBUl9TREFfVVJYRDI7CiAJCX0KKyNlbGlmIGRlZmluZWQoQ09ORklHX001MzJ4KQorCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKnVhcnRwOworCXVhcnRwID0gaW5mby0+YWRkcjsKKwlzd2l0Y2ggKGluZm8tPmxpbmUpIHsKKwljYXNlIDA6CisJCU1DRl9JTlRDMF9JQ1IyNiA9IDB4MzsKKwkJTUNGX0lOVEMwX0NJTVIgPSAyNjsKKwkJLyogR1BJTyBpbml0aWFsaXphdGlvbiAqLworCQlNQ0ZfR1BJT19QQVJfVUFSVCB8PSAweDAwMEY7CisJCWJyZWFrOworCWNhc2UgMToKKwkJTUNGX0lOVEMwX0lDUjI3ID0gMHgzOworCQlNQ0ZfSU5UQzBfQ0lNUiA9IDI3OworCQkvKiBHUElPIGluaXRpYWxpemF0aW9uICovCisJCU1DRl9HUElPX1BBUl9VQVJUIHw9IDB4MEZGMDsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlNQ0ZfSU5UQzBfSUNSMjggPSAweDM7CisJCU1DRl9JTlRDMF9DSU1SID0gMjg7CisJCS8qIEdQSU9zIGFsc28gbXVzdCBiZSBpbml0YWxpemVkLCBkZXBlbmRzIG9uIGJvYXJkICovCisJCWJyZWFrOworCX0KICNlbHNlCiAJdm9sYXRpbGUgdW5zaWduZWQgY2hhcgkqaWNycCwgKnVhcnRwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3RlbGVwaG9ueS9peGouYyBiL2RyaXZlcnMvdGVsZXBob255L2l4ai5jCmluZGV4IDU1NzhhOWQuLmY2YjI5NDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGVsZXBob255L2l4ai5jCisrKyBiL2RyaXZlcnMvdGVsZXBob255L2l4ai5jCkBAIC01NzEyLDcgKzU3MTIsNyBAQAogCXJldHVybiAxOwogfQogCi1pbnQgaXhqX3NldF90b25lX29mZih1bnNpZ25lZCBzaG9ydCBhcmcsIElYSiAqaikKK3N0YXRpYyBpbnQgaXhqX3NldF90b25lX29mZih1bnNpZ25lZCBzaG9ydCBhcmcsIElYSiAqaikKIHsKIAlqLT50b25lX29mZl90aW1lID0gYXJnOwogCWlmIChpeGpfV3JpdGVEU1BDb21tYW5kKDB4NkUwNSwgaikpCQkvKiBTZXQgVG9uZSBPZmYgUGVyaW9kICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2lub2RlLmMgYi9kcml2ZXJzL3VzYi9jb3JlL2lub2RlLmMKaW5kZXggOTVmNWFkOS4uYmZjOWIyOCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9pbm9kZS5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvaW5vZGUuYwpAQCAtNTY5LDcgKzU2OSw3IEBACiAJaWdub3JlX21vdW50ID0gMTsKIAogCS8qIGNyZWF0ZSB0aGUgZGV2aWNlcyBzcGVjaWFsIGZpbGUgKi8KLQlyZXR2YWwgPSBzaW1wbGVfcGluX2ZzKCJ1c2JmcyIsICZ1c2Jmc19tb3VudCwgJnVzYmZzX21vdW50X2NvdW50KTsKKwlyZXR2YWwgPSBzaW1wbGVfcGluX2ZzKCZ1c2JfZnNfdHlwZSwgJnVzYmZzX21vdW50LCAmdXNiZnNfbW91bnRfY291bnQpOwogCWlmIChyZXR2YWwpIHsKIAkJZXJyICgiVW5hYmxlIHRvIGdldCB1c2JmcyBtb3VudCIpOwogCQlnb3RvIGV4aXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2hjX2NyaXN2MTAuYyBiL2RyaXZlcnMvdXNiL2hvc3QvaGNfY3Jpc3YxMC5jCmluZGV4IDJmZTdmZDEuLjRhMjI5MDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvaGNfY3Jpc3YxMC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvaGNfY3Jpc3YxMC5jCkBAIC00MTEsOCArNDExLDcgQEAKIAl1cmJfZW50cnlfdCAqdXJiX2VudHJ5ID0gX191cmJfbGlzdF9lbnRyeSh1cmIsIGVwaWQpOwogCWFzc2VydCh1cmJfZW50cnkpOwogCi0JbGlzdF9kZWwoJnVyYl9lbnRyeS0+bGlzdCk7Ci0JbGlzdF9hZGRfdGFpbCgmdXJiX2VudHJ5LT5saXN0LCAmdXJiX2xpc3RbZXBpZF0pOworCWxpc3RfbW92ZV90YWlsKCZ1cmJfZW50cnktPmxpc3QsICZ1cmJfbGlzdFtlcGlkXSk7CiB9CiAKIC8qIEdldCB0aGUgbmV4dCB1cmIgaW4gdGhlIGxpc3QuICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9pbnB1dC9maXhwLWFyaXRoLmggYi9kcml2ZXJzL3VzYi9pbnB1dC9maXhwLWFyaXRoLmgKaW5kZXggYjQ0ZDM5OC4uZWQzZDJkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaW5wdXQvZml4cC1hcml0aC5oCisrKyBiL2RyaXZlcnMvdXNiL2lucHV0L2ZpeHAtYXJpdGguaApAQCAtMiw4ICsyLDYgQEAKICNkZWZpbmUgX0ZJWFBfQVJJVEhfSAogCiAvKgotICogJCQKLSAqCiAgKiBTaW1wbGlzdGljIGZpeGVkLXBvaW50IGFyaXRobWV0aWNzLgogICogSG1tLCBJJ20gcHJvYmFibHkgZHVwbGljYXRpbmcgc29tZSBjb2RlIDooCiAgKgpAQCAtMzEsMjAgKzI5LDIwIEBACiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogCi0vLyBUaGUgdHlwZSByZXByZXNlbnRpbmcgZml4ZWQtcG9pbnQgdmFsdWVzCisvKiBUaGUgdHlwZSByZXByZXNlbnRpbmcgZml4ZWQtcG9pbnQgdmFsdWVzICovCiB0eXBlZGVmIHMxNiBmaXhwX3Q7CiAKICNkZWZpbmUgRlJBQ19OIDgKICNkZWZpbmUgRlJBQ19NQVNLICgoMTw8RlJBQ19OKS0xKQogCi0vLyBOb3QgdG8gYmUgdXNlZCBkaXJlY3RseS4gVXNlIGZpeHBfe2NvcyxzaW59Ci1zdGF0aWMgY29uc3QgZml4cF90IGNvc190YWJsZVs0NV0gPSB7CisvKiBOb3QgdG8gYmUgdXNlZCBkaXJlY3RseS4gVXNlIGZpeHBfe2NvcyxzaW59ICovCitzdGF0aWMgY29uc3QgZml4cF90IGNvc190YWJsZVs0Nl0gPSB7CiAJMHgwMTAwLAkweDAwRkYsCTB4MDBGRiwJMHgwMEZFLAkweDAwRkQsCTB4MDBGQywJMHgwMEZBLAkweDAwRjgsCiAJMHgwMEY2LAkweDAwRjMsCTB4MDBGMCwJMHgwMEVELAkweDAwRTksCTB4MDBFNiwJMHgwMEUyLAkweDAwREQsCiAJMHgwMEQ5LAkweDAwRDQsCTB4MDBDRiwJMHgwMEM5LAkweDAwQzQsCTB4MDBCRSwJMHgwMEI4LAkweDAwQjEsCiAJMHgwMEFCLAkweDAwQTQsCTB4MDA5RCwJMHgwMDk2LAkweDAwOEYsCTB4MDA4NywJMHgwMDgwLAkweDAwNzgsCiAJMHgwMDcwLAkweDAwNjgsCTB4MDA1RiwJMHgwMDU3LAkweDAwNEYsCTB4MDA0NiwJMHgwMDNELAkweDAwMzUsCi0JMHgwMDJDLAkweDAwMjMsCTB4MDAxQSwJMHgwMDExLAkweDAwMDgKKwkweDAwMkMsCTB4MDAyMywJMHgwMDFBLAkweDAwMTEsCTB4MDAwOCwgMHgwMDAwCiB9OwogCiAKQEAgLTY4LDkgKzY2LDggQEAKIAlpbnQgcXVhZHJhbnQgPSAoZGVncmVlcyAvIDkwKSAmIDM7CiAJdW5zaWduZWQgaW50IGkgPSBkZWdyZWVzICUgOTA7CiAKLQlpZiAocXVhZHJhbnQgPT0gMSB8fCBxdWFkcmFudCA9PSAzKSB7Ci0JCWkgPSA4OSAtIGk7Ci0JfQorCWlmIChxdWFkcmFudCA9PSAxIHx8IHF1YWRyYW50ID09IDMpCisJCWkgPSA5MCAtIGk7CiAKIAlpID4+PSAxOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9pbnB1dC9oaWQtZGVidWcuaCBiL2RyaXZlcnMvdXNiL2lucHV0L2hpZC1kZWJ1Zy5oCmluZGV4IDcwMmM0OGMuLmYwNGQ2ZDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2lucHV0L2hpZC1kZWJ1Zy5oCisrKyBiL2RyaXZlcnMvdXNiL2lucHV0L2hpZC1kZWJ1Zy5oCkBAIC01NjMsNyArNTYzLDcgQEAKIAlbS0VZX1ZPTFVNRVVQXSA9ICJWb2x1bWVVcCIsCQlbS0VZX1BPV0VSXSA9ICJQb3dlciIsCiAJW0tFWV9LUEVRVUFMXSA9ICJLUEVxdWFsIiwJCVtLRVlfS1BQTFVTTUlOVVNdID0gIktQUGx1c01pbnVzIiwKIAlbS0VZX1BBVVNFXSA9ICJQYXVzZSIsCQkJW0tFWV9LUENPTU1BXSA9ICJLUENvbW1hIiwKLQlbS0VZX0hBTkdVRUxdID0gIkhhbmd1ZWwiLAkJW0tFWV9IQU5KQV0gPSAiSGFuamEiLAorCVtLRVlfSEFOR1VFTF0gPSAiSGFuZ2V1bCIsCQlbS0VZX0hBTkpBXSA9ICJIYW5qYSIsCiAJW0tFWV9ZRU5dID0gIlllbiIsCQkJW0tFWV9MRUZUTUVUQV0gPSAiTGVmdE1ldGEiLAogCVtLRVlfUklHSFRNRVRBXSA9ICJSaWdodE1ldGEiLAkJW0tFWV9DT01QT1NFXSA9ICJDb21wb3NlIiwKIAlbS0VZX1NUT1BdID0gIlN0b3AiLAkJCVtLRVlfQUdBSU5dID0gIkFnYWluIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC93aGl0ZWhlYXQuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC93aGl0ZWhlYXQuYwppbmRleCA1YjA2ZmEzLi41NmZmYzgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvd2hpdGVoZWF0LmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL3doaXRlaGVhdC5jCkBAIC02ODYsMTkgKzY4NiwxNiBAQAogCQl3cmFwID0gbGlzdF9lbnRyeSh0bXAsIHN0cnVjdCB3aGl0ZWhlYXRfdXJiX3dyYXAsIGxpc3QpOwogCQl1cmIgPSB3cmFwLT51cmI7CiAJCXVzYl9raWxsX3VyYih1cmIpOwotCQlsaXN0X2RlbCh0bXApOwotCQlsaXN0X2FkZCh0bXAsICZpbmZvLT5yeF91cmJzX2ZyZWUpOworCQlsaXN0X21vdmUodG1wLCAmaW5mby0+cnhfdXJic19mcmVlKTsKIAl9Ci0JbGlzdF9mb3JfZWFjaF9zYWZlKHRtcCwgdG1wMiwgJmluZm8tPnJ4X3VyYl9xKSB7Ci0JCWxpc3RfZGVsKHRtcCk7Ci0JCWxpc3RfYWRkKHRtcCwgJmluZm8tPnJ4X3VyYnNfZnJlZSk7Ci0JfQorCWxpc3RfZm9yX2VhY2hfc2FmZSh0bXAsIHRtcDIsICZpbmZvLT5yeF91cmJfcSkKKwkJbGlzdF9tb3ZlKHRtcCwgJmluZm8tPnJ4X3VyYnNfZnJlZSk7CisKIAlsaXN0X2Zvcl9lYWNoX3NhZmUodG1wLCB0bXAyLCAmaW5mby0+dHhfdXJic19zdWJtaXR0ZWQpIHsKIAkJd3JhcCA9IGxpc3RfZW50cnkodG1wLCBzdHJ1Y3Qgd2hpdGVoZWF0X3VyYl93cmFwLCBsaXN0KTsKIAkJdXJiID0gd3JhcC0+dXJiOwogCQl1c2Jfa2lsbF91cmIodXJiKTsKLQkJbGlzdF9kZWwodG1wKTsKLQkJbGlzdF9hZGQodG1wLCAmaW5mby0+dHhfdXJic19mcmVlKTsKKwkJbGlzdF9tb3ZlKHRtcCwgJmluZm8tPnR4X3VyYnNfZnJlZSk7CiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKIApAQCAtMTA4MCw4ICsxMDc3LDcgQEAKIAkJZXJyKCIlcyAtIE5vdCBteSB1cmIhIiwgX19GVU5DVElPTl9fKTsKIAkJcmV0dXJuOwogCX0KLQlsaXN0X2RlbCgmd3JhcC0+bGlzdCk7Ci0JbGlzdF9hZGQoJndyYXAtPmxpc3QsICZpbmZvLT50eF91cmJzX2ZyZWUpOworCWxpc3RfbW92ZSgmd3JhcC0+bGlzdCwgJmluZm8tPnR4X3VyYnNfZnJlZSk7CiAJc3Bpbl91bmxvY2soJmluZm8tPmxvY2spOwogCiAJaWYgKHVyYi0+c3RhdHVzKSB7CkBAIC0xMzcxLDggKzEzNjcsNyBAQAogCQkJCXdyYXAgPSBsaXN0X2VudHJ5KHRtcCwgc3RydWN0IHdoaXRlaGVhdF91cmJfd3JhcCwgbGlzdCk7CiAJCQkJdXJiID0gd3JhcC0+dXJiOwogCQkJCXVzYl9raWxsX3VyYih1cmIpOwotCQkJCWxpc3RfZGVsKHRtcCk7Ci0JCQkJbGlzdF9hZGQodG1wLCAmaW5mby0+cnhfdXJic19mcmVlKTsKKwkJCQlsaXN0X21vdmUodG1wLCAmaW5mby0+cnhfdXJic19mcmVlKTsKIAkJCX0KIAkJCWJyZWFrOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3VzYi5oIGIvZHJpdmVycy91c2Ivc3RvcmFnZS91c2IuaAppbmRleCAwMDlmYjA5Li41Mjg0YWJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3VzYi5oCisrKyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdXNiLmgKQEAgLTE2MCwxMCArMTYwLDEwIEBACiB9OwogCiAvKiBDb252ZXJ0IGJldHdlZW4gdXNfZGF0YSBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgU2NzaV9Ib3N0ICovCi1zdGF0aWMgc3RydWN0IFNjc2lfSG9zdCBpbmxpbmUgKnVzX3RvX2hvc3Qoc3RydWN0IHVzX2RhdGEgKnVzKSB7CitzdGF0aWMgaW5saW5lIHN0cnVjdCBTY3NpX0hvc3QgKnVzX3RvX2hvc3Qoc3RydWN0IHVzX2RhdGEgKnVzKSB7CiAJcmV0dXJuIGNvbnRhaW5lcl9vZigodm9pZCAqKSB1cywgc3RydWN0IFNjc2lfSG9zdCwgaG9zdGRhdGEpOwogfQotc3RhdGljIHN0cnVjdCB1c19kYXRhIGlubGluZSAqaG9zdF90b191cyhzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KSB7CitzdGF0aWMgaW5saW5lIHN0cnVjdCB1c19kYXRhICpob3N0X3RvX3VzKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpIHsKIAlyZXR1cm4gKHN0cnVjdCB1c19kYXRhICopIGhvc3QtPmhvc3RkYXRhOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL0tjb25maWcgYi9kcml2ZXJzL3ZpZGVvL0tjb25maWcKaW5kZXggNWEyODQwYS4uMTdkZTRjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9LY29uZmlnCisrKyBiL2RyaXZlcnMvdmlkZW8vS2NvbmZpZwpAQCAtNCw2ICs0LDIxIEBACiAKIG1lbnUgIkdyYXBoaWNzIHN1cHBvcnQiCiAKK2NvbmZpZyBGSVJNV0FSRV9FRElECisgICAgICAgYm9vbCAiRW5hYmxlIGZpcm13YXJlIEVESUQiCisgICAgICAgZGVmYXVsdCB5CisgICAgICAgLS0taGVscC0tLQorICAgICAgICAgVGhpcyBlbmFibGVzIGFjY2VzcyB0byB0aGUgRURJRCB0cmFuc2ZlcnJlZCBmcm9tIHRoZSBmaXJtd2FyZS4KKwkgT24gdGhlIGkzODYsIHRoaXMgaXMgZnJvbSB0aGUgVmlkZW8gQklPUy4gRW5hYmxlIHRoaXMgaWYgRERDL0kyQworCSB0cmFuc2ZlcnMgZG8gbm90IHdvcmsgZm9yIHlvdXIgZHJpdmVyIGFuZCBpZiB5b3UgYXJlIHVzaW5nCisJIG52aWRpYWZiLCBpODEwZmIgb3Igc2F2YWdlZmIuCisKKwkgSW4gZ2VuZXJhbCwgY2hvb3NpbmcgWSBmb3IgdGhpcyBvcHRpb24gaXMgc2FmZS4gIElmIHlvdQorCSBleHBlcmllbmNlIGV4dHJlbWVseSBsb25nIGRlbGF5cyB3aGlsZSBib290aW5nIGJlZm9yZSB5b3UgZ2V0CisJIHNvbWV0aGluZyBvbiB5b3VyIGRpc3BsYXksIHRyeSBzZXR0aW5nIHRoaXMgdG8gTi4gIE1hdHJveCBjYXJkcyBpbgorCSBjb21iaW5hdGlvbiB3aXRoIGNlcnRhaW4gbW90aGVyYm9hcmRzIGFuZCBtb25pdG9ycyBhcmUga25vd24gdG8KKwkgc3VmZmVyIGZyb20gdGhpcyBwcm9ibGVtLgorCiBjb25maWcgRkIKIAl0cmlzdGF0ZSAiU3VwcG9ydCBmb3IgZnJhbWUgYnVmZmVyIGRldmljZXMiCiAJLS0taGVscC0tLQpAQCAtNzAsMjEgKzg1LDEwIEBACiAgICAgICAgZGVwZW5kcyBvbiBGQgogICAgICAgIGRlZmF1bHQgbgogCi1jb25maWcgRkJfRklSTVdBUkVfRURJRAotICAgICAgIGJvb2wgIkVuYWJsZSBmaXJtd2FyZSBFRElEIgorY29uZmlnIEZCX0JBQ0tMSUdIVAorICAgICAgIGJvb2wKICAgICAgICBkZXBlbmRzIG9uIEZCCi0gICAgICAgZGVmYXVsdCB5Ci0gICAgICAgLS0taGVscC0tLQotICAgICAgICAgVGhpcyBlbmFibGVzIGFjY2VzcyB0byB0aGUgRURJRCB0cmFuc2ZlcnJlZCBmcm9tIHRoZSBmaXJtd2FyZS4KLQkgT24gdGhlIGkzODYsIHRoaXMgaXMgZnJvbSB0aGUgVmlkZW8gQklPUy4gRW5hYmxlIHRoaXMgaWYgRERDL0kyQwotCSB0cmFuc2ZlcnMgZG8gbm90IHdvcmsgZm9yIHlvdXIgZHJpdmVyIGFuZCBpZiB5b3UgYXJlIHVzaW5nCi0JIG52aWRpYWZiLCBpODEwZmIgb3Igc2F2YWdlZmIuCi0KLQkgSW4gZ2VuZXJhbCwgY2hvb3NpbmcgWSBmb3IgdGhpcyBvcHRpb24gaXMgc2FmZS4gIElmIHlvdQotCSBleHBlcmllbmNlIGV4dHJlbWVseSBsb25nIGRlbGF5cyB3aGlsZSBib290aW5nIGJlZm9yZSB5b3UgZ2V0Ci0JIHNvbWV0aGluZyBvbiB5b3VyIGRpc3BsYXksIHRyeSBzZXR0aW5nIHRoaXMgdG8gTi4gIE1hdHJveCBjYXJkcyBpbgotCSBjb21iaW5hdGlvbiB3aXRoIGNlcnRhaW4gbW90aGVyYm9hcmRzIGFuZCBtb25pdG9ycyBhcmUga25vd24gdG8KLQkgc3VmZmVyIGZyb20gdGhpcyBwcm9ibGVtLgorICAgICAgIGRlZmF1bHQgbgogCiBjb25maWcgRkJfTU9ERV9IRUxQRVJTCiAgICAgICAgIGJvb2wgIkVuYWJsZSBWaWRlbyBNb2RlIEhhbmRsaW5nIEhlbHBlcnMiCkBAIC01NDYsMTAgKzU1MCwxNCBAQAogCSAgWW91IHdpbGwgZ2V0IGEgYm9vdCB0aW1lIHBlbmd1aW4gbG9nbyBhdCBubyBhZGRpdGlvbmFsIGNvc3QuIFBsZWFzZQogCSAgcmVhZCA8ZmlsZTpEb2N1bWVudGF0aW9uL2ZiL3Zlc2FmYi50eHQ+LiBJZiB1bnN1cmUsIHNheSBZLgogCi1jb25maWcgVklERU9fU0VMRUNUCi0JYm9vbAotCWRlcGVuZHMgb24gRkJfVkVTQQotCWRlZmF1bHQgeQorY29uZmlnIEZCX0lNQUMKKwlib29sICJJbnRlbC1iYXNlZCBNYWNpbnRvc2ggRnJhbWVidWZmZXIgU3VwcG9ydCIKKwlkZXBlbmRzIG9uIChGQiA9IHkpICYmIFg4NgorCXNlbGVjdCBGQl9DRkJfRklMTFJFQ1QKKwlzZWxlY3QgRkJfQ0ZCX0NPUFlBUkVBCisJc2VsZWN0IEZCX0NGQl9JTUFHRUJMSVQKKwloZWxwCisJICBUaGlzIGlzIHRoZSBmcmFtZSBidWZmZXIgZGV2aWNlIGRyaXZlciBmb3IgdGhlIEludGVsLWJhc2VkIE1hY2ludG9zaAogCiBjb25maWcgRkJfSEdBCiAJdHJpc3RhdGUgIkhlcmN1bGVzIG1vbm8gZ3JhcGhpY3Mgc3VwcG9ydCIKQEAgLTU3MywxMiArNTgxLDYgQEAKIAlUaGlzIHdpbGwgY29tcGlsZSB0aGUgSGVyY3VsZXMgbW9ubyBncmFwaGljcyB3aXRoCiAJYWNjZWxlcmF0aW9uIGZ1bmN0aW9ucy4KIAotCi1jb25maWcgVklERU9fU0VMRUNUCi0JYm9vbAotCWRlcGVuZHMgb24gKEZCID0geSkgJiYgWDg2Ci0JZGVmYXVsdCB5Ci0KIGNvbmZpZyBGQl9TR0lWVwogCXRyaXN0YXRlICJTR0kgVmlzdWFsIFdvcmtzdGF0aW9uIGZyYW1lYnVmZmVyIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBGQiAmJiBYODZfVklTV1MKQEAgLTcxNyw2ICs3MTksMTYgQEAKIAkgIGluZGVwZW5kZW50bHkgdmFsaWRhdGUgdmlkZW8gbW9kZSBwYXJhbWV0ZXJzLCB5b3Ugc2hvdWxkIHNheSBZCiAJICBoZXJlLgogCitjb25maWcgRkJfTlZJRElBX0JBQ0tMSUdIVAorCWJvb2wgIlN1cHBvcnQgZm9yIGJhY2tsaWdodCBjb250cm9sIgorCWRlcGVuZHMgb24gRkJfTlZJRElBICYmIFBQQ19QTUFDCisJc2VsZWN0IEZCX0JBQ0tMSUdIVAorCXNlbGVjdCBCQUNLTElHSFRfTENEX1NVUFBPUlQKKwlzZWxlY3QgQkFDS0xJR0hUX0NMQVNTX0RFVklDRQorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gY29udHJvbCB0aGUgYmFja2xpZ2h0IG9mIHlvdXIgZGlzcGxheS4KKwogY29uZmlnIEZCX1JJVkEKIAl0cmlzdGF0ZSAiblZpZGlhIFJpdmEgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIEZCICYmIFBDSQpAQCAtNzU1LDYgKzc2NywxNiBAQAogCSAgb2YgZGVidWdnaW5nIGluZm9ybWF0aW9ucyB0byBwcm92aWRlIHRvIHRoZSBtYWludGFpbmVyIHdoZW4KIAkgIHNvbWV0aGluZyBnb2VzIHdyb25nLgogCitjb25maWcgRkJfUklWQV9CQUNLTElHSFQKKwlib29sICJTdXBwb3J0IGZvciBiYWNrbGlnaHQgY29udHJvbCIKKwlkZXBlbmRzIG9uIEZCX1JJVkEgJiYgUFBDX1BNQUMKKwlzZWxlY3QgRkJfQkFDS0xJR0hUCisJc2VsZWN0IEJBQ0tMSUdIVF9MQ0RfU1VQUE9SVAorCXNlbGVjdCBCQUNLTElHSFRfQ0xBU1NfREVWSUNFCisJZGVmYXVsdCB5CisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBjb250cm9sIHRoZSBiYWNrbGlnaHQgb2YgeW91ciBkaXNwbGF5LgorCiBjb25maWcgRkJfSTgxMAogCXRyaXN0YXRlICJJbnRlbCA4MTAvODE1IHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCiAJZGVwZW5kcyBvbiBGQiAmJiBFWFBFUklNRU5UQUwgJiYgUENJICYmIFg4Nl8zMgpAQCAtOTkzLDYgKzEwMTUsNyBAQAogCiAJICBUaGVyZSBpcyBhIHByb2R1Y3QgcGFnZSBhdAogCSAgaHR0cDovL2FwcHMuYXRpLmNvbS9BVEljb21wYXJlLworCiBjb25maWcgRkJfUkFERU9OX0kyQwogCWJvb2wgIkREQy9JMkMgZm9yIEFUSSBSYWRlb24gc3VwcG9ydCIKIAlkZXBlbmRzIG9uIEZCX1JBREVPTgpAQCAtMTAwMCw2ICsxMDIzLDE2IEBACiAJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCBEREMvSTJDIHN1cHBvcnQgZm9yIHlvdXIgUmFkZW9uIGJvYXJkLiAKIAorY29uZmlnIEZCX1JBREVPTl9CQUNLTElHSFQKKwlib29sICJTdXBwb3J0IGZvciBiYWNrbGlnaHQgY29udHJvbCIKKwlkZXBlbmRzIG9uIEZCX1JBREVPTiAmJiBQUENfUE1BQworCXNlbGVjdCBGQl9CQUNLTElHSFQKKwlzZWxlY3QgQkFDS0xJR0hUX0xDRF9TVVBQT1JUCisJc2VsZWN0IEJBQ0tMSUdIVF9DTEFTU19ERVZJQ0UKKwlkZWZhdWx0IHkKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGNvbnRyb2wgdGhlIGJhY2tsaWdodCBvZiB5b3VyIGRpc3BsYXkuCisKIGNvbmZpZyBGQl9SQURFT05fREVCVUcKIAlib29sICJMb3RzIG9mIGRlYnVnIG91dHB1dCBmcm9tIFJhZGVvbiBkcml2ZXIiCiAJZGVwZW5kcyBvbiBGQl9SQURFT04KQEAgLTEwMjQsNiArMTA1NywxNiBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgYXR5MTI4ZmIuCiAKK2NvbmZpZyBGQl9BVFkxMjhfQkFDS0xJR0hUCisJYm9vbCAiU3VwcG9ydCBmb3IgYmFja2xpZ2h0IGNvbnRyb2wiCisJZGVwZW5kcyBvbiBGQl9BVFkxMjggJiYgUFBDX1BNQUMKKwlzZWxlY3QgRkJfQkFDS0xJR0hUCisJc2VsZWN0IEJBQ0tMSUdIVF9MQ0RfU1VQUE9SVAorCXNlbGVjdCBCQUNLTElHSFRfQ0xBU1NfREVWSUNFCisJZGVmYXVsdCB5CisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBjb250cm9sIHRoZSBiYWNrbGlnaHQgb2YgeW91ciBkaXNwbGF5LgorCiBjb25maWcgRkJfQVRZCiAJdHJpc3RhdGUgIkFUSSBNYWNoNjQgZGlzcGxheSBzdXBwb3J0IiBpZiBQQ0kgfHwgQVRBUkkKIAlkZXBlbmRzIG9uIEZCICYmICFTUEFSQzMyCkBAIC0xMDY2LDYgKzExMDksMTYgQEAKIAkgIGlzIGF0CiAJICA8aHR0cDovL3N1cHBvcnQuYXRpLmNvbS9wcm9kdWN0cy9wYy9tYWNoNjQvZ3JhcGhpY3NfeHByZXNzaW9uLmh0bWw+LgogCitjb25maWcgRkJfQVRZX0JBQ0tMSUdIVAorCWJvb2wgIlN1cHBvcnQgZm9yIGJhY2tsaWdodCBjb250cm9sIgorCWRlcGVuZHMgb24gRkJfQVRZICYmIFBQQ19QTUFDCisJc2VsZWN0IEZCX0JBQ0tMSUdIVAorCXNlbGVjdCBCQUNLTElHSFRfTENEX1NVUFBPUlQKKwlzZWxlY3QgQkFDS0xJR0hUX0NMQVNTX0RFVklDRQorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gY29udHJvbCB0aGUgYmFja2xpZ2h0IG9mIHlvdXIgZGlzcGxheS4KKwogY29uZmlnIEZCX1MzVFJJTwogCWJvb2wgIlMzIFRyaW8gZGlzcGxheSBzdXBwb3J0IgogCWRlcGVuZHMgb24gKEZCID0geSkgJiYgUFBDICYmIEJST0tFTgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9NYWtlZmlsZSBiL2RyaXZlcnMvdmlkZW8vTWFrZWZpbGUKaW5kZXggMjNkZTNiMi4uYzMzNWU5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3ZpZGVvL01ha2VmaWxlCkBAIC00LDE1ICs0LDE1IEBACiAKICMgRWFjaCBjb25maWd1cmF0aW9uIG9wdGlvbiBlbmFibGVzIGEgbGlzdCBvZiBmaWxlcy4KIAotb2JqLSQoQ09ORklHX1ZUKQkJICArPSBjb25zb2xlLwotb2JqLSQoQ09ORklHX0xPR08pCQkgICs9IGxvZ28vCi1vYmotJChDT05GSUdfU1lTRlMpCQkgICs9IGJhY2tsaWdodC8KLQogb2JqLSQoQ09ORklHX0ZCKSAgICAgICAgICAgICAgICAgICs9IGZiLm8KIGZiLXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6PSBmYm1lbS5vIGZibW9uLm8gZmJjbWFwLm8gZmJzeXNmcy5vIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlZGIubyBmYmN2dC5vCiBmYi1vYmpzICAgICAgICAgICAgICAgICAgICAgICAgICAgOj0gJChmYi15KQogCitvYmotJChDT05GSUdfVlQpCQkgICs9IGNvbnNvbGUvCitvYmotJChDT05GSUdfTE9HTykJCSAgKz0gbG9nby8KK29iai0kKENPTkZJR19TWVNGUykJCSAgKz0gYmFja2xpZ2h0LworCiBvYmotJChDT05GSUdfRkJfQ0ZCX0ZJTExSRUNUKSAgKz0gY2ZiZmlsbHJlY3Qubwogb2JqLSQoQ09ORklHX0ZCX0NGQl9DT1BZQVJFQSkgICs9IGNmYmNvcHlhcmVhLm8KIG9iai0kKENPTkZJR19GQl9DRkJfSU1BR0VCTElUKSArPSBjZmJpbWdibHQubwpAQCAtOTcsNiArOTcsNyBAQAogCiAjIFBsYXRmb3JtIG9yIGZhbGxiYWNrIGRyaXZlcnMgZ28gaGVyZQogb2JqLSQoQ09ORklHX0ZCX1ZFU0EpICAgICAgICAgICAgICs9IHZlc2FmYi5vCitvYmotJChDT05GSUdfRkJfSU1BQykgICAgICAgICAgICAgKz0gaW1hY2ZiLm8KIG9iai0kKENPTkZJR19GQl9WR0ExNikgICAgICAgICAgICArPSB2Z2ExNmZiLm8gdmdhc3RhdGUubwogb2JqLSQoQ09ORklHX0ZCX09GKSAgICAgICAgICAgICAgICs9IG9mZmIubwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2F0eS9NYWtlZmlsZSBiL2RyaXZlcnMvdmlkZW8vYXR5L01ha2VmaWxlCmluZGV4IDE4NTIxMzkuLmE2Y2MwZTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYXR5L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdmlkZW8vYXR5L01ha2VmaWxlCkBAIC0xMCw1ICsxMCw2IEBACiAKIHJhZGVvbmZiLXkJCQk6PSByYWRlb25fYmFzZS5vIHJhZGVvbl9wbS5vIHJhZGVvbl9tb25pdG9yLm8gcmFkZW9uX2FjY2VsLm8KIHJhZGVvbmZiLSQoQ09ORklHX0ZCX1JBREVPTl9JMkMpCSs9IHJhZGVvbl9pMmMubworcmFkZW9uZmItJChDT05GSUdfRkJfUkFERU9OX0JBQ0tMSUdIVCkJKz0gcmFkZW9uX2JhY2tsaWdodC5vCiByYWRlb25mYi1vYmpzCQkJOj0gJChyYWRlb25mYi15KQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2F0eS9hdHkxMjhmYi5jIGIvZHJpdmVycy92aWRlby9hdHkvYXR5MTI4ZmIuYwppbmRleCBmN2JiZmY0Li4xMWNmN2ZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2F0eS9hdHkxMjhmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vYXR5L2F0eTEyOGZiLmMKQEAgLTY0LDYgKzY0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CisjaW5jbHVkZSA8bGludXgvYmFja2xpZ2h0Lmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKICNpZmRlZiBDT05GSUdfUFBDX1BNQUMKQEAgLTk5LDcgKzEwMCw3IEBACiAKICNpZm5kZWYgQ09ORklHX1BQQ19QTUFDCiAvKiBkZWZhdWx0IG1vZGUgKi8KLXN0YXRpYyBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gZGVmYXVsdF92YXIgX19pbml0ZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gZGVmYXVsdF92YXIgX19kZXZpbml0ZGF0YSA9IHsKIAkvKiA2NDB4NDgwLCA2MCBIeiwgTm9uLUludGVybGFjZWQgKDI1LjE3NSBNSHogZG90Y2xvY2spICovCiAJNjQwLCA0ODAsIDY0MCwgNDgwLCAwLCAwLCA4LCAwLAogCXswLCA4LCAwfSwgezAsIDgsIDB9LCB7MCwgOCwgMH0sIHswLCAwLCAwfSwKQEAgLTEyMiw3ICsxMjMsNyBAQAogCiAvKiBkZWZhdWx0IG1vZGVkYiBtb2RlICovCiAvKiA2NDB4NDgwLCA2MCBIeiwgTm9uLUludGVybGFjZWQgKDI1LjE3MiBNSHogZG90Y2xvY2spICovCi1zdGF0aWMgc3RydWN0IGZiX3ZpZGVvbW9kZSBkZWZhdWx0bW9kZSBfX2luaXRkYXRhID0geworc3RhdGljIHN0cnVjdCBmYl92aWRlb21vZGUgZGVmYXVsdG1vZGUgX19kZXZpbml0ZGF0YSA9IHsKIAkucmVmcmVzaCA9CTYwLAogCS54cmVzID0JCTY0MCwKIAkueXJlcyA9CQk0ODAsCkBAIC0zMzQsNyArMzM1LDcgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYXR5MTI4X21lbWluZm8gZGRyX3NncmFtID0KIAl7IDQsIDQsIDMsIDMsIDIsIDMsIDEsIDE2LCAzMSwgMTYsICI2NC1iaXQgRERSIFNHUkFNIiB9OwogCi1zdGF0aWMgc3RydWN0IGZiX2ZpeF9zY3JlZW5pbmZvIGF0eTEyOGZiX2ZpeCBfX2luaXRkYXRhID0geworc3RhdGljIHN0cnVjdCBmYl9maXhfc2NyZWVuaW5mbyBhdHkxMjhmYl9maXggX19kZXZpbml0ZGF0YSA9IHsKIAkuaWQJCT0gIkFUWSBSYWdlMTI4IiwKIAkudHlwZQkJPSBGQl9UWVBFX1BBQ0tFRF9QSVhFTFMsCiAJLnZpc3VhbAkJPSBGQl9WSVNVQUxfUFNFVURPQ09MT1IsCkBAIC0zNDQsMTUgKzM0NSwxNSBAQAogCS5hY2NlbAkJPSBGQl9BQ0NFTF9BVElfUkFHRTEyOCwKIH07CiAKLXN0YXRpYyBjaGFyICptb2RlX29wdGlvbiBfX2luaXRkYXRhID0gTlVMTDsKK3N0YXRpYyBjaGFyICptb2RlX29wdGlvbiBfX2RldmluaXRkYXRhID0gTlVMTDsKIAogI2lmZGVmIENPTkZJR19QUENfUE1BQwotc3RhdGljIGludCBkZWZhdWx0X3Ztb2RlIF9faW5pdGRhdGEgPSBWTU9ERV8xMDI0Xzc2OF82MDsKLXN0YXRpYyBpbnQgZGVmYXVsdF9jbW9kZSBfX2luaXRkYXRhID0gQ01PREVfODsKK3N0YXRpYyBpbnQgZGVmYXVsdF92bW9kZSBfX2RldmluaXRkYXRhID0gVk1PREVfMTAyNF83NjhfNjA7CitzdGF0aWMgaW50IGRlZmF1bHRfY21vZGUgX19kZXZpbml0ZGF0YSA9IENNT0RFXzg7CiAjZW5kaWYKIAotc3RhdGljIGludCBkZWZhdWx0X2NydF9vbiBfX2luaXRkYXRhID0gMDsKLXN0YXRpYyBpbnQgZGVmYXVsdF9sY2Rfb24gX19pbml0ZGF0YSA9IDE7CitzdGF0aWMgaW50IGRlZmF1bHRfY3J0X29uIF9fZGV2aW5pdGRhdGEgPSAwOworc3RhdGljIGludCBkZWZhdWx0X2xjZF9vbiBfX2RldmluaXRkYXRhID0gMTsKIAogI2lmZGVmIENPTkZJR19NVFJSCiBzdGF0aWMgaW50IG10cnIgPSAxOwpAQCAtNDQ0LDkgKzQ0NSw5IEBACiBzdGF0aWMgaW50IGF0eTEyOF9kZWNvZGVfdmFyKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXR5MTI4ZmJfcGFyICpwYXIpOwogI2lmIDAKLXN0YXRpYyB2b2lkIF9faW5pdCBhdHkxMjhfZ2V0X3BsbGluZm8oc3RydWN0IGF0eTEyOGZiX3BhciAqcGFyLAorc3RhdGljIHZvaWQgX19kZXZpbml0IGF0eTEyOF9nZXRfcGxsaW5mbyhzdHJ1Y3QgYXR5MTI4ZmJfcGFyICpwYXIsCiAJCQkJICAgICAgdm9pZCBfX2lvbWVtICpiaW9zKTsKLXN0YXRpYyB2b2lkIF9faW5pdCBfX2lvbWVtICphdHkxMjhfbWFwX1JPTShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IGF0eTEyOGZiX3BhciAqcGFyKTsKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBfX2lvbWVtICphdHkxMjhfbWFwX1JPTShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IGF0eTEyOGZiX3BhciAqcGFyKTsKICNlbmRpZgogc3RhdGljIHZvaWQgYXR5MTI4X3RpbWluZ3Moc3RydWN0IGF0eTEyOGZiX3BhciAqcGFyKTsKIHN0YXRpYyB2b2lkIGF0eTEyOF9pbml0X2VuZ2luZShzdHJ1Y3QgYXR5MTI4ZmJfcGFyICpwYXIpOwpAQCAtNDgwLDE2ICs0ODEsNiBAQAogCS5mYl9pbWFnZWJsaXQJPSBjZmJfaW1hZ2VibGl0LAogfTsKIAotI2lmZGVmIENPTkZJR19QTUFDX0JBQ0tMSUdIVAotc3RhdGljIGludCBhdHkxMjhfc2V0X2JhY2tsaWdodF9lbmFibGUoaW50IG9uLCBpbnQgbGV2ZWwsIHZvaWQqIGRhdGEpOwotc3RhdGljIGludCBhdHkxMjhfc2V0X2JhY2tsaWdodF9sZXZlbChpbnQgbGV2ZWwsIHZvaWQqIGRhdGEpOwotCi1zdGF0aWMgc3RydWN0IGJhY2tsaWdodF9jb250cm9sbGVyIGF0eTEyOF9iYWNrbGlnaHRfY29udHJvbGxlciA9IHsKLQlhdHkxMjhfc2V0X2JhY2tsaWdodF9lbmFibGUsCi0JYXR5MTI4X3NldF9iYWNrbGlnaHRfbGV2ZWwKLX07Ci0jZW5kaWYgLyogQ09ORklHX1BNQUNfQkFDS0xJR0hUICovCi0KICAgICAvKgogICAgICAqIEZ1bmN0aW9ucyB0byByZWFkIGZyb20vd3JpdGUgdG8gdGhlIG1taW8gcmVnaXN0ZXJzCiAgICAgICoJLSBlbmRpYW4gY29udmVyc2lvbnMgbWF5IHBvc3NpYmx5IGJlIGF2b2lkZWQgYnkKQEAgLTU4Miw3ICs1NzMsNyBAQAogCiAKIC8qIHdyaXRlIHRvIHRoZSBzY3JhdGNoIHJlZ2lzdGVyIHRvIHRlc3Qgci93IGZ1bmN0aW9uYWxpdHkgKi8KLXN0YXRpYyBpbnQgX19pbml0IHJlZ2lzdGVyX3Rlc3QoY29uc3Qgc3RydWN0IGF0eTEyOGZiX3BhciAqcGFyKQorc3RhdGljIGludCBfX2RldmluaXQgcmVnaXN0ZXJfdGVzdChjb25zdCBzdHJ1Y3QgYXR5MTI4ZmJfcGFyICpwYXIpCiB7CiAJdTMyIHZhbDsKIAlpbnQgZmxhZyA9IDA7CkBAIC03ODEsNyArNzcyLDcgQEAKIAogCiAjaWZuZGVmIF9fc3BhcmNfXwotc3RhdGljIHZvaWQgX19pb21lbSAqIF9faW5pdCBhdHkxMjhfbWFwX1JPTShjb25zdCBzdHJ1Y3QgYXR5MTI4ZmJfcGFyICpwYXIsIHN0cnVjdCBwY2lfZGV2ICpkZXYpCitzdGF0aWMgdm9pZCBfX2lvbWVtICogX19kZXZpbml0IGF0eTEyOF9tYXBfUk9NKGNvbnN0IHN0cnVjdCBhdHkxMjhmYl9wYXIgKnBhciwgc3RydWN0IHBjaV9kZXYgKmRldikKIHsKIAl1MTYgZHB0cjsKIAl1OCByb21fdHlwZTsKQEAgLTg2NSw3ICs4NTYsNyBAQAogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgYXR5MTI4X2dldF9wbGxpbmZvKHN0cnVjdCBhdHkxMjhmYl9wYXIgKnBhciwgdW5zaWduZWQgY2hhciBfX2lvbWVtICpiaW9zKQorc3RhdGljIHZvaWQgX19kZXZpbml0IGF0eTEyOF9nZXRfcGxsaW5mbyhzdHJ1Y3QgYXR5MTI4ZmJfcGFyICpwYXIsIHVuc2lnbmVkIGNoYXIgX19pb21lbSAqYmlvcykKIHsKIAl1bnNpZ25lZCBpbnQgYmlvc19oZHI7CiAJdW5zaWduZWQgaW50IGJpb3NfcGxsOwpAQCAtOTEyLDcgKzkwMyw3IEBACiAjZW5kaWYgLyogbmRlZihfX3NwYXJjX18pICovCiAKIC8qIGZpbGwgaW4ga25vd24gY2FyZCBjb25zdGFudHMgaWYgcGxsX2Jsb2NrIGlzIG5vdCBhdmFpbGFibGUgKi8KLXN0YXRpYyB2b2lkIF9faW5pdCBhdHkxMjhfdGltaW5ncyhzdHJ1Y3QgYXR5MTI4ZmJfcGFyICpwYXIpCitzdGF0aWMgdm9pZCBfX2RldmluaXQgYXR5MTI4X3RpbWluZ3Moc3RydWN0IGF0eTEyOGZiX3BhciAqcGFyKQogewogI2lmZGVmIENPTkZJR19QUENfT0YKIAkvKiBpbnN0ZWFkIG9mIGEgdGFibGUgbG9va3VwLCBhc3N1bWUgT0YgaGFzIHByb3Blcmx5CkBAIC0xMjU4LDE5ICsxMjQ5LDM1IEBACiBzdGF0aWMgdm9pZCBhdHkxMjhfc2V0X2xjZF9lbmFibGUoc3RydWN0IGF0eTEyOGZiX3BhciAqcGFyLCBpbnQgb24pCiB7CiAJdTMyIHJlZzsKKyNpZmRlZiBDT05GSUdfRkJfQVRZMTI4X0JBQ0tMSUdIVAorCXN0cnVjdCBmYl9pbmZvICppbmZvID0gcGNpX2dldF9kcnZkYXRhKHBhci0+cGRldik7CisjZW5kaWYKIAogCWlmIChvbikgewogCQlyZWcgPSBhdHlfbGRfbGUzMihMVkRTX0dFTl9DTlRMKTsKIAkJcmVnIHw9IExWRFNfT04gfCBMVkRTX0VOIHwgTFZEU19CTE9OIHwgTFZEU19ESUdJT047CiAJCXJlZyAmPSB+TFZEU19ESVNQTEFZX0RJUzsKIAkJYXR5X3N0X2xlMzIoTFZEU19HRU5fQ05UTCwgcmVnKTsKLSNpZmRlZiBDT05GSUdfUE1BQ19CQUNLTElHSFQKLQkJYXR5MTI4X3NldF9iYWNrbGlnaHRfZW5hYmxlKGdldF9iYWNrbGlnaHRfZW5hYmxlKCksCi0JCQkJCSAgICBnZXRfYmFja2xpZ2h0X2xldmVsKCksIHBhcik7CisjaWZkZWYgQ09ORklHX0ZCX0FUWTEyOF9CQUNLTElHSFQKKwkJbXV0ZXhfbG9jaygmaW5mby0+YmxfbXV0ZXgpOworCQlpZiAoaW5mby0+YmxfZGV2KSB7CisJCQlkb3duKCZpbmZvLT5ibF9kZXYtPnNlbSk7CisJCQlpbmZvLT5ibF9kZXYtPnByb3BzLT51cGRhdGVfc3RhdHVzKGluZm8tPmJsX2Rldik7CisJCQl1cCgmaW5mby0+YmxfZGV2LT5zZW0pOworCQl9CisJCW11dGV4X3VubG9jaygmaW5mby0+YmxfbXV0ZXgpOwogI2VuZGlmCQogCX0gZWxzZSB7Ci0jaWZkZWYgQ09ORklHX1BNQUNfQkFDS0xJR0hUCi0JCWF0eTEyOF9zZXRfYmFja2xpZ2h0X2VuYWJsZSgwLCAwLCBwYXIpOworI2lmZGVmIENPTkZJR19GQl9BVFkxMjhfQkFDS0xJR0hUCisJCW11dGV4X2xvY2soJmluZm8tPmJsX211dGV4KTsKKwkJaWYgKGluZm8tPmJsX2RldikgeworCQkJZG93bigmaW5mby0+YmxfZGV2LT5zZW0pOworCQkJaW5mby0+YmxfZGV2LT5wcm9wcy0+YnJpZ2h0bmVzcyA9IDA7CisJCQlpbmZvLT5ibF9kZXYtPnByb3BzLT5wb3dlciA9IEZCX0JMQU5LX1BPV0VSRE9XTjsKKwkJCWluZm8tPmJsX2Rldi0+cHJvcHMtPnVwZGF0ZV9zdGF0dXMoaW5mby0+YmxfZGV2KTsKKwkJCXVwKCZpbmZvLT5ibF9kZXYtPnNlbSk7CisJCX0KKwkJbXV0ZXhfdW5sb2NrKCZpbmZvLT5ibF9tdXRleCk7CiAjZW5kaWYJCiAJCXJlZyA9IGF0eV9sZF9sZTMyKExWRFNfR0VOX0NOVEwpOwogCQlyZWcgfD0gTFZEU19ESVNQTEFZX0RJUzsKQEAgLTE2MzgsNyArMTY0NSw3IEBACiB9CiAKICNpZm5kZWYgTU9EVUxFCi1zdGF0aWMgaW50IF9faW5pdCBhdHkxMjhmYl9zZXR1cChjaGFyICpvcHRpb25zKQorc3RhdGljIGludCBfX2RldmluaXQgYXR5MTI4ZmJfc2V0dXAoY2hhciAqb3B0aW9ucykKIHsKIAljaGFyICp0aGlzX29wdDsKIApAQCAtMTY5MSw2ICsxNjk4LDE4NCBAQAogfQogI2VuZGlmICAvKiAgTU9EVUxFICAqLwogCisvKiBCYWNrbGlnaHQgKi8KKyNpZmRlZiBDT05GSUdfRkJfQVRZMTI4X0JBQ0tMSUdIVAorI2RlZmluZSBNQVhfTEVWRUwgMHhGRgorCitzdGF0aWMgc3RydWN0IGJhY2tsaWdodF9wcm9wZXJ0aWVzIGF0eTEyOF9ibF9kYXRhOworCitzdGF0aWMgaW50IGF0eTEyOF9ibF9nZXRfbGV2ZWxfYnJpZ2h0bmVzcyhzdHJ1Y3QgYXR5MTI4ZmJfcGFyICpwYXIsCisJCWludCBsZXZlbCkKK3sKKwlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IHBjaV9nZXRfZHJ2ZGF0YShwYXItPnBkZXYpOworCWludCBhdHlsZXZlbDsKKworCS8qIEdldCBhbmQgY29udmVydCB0aGUgdmFsdWUgKi8KKwltdXRleF9sb2NrKCZpbmZvLT5ibF9tdXRleCk7CisJYXR5bGV2ZWwgPSBNQVhfTEVWRUwgLQorCQkoaW5mby0+YmxfY3VydmVbbGV2ZWxdICogRkJfQkFDS0xJR0hUX01BWCAvIE1BWF9MRVZFTCk7CisJbXV0ZXhfdW5sb2NrKCZpbmZvLT5ibF9tdXRleCk7CisKKwlpZiAoYXR5bGV2ZWwgPCAwKQorCQlhdHlsZXZlbCA9IDA7CisJZWxzZSBpZiAoYXR5bGV2ZWwgPiBNQVhfTEVWRUwpCisJCWF0eWxldmVsID0gTUFYX0xFVkVMOworCisJcmV0dXJuIGF0eWxldmVsOworfQorCisvKiBXZSB0dXJuIG9mZiB0aGUgTENEIGNvbXBsZXRlbHkgaW5zdGVhZCBvZiBqdXN0IGRpbW1pbmcgdGhlIGJhY2tsaWdodC4KKyAqIFRoaXMgcHJvdmlkZXMgZ3JlYXRlciBwb3dlciBzYXZpbmcgYW5kIHRoZSBkaXNwbGF5IGlzIHVzZWxlc3Mgd2l0aG91dAorICogYmFja2xpZ2h0IGFueXdheQorICovCisjZGVmaW5lIEJBQ0tMSUdIVF9MVkRTX09GRgorLyogVGhhdCBvbmUgcHJldmVudHMgcHJvcGVyIENSVCBvdXRwdXQgd2l0aCBMQ0Qgb2ZmICovCisjdW5kZWYgQkFDS0xJR0hUX0RBQ19PRkYKKworc3RhdGljIGludCBhdHkxMjhfYmxfdXBkYXRlX3N0YXR1cyhzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQpCit7CisJc3RydWN0IGF0eTEyOGZiX3BhciAqcGFyID0gY2xhc3NfZ2V0X2RldmRhdGEoJmJkLT5jbGFzc19kZXYpOworCXVuc2lnbmVkIGludCByZWcgPSBhdHlfbGRfbGUzMihMVkRTX0dFTl9DTlRMKTsKKwlpbnQgbGV2ZWw7CisKKwlpZiAoYmQtPnByb3BzLT5wb3dlciAhPSBGQl9CTEFOS19VTkJMQU5LIHx8CisJICAgIGJkLT5wcm9wcy0+ZmJfYmxhbmsgIT0gRkJfQkxBTktfVU5CTEFOSyB8fAorCSAgICAhcGFyLT5sY2Rfb24pCisJCWxldmVsID0gMDsKKwllbHNlCisJCWxldmVsID0gYmQtPnByb3BzLT5icmlnaHRuZXNzOworCisJcmVnIHw9IExWRFNfQkxfTU9EX0VOIHwgTFZEU19CTE9OOworCWlmIChsZXZlbCA+IDApIHsKKwkJcmVnIHw9IExWRFNfRElHSU9OOworCQlpZiAoIShyZWcgJiBMVkRTX09OKSkgeworCQkJcmVnICY9IH5MVkRTX0JMT047CisJCQlhdHlfc3RfbGUzMihMVkRTX0dFTl9DTlRMLCByZWcpOworCQkJYXR5X2xkX2xlMzIoTFZEU19HRU5fQ05UTCk7CisJCQltZGVsYXkoMTApOworCQkJcmVnIHw9IExWRFNfQkxPTjsKKwkJCWF0eV9zdF9sZTMyKExWRFNfR0VOX0NOVEwsIHJlZyk7CisJCX0KKwkJcmVnICY9IH5MVkRTX0JMX01PRF9MRVZFTF9NQVNLOworCQlyZWcgfD0gKGF0eTEyOF9ibF9nZXRfbGV2ZWxfYnJpZ2h0bmVzcyhwYXIsIGxldmVsKSA8PCBMVkRTX0JMX01PRF9MRVZFTF9TSElGVCk7CisjaWZkZWYgQkFDS0xJR0hUX0xWRFNfT0ZGCisJCXJlZyB8PSBMVkRTX09OIHwgTFZEU19FTjsKKwkJcmVnICY9IH5MVkRTX0RJU1BMQVlfRElTOworI2VuZGlmCisJCWF0eV9zdF9sZTMyKExWRFNfR0VOX0NOVEwsIHJlZyk7CisjaWZkZWYgQkFDS0xJR0hUX0RBQ19PRkYKKwkJYXR5X3N0X2xlMzIoREFDX0NOVEwsIGF0eV9sZF9sZTMyKERBQ19DTlRMKSAmICh+REFDX1BEV04pKTsKKyNlbmRpZgorCX0gZWxzZSB7CisJCXJlZyAmPSB+TFZEU19CTF9NT0RfTEVWRUxfTUFTSzsKKwkJcmVnIHw9IChhdHkxMjhfYmxfZ2V0X2xldmVsX2JyaWdodG5lc3MocGFyLCAwKSA8PCBMVkRTX0JMX01PRF9MRVZFTF9TSElGVCk7CisjaWZkZWYgQkFDS0xJR0hUX0xWRFNfT0ZGCisJCXJlZyB8PSBMVkRTX0RJU1BMQVlfRElTOworCQlhdHlfc3RfbGUzMihMVkRTX0dFTl9DTlRMLCByZWcpOworCQlhdHlfbGRfbGUzMihMVkRTX0dFTl9DTlRMKTsKKwkJdWRlbGF5KDEwKTsKKwkJcmVnICY9IH4oTFZEU19PTiB8IExWRFNfRU4gfCBMVkRTX0JMT04gfCBMVkRTX0RJR0lPTik7CisjZW5kaWYKKwkJYXR5X3N0X2xlMzIoTFZEU19HRU5fQ05UTCwgcmVnKTsKKyNpZmRlZiBCQUNLTElHSFRfREFDX09GRgorCQlhdHlfc3RfbGUzMihEQUNfQ05UTCwgYXR5X2xkX2xlMzIoREFDX0NOVEwpIHwgREFDX1BEV04pOworI2VuZGlmCisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXR5MTI4X2JsX2dldF9icmlnaHRuZXNzKHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZCkKK3sKKwlyZXR1cm4gYmQtPnByb3BzLT5icmlnaHRuZXNzOworfQorCitzdGF0aWMgc3RydWN0IGJhY2tsaWdodF9wcm9wZXJ0aWVzIGF0eTEyOF9ibF9kYXRhID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuZ2V0X2JyaWdodG5lc3MJPSBhdHkxMjhfYmxfZ2V0X2JyaWdodG5lc3MsCisJLnVwZGF0ZV9zdGF0dXMJPSBhdHkxMjhfYmxfdXBkYXRlX3N0YXR1cywKKwkubWF4X2JyaWdodG5lc3MJPSAoRkJfQkFDS0xJR0hUX0xFVkVMUyAtIDEpLAorfTsKKworc3RhdGljIHZvaWQgYXR5MTI4X2JsX2luaXQoc3RydWN0IGF0eTEyOGZiX3BhciAqcGFyKQoreworCXN0cnVjdCBmYl9pbmZvICppbmZvID0gcGNpX2dldF9kcnZkYXRhKHBhci0+cGRldik7CisJc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkOworCWNoYXIgbmFtZVsxMl07CisKKwkvKiBDb3VsZCBiZSBleHRlbmRlZCB0byBSYWdlMTI4UHJvIExWRFMgb3V0cHV0IHRvbyAqLworCWlmIChwYXItPmNoaXBfZ2VuICE9IHJhZ2VfTTMpCisJCXJldHVybjsKKworI2lmZGVmIENPTkZJR19QTUFDX0JBQ0tMSUdIVAorCWlmICghcG1hY19oYXNfYmFja2xpZ2h0X3R5cGUoImF0aSIpKQorCQlyZXR1cm47CisjZW5kaWYKKworCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgImF0eTEyOGJsJWQiLCBpbmZvLT5ub2RlKTsKKworCWJkID0gYmFja2xpZ2h0X2RldmljZV9yZWdpc3RlcihuYW1lLCBwYXIsICZhdHkxMjhfYmxfZGF0YSk7CisJaWYgKElTX0VSUihiZCkpIHsKKwkJaW5mby0+YmxfZGV2ID0gTlVMTDsKKwkJcHJpbnRrKCJhdHkxMjg6IEJhY2tsaWdodCByZWdpc3RyYXRpb24gZmFpbGVkXG4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwltdXRleF9sb2NrKCZpbmZvLT5ibF9tdXRleCk7CisJaW5mby0+YmxfZGV2ID0gYmQ7CisJZmJfYmxfZGVmYXVsdF9jdXJ2ZShpbmZvLCAwLAorCQkgNjMgKiBGQl9CQUNLTElHSFRfTUFYIC8gTUFYX0xFVkVMLAorCQkyMTkgKiBGQl9CQUNLTElHSFRfTUFYIC8gTUFYX0xFVkVMKTsKKwltdXRleF91bmxvY2soJmluZm8tPmJsX211dGV4KTsKKworCXVwKCZiZC0+c2VtKTsKKwliZC0+cHJvcHMtPmJyaWdodG5lc3MgPSBhdHkxMjhfYmxfZGF0YS5tYXhfYnJpZ2h0bmVzczsKKwliZC0+cHJvcHMtPnBvd2VyID0gRkJfQkxBTktfVU5CTEFOSzsKKwliZC0+cHJvcHMtPnVwZGF0ZV9zdGF0dXMoYmQpOworCWRvd24oJmJkLT5zZW0pOworCisjaWZkZWYgQ09ORklHX1BNQUNfQkFDS0xJR0hUCisJbXV0ZXhfbG9jaygmcG1hY19iYWNrbGlnaHRfbXV0ZXgpOworCWlmICghcG1hY19iYWNrbGlnaHQpCisJCXBtYWNfYmFja2xpZ2h0ID0gYmQ7CisJbXV0ZXhfdW5sb2NrKCZwbWFjX2JhY2tsaWdodF9tdXRleCk7CisjZW5kaWYKKworCXByaW50aygiYXR5MTI4OiBCYWNrbGlnaHQgaW5pdGlhbGl6ZWQgKCVzKVxuIiwgbmFtZSk7CisKKwlyZXR1cm47CisKK2Vycm9yOgorCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgYXR5MTI4X2JsX2V4aXQoc3RydWN0IGF0eTEyOGZiX3BhciAqcGFyKQoreworCXN0cnVjdCBmYl9pbmZvICppbmZvID0gcGNpX2dldF9kcnZkYXRhKHBhci0+cGRldik7CisKKyNpZmRlZiBDT05GSUdfUE1BQ19CQUNLTElHSFQKKwltdXRleF9sb2NrKCZwbWFjX2JhY2tsaWdodF9tdXRleCk7CisjZW5kaWYKKworCW11dGV4X2xvY2soJmluZm8tPmJsX211dGV4KTsKKwlpZiAoaW5mby0+YmxfZGV2KSB7CisjaWZkZWYgQ09ORklHX1BNQUNfQkFDS0xJR0hUCisJCWlmIChwbWFjX2JhY2tsaWdodCA9PSBpbmZvLT5ibF9kZXYpCisJCQlwbWFjX2JhY2tsaWdodCA9IE5VTEw7CisjZW5kaWYKKworCQliYWNrbGlnaHRfZGV2aWNlX3VucmVnaXN0ZXIoaW5mby0+YmxfZGV2KTsKKwkJaW5mby0+YmxfZGV2ID0gTlVMTDsKKworCQlwcmludGsoImF0eTEyODogQmFja2xpZ2h0IHVubG9hZGVkXG4iKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZpbmZvLT5ibF9tdXRleCk7CisKKyNpZmRlZiBDT05GSUdfUE1BQ19CQUNLTElHSFQKKwltdXRleF91bmxvY2soJnBtYWNfYmFja2xpZ2h0X211dGV4KTsKKyNlbmRpZgorfQorI2VuZGlmIC8qIENPTkZJR19GQl9BVFkxMjhfQkFDS0xJR0hUICovCiAKIC8qCiAgKiAgSW5pdGlhbGlzYXRpb24KQEAgLTE3MDgsNyArMTg5Myw3IEBACiB9CiAjZW5kaWYgLyogQ09ORklHX1BQQ19QTUFDICovCiAKLXN0YXRpYyBpbnQgX19pbml0IGF0eTEyOF9pbml0KHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQorc3RhdGljIGludCBfX2RldmluaXQgYXR5MTI4X2luaXQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCiB7CiAJc3RydWN0IGZiX2luZm8gKmluZm8gPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CiAJc3RydWN0IGF0eTEyOGZiX3BhciAqcGFyID0gaW5mby0+cGFyOwpAQCAtMTgzNSwxNyArMjAyMCwxNSBAQAogCWlmIChyZWdpc3Rlcl9mcmFtZWJ1ZmZlcihpbmZvKSA8IDApCiAJCXJldHVybiAwOwogCi0jaWZkZWYgQ09ORklHX1BNQUNfQkFDS0xJR0hUCi0JLyogQ291bGQgYmUgZXh0ZW5kZWQgdG8gUmFnZTEyOFBybyBMVkRTIG91dHB1dCB0b28gKi8KLQlpZiAocGFyLT5jaGlwX2dlbiA9PSByYWdlX00zKQotCQlyZWdpc3Rlcl9iYWNrbGlnaHRfY29udHJvbGxlcigmYXR5MTI4X2JhY2tsaWdodF9jb250cm9sbGVyLCBwYXIsICJhdGkiKTsKLSNlbmRpZiAvKiBDT05GSUdfUE1BQ19CQUNLTElHSFQgKi8KLQogCXBhci0+cG1fcmVnID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShwZGV2LCBQQ0lfQ0FQX0lEX1BNKTsKIAlwYXItPnBkZXYgPSBwZGV2OwogCXBhci0+YXNsZWVwID0gMDsKIAlwYXItPmxvY2tfYmxhbmsgPSAwOwotCQorCisjaWZkZWYgQ09ORklHX0ZCX0FUWTEyOF9CQUNLTElHSFQKKwlhdHkxMjhfYmxfaW5pdChwYXIpOworI2VuZGlmCisKIAlwcmludGsoS0VSTl9JTkZPICJmYiVkOiAlcyBmcmFtZSBidWZmZXIgZGV2aWNlIG9uICVzXG4iLAogCSAgICAgICBpbmZvLT5ub2RlLCBpbmZvLT5maXguaWQsIHZpZGVvX2NhcmQpOwogCkBAIC0xODU0LDcgKzIwMzcsNyBAQAogCiAjaWZkZWYgQ09ORklHX1BDSQogLyogcmVnaXN0ZXIgYSBjYXJkICAgICsrYWpvc2hpICovCi1zdGF0aWMgaW50IF9faW5pdCBhdHkxMjhfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhdHkxMjhfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCiB7CiAJdW5zaWduZWQgbG9uZyBmYl9hZGRyLCByZWdfYWRkcjsKIAlzdHJ1Y3QgYXR5MTI4ZmJfcGFyICpwYXI7CkBAIC0xOTgxLDYgKzIxNjQsMTAgQEAKIAogCXBhciA9IGluZm8tPnBhcjsKIAorI2lmZGVmIENPTkZJR19GQl9BVFkxMjhfQkFDS0xJR0hUCisJYXR5MTI4X2JsX2V4aXQocGFyKTsKKyNlbmRpZgorCiAJdW5yZWdpc3Rlcl9mcmFtZWJ1ZmZlcihpbmZvKTsKICNpZmRlZiBDT05GSUdfTVRSUgogCWlmIChwYXItPm10cnIudnJhbV92YWxpZCkKQEAgLTIwMTEsMTAgKzIxOTgsMTQgQEAKIAlpZiAocGFyLT5sb2NrX2JsYW5rIHx8IHBhci0+YXNsZWVwKQogCQlyZXR1cm4gMDsKIAotI2lmZGVmIENPTkZJR19QTUFDX0JBQ0tMSUdIVAotCWlmIChtYWNoaW5lX2lzKHBvd2VybWFjKSAmJiBibGFuaykKLQkJc2V0X2JhY2tsaWdodF9lbmFibGUoMCk7Ci0jZW5kaWYgLyogQ09ORklHX1BNQUNfQkFDS0xJR0hUICovCisjaWZkZWYgQ09ORklHX0ZCX0FUWTEyOF9CQUNLTElHSFQKKwlpZiAobWFjaGluZV9pcyhwb3dlcm1hYykgJiYgYmxhbmspIHsKKwkJZG93bigmZmItPmJsX2Rldi0+c2VtKTsKKwkJZmItPmJsX2Rldi0+cHJvcHMtPnBvd2VyID0gRkJfQkxBTktfUE9XRVJET1dOOworCQlmYi0+YmxfZGV2LT5wcm9wcy0+dXBkYXRlX3N0YXR1cyhmYi0+YmxfZGV2KTsKKwkJdXAoJmZiLT5ibF9kZXYtPnNlbSk7CisJfQorI2VuZGlmCiAKIAlpZiAoYmxhbmsgJiBGQl9CTEFOS19WU1lOQ19TVVNQRU5EKQogCQlzdGF0ZSB8PSAyOwpAQCAtMjAyOSwxMCArMjIyMCwxNCBAQAogCQlhdHkxMjhfc2V0X2NydF9lbmFibGUocGFyLCBwYXItPmNydF9vbiAmJiAhYmxhbmspOwogCQlhdHkxMjhfc2V0X2xjZF9lbmFibGUocGFyLCBwYXItPmxjZF9vbiAmJiAhYmxhbmspOwogCX0KLSNpZmRlZiBDT05GSUdfUE1BQ19CQUNLTElHSFQKLQlpZiAobWFjaGluZV9pcyhwb3dlcm1hYykgJiYgIWJsYW5rKQotCQlzZXRfYmFja2xpZ2h0X2VuYWJsZSgxKTsKLSNlbmRpZiAvKiBDT05GSUdfUE1BQ19CQUNLTElHSFQgKi8KKyNpZmRlZiBDT05GSUdfRkJfQVRZMTI4X0JBQ0tMSUdIVAorCWlmIChtYWNoaW5lX2lzKHBvd2VybWFjKSAmJiAhYmxhbmspIHsKKwkJZG93bigmZmItPmJsX2Rldi0+c2VtKTsKKwkJZmItPmJsX2Rldi0+cHJvcHMtPnBvd2VyID0gRkJfQkxBTktfVU5CTEFOSzsKKwkJZmItPmJsX2Rldi0+cHJvcHMtPnVwZGF0ZV9zdGF0dXMoZmItPmJsX2Rldik7CisJCXVwKCZmYi0+YmxfZGV2LT5zZW0pOworCX0KKyNlbmRpZgogCXJldHVybiAwOwogfQogCkBAIC0yMTM4LDczICsyMzMzLDYgQEAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAotI2lmZGVmIENPTkZJR19QTUFDX0JBQ0tMSUdIVAotc3RhdGljIGludCBiYWNrbGlnaHRfY29udltdID0gewotCTB4ZmYsIDB4YzAsIDB4YjUsIDB4YWEsIDB4OWYsIDB4OTQsIDB4ODksIDB4N2UsCi0JMHg3MywgMHg2OCwgMHg1ZCwgMHg1MiwgMHg0NywgMHgzYywgMHgzMSwgMHgyNAotfTsKLQotLyogV2UgdHVybiBvZmYgdGhlIExDRCBjb21wbGV0ZWx5IGluc3RlYWQgb2YganVzdCBkaW1taW5nIHRoZSBiYWNrbGlnaHQuCi0gKiBUaGlzIHByb3ZpZGVzIGdyZWF0ZXIgcG93ZXIgc2F2aW5nIGFuZCB0aGUgZGlzcGxheSBpcyB1c2VsZXNzIHdpdGhvdXQKLSAqIGJhY2tsaWdodCBhbnl3YXkKLSAqLwotI2RlZmluZSBCQUNLTElHSFRfTFZEU19PRkYKLS8qIFRoYXQgb25lIHByZXZlbnRzIHByb3BlciBDUlQgb3V0cHV0IHdpdGggTENEIG9mZiAqLwotI3VuZGVmIEJBQ0tMSUdIVF9EQUNfT0ZGCi0KLXN0YXRpYyBpbnQgYXR5MTI4X3NldF9iYWNrbGlnaHRfZW5hYmxlKGludCBvbiwgaW50IGxldmVsLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBhdHkxMjhmYl9wYXIgKnBhciA9IGRhdGE7Ci0JdW5zaWduZWQgaW50IHJlZyA9IGF0eV9sZF9sZTMyKExWRFNfR0VOX0NOVEwpOwotCi0JaWYgKCFwYXItPmxjZF9vbikKLQkJb24gPSAwOwotCXJlZyB8PSBMVkRTX0JMX01PRF9FTiB8IExWRFNfQkxPTjsKLQlpZiAob24gJiYgbGV2ZWwgPiBCQUNLTElHSFRfT0ZGKSB7Ci0JCXJlZyB8PSBMVkRTX0RJR0lPTjsKLQkJaWYgKCEocmVnICYgTFZEU19PTikpIHsKLQkJCXJlZyAmPSB+TFZEU19CTE9OOwotCQkJYXR5X3N0X2xlMzIoTFZEU19HRU5fQ05UTCwgcmVnKTsKLQkJCSh2b2lkKWF0eV9sZF9sZTMyKExWRFNfR0VOX0NOVEwpOwotCQkJbWRlbGF5KDEwKTsKLQkJCXJlZyB8PSBMVkRTX0JMT047Ci0JCQlhdHlfc3RfbGUzMihMVkRTX0dFTl9DTlRMLCByZWcpOwotCQl9Ci0JCXJlZyAmPSB+TFZEU19CTF9NT0RfTEVWRUxfTUFTSzsKLQkJcmVnIHw9IChiYWNrbGlnaHRfY29udltsZXZlbF0gPDwgTFZEU19CTF9NT0RfTEVWRUxfU0hJRlQpOwotI2lmZGVmIEJBQ0tMSUdIVF9MVkRTX09GRgotCQlyZWcgfD0gTFZEU19PTiB8IExWRFNfRU47Ci0JCXJlZyAmPSB+TFZEU19ESVNQTEFZX0RJUzsKLSNlbmRpZgotCQlhdHlfc3RfbGUzMihMVkRTX0dFTl9DTlRMLCByZWcpOwotI2lmZGVmIEJBQ0tMSUdIVF9EQUNfT0ZGCi0JCWF0eV9zdF9sZTMyKERBQ19DTlRMLCBhdHlfbGRfbGUzMihEQUNfQ05UTCkgJiAofkRBQ19QRFdOKSk7Ci0jZW5kaWYJCQotCX0gZWxzZSB7Ci0JCXJlZyAmPSB+TFZEU19CTF9NT0RfTEVWRUxfTUFTSzsKLQkJcmVnIHw9IChiYWNrbGlnaHRfY29udlswXSA8PCBMVkRTX0JMX01PRF9MRVZFTF9TSElGVCk7Ci0jaWZkZWYgQkFDS0xJR0hUX0xWRFNfT0ZGCi0JCXJlZyB8PSBMVkRTX0RJU1BMQVlfRElTOwotCQlhdHlfc3RfbGUzMihMVkRTX0dFTl9DTlRMLCByZWcpOwotCQkodm9pZClhdHlfbGRfbGUzMihMVkRTX0dFTl9DTlRMKTsKLQkJdWRlbGF5KDEwKTsKLQkJcmVnICY9IH4oTFZEU19PTiB8IExWRFNfRU4gfCBMVkRTX0JMT04gfCBMVkRTX0RJR0lPTik7Ci0jZW5kaWYJCQotCQlhdHlfc3RfbGUzMihMVkRTX0dFTl9DTlRMLCByZWcpOwotI2lmZGVmIEJBQ0tMSUdIVF9EQUNfT0ZGCi0JCWF0eV9zdF9sZTMyKERBQ19DTlRMLCBhdHlfbGRfbGUzMihEQUNfQ05UTCkgfCBEQUNfUERXTik7Ci0jZW5kaWYJCQotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGF0eTEyOF9zZXRfYmFja2xpZ2h0X2xldmVsKGludCBsZXZlbCwgdm9pZCogZGF0YSkKLXsKLQlyZXR1cm4gYXR5MTI4X3NldF9iYWNrbGlnaHRfZW5hYmxlKDEsIGxldmVsLCBkYXRhKTsKLX0KLSNlbmRpZiAvKiBDT05GSUdfUE1BQ19CQUNLTElHSFQgKi8KLQogI2lmIDAKICAgICAvKgogICAgICAqICBBY2NlbGVyYXRlZCBmdW5jdGlvbnMKQEAgLTI0MjgsNyArMjU1Niw3IEBACiB9CiAKIAotc3RhdGljIGludCBfX2luaXQgYXR5MTI4ZmJfaW5pdCh2b2lkKQorc3RhdGljIGludCBfX2RldmluaXQgYXR5MTI4ZmJfaW5pdCh2b2lkKQogewogI2lmbmRlZiBNT0RVTEUKIAljaGFyICpvcHRpb24gPSBOVUxMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9hdHkvYXR5ZmIuaCBiL2RyaXZlcnMvdmlkZW8vYXR5L2F0eWZiLmgKaW5kZXggZTliN2E2NC4uNDNkMmNiNSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9hdHkvYXR5ZmIuaAorKysgYi9kcml2ZXJzL3ZpZGVvL2F0eS9hdHlmYi5oCkBAIC0xNTEsNiArMTUxLDcgQEAKIAlpbnQgbG9ja19ibGFuazsKIAl1bnNpZ25lZCBsb25nIHJlc19zdGFydDsKIAl1bnNpZ25lZCBsb25nIHJlc19zaXplOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OwogI2lmZGVmIF9fc3BhcmNfXwogCXN0cnVjdCBwY2lfbW1hcF9tYXAgKm1tYXBfbWFwOwogCXU4IG1tYXBlZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYXR5L2F0eWZiX2Jhc2UuYyBiL2RyaXZlcnMvdmlkZW8vYXR5L2F0eWZiX2Jhc2UuYwppbmRleCBjMDU0YmIyLi4yMmU3MjA2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2F0eS9hdHlmYl9iYXNlLmMKKysrIGIvZHJpdmVycy92aWRlby9hdHkvYXR5ZmJfYmFzZS5jCkBAIC02Niw2ICs2Niw3IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvYmFja2xpZ2h0Lmg+CiAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgpAQCAtMzE1LDEyICszMTYsMTIgQEAKIHN0YXRpYyBpbnQgcGxsOwogc3RhdGljIGludCBtY2xrOwogc3RhdGljIGludCB4Y2xrOwotc3RhdGljIGludCBjb21wX3N5bmMgX19pbml0ZGF0YSA9IC0xOworc3RhdGljIGludCBjb21wX3N5bmMgX19kZXZpbml0ZGF0YSA9IC0xOwogc3RhdGljIGNoYXIgKm1vZGU7CiAKICNpZmRlZiBDT05GSUdfUFBDCi1zdGF0aWMgaW50IGRlZmF1bHRfdm1vZGUgX19pbml0ZGF0YSA9IFZNT0RFX0NIT09TRTsKLXN0YXRpYyBpbnQgZGVmYXVsdF9jbW9kZSBfX2luaXRkYXRhID0gQ01PREVfQ0hPT1NFOworc3RhdGljIGludCBkZWZhdWx0X3Ztb2RlIF9fZGV2aW5pdGRhdGEgPSBWTU9ERV9DSE9PU0U7CitzdGF0aWMgaW50IGRlZmF1bHRfY21vZGUgX19kZXZpbml0ZGF0YSA9IENNT0RFX0NIT09TRTsKIAogbW9kdWxlX3BhcmFtX25hbWVkKHZtb2RlLCBkZWZhdWx0X3Ztb2RlLCBpbnQsIDApOwogTU9EVUxFX1BBUk1fREVTQyh2bW9kZSwgImludDogdmlkZW8gbW9kZSBmb3IgbWFjIik7CkBAIC0zMjksMTAgKzMzMCwxMCBAQAogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfQVRBUkkKLXN0YXRpYyB1bnNpZ25lZCBpbnQgbWFjaDY0X2NvdW50IF9faW5pdGRhdGEgPSAwOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgcGh5c192bWVtYmFzZVtGQl9NQVhdIF9faW5pdGRhdGEgPSB7IDAsIH07Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBwaHlzX3NpemVbRkJfTUFYXSBfX2luaXRkYXRhID0geyAwLCB9Owotc3RhdGljIHVuc2lnbmVkIGxvbmcgcGh5c19ndWlyZWdiYXNlW0ZCX01BWF0gX19pbml0ZGF0YSA9IHsgMCwgfTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbWFjaDY0X2NvdW50IF9fZGV2aW5pdGRhdGEgPSAwOworc3RhdGljIHVuc2lnbmVkIGxvbmcgcGh5c192bWVtYmFzZVtGQl9NQVhdIF9fZGV2aW5pdGRhdGEgPSB7IDAsIH07CitzdGF0aWMgdW5zaWduZWQgbG9uZyBwaHlzX3NpemVbRkJfTUFYXSBfX2RldmluaXRkYXRhID0geyAwLCB9Oworc3RhdGljIHVuc2lnbmVkIGxvbmcgcGh5c19ndWlyZWdiYXNlW0ZCX01BWF0gX19kZXZpbml0ZGF0YSA9IHsgMCwgfTsKICNlbmRpZgogCiAvKiB0b3AgLT4gZG93biBpcyBhbiBldm9sdXRpb24gb2YgbWFjaDY0IGNoaXBzZXQsIGFueSBjb3JyZWN0aW9ucz8gKi8KQEAgLTU4Miw3ICs1ODMsNyBAQAogICogIEFwcGxlIG1vbml0b3Igc2Vuc2UKICAqLwogCi1zdGF0aWMgaW50IF9faW5pdCByZWFkX2F0eV9zZW5zZShjb25zdCBzdHJ1Y3QgYXR5ZmJfcGFyICpwYXIpCitzdGF0aWMgaW50IF9fZGV2aW5pdCByZWFkX2F0eV9zZW5zZShjb25zdCBzdHJ1Y3QgYXR5ZmJfcGFyICpwYXIpCiB7CiAJaW50IHNlbnNlLCBpOwogCkBAIC0xMjgwLDYgKzEyODEsMTQgQEAKIAogCXBhci0+YWNjZWxfZmxhZ3MgPSB2YXItPmFjY2VsX2ZsYWdzOyAvKiBoYWNrICovCiAKKwlpZiAodmFyLT5hY2NlbF9mbGFncykgeworCQlpbmZvLT5mYm9wcy0+ZmJfc3luYyA9IGF0eWZiX3N5bmM7CisJCWluZm8tPmZsYWdzICY9IH5GQklORk9fSFdBQ0NFTF9ESVNBQkxFRDsKKwl9IGVsc2UgeworCQlpbmZvLT5mYm9wcy0+ZmJfc3luYyA9IE5VTEw7CisJCWluZm8tPmZsYWdzIHw9IEZCSU5GT19IV0FDQ0VMX0RJU0FCTEVEOworCX0KKwogCWlmIChwYXItPmJsaXR0ZXJfbWF5X2JlX2J1c3kpCiAJCXdhaXRfZm9yX2lkbGUocGFyKTsKIApAQCAtMjExNSw0NyArMjEyNCwxNDQgQEAKIAogI2VuZGlmIC8qICBkZWZpbmVkKENPTkZJR19QTSkgJiYgZGVmaW5lZChDT05GSUdfUENJKSAqLwogCi0jaWZkZWYgQ09ORklHX1BNQUNfQkFDS0xJR0hUCisvKiBCYWNrbGlnaHQgKi8KKyNpZmRlZiBDT05GSUdfRkJfQVRZX0JBQ0tMSUdIVAorI2RlZmluZSBNQVhfTEVWRUwgMHhGRgogCi0gICAgLyoKLSAgICAgKiAgIExDRCBiYWNrbGlnaHQgY29udHJvbAotICAgICAqLworc3RhdGljIHN0cnVjdCBiYWNrbGlnaHRfcHJvcGVydGllcyBhdHlfYmxfZGF0YTsKIAotc3RhdGljIGludCBiYWNrbGlnaHRfY29udltdID0gewotCTB4MDAsIDB4M2YsIDB4NGMsIDB4NTksIDB4NjYsIDB4NzMsIDB4ODAsIDB4OGQsCi0JMHg5YSwgMHhhNywgMHhiNCwgMHhjMSwgMHhjZiwgMHhkYywgMHhlOSwgMHhmZgotfTsKLQotc3RhdGljIGludCBhdHlfc2V0X2JhY2tsaWdodF9lbmFibGUoaW50IG9uLCBpbnQgbGV2ZWwsIHZvaWQgKmRhdGEpCitzdGF0aWMgaW50IGF0eV9ibF9nZXRfbGV2ZWxfYnJpZ2h0bmVzcyhzdHJ1Y3QgYXR5ZmJfcGFyICpwYXIsIGludCBsZXZlbCkKIHsKLQlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgZmJfaW5mbyAqKSBkYXRhOwotCXN0cnVjdCBhdHlmYl9wYXIgKnBhciA9IChzdHJ1Y3QgYXR5ZmJfcGFyICopIGluZm8tPnBhcjsKKwlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IHBjaV9nZXRfZHJ2ZGF0YShwYXItPnBkZXYpOworCWludCBhdHlsZXZlbDsKKworCS8qIEdldCBhbmQgY29udmVydCB0aGUgdmFsdWUgKi8KKwltdXRleF9sb2NrKCZpbmZvLT5ibF9tdXRleCk7CisJYXR5bGV2ZWwgPSBpbmZvLT5ibF9jdXJ2ZVtsZXZlbF0gKiBGQl9CQUNLTElHSFRfTUFYIC8gTUFYX0xFVkVMOworCW11dGV4X3VubG9jaygmaW5mby0+YmxfbXV0ZXgpOworCisJaWYgKGF0eWxldmVsIDwgMCkKKwkJYXR5bGV2ZWwgPSAwOworCWVsc2UgaWYgKGF0eWxldmVsID4gTUFYX0xFVkVMKQorCQlhdHlsZXZlbCA9IE1BWF9MRVZFTDsKKworCXJldHVybiBhdHlsZXZlbDsKK30KKworc3RhdGljIGludCBhdHlfYmxfdXBkYXRlX3N0YXR1cyhzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQpCit7CisJc3RydWN0IGF0eWZiX3BhciAqcGFyID0gY2xhc3NfZ2V0X2RldmRhdGEoJmJkLT5jbGFzc19kZXYpOwogCXVuc2lnbmVkIGludCByZWcgPSBhdHlfbGRfbGNkKExDRF9NSVNDX0NOVEwsIHBhcik7CisJaW50IGxldmVsOworCisJaWYgKGJkLT5wcm9wcy0+cG93ZXIgIT0gRkJfQkxBTktfVU5CTEFOSyB8fAorCSAgICBiZC0+cHJvcHMtPmZiX2JsYW5rICE9IEZCX0JMQU5LX1VOQkxBTkspCisJCWxldmVsID0gMDsKKwllbHNlCisJCWxldmVsID0gYmQtPnByb3BzLT5icmlnaHRuZXNzOwogCiAJcmVnIHw9IChCTE1PRF9FTiB8IEJJQVNNT0RfRU4pOwotCWlmIChvbiAmJiBsZXZlbCA+IEJBQ0tMSUdIVF9PRkYpIHsKKwlpZiAobGV2ZWwgPiAwKSB7CiAJCXJlZyAmPSB+QklBU19NT0RfTEVWRUxfTUFTSzsKLQkJcmVnIHw9IChiYWNrbGlnaHRfY29udltsZXZlbF0gPDwgQklBU19NT0RfTEVWRUxfU0hJRlQpOworCQlyZWcgfD0gKGF0eV9ibF9nZXRfbGV2ZWxfYnJpZ2h0bmVzcyhwYXIsIGxldmVsKSA8PCBCSUFTX01PRF9MRVZFTF9TSElGVCk7CiAJfSBlbHNlIHsKIAkJcmVnICY9IH5CSUFTX01PRF9MRVZFTF9NQVNLOwotCQlyZWcgfD0gKGJhY2tsaWdodF9jb252WzBdIDw8IEJJQVNfTU9EX0xFVkVMX1NISUZUKTsKKwkJcmVnIHw9IChhdHlfYmxfZ2V0X2xldmVsX2JyaWdodG5lc3MocGFyLCAwKSA8PCBCSUFTX01PRF9MRVZFTF9TSElGVCk7CiAJfQogCWF0eV9zdF9sY2QoTENEX01JU0NfQ05UTCwgcmVnLCBwYXIpOworCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYXR5X3NldF9iYWNrbGlnaHRfbGV2ZWwoaW50IGxldmVsLCB2b2lkICpkYXRhKQorc3RhdGljIGludCBhdHlfYmxfZ2V0X2JyaWdodG5lc3Moc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkKQogewotCXJldHVybiBhdHlfc2V0X2JhY2tsaWdodF9lbmFibGUoMSwgbGV2ZWwsIGRhdGEpOworCXJldHVybiBiZC0+cHJvcHMtPmJyaWdodG5lc3M7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgYmFja2xpZ2h0X2NvbnRyb2xsZXIgYXR5X2JhY2tsaWdodF9jb250cm9sbGVyID0gewotCWF0eV9zZXRfYmFja2xpZ2h0X2VuYWJsZSwKLQlhdHlfc2V0X2JhY2tsaWdodF9sZXZlbAorc3RhdGljIHN0cnVjdCBiYWNrbGlnaHRfcHJvcGVydGllcyBhdHlfYmxfZGF0YSA9IHsKKwkub3duZXIJICA9IFRISVNfTU9EVUxFLAorCS5nZXRfYnJpZ2h0bmVzcyA9IGF0eV9ibF9nZXRfYnJpZ2h0bmVzcywKKwkudXBkYXRlX3N0YXR1cwk9IGF0eV9ibF91cGRhdGVfc3RhdHVzLAorCS5tYXhfYnJpZ2h0bmVzcyA9IChGQl9CQUNLTElHSFRfTEVWRUxTIC0gMSksCiB9OwotI2VuZGlmIC8qIENPTkZJR19QTUFDX0JBQ0tMSUdIVCAqLwogCi1zdGF0aWMgdm9pZCBfX2luaXQgYXR5X2NhbGNfbWVtX3JlZnJlc2goc3RydWN0IGF0eWZiX3BhciAqcGFyLCBpbnQgeGNsaykKK3N0YXRpYyB2b2lkIGF0eV9ibF9pbml0KHN0cnVjdCBhdHlmYl9wYXIgKnBhcikKK3sKKwlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IHBjaV9nZXRfZHJ2ZGF0YShwYXItPnBkZXYpOworCXN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZDsKKwljaGFyIG5hbWVbMTJdOworCisjaWZkZWYgQ09ORklHX1BNQUNfQkFDS0xJR0hUCisJaWYgKCFwbWFjX2hhc19iYWNrbGlnaHRfdHlwZSgiYXRpIikpCisJCXJldHVybjsKKyNlbmRpZgorCisJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiYXR5YmwlZCIsIGluZm8tPm5vZGUpOworCisJYmQgPSBiYWNrbGlnaHRfZGV2aWNlX3JlZ2lzdGVyKG5hbWUsIHBhciwgJmF0eV9ibF9kYXRhKTsKKwlpZiAoSVNfRVJSKGJkKSkgeworCQlpbmZvLT5ibF9kZXYgPSBOVUxMOworCQlwcmludGsoImF0eTogQmFja2xpZ2h0IHJlZ2lzdHJhdGlvbiBmYWlsZWRcbiIpOworCQlnb3RvIGVycm9yOworCX0KKworCW11dGV4X2xvY2soJmluZm8tPmJsX211dGV4KTsKKwlpbmZvLT5ibF9kZXYgPSBiZDsKKwlmYl9ibF9kZWZhdWx0X2N1cnZlKGluZm8sIDAsCisJCTB4M0YgKiBGQl9CQUNLTElHSFRfTUFYIC8gTUFYX0xFVkVMLAorCQkweEZGICogRkJfQkFDS0xJR0hUX01BWCAvIE1BWF9MRVZFTCk7CisJbXV0ZXhfdW5sb2NrKCZpbmZvLT5ibF9tdXRleCk7CisKKwl1cCgmYmQtPnNlbSk7CisJYmQtPnByb3BzLT5icmlnaHRuZXNzID0gYXR5X2JsX2RhdGEubWF4X2JyaWdodG5lc3M7CisJYmQtPnByb3BzLT5wb3dlciA9IEZCX0JMQU5LX1VOQkxBTks7CisJYmQtPnByb3BzLT51cGRhdGVfc3RhdHVzKGJkKTsKKwlkb3duKCZiZC0+c2VtKTsKKworI2lmZGVmIENPTkZJR19QTUFDX0JBQ0tMSUdIVAorCW11dGV4X2xvY2soJnBtYWNfYmFja2xpZ2h0X211dGV4KTsKKwlpZiAoIXBtYWNfYmFja2xpZ2h0KQorCQlwbWFjX2JhY2tsaWdodCA9IGJkOworCW11dGV4X3VubG9jaygmcG1hY19iYWNrbGlnaHRfbXV0ZXgpOworI2VuZGlmCisKKwlwcmludGsoImF0eTogQmFja2xpZ2h0IGluaXRpYWxpemVkICglcylcbiIsIG5hbWUpOworCisJcmV0dXJuOworCitlcnJvcjoKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGF0eV9ibF9leGl0KHN0cnVjdCBhdHlmYl9wYXIgKnBhcikKK3sKKwlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IHBjaV9nZXRfZHJ2ZGF0YShwYXItPnBkZXYpOworCisjaWZkZWYgQ09ORklHX1BNQUNfQkFDS0xJR0hUCisJbXV0ZXhfbG9jaygmcG1hY19iYWNrbGlnaHRfbXV0ZXgpOworI2VuZGlmCisKKwltdXRleF9sb2NrKCZpbmZvLT5ibF9tdXRleCk7CisJaWYgKGluZm8tPmJsX2RldikgeworI2lmZGVmIENPTkZJR19QTUFDX0JBQ0tMSUdIVAorCQlpZiAocG1hY19iYWNrbGlnaHQgPT0gaW5mby0+YmxfZGV2KQorCQkJcG1hY19iYWNrbGlnaHQgPSBOVUxMOworI2VuZGlmCisKKwkJYmFja2xpZ2h0X2RldmljZV91bnJlZ2lzdGVyKGluZm8tPmJsX2Rldik7CisKKwkJcHJpbnRrKCJhdHk6IEJhY2tsaWdodCB1bmxvYWRlZFxuIik7CisJfQorCW11dGV4X3VubG9jaygmaW5mby0+YmxfbXV0ZXgpOworCisjaWZkZWYgQ09ORklHX1BNQUNfQkFDS0xJR0hUCisJbXV0ZXhfdW5sb2NrKCZwbWFjX2JhY2tsaWdodF9tdXRleCk7CisjZW5kaWYKK30KKworI2VuZGlmIC8qIENPTkZJR19GQl9BVFlfQkFDS0xJR0hUICovCisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBhdHlfY2FsY19tZW1fcmVmcmVzaChzdHJ1Y3QgYXR5ZmJfcGFyICpwYXIsIGludCB4Y2xrKQogewogCWNvbnN0IGludCByYWdlcHJvX3RibFtdID0gewogCQk0NCwgNTAsIDU1LCA2NiwgNzUsIDgwLCAxMDAKQEAgLTIyMTUsNyArMjMyMSw3IEBACiB9CiAjZW5kaWYgLyogZGVmaW5lZChfX2kzODZfXykgJiYgZGVmaW5lZChDT05GSUdfRkJfQVRZX0dFTkVSSUNfTENEKSAqLwogCi1zdGF0aWMgaW50IF9faW5pdCBhdHlfaW5pdChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgY29uc3QgY2hhciAqbmFtZSkKK3N0YXRpYyBpbnQgX19kZXZpbml0IGF0eV9pbml0KHN0cnVjdCBmYl9pbmZvICppbmZvLCBjb25zdCBjaGFyICpuYW1lKQogewogCXN0cnVjdCBhdHlmYl9wYXIgKnBhciA9IChzdHJ1Y3QgYXR5ZmJfcGFyICopIGluZm8tPnBhcjsKIAljb25zdCBjaGFyICpyYW1uYW1lID0gTlVMTCwgKnh0YWw7CkBAIC0yMjk2LDEyICsyNDAyLDE1IEBACiAJCQlicmVhazsKIAkJfQogCQlzd2l0Y2ggKGNsa190eXBlKSB7CisjaWZkZWYgQ09ORklHX0FUQVJJCiAJCWNhc2UgQ0xLX0FUSTE4ODE4XzE6CiAJCQlwYXItPnBsbF9vcHMgPSAmYXR5X3BsbF9hdGkxODgxOF8xOwogCQkJYnJlYWs7CisjZWxzZQogCQljYXNlIENMS19JQk1SR0I1MTQ6CiAJCQlwYXItPnBsbF9vcHMgPSAmYXR5X3BsbF9pYm01MTQ7CiAJCQlicmVhazsKKyNlbmRpZgogI2lmIDAgLyogZGVhZCBjb2RlICovCiAJCWNhc2UgQ0xLX1NURzE3MDM6CiAJCQlwYXItPnBsbF9vcHMgPSAmYXR5X3BsbF9zdGcxNzAzOwpAQCAtMjUwNiwxNiArMjYxNSwyNCBAQAogCiAJaW5mby0+ZmJvcHMgPSAmYXR5ZmJfb3BzOwogCWluZm8tPnBzZXVkb19wYWxldHRlID0gcHNldWRvX3BhbGV0dGU7Ci0JaW5mby0+ZmxhZ3MgPSBGQklORk9fRkxBR19ERUZBVUxUOworCWluZm8tPmZsYWdzID0gRkJJTkZPX0RFRkFVTFQgICAgICAgICAgIHwKKwkgICAgICAgICAgICAgIEZCSU5GT19IV0FDQ0VMX0lNQUdFQkxJVCB8CisJICAgICAgICAgICAgICBGQklORk9fSFdBQ0NFTF9GSUxMUkVDVCAgfAorCSAgICAgICAgICAgICAgRkJJTkZPX0hXQUNDRUxfQ09QWUFSRUEgIHwKKwkgICAgICAgICAgICAgIEZCSU5GT19IV0FDQ0VMX1lQQU47CiAKICNpZmRlZiBDT05GSUdfUE1BQ19CQUNLTElHSFQKIAlpZiAoTTY0X0hBUyhHM19QQl8xXzEpICYmIG1hY2hpbmVfaXNfY29tcGF0aWJsZSgiUG93ZXJCb29rMSwxIikpIHsKIAkJLyogdGhlc2UgYml0cyBsZXQgdGhlIDEwMSBwb3dlcmJvb2sgd2FrZSB1cCBmcm9tIHNsZWVwIC0tIHBhdWx1cyAqLwogCQlhdHlfc3RfbGNkKFBPV0VSX01BTkFHRU1FTlQsIGF0eV9sZF9sY2QoUE9XRVJfTUFOQUdFTUVOVCwgcGFyKQogCQkJICAgfCAoVVNFX0YzMktIWiB8IFRSSVNUQVRFX01FTV9FTiksIHBhcik7Ci0JfSBlbHNlIGlmIChNNjRfSEFTKE1PQklMX0JVUykpCi0JCXJlZ2lzdGVyX2JhY2tsaWdodF9jb250cm9sbGVyKCZhdHlfYmFja2xpZ2h0X2NvbnRyb2xsZXIsIGluZm8sICJhdGkiKTsKLSNlbmRpZiAvKiBDT05GSUdfUE1BQ19CQUNLTElHSFQgKi8KKwl9IGVsc2UKKyNlbmRpZgorCWlmIChNNjRfSEFTKE1PQklMX0JVUykpIHsKKyNpZmRlZiBDT05GSUdfRkJfQVRZX0JBQ0tMSUdIVAorCQlhdHlfYmxfaW5pdCAocGFyKTsKKyNlbmRpZgorCX0KIAogCW1lbXNldCgmdmFyLCAwLCBzaXplb2YodmFyKSk7CiAjaWZkZWYgQ09ORklHX1BQQwpAQCAtMjYzMSw3ICsyNzQ4LDcgQEAKIH0KIAogI2lmZGVmIENPTkZJR19BVEFSSQotc3RhdGljIGludCBfX2luaXQgc3RvcmVfdmlkZW9fcGFyKGNoYXIgKnZpZGVvX3N0ciwgdW5zaWduZWQgY2hhciBtNjRfbnVtKQorc3RhdGljIGludCBfX2RldmluaXQgc3RvcmVfdmlkZW9fcGFyKGNoYXIgKnZpZGVvX3N0ciwgdW5zaWduZWQgY2hhciBtNjRfbnVtKQogewogCWNoYXIgKnA7CiAJdW5zaWduZWQgbG9uZyB2bWVtYmFzZSwgc2l6ZSwgZ3VpcmVnYmFzZTsKQEAgLTI2NzQsOCArMjc5MSwxNiBAQAogCQlyZXR1cm4gMDsKIAogI2lmZGVmIENPTkZJR19QTUFDX0JBQ0tMSUdIVAotCWlmIChtYWNoaW5lX2lzKHBvd2VybWFjKSAmJiBibGFuayA+IEZCX0JMQU5LX05PUk1BTCkKLQkJc2V0X2JhY2tsaWdodF9lbmFibGUoMCk7CisJaWYgKG1hY2hpbmVfaXMocG93ZXJtYWMpICYmIGJsYW5rID4gRkJfQkxBTktfTk9STUFMKSB7CisJCW11dGV4X2xvY2soJmluZm8tPmJsX211dGV4KTsKKwkJaWYgKGluZm8tPmJsX2RldikgeworCQkJZG93bigmaW5mby0+YmxfZGV2LT5zZW0pOworCQkJaW5mby0+YmxfZGV2LT5wcm9wcy0+cG93ZXIgPSBGQl9CTEFOS19QT1dFUkRPV047CisJCQlpbmZvLT5ibF9kZXYtPnByb3BzLT51cGRhdGVfc3RhdHVzKGluZm8tPmJsX2Rldik7CisJCQl1cCgmaW5mby0+YmxfZGV2LT5zZW0pOworCQl9CisJCW11dGV4X3VubG9jaygmaW5mby0+YmxfbXV0ZXgpOworCX0KICNlbGlmIGRlZmluZWQoQ09ORklHX0ZCX0FUWV9HRU5FUklDX0xDRCkKIAlpZiAocGFyLT5sY2RfdGFibGUgJiYgYmxhbmsgPiBGQl9CTEFOS19OT1JNQUwgJiYKIAkgICAgKGF0eV9sZF9sY2QoTENEX0dFTl9DTlRMLCBwYXIpICYgTENEX09OKSkgewpAQCAtMjcwNiw4ICsyODMxLDE2IEBACiAJYXR5X3N0X2xlMzIoQ1JUQ19HRU5fQ05UTCwgZ2VuX2NudGwsIHBhcik7CiAKICNpZmRlZiBDT05GSUdfUE1BQ19CQUNLTElHSFQKLQlpZiAobWFjaGluZV9pcyhwb3dlcm1hYykgJiYgYmxhbmsgPD0gRkJfQkxBTktfTk9STUFMKQotCQlzZXRfYmFja2xpZ2h0X2VuYWJsZSgxKTsKKwlpZiAobWFjaGluZV9pcyhwb3dlcm1hYykgJiYgYmxhbmsgPD0gRkJfQkxBTktfTk9STUFMKSB7CisJCW11dGV4X2xvY2soJmluZm8tPmJsX211dGV4KTsKKwkJaWYgKGluZm8tPmJsX2RldikgeworCQkJZG93bigmaW5mby0+YmxfZGV2LT5zZW0pOworCQkJaW5mby0+YmxfZGV2LT5wcm9wcy0+cG93ZXIgPSBGQl9CTEFOS19VTkJMQU5LOworCQkJaW5mby0+YmxfZGV2LT5wcm9wcy0+dXBkYXRlX3N0YXR1cyhpbmZvLT5ibF9kZXYpOworCQkJdXAoJmluZm8tPmJsX2Rldi0+c2VtKTsKKwkJfQorCQltdXRleF91bmxvY2soJmluZm8tPmJsX211dGV4KTsKKwl9CiAjZWxpZiBkZWZpbmVkKENPTkZJR19GQl9BVFlfR0VORVJJQ19MQ0QpCiAJaWYgKHBhci0+bGNkX3RhYmxlICYmIGJsYW5rIDw9IEZCX0JMQU5LX05PUk1BTCAmJgogCSAgICAoYXR5X2xkX2xjZChMQ0RfR0VOX0NOVEwsIHBhcikgJiBMQ0RfT04pKSB7CkBAIC0zNDQwLDYgKzM1NzMsNyBAQAogCXBhci0+cmVzX3N0YXJ0ID0gcmVzX3N0YXJ0OwogCXBhci0+cmVzX3NpemUgPSByZXNfc2l6ZTsKIAlwYXItPmlycSA9IHBkZXYtPmlycTsKKwlwYXItPnBkZXYgPSBwZGV2OwogCiAJLyogU2V0dXAgImluZm8iIHN0cnVjdHVyZSAqLwogI2lmZGVmIF9fc3BhcmNfXwpAQCAtMzU3MSw2ICszNzA1LDExIEBACiAJYXR5X3NldF9jcnRjKHBhciwgJnNhdmVkX2NydGMpOwogCXBhci0+cGxsX29wcy0+c2V0X3BsbChpbmZvLCAmc2F2ZWRfcGxsKTsKIAorI2lmZGVmIENPTkZJR19GQl9BVFlfQkFDS0xJR0hUCisJaWYgKE02NF9IQVMoTU9CSUxfQlVTKSkKKwkJYXR5X2JsX2V4aXQocGFyKTsKKyNlbmRpZgorCiAJdW5yZWdpc3Rlcl9mcmFtZWJ1ZmZlcihpbmZvKTsKIAogI2lmZGVmIENPTkZJR19NVFJSCkBAIC0zNjQwLDcgKzM3NzksNyBAQAogI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KIAogI2lmbmRlZiBNT0RVTEUKLXN0YXRpYyBpbnQgX19pbml0IGF0eWZiX3NldHVwKGNoYXIgKm9wdGlvbnMpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhdHlmYl9zZXR1cChjaGFyICpvcHRpb25zKQogewogCWNoYXIgKnRoaXNfb3B0OwogCkBAIC0zNzEyLDcgKzM4NTEsNyBAQAogfQogI2VuZGlmICAvKiAgTU9EVUxFICAqLwogCi1zdGF0aWMgaW50IF9faW5pdCBhdHlmYl9pbml0KHZvaWQpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhdHlmYl9pbml0KHZvaWQpCiB7CiAjaWZuZGVmIE1PRFVMRQogICAgIGNoYXIgKm9wdGlvbiA9IE5VTEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2F0eS9tYWNoNjRfYWNjZWwuYyBiL2RyaXZlcnMvdmlkZW8vYXR5L21hY2g2NF9hY2NlbC5jCmluZGV4IGM5OGY0YTQuLjE0OTBlNWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYXR5L21hY2g2NF9hY2NlbC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vYXR5L21hY2g2NF9hY2NlbC5jCkBAIC0yMDAsOCArMjAwLDYgQEAKIAlpZiAoIWFyZWEtPndpZHRoIHx8ICFhcmVhLT5oZWlnaHQpCiAJCXJldHVybjsKIAlpZiAoIXBhci0+YWNjZWxfZmxhZ3MpIHsKLQkJaWYgKHBhci0+YmxpdHRlcl9tYXlfYmVfYnVzeSkKLQkJCXdhaXRfZm9yX2lkbGUocGFyKTsKIAkJY2ZiX2NvcHlhcmVhKGluZm8sIGFyZWEpOwogCQlyZXR1cm47CiAJfQpAQCAtMjQ4LDggKzI0Niw2IEBACiAJaWYgKCFyZWN0LT53aWR0aCB8fCAhcmVjdC0+aGVpZ2h0KQogCQlyZXR1cm47CiAJaWYgKCFwYXItPmFjY2VsX2ZsYWdzKSB7Ci0JCWlmIChwYXItPmJsaXR0ZXJfbWF5X2JlX2J1c3kpCi0JCQl3YWl0X2Zvcl9pZGxlKHBhcik7CiAJCWNmYl9maWxscmVjdChpbmZvLCByZWN0KTsKIAkJcmV0dXJuOwogCX0KQEAgLTI4OCwxNCArMjg0LDEwIEBACiAJCXJldHVybjsKIAlpZiAoIXBhci0+YWNjZWxfZmxhZ3MgfHwKIAkgICAgKGltYWdlLT5kZXB0aCAhPSAxICYmIGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCAhPSBpbWFnZS0+ZGVwdGgpKSB7Ci0JCWlmIChwYXItPmJsaXR0ZXJfbWF5X2JlX2J1c3kpCi0JCQl3YWl0X2Zvcl9pZGxlKHBhcik7Ci0KIAkJY2ZiX2ltYWdlYmxpdChpbmZvLCBpbWFnZSk7CiAJCXJldHVybjsKIAl9CiAKLQl3YWl0X2Zvcl9pZGxlKHBhcik7CiAJcGl4X3dpZHRoID0gcGl4X3dpZHRoX3NhdmUgPSBhdHlfbGRfbGUzMihEUF9QSVhfV0lEVEgsIHBhcik7CiAJaG9zdF9jbnRsID0gYXR5X2xkX2xlMzIoSE9TVF9DTlRMLCBwYXIpIHwgSE9TVF9CWVRFX0FMSUdOOwogCkBAIC00MjUsOCArNDE3LDYgQEAKIAkJfQogCX0KIAotCXdhaXRfZm9yX2lkbGUocGFyKTsKLQogCS8qIHJlc3RvcmUgcGl4X3dpZHRoICovCiAJd2FpdF9mb3JfZmlmbygxLCBwYXIpOwogCWF0eV9zdF9sZTMyKERQX1BJWF9XSURUSCwgcGl4X3dpZHRoX3NhdmUsIHBhcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2F0eS9tYWNoNjRfY3Vyc29yLmMgYi9kcml2ZXJzL3ZpZGVvL2F0eS9tYWNoNjRfY3Vyc29yLmMKaW5kZXggYWQ4Yjc0OS4uMmE3ZjM4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9hdHkvbWFjaDY0X2N1cnNvci5jCisrKyBiL2RyaXZlcnMvdmlkZW8vYXR5L21hY2g2NF9jdXJzb3IuYwpAQCAtNjYsMTEgKzY2LDYgQEAKIAkweDAxLCAweDQxLCAweDExLCAweDUxLCAweDA1LCAweDQ1LCAweDE1LCAweDU1CiB9OwogCi1zdGF0aWMgY29uc3QgdTggY3Vyc29yX21hc2tfbG9va3VwWzE2XSA9IHsKLQkweGFhLCAweDJhLCAweDhhLCAweDBhLCAweGEyLCAweDIyLCAweDgyLCAweDAyLAotCTB4YTgsIDB4MjgsIDB4ODgsIDB4MDgsIDB4YTAsIDB4MjAsIDB4ODAsIDB4MDAKLX07Ci0KIHN0YXRpYyBpbnQgYXR5ZmJfY3Vyc29yKHN0cnVjdCBmYl9pbmZvICppbmZvLCBzdHJ1Y3QgZmJfY3Vyc29yICpjdXJzb3IpCiB7CiAJc3RydWN0IGF0eWZiX3BhciAqcGFyID0gKHN0cnVjdCBhdHlmYl9wYXIgKikgaW5mby0+cGFyOwpAQCAtMTMwLDEzICsxMjUsMTMgQEAKIAkJZmdfaWR4ID0gY3Vyc29yLT5pbWFnZS5mZ19jb2xvcjsKIAkJYmdfaWR4ID0gY3Vyc29yLT5pbWFnZS5iZ19jb2xvcjsKIAotCQlmZyA9IChpbmZvLT5jbWFwLnJlZFtmZ19pZHhdIDw8IDI0KSB8Ci0JCSAgICAgKGluZm8tPmNtYXAuZ3JlZW5bZmdfaWR4XSA8PCAxNikgfAotCQkgICAgIChpbmZvLT5jbWFwLmJsdWVbZmdfaWR4XSA8PCA4KSB8IDE1OworCQlmZyA9ICgoaW5mby0+Y21hcC5yZWRbZmdfaWR4XSAmIDB4ZmYpIDw8IDI0KSB8CisJCSAgICAgKChpbmZvLT5jbWFwLmdyZWVuW2ZnX2lkeF0gJiAweGZmKSA8PCAxNikgfAorCQkgICAgICgoaW5mby0+Y21hcC5ibHVlW2ZnX2lkeF0gJiAweGZmKSA8PCA4KSB8IDB4ZmY7CiAKLQkJYmcgPSAoaW5mby0+Y21hcC5yZWRbYmdfaWR4XSA8PCAyNCkgfAotCQkgICAgIChpbmZvLT5jbWFwLmdyZWVuW2JnX2lkeF0gPDwgMTYpIHwKLQkJICAgICAoaW5mby0+Y21hcC5ibHVlW2JnX2lkeF0gPDwgOCk7CisJCWJnID0gKChpbmZvLT5jbWFwLnJlZFtiZ19pZHhdICYgMHhmZikgPDwgMjQpIHwKKwkJICAgICAoKGluZm8tPmNtYXAuZ3JlZW5bYmdfaWR4XSAmIDB4ZmYpIDw8IDE2KSB8CisJCSAgICAgKChpbmZvLT5jbWFwLmJsdWVbYmdfaWR4XSAmIDB4ZmYpIDw8IDgpOwogCiAJCXdhaXRfZm9yX2ZpZm8oMiwgcGFyKTsKIAkJYXR5X3N0X2xlMzIoQ1VSX0NMUjAsIGJnLCBwYXIpOwpAQCAtMTY2LDE5ICsxNjEsMTcgQEAKIAkJCXN3aXRjaCAoY3Vyc29yLT5yb3ApIHsKIAkJCWNhc2UgUk9QX1hPUjoKIAkJCSAgICAvLyBVcHBlciA0IGJpdHMgb2YgbWFzayBkYXRhCi0JCQkgICAgZmJfd3JpdGViKGN1cnNvcl9tYXNrX2xvb2t1cFttID4+IDQgXSB8Ci0JCQkJY3Vyc29yX2JpdHNfbG9va3VwWyhiIF4gbSkgPj4gNF0sIGRzdCsrKTsKKwkJCSAgICBmYl93cml0ZWIoY3Vyc29yX2JpdHNfbG9va3VwWyhiIF4gbSkgPj4gNF0sIGRzdCsrKTsKIAkJCSAgICAvLyBMb3dlciA0IGJpdHMgb2YgbWFzawotCQkJICAgIGZiX3dyaXRlYihjdXJzb3JfbWFza19sb29rdXBbbSAmIDB4MGYgXSB8Ci0JCQkJY3Vyc29yX2JpdHNfbG9va3VwWyhiIF4gbSkgJiAweDBmXSwgZHN0KyspOworCQkJICAgIGZiX3dyaXRlYihjdXJzb3JfYml0c19sb29rdXBbKGIgXiBtKSAmIDB4MGZdLAorCQkJCSAgICAgIGRzdCsrKTsKIAkJCSAgICBicmVhazsKIAkJCWNhc2UgUk9QX0NPUFk6CiAJCQkgICAgLy8gVXBwZXIgNCBiaXRzIG9mIG1hc2sgZGF0YQotCQkJICAgIGZiX3dyaXRlYihjdXJzb3JfbWFza19sb29rdXBbbSA+PiA0IF0gfAotCQkJCWN1cnNvcl9iaXRzX2xvb2t1cFsoYiAmIG0pID4+IDRdLCBkc3QrKyk7CisJCQkgICAgZmJfd3JpdGViKGN1cnNvcl9iaXRzX2xvb2t1cFsoYiAmIG0pID4+IDRdLCBkc3QrKyk7CiAJCQkgICAgLy8gTG93ZXIgNCBiaXRzIG9mIG1hc2sKLQkJCSAgICBmYl93cml0ZWIoY3Vyc29yX21hc2tfbG9va3VwW20gJiAweDBmIF0gfAotCQkJCWN1cnNvcl9iaXRzX2xvb2t1cFsoYiAmIG0pICYgMHgwZl0sIGRzdCsrKTsKKwkJCSAgICBmYl93cml0ZWIoY3Vyc29yX2JpdHNfbG9va3VwWyhiICYgbSkgJiAweDBmXSwKKwkJCQkgICAgICBkc3QrKyk7CiAJCQkgICAgYnJlYWs7CiAJCQl9CiAJCX0KQEAgLTE5NCw3ICsxODcsNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQgX19pbml0IGF0eV9pbml0X2N1cnNvcihzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK2ludCBfX2RldmluaXQgYXR5X2luaXRfY3Vyc29yKHN0cnVjdCBmYl9pbmZvICppbmZvKQogewogCXVuc2lnbmVkIGxvbmcgYWRkcjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9hdHkvcmFkZW9uX2JhY2tsaWdodC5jIGIvZHJpdmVycy92aWRlby9hdHkvcmFkZW9uX2JhY2tsaWdodC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZTY2YjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL2F0eS9yYWRlb25fYmFja2xpZ2h0LmMKQEAgLTAsMCArMSwyNDcgQEAKKy8qCisgKiBCYWNrbGlnaHQgY29kZSBmb3IgQVRJIFJhZGVvbiBiYXNlZCBncmFwaGljIGNhcmRzCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAwIEFuaSBKb3NoaSA8YWpvc2hpQGtlcm5lbC5jcmFzaGluZy5vcmc+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgQmVuamFtaW4gSGVycmVuc2NobWlkdCA8YmVuaEBrZXJuZWwuY3Jhc2hpbmcub3JnPgorICogQ29weXJpZ2h0IChjKSAyMDA2IE1pY2hhZWwgSGFuc2VsbWFubiA8bGludXgta2VybmVsQGhhbnNtaS5jaD4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlICJyYWRlb25mYi5oIgorI2luY2x1ZGUgPGxpbnV4L2JhY2tsaWdodC5oPgorCisjaWZkZWYgQ09ORklHX1BNQUNfQkFDS0xJR0hUCisjaW5jbHVkZSA8YXNtL2JhY2tsaWdodC5oPgorI2VuZGlmCisKKyNkZWZpbmUgTUFYX1JBREVPTl9MRVZFTCAweEZGCisKK3N0YXRpYyBzdHJ1Y3QgYmFja2xpZ2h0X3Byb3BlcnRpZXMgcmFkZW9uX2JsX2RhdGE7CisKK3N0cnVjdCByYWRlb25fYmxfcHJpdmRhdGEgeworCXN0cnVjdCByYWRlb25mYl9pbmZvICpyaW5mbzsKKwl1aW50OF90IG5lZ2F0aXZlOworfTsKKworc3RhdGljIGludCByYWRlb25fYmxfZ2V0X2xldmVsX2JyaWdodG5lc3Moc3RydWN0IHJhZGVvbl9ibF9wcml2ZGF0YSAqcGRhdGEsCisJCWludCBsZXZlbCkKK3sKKwlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IHBkYXRhLT5yaW5mby0+aW5mbzsKKwlpbnQgcmxldmVsOworCisJbXV0ZXhfbG9jaygmaW5mby0+YmxfbXV0ZXgpOworCisJLyogR2V0IGFuZCBjb252ZXJ0IHRoZSB2YWx1ZSAqLworCXJsZXZlbCA9IHBkYXRhLT5yaW5mby0+aW5mby0+YmxfY3VydmVbbGV2ZWxdICoKKwkJIEZCX0JBQ0tMSUdIVF9NQVggLyBNQVhfUkFERU9OX0xFVkVMOworCisJbXV0ZXhfdW5sb2NrKCZpbmZvLT5ibF9tdXRleCk7CisKKwlpZiAocGRhdGEtPm5lZ2F0aXZlKQorCQlybGV2ZWwgPSBNQVhfUkFERU9OX0xFVkVMIC0gcmxldmVsOworCisJaWYgKHJsZXZlbCA8IDApCisJCXJsZXZlbCA9IDA7CisJZWxzZSBpZiAocmxldmVsID4gTUFYX1JBREVPTl9MRVZFTCkKKwkJcmxldmVsID0gTUFYX1JBREVPTl9MRVZFTDsKKworCXJldHVybiBybGV2ZWw7Cit9CisKK3N0YXRpYyBpbnQgcmFkZW9uX2JsX3VwZGF0ZV9zdGF0dXMoc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkKQoreworCXN0cnVjdCByYWRlb25fYmxfcHJpdmRhdGEgKnBkYXRhID0gY2xhc3NfZ2V0X2RldmRhdGEoJmJkLT5jbGFzc19kZXYpOworCXN0cnVjdCByYWRlb25mYl9pbmZvICpyaW5mbyA9IHBkYXRhLT5yaW5mbzsKKwl1MzIgbHZkc19nZW5fY250bCwgdG1wUGl4Y2xrc0NudGw7CisJaW50IGxldmVsOworCisJaWYgKHJpbmZvLT5tb24xX3R5cGUgIT0gTVRfTENEKQorCQlyZXR1cm4gMDsKKworCS8qIFdlIHR1cm4gb2ZmIHRoZSBMQ0QgY29tcGxldGVseSBpbnN0ZWFkIG9mIGp1c3QgZGltbWluZyB0aGUKKwkgKiBiYWNrbGlnaHQuIFRoaXMgcHJvdmlkZXMgc29tZSBncmVhdGVyIHBvd2VyIHNhdmluZyBhbmQgdGhlIGRpc3BsYXkKKwkgKiBpcyB1c2VsZXNzIHdpdGhvdXQgYmFja2xpZ2h0IGFueXdheS4KKwkgKi8KKyAgICAgICAgaWYgKGJkLT5wcm9wcy0+cG93ZXIgIT0gRkJfQkxBTktfVU5CTEFOSyB8fAorCSAgICBiZC0+cHJvcHMtPmZiX2JsYW5rICE9IEZCX0JMQU5LX1VOQkxBTkspCisJCWxldmVsID0gMDsKKwllbHNlCisJCWxldmVsID0gYmQtPnByb3BzLT5icmlnaHRuZXNzOworCisJZGVsX3RpbWVyX3N5bmMoJnJpbmZvLT5sdmRzX3RpbWVyKTsKKwlyYWRlb25fZW5naW5lX2lkbGUoKTsKKworCWx2ZHNfZ2VuX2NudGwgPSBJTlJFRyhMVkRTX0dFTl9DTlRMKTsKKwlpZiAobGV2ZWwgPiAwKSB7CisJCWx2ZHNfZ2VuX2NudGwgJj0gfkxWRFNfRElTUExBWV9ESVM7CisJCWlmICghKGx2ZHNfZ2VuX2NudGwgJiBMVkRTX0JMT04pIHx8ICEobHZkc19nZW5fY250bCAmIExWRFNfT04pKSB7CisJCQlsdmRzX2dlbl9jbnRsIHw9IChyaW5mby0+aW5pdF9zdGF0ZS5sdmRzX2dlbl9jbnRsICYgTFZEU19ESUdPTik7CisJCQlsdmRzX2dlbl9jbnRsIHw9IExWRFNfQkxPTiB8IExWRFNfRU47CisJCQlPVVRSRUcoTFZEU19HRU5fQ05UTCwgbHZkc19nZW5fY250bCk7CisJCQlsdmRzX2dlbl9jbnRsICY9IH5MVkRTX0JMX01PRF9MRVZFTF9NQVNLOworCQkJbHZkc19nZW5fY250bCB8PQorCQkJCShyYWRlb25fYmxfZ2V0X2xldmVsX2JyaWdodG5lc3MocGRhdGEsIGxldmVsKSA8PAorCQkJCSBMVkRTX0JMX01PRF9MRVZFTF9TSElGVCk7CisJCQlsdmRzX2dlbl9jbnRsIHw9IExWRFNfT047CisJCQlsdmRzX2dlbl9jbnRsIHw9IChyaW5mby0+aW5pdF9zdGF0ZS5sdmRzX2dlbl9jbnRsICYgTFZEU19CTF9NT0RfRU4pOworCQkJcmluZm8tPnBlbmRpbmdfbHZkc19nZW5fY250bCA9IGx2ZHNfZ2VuX2NudGw7CisJCQltb2RfdGltZXIoJnJpbmZvLT5sdmRzX3RpbWVyLAorCQkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMocmluZm8tPnBhbmVsX2luZm8ucHdyX2RlbGF5KSk7CisJCX0gZWxzZSB7CisJCQlsdmRzX2dlbl9jbnRsICY9IH5MVkRTX0JMX01PRF9MRVZFTF9NQVNLOworCQkJbHZkc19nZW5fY250bCB8PQorCQkJCShyYWRlb25fYmxfZ2V0X2xldmVsX2JyaWdodG5lc3MocGRhdGEsIGxldmVsKSA8PAorCQkJCSBMVkRTX0JMX01PRF9MRVZFTF9TSElGVCk7CisJCQlPVVRSRUcoTFZEU19HRU5fQ05UTCwgbHZkc19nZW5fY250bCk7CisJCX0KKwkJcmluZm8tPmluaXRfc3RhdGUubHZkc19nZW5fY250bCAmPSB+TFZEU19TVEFURV9NQVNLOworCQlyaW5mby0+aW5pdF9zdGF0ZS5sdmRzX2dlbl9jbnRsIHw9IHJpbmZvLT5wZW5kaW5nX2x2ZHNfZ2VuX2NudGwKKwkJCSYgTFZEU19TVEFURV9NQVNLOworCX0gZWxzZSB7CisJCS8qIEFzaWMgYnVnLCB3aGVuIHR1cm5pbmcgb2ZmIExWRFNfT04sIHdlIGhhdmUgdG8gbWFrZSBzdXJlCisJCSAgIFJBREVPTl9QSVhDTEtfTFZEU19BTFdBWVNfT04gYml0IGlzIG9mZgorCQkqLworCQl0bXBQaXhjbGtzQ250bCA9IElOUExMKFBJWENMS1NfQ05UTCk7CisJCWlmIChyaW5mby0+aXNfbW9iaWxpdHkgfHwgcmluZm8tPmlzX0lHUCkKKwkJCU9VVFBMTFAoUElYQ0xLU19DTlRMLCAwLCB+UElYQ0xLX0xWRFNfQUxXQVlTX09OYik7CisJCWx2ZHNfZ2VuX2NudGwgJj0gfihMVkRTX0JMX01PRF9MRVZFTF9NQVNLIHwgTFZEU19CTF9NT0RfRU4pOworCQlsdmRzX2dlbl9jbnRsIHw9IChyYWRlb25fYmxfZ2V0X2xldmVsX2JyaWdodG5lc3MocGRhdGEsIDApIDw8CisJCQkJICBMVkRTX0JMX01PRF9MRVZFTF9TSElGVCk7CisJCWx2ZHNfZ2VuX2NudGwgfD0gTFZEU19ESVNQTEFZX0RJUzsKKwkJT1VUUkVHKExWRFNfR0VOX0NOVEwsIGx2ZHNfZ2VuX2NudGwpOworCQl1ZGVsYXkoMTAwKTsKKwkJbHZkc19nZW5fY250bCAmPSB+KExWRFNfT04gfCBMVkRTX0VOKTsKKwkJT1VUUkVHKExWRFNfR0VOX0NOVEwsIGx2ZHNfZ2VuX2NudGwpOworCQlsdmRzX2dlbl9jbnRsICY9IH4oTFZEU19ESUdPTik7CisJCXJpbmZvLT5wZW5kaW5nX2x2ZHNfZ2VuX2NudGwgPSBsdmRzX2dlbl9jbnRsOworCQltb2RfdGltZXIoJnJpbmZvLT5sdmRzX3RpbWVyLAorCQkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhyaW5mby0+cGFuZWxfaW5mby5wd3JfZGVsYXkpKTsKKwkJaWYgKHJpbmZvLT5pc19tb2JpbGl0eSB8fCByaW5mby0+aXNfSUdQKQorCQkJT1VUUExMKFBJWENMS1NfQ05UTCwgdG1wUGl4Y2xrc0NudGwpOworCX0KKwlyaW5mby0+aW5pdF9zdGF0ZS5sdmRzX2dlbl9jbnRsICY9IH5MVkRTX1NUQVRFX01BU0s7CisJcmluZm8tPmluaXRfc3RhdGUubHZkc19nZW5fY250bCB8PSAobHZkc19nZW5fY250bCAmIExWRFNfU1RBVEVfTUFTSyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByYWRlb25fYmxfZ2V0X2JyaWdodG5lc3Moc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkKQoreworCXJldHVybiBiZC0+cHJvcHMtPmJyaWdodG5lc3M7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYmFja2xpZ2h0X3Byb3BlcnRpZXMgcmFkZW9uX2JsX2RhdGEgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5nZXRfYnJpZ2h0bmVzcyA9IHJhZGVvbl9ibF9nZXRfYnJpZ2h0bmVzcywKKwkudXBkYXRlX3N0YXR1cwk9IHJhZGVvbl9ibF91cGRhdGVfc3RhdHVzLAorCS5tYXhfYnJpZ2h0bmVzcyA9IChGQl9CQUNLTElHSFRfTEVWRUxTIC0gMSksCit9OworCit2b2lkIHJhZGVvbmZiX2JsX2luaXQoc3RydWN0IHJhZGVvbmZiX2luZm8gKnJpbmZvKQoreworCXN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZDsKKwlzdHJ1Y3QgcmFkZW9uX2JsX3ByaXZkYXRhICpwZGF0YTsKKwljaGFyIG5hbWVbMTJdOworCisJaWYgKHJpbmZvLT5tb24xX3R5cGUgIT0gTVRfTENEKQorCQlyZXR1cm47CisKKyNpZmRlZiBDT05GSUdfUE1BQ19CQUNLTElHSFQKKwlpZiAoIXBtYWNfaGFzX2JhY2tsaWdodF90eXBlKCJhdGkiKSAmJgorCSAgICAhcG1hY19oYXNfYmFja2xpZ2h0X3R5cGUoIm1uY2EiKSkKKwkJcmV0dXJuOworI2VuZGlmCisKKwlwZGF0YSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCByYWRlb25fYmxfcHJpdmRhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBkYXRhKSB7CisJCXByaW50aygicmFkZW9uZmI6IE1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCisJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAicmFkZW9uYmwlZCIsIHJpbmZvLT5pbmZvLT5ub2RlKTsKKworCWJkID0gYmFja2xpZ2h0X2RldmljZV9yZWdpc3RlcihuYW1lLCBwZGF0YSwgJnJhZGVvbl9ibF9kYXRhKTsKKwlpZiAoSVNfRVJSKGJkKSkgeworCQlyaW5mby0+aW5mby0+YmxfZGV2ID0gTlVMTDsKKwkJcHJpbnRrKCJyYWRlb25mYjogQmFja2xpZ2h0IHJlZ2lzdHJhdGlvbiBmYWlsZWRcbiIpOworCQlnb3RvIGVycm9yOworCX0KKworCXBkYXRhLT5yaW5mbyA9IHJpbmZvOworCisJLyogUGFyZG9uIG1lIGZvciB0aGF0IGhhY2suLi4gbWF5YmUgc29tZSBkYXkgd2UgY2FuIGZpZ3VyZSBvdXQgaW4gd2hhdAorCSAqIGRpcmVjdGlvbiBiYWNrbGlnaHQgc2hvdWxkIHdvcmsgb24gYSBnaXZlbiBwYW5lbD8KKwkgKi8KKwlwZGF0YS0+bmVnYXRpdmUgPQorCQkocmluZm8tPmZhbWlseSAhPSBDSElQX0ZBTUlMWV9SVjIwMCAmJgorCQkgcmluZm8tPmZhbWlseSAhPSBDSElQX0ZBTUlMWV9SVjI1MCAmJgorCQkgcmluZm8tPmZhbWlseSAhPSBDSElQX0ZBTUlMWV9SVjI4MCAmJgorCQkgcmluZm8tPmZhbWlseSAhPSBDSElQX0ZBTUlMWV9SVjM1MCk7CisKKyNpZmRlZiBDT05GSUdfUE1BQ19CQUNLTElHSFQKKwlwZGF0YS0+bmVnYXRpdmUgPSBwZGF0YS0+bmVnYXRpdmUgfHwKKwkJbWFjaGluZV9pc19jb21wYXRpYmxlKCJQb3dlckJvb2s0LDMiKSB8fAorCQltYWNoaW5lX2lzX2NvbXBhdGlibGUoIlBvd2VyQm9vazYsMyIpIHx8CisJCW1hY2hpbmVfaXNfY29tcGF0aWJsZSgiUG93ZXJCb29rNiw1Iik7CisjZW5kaWYKKworCW11dGV4X2xvY2soJnJpbmZvLT5pbmZvLT5ibF9tdXRleCk7CisJcmluZm8tPmluZm8tPmJsX2RldiA9IGJkOworCWZiX2JsX2RlZmF1bHRfY3VydmUocmluZm8tPmluZm8sIDAsCisJCSA2MyAqIEZCX0JBQ0tMSUdIVF9NQVggLyBNQVhfUkFERU9OX0xFVkVMLAorCQkyMTcgKiBGQl9CQUNLTElHSFRfTUFYIC8gTUFYX1JBREVPTl9MRVZFTCk7CisJbXV0ZXhfdW5sb2NrKCZyaW5mby0+aW5mby0+YmxfbXV0ZXgpOworCisJdXAoJmJkLT5zZW0pOworCWJkLT5wcm9wcy0+YnJpZ2h0bmVzcyA9IHJhZGVvbl9ibF9kYXRhLm1heF9icmlnaHRuZXNzOworCWJkLT5wcm9wcy0+cG93ZXIgPSBGQl9CTEFOS19VTkJMQU5LOworCWJkLT5wcm9wcy0+dXBkYXRlX3N0YXR1cyhiZCk7CisJZG93bigmYmQtPnNlbSk7CisKKyNpZmRlZiBDT05GSUdfUE1BQ19CQUNLTElHSFQKKwltdXRleF9sb2NrKCZwbWFjX2JhY2tsaWdodF9tdXRleCk7CisJaWYgKCFwbWFjX2JhY2tsaWdodCkKKwkJcG1hY19iYWNrbGlnaHQgPSBiZDsKKwltdXRleF91bmxvY2soJnBtYWNfYmFja2xpZ2h0X211dGV4KTsKKyNlbmRpZgorCisJcHJpbnRrKCJyYWRlb25mYjogQmFja2xpZ2h0IGluaXRpYWxpemVkICglcylcbiIsIG5hbWUpOworCisJcmV0dXJuOworCitlcnJvcjoKKwlrZnJlZShwZGF0YSk7CisJcmV0dXJuOworfQorCit2b2lkIHJhZGVvbmZiX2JsX2V4aXQoc3RydWN0IHJhZGVvbmZiX2luZm8gKnJpbmZvKQoreworI2lmZGVmIENPTkZJR19QTUFDX0JBQ0tMSUdIVAorCW11dGV4X2xvY2soJnBtYWNfYmFja2xpZ2h0X211dGV4KTsKKyNlbmRpZgorCisJbXV0ZXhfbG9jaygmcmluZm8tPmluZm8tPmJsX211dGV4KTsKKwlpZiAocmluZm8tPmluZm8tPmJsX2RldikgeworCQlzdHJ1Y3QgcmFkZW9uX2JsX3ByaXZkYXRhICpwZGF0YTsKKworI2lmZGVmIENPTkZJR19QTUFDX0JBQ0tMSUdIVAorCQlpZiAocG1hY19iYWNrbGlnaHQgPT0gcmluZm8tPmluZm8tPmJsX2RldikKKwkJCXBtYWNfYmFja2xpZ2h0ID0gTlVMTDsKKyNlbmRpZgorCisJCXBkYXRhID0gY2xhc3NfZ2V0X2RldmRhdGEoJnJpbmZvLT5pbmZvLT5ibF9kZXYtPmNsYXNzX2Rldik7CisJCWJhY2tsaWdodF9kZXZpY2VfdW5yZWdpc3RlcihyaW5mby0+aW5mby0+YmxfZGV2KTsKKwkJa2ZyZWUocGRhdGEpOworCQlyaW5mby0+aW5mby0+YmxfZGV2ID0gTlVMTDsKKworCQlwcmludGsoInJhZGVvbmZiOiBCYWNrbGlnaHQgdW5sb2FkZWRcbiIpOworCX0KKwltdXRleF91bmxvY2soJnJpbmZvLT5pbmZvLT5ibF9tdXRleCk7CisKKyNpZmRlZiBDT05GSUdfUE1BQ19CQUNLTElHSFQKKwltdXRleF91bmxvY2soJnBtYWNfYmFja2xpZ2h0X211dGV4KTsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9hdHkvcmFkZW9uX2Jhc2UuYyBiL2RyaXZlcnMvdmlkZW8vYXR5L3JhZGVvbl9iYXNlLmMKaW5kZXggMzg3YTE4YS4uNjhiMTU2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9hdHkvcmFkZW9uX2Jhc2UuYworKysgYi9kcml2ZXJzL3ZpZGVvL2F0eS9yYWRlb25fYmFzZS5jCkBAIC03OCwxMCArNzgsNiBAQAogI2luY2x1ZGUgPGFzbS9wY2ktYnJpZGdlLmg+CiAjaW5jbHVkZSAiLi4vbWFjbW9kZXMuaCIKIAotI2lmZGVmIENPTkZJR19QTUFDX0JBQ0tMSUdIVAotI2luY2x1ZGUgPGFzbS9iYWNrbGlnaHQuaD4KLSNlbmRpZgotCiAjaWZkZWYgQ09ORklHX0JPT1RYX1RFWFQKICNpbmNsdWRlIDxhc20vYnRleHQuaD4KICNlbmRpZgpAQCAtMjc3LDIwICsyNzMsNiBAQAogICogcHJvdG90eXBlcwogICovCiAKLQotI2lmZGVmIENPTkZJR19QUENfT0YKLQotI2lmZGVmIENPTkZJR19QTUFDX0JBQ0tMSUdIVAotc3RhdGljIGludCByYWRlb25fc2V0X2JhY2tsaWdodF9lbmFibGUoaW50IG9uLCBpbnQgbGV2ZWwsIHZvaWQgKmRhdGEpOwotc3RhdGljIGludCByYWRlb25fc2V0X2JhY2tsaWdodF9sZXZlbChpbnQgbGV2ZWwsIHZvaWQgKmRhdGEpOwotc3RhdGljIHN0cnVjdCBiYWNrbGlnaHRfY29udHJvbGxlciByYWRlb25fYmFja2xpZ2h0X2NvbnRyb2xsZXIgPSB7Ci0JcmFkZW9uX3NldF9iYWNrbGlnaHRfZW5hYmxlLAotCXJhZGVvbl9zZXRfYmFja2xpZ2h0X2xldmVsCi19OwotI2VuZGlmIC8qIENPTkZJR19QTUFDX0JBQ0tMSUdIVCAqLwotCi0jZW5kaWYgLyogQ09ORklHX1BQQ19PRiAqLwotCiBzdGF0aWMgdm9pZCByYWRlb25fdW5tYXBfUk9NKHN0cnVjdCByYWRlb25mYl9pbmZvICpyaW5mbywgc3RydWN0IHBjaV9kZXYgKmRldikKIHsKIAlpZiAoIXJpbmZvLT5iaW9zX3NlZykKQEAgLTE5MTMsMTE2ICsxODk1LDYgQEAKICAgICAgICAgcmV0dXJuIDA7CiB9CiAKLQotI2lmZGVmIENPTkZJR19QTUFDX0JBQ0tMSUdIVAotCi0vKiBUT0RPOiBEYmwgY2hlY2sgdGhlc2UgdGFibGVzLCB3ZSBkb24ndCBnbyB1cCB0byBmdWxsIE9OIGJhY2tsaWdodAotICogaW4gdGhlc2UsIHBvc3NpYmx5IGJlY2F1c2Ugd2Ugbm90aWNlZCBNYWNPUyBkb2Vzbid0LCBidXQgSSdkIHByZWZlcgotICogaGF2aW5nIHNvbWUgbW9yZSBvZmZpY2lhbCBudW1iZXJzIGZyb20gQVRJCi0gKi8KLXN0YXRpYyBpbnQgYmFja2xpZ2h0X2NvbnZfbTZbXSA9IHsKLQkweGZmLCAweGMwLCAweGI1LCAweGFhLCAweDlmLCAweDk0LCAweDg5LCAweDdlLAotCTB4NzMsIDB4NjgsIDB4NWQsIDB4NTIsIDB4NDcsIDB4M2MsIDB4MzEsIDB4MjQKLX07Ci1zdGF0aWMgaW50IGJhY2tsaWdodF9jb252X203W10gPSB7Ci0JMHgwMCwgMHgzZiwgMHg0YSwgMHg1NSwgMHg2MCwgMHg2YiwgMHg3NiwgMHg4MSwKLQkweDhjLCAweDk3LCAweGEyLCAweGFkLCAweGI4LCAweGMzLCAweGNlLCAweGQ5Ci19OwotCi0jZGVmaW5lIEJBQ0tMSUdIVF9MVkRTX09GRgotI3VuZGVmIEJBQ0tMSUdIVF9EQUNfT0ZGCi0KLS8qIFdlIHR1cm4gb2ZmIHRoZSBMQ0QgY29tcGxldGVseSBpbnN0ZWFkIG9mIGp1c3QgZGltbWluZyB0aGUgYmFja2xpZ2h0LgotICogVGhpcyBwcm92aWRlcyBzb21lIGdyZWF0ZXIgcG93ZXIgc2F2aW5nIGFuZCB0aGUgZGlzcGxheSBpcyB1c2VsZXNzCi0gKiB3aXRob3V0IGJhY2tsaWdodCBhbnl3YXkuCi0gKi8KLXN0YXRpYyBpbnQgcmFkZW9uX3NldF9iYWNrbGlnaHRfZW5hYmxlKGludCBvbiwgaW50IGxldmVsLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCByYWRlb25mYl9pbmZvICpyaW5mbyA9IChzdHJ1Y3QgcmFkZW9uZmJfaW5mbyAqKWRhdGE7Ci0JdTMyIGx2ZHNfZ2VuX2NudGwsIHRtcFBpeGNsa3NDbnRsOwotCWludCogY29udl90YWJsZTsKLQotCWlmIChyaW5mby0+bW9uMV90eXBlICE9IE1UX0xDRCkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBQYXJkb24gbWUgZm9yIHRoYXQgaGFjay4uLiBtYXliZSBzb21lIGRheSB3ZSBjYW4gZmlndXJlCi0JICogb3V0IGluIHdoYXQgZGlyZWN0aW9uIGJhY2tsaWdodCBzaG91bGQgd29yayBvbiBhIGdpdmVuCi0JICogcGFuZWwgPwotCSAqLwotCWlmICgocmluZm8tPmZhbWlseSA9PSBDSElQX0ZBTUlMWV9SVjIwMCB8fAotCSAgICAgcmluZm8tPmZhbWlseSA9PSBDSElQX0ZBTUlMWV9SVjI1MCB8fAotCSAgICAgcmluZm8tPmZhbWlseSA9PSBDSElQX0ZBTUlMWV9SVjI4MCB8fAotCSAgICAgcmluZm8tPmZhbWlseSA9PSBDSElQX0ZBTUlMWV9SVjM1MCkgJiYKLQkgICAgIW1hY2hpbmVfaXNfY29tcGF0aWJsZSgiUG93ZXJCb29rNCwzIikgJiYKLQkgICAgIW1hY2hpbmVfaXNfY29tcGF0aWJsZSgiUG93ZXJCb29rNiwzIikgJiYKLQkgICAgIW1hY2hpbmVfaXNfY29tcGF0aWJsZSgiUG93ZXJCb29rNiw1IikpCi0JCWNvbnZfdGFibGUgPSBiYWNrbGlnaHRfY29udl9tNzsKLQllbHNlCi0JCWNvbnZfdGFibGUgPSBiYWNrbGlnaHRfY29udl9tNjsKLQotCWRlbF90aW1lcl9zeW5jKCZyaW5mby0+bHZkc190aW1lcik7Ci0JcmFkZW9uX2VuZ2luZV9pZGxlKCk7Ci0KLQlsdmRzX2dlbl9jbnRsID0gSU5SRUcoTFZEU19HRU5fQ05UTCk7Ci0JaWYgKG9uICYmIChsZXZlbCA+IEJBQ0tMSUdIVF9PRkYpKSB7Ci0JCWx2ZHNfZ2VuX2NudGwgJj0gfkxWRFNfRElTUExBWV9ESVM7Ci0JCWlmICghKGx2ZHNfZ2VuX2NudGwgJiBMVkRTX0JMT04pIHx8ICEobHZkc19nZW5fY250bCAmIExWRFNfT04pKSB7Ci0JCQlsdmRzX2dlbl9jbnRsIHw9IChyaW5mby0+aW5pdF9zdGF0ZS5sdmRzX2dlbl9jbnRsICYgTFZEU19ESUdPTik7Ci0JCQlsdmRzX2dlbl9jbnRsIHw9IExWRFNfQkxPTiB8IExWRFNfRU47Ci0JCQlPVVRSRUcoTFZEU19HRU5fQ05UTCwgbHZkc19nZW5fY250bCk7Ci0JCQlsdmRzX2dlbl9jbnRsICY9IH5MVkRTX0JMX01PRF9MRVZFTF9NQVNLOwotCQkJbHZkc19nZW5fY250bCB8PSAoY29udl90YWJsZVtsZXZlbF0gPDwKLQkJCQkJICBMVkRTX0JMX01PRF9MRVZFTF9TSElGVCk7Ci0JCQlsdmRzX2dlbl9jbnRsIHw9IExWRFNfT047Ci0JCQlsdmRzX2dlbl9jbnRsIHw9IChyaW5mby0+aW5pdF9zdGF0ZS5sdmRzX2dlbl9jbnRsICYgTFZEU19CTF9NT0RfRU4pOwotCQkJcmluZm8tPnBlbmRpbmdfbHZkc19nZW5fY250bCA9IGx2ZHNfZ2VuX2NudGw7Ci0JCQltb2RfdGltZXIoJnJpbmZvLT5sdmRzX3RpbWVyLAotCQkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMocmluZm8tPnBhbmVsX2luZm8ucHdyX2RlbGF5KSk7Ci0JCX0gZWxzZSB7Ci0JCQlsdmRzX2dlbl9jbnRsICY9IH5MVkRTX0JMX01PRF9MRVZFTF9NQVNLOwotCQkJbHZkc19nZW5fY250bCB8PSAoY29udl90YWJsZVtsZXZlbF0gPDwKLQkJCQkJICBMVkRTX0JMX01PRF9MRVZFTF9TSElGVCk7Ci0JCQlPVVRSRUcoTFZEU19HRU5fQ05UTCwgbHZkc19nZW5fY250bCk7Ci0JCX0KLQkJcmluZm8tPmluaXRfc3RhdGUubHZkc19nZW5fY250bCAmPSB+TFZEU19TVEFURV9NQVNLOwotCQlyaW5mby0+aW5pdF9zdGF0ZS5sdmRzX2dlbl9jbnRsIHw9IHJpbmZvLT5wZW5kaW5nX2x2ZHNfZ2VuX2NudGwKLQkJCSYgTFZEU19TVEFURV9NQVNLOwotCX0gZWxzZSB7Ci0JCS8qIEFzaWMgYnVnLCB3aGVuIHR1cm5pbmcgb2ZmIExWRFNfT04sIHdlIGhhdmUgdG8gbWFrZSBzdXJlCi0JCSAgIFJBREVPTl9QSVhDTEtfTFZEU19BTFdBWVNfT04gYml0IGlzIG9mZgotCQkqLwotCQl0bXBQaXhjbGtzQ250bCA9IElOUExMKFBJWENMS1NfQ05UTCk7Ci0JCWlmIChyaW5mby0+aXNfbW9iaWxpdHkgfHwgcmluZm8tPmlzX0lHUCkKLQkJCU9VVFBMTFAoUElYQ0xLU19DTlRMLCAwLCB+UElYQ0xLX0xWRFNfQUxXQVlTX09OYik7Ci0JCWx2ZHNfZ2VuX2NudGwgJj0gfihMVkRTX0JMX01PRF9MRVZFTF9NQVNLIHwgTFZEU19CTF9NT0RfRU4pOwotCQlsdmRzX2dlbl9jbnRsIHw9IChjb252X3RhYmxlWzBdIDw8Ci0JCQkJICBMVkRTX0JMX01PRF9MRVZFTF9TSElGVCk7Ci0JCWx2ZHNfZ2VuX2NudGwgfD0gTFZEU19ESVNQTEFZX0RJUzsKLQkJT1VUUkVHKExWRFNfR0VOX0NOVEwsIGx2ZHNfZ2VuX2NudGwpOwotCQl1ZGVsYXkoMTAwKTsKLQkJbHZkc19nZW5fY250bCAmPSB+KExWRFNfT04gfCBMVkRTX0VOKTsKLQkJT1VUUkVHKExWRFNfR0VOX0NOVEwsIGx2ZHNfZ2VuX2NudGwpOwotCQlsdmRzX2dlbl9jbnRsICY9IH4oTFZEU19ESUdPTik7Ci0JCXJpbmZvLT5wZW5kaW5nX2x2ZHNfZ2VuX2NudGwgPSBsdmRzX2dlbl9jbnRsOwotCQltb2RfdGltZXIoJnJpbmZvLT5sdmRzX3RpbWVyLAotCQkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhyaW5mby0+cGFuZWxfaW5mby5wd3JfZGVsYXkpKTsKLQkJaWYgKHJpbmZvLT5pc19tb2JpbGl0eSB8fCByaW5mby0+aXNfSUdQKQotCQkJT1VUUExMKFBJWENMS1NfQ05UTCwgdG1wUGl4Y2xrc0NudGwpOwotCX0KLQlyaW5mby0+aW5pdF9zdGF0ZS5sdmRzX2dlbl9jbnRsICY9IH5MVkRTX1NUQVRFX01BU0s7Ci0JcmluZm8tPmluaXRfc3RhdGUubHZkc19nZW5fY250bCB8PSAobHZkc19nZW5fY250bCAmIExWRFNfU1RBVEVfTUFTSyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgaW50IHJhZGVvbl9zZXRfYmFja2xpZ2h0X2xldmVsKGludCBsZXZlbCwgdm9pZCAqZGF0YSkKLXsKLQlyZXR1cm4gcmFkZW9uX3NldF9iYWNrbGlnaHRfZW5hYmxlKDEsIGxldmVsLCBkYXRhKTsKLX0KLSNlbmRpZiAvKiBDT05GSUdfUE1BQ19CQUNLTElHSFQgKi8KLQotCiAvKgogICogVGhpcyByZWNvbmZpZ3VyZSB0aGUgY2FyZCdzIGludGVybmFsIG1lbW9yeSBtYXAuIEluIHRoZW9yeSwgd2UnZCBsaWtlCiAgKiB0byBzZXR1cCB0aGUgY2FyZCdzIG1lbW9yeSBhdCB0aGUgc2FtZSBhZGRyZXNzIGFzIGl0J3MgUENJIGJ1cyBhZGRyZXNzLApAQCAtMjQ3NywxNCArMjM0OSw3IEBACiAJCQkJCQkgTVRSUl9UWVBFX1dSQ09NQiwgMSk7CiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19QTUFDX0JBQ0tMSUdIVAotCWlmIChyaW5mby0+bW9uMV90eXBlID09IE1UX0xDRCkgewotCQlyZWdpc3Rlcl9iYWNrbGlnaHRfY29udHJvbGxlcigmcmFkZW9uX2JhY2tsaWdodF9jb250cm9sbGVyLAotCQkJCQkgICAgICByaW5mbywgImF0aSIpOwotCQlyZWdpc3Rlcl9iYWNrbGlnaHRfY29udHJvbGxlcigmcmFkZW9uX2JhY2tsaWdodF9jb250cm9sbGVyLAotCQkJCQkgICAgICByaW5mbywgIm1uY2EiKTsKLQl9Ci0jZW5kaWYKKwlyYWRlb25mYl9ibF9pbml0KHJpbmZvKTsKIAogCXByaW50ayAoInJhZGVvbmZiICglcyk6ICVzXG4iLCBwY2lfbmFtZShyaW5mby0+cGRldiksIHJpbmZvLT5uYW1lKTsKIApAQCAtMjUxNCw3ICsyMzc5LDYgQEAKIGVycl9yZWxlYXNlX2ZiOgogICAgICAgICBmcmFtZWJ1ZmZlcl9yZWxlYXNlKGluZm8pOwogZXJyX2Rpc2FibGU6Ci0JcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwogZXJyX291dDoKIAlyZXR1cm4gcmV0OwogfQpAQCAtMjUyOCw3ICsyMzkyLDggQEAKICAKICAgICAgICAgaWYgKCFyaW5mbykKICAgICAgICAgICAgICAgICByZXR1cm47Ci0gCisKKwlyYWRlb25mYl9ibF9leGl0KHJpbmZvKTsKIAlyYWRlb25mYl9wbV9leGl0KHJpbmZvKTsKIAogCWlmIChyaW5mby0+bW9uMV9FRElEKQpAQCAtMjU3MCw3ICsyNDM1LDYgQEAKICNlbmRpZiAgICAgICAgCiAJZmJfZGVhbGxvY19jbWFwKCZpbmZvLT5jbWFwKTsKICAgICAgICAgZnJhbWVidWZmZXJfcmVsZWFzZShpbmZvKTsKLQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CiB9CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9hdHkvcmFkZW9uZmIuaCBiL2RyaXZlcnMvdmlkZW8vYXR5L3JhZGVvbmZiLmgKaW5kZXggMjE3ZTAwYS4uMTY0NTk0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9hdHkvcmFkZW9uZmIuaAorKysgYi9kcml2ZXJzL3ZpZGVvL2F0eS9yYWRlb25mYi5oCkBAIC02MjUsNCArNjI1LDEzIEBACiBleHRlcm4gdm9pZCByYWRlb25fd3JpdGVfbW9kZSAoc3RydWN0IHJhZGVvbmZiX2luZm8gKnJpbmZvLCBzdHJ1Y3QgcmFkZW9uX3JlZ3MgKm1vZGUsCiAJCQkgICAgICAgaW50IHJlZ19vbmx5KTsKIAorLyogQmFja2xpZ2h0IGZ1bmN0aW9ucyAqLworI2lmZGVmIENPTkZJR19GQl9SQURFT05fQkFDS0xJR0hUCitleHRlcm4gdm9pZCByYWRlb25mYl9ibF9pbml0KHN0cnVjdCByYWRlb25mYl9pbmZvICpyaW5mbyk7CitleHRlcm4gdm9pZCByYWRlb25mYl9ibF9leGl0KHN0cnVjdCByYWRlb25mYl9pbmZvICpyaW5mbyk7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIHJhZGVvbmZiX2JsX2luaXQoc3RydWN0IHJhZGVvbmZiX2luZm8gKnJpbmZvKSB7fQorc3RhdGljIGlubGluZSB2b2lkIHJhZGVvbmZiX2JsX2V4aXQoc3RydWN0IHJhZGVvbmZiX2luZm8gKnJpbmZvKSB7fQorI2VuZGlmCisKICNlbmRpZiAvKiBfX1JBREVPTkZCX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9hdTExMDBmYi5jIGIvZHJpdmVycy92aWRlby9hdTExMDBmYi5jCmluZGV4IDc4OTQ1MGIuLmQ2M2MzZjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYXUxMTAwZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL2F1MTEwMGZiLmMKQEAgLTcsNiArNyw4IEBACiAgKiAgCUthcmwgTGVzc2FyZCA8a2xlc3NhcmRAc3VucmlzZXRlbGVjb20uY29tPgogICogIAk8Yy5wZWxsZWdyaW5AZXhhZHJvbi5jb20+CiAgKgorICogUE0gc3VwcG9ydCBhZGRlZCBieSBSb2RvbGZvIEdpb21ldHRpIDxnaW9tZXR0aUBsaW51eC5pdD4KKyAqCiAgKiBDb3B5cmlnaHQgMjAwMiBNb250YVZpc3RhIFNvZnR3YXJlCiAgKiBBdXRob3I6IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KICAqCQlwcG9wb3ZAbXZpc3RhLmNvbSBvciBzb3VyY2VAbXZpc3RhLmNvbQpAQCAtNjAyLDE3ICs2MDQsNTIgQEAKIAlyZXR1cm4gMDsKIH0KIAorI2lmZGVmIENPTkZJR19QTQorc3RhdGljIHUzMiBzeXNfY2xrc3JjOworc3RhdGljIHN0cnVjdCBhdTExMDBmYl9yZWdzIGZicmVnczsKKwogaW50IGF1MTEwMGZiX2Rydl9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQogewotCS8qIFRPRE8gKi8KKwlzdHJ1Y3QgYXUxMTAwZmJfZGV2aWNlICpmYmRldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJaWYgKCFmYmRldikKKwkJcmV0dXJuIDA7CisKKwkvKiBTYXZlIHRoZSBjbG9jayBzb3VyY2Ugc3RhdGUgKi8KKwlzeXNfY2xrc3JjID0gYXVfcmVhZGwoU1lTX0NMS1NSQyk7CisKKwkvKiBCbGFuayB0aGUgTENEICovCisJYXUxMTAwZmJfZmJfYmxhbmsoVkVTQV9QT1dFUkRPV04sICZmYmRldi0+aW5mbyk7CisKKwkvKiBTdG9wIExDRCBjbG9ja2luZyAqLworCWF1X3dyaXRlbChzeXNfY2xrc3JjICYgflNZU19DU19NTF9NQVNLLCBTWVNfQ0xLU1JDKTsKKworCW1lbWNweSgmZmJyZWdzLCBmYmRldi0+cmVncywgc2l6ZW9mKHN0cnVjdCBhdTExMDBmYl9yZWdzKSk7CisKIAlyZXR1cm4gMDsKIH0KIAogaW50IGF1MTEwMGZiX2Rydl9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQogewotCS8qIFRPRE8gKi8KKwlzdHJ1Y3QgYXUxMTAwZmJfZGV2aWNlICpmYmRldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJaWYgKCFmYmRldikKKwkJcmV0dXJuIDA7CisKKwltZW1jcHkoZmJkZXYtPnJlZ3MsICZmYnJlZ3MsIHNpemVvZihzdHJ1Y3QgYXUxMTAwZmJfcmVncykpOworCisJLyogUmVzdGFydCBMQ0QgY2xvY2tpbmcgKi8KKwlhdV93cml0ZWwoc3lzX2Nsa3NyYywgU1lTX0NMS1NSQyk7CisKKwkvKiBVbmJsYW5rIHRoZSBMQ0QgKi8KKwlhdTExMDBmYl9mYl9ibGFuayhWRVNBX05PX0JMQU5LSU5HLCAmZmJkZXYtPmluZm8pOworCiAJcmV0dXJuIDA7CiB9CisjZWxzZQorI2RlZmluZSBhdTExMDBmYl9kcnZfc3VzcGVuZCBOVUxMCisjZGVmaW5lIGF1MTEwMGZiX2Rydl9yZXN1bWUgTlVMTAorI2VuZGlmCiAKIHN0YXRpYyBzdHJ1Y3QgZGV2aWNlX2RyaXZlciBhdTExMDBmYl9kcml2ZXIgPSB7CiAJLm5hbWUJCT0gImF1MTEwMC1sY2QiLApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvS2NvbmZpZyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L0tjb25maWcKaW5kZXggYjg5NWVhYS4uMDIyZjlkMyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvS2NvbmZpZworKysgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9LY29uZmlnCkBAIC0xMCw3ICsxMCw3IEBACiAKIGNvbmZpZyBCQUNLTElHSFRfQ0xBU1NfREVWSUNFCiAgICAgICAgIHRyaXN0YXRlICJMb3dsZXZlbCBCYWNrbGlnaHQgY29udHJvbHMiCi0JZGVwZW5kcyBvbiBCQUNLTElHSFRfTENEX1NVUFBPUlQKKwlkZXBlbmRzIG9uIEJBQ0tMSUdIVF9MQ0RfU1VQUE9SVCAmJiBGQgogCWRlZmF1bHQgbQogCWhlbHAKIAkgIFRoaXMgZnJhbWV3b3JrIGFkZHMgc3VwcG9ydCBmb3IgbG93LWxldmVsIGNvbnRyb2wgb2YgdGhlIExDRApAQCAtMjYsNyArMjYsNyBAQAogCiBjb25maWcgTENEX0NMQVNTX0RFVklDRQogICAgICAgICB0cmlzdGF0ZSAiTG93bGV2ZWwgTENEIGNvbnRyb2xzIgotCWRlcGVuZHMgb24gQkFDS0xJR0hUX0xDRF9TVVBQT1JUCisJZGVwZW5kcyBvbiBCQUNLTElHSFRfTENEX1NVUFBPUlQgJiYgRkIKIAlkZWZhdWx0IG0KIAloZWxwCiAJICBUaGlzIGZyYW1ld29yayBhZGRzIHN1cHBvcnQgZm9yIGxvdy1sZXZlbCBjb250cm9sIG9mIExDRC4KQEAgLTUwLDYgKzUwLDE0IEBACiAJICBJZiB5b3UgaGF2ZSBhIFNoYXJwIFphdXJ1cyBTTC1DN3h4LCBTTC1DeHgwMCBvciBTTC02MDAweCBzYXkgeSB0byBlbmFibGUgdGhlCiAJICBiYWNrbGlnaHQgZHJpdmVyLgogCitjb25maWcgQkFDS0xJR0hUX0xPQ09NTworCXRyaXN0YXRlICJTaGFycCBMT0NPTU8gTENEL0JhY2tsaWdodCBEcml2ZXIiCisJZGVwZW5kcyBvbiBCQUNLTElHSFRfREVWSUNFICYmIFNIQVJQX0xPQ09NTworCWRlZmF1bHQgeQorCWhlbHAKKwkgIElmIHlvdSBoYXZlIGEgU2hhcnAgWmF1cnVzIFNMLTU1MDAgKENvbGxpZSkgb3IgU0wtNTYwMCAoUG9vZGxlKSBzYXkgeSB0bworCSAgZW5hYmxlIHRoZSBMQ0QvYmFja2xpZ2h0IGRyaXZlci4KKwogY29uZmlnIEJBQ0tMSUdIVF9IUDY4MAogCXRyaXN0YXRlICJIUCBKb3JuYWRhIDY4MCBCYWNrbGlnaHQgRHJpdmVyIgogCWRlcGVuZHMgb24gQkFDS0xJR0hUX0RFVklDRSAmJiBTSF9IUDZYWApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvTWFrZWZpbGUgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9NYWtlZmlsZQppbmRleCA3NDQyMTBjLi42NWU1NTUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9NYWtlZmlsZQpAQCAtNCw0ICs0LDQgQEAKIG9iai0kKENPTkZJR19CQUNLTElHSFRfQ0xBU1NfREVWSUNFKSArPSBiYWNrbGlnaHQubwogb2JqLSQoQ09ORklHX0JBQ0tMSUdIVF9DT1JHSSkJKz0gY29yZ2lfYmwubwogb2JqLSQoQ09ORklHX0JBQ0tMSUdIVF9IUDY4MCkJKz0gaHA2ODBfYmwubwotb2JqLSQoQ09ORklHX1NIQVJQX0xPQ09NTykJKz0gbG9jb21vbGNkLm8KK29iai0kKENPTkZJR19CQUNLTElHSFRfTE9DT01PKQkrPSBsb2NvbW9sY2QubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvbG9jb21vbGNkLmMgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9sb2NvbW9sY2QuYwppbmRleCA2MDgzMWJiLi5iZDg3OWI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9sb2NvbW9sY2QuYworKysgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9sb2NvbW9sY2QuYwpAQCAtMTcsNiArMTcsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZmIuaD4KKyNpbmNsdWRlIDxsaW51eC9iYWNrbGlnaHQuaD4KIAogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9sb2NvbW8uaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CkBAIC0yNSw3ICsyNywxMCBAQAogCiAjaW5jbHVkZSAiLi4vLi4vLi4vYXJjaC9hcm0vbWFjaC1zYTExMDAvZ2VuZXJpYy5oIgogCitzdGF0aWMgc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmxvY29tb2xjZF9ibF9kZXZpY2U7CiBzdGF0aWMgc3RydWN0IGxvY29tb19kZXYgKmxvY29tb2xjZF9kZXY7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb2NvbW9sY2RfZmxhZ3M7CisjZGVmaW5lIExPQ09NT0xDRF9TVVNQRU5ERUQgICAgIDB4MDEKIAogc3RhdGljIHZvaWQgbG9jb21vbGNkX29uKGludCBjb21hZGopCiB7CkBAIC04OSwxMiArOTQsMTAgQEAKIAl9CiAKIAkvKiByZWFkIGNvbWFkaiAqLwotCWlmIChjb21hZGogPT0gLTEpIHsKLQkJaWYgKG1hY2hpbmVfaXNfcG9vZGxlKCkpCi0JCQljb21hZGogPSAxMTg7Ci0JCWlmIChtYWNoaW5lX2lzX2NvbGxpZSgpKQotCQkJY29tYWRqID0gMTI4OwotCX0KKwlpZiAoY29tYWRqID09IC0xICYmIG1hY2hpbmVfaXNfY29sbGllKCkpCisJCWNvbWFkaiA9IDEyODsKKwlpZiAoY29tYWRqID09IC0xICYmIG1hY2hpbmVfaXNfcG9vZGxlKCkpCisJCWNvbWFkaiA9IDExODsKIAogCWlmIChvbikKIAkJbG9jb21vbGNkX29uKGNvbWFkaik7CkBAIC0xMDUsMjYgKzEwOCwxMDAgQEAKIH0KIEVYUE9SVF9TWU1CT0wobG9jb21vbGNkX3Bvd2VyKTsKIAotc3RhdGljIGludCBwb29kbGVfbGNkX3Byb2JlKHN0cnVjdCBsb2NvbW9fZGV2ICpkZXYpCisKK3N0YXRpYyBpbnQgY3VycmVudF9pbnRlbnNpdHk7CisKK3N0YXRpYyBpbnQgbG9jb21vbGNkX3NldF9pbnRlbnNpdHkoc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkKQoreworCWludCBpbnRlbnNpdHkgPSBiZC0+cHJvcHMtPmJyaWdodG5lc3M7CisKKwlpZiAoYmQtPnByb3BzLT5wb3dlciAhPSBGQl9CTEFOS19VTkJMQU5LKQorCQlpbnRlbnNpdHkgPSAwOworCWlmIChiZC0+cHJvcHMtPmZiX2JsYW5rICE9IEZCX0JMQU5LX1VOQkxBTkspCisJCWludGVuc2l0eSA9IDA7CisJaWYgKGxvY29tb2xjZF9mbGFncyAmIExPQ09NT0xDRF9TVVNQRU5ERUQpCisJCWludGVuc2l0eSA9IDA7CisKKwlzd2l0Y2ggKGludGVuc2l0eSkgeworCS8qIEFDIGFuZCBub24tQUMgYXJlIGhhbmRsZWQgZGlmZmVyZW50bHksIGJ1dCBwcm9kdWNlIHNhbWUgcmVzdWx0cyBpbiBzaGFycCBjb2RlPyAqLworCWNhc2UgMDogbG9jb21vX2Zyb250bGlnaHRfc2V0KGxvY29tb2xjZF9kZXYsIDAsIDAsIDE2MSk7IGJyZWFrOworCWNhc2UgMTogbG9jb21vX2Zyb250bGlnaHRfc2V0KGxvY29tb2xjZF9kZXYsIDExNywgMCwgMTYxKTsgYnJlYWs7CisJY2FzZSAyOiBsb2NvbW9fZnJvbnRsaWdodF9zZXQobG9jb21vbGNkX2RldiwgMTYzLCAwLCAxNDgpOyBicmVhazsKKwljYXNlIDM6IGxvY29tb19mcm9udGxpZ2h0X3NldChsb2NvbW9sY2RfZGV2LCAxOTQsIDAsIDE2MSk7IGJyZWFrOworCWNhc2UgNDogbG9jb21vX2Zyb250bGlnaHRfc2V0KGxvY29tb2xjZF9kZXYsIDE5NCwgMSwgMTYxKTsgYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJY3VycmVudF9pbnRlbnNpdHkgPSBpbnRlbnNpdHk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbG9jb21vbGNkX2dldF9pbnRlbnNpdHkoc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkKQoreworCXJldHVybiBjdXJyZW50X2ludGVuc2l0eTsKK30KKworc3RhdGljIHN0cnVjdCBiYWNrbGlnaHRfcHJvcGVydGllcyBsb2NvbW9ibF9kYXRhID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuZ2V0X2JyaWdodG5lc3MgPSBsb2NvbW9sY2RfZ2V0X2ludGVuc2l0eSwKKwkudXBkYXRlX3N0YXR1cyAgPSBsb2NvbW9sY2Rfc2V0X2ludGVuc2l0eSwKKwkubWF4X2JyaWdodG5lc3MgPSA0LAorfTsKKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBsb2NvbW9sY2Rfc3VzcGVuZChzdHJ1Y3QgbG9jb21vX2RldiAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJbG9jb21vbGNkX2ZsYWdzIHw9IExPQ09NT0xDRF9TVVNQRU5ERUQ7CisJbG9jb21vbGNkX3NldF9pbnRlbnNpdHkobG9jb21vbGNkX2JsX2RldmljZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbG9jb21vbGNkX3Jlc3VtZShzdHJ1Y3QgbG9jb21vX2RldiAqZGV2KQoreworCWxvY29tb2xjZF9mbGFncyAmPSB+TE9DT01PTENEX1NVU1BFTkRFRDsKKwlsb2NvbW9sY2Rfc2V0X2ludGVuc2l0eShsb2NvbW9sY2RfYmxfZGV2aWNlKTsKKwlyZXR1cm4gMDsKK30KKyNlbHNlCisjZGVmaW5lIGxvY29tb2xjZF9zdXNwZW5kCU5VTEwKKyNkZWZpbmUgbG9jb21vbGNkX3Jlc3VtZQlOVUxMCisjZW5kaWYKKworc3RhdGljIGludCBsb2NvbW9sY2RfcHJvYmUoc3RydWN0IGxvY29tb19kZXYgKmRldikKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCWxvY29tb2xjZF9kZXYgPSBkZXY7CiAKKwlsb2NvbW9fZ3Bpb19zZXRfZGlyKGRldiwgTE9DT01PX0dQSU9fRkxfVlIsIDApOworCiAJLyogdGhlIHBvb2RsZV9sY2RfcG93ZXIgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciB0aGUgZmlyc3QgdGltZQogCSAqIGZyb20gZnNfaW5pdGNhbGwsIHdoaWNoIGlzIGJlZm9yZSBsb2NvbW8gaXMgYWN0aXZhdGVkLgogCSAqIFdlIG5lZWQgdG8gcmVjYWxsIHBvb2RsZV9sY2RfcG93ZXIgaGVyZSovCi0jaWZkZWYgQ09ORklHX01BQ0hfUE9PRExFCi0JbG9jb21vbGNkX3Bvd2VyKDEpOwotI2VuZGlmCisJaWYgKG1hY2hpbmVfaXNfcG9vZGxlKCkpCisJCWxvY29tb2xjZF9wb3dlcigxKTsKKwogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCWxvY29tb2xjZF9ibF9kZXZpY2UgPSBiYWNrbGlnaHRfZGV2aWNlX3JlZ2lzdGVyKCJsb2NvbW8tYmwiLCBOVUxMLCAmbG9jb21vYmxfZGF0YSk7CisKKwlpZiAoSVNfRVJSIChsb2NvbW9sY2RfYmxfZGV2aWNlKSkKKwkJcmV0dXJuIFBUUl9FUlIgKGxvY29tb2xjZF9ibF9kZXZpY2UpOworCisJLyogU2V0IHVwIGZyb250bGlnaHQgc28gdGhhdCBzY3JlZW4gaXMgcmVhZGFibGUgKi8KKwlsb2NvbW9ibF9kYXRhLmJyaWdodG5lc3MgPSAyOworCWxvY29tb2xjZF9zZXRfaW50ZW5zaXR5KGxvY29tb2xjZF9ibF9kZXZpY2UpOworCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcG9vZGxlX2xjZF9yZW1vdmUoc3RydWN0IGxvY29tb19kZXYgKmRldikKK3N0YXRpYyBpbnQgbG9jb21vbGNkX3JlbW92ZShzdHJ1Y3QgbG9jb21vX2RldiAqZGV2KQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwliYWNrbGlnaHRfZGV2aWNlX3VucmVnaXN0ZXIobG9jb21vbGNkX2JsX2RldmljZSk7CiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCWxvY29tb2xjZF9kZXYgPSBOVUxMOwogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKQEAgLTEzNiwxOSArMjEzLDMzIEBACiAJCS5uYW1lID0gImxvY29tby1iYWNrbGlnaHQiLAogCX0sCiAJLmRldmlkCT0gTE9DT01PX0RFVklEX0JBQ0tMSUdIVCwKLQkucHJvYmUJPSBwb29kbGVfbGNkX3Byb2JlLAotCS5yZW1vdmUJPSBwb29kbGVfbGNkX3JlbW92ZSwKKwkucHJvYmUJPSBsb2NvbW9sY2RfcHJvYmUsCisJLnJlbW92ZQk9IGxvY29tb2xjZF9yZW1vdmUsCisJLnN1c3BlbmQgPSBsb2NvbW9sY2Rfc3VzcGVuZCwKKwkucmVzdW1lID0gbG9jb21vbGNkX3Jlc3VtZSwKIH07CiAKLXN0YXRpYyBpbnQgX19pbml0IHBvb2RsZV9sY2RfaW5pdCh2b2lkKQorCitzdGF0aWMgaW50IF9faW5pdCBsb2NvbW9sY2RfaW5pdCh2b2lkKQogewogCWludCByZXQgPSBsb2NvbW9fZHJpdmVyX3JlZ2lzdGVyKCZwb29kbGVfbGNkX2RyaXZlcik7Ci0JaWYgKHJldCkgcmV0dXJuIHJldDsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCiAjaWZkZWYgQ09ORklHX1NBMTEwMF9DT0xMSUUKIAlzYTExMDBmYl9sY2RfcG93ZXIgPSBsb2NvbW9sY2RfcG93ZXI7CiAjZW5kaWYKIAlyZXR1cm4gMDsKIH0KLWRldmljZV9pbml0Y2FsbChwb29kbGVfbGNkX2luaXQpOwogCitzdGF0aWMgdm9pZCBfX2V4aXQgbG9jb21vbGNkX2V4aXQodm9pZCkKK3sKKwlsb2NvbW9fZHJpdmVyX3VucmVnaXN0ZXIoJnBvb2RsZV9sY2RfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQobG9jb21vbGNkX2luaXQpOworbW9kdWxlX2V4aXQobG9jb21vbGNkX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJKb2huIExlbnogPGxlbnpAY3Mud2lzYy5lZHU+LCBQYXZlbCBNYWNoZWsgPHBhdmVsQHN1c2UuY3o+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNvbGxpZSBMQ0QgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2NmYmltZ2JsdC5jIGIvZHJpdmVycy92aWRlby9jZmJpbWdibHQuYwppbmRleCA4YmE2MTUyLi5hZDhhODliIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2NmYmltZ2JsdC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vY2ZiaW1nYmx0LmMKQEAgLTIzMCw2ICsyMzAsNyBAQAogCQl0YWIgPSBjZmJfdGFiMTY7CiAJCWJyZWFrOwogCWNhc2UgMzI6CisJZGVmYXVsdDoKIAkJdGFiID0gY2ZiX3RhYjMyOwogCQlicmVhazsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2NoaXBzZmIuYyBiL2RyaXZlcnMvdmlkZW8vY2hpcHNmYi5jCmluZGV4IDcyZmY2YmYuLmQ3NmJiZmFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2NoaXBzZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL2NoaXBzZmIuYwpAQCAtMTQ4LDkgKzE0OCwyNCBAQAogc3RhdGljIGludCBjaGlwc2ZiX2JsYW5rKGludCBibGFuaywgc3RydWN0IGZiX2luZm8gKmluZm8pCiB7CiAjaWZkZWYgQ09ORklHX1BNQUNfQkFDS0xJR0hUCi0JLy8gdXNlZCB0byBkaXNhYmxlIGJhY2tsaWdodCBvbmx5IGZvciBibGFuayA+IDEsIGJ1dCBpdCBzZWVtcwotCS8vIHVzZWZ1bCBhdCBibGFuayA9IDEgdG9vIChzYXZlcyBiYXR0ZXJ5LCBleHRlbmRzIGJhY2tsaWdodCBsaWZlKQotCXNldF9iYWNrbGlnaHRfZW5hYmxlKCFibGFuayk7CisJbXV0ZXhfbG9jaygmcG1hY19iYWNrbGlnaHRfbXV0ZXgpOworCisJaWYgKHBtYWNfYmFja2xpZ2h0KSB7CisJCWRvd24oJnBtYWNfYmFja2xpZ2h0LT5zZW0pOworCisJCS8qIHVzZWQgdG8gZGlzYWJsZSBiYWNrbGlnaHQgb25seSBmb3IgYmxhbmsgPiAxLCBidXQgaXQgc2VlbXMKKwkJICogdXNlZnVsIGF0IGJsYW5rID0gMSB0b28gKHNhdmVzIGJhdHRlcnksIGV4dGVuZHMgYmFja2xpZ2h0CisJCSAqIGxpZmUpCisJIAkgKi8KKwkJaWYgKGJsYW5rKQorCQkJcG1hY19iYWNrbGlnaHQtPnByb3BzLT5wb3dlciA9IEZCX0JMQU5LX1BPV0VSRE9XTjsKKwkJZWxzZQorCQkJcG1hY19iYWNrbGlnaHQtPnByb3BzLT5wb3dlciA9IEZCX0JMQU5LX1VOQkxBTks7CisJCXBtYWNfYmFja2xpZ2h0LT5wcm9wcy0+dXBkYXRlX3N0YXR1cyhwbWFjX2JhY2tsaWdodCk7CisJCXVwKCZwbWFjX2JhY2tsaWdodC0+c2VtKTsKKwl9CisKKwltdXRleF91bmxvY2soJnBtYWNfYmFja2xpZ2h0X211dGV4KTsKICNlbmRpZiAvKiBDT05GSUdfUE1BQ19CQUNLTElHSFQgKi8KIAogCXJldHVybiAxOwkvKiBnZXQgZmJfYmxhbmsgdG8gc2V0IHRoZSBjb2xvcm1hcCB0byBhbGwgYmxhY2sgKi8KQEAgLTQwMSw3ICs0MTYsMTQgQEAKIAogI2lmZGVmIENPTkZJR19QTUFDX0JBQ0tMSUdIVAogCS8qIHR1cm4gb24gdGhlIGJhY2tsaWdodCAqLwotCXNldF9iYWNrbGlnaHRfZW5hYmxlKDEpOworCW11dGV4X2xvY2soJnBtYWNfYmFja2xpZ2h0X211dGV4KTsKKwlpZiAocG1hY19iYWNrbGlnaHQpIHsKKwkJZG93bigmcG1hY19iYWNrbGlnaHQtPnNlbSk7CisJCXBtYWNfYmFja2xpZ2h0LT5wcm9wcy0+cG93ZXIgPSBGQl9CTEFOS19VTkJMQU5LOworCQlwbWFjX2JhY2tsaWdodC0+cHJvcHMtPnVwZGF0ZV9zdGF0dXMocG1hY19iYWNrbGlnaHQpOworCQl1cCgmcG1hY19iYWNrbGlnaHQtPnNlbSk7CisJfQorCW11dGV4X3VubG9jaygmcG1hY19iYWNrbGlnaHRfbXV0ZXgpOwogI2VuZGlmIC8qIENPTkZJR19QTUFDX0JBQ0tMSUdIVCAqLwogCiAjaWZkZWYgQ09ORklHX1BQQwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9jaXJydXNmYi5jIGIvZHJpdmVycy92aWRlby9jaXJydXNmYi5jCmluZGV4IDExMDMwMTAuLmRkYTI0MGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vY2lycnVzZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL2NpcnJ1c2ZiLmMKQEAgLTIyMjcsNyArMjIyNyw2IEBACiAJCXJlbGVhc2VfcmVnaW9uKDB4M0MwLCAzMik7CiAJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKIAlmcmFtZWJ1ZmZlcl9yZWxlYXNlKGNpbmZvLT5pbmZvKTsKLQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CiB9CiAjZW5kaWYgLyogQ09ORklHX1BDSSAqLwogCkBAIC0yNDU4LDcgKzI0NTcsNiBAQAogZXJyX3JlbGVhc2VfZmI6CiAJZnJhbWVidWZmZXJfcmVsZWFzZShpbmZvKTsKIGVycl9kaXNhYmxlOgotCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKIGVycl9vdXQ6CiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vY29uc29sZS9mYmNvbi5jIGIvZHJpdmVycy92aWRlby9jb25zb2xlL2ZiY29uLmMKaW5kZXggNDdiYTFhNy4uNWRjNDA4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9jb25zb2xlL2ZiY29uLmMKKysrIGIvZHJpdmVycy92aWRlby9jb25zb2xlL2ZiY29uLmMKQEAgLTEyNSw2ICsxMjUsOCBAQAogc3RhdGljIGludCBmaXJzdF9mYl92YzsKIHN0YXRpYyBpbnQgbGFzdF9mYl92YyA9IE1BWF9OUl9DT05TT0xFUyAtIDE7CiBzdGF0aWMgaW50IGZiY29uX2lzX2RlZmF1bHQgPSAxOyAKK3N0YXRpYyBpbnQgZmJjb25faGFzX2V4aXRlZDsKKwogLyogZm9udCBkYXRhICovCiBzdGF0aWMgY2hhciBmb250bmFtZVs0MF07CiAKQEAgLTE0MCw3ICsxNDIsNiBAQAogCiAjZGVmaW5lIGFkdmFuY2Vfcm93KHAsIGRlbHRhKSAodW5zaWduZWQgc2hvcnQgKikoKHVuc2lnbmVkIGxvbmcpKHApICsgKGRlbHRhKSAqIHZjLT52Y19zaXplX3JvdykKIAotc3RhdGljIHZvaWQgZmJjb25fZnJlZV9mb250KHN0cnVjdCBkaXNwbGF5ICopOwogc3RhdGljIGludCBmYmNvbl9zZXRfb3JpZ2luKHN0cnVjdCB2Y19kYXRhICopOwogCiAjZGVmaW5lIENVUlNPUl9EUkFXX0RFTEFZCQkoMSkKQEAgLTE5NCw2ICsxOTUsOSBAQAogCQkJICAgICAgaW50IGxpbmUsIGludCBjb3VudCwgaW50IGR5KTsKIHN0YXRpYyB2b2lkIGZiY29uX21vZGVjaGFuZ2VkKHN0cnVjdCBmYl9pbmZvICppbmZvKTsKIHN0YXRpYyB2b2lkIGZiY29uX3NldF9hbGxfdmNzKHN0cnVjdCBmYl9pbmZvICppbmZvKTsKK3N0YXRpYyB2b2lkIGZiY29uX3N0YXJ0KHZvaWQpOworc3RhdGljIHZvaWQgZmJjb25fZXhpdCh2b2lkKTsKK3N0YXRpYyBzdHJ1Y3QgY2xhc3NfZGV2aWNlICpmYmNvbl9jbGFzc19kZXZpY2U7CiAKICNpZmRlZiBDT05GSUdfTUFDCiAvKgpAQCAtMjUyLDcgKzI1Niw3IEBACiAJaWYgKCFvcHMgfHwgb3BzLT5jdXJyY29uIDwgMCB8fCByb3RhdGUgPiAzKQogCQlyZXR1cm47CiAKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX05SX0NPTlNPTEVTOyBpKyspIHsKKwlmb3IgKGkgPSBmaXJzdF9mYl92YzsgaSA8PSBsYXN0X2ZiX3ZjOyBpKyspIHsKIAkJdmMgPSB2Y19jb25zW2ldLmQ7CiAJCWlmICghdmMgfHwgdmMtPnZjX21vZGUgIT0gS0RfVEVYVCB8fAogCQkgICAgcmVnaXN0ZXJlZF9mYltjb24yZmJfbWFwW2ldXSAhPSBpbmZvKQpAQCAtMzg5LDE1ICszOTMsMTggQEAKIAlpbnQgYzsKIAlpbnQgbW9kZTsKIAotCWlmIChvcHMtPmN1cnJjb24gIT0gLTEpCisJYWNxdWlyZV9jb25zb2xlX3NlbSgpOworCWlmIChvcHMgJiYgb3BzLT5jdXJyY29uICE9IC0xKQogCQl2YyA9IHZjX2NvbnNbb3BzLT5jdXJyY29uXS5kOwogCiAJaWYgKCF2YyB8fCAhQ09OX0lTX1ZJU0lCTEUodmMpIHx8CiAJICAgIGZiY29uX2lzX2luYWN0aXZlKHZjLCBpbmZvKSB8fAogIAkgICAgcmVnaXN0ZXJlZF9mYltjb24yZmJfbWFwW3ZjLT52Y19udW1dXSAhPSBpbmZvIHx8Ci0JICAgIHZjX2NvbnNbb3BzLT5jdXJyY29uXS5kLT52Y19kZWNjbSAhPSAxKQorCSAgICB2Y19jb25zW29wcy0+Y3VycmNvbl0uZC0+dmNfZGVjY20gIT0gMSkgeworCQlyZWxlYXNlX2NvbnNvbGVfc2VtKCk7CiAJCXJldHVybjsKLQlhY3F1aXJlX2NvbnNvbGVfc2VtKCk7CisJfQorCiAJcCA9ICZmYl9kaXNwbGF5W3ZjLT52Y19udW1dOwogCWMgPSBzY3JfcmVhZHcoKHUxNiAqKSB2Yy0+dmNfcG9zKTsKIAltb2RlID0gKCFvcHMtPmN1cnNvcl9mbGFzaCB8fCBvcHMtPmN1cnNvcl9zdGF0ZS5lbmFibGUpID8KQEAgLTUyOCw3ICs1MzUsNyBAQAogewogCWludCBpLCByZXR2YWwgPSAwOwogCi0JZm9yIChpID0gMDsgaSA8IE1BWF9OUl9DT05TT0xFUzsgaSsrKSB7CisJZm9yIChpID0gZmlyc3RfZmJfdmM7IGkgPD0gbGFzdF9mYl92YzsgaSsrKSB7CiAJCWlmIChjb24yZmJfbWFwW2ldID09IGlkeCkKIAkJCXJldHZhbCA9IDE7CiAJfQpAQCAtNTM5LDcgKzU0Niw3IEBACiB7CiAJaW50IGksIHJldHZhbCA9IDA7CiAKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX05SX0NPTlNPTEVTOyBpKyspIHsKKwlmb3IgKGkgPSBmaXJzdF9mYl92YzsgaSA8PSBsYXN0X2ZiX3ZjOyBpKyspIHsKIAkJaWYgKGNvbjJmYl9tYXBbaV0gIT0gLTEpCiAJCQlyZXR2YWwgPSAxOwogCX0KQEAgLTU2MSw2ICs1NjgsNyBAQAogCiAJZXJyID0gdGFrZV9vdmVyX2NvbnNvbGUoJmZiX2NvbiwgZmlyc3RfZmJfdmMsIGxhc3RfZmJfdmMsCiAJCQkJZmJjb25faXNfZGVmYXVsdCk7CisKIAlpZiAoZXJyKSB7CiAJCWZvciAoaSA9IGZpcnN0X2ZiX3ZjOyBpIDw9IGxhc3RfZmJfdmM7IGkrKykgewogCQkJY29uMmZiX21hcFtpXSA9IC0xOwpAQCAtNzk1LDggKzgwMyw4IEBACiAJaWYgKG9sZGlkeCA9PSBuZXdpZHgpCiAJCXJldHVybiAwOwogCi0JaWYgKCFpbmZvKQotIAkJZXJyID0gIC1FSU5WQUw7CisJaWYgKCFpbmZvIHx8IGZiY29uX2hhc19leGl0ZWQpCisJCXJldHVybiAtRUlOVkFMOwogCiAgCWlmICghZXJyICYmICFzZWFyY2hfZm9yX21hcHBlZF9jb24oKSkgewogCQlpbmZvX2lkeCA9IG5ld2lkeDsKQEAgLTgzMiw2ICs4NDAsOSBAQAogIAkJY29uMmZiX2luaXRfZGlzcGxheSh2YywgaW5mbywgdW5pdCwgc2hvd19sb2dvKTsKIAl9CiAKKwlpZiAoIXNlYXJjaF9mYl9pbl9tYXAoaW5mb19pZHgpKQorCQlpbmZvX2lkeCA9IG5ld2lkeDsKKwogCXJlbGVhc2VfY29uc29sZV9zZW0oKTsKICAJcmV0dXJuIGVycjsKIH0KQEAgLTEwMzQsNiArMTA0NSw3IEBACiAjZW5kaWYJCQkJLyogQ09ORklHX01BQyAqLwogCiAJZmJjb25fYWRkX2N1cnNvcl90aW1lcihpbmZvKTsKKwlmYmNvbl9oYXNfZXhpdGVkID0gMDsKIAlyZXR1cm4gZGlzcGxheV9kZXNjOwogfQogCkBAIC0xMDYxLDE3ICsxMDczLDM2IEBACiAKIAkvKiBJZiB3ZSBhcmUgbm90IHRoZSBmaXJzdCBjb25zb2xlIG9uIHRoaXMKIAkgICBmYiwgY29weSB0aGUgZm9udCBmcm9tIHRoYXQgY29uc29sZSAqLwotCXQgPSAmZmJfZGlzcGxheVtzdmMtPnZjX251bV07Ci0JaWYgKCF2Yy0+dmNfZm9udC5kYXRhKSB7Ci0JCXZjLT52Y19mb250LmRhdGEgPSAodm9pZCAqKShwLT5mb250ZGF0YSA9IHQtPmZvbnRkYXRhKTsKLQkJdmMtPnZjX2ZvbnQud2lkdGggPSAoKmRlZmF1bHRfbW9kZSktPnZjX2ZvbnQud2lkdGg7Ci0JCXZjLT52Y19mb250LmhlaWdodCA9ICgqZGVmYXVsdF9tb2RlKS0+dmNfZm9udC5oZWlnaHQ7Ci0JCXAtPnVzZXJmb250ID0gdC0+dXNlcmZvbnQ7Ci0JCWlmIChwLT51c2VyZm9udCkKLQkJCVJFRkNPVU5UKHAtPmZvbnRkYXRhKSsrOworCXQgPSAmZmJfZGlzcGxheVtmZ19jb25zb2xlXTsKKwlpZiAoIXAtPmZvbnRkYXRhKSB7CisJCWlmICh0LT5mb250ZGF0YSkgeworCQkJc3RydWN0IHZjX2RhdGEgKmZ2YyA9IHZjX2NvbnNbZmdfY29uc29sZV0uZDsKKworCQkJdmMtPnZjX2ZvbnQuZGF0YSA9ICh2b2lkICopKHAtPmZvbnRkYXRhID0KKwkJCQkJCSAgICBmdmMtPnZjX2ZvbnQuZGF0YSk7CisJCQl2Yy0+dmNfZm9udC53aWR0aCA9IGZ2Yy0+dmNfZm9udC53aWR0aDsKKwkJCXZjLT52Y19mb250LmhlaWdodCA9IGZ2Yy0+dmNfZm9udC5oZWlnaHQ7CisJCQlwLT51c2VyZm9udCA9IHQtPnVzZXJmb250OworCisJCQlpZiAocC0+dXNlcmZvbnQpCisJCQkJUkVGQ09VTlQocC0+Zm9udGRhdGEpKys7CisJCX0gZWxzZSB7CisJCQljb25zdCBzdHJ1Y3QgZm9udF9kZXNjICpmb250ID0gTlVMTDsKKworCQkJaWYgKCFmb250bmFtZVswXSB8fCAhKGZvbnQgPSBmaW5kX2ZvbnQoZm9udG5hbWUpKSkKKwkJCQlmb250ID0gZ2V0X2RlZmF1bHRfZm9udChpbmZvLT52YXIueHJlcywKKwkJCQkJCQlpbmZvLT52YXIueXJlcyk7CisJCQl2Yy0+dmNfZm9udC53aWR0aCA9IGZvbnQtPndpZHRoOworCQkJdmMtPnZjX2ZvbnQuaGVpZ2h0ID0gZm9udC0+aGVpZ2h0OworCQkJdmMtPnZjX2ZvbnQuZGF0YSA9ICh2b2lkICopKHAtPmZvbnRkYXRhID0gZm9udC0+ZGF0YSk7CisJCQl2Yy0+dmNfZm9udC5jaGFyY291bnQgPSAyNTY7IC8qIEZJWE1FICBOZWVkIHRvCisJCQkJCQkJc3VwcG9ydCBtb3JlIGZvbnRzICovCisJCX0KIAl9CisKIAlpZiAocC0+dXNlcmZvbnQpCiAJCWNoYXJjbnQgPSBGTlRDSEFSQ05UKHAtPmZvbnRkYXRhKTsKKwogCXZjLT52Y19jYW5fZG9fY29sb3IgPSAoZmJfZ2V0X2NvbG9yX2RlcHRoKCZpbmZvLT52YXIsICZpbmZvLT5maXgpIT0xKTsKIAl2Yy0+dmNfY29tcGxlbWVudF9tYXNrID0gdmMtPnZjX2Nhbl9kb19jb2xvciA/IDB4NzcwMCA6IDB4MDgwMDsKIAlpZiAoY2hhcmNudCA9PSAyNTYpIHsKQEAgLTExNDUsMTMgKzExNzYsNDcgQEAKIAlvcHMtPnAgPSAmZmJfZGlzcGxheVtmZ19jb25zb2xlXTsKIH0KIAorc3RhdGljIHZvaWQgZmJjb25fZnJlZV9mb250KHN0cnVjdCBkaXNwbGF5ICpwKQoreworCWlmIChwLT51c2VyZm9udCAmJiBwLT5mb250ZGF0YSAmJiAoLS1SRUZDT1VOVChwLT5mb250ZGF0YSkgPT0gMCkpCisJCWtmcmVlKHAtPmZvbnRkYXRhIC0gRk9OVF9FWFRSQV9XT1JEUyAqIHNpemVvZihpbnQpKTsKKwlwLT5mb250ZGF0YSA9IE5VTEw7CisJcC0+dXNlcmZvbnQgPSAwOworfQorCiBzdGF0aWMgdm9pZCBmYmNvbl9kZWluaXQoc3RydWN0IHZjX2RhdGEgKnZjKQogewogCXN0cnVjdCBkaXNwbGF5ICpwID0gJmZiX2Rpc3BsYXlbdmMtPnZjX251bV07CisJc3RydWN0IGZiX2luZm8gKmluZm87CisJc3RydWN0IGZiY29uX29wcyAqb3BzOworCWludCBpZHg7CiAKLQlpZiAoaW5mb19pZHggIT0gLTEpCi0JICAgIHJldHVybjsKIAlmYmNvbl9mcmVlX2ZvbnQocCk7CisJaWR4ID0gY29uMmZiX21hcFt2Yy0+dmNfbnVtXTsKKworCWlmIChpZHggPT0gLTEpCisJCWdvdG8gZmluaXNoZWQ7CisKKwlpbmZvID0gcmVnaXN0ZXJlZF9mYltpZHhdOworCisJaWYgKCFpbmZvKQorCQlnb3RvIGZpbmlzaGVkOworCisJb3BzID0gaW5mby0+ZmJjb25fcGFyOworCisJaWYgKCFvcHMpCisJCWdvdG8gZmluaXNoZWQ7CisKKwlpZiAoQ09OX0lTX1ZJU0lCTEUodmMpKQorCQlmYmNvbl9kZWxfY3Vyc29yX3RpbWVyKGluZm8pOworCisJb3BzLT5mbGFncyAmPSB+RkJDT05fRkxBR1NfSU5JVDsKK2ZpbmlzaGVkOgorCisJaWYgKCFjb25faXNfYm91bmQoJmZiX2NvbikpCisJCWZiY29uX2V4aXQoKTsKKworCXJldHVybjsKIH0KIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwpAQCAtMjA5OSwxMiArMjE2NCwxMSBAQAogCQlpZiAoaW5mby0+ZmJvcHMtPmZiX3NldF9wYXIpCiAJCQlpbmZvLT5mYm9wcy0+ZmJfc2V0X3BhcihpbmZvKTsKIAotCQlpZiAob2xkX2luZm8gIT0gaW5mbykgeworCQlpZiAob2xkX2luZm8gIT0gaW5mbykKIAkJCWZiY29uX2RlbF9jdXJzb3JfdGltZXIob2xkX2luZm8pOwotCQkJZmJjb25fYWRkX2N1cnNvcl90aW1lcihpbmZvKTsKLQkJfQogCX0KIAorCWZiY29uX2FkZF9jdXJzb3JfdGltZXIoaW5mbyk7CiAJc2V0X2JsaXR0aW5nX3R5cGUodmMsIGluZm8pOwogCW9wcy0+Y3Vyc29yX3Jlc2V0ID0gMTsKIApAQCAtMjIyMiwxNCArMjI4Niw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGZiY29uX2ZyZWVfZm9udChzdHJ1Y3QgZGlzcGxheSAqcCkKLXsKLQlpZiAocC0+dXNlcmZvbnQgJiYgcC0+Zm9udGRhdGEgJiYgKC0tUkVGQ09VTlQocC0+Zm9udGRhdGEpID09IDApKQotCQlrZnJlZShwLT5mb250ZGF0YSAtIEZPTlRfRVhUUkFfV09SRFMgKiBzaXplb2YoaW50KSk7Ci0JcC0+Zm9udGRhdGEgPSBOVUxMOwotCXAtPnVzZXJmb250ID0gMDsKLX0KLQogc3RhdGljIGludCBmYmNvbl9nZXRfZm9udChzdHJ1Y3QgdmNfZGF0YSAqdmMsIHN0cnVjdCBjb25zb2xlX2ZvbnQgKmZvbnQpCiB7CiAJdTggKmZvbnRkYXRhID0gdmMtPnZjX2ZvbnQuZGF0YTsKQEAgLTI0NDMsNyArMjQ5OSw3IEBACiAKIAlGTlRTVU0obmV3X2RhdGEpID0gY3N1bTsKIAkvKiBDaGVjayBpZiB0aGUgc2FtZSBmb250IGlzIG9uIHNvbWUgb3RoZXIgY29uc29sZSBhbHJlYWR5ICovCi0JZm9yIChpID0gMDsgaSA8IE1BWF9OUl9DT05TT0xFUzsgaSsrKSB7CisJZm9yIChpID0gZmlyc3RfZmJfdmM7IGkgPD0gbGFzdF9mYl92YzsgaSsrKSB7CiAJCXN0cnVjdCB2Y19kYXRhICp0bXAgPSB2Y19jb25zW2ldLmQ7CiAJCQogCQlpZiAoZmJfZGlzcGxheVtpXS51c2VyZm9udCAmJgpAQCAtMjc2OCw3ICsyODI0LDcgQEAKIAlpZiAoIW9wcyB8fCBvcHMtPmN1cnJjb24gPCAwKQogCQlyZXR1cm47CiAKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX05SX0NPTlNPTEVTOyBpKyspIHsKKwlmb3IgKGkgPSBmaXJzdF9mYl92YzsgaSA8PSBsYXN0X2ZiX3ZjOyBpKyspIHsKIAkJdmMgPSB2Y19jb25zW2ldLmQ7CiAJCWlmICghdmMgfHwgdmMtPnZjX21vZGUgIT0gS0RfVEVYVCB8fAogCQkgICAgcmVnaXN0ZXJlZF9mYltjb24yZmJfbWFwW2ldXSAhPSBpbmZvKQpAQCAtMjgzMCwyMiArMjg4Niw1NyBAQAogCXJldHVybiBmb3VuZDsKIH0KIAorc3RhdGljIGludCBmYmNvbl9mYl91bnJlZ2lzdGVyZWQoaW50IGlkeCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IGZpcnN0X2ZiX3ZjOyBpIDw9IGxhc3RfZmJfdmM7IGkrKykgeworCQlpZiAoY29uMmZiX21hcFtpXSA9PSBpZHgpCisJCQljb24yZmJfbWFwW2ldID0gLTE7CisJfQorCisJaWYgKGlkeCA9PSBpbmZvX2lkeCkgeworCQlpbmZvX2lkeCA9IC0xOworCisJCWZvciAoaSA9IDA7IGkgPCBGQl9NQVg7IGkrKykgeworCQkJaWYgKHJlZ2lzdGVyZWRfZmJbaV0gIT0gTlVMTCkgeworCQkJCWluZm9faWR4ID0gaTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCWlmIChpbmZvX2lkeCAhPSAtMSkgeworCQlmb3IgKGkgPSBmaXJzdF9mYl92YzsgaSA8PSBsYXN0X2ZiX3ZjOyBpKyspIHsKKwkJCWlmIChjb24yZmJfbWFwW2ldID09IC0xKQorCQkJCWNvbjJmYl9tYXBbaV0gPSBpbmZvX2lkeDsKKwkJfQorCX0KKworCWlmICghbnVtX3JlZ2lzdGVyZWRfZmIpCisJCXVucmVnaXN0ZXJfY29uX2RyaXZlcigmZmJfY29uKTsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IGZiY29uX2ZiX3JlZ2lzdGVyZWQoaW50IGlkeCkKIHsKIAlpbnQgcmV0ID0gMCwgaTsKIAogCWlmIChpbmZvX2lkeCA9PSAtMSkgewotCQlmb3IgKGkgPSAwOyBpIDwgTUFYX05SX0NPTlNPTEVTOyBpKyspIHsKKwkJZm9yIChpID0gZmlyc3RfZmJfdmM7IGkgPD0gbGFzdF9mYl92YzsgaSsrKSB7CiAJCQlpZiAoY29uMmZiX21hcF9ib290W2ldID09IGlkeCkgewogCQkJCWluZm9faWR4ID0gaWR4OwogCQkJCWJyZWFrOwogCQkJfQogCQl9CisKIAkJaWYgKGluZm9faWR4ICE9IC0xKQogCQkJcmV0ID0gZmJjb25fdGFrZW92ZXIoMSk7CiAJfSBlbHNlIHsKLQkJZm9yIChpID0gMDsgaSA8IE1BWF9OUl9DT05TT0xFUzsgaSsrKSB7Ci0JCQlpZiAoY29uMmZiX21hcF9ib290W2ldID09IGlkeCkKKwkJZm9yIChpID0gZmlyc3RfZmJfdmM7IGkgPD0gbGFzdF9mYl92YzsgaSsrKSB7CisJCQlpZiAoY29uMmZiX21hcF9ib290W2ldID09IGlkeCAmJgorCQkJICAgIGNvbjJmYl9tYXBbaV0gPT0gLTEpCiAJCQkJc2V0X2NvbjJmYl9tYXAoaSwgaWR4LCAwKTsKIAkJfQogCX0KQEAgLTI4ODIsNyArMjk3Myw3IEBACiAJc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvIHZhcjsKIAlzdHJ1Y3QgZmJfdmlkZW9tb2RlICptb2RlOwogCi0JZm9yIChpID0gMDsgaSA8IE1BWF9OUl9DT05TT0xFUzsgaSsrKSB7CisJZm9yIChpID0gZmlyc3RfZmJfdmM7IGkgPD0gbGFzdF9mYl92YzsgaSsrKSB7CiAJCWlmIChyZWdpc3RlcmVkX2ZiW2NvbjJmYl9tYXBbaV1dICE9IGluZm8pCiAJCQljb250aW51ZTsKIAkJaWYgKCFmYl9kaXNwbGF5W2ldLm1vZGUpCkBAIC0yOTEwLDYgKzMwMDEsMTQgQEAKIAlzdHJ1Y3QgZmJfY29uMmZibWFwICpjb24yZmI7CiAJaW50IHJldCA9IDA7CiAKKwkvKgorCSAqIGlnbm9yZSBhbGwgZXZlbnRzIGV4Y2VwdCBkcml2ZXIgcmVnaXN0cmF0aW9uIGFuZCBkZXJlZ2lzdHJhdGlvbgorCSAqIGlmIGZiY29uIGlzIG5vdCBhY3RpdmUKKwkgKi8KKwlpZiAoZmJjb25faGFzX2V4aXRlZCAmJiAhKGFjdGlvbiA9PSBGQl9FVkVOVF9GQl9SRUdJU1RFUkVEIHx8CisJCQkJICBhY3Rpb24gPT0gRkJfRVZFTlRfRkJfVU5SRUdJU1RFUkVEKSkKKwkJZ290byBkb25lOworCiAJc3dpdGNoKGFjdGlvbikgewogCWNhc2UgRkJfRVZFTlRfU1VTUEVORDoKIAkJZmJjb25fc3VzcGVuZGVkKGluZm8pOwpAQCAtMjkzMCw2ICszMDI5LDkgQEAKIAljYXNlIEZCX0VWRU5UX0ZCX1JFR0lTVEVSRUQ6CiAJCXJldCA9IGZiY29uX2ZiX3JlZ2lzdGVyZWQoaW5mby0+bm9kZSk7CiAJCWJyZWFrOworCWNhc2UgRkJfRVZFTlRfRkJfVU5SRUdJU1RFUkVEOgorCQlyZXQgPSBmYmNvbl9mYl91bnJlZ2lzdGVyZWQoaW5mby0+bm9kZSk7CisJCWJyZWFrOwogCWNhc2UgRkJfRVZFTlRfU0VUX0NPTlNPTEVfTUFQOgogCQljb24yZmIgPSBldmVudC0+ZGF0YTsKIAkJcmV0ID0gc2V0X2NvbjJmYl9tYXAoY29uMmZiLT5jb25zb2xlIC0gMSwKQEAgLTI5NDUsMTYgKzMwNDcsOSBAQAogCWNhc2UgRkJfRVZFTlRfTkVXX01PREVMSVNUOgogCQlmYmNvbl9uZXdfbW9kZWxpc3QoaW5mbyk7CiAJCWJyZWFrOwotCWNhc2UgRkJfRVZFTlRfU0VUX0NPTl9ST1RBVEU6Ci0JCWZiY29uX3JvdGF0ZShpbmZvLCAqKGludCAqKWV2ZW50LT5kYXRhKTsKLQkJYnJlYWs7Ci0JY2FzZSBGQl9FVkVOVF9HRVRfQ09OX1JPVEFURToKLQkJcmV0ID0gZmJjb25fZ2V0X3JvdGF0ZShpbmZvKTsKLQkJYnJlYWs7Ci0JY2FzZSBGQl9FVkVOVF9TRVRfQ09OX1JPVEFURV9BTEw6Ci0JCWZiY29uX3JvdGF0ZV9hbGwoaW5mbywgKihpbnQgKilldmVudC0+ZGF0YSk7CiAJfQogCitkb25lOgogCXJldHVybiByZXQ7CiB9CiAKQEAgLTI5OTIsMjcgKzMwODcsMTgxIEBACiAJLm5vdGlmaWVyX2NhbGwJPSBmYmNvbl9ldmVudF9ub3RpZnksCiB9OwogCi1zdGF0aWMgaW50IF9faW5pdCBmYl9jb25zb2xlX2luaXQodm9pZCkKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX3JvdGF0ZShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXZpY2UsCisJCQkgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGZiX2luZm8gKmluZm87CisJaW50IHJvdGF0ZSwgaWR4OworCWNoYXIgKipsYXN0ID0gTlVMTDsKKworCWlmIChmYmNvbl9oYXNfZXhpdGVkKQorCQlyZXR1cm4gY291bnQ7CisKKwlhY3F1aXJlX2NvbnNvbGVfc2VtKCk7CisJaWR4ID0gY29uMmZiX21hcFtmZ19jb25zb2xlXTsKKworCWlmIChpZHggPT0gLTEgfHwgcmVnaXN0ZXJlZF9mYltpZHhdID09IE5VTEwpCisJCWdvdG8gZXJyOworCisJaW5mbyA9IHJlZ2lzdGVyZWRfZmJbaWR4XTsKKwlyb3RhdGUgPSBzaW1wbGVfc3RydG91bChidWYsIGxhc3QsIDApOworCWZiY29uX3JvdGF0ZShpbmZvLCByb3RhdGUpOworZXJyOgorCXJlbGVhc2VfY29uc29sZV9zZW0oKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX3JvdGF0ZV9hbGwoc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2aWNlLAorCQkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBmYl9pbmZvICppbmZvOworCWludCByb3RhdGUsIGlkeDsKKwljaGFyICoqbGFzdCA9IE5VTEw7CisKKwlpZiAoZmJjb25faGFzX2V4aXRlZCkKKwkJcmV0dXJuIGNvdW50OworCisJYWNxdWlyZV9jb25zb2xlX3NlbSgpOworCWlkeCA9IGNvbjJmYl9tYXBbZmdfY29uc29sZV07CisKKwlpZiAoaWR4ID09IC0xIHx8IHJlZ2lzdGVyZWRfZmJbaWR4XSA9PSBOVUxMKQorCQlnb3RvIGVycjsKKworCWluZm8gPSByZWdpc3RlcmVkX2ZiW2lkeF07CisJcm90YXRlID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBsYXN0LCAwKTsKKwlmYmNvbl9yb3RhdGVfYWxsKGluZm8sIHJvdGF0ZSk7CitlcnI6CisJcmVsZWFzZV9jb25zb2xlX3NlbSgpOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd19yb3RhdGUoc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2aWNlLCBjaGFyICpidWYpCit7CisJc3RydWN0IGZiX2luZm8gKmluZm87CisJaW50IHJvdGF0ZSA9IDAsIGlkeDsKKworCWlmIChmYmNvbl9oYXNfZXhpdGVkKQorCQlyZXR1cm4gMDsKKworCWFjcXVpcmVfY29uc29sZV9zZW0oKTsKKwlpZHggPSBjb24yZmJfbWFwW2ZnX2NvbnNvbGVdOworCisJaWYgKGlkeCA9PSAtMSB8fCByZWdpc3RlcmVkX2ZiW2lkeF0gPT0gTlVMTCkKKwkJZ290byBlcnI7CisKKwlpbmZvID0gcmVnaXN0ZXJlZF9mYltpZHhdOworCXJvdGF0ZSA9IGZiY29uX2dldF9yb3RhdGUoaW5mbyk7CitlcnI6CisJcmVsZWFzZV9jb25zb2xlX3NlbSgpOworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCByb3RhdGUpOworfQorCitzdGF0aWMgc3RydWN0IGNsYXNzX2RldmljZV9hdHRyaWJ1dGUgY2xhc3NfZGV2aWNlX2F0dHJzW10gPSB7CisJX19BVFRSKHJvdGF0ZSwgU19JUlVHT3xTX0lXVVNSLCBzaG93X3JvdGF0ZSwgc3RvcmVfcm90YXRlKSwKKwlfX0FUVFIocm90YXRlX2FsbCwgU19JV1VTUiwgTlVMTCwgc3RvcmVfcm90YXRlX2FsbCksCit9OworCitzdGF0aWMgaW50IGZiY29uX2luaXRfY2xhc3NfZGV2aWNlKHZvaWQpCiB7CiAJaW50IGk7CiAKLQlhY3F1aXJlX2NvbnNvbGVfc2VtKCk7Ci0JZmJfcmVnaXN0ZXJfY2xpZW50KCZmYmNvbl9ldmVudF9ub3RpZmllcik7Ci0JcmVsZWFzZV9jb25zb2xlX3NlbSgpOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNsYXNzX2RldmljZV9hdHRycyk7IGkrKykKKwkJY2xhc3NfZGV2aWNlX2NyZWF0ZV9maWxlKGZiY29uX2NsYXNzX2RldmljZSwKKwkJCQkJICZjbGFzc19kZXZpY2VfYXR0cnNbaV0pOworCXJldHVybiAwOworfQogCi0JZm9yIChpID0gMDsgaSA8IE1BWF9OUl9DT05TT0xFUzsgaSsrKQotCQljb24yZmJfbWFwW2ldID0gLTE7Ci0KK3N0YXRpYyB2b2lkIGZiY29uX3N0YXJ0KHZvaWQpCit7CiAJaWYgKG51bV9yZWdpc3RlcmVkX2ZiKSB7CisJCWludCBpOworCisJCWFjcXVpcmVfY29uc29sZV9zZW0oKTsKKwogCQlmb3IgKGkgPSAwOyBpIDwgRkJfTUFYOyBpKyspIHsKIAkJCWlmIChyZWdpc3RlcmVkX2ZiW2ldICE9IE5VTEwpIHsKIAkJCQlpbmZvX2lkeCA9IGk7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0KKworCQlyZWxlYXNlX2NvbnNvbGVfc2VtKCk7CiAJCWZiY29uX3Rha2VvdmVyKDApOwogCX0KK30KIAorc3RhdGljIHZvaWQgZmJjb25fZXhpdCh2b2lkKQoreworCXN0cnVjdCBmYl9pbmZvICppbmZvOworCWludCBpLCBqLCBtYXBwZWQ7CisKKwlpZiAoZmJjb25faGFzX2V4aXRlZCkKKwkJcmV0dXJuOworCisjaWZkZWYgQ09ORklHX0FUQVJJCisJZnJlZV9pcnEoSVJRX0FVVE9fNCwgZmJjb25fdmJsX2hhbmRsZXIpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX01BQworCWlmIChNQUNIX0lTX01BQyAmJiB2YmxfZGV0ZWN0ZWQpCisJCWZyZWVfaXJxKElSUV9NQUNfVkJMLCBmYmNvbl92YmxfaGFuZGxlcik7CisjZW5kaWYKKworCWtmcmVlKCh2b2lkICopc29mdGJhY2tfYnVmKTsKKwlzb2Z0YmFja19idWYgPSAwVUw7CisKKwlmb3IgKGkgPSAwOyBpIDwgRkJfTUFYOyBpKyspIHsKKwkJbWFwcGVkID0gMDsKKwkJaW5mbyA9IHJlZ2lzdGVyZWRfZmJbaV07CisKKwkJaWYgKGluZm8gPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCisJCWZvciAoaiA9IGZpcnN0X2ZiX3ZjOyBqIDw9IGxhc3RfZmJfdmM7IGorKykgeworCQkJaWYgKGNvbjJmYl9tYXBbal0gPT0gaSkKKwkJCQltYXBwZWQgPSAxOworCQl9CisKKwkJaWYgKG1hcHBlZCkgeworCQkJaWYgKGluZm8tPmZib3BzLT5mYl9yZWxlYXNlKQorCQkJCWluZm8tPmZib3BzLT5mYl9yZWxlYXNlKGluZm8sIDApOworCQkJbW9kdWxlX3B1dChpbmZvLT5mYm9wcy0+b3duZXIpOworCisJCQlpZiAoaW5mby0+ZmJjb25fcGFyKSB7CisJCQkJZmJjb25fZGVsX2N1cnNvcl90aW1lcihpbmZvKTsKKwkJCQlrZnJlZShpbmZvLT5mYmNvbl9wYXIpOworCQkJCWluZm8tPmZiY29uX3BhciA9IE5VTEw7CisJCQl9CisKKwkJCWlmIChpbmZvLT5xdWV1ZS5mdW5jID09IGZiX2ZsYXNoY3Vyc29yKQorCQkJCWluZm8tPnF1ZXVlLmZ1bmMgPSBOVUxMOworCQl9CisJfQorCisJZmJjb25faGFzX2V4aXRlZCA9IDE7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGZiX2NvbnNvbGVfaW5pdCh2b2lkKQoreworCWludCBpOworCisJYWNxdWlyZV9jb25zb2xlX3NlbSgpOworCWZiX3JlZ2lzdGVyX2NsaWVudCgmZmJjb25fZXZlbnRfbm90aWZpZXIpOworCWZiY29uX2NsYXNzX2RldmljZSA9CisJICAgIGNsYXNzX2RldmljZV9jcmVhdGUoZmJfY2xhc3MsIE5VTEwsIE1LREVWKDAsIDApLCBOVUxMLCAiZmJjb24iKTsKKworCWlmIChJU19FUlIoZmJjb25fY2xhc3NfZGV2aWNlKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJVbmFibGUgdG8gY3JlYXRlIGNsYXNzX2RldmljZSAiCisJCSAgICAgICAiZm9yIGZiY29uOyBlcnJubyA9ICVsZFxuIiwKKwkJICAgICAgIFBUUl9FUlIoZmJjb25fY2xhc3NfZGV2aWNlKSk7CisJCWZiY29uX2NsYXNzX2RldmljZSA9IE5VTEw7CisJfSBlbHNlCisJCWZiY29uX2luaXRfY2xhc3NfZGV2aWNlKCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX05SX0NPTlNPTEVTOyBpKyspCisJCWNvbjJmYl9tYXBbaV0gPSAtMTsKKworCXJlbGVhc2VfY29uc29sZV9zZW0oKTsKKwlmYmNvbl9zdGFydCgpOwogCXJldHVybiAwOwogfQogCkBAIC0zMDIwLDEyICszMjY5LDI0IEBACiAKICNpZmRlZiBNT0RVTEUKIAorc3RhdGljIHZvaWQgX19leGl0IGZiY29uX2RlaW5pdF9jbGFzc19kZXZpY2Uodm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNsYXNzX2RldmljZV9hdHRycyk7IGkrKykKKwkJY2xhc3NfZGV2aWNlX3JlbW92ZV9maWxlKGZiY29uX2NsYXNzX2RldmljZSwKKwkJCQkJICZjbGFzc19kZXZpY2VfYXR0cnNbaV0pOworfQorCiBzdGF0aWMgdm9pZCBfX2V4aXQgZmJfY29uc29sZV9leGl0KHZvaWQpCiB7CiAJYWNxdWlyZV9jb25zb2xlX3NlbSgpOwogCWZiX3VucmVnaXN0ZXJfY2xpZW50KCZmYmNvbl9ldmVudF9ub3RpZmllcik7CisJZmJjb25fZGVpbml0X2NsYXNzX2RldmljZSgpOworCWNsYXNzX2RldmljZV9kZXN0cm95KGZiX2NsYXNzLCBNS0RFVigwLCAwKSk7CisJZmJjb25fZXhpdCgpOwogCXJlbGVhc2VfY29uc29sZV9zZW0oKTsKLQlnaXZlX3VwX2NvbnNvbGUoJmZiX2Nvbik7CisJdW5yZWdpc3Rlcl9jb25fZHJpdmVyKCZmYl9jb24pOwogfQkKIAogbW9kdWxlX2V4aXQoZmJfY29uc29sZV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vY29uc29sZS9mYmNvbi5oIGIvZHJpdmVycy92aWRlby9jb25zb2xlL2ZiY29uLmgKaW5kZXggYzM4YzNkOC4uMzQ4N2E2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9jb25zb2xlL2ZiY29uLmgKKysrIGIvZHJpdmVycy92aWRlby9jb25zb2xlL2ZiY29uLmgKQEAgLTE3NSw2ICsxNzUsNyBAQAogI2VuZGlmCiBleHRlcm4gdm9pZCBmYmNvbl9zZXRfYml0b3BzKHN0cnVjdCBmYmNvbl9vcHMgKm9wcyk7CiBleHRlcm4gaW50ICBzb2Z0X2N1cnNvcihzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgc3RydWN0IGZiX2N1cnNvciAqY3Vyc29yKTsKK2V4dGVybiBzdHJ1Y3QgY2xhc3MgKmZiX2NsYXNzOwogCiAjZGVmaW5lIEZCQ09OX0FUVFJJQlVURV9VTkRFUkxJTkUgMQogI2RlZmluZSBGQkNPTl9BVFRSSUJVVEVfUkVWRVJTRSAgIDIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vY29uc29sZS9tZGFjb24uYyBiL2RyaXZlcnMvdmlkZW8vY29uc29sZS9tZGFjb24uYwppbmRleCA3ZjkzOWQwLi5jODlmOTBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvbWRhY29uLmMKKysrIGIvZHJpdmVycy92aWRlby9jb25zb2xlL21kYWNvbi5jCkBAIC0zMDgsNyArMzA4LDcgQEAKIAlvdXRiX3AoMHgwMCwgbWRhX2dmeF9wb3J0KTsKIH0KIAotc3RhdGljIGNvbnN0IGNoYXIgX19pbml0ICptZGFjb25fc3RhcnR1cCh2b2lkKQorc3RhdGljIGNvbnN0IGNoYXIgKm1kYWNvbl9zdGFydHVwKHZvaWQpCiB7CiAJbWRhX251bV9jb2x1bW5zID0gODA7CiAJbWRhX251bV9saW5lcyAgID0gMjU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvbmV3cG9ydF9jb24uYyBiL2RyaXZlcnMvdmlkZW8vY29uc29sZS9uZXdwb3J0X2Nvbi5jCmluZGV4IGU5OWZlMzAuLjAzMDQxMzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vY29uc29sZS9uZXdwb3J0X2Nvbi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vY29uc29sZS9uZXdwb3J0X2Nvbi5jCkBAIC01MSw2ICs1MSw3IEBACiBzdGF0aWMgaW50IHhjdXJzX2NvcnJlY3Rpb24gPSAyOTsKIHN0YXRpYyBpbnQgbmV3cG9ydF94c2l6ZTsKIHN0YXRpYyBpbnQgbmV3cG9ydF95c2l6ZTsKK3N0YXRpYyBpbnQgbmV3cG9ydF9oYXNfaW5pdDsKIAogc3RhdGljIGludCBuZXdwb3J0X3NldF9kZWZfZm9udChpbnQgdW5pdCwgc3RydWN0IGNvbnNvbGVfZm9udCAqb3ApOwogCkBAIC0yODMsNiArMjg0LDE1IEBACiAJCXhjdXJzX2NvcnJlY3Rpb24gPSAyMTsKIH0KIAorc3RhdGljIHZvaWQgbmV3cG9ydF9leGl0KHZvaWQpCit7CisJaW50IGk7CisKKwkvKiBmcmVlIG1lbW9yeSB1c2VkIGJ5IHVzZXIgZm9udCAqLworCWZvciAoaSA9IDA7IGkgPCBNQVhfTlJfQ09OU09MRVM7IGkrKykKKwkJbmV3cG9ydF9zZXRfZGVmX2ZvbnQoaSwgTlVMTCk7Cit9CisKIC8qIENhbid0IGJlIF9faW5pdCwgdGFrZV9vdmVyX2NvbnNvbGUgbWF5IGNhbGwgaXQgbGF0ZXIgKi8KIHN0YXRpYyBjb25zdCBjaGFyICpuZXdwb3J0X3N0YXJ0dXAodm9pZCkKIHsKQEAgLTI5MCw4ICszMDAsMTAgQEAKIAogCWlmICghc2dpX2dmeGFkZHIpCiAJCXJldHVybiBOVUxMOwotCW5wcmVncyA9IChzdHJ1Y3QgbmV3cG9ydF9yZWdzICopCS8qIGlvcmVtYXAgY2Fubm90IGZhaWwgKi8KLQkJIGlvcmVtYXAoc2dpX2dmeGFkZHIsIHNpemVvZihzdHJ1Y3QgbmV3cG9ydF9yZWdzKSk7CisKKwlpZiAoIW5wcmVncykKKwkJbnByZWdzID0gKHN0cnVjdCBuZXdwb3J0X3JlZ3MgKikvKiBpb3JlbWFwIGNhbm5vdCBmYWlsICovCisJCQlpb3JlbWFwKHNnaV9nZnhhZGRyLCBzaXplb2Yoc3RydWN0IG5ld3BvcnRfcmVncykpOwogCW5wcmVncy0+Y3NldC5jb25maWcgPSBOUE9SVF9DRkdfR0QwOwogCiAJaWYgKG5ld3BvcnRfd2FpdChucHJlZ3MpKQpAQCAtMzA3LDExICszMTksMTEgQEAKIAluZXdwb3J0X3Jlc2V0KCk7CiAJbmV3cG9ydF9nZXRfcmV2aXNpb25zKCk7CiAJbmV3cG9ydF9nZXRfc2NyZWVuc2l6ZSgpOworCW5ld3BvcnRfaGFzX2luaXQgPSAxOwogCiAJcmV0dXJuICJTR0kgTmV3cG9ydCI7CiAKIG91dF91bm1hcDoKLQlpb3VubWFwKCh2b2lkICopbnByZWdzKTsKIAlyZXR1cm4gTlVMTDsKIH0KIApAQCAtMzI0LDExICszMzYsMTAgQEAKIAogc3RhdGljIHZvaWQgbmV3cG9ydF9kZWluaXQoc3RydWN0IHZjX2RhdGEgKmMpCiB7Ci0JaW50IGk7Ci0KLQkvKiBmcmVlIG1lbW9yeSB1c2VkIGJ5IHVzZXIgZm9udCAqLwotCWZvciAoaSA9IDA7IGkgPCBNQVhfTlJfQ09OU09MRVM7IGkrKykKLQkJbmV3cG9ydF9zZXRfZGVmX2ZvbnQoaSwgTlVMTCk7CisJaWYgKCFjb25faXNfYm91bmQoJm5ld3BvcnRfY29uKSAmJiBuZXdwb3J0X2hhc19pbml0KSB7CisJCW5ld3BvcnRfZXhpdCgpOworCQluZXdwb3J0X2hhc19pbml0ID0gMDsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIG5ld3BvcnRfY2xlYXIoc3RydWN0IHZjX2RhdGEgKnZjLCBpbnQgc3ksIGludCBzeCwgaW50IGhlaWdodCwKQEAgLTcyOCwxNiArNzM5LDIzIEBACiAjaWZkZWYgTU9EVUxFCiBzdGF0aWMgaW50IF9faW5pdCBuZXdwb3J0X2NvbnNvbGVfaW5pdCh2b2lkKQogeworCisJaWYgKCFzZ2lfZ2Z4YWRkcikKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoIW5wcmVncykKKwkJbnByZWdzID0gKHN0cnVjdCBuZXdwb3J0X3JlZ3MgKikvKiBpb3JlbWFwIGNhbm5vdCBmYWlsICovCisJCQlpb3JlbWFwKHNnaV9nZnhhZGRyLCBzaXplb2Yoc3RydWN0IG5ld3BvcnRfcmVncykpOworCiAJcmV0dXJuIHRha2Vfb3Zlcl9jb25zb2xlKCZuZXdwb3J0X2NvbiwgMCwgTUFYX05SX0NPTlNPTEVTIC0gMSwgMSk7CiB9Cittb2R1bGVfaW5pdChuZXdwb3J0X2NvbnNvbGVfaW5pdCk7CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBuZXdwb3J0X2NvbnNvbGVfZXhpdCh2b2lkKQogewogCWdpdmVfdXBfY29uc29sZSgmbmV3cG9ydF9jb24pOwogCWlvdW5tYXAoKHZvaWQgKilucHJlZ3MpOwogfQotCi1tb2R1bGVfaW5pdChuZXdwb3J0X2NvbnNvbGVfaW5pdCk7CiBtb2R1bGVfZXhpdChuZXdwb3J0X2NvbnNvbGVfZXhpdCk7CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9jb25zb2xlL3Byb21jb24uYyBiL2RyaXZlcnMvdmlkZW8vY29uc29sZS9wcm9tY29uLmMKaW5kZXggMDRmNDJmYy4uZDZlNmFkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9jb25zb2xlL3Byb21jb24uYworKysgYi9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvcHJvbWNvbi5jCkBAIC0xMDksNyArMTA5LDcgQEAKIAlyZXR1cm4gYiAtIHA7CiB9CiAKLWNvbnN0IGNoYXIgX19pbml0ICpwcm9tY29uX3N0YXJ0dXAodm9pZCkKK2NvbnN0IGNoYXIgKnByb21jb25fc3RhcnR1cCh2b2lkKQogewogCWNvbnN0IGNoYXIgKmRpc3BsYXlfZGVzYyA9ICJQUk9NIjsKIAlpbnQgbm9kZTsKQEAgLTEzMyw3ICsxMzMsNyBAQAogCXJldHVybiBkaXNwbGF5X2Rlc2M7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCAKK3N0YXRpYyB2b2lkCiBwcm9tY29uX2luaXRfdW5pbWFwKHN0cnVjdCB2Y19kYXRhICpjb25wKQogewogCW1tX3NlZ21lbnRfdCBvbGRfZnMgPSBnZXRfZnMoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vY29uc29sZS9zdGljb24uYyBiL2RyaXZlcnMvdmlkZW8vY29uc29sZS9zdGljb24uYwppbmRleCBmZDU5NDBmLi40NWM0ZjIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvc3RpY29uLmMKKysrIGIvZHJpdmVycy92aWRlby9jb25zb2xlL3N0aWNvbi5jCkBAIC03NSw3ICs3NSw3IEBACiAgICAgY3Vyc29yX2RyYXduID0gMDsKIH0KIAotc3RhdGljIGNvbnN0IGNoYXIgKl9faW5pdCBzdGljb25fc3RhcnR1cCh2b2lkKQorc3RhdGljIGNvbnN0IGNoYXIgKnN0aWNvbl9zdGFydHVwKHZvaWQpCiB7CiAgICAgcmV0dXJuICJTVEkgY29uc29sZSI7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvdmdhY29uLmMgYi9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvdmdhY29uLmMKaW5kZXggZTY0ZDQyZS4uZjMyYjU5MCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9jb25zb2xlL3ZnYWNvbi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vY29uc29sZS92Z2Fjb24uYwpAQCAtMTE0LDYgKzExNCw3IEBACiBzdGF0aWMgaW50IAkJdmdhX3ZpZGVvX2ZvbnRfaGVpZ2h0Owogc3RhdGljIGludCAJCXZnYV9zY2FuX2xpbmVzOwogc3RhdGljIHVuc2lnbmVkIGludCAJdmdhX3JvbGxlZF9vdmVyID0gMDsKK3N0YXRpYyBpbnQgICAgICAgICAgICAgIHZnYV9pbml0X2RvbmU7CiAKIHN0YXRpYyBpbnQgX19pbml0IG5vX3Njcm9sbChjaGFyICpzdHIpCiB7CkBAIC0xOTAsNyArMTkxLDcgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCB2Z2Fjb25fc2Nyb2xsYmFja19zdGFydHVwKHZvaWQpCitzdGF0aWMgdm9pZCB2Z2Fjb25fc2Nyb2xsYmFja19zdGFydHVwKHZvaWQpCiB7CiAJdmdhY29uX3Njcm9sbGJhY2sgPSBhbGxvY19ib290bWVtKENPTkZJR19WR0FDT05fU09GVF9TQ1JPTExCQUNLX1NJWkUKIAkJCQkJICAqIDEwMjQpOwpAQCAtMzU1LDcgKzM1Niw3IEBACiB9CiAjZW5kaWYgLyogQ09ORklHX1ZHQUNPTl9TT0ZUX1NDUk9MTEJBQ0sgKi8KIAotc3RhdGljIGNvbnN0IGNoYXIgX19pbml0ICp2Z2Fjb25fc3RhcnR1cCh2b2lkKQorc3RhdGljIGNvbnN0IGNoYXIgKnZnYWNvbl9zdGFydHVwKHZvaWQpCiB7CiAJY29uc3QgY2hhciAqZGlzcGxheV9kZXNjID0gTlVMTDsKIAl1MTYgc2F2ZWQxLCBzYXZlZDI7CkBAIC01MjMsNyArNTI0LDEyIEBACiAKIAl2Z2Fjb25feHJlcyA9IE9SSUdfVklERU9fQ09MUyAqIFZHQV9GT05UV0lEVEg7CiAJdmdhY29uX3lyZXMgPSB2Z2Ffc2Nhbl9saW5lczsKLQl2Z2Fjb25fc2Nyb2xsYmFja19zdGFydHVwKCk7CisKKwlpZiAoIXZnYV9pbml0X2RvbmUpIHsKKwkJdmdhY29uX3Njcm9sbGJhY2tfc3RhcnR1cCgpOworCQl2Z2FfaW5pdF9kb25lID0gMTsKKwl9CisKIAlyZXR1cm4gZGlzcGxheV9kZXNjOwogfQogCkBAIC01MzEsMTAgKzUzNywyMCBAQAogewogCXVuc2lnbmVkIGxvbmcgcDsKIAotCS8qIFdlIGNhbm5vdCBiZSBsb2FkZWQgYXMgYSBtb2R1bGUsIHRoZXJlZm9yZSBpbml0IGlzIGFsd2F5cyAxICovCisJLyoKKwkgKiBXZSBjYW5ub3QgYmUgbG9hZGVkIGFzIGEgbW9kdWxlLCB0aGVyZWZvcmUgaW5pdCBpcyBhbHdheXMgMSwKKwkgKiBidXQgdmdhY29uX2luaXQgY2FuIGJlIGNhbGxlZCBtb3JlIHRoYW4gb25jZSwgYW5kIGluaXQgd2lsbAorCSAqIG5vdCBiZSAxLgorCSAqLwogCWMtPnZjX2Nhbl9kb19jb2xvciA9IHZnYV9jYW5fZG9fY29sb3I7Ci0JYy0+dmNfY29scyA9IHZnYV92aWRlb19udW1fY29sdW1uczsKLQljLT52Y19yb3dzID0gdmdhX3ZpZGVvX251bV9saW5lczsKKworCS8qIHNldCBkaW1lbnNpb25zIG1hbnVhbGx5IGlmIGluaXQgIT0gMCBzaW5jZSB2Y19yZXNpemUoKSB3aWxsIGZhaWwgKi8KKwlpZiAoaW5pdCkgeworCQljLT52Y19jb2xzID0gdmdhX3ZpZGVvX251bV9jb2x1bW5zOworCQljLT52Y19yb3dzID0gdmdhX3ZpZGVvX251bV9saW5lczsKKwl9IGVsc2UKKwkJdmNfcmVzaXplKGMsIHZnYV92aWRlb19udW1fY29sdW1ucywgdmdhX3ZpZGVvX251bV9saW5lcyk7CisKIAljLT52Y19zY2FuX2xpbmVzID0gdmdhX3NjYW5fbGluZXM7CiAJYy0+dmNfZm9udC5oZWlnaHQgPSB2Z2FfdmlkZW9fZm9udF9oZWlnaHQ7CiAJYy0+dmNfY29tcGxlbWVudF9tYXNrID0gMHg3NzAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9lcHNvbjEzNTVmYi5jIGIvZHJpdmVycy92aWRlby9lcHNvbjEzNTVmYi5jCmluZGV4IDA4Mjc1OTQuLmYwYTYyMWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vZXBzb24xMzU1ZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL2Vwc29uMTM1NWZiLmMKQEAgLTYwNSwxMSArNjA1LDYgQEAKIAkJZmJfd3JpdGViKDAsIGRzdCk7CiB9CiAKLXN0YXRpYyB2b2lkIGVwc29uMTM1NWZiX3BsYXRmb3JtX3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2aWNlKQotewotCWRldl9lcnIoZGV2aWNlLCAiVGhpcyBkcml2ZXIgaXMgYnJva2VuLCBwbGVhc2UgYnVnIHRoZSBhdXRob3JzIHNvIHRoZXkgd2lsbCBmaXggaXQuXG4iKTsKLX0KLQogc3RhdGljIGludCBlcHNvbjEzNTVmYl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBmYl9pbmZvICppbmZvID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2KTsKQEAgLTczMywxMyArNzI4LDcgQEAKIAl9LAogfTsKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZXBzb24xMzU1ZmJfZGV2aWNlID0gewotCS5uYW1lCT0gImVwc29uMTM1NWZiIiwKLQkuaWQJPSAwLAotCS5kZXYJPSB7Ci0JCS5yZWxlYXNlID0gZXBzb24xMzU1ZmJfcGxhdGZvcm1fcmVsZWFzZSwKLQl9Ci19Oworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmVwc29uMTM1NWZiX2RldmljZTsKIAogaW50IF9faW5pdCBlcHNvbjEzNTVmYl9pbml0KHZvaWQpCiB7CkBAIC03NDksMTEgKzczOCwyMSBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAogCXJldCA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmZXBzb24xMzU1ZmJfZHJpdmVyKTsKKwogCWlmICghcmV0KSB7Ci0JCXJldCA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmZXBzb24xMzU1ZmJfZGV2aWNlKTsKLQkJaWYgKHJldCkKKwkJZXBzb24xMzU1ZmJfZGV2aWNlID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKCJlcHNvbjEzNTVmYiIsIDApOworCisJCWlmIChlcHNvbjEzNTVmYl9kZXZpY2UpCisJCQlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKGVwc29uMTM1NWZiX2RldmljZSk7CisJCWVsc2UKKwkJCXJldCA9IC1FTk9NRU07CisKKwkJaWYgKHJldCkgeworCQkJcGxhdGZvcm1fZGV2aWNlX3B1dChlcHNvbjEzNTVmYl9kZXZpY2UpOwogCQkJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmVwc29uMTM1NWZiX2RyaXZlcik7CisJCX0KIAl9CisKIAlyZXR1cm4gcmV0OwogfQogCkBAIC03NjIsNyArNzYxLDcgQEAKICNpZmRlZiBNT0RVTEUKIHN0YXRpYyB2b2lkIF9fZXhpdCBlcHNvbjEzNTVmYl9leGl0KHZvaWQpCiB7Ci0JcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoJmVwc29uMTM1NWZiX2RldmljZSk7CisJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoZXBzb24xMzU1ZmJfZGV2aWNlKTsKIAlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmZXBzb24xMzU1ZmJfZHJpdmVyKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9mYmN2dC5jIGIvZHJpdmVycy92aWRlby9mYmN2dC5jCmluZGV4IGFjOTA4ODMuLmI1NDk4OTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vZmJjdnQuYworKysgYi9kcml2ZXJzL3ZpZGVvL2ZiY3Z0LmMKQEAgLTM3Niw0ICszNzYsMyBAQAogCiAJcmV0dXJuIDA7CiB9Ci1FWFBPUlRfU1lNQk9MKGZiX2ZpbmRfbW9kZV9jdnQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9mYm1lbS5jIGIvZHJpdmVycy92aWRlby9mYm1lbS5jCmluZGV4IDM3MmFhMTcuLjMxMTQzYWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vZmJtZW0uYworKysgYi9kcml2ZXJzL3ZpZGVvL2ZibWVtLmMKQEAgLTM0LDcgKzM0LDYgQEAKICNlbmRpZgogI2luY2x1ZGUgPGxpbnV4L2RldmZzX2ZzX2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2VmaS5oPgogCkBAIC0xNjIsNyArMTYxLDYgQEAKIH0KIAogI2lmZGVmIENPTkZJR19MT0dPCi0jaW5jbHVkZSA8bGludXgvbGludXhfbG9nby5oPgogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNhZmVfc2hpZnQodW5zaWduZWQgZCwgaW50IG4pCiB7CkBAIC0zMzYsMTEgKzMzNCwxMSBAQAogCiBzdGF0aWMgdm9pZCBmYl9yb3RhdGVfbG9nb19jdyhjb25zdCB1OCAqaW4sIHU4ICpvdXQsIHUzMiB3aWR0aCwgdTMyIGhlaWdodCkKIHsKLQlpbnQgaSwgaiwgdyA9IHdpZHRoIC0gMTsKKwlpbnQgaSwgaiwgaCA9IGhlaWdodCAtIDE7CiAKIAlmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspCiAJCWZvciAoaiA9IDA7IGogPCB3aWR0aDsgaisrKQotCQkJb3V0W2hlaWdodCAqIGogKyB3IC0gaV0gPSAqaW4rKzsKKwkJCQlvdXRbaGVpZ2h0ICogaiArIGggLSBpXSA9ICppbisrOwogfQogCiBzdGF0aWMgdm9pZCBmYl9yb3RhdGVfbG9nb19jY3coY29uc3QgdTggKmluLCB1OCAqb3V0LCB1MzIgd2lkdGgsIHUzMiBoZWlnaHQpCkBAIC0zNTgsMjQgKzM1NiwyNCBAQAogCXUzMiB0bXA7CiAKIAlpZiAocm90YXRlID09IEZCX1JPVEFURV9VRCkgewotCQlpbWFnZS0+ZHggPSBpbmZvLT52YXIueHJlcyAtIGltYWdlLT53aWR0aDsKLQkJaW1hZ2UtPmR5ID0gaW5mby0+dmFyLnlyZXMgLSBpbWFnZS0+aGVpZ2h0OwogCQlmYl9yb3RhdGVfbG9nb191ZChpbWFnZS0+ZGF0YSwgZHN0LCBpbWFnZS0+d2lkdGgsCiAJCQkJICBpbWFnZS0+aGVpZ2h0KTsKKwkJaW1hZ2UtPmR4ID0gaW5mby0+dmFyLnhyZXMgLSBpbWFnZS0+d2lkdGg7CisJCWltYWdlLT5keSA9IGluZm8tPnZhci55cmVzIC0gaW1hZ2UtPmhlaWdodDsKIAl9IGVsc2UgaWYgKHJvdGF0ZSA9PSBGQl9ST1RBVEVfQ1cpIHsKLQkJdG1wID0gaW1hZ2UtPndpZHRoOwotCQlpbWFnZS0+d2lkdGggPSBpbWFnZS0+aGVpZ2h0OwotCQlpbWFnZS0+aGVpZ2h0ID0gdG1wOwotCQlpbWFnZS0+ZHggPSBpbmZvLT52YXIueHJlcyAtIGltYWdlLT5oZWlnaHQ7CiAJCWZiX3JvdGF0ZV9sb2dvX2N3KGltYWdlLT5kYXRhLCBkc3QsIGltYWdlLT53aWR0aCwKIAkJCQkgIGltYWdlLT5oZWlnaHQpOwotCX0gZWxzZSBpZiAocm90YXRlID09IEZCX1JPVEFURV9DQ1cpIHsKIAkJdG1wID0gaW1hZ2UtPndpZHRoOwogCQlpbWFnZS0+d2lkdGggPSBpbWFnZS0+aGVpZ2h0OwogCQlpbWFnZS0+aGVpZ2h0ID0gdG1wOwotCQlpbWFnZS0+ZHkgPSBpbmZvLT52YXIueXJlcyAtIGltYWdlLT53aWR0aDsKKwkJaW1hZ2UtPmR4ID0gaW5mby0+dmFyLnhyZXMgLSBpbWFnZS0+d2lkdGg7CisJfSBlbHNlIGlmIChyb3RhdGUgPT0gRkJfUk9UQVRFX0NDVykgewogCQlmYl9yb3RhdGVfbG9nb19jY3coaW1hZ2UtPmRhdGEsIGRzdCwgaW1hZ2UtPndpZHRoLAogCQkJCSAgIGltYWdlLT5oZWlnaHQpOworCQl0bXAgPSBpbWFnZS0+d2lkdGg7CisJCWltYWdlLT53aWR0aCA9IGltYWdlLT5oZWlnaHQ7CisJCWltYWdlLT5oZWlnaHQgPSB0bXA7CisJCWltYWdlLT5keSA9IGluZm8tPnZhci55cmVzIC0gaW1hZ2UtPmhlaWdodDsKIAl9CiAKIAlpbWFnZS0+ZGF0YSA9IGRzdDsKQEAgLTQzNSw3ICs0MzMsNyBAQAogCQkJZGVwdGggPSBpbmZvLT52YXIuZ3JlZW4ubGVuZ3RoOwogCX0KIAotCWlmIChpbmZvLT5maXgudmlzdWFsID09IEZCX1ZJU1VBTF9TVEFUSUNfUFNFVURPQ09MT1IpIHsKKwlpZiAoaW5mby0+Zml4LnZpc3VhbCA9PSBGQl9WSVNVQUxfU1RBVElDX1BTRVVET0NPTE9SICYmIGRlcHRoID4gNCkgewogCQkvKiBhc3N1bWUgY29uc29sZSBjb2xvcm1hcCAqLwogCQlkZXB0aCA9IDQ7CiAJfQpAQCAtMTI3OCw4ICsxMjc2LDggQEAKICNlbmRpZgogfTsKIAotc3RhdGljIHN0cnVjdCBjbGFzcyAqZmJfY2xhc3M7Ci0KK3N0cnVjdCBjbGFzcyAqZmJfY2xhc3M7CitFWFBPUlRfU1lNQk9MKGZiX2NsYXNzKTsKIC8qKgogICoJcmVnaXN0ZXJfZnJhbWVidWZmZXIgLSByZWdpc3RlcnMgYSBmcmFtZSBidWZmZXIgZGV2aWNlCiAgKglAZmJfaW5mbzogZnJhbWUgYnVmZmVyIGluZm8gc3RydWN0dXJlCkBAIC0xMzU1LDYgKzEzNTMsNyBAQAogaW50CiB1bnJlZ2lzdGVyX2ZyYW1lYnVmZmVyKHN0cnVjdCBmYl9pbmZvICpmYl9pbmZvKQogeworCXN0cnVjdCBmYl9ldmVudCBldmVudDsKIAlpbnQgaTsKIAogCWkgPSBmYl9pbmZvLT5ub2RlOwpAQCAtMTM2MiwxMyArMTM2MSwxNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAlkZXZmc19yZW1vdmUoImZiLyVkIiwgaSk7CiAKLQlpZiAoZmJfaW5mby0+cGl4bWFwLmFkZHIgJiYgKGZiX2luZm8tPnBpeG1hcC5mbGFncyAmIEZCX1BJWE1BUF9ERUZBVUxUKSkKKwlpZiAoZmJfaW5mby0+cGl4bWFwLmFkZHIgJiYKKwkgICAgKGZiX2luZm8tPnBpeG1hcC5mbGFncyAmIEZCX1BJWE1BUF9ERUZBVUxUKSkKIAkJa2ZyZWUoZmJfaW5mby0+cGl4bWFwLmFkZHIpOwogCWZiX2Rlc3Ryb3lfbW9kZWxpc3QoJmZiX2luZm8tPm1vZGVsaXN0KTsKIAlyZWdpc3RlcmVkX2ZiW2ldPU5VTEw7CiAJbnVtX3JlZ2lzdGVyZWRfZmItLTsKIAlmYl9jbGVhbnVwX2NsYXNzX2RldmljZShmYl9pbmZvKTsKIAljbGFzc19kZXZpY2VfZGVzdHJveShmYl9jbGFzcywgTUtERVYoRkJfTUFKT1IsIGkpKTsKKwlldmVudC5pbmZvID0gZmJfaW5mbzsKKwlibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKCZmYl9ub3RpZmllcl9saXN0LAorCQkJCSAgICAgRkJfRVZFTlRfRkJfVU5SRUdJU1RFUkVELCAmZXZlbnQpOwogCXJldHVybiAwOwogfQogCkBAIC0xNDkxLDI4ICsxNDk0LDYgQEAKIAlyZXR1cm4gZXJyOwogfQogCi0vKioKLSAqIGZiX2Nvbl9kdWl0IC0gdXNlcjwtPmZiY29uIHBhc3N0aHJvdWdoCi0gKiBAaW5mbzogc3RydWN0IGZiX2luZm8KLSAqIEBldmVudDogbm90aWZpY2F0aW9uIGV2ZW50IHRvIGJlIHBhc3NlZCB0byBmYmNvbgotICogQGRhdGE6IHByaXZhdGUgZGF0YQotICoKLSAqIERFU0NSSVBUSU9OCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIGFuIGZiY29uLXVzZXIgZXZlbnQgcGFzc2luZyBjaGFubmVsCi0gKiB3aGljaCBieXBhc3NlcyBmYmRldi4gIFRoaXMgaXMgaG9wZWZ1bGx5IHRlbXBvcmFyeQotICogdW50aWwgYSB1c2VyIGludGVyZmFjZSBmb3IgZmJjb24gaXMgY3JlYXRlZAotICovCi1pbnQgZmJfY29uX2R1aXQoc3RydWN0IGZiX2luZm8gKmluZm8sIGludCBldmVudCwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgZmJfZXZlbnQgZXZudDsKLQotCWV2bnQuaW5mbyA9IGluZm87Ci0JZXZudC5kYXRhID0gZGF0YTsKLQotCXJldHVybiBibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKCZmYl9ub3RpZmllcl9saXN0LCBldmVudCwgJmV2bnQpOwotfQotRVhQT1JUX1NZTUJPTChmYl9jb25fZHVpdCk7Ci0KIHN0YXRpYyBjaGFyICp2aWRlb19vcHRpb25zW0ZCX01BWF07CiBzdGF0aWMgaW50IG9mb25seTsKIApAQCAtMTYyMiw2ICsxNjAzLDUgQEAKIEVYUE9SVF9TWU1CT0woZmJfcmVnaXN0ZXJfY2xpZW50KTsKIEVYUE9SVF9TWU1CT0woZmJfdW5yZWdpc3Rlcl9jbGllbnQpOwogRVhQT1JUX1NZTUJPTChmYl9nZXRfb3B0aW9ucyk7Ci1FWFBPUlRfU1lNQk9MKGZiX25ld19tb2RlbGlzdCk7CiAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vZmJtb24uYyBiL2RyaXZlcnMvdmlkZW8vZmJtb24uYwppbmRleCA1M2JlZWI0Li4zY2NmZmY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2ZibW9uLmMKKysrIGIvZHJpdmVycy92aWRlby9mYm1vbi5jCkBAIC0yOSw5ICsyOSw5IEBACiAjaW5jbHVkZSA8bGludXgvdHR5Lmg+CiAjaW5jbHVkZSA8bGludXgvZmIuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDx2aWRlby9lZGlkLmg+CiAjaWZkZWYgQ09ORklHX1BQQ19PRgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGFzbS9wcm9tLmg+CiAjaW5jbHVkZSA8YXNtL3BjaS1icmlkZ2UuaD4KICNlbmRpZgpAQCAtNjA1LDYgKzYwNSw3IEBACiAJYmxvY2sgPSBlZGlkICsgREVUQUlMRURfVElNSU5HX0RFU0NSSVBUSU9OU19TVEFSVDsKIAogCURQUklOVEsoIiAgICAgIE1vbml0b3IgT3BlcmF0aW5nIExpbWl0czogIik7CisKIAlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrLCBibG9jayArPSBERVRBSUxFRF9USU1JTkdfREVTQ1JJUFRJT05fU0laRSkgewogCQlpZiAoZWRpZF9pc19saW1pdHNfYmxvY2soYmxvY2spKSB7CiAJCQlzcGVjcy0+aGZtaW4gPSBIX01JTl9SQVRFICogMTAwMDsKQEAgLTYxOCwxMSArNjE5LDEyIEBACiAJCQlicmVhazsKIAkJfQogCX0KLQkKKwogCS8qIGVzdGltYXRlIG1vbml0b3IgbGltaXRzIGJhc2VkIG9uIG1vZGVzIHN1cHBvcnRlZCAqLwogCWlmIChyZXR2YWwpIHsKLQkJc3RydWN0IGZiX3ZpZGVvbW9kZSAqbW9kZXM7CisJCXN0cnVjdCBmYl92aWRlb21vZGUgKm1vZGVzLCAqbW9kZTsKIAkJaW50IG51bV9tb2RlcywgaSwgaHosIGhzY2FuLCBwaXhjbG9jazsKKwkJaW50IHZ0b3RhbCwgaHRvdGFsOwogCiAJCW1vZGVzID0gZmJfY3JlYXRlX21vZGVkYihlZGlkLCAmbnVtX21vZGVzKTsKIAkJaWYgKCFtb2RlcykgewpAQCAtNjMyLDIwICs2MzQsMzggQEAKIAogCQlyZXR2YWwgPSAwOwogCQlmb3IgKGkgPSAwOyBpIDwgbnVtX21vZGVzOyBpKyspIHsKLQkJCWh6ID0gbW9kZXNbaV0ucmVmcmVzaDsKKwkJCW1vZGUgPSAmbW9kZXNbaV07CiAJCQlwaXhjbG9jayA9IFBJQ09TMktIWihtb2Rlc1tpXS5waXhjbG9jaykgKiAxMDAwOwotCQkJaHNjYW4gPSAobW9kZXNbaV0ueXJlcyAqIDEwNSAqIGh6ICsgNTAwMCkvMTAwOworCQkJaHRvdGFsID0gbW9kZS0+eHJlcyArIG1vZGUtPnJpZ2h0X21hcmdpbiArIG1vZGUtPmhzeW5jX2xlbgorCQkJCSsgbW9kZS0+bGVmdF9tYXJnaW47CisJCQl2dG90YWwgPSBtb2RlLT55cmVzICsgbW9kZS0+bG93ZXJfbWFyZ2luICsgbW9kZS0+dnN5bmNfbGVuCisJCQkJKyBtb2RlLT51cHBlcl9tYXJnaW47CisKKwkJCWlmIChtb2RlLT52bW9kZSAmIEZCX1ZNT0RFX0lOVEVSTEFDRUQpCisJCQkJdnRvdGFsIC89IDI7CisKKwkJCWlmIChtb2RlLT52bW9kZSAmIEZCX1ZNT0RFX0RPVUJMRSkKKwkJCQl2dG90YWwgKj0gMjsKKworCQkJaHNjYW4gPSAocGl4Y2xvY2sgKyBodG90YWwgLyAyKSAvIGh0b3RhbDsKKwkJCWhzY2FuID0gKGhzY2FuICsgNTAwKSAvIDEwMDAgKiAxMDAwOworCQkJaHogPSAoaHNjYW4gKyB2dG90YWwgLyAyKSAvIHZ0b3RhbDsKIAkJCQogCQkJaWYgKHNwZWNzLT5kY2xrbWF4ID09IDAgfHwgc3BlY3MtPmRjbGttYXggPCBwaXhjbG9jaykKIAkJCQlzcGVjcy0+ZGNsa21heCA9IHBpeGNsb2NrOworCiAJCQlpZiAoc3BlY3MtPmRjbGttaW4gPT0gMCB8fCBzcGVjcy0+ZGNsa21pbiA+IHBpeGNsb2NrKQogCQkJCXNwZWNzLT5kY2xrbWluID0gcGl4Y2xvY2s7CisKIAkJCWlmIChzcGVjcy0+aGZtYXggPT0gMCB8fCBzcGVjcy0+aGZtYXggPCBoc2NhbikKIAkJCQlzcGVjcy0+aGZtYXggPSBoc2NhbjsKKwogCQkJaWYgKHNwZWNzLT5oZm1pbiA9PSAwIHx8IHNwZWNzLT5oZm1pbiA+IGhzY2FuKQogCQkJCXNwZWNzLT5oZm1pbiA9IGhzY2FuOworCiAJCQlpZiAoc3BlY3MtPnZmbWF4ID09IDAgfHwgc3BlY3MtPnZmbWF4IDwgaHopCiAJCQkJc3BlY3MtPnZmbWF4ID0gaHo7CisKIAkJCWlmIChzcGVjcy0+dmZtaW4gPT0gMCB8fCBzcGVjcy0+dmZtaW4gPiBoeikKIAkJCQlzcGVjcy0+dmZtaW4gPSBoejsKIAkJfQpAQCAtMTI4MSw4ICsxMzAxLDcgQEAKIAkJLUVJTlZBTCA6IDA7CiB9CiAKLSNpZiBkZWZpbmVkKENPTkZJR19GQl9GSVJNV0FSRV9FRElEKSAmJiBkZWZpbmVkKF9faTM4Nl9fKQotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2lmIGRlZmluZWQoQ09ORklHX0ZJUk1XQVJFX0VESUQpICYmIGRlZmluZWQoQ09ORklHX1g4NikKIAogLyoKICAqIFdlIG5lZWQgdG8gZW5zdXJlIHRoYXQgdGhlIEVESUQgYmxvY2sgaXMgb25seSByZXR1cm5lZCBmb3IKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vZmJzeXNmcy5jIGIvZHJpdmVycy92aWRlby9mYnN5c2ZzLmMKaW5kZXggMzRlMDczOS4uNGY3OGYyMyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9mYnN5c2ZzLmMKKysrIGIvZHJpdmVycy92aWRlby9mYnN5c2ZzLmMKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9mYi5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogLyoqCiAgKiBmcmFtZWJ1ZmZlcl9hbGxvYyAtIGNyZWF0ZXMgYSBuZXcgZnJhbWUgYnVmZmVyIGluZm8gc3RydWN0dXJlCkBAIC01NSw2ICs1NiwxMCBAQAogCiAJaW5mby0+ZGV2aWNlID0gZGV2OwogCisjaWZkZWYgQ09ORklHX0ZCX0JBQ0tMSUdIVAorCW11dGV4X2luaXQoJmluZm8tPmJsX211dGV4KTsKKyNlbmRpZgorCiAJcmV0dXJuIGluZm87CiAjdW5kZWYgUEFERElORwogI3VuZGVmIEJZVEVTX1BFUl9MT05HCkBAIC05NSwxMyArMTAwLDIyIEBACiAJCSAgICAgICBjb25zdCBzdHJ1Y3QgZmJfdmlkZW9tb2RlICptb2RlKQogewogCWNoYXIgbSA9ICdVJzsKKwljaGFyIHYgPSAncCc7CisKIAlpZiAobW9kZS0+ZmxhZyAmIEZCX01PREVfSVNfREVUQUlMRUQpCiAJCW0gPSAnRCc7CiAJaWYgKG1vZGUtPmZsYWcgJiBGQl9NT0RFX0lTX1ZFU0EpCiAJCW0gPSAnVic7CiAJaWYgKG1vZGUtPmZsYWcgJiBGQl9NT0RFX0lTX1NUQU5EQVJEKQogCQltID0gJ1MnOwotCXJldHVybiBzbnByaW50ZigmYnVmW29mZnNldF0sIFBBR0VfU0laRSAtIG9mZnNldCwgIiVjOiVkeCVkLSVkXG4iLCBtLCBtb2RlLT54cmVzLCBtb2RlLT55cmVzLCBtb2RlLT5yZWZyZXNoKTsKKworCWlmIChtb2RlLT52bW9kZSAmIEZCX1ZNT0RFX0lOVEVSTEFDRUQpCisJCXYgPSAnaSc7CisJaWYgKG1vZGUtPnZtb2RlICYgRkJfVk1PREVfRE9VQkxFKQorCQl2ID0gJ2QnOworCisJcmV0dXJuIHNucHJpbnRmKCZidWZbb2Zmc2V0XSwgUEFHRV9TSVpFIC0gb2Zmc2V0LCAiJWM6JWR4JWQlYy0lZFxuIiwKKwkgICAgICAgICAgICAgICAgbSwgbW9kZS0+eHJlcywgbW9kZS0+eXJlcywgdiwgbW9kZS0+cmVmcmVzaCk7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IHN0b3JlX21vZGUoc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2aWNlLCBjb25zdCBjaGFyICogYnVmLApAQCAtMjMzLDQ1ICsyNDcsNiBAQAogCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBmYl9pbmZvLT52YXIucm90YXRlKTsKIH0KIAotc3RhdGljIHNzaXplX3Qgc3RvcmVfY29uX3JvdGF0ZShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXZpY2UsCi0JCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0Jc3RydWN0IGZiX2luZm8gKmZiX2luZm8gPSBjbGFzc19nZXRfZGV2ZGF0YShjbGFzc19kZXZpY2UpOwotCWludCByb3RhdGU7Ci0JY2hhciAqKmxhc3QgPSBOVUxMOwotCi0JYWNxdWlyZV9jb25zb2xlX3NlbSgpOwotCXJvdGF0ZSA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgbGFzdCwgMCk7Ci0JZmJfY29uX2R1aXQoZmJfaW5mbywgRkJfRVZFTlRfU0VUX0NPTl9ST1RBVEUsICZyb3RhdGUpOwotCXJlbGVhc2VfY29uc29sZV9zZW0oKTsKLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHN0b3JlX2Nvbl9yb3RhdGVfYWxsKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldmljZSwKLQkJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKLXsKLQlzdHJ1Y3QgZmJfaW5mbyAqZmJfaW5mbyA9IGNsYXNzX2dldF9kZXZkYXRhKGNsYXNzX2RldmljZSk7Ci0JaW50IHJvdGF0ZTsKLQljaGFyICoqbGFzdCA9IE5VTEw7Ci0KLQlhY3F1aXJlX2NvbnNvbGVfc2VtKCk7Ci0Jcm90YXRlID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBsYXN0LCAwKTsKLQlmYl9jb25fZHVpdChmYl9pbmZvLCBGQl9FVkVOVF9TRVRfQ09OX1JPVEFURV9BTEwsICZyb3RhdGUpOwotCXJlbGVhc2VfY29uc29sZV9zZW0oKTsKLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHNob3dfY29uX3JvdGF0ZShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXZpY2UsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgZmJfaW5mbyAqZmJfaW5mbyA9IGNsYXNzX2dldF9kZXZkYXRhKGNsYXNzX2RldmljZSk7Ci0JaW50IHJvdGF0ZTsKLQotCWFjcXVpcmVfY29uc29sZV9zZW0oKTsKLQlyb3RhdGUgPSBmYl9jb25fZHVpdChmYl9pbmZvLCBGQl9FVkVOVF9HRVRfQ09OX1JPVEFURSwgTlVMTCk7Ci0JcmVsZWFzZV9jb25zb2xlX3NlbSgpOwotCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCByb3RhdGUpOwotfQotCiBzdGF0aWMgc3NpemVfdCBzdG9yZV92aXJ0dWFsKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldmljZSwKIAkJCSAgICAgY29uc3QgY2hhciAqIGJ1Ziwgc2l6ZV90IGNvdW50KQogewpAQCAtNDE0LDYgKzM4OSw2NSBAQAogCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBmYl9pbmZvLT5zdGF0ZSk7CiB9CiAKKyNpZmRlZiBDT05GSUdfRkJfQkFDS0xJR0hUCitzdGF0aWMgc3NpemVfdCBzdG9yZV9ibF9jdXJ2ZShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXZpY2UsCisJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBmYl9pbmZvICpmYl9pbmZvID0gY2xhc3NfZ2V0X2RldmRhdGEoY2xhc3NfZGV2aWNlKTsKKwl1OCB0bXBfY3VydmVbRkJfQkFDS0xJR0hUX0xFVkVMU107CisJdW5zaWduZWQgaW50IGk7CisKKwlpZiAoY291bnQgIT0gKEZCX0JBQ0tMSUdIVF9MRVZFTFMgLyA4ICogMjQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZvciAoaSA9IDA7IGkgPCAoRkJfQkFDS0xJR0hUX0xFVkVMUyAvIDgpOyArK2kpCisJCWlmIChzc2NhbmYoJmJ1ZltpICogMjRdLAorCQkJIiUyaGh4ICUyaGh4ICUyaGh4ICUyaGh4ICUyaGh4ICUyaGh4ICUyaGh4ICUyaGh4XG4iLAorCQkJJnRtcF9jdXJ2ZVtpICogOCArIDBdLAorCQkJJnRtcF9jdXJ2ZVtpICogOCArIDFdLAorCQkJJnRtcF9jdXJ2ZVtpICogOCArIDJdLAorCQkJJnRtcF9jdXJ2ZVtpICogOCArIDNdLAorCQkJJnRtcF9jdXJ2ZVtpICogOCArIDRdLAorCQkJJnRtcF9jdXJ2ZVtpICogOCArIDVdLAorCQkJJnRtcF9jdXJ2ZVtpICogOCArIDZdLAorCQkJJnRtcF9jdXJ2ZVtpICogOCArIDddKSAhPSA4KQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBJZiB0aGVyZSBoYXMgYmVlbiBhbiBlcnJvciBpbiB0aGUgaW5wdXQgZGF0YSwgd2Ugd29uJ3QKKwkgKiByZWFjaCB0aGlzIGxvb3AuCisJICovCisJbXV0ZXhfbG9jaygmZmJfaW5mby0+YmxfbXV0ZXgpOworCWZvciAoaSA9IDA7IGkgPCBGQl9CQUNLTElHSFRfTEVWRUxTOyArK2kpCisJCWZiX2luZm8tPmJsX2N1cnZlW2ldID0gdG1wX2N1cnZlW2ldOworCW11dGV4X3VubG9jaygmZmJfaW5mby0+YmxfbXV0ZXgpOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X2JsX2N1cnZlKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldmljZSwgY2hhciAqYnVmKQoreworCXN0cnVjdCBmYl9pbmZvICpmYl9pbmZvID0gY2xhc3NfZ2V0X2RldmRhdGEoY2xhc3NfZGV2aWNlKTsKKwlzc2l6ZV90IGxlbiA9IDA7CisJdW5zaWduZWQgaW50IGk7CisKKwltdXRleF9sb2NrKCZmYl9pbmZvLT5ibF9tdXRleCk7CisJZm9yIChpID0gMDsgaSA8IEZCX0JBQ0tMSUdIVF9MRVZFTFM7IGkgKz0gOCkKKwkJbGVuICs9IHNucHJpbnRmKCZidWZbbGVuXSwgUEFHRV9TSVpFLAorCQkJCSIlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsCisJCQkJZmJfaW5mby0+YmxfY3VydmVbaSArIDBdLAorCQkJCWZiX2luZm8tPmJsX2N1cnZlW2kgKyAxXSwKKwkJCQlmYl9pbmZvLT5ibF9jdXJ2ZVtpICsgMl0sCisJCQkJZmJfaW5mby0+YmxfY3VydmVbaSArIDNdLAorCQkJCWZiX2luZm8tPmJsX2N1cnZlW2kgKyA0XSwKKwkJCQlmYl9pbmZvLT5ibF9jdXJ2ZVtpICsgNV0sCisJCQkJZmJfaW5mby0+YmxfY3VydmVbaSArIDZdLAorCQkJCWZiX2luZm8tPmJsX2N1cnZlW2kgKyA3XSk7CisJbXV0ZXhfdW5sb2NrKCZmYl9pbmZvLT5ibF9tdXRleCk7CisKKwlyZXR1cm4gbGVuOworfQorI2VuZGlmCisKIC8qIFdoZW4gY21hcCBpcyBhZGRlZCBiYWNrIGluIGl0IHNob3VsZCBiZSBhIGJpbmFyeSBhdHRyaWJ1dGUKICAqIG5vdCBhIHRleHQgb25lLiBDb25zaWRlcmF0aW9uIHNob3VsZCBhbHNvIGJlIGdpdmVuIHRvIGNvbnZlcnRpbmcKICAqIGZiZGV2IHRvIHVzZSBjb25maWdmcyBpbnN0ZWFkIG9mIHN5c2ZzICovCkBAIC00MjksOSArNDYzLDEwIEBACiAJX19BVFRSKG5hbWUsIFNfSVJVR08sIHNob3dfbmFtZSwgTlVMTCksCiAJX19BVFRSKHN0cmlkZSwgU19JUlVHTywgc2hvd19zdHJpZGUsIE5VTEwpLAogCV9fQVRUUihyb3RhdGUsIFNfSVJVR098U19JV1VTUiwgc2hvd19yb3RhdGUsIHN0b3JlX3JvdGF0ZSksCi0JX19BVFRSKGNvbl9yb3RhdGUsIFNfSVJVR098U19JV1VTUiwgc2hvd19jb25fcm90YXRlLCBzdG9yZV9jb25fcm90YXRlKSwKLQlfX0FUVFIoY29uX3JvdGF0ZV9hbGwsIFNfSVdVU1IsIE5VTEwsIHN0b3JlX2Nvbl9yb3RhdGVfYWxsKSwKIAlfX0FUVFIoc3RhdGUsIFNfSVJVR098U19JV1VTUiwgc2hvd19mYnN0YXRlLCBzdG9yZV9mYnN0YXRlKSwKKyNpZmRlZiBDT05GSUdfRkJfQkFDS0xJR0hUCisJX19BVFRSKGJsX2N1cnZlLCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfYmxfY3VydmUsIHN0b3JlX2JsX2N1cnZlKSwKKyNlbmRpZgogfTsKIAogaW50IGZiX2luaXRfY2xhc3NfZGV2aWNlKHN0cnVjdCBmYl9pbmZvICpmYl9pbmZvKQpAQCAtNDU0LDQgKzQ4OSwyNSBAQAogCQkJCQkgJmNsYXNzX2RldmljZV9hdHRyc1tpXSk7CiB9CiAKKyNpZmRlZiBDT05GSUdfRkJfQkFDS0xJR0hUCisvKiBUaGlzIGZ1bmN0aW9uIGdlbmVyYXRlcyBhIGxpbmVhciBiYWNrbGlnaHQgY3VydmUKKyAqCisgKiAgICAgMDogb2ZmCisgKiAgIDEtNzogbWluCisgKiA4LTEyNzogbGluZWFyIGZyb20gbWluIHRvIG1heAorICovCit2b2lkIGZiX2JsX2RlZmF1bHRfY3VydmUoc3RydWN0IGZiX2luZm8gKmZiX2luZm8sIHU4IG9mZiwgdTggbWluLCB1OCBtYXgpCit7CisJdW5zaWduZWQgaW50IGksIGZsYXQsIGNvdW50LCByYW5nZSA9IChtYXggLSBtaW4pOwogCisJZmJfaW5mby0+YmxfY3VydmVbMF0gPSBvZmY7CisKKwlmb3IgKGZsYXQgPSAxOyBmbGF0IDwgKEZCX0JBQ0tMSUdIVF9MRVZFTFMgLyAxNik7ICsrZmxhdCkKKwkJZmJfaW5mby0+YmxfY3VydmVbZmxhdF0gPSBtaW47CisKKwljb3VudCA9IEZCX0JBQ0tMSUdIVF9MRVZFTFMgKiAxNSAvIDE2OworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgKytpKQorCQlmYl9pbmZvLT5ibF9jdXJ2ZVtmbGF0ICsgaV0gPSBtaW4gKyAocmFuZ2UgKiAoaSArIDEpIC8gY291bnQpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZmJfYmxfZGVmYXVsdF9jdXJ2ZSk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vZ2VvZGUvZ3gxZmJfY29yZS5jIGIvZHJpdmVycy92aWRlby9nZW9kZS9neDFmYl9jb3JlLmMKaW5kZXggMjBlNjkxNS4uNGQzYTg4NyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9nZW9kZS9neDFmYl9jb3JlLmMKKysrIGIvZHJpdmVycy92aWRlby9nZW9kZS9neDFmYl9jb3JlLmMKQEAgLTM3Niw4ICszNzYsNiBAQAogCQlyZWxlYXNlX21lbV9yZWdpb24oZ3gxX2d4X2Jhc2UoKSArIDB4ODMwMCwgMHgxMDApOwogCX0KIAotCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKLQogCWlmIChpbmZvKQogCQlmcmFtZWJ1ZmZlcl9yZWxlYXNlKGluZm8pOwogCXJldHVybiByZXQ7CkBAIC0zOTksNyArMzk3LDYgQEAKIAlpb3VubWFwKHBhci0+ZGNfcmVncyk7CiAJcmVsZWFzZV9tZW1fcmVnaW9uKGd4MV9neF9iYXNlKCkgKyAweDgzMDAsIDB4MTAwKTsKIAotCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKIAlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CiAKIAlmcmFtZWJ1ZmZlcl9yZWxlYXNlKGluZm8pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9nZW9kZS9neGZiX2NvcmUuYyBiL2RyaXZlcnMvdmlkZW8vZ2VvZGUvZ3hmYl9jb3JlLmMKaW5kZXggODljMzRiMS4uNWVmMTJhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9nZW9kZS9neGZiX2NvcmUuYworKysgYi9kcml2ZXJzL3ZpZGVvL2dlb2RlL2d4ZmJfY29yZS5jCkBAIC0zNTQsOCArMzU0LDYgQEAKIAkJcGNpX3JlbGVhc2VfcmVnaW9uKHBkZXYsIDIpOwogCX0KIAotCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKLQogCWlmIChpbmZvKQogCQlmcmFtZWJ1ZmZlcl9yZWxlYXNlKGluZm8pOwogCXJldHVybiByZXQ7CkBAIC0zNzcsNyArMzc1LDYgQEAKIAlpb3VubWFwKHBhci0+ZGNfcmVncyk7CiAJcGNpX3JlbGVhc2VfcmVnaW9uKHBkZXYsIDIpOwogCi0JcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwogCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKIAogCWZyYW1lYnVmZmVyX3JlbGVhc2UoaW5mbyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2k4MTAvaTgxMF9tYWluLmMgYi9kcml2ZXJzL3ZpZGVvL2k4MTAvaTgxMF9tYWluLmMKaW5kZXggNDRhYTJmZi4uYTFmN2Q4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9pODEwL2k4MTBfbWFpbi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vaTgxMC9pODEwX21haW4uYwpAQCAtMjExMCw5ICsyMTEwLDYgQEAKIAlpZiAocGFyLT5yZXNfZmxhZ3MgJiBNTUlPX1JFUSkKIAkJcmVsZWFzZV9tZW1fcmVnaW9uKHBhci0+bW1pb19zdGFydF9waHlzLCBNTUlPX1NJWkUpOwogCi0JaWYgKHBhci0+cmVzX2ZsYWdzICYgUENJX0RFVklDRV9FTkFCTEVEKQotCQlwY2lfZGlzYWJsZV9kZXZpY2UocGFyLT5kZXYpOwotCiAJZnJhbWVidWZmZXJfcmVsZWFzZShpbmZvKTsKIAogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9pZ2FmYi5jIGIvZHJpdmVycy92aWRlby9pZ2FmYi5jCmluZGV4IDZiODgwNTAuLjhhMGMyZDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vaWdhZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL2lnYWZiLmMKQEAgLTIzMiw5ICsyMzIsNiBAQAogCiAJc2l6ZSA9IHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydDsKIAotCS8qIFRvIHN0b3AgdGhlIHN3YXBwZXIgZnJvbSBldmVuIGNvbnNpZGVyaW5nIHRoZXNlIHBhZ2VzLiAqLwotCXZtYS0+dm1fZmxhZ3MgfD0gKFZNX1NITSB8IFZNX0xPQ0tFRCk7Ci0KIAkvKiBFYWNoIHBhZ2UsIHNlZSB3aGljaCBtYXAgYXBwbGllcyAqLwogCWZvciAocGFnZSA9IDA7IHBhZ2UgPCBzaXplOyApIHsKIAkJbWFwX3NpemUgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9pbWFjZmIuYyBiL2RyaXZlcnMvdmlkZW8vaW1hY2ZiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IxYzE2OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vaW1hY2ZiLmMKQEAgLTAsMCArMSwzNDUgQEAKKy8qCisgKiBmcmFtZWJ1ZmZlciBkcml2ZXIgZm9yIEludGVsIEJhc2VkIE1hYydzCisgKgorICogKGMpIDIwMDYgRWRnYXIgSHVjZWsgPGdpbWxpQGRhcmstZ3JlZW4uY29tPgorICogT3JpZ2luYWwgaW1hYyBkcml2ZXIgd3JpdHRlbiBieSBHZXJkIEtub3JyIDxrcmF4ZWxAZ29sZGJhY2guaW4tYmVybGluLmRlPgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlIDx2aWRlby92Z2EuaD4KKwordHlwZWRlZiBlbnVtIF9NQUNfVFlQRSB7CisJTV9JMTcsCisJTV9JMjAsCisJTV9NSU5JLAorCU1fTUFDQk9PSywKKwlNX05FVworfSBNQUNfVFlQRTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gaW1hY2ZiX2RlZmluZWQgX19pbml0ZGF0YSA9IHsKKwkuYWN0aXZhdGUJCT0gRkJfQUNUSVZBVEVfTk9XLAorCS5oZWlnaHQJCQk9IC0xLAorCS53aWR0aAkJCT0gLTEsCisJLnJpZ2h0X21hcmdpbgkJPSAzMiwKKwkudXBwZXJfbWFyZ2luCQk9IDE2LAorCS5sb3dlcl9tYXJnaW4JCT0gNCwKKwkudnN5bmNfbGVuCQk9IDQsCisJLnZtb2RlCQkJPSBGQl9WTU9ERV9OT05JTlRFUkxBQ0VELAorfTsKKworc3RhdGljIHN0cnVjdCBmYl9maXhfc2NyZWVuaW5mbyBpbWFjZmJfZml4IF9faW5pdGRhdGEgPSB7CisJLmlkCQkJPSAiSU1BQyBWR0EiLAorCS50eXBlCQkJPSBGQl9UWVBFX1BBQ0tFRF9QSVhFTFMsCisJLmFjY2VsCQkJPSBGQl9BQ0NFTF9OT05FLAorCS52aXN1YWwJCQk9IEZCX1ZJU1VBTF9UUlVFQ09MT1IsCit9OworCitzdGF0aWMgaW50IGludmVyc2U7CitzdGF0aWMgaW50IG1vZGVsCQk9IE1fTkVXOworc3RhdGljIGludCBtYW51YWxfaGVpZ2h0Oworc3RhdGljIGludCBtYW51YWxfd2lkdGg7CisKKyNkZWZpbmUJREVGQVVMVF9GQl9NRU0JMTAyNCoxMDI0KjE2CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IGltYWNmYl9zZXRjb2xyZWcodW5zaWduZWQgcmVnbm8sIHVuc2lnbmVkIHJlZCwgdW5zaWduZWQgZ3JlZW4sCisJCQkgICAgdW5zaWduZWQgYmx1ZSwgdW5zaWduZWQgdHJhbnNwLAorCQkJICAgIHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCS8qCisJICogIFNldCBhIHNpbmdsZSBjb2xvciByZWdpc3Rlci4gVGhlIHZhbHVlcyBzdXBwbGllZCBhcmUKKwkgKiAgYWxyZWFkeSByb3VuZGVkIGRvd24gdG8gdGhlIGhhcmR3YXJlJ3MgY2FwYWJpbGl0aWVzCisJICogIChhY2NvcmRpbmcgdG8gdGhlIGVudHJpZXMgaW4gdGhlIGB2YXInIHN0cnVjdHVyZSkuIFJldHVybgorCSAqICAhPSAwIGZvciBpbnZhbGlkIHJlZ25vLgorCSAqLworCisJaWYgKHJlZ25vID49IGluZm8tPmNtYXAubGVuKQorCQlyZXR1cm4gMTsKKworCWlmIChyZWdubyA8IDE2KSB7CisJCXJlZCAgID4+PSA4OworCQlncmVlbiA+Pj0gODsKKwkJYmx1ZSAgPj49IDg7CisJCSgodTMyICopKGluZm8tPnBzZXVkb19wYWxldHRlKSlbcmVnbm9dID0KKwkJCShyZWQgICA8PCBpbmZvLT52YXIucmVkLm9mZnNldCkgICB8CisJCQkoZ3JlZW4gPDwgaW5mby0+dmFyLmdyZWVuLm9mZnNldCkgfAorCQkJKGJsdWUgIDw8IGluZm8tPnZhci5ibHVlLm9mZnNldCk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGZiX29wcyBpbWFjZmJfb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuZmJfc2V0Y29scmVnCT0gaW1hY2ZiX3NldGNvbHJlZywKKwkuZmJfZmlsbHJlY3QJPSBjZmJfZmlsbHJlY3QsCisJLmZiX2NvcHlhcmVhCT0gY2ZiX2NvcHlhcmVhLAorCS5mYl9pbWFnZWJsaXQJPSBjZmJfaW1hZ2VibGl0LAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW1hY2ZiX3NldHVwKGNoYXIgKm9wdGlvbnMpCit7CisJY2hhciAqdGhpc19vcHQ7CisKKwlpZiAoIW9wdGlvbnMgfHwgISpvcHRpb25zKQorCQlyZXR1cm4gMDsKKworCXdoaWxlICgodGhpc19vcHQgPSBzdHJzZXAoJm9wdGlvbnMsICIsIikpICE9IE5VTEwpIHsKKwkJaWYgKCEqdGhpc19vcHQpIGNvbnRpbnVlOworCisJCWlmICghc3RyY21wKHRoaXNfb3B0LCAiaW52ZXJzZSIpKQorCQkJaW52ZXJzZSA9IDE7CisJCWVsc2UgaWYgKCFzdHJjbXAodGhpc19vcHQsICJpMTciKSkKKwkJCW1vZGVsID0gTV9JMTc7CisJCWVsc2UgaWYgKCFzdHJjbXAodGhpc19vcHQsICJpMjAiKSkKKwkJCW1vZGVsID0gTV9JMjA7CisJCWVsc2UgaWYgKCFzdHJjbXAodGhpc19vcHQsICJtaW5pIikpCisJCQltb2RlbCA9IE1fTUlOSTsKKwkJZWxzZSBpZiAoIXN0cmNtcCh0aGlzX29wdCwgIm1hY2Jvb2siKSkKKwkJCW1vZGVsID0gTV9NQUNCT09LOworCQllbHNlIGlmICghc3RybmNtcCh0aGlzX29wdCwgImhlaWdodDoiLCA3KSkKKwkJCW1hbnVhbF9oZWlnaHQgPSBzaW1wbGVfc3RydG91bCh0aGlzX29wdCs3LCBOVUxMLCAwKTsKKwkJZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsICJ3aWR0aDoiLCA2KSkKKwkJCW1hbnVhbF93aWR0aCA9IHNpbXBsZV9zdHJ0b3VsKHRoaXNfb3B0KzYsIE5VTEwsIDApOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgaW1hY2ZiX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZmJfaW5mbyAqaW5mbzsKKwlpbnQgZXJyOworCXVuc2lnbmVkIGludCBzaXplX3Ztb2RlOworCXVuc2lnbmVkIGludCBzaXplX3JlbWFwOworCXVuc2lnbmVkIGludCBzaXplX3RvdGFsOworCisJc2NyZWVuX2luZm8ubGZiX2RlcHRoID0gMzI7CisJc2NyZWVuX2luZm8ubGZiX3NpemUgPSBERUZBVUxUX0ZCX01FTSAvIDB4MTAwMDA7CisJc2NyZWVuX2luZm8ucGFnZXM9MTsKKwlzY3JlZW5faW5mby5ibHVlX3NpemUgPSA4OworCXNjcmVlbl9pbmZvLmJsdWVfcG9zID0gMDsKKwlzY3JlZW5faW5mby5ncmVlbl9zaXplID0gODsKKwlzY3JlZW5faW5mby5ncmVlbl9wb3MgPSA4OworCXNjcmVlbl9pbmZvLnJlZF9zaXplID0gODsKKwlzY3JlZW5faW5mby5yZWRfcG9zID0gMTY7CisJc2NyZWVuX2luZm8ucnN2ZF9zaXplID0gODsKKwlzY3JlZW5faW5mby5yc3ZkX3BvcyA9IDI0OworCisJc3dpdGNoIChtb2RlbCkgeworCWNhc2UgTV9JMTc6CisJCXNjcmVlbl9pbmZvLmxmYl93aWR0aCA9IDE0NDA7CisJCXNjcmVlbl9pbmZvLmxmYl9oZWlnaHQgPSA5MDA7CisJCXNjcmVlbl9pbmZvLmxmYl9saW5lbGVuZ3RoID0gMTQ3MiAqIDQ7CisJCXNjcmVlbl9pbmZvLmxmYl9iYXNlID0gMHg4MDAxMDAwMDsKKwkJYnJlYWs7CisJY2FzZSBNX05FVzoKKwljYXNlIE1fSTIwOgorCQlzY3JlZW5faW5mby5sZmJfd2lkdGggPSAxNjgwOworCQlzY3JlZW5faW5mby5sZmJfaGVpZ2h0ID0gMTA1MDsKKwkJc2NyZWVuX2luZm8ubGZiX2xpbmVsZW5ndGggPSAxNzI4ICogNDsKKwkJc2NyZWVuX2luZm8ubGZiX2Jhc2UgPSAweDgwMDEwMDAwOworCQlicmVhazsKKwljYXNlIE1fTUlOSToKKwkJc2NyZWVuX2luZm8ubGZiX3dpZHRoID0gMTAyNDsKKwkJc2NyZWVuX2luZm8ubGZiX2hlaWdodCA9IDc2ODsKKwkJc2NyZWVuX2luZm8ubGZiX2xpbmVsZW5ndGggPSAyMDQ4ICogNDsKKwkJc2NyZWVuX2luZm8ubGZiX2Jhc2UgPSAweDgwMDAwMDAwOworCQlicmVhazsKKwljYXNlIE1fTUFDQk9PSzoKKwkJc2NyZWVuX2luZm8ubGZiX3dpZHRoID0gMTI4MDsKKwkJc2NyZWVuX2luZm8ubGZiX2hlaWdodCA9IDgwMDsKKwkJc2NyZWVuX2luZm8ubGZiX2xpbmVsZW5ndGggPSAyMDQ4ICogNDsKKwkJc2NyZWVuX2luZm8ubGZiX2Jhc2UgPSAweDgwMDAwMDAwOworCQlicmVhazsKKyAJfQorCisJLyogaWYgdGhlIHVzZXIgd2FudHMgdG8gbWFudWFsbHkgc3BlY2lmeSBoZWlnaHQvd2lkdGgsCisJICAgd2Ugd2lsbCBvdmVycmlkZSB0aGUgZGVmYXVsdHMgKi8KKwkvKiBUT0RPOiBldmVudHVhbGx5IGdldCBhdXRvLWRldGVjdGlvbiB3b3JraW5nICovCisJaWYgKG1hbnVhbF9oZWlnaHQgPiAwKQorCQlzY3JlZW5faW5mby5sZmJfaGVpZ2h0ID0gbWFudWFsX2hlaWdodDsKKwlpZiAobWFudWFsX3dpZHRoID4gMCkKKwkJc2NyZWVuX2luZm8ubGZiX3dpZHRoID0gbWFudWFsX3dpZHRoOworCisJaW1hY2ZiX2ZpeC5zbWVtX3N0YXJ0ID0gc2NyZWVuX2luZm8ubGZiX2Jhc2U7CisJaW1hY2ZiX2RlZmluZWQuYml0c19wZXJfcGl4ZWwgPSBzY3JlZW5faW5mby5sZmJfZGVwdGg7CisJaW1hY2ZiX2RlZmluZWQueHJlcyA9IHNjcmVlbl9pbmZvLmxmYl93aWR0aDsKKwlpbWFjZmJfZGVmaW5lZC55cmVzID0gc2NyZWVuX2luZm8ubGZiX2hlaWdodDsKKwlpbWFjZmJfZml4LmxpbmVfbGVuZ3RoID0gc2NyZWVuX2luZm8ubGZiX2xpbmVsZW5ndGg7CisKKwkvKiAgIHNpemVfdm1vZGUgLS0gdGhhdCBpcyB0aGUgYW1vdW50IG9mIG1lbW9yeSBuZWVkZWQgZm9yIHRoZQorCSAqICAgICAgICAgICAgICAgICB1c2VkIHZpZGVvIG1vZGUsIGkuZS4gdGhlIG1pbmltdW0gYW1vdW50IG9mCisJICogICAgICAgICAgICAgICAgIG1lbW9yeSB3ZSBuZWVkLiAqLworCXNpemVfdm1vZGUgPSBpbWFjZmJfZGVmaW5lZC55cmVzICogaW1hY2ZiX2ZpeC5saW5lX2xlbmd0aDsKKworCS8qICAgc2l6ZV90b3RhbCAtLSBhbGwgdmlkZW8gbWVtb3J5IHdlIGhhdmUuIFVzZWQgZm9yCisJICogICAgICAgICAgICAgICAgIGVudHJpZXMsIHJlc3NvdXJjZSBhbGxvY2F0aW9uIGFuZCBib3VuZHMKKwkgKiAgICAgICAgICAgICAgICAgY2hlY2tpbmcuICovCisJc2l6ZV90b3RhbCA9IHNjcmVlbl9pbmZvLmxmYl9zaXplICogNjU1MzY7CisJaWYgKHNpemVfdG90YWwgPCBzaXplX3Ztb2RlKQorCQlzaXplX3RvdGFsID0gc2l6ZV92bW9kZTsKKworCS8qICAgc2l6ZV9yZW1hcCAtLSB0aGUgYW1vdW50IG9mIHZpZGVvIG1lbW9yeSB3ZSBhcmUgZ29pbmcgdG8KKwkgKiAgICAgICAgICAgICAgICAgdXNlIGZvciBpbWFjZmIuICBXaXRoIG1vZGVybiBjYXJkcyBpdCBpcyBubworCSAqICAgICAgICAgICAgICAgICBvcHRpb24gdG8gc2ltcGx5IHVzZSBzaXplX3RvdGFsIGFzIHRoYXQKKwkgKiAgICAgICAgICAgICAgICAgd2FzdGVzIHBsZW50eSBvZiBrZXJuZWwgYWRkcmVzcyBzcGFjZS4gKi8KKwlzaXplX3JlbWFwICA9IHNpemVfdm1vZGUgKiAyOworCWlmIChzaXplX3JlbWFwIDwgc2l6ZV92bW9kZSkKKwkJc2l6ZV9yZW1hcCA9IHNpemVfdm1vZGU7CisJaWYgKHNpemVfcmVtYXAgPiBzaXplX3RvdGFsKQorCQlzaXplX3JlbWFwID0gc2l6ZV90b3RhbDsKKwlpbWFjZmJfZml4LnNtZW1fbGVuID0gc2l6ZV9yZW1hcDsKKworI2lmbmRlZiBfX2kzODZfXworCXNjcmVlbl9pbmZvLmltYWNwbV9zZWcgPSAwOworI2VuZGlmCisKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihpbWFjZmJfZml4LnNtZW1fc3RhcnQsIHNpemVfdG90YWwsICJpbWFjZmIiKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiaW1hY2ZiOiBjYW5ub3QgcmVzZXJ2ZSB2aWRlbyBtZW1vcnkgYXQgMHglbHhcbiIsCisJCQlpbWFjZmJfZml4LnNtZW1fc3RhcnQpOworCQkvKiBXZSBjYW5ub3QgbWFrZSB0aGlzIGZhdGFsLiBTb21ldGltZXMgdGhpcyBjb21lcyBmcm9tIG1hZ2ljCisJCSAgIHNwYWNlcyBvdXIgcmVzb3VyY2UgaGFuZGxlcnMgc2ltcGx5IGRvbid0IGtub3cgYWJvdXQgKi8KKwl9CisKKwlpbmZvID0gZnJhbWVidWZmZXJfYWxsb2Moc2l6ZW9mKHUzMikgKiAxNiwgJmRldi0+ZGV2KTsKKwlpZiAoIWluZm8pIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfcmVsZWFzZV9tZW07CisJfQorCWluZm8tPnBzZXVkb19wYWxldHRlID0gaW5mby0+cGFyOworCWluZm8tPnBhciA9IE5VTEw7CisKKwlpbmZvLT5zY3JlZW5fYmFzZSA9IGlvcmVtYXAoaW1hY2ZiX2ZpeC5zbWVtX3N0YXJ0LCBpbWFjZmJfZml4LnNtZW1fbGVuKTsKKwlpZiAoIWluZm8tPnNjcmVlbl9iYXNlKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaW1hY2ZiOiBhYm9ydCwgY2Fubm90IGlvcmVtYXAgdmlkZW8gbWVtb3J5ICIKKwkJCQkiMHgleCBAIDB4JWx4XG4iLAorCQkJaW1hY2ZiX2ZpeC5zbWVtX2xlbiwgaW1hY2ZiX2ZpeC5zbWVtX3N0YXJ0KTsKKwkJZXJyID0gLUVJTzsKKwkJZ290byBlcnJfdW5tYXA7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiaW1hY2ZiOiBmcmFtZWJ1ZmZlciBhdCAweCVseCwgbWFwcGVkIHRvIDB4JXAsICIKKwkgICAgICAgInVzaW5nICVkaywgdG90YWwgJWRrXG4iLAorCSAgICAgICBpbWFjZmJfZml4LnNtZW1fc3RhcnQsIGluZm8tPnNjcmVlbl9iYXNlLAorCSAgICAgICBzaXplX3JlbWFwLzEwMjQsIHNpemVfdG90YWwvMTAyNCk7CisJcHJpbnRrKEtFUk5fSU5GTyAiaW1hY2ZiOiBtb2RlIGlzICVkeCVkeCVkLCBsaW5lbGVuZ3RoPSVkLCBwYWdlcz0lZFxuIiwKKwkgICAgICAgaW1hY2ZiX2RlZmluZWQueHJlcywgaW1hY2ZiX2RlZmluZWQueXJlcywKKwkgICAgICAgaW1hY2ZiX2RlZmluZWQuYml0c19wZXJfcGl4ZWwsIGltYWNmYl9maXgubGluZV9sZW5ndGgsCisJICAgICAgIHNjcmVlbl9pbmZvLnBhZ2VzKTsKKworCWltYWNmYl9kZWZpbmVkLnhyZXNfdmlydHVhbCA9IGltYWNmYl9kZWZpbmVkLnhyZXM7CisJaW1hY2ZiX2RlZmluZWQueXJlc192aXJ0dWFsID0gaW1hY2ZiX2ZpeC5zbWVtX2xlbiAvCisJCQkJCWltYWNmYl9maXgubGluZV9sZW5ndGg7CisJcHJpbnRrKEtFUk5fSU5GTyAiaW1hY2ZiOiBzY3JvbGxpbmc6IHJlZHJhd1xuIik7CisJaW1hY2ZiX2RlZmluZWQueXJlc192aXJ0dWFsID0gaW1hY2ZiX2RlZmluZWQueXJlczsKKworCS8qIHNvbWUgZHVtbXkgdmFsdWVzIGZvciB0aW1pbmcgdG8gbWFrZSBmYnNldCBoYXBweSAqLworCWltYWNmYl9kZWZpbmVkLnBpeGNsb2NrICAgICA9IDEwMDAwMDAwIC8gaW1hY2ZiX2RlZmluZWQueHJlcyAqCisJCQkJCTEwMDAgLyBpbWFjZmJfZGVmaW5lZC55cmVzOworCWltYWNmYl9kZWZpbmVkLmxlZnRfbWFyZ2luICA9IChpbWFjZmJfZGVmaW5lZC54cmVzIC8gOCkgJiAweGY4OworCWltYWNmYl9kZWZpbmVkLmhzeW5jX2xlbiAgICA9IChpbWFjZmJfZGVmaW5lZC54cmVzIC8gOCkgJiAweGY4OworCisJaW1hY2ZiX2RlZmluZWQucmVkLm9mZnNldCAgICA9IHNjcmVlbl9pbmZvLnJlZF9wb3M7CisJaW1hY2ZiX2RlZmluZWQucmVkLmxlbmd0aCAgICA9IHNjcmVlbl9pbmZvLnJlZF9zaXplOworCWltYWNmYl9kZWZpbmVkLmdyZWVuLm9mZnNldCAgPSBzY3JlZW5faW5mby5ncmVlbl9wb3M7CisJaW1hY2ZiX2RlZmluZWQuZ3JlZW4ubGVuZ3RoICA9IHNjcmVlbl9pbmZvLmdyZWVuX3NpemU7CisJaW1hY2ZiX2RlZmluZWQuYmx1ZS5vZmZzZXQgICA9IHNjcmVlbl9pbmZvLmJsdWVfcG9zOworCWltYWNmYl9kZWZpbmVkLmJsdWUubGVuZ3RoICAgPSBzY3JlZW5faW5mby5ibHVlX3NpemU7CisJaW1hY2ZiX2RlZmluZWQudHJhbnNwLm9mZnNldCA9IHNjcmVlbl9pbmZvLnJzdmRfcG9zOworCWltYWNmYl9kZWZpbmVkLnRyYW5zcC5sZW5ndGggPSBzY3JlZW5faW5mby5yc3ZkX3NpemU7CisKKwlwcmludGsoS0VSTl9JTkZPICJpbWFjZmI6ICVzOiAiCisJICAgICAgICJzaXplPSVkOiVkOiVkOiVkLCBzaGlmdD0lZDolZDolZDolZFxuIiwKKwkgICAgICAgIlRydWVjb2xvciIsCisJICAgICAgIHNjcmVlbl9pbmZvLnJzdmRfc2l6ZSwKKwkgICAgICAgc2NyZWVuX2luZm8ucmVkX3NpemUsCisJICAgICAgIHNjcmVlbl9pbmZvLmdyZWVuX3NpemUsCisJICAgICAgIHNjcmVlbl9pbmZvLmJsdWVfc2l6ZSwKKwkgICAgICAgc2NyZWVuX2luZm8ucnN2ZF9wb3MsCisJICAgICAgIHNjcmVlbl9pbmZvLnJlZF9wb3MsCisJICAgICAgIHNjcmVlbl9pbmZvLmdyZWVuX3BvcywKKwkgICAgICAgc2NyZWVuX2luZm8uYmx1ZV9wb3MpOworCisJaW1hY2ZiX2ZpeC55cGFuc3RlcCAgPSAwOworCWltYWNmYl9maXgueXdyYXBzdGVwID0gMDsKKworCS8qIHJlcXVlc3QgZmFpbHVyZSBkb2VzIG5vdCBmYXplIHVzLCBhcyB2Z2Fjb24gcHJvYmFibHkgaGFzIHRoaXMKKwkgKiByZWdpb24gYWxyZWFkeSAoRklYTUUpICovCisJcmVxdWVzdF9yZWdpb24oMHgzYzAsIDMyLCAiaW1hY2ZiIik7CisKKwlpbmZvLT5mYm9wcyA9ICZpbWFjZmJfb3BzOworCWluZm8tPnZhciA9IGltYWNmYl9kZWZpbmVkOworCWluZm8tPmZpeCA9IGltYWNmYl9maXg7CisJaW5mby0+ZmxhZ3MgPSBGQklORk9fRkxBR19ERUZBVUxUOworCisJaWYgKGZiX2FsbG9jX2NtYXAoJmluZm8tPmNtYXAsIDI1NiwgMCkgPCAwKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX3VubWFwOworCX0KKwlpZiAocmVnaXN0ZXJfZnJhbWVidWZmZXIoaW5mbyk8MCkgeworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIGVycl9mYl9kZWFsb2M7CisJfQorCXByaW50ayhLRVJOX0lORk8gImZiJWQ6ICVzIGZyYW1lIGJ1ZmZlciBkZXZpY2VcbiIsCisJICAgICAgIGluZm8tPm5vZGUsIGluZm8tPmZpeC5pZCk7CisJcmV0dXJuIDA7CisKK2Vycl9mYl9kZWFsb2M6CisJZmJfZGVhbGxvY19jbWFwKCZpbmZvLT5jbWFwKTsKK2Vycl91bm1hcDoKKwlpb3VubWFwKGluZm8tPnNjcmVlbl9iYXNlKTsKKwlmcmFtZWJ1ZmZlcl9yZWxlYXNlKGluZm8pOworZXJyX3JlbGVhc2VfbWVtOgorCXJlbGVhc2VfbWVtX3JlZ2lvbihpbWFjZmJfZml4LnNtZW1fc3RhcnQsIHNpemVfdG90YWwpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGltYWNmYl9kcml2ZXIgPSB7CisJLnByb2JlCT0gaW1hY2ZiX3Byb2JlLAorCS5kcml2ZXIJPSB7CisJCS5uYW1lCT0gImltYWNmYiIsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGltYWNmYl9kZXZpY2UgPSB7CisJLm5hbWUJPSAiaW1hY2ZiIiwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGltYWNmYl9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKwljaGFyICpvcHRpb24gPSBOVUxMOworCisJLyogaWdub3JlIGVycm9yIHJldHVybiBvZiBmYl9nZXRfb3B0aW9ucyAqLworCWZiX2dldF9vcHRpb25zKCJpbWFjZmIiLCAmb3B0aW9uKTsKKwlpbWFjZmJfc2V0dXAob3B0aW9uKTsKKwlyZXQgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmltYWNmYl9kcml2ZXIpOworCisJaWYgKCFyZXQpIHsKKwkJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZpbWFjZmJfZGV2aWNlKTsKKwkJaWYgKHJldCkKKwkJCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZpbWFjZmJfZHJpdmVyKTsKKwl9CisJcmV0dXJuIHJldDsKK30KK21vZHVsZV9pbml0KGltYWNmYl9pbml0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9tYWNtb2Rlcy5jIGIvZHJpdmVycy92aWRlby9tYWNtb2Rlcy5jCmluZGV4IGMwMzg1YzYuLmQyMTMyMWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbWFjbW9kZXMuYworKysgYi9kcml2ZXJzL3ZpZGVvL21hY21vZGVzLmMKQEAgLTMyNyw3ICszMjcsNiBAQAogICAgIH0KICAgICByZXR1cm4gLUVJTlZBTDsKIH0KLUVYUE9SVF9TWU1CT0wobWFjX3Zhcl90b192bW9kZSk7CiAKIC8qKgogICoJbWFjX21hcF9tb25pdG9yX3NlbnNlIC0gQ29udmVydCBtb25pdG9yIHNlbnNlIHRvIHZtb2RlCkBAIC0zNzEsOCArMzcwLDkgQEAKICAqCiAgKi8KIAotaW50IF9faW5pdCBtYWNfZmluZF9tb2RlKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbywKLQkJCSBjb25zdCBjaGFyICptb2RlX29wdGlvbiwgdW5zaWduZWQgaW50IGRlZmF1bHRfYnBwKQoraW50IF9fZGV2aW5pdCBtYWNfZmluZF9tb2RlKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLAorCQkJICAgIHN0cnVjdCBmYl9pbmZvICppbmZvLCBjb25zdCBjaGFyICptb2RlX29wdGlvbiwKKwkJCSAgICB1bnNpZ25lZCBpbnQgZGVmYXVsdF9icHApCiB7CiAgICAgY29uc3Qgc3RydWN0IGZiX3ZpZGVvbW9kZSAqZGIgPSBOVUxMOwogICAgIHVuc2lnbmVkIGludCBkYnNpemUgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9tYWNtb2Rlcy5oIGIvZHJpdmVycy92aWRlby9tYWNtb2Rlcy5oCmluZGV4IDIzMmY1YTAuLmJhYmViODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbWFjbW9kZXMuaAorKysgYi9kcml2ZXJzL3ZpZGVvL21hY21vZGVzLmgKQEAgLTU1LDkgKzU1LDEwIEBACiBleHRlcm4gaW50IG1hY192YXJfdG9fdm1vZGUoY29uc3Qgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsIGludCAqdm1vZGUsCiAJCQkgICAgaW50ICpjbW9kZSk7CiBleHRlcm4gaW50IG1hY19tYXBfbW9uaXRvcl9zZW5zZShpbnQgc2Vuc2UpOwotZXh0ZXJuIGludCBfX2luaXQgbWFjX2ZpbmRfbW9kZShzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwKLQkJCQlzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgY29uc3QgY2hhciAqbW9kZV9vcHRpb24sCi0JCQkJdW5zaWduZWQgaW50IGRlZmF1bHRfYnBwKTsKK2V4dGVybiBpbnQgX19kZXZpbml0IG1hY19maW5kX21vZGUoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCisJCQkJICAgc3RydWN0IGZiX2luZm8gKmluZm8sCisJCQkJICAgY29uc3QgY2hhciAqbW9kZV9vcHRpb24sCisJCQkJICAgdW5zaWduZWQgaW50IGRlZmF1bHRfYnBwKTsKIAogCiAgICAgLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbWF0cm94L21hdHJveGZiX2Jhc2UuYyBiL2RyaXZlcnMvdmlkZW8vbWF0cm94L21hdHJveGZiX2Jhc2UuYwppbmRleCAyM2MxODI3Li5mNGRkZDM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL21hdHJveC9tYXRyb3hmYl9iYXNlLmMKKysrIGIvZHJpdmVycy92aWRlby9tYXRyb3gvbWF0cm94ZmJfYmFzZS5jCkBAIC0xMDIsNiArMTAyLDggQEAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAKKyNkZWZpbmUgX19PTERfVklESU9DXworCiAjaW5jbHVkZSAibWF0cm94ZmJfYmFzZS5oIgogI2luY2x1ZGUgIm1hdHJveGZiX21pc2MuaCIKICNpbmNsdWRlICJtYXRyb3hmYl9hY2NlbC5oIgpAQCAtMTU4LDkgKzE2MCw5IEBACiAKIAkvKiBNYWtlIHN1cmUgdGhhdCBkaXNwbGF5cyBhcmUgY29tcGF0aWJsZSAqLwogCWlmIChpbmZvICYmIChpbmZvLT5mYmNvbi52YXIuYml0c19wZXJfcGl4ZWwgPT0gQUNDRVNTX0ZCSU5GTyhmYmNvbikudmFyLmJpdHNfcGVyX3BpeGVsKQotCSAgICAgICAgICYmIChpbmZvLT5mYmNvbi52YXIueHJlc192aXJ0dWFsID09IEFDQ0VTU19GQklORk8oZmJjb24pLnZhci54cmVzX3ZpcnR1YWwpCi0JICAgICAgICAgJiYgKGluZm8tPmZiY29uLnZhci5ncmVlbi5sZW5ndGggPT0gQUNDRVNTX0ZCSU5GTyhmYmNvbikudmFyLmdyZWVuLmxlbmd0aCkKLQkgICAgICAgICApIHsKKwkJICYmIChpbmZvLT5mYmNvbi52YXIueHJlc192aXJ0dWFsID09IEFDQ0VTU19GQklORk8oZmJjb24pLnZhci54cmVzX3ZpcnR1YWwpCisJCSAmJiAoaW5mby0+ZmJjb24udmFyLmdyZWVuLmxlbmd0aCA9PSBBQ0NFU1NfRkJJTkZPKGZiY29uKS52YXIuZ3JlZW4ubGVuZ3RoKQorCQkgKSB7CiAJCXN3aXRjaCAoQUNDRVNTX0ZCSU5GTyhmYmNvbikudmFyLmJpdHNfcGVyX3BpeGVsKSB7CiAJCQljYXNlIDE2OgogCQkJY2FzZSAzMjoKQEAgLTIyNCw3ICsyMjYsNyBAQAogCiBpbnQgbWF0cm94ZmJfZW5hYmxlX2lycShXUE1JTkZPIGludCByZWVuYWJsZSkgewogCXVfaW50MzJfdCBibTsKLQkKKwogCWlmIChBQ0NFU1NfRkJJTkZPKGRldmZsYWdzLmFjY2VsZXJhdG9yKSA9PSBGQl9BQ0NFTF9NQVRST1hfTUdBRzQwMCkKIAkJYm0gPSAweDIyMDsKIAllbHNlCkBAIC0yNDEsNyArMjQzLDcgQEAKIAkJbWdhX291dGwoTV9JRU4sIG1nYV9pbmwoTV9JRU4pIHwgYm0pOwogCX0gZWxzZSBpZiAocmVlbmFibGUpIHsKIAkJdV9pbnQzMl90IGllbjsKLQkJCisKIAkJaWVuID0gbWdhX2lubChNX0lFTik7CiAJCWlmICgoaWVuICYgYm0pICE9IGJtKSB7CiAJCQlwcmludGsoS0VSTl9ERUJVRyAibWF0cm94ZmI6IHNvbWVvbmUgZGlzYWJsZWQgSVJRIFslMDhYXVxuIiwgaWVuKTsKQEAgLTM0Nyw3ICszNDksNyBAQAogCQltZ2Ffc2V0cihNX0VYVFZHQV9JTkRFWCwgMHgwMCwgcDIpOwogCX0KIAltYXRyb3hmYl9EQUNfdW5sb2NrX2lycXJlc3RvcmUoZmxhZ3MpOwotCQorCiAJdXBkYXRlX2NydGMyKFBNSU5GTyBwb3MpOwogCiAJQ1JJVEVORApAQCAtMzkwLDcgKzM5Miw3IEBACiBzdGF0aWMgaW50IG1hdHJveGZiX29wZW4oc3RydWN0IGZiX2luZm8gKmluZm8sIGludCB1c2VyKQogewogCU1JTkZPX0ZST01fSU5GTyhpbmZvKTsKLQkKKwogCURCR19MT09QKF9fRlVOQ1RJT05fXykKIAogCWlmIChBQ0NFU1NfRkJJTkZPKGRlYWQpKSB7CkBAIC00MDYsNyArNDA4LDcgQEAKIHN0YXRpYyBpbnQgbWF0cm94ZmJfcmVsZWFzZShzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgaW50IHVzZXIpCiB7CiAJTUlORk9fRlJPTV9JTkZPKGluZm8pOwotCQorCiAJREJHX0xPT1AoX19GVU5DVElPTl9fKQogCiAJaWYgKHVzZXIpIHsKQEAgLTg1NCw3ICs4NTYsNyBAQAogCQl2YmxhbmstPmZsYWdzIHw9IEZCX1ZCTEFOS19WQkxBTktJTkc7CiAJaWYgKHRlc3RfYml0KDAsICZBQ0NFU1NfRkJJTkZPKGlycV9mbGFncykpKSB7CiAJCXZibGFuay0+ZmxhZ3MgfD0gRkJfVkJMQU5LX0hBVkVfQ09VTlQ7Ci0JCS8qIE9ubHkgb25lIHdyaXRlciwgYWxpZ25lZCBpbnQgdmFsdWUuLi4gCisJCS8qIE9ubHkgb25lIHdyaXRlciwgYWxpZ25lZCBpbnQgdmFsdWUuLi4KIAkJICAgaXQgc2hvdWxkIHdvcmsgd2l0aG91dCBsb2NrIGFuZCB3aXRob3V0IGF0b21pY190ICovCiAJCXZibGFuay0+Y291bnQgPSBBQ0NFU1NfRkJJTkZPKGNydGMxKS52c3luYy5jbnQ7CiAJfQpAQCAtODcwLDcgKzg3Miw3IEBACiB7CiAJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CiAJTUlORk9fRlJPTV9JTkZPKGluZm8pOwotCQorCiAJREJHKF9fRlVOQ1RJT05fXykKIAogCWlmIChBQ0NFU1NfRkJJTkZPKGRlYWQpKSB7CkBAIC0xMDgxLDcgKzEwODMsNyBAQAogCQljYXNlIFZJRElPQ19RVUVSWUNBUDoKIAkJCXsKIAkJCQlzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5IHI7Ci0JCQkJCisKIAkJCQltZW1zZXQoJnIsIDAsIHNpemVvZihyKSk7CiAJCQkJc3RyY3B5KHIuZHJpdmVyLCAibWF0cm94ZmIiKTsKIAkJCQlzdHJjcHkoci5jYXJkLCAiTWF0cm94Iik7CkBAIC0xMDkxLDcgKzEwOTMsNyBAQAogCQkJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnIsIHNpemVvZihyKSkpCiAJCQkJCXJldHVybiAtRUZBVUxUOwogCQkJCXJldHVybiAwOwotCQkJCQorCiAJCQl9CiAJCWNhc2UgVklESU9DX1FVRVJZQ1RSTDoKIAkJCXsKQEAgLTE2OTAsOCArMTY5Miw4IEBACiAJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChBQ0NFU1NfRkJJTkZPKHBjaWRldiksIFBDSV9DT01NQU5ELCAmY21kKTsKIAkJbWdhX29wdGlvbiAmPSAweDdGRkZGRkZGOyAvKiBjbGVhciBCSUdfRU5ESUFOICovCiAJCW1nYV9vcHRpb24gfD0gTVhfT1BUSU9OX0JTV0FQOwotICAgICAgICAgICAgICAgIC8qIGRpc2FibGUgcGFsZXR0ZSBzbm9vcGluZyAqLwotICAgICAgICAgICAgICAgIGNtZCAmPSB+UENJX0NPTU1BTkRfVkdBX1BBTEVUVEU7CisJCS8qIGRpc2FibGUgcGFsZXR0ZSBzbm9vcGluZyAqLworCQljbWQgJj0gflBDSV9DT01NQU5EX1ZHQV9QQUxFVFRFOwogCQlpZiAocGNpX2Rldl9wcmVzZW50KGludGVsXzgyNDM3KSkgewogCQkJaWYgKCEobWdhX29wdGlvbiAmIDB4MjAwMDAwMDApICYmICFBQ0NFU1NfRkJJTkZPKGRldmZsYWdzLm5vcGNpcmV0cnkpKSB7CiAJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibWF0cm94ZmI6IERpc2FibGluZyBQQ0kgcmV0cmllcyBkdWUgdG8gaTgyNDM3IHByZXNlbnRcbiIpOwpAQCAtMTgwOSwxMiArMTgxMSwxMiBAQAogCiAJCWlmIChmdikgewogCQkJdG1wID0gZnYgKiAodmVzYWZiX2RlZmluZWQudXBwZXJfbWFyZ2luICsgdmVzYWZiX2RlZmluZWQueXJlcwotCQkJICAgICAgICAgICsgdmVzYWZiX2RlZmluZWQubG93ZXJfbWFyZ2luICsgdmVzYWZiX2RlZmluZWQudnN5bmNfbGVuKTsKKwkJCQkgICsgdmVzYWZiX2RlZmluZWQubG93ZXJfbWFyZ2luICsgdmVzYWZiX2RlZmluZWQudnN5bmNfbGVuKTsKIAkJCWlmICgodG1wIDwgZmgpIHx8IChmaCA9PSAwKSkgZmggPSB0bXA7CiAJCX0KIAkJaWYgKGZoKSB7CiAJCQl0bXAgPSBmaCAqICh2ZXNhZmJfZGVmaW5lZC5sZWZ0X21hcmdpbiArIHZlc2FmYl9kZWZpbmVkLnhyZXMKLQkJCSAgICAgICAgICArIHZlc2FmYl9kZWZpbmVkLnJpZ2h0X21hcmdpbiArIHZlc2FmYl9kZWZpbmVkLmhzeW5jX2xlbik7CisJCQkJICArIHZlc2FmYl9kZWZpbmVkLnJpZ2h0X21hcmdpbiArIHZlc2FmYl9kZWZpbmVkLmhzeW5jX2xlbik7CiAJCQlpZiAoKHRtcCA8IG1heGNsaykgfHwgKG1heGNsayA9PSAwKSkgbWF4Y2xrID0gdG1wOwogCQl9CiAJCXRtcCA9IChtYXhjbGsgKyA0OTkpIC8gNTAwOwpAQCAtMTg5MCwxNCArMTg5MiwxNCBAQAogCiAJLyogdGhlcmUgaXMgbm8gY29uc29sZSBvbiB0aGlzIGZiLi4uIGJ1dCB3ZSBoYXZlIHRvIGluaXRpYWxpemUgaGFyZHdhcmUKIAkgKiB1bnRpbCBzb21lb25lIHRlbGxzIG1lIHdoYXQgaXMgcHJvcGVyIHRoaW5nIHRvIGRvICovCi0gCWlmICghQUNDRVNTX0ZCSU5GTyhpbml0aWFsaXplZCkpIHsKLSAJCXByaW50ayhLRVJOX0lORk8gImZiJWQ6IGluaXRpYWxpemluZyBoYXJkd2FyZVxuIiwKLSAJCSAgICAgICBBQ0NFU1NfRkJJTkZPKGZiY29uLm5vZGUpKTsKLSAJCS8qIFdlIGhhdmUgdG8gdXNlIEZCX0FDVElWQVRFX0ZPUkNFLCBhcyB3ZSBoYWQgdG8gcHV0IHZlc2FmYl9kZWZpbmVkIHRvIHRoZSBmYmNvbi52YXIKLSAJCSAqIGFscmVhZHkgYmVmb3JlLCBzbyByZWdpc3Rlcl9mcmFtZWJ1ZmZlciB3b3JrcyBjb3JyZWN0bHkuICovCi0gCQl2ZXNhZmJfZGVmaW5lZC5hY3RpdmF0ZSB8PSBGQl9BQ1RJVkFURV9GT1JDRTsKLSAJCWZiX3NldF92YXIoJkFDQ0VTU19GQklORk8oZmJjb24pLCAmdmVzYWZiX2RlZmluZWQpOwotIAl9CisJaWYgKCFBQ0NFU1NfRkJJTkZPKGluaXRpYWxpemVkKSkgeworCQlwcmludGsoS0VSTl9JTkZPICJmYiVkOiBpbml0aWFsaXppbmcgaGFyZHdhcmVcbiIsCisJCSAgICAgICBBQ0NFU1NfRkJJTkZPKGZiY29uLm5vZGUpKTsKKwkJLyogV2UgaGF2ZSB0byB1c2UgRkJfQUNUSVZBVEVfRk9SQ0UsIGFzIHdlIGhhZCB0byBwdXQgdmVzYWZiX2RlZmluZWQgdG8gdGhlIGZiY29uLnZhcgorCQkgKiBhbHJlYWR5IGJlZm9yZSwgc28gcmVnaXN0ZXJfZnJhbWVidWZmZXIgd29ya3MgY29ycmVjdGx5LiAqLworCQl2ZXNhZmJfZGVmaW5lZC5hY3RpdmF0ZSB8PSBGQl9BQ1RJVkFURV9GT1JDRTsKKwkJZmJfc2V0X3ZhcigmQUNDRVNTX0ZCSU5GTyhmYmNvbiksICZ2ZXNhZmJfZGVmaW5lZCk7CisJfQogCiAJcmV0dXJuIDA7CiBmYWlsVmlkZW9JTzo7CkBAIC0yMzU2LDcgKzIzNTgsNyBAQAogCQllbHNlIGlmICghc3RybmNtcCh0aGlzX29wdCwgImRmcDoiLCA0KSkgewogCQkJZGZwX3R5cGUgPSBzaW1wbGVfc3RydG91bCh0aGlzX29wdCs0LCBOVUxMLCAwKTsKIAkJCWRmcCA9IDE7Ci0JCX0JCisJCX0KICNpZmRlZiBDT05GSUdfUFBDX1BNQUMKIAkJZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsICJ2bW9kZToiLCA2KSkgewogCQkJdW5zaWduZWQgaW50IHZtb2RlID0gc2ltcGxlX3N0cnRvdWwodGhpc19vcHQrNiwgTlVMTCwgMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL21vZGVkYi5jIGIvZHJpdmVycy92aWRlby9tb2RlZGIuYwppbmRleCAyNmExYzYxLi5mZjU0NTQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL21vZGVkYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vbW9kZWRiLmMKQEAgLTI1OSw2ICsyNTksMTAgQEAKIAkvKiAxMTUyeDc2OCwgNjAgSHosIFBvd2VyQm9vayBHNCBUaXRhbml1bSBJIGFuZCBJSSAqLwogCU5VTEwsIDYwLCAxMTUyLCA3NjgsIDE1Mzg2LCAxNTgsIDI2LCAyOSwgMywgMTM2LCA2LAogCUZCX1NZTkNfSE9SX0hJR0hfQUNUfEZCX1NZTkNfVkVSVF9ISUdIX0FDVCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRAorICAgIH0sIHsKKwkvKiAxMzY2eDc2OCwgNjAgSHosIDQ3LjQwMyBrSHogaHN5bmMsIFdYR0EgMTY6OSBhc3BlY3QgcmF0aW8gKi8KKwlOVUxMLCA2MCwgMTM2NiwgNzY4LCAxMzgwNiwgMTIwLCAxMCwgMTQsIDMsIDMyLCA1LAorCTAsIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQKICAgICB9LAogfTsKIApAQCAtNzg3LDggKzc5MSw5IEBACiAJCQlpZiAoZGlmZiA+IGQpIHsKIAkJCQlkaWZmID0gZDsKIAkJCQliZXN0ID0gbW9kZTsKLQkJCX0gZWxzZSBpZiAoZGlmZiA9PSBkICYmIG1vZGUtPnJlZnJlc2ggPiBiZXN0LT5yZWZyZXNoKQotCQkJICAgIGJlc3QgPSBtb2RlOworCQkJfSBlbHNlIGlmIChkaWZmID09IGQgJiYgYmVzdCAmJgorCQkJCSAgIG1vZGUtPnJlZnJlc2ggPiBiZXN0LT5yZWZyZXNoKQorCQkJCWJlc3QgPSBtb2RlOwogCQl9CiAJfQogCXJldHVybiBiZXN0OwpAQCAtMTAxNiw4ICsxMDIxLDYgQEAKIEVYUE9SVF9TWU1CT0woZmJfdmFyX3RvX3ZpZGVvbW9kZSk7CiBFWFBPUlRfU1lNQk9MKGZiX21vZGVfaXNfZXF1YWwpOwogRVhQT1JUX1NZTUJPTChmYl9hZGRfdmlkZW9tb2RlKTsKLUVYUE9SVF9TWU1CT0woZmJfZGVsZXRlX3ZpZGVvbW9kZSk7Ci1FWFBPUlRfU1lNQk9MKGZiX2Rlc3Ryb3lfbW9kZWxpc3QpOwogRVhQT1JUX1NZTUJPTChmYl9tYXRjaF9tb2RlKTsKIEVYUE9SVF9TWU1CT0woZmJfZmluZF9iZXN0X21vZGUpOwogRVhQT1JUX1NZTUJPTChmYl9maW5kX25lYXJlc3RfbW9kZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL25lb2ZiLmMgYi9kcml2ZXJzL3ZpZGVvL25lb2ZiLmMKaW5kZXggMjRiMTJmNy4uMmYxNTZiNyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9uZW9mYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vbmVvZmIuYwpAQCAtMTMzMywxNyArMTMzMywyMiBAQAogCSAqICBydW4gInNldHRlcm0gLXBvd2Vyc2F2ZSBwb3dlcmRvd24iIHRvIHRha2UgYWR2YW50YWdlCiAJICovCiAJc3RydWN0IG5lb2ZiX3BhciAqcGFyID0gaW5mby0+cGFyOwotCWludCBzZXFmbGFncywgbGNkZmxhZ3MsIGRwbXNmbGFncywgcmVnOwotCisJaW50IHNlcWZsYWdzLCBsY2RmbGFncywgZHBtc2ZsYWdzLCByZWcsIHRtcGRpc3A7CiAKIAkvKgotCSAqIFJlbG9hZCB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZSByZWdpc3RlciwgaWYgc2Vuc2libGUuIEl0IG1pZ2h0IGhhdmUKLQkgKiBiZWVuIGNoYW5nZWQgdmlhIEZOIGtleXN0cm9rZS4KKwkgKiBSZWFkIGJhY2sgdGhlIHJlZ2lzdGVyIGJpdHMgcmVsYXRlZCB0byBkaXNwbGF5IGNvbmZpZ3VyYXRpb24uIFRoZXkgbWlnaHQKKwkgKiBoYXZlIGJlZW4gY2hhbmdlZCB1bmRlcm5lYXRoIHRoZSBkcml2ZXIgdmlhIEZuIGtleSBzdHJva2UuCisJICovCisJbmVvVW5sb2NrKCk7CisJdG1wZGlzcCA9IHZnYV9yZ2Z4KE5VTEwsIDB4MjApICYgMHgwMzsKKwluZW9Mb2NrKCZwYXItPnN0YXRlKTsKKworCS8qIEluIGNhc2Ugd2UgYmxhbmsgdGhlIHNjcmVlbiwgd2Ugd2FudCB0byBzdG9yZSB0aGUgcG9zc2libHkgbmV3CisJICogY29uZmlndXJhdGlvbiBpbiB0aGUgZHJpdmVyLiBEdXJpbmcgdW4tYmxhbmssIHdlIHJlLWFwcGx5IHRoaXMgc2V0dGluZywKKwkgKiBzaW5jZSB0aGUgTENEIGJpdCB3aWxsIGJlIGNsZWFyZWQgaW4gb3JkZXIgdG8gc3dpdGNoIG9mZiB0aGUgYmFja2xpZ2h0LgogCSAqLwogCWlmIChwYXItPlBhbmVsRGlzcENudGxSZWdSZWFkKSB7Ci0JCW5lb1VubG9jaygpOwotCQlwYXItPlBhbmVsRGlzcENudGxSZWcxID0gdmdhX3JnZngoTlVMTCwgMHgyMCkgJiAweDAzOwotCQluZW9Mb2NrKCZwYXItPnN0YXRlKTsKKwkJcGFyLT5QYW5lbERpc3BDbnRsUmVnMSA9IHRtcGRpc3A7CiAJfQogCXBhci0+UGFuZWxEaXNwQ250bFJlZ1JlYWQgPSAhYmxhbmtfbW9kZTsKIApAQCAtMTM3OCwxMiArMTM4MywyMSBAQAogCQlicmVhazsKIAljYXNlIEZCX0JMQU5LX05PUk1BTDoJCS8qIGp1c3QgYmxhbmsgc2NyZWVuIChiYWNrbGlnaHQgc3RheXMgb24pICovCiAJCXNlcWZsYWdzID0gVkdBX1NSMDFfU0NSRUVOX09GRjsJLyogRGlzYWJsZSBzZXF1ZW5jZXIgKi8KLQkJbGNkZmxhZ3MgPSBwYXItPlBhbmVsRGlzcENudGxSZWcxICYgMHgwMjsgLyogTENEIG5vcm1hbCAqLworCQkvKgorCQkgKiBEdXJpbmcgYSBibGFuayBvcGVyYXRpb24gd2l0aCB0aGUgTElEIHNodXQsIHdlIG1pZ2h0IHN0b3JlICJMQ0Qgb2ZmIgorCQkgKiBieSBtaXN0YWtlLiBEdWUgdG8gdGltaW5nIGlzc3VlcywgdGhlIEJJT1MgbWF5IHN3aXRjaCB0aGUgbGlnaHRzCisJCSAqIGJhY2sgb24sIGFuZCB3ZSB0dXJuIGl0IGJhY2sgb2ZmIG9uY2Ugd2UgInVuYmxhbmsiLgorCQkgKgorCQkgKiBTbyBoZXJlIGlzIGFuIGF0dGVtcHQgdG8gaW1wbGVtZW50ICI+PSIgLSBpZiB3ZSBhcmUgaW4gdGhlIHByb2Nlc3MKKwkJICogb2YgdW5ibGFua2luZywgYW5kIHRoZSBMQ0QgYml0IGlzIHVuc2V0IGluIHRoZSBkcml2ZXIgYnV0IHNldCBpbiB0aGUKKwkJICogcmVnaXN0ZXIsIHdlIG11c3Qga2VlcCBpdC4KKwkJICovCisJCWxjZGZsYWdzID0gKChwYXItPlBhbmVsRGlzcENudGxSZWcxIHwgdG1wZGlzcCkgJiAweDAyKTsgLyogTENEIG5vcm1hbCAqLwogCQlkcG1zZmxhZ3MgPSAweDAwOwkvKiBubyBoc3luYy92c3luYyBzdXBwcmVzc2lvbiAqLwogCQlicmVhazsKIAljYXNlIEZCX0JMQU5LX1VOQkxBTks6CQkvKiB1bmJsYW5rICovCiAJCXNlcWZsYWdzID0gMDsJCQkvKiBFbmFibGUgc2VxdWVuY2VyICovCi0JCWxjZGZsYWdzID0gcGFyLT5QYW5lbERpc3BDbnRsUmVnMSAmIDB4MDI7IC8qIExDRCBub3JtYWwgKi8KKwkJbGNkZmxhZ3MgPSAoKHBhci0+UGFuZWxEaXNwQ250bFJlZzEgfCB0bXBkaXNwKSAmIDB4MDIpOyAvKiBMQ0Qgbm9ybWFsICovCiAJCWRwbXNmbGFncyA9IDB4MDA7CS8qIG5vIGhzeW5jL3ZzeW5jIHN1cHByZXNzaW9uICovCiAjaWZkZWYgQ09ORklHX1RPU0hJQkEKIAkJLyogRG8gd2Ugc3RpbGwgbmVlZCB0aGlzID8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbnZpZGlhL01ha2VmaWxlIGIvZHJpdmVycy92aWRlby9udmlkaWEvTWFrZWZpbGUKaW5kZXggNjkwZDM3ZS4uY2E0NzQzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9udmlkaWEvTWFrZWZpbGUKKysrIGIvZHJpdmVycy92aWRlby9udmlkaWEvTWFrZWZpbGUKQEAgLTcsNiArNyw3IEBACiBudmlkaWFmYi15ICAgICAgICAgICAgICAgICAgICAgICA6PSBudmlkaWEubyBudl9ody5vIG52X3NldHVwLm8gXAogCQkJICAgICAgICAgICAgbnZfYWNjZWwubwogbnZpZGlhZmItJChDT05GSUdfRkJfTlZJRElBX0kyQykgKz0gbnZfaTJjLm8KK252aWRpYWZiLSQoQ09ORklHX0ZCX05WSURJQV9CQUNLTElHSFQpICArPSBudl9iYWNrbGlnaHQubwogbnZpZGlhZmItJChDT05GSUdfUFBDX09GKQkgKz0gbnZfb2YubwogCi1udmlkaWFmYi1vYmpzICAgICAgICAgICAgICAgICAgICA6PSAkKG52aWRpYWZiLXkpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorbnZpZGlhZmItb2JqcyAgICAgICAgICAgICAgICAgICAgOj0gJChudmlkaWFmYi15KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9udmlkaWEvbnZfYmFja2xpZ2h0LmMgYi9kcml2ZXJzL3ZpZGVvL252aWRpYS9udl9iYWNrbGlnaHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzFjMTBjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby9udmlkaWEvbnZfYmFja2xpZ2h0LmMKQEAgLTAsMCArMSwxNzUgQEAKKy8qCisgKiBCYWNrbGlnaHQgY29kZSBmb3IgblZpZGlhIGJhc2VkIGdyYXBoaWMgY2FyZHMKKyAqCisgKiBDb3B5cmlnaHQgMjAwNCBBbnRvbmlubyBEYXBsYXMgPGFkYXBsYXNAcG9sLm5ldD4KKyAqIENvcHlyaWdodCAoYykgMjAwNiBNaWNoYWVsIEhhbnNlbG1hbm4gPGxpbnV4LWtlcm5lbEBoYW5zbWkuY2g+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvYmFja2xpZ2h0Lmg+CisjaW5jbHVkZSA8bGludXgvZmIuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlICJudl9sb2NhbC5oIgorI2luY2x1ZGUgIm52X3R5cGUuaCIKKyNpbmNsdWRlICJudl9wcm90by5oIgorCisjaWZkZWYgQ09ORklHX1BNQUNfQkFDS0xJR0hUCisjaW5jbHVkZSA8YXNtL2JhY2tsaWdodC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CisjZW5kaWYKKworLyogV2UgZG8gbm90IGhhdmUgYW55IGluZm9ybWF0aW9uIGFib3V0IHdoaWNoIHZhbHVlcyBhcmUgYWxsb3dlZCwgdGh1cworICogd2UgdXNlZCBzYWZlIHZhbHVlcy4KKyAqLworI2RlZmluZSBNSU5fTEVWRUwgMHgxNTgKKyNkZWZpbmUgTUFYX0xFVkVMIDB4NTM0CisKK3N0YXRpYyBzdHJ1Y3QgYmFja2xpZ2h0X3Byb3BlcnRpZXMgbnZpZGlhX2JsX2RhdGE7CisKK3N0YXRpYyBpbnQgbnZpZGlhX2JsX2dldF9sZXZlbF9icmlnaHRuZXNzKHN0cnVjdCBudmlkaWFfcGFyICpwYXIsCisJCWludCBsZXZlbCkKK3sKKwlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IHBjaV9nZXRfZHJ2ZGF0YShwYXItPnBjaV9kZXYpOworCWludCBubGV2ZWw7CisKKwkvKiBHZXQgYW5kIGNvbnZlcnQgdGhlIHZhbHVlICovCisJbXV0ZXhfbG9jaygmaW5mby0+YmxfbXV0ZXgpOworCW5sZXZlbCA9IGluZm8tPmJsX2N1cnZlW2xldmVsXSAqIEZCX0JBQ0tMSUdIVF9NQVggLyBNQVhfTEVWRUw7CisJbXV0ZXhfdW5sb2NrKCZpbmZvLT5ibF9tdXRleCk7CisKKwlpZiAobmxldmVsIDwgMCkKKwkJbmxldmVsID0gMDsKKwllbHNlIGlmIChubGV2ZWwgPCBNSU5fTEVWRUwpCisJCW5sZXZlbCA9IE1JTl9MRVZFTDsKKwllbHNlIGlmIChubGV2ZWwgPiBNQVhfTEVWRUwpCisJCW5sZXZlbCA9IE1BWF9MRVZFTDsKKworCXJldHVybiBubGV2ZWw7Cit9CisKK3N0YXRpYyBpbnQgbnZpZGlhX2JsX3VwZGF0ZV9zdGF0dXMoc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkKQoreworCXN0cnVjdCBudmlkaWFfcGFyICpwYXIgPSBjbGFzc19nZXRfZGV2ZGF0YSgmYmQtPmNsYXNzX2Rldik7CisJdTMyIHRtcF9wY3J0LCB0bXBfcG1jLCBmcGNvbnRyb2w7CisJaW50IGxldmVsOworCisJaWYgKCFwYXItPkZsYXRQYW5lbCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoYmQtPnByb3BzLT5wb3dlciAhPSBGQl9CTEFOS19VTkJMQU5LIHx8CisJICAgIGJkLT5wcm9wcy0+ZmJfYmxhbmsgIT0gRkJfQkxBTktfVU5CTEFOSykKKwkJbGV2ZWwgPSAwOworCWVsc2UKKwkJbGV2ZWwgPSBiZC0+cHJvcHMtPmJyaWdodG5lc3M7CisKKwl0bXBfcG1jID0gTlZfUkQzMihwYXItPlBNQywgMHgxMEYwKSAmIDB4MDAwMEZGRkY7CisJdG1wX3BjcnQgPSBOVl9SRDMyKHBhci0+UENSVEMwLCAweDA4MUMpICYgMHhGRkZGRkZGQzsKKwlmcGNvbnRyb2wgPSBOVl9SRDMyKHBhci0+UFJBTURBQywgMHgwODQ4KSAmIDB4Q0ZGRkZGQ0M7CisKKwlpZiAobGV2ZWwgPiAwKSB7CisJCXRtcF9wY3J0IHw9IDB4MTsKKwkJdG1wX3BtYyB8PSAoMSA8PCAzMSk7IC8qIGJhY2tsaWdodCBiaXQgKi8KKwkJdG1wX3BtYyB8PSBudmlkaWFfYmxfZ2V0X2xldmVsX2JyaWdodG5lc3MocGFyLCBsZXZlbCkgPDwgMTY7CisJCWZwY29udHJvbCB8PSBwYXItPmZwU3luY3M7CisJfSBlbHNlCisJCWZwY29udHJvbCB8PSAweDIwMDAwMDIyOworCisJTlZfV1IzMihwYXItPlBDUlRDMCwgMHgwODFDLCB0bXBfcGNydCk7CisJTlZfV1IzMihwYXItPlBNQywgMHgxMEYwLCB0bXBfcG1jKTsKKwlOVl9XUjMyKHBhci0+UFJBTURBQywgMHg4NDgsIGZwY29udHJvbCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBudmlkaWFfYmxfZ2V0X2JyaWdodG5lc3Moc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkKQoreworCXJldHVybiBiZC0+cHJvcHMtPmJyaWdodG5lc3M7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYmFja2xpZ2h0X3Byb3BlcnRpZXMgbnZpZGlhX2JsX2RhdGEgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5nZXRfYnJpZ2h0bmVzcyA9IG52aWRpYV9ibF9nZXRfYnJpZ2h0bmVzcywKKwkudXBkYXRlX3N0YXR1cwk9IG52aWRpYV9ibF91cGRhdGVfc3RhdHVzLAorCS5tYXhfYnJpZ2h0bmVzcyA9IChGQl9CQUNLTElHSFRfTEVWRUxTIC0gMSksCit9OworCit2b2lkIG52aWRpYV9ibF9pbml0KHN0cnVjdCBudmlkaWFfcGFyICpwYXIpCit7CisJc3RydWN0IGZiX2luZm8gKmluZm8gPSBwY2lfZ2V0X2RydmRhdGEocGFyLT5wY2lfZGV2KTsKKwlzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQ7CisJY2hhciBuYW1lWzEyXTsKKworCWlmICghcGFyLT5GbGF0UGFuZWwpCisJCXJldHVybjsKKworI2lmZGVmIENPTkZJR19QTUFDX0JBQ0tMSUdIVAorCWlmICghbWFjaGluZV9pcyhwb3dlcm1hYykgfHwKKwkgICAgIXBtYWNfaGFzX2JhY2tsaWdodF90eXBlKCJtbmNhIikpCisJCXJldHVybjsKKyNlbmRpZgorCisJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAibnZpZGlhYmwlZCIsIGluZm8tPm5vZGUpOworCisJYmQgPSBiYWNrbGlnaHRfZGV2aWNlX3JlZ2lzdGVyKG5hbWUsIHBhciwgJm52aWRpYV9ibF9kYXRhKTsKKwlpZiAoSVNfRVJSKGJkKSkgeworCQlpbmZvLT5ibF9kZXYgPSBOVUxMOworCQlwcmludGsoIm52aWRpYTogQmFja2xpZ2h0IHJlZ2lzdHJhdGlvbiBmYWlsZWRcbiIpOworCQlnb3RvIGVycm9yOworCX0KKworCW11dGV4X2xvY2soJmluZm8tPmJsX211dGV4KTsKKwlpbmZvLT5ibF9kZXYgPSBiZDsKKwlmYl9ibF9kZWZhdWx0X2N1cnZlKGluZm8sIDAsCisJCTB4MTU4ICogRkJfQkFDS0xJR0hUX01BWCAvIE1BWF9MRVZFTCwKKwkJMHg1MzQgKiBGQl9CQUNLTElHSFRfTUFYIC8gTUFYX0xFVkVMKTsKKwltdXRleF91bmxvY2soJmluZm8tPmJsX211dGV4KTsKKworCXVwKCZiZC0+c2VtKTsKKwliZC0+cHJvcHMtPmJyaWdodG5lc3MgPSBudmlkaWFfYmxfZGF0YS5tYXhfYnJpZ2h0bmVzczsKKwliZC0+cHJvcHMtPnBvd2VyID0gRkJfQkxBTktfVU5CTEFOSzsKKwliZC0+cHJvcHMtPnVwZGF0ZV9zdGF0dXMoYmQpOworCWRvd24oJmJkLT5zZW0pOworCisjaWZkZWYgQ09ORklHX1BNQUNfQkFDS0xJR0hUCisJbXV0ZXhfbG9jaygmcG1hY19iYWNrbGlnaHRfbXV0ZXgpOworCWlmICghcG1hY19iYWNrbGlnaHQpCisJCXBtYWNfYmFja2xpZ2h0ID0gYmQ7CisJbXV0ZXhfdW5sb2NrKCZwbWFjX2JhY2tsaWdodF9tdXRleCk7CisjZW5kaWYKKworCXByaW50aygibnZpZGlhOiBCYWNrbGlnaHQgaW5pdGlhbGl6ZWQgKCVzKVxuIiwgbmFtZSk7CisKKwlyZXR1cm47CisKK2Vycm9yOgorCXJldHVybjsKK30KKwordm9pZCBudmlkaWFfYmxfZXhpdChzdHJ1Y3QgbnZpZGlhX3BhciAqcGFyKQoreworCXN0cnVjdCBmYl9pbmZvICppbmZvID0gcGNpX2dldF9kcnZkYXRhKHBhci0+cGNpX2Rldik7CisKKyNpZmRlZiBDT05GSUdfUE1BQ19CQUNLTElHSFQKKwltdXRleF9sb2NrKCZwbWFjX2JhY2tsaWdodF9tdXRleCk7CisjZW5kaWYKKworCW11dGV4X2xvY2soJmluZm8tPmJsX211dGV4KTsKKwlpZiAoaW5mby0+YmxfZGV2KSB7CisjaWZkZWYgQ09ORklHX1BNQUNfQkFDS0xJR0hUCisJCWlmIChwbWFjX2JhY2tsaWdodCA9PSBpbmZvLT5ibF9kZXYpCisJCQlwbWFjX2JhY2tsaWdodCA9IE5VTEw7CisjZW5kaWYKKworCQliYWNrbGlnaHRfZGV2aWNlX3VucmVnaXN0ZXIoaW5mby0+YmxfZGV2KTsKKworCQlwcmludGsoIm52aWRpYTogQmFja2xpZ2h0IHVubG9hZGVkXG4iKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZpbmZvLT5ibF9tdXRleCk7CisKKyNpZmRlZiBDT05GSUdfUE1BQ19CQUNLTElHSFQKKwltdXRleF91bmxvY2soJnBtYWNfYmFja2xpZ2h0X211dGV4KTsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9udmlkaWEvbnZfaHcuYyBiL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252X2h3LmMKaW5kZXggOTljM2E4ZS4uOWVkNjQwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9udmlkaWEvbnZfaHcuYworKysgYi9kcml2ZXJzL3ZpZGVvL252aWRpYS9udl9ody5jCkBAIC04ODYsNyArODg2LDEwIEBACiAJY2FzZSBOVl9BUkNIXzIwOgogCWNhc2UgTlZfQVJDSF8zMDoKIAlkZWZhdWx0OgotCQlpZiAoKChwYXItPkNoaXBzZXQgJiAweGZmZmYpID09IDB4MDFBMCkgfHwKKwkJaWYgKChwYXItPkNoaXBzZXQgJiAweGZmZjApID09IDB4MDI0MCkgeworCQkJc3RhdGUtPmFyYml0cmF0aW9uMCA9IDI1NjsKKwkJCXN0YXRlLT5hcmJpdHJhdGlvbjEgPSAweDA0ODA7CisJCX0gZWxzZSBpZiAoKChwYXItPkNoaXBzZXQgJiAweGZmZmYpID09IDB4MDFBMCkgfHwKIAkJICAgICgocGFyLT5DaGlwc2V0ICYgMHhmZmZmKSA9PSAweDAxZjApKSB7CiAJCQluRm9yY2VVcGRhdGVBcmJpdHJhdGlvblNldHRpbmdzKFZDbGssCiAJCQkJCQkJcGl4ZWxEZXB0aCAqIDgsCkBAIC0xMjM1LDYgKzEyMzgsNyBAQAogCQkJCQlicmVhazsKIAkJCQljYXNlIDB4MDE2MDoKIAkJCQljYXNlIDB4MDFEMDoKKwkJCQljYXNlIDB4MDI0MDoKIAkJCQkJTlZfV1IzMihwYXItPlBNQywgMHgxNzAwLAogCQkJCQkJTlZfUkQzMihwYXItPlBGQiwgMHgwMjBDKSk7CiAJCQkJCU5WX1dSMzIocGFyLT5QTUMsIDB4MTcwNCwgMCk7CkBAIC0xMzU5LDcgKzEzNjMsOSBAQAogCQkJCQkJaWYoKChwYXItPkNoaXBzZXQgJiAweGZmZjApCiAJCQkJCQkgICAgIT0gMHgwMTYwKSAmJgogCQkJCQkJICAgKChwYXItPkNoaXBzZXQgJiAweGZmZjApCi0JCQkJCQkgICAgIT0gMHgwMjIwKSkKKwkJCQkJCSAgICAhPSAweDAyMjApICYmCisJCQkJCQkgICAoKHBhci0+Q2hpcHNldCAmIDB4ZmZmMCkKKwkJCQkJCSAgICAhPSAweDI0MCkpCiAJCQkJCQkJTlZfV1IzMihwYXItPlBHUkFQSCwKIAkJCQkJCQkJMHg2OTAwICsgaSo0LAogCQkJCQkJCQlOVl9SRDMyKHBhci0+UEZCLApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9udmlkaWEvbnZfcHJvdG8uaCBiL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252X3Byb3RvLmgKaW5kZXggYjE0OWE2OS4uNmZiYTY1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9udmlkaWEvbnZfcHJvdG8uaAorKysgYi9kcml2ZXJzL3ZpZGVvL252aWRpYS9udl9wcm90by5oCkBAIC02Myw0ICs2MywxNCBAQAogCQkJICAgICAgIGNvbnN0IHN0cnVjdCBmYl9pbWFnZSAqaW1hZ2UpOwogZXh0ZXJuIGludCBudmlkaWFmYl9zeW5jKHN0cnVjdCBmYl9pbmZvICppbmZvKTsKIGV4dGVybiB1OCBieXRlX3JldlsyNTZdOworCisvKiBpbiBudl9iYWNrbGlnaHQuaCAqLworI2lmZGVmIENPTkZJR19GQl9OVklESUFfQkFDS0xJR0hUCitleHRlcm4gdm9pZCBudmlkaWFfYmxfaW5pdChzdHJ1Y3QgbnZpZGlhX3BhciAqcGFyKTsKK2V4dGVybiB2b2lkIG52aWRpYV9ibF9leGl0KHN0cnVjdCBudmlkaWFfcGFyICpwYXIpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBudmlkaWFfYmxfaW5pdChzdHJ1Y3QgbnZpZGlhX3BhciAqcGFyKSB7fQorc3RhdGljIGlubGluZSB2b2lkIG52aWRpYV9ibF9leGl0KHN0cnVjdCBudmlkaWFfcGFyICpwYXIpIHt9CisjZW5kaWYKKwogI2VuZGlmCQkJCS8qIF9fTlZfUFJPVE9fSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL252aWRpYS9udmlkaWEuYyBiL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252aWRpYS5jCmluZGV4IDA5M2FiOTkuLjdiNWNmZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252aWRpYS5jCisrKyBiL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252aWRpYS5jCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9iYWNrbGlnaHQuaD4KICNpZmRlZiBDT05GSUdfTVRSUgogI2luY2x1ZGUgPGFzbS9tdHJyLmg+CiAjZW5kaWYKQEAgLTI5LDEwICszMCw2IEBACiAjaW5jbHVkZSA8YXNtL3Byb20uaD4KICNpbmNsdWRlIDxhc20vcGNpLWJyaWRnZS5oPgogI2VuZGlmCi0jaWZkZWYgQ09ORklHX1BNQUNfQkFDS0xJR0hUCi0jaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KLSNpbmNsdWRlIDxhc20vYmFja2xpZ2h0Lmg+Ci0jZW5kaWYKIAogI2luY2x1ZGUgIm52X2xvY2FsLmgiCiAjaW5jbHVkZSAibnZfdHlwZS5oIgpAQCAtNzAsMzU5ICs2NywxMCBAQAogI2RlZmluZSBNQVhfQ1VSUwkJMzIKIAogc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIG52aWRpYWZiX3BjaV90YmxbXSA9IHsKLQl7UENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX1ROVCwKLQkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCi0Je1BDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9UTlQyLAotCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKLQl7UENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX1VUTlQyLAotCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKLQl7UENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX1ROVF9VTktOT1dOLAotCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKLQl7UENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX1ZUTlQyLAotCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKLQl7UENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX1VWVE5UMiwKLQkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCi0Je1BDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9JVE5UMiwKLQkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCi0Je1BDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9HRUZPUkNFX1NEUiwKLQkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCi0Je1BDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9HRUZPUkNFX0REUiwKLQkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCi0Je1BDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9RVUFEUk8sCi0JIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAotCXtQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfR0VGT1JDRTJfTVgsCi0JIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAotCXtQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfR0VGT1JDRTJfTVgyLAotCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKLQl7UENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX0dFRk9SQ0UyX0dPLAotCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKLQl7UENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX1FVQURSTzJfTVhSLAotCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKLQl7UENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX0dFRk9SQ0UyX0dUUywKLQkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCi0Je1BDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9HRUZPUkNFMl9HVFMyLAotCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKLQl7UENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX0dFRk9SQ0UyX1VMVFJBLAotCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKLQl7UENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX1FVQURSTzJfUFJPLAotCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKLQl7UENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX0dFRk9SQ0U0X01YXzQ2MCwKLQkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCi0Je1BDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9HRUZPUkNFNF9NWF80NDAsCi0JIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAotCXtQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfR0VGT1JDRTRfTVhfNDIwLAotCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKLQl7UENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX0dFRk9SQ0U0X01YXzQ0MF9TRSwKLQkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCi0Je1BDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9HRUZPUkNFNF80NDBfR08sCi0JIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAotCXtQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfR0VGT1JDRTRfNDIwX0dPLAotCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKLQl7UENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX0dFRk9SQ0U0XzQ2MF9HTywKLQkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCi0Je1BDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9HRUZPUkNFNF80MjBfR09fTTMyLAotCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKLQl7UENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX1FVQURSTzRfNTAwWEdMLAotCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKLQl7UENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX0dFRk9SQ0U0XzQ0MF9HT19NNjQsCi0JIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAotCXtQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfUVVBRFJPNF8yMDAsCi0JIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAotCXtQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfUVVBRFJPNF81NTBYR0wsCi0JIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAotCXtQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfUVVBRFJPNF81MDBfR09HTCwKLQkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCi0Je1BDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9HRUZPUkNFNF80MTBfR09fTTE2LAotCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKLQl7UENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX0dFRk9SQ0U0X01YXzQ0MF84WCwKLQkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCi0Je1BDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9HRUZPUkNFNF9NWF80NDBTRV84WCwKLQkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCi0Je1BDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9HRUZPUkNFNF9NWF80MjBfOFgsCi0JIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAotCXtQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfR0VGT1JDRTRfTVhfNDAwMCwKLQkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCi0Je1BDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9HRUZPUkNFNF80NDhfR08sCi0JIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAotCXtQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfR0VGT1JDRTRfNDg4X0dPLAotCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKLQl7UENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX1FVQURSTzRfNTgwX1hHTCwKLQkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCi0Je1BDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9HRUZPUkNFNF9NWF9NQUMsCi0JIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAotCXtQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfUVVBRFJPNF8yODBfTlZTLAotCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKLQl7UENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX1FVQURSTzRfMzgwX1hHTCwKLQkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCi0Je1BDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9JR0VGT1JDRTIsCi0JIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAotCXtQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfR0VGT1JDRTMsCi0JIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAotCXtQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfR0VGT1JDRTNfMSwKLQkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCi0Je1BDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9HRUZPUkNFM18yLAotCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKLQl7UENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX1FVQURST19EREMsCi0JIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAotCXtQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfR0VGT1JDRTRfVElfNDYwMCwKLQkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCi0Je1BDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9HRUZPUkNFNF9USV80NDAwLAotCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKLQl7UENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX0dFRk9SQ0U0X1RJXzQyMDAsCi0JIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAotCXtQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfUVVBRFJPNF85MDBYR0wsCi0JIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAotCXtQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfUVVBRFJPNF83NTBYR0wsCi0JIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAotCXtQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfUVVBRFJPNF83MDBYR0wsCi0JIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAotCXtQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfR0VGT1JDRTRfVElfNDgwMCwKLQkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCi0Je1BDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9HRUZPUkNFNF9USV80ODAwXzhYLAotCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKLQl7UENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX0dFRk9SQ0U0X1RJXzQ4MDBTRSwKLQkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCi0Je1BDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9HRUZPUkNFNF80MjAwX0dPLAotCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKLQl7UENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX1FVQURSTzRfOTgwX1hHTCwKLQkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCi0Je1BDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9RVUFEUk80Xzc4MF9YR0wsCi0JIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAotCXtQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfUVVBRFJPNF83MDBfR09HTCwKLQkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCi0Je1BDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9HRUZPUkNFX0ZYXzU4MDBfVUxUUkEsCi0JIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAotCXtQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfR0VGT1JDRV9GWF81ODAwLAotCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKLQl7UENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX1FVQURST19GWF8yMDAwLAotCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKLQl7UENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX1FVQURST19GWF8xMDAwLAotCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKLQl7UENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX0dFRk9SQ0VfRlhfNTYwMF9VTFRSQSwKLQkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCi0Je1BDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9HRUZPUkNFX0ZYXzU2MDAsCi0JIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAotCXtQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfR0VGT1JDRV9GWF81NjAwU0UsCi0JIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAotCXtQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfR0VGT1JDRV9GWF9HTzU2MDAsCi0JIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAotCXtQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfR0VGT1JDRV9GWF9HTzU2NTAsCi0JIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAotCXtQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfUVVBRFJPX0ZYX0dPNzAwLAotCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKLQl7UENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX0dFRk9SQ0VfRlhfNTIwMCwKLQkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCi0Je1BDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9HRUZPUkNFX0ZYXzUyMDBfVUxUUkEsCi0JIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAotCXtQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfR0VGT1JDRV9GWF81MjAwXzEsCi0JIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAotCXtQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfR0VGT1JDRV9GWF81MjAwU0UsCi0JIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAotCXtQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfR0VGT1JDRV9GWF9HTzUyMDAsCi0JIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAotCXtQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfR0VGT1JDRV9GWF9HTzUyNTAsCi0JIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAotCXtQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfR0VGT1JDRV9GWF9HTzUyNTBfMzIsCi0JIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAotCXtQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfR0VGT1JDRV9GWF9HT181MjAwLAotCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKLQl7UENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX1FVQURST19OVlNfMjgwX1BDSSwKLQkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCi0Je1BDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9RVUFEUk9fRlhfNTAwLAotCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKLQl7UENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX0dFRk9SQ0VfRlhfR081MzAwLAotCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKLQl7UENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX0dFRk9SQ0VfRlhfR081MTAwLAotCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKLQl7UENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX0dFRk9SQ0VfRlhfNTkwMF9VTFRSQSwKLQkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCi0Je1BDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9HRUZPUkNFX0ZYXzU5MDAsCi0JIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAotCXtQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfR0VGT1JDRV9GWF81OTAwWFQsCi0JIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAotCXtQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfR0VGT1JDRV9GWF81OTUwX1VMVFJBLAotCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKLQl7UENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX1FVQURST19GWF8zMDAwLAotCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKLQl7UENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX0dFRk9SQ0VfRlhfNTcwMF9VTFRSQSwKLQkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCi0Je1BDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9HRUZPUkNFX0ZYXzU3MDAsCi0JIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAotCXtQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfR0VGT1JDRV9GWF81NzAwTEUsCi0JIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAotCXtQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfR0VGT1JDRV9GWF81NzAwVkUsCi0JIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAotCXtQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfR0VGT1JDRV9GWF9HTzU3MDBfMSwKLQkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCi0Je1BDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9HRUZPUkNFX0ZYX0dPNTcwMF8yLAotCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKLQl7UENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX1FVQURST19GWF9HTzEwMDAsCi0JIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAotCXtQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfUVVBRFJPX0ZYXzExMDAsCi0JIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAotCXtQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfR0VGT1JDRV9GWF81NTAwLAotCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKLQl7UENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX0dFRk9SQ0VfRlhfNTEwMCwKLQkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCi0Je1BDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9RVUFEUk9fRlhfNzAwLAotCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKLQl7UENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX0dFRk9SQ0VfRlhfNTkwMFpULAotCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKLQl7UENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX0dFRk9SQ0VfNjgwMF9VTFRSQSwKLQkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCi0Je1BDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9HRUZPUkNFXzY4MDAsCi0JIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAotCXtQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfR0VGT1JDRV82ODAwX0xFLAotCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKLQl7UENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX0dFRk9SQ0VfNjgwMF9HVCwKLQkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCi0Je1BDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9RVUFEUk9fRlhfNDAwMCwKLQkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCi0Je1BDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9HRUZPUkNFXzY2MDBfR1QsCi0JIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAotCXtQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfR0VGT1JDRV82NjAwLAotCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKLQl7UENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX0dFRk9SQ0VfNjYxMF9YTCwKLQkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCi0Je1BDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9RVUFEUk9fRlhfNTQwLAotCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKLQl7UENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX0dFRk9SQ0VfNjIwMCwKLQkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCi0Je1BDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lFX0RFVklDRV9JRF9OVklESUFfR0VGT1JDRV82ODAwX0FMVDEsCi0JIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAotCXtQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJRV9ERVZJQ0VfSURfTlZJRElBX0dFRk9SQ0VfNjYwMF9BTFQxLAotCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKLQl7UENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSUVfREVWSUNFX0lEX05WSURJQV9HRUZPUkNFXzY2MDBfQUxUMiwKLQkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCi0Je1BDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lFX0RFVklDRV9JRF9OVklESUFfR0VGT1JDRV82MjAwX0FMVDEsCi0JIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAotCXtQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJRV9ERVZJQ0VfSURfTlZJRElBX0dFRk9SQ0VfNjgwMF9HVCwKLQkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCi0Je1BDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lFX0RFVklDRV9JRF9OVklESUFfUVVBRFJPX05WUzI4MCwKLQkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCi0Je1BDSV9WRU5ET1JfSURfTlZJRElBLCAweDAyNTIsCi0JIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAotCXtQQ0lfVkVORE9SX0lEX05WSURJQSwgMHgwMzEzLAotCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKLQl7UENJX1ZFTkRPUl9JRF9OVklESUEsIDB4MDMxNiwKLQkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCi0Je1BDSV9WRU5ET1JfSURfTlZJRElBLCAweDAzMTcsCi0JIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAotCXtQQ0lfVkVORE9SX0lEX05WSURJQSwgMHgwMzFELAotCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKLQl7UENJX1ZFTkRPUl9JRF9OVklESUEsIDB4MDMxRSwKLQkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCi0Je1BDSV9WRU5ET1JfSURfTlZJRElBLCAweDAzMUYsCi0JIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAotCXtQQ0lfVkVORE9SX0lEX05WSURJQSwgMHgwMzI5LAotCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKLQl7UENJX1ZFTkRPUl9JRF9OVklESUEsIDB4MDMyRiwKLQkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCi0Je1BDSV9WRU5ET1JfSURfTlZJRElBLCAweDAzNDUsCi0JIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAotCXtQQ0lfVkVORE9SX0lEX05WSURJQSwgMHgwMzQ5LAotCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKLQl7UENJX1ZFTkRPUl9JRF9OVklESUEsIDB4MDM0QiwKLQkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCi0Je1BDSV9WRU5ET1JfSURfTlZJRElBLCAweDAzNEYsCi0JIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAotCXtQQ0lfVkVORE9SX0lEX05WSURJQSwgMHgwMGMwLAotCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKLQl7UENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfR0VGT1JDRV82ODAwQSwKLQkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCi0Je1BDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX0dFRk9SQ0VfNjgwMEFfTEUsCi0JIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAotCXtQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9HRUZPUkNFX0dPXzY4MDAsCi0JIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAotCXtQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9HRUZPUkNFX0dPXzY4MDBfVUxUUkEsCi0JIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAotCXtQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9RVUFEUk9fRlhfR08xNDAwLAotCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKLQl7UENJX1ZFTkRPUl9JRF9OVklESUEsIDB4MDBjZCwKLQkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCi0Je1BDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX1FVQURST19GWF8xNDAwLAotCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKLQl7UENJX1ZFTkRPUl9JRF9OVklESUEsIDB4MDE0MiwKLQkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCi0Je1BDSV9WRU5ET1JfSURfTlZJRElBLCAweDAxNDMsCi0JIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAotCXtQQ0lfVkVORE9SX0lEX05WSURJQSwgMHgwMTQ0LAotCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKLQl7UENJX1ZFTkRPUl9JRF9OVklESUEsIDB4MDE0NSwKLQkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCi0Je1BDSV9WRU5ET1JfSURfTlZJRElBLCAweDAxNDYsCi0JIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAotCXtQQ0lfVkVORE9SX0lEX05WSURJQSwgMHgwMTQ3LAotCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKLQl7UENJX1ZFTkRPUl9JRF9OVklESUEsIDB4MDE0OCwKLQkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCi0Je1BDSV9WRU5ET1JfSURfTlZJRElBLCAweDAxNDksCi0JIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAotCXtQQ0lfVkVORE9SX0lEX05WSURJQSwgMHgwMTRiLAotCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKLQl7UENJX1ZFTkRPUl9JRF9OVklESUEsIDB4MTRjLAotCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKLQl7UENJX1ZFTkRPUl9JRF9OVklESUEsIDB4MDE0ZCwKLQkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCi0Je1BDSV9WRU5ET1JfSURfTlZJRElBLCAweDAxNjAsCi0JIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAotCXtQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfR0VGT1JDRV82MjAwX1RVUkJPQ0FDSEUsCi0JIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAotCXtQQ0lfVkVORE9SX0lEX05WSURJQSwgMHgwMTYyLAotCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKLQl7UENJX1ZFTkRPUl9JRF9OVklESUEsIDB4MDE2MywKLQkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCi0Je1BDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9HRUZPUkNFX0dPXzYyMDAsCi0JIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAotCXtQQ0lfVkVORE9SX0lEX05WSURJQSwgMHgwMTY1LAotCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKLQl7UENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX0dFRk9SQ0VfR09fNjI1MCwKLQkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCi0Je1BDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9HRUZPUkNFX0dPXzYyMDBfMSwKLQkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCi0Je1BDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9HRUZPUkNFX0dPXzYyNTBfMSwKLQkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCi0Je1BDSV9WRU5ET1JfSURfTlZJRElBLCAweDAxNjksCi0JIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAotCXtQQ0lfVkVORE9SX0lEX05WSURJQSwgMHgwMTZiLAotCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKLQl7UENJX1ZFTkRPUl9JRF9OVklESUEsIDB4MDE2YywKLQkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCi0Je1BDSV9WRU5ET1JfSURfTlZJRElBLCAweDAxNmQsCi0JIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAotCXtQQ0lfVkVORE9SX0lEX05WSURJQSwgMHgwMTZlLAotCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKLQl7UENJX1ZFTkRPUl9JRF9OVklESUEsIDB4MDIxMCwKLQkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCi0Je1BDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9HRUZPUkNFXzY4MDBCLAotCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKLQl7UENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX0dFRk9SQ0VfNjgwMEJfTEUsCi0JIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAotCXtQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfR0VGT1JDRV82ODAwQl9HVCwKLQkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCi0Je1BDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9HRUZPUkNFXzc4MDBfR1QsCi0JIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAotCXtQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfR0VGT1JDRV83ODAwX0dUWCwKLQkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCi0Je1BDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9HRUZPUkNFX0dPXzc4MDAsCi0JIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAotCXtQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfR0VGT1JDRV9HT183ODAwX0dUWCwKLQkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCi0Je1BDSV9WRU5ET1JfSURfTlZJRElBLCAweDAyMWQsCi0JIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAotCXtQQ0lfVkVORE9SX0lEX05WSURJQSwgMHgwMjFlLAotCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKLQl7UENJX1ZFTkRPUl9JRF9OVklESUEsIDB4MDIyMCwKLQkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCi0Je1BDSV9WRU5ET1JfSURfTlZJRElBLCAweDAyMjEsCi0JIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAotCXtQQ0lfVkVORE9SX0lEX05WSURJQSwgMHgwMjIyLAotCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKLQl7UENJX1ZFTkRPUl9JRF9OVklESUEsIDB4MDIyOCwKLQkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCi0JezAsfQkJCS8qIHRlcm1pbmF0ZSBsaXN0ICovCisJe1BDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELAorCSBQQ0lfQkFTRV9DTEFTU19ESVNQTEFZIDw8IDE2LCAweGZmMDAwMCwgMH0sCisJeyAwLCB9CiB9OwotCiBNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgbnZpZGlhZmJfcGNpX3RibCk7CiAKIC8qIGNvbW1hbmQgbGluZSBkYXRhLCBzZXQgaW4gbnZpZGlhZmJfc2V0dXAoKSAqLwpAQCAtNDcwLDc1ICsxMTgsNiBAQAogCS52bW9kZSA9IEZCX1ZNT0RFX05PTklOVEVSTEFDRUQKIH07CiAKLS8qCi0gKiBCYWNrbGlnaHQgY29udHJvbAotICovCi0jaWZkZWYgQ09ORklHX1BNQUNfQkFDS0xJR0hUCi0KLXN0YXRpYyBpbnQgbnZpZGlhX2JhY2tsaWdodF9sZXZlbHNbXSA9IHsKLQkweDE1OCwKLQkweDE5MiwKLQkweDFjNiwKLQkweDIwMCwKLQkweDIzNCwKLQkweDI2OCwKLQkweDJhMiwKLQkweDJkNiwKLQkweDMxMCwKLQkweDM0NCwKLQkweDM3OCwKLQkweDNiMiwKLQkweDNlNiwKLQkweDQxYSwKLQkweDQ1NCwKLQkweDUzNCwKLX07Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgotICoKLSAqIEJhY2tsaWdodCBvcGVyYXRpb25zCi0gKgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi1zdGF0aWMgaW50IG52aWRpYV9zZXRfYmFja2xpZ2h0X2VuYWJsZShpbnQgb24sIGludCBsZXZlbCwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgbnZpZGlhX3BhciAqcGFyID0gZGF0YTsKLQl1MzIgdG1wX3BjcnQsIHRtcF9wbWMsIGZwY29udHJvbDsKLQotCXRtcF9wbWMgPSBOVl9SRDMyKHBhci0+UE1DLCAweDEwRjApICYgMHgwMDAwRkZGRjsKLQl0bXBfcGNydCA9IE5WX1JEMzIocGFyLT5QQ1JUQzAsIDB4MDgxQykgJiAweEZGRkZGRkZDOwotCWZwY29udHJvbCA9IE5WX1JEMzIocGFyLT5QUkFNREFDLCAweDA4NDgpICYgMHhDRkZGRkZDQzsKLQotCWlmIChvbiAmJiAobGV2ZWwgPiBCQUNLTElHSFRfT0ZGKSkgewotCQl0bXBfcGNydCB8PSAweDE7Ci0JCXRtcF9wbWMgfD0gKDEgPDwgMzEpOwkvLyBiYWNrbGlnaHQgYml0Ci0JCXRtcF9wbWMgfD0gbnZpZGlhX2JhY2tsaWdodF9sZXZlbHNbbGV2ZWwgLSAxXSA8PCAxNjsKLQl9Ci0KLQlpZiAob24pCi0JCWZwY29udHJvbCB8PSBwYXItPmZwU3luY3M7Ci0JZWxzZQotCQlmcGNvbnRyb2wgfD0gMHgyMDAwMDAyMjsKLQotCU5WX1dSMzIocGFyLT5QQ1JUQzAsIDB4MDgxQywgdG1wX3BjcnQpOwotCU5WX1dSMzIocGFyLT5QTUMsIDB4MTBGMCwgdG1wX3BtYyk7Ci0JTlZfV1IzMihwYXItPlBSQU1EQUMsIDB4ODQ4LCBmcGNvbnRyb2wpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbnZpZGlhX3NldF9iYWNrbGlnaHRfbGV2ZWwoaW50IGxldmVsLCB2b2lkICpkYXRhKQotewotCXJldHVybiBudmlkaWFfc2V0X2JhY2tsaWdodF9lbmFibGUoMSwgbGV2ZWwsIGRhdGEpOwotfQotCi1zdGF0aWMgc3RydWN0IGJhY2tsaWdodF9jb250cm9sbGVyIG52aWRpYV9iYWNrbGlnaHRfY29udHJvbGxlciA9IHsKLQludmlkaWFfc2V0X2JhY2tsaWdodF9lbmFibGUsCi0JbnZpZGlhX3NldF9iYWNrbGlnaHRfbGV2ZWwKLX07Ci0KLSNlbmRpZgkJCQkvKiBDT05GSUdfUE1BQ19CQUNLTElHSFQgKi8KLQogc3RhdGljIHZvaWQgbnZpZGlhZmJfbG9hZF9jdXJzb3JfaW1hZ2Uoc3RydWN0IG52aWRpYV9wYXIgKnBhciwgdTggKiBkYXRhOCwKIAkJCQkgICAgICAgdTE2IGJnLCB1MTYgZmcsIHUzMiB3LCB1MzIgaCkKIHsKQEAgLTEzNTUsMTAgKzkzNCwxNSBAQAogCU5WV3JpdGVTZXEocGFyLCAweDAxLCB0bXApOwogCU5WV3JpdGVDcnRjKHBhciwgMHgxYSwgdmVzYSk7CiAKLSNpZmRlZiBDT05GSUdfUE1BQ19CQUNLTElHSFQKLQlpZiAocGFyLT5GbGF0UGFuZWwgJiYgbWFjaGluZV9pcyhwb3dlcm1hYykpIHsKLQkJc2V0X2JhY2tsaWdodF9lbmFibGUoIWJsYW5rKTsKKyNpZmRlZiBDT05GSUdfRkJfTlZJRElBX0JBQ0tMSUdIVAorCW11dGV4X2xvY2soJmluZm8tPmJsX211dGV4KTsKKwlpZiAoaW5mby0+YmxfZGV2KSB7CisJCWRvd24oJmluZm8tPmJsX2Rldi0+c2VtKTsKKwkJaW5mby0+YmxfZGV2LT5wcm9wcy0+cG93ZXIgPSBibGFuazsKKwkJaW5mby0+YmxfZGV2LT5wcm9wcy0+dXBkYXRlX3N0YXR1cyhpbmZvLT5ibF9kZXYpOworCQl1cCgmaW5mby0+YmxfZGV2LT5zZW0pOwogCX0KKwltdXRleF91bmxvY2soJmluZm8tPmJsX211dGV4KTsKICNlbmRpZgogCiAJTlZUUkFDRV9MRUFWRSgpOwpAQCAtMTUzMiwxMCArMTExNiwxMCBAQAogCXN0cnVjdCBudmlkaWFfcGFyICpwYXIgPSBpbmZvLT5wYXI7CiAJdTMyIGlkID0gKHBhci0+cGNpX2Rldi0+dmVuZG9yIDw8IDE2KSB8IHBhci0+cGNpX2Rldi0+ZGV2aWNlOwogCi0JcHJpbnRrKCJudmlkaWFmYjogUENJIGlkIC0gJXhcbiIsIGlkKTsKKwlwcmludGsoS0VSTl9JTkZPIFBGWCAiRGV2aWNlIElEOiAleCBcbiIsIGlkKTsKKwogCWlmICgoaWQgJiAweGZmZjApID09IDB4MDBmMCkgewogCQkvKiBwY2ktZSAqLwotCQlwcmludGsoIm52aWRpYWZiOiBQQ0ktRSBjYXJkXG4iKTsKIAkJaWQgPSBOVl9SRDMyKHBhci0+UkVHUywgMHgxODAwKTsKIAogCQlpZiAoKGlkICYgMHgwMDAwZmZmZikgPT0gMHgwMDAwMTBERSkKQEAgLTE1NDMsOSArMTEyNyw5IEBACiAJCWVsc2UgaWYgKChpZCAmIDB4ZmZmZjAwMDApID09IDB4REUxMDAwMDApIC8qIHdyb25nIGVuZGlhbiAqLwogCQkJaWQgPSAweDEwREUwMDAwIHwgKChpZCA8PCA4KSAmIDB4MDAwMGZmMDApIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGlkID4+IDgpICYgMHgwMDAwMDBmZik7CisJCXByaW50ayhLRVJOX0lORk8gUEZYICJTdWJzeXN0ZW0gSUQ6ICV4IFxuIiwgaWQpOwogCX0KIAotCXByaW50aygibnZpZGlhZmI6IEFjdHVhbCBpZCAtICV4XG4iLCBpZCk7CiAJcmV0dXJuIGlkOwogfQogCkBAIC0xNTg3LDYgKzExNzEsNyBAQAogCWNhc2UgMHgwMjEwOgogCWNhc2UgMHgwMjIwOgogCWNhc2UgMHgwMjMwOgorCWNhc2UgMHgwMjQwOgogCWNhc2UgMHgwMjkwOgogCWNhc2UgMHgwMzkwOgogCQlhcmNoID0gTlZfQVJDSF80MDsKQEAgLTE2MzQsNyArMTIxOSw3IEBACiAKIAlpZiAocGNpX3JlcXVlc3RfcmVnaW9ucyhwZCwgIm52aWRpYWZiIikpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiY2Fubm90IHJlcXVlc3QgUENJIHJlZ2lvbnNcbiIpOwotCQlnb3RvIGVycl9vdXRfcmVxdWVzdDsKKwkJZ290byBlcnJfb3V0X2VuYWJsZTsKIAl9CiAKIAlwYXItPkZsYXRQYW5lbCA9IGZsYXRwYW5lbDsKQEAgLTE2NjMsNyArMTI0OCw2IEBACiAJfQogCiAJcGFyLT5DaGlwc2V0ID0gbnZpZGlhX2dldF9jaGlwc2V0KGluZm8pOwotCXByaW50ayhLRVJOX0lORk8gUEZYICJuVmlkaWEgZGV2aWNlL2NoaXBzZXQgJVhcbiIsIHBhci0+Q2hpcHNldCk7CiAJcGFyLT5BcmNoaXRlY3R1cmUgPSBudmlkaWFfZ2V0X2FyY2goaW5mbyk7CiAKIAlpZiAocGFyLT5BcmNoaXRlY3R1cmUgPT0gMCkgewpAQCAtMTc0MSwxMSArMTMyNSw5IEBACiAJICAgICAgICJQQ0kgblZpZGlhICVzIGZyYW1lYnVmZmVyICglZE1CIEAgMHglbFgpXG4iLAogCSAgICAgICBpbmZvLT5maXguaWQsCiAJICAgICAgIHBhci0+RmJNYXBTaXplIC8gKDEwMjQgKiAxMDI0KSwgaW5mby0+Zml4LnNtZW1fc3RhcnQpOwotI2lmZGVmIENPTkZJR19QTUFDX0JBQ0tMSUdIVAotCWlmIChwYXItPkZsYXRQYW5lbCAmJiBtYWNoaW5lX2lzKHBvd2VybWFjKSkKLQkJcmVnaXN0ZXJfYmFja2xpZ2h0X2NvbnRyb2xsZXIoJm52aWRpYV9iYWNrbGlnaHRfY29udHJvbGxlciwKLQkJCQkJICAgICAgcGFyLCAibW5jYSIpOwotI2VuZGlmCisKKwludmlkaWFfYmxfaW5pdChwYXIpOworCiAJTlZUUkFDRV9MRUFWRSgpOwogCXJldHVybiAwOwogCkBAIC0xNzU2LDEwICsxMzM4LDggQEAKIAludmlkaWFfZGVsZXRlX2kyY19idXNzZXMocGFyKTsKIGVycl9vdXRfYXJjaDoKIAlpb3VubWFwKHBhci0+UkVHUyk7Ci1lcnJfb3V0X2ZyZWVfYmFzZTA6CisgZXJyX291dF9mcmVlX2Jhc2UwOgogCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGQpOwotZXJyX291dF9yZXF1ZXN0OgotCXBjaV9kaXNhYmxlX2RldmljZShwZCk7CiBlcnJfb3V0X2VuYWJsZToKIAlrZnJlZShpbmZvLT5waXhtYXAuYWRkcik7CiBlcnJfb3V0X2tmcmVlOgpAQCAtMTc3NSw2ICsxMzU1LDggQEAKIAogCU5WVFJBQ0VfRU5URVIoKTsKIAorCW52aWRpYV9ibF9leGl0KHBhcik7CisKIAl1bnJlZ2lzdGVyX2ZyYW1lYnVmZmVyKGluZm8pOwogI2lmZGVmIENPTkZJR19NVFJSCiAJaWYgKHBhci0+bXRyci52cmFtX3ZhbGlkKQpAQCAtMTc4Nyw3ICsxMzY5LDYgQEAKIAludmlkaWFfZGVsZXRlX2kyY19idXNzZXMocGFyKTsKIAlpb3VubWFwKHBhci0+UkVHUyk7CiAJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZCk7Ci0JcGNpX2Rpc2FibGVfZGV2aWNlKHBkKTsKIAlrZnJlZShpbmZvLT5waXhtYXAuYWRkcik7CiAJZnJhbWVidWZmZXJfcmVsZWFzZShpbmZvKTsKIAlwY2lfc2V0X2RydmRhdGEocGQsIE5VTEwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9yaXZhL2ZiZGV2LmMgYi9kcml2ZXJzL3ZpZGVvL3JpdmEvZmJkZXYuYwppbmRleCAzZTkzMDhmLi4xMmFmNThjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3JpdmEvZmJkZXYuYworKysgYi9kcml2ZXJzL3ZpZGVvL3JpdmEvZmJkZXYuYwpAQCAtNDEsNiArNDEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2JhY2tsaWdodC5oPgogI2lmZGVmIENPTkZJR19NVFJSCiAjaW5jbHVkZSA8YXNtL210cnIuaD4KICNlbmRpZgpAQCAtMjcyLDM0ICsyNzMsMTU0IEBACiAvKgogICogQmFja2xpZ2h0IGNvbnRyb2wKICAqLworI2lmZGVmIENPTkZJR19GQl9SSVZBX0JBQ0tMSUdIVAorLyogV2UgZG8gbm90IGhhdmUgYW55IGluZm9ybWF0aW9uIGFib3V0IHdoaWNoIHZhbHVlcyBhcmUgYWxsb3dlZCwgdGh1cworICogd2UgdXNlZCBzYWZlIHZhbHVlcy4KKyAqLworI2RlZmluZSBNSU5fTEVWRUwgMHgxNTgKKyNkZWZpbmUgTUFYX0xFVkVMIDB4NTM0CisKK3N0YXRpYyBzdHJ1Y3QgYmFja2xpZ2h0X3Byb3BlcnRpZXMgcml2YV9ibF9kYXRhOworCitzdGF0aWMgaW50IHJpdmFfYmxfZ2V0X2xldmVsX2JyaWdodG5lc3Moc3RydWN0IHJpdmFfcGFyICpwYXIsCisJCWludCBsZXZlbCkKK3sKKwlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IHBjaV9nZXRfZHJ2ZGF0YShwYXItPnBkZXYpOworCWludCBubGV2ZWw7CisKKwkvKiBHZXQgYW5kIGNvbnZlcnQgdGhlIHZhbHVlICovCisJbXV0ZXhfbG9jaygmaW5mby0+YmxfbXV0ZXgpOworCW5sZXZlbCA9IGluZm8tPmJsX2N1cnZlW2xldmVsXSAqIEZCX0JBQ0tMSUdIVF9NQVggLyBNQVhfTEVWRUw7CisJbXV0ZXhfdW5sb2NrKCZpbmZvLT5ibF9tdXRleCk7CisKKwlpZiAobmxldmVsIDwgMCkKKwkJbmxldmVsID0gMDsKKwllbHNlIGlmIChubGV2ZWwgPCBNSU5fTEVWRUwpCisJCW5sZXZlbCA9IE1JTl9MRVZFTDsKKwllbHNlIGlmIChubGV2ZWwgPiBNQVhfTEVWRUwpCisJCW5sZXZlbCA9IE1BWF9MRVZFTDsKKworCXJldHVybiBubGV2ZWw7Cit9CisKK3N0YXRpYyBpbnQgcml2YV9ibF91cGRhdGVfc3RhdHVzKHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZCkKK3sKKwlzdHJ1Y3Qgcml2YV9wYXIgKnBhciA9IGNsYXNzX2dldF9kZXZkYXRhKCZiZC0+Y2xhc3NfZGV2KTsKKwlVMDMyIHRtcF9wY3J0LCB0bXBfcG1jOworCWludCBsZXZlbDsKKworCWlmIChiZC0+cHJvcHMtPnBvd2VyICE9IEZCX0JMQU5LX1VOQkxBTksgfHwKKwkgICAgYmQtPnByb3BzLT5mYl9ibGFuayAhPSBGQl9CTEFOS19VTkJMQU5LKQorCQlsZXZlbCA9IDA7CisJZWxzZQorCQlsZXZlbCA9IGJkLT5wcm9wcy0+YnJpZ2h0bmVzczsKKworCXRtcF9wbWMgPSBwYXItPnJpdmEuUE1DWzB4MTBGMC80XSAmIDB4MDAwMEZGRkY7CisJdG1wX3BjcnQgPSBwYXItPnJpdmEuUENSVEMwWzB4MDgxQy80XSAmIDB4RkZGRkZGRkM7CisJaWYobGV2ZWwgPiAwKSB7CisJCXRtcF9wY3J0IHw9IDB4MTsKKwkJdG1wX3BtYyB8PSAoMSA8PCAzMSk7IC8qIGJhY2tsaWdodCBiaXQgKi8KKwkJdG1wX3BtYyB8PSByaXZhX2JsX2dldF9sZXZlbF9icmlnaHRuZXNzKHBhciwgbGV2ZWwpIDw8IDE2OyAvKiBsZXZlbCAqLworCX0KKwlwYXItPnJpdmEuUENSVEMwWzB4MDgxQy80XSA9IHRtcF9wY3J0OworCXBhci0+cml2YS5QTUNbMHgxMEYwLzRdID0gdG1wX3BtYzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJpdmFfYmxfZ2V0X2JyaWdodG5lc3Moc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkKQoreworCXJldHVybiBiZC0+cHJvcHMtPmJyaWdodG5lc3M7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYmFja2xpZ2h0X3Byb3BlcnRpZXMgcml2YV9ibF9kYXRhID0geworCS5vd25lciAgICA9IFRISVNfTU9EVUxFLAorCS5nZXRfYnJpZ2h0bmVzcyA9IHJpdmFfYmxfZ2V0X2JyaWdodG5lc3MsCisJLnVwZGF0ZV9zdGF0dXMJPSByaXZhX2JsX3VwZGF0ZV9zdGF0dXMsCisJLm1heF9icmlnaHRuZXNzID0gKEZCX0JBQ0tMSUdIVF9MRVZFTFMgLSAxKSwKK307CisKK3N0YXRpYyB2b2lkIHJpdmFfYmxfaW5pdChzdHJ1Y3Qgcml2YV9wYXIgKnBhcikKK3sKKwlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IHBjaV9nZXRfZHJ2ZGF0YShwYXItPnBkZXYpOworCXN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZDsKKwljaGFyIG5hbWVbMTJdOworCisJaWYgKCFwYXItPkZsYXRQYW5lbCkKKwkJcmV0dXJuOworCiAjaWZkZWYgQ09ORklHX1BNQUNfQkFDS0xJR0hUCisJaWYgKCFtYWNoaW5lX2lzKHBvd2VybWFjKSB8fAorCSAgICAhcG1hY19oYXNfYmFja2xpZ2h0X3R5cGUoIm1uY2EiKSkKKwkJcmV0dXJuOworI2VuZGlmCiAKLXN0YXRpYyBpbnQgcml2YV9iYWNrbGlnaHRfbGV2ZWxzW10gPSB7Ci0gICAgMHgxNTgsCi0gICAgMHgxOTIsCi0gICAgMHgxYzYsCi0gICAgMHgyMDAsCi0gICAgMHgyMzQsCi0gICAgMHgyNjgsCi0gICAgMHgyYTIsCi0gICAgMHgyZDYsCi0gICAgMHgzMTAsCi0gICAgMHgzNDQsCi0gICAgMHgzNzgsCi0gICAgMHgzYjIsCi0gICAgMHgzZTYsCi0gICAgMHg0MWEsCi0gICAgMHg0NTQsCi0gICAgMHg1MzQsCi19OworCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgInJpdmFibCVkIiwgaW5mby0+bm9kZSk7CiAKLXN0YXRpYyBpbnQgcml2YV9zZXRfYmFja2xpZ2h0X2VuYWJsZShpbnQgb24sIGludCBsZXZlbCwgdm9pZCAqZGF0YSk7Ci1zdGF0aWMgaW50IHJpdmFfc2V0X2JhY2tsaWdodF9sZXZlbChpbnQgbGV2ZWwsIHZvaWQgKmRhdGEpOwotc3RhdGljIHN0cnVjdCBiYWNrbGlnaHRfY29udHJvbGxlciByaXZhX2JhY2tsaWdodF9jb250cm9sbGVyID0gewotCXJpdmFfc2V0X2JhY2tsaWdodF9lbmFibGUsCi0Jcml2YV9zZXRfYmFja2xpZ2h0X2xldmVsCi19OwotI2VuZGlmIC8qIENPTkZJR19QTUFDX0JBQ0tMSUdIVCAqLworCWJkID0gYmFja2xpZ2h0X2RldmljZV9yZWdpc3RlcihuYW1lLCBwYXIsICZyaXZhX2JsX2RhdGEpOworCWlmIChJU19FUlIoYmQpKSB7CisJCWluZm8tPmJsX2RldiA9IE5VTEw7CisJCXByaW50aygicml2YTogQmFja2xpZ2h0IHJlZ2lzdHJhdGlvbiBmYWlsZWRcbiIpOworCQlnb3RvIGVycm9yOworCX0KKworCW11dGV4X2xvY2soJmluZm8tPmJsX211dGV4KTsKKwlpbmZvLT5ibF9kZXYgPSBiZDsKKwlmYl9ibF9kZWZhdWx0X2N1cnZlKGluZm8sIDAsCisJCTB4MTU4ICogRkJfQkFDS0xJR0hUX01BWCAvIE1BWF9MRVZFTCwKKwkJMHg1MzQgKiBGQl9CQUNLTElHSFRfTUFYIC8gTUFYX0xFVkVMKTsKKwltdXRleF91bmxvY2soJmluZm8tPmJsX211dGV4KTsKKworCXVwKCZiZC0+c2VtKTsKKwliZC0+cHJvcHMtPmJyaWdodG5lc3MgPSByaXZhX2JsX2RhdGEubWF4X2JyaWdodG5lc3M7CisJYmQtPnByb3BzLT5wb3dlciA9IEZCX0JMQU5LX1VOQkxBTks7CisJYmQtPnByb3BzLT51cGRhdGVfc3RhdHVzKGJkKTsKKwlkb3duKCZiZC0+c2VtKTsKKworI2lmZGVmIENPTkZJR19QTUFDX0JBQ0tMSUdIVAorCW11dGV4X2xvY2soJnBtYWNfYmFja2xpZ2h0X211dGV4KTsKKwlpZiAoIXBtYWNfYmFja2xpZ2h0KQorCQlwbWFjX2JhY2tsaWdodCA9IGJkOworCW11dGV4X3VubG9jaygmcG1hY19iYWNrbGlnaHRfbXV0ZXgpOworI2VuZGlmCisKKwlwcmludGsoInJpdmE6IEJhY2tsaWdodCBpbml0aWFsaXplZCAoJXMpXG4iLCBuYW1lKTsKKworCXJldHVybjsKKworZXJyb3I6CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCByaXZhX2JsX2V4aXQoc3RydWN0IHJpdmFfcGFyICpwYXIpCit7CisJc3RydWN0IGZiX2luZm8gKmluZm8gPSBwY2lfZ2V0X2RydmRhdGEocGFyLT5wZGV2KTsKKworI2lmZGVmIENPTkZJR19QTUFDX0JBQ0tMSUdIVAorCW11dGV4X2xvY2soJnBtYWNfYmFja2xpZ2h0X211dGV4KTsKKyNlbmRpZgorCisJbXV0ZXhfbG9jaygmaW5mby0+YmxfbXV0ZXgpOworCWlmIChpbmZvLT5ibF9kZXYpIHsKKyNpZmRlZiBDT05GSUdfUE1BQ19CQUNLTElHSFQKKwkJaWYgKHBtYWNfYmFja2xpZ2h0ID09IGluZm8tPmJsX2RldikKKwkJCXBtYWNfYmFja2xpZ2h0ID0gTlVMTDsKKyNlbmRpZgorCisJCWJhY2tsaWdodF9kZXZpY2VfdW5yZWdpc3RlcihpbmZvLT5ibF9kZXYpOworCisJCXByaW50aygicml2YTogQmFja2xpZ2h0IHVubG9hZGVkXG4iKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZpbmZvLT5ibF9tdXRleCk7CisKKyNpZmRlZiBDT05GSUdfUE1BQ19CQUNLTElHSFQKKwltdXRleF91bmxvY2soJnBtYWNfYmFja2xpZ2h0X211dGV4KTsKKyNlbmRpZgorfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCByaXZhX2JsX2luaXQoc3RydWN0IHJpdmFfcGFyICpwYXIpIHt9CitzdGF0aWMgaW5saW5lIHZvaWQgcml2YV9ibF9leGl0KHN0cnVjdCByaXZhX3BhciAqcGFyKSB7fQorI2VuZGlmIC8qIENPTkZJR19GQl9SSVZBX0JBQ0tMSUdIVCAqLwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKICAqCkBAIC05NzMsMzYgKzEwOTQsNiBAQAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKICAqCi0gKiBCYWNrbGlnaHQgb3BlcmF0aW9ucwotICoKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotI2lmZGVmIENPTkZJR19QTUFDX0JBQ0tMSUdIVAotc3RhdGljIGludCByaXZhX3NldF9iYWNrbGlnaHRfZW5hYmxlKGludCBvbiwgaW50IGxldmVsLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCByaXZhX3BhciAqcGFyID0gZGF0YTsKLQlVMDMyIHRtcF9wY3J0LCB0bXBfcG1jOwotCi0JdG1wX3BtYyA9IHBhci0+cml2YS5QTUNbMHgxMEYwLzRdICYgMHgwMDAwRkZGRjsKLQl0bXBfcGNydCA9IHBhci0+cml2YS5QQ1JUQzBbMHgwODFDLzRdICYgMHhGRkZGRkZGQzsKLQlpZihvbiAmJiAobGV2ZWwgPiBCQUNLTElHSFRfT0ZGKSkgewotCQl0bXBfcGNydCB8PSAweDE7Ci0JCXRtcF9wbWMgfD0gKDEgPDwgMzEpOyAvLyBiYWNrbGlnaHQgYml0Ci0JCXRtcF9wbWMgfD0gcml2YV9iYWNrbGlnaHRfbGV2ZWxzW2xldmVsLTFdIDw8IDE2OyAvLyBsZXZlbAotCX0KLQlwYXItPnJpdmEuUENSVEMwWzB4MDgxQy80XSA9IHRtcF9wY3J0OwotCXBhci0+cml2YS5QTUNbMHgxMEYwLzRdID0gdG1wX3BtYzsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCByaXZhX3NldF9iYWNrbGlnaHRfbGV2ZWwoaW50IGxldmVsLCB2b2lkICpkYXRhKQotewotCXJldHVybiByaXZhX3NldF9iYWNrbGlnaHRfZW5hYmxlKDEsIGxldmVsLCBkYXRhKTsKLX0KLSNlbmRpZiAvKiBDT05GSUdfUE1BQ19CQUNLTElHSFQgKi8KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCi0gKgogICogZnJhbWVidWZmZXIgb3BlcmF0aW9ucwogICoKICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTEyNDcsMTAgKzEzMzgsMTUgQEAKIAlTRVFvdXQocGFyLCAweDAxLCB0bXApOwogCUNSVENvdXQocGFyLCAweDFhLCB2ZXNhKTsKIAotI2lmZGVmIENPTkZJR19QTUFDX0JBQ0tMSUdIVAotCWlmICggcGFyLT5GbGF0UGFuZWwgJiYgbWFjaGluZV9pcyhwb3dlcm1hYykpIHsKLQkJc2V0X2JhY2tsaWdodF9lbmFibGUoIWJsYW5rKTsKKyNpZmRlZiBDT05GSUdfRkJfUklWQV9CQUNLTElHSFQKKwltdXRleF9sb2NrKCZpbmZvLT5ibF9tdXRleCk7CisJaWYgKGluZm8tPmJsX2RldikgeworCQlkb3duKCZpbmZvLT5ibF9kZXYtPnNlbSk7CisJCWluZm8tPmJsX2Rldi0+cHJvcHMtPnBvd2VyID0gYmxhbms7CisJCWluZm8tPmJsX2Rldi0+cHJvcHMtPnVwZGF0ZV9zdGF0dXMoaW5mby0+YmxfZGV2KTsKKwkJdXAoJmluZm8tPmJsX2Rldi0+c2VtKTsKIAl9CisJbXV0ZXhfdW5sb2NrKCZpbmZvLT5ibF9tdXRleCk7CiAjZW5kaWYKIAogCU5WVFJBQ0VfTEVBVkUoKTsKQEAgLTIwMzcsMTEgKzIxMzMsOSBAQAogCQlSSVZBRkJfVkVSU0lPTiwKIAkJaW5mby0+Zml4LnNtZW1fbGVuIC8gKDEwMjQgKiAxMDI0KSwKIAkJaW5mby0+Zml4LnNtZW1fc3RhcnQpOwotI2lmZGVmIENPTkZJR19QTUFDX0JBQ0tMSUdIVAotCWlmIChkZWZhdWx0X3Bhci0+RmxhdFBhbmVsICYmIG1hY2hpbmVfaXMocG93ZXJtYWMpKQotCQlyZWdpc3Rlcl9iYWNrbGlnaHRfY29udHJvbGxlcigmcml2YV9iYWNrbGlnaHRfY29udHJvbGxlciwKLQkJCQkJICAgICAgZGVmYXVsdF9wYXIsICJtbmNhIik7Ci0jZW5kaWYKKworCXJpdmFfYmxfaW5pdChpbmZvLT5wYXIpOworCiAJTlZUUkFDRV9MRUFWRSgpOwogCXJldHVybiAwOwogCkBAIC0yMDU4LDcgKzIxNTIsNiBAQAogZXJyX3JlbGVhc2VfcmVnaW9uOgogCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGQpOwogZXJyX2Rpc2FibGVfZGV2aWNlOgotCXBjaV9kaXNhYmxlX2RldmljZShwZCk7CiBlcnJfZnJlZV9waXhtYXA6CiAJa2ZyZWUoaW5mby0+cGl4bWFwLmFkZHIpOwogZXJyX2ZyYW1lYnVmZmVyX3JlbGVhc2U6CkBAIC0yMDc0LDYgKzIxNjcsOCBAQAogCQogCU5WVFJBQ0VfRU5URVIoKTsKIAorCXJpdmFfYmxfZXhpdChwYXIpOworCiAjaWZkZWYgQ09ORklHX0ZCX1JJVkFfSTJDCiAJcml2YV9kZWxldGVfaTJjX2J1c3NlcyhwYXIpOwogCWtmcmVlKHBhci0+RURJRCk7CkBAIC0yMDkxLDcgKzIxODYsNiBAQAogCWlmIChwYXItPnJpdmEuQXJjaGl0ZWN0dXJlID09IE5WX0FSQ0hfMDMpCiAJCWlvdW5tYXAocGFyLT5yaXZhLlBSQU1JTik7CiAJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZCk7Ci0JcGNpX2Rpc2FibGVfZGV2aWNlKHBkKTsKIAlrZnJlZShpbmZvLT5waXhtYXAuYWRkcik7CiAJZnJhbWVidWZmZXJfcmVsZWFzZShpbmZvKTsKIAlwY2lfc2V0X2RydmRhdGEocGQsIE5VTEwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9zM2MyNDEwZmIuYyBiL2RyaXZlcnMvdmlkZW8vczNjMjQxMGZiLmMKaW5kZXggOTQ1MTkzMi4uZmJjNDExOCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9zM2MyNDEwZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3MzYzI0MTBmYi5jCkBAIC02NDEsNiArNjQxLDcgQEAKIAlpbnQgcmV0OwogCWludCBpcnE7CiAJaW50IGk7CisJdTMyIGxjZGNvbjE7CiAKIAltYWNoX2luZm8gPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKIAlpZiAobWFjaF9pbmZvID09IE5VTEwpIHsKQEAgLTY3Miw2ICs2NzMsMTEgQEAKIAogCW1lbWNweSgmaW5mby0+cmVncywgJm1hY2hfaW5mby0+cmVncywgc2l6ZW9mKGluZm8tPnJlZ3MpKTsKIAorCS8qIFN0b3AgdGhlIHZpZGVvIGFuZCB1bnNldCBFTlZJRCBpZiBzZXQgKi8KKwlpbmZvLT5yZWdzLmxjZGNvbjEgJj0gflMzQzI0MTBfTENEQ09OMV9FTlZJRDsKKwlsY2Rjb24xID0gcmVhZGwoUzNDMjQxMF9MQ0RDT04xKTsKKwl3cml0ZWwobGNkY29uMSAmIH5TM0MyNDEwX0xDRENPTjFfRU5WSUQsIFMzQzI0MTBfTENEQ09OMSk7CisKIAlpbmZvLT5tYWNoX2luZm8JCSAgICA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwogCiAJZmJpbmZvLT5maXgudHlwZQkgICAgPSBGQl9UWVBFX1BBQ0tFRF9QSVhFTFM7CkBAIC03OTQsMTUgKzgwMCwxNCBAQAogICogc2h1dGRvd24gdGhlIGxjZCBjb250cm9sbGVyCiAqLwogCi1zdGF0aWMgdm9pZCBzM2MyNDEwZmJfc3RvcF9sY2Qodm9pZCkKK3N0YXRpYyB2b2lkIHMzYzI0MTBmYl9zdG9wX2xjZChzdHJ1Y3QgczNjMjQxMGZiX2luZm8gKmZiaSkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIGxvbmcgdG1wOwogCiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCi0JdG1wID0gcmVhZGwoUzNDMjQxMF9MQ0RDT04xKTsKLQl3cml0ZWwodG1wICYgflMzQzI0MTBfTENEQ09OMV9FTlZJRCwgUzNDMjQxMF9MQ0RDT04xKTsKKwlmYmktPnJlZ3MubGNkY29uMSAmPSB+UzNDMjQxMF9MQ0RDT04xX0VOVklEOworCXdyaXRlbChmYmktPnJlZ3MubGNkY29uMSwgUzNDMjQxMF9MQ0RDT04xKTsKIAogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KQEAgLTgxNiw3ICs4MjEsNyBAQAogCXN0cnVjdCBzM2MyNDEwZmJfaW5mbyAqaW5mbyA9IGZiaW5mby0+cGFyOwogCWludCBpcnE7CiAKLQlzM2MyNDEwZmJfc3RvcF9sY2QoKTsKKwlzM2MyNDEwZmJfc3RvcF9sY2QoaW5mbyk7CiAJbXNsZWVwKDEpOwogCiAJczNjMjQxMGZiX3VubWFwX3ZpZGVvX21lbW9yeShpbmZvKTsKQEAgLTg0NCw3ICs4NDksNyBAQAogCXN0cnVjdCBmYl9pbmZvCSAgICpmYmluZm8gPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXYpOwogCXN0cnVjdCBzM2MyNDEwZmJfaW5mbyAqaW5mbyA9IGZiaW5mby0+cGFyOwogCi0JczNjMjQxMGZiX3N0b3BfbGNkKCk7CisJczNjMjQxMGZiX3N0b3BfbGNkKGluZm8pOwogCiAJLyogc2xlZXAgYmVmb3JlIGRpc2FibGluZyB0aGUgY2xvY2ssIHdlIG5lZWQgdG8gZW5zdXJlCiAJICogdGhlIExDRCBETUEgZW5naW5lIGlzIG5vdCBnb2luZyB0byBnZXQgYmFjayBvbiB0aGUgYnVzCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3NhdmFnZS9zYXZhZ2VmYi5oIGIvZHJpdmVycy92aWRlby9zYXZhZ2Uvc2F2YWdlZmIuaAppbmRleCA1OGNmZGZiLi5lNjQ4YTZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3NhdmFnZS9zYXZhZ2VmYi5oCisrKyBiL2RyaXZlcnMvdmlkZW8vc2F2YWdlL3NhdmFnZWZiLmgKQEAgLTE0Nyw3NyArMTQ3LDcgQEAKIAlpbnQJICAgICAgIGludGVybGFjZWQ7CiB9OwogCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0jZGVmaW5lIE5SX1BBTEVUVEUJMjU2Ci0KLQotc3RydWN0IHNhdmFnZWZiX3BhcjsKLQotc3RydWN0IHNhdmFnZWZiX2kyY19jaGFuIHsKLQlzdHJ1Y3Qgc2F2YWdlZmJfcGFyICpwYXI7Ci0Jc3RydWN0IGkyY19hZGFwdGVyIGFkYXB0ZXI7Ci0Jc3RydWN0IGkyY19hbGdvX2JpdF9kYXRhIGFsZ287Ci0Jdm9sYXRpbGUgdTggX19pb21lbSAqaW9hZGRyOwotCXUzMiAgIHJlZzsKLX07Ci0KLXN0cnVjdCBzYXZhZ2VmYl9wYXIgewotCXN0cnVjdCBwY2lfZGV2ICpwY2lkZXY7Ci0Jc2F2YWdlX2NoaXBzZXQgIGNoaXA7Ci0Jc3RydWN0IHNhdmFnZWZiX2kyY19jaGFuIGNoYW47Ci0JdW5zaWduZWQgY2hhciAgICplZGlkOwotCXUzMiBwc2V1ZG9fcGFsZXR0ZVsxNl07Ci0JaW50IHBhbGV0dGVFbmFibGVkOwotCWludCBwbV9zdGF0ZTsKLQlpbnQgZGlzcGxheV90eXBlOwotCWludCBkdmk7Ci0JaW50IGNydG9ubHk7Ci0JaW50IGRhY1NwZWVkQnBwOwotCWludCBtYXhDbG9jazsKLQlpbnQgbWluQ2xvY2s7Ci0JaW50IG51bUNsb2NrczsKLQlpbnQgY2xvY2tbNF07Ci0Jc3RydWN0IHsKLQkJdTggICBfX2lvbWVtICp2YmFzZTsKLQkJdTMyICAgIHBiYXNlOwotCQl1MzIgICAgbGVuOwotI2lmZGVmIENPTkZJR19NVFJSCi0JCWludCAgICBtdHJyOwotI2VuZGlmCi0JfSB2aWRlbzsKLQotCXN0cnVjdCB7Ci0JCXZvbGF0aWxlIHU4ICBfX2lvbWVtICp2YmFzZTsKLQkJdTMyICAgICAgICAgICBwYmFzZTsKLQkJdTMyICAgICAgICAgICBsZW47Ci0JfSBtbWlvOwotCi0Jdm9sYXRpbGUgdTMyICBfX2lvbWVtICpiY2lfYmFzZTsKLQl1bnNpZ25lZCBpbnQgIGJjaV9wdHI7Ci0KLQl1MzIgICAgICAgICAgIGNvYl9vZmZzZXQ7Ci0JdTMyICAgICAgICAgICBjb2Jfc2l6ZTsKLQlpbnQgICAgICAgICAgIGNvYl9pbmRleDsKLQotCXZvaWQgKCpTYXZhZ2VXYWl0SWRsZSkgKHN0cnVjdCBzYXZhZ2VmYl9wYXIgKnBhcik7Ci0Jdm9pZCAoKlNhdmFnZVdhaXRGaWZvKSAoc3RydWN0IHNhdmFnZWZiX3BhciAqcGFyLCBpbnQgc3BhY2UpOwotCi0JaW50IE1DTEssIFJFRkNMSywgTENEY2xrOwotCWludCBIb3JpelNjYWxlRmFjdG9yOwotCi0JLyogUGFuZWxzIHNpemUgKi8KLQlpbnQgU2F2YWdlUGFuZWxXaWR0aDsKLQlpbnQgU2F2YWdlUGFuZWxIZWlnaHQ7Ci0KLQlzdHJ1Y3QgewotCQl1MTYgcmVkLCBncmVlbiwgYmx1ZSwgdHJhbnNwOwotCX0gcGFsZXR0ZVtOUl9QQUxFVFRFXTsKLQotCWludCBkZXB0aDsKLQlpbnQgdndpZHRoOwotCitzdHJ1Y3Qgc2F2YWdlX3JlZyB7CiAJdW5zaWduZWQgY2hhciBNaXNjT3V0UmVnOyAgICAgLyogTWlzYyAqLwogCXVuc2lnbmVkIGNoYXIgQ1JUQ1syNV07ICAgICAgIC8qIENydGMgQ29udHJvbGxlciAqLwogCXVuc2lnbmVkIGNoYXIgU2VxdWVuY2VyWzVdOyAgIC8qIFZpZGVvIFNlcXVlbmNlciAqLwpAQCAtMjM4LDYgKzE2OCw3NyBAQAogCXVuc2lnbmVkIGludCAgU1RSRUFNU1syMl07CS8qIHl1Y2ssIHN0cmVhbXMgcmVncyAqLwogCXVuc2lnbmVkIGludCAgTU1QUjAsIE1NUFIxLCBNTVBSMiwgTU1QUjM7CiB9OworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgTlJfUEFMRVRURQkyNTYKKworCitzdHJ1Y3Qgc2F2YWdlZmJfcGFyOworCitzdHJ1Y3Qgc2F2YWdlZmJfaTJjX2NoYW4geworCXN0cnVjdCBzYXZhZ2VmYl9wYXIgKnBhcjsKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgYWRhcHRlcjsKKwlzdHJ1Y3QgaTJjX2FsZ29fYml0X2RhdGEgYWxnbzsKKwl2b2xhdGlsZSB1OCBfX2lvbWVtICppb2FkZHI7CisJdTMyICAgcmVnOworfTsKKworc3RydWN0IHNhdmFnZWZiX3BhciB7CisJc3RydWN0IHBjaV9kZXYgKnBjaWRldjsKKwlzYXZhZ2VfY2hpcHNldCAgY2hpcDsKKwlzdHJ1Y3Qgc2F2YWdlZmJfaTJjX2NoYW4gY2hhbjsKKwlzdHJ1Y3Qgc2F2YWdlX3JlZyBzdGF0ZTsKKwlzdHJ1Y3Qgc2F2YWdlX3JlZyBzYXZlOworCXVuc2lnbmVkIGNoYXIgICAqZWRpZDsKKwl1MzIgcHNldWRvX3BhbGV0dGVbMTZdOworCWludCBwYWxldHRlRW5hYmxlZDsKKwlpbnQgcG1fc3RhdGU7CisJaW50IGRpc3BsYXlfdHlwZTsKKwlpbnQgZHZpOworCWludCBjcnRvbmx5OworCWludCBkYWNTcGVlZEJwcDsKKwlpbnQgbWF4Q2xvY2s7CisJaW50IG1pbkNsb2NrOworCWludCBudW1DbG9ja3M7CisJaW50IGNsb2NrWzRdOworCWludCBNQ0xLLCBSRUZDTEssIExDRGNsazsKKwlzdHJ1Y3QgeworCQl1OCAgIF9faW9tZW0gKnZiYXNlOworCQl1MzIgICAgcGJhc2U7CisJCXUzMiAgICBsZW47CisjaWZkZWYgQ09ORklHX01UUlIKKwkJaW50ICAgIG10cnI7CisjZW5kaWYKKwl9IHZpZGVvOworCisJc3RydWN0IHsKKwkJdm9sYXRpbGUgdTggIF9faW9tZW0gKnZiYXNlOworCQl1MzIgICAgICAgICAgIHBiYXNlOworCQl1MzIgICAgICAgICAgIGxlbjsKKwl9IG1taW87CisKKwl2b2xhdGlsZSB1MzIgIF9faW9tZW0gKmJjaV9iYXNlOworCXVuc2lnbmVkIGludCAgYmNpX3B0cjsKKwl1MzIgICAgICAgICAgIGNvYl9vZmZzZXQ7CisJdTMyICAgICAgICAgICBjb2Jfc2l6ZTsKKwlpbnQgICAgICAgICAgIGNvYl9pbmRleDsKKworCXZvaWQgKCpTYXZhZ2VXYWl0SWRsZSkgKHN0cnVjdCBzYXZhZ2VmYl9wYXIgKnBhcik7CisJdm9pZCAoKlNhdmFnZVdhaXRGaWZvKSAoc3RydWN0IHNhdmFnZWZiX3BhciAqcGFyLCBpbnQgc3BhY2UpOworCisJaW50IEhvcml6U2NhbGVGYWN0b3I7CisKKwkvKiBQYW5lbHMgc2l6ZSAqLworCWludCBTYXZhZ2VQYW5lbFdpZHRoOworCWludCBTYXZhZ2VQYW5lbEhlaWdodDsKKworCXN0cnVjdCB7CisJCXUxNiByZWQsIGdyZWVuLCBibHVlLCB0cmFuc3A7CisJfSBwYWxldHRlW05SX1BBTEVUVEVdOworCisJaW50IGRlcHRoOworCWludCB2d2lkdGg7Cit9OwogCiAjZGVmaW5lIEJDSV9CRF9CV19ESVNBQkxFICAgICAgICAgICAgMHgxMDAwMDAwMAogI2RlZmluZSBCQ0lfQkRfU0VUX0JQUChiZCwgYnBwKSAgICAgICgoYmQpIHw9ICgoKGJwcCkgJiAweEZGKSA8PCAxNikpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3NhdmFnZS9zYXZhZ2VmYl9kcml2ZXIuYyBiL2RyaXZlcnMvdmlkZW8vc2F2YWdlL3NhdmFnZWZiX2RyaXZlci5jCmluZGV4IDBkYTYyNGUuLjc4ODgzY2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vc2F2YWdlL3NhdmFnZWZiX2RyaXZlci5jCisrKyBiL2RyaXZlcnMvdmlkZW8vc2F2YWdlL3NhdmFnZWZiX2RyaXZlci5jCkBAIC04NiwxNSArODYsMTUgQEAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyB2b2lkIHZnYUhXU2VxUmVzZXQgKHN0cnVjdCBzYXZhZ2VmYl9wYXIgKnBhciwgaW50IHN0YXJ0KQorc3RhdGljIHZvaWQgdmdhSFdTZXFSZXNldChzdHJ1Y3Qgc2F2YWdlZmJfcGFyICpwYXIsIGludCBzdGFydCkKIHsKIAlpZiAoc3RhcnQpCi0JCVZHQXdTRVEgKDB4MDAsIDB4MDEsIHBhcik7CS8qIFN5bmNocm9ub3VzIFJlc2V0ICovCisJCVZHQXdTRVEoMHgwMCwgMHgwMSwgcGFyKTsJLyogU3luY2hyb25vdXMgUmVzZXQgKi8KIAllbHNlCi0JCVZHQXdTRVEgKDB4MDAsIDB4MDMsIHBhcik7CS8qIEVuZCBSZXNldCAqLworCQlWR0F3U0VRKDB4MDAsIDB4MDMsIHBhcik7CS8qIEVuZCBSZXNldCAqLwogfQogCi1zdGF0aWMgdm9pZCB2Z2FIV1Byb3RlY3QgKHN0cnVjdCBzYXZhZ2VmYl9wYXIgKnBhciwgaW50IG9uKQorc3RhdGljIHZvaWQgdmdhSFdQcm90ZWN0KHN0cnVjdCBzYXZhZ2VmYl9wYXIgKnBhciwgaW50IG9uKQogewogCXVuc2lnbmVkIGNoYXIgdG1wOwogCkBAIC0xMDIsMTAgKzEwMiwxMCBAQAogCQkvKgogCQkgKiBUdXJuIG9mZiBzY3JlZW4gYW5kIGRpc2FibGUgc2VxdWVuY2VyLgogCQkgKi8KLQkJdG1wID0gVkdBclNFUSAoMHgwMSwgcGFyKTsKKwkJdG1wID0gVkdBclNFUSgweDAxLCBwYXIpOwogCi0JCXZnYUhXU2VxUmVzZXQgKHBhciwgMSk7CSAgICAgICAgLyogc3RhcnQgc3luY2hyb25vdXMgcmVzZXQgKi8KLQkJVkdBd1NFUSAoMHgwMSwgdG1wIHwgMHgyMCwgcGFyKTsvKiBkaXNhYmxlIHRoZSBkaXNwbGF5ICovCisJCXZnYUhXU2VxUmVzZXQocGFyLCAxKTsJICAgICAgICAvKiBzdGFydCBzeW5jaHJvbm91cyByZXNldCAqLworCQlWR0F3U0VRKDB4MDEsIHRtcCB8IDB4MjAsIHBhcik7LyogZGlzYWJsZSB0aGUgZGlzcGxheSAqLwogCiAJCVZHQWVuYWJsZVBhbGV0dGUocGFyKTsKIAl9IGVsc2UgewpAQCAtMTEzLDc1ICsxMTMsNzYgQEAKIAkJICogUmVlbmFibGUgc2VxdWVuY2VyLCB0aGVuIHR1cm4gb24gc2NyZWVuLgogCQkgKi8KIAotCQl0bXAgPSBWR0FyU0VRICgweDAxLCBwYXIpOworCQl0bXAgPSBWR0FyU0VRKDB4MDEsIHBhcik7CiAKLQkJVkdBd1NFUSAoMHgwMSwgdG1wICYgfjB4MjAsIHBhcik7LyogcmVlbmFibGUgZGlzcGxheSAqLwotCQl2Z2FIV1NlcVJlc2V0IChwYXIsIDApOwkgICAgICAgIC8qIGNsZWFyIHN5bmNocm9ub3VzIHJlc2V0ICovCisJCVZHQXdTRVEoMHgwMSwgdG1wICYgfjB4MjAsIHBhcik7LyogcmVlbmFibGUgZGlzcGxheSAqLworCQl2Z2FIV1NlcVJlc2V0KHBhciwgMCk7CSAgICAgICAgLyogY2xlYXIgc3luY2hyb25vdXMgcmVzZXQgKi8KIAogCQlWR0FkaXNhYmxlUGFsZXR0ZShwYXIpOwogCX0KIH0KIAotc3RhdGljIHZvaWQgdmdhSFdSZXN0b3JlIChzdHJ1Y3Qgc2F2YWdlZmJfcGFyICAqcGFyKQorc3RhdGljIHZvaWQgdmdhSFdSZXN0b3JlKHN0cnVjdCBzYXZhZ2VmYl9wYXIgICpwYXIsIHN0cnVjdCBzYXZhZ2VfcmVnICpyZWcpCiB7CiAJaW50IGk7CiAKLQlWR0F3TUlTQyAocGFyLT5NaXNjT3V0UmVnLCBwYXIpOworCVZHQXdNSVNDKHJlZy0+TWlzY091dFJlZywgcGFyKTsKIAogCWZvciAoaSA9IDE7IGkgPCA1OyBpKyspCi0JCVZHQXdTRVEgKGksIHBhci0+U2VxdWVuY2VyW2ldLCBwYXIpOworCQlWR0F3U0VRKGksIHJlZy0+U2VxdWVuY2VyW2ldLCBwYXIpOwogCiAJLyogRW5zdXJlIENSVEMgcmVnaXN0ZXJzIDAtNyBhcmUgdW5sb2NrZWQgYnkgY2xlYXJpbmcgYml0IDcgb3IKIAkgICBDUlRDWzE3XSAqLwotCVZHQXdDUiAoMTcsIHBhci0+Q1JUQ1sxN10gJiB+MHg4MCwgcGFyKTsKKwlWR0F3Q1IoMTcsIHJlZy0+Q1JUQ1sxN10gJiB+MHg4MCwgcGFyKTsKIAogCWZvciAoaSA9IDA7IGkgPCAyNTsgaSsrKQotCQlWR0F3Q1IgKGksIHBhci0+Q1JUQ1tpXSwgcGFyKTsKKwkJVkdBd0NSKGksIHJlZy0+Q1JUQ1tpXSwgcGFyKTsKIAogCWZvciAoaSA9IDA7IGkgPCA5OyBpKyspCi0JCVZHQXdHUiAoaSwgcGFyLT5HcmFwaGljc1tpXSwgcGFyKTsKKwkJVkdBd0dSKGksIHJlZy0+R3JhcGhpY3NbaV0sIHBhcik7CiAKIAlWR0FlbmFibGVQYWxldHRlKHBhcik7CiAKIAlmb3IgKGkgPSAwOyBpIDwgMjE7IGkrKykKLQkJVkdBd0FUVFIgKGksIHBhci0+QXR0cmlidXRlW2ldLCBwYXIpOworCQlWR0F3QVRUUihpLCByZWctPkF0dHJpYnV0ZVtpXSwgcGFyKTsKIAogCVZHQWRpc2FibGVQYWxldHRlKHBhcik7CiB9CiAKLXN0YXRpYyB2b2lkIHZnYUhXSW5pdCAoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCi0JCSAgICAgICBzdHJ1Y3Qgc2F2YWdlZmJfcGFyICAgICAgICAgICAgKnBhciwKLQkJICAgICAgIHN0cnVjdCB4dGltaW5ncyAgICAgICAgICAgICAgICAqdGltaW5ncykKK3N0YXRpYyB2b2lkIHZnYUhXSW5pdChzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwKKwkJICAgICAgc3RydWN0IHNhdmFnZWZiX3BhciAgICAgICAgICAgICpwYXIsCisJCSAgICAgIHN0cnVjdCB4dGltaW5ncyAgICAgICAgICAgICAgICAqdGltaW5ncywKKwkJICAgICAgc3RydWN0IHNhdmFnZV9yZWcgICAgICAgICAgICAgICpyZWcpCiB7Ci0JcGFyLT5NaXNjT3V0UmVnID0gMHgyMzsKKwlyZWctPk1pc2NPdXRSZWcgPSAweDIzOwogCiAJaWYgKCEodGltaW5ncy0+c3luYyAmIEZCX1NZTkNfSE9SX0hJR0hfQUNUKSkKLQkJcGFyLT5NaXNjT3V0UmVnIHw9IDB4NDA7CisJCXJlZy0+TWlzY091dFJlZyB8PSAweDQwOwogCiAJaWYgKCEodGltaW5ncy0+c3luYyAmIEZCX1NZTkNfVkVSVF9ISUdIX0FDVCkpCi0JCXBhci0+TWlzY091dFJlZyB8PSAweDgwOworCQlyZWctPk1pc2NPdXRSZWcgfD0gMHg4MDsKIAogCS8qCiAJICogVGltZSBTZXF1ZW5jZXIKIAkgKi8KLQlwYXItPlNlcXVlbmNlclsweDAwXSA9IDB4MDA7Ci0JcGFyLT5TZXF1ZW5jZXJbMHgwMV0gPSAweDAxOwotCXBhci0+U2VxdWVuY2VyWzB4MDJdID0gMHgwRjsKLQlwYXItPlNlcXVlbmNlclsweDAzXSA9IDB4MDA7ICAgICAgICAgIC8qIEZvbnQgc2VsZWN0ICovCi0JcGFyLT5TZXF1ZW5jZXJbMHgwNF0gPSAweDBFOyAgICAgICAgICAvKiBNaXNjICovCisJcmVnLT5TZXF1ZW5jZXJbMHgwMF0gPSAweDAwOworCXJlZy0+U2VxdWVuY2VyWzB4MDFdID0gMHgwMTsKKwlyZWctPlNlcXVlbmNlclsweDAyXSA9IDB4MEY7CisJcmVnLT5TZXF1ZW5jZXJbMHgwM10gPSAweDAwOyAgICAgICAgICAvKiBGb250IHNlbGVjdCAqLworCXJlZy0+U2VxdWVuY2VyWzB4MDRdID0gMHgwRTsgICAgICAgICAgLyogTWlzYyAqLwogCiAJLyoKIAkgKiBDUlRDIENvbnRyb2xsZXIKIAkgKi8KLQlwYXItPkNSVENbMHgwMF0gPSAodGltaW5ncy0+SFRvdGFsID4+IDMpIC0gNTsKLQlwYXItPkNSVENbMHgwMV0gPSAodGltaW5ncy0+SERpc3BsYXkgPj4gMykgLSAxOwotCXBhci0+Q1JUQ1sweDAyXSA9ICh0aW1pbmdzLT5IU3luY1N0YXJ0ID4+IDMpIC0gMTsKLQlwYXItPkNSVENbMHgwM10gPSAoKCh0aW1pbmdzLT5IU3luY0VuZCA+PiAzKSAgLSAxKSAmIDB4MWYpIHwgMHg4MDsKLQlwYXItPkNSVENbMHgwNF0gPSAodGltaW5ncy0+SFN5bmNTdGFydCA+PiAzKTsKLQlwYXItPkNSVENbMHgwNV0gPSAoKCgodGltaW5ncy0+SFN5bmNFbmQgPj4gMykgLSAxKSAmIDB4MjApIDw8IDIpIHwKKwlyZWctPkNSVENbMHgwMF0gPSAodGltaW5ncy0+SFRvdGFsID4+IDMpIC0gNTsKKwlyZWctPkNSVENbMHgwMV0gPSAodGltaW5ncy0+SERpc3BsYXkgPj4gMykgLSAxOworCXJlZy0+Q1JUQ1sweDAyXSA9ICh0aW1pbmdzLT5IU3luY1N0YXJ0ID4+IDMpIC0gMTsKKwlyZWctPkNSVENbMHgwM10gPSAoKCh0aW1pbmdzLT5IU3luY0VuZCA+PiAzKSAgLSAxKSAmIDB4MWYpIHwgMHg4MDsKKwlyZWctPkNSVENbMHgwNF0gPSAodGltaW5ncy0+SFN5bmNTdGFydCA+PiAzKTsKKwlyZWctPkNSVENbMHgwNV0gPSAoKCgodGltaW5ncy0+SFN5bmNFbmQgPj4gMykgLSAxKSAmIDB4MjApIDw8IDIpIHwKIAkJKCgodGltaW5ncy0+SFN5bmNFbmQgPj4gMykpICYgMHgxZik7Ci0JcGFyLT5DUlRDWzB4MDZdID0gKHRpbWluZ3MtPlZUb3RhbCAtIDIpICYgMHhGRjsKLQlwYXItPkNSVENbMHgwN10gPSAoKCh0aW1pbmdzLT5WVG90YWwgLSAyKSAmIDB4MTAwKSA+PiA4KSB8CisJcmVnLT5DUlRDWzB4MDZdID0gKHRpbWluZ3MtPlZUb3RhbCAtIDIpICYgMHhGRjsKKwlyZWctPkNSVENbMHgwN10gPSAoKCh0aW1pbmdzLT5WVG90YWwgLSAyKSAmIDB4MTAwKSA+PiA4KSB8CiAJCSgoKHRpbWluZ3MtPlZEaXNwbGF5IC0gMSkgJiAweDEwMCkgPj4gNykgfAogCQkoKHRpbWluZ3MtPlZTeW5jU3RhcnQgJiAweDEwMCkgPj4gNikgfAogCQkoKCh0aW1pbmdzLT5WU3luY1N0YXJ0IC0gMSkgJiAweDEwMCkgPj4gNSkgfApAQCAtMTg5LDI3ICsxOTAsMjcgQEAKIAkJKCgodGltaW5ncy0+VlRvdGFsIC0gMikgJiAweDIwMCkgPj4gNCkgfAogCQkoKCh0aW1pbmdzLT5WRGlzcGxheSAtIDEpICYgMHgyMDApID4+IDMpIHwKIAkJKCh0aW1pbmdzLT5WU3luY1N0YXJ0ICYgMHgyMDApID4+IDIpOwotCXBhci0+Q1JUQ1sweDA4XSA9IDB4MDA7Ci0JcGFyLT5DUlRDWzB4MDldID0gKCgodGltaW5ncy0+VlN5bmNTdGFydCAtIDEpICYgMHgyMDApID4+IDQpIHwgMHg0MDsKKwlyZWctPkNSVENbMHgwOF0gPSAweDAwOworCXJlZy0+Q1JUQ1sweDA5XSA9ICgoKHRpbWluZ3MtPlZTeW5jU3RhcnQgLSAxKSAmIDB4MjAwKSA+PiA0KSB8IDB4NDA7CiAKIAlpZiAodGltaW5ncy0+ZGJsc2NhbikKLQkJcGFyLT5DUlRDWzB4MDldIHw9IDB4ODA7CisJCXJlZy0+Q1JUQ1sweDA5XSB8PSAweDgwOwogCi0JcGFyLT5DUlRDWzB4MGFdID0gMHgwMDsKLQlwYXItPkNSVENbMHgwYl0gPSAweDAwOwotCXBhci0+Q1JUQ1sweDBjXSA9IDB4MDA7Ci0JcGFyLT5DUlRDWzB4MGRdID0gMHgwMDsKLQlwYXItPkNSVENbMHgwZV0gPSAweDAwOwotCXBhci0+Q1JUQ1sweDBmXSA9IDB4MDA7Ci0JcGFyLT5DUlRDWzB4MTBdID0gdGltaW5ncy0+VlN5bmNTdGFydCAmIDB4ZmY7Ci0JcGFyLT5DUlRDWzB4MTFdID0gKHRpbWluZ3MtPlZTeW5jRW5kICYgMHgwZikgfCAweDIwOwotCXBhci0+Q1JUQ1sweDEyXSA9ICh0aW1pbmdzLT5WRGlzcGxheSAtIDEpICYgMHhmZjsKLQlwYXItPkNSVENbMHgxM10gPSB2YXItPnhyZXNfdmlydHVhbCA+PiA0OwotCXBhci0+Q1JUQ1sweDE0XSA9IDB4MDA7Ci0JcGFyLT5DUlRDWzB4MTVdID0gKHRpbWluZ3MtPlZTeW5jU3RhcnQgLSAxKSAmIDB4ZmY7Ci0JcGFyLT5DUlRDWzB4MTZdID0gKHRpbWluZ3MtPlZTeW5jRW5kIC0gMSkgJiAweGZmOwotCXBhci0+Q1JUQ1sweDE3XSA9IDB4YzM7Ci0JcGFyLT5DUlRDWzB4MThdID0gMHhmZjsKKwlyZWctPkNSVENbMHgwYV0gPSAweDAwOworCXJlZy0+Q1JUQ1sweDBiXSA9IDB4MDA7CisJcmVnLT5DUlRDWzB4MGNdID0gMHgwMDsKKwlyZWctPkNSVENbMHgwZF0gPSAweDAwOworCXJlZy0+Q1JUQ1sweDBlXSA9IDB4MDA7CisJcmVnLT5DUlRDWzB4MGZdID0gMHgwMDsKKwlyZWctPkNSVENbMHgxMF0gPSB0aW1pbmdzLT5WU3luY1N0YXJ0ICYgMHhmZjsKKwlyZWctPkNSVENbMHgxMV0gPSAodGltaW5ncy0+VlN5bmNFbmQgJiAweDBmKSB8IDB4MjA7CisJcmVnLT5DUlRDWzB4MTJdID0gKHRpbWluZ3MtPlZEaXNwbGF5IC0gMSkgJiAweGZmOworCXJlZy0+Q1JUQ1sweDEzXSA9IHZhci0+eHJlc192aXJ0dWFsID4+IDQ7CisJcmVnLT5DUlRDWzB4MTRdID0gMHgwMDsKKwlyZWctPkNSVENbMHgxNV0gPSAodGltaW5ncy0+VlN5bmNTdGFydCAtIDEpICYgMHhmZjsKKwlyZWctPkNSVENbMHgxNl0gPSAodGltaW5ncy0+VlN5bmNFbmQgLSAxKSAmIDB4ZmY7CisJcmVnLT5DUlRDWzB4MTddID0gMHhjMzsKKwlyZWctPkNSVENbMHgxOF0gPSAweGZmOwogCiAJLyoKIAkgKiBhcmUgdGhlc2UgdW5uZWNlc3Nhcnk/CkBAIC0yMjAsMzggKzIyMSwzOCBAQAogCS8qCiAJICogR3JhcGhpY3MgRGlzcGxheSBDb250cm9sbGVyCiAJICovCi0JcGFyLT5HcmFwaGljc1sweDAwXSA9IDB4MDA7Ci0JcGFyLT5HcmFwaGljc1sweDAxXSA9IDB4MDA7Ci0JcGFyLT5HcmFwaGljc1sweDAyXSA9IDB4MDA7Ci0JcGFyLT5HcmFwaGljc1sweDAzXSA9IDB4MDA7Ci0JcGFyLT5HcmFwaGljc1sweDA0XSA9IDB4MDA7Ci0JcGFyLT5HcmFwaGljc1sweDA1XSA9IDB4NDA7Ci0JcGFyLT5HcmFwaGljc1sweDA2XSA9IDB4MDU7ICAgLyogb25seSBtYXAgNjRrIFZHQSBtZW1vcnkgISEhISAqLwotCXBhci0+R3JhcGhpY3NbMHgwN10gPSAweDBGOwotCXBhci0+R3JhcGhpY3NbMHgwOF0gPSAweEZGOworCXJlZy0+R3JhcGhpY3NbMHgwMF0gPSAweDAwOworCXJlZy0+R3JhcGhpY3NbMHgwMV0gPSAweDAwOworCXJlZy0+R3JhcGhpY3NbMHgwMl0gPSAweDAwOworCXJlZy0+R3JhcGhpY3NbMHgwM10gPSAweDAwOworCXJlZy0+R3JhcGhpY3NbMHgwNF0gPSAweDAwOworCXJlZy0+R3JhcGhpY3NbMHgwNV0gPSAweDQwOworCXJlZy0+R3JhcGhpY3NbMHgwNl0gPSAweDA1OyAgIC8qIG9ubHkgbWFwIDY0ayBWR0EgbWVtb3J5ICEhISEgKi8KKwlyZWctPkdyYXBoaWNzWzB4MDddID0gMHgwRjsKKwlyZWctPkdyYXBoaWNzWzB4MDhdID0gMHhGRjsKIAogCi0JcGFyLT5BdHRyaWJ1dGVbMHgwMF0gID0gMHgwMDsgLyogc3RhbmRhcmQgY29sb3JtYXAgdHJhbnNsYXRpb24gKi8KLQlwYXItPkF0dHJpYnV0ZVsweDAxXSAgPSAweDAxOwotCXBhci0+QXR0cmlidXRlWzB4MDJdICA9IDB4MDI7Ci0JcGFyLT5BdHRyaWJ1dGVbMHgwM10gID0gMHgwMzsKLQlwYXItPkF0dHJpYnV0ZVsweDA0XSAgPSAweDA0OwotCXBhci0+QXR0cmlidXRlWzB4MDVdICA9IDB4MDU7Ci0JcGFyLT5BdHRyaWJ1dGVbMHgwNl0gID0gMHgwNjsKLQlwYXItPkF0dHJpYnV0ZVsweDA3XSAgPSAweDA3OwotCXBhci0+QXR0cmlidXRlWzB4MDhdICA9IDB4MDg7Ci0JcGFyLT5BdHRyaWJ1dGVbMHgwOV0gID0gMHgwOTsKLQlwYXItPkF0dHJpYnV0ZVsweDBhXSA9IDB4MEE7Ci0JcGFyLT5BdHRyaWJ1dGVbMHgwYl0gPSAweDBCOwotCXBhci0+QXR0cmlidXRlWzB4MGNdID0gMHgwQzsKLQlwYXItPkF0dHJpYnV0ZVsweDBkXSA9IDB4MEQ7Ci0JcGFyLT5BdHRyaWJ1dGVbMHgwZV0gPSAweDBFOwotCXBhci0+QXR0cmlidXRlWzB4MGZdID0gMHgwRjsKLQlwYXItPkF0dHJpYnV0ZVsweDEwXSA9IDB4NDE7Ci0JcGFyLT5BdHRyaWJ1dGVbMHgxMV0gPSAweEZGOwotCXBhci0+QXR0cmlidXRlWzB4MTJdID0gMHgwRjsKLQlwYXItPkF0dHJpYnV0ZVsweDEzXSA9IDB4MDA7Ci0JcGFyLT5BdHRyaWJ1dGVbMHgxNF0gPSAweDAwOworCXJlZy0+QXR0cmlidXRlWzB4MDBdICA9IDB4MDA7IC8qIHN0YW5kYXJkIGNvbG9ybWFwIHRyYW5zbGF0aW9uICovCisJcmVnLT5BdHRyaWJ1dGVbMHgwMV0gID0gMHgwMTsKKwlyZWctPkF0dHJpYnV0ZVsweDAyXSAgPSAweDAyOworCXJlZy0+QXR0cmlidXRlWzB4MDNdICA9IDB4MDM7CisJcmVnLT5BdHRyaWJ1dGVbMHgwNF0gID0gMHgwNDsKKwlyZWctPkF0dHJpYnV0ZVsweDA1XSAgPSAweDA1OworCXJlZy0+QXR0cmlidXRlWzB4MDZdICA9IDB4MDY7CisJcmVnLT5BdHRyaWJ1dGVbMHgwN10gID0gMHgwNzsKKwlyZWctPkF0dHJpYnV0ZVsweDA4XSAgPSAweDA4OworCXJlZy0+QXR0cmlidXRlWzB4MDldICA9IDB4MDk7CisJcmVnLT5BdHRyaWJ1dGVbMHgwYV0gPSAweDBBOworCXJlZy0+QXR0cmlidXRlWzB4MGJdID0gMHgwQjsKKwlyZWctPkF0dHJpYnV0ZVsweDBjXSA9IDB4MEM7CisJcmVnLT5BdHRyaWJ1dGVbMHgwZF0gPSAweDBEOworCXJlZy0+QXR0cmlidXRlWzB4MGVdID0gMHgwRTsKKwlyZWctPkF0dHJpYnV0ZVsweDBmXSA9IDB4MEY7CisJcmVnLT5BdHRyaWJ1dGVbMHgxMF0gPSAweDQxOworCXJlZy0+QXR0cmlidXRlWzB4MTFdID0gMHhGRjsKKwlyZWctPkF0dHJpYnV0ZVsweDEyXSA9IDB4MEY7CisJcmVnLT5BdHRyaWJ1dGVbMHgxM10gPSAweDAwOworCXJlZy0+QXR0cmlidXRlWzB4MTRdID0gMHgwMDsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0gSGFyZHdhcmUgc3BlY2lmaWMgcm91dGluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMzA0LDE1ICszMDUsMTUgQEAKIAl3aGlsZSAoKHNhdmFnZV9pbjMyKDB4NDhDNjAsIHBhcikgJiAweDAwOWZmZmZmKSk7CiB9CiAKLQorI2lmZGVmIENPTkZJR19GQl9TQVZBR0VfQUNDRUwKIHN0YXRpYyB2b2lkCi1TYXZhZ2VTZXR1cDJERW5naW5lIChzdHJ1Y3Qgc2F2YWdlZmJfcGFyICAqcGFyKQorU2F2YWdlU2V0dXAyREVuZ2luZShzdHJ1Y3Qgc2F2YWdlZmJfcGFyICAqcGFyKQogewogCXVuc2lnbmVkIGxvbmcgR2xvYmFsQml0bWFwRGVzY3JpcHRvcjsKIAogCUdsb2JhbEJpdG1hcERlc2NyaXB0b3IgPSAxIHwgOCB8IEJDSV9CRF9CV19ESVNBQkxFOwotCUJDSV9CRF9TRVRfQlBQIChHbG9iYWxCaXRtYXBEZXNjcmlwdG9yLCBwYXItPmRlcHRoKTsKLQlCQ0lfQkRfU0VUX1NUUklERSAoR2xvYmFsQml0bWFwRGVzY3JpcHRvciwgcGFyLT52d2lkdGgpOworCUJDSV9CRF9TRVRfQlBQKEdsb2JhbEJpdG1hcERlc2NyaXB0b3IsIHBhci0+ZGVwdGgpOworCUJDSV9CRF9TRVRfU1RSSURFKEdsb2JhbEJpdG1hcERlc2NyaXB0b3IsIHBhci0+dndpZHRoKTsKIAogCXN3aXRjaChwYXItPmNoaXApIHsKIAljYXNlIFMzX1NBVkFHRTNEOgpAQCAtMzYxLDMyICszNjIsNDggQEAKIAl2Z2Ffb3V0OCgweDNkNSwgMHgwYywgcGFyKTsKIAogCS8qIFNldCBzdHJpZGUgdG8gdXNlIEdCRC4gKi8KLQl2Z2Ffb3V0OCAoMHgzZDQsIDB4NTAsIHBhcik7Ci0JdmdhX291dDggKDB4M2Q1LCB2Z2FfaW44KDB4M2Q1LCBwYXIpIHwgMHhDMSwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNkNCwgMHg1MCwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNkNSwgdmdhX2luOCgweDNkNSwgcGFyKSB8IDB4QzEsIHBhcik7CiAKIAkvKiBFbmFibGUgMkQgZW5naW5lLiAqLwotCXZnYV9vdXQ4ICgweDNkNCwgMHg0MCwgcGFyKTsKLQl2Z2Ffb3V0OCAoMHgzZDUsIDB4MDEsIHBhcik7CisJdmdhX291dDgoMHgzZDQsIDB4NDAsIHBhcik7CisJdmdhX291dDgoMHgzZDUsIDB4MDEsIHBhcik7CiAKLQlzYXZhZ2Vfb3V0MzIgKE1PTk9fUEFUXzAsIH4wLCBwYXIpOwotCXNhdmFnZV9vdXQzMiAoTU9OT19QQVRfMSwgfjAsIHBhcik7CisJc2F2YWdlX291dDMyKE1PTk9fUEFUXzAsIH4wLCBwYXIpOworCXNhdmFnZV9vdXQzMihNT05PX1BBVF8xLCB+MCwgcGFyKTsKIAogCS8qIFNldHVwIHBsYW5lIG1hc2tzICovCi0Jc2F2YWdlX291dDMyICgweDgxMjgsIH4wLCBwYXIpOyAvKiBlbmFibGUgYWxsIHdyaXRlIHBsYW5lcyAqLwotCXNhdmFnZV9vdXQzMiAoMHg4MTJDLCB+MCwgcGFyKTsgLyogZW5hYmxlIGFsbCByZWFkIHBsYW5lcyAqLwotCXNhdmFnZV9vdXQxNiAoMHg4MTM0LCAweDI3LCBwYXIpOwotCXNhdmFnZV9vdXQxNiAoMHg4MTM2LCAweDA3LCBwYXIpOworCXNhdmFnZV9vdXQzMigweDgxMjgsIH4wLCBwYXIpOyAvKiBlbmFibGUgYWxsIHdyaXRlIHBsYW5lcyAqLworCXNhdmFnZV9vdXQzMigweDgxMkMsIH4wLCBwYXIpOyAvKiBlbmFibGUgYWxsIHJlYWQgcGxhbmVzICovCisJc2F2YWdlX291dDE2KDB4ODEzNCwgMHgyNywgcGFyKTsKKwlzYXZhZ2Vfb3V0MTYoMHg4MTM2LCAweDA3LCBwYXIpOwogCiAJLyogTm93IHNldCB0aGUgR0JEICovCiAJcGFyLT5iY2lfcHRyID0gMDsKLQlwYXItPlNhdmFnZVdhaXRGaWZvIChwYXIsIDQpOworCXBhci0+U2F2YWdlV2FpdEZpZm8ocGFyLCA0KTsKIAotCUJDSV9TRU5EKCBCQ0lfQ01EX1NFVFJFRyB8ICgxIDw8IDE2KSB8IEJDSV9HQkQxICk7Ci0JQkNJX1NFTkQoIDAgKTsKLQlCQ0lfU0VORCggQkNJX0NNRF9TRVRSRUcgfCAoMSA8PCAxNikgfCBCQ0lfR0JEMiApOwotCUJDSV9TRU5EKCBHbG9iYWxCaXRtYXBEZXNjcmlwdG9yICk7CisJQkNJX1NFTkQoQkNJX0NNRF9TRVRSRUcgfCAoMSA8PCAxNikgfCBCQ0lfR0JEMSk7CisJQkNJX1NFTkQoMCk7CisJQkNJX1NFTkQoQkNJX0NNRF9TRVRSRUcgfCAoMSA8PCAxNikgfCBCQ0lfR0JEMik7CisJQkNJX1NFTkQoR2xvYmFsQml0bWFwRGVzY3JpcHRvcik7CiB9CiAKK3N0YXRpYyB2b2lkIHNhdmFnZWZiX3NldF9jbGlwKHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXN0cnVjdCBzYXZhZ2VmYl9wYXIgKnBhciA9IGluZm8tPnBhcjsKKwlpbnQgY21kOworCisJY21kID0gQkNJX0NNRF9OT1AgfCBCQ0lfQ01EX0NMSVBfTkVXOworCXBhci0+YmNpX3B0ciA9IDA7CisJcGFyLT5TYXZhZ2VXYWl0RmlmbyhwYXIsMyk7CisJQkNJX1NFTkQoY21kKTsKKwlCQ0lfU0VORChCQ0lfQ0xJUF9UTCgwLCAwKSk7CisJQkNJX1NFTkQoQkNJX0NMSVBfQlIoMHhmZmYsIDB4ZmZmKSk7Cit9CisjZWxzZQorc3RhdGljIHZvaWQgU2F2YWdlU2V0dXAyREVuZ2luZShzdHJ1Y3Qgc2F2YWdlZmJfcGFyICAqcGFyKSB7fQorCisjZW5kaWYKIAogc3RhdGljIHZvaWQgU2F2YWdlQ2FsY0Nsb2NrKGxvbmcgZnJlcSwgaW50IG1pbl9tLCBpbnQgbWluX24xLCBpbnQgbWF4X24xLAogCQkJICAgIGludCBtaW5fbjIsIGludCBtYXhfbjIsIGxvbmcgZnJlcV9taW4sCkBAIC0zOTgsMTEgKzQxNSwxMSBAQAogCXVuc2lnbmVkIGNoYXIgbjEsIG4yLCBiZXN0X24xPTE2KzIsIGJlc3RfbjI9MiwgYmVzdF9tPTEyNSsyOwogCiAJaWYgKGZyZXEgPCBmcmVxX21pbiAvICgxIDw8IG1heF9uMikpIHsKLQkJcHJpbnRrIChLRVJOX0VSUiAiaW52YWxpZCBmcmVxdWVuY3kgJWxkIEtoelxuIiwgZnJlcSk7CisJCXByaW50ayhLRVJOX0VSUiAiaW52YWxpZCBmcmVxdWVuY3kgJWxkIEtoelxuIiwgZnJlcSk7CiAJCWZyZXEgPSBmcmVxX21pbiAvICgxIDw8IG1heF9uMik7CiAJfQogCWlmIChmcmVxID4gZnJlcV9tYXggLyAoMSA8PCBtaW5fbjIpKSB7Ci0JCXByaW50ayAoS0VSTl9FUlIgImludmFsaWQgZnJlcXVlbmN5ICVsZCBLaHpcbiIsIGZyZXEpOworCQlwcmludGsoS0VSTl9FUlIgImludmFsaWQgZnJlcXVlbmN5ICVsZCBLaHpcbiIsIGZyZXEpOwogCQlmcmVxID0gZnJlcV9tYXggLyAoMSA8PCBtaW5fbjIpOwogCX0KIApAQCAtNDUzLDEyICs0NzAsMTIgQEAKIAkJCQlCQVNFX0ZSRVE7CiAJCQlpZiAobSA8IG1pbl9tICsgMiB8fCBtID4gMTI3KzIpCiAJCQkJY29udGludWU7Ci0JCQlpZigobSAqIEJBU0VfRlJFUSA+PSBmcmVxX21pbiAqIG4xKSAmJgotCQkJICAgKG0gKiBCQVNFX0ZSRVEgPD0gZnJlcV9tYXggKiBuMSkpIHsKKwkJCWlmICgobSAqIEJBU0VfRlJFUSA+PSBmcmVxX21pbiAqIG4xKSAmJgorCQkJICAgIChtICogQkFTRV9GUkVRIDw9IGZyZXFfbWF4ICogbjEpKSB7CiAJCQkJZGlmZiA9IGZyZXEgKiAoMSA8PCBuMikgKiBuMSAtIEJBU0VfRlJFUSAqIG07Ci0JCQkJaWYoZGlmZiA8IDApCisJCQkJaWYgKGRpZmYgPCAwKQogCQkJCQlkaWZmID0gLWRpZmY7Ci0JCQkJaWYoZGlmZiA8IGJlc3RfZGlmZikgeworCQkJCWlmIChkaWZmIDwgYmVzdF9kaWZmKSB7CiAJCQkJCWJlc3RfZGlmZiA9IGRpZmY7CiAJCQkJCWJlc3RfbSA9IG07CiAJCQkJCWJlc3RfbjEgPSBuMTsKQEAgLTQ2OCw3ICs0ODUsNyBAQAogCQl9CiAJfQogCi0JaWYobWF4X24xID09IDYzKQorCWlmIChtYXhfbjEgPT0gNjMpCiAJCSpuZGl2ID0gKGJlc3RfbjEgLSAyKSB8IChiZXN0X24yIDw8IDYpOwogCWVsc2UKIAkJKm5kaXYgPSAoYmVzdF9uMSAtIDIpIHwgKGJlc3RfbjIgPDwgNSk7CkBAIC00ODgsMjMgKzUwNSwyMyBAQAogCWludCB2Z2FDUlJlZyA9IDB4M2Q1OwogCiAJcHJpbnRrKEtFUk5fREVCVUcgIlNSICAgIHgwIHgxIHgyIHgzIHg0IHg1IHg2IHg3IHg4IHg5IHhBIHhCIHhDIHhEIHhFICIKLQkgICAgICAgInhGIiApOworCSAgICAgICAieEYiKTsKIAotCWZvciggaSA9IDA7IGkgPCAweDcwOyBpKysgKSB7Ci0JCWlmKCAhKGkgJSAxNikgKQotCQkJcHJpbnRrKEtFUk5fREVCVUcgIlxuU1IleHggIiwgaSA+PiA0ICk7Ci0JCXZnYV9vdXQ4KCAweDNjNCwgaSwgcGFyKTsKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiAlMDJ4IiwgdmdhX2luOCgweDNjNSwgcGFyKSApOworCWZvciAoaSA9IDA7IGkgPCAweDcwOyBpKyspIHsKKwkJaWYgKCEoaSAlIDE2KSkKKwkJCXByaW50ayhLRVJOX0RFQlVHICJcblNSJXh4ICIsIGkgPj4gNCk7CisJCXZnYV9vdXQ4KDB4M2M0LCBpLCBwYXIpOworCQlwcmludGsoS0VSTl9ERUJVRyAiICUwMngiLCB2Z2FfaW44KDB4M2M1LCBwYXIpKTsKIAl9CiAKIAlwcmludGsoS0VSTl9ERUJVRyAiXG5cbkNSICAgIHgwIHgxIHgyIHgzIHg0IHg1IHg2IHg3IHg4IHg5IHhBIHhCIHhDICIKLQkgICAgICAgInhEIHhFIHhGIiApOworCSAgICAgICAieEQgeEUgeEYiKTsKIAotCWZvciggaSA9IDA7IGkgPCAweEI3OyBpKysgKSB7Ci0JCWlmKCAhKGkgJSAxNikgKQotCQkJcHJpbnRrKEtFUk5fREVCVUcgIlxuQ1IleHggIiwgaSA+PiA0ICk7Ci0JCXZnYV9vdXQ4KCB2Z2FDUkluZGV4LCBpLCBwYXIpOwotCQlwcmludGsoS0VSTl9ERUJVRyAiICUwMngiLCB2Z2FfaW44KHZnYUNSUmVnLCBwYXIpICk7CisJZm9yIChpID0gMDsgaSA8IDB4Qjc7IGkrKykgeworCQlpZiAoIShpICUgMTYpKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIlxuQ1IleHggIiwgaSA+PiA0KTsKKwkJdmdhX291dDgodmdhQ1JJbmRleCwgaSwgcGFyKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiAlMDJ4IiwgdmdhX2luOCh2Z2FDUlJlZywgcGFyKSk7CiAJfQogCiAJcHJpbnRrKEtFUk5fREVCVUcgIlxuXG4iKTsKQEAgLTUxMywxNTYgKzUzMCwzMDkgQEAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyB2b2lkIHNhdmFnZV9nZXRfZGVmYXVsdF9wYXIoc3RydWN0IHNhdmFnZWZiX3BhciAqcGFyKQorc3RhdGljIHZvaWQgc2F2YWdlX2dldF9kZWZhdWx0X3BhcihzdHJ1Y3Qgc2F2YWdlZmJfcGFyICpwYXIsIHN0cnVjdCBzYXZhZ2VfcmVnICpyZWcpCiB7CiAJdW5zaWduZWQgY2hhciBjcjNhLCBjcjUzLCBjcjY2OwogCi0JdmdhX291dDE2ICgweDNkNCwgMHg0ODM4LCBwYXIpOwotCXZnYV9vdXQxNiAoMHgzZDQsIDB4YTAzOSwgcGFyKTsKLQl2Z2Ffb3V0MTYgKDB4M2M0LCAweDA2MDgsIHBhcik7CisJdmdhX291dDE2KDB4M2Q0LCAweDQ4MzgsIHBhcik7CisJdmdhX291dDE2KDB4M2Q0LCAweGEwMzksIHBhcik7CisJdmdhX291dDE2KDB4M2M0LCAweDA2MDgsIHBhcik7CiAKLQl2Z2Ffb3V0OCAoMHgzZDQsIDB4NjYsIHBhcik7Ci0JY3I2NiA9IHZnYV9pbjggKDB4M2Q1LCBwYXIpOwotCXZnYV9vdXQ4ICgweDNkNSwgY3I2NiB8IDB4ODAsIHBhcik7Ci0JdmdhX291dDggKDB4M2Q0LCAweDNhLCBwYXIpOwotCWNyM2EgPSB2Z2FfaW44ICgweDNkNSwgcGFyKTsKLQl2Z2Ffb3V0OCAoMHgzZDUsIGNyM2EgfCAweDgwLCBwYXIpOwotCXZnYV9vdXQ4ICgweDNkNCwgMHg1MywgcGFyKTsKLQljcjUzID0gdmdhX2luOCAoMHgzZDUsIHBhcik7Ci0JdmdhX291dDggKDB4M2Q1LCBjcjUzICYgMHg3ZiwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNkNCwgMHg2NiwgcGFyKTsKKwljcjY2ID0gdmdhX2luOCgweDNkNSwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNkNSwgY3I2NiB8IDB4ODAsIHBhcik7CisJdmdhX291dDgoMHgzZDQsIDB4M2EsIHBhcik7CisJY3IzYSA9IHZnYV9pbjgoMHgzZDUsIHBhcik7CisJdmdhX291dDgoMHgzZDUsIGNyM2EgfCAweDgwLCBwYXIpOworCXZnYV9vdXQ4KDB4M2Q0LCAweDUzLCBwYXIpOworCWNyNTMgPSB2Z2FfaW44KDB4M2Q1LCBwYXIpOworCXZnYV9vdXQ4KDB4M2Q1LCBjcjUzICYgMHg3ZiwgcGFyKTsKIAotCXZnYV9vdXQ4ICgweDNkNCwgMHg2NiwgcGFyKTsKLQl2Z2Ffb3V0OCAoMHgzZDUsIGNyNjYsIHBhcik7Ci0JdmdhX291dDggKDB4M2Q0LCAweDNhLCBwYXIpOwotCXZnYV9vdXQ4ICgweDNkNSwgY3IzYSwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNkNCwgMHg2NiwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNkNSwgY3I2NiwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNkNCwgMHgzYSwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNkNSwgY3IzYSwgcGFyKTsKIAotCXZnYV9vdXQ4ICgweDNkNCwgMHg2NiwgcGFyKTsKLQl2Z2Ffb3V0OCAoMHgzZDUsIGNyNjYsIHBhcik7Ci0JdmdhX291dDggKDB4M2Q0LCAweDNhLCBwYXIpOwotCXZnYV9vdXQ4ICgweDNkNSwgY3IzYSwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNkNCwgMHg2NiwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNkNSwgY3I2NiwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNkNCwgMHgzYSwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNkNSwgY3IzYSwgcGFyKTsKIAogCS8qIHVubG9jayBleHRlbmRlZCBzZXEgcmVncyAqLwotCXZnYV9vdXQ4ICgweDNjNCwgMHgwOCwgcGFyKTsKLQlwYXItPlNSMDggPSB2Z2FfaW44ICgweDNjNSwgcGFyKTsKLQl2Z2Ffb3V0OCAoMHgzYzUsIDB4MDYsIHBhcik7CisJdmdhX291dDgoMHgzYzQsIDB4MDgsIHBhcik7CisJcmVnLT5TUjA4ID0gdmdhX2luOCgweDNjNSwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNjNSwgMHgwNiwgcGFyKTsKIAogCS8qIG5vdyBzYXZlIGFsbCB0aGUgZXh0ZW5kZWQgcmVncyB3ZSBuZWVkICovCi0JdmdhX291dDggKDB4M2Q0LCAweDMxLCBwYXIpOwotCXBhci0+Q1IzMSA9IHZnYV9pbjggKDB4M2Q1LCBwYXIpOwotCXZnYV9vdXQ4ICgweDNkNCwgMHgzMiwgcGFyKTsKLQlwYXItPkNSMzIgPSB2Z2FfaW44ICgweDNkNSwgcGFyKTsKLQl2Z2Ffb3V0OCAoMHgzZDQsIDB4MzQsIHBhcik7Ci0JcGFyLT5DUjM0ID0gdmdhX2luOCAoMHgzZDUsIHBhcik7Ci0JdmdhX291dDggKDB4M2Q0LCAweDM2LCBwYXIpOwotCXBhci0+Q1IzNiA9IHZnYV9pbjggKDB4M2Q1LCBwYXIpOwotCXZnYV9vdXQ4ICgweDNkNCwgMHgzYSwgcGFyKTsKLQlwYXItPkNSM0EgPSB2Z2FfaW44ICgweDNkNSwgcGFyKTsKLQl2Z2Ffb3V0OCAoMHgzZDQsIDB4NDAsIHBhcik7Ci0JcGFyLT5DUjQwID0gdmdhX2luOCAoMHgzZDUsIHBhcik7Ci0JdmdhX291dDggKDB4M2Q0LCAweDQyLCBwYXIpOwotCXBhci0+Q1I0MiA9IHZnYV9pbjggKDB4M2Q1LCBwYXIpOwotCXZnYV9vdXQ4ICgweDNkNCwgMHg0NSwgcGFyKTsKLQlwYXItPkNSNDUgPSB2Z2FfaW44ICgweDNkNSwgcGFyKTsKLQl2Z2Ffb3V0OCAoMHgzZDQsIDB4NTAsIHBhcik7Ci0JcGFyLT5DUjUwID0gdmdhX2luOCAoMHgzZDUsIHBhcik7Ci0JdmdhX291dDggKDB4M2Q0LCAweDUxLCBwYXIpOwotCXBhci0+Q1I1MSA9IHZnYV9pbjggKDB4M2Q1LCBwYXIpOwotCXZnYV9vdXQ4ICgweDNkNCwgMHg1MywgcGFyKTsKLQlwYXItPkNSNTMgPSB2Z2FfaW44ICgweDNkNSwgcGFyKTsKLQl2Z2Ffb3V0OCAoMHgzZDQsIDB4NTgsIHBhcik7Ci0JcGFyLT5DUjU4ID0gdmdhX2luOCAoMHgzZDUsIHBhcik7Ci0JdmdhX291dDggKDB4M2Q0LCAweDYwLCBwYXIpOwotCXBhci0+Q1I2MCA9IHZnYV9pbjggKDB4M2Q1LCBwYXIpOwotCXZnYV9vdXQ4ICgweDNkNCwgMHg2NiwgcGFyKTsKLQlwYXItPkNSNjYgPSB2Z2FfaW44ICgweDNkNSwgcGFyKTsKLQl2Z2Ffb3V0OCAoMHgzZDQsIDB4NjcsIHBhcik7Ci0JcGFyLT5DUjY3ID0gdmdhX2luOCAoMHgzZDUsIHBhcik7Ci0JdmdhX291dDggKDB4M2Q0LCAweDY4LCBwYXIpOwotCXBhci0+Q1I2OCA9IHZnYV9pbjggKDB4M2Q1LCBwYXIpOwotCXZnYV9vdXQ4ICgweDNkNCwgMHg2OSwgcGFyKTsKLQlwYXItPkNSNjkgPSB2Z2FfaW44ICgweDNkNSwgcGFyKTsKLQl2Z2Ffb3V0OCAoMHgzZDQsIDB4NmYsIHBhcik7Ci0JcGFyLT5DUjZGID0gdmdhX2luOCAoMHgzZDUsIHBhcik7CisJdmdhX291dDgoMHgzZDQsIDB4MzEsIHBhcik7CisJcmVnLT5DUjMxID0gdmdhX2luOCgweDNkNSwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNkNCwgMHgzMiwgcGFyKTsKKwlyZWctPkNSMzIgPSB2Z2FfaW44KDB4M2Q1LCBwYXIpOworCXZnYV9vdXQ4KDB4M2Q0LCAweDM0LCBwYXIpOworCXJlZy0+Q1IzNCA9IHZnYV9pbjgoMHgzZDUsIHBhcik7CisJdmdhX291dDgoMHgzZDQsIDB4MzYsIHBhcik7CisJcmVnLT5DUjM2ID0gdmdhX2luOCgweDNkNSwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNkNCwgMHgzYSwgcGFyKTsKKwlyZWctPkNSM0EgPSB2Z2FfaW44KDB4M2Q1LCBwYXIpOworCXZnYV9vdXQ4KDB4M2Q0LCAweDQwLCBwYXIpOworCXJlZy0+Q1I0MCA9IHZnYV9pbjgoMHgzZDUsIHBhcik7CisJdmdhX291dDgoMHgzZDQsIDB4NDIsIHBhcik7CisJcmVnLT5DUjQyID0gdmdhX2luOCgweDNkNSwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNkNCwgMHg0NSwgcGFyKTsKKwlyZWctPkNSNDUgPSB2Z2FfaW44KDB4M2Q1LCBwYXIpOworCXZnYV9vdXQ4KDB4M2Q0LCAweDUwLCBwYXIpOworCXJlZy0+Q1I1MCA9IHZnYV9pbjgoMHgzZDUsIHBhcik7CisJdmdhX291dDgoMHgzZDQsIDB4NTEsIHBhcik7CisJcmVnLT5DUjUxID0gdmdhX2luOCgweDNkNSwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNkNCwgMHg1MywgcGFyKTsKKwlyZWctPkNSNTMgPSB2Z2FfaW44KDB4M2Q1LCBwYXIpOworCXZnYV9vdXQ4KDB4M2Q0LCAweDU4LCBwYXIpOworCXJlZy0+Q1I1OCA9IHZnYV9pbjgoMHgzZDUsIHBhcik7CisJdmdhX291dDgoMHgzZDQsIDB4NjAsIHBhcik7CisJcmVnLT5DUjYwID0gdmdhX2luOCgweDNkNSwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNkNCwgMHg2NiwgcGFyKTsKKwlyZWctPkNSNjYgPSB2Z2FfaW44KDB4M2Q1LCBwYXIpOworCXZnYV9vdXQ4KDB4M2Q0LCAweDY3LCBwYXIpOworCXJlZy0+Q1I2NyA9IHZnYV9pbjgoMHgzZDUsIHBhcik7CisJdmdhX291dDgoMHgzZDQsIDB4NjgsIHBhcik7CisJcmVnLT5DUjY4ID0gdmdhX2luOCgweDNkNSwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNkNCwgMHg2OSwgcGFyKTsKKwlyZWctPkNSNjkgPSB2Z2FfaW44KDB4M2Q1LCBwYXIpOworCXZnYV9vdXQ4KDB4M2Q0LCAweDZmLCBwYXIpOworCXJlZy0+Q1I2RiA9IHZnYV9pbjgoMHgzZDUsIHBhcik7CiAKLQl2Z2Ffb3V0OCAoMHgzZDQsIDB4MzMsIHBhcik7Ci0JcGFyLT5DUjMzID0gdmdhX2luOCAoMHgzZDUsIHBhcik7Ci0JdmdhX291dDggKDB4M2Q0LCAweDg2LCBwYXIpOwotCXBhci0+Q1I4NiA9IHZnYV9pbjggKDB4M2Q1LCBwYXIpOwotCXZnYV9vdXQ4ICgweDNkNCwgMHg4OCwgcGFyKTsKLQlwYXItPkNSODggPSB2Z2FfaW44ICgweDNkNSwgcGFyKTsKLQl2Z2Ffb3V0OCAoMHgzZDQsIDB4OTAsIHBhcik7Ci0JcGFyLT5DUjkwID0gdmdhX2luOCAoMHgzZDUsIHBhcik7Ci0JdmdhX291dDggKDB4M2Q0LCAweDkxLCBwYXIpOwotCXBhci0+Q1I5MSA9IHZnYV9pbjggKDB4M2Q1LCBwYXIpOwotCXZnYV9vdXQ4ICgweDNkNCwgMHhiMCwgcGFyKTsKLQlwYXItPkNSQjAgPSB2Z2FfaW44ICgweDNkNSwgcGFyKSB8IDB4ODA7CisJdmdhX291dDgoMHgzZDQsIDB4MzMsIHBhcik7CisJcmVnLT5DUjMzID0gdmdhX2luOCgweDNkNSwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNkNCwgMHg4NiwgcGFyKTsKKwlyZWctPkNSODYgPSB2Z2FfaW44KDB4M2Q1LCBwYXIpOworCXZnYV9vdXQ4KDB4M2Q0LCAweDg4LCBwYXIpOworCXJlZy0+Q1I4OCA9IHZnYV9pbjgoMHgzZDUsIHBhcik7CisJdmdhX291dDgoMHgzZDQsIDB4OTAsIHBhcik7CisJcmVnLT5DUjkwID0gdmdhX2luOCgweDNkNSwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNkNCwgMHg5MSwgcGFyKTsKKwlyZWctPkNSOTEgPSB2Z2FfaW44KDB4M2Q1LCBwYXIpOworCXZnYV9vdXQ4KDB4M2Q0LCAweGIwLCBwYXIpOworCXJlZy0+Q1JCMCA9IHZnYV9pbjgoMHgzZDUsIHBhcikgfCAweDgwOwogCiAJLyogZXh0ZW5kZWQgbW9kZSB0aW1pbmcgcmVncyAqLwotCXZnYV9vdXQ4ICgweDNkNCwgMHgzYiwgcGFyKTsKLQlwYXItPkNSM0IgPSB2Z2FfaW44ICgweDNkNSwgcGFyKTsKLQl2Z2Ffb3V0OCAoMHgzZDQsIDB4M2MsIHBhcik7Ci0JcGFyLT5DUjNDID0gdmdhX2luOCAoMHgzZDUsIHBhcik7Ci0JdmdhX291dDggKDB4M2Q0LCAweDQzLCBwYXIpOwotCXBhci0+Q1I0MyA9IHZnYV9pbjggKDB4M2Q1LCBwYXIpOwotCXZnYV9vdXQ4ICgweDNkNCwgMHg1ZCwgcGFyKTsKLQlwYXItPkNSNUQgPSB2Z2FfaW44ICgweDNkNSwgcGFyKTsKLQl2Z2Ffb3V0OCAoMHgzZDQsIDB4NWUsIHBhcik7Ci0JcGFyLT5DUjVFID0gdmdhX2luOCAoMHgzZDUsIHBhcik7Ci0JdmdhX291dDggKDB4M2Q0LCAweDY1LCBwYXIpOwotCXBhci0+Q1I2NSA9IHZnYV9pbjggKDB4M2Q1LCBwYXIpOworCXZnYV9vdXQ4KDB4M2Q0LCAweDNiLCBwYXIpOworCXJlZy0+Q1IzQiA9IHZnYV9pbjgoMHgzZDUsIHBhcik7CisJdmdhX291dDgoMHgzZDQsIDB4M2MsIHBhcik7CisJcmVnLT5DUjNDID0gdmdhX2luOCgweDNkNSwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNkNCwgMHg0MywgcGFyKTsKKwlyZWctPkNSNDMgPSB2Z2FfaW44KDB4M2Q1LCBwYXIpOworCXZnYV9vdXQ4KDB4M2Q0LCAweDVkLCBwYXIpOworCXJlZy0+Q1I1RCA9IHZnYV9pbjgoMHgzZDUsIHBhcik7CisJdmdhX291dDgoMHgzZDQsIDB4NWUsIHBhcik7CisJcmVnLT5DUjVFID0gdmdhX2luOCgweDNkNSwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNkNCwgMHg2NSwgcGFyKTsKKwlyZWctPkNSNjUgPSB2Z2FfaW44KDB4M2Q1LCBwYXIpOwogCiAJLyogc2F2ZSBzZXEgZXh0ZW5kZWQgcmVncyBmb3IgRENMSyBQTEwgcHJvZ3JhbW1pbmcgKi8KLQl2Z2Ffb3V0OCAoMHgzYzQsIDB4MGUsIHBhcik7Ci0JcGFyLT5TUjBFID0gdmdhX2luOCAoMHgzYzUsIHBhcik7Ci0JdmdhX291dDggKDB4M2M0LCAweDBmLCBwYXIpOwotCXBhci0+U1IwRiA9IHZnYV9pbjggKDB4M2M1LCBwYXIpOwotCXZnYV9vdXQ4ICgweDNjNCwgMHgxMCwgcGFyKTsKLQlwYXItPlNSMTAgPSB2Z2FfaW44ICgweDNjNSwgcGFyKTsKLQl2Z2Ffb3V0OCAoMHgzYzQsIDB4MTEsIHBhcik7Ci0JcGFyLT5TUjExID0gdmdhX2luOCAoMHgzYzUsIHBhcik7Ci0JdmdhX291dDggKDB4M2M0LCAweDEyLCBwYXIpOwotCXBhci0+U1IxMiA9IHZnYV9pbjggKDB4M2M1LCBwYXIpOwotCXZnYV9vdXQ4ICgweDNjNCwgMHgxMywgcGFyKTsKLQlwYXItPlNSMTMgPSB2Z2FfaW44ICgweDNjNSwgcGFyKTsKLQl2Z2Ffb3V0OCAoMHgzYzQsIDB4MjksIHBhcik7Ci0JcGFyLT5TUjI5ID0gdmdhX2luOCAoMHgzYzUsIHBhcik7CisJdmdhX291dDgoMHgzYzQsIDB4MGUsIHBhcik7CisJcmVnLT5TUjBFID0gdmdhX2luOCgweDNjNSwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNjNCwgMHgwZiwgcGFyKTsKKwlyZWctPlNSMEYgPSB2Z2FfaW44KDB4M2M1LCBwYXIpOworCXZnYV9vdXQ4KDB4M2M0LCAweDEwLCBwYXIpOworCXJlZy0+U1IxMCA9IHZnYV9pbjgoMHgzYzUsIHBhcik7CisJdmdhX291dDgoMHgzYzQsIDB4MTEsIHBhcik7CisJcmVnLT5TUjExID0gdmdhX2luOCgweDNjNSwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNjNCwgMHgxMiwgcGFyKTsKKwlyZWctPlNSMTIgPSB2Z2FfaW44KDB4M2M1LCBwYXIpOworCXZnYV9vdXQ4KDB4M2M0LCAweDEzLCBwYXIpOworCXJlZy0+U1IxMyA9IHZnYV9pbjgoMHgzYzUsIHBhcik7CisJdmdhX291dDgoMHgzYzQsIDB4MjksIHBhcik7CisJcmVnLT5TUjI5ID0gdmdhX2luOCgweDNjNSwgcGFyKTsKIAotCXZnYV9vdXQ4ICgweDNjNCwgMHgxNSwgcGFyKTsKLQlwYXItPlNSMTUgPSB2Z2FfaW44ICgweDNjNSwgcGFyKTsKLQl2Z2Ffb3V0OCAoMHgzYzQsIDB4MzAsIHBhcik7Ci0JcGFyLT5TUjMwID0gdmdhX2luOCAoMHgzYzUsIHBhcik7Ci0JdmdhX291dDggKDB4M2M0LCAweDE4LCBwYXIpOwotCXBhci0+U1IxOCA9IHZnYV9pbjggKDB4M2M1LCBwYXIpOworCXZnYV9vdXQ4KDB4M2M0LCAweDE1LCBwYXIpOworCXJlZy0+U1IxNSA9IHZnYV9pbjgoMHgzYzUsIHBhcik7CisJdmdhX291dDgoMHgzYzQsIDB4MzAsIHBhcik7CisJcmVnLT5TUjMwID0gdmdhX2luOCgweDNjNSwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNjNCwgMHgxOCwgcGFyKTsKKwlyZWctPlNSMTggPSB2Z2FfaW44KDB4M2M1LCBwYXIpOwogCiAJLyogU2F2ZSBmbGF0IHBhbmVsIGV4cGFuc2lvbiByZWdzdGVycy4gKi8KIAlpZiAocGFyLT5jaGlwID09IFMzX1NBVkFHRV9NWCkgewogCQlpbnQgaTsKIAogCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JCQl2Z2Ffb3V0OCAoMHgzYzQsIDB4NTQraSwgcGFyKTsKLQkJCXBhci0+U1I1NFtpXSA9IHZnYV9pbjggKDB4M2M1LCBwYXIpOworCQkJdmdhX291dDgoMHgzYzQsIDB4NTQraSwgcGFyKTsKKwkJCXJlZy0+U1I1NFtpXSA9IHZnYV9pbjgoMHgzYzUsIHBhcik7CiAJCX0KIAl9CiAKLQl2Z2Ffb3V0OCAoMHgzZDQsIDB4NjYsIHBhcik7Ci0JY3I2NiA9IHZnYV9pbjggKDB4M2Q1LCBwYXIpOwotCXZnYV9vdXQ4ICgweDNkNSwgY3I2NiB8IDB4ODAsIHBhcik7Ci0JdmdhX291dDggKDB4M2Q0LCAweDNhLCBwYXIpOwotCWNyM2EgPSB2Z2FfaW44ICgweDNkNSwgcGFyKTsKLQl2Z2Ffb3V0OCAoMHgzZDUsIGNyM2EgfCAweDgwLCBwYXIpOworCXZnYV9vdXQ4KDB4M2Q0LCAweDY2LCBwYXIpOworCWNyNjYgPSB2Z2FfaW44KDB4M2Q1LCBwYXIpOworCXZnYV9vdXQ4KDB4M2Q1LCBjcjY2IHwgMHg4MCwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNkNCwgMHgzYSwgcGFyKTsKKwljcjNhID0gdmdhX2luOCgweDNkNSwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNkNSwgY3IzYSB8IDB4ODAsIHBhcik7CiAKIAkvKiBub3cgc2F2ZSBNSVUgcmVncyAqLwogCWlmIChwYXItPmNoaXAgIT0gUzNfU0FWQUdFX01YKSB7Ci0JCXBhci0+TU1QUjAgPSBzYXZhZ2VfaW4zMihGSUZPX0NPTlRST0xfUkVHLCBwYXIpOwotCQlwYXItPk1NUFIxID0gc2F2YWdlX2luMzIoTUlVX0NPTlRST0xfUkVHLCBwYXIpOwotCQlwYXItPk1NUFIyID0gc2F2YWdlX2luMzIoU1RSRUFNU19USU1FT1VUX1JFRywgcGFyKTsKLQkJcGFyLT5NTVBSMyA9IHNhdmFnZV9pbjMyKE1JU0NfVElNRU9VVF9SRUcsIHBhcik7CisJCXJlZy0+TU1QUjAgPSBzYXZhZ2VfaW4zMihGSUZPX0NPTlRST0xfUkVHLCBwYXIpOworCQlyZWctPk1NUFIxID0gc2F2YWdlX2luMzIoTUlVX0NPTlRST0xfUkVHLCBwYXIpOworCQlyZWctPk1NUFIyID0gc2F2YWdlX2luMzIoU1RSRUFNU19USU1FT1VUX1JFRywgcGFyKTsKKwkJcmVnLT5NTVBSMyA9IHNhdmFnZV9pbjMyKE1JU0NfVElNRU9VVF9SRUcsIHBhcik7CiAJfQogCi0JdmdhX291dDggKDB4M2Q0LCAweDNhLCBwYXIpOwotCXZnYV9vdXQ4ICgweDNkNSwgY3IzYSwgcGFyKTsKLQl2Z2Ffb3V0OCAoMHgzZDQsIDB4NjYsIHBhcik7Ci0JdmdhX291dDggKDB4M2Q1LCBjcjY2LCBwYXIpOworCXZnYV9vdXQ4KDB4M2Q0LCAweDNhLCBwYXIpOworCXZnYV9vdXQ4KDB4M2Q1LCBjcjNhLCBwYXIpOworCXZnYV9vdXQ4KDB4M2Q0LCAweDY2LCBwYXIpOworCXZnYV9vdXQ4KDB4M2Q1LCBjcjY2LCBwYXIpOworfQorCitzdGF0aWMgdm9pZCBzYXZhZ2Vfc2V0X2RlZmF1bHRfcGFyKHN0cnVjdCBzYXZhZ2VmYl9wYXIgKnBhciwKKwkJCQlzdHJ1Y3Qgc2F2YWdlX3JlZyAqcmVnKQoreworCXVuc2lnbmVkIGNoYXIgY3IzYSwgY3I1MywgY3I2NjsKKworCXZnYV9vdXQxNigweDNkNCwgMHg0ODM4LCBwYXIpOworCXZnYV9vdXQxNigweDNkNCwgMHhhMDM5LCBwYXIpOworCXZnYV9vdXQxNigweDNjNCwgMHgwNjA4LCBwYXIpOworCisJdmdhX291dDgoMHgzZDQsIDB4NjYsIHBhcik7CisJY3I2NiA9IHZnYV9pbjgoMHgzZDUsIHBhcik7CisJdmdhX291dDgoMHgzZDUsIGNyNjYgfCAweDgwLCBwYXIpOworCXZnYV9vdXQ4KDB4M2Q0LCAweDNhLCBwYXIpOworCWNyM2EgPSB2Z2FfaW44KDB4M2Q1LCBwYXIpOworCXZnYV9vdXQ4KDB4M2Q1LCBjcjNhIHwgMHg4MCwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNkNCwgMHg1MywgcGFyKTsKKwljcjUzID0gdmdhX2luOCgweDNkNSwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNkNSwgY3I1MyAmIDB4N2YsIHBhcik7CisKKwl2Z2Ffb3V0OCgweDNkNCwgMHg2NiwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNkNSwgY3I2NiwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNkNCwgMHgzYSwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNkNSwgY3IzYSwgcGFyKTsKKworCXZnYV9vdXQ4KDB4M2Q0LCAweDY2LCBwYXIpOworCXZnYV9vdXQ4KDB4M2Q1LCBjcjY2LCBwYXIpOworCXZnYV9vdXQ4KDB4M2Q0LCAweDNhLCBwYXIpOworCXZnYV9vdXQ4KDB4M2Q1LCBjcjNhLCBwYXIpOworCisJLyogdW5sb2NrIGV4dGVuZGVkIHNlcSByZWdzICovCisJdmdhX291dDgoMHgzYzQsIDB4MDgsIHBhcik7CisJdmdhX291dDgoMHgzYzUsIHJlZy0+U1IwOCwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNjNSwgMHgwNiwgcGFyKTsKKworCS8qIG5vdyByZXN0b3JlIGFsbCB0aGUgZXh0ZW5kZWQgcmVncyB3ZSBuZWVkICovCisJdmdhX291dDgoMHgzZDQsIDB4MzEsIHBhcik7CisJdmdhX291dDgoMHgzZDUsIHJlZy0+Q1IzMSwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNkNCwgMHgzMiwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNkNSwgcmVnLT5DUjMyLCBwYXIpOworCXZnYV9vdXQ4KDB4M2Q0LCAweDM0LCBwYXIpOworCXZnYV9vdXQ4KDB4M2Q1LCByZWctPkNSMzQsIHBhcik7CisJdmdhX291dDgoMHgzZDQsIDB4MzYsIHBhcik7CisJdmdhX291dDgoMHgzZDUscmVnLT5DUjM2LCBwYXIpOworCXZnYV9vdXQ4KDB4M2Q0LCAweDNhLCBwYXIpOworCXZnYV9vdXQ4KDB4M2Q1LCByZWctPkNSM0EsIHBhcik7CisJdmdhX291dDgoMHgzZDQsIDB4NDAsIHBhcik7CisJdmdhX291dDgoMHgzZDUsIHJlZy0+Q1I0MCwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNkNCwgMHg0MiwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNkNSwgcmVnLT5DUjQyLCBwYXIpOworCXZnYV9vdXQ4KDB4M2Q0LCAweDQ1LCBwYXIpOworCXZnYV9vdXQ4KDB4M2Q1LCByZWctPkNSNDUsIHBhcik7CisJdmdhX291dDgoMHgzZDQsIDB4NTAsIHBhcik7CisJdmdhX291dDgoMHgzZDUsIHJlZy0+Q1I1MCwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNkNCwgMHg1MSwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNkNSwgcmVnLT5DUjUxLCBwYXIpOworCXZnYV9vdXQ4KDB4M2Q0LCAweDUzLCBwYXIpOworCXZnYV9vdXQ4KDB4M2Q1LCByZWctPkNSNTMsIHBhcik7CisJdmdhX291dDgoMHgzZDQsIDB4NTgsIHBhcik7CisJdmdhX291dDgoMHgzZDUsIHJlZy0+Q1I1OCwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNkNCwgMHg2MCwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNkNSwgcmVnLT5DUjYwLCBwYXIpOworCXZnYV9vdXQ4KDB4M2Q0LCAweDY2LCBwYXIpOworCXZnYV9vdXQ4KDB4M2Q1LCByZWctPkNSNjYsIHBhcik7CisJdmdhX291dDgoMHgzZDQsIDB4NjcsIHBhcik7CisJdmdhX291dDgoMHgzZDUsIHJlZy0+Q1I2NywgcGFyKTsKKwl2Z2Ffb3V0OCgweDNkNCwgMHg2OCwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNkNSwgcmVnLT5DUjY4LCBwYXIpOworCXZnYV9vdXQ4KDB4M2Q0LCAweDY5LCBwYXIpOworCXZnYV9vdXQ4KDB4M2Q1LCByZWctPkNSNjksIHBhcik7CisJdmdhX291dDgoMHgzZDQsIDB4NmYsIHBhcik7CisJdmdhX291dDgoMHgzZDUsIHJlZy0+Q1I2RiwgcGFyKTsKKworCXZnYV9vdXQ4KDB4M2Q0LCAweDMzLCBwYXIpOworCXZnYV9vdXQ4KDB4M2Q1LCByZWctPkNSMzMsIHBhcik7CisJdmdhX291dDgoMHgzZDQsIDB4ODYsIHBhcik7CisJdmdhX291dDgoMHgzZDUsIHJlZy0+Q1I4NiwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNkNCwgMHg4OCwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNkNSwgcmVnLT5DUjg4LCBwYXIpOworCXZnYV9vdXQ4KDB4M2Q0LCAweDkwLCBwYXIpOworCXZnYV9vdXQ4KDB4M2Q1LCByZWctPkNSOTAsIHBhcik7CisJdmdhX291dDgoMHgzZDQsIDB4OTEsIHBhcik7CisJdmdhX291dDgoMHgzZDUsIHJlZy0+Q1I5MSwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNkNCwgMHhiMCwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNkNSwgcmVnLT5DUkIwLCBwYXIpOworCisJLyogZXh0ZW5kZWQgbW9kZSB0aW1pbmcgcmVncyAqLworCXZnYV9vdXQ4KDB4M2Q0LCAweDNiLCBwYXIpOworCXZnYV9vdXQ4KDB4M2Q1LCByZWctPkNSM0IsIHBhcik7CisJdmdhX291dDgoMHgzZDQsIDB4M2MsIHBhcik7CisJdmdhX291dDgoMHgzZDUsIHJlZy0+Q1IzQywgcGFyKTsKKwl2Z2Ffb3V0OCgweDNkNCwgMHg0MywgcGFyKTsKKwl2Z2Ffb3V0OCgweDNkNSwgcmVnLT5DUjQzLCBwYXIpOworCXZnYV9vdXQ4KDB4M2Q0LCAweDVkLCBwYXIpOworCXZnYV9vdXQ4KDB4M2Q1LCByZWctPkNSNUQsIHBhcik7CisJdmdhX291dDgoMHgzZDQsIDB4NWUsIHBhcik7CisJdmdhX291dDgoMHgzZDUsIHJlZy0+Q1I1RSwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNkNCwgMHg2NSwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNkNSwgcmVnLT5DUjY1LCBwYXIpOworCisJLyogc2F2ZSBzZXEgZXh0ZW5kZWQgcmVncyBmb3IgRENMSyBQTEwgcHJvZ3JhbW1pbmcgKi8KKwl2Z2Ffb3V0OCgweDNjNCwgMHgwZSwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNjNSwgcmVnLT5TUjBFLCBwYXIpOworCXZnYV9vdXQ4KDB4M2M0LCAweDBmLCBwYXIpOworCXZnYV9vdXQ4KDB4M2M1LCByZWctPlNSMEYsIHBhcik7CisJdmdhX291dDgoMHgzYzQsIDB4MTAsIHBhcik7CisJdmdhX291dDgoMHgzYzUsIHJlZy0+U1IxMCwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNjNCwgMHgxMSwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNjNSwgcmVnLT5TUjExLCBwYXIpOworCXZnYV9vdXQ4KDB4M2M0LCAweDEyLCBwYXIpOworCXZnYV9vdXQ4KDB4M2M1LCByZWctPlNSMTIsIHBhcik7CisJdmdhX291dDgoMHgzYzQsIDB4MTMsIHBhcik7CisJdmdhX291dDgoMHgzYzUsIHJlZy0+U1IxMywgcGFyKTsKKwl2Z2Ffb3V0OCgweDNjNCwgMHgyOSwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNjNSwgcmVnLT5TUjI5LCBwYXIpOworCisJdmdhX291dDgoMHgzYzQsIDB4MTUsIHBhcik7CisJdmdhX291dDgoMHgzYzUsIHJlZy0+U1IxNSwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNjNCwgMHgzMCwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNjNSwgcmVnLT5TUjMwLCBwYXIpOworCXZnYV9vdXQ4KDB4M2M0LCAweDE4LCBwYXIpOworCXZnYV9vdXQ4KDB4M2M1LCByZWctPlNSMTgsIHBhcik7CisKKwkvKiBTYXZlIGZsYXQgcGFuZWwgZXhwYW5zaW9uIHJlZ3N0ZXJzLiAqLworCWlmIChwYXItPmNoaXAgPT0gUzNfU0FWQUdFX01YKSB7CisJCWludCBpOworCisJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJCXZnYV9vdXQ4KDB4M2M0LCAweDU0K2ksIHBhcik7CisJCQl2Z2Ffb3V0OCgweDNjNSwgcmVnLT5TUjU0W2ldLCBwYXIpOworCQl9CisJfQorCisJdmdhX291dDgoMHgzZDQsIDB4NjYsIHBhcik7CisJY3I2NiA9IHZnYV9pbjgoMHgzZDUsIHBhcik7CisJdmdhX291dDgoMHgzZDUsIGNyNjYgfCAweDgwLCBwYXIpOworCXZnYV9vdXQ4KDB4M2Q0LCAweDNhLCBwYXIpOworCWNyM2EgPSB2Z2FfaW44KDB4M2Q1LCBwYXIpOworCXZnYV9vdXQ4KDB4M2Q1LCBjcjNhIHwgMHg4MCwgcGFyKTsKKworCS8qIG5vdyBzYXZlIE1JVSByZWdzICovCisJaWYgKHBhci0+Y2hpcCAhPSBTM19TQVZBR0VfTVgpIHsKKwkJc2F2YWdlX291dDMyKEZJRk9fQ09OVFJPTF9SRUcsIHJlZy0+TU1QUjAsIHBhcik7CisJCXNhdmFnZV9vdXQzMihNSVVfQ09OVFJPTF9SRUcsIHJlZy0+TU1QUjEsIHBhcik7CisJCXNhdmFnZV9vdXQzMihTVFJFQU1TX1RJTUVPVVRfUkVHLCByZWctPk1NUFIyLCBwYXIpOworCQlzYXZhZ2Vfb3V0MzIoTUlTQ19USU1FT1VUX1JFRywgcmVnLT5NTVBSMywgcGFyKTsKKwl9CisKKwl2Z2Ffb3V0OCgweDNkNCwgMHgzYSwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNkNSwgY3IzYSwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNkNCwgMHg2NiwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNkNSwgY3I2NiwgcGFyKTsKIH0KIAogc3RhdGljIHZvaWQgc2F2YWdlX3VwZGF0ZV92YXIoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsIHN0cnVjdCBmYl92aWRlb21vZGUgKm1vZGVkYikKQEAgLTY4Myw4ICs4NTMsOCBAQAogICAgICAgICB2YXItPnZtb2RlID0gbW9kZWRiLT52bW9kZTsKIH0KIAotc3RhdGljIGludCBzYXZhZ2VmYl9jaGVja192YXIgKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAgICp2YXIsCi0JCQkgICAgICAgc3RydWN0IGZiX2luZm8gKmluZm8pCitzdGF0aWMgaW50IHNhdmFnZWZiX2NoZWNrX3ZhcihzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gICAqdmFyLAorCQkJICAgICAgc3RydWN0IGZiX2luZm8gKmluZm8pCiB7CiAJc3RydWN0IHNhdmFnZWZiX3BhciAqcGFyID0gaW5mby0+cGFyOwogCWludCBtZW1sZW4sIHZyYW1sZW4sIG1vZGVfdmFsaWQgPSAwOwpAQCAtNzUwLDEwICs5MjAsMTAgQEAKIAlpZiAocGFyLT5TYXZhZ2VQYW5lbFdpZHRoICYmCiAJICAgICh2YXItPnhyZXMgPiBwYXItPlNhdmFnZVBhbmVsV2lkdGggfHwKIAkgICAgIHZhci0+eXJlcyA+IHBhci0+U2F2YWdlUGFuZWxIZWlnaHQpKSB7Ci0JCXByaW50ayAoS0VSTl9JTkZPICJNb2RlICglZHglZCkgbGFyZ2VyIHRoYW4gdGhlIExDRCBwYW5lbCAiCi0JCQkiKCVkeCVkKVxuIiwgdmFyLT54cmVzLCAgdmFyLT55cmVzLAotCQkJcGFyLT5TYXZhZ2VQYW5lbFdpZHRoLAotCQkJcGFyLT5TYXZhZ2VQYW5lbEhlaWdodCk7CisJCXByaW50ayhLRVJOX0lORk8gIk1vZGUgKCVkeCVkKSBsYXJnZXIgdGhhbiB0aGUgTENEIHBhbmVsICIKKwkJICAgICAgICIoJWR4JWQpXG4iLCB2YXItPnhyZXMsICB2YXItPnlyZXMsCisJCSAgICAgICBwYXItPlNhdmFnZVBhbmVsV2lkdGgsCisJCSAgICAgICBwYXItPlNhdmFnZVBhbmVsSGVpZ2h0KTsKIAkJcmV0dXJuIC0xOwogCX0KIApAQCAtNzg4LDggKzk1OCw5IEBACiB9CiAKIAotc3RhdGljIGludCBzYXZhZ2VmYl9kZWNvZGVfdmFyIChzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gICAqdmFyLAotCQkJCXN0cnVjdCBzYXZhZ2VmYl9wYXIgICAgICAgICpwYXIpCitzdGF0aWMgaW50IHNhdmFnZWZiX2RlY29kZV92YXIoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICAgKnZhciwKKwkJCSAgICAgICBzdHJ1Y3Qgc2F2YWdlZmJfcGFyICAgICAgICAqcGFyLAorCQkJICAgICAgIHN0cnVjdCBzYXZhZ2VfcmVnICAgICAgICAgICpyZWcpCiB7CiAJc3RydWN0IHh0aW1pbmdzIHRpbWluZ3M7CiAJaW50IHdpZHRoLCBkY2xrLCBpLCBqOyAvKiwgcmVmcmVzaDsgKi8KQEAgLTc5OSw3ICs5NzAsNyBAQAogCiAJREJHKCJzYXZhZ2VmYl9kZWNvZGVfdmFyIik7CiAKLQltZW1zZXQgKCZ0aW1pbmdzLCAwLCBzaXplb2YodGltaW5ncykpOworCW1lbXNldCgmdGltaW5ncywgMCwgc2l6ZW9mKHRpbWluZ3MpKTsKIAogCWlmICghcGl4Y2xvY2spIHBpeGNsb2NrID0gMTAwMDA7CS8qIDEwbnMgPSAxMDBNSHogKi8KIAl0aW1pbmdzLkNsb2NrID0gMTAwMDAwMDAwMCAvIHBpeGNsb2NrOwpAQCAtODMxLDM5ICsxMDAyLDM5IEBACiAJICogVGhpcyB3aWxsIGFsbG9jYXRlIHRoZSBkYXRhc3RydWN0dXJlIGFuZCBpbml0aWFsaXplIGFsbCBvZiB0aGUKIAkgKiBnZW5lcmljIFZHQSByZWdpc3RlcnMuCiAJICovCi0JdmdhSFdJbml0ICh2YXIsIHBhciwgJnRpbWluZ3MpOworCXZnYUhXSW5pdCh2YXIsIHBhciwgJnRpbWluZ3MsIHJlZyk7CiAKIAkvKiBXZSBuZWVkIHRvIHNldCBDUjY3IHdoZXRoZXIgb3Igbm90IHdlIHVzZSB0aGUgQklPUy4gKi8KIAogCWRjbGsgPSB0aW1pbmdzLkNsb2NrOwotCXBhci0+Q1I2NyA9IDB4MDA7CisJcmVnLT5DUjY3ID0gMHgwMDsKIAotCXN3aXRjaCggdmFyLT5iaXRzX3Blcl9waXhlbCApIHsKKwlzd2l0Y2godmFyLT5iaXRzX3Blcl9waXhlbCkgewogCWNhc2UgODoKLQkJaWYoIChwYXItPmNoaXAgPT0gUzNfU0FWQUdFMjAwMCkgJiYgKGRjbGsgPj0gMjMwMDAwKSApCi0JCQlwYXItPkNSNjcgPSAweDEwOwkvKiA4YnBwLCAyIHBpeGVscy9jbG9jayAqLworCQlpZiAoKHBhci0+Y2hpcCA9PSBTM19TQVZBR0UyMDAwKSAmJiAoZGNsayA+PSAyMzAwMDApKQorCQkJcmVnLT5DUjY3ID0gMHgxMDsJLyogOGJwcCwgMiBwaXhlbHMvY2xvY2sgKi8KIAkJZWxzZQotCQkJcGFyLT5DUjY3ID0gMHgwMDsJLyogOGJwcCwgMSBwaXhlbC9jbG9jayAqLworCQkJcmVnLT5DUjY3ID0gMHgwMDsJLyogOGJwcCwgMSBwaXhlbC9jbG9jayAqLwogCQlicmVhazsKIAljYXNlIDE1OgotCQlpZiAoIFMzX1NBVkFHRV9NT0JJTEVfU0VSSUVTKHBhci0+Y2hpcCkgfHwKLQkJICAgICAoKHBhci0+Y2hpcCA9PSBTM19TQVZBR0UyMDAwKSAmJiAoZGNsayA+PSAyMzAwMDApKSApCi0JCQlwYXItPkNSNjcgPSAweDMwOwkvKiAxNWJwcCwgMiBwaXhlbC9jbG9jayAqLworCQlpZiAoUzNfU0FWQUdFX01PQklMRV9TRVJJRVMocGFyLT5jaGlwKSB8fAorCQkgICAgKChwYXItPmNoaXAgPT0gUzNfU0FWQUdFMjAwMCkgJiYgKGRjbGsgPj0gMjMwMDAwKSkpCisJCQlyZWctPkNSNjcgPSAweDMwOwkvKiAxNWJwcCwgMiBwaXhlbC9jbG9jayAqLwogCQllbHNlCi0JCQlwYXItPkNSNjcgPSAweDIwOwkvKiAxNWJwcCwgMSBwaXhlbHMvY2xvY2sgKi8KKwkJCXJlZy0+Q1I2NyA9IDB4MjA7CS8qIDE1YnBwLCAxIHBpeGVscy9jbG9jayAqLwogCQlicmVhazsKIAljYXNlIDE2OgotCQlpZiggUzNfU0FWQUdFX01PQklMRV9TRVJJRVMocGFyLT5jaGlwKSB8fAotCQkgICAgKChwYXItPmNoaXAgPT0gUzNfU0FWQUdFMjAwMCkgJiYgKGRjbGsgPj0gMjMwMDAwKSkgKQotCQkJcGFyLT5DUjY3ID0gMHg1MDsJLyogMTZicHAsIDIgcGl4ZWwvY2xvY2sgKi8KKwkJaWYgKFMzX1NBVkFHRV9NT0JJTEVfU0VSSUVTKHBhci0+Y2hpcCkgfHwKKwkJICAgKChwYXItPmNoaXAgPT0gUzNfU0FWQUdFMjAwMCkgJiYgKGRjbGsgPj0gMjMwMDAwKSkpCisJCQlyZWctPkNSNjcgPSAweDUwOwkvKiAxNmJwcCwgMiBwaXhlbC9jbG9jayAqLwogCQllbHNlCi0JCQlwYXItPkNSNjcgPSAweDQwOwkvKiAxNmJwcCwgMSBwaXhlbHMvY2xvY2sgKi8KKwkJCXJlZy0+Q1I2NyA9IDB4NDA7CS8qIDE2YnBwLCAxIHBpeGVscy9jbG9jayAqLwogCQlicmVhazsKIAljYXNlIDI0OgotCQlwYXItPkNSNjcgPSAweDcwOworCQlyZWctPkNSNjcgPSAweDcwOwogCQlicmVhazsKIAljYXNlIDMyOgotCQlwYXItPkNSNjcgPSAweGQwOworCQlyZWctPkNSNjcgPSAweGQwOwogCQlicmVhazsKIAl9CiAKQEAgLTg3Miw2MSArMTA0Myw2MSBAQAogCSAqIG1hdGNoLiAgRmFsbCBiYWNrIHRvIHRyYWRpdGlvbmFsIHJlZ2lzdGVyLWNydW5jaGluZy4KIAkgKi8KIAotCXZnYV9vdXQ4ICgweDNkNCwgMHgzYSwgcGFyKTsKLQl0bXAgPSB2Z2FfaW44ICgweDNkNSwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNkNCwgMHgzYSwgcGFyKTsKKwl0bXAgPSB2Z2FfaW44KDB4M2Q1LCBwYXIpOwogCWlmICgxIC8qRklYTUU6cHNhdi0+cGNpX2J1cnN0Ki8pCi0JCXBhci0+Q1IzQSA9ICh0bXAgJiAweDdmKSB8IDB4MTU7CisJCXJlZy0+Q1IzQSA9ICh0bXAgJiAweDdmKSB8IDB4MTU7CiAJZWxzZQotCQlwYXItPkNSM0EgPSB0bXAgfCAweDk1OworCQlyZWctPkNSM0EgPSB0bXAgfCAweDk1OwogCi0JcGFyLT5DUjUzID0gMHgwMDsKLQlwYXItPkNSMzEgPSAweDhjOwotCXBhci0+Q1I2NiA9IDB4ODk7CisJcmVnLT5DUjUzID0gMHgwMDsKKwlyZWctPkNSMzEgPSAweDhjOworCXJlZy0+Q1I2NiA9IDB4ODk7CiAKLQl2Z2Ffb3V0OCAoMHgzZDQsIDB4NTgsIHBhcik7Ci0JcGFyLT5DUjU4ID0gdmdhX2luOCAoMHgzZDUsIHBhcikgJiAweDgwOwotCXBhci0+Q1I1OCB8PSAweDEzOworCXZnYV9vdXQ4KDB4M2Q0LCAweDU4LCBwYXIpOworCXJlZy0+Q1I1OCA9IHZnYV9pbjgoMHgzZDUsIHBhcikgJiAweDgwOworCXJlZy0+Q1I1OCB8PSAweDEzOwogCi0JcGFyLT5TUjE1ID0gMHgwMyB8IDB4ODA7Ci0JcGFyLT5TUjE4ID0gMHgwMDsKLQlwYXItPkNSNDMgPSBwYXItPkNSNDUgPSBwYXItPkNSNjUgPSAweDAwOworCXJlZy0+U1IxNSA9IDB4MDMgfCAweDgwOworCXJlZy0+U1IxOCA9IDB4MDA7CisJcmVnLT5DUjQzID0gcmVnLT5DUjQ1ID0gcmVnLT5DUjY1ID0gMHgwMDsKIAotCXZnYV9vdXQ4ICgweDNkNCwgMHg0MCwgcGFyKTsKLQlwYXItPkNSNDAgPSB2Z2FfaW44ICgweDNkNSwgcGFyKSAmIH4weDAxOworCXZnYV9vdXQ4KDB4M2Q0LCAweDQwLCBwYXIpOworCXJlZy0+Q1I0MCA9IHZnYV9pbjgoMHgzZDUsIHBhcikgJiB+MHgwMTsKIAotCXBhci0+TU1QUjAgPSAweDAxMDQwMDsKLQlwYXItPk1NUFIxID0gMHgwMDsKLQlwYXItPk1NUFIyID0gMHgwODA4OwotCXBhci0+TU1QUjMgPSAweDA4MDgwODEwOworCXJlZy0+TU1QUjAgPSAweDAxMDQwMDsKKwlyZWctPk1NUFIxID0gMHgwMDsKKwlyZWctPk1NUFIyID0gMHgwODA4OworCXJlZy0+TU1QUjMgPSAweDA4MDgwODEwOwogCi0JU2F2YWdlQ2FsY0Nsb2NrIChkY2xrLCAxLCAxLCAxMjcsIDAsIDQsIDE4MDAwMCwgMzYwMDAwLCAmbSwgJm4sICZyKTsKKwlTYXZhZ2VDYWxjQ2xvY2soZGNsaywgMSwgMSwgMTI3LCAwLCA0LCAxODAwMDAsIDM2MDAwMCwgJm0sICZuLCAmcik7CiAJLyogbSA9IDEwNzsgbiA9IDQ7IHIgPSAyOyAqLwogCiAJaWYgKHBhci0+TUNMSyA8PSAwKSB7Ci0JCXBhci0+U1IxMCA9IDI1NTsKLQkJcGFyLT5TUjExID0gMjU1OworCQlyZWctPlNSMTAgPSAyNTU7CisJCXJlZy0+U1IxMSA9IDI1NTsKIAl9IGVsc2UgewotCQljb21tb25fY2FsY19jbG9jayAocGFyLT5NQ0xLLCAxLCAxLCAzMSwgMCwgMywgMTM1MDAwLCAyNzAwMDAsCi0JCQkJICAgJnBhci0+U1IxMSwgJnBhci0+U1IxMCk7Ci0JCS8qICAgICAgcGFyLT5TUjEwID0gODA7IC8vIE1DTEsgPT0gMjg2MDAwICovCi0JCS8qICAgICAgcGFyLT5TUjExID0gMTI1OyAqLworCQljb21tb25fY2FsY19jbG9jayhwYXItPk1DTEssIDEsIDEsIDMxLCAwLCAzLCAxMzUwMDAsIDI3MDAwMCwKKwkJCQkgICAmcmVnLT5TUjExLCAmcmVnLT5TUjEwKTsKKwkJLyogICAgICByZWctPlNSMTAgPSA4MDsgLy8gTUNMSyA9PSAyODYwMDAgKi8KKwkJLyogICAgICByZWctPlNSMTEgPSAxMjU7ICovCiAJfQogCi0JcGFyLT5TUjEyID0gKHIgPDwgNikgfCAobiAmIDB4M2YpOwotCXBhci0+U1IxMyA9IG0gJiAweGZmOwotCXBhci0+U1IyOSA9IChyICYgNCkgfCAobSAmIDB4MTAwKSA+PiA1IHwgKG4gJiAweDQwKSA+PiAyOworCXJlZy0+U1IxMiA9IChyIDw8IDYpIHwgKG4gJiAweDNmKTsKKwlyZWctPlNSMTMgPSBtICYgMHhmZjsKKwlyZWctPlNSMjkgPSAociAmIDQpIHwgKG0gJiAweDEwMCkgPj4gNSB8IChuICYgMHg0MCkgPj4gMjsKIAogCWlmICh2YXItPmJpdHNfcGVyX3BpeGVsIDwgMjQpCi0JCXBhci0+TU1QUjAgLT0gMHg4MDAwOworCQlyZWctPk1NUFIwIC09IDB4ODAwMDsKIAllbHNlCi0JCXBhci0+TU1QUjAgLT0gMHg0MDAwOworCQlyZWctPk1NUFIwIC09IDB4NDAwMDsKIAogCWlmICh0aW1pbmdzLmludGVybGFjZWQpCi0JCXBhci0+Q1I0MiA9IDB4MjA7CisJCXJlZy0+Q1I0MiA9IDB4MjA7CiAJZWxzZQotCQlwYXItPkNSNDIgPSAweDAwOworCQlyZWctPkNSNDIgPSAweDAwOwogCi0JcGFyLT5DUjM0ID0gMHgxMDsgLyogZGlzcGxheSBmaWZvICovCisJcmVnLT5DUjM0ID0gMHgxMDsgLyogZGlzcGxheSBmaWZvICovCiAKIAlpID0gKCgoKHRpbWluZ3MuSFRvdGFsID4+IDMpIC0gNSkgJiAweDEwMCkgPj4gOCkgfAogCQkoKCgodGltaW5ncy5IRGlzcGxheSA+PiAzKSAtIDEpICYgMHgxMDApID4+IDcpIHwKQEAgLTkzOCw3NyArMTEwOSw3NyBAQAogCWlmICgodGltaW5ncy5IU3luY0VuZCA+PiAzKSAtICh0aW1pbmdzLkhTeW5jU3RhcnQgPj4gMykgPiAzMikKIAkJaSB8PSAweDIwOwogCi0JaiA9IChwYXItPkNSVENbMF0gKyAoKGkgJiAweDAxKSA8PCA4KSArCi0JICAgICBwYXItPkNSVENbNF0gKyAoKGkgJiAweDEwKSA8PCA0KSArIDEpIC8gMjsKKwlqID0gKHJlZy0+Q1JUQ1swXSArICgoaSAmIDB4MDEpIDw8IDgpICsKKwkgICAgIHJlZy0+Q1JUQ1s0XSArICgoaSAmIDB4MTApIDw8IDQpICsgMSkgLyAyOwogCi0JaWYgKGogLSAocGFyLT5DUlRDWzRdICsgKChpICYgMHgxMCkgPDwgNCkpIDwgNCkgewotCQlpZiAocGFyLT5DUlRDWzRdICsgKChpICYgMHgxMCkgPDwgNCkgKyA0IDw9Ci0JCSAgICBwYXItPkNSVENbMF0gKyAoKGkgJiAweDAxKSA8PCA4KSkKLQkJCWogPSBwYXItPkNSVENbNF0gKyAoKGkgJiAweDEwKSA8PCA0KSArIDQ7CisJaWYgKGogLSAocmVnLT5DUlRDWzRdICsgKChpICYgMHgxMCkgPDwgNCkpIDwgNCkgeworCQlpZiAocmVnLT5DUlRDWzRdICsgKChpICYgMHgxMCkgPDwgNCkgKyA0IDw9CisJCSAgICByZWctPkNSVENbMF0gKyAoKGkgJiAweDAxKSA8PCA4KSkKKwkJCWogPSByZWctPkNSVENbNF0gKyAoKGkgJiAweDEwKSA8PCA0KSArIDQ7CiAJCWVsc2UKLQkJCWogPSBwYXItPkNSVENbMF0gKyAoKGkgJiAweDAxKSA8PCA4KSArIDE7CisJCQlqID0gcmVnLT5DUlRDWzBdICsgKChpICYgMHgwMSkgPDwgOCkgKyAxOwogCX0KIAotCXBhci0+Q1IzQiA9IGogJiAweGZmOworCXJlZy0+Q1IzQiA9IGogJiAweGZmOwogCWkgfD0gKGogJiAweDEwMCkgPj4gMjsKLQlwYXItPkNSM0MgPSAocGFyLT5DUlRDWzBdICsgKChpICYgMHgwMSkgPDwgOCkpIC8gMjsKLQlwYXItPkNSNUQgPSBpOwotCXBhci0+Q1I1RSA9ICgoKHRpbWluZ3MuVlRvdGFsIC0gMikgJiAweDQwMCkgPj4gMTApIHwKKwlyZWctPkNSM0MgPSAocmVnLT5DUlRDWzBdICsgKChpICYgMHgwMSkgPDwgOCkpIC8gMjsKKwlyZWctPkNSNUQgPSBpOworCXJlZy0+Q1I1RSA9ICgoKHRpbWluZ3MuVlRvdGFsIC0gMikgJiAweDQwMCkgPj4gMTApIHwKIAkJKCgodGltaW5ncy5WRGlzcGxheSAtIDEpICYgMHg0MDApID4+IDkpIHwKIAkJKCgodGltaW5ncy5WU3luY1N0YXJ0KSAmIDB4NDAwKSA+PiA4KSB8CiAJCSgoKHRpbWluZ3MuVlN5bmNTdGFydCkgJiAweDQwMCkgPj4gNikgfCAweDQwOwogCXdpZHRoID0gKHZhci0+eHJlc192aXJ0dWFsICogKCh2YXItPmJpdHNfcGVyX3BpeGVsKzcpIC8gOCkpID4+IDM7Ci0JcGFyLT5DUjkxID0gcGFyLT5DUlRDWzE5XSA9IDB4ZmYgJiB3aWR0aDsKLQlwYXItPkNSNTEgPSAoMHgzMDAgJiB3aWR0aCkgPj4gNDsKLQlwYXItPkNSOTAgPSAweDgwIHwgKHdpZHRoID4+IDgpOwotCXBhci0+TWlzY091dFJlZyB8PSAweDBjOworCXJlZy0+Q1I5MSA9IHJlZy0+Q1JUQ1sxOV0gPSAweGZmICYgd2lkdGg7CisJcmVnLT5DUjUxID0gKDB4MzAwICYgd2lkdGgpID4+IDQ7CisJcmVnLT5DUjkwID0gMHg4MCB8ICh3aWR0aCA+PiA4KTsKKwlyZWctPk1pc2NPdXRSZWcgfD0gMHgwYzsKIAogCS8qIFNldCBmcmFtZSBidWZmZXIgZGVzY3JpcHRpb24uICovCiAKIAlpZiAodmFyLT5iaXRzX3Blcl9waXhlbCA8PSA4KQotCQlwYXItPkNSNTAgPSAwOworCQlyZWctPkNSNTAgPSAwOwogCWVsc2UgaWYgKHZhci0+Yml0c19wZXJfcGl4ZWwgPD0gMTYpCi0JCXBhci0+Q1I1MCA9IDB4MTA7CisJCXJlZy0+Q1I1MCA9IDB4MTA7CiAJZWxzZQotCQlwYXItPkNSNTAgPSAweDMwOworCQlyZWctPkNSNTAgPSAweDMwOwogCiAJaWYgKHZhci0+eHJlc192aXJ0dWFsIDw9IDY0MCkKLQkJcGFyLT5DUjUwIHw9IDB4NDA7CisJCXJlZy0+Q1I1MCB8PSAweDQwOwogCWVsc2UgaWYgKHZhci0+eHJlc192aXJ0dWFsID09IDgwMCkKLQkJcGFyLT5DUjUwIHw9IDB4ODA7CisJCXJlZy0+Q1I1MCB8PSAweDgwOwogCWVsc2UgaWYgKHZhci0+eHJlc192aXJ0dWFsID09IDEwMjQpCi0JCXBhci0+Q1I1MCB8PSAweDAwOworCQlyZWctPkNSNTAgfD0gMHgwMDsKIAllbHNlIGlmICh2YXItPnhyZXNfdmlydHVhbCA9PSAxMTUyKQotCQlwYXItPkNSNTAgfD0gMHgwMTsKKwkJcmVnLT5DUjUwIHw9IDB4MDE7CiAJZWxzZSBpZiAodmFyLT54cmVzX3ZpcnR1YWwgPT0gMTI4MCkKLQkJcGFyLT5DUjUwIHw9IDB4YzA7CisJCXJlZy0+Q1I1MCB8PSAweGMwOwogCWVsc2UgaWYgKHZhci0+eHJlc192aXJ0dWFsID09IDE2MDApCi0JCXBhci0+Q1I1MCB8PSAweDgxOworCQlyZWctPkNSNTAgfD0gMHg4MTsKIAllbHNlCi0JCXBhci0+Q1I1MCB8PSAweGMxOwkvKiBVc2UgR0JEICovCisJCXJlZy0+Q1I1MCB8PSAweGMxOwkvKiBVc2UgR0JEICovCiAKLQlpZiggcGFyLT5jaGlwID09IFMzX1NBVkFHRTIwMDAgKQotCQlwYXItPkNSMzMgPSAweDA4OworCWlmIChwYXItPmNoaXAgPT0gUzNfU0FWQUdFMjAwMCkKKwkJcmVnLT5DUjMzID0gMHgwODsKIAllbHNlCi0JCXBhci0+Q1IzMyA9IDB4MjA7CisJCXJlZy0+Q1IzMyA9IDB4MjA7CiAKLQlwYXItPkNSVENbMHgxN10gPSAweGViOworCXJlZy0+Q1JUQ1sweDE3XSA9IDB4ZWI7CiAKLQlwYXItPkNSNjcgfD0gMTsKKwlyZWctPkNSNjcgfD0gMTsKIAogCXZnYV9vdXQ4KDB4M2Q0LCAweDM2LCBwYXIpOwotCXBhci0+Q1IzNiA9IHZnYV9pbjggKDB4M2Q1LCBwYXIpOwotCXZnYV9vdXQ4ICgweDNkNCwgMHg2OCwgcGFyKTsKLQlwYXItPkNSNjggPSB2Z2FfaW44ICgweDNkNSwgcGFyKTsKLQlwYXItPkNSNjkgPSAwOwotCXZnYV9vdXQ4ICgweDNkNCwgMHg2ZiwgcGFyKTsKLQlwYXItPkNSNkYgPSB2Z2FfaW44ICgweDNkNSwgcGFyKTsKLQl2Z2Ffb3V0OCAoMHgzZDQsIDB4ODYsIHBhcik7Ci0JcGFyLT5DUjg2ID0gdmdhX2luOCAoMHgzZDUsIHBhcik7Ci0JdmdhX291dDggKDB4M2Q0LCAweDg4LCBwYXIpOwotCXBhci0+Q1I4OCA9IHZnYV9pbjggKDB4M2Q1LCBwYXIpIHwgMHgwODsKLQl2Z2Ffb3V0OCAoMHgzZDQsIDB4YjAsIHBhcik7Ci0JcGFyLT5DUkIwID0gdmdhX2luOCAoMHgzZDUsIHBhcikgfCAweDgwOworCXJlZy0+Q1IzNiA9IHZnYV9pbjgoMHgzZDUsIHBhcik7CisJdmdhX291dDgoMHgzZDQsIDB4NjgsIHBhcik7CisJcmVnLT5DUjY4ID0gdmdhX2luOCgweDNkNSwgcGFyKTsKKwlyZWctPkNSNjkgPSAwOworCXZnYV9vdXQ4KDB4M2Q0LCAweDZmLCBwYXIpOworCXJlZy0+Q1I2RiA9IHZnYV9pbjgoMHgzZDUsIHBhcik7CisJdmdhX291dDgoMHgzZDQsIDB4ODYsIHBhcik7CisJcmVnLT5DUjg2ID0gdmdhX2luOCgweDNkNSwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNkNCwgMHg4OCwgcGFyKTsKKwlyZWctPkNSODggPSB2Z2FfaW44KDB4M2Q1LCBwYXIpIHwgMHgwODsKKwl2Z2Ffb3V0OCgweDNkNCwgMHhiMCwgcGFyKTsKKwlyZWctPkNSQjAgPSB2Z2FfaW44KDB4M2Q1LCBwYXIpIHwgMHg4MDsKIAogCXJldHVybiAwOwogfQpAQCAtMTAzNywxMSArMTIwOCwxMSBAQAogCiAJc3dpdGNoIChpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwpIHsKIAljYXNlIDg6Ci0JCXZnYV9vdXQ4ICgweDNjOCwgcmVnbm8sIHBhcik7CisJCXZnYV9vdXQ4KDB4M2M4LCByZWdubywgcGFyKTsKIAotCQl2Z2Ffb3V0OCAoMHgzYzksIHJlZCAgID4+IDEwLCBwYXIpOwotCQl2Z2Ffb3V0OCAoMHgzYzksIGdyZWVuID4+IDEwLCBwYXIpOwotCQl2Z2Ffb3V0OCAoMHgzYzksIGJsdWUgID4+IDEwLCBwYXIpOworCQl2Z2Ffb3V0OCgweDNjOSwgcmVkICAgPj4gMTAsIHBhcik7CisJCXZnYV9vdXQ4KDB4M2M5LCBncmVlbiA+PiAxMCwgcGFyKTsKKwkJdmdhX291dDgoMHgzYzksIGJsdWUgID4+IDEwLCBwYXIpOwogCQlicmVhazsKIAogCWNhc2UgMTY6CkBAIC0xMDc1LDIxICsxMjQ2LDIxIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHNhdmFnZWZiX3NldF9wYXJfaW50IChzdHJ1Y3Qgc2F2YWdlZmJfcGFyICAqcGFyKQorc3RhdGljIHZvaWQgc2F2YWdlZmJfc2V0X3Bhcl9pbnQoc3RydWN0IHNhdmFnZWZiX3BhciAgKnBhciwgc3RydWN0IHNhdmFnZV9yZWcgKnJlZykKIHsKIAl1bnNpZ25lZCBjaGFyIHRtcCwgY3IzYSwgY3I2NiwgY3I2NzsKIAotCURCRyAoInNhdmFnZWZiX3NldF9wYXJfaW50Iik7CisJREJHKCJzYXZhZ2VmYl9zZXRfcGFyX2ludCIpOwogCi0JcGFyLT5TYXZhZ2VXYWl0SWRsZSAocGFyKTsKKwlwYXItPlNhdmFnZVdhaXRJZGxlKHBhcik7CiAKLQl2Z2Ffb3V0OCAoMHgzYzIsIDB4MjMsIHBhcik7CisJdmdhX291dDgoMHgzYzIsIDB4MjMsIHBhcik7CiAKLQl2Z2Ffb3V0MTYgKDB4M2Q0LCAweDQ4MzgsIHBhcik7Ci0JdmdhX291dDE2ICgweDNkNCwgMHhhNTM5LCBwYXIpOwotCXZnYV9vdXQxNiAoMHgzYzQsIDB4MDYwOCwgcGFyKTsKKwl2Z2Ffb3V0MTYoMHgzZDQsIDB4NDgzOCwgcGFyKTsKKwl2Z2Ffb3V0MTYoMHgzZDQsIDB4YTUzOSwgcGFyKTsKKwl2Z2Ffb3V0MTYoMHgzYzQsIDB4MDYwOCwgcGFyKTsKIAotCXZnYUhXUHJvdGVjdCAocGFyLCAxKTsKKwl2Z2FIV1Byb3RlY3QocGFyLCAxKTsKIAogCS8qCiAJICogU29tZSBTYXZhZ2UvTVggYW5kIC9JWCBzeXN0ZW1zIGdvIG51dHMgd2hlbiB0cnlpbmcgdG8gZXhpdCB0aGUKQEAgLTEwOTksMjAzICsxMjcwLDIwMiBAQAogCSAqLwogCiAJVmVydGljYWxSZXRyYWNlV2FpdChwYXIpOwotCXZnYV9vdXQ4ICgweDNkNCwgMHg2NywgcGFyKTsKLQljcjY3ID0gdmdhX2luOCAoMHgzZDUsIHBhcik7Ci0JdmdhX291dDggKDB4M2Q1LCBjcjY3LypwYXItPkNSNjcqLyAmIH4weDBjLCBwYXIpOyAvKiBubyBTVFJFQU1TIHlldCAqLworCXZnYV9vdXQ4KDB4M2Q0LCAweDY3LCBwYXIpOworCWNyNjcgPSB2Z2FfaW44KDB4M2Q1LCBwYXIpOworCXZnYV9vdXQ4KDB4M2Q1LCBjcjY3LypwYXItPkNSNjcqLyAmIH4weDBjLCBwYXIpOyAvKiBubyBTVFJFQU1TIHlldCAqLwogCi0JdmdhX291dDggKDB4M2Q0LCAweDIzLCBwYXIpOwotCXZnYV9vdXQ4ICgweDNkNSwgMHgwMCwgcGFyKTsKLQl2Z2Ffb3V0OCAoMHgzZDQsIDB4MjYsIHBhcik7Ci0JdmdhX291dDggKDB4M2Q1LCAweDAwLCBwYXIpOworCXZnYV9vdXQ4KDB4M2Q0LCAweDIzLCBwYXIpOworCXZnYV9vdXQ4KDB4M2Q1LCAweDAwLCBwYXIpOworCXZnYV9vdXQ4KDB4M2Q0LCAweDI2LCBwYXIpOworCXZnYV9vdXQ4KDB4M2Q1LCAweDAwLCBwYXIpOwogCiAJLyogcmVzdG9yZSBleHRlbmRlZCByZWdzICovCi0JdmdhX291dDggKDB4M2Q0LCAweDY2LCBwYXIpOwotCXZnYV9vdXQ4ICgweDNkNSwgcGFyLT5DUjY2LCBwYXIpOwotCXZnYV9vdXQ4ICgweDNkNCwgMHgzYSwgcGFyKTsKLQl2Z2Ffb3V0OCAoMHgzZDUsIHBhci0+Q1IzQSwgcGFyKTsKLQl2Z2Ffb3V0OCAoMHgzZDQsIDB4MzEsIHBhcik7Ci0JdmdhX291dDggKDB4M2Q1LCBwYXItPkNSMzEsIHBhcik7Ci0JdmdhX291dDggKDB4M2Q0LCAweDMyLCBwYXIpOwotCXZnYV9vdXQ4ICgweDNkNSwgcGFyLT5DUjMyLCBwYXIpOwotCXZnYV9vdXQ4ICgweDNkNCwgMHg1OCwgcGFyKTsKLQl2Z2Ffb3V0OCAoMHgzZDUsIHBhci0+Q1I1OCwgcGFyKTsKLQl2Z2Ffb3V0OCAoMHgzZDQsIDB4NTMsIHBhcik7Ci0JdmdhX291dDggKDB4M2Q1LCBwYXItPkNSNTMgJiAweDdmLCBwYXIpOworCXZnYV9vdXQ4KDB4M2Q0LCAweDY2LCBwYXIpOworCXZnYV9vdXQ4KDB4M2Q1LCByZWctPkNSNjYsIHBhcik7CisJdmdhX291dDgoMHgzZDQsIDB4M2EsIHBhcik7CisJdmdhX291dDgoMHgzZDUsIHJlZy0+Q1IzQSwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNkNCwgMHgzMSwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNkNSwgcmVnLT5DUjMxLCBwYXIpOworCXZnYV9vdXQ4KDB4M2Q0LCAweDMyLCBwYXIpOworCXZnYV9vdXQ4KDB4M2Q1LCByZWctPkNSMzIsIHBhcik7CisJdmdhX291dDgoMHgzZDQsIDB4NTgsIHBhcik7CisJdmdhX291dDgoMHgzZDUsIHJlZy0+Q1I1OCwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNkNCwgMHg1MywgcGFyKTsKKwl2Z2Ffb3V0OCgweDNkNSwgcmVnLT5DUjUzICYgMHg3ZiwgcGFyKTsKIAotCXZnYV9vdXQxNiAoMHgzYzQsIDB4MDYwOCwgcGFyKTsKKwl2Z2Ffb3V0MTYoMHgzYzQsIDB4MDYwOCwgcGFyKTsKIAogCS8qIFJlc3RvcmUgRENMSyByZWdpc3RlcnMuICovCiAKLQl2Z2Ffb3V0OCAoMHgzYzQsIDB4MGUsIHBhcik7Ci0JdmdhX291dDggKDB4M2M1LCBwYXItPlNSMEUsIHBhcik7Ci0JdmdhX291dDggKDB4M2M0LCAweDBmLCBwYXIpOwotCXZnYV9vdXQ4ICgweDNjNSwgcGFyLT5TUjBGLCBwYXIpOwotCXZnYV9vdXQ4ICgweDNjNCwgMHgyOSwgcGFyKTsKLQl2Z2Ffb3V0OCAoMHgzYzUsIHBhci0+U1IyOSwgcGFyKTsKLQl2Z2Ffb3V0OCAoMHgzYzQsIDB4MTUsIHBhcik7Ci0JdmdhX291dDggKDB4M2M1LCBwYXItPlNSMTUsIHBhcik7CisJdmdhX291dDgoMHgzYzQsIDB4MGUsIHBhcik7CisJdmdhX291dDgoMHgzYzUsIHJlZy0+U1IwRSwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNjNCwgMHgwZiwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNjNSwgcmVnLT5TUjBGLCBwYXIpOworCXZnYV9vdXQ4KDB4M2M0LCAweDI5LCBwYXIpOworCXZnYV9vdXQ4KDB4M2M1LCByZWctPlNSMjksIHBhcik7CisJdmdhX291dDgoMHgzYzQsIDB4MTUsIHBhcik7CisJdmdhX291dDgoMHgzYzUsIHJlZy0+U1IxNSwgcGFyKTsKIAogCS8qIFJlc3RvcmUgZmxhdCBwYW5lbCBleHBhbnNpb24gcmVnc3RlcnMuICovCi0JaWYoIHBhci0+Y2hpcCA9PSBTM19TQVZBR0VfTVggKSB7CisJaWYgKHBhci0+Y2hpcCA9PSBTM19TQVZBR0VfTVgpIHsKIAkJaW50IGk7CiAKLQkJZm9yKCBpID0gMDsgaSA8IDg7IGkrKyApIHsKLQkJCXZnYV9vdXQ4ICgweDNjNCwgMHg1NCtpLCBwYXIpOwotCQkJdmdhX291dDggKDB4M2M1LCBwYXItPlNSNTRbaV0sIHBhcik7CisJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJCXZnYV9vdXQ4KDB4M2M0LCAweDU0K2ksIHBhcik7CisJCQl2Z2Ffb3V0OCgweDNjNSwgcmVnLT5TUjU0W2ldLCBwYXIpOwogCQl9CiAJfQogCi0JdmdhSFdSZXN0b3JlIChwYXIpOworCXZnYUhXUmVzdG9yZSAocGFyLCByZWcpOwogCiAJLyogZXh0ZW5kZWQgbW9kZSB0aW1pbmcgcmVnaXN0ZXJzICovCi0JdmdhX291dDggKDB4M2Q0LCAweDUzLCBwYXIpOwotCXZnYV9vdXQ4ICgweDNkNSwgcGFyLT5DUjUzLCBwYXIpOwotCXZnYV9vdXQ4ICgweDNkNCwgMHg1ZCwgcGFyKTsKLQl2Z2Ffb3V0OCAoMHgzZDUsIHBhci0+Q1I1RCwgcGFyKTsKLQl2Z2Ffb3V0OCAoMHgzZDQsIDB4NWUsIHBhcik7Ci0JdmdhX291dDggKDB4M2Q1LCBwYXItPkNSNUUsIHBhcik7Ci0JdmdhX291dDggKDB4M2Q0LCAweDNiLCBwYXIpOwotCXZnYV9vdXQ4ICgweDNkNSwgcGFyLT5DUjNCLCBwYXIpOwotCXZnYV9vdXQ4ICgweDNkNCwgMHgzYywgcGFyKTsKLQl2Z2Ffb3V0OCAoMHgzZDUsIHBhci0+Q1IzQywgcGFyKTsKLQl2Z2Ffb3V0OCAoMHgzZDQsIDB4NDMsIHBhcik7Ci0JdmdhX291dDggKDB4M2Q1LCBwYXItPkNSNDMsIHBhcik7Ci0JdmdhX291dDggKDB4M2Q0LCAweDY1LCBwYXIpOwotCXZnYV9vdXQ4ICgweDNkNSwgcGFyLT5DUjY1LCBwYXIpOworCXZnYV9vdXQ4KDB4M2Q0LCAweDUzLCBwYXIpOworCXZnYV9vdXQ4KDB4M2Q1LCByZWctPkNSNTMsIHBhcik7CisJdmdhX291dDgoMHgzZDQsIDB4NWQsIHBhcik7CisJdmdhX291dDgoMHgzZDUsIHJlZy0+Q1I1RCwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNkNCwgMHg1ZSwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNkNSwgcmVnLT5DUjVFLCBwYXIpOworCXZnYV9vdXQ4KDB4M2Q0LCAweDNiLCBwYXIpOworCXZnYV9vdXQ4KDB4M2Q1LCByZWctPkNSM0IsIHBhcik7CisJdmdhX291dDgoMHgzZDQsIDB4M2MsIHBhcik7CisJdmdhX291dDgoMHgzZDUsIHJlZy0+Q1IzQywgcGFyKTsKKwl2Z2Ffb3V0OCgweDNkNCwgMHg0MywgcGFyKTsKKwl2Z2Ffb3V0OCgweDNkNSwgcmVnLT5DUjQzLCBwYXIpOworCXZnYV9vdXQ4KDB4M2Q0LCAweDY1LCBwYXIpOworCXZnYV9vdXQ4KDB4M2Q1LCByZWctPkNSNjUsIHBhcik7CiAKIAkvKiByZXN0b3JlIHRoZSBkZXNpcmVkIHZpZGVvIG1vZGUgd2l0aCBjcjY3ICovCi0JdmdhX291dDggKDB4M2Q0LCAweDY3LCBwYXIpOworCXZnYV9vdXQ4KDB4M2Q0LCAweDY3LCBwYXIpOwogCS8qIGZvbGxvd2luZyBwYXJ0IG5vdCBwcmVzZW50IGluIFgxMSBkcml2ZXIgKi8KLQljcjY3ID0gdmdhX2luOCAoMHgzZDUsIHBhcikgJiAweGY7Ci0JdmdhX291dDggKDB4M2Q1LCAweDUwIHwgY3I2NywgcGFyKTsKLQl1ZGVsYXkgKDEwMDAwKTsKLQl2Z2Ffb3V0OCAoMHgzZDQsIDB4NjcsIHBhcik7CisJY3I2NyA9IHZnYV9pbjgoMHgzZDUsIHBhcikgJiAweGY7CisJdmdhX291dDgoMHgzZDUsIDB4NTAgfCBjcjY3LCBwYXIpOworCXVkZWxheSgxMDAwMCk7CisJdmdhX291dDgoMHgzZDQsIDB4NjcsIHBhcik7CiAJLyogZW5kIG9mIHBhcnQgKi8KLQl2Z2Ffb3V0OCAoMHgzZDUsIHBhci0+Q1I2NyAmIH4weDBjLCBwYXIpOworCXZnYV9vdXQ4KDB4M2Q1LCByZWctPkNSNjcgJiB+MHgwYywgcGFyKTsKIAogCS8qIG90aGVyIG1vZGUgdGltaW5nIGFuZCBleHRlbmRlZCByZWdzICovCi0JdmdhX291dDggKDB4M2Q0LCAweDM0LCBwYXIpOwotCXZnYV9vdXQ4ICgweDNkNSwgcGFyLT5DUjM0LCBwYXIpOwotCXZnYV9vdXQ4ICgweDNkNCwgMHg0MCwgcGFyKTsKLQl2Z2Ffb3V0OCAoMHgzZDUsIHBhci0+Q1I0MCwgcGFyKTsKLQl2Z2Ffb3V0OCAoMHgzZDQsIDB4NDIsIHBhcik7Ci0JdmdhX291dDggKDB4M2Q1LCBwYXItPkNSNDIsIHBhcik7Ci0JdmdhX291dDggKDB4M2Q0LCAweDQ1LCBwYXIpOwotCXZnYV9vdXQ4ICgweDNkNSwgcGFyLT5DUjQ1LCBwYXIpOwotCXZnYV9vdXQ4ICgweDNkNCwgMHg1MCwgcGFyKTsKLQl2Z2Ffb3V0OCAoMHgzZDUsIHBhci0+Q1I1MCwgcGFyKTsKLQl2Z2Ffb3V0OCAoMHgzZDQsIDB4NTEsIHBhcik7Ci0JdmdhX291dDggKDB4M2Q1LCBwYXItPkNSNTEsIHBhcik7CisJdmdhX291dDgoMHgzZDQsIDB4MzQsIHBhcik7CisJdmdhX291dDgoMHgzZDUsIHJlZy0+Q1IzNCwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNkNCwgMHg0MCwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNkNSwgcmVnLT5DUjQwLCBwYXIpOworCXZnYV9vdXQ4KDB4M2Q0LCAweDQyLCBwYXIpOworCXZnYV9vdXQ4KDB4M2Q1LCByZWctPkNSNDIsIHBhcik7CisJdmdhX291dDgoMHgzZDQsIDB4NDUsIHBhcik7CisJdmdhX291dDgoMHgzZDUsIHJlZy0+Q1I0NSwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNkNCwgMHg1MCwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNkNSwgcmVnLT5DUjUwLCBwYXIpOworCXZnYV9vdXQ4KDB4M2Q0LCAweDUxLCBwYXIpOworCXZnYV9vdXQ4KDB4M2Q1LCByZWctPkNSNTEsIHBhcik7CiAKIAkvKiBtZW1vcnkgdGltaW5ncyAqLwotCXZnYV9vdXQ4ICgweDNkNCwgMHgzNiwgcGFyKTsKLQl2Z2Ffb3V0OCAoMHgzZDUsIHBhci0+Q1IzNiwgcGFyKTsKLQl2Z2Ffb3V0OCAoMHgzZDQsIDB4NjAsIHBhcik7Ci0JdmdhX291dDggKDB4M2Q1LCBwYXItPkNSNjAsIHBhcik7Ci0JdmdhX291dDggKDB4M2Q0LCAweDY4LCBwYXIpOwotCXZnYV9vdXQ4ICgweDNkNSwgcGFyLT5DUjY4LCBwYXIpOwotCXZnYV9vdXQ4ICgweDNkNCwgMHg2OSwgcGFyKTsKLQl2Z2Ffb3V0OCAoMHgzZDUsIHBhci0+Q1I2OSwgcGFyKTsKLQl2Z2Ffb3V0OCAoMHgzZDQsIDB4NmYsIHBhcik7Ci0JdmdhX291dDggKDB4M2Q1LCBwYXItPkNSNkYsIHBhcik7CisJdmdhX291dDgoMHgzZDQsIDB4MzYsIHBhcik7CisJdmdhX291dDgoMHgzZDUsIHJlZy0+Q1IzNiwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNkNCwgMHg2MCwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNkNSwgcmVnLT5DUjYwLCBwYXIpOworCXZnYV9vdXQ4KDB4M2Q0LCAweDY4LCBwYXIpOworCXZnYV9vdXQ4KDB4M2Q1LCByZWctPkNSNjgsIHBhcik7CisJdmdhX291dDgoMHgzZDQsIDB4NjksIHBhcik7CisJdmdhX291dDgoMHgzZDUsIHJlZy0+Q1I2OSwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNkNCwgMHg2ZiwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNkNSwgcmVnLT5DUjZGLCBwYXIpOwogCi0JdmdhX291dDggKDB4M2Q0LCAweDMzLCBwYXIpOwotCXZnYV9vdXQ4ICgweDNkNSwgcGFyLT5DUjMzLCBwYXIpOwotCXZnYV9vdXQ4ICgweDNkNCwgMHg4NiwgcGFyKTsKLQl2Z2Ffb3V0OCAoMHgzZDUsIHBhci0+Q1I4NiwgcGFyKTsKLQl2Z2Ffb3V0OCAoMHgzZDQsIDB4ODgsIHBhcik7Ci0JdmdhX291dDggKDB4M2Q1LCBwYXItPkNSODgsIHBhcik7Ci0JdmdhX291dDggKDB4M2Q0LCAweDkwLCBwYXIpOwotCXZnYV9vdXQ4ICgweDNkNSwgcGFyLT5DUjkwLCBwYXIpOwotCXZnYV9vdXQ4ICgweDNkNCwgMHg5MSwgcGFyKTsKLQl2Z2Ffb3V0OCAoMHgzZDUsIHBhci0+Q1I5MSwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNkNCwgMHgzMywgcGFyKTsKKwl2Z2Ffb3V0OCgweDNkNSwgcmVnLT5DUjMzLCBwYXIpOworCXZnYV9vdXQ4KDB4M2Q0LCAweDg2LCBwYXIpOworCXZnYV9vdXQ4KDB4M2Q1LCByZWctPkNSODYsIHBhcik7CisJdmdhX291dDgoMHgzZDQsIDB4ODgsIHBhcik7CisJdmdhX291dDgoMHgzZDUsIHJlZy0+Q1I4OCwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNkNCwgMHg5MCwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNkNSwgcmVnLT5DUjkwLCBwYXIpOworCXZnYV9vdXQ4KDB4M2Q0LCAweDkxLCBwYXIpOworCXZnYV9vdXQ4KDB4M2Q1LCByZWctPkNSOTEsIHBhcik7CiAKIAlpZiAocGFyLT5jaGlwID09IFMzX1NBVkFHRTQpIHsKLQkJdmdhX291dDggKDB4M2Q0LCAweGIwLCBwYXIpOwotCQl2Z2Ffb3V0OCAoMHgzZDUsIHBhci0+Q1JCMCwgcGFyKTsKKwkJdmdhX291dDgoMHgzZDQsIDB4YjAsIHBhcik7CisJCXZnYV9vdXQ4KDB4M2Q1LCByZWctPkNSQjAsIHBhcik7CiAJfQogCi0JdmdhX291dDggKDB4M2Q0LCAweDMyLCBwYXIpOwotCXZnYV9vdXQ4ICgweDNkNSwgcGFyLT5DUjMyLCBwYXIpOworCXZnYV9vdXQ4KDB4M2Q0LCAweDMyLCBwYXIpOworCXZnYV9vdXQ4KDB4M2Q1LCByZWctPkNSMzIsIHBhcik7CiAKIAkvKiB1bmxvY2sgZXh0ZW5kZWQgc2VxIHJlZ3MgKi8KLQl2Z2Ffb3V0OCAoMHgzYzQsIDB4MDgsIHBhcik7Ci0JdmdhX291dDggKDB4M2M1LCAweDA2LCBwYXIpOworCXZnYV9vdXQ4KDB4M2M0LCAweDA4LCBwYXIpOworCXZnYV9vdXQ4KDB4M2M1LCAweDA2LCBwYXIpOwogCiAJLyogUmVzdG9yZSBleHRlbmRlZCBzZXF1ZW5jZXIgcmVncyBmb3IgTUNMSy4gU1IxMCA9PSAyNTUgaW5kaWNhdGVzCiAJICogdGhhdCB3ZSBzaG91bGQgbGVhdmUgdGhlIGRlZmF1bHQgU1IxMCBhbmQgU1IxMSB2YWx1ZXMgdGhlcmUuCiAJICovCi0JaWYgKHBhci0+U1IxMCAhPSAyNTUpIHsKLQkJdmdhX291dDggKDB4M2M0LCAweDEwLCBwYXIpOwotCQl2Z2Ffb3V0OCAoMHgzYzUsIHBhci0+U1IxMCwgcGFyKTsKLQkJdmdhX291dDggKDB4M2M0LCAweDExLCBwYXIpOwotCQl2Z2Ffb3V0OCAoMHgzYzUsIHBhci0+U1IxMSwgcGFyKTsKKwlpZiAocmVnLT5TUjEwICE9IDI1NSkgeworCQl2Z2Ffb3V0OCgweDNjNCwgMHgxMCwgcGFyKTsKKwkJdmdhX291dDgoMHgzYzUsIHJlZy0+U1IxMCwgcGFyKTsKKwkJdmdhX291dDgoMHgzYzQsIDB4MTEsIHBhcik7CisJCXZnYV9vdXQ4KDB4M2M1LCByZWctPlNSMTEsIHBhcik7CiAJfQogCiAJLyogcmVzdG9yZSBleHRlbmRlZCBzZXEgcmVncyBmb3IgZGNsayAqLwotCXZnYV9vdXQ4ICgweDNjNCwgMHgwZSwgcGFyKTsKLQl2Z2Ffb3V0OCAoMHgzYzUsIHBhci0+U1IwRSwgcGFyKTsKLQl2Z2Ffb3V0OCAoMHgzYzQsIDB4MGYsIHBhcik7Ci0JdmdhX291dDggKDB4M2M1LCBwYXItPlNSMEYsIHBhcik7Ci0JdmdhX291dDggKDB4M2M0LCAweDEyLCBwYXIpOwotCXZnYV9vdXQ4ICgweDNjNSwgcGFyLT5TUjEyLCBwYXIpOwotCXZnYV9vdXQ4ICgweDNjNCwgMHgxMywgcGFyKTsKLQl2Z2Ffb3V0OCAoMHgzYzUsIHBhci0+U1IxMywgcGFyKTsKLQl2Z2Ffb3V0OCAoMHgzYzQsIDB4MjksIHBhcik7Ci0JdmdhX291dDggKDB4M2M1LCBwYXItPlNSMjksIHBhcik7Ci0KLQl2Z2Ffb3V0OCAoMHgzYzQsIDB4MTgsIHBhcik7Ci0JdmdhX291dDggKDB4M2M1LCBwYXItPlNSMTgsIHBhcik7CisJdmdhX291dDgoMHgzYzQsIDB4MGUsIHBhcik7CisJdmdhX291dDgoMHgzYzUsIHJlZy0+U1IwRSwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNjNCwgMHgwZiwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNjNSwgcmVnLT5TUjBGLCBwYXIpOworCXZnYV9vdXQ4KDB4M2M0LCAweDEyLCBwYXIpOworCXZnYV9vdXQ4KDB4M2M1LCByZWctPlNSMTIsIHBhcik7CisJdmdhX291dDgoMHgzYzQsIDB4MTMsIHBhcik7CisJdmdhX291dDgoMHgzYzUsIHJlZy0+U1IxMywgcGFyKTsKKwl2Z2Ffb3V0OCgweDNjNCwgMHgyOSwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNjNSwgcmVnLT5TUjI5LCBwYXIpOworCXZnYV9vdXQ4KDB4M2M0LCAweDE4LCBwYXIpOworCXZnYV9vdXQ4KDB4M2M1LCByZWctPlNSMTgsIHBhcik7CiAKIAkvKiBsb2FkIG5ldyBtLCBuIHBsbCB2YWx1ZXMgZm9yIGRjbGsgJiBtY2xrICovCi0JdmdhX291dDggKDB4M2M0LCAweDE1LCBwYXIpOwotCXRtcCA9IHZnYV9pbjggKDB4M2M1LCBwYXIpICYgfjB4MjE7CisJdmdhX291dDgoMHgzYzQsIDB4MTUsIHBhcik7CisJdG1wID0gdmdhX2luOCgweDNjNSwgcGFyKSAmIH4weDIxOwogCi0JdmdhX291dDggKDB4M2M1LCB0bXAgfCAweDAzLCBwYXIpOwotCXZnYV9vdXQ4ICgweDNjNSwgdG1wIHwgMHgyMywgcGFyKTsKLQl2Z2Ffb3V0OCAoMHgzYzUsIHRtcCB8IDB4MDMsIHBhcik7Ci0JdmdhX291dDggKDB4M2M1LCBwYXItPlNSMTUsIHBhcik7Ci0JdWRlbGF5ICgxMDApOworCXZnYV9vdXQ4KDB4M2M1LCB0bXAgfCAweDAzLCBwYXIpOworCXZnYV9vdXQ4KDB4M2M1LCB0bXAgfCAweDIzLCBwYXIpOworCXZnYV9vdXQ4KDB4M2M1LCB0bXAgfCAweDAzLCBwYXIpOworCXZnYV9vdXQ4KDB4M2M1LCByZWctPlNSMTUsIHBhcik7CisJdWRlbGF5KDEwMCk7CiAKLQl2Z2Ffb3V0OCAoMHgzYzQsIDB4MzAsIHBhcik7Ci0JdmdhX291dDggKDB4M2M1LCBwYXItPlNSMzAsIHBhcik7Ci0JdmdhX291dDggKDB4M2M0LCAweDA4LCBwYXIpOwotCXZnYV9vdXQ4ICgweDNjNSwgcGFyLT5TUjA4LCBwYXIpOworCXZnYV9vdXQ4KDB4M2M0LCAweDMwLCBwYXIpOworCXZnYV9vdXQ4KDB4M2M1LCByZWctPlNSMzAsIHBhcik7CisJdmdhX291dDgoMHgzYzQsIDB4MDgsIHBhcik7CisJdmdhX291dDgoMHgzYzUsIHJlZy0+U1IwOCwgcGFyKTsKIAogCS8qIG5vdyB3cml0ZSBvdXQgY3I2NyBpbiBmdWxsLCBwb3NzaWJseSBzdGFydGluZyBTVFJFQU1TICovCiAJVmVydGljYWxSZXRyYWNlV2FpdChwYXIpOwotCXZnYV9vdXQ4ICgweDNkNCwgMHg2NywgcGFyKTsKLQl2Z2Ffb3V0OCAoMHgzZDUsIHBhci0+Q1I2NywgcGFyKTsKKwl2Z2Ffb3V0OCgweDNkNCwgMHg2NywgcGFyKTsKKwl2Z2Ffb3V0OCgweDNkNSwgcmVnLT5DUjY3LCBwYXIpOwogCi0JdmdhX291dDggKDB4M2Q0LCAweDY2LCBwYXIpOwotCWNyNjYgPSB2Z2FfaW44ICgweDNkNSwgcGFyKTsKLQl2Z2Ffb3V0OCAoMHgzZDUsIGNyNjYgfCAweDgwLCBwYXIpOwotCXZnYV9vdXQ4ICgweDNkNCwgMHgzYSwgcGFyKTsKLQljcjNhID0gdmdhX2luOCAoMHgzZDUsIHBhcik7Ci0JdmdhX291dDggKDB4M2Q1LCBjcjNhIHwgMHg4MCwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNkNCwgMHg2NiwgcGFyKTsKKwljcjY2ID0gdmdhX2luOCgweDNkNSwgcGFyKTsKKwl2Z2Ffb3V0OCgweDNkNSwgY3I2NiB8IDB4ODAsIHBhcik7CisJdmdhX291dDgoMHgzZDQsIDB4M2EsIHBhcik7CisJY3IzYSA9IHZnYV9pbjgoMHgzZDUsIHBhcik7CisJdmdhX291dDgoMHgzZDUsIGNyM2EgfCAweDgwLCBwYXIpOwogCiAJaWYgKHBhci0+Y2hpcCAhPSBTM19TQVZBR0VfTVgpIHsKIAkJVmVydGljYWxSZXRyYWNlV2FpdChwYXIpOwotCQlzYXZhZ2Vfb3V0MzIgKEZJRk9fQ09OVFJPTF9SRUcsIHBhci0+TU1QUjAsIHBhcik7Ci0JCXBhci0+U2F2YWdlV2FpdElkbGUgKHBhcik7Ci0JCXNhdmFnZV9vdXQzMiAoTUlVX0NPTlRST0xfUkVHLCBwYXItPk1NUFIxLCBwYXIpOwotCQlwYXItPlNhdmFnZVdhaXRJZGxlIChwYXIpOwotCQlzYXZhZ2Vfb3V0MzIgKFNUUkVBTVNfVElNRU9VVF9SRUcsIHBhci0+TU1QUjIsIHBhcik7Ci0JCXBhci0+U2F2YWdlV2FpdElkbGUgKHBhcik7Ci0JCXNhdmFnZV9vdXQzMiAoTUlTQ19USU1FT1VUX1JFRywgcGFyLT5NTVBSMywgcGFyKTsKKwkJc2F2YWdlX291dDMyKEZJRk9fQ09OVFJPTF9SRUcsIHJlZy0+TU1QUjAsIHBhcik7CisJCXBhci0+U2F2YWdlV2FpdElkbGUocGFyKTsKKwkJc2F2YWdlX291dDMyKE1JVV9DT05UUk9MX1JFRywgcmVnLT5NTVBSMSwgcGFyKTsKKwkJcGFyLT5TYXZhZ2VXYWl0SWRsZShwYXIpOworCQlzYXZhZ2Vfb3V0MzIoU1RSRUFNU19USU1FT1VUX1JFRywgcmVnLT5NTVBSMiwgcGFyKTsKKwkJcGFyLT5TYXZhZ2VXYWl0SWRsZShwYXIpOworCQlzYXZhZ2Vfb3V0MzIoTUlTQ19USU1FT1VUX1JFRywgcmVnLT5NTVBSMywgcGFyKTsKIAl9CiAKLQl2Z2Ffb3V0OCAoMHgzZDQsIDB4NjYsIHBhcik7Ci0JdmdhX291dDggKDB4M2Q1LCBjcjY2LCBwYXIpOwotCXZnYV9vdXQ4ICgweDNkNCwgMHgzYSwgcGFyKTsKLQl2Z2Ffb3V0OCAoMHgzZDUsIGNyM2EsIHBhcik7CisJdmdhX291dDgoMHgzZDQsIDB4NjYsIHBhcik7CisJdmdhX291dDgoMHgzZDUsIGNyNjYsIHBhcik7CisJdmdhX291dDgoMHgzZDQsIDB4M2EsIHBhcik7CisJdmdhX291dDgoMHgzZDUsIGNyM2EsIHBhcik7CiAKLQlTYXZhZ2VTZXR1cDJERW5naW5lIChwYXIpOwotCXZnYUhXUHJvdGVjdCAocGFyLCAwKTsKKwlTYXZhZ2VTZXR1cDJERW5naW5lKHBhcik7CisJdmdhSFdQcm90ZWN0KHBhciwgMCk7CiB9CiAKLXN0YXRpYyB2b2lkIHNhdmFnZWZiX3VwZGF0ZV9zdGFydCAoc3RydWN0IHNhdmFnZWZiX3BhciAgICAgICpwYXIsCi0JCQkJICAgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIpCitzdGF0aWMgdm9pZCBzYXZhZ2VmYl91cGRhdGVfc3RhcnQoc3RydWN0IHNhdmFnZWZiX3BhciAgICAgICpwYXIsCisJCQkJICBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhcikKIHsKIAlpbnQgYmFzZTsKIApAQCAtMTMwNSw4ICsxNDc1LDggQEAKIAkvKiBub3cgcHJvZ3JhbSB0aGUgc3RhcnQgYWRkcmVzcyByZWdpc3RlcnMgKi8KIAl2Z2Ffb3V0MTYoMHgzZDQsIChiYXNlICYgMHgwMGZmMDApIHwgMHgwYywgcGFyKTsKIAl2Z2Ffb3V0MTYoMHgzZDQsICgoYmFzZSAmIDB4MDBmZikgPDwgOCkgfCAweDBkLCBwYXIpOwotCXZnYV9vdXQ4ICgweDNkNCwgMHg2OSwgcGFyKTsKLQl2Z2Ffb3V0OCAoMHgzZDUsIChiYXNlICYgMHg3ZjAwMDApID4+IDE2LCBwYXIpOworCXZnYV9vdXQ4KDB4M2Q0LCAweDY5LCBwYXIpOworCXZnYV9vdXQ4KDB4M2Q1LCAoYmFzZSAmIDB4N2YwMDAwKSA+PiAxNiwgcGFyKTsKIH0KIAogCkBAIC0xMzI1LDI5ICsxNDk1LDE0IEBACiAKIH0KIAotI2lmIGRlZmluZWQoQ09ORklHX0ZCX1NBVkFHRV9BQ0NFTCkKLXN0YXRpYyB2b2lkIHNhdmFnZWZiX3NldF9jbGlwKHN0cnVjdCBmYl9pbmZvICppbmZvKQotewotICAgIHN0cnVjdCBzYXZhZ2VmYl9wYXIgKnBhciA9IGluZm8tPnBhcjsKLSAgICBpbnQgY21kOwotCi0gICAgY21kID0gQkNJX0NNRF9OT1AgfCBCQ0lfQ01EX0NMSVBfTkVXOwotICAgIHBhci0+YmNpX3B0ciA9IDA7Ci0gICAgcGFyLT5TYXZhZ2VXYWl0RmlmbyhwYXIsMyk7Ci0gICAgQkNJX1NFTkQoY21kKTsKLSAgICBCQ0lfU0VORChCQ0lfQ0xJUF9UTCgwLCAwKSk7Ci0gICAgQkNJX1NFTkQoQkNJX0NMSVBfQlIoMHhmZmYsIDB4ZmZmKSk7Ci19Ci0jZW5kaWYKLQotc3RhdGljIGludCBzYXZhZ2VmYl9zZXRfcGFyIChzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3N0YXRpYyBpbnQgc2F2YWdlZmJfc2V0X3BhcihzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKIHsKIAlzdHJ1Y3Qgc2F2YWdlZmJfcGFyICpwYXIgPSBpbmZvLT5wYXI7CiAJc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIgPSAmaW5mby0+dmFyOwogCWludCBlcnI7CiAKIAlEQkcoInNhdmFnZWZiX3NldF9wYXIiKTsKLQllcnIgPSBzYXZhZ2VmYl9kZWNvZGVfdmFyICh2YXIsIHBhcik7CisJZXJyID0gc2F2YWdlZmJfZGVjb2RlX3Zhcih2YXIsIHBhciwgJnBhci0+c3RhdGUpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKQEAgLTEzNjYsOCArMTUyMSw4IEBACiAJcGFyLT5tYXhDbG9jayA9IHBhci0+ZGFjU3BlZWRCcHA7CiAJcGFyLT5taW5DbG9jayA9IDEwMDAwOwogCi0Jc2F2YWdlZmJfc2V0X3Bhcl9pbnQgKHBhcik7Ci0JZmJfc2V0X2NtYXAgKCZpbmZvLT5jbWFwLCBpbmZvKTsKKwlzYXZhZ2VmYl9zZXRfcGFyX2ludChwYXIsICZwYXItPnN0YXRlKTsKKwlmYl9zZXRfY21hcCgmaW5mby0+Y21hcCwgaW5mbyk7CiAJc2F2YWdlZmJfc2V0X2ZpeChpbmZvKTsKIAlzYXZhZ2VmYl9zZXRfY2xpcChpbmZvKTsKIApAQCAtMTM3OCwxMiArMTUzMywxMiBAQAogLyoKICAqICAgIFBhbiBvciBXcmFwIHRoZSBEaXNwbGF5CiAgKi8KLXN0YXRpYyBpbnQgc2F2YWdlZmJfcGFuX2Rpc3BsYXkgKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLAotCQkJCSBzdHJ1Y3QgZmJfaW5mbyAgICAgICAgICAgKmluZm8pCitzdGF0aWMgaW50IHNhdmFnZWZiX3Bhbl9kaXNwbGF5KHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLAorCQkJCXN0cnVjdCBmYl9pbmZvICAgICAgICAgICAqaW5mbykKIHsKIAlzdHJ1Y3Qgc2F2YWdlZmJfcGFyICpwYXIgPSBpbmZvLT5wYXI7CiAKLQlzYXZhZ2VmYl91cGRhdGVfc3RhcnQgKHBhciwgdmFyKTsKKwlzYXZhZ2VmYl91cGRhdGVfc3RhcnQocGFyLCB2YXIpOwogCXJldHVybiAwOwogfQogCkBAIC0xNDQwLDYgKzE1OTUsMjIgQEAKIAlyZXR1cm4gKGJsYW5rID09IEZCX0JMQU5LX05PUk1BTCkgPyAxIDogMDsKIH0KIAorc3RhdGljIHZvaWQgc2F2YWdlZmJfc2F2ZV9zdGF0ZShzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3Qgc2F2YWdlZmJfcGFyICpwYXIgPSBpbmZvLT5wYXI7CisKKwlzYXZhZ2VfZ2V0X2RlZmF1bHRfcGFyKHBhciwgJnBhci0+c2F2ZSk7Cit9CisKK3N0YXRpYyB2b2lkIHNhdmFnZWZiX3Jlc3RvcmVfc3RhdGUoc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJc3RydWN0IHNhdmFnZWZiX3BhciAqcGFyID0gaW5mby0+cGFyOworCisJc2F2YWdlZmJfYmxhbmsoRkJfQkxBTktfUE9XRVJET1dOLCBpbmZvKTsKKwlzYXZhZ2Vfc2V0X2RlZmF1bHRfcGFyKHBhciwgJnBhci0+c2F2ZSk7CisJc2F2YWdlZmJfYmxhbmsoRkJfQkxBTktfVU5CTEFOSywgaW5mbyk7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgZmJfb3BzIHNhdmFnZWZiX29wcyA9IHsKIAkub3duZXIgICAgICAgICAgPSBUSElTX01PRFVMRSwKIAkuZmJfY2hlY2tfdmFyICAgPSBzYXZhZ2VmYl9jaGVja192YXIsCkBAIC0xNDQ3LDYgKzE2MTgsOCBAQAogCS5mYl9zZXRjb2xyZWcgICA9IHNhdmFnZWZiX3NldGNvbHJlZywKIAkuZmJfcGFuX2Rpc3BsYXkgPSBzYXZhZ2VmYl9wYW5fZGlzcGxheSwKIAkuZmJfYmxhbmsgICAgICAgPSBzYXZhZ2VmYl9ibGFuaywKKwkuZmJfc2F2ZV9zdGF0ZSAgPSBzYXZhZ2VmYl9zYXZlX3N0YXRlLAorCS5mYl9yZXN0b3JlX3N0YXRlID0gc2F2YWdlZmJfcmVzdG9yZV9zdGF0ZSwKICNpZiBkZWZpbmVkKENPTkZJR19GQl9TQVZBR0VfQUNDRUwpCiAJLmZiX2ZpbGxyZWN0ICAgID0gc2F2YWdlZmJfZmlsbHJlY3QsCiAJLmZiX2NvcHlhcmVhICAgID0gc2F2YWdlZmJfY29weWFyZWEsCkBAIC0xNDc5LDU5ICsxNjUyLDU5IEBACiAJLnZtb2RlID0JRkJfVk1PREVfTk9OSU5URVJMQUNFRAogfTsKIAotc3RhdGljIHZvaWQgc2F2YWdlX2VuYWJsZV9tbWlvIChzdHJ1Y3Qgc2F2YWdlZmJfcGFyICpwYXIpCitzdGF0aWMgdm9pZCBzYXZhZ2VfZW5hYmxlX21taW8oc3RydWN0IHNhdmFnZWZiX3BhciAqcGFyKQogewogCXVuc2lnbmVkIGNoYXIgdmFsOwogCi0JREJHICgic2F2YWdlX2VuYWJsZV9tbWlvXG4iKTsKKwlEQkcoInNhdmFnZV9lbmFibGVfbW1pb1xuIik7CiAKLQl2YWwgPSB2Z2FfaW44ICgweDNjMywgcGFyKTsKLQl2Z2Ffb3V0OCAoMHgzYzMsIHZhbCB8IDB4MDEsIHBhcik7Ci0JdmFsID0gdmdhX2luOCAoMHgzY2MsIHBhcik7Ci0JdmdhX291dDggKDB4M2MyLCB2YWwgfCAweDAxLCBwYXIpOworCXZhbCA9IHZnYV9pbjgoMHgzYzMsIHBhcik7CisJdmdhX291dDgoMHgzYzMsIHZhbCB8IDB4MDEsIHBhcik7CisJdmFsID0gdmdhX2luOCgweDNjYywgcGFyKTsKKwl2Z2Ffb3V0OCgweDNjMiwgdmFsIHwgMHgwMSwgcGFyKTsKIAogCWlmIChwYXItPmNoaXAgPj0gUzNfU0FWQUdFNCkgewotCQl2Z2Ffb3V0OCAoMHgzZDQsIDB4NDAsIHBhcik7Ci0JCXZhbCA9IHZnYV9pbjggKDB4M2Q1LCBwYXIpOwotCQl2Z2Ffb3V0OCAoMHgzZDUsIHZhbCB8IDEsIHBhcik7CisJCXZnYV9vdXQ4KDB4M2Q0LCAweDQwLCBwYXIpOworCQl2YWwgPSB2Z2FfaW44KDB4M2Q1LCBwYXIpOworCQl2Z2Ffb3V0OCgweDNkNSwgdmFsIHwgMSwgcGFyKTsKIAl9CiB9CiAKIAotc3RhdGljIHZvaWQgc2F2YWdlX2Rpc2FibGVfbW1pbyAoc3RydWN0IHNhdmFnZWZiX3BhciAqcGFyKQorc3RhdGljIHZvaWQgc2F2YWdlX2Rpc2FibGVfbW1pbyhzdHJ1Y3Qgc2F2YWdlZmJfcGFyICpwYXIpCiB7CiAJdW5zaWduZWQgY2hhciB2YWw7CiAKLQlEQkcgKCJzYXZhZ2VfZGlzYWJsZV9tbWlvXG4iKTsKKwlEQkcoInNhdmFnZV9kaXNhYmxlX21taW9cbiIpOwogCi0JaWYocGFyLT5jaGlwID49IFMzX1NBVkFHRTQgKSB7Ci0JCXZnYV9vdXQ4ICgweDNkNCwgMHg0MCwgcGFyKTsKLQkJdmFsID0gdmdhX2luOCAoMHgzZDUsIHBhcik7Ci0JCXZnYV9vdXQ4ICgweDNkNSwgdmFsIHwgMSwgcGFyKTsKKwlpZiAocGFyLT5jaGlwID49IFMzX1NBVkFHRTQpIHsKKwkJdmdhX291dDgoMHgzZDQsIDB4NDAsIHBhcik7CisJCXZhbCA9IHZnYV9pbjgoMHgzZDUsIHBhcik7CisJCXZnYV9vdXQ4KDB4M2Q1LCB2YWwgfCAxLCBwYXIpOwogCX0KIH0KIAogCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBzYXZhZ2VfbWFwX21taW8gKHN0cnVjdCBmYl9pbmZvICppbmZvKQorc3RhdGljIGludCBfX2RldmluaXQgc2F2YWdlX21hcF9tbWlvKHN0cnVjdCBmYl9pbmZvICppbmZvKQogewogCXN0cnVjdCBzYXZhZ2VmYl9wYXIgKnBhciA9IGluZm8tPnBhcjsKLQlEQkcgKCJzYXZhZ2VfbWFwX21taW8iKTsKKwlEQkcoInNhdmFnZV9tYXBfbW1pbyIpOwogCi0JaWYgKFMzX1NBVkFHRTNEX1NFUklFUyAocGFyLT5jaGlwKSkKLQkJcGFyLT5tbWlvLnBiYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0IChwYXItPnBjaWRldiwgMCkgKworCWlmIChTM19TQVZBR0UzRF9TRVJJRVMocGFyLT5jaGlwKSkKKwkJcGFyLT5tbWlvLnBiYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBhci0+cGNpZGV2LCAwKSArCiAJCQlTQVZBR0VfTkVXTU1JT19SRUdCQVNFX1MzOwogCWVsc2UKLQkJcGFyLT5tbWlvLnBiYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0IChwYXItPnBjaWRldiwgMCkgKworCQlwYXItPm1taW8ucGJhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGFyLT5wY2lkZXYsIDApICsKIAkJCVNBVkFHRV9ORVdNTUlPX1JFR0JBU0VfUzQ7CiAKIAlwYXItPm1taW8ubGVuID0gU0FWQUdFX05FV01NSU9fUkVHU0laRTsKIAotCXBhci0+bW1pby52YmFzZSA9IGlvcmVtYXAgKHBhci0+bW1pby5wYmFzZSwgcGFyLT5tbWlvLmxlbik7CisJcGFyLT5tbWlvLnZiYXNlID0gaW9yZW1hcChwYXItPm1taW8ucGJhc2UsIHBhci0+bW1pby5sZW4pOwogCWlmICghcGFyLT5tbWlvLnZiYXNlKSB7Ci0JCXByaW50ayAoInNhdmFnZWZiOiB1bmFibGUgdG8gbWFwIG1lbW9yeSBtYXBwZWQgSU9cbiIpOworCQlwcmludGsoInNhdmFnZWZiOiB1bmFibGUgdG8gbWFwIG1lbW9yeSBtYXBwZWQgSU9cbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9IGVsc2UKLQkJcHJpbnRrIChLRVJOX0lORk8gInNhdmFnZWZiOiBtYXBwZWQgaW8gYXQgJXBcbiIsCisJCXByaW50ayhLRVJOX0lORk8gInNhdmFnZWZiOiBtYXBwZWQgaW8gYXQgJXBcbiIsCiAJCQlwYXItPm1taW8udmJhc2UpOwogCiAJaW5mby0+Zml4Lm1taW9fc3RhcnQgPSBwYXItPm1taW8ucGJhc2U7CkBAIC0xNTQwLDE1ICsxNzEzLDE1IEBACiAJcGFyLT5iY2lfYmFzZSA9ICh1MzIgX19pb21lbSAqKShwYXItPm1taW8udmJhc2UgKyBCQ0lfQlVGRkVSX09GRlNFVCk7CiAJcGFyLT5iY2lfcHRyICA9IDA7CiAKLQlzYXZhZ2VfZW5hYmxlX21taW8gKHBhcik7CisJc2F2YWdlX2VuYWJsZV9tbWlvKHBhcik7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgc2F2YWdlX3VubWFwX21taW8gKHN0cnVjdCBmYl9pbmZvICppbmZvKQorc3RhdGljIHZvaWQgc2F2YWdlX3VubWFwX21taW8oc3RydWN0IGZiX2luZm8gKmluZm8pCiB7CiAJc3RydWN0IHNhdmFnZWZiX3BhciAqcGFyID0gaW5mby0+cGFyOwotCURCRyAoInNhdmFnZV91bm1hcF9tbWlvIik7CisJREJHKCJzYXZhZ2VfdW5tYXBfbW1pbyIpOwogCiAJc2F2YWdlX2Rpc2FibGVfbW1pbyhwYXIpOwogCkBAIC0xNTU4LDQ2ICsxNzMxLDQ2IEBACiAJfQogfQogCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBzYXZhZ2VfbWFwX3ZpZGVvIChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywKLQkJCQkgICAgICAgaW50IHZpZGVvX2xlbikKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNhdmFnZV9tYXBfdmlkZW8oc3RydWN0IGZiX2luZm8gKmluZm8sCisJCQkJICAgICAgaW50IHZpZGVvX2xlbikKIHsKIAlzdHJ1Y3Qgc2F2YWdlZmJfcGFyICpwYXIgPSBpbmZvLT5wYXI7CiAJaW50IHJlc291cmNlOwogCiAJREJHKCJzYXZhZ2VfbWFwX3ZpZGVvIik7CiAKLQlpZiAoUzNfU0FWQUdFM0RfU0VSSUVTIChwYXItPmNoaXApKQorCWlmIChTM19TQVZBR0UzRF9TRVJJRVMocGFyLT5jaGlwKSkKIAkJcmVzb3VyY2UgPSAwOwogCWVsc2UKIAkJcmVzb3VyY2UgPSAxOwogCi0JcGFyLT52aWRlby5wYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydCAocGFyLT5wY2lkZXYsIHJlc291cmNlKTsKKwlwYXItPnZpZGVvLnBiYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBhci0+cGNpZGV2LCByZXNvdXJjZSk7CiAJcGFyLT52aWRlby5sZW4gICA9IHZpZGVvX2xlbjsKLQlwYXItPnZpZGVvLnZiYXNlID0gaW9yZW1hcCAocGFyLT52aWRlby5wYmFzZSwgcGFyLT52aWRlby5sZW4pOworCXBhci0+dmlkZW8udmJhc2UgPSBpb3JlbWFwKHBhci0+dmlkZW8ucGJhc2UsIHBhci0+dmlkZW8ubGVuKTsKIAogCWlmICghcGFyLT52aWRlby52YmFzZSkgewotCQlwcmludGsgKCJzYXZhZ2VmYjogdW5hYmxlIHRvIG1hcCBzY3JlZW4gbWVtb3J5XG4iKTsKKwkJcHJpbnRrKCJzYXZhZ2VmYjogdW5hYmxlIHRvIG1hcCBzY3JlZW4gbWVtb3J5XG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfSBlbHNlCi0JCXByaW50ayAoS0VSTl9JTkZPICJzYXZhZ2VmYjogbWFwcGVkIGZyYW1lYnVmZmVyIGF0ICVwLCAiCi0JCQkicGJhc2UgPT0gJXhcbiIsIHBhci0+dmlkZW8udmJhc2UsIHBhci0+dmlkZW8ucGJhc2UpOworCQlwcmludGsoS0VSTl9JTkZPICJzYXZhZ2VmYjogbWFwcGVkIGZyYW1lYnVmZmVyIGF0ICVwLCAiCisJCSAgICAgICAicGJhc2UgPT0gJXhcbiIsIHBhci0+dmlkZW8udmJhc2UsIHBhci0+dmlkZW8ucGJhc2UpOwogCiAJaW5mby0+Zml4LnNtZW1fc3RhcnQgPSBwYXItPnZpZGVvLnBiYXNlOwogCWluZm8tPmZpeC5zbWVtX2xlbiAgID0gcGFyLT52aWRlby5sZW4gLSBwYXItPmNvYl9zaXplOwogCWluZm8tPnNjcmVlbl9iYXNlICAgID0gcGFyLT52aWRlby52YmFzZTsKIAogI2lmZGVmIENPTkZJR19NVFJSCi0JcGFyLT52aWRlby5tdHJyID0gbXRycl9hZGQgKHBhci0+dmlkZW8ucGJhc2UsIHZpZGVvX2xlbiwKLQkJCQkgICAgIE1UUlJfVFlQRV9XUkNPTUIsIDEpOworCXBhci0+dmlkZW8ubXRyciA9IG10cnJfYWRkKHBhci0+dmlkZW8ucGJhc2UsIHZpZGVvX2xlbiwKKwkJCQkgICBNVFJSX1RZUEVfV1JDT01CLCAxKTsKICNlbmRpZgogCiAJLyogQ2xlYXIgZnJhbWVidWZmZXIsIGl0J3MgYWxsIHdoaXRlIGluIG1lbW9yeSBhZnRlciBib290ICovCi0JbWVtc2V0X2lvIChwYXItPnZpZGVvLnZiYXNlLCAwLCBwYXItPnZpZGVvLmxlbik7CisJbWVtc2V0X2lvKHBhci0+dmlkZW8udmJhc2UsIDAsIHBhci0+dmlkZW8ubGVuKTsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBzYXZhZ2VfdW5tYXBfdmlkZW8gKHN0cnVjdCBmYl9pbmZvICppbmZvKQorc3RhdGljIHZvaWQgc2F2YWdlX3VubWFwX3ZpZGVvKHN0cnVjdCBmYl9pbmZvICppbmZvKQogewogCXN0cnVjdCBzYXZhZ2VmYl9wYXIgKnBhciA9IGluZm8tPnBhcjsKIApAQCAtMTYwNSwxNiArMTc3OCwxNiBAQAogCiAJaWYgKHBhci0+dmlkZW8udmJhc2UpIHsKICNpZmRlZiBDT05GSUdfTVRSUgotCQltdHJyX2RlbCAocGFyLT52aWRlby5tdHJyLCBwYXItPnZpZGVvLnBiYXNlLCBwYXItPnZpZGVvLmxlbik7CisJCW10cnJfZGVsKHBhci0+dmlkZW8ubXRyciwgcGFyLT52aWRlby5wYmFzZSwgcGFyLT52aWRlby5sZW4pOwogI2VuZGlmCiAKLQkJaW91bm1hcCAocGFyLT52aWRlby52YmFzZSk7CisJCWlvdW5tYXAocGFyLT52aWRlby52YmFzZSk7CiAJCXBhci0+dmlkZW8udmJhc2UgPSBOVUxMOwogCQlpbmZvLT5zY3JlZW5fYmFzZSA9IE5VTEw7CiAJfQogfQogCi1zdGF0aWMgaW50IHNhdmFnZV9pbml0X2h3IChzdHJ1Y3Qgc2F2YWdlZmJfcGFyICpwYXIpCitzdGF0aWMgaW50IHNhdmFnZV9pbml0X2h3KHN0cnVjdCBzYXZhZ2VmYl9wYXIgKnBhcikKIHsKIAl1bnNpZ25lZCBjaGFyIGNvbmZpZzEsIG0sIG4sIG4xLCBuMiwgc3I4LCBjcjNmLCBjcjY2ID0gMCwgdG1wOwogCkBAIC0xNjU2LDcgKzE4MjksNyBAQAogCiAJc3dpdGNoICAocGFyLT5jaGlwKSB7CiAJY2FzZSBTM19TQVZBR0UzRDoKLQkJdmlkZW9SYW0gPSBSYW1TYXZhZ2UzRFsgKGNvbmZpZzEgJiAweEMwKSA+PiA2IF0gKiAxMDI0OworCQl2aWRlb1JhbSA9IFJhbVNhdmFnZTNEWyhjb25maWcxICYgMHhDMCkgPj4gNiBdICogMTAyNDsKIAkJYnJlYWs7CiAKIAljYXNlIFMzX1NBVkFHRTQ6CkBAIC0xNjY3LDIyICsxODQwLDIyIEBACiAJCSAqIGNhbiBkbyBpdCBkaWZmZXJlbnQuLi4KIAkJICovCiAJCXZnYV9vdXQ4KDB4M2Q0LCAweDY4LCBwYXIpOwkvKiBtZW1vcnkgY29udHJvbCAxICovCi0JCWlmKCAodmdhX2luOCgweDNkNSwgcGFyKSAmIDB4QzApID09ICgweDAxIDw8IDYpICkKKwkJaWYgKCh2Z2FfaW44KDB4M2Q1LCBwYXIpICYgMHhDMCkgPT0gKDB4MDEgPDwgNikpCiAJCQlSYW1TYXZhZ2U0WzFdID0gODsKIAogCQkvKkZBTExUSFJPVUdIKi8KIAogCWNhc2UgUzNfU0FWQUdFMjAwMDoKLQkJdmlkZW9SYW0gPSBSYW1TYXZhZ2U0WyAoY29uZmlnMSAmIDB4RTApID4+IDUgXSAqIDEwMjQ7CisJCXZpZGVvUmFtID0gUmFtU2F2YWdlNFsoY29uZmlnMSAmIDB4RTApID4+IDVdICogMTAyNDsKIAkJYnJlYWs7CiAKIAljYXNlIFMzX1NBVkFHRV9NWDoKIAljYXNlIFMzX1NVUEVSU0FWQUdFOgotCQl2aWRlb1JhbSA9IFJhbVNhdmFnZU1YWyAoY29uZmlnMSAmIDB4MEUpID4+IDEgXSAqIDEwMjQ7CisJCXZpZGVvUmFtID0gUmFtU2F2YWdlTVhbKGNvbmZpZzEgJiAweDBFKSA+PiAxXSAqIDEwMjQ7CiAJCWJyZWFrOwogCiAJY2FzZSBTM19QUk9TQVZBR0U6Ci0JCXZpZGVvUmFtID0gUmFtU2F2YWdlTkJbIChjb25maWcxICYgMHhFMCkgPj4gNSBdICogMTAyNDsKKwkJdmlkZW9SYW0gPSBSYW1TYXZhZ2VOQlsoY29uZmlnMSAmIDB4RTApID4+IDVdICogMTAyNDsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpAQCAtMTY5MywzMSArMTg2NiwzMSBAQAogCiAJdmlkZW9SYW1ieXRlcyA9IHZpZGVvUmFtICogMTAyNDsKIAotCXByaW50ayAoS0VSTl9JTkZPICJzYXZhZ2VmYjogcHJvYmVkIHZpZGVvcmFtOiAgJWRrXG4iLCB2aWRlb1JhbSk7CisJcHJpbnRrKEtFUk5fSU5GTyAic2F2YWdlZmI6IHByb2JlZCB2aWRlb3JhbTogICVka1xuIiwgdmlkZW9SYW0pOwogCiAJLyogcmVzZXQgZ3JhcGhpY3MgZW5naW5lIHRvIGF2b2lkIG1lbW9yeSBjb3JydXB0aW9uICovCi0JdmdhX291dDggKDB4M2Q0LCAweDY2LCBwYXIpOwotCWNyNjYgPSB2Z2FfaW44ICgweDNkNSwgcGFyKTsKLQl2Z2Ffb3V0OCAoMHgzZDUsIGNyNjYgfCAweDAyLCBwYXIpOwotCXVkZWxheSAoMTAwMDApOworCXZnYV9vdXQ4KDB4M2Q0LCAweDY2LCBwYXIpOworCWNyNjYgPSB2Z2FfaW44KDB4M2Q1LCBwYXIpOworCXZnYV9vdXQ4KDB4M2Q1LCBjcjY2IHwgMHgwMiwgcGFyKTsKKwl1ZGVsYXkoMTAwMDApOwogCi0JdmdhX291dDggKDB4M2Q0LCAweDY2LCBwYXIpOwotCXZnYV9vdXQ4ICgweDNkNSwgY3I2NiAmIH4weDAyLCBwYXIpOwkvKiBjbGVhciByZXNldCBmbGFnICovCi0JdWRlbGF5ICgxMDAwMCk7CisJdmdhX291dDgoMHgzZDQsIDB4NjYsIHBhcik7CisJdmdhX291dDgoMHgzZDUsIGNyNjYgJiB+MHgwMiwgcGFyKTsJLyogY2xlYXIgcmVzZXQgZmxhZyAqLworCXVkZWxheSgxMDAwMCk7CiAKIAogCS8qCiAJICogcmVzZXQgbWVtb3J5IGludGVyZmFjZSwgM0QgZW5naW5lLCBBR1AgbWFzdGVyLCBQQ0kgbWFzdGVyLAogCSAqIG1hc3RlciBlbmdpbmUgdW5pdCwgbW90aW9uIGNvbXBlbnNhdGlvbi9MUEIKIAkgKi8KLQl2Z2Ffb3V0OCAoMHgzZDQsIDB4M2YsIHBhcik7Ci0JY3IzZiA9IHZnYV9pbjggKDB4M2Q1LCBwYXIpOwotCXZnYV9vdXQ4ICgweDNkNSwgY3IzZiB8IDB4MDgsIHBhcik7Ci0JdWRlbGF5ICgxMDAwMCk7CisJdmdhX291dDgoMHgzZDQsIDB4M2YsIHBhcik7CisJY3IzZiA9IHZnYV9pbjgoMHgzZDUsIHBhcik7CisJdmdhX291dDgoMHgzZDUsIGNyM2YgfCAweDA4LCBwYXIpOworCXVkZWxheSgxMDAwMCk7CiAKLQl2Z2Ffb3V0OCAoMHgzZDQsIDB4M2YsIHBhcik7Ci0JdmdhX291dDggKDB4M2Q1LCBjcjNmICYgfjB4MDgsIHBhcik7CS8qIGNsZWFyIHJlc2V0IGZsYWdzICovCi0JdWRlbGF5ICgxMDAwMCk7CisJdmdhX291dDgoMHgzZDQsIDB4M2YsIHBhcik7CisJdmdhX291dDgoMHgzZDUsIGNyM2YgJiB+MHgwOCwgcGFyKTsJLyogY2xlYXIgcmVzZXQgZmxhZ3MgKi8KKwl1ZGVsYXkoMTAwMDApOwogCiAJLyogU2F2YWdlIHJhbWRhYyBzcGVlZHMgKi8KIAlwYXItPm51bUNsb2NrcyA9IDQ7CkBAIC0xNzQwLDcgKzE5MTMsNyBAQAogCW4xID0gbiAmIDB4MWY7CiAJbjIgPSAobiA+PiA1KSAmIDB4MDM7CiAJcGFyLT5NQ0xLID0gKCgxNDMxODE4ICogKG0rMikpIC8gKG4xKzIpIC8gKDEgPDwgbjIpICsgNTApIC8gMTAwOwotCXByaW50ayAoS0VSTl9JTkZPICJzYXZhZ2VmYjogRGV0ZWN0ZWQgY3VycmVudCBNQ0xLIHZhbHVlIG9mICVkIGtIelxuIiwKKwlwcmludGsoS0VSTl9JTkZPICJzYXZhZ2VmYjogRGV0ZWN0ZWQgY3VycmVudCBNQ0xLIHZhbHVlIG9mICVkIGtIelxuIiwKIAkJcGFyLT5NQ0xLKTsKIAogCS8qIGNoZWNrIGZvciBEVkkvZmxhdCBwYW5lbCAqLwpAQCAtMTc2OSwxMiArMTk0MiwxMiBAQAogCS8qIENoZWNrIExDRCBwYW5lbCBwYXJybWF0aW9uICovCiAKIAlpZiAocGFyLT5kaXNwbGF5X3R5cGUgPT0gRElTUF9MQ0QpIHsKLQkJdW5zaWduZWQgY2hhciBjcjZiID0gVkdBckNSKCAweDZiLCBwYXIpOworCQl1bnNpZ25lZCBjaGFyIGNyNmIgPSBWR0FyQ1IoMHg2YiwgcGFyKTsKIAotCQlpbnQgcGFuZWxYID0gKFZHQXJTRVEgKDB4NjEsIHBhcikgKwotCQkJICAgICAgKChWR0FyU0VRICgweDY2LCBwYXIpICYgMHgwMikgPDwgNykgKyAxKSAqIDg7Ci0JCWludCBwYW5lbFkgPSAoVkdBclNFUSAoMHg2OSwgcGFyKSArCi0JCQkgICAgICAoKFZHQXJTRVEgKDB4NmUsIHBhcikgJiAweDcwKSA8PCA0KSArIDEpOworCQlpbnQgcGFuZWxYID0gKFZHQXJTRVEoMHg2MSwgcGFyKSArCisJCQkgICAgICAoKFZHQXJTRVEoMHg2NiwgcGFyKSAmIDB4MDIpIDw8IDcpICsgMSkgKiA4OworCQlpbnQgcGFuZWxZID0gKFZHQXJTRVEoMHg2OSwgcGFyKSArCisJCQkgICAgICAoKFZHQXJTRVEoMHg2ZSwgcGFyKSAmIDB4NzApIDw8IDQpICsgMSk7CiAKIAkJY2hhciAqIHNUZWNobm9sb2d5ID0gIlVua25vd24iOwogCkBAIC0xNzk2LDI2ICsxOTY5LDI2IEBACiAJCQlBY3RpdmVEVU8gPSAweDgwCiAJCX07CiAKLQkJaWYgKChWR0FyU0VRICgweDM5LCBwYXIpICYgMHgwMykgPT0gMCkgeworCQlpZiAoKFZHQXJTRVEoMHgzOSwgcGFyKSAmIDB4MDMpID09IDApIHsKIAkJCXNUZWNobm9sb2d5ID0gIlRGVCI7Ci0JCX0gZWxzZSBpZiAoKFZHQXJTRVEgKDB4MzAsIHBhcikgJiAweDAxKSA9PSAwKSB7CisJCX0gZWxzZSBpZiAoKFZHQXJTRVEoMHgzMCwgcGFyKSAmIDB4MDEpID09IDApIHsKIAkJCXNUZWNobm9sb2d5ID0gIkRTVE4iOwogCQl9IGVsc2UgCXsKIAkJCXNUZWNobm9sb2d5ID0gIlNUTiI7CiAJCX0KIAotCQlwcmludGsgKEtFUk5fSU5GTyAic2F2YWdlZmI6ICVkeCVkICVzIExDRCBwYW5lbCBkZXRlY3RlZCAlc1xuIiwKLQkJCXBhbmVsWCwgcGFuZWxZLCBzVGVjaG5vbG9neSwKLQkJCWNyNmIgJiBBY3RpdmVMQ0QgPyAiYW5kIGFjdGl2ZSIgOiAiYnV0IG5vdCBhY3RpdmUiKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAic2F2YWdlZmI6ICVkeCVkICVzIExDRCBwYW5lbCBkZXRlY3RlZCAlc1xuIiwKKwkJICAgICAgIHBhbmVsWCwgcGFuZWxZLCBzVGVjaG5vbG9neSwKKwkJICAgICAgIGNyNmIgJiBBY3RpdmVMQ0QgPyAiYW5kIGFjdGl2ZSIgOiAiYnV0IG5vdCBhY3RpdmUiKTsKIAotCQlpZiggY3I2YiAmIEFjdGl2ZUxDRCApIAl7CisJCWlmIChjcjZiICYgQWN0aXZlTENEKSAJewogCQkJLyoKIAkJCSAqIElmIHRoZSBMQ0QgaXMgYWN0aXZlIGFuZCBwYW5lbCBleHBhbnNpb24gaXMgZW5hYmxlZCwKIAkJCSAqIHdlIHByb2JhYmx5IHdhbnQgdG8ga2lsbCB0aGUgSFcgY3Vyc29yLgogCQkJICovCiAKLQkJCXByaW50ayAoS0VSTl9JTkZPICJzYXZhZ2VmYjogTGltaXRpbmcgdmlkZW8gbW9kZSB0byAiCi0JCQkJIiVkeCVkXG4iLCBwYW5lbFgsIHBhbmVsWSApOworCQkJcHJpbnRrKEtFUk5fSU5GTyAic2F2YWdlZmI6IExpbWl0aW5nIHZpZGVvIG1vZGUgdG8gIgorCQkJCSIlZHglZFxuIiwgcGFuZWxYLCBwYW5lbFkpOwogCiAJCQlwYXItPlNhdmFnZVBhbmVsV2lkdGggPSBwYW5lbFg7CiAJCQlwYXItPlNhdmFnZVBhbmVsSGVpZ2h0ID0gcGFuZWxZOwpAQCAtMTgyNCw5ICsxOTk3LDEwIEBACiAJCQlwYXItPmRpc3BsYXlfdHlwZSA9IERJU1BfQ1JUOwogCX0KIAotCXNhdmFnZV9nZXRfZGVmYXVsdF9wYXIgKHBhcik7CisJc2F2YWdlX2dldF9kZWZhdWx0X3BhcihwYXIsICZwYXItPnN0YXRlKTsKKwlwYXItPnNhdmUgPSBwYXItPnN0YXRlOwogCi0JaWYoIFMzX1NBVkFHRTRfU0VSSUVTKHBhci0+Y2hpcCkgKSB7CisJaWYgKFMzX1NBVkFHRTRfU0VSSUVTKHBhci0+Y2hpcCkpIHsKIAkJLyoKIAkJICogVGhlIFNhdmFnZTQgYW5kIFByb1NhdmFnZSBoYXZlIENPQiBjb2hlcmVuY3kgYnVncyB3aGljaAogCQkgKiByZW5kZXIgdGhlIGJ1ZmZlciB1c2VsZXNzLiAgV2UgZGlzYWJsZSBpdC4KQEAgLTE4NDUsOSArMjAxOSw5IEBACiAJcmV0dXJuIHZpZGVvUmFtYnl0ZXM7CiB9CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IHNhdmFnZV9pbml0X2ZiX2luZm8gKHN0cnVjdCBmYl9pbmZvICppbmZvLAotCQkJCQkgIHN0cnVjdCBwY2lfZGV2ICpkZXYsCi0JCQkJCSAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQorc3RhdGljIGludCBfX2RldmluaXQgc2F2YWdlX2luaXRfZmJfaW5mbyhzdHJ1Y3QgZmJfaW5mbyAqaW5mbywKKwkJCQkJIHN0cnVjdCBwY2lfZGV2ICpkZXYsCisJCQkJCSBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCiB7CiAJc3RydWN0IHNhdmFnZWZiX3BhciAqcGFyID0gaW5mby0+cGFyOwogCWludCBlcnIgPSAwOwpAQCAtMTg2Myw2MyArMjAzNyw2MyBAQAogCXN3aXRjaCAoaW5mby0+Zml4LmFjY2VsKSB7CiAJY2FzZSBGQl9BQ0NFTF9TVVBFUlNBVkFHRToKIAkJcGFyLT5jaGlwID0gUzNfU1VQRVJTQVZBR0U7Ci0JCXNucHJpbnRmIChpbmZvLT5maXguaWQsIDE2LCAiU3VwZXJTYXZhZ2UiKTsKKwkJc25wcmludGYoaW5mby0+Zml4LmlkLCAxNiwgIlN1cGVyU2F2YWdlIik7CiAJCWJyZWFrOwogCWNhc2UgRkJfQUNDRUxfU0FWQUdFNDoKIAkJcGFyLT5jaGlwID0gUzNfU0FWQUdFNDsKLQkJc25wcmludGYgKGluZm8tPmZpeC5pZCwgMTYsICJTYXZhZ2U0Iik7CisJCXNucHJpbnRmKGluZm8tPmZpeC5pZCwgMTYsICJTYXZhZ2U0Iik7CiAJCWJyZWFrOwogCWNhc2UgRkJfQUNDRUxfU0FWQUdFM0Q6CiAJCXBhci0+Y2hpcCA9IFMzX1NBVkFHRTNEOwotCQlzbnByaW50ZiAoaW5mby0+Zml4LmlkLCAxNiwgIlNhdmFnZTNEIik7CisJCXNucHJpbnRmKGluZm8tPmZpeC5pZCwgMTYsICJTYXZhZ2UzRCIpOwogCQlicmVhazsKIAljYXNlIEZCX0FDQ0VMX1NBVkFHRTNEX01WOgogCQlwYXItPmNoaXAgPSBTM19TQVZBR0UzRDsKLQkJc25wcmludGYgKGluZm8tPmZpeC5pZCwgMTYsICJTYXZhZ2UzRC1NViIpOworCQlzbnByaW50ZihpbmZvLT5maXguaWQsIDE2LCAiU2F2YWdlM0QtTVYiKTsKIAkJYnJlYWs7CiAJY2FzZSBGQl9BQ0NFTF9TQVZBR0UyMDAwOgogCQlwYXItPmNoaXAgPSBTM19TQVZBR0UyMDAwOwotCQlzbnByaW50ZiAoaW5mby0+Zml4LmlkLCAxNiwgIlNhdmFnZTIwMDAiKTsKKwkJc25wcmludGYoaW5mby0+Zml4LmlkLCAxNiwgIlNhdmFnZTIwMDAiKTsKIAkJYnJlYWs7CiAJY2FzZSBGQl9BQ0NFTF9TQVZBR0VfTVhfTVY6CiAJCXBhci0+Y2hpcCA9IFMzX1NBVkFHRV9NWDsKLQkJc25wcmludGYgKGluZm8tPmZpeC5pZCwgMTYsICJTYXZhZ2UvTVgtTVYiKTsKKwkJc25wcmludGYoaW5mby0+Zml4LmlkLCAxNiwgIlNhdmFnZS9NWC1NViIpOwogCQlicmVhazsKIAljYXNlIEZCX0FDQ0VMX1NBVkFHRV9NWDoKIAkJcGFyLT5jaGlwID0gUzNfU0FWQUdFX01YOwotCQlzbnByaW50ZiAoaW5mby0+Zml4LmlkLCAxNiwgIlNhdmFnZS9NWCIpOworCQlzbnByaW50ZihpbmZvLT5maXguaWQsIDE2LCAiU2F2YWdlL01YIik7CiAJCWJyZWFrOwogCWNhc2UgRkJfQUNDRUxfU0FWQUdFX0lYX01WOgogCQlwYXItPmNoaXAgPSBTM19TQVZBR0VfTVg7Ci0JCXNucHJpbnRmIChpbmZvLT5maXguaWQsIDE2LCAiU2F2YWdlL0lYLU1WIik7CisJCXNucHJpbnRmKGluZm8tPmZpeC5pZCwgMTYsICJTYXZhZ2UvSVgtTVYiKTsKIAkJYnJlYWs7CiAJY2FzZSBGQl9BQ0NFTF9TQVZBR0VfSVg6CiAJCXBhci0+Y2hpcCA9IFMzX1NBVkFHRV9NWDsKLQkJc25wcmludGYgKGluZm8tPmZpeC5pZCwgMTYsICJTYXZhZ2UvSVgiKTsKKwkJc25wcmludGYoaW5mby0+Zml4LmlkLCAxNiwgIlNhdmFnZS9JWCIpOwogCQlicmVhazsKIAljYXNlIEZCX0FDQ0VMX1BST1NBVkFHRV9QTToKIAkJcGFyLT5jaGlwID0gUzNfUFJPU0FWQUdFOwotCQlzbnByaW50ZiAoaW5mby0+Zml4LmlkLCAxNiwgIlByb1NhdmFnZVBNIik7CisJCXNucHJpbnRmKGluZm8tPmZpeC5pZCwgMTYsICJQcm9TYXZhZ2VQTSIpOwogCQlicmVhazsKIAljYXNlIEZCX0FDQ0VMX1BST1NBVkFHRV9LTToKIAkJcGFyLT5jaGlwID0gUzNfUFJPU0FWQUdFOwotCQlzbnByaW50ZiAoaW5mby0+Zml4LmlkLCAxNiwgIlByb1NhdmFnZUtNIik7CisJCXNucHJpbnRmKGluZm8tPmZpeC5pZCwgMTYsICJQcm9TYXZhZ2VLTSIpOwogCQlicmVhazsKIAljYXNlIEZCX0FDQ0VMX1MzVFdJU1RFUl9QOgogCQlwYXItPmNoaXAgPSBTM19QUk9TQVZBR0U7Ci0JCXNucHJpbnRmIChpbmZvLT5maXguaWQsIDE2LCAiVHdpc3RlclAiKTsKKwkJc25wcmludGYoaW5mby0+Zml4LmlkLCAxNiwgIlR3aXN0ZXJQIik7CiAJCWJyZWFrOwogCWNhc2UgRkJfQUNDRUxfUzNUV0lTVEVSX0s6CiAJCXBhci0+Y2hpcCA9IFMzX1BST1NBVkFHRTsKLQkJc25wcmludGYgKGluZm8tPmZpeC5pZCwgMTYsICJUd2lzdGVySyIpOworCQlzbnByaW50ZihpbmZvLT5maXguaWQsIDE2LCAiVHdpc3RlcksiKTsKIAkJYnJlYWs7CiAJY2FzZSBGQl9BQ0NFTF9QUk9TQVZBR0VfRERSOgogCQlwYXItPmNoaXAgPSBTM19QUk9TQVZBR0U7Ci0JCXNucHJpbnRmIChpbmZvLT5maXguaWQsIDE2LCAiUHJvU2F2YWdlRERSIik7CisJCXNucHJpbnRmKGluZm8tPmZpeC5pZCwgMTYsICJQcm9TYXZhZ2VERFIiKTsKIAkJYnJlYWs7CiAJY2FzZSBGQl9BQ0NFTF9QUk9TQVZBR0VfRERSSzoKIAkJcGFyLT5jaGlwID0gUzNfUFJPU0FWQUdFOwotCQlzbnByaW50ZiAoaW5mby0+Zml4LmlkLCAxNiwgIlByb1NhdmFnZTgiKTsKKwkJc25wcmludGYoaW5mby0+Zml4LmlkLCAxNiwgIlByb1NhdmFnZTgiKTsKIAkJYnJlYWs7CiAJfQogCkBAIC0xOTYwLDcgKzIxMzQsNyBAQAogCQlpbmZvLT5waXhtYXAuYnVmX2FsaWduID0gNDsKIAkJaW5mby0+cGl4bWFwLmFjY2Vzc19hbGlnbiA9IDMyOwogCi0JCWVyciA9IGZiX2FsbG9jX2NtYXAgKCZpbmZvLT5jbWFwLCBOUl9QQUxFVFRFLCAwKTsKKwkJZXJyID0gZmJfYWxsb2NfY21hcCgmaW5mby0+Y21hcCwgTlJfUEFMRVRURSwgMCk7CiAJCWlmICghZXJyKQogCQlpbmZvLT5mbGFncyB8PSBGQklORk9fSFdBQ0NFTF9DT1BZQVJFQSB8CiAJICAgICAgICAgICAgICAgICAgICAgICBGQklORk9fSFdBQ0NFTF9GSUxMUkVDVCB8CkBAIC0xOTcyLDggKzIxNDYsOCBAQAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotc3RhdGljIGludCBfX2RldmluaXQgc2F2YWdlZmJfcHJvYmUgKHN0cnVjdCBwY2lfZGV2KiBkZXYsCi0JCQkJICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCogaWQpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzYXZhZ2VmYl9wcm9iZShzdHJ1Y3QgcGNpX2RldiogZGV2LAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCogaWQpCiB7CiAJc3RydWN0IGZiX2luZm8gKmluZm87CiAJc3RydWN0IHNhdmFnZWZiX3BhciAqcGFyOwpAQCAtMjA4NSwxMiArMjI1OSwxMiBAQAogCWZiX2Rlc3Ryb3lfbW9kZWRiKGluZm8tPm1vbnNwZWNzLm1vZGVkYik7CiAJaW5mby0+bW9uc3BlY3MubW9kZWRiID0gTlVMTDsKIAotCWVyciA9IHJlZ2lzdGVyX2ZyYW1lYnVmZmVyIChpbmZvKTsKKwllcnIgPSByZWdpc3Rlcl9mcmFtZWJ1ZmZlcihpbmZvKTsKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBmYWlsZWQ7CiAKLQlwcmludGsgKEtFUk5fSU5GTyAiZmI6IFMzICVzIGZyYW1lIGJ1ZmZlciBkZXZpY2VcbiIsCi0JCWluZm8tPmZpeC5pZCk7CisJcHJpbnRrKEtFUk5fSU5GTyAiZmI6IFMzICVzIGZyYW1lIGJ1ZmZlciBkZXZpY2VcbiIsCisJICAgICAgIGluZm8tPmZpeC5pZCk7CiAKIAkvKgogCSAqIE91ciBkcml2ZXIgZGF0YQpAQCAtMjEwMywxMCArMjI3NywxMCBAQAogI2lmZGVmIENPTkZJR19GQl9TQVZBR0VfSTJDCiAJc2F2YWdlZmJfZGVsZXRlX2kyY19idXNzZXMoaW5mbyk7CiAjZW5kaWYKLQlmYl9hbGxvY19jbWFwICgmaW5mby0+Y21hcCwgMCwgMCk7CisJZmJfYWxsb2NfY21hcCgmaW5mby0+Y21hcCwgMCwgMCk7CiAJc2F2YWdlX3VubWFwX3ZpZGVvKGluZm8pOwogIGZhaWxlZF92aWRlbzoKLQlzYXZhZ2VfdW5tYXBfbW1pbyAoaW5mbyk7CisJc2F2YWdlX3VubWFwX21taW8oaW5mbyk7CiAgZmFpbGVkX21taW86CiAJa2ZyZWUoaW5mby0+cGl4bWFwLmFkZHIpOwogIGZhaWxlZF9pbml0OgpAQCAtMjExNyw3ICsyMjkxLDcgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgdm9pZCBfX2RldmV4aXQgc2F2YWdlZmJfcmVtb3ZlIChzdHJ1Y3QgcGNpX2RldiAqZGV2KQorc3RhdGljIHZvaWQgX19kZXZleGl0IHNhdmFnZWZiX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewogCXN0cnVjdCBmYl9pbmZvICppbmZvID0gcGNpX2dldF9kcnZkYXRhKGRldik7CiAKQEAgLTIxMjksMTYgKzIzMDMsMTYgQEAKIAkJICogd2Ugd2lsbCBiZSBsZWF2aW5nIGhvb2tzIHRoYXQgY291bGQgY2F1c2UKIAkJICogb29wc2VuIGxheWluZyBhcm91bmQuCiAJCSAqLwotCQlpZiAodW5yZWdpc3Rlcl9mcmFtZWJ1ZmZlciAoaW5mbykpCi0JCQlwcmludGsgKEtFUk5fV0FSTklORyAic2F2YWdlZmI6IGRhbmdlciBkYW5nZXIhICIKLQkJCQkiT29wc2VuIGltbWluZW50IVxuIik7CisJCWlmICh1bnJlZ2lzdGVyX2ZyYW1lYnVmZmVyKGluZm8pKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAic2F2YWdlZmI6IGRhbmdlciBkYW5nZXIhICIKKwkJCSAgICAgICAiT29wc2VuIGltbWluZW50IVxuIik7CiAKICNpZmRlZiBDT05GSUdfRkJfU0FWQUdFX0kyQwogCQlzYXZhZ2VmYl9kZWxldGVfaTJjX2J1c3NlcyhpbmZvKTsKICNlbmRpZgotCQlmYl9hbGxvY19jbWFwICgmaW5mby0+Y21hcCwgMCwgMCk7Ci0JCXNhdmFnZV91bm1hcF92aWRlbyAoaW5mbyk7Ci0JCXNhdmFnZV91bm1hcF9tbWlvIChpbmZvKTsKKwkJZmJfYWxsb2NfY21hcCgmaW5mby0+Y21hcCwgMCwgMCk7CisJCXNhdmFnZV91bm1hcF92aWRlbyhpbmZvKTsKKwkJc2F2YWdlX3VubWFwX21taW8oaW5mbyk7CiAJCWtmcmVlKGluZm8tPnBpeG1hcC5hZGRyKTsKIAkJcGNpX3JlbGVhc2VfcmVnaW9ucyhkZXYpOwogCQlmcmFtZWJ1ZmZlcl9yZWxlYXNlKGluZm8pOwpAQCAtMjE1MSw3ICsyMzI1LDcgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbnQgc2F2YWdlZmJfc3VzcGVuZCAoc3RydWN0IHBjaV9kZXYqIGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQorc3RhdGljIGludCBzYXZhZ2VmYl9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2KiBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKIHsKIAlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IHBjaV9nZXRfZHJ2ZGF0YShkZXYpOwogCXN0cnVjdCBzYXZhZ2VmYl9wYXIgKnBhciA9IGluZm8tPnBhcjsKQEAgLTIxNzcsNiArMjM1MSw3IEBACiAJCWluZm8tPmZib3BzLT5mYl9zeW5jKGluZm8pOwogCiAJc2F2YWdlZmJfYmxhbmsoRkJfQkxBTktfUE9XRVJET1dOLCBpbmZvKTsKKwlzYXZhZ2Vfc2V0X2RlZmF1bHRfcGFyKHBhciwgJnBhci0+c2F2ZSk7CiAJc2F2YWdlX2Rpc2FibGVfbW1pbyhwYXIpOwogCXBjaV9zYXZlX3N0YXRlKGRldik7CiAJcGNpX2Rpc2FibGVfZGV2aWNlKGRldik7CkBAIC0yMTg2LDcgKzIzNjEsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHNhdmFnZWZiX3Jlc3VtZSAoc3RydWN0IHBjaV9kZXYqIGRldikKK3N0YXRpYyBpbnQgc2F2YWdlZmJfcmVzdW1lKHN0cnVjdCBwY2lfZGV2KiBkZXYpCiB7CiAJc3RydWN0IGZiX2luZm8gKmluZm8gPSBwY2lfZ2V0X2RydmRhdGEoZGV2KTsKIAlzdHJ1Y3Qgc2F2YWdlZmJfcGFyICpwYXIgPSBpbmZvLT5wYXI7CkBAIC0yMjEwLDE1ICsyMzg1LDE1IEBACiAJcGNpX3NldF9wb3dlcl9zdGF0ZShkZXYsIFBDSV9EMCk7CiAJcGNpX3Jlc3RvcmVfc3RhdGUoZGV2KTsKIAotCWlmKHBjaV9lbmFibGVfZGV2aWNlKGRldikpCisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKGRldikpCiAJCURCRygiZXJyIik7CiAKIAlwY2lfc2V0X21hc3RlcihkZXYpOwogCXNhdmFnZV9lbmFibGVfbW1pbyhwYXIpOwogCXNhdmFnZV9pbml0X2h3KHBhcik7Ci0Jc2F2YWdlZmJfc2V0X3BhciAoaW5mbyk7CisJc2F2YWdlZmJfc2V0X3BhcihpbmZvKTsKKwlmYl9zZXRfc3VzcGVuZChpbmZvLCAwKTsKIAlzYXZhZ2VmYl9ibGFuayhGQl9CTEFOS19VTkJMQU5LLCBpbmZvKTsKLQlmYl9zZXRfc3VzcGVuZCAoaW5mbywgMCk7CiAJcmVsZWFzZV9jb25zb2xlX3NlbSgpOwogCiAJcmV0dXJuIDA7CkBAIC0yMzExLDEwICsyNDg2LDEwIEBACiAKIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKiogZXhpdC10aW1lIG9ubHkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwogCi1zdGF0aWMgdm9pZCBfX2V4aXQgc2F2YWdlX2RvbmUgKHZvaWQpCitzdGF0aWMgdm9pZCBfX2V4aXQgc2F2YWdlX2RvbmUodm9pZCkKIHsKIAlEQkcoInNhdmFnZV9kb25lIik7Ci0JcGNpX3VucmVnaXN0ZXJfZHJpdmVyICgmc2F2YWdlZmJfZHJpdmVyKTsKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnNhdmFnZWZiX2RyaXZlcik7CiB9CiAKIApAQCAtMjM0NSw3ICsyNTIwLDcgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAlzYXZhZ2VmYl9zZXR1cChvcHRpb24pOwotCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyICgmc2F2YWdlZmJfZHJpdmVyKTsKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmc2F2YWdlZmJfZHJpdmVyKTsKIAogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3Npcy9zaXNfbWFpbi5jIGIvZHJpdmVycy92aWRlby9zaXMvc2lzX21haW4uYwppbmRleCA4YWRmNWJmLi5jNjNjMGU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3Npcy9zaXNfbWFpbi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vc2lzL3Npc19tYWluLmMKQEAgLTI3NSw3ICsyNzUsNyBAQAogc3RhdGljIHZvaWQgX19kZXZpbml0CiBzaXNmYl9nZXRfdmdhX21vZGVfZnJvbV9rZXJuZWwodm9pZCkKIHsKLSNpZiAoZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKSkgJiYgZGVmaW5lZChDT05GSUdfVklERU9fU0VMRUNUKQorI2lmZGVmIENPTkZJR19YODYKIAljaGFyIG15bW9kZVszMl07CiAJaW50ICBteWRlcHRoID0gc2NyZWVuX2luZm8ubGZiX2RlcHRoOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3NrZWxldG9uZmIuYyBiL2RyaXZlcnMvdmlkZW8vc2tlbGV0b25mYi5jCmluZGV4IDliNzA3NzcuLjY3ZjQyOWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vc2tlbGV0b25mYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vc2tlbGV0b25mYi5jCkBAIC05MDYsMTEgKzkwNiw2IEBACiB9CiAjZW5kaWYKIAotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotbW9kdWxlX2luaXQoeHh4ZmJfaW5pdCk7Ci1tb2R1bGVfZXhpdCh4eHhmYl9leGl0KTsKLQotCiAgICAgLyoKICAgICAgKiAgU2V0dXAKICAgICAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vdGdhZmIuYyBiL2RyaXZlcnMvdmlkZW8vdGdhZmIuYwppbmRleCA3Mzk4YmQ0Li42YzJjNzhhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3RnYWZiLmMKKysrIGIvZHJpdmVycy92aWRlby90Z2FmYi5jCkBAIC0yNiw3ICsyNiw2IEBACiAjaW5jbHVkZSA8bGludXgvc2VsZWN0aW9uLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8dmlkZW8vdGdhZmIuaD4KLSNpbmNsdWRlIDxsaW51eC9zZWxlY3Rpb24uaD4KIAogLyoKICAqIExvY2FsIGZ1bmN0aW9ucy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vdHJpZGVudGZiLmMgYi9kcml2ZXJzL3ZpZGVvL3RyaWRlbnRmYi5jCmluZGV4IDlhYzJkMzEuLjQxZjhjMmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vdHJpZGVudGZiLmMKKysrIGIvZHJpdmVycy92aWRlby90cmlkZW50ZmIuYwpAQCAtNTUxLDcgKzU1MSw3IEBACiAjZGVmaW5lIGNydGNfdW5sb2NrKCkJd3JpdGUzWDQoQ1JUVlN5bmNFbmQsIHJlYWQzWDQoQ1JUVlN5bmNFbmQpICYgMHg3RikKIAogLyogIFJldHVybiBmbGF0IHBhbmVsJ3MgbWF4aW11bSB4IHJlc29sdXRpb24gKi8KLXN0YXRpYyBpbnQgX19pbml0IGdldF9uYXRpdmV4KHZvaWQpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBnZXRfbmF0aXZleCh2b2lkKQogewogCWludCB4LHksdG1wOwogCkBAIC02NTgsNyArNjU4LDcgQEAKICAqIElmIHdlIHNlZSB0aGF0IEZQIGlzIGFjdGl2ZSB3ZSBhc3N1bWUgd2UgaGF2ZSBvbmUuCiAgKiBPdGhlcndpc2Ugd2UgaGF2ZSBhIENSVCBkaXNwbGF5LlVzZXIgY2FuIG92ZXJyaWRlLgogICovCi1zdGF0aWMgdW5zaWduZWQgaW50IF9faW5pdCBnZXRfZGlzcGxheXR5cGUodm9pZCkKK3N0YXRpYyB1bnNpZ25lZCBpbnQgX19kZXZpbml0IGdldF9kaXNwbGF5dHlwZSh2b2lkKQogewogCWlmIChmcCkKIAkJcmV0dXJuIERJU1BMQVlfRlA7CkBAIC02NjgsNyArNjY4LDcgQEAKIH0KIAogLyogVHJ5IGRldGVjdGluZyB0aGUgdmlkZW8gbWVtb3J5IHNpemUgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgX19pbml0IGdldF9tZW1zaXplKHZvaWQpCitzdGF0aWMgdW5zaWduZWQgaW50IF9fZGV2aW5pdCBnZXRfbWVtc2l6ZSh2b2lkKQogewogCXVuc2lnbmVkIGNoYXIgdG1wLCB0bXAyOwogCXVuc2lnbmVkIGludCBrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby92ZXNhZmIuYyBiL2RyaXZlcnMvdmlkZW8vdmVzYWZiLmMKaW5kZXggYjBiOWFjZi4uNTcxODkyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby92ZXNhZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3Zlc2FmYi5jCkBAIC01MSw3ICs1MSw3IEBACiBzdGF0aWMgaW50ICAgICAgICAgICAgIG10cnIgICAgICA9IDA7IC8qIGRpc2FibGUgbXRyciAqLwogc3RhdGljIGludAkgICAgICAgdnJhbV9yZW1hcCBfX2luaXRkYXRhID0gMDsgLyogU2V0IGFtb3VudCBvZiBtZW1vcnkgdG8gYmUgdXNlZCAqLwogc3RhdGljIGludAkgICAgICAgdnJhbV90b3RhbCBfX2luaXRkYXRhID0gMDsgLyogU2V0IHRvdGFsIGFtb3VudCBvZiBtZW1vcnkgKi8KLXN0YXRpYyBpbnQgICAgICAgICAgICAgcG1pX3NldHBhbCA9IDA7CS8qIHBtaSBmb3IgcGFsZXR0ZSBjaGFuZ2VzID8/PyAqLworc3RhdGljIGludCAgICAgICAgICAgICBwbWlfc2V0cGFsID0gMTsJLyogcG1pIGZvciBwYWxldHRlIGNoYW5nZXMgPz8/ICovCiBzdGF0aWMgaW50ICAgICAgICAgICAgIHlwYW4gICAgICAgPSAwOyAgLyogMC4ubm90aGluZywgMS4ueXBhbiwgMi4ueXdyYXAgKi8KIHN0YXRpYyB1bnNpZ25lZCBzaG9ydCAgKnBtaV9iYXNlICA9IE5VTEw7CiBzdGF0aWMgdm9pZCAgICAgICAgICAgICgqcG1pX3N0YXJ0KSh2b2lkKTsKQEAgLTgwLDE1ICs4MCwzMCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCB2ZXNhX3NldHBhbGV0dGUoaW50IHJlZ25vLCB1bnNpZ25lZCByZWQsIHVuc2lnbmVkIGdyZWVuLAorc3RhdGljIGludCB2ZXNhX3NldHBhbGV0dGUoaW50IHJlZ25vLCB1bnNpZ25lZCByZWQsIHVuc2lnbmVkIGdyZWVuLAogCQkJICAgIHVuc2lnbmVkIGJsdWUpCiB7CiAJaW50IHNoaWZ0ID0gMTYgLSBkZXB0aDsKKwlpbnQgZXJyID0gLUVJTlZBTDsKKworLyoKKyAqIFRyeSBWR0EgcmVnaXN0ZXJzIGZpcnN0Li4uCisgKi8KKwlpZiAodmdhX2NvbXBhdCkgeworCQlvdXRiX3AocmVnbm8sICAgICAgIGRhY19yZWcpOworCQlvdXRiX3AocmVkICAgPj4gc2hpZnQsIGRhY192YWwpOworCQlvdXRiX3AoZ3JlZW4gPj4gc2hpZnQsIGRhY192YWwpOworCQlvdXRiX3AoYmx1ZSAgPj4gc2hpZnQsIGRhY192YWwpOworCQllcnIgPSAwOworCX0KIAogI2lmZGVmIF9faTM4Nl9fCi0Jc3RydWN0IHsgdV9jaGFyIGJsdWUsIGdyZWVuLCByZWQsIHBhZDsgfSBlbnRyeTsKKy8qCisgKiBGYWxsYmFjayB0byB0aGUgUE1JLi4uLgorICovCisJaWYgKGVyciAmJiBwbWlfc2V0cGFsKSB7CisJCXN0cnVjdCB7IHVfY2hhciBibHVlLCBncmVlbiwgcmVkLCBwYWQ7IH0gZW50cnk7CiAKLQlpZiAocG1pX3NldHBhbCkgewogCQllbnRyeS5yZWQgICA9IHJlZCAgID4+IHNoaWZ0OwogCQllbnRyeS5ncmVlbiA9IGdyZWVuID4+IHNoaWZ0OwogCQllbnRyeS5ibHVlICA9IGJsdWUgID4+IHNoaWZ0OwpAQCAtMTAyLDI2ICsxMTcsMTkgQEAKICAgICAgICAgICAgICAgICAgICJkIiAocmVnbm8pLCAgICAgICAgICAvKiBFRFggKi8KICAgICAgICAgICAgICAgICAgICJEIiAoJmVudHJ5KSwgICAgICAgICAvKiBFREkgKi8KICAgICAgICAgICAgICAgICAgICJTIiAoJnBtaV9wYWwpKTsgICAgICAvKiBFU0kgKi8KLQkJcmV0dXJuOworCQllcnIgPSAwOwogCX0KICNlbmRpZgogCi0vKgotICogd2l0aG91dCBwcm90ZWN0ZWQgbW9kZSBpbnRlcmZhY2UgYW5kIGlmIFZHQSBjb21wYXRpYmxlLAotICogdHJ5IFZHQSByZWdpc3RlcnMuLi4KLSAqLwotCWlmICh2Z2FfY29tcGF0KSB7Ci0JCW91dGJfcChyZWdubywgICAgICAgZGFjX3JlZyk7Ci0JCW91dGJfcChyZWQgICA+PiBzaGlmdCwgZGFjX3ZhbCk7Ci0JCW91dGJfcChncmVlbiA+PiBzaGlmdCwgZGFjX3ZhbCk7Ci0JCW91dGJfcChibHVlICA+PiBzaGlmdCwgZGFjX3ZhbCk7Ci0JfQorCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBpbnQgdmVzYWZiX3NldGNvbHJlZyh1bnNpZ25lZCByZWdubywgdW5zaWduZWQgcmVkLCB1bnNpZ25lZCBncmVlbiwKIAkJCSAgICB1bnNpZ25lZCBibHVlLCB1bnNpZ25lZCB0cmFuc3AsCiAJCQkgICAgc3RydWN0IGZiX2luZm8gKmluZm8pCiB7CisJaW50IGVyciA9IDA7CisKIAkvKgogCSAqICBTZXQgYSBzaW5nbGUgY29sb3IgcmVnaXN0ZXIuIFRoZSB2YWx1ZXMgc3VwcGxpZWQgYXJlCiAJICogIGFscmVhZHkgcm91bmRlZCBkb3duIHRvIHRoZSBoYXJkd2FyZSdzIGNhcGFiaWxpdGllcwpAQCAtMTMzLDcgKzE0MSw3IEBACiAJCXJldHVybiAxOwogCiAJaWYgKGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCA9PSA4KQotCQl2ZXNhX3NldHBhbGV0dGUocmVnbm8scmVkLGdyZWVuLGJsdWUpOworCQllcnIgPSB2ZXNhX3NldHBhbGV0dGUocmVnbm8scmVkLGdyZWVuLGJsdWUpOwogCWVsc2UgaWYgKHJlZ25vIDwgMTYpIHsKIAkJc3dpdGNoIChpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwpIHsKIAkJY2FzZSAxNjoKQEAgLTE2NCw3ICsxNzIsNyBAQAogCQl9CiAJfQogCi0JcmV0dXJuIDA7CisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIHN0cnVjdCBmYl9vcHMgdmVzYWZiX29wcyA9IHsKQEAgLTQ2MCw5ICs0NjgsNyBAQAogCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSB2ZXNhZmJfZGV2aWNlID0gewotCS5uYW1lCT0gInZlc2FmYiIsCi19Oworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnZlc2FmYl9kZXZpY2U7CiAKIHN0YXRpYyBpbnQgX19pbml0IHZlc2FmYl9pbml0KHZvaWQpCiB7CkBAIC00NzUsMTAgKzQ4MSwxOSBAQAogCXJldCA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmdmVzYWZiX2RyaXZlcik7CiAKIAlpZiAoIXJldCkgewotCQlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnZlc2FmYl9kZXZpY2UpOwotCQlpZiAocmV0KQorCQl2ZXNhZmJfZGV2aWNlID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKCJ2ZXNhZmIiLCAwKTsKKworCQlpZiAodmVzYWZiX2RldmljZSkKKwkJCXJldCA9IHBsYXRmb3JtX2RldmljZV9hZGQodmVzYWZiX2RldmljZSk7CisJCWVsc2UKKwkJCXJldCA9IC1FTk9NRU07CisKKwkJaWYgKHJldCkgeworCQkJcGxhdGZvcm1fZGV2aWNlX3B1dCh2ZXNhZmJfZGV2aWNlKTsKIAkJCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZ2ZXNhZmJfZHJpdmVyKTsKKwkJfQogCX0KKwogCXJldHVybiByZXQ7CiB9CiBtb2R1bGVfaW5pdCh2ZXNhZmJfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3ZmYi5jIGIvZHJpdmVycy92aWRlby92ZmIuYwppbmRleCA3N2VlZDFmLi5kMDczZmZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3ZmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vdmZiLmMKQEAgLTM5OCwxMiArMzk4LDYgQEAKICAgICAgKiAgSW5pdGlhbGlzYXRpb24KICAgICAgKi8KIAotc3RhdGljIHZvaWQgdmZiX3BsYXRmb3JtX3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2aWNlKQotewotCS8vIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIHJlZmVyZW5jZSBjb3VudCBnb2VzIHRvIHplcm8uCi0JZGV2X2VycihkZXZpY2UsICJUaGlzIGRyaXZlciBpcyBicm9rZW4sIHBsZWFzZSBidWcgdGhlIGF1dGhvcnMgc28gdGhleSB3aWxsIGZpeCBpdC5cbiIpOwotfQotCiBzdGF0aWMgaW50IF9faW5pdCB2ZmJfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBmYl9pbmZvICppbmZvOwpAQCAtNDgyLDEzICs0NzYsNyBAQAogCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSB2ZmJfZGV2aWNlID0gewotCS5uYW1lCT0gInZmYiIsCi0JLmlkCT0gMCwKLQkuZGV2CT0gewotCQkucmVsZWFzZSA9IHZmYl9wbGF0Zm9ybV9yZWxlYXNlLAotCX0KLX07CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqdmZiX2RldmljZTsKIAogc3RhdGljIGludCBfX2luaXQgdmZiX2luaXQodm9pZCkKIHsKQEAgLTUwOCwxMCArNDk2LDE5IEBACiAJcmV0ID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZ2ZmJfZHJpdmVyKTsKIAogCWlmICghcmV0KSB7Ci0JCXJldCA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmdmZiX2RldmljZSk7Ci0JCWlmIChyZXQpCisJCXZmYl9kZXZpY2UgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoInZmYiIsIDApOworCisJCWlmICh2ZmJfZGV2aWNlKQorCQkJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZCh2ZmJfZGV2aWNlKTsKKwkJZWxzZQorCQkJcmV0ID0gLUVOT01FTTsKKworCQlpZiAocmV0KSB7CisJCQlwbGF0Zm9ybV9kZXZpY2VfcHV0KHZmYl9kZXZpY2UpOwogCQkJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnZmYl9kcml2ZXIpOworCQl9CiAJfQorCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNTIwLDcgKzUxNyw3IEBACiAjaWZkZWYgTU9EVUxFCiBzdGF0aWMgdm9pZCBfX2V4aXQgdmZiX2V4aXQodm9pZCkKIHsKLQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcigmdmZiX2RldmljZSk7CisJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIodmZiX2RldmljZSk7CiAJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnZmYl9kcml2ZXIpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3ZnYTE2ZmIuYyBiL2RyaXZlcnMvdmlkZW8vdmdhMTZmYi5jCmluZGV4IDRmZDJhMjcuLjNjNDA0YzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vdmdhMTZmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vdmdhMTZmYi5jCkBAIC0xMzM0LDkgKzEzMzQsOCBAQAogfQogI2VuZGlmCiAKLXN0YXRpYyBpbnQgX19pbml0IHZnYTE2ZmJfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2aWNlKQorc3RhdGljIGludCBfX2luaXQgdmdhMTZmYl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldmljZSk7CiAJc3RydWN0IGZiX2luZm8gKmluZm87CiAJc3RydWN0IHZnYTE2ZmJfcGFyICpwYXI7CiAJaW50IGk7CkBAIC0xNDAzLDcgKzE0MDIsNyBAQAogCiAJcHJpbnRrKEtFUk5fSU5GTyAiZmIlZDogJXMgZnJhbWUgYnVmZmVyIGRldmljZVxuIiwKIAkgICAgICAgaW5mby0+bm9kZSwgaW5mby0+Zml4LmlkKTsKLQlkZXZfc2V0X2RydmRhdGEoZGV2aWNlLCBpbmZvKTsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShkZXYsIGluZm8pOwogCiAJcmV0dXJuIDA7CiAKQEAgLTE0MTcsOSArMTQxNiw5IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCB2Z2ExNmZiX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCitzdGF0aWMgaW50IHZnYTE2ZmJfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXZpY2UpOworCXN0cnVjdCBmYl9pbmZvICppbmZvID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2KTsKIAogCWlmIChpbmZvKSB7CiAJCXVucmVnaXN0ZXJfZnJhbWVidWZmZXIoaW5mbyk7CkBAIC0xNDMyLDE2ICsxNDMxLDE1IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZGV2aWNlX2RyaXZlciB2Z2ExNmZiX2RyaXZlciA9IHsKLQkubmFtZSA9ICJ2Z2ExNmZiIiwKLQkuYnVzICA9ICZwbGF0Zm9ybV9idXNfdHlwZSwKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHZnYTE2ZmJfZHJpdmVyID0gewogCS5wcm9iZSA9IHZnYTE2ZmJfcHJvYmUsCiAJLnJlbW92ZSA9IHZnYTE2ZmJfcmVtb3ZlLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gInZnYTE2ZmIiLAorCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSB2Z2ExNmZiX2RldmljZSA9IHsKLQkubmFtZSA9ICJ2Z2ExNmZiIiwKLX07CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqdmdhMTZmYl9kZXZpY2U7CiAKIHN0YXRpYyBpbnQgX19pbml0IHZnYTE2ZmJfaW5pdCh2b2lkKQogewpAQCAtMTQ1NCwxMiArMTQ1MiwyMCBAQAogCiAJdmdhMTZmYl9zZXR1cChvcHRpb24pOwogI2VuZGlmCi0JcmV0ID0gZHJpdmVyX3JlZ2lzdGVyKCZ2Z2ExNmZiX2RyaXZlcik7CisJcmV0ID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZ2Z2ExNmZiX2RyaXZlcik7CiAKIAlpZiAoIXJldCkgewotCQlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnZnYTE2ZmJfZGV2aWNlKTsKLQkJaWYgKHJldCkKLQkJCWRyaXZlcl91bnJlZ2lzdGVyKCZ2Z2ExNmZiX2RyaXZlcik7CisJCXZnYTE2ZmJfZGV2aWNlID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKCJ2Z2ExNmZiIiwgMCk7CisKKwkJaWYgKHZnYTE2ZmJfZGV2aWNlKQorCQkJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZCh2Z2ExNmZiX2RldmljZSk7CisJCWVsc2UKKwkJCXJldCA9IC1FTk9NRU07CisKKwkJaWYgKHJldCkgeworCQkJcGxhdGZvcm1fZGV2aWNlX3B1dCh2Z2ExNmZiX2RldmljZSk7CisJCQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmdmdhMTZmYl9kcml2ZXIpOworCQl9CiAJfQogCiAJcmV0dXJuIHJldDsKQEAgLTE0NjcsOCArMTQ3Myw4IEBACiAKIHN0YXRpYyB2b2lkIF9fZXhpdCB2Z2ExNmZiX2V4aXQodm9pZCkKIHsKLQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcigmdmdhMTZmYl9kZXZpY2UpOwotCWRyaXZlcl91bnJlZ2lzdGVyKCZ2Z2ExNmZiX2RyaXZlcik7CisJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIodmdhMTZmYl9kZXZpY2UpOworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZ2Z2ExNmZiX2RyaXZlcik7CiB9CiAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2ZzLzlwL211eC5jIGIvZnMvOXAvbXV4LmMKaW5kZXggZjQ0MDdlYi4uMTJlMWJhYSAxMDA2NDQKLS0tIGEvZnMvOXAvbXV4LmMKKysrIGIvZnMvOXAvbXV4LmMKQEAgLTcxMiw3ICs3MTIsNyBAQAogICogdjlmc19zZW5kX3JlcXVlc3QgLSBzZW5kIDlQIHJlcXVlc3QKICAqIFRoZSBmdW5jdGlvbiBjYW4gc2xlZXAgdW50aWwgdGhlIHJlcXVlc3QgaXMgc2NoZWR1bGVkIGZvciBzZW5kaW5nLgogICogVGhlIGZ1bmN0aW9uIGNhbiBiZSBpbnRlcnJ1cHRlZC4gUmV0dXJuIGZyb20gdGhlIGZ1bmN0aW9uIGlzIG5vdAotICogYSBndWFyYW50ZWUgdGhhdCB0aGUgcmVxdWVzdCBpcyBzZW50IHN1Y2Nlc2Z1bGx5LiBDYW4gcmV0dXJuIGVycm9ycworICogYSBndWFyYW50ZWUgdGhhdCB0aGUgcmVxdWVzdCBpcyBzZW50IHN1Y2Nlc3NmdWxseS4gQ2FuIHJldHVybiBlcnJvcnMKICAqIHRoYXQgY2FuIGJlIHJldHJpZXZlZCBieSBQVFJfRVJSIG1hY3Jvcy4KICAqCiAgKiBAbTogbXV4IGRhdGEKZGlmZiAtLWdpdCBhL2ZzLzlwL3Zmc19pbm9kZS5jIGIvZnMvOXAvdmZzX2lub2RlLmMKaW5kZXggMmNiODdiYS4uNWM2YmRmOCAxMDA2NDQKLS0tIGEvZnMvOXAvdmZzX2lub2RlLmMKKysrIGIvZnMvOXAvdmZzX2lub2RlLmMKQEAgLTUzMCw5ICs1MzAsNiBAQAogCWlmICh2ZmlkKQogCQl2OWZzX2ZpZF9kZXN0cm95KHZmaWQpOwogCi0JaWYgKGlub2RlKQotCQlpcHV0KGlub2RlKTsKLQogCXJldHVybiBlcnI7CiB9CiAKQEAgLTEwNTQsNiArMTA1MSw5IEBACiAJaW50IHJldDsKIAljaGFyICpsaW5rID0gX19nZXRuYW1lKCk7CiAKKwlpZiAodW5saWtlbHkoIWxpbmspKQorCQlyZXR1cm4gLUVOT01FTTsKKwogCWlmIChidWZsZW4gPiBQQVRIX01BWCkKIAkJYnVmbGVuID0gUEFUSF9NQVg7CiAKQEAgLTExNzEsOSArMTE3MSw2IEBACiAJaWYgKHZmaWQpCiAJCXY5ZnNfZmlkX2Rlc3Ryb3kodmZpZCk7CiAKLQlpZiAoaW5vZGUpCi0JCWlwdXQoaW5vZGUpOwotCiAJcmV0dXJuIGVycjsKIAogfQpAQCAtMTIyNyw2ICsxMjI0LDkgQEAKIAl9CiAKIAluYW1lID0gX19nZXRuYW1lKCk7CisJaWYgKHVubGlrZWx5KCFuYW1lKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKIAlzcHJpbnRmKG5hbWUsICIlZFxuIiwgb2xkZmlkLT5maWQpOwogCXJldHZhbCA9IHY5ZnNfdmZzX21rc3BlY2lhbChkaXIsIGRlbnRyeSwgVjlGU19ETUxJTkssIG5hbWUpOwogCV9fcHV0bmFtZShuYW1lKTsKZGlmZiAtLWdpdCBhL2ZzLzlwL3Zmc19zdXBlci5jIGIvZnMvOXAvdmZzX3N1cGVyLmMKaW5kZXggODcyOTQzMC4uOGIxNWJiMiAxMDA2NDQKLS0tIGEvZnMvOXAvdmZzX3N1cGVyLmMKKysrIGIvZnMvOXAvdmZzX3N1cGVyLmMKQEAgLTI1NiwxMSArMjU2LDEyIEBACiB9CiAKIHN0YXRpYyB2b2lkCi12OWZzX3Vtb3VudF9iZWdpbihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQordjlmc191bW91bnRfYmVnaW4oc3RydWN0IHZmc21vdW50ICp2ZnNtbnQsIGludCBmbGFncykKIHsKLQlzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzID0gc2ItPnNfZnNfaW5mbzsKKwlzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzID0gdmZzbW50LT5tbnRfc2ItPnNfZnNfaW5mbzsKIAotCXY5ZnNfc2Vzc2lvbl9jYW5jZWwodjlzZXMpOworCWlmIChmbGFncyAmIE1OVF9GT1JDRSkKKwkJdjlmc19zZXNzaW9uX2NhbmNlbCh2OXNlcyk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyB2OWZzX3N1cGVyX29wcyA9IHsKZGlmZiAtLWdpdCBhL2ZzL0tjb25maWcgYi9mcy9LY29uZmlnCmluZGV4IDJhYTQ2MjQuLjZjNTA1MTggMTAwNjQ0Ci0tLSBhL2ZzL0tjb25maWcKKysrIGIvZnMvS2NvbmZpZwpAQCAtNzc2LDcgKzc3Niw4IEBACiBtZW51ICJQc2V1ZG8gZmlsZXN5c3RlbXMiCiAKIGNvbmZpZyBQUk9DX0ZTCi0JYm9vbCAiL3Byb2MgZmlsZSBzeXN0ZW0gc3VwcG9ydCIKKwlib29sICIvcHJvYyBmaWxlIHN5c3RlbSBzdXBwb3J0IiBpZiBFTUJFRERFRAorCWRlZmF1bHQgeQogCWhlbHAKIAkgIFRoaXMgaXMgYSB2aXJ0dWFsIGZpbGUgc3lzdGVtIHByb3ZpZGluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3RhdHVzCiAJICBvZiB0aGUgc3lzdGVtLiAiVmlydHVhbCIgbWVhbnMgdGhhdCBpdCBkb2Vzbid0IHRha2UgdXAgYW55IHNwYWNlIG9uCkBAIC0xMzcwLDExICsxMzcxLDE5IEBACiAKIGNvbmZpZyBVRlNfRlNfV1JJVEUKIAlib29sICJVRlMgZmlsZSBzeXN0ZW0gd3JpdGUgc3VwcG9ydCAoREFOR0VST1VTKSIKLQlkZXBlbmRzIG9uIFVGU19GUyAmJiBFWFBFUklNRU5UQUwgJiYgQlJPS0VOCisJZGVwZW5kcyBvbiBVRlNfRlMgJiYgRVhQRVJJTUVOVEFMCiAJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byB0cnkgd3JpdGluZyB0byBVRlMgcGFydGl0aW9ucy4gVGhpcyBpcwogCSAgZXhwZXJpbWVudGFsLCBzbyB5b3Ugc2hvdWxkIGJhY2sgdXAgeW91ciBVRlMgcGFydGl0aW9ucyBiZWZvcmVoYW5kLgogCitjb25maWcgVUZTX0RFQlVHCisJYm9vbCAiVUZTIGRlYnVnZ2luZyIKKwlkZXBlbmRzIG9uIFVGU19GUworCWhlbHAKKwkgIElmIHlvdSBhcmUgZXhwZXJpZW5jaW5nIGFueSBwcm9ibGVtcyB3aXRoIHRoZSBVRlMgZmlsZXN5c3RlbSwgc2F5CisJICBZIGhlcmUuICBUaGlzIHdpbGwgcmVzdWx0IGluIF9tYW55XyBhZGRpdGlvbmFsIGRlYnVnZ2luZyBtZXNzYWdlcyB0byBiZQorCSAgd3JpdHRlbiB0byB0aGUgc3lzdGVtIGxvZy4KKwogZW5kbWVudQogCiBtZW51ICJOZXR3b3JrIEZpbGUgU3lzdGVtcyIKQEAgLTE0ODEsNyArMTQ5MCwxMiBAQAogCXNlbGVjdCBMT0NLRAogCXNlbGVjdCBTVU5SUEMKIAlzZWxlY3QgRVhQT1JURlMKLQlzZWxlY3QgTkZTX0FDTF9TVVBQT1JUIGlmIE5GU0RfVjNfQUNMIHx8IE5GU0RfVjJfQUNMCisJc2VsZWN0IE5GU0RfVjJfQUNMIGlmIE5GU0RfVjNfQUNMCisJc2VsZWN0IE5GU19BQ0xfU1VQUE9SVCBpZiBORlNEX1YyX0FDTAorCXNlbGVjdCBORlNEX1RDUCBpZiBORlNEX1Y0CisJc2VsZWN0IENSWVBUT19NRDUgaWYgTkZTRF9WNAorCXNlbGVjdCBDUllQVE8gaWYgTkZTRF9WNAorCXNlbGVjdCBGU19QT1NJWF9BQ0wgaWYgTkZTRF9WNAogCWhlbHAKIAkgIElmIHlvdSB3YW50IHlvdXIgTGludXggYm94IHRvIGFjdCBhcyBhbiBORlMgKnNlcnZlciosIHNvIHRoYXQgb3RoZXIKIAkgIGNvbXB1dGVycyBvbiB5b3VyIGxvY2FsIG5ldHdvcmsgd2hpY2ggc3VwcG9ydCBORlMgY2FuIGFjY2VzcyBjZXJ0YWluCkBAIC0xNTE5LDcgKzE1MzMsNiBAQAogY29uZmlnIE5GU0RfVjNfQUNMCiAJYm9vbCAiUHJvdmlkZSBzZXJ2ZXIgc3VwcG9ydCBmb3IgdGhlIE5GU3YzIEFDTCBwcm90b2NvbCBleHRlbnNpb24iCiAJZGVwZW5kcyBvbiBORlNEX1YzCi0Jc2VsZWN0IE5GU0RfVjJfQUNMCiAJaGVscAogCSAgSW1wbGVtZW50IHRoZSBORlN2MyBBQ0wgcHJvdG9jb2wgZXh0ZW5zaW9uIGZvciBtYW5pcHVsYXRpbmcgUE9TSVgKIAkgIEFjY2VzcyBDb250cm9sIExpc3RzIG9uIGV4cG9ydGVkIGZpbGUgc3lzdGVtcy4gTkZTIGNsaWVudHMgc2hvdWxkCkBAIC0xNTI5LDEwICsxNTQyLDYgQEAKIGNvbmZpZyBORlNEX1Y0CiAJYm9vbCAiUHJvdmlkZSBORlN2NCBzZXJ2ZXIgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKIAlkZXBlbmRzIG9uIE5GU0RfVjMgJiYgRVhQRVJJTUVOVEFMCi0Jc2VsZWN0IE5GU0RfVENQCi0Jc2VsZWN0IENSWVBUT19NRDUKLQlzZWxlY3QgQ1JZUFRPCi0Jc2VsZWN0IEZTX1BPU0lYX0FDTAogCWhlbHAKIAkgIElmIHlvdSB3b3VsZCBsaWtlIHRvIGluY2x1ZGUgdGhlIE5GU3Y0IHNlcnZlciBhcyB3ZWxsIGFzIHRoZSBORlN2MgogCSAgYW5kIE5GU3YzIHNlcnZlcnMsIHNheSBZIGhlcmUuICBUaGlzIGZlYXR1cmUgaXMgZXhwZXJpbWVudGFsLCBhbmQKZGlmZiAtLWdpdCBhL2ZzL2FmZnMvc3VwZXIuYyBiL2ZzL2FmZnMvc3VwZXIuYwppbmRleCA4NzY1Y2JhLi41MjAwZjQ5IDEwMDY0NAotLS0gYS9mcy9hZmZzL3N1cGVyLmMKKysrIGIvZnMvYWZmcy9zdXBlci5jCkBAIC0yNzEsNiArMjcxLDcgQEAKIAlpbnQJCQkgcmVzZXJ2ZWQ7CiAJdW5zaWduZWQgbG9uZwkJIG1vdW50X2ZsYWdzOwogCWludAkJCSB0bXBfZmxhZ3M7CS8qIGZpeCByZW1vdW50IHByb3RvdHlwZS4uLiAqLworCXU4CQkJIHNpZ1s0XTsKIAogCXByX2RlYnVnKCJBRkZTOiByZWFkX3N1cGVyKCVzKVxuIixkYXRhID8gKGNvbnN0IGNoYXIgKilkYXRhIDogIm5vIG9wdGlvbnMiKTsKIApAQCAtMzcwLDggKzM3MSw5IEBACiAJCXByaW50ayhLRVJOX0VSUiAiQUZGUzogQ2Fubm90IHJlYWQgYm9vdCBibG9ja1xuIik7CiAJCWdvdG8gb3V0X2Vycm9yOwogCX0KLQljaGtzdW0gPSBiZTMyX3RvX2NwdSgqKF9fYmUzMiAqKWJvb3RfYmgtPmJfZGF0YSk7CisJbWVtY3B5KHNpZywgYm9vdF9iaC0+Yl9kYXRhLCA0KTsKIAlicmVsc2UoYm9vdF9iaCk7CisJY2hrc3VtID0gYmUzMl90b19jcHUoKihfX2JlMzIgKilzaWcpOwogCiAJLyogRGlyY2FjaGUgZmlsZXN5c3RlbXMgYXJlIGNvbXBhdGlibGUgd2l0aCBub24tZGlyY2FjaGUgb25lcwogCSAqIHdoZW4gcmVhZGluZy4gQXMgbG9uZyBhcyB0aGV5IGFyZW4ndCBzdXBwb3J0ZWQsIHdyaXRpbmcgaXMKQEAgLTQyMCwxMSArNDIyLDExIEBACiAJfQogCiAJaWYgKG1vdW50X2ZsYWdzICYgU0ZfVkVSQk9TRSkgewotCQljaGtzdW0gPSBjcHVfdG9fYmUzMihjaGtzdW0pOwotCQlwcmludGsoS0VSTl9OT1RJQ0UgIkFGRlM6IE1vdW50aW5nIHZvbHVtZSBcIiUqc1wiOiBUeXBlPSUuM3NcXCVjLCBCbG9ja3NpemU9JWRcbiIsCi0JCQlBRkZTX1JPT1RfVEFJTChzYiwgcm9vdF9iaCktPmRpc2tfbmFtZVswXSwKKwkJdTggbGVuID0gQUZGU19ST09UX1RBSUwoc2IsIHJvb3RfYmgpLT5kaXNrX25hbWVbMF07CisJCXByaW50ayhLRVJOX05PVElDRSAiQUZGUzogTW91bnRpbmcgdm9sdW1lIFwiJS4qc1wiOiBUeXBlPSUuM3NcXCVjLCBCbG9ja3NpemU9JWRcbiIsCisJCQlsZW4gPiAzMSA/IDMxIDogbGVuLAogCQkJQUZGU19ST09UX1RBSUwoc2IsIHJvb3RfYmgpLT5kaXNrX25hbWUgKyAxLAotCQkJKGNoYXIgKikmY2hrc3VtLCgoY2hhciAqKSZjaGtzdW0pWzNdICsgJzAnLGJsb2Nrc2l6ZSk7CisJCQlzaWcsIHNpZ1szXSArICcwJywgYmxvY2tzaXplKTsKIAl9CiAKIAlzYi0+c19mbGFncyB8PSBNU19OT0RFViB8IE1TX05PU1VJRDsKZGlmZiAtLWdpdCBhL2ZzL2Fmcy9jZWxsLmMgYi9mcy9hZnMvY2VsbC5jCmluZGV4IDAwOWE5YWUuLmJmYzFmZDIgMTAwNjQ0Ci0tLSBhL2ZzL2Fmcy9jZWxsLmMKKysrIGIvZnMvYWZzL2NlbGwuYwpAQCAtNDEzLDggKzQxMyw3IEBACiAKIAkvKiB3ZSBmb3VuZCBpdCBpbiB0aGUgZ3JhdmV5YXJkIC0gcmVzdXJyZWN0IGl0ICovCiAgZm91bmRfZGVhZF9zZXJ2ZXI6Ci0JbGlzdF9kZWwoJnNlcnZlci0+bGluayk7Ci0JbGlzdF9hZGRfdGFpbCgmc2VydmVyLT5saW5rLCAmY2VsbC0+c3ZfbGlzdCk7CisJbGlzdF9tb3ZlX3RhaWwoJnNlcnZlci0+bGluaywgJmNlbGwtPnN2X2xpc3QpOwogCWFmc19nZXRfc2VydmVyKHNlcnZlcik7CiAJYWZzX2thZnN0aW1vZF9kZWxfdGltZXIoJnNlcnZlci0+dGltZW91dCk7CiAJc3Bpbl91bmxvY2soJmNlbGwtPnN2X2d5bG9jayk7CmRpZmYgLS1naXQgYS9mcy9hZnMva2Fmc2FzeW5jZC5jIGIvZnMvYWZzL2thZnNhc3luY2QuYwppbmRleCA3YWMwN2QwLi5mMDlhNzk0IDEwMDY0NAotLS0gYS9mcy9hZnMva2Fmc2FzeW5jZC5jCisrKyBiL2ZzL2Fmcy9rYWZzYXN5bmNkLmMKQEAgLTEzNiw4ICsxMzYsNyBAQAogCQkJaWYgKCFsaXN0X2VtcHR5KCZrYWZzYXN5bmNkX2FzeW5jX2F0dG5xKSkgewogCQkJCW9wID0gbGlzdF9lbnRyeShrYWZzYXN5bmNkX2FzeW5jX2F0dG5xLm5leHQsCiAJCQkJCQlzdHJ1Y3QgYWZzX2FzeW5jX29wLCBsaW5rKTsKLQkJCQlsaXN0X2RlbCgmb3AtPmxpbmspOwotCQkJCWxpc3RfYWRkX3RhaWwoJm9wLT5saW5rLAorCQkJCWxpc3RfbW92ZV90YWlsKCZvcC0+bGluaywKIAkJCQkJICAgICAgJmthZnNhc3luY2RfYXN5bmNfYnVzeXEpOwogCQkJfQogCkBAIC0yMDQsOCArMjAzLDcgQEAKIAlpbml0X3dhaXRxdWV1ZV9lbnRyeSgmb3AtPndhaXRlciwga2Fmc2FzeW5jZF90YXNrKTsKIAlhZGRfd2FpdF9xdWV1ZSgmb3AtPmNhbGwtPndhaXRxLCAmb3AtPndhaXRlcik7CiAKLQlsaXN0X2RlbCgmb3AtPmxpbmspOwotCWxpc3RfYWRkX3RhaWwoJm9wLT5saW5rLCAma2Fmc2FzeW5jZF9hc3luY19idXN5cSk7CisJbGlzdF9tb3ZlX3RhaWwoJm9wLT5saW5rLCAma2Fmc2FzeW5jZF9hc3luY19idXN5cSk7CiAKIAlzcGluX3VubG9jaygma2Fmc2FzeW5jZF9hc3luY19sb2NrKTsKIApAQCAtMjIzLDggKzIyMSw3IEBACiAKIAlzcGluX2xvY2soJmthZnNhc3luY2RfYXN5bmNfbG9jayk7CiAKLQlsaXN0X2RlbCgmb3AtPmxpbmspOwotCWxpc3RfYWRkX3RhaWwoJm9wLT5saW5rLCAma2Fmc2FzeW5jZF9hc3luY19hdHRucSk7CisJbGlzdF9tb3ZlX3RhaWwoJm9wLT5saW5rLCAma2Fmc2FzeW5jZF9hc3luY19hdHRucSk7CiAKIAlzcGluX3VubG9jaygma2Fmc2FzeW5jZF9hc3luY19sb2NrKTsKIApkaWZmIC0tZ2l0IGEvZnMvYWZzL21udHB0LmMgYi9mcy9hZnMvbW50cHQuYwppbmRleCBiNWNmOWUxLi45OTc4NWE3IDEwMDY0NAotLS0gYS9mcy9hZnMvbW50cHQuYworKysgYi9mcy9hZnMvbW50cHQuYwpAQCAtMjAzLDcgKzIwMyw3IEBACiAKIAkvKiB0cnkgYW5kIGRvIHRoZSBtb3VudCAqLwogCWtkZWJ1ZygiLS0tIGF0dGVtcHRpbmcgbW91bnQgJXMgLW8gJXMgLS0tIiwgZGV2bmFtZSwgb3B0aW9ucyk7Ci0JbW50ID0gZG9fa2Vybl9tb3VudCgiYWZzIiwgMCwgZGV2bmFtZSwgb3B0aW9ucyk7CisJbW50ID0gdmZzX2tlcm5fbW91bnQoJmFmc19mc190eXBlLCAwLCBkZXZuYW1lLCBvcHRpb25zKTsKIAlrZGVidWcoIi0tLSBtb3VudCByZXN1bHQgJXAgLS0tIiwgbW50KTsKIAogCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgZGV2bmFtZSk7CmRpZmYgLS1naXQgYS9mcy9hZnMvc2VydmVyLmMgYi9mcy9hZnMvc2VydmVyLmMKaW5kZXggNjJiMDkzYS4uMjJhZmFhZSAxMDA2NDQKLS0tIGEvZnMvYWZzL3NlcnZlci5jCisrKyBiL2ZzL2Fmcy9zZXJ2ZXIuYwpAQCAtMTIzLDggKzEyMyw3IEBACiAgcmVzdXJyZWN0X3NlcnZlcjoKIAlfZGVidWcoInJlc3VycmVjdGluZyBzZXJ2ZXIiKTsKIAotCWxpc3RfZGVsKCZ6b21iaWUtPmxpbmspOwotCWxpc3RfYWRkX3RhaWwoJnpvbWJpZS0+bGluaywgJmNlbGwtPnN2X2xpc3QpOworCWxpc3RfbW92ZV90YWlsKCZ6b21iaWUtPmxpbmssICZjZWxsLT5zdl9saXN0KTsKIAlhZnNfZ2V0X3NlcnZlcih6b21iaWUpOwogCWFmc19rYWZzdGltb2RfZGVsX3RpbWVyKCZ6b21iaWUtPnRpbWVvdXQpOwogCXNwaW5fdW5sb2NrKCZjZWxsLT5zdl9neWxvY2spOwpAQCAtMTY4LDggKzE2Nyw3IEBACiAJfQogCiAJc3Bpbl9sb2NrKCZjZWxsLT5zdl9neWxvY2spOwotCWxpc3RfZGVsKCZzZXJ2ZXItPmxpbmspOwotCWxpc3RfYWRkX3RhaWwoJnNlcnZlci0+bGluaywgJmNlbGwtPnN2X2dyYXZleWFyZCk7CisJbGlzdF9tb3ZlX3RhaWwoJnNlcnZlci0+bGluaywgJmNlbGwtPnN2X2dyYXZleWFyZCk7CiAKIAkvKiB0aW1lIG91dCBpbiAxMCBzZWNzICovCiAJYWZzX2thZnN0aW1vZF9hZGRfdGltZXIoJnNlcnZlci0+dGltZW91dCwgMTAgKiBIWik7CmRpZmYgLS1naXQgYS9mcy9hZnMvc3VwZXIuYyBiL2ZzL2Fmcy9zdXBlci5jCmluZGV4IDgyNDY4ZGYuLjY3ZDFmNWMgMTAwNjQ0Ci0tLSBhL2ZzL2Fmcy9zdXBlci5jCisrKyBiL2ZzL2Fmcy9zdXBlci5jCkBAIC00OCw3ICs0OCw3IEBACiAKIHN0YXRpYyB2b2lkIGFmc19kZXN0cm95X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpOwogCi1zdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgYWZzX2ZzX3R5cGUgPSB7CitzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBhZnNfZnNfdHlwZSA9IHsKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLm5hbWUJCT0gImFmcyIsCiAJLmdldF9zYgkJPSBhZnNfZ2V0X3NiLApkaWZmIC0tZ2l0IGEvZnMvYWZzL3N1cGVyLmggYi9mcy9hZnMvc3VwZXIuaAppbmRleCBhYzExMzYyLi4zMmRlOGNjIDEwMDY0NAotLS0gYS9mcy9hZnMvc3VwZXIuaAorKysgYi9mcy9hZnMvc3VwZXIuaApAQCAtMzgsNiArMzgsOCBAQAogCXJldHVybiBzYi0+c19mc19pbmZvOwogfQogCitleHRlcm4gc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgYWZzX2ZzX3R5cGU7CisKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAKICNlbmRpZiAvKiBfTElOVVhfQUZTX1NVUEVSX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL2Fmcy92bG9jYXRpb24uYyBiL2ZzL2Fmcy92bG9jYXRpb24uYwppbmRleCBlY2VkMjA2Li4zMzFmNzMwIDEwMDY0NAotLS0gYS9mcy9hZnMvdmxvY2F0aW9uLmMKKysrIGIvZnMvYWZzL3Zsb2NhdGlvbi5jCkBAIC0zMjYsOCArMzI2LDcgQEAKIAkvKiBmb3VuZCBpbiB0aGUgZ3JhdmV5YXJkIC0gcmVzdXJyZWN0ICovCiAJX2RlYnVnKCJmb3VuZCBpbiBncmF2ZXlhcmQiKTsKIAlhdG9taWNfaW5jKCZ2bG9jYXRpb24tPnVzYWdlKTsKLQlsaXN0X2RlbCgmdmxvY2F0aW9uLT5saW5rKTsKLQlsaXN0X2FkZF90YWlsKCZ2bG9jYXRpb24tPmxpbmssICZjZWxsLT52bF9saXN0KTsKKwlsaXN0X21vdmVfdGFpbCgmdmxvY2F0aW9uLT5saW5rLCAmY2VsbC0+dmxfbGlzdCk7CiAJc3Bpbl91bmxvY2soJmNlbGwtPnZsX2d5bG9jayk7CiAKIAlhZnNfa2Fmc3RpbW9kX2RlbF90aW1lcigmdmxvY2F0aW9uLT50aW1lb3V0KTsKQEAgLTQ3OCw4ICs0NzcsNyBAQAogCX0KIAogCS8qIG1vdmUgdG8gZ3JhdmV5YXJkIHF1ZXVlICovCi0JbGlzdF9kZWwoJnZsb2NhdGlvbi0+bGluayk7Ci0JbGlzdF9hZGRfdGFpbCgmdmxvY2F0aW9uLT5saW5rLCZjZWxsLT52bF9ncmF2ZXlhcmQpOworCWxpc3RfbW92ZV90YWlsKCZ2bG9jYXRpb24tPmxpbmssJmNlbGwtPnZsX2dyYXZleWFyZCk7CiAKIAkvKiByZW1vdmUgZnJvbSBwZW5kaW5nIHRpbWVvdXQgcXVldWUgKHJlZmNvdW50ZWQgaWYgYWN0dWFsbHkgYmVpbmcKIAkgKiB1cGRhdGVkKSAqLwpkaWZmIC0tZ2l0IGEvZnMvYWZzL3Zub2RlLmMgYi9mcy9hZnMvdm5vZGUuYwppbmRleCA5ODY3ZmVmLi5jZjYyZGE1IDEwMDY0NAotLS0gYS9mcy9hZnMvdm5vZGUuYworKysgYi9mcy9hZnMvdm5vZGUuYwpAQCAtMTA0LDggKzEwNCw3IEBACiAJCQkJCXZub2RlLT5jYl9leHBpcnkgKiBIWik7CiAKIAkJc3Bpbl9sb2NrKCZhZnNfY2JfaGFzaF9sb2NrKTsKLQkJbGlzdF9kZWwoJnZub2RlLT5jYl9oYXNoX2xpbmspOwotCQlsaXN0X2FkZF90YWlsKCZ2bm9kZS0+Y2JfaGFzaF9saW5rLAorCQlsaXN0X21vdmVfdGFpbCgmdm5vZGUtPmNiX2hhc2hfbGluaywKIAkJCSAgICAgICZhZnNfY2JfaGFzaChzZXJ2ZXIsICZ2bm9kZS0+ZmlkKSk7CiAJCXNwaW5fdW5sb2NrKCZhZnNfY2JfaGFzaF9sb2NrKTsKIApkaWZmIC0tZ2l0IGEvZnMvYWlvLmMgYi9mcy9haW8uYwppbmRleCA4YzM0YTYyLi45NTA2MzAxIDEwMDY0NAotLS0gYS9mcy9haW8uYworKysgYi9mcy9haW8uYwpAQCAtNjQxLDcgKzY0MSw3IEBACiAgKglpbnZva2VkIGJvdGggZm9yIGluaXRpYWwgaS9vIHN1Ym1pc3Npb24gYW5kCiAgKglzdWJzZXF1ZW50IHJldHJpZXMgdmlhIHRoZSBhaW9fa2lja19oYW5kbGVyLgogICoJRXhwZWN0cyB0byBiZSBpbnZva2VkIHdpdGggaW9jYi0+a2lfY3R4LT5sb2NrCi0gKglhbHJlYWR5IGhlbGQuIFRoZSBsb2NrIGlzIHJlbGVhc2VkIGFuZCByZWFxdWlyZWQKKyAqCWFscmVhZHkgaGVsZC4gVGhlIGxvY2sgaXMgcmVsZWFzZWQgYW5kIHJlYWNxdWlyZWQKICAqCWFzIG5lZWRlZCBkdXJpbmcgcHJvY2Vzc2luZy4KICAqCiAgKiBDYWxscyB0aGUgaW9jYiByZXRyeSBtZXRob2QgKGFscmVhZHkgc2V0dXAgZm9yIHRoZQpkaWZmIC0tZ2l0IGEvZnMvYXV0b2ZzNC9leHBpcmUuYyBiL2ZzL2F1dG9mczQvZXhwaXJlLmMKaW5kZXggYjhjZTAyNi4uOGRiZDQ0ZiAxMDA2NDQKLS0tIGEvZnMvYXV0b2ZzNC9leHBpcmUuYworKysgYi9mcy9hdXRvZnM0L2V4cGlyZS5jCkBAIC0xNzQsNiArMTc0LDEyIEBACiAJCQlzdHJ1Y3QgYXV0b2ZzX2luZm8gKmlubyA9IGF1dG9mczRfZGVudHJ5X2lubyhwKTsKIAkJCXVuc2lnbmVkIGludCBpbm9fY291bnQgPSBhdG9taWNfcmVhZCgmaW5vLT5jb3VudCk7CiAKKwkJCS8qCisJCQkgKiBDbGVhbiBzdGFsZSBkZW50cmllcyBiZWxvdyB0aGF0IGhhdmUgbm90IGJlZW4KKwkJCSAqIGludmFsaWRhdGVkIGFmdGVyIGEgbW91bnQgZmFpbCBkdXJpbmcgbG9va3VwCisJCQkgKi8KKwkJCWRfaW52YWxpZGF0ZShwKTsKKwogCQkJLyogYWxsb3cgZm9yIGRnZXQgYWJvdmUgYW5kIHRvcCBpcyBhbHJlYWR5IGRnb3QgKi8KIAkJCWlmIChwID09IHRvcCkKIAkJCQlpbm9fY291bnQgKz0gMjsKQEAgLTM3MCw4ICszNzYsNyBAQAogCQlEUFJJTlRLKCJyZXR1cm5pbmcgJXAgJS4qcyIsCiAJCQlleHBpcmVkLCAoaW50KWV4cGlyZWQtPmRfbmFtZS5sZW4sIGV4cGlyZWQtPmRfbmFtZS5uYW1lKTsKIAkJc3Bpbl9sb2NrKCZkY2FjaGVfbG9jayk7Ci0JCWxpc3RfZGVsKCZleHBpcmVkLT5kX3BhcmVudC0+ZF9zdWJkaXJzKTsKLQkJbGlzdF9hZGQoJmV4cGlyZWQtPmRfcGFyZW50LT5kX3N1YmRpcnMsICZleHBpcmVkLT5kX3UuZF9jaGlsZCk7CisJCWxpc3RfbW92ZSgmZXhwaXJlZC0+ZF9wYXJlbnQtPmRfc3ViZGlycywgJmV4cGlyZWQtPmRfdS5kX2NoaWxkKTsKIAkJc3Bpbl91bmxvY2soJmRjYWNoZV9sb2NrKTsKIAkJcmV0dXJuIGV4cGlyZWQ7CiAJfQpkaWZmIC0tZ2l0IGEvZnMvYmluZm10X2ZsYXQuYyBiL2ZzL2JpbmZtdF9mbGF0LmMKaW5kZXggYjFjOTAyZS4uYzk0ZDUyZSAxMDA2NDQKLS0tIGEvZnMvYmluZm10X2ZsYXQuYworKysgYi9mcy9iaW5mbXRfZmxhdC5jCkBAIC01MTAsNyArNTEwLDcgQEAKIAkJfQogCiAJCS8qIE9LLCBUaGlzIGlzIHRoZSBwb2ludCBvZiBubyByZXR1cm4gKi8KLQkJc2V0X3BlcnNvbmFsaXR5KFBFUl9MSU5VWCk7CisJCXNldF9wZXJzb25hbGl0eShQRVJfTElOVVhfMzJCSVQpOwogCX0KIAogCS8qCmRpZmYgLS1naXQgYS9mcy9iaW5mbXRfbWlzYy5jIGIvZnMvYmluZm10X21pc2MuYwppbmRleCAwN2E0OTk2Li4zNGViYmMxIDEwMDY0NAotLS0gYS9mcy9iaW5mbXRfbWlzYy5jCisrKyBiL2ZzL2JpbmZtdF9taXNjLmMKQEAgLTU1LDYgKzU1LDcgQEAKIH0gTm9kZTsKIAogc3RhdGljIERFRklORV9SV0xPQ0soZW50cmllc19sb2NrKTsKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBibV9mc190eXBlOwogc3RhdGljIHN0cnVjdCB2ZnNtb3VudCAqYm1fbW50Owogc3RhdGljIGludCBlbnRyeV9jb3VudDsKIApAQCAtNjM3LDcgKzYzOCw3IEBACiAJaWYgKCFpbm9kZSkKIAkJZ290byBvdXQyOwogCi0JZXJyID0gc2ltcGxlX3Bpbl9mcygiYmluZm10X21pc2MiLCAmYm1fbW50LCAmZW50cnlfY291bnQpOworCWVyciA9IHNpbXBsZV9waW5fZnMoJmJtX2ZzX3R5cGUsICZibV9tbnQsICZlbnRyeV9jb3VudCk7CiAJaWYgKGVycikgewogCQlpcHV0KGlub2RlKTsKIAkJaW5vZGUgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9jaWZzZnMuYyBiL2ZzL2NpZnMvY2lmc2ZzLmMKaW5kZXggNzUyMGY0Ni4uOGI0ZGU2ZSAxMDA2NDQKLS0tIGEvZnMvY2lmcy9jaWZzZnMuYworKysgYi9mcy9jaWZzL2NpZnNmcy5jCkBAIC00MDMsMTIgKzQwMywxNCBAQAogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfQ0lGU19FWFBFUklNRU5UQUwKLXN0YXRpYyB2b2lkIGNpZnNfdW1vdW50X2JlZ2luKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNibG9jaykKK3N0YXRpYyB2b2lkIGNpZnNfdW1vdW50X2JlZ2luKHN0cnVjdCB2ZnNtb3VudCAqIHZmc21udCwgaW50IGZsYWdzKQogewogCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2I7CiAJc3RydWN0IGNpZnNUY29uSW5mbyAqIHRjb247CiAKLQljaWZzX3NiID0gQ0lGU19TQihzYmxvY2spOworCWlmICghKGZsYWdzICYgTU5UX0ZPUkNFKSkKKwkJcmV0dXJuOworCWNpZnNfc2IgPSBDSUZTX1NCKHZmc21udC0+bW50X3NiKTsKIAlpZihjaWZzX3NiID09IE5VTEwpCiAJCXJldHVybjsKIApkaWZmIC0tZ2l0IGEvZnMvY29kYS9wc2Rldi5jIGIvZnMvY29kYS9wc2Rldi5jCmluZGV4IDZjNjc3MWQuLjdjYWVlOGQgMTAwNjQ0Ci0tLSBhL2ZzL2NvZGEvcHNkZXYuYworKysgYi9mcy9jb2RhL3BzZGV2LmMKQEAgLTI1OSw3ICsyNTksNyBAQAogCS8qIElmIHJlcXVlc3Qgd2FzIG5vdCBhIHNpZ25hbCwgZW5xdWV1ZSBhbmQgZG9uJ3QgZnJlZSAqLwogCWlmICghKHJlcS0+dWNfZmxhZ3MgJiBSRVFfQVNZTkMpKSB7CiAJCXJlcS0+dWNfZmxhZ3MgfD0gUkVRX1JFQUQ7Ci0JCWxpc3RfYWRkKCYocmVxLT51Y19jaGFpbiksIHZjcC0+dmNfcHJvY2Vzc2luZy5wcmV2KTsKKwkJbGlzdF9hZGRfdGFpbCgmKHJlcS0+dWNfY2hhaW4pLCAmdmNwLT52Y19wcm9jZXNzaW5nKTsKIAkJZ290byBvdXQ7CiAJfQogCmRpZmYgLS1naXQgYS9mcy9jb2RhL3VwY2FsbC5jIGIvZnMvY29kYS91cGNhbGwuYwppbmRleCBiMDQwZWJhLi5hNWI1ZTYzIDEwMDY0NAotLS0gYS9mcy9jb2RhL3VwY2FsbC5jCisrKyBiL2ZzL2NvZGEvdXBjYWxsLmMKQEAgLTcyNSw3ICs3MjUsNyBAQAogCSgodW5pb24gaW5wdXRBcmdzICopYnVmZmVyKS0+aWgudW5pcXVlID0gcmVxLT51Y191bmlxdWU7CiAKIAkvKiBBcHBlbmQgbXNnIHRvIHBlbmRpbmcgcXVldWUgYW5kIHBva2UgVmVudXMuICovCi0JbGlzdF9hZGQoJihyZXEtPnVjX2NoYWluKSwgdmNvbW1wLT52Y19wZW5kaW5nLnByZXYpOworCWxpc3RfYWRkX3RhaWwoJihyZXEtPnVjX2NoYWluKSwgJnZjb21tcC0+dmNfcGVuZGluZyk7CiAgICAgICAgIAogCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdmNvbW1wLT52Y193YWl0cSk7CiAJLyogV2UgY2FuIGJlIGludGVycnVwdGVkIHdoaWxlIHdlIHdhaXQgZm9yIFZlbnVzIHRvIHByb2Nlc3MKZGlmZiAtLWdpdCBhL2ZzL2NvbXBhdC5jIGIvZnMvY29tcGF0LmMKaW5kZXggN2U3ZTViYy4uZTMxZTljZiAxMDA2NDQKLS0tIGEvZnMvY29tcGF0LmMKKysrIGIvZnMvY29tcGF0LmMKQEAgLTU1LDYgKzU1LDIwIEBACiAKIGV4dGVybiB2b2lkIHNpZ3NldF9mcm9tX2NvbXBhdChzaWdzZXRfdCAqc2V0LCBjb21wYXRfc2lnc2V0X3QgKmNvbXBhdCk7CiAKK2ludCBjb21wYXRfbG9nID0gMTsKKworaW50IGNvbXBhdF9wcmludGsoY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcDsKKwlpbnQgcmV0OworCWlmICghY29tcGF0X2xvZykKKwkJcmV0dXJuIDA7CisJdmFfc3RhcnQoYXAsIGZtdCk7CisJcmV0ID0gdnByaW50ayhmbXQsIGFwKTsKKwl2YV9lbmQoYXApOworCXJldHVybiByZXQ7Cit9CisKIC8qCiAgKiBOb3QgYWxsIGFyY2hpdGVjdHVyZXMgaGF2ZSBzeXNfdXRpbWUsIHNvIGltcGxlbWVudCB0aGlzIGluIHRlcm1zCiAgKiBvZiBzeXNfdXRpbWVzLgpAQCAtMzU5LDcgKzM3Myw3IEBACiAJc3ByaW50ZihidWYsIiclYyciLCAoY21kPj4yNCkgJiAweDNmKTsKIAlpZiAoIWlzcHJpbnQoYnVmWzFdKSkKIAkJc3ByaW50ZihidWYsICIlMDJ4IiwgYnVmWzFdKTsKLQlwcmludGsoImlvY3RsMzIoJXM6JWQpOiBVbmtub3duIGNtZCBmZCglZCkgIgorCWNvbXBhdF9wcmludGsoImlvY3RsMzIoJXM6JWQpOiBVbmtub3duIGNtZCBmZCglZCkgIgogCQkJImNtZCglMDh4KXslc30gYXJnKCUwOHgpIG9uICVzXG4iLAogCQkJY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkLAogCQkJKGludClmZCwgKHVuc2lnbmVkIGludCljbWQsIGJ1ZiwKZGlmZiAtLWdpdCBhL2ZzL2NvbXBhdF9pb2N0bC5jIGIvZnMvY29tcGF0X2lvY3RsLmMKaW5kZXggZDJjMzg4Ny4uZDhlY2ZlZCAxMDA2NDQKLS0tIGEvZnMvY29tcGF0X2lvY3RsLmMKKysrIGIvZnMvY29tcGF0X2lvY3RsLmMKQEAgLTgwLDYgKzgwLDcgQEAKICNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL3JmY29tbS5oPgogCiAjaW5jbHVkZSA8bGludXgvY2FwaS5oPgorI2luY2x1ZGUgPGxpbnV4L2dpZ2FzZXRfZGV2Lmg+CiAKICNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfaW9jdGwuaD4KQEAgLTIwNSwzOCArMjA2LDYgQEAKIAlyZXR1cm4gc3lzX2lvY3RsKGZkLCBjbWQsICh1bnNpZ25lZCBsb25nKWNvbXBhdF9wdHIoYXJnKSk7CiB9CiAKLXN0cnVjdCBjb21wYXRfZG14X2V2ZW50IHsKLQlkbXhfZXZlbnRfdAlldmVudDsKLQljb21wYXRfdGltZV90CXRpbWVTdGFtcDsKLQl1bmlvbgotCXsKLQkJZG14X3NjcmFtYmxpbmdfc3RhdHVzX3Qgc2NyYW1ibGluZzsKLQl9IHU7Ci19OwotCi1zdGF0aWMgaW50IGRvX2RteF9nZXRfZXZlbnQodW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlzdHJ1Y3QgZG14X2V2ZW50IGtldmVudDsKLQltbV9zZWdtZW50X3Qgb2xkX2ZzID0gZ2V0X2ZzKCk7Ci0JaW50IGVycjsKLQotCXNldF9mcyhLRVJORUxfRFMpOwotCWVyciA9IHN5c19pb2N0bChmZCwgY21kLCAodW5zaWduZWQgbG9uZykgJmtldmVudCk7Ci0Jc2V0X2ZzKG9sZF9mcyk7Ci0KLQlpZiAoIWVycikgewotCQlzdHJ1Y3QgY29tcGF0X2RteF9ldmVudCBfX3VzZXIgKnVwID0gY29tcGF0X3B0cihhcmcpOwotCi0JCWVyciAgPSBwdXRfdXNlcihrZXZlbnQuZXZlbnQsICZ1cC0+ZXZlbnQpOwotCQllcnIgfD0gcHV0X3VzZXIoa2V2ZW50LnRpbWVTdGFtcCwgJnVwLT50aW1lU3RhbXApOwotCQllcnIgfD0gcHV0X3VzZXIoa2V2ZW50LnUuc2NyYW1ibGluZywgJnVwLT51LnNjcmFtYmxpbmcpOwotCQlpZiAoZXJyKQotCQkJZXJyID0gLUVGQVVMVDsKLQl9Ci0KLQlyZXR1cm4gZXJyOwotfQotCiBzdHJ1Y3QgY29tcGF0X3ZpZGVvX2V2ZW50IHsKIAlpbnQzMl90CQl0eXBlOwogCWNvbXBhdF90aW1lX3QJdGltZXN0YW1wOwpAQCAtMjk2NCw3ICsyOTMzLDYgQEAKICNlbmRpZgogCiAvKiBkdmIgKi8KLUhBTkRMRV9JT0NUTChETVhfR0VUX0VWRU5ULCBkb19kbXhfZ2V0X2V2ZW50KQogSEFORExFX0lPQ1RMKFZJREVPX0dFVF9FVkVOVCwgZG9fdmlkZW9fZ2V0X2V2ZW50KQogSEFORExFX0lPQ1RMKFZJREVPX1NUSUxMUElDVFVSRSwgZG9fdmlkZW9fc3RpbGxwaWN0dXJlKQogSEFORExFX0lPQ1RMKFZJREVPX1NFVF9TUFVfUEFMRVRURSwgZG9fdmlkZW9fc2V0X3NwdV9wYWxldHRlKQpkaWZmIC0tZ2l0IGEvZnMvY29uZmlnZnMvZGlyLmMgYi9mcy9jb25maWdmcy9kaXIuYwppbmRleCA1Zjk1MjE4Li4yMDdmODAwIDEwMDY0NAotLS0gYS9mcy9jb25maWdmcy9kaXIuYworKysgYi9mcy9jb25maWdmcy9kaXIuYwpAQCAtMTAwOSw4ICsxMDA5LDcgQEAKIAkJCS8qIGZhbGx0aHJvdWdoICovCiAJCWRlZmF1bHQ6CiAJCQlpZiAoZmlscC0+Zl9wb3MgPT0gMikgewotCQkJCWxpc3RfZGVsKHEpOwotCQkJCWxpc3RfYWRkKHEsICZwYXJlbnRfc2QtPnNfY2hpbGRyZW4pOworCQkJCWxpc3RfbW92ZShxLCAmcGFyZW50X3NkLT5zX2NoaWxkcmVuKTsKIAkJCX0KIAkJCWZvciAocD1xLT5uZXh0OyBwIT0gJnBhcmVudF9zZC0+c19jaGlsZHJlbjsgcD1wLT5uZXh0KSB7CiAJCQkJc3RydWN0IGNvbmZpZ2ZzX2RpcmVudCAqbmV4dDsKQEAgLTEwMzMsOCArMTAzMiw3IEBACiAJCQkJCQkgZHRfdHlwZShuZXh0KSkgPCAwKQogCQkJCQlyZXR1cm4gMDsKIAotCQkJCWxpc3RfZGVsKHEpOwotCQkJCWxpc3RfYWRkKHEsIHApOworCQkJCWxpc3RfbW92ZShxLCBwKTsKIAkJCQlwID0gcTsKIAkJCQlmaWxwLT5mX3BvcysrOwogCQkJfQpkaWZmIC0tZ2l0IGEvZnMvY29uZmlnZnMvbW91bnQuYyBiL2ZzL2NvbmZpZ2ZzL21vdW50LmMKaW5kZXggOTRkYWI3Yi4uM2U1ZmU4NCAxMDA2NDQKLS0tIGEvZnMvY29uZmlnZnMvbW91bnQuYworKysgYi9mcy9jb25maWdmcy9tb3VudC5jCkBAIC0xMTgsNyArMTE4LDcgQEAKIAogaW50IGNvbmZpZ2ZzX3Bpbl9mcyh2b2lkKQogewotCXJldHVybiBzaW1wbGVfcGluX2ZzKCJjb25maWdmcyIsICZjb25maWdmc19tb3VudCwKKwlyZXR1cm4gc2ltcGxlX3Bpbl9mcygmY29uZmlnZnNfZnNfdHlwZSwgJmNvbmZpZ2ZzX21vdW50LAogCQkJICAgICAmY29uZmlnZnNfbW50X2NvdW50KTsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvZGNhY2hlLmMgYi9mcy9kY2FjaGUuYwppbmRleCAzMTNiNTRiLi40OGI0NGE3IDEwMDY0NAotLS0gYS9mcy9kY2FjaGUuYworKysgYi9mcy9kY2FjaGUuYwpAQCAtNDA2LDcgKzQwNiw3IEBACiAJCWNvbmRfcmVzY2hlZF9sb2NrKCZkY2FjaGVfbG9jayk7CiAKIAkJdG1wID0gZGVudHJ5X3VudXNlZC5wcmV2OwotCQlpZiAodW5saWtlbHkoc2IpKSB7CisJCWlmIChzYikgewogCQkJLyogVHJ5IHRvIGZpbmQgYSBkZW50cnkgZm9yIHRoaXMgc2IsIGJ1dCBkb24ndCB0cnkKIAkJCSAqIHRvbyBoYXJkLCBpZiB0aGV5IGFyZW4ndCBuZWFyIHRoZSB0YWlsIHRoZXkgd2lsbAogCQkJICogYmUgbW92ZWQgZG93biBhZ2FpbiBzb29uCkBAIC01MjIsOCArNTIyLDcgQEAKIAkJZGVudHJ5ID0gbGlzdF9lbnRyeSh0bXAsIHN0cnVjdCBkZW50cnksIGRfbHJ1KTsKIAkJaWYgKGRlbnRyeS0+ZF9zYiAhPSBzYikKIAkJCWNvbnRpbnVlOwotCQlsaXN0X2RlbCh0bXApOwotCQlsaXN0X2FkZCh0bXAsICZkZW50cnlfdW51c2VkKTsKKwkJbGlzdF9tb3ZlKHRtcCwgJmRlbnRyeV91bnVzZWQpOwogCX0KIAogCS8qCkBAIC02MzgsNyArNjM3LDcgQEAKIAkJICogb2YgdGhlIHVudXNlZCBsaXN0IGZvciBwcnVuZV9kY2FjaGUKIAkJICovCiAJCWlmICghYXRvbWljX3JlYWQoJmRlbnRyeS0+ZF9jb3VudCkpIHsKLQkJCWxpc3RfYWRkKCZkZW50cnktPmRfbHJ1LCBkZW50cnlfdW51c2VkLnByZXYpOworCQkJbGlzdF9hZGRfdGFpbCgmZGVudHJ5LT5kX2xydSwgJmRlbnRyeV91bnVzZWQpOwogCQkJZGVudHJ5X3N0YXQubnJfdW51c2VkKys7CiAJCQlmb3VuZCsrOwogCQl9CmRpZmYgLS1naXQgYS9mcy9kZWJ1Z2ZzL2lub2RlLmMgYi9mcy9kZWJ1Z2ZzL2lub2RlLmMKaW5kZXggNDQwMTI4ZS4uNmZhMWUwNCAxMDA2NDQKLS0tIGEvZnMvZGVidWdmcy9pbm9kZS5jCisrKyBiL2ZzL2RlYnVnZnMvaW5vZGUuYwpAQCAtMTk5LDcgKzE5OSw3IEBACiAKIAlwcl9kZWJ1ZygiZGVidWdmczogY3JlYXRpbmcgZmlsZSAnJXMnXG4iLG5hbWUpOwogCi0JZXJyb3IgPSBzaW1wbGVfcGluX2ZzKCJkZWJ1Z2ZzIiwgJmRlYnVnZnNfbW91bnQsICZkZWJ1Z2ZzX21vdW50X2NvdW50KTsKKwllcnJvciA9IHNpbXBsZV9waW5fZnMoJmRlYnVnX2ZzX3R5cGUsICZkZWJ1Z2ZzX21vdW50LCAmZGVidWdmc19tb3VudF9jb3VudCk7CiAJaWYgKGVycm9yKQogCQlnb3RvIGV4aXQ7CiAKZGlmZiAtLWdpdCBhL2ZzL2RxdW90LmMgYi9mcy9kcXVvdC5jCmluZGV4IDgxZDg3YTQuLjAxMjJhMjcgMTAwNjQ0Ci0tLSBhL2ZzL2RxdW90LmMKKysrIGIvZnMvZHF1b3QuYwpAQCAtMjUwLDcgKzI1MCw3IEBACiAvKiBBZGQgYSBkcXVvdCB0byB0aGUgdGFpbCBvZiB0aGUgZnJlZSBsaXN0ICovCiBzdGF0aWMgaW5saW5lIHZvaWQgcHV0X2RxdW90X2xhc3Qoc3RydWN0IGRxdW90ICpkcXVvdCkKIHsKLQlsaXN0X2FkZCgmZHF1b3QtPmRxX2ZyZWUsIGZyZWVfZHF1b3RzLnByZXYpOworCWxpc3RfYWRkX3RhaWwoJmRxdW90LT5kcV9mcmVlLCAmZnJlZV9kcXVvdHMpOwogCWRxc3RhdHMuZnJlZV9kcXVvdHMrKzsKIH0KIApAQCAtMjY2LDcgKzI2Niw3IEBACiB7CiAJLyogV2UgYWRkIHRvIHRoZSBiYWNrIG9mIGludXNlIGxpc3Qgc28gd2UgZG9uJ3QgaGF2ZSB0byByZXN0YXJ0CiAJICogd2hlbiB0cmF2ZXJzaW5nIHRoaXMgbGlzdCBhbmQgd2UgYmxvY2sgKi8KLQlsaXN0X2FkZCgmZHF1b3QtPmRxX2ludXNlLCBpbnVzZV9saXN0LnByZXYpOworCWxpc3RfYWRkX3RhaWwoJmRxdW90LT5kcV9pbnVzZSwgJmludXNlX2xpc3QpOwogCWRxc3RhdHMuYWxsb2NhdGVkX2RxdW90cysrOwogfQogCmRpZmYgLS1naXQgYS9mcy9ldmVudHBvbGwuYyBiL2ZzL2V2ZW50cG9sbC5jCmluZGV4IDA4ZTdlNmEuLjljNjc3YmIgMTAwNjQ0Ci0tLSBhL2ZzL2V2ZW50cG9sbC5jCisrKyBiL2ZzL2V2ZW50cG9sbC5jCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqICBmcy9ldmVudHBvbGwuYyAoIEVmZmljZW50IGV2ZW50IHBvbGxpbmcgaW1wbGVtZW50YXRpb24gKQotICogIENvcHlyaWdodCAoQykgMjAwMSwuLi4sMjAwMwkgRGF2aWRlIExpYmVuemkKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDEsLi4uLDIwMDYJIERhdmlkZSBMaWJlbnppCiAgKgogICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTEwMDQsNyArMTAwNCw3IEBACiAKIAkJLyogTm90aWZ5IHdhaXRpbmcgdGFza3MgdGhhdCBldmVudHMgYXJlIGF2YWlsYWJsZSAqLwogCQlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmZXAtPndxKSkKLQkJCXdha2VfdXAoJmVwLT53cSk7CisJCQlfX3dha2VfdXBfbG9ja2VkKCZlcC0+d3EsIFRBU0tfVU5JTlRFUlJVUFRJQkxFIHwgVEFTS19JTlRFUlJVUFRJQkxFKTsKIAkJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJmVwLT5wb2xsX3dhaXQpKQogCQkJcHdha2UrKzsKIAl9CkBAIC0xMDgzLDcgKzEwODMsOCBAQAogCiAJCQkJLyogTm90aWZ5IHdhaXRpbmcgdGFza3MgdGhhdCBldmVudHMgYXJlIGF2YWlsYWJsZSAqLwogCQkJCWlmICh3YWl0cXVldWVfYWN0aXZlKCZlcC0+d3EpKQotCQkJCQl3YWtlX3VwKCZlcC0+d3EpOworCQkJCQlfX3dha2VfdXBfbG9ja2VkKCZlcC0+d3EsIFRBU0tfVU5JTlRFUlJVUFRJQkxFIHwKKwkJCQkJCQkgVEFTS19JTlRFUlJVUFRJQkxFKTsKIAkJCQlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmZXAtPnBvbGxfd2FpdCkpCiAJCQkJCXB3YWtlKys7CiAJCQl9CkBAIC0xMjYwLDcgKzEyNjEsOCBAQAogCSAqIHdhaXQgbGlzdC4KIAkgKi8KIAlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmZXAtPndxKSkKLQkJd2FrZV91cCgmZXAtPndxKTsKKwkJX193YWtlX3VwX2xvY2tlZCgmZXAtPndxLCBUQVNLX1VOSU5URVJSVVBUSUJMRSB8CisJCQkJIFRBU0tfSU5URVJSVVBUSUJMRSk7CiAJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJmVwLT5wb2xsX3dhaXQpKQogCQlwd2FrZSsrOwogCkBAIC0xNDQ0LDcgKzE0NDYsOCBAQAogCQkgKiB3YWl0IGxpc3QuCiAJCSAqLwogCQlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmZXAtPndxKSkKLQkJCXdha2VfdXAoJmVwLT53cSk7CisJCQlfX3dha2VfdXBfbG9ja2VkKCZlcC0+d3EsIFRBU0tfVU5JTlRFUlJVUFRJQkxFIHwKKwkJCQkJIFRBU0tfSU5URVJSVVBUSUJMRSk7CiAJCWlmICh3YWl0cXVldWVfYWN0aXZlKCZlcC0+cG9sbF93YWl0KSkKIAkJCXB3YWtlKys7CiAJfQpAQCAtMTUxNiw3ICsxNTE5LDcgQEAKIAkJICogZXBfcG9sbF9jYWxsYmFjaygpIHdoZW4gZXZlbnRzIHdpbGwgYmVjb21lIGF2YWlsYWJsZS4KIAkJICovCiAJCWluaXRfd2FpdHF1ZXVlX2VudHJ5KCZ3YWl0LCBjdXJyZW50KTsKLQkJYWRkX3dhaXRfcXVldWUoJmVwLT53cSwgJndhaXQpOworCQlfX2FkZF93YWl0X3F1ZXVlKCZlcC0+d3EsICZ3YWl0KTsKIAogCQlmb3IgKDs7KSB7CiAJCQkvKgpAQCAtMTUzNiw3ICsxNTM5LDcgQEAKIAkJCWp0aW1lb3V0ID0gc2NoZWR1bGVfdGltZW91dChqdGltZW91dCk7CiAJCQl3cml0ZV9sb2NrX2lycXNhdmUoJmVwLT5sb2NrLCBmbGFncyk7CiAJCX0KLQkJcmVtb3ZlX3dhaXRfcXVldWUoJmVwLT53cSwgJndhaXQpOworCQlfX3JlbW92ZV93YWl0X3F1ZXVlKCZlcC0+d3EsICZ3YWl0KTsKIAogCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwogCX0KZGlmZiAtLWdpdCBhL2ZzL2V4ZWMuYyBiL2ZzL2V4ZWMuYwppbmRleCAwYjg4YmY2Li5jODQ5NGY1IDEwMDY0NAotLS0gYS9mcy9leGVjLmMKKysrIGIvZnMvZXhlYy5jCkBAIC02NjYsOCArNjY2LDYgQEAKIAkgKiBhbmQgdG8gYXNzdW1lIGl0cyBQSUQ6CiAJICovCiAJaWYgKCF0aHJlYWRfZ3JvdXBfbGVhZGVyKGN1cnJlbnQpKSB7Ci0JCXN0cnVjdCBkZW50cnkgKnByb2NfZGVudHJ5MSwgKnByb2NfZGVudHJ5MjsKLQogCQkvKgogCQkgKiBXYWl0IGZvciB0aGUgdGhyZWFkIGdyb3VwIGxlYWRlciB0byBiZSBhIHpvbWJpZS4KIAkJICogSXQgc2hvdWxkIGFscmVhZHkgYmUgem9tYmllIGF0IHRoaXMgcG9pbnQsIG1vc3QKQEAgLTY4OSwxMCArNjg3LDYgQEAKIAkJICovCiAJCWN1cnJlbnQtPnN0YXJ0X3RpbWUgPSBsZWFkZXItPnN0YXJ0X3RpbWU7CiAKLQkJc3Bpbl9sb2NrKCZsZWFkZXItPnByb2NfbG9jayk7Ci0JCXNwaW5fbG9jaygmY3VycmVudC0+cHJvY19sb2NrKTsKLQkJcHJvY19kZW50cnkxID0gcHJvY19waWRfdW5oYXNoKGN1cnJlbnQpOwotCQlwcm9jX2RlbnRyeTIgPSBwcm9jX3BpZF91bmhhc2gobGVhZGVyKTsKIAkJd3JpdGVfbG9ja19pcnEoJnRhc2tsaXN0X2xvY2spOwogCiAJCUJVR19PTihsZWFkZXItPnRnaWQgIT0gY3VycmVudC0+dGdpZCk7CkBAIC03MTMsNyArNzA3LDcgQEAKIAkJYXR0YWNoX3BpZChjdXJyZW50LCBQSURUWVBFX1BJRCwgIGN1cnJlbnQtPnBpZCk7CiAJCWF0dGFjaF9waWQoY3VycmVudCwgUElEVFlQRV9QR0lELCBjdXJyZW50LT5zaWduYWwtPnBncnApOwogCQlhdHRhY2hfcGlkKGN1cnJlbnQsIFBJRFRZUEVfU0lELCAgY3VycmVudC0+c2lnbmFsLT5zZXNzaW9uKTsKLQkJbGlzdF9hZGRfdGFpbF9yY3UoJmN1cnJlbnQtPnRhc2tzLCAmaW5pdF90YXNrLnRhc2tzKTsKKwkJbGlzdF9yZXBsYWNlX3JjdSgmbGVhZGVyLT50YXNrcywgJmN1cnJlbnQtPnRhc2tzKTsKIAogCQljdXJyZW50LT5ncm91cF9sZWFkZXIgPSBjdXJyZW50OwogCQlsZWFkZXItPmdyb3VwX2xlYWRlciA9IGN1cnJlbnQ7CkBAIC03MjEsNyArNzE1LDYgQEAKIAkJLyogUmVkdWNlIGxlYWRlciB0byBhIHRocmVhZCAqLwogCQlkZXRhY2hfcGlkKGxlYWRlciwgUElEVFlQRV9QR0lEKTsKIAkJZGV0YWNoX3BpZChsZWFkZXIsIFBJRFRZUEVfU0lEKTsKLQkJbGlzdF9kZWxfaW5pdCgmbGVhZGVyLT50YXNrcyk7CiAKIAkJY3VycmVudC0+ZXhpdF9zaWduYWwgPSBTSUdDSExEOwogCkBAIC03MjksMTAgKzcyMiw2IEBACiAJCWxlYWRlci0+ZXhpdF9zdGF0ZSA9IEVYSVRfREVBRDsKIAogCQl3cml0ZV91bmxvY2tfaXJxKCZ0YXNrbGlzdF9sb2NrKTsKLQkJc3Bpbl91bmxvY2soJmxlYWRlci0+cHJvY19sb2NrKTsKLQkJc3Bpbl91bmxvY2soJmN1cnJlbnQtPnByb2NfbG9jayk7Ci0JCXByb2NfcGlkX2ZsdXNoKHByb2NfZGVudHJ5MSk7Ci0JCXByb2NfcGlkX2ZsdXNoKHByb2NfZGVudHJ5Mik7CiAgICAgICAgIH0KIAogCS8qCkBAIC0xMzc5LDY3ICsxMzY4LDEwMiBAQAogCSpvdXRfcHRyID0gMDsKIH0KIAotc3RhdGljIHZvaWQgemFwX3RocmVhZHMgKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQorc3RhdGljIHZvaWQgemFwX3Byb2Nlc3Moc3RydWN0IHRhc2tfc3RydWN0ICpzdGFydCkKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQ7CisKKwlzdGFydC0+c2lnbmFsLT5mbGFncyA9IFNJR05BTF9HUk9VUF9FWElUOworCXN0YXJ0LT5zaWduYWwtPmdyb3VwX3N0b3BfY291bnQgPSAwOworCisJdCA9IHN0YXJ0OworCWRvIHsKKwkJaWYgKHQgIT0gY3VycmVudCAmJiB0LT5tbSkgeworCQkJdC0+bW0tPmNvcmVfd2FpdGVycysrOworCQkJc2lnYWRkc2V0KCZ0LT5wZW5kaW5nLnNpZ25hbCwgU0lHS0lMTCk7CisJCQlzaWduYWxfd2FrZV91cCh0LCAxKTsKKwkJfQorCX0gd2hpbGUgKCh0ID0gbmV4dF90aHJlYWQodCkpICE9IHN0YXJ0KTsKK30KKworc3RhdGljIGlubGluZSBpbnQgemFwX3RocmVhZHMoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAorCQkJCWludCBleGl0X2NvZGUpCiB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICpnLCAqcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBlcnIgPSAtRUFHQUlOOworCisJc3Bpbl9sb2NrX2lycSgmdHNrLT5zaWdoYW5kLT5zaWdsb2NrKTsKKwlpZiAoISh0c2stPnNpZ25hbC0+ZmxhZ3MgJiBTSUdOQUxfR1JPVVBfRVhJVCkpIHsKKwkJdHNrLT5zaWduYWwtPmdyb3VwX2V4aXRfY29kZSA9IGV4aXRfY29kZTsKKwkJemFwX3Byb2Nlc3ModHNrKTsKKwkJZXJyID0gMDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZ0c2stPnNpZ2hhbmQtPnNpZ2xvY2spOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlpZiAoYXRvbWljX3JlYWQoJm1tLT5tbV91c2VycykgPT0gbW0tPmNvcmVfd2FpdGVycyArIDEpCisJCWdvdG8gZG9uZTsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlmb3JfZWFjaF9wcm9jZXNzKGcpIHsKKwkJaWYgKGcgPT0gdHNrLT5ncm91cF9sZWFkZXIpCisJCQljb250aW51ZTsKKworCQlwID0gZzsKKwkJZG8geworCQkJaWYgKHAtPm1tKSB7CisJCQkJaWYgKHAtPm1tID09IG1tKSB7CisJCQkJCS8qCisJCQkJCSAqIHAtPnNpZ2hhbmQgY2FuJ3QgZGlzYXBwZWFyLCBidXQKKwkJCQkJICogbWF5IGJlIGNoYW5nZWQgYnkgZGVfdGhyZWFkKCkKKwkJCQkJICovCisJCQkJCWxvY2tfdGFza19zaWdoYW5kKHAsICZmbGFncyk7CisJCQkJCXphcF9wcm9jZXNzKHApOworCQkJCQl1bmxvY2tfdGFza19zaWdoYW5kKHAsICZmbGFncyk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQl9IHdoaWxlICgocCA9IG5leHRfdGhyZWFkKHApKSAhPSBnKTsKKwl9CisJcmN1X3JlYWRfdW5sb2NrKCk7Citkb25lOgorCXJldHVybiBtbS0+Y29yZV93YWl0ZXJzOworfQorCitzdGF0aWMgaW50IGNvcmVkdW1wX3dhaXQoaW50IGV4aXRfY29kZSkKK3sKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7Ci0Jc3RydWN0IGNvbXBsZXRpb24gKnZmb3JrX2RvbmUgPSB0c2stPnZmb3JrX2RvbmU7Ci0JaW50IHRyYWNlZCA9IDA7CisJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSB0c2stPm1tOworCXN0cnVjdCBjb21wbGV0aW9uIHN0YXJ0dXBfZG9uZTsKKwlzdHJ1Y3QgY29tcGxldGlvbiAqdmZvcmtfZG9uZTsKKwlpbnQgY29yZV93YWl0ZXJzOworCisJaW5pdF9jb21wbGV0aW9uKCZtbS0+Y29yZV9kb25lKTsKKwlpbml0X2NvbXBsZXRpb24oJnN0YXJ0dXBfZG9uZSk7CisJbW0tPmNvcmVfc3RhcnR1cF9kb25lID0gJnN0YXJ0dXBfZG9uZTsKKworCWNvcmVfd2FpdGVycyA9IHphcF90aHJlYWRzKHRzaywgbW0sIGV4aXRfY29kZSk7CisJdXBfd3JpdGUoJm1tLT5tbWFwX3NlbSk7CisKKwlpZiAodW5saWtlbHkoY29yZV93YWl0ZXJzIDwgMCkpCisJCWdvdG8gZmFpbDsKIAogCS8qCiAJICogTWFrZSBzdXJlIG5vYm9keSBpcyB3YWl0aW5nIGZvciB1cyB0byByZWxlYXNlIHRoZSBWTSwKIAkgKiBvdGhlcndpc2Ugd2UgY2FuIGRlYWRsb2NrIHdoZW4gd2Ugd2FpdCBvbiBlYWNoIG90aGVyCiAJICovCisJdmZvcmtfZG9uZSA9IHRzay0+dmZvcmtfZG9uZTsKIAlpZiAodmZvcmtfZG9uZSkgewogCQl0c2stPnZmb3JrX2RvbmUgPSBOVUxMOwogCQljb21wbGV0ZSh2Zm9ya19kb25lKTsKIAl9CiAKLQlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOwotCWRvX2VhY2hfdGhyZWFkKGcscCkKLQkJaWYgKG1tID09IHAtPm1tICYmIHAgIT0gdHNrKSB7Ci0JCQlmb3JjZV9zaWdfc3BlY2lmaWMoU0lHS0lMTCwgcCk7Ci0JCQltbS0+Y29yZV93YWl0ZXJzKys7Ci0JCQlpZiAodW5saWtlbHkocC0+cHRyYWNlKSAmJgotCQkJICAgIHVubGlrZWx5KHAtPnBhcmVudC0+bW0gPT0gbW0pKQotCQkJCXRyYWNlZCA9IDE7Ci0JCX0KLQl3aGlsZV9lYWNoX3RocmVhZChnLHApOwotCi0JcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOwotCi0JaWYgKHVubGlrZWx5KHRyYWNlZCkpIHsKLQkJLyoKLQkJICogV2UgYXJlIHphcHBpbmcgYSB0aHJlYWQgYW5kIHRoZSB0aHJlYWQgaXQgcHRyYWNlcy4KLQkJICogSWYgdGhlIHRyYWNlZSB3ZW50IGludG8gYSBwdHJhY2Ugc3RvcCBmb3IgZXhpdCB0cmFjaW5nLAotCQkgKiB3ZSBjb3VsZCBkZWFkbG9jayBzaW5jZSB0aGUgdHJhY2VyIGlzIHdhaXRpbmcgZm9yIHRoaXMKLQkJICogY29yZWR1bXAgdG8gZmluaXNoLiAgRGV0YWNoIHRoZW0gc28gdGhleSBjYW4gYm90aCBkaWUuCi0JCSAqLwotCQl3cml0ZV9sb2NrX2lycSgmdGFza2xpc3RfbG9jayk7Ci0JCWRvX2VhY2hfdGhyZWFkKGcscCkgewotCQkJaWYgKG1tID09IHAtPm1tICYmIHAgIT0gdHNrICYmCi0JCQkgICAgcC0+cHRyYWNlICYmIHAtPnBhcmVudC0+bW0gPT0gbW0pIHsKLQkJCQlfX3B0cmFjZV9kZXRhY2gocCwgMCk7Ci0JCQl9Ci0JCX0gd2hpbGVfZWFjaF90aHJlYWQoZyxwKTsKLQkJd3JpdGVfdW5sb2NrX2lycSgmdGFza2xpc3RfbG9jayk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBjb3JlZHVtcF93YWl0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQotewotCURFQ0xBUkVfQ09NUExFVElPTihzdGFydHVwX2RvbmUpOwotCWludCBjb3JlX3dhaXRlcnM7Ci0KLQltbS0+Y29yZV9zdGFydHVwX2RvbmUgPSAmc3RhcnR1cF9kb25lOwotCi0JemFwX3RocmVhZHMobW0pOwotCWNvcmVfd2FpdGVycyA9IG1tLT5jb3JlX3dhaXRlcnM7Ci0JdXBfd3JpdGUoJm1tLT5tbWFwX3NlbSk7Ci0KIAlpZiAoY29yZV93YWl0ZXJzKQogCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZzdGFydHVwX2RvbmUpOworZmFpbDoKIAlCVUdfT04obW0tPmNvcmVfd2FpdGVycyk7CisJcmV0dXJuIGNvcmVfd2FpdGVyczsKIH0KIAogaW50IGRvX2NvcmVkdW1wKGxvbmcgc2lnbnIsIGludCBleGl0X2NvZGUsIHN0cnVjdCBwdF9yZWdzICogcmVncykKQEAgLTE0NzMsMjIgKzE0OTcsOSBAQAogCX0KIAltbS0+ZHVtcGFibGUgPSAwOwogCi0JcmV0dmFsID0gLUVBR0FJTjsKLQlzcGluX2xvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKLQlpZiAoIShjdXJyZW50LT5zaWduYWwtPmZsYWdzICYgU0lHTkFMX0dST1VQX0VYSVQpKSB7Ci0JCWN1cnJlbnQtPnNpZ25hbC0+ZmxhZ3MgPSBTSUdOQUxfR1JPVVBfRVhJVDsKLQkJY3VycmVudC0+c2lnbmFsLT5ncm91cF9leGl0X2NvZGUgPSBleGl0X2NvZGU7Ci0JCWN1cnJlbnQtPnNpZ25hbC0+Z3JvdXBfc3RvcF9jb3VudCA9IDA7Ci0JCXJldHZhbCA9IDA7Ci0JfQotCXNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7Ci0JaWYgKHJldHZhbCkgewotCQl1cF93cml0ZSgmbW0tPm1tYXBfc2VtKTsKKwlyZXR2YWwgPSBjb3JlZHVtcF93YWl0KGV4aXRfY29kZSk7CisJaWYgKHJldHZhbCA8IDApCiAJCWdvdG8gZmFpbDsKLQl9Ci0KLQlpbml0X2NvbXBsZXRpb24oJm1tLT5jb3JlX2RvbmUpOwotCWNvcmVkdW1wX3dhaXQobW0pOwogCiAJLyoKIAkgKiBDbGVhciBhbnkgZmFsc2UgaW5kaWNhdGlvbiBvZiBwZW5kaW5nIHNpZ25hbHMgdGhhdCBtaWdodApkaWZmIC0tZ2l0IGEvZnMvZXh0Mi9NYWtlZmlsZSBiL2ZzL2V4dDIvTWFrZWZpbGUKaW5kZXggYzVkMDJkYS4uZTBiMmI0MyAxMDA2NDQKLS0tIGEvZnMvZXh0Mi9NYWtlZmlsZQorKysgYi9mcy9leHQyL01ha2VmaWxlCkBAIC00LDcgKzQsNyBAQAogCiBvYmotJChDT05GSUdfRVhUMl9GUykgKz0gZXh0Mi5vCiAKLWV4dDIteSA6PSBiYWxsb2MubyBiaXRtYXAubyBkaXIubyBmaWxlLm8gZnN5bmMubyBpYWxsb2MubyBpbm9kZS5vIFwKK2V4dDIteSA6PSBiYWxsb2MubyBkaXIubyBmaWxlLm8gZnN5bmMubyBpYWxsb2MubyBpbm9kZS5vIFwKIAkgIGlvY3RsLm8gbmFtZWkubyBzdXBlci5vIHN5bWxpbmsubwogCiBleHQyLSQoQ09ORklHX0VYVDJfRlNfWEFUVFIpCSArPSB4YXR0ci5vIHhhdHRyX3VzZXIubyB4YXR0cl90cnVzdGVkLm8KZGlmZiAtLWdpdCBhL2ZzL2V4dDIvYmFsbG9jLmMgYi9mcy9leHQyL2JhbGxvYy5jCmluZGV4IDJjMDA5NTMuLjQzM2EyMTMgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDIvYmFsbG9jLmMKKysrIGIvZnMvZXh0Mi9iYWxsb2MuYwpAQCAtNTIxLDYgKzUyMSwyNiBAQAogCWdvdG8gb3V0X3JlbGVhc2U7CiB9CiAKKyNpZmRlZiBFWFQyRlNfREVCVUcKKworc3RhdGljIGludCBuaWJibGVtYXBbXSA9IHs0LCAzLCAzLCAyLCAzLCAyLCAyLCAxLCAzLCAyLCAyLCAxLCAyLCAxLCAxLCAwfTsKKwordW5zaWduZWQgbG9uZyBleHQyX2NvdW50X2ZyZWUgKHN0cnVjdCBidWZmZXJfaGVhZCAqIG1hcCwgdW5zaWduZWQgaW50IG51bWNoYXJzKQoreworCXVuc2lnbmVkIGludCBpOworCXVuc2lnbmVkIGxvbmcgc3VtID0gMDsKKworCWlmICghbWFwKQorCQlyZXR1cm4gKDApOworCWZvciAoaSA9IDA7IGkgPCBudW1jaGFyczsgaSsrKQorCQlzdW0gKz0gbmliYmxlbWFwW21hcC0+Yl9kYXRhW2ldICYgMHhmXSArCisJCQluaWJibGVtYXBbKG1hcC0+Yl9kYXRhW2ldID4+IDQpICYgMHhmXTsKKwlyZXR1cm4gKHN1bSk7Cit9CisKKyNlbmRpZiAgLyogIEVYVDJGU19ERUJVRyAgKi8KKworLyogU3VwZXJibG9jayBtdXN0IGJlIGxvY2tlZCAqLwogdW5zaWduZWQgbG9uZyBleHQyX2NvdW50X2ZyZWVfYmxvY2tzIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYikKIHsKIAlzdHJ1Y3QgZXh0Ml9ncm91cF9kZXNjICogZGVzYzsKQEAgLTUzMCw3ICs1NTAsNiBAQAogCXVuc2lnbmVkIGxvbmcgYml0bWFwX2NvdW50LCB4OwogCXN0cnVjdCBleHQyX3N1cGVyX2Jsb2NrICplczsKIAotCWxvY2tfc3VwZXIgKHNiKTsKIAllcyA9IEVYVDJfU0Ioc2IpLT5zX2VzOwogCWRlc2NfY291bnQgPSAwOwogCWJpdG1hcF9jb3VudCA9IDA7CkBAIC01NTQsNyArNTczLDYgQEAKIAlwcmludGsoImV4dDJfY291bnRfZnJlZV9ibG9ja3M6IHN0b3JlZCA9ICVsdSwgY29tcHV0ZWQgPSAlbHUsICVsdVxuIiwKIAkJKGxvbmcpbGUzMl90b19jcHUoZXMtPnNfZnJlZV9ibG9ja3NfY291bnQpLAogCQlkZXNjX2NvdW50LCBiaXRtYXBfY291bnQpOwotCXVubG9ja19zdXBlciAoc2IpOwogCXJldHVybiBiaXRtYXBfY291bnQ7CiAjZWxzZQogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgRVhUMl9TQihzYiktPnNfZ3JvdXBzX2NvdW50OyBpKyspIHsKZGlmZiAtLWdpdCBhL2ZzL2V4dDIvYml0bWFwLmMgYi9mcy9leHQyL2JpdG1hcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTk4M2EwLi4wMDAwMDAwCi0tLSBhL2ZzL2V4dDIvYml0bWFwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogIGxpbnV4L2ZzL2V4dDIvYml0bWFwLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUKLSAqIFJlbXkgQ2FyZCAoY2FyZEBtYXNpLmlicC5mcikKLSAqIExhYm9yYXRvaXJlIE1BU0kgLSBJbnN0aXR1dCBCbGFpc2UgUGFzY2FsCi0gKiBVbml2ZXJzaXRlIFBpZXJyZSBldCBNYXJpZSBDdXJpZSAoUGFyaXMgVkkpCi0gKi8KLQotI2lmZGVmIEVYVDJGU19ERUJVRwotCi0jaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KLQotI2luY2x1ZGUgImV4dDIuaCIKLQotc3RhdGljIGludCBuaWJibGVtYXBbXSA9IHs0LCAzLCAzLCAyLCAzLCAyLCAyLCAxLCAzLCAyLCAyLCAxLCAyLCAxLCAxLCAwfTsKLQotdW5zaWduZWQgbG9uZyBleHQyX2NvdW50X2ZyZWUgKHN0cnVjdCBidWZmZXJfaGVhZCAqIG1hcCwgdW5zaWduZWQgaW50IG51bWNoYXJzKQotewotCXVuc2lnbmVkIGludCBpOwotCXVuc2lnbmVkIGxvbmcgc3VtID0gMDsKLQkKLQlpZiAoIW1hcCkgCi0JCXJldHVybiAoMCk7Ci0JZm9yIChpID0gMDsgaSA8IG51bWNoYXJzOyBpKyspCi0JCXN1bSArPSBuaWJibGVtYXBbbWFwLT5iX2RhdGFbaV0gJiAweGZdICsKLQkJCW5pYmJsZW1hcFsobWFwLT5iX2RhdGFbaV0gPj4gNCkgJiAweGZdOwotCXJldHVybiAoc3VtKTsKLX0KLQotI2VuZGlmICAvKiAgRVhUMkZTX0RFQlVHICAqLwotCmRpZmYgLS1naXQgYS9mcy9leHQyL2Rpci5jIGIvZnMvZXh0Mi9kaXIuYwppbmRleCAzYzFjOWFhLi45MmVhODI2IDEwMDY0NAotLS0gYS9mcy9leHQyL2Rpci5jCisrKyBiL2ZzL2V4dDIvZGlyLmMKQEAgLTM5OSw4ICszOTksNyBAQAogCWRlID0gZXh0Ml9maW5kX2VudHJ5IChkaXIsIGRlbnRyeSwgJnBhZ2UpOwogCWlmIChkZSkgewogCQlyZXMgPSBsZTMyX3RvX2NwdShkZS0+aW5vZGUpOwotCQlrdW5tYXAocGFnZSk7Ci0JCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwkJZXh0Ml9wdXRfcGFnZShwYWdlKTsKIAl9CiAJcmV0dXJuIHJlczsKIH0KZGlmZiAtLWdpdCBhL2ZzL2V4dDIvZnN5bmMuYyBiL2ZzL2V4dDIvZnN5bmMuYwppbmRleCBjOWMyZTVmLi43ODA2YjllIDEwMDY0NAotLS0gYS9mcy9leHQyL2ZzeW5jLmMKKysrIGIvZnMvZXh0Mi9mc3luYy5jCkBAIC0yNCw3ICsyNCw3IEBACiAKICNpbmNsdWRlICJleHQyLmgiCiAjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgkJLyogZm9yIGZzeW5jX2lub2RlX2J1ZmZlcnMoKSAqLworI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CQkvKiBmb3Igc3luY19tYXBwaW5nX2J1ZmZlcnMoKSAqLwogCiAKIC8qCmRpZmYgLS1naXQgYS9mcy9leHQyL2lhbGxvYy5jIGIvZnMvZXh0Mi9pYWxsb2MuYwppbmRleCBlNTI3NjUyLi4zMDhjMjUyIDEwMDY0NAotLS0gYS9mcy9leHQyL2lhbGxvYy5jCisrKyBiL2ZzL2V4dDIvaWFsbG9jLmMKQEAgLTYzOCw2ICs2MzgsNyBAQAogCXJldHVybiBFUlJfUFRSKGVycik7CiB9CiAKKy8qIFN1cGVyYmxvY2sgbXVzdCBiZSBsb2NrZWQgKi8KIHVuc2lnbmVkIGxvbmcgZXh0Ml9jb3VudF9mcmVlX2lub2RlcyAoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IpCiB7CiAJc3RydWN0IGV4dDJfZ3JvdXBfZGVzYyAqZGVzYzsKQEAgLTY0OSw3ICs2NTAsNiBAQAogCXVuc2lnbmVkIGxvbmcgYml0bWFwX2NvdW50ID0gMDsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJpdG1hcF9iaCA9IE5VTEw7CiAKLQlsb2NrX3N1cGVyIChzYik7CiAJZXMgPSBFWFQyX1NCKHNiKS0+c19lczsKIAlmb3IgKGkgPSAwOyBpIDwgRVhUMl9TQihzYiktPnNfZ3JvdXBzX2NvdW50OyBpKyspIHsKIAkJdW5zaWduZWQgeDsKQEAgLTY3Miw3ICs2NzIsNiBAQAogCXByaW50aygiZXh0Ml9jb3VudF9mcmVlX2lub2Rlczogc3RvcmVkID0gJWx1LCBjb21wdXRlZCA9ICVsdSwgJWx1XG4iLAogCQlwZXJjcHVfY291bnRlcl9yZWFkKCZFWFQyX1NCKHNiKS0+c19mcmVlaW5vZGVzX2NvdW50ZXIpLAogCQlkZXNjX2NvdW50LCBiaXRtYXBfY291bnQpOwotCXVubG9ja19zdXBlcihzYik7CiAJcmV0dXJuIGRlc2NfY291bnQ7CiAjZWxzZQogCWZvciAoaSA9IDA7IGkgPCBFWFQyX1NCKHNiKS0+c19ncm91cHNfY291bnQ7IGkrKykgewpkaWZmIC0tZ2l0IGEvZnMvZXh0Mi9zdXBlci5jIGIvZnMvZXh0Mi9zdXBlci5jCmluZGV4IGVlNGJhNzUuLmQ0MjMzYjIgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDIvc3VwZXIuYworKysgYi9mcy9leHQyL3N1cGVyLmMKQEAgLTg1NCw3ICs4NTQsNiBAQAogCX0KIAlpZiAoIWV4dDJfY2hlY2tfZGVzY3JpcHRvcnMgKHNiKSkgewogCQlwcmludGsgKCJFWFQyLWZzOiBncm91cCBkZXNjcmlwdG9ycyBjb3JydXB0ZWQhXG4iKTsKLQkJZGJfY291bnQgPSBpOwogCQlnb3RvIGZhaWxlZF9tb3VudDI7CiAJfQogCXNiaS0+c19nZGJfY291bnQgPSBkYl9jb3VudDsKQEAgLTEwNDYsNiArMTA0NSw3IEBACiAJdW5zaWduZWQgbG9uZyBvdmVyaGVhZDsKIAlpbnQgaTsKIAorCWxvY2tfc3VwZXIoc2IpOwogCWlmICh0ZXN0X29wdCAoc2IsIE1JTklYX0RGKSkKIAkJb3ZlcmhlYWQgPSAwOwogCWVsc2UgewpAQCAtMTA4Niw2ICsxMDg2LDcgQEAKIAlidWYtPmZfZmlsZXMgPSBsZTMyX3RvX2NwdShzYmktPnNfZXMtPnNfaW5vZGVzX2NvdW50KTsKIAlidWYtPmZfZmZyZWUgPSBleHQyX2NvdW50X2ZyZWVfaW5vZGVzIChzYik7CiAJYnVmLT5mX25hbWVsZW4gPSBFWFQyX05BTUVfTEVOOworCXVubG9ja19zdXBlcihzYik7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL2V4dDMvYmFsbG9jLmMgYi9mcy9leHQzL2JhbGxvYy5jCmluZGV4IDc3OTI3ZDYuLjk2MTcyZTggMTAwNjQ0Ci0tLSBhL2ZzL2V4dDMvYmFsbG9jLmMKKysrIGIvZnMvZXh0My9iYWxsb2MuYwpAQCAtMTYzLDIwICsxNjMsMTkgQEAKICNlbmRpZgogCiBzdGF0aWMgaW50Ci1nb2FsX2luX215X3Jlc2VydmF0aW9uKHN0cnVjdCBleHQzX3Jlc2VydmVfd2luZG93ICpyc3YsIGludCBnb2FsLAorZ29hbF9pbl9teV9yZXNlcnZhdGlvbihzdHJ1Y3QgZXh0M19yZXNlcnZlX3dpbmRvdyAqcnN2LCBleHQzX2dycGJsa190IGdycF9nb2FsLAogCQkJdW5zaWduZWQgaW50IGdyb3VwLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYikKIHsKLQl1bnNpZ25lZCBsb25nIGdyb3VwX2ZpcnN0X2Jsb2NrLCBncm91cF9sYXN0X2Jsb2NrOworCWV4dDNfZnNibGtfdCBncm91cF9maXJzdF9ibG9jaywgZ3JvdXBfbGFzdF9ibG9jazsKIAotCWdyb3VwX2ZpcnN0X2Jsb2NrID0gbGUzMl90b19jcHUoRVhUM19TQihzYiktPnNfZXMtPnNfZmlyc3RfZGF0YV9ibG9jaykgKwotCQkJCWdyb3VwICogRVhUM19CTE9DS1NfUEVSX0dST1VQKHNiKTsKKwlncm91cF9maXJzdF9ibG9jayA9IGV4dDNfZ3JvdXBfZmlyc3RfYmxvY2tfbm8oc2IsIGdyb3VwKTsKIAlncm91cF9sYXN0X2Jsb2NrID0gZ3JvdXBfZmlyc3RfYmxvY2sgKyBFWFQzX0JMT0NLU19QRVJfR1JPVVAoc2IpIC0gMTsKIAogCWlmICgocnN2LT5fcnN2X3N0YXJ0ID4gZ3JvdXBfbGFzdF9ibG9jaykgfHwKIAkgICAgKHJzdi0+X3Jzdl9lbmQgPCBncm91cF9maXJzdF9ibG9jaykpCiAJCXJldHVybiAwOwotCWlmICgoZ29hbCA+PSAwKSAmJiAoKGdvYWwgKyBncm91cF9maXJzdF9ibG9jayA8IHJzdi0+X3Jzdl9zdGFydCkKLQkJfHwgKGdvYWwgKyBncm91cF9maXJzdF9ibG9jayA+IHJzdi0+X3Jzdl9lbmQpKSkKKwlpZiAoKGdycF9nb2FsID49IDApICYmICgoZ3JwX2dvYWwgKyBncm91cF9maXJzdF9ibG9jayA8IHJzdi0+X3Jzdl9zdGFydCkKKwkJfHwgKGdycF9nb2FsICsgZ3JvdXBfZmlyc3RfYmxvY2sgPiByc3YtPl9yc3ZfZW5kKSkpCiAJCXJldHVybiAwOwogCXJldHVybiAxOwogfQpAQCAtMTg3LDcgKzE4Niw3IEBACiAgKiBSZXR1cm5zIE5VTEwgaWYgdGhlcmUgYXJlIG5vIHdpbmRvd3Mgb3IgaWYgYWxsIHdpbmRvd3Mgc3RhcnQgYWZ0ZXIgdGhlIGdvYWwuCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgZXh0M19yZXNlcnZlX3dpbmRvd19ub2RlICoKLXNlYXJjaF9yZXNlcnZlX3dpbmRvdyhzdHJ1Y3QgcmJfcm9vdCAqcm9vdCwgdW5zaWduZWQgbG9uZyBnb2FsKQorc2VhcmNoX3Jlc2VydmVfd2luZG93KHN0cnVjdCByYl9yb290ICpyb290LCBleHQzX2ZzYmxrX3QgZ29hbCkKIHsKIAlzdHJ1Y3QgcmJfbm9kZSAqbiA9IHJvb3QtPnJiX25vZGU7CiAJc3RydWN0IGV4dDNfcmVzZXJ2ZV93aW5kb3dfbm9kZSAqcnN2OwpAQCAtMjIzLDcgKzIyMiw3IEBACiB7CiAJc3RydWN0IHJiX3Jvb3QgKnJvb3QgPSAmRVhUM19TQihzYiktPnNfcnN2X3dpbmRvd19yb290OwogCXN0cnVjdCByYl9ub2RlICpub2RlID0gJnJzdi0+cnN2X25vZGU7Ci0JdW5zaWduZWQgaW50IHN0YXJ0ID0gcnN2LT5yc3Zfc3RhcnQ7CisJZXh0M19mc2Jsa190IHN0YXJ0ID0gcnN2LT5yc3Zfc3RhcnQ7CiAKIAlzdHJ1Y3QgcmJfbm9kZSAqKiBwID0gJnJvb3QtPnJiX25vZGU7CiAJc3RydWN0IHJiX25vZGUgKiBwYXJlbnQgPSBOVUxMOwpAQCAtMzEwLDIwICszMDksMjAgQEAKIAogLyogRnJlZSBnaXZlbiBibG9ja3MsIHVwZGF0ZSBxdW90YSBhbmQgaV9ibG9ja3MgZmllbGQgKi8KIHZvaWQgZXh0M19mcmVlX2Jsb2Nrc19zYihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAotCQkJIHVuc2lnbmVkIGxvbmcgYmxvY2ssIHVuc2lnbmVkIGxvbmcgY291bnQsCi0JCQkgaW50ICpwZHF1b3RfZnJlZWRfYmxvY2tzKQorCQkJIGV4dDNfZnNibGtfdCBibG9jaywgdW5zaWduZWQgbG9uZyBjb3VudCwKKwkJCSB1bnNpZ25lZCBsb25nICpwZHF1b3RfZnJlZWRfYmxvY2tzKQogewogCXN0cnVjdCBidWZmZXJfaGVhZCAqYml0bWFwX2JoID0gTlVMTDsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmdkX2JoOwogCXVuc2lnbmVkIGxvbmcgYmxvY2tfZ3JvdXA7Ci0JdW5zaWduZWQgbG9uZyBiaXQ7CisJZXh0M19ncnBibGtfdCBiaXQ7CiAJdW5zaWduZWQgbG9uZyBpOwogCXVuc2lnbmVkIGxvbmcgb3ZlcmZsb3c7CiAJc3RydWN0IGV4dDNfZ3JvdXBfZGVzYyAqIGRlc2M7CiAJc3RydWN0IGV4dDNfc3VwZXJfYmxvY2sgKiBlczsKIAlzdHJ1Y3QgZXh0M19zYl9pbmZvICpzYmk7CiAJaW50IGVyciA9IDAsIHJldDsKLQl1bnNpZ25lZCBncm91cF9mcmVlZDsKKwlleHQzX2dycGJsa190IGdyb3VwX2ZyZWVkOwogCiAJKnBkcXVvdF9mcmVlZF9ibG9ja3MgPSAwOwogCXNiaSA9IEVYVDNfU0Ioc2IpOwpAQCAtMzMzLDcgKzMzMiw3IEBACiAJICAgIGJsb2NrICsgY291bnQgPiBsZTMyX3RvX2NwdShlcy0+c19ibG9ja3NfY291bnQpKSB7CiAJCWV4dDNfZXJyb3IgKHNiLCAiZXh0M19mcmVlX2Jsb2NrcyIsCiAJCQkgICAgIkZyZWVpbmcgYmxvY2tzIG5vdCBpbiBkYXRhem9uZSAtICIKLQkJCSAgICAiYmxvY2sgPSAlbHUsIGNvdW50ID0gJWx1IiwgYmxvY2ssIGNvdW50KTsKKwkJCSAgICAiYmxvY2sgPSAiRTNGU0JMSyIsIGNvdW50ID0gJWx1IiwgYmxvY2ssIGNvdW50KTsKIAkJZ290byBlcnJvcl9yZXR1cm47CiAJfQogCkBAIC0zNjksNyArMzY4LDcgQEAKIAkJICAgICAgc2JpLT5zX2l0Yl9wZXJfZ3JvdXApKQogCQlleHQzX2Vycm9yIChzYiwgImV4dDNfZnJlZV9ibG9ja3MiLAogCQkJICAgICJGcmVlaW5nIGJsb2NrcyBpbiBzeXN0ZW0gem9uZXMgLSAiCi0JCQkgICAgIkJsb2NrID0gJWx1LCBjb3VudCA9ICVsdSIsCisJCQkgICAgIkJsb2NrID0gIkUzRlNCTEsiLCBjb3VudCA9ICVsdSIsCiAJCQkgICAgYmxvY2ssIGNvdW50KTsKIAogCS8qCkBAIC00NTMsNyArNDUyLDggQEAKIAkJCQkJCWJpdCArIGksIGJpdG1hcF9iaC0+Yl9kYXRhKSkgewogCQkJamJkX3VubG9ja19iaF9zdGF0ZShiaXRtYXBfYmgpOwogCQkJZXh0M19lcnJvcihzYiwgX19GVU5DVElPTl9fLAotCQkJCSJiaXQgYWxyZWFkeSBjbGVhcmVkIGZvciBibG9jayAlbHUiLCBibG9jayArIGkpOworCQkJCSJiaXQgYWxyZWFkeSBjbGVhcmVkIGZvciBibG9jayAiRTNGU0JMSywKKwkJCQkgYmxvY2sgKyBpKTsKIAkJCWpiZF9sb2NrX2JoX3N0YXRlKGJpdG1hcF9iaCk7CiAJCQlCVUZGRVJfVFJBQ0UoYml0bWFwX2JoLCAiYml0IGFscmVhZHkgY2xlYXJlZCIpOwogCQl9IGVsc2UgewpAQCAtNDkzLDEwICs0OTMsMTAgQEAKIAogLyogRnJlZSBnaXZlbiBibG9ja3MsIHVwZGF0ZSBxdW90YSBhbmQgaV9ibG9ja3MgZmllbGQgKi8KIHZvaWQgZXh0M19mcmVlX2Jsb2NrcyhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJdW5zaWduZWQgbG9uZyBibG9jaywgdW5zaWduZWQgbG9uZyBjb3VudCkKKwkJCWV4dDNfZnNibGtfdCBibG9jaywgdW5zaWduZWQgbG9uZyBjb3VudCkKIHsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYjsKLQlpbnQgZHF1b3RfZnJlZWRfYmxvY2tzOworCXVuc2lnbmVkIGxvbmcgZHF1b3RfZnJlZWRfYmxvY2tzOwogCiAJc2IgPSBpbm9kZS0+aV9zYjsKIAlpZiAoIXNiKSB7CkBAIC01MjUsNyArNTI1LDcgQEAKICAqIGRhdGEtd3JpdGVzIGF0IHNvbWUgcG9pbnQsIGFuZCBkaXNhYmxlIGl0IGZvciBtZXRhZGF0YSBhbGxvY2F0aW9ucyBvcgogICogc3luYy1kYXRhIGlub2Rlcy4KICAqLwotc3RhdGljIGludCBleHQzX3Rlc3RfYWxsb2NhdGFibGUoaW50IG5yLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQorc3RhdGljIGludCBleHQzX3Rlc3RfYWxsb2NhdGFibGUoZXh0M19ncnBibGtfdCBuciwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKIHsKIAlpbnQgcmV0OwogCXN0cnVjdCBqb3VybmFsX2hlYWQgKmpoID0gYmgyamgoYmgpOwpAQCAtNTQyLDExICs1NDIsMTEgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50Ci1iaXRtYXBfc2VhcmNoX25leHRfdXNhYmxlX2Jsb2NrKGludCBzdGFydCwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwKLQkJCQkJaW50IG1heGJsb2NrcykKK3N0YXRpYyBleHQzX2dycGJsa190CitiaXRtYXBfc2VhcmNoX25leHRfdXNhYmxlX2Jsb2NrKGV4dDNfZ3JwYmxrX3Qgc3RhcnQsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsCisJCQkJCWV4dDNfZ3JwYmxrX3QgbWF4YmxvY2tzKQogewotCWludCBuZXh0OworCWV4dDNfZ3JwYmxrX3QgbmV4dDsKIAlzdHJ1Y3Qgam91cm5hbF9oZWFkICpqaCA9IGJoMmpoKGJoKTsKIAogCS8qCkBAIC01NzYsMTAgKzU3NiwxMSBAQAogICogdGhlIGluaXRpYWwgZ29hbDsgdGhlbiBmb3IgYSBmcmVlIGJ5dGUgc29tZXdoZXJlIGluIHRoZSBiaXRtYXA7IHRoZW4KICAqIGZvciBhbnkgZnJlZSBiaXQgaW4gdGhlIGJpdG1hcC4KICAqLwotc3RhdGljIGludAotZmluZF9uZXh0X3VzYWJsZV9ibG9jayhpbnQgc3RhcnQsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGludCBtYXhibG9ja3MpCitzdGF0aWMgZXh0M19ncnBibGtfdAorZmluZF9uZXh0X3VzYWJsZV9ibG9jayhleHQzX2dycGJsa190IHN0YXJ0LCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLAorCQkJZXh0M19ncnBibGtfdCBtYXhibG9ja3MpCiB7Ci0JaW50IGhlcmUsIG5leHQ7CisJZXh0M19ncnBibGtfdCBoZXJlLCBuZXh0OwogCWNoYXIgKnAsICpyOwogCiAJaWYgKHN0YXJ0ID4gMCkgewpAQCAtNTkxLDcgKzU5Miw3IEBACiAJCSAqIGxlc3MgdGhhbiBFWFQzX0JMT0NLU19QRVJfR1JPVVAuIEFsaWduaW5nIHVwIHRvIHRoZQogCQkgKiBuZXh0IDY0LWJpdCBib3VuZGFyeSBpcyBzaW1wbGUuLgogCQkgKi8KLQkJaW50IGVuZF9nb2FsID0gKHN0YXJ0ICsgNjMpICYgfjYzOworCQlleHQzX2dycGJsa190IGVuZF9nb2FsID0gKHN0YXJ0ICsgNjMpICYgfjYzOwogCQlpZiAoZW5kX2dvYWwgPiBtYXhibG9ja3MpCiAJCQllbmRfZ29hbCA9IG1heGJsb2NrczsKIAkJaGVyZSA9IGV4dDNfZmluZF9uZXh0X3plcm9fYml0KGJoLT5iX2RhdGEsIGVuZF9nb2FsLCBzdGFydCk7CkBAIC02MjgsNyArNjI5LDcgQEAKICAqIHplcm8gKGZhaWx1cmUpLgogICovCiBzdGF0aWMgaW5saW5lIGludAotY2xhaW1fYmxvY2soc3BpbmxvY2tfdCAqbG9jaywgaW50IGJsb2NrLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQorY2xhaW1fYmxvY2soc3BpbmxvY2tfdCAqbG9jaywgZXh0M19ncnBibGtfdCBibG9jaywgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKIHsKIAlzdHJ1Y3Qgam91cm5hbF9oZWFkICpqaCA9IGJoMmpoKGJoKTsKIAlpbnQgcmV0OwpAQCAtNjUxLDE5ICs2NTIsMTggQEAKICAqIG5ldyBiaXRtYXAuICBJbiB0aGF0IGNhc2Ugd2UgbXVzdCByZWxlYXNlIHdyaXRlIGFjY2VzcyB0byB0aGUgb2xkIG9uZSB2aWEKICAqIGV4dDNfam91cm5hbF9yZWxlYXNlX2J1ZmZlcigpLCBlbHNlIHdlJ2xsIHJ1biBvdXQgb2YgY3JlZGl0cy4KICAqLwotc3RhdGljIGludAorc3RhdGljIGV4dDNfZ3JwYmxrX3QKIGV4dDNfdHJ5X3RvX2FsbG9jYXRlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGhhbmRsZV90ICpoYW5kbGUsIGludCBncm91cCwKLQkJCXN0cnVjdCBidWZmZXJfaGVhZCAqYml0bWFwX2JoLCBpbnQgZ29hbCwKKwkJCXN0cnVjdCBidWZmZXJfaGVhZCAqYml0bWFwX2JoLCBleHQzX2dycGJsa190IGdycF9nb2FsLAogCQkJdW5zaWduZWQgbG9uZyAqY291bnQsIHN0cnVjdCBleHQzX3Jlc2VydmVfd2luZG93ICpteV9yc3YpCiB7Ci0JaW50IGdyb3VwX2ZpcnN0X2Jsb2NrLCBzdGFydCwgZW5kOworCWV4dDNfZnNibGtfdCBncm91cF9maXJzdF9ibG9jazsKKwlleHQzX2dycGJsa190IHN0YXJ0LCBlbmQ7CiAJdW5zaWduZWQgbG9uZyBudW0gPSAwOwogCiAJLyogd2UgZG8gYWxsb2NhdGlvbiB3aXRoaW4gdGhlIHJlc2VydmF0aW9uIHdpbmRvdyBpZiB3ZSBoYXZlIGEgd2luZG93ICovCiAJaWYgKG15X3JzdikgewotCQlncm91cF9maXJzdF9ibG9jayA9Ci0JCQlsZTMyX3RvX2NwdShFWFQzX1NCKHNiKS0+c19lcy0+c19maXJzdF9kYXRhX2Jsb2NrKSArCi0JCQlncm91cCAqIEVYVDNfQkxPQ0tTX1BFUl9HUk9VUChzYik7CisJCWdyb3VwX2ZpcnN0X2Jsb2NrID0gZXh0M19ncm91cF9maXJzdF9ibG9ja19ubyhzYiwgZ3JvdXApOwogCQlpZiAobXlfcnN2LT5fcnN2X3N0YXJ0ID49IGdyb3VwX2ZpcnN0X2Jsb2NrKQogCQkJc3RhcnQgPSBteV9yc3YtPl9yc3Zfc3RhcnQgLSBncm91cF9maXJzdF9ibG9jazsKIAkJZWxzZQpAQCAtNjczLDEzICs2NzMsMTMgQEAKIAkJaWYgKGVuZCA+IEVYVDNfQkxPQ0tTX1BFUl9HUk9VUChzYikpCiAJCQkvKiByZXNlcnZhdGlvbiB3aW5kb3cgY3Jvc3NlcyBncm91cCBib3VuZGFyeSAqLwogCQkJZW5kID0gRVhUM19CTE9DS1NfUEVSX0dST1VQKHNiKTsKLQkJaWYgKChzdGFydCA8PSBnb2FsKSAmJiAoZ29hbCA8IGVuZCkpCi0JCQlzdGFydCA9IGdvYWw7CisJCWlmICgoc3RhcnQgPD0gZ3JwX2dvYWwpICYmIChncnBfZ29hbCA8IGVuZCkpCisJCQlzdGFydCA9IGdycF9nb2FsOwogCQllbHNlCi0JCQlnb2FsID0gLTE7CisJCQlncnBfZ29hbCA9IC0xOwogCX0gZWxzZSB7Ci0JCWlmIChnb2FsID4gMCkKLQkJCXN0YXJ0ID0gZ29hbDsKKwkJaWYgKGdycF9nb2FsID4gMCkKKwkJCXN0YXJ0ID0gZ3JwX2dvYWw7CiAJCWVsc2UKIAkJCXN0YXJ0ID0gMDsKIAkJZW5kID0gRVhUM19CTE9DS1NfUEVSX0dST1VQKHNiKTsKQEAgLTY4OCw0MyArNjg4LDQzIEBACiAJQlVHX09OKHN0YXJ0ID4gRVhUM19CTE9DS1NfUEVSX0dST1VQKHNiKSk7CiAKIHJlcGVhdDoKLQlpZiAoZ29hbCA8IDAgfHwgIWV4dDNfdGVzdF9hbGxvY2F0YWJsZShnb2FsLCBiaXRtYXBfYmgpKSB7Ci0JCWdvYWwgPSBmaW5kX25leHRfdXNhYmxlX2Jsb2NrKHN0YXJ0LCBiaXRtYXBfYmgsIGVuZCk7Ci0JCWlmIChnb2FsIDwgMCkKKwlpZiAoZ3JwX2dvYWwgPCAwIHx8ICFleHQzX3Rlc3RfYWxsb2NhdGFibGUoZ3JwX2dvYWwsIGJpdG1hcF9iaCkpIHsKKwkJZ3JwX2dvYWwgPSBmaW5kX25leHRfdXNhYmxlX2Jsb2NrKHN0YXJ0LCBiaXRtYXBfYmgsIGVuZCk7CisJCWlmIChncnBfZ29hbCA8IDApCiAJCQlnb3RvIGZhaWxfYWNjZXNzOwogCQlpZiAoIW15X3JzdikgewogCQkJaW50IGk7CiAKLQkJCWZvciAoaSA9IDA7IGkgPCA3ICYmIGdvYWwgPiBzdGFydCAmJgotCQkJCQlleHQzX3Rlc3RfYWxsb2NhdGFibGUoZ29hbCAtIDEsCisJCQlmb3IgKGkgPSAwOyBpIDwgNyAmJiBncnBfZ29hbCA+IHN0YXJ0ICYmCisJCQkJCWV4dDNfdGVzdF9hbGxvY2F0YWJsZShncnBfZ29hbCAtIDEsCiAJCQkJCQkJCWJpdG1hcF9iaCk7Ci0JCQkJCWkrKywgZ29hbC0tKQorCQkJCQlpKyssIGdycF9nb2FsLS0pCiAJCQkJOwogCQl9CiAJfQotCXN0YXJ0ID0gZ29hbDsKKwlzdGFydCA9IGdycF9nb2FsOwogCi0JaWYgKCFjbGFpbV9ibG9jayhzYl9iZ2xfbG9jayhFWFQzX1NCKHNiKSwgZ3JvdXApLCBnb2FsLCBiaXRtYXBfYmgpKSB7CisJaWYgKCFjbGFpbV9ibG9jayhzYl9iZ2xfbG9jayhFWFQzX1NCKHNiKSwgZ3JvdXApLCBncnBfZ29hbCwgYml0bWFwX2JoKSkgewogCQkvKgogCQkgKiBUaGUgYmxvY2sgd2FzIGFsbG9jYXRlZCBieSBhbm90aGVyIHRocmVhZCwgb3IgaXQgd2FzCiAJCSAqIGFsbG9jYXRlZCBhbmQgdGhlbiBmcmVlZCBieSBhbm90aGVyIHRocmVhZAogCQkgKi8KIAkJc3RhcnQrKzsKLQkJZ29hbCsrOworCQlncnBfZ29hbCsrOwogCQlpZiAoc3RhcnQgPj0gZW5kKQogCQkJZ290byBmYWlsX2FjY2VzczsKIAkJZ290byByZXBlYXQ7CiAJfQogCW51bSsrOwotCWdvYWwrKzsKLQl3aGlsZSAobnVtIDwgKmNvdW50ICYmIGdvYWwgPCBlbmQKLQkJJiYgZXh0M190ZXN0X2FsbG9jYXRhYmxlKGdvYWwsIGJpdG1hcF9iaCkKLQkJJiYgY2xhaW1fYmxvY2soc2JfYmdsX2xvY2soRVhUM19TQihzYiksIGdyb3VwKSwgZ29hbCwgYml0bWFwX2JoKSkgeworCWdycF9nb2FsKys7CisJd2hpbGUgKG51bSA8ICpjb3VudCAmJiBncnBfZ29hbCA8IGVuZAorCQkmJiBleHQzX3Rlc3RfYWxsb2NhdGFibGUoZ3JwX2dvYWwsIGJpdG1hcF9iaCkKKwkJJiYgY2xhaW1fYmxvY2soc2JfYmdsX2xvY2soRVhUM19TQihzYiksIGdyb3VwKSwgZ3JwX2dvYWwsIGJpdG1hcF9iaCkpIHsKIAkJbnVtKys7Ci0JCWdvYWwrKzsKKwkJZ3JwX2dvYWwrKzsKIAl9CiAJKmNvdW50ID0gbnVtOwotCXJldHVybiBnb2FsIC0gbnVtOworCXJldHVybiBncnBfZ29hbCAtIG51bTsKIGZhaWxfYWNjZXNzOgogCSpjb3VudCA9IG51bTsKIAlyZXR1cm4gLTE7CkBAIC03NjYsMTIgKzc2NiwxMyBAQAogc3RhdGljIGludCBmaW5kX25leHRfcmVzZXJ2YWJsZV93aW5kb3coCiAJCQkJc3RydWN0IGV4dDNfcmVzZXJ2ZV93aW5kb3dfbm9kZSAqc2VhcmNoX2hlYWQsCiAJCQkJc3RydWN0IGV4dDNfcmVzZXJ2ZV93aW5kb3dfbm9kZSAqbXlfcnN2LAotCQkJCXN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLCBpbnQgc3RhcnRfYmxvY2ssCi0JCQkJaW50IGxhc3RfYmxvY2spCisJCQkJc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsCisJCQkJZXh0M19mc2Jsa190IHN0YXJ0X2Jsb2NrLAorCQkJCWV4dDNfZnNibGtfdCBsYXN0X2Jsb2NrKQogewogCXN0cnVjdCByYl9ub2RlICpuZXh0OwogCXN0cnVjdCBleHQzX3Jlc2VydmVfd2luZG93X25vZGUgKnJzdiwgKnByZXY7Ci0JaW50IGN1cjsKKwlleHQzX2ZzYmxrX3QgY3VyOwogCWludCBzaXplID0gbXlfcnN2LT5yc3ZfZ29hbF9zaXplOwogCiAJLyogVE9ETzogbWFrZSB0aGUgc3RhcnQgb2YgdGhlIHJlc2VydmF0aW9uIHdpbmRvdyBieXRlLWFsaWduZWQgKi8KQEAgLTg3MywxMCArODc0LDEwIEBACiAgKgogICoJQHJzdjogdGhlIHJlc2VydmF0aW9uCiAgKgotICoJQGdvYWw6IFRoZSBnb2FsIChncm91cC1yZWxhdGl2ZSkuICBJdCBpcyB3aGVyZSB0aGUgc2VhcmNoIGZvciBhCisgKglAZ3JwX2dvYWw6IFRoZSBnb2FsIChncm91cC1yZWxhdGl2ZSkuICBJdCBpcyB3aGVyZSB0aGUgc2VhcmNoIGZvciBhCiAgKgkJZnJlZSByZXNlcnZhYmxlIHNwYWNlIHNob3VsZCBzdGFydCBmcm9tLgotICoJCWlmIHdlIGhhdmUgYSBnb2FsKGdvYWwgPjAgKSwgdGhlbiBzdGFydCBmcm9tIHRoZXJlLAotICoJCW5vIGdvYWwoZ29hbCA9IC0xKSwgd2Ugc3RhcnQgZnJvbSB0aGUgZmlyc3QgYmxvY2sKKyAqCQlpZiB3ZSBoYXZlIGEgZ3JwX2dvYWwoZ3JwX2dvYWwgPjAgKSwgdGhlbiBzdGFydCBmcm9tIHRoZXJlLAorICoJCW5vIGdycF9nb2FsKGdycF9nb2FsID0gLTEpLCB3ZSBzdGFydCBmcm9tIHRoZSBmaXJzdCBibG9jawogICoJCW9mIHRoZSBncm91cC4KICAqCiAgKglAc2I6IHRoZSBzdXBlciBibG9jawpAQCAtODg1LDI1ICs4ODYsMjQgQEAKICAqCiAgKi8KIHN0YXRpYyBpbnQgYWxsb2NfbmV3X3Jlc2VydmF0aW9uKHN0cnVjdCBleHQzX3Jlc2VydmVfd2luZG93X25vZGUgKm15X3JzdiwKLQkJaW50IGdvYWwsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCWV4dDNfZ3JwYmxrX3QgZ3JwX2dvYWwsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCiAJCXVuc2lnbmVkIGludCBncm91cCwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaXRtYXBfYmgpCiB7CiAJc3RydWN0IGV4dDNfcmVzZXJ2ZV93aW5kb3dfbm9kZSAqc2VhcmNoX2hlYWQ7Ci0JaW50IGdyb3VwX2ZpcnN0X2Jsb2NrLCBncm91cF9lbmRfYmxvY2ssIHN0YXJ0X2Jsb2NrOwotCWludCBmaXJzdF9mcmVlX2Jsb2NrOworCWV4dDNfZnNibGtfdCBncm91cF9maXJzdF9ibG9jaywgZ3JvdXBfZW5kX2Jsb2NrLCBzdGFydF9ibG9jazsKKwlleHQzX2dycGJsa190IGZpcnN0X2ZyZWVfYmxvY2s7CiAJc3RydWN0IHJiX3Jvb3QgKmZzX3Jzdl9yb290ID0gJkVYVDNfU0Ioc2IpLT5zX3Jzdl93aW5kb3dfcm9vdDsKIAl1bnNpZ25lZCBsb25nIHNpemU7CiAJaW50IHJldDsKIAlzcGlubG9ja190ICpyc3ZfbG9jayA9ICZFWFQzX1NCKHNiKS0+c19yc3Zfd2luZG93X2xvY2s7CiAKLQlncm91cF9maXJzdF9ibG9jayA9IGxlMzJfdG9fY3B1KEVYVDNfU0Ioc2IpLT5zX2VzLT5zX2ZpcnN0X2RhdGFfYmxvY2spICsKLQkJCQlncm91cCAqIEVYVDNfQkxPQ0tTX1BFUl9HUk9VUChzYik7CisJZ3JvdXBfZmlyc3RfYmxvY2sgPSBleHQzX2dyb3VwX2ZpcnN0X2Jsb2NrX25vKHNiLCBncm91cCk7CiAJZ3JvdXBfZW5kX2Jsb2NrID0gZ3JvdXBfZmlyc3RfYmxvY2sgKyBFWFQzX0JMT0NLU19QRVJfR1JPVVAoc2IpIC0gMTsKIAotCWlmIChnb2FsIDwgMCkKKwlpZiAoZ3JwX2dvYWwgPCAwKQogCQlzdGFydF9ibG9jayA9IGdyb3VwX2ZpcnN0X2Jsb2NrOwogCWVsc2UKLQkJc3RhcnRfYmxvY2sgPSBnb2FsICsgZ3JvdXBfZmlyc3RfYmxvY2s7CisJCXN0YXJ0X2Jsb2NrID0gZ3JwX2dvYWwgKyBncm91cF9maXJzdF9ibG9jazsKIAogCXNpemUgPSBteV9yc3YtPnJzdl9nb2FsX3NpemU7CiAKQEAgLTEwNTcsMTQgKzEwNTcsMTUgQEAKICAqIHNvcnRlZCBkb3VibGUgbGlua2VkIGxpc3Qgc2hvdWxkIGJlIGZhc3QuCiAgKgogICovCi1zdGF0aWMgaW50CitzdGF0aWMgZXh0M19ncnBibGtfdAogZXh0M190cnlfdG9fYWxsb2NhdGVfd2l0aF9yc3Yoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaGFuZGxlX3QgKmhhbmRsZSwKIAkJCXVuc2lnbmVkIGludCBncm91cCwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaXRtYXBfYmgsCi0JCQlpbnQgZ29hbCwgc3RydWN0IGV4dDNfcmVzZXJ2ZV93aW5kb3dfbm9kZSAqIG15X3JzdiwKKwkJCWV4dDNfZ3JwYmxrX3QgZ3JwX2dvYWwsCisJCQlzdHJ1Y3QgZXh0M19yZXNlcnZlX3dpbmRvd19ub2RlICogbXlfcnN2LAogCQkJdW5zaWduZWQgbG9uZyAqY291bnQsIGludCAqZXJycCkKIHsKLQl1bnNpZ25lZCBsb25nIGdyb3VwX2ZpcnN0X2Jsb2NrOwotCWludCByZXQgPSAwOworCWV4dDNfZnNibGtfdCBncm91cF9maXJzdF9ibG9jazsKKwlleHQzX2dycGJsa190IHJldCA9IDA7CiAJaW50IGZhdGFsOwogCXVuc2lnbmVkIGxvbmcgbnVtID0gKmNvdW50OwogCkBAIC0xMDkwLDE3ICsxMDkxLDE2IEBACiAJICovCiAJaWYgKG15X3JzdiA9PSBOVUxMICkgewogCQlyZXQgPSBleHQzX3RyeV90b19hbGxvY2F0ZShzYiwgaGFuZGxlLCBncm91cCwgYml0bWFwX2JoLAotCQkJCQkJZ29hbCwgY291bnQsIE5VTEwpOworCQkJCQkJZ3JwX2dvYWwsIGNvdW50LCBOVUxMKTsKIAkJZ290byBvdXQ7CiAJfQogCS8qCi0JICogZ29hbCBpcyBhIGdyb3VwIHJlbGF0aXZlIGJsb2NrIG51bWJlciAoaWYgdGhlcmUgaXMgYSBnb2FsKQotCSAqIDAgPCBnb2FsIDwgRVhUM19CTE9DS1NfUEVSX0dST1VQKHNiKQorCSAqIGdycF9nb2FsIGlzIGEgZ3JvdXAgcmVsYXRpdmUgYmxvY2sgbnVtYmVyIChpZiB0aGVyZSBpcyBhIGdvYWwpCisJICogMCA8IGdycF9nb2FsIDwgRVhUM19CTE9DS1NfUEVSX0dST1VQKHNiKQogCSAqIGZpcnN0IGJsb2NrIGlzIGEgZmlsZXN5c3RlbSB3aWRlIGJsb2NrIG51bWJlcgogCSAqIGZpcnN0IGJsb2NrIGlzIHRoZSBibG9jayBudW1iZXIgb2YgdGhlIGZpcnN0IGJsb2NrIGluIHRoaXMgZ3JvdXAKIAkgKi8KLQlncm91cF9maXJzdF9ibG9jayA9IGxlMzJfdG9fY3B1KEVYVDNfU0Ioc2IpLT5zX2VzLT5zX2ZpcnN0X2RhdGFfYmxvY2spICsKLQkJCWdyb3VwICogRVhUM19CTE9DS1NfUEVSX0dST1VQKHNiKTsKKwlncm91cF9maXJzdF9ibG9jayA9IGV4dDNfZ3JvdXBfZmlyc3RfYmxvY2tfbm8oc2IsIGdyb3VwKTsKIAogCS8qCiAJICogQmFzaWNhbGx5IHdlIHdpbGwgYWxsb2NhdGUgYSBuZXcgYmxvY2sgZnJvbSBpbm9kZSdzIHJlc2VydmF0aW9uCkBAIC0xMTE5LDI0ICsxMTE5LDI0IEBACiAJICovCiAJd2hpbGUgKDEpIHsKIAkJaWYgKHJzdl9pc19lbXB0eSgmbXlfcnN2LT5yc3Zfd2luZG93KSB8fCAocmV0IDwgMCkgfHwKLQkJCSFnb2FsX2luX215X3Jlc2VydmF0aW9uKCZteV9yc3YtPnJzdl93aW5kb3csIGdvYWwsIGdyb3VwLCBzYikpIHsKKwkJCSFnb2FsX2luX215X3Jlc2VydmF0aW9uKCZteV9yc3YtPnJzdl93aW5kb3csIGdycF9nb2FsLCBncm91cCwgc2IpKSB7CiAJCQlpZiAobXlfcnN2LT5yc3ZfZ29hbF9zaXplIDwgKmNvdW50KQogCQkJCW15X3Jzdi0+cnN2X2dvYWxfc2l6ZSA9ICpjb3VudDsKLQkJCXJldCA9IGFsbG9jX25ld19yZXNlcnZhdGlvbihteV9yc3YsIGdvYWwsIHNiLAorCQkJcmV0ID0gYWxsb2NfbmV3X3Jlc2VydmF0aW9uKG15X3JzdiwgZ3JwX2dvYWwsIHNiLAogCQkJCQkJCWdyb3VwLCBiaXRtYXBfYmgpOwogCQkJaWYgKHJldCA8IDApCiAJCQkJYnJlYWs7CQkJLyogZmFpbGVkICovCiAKLQkJCWlmICghZ29hbF9pbl9teV9yZXNlcnZhdGlvbigmbXlfcnN2LT5yc3Zfd2luZG93LCBnb2FsLCBncm91cCwgc2IpKQotCQkJCWdvYWwgPSAtMTsKLQkJfSBlbHNlIGlmIChnb2FsID4gMCAmJiAobXlfcnN2LT5yc3ZfZW5kLWdvYWwrMSkgPCAqY291bnQpCisJCQlpZiAoIWdvYWxfaW5fbXlfcmVzZXJ2YXRpb24oJm15X3Jzdi0+cnN2X3dpbmRvdywgZ3JwX2dvYWwsIGdyb3VwLCBzYikpCisJCQkJZ3JwX2dvYWwgPSAtMTsKKwkJfSBlbHNlIGlmIChncnBfZ29hbCA+IDAgJiYgKG15X3Jzdi0+cnN2X2VuZC1ncnBfZ29hbCsxKSA8ICpjb3VudCkKIAkJCXRyeV90b19leHRlbmRfcmVzZXJ2YXRpb24obXlfcnN2LCBzYiwKLQkJCQkJKmNvdW50LW15X3Jzdi0+cnN2X2VuZCArIGdvYWwgLSAxKTsKKwkJCQkJKmNvdW50LW15X3Jzdi0+cnN2X2VuZCArIGdycF9nb2FsIC0gMSk7CiAKIAkJaWYgKChteV9yc3YtPnJzdl9zdGFydCA+PSBncm91cF9maXJzdF9ibG9jayArIEVYVDNfQkxPQ0tTX1BFUl9HUk9VUChzYikpCiAJCSAgICB8fCAobXlfcnN2LT5yc3ZfZW5kIDwgZ3JvdXBfZmlyc3RfYmxvY2spKQogCQkJQlVHKCk7Ci0JCXJldCA9IGV4dDNfdHJ5X3RvX2FsbG9jYXRlKHNiLCBoYW5kbGUsIGdyb3VwLCBiaXRtYXBfYmgsIGdvYWwsCisJCXJldCA9IGV4dDNfdHJ5X3RvX2FsbG9jYXRlKHNiLCBoYW5kbGUsIGdyb3VwLCBiaXRtYXBfYmgsIGdycF9nb2FsLAogCQkJCQkgICAmbnVtLCAmbXlfcnN2LT5yc3Zfd2luZG93KTsKIAkJaWYgKHJldCA+PSAwKSB7CiAJCQlteV9yc3YtPnJzdl9hbGxvY19oaXQgKz0gbnVtOwpAQCAtMTE2NCw3ICsxMTY0LDcgQEAKIAogc3RhdGljIGludCBleHQzX2hhc19mcmVlX2Jsb2NrcyhzdHJ1Y3QgZXh0M19zYl9pbmZvICpzYmkpCiB7Ci0JaW50IGZyZWVfYmxvY2tzLCByb290X2Jsb2NrczsKKwlleHQzX2ZzYmxrX3QgZnJlZV9ibG9ja3MsIHJvb3RfYmxvY2tzOwogCiAJZnJlZV9ibG9ja3MgPSBwZXJjcHVfY291bnRlcl9yZWFkX3Bvc2l0aXZlKCZzYmktPnNfZnJlZWJsb2Nrc19jb3VudGVyKTsKIAlyb290X2Jsb2NrcyA9IGxlMzJfdG9fY3B1KHNiaS0+c19lcy0+c19yX2Jsb2Nrc19jb3VudCk7CkBAIC0xMjAwLDE5ICsxMjAwLDIwIEBACiAgKiBiaXRtYXAsIGFuZCB0aGVuIGZvciBhbnkgZnJlZSBiaXQgaWYgdGhhdCBmYWlscy4KICAqIFRoaXMgZnVuY3Rpb24gYWxzbyB1cGRhdGVzIHF1b3RhIGFuZCBpX2Jsb2NrcyBmaWVsZC4KICAqLwotaW50IGV4dDNfbmV3X2Jsb2NrcyhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJdW5zaWduZWQgbG9uZyBnb2FsLCB1bnNpZ25lZCBsb25nICpjb3VudCwgaW50ICplcnJwKQorZXh0M19mc2Jsa190IGV4dDNfbmV3X2Jsb2NrcyhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJZXh0M19mc2Jsa190IGdvYWwsIHVuc2lnbmVkIGxvbmcgKmNvdW50LCBpbnQgKmVycnApCiB7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaXRtYXBfYmggPSBOVUxMOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqZ2RwX2JoOwogCWludCBncm91cF9ubzsKIAlpbnQgZ29hbF9ncm91cDsKLQlpbnQgcmV0X2Jsb2NrOworCWV4dDNfZ3JwYmxrX3QgZ3JwX3RhcmdldF9ibGs7CS8qIGJsb2NrZ3JvdXAgcmVsYXRpdmUgZ29hbCBibG9jayAqLworCWV4dDNfZ3JwYmxrX3QgZ3JwX2FsbG9jX2JsazsJLyogYmxvY2tncm91cC1yZWxhdGl2ZSBhbGxvY2F0ZWQgYmxvY2sqLworCWV4dDNfZnNibGtfdCByZXRfYmxvY2s7CQkvKiBmaWxlc3lldGVtLXdpZGUgYWxsb2NhdGVkIGJsb2NrICovCiAJaW50IGJnaTsJCQkvKiBibG9ja2dyb3VwIGl0ZXJhdGlvbiBpbmRleCAqLwotCWludCB0YXJnZXRfYmxvY2s7CiAJaW50IGZhdGFsID0gMCwgZXJyOwogCWludCBwZXJmb3JtZWRfYWxsb2NhdGlvbiA9IDA7Ci0JaW50IGZyZWVfYmxvY2tzOworCWV4dDNfZ3JwYmxrX3QgZnJlZV9ibG9ja3M7CS8qIG51bWJlciBvZiBmcmVlIGJsb2NrcyBpbiBhIGdyb3VwICovCiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsKIAlzdHJ1Y3QgZXh0M19ncm91cF9kZXNjICpnZHA7CiAJc3RydWN0IGV4dDNfc3VwZXJfYmxvY2sgKmVzOwpAQCAtMTI4NSwxNiArMTI4NiwxNyBAQAogCQlteV9yc3YgPSBOVUxMOwogCiAJaWYgKGZyZWVfYmxvY2tzID4gMCkgewotCQlyZXRfYmxvY2sgPSAoKGdvYWwgLSBsZTMyX3RvX2NwdShlcy0+c19maXJzdF9kYXRhX2Jsb2NrKSkgJQorCQlncnBfdGFyZ2V0X2JsayA9ICgoZ29hbCAtIGxlMzJfdG9fY3B1KGVzLT5zX2ZpcnN0X2RhdGFfYmxvY2spKSAlCiAJCQkJRVhUM19CTE9DS1NfUEVSX0dST1VQKHNiKSk7CiAJCWJpdG1hcF9iaCA9IHJlYWRfYmxvY2tfYml0bWFwKHNiLCBncm91cF9ubyk7CiAJCWlmICghYml0bWFwX2JoKQogCQkJZ290byBpb19lcnJvcjsKLQkJcmV0X2Jsb2NrID0gZXh0M190cnlfdG9fYWxsb2NhdGVfd2l0aF9yc3Yoc2IsIGhhbmRsZSwgZ3JvdXBfbm8sCi0JCQkJCWJpdG1hcF9iaCwgcmV0X2Jsb2NrLCBteV9yc3YsICZudW0sICZmYXRhbCk7CisJCWdycF9hbGxvY19ibGsgPSBleHQzX3RyeV90b19hbGxvY2F0ZV93aXRoX3JzdihzYiwgaGFuZGxlLAorCQkJCQlncm91cF9ubywgYml0bWFwX2JoLCBncnBfdGFyZ2V0X2JsaywKKwkJCQkJbXlfcnN2LAkmbnVtLCAmZmF0YWwpOwogCQlpZiAoZmF0YWwpCiAJCQlnb3RvIG91dDsKLQkJaWYgKHJldF9ibG9jayA+PSAwKQorCQlpZiAoZ3JwX2FsbG9jX2JsayA+PSAwKQogCQkJZ290byBhbGxvY2F0ZWQ7CiAJfQogCkBAIC0xMzI3LDExICsxMzI5LDE1IEBACiAJCWJpdG1hcF9iaCA9IHJlYWRfYmxvY2tfYml0bWFwKHNiLCBncm91cF9ubyk7CiAJCWlmICghYml0bWFwX2JoKQogCQkJZ290byBpb19lcnJvcjsKLQkJcmV0X2Jsb2NrID0gZXh0M190cnlfdG9fYWxsb2NhdGVfd2l0aF9yc3Yoc2IsIGhhbmRsZSwgZ3JvdXBfbm8sCi0JCQkJCWJpdG1hcF9iaCwgLTEsIG15X3JzdiwgJm51bSwgJmZhdGFsKTsKKwkJLyoKKwkJICogdHJ5IHRvIGFsbG9jYXRlIGJsb2NrKHMpIGZyb20gdGhpcyBncm91cCwgd2l0aG91dCBhIGdvYWwoLTEpLgorCQkgKi8KKwkJZ3JwX2FsbG9jX2JsayA9IGV4dDNfdHJ5X3RvX2FsbG9jYXRlX3dpdGhfcnN2KHNiLCBoYW5kbGUsCisJCQkJCWdyb3VwX25vLCBiaXRtYXBfYmgsIC0xLCBteV9yc3YsCisJCQkJCSZudW0sICZmYXRhbCk7CiAJCWlmIChmYXRhbCkKIAkJCWdvdG8gb3V0OwotCQlpZiAocmV0X2Jsb2NrID49IDApIAorCQlpZiAoZ3JwX2FsbG9jX2JsayA+PSAwKQogCQkJZ290byBhbGxvY2F0ZWQ7CiAJfQogCS8qCkBAIC0xMzYwLDE4ICsxMzY2LDE4IEBACiAJaWYgKGZhdGFsKQogCQlnb3RvIG91dDsKIAotCXRhcmdldF9ibG9jayA9IHJldF9ibG9jayArIGdyb3VwX25vICogRVhUM19CTE9DS1NfUEVSX0dST1VQKHNiKQotCQkJCSsgbGUzMl90b19jcHUoZXMtPnNfZmlyc3RfZGF0YV9ibG9jayk7CisJcmV0X2Jsb2NrID0gZ3JwX2FsbG9jX2JsayArIGV4dDNfZ3JvdXBfZmlyc3RfYmxvY2tfbm8oc2IsIGdyb3VwX25vKTsKIAotCWlmIChpbl9yYW5nZShsZTMyX3RvX2NwdShnZHAtPmJnX2Jsb2NrX2JpdG1hcCksIHRhcmdldF9ibG9jaywgbnVtKSB8fAotCSAgICBpbl9yYW5nZShsZTMyX3RvX2NwdShnZHAtPmJnX2lub2RlX2JpdG1hcCksIHRhcmdldF9ibG9jaywgbnVtKSB8fAotCSAgICBpbl9yYW5nZSh0YXJnZXRfYmxvY2ssIGxlMzJfdG9fY3B1KGdkcC0+YmdfaW5vZGVfdGFibGUpLAorCWlmIChpbl9yYW5nZShsZTMyX3RvX2NwdShnZHAtPmJnX2Jsb2NrX2JpdG1hcCksIHJldF9ibG9jaywgbnVtKSB8fAorCSAgICBpbl9yYW5nZShsZTMyX3RvX2NwdShnZHAtPmJnX2lub2RlX2JpdG1hcCksIHJldF9ibG9jaywgbnVtKSB8fAorCSAgICBpbl9yYW5nZShyZXRfYmxvY2ssIGxlMzJfdG9fY3B1KGdkcC0+YmdfaW5vZGVfdGFibGUpLAogCQkgICAgICBFWFQzX1NCKHNiKS0+c19pdGJfcGVyX2dyb3VwKSB8fAotCSAgICBpbl9yYW5nZSh0YXJnZXRfYmxvY2sgKyBudW0gLSAxLCBsZTMyX3RvX2NwdShnZHAtPmJnX2lub2RlX3RhYmxlKSwKKwkgICAgaW5fcmFuZ2UocmV0X2Jsb2NrICsgbnVtIC0gMSwgbGUzMl90b19jcHUoZ2RwLT5iZ19pbm9kZV90YWJsZSksCiAJCSAgICAgIEVYVDNfU0Ioc2IpLT5zX2l0Yl9wZXJfZ3JvdXApKQogCQlleHQzX2Vycm9yKHNiLCAiZXh0M19uZXdfYmxvY2siLAogCQkJICAgICJBbGxvY2F0aW5nIGJsb2NrIGluIHN5c3RlbSB6b25lIC0gIgotCQkJICAgICJibG9ja3MgZnJvbSAldSwgbGVuZ3RoICVsdSIsIHRhcmdldF9ibG9jaywgbnVtKTsKKwkJCSAgICAiYmxvY2tzIGZyb20gIkUzRlNCTEsiLCBsZW5ndGggJWx1IiwKKwkJCSAgICAgcmV0X2Jsb2NrLCBudW0pOwogCiAJcGVyZm9ybWVkX2FsbG9jYXRpb24gPSAxOwogCkBAIC0xMzgwLDcgKzEzODYsNyBAQAogCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRlYnVnX2JoOwogCiAJCS8qIFJlY29yZCBiaXRtYXAgYnVmZmVyIHN0YXRlIGluIHRoZSBuZXdseSBhbGxvY2F0ZWQgYmxvY2sgKi8KLQkJZGVidWdfYmggPSBzYl9maW5kX2dldF9ibG9jayhzYiwgdGFyZ2V0X2Jsb2NrKTsKKwkJZGVidWdfYmggPSBzYl9maW5kX2dldF9ibG9jayhzYiwgcmV0X2Jsb2NrKTsKIAkJaWYgKGRlYnVnX2JoKSB7CiAJCQlCVUZGRVJfVFJBQ0UoZGVidWdfYmgsICJzdGF0ZSB3aGVuIGFsbG9jYXRlZCIpOwogCQkJQlVGRkVSX1RSQUNFMihkZWJ1Z19iaCwgYml0bWFwX2JoLCAiYml0bWFwIHN0YXRlIik7CkBAIC0xMzkzLDI0ICsxMzk5LDIxIEBACiAJCWludCBpOwogCiAJCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgewotCQkJaWYgKGV4dDNfdGVzdF9iaXQocmV0X2Jsb2NrLAorCQkJaWYgKGV4dDNfdGVzdF9iaXQoZ3JwX2FsbG9jX2JsaytpLAogCQkJCQliaDJqaChiaXRtYXBfYmgpLT5iX2NvbW1pdHRlZF9kYXRhKSkgewogCQkJCXByaW50aygiJXM6IGJsb2NrIHdhcyB1bmV4cGVjdGVkbHkgc2V0IGluICIKIAkJCQkJImJfY29tbWl0dGVkX2RhdGFcbiIsIF9fRlVOQ1RJT05fXyk7CiAJCQl9CiAJCX0KIAl9Ci0JZXh0M19kZWJ1ZygiZm91bmQgYml0ICVkXG4iLCByZXRfYmxvY2spOworCWV4dDNfZGVidWcoImZvdW5kIGJpdCAlZFxuIiwgZ3JwX2FsbG9jX2Jsayk7CiAJc3Bpbl91bmxvY2soc2JfYmdsX2xvY2soc2JpLCBncm91cF9ubykpOwogCWpiZF91bmxvY2tfYmhfc3RhdGUoYml0bWFwX2JoKTsKICNlbmRpZgogCi0JLyogcmV0X2Jsb2NrIHdhcyBibG9ja2dyb3VwLXJlbGF0aXZlLiAgTm93IGl0IGJlY29tZXMgZnMtcmVsYXRpdmUgKi8KLQlyZXRfYmxvY2sgPSB0YXJnZXRfYmxvY2s7Ci0KIAlpZiAocmV0X2Jsb2NrICsgbnVtIC0gMSA+PSBsZTMyX3RvX2NwdShlcy0+c19ibG9ja3NfY291bnQpKSB7CiAJCWV4dDNfZXJyb3Ioc2IsICJleHQzX25ld19ibG9jayIsCi0JCQkgICAgImJsb2NrKCVkKSA+PSBibG9ja3MgY291bnQoJWQpIC0gIgorCQkJICAgICJibG9jaygiRTNGU0JMSyIpID49IGJsb2NrcyBjb3VudCglZCkgLSAiCiAJCQkgICAgImJsb2NrX2dyb3VwID0gJWQsIGVzID09ICVwICIsIHJldF9ibG9jaywKIAkJCWxlMzJfdG9fY3B1KGVzLT5zX2Jsb2Nrc19jb3VudCksIGdyb3VwX25vLCBlcyk7CiAJCWdvdG8gb3V0OwpAQCAtMTQyMSw3ICsxNDI0LDcgQEAKIAkgKiBsaXN0IG9mIHNvbWUgZGVzY3JpcHRpb24uICBXZSBkb24ndCBrbm93IGluIGFkdmFuY2Ugd2hldGhlcgogCSAqIHRoZSBjYWxsZXIgd2FudHMgdG8gdXNlIGl0IGFzIG1ldGFkYXRhIG9yIGRhdGEuCiAJICovCi0JZXh0M19kZWJ1ZygiYWxsb2NhdGluZyBibG9jayAlZC4gR29hbCBoaXRzICVkIG9mICVkLlxuIiwKKwlleHQzX2RlYnVnKCJhbGxvY2F0aW5nIGJsb2NrICVsdS4gR29hbCBoaXRzICVkIG9mICVkLlxuIiwKIAkJCXJldF9ibG9jaywgZ29hbF9oaXRzLCBnb2FsX2F0dGVtcHRzKTsKIAogCXNwaW5fbG9jayhzYl9iZ2xfbG9jayhzYmksIGdyb3VwX25vKSk7CkBAIC0xNDYxLDIzICsxNDY0LDI0IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBleHQzX25ld19ibG9jayhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJdW5zaWduZWQgbG9uZyBnb2FsLCBpbnQgKmVycnApCitleHQzX2ZzYmxrX3QgZXh0M19uZXdfYmxvY2soaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCWV4dDNfZnNibGtfdCBnb2FsLCBpbnQgKmVycnApCiB7CiAJdW5zaWduZWQgbG9uZyBjb3VudCA9IDE7CiAKIAlyZXR1cm4gZXh0M19uZXdfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIGdvYWwsICZjb3VudCwgZXJycCk7CiB9CiAKLXVuc2lnbmVkIGxvbmcgZXh0M19jb3VudF9mcmVlX2Jsb2NrcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQorZXh0M19mc2Jsa190IGV4dDNfY291bnRfZnJlZV9ibG9ja3Moc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKLQl1bnNpZ25lZCBsb25nIGRlc2NfY291bnQ7CisJZXh0M19mc2Jsa190IGRlc2NfY291bnQ7CiAJc3RydWN0IGV4dDNfZ3JvdXBfZGVzYyAqZ2RwOwogCWludCBpOwogCXVuc2lnbmVkIGxvbmcgbmdyb3VwcyA9IEVYVDNfU0Ioc2IpLT5zX2dyb3Vwc19jb3VudDsKICNpZmRlZiBFWFQzRlNfREVCVUcKIAlzdHJ1Y3QgZXh0M19zdXBlcl9ibG9jayAqZXM7Ci0JdW5zaWduZWQgbG9uZyBiaXRtYXBfY291bnQsIHg7CisJZXh0M19mc2Jsa190IGJpdG1hcF9jb3VudDsKKwl1bnNpZ25lZCBsb25nIHg7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaXRtYXBfYmggPSBOVUxMOwogCiAJZXMgPSBFWFQzX1NCKHNiKS0+c19lczsKQEAgLTE1MDIsOCArMTUwNiwxMCBAQAogCQliaXRtYXBfY291bnQgKz0geDsKIAl9CiAJYnJlbHNlKGJpdG1hcF9iaCk7Ci0JcHJpbnRrKCJleHQzX2NvdW50X2ZyZWVfYmxvY2tzOiBzdG9yZWQgPSAldSwgY29tcHV0ZWQgPSAlbHUsICVsdVxuIiwKLQkgICAgICAgbGUzMl90b19jcHUoZXMtPnNfZnJlZV9ibG9ja3NfY291bnQpLCBkZXNjX2NvdW50LCBiaXRtYXBfY291bnQpOworCXByaW50aygiZXh0M19jb3VudF9mcmVlX2Jsb2Nrczogc3RvcmVkID0gIkUzRlNCTEsKKwkJIiwgY29tcHV0ZWQgPSAiRTNGU0JMSyIsICJFM0ZTQkxLIlxuIiwKKwkgICAgICAgbGUzMl90b19jcHUoZXMtPnNfZnJlZV9ibG9ja3NfY291bnQpLAorCQlkZXNjX2NvdW50LCBiaXRtYXBfY291bnQpOwogCXJldHVybiBiaXRtYXBfY291bnQ7CiAjZWxzZQogCWRlc2NfY291bnQgPSAwOwpAQCAtMTUyMCw3ICsxNTI2LDcgQEAKIH0KIAogc3RhdGljIGlubGluZSBpbnQKLWJsb2NrX2luX3VzZSh1bnNpZ25lZCBsb25nIGJsb2NrLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1bnNpZ25lZCBjaGFyICptYXApCitibG9ja19pbl91c2UoZXh0M19mc2Jsa190IGJsb2NrLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1bnNpZ25lZCBjaGFyICptYXApCiB7CiAJcmV0dXJuIGV4dDNfdGVzdF9iaXQgKChibG9jayAtCiAJCWxlMzJfdG9fY3B1KEVYVDNfU0Ioc2IpLT5zX2VzLT5zX2ZpcnN0X2RhdGFfYmxvY2spKSAlCmRpZmYgLS1naXQgYS9mcy9leHQzL2lhbGxvYy5jIGIvZnMvZXh0My9pYWxsb2MuYwppbmRleCBkYzgyNjQ2Li4zNjU0NmVkIDEwMDY0NAotLS0gYS9mcy9leHQzL2lhbGxvYy5jCisrKyBiL2ZzL2V4dDMvaWFsbG9jLmMKQEAgLTI2Miw5ICsyNjIsMTEgQEAKIAlpbnQgbmdyb3VwcyA9IHNiaS0+c19ncm91cHNfY291bnQ7CiAJaW50IGlub2Rlc19wZXJfZ3JvdXAgPSBFWFQzX0lOT0RFU19QRVJfR1JPVVAoc2IpOwogCWludCBmcmVlaSwgYXZlZnJlZWk7Ci0JaW50IGZyZWViLCBhdmVmcmVlYjsKLQlpbnQgYmxvY2tzX3Blcl9kaXIsIG5kaXJzOwotCWludCBtYXhfZGVidCwgbWF4X2RpcnMsIG1pbl9ibG9ja3MsIG1pbl9pbm9kZXM7CisJZXh0M19mc2Jsa190IGZyZWViLCBhdmVmcmVlYjsKKwlleHQzX2ZzYmxrX3QgYmxvY2tzX3Blcl9kaXI7CisJaW50IG5kaXJzOworCWludCBtYXhfZGVidCwgbWF4X2RpcnMsIG1pbl9pbm9kZXM7CisJZXh0M19ncnBibGtfdCBtaW5fYmxvY2tzOwogCWludCBncm91cCA9IC0xLCBpOwogCXN0cnVjdCBleHQzX2dyb3VwX2Rlc2MgKmRlc2M7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKQEAgLTMwNyw3ICszMDksNyBAQAogCW1pbl9pbm9kZXMgPSBhdmVmcmVlaSAtIGlub2Rlc19wZXJfZ3JvdXAgLyA0OwogCW1pbl9ibG9ja3MgPSBhdmVmcmVlYiAtIEVYVDNfQkxPQ0tTX1BFUl9HUk9VUChzYikgLyA0OwogCi0JbWF4X2RlYnQgPSBFWFQzX0JMT0NLU19QRVJfR1JPVVAoc2IpIC8gbWF4KGJsb2Nrc19wZXJfZGlyLCBCTE9DS19DT1NUKTsKKwltYXhfZGVidCA9IEVYVDNfQkxPQ0tTX1BFUl9HUk9VUChzYikgLyBtYXgoYmxvY2tzX3Blcl9kaXIsIChleHQzX2ZzYmxrX3QpQkxPQ0tfQ09TVCk7CiAJaWYgKG1heF9kZWJ0ICogSU5PREVfQ09TVCA+IGlub2Rlc19wZXJfZ3JvdXApCiAJCW1heF9kZWJ0ID0gaW5vZGVzX3Blcl9ncm91cCAvIElOT0RFX0NPU1Q7CiAJaWYgKG1heF9kZWJ0ID4gMjU1KQpkaWZmIC0tZ2l0IGEvZnMvZXh0My9pbm9kZS5jIGIvZnMvZXh0My9pbm9kZS5jCmluZGV4IDJlZGQ3ZWUuLjAzMjFlMWIgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDMvaW5vZGUuYworKysgYi9mcy9leHQzL2lub2RlLmMKQEAgLTYyLDcgKzYyLDcgQEAKICAqIHN0aWxsIG5lZWRzIHRvIGJlIHJldm9rZWQuCiAgKi8KIGludCBleHQzX2ZvcmdldChoYW5kbGVfdCAqaGFuZGxlLCBpbnQgaXNfbWV0YWRhdGEsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBpbnQgYmxvY2tucikKKwkJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGV4dDNfZnNibGtfdCBibG9ja25yKQogewogCWludCBlcnI7CiAKQEAgLTQwNywxMyArNDA3LDEzIEBACiAgKgogICoJQ2FsbGVyIG11c3QgbWFrZSBzdXJlIHRoYXQgQGluZCBpcyB2YWxpZCBhbmQgd2lsbCBzdGF5IHRoYXQgd2F5LgogICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBleHQzX2ZpbmRfbmVhcihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBJbmRpcmVjdCAqaW5kKQorc3RhdGljIGV4dDNfZnNibGtfdCBleHQzX2ZpbmRfbmVhcihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBJbmRpcmVjdCAqaW5kKQogewogCXN0cnVjdCBleHQzX2lub2RlX2luZm8gKmVpID0gRVhUM19JKGlub2RlKTsKIAlfX2xlMzIgKnN0YXJ0ID0gaW5kLT5iaCA/IChfX2xlMzIqKSBpbmQtPmJoLT5iX2RhdGEgOiBlaS0+aV9kYXRhOwogCV9fbGUzMiAqcDsKLQl1bnNpZ25lZCBsb25nIGJnX3N0YXJ0OwotCXVuc2lnbmVkIGxvbmcgY29sb3VyOworCWV4dDNfZnNibGtfdCBiZ19zdGFydDsKKwlleHQzX2dycGJsa190IGNvbG91cjsKIAogCS8qIFRyeSB0byBmaW5kIHByZXZpb3VzIGJsb2NrICovCiAJZm9yIChwID0gaW5kLT5wIC0gMTsgcCA+PSBzdGFydDsgcC0tKSB7CkBAIC00MjksOCArNDI5LDcgQEAKIAkgKiBJdCBpcyBnb2luZyB0byBiZSByZWZlcnJlZCB0byBmcm9tIHRoZSBpbm9kZSBpdHNlbGY/IE9LLCBqdXN0IHB1dCBpdAogCSAqIGludG8gdGhlIHNhbWUgY3lsaW5kZXIgZ3JvdXAgdGhlbi4KIAkgKi8KLQliZ19zdGFydCA9IChlaS0+aV9ibG9ja19ncm91cCAqIEVYVDNfQkxPQ0tTX1BFUl9HUk9VUChpbm9kZS0+aV9zYikpICsKLQkJbGUzMl90b19jcHUoRVhUM19TQihpbm9kZS0+aV9zYiktPnNfZXMtPnNfZmlyc3RfZGF0YV9ibG9jayk7CisJYmdfc3RhcnQgPSBleHQzX2dyb3VwX2ZpcnN0X2Jsb2NrX25vKGlub2RlLT5pX3NiLCBlaS0+aV9ibG9ja19ncm91cCk7CiAJY29sb3VyID0gKGN1cnJlbnQtPnBpZCAlIDE2KSAqCiAJCQkoRVhUM19CTE9DS1NfUEVSX0dST1VQKGlub2RlLT5pX3NiKSAvIDE2KTsKIAlyZXR1cm4gYmdfc3RhcnQgKyBjb2xvdXI7CkBAIC00NDgsNyArNDQ3LDcgQEAKICAqCXN0b3JlcyBpdCBpbiAqQGdvYWwgYW5kIHJldHVybnMgemVyby4KICAqLwogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBleHQzX2ZpbmRfZ29hbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb25nIGJsb2NrLAorc3RhdGljIGV4dDNfZnNibGtfdCBleHQzX2ZpbmRfZ29hbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb25nIGJsb2NrLAogCQlJbmRpcmVjdCBjaGFpbls0XSwgSW5kaXJlY3QgKnBhcnRpYWwpCiB7CiAJc3RydWN0IGV4dDNfYmxvY2tfYWxsb2NfaW5mbyAqYmxvY2tfaTsKQEAgLTUxNiwxMyArNTE1LDEzIEBACiAgKgkJZGlyZWN0IGJsb2NrcwogICovCiBzdGF0aWMgaW50IGV4dDNfYWxsb2NfYmxvY2tzKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQl1bnNpZ25lZCBsb25nIGdvYWwsIGludCBpbmRpcmVjdF9ibGtzLCBpbnQgYmxrcywKLQkJCXVuc2lnbmVkIGxvbmcgbG9uZyBuZXdfYmxvY2tzWzRdLCBpbnQgKmVycikKKwkJCWV4dDNfZnNibGtfdCBnb2FsLCBpbnQgaW5kaXJlY3RfYmxrcywgaW50IGJsa3MsCisJCQlleHQzX2ZzYmxrX3QgbmV3X2Jsb2Nrc1s0XSwgaW50ICplcnIpCiB7CiAJaW50IHRhcmdldCwgaTsKIAl1bnNpZ25lZCBsb25nIGNvdW50ID0gMDsKIAlpbnQgaW5kZXggPSAwOwotCXVuc2lnbmVkIGxvbmcgY3VycmVudF9ibG9jayA9IDA7CisJZXh0M19mc2Jsa190IGN1cnJlbnRfYmxvY2sgPSAwOwogCWludCByZXQgPSAwOwogCiAJLyoKQEAgLTU5Miw3ICs1OTEsNyBAQAogICoJYXMgZGVzY3JpYmVkIGFib3ZlIGFuZCByZXR1cm4gMC4KICAqLwogc3RhdGljIGludCBleHQzX2FsbG9jX2JyYW5jaChoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJaW50IGluZGlyZWN0X2Jsa3MsIGludCAqYmxrcywgdW5zaWduZWQgbG9uZyBnb2FsLAorCQkJaW50IGluZGlyZWN0X2Jsa3MsIGludCAqYmxrcywgZXh0M19mc2Jsa190IGdvYWwsCiAJCQlpbnQgKm9mZnNldHMsIEluZGlyZWN0ICpicmFuY2gpCiB7CiAJaW50IGJsb2Nrc2l6ZSA9IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKQEAgLTYwMCw4ICs1OTksOCBAQAogCWludCBlcnIgPSAwOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CiAJaW50IG51bTsKLQl1bnNpZ25lZCBsb25nIGxvbmcgbmV3X2Jsb2Nrc1s0XTsKLQl1bnNpZ25lZCBsb25nIGxvbmcgY3VycmVudF9ibG9jazsKKwlleHQzX2ZzYmxrX3QgbmV3X2Jsb2Nrc1s0XTsKKwlleHQzX2ZzYmxrX3QgY3VycmVudF9ibG9jazsKIAogCW51bSA9IGV4dDNfYWxsb2NfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIGdvYWwsIGluZGlyZWN0X2Jsa3MsCiAJCQkJKmJsa3MsIG5ld19ibG9ja3MsICZlcnIpOwpAQCAtNjg4LDcgKzY4Nyw3IEBACiAJaW50IGk7CiAJaW50IGVyciA9IDA7CiAJc3RydWN0IGV4dDNfYmxvY2tfYWxsb2NfaW5mbyAqYmxvY2tfaTsKLQl1bnNpZ25lZCBsb25nIGN1cnJlbnRfYmxvY2s7CisJZXh0M19mc2Jsa190IGN1cnJlbnRfYmxvY2s7CiAKIAlibG9ja19pID0gRVhUM19JKGlub2RlKS0+aV9ibG9ja19hbGxvY19pbmZvOwogCS8qCkBAIC03OTUsMTMgKzc5NCwxMyBAQAogCWludCBvZmZzZXRzWzRdOwogCUluZGlyZWN0IGNoYWluWzRdOwogCUluZGlyZWN0ICpwYXJ0aWFsOwotCXVuc2lnbmVkIGxvbmcgZ29hbDsKKwlleHQzX2ZzYmxrX3QgZ29hbDsKIAlpbnQgaW5kaXJlY3RfYmxrczsKIAlpbnQgYmxvY2tzX3RvX2JvdW5kYXJ5ID0gMDsKIAlpbnQgZGVwdGg7CiAJc3RydWN0IGV4dDNfaW5vZGVfaW5mbyAqZWkgPSBFWFQzX0koaW5vZGUpOwogCWludCBjb3VudCA9IDA7Ci0JdW5zaWduZWQgbG9uZyBmaXJzdF9ibG9jayA9IDA7CisJZXh0M19mc2Jsa190IGZpcnN0X2Jsb2NrID0gMDsKIAogCiAJSl9BU1NFUlQoaGFuZGxlICE9IE5VTEwgfHwgY3JlYXRlID09IDApOwpAQCAtODE5LDcgKzgxOCw3IEBACiAJCWNvdW50Kys7CiAJCS8qbWFwIG1vcmUgYmxvY2tzKi8KIAkJd2hpbGUgKGNvdW50IDwgbWF4YmxvY2tzICYmIGNvdW50IDw9IGJsb2Nrc190b19ib3VuZGFyeSkgewotCQkJdW5zaWduZWQgbG9uZyBibGs7CisJCQlleHQzX2ZzYmxrX3QgYmxrOwogCiAJCQlpZiAoIXZlcmlmeV9jaGFpbihjaGFpbiwgcGFydGlhbCkpIHsKIAkJCQkvKgpAQCAtMTc1OSw3ICsxNzU4LDcgQEAKIHN0YXRpYyBpbnQgZXh0M19ibG9ja190cnVuY2F0ZV9wYWdlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBwYWdlICpwYWdlLAogCQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgbG9mZl90IGZyb20pCiB7Ci0JdW5zaWduZWQgbG9uZyBpbmRleCA9IGZyb20gPj4gUEFHRV9DQUNIRV9TSElGVDsKKwlleHQzX2ZzYmxrX3QgaW5kZXggPSBmcm9tID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CiAJdW5zaWduZWQgb2Zmc2V0ID0gZnJvbSAmIChQQUdFX0NBQ0hFX1NJWkUtMSk7CiAJdW5zaWduZWQgYmxvY2tzaXplLCBpYmxvY2ssIGxlbmd0aCwgcG9zOwogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBtYXBwaW5nLT5ob3N0OwpAQCAtMTk2MCw3ICsxOTU5LDcgQEAKICAqIHRoYW4gYGNvdW50JyBiZWNhdXNlIHRoZXJlIGNhbiBiZSBob2xlcyBpbiB0aGVyZS4KICAqLwogc3RhdGljIHZvaWQgZXh0M19jbGVhcl9ibG9ja3MoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKLQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgdW5zaWduZWQgbG9uZyBibG9ja190b19mcmVlLAorCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBleHQzX2ZzYmxrX3QgYmxvY2tfdG9fZnJlZSwKIAkJdW5zaWduZWQgbG9uZyBjb3VudCwgX19sZTMyICpmaXJzdCwgX19sZTMyICpsYXN0KQogewogCV9fbGUzMiAqcDsKQEAgLTIwMjIsMTIgKzIwMjEsMTIgQEAKIAkJCSAgIHN0cnVjdCBidWZmZXJfaGVhZCAqdGhpc19iaCwKIAkJCSAgIF9fbGUzMiAqZmlyc3QsIF9fbGUzMiAqbGFzdCkKIHsKLQl1bnNpZ25lZCBsb25nIGJsb2NrX3RvX2ZyZWUgPSAwOyAgICAvKiBTdGFydGluZyBibG9jayAjIG9mIGEgcnVuICovCisJZXh0M19mc2Jsa190IGJsb2NrX3RvX2ZyZWUgPSAwOyAgICAvKiBTdGFydGluZyBibG9jayAjIG9mIGEgcnVuICovCiAJdW5zaWduZWQgbG9uZyBjb3VudCA9IDA7CSAgICAvKiBOdW1iZXIgb2YgYmxvY2tzIGluIHRoZSBydW4gKi8gCiAJX19sZTMyICpibG9ja190b19mcmVlX3AgPSBOVUxMOwkgICAgLyogUG9pbnRlciBpbnRvIGlub2RlL2luZAogCQkJCQkgICAgICAgY29ycmVzcG9uZGluZyB0bwogCQkJCQkgICAgICAgYmxvY2tfdG9fZnJlZSAqLwotCXVuc2lnbmVkIGxvbmcgbnI7CQkgICAgLyogQ3VycmVudCBibG9jayAjICovCisJZXh0M19mc2Jsa190IG5yOwkJICAgIC8qIEN1cnJlbnQgYmxvY2sgIyAqLwogCV9fbGUzMiAqcDsJCQkgICAgLyogUG9pbnRlciBpbnRvIGlub2RlL2luZAogCQkJCQkgICAgICAgZm9yIGN1cnJlbnQgYmxvY2sgKi8KIAlpbnQgZXJyOwpAQCAtMjA4OSw3ICsyMDg4LDcgQEAKIAkJCSAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKnBhcmVudF9iaCwKIAkJCSAgICAgICBfX2xlMzIgKmZpcnN0LCBfX2xlMzIgKmxhc3QsIGludCBkZXB0aCkKIHsKLQl1bnNpZ25lZCBsb25nIG5yOworCWV4dDNfZnNibGtfdCBucjsKIAlfX2xlMzIgKnA7CiAKIAlpZiAoaXNfaGFuZGxlX2Fib3J0ZWQoaGFuZGxlKSkKQEAgLTIxMTMsNyArMjExMiw3IEBACiAJCQkgKi8KIAkJCWlmICghYmgpIHsKIAkJCQlleHQzX2Vycm9yKGlub2RlLT5pX3NiLCAiZXh0M19mcmVlX2JyYW5jaGVzIiwKLQkJCQkJICAgIlJlYWQgZmFpbHVyZSwgaW5vZGU9JWxkLCBibG9jaz0lbGQiLAorCQkJCQkgICAiUmVhZCBmYWlsdXJlLCBpbm9kZT0lbGQsIGJsb2NrPSJFM0ZTQkxLLAogCQkJCQkgICBpbm9kZS0+aV9pbm8sIG5yKTsKIAkJCQljb250aW51ZTsKIAkJCX0KQEAgLTIzOTQsMTEgKzIzOTMsMTIgQEAKIAlleHQzX2pvdXJuYWxfc3RvcChoYW5kbGUpOwogfQogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBleHQzX2dldF9pbm9kZV9ibG9jayhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorc3RhdGljIGV4dDNfZnNibGtfdCBleHQzX2dldF9pbm9kZV9ibG9jayhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAogCQl1bnNpZ25lZCBsb25nIGlubywgc3RydWN0IGV4dDNfaWxvYyAqaWxvYykKIHsKIAl1bnNpZ25lZCBsb25nIGRlc2MsIGdyb3VwX2Rlc2MsIGJsb2NrX2dyb3VwOwotCXVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBibG9jazsKKwl1bnNpZ25lZCBsb25nIG9mZnNldDsKKwlleHQzX2ZzYmxrX3QgYmxvY2s7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKIAlzdHJ1Y3QgZXh0M19ncm91cF9kZXNjICogZ2RwOwogCkBAIC0yNDQ4LDcgKzI0NDgsNyBAQAogc3RhdGljIGludCBfX2V4dDNfZ2V0X2lub2RlX2xvYyhzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJCXN0cnVjdCBleHQzX2lsb2MgKmlsb2MsIGludCBpbl9tZW0pCiB7Ci0JdW5zaWduZWQgbG9uZyBibG9jazsKKwlleHQzX2ZzYmxrX3QgYmxvY2s7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKIAogCWJsb2NrID0gZXh0M19nZXRfaW5vZGVfYmxvY2soaW5vZGUtPmlfc2IsIGlub2RlLT5pX2lubywgaWxvYyk7CkBAIC0yNDU5LDcgKzI0NTksOCBAQAogCWlmICghYmgpIHsKIAkJZXh0M19lcnJvciAoaW5vZGUtPmlfc2IsICJleHQzX2dldF9pbm9kZV9sb2MiLAogCQkJCSJ1bmFibGUgdG8gcmVhZCBpbm9kZSBibG9jayAtICIKLQkJCQkiaW5vZGU9JWx1LCBibG9jaz0lbHUiLCBpbm9kZS0+aV9pbm8sIGJsb2NrKTsKKwkJCQkiaW5vZGU9JWx1LCBibG9jaz0iRTNGU0JMSywKKwkJCQkgaW5vZGUtPmlfaW5vLCBibG9jayk7CiAJCXJldHVybiAtRUlPOwogCX0KIAlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaCkpIHsKQEAgLTI1NDAsNyArMjU0MSw3IEBACiAJCWlmICghYnVmZmVyX3VwdG9kYXRlKGJoKSkgewogCQkJZXh0M19lcnJvcihpbm9kZS0+aV9zYiwgImV4dDNfZ2V0X2lub2RlX2xvYyIsCiAJCQkJCSJ1bmFibGUgdG8gcmVhZCBpbm9kZSBibG9jayAtICIKLQkJCQkJImlub2RlPSVsdSwgYmxvY2s9JWx1IiwKKwkJCQkJImlub2RlPSVsdSwgYmxvY2s9IkUzRlNCTEssCiAJCQkJCWlub2RlLT5pX2lubywgYmxvY2spOwogCQkJYnJlbHNlKGJoKTsKIAkJCXJldHVybiAtRUlPOwpkaWZmIC0tZ2l0IGEvZnMvZXh0My9pb2N0bC5jIGIvZnMvZXh0My9pb2N0bC5jCmluZGV4IDhjMjJhYTkuLjNhNmIwMTIgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDMvaW9jdGwuYworKysgYi9mcy9leHQzL2lvY3RsLmMKQEAgLTIwNCw3ICsyMDQsNyBAQAogCQlyZXR1cm4gMDsKIAl9CiAJY2FzZSBFWFQzX0lPQ19HUk9VUF9FWFRFTkQ6IHsKLQkJdW5zaWduZWQgbG9uZyBuX2Jsb2Nrc19jb3VudDsKKwkJZXh0M19mc2Jsa190IG5fYmxvY2tzX2NvdW50OwogCQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CiAJCWludCBlcnI7CiAKZGlmZiAtLWdpdCBhL2ZzL2V4dDMvbmFtZWkuYyBiL2ZzL2V4dDMvbmFtZWkuYwppbmRleCBiOGY1Y2QxLi5kOTE3NmRiIDEwMDY0NAotLS0gYS9mcy9leHQzL25hbWVpLmMKKysrIGIvZnMvZXh0My9uYW1laS5jCkBAIC0xMzc5LDcgKzEzNzksNiBAQAogCWludAlkeF9mYWxsYmFjaz0wOwogI2VuZGlmCiAJdW5zaWduZWQgYmxvY2tzaXplOwotCXVuc2lnbmVkIG5sZW4sIHJsZW47CiAJdTMyIGJsb2NrLCBibG9ja3M7CiAKIAlzYiA9IGRpci0+aV9zYjsKQEAgLTE0MTcsOCArMTQxNiw3IEBACiAJCXJldHVybiByZXR2YWw7CiAJZGUgPSAoc3RydWN0IGV4dDNfZGlyX2VudHJ5XzIgKikgYmgtPmJfZGF0YTsKIAlkZS0+aW5vZGUgPSAwOwotCWRlLT5yZWNfbGVuID0gY3B1X3RvX2xlMTYocmxlbiA9IGJsb2Nrc2l6ZSk7Ci0JbmxlbiA9IDA7CisJZGUtPnJlY19sZW4gPSBjcHVfdG9fbGUxNihibG9ja3NpemUpOwogCXJldHVybiBhZGRfZGlyZW50X3RvX2J1ZihoYW5kbGUsIGRlbnRyeSwgaW5vZGUsIGRlLCBiaCk7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL2V4dDMvcmVzaXplLmMgYi9mcy9leHQzL3Jlc2l6ZS5jCmluZGV4IDM0YjM5ZTkuLmRmZDgxMTggMTAwNjQ0Ci0tLSBhL2ZzL2V4dDMvcmVzaXplLmMKKysrIGIvZnMvZXh0My9yZXNpemUuYwpAQCAtMjgsMTYgKzI4LDE2IEBACiB7CiAJc3RydWN0IGV4dDNfc2JfaW5mbyAqc2JpID0gRVhUM19TQihzYik7CiAJc3RydWN0IGV4dDNfc3VwZXJfYmxvY2sgKmVzID0gc2JpLT5zX2VzOwotCXVuc2lnbmVkIHN0YXJ0ID0gbGUzMl90b19jcHUoZXMtPnNfYmxvY2tzX2NvdW50KTsKLQl1bnNpZ25lZCBlbmQgPSBzdGFydCArIGlucHV0LT5ibG9ja3NfY291bnQ7CisJZXh0M19mc2Jsa190IHN0YXJ0ID0gbGUzMl90b19jcHUoZXMtPnNfYmxvY2tzX2NvdW50KTsKKwlleHQzX2ZzYmxrX3QgZW5kID0gc3RhcnQgKyBpbnB1dC0+YmxvY2tzX2NvdW50OwogCXVuc2lnbmVkIGdyb3VwID0gaW5wdXQtPmdyb3VwOwotCXVuc2lnbmVkIGl0ZW5kID0gaW5wdXQtPmlub2RlX3RhYmxlICsgc2JpLT5zX2l0Yl9wZXJfZ3JvdXA7CisJZXh0M19mc2Jsa190IGl0ZW5kID0gaW5wdXQtPmlub2RlX3RhYmxlICsgc2JpLT5zX2l0Yl9wZXJfZ3JvdXA7CiAJdW5zaWduZWQgb3ZlcmhlYWQgPSBleHQzX2JnX2hhc19zdXBlcihzYiwgZ3JvdXApID8KIAkJKDEgKyBleHQzX2JnX251bV9nZGIoc2IsIGdyb3VwKSArCiAJCSBsZTE2X3RvX2NwdShlcy0+c19yZXNlcnZlZF9nZHRfYmxvY2tzKSkgOiAwOwotCXVuc2lnbmVkIG1ldGFlbmQgPSBzdGFydCArIG92ZXJoZWFkOworCWV4dDNfZnNibGtfdCBtZXRhZW5kID0gc3RhcnQgKyBvdmVyaGVhZDsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKLQlpbnQgZnJlZV9ibG9ja3NfY291bnQ7CisJZXh0M19ncnBibGtfdCBmcmVlX2Jsb2Nrc19jb3VudDsKIAlpbnQgZXJyID0gLUVJTlZBTDsKIAogCWlucHV0LT5mcmVlX2Jsb2Nrc19jb3VudCA9IGZyZWVfYmxvY2tzX2NvdW50ID0KQEAgLTY0LDcgKzY0LDggQEAKIAkJZXh0M193YXJuaW5nKHNiLCBfX0ZVTkNUSU9OX18sICJCYWQgYmxvY2tzIGNvdW50ICV1IiwKIAkJCSAgICAgaW5wdXQtPmJsb2Nrc19jb3VudCk7CiAJZWxzZSBpZiAoIShiaCA9IHNiX2JyZWFkKHNiLCBlbmQgLSAxKSkpCi0JCWV4dDNfd2FybmluZyhzYiwgX19GVU5DVElPTl9fLCAiQ2Fubm90IHJlYWQgbGFzdCBibG9jayAoJXUpIiwKKwkJZXh0M193YXJuaW5nKHNiLCBfX0ZVTkNUSU9OX18sCisJCQkgICAgICJDYW5ub3QgcmVhZCBsYXN0IGJsb2NrICgiRTNGU0JMSyIpIiwKIAkJCSAgICAgZW5kIC0gMSk7CiAJZWxzZSBpZiAob3V0c2lkZShpbnB1dC0+YmxvY2tfYml0bWFwLCBzdGFydCwgZW5kKSkKIAkJZXh0M193YXJuaW5nKHNiLCBfX0ZVTkNUSU9OX18sCkBAIC03Nyw3ICs3OCw3IEBACiAJZWxzZSBpZiAob3V0c2lkZShpbnB1dC0+aW5vZGVfdGFibGUsIHN0YXJ0LCBlbmQpIHx8CiAJICAgICAgICAgb3V0c2lkZShpdGVuZCAtIDEsIHN0YXJ0LCBlbmQpKQogCQlleHQzX3dhcm5pbmcoc2IsIF9fRlVOQ1RJT05fXywKLQkJCSAgICAgIklub2RlIHRhYmxlIG5vdCBpbiBncm91cCAoYmxvY2tzICV1LSV1KSIsCisJCQkgICAgICJJbm9kZSB0YWJsZSBub3QgaW4gZ3JvdXAgKGJsb2NrcyAldS0iRTNGU0JMSyIpIiwKIAkJCSAgICAgaW5wdXQtPmlub2RlX3RhYmxlLCBpdGVuZCAtIDEpOwogCWVsc2UgaWYgKGlucHV0LT5pbm9kZV9iaXRtYXAgPT0gaW5wdXQtPmJsb2NrX2JpdG1hcCkKIAkJZXh0M193YXJuaW5nKHNiLCBfX0ZVTkNUSU9OX18sCkBAIC04NSwyNCArODYsMjcgQEAKIAkJCSAgICAgaW5wdXQtPmJsb2NrX2JpdG1hcCk7CiAJZWxzZSBpZiAoaW5zaWRlKGlucHV0LT5ibG9ja19iaXRtYXAsIGlucHV0LT5pbm9kZV90YWJsZSwgaXRlbmQpKQogCQlleHQzX3dhcm5pbmcoc2IsIF9fRlVOQ1RJT05fXywKLQkJCSAgICAgIkJsb2NrIGJpdG1hcCAoJXUpIGluIGlub2RlIHRhYmxlICgldS0ldSkiLAorCQkJICAgICAiQmxvY2sgYml0bWFwICgldSkgaW4gaW5vZGUgdGFibGUgKCV1LSJFM0ZTQkxLIikiLAogCQkJICAgICBpbnB1dC0+YmxvY2tfYml0bWFwLCBpbnB1dC0+aW5vZGVfdGFibGUsIGl0ZW5kLTEpOwogCWVsc2UgaWYgKGluc2lkZShpbnB1dC0+aW5vZGVfYml0bWFwLCBpbnB1dC0+aW5vZGVfdGFibGUsIGl0ZW5kKSkKIAkJZXh0M193YXJuaW5nKHNiLCBfX0ZVTkNUSU9OX18sCi0JCQkgICAgICJJbm9kZSBiaXRtYXAgKCV1KSBpbiBpbm9kZSB0YWJsZSAoJXUtJXUpIiwKKwkJCSAgICAgIklub2RlIGJpdG1hcCAoJXUpIGluIGlub2RlIHRhYmxlICgldS0iRTNGU0JMSyIpIiwKIAkJCSAgICAgaW5wdXQtPmlub2RlX2JpdG1hcCwgaW5wdXQtPmlub2RlX3RhYmxlLCBpdGVuZC0xKTsKIAllbHNlIGlmIChpbnNpZGUoaW5wdXQtPmJsb2NrX2JpdG1hcCwgc3RhcnQsIG1ldGFlbmQpKQogCQlleHQzX3dhcm5pbmcoc2IsIF9fRlVOQ1RJT05fXywKLQkJCSAgICAgIkJsb2NrIGJpdG1hcCAoJXUpIGluIEdEVCB0YWJsZSAoJXUtJXUpIiwKKwkJCSAgICAgIkJsb2NrIGJpdG1hcCAoJXUpIGluIEdEVCB0YWJsZSIKKwkJCSAgICAgIiAoIkUzRlNCTEsiLSJFM0ZTQkxLIikiLAogCQkJICAgICBpbnB1dC0+YmxvY2tfYml0bWFwLCBzdGFydCwgbWV0YWVuZCAtIDEpOwogCWVsc2UgaWYgKGluc2lkZShpbnB1dC0+aW5vZGVfYml0bWFwLCBzdGFydCwgbWV0YWVuZCkpCiAJCWV4dDNfd2FybmluZyhzYiwgX19GVU5DVElPTl9fLAotCQkJICAgICAiSW5vZGUgYml0bWFwICgldSkgaW4gR0RUIHRhYmxlICgldS0ldSkiLAorCQkJICAgICAiSW5vZGUgYml0bWFwICgldSkgaW4gR0RUIHRhYmxlIgorCQkJICAgICAiICgiRTNGU0JMSyItIkUzRlNCTEsiKSIsCiAJCQkgICAgIGlucHV0LT5pbm9kZV9iaXRtYXAsIHN0YXJ0LCBtZXRhZW5kIC0gMSk7CiAJZWxzZSBpZiAoaW5zaWRlKGlucHV0LT5pbm9kZV90YWJsZSwgc3RhcnQsIG1ldGFlbmQpIHx8CiAJICAgICAgICAgaW5zaWRlKGl0ZW5kIC0gMSwgc3RhcnQsIG1ldGFlbmQpKQogCQlleHQzX3dhcm5pbmcoc2IsIF9fRlVOQ1RJT05fXywKLQkJCSAgICAgIklub2RlIHRhYmxlICgldS0ldSkgb3ZlcmxhcHMgR0RUIHRhYmxlICgldS0ldSkiLAorCQkJICAgICAiSW5vZGUgdGFibGUgKCV1LSJFM0ZTQkxLIikgb3ZlcmxhcHMiCisJCQkgICAgICJHRFQgdGFibGUgKCJFM0ZTQkxLIi0iRTNGU0JMSyIpIiwKIAkJCSAgICAgaW5wdXQtPmlub2RlX3RhYmxlLCBpdGVuZCAtIDEsIHN0YXJ0LCBtZXRhZW5kIC0gMSk7CiAJZWxzZQogCQllcnIgPSAwOwpAQCAtMTEyLDcgKzExNiw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJjbGVhbihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAotCQkJCSAgdW5zaWduZWQgbG9uZyBibGspCisJCQkJICBleHQzX2ZzYmxrX3QgYmxrKQogewogCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CiAJaW50IGVycjsKQEAgLTE2MywxNSArMTY3LDE0IEBACiAJCQkJICBzdHJ1Y3QgZXh0M19uZXdfZ3JvdXBfZGF0YSAqaW5wdXQpCiB7CiAJc3RydWN0IGV4dDNfc2JfaW5mbyAqc2JpID0gRVhUM19TQihzYik7Ci0JdW5zaWduZWQgbG9uZyBzdGFydCA9IGlucHV0LT5ncm91cCAqIHNiaS0+c19ibG9ja3NfcGVyX2dyb3VwICsKLQkJbGUzMl90b19jcHUoc2JpLT5zX2VzLT5zX2ZpcnN0X2RhdGFfYmxvY2spOworCWV4dDNfZnNibGtfdCBzdGFydCA9IGV4dDNfZ3JvdXBfZmlyc3RfYmxvY2tfbm8oc2IsIGlucHV0LT5ncm91cCk7CiAJaW50IHJlc2VydmVkX2dkYiA9IGV4dDNfYmdfaGFzX3N1cGVyKHNiLCBpbnB1dC0+Z3JvdXApID8KIAkJbGUxNl90b19jcHUoc2JpLT5zX2VzLT5zX3Jlc2VydmVkX2dkdF9ibG9ja3MpIDogMDsKIAl1bnNpZ25lZCBsb25nIGdkYmxvY2tzID0gZXh0M19iZ19udW1fZ2RiKHNiLCBpbnB1dC0+Z3JvdXApOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CiAJaGFuZGxlX3QgKmhhbmRsZTsKLQl1bnNpZ25lZCBsb25nIGJsb2NrOwotCWludCBiaXQ7CisJZXh0M19mc2Jsa190IGJsb2NrOworCWV4dDNfZ3JwYmxrX3QgYml0OwogCWludCBpOwogCWludCBlcnIgPSAwLCBlcnIyOwogCkBAIC0zMjgsNyArMzMxLDcgQEAKIHN0YXRpYyBpbnQgdmVyaWZ5X3Jlc2VydmVkX2dkYihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAogCQkJICAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqcHJpbWFyeSkKIHsKLQljb25zdCB1bnNpZ25lZCBsb25nIGJsayA9IHByaW1hcnktPmJfYmxvY2tucjsKKwljb25zdCBleHQzX2ZzYmxrX3QgYmxrID0gcHJpbWFyeS0+Yl9ibG9ja25yOwogCWNvbnN0IHVuc2lnbmVkIGxvbmcgZW5kID0gRVhUM19TQihzYiktPnNfZ3JvdXBzX2NvdW50OwogCXVuc2lnbmVkIHRocmVlID0gMTsKIAl1bnNpZ25lZCBmaXZlID0gNTsKQEAgLTM0MCw3ICszNDMsOCBAQAogCXdoaWxlICgoZ3JwID0gZXh0M19saXN0X2JhY2t1cHMoc2IsICZ0aHJlZSwgJmZpdmUsICZzZXZlbikpIDwgZW5kKSB7CiAJCWlmIChsZTMyX3RvX2NwdSgqcCsrKSAhPSBncnAgKiBFWFQzX0JMT0NLU19QRVJfR1JPVVAoc2IpICsgYmxrKXsKIAkJCWV4dDNfd2FybmluZyhzYiwgX19GVU5DVElPTl9fLAotCQkJCSAgICAgInJlc2VydmVkIEdEVCAlbGQgbWlzc2luZyBncnAgJWQgKCVsZCkiLAorCQkJCSAgICAgInJlc2VydmVkIEdEVCAiRTNGU0JMSworCQkJCSAgICAgIiBtaXNzaW5nIGdycCAlZCAoIkUzRlNCTEsiKSIsCiAJCQkJICAgICBibGssIGdycCwKIAkJCQkgICAgIGdycCAqIEVYVDNfQkxPQ0tTX1BFUl9HUk9VUChzYikgKyBibGspOwogCQkJcmV0dXJuIC1FSU5WQUw7CkBAIC0zNzIsNyArMzc2LDcgQEAKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CiAJc3RydWN0IGV4dDNfc3VwZXJfYmxvY2sgKmVzID0gRVhUM19TQihzYiktPnNfZXM7CiAJdW5zaWduZWQgbG9uZyBnZGJfbnVtID0gaW5wdXQtPmdyb3VwIC8gRVhUM19ERVNDX1BFUl9CTE9DSyhzYik7Ci0JdW5zaWduZWQgbG9uZyBnZGJsb2NrID0gRVhUM19TQihzYiktPnNfc2JoLT5iX2Jsb2NrbnIgKyAxICsgZ2RiX251bTsKKwlleHQzX2ZzYmxrX3QgZ2RibG9jayA9IEVYVDNfU0Ioc2IpLT5zX3NiaC0+Yl9ibG9ja25yICsgMSArIGdkYl9udW07CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICoqb19ncm91cF9kZXNjLCAqKm5fZ3JvdXBfZGVzYzsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpbmQ7CiAJaW50IGdkYmFja3VwczsKQEAgLTQxNyw3ICs0MjEsNyBAQAogCWRhdGEgPSAoX191MzIgKilkaW5kLT5iX2RhdGE7CiAJaWYgKGxlMzJfdG9fY3B1KGRhdGFbZ2RiX251bSAlIEVYVDNfQUREUl9QRVJfQkxPQ0soc2IpXSkgIT0gZ2RibG9jaykgewogCQlleHQzX3dhcm5pbmcoc2IsIF9fRlVOQ1RJT05fXywKLQkJCSAgICAgIm5ldyBncm91cCAldSBHRFQgYmxvY2sgJWx1IG5vdCByZXNlcnZlZCIsCisJCQkgICAgICJuZXcgZ3JvdXAgJXUgR0RUIGJsb2NrICJFM0ZTQkxLIiBub3QgcmVzZXJ2ZWQiLAogCQkJICAgICBpbnB1dC0+Z3JvdXAsIGdkYmxvY2spOwogCQllcnIgPSAtRUlOVkFMOwogCQlnb3RvIGV4aXRfZGluZDsKQEAgLTUxNSw3ICs1MTksNyBAQAogCXN0cnVjdCBidWZmZXJfaGVhZCAqKnByaW1hcnk7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpkaW5kOwogCXN0cnVjdCBleHQzX2lsb2MgaWxvYzsKLQl1bnNpZ25lZCBsb25nIGJsazsKKwlleHQzX2ZzYmxrX3QgYmxrOwogCV9fdTMyICpkYXRhLCAqZW5kOwogCWludCBnZGJhY2t1cHMgPSAwOwogCWludCByZXMsIGk7CkBAIC01NDAsNyArNTQ0LDggQEAKIAlmb3IgKHJlcyA9IDA7IHJlcyA8IHJlc2VydmVkX2dkYjsgcmVzKyssIGJsaysrKSB7CiAJCWlmIChsZTMyX3RvX2NwdSgqZGF0YSkgIT0gYmxrKSB7CiAJCQlleHQzX3dhcm5pbmcoc2IsIF9fRlVOQ1RJT05fXywKLQkJCQkgICAgICJyZXNlcnZlZCBibG9jayAlbHUgbm90IGF0IG9mZnNldCAlbGQiLAorCQkJCSAgICAgInJlc2VydmVkIGJsb2NrICJFM0ZTQkxLCisJCQkJICAgICAiIG5vdCBhdCBvZmZzZXQgJWxkIiwKIAkJCQkgICAgIGJsaywgKGxvbmcpKGRhdGEgLSAoX191MzIgKilkaW5kLT5iX2RhdGEpKTsKIAkJCWVyciA9IC1FSU5WQUw7CiAJCQlnb3RvIGV4aXRfYmg7CkBAIC05MDIsMTUgKzkwNywxNiBAQAogICogR0RUIGJsb2NrcyBhcmUgcmVzZXJ2ZWQgdG8gZ3JvdyB0byB0aGUgZGVzaXJlZCBzaXplLgogICovCiBpbnQgZXh0M19ncm91cF9leHRlbmQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGV4dDNfc3VwZXJfYmxvY2sgKmVzLAotCQkgICAgICB1bnNpZ25lZCBsb25nIG5fYmxvY2tzX2NvdW50KQorCQkgICAgICBleHQzX2ZzYmxrX3Qgbl9ibG9ja3NfY291bnQpCiB7Ci0JdW5zaWduZWQgbG9uZyBvX2Jsb2Nrc19jb3VudDsKKwlleHQzX2ZzYmxrX3Qgb19ibG9ja3NfY291bnQ7CiAJdW5zaWduZWQgbG9uZyBvX2dyb3Vwc19jb3VudDsKLQl1bnNpZ25lZCBsb25nIGxhc3Q7Ci0JaW50IGFkZDsKKwlleHQzX2dycGJsa190IGxhc3Q7CisJZXh0M19ncnBibGtfdCBhZGQ7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICogYmg7CiAJaGFuZGxlX3QgKmhhbmRsZTsKLQlpbnQgZXJyLCBmcmVlZF9ibG9ja3M7CisJaW50IGVycjsKKwl1bnNpZ25lZCBsb25nIGZyZWVkX2Jsb2NrczsKIAogCS8qIFdlIGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgbG9ja2luZyB3cnQgb3RoZXIgcmVzaXplcnMganVzdAogCSAqIHlldDogd2UncmUgZ29pbmcgdG8gcmV2YWxpZGF0ZSBlcy0+c19ibG9ja3NfY291bnQgYWZ0ZXIKQEAgLTkxOSwxMiArOTI1LDIyIEBACiAJb19ncm91cHNfY291bnQgPSBFWFQzX1NCKHNiKS0+c19ncm91cHNfY291bnQ7CiAKIAlpZiAodGVzdF9vcHQoc2IsIERFQlVHKSkKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkVYVDMtZnM6IGV4dGVuZGluZyBsYXN0IGdyb3VwIGZyb20gJWx1IHRvICVsdSBibG9ja3NcbiIsCisJCXByaW50ayhLRVJOX0RFQlVHICJFWFQzLWZzOiBleHRlbmRpbmcgbGFzdCBncm91cCBmcm9tICJFM0ZTQkxLIiB1dG8gIkUzRlNCTEsiIGJsb2Nrc1xuIiwKIAkJICAgICAgIG9fYmxvY2tzX2NvdW50LCBuX2Jsb2Nrc19jb3VudCk7CiAKIAlpZiAobl9ibG9ja3NfY291bnQgPT0gMCB8fCBuX2Jsb2Nrc19jb3VudCA9PSBvX2Jsb2Nrc19jb3VudCkKIAkJcmV0dXJuIDA7CiAKKwlpZiAobl9ibG9ja3NfY291bnQgPiAoc2VjdG9yX3QpKH4wVUxMKSA+PiAoc2ItPnNfYmxvY2tzaXplX2JpdHMgLSA5KSkgeworCQlwcmludGsoS0VSTl9FUlIgIkVYVDMtZnM6IGZpbGVzeXN0ZW0gb24gJXM6IgorCQkJIiB0b28gbGFyZ2UgdG8gcmVzaXplIHRvICVsdSBibG9ja3Mgc2FmZWx5XG4iLAorCQkJc2ItPnNfaWQsIG5fYmxvY2tzX2NvdW50KTsKKwkJaWYgKHNpemVvZihzZWN0b3JfdCkgPCA4KQorCQkJZXh0M193YXJuaW5nKHNiLCBfX0ZVTkNUSU9OX18sCisJCQkiQ09ORklHX0xCRCBub3QgZW5hYmxlZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwogCWlmIChuX2Jsb2Nrc19jb3VudCA8IG9fYmxvY2tzX2NvdW50KSB7CiAJCWV4dDNfd2FybmluZyhzYiwgX19GVU5DVElPTl9fLAogCQkJICAgICAiY2FuJ3Qgc2hyaW5rIEZTIC0gcmVzaXplIGFib3J0ZWQiKTsKQEAgLTk0OCw3ICs5NjQsOCBAQAogCiAJaWYgKG9fYmxvY2tzX2NvdW50ICsgYWRkIDwgbl9ibG9ja3NfY291bnQpCiAJCWV4dDNfd2FybmluZyhzYiwgX19GVU5DVElPTl9fLAotCQkJICAgICAid2lsbCBvbmx5IGZpbmlzaCBncm91cCAoJWx1IGJsb2NrcywgJXUgbmV3KSIsCisJCQkgICAgICJ3aWxsIG9ubHkgZmluaXNoIGdyb3VwICgiRTNGU0JMSworCQkJICAgICAiIGJsb2NrcywgJXUgbmV3KSIsCiAJCQkgICAgIG9fYmxvY2tzX2NvdW50ICsgYWRkLCBhZGQpOwogCiAJLyogU2VlIGlmIHRoZSBkZXZpY2UgaXMgYWN0dWFsbHkgYXMgYmlnIGFzIHdoYXQgd2FzIHJlcXVlc3RlZCAqLwpAQCAtOTkxLDEwICsxMDA4LDEwIEBACiAJZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgRVhUM19TQihzYiktPnNfc2JoKTsKIAlzYi0+c19kaXJ0ID0gMTsKIAl1bmxvY2tfc3VwZXIoc2IpOwotCWV4dDNfZGVidWcoImZyZWVpbmcgYmxvY2tzICVsZCB0aHJvdWdoICVsZFxuIiwgb19ibG9ja3NfY291bnQsCisJZXh0M19kZWJ1ZygiZnJlZWluZyBibG9ja3MgJWx1IHRocm91Z2ggIkUzRlNCTEsiXG4iLCBvX2Jsb2Nrc19jb3VudCwKIAkJICAgb19ibG9ja3NfY291bnQgKyBhZGQpOwogCWV4dDNfZnJlZV9ibG9ja3Nfc2IoaGFuZGxlLCBzYiwgb19ibG9ja3NfY291bnQsIGFkZCwgJmZyZWVkX2Jsb2Nrcyk7Ci0JZXh0M19kZWJ1ZygiZnJlZWQgYmxvY2tzICVsZCB0aHJvdWdoICVsZFxuIiwgb19ibG9ja3NfY291bnQsCisJZXh0M19kZWJ1ZygiZnJlZWQgYmxvY2tzICJFM0ZTQkxLIiB0aHJvdWdoICJFM0ZTQkxLIlxuIiwgb19ibG9ja3NfY291bnQsCiAJCSAgIG9fYmxvY2tzX2NvdW50ICsgYWRkKTsKIAlpZiAoKGVyciA9IGV4dDNfam91cm5hbF9zdG9wKGhhbmRsZSkpKQogCQlnb3RvIGV4aXRfcHV0OwpkaWZmIC0tZ2l0IGEvZnMvZXh0My9zdXBlci5jIGIvZnMvZXh0My9zdXBlci5jCmluZGV4IGE2MGNjNmUuLmI3NDgzMzYgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDMvc3VwZXIuYworKysgYi9mcy9leHQzL3N1cGVyLmMKQEAgLTYzMCw3ICs2MzAsNyBAQAogCU9wdF9yZXNnaWQsIE9wdF9yZXN1aWQsIE9wdF9zYiwgT3B0X2Vycl9jb250LCBPcHRfZXJyX3BhbmljLCBPcHRfZXJyX3JvLAogCU9wdF9ub3VpZDMyLCBPcHRfbm9jaGVjaywgT3B0X2RlYnVnLCBPcHRfb2xkYWxsb2MsIE9wdF9vcmxvdiwKIAlPcHRfdXNlcl94YXR0ciwgT3B0X25vdXNlcl94YXR0ciwgT3B0X2FjbCwgT3B0X25vYWNsLAotCU9wdF9yZXNlcnZhdGlvbiwgT3B0X25vcmVzZXJ2YXRpb24sIE9wdF9ub2xvYWQsIE9wdF9ub2JoLAorCU9wdF9yZXNlcnZhdGlvbiwgT3B0X25vcmVzZXJ2YXRpb24sIE9wdF9ub2xvYWQsIE9wdF9ub2JoLCBPcHRfYmgsCiAJT3B0X2NvbW1pdCwgT3B0X2pvdXJuYWxfdXBkYXRlLCBPcHRfam91cm5hbF9pbnVtLCBPcHRfam91cm5hbF9kZXYsCiAJT3B0X2Fib3J0LCBPcHRfZGF0YV9qb3VybmFsLCBPcHRfZGF0YV9vcmRlcmVkLCBPcHRfZGF0YV93cml0ZWJhY2ssCiAJT3B0X3VzcmpxdW90YSwgT3B0X2dycGpxdW90YSwgT3B0X29mZnVzcmpxdW90YSwgT3B0X29mZmdycGpxdW90YSwKQEAgLTY2Niw2ICs2NjYsNyBAQAogCXtPcHRfbm9yZXNlcnZhdGlvbiwgIm5vcmVzZXJ2YXRpb24ifSwKIAl7T3B0X25vbG9hZCwgIm5vbG9hZCJ9LAogCXtPcHRfbm9iaCwgIm5vYmgifSwKKwl7T3B0X2JoLCAiYmgifSwKIAl7T3B0X2NvbW1pdCwgImNvbW1pdD0ldSJ9LAogCXtPcHRfam91cm5hbF91cGRhdGUsICJqb3VybmFsPXVwZGF0ZSJ9LAogCXtPcHRfam91cm5hbF9pbnVtLCAiam91cm5hbD0ldSJ9LApAQCAtNjg5LDE0ICs2OTAsMTUgQEAKIAl7T3B0X3Jlc2l6ZSwgInJlc2l6ZSJ9LAogfTsKIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2V0X3NiX2Jsb2NrKHZvaWQgKipkYXRhKQorc3RhdGljIGV4dDNfZnNibGtfdCBnZXRfc2JfYmxvY2sodm9pZCAqKmRhdGEpCiB7Ci0JdW5zaWduZWQgbG9uZyAJc2JfYmxvY2s7CisJZXh0M19mc2Jsa190IAlzYl9ibG9jazsKIAljaGFyIAkJKm9wdGlvbnMgPSAoY2hhciAqKSAqZGF0YTsKIAogCWlmICghb3B0aW9ucyB8fCBzdHJuY21wKG9wdGlvbnMsICJzYj0iLCAzKSAhPSAwKQogCQlyZXR1cm4gMTsJLyogRGVmYXVsdCBsb2NhdGlvbiAqLwogCW9wdGlvbnMgKz0gMzsKKwkvKnRvZG86IHVzZSBzaW1wbGVfc3RydG9sbCB3aXRoID4zMmJpdCBleHQzICovCiAJc2JfYmxvY2sgPSBzaW1wbGVfc3RydG91bChvcHRpb25zLCAmb3B0aW9ucywgMCk7CiAJaWYgKCpvcHRpb25zICYmICpvcHRpb25zICE9ICcsJykgewogCQlwcmludGsoIkVYVDMtZnM6IEludmFsaWQgc2Igc3BlY2lmaWNhdGlvbjogJXNcbiIsCkBAIC03MTEsNyArNzEzLDcgQEAKIAogc3RhdGljIGludCBwYXJzZV9vcHRpb25zIChjaGFyICpvcHRpb25zLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAogCQkJICB1bnNpZ25lZCBsb25nICppbnVtLCB1bnNpZ25lZCBsb25nICpqb3VybmFsX2Rldm51bSwKLQkJCSAgdW5zaWduZWQgbG9uZyAqbl9ibG9ja3NfY291bnQsIGludCBpc19yZW1vdW50KQorCQkJICBleHQzX2ZzYmxrX3QgKm5fYmxvY2tzX2NvdW50LCBpbnQgaXNfcmVtb3VudCkKIHsKIAlzdHJ1Y3QgZXh0M19zYl9pbmZvICpzYmkgPSBFWFQzX1NCKHNiKTsKIAljaGFyICogcDsKQEAgLTEwMTMsNiArMTAxNSw5IEBACiAJCWNhc2UgT3B0X25vYmg6CiAJCQlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIE5PQkgpOwogCQkJYnJlYWs7CisJCWNhc2UgT3B0X2JoOgorCQkJY2xlYXJfb3B0KHNiaS0+c19tb3VudF9vcHQsIE5PQkgpOworCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlwcmludGsgKEtFUk5fRVJSCiAJCQkJIkVYVDMtZnM6IFVucmVjb2duaXplZCBtb3VudCBvcHRpb24gXCIlc1wiICIKQEAgLTExMjgsNyArMTEzMyw3IEBACiBzdGF0aWMgaW50IGV4dDNfY2hlY2tfZGVzY3JpcHRvcnMgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiKQogewogCXN0cnVjdCBleHQzX3NiX2luZm8gKnNiaSA9IEVYVDNfU0Ioc2IpOwotCXVuc2lnbmVkIGxvbmcgYmxvY2sgPSBsZTMyX3RvX2NwdShzYmktPnNfZXMtPnNfZmlyc3RfZGF0YV9ibG9jayk7CisJZXh0M19mc2Jsa190IGJsb2NrID0gbGUzMl90b19jcHUoc2JpLT5zX2VzLT5zX2ZpcnN0X2RhdGFfYmxvY2spOwogCXN0cnVjdCBleHQzX2dyb3VwX2Rlc2MgKiBnZHAgPSBOVUxMOwogCWludCBkZXNjX2Jsb2NrID0gMDsKIAlpbnQgaTsKQEAgLTEzMTUsMTUgKzEzMjAsMTQgQEAKIAlyZXR1cm4gcmVzOwogfQogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBkZXNjcmlwdG9yX2xvYyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAotCQkJCSAgICB1bnNpZ25lZCBsb25nIGxvZ2ljX3NiX2Jsb2NrLAorc3RhdGljIGV4dDNfZnNibGtfdCBkZXNjcmlwdG9yX2xvYyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCSAgICBleHQzX2ZzYmxrX3QgbG9naWNfc2JfYmxvY2ssCiAJCQkJICAgIGludCBucikKIHsKIAlzdHJ1Y3QgZXh0M19zYl9pbmZvICpzYmkgPSBFWFQzX1NCKHNiKTsKLQl1bnNpZ25lZCBsb25nIGJnLCBmaXJzdF9kYXRhX2Jsb2NrLCBmaXJzdF9tZXRhX2JnOworCXVuc2lnbmVkIGxvbmcgYmcsIGZpcnN0X21ldGFfYmc7CiAJaW50IGhhc19zdXBlciA9IDA7CiAKLQlmaXJzdF9kYXRhX2Jsb2NrID0gbGUzMl90b19jcHUoc2JpLT5zX2VzLT5zX2ZpcnN0X2RhdGFfYmxvY2spOwogCWZpcnN0X21ldGFfYmcgPSBsZTMyX3RvX2NwdShzYmktPnNfZXMtPnNfZmlyc3RfbWV0YV9iZyk7CiAKIAlpZiAoIUVYVDNfSEFTX0lOQ09NUEFUX0ZFQVRVUkUoc2IsIEVYVDNfRkVBVFVSRV9JTkNPTVBBVF9NRVRBX0JHKSB8fApAQCAtMTMzMiw3ICsxMzM2LDcgQEAKIAliZyA9IHNiaS0+c19kZXNjX3Blcl9ibG9jayAqIG5yOwogCWlmIChleHQzX2JnX2hhc19zdXBlcihzYiwgYmcpKQogCQloYXNfc3VwZXIgPSAxOwotCXJldHVybiAoZmlyc3RfZGF0YV9ibG9jayArIGhhc19zdXBlciArIChiZyAqIHNiaS0+c19ibG9ja3NfcGVyX2dyb3VwKSk7CisJcmV0dXJuIChoYXNfc3VwZXIgKyBleHQzX2dyb3VwX2ZpcnN0X2Jsb2NrX25vKHNiLCBiZykpOwogfQogCiAKQEAgLTEzNDEsOSArMTM0NSw5IEBACiAJc3RydWN0IGJ1ZmZlcl9oZWFkICogYmg7CiAJc3RydWN0IGV4dDNfc3VwZXJfYmxvY2sgKmVzID0gTlVMTDsKIAlzdHJ1Y3QgZXh0M19zYl9pbmZvICpzYmk7Ci0JdW5zaWduZWQgbG9uZyBibG9jazsKLQl1bnNpZ25lZCBsb25nIHNiX2Jsb2NrID0gZ2V0X3NiX2Jsb2NrKCZkYXRhKTsKLQl1bnNpZ25lZCBsb25nIGxvZ2ljX3NiX2Jsb2NrOworCWV4dDNfZnNibGtfdCBibG9jazsKKwlleHQzX2ZzYmxrX3Qgc2JfYmxvY2sgPSBnZXRfc2JfYmxvY2soJmRhdGEpOworCWV4dDNfZnNibGtfdCBsb2dpY19zYl9ibG9jazsKIAl1bnNpZ25lZCBsb25nIG9mZnNldCA9IDA7CiAJdW5zaWduZWQgbG9uZyBqb3VybmFsX2ludW0gPSAwOwogCXVuc2lnbmVkIGxvbmcgam91cm5hbF9kZXZudW0gPSAwOwpAQCAtMTU2NSw2ICsxNTY5LDE2IEBACiAJCWdvdG8gZmFpbGVkX21vdW50OwogCX0KIAorCWlmIChsZTMyX3RvX2NwdShlcy0+c19ibG9ja3NfY291bnQpID4KKwkJICAgIChzZWN0b3JfdCkofjBVTEwpID4+IChzYi0+c19ibG9ja3NpemVfYml0cyAtIDkpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRVhUMy1mczogZmlsZXN5c3RlbSBvbiAlczoiCisJCQkiIHRvbyBsYXJnZSB0byBtb3VudCBzYWZlbHlcbiIsIHNiLT5zX2lkKTsKKwkJaWYgKHNpemVvZihzZWN0b3JfdCkgPCA4KQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiRVhUMy1mczogQ09ORklHX0xCRCBub3QgIgorCQkJCQkiZW5hYmxlZFxuIik7CisJCWdvdG8gZmFpbGVkX21vdW50OworCX0KKwogCWlmIChFWFQzX0JMT0NLU19QRVJfR1JPVVAoc2IpID09IDApCiAJCWdvdG8gY2FudGZpbmRfZXh0MzsKIAlzYmktPnNfZ3JvdXBzX2NvdW50ID0gKGxlMzJfdG9fY3B1KGVzLT5zX2Jsb2Nrc19jb3VudCkgLQpAQCAtMTU5Myw3ICsxNjA3LDcgQEAKIAkJfQogCX0KIAlpZiAoIWV4dDNfY2hlY2tfZGVzY3JpcHRvcnMgKHNiKSkgewotCQlwcmludGsgKEtFUk5fRVJSICJFWFQzLWZzOiBncm91cCBkZXNjcmlwdG9ycyBjb3JydXB0ZWQgIVxuIik7CisJCXByaW50ayhLRVJOX0VSUiAiRVhUMy1mczogZ3JvdXAgZGVzY3JpcHRvcnMgY29ycnVwdGVkIVxuIik7CiAJCWdvdG8gZmFpbGVkX21vdW50MjsKIAl9CiAJc2JpLT5zX2dkYl9jb3VudCA9IGRiX2NvdW50OwpAQCAtMTgzMCwxMCArMTg0NCwxMCBAQAogewogCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOwogCWpvdXJuYWxfdCAqam91cm5hbDsKLQlpbnQgc3RhcnQ7Ci0JaW50IGxlbjsKKwlleHQzX2ZzYmxrX3Qgc3RhcnQ7CisJZXh0M19mc2Jsa190IGxlbjsKIAlpbnQgaGJsb2NrLCBibG9ja3NpemU7Ci0JdW5zaWduZWQgbG9uZyBzYl9ibG9jazsKKwlleHQzX2ZzYmxrX3Qgc2JfYmxvY2s7CiAJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CiAJc3RydWN0IGV4dDNfc3VwZXJfYmxvY2sgKiBlczsKIAlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2OwpAQCAtMjIwNiw3ICsyMjIwLDcgQEAKIHsKIAlzdHJ1Y3QgZXh0M19zdXBlcl9ibG9jayAqIGVzOwogCXN0cnVjdCBleHQzX3NiX2luZm8gKnNiaSA9IEVYVDNfU0Ioc2IpOwotCXVuc2lnbmVkIGxvbmcgbl9ibG9ja3NfY291bnQgPSAwOworCWV4dDNfZnNibGtfdCBuX2Jsb2Nrc19jb3VudCA9IDA7CiAJdW5zaWduZWQgbG9uZyBvbGRfc2JfZmxhZ3M7CiAJc3RydWN0IGV4dDNfbW91bnRfb3B0aW9ucyBvbGRfb3B0czsKIAlpbnQgZXJyOwpAQCAtMjMyNiw3ICsyMzQwLDcgQEAKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZGVudHJ5LT5kX3NiOwogCXN0cnVjdCBleHQzX3NiX2luZm8gKnNiaSA9IEVYVDNfU0Ioc2IpOwogCXN0cnVjdCBleHQzX3N1cGVyX2Jsb2NrICplcyA9IHNiaS0+c19lczsKLQl1bnNpZ25lZCBsb25nIG92ZXJoZWFkOworCWV4dDNfZnNibGtfdCBvdmVyaGVhZDsKIAlpbnQgaTsKIAogCWlmICh0ZXN0X29wdCAoc2IsIE1JTklYX0RGKSkKZGlmZiAtLWdpdCBhL2ZzL2V4dDMveGF0dHIuYyBiL2ZzL2V4dDMveGF0dHIuYwppbmRleCBlOGQ2MGJmLi5hNDRhMDU2IDEwMDY0NAotLS0gYS9mcy9leHQzL3hhdHRyLmMKKysrIGIvZnMvZXh0My94YXR0ci5jCkBAIC0yMjUsNyArMjI1LDcgQEAKIAllcnJvciA9IC1FTk9EQVRBOwogCWlmICghRVhUM19JKGlub2RlKS0+aV9maWxlX2FjbCkKIAkJZ290byBjbGVhbnVwOwotCWVhX2lkZWJ1Zyhpbm9kZSwgInJlYWRpbmcgYmxvY2sgJWQiLCBFWFQzX0koaW5vZGUpLT5pX2ZpbGVfYWNsKTsKKwllYV9pZGVidWcoaW5vZGUsICJyZWFkaW5nIGJsb2NrICV1IiwgRVhUM19JKGlub2RlKS0+aV9maWxlX2FjbCk7CiAJYmggPSBzYl9icmVhZChpbm9kZS0+aV9zYiwgRVhUM19JKGlub2RlKS0+aV9maWxlX2FjbCk7CiAJaWYgKCFiaCkKIAkJZ290byBjbGVhbnVwOwpAQCAtMjMzLDcgKzIzMyw3IEBACiAJCWF0b21pY19yZWFkKCYoYmgtPmJfY291bnQpKSwgbGUzMl90b19jcHUoQkhEUihiaCktPmhfcmVmY291bnQpKTsKIAlpZiAoZXh0M194YXR0cl9jaGVja19ibG9jayhiaCkpIHsKIGJhZF9ibG9jazoJZXh0M19lcnJvcihpbm9kZS0+aV9zYiwgX19GVU5DVElPTl9fLAotCQkJICAgImlub2RlICVsZDogYmFkIGJsb2NrICVkIiwgaW5vZGUtPmlfaW5vLAorCQkJICAgImlub2RlICVsZDogYmFkIGJsb2NrICJFM0ZTQkxLLCBpbm9kZS0+aV9pbm8sCiAJCQkgICBFWFQzX0koaW5vZGUpLT5pX2ZpbGVfYWNsKTsKIAkJZXJyb3IgPSAtRUlPOwogCQlnb3RvIGNsZWFudXA7CkBAIC0zNjYsNyArMzY2LDcgQEAKIAllcnJvciA9IDA7CiAJaWYgKCFFWFQzX0koaW5vZGUpLT5pX2ZpbGVfYWNsKQogCQlnb3RvIGNsZWFudXA7Ci0JZWFfaWRlYnVnKGlub2RlLCAicmVhZGluZyBibG9jayAlZCIsIEVYVDNfSShpbm9kZSktPmlfZmlsZV9hY2wpOworCWVhX2lkZWJ1Zyhpbm9kZSwgInJlYWRpbmcgYmxvY2sgJXUiLCBFWFQzX0koaW5vZGUpLT5pX2ZpbGVfYWNsKTsKIAliaCA9IHNiX2JyZWFkKGlub2RlLT5pX3NiLCBFWFQzX0koaW5vZGUpLT5pX2ZpbGVfYWNsKTsKIAllcnJvciA9IC1FSU87CiAJaWYgKCFiaCkKQEAgLTM3NSw3ICszNzUsNyBAQAogCQlhdG9taWNfcmVhZCgmKGJoLT5iX2NvdW50KSksIGxlMzJfdG9fY3B1KEJIRFIoYmgpLT5oX3JlZmNvdW50KSk7CiAJaWYgKGV4dDNfeGF0dHJfY2hlY2tfYmxvY2soYmgpKSB7CiAJCWV4dDNfZXJyb3IoaW5vZGUtPmlfc2IsIF9fRlVOQ1RJT05fXywKLQkJCSAgICJpbm9kZSAlbGQ6IGJhZCBibG9jayAlZCIsIGlub2RlLT5pX2lubywKKwkJCSAgICJpbm9kZSAlbGQ6IGJhZCBibG9jayAiRTNGU0JMSywgaW5vZGUtPmlfaW5vLAogCQkJICAgRVhUM19JKGlub2RlKS0+aV9maWxlX2FjbCk7CiAJCWVycm9yID0gLUVJTzsKIAkJZ290byBjbGVhbnVwOwpAQCAtNjQ3LDcgKzY0Nyw3IEBACiAJCQlsZTMyX3RvX2NwdShCSERSKGJzLT5iaCktPmhfcmVmY291bnQpKTsKIAkJaWYgKGV4dDNfeGF0dHJfY2hlY2tfYmxvY2soYnMtPmJoKSkgewogCQkJZXh0M19lcnJvcihzYiwgX19GVU5DVElPTl9fLAotCQkJCSJpbm9kZSAlbGQ6IGJhZCBibG9jayAlZCIsIGlub2RlLT5pX2lubywKKwkJCQkiaW5vZGUgJWxkOiBiYWQgYmxvY2sgIkUzRlNCTEssIGlub2RlLT5pX2lubywKIAkJCQlFWFQzX0koaW5vZGUpLT5pX2ZpbGVfYWNsKTsKIAkJCWVycm9yID0gLUVJTzsKIAkJCWdvdG8gY2xlYW51cDsKQEAgLTc5MiwxMSArNzkyLDEyIEBACiAJCQlnZXRfYmgobmV3X2JoKTsKIAkJfSBlbHNlIHsKIAkJCS8qIFdlIG5lZWQgdG8gYWxsb2NhdGUgYSBuZXcgYmxvY2sgKi8KLQkJCWludCBnb2FsID0gbGUzMl90b19jcHUoCisJCQlleHQzX2ZzYmxrX3QgZ29hbCA9IGxlMzJfdG9fY3B1KAogCQkJCQlFWFQzX1NCKHNiKS0+c19lcy0+c19maXJzdF9kYXRhX2Jsb2NrKSArCi0JCQkJRVhUM19JKGlub2RlKS0+aV9ibG9ja19ncm91cCAqCisJCQkJKGV4dDNfZnNibGtfdClFWFQzX0koaW5vZGUpLT5pX2Jsb2NrX2dyb3VwICoKIAkJCQlFWFQzX0JMT0NLU19QRVJfR1JPVVAoc2IpOwotCQkJaW50IGJsb2NrID0gZXh0M19uZXdfYmxvY2soaGFuZGxlLCBpbm9kZSwgZ29hbCwgJmVycm9yKTsKKwkJCWV4dDNfZnNibGtfdCBibG9jayA9IGV4dDNfbmV3X2Jsb2NrKGhhbmRsZSwgaW5vZGUsCisJCQkJCQkJZ29hbCwgJmVycm9yKTsKIAkJCWlmIChlcnJvcikKIAkJCQlnb3RvIGNsZWFudXA7CiAJCQllYV9pZGVidWcoaW5vZGUsICJjcmVhdGluZyBibG9jayAlZCIsIGJsb2NrKTsKQEAgLTg0Nyw3ICs4NDgsNyBAQAogCiBiYWRfYmxvY2s6CiAJZXh0M19lcnJvcihpbm9kZS0+aV9zYiwgX19GVU5DVElPTl9fLAotCQkgICAiaW5vZGUgJWxkOiBiYWQgYmxvY2sgJWQiLCBpbm9kZS0+aV9pbm8sCisJCSAgICJpbm9kZSAlbGQ6IGJhZCBibG9jayAiRTNGU0JMSywgaW5vZGUtPmlfaW5vLAogCQkgICBFWFQzX0koaW5vZGUpLT5pX2ZpbGVfYWNsKTsKIAlnb3RvIGNsZWFudXA7CiAKQEAgLTEwNzYsMTQgKzEwNzcsMTQgQEAKIAliaCA9IHNiX2JyZWFkKGlub2RlLT5pX3NiLCBFWFQzX0koaW5vZGUpLT5pX2ZpbGVfYWNsKTsKIAlpZiAoIWJoKSB7CiAJCWV4dDNfZXJyb3IoaW5vZGUtPmlfc2IsIF9fRlVOQ1RJT05fXywKLQkJCSJpbm9kZSAlbGQ6IGJsb2NrICVkIHJlYWQgZXJyb3IiLCBpbm9kZS0+aV9pbm8sCisJCQkiaW5vZGUgJWxkOiBibG9jayAiRTNGU0JMSyIgcmVhZCBlcnJvciIsIGlub2RlLT5pX2lubywKIAkJCUVYVDNfSShpbm9kZSktPmlfZmlsZV9hY2wpOwogCQlnb3RvIGNsZWFudXA7CiAJfQogCWlmIChCSERSKGJoKS0+aF9tYWdpYyAhPSBjcHVfdG9fbGUzMihFWFQzX1hBVFRSX01BR0lDKSB8fAogCSAgICBCSERSKGJoKS0+aF9ibG9ja3MgIT0gY3B1X3RvX2xlMzIoMSkpIHsKIAkJZXh0M19lcnJvcihpbm9kZS0+aV9zYiwgX19GVU5DVElPTl9fLAotCQkJImlub2RlICVsZDogYmFkIGJsb2NrICVkIiwgaW5vZGUtPmlfaW5vLAorCQkJImlub2RlICVsZDogYmFkIGJsb2NrICJFM0ZTQkxLLCBpbm9kZS0+aV9pbm8sCiAJCQlFWFQzX0koaW5vZGUpLT5pX2ZpbGVfYWNsKTsKIAkJZ290byBjbGVhbnVwOwogCX0KQEAgLTEyMTAsMTEgKzEyMTEsMTEgQEAKIAkJYmggPSBzYl9icmVhZChpbm9kZS0+aV9zYiwgY2UtPmVfYmxvY2spOwogCQlpZiAoIWJoKSB7CiAJCQlleHQzX2Vycm9yKGlub2RlLT5pX3NiLCBfX0ZVTkNUSU9OX18sCi0JCQkJImlub2RlICVsZDogYmxvY2sgJWxkIHJlYWQgZXJyb3IiLAorCQkJCSJpbm9kZSAlbGQ6IGJsb2NrICVsdSByZWFkIGVycm9yIiwKIAkJCQlpbm9kZS0+aV9pbm8sICh1bnNpZ25lZCBsb25nKSBjZS0+ZV9ibG9jayk7CiAJCX0gZWxzZSBpZiAobGUzMl90b19jcHUoQkhEUihiaCktPmhfcmVmY291bnQpID49CiAJCQkJRVhUM19YQVRUUl9SRUZDT1VOVF9NQVgpIHsKLQkJCWVhX2lkZWJ1Zyhpbm9kZSwgImJsb2NrICVsZCByZWZjb3VudCAlZD49JWQiLAorCQkJZWFfaWRlYnVnKGlub2RlLCAiYmxvY2sgJWx1IHJlZmNvdW50ICVkPj0lZCIsCiAJCQkJICAodW5zaWduZWQgbG9uZykgY2UtPmVfYmxvY2ssCiAJCQkJICBsZTMyX3RvX2NwdShCSERSKGJoKS0+aF9yZWZjb3VudCksCiAJCQkJCSAgRVhUM19YQVRUUl9SRUZDT1VOVF9NQVgpOwpkaWZmIC0tZ2l0IGEvZnMvZnJlZXZ4ZnMvdnhmcy5oIGIvZnMvZnJlZXZ4ZnMvdnhmcy5oCmluZGV4IDU4M2JkNzguLmQzNTk3OWEgMTAwNjQ0Ci0tLSBhL2ZzL2ZyZWV2eGZzL3Z4ZnMuaAorKysgYi9mcy9mcmVldnhmcy92eGZzLmgKQEAgLTE1OSwxMSArMTU5LDExIEBACiAgKiBJbiBjb3JlIHN1cGVyYmxvY2sgZmlsZXN5c3RlbSBwcml2YXRlIGRhdGEgZm9yIFZ4RlMuCiAgKi8KIHN0cnVjdCB2eGZzX3NiX2luZm8gewotCXN0cnVjdCB2eGZzX3NiCQkqdnNpX3JhdzsJLyogcmF3IChvbiBkaXNrKSBzdXBlYmxvY2sgKi8KKwlzdHJ1Y3Qgdnhmc19zYgkJKnZzaV9yYXc7CS8qIHJhdyAob24gZGlzaykgc3VwZXJibG9jayAqLwogCXN0cnVjdCBidWZmZXJfaGVhZAkqdnNpX2JwOwkvKiBidWZmZXIgZm9yIHJhdyBzdXBlcmJsb2NrKi8KIAlzdHJ1Y3QgaW5vZGUJCSp2c2lfZnNoaXA7CS8qIGZpbGVzZXQgaGVhZGVyIGlub2RlICovCiAJc3RydWN0IGlub2RlCQkqdnNpX2lsaXN0OwkvKiBpbm9kZSBsaXN0IGlub2RlICovCi0Jc3RydWN0IGlub2RlCQkqdnNpX3N0aWxpc3Q7CS8qIHN0cnVjdHVhbCBpbm9kZSBsaXN0IGlub2RlICovCisJc3RydWN0IGlub2RlCQkqdnNpX3N0aWxpc3Q7CS8qIHN0cnVjdHVyYWwgaW5vZGUgbGlzdCBpbm9kZSAqLwogCXVfbG9uZwkJCXZzaV9pZXh0OwkvKiBpbml0aWFsIGlub2RlIGxpc3QgKi8KIAlpbm9fdAkJCXZzaV9mc2hpbm87CS8qIGZpbGVzZXQgaGVhZGVyIGlub2RlICovCiAJZGFkZHJfdAkJCXZzaV9vbHRleHQ7CS8qIE9MVCBleHRlbnQgKi8KZGlmZiAtLWdpdCBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfZnNoZWFkLmMgYi9mcy9mcmVldnhmcy92eGZzX2ZzaGVhZC5jCmluZGV4IDZkZWUxMDkuLjc4OTQ4YjQgMTAwNjQ0Ci0tLSBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfZnNoZWFkLmMKKysrIGIvZnMvZnJlZXZ4ZnMvdnhmc19mc2hlYWQuYwpAQCAtMTEyLDcgKzExMiw3IEBACiAKIAl2aXAgPSB2eGZzX2Jsa2lnZXQoc2JwLCBpbmZwLT52c2lfaWV4dCwgaW5mcC0+dnNpX2ZzaGlubyk7CiAJaWYgKCF2aXApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJ2eGZzOiB1bmFibGVkIHRvIHJlYWQgZnNoIGlub2RlXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJ2eGZzOiB1bmFibGUgdG8gcmVhZCBmc2ggaW5vZGVcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJaWYgKCFWWEZTX0lTRlNIKHZpcCkpIHsKQEAgLTEyOSwxMyArMTI5LDEzIEBACiAKIAlpbmZwLT52c2lfZnNoaXAgPSB2eGZzX2dldF9mYWtlX2lub2RlKHNicCwgdmlwKTsKIAlpZiAoIWluZnAtPnZzaV9mc2hpcCkgewotCQlwcmludGsoS0VSTl9FUlIgInZ4ZnM6IHVuYWJsZWQgdG8gZ2V0IGZzaCBpbm9kZVxuIik7CisJCXByaW50ayhLRVJOX0VSUiAidnhmczogdW5hYmxlIHRvIGdldCBmc2ggaW5vZGVcbiIpOwogCQlnb3RvIG91dF9mcmVlX2ZzaGlwOwogCX0KIAogCXNmcCA9IHZ4ZnNfZ2V0ZnNoKGluZnAtPnZzaV9mc2hpcCwgMCk7CiAJaWYgKCFzZnApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJ2eGZzOiB1bmFibGVkIHRvIGdldCBzdHJ1Y3R1cmFsIGZzaFxuIik7CisJCXByaW50ayhLRVJOX0VSUiAidnhmczogdW5hYmxlIHRvIGdldCBzdHJ1Y3R1cmFsIGZzaFxuIik7CiAJCWdvdG8gb3V0X2lwdXRfZnNoaXA7CiAJfSAKIApAQCAtMTQ1LDcgKzE0NSw3IEBACiAKIAlwZnAgPSB2eGZzX2dldGZzaChpbmZwLT52c2lfZnNoaXAsIDEpOwogCWlmICghcGZwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAidnhmczogdW5hYmxlZCB0byBnZXQgcHJpbWFyeSBmc2hcbiIpOworCQlwcmludGsoS0VSTl9FUlIgInZ4ZnM6IHVuYWJsZSB0byBnZXQgcHJpbWFyeSBmc2hcbiIpOwogCQlnb3RvIG91dF9mcmVlX3NmcDsKIAl9CiAKQEAgLTE1OSw3ICsxNTksNyBAQAogCiAJaW5mcC0+dnNpX3N0aWxpc3QgPSB2eGZzX2dldF9mYWtlX2lub2RlKHNicCwgdGlwKTsKIAlpZiAoIWluZnAtPnZzaV9zdGlsaXN0KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAidnhmczogdW5hYmxlZCB0byBnZXQgc3RydWN0dWFsIGxpc3QgaW5vZGVcbiIpOworCQlwcmludGsoS0VSTl9FUlIgInZ4ZnM6IHVuYWJsZSB0byBnZXQgc3RydWN0dXJhbCBsaXN0IGlub2RlXG4iKTsKIAkJa2ZyZWUodGlwKTsKIAkJZ290byBvdXRfZnJlZV9wZnA7CiAJfQpAQCAtMTc0LDcgKzE3NCw3IEBACiAJCWdvdG8gb3V0X2lwdXRfc3RpbGlzdDsKIAlpbmZwLT52c2lfaWxpc3QgPSB2eGZzX2dldF9mYWtlX2lub2RlKHNicCwgdGlwKTsKIAlpZiAoIWluZnAtPnZzaV9pbGlzdCkgewotCQlwcmludGsoS0VSTl9FUlIgInZ4ZnM6IHVuYWJsZWQgdG8gZ2V0IGlub2RlIGxpc3QgaW5vZGVcbiIpOworCQlwcmludGsoS0VSTl9FUlIgInZ4ZnM6IHVuYWJsZSB0byBnZXQgaW5vZGUgbGlzdCBpbm9kZVxuIik7CiAJCWtmcmVlKHRpcCk7CiAJCWdvdG8gb3V0X2lwdXRfc3RpbGlzdDsKIAl9CmRpZmYgLS1naXQgYS9mcy9mdXNlL01ha2VmaWxlIGIvZnMvZnVzZS9NYWtlZmlsZQppbmRleCBjM2UxZjc2Li43MjQzNzA2IDEwMDY0NAotLS0gYS9mcy9mdXNlL01ha2VmaWxlCisrKyBiL2ZzL2Z1c2UvTWFrZWZpbGUKQEAgLTQsNCArNCw0IEBACiAKIG9iai0kKENPTkZJR19GVVNFX0ZTKSArPSBmdXNlLm8KIAotZnVzZS1vYmpzIDo9IGRldi5vIGRpci5vIGZpbGUubyBpbm9kZS5vCitmdXNlLW9ianMgOj0gZGV2Lm8gZGlyLm8gZmlsZS5vIGlub2RlLm8gY29udHJvbC5vCmRpZmYgLS1naXQgYS9mcy9mdXNlL2NvbnRyb2wuYyBiL2ZzL2Z1c2UvY29udHJvbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzYmNlM2EKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9mdXNlL2NvbnRyb2wuYwpAQCAtMCwwICsxLDIxOCBAQAorLyoKKyAgRlVTRTogRmlsZXN5c3RlbSBpbiBVc2Vyc3BhY2UKKyAgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDYgIE1pa2xvcyBTemVyZWRpIDxtaWtsb3NAc3plcmVkaS5odT4KKworICBUaGlzIHByb2dyYW0gY2FuIGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTC4KKyAgU2VlIHRoZSBmaWxlIENPUFlJTkcuCisqLworCisjaW5jbHVkZSAiZnVzZV9pLmgiCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNkZWZpbmUgRlVTRV9DVExfU1VQRVJfTUFHSUMgMHg2NTczNTU0MworCisvKgorICogVGhpcyBpcyBub24tTlVMTCB3aGVuIHRoZSBzaW5nbGUgaW5zdGFuY2Ugb2YgdGhlIGNvbnRyb2wgZmlsZXN5c3RlbQorICogZXhpc3RzLiAgUHJvdGVjdGVkIGJ5IGZ1c2VfbXV0ZXgKKyAqLworc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqZnVzZV9jb250cm9sX3NiOworCitzdGF0aWMgc3RydWN0IGZ1c2VfY29ubiAqZnVzZV9jdGxfZmlsZV9jb25uX2dldChzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgZnVzZV9jb25uICpmYzsKKwltdXRleF9sb2NrKCZmdXNlX211dGV4KTsKKwlmYyA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT51LmdlbmVyaWNfaXA7CisJaWYgKGZjKQorCQlmYyA9IGZ1c2VfY29ubl9nZXQoZmMpOworCW11dGV4X3VubG9jaygmZnVzZV9tdXRleCk7CisJcmV0dXJuIGZjOworfQorCitzdGF0aWMgc3NpemVfdCBmdXNlX2Nvbm5fYWJvcnRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCQkJICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGZ1c2VfY3RsX2ZpbGVfY29ubl9nZXQoZmlsZSk7CisJaWYgKGZjKSB7CisJCWZ1c2VfYWJvcnRfY29ubihmYyk7CisJCWZ1c2VfY29ubl9wdXQoZmMpOworCX0KKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGZ1c2VfY29ubl93YWl0aW5nX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCisJCQkJICAgICAgc2l6ZV90IGxlbiwgbG9mZl90ICpwcG9zKQoreworCWNoYXIgdG1wWzMyXTsKKwlzaXplX3Qgc2l6ZTsKKworCWlmICghKnBwb3MpIHsKKwkJc3RydWN0IGZ1c2VfY29ubiAqZmMgPSBmdXNlX2N0bF9maWxlX2Nvbm5fZ2V0KGZpbGUpOworCQlpZiAoIWZjKQorCQkJcmV0dXJuIDA7CisKKwkJZmlsZS0+cHJpdmF0ZV9kYXRhPSh2b2lkICopKGxvbmcpYXRvbWljX3JlYWQoJmZjLT5udW1fd2FpdGluZyk7CisJCWZ1c2VfY29ubl9wdXQoZmMpOworCX0KKwlzaXplID0gc3ByaW50Zih0bXAsICIlbGRcbiIsIChsb25nKWZpbGUtPnByaXZhdGVfZGF0YSk7CisJcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgbGVuLCBwcG9zLCB0bXAsIHNpemUpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBmdXNlX2N0bF9hYm9ydF9vcHMgPSB7CisJLm9wZW4gPSBub25zZWVrYWJsZV9vcGVuLAorCS53cml0ZSA9IGZ1c2VfY29ubl9hYm9ydF93cml0ZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZ1c2VfY3RsX3dhaXRpbmdfb3BzID0geworCS5vcGVuID0gbm9uc2Vla2FibGVfb3BlbiwKKwkucmVhZCA9IGZ1c2VfY29ubl93YWl0aW5nX3JlYWQsCit9OworCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqZnVzZV9jdGxfYWRkX2RlbnRyeShzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQsCisJCQkJCSAgc3RydWN0IGZ1c2VfY29ubiAqZmMsCisJCQkJCSAgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkJICBpbnQgbW9kZSwgaW50IG5saW5rLAorCQkJCQkgIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zICppb3AsCisJCQkJCSAgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqZm9wKQoreworCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCisJQlVHX09OKGZjLT5jdGxfbmRlbnRzID49IEZVU0VfQ1RMX05VTV9ERU5UUklFUyk7CisJZGVudHJ5ID0gZF9hbGxvY19uYW1lKHBhcmVudCwgbmFtZSk7CisJaWYgKCFkZW50cnkpCisJCXJldHVybiBOVUxMOworCisJZmMtPmN0bF9kZW50cnlbZmMtPmN0bF9uZGVudHMrK10gPSBkZW50cnk7CisJaW5vZGUgPSBuZXdfaW5vZGUoZnVzZV9jb250cm9sX3NiKTsKKwlpZiAoIWlub2RlKQorCQlyZXR1cm4gTlVMTDsKKworCWlub2RlLT5pX21vZGUgPSBtb2RlOworCWlub2RlLT5pX3VpZCA9IGZjLT51c2VyX2lkOworCWlub2RlLT5pX2dpZCA9IGZjLT5ncm91cF9pZDsKKwlpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7CisJLyogc2V0dGluZyAtPmlfb3AgdG8gTlVMTCBpcyBub3QgYWxsb3dlZCAqLworCWlmIChpb3ApCisJCWlub2RlLT5pX29wID0gaW9wOworCWlub2RlLT5pX2ZvcCA9IGZvcDsKKwlpbm9kZS0+aV9ubGluayA9IG5saW5rOworCWlub2RlLT51LmdlbmVyaWNfaXAgPSBmYzsKKwlkX2FkZChkZW50cnksIGlub2RlKTsKKwlyZXR1cm4gZGVudHJ5OworfQorCisvKgorICogQWRkIGEgY29ubmVjdGlvbiB0byB0aGUgY29udHJvbCBmaWxlc3lzdGVtIChpZiBpdCBleGlzdHMpLiAgQ2FsbGVyCisgKiBtdXN0IGhvc3QgZnVzZV9tdXRleAorICovCitpbnQgZnVzZV9jdGxfYWRkX2Nvbm4oc3RydWN0IGZ1c2VfY29ubiAqZmMpCit7CisJc3RydWN0IGRlbnRyeSAqcGFyZW50OworCWNoYXIgbmFtZVszMl07CisKKwlpZiAoIWZ1c2VfY29udHJvbF9zYikKKwkJcmV0dXJuIDA7CisKKwlwYXJlbnQgPSBmdXNlX2NvbnRyb2xfc2ItPnNfcm9vdDsKKwlwYXJlbnQtPmRfaW5vZGUtPmlfbmxpbmsrKzsKKwlzcHJpbnRmKG5hbWUsICIlbGx1IiwgKHVuc2lnbmVkIGxvbmcgbG9uZykgZmMtPmlkKTsKKwlwYXJlbnQgPSBmdXNlX2N0bF9hZGRfZGVudHJ5KHBhcmVudCwgZmMsIG5hbWUsIFNfSUZESVIgfCAwNTAwLCAyLAorCQkJCSAgICAgJnNpbXBsZV9kaXJfaW5vZGVfb3BlcmF0aW9ucywKKwkJCQkgICAgICZzaW1wbGVfZGlyX29wZXJhdGlvbnMpOworCWlmICghcGFyZW50KQorCQlnb3RvIGVycjsKKworCWlmICghZnVzZV9jdGxfYWRkX2RlbnRyeShwYXJlbnQsIGZjLCAid2FpdGluZyIsIFNfSUZSRUcgfCAwNDAwLCAxLAorCQkJCU5VTEwsICZmdXNlX2N0bF93YWl0aW5nX29wcykgfHwKKwkgICAgIWZ1c2VfY3RsX2FkZF9kZW50cnkocGFyZW50LCBmYywgImFib3J0IiwgU19JRlJFRyB8IDAyMDAsIDEsCisJCQkJIE5VTEwsICZmdXNlX2N0bF9hYm9ydF9vcHMpKQorCQlnb3RvIGVycjsKKworCXJldHVybiAwOworCisgZXJyOgorCWZ1c2VfY3RsX3JlbW92ZV9jb25uKGZjKTsKKwlyZXR1cm4gLUVOT01FTTsKK30KKworLyoKKyAqIFJlbW92ZSBhIGNvbm5lY3Rpb24gZnJvbSB0aGUgY29udHJvbCBmaWxlc3lzdGVtIChpZiBpdCBleGlzdHMpLgorICogQ2FsbGVyIG11c3QgaG9zdCBmdXNlX211dGV4CisgKi8KK3ZvaWQgZnVzZV9jdGxfcmVtb3ZlX2Nvbm4oc3RydWN0IGZ1c2VfY29ubiAqZmMpCit7CisJaW50IGk7CisKKwlpZiAoIWZ1c2VfY29udHJvbF9zYikKKwkJcmV0dXJuOworCisJZm9yIChpID0gZmMtPmN0bF9uZGVudHMgLSAxOyBpID49IDA7IGktLSkgeworCQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBmYy0+Y3RsX2RlbnRyeVtpXTsKKwkJZGVudHJ5LT5kX2lub2RlLT51LmdlbmVyaWNfaXAgPSBOVUxMOworCQlkX2Ryb3AoZGVudHJ5KTsKKwkJZHB1dChkZW50cnkpOworCX0KKwlmdXNlX2NvbnRyb2xfc2ItPnNfcm9vdC0+ZF9pbm9kZS0+aV9ubGluay0tOworfQorCitzdGF0aWMgaW50IGZ1c2VfY3RsX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqZGF0YSwgaW50IHNpbGVudCkKK3sKKwlzdHJ1Y3QgdHJlZV9kZXNjciBlbXB0eV9kZXNjciA9IHsiIn07CisJc3RydWN0IGZ1c2VfY29ubiAqZmM7CisJaW50IGVycjsKKworCWVyciA9IHNpbXBsZV9maWxsX3N1cGVyKHNiLCBGVVNFX0NUTF9TVVBFUl9NQUdJQywgJmVtcHR5X2Rlc2NyKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJbXV0ZXhfbG9jaygmZnVzZV9tdXRleCk7CisJQlVHX09OKGZ1c2VfY29udHJvbF9zYik7CisJZnVzZV9jb250cm9sX3NiID0gc2I7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShmYywgJmZ1c2VfY29ubl9saXN0LCBlbnRyeSkgeworCQllcnIgPSBmdXNlX2N0bF9hZGRfY29ubihmYyk7CisJCWlmIChlcnIpIHsKKwkJCWZ1c2VfY29udHJvbF9zYiA9IE5VTEw7CisJCQltdXRleF91bmxvY2soJmZ1c2VfbXV0ZXgpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCX0KKwltdXRleF91bmxvY2soJmZ1c2VfbXV0ZXgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZnVzZV9jdGxfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLCBpbnQgZmxhZ3MsCisJCQljb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqcmF3X2RhdGEsCisJCQlzdHJ1Y3QgdmZzbW91bnQgKm1udCkKK3sKKwlyZXR1cm4gZ2V0X3NiX3NpbmdsZShmc190eXBlLCBmbGFncywgcmF3X2RhdGEsCisJCQkJZnVzZV9jdGxfZmlsbF9zdXBlciwgbW50KTsKK30KKworc3RhdGljIHZvaWQgZnVzZV9jdGxfa2lsbF9zYihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCW11dGV4X2xvY2soJmZ1c2VfbXV0ZXgpOworCWZ1c2VfY29udHJvbF9zYiA9IE5VTEw7CisJbXV0ZXhfdW5sb2NrKCZmdXNlX211dGV4KTsKKworCWtpbGxfbGl0dGVyX3N1cGVyKHNiKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIGZ1c2VfY3RsX2ZzX3R5cGUgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJmdXNlY3RsIiwKKwkuZ2V0X3NiCQk9IGZ1c2VfY3RsX2dldF9zYiwKKwkua2lsbF9zYgk9IGZ1c2VfY3RsX2tpbGxfc2IsCit9OworCitpbnQgX19pbml0IGZ1c2VfY3RsX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcmVnaXN0ZXJfZmlsZXN5c3RlbSgmZnVzZV9jdGxfZnNfdHlwZSk7Cit9CisKK3ZvaWQgZnVzZV9jdGxfY2xlYW51cCh2b2lkKQoreworCXVucmVnaXN0ZXJfZmlsZXN5c3RlbSgmZnVzZV9jdGxfZnNfdHlwZSk7Cit9CmRpZmYgLS1naXQgYS9mcy9mdXNlL2Rldi5jIGIvZnMvZnVzZS9kZXYuYwppbmRleCAxMDRhNjJkLi4xZTIwMDZjIDEwMDY0NAotLS0gYS9mcy9mdXNlL2Rldi5jCisrKyBiL2ZzL2Z1c2UvZGV2LmMKQEAgLTM0LDYgKzM0LDcgQEAKIHsKIAltZW1zZXQocmVxLCAwLCBzaXplb2YoKnJlcSkpOwogCUlOSVRfTElTVF9IRUFEKCZyZXEtPmxpc3QpOworCUlOSVRfTElTVF9IRUFEKCZyZXEtPmludHJfZW50cnkpOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnJlcS0+d2FpdHEpOwogCWF0b21pY19zZXQoJnJlcS0+Y291bnQsIDEpOwogfQpAQCAtNjQsMTggKzY1LDYgQEAKIAlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgb2xkc2V0LCBOVUxMKTsKIH0KIAotLyoKLSAqIFJlc2V0IHJlcXVlc3QsIHNvIHRoYXQgaXQgY2FuIGJlIHJldXNlZAotICoKLSAqIFRoZSBjYWxsZXIgbXVzdCBiZSBfdmVyeV8gY2FyZWZ1bCB0byBtYWtlIHN1cmUsIHRoYXQgaXQgaXMgaG9sZGluZwotICogdGhlIG9ubHkgcmVmZXJlbmNlIHRvIHJlcQotICovCi12b2lkIGZ1c2VfcmVzZXRfcmVxdWVzdChzdHJ1Y3QgZnVzZV9yZXEgKnJlcSkKLXsKLQlCVUdfT04oYXRvbWljX3JlYWQoJnJlcS0+Y291bnQpICE9IDEpOwotCWZ1c2VfcmVxdWVzdF9pbml0KHJlcSk7Ci19Ci0KIHN0YXRpYyB2b2lkIF9fZnVzZV9nZXRfcmVxdWVzdChzdHJ1Y3QgZnVzZV9yZXEgKnJlcSkKIHsKIAlhdG9taWNfaW5jKCZyZXEtPmNvdW50KTsKQEAgLTg4LDYgKzc3LDEzIEBACiAJYXRvbWljX2RlYygmcmVxLT5jb3VudCk7CiB9CiAKK3N0YXRpYyB2b2lkIGZ1c2VfcmVxX2luaXRfY29udGV4dChzdHJ1Y3QgZnVzZV9yZXEgKnJlcSkKK3sKKwlyZXEtPmluLmgudWlkID0gY3VycmVudC0+ZnN1aWQ7CisJcmVxLT5pbi5oLmdpZCA9IGN1cnJlbnQtPmZzZ2lkOworCXJlcS0+aW4uaC5waWQgPSBjdXJyZW50LT5waWQ7Cit9CisKIHN0cnVjdCBmdXNlX3JlcSAqZnVzZV9nZXRfcmVxKHN0cnVjdCBmdXNlX2Nvbm4gKmZjKQogewogCXN0cnVjdCBmdXNlX3JlcSAqcmVxOwpAQCAtMTAzLDE0ICs5OSwxNiBAQAogCWlmIChpbnRyKQogCQlnb3RvIG91dDsKIAorCWVyciA9IC1FTk9UQ09OTjsKKwlpZiAoIWZjLT5jb25uZWN0ZWQpCisJCWdvdG8gb3V0OworCiAJcmVxID0gZnVzZV9yZXF1ZXN0X2FsbG9jKCk7CiAJZXJyID0gLUVOT01FTTsKIAlpZiAoIXJlcSkKIAkJZ290byBvdXQ7CiAKLQlyZXEtPmluLmgudWlkID0gY3VycmVudC0+ZnN1aWQ7Ci0JcmVxLT5pbi5oLmdpZCA9IGN1cnJlbnQtPmZzZ2lkOwotCXJlcS0+aW4uaC5waWQgPSBjdXJyZW50LT5waWQ7CisJZnVzZV9yZXFfaW5pdF9jb250ZXh0KHJlcSk7CiAJcmVxLT53YWl0aW5nID0gMTsKIAlyZXR1cm4gcmVxOwogCkBAIC0xMTksMTQyICsxMTcsMTgzIEBACiAJcmV0dXJuIEVSUl9QVFIoZXJyKTsKIH0KIAorLyoKKyAqIFJldHVybiByZXF1ZXN0IGluIGZ1c2VfZmlsZS0+cmVzZXJ2ZWRfcmVxLiAgSG93ZXZlciB0aGF0IG1heQorICogY3VycmVudGx5IGJlIGluIHVzZS4gIElmIHRoYXQgaXMgdGhlIGNhc2UsIHdhaXQgZm9yIGl0IHRvIGJlY29tZQorICogYXZhaWxhYmxlLgorICovCitzdGF0aWMgc3RydWN0IGZ1c2VfcmVxICpnZXRfcmVzZXJ2ZWRfcmVxKHN0cnVjdCBmdXNlX2Nvbm4gKmZjLAorCQkJCQkgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGZ1c2VfcmVxICpyZXEgPSBOVUxMOworCXN0cnVjdCBmdXNlX2ZpbGUgKmZmID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJZG8geworCQl3YWl0X2V2ZW50KGZjLT5ibG9ja2VkX3dhaXRxLCBmZi0+cmVzZXJ2ZWRfcmVxKTsKKwkJc3Bpbl9sb2NrKCZmYy0+bG9jayk7CisJCWlmIChmZi0+cmVzZXJ2ZWRfcmVxKSB7CisJCQlyZXEgPSBmZi0+cmVzZXJ2ZWRfcmVxOworCQkJZmYtPnJlc2VydmVkX3JlcSA9IE5VTEw7CisJCQlnZXRfZmlsZShmaWxlKTsKKwkJCXJlcS0+c3RvbGVuX2ZpbGUgPSBmaWxlOworCQl9CisJCXNwaW5fdW5sb2NrKCZmYy0+bG9jayk7CisJfSB3aGlsZSAoIXJlcSk7CisKKwlyZXR1cm4gcmVxOworfQorCisvKgorICogUHV0IHN0b2xlbiByZXF1ZXN0IGJhY2sgaW50byBmdXNlX2ZpbGUtPnJlc2VydmVkX3JlcQorICovCitzdGF0aWMgdm9pZCBwdXRfcmVzZXJ2ZWRfcmVxKHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCBzdHJ1Y3QgZnVzZV9yZXEgKnJlcSkKK3sKKwlzdHJ1Y3QgZmlsZSAqZmlsZSA9IHJlcS0+c3RvbGVuX2ZpbGU7CisJc3RydWN0IGZ1c2VfZmlsZSAqZmYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlzcGluX2xvY2soJmZjLT5sb2NrKTsKKwlmdXNlX3JlcXVlc3RfaW5pdChyZXEpOworCUJVR19PTihmZi0+cmVzZXJ2ZWRfcmVxKTsKKwlmZi0+cmVzZXJ2ZWRfcmVxID0gcmVxOworCXdha2VfdXAoJmZjLT5ibG9ja2VkX3dhaXRxKTsKKwlzcGluX3VubG9jaygmZmMtPmxvY2spOworCWZwdXQoZmlsZSk7Cit9CisKKy8qCisgKiBHZXRzIGEgcmVxdWVzdHMgZm9yIGEgZmlsZSBvcGVyYXRpb24sIGFsd2F5cyBzdWNjZWVkcworICoKKyAqIFRoaXMgaXMgdXNlZCBmb3Igc2VuZGluZyB0aGUgRkxVU0ggcmVxdWVzdCwgd2hpY2ggbXVzdCBnZXQgdG8KKyAqIHVzZXJzcGFjZSwgZHVlIHRvIFBPU0lYIGxvY2tzIHdoaWNoIG1heSBuZWVkIHRvIGJlIHVubG9ja2VkLgorICoKKyAqIElmIGFsbG9jYXRpb24gZmFpbHMgZHVlIHRvIE9PTSwgdXNlIHRoZSByZXNlcnZlZCByZXF1ZXN0IGluCisgKiBmdXNlX2ZpbGUuCisgKgorICogVGhpcyBpcyB2ZXJ5IHVubGlrZWx5IHRvIGRlYWRsb2NrIGFjY2lkZW50YWxseSwgc2luY2UgdGhlCisgKiBmaWxlc3lzdGVtIHNob3VsZCBub3QgaGF2ZSBpdCdzIG93biBmaWxlIG9wZW4uICBJZiBkZWFkbG9jayBpcworICogaW50ZW50aW9uYWwsIGl0IGNhbiBzdGlsbCBiZSBicm9rZW4gYnkgImFib3J0aW5nIiB0aGUgZmlsZXN5c3RlbS4KKyAqLworc3RydWN0IGZ1c2VfcmVxICpmdXNlX2dldF9yZXFfbm9mYWlsKHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgZnVzZV9yZXEgKnJlcTsKKworCWF0b21pY19pbmMoJmZjLT5udW1fd2FpdGluZyk7CisJd2FpdF9ldmVudChmYy0+YmxvY2tlZF93YWl0cSwgIWZjLT5ibG9ja2VkKTsKKwlyZXEgPSBmdXNlX3JlcXVlc3RfYWxsb2MoKTsKKwlpZiAoIXJlcSkKKwkJcmVxID0gZ2V0X3Jlc2VydmVkX3JlcShmYywgZmlsZSk7CisKKwlmdXNlX3JlcV9pbml0X2NvbnRleHQocmVxKTsKKwlyZXEtPndhaXRpbmcgPSAxOworCXJldHVybiByZXE7Cit9CisKIHZvaWQgZnVzZV9wdXRfcmVxdWVzdChzdHJ1Y3QgZnVzZV9jb25uICpmYywgc3RydWN0IGZ1c2VfcmVxICpyZXEpCiB7CiAJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJnJlcS0+Y291bnQpKSB7CiAJCWlmIChyZXEtPndhaXRpbmcpCiAJCQlhdG9taWNfZGVjKCZmYy0+bnVtX3dhaXRpbmcpOwotCQlmdXNlX3JlcXVlc3RfZnJlZShyZXEpOwotCX0KLX0KIAotLyoKLSAqIENhbGxlZCB3aXRoIHNicHV0X3NlbSBoZWxkIGZvciByZWFkIChyZXF1ZXN0X2VuZCkgb3Igd3JpdGUKLSAqIChmdXNlX3B1dF9zdXBlcikuICBCeSB0aGUgdGltZSBmdXNlX3B1dF9zdXBlcigpIGlzIGZpbmlzaGVkLCBhbGwKLSAqIGlub2RlcyBiZWxvbmdpbmcgdG8gYmFja2dyb3VuZCByZXF1ZXN0cyBtdXN0IGJlIHJlbGVhc2VkLCBzbyB0aGUKLSAqIGlwdXRzIGhhdmUgdG8gYmUgZG9uZSB3aXRoaW4gdGhlIGxvY2tlZCByZWdpb24uCi0gKi8KLXZvaWQgZnVzZV9yZWxlYXNlX2JhY2tncm91bmQoc3RydWN0IGZ1c2VfY29ubiAqZmMsIHN0cnVjdCBmdXNlX3JlcSAqcmVxKQotewotCWlwdXQocmVxLT5pbm9kZSk7Ci0JaXB1dChyZXEtPmlub2RlMik7Ci0Jc3Bpbl9sb2NrKCZmYy0+bG9jayk7Ci0JbGlzdF9kZWwoJnJlcS0+YmdfZW50cnkpOwotCWlmIChmYy0+bnVtX2JhY2tncm91bmQgPT0gRlVTRV9NQVhfQkFDS0dST1VORCkgewotCQlmYy0+YmxvY2tlZCA9IDA7Ci0JCXdha2VfdXBfYWxsKCZmYy0+YmxvY2tlZF93YWl0cSk7CisJCWlmIChyZXEtPnN0b2xlbl9maWxlKQorCQkJcHV0X3Jlc2VydmVkX3JlcShmYywgcmVxKTsKKwkJZWxzZQorCQkJZnVzZV9yZXF1ZXN0X2ZyZWUocmVxKTsKIAl9Ci0JZmMtPm51bV9iYWNrZ3JvdW5kLS07Ci0Jc3Bpbl91bmxvY2soJmZjLT5sb2NrKTsKIH0KIAogLyoKICAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gYSByZXF1ZXN0IGlzIGZpbmlzaGVkLiAgRWl0aGVyIGEgcmVwbHkKLSAqIGhhcyBhcnJpdmVkIG9yIGl0IHdhcyBpbnRlcnJ1cHRlZCAoYW5kIG5vdCB5ZXQgc2VudCkgb3Igc29tZSBlcnJvcgorICogaGFzIGFycml2ZWQgb3IgaXQgd2FzIGFib3J0ZWQgKGFuZCBub3QgeWV0IHNlbnQpIG9yIHNvbWUgZXJyb3IKICAqIG9jY3VycmVkIGR1cmluZyBjb21tdW5pY2F0aW9uIHdpdGggdXNlcnNwYWNlLCBvciB0aGUgZGV2aWNlIGZpbGUKLSAqIHdhcyBjbG9zZWQuICBJbiBjYXNlIG9mIGEgYmFja2dyb3VuZCByZXF1ZXN0IHRoZSByZWZlcmVuY2UgdG8gdGhlCi0gKiBzdG9yZWQgb2JqZWN0cyBhcmUgcmVsZWFzZWQuICBUaGUgcmVxdWVzdGVyIHRocmVhZCBpcyB3b2tlbiB1cCAoaWYKLSAqIHN0aWxsIHdhaXRpbmcpLCB0aGUgJ2VuZCcgY2FsbGJhY2sgaXMgY2FsbGVkIGlmIGdpdmVuLCBlbHNlIHRoZQotICogcmVmZXJlbmNlIHRvIHRoZSByZXF1ZXN0IGlzIHJlbGVhc2VkCi0gKgotICogUmVsZWFzaW5nIGV4dHJhIHJlZmVyZW5jZSBmb3IgZm9yZWdyb3VuZCByZXF1ZXN0cyBtdXN0IGJlIGRvbmUKLSAqIHdpdGhpbiB0aGUgc2FtZSBsb2NrZWQgcmVnaW9uIGFzIHNldHRpbmcgc3RhdGUgdG8gZmluaXNoZWQuICBUaGlzCi0gKiBpcyBiZWNhdXNlIGZ1c2VfcmVzZXRfcmVxdWVzdCgpIG1heSBiZSBjYWxsZWQgYWZ0ZXIgcmVxdWVzdCBpcwotICogZmluaXNoZWQgYW5kIGl0IG11c3QgYmUgdGhlIHNvbGUgcG9zc2Vzc29yLiAgSWYgcmVxdWVzdCBpcwotICogaW50ZXJydXB0ZWQgYW5kIHB1dCBpbiB0aGUgYmFja2dyb3VuZCwgaXQgd2lsbCByZXR1cm4gd2l0aCBhbiBlcnJvcgotICogYW5kIGhlbmNlIG5ldmVyIGJlIHJlc2V0IGFuZCByZXVzZWQuCisgKiB3YXMgY2xvc2VkLiAgVGhlIHJlcXVlc3RlciB0aHJlYWQgaXMgd29rZW4gdXAgKGlmIHN0aWxsIHdhaXRpbmcpLAorICogdGhlICdlbmQnIGNhbGxiYWNrIGlzIGNhbGxlZCBpZiBnaXZlbiwgZWxzZSB0aGUgcmVmZXJlbmNlIHRvIHRoZQorICogcmVxdWVzdCBpcyByZWxlYXNlZAogICoKICAqIENhbGxlZCB3aXRoIGZjLT5sb2NrLCB1bmxvY2tzIGl0CiAgKi8KIHN0YXRpYyB2b2lkIHJlcXVlc3RfZW5kKHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCBzdHJ1Y3QgZnVzZV9yZXEgKnJlcSkKIHsKKwl2b2lkICgqZW5kKSAoc3RydWN0IGZ1c2VfY29ubiAqLCBzdHJ1Y3QgZnVzZV9yZXEgKikgPSByZXEtPmVuZDsKKwlyZXEtPmVuZCA9IE5VTEw7CiAJbGlzdF9kZWwoJnJlcS0+bGlzdCk7CisJbGlzdF9kZWwoJnJlcS0+aW50cl9lbnRyeSk7CiAJcmVxLT5zdGF0ZSA9IEZVU0VfUkVRX0ZJTklTSEVEOwotCWlmICghcmVxLT5iYWNrZ3JvdW5kKSB7Ci0JCXNwaW5fdW5sb2NrKCZmYy0+bG9jayk7Ci0JCXdha2VfdXAoJnJlcS0+d2FpdHEpOwotCQlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOwotCX0gZWxzZSB7Ci0JCXZvaWQgKCplbmQpIChzdHJ1Y3QgZnVzZV9jb25uICosIHN0cnVjdCBmdXNlX3JlcSAqKSA9IHJlcS0+ZW5kOwotCQlyZXEtPmVuZCA9IE5VTEw7Ci0JCXNwaW5fdW5sb2NrKCZmYy0+bG9jayk7Ci0JCWRvd25fcmVhZCgmZmMtPnNicHV0X3NlbSk7Ci0JCWlmIChmYy0+bW91bnRlZCkKLQkJCWZ1c2VfcmVsZWFzZV9iYWNrZ3JvdW5kKGZjLCByZXEpOwotCQl1cF9yZWFkKCZmYy0+c2JwdXRfc2VtKTsKLQotCQkvKiBmcHV0IG11c3QgZ28gb3V0c2lkZSBzYnB1dF9zZW0sIG90aGVyd2lzZSBpdCBjYW4gZGVhZGxvY2sgKi8KLQkJaWYgKHJlcS0+ZmlsZSkKLQkJCWZwdXQocmVxLT5maWxlKTsKLQotCQlpZiAoZW5kKQotCQkJZW5kKGZjLCByZXEpOwotCQllbHNlCi0JCQlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOworCWlmIChyZXEtPmJhY2tncm91bmQpIHsKKwkJaWYgKGZjLT5udW1fYmFja2dyb3VuZCA9PSBGVVNFX01BWF9CQUNLR1JPVU5EKSB7CisJCQlmYy0+YmxvY2tlZCA9IDA7CisJCQl3YWtlX3VwX2FsbCgmZmMtPmJsb2NrZWRfd2FpdHEpOworCQl9CisJCWZjLT5udW1fYmFja2dyb3VuZC0tOwogCX0KKwlzcGluX3VubG9jaygmZmMtPmxvY2spOworCWRwdXQocmVxLT5kZW50cnkpOworCW1udHB1dChyZXEtPnZmc21vdW50KTsKKwlpZiAocmVxLT5maWxlKQorCQlmcHV0KHJlcS0+ZmlsZSk7CisJd2FrZV91cCgmcmVxLT53YWl0cSk7CisJaWYgKGVuZCkKKwkJZW5kKGZjLCByZXEpOworCWVsc2UKKwkJZnVzZV9wdXRfcmVxdWVzdChmYywgcmVxKTsKIH0KIAotLyoKLSAqIFVuZm9ydHVuYXRlbHkgcmVxdWVzdCBpbnRlcnJ1cHRpb24gbm90IGp1c3Qgc29sdmVzIHRoZSBkZWFkbG9jawotICogcHJvYmxlbSwgaXQgY2F1c2VzIHByb2JsZW1zIHRvby4gIFRoZXNlIHN0ZW0gZnJvbSB0aGUgZmFjdCwgdGhhdCBhbgotICogaW50ZXJydXB0ZWQgcmVxdWVzdCBpcyBjb250aW51ZWQgdG8gYmUgcHJvY2Vzc2VkIGluIHVzZXJzcGFjZSwKLSAqIHdoaWxlIGFsbCB0aGUgbG9ja3MgYW5kIG9iamVjdCByZWZlcmVuY2VzIChpbm9kZSBhbmQgZmlsZSkgaGVsZAotICogZHVyaW5nIHRoZSBvcGVyYXRpb24gYXJlIHJlbGVhc2VkLgotICoKLSAqIFRvIHJlbGVhc2UgdGhlIGxvY2tzIGlzIGV4YWN0bHkgd2h5IHRoZXJlJ3MgYSBuZWVkIHRvIGludGVycnVwdCB0aGUKLSAqIHJlcXVlc3QsIHNvIHRoZXJlJ3Mgbm90IGEgbG90IHRoYXQgY2FuIGJlIGRvbmUgYWJvdXQgdGhpcywgZXhjZXB0Ci0gKiBpbnRyb2R1Y2UgYWRkaXRpb25hbCBsb2NraW5nIGluIHVzZXJzcGFjZS4KLSAqCi0gKiBNb3JlIGltcG9ydGFudCBpcyB0byBrZWVwIGlub2RlIGFuZCBmaWxlIHJlZmVyZW5jZXMgdW50aWwgdXNlcnNwYWNlCi0gKiBoYXMgcmVwbGllZCwgb3RoZXJ3aXNlIEZPUkdFVCBhbmQgUkVMRUFTRSBjb3VsZCBiZSBzZW50IHdoaWxlIHRoZQotICogaW5vZGUvZmlsZSBpcyBzdGlsbCB1c2VkIGJ5IHRoZSBmaWxlc3lzdGVtLgotICoKLSAqIEZvciB0aGlzIHJlYXNvbiB0aGUgY29uY2VwdCBvZiAiYmFja2dyb3VuZCIgcmVxdWVzdCBpcyBpbnRyb2R1Y2VkLgotICogQW4gaW50ZXJydXB0ZWQgcmVxdWVzdCBpcyBiYWNrZ3JvdW5kZWQgaWYgaXQgaGFzIGJlZW4gYWxyZWFkeSBzZW50Ci0gKiB0byB1c2Vyc3BhY2UuICBCYWNrZ3JvdW5kaW5nIGludm9sdmVzIGdldHRpbmcgYW4gZXh0cmEgcmVmZXJlbmNlIHRvCi0gKiBpbm9kZShzKSBvciBmaWxlIHVzZWQgaW4gdGhlIHJlcXVlc3QsIGFuZCBhZGRpbmcgdGhlIHJlcXVlc3QgdG8KLSAqIGZjLT5iYWNrZ3JvdW5kIGxpc3QuICBXaGVuIGEgcmVwbHkgaXMgcmVjZWl2ZWQgZm9yIGEgYmFja2dyb3VuZAotICogcmVxdWVzdCwgdGhlIG9iamVjdCByZWZlcmVuY2VzIGFyZSByZWxlYXNlZCwgYW5kIHRoZSByZXF1ZXN0IGlzCi0gKiByZW1vdmVkIGZyb20gdGhlIGxpc3QuICBJZiB0aGUgZmlsZXN5c3RlbSBpcyB1bm1vdW50ZWQgd2hpbGUgdGhlcmUKLSAqIGFyZSBzdGlsbCBiYWNrZ3JvdW5kIHJlcXVlc3RzLCB0aGUgbGlzdCBpcyB3YWxrZWQgYW5kIHJlZmVyZW5jZXMKLSAqIGFyZSByZWxlYXNlZCBhcyBpZiBhIHJlcGx5IHdhcyByZWNlaXZlZC4KLSAqCi0gKiBUaGVyZSdzIG9uZSBtb3JlIHVzZSBmb3IgYSBiYWNrZ3JvdW5kIHJlcXVlc3QuICBUaGUgUkVMRUFTRSBtZXNzYWdlIGlzCi0gKiBhbHdheXMgc2VudCBhcyBiYWNrZ3JvdW5kLCBzaW5jZSBpdCBkb2Vzbid0IHJldHVybiBhbiBlcnJvciBvcgotICogZGF0YS4KLSAqLwotc3RhdGljIHZvaWQgYmFja2dyb3VuZF9yZXF1ZXN0KHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCBzdHJ1Y3QgZnVzZV9yZXEgKnJlcSkKK3N0YXRpYyB2b2lkIHdhaXRfYW5zd2VyX2ludGVycnVwdGlibGUoc3RydWN0IGZ1c2VfY29ubiAqZmMsCisJCQkJICAgICAgc3RydWN0IGZ1c2VfcmVxICpyZXEpCiB7Ci0JcmVxLT5iYWNrZ3JvdW5kID0gMTsKLQlsaXN0X2FkZCgmcmVxLT5iZ19lbnRyeSwgJmZjLT5iYWNrZ3JvdW5kKTsKLQlmYy0+bnVtX2JhY2tncm91bmQrKzsKLQlpZiAoZmMtPm51bV9iYWNrZ3JvdW5kID09IEZVU0VfTUFYX0JBQ0tHUk9VTkQpCi0JCWZjLT5ibG9ja2VkID0gMTsKLQlpZiAocmVxLT5pbm9kZSkKLQkJcmVxLT5pbm9kZSA9IGlncmFiKHJlcS0+aW5vZGUpOwotCWlmIChyZXEtPmlub2RlMikKLQkJcmVxLT5pbm9kZTIgPSBpZ3JhYihyZXEtPmlub2RlMik7Ci0JaWYgKHJlcS0+ZmlsZSkKLQkJZ2V0X2ZpbGUocmVxLT5maWxlKTsKKwlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCXJldHVybjsKKworCXNwaW5fdW5sb2NrKCZmYy0+bG9jayk7CisJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHJlcS0+d2FpdHEsIHJlcS0+c3RhdGUgPT0gRlVTRV9SRVFfRklOSVNIRUQpOworCXNwaW5fbG9jaygmZmMtPmxvY2spOworfQorCitzdGF0aWMgdm9pZCBxdWV1ZV9pbnRlcnJ1cHQoc3RydWN0IGZ1c2VfY29ubiAqZmMsIHN0cnVjdCBmdXNlX3JlcSAqcmVxKQoreworCWxpc3RfYWRkX3RhaWwoJnJlcS0+aW50cl9lbnRyeSwgJmZjLT5pbnRlcnJ1cHRzKTsKKwl3YWtlX3VwKCZmYy0+d2FpdHEpOworCWtpbGxfZmFzeW5jKCZmYy0+ZmFzeW5jLCBTSUdJTywgUE9MTF9JTik7CiB9CiAKIC8qIENhbGxlZCB3aXRoIGZjLT5sb2NrIGhlbGQuICBSZWxlYXNlcywgYW5kIHRoZW4gcmVhY3F1aXJlcyBpdC4gKi8KIHN0YXRpYyB2b2lkIHJlcXVlc3Rfd2FpdF9hbnN3ZXIoc3RydWN0IGZ1c2VfY29ubiAqZmMsIHN0cnVjdCBmdXNlX3JlcSAqcmVxKQogewotCXNpZ3NldF90IG9sZHNldDsKKwlpZiAoIWZjLT5ub19pbnRlcnJ1cHQpIHsKKwkJLyogQW55IHNpZ25hbCBtYXkgaW50ZXJydXB0IHRoaXMgKi8KKwkJd2FpdF9hbnN3ZXJfaW50ZXJydXB0aWJsZShmYywgcmVxKTsKIAotCXNwaW5fdW5sb2NrKCZmYy0+bG9jayk7Ci0JYmxvY2tfc2lncygmb2xkc2V0KTsKLQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUocmVxLT53YWl0cSwgcmVxLT5zdGF0ZSA9PSBGVVNFX1JFUV9GSU5JU0hFRCk7Ci0JcmVzdG9yZV9zaWdzKCZvbGRzZXQpOwotCXNwaW5fbG9jaygmZmMtPmxvY2spOwotCWlmIChyZXEtPnN0YXRlID09IEZVU0VfUkVRX0ZJTklTSEVEICYmICFyZXEtPmludGVycnVwdGVkKQotCQlyZXR1cm47CisJCWlmIChyZXEtPmFib3J0ZWQpCisJCQlnb3RvIGFib3J0ZWQ7CisJCWlmIChyZXEtPnN0YXRlID09IEZVU0VfUkVRX0ZJTklTSEVEKQorCQkJcmV0dXJuOwogCi0JaWYgKCFyZXEtPmludGVycnVwdGVkKSB7Ci0JCXJlcS0+b3V0LmguZXJyb3IgPSAtRUlOVFI7CiAJCXJlcS0+aW50ZXJydXB0ZWQgPSAxOworCQlpZiAocmVxLT5zdGF0ZSA9PSBGVVNFX1JFUV9TRU5UKQorCQkJcXVldWVfaW50ZXJydXB0KGZjLCByZXEpOwogCX0KKworCWlmIChyZXEtPmZvcmNlKSB7CisJCXNwaW5fdW5sb2NrKCZmYy0+bG9jayk7CisJCXdhaXRfZXZlbnQocmVxLT53YWl0cSwgcmVxLT5zdGF0ZSA9PSBGVVNFX1JFUV9GSU5JU0hFRCk7CisJCXNwaW5fbG9jaygmZmMtPmxvY2spOworCX0gZWxzZSB7CisJCXNpZ3NldF90IG9sZHNldDsKKworCQkvKiBPbmx5IGZhdGFsIHNpZ25hbHMgbWF5IGludGVycnVwdCB0aGlzICovCisJCWJsb2NrX3NpZ3MoJm9sZHNldCk7CisJCXdhaXRfYW5zd2VyX2ludGVycnVwdGlibGUoZmMsIHJlcSk7CisJCXJlc3RvcmVfc2lncygmb2xkc2V0KTsKKwl9CisKKwlpZiAocmVxLT5hYm9ydGVkKQorCQlnb3RvIGFib3J0ZWQ7CisJaWYgKHJlcS0+c3RhdGUgPT0gRlVTRV9SRVFfRklOSVNIRUQpCisgCQlyZXR1cm47CisKKwlyZXEtPm91dC5oLmVycm9yID0gLUVJTlRSOworCXJlcS0+YWJvcnRlZCA9IDE7CisKKyBhYm9ydGVkOgogCWlmIChyZXEtPmxvY2tlZCkgewogCQkvKiBUaGlzIGlzIHVuaW50ZXJydXB0aWJsZSBzbGVlcCwgYmVjYXVzZSBkYXRhIGlzCiAJCSAgIGJlaW5nIGNvcGllZCB0by9mcm9tIHRoZSBidWZmZXJzIG9mIHJlcS4gIER1cmluZwpAQCAtMjY4LDggKzMwNywxMSBAQAogCWlmIChyZXEtPnN0YXRlID09IEZVU0VfUkVRX1BFTkRJTkcpIHsKIAkJbGlzdF9kZWwoJnJlcS0+bGlzdCk7CiAJCV9fZnVzZV9wdXRfcmVxdWVzdChyZXEpOwotCX0gZWxzZSBpZiAocmVxLT5zdGF0ZSA9PSBGVVNFX1JFUV9TRU5UKQotCQliYWNrZ3JvdW5kX3JlcXVlc3QoZmMsIHJlcSk7CisJfSBlbHNlIGlmIChyZXEtPnN0YXRlID09IEZVU0VfUkVRX1NFTlQpIHsKKwkJc3Bpbl91bmxvY2soJmZjLT5sb2NrKTsKKwkJd2FpdF9ldmVudChyZXEtPndhaXRxLCByZXEtPnN0YXRlID09IEZVU0VfUkVRX0ZJTklTSEVEKTsKKwkJc3Bpbl9sb2NrKCZmYy0+bG9jayk7CisJfQogfQogCiBzdGF0aWMgdW5zaWduZWQgbGVuX2FyZ3ModW5zaWduZWQgbnVtYXJncywgc3RydWN0IGZ1c2VfYXJnICphcmdzKQpAQCAtMjgzLDEzICszMjUsMTkgQEAKIAlyZXR1cm4gbmJ5dGVzOwogfQogCitzdGF0aWMgdTY0IGZ1c2VfZ2V0X3VuaXF1ZShzdHJ1Y3QgZnVzZV9jb25uICpmYykKKyB7CisgCWZjLT5yZXFjdHIrKzsKKyAJLyogemVybyBpcyBzcGVjaWFsICovCisgCWlmIChmYy0+cmVxY3RyID09IDApCisgCQlmYy0+cmVxY3RyID0gMTsKKworCXJldHVybiBmYy0+cmVxY3RyOworfQorCiBzdGF0aWMgdm9pZCBxdWV1ZV9yZXF1ZXN0KHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCBzdHJ1Y3QgZnVzZV9yZXEgKnJlcSkKIHsKLQlmYy0+cmVxY3RyKys7Ci0JLyogemVybyBpcyBzcGVjaWFsICovCi0JaWYgKGZjLT5yZXFjdHIgPT0gMCkKLQkJZmMtPnJlcWN0ciA9IDE7Ci0JcmVxLT5pbi5oLnVuaXF1ZSA9IGZjLT5yZXFjdHI7CisJcmVxLT5pbi5oLnVuaXF1ZSA9IGZ1c2VfZ2V0X3VuaXF1ZShmYyk7CiAJcmVxLT5pbi5oLmxlbiA9IHNpemVvZihzdHJ1Y3QgZnVzZV9pbl9oZWFkZXIpICsKIAkJbGVuX2FyZ3MocmVxLT5pbi5udW1hcmdzLCAoc3RydWN0IGZ1c2VfYXJnICopIHJlcS0+aW4uYXJncyk7CiAJbGlzdF9hZGRfdGFpbCgmcmVxLT5saXN0LCAmZmMtPnBlbmRpbmcpOwpAQCAtMzAyLDkgKzM1MCw2IEBACiAJa2lsbF9mYXN5bmMoJmZjLT5mYXN5bmMsIFNJR0lPLCBQT0xMX0lOKTsKIH0KIAotLyoKLSAqIFRoaXMgY2FuIG9ubHkgYmUgaW50ZXJydXB0ZWQgYnkgYSBTSUdLSUxMCi0gKi8KIHZvaWQgcmVxdWVzdF9zZW5kKHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCBzdHJ1Y3QgZnVzZV9yZXEgKnJlcSkKIHsKIAlyZXEtPmlzcmVwbHkgPSAxOwpAQCAtMzI3LDggKzM3MiwxMiBAQAogc3RhdGljIHZvaWQgcmVxdWVzdF9zZW5kX25vd2FpdChzdHJ1Y3QgZnVzZV9jb25uICpmYywgc3RydWN0IGZ1c2VfcmVxICpyZXEpCiB7CiAJc3Bpbl9sb2NrKCZmYy0+bG9jayk7Ci0JYmFja2dyb3VuZF9yZXF1ZXN0KGZjLCByZXEpOwogCWlmIChmYy0+Y29ubmVjdGVkKSB7CisJCXJlcS0+YmFja2dyb3VuZCA9IDE7CisJCWZjLT5udW1fYmFja2dyb3VuZCsrOworCQlpZiAoZmMtPm51bV9iYWNrZ3JvdW5kID09IEZVU0VfTUFYX0JBQ0tHUk9VTkQpCisJCQlmYy0+YmxvY2tlZCA9IDE7CisKIAkJcXVldWVfcmVxdWVzdChmYywgcmVxKTsKIAkJc3Bpbl91bmxvY2soJmZjLT5sb2NrKTsKIAl9IGVsc2UgewpAQCAtMzUyLDE0ICs0MDEsMTQgQEAKIC8qCiAgKiBMb2NrIHRoZSByZXF1ZXN0LiAgVXAgdG8gdGhlIG5leHQgdW5sb2NrX3JlcXVlc3QoKSB0aGVyZSBtdXN0bid0IGJlCiAgKiBhbnl0aGluZyB0aGF0IGNvdWxkIGNhdXNlIGEgcGFnZS1mYXVsdC4gIElmIHRoZSByZXF1ZXN0IHdhcyBhbHJlYWR5Ci0gKiBpbnRlcnJ1cHRlZCBiYWlsIG91dC4KKyAqIGFib3J0ZWQgYmFpbCBvdXQuCiAgKi8KIHN0YXRpYyBpbnQgbG9ja19yZXF1ZXN0KHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCBzdHJ1Y3QgZnVzZV9yZXEgKnJlcSkKIHsKIAlpbnQgZXJyID0gMDsKIAlpZiAocmVxKSB7CiAJCXNwaW5fbG9jaygmZmMtPmxvY2spOwotCQlpZiAocmVxLT5pbnRlcnJ1cHRlZCkKKwkJaWYgKHJlcS0+YWJvcnRlZCkKIAkJCWVyciA9IC1FTk9FTlQ7CiAJCWVsc2UKIAkJCXJlcS0+bG9ja2VkID0gMTsKQEAgLTM2OSw3ICs0MTgsNyBAQAogfQogCiAvKgotICogVW5sb2NrIHJlcXVlc3QuICBJZiBpdCB3YXMgaW50ZXJydXB0ZWQgZHVyaW5nIGJlaW5nIGxvY2tlZCwgdGhlCisgKiBVbmxvY2sgcmVxdWVzdC4gIElmIGl0IHdhcyBhYm9ydGVkIGR1cmluZyBiZWluZyBsb2NrZWQsIHRoZQogICogcmVxdWVzdGVyIHRocmVhZCBpcyBjdXJyZW50bHkgd2FpdGluZyBmb3IgaXQgdG8gYmUgdW5sb2NrZWQsIHNvCiAgKiB3YWtlIGl0IHVwLgogICovCkBAIC0zNzgsNyArNDI3LDcgQEAKIAlpZiAocmVxKSB7CiAJCXNwaW5fbG9jaygmZmMtPmxvY2spOwogCQlyZXEtPmxvY2tlZCA9IDA7Ci0JCWlmIChyZXEtPmludGVycnVwdGVkKQorCQlpZiAocmVxLT5hYm9ydGVkKQogCQkJd2FrZV91cCgmcmVxLT53YWl0cSk7CiAJCXNwaW5fdW5sb2NrKCZmYy0+bG9jayk7CiAJfQpAQCAtNTU3LDEzICs2MDYsMTggQEAKIAlyZXR1cm4gZXJyOwogfQogCitzdGF0aWMgaW50IHJlcXVlc3RfcGVuZGluZyhzdHJ1Y3QgZnVzZV9jb25uICpmYykKK3sKKwlyZXR1cm4gIWxpc3RfZW1wdHkoJmZjLT5wZW5kaW5nKSB8fCAhbGlzdF9lbXB0eSgmZmMtPmludGVycnVwdHMpOworfQorCiAvKiBXYWl0IHVudGlsIGEgcmVxdWVzdCBpcyBhdmFpbGFibGUgb24gdGhlIHBlbmRpbmcgbGlzdCAqLwogc3RhdGljIHZvaWQgcmVxdWVzdF93YWl0KHN0cnVjdCBmdXNlX2Nvbm4gKmZjKQogewogCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOwogCiAJYWRkX3dhaXRfcXVldWVfZXhjbHVzaXZlKCZmYy0+d2FpdHEsICZ3YWl0KTsKLQl3aGlsZSAoZmMtPmNvbm5lY3RlZCAmJiBsaXN0X2VtcHR5KCZmYy0+cGVuZGluZykpIHsKKwl3aGlsZSAoZmMtPmNvbm5lY3RlZCAmJiAhcmVxdWVzdF9wZW5kaW5nKGZjKSkgewogCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwogCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCiAJCQlicmVhazsKQEAgLTU3NywxMSArNjMxLDUwIEBACiB9CiAKIC8qCisgKiBUcmFuc2ZlciBhbiBpbnRlcnJ1cHQgcmVxdWVzdCB0byB1c2Vyc3BhY2UKKyAqCisgKiBVbmxpa2Ugb3RoZXIgcmVxdWVzdHMgdGhpcyBpcyBhc3NlbWJsZWQgb24gZGVtYW5kLCB3aXRob3V0IGEgbmVlZAorICogdG8gYWxsb2NhdGUgYSBzZXBhcmF0ZSBmdXNlX3JlcSBzdHJ1Y3R1cmUuCisgKgorICogQ2FsbGVkIHdpdGggZmMtPmxvY2sgaGVsZCwgcmVsZWFzZXMgaXQKKyAqLworc3RhdGljIGludCBmdXNlX3JlYWRfaW50ZXJydXB0KHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCBzdHJ1Y3QgZnVzZV9yZXEgKnJlcSwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwgdW5zaWduZWQgbG9uZyBucl9zZWdzKQoreworCXN0cnVjdCBmdXNlX2NvcHlfc3RhdGUgY3M7CisJc3RydWN0IGZ1c2VfaW5faGVhZGVyIGloOworCXN0cnVjdCBmdXNlX2ludGVycnVwdF9pbiBhcmc7CisJdW5zaWduZWQgcmVxc2l6ZSA9IHNpemVvZihpaCkgKyBzaXplb2YoYXJnKTsKKwlpbnQgZXJyOworCisJbGlzdF9kZWxfaW5pdCgmcmVxLT5pbnRyX2VudHJ5KTsKKwlyZXEtPmludHJfdW5pcXVlID0gZnVzZV9nZXRfdW5pcXVlKGZjKTsKKwltZW1zZXQoJmloLCAwLCBzaXplb2YoaWgpKTsKKwltZW1zZXQoJmFyZywgMCwgc2l6ZW9mKGFyZykpOworCWloLmxlbiA9IHJlcXNpemU7CisJaWgub3Bjb2RlID0gRlVTRV9JTlRFUlJVUFQ7CisJaWgudW5pcXVlID0gcmVxLT5pbnRyX3VuaXF1ZTsKKwlhcmcudW5pcXVlID0gcmVxLT5pbi5oLnVuaXF1ZTsKKworCXNwaW5fdW5sb2NrKCZmYy0+bG9jayk7CisJaWYgKGlvdl9sZW5ndGgoaW92LCBucl9zZWdzKSA8IHJlcXNpemUpCisJCXJldHVybiAtRUlOVkFMOworCisJZnVzZV9jb3B5X2luaXQoJmNzLCBmYywgMSwgTlVMTCwgaW92LCBucl9zZWdzKTsKKwllcnIgPSBmdXNlX2NvcHlfb25lKCZjcywgJmloLCBzaXplb2YoaWgpKTsKKwlpZiAoIWVycikKKwkJZXJyID0gZnVzZV9jb3B5X29uZSgmY3MsICZhcmcsIHNpemVvZihhcmcpKTsKKwlmdXNlX2NvcHlfZmluaXNoKCZjcyk7CisKKwlyZXR1cm4gZXJyID8gZXJyIDogcmVxc2l6ZTsKK30KKworLyoKICAqIFJlYWQgYSBzaW5nbGUgcmVxdWVzdCBpbnRvIHRoZSB1c2Vyc3BhY2UgZmlsZXN5c3RlbSdzIGJ1ZmZlci4gIFRoaXMKICAqIGZ1bmN0aW9uIHdhaXRzIHVudGlsIGEgcmVxdWVzdCBpcyBhdmFpbGFibGUsIHRoZW4gcmVtb3ZlcyBpdCBmcm9tCiAgKiB0aGUgcGVuZGluZyBsaXN0IGFuZCBjb3BpZXMgcmVxdWVzdCBkYXRhIHRvIHVzZXJzcGFjZSBidWZmZXIuICBJZgotICogbm8gcmVwbHkgaXMgbmVlZGVkIChGT1JHRVQpIG9yIHJlcXVlc3QgaGFzIGJlZW4gaW50ZXJydXB0ZWQgb3IKLSAqIHRoZXJlIHdhcyBhbiBlcnJvciBkdXJpbmcgdGhlIGNvcHlpbmcgdGhlbiBpdCdzIGZpbmlzaGVkIGJ5IGNhbGxpbmcKKyAqIG5vIHJlcGx5IGlzIG5lZWRlZCAoRk9SR0VUKSBvciByZXF1ZXN0IGhhcyBiZWVuIGFib3J0ZWQgb3IgdGhlcmUKKyAqIHdhcyBhbiBlcnJvciBkdXJpbmcgdGhlIGNvcHlpbmcgdGhlbiBpdCdzIGZpbmlzaGVkIGJ5IGNhbGxpbmcKICAqIHJlcXVlc3RfZW5kKCkuICBPdGhlcndpc2UgYWRkIGl0IHRvIHRoZSBwcm9jZXNzaW5nIGxpc3QsIGFuZCBzZXQKICAqIHRoZSAnc2VudCcgZmxhZy4KICAqLwpAQCAtNjAxLDcgKzY5NCw3IEBACiAJc3Bpbl9sb2NrKCZmYy0+bG9jayk7CiAJZXJyID0gLUVBR0FJTjsKIAlpZiAoKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSAmJiBmYy0+Y29ubmVjdGVkICYmCi0JICAgIGxpc3RfZW1wdHkoJmZjLT5wZW5kaW5nKSkKKwkgICAgIXJlcXVlc3RfcGVuZGluZyhmYykpCiAJCWdvdG8gZXJyX3VubG9jazsKIAogCXJlcXVlc3Rfd2FpdChmYyk7CkBAIC02MDksOSArNzAyLDE1IEBACiAJaWYgKCFmYy0+Y29ubmVjdGVkKQogCQlnb3RvIGVycl91bmxvY2s7CiAJZXJyID0gLUVSRVNUQVJUU1lTOwotCWlmIChsaXN0X2VtcHR5KCZmYy0+cGVuZGluZykpCisJaWYgKCFyZXF1ZXN0X3BlbmRpbmcoZmMpKQogCQlnb3RvIGVycl91bmxvY2s7CiAKKwlpZiAoIWxpc3RfZW1wdHkoJmZjLT5pbnRlcnJ1cHRzKSkgeworCQlyZXEgPSBsaXN0X2VudHJ5KGZjLT5pbnRlcnJ1cHRzLm5leHQsIHN0cnVjdCBmdXNlX3JlcSwKKwkJCQkgaW50cl9lbnRyeSk7CisJCXJldHVybiBmdXNlX3JlYWRfaW50ZXJydXB0KGZjLCByZXEsIGlvdiwgbnJfc2Vncyk7CisJfQorCiAJcmVxID0gbGlzdF9lbnRyeShmYy0+cGVuZGluZy5uZXh0LCBzdHJ1Y3QgZnVzZV9yZXEsIGxpc3QpOwogCXJlcS0+c3RhdGUgPSBGVVNFX1JFUV9SRUFESU5HOwogCWxpc3RfbW92ZSgmcmVxLT5saXN0LCAmZmMtPmlvKTsKQEAgLTYzNiwxMCArNzM1LDEwIEBACiAJZnVzZV9jb3B5X2ZpbmlzaCgmY3MpOwogCXNwaW5fbG9jaygmZmMtPmxvY2spOwogCXJlcS0+bG9ja2VkID0gMDsKLQlpZiAoIWVyciAmJiByZXEtPmludGVycnVwdGVkKQorCWlmICghZXJyICYmIHJlcS0+YWJvcnRlZCkKIAkJZXJyID0gLUVOT0VOVDsKIAlpZiAoZXJyKSB7Ci0JCWlmICghcmVxLT5pbnRlcnJ1cHRlZCkKKwkJaWYgKCFyZXEtPmFib3J0ZWQpCiAJCQlyZXEtPm91dC5oLmVycm9yID0gLUVJTzsKIAkJcmVxdWVzdF9lbmQoZmMsIHJlcSk7CiAJCXJldHVybiBlcnI7CkBAIC02NDksNiArNzQ4LDggQEAKIAllbHNlIHsKIAkJcmVxLT5zdGF0ZSA9IEZVU0VfUkVRX1NFTlQ7CiAJCWxpc3RfbW92ZV90YWlsKCZyZXEtPmxpc3QsICZmYy0+cHJvY2Vzc2luZyk7CisJCWlmIChyZXEtPmludGVycnVwdGVkKQorCQkJcXVldWVfaW50ZXJydXB0KGZjLCByZXEpOwogCQlzcGluX3VubG9jaygmZmMtPmxvY2spOwogCX0KIAlyZXR1cm4gcmVxc2l6ZTsKQEAgLTY3NSw3ICs3NzYsNyBAQAogCWxpc3RfZm9yX2VhY2goZW50cnksICZmYy0+cHJvY2Vzc2luZykgewogCQlzdHJ1Y3QgZnVzZV9yZXEgKnJlcTsKIAkJcmVxID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IGZ1c2VfcmVxLCBsaXN0KTsKLQkJaWYgKHJlcS0+aW4uaC51bmlxdWUgPT0gdW5pcXVlKQorCQlpZiAocmVxLT5pbi5oLnVuaXF1ZSA9PSB1bmlxdWUgfHwgcmVxLT5pbnRyX3VuaXF1ZSA9PSB1bmlxdWUpCiAJCQlyZXR1cm4gcmVxOwogCX0KIAlyZXR1cm4gTlVMTDsKQEAgLTc0MSwxNyArODQyLDMzIEBACiAJCWdvdG8gZXJyX3VubG9jazsKIAogCXJlcSA9IHJlcXVlc3RfZmluZChmYywgb2gudW5pcXVlKTsKLQllcnIgPSAtRUlOVkFMOwogCWlmICghcmVxKQogCQlnb3RvIGVycl91bmxvY2s7CiAKLQlpZiAocmVxLT5pbnRlcnJ1cHRlZCkgeworCWlmIChyZXEtPmFib3J0ZWQpIHsKIAkJc3Bpbl91bmxvY2soJmZjLT5sb2NrKTsKIAkJZnVzZV9jb3B5X2ZpbmlzaCgmY3MpOwogCQlzcGluX2xvY2soJmZjLT5sb2NrKTsKIAkJcmVxdWVzdF9lbmQoZmMsIHJlcSk7CiAJCXJldHVybiAtRU5PRU5UOwogCX0KKwkvKiBJcyBpdCBhbiBpbnRlcnJ1cHQgcmVwbHk/ICovCisJaWYgKHJlcS0+aW50cl91bmlxdWUgPT0gb2gudW5pcXVlKSB7CisJCWVyciA9IC1FSU5WQUw7CisJCWlmIChuYnl0ZXMgIT0gc2l6ZW9mKHN0cnVjdCBmdXNlX291dF9oZWFkZXIpKQorCQkJZ290byBlcnJfdW5sb2NrOworCisJCWlmIChvaC5lcnJvciA9PSAtRU5PU1lTKQorCQkJZmMtPm5vX2ludGVycnVwdCA9IDE7CisJCWVsc2UgaWYgKG9oLmVycm9yID09IC1FQUdBSU4pCisJCQlxdWV1ZV9pbnRlcnJ1cHQoZmMsIHJlcSk7CisKKwkJc3Bpbl91bmxvY2soJmZjLT5sb2NrKTsKKwkJZnVzZV9jb3B5X2ZpbmlzaCgmY3MpOworCQlyZXR1cm4gbmJ5dGVzOworCX0KKworCXJlcS0+c3RhdGUgPSBGVVNFX1JFUV9XUklUSU5HOwogCWxpc3RfbW92ZSgmcmVxLT5saXN0LCAmZmMtPmlvKTsKIAlyZXEtPm91dC5oID0gb2g7CiAJcmVxLT5sb2NrZWQgPSAxOwpAQCAtNzY0LDkgKzg4MSw5IEBACiAJc3Bpbl9sb2NrKCZmYy0+bG9jayk7CiAJcmVxLT5sb2NrZWQgPSAwOwogCWlmICghZXJyKSB7Ci0JCWlmIChyZXEtPmludGVycnVwdGVkKQorCQlpZiAocmVxLT5hYm9ydGVkKQogCQkJZXJyID0gLUVOT0VOVDsKLQl9IGVsc2UgaWYgKCFyZXEtPmludGVycnVwdGVkKQorCX0gZWxzZSBpZiAoIXJlcS0+YWJvcnRlZCkKIAkJcmVxLT5vdXQuaC5lcnJvciA9IC1FSU87CiAJcmVxdWVzdF9lbmQoZmMsIHJlcSk7CiAKQEAgLTgwMCw3ICs5MTcsNyBAQAogCXNwaW5fbG9jaygmZmMtPmxvY2spOwogCWlmICghZmMtPmNvbm5lY3RlZCkKIAkJbWFzayA9IFBPTExFUlI7Ci0JZWxzZSBpZiAoIWxpc3RfZW1wdHkoJmZjLT5wZW5kaW5nKSkKKwllbHNlIGlmIChyZXF1ZXN0X3BlbmRpbmcoZmMpKQogCQltYXNrIHw9IFBPTExJTiB8IFBPTExSRE5PUk07CiAJc3Bpbl91bmxvY2soJmZjLT5sb2NrKTsKIApAQCAtODI2LDcgKzk0Myw3IEBACiAvKgogICogQWJvcnQgcmVxdWVzdHMgdW5kZXIgSS9PCiAgKgotICogVGhlIHJlcXVlc3RzIGFyZSBzZXQgdG8gaW50ZXJydXB0ZWQgYW5kIGZpbmlzaGVkLCBhbmQgdGhlIHJlcXVlc3QKKyAqIFRoZSByZXF1ZXN0cyBhcmUgc2V0IHRvIGFib3J0ZWQgYW5kIGZpbmlzaGVkLCBhbmQgdGhlIHJlcXVlc3QKICAqIHdhaXRlciBpcyB3b2tlbiB1cC4gIFRoaXMgd2lsbCBtYWtlIHJlcXVlc3Rfd2FpdF9hbnN3ZXIoKSB3YWl0CiAgKiB1bnRpbCB0aGUgcmVxdWVzdCBpcyB1bmxvY2tlZCBhbmQgdGhlbiByZXR1cm4uCiAgKgpAQCAtODQxLDcgKzk1OCw3IEBACiAJCQlsaXN0X2VudHJ5KGZjLT5pby5uZXh0LCBzdHJ1Y3QgZnVzZV9yZXEsIGxpc3QpOwogCQl2b2lkICgqZW5kKSAoc3RydWN0IGZ1c2VfY29ubiAqLCBzdHJ1Y3QgZnVzZV9yZXEgKikgPSByZXEtPmVuZDsKIAotCQlyZXEtPmludGVycnVwdGVkID0gMTsKKwkJcmVxLT5hYm9ydGVkID0gMTsKIAkJcmVxLT5vdXQuaC5lcnJvciA9IC1FQ09OTkFCT1JURUQ7CiAJCXJlcS0+c3RhdGUgPSBGVVNFX1JFUV9GSU5JU0hFRDsKIAkJbGlzdF9kZWxfaW5pdCgmcmVxLT5saXN0KTsKQEAgLTg3NCwxOSArOTkxLDIwIEBACiAgKiBvbnRvIHRoZSBwZW5kaW5nIGxpc3QgaXMgcHJldmVudGVkIGJ5IHJlcS0+Y29ubmVjdGVkIGJlaW5nIGZhbHNlLgogICoKICAqIFByb2dyZXNzaW9uIG9mIHJlcXVlc3RzIHVuZGVyIEkvTyB0byB0aGUgcHJvY2Vzc2luZyBsaXN0IGlzCi0gKiBwcmV2ZW50ZWQgYnkgdGhlIHJlcS0+aW50ZXJydXB0ZWQgZmxhZyBiZWluZyB0cnVlIGZvciB0aGVzZQotICogcmVxdWVzdHMuICBGb3IgdGhpcyByZWFzb24gcmVxdWVzdHMgb24gdGhlIGlvIGxpc3QgbXVzdCBiZSBhYm9ydGVkCi0gKiBmaXJzdC4KKyAqIHByZXZlbnRlZCBieSB0aGUgcmVxLT5hYm9ydGVkIGZsYWcgYmVpbmcgdHJ1ZSBmb3IgdGhlc2UgcmVxdWVzdHMuCisgKiBGb3IgdGhpcyByZWFzb24gcmVxdWVzdHMgb24gdGhlIGlvIGxpc3QgbXVzdCBiZSBhYm9ydGVkIGZpcnN0LgogICovCiB2b2lkIGZ1c2VfYWJvcnRfY29ubihzdHJ1Y3QgZnVzZV9jb25uICpmYykKIHsKIAlzcGluX2xvY2soJmZjLT5sb2NrKTsKIAlpZiAoZmMtPmNvbm5lY3RlZCkgewogCQlmYy0+Y29ubmVjdGVkID0gMDsKKwkJZmMtPmJsb2NrZWQgPSAwOwogCQllbmRfaW9fcmVxdWVzdHMoZmMpOwogCQllbmRfcmVxdWVzdHMoZmMsICZmYy0+cGVuZGluZyk7CiAJCWVuZF9yZXF1ZXN0cyhmYywgJmZjLT5wcm9jZXNzaW5nKTsKIAkJd2FrZV91cF9hbGwoJmZjLT53YWl0cSk7CisJCXdha2VfdXBfYWxsKCZmYy0+YmxvY2tlZF93YWl0cSk7CiAJCWtpbGxfZmFzeW5jKCZmYy0+ZmFzeW5jLCBTSUdJTywgUE9MTF9JTik7CiAJfQogCXNwaW5fdW5sb2NrKCZmYy0+bG9jayk7CkBAIC05MDIsNyArMTAyMCw3IEBACiAJCWVuZF9yZXF1ZXN0cyhmYywgJmZjLT5wcm9jZXNzaW5nKTsKIAkJc3Bpbl91bmxvY2soJmZjLT5sb2NrKTsKIAkJZmFzeW5jX2hlbHBlcigtMSwgZmlsZSwgMCwgJmZjLT5mYXN5bmMpOwotCQlrb2JqZWN0X3B1dCgmZmMtPmtvYmopOworCQlmdXNlX2Nvbm5fcHV0KGZjKTsKIAl9CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2ZzL2Z1c2UvZGlyLmMgYi9mcy9mdXNlL2Rpci5jCmluZGV4IDhkNzU0NmUuLjcyYTc0Y2QgMTAwNjQ0Ci0tLSBhL2ZzL2Z1c2UvZGlyLmMKKysrIGIvZnMvZnVzZS9kaXIuYwpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgIEZVU0U6IEZpbGVzeXN0ZW0gaW4gVXNlcnNwYWNlCi0gIENvcHlyaWdodCAoQykgMjAwMS0yMDA1ICBNaWtsb3MgU3plcmVkaSA8bWlrbG9zQHN6ZXJlZGkuaHU+CisgIENvcHlyaWdodCAoQykgMjAwMS0yMDA2ICBNaWtsb3MgU3plcmVkaSA8bWlrbG9zQHN6ZXJlZGkuaHU+CiAKICAgVGhpcyBwcm9ncmFtIGNhbiBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwuCiAgIFNlZSB0aGUgZmlsZSBDT1BZSU5HLgpAQCAtNzksNyArNzksNiBAQAogewogCXJlcS0+aW4uaC5vcGNvZGUgPSBGVVNFX0xPT0tVUDsKIAlyZXEtPmluLmgubm9kZWlkID0gZ2V0X25vZGVfaWQoZGlyKTsKLQlyZXEtPmlub2RlID0gZGlyOwogCXJlcS0+aW4ubnVtYXJncyA9IDE7CiAJcmVxLT5pbi5hcmdzWzBdLnNpemUgPSBlbnRyeS0+ZF9uYW1lLmxlbiArIDE7CiAJcmVxLT5pbi5hcmdzWzBdLnZhbHVlID0gZW50cnktPmRfbmFtZS5uYW1lOwpAQCAtMjI1LDYgKzIyNCwyMCBAQAogfQogCiAvKgorICogU3luY2hyb25vdXMgcmVsZWFzZSBmb3IgdGhlIGNhc2Ugd2hlbiBzb21ldGhpbmcgZ29lcyB3cm9uZyBpbiBDUkVBVEVfT1BFTgorICovCitzdGF0aWMgdm9pZCBmdXNlX3N5bmNfcmVsZWFzZShzdHJ1Y3QgZnVzZV9jb25uICpmYywgc3RydWN0IGZ1c2VfZmlsZSAqZmYsCisJCQkgICAgICB1NjQgbm9kZWlkLCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IGZ1c2VfcmVxICpyZXE7CisKKwlyZXEgPSBmdXNlX3JlbGVhc2VfZmlsbChmZiwgbm9kZWlkLCBmbGFncywgRlVTRV9SRUxFQVNFKTsKKwlyZXEtPmZvcmNlID0gMTsKKwlyZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CisJZnVzZV9wdXRfcmVxdWVzdChmYywgcmVxKTsKK30KKworLyoKICAqIEF0b21pYyBjcmVhdGUrb3BlbiBvcGVyYXRpb24KICAqCiAgKiBJZiB0aGUgZmlsZXN5c3RlbSBkb2Vzbid0IHN1cHBvcnQgdGhpcywgdGhlbiBmYWxsIGJhY2sgdG8gc2VwYXJhdGUKQEAgLTIzNyw2ICsyNTAsNyBAQAogCXN0cnVjdCBpbm9kZSAqaW5vZGU7CiAJc3RydWN0IGZ1c2VfY29ubiAqZmMgPSBnZXRfZnVzZV9jb25uKGRpcik7CiAJc3RydWN0IGZ1c2VfcmVxICpyZXE7CisJc3RydWN0IGZ1c2VfcmVxICpmb3JnZXRfcmVxOwogCXN0cnVjdCBmdXNlX29wZW5faW4gaW5hcmc7CiAJc3RydWN0IGZ1c2Vfb3Blbl9vdXQgb3V0b3BlbjsKIAlzdHJ1Y3QgZnVzZV9lbnRyeV9vdXQgb3V0ZW50cnk7CkBAIC0yNDcsOSArMjYxLDE0IEBACiAJaWYgKGZjLT5ub19jcmVhdGUpCiAJCXJldHVybiAtRU5PU1lTOwogCisJZm9yZ2V0X3JlcSA9IGZ1c2VfZ2V0X3JlcShmYyk7CisJaWYgKElTX0VSUihmb3JnZXRfcmVxKSkKKwkJcmV0dXJuIFBUUl9FUlIoZm9yZ2V0X3JlcSk7CisKIAlyZXEgPSBmdXNlX2dldF9yZXEoZmMpOworCWVyciA9IFBUUl9FUlIocmVxKTsKIAlpZiAoSVNfRVJSKHJlcSkpCi0JCXJldHVybiBQVFJfRVJSKHJlcSk7CisJCWdvdG8gb3V0X3B1dF9mb3JnZXRfcmVxOwogCiAJZXJyID0gLUVOT01FTTsKIAlmZiA9IGZ1c2VfZmlsZV9hbGxvYygpOwpAQCAtMjYyLDcgKzI4MSw2IEBACiAJaW5hcmcubW9kZSA9IG1vZGU7CiAJcmVxLT5pbi5oLm9wY29kZSA9IEZVU0VfQ1JFQVRFOwogCXJlcS0+aW4uaC5ub2RlaWQgPSBnZXRfbm9kZV9pZChkaXIpOwotCXJlcS0+aW5vZGUgPSBkaXI7CiAJcmVxLT5pbi5udW1hcmdzID0gMjsKIAlyZXEtPmluLmFyZ3NbMF0uc2l6ZSA9IHNpemVvZihpbmFyZyk7CiAJcmVxLT5pbi5hcmdzWzBdLnZhbHVlID0gJmluYXJnOwpAQCAtMjg1LDI1ICszMDMsMjMgQEAKIAlpZiAoIVNfSVNSRUcob3V0ZW50cnkuYXR0ci5tb2RlKSB8fCBpbnZhbGlkX25vZGVpZChvdXRlbnRyeS5ub2RlaWQpKQogCQlnb3RvIG91dF9mcmVlX2ZmOwogCisJZnVzZV9wdXRfcmVxdWVzdChmYywgcmVxKTsKIAlpbm9kZSA9IGZ1c2VfaWdldChkaXItPmlfc2IsIG91dGVudHJ5Lm5vZGVpZCwgb3V0ZW50cnkuZ2VuZXJhdGlvbiwKIAkJCSAgJm91dGVudHJ5LmF0dHIpOwotCWVyciA9IC1FTk9NRU07CiAJaWYgKCFpbm9kZSkgewogCQlmbGFncyAmPSB+KE9fQ1JFQVQgfCBPX0VYQ0wgfCBPX1RSVU5DKTsKIAkJZmYtPmZoID0gb3V0b3Blbi5maDsKLQkJLyogU3BlY2lhbCByZWxlYXNlLCB3aXRoIGlub2RlID0gTlVMTCwgdGhpcyB3aWxsCi0JCSAgIHRyaWdnZXIgYSAnZm9yZ2V0JyByZXF1ZXN0IHdoZW4gdGhlIHJlbGVhc2UgaXMKLQkJICAgY29tcGxldGUgKi8KLQkJZnVzZV9zZW5kX3JlbGVhc2UoZmMsIGZmLCBvdXRlbnRyeS5ub2RlaWQsIE5VTEwsIGZsYWdzLCAwKTsKLQkJZ290byBvdXRfcHV0X3JlcXVlc3Q7CisJCWZ1c2Vfc3luY19yZWxlYXNlKGZjLCBmZiwgb3V0ZW50cnkubm9kZWlkLCBmbGFncyk7CisJCWZ1c2Vfc2VuZF9mb3JnZXQoZmMsIGZvcmdldF9yZXEsIG91dGVudHJ5Lm5vZGVpZCwgMSk7CisJCXJldHVybiAtRU5PTUVNOwogCX0KLQlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOworCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIGZvcmdldF9yZXEpOwogCWRfaW5zdGFudGlhdGUoZW50cnksIGlub2RlKTsKIAlmdXNlX2NoYW5nZV90aW1lb3V0KGVudHJ5LCAmb3V0ZW50cnkpOwogCWZpbGUgPSBsb29rdXBfaW5zdGFudGlhdGVfZmlscChuZCwgZW50cnksIGdlbmVyaWNfZmlsZV9vcGVuKTsKIAlpZiAoSVNfRVJSKGZpbGUpKSB7CiAJCWZmLT5maCA9IG91dG9wZW4uZmg7Ci0JCWZ1c2Vfc2VuZF9yZWxlYXNlKGZjLCBmZiwgb3V0ZW50cnkubm9kZWlkLCBpbm9kZSwgZmxhZ3MsIDApOworCQlmdXNlX3N5bmNfcmVsZWFzZShmYywgZmYsIG91dGVudHJ5Lm5vZGVpZCwgZmxhZ3MpOwogCQlyZXR1cm4gUFRSX0VSUihmaWxlKTsKIAl9CiAJZnVzZV9maW5pc2hfb3Blbihpbm9kZSwgZmlsZSwgZmYsICZvdXRvcGVuKTsKQEAgLTMxMyw2ICszMjksOCBAQAogCWZ1c2VfZmlsZV9mcmVlKGZmKTsKICBvdXRfcHV0X3JlcXVlc3Q6CiAJZnVzZV9wdXRfcmVxdWVzdChmYywgcmVxKTsKKyBvdXRfcHV0X2ZvcmdldF9yZXE6CisJZnVzZV9wdXRfcmVxdWVzdChmYywgZm9yZ2V0X3JlcSk7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMzI4LDcgKzM0Niw2IEBACiAJaW50IGVycjsKIAogCXJlcS0+aW4uaC5ub2RlaWQgPSBnZXRfbm9kZV9pZChkaXIpOwotCXJlcS0+aW5vZGUgPSBkaXI7CiAJcmVxLT5vdXQubnVtYXJncyA9IDE7CiAJcmVxLT5vdXQuYXJnc1swXS5zaXplID0gc2l6ZW9mKG91dGFyZyk7CiAJcmVxLT5vdXQuYXJnc1swXS52YWx1ZSA9ICZvdXRhcmc7CkBAIC00NDgsNyArNDY1LDYgQEAKIAogCXJlcS0+aW4uaC5vcGNvZGUgPSBGVVNFX1VOTElOSzsKIAlyZXEtPmluLmgubm9kZWlkID0gZ2V0X25vZGVfaWQoZGlyKTsKLQlyZXEtPmlub2RlID0gZGlyOwogCXJlcS0+aW4ubnVtYXJncyA9IDE7CiAJcmVxLT5pbi5hcmdzWzBdLnNpemUgPSBlbnRyeS0+ZF9uYW1lLmxlbiArIDE7CiAJcmVxLT5pbi5hcmdzWzBdLnZhbHVlID0gZW50cnktPmRfbmFtZS5uYW1lOwpAQCAtNDgwLDcgKzQ5Niw2IEBACiAKIAlyZXEtPmluLmgub3Bjb2RlID0gRlVTRV9STURJUjsKIAlyZXEtPmluLmgubm9kZWlkID0gZ2V0X25vZGVfaWQoZGlyKTsKLQlyZXEtPmlub2RlID0gZGlyOwogCXJlcS0+aW4ubnVtYXJncyA9IDE7CiAJcmVxLT5pbi5hcmdzWzBdLnNpemUgPSBlbnRyeS0+ZF9uYW1lLmxlbiArIDE7CiAJcmVxLT5pbi5hcmdzWzBdLnZhbHVlID0gZW50cnktPmRfbmFtZS5uYW1lOwpAQCAtNTEwLDggKzUyNSw2IEBACiAJaW5hcmcubmV3ZGlyID0gZ2V0X25vZGVfaWQobmV3ZGlyKTsKIAlyZXEtPmluLmgub3Bjb2RlID0gRlVTRV9SRU5BTUU7CiAJcmVxLT5pbi5oLm5vZGVpZCA9IGdldF9ub2RlX2lkKG9sZGRpcik7Ci0JcmVxLT5pbm9kZSA9IG9sZGRpcjsKLQlyZXEtPmlub2RlMiA9IG5ld2RpcjsKIAlyZXEtPmluLm51bWFyZ3MgPSAzOwogCXJlcS0+aW4uYXJnc1swXS5zaXplID0gc2l6ZW9mKGluYXJnKTsKIAlyZXEtPmluLmFyZ3NbMF0udmFsdWUgPSAmaW5hcmc7CkBAIC01NTgsNyArNTcxLDYgQEAKIAltZW1zZXQoJmluYXJnLCAwLCBzaXplb2YoaW5hcmcpKTsKIAlpbmFyZy5vbGRub2RlaWQgPSBnZXRfbm9kZV9pZChpbm9kZSk7CiAJcmVxLT5pbi5oLm9wY29kZSA9IEZVU0VfTElOSzsKLQlyZXEtPmlub2RlMiA9IGlub2RlOwogCXJlcS0+aW4ubnVtYXJncyA9IDI7CiAJcmVxLT5pbi5hcmdzWzBdLnNpemUgPSBzaXplb2YoaW5hcmcpOwogCXJlcS0+aW4uYXJnc1swXS52YWx1ZSA9ICZpbmFyZzsKQEAgLTU4Nyw3ICs1OTksNiBAQAogCiAJcmVxLT5pbi5oLm9wY29kZSA9IEZVU0VfR0VUQVRUUjsKIAlyZXEtPmluLmgubm9kZWlkID0gZ2V0X25vZGVfaWQoaW5vZGUpOwotCXJlcS0+aW5vZGUgPSBpbm9kZTsKIAlyZXEtPm91dC5udW1hcmdzID0gMTsKIAlyZXEtPm91dC5hcmdzWzBdLnNpemUgPSBzaXplb2YoYXJnKTsKIAlyZXEtPm91dC5hcmdzWzBdLnZhbHVlID0gJmFyZzsKQEAgLTY3OSw3ICs2OTAsNiBAQAogCWluYXJnLm1hc2sgPSBtYXNrOwogCXJlcS0+aW4uaC5vcGNvZGUgPSBGVVNFX0FDQ0VTUzsKIAlyZXEtPmluLmgubm9kZWlkID0gZ2V0X25vZGVfaWQoaW5vZGUpOwotCXJlcS0+aW5vZGUgPSBpbm9kZTsKIAlyZXEtPmluLm51bWFyZ3MgPSAxOwogCXJlcS0+aW4uYXJnc1swXS5zaXplID0gc2l6ZW9mKGluYXJnKTsKIAlyZXEtPmluLmFyZ3NbMF0udmFsdWUgPSAmaW5hcmc7CkBAIC04MjAsNyArODMwLDYgQEAKIAl9CiAJcmVxLT5pbi5oLm9wY29kZSA9IEZVU0VfUkVBRExJTks7CiAJcmVxLT5pbi5oLm5vZGVpZCA9IGdldF9ub2RlX2lkKGlub2RlKTsKLQlyZXEtPmlub2RlID0gaW5vZGU7CiAJcmVxLT5vdXQuYXJndmFyID0gMTsKIAlyZXEtPm91dC5udW1hcmdzID0gMTsKIAlyZXEtPm91dC5hcmdzWzBdLnNpemUgPSBQQUdFX1NJWkUgLSAxOwpAQCAtOTM5LDcgKzk0OCw2IEBACiAJaWF0dHJfdG9fZmF0dHIoYXR0ciwgJmluYXJnKTsKIAlyZXEtPmluLmgub3Bjb2RlID0gRlVTRV9TRVRBVFRSOwogCXJlcS0+aW4uaC5ub2RlaWQgPSBnZXRfbm9kZV9pZChpbm9kZSk7Ci0JcmVxLT5pbm9kZSA9IGlub2RlOwogCXJlcS0+aW4ubnVtYXJncyA9IDE7CiAJcmVxLT5pbi5hcmdzWzBdLnNpemUgPSBzaXplb2YoaW5hcmcpOwogCXJlcS0+aW4uYXJnc1swXS52YWx1ZSA9ICZpbmFyZzsKQEAgLTEwMDIsNyArMTAxMCw2IEBACiAJaW5hcmcuZmxhZ3MgPSBmbGFnczsKIAlyZXEtPmluLmgub3Bjb2RlID0gRlVTRV9TRVRYQVRUUjsKIAlyZXEtPmluLmgubm9kZWlkID0gZ2V0X25vZGVfaWQoaW5vZGUpOwotCXJlcS0+aW5vZGUgPSBpbm9kZTsKIAlyZXEtPmluLm51bWFyZ3MgPSAzOwogCXJlcS0+aW4uYXJnc1swXS5zaXplID0gc2l6ZW9mKGluYXJnKTsKIAlyZXEtPmluLmFyZ3NbMF0udmFsdWUgPSAmaW5hcmc7CkBAIC0xMDQxLDcgKzEwNDgsNiBAQAogCWluYXJnLnNpemUgPSBzaXplOwogCXJlcS0+aW4uaC5vcGNvZGUgPSBGVVNFX0dFVFhBVFRSOwogCXJlcS0+aW4uaC5ub2RlaWQgPSBnZXRfbm9kZV9pZChpbm9kZSk7Ci0JcmVxLT5pbm9kZSA9IGlub2RlOwogCXJlcS0+aW4ubnVtYXJncyA9IDI7CiAJcmVxLT5pbi5hcmdzWzBdLnNpemUgPSBzaXplb2YoaW5hcmcpOwogCXJlcS0+aW4uYXJnc1swXS52YWx1ZSA9ICZpbmFyZzsKQEAgLTEwOTEsNyArMTA5Nyw2IEBACiAJaW5hcmcuc2l6ZSA9IHNpemU7CiAJcmVxLT5pbi5oLm9wY29kZSA9IEZVU0VfTElTVFhBVFRSOwogCXJlcS0+aW4uaC5ub2RlaWQgPSBnZXRfbm9kZV9pZChpbm9kZSk7Ci0JcmVxLT5pbm9kZSA9IGlub2RlOwogCXJlcS0+aW4ubnVtYXJncyA9IDE7CiAJcmVxLT5pbi5hcmdzWzBdLnNpemUgPSBzaXplb2YoaW5hcmcpOwogCXJlcS0+aW4uYXJnc1swXS52YWx1ZSA9ICZpbmFyZzsKQEAgLTExMzUsNyArMTE0MCw2IEBACiAKIAlyZXEtPmluLmgub3Bjb2RlID0gRlVTRV9SRU1PVkVYQVRUUjsKIAlyZXEtPmluLmgubm9kZWlkID0gZ2V0X25vZGVfaWQoaW5vZGUpOwotCXJlcS0+aW5vZGUgPSBpbm9kZTsKIAlyZXEtPmluLm51bWFyZ3MgPSAxOwogCXJlcS0+aW4uYXJnc1swXS5zaXplID0gc3RybGVuKG5hbWUpICsgMTsKIAlyZXEtPmluLmFyZ3NbMF0udmFsdWUgPSBuYW1lOwpkaWZmIC0tZ2l0IGEvZnMvZnVzZS9maWxlLmMgYi9mcy9mdXNlL2ZpbGUuYwppbmRleCAwODdmM2I3Li4yOGFhODFlIDEwMDY0NAotLS0gYS9mcy9mdXNlL2ZpbGUuYworKysgYi9mcy9mdXNlL2ZpbGUuYwpAQCAtMzAsNyArMzAsNiBAQAogCWluYXJnLmZsYWdzID0gZmlsZS0+Zl9mbGFncyAmIH4oT19DUkVBVCB8IE9fRVhDTCB8IE9fTk9DVFRZIHwgT19UUlVOQyk7CiAJcmVxLT5pbi5oLm9wY29kZSA9IGlzZGlyID8gRlVTRV9PUEVORElSIDogRlVTRV9PUEVOOwogCXJlcS0+aW4uaC5ub2RlaWQgPSBnZXRfbm9kZV9pZChpbm9kZSk7Ci0JcmVxLT5pbm9kZSA9IGlub2RlOwogCXJlcS0+aW4ubnVtYXJncyA9IDE7CiAJcmVxLT5pbi5hcmdzWzBdLnNpemUgPSBzaXplb2YoaW5hcmcpOwogCXJlcS0+aW4uYXJnc1swXS52YWx1ZSA9ICZpbmFyZzsKQEAgLTQ5LDggKzQ4LDggQEAKIAlzdHJ1Y3QgZnVzZV9maWxlICpmZjsKIAlmZiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBmdXNlX2ZpbGUpLCBHRlBfS0VSTkVMKTsKIAlpZiAoZmYpIHsKLQkJZmYtPnJlbGVhc2VfcmVxID0gZnVzZV9yZXF1ZXN0X2FsbG9jKCk7Ci0JCWlmICghZmYtPnJlbGVhc2VfcmVxKSB7CisJCWZmLT5yZXNlcnZlZF9yZXEgPSBmdXNlX3JlcXVlc3RfYWxsb2MoKTsKKwkJaWYgKCFmZi0+cmVzZXJ2ZWRfcmVxKSB7CiAJCQlrZnJlZShmZik7CiAJCQlmZiA9IE5VTEw7CiAJCX0KQEAgLTYwLDcgKzU5LDcgQEAKIAogdm9pZCBmdXNlX2ZpbGVfZnJlZShzdHJ1Y3QgZnVzZV9maWxlICpmZikKIHsKLQlmdXNlX3JlcXVlc3RfZnJlZShmZi0+cmVsZWFzZV9yZXEpOworCWZ1c2VfcmVxdWVzdF9mcmVlKGZmLT5yZXNlcnZlZF9yZXEpOwogCWtmcmVlKGZmKTsKIH0KIApAQCAtMTEzLDM3ICsxMTIsMjIgQEAKIAlyZXR1cm4gZXJyOwogfQogCi0vKiBTcGVjaWFsIGNhc2UgZm9yIGZhaWxlZCBpZ2V0IGluIENSRUFURSAqLwotc3RhdGljIHZvaWQgZnVzZV9yZWxlYXNlX2VuZChzdHJ1Y3QgZnVzZV9jb25uICpmYywgc3RydWN0IGZ1c2VfcmVxICpyZXEpCitzdHJ1Y3QgZnVzZV9yZXEgKmZ1c2VfcmVsZWFzZV9maWxsKHN0cnVjdCBmdXNlX2ZpbGUgKmZmLCB1NjQgbm9kZWlkLCBpbnQgZmxhZ3MsCisJCQkJICAgaW50IG9wY29kZSkKIHsKLQkvKiBJZiBjYWxsZWQgZnJvbSBlbmRfaW9fcmVxdWVzdHMoKSwgcmVxIGhhcyBtb3JlIHRoYW4gb25lCi0JICAgcmVmZXJlbmNlIGFuZCBmdXNlX3Jlc2V0X3JlcXVlc3QoKSBjYW5ub3Qgd29yayAqLwotCWlmIChmYy0+Y29ubmVjdGVkKSB7Ci0JCXU2NCBub2RlaWQgPSByZXEtPmluLmgubm9kZWlkOwotCQlmdXNlX3Jlc2V0X3JlcXVlc3QocmVxKTsKLQkJZnVzZV9zZW5kX2ZvcmdldChmYywgcmVxLCBub2RlaWQsIDEpOwotCX0gZWxzZQotCQlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOwotfQotCi12b2lkIGZ1c2Vfc2VuZF9yZWxlYXNlKHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCBzdHJ1Y3QgZnVzZV9maWxlICpmZiwKLQkJICAgICAgIHU2NCBub2RlaWQsIHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBmbGFncywgaW50IGlzZGlyKQotewotCXN0cnVjdCBmdXNlX3JlcSAqIHJlcSA9IGZmLT5yZWxlYXNlX3JlcTsKKwlzdHJ1Y3QgZnVzZV9yZXEgKnJlcSA9IGZmLT5yZXNlcnZlZF9yZXE7CiAJc3RydWN0IGZ1c2VfcmVsZWFzZV9pbiAqaW5hcmcgPSAmcmVxLT5taXNjLnJlbGVhc2VfaW47CiAKIAlpbmFyZy0+ZmggPSBmZi0+Zmg7CiAJaW5hcmctPmZsYWdzID0gZmxhZ3M7Ci0JcmVxLT5pbi5oLm9wY29kZSA9IGlzZGlyID8gRlVTRV9SRUxFQVNFRElSIDogRlVTRV9SRUxFQVNFOworCXJlcS0+aW4uaC5vcGNvZGUgPSBvcGNvZGU7CiAJcmVxLT5pbi5oLm5vZGVpZCA9IG5vZGVpZDsKLQlyZXEtPmlub2RlID0gaW5vZGU7CiAJcmVxLT5pbi5udW1hcmdzID0gMTsKIAlyZXEtPmluLmFyZ3NbMF0uc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZnVzZV9yZWxlYXNlX2luKTsKIAlyZXEtPmluLmFyZ3NbMF0udmFsdWUgPSBpbmFyZzsKLQlyZXF1ZXN0X3NlbmRfYmFja2dyb3VuZChmYywgcmVxKTsKLQlpZiAoIWlub2RlKQotCQlyZXEtPmVuZCA9IGZ1c2VfcmVsZWFzZV9lbmQ7CiAJa2ZyZWUoZmYpOworCisJcmV0dXJuIHJlcTsKIH0KIAogaW50IGZ1c2VfcmVsZWFzZV9jb21tb24oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIGludCBpc2RpcikKQEAgLTE1MSw4ICsxMzUsMTUgQEAKIAlzdHJ1Y3QgZnVzZV9maWxlICpmZiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlpZiAoZmYpIHsKIAkJc3RydWN0IGZ1c2VfY29ubiAqZmMgPSBnZXRfZnVzZV9jb25uKGlub2RlKTsKLQkJdTY0IG5vZGVpZCA9IGdldF9ub2RlX2lkKGlub2RlKTsKLQkJZnVzZV9zZW5kX3JlbGVhc2UoZmMsIGZmLCBub2RlaWQsIGlub2RlLCBmaWxlLT5mX2ZsYWdzLCBpc2Rpcik7CisJCXN0cnVjdCBmdXNlX3JlcSAqcmVxOworCisJCXJlcSA9IGZ1c2VfcmVsZWFzZV9maWxsKGZmLCBnZXRfbm9kZV9pZChpbm9kZSksIGZpbGUtPmZfZmxhZ3MsCisJCQkJCWlzZGlyID8gRlVTRV9SRUxFQVNFRElSIDogRlVTRV9SRUxFQVNFKTsKKworCQkvKiBIb2xkIHZmc21vdW50IGFuZCBkZW50cnkgdW50aWwgcmVsZWFzZSBpcyBmaW5pc2hlZCAqLworCQlyZXEtPnZmc21vdW50ID0gbW50Z2V0KGZpbGUtPmZfdmZzbW50KTsKKwkJcmVxLT5kZW50cnkgPSBkZ2V0KGZpbGUtPmZfZGVudHJ5KTsKKwkJcmVxdWVzdF9zZW5kX2JhY2tncm91bmQoZmMsIHJlcSk7CiAJfQogCiAJLyogUmV0dXJuIHZhbHVlIGlzIGlnbm9yZWQgYnkgVkZTICovCkBAIC0xNjksNiArMTYwLDI4IEBACiAJcmV0dXJuIGZ1c2VfcmVsZWFzZV9jb21tb24oaW5vZGUsIGZpbGUsIDApOwogfQogCisvKgorICogU2NyYW1ibGUgdGhlIElEIHNwYWNlIHdpdGggWFRFQSwgc28gdGhhdCB0aGUgdmFsdWUgb2YgdGhlIGZpbGVzX3N0cnVjdAorICogcG9pbnRlciBpcyBub3QgZXhwb3NlZCB0byB1c2Vyc3BhY2UuCisgKi8KK3N0YXRpYyB1NjQgZnVzZV9sb2NrX293bmVyX2lkKHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCBmbF9vd25lcl90IGlkKQoreworCXUzMiAqayA9IGZjLT5zY3JhbWJsZV9rZXk7CisJdTY0IHYgPSAodW5zaWduZWQgbG9uZykgaWQ7CisJdTMyIHYwID0gdjsKKwl1MzIgdjEgPSB2ID4+IDMyOworCXUzMiBzdW0gPSAwOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHsKKwkJdjAgKz0gKCh2MSA8PCA0IF4gdjEgPj4gNSkgKyB2MSkgXiAoc3VtICsga1tzdW0gJiAzXSk7CisJCXN1bSArPSAweDlFMzc3OUI5OworCQl2MSArPSAoKHYwIDw8IDQgXiB2MCA+PiA1KSArIHYwKSBeIChzdW0gKyBrW3N1bT4+MTEgJiAzXSk7CisJfQorCisJcmV0dXJuICh1NjQpIHYwICsgKCh1NjQpIHYxIDw8IDMyKTsKK30KKwogc3RhdGljIGludCBmdXNlX2ZsdXNoKHN0cnVjdCBmaWxlICpmaWxlLCBmbF9vd25lcl90IGlkKQogewogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKQEAgLTE4NCwxOSArMTk3LDE2IEBACiAJaWYgKGZjLT5ub19mbHVzaCkKIAkJcmV0dXJuIDA7CiAKLQlyZXEgPSBmdXNlX2dldF9yZXEoZmMpOwotCWlmIChJU19FUlIocmVxKSkKLQkJcmV0dXJuIFBUUl9FUlIocmVxKTsKLQorCXJlcSA9IGZ1c2VfZ2V0X3JlcV9ub2ZhaWwoZmMsIGZpbGUpOwogCW1lbXNldCgmaW5hcmcsIDAsIHNpemVvZihpbmFyZykpOwogCWluYXJnLmZoID0gZmYtPmZoOworCWluYXJnLmxvY2tfb3duZXIgPSBmdXNlX2xvY2tfb3duZXJfaWQoZmMsIGlkKTsKIAlyZXEtPmluLmgub3Bjb2RlID0gRlVTRV9GTFVTSDsKIAlyZXEtPmluLmgubm9kZWlkID0gZ2V0X25vZGVfaWQoaW5vZGUpOwotCXJlcS0+aW5vZGUgPSBpbm9kZTsKLQlyZXEtPmZpbGUgPSBmaWxlOwogCXJlcS0+aW4ubnVtYXJncyA9IDE7CiAJcmVxLT5pbi5hcmdzWzBdLnNpemUgPSBzaXplb2YoaW5hcmcpOwogCXJlcS0+aW4uYXJnc1swXS52YWx1ZSA9ICZpbmFyZzsKKwlyZXEtPmZvcmNlID0gMTsKIAlyZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CiAJZXJyID0gcmVxLT5vdXQuaC5lcnJvcjsKIAlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOwpAQCAtMjMyLDggKzI0Miw2IEBACiAJaW5hcmcuZnN5bmNfZmxhZ3MgPSBkYXRhc3luYyA/IDEgOiAwOwogCXJlcS0+aW4uaC5vcGNvZGUgPSBpc2RpciA/IEZVU0VfRlNZTkNESVIgOiBGVVNFX0ZTWU5DOwogCXJlcS0+aW4uaC5ub2RlaWQgPSBnZXRfbm9kZV9pZChpbm9kZSk7Ci0JcmVxLT5pbm9kZSA9IGlub2RlOwotCXJlcS0+ZmlsZSA9IGZpbGU7CiAJcmVxLT5pbi5udW1hcmdzID0gMTsKIAlyZXEtPmluLmFyZ3NbMF0uc2l6ZSA9IHNpemVvZihpbmFyZyk7CiAJcmVxLT5pbi5hcmdzWzBdLnZhbHVlID0gJmluYXJnOwpAQCAtMjY2LDggKzI3NCw2IEBACiAJaW5hcmctPnNpemUgPSBjb3VudDsKIAlyZXEtPmluLmgub3Bjb2RlID0gb3Bjb2RlOwogCXJlcS0+aW4uaC5ub2RlaWQgPSBnZXRfbm9kZV9pZChpbm9kZSk7Ci0JcmVxLT5pbm9kZSA9IGlub2RlOwotCXJlcS0+ZmlsZSA9IGZpbGU7CiAJcmVxLT5pbi5udW1hcmdzID0gMTsKIAlyZXEtPmluLmFyZ3NbMF0uc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZnVzZV9yZWFkX2luKTsKIAlyZXEtPmluLmFyZ3NbMF0udmFsdWUgPSBpbmFyZzsKQEAgLTM0Miw2ICszNDgsOCBAQAogCXJlcS0+b3V0LnBhZ2VfemVyb2luZyA9IDE7CiAJZnVzZV9yZWFkX2ZpbGwocmVxLCBmaWxlLCBpbm9kZSwgcG9zLCBjb3VudCwgRlVTRV9SRUFEKTsKIAlpZiAoZmMtPmFzeW5jX3JlYWQpIHsKKwkJZ2V0X2ZpbGUoZmlsZSk7CisJCXJlcS0+ZmlsZSA9IGZpbGU7CiAJCXJlcS0+ZW5kID0gZnVzZV9yZWFkcGFnZXNfZW5kOwogCQlyZXF1ZXN0X3NlbmRfYmFja2dyb3VuZChmYywgcmVxKTsKIAl9IGVsc2UgewpAQCAtNDIwLDggKzQyOCw2IEBACiAJaW5hcmcuc2l6ZSA9IGNvdW50OwogCXJlcS0+aW4uaC5vcGNvZGUgPSBGVVNFX1dSSVRFOwogCXJlcS0+aW4uaC5ub2RlaWQgPSBnZXRfbm9kZV9pZChpbm9kZSk7Ci0JcmVxLT5pbm9kZSA9IGlub2RlOwotCXJlcS0+ZmlsZSA9IGZpbGU7CiAJcmVxLT5pbi5hcmdwYWdlcyA9IDE7CiAJcmVxLT5pbi5udW1hcmdzID0gMjsKIAlyZXEtPmluLmFyZ3NbMF0uc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZnVzZV93cml0ZV9pbik7CkBAIC02MTksNiArNjI1LDEyNiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGNvbnZlcnRfZnVzZV9maWxlX2xvY2soY29uc3Qgc3RydWN0IGZ1c2VfZmlsZV9sb2NrICpmZmwsCisJCQkJICBzdHJ1Y3QgZmlsZV9sb2NrICpmbCkKK3sKKwlzd2l0Y2ggKGZmbC0+dHlwZSkgeworCWNhc2UgRl9VTkxDSzoKKwkJYnJlYWs7CisKKwljYXNlIEZfUkRMQ0s6CisJY2FzZSBGX1dSTENLOgorCQlpZiAoZmZsLT5zdGFydCA+IE9GRlNFVF9NQVggfHwgZmZsLT5lbmQgPiBPRkZTRVRfTUFYIHx8CisJCSAgICBmZmwtPmVuZCA8IGZmbC0+c3RhcnQpCisJCQlyZXR1cm4gLUVJTzsKKworCQlmbC0+Zmxfc3RhcnQgPSBmZmwtPnN0YXJ0OworCQlmbC0+ZmxfZW5kID0gZmZsLT5lbmQ7CisJCWZsLT5mbF9waWQgPSBmZmwtPnBpZDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTzsKKwl9CisJZmwtPmZsX3R5cGUgPSBmZmwtPnR5cGU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGZ1c2VfbGtfZmlsbChzdHJ1Y3QgZnVzZV9yZXEgKnJlcSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgY29uc3Qgc3RydWN0IGZpbGVfbG9jayAqZmwsIGludCBvcGNvZGUsIHBpZF90IHBpZCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGZ1c2VfY29ubiAqZmMgPSBnZXRfZnVzZV9jb25uKGlub2RlKTsKKwlzdHJ1Y3QgZnVzZV9maWxlICpmZiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZnVzZV9sa19pbiAqYXJnID0gJnJlcS0+bWlzYy5sa19pbjsKKworCWFyZy0+ZmggPSBmZi0+Zmg7CisJYXJnLT5vd25lciA9IGZ1c2VfbG9ja19vd25lcl9pZChmYywgZmwtPmZsX293bmVyKTsKKwlhcmctPmxrLnN0YXJ0ID0gZmwtPmZsX3N0YXJ0OworCWFyZy0+bGsuZW5kID0gZmwtPmZsX2VuZDsKKwlhcmctPmxrLnR5cGUgPSBmbC0+ZmxfdHlwZTsKKwlhcmctPmxrLnBpZCA9IHBpZDsKKwlyZXEtPmluLmgub3Bjb2RlID0gb3Bjb2RlOworCXJlcS0+aW4uaC5ub2RlaWQgPSBnZXRfbm9kZV9pZChpbm9kZSk7CisJcmVxLT5pbi5udW1hcmdzID0gMTsKKwlyZXEtPmluLmFyZ3NbMF0uc2l6ZSA9IHNpemVvZigqYXJnKTsKKwlyZXEtPmluLmFyZ3NbMF0udmFsdWUgPSBhcmc7Cit9CisKK3N0YXRpYyBpbnQgZnVzZV9nZXRsayhzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGZpbGVfbG9jayAqZmwpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBmdXNlX2Nvbm4gKmZjID0gZ2V0X2Z1c2VfY29ubihpbm9kZSk7CisJc3RydWN0IGZ1c2VfcmVxICpyZXE7CisJc3RydWN0IGZ1c2VfbGtfb3V0IG91dGFyZzsKKwlpbnQgZXJyOworCisJcmVxID0gZnVzZV9nZXRfcmVxKGZjKTsKKwlpZiAoSVNfRVJSKHJlcSkpCisJCXJldHVybiBQVFJfRVJSKHJlcSk7CisKKwlmdXNlX2xrX2ZpbGwocmVxLCBmaWxlLCBmbCwgRlVTRV9HRVRMSywgMCk7CisJcmVxLT5vdXQubnVtYXJncyA9IDE7CisJcmVxLT5vdXQuYXJnc1swXS5zaXplID0gc2l6ZW9mKG91dGFyZyk7CisJcmVxLT5vdXQuYXJnc1swXS52YWx1ZSA9ICZvdXRhcmc7CisJcmVxdWVzdF9zZW5kKGZjLCByZXEpOworCWVyciA9IHJlcS0+b3V0LmguZXJyb3I7CisJZnVzZV9wdXRfcmVxdWVzdChmYywgcmVxKTsKKwlpZiAoIWVycikKKwkJZXJyID0gY29udmVydF9mdXNlX2ZpbGVfbG9jaygmb3V0YXJnLmxrLCBmbCk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGZ1c2Vfc2V0bGsoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBmaWxlX2xvY2sgKmZsKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGdldF9mdXNlX2Nvbm4oaW5vZGUpOworCXN0cnVjdCBmdXNlX3JlcSAqcmVxOworCWludCBvcGNvZGUgPSAoZmwtPmZsX2ZsYWdzICYgRkxfU0xFRVApID8gRlVTRV9TRVRMS1cgOiBGVVNFX1NFVExLOworCXBpZF90IHBpZCA9IGZsLT5mbF90eXBlICE9IEZfVU5MQ0sgPyBjdXJyZW50LT50Z2lkIDogMDsKKwlpbnQgZXJyOworCisJLyogVW5sb2NrIG9uIGNsb3NlIGlzIGhhbmRsZWQgYnkgdGhlIGZsdXNoIG1ldGhvZCAqLworCWlmIChmbC0+ZmxfZmxhZ3MgJiBGTF9DTE9TRSkKKwkJcmV0dXJuIDA7CisKKwlyZXEgPSBmdXNlX2dldF9yZXEoZmMpOworCWlmIChJU19FUlIocmVxKSkKKwkJcmV0dXJuIFBUUl9FUlIocmVxKTsKKworCWZ1c2VfbGtfZmlsbChyZXEsIGZpbGUsIGZsLCBvcGNvZGUsIHBpZCk7CisJcmVxdWVzdF9zZW5kKGZjLCByZXEpOworCWVyciA9IHJlcS0+b3V0LmguZXJyb3I7CisJLyogbG9ja2luZyBpcyByZXN0YXJ0YWJsZSAqLworCWlmIChlcnIgPT0gLUVJTlRSKQorCQllcnIgPSAtRVJFU1RBUlRTWVM7CisJZnVzZV9wdXRfcmVxdWVzdChmYywgcmVxKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGZ1c2VfZmlsZV9sb2NrKHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgY21kLCBzdHJ1Y3QgZmlsZV9sb2NrICpmbCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGZ1c2VfY29ubiAqZmMgPSBnZXRfZnVzZV9jb25uKGlub2RlKTsKKwlpbnQgZXJyOworCisJaWYgKGNtZCA9PSBGX0dFVExLKSB7CisJCWlmIChmYy0+bm9fbG9jaykgeworCQkJaWYgKCFwb3NpeF90ZXN0X2xvY2soZmlsZSwgZmwsIGZsKSkKKwkJCQlmbC0+ZmxfdHlwZSA9IEZfVU5MQ0s7CisJCQllcnIgPSAwOworCQl9IGVsc2UKKwkJCWVyciA9IGZ1c2VfZ2V0bGsoZmlsZSwgZmwpOworCX0gZWxzZSB7CisJCWlmIChmYy0+bm9fbG9jaykKKwkJCWVyciA9IHBvc2l4X2xvY2tfZmlsZV93YWl0KGZpbGUsIGZsKTsKKwkJZWxzZQorCQkJZXJyID0gZnVzZV9zZXRsayhmaWxlLCBmbCk7CisJfQorCXJldHVybiBlcnI7Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZ1c2VfZmlsZV9vcGVyYXRpb25zID0gewogCS5sbHNlZWsJCT0gZ2VuZXJpY19maWxlX2xsc2VlaywKIAkucmVhZAkJPSBnZW5lcmljX2ZpbGVfcmVhZCwKQEAgLTYyOCw2ICs3NTQsNyBAQAogCS5mbHVzaAkJPSBmdXNlX2ZsdXNoLAogCS5yZWxlYXNlCT0gZnVzZV9yZWxlYXNlLAogCS5mc3luYwkJPSBmdXNlX2ZzeW5jLAorCS5sb2NrCQk9IGZ1c2VfZmlsZV9sb2NrLAogCS5zZW5kZmlsZQk9IGdlbmVyaWNfZmlsZV9zZW5kZmlsZSwKIH07CiAKQEAgLTYzOSw2ICs3NjYsNyBAQAogCS5mbHVzaAkJPSBmdXNlX2ZsdXNoLAogCS5yZWxlYXNlCT0gZnVzZV9yZWxlYXNlLAogCS5mc3luYwkJPSBmdXNlX2ZzeW5jLAorCS5sb2NrCQk9IGZ1c2VfZmlsZV9sb2NrLAogCS8qIG5vIG1tYXAgYW5kIHNlbmRmaWxlICovCiB9OwogCmRpZmYgLS1naXQgYS9mcy9mdXNlL2Z1c2VfaS5oIGIvZnMvZnVzZS9mdXNlX2kuaAppbmRleCAwNDc0MjAyLi4wZGJmOTY2IDEwMDY0NAotLS0gYS9mcy9mdXNlL2Z1c2VfaS5oCisrKyBiL2ZzL2Z1c2UvZnVzZV9pLmgKQEAgLTgsMTIgKzgsMTMgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2Z1c2UuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvYmFja2luZy1kZXYuaD4KLSNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIAogLyoqIE1heCBudW1iZXIgb2YgcGFnZXMgdGhhdCBjYW4gYmUgdXNlZCBpbiBhIHNpbmdsZSByZWFkIHJlcXVlc3QgKi8KICNkZWZpbmUgRlVTRV9NQVhfUEFHRVNfUEVSX1JFUSAzMgpAQCAtMjQsNiArMjUsOSBAQAogLyoqIEl0IGNvdWxkIGJlIGFzIGxhcmdlIGFzIFBBVEhfTUFYLCBidXQgd291bGQgdGhhdCBoYXZlIGFueSB1c2VzPyAqLwogI2RlZmluZSBGVVNFX05BTUVfTUFYIDEwMjQKIAorLyoqIE51bWJlciBvZiBkZW50cmllcyBmb3IgZWFjaCBjb25uZWN0aW9uIGluIHRoZSBjb250cm9sIGZpbGVzeXN0ZW0gKi8KKyNkZWZpbmUgRlVTRV9DVExfTlVNX0RFTlRSSUVTIDMKKwogLyoqIElmIHRoZSBGVVNFX0RFRkFVTFRfUEVSTUlTU0lPTlMgZmxhZyBpcyBnaXZlbiwgdGhlIGZpbGVzeXN0ZW0KICAgICBtb2R1bGUgd2lsbCBjaGVjayBwZXJtaXNzaW9ucyBiYXNlZCBvbiB0aGUgZmlsZSBtb2RlLiAgT3RoZXJ3aXNlIG5vCiAgICAgcGVybWlzc2lvbiBjaGVja2luZyBpcyBkb25lIGluIHRoZSBrZXJuZWwgKi8KQEAgLTMzLDYgKzM3LDExIEBACiAgICAgZG9pbmcgdGhlIG1vdW50IHdpbGwgYmUgYWxsb3dlZCB0byBhY2Nlc3MgdGhlIGZpbGVzeXN0ZW0gKi8KICNkZWZpbmUgRlVTRV9BTExPV19PVEhFUiAgICAgICAgICgxIDw8IDEpCiAKKy8qKiBMaXN0IG9mIGFjdGl2ZSBjb25uZWN0aW9ucyAqLworZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgZnVzZV9jb25uX2xpc3Q7CisKKy8qKiBHbG9iYWwgbXV0ZXggcHJvdGVjdGluZyBmdXNlX2Nvbm5fbGlzdCBhbmQgdGhlIGNvbnRyb2wgZmlsZXN5c3RlbSAqLworZXh0ZXJuIHN0cnVjdCBtdXRleCBmdXNlX211dGV4OwogCiAvKiogRlVTRSBpbm9kZSAqLwogc3RydWN0IGZ1c2VfaW5vZGUgewpAQCAtNTYsNyArNjUsNyBAQAogLyoqIEZVU0Ugc3BlY2lmaWMgZmlsZSBkYXRhICovCiBzdHJ1Y3QgZnVzZV9maWxlIHsKIAkvKiogUmVxdWVzdCByZXNlcnZlZCBmb3IgZmx1c2ggYW5kIHJlbGVhc2UgKi8KLQlzdHJ1Y3QgZnVzZV9yZXEgKnJlbGVhc2VfcmVxOworCXN0cnVjdCBmdXNlX3JlcSAqcmVzZXJ2ZWRfcmVxOwogCiAJLyoqIEZpbGUgaGFuZGxlIHVzZWQgYnkgdXNlcnNwYWNlICovCiAJdTY0IGZoOwpAQCAtMTIyLDYgKzEzMSw3IEBACiAJRlVTRV9SRVFfUEVORElORywKIAlGVVNFX1JFUV9SRUFESU5HLAogCUZVU0VfUkVRX1NFTlQsCisJRlVTRV9SRVFfV1JJVElORywKIAlGVVNFX1JFUV9GSU5JU0hFRAogfTsKIApAQCAtMTM1LDEyICsxNDUsMTUgQEAKIAkgICAgZnVzZV9jb25uICovCiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCi0JLyoqIEVudHJ5IG9uIHRoZSBiYWNrZ3JvdW5kIGxpc3QgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkIGJnX2VudHJ5OworCS8qKiBFbnRyeSBvbiB0aGUgaW50ZXJydXB0cyBsaXN0ICAqLworCXN0cnVjdCBsaXN0X2hlYWQgaW50cl9lbnRyeTsKIAogCS8qKiByZWZjb3VudCAqLwogCWF0b21pY190IGNvdW50OwogCisJLyoqIFVuaXF1ZSBJRCBmb3IgdGhlIGludGVycnVwdCByZXF1ZXN0ICovCisJdTY0IGludHJfdW5pcXVlOworCiAJLyoKIAkgKiBUaGUgZm9sbG93aW5nIGJpdGZpZWxkcyBhcmUgZWl0aGVyIHNldCBvbmNlIGJlZm9yZSB0aGUKIAkgKiByZXF1ZXN0IGlzIHF1ZXVlZCBvciBzZXR0aW5nL2NsZWFyaW5nIHRoZW0gaXMgcHJvdGVjdGVkIGJ5CkBAIC0xNTAsMTIgKzE2MywxOCBAQAogCS8qKiBUcnVlIGlmIHRoZSByZXF1ZXN0IGhhcyByZXBseSAqLwogCXVuc2lnbmVkIGlzcmVwbHk6MTsKIAotCS8qKiBUaGUgcmVxdWVzdCB3YXMgaW50ZXJydXB0ZWQgKi8KLQl1bnNpZ25lZCBpbnRlcnJ1cHRlZDoxOworCS8qKiBGb3JjZSBzZW5kaW5nIG9mIHRoZSByZXF1ZXN0IGV2ZW4gaWYgaW50ZXJydXB0ZWQgKi8KKwl1bnNpZ25lZCBmb3JjZToxOworCisJLyoqIFRoZSByZXF1ZXN0IHdhcyBhYm9ydGVkICovCisJdW5zaWduZWQgYWJvcnRlZDoxOwogCiAJLyoqIFJlcXVlc3QgaXMgc2VudCBpbiB0aGUgYmFja2dyb3VuZCAqLwogCXVuc2lnbmVkIGJhY2tncm91bmQ6MTsKIAorCS8qKiBUaGUgcmVxdWVzdCBoYXMgYmVlbiBpbnRlcnJ1cHRlZCAqLworCXVuc2lnbmVkIGludGVycnVwdGVkOjE7CisKIAkvKiogRGF0YSBpcyBiZWluZyBjb3BpZWQgdG8vZnJvbSB0aGUgcmVxdWVzdCAqLwogCXVuc2lnbmVkIGxvY2tlZDoxOwogCkBAIC0xODEsNiArMjAwLDcgQEAKIAkJc3RydWN0IGZ1c2VfaW5pdF9pbiBpbml0X2luOwogCQlzdHJ1Y3QgZnVzZV9pbml0X291dCBpbml0X291dDsKIAkJc3RydWN0IGZ1c2VfcmVhZF9pbiByZWFkX2luOworCQlzdHJ1Y3QgZnVzZV9sa19pbiBsa19pbjsKIAl9IG1pc2M7CiAKIAkvKiogcGFnZSB2ZWN0b3IgKi8KQEAgLTE5MiwxNyArMjEyLDIwIEBACiAJLyoqIG9mZnNldCBvZiBkYXRhIG9uIGZpcnN0IHBhZ2UgKi8KIAl1bnNpZ25lZCBwYWdlX29mZnNldDsKIAotCS8qKiBJbm9kZSB1c2VkIGluIHRoZSByZXF1ZXN0ICovCi0Jc3RydWN0IGlub2RlICppbm9kZTsKLQotCS8qKiBTZWNvbmQgaW5vZGUgdXNlZCBpbiB0aGUgcmVxdWVzdCAob3IgTlVMTCkgKi8KLQlzdHJ1Y3QgaW5vZGUgKmlub2RlMjsKLQogCS8qKiBGaWxlIHVzZWQgaW4gdGhlIHJlcXVlc3QgKG9yIE5VTEwpICovCiAJc3RydWN0IGZpbGUgKmZpbGU7CiAKKwkvKiogdmZzbW91bnQgdXNlZCBpbiByZWxlYXNlICovCisJc3RydWN0IHZmc21vdW50ICp2ZnNtb3VudDsKKworCS8qKiBkZW50cnkgdXNlZCBpbiByZWxlYXNlICovCisJc3RydWN0IGRlbnRyeSAqZGVudHJ5OworCiAJLyoqIFJlcXVlc3QgY29tcGxldGlvbiBjYWxsYmFjayAqLwogCXZvaWQgKCplbmQpKHN0cnVjdCBmdXNlX2Nvbm4gKiwgc3RydWN0IGZ1c2VfcmVxICopOworCisJLyoqIFJlcXVlc3QgaXMgc3RvbGVuIGZyb20gZnVzZV9maWxlLT5yZXNlcnZlZF9yZXEgKi8KKwlzdHJ1Y3QgZmlsZSAqc3RvbGVuX2ZpbGU7CiB9OwogCiAvKioKQEAgLTIxNiw2ICsyMzksOSBAQAogCS8qKiBMb2NrIHByb3RlY3RpbmcgYWNjZXNzZXNzIHRvICBtZW1iZXJzIG9mIHRoaXMgc3RydWN0dXJlICovCiAJc3BpbmxvY2tfdCBsb2NrOwogCisJLyoqIFJlZmNvdW50ICovCisJYXRvbWljX3QgY291bnQ7CisKIAkvKiogVGhlIHVzZXIgaWQgZm9yIHRoaXMgbW91bnQgKi8KIAl1aWRfdCB1c2VyX2lkOwogCkBAIC0yNDMsMTMgKzI2OSwxMiBAQAogCS8qKiBUaGUgbGlzdCBvZiByZXF1ZXN0cyB1bmRlciBJL08gKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIGlvOwogCi0JLyoqIFJlcXVlc3RzIHB1dCBpbiB0aGUgYmFja2dyb3VuZCAoUkVMRUFTRSBvciBhbnkgb3RoZXIKLQkgICAgaW50ZXJydXB0ZWQgcmVxdWVzdCkgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkIGJhY2tncm91bmQ7Ci0KIAkvKiogTnVtYmVyIG9mIHJlcXVlc3RzIGN1cnJlbnRseSBpbiB0aGUgYmFja2dyb3VuZCAqLwogCXVuc2lnbmVkIG51bV9iYWNrZ3JvdW5kOwogCisJLyoqIFBlbmRpbmcgaW50ZXJydXB0cyAqLworCXN0cnVjdCBsaXN0X2hlYWQgaW50ZXJydXB0czsKKwogCS8qKiBGbGFnIGluZGljYXRpbmcgaWYgY29ubmVjdGlvbiBpcyBibG9ja2VkLiAgVGhpcyB3aWxsIGJlCiAJICAgIHRoZSBjYXNlIGJlZm9yZSB0aGUgSU5JVCByZXBseSBpcyByZWNlaXZlZCwgYW5kIGlmIHRoZXJlCiAJICAgIGFyZSB0b28gbWFueSBvdXRzdGFkaW5nIGJhY2tncm91bmRzIHJlcXVlc3RzICovCkBAIC0yNTgsMTUgKzI4Myw5IEBACiAJLyoqIHdhaXRxIGZvciBibG9ja2VkIGNvbm5lY3Rpb24gKi8KIAl3YWl0X3F1ZXVlX2hlYWRfdCBibG9ja2VkX3dhaXRxOwogCi0JLyoqIFJXIHNlbWFwaG9yZSBmb3IgZXhjbHVzaW9uIHdpdGggZnVzZV9wdXRfc3VwZXIoKSAqLwotCXN0cnVjdCByd19zZW1hcGhvcmUgc2JwdXRfc2VtOwotCiAJLyoqIFRoZSBuZXh0IHVuaXF1ZSByZXF1ZXN0IGlkICovCiAJdTY0IHJlcWN0cjsKIAotCS8qKiBNb3VudCBpcyBhY3RpdmUgKi8KLQl1bnNpZ25lZCBtb3VudGVkOwotCiAJLyoqIENvbm5lY3Rpb24gZXN0YWJsaXNoZWQsIGNsZWFyZWQgb24gdW1vdW50LCBjb25uZWN0aW9uCiAJICAgIGFib3J0IGFuZCBkZXZpY2UgcmVsZWFzZSAqLwogCXVuc2lnbmVkIGNvbm5lY3RlZDsKQEAgLTMwNSwxMiArMzI0LDE4IEBACiAJLyoqIElzIHJlbW92ZXhhdHRyIG5vdCBpbXBsZW1lbnRlZCBieSBmcz8gKi8KIAl1bnNpZ25lZCBub19yZW1vdmV4YXR0ciA6IDE7CiAKKwkvKiogQXJlIGZpbGUgbG9ja2luZyBwcmltaXRpdmVzIG5vdCBpbXBsZW1lbnRlZCBieSBmcz8gKi8KKwl1bnNpZ25lZCBub19sb2NrIDogMTsKKwogCS8qKiBJcyBhY2Nlc3Mgbm90IGltcGxlbWVudGVkIGJ5IGZzPyAqLwogCXVuc2lnbmVkIG5vX2FjY2VzcyA6IDE7CiAKIAkvKiogSXMgY3JlYXRlIG5vdCBpbXBsZW1lbnRlZCBieSBmcz8gKi8KIAl1bnNpZ25lZCBub19jcmVhdGUgOiAxOwogCisJLyoqIElzIGludGVycnVwdCBub3QgaW1wbGVtZW50ZWQgYnkgZnM/ICovCisJdW5zaWduZWQgbm9faW50ZXJydXB0IDogMTsKKwogCS8qKiBUaGUgbnVtYmVyIG9mIHJlcXVlc3RzIHdhaXRpbmcgZm9yIGNvbXBsZXRpb24gKi8KIAlhdG9taWNfdCBudW1fd2FpdGluZzsKIApAQCAtMzIwLDExICszNDUsMjMgQEAKIAkvKiogQmFja2luZyBkZXYgaW5mbyAqLwogCXN0cnVjdCBiYWNraW5nX2Rldl9pbmZvIGJkaTsKIAotCS8qKiBrb2JqZWN0ICovCi0Jc3RydWN0IGtvYmplY3Qga29iajsKKwkvKiogRW50cnkgb24gdGhlIGZ1c2VfY29ubl9saXN0ICovCisJc3RydWN0IGxpc3RfaGVhZCBlbnRyeTsKKworCS8qKiBVbmlxdWUgSUQgKi8KKwl1NjQgaWQ7CisKKwkvKiogRGVudHJpZXMgaW4gdGhlIGNvbnRyb2wgZmlsZXN5c3RlbSAqLworCXN0cnVjdCBkZW50cnkgKmN0bF9kZW50cnlbRlVTRV9DVExfTlVNX0RFTlRSSUVTXTsKKworCS8qKiBudW1iZXIgb2YgZGVudHJpZXMgdXNlZCBpbiB0aGUgYWJvdmUgYXJyYXkgKi8KKwlpbnQgY3RsX25kZW50czsKIAogCS8qKiBPX0FTWU5DIHJlcXVlc3RzICovCiAJc3RydWN0IGZhc3luY19zdHJ1Y3QgKmZhc3luYzsKKworCS8qKiBLZXkgZm9yIGxvY2sgb3duZXIgSUQgc2NyYW1ibGluZyAqLworCXUzMiBzY3JhbWJsZV9rZXlbNF07CiB9OwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBmdXNlX2Nvbm4gKmdldF9mdXNlX2Nvbm5fc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKQEAgLTMzNywxMSArMzc0LDYgQEAKIAlyZXR1cm4gZ2V0X2Z1c2VfY29ubl9zdXBlcihpbm9kZS0+aV9zYik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IGZ1c2VfY29ubiAqZ2V0X2Z1c2VfY29ubl9rb2JqKHN0cnVjdCBrb2JqZWN0ICpvYmopCi17Ci0JcmV0dXJuIGNvbnRhaW5lcl9vZihvYmosIHN0cnVjdCBmdXNlX2Nvbm4sIGtvYmopOwotfQotCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBmdXNlX2lub2RlICpnZXRfZnVzZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewogCXJldHVybiBjb250YWluZXJfb2YoaW5vZGUsIHN0cnVjdCBmdXNlX2lub2RlLCBpbm9kZSk7CkBAIC0zODMsMTIgKzQxNSw5IEBACiB2b2lkIGZ1c2VfZmluaXNoX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCiAJCSAgICAgIHN0cnVjdCBmdXNlX2ZpbGUgKmZmLCBzdHJ1Y3QgZnVzZV9vcGVuX291dCAqb3V0YXJnKTsKIAotLyoqCi0gKiBTZW5kIGEgUkVMRUFTRSByZXF1ZXN0Ci0gKi8KLXZvaWQgZnVzZV9zZW5kX3JlbGVhc2Uoc3RydWN0IGZ1c2VfY29ubiAqZmMsIHN0cnVjdCBmdXNlX2ZpbGUgKmZmLAotCQkgICAgICAgdTY0IG5vZGVpZCwgc3RydWN0IGlub2RlICppbm9kZSwgaW50IGZsYWdzLCBpbnQgaXNkaXIpOwotCisvKiogKi8KK3N0cnVjdCBmdXNlX3JlcSAqZnVzZV9yZWxlYXNlX2ZpbGwoc3RydWN0IGZ1c2VfZmlsZSAqZmYsIHU2NCBub2RlaWQsIGludCBmbGFncywKKwkJCQkgICBpbnQgb3Bjb2RlKTsKIC8qKgogICogU2VuZCBSRUxFQVNFIG9yIFJFTEVBU0VESVIgcmVxdWVzdAogICovCkBAIC00MzUsNiArNDY0LDkgQEAKICAqLwogdm9pZCBmdXNlX2Rldl9jbGVhbnVwKHZvaWQpOwogCitpbnQgZnVzZV9jdGxfaW5pdCh2b2lkKTsKK3ZvaWQgZnVzZV9jdGxfY2xlYW51cCh2b2lkKTsKKwogLyoqCiAgKiBBbGxvY2F0ZSBhIHJlcXVlc3QKICAqLwpAQCAtNDQ2LDE2ICs0NzgsMTYgQEAKIHZvaWQgZnVzZV9yZXF1ZXN0X2ZyZWUoc3RydWN0IGZ1c2VfcmVxICpyZXEpOwogCiAvKioKLSAqIFJlaW5pdGlhbGl6ZSBhIHJlcXVlc3QsIHRoZSBwcmVhbGxvY2F0ZWQgZmxhZyBpcyBsZWZ0IHVubW9kaWZpZWQKLSAqLwotdm9pZCBmdXNlX3Jlc2V0X3JlcXVlc3Qoc3RydWN0IGZ1c2VfcmVxICpyZXEpOwotCi0vKioKLSAqIFJlc2VydmUgYSBwcmVhbGxvY2F0ZWQgcmVxdWVzdAorICogR2V0IGEgcmVxdWVzdCwgbWF5IGZhaWwgd2l0aCAtRU5PTUVNCiAgKi8KIHN0cnVjdCBmdXNlX3JlcSAqZnVzZV9nZXRfcmVxKHN0cnVjdCBmdXNlX2Nvbm4gKmZjKTsKIAogLyoqCisgKiBHZXRzIGEgcmVxdWVzdHMgZm9yIGEgZmlsZSBvcGVyYXRpb24sIGFsd2F5cyBzdWNjZWVkcworICovCitzdHJ1Y3QgZnVzZV9yZXEgKmZ1c2VfZ2V0X3JlcV9ub2ZhaWwoc3RydWN0IGZ1c2VfY29ubiAqZmMsIHN0cnVjdCBmaWxlICpmaWxlKTsKKworLyoqCiAgKiBEZWNyZW1lbnQgcmVmZXJlbmNlIGNvdW50IG9mIGEgcmVxdWVzdC4gIElmIGNvdW50IGdvZXMgdG8gemVybyBmcmVlCiAgKiB0aGUgcmVxdWVzdC4KICAqLwpAQCAtNDc2LDExICs1MDgsNiBAQAogICovCiB2b2lkIHJlcXVlc3Rfc2VuZF9iYWNrZ3JvdW5kKHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCBzdHJ1Y3QgZnVzZV9yZXEgKnJlcSk7CiAKLS8qKgotICogUmVsZWFzZSBpbm9kZXMgYW5kIGZpbGUgYXNzb2NpYXRlZCB3aXRoIGJhY2tncm91bmQgcmVxdWVzdAotICovCi12b2lkIGZ1c2VfcmVsZWFzZV9iYWNrZ3JvdW5kKHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCBzdHJ1Y3QgZnVzZV9yZXEgKnJlcSk7Ci0KIC8qIEFib3J0IGFsbCByZXF1ZXN0cyAqLwogdm9pZCBmdXNlX2Fib3J0X2Nvbm4oc3RydWN0IGZ1c2VfY29ubiAqZmMpOwogCkBAIC00OTMsMyArNTIwLDIzIEBACiAgKiBJbnZhbGlkYXRlIGlub2RlIGF0dHJpYnV0ZXMKICAqLwogdm9pZCBmdXNlX2ludmFsaWRhdGVfYXR0cihzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKKworLyoqCisgKiBBY3F1aXJlIHJlZmVyZW5jZSB0byBmdXNlX2Nvbm4KKyAqLworc3RydWN0IGZ1c2VfY29ubiAqZnVzZV9jb25uX2dldChzdHJ1Y3QgZnVzZV9jb25uICpmYyk7CisKKy8qKgorICogUmVsZWFzZSByZWZlcmVuY2UgdG8gZnVzZV9jb25uCisgKi8KK3ZvaWQgZnVzZV9jb25uX3B1dChzdHJ1Y3QgZnVzZV9jb25uICpmYyk7CisKKy8qKgorICogQWRkIGNvbm5lY3Rpb24gdG8gY29udHJvbCBmaWxlc3lzdGVtCisgKi8KK2ludCBmdXNlX2N0bF9hZGRfY29ubihzdHJ1Y3QgZnVzZV9jb25uICpmYyk7CisKKy8qKgorICogUmVtb3ZlIGNvbm5lY3Rpb24gZnJvbSBjb250cm9sIGZpbGVzeXN0ZW0KKyAqLwordm9pZCBmdXNlX2N0bF9yZW1vdmVfY29ubihzdHJ1Y3QgZnVzZV9jb25uICpmYyk7CmRpZmYgLS1naXQgYS9mcy9mdXNlL2lub2RlLmMgYi9mcy9mdXNlL2lub2RlLmMKaW5kZXggYTEzYzBmNS4uZGNhYWFiZCAxMDA2NDQKLS0tIGEvZnMvZnVzZS9pbm9kZS5jCisrKyBiL2ZzL2Z1c2UvaW5vZGUuYwpAQCAtMTEsMjUgKzExLDIwIEBACiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9maWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW91bnQuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wYXJzZXIuaD4KICNpbmNsdWRlIDxsaW51eC9zdGF0ZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KIAogTU9EVUxFX0FVVEhPUigiTWlrbG9zIFN6ZXJlZGkgPG1pa2xvc0BzemVyZWRpLmh1PiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJGaWxlc3lzdGVtIGluIFVzZXJzcGFjZSIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCiBzdGF0aWMga21lbV9jYWNoZV90ICpmdXNlX2lub2RlX2NhY2hlcDsKLXN0YXRpYyBzdHJ1Y3Qgc3Vic3lzdGVtIGNvbm5lY3Rpb25zX3N1YnN5czsKLQotc3RydWN0IGZ1c2VfY29ubl9hdHRyIHsKLQlzdHJ1Y3QgYXR0cmlidXRlIGF0dHI7Ci0Jc3NpemVfdCAoKnNob3cpKHN0cnVjdCBmdXNlX2Nvbm4gKiwgY2hhciAqKTsKLQlzc2l6ZV90ICgqc3RvcmUpKHN0cnVjdCBmdXNlX2Nvbm4gKiwgY29uc3QgY2hhciAqLCBzaXplX3QpOwotfTsKK3N0cnVjdCBsaXN0X2hlYWQgZnVzZV9jb25uX2xpc3Q7CitERUZJTkVfTVVURVgoZnVzZV9tdXRleCk7CiAKICNkZWZpbmUgRlVTRV9TVVBFUl9NQUdJQyAweDY1NzM1NTQ2CiAKQEAgLTEwNCw2ICs5OSwxNCBAQAogCX0KIH0KIAorc3RhdGljIGludCBmdXNlX3JlbW91bnRfZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50ICpmbGFncywgY2hhciAqZGF0YSkKK3sKKwlpZiAoKmZsYWdzICYgTVNfTUFORExPQ0spCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIDA7Cit9CisKIHZvaWQgZnVzZV9jaGFuZ2VfYXR0cmlidXRlcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZnVzZV9hdHRyICphdHRyKQogewogCWlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpICYmIGlfc2l6ZV9yZWFkKGlub2RlKSAhPSBhdHRyLT5zaXplKQpAQCAtMTk1LDMxICsxOTgsMjkgQEAKIAlyZXR1cm4gaW5vZGU7CiB9CiAKLXN0YXRpYyB2b2lkIGZ1c2VfdW1vdW50X2JlZ2luKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCitzdGF0aWMgdm9pZCBmdXNlX3Vtb3VudF9iZWdpbihzdHJ1Y3QgdmZzbW91bnQgKnZmc21udCwgaW50IGZsYWdzKQogewotCWZ1c2VfYWJvcnRfY29ubihnZXRfZnVzZV9jb25uX3N1cGVyKHNiKSk7CisJaWYgKGZsYWdzICYgTU5UX0ZPUkNFKQorCQlmdXNlX2Fib3J0X2Nvbm4oZ2V0X2Z1c2VfY29ubl9zdXBlcih2ZnNtbnQtPm1udF9zYikpOwogfQogCiBzdGF0aWMgdm9pZCBmdXNlX3B1dF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewogCXN0cnVjdCBmdXNlX2Nvbm4gKmZjID0gZ2V0X2Z1c2VfY29ubl9zdXBlcihzYik7CiAKLQlkb3duX3dyaXRlKCZmYy0+c2JwdXRfc2VtKTsKLQl3aGlsZSAoIWxpc3RfZW1wdHkoJmZjLT5iYWNrZ3JvdW5kKSkKLQkJZnVzZV9yZWxlYXNlX2JhY2tncm91bmQoZmMsCi0JCQkJCWxpc3RfZW50cnkoZmMtPmJhY2tncm91bmQubmV4dCwKLQkJCQkJCSAgIHN0cnVjdCBmdXNlX3JlcSwgYmdfZW50cnkpKTsKLQogCXNwaW5fbG9jaygmZmMtPmxvY2spOwotCWZjLT5tb3VudGVkID0gMDsKIAlmYy0+Y29ubmVjdGVkID0gMDsKKwlmYy0+YmxvY2tlZCA9IDA7CiAJc3Bpbl91bmxvY2soJmZjLT5sb2NrKTsKLQl1cF93cml0ZSgmZmMtPnNicHV0X3NlbSk7CiAJLyogRmx1c2ggYWxsIHJlYWRlcnMgb24gdGhpcyBmcyAqLwogCWtpbGxfZmFzeW5jKCZmYy0+ZmFzeW5jLCBTSUdJTywgUE9MTF9JTik7CiAJd2FrZV91cF9hbGwoJmZjLT53YWl0cSk7Ci0Ja29iamVjdF9kZWwoJmZjLT5rb2JqKTsKLQlrb2JqZWN0X3B1dCgmZmMtPmtvYmopOworCXdha2VfdXBfYWxsKCZmYy0+YmxvY2tlZF93YWl0cSk7CisJbXV0ZXhfbG9jaygmZnVzZV9tdXRleCk7CisJbGlzdF9kZWwoJmZjLT5lbnRyeSk7CisJZnVzZV9jdGxfcmVtb3ZlX2Nvbm4oZmMpOworCW11dGV4X3VubG9jaygmZnVzZV9tdXRleCk7CisJZnVzZV9jb25uX3B1dChmYyk7CiB9CiAKIHN0YXRpYyB2b2lkIGNvbnZlcnRfZnVzZV9zdGF0ZnMoc3RydWN0IGtzdGF0ZnMgKnN0YnVmLCBzdHJ1Y3QgZnVzZV9rc3RhdGZzICphdHRyKQpAQCAtMzY5LDExICszNzAsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBmdXNlX2Nvbm5fcmVsZWFzZShzdHJ1Y3Qga29iamVjdCAqa29iaikKLXsKLQlrZnJlZShnZXRfZnVzZV9jb25uX2tvYmooa29iaikpOwotfQotCiBzdGF0aWMgc3RydWN0IGZ1c2VfY29ubiAqbmV3X2Nvbm4odm9pZCkKIHsKIAlzdHJ1Y3QgZnVzZV9jb25uICpmYzsKQEAgLTM4MSwyNCArMzc3LDM1IEBACiAJZmMgPSBremFsbG9jKHNpemVvZigqZmMpLCBHRlBfS0VSTkVMKTsKIAlpZiAoZmMpIHsKIAkJc3Bpbl9sb2NrX2luaXQoJmZjLT5sb2NrKTsKKwkJYXRvbWljX3NldCgmZmMtPmNvdW50LCAxKTsKIAkJaW5pdF93YWl0cXVldWVfaGVhZCgmZmMtPndhaXRxKTsKIAkJaW5pdF93YWl0cXVldWVfaGVhZCgmZmMtPmJsb2NrZWRfd2FpdHEpOwogCQlJTklUX0xJU1RfSEVBRCgmZmMtPnBlbmRpbmcpOwogCQlJTklUX0xJU1RfSEVBRCgmZmMtPnByb2Nlc3NpbmcpOwogCQlJTklUX0xJU1RfSEVBRCgmZmMtPmlvKTsKLQkJSU5JVF9MSVNUX0hFQUQoJmZjLT5iYWNrZ3JvdW5kKTsKLQkJaW5pdF9yd3NlbSgmZmMtPnNicHV0X3NlbSk7Ci0JCWtvYmpfc2V0X2tzZXRfcyhmYywgY29ubmVjdGlvbnNfc3Vic3lzKTsKLQkJa29iamVjdF9pbml0KCZmYy0+a29iaik7CisJCUlOSVRfTElTVF9IRUFEKCZmYy0+aW50ZXJydXB0cyk7CiAJCWF0b21pY19zZXQoJmZjLT5udW1fd2FpdGluZywgMCk7CiAJCWZjLT5iZGkucmFfcGFnZXMgPSAoVk1fTUFYX1JFQURBSEVBRCAqIDEwMjQpIC8gUEFHRV9DQUNIRV9TSVpFOwogCQlmYy0+YmRpLnVucGx1Z19pb19mbiA9IGRlZmF1bHRfdW5wbHVnX2lvX2ZuOwogCQlmYy0+cmVxY3RyID0gMDsKIAkJZmMtPmJsb2NrZWQgPSAxOworCQlnZXRfcmFuZG9tX2J5dGVzKCZmYy0+c2NyYW1ibGVfa2V5LCBzaXplb2YoZmMtPnNjcmFtYmxlX2tleSkpOwogCX0KIAlyZXR1cm4gZmM7CiB9CiAKK3ZvaWQgZnVzZV9jb25uX3B1dChzdHJ1Y3QgZnVzZV9jb25uICpmYykKK3sKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmZmMtPmNvdW50KSkKKwkJa2ZyZWUoZmMpOworfQorCitzdHJ1Y3QgZnVzZV9jb25uICpmdXNlX2Nvbm5fZ2V0KHN0cnVjdCBmdXNlX2Nvbm4gKmZjKQoreworCWF0b21pY19pbmMoJmZjLT5jb3VudCk7CisJcmV0dXJuIGZjOworfQorCiBzdGF0aWMgc3RydWN0IGlub2RlICpnZXRfcm9vdF9pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1bnNpZ25lZCBtb2RlKQogewogCXN0cnVjdCBmdXNlX2F0dHIgYXR0cjsKQEAgLTQxNCw2ICs0MjEsNyBAQAogCS5kZXN0cm95X2lub2RlICA9IGZ1c2VfZGVzdHJveV9pbm9kZSwKIAkucmVhZF9pbm9kZQk9IGZ1c2VfcmVhZF9pbm9kZSwKIAkuY2xlYXJfaW5vZGUJPSBmdXNlX2NsZWFyX2lub2RlLAorCS5yZW1vdW50X2ZzCT0gZnVzZV9yZW1vdW50X2ZzLAogCS5wdXRfc3VwZXIJPSBmdXNlX3B1dF9zdXBlciwKIAkudW1vdW50X2JlZ2luCT0gZnVzZV91bW91bnRfYmVnaW4sCiAJLnN0YXRmcwkJPSBmdXNlX3N0YXRmcywKQEAgLTQzMyw4ICs0NDEsMTIgQEAKIAkJCXJhX3BhZ2VzID0gYXJnLT5tYXhfcmVhZGFoZWFkIC8gUEFHRV9DQUNIRV9TSVpFOwogCQkJaWYgKGFyZy0+ZmxhZ3MgJiBGVVNFX0FTWU5DX1JFQUQpCiAJCQkJZmMtPmFzeW5jX3JlYWQgPSAxOwotCQl9IGVsc2UKKwkJCWlmICghKGFyZy0+ZmxhZ3MgJiBGVVNFX1BPU0lYX0xPQ0tTKSkKKwkJCQlmYy0+bm9fbG9jayA9IDE7CisJCX0gZWxzZSB7CiAJCQlyYV9wYWdlcyA9IGZjLT5tYXhfcmVhZCAvIFBBR0VfQ0FDSEVfU0laRTsKKwkJCWZjLT5ub19sb2NrID0gMTsKKwkJfQogCiAJCWZjLT5iZGkucmFfcGFnZXMgPSBtaW4oZmMtPmJkaS5yYV9wYWdlcywgcmFfcGFnZXMpOwogCQlmYy0+bWlub3IgPSBhcmctPm1pbm9yOwpAQCAtNDUyLDcgKzQ2NCw3IEBACiAJYXJnLT5tYWpvciA9IEZVU0VfS0VSTkVMX1ZFUlNJT047CiAJYXJnLT5taW5vciA9IEZVU0VfS0VSTkVMX01JTk9SX1ZFUlNJT047CiAJYXJnLT5tYXhfcmVhZGFoZWFkID0gZmMtPmJkaS5yYV9wYWdlcyAqIFBBR0VfQ0FDSEVfU0laRTsKLQlhcmctPmZsYWdzIHw9IEZVU0VfQVNZTkNfUkVBRDsKKwlhcmctPmZsYWdzIHw9IEZVU0VfQVNZTkNfUkVBRCB8IEZVU0VfUE9TSVhfTE9DS1M7CiAJcmVxLT5pbi5oLm9wY29kZSA9IEZVU0VfSU5JVDsKIAlyZXEtPmluLm51bWFyZ3MgPSAxOwogCXJlcS0+aW4uYXJnc1swXS5zaXplID0gc2l6ZW9mKCphcmcpOwpAQCAtNDY4LDEwICs0ODAsOSBAQAogCXJlcXVlc3Rfc2VuZF9iYWNrZ3JvdW5kKGZjLCByZXEpOwogfQogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIGNvbm5faWQodm9pZCkKK3N0YXRpYyB1NjQgY29ubl9pZCh2b2lkKQogewotCS8qIEJLTCBpcyBoZWxkIGZvciAtPmdldF9zYigpICovCi0Jc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyBjdHIgPSAxOworCXN0YXRpYyB1NjQgY3RyID0gMTsKIAlyZXR1cm4gY3RyKys7CiB9CiAKQEAgLTQ4NSw2ICs0OTYsOSBAQAogCXN0cnVjdCBmdXNlX3JlcSAqaW5pdF9yZXE7CiAJaW50IGVycjsKIAorCWlmIChzYi0+c19mbGFncyAmIE1TX01BTkRMT0NLKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCWlmICghcGFyc2VfZnVzZV9vcHQoKGNoYXIgKikgZGF0YSwgJmQpKQogCQlyZXR1cm4gLUVJTlZBTDsKIApAQCAtNTI4LDI1ICs1NDIsMjEgQEAKIAlpZiAoIWluaXRfcmVxKQogCQlnb3RvIGVycl9wdXRfcm9vdDsKIAotCWVyciA9IGtvYmplY3Rfc2V0X25hbWUoJmZjLT5rb2JqLCAiJWxsdSIsIGNvbm5faWQoKSk7Ci0JaWYgKGVycikKLQkJZ290byBlcnJfZnJlZV9yZXE7Ci0KLQllcnIgPSBrb2JqZWN0X2FkZCgmZmMtPmtvYmopOwotCWlmIChlcnIpCi0JCWdvdG8gZXJyX2ZyZWVfcmVxOwotCi0JLyogU2V0dGluZyBmaWxlLT5wcml2YXRlX2RhdGEgY2FuJ3QgcmFjZSB3aXRoIG90aGVyIG1vdW50KCkKLQkgICBpbnN0YW5jZXMsIHNpbmNlIEJLTCBpcyBoZWxkIGZvciAtPmdldF9zYigpICovCisJbXV0ZXhfbG9jaygmZnVzZV9tdXRleCk7CiAJZXJyID0gLUVJTlZBTDsKIAlpZiAoZmlsZS0+cHJpdmF0ZV9kYXRhKQotCQlnb3RvIGVycl9rb2JqZWN0X2RlbDsKKwkJZ290byBlcnJfdW5sb2NrOwogCisJZmMtPmlkID0gY29ubl9pZCgpOworCWVyciA9IGZ1c2VfY3RsX2FkZF9jb25uKGZjKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl91bmxvY2s7CisKKwlsaXN0X2FkZF90YWlsKCZmYy0+ZW50cnksICZmdXNlX2Nvbm5fbGlzdCk7CiAJc2ItPnNfcm9vdCA9IHJvb3RfZGVudHJ5OwotCWZjLT5tb3VudGVkID0gMTsKIAlmYy0+Y29ubmVjdGVkID0gMTsKLQlrb2JqZWN0X2dldCgmZmMtPmtvYmopOwotCWZpbGUtPnByaXZhdGVfZGF0YSA9IGZjOworCWZpbGUtPnByaXZhdGVfZGF0YSA9IGZ1c2VfY29ubl9nZXQoZmMpOworCW11dGV4X3VubG9jaygmZnVzZV9tdXRleCk7CiAJLyoKIAkgKiBhdG9taWNfZGVjX2FuZF90ZXN0KCkgaW4gZnB1dCgpIHByb3ZpZGVzIHRoZSBuZWNlc3NhcnkKIAkgKiBtZW1vcnkgYmFycmllciBmb3IgZmlsZS0+cHJpdmF0ZV9kYXRhIHRvIGJlIHZpc2libGUgb24gYWxsCkBAIC01NTgsMTUgKzU2OCwxNCBAQAogCiAJcmV0dXJuIDA7CiAKLSBlcnJfa29iamVjdF9kZWw6Ci0Ja29iamVjdF9kZWwoJmZjLT5rb2JqKTsKLSBlcnJfZnJlZV9yZXE6CisgZXJyX3VubG9jazoKKwltdXRleF91bmxvY2soJmZ1c2VfbXV0ZXgpOwogCWZ1c2VfcmVxdWVzdF9mcmVlKGluaXRfcmVxKTsKICBlcnJfcHV0X3Jvb3Q6CiAJZHB1dChyb290X2RlbnRyeSk7CiAgZXJyOgogCWZwdXQoZmlsZSk7Ci0Ja29iamVjdF9wdXQoJmZjLT5rb2JqKTsKKwlmdXNlX2Nvbm5fcHV0KGZjKTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC01ODQsNjggKzU5Myw4IEBACiAJLmtpbGxfc2IJPSBraWxsX2Fub25fc3VwZXIsCiB9OwogCi1zdGF0aWMgc3NpemVfdCBmdXNlX2Nvbm5fd2FpdGluZ19zaG93KHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCBjaGFyICpwYWdlKQotewotCXJldHVybiBzcHJpbnRmKHBhZ2UsICIlaVxuIiwgYXRvbWljX3JlYWQoJmZjLT5udW1fd2FpdGluZykpOwotfQotCi1zdGF0aWMgc3NpemVfdCBmdXNlX2Nvbm5fYWJvcnRfc3RvcmUoc3RydWN0IGZ1c2VfY29ubiAqZmMsIGNvbnN0IGNoYXIgKnBhZ2UsCi0JCQkJICAgICBzaXplX3QgY291bnQpCi17Ci0JZnVzZV9hYm9ydF9jb25uKGZjKTsKLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZnVzZV9jb25uX2F0dHIgZnVzZV9jb25uX3dhaXRpbmcgPQotCV9fQVRUUih3YWl0aW5nLCAwNDAwLCBmdXNlX2Nvbm5fd2FpdGluZ19zaG93LCBOVUxMKTsKLXN0YXRpYyBzdHJ1Y3QgZnVzZV9jb25uX2F0dHIgZnVzZV9jb25uX2Fib3J0ID0KLQlfX0FUVFIoYWJvcnQsIDA2MDAsIE5VTEwsIGZ1c2VfY29ubl9hYm9ydF9zdG9yZSk7Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpmdXNlX2Nvbm5fYXR0cnNbXSA9IHsKLQkmZnVzZV9jb25uX3dhaXRpbmcuYXR0ciwKLQkmZnVzZV9jb25uX2Fib3J0LmF0dHIsCi0JTlVMTCwKLX07Ci0KLXN0YXRpYyBzc2l6ZV90IGZ1c2VfY29ubl9hdHRyX3Nob3coc3RydWN0IGtvYmplY3QgKmtvYmosCi0JCQkJICAgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwKLQkJCQkgICBjaGFyICpwYWdlKQotewotCXN0cnVjdCBmdXNlX2Nvbm5fYXR0ciAqZmNhID0KLQkJY29udGFpbmVyX29mKGF0dHIsIHN0cnVjdCBmdXNlX2Nvbm5fYXR0ciwgYXR0cik7Ci0KLQlpZiAoZmNhLT5zaG93KQotCQlyZXR1cm4gZmNhLT5zaG93KGdldF9mdXNlX2Nvbm5fa29iaihrb2JqKSwgcGFnZSk7Ci0JZWxzZQotCQlyZXR1cm4gLUVBQ0NFUzsKLX0KLQotc3RhdGljIHNzaXplX3QgZnVzZV9jb25uX2F0dHJfc3RvcmUoc3RydWN0IGtvYmplY3QgKmtvYmosCi0JCQkJICAgIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsCi0JCQkJICAgIGNvbnN0IGNoYXIgKnBhZ2UsIHNpemVfdCBjb3VudCkKLXsKLQlzdHJ1Y3QgZnVzZV9jb25uX2F0dHIgKmZjYSA9Ci0JCWNvbnRhaW5lcl9vZihhdHRyLCBzdHJ1Y3QgZnVzZV9jb25uX2F0dHIsIGF0dHIpOwotCi0JaWYgKGZjYS0+c3RvcmUpCi0JCXJldHVybiBmY2EtPnN0b3JlKGdldF9mdXNlX2Nvbm5fa29iaihrb2JqKSwgcGFnZSwgY291bnQpOwotCWVsc2UKLQkJcmV0dXJuIC1FQUNDRVM7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc3lzZnNfb3BzIGZ1c2VfY29ubl9zeXNmc19vcHMgPSB7Ci0JLnNob3cJPSAmZnVzZV9jb25uX2F0dHJfc2hvdywKLQkuc3RvcmUJPSAmZnVzZV9jb25uX2F0dHJfc3RvcmUsCi19OwotCi1zdGF0aWMgc3RydWN0IGtvYmpfdHlwZSBrdHlwZV9mdXNlX2Nvbm4gPSB7Ci0JLnJlbGVhc2UJPSBmdXNlX2Nvbm5fcmVsZWFzZSwKLQkuc3lzZnNfb3BzCT0gJmZ1c2VfY29ubl9zeXNmc19vcHMsCi0JLmRlZmF1bHRfYXR0cnMJPSBmdXNlX2Nvbm5fYXR0cnMsCi19OwotCiBzdGF0aWMgZGVjbF9zdWJzeXMoZnVzZSwgTlVMTCwgTlVMTCk7Ci1zdGF0aWMgZGVjbF9zdWJzeXMoY29ubmVjdGlvbnMsICZrdHlwZV9mdXNlX2Nvbm4sIE5VTEwpOworc3RhdGljIGRlY2xfc3Vic3lzKGNvbm5lY3Rpb25zLCBOVUxMLCBOVUxMKTsKIAogc3RhdGljIHZvaWQgZnVzZV9pbm9kZV9pbml0X29uY2Uodm9pZCAqZm9vLCBrbWVtX2NhY2hlX3QgKmNhY2hlcCwKIAkJCQkgdW5zaWduZWQgbG9uZyBmbGFncykKQEAgLTcxOSw2ICs2NjgsNyBAQAogCXByaW50aygiZnVzZSBpbml0IChBUEkgdmVyc2lvbiAlaS4laSlcbiIsCiAJICAgICAgIEZVU0VfS0VSTkVMX1ZFUlNJT04sIEZVU0VfS0VSTkVMX01JTk9SX1ZFUlNJT04pOwogCisJSU5JVF9MSVNUX0hFQUQoJmZ1c2VfY29ubl9saXN0KTsKIAlyZXMgPSBmdXNlX2ZzX2luaXQoKTsKIAlpZiAocmVzKQogCQlnb3RvIGVycjsKQEAgLTczMSw4ICs2ODEsMTQgQEAKIAlpZiAocmVzKQogCQlnb3RvIGVycl9kZXZfY2xlYW51cDsKIAorCXJlcyA9IGZ1c2VfY3RsX2luaXQoKTsKKwlpZiAocmVzKQorCQlnb3RvIGVycl9zeXNmc19jbGVhbnVwOworCiAJcmV0dXJuIDA7CiAKKyBlcnJfc3lzZnNfY2xlYW51cDoKKwlmdXNlX3N5c2ZzX2NsZWFudXAoKTsKICBlcnJfZGV2X2NsZWFudXA6CiAJZnVzZV9kZXZfY2xlYW51cCgpOwogIGVycl9mc19jbGVhbnVwOgpAQCAtNzQ1LDYgKzcwMSw3IEBACiB7CiAJcHJpbnRrKEtFUk5fREVCVUcgImZ1c2UgZXhpdFxuIik7CiAKKwlmdXNlX2N0bF9jbGVhbnVwKCk7CiAJZnVzZV9zeXNmc19jbGVhbnVwKCk7CiAJZnVzZV9mc19jbGVhbnVwKCk7CiAJZnVzZV9kZXZfY2xlYW51cCgpOwpkaWZmIC0tZ2l0IGEvZnMvamJkL3JlY292ZXJ5LmMgYi9mcy9qYmQvcmVjb3ZlcnkuYwppbmRleCA4MGQ3ZjUzLi5kZTViYWZiIDEwMDY0NAotLS0gYS9mcy9qYmQvcmVjb3ZlcnkuYworKysgYi9mcy9qYmQvcmVjb3ZlcnkuYwpAQCAtNTMxLDYgKzUzMSw3IEBACiAJCWRlZmF1bHQ6CiAJCQlqYmRfZGVidWcoMywgIlVucmVjb2duaXNlZCBtYWdpYyAlZCwgZW5kIG9mIHNjYW4uXG4iLAogCQkJCSAgYmxvY2t0eXBlKTsKKwkJCWJyZWxzZShiaCk7CiAJCQlnb3RvIGRvbmU7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9mcy9qZmZzMi9lcmFzZS5jIGIvZnMvamZmczIvZXJhc2UuYwppbmRleCAxODYyZThiLi5iODg4NmYwIDEwMDY0NAotLS0gYS9mcy9qZmZzMi9lcmFzZS5jCisrKyBiL2ZzL2pmZnMyL2VyYXNlLmMKQEAgLTUzLDggKzUzLDcgQEAKIAlpZiAoIWluc3RyKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgImttYWxsb2MgZm9yIHN0cnVjdCBlcmFzZV9pbmZvIGluIGpmZnMyX2VyYXNlX2Jsb2NrIGZhaWxlZC4gUmVmaWxpbmcgYmxvY2sgZm9yIGxhdGVyXG4iKTsKIAkJc3Bpbl9sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOwotCQlsaXN0X2RlbCgmamViLT5saXN0KTsKLQkJbGlzdF9hZGQoJmplYi0+bGlzdCwgJmMtPmVyYXNlX3BlbmRpbmdfbGlzdCk7CisJCWxpc3RfbW92ZSgmamViLT5saXN0LCAmYy0+ZXJhc2VfcGVuZGluZ19saXN0KTsKIAkJYy0+ZXJhc2luZ19zaXplIC09IGMtPnNlY3Rvcl9zaXplOwogCQljLT5kaXJ0eV9zaXplICs9IGMtPnNlY3Rvcl9zaXplOwogCQlqZWItPmRpcnR5X3NpemUgPSBjLT5zZWN0b3Jfc2l6ZTsKQEAgLTg2LDggKzg1LDcgQEAKIAkJLyogRXJhc2UgZmFpbGVkIGltbWVkaWF0ZWx5LiBSZWZpbGUgaXQgb24gdGhlIGxpc3QgKi8KIAkJRDEocHJpbnRrKEtFUk5fREVCVUcgIkVyYXNlIGF0IDB4JTA4eCBmYWlsZWQ6ICVkLiBSZWZpbGluZyBvbiBlcmFzZV9wZW5kaW5nX2xpc3RcbiIsIGplYi0+b2Zmc2V0LCByZXQpKTsKIAkJc3Bpbl9sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOwotCQlsaXN0X2RlbCgmamViLT5saXN0KTsKLQkJbGlzdF9hZGQoJmplYi0+bGlzdCwgJmMtPmVyYXNlX3BlbmRpbmdfbGlzdCk7CisJCWxpc3RfbW92ZSgmamViLT5saXN0LCAmYy0+ZXJhc2VfcGVuZGluZ19saXN0KTsKIAkJYy0+ZXJhc2luZ19zaXplIC09IGMtPnNlY3Rvcl9zaXplOwogCQljLT5kaXJ0eV9zaXplICs9IGMtPnNlY3Rvcl9zaXplOwogCQlqZWItPmRpcnR5X3NpemUgPSBjLT5zZWN0b3Jfc2l6ZTsKQEAgLTE2MSw4ICsxNTksNyBAQAogewogCUQxKHByaW50ayhLRVJOX0RFQlVHICJFcmFzZSBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IGF0IDB4JTA4eFxuIiwgamViLT5vZmZzZXQpKTsKIAlzcGluX2xvY2soJmMtPmVyYXNlX2NvbXBsZXRpb25fbG9jayk7Ci0JbGlzdF9kZWwoJmplYi0+bGlzdCk7Ci0JbGlzdF9hZGRfdGFpbCgmamViLT5saXN0LCAmYy0+ZXJhc2VfY29tcGxldGVfbGlzdCk7CisJbGlzdF9tb3ZlX3RhaWwoJmplYi0+bGlzdCwgJmMtPmVyYXNlX2NvbXBsZXRlX2xpc3QpOwogCXNwaW5fdW5sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOwogCS8qIEVuc3VyZSB0aGF0IGt1cGRhdGVkIGNhbGxzIHVzIGFnYWluIHRvIG1hcmsgdGhlbSBjbGVhbiAqLwogCWpmZnMyX2VyYXNlX3BlbmRpbmdfdHJpZ2dlcihjKTsKQEAgLTE3OCw4ICsxNzUsNyBAQAogCQlpZiAoIWpmZnMyX3dyaXRlX25hbmRfYmFkYmxvY2soYywgamViLCBiYWRfb2Zmc2V0KSkgewogCQkJLyogV2UnZCBsaWtlIHRvIGdpdmUgdGhpcyBibG9jayBhbm90aGVyIHRyeS4gKi8KIAkJCXNwaW5fbG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKLQkJCWxpc3RfZGVsKCZqZWItPmxpc3QpOwotCQkJbGlzdF9hZGQoJmplYi0+bGlzdCwgJmMtPmVyYXNlX3BlbmRpbmdfbGlzdCk7CisJCQlsaXN0X21vdmUoJmplYi0+bGlzdCwgJmMtPmVyYXNlX3BlbmRpbmdfbGlzdCk7CiAJCQljLT5lcmFzaW5nX3NpemUgLT0gYy0+c2VjdG9yX3NpemU7CiAJCQljLT5kaXJ0eV9zaXplICs9IGMtPnNlY3Rvcl9zaXplOwogCQkJamViLT5kaXJ0eV9zaXplID0gYy0+c2VjdG9yX3NpemU7CkBAIC0xOTEsOCArMTg3LDcgQEAKIAlzcGluX2xvY2soJmMtPmVyYXNlX2NvbXBsZXRpb25fbG9jayk7CiAJYy0+ZXJhc2luZ19zaXplIC09IGMtPnNlY3Rvcl9zaXplOwogCWMtPmJhZF9zaXplICs9IGMtPnNlY3Rvcl9zaXplOwotCWxpc3RfZGVsKCZqZWItPmxpc3QpOwotCWxpc3RfYWRkKCZqZWItPmxpc3QsICZjLT5iYWRfbGlzdCk7CisJbGlzdF9tb3ZlKCZqZWItPmxpc3QsICZjLT5iYWRfbGlzdCk7CiAJYy0+bnJfZXJhc2luZ19ibG9ja3MtLTsKIAlzcGluX3VubG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKIAl3YWtlX3VwKCZjLT5lcmFzZV93YWl0KTsKZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL25vZGVtZ210LmMgYi9mcy9qZmZzMi9ub2RlbWdtdC5jCmluZGV4IDhiZWRmZDIuLmFjMGMzNTAgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL25vZGVtZ210LmMKKysrIGIvZnMvamZmczIvbm9kZW1nbXQuYwpAQCAtMjExLDggKzIxMSw3IEBACiAJCQlzdHJ1Y3QgamZmczJfZXJhc2VibG9jayAqZWplYjsKIAogCQkJZWplYiA9IGxpc3RfZW50cnkoYy0+ZXJhc2FibGVfbGlzdC5uZXh0LCBzdHJ1Y3QgamZmczJfZXJhc2VibG9jaywgbGlzdCk7Ci0JCQlsaXN0X2RlbCgmZWplYi0+bGlzdCk7Ci0JCQlsaXN0X2FkZF90YWlsKCZlamViLT5saXN0LCAmYy0+ZXJhc2VfcGVuZGluZ19saXN0KTsKKwkJCWxpc3RfbW92ZV90YWlsKCZlamViLT5saXN0LCAmYy0+ZXJhc2VfcGVuZGluZ19saXN0KTsKIAkJCWMtPm5yX2VyYXNpbmdfYmxvY2tzKys7CiAJCQlqZmZzMl9lcmFzZV9wZW5kaW5nX3RyaWdnZXIoYyk7CiAJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfZmluZF9uZXh0YmxvY2s6IFRyaWdnZXJpbmcgZXJhc2Ugb2YgZXJhc2FibGUgYmxvY2sgYXQgMHglMDh4XG4iLApkaWZmIC0tZ2l0IGEvZnMvamZmczIvc3VtbWFyeS5jIGIvZnMvamZmczIvc3VtbWFyeS5jCmluZGV4IDBiMDJmYzcuLmJlMWFjYzMgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL3N1bW1hcnkuYworKysgYi9mcy9qZmZzMi9zdW1tYXJ5LmMKQEAgLTQzLDcgKzQzLDcgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JZGJnX3N1bW1hcnkoInJldHVybmVkIHN1Y2Nlc2Z1bGx5XG4iKTsKKwlkYmdfc3VtbWFyeSgicmV0dXJuZWQgc3VjY2Vzc2Z1bGx5XG4iKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZnMvamZmczIvd2J1Zi5jIGIvZnMvamZmczIvd2J1Zi5jCmluZGV4IGE3ZjE1M2YuLmI5YjcwMDcgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL3didWYuYworKysgYi9mcy9qZmZzMi93YnVmLmMKQEAgLTQ5NSw4ICs0OTUsNyBAQAogCS8qIEZpeCB1cCB0aGUgb3JpZ2luYWwgamViIG5vdyBpdCdzIG9uIHRoZSBiYWRfbGlzdCAqLwogCWlmIChmaXJzdF9yYXcgPT0gamViLT5maXJzdF9ub2RlKSB7CiAJCUQxKHByaW50ayhLRVJOX0RFQlVHICJGYWlsaW5nIGJsb2NrIGF0ICUwOHggaXMgbm93IGVtcHR5LiBNb3ZpbmcgdG8gZXJhc2VfcGVuZGluZ19saXN0XG4iLCBqZWItPm9mZnNldCkpOwotCQlsaXN0X2RlbCgmamViLT5saXN0KTsKLQkJbGlzdF9hZGQoJmplYi0+bGlzdCwgJmMtPmVyYXNlX3BlbmRpbmdfbGlzdCk7CisJCWxpc3RfbW92ZSgmamViLT5saXN0LCAmYy0+ZXJhc2VfcGVuZGluZ19saXN0KTsKIAkJYy0+bnJfZXJhc2luZ19ibG9ja3MrKzsKIAkJamZmczJfZXJhc2VfcGVuZGluZ190cmlnZ2VyKGMpOwogCX0KZGlmZiAtLWdpdCBhL2ZzL2pmcy9qZnNfZXh0ZW50LmMgYi9mcy9qZnMvamZzX2V4dGVudC5jCmluZGV4IDU1NDkzNzguLjRkNTI1OTMgMTAwNjQ0Ci0tLSBhL2ZzL2pmcy9qZnNfZXh0ZW50LmMKKysrIGIvZnMvamZzL2pmc19leHRlbnQuYwpAQCAtMTI2LDcgKzEyNiw3IEBACiAKIAkvKiBhbGxvY2F0ZSB0aGUgZGlzayBibG9ja3MgZm9yIHRoZSBleHRlbnQuICBpbml0aWFsbHksIGV4dEJhbGxvYygpCiAJICogd2lsbCB0cnkgdG8gYWxsb2NhdGUgZGlzayBibG9ja3MgZm9yIHRoZSByZXF1ZXN0ZWQgc2l6ZSAoeGxlbikuIAotCSAqIGlmIHRoaXMgZmFpbHMgKHhsZW4gY29udGlnaW91cyBmcmVlIGJsb2NrcyBub3QgYXZhbGlhYmxlKSwgaXQnbGwKKwkgKiBpZiB0aGlzIGZhaWxzICh4bGVuIGNvbnRpZ3VvdXMgZnJlZSBibG9ja3Mgbm90IGF2YWxpYWJsZSksIGl0J2xsCiAJICogdHJ5IHRvIGFsbG9jYXRlIGEgc21hbGxlciBudW1iZXIgb2YgYmxvY2tzIChwcm9kdWNpbmcgYSBzbWFsbGVyCiAJICogZXh0ZW50KSwgd2l0aCB0aGlzIHNtYWxsZXIgbnVtYmVyIG9mIGJsb2NrcyBjb25zaXN0aW5nIG9mIHRoZQogCSAqIHJlcXVlc3RlZCBudW1iZXIgb2YgYmxvY2tzIHJvdW5kZWQgZG93biB0byB0aGUgbmV4dCBzbWFsbGVyCkBAIC00OTMsNyArNDkzLDcgQEAKICAqCiAgKgkJaW5pdGlhbGx5LCB3ZSB3aWxsIHRyeSB0byBhbGxvY2F0ZSBkaXNrIGJsb2NrcyBmb3IgdGhlCiAgKgkJcmVxdWVzdGVkIHNpemUgKG5ibG9ja3MpLiAgaWYgdGhpcyBmYWlscyAobmJsb2NrcyAKLSAqCQljb250aWdpb3VzIGZyZWUgYmxvY2tzIG5vdCBhdmFsaWFibGUpLCB3ZSdsbCB0cnkgdG8gYWxsb2NhdGUKKyAqCQljb250aWd1b3VzIGZyZWUgYmxvY2tzIG5vdCBhdmFsaWFibGUpLCB3ZSdsbCB0cnkgdG8gYWxsb2NhdGUKICAqCQlhIHNtYWxsZXIgbnVtYmVyIG9mIGJsb2NrcyAocHJvZHVjaW5nIGEgc21hbGxlciBleHRlbnQpLCB3aXRoCiAgKgkJdGhpcyBzbWFsbGVyIG51bWJlciBvZiBibG9ja3MgY29uc2lzdGluZyBvZiB0aGUgcmVxdWVzdGVkCiAgKgkJbnVtYmVyIG9mIGJsb2NrcyByb3VuZGVkIGRvd24gdG8gdGhlIG5leHQgc21hbGxlciBwb3dlciBvZiAyCkBAIC01MjksNyArNTI5LDcgQEAKIAogCS8qIGdldCB0aGUgbnVtYmVyIG9mIGJsb2NrcyB0byBpbml0aWFsbHkgYXR0ZW1wdCB0byBhbGxvY2F0ZS4KIAkgKiB3ZSdsbCBmaXJzdCB0cnkgdGhlIG51bWJlciBvZiBibG9ja3MgcmVxdWVzdGVkIHVubGVzcyB0aGlzCi0JICogbnVtYmVyIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbWF4aW11bSBudW1iZXIgb2YgY29udGlnaW91cyBmcmVlCisJICogbnVtYmVyIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbWF4aW11bSBudW1iZXIgb2YgY29udGlndW91cyBmcmVlCiAJICogYmxvY2tzIGluIHRoZSBtYXAuIGluIHRoYXQgY2FzZSwgd2UnbGwgc3RhcnQgb2ZmIHdpdGggdGhlIAogCSAqIG1heGltdW0gZnJlZS4KIAkgKi8KQEAgLTU4Niw3ICs1ODYsNyBAQAogICoJCWluIHBsYWNlLiAgaWYgdGhpcyBmYWlscywgd2UnbGwgdHJ5IHRvIG1vdmUgdGhlIGV4dGVudAogICoJCXRvIGEgbmV3IHNldCBvZiBibG9ja3MuIGlmIG1vdmluZyB0aGUgZXh0ZW50LCB3ZSBpbml0aWFsbHkKICAqCQl3aWxsIHRyeSB0byBhbGxvY2F0ZSBkaXNrIGJsb2NrcyBmb3IgdGhlIHJlcXVlc3RlZCBzaXplCi0gKgkJKG5uZXcpLiAgaWYgdGhpcyBmYWlscyAJKG5uZXcgY29udGlnaW91cyBmcmVlIGJsb2NrcyBub3QKKyAqCQkobm5ldykuICBpZiB0aGlzIGZhaWxzIAkobmV3IGNvbnRpZ3VvdXMgZnJlZSBibG9ja3Mgbm90CiAgKgkJYXZhbGlhYmxlKSwgd2UnbGwgdHJ5ICB0byBhbGxvY2F0ZSBhIHNtYWxsZXIgbnVtYmVyIG9mCiAgKgkJYmxvY2tzIChwcm9kdWNpbmcgYSBzbWFsbGVyIGV4dGVudCksIHdpdGggdGhpcyBzbWFsbGVyCiAgKgkJbnVtYmVyIG9mIGJsb2NrcyBjb25zaXN0aW5nIG9mIHRoZSByZXF1ZXN0ZWQgbnVtYmVyIG9mCmRpZmYgLS1naXQgYS9mcy9saWJmcy5jIGIvZnMvbGliZnMuYwppbmRleCAxYjExNTYzLi5hYzAyZWE2IDEwMDY0NAotLS0gYS9mcy9saWJmcy5jCisrKyBiL2ZzL2xpYmZzLmMKQEAgLTE0OSwxMCArMTQ5LDkgQEAKIAkJCS8qIGZhbGx0aHJvdWdoICovCiAJCWRlZmF1bHQ6CiAJCQlzcGluX2xvY2soJmRjYWNoZV9sb2NrKTsKLQkJCWlmIChmaWxwLT5mX3BvcyA9PSAyKSB7Ci0JCQkJbGlzdF9kZWwocSk7Ci0JCQkJbGlzdF9hZGQocSwgJmRlbnRyeS0+ZF9zdWJkaXJzKTsKLQkJCX0KKwkJCWlmIChmaWxwLT5mX3BvcyA9PSAyKQorCQkJCWxpc3RfbW92ZShxLCAmZGVudHJ5LT5kX3N1YmRpcnMpOworCiAJCQlmb3IgKHA9cS0+bmV4dDsgcCAhPSAmZGVudHJ5LT5kX3N1YmRpcnM7IHA9cC0+bmV4dCkgewogCQkJCXN0cnVjdCBkZW50cnkgKm5leHQ7CiAJCQkJbmV4dCA9IGxpc3RfZW50cnkocCwgc3RydWN0IGRlbnRyeSwgZF91LmRfY2hpbGQpOwpAQCAtMTY0LDggKzE2Myw3IEBACiAJCQkJCXJldHVybiAwOwogCQkJCXNwaW5fbG9jaygmZGNhY2hlX2xvY2spOwogCQkJCS8qIG5leHQgaXMgc3RpbGwgYWxpdmUgKi8KLQkJCQlsaXN0X2RlbChxKTsKLQkJCQlsaXN0X2FkZChxLCBwKTsKKwkJCQlsaXN0X21vdmUocSwgcCk7CiAJCQkJcCA9IHE7CiAJCQkJZmlscC0+Zl9wb3MrKzsKIAkJCX0KQEAgLTQyNCwxMyArNDIyLDEzIEBACiAKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0socGluX2ZzX2xvY2spOwogCi1pbnQgc2ltcGxlX3Bpbl9mcyhjaGFyICpuYW1lLCBzdHJ1Y3QgdmZzbW91bnQgKiptb3VudCwgaW50ICpjb3VudCkKK2ludCBzaW1wbGVfcGluX2ZzKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICp0eXBlLCBzdHJ1Y3QgdmZzbW91bnQgKiptb3VudCwgaW50ICpjb3VudCkKIHsKIAlzdHJ1Y3QgdmZzbW91bnQgKm1udCA9IE5VTEw7CiAJc3Bpbl9sb2NrKCZwaW5fZnNfbG9jayk7CiAJaWYgKHVubGlrZWx5KCEqbW91bnQpKSB7CiAJCXNwaW5fdW5sb2NrKCZwaW5fZnNfbG9jayk7Ci0JCW1udCA9IGRvX2tlcm5fbW91bnQobmFtZSwgMCwgbmFtZSwgTlVMTCk7CisJCW1udCA9IHZmc19rZXJuX21vdW50KHR5cGUsIDAsIHR5cGUtPm5hbWUsIE5VTEwpOwogCQlpZiAoSVNfRVJSKG1udCkpCiAJCQlyZXR1cm4gUFRSX0VSUihtbnQpOwogCQlzcGluX2xvY2soJnBpbl9mc19sb2NrKTsKZGlmZiAtLWdpdCBhL2ZzL2xvY2tkL2NsbnRsb2NrLmMgYi9mcy9sb2NrZC9jbG50bG9jay5jCmluZGV4IGJjZTc0NDQuLjUyNzc0ZmUgMTAwNjQ0Ci0tLSBhL2ZzL2xvY2tkL2NsbnRsb2NrLmMKKysrIGIvZnMvbG9ja2QvY2xudGxvY2suYwpAQCAtMTQ3LDExICsxNDcsMTAgQEAKICAqIFNvbWVvbmUgaGFzIHNlbnQgdXMgYW4gU01fTk9USUZZLiBFbnN1cmUgd2UgYmluZCB0byB0aGUgbmV3IHBvcnQgbnVtYmVyLAogICogdGhhdCB3ZSBtYXJrIGxvY2tzIGZvciByZWNsYWltaW5nLCBhbmQgdGhhdCB3ZSBidW1wIHRoZSBwc2V1ZG8gTlNNIHN0YXRlLgogICovCi1zdGF0aWMgaW5saW5lCi12b2lkIG5sbWNsbnRfcHJlcGFyZV9yZWNsYWltKHN0cnVjdCBubG1faG9zdCAqaG9zdCwgdTMyIG5ld3N0YXRlKQorc3RhdGljIHZvaWQgbmxtY2xudF9wcmVwYXJlX3JlY2xhaW0oc3RydWN0IG5sbV9ob3N0ICpob3N0KQogeworCWRvd25fd3JpdGUoJmhvc3QtPmhfcndzZW0pOwogCWhvc3QtPmhfbW9uaXRvcmVkID0gMDsKLQlob3N0LT5oX25zbXN0YXRlID0gbmV3c3RhdGU7CiAJaG9zdC0+aF9zdGF0ZSsrOwogCWhvc3QtPmhfbmV4dHJlYmluZCA9IDA7CiAJbmxtX3JlYmluZF9ob3N0KGhvc3QpOwpAQCAtMTY0LDYgKzE2MywxMyBAQAogCWRwcmludGsoIk5MTTogcmVjbGFpbWluZyBsb2NrcyBmb3IgaG9zdCAlcyIsIGhvc3QtPmhfbmFtZSk7CiB9CiAKK3N0YXRpYyB2b2lkIG5sbWNsbnRfZmluaXNoX3JlY2xhaW0oc3RydWN0IG5sbV9ob3N0ICpob3N0KQoreworCWhvc3QtPmhfcmVjbGFpbWluZyA9IDA7CisJdXBfd3JpdGUoJmhvc3QtPmhfcndzZW0pOworCWRwcmludGsoIk5MTTogZG9uZSByZWNsYWltaW5nIGxvY2tzIGZvciBob3N0ICVzIiwgaG9zdC0+aF9uYW1lKTsKK30KKwogLyoKICAqIFJlY2xhaW0gYWxsIGxvY2tzIG9uIHNlcnZlciBob3N0LiBXZSBkbyB0aGlzIGJ5IHNwYXduaW5nIGEgc2VwYXJhdGUKICAqIHJlY2xhaW1lciB0aHJlYWQuCkBAIC0xNzEsMTIgKzE3NywxMCBAQAogdm9pZAogbmxtY2xudF9yZWNvdmVyeShzdHJ1Y3QgbmxtX2hvc3QgKmhvc3QsIHUzMiBuZXdzdGF0ZSkKIHsKLQlpZiAoaG9zdC0+aF9yZWNsYWltaW5nKyspIHsKLQkJaWYgKGhvc3QtPmhfbnNtc3RhdGUgPT0gbmV3c3RhdGUpCi0JCQlyZXR1cm47Ci0JCW5sbWNsbnRfcHJlcGFyZV9yZWNsYWltKGhvc3QsIG5ld3N0YXRlKTsKLQl9IGVsc2UgewotCQlubG1jbG50X3ByZXBhcmVfcmVjbGFpbShob3N0LCBuZXdzdGF0ZSk7CisJaWYgKGhvc3QtPmhfbnNtc3RhdGUgPT0gbmV3c3RhdGUpCisJCXJldHVybjsKKwlob3N0LT5oX25zbXN0YXRlID0gbmV3c3RhdGU7CisJaWYgKCFob3N0LT5oX3JlY2xhaW1pbmcrKykgewogCQlubG1fZ2V0X2hvc3QoaG9zdCk7CiAJCV9fbW9kdWxlX2dldChUSElTX01PRFVMRSk7CiAJCWlmIChrZXJuZWxfdGhyZWFkKHJlY2xhaW1lciwgaG9zdCwgQ0xPTkVfS0VSTkVMKSA8IDApCkBAIC0xOTAsNiArMTk0LDcgQEAKIAlzdHJ1Y3QgbmxtX2hvc3QJICAqaG9zdCA9IChzdHJ1Y3QgbmxtX2hvc3QgKikgcHRyOwogCXN0cnVjdCBubG1fd2FpdAkgICpibG9jazsKIAlzdHJ1Y3QgZmlsZV9sb2NrICpmbCwgKm5leHQ7CisJdTMyIG5zbXN0YXRlOwogCiAJZGFlbW9uaXplKCIlcy1yZWNsYWltIiwgaG9zdC0+aF9uYW1lKTsKIAlhbGxvd19zaWduYWwoU0lHS0lMTCk7CkBAIC0xOTksMTkgKzIwNCwyNSBAQAogCWxvY2tfa2VybmVsKCk7CiAJbG9ja2RfdXAoKTsKIAorCW5sbWNsbnRfcHJlcGFyZV9yZWNsYWltKGhvc3QpOwogCS8qIEZpcnN0LCByZWNsYWltIGFsbCBsb2NrcyB0aGF0IGhhdmUgYmVlbiBtYXJrZWQuICovCiByZXN0YXJ0OgorCW5zbXN0YXRlID0gaG9zdC0+aF9uc21zdGF0ZTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZmwsIG5leHQsICZob3N0LT5oX3JlY2xhaW0sIGZsX3UubmZzX2ZsLmxpc3QpIHsKIAkJbGlzdF9kZWxfaW5pdCgmZmwtPmZsX3UubmZzX2ZsLmxpc3QpOwogCiAJCWlmIChzaWduYWxsZWQoKSkKIAkJCWNvbnRpbnVlOwotCQlpZiAobmxtY2xudF9yZWNsYWltKGhvc3QsIGZsKSA9PSAwKQotCQkJbGlzdF9hZGRfdGFpbCgmZmwtPmZsX3UubmZzX2ZsLmxpc3QsICZob3N0LT5oX2dyYW50ZWQpOwotCQlnb3RvIHJlc3RhcnQ7CisJCWlmIChubG1jbG50X3JlY2xhaW0oaG9zdCwgZmwpICE9IDApCisJCQljb250aW51ZTsKKwkJbGlzdF9hZGRfdGFpbCgmZmwtPmZsX3UubmZzX2ZsLmxpc3QsICZob3N0LT5oX2dyYW50ZWQpOworCQlpZiAoaG9zdC0+aF9uc21zdGF0ZSAhPSBuc21zdGF0ZSkgeworCQkJLyogQXJnaCEgVGhlIHNlcnZlciByZWJvb3RlZCBhZ2FpbiEgKi8KKwkJCWxpc3Rfc3BsaWNlX2luaXQoJmhvc3QtPmhfZ3JhbnRlZCwgJmhvc3QtPmhfcmVjbGFpbSk7CisJCQlnb3RvIHJlc3RhcnQ7CisJCX0KIAl9Ci0KLQlob3N0LT5oX3JlY2xhaW1pbmcgPSAwOworCW5sbWNsbnRfZmluaXNoX3JlY2xhaW0oaG9zdCk7CiAKIAkvKiBOb3csIHdha2UgdXAgYWxsIHByb2Nlc3NlcyB0aGF0IHNsZWVwIG9uIGEgYmxvY2tlZCBsb2NrICovCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShibG9jaywgJm5sbV9ibG9ja2VkLCBiX2xpc3QpIHsKZGlmZiAtLWdpdCBhL2ZzL2xvY2tkL2NsbnRwcm9jLmMgYi9mcy9sb2NrZC9jbG50cHJvYy5jCmluZGV4IGY5NmUzODEuLjRkYjYyMDkgMTAwNjQ0Ci0tLSBhL2ZzL2xvY2tkL2NsbnRwcm9jLmMKKysrIGIvZnMvbG9ja2QvY2xudHByb2MuYwpAQCAtNTA4LDcgKzUwOCwxMCBAQAogCX0KIAogCWJsb2NrID0gbmxtY2xudF9wcmVwYXJlX2Jsb2NrKGhvc3QsIGZsKTsKK2FnYWluOgogCWZvcig7OykgeworCQkvKiBSZWJvb3QgcHJvdGVjdGlvbiAqLworCQlmbC0+ZmxfdS5uZnNfZmwuc3RhdGUgPSBob3N0LT5oX3N0YXRlOwogCQlzdGF0dXMgPSBubG1jbG50X2NhbGwocmVxLCBOTE1QUk9DX0xPQ0spOwogCQlpZiAoc3RhdHVzIDwgMCkKIAkJCWdvdG8gb3V0X3VuYmxvY2s7CkBAIC01MzEsMTAgKzUzNCwxNiBAQAogCX0KIAogCWlmIChyZXNwLT5zdGF0dXMgPT0gTkxNX0xDS19HUkFOVEVEKSB7Ci0JCWZsLT5mbF91Lm5mc19mbC5zdGF0ZSA9IGhvc3QtPmhfc3RhdGU7CisJCWRvd25fcmVhZCgmaG9zdC0+aF9yd3NlbSk7CisJCS8qIENoZWNrIHdoZXRoZXIgb3Igbm90IHRoZSBzZXJ2ZXIgaGFzIHJlYm9vdGVkICovCisJCWlmIChmbC0+ZmxfdS5uZnNfZmwuc3RhdGUgIT0gaG9zdC0+aF9zdGF0ZSkgeworCQkJdXBfcmVhZCgmaG9zdC0+aF9yd3NlbSk7CisJCQlnb3RvIGFnYWluOworCQl9CiAJCWZsLT5mbF9mbGFncyB8PSBGTF9TTEVFUDsKIAkJLyogRW5zdXJlIHRoZSByZXN1bHRpbmcgbG9jayB3aWxsIGdldCBhZGRlZCB0byBncmFudGVkIGxpc3QgKi8KIAkJZG9fdmZzX2xvY2soZmwpOworCQl1cF9yZWFkKCZob3N0LT5oX3J3c2VtKTsKIAl9CiAJc3RhdHVzID0gbmxtX3N0YXRfdG9fZXJybm8ocmVzcC0+c3RhdHVzKTsKIG91dF91bmJsb2NrOgpAQCAtNTk2LDYgKzYwNSw3IEBACiBzdGF0aWMgaW50CiBubG1jbG50X3VubG9jayhzdHJ1Y3QgbmxtX3Jxc3QgKnJlcSwgc3RydWN0IGZpbGVfbG9jayAqZmwpCiB7CisJc3RydWN0IG5sbV9ob3N0CSpob3N0ID0gcmVxLT5hX2hvc3Q7CiAJc3RydWN0IG5sbV9yZXMJKnJlc3AgPSAmcmVxLT5hX3JlczsKIAlpbnQJCXN0YXR1czsKIApAQCAtNjA0LDcgKzYxNCw5IEBACiAJICogcmVxdWVzdCwgb3IgdG8gZGVueSBpdCB3aXRoIE5MTV9MQ0tfREVOSUVEX0dSQUNFX1BFUklPRC4gSW4gZWl0aGVyCiAJICogY2FzZSwgd2Ugd2FudCB0byB1bmxvY2suCiAJICovCisJZG93bl9yZWFkKCZob3N0LT5oX3J3c2VtKTsKIAlkb192ZnNfbG9jayhmbCk7CisJdXBfcmVhZCgmaG9zdC0+aF9yd3NlbSk7CiAKIAlpZiAocmVxLT5hX2ZsYWdzICYgUlBDX1RBU0tfQVNZTkMpCiAJCXJldHVybiBubG1fYXN5bmNfY2FsbChyZXEsIE5MTVBST0NfVU5MT0NLLCAmbmxtY2xudF91bmxvY2tfb3BzKTsKZGlmZiAtLWdpdCBhL2ZzL2xvY2tkL2hvc3QuYyBiL2ZzL2xvY2tkL2hvc3QuYwppbmRleCA3MjlhYzQyLi4zOGIwZThhIDEwMDY0NAotLS0gYS9mcy9sb2NrZC9ob3N0LmMKKysrIGIvZnMvbG9ja2QvaG9zdC5jCkBAIC0xMTIsMTEgKzExMiwxMiBAQAogCWhvc3QtPmhfdmVyc2lvbiAgICA9IHZlcnNpb247CiAJaG9zdC0+aF9wcm90byAgICAgID0gcHJvdG87CiAJaG9zdC0+aF9ycGNjbG50ICAgID0gTlVMTDsKLQlpbml0X01VVEVYKCZob3N0LT5oX3NlbWEpOworCW11dGV4X2luaXQoJmhvc3QtPmhfbXV0ZXgpOwogCWhvc3QtPmhfbmV4dHJlYmluZCA9IGppZmZpZXMgKyBOTE1fSE9TVF9SRUJJTkQ7CiAJaG9zdC0+aF9leHBpcmVzICAgID0gamlmZmllcyArIE5MTV9IT1NUX0VYUElSRTsKIAlhdG9taWNfc2V0KCZob3N0LT5oX2NvdW50LCAxKTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZob3N0LT5oX2dyYWNld2FpdCk7CisJaW5pdF9yd3NlbSgmaG9zdC0+aF9yd3NlbSk7CiAJaG9zdC0+aF9zdGF0ZSAgICAgID0gMDsJCQkvKiBwc2V1ZG8gTlNNIHN0YXRlICovCiAJaG9zdC0+aF9uc21zdGF0ZSAgID0gMDsJCQkvKiByZWFsIE5TTSBzdGF0ZSAqLwogCWhvc3QtPmhfc2VydmVyCSAgID0gc2VydmVyOwpAQCAtMTcyLDcgKzE3Myw3IEBACiAJCQkodW5zaWduZWQpbnRvaGwoaG9zdC0+aF9hZGRyLnNpbl9hZGRyLnNfYWRkcikpOwogCiAJLyogTG9jayBob3N0IGhhbmRsZSAqLwotCWRvd24oJmhvc3QtPmhfc2VtYSk7CisJbXV0ZXhfbG9jaygmaG9zdC0+aF9tdXRleCk7CiAKIAkvKiBJZiB3ZSd2ZSBhbHJlYWR5IGNyZWF0ZWQgYW4gUlBDIGNsaWVudCwgY2hlY2sgd2hldGhlcgogCSAqIFJQQyByZWJpbmQgaXMgcmVxdWlyZWQKQEAgLTIwNCwxMiArMjA1LDEyIEBACiAJCWhvc3QtPmhfcnBjY2xudCA9IGNsbnQ7CiAJfQogCi0JdXAoJmhvc3QtPmhfc2VtYSk7CisJbXV0ZXhfdW5sb2NrKCZob3N0LT5oX211dGV4KTsKIAlyZXR1cm4gY2xudDsKIAogZm9yZ2V0aXQ6CiAJcHJpbnRrKCJsb2NrZDogY291bGRuJ3QgY3JlYXRlIFJQQyBoYW5kbGUgZm9yICVzXG4iLCBob3N0LT5oX25hbWUpOwotCXVwKCZob3N0LT5oX3NlbWEpOworCW11dGV4X3VubG9jaygmaG9zdC0+aF9tdXRleCk7CiAJcmV0dXJuIE5VTEw7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL25hbWVpLmMgYi9mcy9uYW1laS5jCmluZGV4IGJiNGEzZTQuLmM3ODRlOGIgMTAwNjQ0Ci0tLSBhL2ZzL25hbWVpLmMKKysrIGIvZnMvbmFtZWkuYwpAQCAtMjI0MywxNCArMjI0MywxNiBAQAogCWludCBlcnJvcjsKIAljaGFyICogdG87CiAKLQlpZiAoZmxhZ3MgIT0gMCkKKwlpZiAoKGZsYWdzICYgfkFUX1NZTUxJTktfRk9MTE9XKSAhPSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXRvID0gZ2V0bmFtZShuZXduYW1lKTsKIAlpZiAoSVNfRVJSKHRvKSkKIAkJcmV0dXJuIFBUUl9FUlIodG8pOwogCi0JZXJyb3IgPSBfX3VzZXJfd2Fsa19mZChvbGRkZmQsIG9sZG5hbWUsIDAsICZvbGRfbmQpOworCWVycm9yID0gX191c2VyX3dhbGtfZmQob2xkZGZkLCBvbGRuYW1lLAorCQkJICAgICAgIGZsYWdzICYgQVRfU1lNTElOS19GT0xMT1cgPyBMT09LVVBfRk9MTE9XIDogMCwKKwkJCSAgICAgICAmb2xkX25kKTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gZXhpdDsKIAllcnJvciA9IGRvX3BhdGhfbG9va3VwKG5ld2RmZCwgdG8sIExPT0tVUF9QQVJFTlQsICZuZCk7CmRpZmYgLS1naXQgYS9mcy9uYW1lc3BhY2UuYyBiL2ZzL25hbWVzcGFjZS5jCmluZGV4IGMxMzA3MmEuLmIzZWQyMTIgMTAwNjQ0Ci0tLSBhL2ZzL25hbWVzcGFjZS5jCisrKyBiL2ZzL25hbWVzcGFjZS5jCkBAIC01MjYsMTAgKzUyNiw4IEBACiB7CiAJc3RydWN0IHZmc21vdW50ICpwOwogCi0JZm9yIChwID0gbW50OyBwOyBwID0gbmV4dF9tbnQocCwgbW50KSkgewotCQlsaXN0X2RlbCgmcC0+bW50X2hhc2gpOwotCQlsaXN0X2FkZCgmcC0+bW50X2hhc2gsIGtpbGwpOwotCX0KKwlmb3IgKHAgPSBtbnQ7IHA7IHAgPSBuZXh0X21udChwLCBtbnQpKQorCQlsaXN0X21vdmUoJnAtPm1udF9oYXNoLCBraWxsKTsKIAogCWlmIChwcm9wYWdhdGUpCiAJCXByb3BhZ2F0ZV91bW91bnQoa2lsbCk7CkBAIC01ODUsOCArNTgzLDggQEAKIAkgKi8KIAogCWxvY2tfa2VybmVsKCk7Ci0JaWYgKChmbGFncyAmIE1OVF9GT1JDRSkgJiYgc2ItPnNfb3AtPnVtb3VudF9iZWdpbikKLQkJc2ItPnNfb3AtPnVtb3VudF9iZWdpbihzYik7CisJaWYgKHNiLT5zX29wLT51bW91bnRfYmVnaW4pCisJCXNiLT5zX29wLT51bW91bnRfYmVnaW4obW50LCBmbGFncyk7CiAJdW5sb2NrX2tlcm5lbCgpOwogCiAJLyoKQEAgLTExNzIsMTMgKzExNzAsNDYgQEAKIH0KIAogLyoKKyAqIGdvIHRocm91Z2ggdGhlIHZmc21vdW50cyB3ZSd2ZSBqdXN0IGNvbnNpZ25lZCB0byB0aGUgZ3JhdmV5YXJkIHRvCisgKiAtIGNoZWNrIHRoYXQgdGhleSdyZSBzdGlsbCBkZWFkCisgKiAtIGRlbGV0ZSB0aGUgdmZzbW91bnQgZnJvbSB0aGUgYXBwcm9wcmlhdGUgbmFtZXNwYWNlIHVuZGVyIGxvY2sKKyAqIC0gZGlzcG9zZSBvZiB0aGUgY29ycHNlCisgKi8KK3N0YXRpYyB2b2lkIGV4cGlyZV9tb3VudF9saXN0KHN0cnVjdCBsaXN0X2hlYWQgKmdyYXZleWFyZCwgc3RydWN0IGxpc3RfaGVhZCAqbW91bnRzKQoreworCXN0cnVjdCBuYW1lc3BhY2UgKm5hbWVzcGFjZTsKKwlzdHJ1Y3QgdmZzbW91bnQgKm1udDsKKworCXdoaWxlICghbGlzdF9lbXB0eShncmF2ZXlhcmQpKSB7CisJCUxJU1RfSEVBRCh1bW91bnRzKTsKKwkJbW50ID0gbGlzdF9lbnRyeShncmF2ZXlhcmQtPm5leHQsIHN0cnVjdCB2ZnNtb3VudCwgbW50X2V4cGlyZSk7CisJCWxpc3RfZGVsX2luaXQoJm1udC0+bW50X2V4cGlyZSk7CisKKwkJLyogZG9uJ3QgZG8gYW55dGhpbmcgaWYgdGhlIG5hbWVzcGFjZSBpcyBkZWFkIC0gYWxsIHRoZQorCQkgKiB2ZnNtb3VudHMgZnJvbSBpdCBhcmUgZ29pbmcgYXdheSBhbnl3YXkgKi8KKwkJbmFtZXNwYWNlID0gbW50LT5tbnRfbmFtZXNwYWNlOworCQlpZiAoIW5hbWVzcGFjZSB8fCAhbmFtZXNwYWNlLT5yb290KQorCQkJY29udGludWU7CisJCWdldF9uYW1lc3BhY2UobmFtZXNwYWNlKTsKKworCQlzcGluX3VubG9jaygmdmZzbW91bnRfbG9jayk7CisJCWRvd25fd3JpdGUoJm5hbWVzcGFjZV9zZW0pOworCQlleHBpcmVfbW91bnQobW50LCBtb3VudHMsICZ1bW91bnRzKTsKKwkJdXBfd3JpdGUoJm5hbWVzcGFjZV9zZW0pOworCQlyZWxlYXNlX21vdW50cygmdW1vdW50cyk7CisJCW1udHB1dChtbnQpOworCQlwdXRfbmFtZXNwYWNlKG5hbWVzcGFjZSk7CisJCXNwaW5fbG9jaygmdmZzbW91bnRfbG9jayk7CisJfQorfQorCisvKgogICogcHJvY2VzcyBhIGxpc3Qgb2YgZXhwaXJhYmxlIG1vdW50cG9pbnRzIHdpdGggdGhlIGludGVudCBvZiBkaXNjYXJkaW5nIGFueQogICogbW91bnRwb2ludHMgdGhhdCBhcmVuJ3QgaW4gdXNlIGFuZCBoYXZlbid0IGJlZW4gdG91Y2hlZCBzaW5jZSBsYXN0IHdlIGNhbWUKICAqIGhlcmUKICAqLwogdm9pZCBtYXJrX21vdW50c19mb3JfZXhwaXJ5KHN0cnVjdCBsaXN0X2hlYWQgKm1vdW50cykKIHsKLQlzdHJ1Y3QgbmFtZXNwYWNlICpuYW1lc3BhY2U7CiAJc3RydWN0IHZmc21vdW50ICptbnQsICpuZXh0OwogCUxJU1RfSEVBRChncmF2ZXlhcmQpOwogCkBAIC0xMjAyLDMzICsxMjMzLDcgQEAKIAkJbGlzdF9tb3ZlKCZtbnQtPm1udF9leHBpcmUsICZncmF2ZXlhcmQpOwogCX0KIAotCS8qCi0JICogZ28gdGhyb3VnaCB0aGUgdmZzbW91bnRzIHdlJ3ZlIGp1c3QgY29uc2lnbmVkIHRvIHRoZSBncmF2ZXlhcmQgdG8KLQkgKiAtIGNoZWNrIHRoYXQgdGhleSdyZSBzdGlsbCBkZWFkCi0JICogLSBkZWxldGUgdGhlIHZmc21vdW50IGZyb20gdGhlIGFwcHJvcHJpYXRlIG5hbWVzcGFjZSB1bmRlciBsb2NrCi0JICogLSBkaXNwb3NlIG9mIHRoZSBjb3Jwc2UKLQkgKi8KLQl3aGlsZSAoIWxpc3RfZW1wdHkoJmdyYXZleWFyZCkpIHsKLQkJTElTVF9IRUFEKHVtb3VudHMpOwotCQltbnQgPSBsaXN0X2VudHJ5KGdyYXZleWFyZC5uZXh0LCBzdHJ1Y3QgdmZzbW91bnQsIG1udF9leHBpcmUpOwotCQlsaXN0X2RlbF9pbml0KCZtbnQtPm1udF9leHBpcmUpOwotCi0JCS8qIGRvbid0IGRvIGFueXRoaW5nIGlmIHRoZSBuYW1lc3BhY2UgaXMgZGVhZCAtIGFsbCB0aGUKLQkJICogdmZzbW91bnRzIGZyb20gaXQgYXJlIGdvaW5nIGF3YXkgYW55d2F5ICovCi0JCW5hbWVzcGFjZSA9IG1udC0+bW50X25hbWVzcGFjZTsKLQkJaWYgKCFuYW1lc3BhY2UgfHwgIW5hbWVzcGFjZS0+cm9vdCkKLQkJCWNvbnRpbnVlOwotCQlnZXRfbmFtZXNwYWNlKG5hbWVzcGFjZSk7Ci0KLQkJc3Bpbl91bmxvY2soJnZmc21vdW50X2xvY2spOwotCQlkb3duX3dyaXRlKCZuYW1lc3BhY2Vfc2VtKTsKLQkJZXhwaXJlX21vdW50KG1udCwgbW91bnRzLCAmdW1vdW50cyk7Ci0JCXVwX3dyaXRlKCZuYW1lc3BhY2Vfc2VtKTsKLQkJcmVsZWFzZV9tb3VudHMoJnVtb3VudHMpOwotCQltbnRwdXQobW50KTsKLQkJcHV0X25hbWVzcGFjZShuYW1lc3BhY2UpOwotCQlzcGluX2xvY2soJnZmc21vdW50X2xvY2spOwotCX0KKwlleHBpcmVfbW91bnRfbGlzdCgmZ3JhdmV5YXJkLCBtb3VudHMpOwogCiAJc3Bpbl91bmxvY2soJnZmc21vdW50X2xvY2spOwogfQpAQCAtMTIzNiw2ICsxMjQxLDczIEBACiBFWFBPUlRfU1lNQk9MX0dQTChtYXJrX21vdW50c19mb3JfZXhwaXJ5KTsKIAogLyoKKyAqIFJpcG9mZiBvZiAnc2VsZWN0X3BhcmVudCgpJworICoKKyAqIHNlYXJjaCB0aGUgbGlzdCBvZiBzdWJtb3VudHMgZm9yIGEgZ2l2ZW4gbW91bnRwb2ludCwgYW5kIG1vdmUgYW55CisgKiBzaHJpbmthYmxlIHN1Ym1vdW50cyB0byB0aGUgJ2dyYXZleWFyZCcgbGlzdC4KKyAqLworc3RhdGljIGludCBzZWxlY3Rfc3VibW91bnRzKHN0cnVjdCB2ZnNtb3VudCAqcGFyZW50LCBzdHJ1Y3QgbGlzdF9oZWFkICpncmF2ZXlhcmQpCit7CisJc3RydWN0IHZmc21vdW50ICp0aGlzX3BhcmVudCA9IHBhcmVudDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpuZXh0OworCWludCBmb3VuZCA9IDA7CisKK3JlcGVhdDoKKwluZXh0ID0gdGhpc19wYXJlbnQtPm1udF9tb3VudHMubmV4dDsKK3Jlc3VtZToKKwl3aGlsZSAobmV4dCAhPSAmdGhpc19wYXJlbnQtPm1udF9tb3VudHMpIHsKKwkJc3RydWN0IGxpc3RfaGVhZCAqdG1wID0gbmV4dDsKKwkJc3RydWN0IHZmc21vdW50ICptbnQgPSBsaXN0X2VudHJ5KHRtcCwgc3RydWN0IHZmc21vdW50LCBtbnRfY2hpbGQpOworCisJCW5leHQgPSB0bXAtPm5leHQ7CisJCWlmICghKG1udC0+bW50X2ZsYWdzICYgTU5UX1NIUklOS0FCTEUpKQorCQkJY29udGludWU7CisJCS8qCisJCSAqIERlc2NlbmQgYSBsZXZlbCBpZiB0aGUgZF9tb3VudHMgbGlzdCBpcyBub24tZW1wdHkuCisJCSAqLworCQlpZiAoIWxpc3RfZW1wdHkoJm1udC0+bW50X21vdW50cykpIHsKKwkJCXRoaXNfcGFyZW50ID0gbW50OworCQkJZ290byByZXBlYXQ7CisJCX0KKworCQlpZiAoIXByb3BhZ2F0ZV9tb3VudF9idXN5KG1udCwgMSkpIHsKKwkJCW1udGdldChtbnQpOworCQkJbGlzdF9tb3ZlX3RhaWwoJm1udC0+bW50X2V4cGlyZSwgZ3JhdmV5YXJkKTsKKwkJCWZvdW5kKys7CisJCX0KKwl9CisJLyoKKwkgKiBBbGwgZG9uZSBhdCB0aGlzIGxldmVsIC4uLiBhc2NlbmQgYW5kIHJlc3VtZSB0aGUgc2VhcmNoCisJICovCisJaWYgKHRoaXNfcGFyZW50ICE9IHBhcmVudCkgeworCQluZXh0ID0gdGhpc19wYXJlbnQtPm1udF9jaGlsZC5uZXh0OworCQl0aGlzX3BhcmVudCA9IHRoaXNfcGFyZW50LT5tbnRfcGFyZW50OworCQlnb3RvIHJlc3VtZTsKKwl9CisJcmV0dXJuIGZvdW5kOworfQorCisvKgorICogcHJvY2VzcyBhIGxpc3Qgb2YgZXhwaXJhYmxlIG1vdW50cG9pbnRzIHdpdGggdGhlIGludGVudCBvZiBkaXNjYXJkaW5nIGFueQorICogc3VibW91bnRzIG9mIGEgc3BlY2lmaWMgcGFyZW50IG1vdW50cG9pbnQKKyAqLwordm9pZCBzaHJpbmtfc3VibW91bnRzKHN0cnVjdCB2ZnNtb3VudCAqbW91bnRwb2ludCwgc3RydWN0IGxpc3RfaGVhZCAqbW91bnRzKQoreworCUxJU1RfSEVBRChncmF2ZXlhcmQpOworCWludCBmb3VuZDsKKworCXNwaW5fbG9jaygmdmZzbW91bnRfbG9jayk7CisKKwkvKiBleHRyYWN0IHN1Ym1vdW50cyBvZiAnbW91bnRwb2ludCcgZnJvbSB0aGUgZXhwaXJhdGlvbiBsaXN0ICovCisJd2hpbGUgKChmb3VuZCA9IHNlbGVjdF9zdWJtb3VudHMobW91bnRwb2ludCwgJmdyYXZleWFyZCkpICE9IDApCisJCWV4cGlyZV9tb3VudF9saXN0KCZncmF2ZXlhcmQsIG1vdW50cyk7CisKKwlzcGluX3VubG9jaygmdmZzbW91bnRfbG9jayk7Cit9CisKK0VYUE9SVF9TWU1CT0xfR1BMKHNocmlua19zdWJtb3VudHMpOworCisvKgogICogU29tZSBjb3B5X2Zyb21fdXNlcigpIGltcGxlbWVudGF0aW9ucyBkbyBub3QgcmV0dXJuIHRoZSBleGFjdCBudW1iZXIgb2YKICAqIGJ5dGVzIHJlbWFpbmluZyB0byBjb3B5IG9uIGEgZmF1bHQuICBCdXQgY29weV9tb3VudF9vcHRpb25zKCkgcmVxdWlyZXMgdGhhdC4KICAqIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGRpZmZlcnMgZnJvbSBjb3B5X2Zyb21fdXNlcigpIGluIHRoYXQgaXQgd2lsbCBvb3BzCmRpZmYgLS1naXQgYS9mcy9uZnMvTWFrZWZpbGUgYi9mcy9uZnMvTWFrZWZpbGUKaW5kZXggZWM2MWZkNS4uMGI1NzJhMCAxMDA2NDQKLS0tIGEvZnMvbmZzL01ha2VmaWxlCisrKyBiL2ZzL25mcy9NYWtlZmlsZQpAQCAtNCwxNCArNCwxNiBAQAogCiBvYmotJChDT05GSUdfTkZTX0ZTKSArPSBuZnMubwogCi1uZnMteSAJCQk6PSBkaXIubyBmaWxlLm8gaW5vZGUubyBuZnMyeGRyLm8gcGFnZWxpc3QubyBcCi0JCQkgICBwcm9jLm8gcmVhZC5vIHN5bWxpbmsubyB1bmxpbmsubyB3cml0ZS5vCituZnMteSAJCQk6PSBkaXIubyBmaWxlLm8gaW5vZGUubyBzdXBlci5vIG5mczJ4ZHIubyBwYWdlbGlzdC5vIFwKKwkJCSAgIHByb2MubyByZWFkLm8gc3ltbGluay5vIHVubGluay5vIHdyaXRlLm8gXAorCQkJICAgbmFtZXNwYWNlLm8KIG5mcy0kKENPTkZJR19ST09UX05GUykJKz0gbmZzcm9vdC5vIG1vdW50X2NsbnQubyAgICAgIAogbmZzLSQoQ09ORklHX05GU19WMykJKz0gbmZzM3Byb2MubyBuZnMzeGRyLm8KIG5mcy0kKENPTkZJR19ORlNfVjNfQUNMKQkrPSBuZnMzYWNsLm8KIG5mcy0kKENPTkZJR19ORlNfVjQpCSs9IG5mczRwcm9jLm8gbmZzNHhkci5vIG5mczRzdGF0ZS5vIG5mczRyZW5ld2QubyBcCiAJCQkgICBkZWxlZ2F0aW9uLm8gaWRtYXAubyBcCi0JCQkgICBjYWxsYmFjay5vIGNhbGxiYWNrX3hkci5vIGNhbGxiYWNrX3Byb2MubworCQkJICAgY2FsbGJhY2subyBjYWxsYmFja194ZHIubyBjYWxsYmFja19wcm9jLm8gXAorCQkJICAgbmZzNG5hbWVzcGFjZS5vCiBuZnMtJChDT05GSUdfTkZTX0RJUkVDVElPKSArPSBkaXJlY3QubwogbmZzLSQoQ09ORklHX1NZU0NUTCkgKz0gc3lzY3RsLm8KIG5mcy1vYmpzCQk6PSAkKG5mcy15KQpkaWZmIC0tZ2l0IGEvZnMvbmZzL2NhbGxiYWNrLmMgYi9mcy9uZnMvY2FsbGJhY2suYwppbmRleCA5MGM5NWFkLi5kNTNmOGM2IDEwMDY0NAotLS0gYS9mcy9uZnMvY2FsbGJhY2suYworKysgYi9mcy9uZnMvY2FsbGJhY2suYwpAQCAtMTgyLDggKzE4Miw2IEBACiAvKgogICogRGVmaW5lIE5GUzQgY2FsbGJhY2sgcHJvZ3JhbQogICovCi1leHRlcm4gc3RydWN0IHN2Y192ZXJzaW9uIG5mczRfY2FsbGJhY2tfdmVyc2lvbjE7Ci0KIHN0YXRpYyBzdHJ1Y3Qgc3ZjX3ZlcnNpb24gKm5mczRfY2FsbGJhY2tfdmVyc2lvbltdID0gewogCVsxXSA9ICZuZnM0X2NhbGxiYWNrX3ZlcnNpb24xLAogfTsKZGlmZiAtLWdpdCBhL2ZzL25mcy9jYWxsYmFja194ZHIuYyBiL2ZzL25mcy9jYWxsYmFja194ZHIuYwppbmRleCAwNWMzOGNmLi5jOTI5OTEzIDEwMDY0NAotLS0gYS9mcy9uZnMvY2FsbGJhY2tfeGRyLmMKKysrIGIvZnMvbmZzL2NhbGxiYWNrX3hkci5jCkBAIC0yMDIsNyArMjAyLDcgQEAKIAlzdGF0dXMgPSBkZWNvZGVfZmgoeGRyLCAmYXJncy0+ZmgpOwogb3V0OgogCWRwcmludGsoIiVzOiBleGl0IHdpdGggc3RhdHVzID0gJWRcbiIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gc3RhdHVzOwogfQogCiBzdGF0aWMgdW5zaWduZWQgZW5jb2RlX3N0cmluZyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1bnNpZ25lZCBpbnQgbGVuLCBjb25zdCBjaGFyICpzdHIpCmRpZmYgLS1naXQgYS9mcy9uZnMvZGlyLmMgYi9mcy9uZnMvZGlyLmMKaW5kZXggY2FlNzRkZC4uM2RkZGE2ZiAxMDA2NDQKLS0tIGEvZnMvbmZzL2Rpci5jCisrKyBiL2ZzL25mcy9kaXIuYwpAQCAtNTI4LDcgKzUyOCw3IEBACiAKIAlsb2NrX2tlcm5lbCgpOwogCi0JcmVzID0gbmZzX3JldmFsaWRhdGVfaW5vZGUoTkZTX1NFUlZFUihpbm9kZSksIGlub2RlKTsKKwlyZXMgPSBuZnNfcmV2YWxpZGF0ZV9tYXBwaW5nKGlub2RlLCBmaWxwLT5mX21hcHBpbmcpOwogCWlmIChyZXMgPCAwKSB7CiAJCXVubG9ja19rZXJuZWwoKTsKIAkJcmV0dXJuIHJlczsKQEAgLTg2OCw2ICs4NjgsMTcgQEAKIAlyZXR1cm4gKG5kLT5pbnRlbnQub3Blbi5mbGFncyAmIE9fRVhDTCkgIT0gMDsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgbmZzX3JldmFsX2ZzaWQoc3RydWN0IGlub2RlICpkaXIsCisJCXN0cnVjdCBuZnNfZmggKmZoLCBzdHJ1Y3QgbmZzX2ZhdHRyICpmYXR0cikKK3sKKwlzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyID0gTkZTX1NFUlZFUihkaXIpOworCisJaWYgKCFuZnNfZnNpZF9lcXVhbCgmc2VydmVyLT5mc2lkLCAmZmF0dHItPmZzaWQpKQorCQkvKiBSZXZhbGlkYXRlIGZzaWQgb24gcm9vdCBkaXIgKi8KKwkJcmV0dXJuIF9fbmZzX3JldmFsaWRhdGVfaW5vZGUoc2VydmVyLCBkaXItPmlfc2ItPnNfcm9vdC0+ZF9pbm9kZSk7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpuZnNfbG9va3VwKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKIHsKIAlzdHJ1Y3QgZGVudHJ5ICpyZXM7CkBAIC05MDAsNiArOTExLDExIEBACiAJCXJlcyA9IEVSUl9QVFIoZXJyb3IpOwogCQlnb3RvIG91dF91bmxvY2s7CiAJfQorCWVycm9yID0gbmZzX3JldmFsX2ZzaWQoZGlyLCAmZmhhbmRsZSwgJmZhdHRyKTsKKwlpZiAoZXJyb3IgPCAwKSB7CisJCXJlcyA9IEVSUl9QVFIoZXJyb3IpOworCQlnb3RvIG91dF91bmxvY2s7CisJfQogCWlub2RlID0gbmZzX2ZoZ2V0KGRlbnRyeS0+ZF9zYiwgJmZoYW5kbGUsICZmYXR0cik7CiAJcmVzID0gKHN0cnVjdCBkZW50cnkgKilpbm9kZTsKIAlpZiAoSVNfRVJSKHJlcykpCmRpZmYgLS1naXQgYS9mcy9uZnMvZGlyZWN0LmMgYi9mcy9uZnMvZGlyZWN0LmMKaW5kZXggM2M3MmIwYy4uNDAyMDA1YyAxMDA2NDQKLS0tIGEvZnMvbmZzL2RpcmVjdC5jCisrKyBiL2ZzL25mcy9kaXJlY3QuYwpAQCAtODkyLDcgKzg5Miw3IEBACiAgKiBuZnNfaW5pdF9kaXJlY3RjYWNoZSAtIGNyZWF0ZSBhIHNsYWIgY2FjaGUgZm9yIG5mc19kaXJlY3RfcmVxIHN0cnVjdHVyZXMKICAqCiAgKi8KLWludCBuZnNfaW5pdF9kaXJlY3RjYWNoZSh2b2lkKQoraW50IF9faW5pdCBuZnNfaW5pdF9kaXJlY3RjYWNoZSh2b2lkKQogewogCW5mc19kaXJlY3RfY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGUoIm5mc19kaXJlY3RfY2FjaGUiLAogCQkJCQkJc2l6ZW9mKHN0cnVjdCBuZnNfZGlyZWN0X3JlcSksCkBAIC05MDYsMTAgKzkwNiwxMCBAQAogfQogCiAvKioKLSAqIG5mc19pbml0X2RpcmVjdGNhY2hlIC0gZGVzdHJveSB0aGUgc2xhYiBjYWNoZSBmb3IgbmZzX2RpcmVjdF9yZXEgc3RydWN0dXJlcworICogbmZzX2Rlc3Ryb3lfZGlyZWN0Y2FjaGUgLSBkZXN0cm95IHRoZSBzbGFiIGNhY2hlIGZvciBuZnNfZGlyZWN0X3JlcSBzdHJ1Y3R1cmVzCiAgKgogICovCi12b2lkIG5mc19kZXN0cm95X2RpcmVjdGNhY2hlKHZvaWQpCit2b2lkIF9fZXhpdCBuZnNfZGVzdHJveV9kaXJlY3RjYWNoZSh2b2lkKQogewogCWlmIChrbWVtX2NhY2hlX2Rlc3Ryb3kobmZzX2RpcmVjdF9jYWNoZXApKQogCQlwcmludGsoS0VSTl9JTkZPICJuZnNfZGlyZWN0X2NhY2hlOiBub3QgYWxsIHN0cnVjdHVyZXMgd2VyZSBmcmVlZFxuIik7CmRpZmYgLS1naXQgYS9mcy9uZnMvZmlsZS5jIGIvZnMvbmZzL2ZpbGUuYwppbmRleCBmYTA1YzAyLi5hZGQyODkxIDEwMDY0NAotLS0gYS9mcy9uZnMvZmlsZS5jCisrKyBiL2ZzL25mcy9maWxlLmMKQEAgLTEyNywyMyArMTI3LDYgQEAKIH0KIAogLyoqCi0gKiBuZnNfcmV2YWxpZGF0ZV9maWxlIC0gUmV2YWxpZGF0ZSB0aGUgcGFnZSBjYWNoZSAmIHJlbGF0ZWQgbWV0YWRhdGEKLSAqIEBpbm9kZSAtIHBvaW50ZXIgdG8gaW5vZGUgc3RydWN0Ci0gKiBAZmlsZSAtIHBvaW50ZXIgdG8gZmlsZQotICovCi1zdGF0aWMgaW50IG5mc19yZXZhbGlkYXRlX2ZpbGUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCi17Ci0Jc3RydWN0IG5mc19pbm9kZSAqbmZzaSA9IE5GU19JKGlub2RlKTsKLQlpbnQgcmV0dmFsID0gMDsKLQotCWlmICgobmZzaS0+Y2FjaGVfdmFsaWRpdHkgJiAoTkZTX0lOT19SRVZBTF9QQUdFQ0FDSEV8TkZTX0lOT19JTlZBTElEX0FUVFIpKQotCQkJfHwgbmZzX2F0dHJpYnV0ZV90aW1lb3V0KGlub2RlKSkKLQkJcmV0dmFsID0gX19uZnNfcmV2YWxpZGF0ZV9pbm9kZShORlNfU0VSVkVSKGlub2RlKSwgaW5vZGUpOwotCW5mc19yZXZhbGlkYXRlX21hcHBpbmcoaW5vZGUsIGZpbHAtPmZfbWFwcGluZyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qKgogICogbmZzX3JldmFsaWRhdGVfc2l6ZSAtIFJldmFsaWRhdGUgdGhlIGZpbGUgc2l6ZQogICogQGlub2RlIC0gcG9pbnRlciB0byBpbm9kZSBzdHJ1Y3QKICAqIEBmaWxlIC0gcG9pbnRlciB0byBzdHJ1Y3QgZmlsZQpAQCAtMjI4LDcgKzIxMSw3IEBACiAJCWRlbnRyeS0+ZF9wYXJlbnQtPmRfbmFtZS5uYW1lLCBkZW50cnktPmRfbmFtZS5uYW1lLAogCQkodW5zaWduZWQgbG9uZykgY291bnQsICh1bnNpZ25lZCBsb25nKSBwb3MpOwogCi0JcmVzdWx0ID0gbmZzX3JldmFsaWRhdGVfZmlsZShpbm9kZSwgaW9jYi0+a2lfZmlscCk7CisJcmVzdWx0ID0gbmZzX3JldmFsaWRhdGVfbWFwcGluZyhpbm9kZSwgaW9jYi0+a2lfZmlscC0+Zl9tYXBwaW5nKTsKIAluZnNfYWRkX3N0YXRzKGlub2RlLCBORlNJT1NfTk9STUFMUkVBREJZVEVTLCBjb3VudCk7CiAJaWYgKCFyZXN1bHQpCiAJCXJlc3VsdCA9IGdlbmVyaWNfZmlsZV9haW9fcmVhZChpb2NiLCBidWYsIGNvdW50LCBwb3MpOwpAQCAtMjQ3LDcgKzIzMCw3IEBACiAJCWRlbnRyeS0+ZF9wYXJlbnQtPmRfbmFtZS5uYW1lLCBkZW50cnktPmRfbmFtZS5uYW1lLAogCQkodW5zaWduZWQgbG9uZykgY291bnQsICh1bnNpZ25lZCBsb25nIGxvbmcpICpwcG9zKTsKIAotCXJlcyA9IG5mc19yZXZhbGlkYXRlX2ZpbGUoaW5vZGUsIGZpbHApOworCXJlcyA9IG5mc19yZXZhbGlkYXRlX21hcHBpbmcoaW5vZGUsIGZpbHAtPmZfbWFwcGluZyk7CiAJaWYgKCFyZXMpCiAJCXJlcyA9IGdlbmVyaWNfZmlsZV9zZW5kZmlsZShmaWxwLCBwcG9zLCBjb3VudCwgYWN0b3IsIHRhcmdldCk7CiAJcmV0dXJuIHJlczsKQEAgLTI2Myw3ICsyNDYsNyBAQAogCWRmcHJpbnRrKFZGUywgIm5mczogbW1hcCglcy8lcylcbiIsCiAJCWRlbnRyeS0+ZF9wYXJlbnQtPmRfbmFtZS5uYW1lLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKIAotCXN0YXR1cyA9IG5mc19yZXZhbGlkYXRlX2ZpbGUoaW5vZGUsIGZpbGUpOworCXN0YXR1cyA9IG5mc19yZXZhbGlkYXRlX21hcHBpbmcoaW5vZGUsIGZpbGUtPmZfbWFwcGluZyk7CiAJaWYgKCFzdGF0dXMpCiAJCXN0YXR1cyA9IGdlbmVyaWNfZmlsZV9tbWFwKGZpbGUsIHZtYSk7CiAJcmV0dXJuIHN0YXR1czsKQEAgLTMyMCw3ICszMDMsMTEgQEAKIAogc3RhdGljIHZvaWQgbmZzX2ludmFsaWRhdGVfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBvZmZzZXQpCiB7Ci0JLyogRklYTUU6IHdlIHJlYWxseSBzaG91bGQgY2FuY2VsIGFueSB1bnN0YXJ0ZWQgd3JpdGVzIG9uIHRoaXMgcGFnZSAqLworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBwYWdlLT5tYXBwaW5nLT5ob3N0OworCisJLyogQ2FuY2VsIGFueSB1bnN0YXJ0ZWQgd3JpdGVzIG9uIHRoaXMgcGFnZSAqLworCWlmIChvZmZzZXQgPT0gMCkKKwkJbmZzX3N5bmNfaW5vZGVfd2FpdChpbm9kZSwgcGFnZS0+aW5kZXgsIDEsIEZMVVNIX0lOVkFMSURBVEUpOwogfQogCiBzdGF0aWMgaW50IG5mc19yZWxlYXNlX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIGdmcF90IGdmcCkKQEAgLTM3Myw3ICszNjAsNiBAQAogCQlpZiAocmVzdWx0KQogCQkJZ290byBvdXQ7CiAJfQotCW5mc19yZXZhbGlkYXRlX21hcHBpbmcoaW5vZGUsIGlvY2ItPmtpX2ZpbHAtPmZfbWFwcGluZyk7CiAKIAlyZXN1bHQgPSBjb3VudDsKIAlpZiAoIWNvdW50KQpkaWZmIC0tZ2l0IGEvZnMvbmZzL2lkbWFwLmMgYi9mcy9uZnMvaWRtYXAuYwppbmRleCAzZmFiNWIwLi5iODFlN2VkIDEwMDY0NAotLS0gYS9mcy9uZnMvaWRtYXAuYworKysgYi9mcy9uZnMvaWRtYXAuYwpAQCAtNDcsNyArNDcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9ycGNfcGlwZV9mcy5oPgogCi0jaW5jbHVkZSA8bGludXgvbmZzX2ZzX3NiLmg+CiAjaW5jbHVkZSA8bGludXgvbmZzX2ZzLmg+CiAKICNpbmNsdWRlIDxsaW51eC9uZnNfaWRtYXAuaD4KZGlmZiAtLWdpdCBhL2ZzL25mcy9pbm9kZS5jIGIvZnMvbmZzL2lub2RlLmMKaW5kZXggOTM3ZmJmYy4uNTFiYzg4YiAxMDA2NDQKLS0tIGEvZnMvbmZzL2lub2RlLmMKKysrIGIvZnMvbmZzL2lub2RlLmMKQEAgLTM2LDYgKzM2LDggQEAKICNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgogI2luY2x1ZGUgPGxpbnV4L25mc19pZG1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3Zmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNfeGRyLmg+CiAKICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KQEAgLTQ0LDg5ICs0NiwxNyBAQAogI2luY2x1ZGUgImNhbGxiYWNrLmgiCiAjaW5jbHVkZSAiZGVsZWdhdGlvbi5oIgogI2luY2x1ZGUgImlvc3RhdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCiAKICNkZWZpbmUgTkZTREJHX0ZBQ0lMSVRZCQlORlNEQkdfVkZTCiAjZGVmaW5lIE5GU19QQVJBTk9JQSAxCiAKLS8qIE1heGltdW0gbnVtYmVyIG9mIHJlYWRhaGVhZCByZXF1ZXN0cwotICogRklYTUU6IHRoaXMgc2hvdWxkIHJlYWxseSBiZSBhIHN5c2N0bCBzbyB0aGF0IHVzZXJzIG1heSB0dW5lIGl0IHRvIHN1aXQKLSAqICAgICAgICB0aGVpciBuZWVkcy4gUGVvcGxlIHRoYXQgZG8gTkZTIG92ZXIgYSBzbG93IG5ldHdvcmssIG1pZ2h0IGZvcgotICogICAgICAgIGluc3RhbmNlIHdhbnQgdG8gcmVkdWNlIGl0IHRvIHNvbWV0aGluZyBjbG9zZXIgdG8gMSBmb3IgaW1wcm92ZWQKLSAqICAgICAgICBpbnRlcmFjdGl2ZSByZXNwb25zZS4KLSAqLwotI2RlZmluZSBORlNfTUFYX1JFQURBSEVBRAkoUlBDX0RFRl9TTE9UX1RBQkxFIC0gMSkKLQogc3RhdGljIHZvaWQgbmZzX2ludmFsaWRhdGVfaW5vZGUoc3RydWN0IGlub2RlICopOwogc3RhdGljIGludCBuZnNfdXBkYXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgbmZzX2ZhdHRyICopOwogCi1zdGF0aWMgc3RydWN0IGlub2RlICpuZnNfYWxsb2NfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7Ci1zdGF0aWMgdm9pZCBuZnNfZGVzdHJveV9pbm9kZShzdHJ1Y3QgaW5vZGUgKik7Ci1zdGF0aWMgaW50IG5mc193cml0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKixpbnQpOwotc3RhdGljIHZvaWQgbmZzX2RlbGV0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKik7Ci1zdGF0aWMgdm9pZCBuZnNfY2xlYXJfaW5vZGUoc3RydWN0IGlub2RlICopOwotc3RhdGljIHZvaWQgbmZzX3Vtb3VudF9iZWdpbihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7Ci1zdGF0aWMgaW50ICBuZnNfc3RhdGZzKHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IGtzdGF0ZnMgKik7Ci1zdGF0aWMgaW50ICBuZnNfc2hvd19vcHRpb25zKHN0cnVjdCBzZXFfZmlsZSAqLCBzdHJ1Y3QgdmZzbW91bnQgKik7Ci1zdGF0aWMgaW50ICBuZnNfc2hvd19zdGF0cyhzdHJ1Y3Qgc2VxX2ZpbGUgKiwgc3RydWN0IHZmc21vdW50ICopOwogc3RhdGljIHZvaWQgbmZzX3phcF9hY2xfY2FjaGUoc3RydWN0IGlub2RlICopOwogCi1zdGF0aWMgc3RydWN0IHJwY19wcm9ncmFtCW5mc19wcm9ncmFtOwotCi1zdGF0aWMgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgbmZzX3NvcHMgPSB7IAotCS5hbGxvY19pbm9kZQk9IG5mc19hbGxvY19pbm9kZSwKLQkuZGVzdHJveV9pbm9kZQk9IG5mc19kZXN0cm95X2lub2RlLAotCS53cml0ZV9pbm9kZQk9IG5mc193cml0ZV9pbm9kZSwKLQkuZGVsZXRlX2lub2RlCT0gbmZzX2RlbGV0ZV9pbm9kZSwKLQkuc3RhdGZzCQk9IG5mc19zdGF0ZnMsCi0JLmNsZWFyX2lub2RlCT0gbmZzX2NsZWFyX2lub2RlLAotCS51bW91bnRfYmVnaW4JPSBuZnNfdW1vdW50X2JlZ2luLAotCS5zaG93X29wdGlvbnMJPSBuZnNfc2hvd19vcHRpb25zLAotCS5zaG93X3N0YXRzCT0gbmZzX3Nob3dfc3RhdHMsCi19OwotCi0vKgotICogUlBDIGNydWZ0IGZvciBORlMKLSAqLwotc3RhdGljIHN0cnVjdCBycGNfc3RhdAkJbmZzX3JwY3N0YXQgPSB7Ci0JLnByb2dyYW0JCT0gJm5mc19wcm9ncmFtCi19Owotc3RhdGljIHN0cnVjdCBycGNfdmVyc2lvbiAqCW5mc192ZXJzaW9uW10gPSB7Ci0JTlVMTCwKLQlOVUxMLAotCSZuZnNfdmVyc2lvbjIsCi0jaWYgZGVmaW5lZChDT05GSUdfTkZTX1YzKQotCSZuZnNfdmVyc2lvbjMsCi0jZWxpZiBkZWZpbmVkKENPTkZJR19ORlNfVjQpCi0JTlVMTCwKLSNlbmRpZgotI2lmIGRlZmluZWQoQ09ORklHX05GU19WNCkKLQkmbmZzX3ZlcnNpb240LAotI2VuZGlmCi19OwotCi1zdGF0aWMgc3RydWN0IHJwY19wcm9ncmFtCW5mc19wcm9ncmFtID0gewotCS5uYW1lCQkJPSAibmZzIiwKLQkubnVtYmVyCQkJPSBORlNfUFJPR1JBTSwKLQkubnJ2ZXJzCQkJPSBBUlJBWV9TSVpFKG5mc192ZXJzaW9uKSwKLQkudmVyc2lvbgkJPSBuZnNfdmVyc2lvbiwKLQkuc3RhdHMJCQk9ICZuZnNfcnBjc3RhdCwKLQkucGlwZV9kaXJfbmFtZQkJPSAiL25mcyIsCi19OwotCi0jaWZkZWYgQ09ORklHX05GU19WM19BQ0wKLXN0YXRpYyBzdHJ1Y3QgcnBjX3N0YXQJCW5mc2FjbF9ycGNzdGF0ID0geyAmbmZzYWNsX3Byb2dyYW0gfTsKLXN0YXRpYyBzdHJ1Y3QgcnBjX3ZlcnNpb24gKgluZnNhY2xfdmVyc2lvbltdID0gewotCVszXQkJCT0gJm5mc2FjbF92ZXJzaW9uMywKLX07Ci0KLXN0cnVjdCBycGNfcHJvZ3JhbQkJbmZzYWNsX3Byb2dyYW0gPSB7Ci0JLm5hbWUgPQkJCSJuZnNhY2wiLAotCS5udW1iZXIgPQkJTkZTX0FDTF9QUk9HUkFNLAotCS5ucnZlcnMgPQkJQVJSQVlfU0laRShuZnNhY2xfdmVyc2lvbiksCi0JLnZlcnNpb24gPQkJbmZzYWNsX3ZlcnNpb24sCi0JLnN0YXRzID0JCSZuZnNhY2xfcnBjc3RhdCwKLX07Ci0jZW5kaWYgIC8qIENPTkZJR19ORlNfVjNfQUNMICovCitzdGF0aWMga21lbV9jYWNoZV90ICogbmZzX2lub2RlX2NhY2hlcDsKIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCiBuZnNfZmF0dHJfdG9faW5vX3Qoc3RydWN0IG5mc19mYXR0ciAqZmF0dHIpCkBAIC0xMzQsOCArNjQsNyBAQAogCXJldHVybiBuZnNfZmlsZWlkX3RvX2lub190KGZhdHRyLT5maWxlaWQpOwogfQogCi1zdGF0aWMgaW50Ci1uZnNfd3JpdGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgaW50IHN5bmMpCitpbnQgbmZzX3dyaXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBzeW5jKQogewogCWludCBmbGFncyA9IHN5bmMgPyBGTFVTSF9TWU5DIDogMDsKIAlpbnQgcmV0OwpAQCAtMTQ2LDMxICs3NSwxNSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZAotbmZzX2RlbGV0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKiBpbm9kZSkKLXsKLQlkcHJpbnRrKCJORlM6IGRlbGV0ZV9pbm9kZSglcy8lbGQpXG4iLCBpbm9kZS0+aV9zYi0+c19pZCwgaW5vZGUtPmlfaW5vKTsKLQotCXRydW5jYXRlX2lub2RlX3BhZ2VzKCZpbm9kZS0+aV9kYXRhLCAwKTsKLQotCW5mc193Yl9hbGwoaW5vZGUpOwotCS8qCi0JICogVGhlIGZvbGxvd2luZyBzaG91bGQgbmV2ZXIgaGFwcGVuLi4uCi0JICovCi0JaWYgKG5mc19oYXZlX3dyaXRlYmFja3MoaW5vZGUpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAibmZzX2RlbGV0ZV9pbm9kZTogaW5vZGUgJWxkIGhhcyBwZW5kaW5nIFJQQyByZXF1ZXN0c1xuIiwgaW5vZGUtPmlfaW5vKTsKLQl9Ci0KLQljbGVhcl9pbm9kZShpbm9kZSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1uZnNfY2xlYXJfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3ZvaWQgbmZzX2NsZWFyX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CiAJc3RydWN0IG5mc19pbm9kZSAqbmZzaSA9IE5GU19JKGlub2RlKTsKIAlzdHJ1Y3QgcnBjX2NyZWQgKmNyZWQ7CiAKLQluZnNfd2JfYWxsKGlub2RlKTsKKwkvKgorCSAqIFRoZSBmb2xsb3dpbmcgc2hvdWxkIG5ldmVyIGhhcHBlbi4uLgorCSAqLworCUJVR19PTihuZnNfaGF2ZV93cml0ZWJhY2tzKGlub2RlKSk7CiAJQlVHX09OICghbGlzdF9lbXB0eSgmbmZzaS0+b3Blbl9maWxlcykpOwogCW5mc196YXBfYWNsX2NhY2hlKGlub2RlKTsKIAljcmVkID0gbmZzaS0+Y2FjaGVfYWNjZXNzLmNyZWQ7CkBAIC0xNzksNTU1ICs5Miw2IEBACiAJQlVHX09OKGF0b21pY19yZWFkKCZuZnNpLT5kYXRhX3VwZGF0ZXMpICE9IDApOwogfQogCi12b2lkCi1uZnNfdW1vdW50X2JlZ2luKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCi17Ci0Jc3RydWN0IHJwY19jbG50CSpycGMgPSBORlNfU0Ioc2IpLT5jbGllbnQ7Ci0KLQkvKiAtRUlPIGFsbCBwZW5kaW5nIEkvTyAqLwotCWlmICghSVNfRVJSKHJwYykpCi0JCXJwY19raWxsYWxsX3Rhc2tzKHJwYyk7Ci0JcnBjID0gTkZTX1NCKHNiKS0+Y2xpZW50X2FjbDsKLQlpZiAoIUlTX0VSUihycGMpKQotCQlycGNfa2lsbGFsbF90YXNrcyhycGMpOwotfQotCi0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZwotbmZzX2Jsb2NrX2JpdHModW5zaWduZWQgbG9uZyBic2l6ZSwgdW5zaWduZWQgY2hhciAqbnJiaXRzcCkKLXsKLQkvKiBtYWtlIHN1cmUgYmxvY2tzaXplIGlzIGEgcG93ZXIgb2YgdHdvICovCi0JaWYgKChic2l6ZSAmIChic2l6ZSAtIDEpKSB8fCBucmJpdHNwKSB7Ci0JCXVuc2lnbmVkIGNoYXIJbnJiaXRzOwotCi0JCWZvciAobnJiaXRzID0gMzE7IG5yYml0cyAmJiAhKGJzaXplICYgKDEgPDwgbnJiaXRzKSk7IG5yYml0cy0tKQotCQkJOwotCQlic2l6ZSA9IDEgPDwgbnJiaXRzOwotCQlpZiAobnJiaXRzcCkKLQkJCSpucmJpdHNwID0gbnJiaXRzOwotCX0KLQotCXJldHVybiBic2l6ZTsKLX0KLQotLyoKLSAqIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIDUxMmJ5dGUgYmxvY2tzIHVzZWQuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZwotbmZzX2NhbGNfYmxvY2tfc2l6ZSh1NjQgdHNpemUpCi17Ci0JbG9mZl90IHVzZWQgPSAodHNpemUgKyA1MTEpID4+IDk7Ci0JcmV0dXJuICh1c2VkID4gVUxPTkdfTUFYKSA/IFVMT05HX01BWCA6IHVzZWQ7Ci19Ci0KLS8qCi0gKiBDb21wdXRlIGFuZCBzZXQgTkZTIHNlcnZlciBibG9ja3NpemUKLSAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCi1uZnNfYmxvY2tfc2l6ZSh1bnNpZ25lZCBsb25nIGJzaXplLCB1bnNpZ25lZCBjaGFyICpucmJpdHNwKQotewotCWlmIChic2l6ZSA8IE5GU19NSU5fRklMRV9JT19TSVpFKQotCQlic2l6ZSA9IE5GU19ERUZfRklMRV9JT19TSVpFOwotCWVsc2UgaWYgKGJzaXplID49IE5GU19NQVhfRklMRV9JT19TSVpFKQotCQlic2l6ZSA9IE5GU19NQVhfRklMRV9JT19TSVpFOwotCi0JcmV0dXJuIG5mc19ibG9ja19iaXRzKGJzaXplLCBucmJpdHNwKTsKLX0KLQotLyoKLSAqIE9idGFpbiB0aGUgcm9vdCBpbm9kZSBvZiB0aGUgZmlsZSBzeXN0ZW0uCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgaW5vZGUgKgotbmZzX2dldF9yb290KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBuZnNfZmggKnJvb3RmaCwgc3RydWN0IG5mc19mc2luZm8gKmZzaW5mbykKLXsKLQlzdHJ1Y3QgbmZzX3NlcnZlcgkqc2VydmVyID0gTkZTX1NCKHNiKTsKLQlpbnQJCQllcnJvcjsKLQotCWVycm9yID0gc2VydmVyLT5ycGNfb3BzLT5nZXRyb290KHNlcnZlciwgcm9vdGZoLCBmc2luZm8pOwotCWlmIChlcnJvciA8IDApIHsKLQkJZHByaW50aygibmZzX2dldF9yb290OiBnZXRhdHRyIGVycm9yID0gJWRcbiIsIC1lcnJvcik7Ci0JCXJldHVybiBFUlJfUFRSKGVycm9yKTsKLQl9Ci0KLQlyZXR1cm4gbmZzX2ZoZ2V0KHNiLCByb290ZmgsIGZzaW5mby0+ZmF0dHIpOwotfQotCi0vKgotICogRG8gTkZTIHZlcnNpb24taW5kZXBlbmRlbnQgbW91bnQgcHJvY2Vzc2luZywgYW5kIHNhbml0eSBjaGVja2luZwotICovCi1zdGF0aWMgaW50Ci1uZnNfc2JfaW5pdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBycGNfYXV0aGZsYXZvcl90IGF1dGhmbGF2b3IpCi17Ci0Jc3RydWN0IG5mc19zZXJ2ZXIJKnNlcnZlcjsKLQlzdHJ1Y3QgaW5vZGUJCSpyb290X2lub2RlOwotCXN0cnVjdCBuZnNfZmF0dHIJZmF0dHI7Ci0Jc3RydWN0IG5mc19mc2luZm8JZnNpbmZvID0gewotCQkJCQkuZmF0dHIgPSAmZmF0dHIsCi0JCQkJfTsKLQlzdHJ1Y3QgbmZzX3BhdGhjb25mIHBhdGhpbmZvID0gewotCQkJLmZhdHRyID0gJmZhdHRyLAotCX07Ci0JaW50IG5vX3Jvb3RfZXJyb3IgPSAwOwotCXVuc2lnbmVkIGxvbmcgbWF4X3JwY19wYXlsb2FkOwotCi0JLyogV2UgcHJvYmFibHkgd2FudCBzb21ldGhpbmcgbW9yZSBpbmZvcm1hdGl2ZSBoZXJlICovCi0Jc25wcmludGYoc2ItPnNfaWQsIHNpemVvZihzYi0+c19pZCksICIleDoleCIsIE1BSk9SKHNiLT5zX2RldiksIE1JTk9SKHNiLT5zX2RldikpOwotCi0Jc2VydmVyID0gTkZTX1NCKHNiKTsKLQotCXNiLT5zX21hZ2ljICAgICAgPSBORlNfU1VQRVJfTUFHSUM7Ci0KLQlzZXJ2ZXItPmlvX3N0YXRzID0gbmZzX2FsbG9jX2lvc3RhdHMoKTsKLQlpZiAoc2VydmVyLT5pb19zdGF0cyA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXJvb3RfaW5vZGUgPSBuZnNfZ2V0X3Jvb3Qoc2IsICZzZXJ2ZXItPmZoLCAmZnNpbmZvKTsKLQkvKiBEaWQgZ2V0dGluZyB0aGUgcm9vdCBpbm9kZSBmYWlsPyAqLwotCWlmIChJU19FUlIocm9vdF9pbm9kZSkpIHsKLQkJbm9fcm9vdF9lcnJvciA9IFBUUl9FUlIocm9vdF9pbm9kZSk7Ci0JCWdvdG8gb3V0X25vX3Jvb3Q7Ci0JfQotCXNiLT5zX3Jvb3QgPSBkX2FsbG9jX3Jvb3Qocm9vdF9pbm9kZSk7Ci0JaWYgKCFzYi0+c19yb290KSB7Ci0JCW5vX3Jvb3RfZXJyb3IgPSAtRU5PTUVNOwotCQlnb3RvIG91dF9ub19yb290OwotCX0KLQlzYi0+c19yb290LT5kX29wID0gc2VydmVyLT5ycGNfb3BzLT5kZW50cnlfb3BzOwotCi0JLyogbW91bnQgdGltZSBzdGFtcCwgaW4gc2Vjb25kcyAqLwotCXNlcnZlci0+bW91bnRfdGltZSA9IGppZmZpZXM7Ci0KLQkvKiBHZXQgc29tZSBnZW5lcmFsIGZpbGUgc3lzdGVtIGluZm8gKi8KLQlpZiAoc2VydmVyLT5uYW1lbGVuID09IDAgJiYKLQkgICAgc2VydmVyLT5ycGNfb3BzLT5wYXRoY29uZihzZXJ2ZXIsICZzZXJ2ZXItPmZoLCAmcGF0aGluZm8pID49IDApCi0JCXNlcnZlci0+bmFtZWxlbiA9IHBhdGhpbmZvLm1heF9uYW1lbGVuOwotCS8qIFdvcmsgb3V0IGEgbG90IG9mIHBhcmFtZXRlcnMgKi8KLQlpZiAoc2VydmVyLT5yc2l6ZSA9PSAwKQotCQlzZXJ2ZXItPnJzaXplID0gbmZzX2Jsb2NrX3NpemUoZnNpbmZvLnJ0cHJlZiwgTlVMTCk7Ci0JaWYgKHNlcnZlci0+d3NpemUgPT0gMCkKLQkJc2VydmVyLT53c2l6ZSA9IG5mc19ibG9ja19zaXplKGZzaW5mby53dHByZWYsIE5VTEwpOwotCi0JaWYgKGZzaW5mby5ydG1heCA+PSA1MTIgJiYgc2VydmVyLT5yc2l6ZSA+IGZzaW5mby5ydG1heCkKLQkJc2VydmVyLT5yc2l6ZSA9IG5mc19ibG9ja19zaXplKGZzaW5mby5ydG1heCwgTlVMTCk7Ci0JaWYgKGZzaW5mby53dG1heCA+PSA1MTIgJiYgc2VydmVyLT53c2l6ZSA+IGZzaW5mby53dG1heCkKLQkJc2VydmVyLT53c2l6ZSA9IG5mc19ibG9ja19zaXplKGZzaW5mby53dG1heCwgTlVMTCk7Ci0KLQltYXhfcnBjX3BheWxvYWQgPSBuZnNfYmxvY2tfc2l6ZShycGNfbWF4X3BheWxvYWQoc2VydmVyLT5jbGllbnQpLCBOVUxMKTsKLQlpZiAoc2VydmVyLT5yc2l6ZSA+IG1heF9ycGNfcGF5bG9hZCkKLQkJc2VydmVyLT5yc2l6ZSA9IG1heF9ycGNfcGF5bG9hZDsKLQlpZiAoc2VydmVyLT5yc2l6ZSA+IE5GU19NQVhfRklMRV9JT19TSVpFKQotCQlzZXJ2ZXItPnJzaXplID0gTkZTX01BWF9GSUxFX0lPX1NJWkU7Ci0Jc2VydmVyLT5ycGFnZXMgPSAoc2VydmVyLT5yc2l6ZSArIFBBR0VfQ0FDSEVfU0laRSAtIDEpID4+IFBBR0VfQ0FDSEVfU0hJRlQ7Ci0KLQlpZiAoc2VydmVyLT53c2l6ZSA+IG1heF9ycGNfcGF5bG9hZCkKLQkJc2VydmVyLT53c2l6ZSA9IG1heF9ycGNfcGF5bG9hZDsKLQlpZiAoc2VydmVyLT53c2l6ZSA+IE5GU19NQVhfRklMRV9JT19TSVpFKQotCQlzZXJ2ZXItPndzaXplID0gTkZTX01BWF9GSUxFX0lPX1NJWkU7Ci0Jc2VydmVyLT53cGFnZXMgPSAoc2VydmVyLT53c2l6ZSArIFBBR0VfQ0FDSEVfU0laRSAtIDEpID4+IFBBR0VfQ0FDSEVfU0hJRlQ7Ci0KLQlpZiAoc2ItPnNfYmxvY2tzaXplID09IDApCi0JCXNiLT5zX2Jsb2Nrc2l6ZSA9IG5mc19ibG9ja19iaXRzKHNlcnZlci0+d3NpemUsCi0JCQkJCQkJICZzYi0+c19ibG9ja3NpemVfYml0cyk7Ci0Jc2VydmVyLT53dG11bHQgPSBuZnNfYmxvY2tfYml0cyhmc2luZm8ud3RtdWx0LCBOVUxMKTsKLQotCXNlcnZlci0+ZHRzaXplID0gbmZzX2Jsb2NrX3NpemUoZnNpbmZvLmR0cHJlZiwgTlVMTCk7Ci0JaWYgKHNlcnZlci0+ZHRzaXplID4gUEFHRV9DQUNIRV9TSVpFKQotCQlzZXJ2ZXItPmR0c2l6ZSA9IFBBR0VfQ0FDSEVfU0laRTsKLQlpZiAoc2VydmVyLT5kdHNpemUgPiBzZXJ2ZXItPnJzaXplKQotCQlzZXJ2ZXItPmR0c2l6ZSA9IHNlcnZlci0+cnNpemU7Ci0KLQlpZiAoc2VydmVyLT5mbGFncyAmIE5GU19NT1VOVF9OT0FDKSB7Ci0JCXNlcnZlci0+YWNyZWdtaW4gPSBzZXJ2ZXItPmFjcmVnbWF4ID0gMDsKLQkJc2VydmVyLT5hY2Rpcm1pbiA9IHNlcnZlci0+YWNkaXJtYXggPSAwOwotCQlzYi0+c19mbGFncyB8PSBNU19TWU5DSFJPTk9VUzsKLQl9Ci0Jc2VydmVyLT5iYWNraW5nX2Rldl9pbmZvLnJhX3BhZ2VzID0gc2VydmVyLT5ycGFnZXMgKiBORlNfTUFYX1JFQURBSEVBRDsKLQotCXNiLT5zX21heGJ5dGVzID0gZnNpbmZvLm1heGZpbGVzaXplOwotCWlmIChzYi0+c19tYXhieXRlcyA+IE1BWF9MRlNfRklMRVNJWkUpIAotCQlzYi0+c19tYXhieXRlcyA9IE1BWF9MRlNfRklMRVNJWkU7IAotCi0Jc2VydmVyLT5jbGllbnQtPmNsX2ludHIgPSAoc2VydmVyLT5mbGFncyAmIE5GU19NT1VOVF9JTlRSKSA/IDEgOiAwOwotCXNlcnZlci0+Y2xpZW50LT5jbF9zb2Z0cnRyeSA9IChzZXJ2ZXItPmZsYWdzICYgTkZTX01PVU5UX1NPRlQpID8gMSA6IDA7Ci0KLQkvKiBXZSdyZSBhaXJib3JuZSBTZXQgc29ja2V0IGJ1ZmZlcnNpemUgKi8KLQlycGNfc2V0YnVmc2l6ZShzZXJ2ZXItPmNsaWVudCwgc2VydmVyLT53c2l6ZSArIDEwMCwgc2VydmVyLT5yc2l6ZSArIDEwMCk7Ci0JcmV0dXJuIDA7Ci0JLyogWWFyZ3MuIEl0IGRpZG4ndCB3b3JrIG91dC4gKi8KLW91dF9ub19yb290OgotCWRwcmludGsoIm5mc19zYl9pbml0OiBnZXQgcm9vdCBpbm9kZSBmYWlsZWQ6IGVycm5vICVkXG4iLCAtbm9fcm9vdF9lcnJvcik7Ci0JaWYgKCFJU19FUlIocm9vdF9pbm9kZSkpCi0JCWlwdXQocm9vdF9pbm9kZSk7Ci0JcmV0dXJuIG5vX3Jvb3RfZXJyb3I7Ci19Ci0KLXN0YXRpYyB2b2lkIG5mc19pbml0X3RpbWVvdXRfdmFsdWVzKHN0cnVjdCBycGNfdGltZW91dCAqdG8sIGludCBwcm90bywgdW5zaWduZWQgaW50IHRpbWVvLCB1bnNpZ25lZCBpbnQgcmV0cmFucykKLXsKLQl0by0+dG9faW5pdHZhbCA9IHRpbWVvICogSFogLyAxMDsKLQl0by0+dG9fcmV0cmllcyA9IHJldHJhbnM7Ci0JaWYgKCF0by0+dG9fcmV0cmllcykKLQkJdG8tPnRvX3JldHJpZXMgPSAyOwotCi0Jc3dpdGNoIChwcm90bykgewotCWNhc2UgSVBQUk9UT19UQ1A6Ci0JCWlmICghdG8tPnRvX2luaXR2YWwpCi0JCQl0by0+dG9faW5pdHZhbCA9IDYwICogSFo7Ci0JCWlmICh0by0+dG9faW5pdHZhbCA+IE5GU19NQVhfVENQX1RJTUVPVVQpCi0JCQl0by0+dG9faW5pdHZhbCA9IE5GU19NQVhfVENQX1RJTUVPVVQ7Ci0JCXRvLT50b19pbmNyZW1lbnQgPSB0by0+dG9faW5pdHZhbDsKLQkJdG8tPnRvX21heHZhbCA9IHRvLT50b19pbml0dmFsICsgKHRvLT50b19pbmNyZW1lbnQgKiB0by0+dG9fcmV0cmllcyk7Ci0JCXRvLT50b19leHBvbmVudGlhbCA9IDA7Ci0JCWJyZWFrOwotCWNhc2UgSVBQUk9UT19VRFA6Ci0JZGVmYXVsdDoKLQkJaWYgKCF0by0+dG9faW5pdHZhbCkKLQkJCXRvLT50b19pbml0dmFsID0gMTEgKiBIWiAvIDEwOwotCQlpZiAodG8tPnRvX2luaXR2YWwgPiBORlNfTUFYX1VEUF9USU1FT1VUKQotCQkJdG8tPnRvX2luaXR2YWwgPSBORlNfTUFYX1VEUF9USU1FT1VUOwotCQl0by0+dG9fbWF4dmFsID0gTkZTX01BWF9VRFBfVElNRU9VVDsKLQkJdG8tPnRvX2V4cG9uZW50aWFsID0gMTsKLQkJYnJlYWs7Ci0JfQotfQotCi0vKgotICogQ3JlYXRlIGFuIFJQQyBjbGllbnQgaGFuZGxlLgotICovCi1zdGF0aWMgc3RydWN0IHJwY19jbG50ICoKLW5mc19jcmVhdGVfY2xpZW50KHN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIsIGNvbnN0IHN0cnVjdCBuZnNfbW91bnRfZGF0YSAqZGF0YSkKLXsKLQlzdHJ1Y3QgcnBjX3RpbWVvdXQJdGltZXBhcm1zOwotCXN0cnVjdCBycGNfeHBydAkJKnhwcnQgPSBOVUxMOwotCXN0cnVjdCBycGNfY2xudAkJKmNsbnQgPSBOVUxMOwotCWludAkJCXByb3RvID0gKGRhdGEtPmZsYWdzICYgTkZTX01PVU5UX1RDUCkgPyBJUFBST1RPX1RDUCA6IElQUFJPVE9fVURQOwotCi0JbmZzX2luaXRfdGltZW91dF92YWx1ZXMoJnRpbWVwYXJtcywgcHJvdG8sIGRhdGEtPnRpbWVvLCBkYXRhLT5yZXRyYW5zKTsKLQotCXNlcnZlci0+cmV0cmFuc190aW1lbyA9IHRpbWVwYXJtcy50b19pbml0dmFsOwotCXNlcnZlci0+cmV0cmFuc19jb3VudCA9IHRpbWVwYXJtcy50b19yZXRyaWVzOwotCi0JLyogY3JlYXRlIHRyYW5zcG9ydCBhbmQgY2xpZW50ICovCi0JeHBydCA9IHhwcnRfY3JlYXRlX3Byb3RvKHByb3RvLCAmc2VydmVyLT5hZGRyLCAmdGltZXBhcm1zKTsKLQlpZiAoSVNfRVJSKHhwcnQpKSB7Ci0JCWRwcmludGsoIiVzOiBjYW5ub3QgY3JlYXRlIFJQQyB0cmFuc3BvcnQuIEVycm9yID0gJWxkXG4iLAotCQkJCV9fRlVOQ1RJT05fXywgUFRSX0VSUih4cHJ0KSk7Ci0JCXJldHVybiAoc3RydWN0IHJwY19jbG50ICopeHBydDsKLQl9Ci0JY2xudCA9IHJwY19jcmVhdGVfY2xpZW50KHhwcnQsIHNlcnZlci0+aG9zdG5hbWUsICZuZnNfcHJvZ3JhbSwKLQkJCQkgc2VydmVyLT5ycGNfb3BzLT52ZXJzaW9uLCBkYXRhLT5wc2V1ZG9mbGF2b3IpOwotCWlmIChJU19FUlIoY2xudCkpIHsKLQkJZHByaW50aygiJXM6IGNhbm5vdCBjcmVhdGUgUlBDIGNsaWVudC4gRXJyb3IgPSAlbGRcbiIsCi0JCQkJX19GVU5DVElPTl9fLCBQVFJfRVJSKHhwcnQpKTsKLQkJZ290byBvdXRfZmFpbDsKLQl9Ci0KLQljbG50LT5jbF9pbnRyICAgICA9IDE7Ci0JY2xudC0+Y2xfc29mdHJ0cnkgPSAxOwotCi0JcmV0dXJuIGNsbnQ7Ci0KLW91dF9mYWlsOgotCXJldHVybiBjbG50OwotfQotCi0vKgotICogVGhlIHdheSB0aGlzIHdvcmtzIGlzIHRoYXQgdGhlIG1vdW50IHByb2Nlc3MgcGFzc2VzIGEgc3RydWN0dXJlCi0gKiBpbiB0aGUgZGF0YSBhcmd1bWVudCB3aGljaCBjb250YWlucyB0aGUgc2VydmVyJ3MgSVAgYWRkcmVzcwotICogYW5kIHRoZSByb290IGZpbGUgaGFuZGxlIG9idGFpbmVkIGZyb20gdGhlIHNlcnZlcidzIG1vdW50Ci0gKiBkYWVtb24uIFdlIHN0YXNoIHRoZXNlIGF3YXkgaW4gdGhlIHByaXZhdGUgc3VwZXJibG9jayBmaWVsZHMuCi0gKi8KLXN0YXRpYyBpbnQKLW5mc19maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBuZnNfbW91bnRfZGF0YSAqZGF0YSwgaW50IHNpbGVudCkKLXsKLQlzdHJ1Y3QgbmZzX3NlcnZlcgkqc2VydmVyOwotCXJwY19hdXRoZmxhdm9yX3QJYXV0aGZsYXZvcjsKLQotCXNlcnZlciAgICAgICAgICAgPSBORlNfU0Ioc2IpOwotCXNiLT5zX2Jsb2Nrc2l6ZV9iaXRzID0gMDsKLQlzYi0+c19ibG9ja3NpemUgPSAwOwotCWlmIChkYXRhLT5ic2l6ZSkKLQkJc2ItPnNfYmxvY2tzaXplID0gbmZzX2Jsb2NrX3NpemUoZGF0YS0+YnNpemUsICZzYi0+c19ibG9ja3NpemVfYml0cyk7Ci0JaWYgKGRhdGEtPnJzaXplKQotCQlzZXJ2ZXItPnJzaXplID0gbmZzX2Jsb2NrX3NpemUoZGF0YS0+cnNpemUsIE5VTEwpOwotCWlmIChkYXRhLT53c2l6ZSkKLQkJc2VydmVyLT53c2l6ZSA9IG5mc19ibG9ja19zaXplKGRhdGEtPndzaXplLCBOVUxMKTsKLQlzZXJ2ZXItPmZsYWdzICAgID0gZGF0YS0+ZmxhZ3MgJiBORlNfTU9VTlRfRkxBR01BU0s7Ci0KLQlzZXJ2ZXItPmFjcmVnbWluID0gZGF0YS0+YWNyZWdtaW4qSFo7Ci0Jc2VydmVyLT5hY3JlZ21heCA9IGRhdGEtPmFjcmVnbWF4KkhaOwotCXNlcnZlci0+YWNkaXJtaW4gPSBkYXRhLT5hY2Rpcm1pbipIWjsKLQlzZXJ2ZXItPmFjZGlybWF4ID0gZGF0YS0+YWNkaXJtYXgqSFo7Ci0KLQkvKiBTdGFydCBsb2NrZCBoZXJlLCBiZWZvcmUgd2UgbWlnaHQgZXJyb3Igb3V0ICovCi0JaWYgKCEoc2VydmVyLT5mbGFncyAmIE5GU19NT1VOVF9OT05MTSkpCi0JCWxvY2tkX3VwKCk7Ci0KLQlzZXJ2ZXItPm5hbWVsZW4gID0gZGF0YS0+bmFtbGVuOwotCXNlcnZlci0+aG9zdG5hbWUgPSBrbWFsbG9jKHN0cmxlbihkYXRhLT5ob3N0bmFtZSkgKyAxLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXNlcnZlci0+aG9zdG5hbWUpCi0JCXJldHVybiAtRU5PTUVNOwotCXN0cmNweShzZXJ2ZXItPmhvc3RuYW1lLCBkYXRhLT5ob3N0bmFtZSk7Ci0KLQkvKiBDaGVjayBORlMgcHJvdG9jb2wgcmV2aXNpb24gYW5kIGluaXRpYWxpemUgUlBDIG9wIHZlY3RvcgotCSAqIGFuZCBmaWxlIGhhbmRsZSBwb29sLiAqLwotI2lmZGVmIENPTkZJR19ORlNfVjMKLQlpZiAoc2VydmVyLT5mbGFncyAmIE5GU19NT1VOVF9WRVIzKSB7Ci0JCXNlcnZlci0+cnBjX29wcyA9ICZuZnNfdjNfY2xpZW50b3BzOwotCQlzZXJ2ZXItPmNhcHMgfD0gTkZTX0NBUF9SRUFERElSUExVUzsKLQl9IGVsc2UgewotCQlzZXJ2ZXItPnJwY19vcHMgPSAmbmZzX3YyX2NsaWVudG9wczsKLQl9Ci0jZWxzZQotCXNlcnZlci0+cnBjX29wcyA9ICZuZnNfdjJfY2xpZW50b3BzOwotI2VuZGlmCi0KLQkvKiBGaWxsIGluIHBzZXVkb2ZsYXZvciBmb3IgbW91bnQgdmVyc2lvbiA8IDUgKi8KLQlpZiAoIShkYXRhLT5mbGFncyAmIE5GU19NT1VOVF9TRUNGTEFWT1VSKSkKLQkJZGF0YS0+cHNldWRvZmxhdm9yID0gUlBDX0FVVEhfVU5JWDsKLQlhdXRoZmxhdm9yID0gZGF0YS0+cHNldWRvZmxhdm9yOwkvKiBzYXZlIGZvciBzYl9pbml0KCkgKi8KLQkvKiBYWFggbWF5YmUgd2Ugd2FudCB0byBhZGQgYSBzZXJ2ZXItPnBzZXVkb2ZsYXZvciBmaWVsZCAqLwotCi0JLyogQ3JlYXRlIFJQQyBjbGllbnQgaGFuZGxlcyAqLwotCXNlcnZlci0+Y2xpZW50ID0gbmZzX2NyZWF0ZV9jbGllbnQoc2VydmVyLCBkYXRhKTsKLQlpZiAoSVNfRVJSKHNlcnZlci0+Y2xpZW50KSkKLQkJcmV0dXJuIFBUUl9FUlIoc2VydmVyLT5jbGllbnQpOwotCS8qIFJGQyAyNjIzLCBzZWMgMi4zLjIgKi8KLQlpZiAoYXV0aGZsYXZvciAhPSBSUENfQVVUSF9VTklYKSB7Ci0JCXN0cnVjdCBycGNfYXV0aCAqYXV0aDsKLQotCQlzZXJ2ZXItPmNsaWVudF9zeXMgPSBycGNfY2xvbmVfY2xpZW50KHNlcnZlci0+Y2xpZW50KTsKLQkJaWYgKElTX0VSUihzZXJ2ZXItPmNsaWVudF9zeXMpKQotCQkJcmV0dXJuIFBUUl9FUlIoc2VydmVyLT5jbGllbnRfc3lzKTsKLQkJYXV0aCA9IHJwY2F1dGhfY3JlYXRlKFJQQ19BVVRIX1VOSVgsIHNlcnZlci0+Y2xpZW50X3N5cyk7Ci0JCWlmIChJU19FUlIoYXV0aCkpCi0JCQlyZXR1cm4gUFRSX0VSUihhdXRoKTsKLQl9IGVsc2UgewotCQlhdG9taWNfaW5jKCZzZXJ2ZXItPmNsaWVudC0+Y2xfY291bnQpOwotCQlzZXJ2ZXItPmNsaWVudF9zeXMgPSBzZXJ2ZXItPmNsaWVudDsKLQl9Ci0JaWYgKHNlcnZlci0+ZmxhZ3MgJiBORlNfTU9VTlRfVkVSMykgewotI2lmZGVmIENPTkZJR19ORlNfVjNfQUNMCi0JCWlmICghKHNlcnZlci0+ZmxhZ3MgJiBORlNfTU9VTlRfTk9BQ0wpKSB7Ci0JCQlzZXJ2ZXItPmNsaWVudF9hY2wgPSBycGNfYmluZF9uZXdfcHJvZ3JhbShzZXJ2ZXItPmNsaWVudCwgJm5mc2FjbF9wcm9ncmFtLCAzKTsKLQkJCS8qIE5vIGVycm9ycyEgQXNzdW1lIHRoYXQgU3VuIG5mc2FjbHMgYXJlIHN1cHBvcnRlZCAqLwotCQkJaWYgKCFJU19FUlIoc2VydmVyLT5jbGllbnRfYWNsKSkKLQkJCQlzZXJ2ZXItPmNhcHMgfD0gTkZTX0NBUF9BQ0xTOwotCQl9Ci0jZWxzZQotCQlzZXJ2ZXItPmZsYWdzICY9IH5ORlNfTU9VTlRfTk9BQ0w7Ci0jZW5kaWYgLyogQ09ORklHX05GU19WM19BQ0wgKi8KLQkJLyoKLQkJICogVGhlIFZGUyBzaG91bGRuJ3QgYXBwbHkgdGhlIHVtYXNrIHRvIG1vZGUgYml0cy4gV2Ugd2lsbAotCQkgKiBkbyBzbyBvdXJzZWx2ZXMgd2hlbiBuZWNlc3NhcnkuCi0JCSAqLwotCQlzYi0+c19mbGFncyB8PSBNU19QT1NJWEFDTDsKLQkJaWYgKHNlcnZlci0+bmFtZWxlbiA9PSAwIHx8IHNlcnZlci0+bmFtZWxlbiA+IE5GUzNfTUFYTkFNTEVOKQotCQkJc2VydmVyLT5uYW1lbGVuID0gTkZTM19NQVhOQU1MRU47Ci0JCXNiLT5zX3RpbWVfZ3JhbiA9IDE7Ci0JfSBlbHNlIHsKLQkJaWYgKHNlcnZlci0+bmFtZWxlbiA9PSAwIHx8IHNlcnZlci0+bmFtZWxlbiA+IE5GUzJfTUFYTkFNTEVOKQotCQkJc2VydmVyLT5uYW1lbGVuID0gTkZTMl9NQVhOQU1MRU47Ci0JfQotCi0Jc2ItPnNfb3AgPSAmbmZzX3NvcHM7Ci0JcmV0dXJuIG5mc19zYl9pbml0KHNiLCBhdXRoZmxhdm9yKTsKLX0KLQotc3RhdGljIGludAotbmZzX3N0YXRmcyhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBrc3RhdGZzICpidWYpCi17Ci0Jc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGRlbnRyeS0+ZF9zYjsKLQlzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyID0gTkZTX1NCKHNiKTsKLQl1bnNpZ25lZCBjaGFyIGJsb2NrYml0czsKLQl1bnNpZ25lZCBsb25nIGJsb2NrcmVzOwotCXN0cnVjdCBuZnNfZmggKnJvb3RmaCA9IE5GU19GSChzYi0+c19yb290LT5kX2lub2RlKTsKLQlzdHJ1Y3QgbmZzX2ZhdHRyIGZhdHRyOwotCXN0cnVjdCBuZnNfZnNzdGF0IHJlcyA9IHsKLQkJCS5mYXR0ciA9ICZmYXR0ciwKLQl9OwotCWludCBlcnJvcjsKLQotCWxvY2tfa2VybmVsKCk7Ci0KLQllcnJvciA9IHNlcnZlci0+cnBjX29wcy0+c3RhdGZzKHNlcnZlciwgcm9vdGZoLCAmcmVzKTsKLQlidWYtPmZfdHlwZSA9IE5GU19TVVBFUl9NQUdJQzsKLQlpZiAoZXJyb3IgPCAwKQotCQlnb3RvIG91dF9lcnI7Ci0KLQkvKgotCSAqIEN1cnJlbnQgdmVyc2lvbnMgb2YgZ2xpYmMgZG8gbm90IGNvcnJlY3RseSBoYW5kbGUgdGhlCi0JICogY2FzZSB3aGVyZSBmX2Zyc2l6ZSAhPSBmX2JzaXplLiAgRXZlbnR1YWxseSB3ZSB3YW50IHRvCi0JICogcmVwb3J0IHRoZSB2YWx1ZSBvZiB3dG11bHQgaW4gdGhpcyBmaWVsZC4KLQkgKi8KLQlidWYtPmZfZnJzaXplID0gc2ItPnNfYmxvY2tzaXplOwotCi0JLyoKLQkgKiBPbiBtb3N0ICpuaXggc3lzdGVtcywgZl9ibG9ja3MsIGZfYmZyZWUsIGFuZCBmX2JhdmFpbAotCSAqIGFyZSByZXBvcnRlZCBpbiB1bml0cyBvZiBmX2Zyc2l6ZS4gIExpbnV4IGhhc24ndCBoYWQKLQkgKiBhbiBmX2Zyc2l6ZSBmaWVsZCBpbiBpdHMgc3RhdGZzIHN0cnVjdCB1bnRpbCByZWNlbnRseSwKLQkgKiB0aHVzIGhpc3RvcmljYWxseSBMaW51eCdzIHN5c19zdGF0ZnMgcmVwb3J0cyB0aGVzZQotCSAqIGZpZWxkcyBpbiB1bml0cyBvZiBmX2JzaXplLgotCSAqLwotCWJ1Zi0+Zl9ic2l6ZSA9IHNiLT5zX2Jsb2Nrc2l6ZTsKLQlibG9ja2JpdHMgPSBzYi0+c19ibG9ja3NpemVfYml0czsKLQlibG9ja3JlcyA9ICgxIDw8IGJsb2NrYml0cykgLSAxOwotCWJ1Zi0+Zl9ibG9ja3MgPSAocmVzLnRieXRlcyArIGJsb2NrcmVzKSA+PiBibG9ja2JpdHM7Ci0JYnVmLT5mX2JmcmVlID0gKHJlcy5mYnl0ZXMgKyBibG9ja3JlcykgPj4gYmxvY2tiaXRzOwotCWJ1Zi0+Zl9iYXZhaWwgPSAocmVzLmFieXRlcyArIGJsb2NrcmVzKSA+PiBibG9ja2JpdHM7Ci0KLQlidWYtPmZfZmlsZXMgPSByZXMudGZpbGVzOwotCWJ1Zi0+Zl9mZnJlZSA9IHJlcy5hZmlsZXM7Ci0KLQlidWYtPmZfbmFtZWxlbiA9IHNlcnZlci0+bmFtZWxlbjsKLSBvdXQ6Ci0JdW5sb2NrX2tlcm5lbCgpOwotCXJldHVybiAwOwotCi0gb3V0X2VycjoKLQlkcHJpbnRrKCIlczogc3RhdGZzIGVycm9yID0gJWRcbiIsIF9fRlVOQ1RJT05fXywgLWVycm9yKTsKLQlidWYtPmZfYnNpemUgPSBidWYtPmZfYmxvY2tzID0gYnVmLT5mX2JmcmVlID0gYnVmLT5mX2JhdmFpbCA9IC0xOwotCWdvdG8gb3V0OwotCi19Ci0KLXN0YXRpYyB2b2lkIG5mc19zaG93X21vdW50X29wdGlvbnMoc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3QgbmZzX3NlcnZlciAqbmZzcywgaW50IHNob3dkZWZhdWx0cykKLXsKLQlzdGF0aWMgc3RydWN0IHByb2NfbmZzX2luZm8gewotCQlpbnQgZmxhZzsKLQkJY2hhciAqc3RyOwotCQljaGFyICpub3N0cjsKLQl9IG5mc19pbmZvW10gPSB7Ci0JCXsgTkZTX01PVU5UX1NPRlQsICIsc29mdCIsICIsaGFyZCIgfSwKLQkJeyBORlNfTU9VTlRfSU5UUiwgIixpbnRyIiwgIiIgfSwKLQkJeyBORlNfTU9VTlRfTk9DVE8sICIsbm9jdG8iLCAiIiB9LAotCQl7IE5GU19NT1VOVF9OT0FDLCAiLG5vYWMiLCAiIiB9LAotCQl7IE5GU19NT1VOVF9OT05MTSwgIixub2xvY2siLCAiIiB9LAotCQl7IE5GU19NT1VOVF9OT0FDTCwgIixub2FjbCIsICIiIH0sCi0JCXsgMCwgTlVMTCwgTlVMTCB9Ci0JfTsKLQlzdHJ1Y3QgcHJvY19uZnNfaW5mbyAqbmZzX2luZm9wOwotCWNoYXIgYnVmWzEyXTsKLQljaGFyICpwcm90bzsKLQotCXNlcV9wcmludGYobSwgIix2ZXJzPSVkIiwgbmZzcy0+cnBjX29wcy0+dmVyc2lvbik7Ci0Jc2VxX3ByaW50ZihtLCAiLHJzaXplPSVkIiwgbmZzcy0+cnNpemUpOwotCXNlcV9wcmludGYobSwgIix3c2l6ZT0lZCIsIG5mc3MtPndzaXplKTsKLQlpZiAobmZzcy0+YWNyZWdtaW4gIT0gMypIWiB8fCBzaG93ZGVmYXVsdHMpCi0JCXNlcV9wcmludGYobSwgIixhY3JlZ21pbj0lZCIsIG5mc3MtPmFjcmVnbWluL0haKTsKLQlpZiAobmZzcy0+YWNyZWdtYXggIT0gNjAqSFogfHwgc2hvd2RlZmF1bHRzKQotCQlzZXFfcHJpbnRmKG0sICIsYWNyZWdtYXg9JWQiLCBuZnNzLT5hY3JlZ21heC9IWik7Ci0JaWYgKG5mc3MtPmFjZGlybWluICE9IDMwKkhaIHx8IHNob3dkZWZhdWx0cykKLQkJc2VxX3ByaW50ZihtLCAiLGFjZGlybWluPSVkIiwgbmZzcy0+YWNkaXJtaW4vSFopOwotCWlmIChuZnNzLT5hY2Rpcm1heCAhPSA2MCpIWiB8fCBzaG93ZGVmYXVsdHMpCi0JCXNlcV9wcmludGYobSwgIixhY2Rpcm1heD0lZCIsIG5mc3MtPmFjZGlybWF4L0haKTsKLQlmb3IgKG5mc19pbmZvcCA9IG5mc19pbmZvOyBuZnNfaW5mb3AtPmZsYWc7IG5mc19pbmZvcCsrKSB7Ci0JCWlmIChuZnNzLT5mbGFncyAmIG5mc19pbmZvcC0+ZmxhZykKLQkJCXNlcV9wdXRzKG0sIG5mc19pbmZvcC0+c3RyKTsKLQkJZWxzZQotCQkJc2VxX3B1dHMobSwgbmZzX2luZm9wLT5ub3N0cik7Ci0JfQotCXN3aXRjaCAobmZzcy0+Y2xpZW50LT5jbF94cHJ0LT5wcm90KSB7Ci0JCWNhc2UgSVBQUk9UT19UQ1A6Ci0JCQlwcm90byA9ICJ0Y3AiOwotCQkJYnJlYWs7Ci0JCWNhc2UgSVBQUk9UT19VRFA6Ci0JCQlwcm90byA9ICJ1ZHAiOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJXUiLCBuZnNzLT5jbGllbnQtPmNsX3hwcnQtPnByb3QpOwotCQkJcHJvdG8gPSBidWY7Ci0JfQotCXNlcV9wcmludGYobSwgIixwcm90bz0lcyIsIHByb3RvKTsKLQlzZXFfcHJpbnRmKG0sICIsdGltZW89JWx1IiwgMTBVICogbmZzcy0+cmV0cmFuc190aW1lbyAvIEhaKTsKLQlzZXFfcHJpbnRmKG0sICIscmV0cmFucz0ldSIsIG5mc3MtPnJldHJhbnNfY291bnQpOwotfQotCi1zdGF0aWMgaW50IG5mc19zaG93X29wdGlvbnMoc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3QgdmZzbW91bnQgKm1udCkKLXsKLQlzdHJ1Y3QgbmZzX3NlcnZlciAqbmZzcyA9IE5GU19TQihtbnQtPm1udF9zYik7Ci0KLQluZnNfc2hvd19tb3VudF9vcHRpb25zKG0sIG5mc3MsIDApOwotCi0Jc2VxX3B1dHMobSwgIixhZGRyPSIpOwotCXNlcV9lc2NhcGUobSwgbmZzcy0+aG9zdG5hbWUsICIgXHRcblxcIik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBuZnNfc2hvd19zdGF0cyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCB2ZnNtb3VudCAqbW50KQotewotCWludCBpLCBjcHU7Ci0Jc3RydWN0IG5mc19zZXJ2ZXIgKm5mc3MgPSBORlNfU0IobW50LT5tbnRfc2IpOwotCXN0cnVjdCBycGNfYXV0aCAqYXV0aCA9IG5mc3MtPmNsaWVudC0+Y2xfYXV0aDsKLQlzdHJ1Y3QgbmZzX2lvc3RhdHMgdG90YWxzID0geyB9OwotCi0Jc2VxX3ByaW50ZihtLCAic3RhdHZlcnM9JXMiLCBORlNfSU9TVEFUX1ZFUlMpOwotCi0JLyoKLQkgKiBEaXNwbGF5IGFsbCBtb3VudCBvcHRpb24gc2V0dGluZ3MKLQkgKi8KLQlzZXFfcHJpbnRmKG0sICJcblx0b3B0czpcdCIpOwotCXNlcV9wdXRzKG0sIG1udC0+bW50X3NiLT5zX2ZsYWdzICYgTVNfUkRPTkxZID8gInJvIiA6ICJydyIpOwotCXNlcV9wdXRzKG0sIG1udC0+bW50X3NiLT5zX2ZsYWdzICYgTVNfU1lOQ0hST05PVVMgPyAiLHN5bmMiIDogIiIpOwotCXNlcV9wdXRzKG0sIG1udC0+bW50X3NiLT5zX2ZsYWdzICYgTVNfTk9BVElNRSA/ICIsbm9hdGltZSIgOiAiIik7Ci0Jc2VxX3B1dHMobSwgbW50LT5tbnRfc2ItPnNfZmxhZ3MgJiBNU19OT0RJUkFUSU1FID8gIixub2RpcmF0aW1lIiA6ICIiKTsKLQluZnNfc2hvd19tb3VudF9vcHRpb25zKG0sIG5mc3MsIDEpOwotCi0Jc2VxX3ByaW50ZihtLCAiXG5cdGFnZTpcdCVsdSIsIChqaWZmaWVzIC0gbmZzcy0+bW91bnRfdGltZSkgLyBIWik7Ci0KLQlzZXFfcHJpbnRmKG0sICJcblx0Y2FwczpcdCIpOwotCXNlcV9wcmludGYobSwgImNhcHM9MHgleCIsIG5mc3MtPmNhcHMpOwotCXNlcV9wcmludGYobSwgIix3dG11bHQ9JWQiLCBuZnNzLT53dG11bHQpOwotCXNlcV9wcmludGYobSwgIixkdHNpemU9JWQiLCBuZnNzLT5kdHNpemUpOwotCXNlcV9wcmludGYobSwgIixic2l6ZT0lZCIsIG5mc3MtPmJzaXplKTsKLQlzZXFfcHJpbnRmKG0sICIsbmFtZWxlbj0lZCIsIG5mc3MtPm5hbWVsZW4pOwotCi0jaWZkZWYgQ09ORklHX05GU19WNAotCWlmIChuZnNzLT5ycGNfb3BzLT52ZXJzaW9uID09IDQpIHsKLQkJc2VxX3ByaW50ZihtLCAiXG5cdG5mc3Y0Olx0Iik7Ci0JCXNlcV9wcmludGYobSwgImJtMD0weCV4IiwgbmZzcy0+YXR0cl9iaXRtYXNrWzBdKTsKLQkJc2VxX3ByaW50ZihtLCAiLGJtMT0weCV4IiwgbmZzcy0+YXR0cl9iaXRtYXNrWzFdKTsKLQkJc2VxX3ByaW50ZihtLCAiLGFjbD0weCV4IiwgbmZzcy0+YWNsX2JpdG1hc2spOwotCX0KLSNlbmRpZgotCi0JLyoKLQkgKiBEaXNwbGF5IHNlY3VyaXR5IGZsYXZvciBpbiBlZmZlY3QgZm9yIHRoaXMgbW91bnQKLQkgKi8KLQlzZXFfcHJpbnRmKG0sICJcblx0c2VjOlx0Zmxhdm9yPSVkIiwgYXV0aC0+YXVfb3BzLT5hdV9mbGF2b3IpOwotCWlmIChhdXRoLT5hdV9mbGF2b3IpCi0JCXNlcV9wcmludGYobSwgIixwc2V1ZG9mbGF2b3I9JWQiLCBhdXRoLT5hdV9mbGF2b3IpOwotCi0JLyoKLQkgKiBEaXNwbGF5IHN1cGVyYmxvY2sgSS9PIGNvdW50ZXJzCi0JICovCi0JZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgewotCQlzdHJ1Y3QgbmZzX2lvc3RhdHMgKnN0YXRzOwotCi0JCXByZWVtcHRfZGlzYWJsZSgpOwotCQlzdGF0cyA9IHBlcl9jcHVfcHRyKG5mc3MtPmlvX3N0YXRzLCBjcHUpOwotCi0JCWZvciAoaSA9IDA7IGkgPCBfX05GU0lPU19DT1VOVFNNQVg7IGkrKykKLQkJCXRvdGFscy5ldmVudHNbaV0gKz0gc3RhdHMtPmV2ZW50c1tpXTsKLQkJZm9yIChpID0gMDsgaSA8IF9fTkZTSU9TX0JZVEVTTUFYOyBpKyspCi0JCQl0b3RhbHMuYnl0ZXNbaV0gKz0gc3RhdHMtPmJ5dGVzW2ldOwotCi0JCXByZWVtcHRfZW5hYmxlKCk7Ci0JfQotCi0Jc2VxX3ByaW50ZihtLCAiXG5cdGV2ZW50czpcdCIpOwotCWZvciAoaSA9IDA7IGkgPCBfX05GU0lPU19DT1VOVFNNQVg7IGkrKykKLQkJc2VxX3ByaW50ZihtLCAiJWx1ICIsIHRvdGFscy5ldmVudHNbaV0pOwotCXNlcV9wcmludGYobSwgIlxuXHRieXRlczpcdCIpOwotCWZvciAoaSA9IDA7IGkgPCBfX05GU0lPU19CWVRFU01BWDsgaSsrKQotCQlzZXFfcHJpbnRmKG0sICIlTHUgIiwgdG90YWxzLmJ5dGVzW2ldKTsKLQlzZXFfcHJpbnRmKG0sICJcbiIpOwotCi0JcnBjX3ByaW50X2lvc3RhdHMobSwgbmZzcy0+Y2xpZW50KTsKLQotCXJldHVybiAwOwotfQotCiAvKioKICAqIG5mc19zeW5jX21hcHBpbmcgLSBoZWxwZXIgdG8gZmx1c2ggYWxsIG1tYXBwZWQgZGlydHkgZGF0YSB0byBkaXNrCiAgKi8KQEAgLTg5MCw2ICsyNTQsMTQgQEAKIAkJCWlmIChuZnNfc2VydmVyX2NhcGFibGUoaW5vZGUsIE5GU19DQVBfUkVBRERJUlBMVVMpCiAJCQkgICAgJiYgZmF0dHItPnNpemUgPD0gTkZTX0xJTUlUX1JFQURESVJQTFVTKQogCQkJCXNldF9iaXQoTkZTX0lOT19BRFZJU0VfUkRQTFVTLCAmTkZTX0ZMQUdTKGlub2RlKSk7CisJCQkvKiBEZWFsIHdpdGggY3Jvc3NpbmcgbW91bnRwb2ludHMgKi8KKwkJCWlmICghbmZzX2ZzaWRfZXF1YWwoJk5GU19TQihzYiktPmZzaWQsICZmYXR0ci0+ZnNpZCkpIHsKKwkJCQlpZiAoZmF0dHItPnZhbGlkICYgTkZTX0FUVFJfRkFUVFJfVjRfUkVGRVJSQUwpCisJCQkJCWlub2RlLT5pX29wID0gJm5mc19yZWZlcnJhbF9pbm9kZV9vcGVyYXRpb25zOworCQkJCWVsc2UKKwkJCQkJaW5vZGUtPmlfb3AgPSAmbmZzX21vdW50cG9pbnRfaW5vZGVfb3BlcmF0aW9uczsKKwkJCQlpbm9kZS0+aV9mb3AgPSBOVUxMOworCQkJfQogCQl9IGVsc2UgaWYgKFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpCiAJCQlpbm9kZS0+aV9vcCA9ICZuZnNfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zOwogCQllbHNlCkBAIC0xMjA4LDYgKzU4MCw3IEBACiAJZGZwcmludGsoUEFHRUNBQ0hFLCAiTkZTOiByZXZhbGlkYXRpbmcgKCVzLyVMZClcbiIsCiAJCWlub2RlLT5pX3NiLT5zX2lkLCAobG9uZyBsb25nKU5GU19GSUxFSUQoaW5vZGUpKTsKIAorCW5mc19pbmNfc3RhdHMoaW5vZGUsIE5GU0lPU19JTk9ERVJFVkFMSURBVEUpOwogCWxvY2tfa2VybmVsKCk7CiAJaWYgKCFpbm9kZSB8fCBpc19iYWRfaW5vZGUoaW5vZGUpKQogIAkJZ290byBvdXRfbm93YWl0OwpAQCAtMTIyMSw3ICs1OTQsNyBAQAogCQlzdGF0dXMgPSAtRVNUQUxFOwogCQkvKiBEbyB3ZSB0cnVzdCB0aGUgY2FjaGVkIEVTVEFMRT8gKi8KIAkJaWYgKE5GU19BVFRSVElNRU8oaW5vZGUpICE9IDApIHsKLQkJCWlmIChuZnNpLT5jYWNoZV92YWxpZGl0eSAmIChORlNfSU5PX0lOVkFMSURfQVRUUnxORlNfSU5PX0lOVkFMSURfREFUQXxORlNfSU5PX0lOVkFMSURfQVRJTUUpKSB7CisJCQlpZiAobmZzaS0+Y2FjaGVfdmFsaWRpdHkgJiAoTkZTX0lOT19JTlZBTElEX0FUVFJ8TkZTX0lOT19JTlZBTElEX0FUSU1FKSkgewogCQkJCS8qIG5vICovCiAJCQl9IGVsc2UKIAkJCQlnb3RvIG91dDsKQEAgLTEyNTIsOCArNjI1LDYgQEAKIAl9CiAJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOwogCi0JbmZzX3JldmFsaWRhdGVfbWFwcGluZyhpbm9kZSwgaW5vZGUtPmlfbWFwcGluZyk7Ci0KIAlpZiAobmZzaS0+Y2FjaGVfdmFsaWRpdHkgJiBORlNfSU5PX0lOVkFMSURfQUNMKQogCQluZnNfemFwX2FjbF9jYWNoZShpbm9kZSk7CiAKQEAgLTEyODcsOCArNjU4LDcgQEAKICAqLwogaW50IG5mc19yZXZhbGlkYXRlX2lub2RlKHN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIsIHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7Ci0JbmZzX2luY19zdGF0cyhpbm9kZSwgTkZTSU9TX0lOT0RFUkVWQUxJREFURSk7Ci0JaWYgKCEoTkZTX0koaW5vZGUpLT5jYWNoZV92YWxpZGl0eSAmIChORlNfSU5PX0lOVkFMSURfQVRUUnxORlNfSU5PX0lOVkFMSURfREFUQSkpCisJaWYgKCEoTkZTX0koaW5vZGUpLT5jYWNoZV92YWxpZGl0eSAmIE5GU19JTk9fSU5WQUxJRF9BVFRSKQogCQkJJiYgIW5mc19hdHRyaWJ1dGVfdGltZW91dChpbm9kZSkpCiAJCXJldHVybiBORlNfU1RBTEUoaW5vZGUpID8gLUVTVEFMRSA6IDA7CiAJcmV0dXJuIF9fbmZzX3JldmFsaWRhdGVfaW5vZGUoc2VydmVyLCBpbm9kZSk7CkBAIC0xMjk5LDkgKzY2OSwxNiBAQAogICogQGlub2RlIC0gcG9pbnRlciB0byBob3N0IGlub2RlCiAgKiBAbWFwcGluZyAtIHBvaW50ZXIgdG8gbWFwcGluZwogICovCi12b2lkIG5mc19yZXZhbGlkYXRlX21hcHBpbmcoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcpCitpbnQgbmZzX3JldmFsaWRhdGVfbWFwcGluZyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZykKIHsKIAlzdHJ1Y3QgbmZzX2lub2RlICpuZnNpID0gTkZTX0koaW5vZGUpOworCWludCByZXQgPSAwOworCisJaWYgKE5GU19TVEFMRShpbm9kZSkpCisJCXJldCA9IC1FU1RBTEU7CisJaWYgKChuZnNpLT5jYWNoZV92YWxpZGl0eSAmIE5GU19JTk9fUkVWQUxfUEFHRUNBQ0hFKQorCQkJfHwgbmZzX2F0dHJpYnV0ZV90aW1lb3V0KGlub2RlKSkKKwkJcmV0ID0gX19uZnNfcmV2YWxpZGF0ZV9pbm9kZShORlNfU0VSVkVSKGlub2RlKSwgaW5vZGUpOwogCiAJaWYgKG5mc2ktPmNhY2hlX3ZhbGlkaXR5ICYgTkZTX0lOT19JTlZBTElEX0RBVEEpIHsKIAkJbmZzX2luY19zdGF0cyhpbm9kZSwgTkZTSU9TX0RBVEFJTlZBTElEQVRFKTsKQEAgLTEzMjIsNiArNjk5LDcgQEAKIAkJCQlpbm9kZS0+aV9zYi0+c19pZCwKIAkJCQkobG9uZyBsb25nKU5GU19GSUxFSUQoaW5vZGUpKTsKIAl9CisJcmV0dXJuIHJldDsKIH0KIAogLyoqCkBAIC0xMzYxLDEyICs3MzksNiBAQAogewogCXN0cnVjdCBuZnNfaW5vZGUgKm5mc2kgPSBORlNfSShpbm9kZSk7CiAKLQlpZiAoKGZhdHRyLT52YWxpZCAmIE5GU19BVFRSX1BSRV9DSEFOR0UpICE9IDAKLQkJCSYmIG5mc2ktPmNoYW5nZV9hdHRyID09IGZhdHRyLT5wcmVfY2hhbmdlX2F0dHIpIHsKLQkJbmZzaS0+Y2hhbmdlX2F0dHIgPSBmYXR0ci0+Y2hhbmdlX2F0dHI7Ci0JCW5mc2ktPmNhY2hlX2NoYW5nZV9hdHRyaWJ1dGUgPSBqaWZmaWVzOwotCX0KLQogCS8qIElmIHdlIGhhdmUgYXRvbWljIFdDQyBkYXRhLCB3ZSBtYXkgdXBkYXRlIHNvbWUgYXR0cmlidXRlcyAqLwogCWlmICgoZmF0dHItPnZhbGlkICYgTkZTX0FUVFJfV0NDKSAhPSAwKSB7CiAJCWlmICh0aW1lc3BlY19lcXVhbCgmaW5vZGUtPmlfY3RpbWUsICZmYXR0ci0+cHJlX2N0aW1lKSkgewpAQCAtMTQwMCw5ICs3NzIsNiBAQAogCWludCBkYXRhX3Vuc3RhYmxlOwogCiAKLQlpZiAoKGZhdHRyLT52YWxpZCAmIE5GU19BVFRSX0ZBVFRSKSA9PSAwKQotCQlyZXR1cm4gMDsKLQogCS8qIEhhcyB0aGUgaW5vZGUgZ29uZSBhbmQgY2hhbmdlZCBiZWhpbmQgb3VyIGJhY2s/ICovCiAJaWYgKG5mc2ktPmZpbGVpZCAhPSBmYXR0ci0+ZmlsZWlkCiAJCQl8fCAoaW5vZGUtPmlfbW9kZSAmIFNfSUZNVCkgIT0gKGZhdHRyLT5tb2RlICYgU19JRk1UKSkgewpAQCAtMTQxNSwyMCArNzg0LDEzIEBACiAJLyogRG8gYXRvbWljIHdlYWsgY2FjaGUgY29uc2lzdGVuY3kgdXBkYXRlcyAqLwogCW5mc193Y2NfdXBkYXRlX2lub2RlKGlub2RlLCBmYXR0cik7CiAKLQlpZiAoKGZhdHRyLT52YWxpZCAmIE5GU19BVFRSX0ZBVFRSX1Y0KSAhPSAwKSB7Ci0JCWlmIChuZnNpLT5jaGFuZ2VfYXR0ciA9PSBmYXR0ci0+Y2hhbmdlX2F0dHIpCi0JCQlnb3RvIG91dDsKLQkJbmZzaS0+Y2FjaGVfdmFsaWRpdHkgfD0gTkZTX0lOT19JTlZBTElEX0FUVFI7Ci0JCWlmICghZGF0YV91bnN0YWJsZSkKLQkJCW5mc2ktPmNhY2hlX3ZhbGlkaXR5IHw9IE5GU19JTk9fUkVWQUxfUEFHRUNBQ0hFOwotCX0KKwlpZiAoKGZhdHRyLT52YWxpZCAmIE5GU19BVFRSX0ZBVFRSX1Y0KSAhPSAwICYmCisJCQluZnNpLT5jaGFuZ2VfYXR0ciAhPSBmYXR0ci0+Y2hhbmdlX2F0dHIpCisJCW5mc2ktPmNhY2hlX3ZhbGlkaXR5IHw9IE5GU19JTk9fSU5WQUxJRF9BVFRSfE5GU19JTk9fUkVWQUxfUEFHRUNBQ0hFOwogCiAJLyogVmVyaWZ5IGEgZmV3IG9mIHRoZSBtb3JlIGltcG9ydGFudCBhdHRyaWJ1dGVzICovCi0JaWYgKCF0aW1lc3BlY19lcXVhbCgmaW5vZGUtPmlfbXRpbWUsICZmYXR0ci0+bXRpbWUpKSB7Ci0JCW5mc2ktPmNhY2hlX3ZhbGlkaXR5IHw9IE5GU19JTk9fSU5WQUxJRF9BVFRSOwotCQlpZiAoIWRhdGFfdW5zdGFibGUpCi0JCQluZnNpLT5jYWNoZV92YWxpZGl0eSB8PSBORlNfSU5PX1JFVkFMX1BBR0VDQUNIRTsKLQl9CisJaWYgKCF0aW1lc3BlY19lcXVhbCgmaW5vZGUtPmlfbXRpbWUsICZmYXR0ci0+bXRpbWUpKQorCQluZnNpLT5jYWNoZV92YWxpZGl0eSB8PSBORlNfSU5PX0lOVkFMSURfQVRUUnxORlNfSU5PX1JFVkFMX1BBR0VDQUNIRTsKIAogCWN1cl9zaXplID0gaV9zaXplX3JlYWQoaW5vZGUpOwogIAluZXdfaXNpemUgPSBuZnNfc2l6ZV90b19sb2ZmX3QoZmF0dHItPnNpemUpOwpAQCAtMTQ0NSw3ICs4MDcsNiBAQAogCWlmIChpbm9kZS0+aV9ubGluayAhPSBmYXR0ci0+bmxpbmspCiAJCW5mc2ktPmNhY2hlX3ZhbGlkaXR5IHw9IE5GU19JTk9fSU5WQUxJRF9BVFRSOwogCi1vdXQ6CiAJaWYgKCF0aW1lc3BlY19lcXVhbCgmaW5vZGUtPmlfYXRpbWUsICZmYXR0ci0+YXRpbWUpKQogCQluZnNpLT5jYWNoZV92YWxpZGl0eSB8PSBORlNfSU5PX0lOVkFMSURfQVRJTUU7CiAKQEAgLTE0NzEsNyArODMyLDYgQEAKIAlpZiAoKGZhdHRyLT52YWxpZCAmIE5GU19BVFRSX0ZBVFRSKSA9PSAwKQogCQlyZXR1cm4gMDsKIAlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOwotCW5mc2ktPmNhY2hlX3ZhbGlkaXR5ICY9IH5ORlNfSU5PX1JFVkFMX1BBR0VDQUNIRTsKIAlpZiAodGltZV9hZnRlcihmYXR0ci0+dGltZV9zdGFydCwgbmZzaS0+bGFzdF91cGRhdGVkKSkKIAkJc3RhdHVzID0gbmZzX3VwZGF0ZV9pbm9kZShpbm9kZSwgZmF0dHIpOwogCWVsc2UKQEAgLTE0OTYsNyArODU2LDcgQEAKIAogCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CiAJaWYgKHVubGlrZWx5KChmYXR0ci0+dmFsaWQgJiBORlNfQVRUUl9GQVRUUikgPT0gMCkpIHsKLQkJbmZzaS0+Y2FjaGVfdmFsaWRpdHkgfD0gTkZTX0lOT19JTlZBTElEX0FUVFIgfCBORlNfSU5PX0lOVkFMSURfQUNDRVNTOworCQluZnNpLT5jYWNoZV92YWxpZGl0eSB8PSBORlNfSU5PX0lOVkFMSURfQUNDRVNTfE5GU19JTk9fSU5WQUxJRF9BVFRSfE5GU19JTk9fUkVWQUxfUEFHRUNBQ0hFOwogCQlnb3RvIG91dDsKIAl9CiAJc3RhdHVzID0gbmZzX3VwZGF0ZV9pbm9kZShpbm9kZSwgZmF0dHIpOwpAQCAtMTUxOSw2ICs4NzksNyBAQAogICovCiBzdGF0aWMgaW50IG5mc191cGRhdGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IG5mc19mYXR0ciAqZmF0dHIpCiB7CisJc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlcjsKIAlzdHJ1Y3QgbmZzX2lub2RlICpuZnNpID0gTkZTX0koaW5vZGUpOwogCWxvZmZfdCBjdXJfaXNpemUsIG5ld19pc2l6ZTsKIAl1bnNpZ25lZCBpbnQJaW52YWxpZCA9IDA7CkBAIC0xNTI4LDkgKzg4OSw2IEBACiAJCQlfX0ZVTkNUSU9OX18sIGlub2RlLT5pX3NiLT5zX2lkLCBpbm9kZS0+aV9pbm8sCiAJCQlhdG9taWNfcmVhZCgmaW5vZGUtPmlfY291bnQpLCBmYXR0ci0+dmFsaWQpOwogCi0JaWYgKChmYXR0ci0+dmFsaWQgJiBORlNfQVRUUl9GQVRUUikgPT0gMCkKLQkJcmV0dXJuIDA7Ci0KIAlpZiAobmZzaS0+ZmlsZWlkICE9IGZhdHRyLT5maWxlaWQpCiAJCWdvdG8gb3V0X2ZpbGVpZDsKIApAQCAtMTU0MCw2ICs4OTgsMTIgQEAKIAlpZiAoKGlub2RlLT5pX21vZGUgJiBTX0lGTVQpICE9IChmYXR0ci0+bW9kZSAmIFNfSUZNVCkpCiAJCWdvdG8gb3V0X2NoYW5nZWQ7CiAKKwlzZXJ2ZXIgPSBORlNfU0VSVkVSKGlub2RlKTsKKwkvKiBVcGRhdGUgdGhlIGZzaWQgaWYgYW5kIG9ubHkgaWYgdGhpcyBpcyB0aGUgcm9vdCBkaXJlY3RvcnkgKi8KKwlpZiAoaW5vZGUgPT0gaW5vZGUtPmlfc2ItPnNfcm9vdC0+ZF9pbm9kZQorCQkJJiYgIW5mc19mc2lkX2VxdWFsKCZzZXJ2ZXItPmZzaWQsICZmYXR0ci0+ZnNpZCkpCisJCXNlcnZlci0+ZnNpZCA9IGZhdHRyLT5mc2lkOworCiAJLyoKIAkgKiBVcGRhdGUgdGhlIHJlYWQgdGltZSBzbyB3ZSBkb24ndCByZXZhbGlkYXRlIHRvbyBvZnRlbi4KIAkgKi8KQEAgLTE1NDksNyArOTEzLDcgQEAKIAkvKiBBcmUgd2UgcmFjaW5nIHdpdGgga25vd24gdXBkYXRlcyBvZiB0aGUgbWV0YWRhdGEgb24gdGhlIHNlcnZlcj8gKi8KIAlkYXRhX3N0YWJsZSA9IG5mc192ZXJpZnlfY2hhbmdlX2F0dHJpYnV0ZShpbm9kZSwgZmF0dHItPnRpbWVfc3RhcnQpOwogCWlmIChkYXRhX3N0YWJsZSkKLQkJbmZzaS0+Y2FjaGVfdmFsaWRpdHkgJj0gfihORlNfSU5PX0lOVkFMSURfQVRUUnxORlNfSU5PX0lOVkFMSURfQVRJTUUpOworCQluZnNpLT5jYWNoZV92YWxpZGl0eSAmPSB+KE5GU19JTk9fSU5WQUxJRF9BVFRSfE5GU19JTk9fUkVWQUxfUEFHRUNBQ0hFfE5GU19JTk9fSU5WQUxJRF9BVElNRSk7CiAKIAkvKiBEbyBhdG9taWMgd2VhayBjYWNoZSBjb25zaXN0ZW5jeSB1cGRhdGVzICovCiAJbmZzX3djY191cGRhdGVfaW5vZGUoaW5vZGUsIGZhdHRyKTsKQEAgLTE2MTMsMTUgKzk3NywxMyBAQAogIAkJaW5vZGUtPmlfYmxrc2l6ZSA9IGZhdHRyLT5kdS5uZnMyLmJsb2Nrc2l6ZTsKICAJfQogCi0JaWYgKChmYXR0ci0+dmFsaWQgJiBORlNfQVRUUl9GQVRUUl9WNCkpIHsKLQkJaWYgKG5mc2ktPmNoYW5nZV9hdHRyICE9IGZhdHRyLT5jaGFuZ2VfYXR0cikgewotCQkJZHByaW50aygiTkZTOiBjaGFuZ2VfYXR0ciBjaGFuZ2Ugb24gc2VydmVyIGZvciBmaWxlICVzLyVsZFxuIiwKLQkJCQkJaW5vZGUtPmlfc2ItPnNfaWQsIGlub2RlLT5pX2lubyk7Ci0JCQluZnNpLT5jaGFuZ2VfYXR0ciA9IGZhdHRyLT5jaGFuZ2VfYXR0cjsKLQkJCWludmFsaWQgfD0gTkZTX0lOT19JTlZBTElEX0FUVFJ8TkZTX0lOT19JTlZBTElEX0RBVEF8TkZTX0lOT19JTlZBTElEX0FDQ0VTU3xORlNfSU5PX0lOVkFMSURfQUNMOwotCQkJbmZzaS0+Y2FjaGVfY2hhbmdlX2F0dHJpYnV0ZSA9IGppZmZpZXM7Ci0JCX0gZWxzZQotCQkJaW52YWxpZCAmPSB+KE5GU19JTk9fSU5WQUxJRF9BVFRSfE5GU19JTk9fSU5WQUxJRF9EQVRBKTsKKwlpZiAoKGZhdHRyLT52YWxpZCAmIE5GU19BVFRSX0ZBVFRSX1Y0KSAhPSAwICYmCisJCQluZnNpLT5jaGFuZ2VfYXR0ciAhPSBmYXR0ci0+Y2hhbmdlX2F0dHIpIHsKKwkJZHByaW50aygiTkZTOiBjaGFuZ2VfYXR0ciBjaGFuZ2Ugb24gc2VydmVyIGZvciBmaWxlICVzLyVsZFxuIiwKKwkJCQlpbm9kZS0+aV9zYi0+c19pZCwgaW5vZGUtPmlfaW5vKTsKKwkJbmZzaS0+Y2hhbmdlX2F0dHIgPSBmYXR0ci0+Y2hhbmdlX2F0dHI7CisJCWludmFsaWQgfD0gTkZTX0lOT19JTlZBTElEX0FUVFJ8TkZTX0lOT19JTlZBTElEX0RBVEF8TkZTX0lOT19JTlZBTElEX0FDQ0VTU3xORlNfSU5PX0lOVkFMSURfQUNMOworCQluZnNpLT5jYWNoZV9jaGFuZ2VfYXR0cmlidXRlID0gamlmZmllczsKIAl9CiAKIAkvKiBVcGRhdGUgYXR0cnRpbWVvIHZhbHVlIGlmIHdlJ3JlIG91dCBvZiB0aGUgdW5zdGFibGUgcGVyaW9kICovCkBAIC0xNjY5LDIwMiArMTAzMSwxNSBAQAogCWdvdG8gb3V0X2VycjsKIH0KIAotLyoKLSAqIEZpbGUgc3lzdGVtIGluZm9ybWF0aW9uCi0gKi8KLQotc3RhdGljIGludCBuZnNfc2V0X3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgdm9pZCAqZGF0YSkKLXsKLQlzLT5zX2ZzX2luZm8gPSBkYXRhOwotCXJldHVybiBzZXRfYW5vbl9zdXBlcihzLCBkYXRhKTsKLX0KLSAKLXN0YXRpYyBpbnQgbmZzX2NvbXBhcmVfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyID0gZGF0YTsKLQlzdHJ1Y3QgbmZzX3NlcnZlciAqb2xkID0gTkZTX1NCKHNiKTsKLQotCWlmIChvbGQtPmFkZHIuc2luX2FkZHIuc19hZGRyICE9IHNlcnZlci0+YWRkci5zaW5fYWRkci5zX2FkZHIpCi0JCXJldHVybiAwOwotCWlmIChvbGQtPmFkZHIuc2luX3BvcnQgIT0gc2VydmVyLT5hZGRyLnNpbl9wb3J0KQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gIW5mc19jb21wYXJlX2ZoKCZvbGQtPmZoLCAmc2VydmVyLT5maCk7Ci19Ci0KLXN0YXRpYyBpbnQgbmZzX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKLQlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpyYXdfZGF0YSwgc3RydWN0IHZmc21vdW50ICptbnQpCi17Ci0JaW50IGVycm9yOwotCXN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIgPSBOVUxMOwotCXN0cnVjdCBzdXBlcl9ibG9jayAqczsKLQlzdHJ1Y3QgbmZzX2ZoICpyb290OwotCXN0cnVjdCBuZnNfbW91bnRfZGF0YSAqZGF0YSA9IHJhd19kYXRhOwotCi0JZXJyb3IgPSAtRUlOVkFMOwotCWlmIChkYXRhID09IE5VTEwpIHsKLQkJZHByaW50aygiJXM6IG1pc3NpbmcgZGF0YSBhcmd1bWVudFxuIiwgX19GVU5DVElPTl9fKTsKLQkJZ290byBvdXRfZXJyX25vc2VydmVyOwotCX0KLQlpZiAoZGF0YS0+dmVyc2lvbiA8PSAwIHx8IGRhdGEtPnZlcnNpb24gPiBORlNfTU9VTlRfVkVSU0lPTikgewotCQlkcHJpbnRrKCIlczogYmFkIG1vdW50IHZlcnNpb25cbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCWdvdG8gb3V0X2Vycl9ub3NlcnZlcjsKLQl9Ci0Jc3dpdGNoIChkYXRhLT52ZXJzaW9uKSB7Ci0JCWNhc2UgMToKLQkJCWRhdGEtPm5hbWxlbiA9IDA7Ci0JCWNhc2UgMjoKLQkJCWRhdGEtPmJzaXplICA9IDA7Ci0JCWNhc2UgMzoKLQkJCWlmIChkYXRhLT5mbGFncyAmIE5GU19NT1VOVF9WRVIzKSB7Ci0JCQkJZHByaW50aygiJXM6IG1vdW50IHN0cnVjdHVyZSB2ZXJzaW9uICVkIGRvZXMgbm90IHN1cHBvcnQgTkZTdjNcbiIsCi0JCQkJCQlfX0ZVTkNUSU9OX18sCi0JCQkJCQlkYXRhLT52ZXJzaW9uKTsKLQkJCQlnb3RvIG91dF9lcnJfbm9zZXJ2ZXI7Ci0JCQl9Ci0JCQlkYXRhLT5yb290LnNpemUgPSBORlMyX0ZIU0laRTsKLQkJCW1lbWNweShkYXRhLT5yb290LmRhdGEsIGRhdGEtPm9sZF9yb290LmRhdGEsIE5GUzJfRkhTSVpFKTsKLQkJY2FzZSA0OgotCQkJaWYgKGRhdGEtPmZsYWdzICYgTkZTX01PVU5UX1NFQ0ZMQVZPVVIpIHsKLQkJCQlkcHJpbnRrKCIlczogbW91bnQgc3RydWN0dXJlIHZlcnNpb24gJWQgZG9lcyBub3Qgc3VwcG9ydCBzdHJvbmcgc2VjdXJpdHlcbiIsCi0JCQkJCQlfX0ZVTkNUSU9OX18sCi0JCQkJCQlkYXRhLT52ZXJzaW9uKTsKLQkJCQlnb3RvIG91dF9lcnJfbm9zZXJ2ZXI7Ci0JCQl9Ci0JCWNhc2UgNToKLQkJCW1lbXNldChkYXRhLT5jb250ZXh0LCAwLCBzaXplb2YoZGF0YS0+Y29udGV4dCkpOwotCX0KLSNpZm5kZWYgQ09ORklHX05GU19WMwotCS8qIElmIE5GU3YzIGlzIG5vdCBjb21waWxlZCBpbiwgcmV0dXJuIC1FUFJPVE9OT1NVUFBPUlQgKi8KLQllcnJvciA9IC1FUFJPVE9OT1NVUFBPUlQ7Ci0JaWYgKGRhdGEtPmZsYWdzICYgTkZTX01PVU5UX1ZFUjMpIHsKLQkJZHByaW50aygiJXM6IE5GU3YzIG5vdCBjb21waWxlZCBpbnRvIGtlcm5lbFxuIiwgX19GVU5DVElPTl9fKTsKLQkJZ290byBvdXRfZXJyX25vc2VydmVyOwotCX0KLSNlbmRpZiAvKiBDT05GSUdfTkZTX1YzICovCi0KLQllcnJvciA9IC1FTk9NRU07Ci0Jc2VydmVyID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG5mc19zZXJ2ZXIpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXNlcnZlcikKLQkJZ290byBvdXRfZXJyX25vc2VydmVyOwotCS8qIFplcm8gb3V0IHRoZSBORlMgc3RhdGUgc3R1ZmYgKi8KLQlpbml0X25mc3Y0X3N0YXRlKHNlcnZlcik7Ci0Jc2VydmVyLT5jbGllbnQgPSBzZXJ2ZXItPmNsaWVudF9zeXMgPSBzZXJ2ZXItPmNsaWVudF9hY2wgPSBFUlJfUFRSKC1FSU5WQUwpOwotCi0Jcm9vdCA9ICZzZXJ2ZXItPmZoOwotCWlmIChkYXRhLT5mbGFncyAmIE5GU19NT1VOVF9WRVIzKQotCQlyb290LT5zaXplID0gZGF0YS0+cm9vdC5zaXplOwotCWVsc2UKLQkJcm9vdC0+c2l6ZSA9IE5GUzJfRkhTSVpFOwotCWVycm9yID0gLUVJTlZBTDsKLQlpZiAocm9vdC0+c2l6ZSA+IHNpemVvZihyb290LT5kYXRhKSkgewotCQlkcHJpbnRrKCIlczogaW52YWxpZCByb290IGZpbGVoYW5kbGVcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCWdvdG8gb3V0X2VycjsKLQl9Ci0JbWVtY3B5KHJvb3QtPmRhdGEsIGRhdGEtPnJvb3QuZGF0YSwgcm9vdC0+c2l6ZSk7Ci0KLQkvKiBXZSBub3cgcmVxdWlyZSB0aGF0IHRoZSBtb3VudCBwcm9jZXNzIHBhc3NlcyB0aGUgcmVtb3RlIGFkZHJlc3MgKi8KLQltZW1jcHkoJnNlcnZlci0+YWRkciwgJmRhdGEtPmFkZHIsIHNpemVvZihzZXJ2ZXItPmFkZHIpKTsKLQlpZiAoc2VydmVyLT5hZGRyLnNpbl9hZGRyLnNfYWRkciA9PSBJTkFERFJfQU5ZKSB7Ci0JCWRwcmludGsoIiVzOiBtb3VudCBwcm9ncmFtIGRpZG4ndCBwYXNzIHJlbW90ZSBhZGRyZXNzIVxuIiwKLQkJCQlfX0ZVTkNUSU9OX18pOwotCQlnb3RvIG91dF9lcnI7Ci0JfQotCi0JLyogRmlyZSB1cCBycGNpb2QgaWYgbm90IHlldCBydW5uaW5nICovCi0JZXJyb3IgPSBycGNpb2RfdXAoKTsKLQlpZiAoZXJyb3IgPCAwKSB7Ci0JCWRwcmludGsoIiVzOiBjb3VsZG4ndCBzdGFydCBycGNpb2QhIEVycm9yID0gJWRcbiIsCi0JCQkJX19GVU5DVElPTl9fLCBlcnJvcik7Ci0JCWdvdG8gb3V0X2VycjsKLQl9Ci0KLQlzID0gc2dldChmc190eXBlLCBuZnNfY29tcGFyZV9zdXBlciwgbmZzX3NldF9zdXBlciwgc2VydmVyKTsKLQlpZiAoSVNfRVJSKHMpKSB7Ci0JCWVycm9yID0gUFRSX0VSUihzKTsKLQkJZ290byBvdXRfZXJyX3JwY2lvZDsKLQl9Ci0KLQlpZiAocy0+c19yb290KQotCQlnb3RvIG91dF9ycGNpb2RfZG93bjsKLQotCXMtPnNfZmxhZ3MgPSBmbGFnczsKLQotCWVycm9yID0gbmZzX2ZpbGxfc3VwZXIocywgZGF0YSwgZmxhZ3MgJiBNU19TSUxFTlQgPyAxIDogMCk7Ci0JaWYgKGVycm9yKSB7Ci0JCXVwX3dyaXRlKCZzLT5zX3Vtb3VudCk7Ci0JCWRlYWN0aXZhdGVfc3VwZXIocyk7Ci0JCXJldHVybiBlcnJvcjsKLQl9Ci0Jcy0+c19mbGFncyB8PSBNU19BQ1RJVkU7Ci0JcmV0dXJuIHNpbXBsZV9zZXRfbW50KG1udCwgcyk7Ci0KLW91dF9ycGNpb2RfZG93bjoKLQlycGNpb2RfZG93bigpOwotCWtmcmVlKHNlcnZlcik7Ci0JcmV0dXJuIHNpbXBsZV9zZXRfbW50KG1udCwgcyk7Ci0KLW91dF9lcnJfcnBjaW9kOgotCXJwY2lvZF9kb3duKCk7Ci1vdXRfZXJyOgotCWtmcmVlKHNlcnZlcik7Ci1vdXRfZXJyX25vc2VydmVyOgotCXJldHVybiBlcnJvcjsKLX0KLQotc3RhdGljIHZvaWQgbmZzX2tpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzKQotewotCXN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIgPSBORlNfU0Iocyk7Ci0KLQlraWxsX2Fub25fc3VwZXIocyk7Ci0KLQlpZiAoIUlTX0VSUihzZXJ2ZXItPmNsaWVudCkpCi0JCXJwY19zaHV0ZG93bl9jbGllbnQoc2VydmVyLT5jbGllbnQpOwotCWlmICghSVNfRVJSKHNlcnZlci0+Y2xpZW50X3N5cykpCi0JCXJwY19zaHV0ZG93bl9jbGllbnQoc2VydmVyLT5jbGllbnRfc3lzKTsKLQlpZiAoIUlTX0VSUihzZXJ2ZXItPmNsaWVudF9hY2wpKQotCQlycGNfc2h1dGRvd25fY2xpZW50KHNlcnZlci0+Y2xpZW50X2FjbCk7Ci0KLQlpZiAoIShzZXJ2ZXItPmZsYWdzICYgTkZTX01PVU5UX05PTkxNKSkKLQkJbG9ja2RfZG93bigpOwkvKiByZWxlYXNlIHJwYy5sb2NrZCAqLwotCi0JcnBjaW9kX2Rvd24oKTsJCS8qIHJlbGVhc2UgcnBjaW9kICovCi0KLQluZnNfZnJlZV9pb3N0YXRzKHNlcnZlci0+aW9fc3RhdHMpOwotCWtmcmVlKHNlcnZlci0+aG9zdG5hbWUpOwotCWtmcmVlKHNlcnZlcik7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBuZnNfZnNfdHlwZSA9IHsKLQkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JLm5hbWUJCT0gIm5mcyIsCi0JLmdldF9zYgkJPSBuZnNfZ2V0X3NiLAotCS5raWxsX3NiCT0gbmZzX2tpbGxfc3VwZXIsCi0JLmZzX2ZsYWdzCT0gRlNfT0REX1JFTkFNRXxGU19SRVZBTF9ET1R8RlNfQklOQVJZX01PVU5UREFUQSwKLX07CiAKICNpZmRlZiBDT05GSUdfTkZTX1Y0CiAKLXN0YXRpYyB2b2lkIG5mczRfY2xlYXJfaW5vZGUoc3RydWN0IGlub2RlICopOwotCi0KLXN0YXRpYyBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBuZnM0X3NvcHMgPSB7IAotCS5hbGxvY19pbm9kZQk9IG5mc19hbGxvY19pbm9kZSwKLQkuZGVzdHJveV9pbm9kZQk9IG5mc19kZXN0cm95X2lub2RlLAotCS53cml0ZV9pbm9kZQk9IG5mc193cml0ZV9pbm9kZSwKLQkuZGVsZXRlX2lub2RlCT0gbmZzX2RlbGV0ZV9pbm9kZSwKLQkuc3RhdGZzCQk9IG5mc19zdGF0ZnMsCi0JLmNsZWFyX2lub2RlCT0gbmZzNF9jbGVhcl9pbm9kZSwKLQkudW1vdW50X2JlZ2luCT0gbmZzX3Vtb3VudF9iZWdpbiwKLQkuc2hvd19vcHRpb25zCT0gbmZzX3Nob3dfb3B0aW9ucywKLQkuc2hvd19zdGF0cwk9IG5mc19zaG93X3N0YXRzLAotfTsKLQogLyoKICAqIENsZWFuIG91dCBhbnkgcmVtYWluaW5nIE5GU3Y0IHN0YXRlIHRoYXQgbWlnaHQgYmUgbGVmdCBvdmVyIGR1ZQogICogdG8gb3BlbigpIGNhbGxzIHRoYXQgcGFzc2VkIG5mc19hdG9taWNfbG9va3VwLCBidXQgZmFpbGVkIHRvIGNhbGwKICAqIG5mc19vcGVuKCkuCiAgKi8KLXN0YXRpYyB2b2lkIG5mczRfY2xlYXJfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3ZvaWQgbmZzNF9jbGVhcl9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewogCXN0cnVjdCBuZnNfaW5vZGUgKm5mc2kgPSBORlNfSShpbm9kZSk7CiAKQEAgLTE4ODgsMzY1ICsxMDYzLDkgQEAKIAkJbmZzNF9jbG9zZV9zdGF0ZShzdGF0ZSwgc3RhdGUtPnN0YXRlKTsKIAl9CiB9Ci0KLQotc3RhdGljIGludCBuZnM0X2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IG5mczRfbW91bnRfZGF0YSAqZGF0YSwgaW50IHNpbGVudCkKLXsKLQlzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyOwotCXN0cnVjdCBuZnM0X2NsaWVudCAqY2xwID0gTlVMTDsKLQlzdHJ1Y3QgcnBjX3hwcnQgKnhwcnQgPSBOVUxMOwotCXN0cnVjdCBycGNfY2xudCAqY2xudCA9IE5VTEw7Ci0Jc3RydWN0IHJwY190aW1lb3V0IHRpbWVwYXJtczsKLQlycGNfYXV0aGZsYXZvcl90IGF1dGhmbGF2b3VyOwotCWludCBlcnIgPSAtRUlPOwotCi0Jc2ItPnNfYmxvY2tzaXplX2JpdHMgPSAwOwotCXNiLT5zX2Jsb2Nrc2l6ZSA9IDA7Ci0Jc2VydmVyID0gTkZTX1NCKHNiKTsKLQlpZiAoZGF0YS0+cnNpemUgIT0gMCkKLQkJc2VydmVyLT5yc2l6ZSA9IG5mc19ibG9ja19zaXplKGRhdGEtPnJzaXplLCBOVUxMKTsKLQlpZiAoZGF0YS0+d3NpemUgIT0gMCkKLQkJc2VydmVyLT53c2l6ZSA9IG5mc19ibG9ja19zaXplKGRhdGEtPndzaXplLCBOVUxMKTsKLQlzZXJ2ZXItPmZsYWdzID0gZGF0YS0+ZmxhZ3MgJiBORlNfTU9VTlRfRkxBR01BU0s7Ci0Jc2VydmVyLT5jYXBzID0gTkZTX0NBUF9BVE9NSUNfT1BFTjsKLQotCXNlcnZlci0+YWNyZWdtaW4gPSBkYXRhLT5hY3JlZ21pbipIWjsKLQlzZXJ2ZXItPmFjcmVnbWF4ID0gZGF0YS0+YWNyZWdtYXgqSFo7Ci0Jc2VydmVyLT5hY2Rpcm1pbiA9IGRhdGEtPmFjZGlybWluKkhaOwotCXNlcnZlci0+YWNkaXJtYXggPSBkYXRhLT5hY2Rpcm1heCpIWjsKLQotCXNlcnZlci0+cnBjX29wcyA9ICZuZnNfdjRfY2xpZW50b3BzOwotCi0JbmZzX2luaXRfdGltZW91dF92YWx1ZXMoJnRpbWVwYXJtcywgZGF0YS0+cHJvdG8sIGRhdGEtPnRpbWVvLCBkYXRhLT5yZXRyYW5zKTsKLQotCXNlcnZlci0+cmV0cmFuc190aW1lbyA9IHRpbWVwYXJtcy50b19pbml0dmFsOwotCXNlcnZlci0+cmV0cmFuc19jb3VudCA9IHRpbWVwYXJtcy50b19yZXRyaWVzOwotCi0JY2xwID0gbmZzNF9nZXRfY2xpZW50KCZzZXJ2ZXItPmFkZHIuc2luX2FkZHIpOwotCWlmICghY2xwKSB7Ci0JCWRwcmludGsoIiVzOiBmYWlsZWQgdG8gY3JlYXRlIE5GUzQgY2xpZW50LlxuIiwgX19GVU5DVElPTl9fKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JLyogTm93IGNyZWF0ZSB0cmFuc3BvcnQgYW5kIGNsaWVudCAqLwotCWF1dGhmbGF2b3VyID0gUlBDX0FVVEhfVU5JWDsKLQlpZiAoZGF0YS0+YXV0aF9mbGF2b3VybGVuICE9IDApIHsKLQkJaWYgKGRhdGEtPmF1dGhfZmxhdm91cmxlbiAhPSAxKSB7Ci0JCQlkcHJpbnRrKCIlczogSW52YWxpZCBudW1iZXIgb2YgUlBDIGF1dGggZmxhdm91cnMgJWQuXG4iLAotCQkJCQlfX0ZVTkNUSU9OX18sIGRhdGEtPmF1dGhfZmxhdm91cmxlbik7Ci0JCQllcnIgPSAtRUlOVkFMOwotCQkJZ290byBvdXRfZmFpbDsKLQkJfQotCQlpZiAoY29weV9mcm9tX3VzZXIoJmF1dGhmbGF2b3VyLCBkYXRhLT5hdXRoX2ZsYXZvdXJzLCBzaXplb2YoYXV0aGZsYXZvdXIpKSkgewotCQkJZXJyID0gLUVGQVVMVDsKLQkJCWdvdG8gb3V0X2ZhaWw7Ci0JCX0KLQl9Ci0KLQlkb3duX3dyaXRlKCZjbHAtPmNsX3NlbSk7Ci0JaWYgKElTX0VSUihjbHAtPmNsX3JwY2NsaWVudCkpIHsKLQkJeHBydCA9IHhwcnRfY3JlYXRlX3Byb3RvKGRhdGEtPnByb3RvLCAmc2VydmVyLT5hZGRyLCAmdGltZXBhcm1zKTsKLQkJaWYgKElTX0VSUih4cHJ0KSkgewotCQkJdXBfd3JpdGUoJmNscC0+Y2xfc2VtKTsKLQkJCWVyciA9IFBUUl9FUlIoeHBydCk7Ci0JCQlkcHJpbnRrKCIlczogY2Fubm90IGNyZWF0ZSBSUEMgdHJhbnNwb3J0LiBFcnJvciA9ICVkXG4iLAotCQkJCQlfX0ZVTkNUSU9OX18sIGVycik7Ci0JCQlnb3RvIG91dF9mYWlsOwotCQl9Ci0JCWNsbnQgPSBycGNfY3JlYXRlX2NsaWVudCh4cHJ0LCBzZXJ2ZXItPmhvc3RuYW1lLCAmbmZzX3Byb2dyYW0sCi0JCQkJc2VydmVyLT5ycGNfb3BzLT52ZXJzaW9uLCBhdXRoZmxhdm91cik7Ci0JCWlmIChJU19FUlIoY2xudCkpIHsKLQkJCXVwX3dyaXRlKCZjbHAtPmNsX3NlbSk7Ci0JCQllcnIgPSBQVFJfRVJSKGNsbnQpOwotCQkJZHByaW50aygiJXM6IGNhbm5vdCBjcmVhdGUgUlBDIGNsaWVudC4gRXJyb3IgPSAlZFxuIiwKLQkJCQkJX19GVU5DVElPTl9fLCBlcnIpOwotCQkJZ290byBvdXRfZmFpbDsKLQkJfQotCQljbG50LT5jbF9pbnRyICAgICA9IDE7Ci0JCWNsbnQtPmNsX3NvZnRydHJ5ID0gMTsKLQkJY2xwLT5jbF9ycGNjbGllbnQgPSBjbG50OwotCQltZW1jcHkoY2xwLT5jbF9pcGFkZHIsIHNlcnZlci0+aXBfYWRkciwgc2l6ZW9mKGNscC0+Y2xfaXBhZGRyKSk7Ci0JCW5mc19pZG1hcF9uZXcoY2xwKTsKLQl9Ci0JbGlzdF9hZGRfdGFpbCgmc2VydmVyLT5uZnM0X3NpYmxpbmdzLCAmY2xwLT5jbF9zdXBlcmJsb2Nrcyk7Ci0JY2xudCA9IHJwY19jbG9uZV9jbGllbnQoY2xwLT5jbF9ycGNjbGllbnQpOwotCWlmICghSVNfRVJSKGNsbnQpKQotCQkJc2VydmVyLT5uZnM0X3N0YXRlID0gY2xwOwotCXVwX3dyaXRlKCZjbHAtPmNsX3NlbSk7Ci0JY2xwID0gTlVMTDsKLQotCWlmIChJU19FUlIoY2xudCkpIHsKLQkJZXJyID0gUFRSX0VSUihjbG50KTsKLQkJZHByaW50aygiJXM6IGNhbm5vdCBjcmVhdGUgUlBDIGNsaWVudC4gRXJyb3IgPSAlZFxuIiwKLQkJCQlfX0ZVTkNUSU9OX18sIGVycik7Ci0JCXJldHVybiBlcnI7Ci0JfQotCi0Jc2VydmVyLT5jbGllbnQgICAgPSBjbG50OwotCi0JaWYgKHNlcnZlci0+bmZzNF9zdGF0ZS0+Y2xfaWRtYXAgPT0gTlVMTCkgewotCQlkcHJpbnRrKCIlczogZmFpbGVkIHRvIGNyZWF0ZSBpZG1hcHBlci5cbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCWlmIChjbG50LT5jbF9hdXRoLT5hdV9mbGF2b3IgIT0gYXV0aGZsYXZvdXIpIHsKLQkJc3RydWN0IHJwY19hdXRoICphdXRoOwotCi0JCWF1dGggPSBycGNhdXRoX2NyZWF0ZShhdXRoZmxhdm91ciwgY2xudCk7Ci0JCWlmIChJU19FUlIoYXV0aCkpIHsKLQkJCWRwcmludGsoIiVzOiBjb3VsZG4ndCBjcmVhdGUgY3JlZGNhY2hlIVxuIiwgX19GVU5DVElPTl9fKTsKLQkJCXJldHVybiBQVFJfRVJSKGF1dGgpOwotCQl9Ci0JfQotCi0Jc2ItPnNfdGltZV9ncmFuID0gMTsKLQotCXNiLT5zX29wID0gJm5mczRfc29wczsKLQllcnIgPSBuZnNfc2JfaW5pdChzYiwgYXV0aGZsYXZvdXIpOwotCWlmIChlcnIgPT0gMCkKLQkJcmV0dXJuIDA7Ci1vdXRfZmFpbDoKLQlpZiAoY2xwKQotCQluZnM0X3B1dF9jbGllbnQoY2xwKTsKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgaW50IG5mczRfY29tcGFyZV9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIgPSBkYXRhOwotCXN0cnVjdCBuZnNfc2VydmVyICpvbGQgPSBORlNfU0Ioc2IpOwotCi0JaWYgKHN0cmNtcChzZXJ2ZXItPmhvc3RuYW1lLCBvbGQtPmhvc3RuYW1lKSAhPSAwKQotCQlyZXR1cm4gMDsKLQlpZiAoc3RyY21wKHNlcnZlci0+bW50X3BhdGgsIG9sZC0+bW50X3BhdGgpICE9IDApCi0JCXJldHVybiAwOwotCXJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZCAqCi1uZnNfY29weV91c2VyX3N0cmluZyhjaGFyICpkc3QsIHN0cnVjdCBuZnNfc3RyaW5nICpzcmMsIGludCBtYXhsZW4pCi17Ci0Jdm9pZCAqcCA9IE5VTEw7Ci0KLQlpZiAoIXNyYy0+bGVuKQotCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKLQlpZiAoc3JjLT5sZW4gPCBtYXhsZW4pCi0JCW1heGxlbiA9IHNyYy0+bGVuOwotCWlmIChkc3QgPT0gTlVMTCkgewotCQlwID0gZHN0ID0ga21hbGxvYyhtYXhsZW4gKyAxLCBHRlBfS0VSTkVMKTsKLQkJaWYgKHAgPT0gTlVMTCkKLQkJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwotCX0KLQlpZiAoY29weV9mcm9tX3VzZXIoZHN0LCBzcmMtPmRhdGEsIG1heGxlbikpIHsKLQkJa2ZyZWUocCk7Ci0JCXJldHVybiBFUlJfUFRSKC1FRkFVTFQpOwotCX0KLQlkc3RbbWF4bGVuXSA9ICdcMCc7Ci0JcmV0dXJuIGRzdDsKLX0KLQotc3RhdGljIGludCBuZnM0X2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKLQlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpyYXdfZGF0YSwgc3RydWN0IHZmc21vdW50ICptbnQpCi17Ci0JaW50IGVycm9yOwotCXN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXI7Ci0Jc3RydWN0IHN1cGVyX2Jsb2NrICpzOwotCXN0cnVjdCBuZnM0X21vdW50X2RhdGEgKmRhdGEgPSByYXdfZGF0YTsKLQl2b2lkICpwOwotCi0JaWYgKGRhdGEgPT0gTlVMTCkgewotCQlkcHJpbnRrKCIlczogbWlzc2luZyBkYXRhIGFyZ3VtZW50XG4iLCBfX0ZVTkNUSU9OX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JaWYgKGRhdGEtPnZlcnNpb24gPD0gMCB8fCBkYXRhLT52ZXJzaW9uID4gTkZTNF9NT1VOVF9WRVJTSU9OKSB7Ci0JCWRwcmludGsoIiVzOiBiYWQgbW91bnQgdmVyc2lvblxuIiwgX19GVU5DVElPTl9fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0Jc2VydmVyID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG5mc19zZXJ2ZXIpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXNlcnZlcikKLQkJcmV0dXJuIC1FTk9NRU07Ci0JLyogWmVybyBvdXQgdGhlIE5GUyBzdGF0ZSBzdHVmZiAqLwotCWluaXRfbmZzdjRfc3RhdGUoc2VydmVyKTsKLQlzZXJ2ZXItPmNsaWVudCA9IHNlcnZlci0+Y2xpZW50X3N5cyA9IHNlcnZlci0+Y2xpZW50X2FjbCA9IEVSUl9QVFIoLUVJTlZBTCk7Ci0KLQlwID0gbmZzX2NvcHlfdXNlcl9zdHJpbmcoTlVMTCwgJmRhdGEtPmhvc3RuYW1lLCAyNTYpOwotCWlmIChJU19FUlIocCkpCi0JCWdvdG8gb3V0X2VycjsKLQlzZXJ2ZXItPmhvc3RuYW1lID0gcDsKLQotCXAgPSBuZnNfY29weV91c2VyX3N0cmluZyhOVUxMLCAmZGF0YS0+bW50X3BhdGgsIDEwMjQpOwotCWlmIChJU19FUlIocCkpCi0JCWdvdG8gb3V0X2VycjsKLQlzZXJ2ZXItPm1udF9wYXRoID0gcDsKLQotCXAgPSBuZnNfY29weV91c2VyX3N0cmluZyhzZXJ2ZXItPmlwX2FkZHIsICZkYXRhLT5jbGllbnRfYWRkciwKLQkJCXNpemVvZihzZXJ2ZXItPmlwX2FkZHIpIC0gMSk7Ci0JaWYgKElTX0VSUihwKSkKLQkJZ290byBvdXRfZXJyOwotCi0JLyogV2Ugbm93IHJlcXVpcmUgdGhhdCB0aGUgbW91bnQgcHJvY2VzcyBwYXNzZXMgdGhlIHJlbW90ZSBhZGRyZXNzICovCi0JaWYgKGRhdGEtPmhvc3RfYWRkcmxlbiAhPSBzaXplb2Yoc2VydmVyLT5hZGRyKSkgewotCQllcnJvciA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0X2ZyZWU7Ci0JfQotCWlmIChjb3B5X2Zyb21fdXNlcigmc2VydmVyLT5hZGRyLCBkYXRhLT5ob3N0X2FkZHIsIHNpemVvZihzZXJ2ZXItPmFkZHIpKSkgewotCQllcnJvciA9IC1FRkFVTFQ7Ci0JCWdvdG8gb3V0X2ZyZWU7Ci0JfQotCWlmIChzZXJ2ZXItPmFkZHIuc2luX2ZhbWlseSAhPSBBRl9JTkVUIHx8Ci0JICAgIHNlcnZlci0+YWRkci5zaW5fYWRkci5zX2FkZHIgPT0gSU5BRERSX0FOWSkgewotCQlkcHJpbnRrKCIlczogbW91bnQgcHJvZ3JhbSBkaWRuJ3QgcGFzcyByZW1vdGUgSVAgYWRkcmVzcyFcbiIsCi0JCQkJX19GVU5DVElPTl9fKTsKLQkJZXJyb3IgPSAtRUlOVkFMOwotCQlnb3RvIG91dF9mcmVlOwotCX0KLQotCS8qIEZpcmUgdXAgcnBjaW9kIGlmIG5vdCB5ZXQgcnVubmluZyAqLwotCWVycm9yID0gcnBjaW9kX3VwKCk7Ci0JaWYgKGVycm9yIDwgMCkgewotCQlkcHJpbnRrKCIlczogY291bGRuJ3Qgc3RhcnQgcnBjaW9kISBFcnJvciA9ICVkXG4iLAotCQkJCV9fRlVOQ1RJT05fXywgZXJyb3IpOwotCQlnb3RvIG91dF9mcmVlOwotCX0KLQotCXMgPSBzZ2V0KGZzX3R5cGUsIG5mczRfY29tcGFyZV9zdXBlciwgbmZzX3NldF9zdXBlciwgc2VydmVyKTsKLQlpZiAoSVNfRVJSKHMpKSB7Ci0JCWVycm9yID0gUFRSX0VSUihzKTsKLQkJZ290byBvdXRfZnJlZTsKLQl9Ci0KLQlpZiAocy0+c19yb290KSB7Ci0JCWtmcmVlKHNlcnZlci0+bW50X3BhdGgpOwotCQlrZnJlZShzZXJ2ZXItPmhvc3RuYW1lKTsKLQkJa2ZyZWUoc2VydmVyKTsKLQkJcmV0dXJuIHNpbXBsZV9zZXRfbW50KG1udCwgcyk7Ci0JfQotCi0Jcy0+c19mbGFncyA9IGZsYWdzOwotCi0JZXJyb3IgPSBuZnM0X2ZpbGxfc3VwZXIocywgZGF0YSwgZmxhZ3MgJiBNU19TSUxFTlQgPyAxIDogMCk7Ci0JaWYgKGVycm9yKSB7Ci0JCXVwX3dyaXRlKCZzLT5zX3Vtb3VudCk7Ci0JCWRlYWN0aXZhdGVfc3VwZXIocyk7Ci0JCXJldHVybiBlcnJvcjsKLQl9Ci0Jcy0+c19mbGFncyB8PSBNU19BQ1RJVkU7Ci0JcmV0dXJuIHNpbXBsZV9zZXRfbW50KG1udCwgcyk7Ci1vdXRfZXJyOgotCWVycm9yID0gUFRSX0VSUihwKTsKLW91dF9mcmVlOgotCWtmcmVlKHNlcnZlci0+bW50X3BhdGgpOwotCWtmcmVlKHNlcnZlci0+aG9zdG5hbWUpOwotCWtmcmVlKHNlcnZlcik7Ci0JcmV0dXJuIGVycm9yOwotfQotCi1zdGF0aWMgdm9pZCBuZnM0X2tpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKLXsKLQlzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyID0gTkZTX1NCKHNiKTsKLQotCW5mc19yZXR1cm5fYWxsX2RlbGVnYXRpb25zKHNiKTsKLQlraWxsX2Fub25fc3VwZXIoc2IpOwotCi0JbmZzNF9yZW5ld2RfcHJlcGFyZV9zaHV0ZG93bihzZXJ2ZXIpOwotCi0JaWYgKHNlcnZlci0+Y2xpZW50ICE9IE5VTEwgJiYgIUlTX0VSUihzZXJ2ZXItPmNsaWVudCkpCi0JCXJwY19zaHV0ZG93bl9jbGllbnQoc2VydmVyLT5jbGllbnQpOwotCi0JZGVzdHJveV9uZnN2NF9zdGF0ZShzZXJ2ZXIpOwotCi0JcnBjaW9kX2Rvd24oKTsKLQotCW5mc19mcmVlX2lvc3RhdHMoc2VydmVyLT5pb19zdGF0cyk7Ci0Ja2ZyZWUoc2VydmVyLT5ob3N0bmFtZSk7Ci0Ja2ZyZWUoc2VydmVyKTsKLX0KLQotc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIG5mczRfZnNfdHlwZSA9IHsKLQkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JLm5hbWUJCT0gIm5mczQiLAotCS5nZXRfc2IJCT0gbmZzNF9nZXRfc2IsCi0JLmtpbGxfc2IJPSBuZnM0X2tpbGxfc3VwZXIsCi0JLmZzX2ZsYWdzCT0gRlNfT0REX1JFTkFNRXxGU19SRVZBTF9ET1R8RlNfQklOQVJZX01PVU5UREFUQSwKLX07Ci0KLXN0YXRpYyBjb25zdCBpbnQgbmZzX3NldF9wb3J0X21pbiA9IDA7Ci1zdGF0aWMgY29uc3QgaW50IG5mc19zZXRfcG9ydF9tYXggPSA2NTUzNTsKLXN0YXRpYyBpbnQgcGFyYW1fc2V0X3BvcnQoY29uc3QgY2hhciAqdmFsLCBzdHJ1Y3Qga2VybmVsX3BhcmFtICprcCkKLXsKLQljaGFyICplbmRwOwotCWludCBudW0gPSBzaW1wbGVfc3RydG9sKHZhbCwgJmVuZHAsIDApOwotCWlmIChlbmRwID09IHZhbCB8fCAqZW5kcCB8fCBudW0gPCBuZnNfc2V0X3BvcnRfbWluIHx8IG51bSA+IG5mc19zZXRfcG9ydF9tYXgpCi0JCXJldHVybiAtRUlOVkFMOwotCSooKGludCAqKWtwLT5hcmcpID0gbnVtOwotCXJldHVybiAwOwotfQotCi1tb2R1bGVfcGFyYW1fY2FsbChjYWxsYmFja190Y3Bwb3J0LCBwYXJhbV9zZXRfcG9ydCwgcGFyYW1fZ2V0X2ludCwKLQkJICZuZnNfY2FsbGJhY2tfc2V0X3RjcHBvcnQsIDA2NDQpOwotCi1zdGF0aWMgaW50IHBhcmFtX3NldF9pZG1hcF90aW1lb3V0KGNvbnN0IGNoYXIgKnZhbCwgc3RydWN0IGtlcm5lbF9wYXJhbSAqa3ApCi17Ci0JY2hhciAqZW5kcDsKLQlpbnQgbnVtID0gc2ltcGxlX3N0cnRvbCh2YWwsICZlbmRwLCAwKTsKLQlpbnQgamlmID0gbnVtICogSFo7Ci0JaWYgKGVuZHAgPT0gdmFsIHx8ICplbmRwIHx8IG51bSA8IDAgfHwgamlmIDwgbnVtKQotCQlyZXR1cm4gLUVJTlZBTDsKLQkqKChpbnQgKilrcC0+YXJnKSA9IGppZjsKLQlyZXR1cm4gMDsKLX0KLQotbW9kdWxlX3BhcmFtX2NhbGwoaWRtYXBfY2FjaGVfdGltZW91dCwgcGFyYW1fc2V0X2lkbWFwX3RpbWVvdXQsIHBhcmFtX2dldF9pbnQsCi0JCSAmbmZzX2lkbWFwX2NhY2hlX3RpbWVvdXQsIDA2NDQpOwotCi0jZGVmaW5lIG5mczRfaW5pdF9vbmNlKG5mc2kpIFwKLQlkbyB7IFwKLQkJSU5JVF9MSVNUX0hFQUQoJihuZnNpKS0+b3Blbl9zdGF0ZXMpOyBcCi0JCW5mc2ktPmRlbGVnYXRpb24gPSBOVUxMOyBcCi0JCW5mc2ktPmRlbGVnYXRpb25fc3RhdGUgPSAwOyBcCi0JCWluaXRfcndzZW0oJm5mc2ktPnJ3c2VtKTsgXAotCX0gd2hpbGUoMCkKLQotc3RhdGljIGlubGluZSBpbnQgcmVnaXN0ZXJfbmZzNGZzKHZvaWQpCi17Ci0JaW50IHJldDsKLQotCXJldCA9IG5mc19yZWdpc3Rlcl9zeXNjdGwoKTsKLQlpZiAocmV0ICE9IDApCi0JCXJldHVybiByZXQ7Ci0JcmV0ID0gcmVnaXN0ZXJfZmlsZXN5c3RlbSgmbmZzNF9mc190eXBlKTsKLQlpZiAocmV0ICE9IDApCi0JCW5mc191bnJlZ2lzdGVyX3N5c2N0bCgpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCB1bnJlZ2lzdGVyX25mczRmcyh2b2lkKQotewotCXVucmVnaXN0ZXJfZmlsZXN5c3RlbSgmbmZzNF9mc190eXBlKTsKLQluZnNfdW5yZWdpc3Rlcl9zeXNjdGwoKTsKLX0KLSNlbHNlCi0jZGVmaW5lIG5mczRfaW5pdF9vbmNlKG5mc2kpIFwKLQlkbyB7IH0gd2hpbGUgKDApCi0jZGVmaW5lIHJlZ2lzdGVyX25mczRmcygpICgwKQotI2RlZmluZSB1bnJlZ2lzdGVyX25mczRmcygpCiAjZW5kaWYKIAotZXh0ZXJuIGludCBuZnNfaW5pdF9uZnNwYWdlY2FjaGUodm9pZCk7Ci1leHRlcm4gdm9pZCBuZnNfZGVzdHJveV9uZnNwYWdlY2FjaGUodm9pZCk7Ci1leHRlcm4gaW50IG5mc19pbml0X3JlYWRwYWdlY2FjaGUodm9pZCk7Ci1leHRlcm4gdm9pZCBuZnNfZGVzdHJveV9yZWFkcGFnZWNhY2hlKHZvaWQpOwotZXh0ZXJuIGludCBuZnNfaW5pdF93cml0ZXBhZ2VjYWNoZSh2b2lkKTsKLWV4dGVybiB2b2lkIG5mc19kZXN0cm95X3dyaXRlcGFnZWNhY2hlKHZvaWQpOwotI2lmZGVmIENPTkZJR19ORlNfRElSRUNUSU8KLWV4dGVybiBpbnQgbmZzX2luaXRfZGlyZWN0Y2FjaGUodm9pZCk7Ci1leHRlcm4gdm9pZCBuZnNfZGVzdHJveV9kaXJlY3RjYWNoZSh2b2lkKTsKLSNlbmRpZgotCi1zdGF0aWMga21lbV9jYWNoZV90ICogbmZzX2lub2RlX2NhY2hlcDsKLQotc3RhdGljIHN0cnVjdCBpbm9kZSAqbmZzX2FsbG9jX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCitzdHJ1Y3QgaW5vZGUgKm5mc19hbGxvY19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewogCXN0cnVjdCBuZnNfaW5vZGUgKm5mc2k7CiAJbmZzaSA9IChzdHJ1Y3QgbmZzX2lub2RlICopa21lbV9jYWNoZV9hbGxvYyhuZnNfaW5vZGVfY2FjaGVwLCBTTEFCX0tFUk5FTCk7CkBAIC0yMjY1LDExICsxMDg0LDIxIEBACiAJcmV0dXJuICZuZnNpLT52ZnNfaW5vZGU7CiB9CiAKLXN0YXRpYyB2b2lkIG5mc19kZXN0cm95X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit2b2lkIG5mc19kZXN0cm95X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CiAJa21lbV9jYWNoZV9mcmVlKG5mc19pbm9kZV9jYWNoZXAsIE5GU19JKGlub2RlKSk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBuZnM0X2luaXRfb25jZShzdHJ1Y3QgbmZzX2lub2RlICpuZnNpKQoreworI2lmZGVmIENPTkZJR19ORlNfVjQKKwlJTklUX0xJU1RfSEVBRCgmbmZzaS0+b3Blbl9zdGF0ZXMpOworCW5mc2ktPmRlbGVnYXRpb24gPSBOVUxMOworCW5mc2ktPmRlbGVnYXRpb25fc3RhdGUgPSAwOworCWluaXRfcndzZW0oJm5mc2ktPnJ3c2VtKTsKKyNlbmRpZgorfQorCiBzdGF0aWMgdm9pZCBpbml0X29uY2Uodm9pZCAqIGZvbywga21lbV9jYWNoZV90ICogY2FjaGVwLCB1bnNpZ25lZCBsb25nIGZsYWdzKQogewogCXN0cnVjdCBuZnNfaW5vZGUgKm5mc2kgPSAoc3RydWN0IG5mc19pbm9kZSAqKSBmb287CkBAIC0yMjkwLDcgKzExMTksNyBAQAogCX0KIH0KICAKLXN0YXRpYyBpbnQgbmZzX2luaXRfaW5vZGVjYWNoZSh2b2lkKQorc3RhdGljIGludCBfX2luaXQgbmZzX2luaXRfaW5vZGVjYWNoZSh2b2lkKQogewogCW5mc19pbm9kZV9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgibmZzX2lub2RlX2NhY2hlIiwKIAkJCQkJICAgICBzaXplb2Yoc3RydWN0IG5mc19pbm9kZSksCkBAIC0yMzAzLDcgKzExMzIsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBuZnNfZGVzdHJveV9pbm9kZWNhY2hlKHZvaWQpCitzdGF0aWMgdm9pZCBfX2V4aXQgbmZzX2Rlc3Ryb3lfaW5vZGVjYWNoZSh2b2lkKQogewogCWlmIChrbWVtX2NhY2hlX2Rlc3Ryb3kobmZzX2lub2RlX2NhY2hlcCkpCiAJCXByaW50ayhLRVJOX0lORk8gIm5mc19pbm9kZV9jYWNoZTogbm90IGFsbCBzdHJ1Y3R1cmVzIHdlcmUgZnJlZWRcbiIpOwpAQCAtMjMzMiwyOSArMTE2MSwyMiBAQAogCWlmIChlcnIpCiAJCWdvdG8gb3V0MTsKIAotI2lmZGVmIENPTkZJR19ORlNfRElSRUNUSU8KIAllcnIgPSBuZnNfaW5pdF9kaXJlY3RjYWNoZSgpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0MDsKLSNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1BST0NfRlMKIAlycGNfcHJvY19yZWdpc3RlcigmbmZzX3JwY3N0YXQpOwogI2VuZGlmCi0gICAgICAgIGVyciA9IHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJm5mc19mc190eXBlKTsKLQlpZiAoZXJyKQotCQlnb3RvIG91dDsKLQlpZiAoKGVyciA9IHJlZ2lzdGVyX25mczRmcygpKSAhPSAwKQorCWlmICgoZXJyID0gcmVnaXN0ZXJfbmZzX2ZzKCkpICE9IDApCiAJCWdvdG8gb3V0OwogCXJldHVybiAwOwogb3V0OgogI2lmZGVmIENPTkZJR19QUk9DX0ZTCiAJcnBjX3Byb2NfdW5yZWdpc3RlcigibmZzIik7CiAjZW5kaWYKLSNpZmRlZiBDT05GSUdfTkZTX0RJUkVDVElPCiAJbmZzX2Rlc3Ryb3lfZGlyZWN0Y2FjaGUoKTsKIG91dDA6Ci0jZW5kaWYKIAluZnNfZGVzdHJveV93cml0ZXBhZ2VjYWNoZSgpOwogb3V0MToKIAluZnNfZGVzdHJveV9yZWFkcGFnZWNhY2hlKCk7CkBAIC0yMzY4LDkgKzExOTAsNyBAQAogCiBzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9uZnNfZnModm9pZCkKIHsKLSNpZmRlZiBDT05GSUdfTkZTX0RJUkVDVElPCiAJbmZzX2Rlc3Ryb3lfZGlyZWN0Y2FjaGUoKTsKLSNlbmRpZgogCW5mc19kZXN0cm95X3dyaXRlcGFnZWNhY2hlKCk7CiAJbmZzX2Rlc3Ryb3lfcmVhZHBhZ2VjYWNoZSgpOwogCW5mc19kZXN0cm95X2lub2RlY2FjaGUoKTsKQEAgLTIzNzgsOCArMTE5OCw3IEBACiAjaWZkZWYgQ09ORklHX1BST0NfRlMKIAlycGNfcHJvY191bnJlZ2lzdGVyKCJuZnMiKTsKICNlbmRpZgotCXVucmVnaXN0ZXJfZmlsZXN5c3RlbSgmbmZzX2ZzX3R5cGUpOwotCXVucmVnaXN0ZXJfbmZzNGZzKCk7CisJdW5yZWdpc3Rlcl9uZnNfZnMoKTsKIH0KIAogLyogTm90IHF1aXRlIHRydWU7IEkganVzdCBtYWludGFpbiBpdCAqLwpkaWZmIC0tZ2l0IGEvZnMvbmZzL2ludGVybmFsLmggYi9mcy9uZnMvaW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDI4MTVlCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbmZzL2ludGVybmFsLmgKQEAgLTAsMCArMSwxODYgQEAKKy8qCisgKiBORlMgaW50ZXJuYWwgZGVmaW5pdGlvbnMKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KKworc3RydWN0IG5mc19jbG9uZV9tb3VudCB7CisJY29uc3Qgc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsKKwljb25zdCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CisJc3RydWN0IG5mc19maCAqZmg7CisJc3RydWN0IG5mc19mYXR0ciAqZmF0dHI7CisJY2hhciAqaG9zdG5hbWU7CisJY2hhciAqbW50X3BhdGg7CisJc3RydWN0IHNvY2thZGRyX2luICphZGRyOworCXJwY19hdXRoZmxhdm9yX3QgYXV0aGZsYXZvcjsKK307CisKKy8qIG5hbWVzcGFjZS1uZnM0LmMgKi8KKyNpZmRlZiBDT05GSUdfTkZTX1Y0CitleHRlcm4gc3RydWN0IHZmc21vdW50ICpuZnNfZG9fcmVmbW91bnQoY29uc3Qgc3RydWN0IHZmc21vdW50ICptbnRfcGFyZW50LCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUKK3N0cnVjdCB2ZnNtb3VudCAqbmZzX2RvX3JlZm1vdW50KGNvbnN0IHN0cnVjdCB2ZnNtb3VudCAqbW50X3BhcmVudCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXJldHVybiBFUlJfUFRSKC1FTk9FTlQpOworfQorI2VuZGlmCisKKy8qIGNhbGxiYWNrX3hkci5jICovCitleHRlcm4gc3RydWN0IHN2Y192ZXJzaW9uIG5mczRfY2FsbGJhY2tfdmVyc2lvbjE7CisKKy8qIHBhZ2VsaXN0LmMgKi8KK2V4dGVybiBpbnQgX19pbml0IG5mc19pbml0X25mc3BhZ2VjYWNoZSh2b2lkKTsKK2V4dGVybiB2b2lkIF9fZXhpdCBuZnNfZGVzdHJveV9uZnNwYWdlY2FjaGUodm9pZCk7CitleHRlcm4gaW50IF9faW5pdCBuZnNfaW5pdF9yZWFkcGFnZWNhY2hlKHZvaWQpOworZXh0ZXJuIHZvaWQgX19leGl0IG5mc19kZXN0cm95X3JlYWRwYWdlY2FjaGUodm9pZCk7CitleHRlcm4gaW50IF9faW5pdCBuZnNfaW5pdF93cml0ZXBhZ2VjYWNoZSh2b2lkKTsKK2V4dGVybiB2b2lkIF9fZXhpdCBuZnNfZGVzdHJveV93cml0ZXBhZ2VjYWNoZSh2b2lkKTsKKworI2lmZGVmIENPTkZJR19ORlNfRElSRUNUSU8KK2V4dGVybiBpbnQgX19pbml0IG5mc19pbml0X2RpcmVjdGNhY2hlKHZvaWQpOworZXh0ZXJuIHZvaWQgX19leGl0IG5mc19kZXN0cm95X2RpcmVjdGNhY2hlKHZvaWQpOworI2Vsc2UKKyNkZWZpbmUgbmZzX2luaXRfZGlyZWN0Y2FjaGUoKSAoMCkKKyNkZWZpbmUgbmZzX2Rlc3Ryb3lfZGlyZWN0Y2FjaGUoKSBkbyB7fSB3aGlsZSgwKQorI2VuZGlmCisKKy8qIG5mczJ4ZHIuYyAqLworZXh0ZXJuIHN0cnVjdCBycGNfcHJvY2luZm8gbmZzX3Byb2NlZHVyZXNbXTsKK2V4dGVybiB1MzIgKiBuZnNfZGVjb2RlX2RpcmVudCh1MzIgKiwgc3RydWN0IG5mc19lbnRyeSAqLCBpbnQpOworCisvKiBuZnMzeGRyLmMgKi8KK2V4dGVybiBzdHJ1Y3QgcnBjX3Byb2NpbmZvIG5mczNfcHJvY2VkdXJlc1tdOworZXh0ZXJuIHUzMiAqbmZzM19kZWNvZGVfZGlyZW50KHUzMiAqLCBzdHJ1Y3QgbmZzX2VudHJ5ICosIGludCk7CisKKy8qIG5mczR4ZHIuYyAqLworZXh0ZXJuIGludCBuZnNfc3RhdF90b19lcnJubyhpbnQpOworZXh0ZXJuIHUzMiAqbmZzNF9kZWNvZGVfZGlyZW50KHUzMiAqcCwgc3RydWN0IG5mc19lbnRyeSAqZW50cnksIGludCBwbHVzKTsKKworLyogbmZzNHByb2MuYyAqLworI2lmZGVmIENPTkZJR19ORlNfVjQKK2V4dGVybiBzdHJ1Y3QgcnBjX3Byb2NpbmZvIG5mczRfcHJvY2VkdXJlc1tdOworCitleHRlcm4gaW50IG5mczRfcHJvY19mc19sb2NhdGlvbnMoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkJCQkgIHN0cnVjdCBuZnM0X2ZzX2xvY2F0aW9ucyAqZnNfbG9jYXRpb25zLAorCQkJCSAgc3RydWN0IHBhZ2UgKnBhZ2UpOworI2VuZGlmCisKKy8qIGlub2RlLmMgKi8KK2V4dGVybiBzdHJ1Y3QgaW5vZGUgKm5mc19hbGxvY19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKK2V4dGVybiB2b2lkIG5mc19kZXN0cm95X2lub2RlKHN0cnVjdCBpbm9kZSAqKTsKK2V4dGVybiBpbnQgbmZzX3dyaXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqLGludCk7CitleHRlcm4gdm9pZCBuZnNfY2xlYXJfaW5vZGUoc3RydWN0IGlub2RlICopOworI2lmZGVmIENPTkZJR19ORlNfVjQKK2V4dGVybiB2b2lkIG5mczRfY2xlYXJfaW5vZGUoc3RydWN0IGlub2RlICopOworI2VuZGlmCisKKy8qIHN1cGVyLmMgKi8KK2V4dGVybiBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBuZnNfcmVmZXJyYWxfbmZzNF9mc190eXBlOworZXh0ZXJuIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIGNsb25lX25mc19mc190eXBlOworI2lmZGVmIENPTkZJR19ORlNfVjQKK2V4dGVybiBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBjbG9uZV9uZnM0X2ZzX3R5cGU7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworZXh0ZXJuIHN0cnVjdCBycGNfc3RhdCBuZnNfcnBjc3RhdDsKKyNlbmRpZgorZXh0ZXJuIGludCBfX2luaXQgcmVnaXN0ZXJfbmZzX2ZzKHZvaWQpOworZXh0ZXJuIHZvaWQgX19leGl0IHVucmVnaXN0ZXJfbmZzX2ZzKHZvaWQpOworCisvKiBuYW1lc3BhY2UuYyAqLworZXh0ZXJuIGNoYXIgKm5mc19wYXRoKGNvbnN0IGNoYXIgKmJhc2UsIGNvbnN0IHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkJICAgICAgY2hhciAqYnVmZmVyLCBzc2l6ZV90IGJ1Zmxlbik7CisKKy8qCisgKiBEZXRlcm1pbmUgdGhlIG1vdW50IHBhdGggYXMgYSBzdHJpbmcKKyAqLworc3RhdGljIGlubGluZSBjaGFyICoKK25mczRfcGF0aChjb25zdCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNoYXIgKmJ1ZmZlciwgc3NpemVfdCBidWZsZW4pCit7CisjaWZkZWYgQ09ORklHX05GU19WNAorCXJldHVybiBuZnNfcGF0aChORlNfU0IoZGVudHJ5LT5kX3NiKS0+bW50X3BhdGgsIGRlbnRyeSwgYnVmZmVyLCBidWZsZW4pOworI2Vsc2UKKwlyZXR1cm4gTlVMTDsKKyNlbmRpZgorfQorCisvKgorICogRGV0ZXJtaW5lIHRoZSBkZXZpY2UgbmFtZSBhcyBhIHN0cmluZworICovCitzdGF0aWMgaW5saW5lIGNoYXIgKm5mc19kZXZuYW1lKGNvbnN0IHN0cnVjdCB2ZnNtb3VudCAqbW50X3BhcmVudCwKKwkJCSBjb25zdCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCQkgY2hhciAqYnVmZmVyLCBzc2l6ZV90IGJ1ZmxlbikKK3sKKwlyZXR1cm4gbmZzX3BhdGgobW50X3BhcmVudC0+bW50X2Rldm5hbWUsIGRlbnRyeSwgYnVmZmVyLCBidWZsZW4pOworfQorCisvKgorICogRGV0ZXJtaW5lIHRoZSBhY3R1YWwgYmxvY2sgc2l6ZSAoYW5kIGxvZzIgdGhlcmVvZikKKyAqLworc3RhdGljIGlubGluZQordW5zaWduZWQgbG9uZyBuZnNfYmxvY2tfYml0cyh1bnNpZ25lZCBsb25nIGJzaXplLCB1bnNpZ25lZCBjaGFyICpucmJpdHNwKQoreworCS8qIG1ha2Ugc3VyZSBibG9ja3NpemUgaXMgYSBwb3dlciBvZiB0d28gKi8KKwlpZiAoKGJzaXplICYgKGJzaXplIC0gMSkpIHx8IG5yYml0c3ApIHsKKwkJdW5zaWduZWQgY2hhcglucmJpdHM7CisKKwkJZm9yIChucmJpdHMgPSAzMTsgbnJiaXRzICYmICEoYnNpemUgJiAoMSA8PCBucmJpdHMpKTsgbnJiaXRzLS0pCisJCQk7CisJCWJzaXplID0gMSA8PCBucmJpdHM7CisJCWlmIChucmJpdHNwKQorCQkJKm5yYml0c3AgPSBucmJpdHM7CisJfQorCisJcmV0dXJuIGJzaXplOworfQorCisvKgorICogQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgNTEyYnl0ZSBibG9ja3MgdXNlZC4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIG5mc19jYWxjX2Jsb2NrX3NpemUodTY0IHRzaXplKQoreworCWxvZmZfdCB1c2VkID0gKHRzaXplICsgNTExKSA+PiA5OworCXJldHVybiAodXNlZCA+IFVMT05HX01BWCkgPyBVTE9OR19NQVggOiB1c2VkOworfQorCisvKgorICogQ29tcHV0ZSBhbmQgc2V0IE5GUyBzZXJ2ZXIgYmxvY2tzaXplCisgKi8KK3N0YXRpYyBpbmxpbmUKK3Vuc2lnbmVkIGxvbmcgbmZzX2Jsb2NrX3NpemUodW5zaWduZWQgbG9uZyBic2l6ZSwgdW5zaWduZWQgY2hhciAqbnJiaXRzcCkKK3sKKwlpZiAoYnNpemUgPCBORlNfTUlOX0ZJTEVfSU9fU0laRSkKKwkJYnNpemUgPSBORlNfREVGX0ZJTEVfSU9fU0laRTsKKwllbHNlIGlmIChic2l6ZSA+PSBORlNfTUFYX0ZJTEVfSU9fU0laRSkKKwkJYnNpemUgPSBORlNfTUFYX0ZJTEVfSU9fU0laRTsKKworCXJldHVybiBuZnNfYmxvY2tfYml0cyhic2l6ZSwgbnJiaXRzcCk7Cit9CisKKy8qCisgKiBEZXRlcm1pbmUgdGhlIG1heGltdW0gZmlsZSBzaXplIGZvciBhIHN1cGVyYmxvY2sKKyAqLworc3RhdGljIGlubGluZQordm9pZCBuZnNfc3VwZXJfc2V0X21heGJ5dGVzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIF9fdTY0IG1heGZpbGVzaXplKQoreworCXNiLT5zX21heGJ5dGVzID0gKGxvZmZfdCltYXhmaWxlc2l6ZTsKKwlpZiAoc2ItPnNfbWF4Ynl0ZXMgPiBNQVhfTEZTX0ZJTEVTSVpFIHx8IHNiLT5zX21heGJ5dGVzIDw9IDApCisJCXNiLT5zX21heGJ5dGVzID0gTUFYX0xGU19GSUxFU0laRTsKK30KKworLyoKKyAqIENoZWNrIGlmIHRoZSBzdHJpbmcgcmVwcmVzZW50cyBhICJ2YWxpZCIgSVB2NCBhZGRyZXNzCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHZhbGlkX2lwYWRkcjQoY29uc3QgY2hhciAqYnVmKQoreworCWludCByYywgY291bnQsIGluWzRdOworCisJcmMgPSBzc2NhbmYoYnVmLCAiJWQuJWQuJWQuJWQiLCAmaW5bMF0sICZpblsxXSwgJmluWzJdLCAmaW5bM10pOworCWlmIChyYyAhPSA0KQorCQlyZXR1cm4gLUVJTlZBTDsKKwlmb3IgKGNvdW50ID0gMDsgY291bnQgPCA0OyBjb3VudCsrKSB7CisJCWlmIChpbltjb3VudF0gPiAyNTUpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9mcy9uZnMvbmFtZXNwYWNlLmMgYi9mcy9uZnMvbmFtZXNwYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTliOThjYQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL25mcy9uYW1lc3BhY2UuYwpAQCAtMCwwICsxLDIyOSBAQAorLyoKKyAqIGxpbnV4L2ZzL25mcy9uYW1lc3BhY2UuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBUcm9uZCBNeWtsZWJ1c3QgPFRyb25kLk15a2xlYnVzdEBuZXRhcHAuY29tPgorICoKKyAqIE5GUyBuYW1lc3BhY2UKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKyNpbmNsdWRlIDxsaW51eC9kY2FjaGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgorI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CisjaW5jbHVkZSA8bGludXgvbmZzX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL2NsbnQuaD4KKyNpbmNsdWRlIDxsaW51eC92ZnMuaD4KKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisjZGVmaW5lIE5GU0RCR19GQUNJTElUWQkJTkZTREJHX1ZGUworCitzdGF0aWMgdm9pZCBuZnNfZXhwaXJlX2F1dG9tb3VudHModm9pZCAqbGlzdCk7CisKK0xJU1RfSEVBRChuZnNfYXV0b21vdW50X2xpc3QpOworc3RhdGljIERFQ0xBUkVfV09SSyhuZnNfYXV0b21vdW50X3Rhc2ssIG5mc19leHBpcmVfYXV0b21vdW50cywgJm5mc19hdXRvbW91bnRfbGlzdCk7CitpbnQgbmZzX21vdW50cG9pbnRfZXhwaXJ5X3RpbWVvdXQgPSA1MDAgKiBIWjsKKworLyoKKyAqIG5mc19wYXRoIC0gcmVjb25zdHJ1Y3QgdGhlIHBhdGggZ2l2ZW4gYW4gYXJiaXRyYXJ5IGRlbnRyeQorICogQGJhc2UgLSBhcmJpdHJhcnkgc3RyaW5nIHRvIHByZXBlbmQgdG8gdGhlIHBhdGgKKyAqIEBkZW50cnkgLSBwb2ludGVyIHRvIGRlbnRyeQorICogQGJ1ZmZlciAtIHJlc3VsdCBidWZmZXIKKyAqIEBidWZsZW4gLSBsZW5ndGggb2YgYnVmZmVyCisgKgorICogSGVscGVyIGZ1bmN0aW9uIGZvciBjb25zdHJ1Y3RpbmcgdGhlIHBhdGggZnJvbSB0aGUKKyAqIHJvb3QgZGVudHJ5IHRvIGFuIGFyYml0cmFyeSBoYXNoZWQgZGVudHJ5LgorICoKKyAqIFRoaXMgaXMgbWFpbmx5IGZvciB1c2UgaW4gZmlndXJpbmcgb3V0IHRoZSBwYXRoIG9uIHRoZQorICogc2VydmVyIHNpZGUgd2hlbiBhdXRvbW91bnRpbmcgb24gdG9wIG9mIGFuIGV4aXN0aW5nIHBhcnRpdGlvbi4KKyAqLworY2hhciAqbmZzX3BhdGgoY29uc3QgY2hhciAqYmFzZSwgY29uc3Qgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCSAgICAgICBjaGFyICpidWZmZXIsIHNzaXplX3QgYnVmbGVuKQoreworCWNoYXIgKmVuZCA9IGJ1ZmZlcitidWZsZW47CisJaW50IG5hbWVsZW47CisKKwkqLS1lbmQgPSAnXDAnOworCWJ1Zmxlbi0tOworCXNwaW5fbG9jaygmZGNhY2hlX2xvY2spOworCXdoaWxlICghSVNfUk9PVChkZW50cnkpKSB7CisJCW5hbWVsZW4gPSBkZW50cnktPmRfbmFtZS5sZW47CisJCWJ1ZmxlbiAtPSBuYW1lbGVuICsgMTsKKwkJaWYgKGJ1ZmxlbiA8IDApCisJCQlnb3RvIEVsb25nOworCQllbmQgLT0gbmFtZWxlbjsKKwkJbWVtY3B5KGVuZCwgZGVudHJ5LT5kX25hbWUubmFtZSwgbmFtZWxlbik7CisJCSotLWVuZCA9ICcvJzsKKwkJZGVudHJ5ID0gZGVudHJ5LT5kX3BhcmVudDsKKwl9CisJc3Bpbl91bmxvY2soJmRjYWNoZV9sb2NrKTsKKwluYW1lbGVuID0gc3RybGVuKGJhc2UpOworCS8qIFN0cmlwIG9mZiBleGNlc3Mgc2xhc2hlcyBpbiBiYXNlIHN0cmluZyAqLworCXdoaWxlIChuYW1lbGVuID4gMCAmJiBiYXNlW25hbWVsZW4gLSAxXSA9PSAnLycpCisJCW5hbWVsZW4tLTsKKwlidWZsZW4gLT0gbmFtZWxlbjsKKwlpZiAoYnVmbGVuIDwgMCkKKwkJZ290byBFbG9uZzsKKwllbmQgLT0gbmFtZWxlbjsKKwltZW1jcHkoZW5kLCBiYXNlLCBuYW1lbGVuKTsKKwlyZXR1cm4gZW5kOworRWxvbmc6CisJcmV0dXJuIEVSUl9QVFIoLUVOQU1FVE9PTE9ORyk7Cit9CisKKy8qCisgKiBuZnNfZm9sbG93X21vdW50cG9pbnQgLSBoYW5kbGUgY3Jvc3NpbmcgYSBtb3VudHBvaW50IG9uIHRoZSBzZXJ2ZXIKKyAqIEBkZW50cnkgLSBkZW50cnkgb2YgbW91bnRwb2ludAorICogQG5kIC0gbmFtZWlkYXRhIGluZm8KKyAqCisgKiBXaGVuIHdlIGVuY291bnRlciBhIG1vdW50cG9pbnQgb24gdGhlIHNlcnZlciwgd2Ugd2FudCB0byBzZXQgdXAKKyAqIGEgbW91bnRwb2ludCBvbiB0aGUgY2xpZW50IHRvbywgdG8gcHJldmVudCBpbm9kZSBudW1iZXJzIGZyb20KKyAqIGNvbGxpZGluZywgYW5kIHRvIGFsbG93ICJkZiIgdG8gd29yayBwcm9wZXJseS4KKyAqIE9uIE5GU3Y0LCB3ZSBhbHNvIHdhbnQgdG8gYWxsb3cgZm9yIHRoZSBmYWN0IHRoYXQgZGlmZmVyZW50CisgKiBmaWxlc3lzdGVtcyBtYXkgYmUgbWlncmF0ZWQgdG8gZGlmZmVyZW50IHNlcnZlcnMgaW4gYSBmYWlsb3ZlcgorICogc2l0dWF0aW9uLCBhbmQgdGhhdCBkaWZmZXJlbnQgZmlsZXN5c3RlbXMgbWF5IHdhbnQgdG8gdXNlCisgKiBkaWZmZXJlbnQgc2VjdXJpdHkgZmxhdm91cnMuCisgKi8KK3N0YXRpYyB2b2lkICogbmZzX2ZvbGxvd19tb3VudHBvaW50KHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJc3RydWN0IHZmc21vdW50ICptbnQ7CisJc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciA9IE5GU19TRVJWRVIoZGVudHJ5LT5kX2lub2RlKTsKKwlzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQ7CisJc3RydWN0IG5mc19maCBmaDsKKwlzdHJ1Y3QgbmZzX2ZhdHRyIGZhdHRyOworCWludCBlcnI7CisKKwlCVUdfT04oSVNfUk9PVChkZW50cnkpKTsKKwlkcHJpbnRrKCIlczogZW50ZXJcbiIsIF9fRlVOQ1RJT05fXyk7CisJZHB1dChuZC0+ZGVudHJ5KTsKKwluZC0+ZGVudHJ5ID0gZGdldChkZW50cnkpOworCWlmIChkX21vdW50cG9pbnQobmQtPmRlbnRyeSkpCisJCWdvdG8gb3V0X2ZvbGxvdzsKKwkvKiBMb29rIGl0IHVwIGFnYWluICovCisJcGFyZW50ID0gZGdldF9wYXJlbnQobmQtPmRlbnRyeSk7CisJZXJyID0gc2VydmVyLT5ycGNfb3BzLT5sb29rdXAocGFyZW50LT5kX2lub2RlLCAmbmQtPmRlbnRyeS0+ZF9uYW1lLCAmZmgsICZmYXR0cik7CisJZHB1dChwYXJlbnQpOworCWlmIChlcnIgIT0gMCkKKwkJZ290byBvdXRfZXJyOworCisJaWYgKGZhdHRyLnZhbGlkICYgTkZTX0FUVFJfRkFUVFJfVjRfUkVGRVJSQUwpCisJCW1udCA9IG5mc19kb19yZWZtb3VudChuZC0+bW50LCBuZC0+ZGVudHJ5KTsKKwllbHNlCisJCW1udCA9IG5mc19kb19zdWJtb3VudChuZC0+bW50LCBuZC0+ZGVudHJ5LCAmZmgsICZmYXR0cik7CisJZXJyID0gUFRSX0VSUihtbnQpOworCWlmIChJU19FUlIobW50KSkKKwkJZ290byBvdXRfZXJyOworCisJbW50Z2V0KG1udCk7CisJZXJyID0gZG9fYWRkX21vdW50KG1udCwgbmQsIG5kLT5tbnQtPm1udF9mbGFnc3xNTlRfU0hSSU5LQUJMRSwgJm5mc19hdXRvbW91bnRfbGlzdCk7CisJaWYgKGVyciA8IDApIHsKKwkJbW50cHV0KG1udCk7CisJCWlmIChlcnIgPT0gLUVCVVNZKQorCQkJZ290byBvdXRfZm9sbG93OworCQlnb3RvIG91dF9lcnI7CisJfQorCW1udHB1dChuZC0+bW50KTsKKwlkcHV0KG5kLT5kZW50cnkpOworCW5kLT5tbnQgPSBtbnQ7CisJbmQtPmRlbnRyeSA9IGRnZXQobW50LT5tbnRfcm9vdCk7CisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZuZnNfYXV0b21vdW50X3Rhc2ssIG5mc19tb3VudHBvaW50X2V4cGlyeV90aW1lb3V0KTsKK291dDoKKwlkcHJpbnRrKCIlczogZG9uZSwgcmV0dXJuZWQgJWRcbiIsIF9fRlVOQ1RJT05fXywgZXJyKTsKKwlyZXR1cm4gRVJSX1BUUihlcnIpOworb3V0X2VycjoKKwlwYXRoX3JlbGVhc2UobmQpOworCWdvdG8gb3V0Oworb3V0X2ZvbGxvdzoKKwl3aGlsZShkX21vdW50cG9pbnQobmQtPmRlbnRyeSkgJiYgZm9sbG93X2Rvd24oJm5kLT5tbnQsICZuZC0+ZGVudHJ5KSkKKwkJOworCWVyciA9IDA7CisJZ290byBvdXQ7Cit9CisKK3N0cnVjdCBpbm9kZV9vcGVyYXRpb25zIG5mc19tb3VudHBvaW50X2lub2RlX29wZXJhdGlvbnMgPSB7CisJLmZvbGxvd19saW5rCT0gbmZzX2ZvbGxvd19tb3VudHBvaW50LAorCS5nZXRhdHRyCT0gbmZzX2dldGF0dHIsCit9OworCitzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBuZnNfcmVmZXJyYWxfaW5vZGVfb3BlcmF0aW9ucyA9IHsKKwkuZm9sbG93X2xpbmsJPSBuZnNfZm9sbG93X21vdW50cG9pbnQsCit9OworCitzdGF0aWMgdm9pZCBuZnNfZXhwaXJlX2F1dG9tb3VudHModm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0ID0gKHN0cnVjdCBsaXN0X2hlYWQgKilkYXRhOworCisJbWFya19tb3VudHNfZm9yX2V4cGlyeShsaXN0KTsKKwlpZiAoIWxpc3RfZW1wdHkobGlzdCkpCisJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmbmZzX2F1dG9tb3VudF90YXNrLCBuZnNfbW91bnRwb2ludF9leHBpcnlfdGltZW91dCk7Cit9CisKK3ZvaWQgbmZzX3JlbGVhc2VfYXV0b21vdW50X3RpbWVyKHZvaWQpCit7CisJaWYgKGxpc3RfZW1wdHkoJm5mc19hdXRvbW91bnRfbGlzdCkpIHsKKwkJY2FuY2VsX2RlbGF5ZWRfd29yaygmbmZzX2F1dG9tb3VudF90YXNrKTsKKwkJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKwl9Cit9CisKKy8qCisgKiBDbG9uZSBhIG1vdW50cG9pbnQgb2YgdGhlIGFwcHJvcHJpYXRlIHR5cGUKKyAqLworc3RhdGljIHN0cnVjdCB2ZnNtb3VudCAqbmZzX2RvX2Nsb25lX21vdW50KHN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIsIGNoYXIgKmRldm5hbWUsCisJCQkJCSAgIHN0cnVjdCBuZnNfY2xvbmVfbW91bnQgKm1vdW50ZGF0YSkKK3sKKyNpZmRlZiBDT05GSUdfTkZTX1Y0CisJc3RydWN0IHZmc21vdW50ICptbnQgPSBOVUxMOworCXN3aXRjaCAoc2VydmVyLT5ycGNfb3BzLT52ZXJzaW9uKSB7CisJCWNhc2UgMjoKKwkJY2FzZSAzOgorCQkJbW50ID0gdmZzX2tlcm5fbW91bnQoJmNsb25lX25mc19mc190eXBlLCAwLCBkZXZuYW1lLCBtb3VudGRhdGEpOworCQkJYnJlYWs7CisJCWNhc2UgNDoKKwkJCW1udCA9IHZmc19rZXJuX21vdW50KCZjbG9uZV9uZnM0X2ZzX3R5cGUsIDAsIGRldm5hbWUsIG1vdW50ZGF0YSk7CisJfQorCXJldHVybiBtbnQ7CisjZWxzZQorCXJldHVybiB2ZnNfa2Vybl9tb3VudCgmY2xvbmVfbmZzX2ZzX3R5cGUsIDAsIGRldm5hbWUsIG1vdW50ZGF0YSk7CisjZW5kaWYKK30KKworLyoqCisgKiBuZnNfZG9fc3VibW91bnQgLSBzZXQgdXAgbW91bnRwb2ludCB3aGVuIGNyb3NzaW5nIGEgZmlsZXN5c3RlbSBib3VuZGFyeQorICogQG1udF9wYXJlbnQgLSBtb3VudHBvaW50IG9mIHBhcmVudCBkaXJlY3RvcnkKKyAqIEBkZW50cnkgLSBwYXJlbnQgZGlyZWN0b3J5CisgKiBAZmggLSBmaWxlaGFuZGxlIGZvciBuZXcgcm9vdCBkZW50cnkKKyAqIEBmYXR0ciAtIGF0dHJpYnV0ZXMgZm9yIG5ldyByb290IGlub2RlCisgKgorICovCitzdHJ1Y3QgdmZzbW91bnQgKm5mc19kb19zdWJtb3VudChjb25zdCBzdHJ1Y3QgdmZzbW91bnQgKm1udF9wYXJlbnQsCisJCWNvbnN0IHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5mc19maCAqZmgsCisJCXN0cnVjdCBuZnNfZmF0dHIgKmZhdHRyKQoreworCXN0cnVjdCBuZnNfY2xvbmVfbW91bnQgbW91bnRkYXRhID0geworCQkuc2IgPSBtbnRfcGFyZW50LT5tbnRfc2IsCisJCS5kZW50cnkgPSBkZW50cnksCisJCS5maCA9IGZoLAorCQkuZmF0dHIgPSBmYXR0ciwKKwl9OworCXN0cnVjdCB2ZnNtb3VudCAqbW50ID0gRVJSX1BUUigtRU5PTUVNKTsKKwljaGFyICpwYWdlID0gKGNoYXIgKikgX19nZXRfZnJlZV9wYWdlKEdGUF9VU0VSKTsKKwljaGFyICpkZXZuYW1lOworCisJZHByaW50aygiJXM6IHN1Ym1vdW50aW5nIG9uICVzLyVzXG4iLCBfX0ZVTkNUSU9OX18sCisJCQlkZW50cnktPmRfcGFyZW50LT5kX25hbWUubmFtZSwKKwkJCWRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCWlmIChwYWdlID09IE5VTEwpCisJCWdvdG8gb3V0OworCWRldm5hbWUgPSBuZnNfZGV2bmFtZShtbnRfcGFyZW50LCBkZW50cnksIHBhZ2UsIFBBR0VfU0laRSk7CisJbW50ID0gKHN0cnVjdCB2ZnNtb3VudCAqKWRldm5hbWU7CisJaWYgKElTX0VSUihkZXZuYW1lKSkKKwkJZ290byBmcmVlX3BhZ2U7CisJbW50ID0gbmZzX2RvX2Nsb25lX21vdW50KE5GU19TQihtbnRfcGFyZW50LT5tbnRfc2IpLCBkZXZuYW1lLCAmbW91bnRkYXRhKTsKK2ZyZWVfcGFnZToKKwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpcGFnZSk7CitvdXQ6CisJZHByaW50aygiJXM6IGRvbmVcbiIsIF9fRlVOQ1RJT05fXyk7CisJcmV0dXJuIG1udDsKK30KZGlmZiAtLWdpdCBhL2ZzL25mcy9uZnMyeGRyLmMgYi9mcy9uZnMvbmZzMnhkci5jCmluZGV4IGYwMDE1ZmEuLjY3MzkxZWUgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9uZnMyeGRyLmMKKysrIGIvZnMvbmZzL25mczJ4ZHIuYwpAQCAtMjMsMTIgKzIzLDExIEBACiAjaW5jbHVkZSA8bGludXgvbmZzLmg+CiAjaW5jbHVkZSA8bGludXgvbmZzMi5oPgogI2luY2x1ZGUgPGxpbnV4L25mc19mcy5oPgorI2luY2x1ZGUgImludGVybmFsLmgiCiAKICNkZWZpbmUgTkZTREJHX0ZBQ0lMSVRZCQlORlNEQkdfWERSCiAvKiAjZGVmaW5lIE5GU19QQVJBTk9JQSAxICovCiAKLWV4dGVybiBpbnQJCQluZnNfc3RhdF90b19lcnJubyhpbnQgc3RhdCk7Ci0KIC8qIE1hcHBpbmcgZnJvbSBORlMgZXJyb3IgY29kZSB0byAiZXJybm8iIGVycm9yIGNvZGUuICovCiAjZGVmaW5lIGVycm5vX05GU0VSUl9JTwkJRUlPCiAKQEAgLTEzMSw3ICsxMzAsOCBAQAogCWZhdHRyLT5kdS5uZnMyLmJsb2Nrc2l6ZSA9IG50b2hsKCpwKyspOwogCXJkZXYgPSBudG9obCgqcCsrKTsKIAlmYXR0ci0+ZHUubmZzMi5ibG9ja3MgPSBudG9obCgqcCsrKTsKLQlmYXR0ci0+ZnNpZF91Lm5mczMgPSBudG9obCgqcCsrKTsKKwlmYXR0ci0+ZnNpZC5tYWpvciA9IG50b2hsKCpwKyspOworCWZhdHRyLT5mc2lkLm1pbm9yID0gMDsKIAlmYXR0ci0+ZmlsZWlkID0gbnRvaGwoKnArKyk7CiAJcCA9IHhkcl9kZWNvZGVfdGltZShwLCAmZmF0dHItPmF0aW1lKTsKIAlwID0geGRyX2RlY29kZV90aW1lKHAsICZmYXR0ci0+bXRpbWUpOwpkaWZmIC0tZ2l0IGEvZnMvbmZzL25mczNhY2wuYyBiL2ZzL25mcy9uZnMzYWNsLmMKaW5kZXggMzMyODc4Ny4uNzMyMmRhNCAxMDA2NDQKLS0tIGEvZnMvbmZzL25mczNhY2wuYworKysgYi9mcy9uZnMvbmZzM2FjbC5jCkBAIC0xNzIsOCArMTcyLDEwIEBACiAJCWlub2RlLT5pX2lubywgYWNsLCBkZmFjbCk7CiAJc3Bpbl9sb2NrKCZpbm9kZS0+aV9sb2NrKTsKIAlfX25mczNfZm9yZ2V0X2NhY2hlZF9hY2xzKE5GU19JKGlub2RlKSk7Ci0JbmZzaS0+YWNsX2FjY2VzcyA9IHBvc2l4X2FjbF9kdXAoYWNsKTsKLQluZnNpLT5hY2xfZGVmYXVsdCA9IHBvc2l4X2FjbF9kdXAoZGZhY2wpOworCWlmICghSVNfRVJSKGFjbCkpCisJCW5mc2ktPmFjbF9hY2Nlc3MgPSBwb3NpeF9hY2xfZHVwKGFjbCk7CisJaWYgKCFJU19FUlIoZGZhY2wpKQorCQluZnNpLT5hY2xfZGVmYXVsdCA9IHBvc2l4X2FjbF9kdXAoZGZhY2wpOwogCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKIH0KIApAQCAtMjU0LDcgKzI1Niw5IEBACiAJCQlyZXMuYWNsX2FjY2VzcyA9IE5VTEw7CiAJCX0KIAl9Ci0JbmZzM19jYWNoZV9hY2xzKGlub2RlLCByZXMuYWNsX2FjY2VzcywgcmVzLmFjbF9kZWZhdWx0KTsKKwluZnMzX2NhY2hlX2FjbHMoaW5vZGUsCisJCShyZXMubWFzayAmIE5GU19BQ0wpICAgPyByZXMuYWNsX2FjY2VzcyAgOiBFUlJfUFRSKC1FSU5WQUwpLAorCQkocmVzLm1hc2sgJiBORlNfREZBQ0wpID8gcmVzLmFjbF9kZWZhdWx0IDogRVJSX1BUUigtRUlOVkFMKSk7CiAKIAlzd2l0Y2godHlwZSkgewogCQljYXNlIEFDTF9UWVBFX0FDQ0VTUzoKQEAgLTMyOSw2ICszMzMsNyBAQAogCXN3aXRjaCAoc3RhdHVzKSB7CiAJCWNhc2UgMDoKIAkJCXN0YXR1cyA9IG5mc19yZWZyZXNoX2lub2RlKGlub2RlLCAmZmF0dHIpOworCQkJbmZzM19jYWNoZV9hY2xzKGlub2RlLCBhY2wsIGRmYWNsKTsKIAkJCWJyZWFrOwogCQljYXNlIC1FUEZOT1NVUFBPUlQ6CiAJCWNhc2UgLUVQUk9UT05PU1VQUE9SVDoKZGlmZiAtLWdpdCBhL2ZzL25mcy9uZnMzcHJvYy5jIGIvZnMvbmZzL25mczNwcm9jLmMKaW5kZXggY2YxODZmMC4uNzE0M2IxZiAxMDA2NDQKLS0tIGEvZnMvbmZzL25mczNwcm9jLmMKKysrIGIvZnMvbmZzL25mczNwcm9jLmMKQEAgLTIwLDExICsyMCwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L25mc19tb3VudC5oPgogCiAjaW5jbHVkZSAiaW9zdGF0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAogI2RlZmluZSBORlNEQkdfRkFDSUxJVFkJCU5GU0RCR19QUk9DCiAKLWV4dGVybiBzdHJ1Y3QgcnBjX3Byb2NpbmZvIG5mczNfcHJvY2VkdXJlc1tdOwotCiAvKiBBIHdyYXBwZXIgdG8gaGFuZGxlIHRoZSBFSlVLRUJPWCBlcnJvciBtZXNzYWdlICovCiBzdGF0aWMgaW50CiBuZnMzX3JwY193cmFwcGVyKHN0cnVjdCBycGNfY2xudCAqY2xudCwgc3RydWN0IHJwY19tZXNzYWdlICptc2csIGludCBmbGFncykKQEAgLTgwOSw4ICs4MDgsNiBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKLWV4dGVybiB1MzIgKm5mczNfZGVjb2RlX2RpcmVudCh1MzIgKiwgc3RydWN0IG5mc19lbnRyeSAqLCBpbnQpOwotCiBzdGF0aWMgaW50IG5mczNfcmVhZF9kb25lKHN0cnVjdCBycGNfdGFzayAqdGFzaywgc3RydWN0IG5mc19yZWFkX2RhdGEgKmRhdGEpCiB7CiAJaWYgKG5mczNfYXN5bmNfaGFuZGxlX2p1a2Vib3godGFzaywgZGF0YS0+aW5vZGUpKQpkaWZmIC0tZ2l0IGEvZnMvbmZzL25mczN4ZHIuYyBiL2ZzL25mcy9uZnMzeGRyLmMKaW5kZXggZWMyMzM2MS4uMDI1MDI2OSAxMDA2NDQKLS0tIGEvZnMvbmZzL25mczN4ZHIuYworKysgYi9mcy9uZnMvbmZzM3hkci5jCkBAIC0yMiwxNCArMjIsMTMgQEAKICNpbmNsdWRlIDxsaW51eC9uZnMzLmg+CiAjaW5jbHVkZSA8bGludXgvbmZzX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvbmZzYWNsLmg+CisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAogI2RlZmluZSBORlNEQkdfRkFDSUxJVFkJCU5GU0RCR19YRFIKIAogLyogTWFwcGluZyBmcm9tIE5GUyBlcnJvciBjb2RlIHRvICJlcnJubyIgZXJyb3IgY29kZS4gKi8KICNkZWZpbmUgZXJybm9fTkZTRVJSX0lPCQlFSU8KIAotZXh0ZXJuIGludAkJCW5mc19zdGF0X3RvX2Vycm5vKGludCk7Ci0KIC8qCiAgKiBEZWNsYXJlIHRoZSBzcGFjZSByZXF1aXJlbWVudHMgZm9yIE5GUyBhcmd1bWVudHMgYW5kIHJlcGxpZXMgYXMKICAqIG51bWJlciBvZiAzMmJpdC13b3JkcwpAQCAtMTY2LDcgKzE2NSw4IEBACiAJaWYgKE1BSk9SKGZhdHRyLT5yZGV2KSAhPSBtYWpvciB8fCBNSU5PUihmYXR0ci0+cmRldikgIT0gbWlub3IpCiAJCWZhdHRyLT5yZGV2ID0gMDsKIAotCXAgPSB4ZHJfZGVjb2RlX2h5cGVyKHAsICZmYXR0ci0+ZnNpZF91Lm5mczMpOworCXAgPSB4ZHJfZGVjb2RlX2h5cGVyKHAsICZmYXR0ci0+ZnNpZC5tYWpvcik7CisJZmF0dHItPmZzaWQubWlub3IgPSAwOwogCXAgPSB4ZHJfZGVjb2RlX2h5cGVyKHAsICZmYXR0ci0+ZmlsZWlkKTsKIAlwID0geGRyX2RlY29kZV90aW1lMyhwLCAmZmF0dHItPmF0aW1lKTsKIAlwID0geGRyX2RlY29kZV90aW1lMyhwLCAmZmF0dHItPm10aW1lKTsKZGlmZiAtLWdpdCBhL2ZzL25mcy9uZnM0X2ZzLmggYi9mcy9uZnMvbmZzNF9mcy5oCmluZGV4IDBmNWU0ZTcuLjlhMTAyODYgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9uZnM0X2ZzLmgKKysrIGIvZnMvbmZzL25mczRfZnMuaApAQCAtMjE3LDYgKzIxNyw5IEBACiBleHRlcm4gaW50IG5mczRfZG9fY2xvc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IG5mczRfc3RhdGUgKnN0YXRlKTsKIGV4dGVybiBzdHJ1Y3QgZGVudHJ5ICpuZnM0X2F0b21pY19vcGVuKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZGVudHJ5ICosIHN0cnVjdCBuYW1laWRhdGEgKik7CiBleHRlcm4gaW50IG5mczRfb3Blbl9yZXZhbGlkYXRlKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZGVudHJ5ICosIGludCwgc3RydWN0IG5hbWVpZGF0YSAqKTsKK2V4dGVybiBpbnQgbmZzNF9zZXJ2ZXJfY2FwYWJpbGl0aWVzKHN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIsIHN0cnVjdCBuZnNfZmggKmZoYW5kbGUpOworZXh0ZXJuIGludCBuZnM0X3Byb2NfZnNfbG9jYXRpb25zKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCXN0cnVjdCBuZnM0X2ZzX2xvY2F0aW9ucyAqZnNfbG9jYXRpb25zLCBzdHJ1Y3QgcGFnZSAqcGFnZSk7CiAKIGV4dGVybiBzdHJ1Y3QgbmZzNF9zdGF0ZV9yZWNvdmVyeV9vcHMgbmZzNF9yZWJvb3RfcmVjb3Zlcnlfb3BzOwogZXh0ZXJuIHN0cnVjdCBuZnM0X3N0YXRlX3JlY292ZXJ5X29wcyBuZnM0X25ldHdvcmtfcGFydGl0aW9uX3JlY292ZXJ5X29wczsKQEAgLTIyNSw2ICsyMjgsNyBAQAogZXh0ZXJuIGNvbnN0IHUzMiBuZnM0X3N0YXRmc19iaXRtYXBbMl07CiBleHRlcm4gY29uc3QgdTMyIG5mczRfcGF0aGNvbmZfYml0bWFwWzJdOwogZXh0ZXJuIGNvbnN0IHUzMiBuZnM0X2ZzaW5mb19iaXRtYXBbMl07CitleHRlcm4gY29uc3QgdTMyIG5mczRfZnNfbG9jYXRpb25zX2JpdG1hcFsyXTsKIAogLyogbmZzNHJlbmV3ZC5jICovCiBleHRlcm4gdm9pZCBuZnM0X3NjaGVkdWxlX3N0YXRlX3JlbmV3YWwoc3RydWN0IG5mczRfY2xpZW50ICopOwpkaWZmIC0tZ2l0IGEvZnMvbmZzL25mczRuYW1lc3BhY2UuYyBiL2ZzL25mcy9uZnM0bmFtZXNwYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWEzOGQyNwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL25mcy9uZnM0bmFtZXNwYWNlLmMKQEAgLTAsMCArMSwyMDEgQEAKKy8qCisgKiBsaW51eC9mcy9uZnMvbmZzNG5hbWVzcGFjZS5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IFRyb25kIE15a2xlYnVzdCA8VHJvbmQuTXlrbGVidXN0QG5ldGFwcC5jb20+CisgKgorICogTkZTdjQgbmFtZXNwYWNlCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorCisjaW5jbHVkZSA8bGludXgvZGNhY2hlLmg+CisjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KKyNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgorI2luY2x1ZGUgPGxpbnV4L25mc19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9jbG50Lmg+CisjaW5jbHVkZSA8bGludXgvdmZzLmg+CisjaW5jbHVkZSA8bGludXgvaW5ldC5oPgorI2luY2x1ZGUgImludGVybmFsLmgiCisKKyNkZWZpbmUgTkZTREJHX0ZBQ0lMSVRZCQlORlNEQkdfVkZTCisKKy8qCisgKiBDaGVjayBpZiBmc19yb290IGlzIHZhbGlkCisgKi8KK3N0YXRpYyBpbmxpbmUgY2hhciAqbmZzNF9wYXRobmFtZV9zdHJpbmcoc3RydWN0IG5mczRfcGF0aG5hbWUgKnBhdGhuYW1lLAorCQkJCQkgY2hhciAqYnVmZmVyLCBzc2l6ZV90IGJ1ZmxlbikKK3sKKwljaGFyICplbmQgPSBidWZmZXIgKyBidWZsZW47CisJaW50IG47CisKKwkqLS1lbmQgPSAnXDAnOworCWJ1Zmxlbi0tOworCisJbiA9IHBhdGhuYW1lLT5uY29tcG9uZW50czsKKwl3aGlsZSAoLS1uID49IDApIHsKKwkJc3RydWN0IG5mczRfc3RyaW5nICpjb21wb25lbnQgPSAmcGF0aG5hbWUtPmNvbXBvbmVudHNbbl07CisJCWJ1ZmxlbiAtPSBjb21wb25lbnQtPmxlbiArIDE7CisJCWlmIChidWZsZW4gPCAwKQorCQkJZ290byBFbG9uZzsKKwkJZW5kIC09IGNvbXBvbmVudC0+bGVuOworCQltZW1jcHkoZW5kLCBjb21wb25lbnQtPmRhdGEsIGNvbXBvbmVudC0+bGVuKTsKKwkJKi0tZW5kID0gJy8nOworCX0KKwlyZXR1cm4gZW5kOworRWxvbmc6CisJcmV0dXJuIEVSUl9QVFIoLUVOQU1FVE9PTE9ORyk7Cit9CisKKworLyoqCisgKiBuZnNfZm9sbG93X3JlZmVycmFsIC0gc2V0IHVwIG1vdW50cG9pbnQgd2hlbiBoaXR0aW5nIGEgcmVmZXJyYWwgb24gbW92ZWQgZXJyb3IKKyAqIEBtbnRfcGFyZW50IC0gbW91bnRwb2ludCBvZiBwYXJlbnQgZGlyZWN0b3J5CisgKiBAZGVudHJ5IC0gcGFyZW50IGRpcmVjdG9yeQorICogQGZzcGF0aCAtIGZzIHBhdGggcmV0dXJuZWQgaW4gZnNfbG9jYXRpb25zCisgKiBAbW50cGF0aCAtIG1vdW50IHBhdGggdG8gbmV3IHNlcnZlcgorICogQGhvc3RuYW1lIC0gaG9zdG5hbWUgb2YgbmV3IHNlcnZlcgorICogQGFkZHIgLSBob3N0IGFkZHIgb2YgbmV3IHNlcnZlcgorICoKKyAqLworc3RhdGljIHN0cnVjdCB2ZnNtb3VudCAqbmZzX2ZvbGxvd19yZWZlcnJhbChjb25zdCBzdHJ1Y3QgdmZzbW91bnQgKm1udF9wYXJlbnQsCisJCQkJCSAgICBjb25zdCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCQkJCSAgICBzdHJ1Y3QgbmZzNF9mc19sb2NhdGlvbnMgKmxvY2F0aW9ucykKK3sKKwlzdHJ1Y3QgdmZzbW91bnQgKm1udCA9IEVSUl9QVFIoLUVOT0VOVCk7CisJc3RydWN0IG5mc19jbG9uZV9tb3VudCBtb3VudGRhdGEgPSB7CisJCS5zYiA9IG1udF9wYXJlbnQtPm1udF9zYiwKKwkJLmRlbnRyeSA9IGRlbnRyeSwKKwkJLmF1dGhmbGF2b3IgPSBORlNfU0IobW50X3BhcmVudC0+bW50X3NiKS0+Y2xpZW50LT5jbF9hdXRoLT5hdV9mbGF2b3IsCisJfTsKKwljaGFyICpwYWdlLCAqcGFnZTI7CisJY2hhciAqcGF0aCwgKmZzX3BhdGg7CisJY2hhciAqZGV2bmFtZTsKKwlpbnQgbG9jLCBzOworCisJaWYgKGxvY2F0aW9ucyA9PSBOVUxMIHx8IGxvY2F0aW9ucy0+bmxvY2F0aW9ucyA8PSAwKQorCQlnb3RvIG91dDsKKworCWRwcmludGsoIiVzOiByZWZlcnJhbCBhdCAlcy8lc1xuIiwgX19GVU5DVElPTl9fLAorCQlkZW50cnktPmRfcGFyZW50LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubmFtZSk7CisKKwkvKiBFbnN1cmUgZnMgcGF0aCBpcyBhIHByZWZpeCBvZiBjdXJyZW50IGRlbnRyeSBwYXRoICovCisJcGFnZSA9IChjaGFyICopIF9fZ2V0X2ZyZWVfcGFnZShHRlBfVVNFUik7CisJaWYgKHBhZ2UgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisJcGFnZTIgPSAoY2hhciAqKSBfX2dldF9mcmVlX3BhZ2UoR0ZQX1VTRVIpOworCWlmIChwYWdlMiA9PSBOVUxMKQorCQlnb3RvIG91dDsKKworCXBhdGggPSBuZnM0X3BhdGgoZGVudHJ5LCBwYWdlLCBQQUdFX1NJWkUpOworCWlmIChJU19FUlIocGF0aCkpCisJCWdvdG8gb3V0X2ZyZWU7CisKKwlmc19wYXRoID0gbmZzNF9wYXRobmFtZV9zdHJpbmcoJmxvY2F0aW9ucy0+ZnNfcGF0aCwgcGFnZTIsIFBBR0VfU0laRSk7CisJaWYgKElTX0VSUihmc19wYXRoKSkKKwkJZ290byBvdXRfZnJlZTsKKworCWlmIChzdHJuY21wKHBhdGgsIGZzX3BhdGgsIHN0cmxlbihmc19wYXRoKSkgIT0gMCkgeworCQlkcHJpbnRrKCIlczogcGF0aCAlcyBkb2VzIG5vdCBiZWdpbiB3aXRoIGZzcm9vdCAlc1xuIiwgX19GVU5DVElPTl9fLCBwYXRoLCBmc19wYXRoKTsKKwkJZ290byBvdXRfZnJlZTsKKwl9CisKKwlkZXZuYW1lID0gbmZzX2Rldm5hbWUobW50X3BhcmVudCwgZGVudHJ5LCBwYWdlLCBQQUdFX1NJWkUpOworCWlmIChJU19FUlIoZGV2bmFtZSkpIHsKKwkJbW50ID0gKHN0cnVjdCB2ZnNtb3VudCAqKWRldm5hbWU7CisJCWdvdG8gb3V0X2ZyZWU7CisJfQorCisJbG9jID0gMDsKKwl3aGlsZSAobG9jIDwgbG9jYXRpb25zLT5ubG9jYXRpb25zICYmIElTX0VSUihtbnQpKSB7CisJCXN0cnVjdCBuZnM0X2ZzX2xvY2F0aW9uICpsb2NhdGlvbiA9ICZsb2NhdGlvbnMtPmxvY2F0aW9uc1tsb2NdOworCQljaGFyICptbnRfcGF0aDsKKworCQlpZiAobG9jYXRpb24gPT0gTlVMTCB8fCBsb2NhdGlvbi0+bnNlcnZlcnMgPD0gMCB8fAorCQkgICAgbG9jYXRpb24tPnJvb3RwYXRoLm5jb21wb25lbnRzID09IDApIHsKKwkJCWxvYysrOworCQkJY29udGludWU7CisJCX0KKworCQltbnRfcGF0aCA9IG5mczRfcGF0aG5hbWVfc3RyaW5nKCZsb2NhdGlvbi0+cm9vdHBhdGgsIHBhZ2UyLCBQQUdFX1NJWkUpOworCQlpZiAoSVNfRVJSKG1udF9wYXRoKSkgeworCQkJbG9jKys7CisJCQljb250aW51ZTsKKwkJfQorCQltb3VudGRhdGEubW50X3BhdGggPSBtbnRfcGF0aDsKKworCQlzID0gMDsKKwkJd2hpbGUgKHMgPCBsb2NhdGlvbi0+bnNlcnZlcnMpIHsKKwkJCXN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyID0ge307CisKKwkJCWlmIChsb2NhdGlvbi0+c2VydmVyc1tzXS5sZW4gPD0gMCB8fAorCQkJICAgIHZhbGlkX2lwYWRkcjQobG9jYXRpb24tPnNlcnZlcnNbc10uZGF0YSkgPCAwKSB7CisJCQkJcysrOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQltb3VudGRhdGEuaG9zdG5hbWUgPSBsb2NhdGlvbi0+c2VydmVyc1tzXS5kYXRhOworCQkJYWRkci5zaW5fYWRkci5zX2FkZHIgPSBpbl9hdG9uKG1vdW50ZGF0YS5ob3N0bmFtZSk7CisJCQlhZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCQkJYWRkci5zaW5fcG9ydCA9IGh0b25zKE5GU19QT1JUKTsKKwkJCW1vdW50ZGF0YS5hZGRyID0gJmFkZHI7CisKKwkJCW1udCA9IHZmc19rZXJuX21vdW50KCZuZnNfcmVmZXJyYWxfbmZzNF9mc190eXBlLCAwLCBkZXZuYW1lLCAmbW91bnRkYXRhKTsKKwkJCWlmICghSVNfRVJSKG1udCkpIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXMrKzsKKwkJfQorCQlsb2MrKzsKKwl9CisKK291dF9mcmVlOgorCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylwYWdlKTsKKwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpcGFnZTIpOworb3V0OgorCWRwcmludGsoIiVzOiBkb25lXG4iLCBfX0ZVTkNUSU9OX18pOworCXJldHVybiBtbnQ7Cit9CisKKy8qCisgKiBuZnNfZG9fcmVmbW91bnQgLSBoYW5kbGUgY3Jvc3NpbmcgYSByZWZlcnJhbCBvbiBzZXJ2ZXIKKyAqIEBkZW50cnkgLSBkZW50cnkgb2YgcmVmZXJyYWwKKyAqIEBuZCAtIG5hbWVpZGF0YSBpbmZvCisgKgorICovCitzdHJ1Y3QgdmZzbW91bnQgKm5mc19kb19yZWZtb3VudChjb25zdCBzdHJ1Y3QgdmZzbW91bnQgKm1udF9wYXJlbnQsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlzdHJ1Y3QgdmZzbW91bnQgKm1udCA9IEVSUl9QVFIoLUVOT0VOVCk7CisJc3RydWN0IGRlbnRyeSAqcGFyZW50OworCXN0cnVjdCBuZnM0X2ZzX2xvY2F0aW9ucyAqZnNfbG9jYXRpb25zID0gTlVMTDsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwlpbnQgZXJyOworCisJLyogQlVHX09OKElTX1JPT1QoZGVudHJ5KSk7ICovCisJZHByaW50aygiJXM6IGVudGVyXG4iLCBfX0ZVTkNUSU9OX18pOworCisJcGFnZSA9IGFsbG9jX3BhZ2UoR0ZQX0tFUk5FTCk7CisJaWYgKHBhZ2UgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisKKwlmc19sb2NhdGlvbnMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbmZzNF9mc19sb2NhdGlvbnMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoZnNfbG9jYXRpb25zID09IE5VTEwpCisJCWdvdG8gb3V0X2ZyZWU7CisKKwkvKiBHZXQgbG9jYXRpb25zICovCisJcGFyZW50ID0gZGdldF9wYXJlbnQoZGVudHJ5KTsKKwlkcHJpbnRrKCIlczogZ2V0dGluZyBsb2NhdGlvbnMgZm9yICVzLyVzXG4iLCBfX0ZVTkNUSU9OX18sIHBhcmVudC0+ZF9uYW1lLm5hbWUsIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCWVyciA9IG5mczRfcHJvY19mc19sb2NhdGlvbnMocGFyZW50LT5kX2lub2RlLCBkZW50cnksIGZzX2xvY2F0aW9ucywgcGFnZSk7CisJZHB1dChwYXJlbnQpOworCWlmIChlcnIgIT0gMCB8fCBmc19sb2NhdGlvbnMtPm5sb2NhdGlvbnMgPD0gMCB8fAorCSAgICBmc19sb2NhdGlvbnMtPmZzX3BhdGgubmNvbXBvbmVudHMgPD0gMCkKKwkJZ290byBvdXRfZnJlZTsKKworCW1udCA9IG5mc19mb2xsb3dfcmVmZXJyYWwobW50X3BhcmVudCwgZGVudHJ5LCBmc19sb2NhdGlvbnMpOworb3V0X2ZyZWU6CisJX19mcmVlX3BhZ2UocGFnZSk7CisJa2ZyZWUoZnNfbG9jYXRpb25zKTsKK291dDoKKwlkcHJpbnRrKCIlczogZG9uZVxuIiwgX19GVU5DVElPTl9fKTsKKwlyZXR1cm4gbW50OworfQpkaWZmIC0tZ2l0IGEvZnMvbmZzL25mczRwcm9jLmMgYi9mcy9uZnMvbmZzNHByb2MuYwppbmRleCBkODZjMGRiLi5iNDkxNmIwIDEwMDY0NAotLS0gYS9mcy9uZnMvbmZzNHByb2MuYworKysgYi9mcy9uZnMvbmZzNHByb2MuYwpAQCAtNjUsOCArNjUsNiBAQAogc3RhdGljIGludCBfbmZzNF9wcm9jX2FjY2VzcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgbmZzX2FjY2Vzc19lbnRyeSAqZW50cnkpOwogc3RhdGljIGludCBuZnM0X2hhbmRsZV9leGNlcHRpb24oY29uc3Qgc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciwgaW50IGVycm9yY29kZSwgc3RydWN0IG5mczRfZXhjZXB0aW9uICpleGNlcHRpb24pOwogc3RhdGljIGludCBuZnM0X3dhaXRfY2xudF9yZWNvdmVyKHN0cnVjdCBycGNfY2xudCAqY2xudCwgc3RydWN0IG5mczRfY2xpZW50ICpjbHApOwotZXh0ZXJuIHUzMiAqbmZzNF9kZWNvZGVfZGlyZW50KHUzMiAqcCwgc3RydWN0IG5mc19lbnRyeSAqZW50cnksIGludCBwbHVzKTsKLWV4dGVybiBzdHJ1Y3QgcnBjX3Byb2NpbmZvIG5mczRfcHJvY2VkdXJlc1tdOwogCiAvKiBQcmV2ZW50IGxlYWtzIG9mIE5GU3Y0IGVycm9ycyBpbnRvIHVzZXJsYW5kICovCiBpbnQgbmZzNF9tYXBfZXJyb3JzKGludCBlcnIpCkBAIC0xMjEsNiArMTE5LDI1IEBACiAJCQkwCiB9OwogCitjb25zdCB1MzIgbmZzNF9mc19sb2NhdGlvbnNfYml0bWFwWzJdID0geworCUZBVFRSNF9XT1JEMF9UWVBFCisJfCBGQVRUUjRfV09SRDBfQ0hBTkdFCisJfCBGQVRUUjRfV09SRDBfU0laRQorCXwgRkFUVFI0X1dPUkQwX0ZTSUQKKwl8IEZBVFRSNF9XT1JEMF9GSUxFSUQKKwl8IEZBVFRSNF9XT1JEMF9GU19MT0NBVElPTlMsCisJRkFUVFI0X1dPUkQxX01PREUKKwl8IEZBVFRSNF9XT1JEMV9OVU1MSU5LUworCXwgRkFUVFI0X1dPUkQxX09XTkVSCisJfCBGQVRUUjRfV09SRDFfT1dORVJfR1JPVVAKKwl8IEZBVFRSNF9XT1JEMV9SQVdERVYKKwl8IEZBVFRSNF9XT1JEMV9TUEFDRV9VU0VECisJfCBGQVRUUjRfV09SRDFfVElNRV9BQ0NFU1MKKwl8IEZBVFRSNF9XT1JEMV9USU1FX01FVEFEQVRBCisJfCBGQVRUUjRfV09SRDFfVElNRV9NT0RJRlkKKwl8IEZBVFRSNF9XT1JEMV9NT1VOVEVEX09OX0ZJTEVJRAorfTsKKwogc3RhdGljIHZvaWQgbmZzNF9zZXR1cF9yZWFkZGlyKHU2NCBjb29raWUsIHUzMiAqdmVyaWZpZXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKIAkJc3RydWN0IG5mczRfcmVhZGRpcl9hcmcgKnJlYWRkaXIpCiB7CkBAIC0xODUsMTUgKzIwMiwxNSBAQAogCXNwaW5fdW5sb2NrKCZjbHAtPmNsX2xvY2spOwogfQogCi1zdGF0aWMgdm9pZCB1cGRhdGVfY2hhbmdlYXR0cihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgbmZzNF9jaGFuZ2VfaW5mbyAqY2luZm8pCitzdGF0aWMgdm9pZCB1cGRhdGVfY2hhbmdlYXR0cihzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IG5mczRfY2hhbmdlX2luZm8gKmNpbmZvKQogewotCXN0cnVjdCBuZnNfaW5vZGUgKm5mc2kgPSBORlNfSShpbm9kZSk7CisJc3RydWN0IG5mc19pbm9kZSAqbmZzaSA9IE5GU19JKGRpcik7CiAKLQlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOwotCW5mc2ktPmNhY2hlX3ZhbGlkaXR5IHw9IE5GU19JTk9fSU5WQUxJRF9BVFRSOworCXNwaW5fbG9jaygmZGlyLT5pX2xvY2spOworCW5mc2ktPmNhY2hlX3ZhbGlkaXR5IHw9IE5GU19JTk9fSU5WQUxJRF9BVFRSfE5GU19JTk9fUkVWQUxfUEFHRUNBQ0hFfE5GU19JTk9fSU5WQUxJRF9EQVRBOwogCWlmIChjaW5mby0+YmVmb3JlID09IG5mc2ktPmNoYW5nZV9hdHRyICYmIGNpbmZvLT5hdG9taWMpCiAJCW5mc2ktPmNoYW5nZV9hdHRyID0gY2luZm8tPmFmdGVyOwotCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwlzcGluX3VubG9jaygmZGlyLT5pX2xvY2spOwogfQogCiBzdHJ1Y3QgbmZzNF9vcGVuZGF0YSB7CkBAIC0xMzMxLDcgKzEzNDgsNyBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXRpYyBpbnQgbmZzNF9zZXJ2ZXJfY2FwYWJpbGl0aWVzKHN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIsIHN0cnVjdCBuZnNfZmggKmZoYW5kbGUpCitpbnQgbmZzNF9zZXJ2ZXJfY2FwYWJpbGl0aWVzKHN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIsIHN0cnVjdCBuZnNfZmggKmZoYW5kbGUpCiB7CiAJc3RydWN0IG5mczRfZXhjZXB0aW9uIGV4Y2VwdGlvbiA9IHsgfTsKIAlpbnQgZXJyOwpAQCAtMTQ0Myw2ICsxNDYwLDUwIEBACiAJcmV0dXJuIG5mczRfbWFwX2Vycm9ycyhzdGF0dXMpOwogfQogCisvKgorICogR2V0IGxvY2F0aW9ucyBhbmQgKG1heWJlKSBvdGhlciBhdHRyaWJ1dGVzIG9mIGEgcmVmZXJyYWwuCisgKiBOb3RlIHRoYXQgd2UnbGwgYWN0dWFsbHkgZm9sbG93IHRoZSByZWZlcnJhbCBsYXRlciB3aGVuCisgKiB3ZSBkZXRlY3QgZnNpZCBtaXNtYXRjaCBpbiBpbm9kZSByZXZhbGlkYXRpb24KKyAqLworc3RhdGljIGludCBuZnM0X2dldF9yZWZlcnJhbChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IHFzdHIgKm5hbWUsIHN0cnVjdCBuZnNfZmF0dHIgKmZhdHRyLCBzdHJ1Y3QgbmZzX2ZoICpmaGFuZGxlKQoreworCWludCBzdGF0dXMgPSAtRU5PTUVNOworCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDsKKwlzdHJ1Y3QgbmZzNF9mc19sb2NhdGlvbnMgKmxvY2F0aW9ucyA9IE5VTEw7CisJc3RydWN0IGRlbnRyeSBkZW50cnkgPSB7fTsKKworCXBhZ2UgPSBhbGxvY19wYWdlKEdGUF9LRVJORUwpOworCWlmIChwYWdlID09IE5VTEwpCisJCWdvdG8gb3V0OworCWxvY2F0aW9ucyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBuZnM0X2ZzX2xvY2F0aW9ucyksIEdGUF9LRVJORUwpOworCWlmIChsb2NhdGlvbnMgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisKKwlkZW50cnkuZF9uYW1lLm5hbWUgPSBuYW1lLT5uYW1lOworCWRlbnRyeS5kX25hbWUubGVuID0gbmFtZS0+bGVuOworCXN0YXR1cyA9IG5mczRfcHJvY19mc19sb2NhdGlvbnMoZGlyLCAmZGVudHJ5LCBsb2NhdGlvbnMsIHBhZ2UpOworCWlmIChzdGF0dXMgIT0gMCkKKwkJZ290byBvdXQ7CisJLyogTWFrZSBzdXJlIHNlcnZlciByZXR1cm5lZCBhIGRpZmZlcmVudCBmc2lkIGZvciB0aGUgcmVmZXJyYWwgKi8KKwlpZiAobmZzX2ZzaWRfZXF1YWwoJk5GU19TRVJWRVIoZGlyKS0+ZnNpZCwgJmxvY2F0aW9ucy0+ZmF0dHIuZnNpZCkpIHsKKwkJZHByaW50aygiJXM6IHNlcnZlciBkaWQgbm90IHJldHVybiBhIGRpZmZlcmVudCBmc2lkIGZvciBhIHJlZmVycmFsIGF0ICVzXG4iLCBfX0ZVTkNUSU9OX18sIG5hbWUtPm5hbWUpOworCQlzdGF0dXMgPSAtRUlPOworCQlnb3RvIG91dDsKKwl9CisKKwltZW1jcHkoZmF0dHIsICZsb2NhdGlvbnMtPmZhdHRyLCBzaXplb2Yoc3RydWN0IG5mc19mYXR0cikpOworCWZhdHRyLT52YWxpZCB8PSBORlNfQVRUUl9GQVRUUl9WNF9SRUZFUlJBTDsKKwlpZiAoIWZhdHRyLT5tb2RlKQorCQlmYXR0ci0+bW9kZSA9IFNfSUZESVI7CisJbWVtc2V0KGZoYW5kbGUsIDAsIHNpemVvZihzdHJ1Y3QgbmZzX2ZoKSk7CitvdXQ6CisJaWYgKHBhZ2UpCisJCV9fZnJlZV9wYWdlKHBhZ2UpOworCWlmIChsb2NhdGlvbnMpCisJCWtmcmVlKGxvY2F0aW9ucyk7CisJcmV0dXJuIHN0YXR1czsKK30KKwogc3RhdGljIGludCBfbmZzNF9wcm9jX2dldGF0dHIoc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciwgc3RydWN0IG5mc19maCAqZmhhbmRsZSwgc3RydWN0IG5mc19mYXR0ciAqZmF0dHIpCiB7CiAJc3RydWN0IG5mczRfZ2V0YXR0cl9hcmcgYXJncyA9IHsKQEAgLTE1NDcsNiArMTYwOCw4IEBACiAJCiAJZHByaW50aygiTkZTIGNhbGwgIGxvb2t1cCAlc1xuIiwgbmFtZS0+bmFtZSk7CiAJc3RhdHVzID0gcnBjX2NhbGxfc3luYyhORlNfQ0xJRU5UKGRpciksICZtc2csIDApOworCWlmIChzdGF0dXMgPT0gLU5GUzRFUlJfTU9WRUQpCisJCXN0YXR1cyA9IG5mczRfZ2V0X3JlZmVycmFsKGRpciwgbmFtZSwgZmF0dHIsIGZoYW5kbGUpOwogCWRwcmludGsoIk5GUyByZXBseSBsb29rdXA6ICVkXG4iLCBzdGF0dXMpOwogCXJldHVybiBzdGF0dXM7CiB9CkBAIC0yMDA4LDcgKzIwNzEsNyBAQAogCWlmICghc3RhdHVzKSB7CiAJCXVwZGF0ZV9jaGFuZ2VhdHRyKGRpciwgJnJlcy5jaW5mbyk7CiAJCW5mc19wb3N0X29wX3VwZGF0ZV9pbm9kZShkaXIsIHJlcy5kaXJfYXR0cik7Ci0JCW5mc19yZWZyZXNoX2lub2RlKGlub2RlLCByZXMuZmF0dHIpOworCQluZnNfcG9zdF9vcF91cGRhdGVfaW5vZGUoaW5vZGUsIHJlcy5mYXR0cik7CiAJfQogCiAJcmV0dXJuIHN0YXR1czsKQEAgLTM1NzAsNiArMzYzMywzNiBAQAogCXJldHVybiBsZW47CiB9CiAKK2ludCBuZnM0X3Byb2NfZnNfbG9jYXRpb25zKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCXN0cnVjdCBuZnM0X2ZzX2xvY2F0aW9ucyAqZnNfbG9jYXRpb25zLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyID0gTkZTX1NFUlZFUihkaXIpOworCXUzMiBiaXRtYXNrWzJdID0geworCQlbMF0gPSBGQVRUUjRfV09SRDBfRlNJRCB8IEZBVFRSNF9XT1JEMF9GU19MT0NBVElPTlMsCisJCVsxXSA9IEZBVFRSNF9XT1JEMV9NT1VOVEVEX09OX0ZJTEVJRCwKKwl9OworCXN0cnVjdCBuZnM0X2ZzX2xvY2F0aW9uc19hcmcgYXJncyA9IHsKKwkJLmRpcl9maCA9IE5GU19GSChkaXIpLAorCQkubmFtZSA9ICZkZW50cnktPmRfbmFtZSwKKwkJLnBhZ2UgPSBwYWdlLAorCQkuYml0bWFzayA9IGJpdG1hc2ssCisJfTsKKwlzdHJ1Y3QgcnBjX21lc3NhZ2UgbXNnID0geworCQkucnBjX3Byb2MgPSAmbmZzNF9wcm9jZWR1cmVzW05GU1BST0M0X0NMTlRfRlNfTE9DQVRJT05TXSwKKwkJLnJwY19hcmdwID0gJmFyZ3MsCisJCS5ycGNfcmVzcCA9IGZzX2xvY2F0aW9ucywKKwl9OworCWludCBzdGF0dXM7CisKKwlkcHJpbnRrKCIlczogc3RhcnRcbiIsIF9fRlVOQ1RJT05fXyk7CisJZnNfbG9jYXRpb25zLT5mYXR0ci52YWxpZCA9IDA7CisJZnNfbG9jYXRpb25zLT5zZXJ2ZXIgPSBzZXJ2ZXI7CisJZnNfbG9jYXRpb25zLT5ubG9jYXRpb25zID0gMDsKKwlzdGF0dXMgPSBycGNfY2FsbF9zeW5jKHNlcnZlci0+Y2xpZW50LCAmbXNnLCAwKTsKKwlkcHJpbnRrKCIlczogcmV0dXJuZWQgc3RhdHVzID0gJWRcbiIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCiBzdHJ1Y3QgbmZzNF9zdGF0ZV9yZWNvdmVyeV9vcHMgbmZzNF9yZWJvb3RfcmVjb3Zlcnlfb3BzID0gewogCS5yZWNvdmVyX29wZW4JPSBuZnM0X29wZW5fcmVjbGFpbSwKIAkucmVjb3Zlcl9sb2NrCT0gbmZzNF9sb2NrX3JlY2xhaW0sCmRpZmYgLS1naXQgYS9mcy9uZnMvbmZzNHhkci5jIGIvZnMvbmZzL25mczR4ZHIuYwppbmRleCA3YzVkNzBlLi4xNzUwZDk5IDEwMDY0NAotLS0gYS9mcy9uZnMvbmZzNHhkci5jCisrKyBiL2ZzL25mcy9uZnM0eGRyLmMKQEAgLTQxMSw2ICs0MTEsMTUgQEAKICNkZWZpbmUgTkZTNF9kZWNfc2V0YWNsX3N6CShjb21wb3VuZF9kZWNvZGVfaGRyX21heHN6ICsgXAogCQkJCWRlY29kZV9wdXRmaF9tYXhzeiArIFwKIAkJCQlvcF9kZWNvZGVfaGRyX21heHN6ICsgbmZzNF9mYXR0cl9iaXRtYXBfbWF4c3opCisjZGVmaW5lIE5GUzRfZW5jX2ZzX2xvY2F0aW9uc19zeiBcCisJCQkJKGNvbXBvdW5kX2VuY29kZV9oZHJfbWF4c3ogKyBcCisJCQkJIGVuY29kZV9wdXRmaF9tYXhzeiArIFwKKwkJCQkgZW5jb2RlX2dldGF0dHJfbWF4c3opCisjZGVmaW5lIE5GUzRfZGVjX2ZzX2xvY2F0aW9uc19zeiBcCisJCQkJKGNvbXBvdW5kX2RlY29kZV9oZHJfbWF4c3ogKyBcCisJCQkJIGRlY29kZV9wdXRmaF9tYXhzeiArIFwKKwkJCQkgb3BfZGVjb2RlX2hkcl9tYXhzeiArIFwKKwkJCQkgbmZzNF9mYXR0cl9iaXRtYXBfbWF4c3opCiAKIHN0YXRpYyBzdHJ1Y3QgewogCXVuc2lnbmVkIGludAltb2RlOwpAQCAtNzIyLDYgKzczMSwxMyBAQAogCQkJYml0bWFza1sxXSAmIG5mczRfZnNpbmZvX2JpdG1hcFsxXSk7CiB9CiAKK3N0YXRpYyBpbnQgZW5jb2RlX2ZzX2xvY2F0aW9ucyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCB1MzIqIGJpdG1hc2spCit7CisJcmV0dXJuIGVuY29kZV9nZXRhdHRyX3R3byh4ZHIsCisJCQkJICBiaXRtYXNrWzBdICYgbmZzNF9mc19sb2NhdGlvbnNfYml0bWFwWzBdLAorCQkJCSAgYml0bWFza1sxXSAmIG5mczRfZnNfbG9jYXRpb25zX2JpdG1hcFsxXSk7Cit9CisKIHN0YXRpYyBpbnQgZW5jb2RlX2dldGZoKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIpCiB7CiAJdWludDMyX3QgKnA7CkBAIC0yMDAzLDYgKzIwMTksMzggQEAKIH0KIAogLyoKKyAqIEVuY29kZSBGU19MT0NBVElPTlMgcmVxdWVzdAorICovCitzdGF0aWMgaW50IG5mczRfeGRyX2VuY19mc19sb2NhdGlvbnMoc3RydWN0IHJwY19ycXN0ICpyZXEsIHVpbnQzMl90ICpwLCBzdHJ1Y3QgbmZzNF9mc19sb2NhdGlvbnNfYXJnICphcmdzKQoreworCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKKwlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKKwkJLm5vcHMgPSAzLAorCX07CisJc3RydWN0IHJwY19hdXRoICphdXRoID0gcmVxLT5ycV90YXNrLT50a19hdXRoOworCWludCByZXBsZW47CisJaW50IHN0YXR1czsKKworCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKKwllbmNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOworCWlmICgoc3RhdHVzID0gZW5jb2RlX3B1dGZoKCZ4ZHIsIGFyZ3MtPmRpcl9maCkpICE9IDApCisJCWdvdG8gb3V0OworCWlmICgoc3RhdHVzID0gZW5jb2RlX2xvb2t1cCgmeGRyLCBhcmdzLT5uYW1lKSkgIT0gMCkKKwkJZ290byBvdXQ7CisJaWYgKChzdGF0dXMgPSBlbmNvZGVfZnNfbG9jYXRpb25zKCZ4ZHIsIGFyZ3MtPmJpdG1hc2spKSAhPSAwKQorCQlnb3RvIG91dDsKKwkvKiBzZXQgdXAgcmVwbHkKKwkgKiAgIHRvcGxldmVsX3N0YXR1cyArIE9QX1BVVEZIICsgc3RhdHVzCisJICogICArIE9QX0xPT0tVUCArIHN0YXR1cyArIE9QX0dFVEFUVFIgKyBzdGF0dXMgPSA3CisJICovCisJcmVwbGVuID0gKFJQQ19SRVBIRFJTSVpFICsgYXV0aC0+YXVfcnNsYWNrICsgNykgPDwgMjsKKwl4ZHJfaW5saW5lX3BhZ2VzKCZyZXEtPnJxX3Jjdl9idWYsIHJlcGxlbiwgJmFyZ3MtPnBhZ2UsCisJCQkwLCBQQUdFX1NJWkUpOworb3V0OgorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCiAgKiBTVEFSVCBPRiAiR0VORVJJQyIgREVDT0RFIFJPVVRJTkVTLgogICogICBUaGVzZSBtYXkgbG9vayBhIGxpdHRsZSB1Z2x5IHNpbmNlIHRoZXkgYXJlIGltcG9ydGVkIGZyb20gYSAiZ2VuZXJpYyIKICAqIHNldCBvZiBYRFIgZW5jb2RlL2RlY29kZSByb3V0aW5lcyB3aGljaCBhcmUgaW50ZW5kZWQgdG8gYmUgc2hhcmVkIGJ5CkBAIC0yMDM2LDcgKzIwODQsNyBAQAogCX0gXAogfSB3aGlsZSAoMCkKIAotc3RhdGljIGludCBkZWNvZGVfb3BhcXVlX2lubGluZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1aW50MzJfdCAqbGVuLCBjaGFyICoqc3RyaW5nKQorc3RhdGljIGludCBkZWNvZGVfb3BhcXVlX2lubGluZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1bnNpZ25lZCBpbnQgKmxlbiwgY2hhciAqKnN0cmluZykKIHsKIAl1aW50MzJfdCAqcDsKIApAQCAtMjA4Nyw3ICsyMTM1LDcgQEAKIHN0YXRpYyBpbnQgZGVjb2RlX2FjZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB2b2lkICphY2UsIHN0cnVjdCBuZnM0X2NsaWVudCAqY2xwKQogewogCXVpbnQzMl90ICpwOwotCXVpbnQzMl90IHN0cmxlbjsKKwl1bnNpZ25lZCBpbnQgc3RybGVuOwogCWNoYXIgKnN0cjsKIAogCVJFQURfQlVGKDEyKTsKQEAgLTIyMTcsNyArMjI2NSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZGVjb2RlX2F0dHJfZnNpZChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1aW50MzJfdCAqYml0bWFwLCBzdHJ1Y3QgbmZzNF9mc2lkICpmc2lkKQorc3RhdGljIGludCBkZWNvZGVfYXR0cl9mc2lkKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHVpbnQzMl90ICpiaXRtYXAsIHN0cnVjdCBuZnNfZnNpZCAqZnNpZCkKIHsKIAl1aW50MzJfdCAqcDsKIApAQCAtMjI4NSw2ICsyMzMzLDIyIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgZGVjb2RlX2F0dHJfbW91bnRlZF9vbl9maWxlaWQoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdWludDMyX3QgKmJpdG1hcCwgdWludDY0X3QgKmZpbGVpZCkKK3sKKwl1aW50MzJfdCAqcDsKKworCSpmaWxlaWQgPSAwOworCWlmICh1bmxpa2VseShiaXRtYXBbMV0gJiAoRkFUVFI0X1dPUkQxX01PVU5URURfT05fRklMRUlEIC0gMVUpKSkKKwkJcmV0dXJuIC1FSU87CisJaWYgKGxpa2VseShiaXRtYXBbMV0gJiBGQVRUUjRfV09SRDFfTU9VTlRFRF9PTl9GSUxFSUQpKSB7CisJCVJFQURfQlVGKDgpOworCQlSRUFENjQoKmZpbGVpZCk7CisJCWJpdG1hcFsxXSAmPSB+RkFUVFI0X1dPUkQxX01PVU5URURfT05fRklMRUlEOworCX0KKwlkcHJpbnRrKCIlczogZmlsZWlkPSVMdVxuIiwgX19GVU5DVElPTl9fLCAodW5zaWduZWQgbG9uZyBsb25nKSpmaWxlaWQpOworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IGRlY29kZV9hdHRyX2ZpbGVzX2F2YWlsKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHVpbnQzMl90ICpiaXRtYXAsIHVpbnQ2NF90ICpyZXMpCiB7CiAJdWludDMyX3QgKnA7CkBAIC0yMzM2LDYgKzI0MDAsMTE2IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAorc3RhdGljIGludCBkZWNvZGVfcGF0aG5hbWUoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IG5mczRfcGF0aG5hbWUgKnBhdGgpCit7CisJaW50IG47CisJdWludDMyX3QgKnA7CisJaW50IHN0YXR1cyA9IDA7CisKKwlSRUFEX0JVRig0KTsKKwlSRUFEMzIobik7CisJaWYgKG4gPCAwKQorCQlnb3RvIG91dF9laW87CisJaWYgKG4gPT0gMCkKKwkJZ290byByb290X3BhdGg7CisJZHByaW50aygicGF0aCAiKTsKKwlwYXRoLT5uY29tcG9uZW50cyA9IDA7CisJd2hpbGUgKHBhdGgtPm5jb21wb25lbnRzIDwgbikgeworCQlzdHJ1Y3QgbmZzNF9zdHJpbmcgKmNvbXBvbmVudCA9ICZwYXRoLT5jb21wb25lbnRzW3BhdGgtPm5jb21wb25lbnRzXTsKKwkJc3RhdHVzID0gZGVjb2RlX29wYXF1ZV9pbmxpbmUoeGRyLCAmY29tcG9uZW50LT5sZW4sICZjb21wb25lbnQtPmRhdGEpOworCQlpZiAodW5saWtlbHkoc3RhdHVzICE9IDApKQorCQkJZ290byBvdXRfZWlvOworCQlpZiAocGF0aC0+bmNvbXBvbmVudHMgIT0gbikKKwkJCWRwcmludGsoIi8iKTsKKwkJZHByaW50aygiJXMiLCBjb21wb25lbnQtPmRhdGEpOworCQlpZiAocGF0aC0+bmNvbXBvbmVudHMgPCBORlM0X1BBVEhOQU1FX01BWENPTVBPTkVOVFMpCisJCQlwYXRoLT5uY29tcG9uZW50cysrOworCQllbHNlIHsKKwkJCWRwcmludGsoImNhbm5vdCBwYXJzZSAlZCBjb21wb25lbnRzIGluIHBhdGhcbiIsIG4pOworCQkJZ290byBvdXRfZWlvOworCQl9CisJfQorb3V0OgorCWRwcmludGsoIlxuIik7CisJcmV0dXJuIHN0YXR1czsKK3Jvb3RfcGF0aDoKKy8qIGEgcm9vdCBwYXRobmFtZSBpcyBzZW50IGFzIGEgemVybyBjb21wb25lbnQ0ICovCisJcGF0aC0+bmNvbXBvbmVudHMgPSAxOworCXBhdGgtPmNvbXBvbmVudHNbMF0ubGVuPTA7CisJcGF0aC0+Y29tcG9uZW50c1swXS5kYXRhPU5VTEw7CisJZHByaW50aygicGF0aCAvXG4iKTsKKwlnb3RvIG91dDsKK291dF9laW86CisJZHByaW50aygiIHN0YXR1cyAlZCIsIHN0YXR1cyk7CisJc3RhdHVzID0gLUVJTzsKKwlnb3RvIG91dDsKK30KKworc3RhdGljIGludCBkZWNvZGVfYXR0cl9mc19sb2NhdGlvbnMoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdWludDMyX3QgKmJpdG1hcCwgc3RydWN0IG5mczRfZnNfbG9jYXRpb25zICpyZXMpCit7CisJaW50IG47CisJdWludDMyX3QgKnA7CisJaW50IHN0YXR1cyA9IC1FSU87CisKKwlpZiAodW5saWtlbHkoYml0bWFwWzBdICYgKEZBVFRSNF9XT1JEMF9GU19MT0NBVElPTlMgLTFVKSkpCisJCWdvdG8gb3V0OworCXN0YXR1cyA9IDA7CisJaWYgKHVubGlrZWx5KCEoYml0bWFwWzBdICYgRkFUVFI0X1dPUkQwX0ZTX0xPQ0FUSU9OUykpKQorCQlnb3RvIG91dDsKKwlkcHJpbnRrKCIlczogZnNyb290ICIsIF9fRlVOQ1RJT05fXyk7CisJc3RhdHVzID0gZGVjb2RlX3BhdGhuYW1lKHhkciwgJnJlcy0+ZnNfcGF0aCk7CisJaWYgKHVubGlrZWx5KHN0YXR1cyAhPSAwKSkKKwkJZ290byBvdXQ7CisJUkVBRF9CVUYoNCk7CisJUkVBRDMyKG4pOworCWlmIChuIDw9IDApCisJCWdvdG8gb3V0X2VpbzsKKwlyZXMtPm5sb2NhdGlvbnMgPSAwOworCXdoaWxlIChyZXMtPm5sb2NhdGlvbnMgPCBuKSB7CisJCWludCBtOworCQlzdHJ1Y3QgbmZzNF9mc19sb2NhdGlvbiAqbG9jID0gJnJlcy0+bG9jYXRpb25zW3Jlcy0+bmxvY2F0aW9uc107CisKKwkJUkVBRF9CVUYoNCk7CisJCVJFQUQzMihtKTsKKwkJaWYgKG0gPD0gMCkKKwkJCWdvdG8gb3V0X2VpbzsKKworCQlsb2MtPm5zZXJ2ZXJzID0gMDsKKwkJZHByaW50aygiJXM6IHNlcnZlcnMgIiwgX19GVU5DVElPTl9fKTsKKwkJd2hpbGUgKGxvYy0+bnNlcnZlcnMgPCBtKSB7CisJCQlzdHJ1Y3QgbmZzNF9zdHJpbmcgKnNlcnZlciA9ICZsb2MtPnNlcnZlcnNbbG9jLT5uc2VydmVyc107CisJCQlzdGF0dXMgPSBkZWNvZGVfb3BhcXVlX2lubGluZSh4ZHIsICZzZXJ2ZXItPmxlbiwgJnNlcnZlci0+ZGF0YSk7CisJCQlpZiAodW5saWtlbHkoc3RhdHVzICE9IDApKQorCQkJCWdvdG8gb3V0X2VpbzsKKwkJCWRwcmludGsoIiVzICIsIHNlcnZlci0+ZGF0YSk7CisJCQlpZiAobG9jLT5uc2VydmVycyA8IE5GUzRfRlNfTE9DQVRJT05fTUFYU0VSVkVSUykKKwkJCQlsb2MtPm5zZXJ2ZXJzKys7CisJCQllbHNlIHsKKwkJCQlpbnQgaTsKKwkJCQlkcHJpbnRrKCIlczogdXNpbmcgZmlyc3QgJWQgb2YgJWQgc2VydmVycyByZXR1cm5lZCBmb3IgbG9jYXRpb24gJWRcbiIsIF9fRlVOQ1RJT05fXywgTkZTNF9GU19MT0NBVElPTl9NQVhTRVJWRVJTLCBtLCByZXMtPm5sb2NhdGlvbnMpOworCQkJCWZvciAoaSA9IGxvYy0+bnNlcnZlcnM7IGkgPCBtOyBpKyspIHsKKwkJCQkJaW50IGxlbjsKKwkJCQkJY2hhciAqZGF0YTsKKwkJCQkJc3RhdHVzID0gZGVjb2RlX29wYXF1ZV9pbmxpbmUoeGRyLCAmbGVuLCAmZGF0YSk7CisJCQkJCWlmICh1bmxpa2VseShzdGF0dXMgIT0gMCkpCisJCQkJCQlnb3RvIG91dF9laW87CisJCQkJfQorCQkJfQorCQl9CisJCXN0YXR1cyA9IGRlY29kZV9wYXRobmFtZSh4ZHIsICZsb2MtPnJvb3RwYXRoKTsKKwkJaWYgKHVubGlrZWx5KHN0YXR1cyAhPSAwKSkKKwkJCWdvdG8gb3V0X2VpbzsKKwkJaWYgKHJlcy0+bmxvY2F0aW9ucyA8IE5GUzRfRlNfTE9DQVRJT05TX01BWEVOVFJJRVMpCisJCQlyZXMtPm5sb2NhdGlvbnMrKzsKKwl9CitvdXQ6CisJZHByaW50aygiJXM6IGZzX2xvY2F0aW9ucyBkb25lLCBlcnJvciA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJcmV0dXJuIHN0YXR1czsKK291dF9laW86CisJc3RhdHVzID0gLUVJTzsKKwlnb3RvIG91dDsKK30KKwogc3RhdGljIGludCBkZWNvZGVfYXR0cl9tYXhmaWxlc2l6ZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1aW50MzJfdCAqYml0bWFwLCB1aW50NjRfdCAqcmVzKQogewogCXVpbnQzMl90ICpwOwpAQCAtMjg0MSw2ICszMDE1LDcgQEAKIAkJIGJpdG1hcFsyXSA9IHswfSwKIAkJIHR5cGU7CiAJaW50IHN0YXR1cywgZm1vZGUgPSAwOworCXVpbnQ2NF90IGZpbGVpZDsKIAogCWlmICgoc3RhdHVzID0gZGVjb2RlX29wX2hkcih4ZHIsIE9QX0dFVEFUVFIpKSAhPSAwKQogCQlnb3RvIHhkcl9lcnJvcjsKQEAgLTI4NjMsMTAgKzMwMzgsMTQgQEAKIAkJZ290byB4ZHJfZXJyb3I7CiAJaWYgKChzdGF0dXMgPSBkZWNvZGVfYXR0cl9zaXplKHhkciwgYml0bWFwLCAmZmF0dHItPnNpemUpKSAhPSAwKQogCQlnb3RvIHhkcl9lcnJvcjsKLQlpZiAoKHN0YXR1cyA9IGRlY29kZV9hdHRyX2ZzaWQoeGRyLCBiaXRtYXAsICZmYXR0ci0+ZnNpZF91Lm5mczQpKSAhPSAwKQorCWlmICgoc3RhdHVzID0gZGVjb2RlX2F0dHJfZnNpZCh4ZHIsIGJpdG1hcCwgJmZhdHRyLT5mc2lkKSkgIT0gMCkKIAkJZ290byB4ZHJfZXJyb3I7CiAJaWYgKChzdGF0dXMgPSBkZWNvZGVfYXR0cl9maWxlaWQoeGRyLCBiaXRtYXAsICZmYXR0ci0+ZmlsZWlkKSkgIT0gMCkKIAkJZ290byB4ZHJfZXJyb3I7CisJaWYgKChzdGF0dXMgPSBkZWNvZGVfYXR0cl9mc19sb2NhdGlvbnMoeGRyLCBiaXRtYXAsIGNvbnRhaW5lcl9vZihmYXR0ciwKKwkJCQkJCXN0cnVjdCBuZnM0X2ZzX2xvY2F0aW9ucywKKwkJCQkJCWZhdHRyKSkpICE9IDApCisJCWdvdG8geGRyX2Vycm9yOwogCWlmICgoc3RhdHVzID0gZGVjb2RlX2F0dHJfbW9kZSh4ZHIsIGJpdG1hcCwgJmZhdHRyLT5tb2RlKSkgIT0gMCkKIAkJZ290byB4ZHJfZXJyb3I7CiAJZmF0dHItPm1vZGUgfD0gZm1vZGU7CkBAIC0yODg2LDYgKzMwNjUsMTAgQEAKIAkJZ290byB4ZHJfZXJyb3I7CiAJaWYgKChzdGF0dXMgPSBkZWNvZGVfYXR0cl90aW1lX21vZGlmeSh4ZHIsIGJpdG1hcCwgJmZhdHRyLT5tdGltZSkpICE9IDApCiAJCWdvdG8geGRyX2Vycm9yOworCWlmICgoc3RhdHVzID0gZGVjb2RlX2F0dHJfbW91bnRlZF9vbl9maWxlaWQoeGRyLCBiaXRtYXAsICZmaWxlaWQpKSAhPSAwKQorCQlnb3RvIHhkcl9lcnJvcjsKKwlpZiAoZmF0dHItPmZpbGVpZCA9PSAwICYmIGZpbGVpZCAhPSAwKQorCQlmYXR0ci0+ZmlsZWlkID0gZmlsZWlkOwogCWlmICgoc3RhdHVzID0gdmVyaWZ5X2F0dHJfbGVuKHhkciwgc2F2ZXAsIGF0dHJsZW4pKSA9PSAwKQogCQlmYXR0ci0+dmFsaWQgPSBORlNfQVRUUl9GQVRUUiB8IE5GU19BVFRSX0ZBVFRSX1YzIHwgTkZTX0FUVFJfRkFUVFJfVjQ7CiB4ZHJfZXJyb3I6CkBAIC0zMzUwLDggKzM1MzMsNyBAQAogCQkJCQlhdHRybGVuLCByZWN2ZCk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQotCQlpZiAoYXR0cmxlbiA8PSAqYWNsX2xlbikKLQkJCXhkcl9yZWFkX3BhZ2VzKHhkciwgYXR0cmxlbik7CisJCXhkcl9yZWFkX3BhZ2VzKHhkciwgYXR0cmxlbik7CiAJCSphY2xfbGVuID0gYXR0cmxlbjsKIAl9IGVsc2UKIAkJc3RhdHVzID0gLUVPUE5PVFNVUFA7CkBAIC00MjExLDYgKzQzOTMsMjkgQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCisvKgorICogRlNfTE9DQVRJT05TIHJlcXVlc3QKKyAqLworc3RhdGljIGludCBuZnM0X3hkcl9kZWNfZnNfbG9jYXRpb25zKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1aW50MzJfdCAqcCwgc3RydWN0IG5mczRfZnNfbG9jYXRpb25zICpyZXMpCit7CisJc3RydWN0IHhkcl9zdHJlYW0geGRyOworCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyOworCWludCBzdGF0dXM7CisKKwl4ZHJfaW5pdF9kZWNvZGUoJnhkciwgJnJlcS0+cnFfcmN2X2J1ZiwgcCk7CisJc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKKwlpZiAoc3RhdHVzICE9IDApCisJCWdvdG8gb3V0OworCWlmICgoc3RhdHVzID0gZGVjb2RlX3B1dGZoKCZ4ZHIpKSAhPSAwKQorCQlnb3RvIG91dDsKKwlpZiAoKHN0YXR1cyA9IGRlY29kZV9sb29rdXAoJnhkcikpICE9IDApCisJCWdvdG8gb3V0OworCXhkcl9lbnRlcl9wYWdlKCZ4ZHIsIFBBR0VfU0laRSk7CisJc3RhdHVzID0gZGVjb2RlX2dldGZhdHRyKCZ4ZHIsICZyZXMtPmZhdHRyLCByZXMtPnNlcnZlcik7CitvdXQ6CisJcmV0dXJuIHN0YXR1czsKK30KKwogdWludDMyX3QgKm5mczRfZGVjb2RlX2RpcmVudCh1aW50MzJfdCAqcCwgc3RydWN0IG5mc19lbnRyeSAqZW50cnksIGludCBwbHVzKQogewogCXVpbnQzMl90IGJpdG1hcFsyXSA9IHswfTsKQEAgLTQzODIsNiArNDU4Nyw3IEBACiAgIFBST0MoREVMRUdSRVRVUk4sCWVuY19kZWxlZ3JldHVybiwgZGVjX2RlbGVncmV0dXJuKSwKICAgUFJPQyhHRVRBQ0wsCQllbmNfZ2V0YWNsLAlkZWNfZ2V0YWNsKSwKICAgUFJPQyhTRVRBQ0wsCQllbmNfc2V0YWNsLAlkZWNfc2V0YWNsKSwKKyAgUFJPQyhGU19MT0NBVElPTlMsCWVuY19mc19sb2NhdGlvbnMsIGRlY19mc19sb2NhdGlvbnMpLAogfTsKIAogc3RydWN0IHJwY192ZXJzaW9uCQluZnNfdmVyc2lvbjQgPSB7CmRpZmYgLS1naXQgYS9mcy9uZnMvcGFnZWxpc3QuYyBiL2ZzL25mcy9wYWdlbGlzdC5jCmluZGV4IDEwNmFjYTMuLmVmOTQyOTYgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9wYWdlbGlzdC5jCisrKyBiL2ZzL25mcy9wYWdlbGlzdC5jCkBAIC0zMjUsNiArMzI1LDcgQEAKIAogLyoqCiAgKiBuZnNfc2Nhbl9saXN0IC0gU2NhbiBhIGxpc3QgZm9yIG1hdGNoaW5nIHJlcXVlc3RzCisgKiBAbmZzaTogTkZTIGlub2RlCiAgKiBAaGVhZDogT25lIG9mIHRoZSBORlMgaW5vZGUgcmVxdWVzdCBsaXN0cwogICogQGRzdDogRGVzdGluYXRpb24gbGlzdAogICogQGlkeF9zdGFydDogbG93ZXIgYm91bmQgb2YgcGFnZS0+aW5kZXggdG8gc2NhbgpAQCAtMzM2LDE0ICszMzcsMTUgQEAKICAqIFRoZSByZXF1ZXN0cyBhcmUgKm5vdCogY2hlY2tlZCB0byBlbnN1cmUgdGhhdCB0aGV5IGZvcm0gYSBjb250aWd1b3VzIHNldC4KICAqIFlvdSBtdXN0IGJlIGhvbGRpbmcgdGhlIGlub2RlJ3MgcmVxX2xvY2sgd2hlbiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24KICAqLwotaW50Ci1uZnNfc2Nhbl9saXN0KHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsIHN0cnVjdCBsaXN0X2hlYWQgKmRzdCwKLQkgICAgICB1bnNpZ25lZCBsb25nIGlkeF9zdGFydCwgdW5zaWduZWQgaW50IG5wYWdlcykKK2ludCBuZnNfc2Nhbl9saXN0KHN0cnVjdCBuZnNfaW5vZGUgKm5mc2ksIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsCisJCXN0cnVjdCBsaXN0X2hlYWQgKmRzdCwgdW5zaWduZWQgbG9uZyBpZHhfc3RhcnQsCisJCXVuc2lnbmVkIGludCBucGFnZXMpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZAkqcG9zLCAqdG1wOwotCXN0cnVjdCBuZnNfcGFnZQkJKnJlcTsKLQl1bnNpZ25lZCBsb25nCQlpZHhfZW5kOwotCWludAkJCXJlczsKKwlzdHJ1Y3QgbmZzX3BhZ2UgKnBndmVjW05GU19TQ0FOX01BWEVOVFJJRVNdOworCXN0cnVjdCBuZnNfcGFnZSAqcmVxOworCXVuc2lnbmVkIGxvbmcgaWR4X2VuZDsKKwlpbnQgZm91bmQsIGk7CisJaW50IHJlczsKIAogCXJlcyA9IDA7CiAJaWYgKG5wYWdlcyA9PSAwKQpAQCAtMzUxLDI1ICszNTMsMzIgQEAKIAllbHNlCiAJCWlkeF9lbmQgPSBpZHhfc3RhcnQgKyBucGFnZXMgLSAxOwogCi0JbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgdG1wLCBoZWFkKSB7Ci0KLQkJcmVxID0gbmZzX2xpc3RfZW50cnkocG9zKTsKLQotCQlpZiAocmVxLT53Yl9pbmRleCA8IGlkeF9zdGFydCkKLQkJCWNvbnRpbnVlOwotCQlpZiAocmVxLT53Yl9pbmRleCA+IGlkeF9lbmQpCisJZm9yICg7OykgeworCQlmb3VuZCA9IHJhZGl4X3RyZWVfZ2FuZ19sb29rdXAoJm5mc2ktPm5mc19wYWdlX3RyZWUsCisJCQkJKHZvaWQgKiopJnBndmVjWzBdLCBpZHhfc3RhcnQsCisJCQkJTkZTX1NDQU5fTUFYRU5UUklFUyk7CisJCWlmIChmb3VuZCA8PSAwKQogCQkJYnJlYWs7CisJCWZvciAoaSA9IDA7IGkgPCBmb3VuZDsgaSsrKSB7CisJCQlyZXEgPSBwZ3ZlY1tpXTsKKwkJCWlmIChyZXEtPndiX2luZGV4ID4gaWR4X2VuZCkKKwkJCQlnb3RvIG91dDsKKwkJCWlkeF9zdGFydCA9IHJlcS0+d2JfaW5kZXggKyAxOworCQkJaWYgKHJlcS0+d2JfbGlzdF9oZWFkICE9IGhlYWQpCisJCQkJY29udGludWU7CisJCQlpZiAobmZzX3NldF9wYWdlX3dyaXRlYmFja19sb2NrZWQocmVxKSkgeworCQkJCW5mc19saXN0X3JlbW92ZV9yZXF1ZXN0KHJlcSk7CisJCQkJbmZzX2xpc3RfYWRkX3JlcXVlc3QocmVxLCBkc3QpOworCQkJCXJlcysrOworCQkJfQorCQl9CiAKLQkJaWYgKCFuZnNfc2V0X3BhZ2Vfd3JpdGViYWNrX2xvY2tlZChyZXEpKQotCQkJY29udGludWU7Ci0JCW5mc19saXN0X3JlbW92ZV9yZXF1ZXN0KHJlcSk7Ci0JCW5mc19saXN0X2FkZF9yZXF1ZXN0KHJlcSwgZHN0KTsKLQkJcmVzKys7CiAJfQorb3V0OgogCXJldHVybiByZXM7CiB9CiAKLWludCBuZnNfaW5pdF9uZnNwYWdlY2FjaGUodm9pZCkKK2ludCBfX2luaXQgbmZzX2luaXRfbmZzcGFnZWNhY2hlKHZvaWQpCiB7CiAJbmZzX3BhZ2VfY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGUoIm5mc19wYWdlIiwKIAkJCQkJICAgIHNpemVvZihzdHJ1Y3QgbmZzX3BhZ2UpLApAQCAtMzgxLDcgKzM5MCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgbmZzX2Rlc3Ryb3lfbmZzcGFnZWNhY2hlKHZvaWQpCit2b2lkIF9fZXhpdCBuZnNfZGVzdHJveV9uZnNwYWdlY2FjaGUodm9pZCkKIHsKIAlpZiAoa21lbV9jYWNoZV9kZXN0cm95KG5mc19wYWdlX2NhY2hlcCkpCiAJCXByaW50ayhLRVJOX0lORk8gIm5mc19wYWdlOiBub3QgYWxsIHN0cnVjdHVyZXMgd2VyZSBmcmVlZFxuIik7CmRpZmYgLS1naXQgYS9mcy9uZnMvcHJvYy5jIGIvZnMvbmZzL3Byb2MuYwppbmRleCA5ZGQ4NWNhLi5iMzg5OWVhIDEwMDY0NAotLS0gYS9mcy9uZnMvcHJvYy5jCisrKyBiL2ZzL25mcy9wcm9jLmMKQEAgLTQ0LDExICs0NCwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L25mc19wYWdlLmg+CiAjaW5jbHVkZSA8bGludXgvbG9ja2QvYmluZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAogI2RlZmluZSBORlNEQkdfRkFDSUxJVFkJCU5GU0RCR19QUk9DCiAKLWV4dGVybiBzdHJ1Y3QgcnBjX3Byb2NpbmZvIG5mc19wcm9jZWR1cmVzW107Ci0KIC8qCiAgKiBCYXJlLWJvbmVzIGFjY2VzcyB0byBnZXRhdHRyOiB0aGlzIGlzIGZvciBuZnNfcmVhZF9zdXBlci4KICAqLwpAQCAtNjExLDggKzYxMCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLWV4dGVybiB1MzIgKiBuZnNfZGVjb2RlX2RpcmVudCh1MzIgKiwgc3RydWN0IG5mc19lbnRyeSAqLCBpbnQpOwotCiBzdGF0aWMgaW50IG5mc19yZWFkX2RvbmUoc3RydWN0IHJwY190YXNrICp0YXNrLCBzdHJ1Y3QgbmZzX3JlYWRfZGF0YSAqZGF0YSkKIHsKIAlpZiAodGFzay0+dGtfc3RhdHVzID49IDApIHsKZGlmZiAtLWdpdCBhL2ZzL25mcy9yZWFkLmMgYi9mcy9uZnMvcmVhZC5jCmluZGV4IDYyNGNhNzEuLjQxYzJmZmUgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9yZWFkLmMKKysrIGIvZnMvbmZzL3JlYWQuYwpAQCAtNTEsMTQgKzUxLDExIEBACiAJaWYgKHApIHsKIAkJbWVtc2V0KHAsIDAsIHNpemVvZigqcCkpOwogCQlJTklUX0xJU1RfSEVBRCgmcC0+cGFnZXMpOwotCQlpZiAocGFnZWNvdW50IDwgTkZTX1BBR0VWRUNfU0laRSkKLQkJCXAtPnBhZ2V2ZWMgPSAmcC0+cGFnZV9hcnJheVswXTsKKwkJaWYgKHBhZ2Vjb3VudCA8PSBBUlJBWV9TSVpFKHAtPnBhZ2VfYXJyYXkpKQorCQkJcC0+cGFnZXZlYyA9IHAtPnBhZ2VfYXJyYXk7CiAJCWVsc2UgewotCQkJc2l6ZV90IHNpemUgPSArK3BhZ2Vjb3VudCAqIHNpemVvZihzdHJ1Y3QgcGFnZSAqKTsKLQkJCXAtPnBhZ2V2ZWMgPSBrbWFsbG9jKHNpemUsIEdGUF9OT0ZTKTsKLQkJCWlmIChwLT5wYWdldmVjKSB7Ci0JCQkJbWVtc2V0KHAtPnBhZ2V2ZWMsIDAsIHNpemUpOwotCQkJfSBlbHNlIHsKKwkJCXAtPnBhZ2V2ZWMgPSBrY2FsbG9jKHBhZ2Vjb3VudCwgc2l6ZW9mKHN0cnVjdCBwYWdlICopLCBHRlBfTk9GUyk7CisJCQlpZiAoIXAtPnBhZ2V2ZWMpIHsKIAkJCQltZW1wb29sX2ZyZWUocCwgbmZzX3JkYXRhX21lbXBvb2wpOwogCQkJCXAgPSBOVUxMOwogCQkJfQpAQCAtMTA0LDYgKzEwMSwyOCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBuZnNfcmVhZHBhZ2VfdHJ1bmNhdGVfdW5pbml0aWFsaXNlZF9wYWdlKHN0cnVjdCBuZnNfcmVhZF9kYXRhICpkYXRhKQoreworCXVuc2lnbmVkIGludCByZW1haW5kZXIgPSBkYXRhLT5hcmdzLmNvdW50IC0gZGF0YS0+cmVzLmNvdW50OworCXVuc2lnbmVkIGludCBiYXNlID0gZGF0YS0+YXJncy5wZ2Jhc2UgKyBkYXRhLT5yZXMuY291bnQ7CisJdW5zaWduZWQgaW50IHBnbGVuOworCXN0cnVjdCBwYWdlICoqcGFnZXM7CisKKwlpZiAoZGF0YS0+cmVzLmVvZiA9PSAwIHx8IHJlbWFpbmRlciA9PSAwKQorCQlyZXR1cm47CisJLyoKKwkgKiBOb3RlOiAicmVtYWluZGVyIiBjYW4gbmV2ZXIgYmUgbmVnYXRpdmUsIHNpbmNlIHdlIGNoZWNrIGZvcgorCSAqIAl0aGlzIGluIHRoZSBYRFIgY29kZS4KKwkgKi8KKwlwYWdlcyA9ICZkYXRhLT5hcmdzLnBhZ2VzW2Jhc2UgPj4gUEFHRV9DQUNIRV9TSElGVF07CisJYmFzZSAmPSB+UEFHRV9DQUNIRV9NQVNLOworCXBnbGVuID0gUEFHRV9DQUNIRV9TSVpFIC0gYmFzZTsKKwlpZiAocGdsZW4gPCByZW1haW5kZXIpCisJCW1lbWNsZWFyX2hpZ2hwYWdlX2ZsdXNoKCpwYWdlcywgYmFzZSwgcGdsZW4pOworCWVsc2UKKwkJbWVtY2xlYXJfaGlnaHBhZ2VfZmx1c2goKnBhZ2VzLCBiYXNlLCByZW1haW5kZXIpOworfQorCiAvKgogICogUmVhZCBhIHBhZ2Ugc3luY2hyb25vdXNseS4KICAqLwpAQCAtMTc3LDExICsxOTYsOSBAQAogCU5GU19JKGlub2RlKS0+Y2FjaGVfdmFsaWRpdHkgfD0gTkZTX0lOT19JTlZBTElEX0FUSU1FOwogCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKIAotCWlmIChjb3VudCkKLQkJbWVtY2xlYXJfaGlnaHBhZ2VfZmx1c2gocGFnZSwgcmRhdGEtPmFyZ3MucGdiYXNlLCBjb3VudCk7Ci0JU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOwotCWlmIChQYWdlRXJyb3IocGFnZSkpCi0JCUNsZWFyUGFnZUVycm9yKHBhZ2UpOworCW5mc19yZWFkcGFnZV90cnVuY2F0ZV91bmluaXRpYWxpc2VkX3BhZ2UocmRhdGEpOworCWlmIChyZGF0YS0+cmVzLmVvZiB8fCByZGF0YS0+cmVzLmNvdW50ID09IHJkYXRhLT5hcmdzLmNvdW50KQorCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CiAJcmVzdWx0ID0gMDsKIAogaW9fZXJyb3I6CkBAIC00MzYsMjAgKzQ1MywxMiBAQAogCXN0cnVjdCBuZnNfcGFnZSAqcmVxID0gZGF0YS0+cmVxOwogCXN0cnVjdCBwYWdlICpwYWdlID0gcmVxLT53Yl9wYWdlOwogIAorCWlmIChsaWtlbHkodGFzay0+dGtfc3RhdHVzID49IDApKQorCQluZnNfcmVhZHBhZ2VfdHJ1bmNhdGVfdW5pbml0aWFsaXNlZF9wYWdlKGRhdGEpOworCWVsc2UKKwkJU2V0UGFnZUVycm9yKHBhZ2UpOwogCWlmIChuZnNfcmVhZHBhZ2VfcmVzdWx0KHRhc2ssIGRhdGEpICE9IDApCiAJCXJldHVybjsKLQlpZiAodGFzay0+dGtfc3RhdHVzID49IDApIHsKLQkJdW5zaWduZWQgaW50IHJlcXVlc3QgPSBkYXRhLT5hcmdzLmNvdW50OwotCQl1bnNpZ25lZCBpbnQgcmVzdWx0ID0gZGF0YS0+cmVzLmNvdW50OwotCi0JCWlmIChyZXN1bHQgPCByZXF1ZXN0KSB7Ci0JCQltZW1jbGVhcl9oaWdocGFnZV9mbHVzaChwYWdlLAotCQkJCQkJZGF0YS0+YXJncy5wZ2Jhc2UgKyByZXN1bHQsCi0JCQkJCQlyZXF1ZXN0IC0gcmVzdWx0KTsKLQkJfQotCX0gZWxzZQotCQlTZXRQYWdlRXJyb3IocGFnZSk7Ci0KIAlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmcmVxLT53Yl9jb21wbGV0ZSkpIHsKIAkJaWYgKCFQYWdlRXJyb3IocGFnZSkpCiAJCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CkBAIC00NjIsNiArNDcxLDQwIEBACiAJLnJwY19yZWxlYXNlID0gbmZzX3JlYWRkYXRhX3JlbGVhc2UsCiB9OwogCitzdGF0aWMgdm9pZCBuZnNfcmVhZHBhZ2Vfc2V0X3BhZ2VzX3VwdG9kYXRlKHN0cnVjdCBuZnNfcmVhZF9kYXRhICpkYXRhKQoreworCXVuc2lnbmVkIGludCBjb3VudCA9IGRhdGEtPnJlcy5jb3VudDsKKwl1bnNpZ25lZCBpbnQgYmFzZSA9IGRhdGEtPmFyZ3MucGdiYXNlOworCXN0cnVjdCBwYWdlICoqcGFnZXM7CisKKwlpZiAodW5saWtlbHkoY291bnQgPT0gMCkpCisJCXJldHVybjsKKwlwYWdlcyA9ICZkYXRhLT5hcmdzLnBhZ2VzW2Jhc2UgPj4gUEFHRV9DQUNIRV9TSElGVF07CisJYmFzZSAmPSB+UEFHRV9DQUNIRV9NQVNLOworCWNvdW50ICs9IGJhc2U7CisJZm9yICg7Y291bnQgPj0gUEFHRV9DQUNIRV9TSVpFOyBjb3VudCAtPSBQQUdFX0NBQ0hFX1NJWkUsIHBhZ2VzKyspCisJCVNldFBhZ2VVcHRvZGF0ZSgqcGFnZXMpOworCS8qCisJICogV2FzIHRoaXMgYW4gZW9mIG9yIGEgc2hvcnQgcmVhZD8gSWYgdGhlIGxhdHRlciwgZG9uJ3QgbWFyayB0aGUgcGFnZQorCSAqIGFzIHVwdG9kYXRlIHlldC4KKwkgKi8KKwlpZiAoY291bnQgPiAwICYmIChkYXRhLT5yZXMuZW9mIHx8IGRhdGEtPmFyZ3MuY291bnQgPT0gZGF0YS0+cmVzLmNvdW50KSkKKwkJU2V0UGFnZVVwdG9kYXRlKCpwYWdlcyk7Cit9CisKK3N0YXRpYyB2b2lkIG5mc19yZWFkcGFnZV9zZXRfcGFnZXNfZXJyb3Ioc3RydWN0IG5mc19yZWFkX2RhdGEgKmRhdGEpCit7CisJdW5zaWduZWQgaW50IGNvdW50ID0gZGF0YS0+YXJncy5jb3VudDsKKwl1bnNpZ25lZCBpbnQgYmFzZSA9IGRhdGEtPmFyZ3MucGdiYXNlOworCXN0cnVjdCBwYWdlICoqcGFnZXM7CisKKwlwYWdlcyA9ICZkYXRhLT5hcmdzLnBhZ2VzW2Jhc2UgPj4gUEFHRV9DQUNIRV9TSElGVF07CisJYmFzZSAmPSB+UEFHRV9DQUNIRV9NQVNLOworCWNvdW50ICs9IGJhc2U7CisJZm9yICg7Y291bnQgPj0gUEFHRV9DQUNIRV9TSVpFOyBjb3VudCAtPSBQQUdFX0NBQ0hFX1NJWkUsIHBhZ2VzKyspCisJCVNldFBhZ2VFcnJvcigqcGFnZXMpOworfQorCiAvKgogICogVGhpcyBpcyB0aGUgY2FsbGJhY2sgZnJvbSBSUEMgdGVsbGluZyB1cyB3aGV0aGVyIGEgcmVwbHkgd2FzCiAgKiByZWNlaXZlZCBvciBzb21lIGVycm9yIG9jY3VycmVkICh0aW1lb3V0IG9yIHNvY2tldCBzaHV0ZG93bikuCkBAIC00NjksMjcgKzUxMiwyNCBAQAogc3RhdGljIHZvaWQgbmZzX3JlYWRwYWdlX3Jlc3VsdF9mdWxsKHN0cnVjdCBycGNfdGFzayAqdGFzaywgdm9pZCAqY2FsbGRhdGEpCiB7CiAJc3RydWN0IG5mc19yZWFkX2RhdGEgKmRhdGEgPSBjYWxsZGF0YTsKLQl1bnNpZ25lZCBpbnQgY291bnQgPSBkYXRhLT5yZXMuY291bnQ7CiAKKwkvKgorCSAqIE5vdGU6IG5mc19yZWFkcGFnZV9yZXN1bHQgbWF5IGNoYW5nZSB0aGUgdmFsdWVzIG9mCisJICogZGF0YS0+YXJncy4gSW4gdGhlIG11bHRpLXBhZ2UgY2FzZSwgd2UgdGhlcmVmb3JlIG5lZWQKKwkgKiB0byBlbnN1cmUgdGhhdCB3ZSBjYWxsIHRoZSBuZXh0IG5mc19yZWFkcGFnZV9zZXRfcGFnZV91cHRvZGF0ZSgpCisJICogZmlyc3QgaW4gdGhlIG11bHRpLXBhZ2UgY2FzZS4KKwkgKi8KKwlpZiAobGlrZWx5KHRhc2stPnRrX3N0YXR1cyA+PSAwKSkgeworCQluZnNfcmVhZHBhZ2VfdHJ1bmNhdGVfdW5pbml0aWFsaXNlZF9wYWdlKGRhdGEpOworCQluZnNfcmVhZHBhZ2Vfc2V0X3BhZ2VzX3VwdG9kYXRlKGRhdGEpOworCX0gZWxzZQorCQluZnNfcmVhZHBhZ2Vfc2V0X3BhZ2VzX2Vycm9yKGRhdGEpOwogCWlmIChuZnNfcmVhZHBhZ2VfcmVzdWx0KHRhc2ssIGRhdGEpICE9IDApCiAJCXJldHVybjsKIAl3aGlsZSAoIWxpc3RfZW1wdHkoJmRhdGEtPnBhZ2VzKSkgewogCQlzdHJ1Y3QgbmZzX3BhZ2UgKnJlcSA9IG5mc19saXN0X2VudHJ5KGRhdGEtPnBhZ2VzLm5leHQpOwotCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHJlcS0+d2JfcGFnZTsKLQkJbmZzX2xpc3RfcmVtb3ZlX3JlcXVlc3QocmVxKTsKIAotCQlpZiAodGFzay0+dGtfc3RhdHVzID49IDApIHsKLQkJCWlmIChjb3VudCA8IFBBR0VfQ0FDSEVfU0laRSkgewotCQkJCWlmIChjb3VudCA8IHJlcS0+d2JfYnl0ZXMpCi0JCQkJCW1lbWNsZWFyX2hpZ2hwYWdlX2ZsdXNoKHBhZ2UsCi0JCQkJCQkJcmVxLT53Yl9wZ2Jhc2UgKyBjb3VudCwKLQkJCQkJCQlyZXEtPndiX2J5dGVzIC0gY291bnQpOwotCQkJCWNvdW50ID0gMDsKLQkJCX0gZWxzZQotCQkJCWNvdW50IC09IFBBR0VfQ0FDSEVfU0laRTsKLQkJCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKLQkJfSBlbHNlCi0JCQlTZXRQYWdlRXJyb3IocGFnZSk7CisJCW5mc19saXN0X3JlbW92ZV9yZXF1ZXN0KHJlcSk7CiAJCW5mc19yZWFkcGFnZV9yZWxlYXNlKHJlcSk7CiAJfQogfQpAQCAtNjU0LDcgKzY5NCw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IG5mc19pbml0X3JlYWRwYWdlY2FjaGUodm9pZCkKK2ludCBfX2luaXQgbmZzX2luaXRfcmVhZHBhZ2VjYWNoZSh2b2lkKQogewogCW5mc19yZGF0YV9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgibmZzX3JlYWRfZGF0YSIsCiAJCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBuZnNfcmVhZF9kYXRhKSwKQEAgLTY3MSw3ICs3MTEsNyBAQAogCXJldHVybiAwOwogfQogCi12b2lkIG5mc19kZXN0cm95X3JlYWRwYWdlY2FjaGUodm9pZCkKK3ZvaWQgX19leGl0IG5mc19kZXN0cm95X3JlYWRwYWdlY2FjaGUodm9pZCkKIHsKIAltZW1wb29sX2Rlc3Ryb3kobmZzX3JkYXRhX21lbXBvb2wpOwogCWlmIChrbWVtX2NhY2hlX2Rlc3Ryb3kobmZzX3JkYXRhX2NhY2hlcCkpCmRpZmYgLS1naXQgYS9mcy9uZnMvc3VwZXIuYyBiL2ZzL25mcy9zdXBlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4YTliZWUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9uZnMvc3VwZXIuYwpAQCAtMCwwICsxLDE1MzcgQEAKKy8qCisgKiAgbGludXgvZnMvbmZzL3N1cGVyLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkyICBSaWNrIFNsYWRrZXkKKyAqCisgKiAgbmZzIHN1cGVyYmxvY2sgaGFuZGxpbmcgZnVuY3Rpb25zCisgKgorICogIE1vZHVsYXJpc2VkIGJ5IEFsYW4gQ294IDxBbGFuLkNveEBsaW51eC5vcmc+LCB3aGlsZSBoYWNraW5nIHNvbWUKKyAqICBleHBlcmltZW50YWwgTkZTIGNoYW5nZXMuIE1vZHVsYXJpc2F0aW9uIHRha2VuIHN0cmFpZ2h0IGZyb20gU1lTNSBmcy4KKyAqCisgKiAgQ2hhbmdlIHRvIG5mc19yZWFkX3N1cGVyKCkgdG8gcGVybWl0IE5GUyBtb3VudHMgdG8gbXVsdGktaG9tZWQgaG9zdHMuCisgKiAgSi5TLlBlYXRmaWVsZEBkYW10cC5jYW0uYWMudWsKKyAqCisgKiAgU3BsaXQgZnJvbSBpbm9kZS5jIGJ5IERhdmlkIEhvd2VsbHMgPGRob3dlbGxzQHJlZGhhdC5jb20+CisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvY2xudC5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdGF0cy5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9tZXRyaWNzLmg+CisjaW5jbHVkZSA8bGludXgvbmZzX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbmZzX21vdW50Lmg+CisjaW5jbHVkZSA8bGludXgvbmZzNF9tb3VudC5oPgorI2luY2x1ZGUgPGxpbnV4L2xvY2tkL2JpbmQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNfaWRtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC92ZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvbmZzX3hkci5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlICJuZnM0X2ZzLmgiCisjaW5jbHVkZSAiY2FsbGJhY2suaCIKKyNpbmNsdWRlICJkZWxlZ2F0aW9uLmgiCisjaW5jbHVkZSAiaW9zdGF0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworI2RlZmluZSBORlNEQkdfRkFDSUxJVFkJCU5GU0RCR19WRlMKKworLyogTWF4aW11bSBudW1iZXIgb2YgcmVhZGFoZWFkIHJlcXVlc3RzCisgKiBGSVhNRTogdGhpcyBzaG91bGQgcmVhbGx5IGJlIGEgc3lzY3RsIHNvIHRoYXQgdXNlcnMgbWF5IHR1bmUgaXQgdG8gc3VpdAorICogICAgICAgIHRoZWlyIG5lZWRzLiBQZW9wbGUgdGhhdCBkbyBORlMgb3ZlciBhIHNsb3cgbmV0d29yaywgbWlnaHQgZm9yCisgKiAgICAgICAgaW5zdGFuY2Ugd2FudCB0byByZWR1Y2UgaXQgdG8gc29tZXRoaW5nIGNsb3NlciB0byAxIGZvciBpbXByb3ZlZAorICogICAgICAgIGludGVyYWN0aXZlIHJlc3BvbnNlLgorICovCisjZGVmaW5lIE5GU19NQVhfUkVBREFIRUFECShSUENfREVGX1NMT1RfVEFCTEUgLSAxKQorCisvKgorICogUlBDIGNydWZ0IGZvciBORlMKKyAqLworc3RhdGljIHN0cnVjdCBycGNfdmVyc2lvbiAqIG5mc192ZXJzaW9uW10gPSB7CisJTlVMTCwKKwlOVUxMLAorCSZuZnNfdmVyc2lvbjIsCisjaWYgZGVmaW5lZChDT05GSUdfTkZTX1YzKQorCSZuZnNfdmVyc2lvbjMsCisjZWxpZiBkZWZpbmVkKENPTkZJR19ORlNfVjQpCisJTlVMTCwKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX05GU19WNCkKKwkmbmZzX3ZlcnNpb240LAorI2VuZGlmCit9OworCitzdGF0aWMgc3RydWN0IHJwY19wcm9ncmFtIG5mc19wcm9ncmFtID0geworCS5uYW1lCQkJPSAibmZzIiwKKwkubnVtYmVyCQkJPSBORlNfUFJPR1JBTSwKKwkubnJ2ZXJzCQkJPSBBUlJBWV9TSVpFKG5mc192ZXJzaW9uKSwKKwkudmVyc2lvbgkJPSBuZnNfdmVyc2lvbiwKKwkuc3RhdHMJCQk9ICZuZnNfcnBjc3RhdCwKKwkucGlwZV9kaXJfbmFtZQkJPSAiL25mcyIsCit9OworCitzdHJ1Y3QgcnBjX3N0YXQgbmZzX3JwY3N0YXQgPSB7CisJLnByb2dyYW0JCT0gJm5mc19wcm9ncmFtCit9OworCisKKyNpZmRlZiBDT05GSUdfTkZTX1YzX0FDTAorc3RhdGljIHN0cnVjdCBycGNfc3RhdAkJbmZzYWNsX3JwY3N0YXQgPSB7ICZuZnNhY2xfcHJvZ3JhbSB9Oworc3RhdGljIHN0cnVjdCBycGNfdmVyc2lvbiAqCW5mc2FjbF92ZXJzaW9uW10gPSB7CisJWzNdCQkJPSAmbmZzYWNsX3ZlcnNpb24zLAorfTsKKworc3RydWN0IHJwY19wcm9ncmFtCQluZnNhY2xfcHJvZ3JhbSA9IHsKKwkubmFtZSA9CQkJIm5mc2FjbCIsCisJLm51bWJlciA9CQlORlNfQUNMX1BST0dSQU0sCisJLm5ydmVycyA9CQlBUlJBWV9TSVpFKG5mc2FjbF92ZXJzaW9uKSwKKwkudmVyc2lvbiA9CQluZnNhY2xfdmVyc2lvbiwKKwkuc3RhdHMgPQkJJm5mc2FjbF9ycGNzdGF0LAorfTsKKyNlbmRpZiAgLyogQ09ORklHX05GU19WM19BQ0wgKi8KKworc3RhdGljIHZvaWQgbmZzX3Vtb3VudF9iZWdpbihzdHJ1Y3QgdmZzbW91bnQgKiwgaW50KTsKK3N0YXRpYyBpbnQgIG5mc19zdGF0ZnMoc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3Qga3N0YXRmcyAqKTsKK3N0YXRpYyBpbnQgIG5mc19zaG93X29wdGlvbnMoc3RydWN0IHNlcV9maWxlICosIHN0cnVjdCB2ZnNtb3VudCAqKTsKK3N0YXRpYyBpbnQgIG5mc19zaG93X3N0YXRzKHN0cnVjdCBzZXFfZmlsZSAqLCBzdHJ1Y3QgdmZzbW91bnQgKik7CitzdGF0aWMgaW50IG5mc19nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKiwgaW50LCBjb25zdCBjaGFyICosIHZvaWQgKiwgc3RydWN0IHZmc21vdW50ICopOworc3RhdGljIGludCBuZnNfY2xvbmVfbmZzX3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAorCQlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpyYXdfZGF0YSwgc3RydWN0IHZmc21vdW50ICptbnQpOworc3RhdGljIHZvaWQgbmZzX2tpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICopOworCitzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgbmZzX2ZzX3R5cGUgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJuZnMiLAorCS5nZXRfc2IJCT0gbmZzX2dldF9zYiwKKwkua2lsbF9zYgk9IG5mc19raWxsX3N1cGVyLAorCS5mc19mbGFncwk9IEZTX09ERF9SRU5BTUV8RlNfUkVWQUxfRE9UfEZTX0JJTkFSWV9NT1VOVERBVEEsCit9OworCitzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBjbG9uZV9uZnNfZnNfdHlwZSA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gIm5mcyIsCisJLmdldF9zYgkJPSBuZnNfY2xvbmVfbmZzX3NiLAorCS5raWxsX3NiCT0gbmZzX2tpbGxfc3VwZXIsCisJLmZzX2ZsYWdzCT0gRlNfT0REX1JFTkFNRXxGU19SRVZBTF9ET1R8RlNfQklOQVJZX01PVU5UREFUQSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBuZnNfc29wcyA9IHsKKwkuYWxsb2NfaW5vZGUJPSBuZnNfYWxsb2NfaW5vZGUsCisJLmRlc3Ryb3lfaW5vZGUJPSBuZnNfZGVzdHJveV9pbm9kZSwKKwkud3JpdGVfaW5vZGUJPSBuZnNfd3JpdGVfaW5vZGUsCisJLnN0YXRmcwkJPSBuZnNfc3RhdGZzLAorCS5jbGVhcl9pbm9kZQk9IG5mc19jbGVhcl9pbm9kZSwKKwkudW1vdW50X2JlZ2luCT0gbmZzX3Vtb3VudF9iZWdpbiwKKwkuc2hvd19vcHRpb25zCT0gbmZzX3Nob3dfb3B0aW9ucywKKwkuc2hvd19zdGF0cwk9IG5mc19zaG93X3N0YXRzLAorfTsKKworI2lmZGVmIENPTkZJR19ORlNfVjQKK3N0YXRpYyBpbnQgbmZzNF9nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqcmF3X2RhdGEsIHN0cnVjdCB2ZnNtb3VudCAqbW50KTsKK3N0YXRpYyBpbnQgbmZzX2Nsb25lX25mczRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKnJhd19kYXRhLCBzdHJ1Y3QgdmZzbW91bnQgKm1udCk7CitzdGF0aWMgaW50IG5mc19yZWZlcnJhbF9uZnM0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAorCQlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpyYXdfZGF0YSwgc3RydWN0IHZmc21vdW50ICptbnQpOworc3RhdGljIHZvaWQgbmZzNF9raWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOworCitzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgbmZzNF9mc190eXBlID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAibmZzNCIsCisJLmdldF9zYgkJPSBuZnM0X2dldF9zYiwKKwkua2lsbF9zYgk9IG5mczRfa2lsbF9zdXBlciwKKwkuZnNfZmxhZ3MJPSBGU19PRERfUkVOQU1FfEZTX1JFVkFMX0RPVHxGU19CSU5BUllfTU9VTlREQVRBLAorfTsKKworc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgY2xvbmVfbmZzNF9mc190eXBlID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAibmZzNCIsCisJLmdldF9zYgkJPSBuZnNfY2xvbmVfbmZzNF9zYiwKKwkua2lsbF9zYgk9IG5mczRfa2lsbF9zdXBlciwKKwkuZnNfZmxhZ3MJPSBGU19PRERfUkVOQU1FfEZTX1JFVkFMX0RPVHxGU19CSU5BUllfTU9VTlREQVRBLAorfTsKKworc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgbmZzX3JlZmVycmFsX25mczRfZnNfdHlwZSA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gIm5mczQiLAorCS5nZXRfc2IJCT0gbmZzX3JlZmVycmFsX25mczRfc2IsCisJLmtpbGxfc2IJPSBuZnM0X2tpbGxfc3VwZXIsCisJLmZzX2ZsYWdzCT0gRlNfT0REX1JFTkFNRXxGU19SRVZBTF9ET1R8RlNfQklOQVJZX01PVU5UREFUQSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBuZnM0X3NvcHMgPSB7CisJLmFsbG9jX2lub2RlCT0gbmZzX2FsbG9jX2lub2RlLAorCS5kZXN0cm95X2lub2RlCT0gbmZzX2Rlc3Ryb3lfaW5vZGUsCisJLndyaXRlX2lub2RlCT0gbmZzX3dyaXRlX2lub2RlLAorCS5zdGF0ZnMJCT0gbmZzX3N0YXRmcywKKwkuY2xlYXJfaW5vZGUJPSBuZnM0X2NsZWFyX2lub2RlLAorCS51bW91bnRfYmVnaW4JPSBuZnNfdW1vdW50X2JlZ2luLAorCS5zaG93X29wdGlvbnMJPSBuZnNfc2hvd19vcHRpb25zLAorCS5zaG93X3N0YXRzCT0gbmZzX3Nob3dfc3RhdHMsCit9OworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTkZTX1Y0CitzdGF0aWMgY29uc3QgaW50IG5mc19zZXRfcG9ydF9taW4gPSAwOworc3RhdGljIGNvbnN0IGludCBuZnNfc2V0X3BvcnRfbWF4ID0gNjU1MzU7CisKK3N0YXRpYyBpbnQgcGFyYW1fc2V0X3BvcnQoY29uc3QgY2hhciAqdmFsLCBzdHJ1Y3Qga2VybmVsX3BhcmFtICprcCkKK3sKKwljaGFyICplbmRwOworCWludCBudW0gPSBzaW1wbGVfc3RydG9sKHZhbCwgJmVuZHAsIDApOworCWlmIChlbmRwID09IHZhbCB8fCAqZW5kcCB8fCBudW0gPCBuZnNfc2V0X3BvcnRfbWluIHx8IG51bSA+IG5mc19zZXRfcG9ydF9tYXgpCisJCXJldHVybiAtRUlOVkFMOworCSooKGludCAqKWtwLT5hcmcpID0gbnVtOworCXJldHVybiAwOworfQorCittb2R1bGVfcGFyYW1fY2FsbChjYWxsYmFja190Y3Bwb3J0LCBwYXJhbV9zZXRfcG9ydCwgcGFyYW1fZ2V0X2ludCwKKwkJICZuZnNfY2FsbGJhY2tfc2V0X3RjcHBvcnQsIDA2NDQpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTkZTX1Y0CitzdGF0aWMgaW50IHBhcmFtX3NldF9pZG1hcF90aW1lb3V0KGNvbnN0IGNoYXIgKnZhbCwgc3RydWN0IGtlcm5lbF9wYXJhbSAqa3ApCit7CisJY2hhciAqZW5kcDsKKwlpbnQgbnVtID0gc2ltcGxlX3N0cnRvbCh2YWwsICZlbmRwLCAwKTsKKwlpbnQgamlmID0gbnVtICogSFo7CisJaWYgKGVuZHAgPT0gdmFsIHx8ICplbmRwIHx8IG51bSA8IDAgfHwgamlmIDwgbnVtKQorCQlyZXR1cm4gLUVJTlZBTDsKKwkqKChpbnQgKilrcC0+YXJnKSA9IGppZjsKKwlyZXR1cm4gMDsKK30KKworbW9kdWxlX3BhcmFtX2NhbGwoaWRtYXBfY2FjaGVfdGltZW91dCwgcGFyYW1fc2V0X2lkbWFwX3RpbWVvdXQsIHBhcmFtX2dldF9pbnQsCisJCSAmbmZzX2lkbWFwX2NhY2hlX3RpbWVvdXQsIDA2NDQpOworI2VuZGlmCisKKy8qCisgKiBSZWdpc3RlciB0aGUgTkZTIGZpbGVzeXN0ZW1zCisgKi8KK2ludCBfX2luaXQgcmVnaXN0ZXJfbmZzX2ZzKHZvaWQpCit7CisJaW50IHJldDsKKworICAgICAgICByZXQgPSByZWdpc3Rlcl9maWxlc3lzdGVtKCZuZnNfZnNfdHlwZSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyb3JfMDsKKworI2lmZGVmIENPTkZJR19ORlNfVjQKKwlyZXQgPSBuZnNfcmVnaXN0ZXJfc3lzY3RsKCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyb3JfMTsKKwlyZXQgPSByZWdpc3Rlcl9maWxlc3lzdGVtKCZuZnM0X2ZzX3R5cGUpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yXzI7CisjZW5kaWYKKwlyZXR1cm4gMDsKKworI2lmZGVmIENPTkZJR19ORlNfVjQKK2Vycm9yXzI6CisJbmZzX3VucmVnaXN0ZXJfc3lzY3RsKCk7CitlcnJvcl8xOgorCXVucmVnaXN0ZXJfZmlsZXN5c3RlbSgmbmZzX2ZzX3R5cGUpOworI2VuZGlmCitlcnJvcl8wOgorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBVbnJlZ2lzdGVyIHRoZSBORlMgZmlsZXN5c3RlbXMKKyAqLwordm9pZCBfX2V4aXQgdW5yZWdpc3Rlcl9uZnNfZnModm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfTkZTX1Y0CisJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZuZnM0X2ZzX3R5cGUpOworCW5mc191bnJlZ2lzdGVyX3N5c2N0bCgpOworI2VuZGlmCisJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZuZnNfZnNfdHlwZSk7Cit9CisKKy8qCisgKiBEZWxpdmVyIGZpbGUgc3lzdGVtIHN0YXRpc3RpY3MgdG8gdXNlcnNwYWNlCisgKi8KK3N0YXRpYyBpbnQgbmZzX3N0YXRmcyhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBrc3RhdGZzICpidWYpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGRlbnRyeS0+ZF9zYjsKKwlzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyID0gTkZTX1NCKHNiKTsKKwl1bnNpZ25lZCBjaGFyIGJsb2NrYml0czsKKwl1bnNpZ25lZCBsb25nIGJsb2NrcmVzOworCXN0cnVjdCBuZnNfZmggKnJvb3RmaCA9IE5GU19GSChzYi0+c19yb290LT5kX2lub2RlKTsKKwlzdHJ1Y3QgbmZzX2ZhdHRyIGZhdHRyOworCXN0cnVjdCBuZnNfZnNzdGF0IHJlcyA9IHsKKwkJCS5mYXR0ciA9ICZmYXR0ciwKKwl9OworCWludCBlcnJvcjsKKworCWxvY2tfa2VybmVsKCk7CisKKwllcnJvciA9IHNlcnZlci0+cnBjX29wcy0+c3RhdGZzKHNlcnZlciwgcm9vdGZoLCAmcmVzKTsKKwlidWYtPmZfdHlwZSA9IE5GU19TVVBFUl9NQUdJQzsKKwlpZiAoZXJyb3IgPCAwKQorCQlnb3RvIG91dF9lcnI7CisKKwkvKgorCSAqIEN1cnJlbnQgdmVyc2lvbnMgb2YgZ2xpYmMgZG8gbm90IGNvcnJlY3RseSBoYW5kbGUgdGhlCisJICogY2FzZSB3aGVyZSBmX2Zyc2l6ZSAhPSBmX2JzaXplLiAgRXZlbnR1YWxseSB3ZSB3YW50IHRvCisJICogcmVwb3J0IHRoZSB2YWx1ZSBvZiB3dG11bHQgaW4gdGhpcyBmaWVsZC4KKwkgKi8KKwlidWYtPmZfZnJzaXplID0gc2ItPnNfYmxvY2tzaXplOworCisJLyoKKwkgKiBPbiBtb3N0ICpuaXggc3lzdGVtcywgZl9ibG9ja3MsIGZfYmZyZWUsIGFuZCBmX2JhdmFpbAorCSAqIGFyZSByZXBvcnRlZCBpbiB1bml0cyBvZiBmX2Zyc2l6ZS4gIExpbnV4IGhhc24ndCBoYWQKKwkgKiBhbiBmX2Zyc2l6ZSBmaWVsZCBpbiBpdHMgc3RhdGZzIHN0cnVjdCB1bnRpbCByZWNlbnRseSwKKwkgKiB0aHVzIGhpc3RvcmljYWxseSBMaW51eCdzIHN5c19zdGF0ZnMgcmVwb3J0cyB0aGVzZQorCSAqIGZpZWxkcyBpbiB1bml0cyBvZiBmX2JzaXplLgorCSAqLworCWJ1Zi0+Zl9ic2l6ZSA9IHNiLT5zX2Jsb2Nrc2l6ZTsKKwlibG9ja2JpdHMgPSBzYi0+c19ibG9ja3NpemVfYml0czsKKwlibG9ja3JlcyA9ICgxIDw8IGJsb2NrYml0cykgLSAxOworCWJ1Zi0+Zl9ibG9ja3MgPSAocmVzLnRieXRlcyArIGJsb2NrcmVzKSA+PiBibG9ja2JpdHM7CisJYnVmLT5mX2JmcmVlID0gKHJlcy5mYnl0ZXMgKyBibG9ja3JlcykgPj4gYmxvY2tiaXRzOworCWJ1Zi0+Zl9iYXZhaWwgPSAocmVzLmFieXRlcyArIGJsb2NrcmVzKSA+PiBibG9ja2JpdHM7CisKKwlidWYtPmZfZmlsZXMgPSByZXMudGZpbGVzOworCWJ1Zi0+Zl9mZnJlZSA9IHJlcy5hZmlsZXM7CisKKwlidWYtPmZfbmFtZWxlbiA9IHNlcnZlci0+bmFtZWxlbjsKKyBvdXQ6CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiAwOworCisgb3V0X2VycjoKKwlkcHJpbnRrKCIlczogc3RhdGZzIGVycm9yID0gJWRcbiIsIF9fRlVOQ1RJT05fXywgLWVycm9yKTsKKwlidWYtPmZfYnNpemUgPSBidWYtPmZfYmxvY2tzID0gYnVmLT5mX2JmcmVlID0gYnVmLT5mX2JhdmFpbCA9IC0xOworCWdvdG8gb3V0OworCit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpuZnNfcHNldWRvZmxhdm91cl90b19uYW1lKHJwY19hdXRoZmxhdm9yX3QgZmxhdm91cikKK3sKKwlzdGF0aWMgc3RydWN0IHsKKwkJcnBjX2F1dGhmbGF2b3JfdCBmbGF2b3VyOworCQljb25zdCBjaGFyICpzdHI7CisJfSBzZWNfZmxhdm91cnNbXSA9IHsKKwkJeyBSUENfQVVUSF9OVUxMLCAibnVsbCIgfSwKKwkJeyBSUENfQVVUSF9VTklYLCAic3lzIiB9LAorCQl7IFJQQ19BVVRIX0dTU19LUkI1LCAia3JiNSIgfSwKKwkJeyBSUENfQVVUSF9HU1NfS1JCNUksICJrcmI1aSIgfSwKKwkJeyBSUENfQVVUSF9HU1NfS1JCNVAsICJrcmI1cCIgfSwKKwkJeyBSUENfQVVUSF9HU1NfTEtFWSwgImxrZXkiIH0sCisJCXsgUlBDX0FVVEhfR1NTX0xLRVlJLCAibGtleWkiIH0sCisJCXsgUlBDX0FVVEhfR1NTX0xLRVlQLCAibGtleXAiIH0sCisJCXsgUlBDX0FVVEhfR1NTX1NQS00sICJzcGttIiB9LAorCQl7IFJQQ19BVVRIX0dTU19TUEtNSSwgInNwa21pIiB9LAorCQl7IFJQQ19BVVRIX0dTU19TUEtNUCwgInNwa21wIiB9LAorCQl7IC0xLCAidW5rbm93biIgfQorCX07CisJaW50IGk7CisKKwlmb3IgKGk9MDsgc2VjX2ZsYXZvdXJzW2ldLmZsYXZvdXIgIT0gLTE7IGkrKykgeworCQlpZiAoc2VjX2ZsYXZvdXJzW2ldLmZsYXZvdXIgPT0gZmxhdm91cikKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gc2VjX2ZsYXZvdXJzW2ldLnN0cjsKK30KKworLyoKKyAqIERlc2NyaWJlIHRoZSBtb3VudCBvcHRpb25zIGluIGZvcmNlIG9uIHRoaXMgc2VydmVyIHJlcHJlc2VudGF0aW9uCisgKi8KK3N0YXRpYyB2b2lkIG5mc19zaG93X21vdW50X29wdGlvbnMoc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3QgbmZzX3NlcnZlciAqbmZzcywgaW50IHNob3dkZWZhdWx0cykKK3sKKwlzdGF0aWMgc3RydWN0IHByb2NfbmZzX2luZm8geworCQlpbnQgZmxhZzsKKwkJY2hhciAqc3RyOworCQljaGFyICpub3N0cjsKKwl9IG5mc19pbmZvW10gPSB7CisJCXsgTkZTX01PVU5UX1NPRlQsICIsc29mdCIsICIsaGFyZCIgfSwKKwkJeyBORlNfTU9VTlRfSU5UUiwgIixpbnRyIiwgIiIgfSwKKwkJeyBORlNfTU9VTlRfTk9DVE8sICIsbm9jdG8iLCAiIiB9LAorCQl7IE5GU19NT1VOVF9OT0FDLCAiLG5vYWMiLCAiIiB9LAorCQl7IE5GU19NT1VOVF9OT05MTSwgIixub2xvY2siLCAiIiB9LAorCQl7IE5GU19NT1VOVF9OT0FDTCwgIixub2FjbCIsICIiIH0sCisJCXsgMCwgTlVMTCwgTlVMTCB9CisJfTsKKwlzdHJ1Y3QgcHJvY19uZnNfaW5mbyAqbmZzX2luZm9wOworCWNoYXIgYnVmWzEyXTsKKwljaGFyICpwcm90bzsKKworCXNlcV9wcmludGYobSwgIix2ZXJzPSVkIiwgbmZzcy0+cnBjX29wcy0+dmVyc2lvbik7CisJc2VxX3ByaW50ZihtLCAiLHJzaXplPSVkIiwgbmZzcy0+cnNpemUpOworCXNlcV9wcmludGYobSwgIix3c2l6ZT0lZCIsIG5mc3MtPndzaXplKTsKKwlpZiAobmZzcy0+YWNyZWdtaW4gIT0gMypIWiB8fCBzaG93ZGVmYXVsdHMpCisJCXNlcV9wcmludGYobSwgIixhY3JlZ21pbj0lZCIsIG5mc3MtPmFjcmVnbWluL0haKTsKKwlpZiAobmZzcy0+YWNyZWdtYXggIT0gNjAqSFogfHwgc2hvd2RlZmF1bHRzKQorCQlzZXFfcHJpbnRmKG0sICIsYWNyZWdtYXg9JWQiLCBuZnNzLT5hY3JlZ21heC9IWik7CisJaWYgKG5mc3MtPmFjZGlybWluICE9IDMwKkhaIHx8IHNob3dkZWZhdWx0cykKKwkJc2VxX3ByaW50ZihtLCAiLGFjZGlybWluPSVkIiwgbmZzcy0+YWNkaXJtaW4vSFopOworCWlmIChuZnNzLT5hY2Rpcm1heCAhPSA2MCpIWiB8fCBzaG93ZGVmYXVsdHMpCisJCXNlcV9wcmludGYobSwgIixhY2Rpcm1heD0lZCIsIG5mc3MtPmFjZGlybWF4L0haKTsKKwlmb3IgKG5mc19pbmZvcCA9IG5mc19pbmZvOyBuZnNfaW5mb3AtPmZsYWc7IG5mc19pbmZvcCsrKSB7CisJCWlmIChuZnNzLT5mbGFncyAmIG5mc19pbmZvcC0+ZmxhZykKKwkJCXNlcV9wdXRzKG0sIG5mc19pbmZvcC0+c3RyKTsKKwkJZWxzZQorCQkJc2VxX3B1dHMobSwgbmZzX2luZm9wLT5ub3N0cik7CisJfQorCXN3aXRjaCAobmZzcy0+Y2xpZW50LT5jbF94cHJ0LT5wcm90KSB7CisJCWNhc2UgSVBQUk9UT19UQ1A6CisJCQlwcm90byA9ICJ0Y3AiOworCQkJYnJlYWs7CisJCWNhc2UgSVBQUk9UT19VRFA6CisJCQlwcm90byA9ICJ1ZHAiOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJXUiLCBuZnNzLT5jbGllbnQtPmNsX3hwcnQtPnByb3QpOworCQkJcHJvdG8gPSBidWY7CisJfQorCXNlcV9wcmludGYobSwgIixwcm90bz0lcyIsIHByb3RvKTsKKwlzZXFfcHJpbnRmKG0sICIsdGltZW89JWx1IiwgMTBVICogbmZzcy0+cmV0cmFuc190aW1lbyAvIEhaKTsKKwlzZXFfcHJpbnRmKG0sICIscmV0cmFucz0ldSIsIG5mc3MtPnJldHJhbnNfY291bnQpOworCXNlcV9wcmludGYobSwgIixzZWM9JXMiLCBuZnNfcHNldWRvZmxhdm91cl90b19uYW1lKG5mc3MtPmNsaWVudC0+Y2xfYXV0aC0+YXVfZmxhdm9yKSk7Cit9CisKKy8qCisgKiBEZXNjcmliZSB0aGUgbW91bnQgb3B0aW9ucyBvbiB0aGlzIFZGUyBtb3VudHBvaW50CisgKi8KK3N0YXRpYyBpbnQgbmZzX3Nob3dfb3B0aW9ucyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCB2ZnNtb3VudCAqbW50KQoreworCXN0cnVjdCBuZnNfc2VydmVyICpuZnNzID0gTkZTX1NCKG1udC0+bW50X3NiKTsKKworCW5mc19zaG93X21vdW50X29wdGlvbnMobSwgbmZzcywgMCk7CisKKwlzZXFfcHV0cyhtLCAiLGFkZHI9Iik7CisJc2VxX2VzY2FwZShtLCBuZnNzLT5ob3N0bmFtZSwgIiBcdFxuXFwiKTsKKworCXJldHVybiAwOworfQorCisvKgorICogUHJlc2VudCBzdGF0aXN0aWNhbCBpbmZvcm1hdGlvbiBmb3IgdGhpcyBWRlMgbW91bnRwb2ludAorICovCitzdGF0aWMgaW50IG5mc19zaG93X3N0YXRzKHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IHZmc21vdW50ICptbnQpCit7CisJaW50IGksIGNwdTsKKwlzdHJ1Y3QgbmZzX3NlcnZlciAqbmZzcyA9IE5GU19TQihtbnQtPm1udF9zYik7CisJc3RydWN0IHJwY19hdXRoICphdXRoID0gbmZzcy0+Y2xpZW50LT5jbF9hdXRoOworCXN0cnVjdCBuZnNfaW9zdGF0cyB0b3RhbHMgPSB7IH07CisKKwlzZXFfcHJpbnRmKG0sICJzdGF0dmVycz0lcyIsIE5GU19JT1NUQVRfVkVSUyk7CisKKwkvKgorCSAqIERpc3BsYXkgYWxsIG1vdW50IG9wdGlvbiBzZXR0aW5ncworCSAqLworCXNlcV9wcmludGYobSwgIlxuXHRvcHRzOlx0Iik7CisJc2VxX3B1dHMobSwgbW50LT5tbnRfc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkgPyAicm8iIDogInJ3Iik7CisJc2VxX3B1dHMobSwgbW50LT5tbnRfc2ItPnNfZmxhZ3MgJiBNU19TWU5DSFJPTk9VUyA/ICIsc3luYyIgOiAiIik7CisJc2VxX3B1dHMobSwgbW50LT5tbnRfc2ItPnNfZmxhZ3MgJiBNU19OT0FUSU1FID8gIixub2F0aW1lIiA6ICIiKTsKKwlzZXFfcHV0cyhtLCBtbnQtPm1udF9zYi0+c19mbGFncyAmIE1TX05PRElSQVRJTUUgPyAiLG5vZGlyYXRpbWUiIDogIiIpOworCW5mc19zaG93X21vdW50X29wdGlvbnMobSwgbmZzcywgMSk7CisKKwlzZXFfcHJpbnRmKG0sICJcblx0YWdlOlx0JWx1IiwgKGppZmZpZXMgLSBuZnNzLT5tb3VudF90aW1lKSAvIEhaKTsKKworCXNlcV9wcmludGYobSwgIlxuXHRjYXBzOlx0Iik7CisJc2VxX3ByaW50ZihtLCAiY2Fwcz0weCV4IiwgbmZzcy0+Y2Fwcyk7CisJc2VxX3ByaW50ZihtLCAiLHd0bXVsdD0lZCIsIG5mc3MtPnd0bXVsdCk7CisJc2VxX3ByaW50ZihtLCAiLGR0c2l6ZT0lZCIsIG5mc3MtPmR0c2l6ZSk7CisJc2VxX3ByaW50ZihtLCAiLGJzaXplPSVkIiwgbmZzcy0+YnNpemUpOworCXNlcV9wcmludGYobSwgIixuYW1lbGVuPSVkIiwgbmZzcy0+bmFtZWxlbik7CisKKyNpZmRlZiBDT05GSUdfTkZTX1Y0CisJaWYgKG5mc3MtPnJwY19vcHMtPnZlcnNpb24gPT0gNCkgeworCQlzZXFfcHJpbnRmKG0sICJcblx0bmZzdjQ6XHQiKTsKKwkJc2VxX3ByaW50ZihtLCAiYm0wPTB4JXgiLCBuZnNzLT5hdHRyX2JpdG1hc2tbMF0pOworCQlzZXFfcHJpbnRmKG0sICIsYm0xPTB4JXgiLCBuZnNzLT5hdHRyX2JpdG1hc2tbMV0pOworCQlzZXFfcHJpbnRmKG0sICIsYWNsPTB4JXgiLCBuZnNzLT5hY2xfYml0bWFzayk7CisJfQorI2VuZGlmCisKKwkvKgorCSAqIERpc3BsYXkgc2VjdXJpdHkgZmxhdm9yIGluIGVmZmVjdCBmb3IgdGhpcyBtb3VudAorCSAqLworCXNlcV9wcmludGYobSwgIlxuXHRzZWM6XHRmbGF2b3I9JWQiLCBhdXRoLT5hdV9vcHMtPmF1X2ZsYXZvcik7CisJaWYgKGF1dGgtPmF1X2ZsYXZvcikKKwkJc2VxX3ByaW50ZihtLCAiLHBzZXVkb2ZsYXZvcj0lZCIsIGF1dGgtPmF1X2ZsYXZvcik7CisKKwkvKgorCSAqIERpc3BsYXkgc3VwZXJibG9jayBJL08gY291bnRlcnMKKwkgKi8KKwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7CisJCXN0cnVjdCBuZnNfaW9zdGF0cyAqc3RhdHM7CisKKwkJcHJlZW1wdF9kaXNhYmxlKCk7CisJCXN0YXRzID0gcGVyX2NwdV9wdHIobmZzcy0+aW9fc3RhdHMsIGNwdSk7CisKKwkJZm9yIChpID0gMDsgaSA8IF9fTkZTSU9TX0NPVU5UU01BWDsgaSsrKQorCQkJdG90YWxzLmV2ZW50c1tpXSArPSBzdGF0cy0+ZXZlbnRzW2ldOworCQlmb3IgKGkgPSAwOyBpIDwgX19ORlNJT1NfQllURVNNQVg7IGkrKykKKwkJCXRvdGFscy5ieXRlc1tpXSArPSBzdGF0cy0+Ynl0ZXNbaV07CisKKwkJcHJlZW1wdF9lbmFibGUoKTsKKwl9CisKKwlzZXFfcHJpbnRmKG0sICJcblx0ZXZlbnRzOlx0Iik7CisJZm9yIChpID0gMDsgaSA8IF9fTkZTSU9TX0NPVU5UU01BWDsgaSsrKQorCQlzZXFfcHJpbnRmKG0sICIlbHUgIiwgdG90YWxzLmV2ZW50c1tpXSk7CisJc2VxX3ByaW50ZihtLCAiXG5cdGJ5dGVzOlx0Iik7CisJZm9yIChpID0gMDsgaSA8IF9fTkZTSU9TX0JZVEVTTUFYOyBpKyspCisJCXNlcV9wcmludGYobSwgIiVMdSAiLCB0b3RhbHMuYnl0ZXNbaV0pOworCXNlcV9wcmludGYobSwgIlxuIik7CisKKwlycGNfcHJpbnRfaW9zdGF0cyhtLCBuZnNzLT5jbGllbnQpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBCZWdpbiB1bm1vdW50IGJ5IGF0dGVtcHRpbmcgdG8gcmVtb3ZlIGFsbCBhdXRvbW91bnRlZCBtb3VudHBvaW50cyB3ZSBhZGRlZAorICogaW4gcmVzcG9uc2UgdG8gdHJhdmVyc2FscworICovCitzdGF0aWMgdm9pZCBuZnNfdW1vdW50X2JlZ2luKHN0cnVjdCB2ZnNtb3VudCAqdmZzbW50LCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlcjsKKwlzdHJ1Y3QgcnBjX2NsbnQJKnJwYzsKKworCXNocmlua19zdWJtb3VudHModmZzbW50LCAmbmZzX2F1dG9tb3VudF9saXN0KTsKKwlpZiAoIShmbGFncyAmIE1OVF9GT1JDRSkpCisJCXJldHVybjsKKwkvKiAtRUlPIGFsbCBwZW5kaW5nIEkvTyAqLworCXNlcnZlciA9IE5GU19TQih2ZnNtbnQtPm1udF9zYik7CisJcnBjID0gc2VydmVyLT5jbGllbnQ7CisJaWYgKCFJU19FUlIocnBjKSkKKwkJcnBjX2tpbGxhbGxfdGFza3MocnBjKTsKKwlycGMgPSBzZXJ2ZXItPmNsaWVudF9hY2w7CisJaWYgKCFJU19FUlIocnBjKSkKKwkJcnBjX2tpbGxhbGxfdGFza3MocnBjKTsKK30KKworLyoKKyAqIE9idGFpbiB0aGUgcm9vdCBpbm9kZSBvZiB0aGUgZmlsZSBzeXN0ZW0uCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaW5vZGUgKgorbmZzX2dldF9yb290KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBuZnNfZmggKnJvb3RmaCwgc3RydWN0IG5mc19mc2luZm8gKmZzaW5mbykKK3sKKwlzdHJ1Y3QgbmZzX3NlcnZlcgkqc2VydmVyID0gTkZTX1NCKHNiKTsKKwlpbnQJCQllcnJvcjsKKworCWVycm9yID0gc2VydmVyLT5ycGNfb3BzLT5nZXRyb290KHNlcnZlciwgcm9vdGZoLCBmc2luZm8pOworCWlmIChlcnJvciA8IDApIHsKKwkJZHByaW50aygibmZzX2dldF9yb290OiBnZXRhdHRyIGVycm9yID0gJWRcbiIsIC1lcnJvcik7CisJCXJldHVybiBFUlJfUFRSKGVycm9yKTsKKwl9CisKKwlzZXJ2ZXItPmZzaWQgPSBmc2luZm8tPmZhdHRyLT5mc2lkOworCXJldHVybiBuZnNfZmhnZXQoc2IsIHJvb3RmaCwgZnNpbmZvLT5mYXR0cik7Cit9CisKKy8qCisgKiBEbyBORlMgdmVyc2lvbi1pbmRlcGVuZGVudCBtb3VudCBwcm9jZXNzaW5nLCBhbmQgc2FuaXR5IGNoZWNraW5nCisgKi8KK3N0YXRpYyBpbnQKK25mc19zYl9pbml0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHJwY19hdXRoZmxhdm9yX3QgYXV0aGZsYXZvcikKK3sKKwlzdHJ1Y3QgbmZzX3NlcnZlcgkqc2VydmVyOworCXN0cnVjdCBpbm9kZQkJKnJvb3RfaW5vZGU7CisJc3RydWN0IG5mc19mYXR0cglmYXR0cjsKKwlzdHJ1Y3QgbmZzX2ZzaW5mbwlmc2luZm8gPSB7CisJCQkJCS5mYXR0ciA9ICZmYXR0ciwKKwkJCQl9OworCXN0cnVjdCBuZnNfcGF0aGNvbmYgcGF0aGluZm8gPSB7CisJCQkuZmF0dHIgPSAmZmF0dHIsCisJfTsKKwlpbnQgbm9fcm9vdF9lcnJvciA9IDA7CisJdW5zaWduZWQgbG9uZyBtYXhfcnBjX3BheWxvYWQ7CisKKwkvKiBXZSBwcm9iYWJseSB3YW50IHNvbWV0aGluZyBtb3JlIGluZm9ybWF0aXZlIGhlcmUgKi8KKwlzbnByaW50ZihzYi0+c19pZCwgc2l6ZW9mKHNiLT5zX2lkKSwgIiV4OiV4IiwgTUFKT1Ioc2ItPnNfZGV2KSwgTUlOT1Ioc2ItPnNfZGV2KSk7CisKKwlzZXJ2ZXIgPSBORlNfU0Ioc2IpOworCisJc2ItPnNfbWFnaWMgICAgICA9IE5GU19TVVBFUl9NQUdJQzsKKworCXNlcnZlci0+aW9fc3RhdHMgPSBuZnNfYWxsb2NfaW9zdGF0cygpOworCWlmIChzZXJ2ZXItPmlvX3N0YXRzID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJcm9vdF9pbm9kZSA9IG5mc19nZXRfcm9vdChzYiwgJnNlcnZlci0+ZmgsICZmc2luZm8pOworCS8qIERpZCBnZXR0aW5nIHRoZSByb290IGlub2RlIGZhaWw/ICovCisJaWYgKElTX0VSUihyb290X2lub2RlKSkgeworCQlub19yb290X2Vycm9yID0gUFRSX0VSUihyb290X2lub2RlKTsKKwkJZ290byBvdXRfbm9fcm9vdDsKKwl9CisJc2ItPnNfcm9vdCA9IGRfYWxsb2Nfcm9vdChyb290X2lub2RlKTsKKwlpZiAoIXNiLT5zX3Jvb3QpIHsKKwkJbm9fcm9vdF9lcnJvciA9IC1FTk9NRU07CisJCWdvdG8gb3V0X25vX3Jvb3Q7CisJfQorCXNiLT5zX3Jvb3QtPmRfb3AgPSBzZXJ2ZXItPnJwY19vcHMtPmRlbnRyeV9vcHM7CisKKwkvKiBtb3VudCB0aW1lIHN0YW1wLCBpbiBzZWNvbmRzICovCisJc2VydmVyLT5tb3VudF90aW1lID0gamlmZmllczsKKworCS8qIEdldCBzb21lIGdlbmVyYWwgZmlsZSBzeXN0ZW0gaW5mbyAqLworCWlmIChzZXJ2ZXItPm5hbWVsZW4gPT0gMCAmJgorCSAgICBzZXJ2ZXItPnJwY19vcHMtPnBhdGhjb25mKHNlcnZlciwgJnNlcnZlci0+ZmgsICZwYXRoaW5mbykgPj0gMCkKKwkJc2VydmVyLT5uYW1lbGVuID0gcGF0aGluZm8ubWF4X25hbWVsZW47CisJLyogV29yayBvdXQgYSBsb3Qgb2YgcGFyYW1ldGVycyAqLworCWlmIChzZXJ2ZXItPnJzaXplID09IDApCisJCXNlcnZlci0+cnNpemUgPSBuZnNfYmxvY2tfc2l6ZShmc2luZm8ucnRwcmVmLCBOVUxMKTsKKwlpZiAoc2VydmVyLT53c2l6ZSA9PSAwKQorCQlzZXJ2ZXItPndzaXplID0gbmZzX2Jsb2NrX3NpemUoZnNpbmZvLnd0cHJlZiwgTlVMTCk7CisKKwlpZiAoZnNpbmZvLnJ0bWF4ID49IDUxMiAmJiBzZXJ2ZXItPnJzaXplID4gZnNpbmZvLnJ0bWF4KQorCQlzZXJ2ZXItPnJzaXplID0gbmZzX2Jsb2NrX3NpemUoZnNpbmZvLnJ0bWF4LCBOVUxMKTsKKwlpZiAoZnNpbmZvLnd0bWF4ID49IDUxMiAmJiBzZXJ2ZXItPndzaXplID4gZnNpbmZvLnd0bWF4KQorCQlzZXJ2ZXItPndzaXplID0gbmZzX2Jsb2NrX3NpemUoZnNpbmZvLnd0bWF4LCBOVUxMKTsKKworCW1heF9ycGNfcGF5bG9hZCA9IG5mc19ibG9ja19zaXplKHJwY19tYXhfcGF5bG9hZChzZXJ2ZXItPmNsaWVudCksIE5VTEwpOworCWlmIChzZXJ2ZXItPnJzaXplID4gbWF4X3JwY19wYXlsb2FkKQorCQlzZXJ2ZXItPnJzaXplID0gbWF4X3JwY19wYXlsb2FkOworCWlmIChzZXJ2ZXItPnJzaXplID4gTkZTX01BWF9GSUxFX0lPX1NJWkUpCisJCXNlcnZlci0+cnNpemUgPSBORlNfTUFYX0ZJTEVfSU9fU0laRTsKKwlzZXJ2ZXItPnJwYWdlcyA9IChzZXJ2ZXItPnJzaXplICsgUEFHRV9DQUNIRV9TSVpFIC0gMSkgPj4gUEFHRV9DQUNIRV9TSElGVDsKKworCWlmIChzZXJ2ZXItPndzaXplID4gbWF4X3JwY19wYXlsb2FkKQorCQlzZXJ2ZXItPndzaXplID0gbWF4X3JwY19wYXlsb2FkOworCWlmIChzZXJ2ZXItPndzaXplID4gTkZTX01BWF9GSUxFX0lPX1NJWkUpCisJCXNlcnZlci0+d3NpemUgPSBORlNfTUFYX0ZJTEVfSU9fU0laRTsKKwlzZXJ2ZXItPndwYWdlcyA9IChzZXJ2ZXItPndzaXplICsgUEFHRV9DQUNIRV9TSVpFIC0gMSkgPj4gUEFHRV9DQUNIRV9TSElGVDsKKworCWlmIChzYi0+c19ibG9ja3NpemUgPT0gMCkKKwkJc2ItPnNfYmxvY2tzaXplID0gbmZzX2Jsb2NrX2JpdHMoc2VydmVyLT53c2l6ZSwKKwkJCQkJCQkgJnNiLT5zX2Jsb2Nrc2l6ZV9iaXRzKTsKKwlzZXJ2ZXItPnd0bXVsdCA9IG5mc19ibG9ja19iaXRzKGZzaW5mby53dG11bHQsIE5VTEwpOworCisJc2VydmVyLT5kdHNpemUgPSBuZnNfYmxvY2tfc2l6ZShmc2luZm8uZHRwcmVmLCBOVUxMKTsKKwlpZiAoc2VydmVyLT5kdHNpemUgPiBQQUdFX0NBQ0hFX1NJWkUpCisJCXNlcnZlci0+ZHRzaXplID0gUEFHRV9DQUNIRV9TSVpFOworCWlmIChzZXJ2ZXItPmR0c2l6ZSA+IHNlcnZlci0+cnNpemUpCisJCXNlcnZlci0+ZHRzaXplID0gc2VydmVyLT5yc2l6ZTsKKworCWlmIChzZXJ2ZXItPmZsYWdzICYgTkZTX01PVU5UX05PQUMpIHsKKwkJc2VydmVyLT5hY3JlZ21pbiA9IHNlcnZlci0+YWNyZWdtYXggPSAwOworCQlzZXJ2ZXItPmFjZGlybWluID0gc2VydmVyLT5hY2Rpcm1heCA9IDA7CisJCXNiLT5zX2ZsYWdzIHw9IE1TX1NZTkNIUk9OT1VTOworCX0KKwlzZXJ2ZXItPmJhY2tpbmdfZGV2X2luZm8ucmFfcGFnZXMgPSBzZXJ2ZXItPnJwYWdlcyAqIE5GU19NQVhfUkVBREFIRUFEOworCisJbmZzX3N1cGVyX3NldF9tYXhieXRlcyhzYiwgZnNpbmZvLm1heGZpbGVzaXplKTsKKworCXNlcnZlci0+Y2xpZW50LT5jbF9pbnRyID0gKHNlcnZlci0+ZmxhZ3MgJiBORlNfTU9VTlRfSU5UUikgPyAxIDogMDsKKwlzZXJ2ZXItPmNsaWVudC0+Y2xfc29mdHJ0cnkgPSAoc2VydmVyLT5mbGFncyAmIE5GU19NT1VOVF9TT0ZUKSA/IDEgOiAwOworCisJLyogV2UncmUgYWlyYm9ybmUgU2V0IHNvY2tldCBidWZmZXJzaXplICovCisJcnBjX3NldGJ1ZnNpemUoc2VydmVyLT5jbGllbnQsIHNlcnZlci0+d3NpemUgKyAxMDAsIHNlcnZlci0+cnNpemUgKyAxMDApOworCXJldHVybiAwOworCS8qIFlhcmdzLiBJdCBkaWRuJ3Qgd29yayBvdXQuICovCitvdXRfbm9fcm9vdDoKKwlkcHJpbnRrKCJuZnNfc2JfaW5pdDogZ2V0IHJvb3QgaW5vZGUgZmFpbGVkOiBlcnJubyAlZFxuIiwgLW5vX3Jvb3RfZXJyb3IpOworCWlmICghSVNfRVJSKHJvb3RfaW5vZGUpKQorCQlpcHV0KHJvb3RfaW5vZGUpOworCXJldHVybiBub19yb290X2Vycm9yOworfQorCisvKgorICogSW5pdGlhbGlzZSB0aGUgdGltZW91dCB2YWx1ZXMgZm9yIGEgY29ubmVjdGlvbgorICovCitzdGF0aWMgdm9pZCBuZnNfaW5pdF90aW1lb3V0X3ZhbHVlcyhzdHJ1Y3QgcnBjX3RpbWVvdXQgKnRvLCBpbnQgcHJvdG8sIHVuc2lnbmVkIGludCB0aW1lbywgdW5zaWduZWQgaW50IHJldHJhbnMpCit7CisJdG8tPnRvX2luaXR2YWwgPSB0aW1lbyAqIEhaIC8gMTA7CisJdG8tPnRvX3JldHJpZXMgPSByZXRyYW5zOworCWlmICghdG8tPnRvX3JldHJpZXMpCisJCXRvLT50b19yZXRyaWVzID0gMjsKKworCXN3aXRjaCAocHJvdG8pIHsKKwljYXNlIElQUFJPVE9fVENQOgorCQlpZiAoIXRvLT50b19pbml0dmFsKQorCQkJdG8tPnRvX2luaXR2YWwgPSA2MCAqIEhaOworCQlpZiAodG8tPnRvX2luaXR2YWwgPiBORlNfTUFYX1RDUF9USU1FT1VUKQorCQkJdG8tPnRvX2luaXR2YWwgPSBORlNfTUFYX1RDUF9USU1FT1VUOworCQl0by0+dG9faW5jcmVtZW50ID0gdG8tPnRvX2luaXR2YWw7CisJCXRvLT50b19tYXh2YWwgPSB0by0+dG9faW5pdHZhbCArICh0by0+dG9faW5jcmVtZW50ICogdG8tPnRvX3JldHJpZXMpOworCQl0by0+dG9fZXhwb25lbnRpYWwgPSAwOworCQlicmVhazsKKwljYXNlIElQUFJPVE9fVURQOgorCWRlZmF1bHQ6CisJCWlmICghdG8tPnRvX2luaXR2YWwpCisJCQl0by0+dG9faW5pdHZhbCA9IDExICogSFogLyAxMDsKKwkJaWYgKHRvLT50b19pbml0dmFsID4gTkZTX01BWF9VRFBfVElNRU9VVCkKKwkJCXRvLT50b19pbml0dmFsID0gTkZTX01BWF9VRFBfVElNRU9VVDsKKwkJdG8tPnRvX21heHZhbCA9IE5GU19NQVhfVURQX1RJTUVPVVQ7CisJCXRvLT50b19leHBvbmVudGlhbCA9IDE7CisJCWJyZWFrOworCX0KK30KKworLyoKKyAqIENyZWF0ZSBhbiBSUEMgY2xpZW50IGhhbmRsZS4KKyAqLworc3RhdGljIHN0cnVjdCBycGNfY2xudCAqCituZnNfY3JlYXRlX2NsaWVudChzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyLCBjb25zdCBzdHJ1Y3QgbmZzX21vdW50X2RhdGEgKmRhdGEpCit7CisJc3RydWN0IHJwY190aW1lb3V0CXRpbWVwYXJtczsKKwlzdHJ1Y3QgcnBjX3hwcnQJCSp4cHJ0ID0gTlVMTDsKKwlzdHJ1Y3QgcnBjX2NsbnQJCSpjbG50ID0gTlVMTDsKKwlpbnQJCQlwcm90byA9IChkYXRhLT5mbGFncyAmIE5GU19NT1VOVF9UQ1ApID8gSVBQUk9UT19UQ1AgOiBJUFBST1RPX1VEUDsKKworCW5mc19pbml0X3RpbWVvdXRfdmFsdWVzKCZ0aW1lcGFybXMsIHByb3RvLCBkYXRhLT50aW1lbywgZGF0YS0+cmV0cmFucyk7CisKKwlzZXJ2ZXItPnJldHJhbnNfdGltZW8gPSB0aW1lcGFybXMudG9faW5pdHZhbDsKKwlzZXJ2ZXItPnJldHJhbnNfY291bnQgPSB0aW1lcGFybXMudG9fcmV0cmllczsKKworCS8qIGNyZWF0ZSB0cmFuc3BvcnQgYW5kIGNsaWVudCAqLworCXhwcnQgPSB4cHJ0X2NyZWF0ZV9wcm90byhwcm90bywgJnNlcnZlci0+YWRkciwgJnRpbWVwYXJtcyk7CisJaWYgKElTX0VSUih4cHJ0KSkgeworCQlkcHJpbnRrKCIlczogY2Fubm90IGNyZWF0ZSBSUEMgdHJhbnNwb3J0LiBFcnJvciA9ICVsZFxuIiwKKwkJCQlfX0ZVTkNUSU9OX18sIFBUUl9FUlIoeHBydCkpOworCQlyZXR1cm4gKHN0cnVjdCBycGNfY2xudCAqKXhwcnQ7CisJfQorCWNsbnQgPSBycGNfY3JlYXRlX2NsaWVudCh4cHJ0LCBzZXJ2ZXItPmhvc3RuYW1lLCAmbmZzX3Byb2dyYW0sCisJCQkJIHNlcnZlci0+cnBjX29wcy0+dmVyc2lvbiwgZGF0YS0+cHNldWRvZmxhdm9yKTsKKwlpZiAoSVNfRVJSKGNsbnQpKSB7CisJCWRwcmludGsoIiVzOiBjYW5ub3QgY3JlYXRlIFJQQyBjbGllbnQuIEVycm9yID0gJWxkXG4iLAorCQkJCV9fRlVOQ1RJT05fXywgUFRSX0VSUih4cHJ0KSk7CisJCWdvdG8gb3V0X2ZhaWw7CisJfQorCisJY2xudC0+Y2xfaW50ciAgICAgPSAxOworCWNsbnQtPmNsX3NvZnRydHJ5ID0gMTsKKworCXJldHVybiBjbG50OworCitvdXRfZmFpbDoKKwlyZXR1cm4gY2xudDsKK30KKworLyoKKyAqIENsb25lIGEgc2VydmVyIHJlY29yZAorICovCitzdGF0aWMgc3RydWN0IG5mc19zZXJ2ZXIgKm5mc19jbG9uZV9zZXJ2ZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IG5mc19jbG9uZV9tb3VudCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyID0gTkZTX1NCKHNiKTsKKwlzdHJ1Y3QgbmZzX3NlcnZlciAqcGFyZW50ID0gTkZTX1NCKGRhdGEtPnNiKTsKKwlzdHJ1Y3QgaW5vZGUgKnJvb3RfaW5vZGU7CisJc3RydWN0IG5mc19mc2luZm8gZnNpbmZvOworCXZvaWQgKmVyciA9IEVSUl9QVFIoLUVOT01FTSk7CisKKwlzYi0+c19vcCA9IGRhdGEtPnNiLT5zX29wOworCXNiLT5zX2Jsb2Nrc2l6ZSA9IGRhdGEtPnNiLT5zX2Jsb2Nrc2l6ZTsKKwlzYi0+c19ibG9ja3NpemVfYml0cyA9IGRhdGEtPnNiLT5zX2Jsb2Nrc2l6ZV9iaXRzOworCXNiLT5zX21heGJ5dGVzID0gZGF0YS0+c2ItPnNfbWF4Ynl0ZXM7CisKKwlzZXJ2ZXItPmNsaWVudF9zeXMgPSBzZXJ2ZXItPmNsaWVudF9hY2wgPSBFUlJfUFRSKC1FSU5WQUwpOworCXNlcnZlci0+aW9fc3RhdHMgPSBuZnNfYWxsb2NfaW9zdGF0cygpOworCWlmIChzZXJ2ZXItPmlvX3N0YXRzID09IE5VTEwpCisJCWdvdG8gb3V0OworCisJc2VydmVyLT5jbGllbnQgPSBycGNfY2xvbmVfY2xpZW50KHBhcmVudC0+Y2xpZW50KTsKKwlpZiAoSVNfRVJSKChlcnIgPSBzZXJ2ZXItPmNsaWVudCkpKQorCQlnb3RvIG91dDsKKworCWlmICghSVNfRVJSKHBhcmVudC0+Y2xpZW50X3N5cykpIHsKKwkJc2VydmVyLT5jbGllbnRfc3lzID0gcnBjX2Nsb25lX2NsaWVudChwYXJlbnQtPmNsaWVudF9zeXMpOworCQlpZiAoSVNfRVJSKChlcnIgPSBzZXJ2ZXItPmNsaWVudF9zeXMpKSkKKwkJCWdvdG8gb3V0OworCX0KKwlpZiAoIUlTX0VSUihwYXJlbnQtPmNsaWVudF9hY2wpKSB7CisJCXNlcnZlci0+Y2xpZW50X2FjbCA9IHJwY19jbG9uZV9jbGllbnQocGFyZW50LT5jbGllbnRfYWNsKTsKKwkJaWYgKElTX0VSUigoZXJyID0gc2VydmVyLT5jbGllbnRfYWNsKSkpCisJCQlnb3RvIG91dDsKKwl9CisJcm9vdF9pbm9kZSA9IG5mc19maGdldChzYiwgZGF0YS0+ZmgsIGRhdGEtPmZhdHRyKTsKKwlpZiAoIXJvb3RfaW5vZGUpCisJCWdvdG8gb3V0OworCXNiLT5zX3Jvb3QgPSBkX2FsbG9jX3Jvb3Qocm9vdF9pbm9kZSk7CisJaWYgKCFzYi0+c19yb290KQorCQlnb3RvIG91dF9wdXRfcm9vdDsKKwlmc2luZm8uZmF0dHIgPSBkYXRhLT5mYXR0cjsKKwlpZiAoTkZTX1BST1RPKHJvb3RfaW5vZGUpLT5mc2luZm8oc2VydmVyLCBkYXRhLT5maCwgJmZzaW5mbykgPT0gMCkKKwkJbmZzX3N1cGVyX3NldF9tYXhieXRlcyhzYiwgZnNpbmZvLm1heGZpbGVzaXplKTsKKwlzYi0+c19yb290LT5kX29wID0gc2VydmVyLT5ycGNfb3BzLT5kZW50cnlfb3BzOworCXNiLT5zX2ZsYWdzIHw9IE1TX0FDVElWRTsKKwlyZXR1cm4gc2VydmVyOworb3V0X3B1dF9yb290OgorCWlwdXQocm9vdF9pbm9kZSk7CitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIENvcHkgYW4gZXhpc3Rpbmcgc3VwZXJibG9jayBhbmQgYXR0YWNoIHJldmlzZWQgZGF0YQorICovCitzdGF0aWMgaW50IG5mc19jbG9uZV9nZW5lcmljX3NiKHN0cnVjdCBuZnNfY2xvbmVfbW91bnQgKmRhdGEsCisJCXN0cnVjdCBzdXBlcl9ibG9jayAqKCpmaWxsX3NiKShzdHJ1Y3QgbmZzX3NlcnZlciAqLCBzdHJ1Y3QgbmZzX2Nsb25lX21vdW50ICopLAorCQlzdHJ1Y3QgbmZzX3NlcnZlciAqKCpmaWxsX3NlcnZlcikoc3RydWN0IHN1cGVyX2Jsb2NrICosIHN0cnVjdCBuZnNfY2xvbmVfbW91bnQgKiksCisJCXN0cnVjdCB2ZnNtb3VudCAqbW50KQoreworCXN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXI7CisJc3RydWN0IG5mc19zZXJ2ZXIgKnBhcmVudCA9IE5GU19TQihkYXRhLT5zYik7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IEVSUl9QVFIoLUVJTlZBTCk7CisJY2hhciAqaG9zdG5hbWU7CisJaW50IGVycm9yID0gLUVOT01FTTsKKwlpbnQgbGVuOworCisJc2VydmVyID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG5mc19zZXJ2ZXIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoc2VydmVyID09IE5VTEwpCisJCWdvdG8gb3V0X2VycjsKKwltZW1jcHkoc2VydmVyLCBwYXJlbnQsIHNpemVvZigqc2VydmVyKSk7CisJaG9zdG5hbWUgPSAoZGF0YS0+aG9zdG5hbWUgIT0gTlVMTCkgPyBkYXRhLT5ob3N0bmFtZSA6IHBhcmVudC0+aG9zdG5hbWU7CisJbGVuID0gc3RybGVuKGhvc3RuYW1lKSArIDE7CisJc2VydmVyLT5ob3N0bmFtZSA9IGttYWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoc2VydmVyLT5ob3N0bmFtZSA9PSBOVUxMKQorCQlnb3RvIGZyZWVfc2VydmVyOworCW1lbWNweShzZXJ2ZXItPmhvc3RuYW1lLCBob3N0bmFtZSwgbGVuKTsKKwllcnJvciA9IHJwY2lvZF91cCgpOworCWlmIChlcnJvciAhPSAwKQorCQlnb3RvIGZyZWVfaG9zdG5hbWU7CisKKwlzYiA9IGZpbGxfc2Ioc2VydmVyLCBkYXRhKTsKKwlpZiAoSVNfRVJSKHNiKSkgeworCQllcnJvciA9IFBUUl9FUlIoc2IpOworCQlnb3RvIGtpbGxfcnBjaW9kOworCX0KKwkJCisJaWYgKHNiLT5zX3Jvb3QpCisJCWdvdG8gb3V0X3JwY2lvZF9kb3duOworCisJc2VydmVyID0gZmlsbF9zZXJ2ZXIoc2IsIGRhdGEpOworCWlmIChJU19FUlIoc2VydmVyKSkgeworCQllcnJvciA9IFBUUl9FUlIoc2VydmVyKTsKKwkJZ290byBvdXRfZGVhY3RpdmF0ZTsKKwl9CisJcmV0dXJuIHNpbXBsZV9zZXRfbW50KG1udCwgc2IpOworb3V0X2RlYWN0aXZhdGU6CisJdXBfd3JpdGUoJnNiLT5zX3Vtb3VudCk7CisJZGVhY3RpdmF0ZV9zdXBlcihzYik7CisJcmV0dXJuIGVycm9yOworb3V0X3JwY2lvZF9kb3duOgorCXJwY2lvZF9kb3duKCk7CisJa2ZyZWUoc2VydmVyLT5ob3N0bmFtZSk7CisJa2ZyZWUoc2VydmVyKTsKKwlyZXR1cm4gc2ltcGxlX3NldF9tbnQobW50LCBzYik7CitraWxsX3JwY2lvZDoKKwlycGNpb2RfZG93bigpOworZnJlZV9ob3N0bmFtZToKKwlrZnJlZShzZXJ2ZXItPmhvc3RuYW1lKTsKK2ZyZWVfc2VydmVyOgorCWtmcmVlKHNlcnZlcik7CitvdXRfZXJyOgorCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIFNldCB1cCBhbiBORlMyLzMgc3VwZXJibG9jaworICoKKyAqIFRoZSB3YXkgdGhpcyB3b3JrcyBpcyB0aGF0IHRoZSBtb3VudCBwcm9jZXNzIHBhc3NlcyBhIHN0cnVjdHVyZQorICogaW4gdGhlIGRhdGEgYXJndW1lbnQgd2hpY2ggY29udGFpbnMgdGhlIHNlcnZlcidzIElQIGFkZHJlc3MKKyAqIGFuZCB0aGUgcm9vdCBmaWxlIGhhbmRsZSBvYnRhaW5lZCBmcm9tIHRoZSBzZXJ2ZXIncyBtb3VudAorICogZGFlbW9uLiBXZSBzdGFzaCB0aGVzZSBhd2F5IGluIHRoZSBwcml2YXRlIHN1cGVyYmxvY2sgZmllbGRzLgorICovCitzdGF0aWMgaW50CituZnNfZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgbmZzX21vdW50X2RhdGEgKmRhdGEsIGludCBzaWxlbnQpCit7CisJc3RydWN0IG5mc19zZXJ2ZXIJKnNlcnZlcjsKKwlycGNfYXV0aGZsYXZvcl90CWF1dGhmbGF2b3I7CisKKwlzZXJ2ZXIgICAgICAgICAgID0gTkZTX1NCKHNiKTsKKwlzYi0+c19ibG9ja3NpemVfYml0cyA9IDA7CisJc2ItPnNfYmxvY2tzaXplID0gMDsKKwlpZiAoZGF0YS0+YnNpemUpCisJCXNiLT5zX2Jsb2Nrc2l6ZSA9IG5mc19ibG9ja19zaXplKGRhdGEtPmJzaXplLCAmc2ItPnNfYmxvY2tzaXplX2JpdHMpOworCWlmIChkYXRhLT5yc2l6ZSkKKwkJc2VydmVyLT5yc2l6ZSA9IG5mc19ibG9ja19zaXplKGRhdGEtPnJzaXplLCBOVUxMKTsKKwlpZiAoZGF0YS0+d3NpemUpCisJCXNlcnZlci0+d3NpemUgPSBuZnNfYmxvY2tfc2l6ZShkYXRhLT53c2l6ZSwgTlVMTCk7CisJc2VydmVyLT5mbGFncyAgICA9IGRhdGEtPmZsYWdzICYgTkZTX01PVU5UX0ZMQUdNQVNLOworCisJc2VydmVyLT5hY3JlZ21pbiA9IGRhdGEtPmFjcmVnbWluKkhaOworCXNlcnZlci0+YWNyZWdtYXggPSBkYXRhLT5hY3JlZ21heCpIWjsKKwlzZXJ2ZXItPmFjZGlybWluID0gZGF0YS0+YWNkaXJtaW4qSFo7CisJc2VydmVyLT5hY2Rpcm1heCA9IGRhdGEtPmFjZGlybWF4KkhaOworCisJLyogU3RhcnQgbG9ja2QgaGVyZSwgYmVmb3JlIHdlIG1pZ2h0IGVycm9yIG91dCAqLworCWlmICghKHNlcnZlci0+ZmxhZ3MgJiBORlNfTU9VTlRfTk9OTE0pKQorCQlsb2NrZF91cCgpOworCisJc2VydmVyLT5uYW1lbGVuICA9IGRhdGEtPm5hbWxlbjsKKwlzZXJ2ZXItPmhvc3RuYW1lID0ga21hbGxvYyhzdHJsZW4oZGF0YS0+aG9zdG5hbWUpICsgMSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzZXJ2ZXItPmhvc3RuYW1lKQorCQlyZXR1cm4gLUVOT01FTTsKKwlzdHJjcHkoc2VydmVyLT5ob3N0bmFtZSwgZGF0YS0+aG9zdG5hbWUpOworCisJLyogQ2hlY2sgTkZTIHByb3RvY29sIHJldmlzaW9uIGFuZCBpbml0aWFsaXplIFJQQyBvcCB2ZWN0b3IKKwkgKiBhbmQgZmlsZSBoYW5kbGUgcG9vbC4gKi8KKyNpZmRlZiBDT05GSUdfTkZTX1YzCisJaWYgKHNlcnZlci0+ZmxhZ3MgJiBORlNfTU9VTlRfVkVSMykgeworCQlzZXJ2ZXItPnJwY19vcHMgPSAmbmZzX3YzX2NsaWVudG9wczsKKwkJc2VydmVyLT5jYXBzIHw9IE5GU19DQVBfUkVBRERJUlBMVVM7CisJfSBlbHNlIHsKKwkJc2VydmVyLT5ycGNfb3BzID0gJm5mc192Ml9jbGllbnRvcHM7CisJfQorI2Vsc2UKKwlzZXJ2ZXItPnJwY19vcHMgPSAmbmZzX3YyX2NsaWVudG9wczsKKyNlbmRpZgorCisJLyogRmlsbCBpbiBwc2V1ZG9mbGF2b3IgZm9yIG1vdW50IHZlcnNpb24gPCA1ICovCisJaWYgKCEoZGF0YS0+ZmxhZ3MgJiBORlNfTU9VTlRfU0VDRkxBVk9VUikpCisJCWRhdGEtPnBzZXVkb2ZsYXZvciA9IFJQQ19BVVRIX1VOSVg7CisJYXV0aGZsYXZvciA9IGRhdGEtPnBzZXVkb2ZsYXZvcjsJLyogc2F2ZSBmb3Igc2JfaW5pdCgpICovCisJLyogWFhYIG1heWJlIHdlIHdhbnQgdG8gYWRkIGEgc2VydmVyLT5wc2V1ZG9mbGF2b3IgZmllbGQgKi8KKworCS8qIENyZWF0ZSBSUEMgY2xpZW50IGhhbmRsZXMgKi8KKwlzZXJ2ZXItPmNsaWVudCA9IG5mc19jcmVhdGVfY2xpZW50KHNlcnZlciwgZGF0YSk7CisJaWYgKElTX0VSUihzZXJ2ZXItPmNsaWVudCkpCisJCXJldHVybiBQVFJfRVJSKHNlcnZlci0+Y2xpZW50KTsKKwkvKiBSRkMgMjYyMywgc2VjIDIuMy4yICovCisJaWYgKGF1dGhmbGF2b3IgIT0gUlBDX0FVVEhfVU5JWCkgeworCQlzdHJ1Y3QgcnBjX2F1dGggKmF1dGg7CisKKwkJc2VydmVyLT5jbGllbnRfc3lzID0gcnBjX2Nsb25lX2NsaWVudChzZXJ2ZXItPmNsaWVudCk7CisJCWlmIChJU19FUlIoc2VydmVyLT5jbGllbnRfc3lzKSkKKwkJCXJldHVybiBQVFJfRVJSKHNlcnZlci0+Y2xpZW50X3N5cyk7CisJCWF1dGggPSBycGNhdXRoX2NyZWF0ZShSUENfQVVUSF9VTklYLCBzZXJ2ZXItPmNsaWVudF9zeXMpOworCQlpZiAoSVNfRVJSKGF1dGgpKQorCQkJcmV0dXJuIFBUUl9FUlIoYXV0aCk7CisJfSBlbHNlIHsKKwkJYXRvbWljX2luYygmc2VydmVyLT5jbGllbnQtPmNsX2NvdW50KTsKKwkJc2VydmVyLT5jbGllbnRfc3lzID0gc2VydmVyLT5jbGllbnQ7CisJfQorCWlmIChzZXJ2ZXItPmZsYWdzICYgTkZTX01PVU5UX1ZFUjMpIHsKKyNpZmRlZiBDT05GSUdfTkZTX1YzX0FDTAorCQlpZiAoIShzZXJ2ZXItPmZsYWdzICYgTkZTX01PVU5UX05PQUNMKSkgeworCQkJc2VydmVyLT5jbGllbnRfYWNsID0gcnBjX2JpbmRfbmV3X3Byb2dyYW0oc2VydmVyLT5jbGllbnQsICZuZnNhY2xfcHJvZ3JhbSwgMyk7CisJCQkvKiBObyBlcnJvcnMhIEFzc3VtZSB0aGF0IFN1biBuZnNhY2xzIGFyZSBzdXBwb3J0ZWQgKi8KKwkJCWlmICghSVNfRVJSKHNlcnZlci0+Y2xpZW50X2FjbCkpCisJCQkJc2VydmVyLT5jYXBzIHw9IE5GU19DQVBfQUNMUzsKKwkJfQorI2Vsc2UKKwkJc2VydmVyLT5mbGFncyAmPSB+TkZTX01PVU5UX05PQUNMOworI2VuZGlmIC8qIENPTkZJR19ORlNfVjNfQUNMICovCisJCS8qCisJCSAqIFRoZSBWRlMgc2hvdWxkbid0IGFwcGx5IHRoZSB1bWFzayB0byBtb2RlIGJpdHMuIFdlIHdpbGwKKwkJICogZG8gc28gb3Vyc2VsdmVzIHdoZW4gbmVjZXNzYXJ5LgorCQkgKi8KKwkJc2ItPnNfZmxhZ3MgfD0gTVNfUE9TSVhBQ0w7CisJCWlmIChzZXJ2ZXItPm5hbWVsZW4gPT0gMCB8fCBzZXJ2ZXItPm5hbWVsZW4gPiBORlMzX01BWE5BTUxFTikKKwkJCXNlcnZlci0+bmFtZWxlbiA9IE5GUzNfTUFYTkFNTEVOOworCQlzYi0+c190aW1lX2dyYW4gPSAxOworCX0gZWxzZSB7CisJCWlmIChzZXJ2ZXItPm5hbWVsZW4gPT0gMCB8fCBzZXJ2ZXItPm5hbWVsZW4gPiBORlMyX01BWE5BTUxFTikKKwkJCXNlcnZlci0+bmFtZWxlbiA9IE5GUzJfTUFYTkFNTEVOOworCX0KKworCXNiLT5zX29wID0gJm5mc19zb3BzOworCXJldHVybiBuZnNfc2JfaW5pdChzYiwgYXV0aGZsYXZvcik7Cit9CisKK3N0YXRpYyBpbnQgbmZzX3NldF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHZvaWQgKmRhdGEpCit7CisJcy0+c19mc19pbmZvID0gZGF0YTsKKwlyZXR1cm4gc2V0X2Fub25fc3VwZXIocywgZGF0YSk7Cit9CisKK3N0YXRpYyBpbnQgbmZzX2NvbXBhcmVfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyID0gZGF0YTsKKwlzdHJ1Y3QgbmZzX3NlcnZlciAqb2xkID0gTkZTX1NCKHNiKTsKKworCWlmIChvbGQtPmFkZHIuc2luX2FkZHIuc19hZGRyICE9IHNlcnZlci0+YWRkci5zaW5fYWRkci5zX2FkZHIpCisJCXJldHVybiAwOworCWlmIChvbGQtPmFkZHIuc2luX3BvcnQgIT0gc2VydmVyLT5hZGRyLnNpbl9wb3J0KQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gIW5mc19jb21wYXJlX2ZoKCZvbGQtPmZoLCAmc2VydmVyLT5maCk7Cit9CisKK3N0YXRpYyBpbnQgbmZzX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKKwlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpyYXdfZGF0YSwgc3RydWN0IHZmc21vdW50ICptbnQpCit7CisJaW50IGVycm9yOworCXN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIgPSBOVUxMOworCXN0cnVjdCBzdXBlcl9ibG9jayAqczsKKwlzdHJ1Y3QgbmZzX2ZoICpyb290OworCXN0cnVjdCBuZnNfbW91bnRfZGF0YSAqZGF0YSA9IHJhd19kYXRhOworCisJZXJyb3IgPSAtRUlOVkFMOworCWlmIChkYXRhID09IE5VTEwpIHsKKwkJZHByaW50aygiJXM6IG1pc3NpbmcgZGF0YSBhcmd1bWVudFxuIiwgX19GVU5DVElPTl9fKTsKKwkJZ290byBvdXRfZXJyX25vc2VydmVyOworCX0KKwlpZiAoZGF0YS0+dmVyc2lvbiA8PSAwIHx8IGRhdGEtPnZlcnNpb24gPiBORlNfTU9VTlRfVkVSU0lPTikgeworCQlkcHJpbnRrKCIlczogYmFkIG1vdW50IHZlcnNpb25cbiIsIF9fRlVOQ1RJT05fXyk7CisJCWdvdG8gb3V0X2Vycl9ub3NlcnZlcjsKKwl9CisJc3dpdGNoIChkYXRhLT52ZXJzaW9uKSB7CisJCWNhc2UgMToKKwkJCWRhdGEtPm5hbWxlbiA9IDA7CisJCWNhc2UgMjoKKwkJCWRhdGEtPmJzaXplICA9IDA7CisJCWNhc2UgMzoKKwkJCWlmIChkYXRhLT5mbGFncyAmIE5GU19NT1VOVF9WRVIzKSB7CisJCQkJZHByaW50aygiJXM6IG1vdW50IHN0cnVjdHVyZSB2ZXJzaW9uICVkIGRvZXMgbm90IHN1cHBvcnQgTkZTdjNcbiIsCisJCQkJCQlfX0ZVTkNUSU9OX18sCisJCQkJCQlkYXRhLT52ZXJzaW9uKTsKKwkJCQlnb3RvIG91dF9lcnJfbm9zZXJ2ZXI7CisJCQl9CisJCQlkYXRhLT5yb290LnNpemUgPSBORlMyX0ZIU0laRTsKKwkJCW1lbWNweShkYXRhLT5yb290LmRhdGEsIGRhdGEtPm9sZF9yb290LmRhdGEsIE5GUzJfRkhTSVpFKTsKKwkJY2FzZSA0OgorCQkJaWYgKGRhdGEtPmZsYWdzICYgTkZTX01PVU5UX1NFQ0ZMQVZPVVIpIHsKKwkJCQlkcHJpbnRrKCIlczogbW91bnQgc3RydWN0dXJlIHZlcnNpb24gJWQgZG9lcyBub3Qgc3VwcG9ydCBzdHJvbmcgc2VjdXJpdHlcbiIsCisJCQkJCQlfX0ZVTkNUSU9OX18sCisJCQkJCQlkYXRhLT52ZXJzaW9uKTsKKwkJCQlnb3RvIG91dF9lcnJfbm9zZXJ2ZXI7CisJCQl9CisJCWNhc2UgNToKKwkJCW1lbXNldChkYXRhLT5jb250ZXh0LCAwLCBzaXplb2YoZGF0YS0+Y29udGV4dCkpOworCX0KKyNpZm5kZWYgQ09ORklHX05GU19WMworCS8qIElmIE5GU3YzIGlzIG5vdCBjb21waWxlZCBpbiwgcmV0dXJuIC1FUFJPVE9OT1NVUFBPUlQgKi8KKwllcnJvciA9IC1FUFJPVE9OT1NVUFBPUlQ7CisJaWYgKGRhdGEtPmZsYWdzICYgTkZTX01PVU5UX1ZFUjMpIHsKKwkJZHByaW50aygiJXM6IE5GU3YzIG5vdCBjb21waWxlZCBpbnRvIGtlcm5lbFxuIiwgX19GVU5DVElPTl9fKTsKKwkJZ290byBvdXRfZXJyX25vc2VydmVyOworCX0KKyNlbmRpZiAvKiBDT05GSUdfTkZTX1YzICovCisKKwllcnJvciA9IC1FTk9NRU07CisJc2VydmVyID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG5mc19zZXJ2ZXIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNlcnZlcikKKwkJZ290byBvdXRfZXJyX25vc2VydmVyOworCS8qIFplcm8gb3V0IHRoZSBORlMgc3RhdGUgc3R1ZmYgKi8KKwlpbml0X25mc3Y0X3N0YXRlKHNlcnZlcik7CisJc2VydmVyLT5jbGllbnQgPSBzZXJ2ZXItPmNsaWVudF9zeXMgPSBzZXJ2ZXItPmNsaWVudF9hY2wgPSBFUlJfUFRSKC1FSU5WQUwpOworCisJcm9vdCA9ICZzZXJ2ZXItPmZoOworCWlmIChkYXRhLT5mbGFncyAmIE5GU19NT1VOVF9WRVIzKQorCQlyb290LT5zaXplID0gZGF0YS0+cm9vdC5zaXplOworCWVsc2UKKwkJcm9vdC0+c2l6ZSA9IE5GUzJfRkhTSVpFOworCWVycm9yID0gLUVJTlZBTDsKKwlpZiAocm9vdC0+c2l6ZSA+IHNpemVvZihyb290LT5kYXRhKSkgeworCQlkcHJpbnRrKCIlczogaW52YWxpZCByb290IGZpbGVoYW5kbGVcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWdvdG8gb3V0X2VycjsKKwl9CisJbWVtY3B5KHJvb3QtPmRhdGEsIGRhdGEtPnJvb3QuZGF0YSwgcm9vdC0+c2l6ZSk7CisKKwkvKiBXZSBub3cgcmVxdWlyZSB0aGF0IHRoZSBtb3VudCBwcm9jZXNzIHBhc3NlcyB0aGUgcmVtb3RlIGFkZHJlc3MgKi8KKwltZW1jcHkoJnNlcnZlci0+YWRkciwgJmRhdGEtPmFkZHIsIHNpemVvZihzZXJ2ZXItPmFkZHIpKTsKKwlpZiAoc2VydmVyLT5hZGRyLnNpbl9hZGRyLnNfYWRkciA9PSBJTkFERFJfQU5ZKSB7CisJCWRwcmludGsoIiVzOiBtb3VudCBwcm9ncmFtIGRpZG4ndCBwYXNzIHJlbW90ZSBhZGRyZXNzIVxuIiwKKwkJCQlfX0ZVTkNUSU9OX18pOworCQlnb3RvIG91dF9lcnI7CisJfQorCisJLyogRmlyZSB1cCBycGNpb2QgaWYgbm90IHlldCBydW5uaW5nICovCisJZXJyb3IgPSBycGNpb2RfdXAoKTsKKwlpZiAoZXJyb3IgPCAwKSB7CisJCWRwcmludGsoIiVzOiBjb3VsZG4ndCBzdGFydCBycGNpb2QhIEVycm9yID0gJWRcbiIsCisJCQkJX19GVU5DVElPTl9fLCBlcnJvcik7CisJCWdvdG8gb3V0X2VycjsKKwl9CisKKwlzID0gc2dldChmc190eXBlLCBuZnNfY29tcGFyZV9zdXBlciwgbmZzX3NldF9zdXBlciwgc2VydmVyKTsKKwlpZiAoSVNfRVJSKHMpKSB7CisJCWVycm9yID0gUFRSX0VSUihzKTsKKwkJZ290byBvdXRfZXJyX3JwY2lvZDsKKwl9CisKKwlpZiAocy0+c19yb290KQorCQlnb3RvIG91dF9ycGNpb2RfZG93bjsKKworCXMtPnNfZmxhZ3MgPSBmbGFnczsKKworCWVycm9yID0gbmZzX2ZpbGxfc3VwZXIocywgZGF0YSwgZmxhZ3MgJiBNU19TSUxFTlQgPyAxIDogMCk7CisJaWYgKGVycm9yKSB7CisJCXVwX3dyaXRlKCZzLT5zX3Vtb3VudCk7CisJCWRlYWN0aXZhdGVfc3VwZXIocyk7CisJCXJldHVybiBlcnJvcjsKKwl9CisJcy0+c19mbGFncyB8PSBNU19BQ1RJVkU7CisJcmV0dXJuIHNpbXBsZV9zZXRfbW50KG1udCwgcyk7CisKK291dF9ycGNpb2RfZG93bjoKKwlycGNpb2RfZG93bigpOworCWtmcmVlKHNlcnZlcik7CisJcmV0dXJuIHNpbXBsZV9zZXRfbW50KG1udCwgcyk7CisKK291dF9lcnJfcnBjaW9kOgorCXJwY2lvZF9kb3duKCk7CitvdXRfZXJyOgorCWtmcmVlKHNlcnZlcik7CitvdXRfZXJyX25vc2VydmVyOgorCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIHZvaWQgbmZzX2tpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzKQoreworCXN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIgPSBORlNfU0Iocyk7CisKKwlraWxsX2Fub25fc3VwZXIocyk7CisKKwlpZiAoIUlTX0VSUihzZXJ2ZXItPmNsaWVudCkpCisJCXJwY19zaHV0ZG93bl9jbGllbnQoc2VydmVyLT5jbGllbnQpOworCWlmICghSVNfRVJSKHNlcnZlci0+Y2xpZW50X3N5cykpCisJCXJwY19zaHV0ZG93bl9jbGllbnQoc2VydmVyLT5jbGllbnRfc3lzKTsKKwlpZiAoIUlTX0VSUihzZXJ2ZXItPmNsaWVudF9hY2wpKQorCQlycGNfc2h1dGRvd25fY2xpZW50KHNlcnZlci0+Y2xpZW50X2FjbCk7CisKKwlpZiAoIShzZXJ2ZXItPmZsYWdzICYgTkZTX01PVU5UX05PTkxNKSkKKwkJbG9ja2RfZG93bigpOwkvKiByZWxlYXNlIHJwYy5sb2NrZCAqLworCisJcnBjaW9kX2Rvd24oKTsJCS8qIHJlbGVhc2UgcnBjaW9kICovCisKKwluZnNfZnJlZV9pb3N0YXRzKHNlcnZlci0+aW9fc3RhdHMpOworCWtmcmVlKHNlcnZlci0+aG9zdG5hbWUpOworCWtmcmVlKHNlcnZlcik7CisJbmZzX3JlbGVhc2VfYXV0b21vdW50X3RpbWVyKCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKm5mc19jbG9uZV9zYihzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyLCBzdHJ1Y3QgbmZzX2Nsb25lX21vdW50ICpkYXRhKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CisKKwlzZXJ2ZXItPmZzaWQgPSBkYXRhLT5mYXR0ci0+ZnNpZDsKKwluZnNfY29weV9maCgmc2VydmVyLT5maCwgZGF0YS0+ZmgpOworCXNiID0gc2dldCgmbmZzX2ZzX3R5cGUsIG5mc19jb21wYXJlX3N1cGVyLCBuZnNfc2V0X3N1cGVyLCBzZXJ2ZXIpOworCWlmICghSVNfRVJSKHNiKSAmJiBzYi0+c19yb290ID09IE5VTEwgJiYgIShzZXJ2ZXItPmZsYWdzICYgTkZTX01PVU5UX05PTkxNKSkKKwkJbG9ja2RfdXAoKTsKKwlyZXR1cm4gc2I7Cit9CisKK3N0YXRpYyBpbnQgbmZzX2Nsb25lX25mc19zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKKwkJaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqcmF3X2RhdGEsIHN0cnVjdCB2ZnNtb3VudCAqbW50KQoreworCXN0cnVjdCBuZnNfY2xvbmVfbW91bnQgKmRhdGEgPSByYXdfZGF0YTsKKwlyZXR1cm4gbmZzX2Nsb25lX2dlbmVyaWNfc2IoZGF0YSwgbmZzX2Nsb25lX3NiLCBuZnNfY2xvbmVfc2VydmVyLCBtbnQpOworfQorCisjaWZkZWYgQ09ORklHX05GU19WNAorc3RhdGljIHN0cnVjdCBycGNfY2xudCAqbmZzNF9jcmVhdGVfY2xpZW50KHN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIsCisJc3RydWN0IHJwY190aW1lb3V0ICp0aW1lcGFybXMsIGludCBwcm90bywgcnBjX2F1dGhmbGF2b3JfdCBmbGF2b3IpCit7CisJc3RydWN0IG5mczRfY2xpZW50ICpjbHA7CisJc3RydWN0IHJwY194cHJ0ICp4cHJ0ID0gTlVMTDsKKwlzdHJ1Y3QgcnBjX2NsbnQgKmNsbnQgPSBOVUxMOworCWludCBlcnIgPSAtRUlPOworCisJY2xwID0gbmZzNF9nZXRfY2xpZW50KCZzZXJ2ZXItPmFkZHIuc2luX2FkZHIpOworCWlmICghY2xwKSB7CisJCWRwcmludGsoIiVzOiBmYWlsZWQgdG8gY3JlYXRlIE5GUzQgY2xpZW50LlxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKKwl9CisKKwkvKiBOb3cgY3JlYXRlIHRyYW5zcG9ydCBhbmQgY2xpZW50ICovCisJZG93bl93cml0ZSgmY2xwLT5jbF9zZW0pOworCWlmIChJU19FUlIoY2xwLT5jbF9ycGNjbGllbnQpKSB7CisJCXhwcnQgPSB4cHJ0X2NyZWF0ZV9wcm90byhwcm90bywgJnNlcnZlci0+YWRkciwgdGltZXBhcm1zKTsKKwkJaWYgKElTX0VSUih4cHJ0KSkgeworCQkJdXBfd3JpdGUoJmNscC0+Y2xfc2VtKTsKKwkJCWVyciA9IFBUUl9FUlIoeHBydCk7CisJCQlkcHJpbnRrKCIlczogY2Fubm90IGNyZWF0ZSBSUEMgdHJhbnNwb3J0LiBFcnJvciA9ICVkXG4iLAorCQkJCQlfX0ZVTkNUSU9OX18sIGVycik7CisJCQlnb3RvIG91dF9mYWlsOworCQl9CisJCS8qIEJpbmQgdG8gYSByZXNlcnZlZCBwb3J0ISAqLworCQl4cHJ0LT5yZXN2cG9ydCA9IDE7CisJCWNsbnQgPSBycGNfY3JlYXRlX2NsaWVudCh4cHJ0LCBzZXJ2ZXItPmhvc3RuYW1lLCAmbmZzX3Byb2dyYW0sCisJCQkJc2VydmVyLT5ycGNfb3BzLT52ZXJzaW9uLCBmbGF2b3IpOworCQlpZiAoSVNfRVJSKGNsbnQpKSB7CisJCQl1cF93cml0ZSgmY2xwLT5jbF9zZW0pOworCQkJZXJyID0gUFRSX0VSUihjbG50KTsKKwkJCWRwcmludGsoIiVzOiBjYW5ub3QgY3JlYXRlIFJQQyBjbGllbnQuIEVycm9yID0gJWRcbiIsCisJCQkJCV9fRlVOQ1RJT05fXywgZXJyKTsKKwkJCWdvdG8gb3V0X2ZhaWw7CisJCX0KKwkJY2xudC0+Y2xfaW50ciAgICAgPSAxOworCQljbG50LT5jbF9zb2Z0cnRyeSA9IDE7CisJCWNscC0+Y2xfcnBjY2xpZW50ID0gY2xudDsKKwkJbWVtY3B5KGNscC0+Y2xfaXBhZGRyLCBzZXJ2ZXItPmlwX2FkZHIsIHNpemVvZihjbHAtPmNsX2lwYWRkcikpOworCQluZnNfaWRtYXBfbmV3KGNscCk7CisJfQorCWxpc3RfYWRkX3RhaWwoJnNlcnZlci0+bmZzNF9zaWJsaW5ncywgJmNscC0+Y2xfc3VwZXJibG9ja3MpOworCWNsbnQgPSBycGNfY2xvbmVfY2xpZW50KGNscC0+Y2xfcnBjY2xpZW50KTsKKwlpZiAoIUlTX0VSUihjbG50KSkKKwkJc2VydmVyLT5uZnM0X3N0YXRlID0gY2xwOworCXVwX3dyaXRlKCZjbHAtPmNsX3NlbSk7CisJY2xwID0gTlVMTDsKKworCWlmIChJU19FUlIoY2xudCkpIHsKKwkJZHByaW50aygiJXM6IGNhbm5vdCBjcmVhdGUgUlBDIGNsaWVudC4gRXJyb3IgPSAlZFxuIiwKKwkJCQlfX0ZVTkNUSU9OX18sIGVycik7CisJCXJldHVybiBjbG50OworCX0KKworCWlmIChzZXJ2ZXItPm5mczRfc3RhdGUtPmNsX2lkbWFwID09IE5VTEwpIHsKKwkJZHByaW50aygiJXM6IGZhaWxlZCB0byBjcmVhdGUgaWRtYXBwZXIuXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwl9CisKKwlpZiAoY2xudC0+Y2xfYXV0aC0+YXVfZmxhdm9yICE9IGZsYXZvcikgeworCQlzdHJ1Y3QgcnBjX2F1dGggKmF1dGg7CisKKwkJYXV0aCA9IHJwY2F1dGhfY3JlYXRlKGZsYXZvciwgY2xudCk7CisJCWlmIChJU19FUlIoYXV0aCkpIHsKKwkJCWRwcmludGsoIiVzOiBjb3VsZG4ndCBjcmVhdGUgY3JlZGNhY2hlIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJCXJldHVybiAoc3RydWN0IHJwY19jbG50ICopYXV0aDsKKwkJfQorCX0KKwlyZXR1cm4gY2xudDsKKworIG91dF9mYWlsOgorCWlmIChjbHApCisJCW5mczRfcHV0X2NsaWVudChjbHApOworCXJldHVybiBFUlJfUFRSKGVycik7Cit9CisKKy8qCisgKiBTZXQgdXAgYW4gTkZTNCBzdXBlcmJsb2NrCisgKi8KK3N0YXRpYyBpbnQgbmZzNF9maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBuZnM0X21vdW50X2RhdGEgKmRhdGEsIGludCBzaWxlbnQpCit7CisJc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlcjsKKwlzdHJ1Y3QgcnBjX3RpbWVvdXQgdGltZXBhcm1zOworCXJwY19hdXRoZmxhdm9yX3QgYXV0aGZsYXZvdXI7CisJaW50IGVyciA9IC1FSU87CisKKwlzYi0+c19ibG9ja3NpemVfYml0cyA9IDA7CisJc2ItPnNfYmxvY2tzaXplID0gMDsKKwlzZXJ2ZXIgPSBORlNfU0Ioc2IpOworCWlmIChkYXRhLT5yc2l6ZSAhPSAwKQorCQlzZXJ2ZXItPnJzaXplID0gbmZzX2Jsb2NrX3NpemUoZGF0YS0+cnNpemUsIE5VTEwpOworCWlmIChkYXRhLT53c2l6ZSAhPSAwKQorCQlzZXJ2ZXItPndzaXplID0gbmZzX2Jsb2NrX3NpemUoZGF0YS0+d3NpemUsIE5VTEwpOworCXNlcnZlci0+ZmxhZ3MgPSBkYXRhLT5mbGFncyAmIE5GU19NT1VOVF9GTEFHTUFTSzsKKwlzZXJ2ZXItPmNhcHMgPSBORlNfQ0FQX0FUT01JQ19PUEVOOworCisJc2VydmVyLT5hY3JlZ21pbiA9IGRhdGEtPmFjcmVnbWluKkhaOworCXNlcnZlci0+YWNyZWdtYXggPSBkYXRhLT5hY3JlZ21heCpIWjsKKwlzZXJ2ZXItPmFjZGlybWluID0gZGF0YS0+YWNkaXJtaW4qSFo7CisJc2VydmVyLT5hY2Rpcm1heCA9IGRhdGEtPmFjZGlybWF4KkhaOworCisJc2VydmVyLT5ycGNfb3BzID0gJm5mc192NF9jbGllbnRvcHM7CisKKwluZnNfaW5pdF90aW1lb3V0X3ZhbHVlcygmdGltZXBhcm1zLCBkYXRhLT5wcm90bywgZGF0YS0+dGltZW8sIGRhdGEtPnJldHJhbnMpOworCisJc2VydmVyLT5yZXRyYW5zX3RpbWVvID0gdGltZXBhcm1zLnRvX2luaXR2YWw7CisJc2VydmVyLT5yZXRyYW5zX2NvdW50ID0gdGltZXBhcm1zLnRvX3JldHJpZXM7CisKKwkvKiBOb3cgY3JlYXRlIHRyYW5zcG9ydCBhbmQgY2xpZW50ICovCisJYXV0aGZsYXZvdXIgPSBSUENfQVVUSF9VTklYOworCWlmIChkYXRhLT5hdXRoX2ZsYXZvdXJsZW4gIT0gMCkgeworCQlpZiAoZGF0YS0+YXV0aF9mbGF2b3VybGVuICE9IDEpIHsKKwkJCWRwcmludGsoIiVzOiBJbnZhbGlkIG51bWJlciBvZiBSUEMgYXV0aCBmbGF2b3VycyAlZC5cbiIsCisJCQkJCV9fRlVOQ1RJT05fXywgZGF0YS0+YXV0aF9mbGF2b3VybGVuKTsKKwkJCWVyciA9IC1FSU5WQUw7CisJCQlnb3RvIG91dF9mYWlsOworCQl9CisJCWlmIChjb3B5X2Zyb21fdXNlcigmYXV0aGZsYXZvdXIsIGRhdGEtPmF1dGhfZmxhdm91cnMsIHNpemVvZihhdXRoZmxhdm91cikpKSB7CisJCQllcnIgPSAtRUZBVUxUOworCQkJZ290byBvdXRfZmFpbDsKKwkJfQorCX0KKworCXNlcnZlci0+Y2xpZW50ID0gbmZzNF9jcmVhdGVfY2xpZW50KHNlcnZlciwgJnRpbWVwYXJtcywgZGF0YS0+cHJvdG8sIGF1dGhmbGF2b3VyKTsKKwlpZiAoSVNfRVJSKHNlcnZlci0+Y2xpZW50KSkgeworCQllcnIgPSBQVFJfRVJSKHNlcnZlci0+Y2xpZW50KTsKKwkJCWRwcmludGsoIiVzOiBjYW5ub3QgY3JlYXRlIFJQQyBjbGllbnQuIEVycm9yID0gJWRcbiIsCisJCQkJCV9fRlVOQ1RJT05fXywgZXJyKTsKKwkJCWdvdG8gb3V0X2ZhaWw7CisJfQorCisJc2ItPnNfdGltZV9ncmFuID0gMTsKKworCXNiLT5zX29wID0gJm5mczRfc29wczsKKwllcnIgPSBuZnNfc2JfaW5pdChzYiwgYXV0aGZsYXZvdXIpOworCisgb3V0X2ZhaWw6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBuZnM0X2NvbXBhcmVfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyID0gZGF0YTsKKwlzdHJ1Y3QgbmZzX3NlcnZlciAqb2xkID0gTkZTX1NCKHNiKTsKKworCWlmIChzdHJjbXAoc2VydmVyLT5ob3N0bmFtZSwgb2xkLT5ob3N0bmFtZSkgIT0gMCkKKwkJcmV0dXJuIDA7CisJaWYgKHN0cmNtcChzZXJ2ZXItPm1udF9wYXRoLCBvbGQtPm1udF9wYXRoKSAhPSAwKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgKgorbmZzX2NvcHlfdXNlcl9zdHJpbmcoY2hhciAqZHN0LCBzdHJ1Y3QgbmZzX3N0cmluZyAqc3JjLCBpbnQgbWF4bGVuKQoreworCXZvaWQgKnAgPSBOVUxMOworCisJaWYgKCFzcmMtPmxlbikKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJaWYgKHNyYy0+bGVuIDwgbWF4bGVuKQorCQltYXhsZW4gPSBzcmMtPmxlbjsKKwlpZiAoZHN0ID09IE5VTEwpIHsKKwkJcCA9IGRzdCA9IGttYWxsb2MobWF4bGVuICsgMSwgR0ZQX0tFUk5FTCk7CisJCWlmIChwID09IE5VTEwpCisJCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwl9CisJaWYgKGNvcHlfZnJvbV91c2VyKGRzdCwgc3JjLT5kYXRhLCBtYXhsZW4pKSB7CisJCWtmcmVlKHApOworCQlyZXR1cm4gRVJSX1BUUigtRUZBVUxUKTsKKwl9CisJZHN0W21heGxlbl0gPSAnXDAnOworCXJldHVybiBkc3Q7Cit9CisKK3N0YXRpYyBpbnQgbmZzNF9nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqcmF3X2RhdGEsIHN0cnVjdCB2ZnNtb3VudCAqbW50KQoreworCWludCBlcnJvcjsKKwlzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyOworCXN0cnVjdCBzdXBlcl9ibG9jayAqczsKKwlzdHJ1Y3QgbmZzNF9tb3VudF9kYXRhICpkYXRhID0gcmF3X2RhdGE7CisJdm9pZCAqcDsKKworCWlmIChkYXRhID09IE5VTEwpIHsKKwkJZHByaW50aygiJXM6IG1pc3NpbmcgZGF0YSBhcmd1bWVudFxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChkYXRhLT52ZXJzaW9uIDw9IDAgfHwgZGF0YS0+dmVyc2lvbiA+IE5GUzRfTU9VTlRfVkVSU0lPTikgeworCQlkcHJpbnRrKCIlczogYmFkIG1vdW50IHZlcnNpb25cbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNlcnZlciA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBuZnNfc2VydmVyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzZXJ2ZXIpCisJCXJldHVybiAtRU5PTUVNOworCS8qIFplcm8gb3V0IHRoZSBORlMgc3RhdGUgc3R1ZmYgKi8KKwlpbml0X25mc3Y0X3N0YXRlKHNlcnZlcik7CisJc2VydmVyLT5jbGllbnQgPSBzZXJ2ZXItPmNsaWVudF9zeXMgPSBzZXJ2ZXItPmNsaWVudF9hY2wgPSBFUlJfUFRSKC1FSU5WQUwpOworCisJcCA9IG5mc19jb3B5X3VzZXJfc3RyaW5nKE5VTEwsICZkYXRhLT5ob3N0bmFtZSwgMjU2KTsKKwlpZiAoSVNfRVJSKHApKQorCQlnb3RvIG91dF9lcnI7CisJc2VydmVyLT5ob3N0bmFtZSA9IHA7CisKKwlwID0gbmZzX2NvcHlfdXNlcl9zdHJpbmcoTlVMTCwgJmRhdGEtPm1udF9wYXRoLCAxMDI0KTsKKwlpZiAoSVNfRVJSKHApKQorCQlnb3RvIG91dF9lcnI7CisJc2VydmVyLT5tbnRfcGF0aCA9IHA7CisKKwlwID0gbmZzX2NvcHlfdXNlcl9zdHJpbmcoc2VydmVyLT5pcF9hZGRyLCAmZGF0YS0+Y2xpZW50X2FkZHIsCisJCQlzaXplb2Yoc2VydmVyLT5pcF9hZGRyKSAtIDEpOworCWlmIChJU19FUlIocCkpCisJCWdvdG8gb3V0X2VycjsKKworCS8qIFdlIG5vdyByZXF1aXJlIHRoYXQgdGhlIG1vdW50IHByb2Nlc3MgcGFzc2VzIHRoZSByZW1vdGUgYWRkcmVzcyAqLworCWlmIChkYXRhLT5ob3N0X2FkZHJsZW4gIT0gc2l6ZW9mKHNlcnZlci0+YWRkcikpIHsKKwkJZXJyb3IgPSAtRUlOVkFMOworCQlnb3RvIG91dF9mcmVlOworCX0KKwlpZiAoY29weV9mcm9tX3VzZXIoJnNlcnZlci0+YWRkciwgZGF0YS0+aG9zdF9hZGRyLCBzaXplb2Yoc2VydmVyLT5hZGRyKSkpIHsKKwkJZXJyb3IgPSAtRUZBVUxUOworCQlnb3RvIG91dF9mcmVlOworCX0KKwlpZiAoc2VydmVyLT5hZGRyLnNpbl9mYW1pbHkgIT0gQUZfSU5FVCB8fAorCSAgICBzZXJ2ZXItPmFkZHIuc2luX2FkZHIuc19hZGRyID09IElOQUREUl9BTlkpIHsKKwkJZHByaW50aygiJXM6IG1vdW50IHByb2dyYW0gZGlkbid0IHBhc3MgcmVtb3RlIElQIGFkZHJlc3MhXG4iLAorCQkJCV9fRlVOQ1RJT05fXyk7CisJCWVycm9yID0gLUVJTlZBTDsKKwkJZ290byBvdXRfZnJlZTsKKwl9CisKKwkvKiBGaXJlIHVwIHJwY2lvZCBpZiBub3QgeWV0IHJ1bm5pbmcgKi8KKwllcnJvciA9IHJwY2lvZF91cCgpOworCWlmIChlcnJvciA8IDApIHsKKwkJZHByaW50aygiJXM6IGNvdWxkbid0IHN0YXJ0IHJwY2lvZCEgRXJyb3IgPSAlZFxuIiwKKwkJCQlfX0ZVTkNUSU9OX18sIGVycm9yKTsKKwkJZ290byBvdXRfZnJlZTsKKwl9CisKKwlzID0gc2dldChmc190eXBlLCBuZnM0X2NvbXBhcmVfc3VwZXIsIG5mc19zZXRfc3VwZXIsIHNlcnZlcik7CisKKwlpZiAoSVNfRVJSKHMpKSB7CisJCWVycm9yID0gUFRSX0VSUihzKTsKKwkJZ290byBvdXRfZnJlZTsKKwl9CisKKwlpZiAocy0+c19yb290KSB7CisJCWtmcmVlKHNlcnZlci0+bW50X3BhdGgpOworCQlrZnJlZShzZXJ2ZXItPmhvc3RuYW1lKTsKKwkJa2ZyZWUoc2VydmVyKTsKKwkJcmV0dXJuIHNpbXBsZV9zZXRfbW50KG1udCwgcyk7CisJfQorCisJcy0+c19mbGFncyA9IGZsYWdzOworCisJZXJyb3IgPSBuZnM0X2ZpbGxfc3VwZXIocywgZGF0YSwgZmxhZ3MgJiBNU19TSUxFTlQgPyAxIDogMCk7CisJaWYgKGVycm9yKSB7CisJCXVwX3dyaXRlKCZzLT5zX3Vtb3VudCk7CisJCWRlYWN0aXZhdGVfc3VwZXIocyk7CisJCXJldHVybiBlcnJvcjsKKwl9CisJcy0+c19mbGFncyB8PSBNU19BQ1RJVkU7CisJcmV0dXJuIHNpbXBsZV9zZXRfbW50KG1udCwgcyk7CitvdXRfZXJyOgorCWVycm9yID0gUFRSX0VSUihwKTsKK291dF9mcmVlOgorCWtmcmVlKHNlcnZlci0+bW50X3BhdGgpOworCWtmcmVlKHNlcnZlci0+aG9zdG5hbWUpOworCWtmcmVlKHNlcnZlcik7CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgdm9pZCBuZnM0X2tpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyID0gTkZTX1NCKHNiKTsKKworCW5mc19yZXR1cm5fYWxsX2RlbGVnYXRpb25zKHNiKTsKKwlraWxsX2Fub25fc3VwZXIoc2IpOworCisJbmZzNF9yZW5ld2RfcHJlcGFyZV9zaHV0ZG93bihzZXJ2ZXIpOworCisJaWYgKHNlcnZlci0+Y2xpZW50ICE9IE5VTEwgJiYgIUlTX0VSUihzZXJ2ZXItPmNsaWVudCkpCisJCXJwY19zaHV0ZG93bl9jbGllbnQoc2VydmVyLT5jbGllbnQpOworCisJZGVzdHJveV9uZnN2NF9zdGF0ZShzZXJ2ZXIpOworCisJcnBjaW9kX2Rvd24oKTsKKworCW5mc19mcmVlX2lvc3RhdHMoc2VydmVyLT5pb19zdGF0cyk7CisJa2ZyZWUoc2VydmVyLT5ob3N0bmFtZSk7CisJa2ZyZWUoc2VydmVyKTsKKwluZnNfcmVsZWFzZV9hdXRvbW91bnRfdGltZXIoKTsKK30KKworLyoKKyAqIENvbnN0cnVjdHMgdGhlIFNFUlZFUi1zaWRlIHBhdGgKKyAqLworc3RhdGljIGlubGluZSBjaGFyICpuZnM0X2R1cF9wYXRoKGNvbnN0IHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwljaGFyICpwYWdlID0gKGNoYXIgKikgX19nZXRfZnJlZV9wYWdlKEdGUF9VU0VSKTsKKwljaGFyICpwYXRoOworCisJcGF0aCA9IG5mczRfcGF0aChkZW50cnksIHBhZ2UsIFBBR0VfU0laRSk7CisJaWYgKCFJU19FUlIocGF0aCkpIHsKKwkJaW50IGxlbiA9IFBBR0VfU0laRSArIHBhZ2UgLSBwYXRoOworCQljaGFyICp0bXAgPSBwYXRoOworCisJCXBhdGggPSBrbWFsbG9jKGxlbiwgR0ZQX0tFUk5FTCk7CisJCWlmIChwYXRoKQorCQkJbWVtY3B5KHBhdGgsIHRtcCwgbGVuKTsKKwkJZWxzZQorCQkJcGF0aCA9IEVSUl9QVFIoLUVOT01FTSk7CisJfQorCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylwYWdlKTsKKwlyZXR1cm4gcGF0aDsKK30KKworc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqbmZzNF9jbG9uZV9zYihzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyLCBzdHJ1Y3QgbmZzX2Nsb25lX21vdW50ICpkYXRhKQoreworCWNvbnN0IHN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGRhdGEtPmRlbnRyeTsKKwlzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCA9IHNlcnZlci0+bmZzNF9zdGF0ZTsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOworCisJc2VydmVyLT5mc2lkID0gZGF0YS0+ZmF0dHItPmZzaWQ7CisJbmZzX2NvcHlfZmgoJnNlcnZlci0+ZmgsIGRhdGEtPmZoKTsKKwlzZXJ2ZXItPm1udF9wYXRoID0gbmZzNF9kdXBfcGF0aChkZW50cnkpOworCWlmIChJU19FUlIoc2VydmVyLT5tbnRfcGF0aCkpIHsKKwkJc2IgPSAoc3RydWN0IHN1cGVyX2Jsb2NrICopc2VydmVyLT5tbnRfcGF0aDsKKwkJZ290byBlcnI7CisJfQorCXNiID0gc2dldCgmbmZzNF9mc190eXBlLCBuZnM0X2NvbXBhcmVfc3VwZXIsIG5mc19zZXRfc3VwZXIsIHNlcnZlcik7CisJaWYgKElTX0VSUihzYikgfHwgc2ItPnNfcm9vdCkKKwkJZ290byBmcmVlX3BhdGg7CisJbmZzNF9zZXJ2ZXJfY2FwYWJpbGl0aWVzKHNlcnZlciwgJnNlcnZlci0+ZmgpOworCisJZG93bl93cml0ZSgmY2xwLT5jbF9zZW0pOworCWF0b21pY19pbmMoJmNscC0+Y2xfY291bnQpOworCWxpc3RfYWRkX3RhaWwoJnNlcnZlci0+bmZzNF9zaWJsaW5ncywgJmNscC0+Y2xfc3VwZXJibG9ja3MpOworCXVwX3dyaXRlKCZjbHAtPmNsX3NlbSk7CisJcmV0dXJuIHNiOworZnJlZV9wYXRoOgorCWtmcmVlKHNlcnZlci0+bW50X3BhdGgpOworZXJyOgorCXNlcnZlci0+bW50X3BhdGggPSBOVUxMOworCXJldHVybiBzYjsKK30KKworc3RhdGljIGludCBuZnNfY2xvbmVfbmZzNF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKKwkJaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqcmF3X2RhdGEsIHN0cnVjdCB2ZnNtb3VudCAqbW50KQoreworCXN0cnVjdCBuZnNfY2xvbmVfbW91bnQgKmRhdGEgPSByYXdfZGF0YTsKKwlyZXR1cm4gbmZzX2Nsb25lX2dlbmVyaWNfc2IoZGF0YSwgbmZzNF9jbG9uZV9zYiwgbmZzX2Nsb25lX3NlcnZlciwgbW50KTsKK30KKworc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqbmZzNF9yZWZlcnJhbF9zYihzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyLCBzdHJ1Y3QgbmZzX2Nsb25lX21vdW50ICpkYXRhKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBFUlJfUFRSKC1FTk9NRU0pOworCWludCBsZW47CisKKwlsZW4gPSBzdHJsZW4oZGF0YS0+bW50X3BhdGgpICsgMTsKKwlzZXJ2ZXItPm1udF9wYXRoID0ga21hbGxvYyhsZW4sIEdGUF9LRVJORUwpOworCWlmIChzZXJ2ZXItPm1udF9wYXRoID09IE5VTEwpCisJCWdvdG8gZXJyOworCW1lbWNweShzZXJ2ZXItPm1udF9wYXRoLCBkYXRhLT5tbnRfcGF0aCwgbGVuKTsKKwltZW1jcHkoJnNlcnZlci0+YWRkciwgZGF0YS0+YWRkciwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikpOworCisJc2IgPSBzZ2V0KCZuZnM0X2ZzX3R5cGUsIG5mczRfY29tcGFyZV9zdXBlciwgbmZzX3NldF9zdXBlciwgc2VydmVyKTsKKwlpZiAoSVNfRVJSKHNiKSB8fCBzYi0+c19yb290KQorCQlnb3RvIGZyZWVfcGF0aDsKKwlyZXR1cm4gc2I7CitmcmVlX3BhdGg6CisJa2ZyZWUoc2VydmVyLT5tbnRfcGF0aCk7CitlcnI6CisJc2VydmVyLT5tbnRfcGF0aCA9IE5VTEw7CisJcmV0dXJuIHNiOworfQorCitzdGF0aWMgc3RydWN0IG5mc19zZXJ2ZXIgKm5mczRfcmVmZXJyYWxfc2VydmVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBuZnNfY2xvbmVfbW91bnQgKmRhdGEpCit7CisJc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciA9IE5GU19TQihzYik7CisJc3RydWN0IHJwY190aW1lb3V0IHRpbWVwYXJtczsKKwlpbnQgcHJvdG8sIHRpbWVvLCByZXRyYW5zOworCXZvaWQgKmVycjsKKworCXByb3RvID0gSVBQUk9UT19UQ1A7CisJLyogU2luY2Ugd2UgYXJlIGZvbGxvd2luZyBhIHJlZmVycmFsIGFuZCB0aGVyZSBtYXkgYmUgYWx0ZXJuYXRpdmVzLAorCSAgIHNldCB0aGUgdGltZW91dHMgYW5kIHJldHJpZXMgdG8gbG93IHZhbHVlcyAqLworCXRpbWVvID0gMjsKKwlyZXRyYW5zID0gMTsKKwluZnNfaW5pdF90aW1lb3V0X3ZhbHVlcygmdGltZXBhcm1zLCBwcm90bywgdGltZW8sIHJldHJhbnMpOworCisJc2VydmVyLT5jbGllbnQgPSBuZnM0X2NyZWF0ZV9jbGllbnQoc2VydmVyLCAmdGltZXBhcm1zLCBwcm90bywgZGF0YS0+YXV0aGZsYXZvcik7CisJaWYgKElTX0VSUigoZXJyID0gc2VydmVyLT5jbGllbnQpKSkKKwkJZ290byBvdXRfZXJyOworCisJc2ItPnNfdGltZV9ncmFuID0gMTsKKwlzYi0+c19vcCA9ICZuZnM0X3NvcHM7CisJZXJyID0gRVJSX1BUUihuZnNfc2JfaW5pdChzYiwgZGF0YS0+YXV0aGZsYXZvcikpOworCWlmICghSVNfRVJSKGVycikpCisJCXJldHVybiBzZXJ2ZXI7CitvdXRfZXJyOgorCXJldHVybiAoc3RydWN0IG5mc19zZXJ2ZXIgKillcnI7Cit9CisKK3N0YXRpYyBpbnQgbmZzX3JlZmVycmFsX25mczRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKnJhd19kYXRhLCBzdHJ1Y3QgdmZzbW91bnQgKm1udCkKK3sKKwlzdHJ1Y3QgbmZzX2Nsb25lX21vdW50ICpkYXRhID0gcmF3X2RhdGE7CisJcmV0dXJuIG5mc19jbG9uZV9nZW5lcmljX3NiKGRhdGEsIG5mczRfcmVmZXJyYWxfc2IsIG5mczRfcmVmZXJyYWxfc2VydmVyLCBtbnQpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL25mcy9zeW1saW5rLmMgYi9mcy9uZnMvc3ltbGluay5jCmluZGV4IDE4ZGM5NWIuLjYwMGJiZTYgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9zeW1saW5rLmMKKysrIGIvZnMvbmZzL3N5bWxpbmsuYwpAQCAtNTIsNyArNTIsNyBAQAogewogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7Ci0Jdm9pZCAqZXJyID0gRVJSX1BUUihuZnNfcmV2YWxpZGF0ZV9pbm9kZShORlNfU0VSVkVSKGlub2RlKSwgaW5vZGUpKTsKKwl2b2lkICplcnIgPSBFUlJfUFRSKG5mc19yZXZhbGlkYXRlX21hcHBpbmcoaW5vZGUsIGlub2RlLT5pX21hcHBpbmcpKTsKIAlpZiAoZXJyKQogCQlnb3RvIHJlYWRfZmFpbGVkOwogCXBhZ2UgPSByZWFkX2NhY2hlX3BhZ2UoJmlub2RlLT5pX2RhdGEsIDAsCkBAIC03NSwyMiArNzUsMTMgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIHZvaWQgbmZzX3B1dF9saW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQsIHZvaWQgKmNvb2tpZSkKLXsKLQlpZiAoY29va2llKSB7Ci0JCXN0cnVjdCBwYWdlICpwYWdlID0gY29va2llOwotCQlrdW5tYXAocGFnZSk7Ci0JCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKLQl9Ci19Ci0KIC8qCiAgKiBzeW1saW5rcyBjYW4ndCBkbyBtdWNoLi4uCiAgKi8KIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIG5mc19zeW1saW5rX2lub2RlX29wZXJhdGlvbnMgPSB7CiAJLnJlYWRsaW5rCT0gZ2VuZXJpY19yZWFkbGluaywKIAkuZm9sbG93X2xpbmsJPSBuZnNfZm9sbG93X2xpbmssCi0JLnB1dF9saW5rCT0gbmZzX3B1dF9saW5rLAorCS5wdXRfbGluawk9IHBhZ2VfcHV0X2xpbmssCiAJLmdldGF0dHIJPSBuZnNfZ2V0YXR0ciwKIAkuc2V0YXR0cgk9IG5mc19zZXRhdHRyLAogfTsKZGlmZiAtLWdpdCBhL2ZzL25mcy9zeXNjdGwuYyBiL2ZzL25mcy9zeXNjdGwuYwppbmRleCA0YzQ4NmViLi5kYjYxZTUxIDEwMDY0NAotLS0gYS9mcy9uZnMvc3lzY3RsLmMKKysrIGIvZnMvbmZzL3N5c2N0bC5jCkBAIC0xMiw2ICsxMiw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbmZzNC5oPgogI2luY2x1ZGUgPGxpbnV4L25mc19pZG1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L25mc19mcy5oPgogCiAjaW5jbHVkZSAiY2FsbGJhY2suaCIKIApAQCAtNDYsNiArNDcsMTUgQEAKIAkJLnN0cmF0ZWd5ID0gJnN5c2N0bF9qaWZmaWVzLAogCX0sCiAjZW5kaWYKKwl7CisJCS5jdGxfbmFtZQk9IENUTF9VTk5VTUJFUkVELAorCQkucHJvY25hbWUJPSAibmZzX21vdW50cG9pbnRfdGltZW91dCIsCisJCS5kYXRhCQk9ICZuZnNfbW91bnRwb2ludF9leHBpcnlfdGltZW91dCwKKwkJLm1heGxlbgkJPSBzaXplb2YobmZzX21vdW50cG9pbnRfZXhwaXJ5X3RpbWVvdXQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKKwkJLnN0cmF0ZWd5CT0gJnN5c2N0bF9qaWZmaWVzLAorCX0sCiAJeyAuY3RsX25hbWUgPSAwIH0KIH07CiAKZGlmZiAtLWdpdCBhL2ZzL25mcy93cml0ZS5jIGIvZnMvbmZzL3dyaXRlLmMKaW5kZXggNGNmYWRhMi4uYjM4M2ZkZCAxMDA2NDQKLS0tIGEvZnMvbmZzL3dyaXRlLmMKKysrIGIvZnMvbmZzL3dyaXRlLmMKQEAgLTk4LDExICs5OCwxMCBAQAogCWlmIChwKSB7CiAJCW1lbXNldChwLCAwLCBzaXplb2YoKnApKTsKIAkJSU5JVF9MSVNUX0hFQUQoJnAtPnBhZ2VzKTsKLQkJaWYgKHBhZ2Vjb3VudCA8IE5GU19QQUdFVkVDX1NJWkUpCi0JCQlwLT5wYWdldmVjID0gJnAtPnBhZ2VfYXJyYXlbMF07CisJCWlmIChwYWdlY291bnQgPD0gQVJSQVlfU0laRShwLT5wYWdlX2FycmF5KSkKKwkJCXAtPnBhZ2V2ZWMgPSBwLT5wYWdlX2FycmF5OwogCQllbHNlIHsKLQkJCXNpemVfdCBzaXplID0gKytwYWdlY291bnQgKiBzaXplb2Yoc3RydWN0IHBhZ2UgKik7Ci0JCQlwLT5wYWdldmVjID0ga3phbGxvYyhzaXplLCBHRlBfTk9GUyk7CisJCQlwLT5wYWdldmVjID0ga2NhbGxvYyhwYWdlY291bnQsIHNpemVvZihzdHJ1Y3QgcGFnZSAqKSwgR0ZQX05PRlMpOwogCQkJaWYgKCFwLT5wYWdldmVjKSB7CiAJCQkJbWVtcG9vbF9mcmVlKHAsIG5mc19jb21taXRfbWVtcG9vbCk7CiAJCQkJcCA9IE5VTEw7CkBAIC0xMjYsMTQgKzEyNSwxMSBAQAogCWlmIChwKSB7CiAJCW1lbXNldChwLCAwLCBzaXplb2YoKnApKTsKIAkJSU5JVF9MSVNUX0hFQUQoJnAtPnBhZ2VzKTsKLQkJaWYgKHBhZ2Vjb3VudCA8IE5GU19QQUdFVkVDX1NJWkUpCi0JCQlwLT5wYWdldmVjID0gJnAtPnBhZ2VfYXJyYXlbMF07CisJCWlmIChwYWdlY291bnQgPD0gQVJSQVlfU0laRShwLT5wYWdlX2FycmF5KSkKKwkJCXAtPnBhZ2V2ZWMgPSBwLT5wYWdlX2FycmF5OwogCQllbHNlIHsKLQkJCXNpemVfdCBzaXplID0gKytwYWdlY291bnQgKiBzaXplb2Yoc3RydWN0IHBhZ2UgKik7Ci0JCQlwLT5wYWdldmVjID0ga21hbGxvYyhzaXplLCBHRlBfTk9GUyk7Ci0JCQlpZiAocC0+cGFnZXZlYykgewotCQkJCW1lbXNldChwLT5wYWdldmVjLCAwLCBzaXplKTsKLQkJCX0gZWxzZSB7CisJCQlwLT5wYWdldmVjID0ga2NhbGxvYyhwYWdlY291bnQsIHNpemVvZihzdHJ1Y3QgcGFnZSAqKSwgR0ZQX05PRlMpOworCQkJaWYgKCFwLT5wYWdldmVjKSB7CiAJCQkJbWVtcG9vbF9mcmVlKHAsIG5mc193ZGF0YV9tZW1wb29sKTsKIAkJCQlwID0gTlVMTDsKIAkJCX0KQEAgLTU4Myw2ICs1NzksMTcgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgdm9pZCBuZnNfY2FuY2VsX3JlcXVlc3RzKHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCit7CisJc3RydWN0IG5mc19wYWdlICpyZXE7CisJd2hpbGUoIWxpc3RfZW1wdHkoaGVhZCkpIHsKKwkJcmVxID0gbmZzX2xpc3RfZW50cnkoaGVhZC0+bmV4dCk7CisJCW5mc19saXN0X3JlbW92ZV9yZXF1ZXN0KHJlcSk7CisJCW5mc19pbm9kZV9yZW1vdmVfcmVxdWVzdChyZXEpOworCQluZnNfY2xlYXJfcGFnZV93cml0ZWJhY2socmVxKTsKKwl9Cit9CisKIC8qCiAgKiBuZnNfc2Nhbl9kaXJ0eSAtIFNjYW4gYW4gaW5vZGUgZm9yIGRpcnR5IHJlcXVlc3RzCiAgKiBAaW5vZGU6IE5GUyBpbm9kZSB0byBzY2FuCkBAIC02MjcsNyArNjM0LDcgQEAKIAlpbnQgcmVzID0gMDsKIAogCWlmIChuZnNpLT5uY29tbWl0ICE9IDApIHsKLQkJcmVzID0gbmZzX3NjYW5fbGlzdCgmbmZzaS0+Y29tbWl0LCBkc3QsIGlkeF9zdGFydCwgbnBhZ2VzKTsKKwkJcmVzID0gbmZzX3NjYW5fbGlzdChuZnNpLCAmbmZzaS0+Y29tbWl0LCBkc3QsIGlkeF9zdGFydCwgbnBhZ2VzKTsKIAkJbmZzaS0+bmNvbW1pdCAtPSByZXM7CiAJCWlmICgobmZzaS0+bmNvbW1pdCA9PSAwKSAhPSBsaXN0X2VtcHR5KCZuZnNpLT5jb21taXQpKQogCQkJcHJpbnRrKEtFUk5fRVJSICJORlM6IGRlc3luY2hyb25pemVkIHZhbHVlIG9mIG5mc19pLm5jb21taXQuXG4iKTsKQEAgLTE0OTUsMTUgKzE1MDIsMjUgQEAKIAkJcGFnZXMgPSBuZnNfc2Nhbl9kaXJ0eShpbm9kZSwgJmhlYWQsIGlkeF9zdGFydCwgbnBhZ2VzKTsKIAkJaWYgKHBhZ2VzICE9IDApIHsKIAkJCXNwaW5fdW5sb2NrKCZuZnNpLT5yZXFfbG9jayk7Ci0JCQlyZXQgPSBuZnNfZmx1c2hfbGlzdChpbm9kZSwgJmhlYWQsIHBhZ2VzLCBob3cpOworCQkJaWYgKGhvdyAmIEZMVVNIX0lOVkFMSURBVEUpCisJCQkJbmZzX2NhbmNlbF9yZXF1ZXN0cygmaGVhZCk7CisJCQllbHNlCisJCQkJcmV0ID0gbmZzX2ZsdXNoX2xpc3QoaW5vZGUsICZoZWFkLCBwYWdlcywgaG93KTsKIAkJCXNwaW5fbG9jaygmbmZzaS0+cmVxX2xvY2spOwogCQkJY29udGludWU7CiAJCX0KIAkJaWYgKG5vY29tbWl0KQogCQkJYnJlYWs7Ci0JCXBhZ2VzID0gbmZzX3NjYW5fY29tbWl0KGlub2RlLCAmaGVhZCwgMCwgMCk7CisJCXBhZ2VzID0gbmZzX3NjYW5fY29tbWl0KGlub2RlLCAmaGVhZCwgaWR4X3N0YXJ0LCBucGFnZXMpOwogCQlpZiAocGFnZXMgPT0gMCkKIAkJCWJyZWFrOworCQlpZiAoaG93ICYgRkxVU0hfSU5WQUxJREFURSkgeworCQkJc3Bpbl91bmxvY2soJm5mc2ktPnJlcV9sb2NrKTsKKwkJCW5mc19jYW5jZWxfcmVxdWVzdHMoJmhlYWQpOworCQkJc3Bpbl9sb2NrKCZuZnNpLT5yZXFfbG9jayk7CisJCQljb250aW51ZTsKKwkJfQorCQlwYWdlcyArPSBuZnNfc2Nhbl9jb21taXQoaW5vZGUsICZoZWFkLCAwLCAwKTsKIAkJc3Bpbl91bmxvY2soJm5mc2ktPnJlcV9sb2NrKTsKIAkJcmV0ID0gbmZzX2NvbW1pdF9saXN0KGlub2RlLCAmaGVhZCwgaG93KTsKIAkJc3Bpbl9sb2NrKCZuZnNpLT5yZXFfbG9jayk7CkBAIC0xNTEyLDcgKzE1MjksNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCBuZnNfaW5pdF93cml0ZXBhZ2VjYWNoZSh2b2lkKQoraW50IF9faW5pdCBuZnNfaW5pdF93cml0ZXBhZ2VjYWNoZSh2b2lkKQogewogCW5mc193ZGF0YV9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgibmZzX3dyaXRlX2RhdGEiLAogCQkJCQkgICAgIHNpemVvZihzdHJ1Y3QgbmZzX3dyaXRlX2RhdGEpLApAQCAtMTUzNCw3ICsxNTUxLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBuZnNfZGVzdHJveV93cml0ZXBhZ2VjYWNoZSh2b2lkKQordm9pZCBfX2V4aXQgbmZzX2Rlc3Ryb3lfd3JpdGVwYWdlY2FjaGUodm9pZCkKIHsKIAltZW1wb29sX2Rlc3Ryb3kobmZzX2NvbW1pdF9tZW1wb29sKTsKIAltZW1wb29sX2Rlc3Ryb3kobmZzX3dkYXRhX21lbXBvb2wpOwpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnM0c3RhdGUuYyBiL2ZzL25mc2QvbmZzNHN0YXRlLmMKaW5kZXggOTZjNzU3OC4uMTYzMGI1NiAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnM0c3RhdGUuYworKysgYi9mcy9uZnNkL25mczRzdGF0ZS5jCkBAIC01MjksOCArNTI5LDcgQEAKIAogCWRwcmludGsoIk5GU0Q6IG1vdmVfdG9fY29uZmlybSBuZnM0X2NsaWVudCAlcFxuIiwgY2xwKTsKIAlsaXN0X2RlbF9pbml0KCZjbHAtPmNsX3N0cmhhc2gpOwotCWxpc3RfZGVsX2luaXQoJmNscC0+Y2xfaWRoYXNoKTsKLQlsaXN0X2FkZCgmY2xwLT5jbF9pZGhhc2gsICZjb25mX2lkX2hhc2h0YmxbaWRoYXNodmFsXSk7CisJbGlzdF9tb3ZlKCZjbHAtPmNsX2lkaGFzaCwgJmNvbmZfaWRfaGFzaHRibFtpZGhhc2h2YWxdKTsKIAlzdHJoYXNodmFsID0gY2xpZW50c3RyX2hhc2h2YWwoY2xwLT5jbF9yZWNkaXIpOwogCWxpc3RfYWRkKCZjbHAtPmNsX3N0cmhhc2gsICZjb25mX3N0cl9oYXNodGJsW3N0cmhhc2h2YWxdKTsKIAlyZW5ld19jbGllbnQoY2xwKTsKZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzY2FjaGUuYyBiL2ZzL25mc2QvbmZzY2FjaGUuYwppbmRleCBkODUyZWJiLi5mZGY3Y2YzIDEwMDY0NAotLS0gYS9mcy9uZnNkL25mc2NhY2hlLmMKKysrIGIvZnMvbmZzZC9uZnNjYWNoZS5jCkBAIC0xMDMsOCArMTAzLDcgQEAKIHN0YXRpYyB2b2lkCiBscnVfcHV0X2VuZChzdHJ1Y3Qgc3ZjX2NhY2hlcmVwICpycCkKIHsKLQlsaXN0X2RlbCgmcnAtPmNfbHJ1KTsKLQlsaXN0X2FkZF90YWlsKCZycC0+Y19scnUsICZscnVfaGVhZCk7CisJbGlzdF9tb3ZlX3RhaWwoJnJwLT5jX2xydSwgJmxydV9oZWFkKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2ZzL250ZnMvZmlsZS5jIGIvZnMvbnRmcy9maWxlLmMKaW5kZXggODgyOTJmOS4uMmU0MmMyZCAxMDA2NDQKLS0tIGEvZnMvbnRmcy9maWxlLmMKKysrIGIvZnMvbnRmcy9maWxlLmMKQEAgLTEzNTgsNyArMTM1OCw3IEBACiAJZ290byBvdXQ7CiB9CiAKLXN0YXRpYyBzaXplX3QgX19udGZzX2NvcHlfZnJvbV91c2VyX2lvdmVjKGNoYXIgKnZhZGRyLAorc3RhdGljIHNpemVfdCBfX250ZnNfY29weV9mcm9tX3VzZXJfaW92ZWNfaW5hdG9taWMoY2hhciAqdmFkZHIsCiAJCWNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LCBzaXplX3QgaW92X29mcywgc2l6ZV90IGJ5dGVzKQogewogCXNpemVfdCB0b3RhbCA9IDA7CkBAIC0xMzc2LDEwICsxMzc2LDYgQEAKIAkJYnl0ZXMgLT0gbGVuOwogCQl2YWRkciArPSBsZW47CiAJCWlmICh1bmxpa2VseShsZWZ0KSkgewotCQkJLyoKLQkJCSAqIFplcm8gdGhlIHJlc3Qgb2YgdGhlIHRhcmdldCBsaWtlIF9fY29weV9mcm9tX3VzZXIoKS4KLQkJCSAqLwotCQkJbWVtc2V0KHZhZGRyLCAwLCBieXRlcyk7CiAJCQl0b3RhbCAtPSBsZWZ0OwogCQkJYnJlYWs7CiAJCX0KQEAgLTE0MjAsMTEgKzE0MTYsMTMgQEAKICAqIHBhZ2VzIChvdXQgdG8gb2Zmc2V0ICsgYnl0ZXMpLCB0byBlbXVsYXRlIG50ZnNfY29weV9mcm9tX3VzZXIoKSdzCiAgKiBzaW5nbGUtc2VnbWVudCBiZWhhdmlvdXIuCiAgKgotICogV2UgY2FsbCB0aGUgc2FtZSBoZWxwZXIgKF9fbnRmc19jb3B5X2Zyb21fdXNlcl9pb3ZlYygpKSBib3RoIHdoZW4gYXRvbWljIGFuZAotICogd2hlbiBub3QgYXRvbWljLiAgVGhpcyBpcyBvayBiZWNhdXNlIF9fbnRmc19jb3B5X2Zyb21fdXNlcl9pb3ZlYygpIGNhbGxzCi0gKiBfX2NvcHlfZnJvbV91c2VyX2luYXRvbWljKCkgYW5kIGl0IGlzIG9rIHRvIGNhbGwgdGhpcyB3aGVuIG5vbi1hdG9taWMuICBJbgotICogZmFjdCwgdGhlIG9ubHkgZGlmZmVyZW5jZSBiZXR3ZWVuIF9fY29weV9mcm9tX3VzZXJfaW5hdG9taWMoKSBhbmQKLSAqIF9fY29weV9mcm9tX3VzZXIoKSBpcyB0aGF0IHRoZSBsYXR0ZXIgY2FsbHMgbWlnaHRfc2xlZXAoKS4gIEFuZCBvbiBtYW55CisgKiBXZSBjYWxsIHRoZSBzYW1lIGhlbHBlciAoX19udGZzX2NvcHlfZnJvbV91c2VyX2lvdmVjX2luYXRvbWljKCkpIGJvdGgKKyAqIHdoZW4gYXRvbWljIGFuZCB3aGVuIG5vdCBhdG9taWMuICBUaGlzIGlzIG9rIGJlY2F1c2UKKyAqIF9fbnRmc19jb3B5X2Zyb21fdXNlcl9pb3ZlY19pbmF0b21pYygpIGNhbGxzIF9fY29weV9mcm9tX3VzZXJfaW5hdG9taWMoKQorICogYW5kIGl0IGlzIG9rIHRvIGNhbGwgdGhpcyB3aGVuIG5vbi1hdG9taWMuCisgKiBJbmZhY3QsIHRoZSBvbmx5IGRpZmZlcmVuY2UgYmV0d2VlbiBfX2NvcHlfZnJvbV91c2VyX2luYXRvbWljKCkgYW5kCisgKiBfX2NvcHlfZnJvbV91c2VyKCkgaXMgdGhhdCB0aGUgbGF0dGVyIGNhbGxzIG1pZ2h0X3NsZWVwKCkgYW5kIHRoZSBmb3JtZXIKKyAqIHNob3VsZCBub3QgemVybyB0aGUgdGFpbCBvZiB0aGUgYnVmZmVyIG9uIGVycm9yLiAgQW5kIG9uIG1hbnkKICAqIGFyY2hpdGVjdHVyZXMgX19jb3B5X2Zyb21fdXNlcl9pbmF0b21pYygpIGlzIGp1c3QgZGVmaW5lZCB0bwogICogX19jb3B5X2Zyb21fdXNlcigpIHNvIGl0IG1ha2VzIG5vIGRpZmZlcmVuY2UgYXQgYWxsIG9uIHRob3NlIGFyY2hpdGVjdHVyZXMuCiAgKi8KQEAgLTE0NDEsMTQgKzE0MzksMTggQEAKIAkJaWYgKGxlbiA+IGJ5dGVzKQogCQkJbGVuID0gYnl0ZXM7CiAJCWthZGRyID0ga21hcF9hdG9taWMoKnBhZ2VzLCBLTV9VU0VSMCk7Ci0JCWNvcGllZCA9IF9fbnRmc19jb3B5X2Zyb21fdXNlcl9pb3ZlYyhrYWRkciArIG9mcywKKwkJY29waWVkID0gX19udGZzX2NvcHlfZnJvbV91c2VyX2lvdmVjX2luYXRvbWljKGthZGRyICsgb2ZzLAogCQkJCSppb3YsICppb3Zfb2ZzLCBsZW4pOwogCQlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7CiAJCWlmICh1bmxpa2VseShjb3BpZWQgIT0gbGVuKSkgewogCQkJLyogRG8gaXQgdGhlIHNsb3cgd2F5LiAqLwogCQkJa2FkZHIgPSBrbWFwKCpwYWdlcyk7Ci0JCQljb3BpZWQgPSBfX250ZnNfY29weV9mcm9tX3VzZXJfaW92ZWMoa2FkZHIgKyBvZnMsCisJCQljb3BpZWQgPSBfX250ZnNfY29weV9mcm9tX3VzZXJfaW92ZWNfaW5hdG9taWMoa2FkZHIgKyBvZnMsCiAJCQkJCSppb3YsICppb3Zfb2ZzLCBsZW4pOworCQkJLyoKKwkJCSAqIFplcm8gdGhlIHJlc3Qgb2YgdGhlIHRhcmdldCBsaWtlIF9fY29weV9mcm9tX3VzZXIoKS4KKwkJCSAqLworCQkJbWVtc2V0KGthZGRyICsgb2ZzICsgY29waWVkLCAwLCBsZW4gLSBjb3BpZWQpOwogCQkJa3VubWFwKCpwYWdlcyk7CiAJCQlpZiAodW5saWtlbHkoY29waWVkICE9IGxlbikpCiAJCQkJZ290byBlcnJfb3V0OwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvZGxtL2RsbWFzdC5jIGIvZnMvb2NmczIvZGxtL2RsbWFzdC5jCmluZGV4IDM1NTU5M2QuLjg3ZWUyOWMgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2RsbS9kbG1hc3QuYworKysgYi9mcy9vY2ZzMi9kbG0vZGxtYXN0LmMKQEAgLTM4MSw4ICszODEsNyBAQAogCXJldCA9IERMTV9OT1JNQUw7CiAJaWYgKHBhc3QtPnR5cGUgPT0gRExNX0FTVCkgewogCQkvKiBkbyBub3QgYWx0ZXIgbG9jayByZWZjb3VudC4gIHN3aXRjaGluZyBsaXN0cy4gKi8KLQkJbGlzdF9kZWxfaW5pdCgmbG9jay0+bGlzdCk7Ci0JCWxpc3RfYWRkX3RhaWwoJmxvY2stPmxpc3QsICZyZXMtPmdyYW50ZWQpOworCQlsaXN0X21vdmVfdGFpbCgmbG9jay0+bGlzdCwgJnJlcy0+Z3JhbnRlZCk7CiAJCW1sb2coMCwgImFzdDogYWRkaW5nIHRvIGdyYW50ZWQgbGlzdC4uLiB0eXBlPSVkLCAiCiAJCQkgICJjb252ZXJ0X3R5cGU9JWRcbiIsIGxvY2stPm1sLnR5cGUsIGxvY2stPm1sLmNvbnZlcnRfdHlwZSk7CiAJCWlmIChsb2NrLT5tbC5jb252ZXJ0X3R5cGUgIT0gTEtNX0lWTU9ERSkgewpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvZGxtL2RsbWNvbnZlcnQuYyBiL2ZzL29jZnMyL2RsbS9kbG1jb252ZXJ0LmMKaW5kZXggODI4NTIyOC4uNzA4ODhiMyAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZGxtL2RsbWNvbnZlcnQuYworKysgYi9mcy9vY2ZzMi9kbG0vZGxtY29udmVydC5jCkBAIC0yMzEsOCArMjMxLDcgQEAKIAogCWxvY2stPm1sLmNvbnZlcnRfdHlwZSA9IHR5cGU7CiAJLyogZG8gbm90IGFsdGVyIGxvY2sgcmVmY291bnQuICBzd2l0Y2hpbmcgbGlzdHMuICovCi0JbGlzdF9kZWxfaW5pdCgmbG9jay0+bGlzdCk7Ci0JbGlzdF9hZGRfdGFpbCgmbG9jay0+bGlzdCwgJnJlcy0+Y29udmVydGluZyk7CisJbGlzdF9tb3ZlX3RhaWwoJmxvY2stPmxpc3QsICZyZXMtPmNvbnZlcnRpbmcpOwogCiB1bmxvY2tfZXhpdDoKIAlzcGluX3VubG9jaygmbG9jay0+c3BpbmxvY2spOwpAQCAtMjQ4LDggKzI0Nyw3IEBACiAJCQkJc3RydWN0IGRsbV9sb2NrICpsb2NrKQogewogCS8qIGRvIG5vdCBhbHRlciBsb2NrIHJlZmNvdW50LiAgc3dpdGNoaW5nIGxpc3RzLiAqLwotCWxpc3RfZGVsX2luaXQoJmxvY2stPmxpc3QpOwotCWxpc3RfYWRkX3RhaWwoJmxvY2stPmxpc3QsICZyZXMtPmdyYW50ZWQpOworCWxpc3RfbW92ZV90YWlsKCZsb2NrLT5saXN0LCAmcmVzLT5ncmFudGVkKTsKIAlsb2NrLT5tbC5jb252ZXJ0X3R5cGUgPSBMS01fSVZNT0RFOwogCWxvY2stPmxrc2ItPmZsYWdzICY9IH4oRExNX0xLU0JfR0VUX0xWQnxETE1fTEtTQl9QVVRfTFZCKTsKIH0KQEAgLTI5NCw4ICsyOTIsNyBAQAogCXJlcy0+c3RhdGUgfD0gRExNX0xPQ0tfUkVTX0lOX1BST0dSRVNTOwogCS8qIG1vdmUgbG9jayB0byBsb2NhbCBjb252ZXJ0IHF1ZXVlICovCiAJLyogZG8gbm90IGFsdGVyIGxvY2sgcmVmY291bnQuICBzd2l0Y2hpbmcgbGlzdHMuICovCi0JbGlzdF9kZWxfaW5pdCgmbG9jay0+bGlzdCk7Ci0JbGlzdF9hZGRfdGFpbCgmbG9jay0+bGlzdCwgJnJlcy0+Y29udmVydGluZyk7CisJbGlzdF9tb3ZlX3RhaWwoJmxvY2stPmxpc3QsICZyZXMtPmNvbnZlcnRpbmcpOwogCWxvY2stPmNvbnZlcnRfcGVuZGluZyA9IDE7CiAJbG9jay0+bWwuY29udmVydF90eXBlID0gdHlwZTsKIApkaWZmIC0tZ2l0IGEvZnMvb2NmczIvZGxtL2RsbWxvY2suYyBiL2ZzL29jZnMyL2RsbS9kbG1sb2NrLmMKaW5kZXggNmZlYTI4My4uNTVjZGEyNSAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZGxtL2RsbWxvY2suYworKysgYi9mcy9vY2ZzMi9kbG0vZGxtbG9jay5jCkBAIC0yMzksOCArMjM5LDcgQEAKIAkJbWxvZygwLCAiJXM6ICRSRUNPVkVSWSBsb2NrIGZvciB0aGlzIG5vZGUgKCV1KSBpcyAiCiAJCSAgICAgIm1hc3RlcmVkIGJ5ICV1OyBnb3QgbG9jaywgbWFudWFsbHkgZ3JhbnRpbmcgKG5vIGFzdClcbiIsCiAJCSAgICAgZGxtLT5uYW1lLCBkbG0tPm5vZGVfbnVtLCByZXMtPm93bmVyKTsKLQkJbGlzdF9kZWxfaW5pdCgmbG9jay0+bGlzdCk7Ci0JCWxpc3RfYWRkX3RhaWwoJmxvY2stPmxpc3QsICZyZXMtPmdyYW50ZWQpOworCQlsaXN0X21vdmVfdGFpbCgmbG9jay0+bGlzdCwgJnJlcy0+Z3JhbnRlZCk7CiAJfQogCXNwaW5fdW5sb2NrKCZyZXMtPnNwaW5sb2NrKTsKIApkaWZmIC0tZ2l0IGEvZnMvb2NmczIvZGxtL2RsbXJlY292ZXJ5LmMgYi9mcy9vY2ZzMi9kbG0vZGxtcmVjb3ZlcnkuYwppbmRleCA4MDVjYmFiLi45OTYyMTkwIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9kbG0vZGxtcmVjb3ZlcnkuYworKysgYi9mcy9vY2ZzMi9kbG0vZGxtcmVjb3ZlcnkuYwpAQCAtOTA1LDEzICs5MDUsMTEgQEAKIAkJCW1sb2coMCwgImZvdW5kIGxvY2tyZXMgb3duZWQgYnkgZGVhZCBub2RlIHdoaWxlICIKIAkJCQkgICJkb2luZyByZWNvdmVyeSBmb3Igbm9kZSAldS4gc2VuZGluZyBpdC5cbiIsCiAJCQkJICBkZWFkX25vZGUpOwotCQkJbGlzdF9kZWxfaW5pdCgmcmVzLT5yZWNvdmVyaW5nKTsKLQkJCWxpc3RfYWRkX3RhaWwoJnJlcy0+cmVjb3ZlcmluZywgbGlzdCk7CisJCQlsaXN0X21vdmVfdGFpbCgmcmVzLT5yZWNvdmVyaW5nLCBsaXN0KTsKIAkJfSBlbHNlIGlmIChyZXMtPm93bmVyID09IERMTV9MT0NLX1JFU19PV05FUl9VTktOT1dOKSB7CiAJCQltbG9nKDAsICJmb3VuZCBVTktOT1dOIG93bmVyIHdoaWxlIGRvaW5nIHJlY292ZXJ5ICIKIAkJCQkgICJmb3Igbm9kZSAldS4gc2VuZGluZyBpdC5cbiIsIGRlYWRfbm9kZSk7Ci0JCQlsaXN0X2RlbF9pbml0KCZyZXMtPnJlY292ZXJpbmcpOwotCQkJbGlzdF9hZGRfdGFpbCgmcmVzLT5yZWNvdmVyaW5nLCBsaXN0KTsKKwkJCWxpc3RfbW92ZV90YWlsKCZyZXMtPnJlY292ZXJpbmcsIGxpc3QpOwogCQl9CiAJfQogCXNwaW5fdW5sb2NrKCZkbG0tPnNwaW5sb2NrKTsKQEAgLTE1MjksOCArMTUyNyw3IEBACiAKIAkJCS8qIG1vdmUgdGhlIGxvY2sgdG8gaXRzIHByb3BlciBwbGFjZSAqLwogCQkJLyogZG8gbm90IGFsdGVyIGxvY2sgcmVmY291bnQuICBzd2l0Y2hpbmcgbGlzdHMuICovCi0JCQlsaXN0X2RlbF9pbml0KCZsb2NrLT5saXN0KTsKLQkJCWxpc3RfYWRkX3RhaWwoJmxvY2stPmxpc3QsIHF1ZXVlKTsKKwkJCWxpc3RfbW92ZV90YWlsKCZsb2NrLT5saXN0LCBxdWV1ZSk7CiAJCQlzcGluX3VubG9jaygmcmVzLT5zcGlubG9jayk7CiAKIAkJCW1sb2coMCwgImp1c3QgcmVvcmRlcmVkIGEgbG9jYWwgbG9jayFcbiIpOwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvZGxtL2RsbXRocmVhZC5jIGIvZnMvb2NmczIvZGxtL2RsbXRocmVhZC5jCmluZGV4IDViZTlkMTQuLjQ0ZDNiNTcgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2RsbS9kbG10aHJlYWQuYworKysgYi9mcy9vY2ZzMi9kbG0vZGxtdGhyZWFkLmMKQEAgLTMxOCw4ICszMTgsNyBAQAogCiAJCXRhcmdldC0+bWwudHlwZSA9IHRhcmdldC0+bWwuY29udmVydF90eXBlOwogCQl0YXJnZXQtPm1sLmNvbnZlcnRfdHlwZSA9IExLTV9JVk1PREU7Ci0JCWxpc3RfZGVsX2luaXQoJnRhcmdldC0+bGlzdCk7Ci0JCWxpc3RfYWRkX3RhaWwoJnRhcmdldC0+bGlzdCwgJnJlcy0+Z3JhbnRlZCk7CisJCWxpc3RfbW92ZV90YWlsKCZ0YXJnZXQtPmxpc3QsICZyZXMtPmdyYW50ZWQpOwogCiAJCUJVR19PTighdGFyZ2V0LT5sa3NiKTsKIAkJdGFyZ2V0LT5sa3NiLT5zdGF0dXMgPSBETE1fTk9STUFMOwpAQCAtMzgwLDggKzM3OSw3IEBACiAJCSAgICAgdGFyZ2V0LT5tbC50eXBlLCB0YXJnZXQtPm1sLm5vZGUpOwogCiAJCS8vIHRhcmdldC0+bWwudHlwZSBpcyBhbHJlYWR5IGNvcnJlY3QKLQkJbGlzdF9kZWxfaW5pdCgmdGFyZ2V0LT5saXN0KTsKLQkJbGlzdF9hZGRfdGFpbCgmdGFyZ2V0LT5saXN0LCAmcmVzLT5ncmFudGVkKTsKKwkJbGlzdF9tb3ZlX3RhaWwoJnRhcmdldC0+bGlzdCwgJnJlcy0+Z3JhbnRlZCk7CiAKIAkJQlVHX09OKCF0YXJnZXQtPmxrc2IpOwogCQl0YXJnZXQtPmxrc2ItPnN0YXR1cyA9IERMTV9OT1JNQUw7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9kbG0vZGxtdW5sb2NrLmMgYi9mcy9vY2ZzMi9kbG0vZGxtdW5sb2NrLmMKaW5kZXggN2IxYTI3NS4uYWM4OWM1MCAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZGxtL2RsbXVubG9jay5jCisrKyBiL2ZzL29jZnMyL2RsbS9kbG11bmxvY2suYwpAQCAtMjcxLDggKzI3MSw3IEBACiB2b2lkIGRsbV9jb21taXRfcGVuZGluZ19jYW5jZWwoc3RydWN0IGRsbV9sb2NrX3Jlc291cmNlICpyZXMsCiAJCQkgICAgICAgc3RydWN0IGRsbV9sb2NrICpsb2NrKQogewotCWxpc3RfZGVsX2luaXQoJmxvY2stPmxpc3QpOwotCWxpc3RfYWRkX3RhaWwoJmxvY2stPmxpc3QsICZyZXMtPmdyYW50ZWQpOworCWxpc3RfbW92ZV90YWlsKCZsb2NrLT5saXN0LCAmcmVzLT5ncmFudGVkKTsKIAlsb2NrLT5tbC5jb252ZXJ0X3R5cGUgPSBMS01fSVZNT0RFOwogfQogCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9qb3VybmFsLmMgYi9mcy9vY2ZzMi9qb3VybmFsLmMKaW5kZXggZWViYzNjZi4uM2ZlODc4MSAxMDA2NDQKLS0tIGEvZnMvb2NmczIvam91cm5hbC5jCisrKyBiL2ZzL29jZnMyL2pvdXJuYWwuYwpAQCAtMjIyLDggKzIyMiw3IEBACiAJQlVHX09OKCFsaXN0X2VtcHR5KCZPQ0ZTMl9JKGlub2RlKS0+aXBfaGFuZGxlX2xpc3QpKTsKIAogCU9DRlMyX0koaW5vZGUpLT5pcF9oYW5kbGUgPSBoYW5kbGU7Ci0JbGlzdF9kZWwoJihPQ0ZTMl9JKGlub2RlKS0+aXBfaGFuZGxlX2xpc3QpKTsKLQlsaXN0X2FkZF90YWlsKCYoT0NGUzJfSShpbm9kZSktPmlwX2hhbmRsZV9saXN0KSwgJihoYW5kbGUtPmlub2RlX2xpc3QpKTsKKwlsaXN0X21vdmVfdGFpbCgmKE9DRlMyX0koaW5vZGUpLT5pcF9oYW5kbGVfbGlzdCksICYoaGFuZGxlLT5pbm9kZV9saXN0KSk7CiB9CiAKIHN0YXRpYyB2b2lkIG9jZnMyX2hhbmRsZV91bmxvY2tfaW5vZGVzKHN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlKQpkaWZmIC0tZ2l0IGEvZnMvb3Blbi5jIGIvZnMvb3Blbi5jCmluZGV4IDVmYjE2ZTUuLjMwM2YwNmQgMTAwNjQ0Ci0tLSBhL2ZzL29wZW4uYworKysgYi9mcy9vcGVuLmMKQEAgLTMyMiw3ICszMjIsNyBAQAogCiAJZXJyb3IgPSBsb2Nrc192ZXJpZnlfdHJ1bmNhdGUoaW5vZGUsIGZpbGUsIGxlbmd0aCk7CiAJaWYgKCFlcnJvcikKLQkJZXJyb3IgPSBkb190cnVuY2F0ZShkZW50cnksIGxlbmd0aCwgMCwgZmlsZSk7CisJCWVycm9yID0gZG9fdHJ1bmNhdGUoZGVudHJ5LCBsZW5ndGgsIEFUVFJfTVRJTUV8QVRUUl9DVElNRSwgZmlsZSk7CiBvdXRfcHV0ZjoKIAlmcHV0KGZpbGUpOwogb3V0OgpkaWZmIC0tZ2l0IGEvZnMvb3BlbnByb21mcy9pbm9kZS5jIGIvZnMvb3BlbnByb21mcy9pbm9kZS5jCmluZGV4IDQ2NGUyYmMuLjkzYTU2YmQgMTAwNjQ0Ci0tLSBhL2ZzL29wZW5wcm9tZnMvaW5vZGUuYworKysgYi9mcy9vcGVucHJvbWZzL2lub2RlLmMKQEAgLTEsNSArMSw0IEBACi0vKiAkSWQ6IGlub2RlLmMsdiAxLjE1IDIwMDEvMTEvMTIgMDk6NDM6MzkgZGF2ZW0gRXhwICQKLSAqIG9wZW5wcm9tZnMuYzogL3Byb2Mvb3BlbnByb20gaGFuZGxpbmcgcm91dGluZXMKKy8qIGlub2RlLmM6IC9wcm9jL29wZW5wcm9tIGhhbmRsaW5nIHJvdXRpbmVzCiAgKgogICogQ29weXJpZ2h0IChDKSAxOTk2LTE5OTkgSmFrdWIgSmVsaW5layAgKGpha3ViQHJlZGhhdC5jb20pCiAgKiBDb3B5cmlnaHQgKEMpIDE5OTggICAgICBFZGRpZSBDLiBEb3N0ICAoZWNkQHNreW5ldC5iZSkKQEAgLTEyLDc1NiArMTEsMjQ1IEBACiAjaW5jbHVkZSA8bGludXgvb3BlbnByb21fZnMuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KIAogI2luY2x1ZGUgPGFzbS9vcGVucHJvbS5oPgogI2luY2x1ZGUgPGFzbS9vcGxpYi5oPgorI2luY2x1ZGUgPGFzbS9wcm9tLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAotI2RlZmluZSBBTElBU0VTX05OT0RFUyA2NAorc3RhdGljIERFRklORV9NVVRFWChvcF9tdXRleCk7CiAKLXR5cGVkZWYgc3RydWN0IHsKLQl1MTYJcGFyZW50OwotCXUxNgluZXh0OwotCXUxNgljaGlsZDsKLQl1MTYJZmlyc3RfcHJvcDsKLQl1MzIJbm9kZTsKLX0gb3BlbnByb21mc19ub2RlOworI2RlZmluZSBPUEVOUFJPTV9ST09UX0lOTwkwCiAKLXR5cGVkZWYgc3RydWN0IHsKLSNkZWZpbmUgT1BQX1NUUklORwkweDEwCi0jZGVmaW5lIE9QUF9TVFJJTkdMSVNUCTB4MjAKLSNkZWZpbmUgT1BQX0JJTkFSWQkweDQwCi0jZGVmaW5lIE9QUF9IRVhTVFJJTkcJMHg4MAotI2RlZmluZSBPUFBfRElSVFkJMHgwMQotI2RlZmluZSBPUFBfUVVPVEVECTB4MDIKLSNkZWZpbmUgT1BQX05PVFFVT1RFRAkweDA0Ci0jZGVmaW5lIE9QUF9BU0NJSVoJMHgwOAotCXUzMglmbGFnOwotCXUzMglhbGxvY2xlbjsKLQl1MzIJbGVuOwotCWNoYXIJKnZhbHVlOwotCWNoYXIJbmFtZVs4XTsKLX0gb3BlbnByb21fcHJvcGVydHk7CitlbnVtIG9wX2lub2RlX3R5cGUgeworCW9wX2lub2RlX25vZGUsCisJb3BfaW5vZGVfcHJvcCwKK307CiAKLXN0YXRpYyBvcGVucHJvbWZzX25vZGUgKm5vZGVzOwotc3RhdGljIGludCBhbGxvY2VkOwotc3RhdGljIHUxNiBsYXN0X25vZGU7Ci1zdGF0aWMgdTE2IGZpcnN0X3Byb3A7Ci1zdGF0aWMgdTE2IG9wdGlvbnMgPSAweGZmZmY7Ci1zdGF0aWMgdTE2IGFsaWFzZXMgPSAweGZmZmY7Ci1zdGF0aWMgaW50IGFsaWFzZXNfbm9kZXM7Ci1zdGF0aWMgY2hhciAqYWxpYXNfbmFtZXMgW0FMSUFTRVNfTk5PREVTXTsKK3VuaW9uIG9wX2lub2RlX2RhdGEgeworCXN0cnVjdCBkZXZpY2Vfbm9kZQkqbm9kZTsKKwlzdHJ1Y3QgcHJvcGVydHkJCSpwcm9wOworfTsKIAotI2RlZmluZSBPUEVOUFJPTV9ST09UX0lOTwkxNgotI2RlZmluZSBPUEVOUFJPTV9GSVJTVF9JTk8JT1BFTlBST01fUk9PVF9JTk8KLSNkZWZpbmUgTk9ERShpbm8pIG5vZGVzW2lubyAtIE9QRU5QUk9NX0ZJUlNUX0lOT10KLSNkZWZpbmUgTk9ERTJJTk8obm9kZSkgKG5vZGUgKyBPUEVOUFJPTV9GSVJTVF9JTk8pCi0jZGVmaW5lIE5PREVQMklOTyhubykgKG5vICsgT1BFTlBST01fRklSU1RfSU5PICsgbGFzdF9ub2RlKQorc3RydWN0IG9wX2lub2RlX2luZm8geworCXN0cnVjdCBpbm9kZQkJdmZzX2lub2RlOworCWVudW0gb3BfaW5vZGVfdHlwZQl0eXBlOworCXVuaW9uIG9wX2lub2RlX2RhdGEJdTsKK307CiAKLXN0YXRpYyBpbnQgb3BlbnByb21mc19jcmVhdGUgKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZGVudHJ5ICosIGludCwgc3RydWN0IG5hbWVpZGF0YSAqKTsKLXN0YXRpYyBpbnQgb3BlbnByb21mc19yZWFkZGlyKHN0cnVjdCBmaWxlICosIHZvaWQgKiwgZmlsbGRpcl90KTsKLXN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpvcGVucHJvbWZzX2xvb2t1cChzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCk7Ci1zdGF0aWMgaW50IG9wZW5wcm9tZnNfdW5saW5rIChzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KTsKLQotc3RhdGljIHNzaXplX3Qgbm9kZW51bV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAotCQkJICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQorc3RhdGljIGlubGluZSBzdHJ1Y3Qgb3BfaW5vZGVfaW5mbyAqT1BfSShzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKLQljaGFyIGJ1ZmZlclsxMF07Ci0JCi0JaWYgKGNvdW50IDwgMCB8fCAhaW5vZGUtPnUuZ2VuZXJpY19pcCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0Jc3ByaW50ZiAoYnVmZmVyLCAiJTguOHhcbiIsICh1MzIpKGxvbmcpKGlub2RlLT51LmdlbmVyaWNfaXApKTsKLQlpZiAoZmlsZS0+Zl9wb3MgPj0gOSkKLQkJcmV0dXJuIDA7Ci0JaWYgKGNvdW50ID4gOSAtIGZpbGUtPmZfcG9zKQotCQljb3VudCA9IDkgLSBmaWxlLT5mX3BvczsKLQlpZiAoY29weV90b191c2VyKGJ1ZiwgYnVmZmVyICsgZmlsZS0+Zl9wb3MsIGNvdW50KSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JKnBwb3MgKz0gY291bnQ7Ci0JcmV0dXJuIGNvdW50OworCXJldHVybiBjb250YWluZXJfb2YoaW5vZGUsIHN0cnVjdCBvcF9pbm9kZV9pbmZvLCB2ZnNfaW5vZGUpOwogfQogCi1zdGF0aWMgc3NpemVfdCBwcm9wZXJ0eV9yZWFkKHN0cnVjdCBmaWxlICpmaWxwLCBjaGFyIF9fdXNlciAqYnVmLAotCQkJICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3N0YXRpYyBpbnQgaXNfc3RyaW5nKHVuc2lnbmVkIGNoYXIgKnAsIGludCBsZW4pCiB7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOwotCWludCBpLCBqLCBrOwotCXUzMiBub2RlOwotCWNoYXIgKnAsICpzOwotCXUzMiAqcTsKLQlvcGVucHJvbV9wcm9wZXJ0eSAqb3A7Ci0JY2hhciBidWZmZXJbNjRdOwotCQotCWlmICghZmlscC0+cHJpdmF0ZV9kYXRhKSB7Ci0JCW5vZGUgPSBub2Rlc1sodTE2KSgobG9uZylpbm9kZS0+dS5nZW5lcmljX2lwKV0ubm9kZTsKLQkJaSA9ICgodTMyKShsb25nKWlub2RlLT51LmdlbmVyaWNfaXApID4+IDE2OwotCQlpZiAoKHUxNikoKGxvbmcpaW5vZGUtPnUuZ2VuZXJpY19pcCkgPT0gYWxpYXNlcykgewotCQkJaWYgKGkgPj0gYWxpYXNlc19ub2RlcykKLQkJCQlwID0gTlVMTDsKLQkJCWVsc2UKLQkJCQlwID0gYWxpYXNfbmFtZXMgW2ldOwotCQl9IGVsc2UKLQkJCWZvciAocCA9IHByb21fZmlyc3Rwcm9wIChub2RlLCBidWZmZXIpOwotCQkJICAgICBpICYmIHAgJiYgKnA7Ci0JCQkgICAgIHAgPSBwcm9tX25leHRwcm9wIChub2RlLCBwLCBidWZmZXIpLCBpLS0pCi0JCQkJLyogbm90aGluZyAqLyA7Ci0JCWlmICghcCB8fCAhKnApCi0JCQlyZXR1cm4gLUVJTzsKLQkJaSA9IHByb21fZ2V0cHJvcGxlbiAobm9kZSwgcCk7Ci0JCWlmIChpIDwgMCkgewotCQkJaWYgKCh1MTYpKChsb25nKWlub2RlLT51LmdlbmVyaWNfaXApID09IGFsaWFzZXMpCi0JCQkJaSA9IDA7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIC1FSU87Ci0JCX0KLQkJayA9IGk7Ci0JCWlmIChpIDwgNjQpIGkgPSA2NDsKLQkJZmlscC0+cHJpdmF0ZV9kYXRhID0ga21hbGxvYyAoc2l6ZW9mIChvcGVucHJvbV9wcm9wZXJ0eSkKLQkJCQkJICAgICAgKyAoaiA9IHN0cmxlbiAocCkpICsgMiAqIGksCi0JCQkJCSAgICAgIEdGUF9LRVJORUwpOwotCQlpZiAoIWZpbHAtPnByaXZhdGVfZGF0YSkKLQkJCXJldHVybiAtRU5PTUVNOwotCQlvcCA9IChvcGVucHJvbV9wcm9wZXJ0eSAqKWZpbHAtPnByaXZhdGVfZGF0YTsKLQkJb3AtPmZsYWcgPSAwOwotCQlvcC0+YWxsb2NsZW4gPSAyICogaTsKLQkJc3RyY3B5IChvcC0+bmFtZSwgcCk7Ci0JCW9wLT52YWx1ZSA9IChjaGFyICopKCgodW5zaWduZWQgbG9uZykob3AtPm5hbWUgKyBqICsgNCkpICYgfjMpOwotCQlvcC0+bGVuID0gazsKLQkJaWYgKGsgJiYgcHJvbV9nZXRwcm9wZXJ0eSAobm9kZSwgcCwgb3AtPnZhbHVlLCBpKSA8IDApCi0JCQlyZXR1cm4gLUVJTzsKLQkJb3AtPnZhbHVlIFtrXSA9IDA7Ci0JCWlmIChrKSB7Ci0JCQlmb3IgKHMgPSBOVUxMLCBwID0gb3AtPnZhbHVlOyBwIDwgb3AtPnZhbHVlICsgazsgcCsrKSB7Ci0JCQkJaWYgKCgqcCA+PSAnICcgJiYgKnAgPD0gJ34nKSB8fCAqcCA9PSAnXG4nKSB7Ci0JCQkJCW9wLT5mbGFnIHw9IE9QUF9TVFJJTkc7Ci0JCQkJCXMgPSBwOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJaWYgKHAgPiBvcC0+dmFsdWUgJiYgISpwICYmIHMgPT0gcCAtIDEpIHsKLQkJCQkJaWYgKHAgPCBvcC0+dmFsdWUgKyBrIC0gMSkKLQkJCQkJCW9wLT5mbGFnIHw9IE9QUF9TVFJJTkdMSVNUOwotCQkJCQllbHNlCi0JCQkJCQlvcC0+ZmxhZyB8PSBPUFBfQVNDSUlaOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJaWYgKGsgPT0gMSAmJiAhKnApIHsKLQkJCQkJb3AtPmZsYWcgfD0gKE9QUF9TVFJJTkd8T1BQX0FTQ0lJWik7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlvcC0+ZmxhZyAmPSB+KE9QUF9TVFJJTkd8T1BQX1NUUklOR0xJU1QpOwotCQkJCWlmIChrICYgMykKLQkJCQkJb3AtPmZsYWcgfD0gT1BQX0hFWFNUUklORzsKLQkJCQllbHNlCi0JCQkJCW9wLT5mbGFnIHw9IE9QUF9CSU5BUlk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAob3AtPmZsYWcgJiBPUFBfU1RSSU5HTElTVCkKLQkJCQlvcC0+ZmxhZyAmPSB+KE9QUF9TVFJJTkcpOwotCQkJaWYgKG9wLT5mbGFnICYgT1BQX0FTQ0lJWikKLQkJCQlvcC0+bGVuLS07Ci0JCX0KLQl9IGVsc2UKLQkJb3AgPSAob3BlbnByb21fcHJvcGVydHkgKilmaWxwLT5wcml2YXRlX2RhdGE7Ci0JaWYgKCFjb3VudCB8fCAhKG9wLT5sZW4gfHwgKG9wLT5mbGFnICYgT1BQX0FTQ0lJWikpKQorCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCXVuc2lnbmVkIGNoYXIgdmFsID0gcFtpXTsKKworCQlpZiAoKGkgJiYgIXZhbCkgfHwKKwkJICAgICh2YWwgPj0gJyAnICYmIHZhbCA8PSAnficpKQorCQkJY29udGludWU7CisKIAkJcmV0dXJuIDA7Ci0JaWYgKCpwcG9zID49IDB4ZmZmZmZmIHx8IGNvdW50ID49IDB4ZmZmZmZmKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAob3AtPmZsYWcgJiBPUFBfU1RSSU5HTElTVCkgewotCQlmb3IgKGsgPSAwLCBwID0gb3AtPnZhbHVlOyBwIDwgb3AtPnZhbHVlICsgb3AtPmxlbjsgcCsrKQotCQkJaWYgKCEqcCkKLQkJCQlrKys7Ci0JCWkgPSBvcC0+bGVuICsgNCAqIGsgKyAzOwotCX0gZWxzZSBpZiAob3AtPmZsYWcgJiBPUFBfU1RSSU5HKSB7Ci0JCWkgPSBvcC0+bGVuICsgMzsKLQl9IGVsc2UgaWYgKG9wLT5mbGFnICYgT1BQX0JJTkFSWSkgewotCQlpID0gKG9wLT5sZW4gKiA5KSA+PiAyOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IHByb3BlcnR5X3Nob3coc3RydWN0IHNlcV9maWxlICpmLCB2b2lkICp2KQoreworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcCA9IGYtPnByaXZhdGU7CisJdm9pZCAqcHZhbDsKKwlpbnQgbGVuOworCisJbGVuID0gcHJvcC0+bGVuZ3RoOworCXB2YWwgPSBwcm9wLT52YWx1ZTsKKworCWlmIChpc19zdHJpbmcocHZhbCwgbGVuKSkgeworCQl3aGlsZSAobGVuID4gMCkgeworCQkJaW50IG4gPSBzdHJsZW4ocHZhbCk7CisKKwkJCXNlcV9wcmludGYoZiwgIiVzIiwgKGNoYXIgKikgcHZhbCk7CisKKwkJCS8qIFNraXAgb3ZlciB0aGUgTlVMTCBieXRlIHRvby4gICovCisJCQlwdmFsICs9IG4gKyAxOworCQkJbGVuIC09IG4gKyAxOworCisJCQlpZiAobGVuID4gMCkKKwkJCQlzZXFfcHJpbnRmKGYsICIgKyAiKTsKKwkJfQogCX0gZWxzZSB7Ci0JCWkgPSAob3AtPmxlbiA8PCAxKSArIDE7Ci0JfQotCWsgPSAqcHBvczsKLQlpZiAoayA+PSBpKSByZXR1cm4gMDsKLQlpZiAoY291bnQgPiBpIC0gaykgY291bnQgPSBpIC0gazsKLQlpZiAob3AtPmZsYWcgJiBPUFBfU1RSSU5HKSB7Ci0JCWlmICghaykgewotCQkJaWYgKHB1dF91c2VyKCdcJycsIGJ1ZikpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQlrKys7Ci0JCQljb3VudC0tOwotCQl9Ci0KLQkJaWYgKGsgKyBjb3VudCA+PSBpIC0gMikKLQkJCWogPSBpIC0gMiAtIGs7Ci0JCWVsc2UKLQkJCWogPSBjb3VudDsKLQotCQlpZiAoaiA+PSAwKSB7Ci0JCQlpZiAoY29weV90b191c2VyKGJ1ZiArIGsgLSAqcHBvcywKLQkJCQkJIG9wLT52YWx1ZSArIGsgLSAxLCBqKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCWNvdW50IC09IGo7Ci0JCQlrICs9IGo7Ci0JCX0KLQotCQlpZiAoY291bnQpIHsKLQkJCWlmIChwdXRfdXNlcignXCcnLCAmYnVmIFtrKysgLSAqcHBvc10pKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQl9Ci0JCWlmIChjb3VudCA+IDEpIHsKLQkJCWlmIChwdXRfdXNlcignXG4nLCAmYnVmIFtrKysgLSAqcHBvc10pKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQl9Ci0JfSBlbHNlIGlmIChvcC0+ZmxhZyAmIE9QUF9TVFJJTkdMSVNUKSB7Ci0JCWNoYXIgKnRtcDsKLQotCQl0bXAgPSBrbWFsbG9jIChpLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCF0bXApCi0JCQlyZXR1cm4gLUVOT01FTTsKLQotCQlzID0gdG1wOwotCQkqcysrID0gJ1wnJzsKLQkJZm9yIChwID0gb3AtPnZhbHVlOyBwIDwgb3AtPnZhbHVlICsgb3AtPmxlbjsgcCsrKSB7Ci0JCQlpZiAoISpwKSB7Ci0JCQkJc3RyY3B5KHMsICInICsgJyIpOwotCQkJCXMgKz0gNTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCSpzKysgPSAqcDsKLQkJfQotCQlzdHJjcHkocywgIidcbiIpOwotCi0JCWlmIChjb3B5X3RvX3VzZXIoYnVmLCB0bXAgKyBrLCBjb3VudCkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQlrZnJlZSh0bXApOwotCQlrICs9IGNvdW50OwotCi0JfSBlbHNlIGlmIChvcC0+ZmxhZyAmIE9QUF9CSU5BUlkpIHsKLQkJY2hhciBidWZmZXJbMTBdOwotCQl1MzIgKmZpcnN0LCAqbGFzdDsKLQkJaW50IGZpcnN0X29mZiwgbGFzdF9jbnQ7Ci0KLQkJZmlyc3QgPSAoKHUzMiAqKW9wLT52YWx1ZSkgKyBrIC8gOTsKLQkJZmlyc3Rfb2ZmID0gayAlIDk7Ci0JCWxhc3QgPSAoKHUzMiAqKW9wLT52YWx1ZSkgKyAoayArIGNvdW50IC0gMSkgLyA5OwotCQlsYXN0X2NudCA9IChrICsgY291bnQpICUgOTsKLQkJaWYgKCFsYXN0X2NudCkgbGFzdF9jbnQgPSA5OwotCi0JCWlmIChmaXJzdCA9PSBsYXN0KSB7Ci0JCQlzcHJpbnRmIChidWZmZXIsICIlMDh4LiIsICpmaXJzdCk7Ci0JCQlpZiAoY29weV90b191c2VyKGJ1ZiwgYnVmZmVyICsgZmlyc3Rfb2ZmLAotCQkJCQkgbGFzdF9jbnQgLSBmaXJzdF9vZmYpKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJYnVmICs9IGxhc3RfY250IC0gZmlyc3Rfb2ZmOwotCQl9IGVsc2UgewkJCi0JCQlmb3IgKHEgPSBmaXJzdDsgcSA8PSBsYXN0OyBxKyspIHsKLQkJCQlzcHJpbnRmIChidWZmZXIsICIlMDh4LiIsICpxKTsKLQkJCQlpZiAocSA9PSBmaXJzdCkgewotCQkJCQlpZiAoY29weV90b191c2VyKGJ1ZiwgYnVmZmVyICsgZmlyc3Rfb2ZmLAotCQkJCQkJCSA5IC0gZmlyc3Rfb2ZmKSkKLQkJCQkJCXJldHVybiAtRUZBVUxUOwotCQkJCQlidWYgKz0gOSAtIGZpcnN0X29mZjsKLQkJCQl9IGVsc2UgaWYgKHEgPT0gbGFzdCkgewotCQkJCQlpZiAoY29weV90b191c2VyKGJ1ZiwgYnVmZmVyLCBsYXN0X2NudCkpCi0JCQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCQkJYnVmICs9IGxhc3RfY250OwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChjb3B5X3RvX3VzZXIoYnVmLCBidWZmZXIsIDkpKQotCQkJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJCWJ1ZiArPSA5OwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChsYXN0ID09ICh1MzIgKikob3AtPnZhbHVlICsgb3AtPmxlbiAtIDQpICYmIGxhc3RfY250ID09IDkpIHsKLQkJCWlmIChwdXRfdXNlcignXG4nLCAoYnVmIC0gMSkpKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQl9Ci0KLQkJayArPSBjb3VudDsKLQotCX0gZWxzZSBpZiAob3AtPmZsYWcgJiBPUFBfSEVYU1RSSU5HKSB7Ci0JCWNoYXIgYnVmZmVyWzNdOwotCi0JCWlmICgoayA8IGkgLSAxKSAmJiAoayAmIDEpKSB7Ci0JCQlzcHJpbnRmIChidWZmZXIsICIlMDJ4IiwKLQkJCQkgKHVuc2lnbmVkIGNoYXIpICoob3AtPnZhbHVlICsgKGsgPj4gMSkpICYgMHhmZik7Ci0JCQlpZiAocHV0X3VzZXIoYnVmZmVyWzFdLCAmYnVmW2srKyAtICpwcG9zXSkpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQljb3VudC0tOwotCQl9Ci0KLQkJZm9yICg7IChjb3VudCA+IDEpICYmIChrIDwgaSAtIDEpOyBrICs9IDIpIHsKLQkJCXNwcmludGYgKGJ1ZmZlciwgIiUwMngiLAotCQkJCSAodW5zaWduZWQgY2hhcikgKihvcC0+dmFsdWUgKyAoayA+PiAxKSkgJiAweGZmKTsKLQkJCWlmIChjb3B5X3RvX3VzZXIoYnVmICsgayAtICpwcG9zLCBidWZmZXIsIDIpKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJY291bnQgLT0gMjsKLQkJfQotCi0JCWlmIChjb3VudCAmJiAoayA8IGkgLSAxKSkgewotCQkJc3ByaW50ZiAoYnVmZmVyLCAiJTAyeCIsCi0JCQkJICh1bnNpZ25lZCBjaGFyKSAqKG9wLT52YWx1ZSArIChrID4+IDEpKSAmIDB4ZmYpOwotCQkJaWYgKHB1dF91c2VyKGJ1ZmZlclswXSwgJmJ1ZltrKysgLSAqcHBvc10pKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJY291bnQtLTsKLQkJfQotCi0JCWlmIChjb3VudCkgewotCQkJaWYgKHB1dF91c2VyKCdcbicsICZidWYgW2srKyAtICpwcG9zXSkpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQl9Ci0JY291bnQgPSBrIC0gKnBwb3M7Ci0JKnBwb3MgPSBrOwotCXJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIHNzaXplX3QgcHJvcGVydHlfd3JpdGUoc3RydWN0IGZpbGUgKmZpbHAsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCi0JCQkgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQlpbnQgaSwgaiwgazsKLQljaGFyICpwOwotCXUzMiAqcTsKLQl2b2lkICpiOwotCW9wZW5wcm9tX3Byb3BlcnR5ICpvcDsKLQkKLQlpZiAoKnBwb3MgPj0gMHhmZmZmZmYgfHwgY291bnQgPj0gMHhmZmZmZmYpCi0JCXJldHVybiAtRUlOVkFMOwotCWlmICghZmlscC0+cHJpdmF0ZV9kYXRhKSB7Ci0JCWkgPSBwcm9wZXJ0eV9yZWFkIChmaWxwLCBOVUxMLCAwLCBOVUxMKTsKLQkJaWYgKGkpCi0JCQlyZXR1cm4gaTsKLQl9Ci0JayA9ICpwcG9zOwotCW9wID0gKG9wZW5wcm9tX3Byb3BlcnR5ICopZmlscC0+cHJpdmF0ZV9kYXRhOwotCWlmICghKG9wLT5mbGFnICYgT1BQX1NUUklORykpIHsKLQkJdTMyICpmaXJzdCwgKmxhc3Q7Ci0JCWludCBmaXJzdF9vZmYsIGxhc3RfY250OwotCQl1MzIgbWFzaywgbWFzazI7Ci0JCWNoYXIgdG1wIFs5XTsKLQkJaW50IGZvcmNlbGVuID0gMDsKLQkJCi0JCWogPSBrICUgOTsKLQkJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyssIGorKykgewotCQkJaWYgKGogPT0gOSkgaiA9IDA7Ci0JCQlpZiAoIWopIHsKLQkJCQljaGFyIGN0bXA7Ci0JCQkJaWYgKGdldF91c2VyKGN0bXAsICZidWZbaV0pKQotCQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCQlpZiAoY3RtcCAhPSAnLicpIHsKLQkJCQkJaWYgKGN0bXAgIT0gJ1xuJykgewotCQkJCQkJaWYgKG9wLT5mbGFnICYgT1BQX0JJTkFSWSkKLQkJCQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCQkJCWVsc2UKLQkJCQkJCQlnb3RvIHdyaXRlX3RyeV9zdHJpbmc7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQljb3VudCA9IGkgKyAxOwotCQkJCQkJZm9yY2VsZW4gPSAxOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWNoYXIgY3RtcDsKLQkJCQlpZiAoZ2V0X3VzZXIoY3RtcCwgJmJ1ZltpXSkpCi0JCQkJCXJldHVybiAtRUZBVUxUOwotCQkJCWlmIChjdG1wIDwgJzAnIHx8IAotCQkJCSAgICAoY3RtcCA+ICc5JyAmJiBjdG1wIDwgJ0EnKSB8fAotCQkJCSAgICAoY3RtcCA+ICdGJyAmJiBjdG1wIDwgJ2EnKSB8fAotCQkJCSAgICBjdG1wID4gJ2YnKSB7Ci0JCQkJCWlmIChvcC0+ZmxhZyAmIE9QUF9CSU5BUlkpCi0JCQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCQkJZWxzZQotCQkJCQkJZ290byB3cml0ZV90cnlfc3RyaW5nOwotCQkJCX0KLQkJCX0KLQkJfQotCQlvcC0+ZmxhZyB8PSBPUFBfQklOQVJZOwotCQl0bXAgWzhdID0gMDsKLQkJaSA9ICgoY291bnQgKyBrICsgOCkgLyA5KSA8PCAyOwotCQlpZiAob3AtPmFsbG9jbGVuIDw9IGkpIHsKLQkJCWIgPSBrbWFsbG9jIChzaXplb2YgKG9wZW5wcm9tX3Byb3BlcnR5KSArIDIgKiBpLAotCQkJCSAgICAgR0ZQX0tFUk5FTCk7Ci0JCQlpZiAoIWIpCi0JCQkJcmV0dXJuIC1FTk9NRU07Ci0JCQltZW1jcHkgKGIsIGZpbHAtPnByaXZhdGVfZGF0YSwKLQkJCQlzaXplb2YgKG9wZW5wcm9tX3Byb3BlcnR5KQotCQkJCSsgc3RybGVuIChvcC0+bmFtZSkgKyBvcC0+YWxsb2NsZW4pOwotCQkJbWVtc2V0ICgoKGNoYXIgKiliKSArIHNpemVvZiAob3BlbnByb21fcHJvcGVydHkpCi0JCQkJKyBzdHJsZW4gKG9wLT5uYW1lKSArIG9wLT5hbGxvY2xlbiwgCi0JCQkJMCwgMiAqIGkgLSBvcC0+YWxsb2NsZW4pOwotCQkJb3AgPSAob3BlbnByb21fcHJvcGVydHkgKiliOwotCQkJb3AtPmFsbG9jbGVuID0gMippOwotCQkJYiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQkJCWZpbHAtPnByaXZhdGVfZGF0YSA9ICh2b2lkICopb3A7Ci0JCQlrZnJlZSAoYik7Ci0JCX0KLQkJZmlyc3QgPSAoKHUzMiAqKW9wLT52YWx1ZSkgKyAoayAvIDkpOwotCQlmaXJzdF9vZmYgPSBrICUgOTsKLQkJbGFzdCA9ICh1MzIgKikob3AtPnZhbHVlICsgaSk7Ci0JCWxhc3RfY250ID0gKGsgKyBjb3VudCkgJSA5OwotCQlpZiAoZmlyc3QgKyAxID09IGxhc3QpIHsKLQkJCW1lbXNldCAodG1wLCAnMCcsIDgpOwotCQkJaWYgKGNvcHlfZnJvbV91c2VyKHRtcCArIGZpcnN0X29mZiwgYnVmLAotCQkJCQkgICAoY291bnQgKyBmaXJzdF9vZmYgPiA4KSA/Ci0JCQkJCSAgIDggLSBmaXJzdF9vZmYgOiBjb3VudCkpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQltYXNrID0gMHhmZmZmZmZmZjsKLQkJCW1hc2syID0gMHhmZmZmZmZmZjsKLQkJCWZvciAoaiA9IDA7IGogPCBmaXJzdF9vZmY7IGorKykKLQkJCQltYXNrID4+PSAxOwotCQkJZm9yIChqID0gOCAtIGNvdW50IC0gZmlyc3Rfb2ZmOyBqID4gMDsgai0tKQotCQkJCW1hc2syIDw8PSAxOwotCQkJbWFzayAmPSBtYXNrMjsKLQkJCWlmIChtYXNrKSB7Ci0JCQkJKmZpcnN0ICY9IH5tYXNrOwotCQkJCSpmaXJzdCB8PSBzaW1wbGVfc3RydG91bCAodG1wLCBOVUxMLCAxNik7Ci0JCQkJb3AtPmZsYWcgfD0gT1BQX0RJUlRZOworCQlpZiAobGVuICYgMykgeworCQkJd2hpbGUgKGxlbikgeworCQkJCWxlbi0tOworCQkJCWlmIChsZW4pCisJCQkJCXNlcV9wcmludGYoZiwgIiUwMnguIiwKKwkJCQkJCSAgICoodW5zaWduZWQgY2hhciAqKSBwdmFsKTsKKwkJCQllbHNlCisJCQkJCXNlcV9wcmludGYoZiwgIiUwMngiLAorCQkJCQkJICAgKih1bnNpZ25lZCBjaGFyICopIHB2YWwpOworCQkJCXB2YWwrKzsKIAkJCX0KIAkJfSBlbHNlIHsKLQkJCW9wLT5mbGFnIHw9IE9QUF9ESVJUWTsKLQkJCWZvciAocSA9IGZpcnN0OyBxIDwgbGFzdDsgcSsrKSB7Ci0JCQkJaWYgKHEgPT0gZmlyc3QpIHsKLQkJCQkJaWYgKGZpcnN0X29mZiA8IDgpIHsKLQkJCQkJCW1lbXNldCAodG1wLCAnMCcsIDgpOwotCQkJCQkJaWYgKGNvcHlfZnJvbV91c2VyKHRtcCArIGZpcnN0X29mZiwKLQkJCQkJCQkJICAgYnVmLAotCQkJCQkJCQkgICA4IC0gZmlyc3Rfb2ZmKSkKLQkJCQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCQkJCW1hc2sgPSAweGZmZmZmZmZmOwotCQkJCQkJZm9yIChqID0gMDsgaiA8IGZpcnN0X29mZjsgaisrKQotCQkJCQkJCW1hc2sgPj49IDE7Ci0JCQkJCQkqcSAmPSB+bWFzazsKLQkJCQkJCSpxIHw9IHNpbXBsZV9zdHJ0b3VsICh0bXAsTlVMTCwxNik7Ci0JCQkJCX0KLQkJCQkJYnVmICs9IDk7Ci0JCQkJfSBlbHNlIGlmICgocSA9PSBsYXN0IC0gMSkgJiYgbGFzdF9jbnQKLQkJCQkJICAgJiYgKGxhc3RfY250IDwgOCkpIHsKLQkJCQkJbWVtc2V0ICh0bXAsICcwJywgOCk7Ci0JCQkJCWlmIChjb3B5X2Zyb21fdXNlcih0bXAsIGJ1ZiwgbGFzdF9jbnQpKQotCQkJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJCW1hc2sgPSAweGZmZmZmZmZmOwotCQkJCQlmb3IgKGogPSAwOyBqIDwgOCAtIGxhc3RfY250OyBqKyspCi0JCQkJCQltYXNrIDw8PSAxOwotCQkJCQkqcSAmPSB+bWFzazsKLQkJCQkJKnEgfD0gc2ltcGxlX3N0cnRvdWwgKHRtcCwgTlVMTCwgMTYpOwotCQkJCQlidWYgKz0gbGFzdF9jbnQ7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY2hhciB0Y2hhcnNbMTddOyAvKiBYWFggeXVjay4uLiAqLworCQkJd2hpbGUgKGxlbiA+PSA0KSB7CisJCQkJbGVuIC09IDQ7CiAKLQkJCQkJaWYgKGNvcHlfZnJvbV91c2VyKHRjaGFycywgYnVmLCAxNikpCi0JCQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCQkJKnEgPSBzaW1wbGVfc3RydG91bCAodGNoYXJzLCBOVUxMLCAxNik7Ci0JCQkJCWJ1ZiArPSA5OwotCQkJCX0KKwkJCQlpZiAobGVuKQorCQkJCQlzZXFfcHJpbnRmKGYsICIlMDh4LiIsCisJCQkJCQkgICAqKHVuc2lnbmVkIGludCAqKSBwdmFsKTsKKwkJCQllbHNlCisJCQkJCXNlcV9wcmludGYoZiwgIiUwOHgiLAorCQkJCQkJICAgKih1bnNpZ25lZCBpbnQgKikgcHZhbCk7CisJCQkJcHZhbCArPSA0OwogCQkJfQogCQl9Ci0JCWlmICghZm9yY2VsZW4pIHsKLQkJCWlmIChvcC0+bGVuIDwgaSkKLQkJCQlvcC0+bGVuID0gaTsKLQkJfSBlbHNlCi0JCQlvcC0+bGVuID0gaTsKLQkJKnBwb3MgKz0gY291bnQ7CiAJfQotd3JpdGVfdHJ5X3N0cmluZzoKLQlpZiAoIShvcC0+ZmxhZyAmIE9QUF9CSU5BUlkpKSB7Ci0JCWlmICghKG9wLT5mbGFnICYgKE9QUF9RVU9URUQgfCBPUFBfTk9UUVVPVEVEKSkpIHsKLQkJCWNoYXIgY3RtcDsKKwlzZXFfcHJpbnRmKGYsICJcbiIpOwogCi0JCQkvKiBObyB3YXksIGlmIHNvbWVib2R5IHN0YXJ0cyB3cml0aW5nIGZyb20gdGhlIG1pZGRsZSwgCi0JCQkgKiB3ZSBkb24ndCBrbm93IHdoZXRoZXIgaGUgdXNlcyBxdW90ZXMgYXJvdW5kIG9yIG5vdCAKLQkJCSAqLwotCQkJaWYgKGsgPiAwKQotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJaWYgKGdldF91c2VyKGN0bXAsIGJ1ZikpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQlpZiAoY3RtcCA9PSAnXCcnKSB7Ci0JCQkJb3AtPmZsYWcgfD0gT1BQX1FVT1RFRDsKLQkJCQlidWYrKzsKLQkJCQljb3VudC0tOwotCQkJCSgqcHBvcykrKzsKLQkJCQlpZiAoIWNvdW50KSB7Ci0JCQkJCW9wLT5mbGFnIHw9IE9QUF9TVFJJTkc7Ci0JCQkJCXJldHVybiAxOwotCQkJCX0KLQkJCX0gZWxzZQotCQkJCW9wLT5mbGFnIHw9IE9QUF9OT1RRVU9URUQ7Ci0JCX0KLQkJb3AtPmZsYWcgfD0gT1BQX1NUUklORzsKLQkJaWYgKG9wLT5hbGxvY2xlbiA8PSBjb3VudCArICpwcG9zKSB7Ci0JCQliID0ga21hbGxvYyAoc2l6ZW9mIChvcGVucHJvbV9wcm9wZXJ0eSkKLQkJCQkgICAgICsgMiAqIChjb3VudCArICpwcG9zKSwgR0ZQX0tFUk5FTCk7Ci0JCQlpZiAoIWIpCi0JCQkJcmV0dXJuIC1FTk9NRU07Ci0JCQltZW1jcHkgKGIsIGZpbHAtPnByaXZhdGVfZGF0YSwKLQkJCQlzaXplb2YgKG9wZW5wcm9tX3Byb3BlcnR5KQotCQkJCSsgc3RybGVuIChvcC0+bmFtZSkgKyBvcC0+YWxsb2NsZW4pOwotCQkJbWVtc2V0ICgoKGNoYXIgKiliKSArIHNpemVvZiAob3BlbnByb21fcHJvcGVydHkpCi0JCQkJKyBzdHJsZW4gKG9wLT5uYW1lKSArIG9wLT5hbGxvY2xlbiwgCi0JCQkJMCwgMiooY291bnQgLSAqcHBvcykgLSBvcC0+YWxsb2NsZW4pOwotCQkJb3AgPSAob3BlbnByb21fcHJvcGVydHkgKiliOwotCQkJb3AtPmFsbG9jbGVuID0gMiooY291bnQgKyAqcHBvcyk7Ci0JCQliID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCQkJZmlscC0+cHJpdmF0ZV9kYXRhID0gKHZvaWQgKilvcDsKLQkJCWtmcmVlIChiKTsKLQkJfQotCQlwID0gb3AtPnZhbHVlICsgKnBwb3MgLSAoKG9wLT5mbGFnICYgT1BQX1FVT1RFRCkgPyAxIDogMCk7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcihwLCBidWYsIGNvdW50KSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlvcC0+ZmxhZyB8PSBPUFBfRElSVFk7Ci0JCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrLCBwKyspCi0JCQlpZiAoKnAgPT0gJ1xuJykgewotCQkJCSpwID0gMDsKLQkJCQlicmVhazsKLQkJCX0KLQkJaWYgKGkgPCBjb3VudCkgewotCQkJb3AtPmxlbiA9IHAgLSBvcC0+dmFsdWU7Ci0JCQkqcHBvcyArPSBpICsgMTsKLQkJCWlmICgocCA+IG9wLT52YWx1ZSkgJiYgKG9wLT5mbGFnICYgT1BQX1FVT1RFRCkKLQkJCSAgICAmJiAoKihwIC0gMSkgPT0gJ1wnJykpCi0JCQkJb3AtPmxlbi0tOwotCQl9IGVsc2UgewotCQkJaWYgKHAgLSBvcC0+dmFsdWUgPiBvcC0+bGVuKQotCQkJCW9wLT5sZW4gPSBwIC0gb3AtPnZhbHVlOwotCQkJKnBwb3MgKz0gY291bnQ7Ci0JCX0KLQl9Ci0JcmV0dXJuICpwcG9zIC0gazsKLX0KLQotaW50IHByb3BlcnR5X3JlbGVhc2UgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQotewotCW9wZW5wcm9tX3Byb3BlcnR5ICpvcCA9IChvcGVucHJvbV9wcm9wZXJ0eSAqKWZpbHAtPnByaXZhdGVfZGF0YTsKLQlpbnQgZXJyb3I7Ci0JdTMyIG5vZGU7Ci0JCi0JaWYgKCFvcCkKLQkJcmV0dXJuIDA7Ci0JbG9ja19rZXJuZWwoKTsKLQlub2RlID0gbm9kZXNbKHUxNikoKGxvbmcpaW5vZGUtPnUuZ2VuZXJpY19pcCldLm5vZGU7Ci0JaWYgKCh1MTYpKChsb25nKWlub2RlLT51LmdlbmVyaWNfaXApID09IGFsaWFzZXMpIHsKLQkJaWYgKChvcC0+ZmxhZyAmIE9QUF9ESVJUWSkgJiYgKG9wLT5mbGFnICYgT1BQX1NUUklORykpIHsKLQkJCWNoYXIgKnAgPSBvcC0+bmFtZTsKLQkJCWludCBpID0gKG9wLT52YWx1ZSAtIG9wLT5uYW1lKSAtIHN0cmxlbiAob3AtPm5hbWUpIC0gMTsKLQkJCW9wLT52YWx1ZSBbb3AtPmxlbl0gPSAwOwotCQkJKihvcC0+dmFsdWUgLSAxKSA9ICcgJzsKLQkJCWlmIChpKSB7Ci0JCQkJZm9yIChwID0gb3AtPnZhbHVlIC0gaSAtIDI7IHAgPj0gb3AtPm5hbWU7IHAtLSkKLQkJCQkJcFtpXSA9ICpwOwotCQkJCXAgPSBvcC0+bmFtZSArIGk7Ci0JCQl9Ci0JCQltZW1jcHkgKHAgLSA4LCAibnZhbGlhcyAiLCA4KTsKLQkJCXByb21fZmV2YWwgKHAgLSA4KTsKLQkJfQotCX0gZWxzZSBpZiAob3AtPmZsYWcgJiBPUFBfRElSVFkpIHsKLQkJaWYgKG9wLT5mbGFnICYgT1BQX1NUUklORykgewotCQkJb3AtPnZhbHVlIFtvcC0+bGVuXSA9IDA7Ci0JCQllcnJvciA9IHByb21fc2V0cHJvcCAobm9kZSwgb3AtPm5hbWUsCi0JCQkJCSAgICAgIG9wLT52YWx1ZSwgb3AtPmxlbiArIDEpOwotCQkJaWYgKGVycm9yIDw9IDApCi0JCQkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIm9wZW5wcm9tZnM6ICIKLQkJCQkJIkNvdWxkbid0IHdyaXRlIHByb3BlcnR5ICVzXG4iLAotCQkJCQlvcC0+bmFtZSk7Ci0JCX0gZWxzZSBpZiAoKG9wLT5mbGFnICYgT1BQX0JJTkFSWSkgfHwgIW9wLT5sZW4pIHsKLQkJCWVycm9yID0gcHJvbV9zZXRwcm9wIChub2RlLCBvcC0+bmFtZSwKLQkJCQkJICAgICAgb3AtPnZhbHVlLCBvcC0+bGVuKTsKLQkJCWlmIChlcnJvciA8PSAwKQotCQkJCXByaW50ayAoS0VSTl9XQVJOSU5HICJvcGVucHJvbWZzOiAiCi0JCQkJCSJDb3VsZG4ndCB3cml0ZSBwcm9wZXJ0eSAlc1xuIiwKLQkJCQkJb3AtPm5hbWUpOwotCQl9IGVsc2UgewotCQkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIm9wZW5wcm9tZnM6ICIKLQkJCQkiVW5rbm93biBwcm9wZXJ0eSB0eXBlIG9mICVzXG4iLAotCQkJCW9wLT5uYW1lKTsKLQkJfQotCX0KLQl1bmxvY2tfa2VybmVsKCk7Ci0Ja2ZyZWUgKGZpbHAtPnByaXZhdGVfZGF0YSk7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG9wZW5wcm9tZnNfcHJvcF9vcHMgPSB7Ci0JLnJlYWQJCT0gcHJvcGVydHlfcmVhZCwKLQkud3JpdGUJCT0gcHJvcGVydHlfd3JpdGUsCi0JLnJlbGVhc2UJPSBwcm9wZXJ0eV9yZWxlYXNlLAorc3RhdGljIHZvaWQgKnByb3BlcnR5X3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqZiwgbG9mZl90ICpwb3MpCit7CisJaWYgKCpwb3MgPT0gMCkKKwkJcmV0dXJuIHBvczsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgKnByb3BlcnR5X25leHQoc3RydWN0IHNlcV9maWxlICpmLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKK3sKKwkoKnBvcykrKzsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgcHJvcGVydHlfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKmYsIHZvaWQgKnYpCit7CisJLyogTm90aGluZyB0byBkbyAqLworfQorCitzdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIHByb3BlcnR5X29wID0geworCS5zdGFydAkJPSBwcm9wZXJ0eV9zdGFydCwKKwkubmV4dAkJPSBwcm9wZXJ0eV9uZXh0LAorCS5zdG9wCQk9IHByb3BlcnR5X3N0b3AsCisJLnNob3cJCT0gcHJvcGVydHlfc2hvdwogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgb3BlbnByb21mc19ub2RlbnVtX29wcyA9IHsKLQkucmVhZAkJPSBub2RlbnVtX3JlYWQsCitzdGF0aWMgaW50IHByb3BlcnR5X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IG9wX2lub2RlX2luZm8gKm9pID0gT1BfSShpbm9kZSk7CisJaW50IHJldDsKKworCUJVR19PTihvaS0+dHlwZSAhPSBvcF9pbm9kZV9wcm9wKTsKKworCXJldCA9IHNlcV9vcGVuKGZpbGUsICZwcm9wZXJ0eV9vcCk7CisJaWYgKCFyZXQpIHsKKwkJc3RydWN0IHNlcV9maWxlICptID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCQltLT5wcml2YXRlID0gb2ktPnUucHJvcDsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgb3BlbnByb21mc19wcm9wX29wcyA9IHsKKwkub3BlbgkJPSBwcm9wZXJ0eV9vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2VxX3JlbGVhc2UsCiB9OwogCitzdGF0aWMgaW50IG9wZW5wcm9tZnNfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqLCB2b2lkICosIGZpbGxkaXJfdCk7CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG9wZW5wcm9tX29wZXJhdGlvbnMgPSB7CiAJLnJlYWQJCT0gZ2VuZXJpY19yZWFkX2RpciwKIAkucmVhZGRpcgk9IG9wZW5wcm9tZnNfcmVhZGRpciwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBvcGVucHJvbV9hbGlhc19pbm9kZV9vcGVyYXRpb25zID0gewotCS5jcmVhdGUJCT0gb3BlbnByb21mc19jcmVhdGUsCi0JLmxvb2t1cAkJPSBvcGVucHJvbWZzX2xvb2t1cCwKLQkudW5saW5rCQk9IG9wZW5wcm9tZnNfdW5saW5rLAotfTsKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpvcGVucHJvbWZzX2xvb2t1cChzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3QgbmFtZWlkYXRhICopOwogCiBzdGF0aWMgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgb3BlbnByb21faW5vZGVfb3BlcmF0aW9ucyA9IHsKIAkubG9va3VwCQk9IG9wZW5wcm9tZnNfbG9va3VwLAogfTsKIAotc3RhdGljIGludCBsb29rdXBfY2hpbGRyZW4odTE2IG4sIGNvbnN0IGNoYXIgKiBuYW1lLCBpbnQgbGVuKQorc3RhdGljIHN0cnVjdCBkZW50cnkgKm9wZW5wcm9tZnNfbG9va3VwKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQogewotCWludCByZXQ7Ci0JdTE2IG5vZGU7Ci0JZm9yICg7IG4gIT0gMHhmZmZmOyBuID0gbm9kZXNbbl0ubmV4dCkgewotCQlub2RlID0gbm9kZXNbbl0uY2hpbGQ7Ci0JCWlmIChub2RlICE9IDB4ZmZmZikgewotCQkJY2hhciBidWZmZXJbMTI4XTsKLQkJCWludCBpOwotCQkJY2hhciAqcDsKLQkJCQotCQkJd2hpbGUgKG5vZGUgIT0gMHhmZmZmKSB7Ci0JCQkJaWYgKHByb21fZ2V0bmFtZSAobm9kZXNbbm9kZV0ubm9kZSwKLQkJCQkJCSAgYnVmZmVyLCAxMjgpID49IDApIHsKLQkJCQkJaSA9IHN0cmxlbiAoYnVmZmVyKTsKLQkJCQkJaWYgKChsZW4gPT0gaSkKLQkJCQkJICAgICYmICFzdHJuY21wIChidWZmZXIsIG5hbWUsIGxlbikpCi0JCQkJCQlyZXR1cm4gTk9ERTJJTk8obm9kZSk7Ci0JCQkJCXAgPSBzdHJjaHIgKGJ1ZmZlciwgJ0AnKTsKLQkJCQkJaWYgKHAgJiYgKGxlbiA9PSBwIC0gYnVmZmVyKQotCQkJCQkgICAgJiYgIXN0cm5jbXAgKGJ1ZmZlciwgbmFtZSwgbGVuKSkKLQkJCQkJCXJldHVybiBOT0RFMklOTyhub2RlKTsKLQkJCQl9Ci0JCQkJbm9kZSA9IG5vZGVzW25vZGVdLm5leHQ7Ci0JCQl9Ci0JCX0gZWxzZQotCQkJY29udGludWU7Ci0JCXJldCA9IGxvb2t1cF9jaGlsZHJlbiAobm9kZXNbbl0uY2hpbGQsIG5hbWUsIGxlbik7Ci0JCWlmIChyZXQpIHJldHVybiByZXQ7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IGRlbnRyeSAqb3BlbnByb21mc19sb29rdXAoc3RydWN0IGlub2RlICogZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQotewotCWludCBpbm8gPSAwOwotI2RlZmluZSBPUEZTTF9ESVIJMAotI2RlZmluZSBPUEZTTF9QUk9QRVJUWQkxCi0jZGVmaW5lIE9QRlNMX05PREVOVU0JMgotCWludCB0eXBlID0gMDsKLQljaGFyIGJ1ZmZlclsxMjhdOwotCWNoYXIgKnA7CisJc3RydWN0IG9wX2lub2RlX2luZm8gKmVudF9vaSwgKm9pID0gT1BfSShkaXIpOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAsICpjaGlsZDsKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisJZW51bSBvcF9pbm9kZV90eXBlIGVudF90eXBlOworCXVuaW9uIG9wX2lub2RlX2RhdGEgZW50X2RhdGE7CiAJY29uc3QgY2hhciAqbmFtZTsKLQl1MzIgbjsKLQl1MTYgZGlybm9kZTsKLQl1bnNpZ25lZCBpbnQgbGVuOwotCWludCBpOwogCXN0cnVjdCBpbm9kZSAqaW5vZGU7Ci0JY2hhciBidWZmZXIyWzY0XTsKKwl1bnNpZ25lZCBpbnQgaW5vOworCWludCBsZW47CiAJCi0JaW5vZGUgPSBOVUxMOworCUJVR19PTihvaS0+dHlwZSAhPSBvcF9pbm9kZV9ub2RlKTsKKworCWRwID0gb2ktPnUubm9kZTsKKwogCW5hbWUgPSBkZW50cnktPmRfbmFtZS5uYW1lOwogCWxlbiA9IGRlbnRyeS0+ZF9uYW1lLmxlbjsKLQlsb2NrX2tlcm5lbCgpOwotCWlmIChuYW1lIFswXSA9PSAnLicgJiYgbGVuID09IDUgJiYgIXN0cm5jbXAgKG5hbWUgKyAxLCAibm9kZSIsIDQpKSB7Ci0JCWlubyA9IE5PREVQMklOTyhOT0RFKGRpci0+aV9pbm8pLmZpcnN0X3Byb3ApOwotCQl0eXBlID0gT1BGU0xfTk9ERU5VTTsKLQl9Ci0JaWYgKCFpbm8pIHsKLQkJdTE2IG5vZGUgPSBOT0RFKGRpci0+aV9pbm8pLmNoaWxkOwotCQl3aGlsZSAobm9kZSAhPSAweGZmZmYpIHsKLQkJCWlmIChwcm9tX2dldG5hbWUgKG5vZGVzW25vZGVdLm5vZGUsIGJ1ZmZlciwgMTI4KSA+PSAwKSB7Ci0JCQkJaSA9IHN0cmxlbiAoYnVmZmVyKTsKLQkJCQlpZiAobGVuID09IGkgJiYgIXN0cm5jbXAgKGJ1ZmZlciwgbmFtZSwgbGVuKSkgewotCQkJCQlpbm8gPSBOT0RFMklOTyhub2RlKTsKLQkJCQkJdHlwZSA9IE9QRlNMX0RJUjsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCXAgPSBzdHJjaHIgKGJ1ZmZlciwgJ0AnKTsKLQkJCQlpZiAocCAmJiAobGVuID09IHAgLSBidWZmZXIpCi0JCQkJICAgICYmICFzdHJuY21wIChidWZmZXIsIG5hbWUsIGxlbikpIHsKLQkJCQkJaW5vID0gTk9ERTJJTk8obm9kZSk7Ci0JCQkJCXR5cGUgPSBPUEZTTF9ESVI7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCW5vZGUgPSBub2Rlc1tub2RlXS5uZXh0OworCisJbXV0ZXhfbG9jaygmb3BfbXV0ZXgpOworCisJY2hpbGQgPSBkcC0+Y2hpbGQ7CisJd2hpbGUgKGNoaWxkKSB7CisJCWludCBuID0gc3RybGVuKGNoaWxkLT5wYXRoX2NvbXBvbmVudF9uYW1lKTsKKworCQlpZiAobGVuID09IG4gJiYKKwkJICAgICFzdHJuY21wKGNoaWxkLT5wYXRoX2NvbXBvbmVudF9uYW1lLCBuYW1lLCBsZW4pKSB7CisJCQllbnRfdHlwZSA9IG9wX2lub2RlX25vZGU7CisJCQllbnRfZGF0YS5ub2RlID0gY2hpbGQ7CisJCQlpbm8gPSBjaGlsZC0+dW5pcXVlX2lkOworCQkJZ290byBmb3VuZDsKIAkJfQorCQljaGlsZCA9IGNoaWxkLT5zaWJsaW5nOwogCX0KLQluID0gTk9ERShkaXItPmlfaW5vKS5ub2RlOwotCWRpcm5vZGUgPSBkaXItPmlfaW5vIC0gT1BFTlBST01fRklSU1RfSU5POwotCWlmICghaW5vKSB7Ci0JCWludCBqID0gTk9ERVAySU5PKE5PREUoZGlyLT5pX2lubykuZmlyc3RfcHJvcCk7Ci0JCWlmIChkaXJub2RlICE9IGFsaWFzZXMpIHsKLQkJCWZvciAocCA9IHByb21fZmlyc3Rwcm9wIChuLCBidWZmZXIyKTsKLQkJCSAgICAgcCAmJiAqcDsKLQkJCSAgICAgcCA9IHByb21fbmV4dHByb3AgKG4sIHAsIGJ1ZmZlcjIpKSB7Ci0JCQkJaisrOwotCQkJCWlmICgobGVuID09IHN0cmxlbiAocCkpCi0JCQkJICAgICYmICFzdHJuY21wIChwLCBuYW1lLCBsZW4pKSB7Ci0JCQkJCWlubyA9IGo7Ci0JCQkJCXR5cGUgPSBPUEZTTF9QUk9QRVJUWTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJaW50IGs7Ci0JCQlmb3IgKGsgPSAwOyBrIDwgYWxpYXNlc19ub2RlczsgaysrKSB7Ci0JCQkJaisrOwotCQkJCWlmIChhbGlhc19uYW1lcyBba10KLQkJCQkgICAgJiYgKGxlbiA9PSBzdHJsZW4gKGFsaWFzX25hbWVzIFtrXSkpCi0JCQkJICAgICYmICFzdHJuY21wIChhbGlhc19uYW1lcyBba10sIG5hbWUsIGxlbikpIHsKLQkJCQkJaW5vID0gajsKLQkJCQkJdHlwZSA9IE9QRlNMX1BST1BFUlRZOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9CisKKwlwcm9wID0gZHAtPnByb3BlcnRpZXM7CisJd2hpbGUgKHByb3ApIHsKKwkJaW50IG4gPSBzdHJsZW4ocHJvcC0+bmFtZSk7CisKKwkJaWYgKGxlbiA9PSBuICYmICFzdHJuY21wKHByb3AtPm5hbWUsIG5hbWUsIGxlbikpIHsKKwkJCWVudF90eXBlID0gb3BfaW5vZGVfcHJvcDsKKwkJCWVudF9kYXRhLnByb3AgPSBwcm9wOworCQkJaW5vID0gcHJvcC0+dW5pcXVlX2lkOworCQkJZ290byBmb3VuZDsKIAkJfQorCisJCXByb3AgPSBwcm9wLT5uZXh0OwogCX0KLQlpZiAoIWlubykgewotCQlpbm8gPSBsb29rdXBfY2hpbGRyZW4gKE5PREUoZGlyLT5pX2lubykuY2hpbGQsIG5hbWUsIGxlbik7Ci0JCWlmIChpbm8pCi0JCQl0eXBlID0gT1BGU0xfRElSOwotCQllbHNlIHsKLQkJCXVubG9ja19rZXJuZWwoKTsKLQkJCXJldHVybiBFUlJfUFRSKC1FTk9FTlQpOwotCQl9Ci0JfQotCWlub2RlID0gaWdldCAoZGlyLT5pX3NiLCBpbm8pOwotCXVubG9ja19rZXJuZWwoKTsKKworCW11dGV4X3VubG9jaygmb3BfbXV0ZXgpOworCXJldHVybiBFUlJfUFRSKC1FTk9FTlQpOworCitmb3VuZDoKKwlpbm9kZSA9IGlnZXQoZGlyLT5pX3NiLCBpbm8pOworCW11dGV4X3VubG9jaygmb3BfbXV0ZXgpOwogCWlmICghaW5vZGUpCiAJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwotCXN3aXRjaCAodHlwZSkgewotCWNhc2UgT1BGU0xfRElSOgorCWVudF9vaSA9IE9QX0koaW5vZGUpOworCWVudF9vaS0+dHlwZSA9IGVudF90eXBlOworCWVudF9vaS0+dSA9IGVudF9kYXRhOworCisJc3dpdGNoIChlbnRfdHlwZSkgeworCWNhc2Ugb3BfaW5vZGVfbm9kZToKIAkJaW5vZGUtPmlfbW9kZSA9IFNfSUZESVIgfCBTX0lSVUdPIHwgU19JWFVHTzsKLQkJaWYgKGlubyA9PSBPUEVOUFJPTV9GSVJTVF9JTk8gKyBhbGlhc2VzKSB7Ci0JCQlpbm9kZS0+aV9tb2RlIHw9IFNfSVdVU1I7Ci0JCQlpbm9kZS0+aV9vcCA9ICZvcGVucHJvbV9hbGlhc19pbm9kZV9vcGVyYXRpb25zOwotCQl9IGVsc2UKLQkJCWlub2RlLT5pX29wID0gJm9wZW5wcm9tX2lub2RlX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX29wID0gJm9wZW5wcm9tX2lub2RlX29wZXJhdGlvbnM7CiAJCWlub2RlLT5pX2ZvcCA9ICZvcGVucHJvbV9vcGVyYXRpb25zOwogCQlpbm9kZS0+aV9ubGluayA9IDI7CiAJCWJyZWFrOwotCWNhc2UgT1BGU0xfTk9ERU5VTToKLQkJaW5vZGUtPmlfbW9kZSA9IFNfSUZSRUcgfCBTX0lSVUdPOwotCQlpbm9kZS0+aV9mb3AgPSAmb3BlbnByb21mc19ub2RlbnVtX29wczsKLQkJaW5vZGUtPmlfbmxpbmsgPSAxOwotCQlpbm9kZS0+dS5nZW5lcmljX2lwID0gKHZvaWQgKikobG9uZykobik7Ci0JCWJyZWFrOwotCWNhc2UgT1BGU0xfUFJPUEVSVFk6Ci0JCWlmICgoZGlybm9kZSA9PSBvcHRpb25zKSAmJiAobGVuID09IDE3KQotCQkgICAgJiYgIXN0cm5jbXAgKG5hbWUsICJzZWN1cml0eS1wYXNzd29yZCIsIDE3KSkKKwljYXNlIG9wX2lub2RlX3Byb3A6CisJCWlmICghc3RyY21wKGRwLT5uYW1lLCAib3B0aW9ucyIpICYmIChsZW4gPT0gMTcpICYmCisJCSAgICAhc3RybmNtcCAobmFtZSwgInNlY3VyaXR5LXBhc3N3b3JkIiwgMTcpKQogCQkJaW5vZGUtPmlfbW9kZSA9IFNfSUZSRUcgfCBTX0lSVVNSIHwgU19JV1VTUjsKLQkJZWxzZSB7CisJCWVsc2UKIAkJCWlub2RlLT5pX21vZGUgPSBTX0lGUkVHIHwgU19JUlVHTzsKLQkJCWlmIChkaXJub2RlID09IG9wdGlvbnMgfHwgZGlybm9kZSA9PSBhbGlhc2VzKSB7Ci0JCQkJaWYgKGxlbiAhPSA0IHx8IHN0cm5jbXAgKG5hbWUsICJuYW1lIiwgNCkpCi0JCQkJCWlub2RlLT5pX21vZGUgfD0gU19JV1VTUjsKLQkJCX0KLQkJfQogCQlpbm9kZS0+aV9mb3AgPSAmb3BlbnByb21mc19wcm9wX29wczsKIAkJaW5vZGUtPmlfbmxpbmsgPSAxOwotCQlpZiAoaW5vZGUtPmlfc2l6ZSA8IDApCi0JCQlpbm9kZS0+aV9zaXplID0gMDsKLQkJaW5vZGUtPnUuZ2VuZXJpY19pcCA9ICh2b2lkICopKGxvbmcpKCgodTE2KWRpcm5vZGUpIHwgCi0JCQkoKCh1MTYpKGlubyAtIE5PREVQMklOTyhOT0RFKGRpci0+aV9pbm8pLmZpcnN0X3Byb3ApIC0gMSkpIDw8IDE2KSk7CisJCWlub2RlLT5pX3NpemUgPSBlbnRfb2ktPnUucHJvcC0+bGVuZ3RoOwogCQlicmVhazsKIAl9CiAKQEAgLTc3NSwyMzcgKzI2Myw4OSBAQAogc3RhdGljIGludCBvcGVucHJvbWZzX3JlYWRkaXIoc3RydWN0IGZpbGUgKiBmaWxwLCB2b2lkICogZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpcikKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IG9wX2lub2RlX2luZm8gKm9pID0gT1BfSShpbm9kZSk7CisJc3RydWN0IGRldmljZV9ub2RlICpkcCA9IG9pLT51Lm5vZGU7CisJc3RydWN0IGRldmljZV9ub2RlICpjaGlsZDsKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CiAJdW5zaWduZWQgaW50IGlubzsKLQl1MzIgbjsKLQlpbnQgaSwgajsKLQljaGFyIGJ1ZmZlclsxMjhdOwotCXUxNiBub2RlOwotCWNoYXIgKnA7Ci0JY2hhciBidWZmZXIyWzY0XTsKKwlpbnQgaTsKIAotCWxvY2tfa2VybmVsKCk7CisJbXV0ZXhfbG9jaygmb3BfbXV0ZXgpOwogCQogCWlubyA9IGlub2RlLT5pX2lubzsKIAlpID0gZmlscC0+Zl9wb3M7CiAJc3dpdGNoIChpKSB7CiAJY2FzZSAwOgotCQlpZiAoZmlsbGRpcihkaXJlbnQsICIuIiwgMSwgaSwgaW5vLCBEVF9ESVIpIDwgMCkgZ290byBvdXQ7CisJCWlmIChmaWxsZGlyKGRpcmVudCwgIi4iLCAxLCBpLCBpbm8sIERUX0RJUikgPCAwKQorCQkJZ290byBvdXQ7CiAJCWkrKzsKIAkJZmlscC0+Zl9wb3MrKzsKIAkJLyogZmFsbCB0aHJ1ICovCiAJY2FzZSAxOgotCQlpZiAoZmlsbGRpcihkaXJlbnQsICIuLiIsIDIsIGksIAotCQkJKE5PREUoaW5vKS5wYXJlbnQgPT0gMHhmZmZmKSA/IAotCQkJT1BFTlBST01fUk9PVF9JTk8gOiBOT0RFMklOTyhOT0RFKGlubykucGFyZW50KSwgRFRfRElSKSA8IDApIAorCQlpZiAoZmlsbGRpcihkaXJlbnQsICIuLiIsIDIsIGksCisJCQkgICAgKGRwLT5wYXJlbnQgPT0gTlVMTCA/CisJCQkgICAgIE9QRU5QUk9NX1JPT1RfSU5PIDoKKwkJCSAgICAgZHAtPnBhcmVudC0+dW5pcXVlX2lkKSwgRFRfRElSKSA8IDApIAogCQkJZ290byBvdXQ7CiAJCWkrKzsKIAkJZmlscC0+Zl9wb3MrKzsKIAkJLyogZmFsbCB0aHJ1ICovCiAJZGVmYXVsdDoKIAkJaSAtPSAyOwotCQlub2RlID0gTk9ERShpbm8pLmNoaWxkOwotCQl3aGlsZSAoaSAmJiBub2RlICE9IDB4ZmZmZikgewotCQkJbm9kZSA9IG5vZGVzW25vZGVdLm5leHQ7CisKKwkJLyogRmlyc3QsIHRoZSBjaGlsZHJlbiBub2RlcyBhcyBkaXJlY3Rvcmllcy4gICovCisJCWNoaWxkID0gZHAtPmNoaWxkOworCQl3aGlsZSAoaSAmJiBjaGlsZCkgeworCQkJY2hpbGQgPSBjaGlsZC0+c2libGluZzsKIAkJCWktLTsKIAkJfQotCQl3aGlsZSAobm9kZSAhPSAweGZmZmYpIHsKLQkJCWlmIChwcm9tX2dldG5hbWUgKG5vZGVzW25vZGVdLm5vZGUsIGJ1ZmZlciwgMTI4KSA8IDApCisJCXdoaWxlIChjaGlsZCkgeworCQkJaWYgKGZpbGxkaXIoZGlyZW50LAorCQkJCSAgICBjaGlsZC0+cGF0aF9jb21wb25lbnRfbmFtZSwKKwkJCQkgICAgc3RybGVuKGNoaWxkLT5wYXRoX2NvbXBvbmVudF9uYW1lKSwKKwkJCQkgICAgZmlscC0+Zl9wb3MsIGNoaWxkLT51bmlxdWVfaWQsIERUX0RJUikgPCAwKQogCQkJCWdvdG8gb3V0OwotCQkJaWYgKGZpbGxkaXIoZGlyZW50LCBidWZmZXIsIHN0cmxlbihidWZmZXIpLAotCQkJCSAgICBmaWxwLT5mX3BvcywgTk9ERTJJTk8obm9kZSksIERUX0RJUikgPCAwKQotCQkJCWdvdG8gb3V0OworCiAJCQlmaWxwLT5mX3BvcysrOwotCQkJbm9kZSA9IG5vZGVzW25vZGVdLm5leHQ7CisJCQljaGlsZCA9IGNoaWxkLT5zaWJsaW5nOwogCQl9Ci0JCWogPSBOT0RFUDJJTk8oTk9ERShpbm8pLmZpcnN0X3Byb3ApOwotCQlpZiAoIWkpIHsKLQkJCWlmIChmaWxsZGlyKGRpcmVudCwgIi5ub2RlIiwgNSwgZmlscC0+Zl9wb3MsIGosIERUX1JFRykgPCAwKQotCQkJCWdvdG8gb3V0OwotCQkJZmlscC0+Zl9wb3MrKzsKLQkJfSBlbHNlCisKKwkJLyogTmV4dCwgdGhlIHByb3BlcnRpZXMgYXMgZmlsZXMuICAqLworCQlwcm9wID0gZHAtPnByb3BlcnRpZXM7CisJCXdoaWxlIChpICYmIHByb3ApIHsKKwkJCXByb3AgPSBwcm9wLT5uZXh0OwogCQkJaS0tOwotCQluID0gTk9ERShpbm8pLm5vZGU7Ci0JCWlmIChpbm8gPT0gT1BFTlBST01fRklSU1RfSU5PICsgYWxpYXNlcykgewotCQkJZm9yIChqKys7IGkgPCBhbGlhc2VzX25vZGVzOyBpKyssIGorKykgewotCQkJCWlmIChhbGlhc19uYW1lcyBbaV0pIHsKLQkJCQkJaWYgKGZpbGxkaXIgKGRpcmVudCwgYWxpYXNfbmFtZXMgW2ldLCAKLQkJCQkJCXN0cmxlbiAoYWxpYXNfbmFtZXMgW2ldKSwgCi0JCQkJCQlmaWxwLT5mX3BvcywgaiwgRFRfUkVHKSA8IDApIGdvdG8gb3V0OyAKLQkJCQkJZmlscC0+Zl9wb3MrKzsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlmb3IgKHAgPSBwcm9tX2ZpcnN0cHJvcCAobiwgYnVmZmVyMik7Ci0JCQkgICAgIHAgJiYgKnA7Ci0JCQkgICAgIHAgPSBwcm9tX25leHRwcm9wIChuLCBwLCBidWZmZXIyKSkgewotCQkJCWorKzsKLQkJCQlpZiAoaSkgaS0tOwotCQkJCWVsc2UgewotCQkJCQlpZiAoZmlsbGRpcihkaXJlbnQsIHAsIHN0cmxlbihwKSwKLQkJCQkJCSAgICBmaWxwLT5mX3BvcywgaiwgRFRfUkVHKSA8IDApCi0JCQkJCQlnb3RvIG91dDsKLQkJCQkJZmlscC0+Zl9wb3MrKzsKLQkJCQl9Ci0JCQl9CisJCX0KKwkJd2hpbGUgKHByb3ApIHsKKwkJCWlmIChmaWxsZGlyKGRpcmVudCwgcHJvcC0+bmFtZSwgc3RybGVuKHByb3AtPm5hbWUpLAorCQkJCSAgICBmaWxwLT5mX3BvcywgcHJvcC0+dW5pcXVlX2lkLCBEVF9SRUcpIDwgMCkKKwkJCQlnb3RvIG91dDsKKworCQkJZmlscC0+Zl9wb3MrKzsKKwkJCXByb3AgPSBwcm9wLT5uZXh0OwogCQl9CiAJfQogb3V0OgotCXVubG9ja19rZXJuZWwoKTsKKwltdXRleF91bmxvY2soJm9wX211dGV4KTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBvcGVucHJvbWZzX2NyZWF0ZSAoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUsCi0JCXN0cnVjdCBuYW1laWRhdGEgKm5kKQorc3RhdGljIGttZW1fY2FjaGVfdCAqb3BfaW5vZGVfY2FjaGVwOworCitzdGF0aWMgc3RydWN0IGlub2RlICpvcGVucHJvbV9hbGxvY19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewotCWNoYXIgKnA7Ci0Jc3RydWN0IGlub2RlICppbm9kZTsKLQkKLQlpZiAoIWRpcikKLQkJcmV0dXJuIC1FTk9FTlQ7Ci0JaWYgKGRlbnRyeS0+ZF9uYW1lLmxlbiA+IDI1NikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JcCA9IGttYWxsb2MgKGRlbnRyeS0+ZF9uYW1lLmxlbiArIDEsIEdGUF9LRVJORUwpOwotCWlmICghcCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0Jc3RybmNweSAocCwgZGVudHJ5LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubGVuKTsKLQlwIFtkZW50cnktPmRfbmFtZS5sZW5dID0gMDsKLQlsb2NrX2tlcm5lbCgpOwotCWlmIChhbGlhc2VzX25vZGVzID09IEFMSUFTRVNfTk5PREVTKSB7Ci0JCWtmcmVlKHApOwotCQl1bmxvY2tfa2VybmVsKCk7Ci0JCXJldHVybiAtRUlPOwotCX0KLQlhbGlhc19uYW1lcyBbYWxpYXNlc19ub2RlcysrXSA9IHA7Ci0JaW5vZGUgPSBpZ2V0IChkaXItPmlfc2IsCi0JCQlOT0RFUDJJTk8oTk9ERShkaXItPmlfaW5vKS5maXJzdF9wcm9wKSArIGFsaWFzZXNfbm9kZXMpOwotCWlmICghaW5vZGUpIHsKLQkJdW5sb2NrX2tlcm5lbCgpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JaW5vZGUtPmlfbW9kZSA9IFNfSUZSRUcgfCBTX0lSVUdPIHwgU19JV1VTUjsKLQlpbm9kZS0+aV9mb3AgPSAmb3BlbnByb21mc19wcm9wX29wczsKLQlpbm9kZS0+aV9ubGluayA9IDE7Ci0JaWYgKGlub2RlLT5pX3NpemUgPCAwKSBpbm9kZS0+aV9zaXplID0gMDsKLQlpbm9kZS0+dS5nZW5lcmljX2lwID0gKHZvaWQgKikobG9uZykoKCh1MTYpYWxpYXNlcykgfCAKLQkJCSgoKHUxNikoYWxpYXNlc19ub2RlcyAtIDEpKSA8PCAxNikpOwotCXVubG9ja19rZXJuZWwoKTsKLQlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOwotCXJldHVybiAwOworCXN0cnVjdCBvcF9pbm9kZV9pbmZvICpvaTsKKworCW9pID0ga21lbV9jYWNoZV9hbGxvYyhvcF9pbm9kZV9jYWNoZXAsIFNMQUJfS0VSTkVMKTsKKwlpZiAoIW9pKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiAmb2ktPnZmc19pbm9kZTsKIH0KIAotc3RhdGljIGludCBvcGVucHJvbWZzX3VubGluayAoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3N0YXRpYyB2b2lkIG9wZW5wcm9tX2Rlc3Ryb3lfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKIHsKLQl1bnNpZ25lZCBpbnQgbGVuOwotCWNoYXIgKnA7Ci0JY29uc3QgY2hhciAqbmFtZTsKLQlpbnQgaTsKLQkKLQluYW1lID0gZGVudHJ5LT5kX25hbWUubmFtZTsKLQlsZW4gPSBkZW50cnktPmRfbmFtZS5sZW47Ci0JbG9ja19rZXJuZWwoKTsKLQlmb3IgKGkgPSAwOyBpIDwgYWxpYXNlc19ub2RlczsgaSsrKQotCQlpZiAoKHN0cmxlbiAoYWxpYXNfbmFtZXMgW2ldKSA9PSBsZW4pCi0JCSAgICAmJiAhc3RybmNtcCAobmFtZSwgYWxpYXNfbmFtZXNbaV0sIGxlbikpIHsKLQkJCWNoYXIgYnVmZmVyWzUxMl07Ci0JCQkKLQkJCXAgPSBhbGlhc19uYW1lcyBbaV07Ci0JCQlhbGlhc19uYW1lcyBbaV0gPSBOVUxMOwotCQkJa2ZyZWUgKHApOwotCQkJc3RyY3B5IChidWZmZXIsICJudnVuYWxpYXMgIik7Ci0JCQltZW1jcHkgKGJ1ZmZlciArIDEwLCBuYW1lLCBsZW4pOwotCQkJYnVmZmVyIFsxMCArIGxlbl0gPSAwOwotCQkJcHJvbV9mZXZhbCAoYnVmZmVyKTsKLQkJfQotCXVubG9ja19rZXJuZWwoKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoge3t7IGluaXQgc2VjdGlvbiAqLwotc3RhdGljIGludCBfX2luaXQgY2hlY2tfc3BhY2UgKHUxNiBuKQotewotCXVuc2lnbmVkIGxvbmcgcGFnZXM7Ci0KLQlpZiAoKDEgPDwgYWxsb2NlZCkgKiBQQUdFX1NJWkUgPCAobiArIDIpICogc2l6ZW9mKG9wZW5wcm9tZnNfbm9kZSkpIHsKLQkJcGFnZXMgPSBfX2dldF9mcmVlX3BhZ2VzIChHRlBfS0VSTkVMLCBhbGxvY2VkICsgMSk7Ci0JCWlmICghcGFnZXMpCi0JCQlyZXR1cm4gLTE7Ci0KLQkJaWYgKG5vZGVzKSB7Ci0JCQltZW1jcHkgKChjaGFyICopcGFnZXMsIChjaGFyICopbm9kZXMsCi0JCQkJKDEgPDwgYWxsb2NlZCkgKiBQQUdFX1NJWkUpOwotCQkJZnJlZV9wYWdlcyAoKHVuc2lnbmVkIGxvbmcpbm9kZXMsIGFsbG9jZWQpOwotCQl9Ci0JCWFsbG9jZWQrKzsKLQkJbm9kZXMgPSAob3BlbnByb21mc19ub2RlICopcGFnZXM7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdTE2IF9faW5pdCBnZXRfbm9kZXMgKHUxNiBwYXJlbnQsIHUzMiBub2RlKQotewotCWNoYXIgKnA7Ci0JdTE2IG4gPSBsYXN0X25vZGUrKywgaTsKLQljaGFyIGJ1ZmZlcls2NF07Ci0KLQlpZiAoY2hlY2tfc3BhY2UgKG4pIDwgMCkKLQkJcmV0dXJuIDB4ZmZmZjsKLQlub2Rlc1tuXS5wYXJlbnQgPSBwYXJlbnQ7Ci0Jbm9kZXNbbl0ubm9kZSA9IG5vZGU7Ci0Jbm9kZXNbbl0ubmV4dCA9IDB4ZmZmZjsKLQlub2Rlc1tuXS5jaGlsZCA9IDB4ZmZmZjsKLQlub2Rlc1tuXS5maXJzdF9wcm9wID0gZmlyc3RfcHJvcCsrOwotCWlmICghcGFyZW50KSB7Ci0JCWNoYXIgYnVmZmVyWzhdOwotCQlpbnQgajsKLQkJCi0JCWlmICgoaiA9IHByb21fZ2V0cHJvcGVydHkgKG5vZGUsICJuYW1lIiwgYnVmZmVyLCA4KSkgPj0gMCkgewotCQkgICAgYnVmZmVyW2pdID0gMDsKLQkJICAgIGlmICghc3RyY21wIChidWZmZXIsICJvcHRpb25zIikpCi0JCQlvcHRpb25zID0gbjsKLQkJICAgIGVsc2UgaWYgKCFzdHJjbXAgKGJ1ZmZlciwgImFsaWFzZXMiKSkKLQkJICAgICAgICBhbGlhc2VzID0gbjsKLQkJfQotCX0KLQlpZiAobiAhPSBhbGlhc2VzKQotCQlmb3IgKHAgPSBwcm9tX2ZpcnN0cHJvcCAobm9kZSwgYnVmZmVyKTsKLQkJICAgICBwICYmIHAgIT0gKGNoYXIgKiktMSAmJiAqcDsKLQkJICAgICBwID0gcHJvbV9uZXh0cHJvcCAobm9kZSwgcCwgYnVmZmVyKSkKLQkJCWZpcnN0X3Byb3ArKzsKLQllbHNlIHsKLQkJY2hhciAqcTsKLQkJZm9yIChwID0gcHJvbV9maXJzdHByb3AgKG5vZGUsIGJ1ZmZlcik7Ci0JCSAgICAgcCAmJiBwICE9IChjaGFyICopLTEgJiYgKnA7Ci0JCSAgICAgcCA9IHByb21fbmV4dHByb3AgKG5vZGUsIHAsIGJ1ZmZlcikpIHsKLQkJCWlmIChhbGlhc2VzX25vZGVzID09IEFMSUFTRVNfTk5PREVTKQotCQkJCWJyZWFrOwotCQkJZm9yIChpID0gMDsgaSA8IGFsaWFzZXNfbm9kZXM7IGkrKykKLQkJCQlpZiAoIXN0cmNtcCAocCwgYWxpYXNfbmFtZXMgW2ldKSkKLQkJCQkJYnJlYWs7Ci0JCQlpZiAoaSA8IGFsaWFzZXNfbm9kZXMpCi0JCQkJY29udGludWU7Ci0JCQlxID0ga21hbGxvYyAoc3RybGVuIChwKSArIDEsIEdGUF9LRVJORUwpOwotCQkJaWYgKCFxKQotCQkJCXJldHVybiAweGZmZmY7Ci0JCQlzdHJjcHkgKHEsIHApOwotCQkJYWxpYXNfbmFtZXMgW2FsaWFzZXNfbm9kZXMrK10gPSBxOwotCQl9Ci0JCWZpcnN0X3Byb3AgKz0gQUxJQVNFU19OTk9ERVM7Ci0JfQotCW5vZGUgPSBwcm9tX2dldGNoaWxkIChub2RlKTsKLQlpZiAobm9kZSkgewotCQlwYXJlbnQgPSBnZXRfbm9kZXMgKG4sIG5vZGUpOwotCQlpZiAocGFyZW50ID09IDB4ZmZmZikKLQkJCXJldHVybiAweGZmZmY7Ci0JCW5vZGVzW25dLmNoaWxkID0gcGFyZW50OwotCQl3aGlsZSAoKG5vZGUgPSBwcm9tX2dldHNpYmxpbmcgKG5vZGUpKSAhPSAwKSB7Ci0JCQlpID0gZ2V0X25vZGVzIChuLCBub2RlKTsKLQkJCWlmIChpID09IDB4ZmZmZikKLQkJCQlyZXR1cm4gMHhmZmZmOwotCQkJbm9kZXNbcGFyZW50XS5uZXh0ID0gaTsKLQkJCXBhcmVudCA9IGk7Ci0JCX0KLQl9Ci0JcmV0dXJuIG47CisJa21lbV9jYWNoZV9mcmVlKG9wX2lub2RlX2NhY2hlcCwgT1BfSShpbm9kZSkpOwogfQogCiBzdGF0aWMgdm9pZCBvcGVucHJvbV9yZWFkX2lub2RlKHN0cnVjdCBpbm9kZSAqIGlub2RlKQpAQCAtMTAyNSw2ICszNjUsOCBAQAogfQogCiBzdGF0aWMgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgb3BlbnByb21fc29wcyA9IHsgCisJLmFsbG9jX2lub2RlCT0gb3BlbnByb21fYWxsb2NfaW5vZGUsCisJLmRlc3Ryb3lfaW5vZGUJPSBvcGVucHJvbV9kZXN0cm95X2lub2RlLAogCS5yZWFkX2lub2RlCT0gb3BlbnByb21fcmVhZF9pbm9kZSwKIAkuc3RhdGZzCQk9IHNpbXBsZV9zdGF0ZnMsCiAJLnJlbW91bnRfZnMJPSBvcGVucHJvbV9yZW1vdW50LApAQCAtMTAzMiw3ICszNzQsOCBAQAogCiBzdGF0aWMgaW50IG9wZW5wcm9tX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCB2b2lkICpkYXRhLCBpbnQgc2lsZW50KQogewotCXN0cnVjdCBpbm9kZSAqIHJvb3RfaW5vZGU7CisJc3RydWN0IGlub2RlICpyb290X2lub2RlOworCXN0cnVjdCBvcF9pbm9kZV9pbmZvICpvaTsKIAogCXMtPnNfZmxhZ3MgfD0gTVNfTk9BVElNRTsKIAlzLT5zX2Jsb2Nrc2l6ZSA9IDEwMjQ7CkBAIC0xMDQzLDYgKzM4NiwxMSBAQAogCXJvb3RfaW5vZGUgPSBpZ2V0KHMsIE9QRU5QUk9NX1JPT1RfSU5PKTsKIAlpZiAoIXJvb3RfaW5vZGUpCiAJCWdvdG8gb3V0X25vX3Jvb3Q7CisKKwlvaSA9IE9QX0kocm9vdF9pbm9kZSk7CisJb2ktPnR5cGUgPSBvcF9pbm9kZV9ub2RlOworCW9pLT51Lm5vZGUgPSBvZl9maW5kX25vZGVfYnlfcGF0aCgiLyIpOworCiAJcy0+c19yb290ID0gZF9hbGxvY19yb290KHJvb3RfaW5vZGUpOwogCWlmICghcy0+c19yb290KQogCQlnb3RvIG91dF9ub19yb290OwpAQCAtMTA2NywyOSArNDE1LDM5IEBACiAJLmtpbGxfc2IJPSBraWxsX2Fub25fc3VwZXIsCiB9OwogCitzdGF0aWMgdm9pZCBvcF9pbm9kZV9pbml0X29uY2Uodm9pZCAqZGF0YSwga21lbV9jYWNoZV90ICogY2FjaGVwLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXN0cnVjdCBvcF9pbm9kZV9pbmZvICpvaSA9IChzdHJ1Y3Qgb3BfaW5vZGVfaW5mbyAqKSBkYXRhOworCisJaWYgKChmbGFncyAmIChTTEFCX0NUT1JfVkVSSUZZfFNMQUJfQ1RPUl9DT05TVFJVQ1RPUikpID09CisJICAgIFNMQUJfQ1RPUl9DT05TVFJVQ1RPUikKKwkJaW5vZGVfaW5pdF9vbmNlKCZvaS0+dmZzX2lub2RlKTsKK30KKwogc3RhdGljIGludCBfX2luaXQgaW5pdF9vcGVucHJvbV9mcyh2b2lkKQogewotCW5vZGVzID0gKG9wZW5wcm9tZnNfbm9kZSAqKV9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCwgMCk7Ci0JaWYgKCFub2RlcykgewotCQlwcmludGsgKEtFUk5fV0FSTklORyAib3BlbnByb21mczogY2FuJ3QgZ2V0IGZyZWUgcGFnZVxuIik7Ci0JCXJldHVybiAtRUlPOwotCX0KLQlpZiAoZ2V0X25vZGVzICgweGZmZmYsIHByb21fcm9vdF9ub2RlKSA9PSAweGZmZmYpIHsKLQkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIm9wZW5wcm9tZnM6IGNvdWxkbid0IHNldHVwIHRyZWVcbiIpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0Jbm9kZXNbbGFzdF9ub2RlXS5maXJzdF9wcm9wID0gZmlyc3RfcHJvcDsKLQlyZXR1cm4gcmVnaXN0ZXJfZmlsZXN5c3RlbSgmb3BlbnByb21fZnNfdHlwZSk7CisJaW50IGVycjsKKworCW9wX2lub2RlX2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJvcF9pbm9kZV9jYWNoZSIsCisJCQkJCSAgICBzaXplb2Yoc3RydWN0IG9wX2lub2RlX2luZm8pLAorCQkJCQkgICAgMCwKKwkJCQkJICAgIChTTEFCX1JFQ0xBSU1fQUNDT1VOVCB8CisJCQkJCSAgICAgU0xBQl9NRU1fU1BSRUFEKSwKKwkJCQkJICAgIG9wX2lub2RlX2luaXRfb25jZSwgTlVMTCk7CisJaWYgKCFvcF9pbm9kZV9jYWNoZXApCisJCXJldHVybiAtRU5PTUVNOworCisJZXJyID0gcmVnaXN0ZXJfZmlsZXN5c3RlbSgmb3BlbnByb21fZnNfdHlwZSk7CisJaWYgKGVycikKKwkJa21lbV9jYWNoZV9kZXN0cm95KG9wX2lub2RlX2NhY2hlcCk7CisKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9vcGVucHJvbV9mcyh2b2lkKQogewotCWludCBpOwogCXVucmVnaXN0ZXJfZmlsZXN5c3RlbSgmb3BlbnByb21fZnNfdHlwZSk7Ci0JZnJlZV9wYWdlcyAoKHVuc2lnbmVkIGxvbmcpbm9kZXMsIGFsbG9jZWQpOwotCWZvciAoaSA9IDA7IGkgPCBhbGlhc2VzX25vZGVzOyBpKyspCi0JCWtmcmVlIChhbGlhc19uYW1lcyBbaV0pOwotCW5vZGVzID0gTlVMTDsKKwlrbWVtX2NhY2hlX2Rlc3Ryb3kob3BfaW5vZGVfY2FjaGVwKTsKIH0KIAogbW9kdWxlX2luaXQoaW5pdF9vcGVucHJvbV9mcykKZGlmZiAtLWdpdCBhL2ZzL3Bub2RlLmMgYi9mcy9wbm9kZS5jCmluZGV4IDM3YjU2OGUuLmRhNDJlZTYgMTAwNjQ0Ci0tLSBhL2ZzL3Bub2RlLmMKKysrIGIvZnMvcG5vZGUuYwpAQCAtNTMsOCArNTMsNyBAQAogCWlmIChtYXN0ZXIpIHsKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeShzbGF2ZV9tbnQsICZtbnQtPm1udF9zbGF2ZV9saXN0LCBtbnRfc2xhdmUpCiAJCQlzbGF2ZV9tbnQtPm1udF9tYXN0ZXIgPSBtYXN0ZXI7Ci0JCWxpc3RfZGVsKCZtbnQtPm1udF9zbGF2ZSk7Ci0JCWxpc3RfYWRkKCZtbnQtPm1udF9zbGF2ZSwgJm1hc3Rlci0+bW50X3NsYXZlX2xpc3QpOworCQlsaXN0X21vdmUoJm1udC0+bW50X3NsYXZlLCAmbWFzdGVyLT5tbnRfc2xhdmVfbGlzdCk7CiAJCWxpc3Rfc3BsaWNlKCZtbnQtPm1udF9zbGF2ZV9saXN0LCBtYXN0ZXItPm1udF9zbGF2ZV9saXN0LnByZXYpOwogCQlJTklUX0xJU1RfSEVBRCgmbW50LT5tbnRfc2xhdmVfbGlzdCk7CiAJfSBlbHNlIHsKQEAgLTI4MywxMCArMjgyLDggQEAKIAkJICogdW1vdW50IHRoZSBjaGlsZCBvbmx5IGlmIHRoZSBjaGlsZCBoYXMgbm8KIAkJICogb3RoZXIgY2hpbGRyZW4KIAkJICovCi0JCWlmIChjaGlsZCAmJiBsaXN0X2VtcHR5KCZjaGlsZC0+bW50X21vdW50cykpIHsKLQkJCWxpc3RfZGVsKCZjaGlsZC0+bW50X2hhc2gpOwotCQkJbGlzdF9hZGRfdGFpbCgmY2hpbGQtPm1udF9oYXNoLCAmbW50LT5tbnRfaGFzaCk7Ci0JCX0KKwkJaWYgKGNoaWxkICYmIGxpc3RfZW1wdHkoJmNoaWxkLT5tbnRfbW91bnRzKSkKKwkJCWxpc3RfbW92ZV90YWlsKCZjaGlsZC0+bW50X2hhc2gsICZtbnQtPm1udF9oYXNoKTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL3Byb2MvYmFzZS5jIGIvZnMvcHJvYy9iYXNlLmMKaW5kZXggNmFmZmY3Mi4uNmJhNzc4NSAxMDA2NDQKLS0tIGEvZnMvcHJvYy9iYXNlLmMKKysrIGIvZnMvcHJvYy9iYXNlLmMKQEAgLTc0LDYgKzc0LDE2IEBACiAjaW5jbHVkZSA8bGludXgvcG9sbC5oPgogI2luY2x1ZGUgImludGVybmFsLmgiCiAKKy8qIE5PVEU6CisgKglJbXBsZW1lbnRpbmcgaW5vZGUgcGVybWlzc2lvbiBvcGVyYXRpb25zIGluIC9wcm9jIGlzIGFsbW9zdAorICoJY2VydGFpbmx5IGFuIGVycm9yLiAgUGVybWlzc2lvbiBjaGVja3MgbmVlZCB0byBoYXBwZW4gZHVyaW5nCisgKgllYWNoIHN5c3RlbSBjYWxsIG5vdCBhdCBvcGVuIHRpbWUuICBUaGUgcmVhc29uIGlzIHRoYXQgbW9zdCBvZgorICoJd2hhdCB3ZSB3aXNoIHRvIGNoZWNrIGZvciBwZXJtaXNzaW9ucyBpbiAvcHJvYyB2YXJpZXMgYXQgcnVudGltZS4KKyAqCisgKglUaGUgY2xhc3NpYyBleGFtcGxlIG9mIGEgcHJvYmxlbSBpcyBvcGVuaW5nIGZpbGUgZGVzY3JpcHRvcnMKKyAqCWluIC9wcm9jIGZvciBhIHRhc2sgYmVmb3JlIGl0IGV4ZWNzIGEgc3VpZCBleGVjdXRhYmxlLgorICovCisKIC8qCiAgKiBGb3IgaHlzdGVyaWNhbCByYWlzaW5zIHdlIGtlZXAgdGhlIHNhbWUgaW51bWJlcnMgYXMgaW4gdGhlIG9sZCBwcm9jZnMuCiAgKiBGZWVsIGZyZWUgdG8gY2hhbmdlIHRoZSBtYWNybyBiZWxvdyAtIGp1c3Qga2VlcCB0aGUgcmFuZ2UgZGlzdGluY3QgZnJvbQpAQCAtMTIxLDYgKzEzMSw4IEBACiAJUFJPQ19UR0lEX0FUVFJfUFJFViwKIAlQUk9DX1RHSURfQVRUUl9FWEVDLAogCVBST0NfVEdJRF9BVFRSX0ZTQ1JFQVRFLAorCVBST0NfVEdJRF9BVFRSX0tFWUNSRUFURSwKKwlQUk9DX1RHSURfQVRUUl9TT0NLQ1JFQVRFLAogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0FVRElUU1lTQ0FMTAogCVBST0NfVEdJRF9MT0dJTlVJRCwKQEAgLTE2Miw2ICsxNzQsOCBAQAogCVBST0NfVElEX0FUVFJfUFJFViwKIAlQUk9DX1RJRF9BVFRSX0VYRUMsCiAJUFJPQ19USURfQVRUUl9GU0NSRUFURSwKKwlQUk9DX1RJRF9BVFRSX0tFWUNSRUFURSwKKwlQUk9DX1RJRF9BVFRSX1NPQ0tDUkVBVEUsCiAjZW5kaWYKICNpZmRlZiBDT05GSUdfQVVESVRTWVNDQUxMCiAJUFJPQ19USURfTE9HSU5VSUQsCkBAIC0xNzMsNiArMTg3LDkgQEAKIAlQUk9DX1RJRF9GRF9ESVIgPSAweDgwMDAsCS8qIDB4ODAwMC0weGZmZmYgKi8KIH07CiAKKy8qIFdvcnN0IGNhc2UgYnVmZmVyIHNpemUgbmVlZGVkIGZvciBob2xkaW5nIGFuIGludGVnZXIuICovCisjZGVmaW5lIFBST0NfTlVNQlVGIDEwCisKIHN0cnVjdCBwaWRfZW50cnkgewogCWludCB0eXBlOwogCWludCBsZW47CkBAIC0yNzUsNiArMjkyLDggQEAKIAlFKFBST0NfVEdJRF9BVFRSX1BSRVYsICAgICAicHJldiIsICAgICBTX0lGUkVHfFNfSVJVR08pLAogCUUoUFJPQ19UR0lEX0FUVFJfRVhFQywgICAgICJleGVjIiwgICAgIFNfSUZSRUd8U19JUlVHT3xTX0lXVUdPKSwKIAlFKFBST0NfVEdJRF9BVFRSX0ZTQ1JFQVRFLCAiZnNjcmVhdGUiLCBTX0lGUkVHfFNfSVJVR098U19JV1VHTyksCisJRShQUk9DX1RHSURfQVRUUl9LRVlDUkVBVEUsICJrZXljcmVhdGUiLCBTX0lGUkVHfFNfSVJVR098U19JV1VHTyksCisJRShQUk9DX1RHSURfQVRUUl9TT0NLQ1JFQVRFLCAic29ja2NyZWF0ZSIsIFNfSUZSRUd8U19JUlVHT3xTX0lXVUdPKSwKIAl7MCwwLE5VTEwsMH0KIH07CiBzdGF0aWMgc3RydWN0IHBpZF9lbnRyeSB0aWRfYXR0cl9zdHVmZltdID0gewpAQCAtMjgyLDYgKzMwMSw4IEBACiAJRShQUk9DX1RJRF9BVFRSX1BSRVYsICAgICAgInByZXYiLCAgICAgU19JRlJFR3xTX0lSVUdPKSwKIAlFKFBST0NfVElEX0FUVFJfRVhFQywgICAgICAiZXhlYyIsICAgICBTX0lGUkVHfFNfSVJVR098U19JV1VHTyksCiAJRShQUk9DX1RJRF9BVFRSX0ZTQ1JFQVRFLCAgImZzY3JlYXRlIiwgU19JRlJFR3xTX0lSVUdPfFNfSVdVR08pLAorCUUoUFJPQ19USURfQVRUUl9LRVlDUkVBVEUsICJrZXljcmVhdGUiLCBTX0lGUkVHfFNfSVJVR098U19JV1VHTyksCisJRShQUk9DX1RJRF9BVFRSX1NPQ0tDUkVBVEUsICJzb2NrY3JlYXRlIiwgU19JRlJFR3xTX0lSVUdPfFNfSVdVR08pLAogCXswLDAsTlVMTCwwfQogfTsKICNlbmRpZgpAQCAtMjkwLDEyICszMTEsMTUgQEAKIAogc3RhdGljIGludCBwcm9jX2ZkX2xpbmsoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGRlbnRyeSAqKmRlbnRyeSwgc3RydWN0IHZmc21vdW50ICoqbW50KQogewotCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayA9IHByb2NfdGFzayhpbm9kZSk7Ci0Jc3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXM7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrID0gZ2V0X3Byb2NfdGFzayhpbm9kZSk7CisJc3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXMgPSBOVUxMOwogCXN0cnVjdCBmaWxlICpmaWxlOwotCWludCBmZCA9IHByb2NfdHlwZShpbm9kZSkgLSBQUk9DX1RJRF9GRF9ESVI7CisJaW50IGZkID0gcHJvY19mZChpbm9kZSk7CiAKLQlmaWxlcyA9IGdldF9maWxlc19zdHJ1Y3QodGFzayk7CisJaWYgKHRhc2spIHsKKwkJZmlsZXMgPSBnZXRfZmlsZXNfc3RydWN0KHRhc2spOworCQlwdXRfdGFza19zdHJ1Y3QodGFzayk7CisJfQogCWlmIChmaWxlcykgewogCQkvKgogCQkgKiBXZSBhcmUgbm90IHRha2luZyBhIHJlZiB0byB0aGUgZmlsZSBzdHJ1Y3R1cmUsIHNvIHdlIG11c3QKQEAgLTMyNywxMCArMzUxLDI5IEBACiAJcmV0dXJuIGZzOwogfQogCitzdGF0aWMgaW50IGdldF9ucl90aHJlYWRzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQoreworCS8qIE11c3QgYmUgY2FsbGVkIHdpdGggdGhlIHJjdV9yZWFkX2xvY2sgaGVsZCAqLworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGNvdW50ID0gMDsKKworCWlmIChsb2NrX3Rhc2tfc2lnaGFuZCh0c2ssICZmbGFncykpIHsKKwkJY291bnQgPSBhdG9taWNfcmVhZCgmdHNrLT5zaWduYWwtPmNvdW50KTsKKwkJdW5sb2NrX3Rhc2tfc2lnaGFuZCh0c2ssICZmbGFncyk7CisJfQorCXJldHVybiBjb3VudDsKK30KKwogc3RhdGljIGludCBwcm9jX2N3ZF9saW5rKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBkZW50cnkgKipkZW50cnksIHN0cnVjdCB2ZnNtb3VudCAqKm1udCkKIHsKLQlzdHJ1Y3QgZnNfc3RydWN0ICpmcyA9IGdldF9mc19zdHJ1Y3QocHJvY190YXNrKGlub2RlKSk7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrID0gZ2V0X3Byb2NfdGFzayhpbm9kZSk7CisJc3RydWN0IGZzX3N0cnVjdCAqZnMgPSBOVUxMOwogCWludCByZXN1bHQgPSAtRU5PRU5UOworCisJaWYgKHRhc2spIHsKKwkJZnMgPSBnZXRfZnNfc3RydWN0KHRhc2spOworCQlwdXRfdGFza19zdHJ1Y3QodGFzayk7CisJfQogCWlmIChmcykgewogCQlyZWFkX2xvY2soJmZzLT5sb2NrKTsKIAkJKm1udCA9IG1udGdldChmcy0+cHdkbW50KTsKQEAgLTM0NCw4ICszODcsMTQgQEAKIAogc3RhdGljIGludCBwcm9jX3Jvb3RfbGluayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZGVudHJ5ICoqZGVudHJ5LCBzdHJ1Y3QgdmZzbW91bnQgKiptbnQpCiB7Ci0Jc3RydWN0IGZzX3N0cnVjdCAqZnMgPSBnZXRfZnNfc3RydWN0KHByb2NfdGFzayhpbm9kZSkpOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayA9IGdldF9wcm9jX3Rhc2soaW5vZGUpOworCXN0cnVjdCBmc19zdHJ1Y3QgKmZzID0gTlVMTDsKIAlpbnQgcmVzdWx0ID0gLUVOT0VOVDsKKworCWlmICh0YXNrKSB7CisJCWZzID0gZ2V0X2ZzX3N0cnVjdCh0YXNrKTsKKwkJcHV0X3Rhc2tfc3RydWN0KHRhc2spOworCX0KIAlpZiAoZnMpIHsKIAkJcmVhZF9sb2NrKCZmcy0+bG9jayk7CiAJCSptbnQgPSBtbnRnZXQoZnMtPnJvb3RtbnQpOwpAQCAtMzU3LDU0ICs0MDYsNiBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKLQotLyogU2FtZSBhcyBwcm9jX3Jvb3RfbGluaywgYnV0IHRoaXMgYWRkaW9uYWxseSB0cmllcyB0byBnZXQgZnMgZnJvbSBvdGhlcgotICogdGhyZWFkcyBpbiB0aGUgZ3JvdXAgKi8KLXN0YXRpYyBpbnQgcHJvY190YXNrX3Jvb3RfbGluayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZGVudHJ5ICoqZGVudHJ5LAotCQkJCXN0cnVjdCB2ZnNtb3VudCAqKm1udCkKLXsKLQlzdHJ1Y3QgZnNfc3RydWN0ICpmczsKLQlpbnQgcmVzdWx0ID0gLUVOT0VOVDsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmxlYWRlciA9IHByb2NfdGFzayhpbm9kZSk7Ci0KLQl0YXNrX2xvY2sobGVhZGVyKTsKLQlmcyA9IGxlYWRlci0+ZnM7Ci0JaWYgKGZzKSB7Ci0JCWF0b21pY19pbmMoJmZzLT5jb3VudCk7Ci0JCXRhc2tfdW5sb2NrKGxlYWRlcik7Ci0JfSBlbHNlIHsKLQkJLyogVHJ5IHRvIGdldCBmcyBmcm9tIG90aGVyIHRocmVhZHMgKi8KLQkJdGFza191bmxvY2sobGVhZGVyKTsKLQkJcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKLQkJaWYgKHBpZF9hbGl2ZShsZWFkZXIpKSB7Ci0JCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgPSBsZWFkZXI7Ci0KLQkJCXdoaWxlICgodGFzayA9IG5leHRfdGhyZWFkKHRhc2spKSAhPSBsZWFkZXIpIHsKLQkJCQl0YXNrX2xvY2sodGFzayk7Ci0JCQkJZnMgPSB0YXNrLT5mczsKLQkJCQlpZiAoZnMpIHsKLQkJCQkJYXRvbWljX2luYygmZnMtPmNvdW50KTsKLQkJCQkJdGFza191bmxvY2sodGFzayk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQl0YXNrX3VubG9jayh0YXNrKTsKLQkJCX0KLQkJfQotCQlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7Ci0JfQotCi0JaWYgKGZzKSB7Ci0JCXJlYWRfbG9jaygmZnMtPmxvY2spOwotCQkqbW50ID0gbW50Z2V0KGZzLT5yb290bW50KTsKLQkJKmRlbnRyeSA9IGRnZXQoZnMtPnJvb3QpOwotCQlyZWFkX3VubG9jaygmZnMtPmxvY2spOwotCQlyZXN1bHQgPSAwOwotCQlwdXRfZnNfc3RydWN0KGZzKTsKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotCiAjZGVmaW5lIE1BWV9QVFJBQ0UodGFzaykgXAogCSh0YXNrID09IGN1cnJlbnQgfHwgXAogCSh0YXNrLT5wYXJlbnQgPT0gY3VycmVudCAmJiBcCkBAIC01MzUsMTQyICs1MzYsMjIgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIHBlcm1pc3Npb24gY2hlY2tzICovCi0KLS8qIElmIHRoZSBwcm9jZXNzIGJlaW5nIHJlYWQgaXMgc2VwYXJhdGVkIGJ5IGNocm9vdCBmcm9tIHRoZSByZWFkaW5nIHByb2Nlc3MsCi0gKiBkb24ndCBsZXQgdGhlIHJlYWRlciBhY2Nlc3MgdGhlIHRocmVhZHMuCi0gKgotICogbm90ZTogdGhpcyBkb2VzIGRwdXQocm9vdCkgYW5kIG1udHB1dCh2ZnNtbnQpIG9uIGV4aXQuCi0gKi8KLXN0YXRpYyBpbnQgcHJvY19jaGVja19jaHJvb3Qoc3RydWN0IGRlbnRyeSAqcm9vdCwgc3RydWN0IHZmc21vdW50ICp2ZnNtbnQpCitzdGF0aWMgaW50IHByb2NfZmRfYWNjZXNzX2FsbG93ZWQoc3RydWN0IGlub2RlICppbm9kZSkKIHsKLQlzdHJ1Y3QgZGVudHJ5ICpkZSwgKmJhc2U7Ci0Jc3RydWN0IHZmc21vdW50ICpvdXJfdmZzbW50LCAqbW50OwotCWludCByZXMgPSAwOwotCi0JcmVhZF9sb2NrKCZjdXJyZW50LT5mcy0+bG9jayk7Ci0Jb3VyX3Zmc21udCA9IG1udGdldChjdXJyZW50LT5mcy0+cm9vdG1udCk7Ci0JYmFzZSA9IGRnZXQoY3VycmVudC0+ZnMtPnJvb3QpOwotCXJlYWRfdW5sb2NrKCZjdXJyZW50LT5mcy0+bG9jayk7Ci0KLQlzcGluX2xvY2soJnZmc21vdW50X2xvY2spOwotCWRlID0gcm9vdDsKLQltbnQgPSB2ZnNtbnQ7Ci0KLQl3aGlsZSAobW50ICE9IG91cl92ZnNtbnQpIHsKLQkJaWYgKG1udCA9PSBtbnQtPm1udF9wYXJlbnQpCi0JCQlnb3RvIG91dDsKLQkJZGUgPSBtbnQtPm1udF9tb3VudHBvaW50OwotCQltbnQgPSBtbnQtPm1udF9wYXJlbnQ7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrOworCWludCBhbGxvd2VkID0gMDsKKwkvKiBBbGxvdyBhY2Nlc3MgdG8gYSB0YXNrJ3MgZmlsZSBkZXNjcmlwdG9ycyBpZiBpdCBpcyB1cyBvciB3ZQorCSAqIG1heSB1c2UgcHRyYWNlIGF0dGFjaCB0byB0aGUgcHJvY2VzcyBhbmQgZmluZCBvdXQgdGhhdAorCSAqIGluZm9ybWF0aW9uLgorCSAqLworCXRhc2sgPSBnZXRfcHJvY190YXNrKGlub2RlKTsKKwlpZiAodGFzaykgeworCQlhbGxvd2VkID0gcHRyYWNlX21heV9hdHRhY2godGFzayk7CisJCXB1dF90YXNrX3N0cnVjdCh0YXNrKTsKIAl9Ci0KLQlpZiAoIWlzX3N1YmRpcihkZSwgYmFzZSkpCi0JCWdvdG8gb3V0OwotCXNwaW5fdW5sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKLQotZXhpdDoKLQlkcHV0KGJhc2UpOwotCW1udHB1dChvdXJfdmZzbW50KTsKLQlkcHV0KHJvb3QpOwotCW1udHB1dCh2ZnNtbnQpOwotCXJldHVybiByZXM7Ci1vdXQ6Ci0Jc3Bpbl91bmxvY2soJnZmc21vdW50X2xvY2spOwotCXJlcyA9IC1FQUNDRVM7Ci0JZ290byBleGl0OworCXJldHVybiBhbGxvd2VkOwogfQogCi1zdGF0aWMgaW50IHByb2NfY2hlY2tfcm9vdChzdHJ1Y3QgaW5vZGUgKmlub2RlKQotewotCXN0cnVjdCBkZW50cnkgKnJvb3Q7Ci0Jc3RydWN0IHZmc21vdW50ICp2ZnNtbnQ7Ci0KLQlpZiAocHJvY19yb290X2xpbmsoaW5vZGUsICZyb290LCAmdmZzbW50KSkgLyogRXd3dy4uLiAqLwotCQlyZXR1cm4gLUVOT0VOVDsKLQlyZXR1cm4gcHJvY19jaGVja19jaHJvb3Qocm9vdCwgdmZzbW50KTsKLX0KLQotc3RhdGljIGludCBwcm9jX3Blcm1pc3Npb24oc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2ssIHN0cnVjdCBuYW1laWRhdGEgKm5kKQotewotCWlmIChnZW5lcmljX3Blcm1pc3Npb24oaW5vZGUsIG1hc2ssIE5VTEwpICE9IDApCi0JCXJldHVybiAtRUFDQ0VTOwotCXJldHVybiBwcm9jX2NoZWNrX3Jvb3QoaW5vZGUpOwotfQotCi1zdGF0aWMgaW50IHByb2NfdGFza19wZXJtaXNzaW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrLCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKLXsKLQlzdHJ1Y3QgZGVudHJ5ICpyb290OwotCXN0cnVjdCB2ZnNtb3VudCAqdmZzbW50OwotCi0JaWYgKGdlbmVyaWNfcGVybWlzc2lvbihpbm9kZSwgbWFzaywgTlVMTCkgIT0gMCkKLQkJcmV0dXJuIC1FQUNDRVM7Ci0KLQlpZiAocHJvY190YXNrX3Jvb3RfbGluayhpbm9kZSwgJnJvb3QsICZ2ZnNtbnQpKQotCQlyZXR1cm4gLUVOT0VOVDsKLQotCXJldHVybiBwcm9jX2NoZWNrX2Nocm9vdChyb290LCB2ZnNtbnQpOwotfQotCi1leHRlcm4gc3RydWN0IHNlcV9vcGVyYXRpb25zIHByb2NfcGlkX21hcHNfb3A7Ci1zdGF0aWMgaW50IG1hcHNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgPSBwcm9jX3Rhc2soaW5vZGUpOwotCWludCByZXQgPSBzZXFfb3BlbihmaWxlLCAmcHJvY19waWRfbWFwc19vcCk7Ci0JaWYgKCFyZXQpIHsKLQkJc3RydWN0IHNlcV9maWxlICptID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCQltLT5wcml2YXRlID0gdGFzazsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19tYXBzX29wZXJhdGlvbnMgPSB7Ci0JLm9wZW4JCT0gbWFwc19vcGVuLAotCS5yZWFkCQk9IHNlcV9yZWFkLAotCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAotCS5yZWxlYXNlCT0gc2VxX3JlbGVhc2UsCi19OwotCi0jaWZkZWYgQ09ORklHX05VTUEKLWV4dGVybiBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgcHJvY19waWRfbnVtYV9tYXBzX29wOwotc3RhdGljIGludCBudW1hX21hcHNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgPSBwcm9jX3Rhc2soaW5vZGUpOwotCWludCByZXQgPSBzZXFfb3BlbihmaWxlLCAmcHJvY19waWRfbnVtYV9tYXBzX29wKTsKLQlpZiAoIXJldCkgewotCQlzdHJ1Y3Qgc2VxX2ZpbGUgKm0gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JCW0tPnByaXZhdGUgPSB0YXNrOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX251bWFfbWFwc19vcGVyYXRpb25zID0gewotCS5vcGVuCQk9IG51bWFfbWFwc19vcGVuLAotCS5yZWFkCQk9IHNlcV9yZWFkLAotCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAotCS5yZWxlYXNlCT0gc2VxX3JlbGVhc2UsCi19OwotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfTU1VCi1leHRlcm4gc3RydWN0IHNlcV9vcGVyYXRpb25zIHByb2NfcGlkX3NtYXBzX29wOwotc3RhdGljIGludCBzbWFwc19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayA9IHByb2NfdGFzayhpbm9kZSk7Ci0JaW50IHJldCA9IHNlcV9vcGVuKGZpbGUsICZwcm9jX3BpZF9zbWFwc19vcCk7Ci0JaWYgKCFyZXQpIHsKLQkJc3RydWN0IHNlcV9maWxlICptID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCQltLT5wcml2YXRlID0gdGFzazsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19zbWFwc19vcGVyYXRpb25zID0gewotCS5vcGVuCQk9IHNtYXBzX29wZW4sCi0JLnJlYWQJCT0gc2VxX3JlYWQsCi0JLmxsc2VlawkJPSBzZXFfbHNlZWssCi0JLnJlbGVhc2UJPSBzZXFfcmVsZWFzZSwKLX07Ci0jZW5kaWYKLQogZXh0ZXJuIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBtb3VudHNfb3A7CiBzdHJ1Y3QgcHJvY19tb3VudHMgewogCXN0cnVjdCBzZXFfZmlsZSBtOwpAQCAtNjc5LDE2ICs1NjAsMTkgQEAKIAogc3RhdGljIGludCBtb3VudHNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgPSBwcm9jX3Rhc2soaW5vZGUpOwotCXN0cnVjdCBuYW1lc3BhY2UgKm5hbWVzcGFjZTsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgPSBnZXRfcHJvY190YXNrKGlub2RlKTsKKwlzdHJ1Y3QgbmFtZXNwYWNlICpuYW1lc3BhY2UgPSBOVUxMOwogCXN0cnVjdCBwcm9jX21vdW50cyAqcDsKIAlpbnQgcmV0ID0gLUVJTlZBTDsKIAotCXRhc2tfbG9jayh0YXNrKTsKLQluYW1lc3BhY2UgPSB0YXNrLT5uYW1lc3BhY2U7Ci0JaWYgKG5hbWVzcGFjZSkKLQkJZ2V0X25hbWVzcGFjZShuYW1lc3BhY2UpOwotCXRhc2tfdW5sb2NrKHRhc2spOworCWlmICh0YXNrKSB7CisJCXRhc2tfbG9jayh0YXNrKTsKKwkJbmFtZXNwYWNlID0gdGFzay0+bmFtZXNwYWNlOworCQlpZiAobmFtZXNwYWNlKQorCQkJZ2V0X25hbWVzcGFjZShuYW1lc3BhY2UpOworCQl0YXNrX3VubG9jayh0YXNrKTsKKwkJcHV0X3Rhc2tfc3RydWN0KHRhc2spOworCX0KIAogCWlmIChuYW1lc3BhY2UpIHsKIAkJcmV0ID0gLUVOT01FTTsKQEAgLTc0NSwxNyArNjI5LDIxIEBACiBleHRlcm4gc3RydWN0IHNlcV9vcGVyYXRpb25zIG1vdW50c3RhdHNfb3A7CiBzdGF0aWMgaW50IG1vdW50c3RhdHNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgPSBwcm9jX3Rhc2soaW5vZGUpOwogCWludCByZXQgPSBzZXFfb3BlbihmaWxlLCAmbW91bnRzdGF0c19vcCk7CiAKIAlpZiAoIXJldCkgewogCQlzdHJ1Y3Qgc2VxX2ZpbGUgKm0gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JCXN0cnVjdCBuYW1lc3BhY2UgKm5hbWVzcGFjZTsKLQkJdGFza19sb2NrKHRhc2spOwotCQluYW1lc3BhY2UgPSB0YXNrLT5uYW1lc3BhY2U7Ci0JCWlmIChuYW1lc3BhY2UpCi0JCQlnZXRfbmFtZXNwYWNlKG5hbWVzcGFjZSk7Ci0JCXRhc2tfdW5sb2NrKHRhc2spOworCQlzdHJ1Y3QgbmFtZXNwYWNlICpuYW1lc3BhY2UgPSBOVUxMOworCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgPSBnZXRfcHJvY190YXNrKGlub2RlKTsKKworCQlpZiAodGFzaykgeworCQkJdGFza19sb2NrKHRhc2spOworCQkJbmFtZXNwYWNlID0gdGFzay0+bmFtZXNwYWNlOworCQkJaWYgKG5hbWVzcGFjZSkKKwkJCQlnZXRfbmFtZXNwYWNlKG5hbWVzcGFjZSk7CisJCQl0YXNrX3VubG9jayh0YXNrKTsKKwkJCXB1dF90YXNrX3N0cnVjdCh0YXNrKTsKKwkJfQogCiAJCWlmIChuYW1lc3BhY2UpCiAJCQltLT5wcml2YXRlID0gbmFtZXNwYWNlOwpAQCAtNzgyLDE4ICs2NzAsMjcgQEAKIAlzdHJ1Y3QgaW5vZGUgKiBpbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOwogCXVuc2lnbmVkIGxvbmcgcGFnZTsKIAlzc2l6ZV90IGxlbmd0aDsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgPSBwcm9jX3Rhc2soaW5vZGUpOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayA9IGdldF9wcm9jX3Rhc2soaW5vZGUpOworCisJbGVuZ3RoID0gLUVTUkNIOworCWlmICghdGFzaykKKwkJZ290byBvdXRfbm9fdGFzazsKIAogCWlmIChjb3VudCA+IFBST0NfQkxPQ0tfU0laRSkKIAkJY291bnQgPSBQUk9DX0JMT0NLX1NJWkU7CisKKwlsZW5ndGggPSAtRU5PTUVNOwogCWlmICghKHBhZ2UgPSBfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCkpKQotCQlyZXR1cm4gLUVOT01FTTsKKwkJZ290byBvdXQ7CiAKIAlsZW5ndGggPSBQUk9DX0koaW5vZGUpLT5vcC5wcm9jX3JlYWQodGFzaywgKGNoYXIqKXBhZ2UpOwogCiAJaWYgKGxlbmd0aCA+PSAwKQogCQlsZW5ndGggPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcihidWYsIGNvdW50LCBwcG9zLCAoY2hhciAqKXBhZ2UsIGxlbmd0aCk7CiAJZnJlZV9wYWdlKHBhZ2UpOworb3V0OgorCXB1dF90YXNrX3N0cnVjdCh0YXNrKTsKK291dF9ub190YXNrOgogCXJldHVybiBsZW5ndGg7CiB9CiAKQEAgLTgxMCwxMiArNzA3LDE1IEBACiBzdGF0aWMgc3NpemVfdCBtZW1fcmVhZChzdHJ1Y3QgZmlsZSAqIGZpbGUsIGNoYXIgX191c2VyICogYnVmLAogCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7Ci0Jc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrID0gcHJvY190YXNrKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKTsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgPSBnZXRfcHJvY190YXNrKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKTsKIAljaGFyICpwYWdlOwogCXVuc2lnbmVkIGxvbmcgc3JjID0gKnBwb3M7CiAJaW50IHJldCA9IC1FU1JDSDsKIAlzdHJ1Y3QgbW1fc3RydWN0ICptbTsKIAorCWlmICghdGFzaykKKwkJZ290byBvdXRfbm9fdGFzazsKKwogCWlmICghTUFZX1BUUkFDRSh0YXNrKSB8fCAhcHRyYWNlX21heV9hdHRhY2godGFzaykpCiAJCWdvdG8gb3V0OwogCkBAIC04NjUsNiArNzY1LDggQEAKIG91dF9mcmVlOgogCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgcGFnZSk7CiBvdXQ6CisJcHV0X3Rhc2tfc3RydWN0KHRhc2spOworb3V0X25vX3Rhc2s6CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtODc3LDE1ICs3NzksMjAgQEAKIHsKIAlpbnQgY29waWVkID0gMDsKIAljaGFyICpwYWdlOwotCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayA9IHByb2NfdGFzayhmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrID0gZ2V0X3Byb2NfdGFzayhmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CiAJdW5zaWduZWQgbG9uZyBkc3QgPSAqcHBvczsKIAotCWlmICghTUFZX1BUUkFDRSh0YXNrKSB8fCAhcHRyYWNlX21heV9hdHRhY2godGFzaykpCi0JCXJldHVybiAtRVNSQ0g7CisJY29waWVkID0gLUVTUkNIOworCWlmICghdGFzaykKKwkJZ290byBvdXRfbm9fdGFzazsKIAorCWlmICghTUFZX1BUUkFDRSh0YXNrKSB8fCAhcHRyYWNlX21heV9hdHRhY2godGFzaykpCisJCWdvdG8gb3V0OworCisJY29waWVkID0gLUVOT01FTTsKIAlwYWdlID0gKGNoYXIgKilfX2dldF9mcmVlX3BhZ2UoR0ZQX1VTRVIpOwogCWlmICghcGFnZSkKLQkJcmV0dXJuIC1FTk9NRU07CisJCWdvdG8gb3V0OwogCiAJd2hpbGUgKGNvdW50ID4gMCkgewogCQlpbnQgdGhpc19sZW4sIHJldHZhbDsKQEAgLTkwOCw2ICs4MTUsOSBAQAogCX0KIAkqcHBvcyA9IGRzdDsKIAlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIHBhZ2UpOworb3V0OgorCXB1dF90YXNrX3N0cnVjdCh0YXNrKTsKK291dF9ub190YXNrOgogCXJldHVybiBjb3BpZWQ7CiB9CiAjZW5kaWYKQEAgLTkzOCwxMyArODQ4LDE4IEBACiBzdGF0aWMgc3NpemVfdCBvb21fYWRqdXN0X3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCiAJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7Ci0Jc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrID0gcHJvY190YXNrKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKTsKLQljaGFyIGJ1ZmZlcls4XTsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgPSBnZXRfcHJvY190YXNrKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKTsKKwljaGFyIGJ1ZmZlcltQUk9DX05VTUJVRl07CiAJc2l6ZV90IGxlbjsKLQlpbnQgb29tX2FkanVzdCA9IHRhc2stPm9vbWtpbGxhZGo7CisJaW50IG9vbV9hZGp1c3Q7CiAJbG9mZl90IF9fcHBvcyA9ICpwcG9zOwogCi0JbGVuID0gc3ByaW50ZihidWZmZXIsICIlaVxuIiwgb29tX2FkanVzdCk7CisJaWYgKCF0YXNrKQorCQlyZXR1cm4gLUVTUkNIOworCW9vbV9hZGp1c3QgPSB0YXNrLT5vb21raWxsYWRqOworCXB1dF90YXNrX3N0cnVjdCh0YXNrKTsKKworCWxlbiA9IHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICIlaVxuIiwgb29tX2FkanVzdCk7CiAJaWYgKF9fcHBvcyA+PSBsZW4pCiAJCXJldHVybiAwOwogCWlmIChjb3VudCA+IGxlbi1fX3Bwb3MpCkBAIC05NTgsMTUgKzg3MywxNSBAQAogc3RhdGljIHNzaXplX3Qgb29tX2FkanVzdF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKIAkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgPSBwcm9jX3Rhc2soZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOwotCWNoYXIgYnVmZmVyWzhdLCAqZW5kOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzazsKKwljaGFyIGJ1ZmZlcltQUk9DX05VTUJVRl0sICplbmQ7CiAJaW50IG9vbV9hZGp1c3Q7CiAKIAlpZiAoIWNhcGFibGUoQ0FQX1NZU19SRVNPVVJDRSkpCiAJCXJldHVybiAtRVBFUk07Ci0JbWVtc2V0KGJ1ZmZlciwgMCwgOCk7Ci0JaWYgKGNvdW50ID4gNikKLQkJY291bnQgPSA2OworCW1lbXNldChidWZmZXIsIDAsIHNpemVvZihidWZmZXIpKTsKKwlpZiAoY291bnQgPiBzaXplb2YoYnVmZmVyKSAtIDEpCisJCWNvdW50ID0gc2l6ZW9mKGJ1ZmZlcikgLSAxOwogCWlmIChjb3B5X2Zyb21fdXNlcihidWZmZXIsIGJ1ZiwgY291bnQpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAlvb21fYWRqdXN0ID0gc2ltcGxlX3N0cnRvbChidWZmZXIsICZlbmQsIDApOwpAQCAtOTc0LDcgKzg4OSwxMSBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAoKmVuZCA9PSAnXG4nKQogCQllbmQrKzsKKwl0YXNrID0gZ2V0X3Byb2NfdGFzayhmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJaWYgKCF0YXNrKQorCQlyZXR1cm4gLUVTUkNIOwogCXRhc2stPm9vbWtpbGxhZGogPSBvb21fYWRqdXN0OworCXB1dF90YXNrX3N0cnVjdCh0YXNrKTsKIAlpZiAoZW5kIC0gYnVmZmVyID09IDApCiAJCXJldHVybiAtRUlPOwogCXJldHVybiBlbmQgLSBidWZmZXI7CkBAIC05ODUsMjIgKzkwNCwyMSBAQAogCS53cml0ZQkJPSBvb21fYWRqdXN0X3dyaXRlLAogfTsKIAotc3RhdGljIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHByb2NfbWVtX2lub2RlX29wZXJhdGlvbnMgPSB7Ci0JLnBlcm1pc3Npb24JPSBwcm9jX3Blcm1pc3Npb24sCi19OwotCiAjaWZkZWYgQ09ORklHX0FVRElUU1lTQ0FMTAogI2RlZmluZSBUTVBCVUZMRU4gMjEKIHN0YXRpYyBzc2l6ZV90IHByb2NfbG9naW51aWRfcmVhZChzdHJ1Y3QgZmlsZSAqIGZpbGUsIGNoYXIgX191c2VyICogYnVmLAogCQkJCSAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7CiAJc3RydWN0IGlub2RlICogaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgPSBwcm9jX3Rhc2soaW5vZGUpOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayA9IGdldF9wcm9jX3Rhc2soaW5vZGUpOwogCXNzaXplX3QgbGVuZ3RoOwogCWNoYXIgdG1wYnVmW1RNUEJVRkxFTl07CiAKKwlpZiAoIXRhc2spCisJCXJldHVybiAtRVNSQ0g7CiAJbGVuZ3RoID0gc2NucHJpbnRmKHRtcGJ1ZiwgVE1QQlVGTEVOLCAiJXUiLAogCQkJCWF1ZGl0X2dldF9sb2dpbnVpZCh0YXNrLT5hdWRpdF9jb250ZXh0KSk7CisJcHV0X3Rhc2tfc3RydWN0KHRhc2spOwogCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcihidWYsIGNvdW50LCBwcG9zLCB0bXBidWYsIGxlbmd0aCk7CiB9CiAKQEAgLTEwMTAsMTMgKzkyOCwxMiBAQAogCXN0cnVjdCBpbm9kZSAqIGlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CiAJY2hhciAqcGFnZSwgKnRtcDsKIAlzc2l6ZV90IGxlbmd0aDsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgPSBwcm9jX3Rhc2soaW5vZGUpOwogCXVpZF90IGxvZ2ludWlkOwogCiAJaWYgKCFjYXBhYmxlKENBUF9BVURJVF9DT05UUk9MKSkKIAkJcmV0dXJuIC1FUEVSTTsKIAotCWlmIChjdXJyZW50ICE9IHRhc2spCisJaWYgKGN1cnJlbnQgIT0gcGlkX3Rhc2socHJvY19waWQoaW5vZGUpLCBQSURUWVBFX1BJRCkpCiAJCXJldHVybiAtRVBFUk07CiAKIAlpZiAoY291bnQgPj0gUEFHRV9TSVpFKQpAQCAtMTA0MCw3ICs5NTcsNyBAQAogCQlnb3RvIG91dF9mcmVlX3BhZ2U7CiAKIAl9Ci0JbGVuZ3RoID0gYXVkaXRfc2V0X2xvZ2ludWlkKHRhc2ssIGxvZ2ludWlkKTsKKwlsZW5ndGggPSBhdWRpdF9zZXRfbG9naW51aWQoY3VycmVudCwgbG9naW51aWQpOwogCWlmIChsaWtlbHkobGVuZ3RoID09IDApKQogCQlsZW5ndGggPSBjb3VudDsKIApAQCAtMTA1OSwxMyArOTc2LDE2IEBACiBzdGF0aWMgc3NpemVfdCBzZWNjb21wX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCiAJCQkgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7Ci0Jc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBwcm9jX3Rhc2soZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gZ2V0X3Byb2NfdGFzayhmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CiAJY2hhciBfX2J1ZlsyMF07CiAJbG9mZl90IF9fcHBvcyA9ICpwcG9zOwogCXNpemVfdCBsZW47CiAKKwlpZiAoIXRzaykKKwkJcmV0dXJuIC1FU1JDSDsKIAkvKiBubyBuZWVkIHRvIHByaW50IHRoZSB0cmFpbGluZyB6ZXJvLCBzbyB1c2Ugb25seSBsZW4gKi8KIAlsZW4gPSBzcHJpbnRmKF9fYnVmLCAiJXVcbiIsIHRzay0+c2VjY29tcC5tb2RlKTsKKwlwdXRfdGFza19zdHJ1Y3QodHNrKTsKIAlpZiAoX19wcG9zID49IGxlbikKIAkJcmV0dXJuIDA7CiAJaWYgKGNvdW50ID4gbGVuIC0gX19wcG9zKQpAQCAtMTA3OSwyOSArOTk5LDQzIEBACiBzdGF0aWMgc3NpemVfdCBzZWNjb21wX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAogCQkJICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IHByb2NfdGFzayhmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBnZXRfcHJvY190YXNrKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKTsKIAljaGFyIF9fYnVmWzIwXSwgKmVuZDsKIAl1bnNpZ25lZCBpbnQgc2VjY29tcF9tb2RlOworCXNzaXplX3QgcmVzdWx0OworCisJcmVzdWx0ID0gLUVTUkNIOworCWlmICghdHNrKQorCQlnb3RvIG91dF9ub190YXNrOwogCiAJLyogY2FuIHNldCBpdCBvbmx5IG9uY2UgdG8gYmUgZXZlbiBtb3JlIHNlY3VyZSAqLworCXJlc3VsdCA9IC1FUEVSTTsKIAlpZiAodW5saWtlbHkodHNrLT5zZWNjb21wLm1vZGUpKQotCQlyZXR1cm4gLUVQRVJNOworCQlnb3RvIG91dDsKIAorCXJlc3VsdCA9IC1FRkFVTFQ7CiAJbWVtc2V0KF9fYnVmLCAwLCBzaXplb2YoX19idWYpKTsKIAljb3VudCA9IG1pbihjb3VudCwgc2l6ZW9mKF9fYnVmKSAtIDEpOwogCWlmIChjb3B5X2Zyb21fdXNlcihfX2J1ZiwgYnVmLCBjb3VudCkpCi0JCXJldHVybiAtRUZBVUxUOworCQlnb3RvIG91dDsKKwogCXNlY2NvbXBfbW9kZSA9IHNpbXBsZV9zdHJ0b3VsKF9fYnVmLCAmZW5kLCAwKTsKIAlpZiAoKmVuZCA9PSAnXG4nKQogCQllbmQrKzsKKwlyZXN1bHQgPSAtRUlOVkFMOwogCWlmIChzZWNjb21wX21vZGUgJiYgc2VjY29tcF9tb2RlIDw9IE5SX1NFQ0NPTVBfTU9ERVMpIHsKIAkJdHNrLT5zZWNjb21wLm1vZGUgPSBzZWNjb21wX21vZGU7CiAJCXNldF90c2tfdGhyZWFkX2ZsYWcodHNrLCBUSUZfU0VDQ09NUCk7CiAJfSBlbHNlCi0JCXJldHVybiAtRUlOVkFMOworCQlnb3RvIG91dDsKKwlyZXN1bHQgPSAtRUlPOwogCWlmICh1bmxpa2VseSghKGVuZCAtIF9fYnVmKSkpCi0JCXJldHVybiAtRUlPOwotCXJldHVybiBlbmQgLSBfX2J1ZjsKKwkJZ290byBvdXQ7CisJcmVzdWx0ID0gZW5kIC0gX19idWY7CitvdXQ6CisJcHV0X3Rhc2tfc3RydWN0KHRzayk7CitvdXRfbm9fdGFzazoKKwlyZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX3NlY2NvbXBfb3BlcmF0aW9ucyA9IHsKQEAgLTExMTgsMTAgKzEwNTIsOCBAQAogCS8qIFdlIGRvbid0IG5lZWQgYSBiYXNlIHBvaW50ZXIgaW4gdGhlIC9wcm9jIGZpbGVzeXN0ZW0gKi8KIAlwYXRoX3JlbGVhc2UobmQpOwogCi0JaWYgKGN1cnJlbnQtPmZzdWlkICE9IGlub2RlLT5pX3VpZCAmJiAhY2FwYWJsZShDQVBfREFDX09WRVJSSURFKSkKLQkJZ290byBvdXQ7Ci0JZXJyb3IgPSBwcm9jX2NoZWNrX3Jvb3QoaW5vZGUpOwotCWlmIChlcnJvcikKKwkvKiBBcmUgd2UgYWxsb3dlZCB0byBzbm9vcCBvbiB0aGUgdGFza3MgZmlsZSBkZXNjcmlwdG9ycz8gKi8KKwlpZiAoIXByb2NfZmRfYWNjZXNzX2FsbG93ZWQoaW5vZGUpKQogCQlnb3RvIG91dDsKIAogCWVycm9yID0gUFJPQ19JKGlub2RlKS0+b3AucHJvY19nZXRfbGluayhpbm9kZSwgJm5kLT5kZW50cnksICZuZC0+bW50KTsKQEAgLTExNjMsMTIgKzEwOTUsOCBAQAogCXN0cnVjdCBkZW50cnkgKmRlOwogCXN0cnVjdCB2ZnNtb3VudCAqbW50ID0gTlVMTDsKIAotCWxvY2tfa2VybmVsKCk7Ci0KLQlpZiAoY3VycmVudC0+ZnN1aWQgIT0gaW5vZGUtPmlfdWlkICYmICFjYXBhYmxlKENBUF9EQUNfT1ZFUlJJREUpKQotCQlnb3RvIG91dDsKLQllcnJvciA9IHByb2NfY2hlY2tfcm9vdChpbm9kZSk7Ci0JaWYgKGVycm9yKQorCS8qIEFyZSB3ZSBhbGxvd2VkIHRvIHNub29wIG9uIHRoZSB0YXNrcyBmaWxlIGRlc2NyaXB0b3JzPyAqLworCWlmICghcHJvY19mZF9hY2Nlc3NfYWxsb3dlZChpbm9kZSkpCiAJCWdvdG8gb3V0OwogCiAJZXJyb3IgPSBQUk9DX0koaW5vZGUpLT5vcC5wcm9jX2dldF9saW5rKGlub2RlLCAmZGUsICZtbnQpOwpAQCAtMTE3OSw3ICsxMTA3LDYgQEAKIAlkcHV0KGRlKTsKIAltbnRwdXQobW50KTsKIG91dDoKLQl1bmxvY2tfa2VybmVsKCk7CiAJcmV0dXJuIGVycm9yOwogfQogCkBAIC0xMTg4LDIxICsxMTE1LDIwIEBACiAJLmZvbGxvd19saW5rCT0gcHJvY19waWRfZm9sbG93X2xpbmsKIH07CiAKLSNkZWZpbmUgTlVNQlVGIDEwCi0KIHN0YXRpYyBpbnQgcHJvY19yZWFkZmQoc3RydWN0IGZpbGUgKiBmaWxwLCB2b2lkICogZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpcikKIHsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7Ci0Jc3RydWN0IHRhc2tfc3RydWN0ICpwID0gcHJvY190YXNrKGlub2RlKTsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBmaWxwLT5mX2RlbnRyeTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqcCA9IGdldF9wcm9jX3Rhc2soaW5vZGUpOwogCXVuc2lnbmVkIGludCBmZCwgdGlkLCBpbm87CiAJaW50IHJldHZhbDsKLQljaGFyIGJ1ZltOVU1CVUZdOworCWNoYXIgYnVmW1BST0NfTlVNQlVGXTsKIAlzdHJ1Y3QgZmlsZXNfc3RydWN0ICogZmlsZXM7CiAJc3RydWN0IGZkdGFibGUgKmZkdDsKIAogCXJldHZhbCA9IC1FTk9FTlQ7Ci0JaWYgKCFwaWRfYWxpdmUocCkpCi0JCWdvdG8gb3V0OworCWlmICghcCkKKwkJZ290byBvdXRfbm9fdGFzazsKIAlyZXR2YWwgPSAwOwogCXRpZCA9IHAtPnBpZDsKIApAQCAtMTIxMyw3ICsxMTM5LDcgQEAKIAkJCQlnb3RvIG91dDsKIAkJCWZpbHAtPmZfcG9zKys7CiAJCWNhc2UgMToKLQkJCWlubyA9IGZha2VfaW5vKHRpZCwgUFJPQ19USURfSU5PKTsKKwkJCWlubyA9IHBhcmVudF9pbm8oZGVudHJ5KTsKIAkJCWlmIChmaWxsZGlyKGRpcmVudCwgIi4uIiwgMiwgMSwgaW5vLCBEVF9ESVIpIDwgMCkKIAkJCQlnb3RvIG91dDsKIAkJCWZpbHAtPmZfcG9zKys7CkBAIC0xMjMyLDcgKzExNTgsNyBAQAogCQkJCQljb250aW51ZTsKIAkJCQlyY3VfcmVhZF91bmxvY2soKTsKIAotCQkJCWogPSBOVU1CVUY7CisJCQkJaiA9IFBST0NfTlVNQlVGOwogCQkJCWkgPSBmZDsKIAkJCQlkbyB7CiAJCQkJCWotLTsKQEAgLTEyNDEsNyArMTE2Nyw3IEBACiAJCQkJfSB3aGlsZSAoaSk7CiAKIAkJCQlpbm8gPSBmYWtlX2lubyh0aWQsIFBST0NfVElEX0ZEX0RJUiArIGZkKTsKLQkJCQlpZiAoZmlsbGRpcihkaXJlbnQsIGJ1ZitqLCBOVU1CVUYtaiwgZmQrMiwgaW5vLCBEVF9MTkspIDwgMCkgeworCQkJCWlmIChmaWxsZGlyKGRpcmVudCwgYnVmK2osIFBST0NfTlVNQlVGLWosIGZkKzIsIGlubywgRFRfTE5LKSA8IDApIHsKIAkJCQkJcmN1X3JlYWRfbG9jaygpOwogCQkJCQlicmVhazsKIAkJCQl9CkBAIC0xMjUxLDYgKzExNzcsOCBAQAogCQkJcHV0X2ZpbGVzX3N0cnVjdChmaWxlcyk7CiAJfQogb3V0OgorCXB1dF90YXNrX3N0cnVjdChwKTsKK291dF9ub190YXNrOgogCXJldHVybiByZXR2YWw7CiB9CiAKQEAgLTEyNjIsMTYgKzExOTAsMTggQEAKIAlpbnQgcGlkOwogCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGZpbHAtPmZfZGVudHJ5OwogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrID0gZ2V0X3Byb2NfdGFzayhpbm9kZSk7CiAJc3RydWN0IHBpZF9lbnRyeSAqcDsKIAlpbm9fdCBpbm87CiAJaW50IHJldDsKIAogCXJldCA9IC1FTk9FTlQ7Ci0JaWYgKCFwaWRfYWxpdmUocHJvY190YXNrKGlub2RlKSkpCisJaWYgKCF0YXNrKQogCQlnb3RvIG91dDsKIAogCXJldCA9IDA7Ci0JcGlkID0gcHJvY190YXNrKGlub2RlKS0+cGlkOworCXBpZCA9IHRhc2stPnBpZDsKKwlwdXRfdGFza19zdHJ1Y3QodGFzayk7CiAJaSA9IGZpbHAtPmZfcG9zOwogCXN3aXRjaCAoaSkgewogCWNhc2UgMDoKQEAgLTEzNTQsMjIgKzEyODQsMTkgQEAKIAogCS8qIENvbW1vbiBzdHVmZiAqLwogCWVpID0gUFJPQ19JKGlub2RlKTsKLQllaS0+dGFzayA9IE5VTEw7CiAJaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOwogCWlub2RlLT5pX2lubyA9IGZha2VfaW5vKHRhc2stPnBpZCwgaW5vKTsKIAotCWlmICghcGlkX2FsaXZlKHRhc2spKQotCQlnb3RvIG91dF91bmxvY2s7Ci0KIAkvKgogCSAqIGdyYWIgdGhlIHJlZmVyZW5jZSB0byB0YXNrLgogCSAqLwotCWdldF90YXNrX3N0cnVjdCh0YXNrKTsKLQllaS0+dGFzayA9IHRhc2s7Ci0JZWktPnR5cGUgPSBpbm87CisJZWktPnBpZCA9IGdldF9waWQodGFzay0+cGlkc1tQSURUWVBFX1BJRF0ucGlkKTsKKwlpZiAoIWVpLT5waWQpCisJCWdvdG8gb3V0X3VubG9jazsKKwogCWlub2RlLT5pX3VpZCA9IDA7CiAJaW5vZGUtPmlfZ2lkID0gMDsKLQlpZiAoaW5vID09IFBST0NfVEdJRF9JTk8gfHwgaW5vID09IFBST0NfVElEX0lOTyB8fCB0YXNrX2R1bXBhYmxlKHRhc2spKSB7CisJaWYgKHRhc2tfZHVtcGFibGUodGFzaykpIHsKIAkJaW5vZGUtPmlfdWlkID0gdGFzay0+ZXVpZDsKIAkJaW5vZGUtPmlfZ2lkID0gdGFzay0+ZWdpZDsKIAl9CkBAIC0xMzc5LDcgKzEzMDYsNiBAQAogCXJldHVybiBpbm9kZTsKIAogb3V0X3VubG9jazoKLQllaS0+cGRlID0gTlVMTDsKIAlpcHV0KGlub2RlKTsKIAlyZXR1cm4gTlVMTDsKIH0KQEAgLTEzOTMsMTMgKzEzMTksMjEgQEAKICAqCiAgKiBSZXdyaXRlIHRoZSBpbm9kZSdzIG93bmVyc2hpcHMgaGVyZSBiZWNhdXNlIHRoZSBvd25pbmcgdGFzayBtYXkgaGF2ZQogICogcGVyZm9ybWVkIGEgc2V0dWlkKCksIGV0Yy4KKyAqCisgKiBCZWZvcmUgdGhlIC9wcm9jL3BpZC9zdGF0dXMgZmlsZSB3YXMgY3JlYXRlZCB0aGUgb25seSB3YXkgdG8gcmVhZAorICogdGhlIGVmZmVjdGl2ZSB1aWQgb2YgYSAvcHJvY2VzcyB3YXMgdG8gc3RhdCAvcHJvYy9waWQuICBSZWFkaW5nCisgKiAvcHJvYy9waWQvc3RhdHVzIGlzIHNsb3cgZW5vdWdoIHRoYXQgcHJvY3BzIGFuZCBvdGhlciBwYWNrYWdlcworICoga2VwdCBzdGF0aW5nIC9wcm9jL3BpZC4gIFRvIGtlZXAgdGhlIHJ1bGVzIGluIC9wcm9jIHNpbXBsZSBJIGhhdmUKKyAqIG1hZGUgdGhpcyBhcHBseSB0byBhbGwgcGVyIHByb2Nlc3Mgd29ybGQgcmVhZGFibGUgYW5kIGV4ZWN1dGFibGUKKyAqIGRpcmVjdG9yaWVzLgogICovCiBzdGF0aWMgaW50IHBpZF9yZXZhbGlkYXRlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCiB7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgPSBwcm9jX3Rhc2soaW5vZGUpOwotCWlmIChwaWRfYWxpdmUodGFzaykpIHsKLQkJaWYgKHByb2NfdHlwZShpbm9kZSkgPT0gUFJPQ19UR0lEX0lOTyB8fCBwcm9jX3R5cGUoaW5vZGUpID09IFBST0NfVElEX0lOTyB8fCB0YXNrX2R1bXBhYmxlKHRhc2spKSB7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrID0gZ2V0X3Byb2NfdGFzayhpbm9kZSk7CisJaWYgKHRhc2spIHsKKwkJaWYgKChpbm9kZS0+aV9tb2RlID09IChTX0lGRElSfFNfSVJVR098U19JWFVHTykpIHx8CisJCSAgICB0YXNrX2R1bXBhYmxlKHRhc2spKSB7CiAJCQlpbm9kZS0+aV91aWQgPSB0YXNrLT5ldWlkOwogCQkJaW5vZGUtPmlfZ2lkID0gdGFzay0+ZWdpZDsKIAkJfSBlbHNlIHsKQEAgLTE0MDcsNTAgKzEzNDEsNjYgQEAKIAkJCWlub2RlLT5pX2dpZCA9IDA7CiAJCX0KIAkJc2VjdXJpdHlfdGFza190b19pbm9kZSh0YXNrLCBpbm9kZSk7CisJCXB1dF90YXNrX3N0cnVjdCh0YXNrKTsKIAkJcmV0dXJuIDE7CiAJfQogCWRfZHJvcChkZW50cnkpOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHRpZF9mZF9yZXZhbGlkYXRlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCitzdGF0aWMgaW50IHBpZF9nZXRhdHRyKHN0cnVjdCB2ZnNtb3VudCAqbW50LCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBrc3RhdCAqc3RhdCkKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOwotCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayA9IHByb2NfdGFzayhpbm9kZSk7Ci0JaW50IGZkID0gcHJvY190eXBlKGlub2RlKSAtIFBST0NfVElEX0ZEX0RJUjsKLQlzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmaWxlczsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7CisJZ2VuZXJpY19maWxsYXR0cihpbm9kZSwgc3RhdCk7CiAKLQlmaWxlcyA9IGdldF9maWxlc19zdHJ1Y3QodGFzayk7Ci0JaWYgKGZpbGVzKSB7Ci0JCXJjdV9yZWFkX2xvY2soKTsKLQkJaWYgKGZjaGVja19maWxlcyhmaWxlcywgZmQpKSB7Ci0JCQlyY3VfcmVhZF91bmxvY2soKTsKLQkJCXB1dF9maWxlc19zdHJ1Y3QoZmlsZXMpOwotCQkJaWYgKHRhc2tfZHVtcGFibGUodGFzaykpIHsKLQkJCQlpbm9kZS0+aV91aWQgPSB0YXNrLT5ldWlkOwotCQkJCWlub2RlLT5pX2dpZCA9IHRhc2stPmVnaWQ7Ci0JCQl9IGVsc2UgewotCQkJCWlub2RlLT5pX3VpZCA9IDA7Ci0JCQkJaW5vZGUtPmlfZ2lkID0gMDsKLQkJCX0KLQkJCXNlY3VyaXR5X3Rhc2tfdG9faW5vZGUodGFzaywgaW5vZGUpOwotCQkJcmV0dXJuIDE7CisJcmN1X3JlYWRfbG9jaygpOworCXN0YXQtPnVpZCA9IDA7CisJc3RhdC0+Z2lkID0gMDsKKwl0YXNrID0gcGlkX3Rhc2socHJvY19waWQoaW5vZGUpLCBQSURUWVBFX1BJRCk7CisJaWYgKHRhc2spIHsKKwkJaWYgKChpbm9kZS0+aV9tb2RlID09IChTX0lGRElSfFNfSVJVR098U19JWFVHTykpIHx8CisJCSAgICB0YXNrX2R1bXBhYmxlKHRhc2spKSB7CisJCQlzdGF0LT51aWQgPSB0YXNrLT5ldWlkOworCQkJc3RhdC0+Z2lkID0gdGFzay0+ZWdpZDsKIAkJfQotCQlyY3VfcmVhZF91bmxvY2soKTsKLQkJcHV0X2ZpbGVzX3N0cnVjdChmaWxlcyk7CiAJfQotCWRfZHJvcChkZW50cnkpOworCXJjdV9yZWFkX3VubG9jaygpOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBwaWRfYmFzZV9pcHV0KHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlub2RlICppbm9kZSkKK3N0YXRpYyBpbnQgdGlkX2ZkX3JldmFsaWRhdGUoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKIHsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgPSBwcm9jX3Rhc2soaW5vZGUpOwotCXNwaW5fbG9jaygmdGFzay0+cHJvY19sb2NrKTsKLQlpZiAodGFzay0+cHJvY19kZW50cnkgPT0gZGVudHJ5KQotCQl0YXNrLT5wcm9jX2RlbnRyeSA9IE5VTEw7Ci0Jc3Bpbl91bmxvY2soJnRhc2stPnByb2NfbG9jayk7Ci0JaXB1dChpbm9kZSk7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgPSBnZXRfcHJvY190YXNrKGlub2RlKTsKKwlpbnQgZmQgPSBwcm9jX2ZkKGlub2RlKTsKKwlzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmaWxlczsKKworCWlmICh0YXNrKSB7CisJCWZpbGVzID0gZ2V0X2ZpbGVzX3N0cnVjdCh0YXNrKTsKKwkJaWYgKGZpbGVzKSB7CisJCQlyY3VfcmVhZF9sb2NrKCk7CisJCQlpZiAoZmNoZWNrX2ZpbGVzKGZpbGVzLCBmZCkpIHsKKwkJCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJCQlwdXRfZmlsZXNfc3RydWN0KGZpbGVzKTsKKwkJCQlpZiAodGFza19kdW1wYWJsZSh0YXNrKSkgeworCQkJCQlpbm9kZS0+aV91aWQgPSB0YXNrLT5ldWlkOworCQkJCQlpbm9kZS0+aV9naWQgPSB0YXNrLT5lZ2lkOworCQkJCX0gZWxzZSB7CisJCQkJCWlub2RlLT5pX3VpZCA9IDA7CisJCQkJCWlub2RlLT5pX2dpZCA9IDA7CisJCQkJfQorCQkJCXNlY3VyaXR5X3Rhc2tfdG9faW5vZGUodGFzaywgaW5vZGUpOworCQkJCXB1dF90YXNrX3N0cnVjdCh0YXNrKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJCXJjdV9yZWFkX3VubG9jaygpOworCQkJcHV0X2ZpbGVzX3N0cnVjdChmaWxlcyk7CisJCX0KKwkJcHV0X3Rhc2tfc3RydWN0KHRhc2spOworCX0KKwlkX2Ryb3AoZGVudHJ5KTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBwaWRfZGVsZXRlX2RlbnRyeShzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5KQpAQCAtMTQ1OSw3ICsxNDA5LDcgQEAKIAkgKiBJZiBzbywgdGhlbiBkb24ndCBwdXQgdGhlIGRlbnRyeSBvbiB0aGUgbHJ1IGxpc3QsCiAJICoga2lsbCBpdCBpbW1lZGlhdGVseS4KIAkgKi8KLQlyZXR1cm4gIXBpZF9hbGl2ZShwcm9jX3Rhc2soZGVudHJ5LT5kX2lub2RlKSk7CisJcmV0dXJuICFwcm9jX3BpZChkZW50cnktPmRfaW5vZGUpLT50YXNrc1tQSURUWVBFX1BJRF0uZmlyc3Q7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZGVudHJ5X29wZXJhdGlvbnMgdGlkX2ZkX2RlbnRyeV9vcGVyYXRpb25zID0KQEAgLTE0NzQsMTMgKzE0MjQsNiBAQAogCS5kX2RlbGV0ZQk9IHBpZF9kZWxldGVfZGVudHJ5LAogfTsKIAotc3RhdGljIHN0cnVjdCBkZW50cnlfb3BlcmF0aW9ucyBwaWRfYmFzZV9kZW50cnlfb3BlcmF0aW9ucyA9Ci17Ci0JLmRfcmV2YWxpZGF0ZQk9IHBpZF9yZXZhbGlkYXRlLAotCS5kX2lwdXQJCT0gcGlkX2Jhc2VfaXB1dCwKLQkuZF9kZWxldGUJPSBwaWRfZGVsZXRlX2RlbnRyeSwKLX07Ci0KIC8qIExvb2t1cHMgKi8KIAogc3RhdGljIHVuc2lnbmVkIG5hbWVfdG9faW50KHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKQEAgLTE1MDgsMjIgKzE0NTEsMjQgQEAKIC8qIFNNUC1zYWZlICovCiBzdGF0aWMgc3RydWN0IGRlbnRyeSAqcHJvY19sb29rdXBmZChzdHJ1Y3QgaW5vZGUgKiBkaXIsIHN0cnVjdCBkZW50cnkgKiBkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQogewotCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayA9IHByb2NfdGFzayhkaXIpOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayA9IGdldF9wcm9jX3Rhc2soZGlyKTsKIAl1bnNpZ25lZCBmZCA9IG5hbWVfdG9faW50KGRlbnRyeSk7CisJc3RydWN0IGRlbnRyeSAqcmVzdWx0ID0gRVJSX1BUUigtRU5PRU5UKTsKIAlzdHJ1Y3QgZmlsZSAqIGZpbGU7CiAJc3RydWN0IGZpbGVzX3N0cnVjdCAqIGZpbGVzOwogCXN0cnVjdCBpbm9kZSAqaW5vZGU7CiAJc3RydWN0IHByb2NfaW5vZGUgKmVpOwogCisJaWYgKCF0YXNrKQorCQlnb3RvIG91dF9ub190YXNrOwogCWlmIChmZCA9PSB+MFUpCiAJCWdvdG8gb3V0OwotCWlmICghcGlkX2FsaXZlKHRhc2spKQotCQlnb3RvIG91dDsKIAogCWlub2RlID0gcHJvY19waWRfbWFrZV9pbm9kZShkaXItPmlfc2IsIHRhc2ssIFBST0NfVElEX0ZEX0RJUitmZCk7CiAJaWYgKCFpbm9kZSkKIAkJZ290byBvdXQ7CiAJZWkgPSBQUk9DX0koaW5vZGUpOworCWVpLT5mZCA9IGZkOwogCWZpbGVzID0gZ2V0X2ZpbGVzX3N0cnVjdCh0YXNrKTsKIAlpZiAoIWZpbGVzKQogCQlnb3RvIG91dF91bmxvY2s7CkBAIC0xNTQ4LDE5ICsxNDkzLDI1IEBACiAJZWktPm9wLnByb2NfZ2V0X2xpbmsgPSBwcm9jX2ZkX2xpbms7CiAJZGVudHJ5LT5kX29wID0gJnRpZF9mZF9kZW50cnlfb3BlcmF0aW9uczsKIAlkX2FkZChkZW50cnksIGlub2RlKTsKLQlyZXR1cm4gTlVMTDsKKwkvKiBDbG9zZSB0aGUgcmFjZSBvZiB0aGUgcHJvY2VzcyBkeWluZyBiZWZvcmUgd2UgcmV0dXJuIHRoZSBkZW50cnkgKi8KKwlpZiAodGlkX2ZkX3JldmFsaWRhdGUoZGVudHJ5LCBOVUxMKSkKKwkJcmVzdWx0ID0gTlVMTDsKK291dDoKKwlwdXRfdGFza19zdHJ1Y3QodGFzayk7CitvdXRfbm9fdGFzazoKKwlyZXR1cm4gcmVzdWx0OwogCiBvdXRfdW5sb2NrMjoKIAlzcGluX3VubG9jaygmZmlsZXMtPmZpbGVfbG9jayk7CiAJcHV0X2ZpbGVzX3N0cnVjdChmaWxlcyk7CiBvdXRfdW5sb2NrOgogCWlwdXQoaW5vZGUpOwotb3V0OgotCXJldHVybiBFUlJfUFRSKC1FTk9FTlQpOworCWdvdG8gb3V0OwogfQogCiBzdGF0aWMgaW50IHByb2NfdGFza19yZWFkZGlyKHN0cnVjdCBmaWxlICogZmlscCwgdm9pZCAqIGRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIpOwogc3RhdGljIHN0cnVjdCBkZW50cnkgKnByb2NfdGFza19sb29rdXAoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKiBkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKTsKK3N0YXRpYyBpbnQgcHJvY190YXNrX2dldGF0dHIoc3RydWN0IHZmc21vdW50ICptbnQsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGtzdGF0ICpzdGF0KTsKIAogc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19mZF9vcGVyYXRpb25zID0gewogCS5yZWFkCQk9IGdlbmVyaWNfcmVhZF9kaXIsCkBAIC0xNTc3LDEyICsxNTI4LDExIEBACiAgKi8KIHN0YXRpYyBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBwcm9jX2ZkX2lub2RlX29wZXJhdGlvbnMgPSB7CiAJLmxvb2t1cAkJPSBwcm9jX2xvb2t1cGZkLAotCS5wZXJtaXNzaW9uCT0gcHJvY19wZXJtaXNzaW9uLAogfTsKIAogc3RhdGljIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHByb2NfdGFza19pbm9kZV9vcGVyYXRpb25zID0gewogCS5sb29rdXAJCT0gcHJvY190YXNrX2xvb2t1cCwKLQkucGVybWlzc2lvbgk9IHByb2NfdGFza19wZXJtaXNzaW9uLAorCS5nZXRhdHRyCT0gcHJvY190YXNrX2dldGF0dHIsCiB9OwogCiAjaWZkZWYgQ09ORklHX1NFQ1VSSVRZCkBAIC0xNTkyLDEyICsxNTQyLDE3IEBACiAJc3RydWN0IGlub2RlICogaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKIAl1bnNpZ25lZCBsb25nIHBhZ2U7CiAJc3NpemVfdCBsZW5ndGg7Ci0Jc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrID0gcHJvY190YXNrKGlub2RlKTsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgPSBnZXRfcHJvY190YXNrKGlub2RlKTsKKworCWxlbmd0aCA9IC1FU1JDSDsKKwlpZiAoIXRhc2spCisJCWdvdG8gb3V0X25vX3Rhc2s7CiAKIAlpZiAoY291bnQgPiBQQUdFX1NJWkUpCiAJCWNvdW50ID0gUEFHRV9TSVpFOworCWxlbmd0aCA9IC1FTk9NRU07CiAJaWYgKCEocGFnZSA9IF9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKSkpCi0JCXJldHVybiAtRU5PTUVNOworCQlnb3RvIG91dDsKIAogCWxlbmd0aCA9IHNlY3VyaXR5X2dldHByb2NhdHRyKHRhc2ssIAogCQkJCSAgICAgIChjaGFyKilmaWxlLT5mX2RlbnRyeS0+ZF9uYW1lLm5hbWUsIApAQCAtMTYwNSw2ICsxNTYwLDkgQEAKIAlpZiAobGVuZ3RoID49IDApCiAJCWxlbmd0aCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgY291bnQsIHBwb3MsIChjaGFyICopcGFnZSwgbGVuZ3RoKTsKIAlmcmVlX3BhZ2UocGFnZSk7CitvdXQ6CisJcHV0X3Rhc2tfc3RydWN0KHRhc2spOworb3V0X25vX3Rhc2s6CiAJcmV0dXJuIGxlbmd0aDsKIH0KIApAQCAtMTYxNCwyNiArMTU3MiwzNiBAQAogCXN0cnVjdCBpbm9kZSAqIGlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CiAJY2hhciAqcGFnZTsgCiAJc3NpemVfdCBsZW5ndGg7IAotCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayA9IHByb2NfdGFzayhpbm9kZSk7IAorCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayA9IGdldF9wcm9jX3Rhc2soaW5vZGUpOwogCisJbGVuZ3RoID0gLUVTUkNIOworCWlmICghdGFzaykKKwkJZ290byBvdXRfbm9fdGFzazsKIAlpZiAoY291bnQgPiBQQUdFX1NJWkUpIAogCQljb3VudCA9IFBBR0VfU0laRTsgCi0JaWYgKCpwcG9zICE9IDApIHsKLQkJLyogTm8gcGFydGlhbCB3cml0ZXMuICovCi0JCXJldHVybiAtRUlOVkFMOwotCX0KKworCS8qIE5vIHBhcnRpYWwgd3JpdGVzLiAqLworCWxlbmd0aCA9IC1FSU5WQUw7CisJaWYgKCpwcG9zICE9IDApCisJCWdvdG8gb3V0OworCisJbGVuZ3RoID0gLUVOT01FTTsKIAlwYWdlID0gKGNoYXIqKV9fZ2V0X2ZyZWVfcGFnZShHRlBfVVNFUik7IAogCWlmICghcGFnZSkgCi0JCXJldHVybiAtRU5PTUVNOworCQlnb3RvIG91dDsKKwogCWxlbmd0aCA9IC1FRkFVTFQ7IAogCWlmIChjb3B5X2Zyb21fdXNlcihwYWdlLCBidWYsIGNvdW50KSkgCi0JCWdvdG8gb3V0OworCQlnb3RvIG91dF9mcmVlOwogCiAJbGVuZ3RoID0gc2VjdXJpdHlfc2V0cHJvY2F0dHIodGFzaywgCiAJCQkJICAgICAgKGNoYXIqKWZpbGUtPmZfZGVudHJ5LT5kX25hbWUubmFtZSwgCiAJCQkJICAgICAgKHZvaWQqKXBhZ2UsIGNvdW50KTsKLW91dDoKK291dF9mcmVlOgogCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgcGFnZSk7CitvdXQ6CisJcHV0X3Rhc2tfc3RydWN0KHRhc2spOworb3V0X25vX3Rhc2s6CiAJcmV0dXJuIGxlbmd0aDsKIH0gCiAKQEAgLTE2NDgsMjQgKzE2MTYsMjIgQEAKIHN0YXRpYyBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBwcm9jX3RnaWRfYXR0cl9pbm9kZV9vcGVyYXRpb25zOwogI2VuZGlmCiAKLXN0YXRpYyBpbnQgZ2V0X3RpZF9saXN0KGludCBpbmRleCwgdW5zaWduZWQgaW50ICp0aWRzLCBzdHJ1Y3QgaW5vZGUgKmRpcik7Ci0KIC8qIFNNUC1zYWZlICovCiBzdGF0aWMgc3RydWN0IGRlbnRyeSAqcHJvY19waWRlbnRfbG9va3VwKHN0cnVjdCBpbm9kZSAqZGlyLCAKIAkJCQkJIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKIAkJCQkJIHN0cnVjdCBwaWRfZW50cnkgKmVudHMpCiB7CiAJc3RydWN0IGlub2RlICppbm9kZTsKLQlpbnQgZXJyb3I7Ci0Jc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrID0gcHJvY190YXNrKGRpcik7CisJc3RydWN0IGRlbnRyeSAqZXJyb3I7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrID0gZ2V0X3Byb2NfdGFzayhkaXIpOwogCXN0cnVjdCBwaWRfZW50cnkgKnA7CiAJc3RydWN0IHByb2NfaW5vZGUgKmVpOwogCi0JZXJyb3IgPSAtRU5PRU5UOworCWVycm9yID0gRVJSX1BUUigtRU5PRU5UKTsKIAlpbm9kZSA9IE5VTEw7CiAKLQlpZiAoIXBpZF9hbGl2ZSh0YXNrKSkKLQkJZ290byBvdXQ7CisJaWYgKCF0YXNrKQorCQlnb3RvIG91dF9ub190YXNrOwogCiAJZm9yIChwID0gZW50czsgcC0+bmFtZTsgcCsrKSB7CiAJCWlmIChwLT5sZW4gIT0gZGVudHJ5LT5kX25hbWUubGVuKQpAQCAtMTY3Niw3ICsxNjQyLDcgQEAKIAlpZiAoIXAtPm5hbWUpCiAJCWdvdG8gb3V0OwogCi0JZXJyb3IgPSAtRUlOVkFMOworCWVycm9yID0gRVJSX1BUUigtRUlOVkFMKTsKIAlpbm9kZSA9IHByb2NfcGlkX21ha2VfaW5vZGUoZGlyLT5pX3NiLCB0YXNrLCBwLT50eXBlKTsKIAlpZiAoIWlub2RlKQogCQlnb3RvIG91dDsKQEAgLTE2ODksNyArMTY1NSw3IEBACiAJICovCiAJc3dpdGNoKHAtPnR5cGUpIHsKIAkJY2FzZSBQUk9DX1RHSURfVEFTSzoKLQkJCWlub2RlLT5pX25saW5rID0gMiArIGdldF90aWRfbGlzdCgyLCBOVUxMLCBkaXIpOworCQkJaW5vZGUtPmlfbmxpbmsgPSAyOwogCQkJaW5vZGUtPmlfb3AgPSAmcHJvY190YXNrX2lub2RlX29wZXJhdGlvbnM7CiAJCQlpbm9kZS0+aV9mb3AgPSAmcHJvY190YXNrX29wZXJhdGlvbnM7CiAJCQlicmVhazsKQEAgLTE3NTksNyArMTcyNSw2IEBACiAjZW5kaWYKIAkJY2FzZSBQUk9DX1RJRF9NRU06CiAJCWNhc2UgUFJPQ19UR0lEX01FTToKLQkJCWlub2RlLT5pX29wID0gJnByb2NfbWVtX2lub2RlX29wZXJhdGlvbnM7CiAJCQlpbm9kZS0+aV9mb3AgPSAmcHJvY19tZW1fb3BlcmF0aW9uczsKIAkJCWJyZWFrOwogI2lmZGVmIENPTkZJR19TRUNDT01QCkBAIC0xODAxLDYgKzE3NjYsMTAgQEAKIAkJY2FzZSBQUk9DX1RHSURfQVRUUl9FWEVDOgogCQljYXNlIFBST0NfVElEX0FUVFJfRlNDUkVBVEU6CiAJCWNhc2UgUFJPQ19UR0lEX0FUVFJfRlNDUkVBVEU6CisJCWNhc2UgUFJPQ19USURfQVRUUl9LRVlDUkVBVEU6CisJCWNhc2UgUFJPQ19UR0lEX0FUVFJfS0VZQ1JFQVRFOgorCQljYXNlIFBST0NfVElEX0FUVFJfU09DS0NSRUFURToKKwkJY2FzZSBQUk9DX1RHSURfQVRUUl9TT0NLQ1JFQVRFOgogCQkJaW5vZGUtPmlfZm9wID0gJnByb2NfcGlkX2F0dHJfb3BlcmF0aW9uczsKIAkJCWJyZWFrOwogI2VuZGlmCkBAIC0xODQyLDE0ICsxODExLDE4IEBACiAJCWRlZmF1bHQ6CiAJCQlwcmludGsoInByb2NmczogaW1wb3NzaWJsZSB0eXBlICglZCkiLHAtPnR5cGUpOwogCQkJaXB1dChpbm9kZSk7Ci0JCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwkJCWVycm9yID0gRVJSX1BUUigtRUlOVkFMKTsKKwkJCWdvdG8gb3V0OwogCX0KIAlkZW50cnktPmRfb3AgPSAmcGlkX2RlbnRyeV9vcGVyYXRpb25zOwogCWRfYWRkKGRlbnRyeSwgaW5vZGUpOwotCXJldHVybiBOVUxMOwotCisJLyogQ2xvc2UgdGhlIHJhY2Ugb2YgdGhlIHByb2Nlc3MgZHlpbmcgYmVmb3JlIHdlIHJldHVybiB0aGUgZGVudHJ5ICovCisJaWYgKHBpZF9yZXZhbGlkYXRlKGRlbnRyeSwgTlVMTCkpCisJCWVycm9yID0gTlVMTDsKIG91dDoKLQlyZXR1cm4gRVJSX1BUUihlcnJvcik7CisJcHV0X3Rhc2tfc3RydWN0KHRhc2spOworb3V0X25vX3Rhc2s6CisJcmV0dXJuIGVycm9yOwogfQogCiBzdGF0aWMgc3RydWN0IGRlbnRyeSAqcHJvY190Z2lkX2Jhc2VfbG9va3VwKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKXsKQEAgLTE4NzIsMTAgKzE4NDUsMTIgQEAKIAogc3RhdGljIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHByb2NfdGdpZF9iYXNlX2lub2RlX29wZXJhdGlvbnMgPSB7CiAJLmxvb2t1cAkJPSBwcm9jX3RnaWRfYmFzZV9sb29rdXAsCisJLmdldGF0dHIJPSBwaWRfZ2V0YXR0ciwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBwcm9jX3RpZF9iYXNlX2lub2RlX29wZXJhdGlvbnMgPSB7CiAJLmxvb2t1cAkJPSBwcm9jX3RpZF9iYXNlX2xvb2t1cCwKKwkuZ2V0YXR0cgk9IHBpZF9nZXRhdHRyLAogfTsKIAogI2lmZGVmIENPTkZJR19TRUNVUklUWQpAQCAtMTkxNywxMCArMTg5MiwxMiBAQAogCiBzdGF0aWMgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgcHJvY190Z2lkX2F0dHJfaW5vZGVfb3BlcmF0aW9ucyA9IHsKIAkubG9va3VwCQk9IHByb2NfdGdpZF9hdHRyX2xvb2t1cCwKKwkuZ2V0YXR0cgk9IHBpZF9nZXRhdHRyLAogfTsKIAogc3RhdGljIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHByb2NfdGlkX2F0dHJfaW5vZGVfb3BlcmF0aW9ucyA9IHsKIAkubG9va3VwCQk9IHByb2NfdGlkX2F0dHJfbG9va3VwLAorCS5nZXRhdHRyCT0gcGlkX2dldGF0dHIsCiB9OwogI2VuZGlmCiAKQEAgLTE5MzAsMTQgKzE5MDcsMTQgQEAKIHN0YXRpYyBpbnQgcHJvY19zZWxmX3JlYWRsaW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY2hhciBfX3VzZXIgKmJ1ZmZlciwKIAkJCSAgICAgIGludCBidWZsZW4pCiB7Ci0JY2hhciB0bXBbMzBdOworCWNoYXIgdG1wW1BST0NfTlVNQlVGXTsKIAlzcHJpbnRmKHRtcCwgIiVkIiwgY3VycmVudC0+dGdpZCk7CiAJcmV0dXJuIHZmc19yZWFkbGluayhkZW50cnksYnVmZmVyLGJ1Zmxlbix0bXApOwogfQogCiBzdGF0aWMgdm9pZCAqcHJvY19zZWxmX2ZvbGxvd19saW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCiB7Ci0JY2hhciB0bXBbMzBdOworCWNoYXIgdG1wW1BST0NfTlVNQlVGXTsKIAlzcHJpbnRmKHRtcCwgIiVkIiwgY3VycmVudC0+dGdpZCk7CiAJcmV0dXJuIEVSUl9QVFIodmZzX2ZvbGxvd19saW5rKG5kLHRtcCkpOwogfQkKQEAgLTE5NDgsNjcgKzE5MjUsODAgQEAKIH07CiAKIC8qKgotICogcHJvY19waWRfdW5oYXNoIC0gIFVuaGFzaCAvcHJvYy9AcGlkIGVudHJ5IGZyb20gdGhlIGRjYWNoZS4KLSAqIEBwOiB0YXNrIHRoYXQgc2hvdWxkIGJlIGZsdXNoZWQuCisgKiBwcm9jX2ZsdXNoX3Rhc2sgLSAgUmVtb3ZlIGRjYWNoZSBlbnRyaWVzIGZvciBAdGFzayBmcm9tIHRoZSAvcHJvYyBkY2FjaGUuCiAgKgotICogRHJvcHMgdGhlIC9wcm9jL0BwaWQgZGNhY2hlIGVudHJ5IGZyb20gdGhlIGhhc2ggY2hhaW5zLgorICogQHRhc2s6IHRhc2sgdGhhdCBzaG91bGQgYmUgZmx1c2hlZC4KICAqCi0gKiBEcm9wcGluZyAvcHJvYy9AcGlkIGVudHJpZXMgYW5kIGRldGFjaF9waWQgbXVzdCBiZSBzeW5jaHJvbmVvdXMsCi0gKiBvdGhlcndpc2UgZS5nLiAvcHJvYy9AcGlkL2V4ZSBtaWdodCBwb2ludCB0byB0aGUgd3JvbmcgZXhlY3V0YWJsZSwKLSAqIGlmIHRoZSBwaWQgdmFsdWUgaXMgaW1tZWRpYXRlbHkgcmV1c2VkLiBUaGlzIGlzIGVuZm9yY2VkIGJ5Ci0gKiAtIGNhbGxlciBtdXN0IGFjcXVpcmUgc3Bpbl9sb2NrKHAtPnByb2NfbG9jaykKLSAqIC0gbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGRldGFjaF9waWQoKQotICogLSBwcm9jX3BpZF9sb29rdXAgYWNxdWlyZXMgcHJvY19sb2NrLCBhbmQgY2hlY2tzIHRoYXQKLSAqICAgdGhlIHRhcmdldCBpcyBub3QgZGVhZCBieSBsb29raW5nIGF0IHRoZSBhdHRhY2ggY291bnQKLSAqICAgb2YgUElEVFlQRV9QSUQuCisgKiBMb29rcyBpbiB0aGUgZGNhY2hlIGZvcgorICogL3Byb2MvQHBpZAorICogL3Byb2MvQHRnaWQvdGFzay9AcGlkCisgKiBpZiBlaXRoZXIgZGlyZWN0b3J5IGlzIHByZXNlbnQgZmx1c2hlcyBpdCBhbmQgYWxsIG9mIGl0J3RzIGNoaWxkcmVuCisgKiBmcm9tIHRoZSBkY2FjaGUuCisgKgorICogSXQgaXMgc2FmZSBhbmQgcmVhc29uYWJsZSB0byBjYWNoZSAvcHJvYyBlbnRyaWVzIGZvciBhIHRhc2sgdW50aWwKKyAqIHRoYXQgdGFzayBleGl0cy4gIEFmdGVyIHRoYXQgdGhleSBqdXN0IGNsb2cgdXAgdGhlIGRjYWNoZSB3aXRoCisgKiB1c2VsZXNzIGVudHJpZXMsIHBvc3NpYmx5IGNhdXNpbmcgdXNlZnVsIGRjYWNoZSBlbnRyaWVzIHRvIGJlCisgKiBmbHVzaGVkIGluc3RlYWQuICBUaGlzIHJvdXRpbmUgaXMgcHJvdmVkIHRvIGZsdXNoIHRob3NlIHVzZWxlc3MKKyAqIGRjYWNoZSBlbnRyaWVzIGF0IHByb2Nlc3MgZXhpdCB0aW1lLgorICoKKyAqIE5PVEU6IFRoaXMgcm91dGluZSBpcyBqdXN0IGFuIG9wdGltaXphdGlvbiBzbyBpdCBkb2VzIG5vdCBndWFyYW50ZWUKKyAqICAgICAgIHRoYXQgbm8gZGNhY2hlIGVudHJpZXMgd2lsbCBleGlzdCBhdCBwcm9jZXNzIGV4aXQgdGltZSBpdAorICogICAgICAganVzdCBtYWtlcyBpdCB2ZXJ5IHVubGlrZWx5IHRoYXQgYW55IHdpbGwgcGVyc2lzdC4KICAqLwotCi1zdHJ1Y3QgZGVudHJ5ICpwcm9jX3BpZF91bmhhc2goc3RydWN0IHRhc2tfc3RydWN0ICpwKQordm9pZCBwcm9jX2ZsdXNoX3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQogewotCXN0cnVjdCBkZW50cnkgKnByb2NfZGVudHJ5OworCXN0cnVjdCBkZW50cnkgKmRlbnRyeSwgKmxlYWRlciwgKmRpcjsKKwljaGFyIGJ1ZltQUk9DX05VTUJVRl07CisJc3RydWN0IHFzdHIgbmFtZTsKIAotCXByb2NfZGVudHJ5ID0gcC0+cHJvY19kZW50cnk7Ci0JaWYgKHByb2NfZGVudHJ5ICE9IE5VTEwpIHsKLQotCQlzcGluX2xvY2soJmRjYWNoZV9sb2NrKTsKLQkJc3Bpbl9sb2NrKCZwcm9jX2RlbnRyeS0+ZF9sb2NrKTsKLQkJaWYgKCFkX3VuaGFzaGVkKHByb2NfZGVudHJ5KSkgewotCQkJZGdldF9sb2NrZWQocHJvY19kZW50cnkpOwotCQkJX19kX2Ryb3AocHJvY19kZW50cnkpOwotCQkJc3Bpbl91bmxvY2soJnByb2NfZGVudHJ5LT5kX2xvY2spOwotCQl9IGVsc2UgewotCQkJc3Bpbl91bmxvY2soJnByb2NfZGVudHJ5LT5kX2xvY2spOwotCQkJcHJvY19kZW50cnkgPSBOVUxMOwotCQl9Ci0JCXNwaW5fdW5sb2NrKCZkY2FjaGVfbG9jayk7CisJbmFtZS5uYW1lID0gYnVmOworCW5hbWUubGVuID0gc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiVkIiwgdGFzay0+cGlkKTsKKwlkZW50cnkgPSBkX2hhc2hfYW5kX2xvb2t1cChwcm9jX21udC0+bW50X3Jvb3QsICZuYW1lKTsKKwlpZiAoZGVudHJ5KSB7CisJCXNocmlua19kY2FjaGVfcGFyZW50KGRlbnRyeSk7CisJCWRfZHJvcChkZW50cnkpOworCQlkcHV0KGRlbnRyeSk7CiAJfQotCXJldHVybiBwcm9jX2RlbnRyeTsKLX0KIAotLyoqCi0gKiBwcm9jX3BpZF9mbHVzaCAtIHJlY292ZXIgbWVtb3J5IHVzZWQgYnkgc3RhbGUgL3Byb2MvQHBpZC94IGVudHJpZXMKLSAqIEBwcm9jX2RlbnRyeTogZGlyZWN0b3kgdG8gcHJ1bmUuCi0gKgotICogU2hyaW5rIHRoZSAvcHJvYyBkaXJlY3RvcnkgdGhhdCB3YXMgdXNlZCBieSB0aGUganVzdCBraWxsZWQgdGhyZWFkLgotICovCi0JCi12b2lkIHByb2NfcGlkX2ZsdXNoKHN0cnVjdCBkZW50cnkgKnByb2NfZGVudHJ5KQotewotCW1pZ2h0X3NsZWVwKCk7Ci0JaWYocHJvY19kZW50cnkgIT0gTlVMTCkgewotCQlzaHJpbmtfZGNhY2hlX3BhcmVudChwcm9jX2RlbnRyeSk7Ci0JCWRwdXQocHJvY19kZW50cnkpOworCWlmICh0aHJlYWRfZ3JvdXBfbGVhZGVyKHRhc2spKQorCQlnb3RvIG91dDsKKworCW5hbWUubmFtZSA9IGJ1ZjsKKwluYW1lLmxlbiA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlZCIsIHRhc2stPnRnaWQpOworCWxlYWRlciA9IGRfaGFzaF9hbmRfbG9va3VwKHByb2NfbW50LT5tbnRfcm9vdCwgJm5hbWUpOworCWlmICghbGVhZGVyKQorCQlnb3RvIG91dDsKKworCW5hbWUubmFtZSA9ICJ0YXNrIjsKKwluYW1lLmxlbiA9IHN0cmxlbihuYW1lLm5hbWUpOworCWRpciA9IGRfaGFzaF9hbmRfbG9va3VwKGxlYWRlciwgJm5hbWUpOworCWlmICghZGlyKQorCQlnb3RvIG91dF9wdXRfbGVhZGVyOworCisJbmFtZS5uYW1lID0gYnVmOworCW5hbWUubGVuID0gc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiVkIiwgdGFzay0+cGlkKTsKKwlkZW50cnkgPSBkX2hhc2hfYW5kX2xvb2t1cChkaXIsICZuYW1lKTsKKwlpZiAoZGVudHJ5KSB7CisJCXNocmlua19kY2FjaGVfcGFyZW50KGRlbnRyeSk7CisJCWRfZHJvcChkZW50cnkpOworCQlkcHV0KGRlbnRyeSk7CiAJfQorCisJZHB1dChkaXIpOworb3V0X3B1dF9sZWFkZXI6CisJZHB1dChsZWFkZXIpOworb3V0OgorCXJldHVybjsKIH0KIAogLyogU01QLXNhZmUgKi8KIHN0cnVjdCBkZW50cnkgKnByb2NfcGlkX2xvb2t1cChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqIGRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCiB7CisJc3RydWN0IGRlbnRyeSAqcmVzdWx0ID0gRVJSX1BUUigtRU5PRU5UKTsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7CiAJc3RydWN0IGlub2RlICppbm9kZTsKIAlzdHJ1Y3QgcHJvY19pbm9kZSAqZWk7CiAJdW5zaWduZWQgdGdpZDsKLQlpbnQgZGllZDsKIAogCWlmIChkZW50cnktPmRfbmFtZS5sZW4gPT0gNCAmJiAhbWVtY21wKGRlbnRyeS0+ZF9uYW1lLm5hbWUsInNlbGYiLDQpKSB7CiAJCWlub2RlID0gbmV3X2lub2RlKGRpci0+aV9zYik7CkBAIC0yMDI5LDIxICsyMDE5LDE4IEBACiAJaWYgKHRnaWQgPT0gfjBVKQogCQlnb3RvIG91dDsKIAotCXJlYWRfbG9jaygmdGFza2xpc3RfbG9jayk7CisJcmN1X3JlYWRfbG9jaygpOwogCXRhc2sgPSBmaW5kX3Rhc2tfYnlfcGlkKHRnaWQpOwogCWlmICh0YXNrKQogCQlnZXRfdGFza19zdHJ1Y3QodGFzayk7Ci0JcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOworCXJjdV9yZWFkX3VubG9jaygpOwogCWlmICghdGFzaykKIAkJZ290byBvdXQ7CiAKIAlpbm9kZSA9IHByb2NfcGlkX21ha2VfaW5vZGUoZGlyLT5pX3NiLCB0YXNrLCBQUk9DX1RHSURfSU5PKTsKKwlpZiAoIWlub2RlKQorCQlnb3RvIG91dF9wdXRfdGFzazsKIAotCi0JaWYgKCFpbm9kZSkgewotCQlwdXRfdGFza19zdHJ1Y3QodGFzayk7Ci0JCWdvdG8gb3V0OwotCX0KIAlpbm9kZS0+aV9tb2RlID0gU19JRkRJUnxTX0lSVUdPfFNfSVhVR087CiAJaW5vZGUtPmlfb3AgPSAmcHJvY190Z2lkX2Jhc2VfaW5vZGVfb3BlcmF0aW9uczsKIAlpbm9kZS0+aV9mb3AgPSAmcHJvY190Z2lkX2Jhc2Vfb3BlcmF0aW9uczsKQEAgLTIwNTQsNDUgKzIwNDEsNDAgQEAKIAlpbm9kZS0+aV9ubGluayA9IDQ7CiAjZW5kaWYKIAotCWRlbnRyeS0+ZF9vcCA9ICZwaWRfYmFzZV9kZW50cnlfb3BlcmF0aW9uczsKKwlkZW50cnktPmRfb3AgPSAmcGlkX2RlbnRyeV9vcGVyYXRpb25zOwogCi0JZGllZCA9IDA7CiAJZF9hZGQoZGVudHJ5LCBpbm9kZSk7Ci0Jc3Bpbl9sb2NrKCZ0YXNrLT5wcm9jX2xvY2spOwotCXRhc2stPnByb2NfZGVudHJ5ID0gZGVudHJ5OwotCWlmICghcGlkX2FsaXZlKHRhc2spKSB7Ci0JCWRlbnRyeSA9IHByb2NfcGlkX3VuaGFzaCh0YXNrKTsKLQkJZGllZCA9IDE7Ci0JfQotCXNwaW5fdW5sb2NrKCZ0YXNrLT5wcm9jX2xvY2spOworCS8qIENsb3NlIHRoZSByYWNlIG9mIHRoZSBwcm9jZXNzIGR5aW5nIGJlZm9yZSB3ZSByZXR1cm4gdGhlIGRlbnRyeSAqLworCWlmIChwaWRfcmV2YWxpZGF0ZShkZW50cnksIE5VTEwpKQorCQlyZXN1bHQgPSBOVUxMOwogCitvdXRfcHV0X3Rhc2s6CiAJcHV0X3Rhc2tfc3RydWN0KHRhc2spOwotCWlmIChkaWVkKSB7Ci0JCXByb2NfcGlkX2ZsdXNoKGRlbnRyeSk7Ci0JCWdvdG8gb3V0OwotCX0KLQlyZXR1cm4gTlVMTDsKIG91dDoKLQlyZXR1cm4gRVJSX1BUUigtRU5PRU5UKTsKKwlyZXR1cm4gcmVzdWx0OwogfQogCiAvKiBTTVAtc2FmZSAqLwogc3RhdGljIHN0cnVjdCBkZW50cnkgKnByb2NfdGFza19sb29rdXAoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKiBkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQogeworCXN0cnVjdCBkZW50cnkgKnJlc3VsdCA9IEVSUl9QVFIoLUVOT0VOVCk7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrOwotCXN0cnVjdCB0YXNrX3N0cnVjdCAqbGVhZGVyID0gcHJvY190YXNrKGRpcik7CisJc3RydWN0IHRhc2tfc3RydWN0ICpsZWFkZXIgPSBnZXRfcHJvY190YXNrKGRpcik7CiAJc3RydWN0IGlub2RlICppbm9kZTsKIAl1bnNpZ25lZCB0aWQ7CiAKKwlpZiAoIWxlYWRlcikKKwkJZ290byBvdXRfbm9fdGFzazsKKwogCXRpZCA9IG5hbWVfdG9faW50KGRlbnRyeSk7CiAJaWYgKHRpZCA9PSB+MFUpCiAJCWdvdG8gb3V0OwogCi0JcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKwlyY3VfcmVhZF9sb2NrKCk7CiAJdGFzayA9IGZpbmRfdGFza19ieV9waWQodGlkKTsKIAlpZiAodGFzaykKIAkJZ2V0X3Rhc2tfc3RydWN0KHRhc2spOwotCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKwlyY3VfcmVhZF91bmxvY2soKTsKIAlpZiAoIXRhc2spCiAJCWdvdG8gb3V0OwogCWlmIChsZWFkZXItPnRnaWQgIT0gdGFzay0+dGdpZCkKQEAgLTIxMTMsMTAxICsyMDk1LDk1IEBACiAJaW5vZGUtPmlfbmxpbmsgPSAzOwogI2VuZGlmCiAKLQlkZW50cnktPmRfb3AgPSAmcGlkX2Jhc2VfZGVudHJ5X29wZXJhdGlvbnM7CisJZGVudHJ5LT5kX29wID0gJnBpZF9kZW50cnlfb3BlcmF0aW9uczsKIAogCWRfYWRkKGRlbnRyeSwgaW5vZGUpOworCS8qIENsb3NlIHRoZSByYWNlIG9mIHRoZSBwcm9jZXNzIGR5aW5nIGJlZm9yZSB3ZSByZXR1cm4gdGhlIGRlbnRyeSAqLworCWlmIChwaWRfcmV2YWxpZGF0ZShkZW50cnksIE5VTEwpKQorCQlyZXN1bHQgPSBOVUxMOwogCi0JcHV0X3Rhc2tfc3RydWN0KHRhc2spOwotCXJldHVybiBOVUxMOwogb3V0X2Ryb3BfdGFzazoKIAlwdXRfdGFza19zdHJ1Y3QodGFzayk7CiBvdXQ6Ci0JcmV0dXJuIEVSUl9QVFIoLUVOT0VOVCk7Ci19Ci0KLSNkZWZpbmUgUFJPQ19OVU1CVUYgMTAKLSNkZWZpbmUgUFJPQ19NQVhQSURTIDIwCi0KLS8qCi0gKiBHZXQgYSBmZXcgdGdpZCdzIHRvIHJldHVybiBmb3IgZmlsbGRpciAtIHdlIG5lZWQgdG8gaG9sZCB0aGUKLSAqIHRhc2tsaXN0IGxvY2sgd2hpbGUgZG9pbmcgdGhpcywgYW5kIHdlIG11c3QgcmVsZWFzZSBpdCBiZWZvcmUKLSAqIHdlIGFjdHVhbGx5IGRvIHRoZSBmaWxsZGlyIGl0c2VsZiwgc28gd2UgdXNlIGEgdGVtcCBidWZmZXIuLgotICovCi1zdGF0aWMgaW50IGdldF90Z2lkX2xpc3QoaW50IGluZGV4LCB1bnNpZ25lZCBsb25nIHZlcnNpb24sIHVuc2lnbmVkIGludCAqdGdpZHMpCi17Ci0Jc3RydWN0IHRhc2tfc3RydWN0ICpwOwotCWludCBucl90Z2lkcyA9IDA7Ci0KLQlpbmRleC0tOwotCXJlYWRfbG9jaygmdGFza2xpc3RfbG9jayk7Ci0JcCA9IE5VTEw7Ci0JaWYgKHZlcnNpb24pIHsKLQkJcCA9IGZpbmRfdGFza19ieV9waWQodmVyc2lvbik7Ci0JCWlmIChwICYmICF0aHJlYWRfZ3JvdXBfbGVhZGVyKHApKQotCQkJcCA9IE5VTEw7Ci0JfQotCi0JaWYgKHApCi0JCWluZGV4ID0gMDsKLQllbHNlCi0JCXAgPSBuZXh0X3Rhc2soJmluaXRfdGFzayk7Ci0KLQlmb3IgKCA7IHAgIT0gJmluaXRfdGFzazsgcCA9IG5leHRfdGFzayhwKSkgewotCQlpbnQgdGdpZCA9IHAtPnBpZDsKLQkJaWYgKCFwaWRfYWxpdmUocCkpCi0JCQljb250aW51ZTsKLQkJaWYgKC0taW5kZXggPj0gMCkKLQkJCWNvbnRpbnVlOwotCQl0Z2lkc1tucl90Z2lkc10gPSB0Z2lkOwotCQlucl90Z2lkcysrOwotCQlpZiAobnJfdGdpZHMgPj0gUFJPQ19NQVhQSURTKQotCQkJYnJlYWs7Ci0JfQotCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKLQlyZXR1cm4gbnJfdGdpZHM7CisJcHV0X3Rhc2tfc3RydWN0KGxlYWRlcik7CitvdXRfbm9fdGFzazoKKwlyZXR1cm4gcmVzdWx0OwogfQogCiAvKgotICogR2V0IGEgZmV3IHRpZCdzIHRvIHJldHVybiBmb3IgZmlsbGRpciAtIHdlIG5lZWQgdG8gaG9sZCB0aGUKLSAqIHRhc2tsaXN0IGxvY2sgd2hpbGUgZG9pbmcgdGhpcywgYW5kIHdlIG11c3QgcmVsZWFzZSBpdCBiZWZvcmUKLSAqIHdlIGFjdHVhbGx5IGRvIHRoZSBmaWxsZGlyIGl0c2VsZiwgc28gd2UgdXNlIGEgdGVtcCBidWZmZXIuLgorICogRmluZCB0aGUgZmlyc3QgdGdpZCB0byByZXR1cm4gdG8gdXNlciBzcGFjZS4KKyAqCisgKiBVc3VhbGx5IHRoaXMgaXMganVzdCB3aGF0ZXZlciBmb2xsb3dzICZpbml0X3Rhc2ssIGJ1dCBpZiB0aGUgdXNlcnMKKyAqIGJ1ZmZlciB3YXMgdG9vIHNtYWxsIHRvIGhvbGQgdGhlIGZ1bGwgbGlzdCBvciB0aGVyZSB3YXMgYSBzZWVrIGludG8KKyAqIHRoZSBtaWRkbGUgb2YgdGhlIGRpcmVjdG9yeSB3ZSBoYXZlIG1vcmUgd29yayB0byBkby4KKyAqCisgKiBJbiB0aGUgY2FzZSBvZiBhIHNob3J0IHJlYWQgd2Ugc3RhcnQgd2l0aCBmaW5kX3Rhc2tfYnlfcGlkLgorICoKKyAqIEluIHRoZSBjYXNlIG9mIGEgc2VlayB3ZSBzdGFydCB3aXRoICZpbml0X3Rhc2sgYW5kIHdhbGsgbnIKKyAqIHRocmVhZHMgcGFzdCBpdC4KICAqLwotc3RhdGljIGludCBnZXRfdGlkX2xpc3QoaW50IGluZGV4LCB1bnNpZ25lZCBpbnQgKnRpZHMsIHN0cnVjdCBpbm9kZSAqZGlyKQorc3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqZmlyc3RfdGdpZChpbnQgdGdpZCwgdW5zaWduZWQgaW50IG5yKQogewotCXN0cnVjdCB0YXNrX3N0cnVjdCAqbGVhZGVyX3Rhc2sgPSBwcm9jX3Rhc2soZGlyKTsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgPSBsZWFkZXJfdGFzazsKLQlpbnQgbnJfdGlkcyA9IDA7CisJc3RydWN0IHRhc2tfc3RydWN0ICpwb3M7CisJcmN1X3JlYWRfbG9jaygpOworCWlmICh0Z2lkICYmIG5yKSB7CisJCXBvcyA9IGZpbmRfdGFza19ieV9waWQodGdpZCk7CisJCWlmIChwb3MgJiYgdGhyZWFkX2dyb3VwX2xlYWRlcihwb3MpKQorCQkJZ290byBmb3VuZDsKKwl9CisJLyogSWYgbnIgZXhjZWVkcyB0aGUgbnVtYmVyIG9mIHByb2Nlc3NlcyBnZXQgb3V0IHF1aWNrbHkgKi8KKwlwb3MgPSBOVUxMOworCWlmIChuciAmJiBuciA+PSBucl9wcm9jZXNzZXMoKSkKKwkJZ290byBkb25lOwogCi0JaW5kZXggLT0gMjsKLQlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOwotCS8qCi0JICogVGhlIHN0YXJ0aW5nIHBvaW50IHRhc2sgKGxlYWRlcl90YXNrKSBtaWdodCBiZSBhbiBhbHJlYWR5Ci0JICogdW5saW5rZWQgdGFzaywgd2hpY2ggY2Fubm90IGJlIHVzZWQgdG8gYWNjZXNzIHRoZSB0YXNrLWxpc3QKLQkgKiB2aWEgbmV4dF90aHJlYWQoKS4KKwkvKiBJZiB3ZSBoYXZlbid0IGZvdW5kIG91ciBzdGFydGluZyBwbGFjZSB5ZXQgc3RhcnQgd2l0aAorCSAqIHRoZSBpbml0X3Rhc2sgYW5kIHdhbGsgbnIgdGFza3MgZm9yd2FyZC4KIAkgKi8KLQlpZiAocGlkX2FsaXZlKHRhc2spKSBkbyB7Ci0JCWludCB0aWQgPSB0YXNrLT5waWQ7CisJZm9yIChwb3MgPSBuZXh0X3Rhc2soJmluaXRfdGFzayk7IG5yID4gMDsgLS1ucikgeworCQlwb3MgPSBuZXh0X3Rhc2socG9zKTsKKwkJaWYgKHBvcyA9PSAmaW5pdF90YXNrKSB7CisJCQlwb3MgPSBOVUxMOworCQkJZ290byBkb25lOworCQl9CisJfQorZm91bmQ6CisJZ2V0X3Rhc2tfc3RydWN0KHBvcyk7Citkb25lOgorCXJjdV9yZWFkX3VubG9jaygpOworCXJldHVybiBwb3M7Cit9CiAKLQkJaWYgKC0taW5kZXggPj0gMCkKLQkJCWNvbnRpbnVlOwotCQlpZiAodGlkcyAhPSBOVUxMKQotCQkJdGlkc1tucl90aWRzXSA9IHRpZDsKLQkJbnJfdGlkcysrOwotCQlpZiAobnJfdGlkcyA+PSBQUk9DX01BWFBJRFMpCi0JCQlicmVhazsKLQl9IHdoaWxlICgodGFzayA9IG5leHRfdGhyZWFkKHRhc2spKSAhPSBsZWFkZXJfdGFzayk7Ci0JcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOwotCXJldHVybiBucl90aWRzOworLyoKKyAqIEZpbmQgdGhlIG5leHQgdGFzayBpbiB0aGUgdGFzayBsaXN0LgorICogUmV0dXJuIE5VTEwgaWYgd2UgbG9vcCBvciB0aGVyZSBpcyBhbnkgZXJyb3IuCisgKgorICogVGhlIHJlZmVyZW5jZSB0byB0aGUgaW5wdXQgdGFza19zdHJ1Y3QgaXMgcmVsZWFzZWQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKm5leHRfdGdpZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnN0YXJ0KQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqcG9zOworCXJjdV9yZWFkX2xvY2soKTsKKwlwb3MgPSBzdGFydDsKKwlpZiAocGlkX2FsaXZlKHN0YXJ0KSkKKwkJcG9zID0gbmV4dF90YXNrKHN0YXJ0KTsKKwlpZiAocGlkX2FsaXZlKHBvcykgJiYgKHBvcyAhPSAmaW5pdF90YXNrKSkgeworCQlnZXRfdGFza19zdHJ1Y3QocG9zKTsKKwkJZ290byBkb25lOworCX0KKwlwb3MgPSBOVUxMOworZG9uZToKKwlyY3VfcmVhZF91bmxvY2soKTsKKwlwdXRfdGFza19zdHJ1Y3Qoc3RhcnQpOworCXJldHVybiBwb3M7CiB9CiAKIC8qIGZvciB0aGUgL3Byb2MvIGRpcmVjdG9yeSBpdHNlbGYsIGFmdGVyIG5vbi1wcm9jZXNzIHN0dWZmIGhhcyBiZWVuIGRvbmUgKi8KIGludCBwcm9jX3BpZF9yZWFkZGlyKHN0cnVjdCBmaWxlICogZmlscCwgdm9pZCAqIGRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIpCiB7Ci0JdW5zaWduZWQgaW50IHRnaWRfYXJyYXlbUFJPQ19NQVhQSURTXTsKIAljaGFyIGJ1ZltQUk9DX05VTUJVRl07CiAJdW5zaWduZWQgaW50IG5yID0gZmlscC0+Zl9wb3MgLSBGSVJTVF9QUk9DRVNTX0VOVFJZOwotCXVuc2lnbmVkIGludCBucl90Z2lkcywgaTsKLQlpbnQgbmV4dF90Z2lkOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzazsKKwlpbnQgdGdpZDsKIAogCWlmICghbnIpIHsKIAkJaW5vX3QgaW5vID0gZmFrZV9pbm8oMCxQUk9DX1RHSURfSU5PKTsKQEAgLTIyMTYsNjMgKzIxOTIsMTE2IEBACiAJCWZpbHAtPmZfcG9zKys7CiAJCW5yKys7CiAJfQorCW5yIC09IDE7CiAKIAkvKiBmX3ZlcnNpb24gY2FjaGVzIHRoZSB0Z2lkIHZhbHVlIHRoYXQgdGhlIGxhc3QgcmVhZGRpciBjYWxsIGNvdWxkbid0CiAJICogcmV0dXJuLiBsc2VlayBha2EgdGVsbGRpciBhdXRvbWFnaWNhbGx5IHJlc2V0cyBmX3ZlcnNpb24gdG8gMC4KIAkgKi8KLQluZXh0X3RnaWQgPSBmaWxwLT5mX3ZlcnNpb247CisJdGdpZCA9IGZpbHAtPmZfdmVyc2lvbjsKIAlmaWxwLT5mX3ZlcnNpb24gPSAwOwotCWZvciAoOzspIHsKLQkJbnJfdGdpZHMgPSBnZXRfdGdpZF9saXN0KG5yLCBuZXh0X3RnaWQsIHRnaWRfYXJyYXkpOwotCQlpZiAoIW5yX3RnaWRzKSB7Ci0JCQkvKiBubyBtb3JlIGVudHJpZXMgISAqLworCWZvciAodGFzayA9IGZpcnN0X3RnaWQodGdpZCwgbnIpOworCSAgICAgdGFzazsKKwkgICAgIHRhc2sgPSBuZXh0X3RnaWQodGFzayksIGZpbHAtPmZfcG9zKyspIHsKKwkJaW50IGxlbjsKKwkJaW5vX3QgaW5vOworCQl0Z2lkID0gdGFzay0+cGlkOworCQlsZW4gPSBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJWQiLCB0Z2lkKTsKKwkJaW5vID0gZmFrZV9pbm8odGdpZCwgUFJPQ19UR0lEX0lOTyk7CisJCWlmIChmaWxsZGlyKGRpcmVudCwgYnVmLCBsZW4sIGZpbHAtPmZfcG9zLCBpbm8sIERUX0RJUikgPCAwKSB7CisJCQkvKiByZXR1cm5pbmcgdGhpcyB0Z2lkIGZhaWxlZCwgc2F2ZSBpdCBhcyB0aGUgZmlyc3QKKwkJCSAqIHBpZCBmb3IgdGhlIG5leHQgcmVhZGlyIGNhbGwgKi8KKwkJCWZpbHAtPmZfdmVyc2lvbiA9IHRnaWQ7CisJCQlwdXRfdGFza19zdHJ1Y3QodGFzayk7CiAJCQlicmVhazsKIAkJfQotCQluZXh0X3RnaWQgPSAwOworCX0KKwlyZXR1cm4gMDsKK30KIAotCQkvKiBkbyBub3QgdXNlIHRoZSBsYXN0IGZvdW5kIHBpZCwgcmVzZXJ2ZSBpdCBmb3IgbmV4dF90Z2lkICovCi0JCWlmIChucl90Z2lkcyA9PSBQUk9DX01BWFBJRFMpIHsKLQkJCW5yX3RnaWRzLS07Ci0JCQluZXh0X3RnaWQgPSB0Z2lkX2FycmF5W25yX3RnaWRzXTsKLQkJfQorLyoKKyAqIEZpbmQgdGhlIGZpcnN0IHRpZCBvZiBhIHRocmVhZCBncm91cCB0byByZXR1cm4gdG8gdXNlciBzcGFjZS4KKyAqCisgKiBVc3VhbGx5IHRoaXMgaXMganVzdCB0aGUgdGhyZWFkIGdyb3VwIGxlYWRlciwgYnV0IGlmIHRoZSB1c2VycworICogYnVmZmVyIHdhcyB0b28gc21hbGwgb3IgdGhlcmUgd2FzIGEgc2VlayBpbnRvIHRoZSBtaWRkbGUgb2YgdGhlCisgKiBkaXJlY3Rvcnkgd2UgaGF2ZSBtb3JlIHdvcmsgdG9kby4KKyAqCisgKiBJbiB0aGUgY2FzZSBvZiBhIHNob3J0IHJlYWQgd2Ugc3RhcnQgd2l0aCBmaW5kX3Rhc2tfYnlfcGlkLgorICoKKyAqIEluIHRoZSBjYXNlIG9mIGEgc2VlayB3ZSBzdGFydCB3aXRoIHRoZSBsZWFkZXIgYW5kIHdhbGsgbnIKKyAqIHRocmVhZHMgcGFzdCBpdC4KKyAqLworc3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqZmlyc3RfdGlkKHN0cnVjdCB0YXNrX3N0cnVjdCAqbGVhZGVyLAorCQkJCQlpbnQgdGlkLCBpbnQgbnIpCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICpwb3M7CiAKLQkJZm9yIChpPTA7aTxucl90Z2lkcztpKyspIHsKLQkJCWludCB0Z2lkID0gdGdpZF9hcnJheVtpXTsKLQkJCWlub190IGlubyA9IGZha2VfaW5vKHRnaWQsUFJPQ19UR0lEX0lOTyk7Ci0JCQl1bnNpZ25lZCBsb25nIGogPSBQUk9DX05VTUJVRjsKKwlyY3VfcmVhZF9sb2NrKCk7CisJLyogQXR0ZW1wdCB0byBzdGFydCB3aXRoIHRoZSBwaWQgb2YgYSB0aHJlYWQgKi8KKwlpZiAodGlkICYmIChuciA+IDApKSB7CisJCXBvcyA9IGZpbmRfdGFza19ieV9waWQodGlkKTsKKwkJaWYgKHBvcyAmJiAocG9zLT5ncm91cF9sZWFkZXIgPT0gbGVhZGVyKSkKKwkJCWdvdG8gZm91bmQ7CisJfQogCi0JCQlkbwotCQkJCWJ1ZlstLWpdID0gJzAnICsgKHRnaWQgJSAxMCk7Ci0JCQl3aGlsZSAoKHRnaWQgLz0gMTApICE9IDApOworCS8qIElmIG5yIGV4Y2VlZHMgdGhlIG51bWJlciBvZiB0aHJlYWRzIHRoZXJlIGlzIG5vdGhpbmcgdG9kbyAqLworCXBvcyA9IE5VTEw7CisJaWYgKG5yICYmIG5yID49IGdldF9ucl90aHJlYWRzKGxlYWRlcikpCisJCWdvdG8gb3V0OwogCi0JCQlpZiAoZmlsbGRpcihkaXJlbnQsIGJ1ZitqLCBQUk9DX05VTUJVRi1qLCBmaWxwLT5mX3BvcywgaW5vLCBEVF9ESVIpIDwgMCkgewotCQkJCS8qIHJldHVybmluZyB0aGlzIHRnaWQgZmFpbGVkLCBzYXZlIGl0IGFzIHRoZSBmaXJzdAotCQkJCSAqIHBpZCBmb3IgdGhlIG5leHQgcmVhZGlyIGNhbGwgKi8KLQkJCQlmaWxwLT5mX3ZlcnNpb24gPSB0Z2lkX2FycmF5W2ldOwotCQkJCWdvdG8gb3V0OwotCQkJfQotCQkJZmlscC0+Zl9wb3MrKzsKLQkJCW5yKys7CisJLyogSWYgd2UgaGF2ZW4ndCBmb3VuZCBvdXIgc3RhcnRpbmcgcGxhY2UgeWV0IHN0YXJ0CisJICogd2l0aCB0aGUgbGVhZGVyIGFuZCB3YWxrIG5yIHRocmVhZHMgZm9yd2FyZC4KKwkgKi8KKwlmb3IgKHBvcyA9IGxlYWRlcjsgbnIgPiAwOyAtLW5yKSB7CisJCXBvcyA9IG5leHRfdGhyZWFkKHBvcyk7CisJCWlmIChwb3MgPT0gbGVhZGVyKSB7CisJCQlwb3MgPSBOVUxMOworCQkJZ290byBvdXQ7CiAJCX0KIAl9Citmb3VuZDoKKwlnZXRfdGFza19zdHJ1Y3QocG9zKTsKIG91dDoKLQlyZXR1cm4gMDsKKwlyY3VfcmVhZF91bmxvY2soKTsKKwlyZXR1cm4gcG9zOworfQorCisvKgorICogRmluZCB0aGUgbmV4dCB0aHJlYWQgaW4gdGhlIHRocmVhZCBsaXN0LgorICogUmV0dXJuIE5VTEwgaWYgdGhlcmUgaXMgYW4gZXJyb3Igb3Igbm8gbmV4dCB0aHJlYWQuCisgKgorICogVGhlIHJlZmVyZW5jZSB0byB0aGUgaW5wdXQgdGFza19zdHJ1Y3QgaXMgcmVsZWFzZWQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKm5leHRfdGlkKHN0cnVjdCB0YXNrX3N0cnVjdCAqc3RhcnQpCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICpwb3MgPSBOVUxMOworCXJjdV9yZWFkX2xvY2soKTsKKwlpZiAocGlkX2FsaXZlKHN0YXJ0KSkgeworCQlwb3MgPSBuZXh0X3RocmVhZChzdGFydCk7CisJCWlmICh0aHJlYWRfZ3JvdXBfbGVhZGVyKHBvcykpCisJCQlwb3MgPSBOVUxMOworCQllbHNlCisJCQlnZXRfdGFza19zdHJ1Y3QocG9zKTsKKwl9CisJcmN1X3JlYWRfdW5sb2NrKCk7CisJcHV0X3Rhc2tfc3RydWN0KHN0YXJ0KTsKKwlyZXR1cm4gcG9zOwogfQogCiAvKiBmb3IgdGhlIC9wcm9jL1RHSUQvdGFzay8gZGlyZWN0b3JpZXMgKi8KIHN0YXRpYyBpbnQgcHJvY190YXNrX3JlYWRkaXIoc3RydWN0IGZpbGUgKiBmaWxwLCB2b2lkICogZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpcikKIHsKLQl1bnNpZ25lZCBpbnQgdGlkX2FycmF5W1BST0NfTUFYUElEU107CiAJY2hhciBidWZbUFJPQ19OVU1CVUZdOwotCXVuc2lnbmVkIGludCBucl90aWRzLCBpOwogCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGZpbHAtPmZfZGVudHJ5OwogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJc3RydWN0IHRhc2tfc3RydWN0ICpsZWFkZXIgPSBnZXRfcHJvY190YXNrKGlub2RlKTsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7CiAJaW50IHJldHZhbCA9IC1FTk9FTlQ7CiAJaW5vX3QgaW5vOworCWludCB0aWQ7CiAJdW5zaWduZWQgbG9uZyBwb3MgPSBmaWxwLT5mX3BvczsgIC8qIGF2b2lkaW5nICJsb25nIGxvbmciIGZpbHAtPmZfcG9zICovCiAKLQlpZiAoIXBpZF9hbGl2ZShwcm9jX3Rhc2soaW5vZGUpKSkKLQkJZ290byBvdXQ7CisJaWYgKCFsZWFkZXIpCisJCWdvdG8gb3V0X25vX3Rhc2s7CiAJcmV0dmFsID0gMDsKIAogCXN3aXRjaCAocG9zKSB7CkBAIC0yMjkwLDI0ICsyMzE5LDQ1IEBACiAJCS8qIGZhbGwgdGhyb3VnaCAqLwogCX0KIAotCW5yX3RpZHMgPSBnZXRfdGlkX2xpc3QocG9zLCB0aWRfYXJyYXksIGlub2RlKTsKLQlpbm9kZS0+aV9ubGluayA9IHBvcyArIG5yX3RpZHM7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbnJfdGlkczsgaSsrKSB7Ci0JCXVuc2lnbmVkIGxvbmcgaiA9IFBST0NfTlVNQlVGOwotCQlpbnQgdGlkID0gdGlkX2FycmF5W2ldOwotCi0JCWlubyA9IGZha2VfaW5vKHRpZCxQUk9DX1RJRF9JTk8pOwotCi0JCWRvCi0JCQlidWZbLS1qXSA9ICcwJyArICh0aWQgJSAxMCk7Ci0JCXdoaWxlICgodGlkIC89IDEwKSAhPSAwKTsKLQotCQlpZiAoZmlsbGRpcihkaXJlbnQsIGJ1ZitqLCBQUk9DX05VTUJVRi1qLCBwb3MsIGlubywgRFRfRElSKSA8IDApCisJLyogZl92ZXJzaW9uIGNhY2hlcyB0aGUgdGdpZCB2YWx1ZSB0aGF0IHRoZSBsYXN0IHJlYWRkaXIgY2FsbCBjb3VsZG4ndAorCSAqIHJldHVybi4gbHNlZWsgYWthIHRlbGxkaXIgYXV0b21hZ2ljYWxseSByZXNldHMgZl92ZXJzaW9uIHRvIDAuCisJICovCisJdGlkID0gZmlscC0+Zl92ZXJzaW9uOworCWZpbHAtPmZfdmVyc2lvbiA9IDA7CisJZm9yICh0YXNrID0gZmlyc3RfdGlkKGxlYWRlciwgdGlkLCBwb3MgLSAyKTsKKwkgICAgIHRhc2s7CisJICAgICB0YXNrID0gbmV4dF90aWQodGFzayksIHBvcysrKSB7CisJCWludCBsZW47CisJCXRpZCA9IHRhc2stPnBpZDsKKwkJbGVuID0gc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiVkIiwgdGlkKTsKKwkJaW5vID0gZmFrZV9pbm8odGlkLCBQUk9DX1RJRF9JTk8pOworCQlpZiAoZmlsbGRpcihkaXJlbnQsIGJ1ZiwgbGVuLCBwb3MsIGlubywgRFRfRElSIDwgMCkpIHsKKwkJCS8qIHJldHVybmluZyB0aGlzIHRnaWQgZmFpbGVkLCBzYXZlIGl0IGFzIHRoZSBmaXJzdAorCQkJICogcGlkIGZvciB0aGUgbmV4dCByZWFkaXIgY2FsbCAqLworCQkJZmlscC0+Zl92ZXJzaW9uID0gdGlkOworCQkJcHV0X3Rhc2tfc3RydWN0KHRhc2spOwogCQkJYnJlYWs7Ci0JCXBvcysrOworCQl9CiAJfQogb3V0OgogCWZpbHAtPmZfcG9zID0gcG9zOworCXB1dF90YXNrX3N0cnVjdChsZWFkZXIpOworb3V0X25vX3Rhc2s6CiAJcmV0dXJuIHJldHZhbDsKIH0KKworc3RhdGljIGludCBwcm9jX3Rhc2tfZ2V0YXR0cihzdHJ1Y3QgdmZzbW91bnQgKm1udCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3Qga3N0YXQgKnN0YXQpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAgPSBnZXRfcHJvY190YXNrKGlub2RlKTsKKwlnZW5lcmljX2ZpbGxhdHRyKGlub2RlLCBzdGF0KTsKKworCWlmIChwKSB7CisJCXJjdV9yZWFkX2xvY2soKTsKKwkJc3RhdC0+bmxpbmsgKz0gZ2V0X25yX3RocmVhZHMocCk7CisJCXJjdV9yZWFkX3VubG9jaygpOworCQlwdXRfdGFza19zdHJ1Y3QocCk7CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9mcy9wcm9jL2lub2RlLmMgYi9mcy9wcm9jL2lub2RlLmMKaW5kZXggNzIyYjljNC4uNmRjZWYwOCAxMDA2NDQKLS0tIGEvZnMvcHJvYy9pbm9kZS5jCisrKyBiL2ZzL3Byb2MvaW5vZGUuYwpAQCAtNTgsMTQgKzU4LDExIEBACiBzdGF0aWMgdm9pZCBwcm9jX2RlbGV0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewogCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZGU7Ci0Jc3RydWN0IHRhc2tfc3RydWN0ICp0c2s7CiAKIAl0cnVuY2F0ZV9pbm9kZV9wYWdlcygmaW5vZGUtPmlfZGF0YSwgMCk7CiAKLQkvKiBMZXQgZ28gb2YgYW55IGFzc29jaWF0ZWQgcHJvY2VzcyAqLwotCXRzayA9IFBST0NfSShpbm9kZSktPnRhc2s7Ci0JaWYgKHRzaykKLQkJcHV0X3Rhc2tfc3RydWN0KHRzayk7CisJLyogU3RvcCB0cmFja2luZyBhc3NvY2lhdGVkIHByb2Nlc3NlcyAqLworCXB1dF9waWQoUFJPQ19JKGlub2RlKS0+cGlkKTsKIAogCS8qIExldCBnbyBvZiBhbnkgYXNzb2NpYXRlZCBwcm9jIGRpcmVjdG9yeSBlbnRyeSAqLwogCWRlID0gUFJPQ19JKGlub2RlKS0+cGRlOwpAQCAtOTQsOCArOTEsOCBAQAogCWVpID0gKHN0cnVjdCBwcm9jX2lub2RlICopa21lbV9jYWNoZV9hbGxvYyhwcm9jX2lub2RlX2NhY2hlcCwgU0xBQl9LRVJORUwpOwogCWlmICghZWkpCiAJCXJldHVybiBOVUxMOwotCWVpLT50YXNrID0gTlVMTDsKLQllaS0+dHlwZSA9IDA7CisJZWktPnBpZCA9IE5VTEw7CisJZWktPmZkID0gMDsKIAllaS0+b3AucHJvY19nZXRfbGluayA9IE5VTEw7CiAJZWktPnBkZSA9IE5VTEw7CiAJaW5vZGUgPSAmZWktPnZmc19pbm9kZTsKZGlmZiAtLWdpdCBhL2ZzL3Byb2MvaW50ZXJuYWwuaCBiL2ZzL3Byb2MvaW50ZXJuYWwuaAppbmRleCAwNTAyZjE3Li4xNDZhNDM0IDEwMDY0NAotLS0gYS9mcy9wcm9jL2ludGVybmFsLmgKKysrIGIvZnMvcHJvYy9pbnRlcm5hbC5oCkBAIC0zNywxNiArMzcsMzAgQEAKIGV4dGVybiBpbnQgcHJvY19waWRfc3RhdHVzKHN0cnVjdCB0YXNrX3N0cnVjdCAqLCBjaGFyICopOwogZXh0ZXJuIGludCBwcm9jX3BpZF9zdGF0bShzdHJ1Y3QgdGFza19zdHJ1Y3QgKiwgY2hhciAqKTsKIAorZXh0ZXJuIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19tYXBzX29wZXJhdGlvbnM7CitleHRlcm4gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX251bWFfbWFwc19vcGVyYXRpb25zOworZXh0ZXJuIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19zbWFwc19vcGVyYXRpb25zOworCitleHRlcm4gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX21hcHNfb3BlcmF0aW9uczsKK2V4dGVybiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfbnVtYV9tYXBzX29wZXJhdGlvbnM7CitleHRlcm4gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX3NtYXBzX29wZXJhdGlvbnM7CisKKwogdm9pZCBmcmVlX3Byb2NfZW50cnkoc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkZSk7CiAKIGludCBwcm9jX2luaXRfaW5vZGVjYWNoZSh2b2lkKTsKIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnByb2NfdGFzayhzdHJ1Y3QgaW5vZGUgKmlub2RlKQorc3RhdGljIGlubGluZSBzdHJ1Y3QgcGlkICpwcm9jX3BpZChzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewotCXJldHVybiBQUk9DX0koaW5vZGUpLT50YXNrOworCXJldHVybiBQUk9DX0koaW5vZGUpLT5waWQ7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHByb2NfdHlwZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQorc3RhdGljIGlubGluZSBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmdldF9wcm9jX3Rhc2soc3RydWN0IGlub2RlICppbm9kZSkKIHsKLQlyZXR1cm4gUFJPQ19JKGlub2RlKS0+dHlwZTsKKwlyZXR1cm4gZ2V0X3BpZF90YXNrKHByb2NfcGlkKGlub2RlKSwgUElEVFlQRV9QSUQpOworfQorCitzdGF0aWMgaW5saW5lIGludCBwcm9jX2ZkKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJcmV0dXJuIFBST0NfSShpbm9kZSktPmZkOwogfQpkaWZmIC0tZ2l0IGEvZnMvcHJvYy90YXNrX21tdS5jIGIvZnMvcHJvYy90YXNrX21tdS5jCmluZGV4IDkxYjdjMTUuLjAxMzdlYzQgMTAwNjQ0Ci0tLSBhL2ZzL3Byb2MvdGFza19tbXUuYworKysgYi9mcy9wcm9jL3Rhc2tfbW11LmMKQEAgLTc1LDkgKzc1LDEzIEBACiB7CiAJc3RydWN0IHZtX2FyZWFfc3RydWN0ICogdm1hOwogCWludCByZXN1bHQgPSAtRU5PRU5UOwotCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayA9IHByb2NfdGFzayhpbm9kZSk7Ci0Jc3RydWN0IG1tX3N0cnVjdCAqIG1tID0gZ2V0X3Rhc2tfbW0odGFzayk7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrID0gZ2V0X3Byb2NfdGFzayhpbm9kZSk7CisJc3RydWN0IG1tX3N0cnVjdCAqIG1tID0gTlVMTDsKIAorCWlmICh0YXNrKSB7CisJCW1tID0gZ2V0X3Rhc2tfbW0odGFzayk7CisJCXB1dF90YXNrX3N0cnVjdCh0YXNrKTsKKwl9CiAJaWYgKCFtbSkKIAkJZ290byBvdXQ7CiAJZG93bl9yZWFkKCZtbS0+bW1hcF9zZW0pOwpAQCAtMTIwLDcgKzEyNCw4IEBACiAKIHN0YXRpYyBpbnQgc2hvd19tYXBfaW50ZXJuYWwoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2LCBzdHJ1Y3QgbWVtX3NpemVfc3RhdHMgKm1zcykKIHsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgPSBtLT5wcml2YXRlOworCXN0cnVjdCBwcm9jX21hcHNfcHJpdmF0ZSAqcHJpdiA9IG0tPnByaXZhdGU7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrID0gcHJpdi0+dGFzazsKIAlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSA9IHY7CiAJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtPnZtX21tOwogCXN0cnVjdCBmaWxlICpmaWxlID0gdm1hLT52bV9maWxlOwpAQCAtMjk1LDEyICszMDAsMTYgQEAKIAogc3RhdGljIHZvaWQgKm1fc3RhcnQoc3RydWN0IHNlcV9maWxlICptLCBsb2ZmX3QgKnBvcykKIHsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgPSBtLT5wcml2YXRlOworCXN0cnVjdCBwcm9jX21hcHNfcHJpdmF0ZSAqcHJpdiA9IG0tPnByaXZhdGU7CiAJdW5zaWduZWQgbG9uZyBsYXN0X2FkZHIgPSBtLT52ZXJzaW9uOwogCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tOwotCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCAqdGFpbF92bWE7CisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsICp0YWlsX3ZtYSA9IE5VTEw7CiAJbG9mZl90IGwgPSAqcG9zOwogCisJLyogQ2xlYXIgdGhlIHBlciBzeXNjYWxsIGZpZWxkcyBpbiBwcml2ICovCisJcHJpdi0+dGFzayA9IE5VTEw7CisJcHJpdi0+dGFpbF92bWEgPSBOVUxMOworCiAJLyoKIAkgKiBXZSByZW1lbWJlciBsYXN0X2FkZHIgcmF0aGVyIHRoYW4gbmV4dF9hZGRyIHRvIGhpdCB3aXRoCiAJICogbW1hcF9jYWNoZSBtb3N0IG9mIHRoZSB0aW1lLiBXZSBoYXZlIHplcm8gbGFzdF9hZGRyIGF0CkBAIC0zMTEsMTEgKzMyMCwxNSBAQAogCWlmIChsYXN0X2FkZHIgPT0gLTFVTCkKIAkJcmV0dXJuIE5VTEw7CiAKLQltbSA9IGdldF90YXNrX21tKHRhc2spOworCXByaXYtPnRhc2sgPSBnZXRfcGlkX3Rhc2socHJpdi0+cGlkLCBQSURUWVBFX1BJRCk7CisJaWYgKCFwcml2LT50YXNrKQorCQlyZXR1cm4gTlVMTDsKKworCW1tID0gZ2V0X3Rhc2tfbW0ocHJpdi0+dGFzayk7CiAJaWYgKCFtbSkKIAkJcmV0dXJuIE5VTEw7CiAKLQl0YWlsX3ZtYSA9IGdldF9nYXRlX3ZtYSh0YXNrKTsKKwlwcml2LT50YWlsX3ZtYSA9IHRhaWxfdm1hID0gZ2V0X2dhdGVfdm1hKHByaXYtPnRhc2spOwogCWRvd25fcmVhZCgmbW0tPm1tYXBfc2VtKTsKIAogCS8qIFN0YXJ0IHdpdGggbGFzdCBhZGRyIGhpbnQgKi8KQEAgLTM1MCwxMSArMzYzLDkgQEAKIAlyZXR1cm4gdGFpbF92bWE7CiB9CiAKLXN0YXRpYyB2b2lkIG1fc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCitzdGF0aWMgdm9pZCB2bWFfc3RvcChzdHJ1Y3QgcHJvY19tYXBzX3ByaXZhdGUgKnByaXYsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQogewotCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayA9IG0tPnByaXZhdGU7Ci0Jc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEgPSB2OwotCWlmICh2bWEgJiYgdm1hICE9IGdldF9nYXRlX3ZtYSh0YXNrKSkgeworCWlmICh2bWEgJiYgdm1hICE9IHByaXYtPnRhaWxfdm1hKSB7CiAJCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdm1hLT52bV9tbTsKIAkJdXBfcmVhZCgmbW0tPm1tYXBfc2VtKTsKIAkJbW1wdXQobW0pOwpAQCAtMzYzLDM4ICszNzQsMTAzIEBACiAKIHN0YXRpYyB2b2lkICptX25leHQoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKIHsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgPSBtLT5wcml2YXRlOworCXN0cnVjdCBwcm9jX21hcHNfcHJpdmF0ZSAqcHJpdiA9IG0tPnByaXZhdGU7CiAJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEgPSB2OwotCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdGFpbF92bWEgPSBnZXRfZ2F0ZV92bWEodGFzayk7CisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp0YWlsX3ZtYSA9IHByaXYtPnRhaWxfdm1hOwogCiAJKCpwb3MpKys7CiAJaWYgKHZtYSAmJiAodm1hICE9IHRhaWxfdm1hKSAmJiB2bWEtPnZtX25leHQpCiAJCXJldHVybiB2bWEtPnZtX25leHQ7Ci0JbV9zdG9wKG0sIHYpOworCXZtYV9zdG9wKHByaXYsIHZtYSk7CiAJcmV0dXJuICh2bWEgIT0gdGFpbF92bWEpPyB0YWlsX3ZtYTogTlVMTDsKIH0KIAotc3RydWN0IHNlcV9vcGVyYXRpb25zIHByb2NfcGlkX21hcHNfb3AgPSB7CitzdGF0aWMgdm9pZCBtX3N0b3Aoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQoreworCXN0cnVjdCBwcm9jX21hcHNfcHJpdmF0ZSAqcHJpdiA9IG0tPnByaXZhdGU7CisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEgPSB2OworCisJdm1hX3N0b3AocHJpdiwgdm1hKTsKKwlpZiAocHJpdi0+dGFzaykKKwkJcHV0X3Rhc2tfc3RydWN0KHByaXYtPnRhc2spOworfQorCitzdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIHByb2NfcGlkX21hcHNfb3AgPSB7CiAJLnN0YXJ0CT0gbV9zdGFydCwKIAkubmV4dAk9IG1fbmV4dCwKIAkuc3RvcAk9IG1fc3RvcCwKIAkuc2hvdwk9IHNob3dfbWFwCiB9OwogCi1zdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgcHJvY19waWRfc21hcHNfb3AgPSB7CitzdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIHByb2NfcGlkX3NtYXBzX29wID0gewogCS5zdGFydAk9IG1fc3RhcnQsCiAJLm5leHQJPSBtX25leHQsCiAJLnN0b3AJPSBtX3N0b3AsCiAJLnNob3cJPSBzaG93X3NtYXAKIH07CiAKK3N0YXRpYyBpbnQgZG9fbWFwc19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJc3RydWN0IHNlcV9vcGVyYXRpb25zICpvcHMpCit7CisJc3RydWN0IHByb2NfbWFwc19wcml2YXRlICpwcml2OworCWludCByZXQgPSAtRU5PTUVNOworCXByaXYgPSBremFsbG9jKHNpemVvZigqcHJpdiksIEdGUF9LRVJORUwpOworCWlmIChwcml2KSB7CisJCXByaXYtPnBpZCA9IHByb2NfcGlkKGlub2RlKTsKKwkJcmV0ID0gc2VxX29wZW4oZmlsZSwgb3BzKTsKKwkJaWYgKCFyZXQpIHsKKwkJCXN0cnVjdCBzZXFfZmlsZSAqbSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwkJCW0tPnByaXZhdGUgPSBwcml2OworCQl9IGVsc2UgeworCQkJa2ZyZWUocHJpdik7CisJCX0KKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtYXBzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIGRvX21hcHNfb3Blbihpbm9kZSwgZmlsZSwgJnByb2NfcGlkX21hcHNfb3ApOworfQorCitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfbWFwc19vcGVyYXRpb25zID0geworCS5vcGVuCQk9IG1hcHNfb3BlbiwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkubGxzZWVrCQk9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IHNlcV9yZWxlYXNlX3ByaXZhdGUsCit9OworCiAjaWZkZWYgQ09ORklHX05VTUEKIGV4dGVybiBpbnQgc2hvd19udW1hX21hcChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpOwogCi1zdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgcHJvY19waWRfbnVtYV9tYXBzX29wID0geworc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBwcm9jX3BpZF9udW1hX21hcHNfb3AgPSB7CiAgICAgICAgIC5zdGFydCAgPSBtX3N0YXJ0LAogICAgICAgICAubmV4dCAgID0gbV9uZXh0LAogICAgICAgICAuc3RvcCAgID0gbV9zdG9wLAogICAgICAgICAuc2hvdyAgID0gc2hvd19udW1hX21hcAogfTsKKworc3RhdGljIGludCBudW1hX21hcHNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gZG9fbWFwc19vcGVuKGlub2RlLCBmaWxlLCAmcHJvY19waWRfbnVtYV9tYXBzX29wKTsKK30KKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX251bWFfbWFwc19vcGVyYXRpb25zID0geworCS5vcGVuCQk9IG51bWFfbWFwc19vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2VxX3JlbGVhc2VfcHJpdmF0ZSwKK307CiAjZW5kaWYKKworc3RhdGljIGludCBzbWFwc19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBkb19tYXBzX29wZW4oaW5vZGUsIGZpbGUsICZwcm9jX3BpZF9zbWFwc19vcCk7Cit9CisKK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19zbWFwc19vcGVyYXRpb25zID0geworCS5vcGVuCQk9IHNtYXBzX29wZW4sCisJLnJlYWQJCT0gc2VxX3JlYWQsCisJLmxsc2VlawkJPSBzZXFfbHNlZWssCisJLnJlbGVhc2UJPSBzZXFfcmVsZWFzZV9wcml2YXRlLAorfTsKZGlmZiAtLWdpdCBhL2ZzL3Byb2MvdGFza19ub21tdS5jIGIvZnMvcHJvYy90YXNrX25vbW11LmMKaW5kZXggOGY2ODgyNy4uYWY2OWYyOCAxMDA2NDQKLS0tIGEvZnMvcHJvYy90YXNrX25vbW11LmMKKysrIGIvZnMvcHJvYy90YXNrX25vbW11LmMKQEAgLTE1Niw5ICsxNTYsMjggQEAKIHsKIAlyZXR1cm4gTlVMTDsKIH0KLXN0cnVjdCBzZXFfb3BlcmF0aW9ucyBwcm9jX3BpZF9tYXBzX29wID0geworc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBwcm9jX3BpZF9tYXBzX29wID0gewogCS5zdGFydAk9IG1fc3RhcnQsCiAJLm5leHQJPSBtX25leHQsCiAJLnN0b3AJPSBtX3N0b3AsCiAJLnNob3cJPSBzaG93X21hcAogfTsKKworc3RhdGljIGludCBtYXBzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IHJldDsKKwlyZXQgPSBzZXFfb3BlbihmaWxlLCAmcHJvY19waWRfbWFwc19vcCk7CisJaWYgKCFyZXQpIHsKKwkJc3RydWN0IHNlcV9maWxlICptID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCQltLT5wcml2YXRlID0gTlVMTDsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX21hcHNfb3BlcmF0aW9ucyA9IHsKKwkub3BlbgkJPSBtYXBzX29wZW4sCisJLnJlYWQJCT0gc2VxX3JlYWQsCisJLmxsc2VlawkJPSBzZXFfbHNlZWssCisJLnJlbGVhc2UJPSBzZXFfcmVsZWFzZSwKK307CisKZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL2ZpbGUuYyBiL2ZzL3JlaXNlcmZzL2ZpbGUuYwppbmRleCBjZjZlMWNmLi43NTJjZWExIDEwMDY0NAotLS0gYS9mcy9yZWlzZXJmcy9maWxlLmMKKysrIGIvZnMvcmVpc2VyZnMvZmlsZS5jCkBAIC0xNTYwLDEyICsxNTYwLDYgQEAKIAlyZXR1cm4gcmVzOwogfQogCi1zdGF0aWMgc3NpemVfdCByZWlzZXJmc19haW9fd3JpdGUoc3RydWN0IGtpb2NiICppb2NiLCBjb25zdCBjaGFyIF9fdXNlciAqIGJ1ZiwKLQkJCQkgIHNpemVfdCBjb3VudCwgbG9mZl90IHBvcykKLXsKLQlyZXR1cm4gZ2VuZXJpY19maWxlX2Fpb193cml0ZShpb2NiLCBidWYsIGNvdW50LCBwb3MpOwotfQotCiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJlaXNlcmZzX2ZpbGVfb3BlcmF0aW9ucyA9IHsKIAkucmVhZCA9IGdlbmVyaWNfZmlsZV9yZWFkLAogCS53cml0ZSA9IHJlaXNlcmZzX2ZpbGVfd3JpdGUsCkBAIC0xNTc1LDcgKzE1NjksNyBAQAogCS5mc3luYyA9IHJlaXNlcmZzX3N5bmNfZmlsZSwKIAkuc2VuZGZpbGUgPSBnZW5lcmljX2ZpbGVfc2VuZGZpbGUsCiAJLmFpb19yZWFkID0gZ2VuZXJpY19maWxlX2Fpb19yZWFkLAotCS5haW9fd3JpdGUgPSByZWlzZXJmc19haW9fd3JpdGUsCisJLmFpb193cml0ZSA9IGdlbmVyaWNfZmlsZV9haW9fd3JpdGUsCiAJLnNwbGljZV9yZWFkID0gZ2VuZXJpY19maWxlX3NwbGljZV9yZWFkLAogCS5zcGxpY2Vfd3JpdGUgPSBnZW5lcmljX2ZpbGVfc3BsaWNlX3dyaXRlLAogfTsKZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL2pvdXJuYWwuYyBiL2ZzL3JlaXNlcmZzL2pvdXJuYWwuYwppbmRleCAxYjczNTI5Li40OWQxYTUzIDEwMDY0NAotLS0gYS9mcy9yZWlzZXJmcy9qb3VybmFsLmMKKysrIGIvZnMvcmVpc2VyZnMvam91cm5hbC5jCkBAIC04MzQsOCArODM0LDcgQEAKIAkJZ2V0X2JoKGJoKTsKIAkJaWYgKHRlc3Rfc2V0X2J1ZmZlcl9sb2NrZWQoYmgpKSB7CiAJCQlpZiAoIWJ1ZmZlcl9kaXJ0eShiaCkpIHsKLQkJCQlsaXN0X2RlbF9pbml0KCZqaC0+bGlzdCk7Ci0JCQkJbGlzdF9hZGQoJmpoLT5saXN0LCAmdG1wKTsKKwkJCQlsaXN0X21vdmUoJmpoLT5saXN0LCAmdG1wKTsKIAkJCQlnb3RvIGxvb3BfbmV4dDsKIAkJCX0KIAkJCXNwaW5fdW5sb2NrKGxvY2spOwpAQCAtODU1LDggKzg1NCw3IEBACiAJCQlyZXQgPSAtRUlPOwogCQl9CiAJCWlmIChidWZmZXJfZGlydHkoYmgpKSB7Ci0JCQlsaXN0X2RlbF9pbml0KCZqaC0+bGlzdCk7Ci0JCQlsaXN0X2FkZCgmamgtPmxpc3QsICZ0bXApOworCQkJbGlzdF9tb3ZlKCZqaC0+bGlzdCwgJnRtcCk7CiAJCQlhZGRfdG9fY2h1bmsoJmNodW5rLCBiaCwgbG9jaywgd3JpdGVfb3JkZXJlZF9jaHVuayk7CiAJCX0gZWxzZSB7CiAJCQlyZWlzZXJmc19mcmVlX2poKGJoKTsKZGlmZiAtLWdpdCBhL2ZzL3NlbGVjdC5jIGIvZnMvc2VsZWN0LmMKaW5kZXggOWM0ZjBmMi4uMzNiNzJiYSAxMDA2NDQKLS0tIGEvZnMvc2VsZWN0LmMKKysrIGIvZnMvc2VsZWN0LmMKQEAgLTc0Niw5ICs3NDYsOSBAQAogYXNtbGlua2FnZSBsb25nIHN5c19wb2xsKHN0cnVjdCBwb2xsZmQgX191c2VyICp1ZmRzLCB1bnNpZ25lZCBpbnQgbmZkcywKIAkJCWxvbmcgdGltZW91dF9tc2VjcykKIHsKLQlzNjQgdGltZW91dF9qaWZmaWVzID0gMDsKKwlzNjQgdGltZW91dF9qaWZmaWVzOwogCi0JaWYgKHRpbWVvdXRfbXNlY3MpIHsKKwlpZiAodGltZW91dF9tc2VjcyA+IDApIHsKICNpZiBIWiA+IDEwMDAKIAkJLyogV2UgY2FuIG9ubHkgb3ZlcmZsb3cgaWYgSFogPiAxMDAwICovCiAJCWlmICh0aW1lb3V0X21zZWNzIC8gMTAwMCA+IChzNjQpMHg3ZmZmZmZmZmZmZmZmZmZmVUxMIC8gKHM2NClIWikKQEAgLTc1Niw2ICs3NTYsOSBAQAogCQllbHNlCiAjZW5kaWYKIAkJCXRpbWVvdXRfamlmZmllcyA9IG1zZWNzX3RvX2ppZmZpZXModGltZW91dF9tc2Vjcyk7CisJfSBlbHNlIHsKKwkJLyogSW5maW5pdGUgKDwgMCkgb3Igbm8gKDApIHRpbWVvdXQgKi8KKwkJdGltZW91dF9qaWZmaWVzID0gdGltZW91dF9tc2VjczsKIAl9CiAKIAlyZXR1cm4gZG9fc3lzX3BvbGwodWZkcywgbmZkcywgJnRpbWVvdXRfamlmZmllcyk7CmRpZmYgLS1naXQgYS9mcy9zbWJmcy9yZXF1ZXN0LmMgYi9mcy9zbWJmcy9yZXF1ZXN0LmMKaW5kZXggYzcxZGQyNy4uYzhlOTYxOSAxMDA2NDQKLS0tIGEvZnMvc21iZnMvcmVxdWVzdC5jCisrKyBiL2ZzL3NtYmZzL3JlcXVlc3QuYwpAQCAtNDAwLDggKzQwMCw3IEBACiAJaWYgKCEocmVxLT5ycV9mbGFncyAmIFNNQl9SRVFfVFJBTlNNSVRURUQpKQogCQlnb3RvIG91dDsKIAotCWxpc3RfZGVsX2luaXQoJnJlcS0+cnFfcXVldWUpOwotCWxpc3RfYWRkX3RhaWwoJnJlcS0+cnFfcXVldWUsICZzZXJ2ZXItPnJlY3ZxKTsKKwlsaXN0X21vdmVfdGFpbCgmcmVxLT5ycV9xdWV1ZSwgJnNlcnZlci0+cmVjdnEpOwogCXJlc3VsdCA9IDE7CiBvdXQ6CiAJcmV0dXJuIHJlc3VsdDsKQEAgLTQzNSw4ICs0MzQsNyBAQAogCXJlc3VsdCA9IHNtYl9yZXF1ZXN0X3NlbmRfcmVxKHJlcSk7CiAJaWYgKHJlc3VsdCA8IDApIHsKIAkJc2VydmVyLT5jb25uX2Vycm9yID0gcmVzdWx0OwotCQlsaXN0X2RlbF9pbml0KCZyZXEtPnJxX3F1ZXVlKTsKLQkJbGlzdF9hZGQoJnJlcS0+cnFfcXVldWUsICZzZXJ2ZXItPnhtaXRxKTsKKwkJbGlzdF9tb3ZlKCZyZXEtPnJxX3F1ZXVlLCAmc2VydmVyLT54bWl0cSk7CiAJCXJlc3VsdCA9IC1FSU87CiAJCWdvdG8gb3V0OwogCX0KZGlmZiAtLWdpdCBhL2ZzL3NtYmZzL3NtYmlvZC5jIGIvZnMvc21iZnMvc21iaW9kLmMKaW5kZXggNDgxYTk3YS4uMjQ1NzdlMiAxMDA2NDQKLS0tIGEvZnMvc21iZnMvc21iaW9kLmMKKysrIGIvZnMvc21iZnMvc21iaW9kLmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KICNpbmNsdWRlIDxuZXQvaXAuaD4KIAogI2luY2x1ZGUgPGxpbnV4L3NtYl9mcy5oPgpAQCAtNDAsNyArNDEsNyBAQAogfTsKIAogc3RhdGljIGVudW0gc21iaW9kX3N0YXRlIHNtYmlvZF9zdGF0ZSA9IFNNQklPRF9ERUFEOwotc3RhdGljIHBpZF90IHNtYmlvZF9waWQ7CitzdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0ICpzbWJpb2RfdGhyZWFkOwogc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKHNtYmlvZF93YWl0KTsKIHN0YXRpYyBMSVNUX0hFQUQoc21iX3NlcnZlcnMpOwogc3RhdGljIERFRklORV9TUElOTE9DSyhzZXJ2ZXJzX2xvY2spOwpAQCAtNjcsMjAgKzY4LDI5IEBACiAgKi8KIHN0YXRpYyBpbnQgc21iaW9kX3N0YXJ0KHZvaWQpCiB7Ci0JcGlkX3QgcGlkOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrOworCWludCBlcnIgPSAwOworCiAJaWYgKHNtYmlvZF9zdGF0ZSAhPSBTTUJJT0RfREVBRCkKIAkJcmV0dXJuIDA7CiAJc21iaW9kX3N0YXRlID0gU01CSU9EX1NUQVJUSU5HOwogCV9fbW9kdWxlX2dldChUSElTX01PRFVMRSk7CiAJc3Bpbl91bmxvY2soJnNlcnZlcnNfbG9jayk7Ci0JcGlkID0ga2VybmVsX3RocmVhZChzbWJpb2QsIE5VTEwsIDApOwotCWlmIChwaWQgPCAwKQorCXRzayA9IGt0aHJlYWRfcnVuKHNtYmlvZCwgTlVMTCwgInNtYmlvZCIpOworCWlmIChJU19FUlIodHNrKSkgeworCQllcnIgPSBQVFJfRVJSKHRzayk7CiAJCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOworCX0KIAogCXNwaW5fbG9jaygmc2VydmVyc19sb2NrKTsKLQlzbWJpb2Rfc3RhdGUgPSBwaWQgPCAwID8gU01CSU9EX0RFQUQgOiBTTUJJT0RfUlVOTklORzsKLQlzbWJpb2RfcGlkID0gcGlkOwotCXJldHVybiBwaWQ7CisJaWYgKGVyciA8IDApIHsKKwkJc21iaW9kX3N0YXRlID0gU01CSU9EX0RFQUQ7CisJCXNtYmlvZF90aHJlYWQgPSBOVUxMOworCX0gZWxzZSB7CisJCXNtYmlvZF9zdGF0ZSA9IFNNQklPRF9SVU5OSU5HOworCQlzbWJpb2RfdGhyZWFkID0gdHNrOworCX0KKwlyZXR1cm4gZXJyOwogfQogCiAvKgpAQCAtMTgzLDggKzE5Myw3IEBACiAJCWlmIChyZXEtPnJxX2ZsYWdzICYgU01CX1JFUV9SRVRSWSkgewogCQkJLyogbXVzdCBtb3ZlIHRoZSByZXF1ZXN0IHRvIHRoZSB4bWl0cSAqLwogCQkJVkVSQk9TRSgicmV0cnlpbmcgcmVxdWVzdCAlcCBvbiByZWN2cVxuIiwgcmVxKTsKLQkJCWxpc3RfZGVsKCZyZXEtPnJxX3F1ZXVlKTsKLQkJCWxpc3RfYWRkKCZyZXEtPnJxX3F1ZXVlLCAmc2VydmVyLT54bWl0cSk7CisJCQlsaXN0X21vdmUoJnJlcS0+cnFfcXVldWUsICZzZXJ2ZXItPnhtaXRxKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAjZW5kaWYKQEAgLTI5MCw4ICsyOTksNiBAQAogICovCiBzdGF0aWMgaW50IHNtYmlvZCh2b2lkICp1bnVzZWQpCiB7Ci0JZGFlbW9uaXplKCJzbWJpb2QiKTsKLQogCWFsbG93X3NpZ25hbChTSUdLSUxMKTsKIAogCVZFUkJPU0UoIlNNQiBLZXJuZWwgdGhyZWFkIHN0YXJ0aW5nICglZCkgLi4uXG4iLCBjdXJyZW50LT5waWQpOwpkaWZmIC0tZ2l0IGEvZnMvc3VwZXIuYyBiL2ZzL3N1cGVyLmMKaW5kZXggMDU3YjUzMjUuLjhhNjY5ZjYgMTAwNjQ0Ci0tLSBhL2ZzL3N1cGVyLmMKKysrIGIvZnMvc3VwZXIuYwpAQCAtODcxLDggKzg3MSw2IEBACiAJcmV0dXJuIG1udDsKIH0KIAotRVhQT1JUX1NZTUJPTF9HUEwoZG9fa2Vybl9tb3VudCk7Ci0KIHN0cnVjdCB2ZnNtb3VudCAqa2Vybl9tb3VudChzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqdHlwZSkKIHsKIAlyZXR1cm4gdmZzX2tlcm5fbW91bnQodHlwZSwgMCwgdHlwZS0+bmFtZSwgTlVMTCk7CmRpZmYgLS1naXQgYS9mcy9zeXNmcy9kaXIuYyBiL2ZzL3N5c2ZzL2Rpci5jCmluZGV4IDYxMGI1YmQuLjYxYzQyNDMgMTAwNjQ0Ci0tLSBhL2ZzL3N5c2ZzL2Rpci5jCisrKyBiL2ZzL3N5c2ZzL2Rpci5jCkBAIC00MzAsMTAgKzQzMCw5IEBACiAJCQlpKys7CiAJCQkvKiBmYWxsdGhyb3VnaCAqLwogCQlkZWZhdWx0OgotCQkJaWYgKGZpbHAtPmZfcG9zID09IDIpIHsKLQkJCQlsaXN0X2RlbChxKTsKLQkJCQlsaXN0X2FkZChxLCAmcGFyZW50X3NkLT5zX2NoaWxkcmVuKTsKLQkJCX0KKwkJCWlmIChmaWxwLT5mX3BvcyA9PSAyKQorCQkJCWxpc3RfbW92ZShxLCAmcGFyZW50X3NkLT5zX2NoaWxkcmVuKTsKKwogCQkJZm9yIChwPXEtPm5leHQ7IHAhPSAmcGFyZW50X3NkLT5zX2NoaWxkcmVuOyBwPXAtPm5leHQpIHsKIAkJCQlzdHJ1Y3Qgc3lzZnNfZGlyZW50ICpuZXh0OwogCQkJCWNvbnN0IGNoYXIgKiBuYW1lOwpAQCAtNDU1LDggKzQ1NCw3IEBACiAJCQkJCQkgZHRfdHlwZShuZXh0KSkgPCAwKQogCQkJCQlyZXR1cm4gMDsKIAotCQkJCWxpc3RfZGVsKHEpOwotCQkJCWxpc3RfYWRkKHEsIHApOworCQkJCWxpc3RfbW92ZShxLCBwKTsKIAkJCQlwID0gcTsKIAkJCQlmaWxwLT5mX3BvcysrOwogCQkJfQpkaWZmIC0tZ2l0IGEvZnMvdWZzL2JhbGxvYy5jIGIvZnMvdWZzL2JhbGxvYy5jCmluZGV4IDNhZGE5ZGMuLjk1Yjg3OGUgMTAwNjQ0Ci0tLSBhL2ZzL3Vmcy9iYWxsb2MuYworKysgYi9mcy91ZnMvYmFsbG9jLmMKQEAgLTIxLDE0ICsyMSw2IEBACiAjaW5jbHVkZSAic3dhYi5oIgogI2luY2x1ZGUgInV0aWwuaCIKIAotI3VuZGVmIFVGU19CQUxMT0NfREVCVUcKLQotI2lmZGVmIFVGU19CQUxMT0NfREVCVUcKLSNkZWZpbmUgVUZTRCh4KSBwcmludGsoIiglcywgJWQpLCAlczoiLCBfX0ZJTEVfXywgX19MSU5FX18sIF9fRlVOQ1RJT05fXyk7IHByaW50ayB4OwotI2Vsc2UKLSNkZWZpbmUgVUZTRCh4KQotI2VuZGlmCi0KIHN0YXRpYyB1bnNpZ25lZCB1ZnNfYWRkX2ZyYWdtZW50cyAoc3RydWN0IGlub2RlICosIHVuc2lnbmVkLCB1bnNpZ25lZCwgdW5zaWduZWQsIGludCAqKTsKIHN0YXRpYyB1bnNpZ25lZCB1ZnNfYWxsb2NfZnJhZ21lbnRzIChzdHJ1Y3QgaW5vZGUgKiwgdW5zaWduZWQsIHVuc2lnbmVkLCB1bnNpZ25lZCwgaW50ICopOwogc3RhdGljIHVuc2lnbmVkIHVmc19hbGxvY2NnX2Jsb2NrIChzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IHVmc19jZ19wcml2YXRlX2luZm8gKiwgdW5zaWduZWQsIGludCAqKTsKQEAgLTM5LDcgKzMxLDggQEAKIC8qCiAgKiBGcmVlICdjb3VudCcgZnJhZ21lbnRzIGZyb20gZnJhZ21lbnQgbnVtYmVyICdmcmFnbWVudCcKICAqLwotdm9pZCB1ZnNfZnJlZV9mcmFnbWVudHMgKHN0cnVjdCBpbm9kZSAqIGlub2RlLCB1bnNpZ25lZCBmcmFnbWVudCwgdW5zaWduZWQgY291bnQpIHsKK3ZvaWQgdWZzX2ZyZWVfZnJhZ21lbnRzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHVuc2lnbmVkIGZyYWdtZW50LCB1bnNpZ25lZCBjb3VudCkKK3sKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYjsKIAlzdHJ1Y3QgdWZzX3NiX3ByaXZhdGVfaW5mbyAqIHVzcGk7CiAJc3RydWN0IHVmc19zdXBlcl9ibG9ja19maXJzdCAqIHVzYjE7CkBAIC01MSw3ICs0NCw3IEBACiAJdXNwaSA9IFVGU19TQihzYiktPnNfdXNwaTsKIAl1c2IxID0gdWJoX2dldF91c2JfZmlyc3QodXNwaSk7CiAJCi0JVUZTRCgoIkVOVEVSLCBmcmFnbWVudCAldSwgY291bnQgJXVcbiIsIGZyYWdtZW50LCBjb3VudCkpCisJVUZTRCgiRU5URVIsIGZyYWdtZW50ICV1LCBjb3VudCAldVxuIiwgZnJhZ21lbnQsIGNvdW50KTsKIAkKIAlpZiAodWZzX2ZyYWdudW0oZnJhZ21lbnQpICsgY291bnQgPiB1c3BpLT5zX2ZwZykKIAkJdWZzX2Vycm9yIChzYiwgInVmc19mcmVlX2ZyYWdtZW50cyIsICJpbnRlcm5hbCBlcnJvciIpOwpAQCAtNjgsNyArNjEsNyBAQAogCXVjcGkgPSB1ZnNfbG9hZF9jeWxpbmRlciAoc2IsIGNnbm8pOwogCWlmICghdWNwaSkgCiAJCWdvdG8gZmFpbGVkOwotCXVjZyA9IHViaF9nZXRfdWNnIChVQ1BJX1VCSCk7CisJdWNnID0gdWJoX2dldF91Y2cgKFVDUElfVUJIKHVjcGkpKTsKIAlpZiAoIXVmc19jZ19jaGttYWdpYyhzYiwgdWNnKSkgewogCQl1ZnNfcGFuaWMgKHNiLCAidWZzX2ZyZWVfZnJhZ21lbnRzIiwgImludGVybmFsIGVycm9yLCBiYWQgbWFnaWMgbnVtYmVyIG9uIGNnICV1IiwgY2dubyk7CiAJCWdvdG8gZmFpbGVkOwpAQCAtNzYsMTEgKzY5LDExIEBACiAKIAllbmRfYml0ID0gYml0ICsgY291bnQ7CiAJYmJhc2UgPSB1ZnNfYmxrbnVtIChiaXQpOwotCWJsa21hcCA9IHViaF9ibGttYXAgKFVDUElfVUJILCB1Y3BpLT5jX2ZyZWVvZmYsIGJiYXNlKTsKKwlibGttYXAgPSB1YmhfYmxrbWFwIChVQ1BJX1VCSCh1Y3BpKSwgdWNwaS0+Y19mcmVlb2ZmLCBiYmFzZSk7CiAJdWZzX2ZyYWdhY2N0IChzYiwgYmxrbWFwLCB1Y2ctPmNnX2Zyc3VtLCAtMSk7CiAJZm9yIChpID0gYml0OyBpIDwgZW5kX2JpdDsgaSsrKSB7Ci0JCWlmICh1YmhfaXNjbHIgKFVDUElfVUJILCB1Y3BpLT5jX2ZyZWVvZmYsIGkpKQotCQkJdWJoX3NldGJpdCAoVUNQSV9VQkgsIHVjcGktPmNfZnJlZW9mZiwgaSk7CisJCWlmICh1YmhfaXNjbHIgKFVDUElfVUJIKHVjcGkpLCB1Y3BpLT5jX2ZyZWVvZmYsIGkpKQorCQkJdWJoX3NldGJpdCAoVUNQSV9VQkgodWNwaSksIHVjcGktPmNfZnJlZW9mZiwgaSk7CiAJCWVsc2UgCiAJCQl1ZnNfZXJyb3IgKHNiLCAidWZzX2ZyZWVfZnJhZ21lbnRzIiwKIAkJCQkgICAiYml0IGFscmVhZHkgY2xlYXJlZCBmb3IgZnJhZ21lbnQgJXUiLCBpKTsKQEAgLTkwLDUxICs4Myw1MiBAQAogCiAJCiAJZnMzMl9hZGQoc2IsICZ1Y2ctPmNnX2NzLmNzX25mZnJlZSwgY291bnQpOwotCWZzMzJfYWRkKHNiLCAmdXNiMS0+ZnNfY3N0b3RhbC5jc19uZmZyZWUsIGNvdW50KTsKKwl1c3BpLT5jc190b3RhbC5jc19uZmZyZWUgKz0gY291bnQ7CiAJZnMzMl9hZGQoc2IsICZVRlNfU0Ioc2IpLT5mc19jcyhjZ25vKS5jc19uZmZyZWUsIGNvdW50KTsKLQlibGttYXAgPSB1YmhfYmxrbWFwIChVQ1BJX1VCSCwgdWNwaS0+Y19mcmVlb2ZmLCBiYmFzZSk7CisJYmxrbWFwID0gdWJoX2Jsa21hcCAoVUNQSV9VQkgodWNwaSksIHVjcGktPmNfZnJlZW9mZiwgYmJhc2UpOwogCXVmc19mcmFnYWNjdChzYiwgYmxrbWFwLCB1Y2ctPmNnX2Zyc3VtLCAxKTsKIAogCS8qCiAJICogVHJ5aW5nIHRvIHJlYXNzZW1ibGUgZnJlZSBmcmFnbWVudHMgaW50byBibG9jawogCSAqLwogCWJsa25vID0gdWZzX2ZyYWdzdG9ibGtzIChiYmFzZSk7Ci0JaWYgKHViaF9pc2Jsb2Nrc2V0KFVDUElfVUJILCB1Y3BpLT5jX2ZyZWVvZmYsIGJsa25vKSkgeworCWlmICh1YmhfaXNibG9ja3NldChVQ1BJX1VCSCh1Y3BpKSwgdWNwaS0+Y19mcmVlb2ZmLCBibGtubykpIHsKIAkJZnMzMl9zdWIoc2IsICZ1Y2ctPmNnX2NzLmNzX25mZnJlZSwgdXNwaS0+c19mcGIpOwotCQlmczMyX3N1YihzYiwgJnVzYjEtPmZzX2NzdG90YWwuY3NfbmZmcmVlLCB1c3BpLT5zX2ZwYik7CisJCXVzcGktPmNzX3RvdGFsLmNzX25mZnJlZSAtPSB1c3BpLT5zX2ZwYjsKIAkJZnMzMl9zdWIoc2IsICZVRlNfU0Ioc2IpLT5mc19jcyhjZ25vKS5jc19uZmZyZWUsIHVzcGktPnNfZnBiKTsKIAkJaWYgKChVRlNfU0Ioc2IpLT5zX2ZsYWdzICYgVUZTX0NHX01BU0spID09IFVGU19DR180NEJTRCkKIAkJCXVmc19jbHVzdGVyYWNjdCAoc2IsIHVjcGksIGJsa25vLCAxKTsKIAkJZnMzMl9hZGQoc2IsICZ1Y2ctPmNnX2NzLmNzX25iZnJlZSwgMSk7Ci0JCWZzMzJfYWRkKHNiLCAmdXNiMS0+ZnNfY3N0b3RhbC5jc19uYmZyZWUsIDEpOworCQl1c3BpLT5jc190b3RhbC5jc19uYmZyZWUrKzsKIAkJZnMzMl9hZGQoc2IsICZVRlNfU0Ioc2IpLT5mc19jcyhjZ25vKS5jc19uYmZyZWUsIDEpOwogCQljeWxubyA9IHVmc19jYnRvY3lsbm8gKGJiYXNlKTsKIAkJZnMxNl9hZGQoc2IsICZ1YmhfY2dfYmxrcyh1Y3BpLCBjeWxubywgdWZzX2NidG9ycG9zKGJiYXNlKSksIDEpOwogCQlmczMyX2FkZChzYiwgJnViaF9jZ19ibGt0b3QodWNwaSwgY3lsbm8pLCAxKTsKIAl9CiAJCi0JdWJoX21hcmtfYnVmZmVyX2RpcnR5IChVU1BJX1VCSCk7Ci0JdWJoX21hcmtfYnVmZmVyX2RpcnR5IChVQ1BJX1VCSCk7CisJdWJoX21hcmtfYnVmZmVyX2RpcnR5IChVU1BJX1VCSCh1c3BpKSk7CisJdWJoX21hcmtfYnVmZmVyX2RpcnR5IChVQ1BJX1VCSCh1Y3BpKSk7CiAJaWYgKHNiLT5zX2ZsYWdzICYgTVNfU1lOQ0hST05PVVMpIHsKLQkJdWJoX2xsX3J3X2Jsb2NrIChTV1JJVEUsIDEsIChzdHJ1Y3QgdWZzX2J1ZmZlcl9oZWFkICoqKSZ1Y3BpKTsKLQkJdWJoX3dhaXRfb25fYnVmZmVyIChVQ1BJX1VCSCk7CisJCXViaF9sbF9yd19ibG9jayhTV1JJVEUsIFVDUElfVUJIKHVjcGkpKTsKKwkJdWJoX3dhaXRfb25fYnVmZmVyIChVQ1BJX1VCSCh1Y3BpKSk7CiAJfQogCXNiLT5zX2RpcnQgPSAxOwogCQogCXVubG9ja19zdXBlciAoc2IpOwotCVVGU0QoKCJFWElUXG4iKSkKKwlVRlNEKCJFWElUXG4iKTsKIAlyZXR1cm47CiAKIGZhaWxlZDoKIAl1bmxvY2tfc3VwZXIgKHNiKTsKLQlVRlNEKCgiRVhJVCAoRkFJTEVEKVxuIikpCisJVUZTRCgiRVhJVCAoRkFJTEVEKVxuIik7CiAJcmV0dXJuOwogfQogCiAvKgogICogRnJlZSAnY291bnQnIGZyYWdtZW50cyBmcm9tIGZyYWdtZW50IG51bWJlciAnZnJhZ21lbnQnIChmcmVlIHdob2xlIGJsb2NrcykKICAqLwotdm9pZCB1ZnNfZnJlZV9ibG9ja3MgKHN0cnVjdCBpbm9kZSAqIGlub2RlLCB1bnNpZ25lZCBmcmFnbWVudCwgdW5zaWduZWQgY291bnQpIHsKK3ZvaWQgdWZzX2ZyZWVfYmxvY2tzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHVuc2lnbmVkIGZyYWdtZW50LCB1bnNpZ25lZCBjb3VudCkKK3sKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYjsKIAlzdHJ1Y3QgdWZzX3NiX3ByaXZhdGVfaW5mbyAqIHVzcGk7CiAJc3RydWN0IHVmc19zdXBlcl9ibG9ja19maXJzdCAqIHVzYjE7CkBAIC0xNDYsNyArMTQwLDcgQEAKIAl1c3BpID0gVUZTX1NCKHNiKS0+c191c3BpOwogCXVzYjEgPSB1YmhfZ2V0X3VzYl9maXJzdCh1c3BpKTsKIAotCVVGU0QoKCJFTlRFUiwgZnJhZ21lbnQgJXUsIGNvdW50ICV1XG4iLCBmcmFnbWVudCwgY291bnQpKQorCVVGU0QoIkVOVEVSLCBmcmFnbWVudCAldSwgY291bnQgJXVcbiIsIGZyYWdtZW50LCBjb3VudCk7CiAJCiAJaWYgKChmcmFnbWVudCAmIHVzcGktPnNfZnBibWFzaykgfHwgKGNvdW50ICYgdXNwaS0+c19mcGJtYXNrKSkgewogCQl1ZnNfZXJyb3IgKHNiLCAidWZzX2ZyZWVfYmxvY2tzIiwgImludGVybmFsIGVycm9yLCAiCkBAIC0xNjIsNyArMTU2LDcgQEAKIAliaXQgPSB1ZnNfZHRvZ2QgKGZyYWdtZW50KTsKIAlpZiAoY2dubyA+PSB1c3BpLT5zX25jZykgewogCQl1ZnNfcGFuaWMgKHNiLCAidWZzX2ZyZWVfYmxvY2tzIiwgImZyZWVpbmcgYmxvY2tzIGFyZSBvdXRzaWRlIGRldmljZSIpOwotCQlnb3RvIGZhaWxlZDsKKwkJZ290byBmYWlsZWRfdW5sb2NrOwogCX0KIAllbmRfYml0ID0gYml0ICsgY291bnQ7CiAJaWYgKGVuZF9iaXQgPiB1c3BpLT5zX2ZwZykgewpAQCAtMTczLDM2ICsxNjcsMzYgQEAKIAogCXVjcGkgPSB1ZnNfbG9hZF9jeWxpbmRlciAoc2IsIGNnbm8pOwogCWlmICghdWNwaSkgCi0JCWdvdG8gZmFpbGVkOwotCXVjZyA9IHViaF9nZXRfdWNnIChVQ1BJX1VCSCk7CisJCWdvdG8gZmFpbGVkX3VubG9jazsKKwl1Y2cgPSB1YmhfZ2V0X3VjZyAoVUNQSV9VQkgodWNwaSkpOwogCWlmICghdWZzX2NnX2Noa21hZ2ljKHNiLCB1Y2cpKSB7CiAJCXVmc19wYW5pYyAoc2IsICJ1ZnNfZnJlZV9ibG9ja3MiLCAiaW50ZXJuYWwgZXJyb3IsIGJhZCBtYWdpYyBudW1iZXIgb24gY2cgJXUiLCBjZ25vKTsKLQkJZ290byBmYWlsZWQ7CisJCWdvdG8gZmFpbGVkX3VubG9jazsKIAl9CiAKIAlmb3IgKGkgPSBiaXQ7IGkgPCBlbmRfYml0OyBpICs9IHVzcGktPnNfZnBiKSB7CiAJCWJsa25vID0gdWZzX2ZyYWdzdG9ibGtzKGkpOwotCQlpZiAodWJoX2lzYmxvY2tzZXQoVUNQSV9VQkgsIHVjcGktPmNfZnJlZW9mZiwgYmxrbm8pKSB7CisJCWlmICh1YmhfaXNibG9ja3NldChVQ1BJX1VCSCh1Y3BpKSwgdWNwaS0+Y19mcmVlb2ZmLCBibGtubykpIHsKIAkJCXVmc19lcnJvcihzYiwgInVmc19mcmVlX2Jsb2NrcyIsICJmcmVlaW5nIGZyZWUgZnJhZ21lbnQiKTsKIAkJfQotCQl1Ymhfc2V0YmxvY2soVUNQSV9VQkgsIHVjcGktPmNfZnJlZW9mZiwgYmxrbm8pOworCQl1Ymhfc2V0YmxvY2soVUNQSV9VQkgodWNwaSksIHVjcGktPmNfZnJlZW9mZiwgYmxrbm8pOwogCQlpZiAoKFVGU19TQihzYiktPnNfZmxhZ3MgJiBVRlNfQ0dfTUFTSykgPT0gVUZTX0NHXzQ0QlNEKQogCQkJdWZzX2NsdXN0ZXJhY2N0IChzYiwgdWNwaSwgYmxrbm8sIDEpOwogCQlEUVVPVF9GUkVFX0JMT0NLKGlub2RlLCB1c3BpLT5zX2ZwYik7CiAKIAkJZnMzMl9hZGQoc2IsICZ1Y2ctPmNnX2NzLmNzX25iZnJlZSwgMSk7Ci0JCWZzMzJfYWRkKHNiLCAmdXNiMS0+ZnNfY3N0b3RhbC5jc19uYmZyZWUsIDEpOworCQl1c3BpLT5jc190b3RhbC5jc19uYmZyZWUrKzsKIAkJZnMzMl9hZGQoc2IsICZVRlNfU0Ioc2IpLT5mc19jcyhjZ25vKS5jc19uYmZyZWUsIDEpOwogCQljeWxubyA9IHVmc19jYnRvY3lsbm8oaSk7CiAJCWZzMTZfYWRkKHNiLCAmdWJoX2NnX2Jsa3ModWNwaSwgY3lsbm8sIHVmc19jYnRvcnBvcyhpKSksIDEpOwogCQlmczMyX2FkZChzYiwgJnViaF9jZ19ibGt0b3QodWNwaSwgY3lsbm8pLCAxKTsKIAl9CiAKLQl1YmhfbWFya19idWZmZXJfZGlydHkgKFVTUElfVUJIKTsKLQl1YmhfbWFya19idWZmZXJfZGlydHkgKFVDUElfVUJIKTsKKwl1YmhfbWFya19idWZmZXJfZGlydHkgKFVTUElfVUJIKHVzcGkpKTsKKwl1YmhfbWFya19idWZmZXJfZGlydHkgKFVDUElfVUJIKHVjcGkpKTsKIAlpZiAoc2ItPnNfZmxhZ3MgJiBNU19TWU5DSFJPTk9VUykgewotCQl1YmhfbGxfcndfYmxvY2sgKFNXUklURSwgMSwgKHN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgKiopJnVjcGkpOwotCQl1Ymhfd2FpdF9vbl9idWZmZXIgKFVDUElfVUJIKTsKKwkJdWJoX2xsX3J3X2Jsb2NrKFNXUklURSwgVUNQSV9VQkgodWNwaSkpOworCQl1Ymhfd2FpdF9vbl9idWZmZXIgKFVDUElfVUJIKHVjcGkpKTsKIAl9CiAKIAlpZiAob3ZlcmZsb3cpIHsKQEAgLTIxMywzOCArMjA3LDEyNyBAQAogCiAJc2ItPnNfZGlydCA9IDE7CiAJdW5sb2NrX3N1cGVyIChzYik7Ci0JVUZTRCgoIkVYSVRcbiIpKQorCVVGU0QoIkVYSVRcbiIpOwogCXJldHVybjsKIAotZmFpbGVkOgorZmFpbGVkX3VubG9jazoKIAl1bmxvY2tfc3VwZXIgKHNiKTsKLQlVRlNEKCgiRVhJVCAoRkFJTEVEKVxuIikpCitmYWlsZWQ6CisJVUZTRCgiRVhJVCAoRkFJTEVEKVxuIik7CiAJcmV0dXJuOwogfQogCitzdGF0aWMgc3RydWN0IHBhZ2UgKnVmc19nZXRfbG9ja2VkX3BhZ2Uoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCisJCQkJICB1bnNpZ25lZCBsb25nIGluZGV4KQoreworCXN0cnVjdCBwYWdlICpwYWdlOwogCit0cnlfYWdhaW46CisJcGFnZSA9IGZpbmRfbG9ja19wYWdlKG1hcHBpbmcsIGluZGV4KTsKKwlpZiAoIXBhZ2UpIHsKKwkJcGFnZSA9IHJlYWRfY2FjaGVfcGFnZShtYXBwaW5nLCBpbmRleCwKKwkJCQkgICAgICAgKGZpbGxlcl90KiltYXBwaW5nLT5hX29wcy0+cmVhZHBhZ2UsCisJCQkJICAgICAgIE5VTEwpOworCQlpZiAoSVNfRVJSKHBhZ2UpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgInVmc19jaGFuZ2VfYmxvY2tucjogIgorCQkJICAgICAgICJyZWFkX2NhY2hlX3BhZ2UgZXJyb3I6IGlubyAlbHUsIGluZGV4OiAlbHVcbiIsCisJCQkgICAgICAgbWFwcGluZy0+aG9zdC0+aV9pbm8sIGluZGV4KTsKKwkJCWdvdG8gb3V0OworCQl9CiAKLSNkZWZpbmUgTlVMTElGWV9GUkFHTUVOVFMgXAotCWZvciAoaSA9IG9sZGNvdW50OyBpIDwgbmV3Y291bnQ7IGkrKykgeyBcCi0JCWJoID0gc2JfZ2V0YmxrKHNiLCByZXN1bHQgKyBpKTsgXAotCQltZW1zZXQgKGJoLT5iX2RhdGEsIDAsIHNiLT5zX2Jsb2Nrc2l6ZSk7IFwKLQkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7IFwKLQkJbWFya19idWZmZXJfZGlydHkgKGJoKTsgXAotCQlpZiAoSVNfU1lOQyhpbm9kZSkpIFwKLQkJCXN5bmNfZGlydHlfYnVmZmVyKGJoKTsgXAotCQlicmVsc2UgKGJoKTsgXAorCQlsb2NrX3BhZ2UocGFnZSk7CisKKwkJaWYgKCFQYWdlVXB0b2RhdGUocGFnZSkgfHwgUGFnZUVycm9yKHBhZ2UpKSB7CisJCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKworCQkJcHJpbnRrKEtFUk5fRVJSICJ1ZnNfY2hhbmdlX2Jsb2NrbnI6ICIKKwkJCSAgICAgICAiY2FuIG5vdCByZWFkIHBhZ2U6IGlubyAlbHUsIGluZGV4OiAlbHVcbiIsCisJCQkgICAgICAgbWFwcGluZy0+aG9zdC0+aV9pbm8sIGluZGV4KTsKKworCQkJcGFnZSA9IEVSUl9QVFIoLUVJTyk7CisJCQlnb3RvIG91dDsKKwkJfQogCX0KIAotdW5zaWduZWQgdWZzX25ld19mcmFnbWVudHMgKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBfX2ZzMzIgKiBwLCB1bnNpZ25lZCBmcmFnbWVudCwKLQl1bnNpZ25lZCBnb2FsLCB1bnNpZ25lZCBjb3VudCwgaW50ICogZXJyICkKKwlpZiAodW5saWtlbHkoIXBhZ2UtPm1hcHBpbmcgfHwgIXBhZ2VfaGFzX2J1ZmZlcnMocGFnZSkpKSB7CisJCXVubG9ja19wYWdlKHBhZ2UpOworCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJCWdvdG8gdHJ5X2FnYWluOy8qd2UgcmVhbGx5IG5lZWQgdGhlc2UgYnVmZmVycyovCisJfQorb3V0OgorCXJldHVybiBwYWdlOworfQorCisvKgorICogTW9kaWZ5IGlub2RlIHBhZ2UgY2FjaGUgaW4gc3VjaCB3YXk6CisgKiBoYXZlIC0gYmxvY2tzIHdpdGggYl9ibG9ja25yIGVxdWFsIHRvIG9sZGIuLi5vbGRiK2NvdW50LTEKKyAqIGdldCAtIGJsb2NrcyB3aXRoIGJfYmxvY2tuciBlcXVhbCB0byBuZXdiLi4ubmV3Yitjb3VudC0xCisgKiBhbHNvIHdlIHN1cHBvc2UgdGhhdCBvbGRiLi4ub2xkYitjb3VudC0xIGJsb2NrcworICogc2l0dWF0ZWQgYXQgdGhlIGVuZCBvZiBmaWxlLgorICoKKyAqIFdlIGNhbiBjb21lIGhlcmUgZnJvbSB1ZnNfd3JpdGVwYWdlIG9yIHVmc19wcmVwYXJlX3dyaXRlLAorICogbG9ja2VkX3BhZ2UgaXMgYXJndW1lbnQgb2YgdGhlc2UgZnVuY3Rpb25zLCBzbyB3ZSBhbHJlYWR5IGxvY2sgaXQuCisgKi8KK3N0YXRpYyB2b2lkIHVmc19jaGFuZ2VfYmxvY2tucihzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1bnNpZ25lZCBpbnQgYmFzZWJsaywKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgY291bnQsIHVuc2lnbmVkIGludCBvbGRiLAorCQkJICAgICAgIHVuc2lnbmVkIGludCBuZXdiLCBzdHJ1Y3QgcGFnZSAqbG9ja2VkX3BhZ2UpCit7CisJdW5zaWduZWQgaW50IGJsa19wZXJfcGFnZSA9IDEgPDwgKFBBR0VfQ0FDSEVfU0hJRlQgLSBpbm9kZS0+aV9ibGtiaXRzKTsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGlub2RlLT5pX21hcHBpbmc7CisJcGdvZmZfdCBpbmRleCwgY3VyX2luZGV4ID0gbG9ja2VkX3BhZ2UtPmluZGV4OworCXVuc2lnbmVkIGludCBpLCBqOworCXN0cnVjdCBwYWdlICpwYWdlOworCXN0cnVjdCBidWZmZXJfaGVhZCAqaGVhZCwgKmJoOworCisJVUZTRCgiRU5URVIsIGlubyAlbHUsIGNvdW50ICV1LCBvbGRiICV1LCBuZXdiICV1XG4iLAorCSAgICAgIGlub2RlLT5pX2lubywgY291bnQsIG9sZGIsIG5ld2IpOworCisJQlVHX09OKCFQYWdlTG9ja2VkKGxvY2tlZF9wYWdlKSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkgKz0gYmxrX3Blcl9wYWdlKSB7CisJCWluZGV4ID0gKGJhc2VibGsraSkgPj4gKFBBR0VfQ0FDSEVfU0hJRlQgLSBpbm9kZS0+aV9ibGtiaXRzKTsKKworCQlpZiAobGlrZWx5KGN1cl9pbmRleCAhPSBpbmRleCkpIHsKKwkJCXBhZ2UgPSB1ZnNfZ2V0X2xvY2tlZF9wYWdlKG1hcHBpbmcsIGluZGV4KTsKKwkJCWlmIChJU19FUlIocGFnZSkpCisJCQkJY29udGludWU7CisJCX0gZWxzZQorCQkJcGFnZSA9IGxvY2tlZF9wYWdlOworCisJCWogPSBpOworCQloZWFkID0gcGFnZV9idWZmZXJzKHBhZ2UpOworCQliaCA9IGhlYWQ7CisJCWRvIHsKKwkJCWlmIChsaWtlbHkoYmgtPmJfYmxvY2tuciA9PSBqICsgb2xkYiAmJiBqIDwgY291bnQpKSB7CisJCQkJdW5tYXBfdW5kZXJseWluZ19tZXRhZGF0YShiaC0+Yl9iZGV2LAorCQkJCQkJCSAgYmgtPmJfYmxvY2tucik7CisJCQkJYmgtPmJfYmxvY2tuciA9IG5ld2IgKyBqKys7CisJCQkJbWFya19idWZmZXJfZGlydHkoYmgpOworCQkJfQorCisJCQliaCA9IGJoLT5iX3RoaXNfcGFnZTsKKwkJfSB3aGlsZSAoYmggIT0gaGVhZCk7CisKKwkJc2V0X3BhZ2VfZGlydHkocGFnZSk7CisKKwkJaWYgKGxpa2VseShjdXJfaW5kZXggIT0gaW5kZXgpKSB7CisJCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwkJfQorIAl9CisJVUZTRCgiRVhJVFxuIik7Cit9CisKK3Vuc2lnbmVkIHVmc19uZXdfZnJhZ21lbnRzKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBfX2ZzMzIgKiBwLCB1bnNpZ25lZCBmcmFnbWVudCwKKwkJCSAgIHVuc2lnbmVkIGdvYWwsIHVuc2lnbmVkIGNvdW50LCBpbnQgKiBlcnIsIHN0cnVjdCBwYWdlICpsb2NrZWRfcGFnZSkKIHsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYjsKIAlzdHJ1Y3QgdWZzX3NiX3ByaXZhdGVfaW5mbyAqIHVzcGk7CiAJc3RydWN0IHVmc19zdXBlcl9ibG9ja19maXJzdCAqIHVzYjE7Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkICogYmg7Ci0JdW5zaWduZWQgY2dubywgb2xkY291bnQsIG5ld2NvdW50LCB0bXAsIHJlcXVlc3QsIGksIHJlc3VsdDsKKwl1bnNpZ25lZCBjZ25vLCBvbGRjb3VudCwgbmV3Y291bnQsIHRtcCwgcmVxdWVzdCwgcmVzdWx0OwogCQotCVVGU0QoKCJFTlRFUiwgaW5vICVsdSwgZnJhZ21lbnQgJXUsIGdvYWwgJXUsIGNvdW50ICV1XG4iLCBpbm9kZS0+aV9pbm8sIGZyYWdtZW50LCBnb2FsLCBjb3VudCkpCisJVUZTRCgiRU5URVIsIGlubyAlbHUsIGZyYWdtZW50ICV1LCBnb2FsICV1LCBjb3VudCAldVxuIiwgaW5vZGUtPmlfaW5vLCBmcmFnbWVudCwgZ29hbCwgY291bnQpOwogCQogCXNiID0gaW5vZGUtPmlfc2I7CiAJdXNwaSA9IFVGU19TQihzYiktPnNfdXNwaTsKQEAgLTI3MywxNCArMzU2LDE0IEBACiAJCQlyZXR1cm4gKHVuc2lnbmVkKS0xOwogCQl9CiAJCWlmIChmcmFnbWVudCA8IFVGU19JKGlub2RlKS0+aV9sYXN0ZnJhZykgewotCQkJVUZTRCgoIkVYSVQgKEFMUkVBRFkgQUxMT0NBVEVEKVxuIikpCisJCQlVRlNEKCJFWElUIChBTFJFQURZIEFMTE9DQVRFRClcbiIpOwogCQkJdW5sb2NrX3N1cGVyIChzYik7CiAJCQlyZXR1cm4gMDsKIAkJfQogCX0KIAllbHNlIHsKIAkJaWYgKHRtcCkgewotCQkJVUZTRCgoIkVYSVQgKEFMUkVBRFkgQUxMT0NBVEVEKVxuIikpCisJCQlVRlNEKCJFWElUIChBTFJFQURZIEFMTE9DQVRFRClcbiIpOwogCQkJdW5sb2NrX3N1cGVyKHNiKTsKIAkJCXJldHVybiAwOwogCQl9CkBAIC0yODksOSArMzcyLDkgQEAKIAkvKgogCSAqIFRoZXJlIGlzIG5vdCBlbm91Z2ggc3BhY2UgZm9yIHVzZXIgb24gdGhlIGRldmljZQogCSAqLwotCWlmICghY2FwYWJsZShDQVBfU1lTX1JFU09VUkNFKSAmJiB1ZnNfZnJlZXNwYWNlKHVzYjEsIFVGU19NSU5GUkVFKSA8PSAwKSB7CisJaWYgKCFjYXBhYmxlKENBUF9TWVNfUkVTT1VSQ0UpICYmIHVmc19mcmVlc3BhY2UodXNwaSwgVUZTX01JTkZSRUUpIDw9IDApIHsKIAkJdW5sb2NrX3N1cGVyIChzYik7Ci0JCVVGU0QoKCJFWElUIChGQUlMRUQpXG4iKSkKKwkJVUZTRCgiRVhJVCAoRkFJTEVEKVxuIik7CiAJCXJldHVybiAwOwogCX0KIApAQCAtMzEwLDEyICszOTMsMTAgQEAKIAkJaWYgKHJlc3VsdCkgewogCQkJKnAgPSBjcHVfdG9fZnMzMihzYiwgcmVzdWx0KTsKIAkJCSplcnIgPSAwOwotCQkJaW5vZGUtPmlfYmxvY2tzICs9IGNvdW50IDw8IHVzcGktPnNfbnNwZnNoaWZ0OwogCQkJVUZTX0koaW5vZGUpLT5pX2xhc3RmcmFnID0gbWF4X3QodTMyLCBVRlNfSShpbm9kZSktPmlfbGFzdGZyYWcsIGZyYWdtZW50ICsgY291bnQpOwotCQkJTlVMTElGWV9GUkFHTUVOVFMKIAkJfQogCQl1bmxvY2tfc3VwZXIoc2IpOwotCQlVRlNEKCgiRVhJVCwgcmVzdWx0ICV1XG4iLCByZXN1bHQpKQorCQlVRlNEKCJFWElULCByZXN1bHQgJXVcbiIsIHJlc3VsdCk7CiAJCXJldHVybiByZXN1bHQ7CiAJfQogCkBAIC0zMjUsMTEgKzQwNiw5IEBACiAJcmVzdWx0ID0gdWZzX2FkZF9mcmFnbWVudHMgKGlub2RlLCB0bXAsIG9sZGNvdW50LCBuZXdjb3VudCwgZXJyKTsKIAlpZiAocmVzdWx0KSB7CiAJCSplcnIgPSAwOwotCQlpbm9kZS0+aV9ibG9ja3MgKz0gY291bnQgPDwgdXNwaS0+c19uc3Bmc2hpZnQ7CiAJCVVGU19JKGlub2RlKS0+aV9sYXN0ZnJhZyA9IG1heF90KHUzMiwgVUZTX0koaW5vZGUpLT5pX2xhc3RmcmFnLCBmcmFnbWVudCArIGNvdW50KTsKLQkJTlVMTElGWV9GUkFHTUVOVFMKIAkJdW5sb2NrX3N1cGVyKHNiKTsKLQkJVUZTRCgoIkVYSVQsIHJlc3VsdCAldVxuIiwgcmVzdWx0KSkKKwkJVUZTRCgiRVhJVCwgcmVzdWx0ICV1XG4iLCByZXN1bHQpOwogCQlyZXR1cm4gcmVzdWx0OwogCX0KIApAQCAtMzM5LDggKzQxOCw4IEBACiAJc3dpdGNoIChmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfb3B0aW0pKSB7CiAJICAgIGNhc2UgVUZTX09QVFNQQUNFOgogCQlyZXF1ZXN0ID0gbmV3Y291bnQ7Ci0JCWlmICh1c3BpLT5zX21pbmZyZWUgPCA1IHx8IGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19jc3RvdGFsLmNzX25mZnJlZSkgCi0JCSAgICA+IHVzcGktPnNfZHNpemUgKiB1c3BpLT5zX21pbmZyZWUgLyAoMiAqIDEwMCkgKQorCQlpZiAodXNwaS0+c19taW5mcmVlIDwgNSB8fCB1c3BpLT5jc190b3RhbC5jc19uZmZyZWUKKwkJICAgID4gdXNwaS0+c19kc2l6ZSAqIHVzcGktPnNfbWluZnJlZSAvICgyICogMTAwKSkKIAkJCWJyZWFrOwogCQl1c2IxLT5mc19vcHRpbSA9IGNwdV90b19mczMyKHNiLCBVRlNfT1BUVElNRSk7CiAJCWJyZWFrOwpAQCAtMzQ5LDcgKzQyOCw3IEBACiAJCiAJICAgIGNhc2UgVUZTX09QVFRJTUU6CiAJCXJlcXVlc3QgPSB1c3BpLT5zX2ZwYjsKLQkJaWYgKGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19jc3RvdGFsLmNzX25mZnJlZSkgPCB1c3BpLT5zX2RzaXplICoKKwkJaWYgKHVzcGktPmNzX3RvdGFsLmNzX25mZnJlZSA8IHVzcGktPnNfZHNpemUgKgogCQkgICAgKHVzcGktPnNfbWluZnJlZSAtIDIpIC8gMTAwKQogCQkJYnJlYWs7CiAJCXVzYjEtPmZzX29wdGltID0gY3B1X3RvX2ZzMzIoc2IsIFVGU19PUFRUSU1FKTsKQEAgLTM1NywzOSArNDM2LDIyIEBACiAJfQogCXJlc3VsdCA9IHVmc19hbGxvY19mcmFnbWVudHMgKGlub2RlLCBjZ25vLCBnb2FsLCByZXF1ZXN0LCBlcnIpOwogCWlmIChyZXN1bHQpIHsKLQkJZm9yIChpID0gMDsgaSA8IG9sZGNvdW50OyBpKyspIHsKLQkJCWJoID0gc2JfYnJlYWQoc2IsIHRtcCArIGkpOwotCQkJaWYoYmgpCi0JCQl7Ci0JCQkJY2xlYXJfYnVmZmVyX2RpcnR5KGJoKTsKLQkJCQliaC0+Yl9ibG9ja25yID0gcmVzdWx0ICsgaTsKLQkJCQltYXJrX2J1ZmZlcl9kaXJ0eSAoYmgpOwotCQkJCWlmIChJU19TWU5DKGlub2RlKSkKLQkJCQkJc3luY19kaXJ0eV9idWZmZXIoYmgpOwotCQkJCWJyZWxzZSAoYmgpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCXByaW50ayhLRVJOX0VSUiAidWZzX25ld19mcmFnbWVudHM6IGJyZWFkIGZhaWxcbiIpOwotCQkJCXVubG9ja19zdXBlcihzYik7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCX0KKwkJdWZzX2NoYW5nZV9ibG9ja25yKGlub2RlLCBmcmFnbWVudCAtIG9sZGNvdW50LCBvbGRjb3VudCwgdG1wLAorCQkJCSAgIHJlc3VsdCwgbG9ja2VkX3BhZ2UpOworCiAJCSpwID0gY3B1X3RvX2ZzMzIoc2IsIHJlc3VsdCk7CiAJCSplcnIgPSAwOwotCQlpbm9kZS0+aV9ibG9ja3MgKz0gY291bnQgPDwgdXNwaS0+c19uc3Bmc2hpZnQ7CiAJCVVGU19JKGlub2RlKS0+aV9sYXN0ZnJhZyA9IG1heF90KHUzMiwgVUZTX0koaW5vZGUpLT5pX2xhc3RmcmFnLCBmcmFnbWVudCArIGNvdW50KTsKLQkJTlVMTElGWV9GUkFHTUVOVFMKIAkJdW5sb2NrX3N1cGVyKHNiKTsKIAkJaWYgKG5ld2NvdW50IDwgcmVxdWVzdCkKIAkJCXVmc19mcmVlX2ZyYWdtZW50cyAoaW5vZGUsIHJlc3VsdCArIG5ld2NvdW50LCByZXF1ZXN0IC0gbmV3Y291bnQpOwogCQl1ZnNfZnJlZV9mcmFnbWVudHMgKGlub2RlLCB0bXAsIG9sZGNvdW50KTsKLQkJVUZTRCgoIkVYSVQsIHJlc3VsdCAldVxuIiwgcmVzdWx0KSkKKwkJVUZTRCgiRVhJVCwgcmVzdWx0ICV1XG4iLCByZXN1bHQpOwogCQlyZXR1cm4gcmVzdWx0OwogCX0KIAogCXVubG9ja19zdXBlcihzYik7Ci0JVUZTRCgoIkVYSVQgKEZBSUxFRClcbiIpKQorCVVGU0QoIkVYSVQgKEZBSUxFRClcbiIpOwogCXJldHVybiAwOwogfQkJCiAKQEAgLTQwNCw3ICs0NjYsNyBAQAogCXN0cnVjdCB1ZnNfY3lsaW5kZXJfZ3JvdXAgKiB1Y2c7CiAJdW5zaWduZWQgY2dubywgZnJhZ25vLCBmcmFnb2ZmLCBjb3VudCwgZnJhZ3NpemUsIGk7CiAJCi0JVUZTRCgoIkVOVEVSLCBmcmFnbWVudCAldSwgb2xkY291bnQgJXUsIG5ld2NvdW50ICV1XG4iLCBmcmFnbWVudCwgb2xkY291bnQsIG5ld2NvdW50KSkKKwlVRlNEKCJFTlRFUiwgZnJhZ21lbnQgJXUsIG9sZGNvdW50ICV1LCBuZXdjb3VudCAldVxuIiwgZnJhZ21lbnQsIG9sZGNvdW50LCBuZXdjb3VudCk7CiAJCiAJc2IgPSBpbm9kZS0+aV9zYjsKIAl1c3BpID0gVUZTX1NCKHNiKS0+c191c3BpOwpAQCAtNDE5LDcgKzQ4MSw3IEBACiAJdWNwaSA9IHVmc19sb2FkX2N5bGluZGVyIChzYiwgY2dubyk7CiAJaWYgKCF1Y3BpKQogCQlyZXR1cm4gMDsKLQl1Y2cgPSB1YmhfZ2V0X3VjZyAoVUNQSV9VQkgpOworCXVjZyA9IHViaF9nZXRfdWNnIChVQ1BJX1VCSCh1Y3BpKSk7CiAJaWYgKCF1ZnNfY2dfY2hrbWFnaWMoc2IsIHVjZykpIHsKIAkJdWZzX3BhbmljIChzYiwgInVmc19hZGRfZnJhZ21lbnRzIiwKIAkJCSJpbnRlcm5hbCBlcnJvciwgYmFkIG1hZ2ljIG51bWJlciBvbiBjZyAldSIsIGNnbm8pOwpAQCAtNDI5LDE0ICs0OTEsMTQgQEAKIAlmcmFnbm8gPSB1ZnNfZHRvZ2QgKGZyYWdtZW50KTsKIAlmcmFnb2ZmID0gdWZzX2ZyYWdudW0gKGZyYWdubyk7CiAJZm9yIChpID0gb2xkY291bnQ7IGkgPCBuZXdjb3VudDsgaSsrKQotCQlpZiAodWJoX2lzY2xyIChVQ1BJX1VCSCwgdWNwaS0+Y19mcmVlb2ZmLCBmcmFnbm8gKyBpKSkKKwkJaWYgKHViaF9pc2NsciAoVUNQSV9VQkgodWNwaSksIHVjcGktPmNfZnJlZW9mZiwgZnJhZ25vICsgaSkpCiAJCQlyZXR1cm4gMDsKIAkvKgogCSAqIEJsb2NrIGNhbiBiZSBleHRlbmRlZAogCSAqLwogCXVjZy0+Y2dfdGltZSA9IGNwdV90b19mczMyKHNiLCBnZXRfc2Vjb25kcygpKTsKIAlmb3IgKGkgPSBuZXdjb3VudDsgaSA8ICh1c3BpLT5zX2ZwYiAtIGZyYWdvZmYpOyBpKyspCi0JCWlmICh1YmhfaXNjbHIgKFVDUElfVUJILCB1Y3BpLT5jX2ZyZWVvZmYsIGZyYWdubyArIGkpKQorCQlpZiAodWJoX2lzY2xyIChVQ1BJX1VCSCh1Y3BpKSwgdWNwaS0+Y19mcmVlb2ZmLCBmcmFnbm8gKyBpKSkKIAkJCWJyZWFrOwogCWZyYWdzaXplID0gaSAtIG9sZGNvdW50OwogCWlmICghZnMzMl90b19jcHUoc2IsIHVjZy0+Y2dfZnJzdW1bZnJhZ3NpemVdKSkKQEAgLTQ0Niw3ICs1MDgsNyBAQAogCWlmIChmcmFnc2l6ZSAhPSBjb3VudCkKIAkJZnMzMl9hZGQoc2IsICZ1Y2ctPmNnX2Zyc3VtW2ZyYWdzaXplIC0gY291bnRdLCAxKTsKIAlmb3IgKGkgPSBvbGRjb3VudDsgaSA8IG5ld2NvdW50OyBpKyspCi0JCXViaF9jbHJiaXQgKFVDUElfVUJILCB1Y3BpLT5jX2ZyZWVvZmYsIGZyYWdubyArIGkpOworCQl1YmhfY2xyYml0IChVQ1BJX1VCSCh1Y3BpKSwgdWNwaS0+Y19mcmVlb2ZmLCBmcmFnbm8gKyBpKTsKIAlpZihEUVVPVF9BTExPQ19CTE9DSyhpbm9kZSwgY291bnQpKSB7CiAJCSplcnIgPSAtRURRVU9UOwogCQlyZXR1cm4gMDsKQEAgLTQ1NCwxNyArNTE2LDE3IEBACiAKIAlmczMyX3N1YihzYiwgJnVjZy0+Y2dfY3MuY3NfbmZmcmVlLCBjb3VudCk7CiAJZnMzMl9zdWIoc2IsICZVRlNfU0Ioc2IpLT5mc19jcyhjZ25vKS5jc19uZmZyZWUsIGNvdW50KTsKLQlmczMyX3N1YihzYiwgJnVzYjEtPmZzX2NzdG90YWwuY3NfbmZmcmVlLCBjb3VudCk7CisJdXNwaS0+Y3NfdG90YWwuY3NfbmZmcmVlIC09IGNvdW50OwogCQotCXViaF9tYXJrX2J1ZmZlcl9kaXJ0eSAoVVNQSV9VQkgpOwotCXViaF9tYXJrX2J1ZmZlcl9kaXJ0eSAoVUNQSV9VQkgpOworCXViaF9tYXJrX2J1ZmZlcl9kaXJ0eSAoVVNQSV9VQkgodXNwaSkpOworCXViaF9tYXJrX2J1ZmZlcl9kaXJ0eSAoVUNQSV9VQkgodWNwaSkpOwogCWlmIChzYi0+c19mbGFncyAmIE1TX1NZTkNIUk9OT1VTKSB7Ci0JCXViaF9sbF9yd19ibG9jayAoU1dSSVRFLCAxLCAoc3RydWN0IHVmc19idWZmZXJfaGVhZCAqKikmdWNwaSk7Ci0JCXViaF93YWl0X29uX2J1ZmZlciAoVUNQSV9VQkgpOworCQl1YmhfbGxfcndfYmxvY2soU1dSSVRFLCBVQ1BJX1VCSCh1Y3BpKSk7CisJCXViaF93YWl0X29uX2J1ZmZlciAoVUNQSV9VQkgodWNwaSkpOwogCX0KIAlzYi0+c19kaXJ0ID0gMTsKIAotCVVGU0QoKCJFWElULCBmcmFnbWVudCAldVxuIiwgZnJhZ21lbnQpKQorCVVGU0QoIkVYSVQsIGZyYWdtZW50ICV1XG4iLCBmcmFnbWVudCk7CiAJCiAJcmV0dXJuIGZyYWdtZW50OwogfQpAQCAtNDg3LDcgKzU0OSw3IEBACiAJc3RydWN0IHVmc19jeWxpbmRlcl9ncm91cCAqIHVjZzsKIAl1bnNpZ25lZCBvbGRjZywgaSwgaiwgaywgcmVzdWx0LCBhbGxvY3NpemU7CiAJCi0JVUZTRCgoIkVOVEVSLCBpbm8gJWx1LCBjZ25vICV1LCBnb2FsICV1LCBjb3VudCAldVxuIiwgaW5vZGUtPmlfaW5vLCBjZ25vLCBnb2FsLCBjb3VudCkpCisJVUZTRCgiRU5URVIsIGlubyAlbHUsIGNnbm8gJXUsIGdvYWwgJXUsIGNvdW50ICV1XG4iLCBpbm9kZS0+aV9pbm8sIGNnbm8sIGdvYWwsIGNvdW50KTsKIAogCXNiID0gaW5vZGUtPmlfc2I7CiAJdXNwaSA9IFVGU19TQihzYiktPnNfdXNwaTsKQEAgLTUyMSwxNCArNTgzLDE0IEBACiAJCVVGU19URVNUX0ZSRUVfU1BBQ0VfQ0cKIAl9CiAJCi0JVUZTRCgoIkVYSVQgKEZBSUxFRClcbiIpKQorCVVGU0QoIkVYSVQgKEZBSUxFRClcbiIpOwogCXJldHVybiAwOwogCiBjZ19mb3VuZDoKIAl1Y3BpID0gdWZzX2xvYWRfY3lsaW5kZXIgKHNiLCBjZ25vKTsKIAlpZiAoIXVjcGkpCiAJCXJldHVybiAwOwotCXVjZyA9IHViaF9nZXRfdWNnIChVQ1BJX1VCSCk7CisJdWNnID0gdWJoX2dldF91Y2cgKFVDUElfVUJIKHVjcGkpKTsKIAlpZiAoIXVmc19jZ19jaGttYWdpYyhzYiwgdWNnKSkgCiAJCXVmc19wYW5pYyAoc2IsICJ1ZnNfYWxsb2NfZnJhZ21lbnRzIiwKIAkJCSJpbnRlcm5hbCBlcnJvciwgYmFkIG1hZ2ljIG51bWJlciBvbiBjZyAldSIsIGNnbm8pOwpAQCAtNTUxLDEyICs2MTMsMTIgQEAKIAkJCXJldHVybiAwOwogCQlnb2FsID0gdWZzX2R0b2dkIChyZXN1bHQpOwogCQlmb3IgKGkgPSBjb3VudDsgaSA8IHVzcGktPnNfZnBiOyBpKyspCi0JCQl1Ymhfc2V0Yml0IChVQ1BJX1VCSCwgdWNwaS0+Y19mcmVlb2ZmLCBnb2FsICsgaSk7CisJCQl1Ymhfc2V0Yml0IChVQ1BJX1VCSCh1Y3BpKSwgdWNwaS0+Y19mcmVlb2ZmLCBnb2FsICsgaSk7CiAJCWkgPSB1c3BpLT5zX2ZwYiAtIGNvdW50OwogCQlEUVVPVF9GUkVFX0JMT0NLKGlub2RlLCBpKTsKIAogCQlmczMyX2FkZChzYiwgJnVjZy0+Y2dfY3MuY3NfbmZmcmVlLCBpKTsKLQkJZnMzMl9hZGQoc2IsICZ1c2IxLT5mc19jc3RvdGFsLmNzX25mZnJlZSwgaSk7CisJCXVzcGktPmNzX3RvdGFsLmNzX25mZnJlZSArPSBpOwogCQlmczMyX2FkZChzYiwgJlVGU19TQihzYiktPmZzX2NzKGNnbm8pLmNzX25mZnJlZSwgaSk7CiAJCWZzMzJfYWRkKHNiLCAmdWNnLT5jZ19mcnN1bVtpXSwgMSk7CiAJCWdvdG8gc3VjY2VkOwpAQCAtNTcwLDEwICs2MzIsMTAgQEAKIAkJcmV0dXJuIDA7CiAJfQogCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotCQl1YmhfY2xyYml0IChVQ1BJX1VCSCwgdWNwaS0+Y19mcmVlb2ZmLCByZXN1bHQgKyBpKTsKKwkJdWJoX2NscmJpdCAoVUNQSV9VQkgodWNwaSksIHVjcGktPmNfZnJlZW9mZiwgcmVzdWx0ICsgaSk7CiAJCiAJZnMzMl9zdWIoc2IsICZ1Y2ctPmNnX2NzLmNzX25mZnJlZSwgY291bnQpOwotCWZzMzJfc3ViKHNiLCAmdXNiMS0+ZnNfY3N0b3RhbC5jc19uZmZyZWUsIGNvdW50KTsKKwl1c3BpLT5jc190b3RhbC5jc19uZmZyZWUgLT0gY291bnQ7CiAJZnMzMl9zdWIoc2IsICZVRlNfU0Ioc2IpLT5mc19jcyhjZ25vKS5jc19uZmZyZWUsIGNvdW50KTsKIAlmczMyX3N1YihzYiwgJnVjZy0+Y2dfZnJzdW1bYWxsb2NzaXplXSwgMSk7CiAKQEAgLTU4MSwxNiArNjQzLDE2IEBACiAJCWZzMzJfYWRkKHNiLCAmdWNnLT5jZ19mcnN1bVthbGxvY3NpemUgLSBjb3VudF0sIDEpOwogCiBzdWNjZWQ6Ci0JdWJoX21hcmtfYnVmZmVyX2RpcnR5IChVU1BJX1VCSCk7Ci0JdWJoX21hcmtfYnVmZmVyX2RpcnR5IChVQ1BJX1VCSCk7CisJdWJoX21hcmtfYnVmZmVyX2RpcnR5IChVU1BJX1VCSCh1c3BpKSk7CisJdWJoX21hcmtfYnVmZmVyX2RpcnR5IChVQ1BJX1VCSCh1Y3BpKSk7CiAJaWYgKHNiLT5zX2ZsYWdzICYgTVNfU1lOQ0hST05PVVMpIHsKLQkJdWJoX2xsX3J3X2Jsb2NrIChTV1JJVEUsIDEsIChzdHJ1Y3QgdWZzX2J1ZmZlcl9oZWFkICoqKSZ1Y3BpKTsKLQkJdWJoX3dhaXRfb25fYnVmZmVyIChVQ1BJX1VCSCk7CisJCXViaF9sbF9yd19ibG9jayhTV1JJVEUsIFVDUElfVUJIKHVjcGkpKTsKKwkJdWJoX3dhaXRfb25fYnVmZmVyIChVQ1BJX1VCSCh1Y3BpKSk7CiAJfQogCXNiLT5zX2RpcnQgPSAxOwogCiAJcmVzdWx0ICs9IGNnbm8gKiB1c3BpLT5zX2ZwZzsKLQlVRlNEKCgiRVhJVDMsIHJlc3VsdCAldVxuIiwgcmVzdWx0KSkKKwlVRlNEKCJFWElUMywgcmVzdWx0ICV1XG4iLCByZXN1bHQpOwogCXJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTYwMywxMiArNjY1LDEyIEBACiAJc3RydWN0IHVmc19jeWxpbmRlcl9ncm91cCAqIHVjZzsKIAl1bnNpZ25lZCByZXN1bHQsIGN5bG5vLCBibGtubzsKIAotCVVGU0QoKCJFTlRFUiwgZ29hbCAldVxuIiwgZ29hbCkpCisJVUZTRCgiRU5URVIsIGdvYWwgJXVcbiIsIGdvYWwpOwogCiAJc2IgPSBpbm9kZS0+aV9zYjsKIAl1c3BpID0gVUZTX1NCKHNiKS0+c191c3BpOwogCXVzYjEgPSB1YmhfZ2V0X3VzYl9maXJzdCh1c3BpKTsKLQl1Y2cgPSB1YmhfZ2V0X3VjZyhVQ1BJX1VCSCk7CisJdWNnID0gdWJoX2dldF91Y2coVUNQSV9VQkgodWNwaSkpOwogCiAJaWYgKGdvYWwgPT0gMCkgewogCQlnb2FsID0gdWNwaS0+Y19yb3RvcjsKQEAgLTYyMCw3ICs2ODIsNyBAQAogCS8qCiAJICogSWYgdGhlIHJlcXVlc3RlZCBibG9jayBpcyBhdmFpbGFibGUsIHVzZSBpdC4KIAkgKi8KLQlpZiAodWJoX2lzYmxvY2tzZXQoVUNQSV9VQkgsIHVjcGktPmNfZnJlZW9mZiwgdWZzX2ZyYWdzdG9ibGtzKGdvYWwpKSkgeworCWlmICh1YmhfaXNibG9ja3NldChVQ1BJX1VCSCh1Y3BpKSwgdWNwaS0+Y19mcmVlb2ZmLCB1ZnNfZnJhZ3N0b2Jsa3MoZ29hbCkpKSB7CiAJCXJlc3VsdCA9IGdvYWw7CiAJCWdvdG8gZ290aXQ7CiAJfQpAQCAtNjMyLDcgKzY5NCw3IEBACiAJdWNwaS0+Y19yb3RvciA9IHJlc3VsdDsKIGdvdGl0OgogCWJsa25vID0gdWZzX2ZyYWdzdG9ibGtzKHJlc3VsdCk7Ci0JdWJoX2NscmJsb2NrIChVQ1BJX1VCSCwgdWNwaS0+Y19mcmVlb2ZmLCBibGtubyk7CisJdWJoX2NscmJsb2NrIChVQ1BJX1VCSCh1Y3BpKSwgdWNwaS0+Y19mcmVlb2ZmLCBibGtubyk7CiAJaWYgKChVRlNfU0Ioc2IpLT5zX2ZsYWdzICYgVUZTX0NHX01BU0spID09IFVGU19DR180NEJTRCkKIAkJdWZzX2NsdXN0ZXJhY2N0IChzYiwgdWNwaSwgYmxrbm8sIC0xKTsKIAlpZihEUVVPVF9BTExPQ19CTE9DSyhpbm9kZSwgdXNwaS0+c19mcGIpKSB7CkBAIC02NDEsMzEgKzcwMyw3NiBAQAogCX0KIAogCWZzMzJfc3ViKHNiLCAmdWNnLT5jZ19jcy5jc19uYmZyZWUsIDEpOwotCWZzMzJfc3ViKHNiLCAmdXNiMS0+ZnNfY3N0b3RhbC5jc19uYmZyZWUsIDEpOworCXVzcGktPmNzX3RvdGFsLmNzX25iZnJlZS0tOwogCWZzMzJfc3ViKHNiLCAmVUZTX1NCKHNiKS0+ZnNfY3ModWNwaS0+Y19jZ3gpLmNzX25iZnJlZSwgMSk7CiAJY3lsbm8gPSB1ZnNfY2J0b2N5bG5vKHJlc3VsdCk7CiAJZnMxNl9zdWIoc2IsICZ1YmhfY2dfYmxrcyh1Y3BpLCBjeWxubywgdWZzX2NidG9ycG9zKHJlc3VsdCkpLCAxKTsKIAlmczMyX3N1YihzYiwgJnViaF9jZ19ibGt0b3QodWNwaSwgY3lsbm8pLCAxKTsKIAkKLQlVRlNEKCgiRVhJVCwgcmVzdWx0ICV1XG4iLCByZXN1bHQpKQorCVVGU0QoIkVYSVQsIHJlc3VsdCAldVxuIiwgcmVzdWx0KTsKIAogCXJldHVybiByZXN1bHQ7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCB1ZnNfYml0bWFwX3NlYXJjaCAoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsCi0Jc3RydWN0IHVmc19jZ19wcml2YXRlX2luZm8gKiB1Y3BpLCB1bnNpZ25lZCBnb2FsLCB1bnNpZ25lZCBjb3VudCkKK3N0YXRpYyB1bnNpZ25lZCB1Ymhfc2NhbmMoc3RydWN0IHVmc19zYl9wcml2YXRlX2luZm8gKnVzcGksCisJCQkgIHN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgKnViaCwKKwkJCSAgdW5zaWduZWQgYmVnaW4sIHVuc2lnbmVkIHNpemUsCisJCQkgIHVuc2lnbmVkIGNoYXIgKnRhYmxlLCB1bnNpZ25lZCBjaGFyIG1hc2spCiB7Ci0Jc3RydWN0IHVmc19zYl9wcml2YXRlX2luZm8gKiB1c3BpOwotCXN0cnVjdCB1ZnNfc3VwZXJfYmxvY2tfZmlyc3QgKiB1c2IxOwotCXN0cnVjdCB1ZnNfY3lsaW5kZXJfZ3JvdXAgKiB1Y2c7Ci0JdW5zaWduZWQgc3RhcnQsIGxlbmd0aCwgbG9jYXRpb24sIHJlc3VsdDsKLQl1bnNpZ25lZCBwb3NzaXRpb24sIGZyYWdzaXplLCBibG9ja21hcCwgbWFzazsKKwl1bnNpZ25lZCByZXN0LCBvZmZzZXQ7CisJdW5zaWduZWQgY2hhciAqY3A7CiAJCi0JVUZTRCgoIkVOVEVSLCBjZyAldSwgZ29hbCAldSwgY291bnQgJXVcbiIsIHVjcGktPmNfY2d4LCBnb2FsLCBjb3VudCkpCiAKLQl1c3BpID0gVUZTX1NCKHNiKS0+c191c3BpOworCW9mZnNldCA9IGJlZ2luICYgfnVzcGktPnNfZm1hc2s7CisJYmVnaW4gPj49IHVzcGktPnNfZnNoaWZ0OworCWZvciAoOzspIHsKKwkJaWYgKChvZmZzZXQgKyBzaXplKSA8IHVzcGktPnNfZnNpemUpCisJCQlyZXN0ID0gc2l6ZTsKKwkJZWxzZQorCQkJcmVzdCA9IHVzcGktPnNfZnNpemUgLSBvZmZzZXQ7CisJCXNpemUgLT0gcmVzdDsKKwkJY3AgPSB1YmgtPmJoW2JlZ2luXS0+Yl9kYXRhICsgb2Zmc2V0OworCQl3aGlsZSAoKHRhYmxlWypjcCsrXSAmIG1hc2spID09IDAgJiYgLS1yZXN0KQorCQkJOworCQlpZiAocmVzdCB8fCAhc2l6ZSkKKwkJCWJyZWFrOworCQliZWdpbisrOworCQlvZmZzZXQgPSAwOworCX0KKwlyZXR1cm4gKHNpemUgKyByZXN0KTsKK30KKworLyoKKyAqIEZpbmQgYSBibG9jayBvZiB0aGUgc3BlY2lmaWVkIHNpemUgaW4gdGhlIHNwZWNpZmllZCBjeWxpbmRlciBncm91cC4KKyAqIEBzcDogcG9pbnRlciB0byBzdXBlciBibG9jaworICogQHVjcGk6IHBvaW50ZXIgdG8gY3lsaW5kZXIgZ3JvdXAgaW5mbworICogQGdvYWw6IG5lYXIgd2hpY2ggYmxvY2sgd2Ugd2FudCBmaW5kIG5ldyBvbmUKKyAqIEBjb3VudDogc3BlY2lmaWVkIHNpemUKKyAqLworc3RhdGljIHVuc2lnbmVkIHVmc19iaXRtYXBfc2VhcmNoKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJICBzdHJ1Y3QgdWZzX2NnX3ByaXZhdGVfaW5mbyAqdWNwaSwKKwkJCQkgIHVuc2lnbmVkIGdvYWwsIHVuc2lnbmVkIGNvdW50KQoreworCS8qCisJICogQml0IHBhdHRlcm5zIGZvciBpZGVudGlmeWluZyBmcmFnbWVudHMgaW4gdGhlIGJsb2NrIG1hcAorCSAqIHVzZWQgYXMgKChtYXAgJiBtYXNrX2FycikgPT0gd2FudF9hcnIpCisJICovCisJc3RhdGljIGNvbnN0IGludCBtYXNrX2Fycls5XSA9IHsKKwkJMHgzLCAweDcsIDB4ZiwgMHgxZiwgMHgzZiwgMHg3ZiwgMHhmZiwgMHgxZmYsIDB4M2ZmCisJfTsKKwlzdGF0aWMgY29uc3QgaW50IHdhbnRfYXJyWzldID0geworCQkweDAsIDB4MiwgMHg2LCAweGUsIDB4MWUsIDB4M2UsIDB4N2UsIDB4ZmUsIDB4MWZlCisJfTsKKwlzdHJ1Y3QgdWZzX3NiX3ByaXZhdGVfaW5mbyAqdXNwaSA9IFVGU19TQihzYiktPnNfdXNwaTsKKwlzdHJ1Y3QgdWZzX3N1cGVyX2Jsb2NrX2ZpcnN0ICp1c2IxOworCXN0cnVjdCB1ZnNfY3lsaW5kZXJfZ3JvdXAgKnVjZzsKKwl1bnNpZ25lZCBzdGFydCwgbGVuZ3RoLCBsb2MsIHJlc3VsdDsKKwl1bnNpZ25lZCBwb3MsIHdhbnQsIGJsb2NrbWFwLCBtYXNrLCBlbmQ7CisKKwlVRlNEKCJFTlRFUiwgY2cgJXUsIGdvYWwgJXUsIGNvdW50ICV1XG4iLCB1Y3BpLT5jX2NneCwgZ29hbCwgY291bnQpOworCiAJdXNiMSA9IHViaF9nZXRfdXNiX2ZpcnN0ICh1c3BpKTsKLQl1Y2cgPSB1YmhfZ2V0X3VjZyhVQ1BJX1VCSCk7CisJdWNnID0gdWJoX2dldF91Y2coVUNQSV9VQkgodWNwaSkpOwogCiAJaWYgKGdvYWwpCiAJCXN0YXJ0ID0gdWZzX2R0b2dkKGdvYWwpID4+IDM7CkBAIC02NzMsNTMgKzc4MCw1MCBAQAogCQlzdGFydCA9IHVjcGktPmNfZnJvdG9yID4+IDM7CiAJCQogCWxlbmd0aCA9ICgodXNwaS0+c19mcGcgKyA3KSA+PiAzKSAtIHN0YXJ0OwotCWxvY2F0aW9uID0gdWJoX3NjYW5jKFVDUElfVUJILCB1Y3BpLT5jX2ZyZWVvZmYgKyBzdGFydCwgbGVuZ3RoLAorCWxvYyA9IHViaF9zY2FuYyh1c3BpLCBVQ1BJX1VCSCh1Y3BpKSwgdWNwaS0+Y19mcmVlb2ZmICsgc3RhcnQsIGxlbmd0aCwKIAkJKHVzcGktPnNfZnBiID09IDgpID8gdWZzX2ZyYWd0YWJsZV84ZnBiIDogdWZzX2ZyYWd0YWJsZV9vdGhlciwKIAkJMSA8PCAoY291bnQgLSAxICsgKHVzcGktPnNfZnBiICYgNykpKTsgCi0JaWYgKGxvY2F0aW9uID09IDApIHsKKwlpZiAobG9jID09IDApIHsKIAkJbGVuZ3RoID0gc3RhcnQgKyAxOwotCQlsb2NhdGlvbiA9IHViaF9zY2FuYyhVQ1BJX1VCSCwgdWNwaS0+Y19mcmVlb2ZmLCBsZW5ndGgsIAotCQkJKHVzcGktPnNfZnBiID09IDgpID8gdWZzX2ZyYWd0YWJsZV84ZnBiIDogdWZzX2ZyYWd0YWJsZV9vdGhlciwKLQkJCTEgPDwgKGNvdW50IC0gMSArICh1c3BpLT5zX2ZwYiAmIDcpKSk7Ci0JCWlmIChsb2NhdGlvbiA9PSAwKSB7Ci0JCQl1ZnNfZXJyb3IgKHNiLCAidWZzX2JpdG1hcF9zZWFyY2giLAotCQkJImJpdG1hcCBjb3JydXB0ZWQgb24gY2cgJXUsIHN0YXJ0ICV1LCBsZW5ndGggJXUsIGNvdW50ICV1LCBmcmVlb2ZmICV1XG4iLAotCQkJdWNwaS0+Y19jZ3gsIHN0YXJ0LCBsZW5ndGgsIGNvdW50LCB1Y3BpLT5jX2ZyZWVvZmYpOworCQlsb2MgPSB1Ymhfc2NhbmModXNwaSwgVUNQSV9VQkgodWNwaSksIHVjcGktPmNfZnJlZW9mZiwgbGVuZ3RoLAorCQkJCSh1c3BpLT5zX2ZwYiA9PSA4KSA/IHVmc19mcmFndGFibGVfOGZwYiA6CisJCQkJdWZzX2ZyYWd0YWJsZV9vdGhlciwKKwkJCQkxIDw8IChjb3VudCAtIDEgKyAodXNwaS0+c19mcGIgJiA3KSkpOworCQlpZiAobG9jID09IDApIHsKKwkJCXVmc19lcnJvcihzYiwgInVmc19iaXRtYXBfc2VhcmNoIiwKKwkJCQkgICJiaXRtYXAgY29ycnVwdGVkIG9uIGNnICV1LCBzdGFydCAldSwiCisJCQkJICAiIGxlbmd0aCAldSwgY291bnQgJXUsIGZyZWVvZmYgJXVcbiIsCisJCQkJICB1Y3BpLT5jX2NneCwgc3RhcnQsIGxlbmd0aCwgY291bnQsCisJCQkJICB1Y3BpLT5jX2ZyZWVvZmYpOwogCQkJcmV0dXJuICh1bnNpZ25lZCktMTsKIAkJfQogCQlzdGFydCA9IDA7CiAJfQotCXJlc3VsdCA9IChzdGFydCArIGxlbmd0aCAtIGxvY2F0aW9uKSA8PCAzOworCXJlc3VsdCA9IChzdGFydCArIGxlbmd0aCAtIGxvYykgPDwgMzsKIAl1Y3BpLT5jX2Zyb3RvciA9IHJlc3VsdDsKIAogCS8qCiAJICogZm91bmQgdGhlIGJ5dGUgaW4gdGhlIG1hcAogCSAqLwotCWJsb2NrbWFwID0gdWJoX2Jsa21hcChVQ1BJX1VCSCwgdWNwaS0+Y19mcmVlb2ZmLCByZXN1bHQpOwotCWZyYWdzaXplID0gMDsKLQlmb3IgKHBvc3NpdGlvbiA9IDAsIG1hc2sgPSAxOyBwb3NzaXRpb24gPCA4OyBwb3NzaXRpb24rKywgbWFzayA8PD0gMSkgewotCQlpZiAoYmxvY2ttYXAgJiBtYXNrKSB7Ci0JCQlpZiAoIShwb3NzaXRpb24gJiB1c3BpLT5zX2ZwYm1hc2spKQotCQkJCWZyYWdzaXplID0gMTsKLQkJCWVsc2UgCi0JCQkJZnJhZ3NpemUrKzsKLQkJfQotCQllbHNlIHsKLQkJCWlmIChmcmFnc2l6ZSA9PSBjb3VudCkgewotCQkJCXJlc3VsdCArPSBwb3NzaXRpb24gLSBjb3VudDsKLQkJCQlVRlNEKCgiRVhJVCwgcmVzdWx0ICV1XG4iLCByZXN1bHQpKQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlmcmFnc2l6ZSA9IDA7Ci0JCX0KLQl9Ci0JaWYgKGZyYWdzaXplID09IGNvdW50KSB7Ci0JCXJlc3VsdCArPSBwb3NzaXRpb24gLSBjb3VudDsKLQkJVUZTRCgoIkVYSVQsIHJlc3VsdCAldVxuIiwgcmVzdWx0KSkKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JdWZzX2Vycm9yIChzYiwgInVmc19iaXRtYXBfc2VhcmNoIiwgImJsb2NrIG5vdCBpbiBtYXAgb24gY2cgJXVcbiIsIHVjcGktPmNfY2d4KTsKLQlVRlNEKCgiRVhJVCAoRkFJTEVEKVxuIikpCisKKwlmb3IgKGVuZCA9IHJlc3VsdCArIDg7IHJlc3VsdCA8IGVuZDsgcmVzdWx0ICs9IHVzcGktPnNfZnBiKSB7CisJCWJsb2NrbWFwID0gdWJoX2Jsa21hcChVQ1BJX1VCSCh1Y3BpKSwgdWNwaS0+Y19mcmVlb2ZmLCByZXN1bHQpOworCQlibG9ja21hcCA8PD0gMTsKKwkJbWFzayA9IG1hc2tfYXJyW2NvdW50XTsKKwkJd2FudCA9IHdhbnRfYXJyW2NvdW50XTsKKwkJZm9yIChwb3MgPSAwOyBwb3MgPD0gdXNwaS0+c19mcGIgLSBjb3VudDsgcG9zKyspIHsKKwkJCWlmICgoYmxvY2ttYXAgJiBtYXNrKSA9PSB3YW50KSB7CisJCQkJVUZTRCgiRVhJVCwgcmVzdWx0ICV1XG4iLCByZXN1bHQpOworCQkJCXJldHVybiByZXN1bHQgKyBwb3M7CisgCQkJfQorCQkJbWFzayA8PD0gMTsKKwkJCXdhbnQgPDw9IDE7CisgCQl9CisgCX0KKworCXVmc19lcnJvcihzYiwgInVmc19iaXRtYXBfc2VhcmNoIiwgImJsb2NrIG5vdCBpbiBtYXAgb24gY2cgJXVcbiIsCisJCSAgdWNwaS0+Y19jZ3gpOworCVVGU0QoIkVYSVQgKEZBSUxFRClcbiIpOwogCXJldHVybiAodW5zaWduZWQpLTE7CiB9CiAKQEAgLTczNCw5ICs4MzgsOSBAQAogCQlyZXR1cm47CiAKIAlpZiAoY250ID4gMCkKLQkJdWJoX3NldGJpdChVQ1BJX1VCSCwgdWNwaS0+Y19jbHVzdGVyb2ZmLCBibGtubyk7CisJCXViaF9zZXRiaXQoVUNQSV9VQkgodWNwaSksIHVjcGktPmNfY2x1c3Rlcm9mZiwgYmxrbm8pOwogCWVsc2UKLQkJdWJoX2NscmJpdChVQ1BJX1VCSCwgdWNwaS0+Y19jbHVzdGVyb2ZmLCBibGtubyk7CisJCXViaF9jbHJiaXQoVUNQSV9VQkgodWNwaSksIHVjcGktPmNfY2x1c3Rlcm9mZiwgYmxrbm8pOwogCiAJLyoKIAkgKiBGaW5kIHRoZSBzaXplIG9mIHRoZSBjbHVzdGVyIGdvaW5nIGZvcndhcmQuCkBAIC03NDUsNyArODQ5LDcgQEAKIAllbmQgPSBzdGFydCArIHVzcGktPnNfY29udGlnc3Vtc2l6ZTsKIAlpZiAoIGVuZCA+PSB1Y3BpLT5jX25jbHVzdGVyYmxrcykKIAkJZW5kID0gdWNwaS0+Y19uY2x1c3RlcmJsa3M7Ci0JaSA9IHViaF9maW5kX25leHRfemVyb19iaXQgKFVDUElfVUJILCB1Y3BpLT5jX2NsdXN0ZXJvZmYsIGVuZCwgc3RhcnQpOworCWkgPSB1YmhfZmluZF9uZXh0X3plcm9fYml0IChVQ1BJX1VCSCh1Y3BpKSwgdWNwaS0+Y19jbHVzdGVyb2ZmLCBlbmQsIHN0YXJ0KTsKIAlpZiAoaSA+IGVuZCkKIAkJaSA9IGVuZDsKIAlmb3J3ID0gaSAtIHN0YXJ0OwpAQCAtNzU3LDcgKzg2MSw3IEBACiAJZW5kID0gc3RhcnQgLSB1c3BpLT5zX2NvbnRpZ3N1bXNpemU7CiAJaWYgKGVuZCA8IDAgKSAKIAkJZW5kID0gLTE7Ci0JaSA9IHViaF9maW5kX2xhc3RfemVyb19iaXQgKFVDUElfVUJILCB1Y3BpLT5jX2NsdXN0ZXJvZmYsIHN0YXJ0LCBlbmQpOworCWkgPSB1YmhfZmluZF9sYXN0X3plcm9fYml0IChVQ1BJX1VCSCh1Y3BpKSwgdWNwaS0+Y19jbHVzdGVyb2ZmLCBzdGFydCwgZW5kKTsKIAlpZiAoIGkgPCBlbmQpIAogCQlpID0gZW5kOwogCWJhY2sgPSBzdGFydCAtIGk7CkBAIC03NjksMTEgKzg3MywxMSBAQAogCWkgPSBiYWNrICsgZm9ydyArIDE7CiAJaWYgKGkgPiB1c3BpLT5zX2NvbnRpZ3N1bXNpemUpCiAJCWkgPSB1c3BpLT5zX2NvbnRpZ3N1bXNpemU7Ci0JZnMzMl9hZGQoc2IsIChfX2ZzMzIqKXViaF9nZXRfYWRkcihVQ1BJX1VCSCwgdWNwaS0+Y19jbHVzdGVyc3Vtb2ZmICsgKGkgPDwgMikpLCBjbnQpOworCWZzMzJfYWRkKHNiLCAoX19mczMyKil1YmhfZ2V0X2FkZHIoVUNQSV9VQkgodWNwaSksIHVjcGktPmNfY2x1c3RlcnN1bW9mZiArIChpIDw8IDIpKSwgY250KTsKIAlpZiAoYmFjayA+IDApCi0JCWZzMzJfc3ViKHNiLCAoX19mczMyKil1YmhfZ2V0X2FkZHIoVUNQSV9VQkgsIHVjcGktPmNfY2x1c3RlcnN1bW9mZiArIChiYWNrIDw8IDIpKSwgY250KTsKKwkJZnMzMl9zdWIoc2IsIChfX2ZzMzIqKXViaF9nZXRfYWRkcihVQ1BJX1VCSCh1Y3BpKSwgdWNwaS0+Y19jbHVzdGVyc3Vtb2ZmICsgKGJhY2sgPDwgMikpLCBjbnQpOwogCWlmIChmb3J3ID4gMCkKLQkJZnMzMl9zdWIoc2IsIChfX2ZzMzIqKXViaF9nZXRfYWRkcihVQ1BJX1VCSCwgdWNwaS0+Y19jbHVzdGVyc3Vtb2ZmICsgKGZvcncgPDwgMikpLCBjbnQpOworCQlmczMyX3N1YihzYiwgKF9fZnMzMiopdWJoX2dldF9hZGRyKFVDUElfVUJIKHVjcGkpLCB1Y3BpLT5jX2NsdXN0ZXJzdW1vZmYgKyAoZm9ydyA8PCAyKSksIGNudCk7CiB9CiAKIApkaWZmIC0tZ2l0IGEvZnMvdWZzL2N5bGluZGVyLmMgYi9mcy91ZnMvY3lsaW5kZXIuYwppbmRleCAxNGFiYjhiLi4wOWMzOWU1IDEwMDY0NAotLS0gYS9mcy91ZnMvY3lsaW5kZXIuYworKysgYi9mcy91ZnMvY3lsaW5kZXIuYwpAQCAtMjAsMTUgKzIwLDYgQEAKICNpbmNsdWRlICJzd2FiLmgiCiAjaW5jbHVkZSAidXRpbC5oIgogCi0jdW5kZWYgVUZTX0NZTElOREVSX0RFQlVHCi0KLSNpZmRlZiBVRlNfQ1lMSU5ERVJfREVCVUcKLSNkZWZpbmUgVUZTRCh4KSBwcmludGsoIiglcywgJWQpLCAlczoiLCBfX0ZJTEVfXywgX19MSU5FX18sIF9fRlVOQ1RJT05fXyk7IHByaW50ayB4OwotI2Vsc2UKLSNkZWZpbmUgVUZTRCh4KQotI2VuZGlmCi0KLQogLyoKICAqIFJlYWQgY3lsaW5kZXIgZ3JvdXAgaW50byBjYWNoZS4gVGhlIG1lbW9yeSBzcGFjZSBmb3IgdWZzX2NnX3ByaXZhdGVfaW5mbwogICogc3RydWN0dXJlIGlzIGFscmVhZHkgYWxsb2NhdGVkIGR1cmluZyB1ZnNfcmVhZF9zdXBlci4KQEAgLTQyLDE5ICszMywxOSBAQAogCXN0cnVjdCB1ZnNfY3lsaW5kZXJfZ3JvdXAgKiB1Y2c7CiAJdW5zaWduZWQgaSwgajsKIAotCVVGU0QoKCJFTlRFUiwgY2dubyAldSwgYml0bWFwX25yICV1XG4iLCBjZ25vLCBiaXRtYXBfbnIpKQorCVVGU0QoIkVOVEVSLCBjZ25vICV1LCBiaXRtYXBfbnIgJXVcbiIsIGNnbm8sIGJpdG1hcF9ucik7CiAJdXNwaSA9IHNiaS0+c191c3BpOwogCXVjcGkgPSBzYmktPnNfdWNwaVtiaXRtYXBfbnJdOwogCXVjZyA9IChzdHJ1Y3QgdWZzX2N5bGluZGVyX2dyb3VwICopc2JpLT5zX3VjZ1tjZ25vXS0+Yl9kYXRhOwogCi0JVUNQSV9VQkgtPmZyYWdtZW50ID0gdWZzX2NnY21pbihjZ25vKTsKLQlVQ1BJX1VCSC0+Y291bnQgPSB1c3BpLT5zX2Nnc2l6ZSA+PiBzYi0+c19ibG9ja3NpemVfYml0czsKKwlVQ1BJX1VCSCh1Y3BpKS0+ZnJhZ21lbnQgPSB1ZnNfY2djbWluKGNnbm8pOworCVVDUElfVUJIKHVjcGkpLT5jb3VudCA9IHVzcGktPnNfY2dzaXplID4+IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzOwogCS8qCiAJICogV2UgaGF2ZSBhbHJlYWR5IHRoZSBmaXJzdCBmcmFnbWVudCBvZiBjeWxpbmRlciBncm91cCBibG9jayBpbiBidWZmZXIKIAkgKi8KLQlVQ1BJX1VCSC0+YmhbMF0gPSBzYmktPnNfdWNnW2Nnbm9dOwotCWZvciAoaSA9IDE7IGkgPCBVQ1BJX1VCSC0+Y291bnQ7IGkrKykKLQkJaWYgKCEoVUNQSV9VQkgtPmJoW2ldID0gc2JfYnJlYWQoc2IsIFVDUElfVUJILT5mcmFnbWVudCArIGkpKSkKKwlVQ1BJX1VCSCh1Y3BpKS0+YmhbMF0gPSBzYmktPnNfdWNnW2Nnbm9dOworCWZvciAoaSA9IDE7IGkgPCBVQ1BJX1VCSCh1Y3BpKS0+Y291bnQ7IGkrKykKKwkJaWYgKCEoVUNQSV9VQkgodWNwaSktPmJoW2ldID0gc2JfYnJlYWQoc2IsIFVDUElfVUJIKHVjcGkpLT5mcmFnbWVudCArIGkpKSkKIAkJCWdvdG8gZmFpbGVkOwogCXNiaS0+c19jZ25vW2JpdG1hcF9ucl0gPSBjZ25vOwogCQkJCkBAIC03Myw3ICs2NCw3IEBACiAJdWNwaS0+Y19jbHVzdGVyc3Vtb2ZmID0gZnMzMl90b19jcHUoc2IsIHVjZy0+Y2dfdS5jZ180NC5jZ19jbHVzdGVyc3Vtb2ZmKTsKIAl1Y3BpLT5jX2NsdXN0ZXJvZmYgPSBmczMyX3RvX2NwdShzYiwgdWNnLT5jZ191LmNnXzQ0LmNnX2NsdXN0ZXJvZmYpOwogCXVjcGktPmNfbmNsdXN0ZXJibGtzID0gZnMzMl90b19jcHUoc2IsIHVjZy0+Y2dfdS5jZ180NC5jZ19uY2x1c3RlcmJsa3MpOwotCVVGU0QoKCJFWElUXG4iKSkKKwlVRlNEKCJFWElUXG4iKTsKIAlyZXR1cm47CQogCQogZmFpbGVkOgpAQCAtOTUsMTUgKzg2LDE1IEBACiAJc3RydWN0IHVmc19jeWxpbmRlcl9ncm91cCAqIHVjZzsKIAl1bnNpZ25lZCBpOwogCi0JVUZTRCgoIkVOVEVSLCBiaXRtYXBfbnIgJXVcbiIsIGJpdG1hcF9ucikpCisJVUZTRCgiRU5URVIsIGJpdG1hcF9uciAldVxuIiwgYml0bWFwX25yKTsKIAogCXVzcGkgPSBzYmktPnNfdXNwaTsKIAlpZiAoc2JpLT5zX2Nnbm9bYml0bWFwX25yXSA9PSBVRlNfQ0dOT19FTVBUWSkgewotCQlVRlNEKCgiRVhJVFxuIikpCisJCVVGU0QoIkVYSVRcbiIpOwogCQlyZXR1cm47CiAJfQogCXVjcGkgPSBzYmktPnNfdWNwaVtiaXRtYXBfbnJdOwotCXVjZyA9IHViaF9nZXRfdWNnKFVDUElfVUJIKTsKKwl1Y2cgPSB1YmhfZ2V0X3VjZyhVQ1BJX1VCSCh1Y3BpKSk7CiAKIAlpZiAodXNwaS0+c19uY2cgPiBVRlNfTUFYX0dST1VQX0xPQURFRCAmJiBiaXRtYXBfbnIgPj0gc2JpLT5zX2NnX2xvYWRlZCkgewogCQl1ZnNfcGFuaWMgKHNiLCAidWZzX3B1dF9jeWxpbmRlciIsICJpbnRlcm5hbCBlcnJvciIpOwpAQCAtMTE2LDEzICsxMDcsMTMgQEAKIAl1Y2ctPmNnX3JvdG9yID0gY3B1X3RvX2ZzMzIoc2IsIHVjcGktPmNfcm90b3IpOwogCXVjZy0+Y2dfZnJvdG9yID0gY3B1X3RvX2ZzMzIoc2IsIHVjcGktPmNfZnJvdG9yKTsKIAl1Y2ctPmNnX2lyb3RvciA9IGNwdV90b19mczMyKHNiLCB1Y3BpLT5jX2lyb3Rvcik7Ci0JdWJoX21hcmtfYnVmZmVyX2RpcnR5IChVQ1BJX1VCSCk7Ci0JZm9yIChpID0gMTsgaSA8IFVDUElfVUJILT5jb3VudDsgaSsrKSB7Ci0JCWJyZWxzZSAoVUNQSV9VQkgtPmJoW2ldKTsKKwl1YmhfbWFya19idWZmZXJfZGlydHkgKFVDUElfVUJIKHVjcGkpKTsKKwlmb3IgKGkgPSAxOyBpIDwgVUNQSV9VQkgodWNwaSktPmNvdW50OyBpKyspIHsKKwkJYnJlbHNlIChVQ1BJX1VCSCh1Y3BpKS0+YmhbaV0pOwogCX0KIAogCXNiaS0+c19jZ25vW2JpdG1hcF9ucl0gPSBVRlNfQ0dOT19FTVBUWTsKLQlVRlNEKCgiRVhJVFxuIikpCisJVUZTRCgiRVhJVFxuIik7CiB9CiAKIC8qCkBAIC0xMzksNyArMTMwLDcgQEAKIAlzdHJ1Y3QgdWZzX2NnX3ByaXZhdGVfaW5mbyAqIHVjcGk7CiAJdW5zaWduZWQgY2csIGksIGo7CiAKLQlVRlNEKCgiRU5URVIsIGNnbm8gJXVcbiIsIGNnbm8pKQorCVVGU0QoIkVOVEVSLCBjZ25vICV1XG4iLCBjZ25vKTsKIAogCXVzcGkgPSBzYmktPnNfdXNwaTsKIAlpZiAoY2dubyA+PSB1c3BpLT5zX25jZykgewpAQCAtMTUwLDcgKzE0MSw3IEBACiAJICogQ3lsaW5kZXIgZ3JvdXAgbnVtYmVyIGNnIGl0IGluIGNhY2hlIGFuZCBpdCB3YXMgbGFzdCB1c2VkCiAJICovCiAJaWYgKHNiaS0+c19jZ25vWzBdID09IGNnbm8pIHsKLQkJVUZTRCgoIkVYSVRcbiIpKQorCQlVRlNEKCJFWElUXG4iKTsKIAkJcmV0dXJuIHNiaS0+c191Y3BpWzBdOwogCX0KIAkvKgpAQCAtMTYwLDE2ICsxNTEsMTYgQEAKIAkJaWYgKHNiaS0+c19jZ25vW2Nnbm9dICE9IFVGU19DR05PX0VNUFRZKSB7CiAJCQlpZiAoc2JpLT5zX2Nnbm9bY2dub10gIT0gY2dubykgewogCQkJCXVmc19wYW5pYyAoc2IsICJ1ZnNfbG9hZF9jeWxpbmRlciIsICJpbnRlcm5hbCBlcnJvciwgd3JvbmcgbnVtYmVyIG9mIGNnIGluIGNhY2hlIik7Ci0JCQkJVUZTRCgoIkVYSVQgKEZBSUxFRClcbiIpKQorCQkJCVVGU0QoIkVYSVQgKEZBSUxFRClcbiIpOwogCQkJCXJldHVybiBOVUxMOwogCQkJfQogCQkJZWxzZSB7Ci0JCQkJVUZTRCgoIkVYSVRcbiIpKQorCQkJCVVGU0QoIkVYSVRcbiIpOwogCQkJCXJldHVybiBzYmktPnNfdWNwaVtjZ25vXTsKIAkJCX0KIAkJfSBlbHNlIHsKIAkJCXVmc19yZWFkX2N5bGluZGVyIChzYiwgY2dubywgY2dubyk7Ci0JCQlVRlNEKCgiRVhJVFxuIikpCisJCQlVRlNEKCJFWElUXG4iKTsKIAkJCXJldHVybiBzYmktPnNfdWNwaVtjZ25vXTsKIAkJfQogCX0KQEAgLTIwNCw2ICsxOTUsNiBAQAogCQlzYmktPnNfdWNwaVswXSA9IHVjcGk7CiAJCXVmc19yZWFkX2N5bGluZGVyIChzYiwgY2dubywgMCk7CiAJfQotCVVGU0QoKCJFWElUXG4iKSkKKwlVRlNEKCJFWElUXG4iKTsKIAlyZXR1cm4gc2JpLT5zX3VjcGlbMF07CiB9CmRpZmYgLS1naXQgYS9mcy91ZnMvZGlyLmMgYi9mcy91ZnMvZGlyLmMKaW5kZXggMWE1NjEyMC4uN2YwYTBhYSAxMDA2NDQKLS0tIGEvZnMvdWZzL2Rpci5jCisrKyBiL2ZzL3Vmcy9kaXIuYwpAQCAtMTEsMzEgKzExLDIwIEBACiAgKiA0LjRCU0QgKEZyZWVCU0QpIHN1cHBvcnQgYWRkZWQgb24gRmVicnVhcnkgMXN0IDE5OTggYnkKICAqIE5pZWxzIEtyaXN0aWFuIEJlY2ggSmVuc2VuIDxua2JqQGltYWdlLmRrPiBwYXJ0aWFsbHkgYmFzZWQKICAqIG9uIGNvZGUgYnkgTWFydGluIHZvbiBMb2V3aXMgPG1hcnRpbkBtaXJhLmlzZG4uY3MudHUtYmVybGluLmRlPi4KKyAqCisgKiBNaWdyYXRpb24gdG8gdXNhZ2Ugb2YgInBhZ2UgY2FjaGUiIG9uIE1heSAyMDA2IGJ5CisgKiBFdmdlbml5IER1c2hpc3RvdiA8ZHVzaGlzdG92QG1haWwucnU+IGJhc2VkIG9uIGV4dDIgY29kZSBiYXNlLgogICovCiAKICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC91ZnNfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KIAogI2luY2x1ZGUgInN3YWIuaCIKICNpbmNsdWRlICJ1dGlsLmgiCiAKLSN1bmRlZiBVRlNfRElSX0RFQlVHCi0KLSNpZmRlZiBVRlNfRElSX0RFQlVHCi0jZGVmaW5lIFVGU0QoeCkgcHJpbnRrKCIoJXMsICVkKSwgJXM6ICIsIF9fRklMRV9fLCBfX0xJTkVfXywgX19GVU5DVElPTl9fKTsgcHJpbnRrIHg7Ci0jZWxzZQotI2RlZmluZSBVRlNEKHgpCi0jZW5kaWYKLQotc3RhdGljIGludAotdWZzX2NoZWNrX2Rpcl9lbnRyeSAoY29uc3QgY2hhciAqLCBzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IHVmc19kaXJfZW50cnkgKiwKLQkJICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiwgdW5zaWduZWQgbG9uZyk7Ci0KLQogLyoKICAqIE5PVEUhIHVubGlrZSBzdHJuY21wLCB1ZnNfbWF0Y2ggcmV0dXJucyAxIGZvciBzdWNjZXNzLCAwIGZvciBmYWlsdXJlLgogICoKQEAgLTUxLDQ5NSArNDAsNTQxIEBACiAJcmV0dXJuICFtZW1jbXAobmFtZSwgZGUtPmRfbmFtZSwgbGVuKTsKIH0KIAotLyoKLSAqIFRoaXMgaXMgYmxhdGFudGx5IHN0b2xlbiBmcm9tIGV4dDJmcwotICovCi1zdGF0aWMgaW50Ci11ZnNfcmVhZGRpciAoc3RydWN0IGZpbGUgKiBmaWxwLCB2b2lkICogZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpcikKK3N0YXRpYyBpbnQgdWZzX2NvbW1pdF9jaHVuayhzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8pCiB7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOwotCWludCBlcnJvciA9IDA7Ci0JdW5zaWduZWQgbG9uZyBvZmZzZXQsIGxibGs7Ci0JaW50IGksIHN0b3JlZDsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaDsKLQlzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqIGRlOwotCXN0cnVjdCBzdXBlcl9ibG9jayAqIHNiOwotCWludCBkZV9yZWNsZW47Ci0JdW5zaWduZWQgZmxhZ3M7Ci0JdTY0ICAgICBibGs9IDBMOworCXN0cnVjdCBpbm9kZSAqZGlyID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwlpbnQgZXJyID0gMDsKKwlkaXItPmlfdmVyc2lvbisrOworCXBhZ2UtPm1hcHBpbmctPmFfb3BzLT5jb21taXRfd3JpdGUoTlVMTCwgcGFnZSwgZnJvbSwgdG8pOworCWlmIChJU19ESVJTWU5DKGRpcikpCisJCWVyciA9IHdyaXRlX29uZV9wYWdlKHBhZ2UsIDEpOworCWVsc2UKKwkJdW5sb2NrX3BhZ2UocGFnZSk7CisJcmV0dXJuIGVycjsKK30KIAotCWxvY2tfa2VybmVsKCk7CitzdGF0aWMgaW5saW5lIHZvaWQgdWZzX3B1dF9wYWdlKHN0cnVjdCBwYWdlICpwYWdlKQoreworCWt1bm1hcChwYWdlKTsKKwlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7Cit9CiAKLQlzYiA9IGlub2RlLT5pX3NiOwotCWZsYWdzID0gVUZTX1NCKHNiKS0+c19mbGFnczsKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyB1ZnNfZGlyX3BhZ2VzKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJcmV0dXJuIChpbm9kZS0+aV9zaXplK1BBR0VfQ0FDSEVfU0laRS0xKT4+UEFHRV9DQUNIRV9TSElGVDsKK30KIAotCVVGU0QoKCJFTlRFUiwgaW5vICVsdSAgZl9wb3MgJWx1XG4iLCBpbm9kZS0+aV9pbm8sICh1bnNpZ25lZCBsb25nKSBmaWxwLT5mX3BvcykpCi0KLQlzdG9yZWQgPSAwOwotCWJoID0gTlVMTDsKLQlvZmZzZXQgPSBmaWxwLT5mX3BvcyAmIChzYi0+c19ibG9ja3NpemUgLSAxKTsKLQotCXdoaWxlICghZXJyb3IgJiYgIXN0b3JlZCAmJiBmaWxwLT5mX3BvcyA8IGlub2RlLT5pX3NpemUpIHsKLQkJbGJsayA9IChmaWxwLT5mX3BvcykgPj4gc2ItPnNfYmxvY2tzaXplX2JpdHM7Ci0JCWJsayA9IHVmc19mcmFnX21hcChpbm9kZSwgbGJsayk7Ci0JCWlmICghYmxrIHx8ICEoYmggPSBzYl9icmVhZChzYiwgYmxrKSkpIHsKLQkJCS8qIFhYWCAtIGVycm9yIC0gc2tpcCB0byB0aGUgbmV4dCBibG9jayAqLwotCQkJcHJpbnRrKCJ1ZnNfcmVhZGRpcjogIgotCQkJICAgICAgICJkaXIgaW5vZGUgJWx1IGhhcyBhIGhvbGUgYXQgb2Zmc2V0ICVsdVxuIiwKLQkJCSAgICAgICBpbm9kZS0+aV9pbm8sICh1bnNpZ25lZCBsb25nIGludClmaWxwLT5mX3Bvcyk7Ci0JCQlmaWxwLT5mX3BvcyArPSBzYi0+c19ibG9ja3NpemUgLSBvZmZzZXQ7Ci0JCQljb250aW51ZTsKLQkJfQotCi1yZXZhbGlkYXRlOgotCQkvKiBJZiB0aGUgZGlyIGJsb2NrIGhhcyBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0IGNhbGwgdG8KLQkJICogcmVhZGRpcigyKSwgdGhlbiB3ZSBtaWdodCBiZSBwb2ludGluZyB0byBhbiBpbnZhbGlkCi0JCSAqIGRpcmVudCByaWdodCBub3cuICBTY2FuIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBibG9jawotCQkgKiB0byBtYWtlIHN1cmUuICovCi0JCWlmIChmaWxwLT5mX3ZlcnNpb24gIT0gaW5vZGUtPmlfdmVyc2lvbikgewotCQkJZm9yIChpID0gMDsgaSA8IHNiLT5zX2Jsb2Nrc2l6ZSAmJiBpIDwgb2Zmc2V0OyApIHsKLQkJCQlkZSA9IChzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqKShiaC0+Yl9kYXRhICsgaSk7Ci0JCQkJLyogSXQncyB0b28gZXhwZW5zaXZlIHRvIGRvIGEgZnVsbAotCQkJCSAqIGRpcmVudCB0ZXN0IGVhY2ggdGltZSByb3VuZCB0aGlzCi0JCQkJICogbG9vcCwgYnV0IHdlIGRvIGhhdmUgdG8gdGVzdCBhdAotCQkJCSAqIGxlYXN0IHRoYXQgaXQgaXMgbm9uLXplcm8uICBBCi0JCQkJICogZmFpbHVyZSB3aWxsIGJlIGRldGVjdGVkIGluIHRoZQotCQkJCSAqIGRpcmVudCB0ZXN0IGJlbG93LiAqLwotCQkJCWRlX3JlY2xlbiA9IGZzMTZfdG9fY3B1KHNiLCBkZS0+ZF9yZWNsZW4pOwotCQkJCWlmIChkZV9yZWNsZW4gPCAxKQotCQkJCQlicmVhazsKLQkJCQlpICs9IGRlX3JlY2xlbjsKLQkJCX0KLQkJCW9mZnNldCA9IGk7Ci0JCQlmaWxwLT5mX3BvcyA9IChmaWxwLT5mX3BvcyAmIH4oc2ItPnNfYmxvY2tzaXplIC0gMSkpCi0JCQkJfCBvZmZzZXQ7Ci0JCQlmaWxwLT5mX3ZlcnNpb24gPSBpbm9kZS0+aV92ZXJzaW9uOwotCQl9Ci0KLQkJd2hpbGUgKCFlcnJvciAmJiBmaWxwLT5mX3BvcyA8IGlub2RlLT5pX3NpemUKLQkJICAgICAgICYmIG9mZnNldCA8IHNiLT5zX2Jsb2Nrc2l6ZSkgewotCQkJZGUgPSAoc3RydWN0IHVmc19kaXJfZW50cnkgKikgKGJoLT5iX2RhdGEgKyBvZmZzZXQpOwotCQkJLyogWFhYIC0gcHV0IGluIGEgcmVhbCB1ZnNfY2hlY2tfZGlyX2VudHJ5KCkgKi8KLQkJCWlmICgoZGUtPmRfcmVjbGVuID09IDApIHx8ICh1ZnNfZ2V0X2RlX25hbWxlbihzYiwgZGUpID09IDApKSB7Ci0JCQkJZmlscC0+Zl9wb3MgPSAoZmlscC0+Zl9wb3MgJgotCQkJCSAgICAgICAgICAgICAgKHNiLT5zX2Jsb2Nrc2l6ZSAtIDEpKSArCi0JCQkJICAgICAgICAgICAgICAgc2ItPnNfYmxvY2tzaXplOwotCQkJCWJyZWxzZShiaCk7Ci0JCQkJdW5sb2NrX2tlcm5lbCgpOwotCQkJCXJldHVybiBzdG9yZWQ7Ci0JCQl9Ci0JCQlpZiAoIXVmc19jaGVja19kaXJfZW50cnkgKCJ1ZnNfcmVhZGRpciIsIGlub2RlLCBkZSwKLQkJCQkJCSAgIGJoLCBvZmZzZXQpKSB7Ci0JCQkJLyogT24gZXJyb3IsIHNraXAgdGhlIGZfcG9zIHRvIHRoZQotCQkJCSAgIG5leHQgYmxvY2suICovCi0JCQkJZmlscC0+Zl9wb3MgPSAoZmlscC0+Zl9wb3MgfAotCQkJCSAgICAgICAgICAgICAgKHNiLT5zX2Jsb2Nrc2l6ZSAtIDEpKSArCi0JCQkJCSAgICAgICAxOwotCQkJCWJyZWxzZSAoYmgpOwotCQkJCXVubG9ja19rZXJuZWwoKTsKLQkJCQlyZXR1cm4gc3RvcmVkOwotCQkJfQotCQkJb2Zmc2V0ICs9IGZzMTZfdG9fY3B1KHNiLCBkZS0+ZF9yZWNsZW4pOwotCQkJaWYgKGRlLT5kX2lubykgewotCQkJCS8qIFdlIG1pZ2h0IGJsb2NrIGluIHRoZSBuZXh0IHNlY3Rpb24KLQkJCQkgKiBpZiB0aGUgZGF0YSBkZXN0aW5hdGlvbiBpcwotCQkJCSAqIGN1cnJlbnRseSBzd2FwcGVkIG91dC4gIFNvLCB1c2UgYQotCQkJCSAqIHZlcnNpb24gc3RhbXAgdG8gZGV0ZWN0IHdoZXRoZXIgb3IKLQkJCQkgKiBub3QgdGhlIGRpcmVjdG9yeSBoYXMgYmVlbiBtb2RpZmllZAotCQkJCSAqIGR1cmluZyB0aGUgY29weSBvcGVyYXRpb24uICovCi0JCQkJdW5zaWduZWQgbG9uZyB2ZXJzaW9uID0gZmlscC0+Zl92ZXJzaW9uOwotCQkJCXVuc2lnbmVkIGNoYXIgZF90eXBlID0gRFRfVU5LTk9XTjsKLQotCQkJCVVGU0QoKCJmaWxsZGlyKCVzLCV1KVxuIiwgZGUtPmRfbmFtZSwKLQkJCQkJCQlmczMyX3RvX2NwdShzYiwgZGUtPmRfaW5vKSkpCi0JCQkJVUZTRCgoIm5hbWxlbiAldVxuIiwgdWZzX2dldF9kZV9uYW1sZW4oc2IsIGRlKSkpCi0KLQkJCQlpZiAoKGZsYWdzICYgVUZTX0RFX01BU0spID09IFVGU19ERV80NEJTRCkKLQkJCQkJZF90eXBlID0gZGUtPmRfdS5kXzQ0LmRfdHlwZTsKLQkJCQllcnJvciA9IGZpbGxkaXIoZGlyZW50LCBkZS0+ZF9uYW1lLAotCQkJCQkJdWZzX2dldF9kZV9uYW1sZW4oc2IsIGRlKSwgZmlscC0+Zl9wb3MsCi0JCQkJCQlmczMyX3RvX2NwdShzYiwgZGUtPmRfaW5vKSwgZF90eXBlKTsKLQkJCQlpZiAoZXJyb3IpCi0JCQkJCWJyZWFrOwotCQkJCWlmICh2ZXJzaW9uICE9IGZpbHAtPmZfdmVyc2lvbikKLQkJCQkJZ290byByZXZhbGlkYXRlOwotCQkJCXN0b3JlZCArKzsKLQkJCX0KLQkJCWZpbHAtPmZfcG9zICs9IGZzMTZfdG9fY3B1KHNiLCBkZS0+ZF9yZWNsZW4pOwotCQl9Ci0JCW9mZnNldCA9IDA7Ci0JCWJyZWxzZSAoYmgpOworaW5vX3QgdWZzX2lub2RlX2J5X25hbWUoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlpbm9fdCByZXMgPSAwOworCXN0cnVjdCB1ZnNfZGlyX2VudHJ5ICpkZTsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwkKKwlkZSA9IHVmc19maW5kX2VudHJ5KGRpciwgZGVudHJ5LCAmcGFnZSk7CisJaWYgKGRlKSB7CisJCXJlcyA9IGZzMzJfdG9fY3B1KGRpci0+aV9zYiwgZGUtPmRfaW5vKTsKKwkJdWZzX3B1dF9wYWdlKHBhZ2UpOwogCX0KLQl1bmxvY2tfa2VybmVsKCk7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIHJlczsKK30KKworCisvKiBSZWxlYXNlcyB0aGUgcGFnZSAqLwordm9pZCB1ZnNfc2V0X2xpbmsoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCB1ZnNfZGlyX2VudHJ5ICpkZSwKKwkJICBzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwl1bnNpZ25lZCBmcm9tID0gKGNoYXIgKikgZGUgLSAoY2hhciAqKSBwYWdlX2FkZHJlc3MocGFnZSk7CisJdW5zaWduZWQgdG8gPSBmcm9tICsgZnMxNl90b19jcHUoZGlyLT5pX3NiLCBkZS0+ZF9yZWNsZW4pOworCWludCBlcnI7CisKKwlsb2NrX3BhZ2UocGFnZSk7CisJZXJyID0gcGFnZS0+bWFwcGluZy0+YV9vcHMtPnByZXBhcmVfd3JpdGUoTlVMTCwgcGFnZSwgZnJvbSwgdG8pOworCUJVR19PTihlcnIpOworCWRlLT5kX2lubyA9IGNwdV90b19mczMyKGRpci0+aV9zYiwgaW5vZGUtPmlfaW5vKTsKKwl1ZnNfc2V0X2RlX3R5cGUoZGlyLT5pX3NiLCBkZSwgaW5vZGUtPmlfbW9kZSk7CisJZXJyID0gdWZzX2NvbW1pdF9jaHVuayhwYWdlLCBmcm9tLCB0byk7CisJdWZzX3B1dF9wYWdlKHBhZ2UpOworCWRpci0+aV9tdGltZSA9IGRpci0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJbWFya19pbm9kZV9kaXJ0eShkaXIpOworfQorCisKK3N0YXRpYyB2b2lkIHVmc19jaGVja19wYWdlKHN0cnVjdCBwYWdlICpwYWdlKQoreworCXN0cnVjdCBpbm9kZSAqZGlyID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZGlyLT5pX3NiOworCWNoYXIgKmthZGRyID0gcGFnZV9hZGRyZXNzKHBhZ2UpOworCXVuc2lnbmVkIG9mZnMsIHJlY19sZW47CisJdW5zaWduZWQgbGltaXQgPSBQQUdFX0NBQ0hFX1NJWkU7CisJc3RydWN0IHVmc19kaXJfZW50cnkgKnA7CisJY2hhciAqZXJyb3I7CisKKwlpZiAoKGRpci0+aV9zaXplID4+IFBBR0VfQ0FDSEVfU0hJRlQpID09IHBhZ2UtPmluZGV4KSB7CisJCWxpbWl0ID0gZGlyLT5pX3NpemUgJiB+UEFHRV9DQUNIRV9NQVNLOworCQlpZiAobGltaXQgJiAoVUZTX1NFQ1RPUl9TSVpFIC0gMSkpCisJCQlnb3RvIEViYWRzaXplOworCQlpZiAoIWxpbWl0KQorCQkJZ290byBvdXQ7CisJfQorCWZvciAob2ZmcyA9IDA7IG9mZnMgPD0gbGltaXQgLSBVRlNfRElSX1JFQ19MRU4oMSk7IG9mZnMgKz0gcmVjX2xlbikgeworCQlwID0gKHN0cnVjdCB1ZnNfZGlyX2VudHJ5ICopKGthZGRyICsgb2Zmcyk7CisJCXJlY19sZW4gPSBmczE2X3RvX2NwdShzYiwgcC0+ZF9yZWNsZW4pOworCisJCWlmIChyZWNfbGVuIDwgVUZTX0RJUl9SRUNfTEVOKDEpKQorCQkJZ290byBFc2hvcnQ7CisJCWlmIChyZWNfbGVuICYgMykKKwkJCWdvdG8gRWFsaWduOworCQlpZiAocmVjX2xlbiA8IFVGU19ESVJfUkVDX0xFTih1ZnNfZ2V0X2RlX25hbWxlbihzYiwgcCkpKQorCQkJZ290byBFbmFtZWxlbjsKKwkJaWYgKCgob2ZmcyArIHJlY19sZW4gLSAxKSBeIG9mZnMpICYgfihVRlNfU0VDVE9SX1NJWkUtMSkpCisJCQlnb3RvIEVzcGFuOworCQlpZiAoZnMzMl90b19jcHUoc2IsIHAtPmRfaW5vKSA+IChVRlNfU0Ioc2IpLT5zX3VzcGktPnNfaXBnICoKKwkJCQkJCSAgVUZTX1NCKHNiKS0+c191c3BpLT5zX25jZykpCisJCQlnb3RvIEVpbnVtYmVyOworCX0KKwlpZiAob2ZmcyAhPSBsaW1pdCkKKwkJZ290byBFZW5kOworb3V0OgorCVNldFBhZ2VDaGVja2VkKHBhZ2UpOworCXJldHVybjsKKworCS8qIFRvbyBiYWQsIHdlIGhhZCBhbiBlcnJvciAqLworCitFYmFkc2l6ZToKKwl1ZnNfZXJyb3Ioc2IsICJ1ZnNfY2hlY2tfcGFnZSIsCisJCSAgInNpemUgb2YgZGlyZWN0b3J5ICMlbHUgaXMgbm90IGEgbXVsdGlwbGUgb2YgY2h1bmsgc2l6ZSIsCisJCSAgZGlyLT5pX2lubworCSk7CisJZ290byBmYWlsOworRXNob3J0OgorCWVycm9yID0gInJlY19sZW4gaXMgc21hbGxlciB0aGFuIG1pbmltYWwiOworCWdvdG8gYmFkX2VudHJ5OworRWFsaWduOgorCWVycm9yID0gInVuYWxpZ25lZCBkaXJlY3RvcnkgZW50cnkiOworCWdvdG8gYmFkX2VudHJ5OworRW5hbWVsZW46CisJZXJyb3IgPSAicmVjX2xlbiBpcyB0b28gc21hbGwgZm9yIG5hbWVfbGVuIjsKKwlnb3RvIGJhZF9lbnRyeTsKK0VzcGFuOgorCWVycm9yID0gImRpcmVjdG9yeSBlbnRyeSBhY3Jvc3MgYmxvY2tzIjsKKwlnb3RvIGJhZF9lbnRyeTsKK0VpbnVtYmVyOgorCWVycm9yID0gImlub2RlIG91dCBvZiBib3VuZHMiOworYmFkX2VudHJ5OgorCXVmc19lcnJvciAoc2IsICJ1ZnNfY2hlY2tfcGFnZSIsICJiYWQgZW50cnkgaW4gZGlyZWN0b3J5ICMlbHU6ICVzIC0gIgorCQkgICAib2Zmc2V0PSVsdSwgcmVjX2xlbj0lZCwgbmFtZV9sZW49JWQiLAorCQkgICBkaXItPmlfaW5vLCBlcnJvciwgKHBhZ2UtPmluZGV4PDxQQUdFX0NBQ0hFX1NISUZUKStvZmZzLAorCQkgICByZWNfbGVuLCB1ZnNfZ2V0X2RlX25hbWxlbihzYiwgcCkpOworCWdvdG8gZmFpbDsKK0VlbmQ6CisJcCA9IChzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqKShrYWRkciArIG9mZnMpOworCXVmc19lcnJvciAoc2IsICJleHQyX2NoZWNrX3BhZ2UiLAorCQkgICAiZW50cnkgaW4gZGlyZWN0b3J5ICMlbHUgc3BhbnMgdGhlIHBhZ2UgYm91bmRhcnkiCisJCSAgICJvZmZzZXQ9JWx1IiwKKwkJICAgZGlyLT5pX2lubywgKHBhZ2UtPmluZGV4PDxQQUdFX0NBQ0hFX1NISUZUKStvZmZzKTsKK2ZhaWw6CisJU2V0UGFnZUNoZWNrZWQocGFnZSk7CisJU2V0UGFnZUVycm9yKHBhZ2UpOworfQorCitzdGF0aWMgc3RydWN0IHBhZ2UgKnVmc19nZXRfcGFnZShzdHJ1Y3QgaW5vZGUgKmRpciwgdW5zaWduZWQgbG9uZyBuKQoreworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gZGlyLT5pX21hcHBpbmc7CisJc3RydWN0IHBhZ2UgKnBhZ2UgPSByZWFkX2NhY2hlX3BhZ2UobWFwcGluZywgbiwKKwkJCQkoZmlsbGVyX3QqKW1hcHBpbmctPmFfb3BzLT5yZWFkcGFnZSwgTlVMTCk7CisJaWYgKCFJU19FUlIocGFnZSkpIHsKKwkJd2FpdF9vbl9wYWdlX2xvY2tlZChwYWdlKTsKKwkJa21hcChwYWdlKTsKKwkJaWYgKCFQYWdlVXB0b2RhdGUocGFnZSkpCisJCQlnb3RvIGZhaWw7CisJCWlmICghUGFnZUNoZWNrZWQocGFnZSkpCisJCQl1ZnNfY2hlY2tfcGFnZShwYWdlKTsKKwkJaWYgKFBhZ2VFcnJvcihwYWdlKSkKKwkJCWdvdG8gZmFpbDsKKwl9CisJcmV0dXJuIHBhZ2U7CisKK2ZhaWw6CisJdWZzX3B1dF9wYWdlKHBhZ2UpOworCXJldHVybiBFUlJfUFRSKC1FSU8pOwogfQogCiAvKgotICogZGVmaW5lIGhvdyBmYXIgYWhlYWQgdG8gcmVhZCBkaXJlY3RvcmllcyB3aGlsZSBzZWFyY2hpbmcgdGhlbS4KKyAqIFJldHVybiB0aGUgb2Zmc2V0IGludG8gcGFnZSBgcGFnZV9ucicgb2YgdGhlIGxhc3QgdmFsaWQKKyAqIGJ5dGUgaW4gdGhhdCBwYWdlLCBwbHVzIG9uZS4KICAqLwotI2RlZmluZSBOQU1FSV9SQV9DSFVOS1MgIDIKLSNkZWZpbmUgTkFNRUlfUkFfQkxPQ0tTICA0Ci0jZGVmaW5lIE5BTUVJX1JBX1NJWkUgICAgICAgIChOQU1FSV9SQV9DSFVOS1MgKiBOQU1FSV9SQV9CTE9DS1MpCi0jZGVmaW5lIE5BTUVJX1JBX0lOREVYKGMsYikgICgoKGMpICogTkFNRUlfUkFfQkxPQ0tTKSArIChiKSkKK3N0YXRpYyB1bnNpZ25lZAordWZzX2xhc3RfYnl0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1bnNpZ25lZCBsb25nIHBhZ2VfbnIpCit7CisJdW5zaWduZWQgbGFzdF9ieXRlID0gaW5vZGUtPmlfc2l6ZTsKKworCWxhc3RfYnl0ZSAtPSBwYWdlX25yIDw8IFBBR0VfQ0FDSEVfU0hJRlQ7CisJaWYgKGxhc3RfYnl0ZSA+IFBBR0VfQ0FDSEVfU0laRSkKKwkJbGFzdF9ieXRlID0gUEFHRV9DQUNIRV9TSVpFOworCXJldHVybiBsYXN0X2J5dGU7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHVmc19kaXJfZW50cnkgKgordWZzX25leHRfZW50cnkoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IHVmc19kaXJfZW50cnkgKnApCit7CisJcmV0dXJuIChzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqKSgoY2hhciAqKXAgKworCQkJCQlmczE2X3RvX2NwdShzYiwgcC0+ZF9yZWNsZW4pKTsKK30KKworc3RydWN0IHVmc19kaXJfZW50cnkgKnVmc19kb3Rkb3Qoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBwYWdlICoqcCkKK3sKKwlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHVmc19nZXRfcGFnZShkaXIsIDApOworCXN0cnVjdCB1ZnNfZGlyX2VudHJ5ICpkZSA9IE5VTEw7CisKKwlpZiAoIUlTX0VSUihwYWdlKSkgeworCQlkZSA9IHVmc19uZXh0X2VudHJ5KGRpci0+aV9zYiwKKwkJCQkgICAgKHN0cnVjdCB1ZnNfZGlyX2VudHJ5ICopcGFnZV9hZGRyZXNzKHBhZ2UpKTsKKwkJKnAgPSBwYWdlOworCX0KKwlyZXR1cm4gZGU7Cit9CiAKIC8qCiAgKgl1ZnNfZmluZF9lbnRyeSgpCiAgKgogICogZmluZHMgYW4gZW50cnkgaW4gdGhlIHNwZWNpZmllZCBkaXJlY3Rvcnkgd2l0aCB0aGUgd2FudGVkIG5hbWUuIEl0Ci0gKiByZXR1cm5zIHRoZSBjYWNoZSBidWZmZXIgaW4gd2hpY2ggdGhlIGVudHJ5IHdhcyBmb3VuZCwgYW5kIHRoZSBlbnRyeQotICogaXRzZWxmIChhcyBhIHBhcmFtZXRlciAtIHJlc19iaCkuIEl0IGRvZXMgTk9UIHJlYWQgdGhlIGlub2RlIG9mIHRoZQotICogZW50cnkgLSB5b3UnbGwgaGF2ZSB0byBkbyB0aGF0IHlvdXJzZWxmIGlmIHlvdSB3YW50IHRvLgorICogcmV0dXJucyB0aGUgcGFnZSBpbiB3aGljaCB0aGUgZW50cnkgd2FzIGZvdW5kLCBhbmQgdGhlIGVudHJ5IGl0c2VsZgorICogKGFzIGEgcGFyYW1ldGVyIC0gcmVzX2RpcikuIFBhZ2UgaXMgcmV0dXJuZWQgbWFwcGVkIGFuZCB1bmxvY2tlZC4KKyAqIEVudHJ5IGlzIGd1YXJhbnRlZWQgdG8gYmUgdmFsaWQuCiAgKi8KLXN0cnVjdCB1ZnNfZGlyX2VudHJ5ICogdWZzX2ZpbmRfZW50cnkgKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiogcmVzX2JoKQotewotCXN0cnVjdCBzdXBlcl9ibG9jayAqIHNiOwotCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoX3VzZVtOQU1FSV9SQV9TSVpFXTsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaF9yZWFkW05BTUVJX1JBX1NJWkVdOwotCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwotCWludCBibG9jaywgdG9yZWFkLCBpLCBlcnI7Ci0Jc3RydWN0IGlub2RlICpkaXIgPSBkZW50cnktPmRfcGFyZW50LT5kX2lub2RlOwotCWNvbnN0IGNoYXIgKm5hbWUgPSBkZW50cnktPmRfbmFtZS5uYW1lOwotCWludCBuYW1lbGVuID0gZGVudHJ5LT5kX25hbWUubGVuOwotCi0JVUZTRCgoIkVOVEVSLCBkaXJfaW5vICVsdSwgbmFtZSAlcywgbmFtbGVuICV1XG4iLCBkaXItPmlfaW5vLCBuYW1lLCBuYW1lbGVuKSkKLQkKLQkqcmVzX2JoID0gTlVMTDsKLQkKLQlzYiA9IGRpci0+aV9zYjsKLQkKLQlpZiAobmFtZWxlbiA+IFVGU19NQVhOQU1MRU4pCi0JCXJldHVybiBOVUxMOwotCi0JbWVtc2V0IChiaF91c2UsIDAsIHNpemVvZiAoYmhfdXNlKSk7Ci0JdG9yZWFkID0gMDsKLQlmb3IgKGJsb2NrID0gMDsgYmxvY2sgPCBOQU1FSV9SQV9TSVpFOyArK2Jsb2NrKSB7Ci0JCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOwotCi0JCWlmICgoYmxvY2sgPDwgc2ItPnNfYmxvY2tzaXplX2JpdHMpID49IGRpci0+aV9zaXplKQotCQkJYnJlYWs7Ci0JCWJoID0gdWZzX2dldGZyYWcgKGRpciwgYmxvY2ssIDAsICZlcnIpOwotCQliaF91c2VbYmxvY2tdID0gYmg7Ci0JCWlmIChiaCAmJiAhYnVmZmVyX3VwdG9kYXRlKGJoKSkKLQkJCWJoX3JlYWRbdG9yZWFkKytdID0gYmg7Ci0JfQotCi0JZm9yIChibG9jayA9IDAsIG9mZnNldCA9IDA7IG9mZnNldCA8IGRpci0+aV9zaXplOyBibG9jaysrKSB7Ci0JCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOwotCQlzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqIGRlOwotCQljaGFyICogZGxpbWl0OwotCi0JCWlmICgoYmxvY2sgJSBOQU1FSV9SQV9CTE9DS1MpID09IDAgJiYgdG9yZWFkKSB7Ci0JCQlsbF9yd19ibG9jayAoUkVBRCwgdG9yZWFkLCBiaF9yZWFkKTsKLQkJCXRvcmVhZCA9IDA7Ci0JCX0KLQkJYmggPSBiaF91c2VbYmxvY2sgJSBOQU1FSV9SQV9TSVpFXTsKLQkJaWYgKCFiaCkgewotCQkJdWZzX2Vycm9yIChzYiwgInVmc19maW5kX2VudHJ5IiwgCi0JCQkJImRpcmVjdG9yeSAjJWx1IGNvbnRhaW5zIGEgaG9sZSBhdCBvZmZzZXQgJWx1IiwKLQkJCQlkaXItPmlfaW5vLCBvZmZzZXQpOwotCQkJb2Zmc2V0ICs9IHNiLT5zX2Jsb2Nrc2l6ZTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCXdhaXRfb25fYnVmZmVyIChiaCk7Ci0JCWlmICghYnVmZmVyX3VwdG9kYXRlKGJoKSkgewotCQkJLyoKLQkJCSAqIHJlYWQgZXJyb3I6IGFsbCBiZXRzIGFyZSBvZmYKLQkJCSAqLwotCQkJYnJlYWs7Ci0JCX0KLQotCQlkZSA9IChzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqKSBiaC0+Yl9kYXRhOwotCQlkbGltaXQgPSBiaC0+Yl9kYXRhICsgc2ItPnNfYmxvY2tzaXplOwotCQl3aGlsZSAoKGNoYXIgKikgZGUgPCBkbGltaXQgJiYgb2Zmc2V0IDwgZGlyLT5pX3NpemUpIHsKLQkJCS8qIHRoaXMgY29kZSBpcyBleGVjdXRlZCBxdWFkcmF0aWNhbGx5IG9mdGVuICovCi0JCQkvKiBkbyBtaW5pbWFsIGNoZWNraW5nIGJ5IGhhbmQgKi8KLQkJCWludCBkZV9sZW47Ci0KLQkJCWlmICgoY2hhciAqKSBkZSArIG5hbWVsZW4gPD0gZGxpbWl0ICYmCi0JCQkgICAgdWZzX21hdGNoKHNiLCBuYW1lbGVuLCBuYW1lLCBkZSkpIHsKLQkJCQkvKiBmb3VuZCBhIG1hdGNoIC0KLQkJCQlqdXN0IHRvIGJlIHN1cmUsIGRvIGEgZnVsbCBjaGVjayAqLwotCQkJCWlmICghdWZzX2NoZWNrX2Rpcl9lbnRyeSgidWZzX2ZpbmRfZW50cnkiLAotCQkJCSAgICBkaXIsIGRlLCBiaCwgb2Zmc2V0KSkKLQkJCQkJZ290byBmYWlsZWQ7Ci0JCQkJZm9yIChpID0gMDsgaSA8IE5BTUVJX1JBX1NJWkU7ICsraSkgewotCQkJCQlpZiAoYmhfdXNlW2ldICE9IGJoKQotCQkJCQkJYnJlbHNlIChiaF91c2VbaV0pOwotCQkJCX0KLQkJCQkqcmVzX2JoID0gYmg7Ci0JCQkJcmV0dXJuIGRlOwotCQkJfQotICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJldmVudCBsb29waW5nIG9uIGEgYmFkIGJsb2NrICovCi0JCQlkZV9sZW4gPSBmczE2X3RvX2NwdShzYiwgZGUtPmRfcmVjbGVuKTsKLQkJCWlmIChkZV9sZW4gPD0gMCkKLQkJCQlnb3RvIGZhaWxlZDsKLQkJCW9mZnNldCArPSBkZV9sZW47Ci0JCQlkZSA9IChzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqKSAoKGNoYXIgKikgZGUgKyBkZV9sZW4pOwotCQl9Ci0KLQkJYnJlbHNlIChiaCk7Ci0JCWlmICgoKGJsb2NrICsgTkFNRUlfUkFfU0laRSkgPDwgc2ItPnNfYmxvY2tzaXplX2JpdHMgKSA+PQotCQkgICAgZGlyLT5pX3NpemUpCi0JCQliaCA9IE5VTEw7Ci0JCWVsc2UKLQkJCWJoID0gdWZzX2dldGZyYWcgKGRpciwgYmxvY2sgKyBOQU1FSV9SQV9TSVpFLCAwLCAmZXJyKTsKLQkJYmhfdXNlW2Jsb2NrICUgTkFNRUlfUkFfU0laRV0gPSBiaDsKLQkJaWYgKGJoICYmICFidWZmZXJfdXB0b2RhdGUoYmgpKQotCQkJYmhfcmVhZFt0b3JlYWQrK10gPSBiaDsKLQl9Ci0KLWZhaWxlZDoKLQlmb3IgKGkgPSAwOyBpIDwgTkFNRUlfUkFfU0laRTsgKytpKSBicmVsc2UgKGJoX3VzZVtpXSk7Ci0JVUZTRCgoIkVYSVRcbiIpKQotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgaW50Ci11ZnNfY2hlY2tfZGlyX2VudHJ5IChjb25zdCBjaGFyICpmdW5jdGlvbiwgc3RydWN0IGlub2RlICpkaXIsCi0JCSAgICAgc3RydWN0IHVmc19kaXJfZW50cnkgKmRlLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLAotCQkgICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQorc3RydWN0IHVmc19kaXJfZW50cnkgKnVmc19maW5kX2VudHJ5KHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCQkJICAgICBzdHJ1Y3QgcGFnZSAqKnJlc19wYWdlKQogewogCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkaXItPmlfc2I7Ci0JY29uc3QgY2hhciAqZXJyb3JfbXNnID0gTlVMTDsKLQlpbnQgcmxlbiA9IGZzMTZfdG9fY3B1KHNiLCBkZS0+ZF9yZWNsZW4pOworCWNvbnN0IGNoYXIgKm5hbWUgPSBkZW50cnktPmRfbmFtZS5uYW1lOworCWludCBuYW1lbGVuID0gZGVudHJ5LT5kX25hbWUubGVuOworCXVuc2lnbmVkIHJlY2xlbiA9IFVGU19ESVJfUkVDX0xFTihuYW1lbGVuKTsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0LCBuOworCXVuc2lnbmVkIGxvbmcgbnBhZ2VzID0gdWZzX2Rpcl9wYWdlcyhkaXIpOworCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDsKKwlzdHJ1Y3QgdWZzX2lub2RlX2luZm8gKnVpID0gVUZTX0koZGlyKTsKKwlzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqZGU7CiAKLQlpZiAocmxlbiA8IFVGU19ESVJfUkVDX0xFTigxKSkKLQkJZXJyb3JfbXNnID0gInJlY2xlbiBpcyBzbWFsbGVyIHRoYW4gbWluaW1hbCI7Ci0JZWxzZSBpZiAocmxlbiAlIDQgIT0gMCkKLQkJZXJyb3JfbXNnID0gInJlY2xlbiAlIDQgIT0gMCI7Ci0JZWxzZSBpZiAocmxlbiA8IFVGU19ESVJfUkVDX0xFTih1ZnNfZ2V0X2RlX25hbWxlbihzYiwgZGUpKSkKLQkJZXJyb3JfbXNnID0gInJlY2xlbiBpcyB0b28gc21hbGwgZm9yIG5hbWxlbiI7Ci0JZWxzZSBpZiAoKChjaGFyICopIGRlIC0gYmgtPmJfZGF0YSkgKyBybGVuID4gZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZSkKLQkJZXJyb3JfbXNnID0gImRpcmVjdG9yeSBlbnRyeSBhY3Jvc3MgYmxvY2tzIjsKLQllbHNlIGlmIChmczMyX3RvX2NwdShzYiwgZGUtPmRfaW5vKSA+IChVRlNfU0Ioc2IpLT5zX3VzcGktPnNfaXBnICoKLQkJCQkgICAgICBVRlNfU0Ioc2IpLT5zX3VzcGktPnNfbmNnKSkKLQkJZXJyb3JfbXNnID0gImlub2RlIG91dCBvZiBib3VuZHMiOworCVVGU0QoIkVOVEVSLCBkaXJfaW5vICVsdSwgbmFtZSAlcywgbmFtbGVuICV1XG4iLCBkaXItPmlfaW5vLCBuYW1lLCBuYW1lbGVuKTsKIAotCWlmIChlcnJvcl9tc2cgIT0gTlVMTCkKLQkJdWZzX2Vycm9yIChzYiwgZnVuY3Rpb24sICJiYWQgZW50cnkgaW4gZGlyZWN0b3J5ICMlbHUsIHNpemUgJUx1OiAlcyAtICIKLQkJCSAgICAib2Zmc2V0PSVsdSwgaW5vZGU9JWx1LCByZWNsZW49JWQsIG5hbWxlbj0lZCIsCi0JCQkgICAgZGlyLT5pX2lubywgZGlyLT5pX3NpemUsIGVycm9yX21zZywgb2Zmc2V0LAotCQkJICAgICh1bnNpZ25lZCBsb25nKWZzMzJfdG9fY3B1KHNiLCBkZS0+ZF9pbm8pLAotCQkJICAgIHJsZW4sIHVmc19nZXRfZGVfbmFtbGVuKHNiLCBkZSkpOwotCQotCXJldHVybiAoZXJyb3JfbXNnID09IE5VTEwgPyAxIDogMCk7Ci19CisJaWYgKG5wYWdlcyA9PSAwIHx8IG5hbWVsZW4gPiBVRlNfTUFYTkFNTEVOKQorCQlnb3RvIG91dDsKIAotc3RydWN0IHVmc19kaXJfZW50cnkgKnVmc19kb3Rkb3Qoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBidWZmZXJfaGVhZCAqKnApCi17Ci0JaW50IGVycjsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gdWZzX2JyZWFkIChkaXIsIDAsIDAsICZlcnIpOwotCXN0cnVjdCB1ZnNfZGlyX2VudHJ5ICpyZXMgPSBOVUxMOworCS8qIE9GRlNFVF9DQUNIRSAqLworCSpyZXNfcGFnZSA9IE5VTEw7CiAKLQlpZiAoYmgpIHsKLQkJcmVzID0gKHN0cnVjdCB1ZnNfZGlyX2VudHJ5ICopIGJoLT5iX2RhdGE7Ci0JCXJlcyA9IChzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqKSgoY2hhciAqKXJlcyArCi0JCQlmczE2X3RvX2NwdShkaXItPmlfc2IsIHJlcy0+ZF9yZWNsZW4pKTsKLQl9Ci0JKnAgPSBiaDsKLQlyZXR1cm4gcmVzOwotfQotaW5vX3QgdWZzX2lub2RlX2J5X25hbWUoc3RydWN0IGlub2RlICogZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCi17Ci0JaW5vX3QgcmVzID0gMDsKLQlzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqIGRlOwotCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJc3RhcnQgPSB1aS0+aV9kaXJfc3RhcnRfbG9va3VwOwogCi0JZGUgPSB1ZnNfZmluZF9lbnRyeSAoZGVudHJ5LCAmYmgpOwotCWlmIChkZSkgewotCQlyZXMgPSBmczMyX3RvX2NwdShkaXItPmlfc2IsIGRlLT5kX2lubyk7Ci0JCWJyZWxzZShiaCk7Ci0JfQotCXJldHVybiByZXM7Ci19CisJaWYgKHN0YXJ0ID49IG5wYWdlcykKKwkJc3RhcnQgPSAwOworCW4gPSBzdGFydDsKKwlkbyB7CisJCWNoYXIgKmthZGRyOworCQlwYWdlID0gdWZzX2dldF9wYWdlKGRpciwgbik7CisJCWlmICghSVNfRVJSKHBhZ2UpKSB7CisJCQlrYWRkciA9IHBhZ2VfYWRkcmVzcyhwYWdlKTsKKwkJCWRlID0gKHN0cnVjdCB1ZnNfZGlyX2VudHJ5ICopIGthZGRyOworCQkJa2FkZHIgKz0gdWZzX2xhc3RfYnl0ZShkaXIsIG4pIC0gcmVjbGVuOworCQkJd2hpbGUgKChjaGFyICopIGRlIDw9IGthZGRyKSB7CisJCQkJaWYgKGRlLT5kX3JlY2xlbiA9PSAwKSB7CisJCQkJCXVmc19lcnJvcihkaXItPmlfc2IsIF9fRlVOQ1RJT05fXywKKwkJCQkJCSAgInplcm8tbGVuZ3RoIGRpcmVjdG9yeSBlbnRyeSIpOworCQkJCQl1ZnNfcHV0X3BhZ2UocGFnZSk7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCQlpZiAodWZzX21hdGNoKHNiLCBuYW1lbGVuLCBuYW1lLCBkZSkpCisJCQkJCWdvdG8gZm91bmQ7CisJCQkJZGUgPSB1ZnNfbmV4dF9lbnRyeShzYiwgZGUpOworCQkJfQorCQkJdWZzX3B1dF9wYWdlKHBhZ2UpOworCQl9CisJCWlmICgrK24gPj0gbnBhZ2VzKQorCQkJbiA9IDA7CisJfSB3aGlsZSAobiAhPSBzdGFydCk7CitvdXQ6CisJcmV0dXJuIE5VTEw7CiAKLXZvaWQgdWZzX3NldF9saW5rKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqZGUsCi0JCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIHN0cnVjdCBpbm9kZSAqaW5vZGUpCi17Ci0JZGlyLT5pX3ZlcnNpb24rKzsKLQlkZS0+ZF9pbm8gPSBjcHVfdG9fZnMzMihkaXItPmlfc2IsIGlub2RlLT5pX2lubyk7Ci0JbWFya19idWZmZXJfZGlydHkoYmgpOwotCWlmIChJU19ESVJTWU5DKGRpcikpCi0JCXN5bmNfZGlydHlfYnVmZmVyKGJoKTsKLQlicmVsc2UgKGJoKTsKK2ZvdW5kOgorCSpyZXNfcGFnZSA9IHBhZ2U7CisJdWktPmlfZGlyX3N0YXJ0X2xvb2t1cCA9IG47CisJcmV0dXJuIGRlOwogfQogCiAvKgotICoJdWZzX2FkZF9lbnRyeSgpCi0gKgotICogYWRkcyBhIGZpbGUgZW50cnkgdG8gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnksIHVzaW5nIHRoZSBzYW1lCi0gKiBzZW1hbnRpY3MgYXMgdWZzX2ZpbmRfZW50cnkoKS4gSXQgcmV0dXJucyBOVUxMIGlmIGl0IGZhaWxlZC4KKyAqCVBhcmVudCBpcyBsb2NrZWQuCiAgKi8KIGludCB1ZnNfYWRkX2xpbmsoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewotCXN0cnVjdCBzdXBlcl9ibG9jayAqIHNiOwotCXN0cnVjdCB1ZnNfc2JfcHJpdmF0ZV9pbmZvICogdXNwaTsKLQl1bnNpZ25lZCBsb25nIG9mZnNldDsKLQl1bnNpZ25lZCBmcmFnb2ZmOwotCXVuc2lnbmVkIHNob3J0IHJlY19sZW47Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkICogYmg7Ci0Jc3RydWN0IHVmc19kaXJfZW50cnkgKiBkZSwgKiBkZTE7CiAJc3RydWN0IGlub2RlICpkaXIgPSBkZW50cnktPmRfcGFyZW50LT5kX2lub2RlOwogCWNvbnN0IGNoYXIgKm5hbWUgPSBkZW50cnktPmRfbmFtZS5uYW1lOwogCWludCBuYW1lbGVuID0gZGVudHJ5LT5kX25hbWUubGVuOworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkaXItPmlfc2I7CisJdW5zaWduZWQgcmVjbGVuID0gVUZTX0RJUl9SRUNfTEVOKG5hbWVsZW4pOworCXVuc2lnbmVkIHNob3J0IHJlY19sZW4sIG5hbWVfbGVuOworCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDsKKwlzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqZGU7CisJdW5zaWduZWQgbG9uZyBucGFnZXMgPSB1ZnNfZGlyX3BhZ2VzKGRpcik7CisJdW5zaWduZWQgbG9uZyBuOworCWNoYXIgKmthZGRyOworCXVuc2lnbmVkIGZyb20sIHRvOwogCWludCBlcnI7CiAKLQlVRlNEKCgiRU5URVIsIG5hbWUgJXMsIG5hbWVsZW4gJXVcbiIsIG5hbWUsIG5hbWVsZW4pKQotCQotCXNiID0gZGlyLT5pX3NiOwotCXVzcGkgPSBVRlNfU0Ioc2IpLT5zX3VzcGk7CisJVUZTRCgiRU5URVIsIG5hbWUgJXMsIG5hbWVsZW4gJXVcbiIsIG5hbWUsIG5hbWVsZW4pOwogCi0JaWYgKCFuYW1lbGVuKQotCQlyZXR1cm4gLUVJTlZBTDsKLQliaCA9IHVmc19icmVhZCAoZGlyLCAwLCAwLCAmZXJyKTsKLQlpZiAoIWJoKQotCQlyZXR1cm4gZXJyOwotCXJlY19sZW4gPSBVRlNfRElSX1JFQ19MRU4obmFtZWxlbik7Ci0Jb2Zmc2V0ID0gMDsKLQlkZSA9IChzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqKSBiaC0+Yl9kYXRhOwotCXdoaWxlICgxKSB7Ci0JCWlmICgoY2hhciAqKWRlID49IFVGU19TRUNUT1JfU0laRSArIGJoLT5iX2RhdGEpIHsKLQkJCWZyYWdvZmYgPSBvZmZzZXQgJiB+dXNwaS0+c19mbWFzazsKLQkJCWlmIChmcmFnb2ZmICE9IDAgJiYgZnJhZ29mZiAhPSBVRlNfU0VDVE9SX1NJWkUpCi0JCQkJdWZzX2Vycm9yIChzYiwgInVmc19hZGRfZW50cnkiLCAiaW50ZXJuYWwgZXJyb3IiCi0JCQkJCSIgZnJhZ29mZiAldSIsIGZyYWdvZmYpOwotCQkJaWYgKCFmcmFnb2ZmKSB7Ci0JCQkJYnJlbHNlIChiaCk7Ci0JCQkJYmggPSB1ZnNfYnJlYWQgKGRpciwgb2Zmc2V0ID4+IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzLCAxLCAmZXJyKTsKLQkJCQlpZiAoIWJoKQotCQkJCQlyZXR1cm4gZXJyOwotCQkJfQotCQkJaWYgKGRpci0+aV9zaXplIDw9IG9mZnNldCkgewotCQkJCWlmIChkaXItPmlfc2l6ZSA9PSAwKSB7Ci0JCQkJCWJyZWxzZShiaCk7Ci0JCQkJCXJldHVybiAtRU5PRU5UOwotCQkJCX0KLQkJCQlkZSA9IChzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqKSAoYmgtPmJfZGF0YSArIGZyYWdvZmYpOwotCQkJCWRlLT5kX2lubyA9IDA7CisJLyoKKwkgKiBXZSB0YWtlIGNhcmUgb2YgZGlyZWN0b3J5IGV4cGFuc2lvbiBpbiB0aGUgc2FtZSBsb29wLgorCSAqIFRoaXMgY29kZSBwbGF5cyBvdXRzaWRlIGlfc2l6ZSwgc28gaXQgbG9ja3MgdGhlIHBhZ2UKKwkgKiB0byBwcm90ZWN0IHRoYXQgcmVnaW9uLgorCSAqLworCWZvciAobiA9IDA7IG4gPD0gbnBhZ2VzOyBuKyspIHsKKwkJY2hhciAqZGlyX2VuZDsKKworCQlwYWdlID0gdWZzX2dldF9wYWdlKGRpciwgbik7CisJCWVyciA9IFBUUl9FUlIocGFnZSk7CisJCWlmIChJU19FUlIocGFnZSkpCisJCQlnb3RvIG91dDsKKwkJbG9ja19wYWdlKHBhZ2UpOworCQlrYWRkciA9IHBhZ2VfYWRkcmVzcyhwYWdlKTsKKwkJZGlyX2VuZCA9IGthZGRyICsgdWZzX2xhc3RfYnl0ZShkaXIsIG4pOworCQlkZSA9IChzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqKWthZGRyOworCQlrYWRkciArPSBQQUdFX0NBQ0hFX1NJWkUgLSByZWNsZW47CisJCXdoaWxlICgoY2hhciAqKWRlIDw9IGthZGRyKSB7CisJCQlpZiAoKGNoYXIgKilkZSA9PSBkaXJfZW5kKSB7CisJCQkJLyogV2UgaGl0IGlfc2l6ZSAqLworCQkJCW5hbWVfbGVuID0gMDsKKwkJCQlyZWNfbGVuID0gVUZTX1NFQ1RPUl9TSVpFOwogCQkJCWRlLT5kX3JlY2xlbiA9IGNwdV90b19mczE2KHNiLCBVRlNfU0VDVE9SX1NJWkUpOwotCQkJCXVmc19zZXRfZGVfbmFtbGVuKHNiLCBkZSwgMCk7Ci0JCQkJZGlyLT5pX3NpemUgPSBvZmZzZXQgKyBVRlNfU0VDVE9SX1NJWkU7Ci0JCQkJbWFya19pbm9kZV9kaXJ0eShkaXIpOwotCQkJfSBlbHNlIHsKLQkJCQlkZSA9IChzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqKSBiaC0+Yl9kYXRhOworCQkJCWRlLT5kX2lubyA9IDA7CisJCQkJZ290byBnb3RfaXQ7CiAJCQl9CisJCQlpZiAoZGUtPmRfcmVjbGVuID09IDApIHsKKwkJCQl1ZnNfZXJyb3IoZGlyLT5pX3NiLCBfX0ZVTkNUSU9OX18sCisJCQkJCSAgInplcm8tbGVuZ3RoIGRpcmVjdG9yeSBlbnRyeSIpOworCQkJCWVyciA9IC1FSU87CisJCQkJZ290byBvdXRfdW5sb2NrOworCQkJfQorCQkJZXJyID0gLUVFWElTVDsKKwkJCWlmICh1ZnNfbWF0Y2goc2IsIG5hbWVsZW4sIG5hbWUsIGRlKSkKKwkJCQlnb3RvIG91dF91bmxvY2s7CisJCQluYW1lX2xlbiA9IFVGU19ESVJfUkVDX0xFTih1ZnNfZ2V0X2RlX25hbWxlbihzYiwgZGUpKTsKKwkJCXJlY19sZW4gPSBmczE2X3RvX2NwdShzYiwgZGUtPmRfcmVjbGVuKTsKKwkJCWlmICghZGUtPmRfaW5vICYmIHJlY19sZW4gPj0gcmVjbGVuKQorCQkJCWdvdG8gZ290X2l0OworCQkJaWYgKHJlY19sZW4gPj0gbmFtZV9sZW4gKyByZWNsZW4pCisJCQkJZ290byBnb3RfaXQ7CisJCQlkZSA9IChzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqKSAoKGNoYXIgKikgZGUgKyByZWNfbGVuKTsKIAkJfQotCQlpZiAoIXVmc19jaGVja19kaXJfZW50cnkgKCJ1ZnNfYWRkX2VudHJ5IiwgZGlyLCBkZSwgYmgsIG9mZnNldCkpIHsKLQkJCWJyZWxzZSAoYmgpOwotCQkJcmV0dXJuIC1FTk9FTlQ7Ci0JCX0KLQkJaWYgKHVmc19tYXRjaChzYiwgbmFtZWxlbiwgbmFtZSwgZGUpKSB7Ci0JCQlicmVsc2UgKGJoKTsKLQkJCXJldHVybiAtRUVYSVNUOwotCQl9Ci0JCWlmIChkZS0+ZF9pbm8gPT0gMCAmJiBmczE2X3RvX2NwdShzYiwgZGUtPmRfcmVjbGVuKSA+PSByZWNfbGVuKQotCQkJYnJlYWs7Ci0JCQkKLQkJaWYgKGZzMTZfdG9fY3B1KHNiLCBkZS0+ZF9yZWNsZW4pID49Ci0JCSAgICAgVUZTX0RJUl9SRUNfTEVOKHVmc19nZXRfZGVfbmFtbGVuKHNiLCBkZSkpICsgcmVjX2xlbikKLQkJCWJyZWFrOwotCQlvZmZzZXQgKz0gZnMxNl90b19jcHUoc2IsIGRlLT5kX3JlY2xlbik7Ci0JCWRlID0gKHN0cnVjdCB1ZnNfZGlyX2VudHJ5ICopICgoY2hhciAqKSBkZSArIGZzMTZfdG9fY3B1KHNiLCBkZS0+ZF9yZWNsZW4pKTsKKwkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCXVmc19wdXRfcGFnZShwYWdlKTsKIAl9CisJQlVHKCk7CisJcmV0dXJuIC1FSU5WQUw7CiAKK2dvdF9pdDoKKwlmcm9tID0gKGNoYXIqKWRlIC0gKGNoYXIqKXBhZ2VfYWRkcmVzcyhwYWdlKTsKKwl0byA9IGZyb20gKyByZWNfbGVuOworCWVyciA9IHBhZ2UtPm1hcHBpbmctPmFfb3BzLT5wcmVwYXJlX3dyaXRlKE5VTEwsIHBhZ2UsIGZyb20sIHRvKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF91bmxvY2s7CiAJaWYgKGRlLT5kX2lubykgewotCQlkZTEgPSAoc3RydWN0IHVmc19kaXJfZW50cnkgKikgKChjaGFyICopIGRlICsKLQkJCVVGU19ESVJfUkVDX0xFTih1ZnNfZ2V0X2RlX25hbWxlbihzYiwgZGUpKSk7Ci0JCWRlMS0+ZF9yZWNsZW4gPQotCQkJY3B1X3RvX2ZzMTYoc2IsIGZzMTZfdG9fY3B1KHNiLCBkZS0+ZF9yZWNsZW4pIC0KLQkJCQlVRlNfRElSX1JFQ19MRU4odWZzX2dldF9kZV9uYW1sZW4oc2IsIGRlKSkpOwotCQlkZS0+ZF9yZWNsZW4gPQotCQkJY3B1X3RvX2ZzMTYoc2IsIFVGU19ESVJfUkVDX0xFTih1ZnNfZ2V0X2RlX25hbWxlbihzYiwgZGUpKSk7CisJCXN0cnVjdCB1ZnNfZGlyX2VudHJ5ICpkZTEgPQorCQkJKHN0cnVjdCB1ZnNfZGlyX2VudHJ5ICopICgoY2hhciAqKSBkZSArIG5hbWVfbGVuKTsKKwkJZGUxLT5kX3JlY2xlbiA9IGNwdV90b19mczE2KHNiLCByZWNfbGVuIC0gbmFtZV9sZW4pOworCQlkZS0+ZF9yZWNsZW4gPSBjcHVfdG9fZnMxNihzYiwgbmFtZV9sZW4pOworCiAJCWRlID0gZGUxOwogCX0KLQlkZS0+ZF9pbm8gPSAwOworCiAJdWZzX3NldF9kZV9uYW1sZW4oc2IsIGRlLCBuYW1lbGVuKTsKLQltZW1jcHkgKGRlLT5kX25hbWUsIG5hbWUsIG5hbWVsZW4gKyAxKTsKKwltZW1jcHkoZGUtPmRfbmFtZSwgbmFtZSwgbmFtZWxlbiArIDEpOwogCWRlLT5kX2lubyA9IGNwdV90b19mczMyKHNiLCBpbm9kZS0+aV9pbm8pOwogCXVmc19zZXRfZGVfdHlwZShzYiwgZGUsIGlub2RlLT5pX21vZGUpOwotCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKLQlpZiAoSVNfRElSU1lOQyhkaXIpKQotCQlzeW5jX2RpcnR5X2J1ZmZlcihiaCk7Ci0JYnJlbHNlIChiaCk7Ci0JZGlyLT5pX210aW1lID0gZGlyLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKLQlkaXItPmlfdmVyc2lvbisrOwotCW1hcmtfaW5vZGVfZGlydHkoZGlyKTsKIAotCVVGU0QoKCJFWElUXG4iKSkKKwllcnIgPSB1ZnNfY29tbWl0X2NodW5rKHBhZ2UsIGZyb20sIHRvKTsKKwlkaXItPmlfbXRpbWUgPSBkaXItPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCisJbWFya19pbm9kZV9kaXJ0eShkaXIpOworCS8qIE9GRlNFVF9DQUNIRSAqLworb3V0X3B1dDoKKwl1ZnNfcHV0X3BhZ2UocGFnZSk7CitvdXQ6CisJcmV0dXJuIGVycjsKK291dF91bmxvY2s6CisJdW5sb2NrX3BhZ2UocGFnZSk7CisJZ290byBvdXRfcHV0OworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkCit1ZnNfdmFsaWRhdGVfZW50cnkoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY2hhciAqYmFzZSwKKwkJICAgdW5zaWduZWQgb2Zmc2V0LCB1bnNpZ25lZCBtYXNrKQoreworCXN0cnVjdCB1ZnNfZGlyX2VudHJ5ICpkZSA9IChzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSopKGJhc2UgKyBvZmZzZXQpOworCXN0cnVjdCB1ZnNfZGlyX2VudHJ5ICpwID0gKHN0cnVjdCB1ZnNfZGlyX2VudHJ5KikoYmFzZSArIChvZmZzZXQmbWFzaykpOworCXdoaWxlICgoY2hhciopcCA8IChjaGFyKilkZSkgeworCQlpZiAocC0+ZF9yZWNsZW4gPT0gMCkKKwkJCWJyZWFrOworCQlwID0gdWZzX25leHRfZW50cnkoc2IsIHApOworCX0KKwlyZXR1cm4gKGNoYXIgKilwIC0gYmFzZTsKK30KKworCisvKgorICogVGhpcyBpcyBibGF0YW50bHkgc3RvbGVuIGZyb20gZXh0MmZzCisgKi8KK3N0YXRpYyBpbnQKK3Vmc19yZWFkZGlyKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGlyKQoreworCWxvZmZfdCBwb3MgPSBmaWxwLT5mX3BvczsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCXVuc2lnbmVkIGludCBvZmZzZXQgPSBwb3MgJiB+UEFHRV9DQUNIRV9NQVNLOworCXVuc2lnbmVkIGxvbmcgbiA9IHBvcyA+PiBQQUdFX0NBQ0hFX1NISUZUOworCXVuc2lnbmVkIGxvbmcgbnBhZ2VzID0gdWZzX2Rpcl9wYWdlcyhpbm9kZSk7CisJdW5zaWduZWQgY2h1bmtfbWFzayA9IH4oVUZTX1NFQ1RPUl9TSVpFIC0gMSk7CisJaW50IG5lZWRfcmV2YWxpZGF0ZSA9IGZpbHAtPmZfdmVyc2lvbiAhPSBpbm9kZS0+aV92ZXJzaW9uOworCXVuc2lnbmVkIGZsYWdzID0gVUZTX1NCKHNiKS0+c19mbGFnczsKKworCVVGU0QoIkJFR0lOXG4iKTsKKworCWlmIChwb3MgPiBpbm9kZS0+aV9zaXplIC0gVUZTX0RJUl9SRUNfTEVOKDEpKQorCQlyZXR1cm4gMDsKKworCWZvciAoIDsgbiA8IG5wYWdlczsgbisrLCBvZmZzZXQgPSAwKSB7CisJCWNoYXIgKmthZGRyLCAqbGltaXQ7CisJCXN0cnVjdCB1ZnNfZGlyX2VudHJ5ICpkZTsKKworCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHVmc19nZXRfcGFnZShpbm9kZSwgbik7CisKKwkJaWYgKElTX0VSUihwYWdlKSkgeworCQkJdWZzX2Vycm9yKHNiLCBfX0ZVTkNUSU9OX18sCisJCQkJICAiYmFkIHBhZ2UgaW4gIyVsdSIsCisJCQkJICBpbm9kZS0+aV9pbm8pOworCQkJZmlscC0+Zl9wb3MgKz0gUEFHRV9DQUNIRV9TSVpFIC0gb2Zmc2V0OworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJa2FkZHIgPSBwYWdlX2FkZHJlc3MocGFnZSk7CisJCWlmICh1bmxpa2VseShuZWVkX3JldmFsaWRhdGUpKSB7CisJCQlpZiAob2Zmc2V0KSB7CisJCQkJb2Zmc2V0ID0gdWZzX3ZhbGlkYXRlX2VudHJ5KHNiLCBrYWRkciwgb2Zmc2V0LCBjaHVua19tYXNrKTsKKwkJCQlmaWxwLT5mX3BvcyA9IChuPDxQQUdFX0NBQ0hFX1NISUZUKSArIG9mZnNldDsKKwkJCX0KKwkJCWZpbHAtPmZfdmVyc2lvbiA9IGlub2RlLT5pX3ZlcnNpb247CisJCQluZWVkX3JldmFsaWRhdGUgPSAwOworCQl9CisJCWRlID0gKHN0cnVjdCB1ZnNfZGlyX2VudHJ5ICopKGthZGRyK29mZnNldCk7CisJCWxpbWl0ID0ga2FkZHIgKyB1ZnNfbGFzdF9ieXRlKGlub2RlLCBuKSAtIFVGU19ESVJfUkVDX0xFTigxKTsKKwkJZm9yICggOyhjaGFyKilkZSA8PSBsaW1pdDsgZGUgPSB1ZnNfbmV4dF9lbnRyeShzYiwgZGUpKSB7CisJCQlpZiAoZGUtPmRfcmVjbGVuID09IDApIHsKKwkJCQl1ZnNfZXJyb3Ioc2IsIF9fRlVOQ1RJT05fXywKKwkJCQkJInplcm8tbGVuZ3RoIGRpcmVjdG9yeSBlbnRyeSIpOworCQkJCXVmc19wdXRfcGFnZShwYWdlKTsKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCX0KKwkJCWlmIChkZS0+ZF9pbm8pIHsKKwkJCQlpbnQgb3ZlcjsKKwkJCQl1bnNpZ25lZCBjaGFyIGRfdHlwZSA9IERUX1VOS05PV047CisKKwkJCQlvZmZzZXQgPSAoY2hhciAqKWRlIC0ga2FkZHI7CisKKwkJCQlVRlNEKCJmaWxsZGlyKCVzLCV1KVxuIiwgZGUtPmRfbmFtZSwKKwkJCQkgICAgICBmczMyX3RvX2NwdShzYiwgZGUtPmRfaW5vKSk7CisJCQkJVUZTRCgibmFtbGVuICV1XG4iLCB1ZnNfZ2V0X2RlX25hbWxlbihzYiwgZGUpKTsKKworCQkJCWlmICgoZmxhZ3MgJiBVRlNfREVfTUFTSykgPT0gVUZTX0RFXzQ0QlNEKQorCQkJCQlkX3R5cGUgPSBkZS0+ZF91LmRfNDQuZF90eXBlOworCisJCQkJb3ZlciA9IGZpbGxkaXIoZGlyZW50LCBkZS0+ZF9uYW1lLAorCQkJCQkgICAgICAgdWZzX2dldF9kZV9uYW1sZW4oc2IsIGRlKSwKKwkJCQkJCShuPDxQQUdFX0NBQ0hFX1NISUZUKSB8IG9mZnNldCwKKwkJCQkJICAgICAgIGZzMzJfdG9fY3B1KHNiLCBkZS0+ZF9pbm8pLCBkX3R5cGUpOworCQkJCWlmIChvdmVyKSB7CisJCQkJCXVmc19wdXRfcGFnZShwYWdlKTsKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJfQorCQkJZmlscC0+Zl9wb3MgKz0gZnMxNl90b19jcHUoc2IsIGRlLT5kX3JlY2xlbik7CisJCX0KKwkJdWZzX3B1dF9wYWdlKHBhZ2UpOworCX0KIAlyZXR1cm4gMDsKIH0KIAorCiAvKgogICogdWZzX2RlbGV0ZV9lbnRyeSBkZWxldGVzIGEgZGlyZWN0b3J5IGVudHJ5IGJ5IG1lcmdpbmcgaXQgd2l0aCB0aGUKICAqIHByZXZpb3VzIGVudHJ5LgogICovCi1pbnQgdWZzX2RlbGV0ZV9lbnRyeSAoc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCB1ZnNfZGlyX2VudHJ5ICogZGlyLAotCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoICkKLQkKK2ludCB1ZnNfZGVsZXRlX2VudHJ5KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCB1ZnNfZGlyX2VudHJ5ICpkaXIsCisJCSAgICAgc3RydWN0IHBhZ2UgKiBwYWdlKQogewotCXN0cnVjdCBzdXBlcl9ibG9jayAqIHNiOwotCXN0cnVjdCB1ZnNfZGlyX2VudHJ5ICogZGUsICogcGRlOwotCXVuc2lnbmVkIGk7Ci0JCi0JVUZTRCgoIkVOVEVSXG4iKSkKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBwYWdlLT5tYXBwaW5nOworCWNoYXIgKmthZGRyID0gcGFnZV9hZGRyZXNzKHBhZ2UpOworCXVuc2lnbmVkIGZyb20gPSAoKGNoYXIqKWRpciAtIGthZGRyKSAmIH4oVUZTX1NFQ1RPUl9TSVpFIC0gMSk7CisJdW5zaWduZWQgdG8gPSAoKGNoYXIqKWRpciAtIGthZGRyKSArIGZzMTZfdG9fY3B1KHNiLCBkaXItPmRfcmVjbGVuKTsKKwlzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqcGRlID0gTlVMTDsKKwlzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqZGUgPSAoc3RydWN0IHVmc19kaXJfZW50cnkgKikgKGthZGRyICsgZnJvbSk7CisJaW50IGVycjsKIAotCXNiID0gaW5vZGUtPmlfc2I7Ci0JaSA9IDA7Ci0JcGRlID0gTlVMTDsKLQlkZSA9IChzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqKSBiaC0+Yl9kYXRhOwotCQotCVVGU0QoKCJpbm8gJXUsIHJlY2xlbiAldSwgbmFtbGVuICV1LCBuYW1lICVzXG4iLAotCQlmczMyX3RvX2NwdShzYiwgZGUtPmRfaW5vKSwKLQkJZnMxNl90b19jcHUoc2IsIGRlLT5kX3JlY2xlbiksCi0JCXVmc19nZXRfZGVfbmFtbGVuKHNiLCBkZSksIGRlLT5kX25hbWUpKQorCVVGU0QoIkVOVEVSXG4iKTsKIAotCXdoaWxlIChpIDwgYmgtPmJfc2l6ZSkgewotCQlpZiAoIXVmc19jaGVja19kaXJfZW50cnkgKCJ1ZnNfZGVsZXRlX2VudHJ5IiwgaW5vZGUsIGRlLCBiaCwgaSkpIHsKLQkJCWJyZWxzZShiaCk7Ci0JCQlyZXR1cm4gLUVJTzsKKwlVRlNEKCJpbm8gJXUsIHJlY2xlbiAldSwgbmFtbGVuICV1LCBuYW1lICVzXG4iLAorCSAgICAgIGZzMzJfdG9fY3B1KHNiLCBkZS0+ZF9pbm8pLAorCSAgICAgIGZzMTZfdG9fY3B1KHNiLCBkZS0+ZF9yZWNsZW4pLAorCSAgICAgIHVmc19nZXRfZGVfbmFtbGVuKHNiLCBkZSksIGRlLT5kX25hbWUpOworCisJd2hpbGUgKChjaGFyKilkZSA8IChjaGFyKilkaXIpIHsKKwkJaWYgKGRlLT5kX3JlY2xlbiA9PSAwKSB7CisJCQl1ZnNfZXJyb3IoaW5vZGUtPmlfc2IsIF9fRlVOQ1RJT05fXywKKwkJCQkgICJ6ZXJvLWxlbmd0aCBkaXJlY3RvcnkgZW50cnkiKTsKKwkJCWVyciA9IC1FSU87CisJCQlnb3RvIG91dDsKIAkJfQotCQlpZiAoZGUgPT0gZGlyKSAgewotCQkJaWYgKHBkZSkKLQkJCQlmczE2X2FkZChzYiwgJnBkZS0+ZF9yZWNsZW4sCi0JCQkJCWZzMTZfdG9fY3B1KHNiLCBkaXItPmRfcmVjbGVuKSk7Ci0JCQlkaXItPmRfaW5vID0gMDsKLQkJCWlub2RlLT5pX3ZlcnNpb24rKzsKLQkJCWlub2RlLT5pX2N0aW1lID0gaW5vZGUtPmlfbXRpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOwotCQkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7Ci0JCQltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7Ci0JCQlpZiAoSVNfRElSU1lOQyhpbm9kZSkpCi0JCQkJc3luY19kaXJ0eV9idWZmZXIoYmgpOwotCQkJYnJlbHNlKGJoKTsKLQkJCVVGU0QoKCJFWElUXG4iKSkKLQkJCXJldHVybiAwOwotCQl9Ci0JCWkgKz0gZnMxNl90b19jcHUoc2IsIGRlLT5kX3JlY2xlbik7Ci0JCWlmIChpID09IFVGU19TRUNUT1JfU0laRSkgcGRlID0gTlVMTDsKLQkJZWxzZSBwZGUgPSBkZTsKLQkJZGUgPSAoc3RydWN0IHVmc19kaXJfZW50cnkgKikKLQkJICAgICgoY2hhciAqKSBkZSArIGZzMTZfdG9fY3B1KHNiLCBkZS0+ZF9yZWNsZW4pKTsKLQkJaWYgKGkgPT0gVUZTX1NFQ1RPUl9TSVpFICYmIGRlLT5kX3JlY2xlbiA9PSAwKQotCQkJYnJlYWs7CisJCXBkZSA9IGRlOworCQlkZSA9IHVmc19uZXh0X2VudHJ5KHNiLCBkZSk7CiAJfQotCVVGU0QoKCJFWElUXG4iKSkKLQlicmVsc2UoYmgpOwotCXJldHVybiAtRU5PRU5UOworCWlmIChwZGUpCisJCWZyb20gPSAoY2hhciopcGRlIC0gKGNoYXIqKXBhZ2VfYWRkcmVzcyhwYWdlKTsKKwlsb2NrX3BhZ2UocGFnZSk7CisJZXJyID0gbWFwcGluZy0+YV9vcHMtPnByZXBhcmVfd3JpdGUoTlVMTCwgcGFnZSwgZnJvbSwgdG8pOworCUJVR19PTihlcnIpOworCWlmIChwZGUpCisJCXBkZS0+ZF9yZWNsZW4gPSBjcHVfdG9fZnMxNihzYiwgdG8tZnJvbSk7CisJZGlyLT5kX2lubyA9IDA7CisJZXJyID0gdWZzX2NvbW1pdF9jaHVuayhwYWdlLCBmcm9tLCB0byk7CisJaW5vZGUtPmlfY3RpbWUgPSBpbm9kZS0+aV9tdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CitvdXQ6CisJdWZzX3B1dF9wYWdlKHBhZ2UpOworCVVGU0QoIkVYSVRcbiIpOworCXJldHVybiBlcnI7CiB9CiAKIGludCB1ZnNfbWFrZV9lbXB0eShzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGlub2RlICpkaXIpCiB7CiAJc3RydWN0IHN1cGVyX2Jsb2NrICogc2IgPSBkaXItPmlfc2I7Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkICogZGlyX2Jsb2NrOworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gaW5vZGUtPmlfbWFwcGluZzsKKwlzdHJ1Y3QgcGFnZSAqcGFnZSA9IGdyYWJfY2FjaGVfcGFnZShtYXBwaW5nLCAwKTsKIAlzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqIGRlOworCWNoYXIgKmJhc2U7CiAJaW50IGVycjsKIAotCWRpcl9ibG9jayA9IHVmc19icmVhZCAoaW5vZGUsIDAsIDEsICZlcnIpOwotCWlmICghZGlyX2Jsb2NrKQotCQlyZXR1cm4gZXJyOworCWlmICghcGFnZSkKKwkJcmV0dXJuIC1FTk9NRU07CisJa21hcChwYWdlKTsKKwllcnIgPSBtYXBwaW5nLT5hX29wcy0+cHJlcGFyZV93cml0ZShOVUxMLCBwYWdlLCAwLCBVRlNfU0VDVE9SX1NJWkUpOworCWlmIChlcnIpIHsKKwkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCWdvdG8gZmFpbDsKKwl9CiAKLQlpbm9kZS0+aV9ibG9ja3MgPSBzYi0+c19ibG9ja3NpemUgLyBVRlNfU0VDVE9SX1NJWkU7Ci0JZGUgPSAoc3RydWN0IHVmc19kaXJfZW50cnkgKikgZGlyX2Jsb2NrLT5iX2RhdGE7CisKKwliYXNlID0gKGNoYXIqKXBhZ2VfYWRkcmVzcyhwYWdlKTsKKwltZW1zZXQoYmFzZSwgMCwgUEFHRV9DQUNIRV9TSVpFKTsKKworCWRlID0gKHN0cnVjdCB1ZnNfZGlyX2VudHJ5ICopIGJhc2U7CisKIAlkZS0+ZF9pbm8gPSBjcHVfdG9fZnMzMihzYiwgaW5vZGUtPmlfaW5vKTsKIAl1ZnNfc2V0X2RlX3R5cGUoc2IsIGRlLCBpbm9kZS0+aV9tb2RlKTsKIAl1ZnNfc2V0X2RlX25hbWxlbihzYiwgZGUsIDEpOwpAQCAtNTUyLDcyICs1ODcsNjUgQEAKIAlkZS0+ZF9yZWNsZW4gPSBjcHVfdG9fZnMxNihzYiwgVUZTX1NFQ1RPUl9TSVpFIC0gVUZTX0RJUl9SRUNfTEVOKDEpKTsKIAl1ZnNfc2V0X2RlX25hbWxlbihzYiwgZGUsIDIpOwogCXN0cmNweSAoZGUtPmRfbmFtZSwgIi4uIik7Ci0JbWFya19idWZmZXJfZGlydHkoZGlyX2Jsb2NrKTsKLQlicmVsc2UgKGRpcl9ibG9jayk7Ci0JbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7Ci0JcmV0dXJuIDA7CisKKwllcnIgPSB1ZnNfY29tbWl0X2NodW5rKHBhZ2UsIDAsIFVGU19TRUNUT1JfU0laRSk7CitmYWlsOgorCWt1bm1hcChwYWdlKTsKKwlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJcmV0dXJuIGVycjsKIH0KIAogLyoKICAqIHJvdXRpbmUgdG8gY2hlY2sgdGhhdCB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSBpcyBlbXB0eSAoZm9yIHJtZGlyKQogICovCi1pbnQgdWZzX2VtcHR5X2RpciAoc3RydWN0IGlub2RlICogaW5vZGUpCitpbnQgdWZzX2VtcHR5X2RpcihzdHJ1Y3QgaW5vZGUgKiBpbm9kZSkKIHsKLQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYjsKLQl1bnNpZ25lZCBsb25nIG9mZnNldDsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaDsKLQlzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqIGRlLCAqIGRlMTsKLQlpbnQgZXJyOwotCQotCXNiID0gaW5vZGUtPmlfc2I7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGksIG5wYWdlcyA9IHVmc19kaXJfcGFnZXMoaW5vZGUpOwogCi0JaWYgKGlub2RlLT5pX3NpemUgPCBVRlNfRElSX1JFQ19MRU4oMSkgKyBVRlNfRElSX1JFQ19MRU4oMikgfHwKLQkgICAgIShiaCA9IHVmc19icmVhZCAoaW5vZGUsIDAsIDAsICZlcnIpKSkgewotCSAgICAJdWZzX3dhcm5pbmcgKGlub2RlLT5pX3NiLCAiZW1wdHlfZGlyIiwKLQkJCSAgICAgICJiYWQgZGlyZWN0b3J5IChkaXIgIyVsdSkgLSBubyBkYXRhIGJsb2NrIiwKLQkJCSAgICAgIGlub2RlLT5pX2lubyk7Ci0JCXJldHVybiAxOwotCX0KLQlkZSA9IChzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqKSBiaC0+Yl9kYXRhOwotCWRlMSA9IChzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqKQotCQkoKGNoYXIgKilkZSArIGZzMTZfdG9fY3B1KHNiLCBkZS0+ZF9yZWNsZW4pKTsKLQlpZiAoZnMzMl90b19jcHUoc2IsIGRlLT5kX2lubykgIT0gaW5vZGUtPmlfaW5vIHx8IGRlMS0+ZF9pbm8gPT0gMCB8fAotCSAgICAgc3RyY21wICgiLiIsIGRlLT5kX25hbWUpIHx8IHN0cmNtcCAoIi4uIiwgZGUxLT5kX25hbWUpKSB7Ci0JICAgIAl1ZnNfd2FybmluZyAoaW5vZGUtPmlfc2IsICJlbXB0eV9kaXIiLAotCQkJICAgICAgImJhZCBkaXJlY3RvcnkgKGRpciAjJWx1KSAtIG5vIGAuJyBvciBgLi4nIiwKLQkJCSAgICAgIGlub2RlLT5pX2lubyk7Ci0JCXJldHVybiAxOwotCX0KLQlvZmZzZXQgPSBmczE2X3RvX2NwdShzYiwgZGUtPmRfcmVjbGVuKSArIGZzMTZfdG9fY3B1KHNiLCBkZTEtPmRfcmVjbGVuKTsKLQlkZSA9IChzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqKQotCQkoKGNoYXIgKilkZTEgKyBmczE2X3RvX2NwdShzYiwgZGUxLT5kX3JlY2xlbikpOwotCXdoaWxlIChvZmZzZXQgPCBpbm9kZS0+aV9zaXplICkgewotCQlpZiAoIWJoIHx8ICh2b2lkICopIGRlID49ICh2b2lkICopIChiaC0+Yl9kYXRhICsgc2ItPnNfYmxvY2tzaXplKSkgewotCQkJYnJlbHNlIChiaCk7Ci0JCQliaCA9IHVmc19icmVhZCAoaW5vZGUsIG9mZnNldCA+PiBzYi0+c19ibG9ja3NpemVfYml0cywgMSwgJmVycik7Ci0JIAkJaWYgKCFiaCkgewotCQkJCXVmc19lcnJvciAoc2IsICJlbXB0eV9kaXIiLAotCQkJCQkgICAgImRpcmVjdG9yeSAjJWx1IGNvbnRhaW5zIGEgaG9sZSBhdCBvZmZzZXQgJWx1IiwKLQkJCQkJICAgIGlub2RlLT5pX2lubywgb2Zmc2V0KTsKLQkJCQlvZmZzZXQgKz0gc2ItPnNfYmxvY2tzaXplOwotCQkJCWNvbnRpbnVlOworCWZvciAoaSA9IDA7IGkgPCBucGFnZXM7IGkrKykgeworCQljaGFyICprYWRkcjsKKwkJc3RydWN0IHVmc19kaXJfZW50cnkgKmRlOworCQlwYWdlID0gdWZzX2dldF9wYWdlKGlub2RlLCBpKTsKKworCQlpZiAoSVNfRVJSKHBhZ2UpKQorCQkJY29udGludWU7CisKKwkJa2FkZHIgPSBwYWdlX2FkZHJlc3MocGFnZSk7CisJCWRlID0gKHN0cnVjdCB1ZnNfZGlyX2VudHJ5ICopa2FkZHI7CisJCWthZGRyICs9IHVmc19sYXN0X2J5dGUoaW5vZGUsIGkpIC0gVUZTX0RJUl9SRUNfTEVOKDEpOworCisJCXdoaWxlICgoY2hhciAqKWRlIDw9IGthZGRyKSB7CisJCQlpZiAoZGUtPmRfcmVjbGVuID09IDApIHsKKwkJCQl1ZnNfZXJyb3IoaW5vZGUtPmlfc2IsIF9fRlVOQ1RJT05fXywKKwkJCQkJInplcm8tbGVuZ3RoIGRpcmVjdG9yeSBlbnRyeTogIgorCQkJCQkia2FkZHI9JXAsIGRlPSVwXG4iLCBrYWRkciwgZGUpOworCQkJCWdvdG8gbm90X2VtcHR5OwogCQkJfQotCQkJZGUgPSAoc3RydWN0IHVmc19kaXJfZW50cnkgKikgYmgtPmJfZGF0YTsKKwkJCWlmIChkZS0+ZF9pbm8pIHsKKwkJCQl1MTYgbmFtZWxlbj11ZnNfZ2V0X2RlX25hbWxlbihzYiwgZGUpOworCQkJCS8qIGNoZWNrIGZvciAuIGFuZCAuLiAqLworCQkJCWlmIChkZS0+ZF9uYW1lWzBdICE9ICcuJykKKwkJCQkJZ290byBub3RfZW1wdHk7CisJCQkJaWYgKG5hbWVsZW4gPiAyKQorCQkJCQlnb3RvIG5vdF9lbXB0eTsKKwkJCQlpZiAobmFtZWxlbiA8IDIpIHsKKwkJCQkJaWYgKGlub2RlLT5pX2lubyAhPQorCQkJCQkgICAgZnMzMl90b19jcHUoc2IsIGRlLT5kX2lubykpCisJCQkJCQlnb3RvIG5vdF9lbXB0eTsKKwkJCQl9IGVsc2UgaWYgKGRlLT5kX25hbWVbMV0gIT0gJy4nKQorCQkJCQlnb3RvIG5vdF9lbXB0eTsKKwkJCX0KKwkJCWRlID0gdWZzX25leHRfZW50cnkoc2IsIGRlKTsKIAkJfQotCQlpZiAoIXVmc19jaGVja19kaXJfZW50cnkgKCJlbXB0eV9kaXIiLCBpbm9kZSwgZGUsIGJoLCBvZmZzZXQpKSB7Ci0JCQlicmVsc2UgKGJoKTsKLQkJCXJldHVybiAxOwotCQl9Ci0JCWlmIChkZS0+ZF9pbm8pIHsKLQkJCWJyZWxzZSAoYmgpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJb2Zmc2V0ICs9IGZzMTZfdG9fY3B1KHNiLCBkZS0+ZF9yZWNsZW4pOwotCQlkZSA9IChzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqKQotCQkJKChjaGFyICopZGUgKyBmczE2X3RvX2NwdShzYiwgZGUtPmRfcmVjbGVuKSk7CisJCXVmc19wdXRfcGFnZShwYWdlKTsKIAl9Ci0JYnJlbHNlIChiaCk7CiAJcmV0dXJuIDE7CisKK25vdF9lbXB0eToKKwl1ZnNfcHV0X3BhZ2UocGFnZSk7CisJcmV0dXJuIDA7CiB9CiAKIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdWZzX2Rpcl9vcGVyYXRpb25zID0gewpkaWZmIC0tZ2l0IGEvZnMvdWZzL2ZpbGUuYyBiL2ZzL3Vmcy9maWxlLmMKaW5kZXggMzEyZmQzZi4uMGU1MDAxNSAxMDA2NDQKLS0tIGEvZnMvdWZzL2ZpbGUuYworKysgYi9mcy91ZnMvZmlsZS5jCkBAIC0yNSw2ICsyNSwyNiBAQAogCiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC91ZnNfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgkvKiBmb3Igc3luY19tYXBwaW5nX2J1ZmZlcnMoKSAqLworCitzdGF0aWMgaW50IHVmc19zeW5jX2ZpbGUoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IGRhdGFzeW5jKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJaW50IGVycjsKKwlpbnQgcmV0OworCisJcmV0ID0gc3luY19tYXBwaW5nX2J1ZmZlcnMoaW5vZGUtPmlfbWFwcGluZyk7CisJaWYgKCEoaW5vZGUtPmlfc3RhdGUgJiBJX0RJUlRZKSkKKwkJcmV0dXJuIHJldDsKKwlpZiAoZGF0YXN5bmMgJiYgIShpbm9kZS0+aV9zdGF0ZSAmIElfRElSVFlfREFUQVNZTkMpKQorCQlyZXR1cm4gcmV0OworCisJZXJyID0gdWZzX3N5bmNfaW5vZGUoaW5vZGUpOworCWlmIChyZXQgPT0gMCkKKwkJcmV0ID0gZXJyOworCXJldHVybiByZXQ7Cit9CisKIAogLyoKICAqIFdlIGhhdmUgbW9zdGx5IE5VTEwncyBoZXJlOiB0aGUgY3VycmVudCBkZWZhdWx0cyBhcmUgb2sgZm9yCkBAIC0zNyw2ICs1Nyw3IEBACiAJLndyaXRlCQk9IGdlbmVyaWNfZmlsZV93cml0ZSwKIAkubW1hcAkJPSBnZW5lcmljX2ZpbGVfbW1hcCwKIAkub3BlbiAgICAgICAgICAgPSBnZW5lcmljX2ZpbGVfb3BlbiwKKwkuZnN5bmMJCT0gdWZzX3N5bmNfZmlsZSwKIAkuc2VuZGZpbGUJPSBnZW5lcmljX2ZpbGVfc2VuZGZpbGUsCiB9OwogCmRpZmYgLS1naXQgYS9mcy91ZnMvaWFsbG9jLmMgYi9mcy91ZnMvaWFsbG9jLmMKaW5kZXggYzdhNDdlZC4uOTUwMWRjZCAxMDA2NDQKLS0tIGEvZnMvdWZzL2lhbGxvYy5jCisrKyBiL2ZzL3Vmcy9pYWxsb2MuYwpAQCAtMzQsMTQgKzM0LDYgQEAKICNpbmNsdWRlICJzd2FiLmgiCiAjaW5jbHVkZSAidXRpbC5oIgogCi0jdW5kZWYgVUZTX0lBTExPQ19ERUJVRwotCi0jaWZkZWYgVUZTX0lBTExPQ19ERUJVRwotI2RlZmluZSBVRlNEKHgpIHByaW50aygiKCVzLCAlZCksICVzOiAiLCBfX0ZJTEVfXywgX19MSU5FX18sIF9fRlVOQ1RJT05fXyk7IHByaW50ayB4OwotI2Vsc2UKLSNkZWZpbmUgVUZTRCh4KQotI2VuZGlmCi0KIC8qCiAgKiBOT1RFISBXaGVuIHdlIGdldCB0aGUgaW5vZGUsIHdlJ3JlIHRoZSBvbmx5IHBlb3BsZQogICogdGhhdCBoYXZlIGFjY2VzcyB0byBpdCwgYW5kIGFzIHN1Y2ggdGhlcmUgYXJlIG5vCkBAIC02OCw3ICs2MCw3IEBACiAJaW50IGlzX2RpcmVjdG9yeTsKIAl1bnNpZ25lZCBpbm8sIGNnLCBiaXQ7CiAJCi0JVUZTRCgoIkVOVEVSLCBpbm8gJWx1XG4iLCBpbm9kZS0+aV9pbm8pKQorCVVGU0QoIkVOVEVSLCBpbm8gJWx1XG4iLCBpbm9kZS0+aV9pbm8pOwogCiAJc2IgPSBpbm9kZS0+aV9zYjsKIAl1c3BpID0gVUZTX1NCKHNiKS0+c191c3BpOwpAQCAtOTEsNyArODMsNyBAQAogCQl1bmxvY2tfc3VwZXIgKHNiKTsKIAkJcmV0dXJuOwogCX0KLQl1Y2cgPSB1YmhfZ2V0X3VjZyhVQ1BJX1VCSCk7CisJdWNnID0gdWJoX2dldF91Y2coVUNQSV9VQkgodWNwaSkpOwogCWlmICghdWZzX2NnX2Noa21hZ2ljKHNiLCB1Y2cpKQogCQl1ZnNfcGFuaWMgKHNiLCAidWZzX2ZyZWVfZnJhZ21lbnRzIiwgImludGVybmFsIGVycm9yLCBiYWQgY2cgbWFnaWMgbnVtYmVyIik7CiAKQEAgLTEwNCwzMyArOTYsMzMgQEAKIAogCWNsZWFyX2lub2RlIChpbm9kZSk7CiAKLQlpZiAodWJoX2lzY2xyIChVQ1BJX1VCSCwgdWNwaS0+Y19pdXNlZG9mZiwgYml0KSkKKwlpZiAodWJoX2lzY2xyIChVQ1BJX1VCSCh1Y3BpKSwgdWNwaS0+Y19pdXNlZG9mZiwgYml0KSkKIAkJdWZzX2Vycm9yKHNiLCAidWZzX2ZyZWVfaW5vZGUiLCAiYml0IGFscmVhZHkgY2xlYXJlZCBmb3IgaW5vZGUgJXUiLCBpbm8pOwogCWVsc2UgewotCQl1YmhfY2xyYml0IChVQ1BJX1VCSCwgdWNwaS0+Y19pdXNlZG9mZiwgYml0KTsKKwkJdWJoX2NscmJpdCAoVUNQSV9VQkgodWNwaSksIHVjcGktPmNfaXVzZWRvZmYsIGJpdCk7CiAJCWlmIChpbm8gPCB1Y3BpLT5jX2lyb3RvcikKIAkJCXVjcGktPmNfaXJvdG9yID0gaW5vOwogCQlmczMyX2FkZChzYiwgJnVjZy0+Y2dfY3MuY3NfbmlmcmVlLCAxKTsKLQkJZnMzMl9hZGQoc2IsICZ1c2IxLT5mc19jc3RvdGFsLmNzX25pZnJlZSwgMSk7CisJCXVzcGktPmNzX3RvdGFsLmNzX25pZnJlZSsrOwogCQlmczMyX2FkZChzYiwgJlVGU19TQihzYiktPmZzX2NzKGNnKS5jc19uaWZyZWUsIDEpOwogCiAJCWlmIChpc19kaXJlY3RvcnkpIHsKIAkJCWZzMzJfc3ViKHNiLCAmdWNnLT5jZ19jcy5jc19uZGlyLCAxKTsKLQkJCWZzMzJfc3ViKHNiLCAmdXNiMS0+ZnNfY3N0b3RhbC5jc19uZGlyLCAxKTsKKwkJCXVzcGktPmNzX3RvdGFsLmNzX25kaXItLTsKIAkJCWZzMzJfc3ViKHNiLCAmVUZTX1NCKHNiKS0+ZnNfY3MoY2cpLmNzX25kaXIsIDEpOwogCQl9CiAJfQogCi0JdWJoX21hcmtfYnVmZmVyX2RpcnR5IChVU1BJX1VCSCk7Ci0JdWJoX21hcmtfYnVmZmVyX2RpcnR5IChVQ1BJX1VCSCk7CisJdWJoX21hcmtfYnVmZmVyX2RpcnR5IChVU1BJX1VCSCh1c3BpKSk7CisJdWJoX21hcmtfYnVmZmVyX2RpcnR5IChVQ1BJX1VCSCh1Y3BpKSk7CiAJaWYgKHNiLT5zX2ZsYWdzICYgTVNfU1lOQ0hST05PVVMpIHsKLQkJdWJoX2xsX3J3X2Jsb2NrIChTV1JJVEUsIDEsIChzdHJ1Y3QgdWZzX2J1ZmZlcl9oZWFkICoqKSAmdWNwaSk7Ci0JCXViaF93YWl0X29uX2J1ZmZlciAoVUNQSV9VQkgpOworCQl1YmhfbGxfcndfYmxvY2soU1dSSVRFLCBVQ1BJX1VCSCh1Y3BpKSk7CisJCXViaF93YWl0X29uX2J1ZmZlciAoVUNQSV9VQkgodWNwaSkpOwogCX0KIAkKIAlzYi0+c19kaXJ0ID0gMTsKIAl1bmxvY2tfc3VwZXIgKHNiKTsKLQlVRlNEKCgiRVhJVFxuIikpCisJVUZTRCgiRVhJVFxuIik7CiB9CiAKIC8qCkBAIC0xNTUsNyArMTQ3LDcgQEAKIAl1bnNpZ25lZCBjZywgYml0LCBpLCBqLCBzdGFydDsKIAlzdHJ1Y3QgdWZzX2lub2RlX2luZm8gKnVmc2k7CiAKLQlVRlNEKCgiRU5URVJcbiIpKQorCVVGU0QoIkVOVEVSXG4iKTsKIAkKIAkvKiBDYW5ub3QgY3JlYXRlIGZpbGVzIGluIGEgZGVsZXRlZCBkaXJlY3RvcnkgKi8KIAlpZiAoIWRpciB8fCAhZGlyLT5pX25saW5rKQpAQCAtMjEzLDQzICsyMDUsNDMgQEAKIAl1Y3BpID0gdWZzX2xvYWRfY3lsaW5kZXIgKHNiLCBjZyk7CiAJaWYgKCF1Y3BpKQogCQlnb3RvIGZhaWxlZDsKLQl1Y2cgPSB1YmhfZ2V0X3VjZyhVQ1BJX1VCSCk7CisJdWNnID0gdWJoX2dldF91Y2coVUNQSV9VQkgodWNwaSkpOwogCWlmICghdWZzX2NnX2Noa21hZ2ljKHNiLCB1Y2cpKSAKIAkJdWZzX3BhbmljIChzYiwgInVmc19uZXdfaW5vZGUiLCAiaW50ZXJuYWwgZXJyb3IsIGJhZCBjZyBtYWdpYyBudW1iZXIiKTsKIAogCXN0YXJ0ID0gdWNwaS0+Y19pcm90b3I7Ci0JYml0ID0gdWJoX2ZpbmRfbmV4dF96ZXJvX2JpdCAoVUNQSV9VQkgsIHVjcGktPmNfaXVzZWRvZmYsIHVzcGktPnNfaXBnLCBzdGFydCk7CisJYml0ID0gdWJoX2ZpbmRfbmV4dF96ZXJvX2JpdCAoVUNQSV9VQkgodWNwaSksIHVjcGktPmNfaXVzZWRvZmYsIHVzcGktPnNfaXBnLCBzdGFydCk7CiAJaWYgKCEoYml0IDwgdXNwaS0+c19pcGcpKSB7Ci0JCWJpdCA9IHViaF9maW5kX2ZpcnN0X3plcm9fYml0IChVQ1BJX1VCSCwgdWNwaS0+Y19pdXNlZG9mZiwgc3RhcnQpOworCQliaXQgPSB1YmhfZmluZF9maXJzdF96ZXJvX2JpdCAoVUNQSV9VQkgodWNwaSksIHVjcGktPmNfaXVzZWRvZmYsIHN0YXJ0KTsKIAkJaWYgKCEoYml0IDwgc3RhcnQpKSB7CiAJCQl1ZnNfZXJyb3IgKHNiLCAidWZzX25ld19pbm9kZSIsCiAJCQkgICAgImN5bGluZGVyIGdyb3VwICV1IGNvcnJ1cHRlZCAtIGVycm9yIGluIGlub2RlIGJpdG1hcFxuIiwgY2cpOwogCQkJZ290byBmYWlsZWQ7CiAJCX0KIAl9Ci0JVUZTRCgoInN0YXJ0ID0gJXUsIGJpdCA9ICV1LCBpcGcgPSAldVxuIiwgc3RhcnQsIGJpdCwgdXNwaS0+c19pcGcpKQotCWlmICh1YmhfaXNjbHIgKFVDUElfVUJILCB1Y3BpLT5jX2l1c2Vkb2ZmLCBiaXQpKQotCQl1Ymhfc2V0Yml0IChVQ1BJX1VCSCwgdWNwaS0+Y19pdXNlZG9mZiwgYml0KTsKKwlVRlNEKCJzdGFydCA9ICV1LCBiaXQgPSAldSwgaXBnID0gJXVcbiIsIHN0YXJ0LCBiaXQsIHVzcGktPnNfaXBnKTsKKwlpZiAodWJoX2lzY2xyIChVQ1BJX1VCSCh1Y3BpKSwgdWNwaS0+Y19pdXNlZG9mZiwgYml0KSkKKwkJdWJoX3NldGJpdCAoVUNQSV9VQkgodWNwaSksIHVjcGktPmNfaXVzZWRvZmYsIGJpdCk7CiAJZWxzZSB7CiAJCXVmc19wYW5pYyAoc2IsICJ1ZnNfbmV3X2lub2RlIiwgImludGVybmFsIGVycm9yIik7CiAJCWdvdG8gZmFpbGVkOwogCX0KIAkKIAlmczMyX3N1YihzYiwgJnVjZy0+Y2dfY3MuY3NfbmlmcmVlLCAxKTsKLQlmczMyX3N1YihzYiwgJnVzYjEtPmZzX2NzdG90YWwuY3NfbmlmcmVlLCAxKTsKKwl1c3BpLT5jc190b3RhbC5jc19uaWZyZWUtLTsKIAlmczMyX3N1YihzYiwgJnNiaS0+ZnNfY3MoY2cpLmNzX25pZnJlZSwgMSk7CiAJCiAJaWYgKFNfSVNESVIobW9kZSkpIHsKIAkJZnMzMl9hZGQoc2IsICZ1Y2ctPmNnX2NzLmNzX25kaXIsIDEpOwotCQlmczMyX2FkZChzYiwgJnVzYjEtPmZzX2NzdG90YWwuY3NfbmRpciwgMSk7CisJCXVzcGktPmNzX3RvdGFsLmNzX25kaXIrKzsKIAkJZnMzMl9hZGQoc2IsICZzYmktPmZzX2NzKGNnKS5jc19uZGlyLCAxKTsKIAl9CiAKLQl1YmhfbWFya19idWZmZXJfZGlydHkgKFVTUElfVUJIKTsKLQl1YmhfbWFya19idWZmZXJfZGlydHkgKFVDUElfVUJIKTsKKwl1YmhfbWFya19idWZmZXJfZGlydHkgKFVTUElfVUJIKHVzcGkpKTsKKwl1YmhfbWFya19idWZmZXJfZGlydHkgKFVDUElfVUJIKHVjcGkpKTsKIAlpZiAoc2ItPnNfZmxhZ3MgJiBNU19TWU5DSFJPTk9VUykgewotCQl1YmhfbGxfcndfYmxvY2sgKFNXUklURSwgMSwgKHN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgKiopICZ1Y3BpKTsKLQkJdWJoX3dhaXRfb25fYnVmZmVyIChVQ1BJX1VCSCk7CisJCXViaF9sbF9yd19ibG9jayhTV1JJVEUsIFVDUElfVUJIKHVjcGkpKTsKKwkJdWJoX3dhaXRfb25fYnVmZmVyIChVQ1BJX1VCSCh1Y3BpKSk7CiAJfQogCXNiLT5zX2RpcnQgPSAxOwogCkBAIC0yNzIsNiArMjY0LDcgQEAKIAl1ZnNpLT5pX3NoYWRvdyA9IDA7CiAJdWZzaS0+aV9vc3luYyA9IDA7CiAJdWZzaS0+aV9vZWZ0ZmxhZyA9IDA7CisJdWZzaS0+aV9kaXJfc3RhcnRfbG9va3VwID0gMDsKIAltZW1zZXQoJnVmc2ktPmlfdTEsIDAsIHNpemVvZih1ZnNpLT5pX3UxKSk7CiAKIAlpbnNlcnRfaW5vZGVfaGFzaChpbm9kZSk7CkBAIC0yODcsMTQgKzI4MCwxNCBAQAogCQlyZXR1cm4gRVJSX1BUUigtRURRVU9UKTsKIAl9CiAKLQlVRlNEKCgiYWxsb2NhdGluZyBpbm9kZSAlbHVcbiIsIGlub2RlLT5pX2lubykpCi0JVUZTRCgoIkVYSVRcbiIpKQorCVVGU0QoImFsbG9jYXRpbmcgaW5vZGUgJWx1XG4iLCBpbm9kZS0+aV9pbm8pOworCVVGU0QoIkVYSVRcbiIpOwogCXJldHVybiBpbm9kZTsKIAogZmFpbGVkOgogCXVubG9ja19zdXBlciAoc2IpOwogCW1ha2VfYmFkX2lub2RlKGlub2RlKTsKIAlpcHV0IChpbm9kZSk7Ci0JVUZTRCgoIkVYSVQgKEZBSUxFRClcbiIpKQorCVVGU0QoIkVYSVQgKEZBSUxFRClcbiIpOwogCXJldHVybiBFUlJfUFRSKC1FTk9TUEMpOwogfQpkaWZmIC0tZ2l0IGEvZnMvdWZzL2lub2RlLmMgYi9mcy91ZnMvaW5vZGUuYwppbmRleCAzYzNmNjJjLi5mMmRiZGY1IDEwMDY0NAotLS0gYS9mcy91ZnMvaW5vZGUuYworKysgYi9mcy91ZnMvaW5vZGUuYwpAQCAtNDEsMTQgKzQxLDcgQEAKICNpbmNsdWRlICJzd2FiLmgiCiAjaW5jbHVkZSAidXRpbC5oIgogCi0jdW5kZWYgVUZTX0lOT0RFX0RFQlVHCi0jdW5kZWYgVUZTX0lOT0RFX0RFQlVHX01PUkUKLQotI2lmZGVmIFVGU19JTk9ERV9ERUJVRwotI2RlZmluZSBVRlNEKHgpIHByaW50aygiKCVzLCAlZCksICVzOiAiLCBfX0ZJTEVfXywgX19MSU5FX18sIF9fRlVOQ1RJT05fXyk7IHByaW50ayB4OwotI2Vsc2UKLSNkZWZpbmUgVUZTRCh4KQotI2VuZGlmCitzdGF0aWMgdTY0IHVmc19mcmFnX21hcChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzZWN0b3JfdCBmcmFnKTsKIAogc3RhdGljIGludCB1ZnNfYmxvY2tfdG9fcGF0aChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzZWN0b3JfdCBpX2Jsb2NrLCBzZWN0b3JfdCBvZmZzZXRzWzRdKQogewpAQCAtNjEsNyArNTQsNyBAQAogCWludCBuID0gMDsKIAogCi0JVUZTRCgoInB0cnM9dXNwaS0+c19hcGIgPSAlZCxkb3VibGVfYmxvY2tzPSVsZCBcbiIscHRycyxkb3VibGVfYmxvY2tzKSk7CisJVUZTRCgicHRycz11c3BpLT5zX2FwYiA9ICVkLGRvdWJsZV9ibG9ja3M9JWxkIFxuIixwdHJzLGRvdWJsZV9ibG9ja3MpOwogCWlmIChpX2Jsb2NrIDwgMCkgewogCQl1ZnNfd2FybmluZyhpbm9kZS0+aV9zYiwgInVmc19ibG9ja190b19wYXRoIiwgImJsb2NrIDwgMCIpOwogCX0gZWxzZSBpZiAoaV9ibG9jayA8IGRpcmVjdF9ibG9ja3MpIHsKQEAgLTg5LDcgKzgyLDcgQEAKICAqIHRoZSBiZWdpbmluZyBvZiB0aGUgZmlsZXN5c3RlbS4KICAqLwogCi11NjQgIHVmc19mcmFnX21hcChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzZWN0b3JfdCBmcmFnKQorc3RhdGljIHU2NCB1ZnNfZnJhZ19tYXAoc3RydWN0IGlub2RlICppbm9kZSwgc2VjdG9yX3QgZnJhZykKIHsKIAlzdHJ1Y3QgdWZzX2lub2RlX2luZm8gKnVmc2kgPSBVRlNfSShpbm9kZSk7CiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOwpAQCAtMTA0LDggKzk3LDggQEAKIAl1bnNpZ25lZCBmbGFncyA9IFVGU19TQihzYiktPnNfZmxhZ3M7CiAJdTY0IHRlbXAgPSAwTDsKIAotCVVGU0QoKCI6IGZyYWcgPSAlbGx1ICBkZXB0aCA9ICVkXG4iLCAodW5zaWduZWQgbG9uZyBsb25nKWZyYWcsIGRlcHRoKSk7Ci0JVUZTRCgoIjogdXNwaS0+c19mcGJzaGlmdCA9ICVkICx1c3BpLT5zX2FwYm1hc2sgPSAleCwgbWFzaz0lbGx4XG4iLHVzcGktPnNfZnBic2hpZnQsdXNwaS0+c19hcGJtYXNrLG1hc2spKTsKKwlVRlNEKCI6IGZyYWcgPSAlbGx1ICBkZXB0aCA9ICVkXG4iLCAodW5zaWduZWQgbG9uZyBsb25nKWZyYWcsIGRlcHRoKTsKKwlVRlNEKCI6IHVzcGktPnNfZnBic2hpZnQgPSAlZCAsdXNwaS0+c19hcGJtYXNrID0gJXgsIG1hc2s9JWxseFxuIix1c3BpLT5zX2ZwYnNoaWZ0LHVzcGktPnNfYXBibWFzayxtYXNrKTsKIAogCWlmIChkZXB0aCA9PSAwKQogCQlyZXR1cm4gMDsKQEAgLTE2MSwyNiArMTU0LDY0IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHN0cnVjdCBidWZmZXJfaGVhZCAqIHVmc19pbm9kZV9nZXRmcmFnIChzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCXVuc2lnbmVkIGludCBmcmFnbWVudCwgdW5zaWduZWQgaW50IG5ld19mcmFnbWVudCwKLQl1bnNpZ25lZCBpbnQgcmVxdWlyZWQsIGludCAqZXJyLCBpbnQgbWV0YWRhdGEsIGxvbmcgKnBoeXMsIGludCAqbmV3KQorc3RhdGljIHZvaWQgdWZzX2NsZWFyX2ZyYWcoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlsb2NrX2J1ZmZlcihiaCk7CisJbWVtc2V0KGJoLT5iX2RhdGEsIDAsIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSk7CisJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CisJbWFya19idWZmZXJfZGlydHkoYmgpOworCXVubG9ja19idWZmZXIoYmgpOworCWlmIChJU19TWU5DKGlub2RlKSkKKwkJc3luY19kaXJ0eV9idWZmZXIoYmgpOworfQorCitzdGF0aWMgc3RydWN0IGJ1ZmZlcl9oZWFkICoKK3Vmc19jbGVhcl9mcmFncyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzZWN0b3JfdCBiZWcsCisJCXVuc2lnbmVkIGludCBuKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqcmVzLCAqYmg7CisJc2VjdG9yX3QgZW5kID0gYmVnICsgbjsKKworCXJlcyA9IHNiX2dldGJsayhpbm9kZS0+aV9zYiwgYmVnKTsKKwl1ZnNfY2xlYXJfZnJhZyhpbm9kZSwgcmVzKTsKKwlmb3IgKCsrYmVnOyBiZWcgPCBlbmQ7ICsrYmVnKSB7CisJCWJoID0gc2JfZ2V0YmxrKGlub2RlLT5pX3NiLCBiZWcpOworCQl1ZnNfY2xlYXJfZnJhZyhpbm9kZSwgYmgpOworCQlicmVsc2UoYmgpOworCX0KKwlyZXR1cm4gcmVzOworfQorCisvKioKKyAqIHVmc19pbm9kZV9nZXRmcmFnKCkgLSBhbGxvY2F0ZSBuZXcgZnJhZ21lbnQocykKKyAqIEBpbm9kZSAtIHBvaW50ZXIgdG8gaW5vZGUKKyAqIEBmcmFnbWVudCAtIG51bWJlciBvZiBgZnJhZ21lbnQnIHdoaWNoIGhvbGQgcG9pbnRlcgorICogICB0byBuZXcgYWxsb2NhdGVkIGZyYWdtZW50KHMpCisgKiBAbmV3X2ZyYWdtZW50IC0gbnVtYmVyIG9mIG5ldyBhbGxvY2F0ZWQgZnJhZ21lbnQocykKKyAqIEByZXF1aXJlZCAtIGhvdyBtYW55IGZyYWdtZW50KHMpIHdlIHJlcXVpcmUKKyAqIEBlcnIgLSB3ZSBzZXQgaXQgaWYgc29tZXRoaW5nIHdyb25nCisgKiBAcGh5cyAtIHBvaW50ZXIgdG8gd2hlcmUgd2Ugc2F2ZSBwaHlzaWNhbCBudW1iZXIgb2YgbmV3IGFsbG9jYXRlZCBmcmFnbWVudHMsCisgKiAgIE5VTEwgaWYgd2UgYWxsb2NhdGUgbm90IGRhdGEoaW5kaXJlY3QgYmxvY2tzIGZvciBleGFtcGxlKS4KKyAqIEBuZXcgLSB3ZSBzZXQgaXQgaWYgd2UgYWxsb2NhdGUgbmV3IGJsb2NrCisgKiBAbG9ja2VkX3BhZ2UgLSBmb3IgdWZzX25ld19mcmFnbWVudHMoKQorICovCitzdGF0aWMgc3RydWN0IGJ1ZmZlcl9oZWFkICoKK3Vmc19pbm9kZV9nZXRmcmFnKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHVuc2lnbmVkIGludCBmcmFnbWVudCwKKwkJICBzZWN0b3JfdCBuZXdfZnJhZ21lbnQsIHVuc2lnbmVkIGludCByZXF1aXJlZCwgaW50ICplcnIsCisJCSAgbG9uZyAqcGh5cywgaW50ICpuZXcsIHN0cnVjdCBwYWdlICpsb2NrZWRfcGFnZSkKIHsKIAlzdHJ1Y3QgdWZzX2lub2RlX2luZm8gKnVmc2kgPSBVRlNfSShpbm9kZSk7Ci0Jc3RydWN0IHN1cGVyX2Jsb2NrICogc2I7Ci0Jc3RydWN0IHVmc19zYl9wcml2YXRlX2luZm8gKiB1c3BpOworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKwlzdHJ1Y3QgdWZzX3NiX3ByaXZhdGVfaW5mbyAqdXNwaSA9IFVGU19TQihzYiktPnNfdXNwaTsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiByZXN1bHQ7CiAJdW5zaWduZWQgYmxvY2ssIGJsb2Nrb2ZmLCBsYXN0ZnJhZywgbGFzdGJsb2NrLCBsYXN0YmxvY2tvZmY7CiAJdW5zaWduZWQgdG1wLCBnb2FsOwogCV9fZnMzMiAqIHAsICogcDI7Ci0JdW5zaWduZWQgZmxhZ3MgPSAwOwogCi0JVUZTRCgoIkVOVEVSLCBpbm8gJWx1LCBmcmFnbWVudCAldSwgbmV3X2ZyYWdtZW50ICV1LCByZXF1aXJlZCAldVxuIiwKLQkJaW5vZGUtPmlfaW5vLCBmcmFnbWVudCwgbmV3X2ZyYWdtZW50LCByZXF1aXJlZCkpICAgICAgICAgCisJVUZTRCgiRU5URVIsIGlubyAlbHUsIGZyYWdtZW50ICV1LCBuZXdfZnJhZ21lbnQgJWxsdSwgcmVxdWlyZWQgJXUsICIKKwkgICAgICJtZXRhZGF0YSAlZFxuIiwgaW5vZGUtPmlfaW5vLCBmcmFnbWVudCwKKwkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbmV3X2ZyYWdtZW50LCByZXF1aXJlZCwgIXBoeXMpOwogCi0Jc2IgPSBpbm9kZS0+aV9zYjsKLQl1c3BpID0gVUZTX1NCKHNiKS0+c191c3BpOwotCi0JZmxhZ3MgPSBVRlNfU0Ioc2IpLT5zX2ZsYWdzOwogICAgICAgICAvKiBUT0RPIDogdG8gYmUgZG9uZSBmb3Igd3JpdGUgc3VwcG9ydAogICAgICAgICBpZiAoIChmbGFncyAmIFVGU19UWVBFX01BU0spID09IFVGU19UWVBFX1VGUzIpCiAgICAgICAgICAgICAgZ290byB1ZnMyOwpAQCAtMTk1LDE2ICsyMjYsMTYgQEAKIAl0bXAgPSBmczMyX3RvX2NwdShzYiwgKnApOwogCWxhc3RmcmFnID0gdWZzaS0+aV9sYXN0ZnJhZzsKIAlpZiAodG1wICYmIGZyYWdtZW50IDwgbGFzdGZyYWcpIHsKLQkJaWYgKG1ldGFkYXRhKSB7CisJCWlmICghcGh5cykgewogCQkJcmVzdWx0ID0gc2JfZ2V0YmxrKHNiLCB1c3BpLT5zX3NiYmFzZSArIHRtcCArIGJsb2Nrb2ZmKTsKIAkJCWlmICh0bXAgPT0gZnMzMl90b19jcHUoc2IsICpwKSkgewotCQkJCVVGU0QoKCJFWElULCByZXN1bHQgJXVcbiIsIHRtcCArIGJsb2Nrb2ZmKSkKKwkJCQlVRlNEKCJFWElULCByZXN1bHQgJXVcbiIsIHRtcCArIGJsb2Nrb2ZmKTsKIAkJCQlyZXR1cm4gcmVzdWx0OwogCQkJfQogCQkJYnJlbHNlIChyZXN1bHQpOwogCQkJZ290byByZXBlYXQ7CiAJCX0gZWxzZSB7Ci0JCQkqcGh5cyA9IHRtcDsKKwkJCSpwaHlzID0gdG1wICsgYmxvY2tvZmY7CiAJCQlyZXR1cm4gTlVMTDsKIAkJfQogCX0KQEAgLTIyMSw3ICsyNTIsOCBAQAogCQlpZiAobGFzdGJsb2Nrb2ZmKSB7CiAJCQlwMiA9IHVmc2ktPmlfdTEuaV9kYXRhICsgbGFzdGJsb2NrOwogCQkJdG1wID0gdWZzX25ld19mcmFnbWVudHMgKGlub2RlLCBwMiwgbGFzdGZyYWcsIAotCQkJCWZzMzJfdG9fY3B1KHNiLCAqcDIpLCB1c3BpLT5zX2ZwYiAtIGxhc3RibG9ja29mZiwgZXJyKTsKKwkJCQkJCSBmczMyX3RvX2NwdShzYiwgKnAyKSwgdXNwaS0+c19mcGIgLSBsYXN0YmxvY2tvZmYsCisJCQkJCQkgZXJyLCBsb2NrZWRfcGFnZSk7CiAJCQlpZiAoIXRtcCkgewogCQkJCWlmIChsYXN0ZnJhZyAhPSB1ZnNpLT5pX2xhc3RmcmFnKQogCQkJCQlnb3RvIHJlcGVhdDsKQEAgLTIzMywxNCArMjY1LDE2IEBACiAJCX0KIAkJZ29hbCA9IGZzMzJfdG9fY3B1KHNiLCB1ZnNpLT5pX3UxLmlfZGF0YVtsYXN0YmxvY2tdKSArIHVzcGktPnNfZnBiOwogCQl0bXAgPSB1ZnNfbmV3X2ZyYWdtZW50cyAoaW5vZGUsIHAsIGZyYWdtZW50IC0gYmxvY2tvZmYsIAotCQkJZ29hbCwgcmVxdWlyZWQgKyBibG9ja29mZiwgZXJyKTsKKwkJCQkJIGdvYWwsIHJlcXVpcmVkICsgYmxvY2tvZmYsCisJCQkJCSBlcnIsIGxvY2tlZF9wYWdlKTsKIAl9CiAJLyoKIAkgKiBXZSB3aWxsIGV4dGVuZCBsYXN0IGFsbG9jYXRlZCBibG9jawogCSAqLwogCWVsc2UgaWYgKGxhc3RibG9jayA9PSBibG9jaykgewotCQl0bXAgPSB1ZnNfbmV3X2ZyYWdtZW50cyAoaW5vZGUsIHAsIGZyYWdtZW50IC0gKGJsb2Nrb2ZmIC0gbGFzdGJsb2Nrb2ZmKSwKLQkJCWZzMzJfdG9fY3B1KHNiLCAqcCksIHJlcXVpcmVkICsgIChibG9ja29mZiAtIGxhc3RibG9ja29mZiksIGVycik7CisJCXRtcCA9IHVmc19uZXdfZnJhZ21lbnRzKGlub2RlLCBwLCBmcmFnbWVudCAtIChibG9ja29mZiAtIGxhc3RibG9ja29mZiksCisJCQkJCWZzMzJfdG9fY3B1KHNiLCAqcCksIHJlcXVpcmVkICsgIChibG9ja29mZiAtIGxhc3RibG9ja29mZiksCisJCQkJCWVyciwgbG9ja2VkX3BhZ2UpOwogCX0KIAkvKgogCSAqIFdlIHdpbGwgYWxsb2NhdGUgbmV3IGJsb2NrIGJlZm9yZSBsYXN0IGFsbG9jYXRlZCBibG9jawpAQCAtMjQ4LDggKzI4Miw4IEBACiAJZWxzZSAvKiAobGFzdGJsb2NrID4gYmxvY2spICovIHsKIAkJaWYgKGxhc3RibG9jayAmJiAodG1wID0gZnMzMl90b19jcHUoc2IsIHVmc2ktPmlfdTEuaV9kYXRhW2xhc3RibG9jay0xXSkpKQogCQkJZ29hbCA9IHRtcCArIHVzcGktPnNfZnBiOwotCQl0bXAgPSB1ZnNfbmV3X2ZyYWdtZW50cyAoaW5vZGUsIHAsIGZyYWdtZW50IC0gYmxvY2tvZmYsIAotCQkJZ29hbCwgdXNwaS0+c19mcGIsIGVycik7CisJCXRtcCA9IHVmc19uZXdfZnJhZ21lbnRzKGlub2RlLCBwLCBmcmFnbWVudCAtIGJsb2Nrb2ZmLAorCQkJCQlnb2FsLCB1c3BpLT5zX2ZwYiwgZXJyLCBsb2NrZWRfcGFnZSk7CiAJfQogCWlmICghdG1wKSB7CiAJCWlmICgoIWJsb2Nrb2ZmICYmICpwKSB8fCAKQEAgLTI1OSwxNCArMjkzLDEwIEBACiAJCXJldHVybiBOVUxMOwogCX0KIAotCS8qIFRoZSBudWxsaWZpY2F0aW9uIG9mIGZyYW1nZW50cyBkb25lIGluIHVmcy9iYWxsb2MuYyBpcwotCSAqIHNvbWV0aGluZyBJIGRvbid0IGhhdmUgdGhlIHN0b21hY2hlIHRvIG1vdmUgaW50byBoZXJlIHJpZ2h0Ci0JICogbm93LiAtRGF2ZU0KLQkgKi8KLQlpZiAobWV0YWRhdGEpIHsKLQkJcmVzdWx0ID0gc2JfZ2V0YmxrKGlub2RlLT5pX3NiLCB0bXAgKyBibG9ja29mZik7CisJaWYgKCFwaHlzKSB7CisJCXJlc3VsdCA9IHVmc19jbGVhcl9mcmFncyhpbm9kZSwgdG1wICsgYmxvY2tvZmYsIHJlcXVpcmVkKTsKIAl9IGVsc2UgewotCQkqcGh5cyA9IHRtcDsKKwkJKnBoeXMgPSB0bXAgKyBibG9ja29mZjsKIAkJcmVzdWx0ID0gTlVMTDsKIAkJKmVyciA9IDA7CiAJCSpuZXcgPSAxOwpAQCAtMjc2LDcgKzMwNiw3IEBACiAJaWYgKElTX1NZTkMoaW5vZGUpKQogCQl1ZnNfc3luY19pbm9kZSAoaW5vZGUpOwogCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOwotCVVGU0QoKCJFWElULCByZXN1bHQgJXVcbiIsIHRtcCArIGJsb2Nrb2ZmKSkKKwlVRlNEKCJFWElULCByZXN1bHQgJXVcbiIsIHRtcCArIGJsb2Nrb2ZmKTsKIAlyZXR1cm4gcmVzdWx0OwogCiAgICAgIC8qIFRoaXMgcGFydCA6IFRvIGJlIGltcGxlbWVudGVkIC4uLi4KQEAgLTI5NSwyMiArMzI1LDM1IEBACiAgICAgICovCiB9CiAKLXN0YXRpYyBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiB1ZnNfYmxvY2tfZ2V0ZnJhZyAoc3RydWN0IGlub2RlICppbm9kZSwKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCB1bnNpZ25lZCBpbnQgZnJhZ21lbnQsIHVuc2lnbmVkIGludCBuZXdfZnJhZ21lbnQsIAotCXVuc2lnbmVkIGludCBibG9ja3NpemUsIGludCAqIGVyciwgaW50IG1ldGFkYXRhLCBsb25nICpwaHlzLCBpbnQgKm5ldykKKy8qKgorICogdWZzX2lub2RlX2dldGJsb2NrKCkgLSBhbGxvY2F0ZSBuZXcgYmxvY2sKKyAqIEBpbm9kZSAtIHBvaW50ZXIgdG8gaW5vZGUKKyAqIEBiaCAtIHBvaW50ZXIgdG8gYmxvY2sgd2hpY2ggaG9sZCAicG9pbnRlciIgdG8gbmV3IGFsbG9jYXRlZCBibG9jaworICogQGZyYWdtZW50IC0gbnVtYmVyIG9mIGBmcmFnbWVudCcgd2hpY2ggaG9sZCBwb2ludGVyCisgKiAgIHRvIG5ldyBhbGxvY2F0ZWQgYmxvY2sKKyAqIEBuZXdfZnJhZ21lbnQgLSBudW1iZXIgb2YgbmV3IGFsbG9jYXRlZCBmcmFnbWVudAorICogIChibG9jayB3aWxsIGhvbGQgdGhpcyBmcmFnbWVudCBhbmQgYWxzbyB1c3BpLT5zX2ZwYi0xKQorICogQGVyciAtIHNlZSB1ZnNfaW5vZGVfZ2V0ZnJhZygpCisgKiBAcGh5cyAtIHNlZSB1ZnNfaW5vZGVfZ2V0ZnJhZygpCisgKiBAbmV3IC0gc2VlIHVmc19pbm9kZV9nZXRmcmFnKCkKKyAqIEBsb2NrZWRfcGFnZSAtIHNlZSB1ZnNfaW5vZGVfZ2V0ZnJhZygpCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYnVmZmVyX2hlYWQgKgordWZzX2lub2RlX2dldGJsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsCisJCSAgdW5zaWduZWQgaW50IGZyYWdtZW50LCBzZWN0b3JfdCBuZXdfZnJhZ21lbnQsIGludCAqZXJyLAorCQkgIGxvbmcgKnBoeXMsIGludCAqbmV3LCBzdHJ1Y3QgcGFnZSAqbG9ja2VkX3BhZ2UpCiB7Ci0Jc3RydWN0IHN1cGVyX2Jsb2NrICogc2I7Ci0Jc3RydWN0IHVmc19zYl9wcml2YXRlX2luZm8gKiB1c3BpOworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKwlzdHJ1Y3QgdWZzX3NiX3ByaXZhdGVfaW5mbyAqdXNwaSA9IFVGU19TQihzYiktPnNfdXNwaTsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiByZXN1bHQ7CiAJdW5zaWduZWQgdG1wLCBnb2FsLCBibG9jaywgYmxvY2tvZmY7CiAJX19mczMyICogcDsKIAotCXNiID0gaW5vZGUtPmlfc2I7Ci0JdXNwaSA9IFVGU19TQihzYiktPnNfdXNwaTsKIAlibG9jayA9IHVmc19mcmFnc3RvYmxrcyAoZnJhZ21lbnQpOwogCWJsb2Nrb2ZmID0gdWZzX2ZyYWdudW0gKGZyYWdtZW50KTsKIAotCVVGU0QoKCJFTlRFUiwgaW5vICVsdSwgZnJhZ21lbnQgJXUsIG5ld19mcmFnbWVudCAldVxuIiwgaW5vZGUtPmlfaW5vLCBmcmFnbWVudCwgbmV3X2ZyYWdtZW50KSkJCisJVUZTRCgiRU5URVIsIGlubyAlbHUsIGZyYWdtZW50ICV1LCBuZXdfZnJhZ21lbnQgJWxsdSwgbWV0YWRhdGEgJWRcbiIsCisJICAgICBpbm9kZS0+aV9pbm8sIGZyYWdtZW50LCAodW5zaWduZWQgbG9uZyBsb25nKW5ld19mcmFnbWVudCwgIXBoeXMpOwogCiAJcmVzdWx0ID0gTlVMTDsKIAlpZiAoIWJoKQpAQCAtMzI2LDE0ICszNjksMTQgQEAKIHJlcGVhdDoKIAl0bXAgPSBmczMyX3RvX2NwdShzYiwgKnApOwogCWlmICh0bXApIHsKLQkJaWYgKG1ldGFkYXRhKSB7CisJCWlmICghcGh5cykgewogCQkJcmVzdWx0ID0gc2JfZ2V0YmxrKHNiLCB1c3BpLT5zX3NiYmFzZSArIHRtcCArIGJsb2Nrb2ZmKTsKIAkJCWlmICh0bXAgPT0gZnMzMl90b19jcHUoc2IsICpwKSkKIAkJCQlnb3RvIG91dDsKIAkJCWJyZWxzZSAocmVzdWx0KTsKIAkJCWdvdG8gcmVwZWF0OwogCQl9IGVsc2UgewotCQkJKnBoeXMgPSB0bXA7CisJCQkqcGh5cyA9IHRtcCArIGJsb2Nrb2ZmOwogCQkJZ290byBvdXQ7CiAJCX0KIAl9CkBAIC0zNDIsMjEgKzM4NSwxOSBAQAogCQlnb2FsID0gdG1wICsgdXNwaS0+c19mcGI7CiAJZWxzZQogCQlnb2FsID0gYmgtPmJfYmxvY2tuciArIHVzcGktPnNfZnBiOwotCXRtcCA9IHVmc19uZXdfZnJhZ21lbnRzIChpbm9kZSwgcCwgdWZzX2Jsa251bShuZXdfZnJhZ21lbnQpLCBnb2FsLCB1c3BpLT5zX2ZwYiwgZXJyKTsKKwl0bXAgPSB1ZnNfbmV3X2ZyYWdtZW50cyhpbm9kZSwgcCwgdWZzX2Jsa251bShuZXdfZnJhZ21lbnQpLCBnb2FsLAorCQkJCXVzcGktPnNfZnBiLCBlcnIsIGxvY2tlZF9wYWdlKTsKIAlpZiAoIXRtcCkgewogCQlpZiAoZnMzMl90b19jcHUoc2IsICpwKSkKIAkJCWdvdG8gcmVwZWF0OwogCQlnb3RvIG91dDsKIAl9CQkKIAotCS8qIFRoZSBudWxsaWZpY2F0aW9uIG9mIGZyYW1nZW50cyBkb25lIGluIHVmcy9iYWxsb2MuYyBpcwotCSAqIHNvbWV0aGluZyBJIGRvbid0IGhhdmUgdGhlIHN0b21hY2hlIHRvIG1vdmUgaW50byBoZXJlIHJpZ2h0Ci0JICogbm93LiAtRGF2ZU0KLQkgKi8KLQlpZiAobWV0YWRhdGEpIHsKLQkJcmVzdWx0ID0gc2JfZ2V0YmxrKHNiLCB0bXAgKyBibG9ja29mZik7CisKKwlpZiAoIXBoeXMpIHsKKwkJcmVzdWx0ID0gdWZzX2NsZWFyX2ZyYWdzKGlub2RlLCB0bXAgKyBibG9ja29mZiwgdXNwaS0+c19mcGIpOwogCX0gZWxzZSB7Ci0JCSpwaHlzID0gdG1wOworCQkqcGh5cyA9IHRtcCArIGJsb2Nrb2ZmOwogCQkqbmV3ID0gMTsKIAl9CiAKQEAgLTM2NSwxOCArNDA2LDE5IEBACiAJCXN5bmNfZGlydHlfYnVmZmVyKGJoKTsKIAlpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CiAJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7Ci0JVUZTRCgoInJlc3VsdCAldVxuIiwgdG1wICsgYmxvY2tvZmYpKTsKKwlVRlNEKCJyZXN1bHQgJXVcbiIsIHRtcCArIGJsb2Nrb2ZmKTsKIG91dDoKIAlicmVsc2UgKGJoKTsKLQlVRlNEKCgiRVhJVFxuIikpOworCVVGU0QoIkVYSVRcbiIpOwogCXJldHVybiByZXN1bHQ7CiB9CiAKLS8qCi0gKiBUaGlzIGZ1bmN0aW9uIGdldHMgdGhlIGJsb2NrIHdoaWNoIGNvbnRhaW5zIHRoZSBmcmFnbWVudC4KKy8qKgorICogdWZzX2dldGZyYWdfYmxvYygpIC0gYGdldF9ibG9ja190JyBmdW5jdGlvbiwgaW50ZXJmYWNlIGJldHdlZW4gVUZTIGFuZAorICogcmVhZHBhZ2UsIHdyaXRlcGFnZSBhbmQgc28gb24KICAqLwogCi1pbnQgdWZzX2dldGZyYWdfYmxvY2sgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHNlY3Rvcl90IGZyYWdtZW50LCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoX3Jlc3VsdCwgaW50IGNyZWF0ZSkKK2ludCB1ZnNfZ2V0ZnJhZ19ibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzZWN0b3JfdCBmcmFnbWVudCwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaF9yZXN1bHQsIGludCBjcmVhdGUpCiB7CiAJc3RydWN0IHN1cGVyX2Jsb2NrICogc2IgPSBpbm9kZS0+aV9zYjsKIAlzdHJ1Y3QgdWZzX3NiX3ByaXZhdGVfaW5mbyAqIHVzcGkgPSBVRlNfU0Ioc2IpLT5zX3VzcGk7CkBAIC0zODcsNyArNDI5LDcgQEAKIAkKIAlpZiAoIWNyZWF0ZSkgewogCQlwaHlzNjQgPSB1ZnNfZnJhZ19tYXAoaW5vZGUsIGZyYWdtZW50KTsKLQkJVUZTRCgoInBoeXM2NCA9ICVsbHUgXG4iLHBoeXM2NCkpOworCQlVRlNEKCJwaHlzNjQgPSAlbGx1IFxuIixwaHlzNjQpOwogCQlpZiAocGh5czY0KQogCQkJbWFwX2JoKGJoX3Jlc3VsdCwgc2IsIHBoeXM2NCk7CiAJCXJldHVybiAwOwpAQCAtNDAyLDcgKzQ0NCw3IEBACiAKIAlsb2NrX2tlcm5lbCgpOwogCi0JVUZTRCgoIkVOVEVSLCBpbm8gJWx1LCBmcmFnbWVudCAlbGx1XG4iLCBpbm9kZS0+aV9pbm8sICh1bnNpZ25lZCBsb25nIGxvbmcpZnJhZ21lbnQpKQorCVVGU0QoIkVOVEVSLCBpbm8gJWx1LCBmcmFnbWVudCAlbGx1XG4iLCBpbm9kZS0+aV9pbm8sICh1bnNpZ25lZCBsb25nIGxvbmcpZnJhZ21lbnQpOwogCWlmIChmcmFnbWVudCA8IDApCiAJCWdvdG8gYWJvcnRfbmVnYXRpdmU7CiAJaWYgKGZyYWdtZW50ID4KQEAgLTQxOCwxNSArNDYwLDE1IEBACiAJICogaXQgbXVjaCBtb3JlIHJlYWRhYmxlOgogCSAqLwogI2RlZmluZSBHRVRfSU5PREVfREFUQUJMT0NLKHgpIFwKLQkJdWZzX2lub2RlX2dldGZyYWcoaW5vZGUsIHgsIGZyYWdtZW50LCAxLCAmZXJyLCAwLCAmcGh5cywgJm5ldykKKwl1ZnNfaW5vZGVfZ2V0ZnJhZyhpbm9kZSwgeCwgZnJhZ21lbnQsIDEsICZlcnIsICZwaHlzLCAmbmV3LCBiaF9yZXN1bHQtPmJfcGFnZSkKICNkZWZpbmUgR0VUX0lOT0RFX1BUUih4KSBcCi0JCXVmc19pbm9kZV9nZXRmcmFnKGlub2RlLCB4LCBmcmFnbWVudCwgdXNwaS0+c19mcGIsICZlcnIsIDEsIE5VTEwsIE5VTEwpCisJdWZzX2lub2RlX2dldGZyYWcoaW5vZGUsIHgsIGZyYWdtZW50LCB1c3BpLT5zX2ZwYiwgJmVyciwgTlVMTCwgTlVMTCwgYmhfcmVzdWx0LT5iX3BhZ2UpCiAjZGVmaW5lIEdFVF9JTkRJUkVDVF9EQVRBQkxPQ0soeCkgXAotCQl1ZnNfYmxvY2tfZ2V0ZnJhZyhpbm9kZSwgYmgsIHgsIGZyYWdtZW50LCBzYi0+c19ibG9ja3NpemUsIFwKLQkJCQkgICZlcnIsIDAsICZwaHlzLCAmbmV3KTsKKwl1ZnNfaW5vZGVfZ2V0YmxvY2soaW5vZGUsIGJoLCB4LCBmcmFnbWVudCwJXAorCQkJICAmZXJyLCAmcGh5cywgJm5ldywgYmhfcmVzdWx0LT5iX3BhZ2UpOwogI2RlZmluZSBHRVRfSU5ESVJFQ1RfUFRSKHgpIFwKLQkJdWZzX2Jsb2NrX2dldGZyYWcoaW5vZGUsIGJoLCB4LCBmcmFnbWVudCwgc2ItPnNfYmxvY2tzaXplLCBcCi0JCQkJICAmZXJyLCAxLCBOVUxMLCBOVUxMKTsKKwl1ZnNfaW5vZGVfZ2V0YmxvY2soaW5vZGUsIGJoLCB4LCBmcmFnbWVudCwJXAorCQkJICAmZXJyLCBOVUxMLCBOVUxMLCBiaF9yZXN1bHQtPmJfcGFnZSk7CiAKIAlpZiAocHRyIDwgVUZTX05ESVJfRlJBR01FTlQpIHsKIAkJYmggPSBHRVRfSU5PREVfREFUQUJMT0NLKHB0cik7CkBAIC00NzQsOCArNTE2LDkgQEAKIAlnb3RvIGFib3J0OwogfQogCi1zdHJ1Y3QgYnVmZmVyX2hlYWQgKnVmc19nZXRmcmFnKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHVuc2lnbmVkIGludCBmcmFnbWVudCwKLQkJCQlpbnQgY3JlYXRlLCBpbnQgKmVycikKK3N0YXRpYyBzdHJ1Y3QgYnVmZmVyX2hlYWQgKnVmc19nZXRmcmFnKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCBmcmFnbWVudCwKKwkJCQkgICAgICAgaW50IGNyZWF0ZSwgaW50ICplcnIpCiB7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkIGR1bW15OwogCWludCBlcnJvcjsKQEAgLTUwMiw3ICs1NDUsNyBAQAogewogCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOwogCi0JVUZTRCgoIkVOVEVSLCBpbm8gJWx1LCBmcmFnbWVudCAldVxuIiwgaW5vZGUtPmlfaW5vLCBmcmFnbWVudCkpCisJVUZTRCgiRU5URVIsIGlubyAlbHUsIGZyYWdtZW50ICV1XG4iLCBpbm9kZS0+aV9pbm8sIGZyYWdtZW50KTsKIAliaCA9IHVmc19nZXRmcmFnIChpbm9kZSwgZnJhZ21lbnQsIGNyZWF0ZSwgZXJyKTsKIAlpZiAoIWJoIHx8IGJ1ZmZlcl91cHRvZGF0ZShiaCkpIAkJCiAJCXJldHVybiBiaDsKQEAgLTU0MCw2ICs1ODMsMjggQEAKIAkuYm1hcCA9IHVmc19ibWFwCiB9OwogCitzdGF0aWMgdm9pZCB1ZnNfc2V0X2lub2RlX29wcyhzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpKSB7CisJCWlub2RlLT5pX29wID0gJnVmc19maWxlX2lub2RlX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX2ZvcCA9ICZ1ZnNfZmlsZV9vcGVyYXRpb25zOworCQlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZ1ZnNfYW9wczsKKwl9IGVsc2UgaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpIHsKKwkJaW5vZGUtPmlfb3AgPSAmdWZzX2Rpcl9pbm9kZV9vcGVyYXRpb25zOworCQlpbm9kZS0+aV9mb3AgPSAmdWZzX2Rpcl9vcGVyYXRpb25zOworCQlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZ1ZnNfYW9wczsKKwl9IGVsc2UgaWYgKFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpIHsKKwkJaWYgKCFpbm9kZS0+aV9ibG9ja3MpCisJCQlpbm9kZS0+aV9vcCA9ICZ1ZnNfZmFzdF9zeW1saW5rX2lub2RlX29wZXJhdGlvbnM7CisJCWVsc2UgeworCQkJaW5vZGUtPmlfb3AgPSAmcGFnZV9zeW1saW5rX2lub2RlX29wZXJhdGlvbnM7CisJCQlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZ1ZnNfYW9wczsKKwkJfQorCX0gZWxzZQorCQlpbml0X3NwZWNpYWxfaW5vZGUoaW5vZGUsIGlub2RlLT5pX21vZGUsCisJCQkJICAgdWZzX2dldF9pbm9kZV9kZXYoaW5vZGUtPmlfc2IsIFVGU19JKGlub2RlKSkpOworfQorCiB2b2lkIHVmc19yZWFkX2lub2RlIChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSkKIHsKIAlzdHJ1Y3QgdWZzX2lub2RlX2luZm8gKnVmc2kgPSBVRlNfSShpbm9kZSk7CkBAIC01NTIsNyArNjE3LDcgQEAKIAl1bnNpZ25lZCBpOwogCXVuc2lnbmVkIGZsYWdzOwogCQotCVVGU0QoKCJFTlRFUiwgaW5vICVsdVxuIiwgaW5vZGUtPmlfaW5vKSkKKwlVRlNEKCJFTlRFUiwgaW5vICVsdVxuIiwgaW5vZGUtPmlfaW5vKTsKIAkKIAlzYiA9IGlub2RlLT5pX3NiOwogCXVzcGkgPSBVRlNfU0Ioc2IpLT5zX3VzcGk7CkBAIC02MDMsMzggKzY2OCwyMiBAQAogCXVmc2ktPmlfc2hhZG93ID0gZnMzMl90b19jcHUoc2IsIHVmc19pbm9kZS0+dWlfdTMudWlfc3VuLnVpX3NoYWRvdyk7CiAJdWZzaS0+aV9vZWZ0ZmxhZyA9IGZzMzJfdG9fY3B1KHNiLCB1ZnNfaW5vZGUtPnVpX3UzLnVpX3N1bi51aV9vZWZ0ZmxhZyk7CiAJdWZzaS0+aV9sYXN0ZnJhZyA9IChpbm9kZS0+aV9zaXplICsgdXNwaS0+c19mc2l6ZSAtIDEpID4+IHVzcGktPnNfZnNoaWZ0OworCXVmc2ktPmlfZGlyX3N0YXJ0X2xvb2t1cCA9IDA7CiAJCiAJaWYgKFNfSVNDSFIobW9kZSkgfHwgU19JU0JMSyhtb2RlKSB8fCBpbm9kZS0+aV9ibG9ja3MpIHsKIAkJZm9yIChpID0gMDsgaSA8IChVRlNfTkRBRERSICsgVUZTX05JTkRJUik7IGkrKykKIAkJCXVmc2ktPmlfdTEuaV9kYXRhW2ldID0gdWZzX2lub2RlLT51aV91Mi51aV9hZGRyLnVpX2RiW2ldOwotCX0KLQllbHNlIHsKKwl9IGVsc2UgewogCQlmb3IgKGkgPSAwOyBpIDwgKFVGU19OREFERFIgKyBVRlNfTklORElSKSAqIDQ7IGkrKykKIAkJCXVmc2ktPmlfdTEuaV9zeW1saW5rW2ldID0gdWZzX2lub2RlLT51aV91Mi51aV9zeW1saW5rW2ldOwogCX0KIAl1ZnNpLT5pX29zeW5jID0gMDsKIAotCWlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpKSB7Ci0JCWlub2RlLT5pX29wID0gJnVmc19maWxlX2lub2RlX29wZXJhdGlvbnM7Ci0JCWlub2RlLT5pX2ZvcCA9ICZ1ZnNfZmlsZV9vcGVyYXRpb25zOwotCQlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZ1ZnNfYW9wczsKLQl9IGVsc2UgaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpIHsKLQkJaW5vZGUtPmlfb3AgPSAmdWZzX2Rpcl9pbm9kZV9vcGVyYXRpb25zOwotCQlpbm9kZS0+aV9mb3AgPSAmdWZzX2Rpcl9vcGVyYXRpb25zOwotCX0gZWxzZSBpZiAoU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkgewotCQlpZiAoIWlub2RlLT5pX2Jsb2NrcykKLQkJCWlub2RlLT5pX29wID0gJnVmc19mYXN0X3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKLQkJZWxzZSB7Ci0JCQlpbm9kZS0+aV9vcCA9ICZwYWdlX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKLQkJCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJnVmc19hb3BzOwotCQl9Ci0JfSBlbHNlCi0JCWluaXRfc3BlY2lhbF9pbm9kZShpbm9kZSwgaW5vZGUtPmlfbW9kZSwKLQkJCXVmc19nZXRfaW5vZGVfZGV2KHNiLCB1ZnNpKSk7CisJdWZzX3NldF9pbm9kZV9vcHMoaW5vZGUpOwogCiAJYnJlbHNlIChiaCk7CiAKLQlVRlNEKCgiRVhJVFxuIikpCisJVUZTRCgiRVhJVFxuIik7CiAJcmV0dXJuOwogCiBiYWRfaW5vZGU6CkBAIC02NDIsNyArNjkxLDcgQEAKIAlyZXR1cm47CiAKIHVmczJfaW5vZGUgOgotCVVGU0QoKCJSZWFkaW5nIHVmczIgaW5vZGUsIGlubyAlbHVcbiIsIGlub2RlLT5pX2lubykpCisJVUZTRCgiUmVhZGluZyB1ZnMyIGlub2RlLCBpbm8gJWx1XG4iLCBpbm9kZS0+aV9pbm8pOwogCiAJdWZzMl9pbm9kZSA9IChzdHJ1Y3QgdWZzMl9pbm9kZSAqKShiaC0+Yl9kYXRhICsgc2l6ZW9mKHN0cnVjdCB1ZnMyX2lub2RlKSAqIHVmc19pbm90b2ZzYm8oaW5vZGUtPmlfaW5vKSk7CiAKQEAgLTY5MCwyNyArNzM5LDExIEBACiAJfQogCXVmc2ktPmlfb3N5bmMgPSAwOwogCi0JaWYgKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpIHsKLQkJaW5vZGUtPmlfb3AgPSAmdWZzX2ZpbGVfaW5vZGVfb3BlcmF0aW9uczsKLQkJaW5vZGUtPmlfZm9wID0gJnVmc19maWxlX29wZXJhdGlvbnM7Ci0JCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJnVmc19hb3BzOwotCX0gZWxzZSBpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkgewotCQlpbm9kZS0+aV9vcCA9ICZ1ZnNfZGlyX2lub2RlX29wZXJhdGlvbnM7Ci0JCWlub2RlLT5pX2ZvcCA9ICZ1ZnNfZGlyX29wZXJhdGlvbnM7Ci0JfSBlbHNlIGlmIChTX0lTTE5LKGlub2RlLT5pX21vZGUpKSB7Ci0JCWlmICghaW5vZGUtPmlfYmxvY2tzKQotCQkJaW5vZGUtPmlfb3AgPSAmdWZzX2Zhc3Rfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zOwotCQllbHNlIHsKLQkJCWlub2RlLT5pX29wID0gJnBhZ2Vfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zOwotCQkJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmdWZzX2FvcHM7Ci0JCX0KLQl9IGVsc2UgICAvKiBUT0RPICA6IGhlcmUgLi4uKi8KLQkJaW5pdF9zcGVjaWFsX2lub2RlKGlub2RlLCBpbm9kZS0+aV9tb2RlLAotCQkJdWZzX2dldF9pbm9kZV9kZXYoc2IsIHVmc2kpKTsKKwl1ZnNfc2V0X2lub2RlX29wcyhpbm9kZSk7CiAKIAlicmVsc2UoYmgpOwogCi0JVUZTRCgoIkVYSVRcbiIpKQorCVVGU0QoIkVYSVRcbiIpOwogCXJldHVybjsKIH0KIApAQCAtNzI0LDcgKzc1Nyw3IEBACiAJdW5zaWduZWQgaTsKIAl1bnNpZ25lZCBmbGFnczsKIAotCVVGU0QoKCJFTlRFUiwgaW5vICVsdVxuIiwgaW5vZGUtPmlfaW5vKSkKKwlVRlNEKCJFTlRFUiwgaW5vICVsdVxuIiwgaW5vZGUtPmlfaW5vKTsKIAogCXNiID0gaW5vZGUtPmlfc2I7CiAJdXNwaSA9IFVGU19TQihzYiktPnNfdXNwaTsKQEAgLTc4NSw3ICs4MTgsNyBAQAogCQlzeW5jX2RpcnR5X2J1ZmZlcihiaCk7CiAJYnJlbHNlIChiaCk7CiAJCi0JVUZTRCgoIkVYSVRcbiIpKQorCVVGU0QoIkVYSVRcbiIpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9mcy91ZnMvbmFtZWkuYyBiL2ZzL3Vmcy9uYW1laS5jCmluZGV4IDhkNWY5OGEuLmFiZDVmMjMgMTAwNjQ0Ci0tLSBhL2ZzL3Vmcy9uYW1laS5jCisrKyBiL2ZzL3Vmcy9uYW1laS5jCkBAIC0xLDYgKzEsOSBAQAogLyoKICAqIGxpbnV4L2ZzL3Vmcy9uYW1laS5jCiAgKgorICogTWlncmF0aW9uIHRvIHVzYWdlIG9mICJwYWdlIGNhY2hlIiBvbiBNYXkgMjAwNiBieQorICogRXZnZW5peSBEdXNoaXN0b3YgPGR1c2hpc3RvdkBtYWlsLnJ1PiBiYXNlZCBvbiBleHQyIGNvZGUgYmFzZS4KKyAqCiAgKiBDb3B5cmlnaHQgKEMpIDE5OTgKICAqIERhbmllbCBQaXJrbCA8ZGFuaWVsLnBpcmtsQGVtYWlsLmN6PgogICogQ2hhcmxlcyBVbml2ZXJzaXR5LCBGYWN1bHR5IG9mIE1hdGhlbWF0aWNzIGFuZCBQaHlzaWNzCkBAIC0yOCwyMSArMzEsOSBAQAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvdWZzX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgogI2luY2x1ZGUgInN3YWIuaCIJLyogd2lsbCBnbyBhd2F5IC0gc2VlIGNvbW1lbnQgaW4gbWtub2QoKSAqLwogI2luY2x1ZGUgInV0aWwuaCIKIAotLyoKLSN1bmRlZiBVRlNfTkFNRUlfREVCVUcKLSovCi0jZGVmaW5lIFVGU19OQU1FSV9ERUJVRwotCi0jaWZkZWYgVUZTX05BTUVJX0RFQlVHCi0jZGVmaW5lIFVGU0QoeCkgcHJpbnRrKCIoJXMsICVkKSwgJXM6ICIsIF9fRklMRV9fLCBfX0xJTkVfXywgX19GVU5DVElPTl9fKTsgcHJpbnRrIHg7Ci0jZWxzZQotI2RlZmluZSBVRlNEKHgpCi0jZW5kaWYKLQogc3RhdGljIGlubGluZSBpbnQgdWZzX2FkZF9ub25kaXIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewogCWludCBlcnIgPSB1ZnNfYWRkX2xpbmsoZGVudHJ5LCBpbm9kZSk7CkBAIC04OCw4ICs3OSwxMyBAQAogc3RhdGljIGludCB1ZnNfY3JlYXRlIChzdHJ1Y3QgaW5vZGUgKiBkaXIsIHN0cnVjdCBkZW50cnkgKiBkZW50cnksIGludCBtb2RlLAogCQlzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKIHsKLQlzdHJ1Y3QgaW5vZGUgKiBpbm9kZSA9IHVmc19uZXdfaW5vZGUoZGlyLCBtb2RlKTsKLQlpbnQgZXJyID0gUFRSX0VSUihpbm9kZSk7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlpbnQgZXJyOworCisJVUZTRCgiQkVHSU5cbiIpOworCWlub2RlID0gdWZzX25ld19pbm9kZShkaXIsIG1vZGUpOworCWVyciA9IFBUUl9FUlIoaW5vZGUpOworCiAJaWYgKCFJU19FUlIoaW5vZGUpKSB7CiAJCWlub2RlLT5pX29wID0gJnVmc19maWxlX2lub2RlX29wZXJhdGlvbnM7CiAJCWlub2RlLT5pX2ZvcCA9ICZ1ZnNfZmlsZV9vcGVyYXRpb25zOwpAQCAtOTksNiArOTUsNyBAQAogCQllcnIgPSB1ZnNfYWRkX25vbmRpcihkZW50cnksIGlub2RlKTsKIAkJdW5sb2NrX2tlcm5lbCgpOwogCX0KKwlVRlNEKCJFTkQ6IGVycj0lZFxuIiwgZXJyKTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0yMDUsNiArMjAyLDcgQEAKIAogCWlub2RlLT5pX29wID0gJnVmc19kaXJfaW5vZGVfb3BlcmF0aW9uczsKIAlpbm9kZS0+aV9mb3AgPSAmdWZzX2Rpcl9vcGVyYXRpb25zOworCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJnVmc19hb3BzOwogCiAJaW5vZGVfaW5jX2xpbmtfY291bnQoaW5vZGUpOwogCkBAIC0yMzEsMTkgKzIyOSwxOCBAQAogCWdvdG8gb3V0OwogfQogCi1zdGF0aWMgaW50IHVmc191bmxpbmsoc3RydWN0IGlub2RlICogZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCitzdGF0aWMgaW50IHVmc191bmxpbmsoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKIHsKIAlzdHJ1Y3QgaW5vZGUgKiBpbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaDsKLQlzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqIGRlOworCXN0cnVjdCB1ZnNfZGlyX2VudHJ5ICpkZTsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAlpbnQgZXJyID0gLUVOT0VOVDsKIAotCWxvY2tfa2VybmVsKCk7Ci0JZGUgPSB1ZnNfZmluZF9lbnRyeSAoZGVudHJ5LCAmYmgpOworCWRlID0gdWZzX2ZpbmRfZW50cnkoZGlyLCBkZW50cnksICZwYWdlKTsKIAlpZiAoIWRlKQogCQlnb3RvIG91dDsKIAotCWVyciA9IHVmc19kZWxldGVfZW50cnkgKGRpciwgZGUsIGJoKTsKKwllcnIgPSB1ZnNfZGVsZXRlX2VudHJ5KGRpciwgZGUsIHBhZ2UpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwogCkBAIC0yNTEsNyArMjQ4LDYgQEAKIAlpbm9kZV9kZWNfbGlua19jb3VudChpbm9kZSk7CiAJZXJyID0gMDsKIG91dDoKLQl1bmxvY2tfa2VybmVsKCk7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMjczLDQyICsyNjksNDIgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IHVmc19yZW5hbWUgKHN0cnVjdCBpbm9kZSAqIG9sZF9kaXIsIHN0cnVjdCBkZW50cnkgKiBvbGRfZGVudHJ5LAotCXN0cnVjdCBpbm9kZSAqIG5ld19kaXIsCXN0cnVjdCBkZW50cnkgKiBuZXdfZGVudHJ5ICkKK3N0YXRpYyBpbnQgdWZzX3JlbmFtZShzdHJ1Y3QgaW5vZGUgKm9sZF9kaXIsIHN0cnVjdCBkZW50cnkgKm9sZF9kZW50cnksCisJCSAgICAgIHN0cnVjdCBpbm9kZSAqbmV3X2Rpciwgc3RydWN0IGRlbnRyeSAqbmV3X2RlbnRyeSkKIHsKIAlzdHJ1Y3QgaW5vZGUgKm9sZF9pbm9kZSA9IG9sZF9kZW50cnktPmRfaW5vZGU7CiAJc3RydWN0IGlub2RlICpuZXdfaW5vZGUgPSBuZXdfZGVudHJ5LT5kX2lub2RlOwotCXN0cnVjdCBidWZmZXJfaGVhZCAqZGlyX2JoID0gTlVMTDsKLQlzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqZGlyX2RlID0gTlVMTDsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKm9sZF9iaDsKKwlzdHJ1Y3QgcGFnZSAqZGlyX3BhZ2UgPSBOVUxMOworCXN0cnVjdCB1ZnNfZGlyX2VudHJ5ICogZGlyX2RlID0gTlVMTDsKKwlzdHJ1Y3QgcGFnZSAqb2xkX3BhZ2U7CiAJc3RydWN0IHVmc19kaXJfZW50cnkgKm9sZF9kZTsKIAlpbnQgZXJyID0gLUVOT0VOVDsKIAotCWxvY2tfa2VybmVsKCk7Ci0Jb2xkX2RlID0gdWZzX2ZpbmRfZW50cnkgKG9sZF9kZW50cnksICZvbGRfYmgpOworCW9sZF9kZSA9IHVmc19maW5kX2VudHJ5KG9sZF9kaXIsIG9sZF9kZW50cnksICZvbGRfcGFnZSk7CiAJaWYgKCFvbGRfZGUpCiAJCWdvdG8gb3V0OwogCiAJaWYgKFNfSVNESVIob2xkX2lub2RlLT5pX21vZGUpKSB7CiAJCWVyciA9IC1FSU87Ci0JCWRpcl9kZSA9IHVmc19kb3Rkb3Qob2xkX2lub2RlLCAmZGlyX2JoKTsKKwkJZGlyX2RlID0gdWZzX2RvdGRvdChvbGRfaW5vZGUsICZkaXJfcGFnZSk7CiAJCWlmICghZGlyX2RlKQogCQkJZ290byBvdXRfb2xkOwogCX0KIAogCWlmIChuZXdfaW5vZGUpIHsKLQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpuZXdfYmg7CisJCXN0cnVjdCBwYWdlICpuZXdfcGFnZTsKIAkJc3RydWN0IHVmc19kaXJfZW50cnkgKm5ld19kZTsKIAogCQllcnIgPSAtRU5PVEVNUFRZOwotCQlpZiAoZGlyX2RlICYmICF1ZnNfZW1wdHlfZGlyIChuZXdfaW5vZGUpKQorCQlpZiAoZGlyX2RlICYmICF1ZnNfZW1wdHlfZGlyKG5ld19pbm9kZSkpCiAJCQlnb3RvIG91dF9kaXI7CisKIAkJZXJyID0gLUVOT0VOVDsKLQkJbmV3X2RlID0gdWZzX2ZpbmRfZW50cnkgKG5ld19kZW50cnksICZuZXdfYmgpOworCQluZXdfZGUgPSB1ZnNfZmluZF9lbnRyeShuZXdfZGlyLCBuZXdfZGVudHJ5LCAmbmV3X3BhZ2UpOwogCQlpZiAoIW5ld19kZSkKIAkJCWdvdG8gb3V0X2RpcjsKIAkJaW5vZGVfaW5jX2xpbmtfY291bnQob2xkX2lub2RlKTsKLQkJdWZzX3NldF9saW5rKG5ld19kaXIsIG5ld19kZSwgbmV3X2JoLCBvbGRfaW5vZGUpOworCQl1ZnNfc2V0X2xpbmsobmV3X2RpciwgbmV3X2RlLCBuZXdfcGFnZSwgb2xkX2lub2RlKTsKIAkJbmV3X2lub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKIAkJaWYgKGRpcl9kZSkKIAkJCW5ld19pbm9kZS0+aV9ubGluay0tOwpAQCAtMzI5LDI0ICszMjUsMzIgQEAKIAkJCWlub2RlX2luY19saW5rX2NvdW50KG5ld19kaXIpOwogCX0KIAotCXVmc19kZWxldGVfZW50cnkgKG9sZF9kaXIsIG9sZF9kZSwgb2xkX2JoKTsKKwkvKgorCSAqIExpa2UgbW9zdCBvdGhlciBVbml4IHN5c3RlbXMsIHNldCB0aGUgY3RpbWUgZm9yIGlub2RlcyBvbiBhCisgCSAqIHJlbmFtZS4KKwkgKiBpbm9kZV9kZWNfbGlua19jb3VudCgpIHdpbGwgbWFyayB0aGUgaW5vZGUgZGlydHkuCisJICovCisJb2xkX2lub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKIAorCXVmc19kZWxldGVfZW50cnkob2xkX2Rpciwgb2xkX2RlLCBvbGRfcGFnZSk7CiAJaW5vZGVfZGVjX2xpbmtfY291bnQob2xkX2lub2RlKTsKIAogCWlmIChkaXJfZGUpIHsKLQkJdWZzX3NldF9saW5rKG9sZF9pbm9kZSwgZGlyX2RlLCBkaXJfYmgsIG5ld19kaXIpOworCQl1ZnNfc2V0X2xpbmsob2xkX2lub2RlLCBkaXJfZGUsIGRpcl9wYWdlLCBuZXdfZGlyKTsKIAkJaW5vZGVfZGVjX2xpbmtfY291bnQob2xkX2Rpcik7CiAJfQotCXVubG9ja19rZXJuZWwoKTsKIAlyZXR1cm4gMDsKIAorCiBvdXRfZGlyOgotCWlmIChkaXJfZGUpCi0JCWJyZWxzZShkaXJfYmgpOworCWlmIChkaXJfZGUpIHsKKwkJa3VubWFwKGRpcl9wYWdlKTsKKwkJcGFnZV9jYWNoZV9yZWxlYXNlKGRpcl9wYWdlKTsKKwl9CiBvdXRfb2xkOgotCWJyZWxzZSAob2xkX2JoKTsKKwlrdW5tYXAob2xkX3BhZ2UpOworCXBhZ2VfY2FjaGVfcmVsZWFzZShvbGRfcGFnZSk7CiBvdXQ6Ci0JdW5sb2NrX2tlcm5lbCgpOwogCXJldHVybiBlcnI7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL3Vmcy9zdXBlci5jIGIvZnMvdWZzL3N1cGVyLmMKaW5kZXggZmU1YWIyYS4uNzRlZjVlOSAxMDA2NDQKLS0tIGEvZnMvdWZzL3N1cGVyLmMKKysrIGIvZnMvdWZzL3N1cGVyLmMKQEAgLTkwLDk1ICs5MCw4NCBAQAogI2luY2x1ZGUgInN3YWIuaCIKICNpbmNsdWRlICJ1dGlsLmgiCiAKLSN1bmRlZiBVRlNfU1VQRVJfREVCVUcKLSN1bmRlZiBVRlNfU1VQRVJfREVCVUdfTU9SRQotCi0KLSN1bmRlZiBVRlNfU1VQRVJfREVCVUdfTU9SRQotI2lmZGVmIFVGU19TVVBFUl9ERUJVRwotI2RlZmluZSBVRlNEKHgpIHByaW50aygiKCVzLCAlZCksICVzOiAiLCBfX0ZJTEVfXywgX19MSU5FX18sIF9fRlVOQ1RJT05fXyk7IHByaW50ayB4OwotI2Vsc2UKLSNkZWZpbmUgVUZTRCh4KQotI2VuZGlmCi0KLSNpZmRlZiBVRlNfU1VQRVJfREVCVUdfTU9SRQorI2lmZGVmIENPTkZJR19VRlNfREVCVUcKIC8qCiAgKiBQcmludCBjb250ZW50cyBvZiB1ZnNfc3VwZXJfYmxvY2ssIHVzZWZ1bCBmb3IgZGVidWdnaW5nCiAgKi8KLXZvaWQgdWZzX3ByaW50X3N1cGVyX3N0dWZmKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCi0Jc3RydWN0IHVmc19zdXBlcl9ibG9ja19maXJzdCAqIHVzYjEsCi0Jc3RydWN0IHVmc19zdXBlcl9ibG9ja19zZWNvbmQgKiB1c2IyLCAKLQlzdHJ1Y3QgdWZzX3N1cGVyX2Jsb2NrX3RoaXJkICogdXNiMykKK3N0YXRpYyB2b2lkIHVmc19wcmludF9zdXBlcl9zdHVmZihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1bnNpZ25lZCBmbGFncywKKwkJCQkgIHN0cnVjdCB1ZnNfc3VwZXJfYmxvY2tfZmlyc3QgKnVzYjEsCisJCQkJICBzdHJ1Y3QgdWZzX3N1cGVyX2Jsb2NrX3NlY29uZCAqdXNiMiwKKwkJCQkgIHN0cnVjdCB1ZnNfc3VwZXJfYmxvY2tfdGhpcmQgKnVzYjMpCiB7CiAJcHJpbnRrKCJ1ZnNfcHJpbnRfc3VwZXJfc3R1ZmZcbiIpOwotCXByaW50aygic2l6ZSBvZiB1c2I6ICAgICAldVxuIiwgc2l6ZW9mKHN0cnVjdCB1ZnNfc3VwZXJfYmxvY2spKTsKLQlwcmludGsoIiAgbWFnaWM6ICAgICAgICAgMHgleFxuIiwgZnMzMl90b19jcHUoc2IsIHVzYjMtPmZzX21hZ2ljKSk7Ci0JcHJpbnRrKCIgIHNibGtubzogICAgICAgICV1XG4iLCBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfc2Jsa25vKSk7Ci0JcHJpbnRrKCIgIGNibGtubzogICAgICAgICV1XG4iLCBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfY2Jsa25vKSk7Ci0JcHJpbnRrKCIgIGlibGtubzogICAgICAgICV1XG4iLCBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfaWJsa25vKSk7Ci0JcHJpbnRrKCIgIGRibGtubzogICAgICAgICV1XG4iLCBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfZGJsa25vKSk7Ci0JcHJpbnRrKCIgIGNnb2Zmc2V0OiAgICAgICV1XG4iLCBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfY2dvZmZzZXQpKTsKLQlwcmludGsoIiAgfmNnbWFzazogICAgICAgMHgleFxuIiwgfmZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19jZ21hc2spKTsKLQlwcmludGsoIiAgc2l6ZTogICAgICAgICAgJXVcbiIsIGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19zaXplKSk7Ci0JcHJpbnRrKCIgIGRzaXplOiAgICAgICAgICV1XG4iLCBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfZHNpemUpKTsKLQlwcmludGsoIiAgbmNnOiAgICAgICAgICAgJXVcbiIsIGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19uY2cpKTsKLQlwcmludGsoIiAgYnNpemU6ICAgICAgICAgJXVcbiIsIGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19ic2l6ZSkpOwotCXByaW50aygiICBmc2l6ZTogICAgICAgICAldVxuIiwgZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2ZzaXplKSk7Ci0JcHJpbnRrKCIgIGZyYWc6ICAgICAgICAgICV1XG4iLCBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfZnJhZykpOwotCXByaW50aygiICBmcmFnc2hpZnQ6ICAgICAldVxuIiwgZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2ZyYWdzaGlmdCkpOwotCXByaW50aygiICB+Zm1hc2s6ICAgICAgICAldVxuIiwgfmZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19mbWFzaykpOwotCXByaW50aygiICBmc2hpZnQ6ICAgICAgICAldVxuIiwgZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2ZzaGlmdCkpOwotCXByaW50aygiICBzYnNpemU6ICAgICAgICAldVxuIiwgZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX3Nic2l6ZSkpOwotCXByaW50aygiICBzcGM6ICAgICAgICAgICAldVxuIiwgZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX3NwYykpOwotCXByaW50aygiICBjcGc6ICAgICAgICAgICAldVxuIiwgZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2NwZykpOwotCXByaW50aygiICBpcGc6ICAgICAgICAgICAldVxuIiwgZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2lwZykpOwotCXByaW50aygiICBmcGc6ICAgICAgICAgICAldVxuIiwgZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2ZwZykpOwotCXByaW50aygiICBjc2FkZHI6ICAgICAgICAldVxuIiwgZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2NzYWRkcikpOwotCXByaW50aygiICBjc3NpemU6ICAgICAgICAldVxuIiwgZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2Nzc2l6ZSkpOwotCXByaW50aygiICBjZ3NpemU6ICAgICAgICAldVxuIiwgZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2Nnc2l6ZSkpOwotCXByaW50aygiICBmc3RvZGI6ICAgICAgICAldVxuIiwgZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2ZzYnRvZGIpKTsKLQlwcmludGsoIiAgY29udGlnc3Vtc2l6ZTogJWRcbiIsIGZzMzJfdG9fY3B1KHNiLCB1c2IzLT5mc191Mi5mc180NC5mc19jb250aWdzdW1zaXplKSk7Ci0JcHJpbnRrKCIgIHBvc3RibGZvcm1hdDogICV1XG4iLCBmczMyX3RvX2NwdShzYiwgdXNiMy0+ZnNfcG9zdGJsZm9ybWF0KSk7Ci0JcHJpbnRrKCIgIG5ycG9zOiAgICAgICAgICV1XG4iLCBmczMyX3RvX2NwdShzYiwgdXNiMy0+ZnNfbnJwb3MpKTsKLQlwcmludGsoIiAgbmRpciAgICAgICAgICAgJXVcbiIsIGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19jc3RvdGFsLmNzX25kaXIpKTsKLQlwcmludGsoIiAgbmlmcmVlICAgICAgICAgJXVcbiIsIGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19jc3RvdGFsLmNzX25pZnJlZSkpOwotCXByaW50aygiICBuYmZyZWUgICAgICAgICAldVxuIiwgZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2NzdG90YWwuY3NfbmJmcmVlKSk7Ci0JcHJpbnRrKCIgIG5mZnJlZSAgICAgICAgICV1XG4iLCBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfY3N0b3RhbC5jc19uZmZyZWUpKTsKLQlwcmludGsoIlxuIik7Ci19Ci0KLS8qCi0gKiBQcmludCBjb250ZW50cyBvZiB1ZnMyIHVmc19zdXBlcl9ibG9jaywgdXNlZnVsIGZvciBkZWJ1Z2dpbmcKLSAqLwotdm9pZCB1ZnMyX3ByaW50X3N1cGVyX3N0dWZmKAotICAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAotICAgICAgc3RydWN0IHVmc19zdXBlcl9ibG9jayAqdXNiKQotewotCXByaW50aygidWZzX3ByaW50X3N1cGVyX3N0dWZmXG4iKTsKLQlwcmludGsoInNpemUgb2YgdXNiOiAgICAgJXVcbiIsIHNpemVvZihzdHJ1Y3QgdWZzX3N1cGVyX2Jsb2NrKSk7Ci0JcHJpbnRrKCIgIG1hZ2ljOiAgICAgICAgIDB4JXhcbiIsIGZzMzJfdG9fY3B1KHNiLCB1c2ItPmZzX21hZ2ljKSk7Ci0JcHJpbnRrKCIgIGZzX3NpemU6ICAgJXVcbiIsZnM2NF90b19jcHUoc2IsIHVzYi0+ZnNfdTExLmZzX3UyLmZzX3NpemUpKTsKLQlwcmludGsoIiAgZnNfZHNpemU6ICAldVxuIixmczY0X3RvX2NwdShzYiwgdXNiLT5mc191MTEuZnNfdTIuZnNfZHNpemUpKTsKLQlwcmludGsoIiAgYnNpemU6ICAgICAgICAgJXVcbiIsIGZzMzJfdG9fY3B1KHVzYiwgdXNiLT5mc19ic2l6ZSkpOwotCXByaW50aygiICBmc2l6ZTogICAgICAgICAldVxuIiwgZnMzMl90b19jcHUodXNiLCB1c2ItPmZzX2ZzaXplKSk7Ci0JcHJpbnRrKCIgIGZzX3ZvbG5hbWU6ICAlc1xuIiwgdXNiLT5mc191MTEuZnNfdTIuZnNfdm9sbmFtZSk7Ci0JcHJpbnRrKCIgIGZzX2ZzbW50OiAgJXNcbiIsIHVzYi0+ZnNfdTExLmZzX3UyLmZzX2ZzbW50KTsKLQlwcmludGsoIiAgZnNfc2Jsb2NrbG9jOiAldVxuIixmczY0X3RvX2NwdShzYiwKLQkJCXVzYi0+ZnNfdTExLmZzX3UyLmZzX3NibG9ja2xvYykpOwotCXByaW50aygiICBjc19uZGlyKE5vIG9mIGRpcnMpOiAgJXVcbiIsZnM2NF90b19jcHUoc2IsCi0JCQl1c2ItPmZzX3UxMS5mc191Mi5mc19jc3RvdGFsLmNzX25kaXIpKTsKLQlwcmludGsoIiAgY3NfbmJmcmVlKE5vIG9mIGZyZWUgYmxvY2tzKTogICV1XG4iLGZzNjRfdG9fY3B1KHNiLAotCQkJdXNiLT5mc191MTEuZnNfdTIuZnNfY3N0b3RhbC5jc19uYmZyZWUpKTsKKwlwcmludGsoIiAgbWFnaWM6ICAgICAweCV4XG4iLCBmczMyX3RvX2NwdShzYiwgdXNiMy0+ZnNfbWFnaWMpKTsKKwlpZiAoKGZsYWdzICYgVUZTX1RZUEVfTUFTSykgPT0gVUZTX1RZUEVfVUZTMikgeworCQlwcmludGsoIiAgZnNfc2l6ZTogICAlbGx1XG4iLCAodW5zaWduZWQgbG9uZyBsb25nKQorCQkgICAgICAgZnM2NF90b19jcHUoc2IsIHVzYjMtPmZzX3VuMS5mc191Mi5mc19zaXplKSk7CisJCXByaW50aygiICBmc19kc2l6ZTogICVsbHVcbiIsICh1bnNpZ25lZCBsb25nIGxvbmcpCisJCSAgICAgICBmczY0X3RvX2NwdShzYiwgdXNiMy0+ZnNfdW4xLmZzX3UyLmZzX2RzaXplKSk7CisJCXByaW50aygiICBic2l6ZTogICAgICAgICAldVxuIiwKKwkJICAgICAgIGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19ic2l6ZSkpOworCQlwcmludGsoIiAgZnNpemU6ICAgICAgICAgJXVcbiIsCisJCSAgICAgICBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfZnNpemUpKTsKKwkJcHJpbnRrKCIgIGZzX3ZvbG5hbWU6ICAlc1xuIiwgdXNiMi0+ZnNfdW4uZnNfdTIuZnNfdm9sbmFtZSk7CisJCXByaW50aygiICBmc19zYmxvY2tsb2M6ICVsbHVcbiIsICh1bnNpZ25lZCBsb25nIGxvbmcpCisJCSAgICAgICBmczY0X3RvX2NwdShzYiwgdXNiMi0+ZnNfdW4uZnNfdTIuZnNfc2Jsb2NrbG9jKSk7CisJCXByaW50aygiICBjc19uZGlyKE5vIG9mIGRpcnMpOiAgJWxsdVxuIiwgKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJICAgICAgIGZzNjRfdG9fY3B1KHNiLCB1c2IyLT5mc191bi5mc191Mi5jc19uZGlyKSk7CisJCXByaW50aygiICBjc19uYmZyZWUoTm8gb2YgZnJlZSBibG9ja3MpOiAgJWxsdVxuIiwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpCisJCSAgICAgICBmczY0X3RvX2NwdShzYiwgdXNiMi0+ZnNfdW4uZnNfdTIuY3NfbmJmcmVlKSk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKCIgc2Jsa25vOiAgICAgICV1XG4iLCBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfc2Jsa25vKSk7CisJCXByaW50aygiIGNibGtubzogICAgICAldVxuIiwgZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2NibGtubykpOworCQlwcmludGsoIiBpYmxrbm86ICAgICAgJXVcbiIsIGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19pYmxrbm8pKTsKKwkJcHJpbnRrKCIgZGJsa25vOiAgICAgICV1XG4iLCBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfZGJsa25vKSk7CisJCXByaW50aygiIGNnb2Zmc2V0OiAgICAldVxuIiwKKwkJICAgICAgIGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19jZ29mZnNldCkpOworCQlwcmludGsoIiB+Y2dtYXNrOiAgICAgMHgleFxuIiwKKwkJICAgICAgIH5mczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfY2dtYXNrKSk7CisJCXByaW50aygiIHNpemU6ICAgICAgICAldVxuIiwgZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX3NpemUpKTsKKwkJcHJpbnRrKCIgZHNpemU6ICAgICAgICV1XG4iLCBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfZHNpemUpKTsKKwkJcHJpbnRrKCIgbmNnOiAgICAgICAgICV1XG4iLCBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfbmNnKSk7CisJCXByaW50aygiIGJzaXplOiAgICAgICAldVxuIiwgZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2JzaXplKSk7CisJCXByaW50aygiIGZzaXplOiAgICAgICAldVxuIiwgZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2ZzaXplKSk7CisJCXByaW50aygiIGZyYWc6ICAgICAgICAldVxuIiwgZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2ZyYWcpKTsKKwkJcHJpbnRrKCIgZnJhZ3NoaWZ0OiAgICV1XG4iLAorCQkgICAgICAgZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2ZyYWdzaGlmdCkpOworCQlwcmludGsoIiB+Zm1hc2s6ICAgICAgJXVcbiIsIH5mczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfZm1hc2spKTsKKwkJcHJpbnRrKCIgZnNoaWZ0OiAgICAgICV1XG4iLCBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfZnNoaWZ0KSk7CisJCXByaW50aygiIHNic2l6ZTogICAgICAldVxuIiwgZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX3Nic2l6ZSkpOworCQlwcmludGsoIiBzcGM6ICAgICAgICAgJXVcbiIsIGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19zcGMpKTsKKwkJcHJpbnRrKCIgY3BnOiAgICAgICAgICV1XG4iLCBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfY3BnKSk7CisJCXByaW50aygiIGlwZzogICAgICAgICAldVxuIiwgZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2lwZykpOworCQlwcmludGsoIiBmcGc6ICAgICAgICAgJXVcbiIsIGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19mcGcpKTsKKwkJcHJpbnRrKCIgY3NhZGRyOiAgICAgICV1XG4iLCBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfY3NhZGRyKSk7CisJCXByaW50aygiIGNzc2l6ZTogICAgICAldVxuIiwgZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2Nzc2l6ZSkpOworCQlwcmludGsoIiBjZ3NpemU6ICAgICAgJXVcbiIsIGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19jZ3NpemUpKTsKKwkJcHJpbnRrKCIgZnN0b2RiOiAgICAgICV1XG4iLAorCQkgICAgICAgZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2ZzYnRvZGIpKTsKKwkJcHJpbnRrKCIgbnJwb3M6ICAgICAgICV1XG4iLCBmczMyX3RvX2NwdShzYiwgdXNiMy0+ZnNfbnJwb3MpKTsKKwkJcHJpbnRrKCIgbmRpciAgICAgICAgICV1XG4iLAorCQkgICAgICAgZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2NzdG90YWwuY3NfbmRpcikpOworCQlwcmludGsoIiBuaWZyZWUgICAgICAgJXVcbiIsCisJCSAgICAgICBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfY3N0b3RhbC5jc19uaWZyZWUpKTsKKwkJcHJpbnRrKCIgbmJmcmVlICAgICAgICV1XG4iLAorCQkgICAgICAgZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2NzdG90YWwuY3NfbmJmcmVlKSk7CisJCXByaW50aygiIG5mZnJlZSAgICAgICAldVxuIiwKKwkJICAgICAgIGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19jc3RvdGFsLmNzX25mZnJlZSkpOworCX0KIAlwcmludGsoIlxuIik7CiB9CiAKIC8qCiAgKiBQcmludCBjb250ZW50cyBvZiB1ZnNfY3lsaW5kZXJfZ3JvdXAsIHVzZWZ1bCBmb3IgZGVidWdnaW5nCiAgKi8KLXZvaWQgdWZzX3ByaW50X2N5bGluZGVyX3N0dWZmKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCB1ZnNfY3lsaW5kZXJfZ3JvdXAgKmNnKQorc3RhdGljIHZvaWQgdWZzX3ByaW50X2N5bGluZGVyX3N0dWZmKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJICAgICBzdHJ1Y3QgdWZzX2N5bGluZGVyX2dyb3VwICpjZykKIHsKIAlwcmludGsoIlxudWZzX3ByaW50X2N5bGluZGVyX3N0dWZmXG4iKTsKLQlwcmludGsoInNpemUgb2YgdWNnOiAldVxuIiwgc2l6ZW9mKHN0cnVjdCB1ZnNfY3lsaW5kZXJfZ3JvdXApKTsKKwlwcmludGsoInNpemUgb2YgdWNnOiAlenVcbiIsIHNpemVvZihzdHJ1Y3QgdWZzX2N5bGluZGVyX2dyb3VwKSk7CiAJcHJpbnRrKCIgIG1hZ2ljOiAgICAgICAgJXhcbiIsIGZzMzJfdG9fY3B1KHNiLCBjZy0+Y2dfbWFnaWMpKTsKIAlwcmludGsoIiAgdGltZTogICAgICAgICAldVxuIiwgZnMzMl90b19jcHUoc2IsIGNnLT5jZ190aW1lKSk7CiAJcHJpbnRrKCIgIGNneDogICAgICAgICAgJXVcbiIsIGZzMzJfdG9fY3B1KHNiLCBjZy0+Y2dfY2d4KSk7CkBAIC0yMDIsMTIgKzE5MSwxOCBAQAogCXByaW50aygiICBpdXNlb2ZmOiAgICAgICV1XG4iLCBmczMyX3RvX2NwdShzYiwgY2ctPmNnX2l1c2Vkb2ZmKSk7CiAJcHJpbnRrKCIgIGZyZWVvZmY6ICAgICAgJXVcbiIsIGZzMzJfdG9fY3B1KHNiLCBjZy0+Y2dfZnJlZW9mZikpOwogCXByaW50aygiICBuZXh0ZnJlZW9mZjogICV1XG4iLCBmczMyX3RvX2NwdShzYiwgY2ctPmNnX25leHRmcmVlb2ZmKSk7Ci0JcHJpbnRrKCIgIGNsdXN0ZXJzdW1vZmYgJXVcbiIsIGZzMzJfdG9fY3B1KHNiLCBjZy0+Y2dfdS5jZ180NC5jZ19jbHVzdGVyc3Vtb2ZmKSk7Ci0JcHJpbnRrKCIgIGNsdXN0ZXJvZmYgICAgJXVcbiIsIGZzMzJfdG9fY3B1KHNiLCBjZy0+Y2dfdS5jZ180NC5jZ19jbHVzdGVyb2ZmKSk7Ci0JcHJpbnRrKCIgIG5jbHVzdGVyYmxrcyAgJXVcbiIsIGZzMzJfdG9fY3B1KHNiLCBjZy0+Y2dfdS5jZ180NC5jZ19uY2x1c3RlcmJsa3MpKTsKKwlwcmludGsoIiAgY2x1c3RlcnN1bW9mZiAldVxuIiwKKwkgICAgICAgZnMzMl90b19jcHUoc2IsIGNnLT5jZ191LmNnXzQ0LmNnX2NsdXN0ZXJzdW1vZmYpKTsKKwlwcmludGsoIiAgY2x1c3Rlcm9mZiAgICAldVxuIiwKKwkgICAgICAgZnMzMl90b19jcHUoc2IsIGNnLT5jZ191LmNnXzQ0LmNnX2NsdXN0ZXJvZmYpKTsKKwlwcmludGsoIiAgbmNsdXN0ZXJibGtzICAldVxuIiwKKwkgICAgICAgZnMzMl90b19jcHUoc2IsIGNnLT5jZ191LmNnXzQ0LmNnX25jbHVzdGVyYmxrcykpOwogCXByaW50aygiXG4iKTsKIH0KLSNlbmRpZiAvKiBVRlNfU1VQRVJfREVCVUdfTU9SRSAqLworI2Vsc2UKKyMgIGRlZmluZSB1ZnNfcHJpbnRfc3VwZXJfc3R1ZmYoc2IsIGZsYWdzLCB1c2IxLCB1c2IyLCB1c2IzKSAvKiovCisjICBkZWZpbmUgdWZzX3ByaW50X2N5bGluZGVyX3N0dWZmKHNiLCBjZykgLyoqLworI2VuZGlmIC8qIENPTkZJR19VRlNfREVCVUcgKi8KIAogc3RhdGljIHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIHVmc19zdXBlcl9vcHM7CiAKQEAgLTIyNSw3ICsyMjAsNyBAQAogCQogCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgewogCQl1c2IxLT5mc19jbGVhbiA9IFVGU19GU0JBRDsKLQkJdWJoX21hcmtfYnVmZmVyX2RpcnR5KFVTUElfVUJIKTsKKwkJdWJoX21hcmtfYnVmZmVyX2RpcnR5KFVTUElfVUJIKHVzcGkpKTsKIAkJc2ItPnNfZGlydCA9IDE7CiAJCXNiLT5zX2ZsYWdzIHw9IE1TX1JET05MWTsKIAl9CkBAIC0yNTcsNyArMjUyLDcgQEAKIAkKIAlpZiAoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKIAkJdXNiMS0+ZnNfY2xlYW4gPSBVRlNfRlNCQUQ7Ci0JCXViaF9tYXJrX2J1ZmZlcl9kaXJ0eShVU1BJX1VCSCk7CisJCXViaF9tYXJrX2J1ZmZlcl9kaXJ0eShVU1BJX1VCSCh1c3BpKSk7CiAJCXNiLT5zX2RpcnQgPSAxOwogCX0KIAl2YV9zdGFydCAoYXJncywgZm10KTsKQEAgLTMwOSw3ICszMDQsNyBAQAogewogCWNoYXIgKiBwOwogCQotCVVGU0QoKCJFTlRFUlxuIikpCisJVUZTRCgiRU5URVJcbiIpOwogCQogCWlmICghb3B0aW9ucykKIAkJcmV0dXJuIDE7CkBAIC0zODYsMjcgKzM4MSw1NyBAQAogfQogCiAvKgorICogRGlmZnJlbnQgdHlwZXMgb2YgVUZTIGhvbGQgZnNfY3N0b3RhbCBpbiBkaWZmZXJlbnQKKyAqIHBsYWNlcywgYW5kIHVzZSBkaWZmcmVudCBkYXRhIHN0cnVjdHVyZSBmb3IgaXQuCisgKiBUbyBtYWtlIHRoaW5ncyBzaW1wbGllciB3ZSBqdXN0IGNvcHkgZnNfY3N0b3RhbCB0byB1ZnNfc2JfcHJpdmF0ZV9pbmZvCisgKi8KK3N0YXRpYyB2b2lkIHVmc19zZXR1cF9jc3RvdGFsKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IHVmc19zYl9pbmZvICpzYmkgPSBVRlNfU0Ioc2IpOworCXN0cnVjdCB1ZnNfc2JfcHJpdmF0ZV9pbmZvICp1c3BpID0gc2JpLT5zX3VzcGk7CisJc3RydWN0IHVmc19zdXBlcl9ibG9ja19maXJzdCAqdXNiMTsKKwlzdHJ1Y3QgdWZzX3N1cGVyX2Jsb2NrX3NlY29uZCAqdXNiMjsKKwlzdHJ1Y3QgdWZzX3N1cGVyX2Jsb2NrX3RoaXJkICp1c2IzOworCXVuc2lnbmVkIG10eXBlID0gc2JpLT5zX21vdW50X29wdCAmIFVGU19NT1VOVF9VRlNUWVBFOworCisJVUZTRCgiRU5URVIsIG10eXBlPSV1XG4iLCBtdHlwZSk7CisJdXNiMSA9IHViaF9nZXRfdXNiX2ZpcnN0KHVzcGkpOworCXVzYjIgPSB1YmhfZ2V0X3VzYl9zZWNvbmQodXNwaSk7CisJdXNiMyA9IHViaF9nZXRfdXNiX3RoaXJkKHVzcGkpOworCisJaWYgKChtdHlwZSA9PSBVRlNfTU9VTlRfVUZTVFlQRV80NEJTRCAmJgorCSAgICAgKHVzYjEtPmZzX2ZsYWdzICYgVUZTX0ZMQUdTX1VQREFURUQpKSB8fAorCSAgICBtdHlwZSA9PSBVRlNfTU9VTlRfVUZTVFlQRV9VRlMyKSB7CisJCS8qd2UgaGF2ZSBzdGF0aXN0aWMgaW4gZGlmZmVyZW50IHBsYWNlLCB0aGVuIHVzdWFsKi8KKwkJdXNwaS0+Y3NfdG90YWwuY3NfbmRpciA9IGZzNjRfdG9fY3B1KHNiLCB1c2IyLT5mc191bi5mc191Mi5jc19uZGlyKTsKKwkJdXNwaS0+Y3NfdG90YWwuY3NfbmJmcmVlID0gZnM2NF90b19jcHUoc2IsIHVzYjItPmZzX3VuLmZzX3UyLmNzX25iZnJlZSk7CisJCXVzcGktPmNzX3RvdGFsLmNzX25pZnJlZSA9IGZzNjRfdG9fY3B1KHNiLCB1c2IzLT5mc191bjEuZnNfdTIuY3NfbmlmcmVlKTsKKwkJdXNwaS0+Y3NfdG90YWwuY3NfbmZmcmVlID0gZnM2NF90b19jcHUoc2IsIHVzYjMtPmZzX3VuMS5mc191Mi5jc19uZmZyZWUpOworCX0gZWxzZSB7CisJCXVzcGktPmNzX3RvdGFsLmNzX25kaXIgPSBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfY3N0b3RhbC5jc19uZGlyKTsKKwkJdXNwaS0+Y3NfdG90YWwuY3NfbmJmcmVlID0gZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2NzdG90YWwuY3NfbmJmcmVlKTsKKwkJdXNwaS0+Y3NfdG90YWwuY3NfbmlmcmVlID0gZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2NzdG90YWwuY3NfbmlmcmVlKTsKKwkJdXNwaS0+Y3NfdG90YWwuY3NfbmZmcmVlID0gZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2NzdG90YWwuY3NfbmZmcmVlKTsKKwl9CisJVUZTRCgiRVhJVFxuIik7Cit9CisKKy8qCiAgKiBSZWFkIG9uLWRpc2sgc3RydWN0dXJlcyBhc3NvY2lhdGVkIHdpdGggY3lsaW5kZXIgZ3JvdXBzCiAgKi8KLXN0YXRpYyBpbnQgdWZzX3JlYWRfY3lsaW5kZXJfc3RydWN0dXJlcyAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3N0YXRpYyBpbnQgdWZzX3JlYWRfY3lsaW5kZXJfc3RydWN0dXJlcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewotCXN0cnVjdCB1ZnNfc2JfaW5mbyAqIHNiaSA9IFVGU19TQihzYik7Ci0Jc3RydWN0IHVmc19zYl9wcml2YXRlX2luZm8gKiB1c3BpOwotCXN0cnVjdCB1ZnNfc3VwZXJfYmxvY2sgKnVzYjsKKwlzdHJ1Y3QgdWZzX3NiX2luZm8gKnNiaSA9IFVGU19TQihzYik7CisJc3RydWN0IHVmc19zYl9wcml2YXRlX2luZm8gKnVzcGkgPSBzYmktPnNfdXNwaTsKKwl1bnNpZ25lZCBmbGFncyA9IHNiaS0+c19mbGFnczsKIAlzdHJ1Y3QgdWZzX2J1ZmZlcl9oZWFkICogdWJoOwogCXVuc2lnbmVkIGNoYXIgKiBiYXNlLCAqIHNwYWNlOwogCXVuc2lnbmVkIHNpemUsIGJsa3MsIGk7Ci0JdW5zaWduZWQgZmxhZ3MgPSAwOwotCQotCVVGU0QoKCJFTlRFUlxuIikpCi0JCi0JdXNwaSA9IHNiaS0+c191c3BpOworCXN0cnVjdCB1ZnNfc3VwZXJfYmxvY2tfdGhpcmQgKnVzYjM7CiAKLQl1c2IgID0gKHN0cnVjdCB1ZnNfc3VwZXJfYmxvY2sgKikKLQkJKChzdHJ1Y3QgdWZzX2J1ZmZlcl9oZWFkICopdXNwaSktPmJoWzBdLT5iX2RhdGE7CisJVUZTRCgiRU5URVJcbiIpOwogCi0gICAgICAgIGZsYWdzID0gVUZTX1NCKHNiKS0+c19mbGFnczsKLQkKKwl1c2IzID0gdWJoX2dldF91c2JfdGhpcmQodXNwaSk7CiAJLyoKIAkgKiBSZWFkIGNzIHN0cnVjdHVyZXMgZnJvbSAodXN1YWxseSkgZmlyc3QgZGF0YSBibG9jawogCSAqIG9uIHRoZSBkZXZpY2UuIApAQCAtNDI0LDcgKzQ0OSw3IEBACiAKIAkJaWYgKChmbGFncyAmIFVGU19UWVBFX01BU0spID09IFVGU19UWVBFX1VGUzIpIAogCQkJdWJoID0gdWJoX2JyZWFkKHNiLAotCQkJCWZzNjRfdG9fY3B1KHNiLCB1c2ItPmZzX3UxMS5mc191Mi5mc19jc2FkZHIpICsgaSwgc2l6ZSk7CisJCQkJZnM2NF90b19jcHUoc2IsIHVzYjMtPmZzX3VuMS5mc191Mi5mc19jc2FkZHIpICsgaSwgc2l6ZSk7CiAJCWVsc2UgCiAJCQl1YmggPSB1YmhfYnJlYWQoc2IsIHVzcGktPnNfY3NhZGRyICsgaSwgc2l6ZSk7CiAJCQpAQCAtNDUxLDE0ICs0NzYsMTMgQEAKIAkJc2JpLT5zX2Nnbm9baV0gPSBVRlNfQ0dOT19FTVBUWTsKIAl9CiAJZm9yIChpID0gMDsgaSA8IHVzcGktPnNfbmNnOyBpKyspIHsKLQkJVUZTRCgoInJlYWQgY2cgJXVcbiIsIGkpKQorCQlVRlNEKCJyZWFkIGNnICV1XG4iLCBpKTsKIAkJaWYgKCEoc2JpLT5zX3VjZ1tpXSA9IHNiX2JyZWFkKHNiLCB1ZnNfY2djbWluKGkpKSkpCiAJCQlnb3RvIGZhaWxlZDsKIAkJaWYgKCF1ZnNfY2dfY2hrbWFnaWMgKHNiLCAoc3RydWN0IHVmc19jeWxpbmRlcl9ncm91cCAqKSBzYmktPnNfdWNnW2ldLT5iX2RhdGEpKQogCQkJZ290byBmYWlsZWQ7Ci0jaWZkZWYgVUZTX1NVUEVSX0RFQlVHX01PUkUKKwogCQl1ZnNfcHJpbnRfY3lsaW5kZXJfc3R1ZmYoc2IsIChzdHJ1Y3QgdWZzX2N5bGluZGVyX2dyb3VwICopIHNiaS0+c191Y2dbaV0tPmJfZGF0YSk7Ci0jZW5kaWYKIAl9CiAJZm9yIChpID0gMDsgaSA8IFVGU19NQVhfR1JPVVBfTE9BREVEOyBpKyspIHsKIAkJaWYgKCEoc2JpLT5zX3VjcGlbaV0gPSBrbWFsbG9jIChzaXplb2Yoc3RydWN0IHVmc19jZ19wcml2YXRlX2luZm8pLCBHRlBfS0VSTkVMKSkpCkBAIC00NjYsNyArNDkwLDcgQEAKIAkJc2JpLT5zX2Nnbm9baV0gPSBVRlNfQ0dOT19FTVBUWTsKIAl9CiAJc2JpLT5zX2NnX2xvYWRlZCA9IDA7Ci0JVUZTRCgoIkVYSVRcbiIpKQorCVVGU0QoIkVYSVRcbiIpOwogCXJldHVybiAxOwogCiBmYWlsZWQ6CkBAIC00NzksMjYgKzUwMyw2OSBAQAogCQlmb3IgKGkgPSAwOyBpIDwgVUZTX01BWF9HUk9VUF9MT0FERUQ7IGkrKykKIAkJCWtmcmVlIChzYmktPnNfdWNwaVtpXSk7CiAJfQotCVVGU0QoKCJFWElUIChGQUlMRUQpXG4iKSkKKwlVRlNEKCJFWElUIChGQUlMRUQpXG4iKTsKIAlyZXR1cm4gMDsKIH0KIAogLyoKLSAqIFB1dCBvbi1kaXNrIHN0cnVjdHVyZXMgYXNzb2NpYXRlZCB3aXRoIGN5bGluZGVyIGdyb3VwcyBhbmQgCi0gKiB3cml0ZSB0aGVtIGJhY2sgdG8gZGlzaworICogU3luYyBvdXIgaW50ZXJuYWwgY29weSBvZiBmc19jc3RvdGFsIHdpdGggZGlzawogICovCi1zdGF0aWMgdm9pZCB1ZnNfcHV0X2N5bGluZGVyX3N0cnVjdHVyZXMgKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCitzdGF0aWMgdm9pZCB1ZnNfcHV0X2NzdG90YWwoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKLQlzdHJ1Y3QgdWZzX3NiX2luZm8gKiBzYmkgPSBVRlNfU0Ioc2IpOwotCXN0cnVjdCB1ZnNfc2JfcHJpdmF0ZV9pbmZvICogdXNwaTsKKwl1bnNpZ25lZCBtdHlwZSA9IFVGU19TQihzYiktPnNfbW91bnRfb3B0ICYgVUZTX01PVU5UX1VGU1RZUEU7CisJc3RydWN0IHVmc19zYl9wcml2YXRlX2luZm8gKnVzcGkgPSBVRlNfU0Ioc2IpLT5zX3VzcGk7CisJc3RydWN0IHVmc19zdXBlcl9ibG9ja19maXJzdCAqdXNiMTsKKwlzdHJ1Y3QgdWZzX3N1cGVyX2Jsb2NrX3NlY29uZCAqdXNiMjsKKwlzdHJ1Y3QgdWZzX3N1cGVyX2Jsb2NrX3RoaXJkICp1c2IzOworCisJVUZTRCgiRU5URVJcbiIpOworCXVzYjEgPSB1YmhfZ2V0X3VzYl9maXJzdCh1c3BpKTsKKwl1c2IyID0gdWJoX2dldF91c2Jfc2Vjb25kKHVzcGkpOworCXVzYjMgPSB1YmhfZ2V0X3VzYl90aGlyZCh1c3BpKTsKKworCWlmICgobXR5cGUgPT0gVUZTX01PVU5UX1VGU1RZUEVfNDRCU0QgJiYKKwkgICAgICh1c2IxLT5mc19mbGFncyAmIFVGU19GTEFHU19VUERBVEVEKSkgfHwKKwkgICAgbXR5cGUgPT0gVUZTX01PVU5UX1VGU1RZUEVfVUZTMikgeworCQkvKndlIGhhdmUgc3RhdGlzdGljIGluIGRpZmZlcmVudCBwbGFjZSwgdGhlbiB1c3VhbCovCisJCXVzYjItPmZzX3VuLmZzX3UyLmNzX25kaXIgPQorCQkJY3B1X3RvX2ZzNjQoc2IsIHVzcGktPmNzX3RvdGFsLmNzX25kaXIpOworCQl1c2IyLT5mc191bi5mc191Mi5jc19uYmZyZWUgPQorCQkJY3B1X3RvX2ZzNjQoc2IsIHVzcGktPmNzX3RvdGFsLmNzX25iZnJlZSk7CisJCXVzYjMtPmZzX3VuMS5mc191Mi5jc19uaWZyZWUgPQorCQkJY3B1X3RvX2ZzNjQoc2IsIHVzcGktPmNzX3RvdGFsLmNzX25pZnJlZSk7CisJCXVzYjMtPmZzX3VuMS5mc191Mi5jc19uZmZyZWUgPQorCQkJY3B1X3RvX2ZzNjQoc2IsIHVzcGktPmNzX3RvdGFsLmNzX25mZnJlZSk7CisJfSBlbHNlIHsKKwkJdXNiMS0+ZnNfY3N0b3RhbC5jc19uZGlyID0KKwkJCWNwdV90b19mczMyKHNiLCB1c3BpLT5jc190b3RhbC5jc19uZGlyKTsKKwkJdXNiMS0+ZnNfY3N0b3RhbC5jc19uYmZyZWUgPQorCQkJY3B1X3RvX2ZzMzIoc2IsIHVzcGktPmNzX3RvdGFsLmNzX25iZnJlZSk7CisJCXVzYjEtPmZzX2NzdG90YWwuY3NfbmlmcmVlID0KKwkJCWNwdV90b19mczMyKHNiLCB1c3BpLT5jc190b3RhbC5jc19uaWZyZWUpOworCQl1c2IxLT5mc19jc3RvdGFsLmNzX25mZnJlZSA9CisJCQljcHVfdG9fZnMzMihzYiwgdXNwaS0+Y3NfdG90YWwuY3NfbmZmcmVlKTsKKwl9CisJdWJoX21hcmtfYnVmZmVyX2RpcnR5KFVTUElfVUJIKHVzcGkpKTsKKwlVRlNEKCJFWElUXG4iKTsKK30KKworLyoqCisgKiB1ZnNfcHV0X3N1cGVyX2ludGVybmFsKCkgLSBwdXQgb24tZGlzayBpbnRyZW5hbCBzdHJ1Y3R1cmVzCisgKiBAc2I6IHBvaW50ZXIgdG8gc3VwZXJfYmxvY2sgc3RydWN0dXJlCisgKiBQdXQgb24tZGlzayBzdHJ1Y3R1cmVzIGFzc29jaWF0ZWQgd2l0aCBjeWxpbmRlciBncm91cHMKKyAqIGFuZCB3cml0ZSB0aGVtIGJhY2sgdG8gZGlzaywgYWxzbyB1cGRhdGUgY3NfdG90YWwgb24gZGlzaworICovCitzdGF0aWMgdm9pZCB1ZnNfcHV0X3N1cGVyX2ludGVybmFsKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IHVmc19zYl9pbmZvICpzYmkgPSBVRlNfU0Ioc2IpOworCXN0cnVjdCB1ZnNfc2JfcHJpdmF0ZV9pbmZvICp1c3BpID0gc2JpLT5zX3VzcGk7CiAJc3RydWN0IHVmc19idWZmZXJfaGVhZCAqIHViaDsKIAl1bnNpZ25lZCBjaGFyICogYmFzZSwgKiBzcGFjZTsKIAl1bnNpZ25lZCBibGtzLCBzaXplLCBpOwotCQotCVVGU0QoKCJFTlRFUlxuIikpCi0JCi0JdXNwaSA9IHNiaS0+c191c3BpOwogCisJCisJVUZTRCgiRU5URVJcbiIpOworCXVmc19wdXRfY3N0b3RhbChzYik7CiAJc2l6ZSA9IHVzcGktPnNfY3NzaXplOwogCWJsa3MgPSAoc2l6ZSArIHVzcGktPnNfZnNpemUgLSAxKSA+PiB1c3BpLT5zX2ZzaGlmdDsKIAliYXNlID0gc3BhY2UgPSAoY2hhciopIHNiaS0+c19jc3A7CkBAIC01MjMsNyArNTkwLDcgQEAKIAkJYnJlbHNlIChzYmktPnNfdWNnW2ldKTsKIAlrZnJlZSAoc2JpLT5zX3VjZyk7CiAJa2ZyZWUgKGJhc2UpOwotCVVGU0QoKCJFWElUXG4iKSkKKwlVRlNEKCJFWElUXG4iKTsKIH0KIAogc3RhdGljIGludCB1ZnNfZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICpkYXRhLCBpbnQgc2lsZW50KQpAQCAtNTMzLDcgKzYwMCw2IEBACiAJc3RydWN0IHVmc19zdXBlcl9ibG9ja19maXJzdCAqIHVzYjE7CiAJc3RydWN0IHVmc19zdXBlcl9ibG9ja19zZWNvbmQgKiB1c2IyOwogCXN0cnVjdCB1ZnNfc3VwZXJfYmxvY2tfdGhpcmQgKiB1c2IzOwotCXN0cnVjdCB1ZnNfc3VwZXJfYmxvY2sgKnVzYjsKIAlzdHJ1Y3QgdWZzX2J1ZmZlcl9oZWFkICogdWJoOwkKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlOwogCXVuc2lnbmVkIGJsb2NrX3NpemUsIHN1cGVyX2Jsb2NrX3NpemU7CkBAIC01NDQsNyArNjEwLDcgQEAKIAl1YmggPSBOVUxMOwogCWZsYWdzID0gMDsKIAkKLQlVRlNEKCgiRU5URVJcbiIpKQorCVVGU0QoIkVOVEVSXG4iKTsKIAkJCiAJc2JpID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHVmc19zYl9pbmZvKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFzYmkpCkBAIC01NTIsNyArNjE4LDcgQEAKIAlzYi0+c19mc19pbmZvID0gc2JpOwogCW1lbXNldChzYmksIDAsIHNpemVvZihzdHJ1Y3QgdWZzX3NiX2luZm8pKTsKIAotCVVGU0QoKCJmbGFnICV1XG4iLCAoaW50KShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpKQorCVVGU0QoImZsYWcgJXVcbiIsIChpbnQpKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSk7CiAJCiAjaWZuZGVmIENPTkZJR19VRlNfRlNfV1JJVEUKIAlpZiAoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKQEAgLTU5Myw3ICs2NTksNyBAQAogCSAgIHRoZSBydWxlcyAqLwogCXN3aXRjaCAoc2JpLT5zX21vdW50X29wdCAmIFVGU19NT1VOVF9VRlNUWVBFKSB7CiAJY2FzZSBVRlNfTU9VTlRfVUZTVFlQRV80NEJTRDoKLQkJVUZTRCgoInVmc3R5cGU9NDRic2RcbiIpKQorCQlVRlNEKCJ1ZnN0eXBlPTQ0YnNkXG4iKTsKIAkJdXNwaS0+c19mc2l6ZSA9IGJsb2NrX3NpemUgPSA1MTI7CiAJCXVzcGktPnNfZm1hc2sgPSB+KDUxMiAtIDEpOwogCQl1c3BpLT5zX2ZzaGlmdCA9IDk7CkBAIC02MDIsNyArNjY4LDcgQEAKIAkJZmxhZ3MgfD0gVUZTX0RFXzQ0QlNEIHwgVUZTX1VJRF80NEJTRCB8IFVGU19TVF80NEJTRCB8IFVGU19DR180NEJTRDsKIAkJYnJlYWs7CiAJY2FzZSBVRlNfTU9VTlRfVUZTVFlQRV9VRlMyOgotCQlVRlNEKCgidWZzdHlwZT11ZnMyXG4iKSk7CisJCVVGU0QoInVmc3R5cGU9dWZzMlxuIik7CiAJCXN1cGVyX2Jsb2NrX29mZnNldD1TQkxPQ0tfVUZTMjsKIAkJdXNwaS0+c19mc2l6ZSA9IGJsb2NrX3NpemUgPSA1MTI7CiAJCXVzcGktPnNfZm1hc2sgPSB+KDUxMiAtIDEpOwpAQCAtNjE3LDcgKzY4Myw3IEBACiAJCWJyZWFrOwogCQkKIAljYXNlIFVGU19NT1VOVF9VRlNUWVBFX1NVTjoKLQkJVUZTRCgoInVmc3R5cGU9c3VuXG4iKSkKKwkJVUZTRCgidWZzdHlwZT1zdW5cbiIpOwogCQl1c3BpLT5zX2ZzaXplID0gYmxvY2tfc2l6ZSA9IDEwMjQ7CiAJCXVzcGktPnNfZm1hc2sgPSB+KDEwMjQgLSAxKTsKIAkJdXNwaS0+c19mc2hpZnQgPSAxMDsKQEAgLTYyOCw3ICs2OTQsNyBAQAogCQlicmVhazsKIAogCWNhc2UgVUZTX01PVU5UX1VGU1RZUEVfU1VOeDg2OgotCQlVRlNEKCgidWZzdHlwZT1zdW54ODZcbiIpKQorCQlVRlNEKCJ1ZnN0eXBlPXN1bng4NlxuIik7CiAJCXVzcGktPnNfZnNpemUgPSBibG9ja19zaXplID0gMTAyNDsKIAkJdXNwaS0+c19mbWFzayA9IH4oMTAyNCAtIDEpOwogCQl1c3BpLT5zX2ZzaGlmdCA9IDEwOwpAQCAtNjM5LDcgKzcwNSw3IEBACiAJCWJyZWFrOwogCiAJY2FzZSBVRlNfTU9VTlRfVUZTVFlQRV9PTEQ6Ci0JCVVGU0QoKCJ1ZnN0eXBlPW9sZFxuIikpCisJCVVGU0QoInVmc3R5cGU9b2xkXG4iKTsKIAkJdXNwaS0+c19mc2l6ZSA9IGJsb2NrX3NpemUgPSAxMDI0OwogCQl1c3BpLT5zX2ZtYXNrID0gfigxMDI0IC0gMSk7CiAJCXVzcGktPnNfZnNoaWZ0ID0gMTA7CkBAIC02NTQsNyArNzIwLDcgQEAKIAkJYnJlYWs7CiAJCiAJY2FzZSBVRlNfTU9VTlRfVUZTVFlQRV9ORVhUU1RFUDoKLQkJVUZTRCgoInVmc3R5cGU9bmV4dHN0ZXBcbiIpKQorCQlVRlNEKCJ1ZnN0eXBlPW5leHRzdGVwXG4iKTsKIAkJdXNwaS0+c19mc2l6ZSA9IGJsb2NrX3NpemUgPSAxMDI0OwogCQl1c3BpLT5zX2ZtYXNrID0gfigxMDI0IC0gMSk7CiAJCXVzcGktPnNfZnNoaWZ0ID0gMTA7CkBAIC02NjksNyArNzM1LDcgQEAKIAkJYnJlYWs7CiAJCiAJY2FzZSBVRlNfTU9VTlRfVUZTVFlQRV9ORVhUU1RFUF9DRDoKLQkJVUZTRCgoInVmc3R5cGU9bmV4dHN0ZXAtY2RcbiIpKQorCQlVRlNEKCJ1ZnN0eXBlPW5leHRzdGVwLWNkXG4iKTsKIAkJdXNwaS0+c19mc2l6ZSA9IGJsb2NrX3NpemUgPSAyMDQ4OwogCQl1c3BpLT5zX2ZtYXNrID0gfigyMDQ4IC0gMSk7CiAJCXVzcGktPnNfZnNoaWZ0ID0gMTE7CkBAIC02ODQsNyArNzUwLDcgQEAKIAkJYnJlYWs7CiAJCiAJY2FzZSBVRlNfTU9VTlRfVUZTVFlQRV9PUEVOU1RFUDoKLQkJVUZTRCgoInVmc3R5cGU9b3BlbnN0ZXBcbiIpKQorCQlVRlNEKCJ1ZnN0eXBlPW9wZW5zdGVwXG4iKTsKIAkJdXNwaS0+c19mc2l6ZSA9IGJsb2NrX3NpemUgPSAxMDI0OwogCQl1c3BpLT5zX2ZtYXNrID0gfigxMDI0IC0gMSk7CiAJCXVzcGktPnNfZnNoaWZ0ID0gMTA7CkBAIC02OTksNyArNzY1LDcgQEAKIAkJYnJlYWs7CiAJCiAJY2FzZSBVRlNfTU9VTlRfVUZTVFlQRV9IUDoKLQkJVUZTRCgoInVmc3R5cGU9aHBcbiIpKQorCQlVRlNEKCJ1ZnN0eXBlPWhwXG4iKTsKIAkJdXNwaS0+c19mc2l6ZSA9IGJsb2NrX3NpemUgPSAxMDI0OwogCQl1c3BpLT5zX2ZtYXNrID0gfigxMDI0IC0gMSk7CiAJCXVzcGktPnNfZnNoaWZ0ID0gMTA7CkBAIC03MzcsOCArODAzLDYgQEAKIAl1c2IxID0gdWJoX2dldF91c2JfZmlyc3QodXNwaSk7CiAJdXNiMiA9IHViaF9nZXRfdXNiX3NlY29uZCh1c3BpKTsKIAl1c2IzID0gdWJoX2dldF91c2JfdGhpcmQodXNwaSk7Ci0JdXNiICA9IChzdHJ1Y3QgdWZzX3N1cGVyX2Jsb2NrICopCi0JCSgoc3RydWN0IHVmc19idWZmZXJfaGVhZCAqKXVzcGkpLT5iaFswXS0+Yl9kYXRhIDsKIAogCS8qCiAJICogQ2hlY2sgdWZzIG1hZ2ljIG51bWJlcgpAQCAtODIwLDE2ICs4ODQsMTIgQEAKIAkJdWJoID0gTlVMTDsKIAkJYmxvY2tfc2l6ZSA9IHVzcGktPnNfZnNpemU7CiAJCXN1cGVyX2Jsb2NrX3NpemUgPSB1c3BpLT5zX3Nic2l6ZTsKLQkJVUZTRCgoImFub3RoZXIgdmFsdWUgb2YgYmxvY2tfc2l6ZSBvciBzdXBlcl9ibG9ja19zaXplICV1LCAldVxuIiwgYmxvY2tfc2l6ZSwgc3VwZXJfYmxvY2tfc2l6ZSkpCisJCVVGU0QoImFub3RoZXIgdmFsdWUgb2YgYmxvY2tfc2l6ZSBvciBzdXBlcl9ibG9ja19zaXplICV1LCAldVxuIiwgYmxvY2tfc2l6ZSwgc3VwZXJfYmxvY2tfc2l6ZSk7CiAJCWdvdG8gYWdhaW47CiAJfQogCi0jaWZkZWYgVUZTX1NVUEVSX0RFQlVHX01PUkUKLSAgICAgICAgaWYgKChmbGFncyAmIFVGU19UWVBFX01BU0spID09IFVGU19UWVBFX1VGUzIpCi0JCXVmczJfcHJpbnRfc3VwZXJfc3R1ZmYoc2IsdXNiKTsKLSAgICAgICAgZWxzZQotCQl1ZnNfcHJpbnRfc3VwZXJfc3R1ZmYoc2IsIHVzYjEsIHVzYjIsIHVzYjMpOwotI2VuZGlmCisKKwl1ZnNfcHJpbnRfc3VwZXJfc3R1ZmYoc2IsIGZsYWdzLCB1c2IxLCB1c2IyLCB1c2IzKTsKIAogCS8qCiAJICogQ2hlY2ssIGlmIGZpbGUgc3lzdGVtIHdhcyBjb3JyZWN0bHkgdW5tb3VudGVkLgpAQCAtODQyLDEzICs5MDIsMTMgQEAKIAkgICh1ZnNfZ2V0X2ZzX3N0YXRlKHNiLCB1c2IxLCB1c2IzKSA9PSAoVUZTX0ZTT0sgLSBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfdGltZSkpKSkpIHsKIAkJc3dpdGNoKHVzYjEtPmZzX2NsZWFuKSB7CiAJCWNhc2UgVUZTX0ZTQ0xFQU46Ci0JCQlVRlNEKCgiZnMgaXMgY2xlYW5cbiIpKQorCQkJVUZTRCgiZnMgaXMgY2xlYW5cbiIpOwogCQkJYnJlYWs7CiAJCWNhc2UgVUZTX0ZTU1RBQkxFOgotCQkJVUZTRCgoImZzIGlzIHN0YWJsZVxuIikpCisJCQlVRlNEKCJmcyBpcyBzdGFibGVcbiIpOwogCQkJYnJlYWs7CiAJCWNhc2UgVUZTX0ZTT1NGMToKLQkJCVVGU0QoKCJmcyBpcyBERUMgT1NGLzFcbiIpKQorCQkJVUZTRCgiZnMgaXMgREVDIE9TRi8xXG4iKTsKIAkJCWJyZWFrOwogCQljYXNlIFVGU19GU0FDVElWRToKIAkJCXByaW50aygidWZzX3JlYWRfc3VwZXI6IGZzIGlzIGFjdGl2ZVxuIik7CkBAIC04NjMsOCArOTIzLDcgQEAKIAkJCXNiLT5zX2ZsYWdzIHw9IE1TX1JET05MWTsKIAkJCWJyZWFrOwogCQl9Ci0JfQotCWVsc2UgeworCX0gZWxzZSB7CiAJCXByaW50aygidWZzX3JlYWRfc3VwZXI6IGZzIG5lZWRzIGZzY2tcbiIpOwogCQlzYi0+c19mbGFncyB8PSBNU19SRE9OTFk7CiAJfQpAQCAtODg0LDEwICs5NDMsOSBAQAogCXVzcGktPnNfY2dtYXNrID0gZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2NnbWFzayk7CiAKIAlpZiAoKGZsYWdzICYgVUZTX1RZUEVfTUFTSykgPT0gVUZTX1RZUEVfVUZTMikgewotCQl1c3BpLT5zX3UyX3NpemUgID0gZnM2NF90b19jcHUoc2IsIHVzYi0+ZnNfdTExLmZzX3UyLmZzX3NpemUpOwotCQl1c3BpLT5zX3UyX2RzaXplID0gZnM2NF90b19jcHUoc2IsIHVzYi0+ZnNfdTExLmZzX3UyLmZzX2RzaXplKTsKLQl9Ci0JZWxzZSB7CisJCXVzcGktPnNfdTJfc2l6ZSAgPSBmczY0X3RvX2NwdShzYiwgdXNiMy0+ZnNfdW4xLmZzX3UyLmZzX3NpemUpOworCQl1c3BpLT5zX3UyX2RzaXplID0gZnM2NF90b19jcHUoc2IsIHVzYjMtPmZzX3VuMS5mc191Mi5mc19kc2l6ZSk7CisJfSBlbHNlIHsKIAkJdXNwaS0+c19zaXplICA9ICBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfc2l6ZSk7CiAJCXVzcGktPnNfZHNpemUgPSAgZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2RzaXplKTsKIAl9CkBAIC05MDEsOCArOTU5LDggQEAKIAl1c3BpLT5zX2ZtYXNrID0gZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2ZtYXNrKTsKIAl1c3BpLT5zX2JzaGlmdCA9IGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19ic2hpZnQpOwogCXVzcGktPnNfZnNoaWZ0ID0gZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2ZzaGlmdCk7Ci0JVUZTRCgoInVzcGktPnNfYnNoaWZ0ID0gJWQsdXNwaS0+c19mc2hpZnQgPSAlZCIsIHVzcGktPnNfYnNoaWZ0LAotCQl1c3BpLT5zX2ZzaGlmdCkpOworCVVGU0QoInVzcGktPnNfYnNoaWZ0ID0gJWQsdXNwaS0+c19mc2hpZnQgPSAlZCIsIHVzcGktPnNfYnNoaWZ0LAorCQl1c3BpLT5zX2ZzaGlmdCk7CiAJdXNwaS0+c19mcGJzaGlmdCA9IGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19mcmFnc2hpZnQpOwogCXVzcGktPnNfZnNidG9kYiA9IGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19mc2J0b2RiKTsKIAkvKiBzX3Nic2l6ZSBhbHJlYWR5IHNldCAqLwpAQCAtOTIyLDggKzk4MCw4IEBACiAJdXNwaS0+c19zcGMgPSBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfc3BjKTsKIAl1c3BpLT5zX2lwZyA9IGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19pcGcpOwogCXVzcGktPnNfZnBnID0gZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2ZwZyk7Ci0JdXNwaS0+c19jcGMgPSBmczMyX3RvX2NwdShzYiwgdXNiMi0+ZnNfY3BjKTsKLQl1c3BpLT5zX2NvbnRpZ3N1bXNpemUgPSBmczMyX3RvX2NwdShzYiwgdXNiMy0+ZnNfdTIuZnNfNDQuZnNfY29udGlnc3Vtc2l6ZSk7CisJdXNwaS0+c19jcGMgPSBmczMyX3RvX2NwdShzYiwgdXNiMi0+ZnNfdW4uZnNfdTEuZnNfY3BjKTsKKwl1c3BpLT5zX2NvbnRpZ3N1bXNpemUgPSBmczMyX3RvX2NwdShzYiwgdXNiMy0+ZnNfdW4yLmZzXzQ0LmZzX2NvbnRpZ3N1bXNpemUpOwogCXVzcGktPnNfcWJtYXNrID0gdWZzX2dldF9mc19xYm1hc2soc2IsIHVzYjMpOwogCXVzcGktPnNfcWZtYXNrID0gdWZzX2dldF9mc19xZm1hc2soc2IsIHVzYjMpOwogCXVzcGktPnNfcG9zdGJsZm9ybWF0ID0gZnMzMl90b19jcHUoc2IsIHVzYjMtPmZzX3Bvc3RibGZvcm1hdCk7CkBAIC05MzUsMTIgKzk5MywxMSBAQAogCSAqIENvbXB1dGUgYW5vdGhlciBmcmVxdWVudGx5IHVzZWQgdmFsdWVzCiAJICovCiAJdXNwaS0+c19mcGJtYXNrID0gdXNwaS0+c19mcGIgLSAxOwotCWlmICgoZmxhZ3MgJiBVRlNfVFlQRV9NQVNLKSA9PSBVRlNfVFlQRV9VRlMyKSB7CisJaWYgKChmbGFncyAmIFVGU19UWVBFX01BU0spID09IFVGU19UWVBFX1VGUzIpCiAJCXVzcGktPnNfYXBic2hpZnQgPSB1c3BpLT5zX2JzaGlmdCAtIDM7Ci0JfQotCWVsc2UgeworCWVsc2UKIAkJdXNwaS0+c19hcGJzaGlmdCA9IHVzcGktPnNfYnNoaWZ0IC0gMjsKLQl9CisKIAl1c3BpLT5zXzJhcGJzaGlmdCA9IHVzcGktPnNfYXBic2hpZnQgKiAyOwogCXVzcGktPnNfM2FwYnNoaWZ0ID0gdXNwaS0+c19hcGJzaGlmdCAqIDM7CiAJdXNwaS0+c19hcGIgPSAxIDw8IHVzcGktPnNfYXBic2hpZnQ7CkBAIC05NTYsNyArMTAxMyw3IEBACiAJaWYgKChzYmktPnNfbW91bnRfb3B0ICYgVUZTX01PVU5UX1VGU1RZUEUpID09CiAJICAgIFVGU19NT1VOVF9VRlNUWVBFXzQ0QlNEKQogCQl1c3BpLT5zX21heHN5bWxpbmtsZW4gPQotCQkgICAgZnMzMl90b19jcHUoc2IsIHVzYjMtPmZzX3UyLmZzXzQ0LmZzX21heHN5bWxpbmtsZW4pOworCQkgICAgZnMzMl90b19jcHUoc2IsIHVzYjMtPmZzX3VuMi5mc180NC5mc19tYXhzeW1saW5rbGVuKTsKIAkKIAlzYmktPnNfZmxhZ3MgPSBmbGFnczsKIApAQCAtOTY3LDcgKzEwMjQsNyBAQAogCWlmICghc2ItPnNfcm9vdCkKIAkJZ290byBkYWxsb2NfZmFpbGVkOwogCi0KKwl1ZnNfc2V0dXBfY3N0b3RhbChzYik7CiAJLyoKIAkgKiBSZWFkIGN5bGluZGVyIGdyb3VwIHN0cnVjdHVyZXMKIAkgKi8KQEAgLTk3NSw3ICsxMDMyLDcgQEAKIAkJaWYgKCF1ZnNfcmVhZF9jeWxpbmRlcl9zdHJ1Y3R1cmVzKHNiKSkKIAkJCWdvdG8gZmFpbGVkOwogCi0JVUZTRCgoIkVYSVRcbiIpKQorCVVGU0QoIkVYSVRcbiIpOwogCXJldHVybiAwOwogCiBkYWxsb2NfZmFpbGVkOgpAQCAtOTg2LDE1ICsxMDQzLDE2IEBACiAJa2ZyZWUgKHVzcGkpOwogCWtmcmVlKHNiaSk7CiAJc2ItPnNfZnNfaW5mbyA9IE5VTEw7Ci0JVUZTRCgoIkVYSVQgKEZBSUxFRClcbiIpKQorCVVGU0QoIkVYSVQgKEZBSUxFRClcbiIpOwogCXJldHVybiAtRUlOVkFMOwogCiBmYWlsZWRfbm9tZW06Ci0JVUZTRCgoIkVYSVQgKE5PTUVNKVxuIikpCisJVUZTRCgiRVhJVCAoTk9NRU0pXG4iKTsKIAlyZXR1cm4gLUVOT01FTTsKIH0KIAotc3RhdGljIHZvaWQgdWZzX3dyaXRlX3N1cGVyIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKSB7CitzdGF0aWMgdm9pZCB1ZnNfd3JpdGVfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKIAlzdHJ1Y3QgdWZzX3NiX3ByaXZhdGVfaW5mbyAqIHVzcGk7CiAJc3RydWN0IHVmc19zdXBlcl9ibG9ja19maXJzdCAqIHVzYjE7CiAJc3RydWN0IHVmc19zdXBlcl9ibG9ja190aGlyZCAqIHVzYjM7CkBAIC0xMDAyLDcgKzEwNjAsNyBAQAogCiAJbG9ja19rZXJuZWwoKTsKIAotCVVGU0QoKCJFTlRFUlxuIikpCisJVUZTRCgiRU5URVJcbiIpOwogCWZsYWdzID0gVUZTX1NCKHNiKS0+c19mbGFnczsKIAl1c3BpID0gVUZTX1NCKHNiKS0+c191c3BpOwogCXVzYjEgPSB1YmhfZ2V0X3VzYl9maXJzdCh1c3BpKTsKQEAgLTEwMTQsMjYgKzEwNzIsMjcgQEAKIAkJICB8fCAoZmxhZ3MgJiBVRlNfU1RfTUFTSykgPT0gVUZTX1NUX1NVTng4NikKIAkJCXVmc19zZXRfZnNfc3RhdGUoc2IsIHVzYjEsIHVzYjMsCiAJCQkJCVVGU19GU09LIC0gZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX3RpbWUpKTsKLQkJdWJoX21hcmtfYnVmZmVyX2RpcnR5IChVU1BJX1VCSCk7CisJCXVmc19wdXRfY3N0b3RhbChzYik7CiAJfQogCXNiLT5zX2RpcnQgPSAwOwotCVVGU0QoKCJFWElUXG4iKSkKKwlVRlNEKCJFWElUXG4iKTsKIAl1bmxvY2tfa2VybmVsKCk7CiB9CiAKLXN0YXRpYyB2b2lkIHVmc19wdXRfc3VwZXIgKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCitzdGF0aWMgdm9pZCB1ZnNfcHV0X3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7CiAJc3RydWN0IHVmc19zYl9pbmZvICogc2JpID0gVUZTX1NCKHNiKTsKIAkJCi0JVUZTRCgoIkVOVEVSXG4iKSkKKwlVRlNEKCJFTlRFUlxuIik7CiAKIAlpZiAoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpCi0JCXVmc19wdXRfY3lsaW5kZXJfc3RydWN0dXJlcyAoc2IpOworCQl1ZnNfcHV0X3N1cGVyX2ludGVybmFsKHNiKTsKIAkKIAl1YmhfYnJlbHNlX3VzcGkgKHNiaS0+c191c3BpKTsKIAlrZnJlZSAoc2JpLT5zX3VzcGkpOwogCWtmcmVlIChzYmkpOwogCXNiLT5zX2ZzX2luZm8gPSBOVUxMOworCVVGU0QoIkVYSVRcbiIpOwogCXJldHVybjsKIH0KIApAQCAtMTA2Miw4ICsxMTIxLDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKCEobmV3X21vdW50X29wdCAmIFVGU19NT1VOVF9VRlNUWVBFKSkgewogCQluZXdfbW91bnRfb3B0IHw9IHVmc3R5cGU7Ci0JfQotCWVsc2UgaWYgKChuZXdfbW91bnRfb3B0ICYgVUZTX01PVU5UX1VGU1RZUEUpICE9IHVmc3R5cGUpIHsKKwl9IGVsc2UgaWYgKChuZXdfbW91bnRfb3B0ICYgVUZTX01PVU5UX1VGU1RZUEUpICE9IHVmc3R5cGUpIHsKIAkJcHJpbnRrKCJ1ZnN0eXBlIGNhbid0IGJlIGNoYW5nZWQgZHVyaW5nIHJlbW91bnRcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0xMDc3LDIwICsxMTM1LDE5IEBACiAJICogZnMgd2FzIG1vdXRlZCBhcyBydywgcmVtb3VudGluZyBybwogCSAqLwogCWlmICgqbW91bnRfZmxhZ3MgJiBNU19SRE9OTFkpIHsKLQkJdWZzX3B1dF9jeWxpbmRlcl9zdHJ1Y3R1cmVzKHNiKTsKKwkJdWZzX3B1dF9zdXBlcl9pbnRlcm5hbChzYik7CiAJCXVzYjEtPmZzX3RpbWUgPSBjcHVfdG9fZnMzMihzYiwgZ2V0X3NlY29uZHMoKSk7CiAJCWlmICgoZmxhZ3MgJiBVRlNfU1RfTUFTSykgPT0gVUZTX1NUX1NVTgogCQkgIHx8IChmbGFncyAmIFVGU19TVF9NQVNLKSA9PSBVRlNfU1RfU1VOeDg2KSAKIAkJCXVmc19zZXRfZnNfc3RhdGUoc2IsIHVzYjEsIHVzYjMsCiAJCQkJVUZTX0ZTT0sgLSBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfdGltZSkpOwotCQl1YmhfbWFya19idWZmZXJfZGlydHkgKFVTUElfVUJIKTsKKwkJdWJoX21hcmtfYnVmZmVyX2RpcnR5IChVU1BJX1VCSCh1c3BpKSk7CiAJCXNiLT5zX2RpcnQgPSAwOwogCQlzYi0+c19mbGFncyB8PSBNU19SRE9OTFk7Ci0JfQorCX0gZWxzZSB7CiAJLyoKIAkgKiBmcyB3YXMgbW91bnRlZCBhcyBybywgcmVtb3VudGluZyBydwogCSAqLwotCWVsc2UgewogI2lmbmRlZiBDT05GSUdfVUZTX0ZTX1dSSVRFCiAJCXByaW50aygidWZzIHdhcyBjb21waWxlZCB3aXRoIHJlYWQtb25seSBzdXBwb3J0LCAiCiAJCSJjYW4ndCBiZSBtb3VudGVkIGFzIHJlYWQtd3JpdGVcbiIpOwpAQCAtMTEwMiw3ICsxMTU5LDcgQEAKIAkJCXByaW50aygidGhpcyB1ZnN0eXBlIGlzIHJlYWQtb25seSBzdXBwb3J0ZWRcbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KLQkJaWYgKCF1ZnNfcmVhZF9jeWxpbmRlcl9zdHJ1Y3R1cmVzIChzYikpIHsKKwkJaWYgKCF1ZnNfcmVhZF9jeWxpbmRlcl9zdHJ1Y3R1cmVzKHNiKSkgewogCQkJcHJpbnRrKCJmYWlsZWQgZHVyaW5nIHJlbW91bnRpbmdcbiIpOwogCQkJcmV0dXJuIC1FUEVSTTsKIAkJfQpAQCAtMTExMywzNyArMTE3MCwzMSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHVmc19zdGF0ZnMgKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGtzdGF0ZnMgKmJ1ZikKK3N0YXRpYyBpbnQgdWZzX3N0YXRmcyhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBrc3RhdGZzICpidWYpCiB7CiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGRlbnRyeS0+ZF9zYjsKLQlzdHJ1Y3QgdWZzX3NiX3ByaXZhdGVfaW5mbyAqIHVzcGk7Ci0Jc3RydWN0IHVmc19zdXBlcl9ibG9ja19maXJzdCAqIHVzYjE7Ci0Jc3RydWN0IHVmc19zdXBlcl9ibG9jayAqIHVzYjsKLQl1bnNpZ25lZCAgZmxhZ3MgPSAwOworCXN0cnVjdCB1ZnNfc2JfcHJpdmF0ZV9pbmZvICp1c3BpPSBVRlNfU0Ioc2IpLT5zX3VzcGk7CisJdW5zaWduZWQgIGZsYWdzID0gVUZTX1NCKHNiKS0+c19mbGFnczsKKwlzdHJ1Y3QgdWZzX3N1cGVyX2Jsb2NrX2ZpcnN0ICp1c2IxOworCXN0cnVjdCB1ZnNfc3VwZXJfYmxvY2tfc2Vjb25kICp1c2IyOworCXN0cnVjdCB1ZnNfc3VwZXJfYmxvY2tfdGhpcmQgKnVzYjM7CiAKIAlsb2NrX2tlcm5lbCgpOwogCi0JdXNwaSA9IFVGU19TQihzYiktPnNfdXNwaTsKLQl1c2IxID0gdWJoX2dldF91c2JfZmlyc3QgKHVzcGkpOwotCXVzYiAgPSAoc3RydWN0IHVmc19zdXBlcl9ibG9jayAqKQotCQkoKHN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgKil1c3BpKS0+YmhbMF0tPmJfZGF0YSA7CisJdXNiMSA9IHViaF9nZXRfdXNiX2ZpcnN0KHVzcGkpOworCXVzYjIgPSB1YmhfZ2V0X3VzYl9zZWNvbmQodXNwaSk7CisJdXNiMyA9IHViaF9nZXRfdXNiX3RoaXJkKHVzcGkpOwogCQotCWZsYWdzID0gVUZTX1NCKHNiKS0+c19mbGFnczsKIAlpZiAoKGZsYWdzICYgVUZTX1RZUEVfTUFTSykgPT0gVUZTX1RZUEVfVUZTMikgewogCQlidWYtPmZfdHlwZSA9IFVGUzJfTUFHSUM7Ci0JCWJ1Zi0+Zl9ibG9ja3MgPSBmczY0X3RvX2NwdShzYiwgdXNiLT5mc191MTEuZnNfdTIuZnNfZHNpemUpOwotCQlidWYtPmZfYmZyZWUgPSB1ZnNfYmxrc3RvZnJhZ3MoZnM2NF90b19jcHUoc2IsIHVzYi0+ZnNfdTExLmZzX3UyLmZzX2NzdG90YWwuY3NfbmJmcmVlKSkgKwotCQkJZnM2NF90b19jcHUoc2IsIHVzYi0+ZnNfdTExLmZzX3UyLmZzX2NzdG90YWwuY3NfbmZmcmVlKTsKLQkJYnVmLT5mX2ZmcmVlID0gZnM2NF90b19jcHUoc2IsCi0gICAgICAgIAkJdXNiLT5mc191MTEuZnNfdTIuZnNfY3N0b3RhbC5jc19uaWZyZWUpOwotCX0KLQllbHNlIHsKKwkJYnVmLT5mX2Jsb2NrcyA9IGZzNjRfdG9fY3B1KHNiLCB1c2IzLT5mc191bjEuZnNfdTIuZnNfZHNpemUpOworCX0gZWxzZSB7CiAJCWJ1Zi0+Zl90eXBlID0gVUZTX01BR0lDOwogCQlidWYtPmZfYmxvY2tzID0gdXNwaS0+c19kc2l6ZTsKLQkJYnVmLT5mX2JmcmVlID0gdWZzX2Jsa3N0b2ZyYWdzKGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19jc3RvdGFsLmNzX25iZnJlZSkpICsKLQkJCWZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19jc3RvdGFsLmNzX25mZnJlZSk7Ci0JCWJ1Zi0+Zl9mZnJlZSA9IGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19jc3RvdGFsLmNzX25pZnJlZSk7CiAJfQorCWJ1Zi0+Zl9iZnJlZSA9IHVmc19ibGtzdG9mcmFncyh1c3BpLT5jc190b3RhbC5jc19uYmZyZWUpICsKKwkJdXNwaS0+Y3NfdG90YWwuY3NfbmZmcmVlOworCWJ1Zi0+Zl9mZnJlZSA9IHVzcGktPmNzX3RvdGFsLmNzX25pZnJlZTsKIAlidWYtPmZfYnNpemUgPSBzYi0+c19ibG9ja3NpemU7CiAJYnVmLT5mX2JhdmFpbCA9IChidWYtPmZfYmZyZWUgPiAoKChsb25nKWJ1Zi0+Zl9ibG9ja3MgLyAxMDApICogdXNwaS0+c19taW5mcmVlKSkKIAkJPyAoYnVmLT5mX2JmcmVlIC0gKCgobG9uZylidWYtPmZfYmxvY2tzIC8gMTAwKSAqIHVzcGktPnNfbWluZnJlZSkpIDogMDsKZGlmZiAtLWdpdCBhL2ZzL3Vmcy90cnVuY2F0ZS5jIGIvZnMvdWZzL3RydW5jYXRlLmMKaW5kZXggMDJlODYyOS4uM2MzYjMwMSAxMDA2NDQKLS0tIGEvZnMvdWZzL3RydW5jYXRlLmMKKysrIGIvZnMvdWZzL3RydW5jYXRlLmMKQEAgLTQ5LDE0ICs0OSw2IEBACiAjaW5jbHVkZSAic3dhYi5oIgogI2luY2x1ZGUgInV0aWwuaCIKIAotI3VuZGVmIFVGU19UUlVOQ0FURV9ERUJVRwotCi0jaWZkZWYgVUZTX1RSVU5DQVRFX0RFQlVHCi0jZGVmaW5lIFVGU0QoeCkgcHJpbnRrKCIoJXMsICVkKSwgJXM6ICIsIF9fRklMRV9fLCBfX0xJTkVfXywgX19GVU5DVElPTl9fKTsgcHJpbnRrIHg7Ci0jZWxzZQotI2RlZmluZSBVRlNEKHgpCi0jZW5kaWYKLSAKIC8qCiAgKiBTZWN1cmUgZGVsZXRpb24gY3VycmVudGx5IGRvZXNuJ3Qgd29yay4gSXQgaW50ZXJhY3RzIHZlcnkgYmFkbHkKICAqIHdpdGggYnVmZmVycyBzaGFyZWQgd2l0aCBtZW1vcnkgbWFwcGluZ3MsIGFuZCBmb3IgdGhhdCByZWFzb24KQEAgLTgyLDcgKzc0LDcgQEAKIAl1bnNpZ25lZCBpLCB0bXA7CiAJaW50IHJldHJ5OwogCQotCVVGU0QoKCJFTlRFUlxuIikpCisJVUZTRCgiRU5URVJcbiIpOwogCiAJc2IgPSBpbm9kZS0+aV9zYjsKIAl1c3BpID0gVUZTX1NCKHNiKS0+c191c3BpOwpAQCAtMTA1LDcgKzk3LDcgQEAKIAkJYmxvY2syID0gdWZzX2ZyYWdzdG9ibGtzIChmcmFnMyk7CiAJfQogCi0JVUZTRCgoImZyYWcxICV1LCBmcmFnMiAldSwgYmxvY2sxICV1LCBibG9jazIgJXUsIGZyYWczICV1LCBmcmFnNCAldVxuIiwgZnJhZzEsIGZyYWcyLCBibG9jazEsIGJsb2NrMiwgZnJhZzMsIGZyYWc0KSkKKwlVRlNEKCJmcmFnMSAldSwgZnJhZzIgJXUsIGJsb2NrMSAldSwgYmxvY2syICV1LCBmcmFnMyAldSwgZnJhZzQgJXVcbiIsIGZyYWcxLCBmcmFnMiwgYmxvY2sxLCBibG9jazIsIGZyYWczLCBmcmFnNCk7CiAKIAlpZiAoZnJhZzEgPj0gZnJhZzIpCiAJCWdvdG8gbmV4dDE7CQkKQEAgLTEyMCw5ICsxMTIsOCBAQAogCWZyYWcxID0gdWZzX2ZyYWdudW0gKGZyYWcxKTsKIAlmcmFnMiA9IHVmc19mcmFnbnVtIChmcmFnMik7CiAKLQlpbm9kZS0+aV9ibG9ja3MgLT0gKGZyYWcyLWZyYWcxKSA8PCB1c3BpLT5zX25zcGZzaGlmdDsKLQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKIAl1ZnNfZnJlZV9mcmFnbWVudHMgKGlub2RlLCB0bXAgKyBmcmFnMSwgZnJhZzIgLSBmcmFnMSk7CisJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CiAJZnJhZ190b19mcmVlID0gdG1wICsgZnJhZzE7CiAKIG5leHQxOgpAQCAtMTM2LDggKzEyNyw3IEBACiAJCQljb250aW51ZTsKIAogCQkqcCA9IDA7Ci0JCWlub2RlLT5pX2Jsb2NrcyAtPSB1c3BpLT5zX25zcGI7Ci0JCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCiAJCWlmIChmcmVlX2NvdW50ID09IDApIHsKIAkJCWZyYWdfdG9fZnJlZSA9IHRtcDsKIAkJCWZyZWVfY291bnQgPSB1c3BpLT5zX2ZwYjsKQEAgLTE0OCw2ICsxMzgsNyBAQAogCQkJZnJhZ190b19mcmVlID0gdG1wOwogCQkJZnJlZV9jb3VudCA9IHVzcGktPnNfZnBiOwogCQl9CisJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOwogCX0KIAkKIAlpZiAoZnJlZV9jb3VudCA+IDApCkBAIC0xNjYsMTIgKzE1NywxMiBAQAogCWZyYWc0ID0gdWZzX2ZyYWdudW0gKGZyYWc0KTsKIAogCSpwID0gMDsKLQlpbm9kZS0+aV9ibG9ja3MgLT0gZnJhZzQgPDwgdXNwaS0+c19uc3Bmc2hpZnQ7Ci0JbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisKIAl1ZnNfZnJlZV9mcmFnbWVudHMgKGlub2RlLCB0bXAsIGZyYWc0KTsKKwltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKICBuZXh0MzoKIAotCVVGU0QoKCJFWElUXG4iKSkKKwlVRlNEKCJFWElUXG4iKTsKIAlyZXR1cm4gcmV0cnk7CiB9CiAKQEAgLTE4Niw3ICsxNzcsNyBAQAogCXVuc2lnbmVkIGZyYWdfdG9fZnJlZSwgZnJlZV9jb3VudDsKIAlpbnQgcmV0cnk7CiAKLQlVRlNEKCgiRU5URVJcbiIpKQorCVVGU0QoIkVOVEVSXG4iKTsKIAkJCiAJc2IgPSBpbm9kZS0+aV9zYjsKIAl1c3BpID0gVUZTX1NCKHNiKS0+c191c3BpOwpAQCAtMjI3LDcgKzIxOCw3IEBACiAJCQlmcmFnX3RvX2ZyZWUgPSB0bXA7CiAJCQlmcmVlX2NvdW50ID0gdXNwaS0+c19mcGI7CiAJCX0KLQkJaW5vZGUtPmlfYmxvY2tzIC09IHVzcGktPnNfbnNwYjsKKwogCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKIAl9CiAKQEAgLTIzOCwyNiArMjI5LDIxIEBACiAJCWlmICgqdWJoX2dldF9hZGRyMzIoaW5kX3ViaCxpKSkKIAkJCWJyZWFrOwogCWlmIChpID49IHVzcGktPnNfYXBiKSB7Ci0JCWlmICh1YmhfbWF4X2Jjb3VudChpbmRfdWJoKSAhPSAxKSB7Ci0JCQlyZXRyeSA9IDE7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0bXAgPSBmczMyX3RvX2NwdShzYiwgKnApOwotCQkJKnAgPSAwOwotCQkJaW5vZGUtPmlfYmxvY2tzIC09IHVzcGktPnNfbnNwYjsKLQkJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOwotCQkJdWZzX2ZyZWVfYmxvY2tzIChpbm9kZSwgdG1wLCB1c3BpLT5zX2ZwYik7Ci0JCQl1YmhfYmZvcmdldChpbmRfdWJoKTsKLQkJCWluZF91YmggPSBOVUxMOwotCQl9CisJCXRtcCA9IGZzMzJfdG9fY3B1KHNiLCAqcCk7CisJCSpwID0gMDsKKworCQl1ZnNfZnJlZV9ibG9ja3MgKGlub2RlLCB0bXAsIHVzcGktPnNfZnBiKTsKKwkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJCXViaF9iZm9yZ2V0KGluZF91YmgpOworCQlpbmRfdWJoID0gTlVMTDsKIAl9CiAJaWYgKElTX1NZTkMoaW5vZGUpICYmIGluZF91YmggJiYgdWJoX2J1ZmZlcl9kaXJ0eShpbmRfdWJoKSkgewotCQl1YmhfbGxfcndfYmxvY2sgKFNXUklURSwgMSwgJmluZF91YmgpOworCQl1YmhfbGxfcndfYmxvY2soU1dSSVRFLCBpbmRfdWJoKTsKIAkJdWJoX3dhaXRfb25fYnVmZmVyIChpbmRfdWJoKTsKIAl9CiAJdWJoX2JyZWxzZSAoaW5kX3ViaCk7CiAJCi0JVUZTRCgoIkVYSVRcbiIpKQorCVVGU0QoIkVYSVRcbiIpOwogCQogCXJldHVybiByZXRyeTsKIH0KQEAgLTI3MSw3ICsyNTcsNyBAQAogCV9fZnMzMiAqIGRpbmQ7CiAJaW50IHJldHJ5ID0gMDsKIAkKLQlVRlNEKCgiRU5URVJcbiIpKQorCVVGU0QoIkVOVEVSXG4iKTsKIAkKIAlzYiA9IGlub2RlLT5pX3NiOwogCXVzcGkgPSBVRlNfU0Ioc2IpLT5zX3VzcGk7CkBAIC0zMDYsMjUgKzI5MiwyMSBAQAogCQlpZiAoKnViaF9nZXRfYWRkcjMyIChkaW5kX2JoLCBpKSkKIAkJCWJyZWFrOwogCWlmIChpID49IHVzcGktPnNfYXBiKSB7Ci0JCWlmICh1YmhfbWF4X2Jjb3VudChkaW5kX2JoKSAhPSAxKQotCQkJcmV0cnkgPSAxOwotCQllbHNlIHsKLQkJCXRtcCA9IGZzMzJfdG9fY3B1KHNiLCAqcCk7Ci0JCQkqcCA9IDA7Ci0JCQlpbm9kZS0+aV9ibG9ja3MgLT0gdXNwaS0+c19uc3BiOwotCQkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7Ci0JCQl1ZnNfZnJlZV9ibG9ja3MgKGlub2RlLCB0bXAsIHVzcGktPnNfZnBiKTsKLQkJCXViaF9iZm9yZ2V0KGRpbmRfYmgpOwotCQkJZGluZF9iaCA9IE5VTEw7Ci0JCX0KKwkJdG1wID0gZnMzMl90b19jcHUoc2IsICpwKTsKKwkJKnAgPSAwOworCisJCXVmc19mcmVlX2Jsb2Nrcyhpbm9kZSwgdG1wLCB1c3BpLT5zX2ZwYik7CisJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCQl1YmhfYmZvcmdldChkaW5kX2JoKTsKKwkJZGluZF9iaCA9IE5VTEw7CiAJfQogCWlmIChJU19TWU5DKGlub2RlKSAmJiBkaW5kX2JoICYmIHViaF9idWZmZXJfZGlydHkoZGluZF9iaCkpIHsKLQkJdWJoX2xsX3J3X2Jsb2NrIChTV1JJVEUsIDEsICZkaW5kX2JoKTsKKwkJdWJoX2xsX3J3X2Jsb2NrKFNXUklURSwgZGluZF9iaCk7CiAJCXViaF93YWl0X29uX2J1ZmZlciAoZGluZF9iaCk7CiAJfQogCXViaF9icmVsc2UgKGRpbmRfYmgpOwogCQotCVVGU0QoKCJFWElUXG4iKSkKKwlVRlNEKCJFWElUXG4iKTsKIAkKIAlyZXR1cm4gcmV0cnk7CiB9CkBAIC0zMzksNyArMzIxLDcgQEAKIAlfX2ZzMzIgKiB0aW5kLCAqIHA7CiAJaW50IHJldHJ5OwogCQotCVVGU0QoKCJFTlRFUlxuIikpCisJVUZTRCgiRU5URVJcbiIpOwogCiAJc2IgPSBpbm9kZS0+aV9zYjsKIAl1c3BpID0gVUZTX1NCKHNiKS0+c191c3BpOwpAQCAtMzcwLDI1ICszNTIsMjEgQEAKIAkJaWYgKCp1YmhfZ2V0X2FkZHIzMiAodGluZF9iaCwgaSkpCiAJCQlicmVhazsKIAlpZiAoaSA+PSB1c3BpLT5zX2FwYikgewotCQlpZiAodWJoX21heF9iY291bnQodGluZF9iaCkgIT0gMSkKLQkJCXJldHJ5ID0gMTsKLQkJZWxzZSB7Ci0JCQl0bXAgPSBmczMyX3RvX2NwdShzYiwgKnApOwotCQkJKnAgPSAwOwotCQkJaW5vZGUtPmlfYmxvY2tzIC09IHVzcGktPnNfbnNwYjsKLQkJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOwotCQkJdWZzX2ZyZWVfYmxvY2tzIChpbm9kZSwgdG1wLCB1c3BpLT5zX2ZwYik7Ci0JCQl1YmhfYmZvcmdldCh0aW5kX2JoKTsKLQkJCXRpbmRfYmggPSBOVUxMOwotCQl9CisJCXRtcCA9IGZzMzJfdG9fY3B1KHNiLCAqcCk7CisJCSpwID0gMDsKKworCQl1ZnNfZnJlZV9ibG9ja3MoaW5vZGUsIHRtcCwgdXNwaS0+c19mcGIpOworCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwkJdWJoX2Jmb3JnZXQodGluZF9iaCk7CisJCXRpbmRfYmggPSBOVUxMOwogCX0KIAlpZiAoSVNfU1lOQyhpbm9kZSkgJiYgdGluZF9iaCAmJiB1YmhfYnVmZmVyX2RpcnR5KHRpbmRfYmgpKSB7Ci0JCXViaF9sbF9yd19ibG9jayAoU1dSSVRFLCAxLCAmdGluZF9iaCk7CisJCXViaF9sbF9yd19ibG9jayhTV1JJVEUsIHRpbmRfYmgpOwogCQl1Ymhfd2FpdF9vbl9idWZmZXIgKHRpbmRfYmgpOwogCX0KIAl1YmhfYnJlbHNlICh0aW5kX2JoKTsKIAkKLQlVRlNEKCgiRVhJVFxuIikpCisJVUZTRCgiRVhJVFxuIik7CiAJcmV0dXJuIHJldHJ5OwogfQogCQkKQEAgLTM5OSw3ICszNzcsNyBAQAogCXN0cnVjdCB1ZnNfc2JfcHJpdmF0ZV9pbmZvICogdXNwaTsKIAlpbnQgcmV0cnk7CiAJCi0JVUZTRCgoIkVOVEVSXG4iKSkKKwlVRlNEKCJFTlRFUlxuIik7CiAJc2IgPSBpbm9kZS0+aV9zYjsKIAl1c3BpID0gVUZTX1NCKHNiKS0+c191c3BpOwogCkBAIC00MzAsNSArNDA4LDUgQEAKIAl1ZnNpLT5pX2xhc3RmcmFnID0gRElSRUNUX0ZSQUdNRU5UOwogCXVubG9ja19rZXJuZWwoKTsKIAltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKLQlVRlNEKCgiRVhJVFxuIikpCisJVUZTRCgiRVhJVFxuIik7CiB9CmRpZmYgLS1naXQgYS9mcy91ZnMvdXRpbC5jIGIvZnMvdWZzL3V0aWwuYwppbmRleCA1OWFjYzhmLi5hMmYxM2Y0IDEwMDY0NAotLS0gYS9mcy91ZnMvdXRpbC5jCisrKyBiL2ZzL3Vmcy91dGlsLmMKQEAgLTE0LDE1ICsxNCw2IEBACiAjaW5jbHVkZSAic3dhYi5oIgogI2luY2x1ZGUgInV0aWwuaCIKIAotI3VuZGVmIFVGU19VVElMU19ERUJVRwotCi0jaWZkZWYgVUZTX1VUSUxTX0RFQlVHCi0jZGVmaW5lIFVGU0QoeCkgcHJpbnRrKCIoJXMsICVkKSwgJXM6ICIsIF9fRklMRV9fLCBfX0xJTkVfXywgX19GVU5DVElPTl9fKTsgcHJpbnRrIHg7Ci0jZWxzZQotI2RlZmluZSBVRlNEKHgpCi0jZW5kaWYKLQotCiBzdHJ1Y3QgdWZzX2J1ZmZlcl9oZWFkICogX3ViaF9icmVhZF8gKHN0cnVjdCB1ZnNfc2JfcHJpdmF0ZV9pbmZvICogdXNwaSwKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1NjQgZnJhZ21lbnQsIHU2NCBzaXplKQogewpAQCAtNjMsMTcgKzU0LDE3IEBACiAJY291bnQgPSBzaXplID4+IHVzcGktPnNfZnNoaWZ0OwogCWlmIChjb3VudCA8PSAwIHx8IGNvdW50ID4gVUZTX01BWEZSQUcpCiAJCXJldHVybiBOVUxMOwotCVVTUElfVUJILT5mcmFnbWVudCA9IGZyYWdtZW50OwotCVVTUElfVUJILT5jb3VudCA9IGNvdW50OworCVVTUElfVUJIKHVzcGkpLT5mcmFnbWVudCA9IGZyYWdtZW50OworCVVTUElfVUJIKHVzcGkpLT5jb3VudCA9IGNvdW50OwogCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotCQlpZiAoIShVU1BJX1VCSC0+YmhbaV0gPSBzYl9icmVhZChzYiwgZnJhZ21lbnQgKyBpKSkpCisJCWlmICghKFVTUElfVUJIKHVzcGkpLT5iaFtpXSA9IHNiX2JyZWFkKHNiLCBmcmFnbWVudCArIGkpKSkKIAkJCWdvdG8gZmFpbGVkOwogCWZvciAoOyBpIDwgVUZTX01BWEZSQUc7IGkrKykKLQkJVVNQSV9VQkgtPmJoW2ldID0gTlVMTDsKLQlyZXR1cm4gVVNQSV9VQkg7CisJCVVTUElfVUJIKHVzcGkpLT5iaFtpXSA9IE5VTEw7CisJcmV0dXJuIFVTUElfVUJIKHVzcGkpOwogZmFpbGVkOgogCWZvciAoaiA9IDA7IGogPCBpOyBqKyspCi0JCWJyZWxzZSAoVVNQSV9VQkgtPmJoW2pdKTsKKwkJYnJlbHNlIChVU1BJX1VCSCh1c3BpKS0+Ymhbal0pOwogCXJldHVybiBOVUxMOwogfQogCkBAIC05MCwxMSArODEsMTEgQEAKIHZvaWQgdWJoX2JyZWxzZV91c3BpIChzdHJ1Y3QgdWZzX3NiX3ByaXZhdGVfaW5mbyAqIHVzcGkpCiB7CiAJdW5zaWduZWQgaTsKLQlpZiAoIVVTUElfVUJIKQorCWlmICghVVNQSV9VQkgodXNwaSkpCiAJCXJldHVybjsKLQlmb3IgKCBpID0gMDsgaSA8IFVTUElfVUJILT5jb3VudDsgaSsrICkgewotCQlicmVsc2UgKFVTUElfVUJILT5iaFtpXSk7Ci0JCVVTUElfVUJILT5iaFtpXSA9IE5VTEw7CisJZm9yICggaSA9IDA7IGkgPCBVU1BJX1VCSCh1c3BpKS0+Y291bnQ7IGkrKyApIHsKKwkJYnJlbHNlIChVU1BJX1VCSCh1c3BpKS0+YmhbaV0pOworCQlVU1BJX1VCSCh1c3BpKS0+YmhbaV0gPSBOVUxMOwogCX0KIH0KIApAQCAtMTIxLDEzICsxMTIsMTIgQEAKIAl9CiB9CiAKLXZvaWQgdWJoX2xsX3J3X2Jsb2NrIChpbnQgcncsIHVuc2lnbmVkIG5yLCBzdHJ1Y3QgdWZzX2J1ZmZlcl9oZWFkICogdWJoW10pCit2b2lkIHViaF9sbF9yd19ibG9jayhpbnQgcncsIHN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgKnViaCkKIHsKLQl1bnNpZ25lZCBpOwogCWlmICghdWJoKQogCQlyZXR1cm47Ci0JZm9yICggaSA9IDA7IGkgPCBucjsgaSsrICkKLQkJbGxfcndfYmxvY2sgKHJ3LCB1YmhbaV0tPmNvdW50LCB1YmhbaV0tPmJoKTsKKworCWxsX3J3X2Jsb2NrKHJ3LCB1YmgtPmNvdW50LCB1YmgtPmJoKTsKIH0KIAogdm9pZCB1Ymhfd2FpdF9vbl9idWZmZXIgKHN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgKiB1YmgpCkBAIC0xMzksMTggKzEyOSw2IEBACiAJCXdhaXRfb25fYnVmZmVyICh1YmgtPmJoW2ldKTsKIH0KIAotdW5zaWduZWQgdWJoX21heF9iY291bnQgKHN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgKiB1YmgpCi17Ci0JdW5zaWduZWQgaTsKLQl1bnNpZ25lZCBtYXggPSAwOwotCWlmICghdWJoKQotCQlyZXR1cm4gMDsKLQlmb3IgKCBpID0gMDsgaSA8IHViaC0+Y291bnQ7IGkrKyApIAotCQlpZiAoIGF0b21pY19yZWFkKCZ1YmgtPmJoW2ldLT5iX2NvdW50KSA+IG1heCApCi0JCQltYXggPSBhdG9taWNfcmVhZCgmdWJoLT5iaFtpXS0+Yl9jb3VudCk7Ci0JcmV0dXJuIG1heDsKLX0KLQogdm9pZCB1YmhfYmZvcmdldCAoc3RydWN0IHVmc19idWZmZXJfaGVhZCAqIHViaCkKIHsKIAl1bnNpZ25lZCBpOwpkaWZmIC0tZ2l0IGEvZnMvdWZzL3V0aWwuaCBiL2ZzL3Vmcy91dGlsLmgKaW5kZXggNDhkNmQ5Yi4uNDA2OTgxZiAxMDA2NDQKLS0tIGEvZnMvdWZzL3V0aWwuaAorKysgYi9mcy91ZnMvdXRpbC5oCkBAIC0xNywxMCArMTcsMTYgQEAKICNkZWZpbmUgaW5fcmFuZ2UoYixmaXJzdCxsZW4pCSgoYik+PShmaXJzdCkmJihiKTwoZmlyc3QpKyhsZW4pKQogCiAvKgotICogbWFjcm9zIHVzZWQgZm9yIHJldHlwaW5nCisgKiBmdW5jdGlvbnMgdXNlZCBmb3IgcmV0eXBpbmcKICAqLwotI2RlZmluZSBVQ1BJX1VCSCAoKHN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgKil1Y3BpKQotI2RlZmluZSBVU1BJX1VCSCAoKHN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgKil1c3BpKQorc3RhdGljIGlubGluZSBzdHJ1Y3QgdWZzX2J1ZmZlcl9oZWFkICpVQ1BJX1VCSChzdHJ1Y3QgdWZzX2NnX3ByaXZhdGVfaW5mbyAqY3BpKQoreworCXJldHVybiAmY3BpLT5jX3ViaDsKK30KK3N0YXRpYyBpbmxpbmUgc3RydWN0IHVmc19idWZmZXJfaGVhZCAqVVNQSV9VQkgoc3RydWN0IHVmc19zYl9wcml2YXRlX2luZm8gKnNwaSkKK3sKKwlyZXR1cm4gJnNwaS0+c191Ymg7Cit9CiAKIAogCkBAIC0zMywxMiArMzksMTIgQEAKIHsKIAlzd2l0Y2ggKFVGU19TQihzYiktPnNfZmxhZ3MgJiBVRlNfU1RfTUFTSykgewogCWNhc2UgVUZTX1NUX1NVTjoKLQkJcmV0dXJuIGZzMzJfdG9fY3B1KHNiLCB1c2IzLT5mc191Mi5mc19zdW4uZnNfc3RhdGUpOworCQlyZXR1cm4gZnMzMl90b19jcHUoc2IsIHVzYjMtPmZzX3VuMi5mc19zdW4uZnNfc3RhdGUpOwogCWNhc2UgVUZTX1NUX1NVTng4NjoKIAkJcmV0dXJuIGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc191MS5mc19zdW54ODYuZnNfc3RhdGUpOwogCWNhc2UgVUZTX1NUXzQ0QlNEOgogCWRlZmF1bHQ6Ci0JCXJldHVybiBmczMyX3RvX2NwdShzYiwgdXNiMy0+ZnNfdTIuZnNfNDQuZnNfc3RhdGUpOworCQlyZXR1cm4gZnMzMl90b19jcHUoc2IsIHVzYjMtPmZzX3VuMi5mc180NC5mc19zdGF0ZSk7CiAJfQogfQogCkBAIC00OCwxMyArNTQsMTMgQEAKIHsKIAlzd2l0Y2ggKFVGU19TQihzYiktPnNfZmxhZ3MgJiBVRlNfU1RfTUFTSykgewogCWNhc2UgVUZTX1NUX1NVTjoKLQkJdXNiMy0+ZnNfdTIuZnNfc3VuLmZzX3N0YXRlID0gY3B1X3RvX2ZzMzIoc2IsIHZhbHVlKTsKKwkJdXNiMy0+ZnNfdW4yLmZzX3N1bi5mc19zdGF0ZSA9IGNwdV90b19mczMyKHNiLCB2YWx1ZSk7CiAJCWJyZWFrOwogCWNhc2UgVUZTX1NUX1NVTng4NjoKIAkJdXNiMS0+ZnNfdTEuZnNfc3VueDg2LmZzX3N0YXRlID0gY3B1X3RvX2ZzMzIoc2IsIHZhbHVlKTsKIAkJYnJlYWs7CiAJY2FzZSBVRlNfU1RfNDRCU0Q6Ci0JCXVzYjMtPmZzX3UyLmZzXzQ0LmZzX3N0YXRlID0gY3B1X3RvX2ZzMzIoc2IsIHZhbHVlKTsKKwkJdXNiMy0+ZnNfdW4yLmZzXzQ0LmZzX3N0YXRlID0gY3B1X3RvX2ZzMzIoc2IsIHZhbHVlKTsKIAkJYnJlYWs7CiAJfQogfQpAQCAtNjQsNyArNzAsNyBAQAogCQkgIHN0cnVjdCB1ZnNfc3VwZXJfYmxvY2tfdGhpcmQgKnVzYjMpCiB7CiAJaWYgKChVRlNfU0Ioc2IpLT5zX2ZsYWdzICYgVUZTX1NUX01BU0spID09IFVGU19TVF9TVU54ODYpCi0JCXJldHVybiBmczMyX3RvX2NwdShzYiwgdXNiMy0+ZnNfdTIuZnNfc3VueDg2LmZzX25wc2VjdCk7CisJCXJldHVybiBmczMyX3RvX2NwdShzYiwgdXNiMy0+ZnNfdW4yLmZzX3N1bng4Ni5mc19ucHNlY3QpOwogCWVsc2UKIAkJcmV0dXJuIGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc191MS5mc19zdW4uZnNfbnBzZWN0KTsKIH0KQEAgLTc2LDE2ICs4MiwxNiBAQAogCiAJc3dpdGNoIChVRlNfU0Ioc2IpLT5zX2ZsYWdzICYgVUZTX1NUX01BU0spIHsKIAljYXNlIFVGU19TVF9TVU46Ci0JCSgoX19mczMyICopJnRtcClbMF0gPSB1c2IzLT5mc191Mi5mc19zdW4uZnNfcWJtYXNrWzBdOwotCQkoKF9fZnMzMiAqKSZ0bXApWzFdID0gdXNiMy0+ZnNfdTIuZnNfc3VuLmZzX3FibWFza1sxXTsKKwkJKChfX2ZzMzIgKikmdG1wKVswXSA9IHVzYjMtPmZzX3VuMi5mc19zdW4uZnNfcWJtYXNrWzBdOworCQkoKF9fZnMzMiAqKSZ0bXApWzFdID0gdXNiMy0+ZnNfdW4yLmZzX3N1bi5mc19xYm1hc2tbMV07CiAJCWJyZWFrOwogCWNhc2UgVUZTX1NUX1NVTng4NjoKLQkJKChfX2ZzMzIgKikmdG1wKVswXSA9IHVzYjMtPmZzX3UyLmZzX3N1bng4Ni5mc19xYm1hc2tbMF07Ci0JCSgoX19mczMyICopJnRtcClbMV0gPSB1c2IzLT5mc191Mi5mc19zdW54ODYuZnNfcWJtYXNrWzFdOworCQkoKF9fZnMzMiAqKSZ0bXApWzBdID0gdXNiMy0+ZnNfdW4yLmZzX3N1bng4Ni5mc19xYm1hc2tbMF07CisJCSgoX19mczMyICopJnRtcClbMV0gPSB1c2IzLT5mc191bjIuZnNfc3VueDg2LmZzX3FibWFza1sxXTsKIAkJYnJlYWs7CiAJY2FzZSBVRlNfU1RfNDRCU0Q6Ci0JCSgoX19mczMyICopJnRtcClbMF0gPSB1c2IzLT5mc191Mi5mc180NC5mc19xYm1hc2tbMF07Ci0JCSgoX19mczMyICopJnRtcClbMV0gPSB1c2IzLT5mc191Mi5mc180NC5mc19xYm1hc2tbMV07CisJCSgoX19mczMyICopJnRtcClbMF0gPSB1c2IzLT5mc191bjIuZnNfNDQuZnNfcWJtYXNrWzBdOworCQkoKF9fZnMzMiAqKSZ0bXApWzFdID0gdXNiMy0+ZnNfdW4yLmZzXzQ0LmZzX3FibWFza1sxXTsKIAkJYnJlYWs7CiAJfQogCkBAIC05OSwxNiArMTA1LDE2IEBACiAKIAlzd2l0Y2ggKFVGU19TQihzYiktPnNfZmxhZ3MgJiBVRlNfU1RfTUFTSykgewogCWNhc2UgVUZTX1NUX1NVTjoKLQkJKChfX2ZzMzIgKikmdG1wKVswXSA9IHVzYjMtPmZzX3UyLmZzX3N1bi5mc19xZm1hc2tbMF07Ci0JCSgoX19mczMyICopJnRtcClbMV0gPSB1c2IzLT5mc191Mi5mc19zdW4uZnNfcWZtYXNrWzFdOworCQkoKF9fZnMzMiAqKSZ0bXApWzBdID0gdXNiMy0+ZnNfdW4yLmZzX3N1bi5mc19xZm1hc2tbMF07CisJCSgoX19mczMyICopJnRtcClbMV0gPSB1c2IzLT5mc191bjIuZnNfc3VuLmZzX3FmbWFza1sxXTsKIAkJYnJlYWs7CiAJY2FzZSBVRlNfU1RfU1VOeDg2OgotCQkoKF9fZnMzMiAqKSZ0bXApWzBdID0gdXNiMy0+ZnNfdTIuZnNfc3VueDg2LmZzX3FmbWFza1swXTsKLQkJKChfX2ZzMzIgKikmdG1wKVsxXSA9IHVzYjMtPmZzX3UyLmZzX3N1bng4Ni5mc19xZm1hc2tbMV07CisJCSgoX19mczMyICopJnRtcClbMF0gPSB1c2IzLT5mc191bjIuZnNfc3VueDg2LmZzX3FmbWFza1swXTsKKwkJKChfX2ZzMzIgKikmdG1wKVsxXSA9IHVzYjMtPmZzX3VuMi5mc19zdW54ODYuZnNfcWZtYXNrWzFdOwogCQlicmVhazsKIAljYXNlIFVGU19TVF80NEJTRDoKLQkJKChfX2ZzMzIgKikmdG1wKVswXSA9IHVzYjMtPmZzX3UyLmZzXzQ0LmZzX3FmbWFza1swXTsKLQkJKChfX2ZzMzIgKikmdG1wKVsxXSA9IHVzYjMtPmZzX3UyLmZzXzQ0LmZzX3FmbWFza1sxXTsKKwkJKChfX2ZzMzIgKikmdG1wKVswXSA9IHVzYjMtPmZzX3VuMi5mc180NC5mc19xZm1hc2tbMF07CisJCSgoX19mczMyICopJnRtcClbMV0gPSB1c2IzLT5mc191bjIuZnNfNDQuZnNfcWZtYXNrWzFdOwogCQlicmVhazsKIAl9CiAKQEAgLTIzNiw5ICsyNDIsOCBAQAogZXh0ZXJuIHZvaWQgdWJoX2JyZWxzZV91c3BpIChzdHJ1Y3QgdWZzX3NiX3ByaXZhdGVfaW5mbyAqKTsKIGV4dGVybiB2b2lkIHViaF9tYXJrX2J1ZmZlcl9kaXJ0eSAoc3RydWN0IHVmc19idWZmZXJfaGVhZCAqKTsKIGV4dGVybiB2b2lkIHViaF9tYXJrX2J1ZmZlcl91cHRvZGF0ZSAoc3RydWN0IHVmc19idWZmZXJfaGVhZCAqLCBpbnQpOwotZXh0ZXJuIHZvaWQgdWJoX2xsX3J3X2Jsb2NrIChpbnQsIHVuc2lnbmVkLCBzdHJ1Y3QgdWZzX2J1ZmZlcl9oZWFkICoqKTsKK2V4dGVybiB2b2lkIHViaF9sbF9yd19ibG9jayhpbnQsIHN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgKik7CiBleHRlcm4gdm9pZCB1Ymhfd2FpdF9vbl9idWZmZXIgKHN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgKik7Ci1leHRlcm4gdW5zaWduZWQgdWJoX21heF9iY291bnQgKHN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgKik7CiBleHRlcm4gdm9pZCB1YmhfYmZvcmdldCAoc3RydWN0IHVmc19idWZmZXJfaGVhZCAqKTsKIGV4dGVybiBpbnQgIHViaF9idWZmZXJfZGlydHkgKHN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgKik7CiAjZGVmaW5lIHViaF91YmhjcHltZW0obWVtLHViaCxzaXplKSBfdWJoX3ViaGNweW1lbV8odXNwaSxtZW0sdWJoLHNpemUpCkBAIC0yOTcsNDAgKzMwMiwyNiBAQAogI2RlZmluZSB1YmhfYmxrbWFwKHViaCxiZWdpbixiaXQpIFwKIAkoKCp1YmhfZ2V0X2FkZHIodWJoLCAoYmVnaW4pICsgKChiaXQpID4+IDMpKSA+PiAoKGJpdCkgJiA3KSkgJiAoMHhmZiA+PiAoVUZTX01BWEZSQUcgLSB1c3BpLT5zX2ZwYikpKQogCi0KLS8qCi0gKiBNYWNyb3MgZm9yIGFjY2VzcyB0byBzdXBlcmJsb2NrIGFycmF5IHN0cnVjdHVyZXMKLSAqLwotI2RlZmluZSB1YmhfcG9zdGJsKHViaCxjeWxubyxpKSBcCi0JKCh1c3BpLT5zX3Bvc3RibGZvcm1hdCAhPSBVRlNfRFlOQU1JQ1BPU1RCTEZNVCkgXAotCT8gKCooX19zMTYqKSh1YmhfZ2V0X2FkZHIodWJoLCBcCi0JKHVuc2lnbmVkKSgmKChzdHJ1Y3QgdWZzX3N1cGVyX2Jsb2NrICopMCktPmZzX29wb3N0YmwpIFwKLQkrICgoKGN5bG5vKSAqIDE2ICsgKGkpKSA8PCAxKSApICkpIFwKLQk6ICgqKF9fczE2KikodWJoX2dldF9hZGRyKHViaCwgXAotCXVzcGktPnNfcG9zdGJsb2ZmICsgKCgoY3lsbm8pICogdXNwaS0+c19ucnBvcyArIChpKSkgPDwgMSkgKSkpKQotCi0jZGVmaW5lIHViaF9yb3RibCh1YmgsaSkgXAotCSgodXNwaS0+c19wb3N0Ymxmb3JtYXQgIT0gVUZTX0RZTkFNSUNQT1NUQkxGTVQpIFwKLQk/ICgqKF9fdTgqKSh1YmhfZ2V0X2FkZHIodWJoLCBcCi0JKHVuc2lnbmVkKSgmKChzdHJ1Y3QgdWZzX3N1cGVyX2Jsb2NrICopMCktPmZzX3NwYWNlKSArIChpKSkpKSBcCi0JOiAoKihfX3U4KikodWJoX2dldF9hZGRyKHViaCwgdXNwaS0+c19yb3RibG9mZiArIChpKSkpKSkKLQogLyoKICAqIERldGVybWluZSB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBmcmFncyBnaXZlbiBhCiAgKiBwZXJjZW50YWdlIHRvIGhvbGQgaW4gcmVzZXJ2ZS4KICAqLwotI2RlZmluZSB1ZnNfZnJlZXNwYWNlKHVzYiwgcGVyY2VudHJlc2VydmVkKSBcCi0JKHVmc19ibGtzdG9mcmFncyhmczMyX3RvX2NwdShzYiwgKHVzYiktPmZzX2NzdG90YWwuY3NfbmJmcmVlKSkgKyBcCi0JZnMzMl90b19jcHUoc2IsICh1c2IpLT5mc19jc3RvdGFsLmNzX25mZnJlZSkgLSAodXNwaS0+c19kc2l6ZSAqIChwZXJjZW50cmVzZXJ2ZWQpIC8gMTAwKSkKK3N0YXRpYyBpbmxpbmUgdTY0Cit1ZnNfZnJlZXNwYWNlKHN0cnVjdCB1ZnNfc2JfcHJpdmF0ZV9pbmZvICp1c3BpLCBpbnQgcGVyY2VudHJlc2VydmVkKQoreworCXJldHVybiB1ZnNfYmxrc3RvZnJhZ3ModXNwaS0+Y3NfdG90YWwuY3NfbmJmcmVlKSArCisJCXVzcGktPmNzX3RvdGFsLmNzX25mZnJlZSAtCisJCSh1c3BpLT5zX2RzaXplICogKHBlcmNlbnRyZXNlcnZlZCkgLyAxMDApOworfQogCiAvKgogICogTWFjcm9zIHRvIGFjY2VzcyBjeWxpbmRlciBncm91cCBhcnJheSBzdHJ1Y3R1cmVzCiAgKi8KICNkZWZpbmUgdWJoX2NnX2Jsa3RvdCh1Y3BpLGN5bG5vKSBcCi0JKCooKF9fZnMzMiopdWJoX2dldF9hZGRyKFVDUElfVUJILCAodWNwaSktPmNfYnRvdG9mZiArICgoY3lsbm8pIDw8IDIpKSkpCisJKCooKF9fZnMzMiopdWJoX2dldF9hZGRyKFVDUElfVUJIKHVjcGkpLCAodWNwaSktPmNfYnRvdG9mZiArICgoY3lsbm8pIDw8IDIpKSkpCiAKICNkZWZpbmUgdWJoX2NnX2Jsa3ModWNwaSxjeWxubyxycG9zKSBcCi0JKCooKF9fZnMxNiopdWJoX2dldF9hZGRyKFVDUElfVUJILCBcCisJKCooKF9fZnMxNiopdWJoX2dldF9hZGRyKFVDUElfVUJIKHVjcGkpLCBcCiAJKHVjcGkpLT5jX2JvZmYgKyAoKChjeWxubykgKiB1c3BpLT5zX25ycG9zICsgKHJwb3MpKSA8PCAxICkpKSkKIAogLyoKQEAgLTUwOCwyOSArNDk5LDMgQEAKIAlpZiAoZnJhZ3NpemUgPiAwICYmIGZyYWdzaXplIDwgdXNwaS0+c19mcGIpCiAJCWZzMzJfYWRkKHNiLCAmZnJhZ2xpc3RbZnJhZ3NpemVdLCBjbnQpOwogfQotCi0jZGVmaW5lIHViaF9zY2FuYyh1YmgsYmVnaW4sc2l6ZSx0YWJsZSxtYXNrKSBfdWJoX3NjYW5jXyh1c3BpLHViaCxiZWdpbixzaXplLHRhYmxlLG1hc2spCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIF91Ymhfc2NhbmNfKHN0cnVjdCB1ZnNfc2JfcHJpdmF0ZV9pbmZvICogdXNwaSwgc3RydWN0IHVmc19idWZmZXJfaGVhZCAqIHViaCwgCi0JdW5zaWduZWQgYmVnaW4sIHVuc2lnbmVkIHNpemUsIHVuc2lnbmVkIGNoYXIgKiB0YWJsZSwgdW5zaWduZWQgY2hhciBtYXNrKQotewotCXVuc2lnbmVkIHJlc3QsIG9mZnNldDsKLQl1bnNpZ25lZCBjaGFyICogY3A7Ci0JCi0KLQlvZmZzZXQgPSBiZWdpbiAmIH51c3BpLT5zX2ZtYXNrOwotCWJlZ2luID4+PSB1c3BpLT5zX2ZzaGlmdDsKLQlmb3IgKDs7KSB7Ci0JCWlmICgob2Zmc2V0ICsgc2l6ZSkgPCB1c3BpLT5zX2ZzaXplKQotCQkJcmVzdCA9IHNpemU7Ci0JCWVsc2UKLQkJCXJlc3QgPSB1c3BpLT5zX2ZzaXplIC0gb2Zmc2V0OwotCQlzaXplIC09IHJlc3Q7Ci0JCWNwID0gdWJoLT5iaFtiZWdpbl0tPmJfZGF0YSArIG9mZnNldDsKLQkJd2hpbGUgKCh0YWJsZVsqY3ArK10gJiBtYXNrKSA9PSAwICYmIC0tcmVzdCk7Ci0JCWlmIChyZXN0IHx8ICFzaXplKQotCQkJYnJlYWs7Ci0JCWJlZ2luKys7Ci0JCW9mZnNldCA9IDA7Ci0JfQotCXJldHVybiAoc2l6ZSArIHJlc3QpOwotfQpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfZmlsZS5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfZmlsZS5jCmluZGV4IDcwNjYyMzcuLjNkNGY2ZGYgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2ZpbGUuYworKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19maWxlLmMKQEAgLTI5OSw3ICsyOTksOCBAQAogCiBTVEFUSUMgaW50CiB4ZnNfZmlsZV9jbG9zZSgKLQlzdHJ1Y3QgZmlsZQkqZmlscCkKKwlzdHJ1Y3QgZmlsZQkqZmlscCwKKwlmbF9vd25lcl90CWlkKQogewogCXJldHVybiAtYmh2X3ZvcF9jbG9zZSh2bl9mcm9tX2lub2RlKGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlKSwgMCwKIAkJCQlmaWxlX2NvdW50KGZpbHApID4gMSA/IExfRkFMU0UgOiBMX1RSVUUsIE5VTEwpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYWxwaGEvZmxvcHB5LmggYi9pbmNsdWRlL2FzbS1hbHBoYS9mbG9wcHkuaAppbmRleCBlMTc3ZDQxLi4yMTgxNmQzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hbHBoYS9mbG9wcHkuaAorKysgYi9pbmNsdWRlL2FzbS1hbHBoYS9mbG9wcHkuaApAQCAtMjUsOSArMjUsOCBAQAogI2RlZmluZSBmZF9lbmFibGVfaXJxKCkgICAgICAgICBlbmFibGVfaXJxKEZMT1BQWV9JUlEpCiAjZGVmaW5lIGZkX2Rpc2FibGVfaXJxKCkgICAgICAgIGRpc2FibGVfaXJxKEZMT1BQWV9JUlEpCiAjZGVmaW5lIGZkX2NhY2hlZmx1c2goYWRkcixzaXplKSAvKiBub3RoaW5nICovCi0jZGVmaW5lIGZkX3JlcXVlc3RfaXJxKCkgICAgICAgIHJlcXVlc3RfaXJxKEZMT1BQWV9JUlEsIGZsb3BweV9pbnRlcnJ1cHQsIFwKLQkJCQkJICAgIFNBX0lOVEVSUlVQVHxTQV9TQU1QTEVfUkFORE9NLCBcCi0JCQkJICAgICAgICAgICAgImZsb3BweSIsIE5VTEwpCisjZGVmaW5lIGZkX3JlcXVlc3RfaXJxKCkgICAgICAgIHJlcXVlc3RfaXJxKEZMT1BQWV9JUlEsIGZsb3BweV9pbnRlcnJ1cHQsXAorCQkJCQkgICAgU0FfSU5URVJSVVBULCAiZmxvcHB5IiwgTlVMTCkKICNkZWZpbmUgZmRfZnJlZV9pcnEoKSAgICAgICAgICAgZnJlZV9pcnEoRkxPUFBZX0lSUSwgTlVMTCk7CiAKICNpZmRlZiBDT05GSUdfUENJCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vZmxvcHB5LmggYi9pbmNsdWRlL2FzbS1hcm0vZmxvcHB5LmgKaW5kZXggNmVhNjU3Yy4uYWEwYzhkMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2Zsb3BweS5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9mbG9wcHkuaApAQCAtMjUsNyArMjUsNyBAQAogCiAjZGVmaW5lIGZkX2luYihwb3J0KQkJaW5iKChwb3J0KSkKICNkZWZpbmUgZmRfcmVxdWVzdF9pcnEoKQlyZXF1ZXN0X2lycShJUlFfRkxPUFBZRElTSyxmbG9wcHlfaW50ZXJydXB0LFwKLQkJCQkJU0FfSU5URVJSVVBUfFNBX1NBTVBMRV9SQU5ET00sImZsb3BweSIsTlVMTCkKKwkJCQkJICAgIFNBX0lOVEVSUlVQVCwiZmxvcHB5IixOVUxMKQogI2RlZmluZSBmZF9mcmVlX2lycSgpCQlmcmVlX2lycShJUlFfRkxPUFBZRElTSyxOVUxMKQogI2RlZmluZSBmZF9kaXNhYmxlX2lycSgpCWRpc2FibGVfaXJxKElSUV9GTE9QUFlESVNLKQogI2RlZmluZSBmZF9lbmFibGVfaXJxKCkJCWVuYWJsZV9pcnEoSVJRX0ZMT1BQWURJU0spCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vaGFyZHdhcmUvbG9jb21vLmggYi9pbmNsdWRlL2FzbS1hcm0vaGFyZHdhcmUvbG9jb21vLmgKaW5kZXggNWYxMDA0OC4uMjJkZmIxNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2hhcmR3YXJlL2xvY29tby5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9oYXJkd2FyZS9sb2NvbW8uaApAQCAtMTExLDYgKzExMSw4IEBACiAjZGVmaW5lIExPQ09NT19BTFMJCTB4MDAJLyogQWRqdXN0IGxpZ2h0IGN5Y2xlICovCiAjZGVmaW5lIExPQ09NT19BTEQJCTB4MDQJLyogQWRqdXN0IGxpZ2h0IGR1dHkgKi8KIAorI2RlZmluZSBMT0NPTU9fQUxDX0VOCQkweDgwMDAKKwogLyogQmFja2xpZ2h0IGNvbnRyb2xsZXI6IFRGVCBzaWduYWwgKi8KICNkZWZpbmUgTE9DT01PX0JBQ0tMSUdIVAkweDM4CiAjZGVmaW5lIExPQ09NT19UQwkJMHgwMAkJLyogVEZUIGNvbnRyb2wgc2lnbmFsICovCkBAIC0yMDMsNCArMjA1LDcgQEAKIC8qIE02MjMzMiBjb250cm9sIGZ1bmN0aW9uICovCiB2b2lkIGxvY29tb19tNjIzMzJfc2VuZGRhdGEoc3RydWN0IGxvY29tb19kZXYgKmxkZXYsIHVuc2lnbmVkIGludCBkYWNfZGF0YSwgaW50IGNoYW5uZWwpOwogCisvKiBGcm9udGxpZ2h0IGNvbnRyb2wgKi8KK3ZvaWQgbG9jb21vX2Zyb250bGlnaHRfc2V0KHN0cnVjdCBsb2NvbW9fZGV2ICpkZXYsIGludCBkdXR5LCBpbnQgdnIsIGludCBicHdmKTsKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0yNi9mbG9wcHkuaCBiL2luY2x1ZGUvYXNtLWFybTI2L2Zsb3BweS5oCmluZGV4IDllMDkwYWQuLmExOGFmMDYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybTI2L2Zsb3BweS5oCisrKyBiL2luY2x1ZGUvYXNtLWFybTI2L2Zsb3BweS5oCkBAIC0yMiw3ICsyMiw3IEBACiAKICNkZWZpbmUgZmRfaW5iKHBvcnQpCQlpbmIoKHBvcnQpKQogI2RlZmluZSBmZF9yZXF1ZXN0X2lycSgpCXJlcXVlc3RfaXJxKElSUV9GTE9QUFlESVNLLGZsb3BweV9pbnRlcnJ1cHQsXAotCQkJCQlTQV9JTlRFUlJVUFR8U0FfU0FNUExFX1JBTkRPTSwiZmxvcHB5IixOVUxMKQorCQkJCQlTQV9JTlRFUlJVUFQsImZsb3BweSIsTlVMTCkKICNkZWZpbmUgZmRfZnJlZV9pcnEoKQkJZnJlZV9pcnEoSVJRX0ZMT1BQWURJU0ssTlVMTCkKICNkZWZpbmUgZmRfZGlzYWJsZV9pcnEoKQlkaXNhYmxlX2lycShJUlFfRkxPUFBZRElTSykKICNkZWZpbmUgZmRfZW5hYmxlX2lycSgpCQllbmFibGVfaXJxKElSUV9GTE9QUFlESVNLKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9idWcuaCBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvYnVnLmgKaW5kZXggMGNkOTcxMS4uODQ1Y2I2NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9idWcuaAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL2J1Zy5oCkBAIC0zOCw0ICszOCwxNyBAQAogI2VuZGlmCiAjZW5kaWYKIAorI2RlZmluZSBXQVJOX09OX09OQ0UoY29uZGl0aW9uKQkJCQlcCisoewkJCQkJCQlcCisJc3RhdGljIGludCBfX3dhcm5fb25jZSA9IDE7CQkJXAorCWludCBfX3JldCA9IDA7CQkJCQlcCisJCQkJCQkJXAorCWlmICh1bmxpa2VseSgoY29uZGl0aW9uKSAmJiBfX3dhcm5fb25jZSkpIHsJXAorCQlfX3dhcm5fb25jZSA9IDA7CQkJXAorCQlXQVJOX09OKDEpOwkJCQlcCisJCV9fcmV0ID0gMTsJCQkJXAorCX0JCQkJCQlcCisJX19yZXQ7CQkJCQkJXAorfSkKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1nZW5lcmljL3BlcmNwdS5oIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9wZXJjcHUuaAppbmRleCBjMGNhZjQzLi5jNzQ1MjExIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1nZW5lcmljL3BlcmNwdS5oCisrKyBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvcGVyY3B1LmgKQEAgLTE0LDYgKzE0LDcgQEAKIC8qIHZhciBpcyBpbiBkaXNjYXJkZWQgcmVnaW9uOiBvZmZzZXQgdG8gcGFydGljdWxhciBjb3B5IHdlIHdhbnQgKi8KICNkZWZpbmUgcGVyX2NwdSh2YXIsIGNwdSkgKCpSRUxPQ19ISURFKCZwZXJfY3B1X18jI3ZhciwgX19wZXJfY3B1X29mZnNldFtjcHVdKSkKICNkZWZpbmUgX19nZXRfY3B1X3Zhcih2YXIpIHBlcl9jcHUodmFyLCBzbXBfcHJvY2Vzc29yX2lkKCkpCisjZGVmaW5lIF9fcmF3X2dldF9jcHVfdmFyKHZhcikgcGVyX2NwdSh2YXIsIHJhd19zbXBfcHJvY2Vzc29yX2lkKCkpCiAKIC8qIEEgbWFjcm8gdG8gYXZvaWQgI2luY2x1ZGUgaGVsbC4uLiAqLwogI2RlZmluZSBwZXJjcHVfbW9kY29weShwY3B1ZHN0LCBzcmMsIHNpemUpCQkJXApAQCAtMzAsNiArMzEsNyBAQAogCiAjZGVmaW5lIHBlcl9jcHUodmFyLCBjcHUpCQkJKCooKHZvaWQpKGNwdSksICZwZXJfY3B1X18jI3ZhcikpCiAjZGVmaW5lIF9fZ2V0X2NwdV92YXIodmFyKQkJCXBlcl9jcHVfXyMjdmFyCisjZGVmaW5lIF9fcmF3X2dldF9jcHVfdmFyKHZhcikJCQlwZXJfY3B1X18jI3ZhcgogCiAjZW5kaWYJLyogU01QICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvYWx0ZXJuYXRpdmUuaCBiL2luY2x1ZGUvYXNtLWkzODYvYWx0ZXJuYXRpdmUuaAppbmRleCBkNzllOWVlLi5jNjFiZDFhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L2FsdGVybmF0aXZlLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9hbHRlcm5hdGl2ZS5oCkBAIC01LDYgKzUsOCBAQAogCiAjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CiAKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCiBzdHJ1Y3QgYWx0X2luc3RyIHsKIAl1OCAqaW5zdHI7IAkJLyogb3JpZ2luYWwgaW5zdHJ1Y3Rpb24gKi8KIAl1OCAqcmVwbGFjZW1lbnQ7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L2FwaWMuaCBiL2luY2x1ZGUvYXNtLWkzODYvYXBpYy5oCmluZGV4IDFkODM2MmMuLjJjMWUzNzEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvYXBpYy5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvYXBpYy5oCkBAIC0xMTEsMjQgKzExMSwxMiBAQAogZXh0ZXJuIHZvaWQgc21wX2xvY2FsX3RpbWVyX2ludGVycnVwdCAoc3RydWN0IHB0X3JlZ3MgKiByZWdzKTsKIGV4dGVybiB2b2lkIHNldHVwX2Jvb3RfQVBJQ19jbG9jayAodm9pZCk7CiBleHRlcm4gdm9pZCBzZXR1cF9zZWNvbmRhcnlfQVBJQ19jbG9jayAodm9pZCk7Ci1leHRlcm4gdm9pZCBzZXR1cF9hcGljX25taV93YXRjaGRvZyAodm9pZCk7Ci1leHRlcm4gaW50IHJlc2VydmVfbGFwaWNfbm1pKHZvaWQpOwotZXh0ZXJuIHZvaWQgcmVsZWFzZV9sYXBpY19ubWkodm9pZCk7Ci1leHRlcm4gdm9pZCBkaXNhYmxlX3RpbWVyX25taV93YXRjaGRvZyh2b2lkKTsKLWV4dGVybiB2b2lkIGVuYWJsZV90aW1lcl9ubWlfd2F0Y2hkb2codm9pZCk7Ci1leHRlcm4gdm9pZCBubWlfd2F0Y2hkb2dfdGljayAoc3RydWN0IHB0X3JlZ3MgKiByZWdzKTsKIGV4dGVybiBpbnQgQVBJQ19pbml0X3VuaXByb2Nlc3NvciAodm9pZCk7CiBleHRlcm4gdm9pZCBkaXNhYmxlX0FQSUNfdGltZXIodm9pZCk7CiBleHRlcm4gdm9pZCBlbmFibGVfQVBJQ190aW1lcih2b2lkKTsKIAogZXh0ZXJuIHZvaWQgZW5hYmxlX05NSV90aHJvdWdoX0xWVDAgKHZvaWQgKiBkdW1teSk7CiAKLWV4dGVybiB1bnNpZ25lZCBpbnQgbm1pX3dhdGNoZG9nOwotI2RlZmluZSBOTUlfTk9ORQkwCi0jZGVmaW5lIE5NSV9JT19BUElDCTEKLSNkZWZpbmUgTk1JX0xPQ0FMX0FQSUMJMgotI2RlZmluZSBOTUlfSU5WQUxJRAkzCi0KIGV4dGVybiBpbnQgZGlzYWJsZV90aW1lcl9waW5fMTsKIAogdm9pZCBzbXBfc2VuZF90aW1lcl9icm9hZGNhc3RfaXBpKHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvY3B1ZmVhdHVyZS5oIGIvaW5jbHVkZS9hc20taTM4Ni9jcHVmZWF0dXJlLmgKaW5kZXggM2VjZWRiYS4uZDMxNGViYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9jcHVmZWF0dXJlLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9jcHVmZWF0dXJlLmgKQEAgLTcyLDYgKzcyLDcgQEAKICNkZWZpbmUgWDg2X0ZFQVRVUkVfQ09OU1RBTlRfVFNDICgzKjMyKyA4KSAvKiBUU0MgdGlja3MgYXQgYSBjb25zdGFudCByYXRlICovCiAjZGVmaW5lIFg4Nl9GRUFUVVJFX1VQCQkoMyozMisgOSkgLyogc21wIGtlcm5lbCBydW5uaW5nIG9uIHVwICovCiAjZGVmaW5lIFg4Nl9GRUFUVVJFX0ZYU0FWRV9MRUFLICgzKjMyKzEwKSAvKiBGWFNBVkUgbGVha3MgRk9QL0ZJUC9GT1AgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfQVJDSF9QRVJGTU9OICgzKjMyKzExKSAvKiBJbnRlbCBBcmNoaXRlY3R1cmFsIFBlcmZNb24gKi8KIAogLyogSW50ZWwtZGVmaW5lZCBDUFUgZmVhdHVyZXMsIENQVUlEIGxldmVsIDB4MDAwMDAwMDEgKGVjeCksIHdvcmQgNCAqLwogI2RlZmluZSBYODZfRkVBVFVSRV9YTU0zCSg0KjMyKyAwKSAvKiBTdHJlYW1pbmcgU0lNRCBFeHRlbnNpb25zLTMgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvZGVsYXkuaCBiL2luY2x1ZGUvYXNtLWkzODYvZGVsYXkuaAppbmRleCA0NTZkYjg1Li5iMWM3NjUwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L2RlbGF5LmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9kZWxheS5oCkBAIC0yMyw0ICsyMyw2IEBACiAJKChuKSA+IDIwMDAwID8gX19iYWRfbmRlbGF5KCkgOiBfX2NvbnN0X3VkZWxheSgobikgKiA1dWwpKSA6IFwKIAlfX25kZWxheShuKSkKIAordm9pZCB1c2VfdHNjX2RlbGF5KHZvaWQpOworCiAjZW5kaWYgLyogZGVmaW5lZChfSTM4Nl9ERUxBWV9IKSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9kd2FyZjIuaCBiL2luY2x1ZGUvYXNtLWkzODYvZHdhcmYyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI4MGY2MgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvZHdhcmYyLmgKQEAgLTAsMCArMSw1NCBAQAorI2lmbmRlZiBfRFdBUkYyX0gKKyNkZWZpbmUgX0RXQVJGMl9ICisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKworI2lmbmRlZiBfX0FTU0VNQkxZX18KKyN3YXJuaW5nICJhc20vZHdhcmYyLmggc2hvdWxkIGJlIG9ubHkgaW5jbHVkZWQgaW4gcHVyZSBhc3NlbWJseSBmaWxlcyIKKyNlbmRpZgorCisvKgorICAgTWFjcm9zIGZvciBkd2FyZjIgQ0ZJIHVud2luZCB0YWJsZSBlbnRyaWVzLgorICAgU2VlICJhcy5pbmZvIiBmb3IgZGV0YWlscyBvbiB0aGVzZSBwc2V1ZG8gb3BzLiBVbmZvcnR1bmF0ZWx5CisgICB0aGV5IGFyZSBvbmx5IHN1cHBvcnRlZCBpbiB2ZXJ5IG5ldyBiaW51dGlscywgc28gZGVmaW5lIHRoZW0KKyAgIGF3YXkgZm9yIG9sZGVyIHZlcnNpb24uCisgKi8KKworI2lmZGVmIENPTkZJR19VTldJTkRfSU5GTworCisjZGVmaW5lIENGSV9TVEFSVFBST0MgLmNmaV9zdGFydHByb2MKKyNkZWZpbmUgQ0ZJX0VORFBST0MgLmNmaV9lbmRwcm9jCisjZGVmaW5lIENGSV9ERUZfQ0ZBIC5jZmlfZGVmX2NmYQorI2RlZmluZSBDRklfREVGX0NGQV9SRUdJU1RFUiAuY2ZpX2RlZl9jZmFfcmVnaXN0ZXIKKyNkZWZpbmUgQ0ZJX0RFRl9DRkFfT0ZGU0VUIC5jZmlfZGVmX2NmYV9vZmZzZXQKKyNkZWZpbmUgQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIC5jZmlfYWRqdXN0X2NmYV9vZmZzZXQKKyNkZWZpbmUgQ0ZJX09GRlNFVCAuY2ZpX29mZnNldAorI2RlZmluZSBDRklfUkVMX09GRlNFVCAuY2ZpX3JlbF9vZmZzZXQKKyNkZWZpbmUgQ0ZJX1JFR0lTVEVSIC5jZmlfcmVnaXN0ZXIKKyNkZWZpbmUgQ0ZJX1JFU1RPUkUgLmNmaV9yZXN0b3JlCisjZGVmaW5lIENGSV9SRU1FTUJFUl9TVEFURSAuY2ZpX3JlbWVtYmVyX3N0YXRlCisjZGVmaW5lIENGSV9SRVNUT1JFX1NUQVRFIC5jZmlfcmVzdG9yZV9zdGF0ZQorCisjZWxzZQorCisvKiBEdWUgdG8gdGhlIHN0cnVjdHVyZSBvZiBwcmUtZXhpc2l0aW5nIGNvZGUsIGRvbid0IHVzZSBhc3NlbWJsZXIgbGluZQorICAgY29tbWVudCBjaGFyYWN0ZXIgIyB0byBpZ25vcmUgdGhlIGFyZ3VtZW50cy4gSW5zdGVhZCwgdXNlIGEgZHVtbXkgbWFjcm8uICovCisubWFjcm8gaWdub3JlIGE9MCwgYj0wLCBjPTAsIGQ9MAorLmVuZG0KKworI2RlZmluZSBDRklfU1RBUlRQUk9DCWlnbm9yZQorI2RlZmluZSBDRklfRU5EUFJPQwlpZ25vcmUKKyNkZWZpbmUgQ0ZJX0RFRl9DRkEJaWdub3JlCisjZGVmaW5lIENGSV9ERUZfQ0ZBX1JFR0lTVEVSCWlnbm9yZQorI2RlZmluZSBDRklfREVGX0NGQV9PRkZTRVQJaWdub3JlCisjZGVmaW5lIENGSV9BREpVU1RfQ0ZBX09GRlNFVAlpZ25vcmUKKyNkZWZpbmUgQ0ZJX09GRlNFVAlpZ25vcmUKKyNkZWZpbmUgQ0ZJX1JFTF9PRkZTRVQJaWdub3JlCisjZGVmaW5lIENGSV9SRUdJU1RFUglpZ25vcmUKKyNkZWZpbmUgQ0ZJX1JFU1RPUkUJaWdub3JlCisjZGVmaW5lIENGSV9SRU1FTUJFUl9TVEFURSBpZ25vcmUKKyNkZWZpbmUgQ0ZJX1JFU1RPUkVfU1RBVEUgaWdub3JlCisKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvZmxvcHB5LmggYi9pbmNsdWRlL2FzbS1pMzg2L2Zsb3BweS5oCmluZGV4IDAzNDAzMDQuLjljYjI3OTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvZmxvcHB5LmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9mbG9wcHkuaApAQCAtMTQ3LDkgKzE0Nyw4IEBACiAJCXJldHVybiByZXF1ZXN0X2lycShGTE9QUFlfSVJRLCBmbG9wcHlfaGFyZGludCxTQV9JTlRFUlJVUFQsCiAJCQkJCQkgICAiZmxvcHB5IiwgTlVMTCk7CiAJZWxzZQotCQlyZXR1cm4gcmVxdWVzdF9pcnEoRkxPUFBZX0lSUSwgZmxvcHB5X2ludGVycnVwdCwKLQkJCQkJCSAgIFNBX0lOVEVSUlVQVHxTQV9TQU1QTEVfUkFORE9NLAotCQkJCQkJICAgImZsb3BweSIsIE5VTEwpOwkKKwkJcmV0dXJuIHJlcXVlc3RfaXJxKEZMT1BQWV9JUlEsIGZsb3BweV9pbnRlcnJ1cHQsIFNBX0lOVEVSUlVQVCwKKwkJCQkgICAiZmxvcHB5IiwgTlVMTCk7CiAKIH0KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9od19pcnEuaCBiL2luY2x1ZGUvYXNtLWkzODYvaHdfaXJxLmgKaW5kZXggOTVkM2ZkMC4uYTRjMGE1YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9od19pcnEuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L2h3X2lycS5oCkBAIC0xOSw2ICsxOSw4IEBACiAKIHN0cnVjdCBod19pbnRlcnJ1cHRfdHlwZTsKIAorI2RlZmluZSBOTUlfVkVDVE9SCQkweDAyCisKIC8qCiAgKiBWYXJpb3VzIGxvdy1sZXZlbCBpcnEgZGV0YWlscyBuZWVkZWQgYnkgaXJxLmMsIHByb2Nlc3MuYywKICAqIHRpbWUuYywgaW9fYXBpYy5jIGFuZCBzbXAuYwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9pbnRlbF9hcmNoX3BlcmZtb24uaCBiL2luY2x1ZGUvYXNtLWkzODYvaW50ZWxfYXJjaF9wZXJmbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM0ZWE5YwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvaW50ZWxfYXJjaF9wZXJmbW9uLmgKQEAgLTAsMCArMSwxOSBAQAorI2lmbmRlZiBYODZfSU5URUxfQVJDSF9QRVJGTU9OX0gKKyNkZWZpbmUgWDg2X0lOVEVMX0FSQ0hfUEVSRk1PTl9IIDEKKworI2RlZmluZSBNU1JfQVJDSF9QRVJGTU9OX1BFUkZDVFIwCQkweGMxCisjZGVmaW5lIE1TUl9BUkNIX1BFUkZNT05fUEVSRkNUUjEJCTB4YzIKKworI2RlZmluZSBNU1JfQVJDSF9QRVJGTU9OX0VWRU5UU0VMMAkJMHgxODYKKyNkZWZpbmUgTVNSX0FSQ0hfUEVSRk1PTl9FVkVOVFNFTDEJCTB4MTg3CisKKyNkZWZpbmUgQVJDSF9QRVJGTU9OX0VWRU5UU0VMMF9FTkFCTEUgICAgICAoMSA8PCAyMikKKyNkZWZpbmUgQVJDSF9QRVJGTU9OX0VWRU5UU0VMX0lOVCAgICAgICAgICAoMSA8PCAyMCkKKyNkZWZpbmUgQVJDSF9QRVJGTU9OX0VWRU5UU0VMX09TICAgICAgICAgICAoMSA8PCAxNykKKyNkZWZpbmUgQVJDSF9QRVJGTU9OX0VWRU5UU0VMX1VTUiAgICAgICAgICAoMSA8PCAxNikKKworI2RlZmluZSBBUkNIX1BFUkZNT05fVU5IQUxURURfQ09SRV9DWUNMRVNfU0VMCSgweDNjKQorI2RlZmluZSBBUkNIX1BFUkZNT05fVU5IQUxURURfQ09SRV9DWUNMRVNfVU1BU0sJKDB4MDAgPDwgOCkKKyNkZWZpbmUgQVJDSF9QRVJGTU9OX1VOSEFMVEVEX0NPUkVfQ1lDTEVTX1BSRVNFTlQgKDEgPDwgMCkKKworI2VuZGlmCS8qIFg4Nl9JTlRFTF9BUkNIX1BFUkZNT05fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9rOC5oIGIvaW5jbHVkZS9hc20taTM4Ni9rOC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmZDg4YTYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L2s4LmgKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgPGFzbS14ODZfNjQvazguaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYva2RlYnVnLmggYi9pbmNsdWRlL2FzbS1pMzg2L2tkZWJ1Zy5oCmluZGV4IDk2ZDA4MjguLmQxOGNkYjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYva2RlYnVnLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9rZGVidWcuaApAQCAtMTksNiArMTksOCBAQAogCiBleHRlcm4gaW50IHJlZ2lzdGVyX2RpZV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKik7CiBleHRlcm4gaW50IHVucmVnaXN0ZXJfZGllX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqKTsKK2V4dGVybiBpbnQgcmVnaXN0ZXJfcGFnZV9mYXVsdF9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKik7CitleHRlcm4gaW50IHVucmVnaXN0ZXJfcGFnZV9mYXVsdF9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKik7CiBleHRlcm4gc3RydWN0IGF0b21pY19ub3RpZmllcl9oZWFkIGkzODZkaWVfY2hhaW47CiAKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9rcHJvYmVzLmggYi9pbmNsdWRlL2FzbS1pMzg2L2twcm9iZXMuaAppbmRleCA1N2QxNTdjLi4wNzMwYTIwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L2twcm9iZXMuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L2twcm9iZXMuaApAQCAtNDQsNiArNDQsNyBAQAogCiAjZGVmaW5lIEpQUk9CRV9FTlRSWShwZW50cnkpCShrcHJvYmVfb3Bjb2RlX3QgKilwZW50cnkKICNkZWZpbmUgQVJDSF9TVVBQT1JUU19LUkVUUFJPQkVTCisjZGVmaW5lICBBUkNIX0lOQUNUSVZFX0tQUk9CRV9DT1VOVCAwCiAKIHZvaWQgYXJjaF9yZW1vdmVfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApOwogdm9pZCBrcmV0cHJvYmVfdHJhbXBvbGluZSh2b2lkKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvbG9jYWwuaCBiL2luY2x1ZGUvYXNtLWkzODYvbG9jYWwuaAppbmRleCBlNjdmYTA4Li4zYjQ5OThjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L2xvY2FsLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9sb2NhbC5oCkBAIC01NSwxMiArNTUsMjYgQEAKICAqIG11Y2ggbW9yZSBlZmZpY2llbnQgdGhhbiB0aGVzZSBuYWl2ZSBpbXBsZW1lbnRhdGlvbnMuICBOb3RlIHRoZXkgdGFrZQogICogYSB2YXJpYWJsZSwgbm90IGFuIGFkZHJlc3MuCiAgKi8KLSNkZWZpbmUgY3B1X2xvY2FsX3JlYWQodikJbG9jYWxfcmVhZCgmX19nZXRfY3B1X3Zhcih2KSkKLSNkZWZpbmUgY3B1X2xvY2FsX3NldCh2LCBpKQlsb2NhbF9zZXQoJl9fZ2V0X2NwdV92YXIodiksIChpKSkKLSNkZWZpbmUgY3B1X2xvY2FsX2luYyh2KQlsb2NhbF9pbmMoJl9fZ2V0X2NwdV92YXIodikpCi0jZGVmaW5lIGNwdV9sb2NhbF9kZWModikJbG9jYWxfZGVjKCZfX2dldF9jcHVfdmFyKHYpKQotI2RlZmluZSBjcHVfbG9jYWxfYWRkKGksIHYpCWxvY2FsX2FkZCgoaSksICZfX2dldF9jcHVfdmFyKHYpKQotI2RlZmluZSBjcHVfbG9jYWxfc3ViKGksIHYpCWxvY2FsX3N1YigoaSksICZfX2dldF9jcHVfdmFyKHYpKQorCisvKiBOZWVkIHRvIGRpc2FibGUgcHJlZW1wdGlvbiBmb3IgdGhlIGNwdSBsb2NhbCBjb3VudGVycyBvdGhlcndpc2Ugd2UgY291bGQKKyAgIHN0aWxsIGFjY2VzcyBhIHZhcmlhYmxlIG9mIGEgcHJldmlvdXMgQ1BVIGluIGEgbm9uIGF0b21pYyB3YXkuICovCisjZGVmaW5lIGNwdV9sb2NhbF93cmFwX3YodikJIAlcCisJKHsgbG9jYWxfdCByZXNfXzsJCVwKKwkgICBwcmVlbXB0X2Rpc2FibGUoKTsgCQlcCisJICAgcmVzX18gPSAodik7CQkJXAorCSAgIHByZWVtcHRfZW5hYmxlKCk7CQlcCisJICAgcmVzX187IH0pCisjZGVmaW5lIGNwdV9sb2NhbF93cmFwKHYpCQlcCisJKHsgcHJlZW1wdF9kaXNhYmxlKCk7CQlcCisJICAgdjsJCQkJXAorCSAgIHByZWVtcHRfZW5hYmxlKCk7IH0pCQlcCisKKyNkZWZpbmUgY3B1X2xvY2FsX3JlYWQodikgICAgY3B1X2xvY2FsX3dyYXBfdihsb2NhbF9yZWFkKCZfX2dldF9jcHVfdmFyKHYpKSkKKyNkZWZpbmUgY3B1X2xvY2FsX3NldCh2LCBpKSAgY3B1X2xvY2FsX3dyYXAobG9jYWxfc2V0KCZfX2dldF9jcHVfdmFyKHYpLCAoaSkpKQorI2RlZmluZSBjcHVfbG9jYWxfaW5jKHYpICAgICBjcHVfbG9jYWxfd3JhcChsb2NhbF9pbmMoJl9fZ2V0X2NwdV92YXIodikpKQorI2RlZmluZSBjcHVfbG9jYWxfZGVjKHYpICAgICBjcHVfbG9jYWxfd3JhcChsb2NhbF9kZWMoJl9fZ2V0X2NwdV92YXIodikpKQorI2RlZmluZSBjcHVfbG9jYWxfYWRkKGksIHYpICBjcHVfbG9jYWxfd3JhcChsb2NhbF9hZGQoKGkpLCAmX19nZXRfY3B1X3Zhcih2KSkpCisjZGVmaW5lIGNwdV9sb2NhbF9zdWIoaSwgdikgIGNwdV9sb2NhbF93cmFwKGxvY2FsX3N1YigoaSksICZfX2dldF9jcHVfdmFyKHYpKSkKIAogI2RlZmluZSBfX2NwdV9sb2NhbF9pbmModikJY3B1X2xvY2FsX2luYyh2KQogI2RlZmluZSBfX2NwdV9sb2NhbF9kZWModikJY3B1X2xvY2FsX2RlYyh2KQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9tYWNoLWRlZmF1bHQvbWFjaF9pcGkuaCBiL2luY2x1ZGUvYXNtLWkzODYvbWFjaC1kZWZhdWx0L21hY2hfaXBpLmgKaW5kZXggYTFkMDA3Mi4uMGRiYTI0NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9tYWNoLWRlZmF1bHQvbWFjaF9pcGkuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L21hY2gtZGVmYXVsdC9tYWNoX2lwaS5oCkBAIC0xLDYgKzEsOSBAQAogI2lmbmRlZiBfX0FTTV9NQUNIX0lQSV9ICiAjZGVmaW5lIF9fQVNNX01BQ0hfSVBJX0gKIAorLyogQXZvaWQgaW5jbHVkZSBoZWxsICovCisjZGVmaW5lIE5NSV9WRUNUT1IgMHgwMgorCiB2b2lkIHNlbmRfSVBJX21hc2tfYml0bWFzayhjcHVtYXNrX3QgbWFzaywgaW50IHZlY3Rvcik7CiB2b2lkIF9fc2VuZF9JUElfc2hvcnRjdXQodW5zaWduZWQgaW50IHNob3J0Y3V0LCBpbnQgdmVjdG9yKTsKIApAQCAtMTMsNyArMTYsNyBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgX19sb2NhbF9zZW5kX0lQSV9hbGxidXRzZWxmKGludCB2ZWN0b3IpCiB7Ci0JaWYgKG5vX2Jyb2FkY2FzdCkgeworCWlmIChub19icm9hZGNhc3QgfHwgdmVjdG9yID09IE5NSV9WRUNUT1IpIHsKIAkJY3B1bWFza190IG1hc2sgPSBjcHVfb25saW5lX21hcDsKIAogCQljcHVfY2xlYXIoc21wX3Byb2Nlc3Nvcl9pZCgpLCBtYXNrKTsKQEAgLTI0LDcgKzI3LDcgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIF9fbG9jYWxfc2VuZF9JUElfYWxsKGludCB2ZWN0b3IpCiB7Ci0JaWYgKG5vX2Jyb2FkY2FzdCkKKwlpZiAobm9fYnJvYWRjYXN0IHx8IHZlY3RvciA9PSBOTUlfVkVDVE9SKQogCQlzZW5kX0lQSV9tYXNrKGNwdV9vbmxpbmVfbWFwLCB2ZWN0b3IpOwogCWVsc2UKIAkJX19zZW5kX0lQSV9zaG9ydGN1dChBUElDX0RFU1RfQUxMSU5DLCB2ZWN0b3IpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9tYWNoLWRlZmF1bHQvbWFjaF90aW1lci5oIGIvaW5jbHVkZS9hc20taTM4Ni9tYWNoLWRlZmF1bHQvbWFjaF90aW1lci5oCmluZGV4IDRiOTcwM2IuLjgwNzk5MmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvbWFjaC1kZWZhdWx0L21hY2hfdGltZXIuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L21hY2gtZGVmYXVsdC9tYWNoX3RpbWVyLmgKQEAgLTE1LDcgKzE1LDkgQEAKICNpZm5kZWYgX01BQ0hfVElNRVJfSAogI2RlZmluZSBfTUFDSF9USU1FUl9ICiAKLSNkZWZpbmUgQ0FMSUJSQVRFX0xBVENICSg1ICogTEFUQ0gpCisjZGVmaW5lIENBTElCUkFURV9USU1FX01TRUMgMzAgLyogMzAgbXNlY3MgKi8KKyNkZWZpbmUgQ0FMSUJSQVRFX0xBVENICVwKKwkoKENMT0NLX1RJQ0tfUkFURSAqIENBTElCUkFURV9USU1FX01TRUMgKyAxMDAwLzIpLzEwMDApCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBtYWNoX3ByZXBhcmVfY291bnRlcih2b2lkKQogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9tYWNoLWRlZmF1bHQvc2V0dXBfYXJjaF9wcmUuaCBiL2luY2x1ZGUvYXNtLWkzODYvbWFjaC1kZWZhdWx0L3NldHVwX2FyY2guaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20taTM4Ni9tYWNoLWRlZmF1bHQvc2V0dXBfYXJjaF9wcmUuaApyZW5hbWUgdG8gaW5jbHVkZS9hc20taTM4Ni9tYWNoLWRlZmF1bHQvc2V0dXBfYXJjaC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L21hY2gtZGVmYXVsdC9zZXR1cF9hcmNoX3Bvc3QuaCBiL2luY2x1ZGUvYXNtLWkzODYvbWFjaC1kZWZhdWx0L3NldHVwX2FyY2hfcG9zdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmM0ODg4Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLWkzODYvbWFjaC1kZWZhdWx0L3NldHVwX2FyY2hfcG9zdC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqCi0gKiBtYWNoaW5lX3NwZWNpZmljX21lbW9yeV9zZXR1cCAtIEhvb2sgZm9yIG1hY2hpbmUgc3BlY2lmaWMgbWVtb3J5IHNldHVwLgotICoKLSAqIERlc2NyaXB0aW9uOgotICoJVGhpcyBpcyBpbmNsdWRlZCBsYXRlIGluIGtlcm5lbC9zZXR1cC5jIHNvIHRoYXQgaXQgY2FuIG1ha2UKLSAqCXVzZSBvZiBhbGwgb2YgdGhlIHN0YXRpYyBmdW5jdGlvbnMuCi0gKiovCi0KLXN0YXRpYyBjaGFyICogX19pbml0IG1hY2hpbmVfc3BlY2lmaWNfbWVtb3J5X3NldHVwKHZvaWQpCi17Ci0JY2hhciAqd2hvOwotCi0KLQl3aG8gPSAiQklPUy1lODIwIjsKLQotCS8qCi0JICogVHJ5IHRvIGNvcHkgdGhlIEJJT1Mtc3VwcGxpZWQgRTgyMC1tYXAuCi0JICoKLQkgKiBPdGhlcndpc2UgZmFrZSBhIG1lbW9yeSBtYXA7IG9uZSBzZWN0aW9uIGZyb20gMGstPjY0MGssCi0JICogdGhlIG5leHQgc2VjdGlvbiBmcm9tIDFtYi0+YXBwcm9wcmlhdGVfbWVtX2sKLQkgKi8KLQlzYW5pdGl6ZV9lODIwX21hcChFODIwX01BUCwgJkU4MjBfTUFQX05SKTsKLQlpZiAoY29weV9lODIwX21hcChFODIwX01BUCwgRTgyMF9NQVBfTlIpIDwgMCkgewotCQl1bnNpZ25lZCBsb25nIG1lbV9zaXplOwotCi0JCS8qIGNvbXBhcmUgcmVzdWx0cyBmcm9tIG90aGVyIG1ldGhvZHMgYW5kIHRha2UgdGhlIGdyZWF0ZXIgKi8KLQkJaWYgKEFMVF9NRU1fSyA8IEVYVF9NRU1fSykgewotCQkJbWVtX3NpemUgPSBFWFRfTUVNX0s7Ci0JCQl3aG8gPSAiQklPUy04OCI7Ci0JCX0gZWxzZSB7Ci0JCQltZW1fc2l6ZSA9IEFMVF9NRU1fSzsKLQkJCXdobyA9ICJCSU9TLWU4MDEiOwotCQl9Ci0KLQkJZTgyMC5ucl9tYXAgPSAwOwotCQlhZGRfbWVtb3J5X3JlZ2lvbigwLCBMT1dNRU1TSVpFKCksIEU4MjBfUkFNKTsKLQkJYWRkX21lbW9yeV9yZWdpb24oSElHSF9NRU1PUlksIG1lbV9zaXplIDw8IDEwLCBFODIwX1JBTSk7Ci0gIAl9Ci0JcmV0dXJuIHdobzsKLX0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvbWFjaC1zdW1taXQvbWFjaF9tcHBhcnNlLmggYi9pbmNsdWRlL2FzbS1pMzg2L21hY2gtc3VtbWl0L21hY2hfbXBwYXJzZS5oCmluZGV4IDFjY2UyYjkuLjk0MjY4MzkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvbWFjaC1zdW1taXQvbWFjaF9tcHBhcnNlLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9tYWNoLXN1bW1pdC9tYWNoX21wcGFyc2UuaApAQCAtMiw2ICsyLDcgQEAKICNkZWZpbmUgX19BU01fTUFDSF9NUFBBUlNFX0gKIAogI2luY2x1ZGUgPG1hY2hfYXBpYy5oPgorI2luY2x1ZGUgPGFzbS90c2MuaD4KIAogZXh0ZXJuIGludCB1c2VfY3ljbG9uZTsKIApAQCAtMjksNiArMzAsNyBAQAogCQkJKCFzdHJuY21wKHByb2R1Y3RpZCwgIlZJR0lMIFNNUCIsIDkpIAogCQkJIHx8ICFzdHJuY21wKHByb2R1Y3RpZCwgIkVYQSIsIDMpCiAJCQkgfHwgIXN0cm5jbXAocHJvZHVjdGlkLCAiUlVUSExFU1MgU01QIiwgMTIpKSl7CisJCW1hcmtfdHNjX3Vuc3RhYmxlKCk7CiAJCXVzZV9jeWNsb25lID0gMTsgLyplbmFibGUgY3ljbG9uZS10aW1lciovCiAJCXNldHVwX3N1bW1pdCgpOwogCQlyZXR1cm4gMTsKQEAgLTQyLDYgKzQ0LDcgQEAKIAlpZiAoIXN0cm5jbXAob2VtX2lkLCAiSUJNIiwgMykgJiYKIAkgICAgKCFzdHJuY21wKG9lbV90YWJsZV9pZCwgIlNFUlZJR0lMIiwgOCkKIAkgICAgIHx8ICFzdHJuY21wKG9lbV90YWJsZV9pZCwgIkVYQSIsIDMpKSl7CisJCW1hcmtfdHNjX3Vuc3RhYmxlKCk7CiAJCXVzZV9jeWNsb25lID0gMTsgLyplbmFibGUgY3ljbG9uZS10aW1lciovCiAJCXNldHVwX3N1bW1pdCgpOwogCQlyZXR1cm4gMTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvbWFjaC12aXN3cy9zZXR1cF9hcmNoX3ByZS5oIGIvaW5jbHVkZS9hc20taTM4Ni9tYWNoLXZpc3dzL3NldHVwX2FyY2guaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20taTM4Ni9tYWNoLXZpc3dzL3NldHVwX2FyY2hfcHJlLmgKcmVuYW1lIHRvIGluY2x1ZGUvYXNtLWkzODYvbWFjaC12aXN3cy9zZXR1cF9hcmNoLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvbWFjaC12aXN3cy9zZXR1cF9hcmNoX3Bvc3QuaCBiL2luY2x1ZGUvYXNtLWkzODYvbWFjaC12aXN3cy9zZXR1cF9hcmNoX3Bvc3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RiZDg5NS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L21hY2gtdmlzd3Mvc2V0dXBfYXJjaF9wb3N0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKiBIb29rIGZvciBtYWNoaW5lIHNwZWNpZmljIG1lbW9yeSBzZXR1cC4KLSAqCi0gKiBUaGlzIGlzIGluY2x1ZGVkIGxhdGUgaW4ga2VybmVsL3NldHVwLmMgc28gdGhhdCBpdCBjYW4gbWFrZSB1c2Ugb2YgYWxsIG9mCi0gKiB0aGUgc3RhdGljIGZ1bmN0aW9ucy4gKi8KLQotI2RlZmluZSBNQiAoMTAyNCAqIDEwMjQpCi0KLXVuc2lnbmVkIGxvbmcgc2dpdndmYl9tZW1fcGh5czsKLXVuc2lnbmVkIGxvbmcgc2dpdndmYl9tZW1fc2l6ZTsKLQotbG9uZyBsb25nIG1lbV9zaXplIF9faW5pdGRhdGEgPSAwOwotCi1zdGF0aWMgY2hhciAqIF9faW5pdCBtYWNoaW5lX3NwZWNpZmljX21lbW9yeV9zZXR1cCh2b2lkKQotewotCWxvbmcgbG9uZyBnZnhfbWVtX3NpemUgPSA4ICogTUI7Ci0KLQltZW1fc2l6ZSA9IEFMVF9NRU1fSzsKLQotCWlmICghbWVtX3NpemUpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQm9vdGxvYWRlciBkaWRuJ3Qgc2V0IG1lbW9yeSBzaXplLCB1cGdyYWRlIGl0ICFcbiIpOwotCQltZW1fc2l6ZSA9IDEyOCAqIE1COwotCX0KLQotCS8qCi0JICogdGhpcyBoYXJkY29kZXMgdGhlIGdyYXBoaWNzIG1lbW9yeSB0byA4IE1CCi0JICogaXQgcmVhbGx5IHNob3VsZCBiZSBzaXplZCBkeW5hbWljYWxseSAob3IgYXQgbGVhc3QKLQkgKiBzZXQgYXMgYSBib290IHBhcmFtKQotCSAqLwotCWlmICghc2dpdndmYl9tZW1fc2l6ZSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJEZWZhdWx0aW5nIHRvIDggTUIgZnJhbWVidWZmZXIgc2l6ZVxuIik7Ci0JCXNnaXZ3ZmJfbWVtX3NpemUgPSA4ICogTUI7Ci0JfQotCi0JLyoKLQkgKiBUcmltIHRvIG5lYXJlc3QgTUIKLQkgKi8KLQlzZ2l2d2ZiX21lbV9zaXplICY9IH4oKDEgPDwgMjApIC0gMSk7Ci0Jc2dpdndmYl9tZW1fcGh5cyA9IG1lbV9zaXplIC0gZ2Z4X21lbV9zaXplOwotCi0JYWRkX21lbW9yeV9yZWdpb24oMCwgTE9XTUVNU0laRSgpLCBFODIwX1JBTSk7Ci0JYWRkX21lbW9yeV9yZWdpb24oSElHSF9NRU1PUlksIG1lbV9zaXplIC0gc2dpdndmYl9tZW1fc2l6ZSAtIEhJR0hfTUVNT1JZLCBFODIwX1JBTSk7Ci0JYWRkX21lbW9yeV9yZWdpb24oc2dpdndmYl9tZW1fcGh5cywgc2dpdndmYl9tZW1fc2l6ZSwgRTgyMF9SRVNFUlZFRCk7Ci0KLQlyZXR1cm4gIlBST00iOwotCi0JLyogUmVtb3ZlIGdjYyB3YXJuaW5ncyAqLwotCSh2b2lkKSBzYW5pdGl6ZV9lODIwX21hcChOVUxMLCBOVUxMKTsKLQkodm9pZCkgY29weV9lODIwX21hcChOVUxMLCAwKTsKLX0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvbWFjaC12b3lhZ2VyL3NldHVwX2FyY2hfcHJlLmggYi9pbmNsdWRlL2FzbS1pMzg2L21hY2gtdm95YWdlci9zZXR1cF9hcmNoLmgKc2ltaWxhcml0eSBpbmRleCA5NyUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20taTM4Ni9tYWNoLXZveWFnZXIvc2V0dXBfYXJjaF9wcmUuaApyZW5hbWUgdG8gaW5jbHVkZS9hc20taTM4Ni9tYWNoLXZveWFnZXIvc2V0dXBfYXJjaC5oCmluZGV4IDQ4ZjdlNmYuLjg0ZDAxYWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvbWFjaC12b3lhZ2VyL3NldHVwX2FyY2hfcHJlLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9tYWNoLXZveWFnZXIvc2V0dXBfYXJjaC5oCkBAIC0zLDcgKzMsNyBAQAogCiAvKiBIb29rIHRvIGNhbGwgQklPUyBpbml0aWFsaXNhdGlvbiBmdW5jdGlvbiAqLwogCi0vKiBmb3Igdm95YWdlciwgcGFzcyB0aGUgdm95YWdlciBCSU9TL1NVUyBpbmZvIGFyZWEgdG8gdGhlIGRldGVjdGlvbiAKKy8qIGZvciB2b3lhZ2VyLCBwYXNzIHRoZSB2b3lhZ2VyIEJJT1MvU1VTIGluZm8gYXJlYSB0byB0aGUgZGV0ZWN0aW9uCiAgKiByb3V0aW5lcyAqLwogCiAjZGVmaW5lIEFSQ0hfU0VUVVAJdm95YWdlcl9kZXRlY3QoVk9ZQUdFUl9CSU9TX0lORk8pOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9tYWNoLXZveWFnZXIvc2V0dXBfYXJjaF9wb3N0LmggYi9pbmNsdWRlL2FzbS1pMzg2L21hY2gtdm95YWdlci9zZXR1cF9hcmNoX3Bvc3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZmNmMyYy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L21hY2gtdm95YWdlci9zZXR1cF9hcmNoX3Bvc3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qIEhvb2sgZm9yIG1hY2hpbmUgc3BlY2lmaWMgbWVtb3J5IHNldHVwLgotICoKLSAqIFRoaXMgaXMgaW5jbHVkZWQgbGF0ZSBpbiBrZXJuZWwvc2V0dXAuYyBzbyB0aGF0IGl0IGNhbiBtYWtlIHVzZSBvZiBhbGwgb2YKLSAqIHRoZSBzdGF0aWMgZnVuY3Rpb25zLiAqLwotCi1zdGF0aWMgY2hhciAqIF9faW5pdCBtYWNoaW5lX3NwZWNpZmljX21lbW9yeV9zZXR1cCh2b2lkKQotewotCWNoYXIgKndobzsKLQotCXdobyA9ICJOT1QgVk9ZQUdFUiI7Ci0KLQlpZih2b3lhZ2VyX2xldmVsID09IDUpIHsKLQkJX191MzIgYWRkciwgbGVuZ3RoOwotCQlpbnQgaTsKLQotCQl3aG8gPSAiVm95YWdlci1TVVMiOwotCi0JCWU4MjAubnJfbWFwID0gMDsKLQkJZm9yKGk9MDsgdm95YWdlcl9tZW1vcnlfZGV0ZWN0KGksICZhZGRyLCAmbGVuZ3RoKTsgaSsrKSB7Ci0JCQlhZGRfbWVtb3J5X3JlZ2lvbihhZGRyLCBsZW5ndGgsIEU4MjBfUkFNKTsKLQkJfQotCQlyZXR1cm4gd2hvOwotCX0gZWxzZSBpZih2b3lhZ2VyX2xldmVsID09IDQpIHsKLQkJX191MzIgdG9tOwotCQlfX3UxNiBjYXRiYXNlID0gaW5iKFZPWUFHRVJfU1NQQl9SRUxPQ0FUSU9OX1BPUlQpPDw4OwotCQkvKiBzZWxlY3QgdGhlIERJTk8gY29uZmlnIHNwYWNlICovCi0JCW91dGIoVk9ZQUdFUl9ESU5PLCBWT1lBR0VSX0NBVF9DT05GSUdfUE9SVCk7Ci0JCS8qIFJlYWQgRElOTyB0b3Agb2YgbWVtb3J5IHJlZ2lzdGVyICovCi0JCXRvbSA9ICgoaW5iKGNhdGJhc2UgKyAweDQpICYgMHhmMCkgPDwgMTYpCi0JCQkrICgoaW5iKGNhdGJhc2UgKyAweDUpICYgMHg3ZikgPDwgMjQpOwotCi0JCWlmKGluYihjYXRiYXNlKSAhPSBWT1lBR0VSX0RJTk8pIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiVm95YWdlcjogRmFpbGVkIHRvIGdldCBESU5PIGZvciBMNCwgc2V0dGluZyB0b20gdG8gRVhUX01FTV9LXG4iKTsKLQkJCXRvbSA9IChFWFRfTUVNX0spPDwxMDsKLQkJfQotCQl3aG8gPSAiVm95YWdlci1UT00iOwotCQlhZGRfbWVtb3J5X3JlZ2lvbigwLCAweDlmMDAwLCBFODIwX1JBTSk7Ci0JCS8qIG1hcCBmcm9tIDFNIHRvIHRvcCBvZiBtZW1vcnkgKi8KLQkJYWRkX21lbW9yeV9yZWdpb24oMSoxMDI0KjEwMjQsIHRvbSAtIDEqMTAyNCoxMDI0LCBFODIwX1JBTSk7Ci0JCS8qIEZJWE1FOiBTaG91bGQgY2hlY2sgdGhlIEFTSUNzIHRvIHNlZSBpZiBJIG5lZWQgdG8KLQkJICogdGFrZSBvdXQgdGhlIDhNIHdpbmRvdy4gIEp1c3QgZG8gaXQgYXQgdGhlIG1vbWVudAotCQkgKiAqLwotCQlhZGRfbWVtb3J5X3JlZ2lvbig4KjEwMjQqMTAyNCwgOCoxMDI0KjEwMjQsIEU4MjBfUkVTRVJWRUQpOwotCQlyZXR1cm4gd2hvOwotCX0KLQotCXdobyA9ICJCSU9TLWU4MjAiOwotCi0JLyoKLQkgKiBUcnkgdG8gY29weSB0aGUgQklPUy1zdXBwbGllZCBFODIwLW1hcC4KLQkgKgotCSAqIE90aGVyd2lzZSBmYWtlIGEgbWVtb3J5IG1hcDsgb25lIHNlY3Rpb24gZnJvbSAway0+NjQwaywKLQkgKiB0aGUgbmV4dCBzZWN0aW9uIGZyb20gMW1iLT5hcHByb3ByaWF0ZV9tZW1fawotCSAqLwotCXNhbml0aXplX2U4MjBfbWFwKEU4MjBfTUFQLCAmRTgyMF9NQVBfTlIpOwotCWlmIChjb3B5X2U4MjBfbWFwKEU4MjBfTUFQLCBFODIwX01BUF9OUikgPCAwKSB7Ci0JCXVuc2lnbmVkIGxvbmcgbWVtX3NpemU7Ci0KLQkJLyogY29tcGFyZSByZXN1bHRzIGZyb20gb3RoZXIgbWV0aG9kcyBhbmQgdGFrZSB0aGUgZ3JlYXRlciAqLwotCQlpZiAoQUxUX01FTV9LIDwgRVhUX01FTV9LKSB7Ci0JCQltZW1fc2l6ZSA9IEVYVF9NRU1fSzsKLQkJCXdobyA9ICJCSU9TLTg4IjsKLQkJfSBlbHNlIHsKLQkJCW1lbV9zaXplID0gQUxUX01FTV9LOwotCQkJd2hvID0gIkJJT1MtZTgwMSI7Ci0JCX0KLQotCQllODIwLm5yX21hcCA9IDA7Ci0JCWFkZF9tZW1vcnlfcmVnaW9uKDAsIExPV01FTVNJWkUoKSwgRTgyMF9SQU0pOwotCQlhZGRfbWVtb3J5X3JlZ2lvbihISUdIX01FTU9SWSwgbWVtX3NpemUgPDwgMTAsIEU4MjBfUkFNKTsKLSAgCX0KLQlyZXR1cm4gd2hvOwotfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9ubWkuaCBiL2luY2x1ZGUvYXNtLWkzODYvbm1pLmgKaW5kZXggMjFmMTY2My4uNjdkOTk0NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9ubWkuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L25taS5oCkBAIC01LDI0ICs1LDM4IEBACiAjZGVmaW5lIEFTTV9OTUlfSAogCiAjaW5jbHVkZSA8bGludXgvcG0uaD4KLSAKKwogc3RydWN0IHB0X3JlZ3M7Ci0gCisKIHR5cGVkZWYgaW50ICgqbm1pX2NhbGxiYWNrX3QpKHN0cnVjdCBwdF9yZWdzICogcmVncywgaW50IGNwdSk7Ci0gCi0vKiogCisKKy8qKgogICogc2V0X25taV9jYWxsYmFjawogICoKICAqIFNldCBhIGhhbmRsZXIgZm9yIGFuIE5NSS4gT25seSBvbmUgaGFuZGxlciBtYXkgYmUKICAqIHNldC4gUmV0dXJuIDEgaWYgdGhlIE5NSSB3YXMgaGFuZGxlZC4KICAqLwogdm9pZCBzZXRfbm1pX2NhbGxiYWNrKG5taV9jYWxsYmFja190IGNhbGxiYWNrKTsKLSAKLS8qKiAKKworLyoqCiAgKiB1bnNldF9ubWlfY2FsbGJhY2sKICAqCiAgKiBSZW1vdmUgdGhlIGhhbmRsZXIgcHJldmlvdXNseSBzZXQuCiAgKi8KIHZvaWQgdW5zZXRfbm1pX2NhbGxiYWNrKHZvaWQpOwotIAorCitleHRlcm4gdm9pZCBzZXR1cF9hcGljX25taV93YXRjaGRvZyAodm9pZCk7CitleHRlcm4gaW50IHJlc2VydmVfbGFwaWNfbm1pKHZvaWQpOworZXh0ZXJuIHZvaWQgcmVsZWFzZV9sYXBpY19ubWkodm9pZCk7CitleHRlcm4gdm9pZCBkaXNhYmxlX3RpbWVyX25taV93YXRjaGRvZyh2b2lkKTsKK2V4dGVybiB2b2lkIGVuYWJsZV90aW1lcl9ubWlfd2F0Y2hkb2codm9pZCk7CitleHRlcm4gdm9pZCBubWlfd2F0Y2hkb2dfdGljayAoc3RydWN0IHB0X3JlZ3MgKiByZWdzKTsKKworZXh0ZXJuIHVuc2lnbmVkIGludCBubWlfd2F0Y2hkb2c7CisjZGVmaW5lIE5NSV9ERUZBVUxUICAgICAtMQorI2RlZmluZSBOTUlfTk9ORQkwCisjZGVmaW5lIE5NSV9JT19BUElDCTEKKyNkZWZpbmUgTk1JX0xPQ0FMX0FQSUMJMgorI2RlZmluZSBOTUlfSU5WQUxJRAkzCisKICNlbmRpZiAvKiBBU01fTk1JX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvcHJvY2Vzc29yLmggYi9pbmNsdWRlL2FzbS1pMzg2L3Byb2Nlc3Nvci5oCmluZGV4IDBjODNjZjEuLjU1ZWE5OTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvcHJvY2Vzc29yLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9wcm9jZXNzb3IuaApAQCAtMTEyLDYgKzExMiw3IEBACiBleHRlcm4gdm9pZCBpZGVudGlmeV9jcHUoc3RydWN0IGNwdWluZm9feDg2ICopOwogZXh0ZXJuIHZvaWQgcHJpbnRfY3B1X2luZm8oc3RydWN0IGNwdWluZm9feDg2ICopOwogZXh0ZXJuIHVuc2lnbmVkIGludCBpbml0X2ludGVsX2NhY2hlaW5mbyhzdHJ1Y3QgY3B1aW5mb194ODYgKmMpOworZXh0ZXJuIHVuc2lnbmVkIHNob3J0IG51bV9jYWNoZV9sZWF2ZXM7CiAKICNpZmRlZiBDT05GSUdfWDg2X0hUCiBleHRlcm4gdm9pZCBkZXRlY3RfaHQoc3RydWN0IGNwdWluZm9feDg2ICpjKTsKQEAgLTU1NCw3ICs1NTUsNyBAQAogZXh0ZXJuIGludCBrZXJuZWxfdGhyZWFkKGludCAoKmZuKSh2b2lkICopLCB2b2lkICogYXJnLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKIAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdGhyZWFkX3NhdmVkX3BjKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKTsKLXZvaWQgc2hvd190cmFjZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHVuc2lnbmVkIGxvbmcgKnN0YWNrKTsKK3ZvaWQgc2hvd190cmFjZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBsb25nICpzdGFjayk7CiAKIHVuc2lnbmVkIGxvbmcgZ2V0X3djaGFuKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvc2V0dXAuaCBiL2luY2x1ZGUvYXNtLWkzODYvc2V0dXAuaAppbmRleCBlZTk0MTQ1Li5mNzM3ZTQyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L3NldHVwLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9zZXR1cC5oCkBAIC01OSw2ICs1OSwyMSBAQAogI2RlZmluZSBFRERfTUJSX1NJR05BVFVSRSAoKHVuc2lnbmVkIGludCAqKSAoUEFSQU0rRUREX01CUl9TSUdfQlVGKSkKICNkZWZpbmUgRUREX0JVRiAgICAgKChzdHJ1Y3QgZWRkX2luZm8gKikgKFBBUkFNK0VEREJVRikpCiAKKy8qCisgKiBEbyBOT1QgRVZFUiBsb29rIGF0IHRoZSBCSU9TIG1lbW9yeSBzaXplIGxvY2F0aW9uLgorICogSXQgZG9lcyBub3Qgd29yayBvbiBtYW55IG1hY2hpbmVzLgorICovCisjZGVmaW5lIExPV01FTVNJWkUoKQkoMHg5ZjAwMCkKKworc3RydWN0IGU4MjBlbnRyeTsKKworY2hhciAqIF9faW5pdCBtYWNoaW5lX3NwZWNpZmljX21lbW9yeV9zZXR1cCh2b2lkKTsKKworaW50IF9faW5pdCBjb3B5X2U4MjBfbWFwKHN0cnVjdCBlODIwZW50cnkgKiBiaW9zbWFwLCBpbnQgbnJfbWFwKTsKK2ludCBfX2luaXQgc2FuaXRpemVfZTgyMF9tYXAoc3RydWN0IGU4MjBlbnRyeSAqIGJpb3NtYXAsIGNoYXIgKiBwbnJfbWFwKTsKK3ZvaWQgX19pbml0IGFkZF9tZW1vcnlfcmVnaW9uKHVuc2lnbmVkIGxvbmcgbG9uZyBzdGFydCwKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBzaXplLCBpbnQgdHlwZSk7CisKICNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KIAogI2VuZGlmIC8qIF9pMzg2X1NFVFVQX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvc3lzdGVtLmggYi9pbmNsdWRlL2FzbS1pMzg2L3N5c3RlbS5oCmluZGV4IDAyNDlmOTEuLmNhYjAxODAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvc3lzdGVtLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9zeXN0ZW0uaApAQCAtNDI3LDcgKzQyNyw3IEBACiAgKiBkb2VzIG5vdCBlbmZvcmNlIG9yZGVyaW5nLCBzaW5jZSB0aGVyZSBpcyBubyBkYXRhIGRlcGVuZGVuY3kgYmV0d2VlbgogICogdGhlIHJlYWQgb2YgImEiIGFuZCB0aGUgcmVhZCBvZiAiYiIuICBUaGVyZWZvcmUsIG9uIHNvbWUgQ1BVcywgc3VjaAogICogYXMgQWxwaGEsICJ5IiBjb3VsZCBiZSBzZXQgdG8gMyBhbmQgIngiIHRvIDAuICBVc2Ugcm1iKCkKLSAqIGluIGNhc2VzIGxpa2UgdGhpc3doZXJlIHRoZXJlIGFyZSBubyBkYXRhIGRlcGVuZGVuY2llcy4KKyAqIGluIGNhc2VzIGxpa2UgdGhpcyB3aGVyZSB0aGVyZSBhcmUgbm8gZGF0YSBkZXBlbmRlbmNpZXMuCiAgKiovCiAKICNkZWZpbmUgcmVhZF9iYXJyaWVyX2RlcGVuZHMoKQlkbyB7IH0gd2hpbGUoMCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvdGhyZWFkX2luZm8uaCBiL2luY2x1ZGUvYXNtLWkzODYvdGhyZWFkX2luZm8uaAppbmRleCA4NDIwZWQxLi5mZGJjN2Y0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L3RocmVhZF9pbmZvLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni90aHJlYWRfaW5mby5oCkBAIC0xNDAsOCArMTQwLDcgQEAKICNkZWZpbmUgVElGX1NZU0NBTExfQVVESVQJNwkvKiBzeXNjYWxsIGF1ZGl0aW5nIGFjdGl2ZSAqLwogI2RlZmluZSBUSUZfU0VDQ09NUAkJOAkvKiBzZWN1cmUgY29tcHV0aW5nICovCiAjZGVmaW5lIFRJRl9SRVNUT1JFX1NJR01BU0sJOQkvKiByZXN0b3JlIHNpZ25hbCBtYXNrIGluIGRvX3NpZ25hbCgpICovCi0jZGVmaW5lIFRJRl9QT0xMSU5HX05SRkxBRwkxNgkvKiB0cnVlIGlmIHBvbGxfaWRsZSgpIGlzIHBvbGxpbmcgVElGX05FRURfUkVTQ0hFRCAqLwotI2RlZmluZSBUSUZfTUVNRElFCQkxNworI2RlZmluZSBUSUZfTUVNRElFCQkxNgogCiAjZGVmaW5lIF9USUZfU1lTQ0FMTF9UUkFDRQkoMTw8VElGX1NZU0NBTExfVFJBQ0UpCiAjZGVmaW5lIF9USUZfTk9USUZZX1JFU1VNRQkoMTw8VElGX05PVElGWV9SRVNVTUUpCkBAIC0xNTMsNyArMTUyLDYgQEAKICNkZWZpbmUgX1RJRl9TWVNDQUxMX0FVRElUCSgxPDxUSUZfU1lTQ0FMTF9BVURJVCkKICNkZWZpbmUgX1RJRl9TRUNDT01QCQkoMTw8VElGX1NFQ0NPTVApCiAjZGVmaW5lIF9USUZfUkVTVE9SRV9TSUdNQVNLCSgxPDxUSUZfUkVTVE9SRV9TSUdNQVNLKQotI2RlZmluZSBfVElGX1BPTExJTkdfTlJGTEFHCSgxPDxUSUZfUE9MTElOR19OUkZMQUcpCiAKIC8qIHdvcmsgdG8gZG8gb24gaW50ZXJydXB0L2V4Y2VwdGlvbiByZXR1cm4gKi8KICNkZWZpbmUgX1RJRl9XT1JLX01BU0sgXApAQCAtMTcwLDYgKzE2OCw5IEBACiAgKiBoYXZlIHRvIHdvcnJ5IGFib3V0IGF0b21pYyBhY2Nlc3Nlcy4KICAqLwogI2RlZmluZSBUU19VU0VERlBVCQkweDAwMDEJLyogRlBVIHdhcyB1c2VkIGJ5IHRoaXMgdGFzayB0aGlzIHF1YW50dW0gKFNNUCkgKi8KKyNkZWZpbmUgVFNfUE9MTElORwkJMHgwMDAyCS8qIFRydWUgaWYgaW4gaWRsZSBsb29wIGFuZCBub3Qgc2xlZXBpbmcgKi8KKworI2RlZmluZSB0c2tfaXNfcG9sbGluZyh0KSAoKHQpLT50aHJlYWRfaW5mby0+c3RhdHVzICYgVFNfUE9MTElORykKIAogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni90aW1lci5oIGIvaW5jbHVkZS9hc20taTM4Ni90aW1lci5oCmluZGV4IGFlZDE2NDMuLmQwZWJkMDUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvdGltZXIuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L3RpbWVyLmgKQEAgLTMsNjggKzMsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcG0uaD4KIAotLyoqCi0gKiBzdHJ1Y3QgdGltZXJfb3BzIC0gdXNlZCB0byBkZWZpbmUgYSB0aW1lciBzb3VyY2UKLSAqCi0gKiBAbmFtZTogbmFtZSBvZiB0aGUgdGltZXIuCi0gKiBAaW5pdDogUHJvYmVzIGFuZCBpbml0aWFsaXplcyB0aGUgdGltZXIuIFRha2VzIGNsb2NrPSBvdmVycmlkZSAKLSAqICAgICAgICBzdHJpbmcgYXMgYW4gYXJndW1lbnQuIFJldHVybnMgMCBvbiBzdWNjZXNzLCBhbnl0aGluZyBlbHNlCi0gKiAgICAgICAgb24gZmFpbHVyZS4KLSAqIEBtYXJrX29mZnNldDogY2FsbGVkIGJ5IHRoZSB0aW1lciBpbnRlcnJ1cHQuCi0gKiBAZ2V0X29mZnNldDogIGNhbGxlZCBieSBnZXR0aW1lb2ZkYXkoKS4gUmV0dXJucyB0aGUgbnVtYmVyIG9mIG1pY3Jvc2Vjb25kcwotICogICAgICAgICAgICAgICBzaW5jZSB0aGUgbGFzdCB0aW1lciBpbnRlcnVwdC4KLSAqIEBtb25vdG9uaWNfY2xvY2s6IHJldHVybnMgdGhlIG51bWJlciBvZiBuYW5vc2Vjb25kcyBzaW5jZSB0aGUgaW5pdCBvZiB0aGUKLSAqICAgICAgICAgICAgICAgICAgIHRpbWVyLgotICogQGRlbGF5OiBkZWxheXMgdGhpcyBtYW55IGNsb2NrIGN5Y2xlcy4KLSAqLwotc3RydWN0IHRpbWVyX29wdHMgewotCWNoYXIqIG5hbWU7Ci0Jdm9pZCAoKm1hcmtfb2Zmc2V0KSh2b2lkKTsKLQl1bnNpZ25lZCBsb25nICgqZ2V0X29mZnNldCkodm9pZCk7Ci0JdW5zaWduZWQgbG9uZyBsb25nICgqbW9ub3RvbmljX2Nsb2NrKSh2b2lkKTsKLQl2b2lkICgqZGVsYXkpKHVuc2lnbmVkIGxvbmcpOwotCXVuc2lnbmVkIGxvbmcgKCpyZWFkX3RpbWVyKSh2b2lkKTsKLQlpbnQgKCpzdXNwZW5kKShwbV9tZXNzYWdlX3Qgc3RhdGUpOwotCWludCAoKnJlc3VtZSkodm9pZCk7Ci19OwotCi1zdHJ1Y3QgaW5pdF90aW1lcl9vcHRzIHsKLQlpbnQgKCppbml0KShjaGFyICpvdmVycmlkZSk7Ci0Jc3RydWN0IHRpbWVyX29wdHMgKm9wdHM7Ci19OwotCiAjZGVmaW5lIFRJQ0tfU0laRSAodGlja19uc2VjIC8gMTAwMCkKLQotZXh0ZXJuIHN0cnVjdCB0aW1lcl9vcHRzKiBfX2luaXQgc2VsZWN0X3RpbWVyKHZvaWQpOwotZXh0ZXJuIHZvaWQgY2xvY2tfZmFsbGJhY2sodm9pZCk7CiB2b2lkIHNldHVwX3BpdF90aW1lcih2b2lkKTsKLQogLyogTW9kaWZpZXJzIGZvciBidWdneSBQSVQgaGFuZGxpbmcgKi8KLQogZXh0ZXJuIGludCBwaXRfbGF0Y2hfYnVnZ3k7Ci0KLWV4dGVybiBzdHJ1Y3QgdGltZXJfb3B0cyAqY3VyX3RpbWVyOwogZXh0ZXJuIGludCB0aW1lcl9hY2s7Ci0KLS8qIGxpc3Qgb2YgZXh0ZXJuZWQgdGltZXJzICovCi1leHRlcm4gc3RydWN0IHRpbWVyX29wdHMgdGltZXJfbm9uZTsKLWV4dGVybiBzdHJ1Y3QgdGltZXJfb3B0cyB0aW1lcl9waXQ7Ci1leHRlcm4gc3RydWN0IGluaXRfdGltZXJfb3B0cyB0aW1lcl9waXRfaW5pdDsKLWV4dGVybiBzdHJ1Y3QgaW5pdF90aW1lcl9vcHRzIHRpbWVyX3RzY19pbml0OwotI2lmZGVmIENPTkZJR19YODZfQ1lDTE9ORV9USU1FUgotZXh0ZXJuIHN0cnVjdCBpbml0X3RpbWVyX29wdHMgdGltZXJfY3ljbG9uZV9pbml0OwotI2VuZGlmCi0KLWV4dGVybiB1bnNpZ25lZCBsb25nIGNhbGlicmF0ZV90c2Modm9pZCk7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyByZWFkX3RpbWVyX3RzYyh2b2lkKTsKLWV4dGVybiB2b2lkIGluaXRfY3B1X2toeih2b2lkKTsKIGV4dGVybiBpbnQgcmVjYWxpYnJhdGVfY3B1X2toeih2b2lkKTsKLSNpZmRlZiBDT05GSUdfSFBFVF9USU1FUgotZXh0ZXJuIHN0cnVjdCBpbml0X3RpbWVyX29wdHMgdGltZXJfaHBldF9pbml0OwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgY2FsaWJyYXRlX3RzY19ocGV0KHVuc2lnbmVkIGxvbmcgKnRzY19ocGV0X3F1b3RpZW50X3B0cik7Ci0jZW5kaWYKIAotI2lmZGVmIENPTkZJR19YODZfUE1fVElNRVIKLWV4dGVybiBzdHJ1Y3QgaW5pdF90aW1lcl9vcHRzIHRpbWVyX3BtdG1yX2luaXQ7Ci0jZW5kaWYKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni90aW1leC5oIGIvaW5jbHVkZS9hc20taTM4Ni90aW1leC5oCmluZGV4IGQ0MzQ5ODQuLjM2NjYwNDQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvdGltZXguaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L3RpbWV4LmgKQEAgLTcsNiArNyw3IEBACiAjZGVmaW5lIF9BU01pMzg2X1RJTUVYX0gKIAogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vdHNjLmg+CiAKICNpZmRlZiBDT05GSUdfWDg2X0VMQU4KICMgIGRlZmluZSBDTE9DS19USUNLX1JBVEUgMTE4OTIwMCAvKiBBTUQgRWxhbiBoYXMgZGlmZmVyZW50IGZyZXF1ZW5jeSEgKi8KQEAgLTE1LDM5ICsxNiw2IEBACiAjZW5kaWYKIAogCi0vKgotICogU3RhbmRhcmQgd2F5IHRvIGFjY2VzcyB0aGUgY3ljbGUgY291bnRlciBvbiBpNTg2KyBDUFVzLgotICogQ3VycmVudGx5IG9ubHkgdXNlZCBvbiBTTVAuCi0gKgotICogSWYgeW91IHJlYWxseSBoYXZlIGEgU01QIG1hY2hpbmUgd2l0aCBpNDg2IGNoaXBzIG9yIG9sZGVyLAotICogY29tcGlsZSBmb3IgdGhhdCwgYW5kIHRoaXMgd2lsbCBqdXN0IGFsd2F5cyByZXR1cm4gemVyby4KLSAqIFRoYXQncyBvaywgaXQganVzdCBtZWFucyB0aGF0IHRoZSBuaWNlciBzY2hlZHVsaW5nIGhldXJpc3RpY3MKLSAqIHdvbid0IHdvcmsgZm9yIHlvdS4KLSAqCi0gKiBXZSBvbmx5IHVzZSB0aGUgbG93IDMyIGJpdHMsIGFuZCB3ZSdkIHNpbXBseSBiZXR0ZXIgbWFrZSBzdXJlCi0gKiB0aGF0IHdlIHJlc2NoZWR1bGUgYmVmb3JlIHRoYXQgd3JhcHMuIFNjaGVkdWxpbmcgYXQgbGVhc3QgZXZlcnkKLSAqIGZvdXIgYmlsbGlvbiBjeWNsZXMganVzdCBiYXNpY2FsbHkgc291bmRzIGxpa2UgYSBnb29kIGlkZWEsCi0gKiByZWdhcmRsZXNzIG9mIGhvdyBmYXN0IHRoZSBtYWNoaW5lIGlzLiAKLSAqLwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgY3ljbGVzX3Q7Ci0KLXN0YXRpYyBpbmxpbmUgY3ljbGVzX3QgZ2V0X2N5Y2xlcyAodm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIGxvbmcgcmV0PTA7Ci0KLSNpZm5kZWYgQ09ORklHX1g4Nl9UU0MKLQlpZiAoIWNwdV9oYXNfdHNjKQotCQlyZXR1cm4gMDsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChDT05GSUdfWDg2X0dFTkVSSUMpIHx8IGRlZmluZWQoQ09ORklHX1g4Nl9UU0MpCi0JcmR0c2NsbChyZXQpOwotI2VuZGlmCi0JcmV0dXJuIHJldDsKLX0KLQotZXh0ZXJuIHVuc2lnbmVkIGludCBjcHVfa2h6OwotCiBleHRlcm4gaW50IHJlYWRfY3VycmVudF90aW1lcih1bnNpZ25lZCBsb25nICp0aW1lcl92YWx1ZSk7CiAjZGVmaW5lIEFSQ0hfSEFTX1JFQURfQ1VSUkVOVF9USU1FUgkxCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvdHNjLmggYi9pbmNsdWRlL2FzbS1pMzg2L3RzYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3YjgyOGMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L3RzYy5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBsaW51eC9pbmNsdWRlL2FzbS1pMzg2L3RzYy5oCisgKgorICogaTM4NiBUU0MgcmVsYXRlZCBmdW5jdGlvbnMKKyAqLworI2lmbmRlZiBfQVNNX2kzODZfVFNDX0gKKyNkZWZpbmUgX0FTTV9pMzg2X1RTQ19ICisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisKKy8qCisgKiBTdGFuZGFyZCB3YXkgdG8gYWNjZXNzIHRoZSBjeWNsZSBjb3VudGVyIG9uIGk1ODYrIENQVXMuCisgKiBDdXJyZW50bHkgb25seSB1c2VkIG9uIFNNUC4KKyAqCisgKiBJZiB5b3UgcmVhbGx5IGhhdmUgYSBTTVAgbWFjaGluZSB3aXRoIGk0ODYgY2hpcHMgb3Igb2xkZXIsCisgKiBjb21waWxlIGZvciB0aGF0LCBhbmQgdGhpcyB3aWxsIGp1c3QgYWx3YXlzIHJldHVybiB6ZXJvLgorICogVGhhdCdzIG9rLCBpdCBqdXN0IG1lYW5zIHRoYXQgdGhlIG5pY2VyIHNjaGVkdWxpbmcgaGV1cmlzdGljcworICogd29uJ3Qgd29yayBmb3IgeW91LgorICoKKyAqIFdlIG9ubHkgdXNlIHRoZSBsb3cgMzIgYml0cywgYW5kIHdlJ2Qgc2ltcGx5IGJldHRlciBtYWtlIHN1cmUKKyAqIHRoYXQgd2UgcmVzY2hlZHVsZSBiZWZvcmUgdGhhdCB3cmFwcy4gU2NoZWR1bGluZyBhdCBsZWFzdCBldmVyeQorICogZm91ciBiaWxsaW9uIGN5Y2xlcyBqdXN0IGJhc2ljYWxseSBzb3VuZHMgbGlrZSBhIGdvb2QgaWRlYSwKKyAqIHJlZ2FyZGxlc3Mgb2YgaG93IGZhc3QgdGhlIG1hY2hpbmUgaXMuCisgKi8KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIGN5Y2xlc190OworCitleHRlcm4gdW5zaWduZWQgaW50IGNwdV9raHo7CitleHRlcm4gdW5zaWduZWQgaW50IHRzY19raHo7CisKK3N0YXRpYyBpbmxpbmUgY3ljbGVzX3QgZ2V0X2N5Y2xlcyh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyByZXQgPSAwOworCisjaWZuZGVmIENPTkZJR19YODZfVFNDCisJaWYgKCFjcHVfaGFzX3RzYykKKwkJcmV0dXJuIDA7CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1g4Nl9HRU5FUklDKSB8fCBkZWZpbmVkKENPTkZJR19YODZfVFNDKQorCXJkdHNjbGwocmV0KTsKKyNlbmRpZgorCXJldHVybiByZXQ7Cit9CisKK2V4dGVybiB2b2lkIHRzY19pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgbWFya190c2NfdW5zdGFibGUodm9pZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni91YWNjZXNzLmggYi9pbmNsdWRlL2FzbS1pMzg2L3VhY2Nlc3MuaAppbmRleCA4NDYyZjhlLi41NGQ5MDVlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L3VhY2Nlc3MuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L3VhY2Nlc3MuaApAQCAtMzkwLDggKzM5MCwxMiBAQAogCQkJCWNvbnN0IHZvaWQgKmZyb20sIHVuc2lnbmVkIGxvbmcgbik7CiB1bnNpZ25lZCBsb25nIF9fbXVzdF9jaGVjayBfX2NvcHlfZnJvbV91c2VyX2xsKHZvaWQgKnRvLAogCQkJCWNvbnN0IHZvaWQgX191c2VyICpmcm9tLCB1bnNpZ25lZCBsb25nIG4pOwordW5zaWduZWQgbG9uZyBfX211c3RfY2hlY2sgX19jb3B5X2Zyb21fdXNlcl9sbF9ub3plcm8odm9pZCAqdG8sCisJCQkJY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sIHVuc2lnbmVkIGxvbmcgbik7CiB1bnNpZ25lZCBsb25nIF9fbXVzdF9jaGVjayBfX2NvcHlfZnJvbV91c2VyX2xsX25vY2FjaGUodm9pZCAqdG8sCiAJCQkJY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sIHVuc2lnbmVkIGxvbmcgbik7Cit1bnNpZ25lZCBsb25nIF9fbXVzdF9jaGVjayBfX2NvcHlfZnJvbV91c2VyX2xsX25vY2FjaGVfbm96ZXJvKHZvaWQgKnRvLAorCQkJCWNvbnN0IHZvaWQgX191c2VyICpmcm9tLCB1bnNpZ25lZCBsb25nIG4pOwogCiAvKgogICogSGVyZSB3ZSBzcGVjaWFsLWNhc2UgMSwgMiBhbmQgNC1ieXRlIGNvcHlfKl91c2VyIGludm9jYXRpb25zLiAgT24gYSBmYXVsdApAQCAtNDU4LDEwICs0NjIsNDEgQEAKICAqCiAgKiBJZiBzb21lIGRhdGEgY291bGQgbm90IGJlIGNvcGllZCwgdGhpcyBmdW5jdGlvbiB3aWxsIHBhZCB0aGUgY29waWVkCiAgKiBkYXRhIHRvIHRoZSByZXF1ZXN0ZWQgc2l6ZSB1c2luZyB6ZXJvIGJ5dGVzLgorICoKKyAqIEFuIGFsdGVybmF0ZSB2ZXJzaW9uIC0gX19jb3B5X2Zyb21fdXNlcl9pbmF0b21pYygpIC0gbWF5IGJlIGNhbGxlZCBmcm9tCisgKiBhdG9taWMgY29udGV4dCBhbmQgd2lsbCBmYWlsIHJhdGhlciB0aGFuIHNsZWVwLiAgSW4gdGhpcyBjYXNlIHRoZQorICogdW5jb3BpZWQgYnl0ZXMgd2lsbCAqTk9UKiBiZSBwYWRkZWQgd2l0aCB6ZXJvcy4gIFNlZSBmcy9maWxlbWFwLmgKKyAqIGZvciBleHBsYW5hdGlvbiBvZiB3aHkgdGhpcyBpcyBuZWVkZWQuCiAgKi8KIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdW5zaWduZWQgbG9uZwogX19jb3B5X2Zyb21fdXNlcl9pbmF0b21pYyh2b2lkICp0bywgY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sIHVuc2lnbmVkIGxvbmcgbikKIHsKKwkvKiBBdm9pZCB6ZXJvaW5nIHRoZSB0YWlsIGlmIHRoZSBjb3B5IGZhaWxzLi4KKwkgKiBJZiAnbicgaXMgY29uc3RhbnQgYW5kIDEsIDIsIG9yIDQsIHdlIGRvIHN0aWxsIHplcm8gb24gYSBmYWlsdXJlLAorCSAqIGJ1dCBhcyB0aGUgemVyb2luZyBiZWhhdmlvdXIgaXMgb25seSBzaWduaWZpY2FudCB3aGVuIG4gaXMgbm90CisJICogY29uc3RhbnQsIHRoYXQgc2hvdWxkbid0IGJlIGEgcHJvYmxlbS4KKwkgKi8KKwlpZiAoX19idWlsdGluX2NvbnN0YW50X3AobikpIHsKKwkJdW5zaWduZWQgbG9uZyByZXQ7CisKKwkJc3dpdGNoIChuKSB7CisJCWNhc2UgMToKKwkJCV9fZ2V0X3VzZXJfc2l6ZSgqKHU4ICopdG8sIGZyb20sIDEsIHJldCwgMSk7CisJCQlyZXR1cm4gcmV0OworCQljYXNlIDI6CisJCQlfX2dldF91c2VyX3NpemUoKih1MTYgKil0bywgZnJvbSwgMiwgcmV0LCAyKTsKKwkJCXJldHVybiByZXQ7CisJCWNhc2UgNDoKKwkJCV9fZ2V0X3VzZXJfc2l6ZSgqKHUzMiAqKXRvLCBmcm9tLCA0LCByZXQsIDQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKwlyZXR1cm4gX19jb3B5X2Zyb21fdXNlcl9sbF9ub3plcm8odG8sIGZyb20sIG4pOworfQorc3RhdGljIF9fYWx3YXlzX2lubGluZSB1bnNpZ25lZCBsb25nCitfX2NvcHlfZnJvbV91c2VyKHZvaWQgKnRvLCBjb25zdCB2b2lkIF9fdXNlciAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKQoreworCW1pZ2h0X3NsZWVwKCk7CiAJaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wKG4pKSB7CiAJCXVuc2lnbmVkIGxvbmcgcmV0OwogCkBAIC00ODIsOSArNTE3LDEwIEBACiAKICNkZWZpbmUgQVJDSF9IQVNfTk9DQUNIRV9VQUNDRVNTCiAKLXN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdW5zaWduZWQgbG9uZyBfX2NvcHlfZnJvbV91c2VyX2luYXRvbWljX25vY2FjaGUodm9pZCAqdG8sCitzdGF0aWMgX19hbHdheXNfaW5saW5lIHVuc2lnbmVkIGxvbmcgX19jb3B5X2Zyb21fdXNlcl9ub2NhY2hlKHZvaWQgKnRvLAogCQkJCWNvbnN0IHZvaWQgX191c2VyICpmcm9tLCB1bnNpZ25lZCBsb25nIG4pCiB7CisJbWlnaHRfc2xlZXAoKTsKIAlpZiAoX19idWlsdGluX2NvbnN0YW50X3AobikpIHsKIAkJdW5zaWduZWQgbG9uZyByZXQ7CiAKQEAgLTUwNCwxNyArNTQwLDkgQEAKIH0KIAogc3RhdGljIF9fYWx3YXlzX2lubGluZSB1bnNpZ25lZCBsb25nCi1fX2NvcHlfZnJvbV91c2VyKHZvaWQgKnRvLCBjb25zdCB2b2lkIF9fdXNlciAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKQorX19jb3B5X2Zyb21fdXNlcl9pbmF0b21pY19ub2NhY2hlKHZvaWQgKnRvLCBjb25zdCB2b2lkIF9fdXNlciAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKQogewotICAgICAgIG1pZ2h0X3NsZWVwKCk7Ci0gICAgICAgcmV0dXJuIF9fY29weV9mcm9tX3VzZXJfaW5hdG9taWModG8sIGZyb20sIG4pOwotfQotCi1zdGF0aWMgX19hbHdheXNfaW5saW5lIHVuc2lnbmVkIGxvbmcKLV9fY29weV9mcm9tX3VzZXJfbm9jYWNoZSh2b2lkICp0bywgY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sIHVuc2lnbmVkIGxvbmcgbikKLXsKLSAgICAgICBtaWdodF9zbGVlcCgpOwotICAgICAgIHJldHVybiBfX2NvcHlfZnJvbV91c2VyX2luYXRvbWljX25vY2FjaGUodG8sIGZyb20sIG4pOworICAgICAgIHJldHVybiBfX2NvcHlfZnJvbV91c2VyX2xsX25vY2FjaGVfbm96ZXJvKHRvLCBmcm9tLCBuKTsKIH0KIAogdW5zaWduZWQgbG9uZyBfX211c3RfY2hlY2sgY29weV90b191c2VyKHZvaWQgX191c2VyICp0bywKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvdW53aW5kLmggYi9pbmNsdWRlL2FzbS1pMzg2L3Vud2luZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ODBmMmUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L3Vud2luZC5oCkBAIC0wLDAgKzEsOTggQEAKKyNpZm5kZWYgX0FTTV9JMzg2X1VOV0lORF9ICisjZGVmaW5lIF9BU01fSTM4Nl9VTldJTkRfSAorCisvKgorICogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDYgTm92ZWxsLCBJbmMuCisgKglKYW4gQmV1bGljaCA8amJldWxpY2hAbm92ZWxsLmNvbT4KKyAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHUEwuCisgKi8KKworI2lmZGVmIENPTkZJR19TVEFDS19VTldJTkQKKworI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8YXNtL2ZpeG1hcC5oPgorI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCitzdHJ1Y3QgdW53aW5kX2ZyYW1lX2luZm8KK3sKKwlzdHJ1Y3QgcHRfcmVncyByZWdzOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzazsKK307CisKKyNkZWZpbmUgVU5XX1BDKGZyYW1lKSAgICAgICAgKGZyYW1lKS0+cmVncy5laXAKKyNkZWZpbmUgVU5XX1NQKGZyYW1lKSAgICAgICAgKGZyYW1lKS0+cmVncy5lc3AKKyNpZmRlZiBDT05GSUdfRlJBTUVfUE9JTlRFUgorI2RlZmluZSBVTldfRlAoZnJhbWUpICAgICAgICAoZnJhbWUpLT5yZWdzLmVicAorI2RlZmluZSBGUkFNRV9SRVRBRERSX09GRlNFVCA0CisjZGVmaW5lIEZSQU1FX0xJTktfT0ZGU0VUICAgIDAKKyNkZWZpbmUgU1RBQ0tfQk9UVE9NKHRzaykgICAgU1RBQ0tfTElNSVQoKHRzayktPnRocmVhZC5lc3AwKQorI2RlZmluZSBTVEFDS19UT1AodHNrKSAgICAgICAoKHRzayktPnRocmVhZC5lc3AwKQorI2VuZGlmCisjZGVmaW5lIFNUQUNLX0xJTUlUKHB0cikgICAgICgoKHB0cikgLSAxKSAmIH4oVEhSRUFEX1NJWkUgLSAxKSkKKworI2RlZmluZSBVTldfUkVHSVNURVJfSU5GTyBcCisJUFRSRUdTX0lORk8oZWF4KSwgXAorCVBUUkVHU19JTkZPKGVjeCksIFwKKwlQVFJFR1NfSU5GTyhlZHgpLCBcCisJUFRSRUdTX0lORk8oZWJ4KSwgXAorCVBUUkVHU19JTkZPKGVzcCksIFwKKwlQVFJFR1NfSU5GTyhlYnApLCBcCisJUFRSRUdTX0lORk8oZXNpKSwgXAorCVBUUkVHU19JTkZPKGVkaSksIFwKKwlQVFJFR1NfSU5GTyhlaXApCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhcmNoX3Vud19pbml0X2ZyYW1lX2luZm8oc3RydWN0IHVud2luZF9mcmFtZV9pbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmNvbnN0Ki8gc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaWYgKHVzZXJfbW9kZV92bShyZWdzKSkKKwkJaW5mby0+cmVncyA9ICpyZWdzOworCWVsc2UgeworCQltZW1jcHkoJmluZm8tPnJlZ3MsIHJlZ3MsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCBlc3ApKTsKKwkJaW5mby0+cmVncy5lc3AgPSAodW5zaWduZWQgbG9uZykmcmVncy0+ZXNwOworCQlpbmZvLT5yZWdzLnhzcyA9IF9fS0VSTkVMX0RTOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIGFyY2hfdW53X2luaXRfYmxvY2tlZChzdHJ1Y3QgdW53aW5kX2ZyYW1lX2luZm8gKmluZm8pCit7CisJbWVtc2V0KCZpbmZvLT5yZWdzLCAwLCBzaXplb2YoaW5mby0+cmVncykpOworCWluZm8tPnJlZ3MuZWlwID0gaW5mby0+dGFzay0+dGhyZWFkLmVpcDsKKwlpbmZvLT5yZWdzLnhjcyA9IF9fS0VSTkVMX0NTOworCV9fZ2V0X3VzZXIoaW5mby0+cmVncy5lYnAsIChsb25nICopaW5mby0+dGFzay0+dGhyZWFkLmVzcCk7CisJaW5mby0+cmVncy5lc3AgPSBpbmZvLT50YXNrLT50aHJlYWQuZXNwOworCWluZm8tPnJlZ3MueHNzID0gX19LRVJORUxfRFM7CisJaW5mby0+cmVncy54ZHMgPSBfX1VTRVJfRFM7CisJaW5mby0+cmVncy54ZXMgPSBfX1VTRVJfRFM7Cit9CisKK2V4dGVybiBhc21saW5rYWdlIGludCBhcmNoX3Vud2luZF9pbml0X3J1bm5pbmcoc3RydWN0IHVud2luZF9mcmFtZV9pbmZvICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzbWxpbmthZ2UgaW50ICgqY2FsbGJhY2spKHN0cnVjdCB1bndpbmRfZnJhbWVfaW5mbyAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICphcmcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICphcmcpOworCitzdGF0aWMgaW5saW5lIGludCBhcmNoX3Vud191c2VyX21vZGUoY29uc3Qgc3RydWN0IHVud2luZF9mcmFtZV9pbmZvICppbmZvKQoreworI2lmIDAgLyogVGhpcyBjYW4gb25seSB3b3JrIHdoZW4gc2VsZWN0b3IgcmVnaXN0ZXIgYW5kIEVGTEFHUyBzYXZlcy9yZXN0b3JlcworICAgICAgICAgYXJlIHByb3Blcmx5IGFubm90YXRlZCAoYW5kIHRyYWNrZWQgaW4gVU5XX1JFR0lTVEVSX0lORk8pLiAqLworCXJldHVybiB1c2VyX21vZGVfdm0oJmluZm8tPnJlZ3MpOworI2Vsc2UKKwlyZXR1cm4gaW5mby0+cmVncy5laXAgPCBQQUdFX09GRlNFVAorCSAgICAgICB8fCAoaW5mby0+cmVncy5laXAgPj0gX19maXhfdG9fdmlydChGSVhfVlNZU0NBTEwpCisJICAgICAgICAgICAgJiYgaW5mby0+cmVncy5laXAgPCBfX2ZpeF90b192aXJ0KEZJWF9WU1lTQ0FMTCkgKyBQQUdFX1NJWkUpCisJICAgICAgIHx8IGluZm8tPnJlZ3MuZXNwIDwgUEFHRV9PRkZTRVQ7CisjZW5kaWYKK30KKworI2Vsc2UKKworI2RlZmluZSBVTldfUEMoZnJhbWUpICgodm9pZCkoZnJhbWUpLCAwKQorCitzdGF0aWMgaW5saW5lIGludCBhcmNoX3Vud191c2VyX21vZGUoY29uc3Qgdm9pZCAqaW5mbykKK3sKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmCisKKyNlbmRpZiAvKiBfQVNNX0kzODZfVU5XSU5EX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQva2RlYnVnLmggYi9pbmNsdWRlL2FzbS1pYTY0L2tkZWJ1Zy5oCmluZGV4IGMxOTVhOWEuLmFlZDcxNDIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQva2RlYnVnLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9rZGVidWcuaApAQCAtNDAsNiArNDAsOCBAQAogCiBleHRlcm4gaW50IHJlZ2lzdGVyX2RpZV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKik7CiBleHRlcm4gaW50IHVucmVnaXN0ZXJfZGllX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqKTsKK2V4dGVybiBpbnQgcmVnaXN0ZXJfcGFnZV9mYXVsdF9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKik7CitleHRlcm4gaW50IHVucmVnaXN0ZXJfcGFnZV9mYXVsdF9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKik7CiBleHRlcm4gc3RydWN0IGF0b21pY19ub3RpZmllcl9oZWFkIGlhNjRkaWVfY2hhaW47CiAKIGVudW0gZGllX3ZhbCB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L2twcm9iZXMuaCBiL2luY2x1ZGUvYXNtLWlhNjQva3Byb2Jlcy5oCmluZGV4IDhjMGZjMjIuLjI0MThhNzggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQva3Byb2Jlcy5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQva3Byb2Jlcy5oCkBAIC04Miw2ICs4Miw3IEBACiAjZGVmaW5lIEpQUk9CRV9FTlRSWShwZW50cnkpCShrcHJvYmVfb3Bjb2RlX3QgKilwZW50cnkKIAogI2RlZmluZSBBUkNIX1NVUFBPUlRTX0tSRVRQUk9CRVMKKyNkZWZpbmUgIEFSQ0hfSU5BQ1RJVkVfS1BST0JFX0NPVU5UIDEKIAogI2RlZmluZSBTTE9UMF9PUENPREVfU0hJRlQJKDM3KQogI2RlZmluZSBTTE9UMV9wMV9PUENPREVfU0hJRlQJKDM3IC0gKDY0LTQ2KSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvcGVyY3B1LmggYi9pbmNsdWRlL2FzbS1pYTY0L3BlcmNwdS5oCmluZGV4IGFlMzU3ZDUuLjI0ZDg5OGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvcGVyY3B1LmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9wZXJjcHUuaApAQCAtNDIsNiArNDIsNyBAQAogCiAjZGVmaW5lIHBlcl9jcHUodmFyLCBjcHUpICAoKlJFTE9DX0hJREUoJnBlcl9jcHVfXyMjdmFyLCBfX3Blcl9jcHVfb2Zmc2V0W2NwdV0pKQogI2RlZmluZSBfX2dldF9jcHVfdmFyKHZhcikgKCpSRUxPQ19ISURFKCZwZXJfY3B1X18jI3ZhciwgX19pYTY0X3Blcl9jcHVfdmFyKGxvY2FsX3Blcl9jcHVfb2Zmc2V0KSkpCisjZGVmaW5lIF9fcmF3X2dldF9jcHVfdmFyKHZhcikgKCpSRUxPQ19ISURFKCZwZXJfY3B1X18jI3ZhciwgX19pYTY0X3Blcl9jcHVfdmFyKGxvY2FsX3Blcl9jcHVfb2Zmc2V0KSkpCiAKIGV4dGVybiB2b2lkIHBlcmNwdV9tb2Rjb3B5KHZvaWQgKnBjcHVkc3QsIGNvbnN0IHZvaWQgKnNyYywgdW5zaWduZWQgbG9uZyBzaXplKTsKIGV4dGVybiB2b2lkIHNldHVwX3Blcl9jcHVfYXJlYXMgKHZvaWQpOwpAQCAtNTEsNiArNTIsNyBAQAogCiAjZGVmaW5lIHBlcl9jcHUodmFyLCBjcHUpCQkJKCooKHZvaWQpKGNwdSksICZwZXJfY3B1X18jI3ZhcikpCiAjZGVmaW5lIF9fZ2V0X2NwdV92YXIodmFyKQkJCXBlcl9jcHVfXyMjdmFyCisjZGVmaW5lIF9fcmF3X2dldF9jcHVfdmFyKHZhcikJCQlwZXJfY3B1X18jI3ZhcgogI2RlZmluZSBwZXJfY3B1X2luaXQoKQkJCQkoX19waHlzX3Blcl9jcHVfc3RhcnQpCiAKICNlbmRpZgkvKiBTTVAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvdGhyZWFkX2luZm8uaCBiL2luY2x1ZGUvYXNtLWlhNjQvdGhyZWFkX2luZm8uaAppbmRleCBlNTM5MmM0Li44YmM5ODY5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L3RocmVhZF9pbmZvLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC90aHJlYWRfaW5mby5oCkBAIC0yNyw2ICsyNyw3IEBACiAJX191MzIgZmxhZ3M7CQkJLyogdGhyZWFkX2luZm8gZmxhZ3MgKHNlZSBUSUZfKikgKi8KIAlfX3UzMiBjcHU7CQkJLyogY3VycmVudCBDUFUgKi8KIAlfX3UzMiBsYXN0X2NwdTsJCQkvKiBMYXN0IENQVSB0aHJlYWQgcmFuIG9uICovCisJX191MzIgc3RhdHVzOwkJCS8qIFRocmVhZCBzeW5jaHJvbm91cyBmbGFncyAqLwogCW1tX3NlZ21lbnRfdCBhZGRyX2xpbWl0OwkvKiB1c2VyLWxldmVsIGFkZHJlc3Mgc3BhY2UgbGltaXQgKi8KIAlpbnQgcHJlZW1wdF9jb3VudDsJCS8qIDA9cHJlbXB0YWJsZSwgPDA9QlVHOyB3aWxsIGFsc28gc2VydmUgYXMgYmgtY291bnRlciAqLwogCXN0cnVjdCByZXN0YXJ0X2Jsb2NrIHJlc3RhcnRfYmxvY2s7CkBAIC0xMDMsNCArMTA0LDggQEAKIC8qIGxpa2UgVElGX0FMTFdPUktfQklUUyBidXQgc2FucyBUSUZfU1lTQ0FMTF9UUkFDRSBvciBUSUZfU1lTQ0FMTF9BVURJVCAqLwogI2RlZmluZSBUSUZfV09SS19NQVNLCQkoVElGX0FMTFdPUktfTUFTSyZ+KF9USUZfU1lTQ0FMTF9UUkFDRXxfVElGX1NZU0NBTExfQVVESVQpKQogCisjZGVmaW5lIFRTX1BPTExJTkcJCTEgCS8qIHRydWUgaWYgaW4gaWRsZSBsb29wIGFuZCBub3Qgc2xlZXBpbmcgKi8KKworI2RlZmluZSB0c2tfaXNfcG9sbGluZyh0KSAoKHQpLT50aHJlYWRfaW5mby0+c3RhdHVzICYgVFNfUE9MTElORykKKwogI2VuZGlmIC8qIF9BU01fSUE2NF9USFJFQURfSU5GT19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tMzJyL3N5c3RlbS5oIGIvaW5jbHVkZS9hc20tbTMyci9zeXN0ZW0uaAppbmRleCAzMzU2N2U4Li42NmM0NzQyZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTMyci9zeXN0ZW0uaAorKysgYi9pbmNsdWRlL2FzbS1tMzJyL3N5c3RlbS5oCkBAIC0zMTgsNyArMzE4LDcgQEAKICAqIGRvZXMgbm90IGVuZm9yY2Ugb3JkZXJpbmcsIHNpbmNlIHRoZXJlIGlzIG5vIGRhdGEgZGVwZW5kZW5jeSBiZXR3ZWVuCiAgKiB0aGUgcmVhZCBvZiAiYSIgYW5kIHRoZSByZWFkIG9mICJiIi4gIFRoZXJlZm9yZSwgb24gc29tZSBDUFVzLCBzdWNoCiAgKiBhcyBBbHBoYSwgInkiIGNvdWxkIGJlIHNldCB0byAzIGFuZCAieCIgdG8gMC4gIFVzZSBybWIoKQotICogaW4gY2FzZXMgbGlrZSB0aGlzd2hlcmUgdGhlcmUgYXJlIG5vIGRhdGEgZGVwZW5kZW5jaWVzLgorICogaW4gY2FzZXMgbGlrZSB0aGlzIHdoZXJlIHRoZXJlIGFyZSBubyBkYXRhIGRlcGVuZGVuY2llcy4KICAqKi8KIAogI2RlZmluZSByZWFkX2JhcnJpZXJfZGVwZW5kcygpCWRvIHsgfSB3aGlsZSAoMCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGsvYW1pZ2FpbnRzLmggYi9pbmNsdWRlL2FzbS1tNjhrL2FtaWdhaW50cy5oCmluZGV4IGFhOTY4ZDAuLjdjODcxMzQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW02OGsvYW1pZ2FpbnRzLmgKKysrIGIvaW5jbHVkZS9hc20tbTY4ay9hbWlnYWludHMuaApAQCAtMTMsNiArMTMsOCBAQAogI2lmbmRlZiBfQVNNbTY4a19BTUlHQUlOVFNfSF8KICNkZWZpbmUgX0FTTW02OGtfQU1JR0FJTlRTX0hfCiAKKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKIC8qCiAqKiBBbWlnYSBJbnRlcnJ1cHQgc291cmNlcy4KICoqCkBAIC0yMyw3MiArMjUsNTIgQEAKICNkZWZpbmUgQ0lBX0lSUVMgICAgICAgICAgICAoNSkKICNkZWZpbmUgQU1JX0lSUVMgICAgICAgICAgICAoMzIpIC8qIEFVVE9fSVJRUytBTUlfU1REX0lSUVMrMipDSUFfSVJRUyAqLwogCi0vKiB2ZXJ0aWNhbCBibGFua2luZyBpbnRlcnJ1cHQgKi8KLSNkZWZpbmUgSVJRX0FNSUdBX1ZFUlRCICAgICAwCi0KLS8qIGNvcHBlciBpbnRlcnJ1cHQgKi8KLSNkZWZpbmUgSVJRX0FNSUdBX0NPUFBFUiAgICAxCi0KLS8qIEF1ZGlvIGludGVycnVwdHMgKi8KLSNkZWZpbmUgSVJRX0FNSUdBX0FVRDAJICAgIDIKLSNkZWZpbmUgSVJRX0FNSUdBX0FVRDEJICAgIDMKLSNkZWZpbmUgSVJRX0FNSUdBX0FVRDIJICAgIDQKLSNkZWZpbmUgSVJRX0FNSUdBX0FVRDMJICAgIDUKLQotLyogQmxpdHRlciBkb25lIGludGVycnVwdCAqLwotI2RlZmluZSBJUlFfQU1JR0FfQkxJVAkgICAgNgorLyogYnVpbHRpbiBzZXJpYWwgcG9ydCBpbnRlcnJ1cHRzICovCisjZGVmaW5lIElSUV9BTUlHQV9UQkUJCShJUlFfVVNFUiswKQorI2RlZmluZSBJUlFfQU1JR0FfUkJGCQkoSVJRX1VTRVIrMTEpCiAKIC8qIGZsb3BweSBkaXNrIGludGVycnVwdHMgKi8KLSNkZWZpbmUgSVJRX0FNSUdBX0RTS1NZTiAgICA3Ci0jZGVmaW5lIElSUV9BTUlHQV9EU0tCTEsgICAgOAotCi0vKiBidWlsdGluIHNlcmlhbCBwb3J0IGludGVycnVwdHMgKi8KLSNkZWZpbmUgSVJRX0FNSUdBX1JCRgkgICAgOQotI2RlZmluZSBJUlFfQU1JR0FfVEJFCSAgICAxMAorI2RlZmluZSBJUlFfQU1JR0FfRFNLQkxLCShJUlFfVVNFUisxKQorI2RlZmluZSBJUlFfQU1JR0FfRFNLU1lOCShJUlFfVVNFUisxMikKIAogLyogc29mdHdhcmUgaW50ZXJydXB0cyAqLwotI2RlZmluZSBJUlFfQU1JR0FfU09GVCAgICAgIDExCisjZGVmaW5lIElSUV9BTUlHQV9TT0ZUCQkoSVJRX1VTRVIrMikKIAogLyogaW50ZXJydXB0cyBmcm9tIGV4dGVybmFsIGhhcmR3YXJlICovCi0jZGVmaW5lIElSUV9BTUlHQV9QT1JUUwkgICAgMTIKLSNkZWZpbmUgSVJRX0FNSUdBX0VYVEVSCSAgICAxMworI2RlZmluZSBJUlFfQU1JR0FfUE9SVFMJCUlSUV9BVVRPXzIKKyNkZWZpbmUgSVJRX0FNSUdBX0VYVEVSCQlJUlFfQVVUT182CisKKy8qIGNvcHBlciBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgSVJRX0FNSUdBX0NPUFBFUgkoSVJRX1VTRVIrNCkKKworLyogdmVydGljYWwgYmxhbmtpbmcgaW50ZXJydXB0ICovCisjZGVmaW5lIElSUV9BTUlHQV9WRVJUQgkJKElSUV9VU0VSKzUpCisKKy8qIEJsaXR0ZXIgZG9uZSBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgSVJRX0FNSUdBX0JMSVQJCShJUlFfVVNFUis2KQorCisvKiBBdWRpbyBpbnRlcnJ1cHRzICovCisjZGVmaW5lIElSUV9BTUlHQV9BVUQwCQkoSVJRX1VTRVIrNykKKyNkZWZpbmUgSVJRX0FNSUdBX0FVRDEJCShJUlFfVVNFUis4KQorI2RlZmluZSBJUlFfQU1JR0FfQVVEMgkJKElSUV9VU0VSKzkpCisjZGVmaW5lIElSUV9BTUlHQV9BVUQzCQkoSVJRX1VTRVIrMTApCiAKIC8qIENJQSBpbnRlcnJ1cHQgc291cmNlcyAqLwotI2RlZmluZSBJUlFfQU1JR0FfQ0lBQSAgICAgIDE0Ci0jZGVmaW5lIElSUV9BTUlHQV9DSUFBX1RBICAgMTQKLSNkZWZpbmUgSVJRX0FNSUdBX0NJQUFfVEIgICAxNQotI2RlZmluZSBJUlFfQU1JR0FfQ0lBQV9BTFJNIDE2Ci0jZGVmaW5lIElSUV9BTUlHQV9DSUFBX1NQICAgMTcKLSNkZWZpbmUgSVJRX0FNSUdBX0NJQUFfRkxHICAxOAotI2RlZmluZSBJUlFfQU1JR0FfQ0lBQiAgICAgIDE5Ci0jZGVmaW5lIElSUV9BTUlHQV9DSUFCX1RBICAgMTkKLSNkZWZpbmUgSVJRX0FNSUdBX0NJQUJfVEIgICAyMAotI2RlZmluZSBJUlFfQU1JR0FfQ0lBQl9BTFJNIDIxCi0jZGVmaW5lIElSUV9BTUlHQV9DSUFCX1NQICAgMjIKLSNkZWZpbmUgSVJRX0FNSUdBX0NJQUJfRkxHICAyMworI2RlZmluZSBJUlFfQU1JR0FfQ0lBQQkJKElSUV9VU0VSKzE0KQorI2RlZmluZSBJUlFfQU1JR0FfQ0lBQV9UQQkoSVJRX1VTRVIrMTQpCisjZGVmaW5lIElSUV9BTUlHQV9DSUFBX1RCCShJUlFfVVNFUisxNSkKKyNkZWZpbmUgSVJRX0FNSUdBX0NJQUFfQUxSTQkoSVJRX1VTRVIrMTYpCisjZGVmaW5lIElSUV9BTUlHQV9DSUFBX1NQCShJUlFfVVNFUisxNykKKyNkZWZpbmUgSVJRX0FNSUdBX0NJQUFfRkxHCShJUlFfVVNFUisxOCkKKyNkZWZpbmUgSVJRX0FNSUdBX0NJQUIJCShJUlFfVVNFUisxOSkKKyNkZWZpbmUgSVJRX0FNSUdBX0NJQUJfVEEJKElSUV9VU0VSKzE5KQorI2RlZmluZSBJUlFfQU1JR0FfQ0lBQl9UQgkoSVJRX1VTRVIrMjApCisjZGVmaW5lIElSUV9BTUlHQV9DSUFCX0FMUk0JKElSUV9VU0VSKzIxKQorI2RlZmluZSBJUlFfQU1JR0FfQ0lBQl9TUAkoSVJRX1VTRVIrMjIpCisjZGVmaW5lIElSUV9BTUlHQV9DSUFCX0ZMRwkoSVJRX1VTRVIrMjMpCiAKLS8qIGF1dG8tdmVjdG9yIGludGVycnVwdHMgKi8KLSNkZWZpbmUgSVJRX0FNSUdBX0FVVE8gICAgICAyNAotI2RlZmluZSBJUlFfQU1JR0FfQVVUT18wICAgIDI0IC8qIFRoaXMgaXMganVzdCBhIGR1bW15ICovCi0jZGVmaW5lIElSUV9BTUlHQV9BVVRPXzEgICAgMjUKLSNkZWZpbmUgSVJRX0FNSUdBX0FVVE9fMiAgICAyNgotI2RlZmluZSBJUlFfQU1JR0FfQVVUT18zICAgIDI3Ci0jZGVmaW5lIElSUV9BTUlHQV9BVVRPXzQgICAgMjgKLSNkZWZpbmUgSVJRX0FNSUdBX0FVVE9fNSAgICAyOQotI2RlZmluZSBJUlFfQU1JR0FfQVVUT182ICAgIDMwCi0jZGVmaW5lIElSUV9BTUlHQV9BVVRPXzcgICAgMzEKLQotI2RlZmluZSBJUlFfRkxPUFBZCSAgICBJUlFfQU1JR0FfRFNLQkxLCiAKIC8qIElOVFJFUVIgbWFza3MgKi8KLSNkZWZpbmUgSVJRMV9NQVNLICAgMHgwMDA3CS8qIElOVFJFUVIgbWFzayBmb3IgSVJRIDEgKi8KLSNkZWZpbmUgSVJRMl9NQVNLICAgMHgwMDA4CS8qIElOVFJFUVIgbWFzayBmb3IgSVJRIDIgKi8KLSNkZWZpbmUgSVJRM19NQVNLICAgMHgwMDcwCS8qIElOVFJFUVIgbWFzayBmb3IgSVJRIDMgKi8KLSNkZWZpbmUgSVJRNF9NQVNLICAgMHgwNzgwCS8qIElOVFJFUVIgbWFzayBmb3IgSVJRIDQgKi8KLSNkZWZpbmUgSVJRNV9NQVNLICAgMHgxODAwCS8qIElOVFJFUVIgbWFzayBmb3IgSVJRIDUgKi8KLSNkZWZpbmUgSVJRNl9NQVNLICAgMHgyMDAwCS8qIElOVFJFUVIgbWFzayBmb3IgSVJRIDYgKi8KLSNkZWZpbmUgSVJRN19NQVNLICAgMHg0MDAwCS8qIElOVFJFUVIgbWFzayBmb3IgSVJRIDcgKi8KLQogI2RlZmluZSBJRl9TRVRDTFIgICAweDgwMDAgICAgICAvKiBzZXQvY2xyIGJpdCAqLwogI2RlZmluZSBJRl9JTlRFTiAgICAweDQwMDAJLyogbWFzdGVyIGludGVycnVwdCBiaXQgaW4gSU5UKiByZWdpc3RlcnMgKi8KICNkZWZpbmUgSUZfRVhURVIgICAgMHgyMDAwCS8qIGV4dGVybmFsIGxldmVsIDYgYW5kIENJQSBCIGludGVycnVwdCAqLwpAQCAtMTA2LDkgKzg4LDYgQEAKICNkZWZpbmUgSUZfRFNLQkxLICAgMHgwMDAyCS8qIGRpc2tibG9jayBETUEgZmluaXNoZWQgKi8KICNkZWZpbmUgSUZfVEJFCSAgICAweDAwMDEJLyogc2VyaWFsIHRyYW5zbWl0IGJ1ZmZlciBlbXB0eSBpbnRlcnJ1cHQgKi8KIAotZXh0ZXJuIHZvaWQgYW1pZ2FfZG9faXJxKGludCBpcnEsIHN0cnVjdCBwdF9yZWdzICpmcCk7Ci1leHRlcm4gdm9pZCBhbWlnYV9kb19pcnFfbGlzdChpbnQgaXJxLCBzdHJ1Y3QgcHRfcmVncyAqZnApOwotCiAvKiBDSUEgaW50ZXJydXB0IGNvbnRyb2wgcmVnaXN0ZXIgYml0cyAqLwogCiAjZGVmaW5lIENJQV9JQ1JfVEEJMHgwMQpAQCAtMTI1LDYgKzEwNCw3IEBACiAKIGV4dGVybiBzdHJ1Y3QgY2lhYmFzZSBjaWFhX2Jhc2UsIGNpYWJfYmFzZTsKIAorZXh0ZXJuIHZvaWQgY2lhX2luaXRfSVJRKHN0cnVjdCBjaWFiYXNlICpiYXNlKTsKIGV4dGVybiB1bnNpZ25lZCBjaGFyIGNpYV9zZXRfaXJxKHN0cnVjdCBjaWFiYXNlICpiYXNlLCB1bnNpZ25lZCBjaGFyIG1hc2spOwogZXh0ZXJuIHVuc2lnbmVkIGNoYXIgY2lhX2FibGVfaXJxKHN0cnVjdCBjaWFiYXNlICpiYXNlLCB1bnNpZ25lZCBjaGFyIG1hc2spOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrL2Fwb2xsb2h3LmggYi9pbmNsdWRlL2FzbS1tNjhrL2Fwb2xsb2h3LmgKaW5kZXggNDMwNGUxYy4uYTEzNzNiOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4ay9hcG9sbG9ody5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGsvYXBvbGxvaHcuaApAQCAtMyw2ICszLDggQEAKICNpZm5kZWYgX0FTTW02OGtfQVBPTExPSFdfSF8KICNkZWZpbmUgX0FTTW02OGtfQVBPTExPSFdfSF8KIAorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKIC8qCiAgICBhcG9sbG8gbW9kZWxzCiAqLwpAQCAtMTAxLDQgKzEwMyw2IEBACiAKICNkZWZpbmUgaXNhSU8ybWVtKHgpICgoKCgoeCkgJiAweDNmOCkgIDw8IDcpIHwgKCgoeCkgJiAweGZjMDApID4+IDYpIHwgKCh4KSAmIDB4NykpICsgMHg0MDAwMCArIElPX0JBU0UpCiAKKyNkZWZpbmUgSVJRX0FQT0xMTwlJUlFfVVNFUgorCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGsvYXRhcmlfc3RkbWEuaCBiL2luY2x1ZGUvYXNtLW02OGsvYXRhcmlfc3RkbWEuaAppbmRleCA2NGY5Mjg4Li5iNGVhZGY4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrL2F0YXJpX3N0ZG1hLmgKKysrIGIvaW5jbHVkZS9hc20tbTY4ay9hdGFyaV9zdGRtYS5oCkBAIC0zLDcgKzMsNyBAQAogI2RlZmluZSBfYXRhcmlfc3RkbWFfaAogCiAKLSNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFByb3RvdHlwZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrL2F0YXJpaW50cy5oIGIvaW5jbHVkZS9hc20tbTY4ay9hdGFyaWludHMuaAppbmRleCA0Mjk1MmM4Li4wZWQ0NTRmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrL2F0YXJpaW50cy5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGsvYXRhcmlpbnRzLmgKQEAgLTQ1LDE3ICs0NSw2IEBACiAjZGVmaW5lIElSUV9UWVBFX0ZBU1QgICAgIDEKICNkZWZpbmUgSVJRX1RZUEVfUFJJTyAgICAgMgogCi0jZGVmaW5lCUlSUV9TUFVSSU9VUyAgICAgICgwKQotCi0vKiBhdXRvLXZlY3RvciBpbnRlcnJ1cHRzICovCi0jZGVmaW5lIElSUV9BVVRPXzEgICAgICAgICgxKQotI2RlZmluZSBJUlFfQVVUT18yICAgICAgICAoMikKLSNkZWZpbmUgSVJRX0FVVE9fMyAgICAgICAgKDMpCi0jZGVmaW5lIElSUV9BVVRPXzQgICAgICAgICg0KQotI2RlZmluZSBJUlFfQVVUT181ICAgICAgICAoNSkKLSNkZWZpbmUgSVJRX0FVVE9fNiAgICAgICAgKDYpCi0jZGVmaW5lIElSUV9BVVRPXzcgICAgICAgICg3KQotCiAvKiBTVC1NRlAgaW50ZXJydXB0cyAqLwogI2RlZmluZSBJUlFfTUZQX0JVU1kgICAgICAoOCkKICNkZWZpbmUgSVJRX01GUF9EQ0QgICAgICAgKDkpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrL2J2bWU2MDAwaHcuaCBiL2luY2x1ZGUvYXNtLW02OGsvYnZtZTYwMDBody5oCmluZGV4IDI4YTg1OWIuLmY0MGQyZjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW02OGsvYnZtZTYwMDBody5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGsvYnZtZTYwMDBody5oCkBAIC0xMDksMjMgKzEwOSwyMyBAQAogCiAjZGVmaW5lIEJWTUVfSVJRX1RZUEVfUFJJTwkwCiAKLSNkZWZpbmUgQlZNRV9JUlFfUFJOCQkweDU0Ci0jZGVmaW5lIEJWTUVfSVJRX0k1OTYJCTB4MWEKLSNkZWZpbmUgQlZNRV9JUlFfU0NTSQkJMHgxYgotI2RlZmluZSBCVk1FX0lSUV9USU1FUgkJMHg1OQotI2RlZmluZSBCVk1FX0lSUV9SVEMJCTB4MWUKLSNkZWZpbmUgQlZNRV9JUlFfQUJPUlQJCTB4MWYKKyNkZWZpbmUgQlZNRV9JUlFfUFJOCQkoSVJRX1VTRVIrMjApCisjZGVmaW5lIEJWTUVfSVJRX1RJTUVSCQkoSVJRX1VTRVIrMjUpCisjZGVmaW5lIEJWTUVfSVJRX0k1OTYJCUlSUV9BVVRPXzIKKyNkZWZpbmUgQlZNRV9JUlFfU0NTSQkJSVJRX0FVVE9fMworI2RlZmluZSBCVk1FX0lSUV9SVEMJCUlSUV9BVVRPXzYKKyNkZWZpbmUgQlZNRV9JUlFfQUJPUlQJCUlSUV9BVVRPXzcKIAogLyogU0NDIGludGVycnVwdHMgKi8KLSNkZWZpbmUgQlZNRV9JUlFfU0NDX0JBU0UJCTB4NDAKLSNkZWZpbmUgQlZNRV9JUlFfU0NDQl9UWAkJMHg0MAotI2RlZmluZSBCVk1FX0lSUV9TQ0NCX1NUQVQJCTB4NDIKLSNkZWZpbmUgQlZNRV9JUlFfU0NDQl9SWAkJMHg0NAotI2RlZmluZSBCVk1FX0lSUV9TQ0NCX1NQQ09ORAkJMHg0NgotI2RlZmluZSBCVk1FX0lSUV9TQ0NBX1RYCQkweDQ4Ci0jZGVmaW5lIEJWTUVfSVJRX1NDQ0FfU1RBVAkJMHg0YQotI2RlZmluZSBCVk1FX0lSUV9TQ0NBX1JYCQkweDRjCi0jZGVmaW5lIEJWTUVfSVJRX1NDQ0FfU1BDT05ECQkweDRlCisjZGVmaW5lIEJWTUVfSVJRX1NDQ19CQVNFCQlJUlFfVVNFUgorI2RlZmluZSBCVk1FX0lSUV9TQ0NCX1RYCQlJUlFfVVNFUgorI2RlZmluZSBCVk1FX0lSUV9TQ0NCX1NUQVQJCShJUlFfVVNFUisyKQorI2RlZmluZSBCVk1FX0lSUV9TQ0NCX1JYCQkoSVJRX1VTRVIrNCkKKyNkZWZpbmUgQlZNRV9JUlFfU0NDQl9TUENPTkQJCShJUlFfVVNFUis2KQorI2RlZmluZSBCVk1FX0lSUV9TQ0NBX1RYCQkoSVJRX1VTRVIrOCkKKyNkZWZpbmUgQlZNRV9JUlFfU0NDQV9TVEFUCQkoSVJRX1VTRVIrMTApCisjZGVmaW5lIEJWTUVfSVJRX1NDQ0FfUlgJCShJUlFfVVNFUisxMikKKyNkZWZpbmUgQlZNRV9JUlFfU0NDQV9TUENPTkQJCShJUlFfVVNFUisxNCkKIAogLyogQWRkcmVzcyBjb250cm9sIHJlZ2lzdGVycyAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrL2NhY2hlZmx1c2guaCBiL2luY2x1ZGUvYXNtLW02OGsvY2FjaGVmbHVzaC5oCmluZGV4IDhhYmE5NzEuLjI0ZDNmZjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW02OGsvY2FjaGVmbHVzaC5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGsvY2FjaGVmbHVzaC5oCkBAIC0zLDI2ICszLDMwIEBACiAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogCisvKiBjYWNoZSBjb2RlICovCisjZGVmaW5lIEZMVVNIX0lfQU5EX0QJKDB4MDAwMDA4MDgpCisjZGVmaW5lIEZMVVNIX0kJCSgweDAwMDAwMDA4KQorCiAvKgogICogQ2FjaGUgaGFuZGxpbmcgZnVuY3Rpb25zCiAgKi8KIAotI2RlZmluZSBmbHVzaF9pY2FjaGUoKQkJCQkJCVwKLSh7CQkJCQkJCQlcCi0JaWYgKENQVV9JU18wNDBfT1JfMDYwKQkJCQkJXAotCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygibm9wXG5cdCIJCQlcCi0JCQkJICAgICAiLmNoaXAgNjgwNDBcblx0IgkJXAotCQkJCSAgICAgImNpbnZhICUlaWNcblx0IgkJXAotCQkJCSAgICAgIi5jaGlwIDY4ayIgOiApOwkJXAotCWVsc2UgewkJCQkJCQlcCi0JCXVuc2lnbmVkIGxvbmcgX3RtcDsJCQkJXAotCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygibW92ZWMgJSVjYWNyLCUwXG5cdCIJXAotCQkJCSAgICAgIm9ydyAlMSwlMFxuXHQiCQlcCi0JCQkJICAgICAibW92ZWMgJTAsJSVjYWNyIgkJXAotCQkJCSAgICAgOiAiPSZkIiAoX3RtcCkJCVwKLQkJCQkgICAgIDogImlkIiAoRkxVU0hfSSkpOwlcCi0JfQkJCQkJCQlcCi19KQorc3RhdGljIGlubGluZSB2b2lkIGZsdXNoX2ljYWNoZSh2b2lkKQoreworCWlmIChDUFVfSVNfMDQwX09SXzA2MCkKKwkJYXNtIHZvbGF0aWxlICgJIm5vcFxuIgorCQkJIgkuY2hpcAk2ODA0MFxuIgorCQkJIgljcHVzaGEJJWJjXG4iCisJCQkiCS5jaGlwCTY4ayIpOworCWVsc2UgeworCQl1bnNpZ25lZCBsb25nIHRtcDsKKwkJYXNtIHZvbGF0aWxlICgJIm1vdmVjCSUlY2FjciwlMFxuIgorCQkJIglvci53CSUxLCUwXG4iCisJCQkiCW1vdmVjCSUwLCUlY2FjciIKKwkJCTogIj0mZCIgKHRtcCkKKwkJCTogImlkIiAoRkxVU0hfSSkpOworCX0KK30KIAogLyoKICAqIGludmFsaWRhdGUgdGhlIGNhY2hlIGZvciB0aGUgc3BlY2lmaWVkIG1lbW9yeSByYW5nZS4KQEAgLTQzLDEwICs0Nyw2IEBACiAgKi8KIGV4dGVybiB2b2lkIGNhY2hlX3B1c2hfdih1bnNpZ25lZCBsb25nIHZhZGRyLCBpbnQgbGVuKTsKIAotLyogY2FjaGUgY29kZSAqLwotI2RlZmluZSBGTFVTSF9JX0FORF9ECSgweDAwMDAwODA4KQotI2RlZmluZSBGTFVTSF9JCQkoMHgwMDAwMDAwOCkKLQogLyogVGhpcyBpcyBuZWVkZWQgd2hlbmV2ZXIgdGhlIHZpcnR1YWwgbWFwcGluZyBvZiB0aGUgY3VycmVudAogICAgcHJvY2VzcyBjaGFuZ2VzLiAgKi8KICNkZWZpbmUgX19mbHVzaF9jYWNoZV9hbGwoKQkJCQkJXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4ay9kbWEtbWFwcGluZy5oIGIvaW5jbHVkZS9hc20tbTY4ay9kbWEtbWFwcGluZy5oCmluZGV4IGRmZmQ1OWMuLmNlYmJiMDMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW02OGsvZG1hLW1hcHBpbmcuaAorKysgYi9pbmNsdWRlL2FzbS1tNjhrL2RtYS1tYXBwaW5nLmgKQEAgLTEsMTEgKzEsOTEgQEAKICNpZm5kZWYgX002OEtfRE1BX01BUFBJTkdfSAogI2RlZmluZSBfTTY4S19ETUFfTUFQUElOR19ICiAKKyNpbmNsdWRlIDxhc20vY2FjaGUuaD4KIAotI2lmZGVmIENPTkZJR19QQ0kKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9kbWEtbWFwcGluZy5oPgotI2Vsc2UKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9kbWEtbWFwcGluZy1icm9rZW4uaD4KLSNlbmRpZgorc3RydWN0IHNjYXR0ZXJsaXN0OworCitzdGF0aWMgaW5saW5lIGludCBkbWFfc3VwcG9ydGVkKHN0cnVjdCBkZXZpY2UgKmRldiwgdTY0IG1hc2spCit7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRtYV9zZXRfbWFzayhzdHJ1Y3QgZGV2aWNlICpkZXYsIHU2NCBtYXNrKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBkbWFfZ2V0X2NhY2hlX2FsaWdubWVudCh2b2lkKQoreworCXJldHVybiAxIDw8IEwxX0NBQ0hFX1NISUZUOworfQorCitzdGF0aWMgaW5saW5lIGludCBkbWFfaXNfY29uc2lzdGVudChkbWFfYWRkcl90IGRtYV9hZGRyKQoreworCXJldHVybiAwOworfQorCitleHRlcm4gdm9pZCAqZG1hX2FsbG9jX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKiwgc2l6ZV90LAorCQkJCWRtYV9hZGRyX3QgKiwgaW50KTsKK2V4dGVybiB2b2lkIGRtYV9mcmVlX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKiwgc2l6ZV90LAorCQkJICAgICAgdm9pZCAqLCBkbWFfYWRkcl90KTsKKworc3RhdGljIGlubGluZSB2b2lkICpkbWFfYWxsb2Nfbm9uY29oZXJlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwKKwkJCQkJICBkbWFfYWRkcl90ICpoYW5kbGUsIGludCBmbGFnKQoreworCXJldHVybiBkbWFfYWxsb2NfY29oZXJlbnQoZGV2LCBzaXplLCBoYW5kbGUsIGZsYWcpOworfQorc3RhdGljIGlubGluZSB2b2lkIGRtYV9mcmVlX25vbmNvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsCisJCQkJCXZvaWQgKmFkZHIsIGRtYV9hZGRyX3QgaGFuZGxlKQoreworCWRtYV9mcmVlX2NvaGVyZW50KGRldiwgc2l6ZSwgYWRkciwgaGFuZGxlKTsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBkbWFfY2FjaGVfc3luYyh2b2lkICp2YWRkciwgc2l6ZV90IHNpemUsCisJCQkJICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCit7CisJLyogd2UgdXNlIGNvaGVyZW50IGFsbG9jYXRpb24sIHNvIG5vdCBtdWNoIHRvIGRvIGhlcmUuICovCit9CisKK2V4dGVybiBkbWFfYWRkcl90IGRtYV9tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKiwgdm9pZCAqLCBzaXplX3QsCisJCQkJIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBkbWFfdW5tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBhZGRyLAorCQkJCSAgICBzaXplX3Qgc2l6ZSwgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQoreworfQorCitleHRlcm4gZG1hX2FkZHJfdCBkbWFfbWFwX3BhZ2Uoc3RydWN0IGRldmljZSAqLCBzdHJ1Y3QgcGFnZSAqLAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcsIHNpemVfdCBzaXplLAorCQkJICAgICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBkbWFfdW5tYXBfcGFnZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgYWRkcmVzcywKKwkJCQkgIHNpemVfdCBzaXplLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCit7Cit9CisKK2V4dGVybiBpbnQgZG1hX21hcF9zZyhzdHJ1Y3QgZGV2aWNlICosIHN0cnVjdCBzY2F0dGVybGlzdCAqLCBpbnQsCisJCSAgICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBkbWFfdW5tYXBfc2coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAorCQkJCWludCBuaHdlbnRyaWVzLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCit7Cit9CisKK2V4dGVybiB2b2lkIGRtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKiwgZG1hX2FkZHJfdCwgc2l6ZV90LAorCQkJCSAgICAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbik7CitleHRlcm4gdm9pZCBkbWFfc3luY19zZ19mb3JfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKiwgc3RydWN0IHNjYXR0ZXJsaXN0ICosIGludCwKKwkJCQkgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbik7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkbWFfc3luY19zaW5nbGVfZm9yX2NwdShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgaGFuZGxlLAorCQkJCQkgICBzaXplX3Qgc2l6ZSwgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZG1hX3N5bmNfc2dfZm9yX2NwdShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCisJCQkJICAgICAgIGludCBuZW50cywgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQoreworfQorCitzdGF0aWMgaW5saW5lIGludCBkbWFfbWFwcGluZ19lcnJvcihkbWFfYWRkcl90IGhhbmRsZSkKK3sKKwlyZXR1cm4gMDsKK30KIAogI2VuZGlmICAvKiBfTTY4S19ETUFfTUFQUElOR19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrL2lycS5oIGIvaW5jbHVkZS9hc20tbTY4ay9pcnEuaAppbmRleCA5NzI3Y2E5Li5mNGFlN2Q4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrL2lycS5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGsvaXJxLmgKQEAgLTEsMTMgKzEsOSBAQAogI2lmbmRlZiBfTTY4S19JUlFfSF8KICNkZWZpbmUgX002OEtfSVJRX0hfCiAKLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLQotLyoKLSAqICMgb2YgbTY4ayBpbnRlcnJ1cHRzCi0gKi8KLQotI2RlZmluZSBTWVNfSVJRUyA4CisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGxpbnV4L2hhcmRpcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9ja190eXBlcy5oPgogCiAvKgogICogVGhpcyBzaG91bGQgYmUgdGhlIHNhbWUgYXMgdGhlIG1heChOVU1fWF9TT1VSQ0VTKSBmb3IgYWxsIHRoZQpAQCAtMTUsMTAgKzExLDIwIEBACiAgKiBDdXJyZW50bHkgdGhlIEF0YXJpIGhhcyA3MiBhbmQgdGhlIEFtaWdhIDI0LCBidXQgaWYgYm90aCBhcmUKICAqIHN1cHBvcnRlZCBpbiB0aGUga2VybmVsIGl0IGlzIGJldHRlciB0byBtYWtlIHJvb20gZm9yIDcyLgogICovCi0jaWYgZGVmaW5lZChDT05GSUdfQVRBUkkpIHx8IGRlZmluZWQoQ09ORklHX01BQykKLSNkZWZpbmUgTlJfSVJRUyAoNzIrU1lTX0lSUVMpCisjaWYgZGVmaW5lZChDT05GSUdfVk1FKSB8fCBkZWZpbmVkKENPTkZJR19TVU4zKSB8fCBkZWZpbmVkKENPTkZJR19TVU4zWCkKKyNkZWZpbmUgTlJfSVJRUyAyMDAKKyNlbGlmIGRlZmluZWQoQ09ORklHX0FUQVJJKSB8fCBkZWZpbmVkKENPTkZJR19NQUMpCisjZGVmaW5lIE5SX0lSUVMgNzIKKyNlbGlmIGRlZmluZWQoQ09ORklHX1E0MCkKKyNkZWZpbmUgTlJfSVJRUwk0MworI2VsaWYgZGVmaW5lZChDT05GSUdfQU1JR0EpCisjZGVmaW5lIE5SX0lSUVMJMzIKKyNlbGlmIGRlZmluZWQoQ09ORklHX0FQT0xMTykKKyNkZWZpbmUgTlJfSVJRUwkyNAorI2VsaWYgZGVmaW5lZChDT05GSUdfSFAzMDApCisjZGVmaW5lIE5SX0lSUVMJOAogI2Vsc2UKLSNkZWZpbmUgTlJfSVJRUyAoMjQrU1lTX0lSUVMpCisjZXJyb3IgdW5rbm93biBuciBvZiBpcnFzCiAjZW5kaWYKIAogLyoKQEAgLTQwLDUzICs0NiwyNSBAQAogICogdGhhdCByb3V0aW5lIHJlcXVpcmVzIHNlcnZpY2UuCiAgKi8KIAotI2RlZmluZSBJUlExCQkoMSkJLyogbGV2ZWwgMSBpbnRlcnJ1cHQgKi8KLSNkZWZpbmUgSVJRMgkJKDIpCS8qIGxldmVsIDIgaW50ZXJydXB0ICovCi0jZGVmaW5lIElSUTMJCSgzKQkvKiBsZXZlbCAzIGludGVycnVwdCAqLwotI2RlZmluZSBJUlE0CQkoNCkJLyogbGV2ZWwgNCBpbnRlcnJ1cHQgKi8KLSNkZWZpbmUgSVJRNQkJKDUpCS8qIGxldmVsIDUgaW50ZXJydXB0ICovCi0jZGVmaW5lIElSUTYJCSg2KQkvKiBsZXZlbCA2IGludGVycnVwdCAqLwotI2RlZmluZSBJUlE3CQkoNykJLyogbGV2ZWwgNyBpbnRlcnJ1cHQgKG5vbi1tYXNrYWJsZSkgKi8KKyNkZWZpbmUgSVJRX1NQVVJJT1VTCTAKIAotLyoKLSAqICJHZW5lcmljIiBpbnRlcnJ1cHQgc291cmNlcwotICovCisjZGVmaW5lIElSUV9BVVRPXzEJMQkvKiBsZXZlbCAxIGludGVycnVwdCAqLworI2RlZmluZSBJUlFfQVVUT18yCTIJLyogbGV2ZWwgMiBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgSVJRX0FVVE9fMwkzCS8qIGxldmVsIDMgaW50ZXJydXB0ICovCisjZGVmaW5lIElSUV9BVVRPXzQJNAkvKiBsZXZlbCA0IGludGVycnVwdCAqLworI2RlZmluZSBJUlFfQVVUT181CTUJLyogbGV2ZWwgNSBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgSVJRX0FVVE9fNgk2CS8qIGxldmVsIDYgaW50ZXJydXB0ICovCisjZGVmaW5lIElSUV9BVVRPXzcJNwkvKiBsZXZlbCA3IGludGVycnVwdCAobm9uLW1hc2thYmxlKSAqLwogCi0jZGVmaW5lIElSUV9TQ0hFRF9USU1FUgkoOCkgICAgLyogaW50ZXJydXB0IHNvdXJjZSBmb3Igc2NoZWR1bGluZyB0aW1lciAqLworI2RlZmluZSBJUlFfVVNFUgk4CiAKLXN0YXRpYyBfX2lubGluZV9fIGludCBpcnFfY2Fub25pY2FsaXplKGludCBpcnEpCi17Ci0JcmV0dXJuIGlycTsKLX0KLQotLyoKLSAqIE1hY2hpbmUgc3BlY2lmaWMgaW50ZXJydXB0IHNvdXJjZXMuCi0gKgotICogQWRkaW5nIGFuIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgZm9yIGEgc291cmNlIHdpdGggdGhpcyBiaXQKLSAqIHNldCBpbmRpY2F0ZXMgYSBzcGVjaWFsIG1hY2hpbmUgc3BlY2lmaWMgaW50ZXJydXB0IHNvdXJjZS4KLSAqIFRoZSBtYWNoaW5lIHNwZWNpZmljIGZpbGVzIGRlZmluZSB0aGVzZSBzb3VyY2VzLgotICoKLSAqIFRoZSBJUlFfTUFDSFNQRUMgYml0IGlzIG5vdyBnb25lIC0gdGhlIG9ubHkgdGhpbmcgaXQgZGlkIHdhcyB0bwotICogaW50cm9kdWNlIHVubmVjZXNzYXJ5IG92ZXJoZWFkLgotICoKLSAqIEFsbCBpbnRlcnJ1cHQgaGFuZGxpbmcgaXMgYWN0dWFsbHkgbWFjaGluZSBzcGVjaWZpYyBzbyBpdCBpcyBiZXR0ZXIKLSAqIHRvIHVzZSBmdW5jdGlvbiBwb2ludGVycywgYXMgdXNlZCBieSB0aGUgU3BhcmMgcG9ydCwgYW5kIHNlbGVjdCB0aGUKLSAqIGludGVycnVwdCBoYW5kbGluZyBmdW5jdGlvbnMgd2hlbiBpbml0aWFsaXppbmcgdGhlIGtlcm5lbC4gVGhpcyB3YXkKLSAqIHdlIHNhdmUgc29tZSB1bm5lY2Vzc2FyeSBvdmVyaGVhZCBhdCBydW4tdGltZS4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDEvMTEvOTcgLSBKZXMKLSAqLwotCi1leHRlcm4gdm9pZCAoKmVuYWJsZV9pcnEpKHVuc2lnbmVkIGludCk7Ci1leHRlcm4gdm9pZCAoKmRpc2FibGVfaXJxKSh1bnNpZ25lZCBpbnQpOworZXh0ZXJuIHVuc2lnbmVkIGludCBpcnFfY2Fub25pY2FsaXplKHVuc2lnbmVkIGludCBpcnEpOworZXh0ZXJuIHZvaWQgZW5hYmxlX2lycSh1bnNpZ25lZCBpbnQpOworZXh0ZXJuIHZvaWQgZGlzYWJsZV9pcnEodW5zaWduZWQgaW50KTsKICNkZWZpbmUgZGlzYWJsZV9pcnFfbm9zeW5jCWRpc2FibGVfaXJxCiAKIHN0cnVjdCBwdF9yZWdzOwogCi1leHRlcm4gaW50IGNwdV9yZXF1ZXN0X2lycSh1bnNpZ25lZCBpbnQsCi0JCQkgICBpcnFyZXR1cm5fdCAoKikoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopLAotCQkJICAgdW5zaWduZWQgbG9uZywgY29uc3QgY2hhciAqLCB2b2lkICopOwotZXh0ZXJuIHZvaWQgY3B1X2ZyZWVfaXJxKHVuc2lnbmVkIGludCwgdm9pZCAqKTsKLQogLyoKICAqIHZhcmlvdXMgZmxhZ3MgZm9yIHJlcXVlc3RfaXJxKCkgLSB0aGUgQW1pZ2Egbm93IHVzZXMgdGhlIHN0YW5kYXJkCiAgKiBtZWNoYW5pc20gbGlrZSBhbGwgb3RoZXIgYXJjaGl0ZWN0dXJlcyAtIFNBX0lOVEVSUlVQVCBhbmQgU0FfU0hJUlEKQEAgLTEwNSwyOSArODMsNDUgQEAKICAqIGludGVycnVwdCBzb3VyY2UgKGlmIGl0IHN1cHBvcnRzIGNoYWluaW5nKS4KICAqLwogdHlwZWRlZiBzdHJ1Y3QgaXJxX25vZGUgewotCWlycXJldHVybl90CSgqaGFuZGxlcikoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopOwotCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisJaW50CQkoKmhhbmRsZXIpKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKTsKIAl2b2lkCQkqZGV2X2lkOwotCWNvbnN0IGNoYXIJKmRldm5hbWU7CiAJc3RydWN0IGlycV9ub2RlICpuZXh0OworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisJY29uc3QgY2hhcgkqZGV2bmFtZTsKIH0gaXJxX25vZGVfdDsKIAogLyoKICAqIFRoaXMgc3RydWN0dXJlIGhhcyBvbmx5IDQgZWxlbWVudHMgZm9yIHNwZWVkIHJlYXNvbnMKICAqLwogdHlwZWRlZiBzdHJ1Y3QgaXJxX2hhbmRsZXIgewotCWlycXJldHVybl90CSgqaGFuZGxlcikoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopOworCWludAkJKCpoYW5kbGVyKShpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik7CiAJdW5zaWduZWQgbG9uZwlmbGFnczsKIAl2b2lkCQkqZGV2X2lkOwogCWNvbnN0IGNoYXIJKmRldm5hbWU7CiB9IGlycV9oYW5kbGVyX3Q7CiAKLS8qIGNvdW50IG9mIHNwdXJpb3VzIGludGVycnVwdHMgKi8KLWV4dGVybiB2b2xhdGlsZSB1bnNpZ25lZCBpbnQgbnVtX3NwdXJpb3VzOworc3RydWN0IGlycV9jb250cm9sbGVyIHsKKwljb25zdCBjaGFyICpuYW1lOworCXNwaW5sb2NrX3QgbG9jazsKKwlpbnQgKCpzdGFydHVwKSh1bnNpZ25lZCBpbnQgaXJxKTsKKwl2b2lkICgqc2h1dGRvd24pKHVuc2lnbmVkIGludCBpcnEpOworCXZvaWQgKCplbmFibGUpKHVuc2lnbmVkIGludCBpcnEpOworCXZvaWQgKCpkaXNhYmxlKSh1bnNpZ25lZCBpbnQgaXJxKTsKK307CisKK2V4dGVybiBpbnQgbTY4a19pcnFfc3RhcnR1cCh1bnNpZ25lZCBpbnQpOworZXh0ZXJuIHZvaWQgbTY4a19pcnFfc2h1dGRvd24odW5zaWduZWQgaW50KTsKIAogLyoKICAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIG5ldyBpcnFfbm9kZV90CiAgKi8KIGV4dGVybiBpcnFfbm9kZV90ICpuZXdfaXJxX25vZGUodm9pZCk7CiAKK2V4dGVybiB2b2lkIG02OGtfc2V0dXBfYXV0b19pbnRlcnJ1cHQodm9pZCAoKmhhbmRsZXIpKHVuc2lnbmVkIGludCwgc3RydWN0IHB0X3JlZ3MgKikpOworZXh0ZXJuIHZvaWQgbTY4a19zZXR1cF91c2VyX2ludGVycnVwdCh1bnNpZ25lZCBpbnQgdmVjLCB1bnNpZ25lZCBpbnQgY250LAorCQkJCSAgICAgIHZvaWQgKCpoYW5kbGVyKSh1bnNpZ25lZCBpbnQsIHN0cnVjdCBwdF9yZWdzICopKTsKK2V4dGVybiB2b2lkIG02OGtfc2V0dXBfaXJxX2NvbnRyb2xsZXIoc3RydWN0IGlycV9jb250cm9sbGVyICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50KTsKKworYXNtbGlua2FnZSB2b2lkIG02OGtfaGFuZGxlX2ludCh1bnNpZ25lZCBpbnQsIHN0cnVjdCBwdF9yZWdzICopOworCiAjZW5kaWYgLyogX002OEtfSVJRX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrL21hY19vc3MuaCBiL2luY2x1ZGUvYXNtLW02OGsvbWFjX29zcy5oCmluZGV4IDc2NDRhNjMuLjcyMjFmNzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW02OGsvbWFjX29zcy5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGsvbWFjX29zcy5oCkBAIC02OSwxMiArNjksMTIgQEAKIAogI2RlZmluZSBPU1NfSVJRTEVWX0RJU0FCTEVECTAKICNkZWZpbmUgT1NTX0lSUUxFVl9JT1BJU00JMQkvKiBBREI/ICovCi0jZGVmaW5lIE9TU19JUlFMRVZfU0NTSQkJMgotI2RlZmluZSBPU1NfSVJRTEVWX05VQlVTCTMJLyoga2VlcCB0aGlzIG9uIGl0cyBvd24gbGV2ZWwgKi8KLSNkZWZpbmUgT1NTX0lSUUxFVl9JT1BTQ0MJNAkvKiBtYXRjaGVzIFZJQSBhbHRlcm5hdGUgbWFwcGluZyAqLwotI2RlZmluZSBPU1NfSVJRTEVWX1NPVU5ECTUJLyogbWF0Y2hlcyBWSUEgYWx0ZXJuYXRlIG1hcHBpbmcgKi8KKyNkZWZpbmUgT1NTX0lSUUxFVl9TQ1NJCQlJUlFfQVVUT18yCisjZGVmaW5lIE9TU19JUlFMRVZfTlVCVVMJSVJRX0FVVE9fMwkvKiBrZWVwIHRoaXMgb24gaXRzIG93biBsZXZlbCAqLworI2RlZmluZSBPU1NfSVJRTEVWX0lPUFNDQwlJUlFfQVVUT180CS8qIG1hdGNoZXMgVklBIGFsdGVybmF0ZSBtYXBwaW5nICovCisjZGVmaW5lIE9TU19JUlFMRVZfU09VTkQJSVJRX0FVVE9fNQkvKiBtYXRjaGVzIFZJQSBhbHRlcm5hdGUgbWFwcGluZyAqLwogI2RlZmluZSBPU1NfSVJRTEVWXzYwSFoJCTYJLyogbWF0Y2hlcyBWSUEgYWx0ZXJuYXRlIG1hcHBpbmcgKi8KLSNkZWZpbmUgT1NTX0lSUUxFVl9WSUExCQk2CS8qIG1hdGNoZXMgVklBIGFsdGVybmF0ZSBtYXBwaW5nICovCisjZGVmaW5lIE9TU19JUlFMRVZfVklBMQkJSVJRX0FVVE9fNgkvKiBtYXRjaGVzIFZJQSBhbHRlcm5hdGUgbWFwcGluZyAqLwogI2RlZmluZSBPU1NfSVJRTEVWX1BBUklUWQk3CS8qIG1hdGNoZXMgVklBIGFsdGVybmF0ZSBtYXBwaW5nICovCiAKICNpZm5kZWYgX19BU1NFTUJMWV9fCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrL21hY2hkZXAuaCBiL2luY2x1ZGUvYXNtLW02OGsvbWFjaGRlcC5oCmluZGV4IDdkM2ZlZTMuLmRmODk4ZjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW02OGsvbWFjaGRlcC5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGsvbWFjaGRlcC5oCkBAIC0xMywxNCArMTMsOCBAQAogZXh0ZXJuIHZvaWQgKCptYWNoX3NjaGVkX2luaXQpIChpcnFyZXR1cm5fdCAoKmhhbmRsZXIpKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKSk7CiAvKiBtYWNoaW5lIGRlcGVuZGVudCBpcnEgZnVuY3Rpb25zICovCiBleHRlcm4gdm9pZCAoKm1hY2hfaW5pdF9JUlEpICh2b2lkKTsKLWV4dGVybiBpcnFyZXR1cm5fdCAoKigqbWFjaF9kZWZhdWx0X2hhbmRsZXIpW10pIChpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik7Ci1leHRlcm4gaW50ICgqbWFjaF9yZXF1ZXN0X2lycSkgKHVuc2lnbmVkIGludCBpcnEsIGlycXJldHVybl90ICgqaGFuZGxlcikoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzLCBjb25zdCBjaGFyICpkZXZuYW1lLCB2b2lkICpkZXZfaWQpOwotZXh0ZXJuIHZvaWQgKCptYWNoX2ZyZWVfaXJxKSAodW5zaWduZWQgaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKIGV4dGVybiB2b2lkICgqbWFjaF9nZXRfbW9kZWwpIChjaGFyICptb2RlbCk7CiBleHRlcm4gaW50ICgqbWFjaF9nZXRfaGFyZHdhcmVfbGlzdCkgKGNoYXIgKmJ1ZmZlcik7Ci1leHRlcm4gaW50ICgqbWFjaF9nZXRfaXJxX2xpc3QpIChzdHJ1Y3Qgc2VxX2ZpbGUgKnAsIHZvaWQgKnYpOwotZXh0ZXJuIGlycXJldHVybl90ICgqbWFjaF9wcm9jZXNzX2ludCkgKGludCBpcnEsIHN0cnVjdCBwdF9yZWdzICpmcCk7CiAvKiBtYWNoaW5lIGRlcGVuZGVudCB0aW1lciBmdW5jdGlvbnMgKi8KIGV4dGVybiB1bnNpZ25lZCBsb25nICgqbWFjaF9nZXR0aW1lb2Zmc2V0KSh2b2lkKTsKIGV4dGVybiBpbnQgKCptYWNoX2h3Y2xrKShpbnQsIHN0cnVjdCBydGNfdGltZSopOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4ay9tYWNpbnRvc2guaCBiL2luY2x1ZGUvYXNtLW02OGsvbWFjaW50b3NoLmgKaW5kZXggNmZjM2QxOS4uMjdkMTFkYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4ay9tYWNpbnRvc2guaAorKysgYi9pbmNsdWRlL2FzbS1tNjhrL21hY2ludG9zaC5oCkBAIC0xMSwxNyArMTEsNyBAQAogZXh0ZXJuIHZvaWQgbWFjX3Jlc2V0KHZvaWQpOwogZXh0ZXJuIHZvaWQgbWFjX3Bvd2Vyb2ZmKHZvaWQpOwogZXh0ZXJuIHZvaWQgbWFjX2luaXRfSVJRKHZvaWQpOwotZXh0ZXJuIGludCBtYWNfcmVxdWVzdF9pcnEgKHVuc2lnbmVkIGludCwgaXJxcmV0dXJuX3QgKCopKGludCwgdm9pZCAqLAotCQkJCXN0cnVjdCBwdF9yZWdzICopLAotCQkJCXVuc2lnbmVkIGxvbmcsIGNvbnN0IGNoYXIgKiwgdm9pZCAqKTsKLWV4dGVybiB2b2lkIG1hY19mcmVlX2lycSh1bnNpZ25lZCBpbnQsIHZvaWQgKik7Ci1leHRlcm4gdm9pZCBtYWNfZW5hYmxlX2lycSh1bnNpZ25lZCBpbnQpOwotZXh0ZXJuIHZvaWQgbWFjX2Rpc2FibGVfaXJxKHVuc2lnbmVkIGludCk7CiBleHRlcm4gaW50IG1hY19pcnFfcGVuZGluZyh1bnNpZ25lZCBpbnQpOwotZXh0ZXJuIGludCBzaG93X21hY19pbnRlcnJ1cHRzKHN0cnVjdCBzZXFfZmlsZSAqLCB2b2lkICopOwotI2lmIDAKLWV4dGVybiB2b2lkIG1hY19kZWZhdWx0X2hhbmRsZXIoaW50IGlycSk7Ci0jZW5kaWYKIGV4dGVybiB2b2lkIG1hY19pZGVudGlmeSh2b2lkKTsKIGV4dGVybiB2b2lkIG1hY19yZXBvcnRfaGFyZHdhcmUodm9pZCk7CiBleHRlcm4gdm9pZCBtYWNfZGVidWdnaW5nX3Blbmd1aW4oaW50KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGsvbWFjaW50cy5oIGIvaW5jbHVkZS9hc20tbTY4ay9tYWNpbnRzLmgKaW5kZXggZmQ4YzNhOS4uNjc5YzQ4YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4ay9tYWNpbnRzLmgKKysrIGIvaW5jbHVkZS9hc20tbTY4ay9tYWNpbnRzLmgKQEAgLTU5LDE3ICs1OSw2IEBACiAjZGVmaW5lIElSUV9TUkMoaXJxKQkoaXJxID4+IDMpCiAjZGVmaW5lCUlSUV9JRFgoaXJxKQkoaXJxICYgNykKIAotI2RlZmluZQlJUlFfU1BVUklPVVMgICAgICAoMCkKLQotLyogYXV0by12ZWN0b3IgaW50ZXJydXB0cyAqLwotI2RlZmluZSBJUlFfQVVUT18xICAgICAgICAoMSkKLSNkZWZpbmUgSVJRX0FVVE9fMiAgICAgICAgKDIpCi0jZGVmaW5lIElSUV9BVVRPXzMgICAgICAgICgzKQotI2RlZmluZSBJUlFfQVVUT180ICAgICAgICAoNCkKLSNkZWZpbmUgSVJRX0FVVE9fNSAgICAgICAgKDUpCi0jZGVmaW5lIElSUV9BVVRPXzYgICAgICAgICg2KQotI2RlZmluZSBJUlFfQVVUT183ICAgICAgICAoNykKLQogLyogVklBMSBpbnRlcnJ1cHRzICovCiAjZGVmaW5lIElSUV9WSUExXzAJICAoOCkJCS8qIG9uZSBzZWNvbmQgaW50LiAqLwogI2RlZmluZSBJUlFfVklBMV8xICAgICAgICAoOSkJCS8qIFZCbGFuayBpbnQuICovCkBAIC0xNjMsNyArMTUyLDQgQEAKICNkZWZpbmUgSU5UX0NMSyAgIDI0NTc2CSAgICAvKiBDTEsgd2hpbGUgaW50X2NsayA9Mi40NTZNSHogYW5kIGRpdmlkZSA9IDEwMCAqLwogI2RlZmluZSBJTlRfVElDS1MgMjQ2CSAgICAvKiB0byBtYWtlIHNjaGVkX3RpbWUgPSA5OS45MDIuLi4gSFogKi8KIAotZXh0ZXJuIGlycV9ub2RlX3QgKm1hY19pcnFfbGlzdFtOVU1fTUFDX1NPVVJDRVNdOwotZXh0ZXJuIHZvaWQgbWFjX2RvX2lycV9saXN0KGludCBpcnEsIHN0cnVjdCBwdF9yZWdzICopOwotCiAjZW5kaWYgLyogYXNtL21hY2ludHMuaCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4ay9tdm1lMTQ3aHcuaCBiL2luY2x1ZGUvYXNtLW02OGsvbXZtZTE0N2h3LmgKaW5kZXggZjI0NTEzOS4uYjgxMDQzMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4ay9tdm1lMTQ3aHcuaAorKysgYi9pbmNsdWRlL2FzbS1tNjhrL212bWUxNDdody5oCkBAIC0xLDYgKzEsOCBAQAogI2lmbmRlZiBfTVZNRTE0N0hXX0hfCiAjZGVmaW5lIF9NVk1FMTQ3SFdfSF8KIAorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKwogdHlwZWRlZiBzdHJ1Y3QgewogCXVuc2lnbmVkIGNoYXIKIAkJY3RybCwKQEAgLTcyLDM5ICs3NCwzOSBAQAogI2RlZmluZSBQQ0NfTEVWRUxfU0NTSV9QT1JUCTB4MDQKICNkZWZpbmUgUENDX0xFVkVMX1NDU0lfRE1BCTB4MDQKIAotI2RlZmluZSBQQ0NfSVJRX0FDX0ZBSUwJCTB4NDAKLSNkZWZpbmUgUENDX0lSUV9CRVJSCQkweDQxCi0jZGVmaW5lIFBDQ19JUlFfQUJPUlQJCTB4NDIKLS8qICNkZWZpbmUgUENDX0lSUV9TRVJJQUwJMHg0MyAqLwotI2RlZmluZSBQQ0NfSVJRX1BSSU5URVIJCTB4NDcKLSNkZWZpbmUgUENDX0lSUV9USU1FUjEJCTB4NDgKLSNkZWZpbmUgUENDX0lSUV9USU1FUjIJCTB4NDkKLSNkZWZpbmUgUENDX0lSUV9TT0ZUV0FSRTEJMHg0YQotI2RlZmluZSBQQ0NfSVJRX1NPRlRXQVJFMgkweDRiCisjZGVmaW5lIFBDQ19JUlFfQUNfRkFJTAkJKElSUV9VU0VSKzApCisjZGVmaW5lIFBDQ19JUlFfQkVSUgkJKElSUV9VU0VSKzEpCisjZGVmaW5lIFBDQ19JUlFfQUJPUlQJCShJUlFfVVNFUisyKQorLyogI2RlZmluZSBQQ0NfSVJRX1NFUklBTAkoSVJRX1VTRVIrMykgKi8KKyNkZWZpbmUgUENDX0lSUV9QUklOVEVSCQkoSVJRX1VTRVIrNykKKyNkZWZpbmUgUENDX0lSUV9USU1FUjEJCShJUlFfVVNFUis4KQorI2RlZmluZSBQQ0NfSVJRX1RJTUVSMgkJKElSUV9VU0VSKzkpCisjZGVmaW5lIFBDQ19JUlFfU09GVFdBUkUxCShJUlFfVVNFUisxMCkKKyNkZWZpbmUgUENDX0lSUV9TT0ZUV0FSRTIJKElSUV9VU0VSKzExKQogCiAKICNkZWZpbmUgTTE0N19TQ0NfQV9BRERSCQkweGZmZmUzMDAyCiAjZGVmaW5lIE0xNDdfU0NDX0JfQUREUgkJMHhmZmZlMzAwMAogI2RlZmluZSBNMTQ3X1NDQ19QQ0xLCQk1MDAwMDAwCiAKLSNkZWZpbmUgTVZNRTE0N19JUlFfU0NTSV9QT1JUCTB4NDUKLSNkZWZpbmUgTVZNRTE0N19JUlFfU0NTSV9ETUEJMHg0NgorI2RlZmluZSBNVk1FMTQ3X0lSUV9TQ1NJX1BPUlQJKElSUV9VU0VSKzB4NDUpCisjZGVmaW5lIE1WTUUxNDdfSVJRX1NDU0lfRE1BCShJUlFfVVNFUisweDQ2KQogCiAvKiBTQ0MgaW50ZXJydXB0cywgZm9yIE1WTUUxNDcgKi8KIAogI2RlZmluZSBNVk1FMTQ3X0lSUV9UWVBFX1BSSU8JMAotI2RlZmluZSBNVk1FMTQ3X0lSUV9TQ0NfQkFTRQkJMHg2MAotI2RlZmluZSBNVk1FMTQ3X0lSUV9TQ0NCX1RYCQkweDYwCi0jZGVmaW5lIE1WTUUxNDdfSVJRX1NDQ0JfU1RBVAkJMHg2MgotI2RlZmluZSBNVk1FMTQ3X0lSUV9TQ0NCX1JYCQkweDY0Ci0jZGVmaW5lIE1WTUUxNDdfSVJRX1NDQ0JfU1BDT05ECQkweDY2Ci0jZGVmaW5lIE1WTUUxNDdfSVJRX1NDQ0FfVFgJCTB4NjgKLSNkZWZpbmUgTVZNRTE0N19JUlFfU0NDQV9TVEFUCQkweDZhCi0jZGVmaW5lIE1WTUUxNDdfSVJRX1NDQ0FfUlgJCTB4NmMKLSNkZWZpbmUgTVZNRTE0N19JUlFfU0NDQV9TUENPTkQJCTB4NmUKKyNkZWZpbmUgTVZNRTE0N19JUlFfU0NDX0JBU0UJCShJUlFfVVNFUiszMikKKyNkZWZpbmUgTVZNRTE0N19JUlFfU0NDQl9UWAkJKElSUV9VU0VSKzMyKQorI2RlZmluZSBNVk1FMTQ3X0lSUV9TQ0NCX1NUQVQJCShJUlFfVVNFUiszNCkKKyNkZWZpbmUgTVZNRTE0N19JUlFfU0NDQl9SWAkJKElSUV9VU0VSKzM2KQorI2RlZmluZSBNVk1FMTQ3X0lSUV9TQ0NCX1NQQ09ORAkJKElSUV9VU0VSKzM4KQorI2RlZmluZSBNVk1FMTQ3X0lSUV9TQ0NBX1RYCQkoSVJRX1VTRVIrNDApCisjZGVmaW5lIE1WTUUxNDdfSVJRX1NDQ0FfU1RBVAkJKElSUV9VU0VSKzQyKQorI2RlZmluZSBNVk1FMTQ3X0lSUV9TQ0NBX1JYCQkoSVJRX1VTRVIrNDQpCisjZGVmaW5lIE1WTUUxNDdfSVJRX1NDQ0FfU1BDT05ECQkoSVJRX1VTRVIrNDYpCiAKICNkZWZpbmUgTVZNRTE0N19MQU5DRV9CQVNFCTB4ZmZmZTE4MDAKLSNkZWZpbmUgTVZNRTE0N19MQU5DRV9JUlEJMHg0NAorI2RlZmluZSBNVk1FMTQ3X0xBTkNFX0lSUQkoSVJRX1VTRVIrNCkKIAogI2RlZmluZSBFVEhFUk5FVF9BRERSRVNTIDB4ZmZmZTA3NzgKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4ay9tdm1lMTZ4aHcuaCBiL2luY2x1ZGUvYXNtLW02OGsvbXZtZTE2eGh3LmgKaW5kZXggNWQwNzIzMS4uNjExN2Y1NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4ay9tdm1lMTZ4aHcuaAorKysgYi9pbmNsdWRlL2FzbS1tNjhrL212bWUxNnhody5oCkBAIC02NiwyOCArNjYsMjggQEAKIAogI2RlZmluZSBNVk1FMTYyX0lSUV9UWVBFX1BSSU8JMAogCi0jZGVmaW5lIE1WTUUxNjdfSVJRX1BSTgkJMHg1NAotI2RlZmluZSBNVk1FMTZ4X0lSUV9JNTk2CTB4NTcKLSNkZWZpbmUgTVZNRTE2eF9JUlFfU0NTSQkweDU1Ci0jZGVmaW5lIE1WTUUxNnhfSVJRX0ZMWQkJMHg3ZgotI2RlZmluZSBNVk1FMTY3X0lSUV9TRVJfRVJSCTB4NWMKLSNkZWZpbmUgTVZNRTE2N19JUlFfU0VSX01PREVNCTB4NWQKLSNkZWZpbmUgTVZNRTE2N19JUlFfU0VSX1RYCTB4NWUKLSNkZWZpbmUgTVZNRTE2N19JUlFfU0VSX1JYCTB4NWYKLSNkZWZpbmUgTVZNRTE2eF9JUlFfVElNRVIJMHg1OQotI2RlZmluZSBNVk1FMTY3X0lSUV9BQk9SVAkweDZlCi0jZGVmaW5lIE1WTUUxNjJfSVJRX0FCT1JUCTB4NWUKKyNkZWZpbmUgTVZNRTE2N19JUlFfUFJOCQkoSVJRX1VTRVIrMjApCisjZGVmaW5lIE1WTUUxNnhfSVJRX0k1OTYJKElSUV9VU0VSKzIzKQorI2RlZmluZSBNVk1FMTZ4X0lSUV9TQ1NJCShJUlFfVVNFUisyMSkKKyNkZWZpbmUgTVZNRTE2eF9JUlFfRkxZCQkoSVJRX1VTRVIrNjMpCisjZGVmaW5lIE1WTUUxNjdfSVJRX1NFUl9FUlIJKElSUV9VU0VSKzI4KQorI2RlZmluZSBNVk1FMTY3X0lSUV9TRVJfTU9ERU0JKElSUV9VU0VSKzI5KQorI2RlZmluZSBNVk1FMTY3X0lSUV9TRVJfVFgJKElSUV9VU0VSKzMwKQorI2RlZmluZSBNVk1FMTY3X0lSUV9TRVJfUlgJKElSUV9VU0VSKzMxKQorI2RlZmluZSBNVk1FMTZ4X0lSUV9USU1FUgkoSVJRX1VTRVIrMjUpCisjZGVmaW5lIE1WTUUxNjdfSVJRX0FCT1JUCShJUlFfVVNFUis0NikKKyNkZWZpbmUgTVZNRTE2Ml9JUlFfQUJPUlQJKElSUV9VU0VSKzMwKQogCiAvKiBTQ0MgaW50ZXJydXB0cywgZm9yIE1WTUUxNjIgKi8KLSNkZWZpbmUgTVZNRTE2Ml9JUlFfU0NDX0JBU0UJCTB4NDAKLSNkZWZpbmUgTVZNRTE2Ml9JUlFfU0NDQl9UWAkJMHg0MAotI2RlZmluZSBNVk1FMTYyX0lSUV9TQ0NCX1NUQVQJCTB4NDIKLSNkZWZpbmUgTVZNRTE2Ml9JUlFfU0NDQl9SWAkJMHg0NAotI2RlZmluZSBNVk1FMTYyX0lSUV9TQ0NCX1NQQ09ORAkJMHg0NgotI2RlZmluZSBNVk1FMTYyX0lSUV9TQ0NBX1RYCQkweDQ4Ci0jZGVmaW5lIE1WTUUxNjJfSVJRX1NDQ0FfU1RBVAkJMHg0YQotI2RlZmluZSBNVk1FMTYyX0lSUV9TQ0NBX1JYCQkweDRjCi0jZGVmaW5lIE1WTUUxNjJfSVJRX1NDQ0FfU1BDT05ECQkweDRlCisjZGVmaW5lIE1WTUUxNjJfSVJRX1NDQ19CQVNFCQkoSVJRX1VTRVIrMCkKKyNkZWZpbmUgTVZNRTE2Ml9JUlFfU0NDQl9UWAkJKElSUV9VU0VSKzApCisjZGVmaW5lIE1WTUUxNjJfSVJRX1NDQ0JfU1RBVAkJKElSUV9VU0VSKzIpCisjZGVmaW5lIE1WTUUxNjJfSVJRX1NDQ0JfUlgJCShJUlFfVVNFUis0KQorI2RlZmluZSBNVk1FMTYyX0lSUV9TQ0NCX1NQQ09ORAkJKElSUV9VU0VSKzYpCisjZGVmaW5lIE1WTUUxNjJfSVJRX1NDQ0FfVFgJCShJUlFfVVNFUis4KQorI2RlZmluZSBNVk1FMTYyX0lSUV9TQ0NBX1NUQVQJCShJUlFfVVNFUisxMCkKKyNkZWZpbmUgTVZNRTE2Ml9JUlFfU0NDQV9SWAkJKElSUV9VU0VSKzEyKQorI2RlZmluZSBNVk1FMTYyX0lSUV9TQ0NBX1NQQ09ORAkJKElSUV9VU0VSKzE0KQogCiAvKiBNVk1FMTYyIHZlcnNpb24gcmVnaXN0ZXIgKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4ay9zY2F0dGVybGlzdC5oIGIvaW5jbHVkZS9hc20tbTY4ay9zY2F0dGVybGlzdC5oCmluZGV4IGQ3YzliNWMuLjhlNjEyMjYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW02OGsvc2NhdHRlcmxpc3QuaAorKysgYi9pbmNsdWRlL2FzbS1tNjhrL3NjYXR0ZXJsaXN0LmgKQEAgLTIsMTggKzIsMTcgQEAKICNkZWZpbmUgX002OEtfU0NBVFRFUkxJU1RfSAogCiBzdHJ1Y3Qgc2NhdHRlcmxpc3QgewotCS8qIFRoZXNlIHR3byBhcmUgb25seSB2YWxpZCBpZiBBRERSRVNTIG1lbWJlciBvZiB0aGlzCi0JICogc3RydWN0IGlzIE5VTEwuCi0JICovCiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAJdW5zaWduZWQgaW50IG9mZnNldDsKLQogCXVuc2lnbmVkIGludCBsZW5ndGg7CiAKLQlfX3UzMiBkdm1hX2FkZHJlc3M7IC8qIEEgcGxhY2UgdG8gaGFuZyBob3N0LXNwZWNpZmljIGFkZHJlc3NlcyBhdC4gKi8KKwlfX3UzMiBkbWFfYWRkcmVzczsJLyogQSBwbGFjZSB0byBoYW5nIGhvc3Qtc3BlY2lmaWMgYWRkcmVzc2VzIGF0LiAqLwogfTsKIAogLyogVGhpcyBpcyBib2d1cyBhbmQgc2hvdWxkIGdvIGF3YXkuICovCiAjZGVmaW5lIElTQV9ETUFfVEhSRVNIT0xEICgweDAwZmZmZmZmKQogCisjZGVmaW5lIHNnX2RtYV9hZGRyZXNzKHNnKQkoKHNnKS0+ZG1hX2FkZHJlc3MpCisjZGVmaW5lIHNnX2RtYV9sZW4oc2cpCQkoKHNnKS0+bGVuZ3RoKQorCiAjZW5kaWYgLyogIShfTTY4S19TQ0FUVEVSTElTVF9IKSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4ay9zaWduYWwuaCBiL2luY2x1ZGUvYXNtLW02OGsvc2lnbmFsLmgKaW5kZXggYjdiN2VhMi4uODUwMzdhMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4ay9zaWduYWwuaAorKysgYi9pbmNsdWRlL2FzbS1tNjhrL3NpZ25hbC5oCkBAIC0xNTYsMTMgKzE1NiwxNyBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgc2lnYWRkc2V0KHNpZ3NldF90ICpzZXQsIGludCBfc2lnKQogewotCV9fYXNtX18oImJmc2V0ICUweyUxLCMxfSIgOiAiPW0iICgqc2V0KSA6ICJpZCIgKChfc2lnIC0gMSkgXiAzMSkKKwlhc20gKCJiZnNldCAlMHslMSwjMX0iCisJCTogIitvZCIgKCpzZXQpCisJCTogImlkIiAoKF9zaWcgLSAxKSBeIDMxKQogCQk6ICJjYyIpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgc2lnZGVsc2V0KHNpZ3NldF90ICpzZXQsIGludCBfc2lnKQogewotCV9fYXNtX18oImJmY2xyICUweyUxLCMxfSIgOiAiPW0iKCpzZXQpIDogImlkIigoX3NpZyAtIDEpIF4gMzEpCisJYXNtICgiYmZjbHIgJTB7JTEsIzF9IgorCQk6ICIrb2QiICgqc2V0KQorCQk6ICJpZCIgKChfc2lnIC0gMSkgXiAzMSkKIAkJOiAiY2MiKTsKIH0KIApAQCAtMTc1LDggKzE3OSwxMCBAQAogc3RhdGljIGlubGluZSBpbnQgX19nZW5fc2lnaXNtZW1iZXIoc2lnc2V0X3QgKnNldCwgaW50IF9zaWcpCiB7CiAJaW50IHJldDsKLQlfX2FzbV9fKCJiZmV4dHUgJTF7JTIsIzF9LCUwIgotCQk6ICI9ZCIocmV0KSA6ICJtIigqc2V0KSwgImlkIigoX3NpZy0xKSBeIDMxKSk7CisJYXNtICgiYmZleHR1ICUxeyUyLCMxfSwlMCIKKwkJOiAiPWQiIChyZXQpCisJCTogIm9kIiAoKnNldCksICJpZCIgKChfc2lnLTEpIF4gMzEpCisJCTogImNjIik7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTg3LDcgKzE5MywxMCBAQAogCiBzdGF0aWMgaW5saW5lIGludCBzaWdmaW5kaW53b3JkKHVuc2lnbmVkIGxvbmcgd29yZCkKIHsKLQlfX2FzbV9fKCJiZmZmbyAlMXsjMCwjMH0sJTAiIDogIj1kIih3b3JkKSA6ICJkIih3b3JkICYgLXdvcmQpIDogImNjIik7CisJYXNtICgiYmZmZm8gJTF7IzAsIzB9LCUwIgorCQk6ICI9ZCIgKHdvcmQpCisJCTogImQiICh3b3JkICYgLXdvcmQpCisJCTogImNjIik7CiAJcmV0dXJuIHdvcmQgXiAzMTsKIH0KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4ay9zdW4zaW50cy5oIGIvaW5jbHVkZS9hc20tbTY4ay9zdW4zaW50cy5oCmluZGV4IGJkMDM4ZmMuLmRlOTFmYTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW02OGsvc3VuM2ludHMuaAorKysgYi9pbmNsdWRlL2FzbS1tNjhrL3N1bjNpbnRzLmgKQEAgLTEyLDM3ICsxMiwyNSBAQAogI2RlZmluZSBTVU4zSU5UU19ICiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsX3N0YXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgotI2luY2x1ZGUgPGFzbS9zZWdtZW50Lmg+CiAjaW5jbHVkZSA8YXNtL2ludGVyc2lsLmg+CiAjaW5jbHVkZSA8YXNtL29wbGliLmg+CisjaW5jbHVkZSA8YXNtL3RyYXBzLmg+CiAKICNkZWZpbmUgU1VOM19JTlRfVkVDUyAxOTIKIAogdm9pZCBzdW4zX2VuYWJsZV9pcnEodW5zaWduZWQgaW50IGlycSk7CiB2b2lkIHN1bjNfZGlzYWJsZV9pcnEodW5zaWduZWQgaW50IGlycSk7Ci1pbnQgc3VuM19yZXF1ZXN0X2lycSh1bnNpZ25lZCBpbnQgaXJxLAotICAgICAgICAgICAgICAgICAgICAgaXJxcmV0dXJuX3QgKCpoYW5kbGVyKShpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKiksCi0gICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzLCBjb25zdCBjaGFyICpkZXZuYW1lLCB2b2lkICpkZXZfaWQKLQkJICAgICk7CiBleHRlcm4gdm9pZCBzdW4zX2luaXRfSVJRICh2b2lkKTsKLWV4dGVybiBpcnFyZXR1cm5fdCAoKnN1bjNfZGVmYXVsdF9oYW5kbGVyW10pIChpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik7Ci1leHRlcm4gdm9pZCBzdW4zX2ZyZWVfaXJxICh1bnNpZ25lZCBpbnQgaXJxLCB2b2lkICpkZXZfaWQpOwogZXh0ZXJuIHZvaWQgc3VuM19lbmFibGVfaW50ZXJydXB0cyAodm9pZCk7CiBleHRlcm4gdm9pZCBzdW4zX2Rpc2FibGVfaW50ZXJydXB0cyAodm9pZCk7Ci1leHRlcm4gaW50IHNob3dfc3VuM19pbnRlcnJ1cHRzKHN0cnVjdCBzZXFfZmlsZSAqLCB2b2lkICopOwotZXh0ZXJuIGlycXJldHVybl90IHN1bjNfcHJvY2Vzc19pbnQoaW50LCBzdHJ1Y3QgcHRfcmVncyAqKTsKIGV4dGVybiB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyKiBzdW4zX2ludHJlZzsKIAogLyogbWFzdGVyIGxpc3Qgb2YgVk1FIHZlY3RvcnMgLS0gZG9uJ3QgZnVjayB3aXRoIHRoaXMgKi8KLSNkZWZpbmUgU1VOM19WRUNfRkxPUFBZIDB4NDAKLSNkZWZpbmUgU1VOM19WRUNfVk1FU0NTSTAgMHg0MAotI2RlZmluZSBTVU4zX1ZFQ19WTUVTQ1NJMSAweDQxCi0jZGVmaW5lIFNVTjNfVkVDX0NHIDB4QTgKKyNkZWZpbmUgU1VOM19WRUNfRkxPUFBZCQkoSVJRX1VTRVIrMCkKKyNkZWZpbmUgU1VOM19WRUNfVk1FU0NTSTAJKElSUV9VU0VSKzApCisjZGVmaW5lIFNVTjNfVkVDX1ZNRVNDU0kxCShJUlFfVVNFUisxKQorI2RlZmluZSBTVU4zX1ZFQ19DRwkJKElSUV9VU0VSKzEwNCkKIAogCiAjZW5kaWYgLyogU1VOM0lOVFNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4ay90cmFwcy5oIGIvaW5jbHVkZS9hc20tbTY4ay90cmFwcy5oCmluZGV4IDQ3NTA1NjEuLjhjYWVmMjUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW02OGsvdHJhcHMuaAorKysgYi9pbmNsdWRlL2FzbS1tNjhrL3RyYXBzLmgKQEAgLTEzLDggKzEzLDE1IEBACiAKICNpZm5kZWYgX19BU1NFTUJMWV9fCiAKKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgorCiB0eXBlZGVmIHZvaWQgKCplX3ZlY3Rvcikodm9pZCk7CiAKK2FzbWxpbmthZ2Ugdm9pZCBhdXRvX2ludGhhbmRsZXIodm9pZCk7Cithc21saW5rYWdlIHZvaWQgdXNlcl9pbnRoYW5kbGVyKHZvaWQpOworYXNtbGlua2FnZSB2b2lkIGJhZF9pbnRoYW5kbGVyKHZvaWQpOworCiBleHRlcm4gZV92ZWN0b3IgdmVjdG9yc1tdOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGsvdWFjY2Vzcy5oIGIvaW5jbHVkZS9hc20tbTY4ay91YWNjZXNzLmgKaW5kZXggYjc2MWVmMi4uODhiMWY0NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4ay91YWNjZXNzLmgKKysrIGIvaW5jbHVkZS9hc20tbTY4ay91YWNjZXNzLmgKQEAgLTE4MSwxNDQgKzE4MSwxNjQgQEAKIHVuc2lnbmVkIGxvbmcgX19nZW5lcmljX2NvcHlfZnJvbV91c2VyKHZvaWQgKnRvLCBjb25zdCB2b2lkIF9fdXNlciAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKTsKIHVuc2lnbmVkIGxvbmcgX19nZW5lcmljX2NvcHlfdG9fdXNlcih2b2lkIF9fdXNlciAqdG8sIGNvbnN0IHZvaWQgKmZyb20sIHVuc2lnbmVkIGxvbmcgbik7CiAKKyNkZWZpbmUgX19jb25zdGFudF9jb3B5X2Zyb21fdXNlcl9hc20ocmVzLCB0bywgZnJvbSwgdG1wLCBuLCBzMSwgczIsIHMzKVwKKwlhc20gdm9sYXRpbGUgKCJcbiIJCQkJCQlcCisJCSIxOgltb3Zlcy4iI3MxIgkoJTIpKywlM1xuIgkJCVwKKwkJIgltb3ZlLiIjczEiCSUzLCglMSkrXG4iCQkJXAorCQkiMjoJbW92ZXMuIiNzMiIJKCUyKSssJTNcbiIJCQlcCisJCSIJbW92ZS4iI3MyIgklMywoJTEpK1xuIgkJCVwKKwkJIgkuaWZuYwlcIiIjczMiXCIsXCJcIlxuIgkJCVwKKwkJIjM6CW1vdmVzLiIjczMiCSglMikrLCUzXG4iCQkJXAorCQkiCW1vdmUuIiNzMyIJJTMsKCUxKStcbiIJCQlcCisJCSIJLmVuZGlmXG4iCQkJCQlcCisJCSI0OlxuIgkJCQkJCQlcCisJCSIJLnNlY3Rpb24gX19leF90YWJsZSxcImFcIlxuIgkJCVwKKwkJIgkuYWxpZ24JNFxuIgkJCQkJXAorCQkiCS5sb25nCTFiLDEwZlxuIgkJCQlcCisJCSIJLmxvbmcJMmIsMjBmXG4iCQkJCVwKKwkJIgkuaWZuYwlcIiIjczMiXCIsXCJcIlxuIgkJCVwKKwkJIgkubG9uZwkzYiwzMGZcbiIJCQkJXAorCQkiCS5lbmRpZlxuIgkJCQkJXAorCQkiCS5wcmV2aW91c1xuIgkJCQkJXAorCQkiXG4iCQkJCQkJCVwKKwkJIgkuc2VjdGlvbiAuZml4dXAsXCJheFwiXG4iCQkJXAorCQkiCS5ldmVuXG4iCQkJCQlcCisJCSIxMDoJY2xyLiIjczEiCSglMSkrXG4iCQkJXAorCQkiMjA6CWNsci4iI3MyIgkoJTEpK1xuIgkJCVwKKwkJIgkuaWZuYwlcIiIjczMiXCIsXCJcIlxuIgkJCVwKKwkJIjMwOgljbHIuIiNzMyIJKCUxKStcbiIJCQlcCisJCSIJLmVuZGlmXG4iCQkJCQlcCisJCSIJbW92ZXEubAkjIiNuIiwlMFxuIgkJCQlcCisJCSIJanJhCTRiXG4iCQkJCQlcCisJCSIJLnByZXZpb3VzXG4iCQkJCQlcCisJCTogIitkIiAocmVzKSwgIismYSIgKHRvKSwgIithIiAoZnJvbSksICI9JmQiICh0bXApCVwKKwkJOiA6ICJtZW1vcnkiKQorCiBzdGF0aWMgX19hbHdheXNfaW5saW5lIHVuc2lnbmVkIGxvbmcKIF9fY29uc3RhbnRfY29weV9mcm9tX3VzZXIodm9pZCAqdG8sIGNvbnN0IHZvaWQgX191c2VyICpmcm9tLCB1bnNpZ25lZCBsb25nIG4pCiB7CiAJdW5zaWduZWQgbG9uZyByZXMgPSAwLCB0bXA7CiAKLQkvKiBsaW1pdCB0aGUgaW5saW5lZCB2ZXJzaW9uIHRvIDMgbW92ZXMgKi8KLQlpZiAobiA9PSAxMSB8fCBuID4gMTIpCi0JCXJldHVybiBfX2dlbmVyaWNfY29weV9mcm9tX3VzZXIodG8sIGZyb20sIG4pOwotCiAJc3dpdGNoIChuKSB7CiAJY2FzZSAxOgogCQlfX2dldF91c2VyX2FzbShyZXMsICoodTggKil0bywgKHU4ICopZnJvbSwgdTgsIGIsIGQsIDEpOwotCQlyZXR1cm4gcmVzOworCQlicmVhazsKIAljYXNlIDI6CiAJCV9fZ2V0X3VzZXJfYXNtKHJlcywgKih1MTYgKil0bywgKHUxNiAqKWZyb20sIHUxNiwgdywgZCwgMik7Ci0JCXJldHVybiByZXM7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJX19jb25zdGFudF9jb3B5X2Zyb21fdXNlcl9hc20ocmVzLCB0bywgZnJvbSwgdG1wLCAzLCB3LCBiLCk7CisJCWJyZWFrOwogCWNhc2UgNDoKIAkJX19nZXRfdXNlcl9hc20ocmVzLCAqKHUzMiAqKXRvLCAodTMyICopZnJvbSwgdTMyLCBsLCByLCA0KTsKLQkJcmV0dXJuIHJlczsKKwkJYnJlYWs7CisJY2FzZSA1OgorCQlfX2NvbnN0YW50X2NvcHlfZnJvbV91c2VyX2FzbShyZXMsIHRvLCBmcm9tLCB0bXAsIDUsIGwsIGIsKTsKKwkJYnJlYWs7CisJY2FzZSA2OgorCQlfX2NvbnN0YW50X2NvcHlfZnJvbV91c2VyX2FzbShyZXMsIHRvLCBmcm9tLCB0bXAsIDYsIGwsIHcsKTsKKwkJYnJlYWs7CisJY2FzZSA3OgorCQlfX2NvbnN0YW50X2NvcHlfZnJvbV91c2VyX2FzbShyZXMsIHRvLCBmcm9tLCB0bXAsIDcsIGwsIHcsIGIpOworCQlicmVhazsKKwljYXNlIDg6CisJCV9fY29uc3RhbnRfY29weV9mcm9tX3VzZXJfYXNtKHJlcywgdG8sIGZyb20sIHRtcCwgOCwgbCwgbCwpOworCQlicmVhazsKKwljYXNlIDk6CisJCV9fY29uc3RhbnRfY29weV9mcm9tX3VzZXJfYXNtKHJlcywgdG8sIGZyb20sIHRtcCwgOSwgbCwgbCwgYik7CisJCWJyZWFrOworCWNhc2UgMTA6CisJCV9fY29uc3RhbnRfY29weV9mcm9tX3VzZXJfYXNtKHJlcywgdG8sIGZyb20sIHRtcCwgMTAsIGwsIGwsIHcpOworCQlicmVhazsKKwljYXNlIDEyOgorCQlfX2NvbnN0YW50X2NvcHlfZnJvbV91c2VyX2FzbShyZXMsIHRvLCBmcm9tLCB0bXAsIDEyLCBsLCBsLCBsKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogd2UgbGltaXQgdGhlIGlubGluZWQgdmVyc2lvbiB0byAzIG1vdmVzICovCisJCXJldHVybiBfX2dlbmVyaWNfY29weV9mcm9tX3VzZXIodG8sIGZyb20sIG4pOwogCX0KIAotCWFzbSB2b2xhdGlsZSAoIlxuIgotCQkiCS5pZm5kZWYJLkxmcm9tX3VzZXJcbiIKLQkJIgkuc2V0CS5MZnJvbV91c2VyLDFcbiIKLQkJIgkubWFjcm8JY29weV9mcm9tX3VzZXIgdG8sZnJvbSx0bXBcbiIKLQkJIgkuaWYJLkxjbnQgPj0gNFxuIgotCQkiMToJbW92ZXMubAkoXFxmcm9tKSssXFx0bXBcbiIKLQkJIgltb3ZlLmwJXFx0bXAsKFxcdG8pK1xuIgotCQkiCS5zZXQJLkxjbnQsLkxjbnQtNFxuIgotCQkiCS5lbHNlaWYJLkxjbnQgJiAyXG4iCi0JCSIxOgltb3Zlcy53CShcXGZyb20pKyxcXHRtcFxuIgotCQkiCW1vdmUudwlcXHRtcCwoXFx0bykrXG4iCi0JCSIJLnNldAkuTGNudCwuTGNudC0yXG4iCi0JCSIJLmVsc2VpZgkuTGNudCAmIDFcbiIKLQkJIjE6CW1vdmVzLmIJKFxcZnJvbSkrLFxcdG1wXG4iCi0JCSIJbW92ZS5iCVxcdG1wLChcXHRvKStcbiIKLQkJIgkuc2V0CS5MY250LC5MY250LTFcbiIKLQkJIgkuZWxzZVxuIgotCQkiCS5leGl0bVxuIgotCQkiCS5lbmRpZlxuIgotCQkiXG4iCi0JCSIJLnNlY3Rpb24gX19leF90YWJsZSxcImFcIlxuIgotCQkiCS5hbGlnbgk0XG4iCi0JCSIJLmxvbmcJMWIsM2ZcbiIKLQkJIgkucHJldmlvdXNcbiIKLQkJIgkuZW5kbVxuIgotCQkiCS5lbmRpZlxuIgotCQkiXG4iCi0JCSIJLnNldAkuTGNudCwlYzRcbiIKLQkJIgljb3B5X2Zyb21fdXNlciAlMSwlMiwlM1xuIgotCQkiCWNvcHlfZnJvbV91c2VyICUxLCUyLCUzXG4iCi0JCSIJY29weV9mcm9tX3VzZXIgJTEsJTIsJTNcbiIKLQkJIjI6XG4iCi0JCSIJLnNlY3Rpb24gLmZpeHVwLFwiYXhcIlxuIgotCQkiCS5ldmVuXG4iCi0JCSIzOgltb3ZlcS5sCSU0LCUwXG4iCi0JCSIJbW92ZS5sCSU1LCUxXG4iCi0JCSIJLnJlcHQJJWM0IC8gNFxuIgotCQkiCWNsci5sCSglMSkrXG4iCi0JCSIJLmVuZHJcbiIKLQkJIgkuaWYJJWM0ICYgMlxuIgotCQkiCWNsci53CSglMSkrXG4iCi0JCSIJLmVuZGlmXG4iCi0JCSIJLmlmCSVjNCAmIDFcbiIKLQkJIgljbHIuYgkoJTEpK1xuIgotCQkiCS5lbmRpZlxuIgotCQkiCWpyYQkyYlxuIgotCQkiCS5wcmV2aW91c1xuIgotCQk6ICIrciIgKHJlcyksICIrYSIgKHRvKSwgIithIiAoZnJvbSksICI9JmQiICh0bXApCi0JCTogImkiIChuKSwgImciICh0bykKLQkJOiAibWVtb3J5Iik7Ci0KIAlyZXR1cm4gcmVzOwogfQogCisjZGVmaW5lIF9fY29uc3RhbnRfY29weV90b191c2VyX2FzbShyZXMsIHRvLCBmcm9tLCB0bXAsIG4sIHMxLCBzMiwgczMpCVwKKwlhc20gdm9sYXRpbGUgKCJcbiIJCQkJCQlcCisJCSIJbW92ZS4iI3MxIgkoJTIpKywlM1xuIgkJCVwKKwkJIjExOgltb3Zlcy4iI3MxIgklMywoJTEpK1xuIgkJCVwKKwkJIjEyOgltb3ZlLiIjczIiCSglMikrLCUzXG4iCQkJXAorCQkiMjE6CW1vdmVzLiIjczIiCSUzLCglMSkrXG4iCQkJXAorCQkiMjI6XG4iCQkJCQkJCVwKKwkJIgkuaWZuYwlcIiIjczMiXCIsXCJcIlxuIgkJCVwKKwkJIgltb3ZlLiIjczMiCSglMikrLCUzXG4iCQkJXAorCQkiMzE6CW1vdmVzLiIjczMiCSUzLCglMSkrXG4iCQkJXAorCQkiMzI6XG4iCQkJCQkJCVwKKwkJIgkuZW5kaWZcbiIJCQkJCVwKKwkJIjQ6XG4iCQkJCQkJCVwKKwkJIlxuIgkJCQkJCQlcCisJCSIJLnNlY3Rpb24gX19leF90YWJsZSxcImFcIlxuIgkJCVwKKwkJIgkuYWxpZ24JNFxuIgkJCQkJXAorCQkiCS5sb25nCTExYiw1ZlxuIgkJCQlcCisJCSIJLmxvbmcJMTJiLDVmXG4iCQkJCVwKKwkJIgkubG9uZwkyMWIsNWZcbiIJCQkJXAorCQkiCS5sb25nCTIyYiw1ZlxuIgkJCQlcCisJCSIJLmlmbmMJXCIiI3MzIlwiLFwiXCJcbiIJCQlcCisJCSIJLmxvbmcJMzFiLDVmXG4iCQkJCVwKKwkJIgkubG9uZwkzMmIsNWZcbiIJCQkJXAorCQkiCS5lbmRpZlxuIgkJCQkJXAorCQkiCS5wcmV2aW91c1xuIgkJCQkJXAorCQkiXG4iCQkJCQkJCVwKKwkJIgkuc2VjdGlvbiAuZml4dXAsXCJheFwiXG4iCQkJXAorCQkiCS5ldmVuXG4iCQkJCQlcCisJCSI1Ogltb3ZlcS5sCSMiI24iLCUwXG4iCQkJCVwKKwkJIglqcmEJNGJcbiIJCQkJCVwKKwkJIgkucHJldmlvdXNcbiIJCQkJCVwKKwkJOiAiK2QiIChyZXMpLCAiK2EiICh0byksICIrYSIgKGZyb20pLCAiPSZkIiAodG1wKQlcCisJCTogOiAibWVtb3J5IikKKwogc3RhdGljIF9fYWx3YXlzX2lubGluZSB1bnNpZ25lZCBsb25nCiBfX2NvbnN0YW50X2NvcHlfdG9fdXNlcih2b2lkIF9fdXNlciAqdG8sIGNvbnN0IHZvaWQgKmZyb20sIHVuc2lnbmVkIGxvbmcgbikKIHsKIAl1bnNpZ25lZCBsb25nIHJlcyA9IDAsIHRtcDsKIAotCS8qIGxpbWl0IHRoZSBpbmxpbmVkIHZlcnNpb24gdG8gMyBtb3ZlcyAqLwotCWlmIChuID09IDExIHx8IG4gPiAxMikKLQkJcmV0dXJuIF9fZ2VuZXJpY19jb3B5X3RvX3VzZXIodG8sIGZyb20sIG4pOwotCiAJc3dpdGNoIChuKSB7CiAJY2FzZSAxOgogCQlfX3B1dF91c2VyX2FzbShyZXMsICoodTggKilmcm9tLCAodTggKil0bywgYiwgZCwgMSk7Ci0JCXJldHVybiByZXM7CisJCWJyZWFrOwogCWNhc2UgMjoKIAkJX19wdXRfdXNlcl9hc20ocmVzLCAqKHUxNiAqKWZyb20sICh1MTYgKil0bywgdywgZCwgMik7Ci0JCXJldHVybiByZXM7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJX19jb25zdGFudF9jb3B5X3RvX3VzZXJfYXNtKHJlcywgdG8sIGZyb20sIHRtcCwgMywgdywgYiwpOworCQlicmVhazsKIAljYXNlIDQ6CiAJCV9fcHV0X3VzZXJfYXNtKHJlcywgKih1MzIgKilmcm9tLCAodTMyICopdG8sIGwsIHIsIDQpOwotCQlyZXR1cm4gcmVzOworCQlicmVhazsKKwljYXNlIDU6CisJCV9fY29uc3RhbnRfY29weV90b191c2VyX2FzbShyZXMsIHRvLCBmcm9tLCB0bXAsIDUsIGwsIGIsKTsKKwkJYnJlYWs7CisJY2FzZSA2OgorCQlfX2NvbnN0YW50X2NvcHlfdG9fdXNlcl9hc20ocmVzLCB0bywgZnJvbSwgdG1wLCA2LCBsLCB3LCk7CisJCWJyZWFrOworCWNhc2UgNzoKKwkJX19jb25zdGFudF9jb3B5X3RvX3VzZXJfYXNtKHJlcywgdG8sIGZyb20sIHRtcCwgNywgbCwgdywgYik7CisJCWJyZWFrOworCWNhc2UgODoKKwkJX19jb25zdGFudF9jb3B5X3RvX3VzZXJfYXNtKHJlcywgdG8sIGZyb20sIHRtcCwgOCwgbCwgbCwpOworCQlicmVhazsKKwljYXNlIDk6CisJCV9fY29uc3RhbnRfY29weV90b191c2VyX2FzbShyZXMsIHRvLCBmcm9tLCB0bXAsIDksIGwsIGwsIGIpOworCQlicmVhazsKKwljYXNlIDEwOgorCQlfX2NvbnN0YW50X2NvcHlfdG9fdXNlcl9hc20ocmVzLCB0bywgZnJvbSwgdG1wLCAxMCwgbCwgbCwgdyk7CisJCWJyZWFrOworCWNhc2UgMTI6CisJCV9fY29uc3RhbnRfY29weV90b191c2VyX2FzbShyZXMsIHRvLCBmcm9tLCB0bXAsIDEyLCBsLCBsLCBsKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogbGltaXQgdGhlIGlubGluZWQgdmVyc2lvbiB0byAzIG1vdmVzICovCisJCXJldHVybiBfX2dlbmVyaWNfY29weV90b191c2VyKHRvLCBmcm9tLCBuKTsKIAl9CiAKLQlhc20gdm9sYXRpbGUgKCJcbiIKLQkJIgkuaWZuZGVmCS5MdG9fdXNlclxuIgotCQkiCS5zZXQJLkx0b191c2VyLDFcbiIKLQkJIgkubWFjcm8JY29weV90b191c2VyIHRvLGZyb20sdG1wXG4iCi0JCSIJLmlmCS5MY250ID49IDRcbiIKLQkJIgltb3ZlLmwJKFxcZnJvbSkrLFxcdG1wXG4iCi0JCSIxMToJbW92ZXMubAlcXHRtcCwoXFx0bykrXG4iCi0JCSIxMjoJLnNldAkuTGNudCwuTGNudC00XG4iCi0JCSIJLmVsc2VpZgkuTGNudCAmIDJcbiIKLQkJIgltb3ZlLncJKFxcZnJvbSkrLFxcdG1wXG4iCi0JCSIxMToJbW92ZXMudwlcXHRtcCwoXFx0bykrXG4iCi0JCSIxMjoJLnNldAkuTGNudCwuTGNudC0yXG4iCi0JCSIJLmVsc2VpZgkuTGNudCAmIDFcbiIKLQkJIgltb3ZlLmIJKFxcZnJvbSkrLFxcdG1wXG4iCi0JCSIxMToJbW92ZXMuYglcXHRtcCwoXFx0bykrXG4iCi0JCSIxMjoJLnNldAkuTGNudCwuTGNudC0xXG4iCi0JCSIJLmVsc2VcbiIKLQkJIgkuZXhpdG1cbiIKLQkJIgkuZW5kaWZcbiIKLQkJIlxuIgotCQkiCS5zZWN0aW9uIF9fZXhfdGFibGUsXCJhXCJcbiIKLQkJIgkuYWxpZ24JNFxuIgotCQkiCS5sb25nCTExYiwzZlxuIgotCQkiCS5sb25nCTEyYiwzZlxuIgotCQkiCS5wcmV2aW91c1xuIgotCQkiCS5lbmRtXG4iCi0JCSIJLmVuZGlmXG4iCi0JCSJcbiIKLQkJIgkuc2V0CS5MY250LCVjNFxuIgotCQkiCWNvcHlfdG9fdXNlciAlMSwlMiwlM1xuIgotCQkiCWNvcHlfdG9fdXNlciAlMSwlMiwlM1xuIgotCQkiCWNvcHlfdG9fdXNlciAlMSwlMiwlM1xuIgotCQkiMjpcbiIKLQkJIgkuc2VjdGlvbiAuZml4dXAsXCJheFwiXG4iCi0JCSIJLmV2ZW5cbiIKLQkJIjM6CW1vdmVxLmwJJTQsJTBcbiIKLQkJIglqcmEJMmJcbiIKLQkJIgkucHJldmlvdXNcbiIKLQkJOiAiK3IiIChyZXMpLCAiK2EiICh0byksICIrYSIgKGZyb20pLCAiPSZkIiAodG1wKQotCQk6ICJpIiAobikKLQkJOiAibWVtb3J5Iik7Ci0KIAlyZXR1cm4gcmVzOwogfQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvY2FjaGVmbHVzaC5oIGIvaW5jbHVkZS9hc20tbTY4a25vbW11L2NhY2hlZmx1c2guaAppbmRleCA0OTkyNWU5Li5jM2FhZGYzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvY2FjaGVmbHVzaC5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGtub21tdS9jYWNoZWZsdXNoLmgKQEAgLTU3LDEzICs1NywxMyBAQAogCQkibm9wXG5cdCIKIAkJOiA6IDogImQwIiApOwogI2VuZGlmIC8qIENPTkZJR19NNTI3eCB8fCBDT05GSUdfTTUyOHggKi8KLSNpZmRlZiBDT05GSUdfTTUyNzIKKyNpZiBkZWZpbmVkKENPTkZJR19NNTIwNikgfHwgZGVmaW5lZChDT05GSUdfTTUyMDZlKSB8fCBkZWZpbmVkKENPTkZJR19NNTI3MikKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0gICAgICAgIAkibW92ZWwJIzB4MDEwMDAwMDAsICUlZDBcblx0IgorICAgICAgICAJIm1vdmVsCSMweDgxMDAwMTAwLCAlJWQwXG5cdCIKICAgICAgICAgCSJtb3ZlYwklJWQwLCAlJUNBQ1Jcblx0IgogCQkibm9wXG5cdCIKIAkJOiA6IDogImQwIiApOwotI2VuZGlmIC8qIENPTkZJR19NNTI3MiAqLworI2VuZGlmIC8qIENPTkZJR19NNTIwNiB8fCBDT05GSUdfTTUyMDZlIHx8IENPTkZJR19NNTI3MiAqLwogI2lmZGVmIENPTkZJR19NNTI0OQogCV9fYXNtX18gX192b2xhdGlsZV9fICgKICAgICAgICAgCSJtb3ZlbAkjMHhhMTAwMDIwMCwgJSVkMFxuXHQiCkBAIC03MSw2ICs3MSwxMyBAQAogCQkibm9wXG5cdCIKIAkJOiA6IDogImQwIiApOwogI2VuZGlmIC8qIENPTkZJR19NNTI0OSAqLworI2lmZGVmIENPTkZJR19NNTMyeAorCV9fYXNtX18gX192b2xhdGlsZV9fICgKKyAgICAgICAgCSJtb3ZlbAkjMHg4MTAwMDIwMCwgJSVkMFxuXHQiCisgICAgICAgIAkibW92ZWMJJSVkMCwgJSVDQUNSXG5cdCIKKwkJIm5vcFxuXHQiCisJCTogOiA6ICJkMCIgKTsKKyNlbmRpZiAvKiBDT05GSUdfTTUzMnggKi8KIH0KIAogI2VuZGlmIC8qIF9NNjhLTk9NTVVfQ0FDSEVGTFVTSF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvY29sZGZpcmUuaCBiL2luY2x1ZGUvYXNtLW02OGtub21tdS9jb2xkZmlyZS5oCmluZGV4IDJmYWJjYTkuLjgzYTlmYTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW02OGtub21tdS9jb2xkZmlyZS5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGtub21tdS9jb2xkZmlyZS5oCkBAIC0zLDcgKzMsNyBAQAogLyoKICAqCWNvbGRmaXJlLmggLS0gTW90b3JvbGEgQ29sZEZpcmUgQ1BVIHNlcGVjaWZpYyBkZWZpbmVzCiAgKgotICoJKEMpIENvcHlyaWdodCAxOTk5LTIwMDIsIEdyZWcgVW5nZXJlciAoZ2VyZ0BzbmFwZ2Vhci5jb20pCisgKgkoQykgQ29weXJpZ2h0IDE5OTktMjAwNiwgR3JlZyBVbmdlcmVyIChnZXJnQHNuYXBnZWFyLmNvbSkKICAqCShDKSBDb3B5cmlnaHQgMjAwMCwgTGluZW8gKHd3dy5saW5lby5jb20pCiAgKi8KIApAQCAtMTQsNiArMTQsMTkgQEAKIAogCiAvKgorICoJRGVmaW5lIG1hc3RlciBjbG9jayBmcmVxdWVuY3kuIFRoaXMgaXMgZXNzZW50aWFsbHkgZG9uZSBhdCBjb25maWcKKyAqCXRpbWUgbm93LiBObyBwb2ludCBlbnVtZXJhdGluZyBkb3plbnMgb2YgcG9zc2libGUgY2xvY2sgb3B0aW9ucworICoJaGVyZS4gQWxzbyB0aGUgcGVyaXBoZXJhbCBjbG9jayAoYnVzIGNsb2NrKSBkaXZpZGUgcmF0aW8gaXMgc2V0CisgKglhdCBjb25maWcgdGltZSB0b28uCisgKi8KKyNpZmRlZiBDT05GSUdfQ0xPQ0tfU0VUCisjZGVmaW5lCU1DRl9DTEsJCUNPTkZJR19DTE9DS19GUkVRCisjZGVmaW5lCU1DRl9CVVNDTEsJKENPTkZJR19DTE9DS19GUkVRIC8gQ09ORklHX0NMT0NLX0RJVikKKyNlbHNlCisjZXJyb3IgIkRvbid0IGtub3cgd2hhdCB5b3VyIENvbGRGaXJlIENQVSBjbG9jayBmcmVxdWVuY3kgaXM/PyIKKyNlbmRpZgorCisvKgogICoJRGVmaW5lIHRoZSBwcm9jZXNzb3Igc3VwcG9ydCBwZXJpcGhlcmFscyBiYXNlIGFkZHJlc3MuCiAgKglUaGlzIGlzIGdlbmVyYWxseSBzZXR1cCBieSB0aGUgYm9hcmRzIHN0YXJ0IHVwIGNvZGUuCiAgKi8KQEAgLTI5LDY0ICs0Miw5IEBACiAgICAgZGVmaW5lZChDT05GSUdfTTUyMHgpCiAjdW5kZWYgTUNGX01CQVIKICNkZWZpbmUJTUNGX01CQVIJTUNGX0lQU0JBUgotI2VuZGlmCi0KLS8qCi0gKglEZWZpbmUgbWFzdGVyIGNsb2NrIGZyZXF1ZW5jeS4KLSAqLwotI2lmIGRlZmluZWQoQ09ORklHX0NMT0NLXzExTUh6KQotI2RlZmluZQlNQ0ZfQ0xLCQkxMTI4OTYwMAotI2VsaWYgZGVmaW5lZChDT05GSUdfQ0xPQ0tfMTZNSHopCi0jZGVmaW5lCU1DRl9DTEsJCTE2MDAwMDAwCi0jZWxpZiBkZWZpbmVkKENPTkZJR19DTE9DS18yME1IeikKLSNkZWZpbmUJTUNGX0NMSwkJMjAwMDAwMDAKLSNlbGlmIGRlZmluZWQoQ09ORklHX0NMT0NLXzI0TUh6KQotI2RlZmluZQlNQ0ZfQ0xLCQkyNDAwMDAwMAotI2VsaWYgZGVmaW5lZChDT05GSUdfQ0xPQ0tfMjVNSHopCi0jZGVmaW5lCU1DRl9DTEsJCTI1MDAwMDAwCi0jZWxpZiBkZWZpbmVkKENPTkZJR19DTE9DS18zM01IeikKLSNkZWZpbmUJTUNGX0NMSwkJMzMwMDAwMDAKLSNlbGlmIGRlZmluZWQoQ09ORklHX0NMT0NLXzQwTUh6KQotI2RlZmluZQlNQ0ZfQ0xLCQk0MDAwMDAwMAotI2VsaWYgZGVmaW5lZChDT05GSUdfQ0xPQ0tfNDVNSHopCi0jZGVmaW5lCU1DRl9DTEsJCTQ1MDAwMDAwCi0jZWxpZiBkZWZpbmVkKENPTkZJR19DTE9DS180OE1IeikKLSNkZWZpbmUJTUNGX0NMSwkJNDgwMDAwMDAKLSNlbGlmIGRlZmluZWQoQ09ORklHX0NMT0NLXzUwTUh6KQotI2RlZmluZQlNQ0ZfQ0xLCQk1MDAwMDAwMAotI2VsaWYgZGVmaW5lZChDT05GSUdfQ0xPQ0tfNTRNSHopCi0jZGVmaW5lCU1DRl9DTEsJCTU0MDAwMDAwCi0jZWxpZiBkZWZpbmVkKENPTkZJR19DTE9DS182ME1IeikKLSNkZWZpbmUJTUNGX0NMSwkJNjAwMDAwMDAKLSNlbGlmIGRlZmluZWQoQ09ORklHX0NMT0NLXzYyXzVNSHopCi0jZGVmaW5lIE1DRl9DTEsJCTYyNTAwMDAwCi0jZWxpZiBkZWZpbmVkKENPTkZJR19DTE9DS182NE1IeikKLSNkZWZpbmUJTUNGX0NMSwkJNjQwMDAwMDAKLSNlbGlmIGRlZmluZWQoQ09ORklHX0NMT0NLXzY2TUh6KQotI2RlZmluZQlNQ0ZfQ0xLCQk2NjAwMDAwMAotI2VsaWYgZGVmaW5lZChDT05GSUdfQ0xPQ0tfNzBNSHopCi0jZGVmaW5lCU1DRl9DTEsJCTcwMDAwMDAwCi0jZWxpZiBkZWZpbmVkKENPTkZJR19DTE9DS18xMDBNSHopCi0jZGVmaW5lCU1DRl9DTEsJCTEwMDAwMDAwMAotI2VsaWYgZGVmaW5lZChDT05GSUdfQ0xPQ0tfMTQwTUh6KQotI2RlZmluZQlNQ0ZfQ0xLCQkxNDAwMDAwMDAKLSNlbGlmIGRlZmluZWQoQ09ORklHX0NMT0NLXzE1ME1IeikKLSNkZWZpbmUJTUNGX0NMSwkJMTUwMDAwMDAwCi0jZWxpZiBkZWZpbmVkKENPTkZJR19DTE9DS18xNjZNSHopCi0jZGVmaW5lCU1DRl9DTEsJCTE2NjAwMDAwMAotI2Vsc2UKLSNlcnJvciAiRG9uJ3Qga25vdyB3aGF0IHlvdXIgQ29sZEZpcmUgQ1BVIGNsb2NrIGZyZXF1ZW5jeSBpcz8/IgotI2VuZGlmCi0KLS8qCi0gKglPbmUgc29tZSBDb2xkRmlyZSBmYW1pbHkgbWVtYmVycyB0aGUgYnVzIGNsb2NrICh1c2VkIGJ5IGludGVybmFsCi0gKglwZXJpcGhlcmFscykgaXMgbm90IHRoZSBzYW1lIGFzIHRoZSBDUFUgY2xvY2suCi0gKi8KLSNpZiBkZWZpbmVkKENPTkZJR19NNTIzeCkgfHwgZGVmaW5lZChDT05GSUdfTTUyNDkpIHx8IGRlZmluZWQoQ09ORklHX001Mjd4KSB8fCBcCi0gICAgZGVmaW5lZChDT05GSUdfTTUyMHgpCi0jZGVmaW5lCU1DRl9CVVNDTEsJKE1DRl9DTEsgLyAyKQotI2Vsc2UKLSNkZWZpbmUJTUNGX0JVU0NMSwlNQ0ZfQ0xLCisjZWxpZiBkZWZpbmVkKENPTkZJR19NNTMyeCkKKyN1bmRlZiBNQ0ZfTUJBUgorI2RlZmluZSBNQ0ZfTUJBUgkweDAwMDAwMDAwCiAjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvaXJxLmggYi9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvaXJxLmgKaW5kZXggYzUyNDc1MS4uNTM1NTcyNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4a25vbW11L2lycS5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGtub21tdS9pcnEuaApAQCAtODMsNyArODMsNyBAQAogLyoKICAqIFNvbWUgZHJpdmVycyB3YW50IHRoZXNlIGVudHJ5IHBvaW50cwogICovCi0jZGVmaW5lIGVuYWJsZV9pcnEoeCkJMAorI2RlZmluZSBlbmFibGVfaXJxKHgpCWRvIHsgfSB3aGlsZSAoMCkKICNkZWZpbmUgZGlzYWJsZV9pcnEoeCkJZG8geyB9IHdoaWxlICgwKQogI2RlZmluZSBkaXNhYmxlX2lycV9ub3N5bmMoeCkJZGlzYWJsZV9pcnEoeCkKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4a25vbW11L201MjQ5c2ltLmggYi9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvbTUyNDlzaW0uaAppbmRleCA5MzQ0ZjUyLi4zOTk4MTRmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvbTUyNDlzaW0uaAorKysgYi9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvbTUyNDlzaW0uaApAQCAtMTU3LDcgKzE1Nyw3IEBACiAJbW92ZWwJJWQwLDB4MTgwKCVhMSkJCQkvKiBzZXQgUExMIHJlZ2lzdGVyICovCiAJbm9wCiAKLSNpZmRlZiBDT05GSUdfQ0xPQ0tfMTQwTUh6CisjaWYgQ09ORklHX0NMT0NLX0ZSRVEgPT0gMTQwMDAwMDAwCiAJLyoKIAkgKglTZXQgaW5pdGlhbCBjbG9jayBmcmVxdWVuY3kuIFRoaXMgYXNzdW1lcyBNNTI0OUMzIGJvYXJkCiAJICoJaXMgZml0dGVkIHdpdGggMTEuMjg5Nk1IeiBjcnlzdGFsLiBJdCB3aWxsIHByb2dyYW0gdGhlCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvbTUzMnhzaW0uaCBiL2luY2x1ZGUvYXNtLW02OGtub21tdS9tNTMyeHNpbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4MzVmZDIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvbTUzMnhzaW0uaApAQCAtMCwwICsxLDIyMzggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJbTUzMnhzaW0uaCAtLSBDb2xkRmlyZSA1MzI5IHJlZ2lzdGVycworICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZgltNTMyeHNpbV9oCisjZGVmaW5lCW01MzJ4c2ltX2gKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIE1DRl9SRUczMih4KSAoKih2b2xhdGlsZSB1bnNpZ25lZCBsb25nICAqKSh4KSkKKyNkZWZpbmUgTUNGX1JFRzE2KHgpICgqKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopKHgpKQorI2RlZmluZSBNQ0ZfUkVHMDgoeCkgKCoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAgKikoeCkpCisKKyNkZWZpbmUgTUNGSU5UX1ZFQ0JBU0UgICAgICA2NAorI2RlZmluZSBNQ0ZJTlRfVUFSVDAgICAgICAgIDI2ICAgICAgICAgIC8qIEludGVycnVwdCBudW1iZXIgZm9yIFVBUlQwICovCisjZGVmaW5lIE1DRklOVF9VQVJUMSAgICAgICAgMjcgICAgICAgICAgLyogSW50ZXJydXB0IG51bWJlciBmb3IgVUFSVDEgKi8KKworI2RlZmluZSBNQ0ZfV1RNX1dDUglNQ0ZfUkVHMTYoMHhGQzA5ODAwMCkKKworLyoKKyAqCURlZmluZSB0aGUgNTMyeCBTSU0gcmVnaXN0ZXIgc2V0IGFkZHJlc3Nlcy4KKyAqLworI2RlZmluZQlNQ0ZTSU1fSVBSTAkJMHhGQzA0ODAwNAorI2RlZmluZQlNQ0ZTSU1fSVBSSAkJMHhGQzA0ODAwMAorI2RlZmluZQlNQ0ZTSU1fSVBSCQlNQ0ZTSU1fSVBSTAorI2RlZmluZQlNQ0ZTSU1fSU1STAkJMHhGQzA0ODAwQworI2RlZmluZQlNQ0ZTSU1fSU1SSAkJMHhGQzA0ODAwOAorI2RlZmluZQlNQ0ZTSU1fSU1SCQlNQ0ZTSU1fSU1STAorI2RlZmluZQlNQ0ZTSU1fSUNSMAkJMHhGQzA0ODA0MAkKKyNkZWZpbmUJTUNGU0lNX0lDUjEJCTB4RkMwNDgwNDEJCisjZGVmaW5lCU1DRlNJTV9JQ1IyCQkweEZDMDQ4MDQyCQorI2RlZmluZQlNQ0ZTSU1fSUNSMwkJMHhGQzA0ODA0MwkKKyNkZWZpbmUJTUNGU0lNX0lDUjQJCTB4RkMwNDgwNDQJCisjZGVmaW5lCU1DRlNJTV9JQ1I1CQkweEZDMDQ4MDQ1CQorI2RlZmluZQlNQ0ZTSU1fSUNSNgkJMHhGQzA0ODA0NgkKKyNkZWZpbmUJTUNGU0lNX0lDUjcJCTB4RkMwNDgwNDcJCisjZGVmaW5lCU1DRlNJTV9JQ1I4CQkweEZDMDQ4MDQ4CQorI2RlZmluZQlNQ0ZTSU1fSUNSOQkJMHhGQzA0ODA0OQkKKyNkZWZpbmUJTUNGU0lNX0lDUjEwCQkweEZDMDQ4MDRBCisjZGVmaW5lCU1DRlNJTV9JQ1IxMQkJMHhGQzA0ODA0QgorCisvKgorICoJU29tZSBzeW1ib2wgZGVmaW5lcyBmb3IgdGhlIGFib3ZlLi4uCisgKi8KKyNkZWZpbmUJTUNGU0lNX1NXRElDUgkJTUNGU0lNX0lDUjAJLyogV2F0Y2hkb2cgdGltZXIgSUNSICovCisjZGVmaW5lCU1DRlNJTV9USU1FUjFJQ1IJTUNGU0lNX0lDUjEJLyogVGltZXIgMSBJQ1IgKi8KKyNkZWZpbmUJTUNGU0lNX1RJTUVSMklDUglNQ0ZTSU1fSUNSMgkvKiBUaW1lciAyIElDUiAqLworI2RlZmluZQlNQ0ZTSU1fVUFSVDFJQ1IJCU1DRlNJTV9JQ1I0CS8qIFVBUlQgMSBJQ1IgKi8KKyNkZWZpbmUJTUNGU0lNX1VBUlQySUNSCQlNQ0ZTSU1fSUNSNQkvKiBVQVJUIDIgSUNSICovCisjZGVmaW5lCU1DRlNJTV9ETUEwSUNSCQlNQ0ZTSU1fSUNSNgkvKiBETUEgMCBJQ1IgKi8KKyNkZWZpbmUJTUNGU0lNX0RNQTFJQ1IJCU1DRlNJTV9JQ1I3CS8qIERNQSAxIElDUiAqLworI2RlZmluZQlNQ0ZTSU1fRE1BMklDUgkJTUNGU0lNX0lDUjgJLyogRE1BIDIgSUNSICovCisjZGVmaW5lCU1DRlNJTV9ETUEzSUNSCQlNQ0ZTSU1fSUNSOQkvKiBETUEgMyBJQ1IgKi8KKworCisjZGVmaW5lCU1DRlNJTV9JTVJfTUFTS0FMTAkweEZGRkZGRkZGCS8qIEFsbCBTSU0gaW50ciBzb3VyY2VzICovCisKKyNkZWZpbmUgTUNGU0lNX0lNUl9TSU1SMAkweEZDMDQ4MDFDCisjZGVmaW5lIE1DRlNJTV9JTVJfU0lNUjEJMHhGQzA0QzAxQworI2RlZmluZSBNQ0ZTSU1fSU1SX0NJTVIwCTB4RkMwNDgwMUQKKyNkZWZpbmUgTUNGU0lNX0lNUl9DSU1SMQkweEZDMDRDMDFECisKKyNkZWZpbmUgTUNGU0lNX0lDUl9USU1FUjEJKDB4RkMwNDgwNDArMzIpCisjZGVmaW5lIE1DRlNJTV9JQ1JfVElNRVIyCSgweEZDMDQ4MDQwKzMzKQorCisKKy8qCisgKglNYWNybyB0byBzZXQgSU1SIHJlZ2lzdGVyLiBJdCBpcyAzMiBiaXRzIG9uIHRoZSA1MzA3LgorICovCisjZGVmaW5lCW1jZl9nZXRpbXIoKQkJXAorCSooKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikgKE1DRl9NQkFSICsgTUNGU0lNX0lNUikpCisKKyNkZWZpbmUJbWNmX3NldGltcihpbXIpCQlcCisJKigodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKSAoTUNGX01CQVIgKyBNQ0ZTSU1fSU1SKSkgPSAoaW1yKTsKKworI2RlZmluZQltY2ZfZ2V0aXByKCkJCVwKKwkqKCh2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopIChNQ0ZfTUJBUiArIE1DRlNJTV9JUFIpKQorCisjZGVmaW5lCW1jZl9nZXRpcHJsKCkJCVwKKwkqKCh2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopIChNQ0ZfTUJBUiArIE1DRlNJTV9JUFJMKSkKKworI2RlZmluZQltY2ZfZ2V0aXByaCgpCQlcCisJKigodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKSAoTUNGX01CQVIgKyBNQ0ZTSU1fSVBSSCkpCisKKworI2RlZmluZSBtY2ZfZW5hYmxlX2lycTAoaXJxKQkJXAorCSooKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIqKSAoTUNGU0lNX0lNUl9DSU1SMCkpID0gKGlycSk7CisKKyNkZWZpbmUgbWNmX2VuYWJsZV9pcnExKGlycSkJCVwKKwkqKCh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyKikgKE1DRlNJTV9JTVJfQ0lNUjEpKSA9IChpcnEpOworCisjZGVmaW5lIG1jZl9kaXNhYmxlX2lycTAoaXJxKQkJXAorCSooKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIqKSAoTUNGU0lNX0lNUl9TSU1SMCkpID0gKGlycSk7CisKKyNkZWZpbmUgbWNmX2Rpc2FibGVfaXJxMShpcnEpCQlcCisJKigodm9sYXRpbGUgdW5zaWduZWQgY2hhciopIChNQ0ZTSU1fSU1SX1NJTVIxKSkgPSAoaXJxKTsKKworLyoKKyAqCURlZmluZSB0aGUgQ2FjaGUgcmVnaXN0ZXIgZmxhZ3MuCisgKi8KKyNkZWZpbmUJQ0FDUl9FQwkJCSgxPDwzMSkKKyNkZWZpbmUJQ0FDUl9FU0IJCSgxPDwyOSkKKyNkZWZpbmUJQ0FDUl9EUEkJCSgxPDwyOCkKKyNkZWZpbmUJQ0FDUl9ITENLCQkoMTw8MjcpCisjZGVmaW5lCUNBQ1JfQ0lOVkEJCSgxPDwyNCkKKyNkZWZpbmUJQ0FDUl9ETkZCCQkoMTw8MTApCisjZGVmaW5lCUNBQ1JfRENNX1dUSFJVCQkoMDw8OCkKKyNkZWZpbmUJQ0FDUl9EQ01fV0JBQ0sJCSgxPDw4KQorI2RlZmluZQlDQUNSX0RDTV9PRkZfUFJFCSgyPDw4KQorI2RlZmluZQlDQUNSX0RDTV9PRkZfSU1QCSgzPDw4KQorI2RlZmluZQlDQUNSX0RXCQkJKDE8PDUpCisKKyNkZWZpbmUJQUNSX0JBU0VfUE9TCQkyNAorI2RlZmluZQlBQ1JfTUFTS19QT1MJCTE2CisjZGVmaW5lCUFDUl9FTkFCTEUJCSgxPDwxNSkKKyNkZWZpbmUJQUNSX1VTRVIJCSgwPDwxMykKKyNkZWZpbmUJQUNSX1NVUEVSCQkoMTw8MTMpCisjZGVmaW5lCUFDUl9BTlkJCQkoMjw8MTMpCisjZGVmaW5lCUFDUl9DTV9XVEhSVQkJKDA8PDUpCisjZGVmaW5lCUFDUl9DTV9XQkFDSwkJKDE8PDUpCisjZGVmaW5lCUFDUl9DTV9PRkZfUFJFCQkoMjw8NSkKKyNkZWZpbmUJQUNSX0NNX09GRl9JTVAJCSgzPDw1KQorI2RlZmluZQlBQ1JfV1BST1RFQ1QJCSgxPDwyKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogSW50ZXItSUMgKEkyQykgTW9kdWxlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogUmVhZC9Xcml0ZSBhY2Nlc3MgbWFjcm9zIGZvciBnZW5lcmFsIHVzZSAqLworI2RlZmluZSBNQ0Y1MzJ4X0kyQ19JMkFEUiAgICAgICAodm9sYXRpbGUgdTggKikgKDB4RkMwNTgwMDApIC8vIEFkZHJlc3MgCisjZGVmaW5lIE1DRjUzMnhfSTJDX0kyRkRSICAgICAgICh2b2xhdGlsZSB1OCAqKSAoMHhGQzA1ODAwNCkgLy8gRnJlcSBEaXZpZGVyCisjZGVmaW5lIE1DRjUzMnhfSTJDX0kyQ1IgICAgICAgICh2b2xhdGlsZSB1OCAqKSAoMHhGQzA1ODAwOCkgLy8gQ29udHJvbAorI2RlZmluZSBNQ0Y1MzJ4X0kyQ19JMlNSICAgICAgICAodm9sYXRpbGUgdTggKikgKDB4RkMwNTgwMEMpIC8vIFN0YXR1cworI2RlZmluZSBNQ0Y1MzJ4X0kyQ19JMkRSICAgICAgICAodm9sYXRpbGUgdTggKikgKDB4RkMwNTgwMTApIC8vIERhdGEgSS9PCisKKy8qIEJpdCBsZXZlbCBkZWZpbml0aW9ucyBhbmQgbWFjcm9zICovCisjZGVmaW5lIE1DRjUzMnhfSTJDX0kyQURSX0FERFIoeCkgICAgICAgICAgICAgICAgICAgICAgICgoKHgpJjB4N0YpPDwweDAxKQorCisjZGVmaW5lIE1DRjUzMnhfSTJDX0kyRkRSX0lDKHgpICAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpJjB4M0YpKQorCisjZGVmaW5lIE1DRjUzMnhfSTJDX0kyQ1JfSUVOICAgICgweDgwKQkvLyBJMkMgZW5hYmxlCisjZGVmaW5lIE1DRjUzMnhfSTJDX0kyQ1JfSUlFTiAgICgweDQwKSAgLy8gaW50ZXJydXB0IGVuYWJsZQorI2RlZmluZSBNQ0Y1MzJ4X0kyQ19JMkNSX01TVEEgICAoMHgyMCkgIC8vIG1hc3Rlci9zbGF2ZSBtb2RlCisjZGVmaW5lIE1DRjUzMnhfSTJDX0kyQ1JfTVRYICAgICgweDEwKSAgLy8gdHJhbnNtaXQvcmVjZWl2ZSBtb2RlCisjZGVmaW5lIE1DRjUzMnhfSTJDX0kyQ1JfVFhBSyAgICgweDA4KSAgLy8gdHJhbnNtaXQgYWNrbm93bGVkZ2UgZW5hYmxlCisjZGVmaW5lIE1DRjUzMnhfSTJDX0kyQ1JfUlNUQSAgICgweDA0KSAgLy8gcmVwZWF0IHN0YXJ0CisKKyNkZWZpbmUgTUNGNTMyeF9JMkNfSTJTUl9JQ0YgICAgKDB4ODApICAvLyBkYXRhIHRyYW5zZmVyIGJpdAorI2RlZmluZSBNQ0Y1MzJ4X0kyQ19JMlNSX0lBQVMgICAoMHg0MCkgIC8vIEkyQyBhZGRyZXNzZWQgYXMgYSBzbGF2ZQorI2RlZmluZSBNQ0Y1MzJ4X0kyQ19JMlNSX0lCQiAgICAoMHgyMCkgIC8vIEkyQyBidXMgYnVzeQorI2RlZmluZSBNQ0Y1MzJ4X0kyQ19JMlNSX0lBTCAgICAoMHgxMCkgIC8vIGFyaWJpdHJhdGlvbiBsb3N0CisjZGVmaW5lIE1DRjUzMnhfSTJDX0kyU1JfU1JXICAgICgweDA0KSAgLy8gc2xhdmUgcmVhZC93cml0ZQorI2RlZmluZSBNQ0Y1MzJ4X0kyQ19JMlNSX0lJRiAgICAoMHgwMikgIC8vIEkyQyBpbnRlcnJ1cHQKKyNkZWZpbmUgTUNGNTMyeF9JMkNfSTJTUl9SWEFLICAgKDB4MDEpICAvLyByZWNlaXZlZCBhY2tub3dsZWRnZQorCisjZGVmaW5lIE1DRjUzMnhfUEFSX0ZFQ0kyQwkodm9sYXRpbGUgdTggKikgKDB4RkMwQTQwNTMpCisKKworLyoKKyAqCVRoZSBNNTMyOUVWQiBib2FyZCBuZWVkcyBhIGhlbHAgZ2V0dGluZyBpdHMgZGV2aWNlcyBpbml0aWFsaXplZCAKKyAqCWF0IGtlcm5lbCBzdGFydCB0aW1lIGlmIGRCVUcgZG9lc24ndCBzZXQgaXQgdXAgKGZvciBleGFtcGxlIAorICoJaXQgaXMgbm90IHVzZWQpLCBzbyB3ZSBuZWVkIHRvIGRvIGl0IG1hbnVhbGx5LgorICovCisjaWZkZWYgX19BU1NFTUJMRVJfXworLm1hY3JvIG01MzI5RVZCX3NldHVwCisJbW92ZWwJIzB4RkMwOTgwMDAsICVhNworCW1vdmVsCSMweDAsICglYTcpCisjZGVmaW5lIENPUkVfU1JBTQkweDgwMDAwMDAwCQorI2RlZmluZSBDT1JFX1NSQU1fU0laRQkweDgwMDAKKwltb3ZlbAkjQ09SRV9TUkFNLCAlZDAKKwlhZGRsCSMweDIyMSwgJWQwCisJbW92ZWMJJWQwLCVSQU1CQVIxCisJbW92ZWwJI0NPUkVfU1JBTSwgJXNwCisJYWRkbAkjQ09SRV9TUkFNX1NJWkUsICVzcAorCWpzcglzeXNpbml0CisuZW5kbQorI2RlZmluZQlQTEFURk9STV9TRVRVUAltNTMyOUVWQl9zZXR1cAorCisjZW5kaWYgLyogX19BU1NFTUJMRVJfXyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ2hpcCBDb25maWd1cmF0aW9uIE1vZHVsZSAoQ0NNKQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFJlZ2lzdGVyIHJlYWQvd3JpdGUgbWFjcm9zICovCisjZGVmaW5lIE1DRl9DQ01fQ0NSICAgICAgICAgICAgICAgTUNGX1JFRzE2KDB4RkMwQTAwMDQpCisjZGVmaW5lIE1DRl9DQ01fUkNPTiAgICAgICAgICAgICAgTUNGX1JFRzE2KDB4RkMwQTAwMDgpCisjZGVmaW5lIE1DRl9DQ01fQ0lSICAgICAgICAgICAgICAgTUNGX1JFRzE2KDB4RkMwQTAwMEEpCisjZGVmaW5lIE1DRl9DQ01fTUlTQ0NSICAgICAgICAgICAgTUNGX1JFRzE2KDB4RkMwQTAwMTApCisjZGVmaW5lIE1DRl9DQ01fQ0RSICAgICAgICAgICAgICAgTUNGX1JFRzE2KDB4RkMwQTAwMTIpCisjZGVmaW5lIE1DRl9DQ01fVUhDU1IgICAgICAgICAgICAgTUNGX1JFRzE2KDB4RkMwQTAwMTQpCisjZGVmaW5lIE1DRl9DQ01fVU9DU1IgICAgICAgICAgICAgTUNGX1JFRzE2KDB4RkMwQTAwMTYpCisKKy8qIEJpdCBkZWZpbml0aW9ucyBhbmQgbWFjcm9zIGZvciBNQ0ZfQ0NNX0NDUiAqLworI2RlZmluZSBNQ0ZfQ0NNX0NDUl9SRVNFUlZFRCAgICAgICgweDAwMDEpCisjZGVmaW5lIE1DRl9DQ01fQ0NSX1BMTF9NT0RFICAgICAgKDB4MDAwMykKKyNkZWZpbmUgTUNGX0NDTV9DQ1JfT1NDX01PREUgICAgICAoMHgwMDA1KQorI2RlZmluZSBNQ0ZfQ0NNX0NDUl9CT09UUFMoeCkgICAgICgoKHgpJjB4MDAwMyk8PDN8MHgwMDAxKQorI2RlZmluZSBNQ0ZfQ0NNX0NDUl9MT0FEICAgICAgICAgICgweDAwMjEpCisjZGVmaW5lIE1DRl9DQ01fQ0NSX0xJTVAgICAgICAgICAgKDB4MDA0MSkKKyNkZWZpbmUgTUNGX0NDTV9DQ1JfQ1NDKHgpICAgICAgICAoKCh4KSYweDAwMDMpPDw4fDB4MDAwMSkKKworLyogQml0IGRlZmluaXRpb25zIGFuZCBtYWNyb3MgZm9yIE1DRl9DQ01fUkNPTiAqLworI2RlZmluZSBNQ0ZfQ0NNX1JDT05fUkVTRVJWRUQgICAgICgweDAwMDEpCisjZGVmaW5lIE1DRl9DQ01fUkNPTl9QTExfTU9ERSAgICAgKDB4MDAwMykKKyNkZWZpbmUgTUNGX0NDTV9SQ09OX09TQ19NT0RFICAgICAoMHgwMDA1KQorI2RlZmluZSBNQ0ZfQ0NNX1JDT05fQk9PVFBTKHgpICAgICgoKHgpJjB4MDAwMyk8PDN8MHgwMDAxKQorI2RlZmluZSBNQ0ZfQ0NNX1JDT05fTE9BRCAgICAgICAgICgweDAwMjEpCisjZGVmaW5lIE1DRl9DQ01fUkNPTl9MSU1QICAgICAgICAgKDB4MDA0MSkKKyNkZWZpbmUgTUNGX0NDTV9SQ09OX0NTQyh4KSAgICAgICAoKCh4KSYweDAwMDMpPDw4fDB4MDAwMSkKKworLyogQml0IGRlZmluaXRpb25zIGFuZCBtYWNyb3MgZm9yIE1DRl9DQ01fQ0lSICovCisjZGVmaW5lIE1DRl9DQ01fQ0lSX1BSTih4KSAgICAgICAgKCgoeCkmMHgwMDNGKTw8MCkKKyNkZWZpbmUgTUNGX0NDTV9DSVJfUElOKHgpICAgICAgICAoKCh4KSYweDAzRkYpPDw2KQorCisvKiBCaXQgZGVmaW5pdGlvbnMgYW5kIG1hY3JvcyBmb3IgTUNGX0NDTV9NSVNDQ1IgKi8KKyNkZWZpbmUgTUNGX0NDTV9NSVNDQ1JfVVNCU1JDICAgICAoMHgwMDAxKQorI2RlZmluZSBNQ0ZfQ0NNX01JU0NDUl9VU0JESVYgICAgICgweDAwMDIpCisjZGVmaW5lIE1DRl9DQ01fTUlTQ0NSX1NTSV9TUkMgICAgKDB4MDAxMCkKKyNkZWZpbmUgTUNGX0NDTV9NSVNDQ1JfVElNX0RNQSAgICgweDAwMjApCisjZGVmaW5lIE1DRl9DQ01fTUlTQ0NSX1NTSV9QVVMgICAgKDB4MDA0MCkKKyNkZWZpbmUgTUNGX0NDTV9NSVNDQ1JfU1NJX1BVRSAgICAoMHgwMDgwKQorI2RlZmluZSBNQ0ZfQ0NNX01JU0NDUl9MQ0RfQ0hFTiAgICgweDAxMDApCisjZGVmaW5lIE1DRl9DQ01fTUlTQ0NSX0xJTVAgICAgICAgKDB4MTAwMCkKKyNkZWZpbmUgTUNGX0NDTV9NSVNDQ1JfUExMX0xPQ0sgICAoMHgyMDAwKQorCisvKiBCaXQgZGVmaW5pdGlvbnMgYW5kIG1hY3JvcyBmb3IgTUNGX0NDTV9DRFIgKi8KKyNkZWZpbmUgTUNGX0NDTV9DRFJfU1NJRElWKHgpICAgICAoKCh4KSYweDAwMEYpPDwwKQorI2RlZmluZSBNQ0ZfQ0NNX0NEUl9MUERJVih4KSAgICAgICgoKHgpJjB4MDAwRik8PDgpCisKKy8qIEJpdCBkZWZpbml0aW9ucyBhbmQgbWFjcm9zIGZvciBNQ0ZfQ0NNX1VIQ1NSICovCisjZGVmaW5lIE1DRl9DQ01fVUhDU1JfWFBERSAgICAgICAgKDB4MDAwMSkKKyNkZWZpbmUgTUNGX0NDTV9VSENTUl9VSE1JRSAgICAgICAoMHgwMDAyKQorI2RlZmluZSBNQ0ZfQ0NNX1VIQ1NSX1dLVVAgICAgICAgICgweDAwMDQpCisjZGVmaW5lIE1DRl9DQ01fVUhDU1JfUE9SVElORCh4KSAgKCgoeCkmMHgwMDAzKTw8MTQpCisKKy8qIEJpdCBkZWZpbml0aW9ucyBhbmQgbWFjcm9zIGZvciBNQ0ZfQ0NNX1VPQ1NSICovCisjZGVmaW5lIE1DRl9DQ01fVU9DU1JfWFBERSAgICAgICAgKDB4MDAwMSkKKyNkZWZpbmUgTUNGX0NDTV9VT0NTUl9VT01JRSAgICAgICAoMHgwMDAyKQorI2RlZmluZSBNQ0ZfQ0NNX1VPQ1NSX1dLVVAgICAgICAgICgweDAwMDQpCisjZGVmaW5lIE1DRl9DQ01fVU9DU1JfUFdSRkxUICAgICAgKDB4MDAwOCkKKyNkZWZpbmUgTUNGX0NDTV9VT0NTUl9TRU5EICAgICAgICAoMHgwMDEwKQorI2RlZmluZSBNQ0ZfQ0NNX1VPQ1NSX1ZWTEQgICAgICAgICgweDAwMjApCisjZGVmaW5lIE1DRl9DQ01fVU9DU1JfQlZMRCAgICAgICAgKDB4MDA0MCkKKyNkZWZpbmUgTUNGX0NDTV9VT0NTUl9BVkxEICAgICAgICAoMHgwMDgwKQorI2RlZmluZSBNQ0ZfQ0NNX1VPQ1NSX0RQUFUgICAgICAgICgweDAxMDApCisjZGVmaW5lIE1DRl9DQ01fVU9DU1JfRENSX1ZCVVMgICAgKDB4MDIwMCkKKyNkZWZpbmUgTUNGX0NDTV9VT0NTUl9DUkdfVkJVUyAgICAoMHgwNDAwKQorI2RlZmluZSBNQ0ZfQ0NNX1VPQ1NSX0RSVl9WQlVTICAgICgweDA4MDApCisjZGVmaW5lIE1DRl9DQ01fVU9DU1JfRE1QRCAgICAgICAgKDB4MTAwMCkKKyNkZWZpbmUgTUNGX0NDTV9VT0NTUl9EUFBEICAgICAgICAoMHgyMDAwKQorI2RlZmluZSBNQ0ZfQ0NNX1VPQ1NSX1BPUlRJTkQoeCkgICgoKHgpJjB4MDAwMyk8PDE0KQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRE1BIFRpbWVycyAoRFRJTSkKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBSZWdpc3RlciByZWFkL3dyaXRlIG1hY3JvcyAqLworI2RlZmluZSBNQ0ZfRFRJTTBfRFRNUiAgICAgICAgICAgTUNGX1JFRzE2KDB4RkMwNzAwMDApCisjZGVmaW5lIE1DRl9EVElNMF9EVFhNUiAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA3MDAwMikKKyNkZWZpbmUgTUNGX0RUSU0wX0RURVIgICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDcwMDAzKQorI2RlZmluZSBNQ0ZfRFRJTTBfRFRSUiAgICAgICAgICAgTUNGX1JFRzMyKDB4RkMwNzAwMDQpCisjZGVmaW5lIE1DRl9EVElNMF9EVENSICAgICAgICAgICBNQ0ZfUkVHMzIoMHhGQzA3MDAwOCkKKyNkZWZpbmUgTUNGX0RUSU0wX0RUQ04gICAgICAgICAgIE1DRl9SRUczMigweEZDMDcwMDBDKQorI2RlZmluZSBNQ0ZfRFRJTTFfRFRNUiAgICAgICAgICAgTUNGX1JFRzE2KDB4RkMwNzQwMDApCisjZGVmaW5lIE1DRl9EVElNMV9EVFhNUiAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA3NDAwMikKKyNkZWZpbmUgTUNGX0RUSU0xX0RURVIgICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDc0MDAzKQorI2RlZmluZSBNQ0ZfRFRJTTFfRFRSUiAgICAgICAgICAgTUNGX1JFRzMyKDB4RkMwNzQwMDQpCisjZGVmaW5lIE1DRl9EVElNMV9EVENSICAgICAgICAgICBNQ0ZfUkVHMzIoMHhGQzA3NDAwOCkKKyNkZWZpbmUgTUNGX0RUSU0xX0RUQ04gICAgICAgICAgIE1DRl9SRUczMigweEZDMDc0MDBDKQorI2RlZmluZSBNQ0ZfRFRJTTJfRFRNUiAgICAgICAgICAgTUNGX1JFRzE2KDB4RkMwNzgwMDApCisjZGVmaW5lIE1DRl9EVElNMl9EVFhNUiAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA3ODAwMikKKyNkZWZpbmUgTUNGX0RUSU0yX0RURVIgICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDc4MDAzKQorI2RlZmluZSBNQ0ZfRFRJTTJfRFRSUiAgICAgICAgICAgTUNGX1JFRzMyKDB4RkMwNzgwMDQpCisjZGVmaW5lIE1DRl9EVElNMl9EVENSICAgICAgICAgICBNQ0ZfUkVHMzIoMHhGQzA3ODAwOCkKKyNkZWZpbmUgTUNGX0RUSU0yX0RUQ04gICAgICAgICAgIE1DRl9SRUczMigweEZDMDc4MDBDKQorI2RlZmluZSBNQ0ZfRFRJTTNfRFRNUiAgICAgICAgICAgTUNGX1JFRzE2KDB4RkMwN0MwMDApCisjZGVmaW5lIE1DRl9EVElNM19EVFhNUiAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA3QzAwMikKKyNkZWZpbmUgTUNGX0RUSU0zX0RURVIgICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDdDMDAzKQorI2RlZmluZSBNQ0ZfRFRJTTNfRFRSUiAgICAgICAgICAgTUNGX1JFRzMyKDB4RkMwN0MwMDQpCisjZGVmaW5lIE1DRl9EVElNM19EVENSICAgICAgICAgICBNQ0ZfUkVHMzIoMHhGQzA3QzAwOCkKKyNkZWZpbmUgTUNGX0RUSU0zX0RUQ04gICAgICAgICAgIE1DRl9SRUczMigweEZDMDdDMDBDKQorI2RlZmluZSBNQ0ZfRFRJTV9EVE1SKHgpICAgICAgICAgTUNGX1JFRzE2KDB4RkMwNzAwMDArKCh4KSoweDQwMDApKQorI2RlZmluZSBNQ0ZfRFRJTV9EVFhNUih4KSAgICAgICAgTUNGX1JFRzA4KDB4RkMwNzAwMDIrKCh4KSoweDQwMDApKQorI2RlZmluZSBNQ0ZfRFRJTV9EVEVSKHgpICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNzAwMDMrKCh4KSoweDQwMDApKQorI2RlZmluZSBNQ0ZfRFRJTV9EVFJSKHgpICAgICAgICAgTUNGX1JFRzMyKDB4RkMwNzAwMDQrKCh4KSoweDQwMDApKQorI2RlZmluZSBNQ0ZfRFRJTV9EVENSKHgpICAgICAgICAgTUNGX1JFRzMyKDB4RkMwNzAwMDgrKCh4KSoweDQwMDApKQorI2RlZmluZSBNQ0ZfRFRJTV9EVENOKHgpICAgICAgICAgTUNGX1JFRzMyKDB4RkMwNzAwMEMrKCh4KSoweDQwMDApKQorCisvKiBCaXQgZGVmaW5pdGlvbnMgYW5kIG1hY3JvcyBmb3IgTUNGX0RUSU1fRFRNUiAqLworI2RlZmluZSBNQ0ZfRFRJTV9EVE1SX1JTVCAgICAgICAgKDB4MDAwMSkKKyNkZWZpbmUgTUNGX0RUSU1fRFRNUl9DTEsoeCkgICAgICgoKHgpJjB4MDAwMyk8PDEpCisjZGVmaW5lIE1DRl9EVElNX0RUTVJfRlJSICAgICAgICAoMHgwMDA4KQorI2RlZmluZSBNQ0ZfRFRJTV9EVE1SX09SUkkgICAgICAgKDB4MDAxMCkKKyNkZWZpbmUgTUNGX0RUSU1fRFRNUl9PTSAgICAgICAgICgweDAwMjApCisjZGVmaW5lIE1DRl9EVElNX0RUTVJfQ0UoeCkgICAgICAoKCh4KSYweDAwMDMpPDw2KQorI2RlZmluZSBNQ0ZfRFRJTV9EVE1SX1BTKHgpICAgICAgKCgoeCkmMHgwMEZGKTw8OCkKKyNkZWZpbmUgTUNGX0RUSU1fRFRNUl9DRV9BTlkgICAgICgweDAwQzApCisjZGVmaW5lIE1DRl9EVElNX0RUTVJfQ0VfRkFMTCAgICAoMHgwMDgwKQorI2RlZmluZSBNQ0ZfRFRJTV9EVE1SX0NFX1JJU0UgICAgKDB4MDA0MCkKKyNkZWZpbmUgTUNGX0RUSU1fRFRNUl9DRV9OT05FICAgICgweDAwMDApCisjZGVmaW5lIE1DRl9EVElNX0RUTVJfQ0xLX0RUSU4gICAoMHgwMDA2KQorI2RlZmluZSBNQ0ZfRFRJTV9EVE1SX0NMS19ESVYxNiAgKDB4MDAwNCkKKyNkZWZpbmUgTUNGX0RUSU1fRFRNUl9DTEtfRElWMSAgICgweDAwMDIpCisjZGVmaW5lIE1DRl9EVElNX0RUTVJfQ0xLX1NUT1AgICAoMHgwMDAwKQorCisvKiBCaXQgZGVmaW5pdGlvbnMgYW5kIG1hY3JvcyBmb3IgTUNGX0RUSU1fRFRYTVIgKi8KKyNkZWZpbmUgTUNGX0RUSU1fRFRYTVJfTU9ERTE2ICAgICgweDAxKQorI2RlZmluZSBNQ0ZfRFRJTV9EVFhNUl9ETUFFTiAgICAgKDB4ODApCisKKy8qIEJpdCBkZWZpbml0aW9ucyBhbmQgbWFjcm9zIGZvciBNQ0ZfRFRJTV9EVEVSICovCisjZGVmaW5lIE1DRl9EVElNX0RURVJfQ0FQICAgICAgICAoMHgwMSkKKyNkZWZpbmUgTUNGX0RUSU1fRFRFUl9SRUYgICAgICAgICgweDAyKQorCisvKiBCaXQgZGVmaW5pdGlvbnMgYW5kIG1hY3JvcyBmb3IgTUNGX0RUSU1fRFRSUiAqLworI2RlZmluZSBNQ0ZfRFRJTV9EVFJSX1JFRih4KSAgICAgKCgoeCkmMHhGRkZGRkZGRik8PDApCisKKy8qIEJpdCBkZWZpbml0aW9ucyBhbmQgbWFjcm9zIGZvciBNQ0ZfRFRJTV9EVENSICovCisjZGVmaW5lIE1DRl9EVElNX0RUQ1JfQ0FQKHgpICAgICAoKCh4KSYweEZGRkZGRkZGKTw8MCkKKworLyogQml0IGRlZmluaXRpb25zIGFuZCBtYWNyb3MgZm9yIE1DRl9EVElNX0RUQ04gKi8KKyNkZWZpbmUgTUNGX0RUSU1fRFRDTl9DTlQoeCkgICAgICgoKHgpJjB4RkZGRkZGRkYpPDwwKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRmxleEJ1cyBDaGlwIFNlbGVjdHMgKEZCQ1MpCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogUmVnaXN0ZXIgcmVhZC93cml0ZSBtYWNyb3MgKi8KKyNkZWZpbmUgTUNGX0ZCQ1MwX0NTQVIJCU1DRl9SRUczMigweEZDMDA4MDAwKQorI2RlZmluZSBNQ0ZfRkJDUzBfQ1NNUgkJTUNGX1JFRzMyKDB4RkMwMDgwMDQpCisjZGVmaW5lIE1DRl9GQkNTMF9DU0NSCQlNQ0ZfUkVHMzIoMHhGQzAwODAwOCkKKyNkZWZpbmUgTUNGX0ZCQ1MxX0NTQVIJCU1DRl9SRUczMigweEZDMDA4MDBDKQorI2RlZmluZSBNQ0ZfRkJDUzFfQ1NNUgkJTUNGX1JFRzMyKDB4RkMwMDgwMTApCisjZGVmaW5lIE1DRl9GQkNTMV9DU0NSCQlNQ0ZfUkVHMzIoMHhGQzAwODAxNCkKKyNkZWZpbmUgTUNGX0ZCQ1MyX0NTQVIJCU1DRl9SRUczMigweEZDMDA4MDE4KQorI2RlZmluZSBNQ0ZfRkJDUzJfQ1NNUgkJTUNGX1JFRzMyKDB4RkMwMDgwMUMpCisjZGVmaW5lIE1DRl9GQkNTMl9DU0NSCQlNQ0ZfUkVHMzIoMHhGQzAwODAyMCkKKyNkZWZpbmUgTUNGX0ZCQ1MzX0NTQVIJCU1DRl9SRUczMigweEZDMDA4MDI0KQorI2RlZmluZSBNQ0ZfRkJDUzNfQ1NNUgkJTUNGX1JFRzMyKDB4RkMwMDgwMjgpCisjZGVmaW5lIE1DRl9GQkNTM19DU0NSCQlNQ0ZfUkVHMzIoMHhGQzAwODAyQykKKyNkZWZpbmUgTUNGX0ZCQ1M0X0NTQVIJCU1DRl9SRUczMigweEZDMDA4MDMwKQorI2RlZmluZSBNQ0ZfRkJDUzRfQ1NNUgkJTUNGX1JFRzMyKDB4RkMwMDgwMzQpCisjZGVmaW5lIE1DRl9GQkNTNF9DU0NSCQlNQ0ZfUkVHMzIoMHhGQzAwODAzOCkKKyNkZWZpbmUgTUNGX0ZCQ1M1X0NTQVIJCU1DRl9SRUczMigweEZDMDA4MDNDKQorI2RlZmluZSBNQ0ZfRkJDUzVfQ1NNUgkJTUNGX1JFRzMyKDB4RkMwMDgwNDApCisjZGVmaW5lIE1DRl9GQkNTNV9DU0NSCQlNQ0ZfUkVHMzIoMHhGQzAwODA0NCkKKyNkZWZpbmUgTUNGX0ZCQ1NfQ1NBUih4KQlNQ0ZfUkVHMzIoMHhGQzAwODAwMCsoKHgpKjB4MDBDKSkKKyNkZWZpbmUgTUNGX0ZCQ1NfQ1NNUih4KQlNQ0ZfUkVHMzIoMHhGQzAwODAwNCsoKHgpKjB4MDBDKSkKKyNkZWZpbmUgTUNGX0ZCQ1NfQ1NDUih4KQlNQ0ZfUkVHMzIoMHhGQzAwODAwOCsoKHgpKjB4MDBDKSkKKworLyogQml0IGRlZmluaXRpb25zIGFuZCBtYWNyb3MgZm9yIE1DRl9GQkNTX0NTQVIgKi8KKyNkZWZpbmUgTUNGX0ZCQ1NfQ1NBUl9CQSh4KQkoKHgpJjB4RkZGRjAwMDApCisKKy8qIEJpdCBkZWZpbml0aW9ucyBhbmQgbWFjcm9zIGZvciBNQ0ZfRkJDU19DU01SICovCisjZGVmaW5lIE1DRl9GQkNTX0NTTVJfVgkJKDB4MDAwMDAwMDEpCisjZGVmaW5lIE1DRl9GQkNTX0NTTVJfV1AJKDB4MDAwMDAxMDApCisjZGVmaW5lIE1DRl9GQkNTX0NTTVJfQkFNKHgpCSgoKHgpJjB4MDAwMEZGRkYpPDwxNikKKyNkZWZpbmUgTUNGX0ZCQ1NfQ1NNUl9CQU1fNEcJKDB4RkZGRjAwMDApCisjZGVmaW5lIE1DRl9GQkNTX0NTTVJfQkFNXzJHCSgweDdGRkYwMDAwKQorI2RlZmluZSBNQ0ZfRkJDU19DU01SX0JBTV8xRwkoMHgzRkZGMDAwMCkKKyNkZWZpbmUgTUNGX0ZCQ1NfQ1NNUl9CQU1fMTAyNE0JKDB4M0ZGRjAwMDApCisjZGVmaW5lIE1DRl9GQkNTX0NTTVJfQkFNXzUxMk0JKDB4MUZGRjAwMDApCisjZGVmaW5lIE1DRl9GQkNTX0NTTVJfQkFNXzI1Nk0JKDB4MEZGRjAwMDApCisjZGVmaW5lIE1DRl9GQkNTX0NTTVJfQkFNXzEyOE0JKDB4MDdGRjAwMDApCisjZGVmaW5lIE1DRl9GQkNTX0NTTVJfQkFNXzY0TQkoMHgwM0ZGMDAwMCkKKyNkZWZpbmUgTUNGX0ZCQ1NfQ1NNUl9CQU1fMzJNCSgweDAxRkYwMDAwKQorI2RlZmluZSBNQ0ZfRkJDU19DU01SX0JBTV8xNk0JKDB4MDBGRjAwMDApCisjZGVmaW5lIE1DRl9GQkNTX0NTTVJfQkFNXzhNCSgweDAwN0YwMDAwKQorI2RlZmluZSBNQ0ZfRkJDU19DU01SX0JBTV80TQkoMHgwMDNGMDAwMCkKKyNkZWZpbmUgTUNGX0ZCQ1NfQ1NNUl9CQU1fMk0JKDB4MDAxRjAwMDApCisjZGVmaW5lIE1DRl9GQkNTX0NTTVJfQkFNXzFNCSgweDAwMEYwMDAwKQorI2RlZmluZSBNQ0ZfRkJDU19DU01SX0JBTV8xMDI0SwkoMHgwMDBGMDAwMCkKKyNkZWZpbmUgTUNGX0ZCQ1NfQ1NNUl9CQU1fNTEySwkoMHgwMDA3MDAwMCkKKyNkZWZpbmUgTUNGX0ZCQ1NfQ1NNUl9CQU1fMjU2SwkoMHgwMDAzMDAwMCkKKyNkZWZpbmUgTUNGX0ZCQ1NfQ1NNUl9CQU1fMTI4SwkoMHgwMDAxMDAwMCkKKyNkZWZpbmUgTUNGX0ZCQ1NfQ1NNUl9CQU1fNjRLCSgweDAwMDAwMDAwKQorCisvKiBCaXQgZGVmaW5pdGlvbnMgYW5kIG1hY3JvcyBmb3IgTUNGX0ZCQ1NfQ1NDUiAqLworI2RlZmluZSBNQ0ZfRkJDU19DU0NSX0JTVFcJKDB4MDAwMDAwMDgpCisjZGVmaW5lIE1DRl9GQkNTX0NTQ1JfQlNUUgkoMHgwMDAwMDAxMCkKKyNkZWZpbmUgTUNGX0ZCQ1NfQ1NDUl9CRU0JKDB4MDAwMDAwMjApCisjZGVmaW5lIE1DRl9GQkNTX0NTQ1JfUFMoeCkJKCgoeCkmMHgwMDAwMDAwMyk8PDYpCisjZGVmaW5lIE1DRl9GQkNTX0NTQ1JfQUEJKDB4MDAwMDAxMDApCisjZGVmaW5lIE1DRl9GQkNTX0NTQ1JfU0JNCSgweDAwMDAwMjAwKQorI2RlZmluZSBNQ0ZfRkJDU19DU0NSX1dTKHgpCSgoKHgpJjB4MDAwMDAwM0YpPDwxMCkKKyNkZWZpbmUgTUNGX0ZCQ1NfQ1NDUl9XUkFIKHgpCSgoKHgpJjB4MDAwMDAwMDMpPDwxNikKKyNkZWZpbmUgTUNGX0ZCQ1NfQ1NDUl9SREFIKHgpCSgoKHgpJjB4MDAwMDAwMDMpPDwxOCkKKyNkZWZpbmUgTUNGX0ZCQ1NfQ1NDUl9BU0VUKHgpCSgoKHgpJjB4MDAwMDAwMDMpPDwyMCkKKyNkZWZpbmUgTUNGX0ZCQ1NfQ1NDUl9TV1NFTgkoMHgwMDgwMDAwMCkKKyNkZWZpbmUgTUNGX0ZCQ1NfQ1NDUl9TV1MoeCkJKCgoeCkmMHgwMDAwMDAzRik8PDI2KQorI2RlZmluZSBNQ0ZfRkJDU19DU0NSX1BTXzgJKDB4MDA0MCkKKyNkZWZpbmUgTUNGX0ZCQ1NfQ1NDUl9QU18xNgkoMHgwMDgwKQorI2RlZmluZSBNQ0ZfRkJDU19DU0NSX1BTXzMyCSgweDAwMDApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBHZW5lcmFsIFB1cnBvc2UgSS9PIChHUElPKQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFJlZ2lzdGVyIHJlYWQvd3JpdGUgbWFjcm9zICovCisjZGVmaW5lIE1DRl9HUElPX1BPRFJfRkVDSAkJTUNGX1JFRzA4KDB4RkMwQTQwMDApCisjZGVmaW5lIE1DRl9HUElPX1BPRFJfRkVDTAkJTUNGX1JFRzA4KDB4RkMwQTQwMDEpCisjZGVmaW5lIE1DRl9HUElPX1BPRFJfU1NJCQlNQ0ZfUkVHMDgoMHhGQzBBNDAwMikKKyNkZWZpbmUgTUNGX0dQSU9fUE9EUl9CVVNDVEwJCU1DRl9SRUcwOCgweEZDMEE0MDAzKQorI2RlZmluZSBNQ0ZfR1BJT19QT0RSX0JFCQlNQ0ZfUkVHMDgoMHhGQzBBNDAwNCkKKyNkZWZpbmUgTUNGX0dQSU9fUE9EUl9DUwkJTUNGX1JFRzA4KDB4RkMwQTQwMDUpCisjZGVmaW5lIE1DRl9HUElPX1BPRFJfUFdNCQlNQ0ZfUkVHMDgoMHhGQzBBNDAwNikKKyNkZWZpbmUgTUNGX0dQSU9fUE9EUl9GRUNJMkMJCU1DRl9SRUcwOCgweEZDMEE0MDA3KQorI2RlZmluZSBNQ0ZfR1BJT19QT0RSX1VBUlQJCU1DRl9SRUcwOCgweEZDMEE0MDA5KQorI2RlZmluZSBNQ0ZfR1BJT19QT0RSX1FTUEkJCU1DRl9SRUcwOCgweEZDMEE0MDBBKQorI2RlZmluZSBNQ0ZfR1BJT19QT0RSX1RJTUVSCQlNQ0ZfUkVHMDgoMHhGQzBBNDAwQikKKyNkZWZpbmUgTUNGX0dQSU9fUE9EUl9MQ0REQVRBSAkJTUNGX1JFRzA4KDB4RkMwQTQwMEQpCisjZGVmaW5lIE1DRl9HUElPX1BPRFJfTENEREFUQU0JCU1DRl9SRUcwOCgweEZDMEE0MDBFKQorI2RlZmluZSBNQ0ZfR1BJT19QT0RSX0xDRERBVEFMCQlNQ0ZfUkVHMDgoMHhGQzBBNDAwRikKKyNkZWZpbmUgTUNGX0dQSU9fUE9EUl9MQ0RDVExICQlNQ0ZfUkVHMDgoMHhGQzBBNDAxMCkKKyNkZWZpbmUgTUNGX0dQSU9fUE9EUl9MQ0RDVExMCQlNQ0ZfUkVHMDgoMHhGQzBBNDAxMSkKKyNkZWZpbmUgTUNGX0dQSU9fUEREUl9GRUNICQlNQ0ZfUkVHMDgoMHhGQzBBNDAxNCkKKyNkZWZpbmUgTUNGX0dQSU9fUEREUl9GRUNMCQlNQ0ZfUkVHMDgoMHhGQzBBNDAxNSkKKyNkZWZpbmUgTUNGX0dQSU9fUEREUl9TU0kJCU1DRl9SRUcwOCgweEZDMEE0MDE2KQorI2RlZmluZSBNQ0ZfR1BJT19QRERSX0JVU0NUTAkJTUNGX1JFRzA4KDB4RkMwQTQwMTcpCisjZGVmaW5lIE1DRl9HUElPX1BERFJfQkUJCU1DRl9SRUcwOCgweEZDMEE0MDE4KQorI2RlZmluZSBNQ0ZfR1BJT19QRERSX0NTCQlNQ0ZfUkVHMDgoMHhGQzBBNDAxOSkKKyNkZWZpbmUgTUNGX0dQSU9fUEREUl9QV00JCU1DRl9SRUcwOCgweEZDMEE0MDFBKQorI2RlZmluZSBNQ0ZfR1BJT19QRERSX0ZFQ0kyQwkJTUNGX1JFRzA4KDB4RkMwQTQwMUIpCisjZGVmaW5lIE1DRl9HUElPX1BERFJfVUFSVAkJTUNGX1JFRzA4KDB4RkMwQTQwMUMpCisjZGVmaW5lIE1DRl9HUElPX1BERFJfUVNQSQkJTUNGX1JFRzA4KDB4RkMwQTQwMUUpCisjZGVmaW5lIE1DRl9HUElPX1BERFJfVElNRVIJCU1DRl9SRUcwOCgweEZDMEE0MDFGKQorI2RlZmluZSBNQ0ZfR1BJT19QRERSX0xDRERBVEFICQlNQ0ZfUkVHMDgoMHhGQzBBNDAyMSkKKyNkZWZpbmUgTUNGX0dQSU9fUEREUl9MQ0REQVRBTQkJTUNGX1JFRzA4KDB4RkMwQTQwMjIpCisjZGVmaW5lIE1DRl9HUElPX1BERFJfTENEREFUQUwJCU1DRl9SRUcwOCgweEZDMEE0MDIzKQorI2RlZmluZSBNQ0ZfR1BJT19QRERSX0xDRENUTEgJCU1DRl9SRUcwOCgweEZDMEE0MDI0KQorI2RlZmluZSBNQ0ZfR1BJT19QRERSX0xDRENUTEwJCU1DRl9SRUcwOCgweEZDMEE0MDI1KQorI2RlZmluZSBNQ0ZfR1BJT19QUERTRFJfRkVDSAkJTUNGX1JFRzA4KDB4RkMwQTQwMjgpCisjZGVmaW5lIE1DRl9HUElPX1BQRFNEUl9GRUNMCQlNQ0ZfUkVHMDgoMHhGQzBBNDAyOSkKKyNkZWZpbmUgTUNGX0dQSU9fUFBEU0RSX1NTSQkJTUNGX1JFRzA4KDB4RkMwQTQwMkEpCisjZGVmaW5lIE1DRl9HUElPX1BQRFNEUl9CVVNDVEwJCU1DRl9SRUcwOCgweEZDMEE0MDJCKQorI2RlZmluZSBNQ0ZfR1BJT19QUERTRFJfQkUJCU1DRl9SRUcwOCgweEZDMEE0MDJDKQorI2RlZmluZSBNQ0ZfR1BJT19QUERTRFJfQ1MJCU1DRl9SRUcwOCgweEZDMEE0MDJEKQorI2RlZmluZSBNQ0ZfR1BJT19QUERTRFJfUFdNCQlNQ0ZfUkVHMDgoMHhGQzBBNDAyRSkKKyNkZWZpbmUgTUNGX0dQSU9fUFBEU0RSX0ZFQ0kyQwkJTUNGX1JFRzA4KDB4RkMwQTQwMkYpCisjZGVmaW5lIE1DRl9HUElPX1BQRFNEUl9VQVJUCQlNQ0ZfUkVHMDgoMHhGQzBBNDAzMSkKKyNkZWZpbmUgTUNGX0dQSU9fUFBEU0RSX1FTUEkJCU1DRl9SRUcwOCgweEZDMEE0MDMyKQorI2RlZmluZSBNQ0ZfR1BJT19QUERTRFJfVElNRVIJCU1DRl9SRUcwOCgweEZDMEE0MDMzKQorI2RlZmluZSBNQ0ZfR1BJT19QUERTRFJfTENEREFUQUgJTUNGX1JFRzA4KDB4RkMwQTQwMzUpCisjZGVmaW5lIE1DRl9HUElPX1BQRFNEUl9MQ0REQVRBTQlNQ0ZfUkVHMDgoMHhGQzBBNDAzNikKKyNkZWZpbmUgTUNGX0dQSU9fUFBEU0RSX0xDRERBVEFMCU1DRl9SRUcwOCgweEZDMEE0MDM3KQorI2RlZmluZSBNQ0ZfR1BJT19QUERTRFJfTENEQ1RMSAkJTUNGX1JFRzA4KDB4RkMwQTQwMzgpCisjZGVmaW5lIE1DRl9HUElPX1BQRFNEUl9MQ0RDVExMCQlNQ0ZfUkVHMDgoMHhGQzBBNDAzOSkKKyNkZWZpbmUgTUNGX0dQSU9fUENMUlJfRkVDSAkJTUNGX1JFRzA4KDB4RkMwQTQwM0MpCisjZGVmaW5lIE1DRl9HUElPX1BDTFJSX0ZFQ0wJCU1DRl9SRUcwOCgweEZDMEE0MDNEKQorI2RlZmluZSBNQ0ZfR1BJT19QQ0xSUl9TU0kJCU1DRl9SRUcwOCgweEZDMEE0MDNFKQorI2RlZmluZSBNQ0ZfR1BJT19QQ0xSUl9CVVNDVEwJCU1DRl9SRUcwOCgweEZDMEE0MDNGKQorI2RlZmluZSBNQ0ZfR1BJT19QQ0xSUl9CRQkJTUNGX1JFRzA4KDB4RkMwQTQwNDApCisjZGVmaW5lIE1DRl9HUElPX1BDTFJSX0NTCQlNQ0ZfUkVHMDgoMHhGQzBBNDA0MSkKKyNkZWZpbmUgTUNGX0dQSU9fUENMUlJfUFdNCQlNQ0ZfUkVHMDgoMHhGQzBBNDA0MikKKyNkZWZpbmUgTUNGX0dQSU9fUENMUlJfRkVDSTJDCQlNQ0ZfUkVHMDgoMHhGQzBBNDA0MykKKyNkZWZpbmUgTUNGX0dQSU9fUENMUlJfVUFSVAkJTUNGX1JFRzA4KDB4RkMwQTQwNDUpCisjZGVmaW5lIE1DRl9HUElPX1BDTFJSX1FTUEkJCU1DRl9SRUcwOCgweEZDMEE0MDQ2KQorI2RlZmluZSBNQ0ZfR1BJT19QQ0xSUl9USU1FUgkJTUNGX1JFRzA4KDB4RkMwQTQwNDcpCisjZGVmaW5lIE1DRl9HUElPX1BDTFJSX0xDRERBVEFICQlNQ0ZfUkVHMDgoMHhGQzBBNDA0OSkKKyNkZWZpbmUgTUNGX0dQSU9fUENMUlJfTENEREFUQU0JCU1DRl9SRUcwOCgweEZDMEE0MDRBKQorI2RlZmluZSBNQ0ZfR1BJT19QQ0xSUl9MQ0REQVRBTAkJTUNGX1JFRzA4KDB4RkMwQTQwNEIpCisjZGVmaW5lIE1DRl9HUElPX1BDTFJSX0xDRENUTEgJCU1DRl9SRUcwOCgweEZDMEE0MDRDKQorI2RlZmluZSBNQ0ZfR1BJT19QQ0xSUl9MQ0RDVExMCQlNQ0ZfUkVHMDgoMHhGQzBBNDA0RCkKKyNkZWZpbmUgTUNGX0dQSU9fUEFSX0ZFQwkJTUNGX1JFRzA4KDB4RkMwQTQwNTApCisjZGVmaW5lIE1DRl9HUElPX1BBUl9QV00JCU1DRl9SRUcwOCgweEZDMEE0MDUxKQorI2RlZmluZSBNQ0ZfR1BJT19QQVJfQlVTQ1RMCQlNQ0ZfUkVHMDgoMHhGQzBBNDA1MikKKyNkZWZpbmUgTUNGX0dQSU9fUEFSX0ZFQ0kyQwkJTUNGX1JFRzA4KDB4RkMwQTQwNTMpCisjZGVmaW5lIE1DRl9HUElPX1BBUl9CRQkJCU1DRl9SRUcwOCgweEZDMEE0MDU0KQorI2RlZmluZSBNQ0ZfR1BJT19QQVJfQ1MJCQlNQ0ZfUkVHMDgoMHhGQzBBNDA1NSkKKyNkZWZpbmUgTUNGX0dQSU9fUEFSX1NTSQkJTUNGX1JFRzE2KDB4RkMwQTQwNTYpCisjZGVmaW5lIE1DRl9HUElPX1BBUl9VQVJUCQlNQ0ZfUkVHMTYoMHhGQzBBNDA1OCkKKyNkZWZpbmUgTUNGX0dQSU9fUEFSX1FTUEkJCU1DRl9SRUcxNigweEZDMEE0MDVBKQorI2RlZmluZSBNQ0ZfR1BJT19QQVJfVElNRVIJCU1DRl9SRUcwOCgweEZDMEE0MDVDKQorI2RlZmluZSBNQ0ZfR1BJT19QQVJfTENEREFUQQkJTUNGX1JFRzA4KDB4RkMwQTQwNUQpCisjZGVmaW5lIE1DRl9HUElPX1BBUl9MQ0RDVEwJCU1DRl9SRUcxNigweEZDMEE0MDVFKQorI2RlZmluZSBNQ0ZfR1BJT19QQVJfSVJRCQlNQ0ZfUkVHMTYoMHhGQzBBNDA2MCkKKyNkZWZpbmUgTUNGX0dQSU9fTVNDUl9GTEVYQlVTCQlNQ0ZfUkVHMDgoMHhGQzBBNDA2NCkKKyNkZWZpbmUgTUNGX0dQSU9fTVNDUl9TRFJBTQkJTUNGX1JFRzA4KDB4RkMwQTQwNjUpCisjZGVmaW5lIE1DRl9HUElPX0RTQ1JfSTJDCQlNQ0ZfUkVHMDgoMHhGQzBBNDA2OCkKKyNkZWZpbmUgTUNGX0dQSU9fRFNDUl9QV00JCU1DRl9SRUcwOCgweEZDMEE0MDY5KQorI2RlZmluZSBNQ0ZfR1BJT19EU0NSX0ZFQwkJTUNGX1JFRzA4KDB4RkMwQTQwNkEpCisjZGVmaW5lIE1DRl9HUElPX0RTQ1JfVUFSVAkJTUNGX1JFRzA4KDB4RkMwQTQwNkIpCisjZGVmaW5lIE1DRl9HUElPX0RTQ1JfUVNQSQkJTUNGX1JFRzA4KDB4RkMwQTQwNkMpCisjZGVmaW5lIE1DRl9HUElPX0RTQ1JfVElNRVIJCU1DRl9SRUcwOCgweEZDMEE0MDZEKQorI2RlZmluZSBNQ0ZfR1BJT19EU0NSX1NTSQkJTUNGX1JFRzA4KDB4RkMwQTQwNkUpCisjZGVmaW5lIE1DRl9HUElPX0RTQ1JfTENECQlNQ0ZfUkVHMDgoMHhGQzBBNDA2RikKKyNkZWZpbmUgTUNGX0dQSU9fRFNDUl9ERUJVRwkJTUNGX1JFRzA4KDB4RkMwQTQwNzApCisjZGVmaW5lIE1DRl9HUElPX0RTQ1JfQ0xLUlNUCQlNQ0ZfUkVHMDgoMHhGQzBBNDA3MSkKKyNkZWZpbmUgTUNGX0dQSU9fRFNDUl9JUlEJCU1DRl9SRUcwOCgweEZDMEE0MDcyKQorCisvKiBCaXQgZGVmaW5pdGlvbnMgYW5kIG1hY3JvcyBmb3IgTUNGX0dQSU9fUE9EUl9GRUNIICovCisjZGVmaW5lIE1DRl9HUElPX1BPRFJfRkVDSF9QT0RSX0ZFQ0gwICAgICAgICAgICAgICAoMHgwMSkKKyNkZWZpbmUgTUNGX0dQSU9fUE9EUl9GRUNIX1BPRFJfRkVDSDEgICAgICAgICAgICAgICgweDAyKQorI2RlZmluZSBNQ0ZfR1BJT19QT0RSX0ZFQ0hfUE9EUl9GRUNIMiAgICAgICAgICAgICAgKDB4MDQpCisjZGVmaW5lIE1DRl9HUElPX1BPRFJfRkVDSF9QT0RSX0ZFQ0gzICAgICAgICAgICAgICAoMHgwOCkKKyNkZWZpbmUgTUNGX0dQSU9fUE9EUl9GRUNIX1BPRFJfRkVDSDQgICAgICAgICAgICAgICgweDEwKQorI2RlZmluZSBNQ0ZfR1BJT19QT0RSX0ZFQ0hfUE9EUl9GRUNINSAgICAgICAgICAgICAgKDB4MjApCisjZGVmaW5lIE1DRl9HUElPX1BPRFJfRkVDSF9QT0RSX0ZFQ0g2ICAgICAgICAgICAgICAoMHg0MCkKKyNkZWZpbmUgTUNGX0dQSU9fUE9EUl9GRUNIX1BPRFJfRkVDSDcgICAgICAgICAgICAgICgweDgwKQorCisvKiBCaXQgZGVmaW5pdGlvbnMgYW5kIG1hY3JvcyBmb3IgTUNGX0dQSU9fUE9EUl9GRUNMICovCisjZGVmaW5lIE1DRl9HUElPX1BPRFJfRkVDTF9QT0RSX0ZFQ0wwICAgICAgICAgICAgICAoMHgwMSkKKyNkZWZpbmUgTUNGX0dQSU9fUE9EUl9GRUNMX1BPRFJfRkVDTDEgICAgICAgICAgICAgICgweDAyKQorI2RlZmluZSBNQ0ZfR1BJT19QT0RSX0ZFQ0xfUE9EUl9GRUNMMiAgICAgICAgICAgICAgKDB4MDQpCisjZGVmaW5lIE1DRl9HUElPX1BPRFJfRkVDTF9QT0RSX0ZFQ0wzICAgICAgICAgICAgICAoMHgwOCkKKyNkZWZpbmUgTUNGX0dQSU9fUE9EUl9GRUNMX1BPRFJfRkVDTDQgICAgICAgICAgICAgICgweDEwKQorI2RlZmluZSBNQ0ZfR1BJT19QT0RSX0ZFQ0xfUE9EUl9GRUNMNSAgICAgICAgICAgICAgKDB4MjApCisjZGVmaW5lIE1DRl9HUElPX1BPRFJfRkVDTF9QT0RSX0ZFQ0w2ICAgICAgICAgICAgICAoMHg0MCkKKyNkZWZpbmUgTUNGX0dQSU9fUE9EUl9GRUNMX1BPRFJfRkVDTDcgICAgICAgICAgICAgICgweDgwKQorCisvKiBCaXQgZGVmaW5pdGlvbnMgYW5kIG1hY3JvcyBmb3IgTUNGX0dQSU9fUE9EUl9TU0kgKi8KKyNkZWZpbmUgTUNGX0dQSU9fUE9EUl9TU0lfUE9EUl9TU0kwICAgICAgICAgICAgICAgICgweDAxKQorI2RlZmluZSBNQ0ZfR1BJT19QT0RSX1NTSV9QT0RSX1NTSTEgICAgICAgICAgICAgICAgKDB4MDIpCisjZGVmaW5lIE1DRl9HUElPX1BPRFJfU1NJX1BPRFJfU1NJMiAgICAgICAgICAgICAgICAoMHgwNCkKKyNkZWZpbmUgTUNGX0dQSU9fUE9EUl9TU0lfUE9EUl9TU0kzICAgICAgICAgICAgICAgICgweDA4KQorI2RlZmluZSBNQ0ZfR1BJT19QT0RSX1NTSV9QT0RSX1NTSTQgICAgICAgICAgICAgICAgKDB4MTApCisKKy8qIEJpdCBkZWZpbml0aW9ucyBhbmQgbWFjcm9zIGZvciBNQ0ZfR1BJT19QT0RSX0JVU0NUTCAqLworI2RlZmluZSBNQ0ZfR1BJT19QT0RSX0JVU0NUTF9QT1NEUl9CVVNDVEwwICAgICAgICAgKDB4MDEpCisjZGVmaW5lIE1DRl9HUElPX1BPRFJfQlVTQ1RMX1BPRFJfQlVTQ1RMMSAgICAgICAgICAoMHgwMikKKyNkZWZpbmUgTUNGX0dQSU9fUE9EUl9CVVNDVExfUE9EUl9CVVNDVEwyICAgICAgICAgICgweDA0KQorI2RlZmluZSBNQ0ZfR1BJT19QT0RSX0JVU0NUTF9QT0RSX0JVU0NUTDMgICAgICAgICAgKDB4MDgpCisKKy8qIEJpdCBkZWZpbml0aW9ucyBhbmQgbWFjcm9zIGZvciBNQ0ZfR1BJT19QT0RSX0JFICovCisjZGVmaW5lIE1DRl9HUElPX1BPRFJfQkVfUE9EUl9CRTAgICAgICAgICAgICAgICAgICAoMHgwMSkKKyNkZWZpbmUgTUNGX0dQSU9fUE9EUl9CRV9QT0RSX0JFMSAgICAgICAgICAgICAgICAgICgweDAyKQorI2RlZmluZSBNQ0ZfR1BJT19QT0RSX0JFX1BPRFJfQkUyICAgICAgICAgICAgICAgICAgKDB4MDQpCisjZGVmaW5lIE1DRl9HUElPX1BPRFJfQkVfUE9EUl9CRTMgICAgICAgICAgICAgICAgICAoMHgwOCkKKworLyogQml0IGRlZmluaXRpb25zIGFuZCBtYWNyb3MgZm9yIE1DRl9HUElPX1BPRFJfQ1MgKi8KKyNkZWZpbmUgTUNGX0dQSU9fUE9EUl9DU19QT0RSX0NTMSAgICAgICAgICAgICAgICAgICgweDAyKQorI2RlZmluZSBNQ0ZfR1BJT19QT0RSX0NTX1BPRFJfQ1MyICAgICAgICAgICAgICAgICAgKDB4MDQpCisjZGVmaW5lIE1DRl9HUElPX1BPRFJfQ1NfUE9EUl9DUzMgICAgICAgICAgICAgICAgICAoMHgwOCkKKyNkZWZpbmUgTUNGX0dQSU9fUE9EUl9DU19QT0RSX0NTNCAgICAgICAgICAgICAgICAgICgweDEwKQorI2RlZmluZSBNQ0ZfR1BJT19QT0RSX0NTX1BPRFJfQ1M1ICAgICAgICAgICAgICAgICAgKDB4MjApCisKKy8qIEJpdCBkZWZpbml0aW9ucyBhbmQgbWFjcm9zIGZvciBNQ0ZfR1BJT19QT0RSX1BXTSAqLworI2RlZmluZSBNQ0ZfR1BJT19QT0RSX1BXTV9QT0RSX1BXTTIgICAgICAgICAgICAgICAgKDB4MDQpCisjZGVmaW5lIE1DRl9HUElPX1BPRFJfUFdNX1BPRFJfUFdNMyAgICAgICAgICAgICAgICAoMHgwOCkKKyNkZWZpbmUgTUNGX0dQSU9fUE9EUl9QV01fUE9EUl9QV000ICAgICAgICAgICAgICAgICgweDEwKQorI2RlZmluZSBNQ0ZfR1BJT19QT0RSX1BXTV9QT0RSX1BXTTUgICAgICAgICAgICAgICAgKDB4MjApCisKKy8qIEJpdCBkZWZpbml0aW9ucyBhbmQgbWFjcm9zIGZvciBNQ0ZfR1BJT19QT0RSX0ZFQ0kyQyAqLworI2RlZmluZSBNQ0ZfR1BJT19QT0RSX0ZFQ0kyQ19QT0RSX0ZFQ0kyQzAgICAgICAgICAgKDB4MDEpCisjZGVmaW5lIE1DRl9HUElPX1BPRFJfRkVDSTJDX1BPRFJfRkVDSTJDMSAgICAgICAgICAoMHgwMikKKyNkZWZpbmUgTUNGX0dQSU9fUE9EUl9GRUNJMkNfUE9EUl9GRUNJMkMyICAgICAgICAgICgweDA0KQorI2RlZmluZSBNQ0ZfR1BJT19QT0RSX0ZFQ0kyQ19QT0RSX0ZFQ0kyQzMgICAgICAgICAgKDB4MDgpCisKKy8qIEJpdCBkZWZpbml0aW9ucyBhbmQgbWFjcm9zIGZvciBNQ0ZfR1BJT19QT0RSX1VBUlQgKi8KKyNkZWZpbmUgTUNGX0dQSU9fUE9EUl9VQVJUX1BPRFJfVUFSVDAgICAgICAgICAgICAgICgweDAxKQorI2RlZmluZSBNQ0ZfR1BJT19QT0RSX1VBUlRfUE9EUl9VQVJUMSAgICAgICAgICAgICAgKDB4MDIpCisjZGVmaW5lIE1DRl9HUElPX1BPRFJfVUFSVF9QT0RSX1VBUlQyICAgICAgICAgICAgICAoMHgwNCkKKyNkZWZpbmUgTUNGX0dQSU9fUE9EUl9VQVJUX1BPRFJfVUFSVDMgICAgICAgICAgICAgICgweDA4KQorI2RlZmluZSBNQ0ZfR1BJT19QT0RSX1VBUlRfUE9EUl9VQVJUNCAgICAgICAgICAgICAgKDB4MTApCisjZGVmaW5lIE1DRl9HUElPX1BPRFJfVUFSVF9QT0RSX1VBUlQ1ICAgICAgICAgICAgICAoMHgyMCkKKyNkZWZpbmUgTUNGX0dQSU9fUE9EUl9VQVJUX1BPRFJfVUFSVDYgICAgICAgICAgICAgICgweDQwKQorI2RlZmluZSBNQ0ZfR1BJT19QT0RSX1VBUlRfUE9EUl9VQVJUNyAgICAgICAgICAgICAgKDB4ODApCisKKy8qIEJpdCBkZWZpbml0aW9ucyBhbmQgbWFjcm9zIGZvciBNQ0ZfR1BJT19QT0RSX1FTUEkgKi8KKyNkZWZpbmUgTUNGX0dQSU9fUE9EUl9RU1BJX1BPRFJfUVNQSTAgICAgICAgICAgICAgICgweDAxKQorI2RlZmluZSBNQ0ZfR1BJT19QT0RSX1FTUElfUE9EUl9RU1BJMSAgICAgICAgICAgICAgKDB4MDIpCisjZGVmaW5lIE1DRl9HUElPX1BPRFJfUVNQSV9QT0RSX1FTUEkyICAgICAgICAgICAgICAoMHgwNCkKKyNkZWZpbmUgTUNGX0dQSU9fUE9EUl9RU1BJX1BPRFJfUVNQSTMgICAgICAgICAgICAgICgweDA4KQorI2RlZmluZSBNQ0ZfR1BJT19QT0RSX1FTUElfUE9EUl9RU1BJNCAgICAgICAgICAgICAgKDB4MTApCisjZGVmaW5lIE1DRl9HUElPX1BPRFJfUVNQSV9QT0RSX1FTUEk1ICAgICAgICAgICAgICAoMHgyMCkKKworLyogQml0IGRlZmluaXRpb25zIGFuZCBtYWNyb3MgZm9yIE1DRl9HUElPX1BPRFJfVElNRVIgKi8KKyNkZWZpbmUgTUNGX0dQSU9fUE9EUl9USU1FUl9QT0RSX1RJTUVSMCAgICAgICAgICAgICgweDAxKQorI2RlZmluZSBNQ0ZfR1BJT19QT0RSX1RJTUVSX1BPRFJfVElNRVIxICAgICAgICAgICAgKDB4MDIpCisjZGVmaW5lIE1DRl9HUElPX1BPRFJfVElNRVJfUE9EUl9USU1FUjIgICAgICAgICAgICAoMHgwNCkKKyNkZWZpbmUgTUNGX0dQSU9fUE9EUl9USU1FUl9QT0RSX1RJTUVSMyAgICAgICAgICAgICgweDA4KQorCisvKiBCaXQgZGVmaW5pdGlvbnMgYW5kIG1hY3JvcyBmb3IgTUNGX0dQSU9fUE9EUl9MQ0REQVRBSCAqLworI2RlZmluZSBNQ0ZfR1BJT19QT0RSX0xDRERBVEFIX1BPRFJfTENEREFUQUgwICAgICAgKDB4MDEpCisjZGVmaW5lIE1DRl9HUElPX1BPRFJfTENEREFUQUhfUE9EUl9MQ0REQVRBSDEgICAgICAoMHgwMikKKworLyogQml0IGRlZmluaXRpb25zIGFuZCBtYWNyb3MgZm9yIE1DRl9HUElPX1BPRFJfTENEREFUQU0gKi8KKyNkZWZpbmUgTUNGX0dQSU9fUE9EUl9MQ0REQVRBTV9QT0RSX0xDRERBVEFNMCAgICAgICgweDAxKQorI2RlZmluZSBNQ0ZfR1BJT19QT0RSX0xDRERBVEFNX1BPRFJfTENEREFUQU0xICAgICAgKDB4MDIpCisjZGVmaW5lIE1DRl9HUElPX1BPRFJfTENEREFUQU1fUE9EUl9MQ0REQVRBTTIgICAgICAoMHgwNCkKKyNkZWZpbmUgTUNGX0dQSU9fUE9EUl9MQ0REQVRBTV9QT0RSX0xDRERBVEFNMyAgICAgICgweDA4KQorI2RlZmluZSBNQ0ZfR1BJT19QT0RSX0xDRERBVEFNX1BPRFJfTENEREFUQU00ICAgICAgKDB4MTApCisjZGVmaW5lIE1DRl9HUElPX1BPRFJfTENEREFUQU1fUE9EUl9MQ0REQVRBTTUgICAgICAoMHgyMCkKKyNkZWZpbmUgTUNGX0dQSU9fUE9EUl9MQ0REQVRBTV9QT0RSX0xDRERBVEFNNiAgICAgICgweDQwKQorI2RlZmluZSBNQ0ZfR1BJT19QT0RSX0xDRERBVEFNX1BPRFJfTENEREFUQU03ICAgICAgKDB4ODApCisKKy8qIEJpdCBkZWZpbml0aW9ucyBhbmQgbWFjcm9zIGZvciBNQ0ZfR1BJT19QT0RSX0xDRERBVEFMICovCisjZGVmaW5lIE1DRl9HUElPX1BPRFJfTENEREFUQUxfUE9EUl9MQ0REQVRBTDAgICAgICAoMHgwMSkKKyNkZWZpbmUgTUNGX0dQSU9fUE9EUl9MQ0REQVRBTF9QT0RSX0xDRERBVEFMMSAgICAgICgweDAyKQorI2RlZmluZSBNQ0ZfR1BJT19QT0RSX0xDRERBVEFMX1BPRFJfTENEREFUQUwyICAgICAgKDB4MDQpCisjZGVmaW5lIE1DRl9HUElPX1BPRFJfTENEREFUQUxfUE9EUl9MQ0REQVRBTDMgICAgICAoMHgwOCkKKyNkZWZpbmUgTUNGX0dQSU9fUE9EUl9MQ0REQVRBTF9QT0RSX0xDRERBVEFMNCAgICAgICgweDEwKQorI2RlZmluZSBNQ0ZfR1BJT19QT0RSX0xDRERBVEFMX1BPRFJfTENEREFUQUw1ICAgICAgKDB4MjApCisjZGVmaW5lIE1DRl9HUElPX1BPRFJfTENEREFUQUxfUE9EUl9MQ0REQVRBTDYgICAgICAoMHg0MCkKKyNkZWZpbmUgTUNGX0dQSU9fUE9EUl9MQ0REQVRBTF9QT0RSX0xDRERBVEFMNyAgICAgICgweDgwKQorCisvKiBCaXQgZGVmaW5pdGlvbnMgYW5kIG1hY3JvcyBmb3IgTUNGX0dQSU9fUE9EUl9MQ0RDVExIICovCisjZGVmaW5lIE1DRl9HUElPX1BPRFJfTENEQ1RMSF9QT0RSX0xDRENUTEgwICAgICAgICAoMHgwMSkKKworLyogQml0IGRlZmluaXRpb25zIGFuZCBtYWNyb3MgZm9yIE1DRl9HUElPX1BPRFJfTENEQ1RMTCAqLworI2RlZmluZSBNQ0ZfR1BJT19QT0RSX0xDRENUTExfUE9EUl9MQ0RDVExMMCAgICAgICAgKDB4MDEpCisjZGVmaW5lIE1DRl9HUElPX1BPRFJfTENEQ1RMTF9QT0RSX0xDRENUTEwxICAgICAgICAoMHgwMikKKyNkZWZpbmUgTUNGX0dQSU9fUE9EUl9MQ0RDVExMX1BPRFJfTENEQ1RMTDIgICAgICAgICgweDA0KQorI2RlZmluZSBNQ0ZfR1BJT19QT0RSX0xDRENUTExfUE9EUl9MQ0RDVExMMyAgICAgICAgKDB4MDgpCisjZGVmaW5lIE1DRl9HUElPX1BPRFJfTENEQ1RMTF9QT0RSX0xDRENUTEw0ICAgICAgICAoMHgxMCkKKyNkZWZpbmUgTUNGX0dQSU9fUE9EUl9MQ0RDVExMX1BPRFJfTENEQ1RMTDUgICAgICAgICgweDIwKQorI2RlZmluZSBNQ0ZfR1BJT19QT0RSX0xDRENUTExfUE9EUl9MQ0RDVExMNiAgICAgICAgKDB4NDApCisjZGVmaW5lIE1DRl9HUElPX1BPRFJfTENEQ1RMTF9QT0RSX0xDRENUTEw3ICAgICAgICAoMHg4MCkKKworLyogQml0IGRlZmluaXRpb25zIGFuZCBtYWNyb3MgZm9yIE1DRl9HUElPX1BERFJfRkVDSCAqLworI2RlZmluZSBNQ0ZfR1BJT19QRERSX0ZFQ0hfUEREUl9GRUNIMCAgICAgICAgICAgICAgKDB4MDEpCisjZGVmaW5lIE1DRl9HUElPX1BERFJfRkVDSF9QRERSX0ZFQ0gxICAgICAgICAgICAgICAoMHgwMikKKyNkZWZpbmUgTUNGX0dQSU9fUEREUl9GRUNIX1BERFJfRkVDSDIgICAgICAgICAgICAgICgweDA0KQorI2RlZmluZSBNQ0ZfR1BJT19QRERSX0ZFQ0hfUEREUl9GRUNIMyAgICAgICAgICAgICAgKDB4MDgpCisjZGVmaW5lIE1DRl9HUElPX1BERFJfRkVDSF9QRERSX0ZFQ0g0ICAgICAgICAgICAgICAoMHgxMCkKKyNkZWZpbmUgTUNGX0dQSU9fUEREUl9GRUNIX1BERFJfRkVDSDUgICAgICAgICAgICAgICgweDIwKQorI2RlZmluZSBNQ0ZfR1BJT19QRERSX0ZFQ0hfUEREUl9GRUNINiAgICAgICAgICAgICAgKDB4NDApCisjZGVmaW5lIE1DRl9HUElPX1BERFJfRkVDSF9QRERSX0ZFQ0g3ICAgICAgICAgICAgICAoMHg4MCkKKworLyogQml0IGRlZmluaXRpb25zIGFuZCBtYWNyb3MgZm9yIE1DRl9HUElPX1BERFJfRkVDTCAqLworI2RlZmluZSBNQ0ZfR1BJT19QRERSX0ZFQ0xfUEREUl9GRUNMMCAgICAgICAgICAgICAgKDB4MDEpCisjZGVmaW5lIE1DRl9HUElPX1BERFJfRkVDTF9QRERSX0ZFQ0wxICAgICAgICAgICAgICAoMHgwMikKKyNkZWZpbmUgTUNGX0dQSU9fUEREUl9GRUNMX1BERFJfRkVDTDIgICAgICAgICAgICAgICgweDA0KQorI2RlZmluZSBNQ0ZfR1BJT19QRERSX0ZFQ0xfUEREUl9GRUNMMyAgICAgICAgICAgICAgKDB4MDgpCisjZGVmaW5lIE1DRl9HUElPX1BERFJfRkVDTF9QRERSX0ZFQ0w0ICAgICAgICAgICAgICAoMHgxMCkKKyNkZWZpbmUgTUNGX0dQSU9fUEREUl9GRUNMX1BERFJfRkVDTDUgICAgICAgICAgICAgICgweDIwKQorI2RlZmluZSBNQ0ZfR1BJT19QRERSX0ZFQ0xfUEREUl9GRUNMNiAgICAgICAgICAgICAgKDB4NDApCisjZGVmaW5lIE1DRl9HUElPX1BERFJfRkVDTF9QRERSX0ZFQ0w3ICAgICAgICAgICAgICAoMHg4MCkKKworLyogQml0IGRlZmluaXRpb25zIGFuZCBtYWNyb3MgZm9yIE1DRl9HUElPX1BERFJfU1NJICovCisjZGVmaW5lIE1DRl9HUElPX1BERFJfU1NJX1BERFJfU1NJMCAgICAgICAgICAgICAgICAoMHgwMSkKKyNkZWZpbmUgTUNGX0dQSU9fUEREUl9TU0lfUEREUl9TU0kxICAgICAgICAgICAgICAgICgweDAyKQorI2RlZmluZSBNQ0ZfR1BJT19QRERSX1NTSV9QRERSX1NTSTIgICAgICAgICAgICAgICAgKDB4MDQpCisjZGVmaW5lIE1DRl9HUElPX1BERFJfU1NJX1BERFJfU1NJMyAgICAgICAgICAgICAgICAoMHgwOCkKKyNkZWZpbmUgTUNGX0dQSU9fUEREUl9TU0lfUEREUl9TU0k0ICAgICAgICAgICAgICAgICgweDEwKQorCisvKiBCaXQgZGVmaW5pdGlvbnMgYW5kIG1hY3JvcyBmb3IgTUNGX0dQSU9fUEREUl9CVVNDVEwgKi8KKyNkZWZpbmUgTUNGX0dQSU9fUEREUl9CVVNDVExfUE9TRFJfQlVTQ1RMMCAgICAgICAgICgweDAxKQorI2RlZmluZSBNQ0ZfR1BJT19QRERSX0JVU0NUTF9QRERSX0JVU0NUTDEgICAgICAgICAgKDB4MDIpCisjZGVmaW5lIE1DRl9HUElPX1BERFJfQlVTQ1RMX1BERFJfQlVTQ1RMMiAgICAgICAgICAoMHgwNCkKKyNkZWZpbmUgTUNGX0dQSU9fUEREUl9CVVNDVExfUEREUl9CVVNDVEwzICAgICAgICAgICgweDA4KQorCisvKiBCaXQgZGVmaW5pdGlvbnMgYW5kIG1hY3JvcyBmb3IgTUNGX0dQSU9fUEREUl9CRSAqLworI2RlZmluZSBNQ0ZfR1BJT19QRERSX0JFX1BERFJfQkUwICAgICAgICAgICAgICAgICAgKDB4MDEpCisjZGVmaW5lIE1DRl9HUElPX1BERFJfQkVfUEREUl9CRTEgICAgICAgICAgICAgICAgICAoMHgwMikKKyNkZWZpbmUgTUNGX0dQSU9fUEREUl9CRV9QRERSX0JFMiAgICAgICAgICAgICAgICAgICgweDA0KQorI2RlZmluZSBNQ0ZfR1BJT19QRERSX0JFX1BERFJfQkUzICAgICAgICAgICAgICAgICAgKDB4MDgpCisKKy8qIEJpdCBkZWZpbml0aW9ucyBhbmQgbWFjcm9zIGZvciBNQ0ZfR1BJT19QRERSX0NTICovCisjZGVmaW5lIE1DRl9HUElPX1BERFJfQ1NfUEREUl9DUzEgICAgICAgICAgICAgICAgICAoMHgwMikKKyNkZWZpbmUgTUNGX0dQSU9fUEREUl9DU19QRERSX0NTMiAgICAgICAgICAgICAgICAgICgweDA0KQorI2RlZmluZSBNQ0ZfR1BJT19QRERSX0NTX1BERFJfQ1MzICAgICAgICAgICAgICAgICAgKDB4MDgpCisjZGVmaW5lIE1DRl9HUElPX1BERFJfQ1NfUEREUl9DUzQgICAgICAgICAgICAgICAgICAoMHgxMCkKKyNkZWZpbmUgTUNGX0dQSU9fUEREUl9DU19QRERSX0NTNSAgICAgICAgICAgICAgICAgICgweDIwKQorCisvKiBCaXQgZGVmaW5pdGlvbnMgYW5kIG1hY3JvcyBmb3IgTUNGX0dQSU9fUEREUl9QV00gKi8KKyNkZWZpbmUgTUNGX0dQSU9fUEREUl9QV01fUEREUl9QV00yICAgICAgICAgICAgICAgICgweDA0KQorI2RlZmluZSBNQ0ZfR1BJT19QRERSX1BXTV9QRERSX1BXTTMgICAgICAgICAgICAgICAgKDB4MDgpCisjZGVmaW5lIE1DRl9HUElPX1BERFJfUFdNX1BERFJfUFdNNCAgICAgICAgICAgICAgICAoMHgxMCkKKyNkZWZpbmUgTUNGX0dQSU9fUEREUl9QV01fUEREUl9QV001ICAgICAgICAgICAgICAgICgweDIwKQorCisvKiBCaXQgZGVmaW5pdGlvbnMgYW5kIG1hY3JvcyBmb3IgTUNGX0dQSU9fUEREUl9GRUNJMkMgKi8KKyNkZWZpbmUgTUNGX0dQSU9fUEREUl9GRUNJMkNfUEREUl9GRUNJMkMwICAgICAgICAgICgweDAxKQorI2RlZmluZSBNQ0ZfR1BJT19QRERSX0ZFQ0kyQ19QRERSX0ZFQ0kyQzEgICAgICAgICAgKDB4MDIpCisjZGVmaW5lIE1DRl9HUElPX1BERFJfRkVDSTJDX1BERFJfRkVDSTJDMiAgICAgICAgICAoMHgwNCkKKyNkZWZpbmUgTUNGX0dQSU9fUEREUl9GRUNJMkNfUEREUl9GRUNJMkMzICAgICAgICAgICgweDA4KQorCisvKiBCaXQgZGVmaW5pdGlvbnMgYW5kIG1hY3JvcyBmb3IgTUNGX0dQSU9fUEREUl9VQVJUICovCisjZGVmaW5lIE1DRl9HUElPX1BERFJfVUFSVF9QRERSX1VBUlQwICAgICAgICAgICAgICAoMHgwMSkKKyNkZWZpbmUgTUNGX0dQSU9fUEREUl9VQVJUX1BERFJfVUFSVDEgICAgICAgICAgICAgICgweDAyKQorI2RlZmluZSBNQ0ZfR1BJT19QRERSX1VBUlRfUEREUl9VQVJUMiAgICAgICAgICAgICAgKDB4MDQpCisjZGVmaW5lIE1DRl9HUElPX1BERFJfVUFSVF9QRERSX1VBUlQzICAgICAgICAgICAgICAoMHgwOCkKKyNkZWZpbmUgTUNGX0dQSU9fUEREUl9VQVJUX1BERFJfVUFSVDQgICAgICAgICAgICAgICgweDEwKQorI2RlZmluZSBNQ0ZfR1BJT19QRERSX1VBUlRfUEREUl9VQVJUNSAgICAgICAgICAgICAgKDB4MjApCisjZGVmaW5lIE1DRl9HUElPX1BERFJfVUFSVF9QRERSX1VBUlQ2ICAgICAgICAgICAgICAoMHg0MCkKKyNkZWZpbmUgTUNGX0dQSU9fUEREUl9VQVJUX1BERFJfVUFSVDcgICAgICAgICAgICAgICgweDgwKQorCisvKiBCaXQgZGVmaW5pdGlvbnMgYW5kIG1hY3JvcyBmb3IgTUNGX0dQSU9fUEREUl9RU1BJICovCisjZGVmaW5lIE1DRl9HUElPX1BERFJfUVNQSV9QRERSX1FTUEkwICAgICAgICAgICAgICAoMHgwMSkKKyNkZWZpbmUgTUNGX0dQSU9fUEREUl9RU1BJX1BERFJfUVNQSTEgICAgICAgICAgICAgICgweDAyKQorI2RlZmluZSBNQ0ZfR1BJT19QRERSX1FTUElfUEREUl9RU1BJMiAgICAgICAgICAgICAgKDB4MDQpCisjZGVmaW5lIE1DRl9HUElPX1BERFJfUVNQSV9QRERSX1FTUEkzICAgICAgICAgICAgICAoMHgwOCkKKyNkZWZpbmUgTUNGX0dQSU9fUEREUl9RU1BJX1BERFJfUVNQSTQgICAgICAgICAgICAgICgweDEwKQorI2RlZmluZSBNQ0ZfR1BJT19QRERSX1FTUElfUEREUl9RU1BJNSAgICAgICAgICAgICAgKDB4MjApCisKKy8qIEJpdCBkZWZpbml0aW9ucyBhbmQgbWFjcm9zIGZvciBNQ0ZfR1BJT19QRERSX1RJTUVSICovCisjZGVmaW5lIE1DRl9HUElPX1BERFJfVElNRVJfUEREUl9USU1FUjAgICAgICAgICAgICAoMHgwMSkKKyNkZWZpbmUgTUNGX0dQSU9fUEREUl9USU1FUl9QRERSX1RJTUVSMSAgICAgICAgICAgICgweDAyKQorI2RlZmluZSBNQ0ZfR1BJT19QRERSX1RJTUVSX1BERFJfVElNRVIyICAgICAgICAgICAgKDB4MDQpCisjZGVmaW5lIE1DRl9HUElPX1BERFJfVElNRVJfUEREUl9USU1FUjMgICAgICAgICAgICAoMHgwOCkKKworLyogQml0IGRlZmluaXRpb25zIGFuZCBtYWNyb3MgZm9yIE1DRl9HUElPX1BERFJfTENEREFUQUggKi8KKyNkZWZpbmUgTUNGX0dQSU9fUEREUl9MQ0REQVRBSF9QRERSX0xDRERBVEFIMCAgICAgICgweDAxKQorI2RlZmluZSBNQ0ZfR1BJT19QRERSX0xDRERBVEFIX1BERFJfTENEREFUQUgxICAgICAgKDB4MDIpCisKKy8qIEJpdCBkZWZpbml0aW9ucyBhbmQgbWFjcm9zIGZvciBNQ0ZfR1BJT19QRERSX0xDRERBVEFNICovCisjZGVmaW5lIE1DRl9HUElPX1BERFJfTENEREFUQU1fUEREUl9MQ0REQVRBTTAgICAgICAoMHgwMSkKKyNkZWZpbmUgTUNGX0dQSU9fUEREUl9MQ0REQVRBTV9QRERSX0xDRERBVEFNMSAgICAgICgweDAyKQorI2RlZmluZSBNQ0ZfR1BJT19QRERSX0xDRERBVEFNX1BERFJfTENEREFUQU0yICAgICAgKDB4MDQpCisjZGVmaW5lIE1DRl9HUElPX1BERFJfTENEREFUQU1fUEREUl9MQ0REQVRBTTMgICAgICAoMHgwOCkKKyNkZWZpbmUgTUNGX0dQSU9fUEREUl9MQ0REQVRBTV9QRERSX0xDRERBVEFNNCAgICAgICgweDEwKQorI2RlZmluZSBNQ0ZfR1BJT19QRERSX0xDRERBVEFNX1BERFJfTENEREFUQU01ICAgICAgKDB4MjApCisjZGVmaW5lIE1DRl9HUElPX1BERFJfTENEREFUQU1fUEREUl9MQ0REQVRBTTYgICAgICAoMHg0MCkKKyNkZWZpbmUgTUNGX0dQSU9fUEREUl9MQ0REQVRBTV9QRERSX0xDRERBVEFNNyAgICAgICgweDgwKQorCisvKiBCaXQgZGVmaW5pdGlvbnMgYW5kIG1hY3JvcyBmb3IgTUNGX0dQSU9fUEREUl9MQ0REQVRBTCAqLworI2RlZmluZSBNQ0ZfR1BJT19QRERSX0xDRERBVEFMX1BERFJfTENEREFUQUwwICAgICAgKDB4MDEpCisjZGVmaW5lIE1DRl9HUElPX1BERFJfTENEREFUQUxfUEREUl9MQ0REQVRBTDEgICAgICAoMHgwMikKKyNkZWZpbmUgTUNGX0dQSU9fUEREUl9MQ0REQVRBTF9QRERSX0xDRERBVEFMMiAgICAgICgweDA0KQorI2RlZmluZSBNQ0ZfR1BJT19QRERSX0xDRERBVEFMX1BERFJfTENEREFUQUwzICAgICAgKDB4MDgpCisjZGVmaW5lIE1DRl9HUElPX1BERFJfTENEREFUQUxfUEREUl9MQ0REQVRBTDQgICAgICAoMHgxMCkKKyNkZWZpbmUgTUNGX0dQSU9fUEREUl9MQ0REQVRBTF9QRERSX0xDRERBVEFMNSAgICAgICgweDIwKQorI2RlZmluZSBNQ0ZfR1BJT19QRERSX0xDRERBVEFMX1BERFJfTENEREFUQUw2ICAgICAgKDB4NDApCisjZGVmaW5lIE1DRl9HUElPX1BERFJfTENEREFUQUxfUEREUl9MQ0REQVRBTDcgICAgICAoMHg4MCkKKworLyogQml0IGRlZmluaXRpb25zIGFuZCBtYWNyb3MgZm9yIE1DRl9HUElPX1BERFJfTENEQ1RMSCAqLworI2RlZmluZSBNQ0ZfR1BJT19QRERSX0xDRENUTEhfUEREUl9MQ0RDVExIMCAgICAgICAgKDB4MDEpCisKKy8qIEJpdCBkZWZpbml0aW9ucyBhbmQgbWFjcm9zIGZvciBNQ0ZfR1BJT19QRERSX0xDRENUTEwgKi8KKyNkZWZpbmUgTUNGX0dQSU9fUEREUl9MQ0RDVExMX1BERFJfTENEQ1RMTDAgICAgICAgICgweDAxKQorI2RlZmluZSBNQ0ZfR1BJT19QRERSX0xDRENUTExfUEREUl9MQ0RDVExMMSAgICAgICAgKDB4MDIpCisjZGVmaW5lIE1DRl9HUElPX1BERFJfTENEQ1RMTF9QRERSX0xDRENUTEwyICAgICAgICAoMHgwNCkKKyNkZWZpbmUgTUNGX0dQSU9fUEREUl9MQ0RDVExMX1BERFJfTENEQ1RMTDMgICAgICAgICgweDA4KQorI2RlZmluZSBNQ0ZfR1BJT19QRERSX0xDRENUTExfUEREUl9MQ0RDVExMNCAgICAgICAgKDB4MTApCisjZGVmaW5lIE1DRl9HUElPX1BERFJfTENEQ1RMTF9QRERSX0xDRENUTEw1ICAgICAgICAoMHgyMCkKKyNkZWZpbmUgTUNGX0dQSU9fUEREUl9MQ0RDVExMX1BERFJfTENEQ1RMTDYgICAgICAgICgweDQwKQorI2RlZmluZSBNQ0ZfR1BJT19QRERSX0xDRENUTExfUEREUl9MQ0RDVExMNyAgICAgICAgKDB4ODApCisKKy8qIEJpdCBkZWZpbml0aW9ucyBhbmQgbWFjcm9zIGZvciBNQ0ZfR1BJT19QUERTRFJfRkVDSCAqLworI2RlZmluZSBNQ0ZfR1BJT19QUERTRFJfRkVDSF9QUERTRFJfRkVDSDAgICAgICAgICAgKDB4MDEpCisjZGVmaW5lIE1DRl9HUElPX1BQRFNEUl9GRUNIX1BQRFNEUl9GRUNIMSAgICAgICAgICAoMHgwMikKKyNkZWZpbmUgTUNGX0dQSU9fUFBEU0RSX0ZFQ0hfUFBEU0RSX0ZFQ0gyICAgICAgICAgICgweDA0KQorI2RlZmluZSBNQ0ZfR1BJT19QUERTRFJfRkVDSF9QUERTRFJfRkVDSDMgICAgICAgICAgKDB4MDgpCisjZGVmaW5lIE1DRl9HUElPX1BQRFNEUl9GRUNIX1BQRFNEUl9GRUNINCAgICAgICAgICAoMHgxMCkKKyNkZWZpbmUgTUNGX0dQSU9fUFBEU0RSX0ZFQ0hfUFBEU0RSX0ZFQ0g1ICAgICAgICAgICgweDIwKQorI2RlZmluZSBNQ0ZfR1BJT19QUERTRFJfRkVDSF9QUERTRFJfRkVDSDYgICAgICAgICAgKDB4NDApCisjZGVmaW5lIE1DRl9HUElPX1BQRFNEUl9GRUNIX1BQRFNEUl9GRUNINyAgICAgICAgICAoMHg4MCkKKworLyogQml0IGRlZmluaXRpb25zIGFuZCBtYWNyb3MgZm9yIE1DRl9HUElPX1BQRFNEUl9GRUNMICovCisjZGVmaW5lIE1DRl9HUElPX1BQRFNEUl9GRUNMX1BQRFNEUl9GRUNMMCAgICAgICAgICAoMHgwMSkKKyNkZWZpbmUgTUNGX0dQSU9fUFBEU0RSX0ZFQ0xfUFBEU0RSX0ZFQ0wxICAgICAgICAgICgweDAyKQorI2RlZmluZSBNQ0ZfR1BJT19QUERTRFJfRkVDTF9QUERTRFJfRkVDTDIgICAgICAgICAgKDB4MDQpCisjZGVmaW5lIE1DRl9HUElPX1BQRFNEUl9GRUNMX1BQRFNEUl9GRUNMMyAgICAgICAgICAoMHgwOCkKKyNkZWZpbmUgTUNGX0dQSU9fUFBEU0RSX0ZFQ0xfUFBEU0RSX0ZFQ0w0ICAgICAgICAgICgweDEwKQorI2RlZmluZSBNQ0ZfR1BJT19QUERTRFJfRkVDTF9QUERTRFJfRkVDTDUgICAgICAgICAgKDB4MjApCisjZGVmaW5lIE1DRl9HUElPX1BQRFNEUl9GRUNMX1BQRFNEUl9GRUNMNiAgICAgICAgICAoMHg0MCkKKyNkZWZpbmUgTUNGX0dQSU9fUFBEU0RSX0ZFQ0xfUFBEU0RSX0ZFQ0w3ICAgICAgICAgICgweDgwKQorCisvKiBCaXQgZGVmaW5pdGlvbnMgYW5kIG1hY3JvcyBmb3IgTUNGX0dQSU9fUFBEU0RSX1NTSSAqLworI2RlZmluZSBNQ0ZfR1BJT19QUERTRFJfU1NJX1BQRFNEUl9TU0kwICAgICAgICAgICAgKDB4MDEpCisjZGVmaW5lIE1DRl9HUElPX1BQRFNEUl9TU0lfUFBEU0RSX1NTSTEgICAgICAgICAgICAoMHgwMikKKyNkZWZpbmUgTUNGX0dQSU9fUFBEU0RSX1NTSV9QUERTRFJfU1NJMiAgICAgICAgICAgICgweDA0KQorI2RlZmluZSBNQ0ZfR1BJT19QUERTRFJfU1NJX1BQRFNEUl9TU0kzICAgICAgICAgICAgKDB4MDgpCisjZGVmaW5lIE1DRl9HUElPX1BQRFNEUl9TU0lfUFBEU0RSX1NTSTQgICAgICAgICAgICAoMHgxMCkKKworLyogQml0IGRlZmluaXRpb25zIGFuZCBtYWNyb3MgZm9yIE1DRl9HUElPX1BQRFNEUl9CVVNDVEwgKi8KKyNkZWZpbmUgTUNGX0dQSU9fUFBEU0RSX0JVU0NUTF9QT1NEUl9CVVNDVEwwICAgICAgICgweDAxKQorI2RlZmluZSBNQ0ZfR1BJT19QUERTRFJfQlVTQ1RMX1BQRFNEUl9CVVNDVEwxICAgICAgKDB4MDIpCisjZGVmaW5lIE1DRl9HUElPX1BQRFNEUl9CVVNDVExfUFBEU0RSX0JVU0NUTDIgICAgICAoMHgwNCkKKyNkZWZpbmUgTUNGX0dQSU9fUFBEU0RSX0JVU0NUTF9QUERTRFJfQlVTQ1RMMyAgICAgICgweDA4KQorCisvKiBCaXQgZGVmaW5pdGlvbnMgYW5kIG1hY3JvcyBmb3IgTUNGX0dQSU9fUFBEU0RSX0JFICovCisjZGVmaW5lIE1DRl9HUElPX1BQRFNEUl9CRV9QUERTRFJfQkUwICAgICAgICAgICAgICAoMHgwMSkKKyNkZWZpbmUgTUNGX0dQSU9fUFBEU0RSX0JFX1BQRFNEUl9CRTEgICAgICAgICAgICAgICgweDAyKQorI2RlZmluZSBNQ0ZfR1BJT19QUERTRFJfQkVfUFBEU0RSX0JFMiAgICAgICAgICAgICAgKDB4MDQpCisjZGVmaW5lIE1DRl9HUElPX1BQRFNEUl9CRV9QUERTRFJfQkUzICAgICAgICAgICAgICAoMHgwOCkKKworLyogQml0IGRlZmluaXRpb25zIGFuZCBtYWNyb3MgZm9yIE1DRl9HUElPX1BQRFNEUl9DUyAqLworI2RlZmluZSBNQ0ZfR1BJT19QUERTRFJfQ1NfUFBEU0RSX0NTMSAgICAgICAgICAgICAgKDB4MDIpCisjZGVmaW5lIE1DRl9HUElPX1BQRFNEUl9DU19QUERTRFJfQ1MyICAgICAgICAgICAgICAoMHgwNCkKKyNkZWZpbmUgTUNGX0dQSU9fUFBEU0RSX0NTX1BQRFNEUl9DUzMgICAgICAgICAgICAgICgweDA4KQorI2RlZmluZSBNQ0ZfR1BJT19QUERTRFJfQ1NfUFBEU0RSX0NTNCAgICAgICAgICAgICAgKDB4MTApCisjZGVmaW5lIE1DRl9HUElPX1BQRFNEUl9DU19QUERTRFJfQ1M1ICAgICAgICAgICAgICAoMHgyMCkKKworLyogQml0IGRlZmluaXRpb25zIGFuZCBtYWNyb3MgZm9yIE1DRl9HUElPX1BQRFNEUl9QV00gKi8KKyNkZWZpbmUgTUNGX0dQSU9fUFBEU0RSX1BXTV9QUERTRFJfUFdNMiAgICAgICAgICAgICgweDA0KQorI2RlZmluZSBNQ0ZfR1BJT19QUERTRFJfUFdNX1BQRFNEUl9QV00zICAgICAgICAgICAgKDB4MDgpCisjZGVmaW5lIE1DRl9HUElPX1BQRFNEUl9QV01fUFBEU0RSX1BXTTQgICAgICAgICAgICAoMHgxMCkKKyNkZWZpbmUgTUNGX0dQSU9fUFBEU0RSX1BXTV9QUERTRFJfUFdNNSAgICAgICAgICAgICgweDIwKQorCisvKiBCaXQgZGVmaW5pdGlvbnMgYW5kIG1hY3JvcyBmb3IgTUNGX0dQSU9fUFBEU0RSX0ZFQ0kyQyAqLworI2RlZmluZSBNQ0ZfR1BJT19QUERTRFJfRkVDSTJDX1BQRFNEUl9GRUNJMkMwICAgICAgKDB4MDEpCisjZGVmaW5lIE1DRl9HUElPX1BQRFNEUl9GRUNJMkNfUFBEU0RSX0ZFQ0kyQzEgICAgICAoMHgwMikKKyNkZWZpbmUgTUNGX0dQSU9fUFBEU0RSX0ZFQ0kyQ19QUERTRFJfRkVDSTJDMiAgICAgICgweDA0KQorI2RlZmluZSBNQ0ZfR1BJT19QUERTRFJfRkVDSTJDX1BQRFNEUl9GRUNJMkMzICAgICAgKDB4MDgpCisKKy8qIEJpdCBkZWZpbml0aW9ucyBhbmQgbWFjcm9zIGZvciBNQ0ZfR1BJT19QUERTRFJfVUFSVCAqLworI2RlZmluZSBNQ0ZfR1BJT19QUERTRFJfVUFSVF9QUERTRFJfVUFSVDAgICAgICAgICAgKDB4MDEpCisjZGVmaW5lIE1DRl9HUElPX1BQRFNEUl9VQVJUX1BQRFNEUl9VQVJUMSAgICAgICAgICAoMHgwMikKKyNkZWZpbmUgTUNGX0dQSU9fUFBEU0RSX1VBUlRfUFBEU0RSX1VBUlQyICAgICAgICAgICgweDA0KQorI2RlZmluZSBNQ0ZfR1BJT19QUERTRFJfVUFSVF9QUERTRFJfVUFSVDMgICAgICAgICAgKDB4MDgpCisjZGVmaW5lIE1DRl9HUElPX1BQRFNEUl9VQVJUX1BQRFNEUl9VQVJUNCAgICAgICAgICAoMHgxMCkKKyNkZWZpbmUgTUNGX0dQSU9fUFBEU0RSX1VBUlRfUFBEU0RSX1VBUlQ1ICAgICAgICAgICgweDIwKQorI2RlZmluZSBNQ0ZfR1BJT19QUERTRFJfVUFSVF9QUERTRFJfVUFSVDYgICAgICAgICAgKDB4NDApCisjZGVmaW5lIE1DRl9HUElPX1BQRFNEUl9VQVJUX1BQRFNEUl9VQVJUNyAgICAgICAgICAoMHg4MCkKKworLyogQml0IGRlZmluaXRpb25zIGFuZCBtYWNyb3MgZm9yIE1DRl9HUElPX1BQRFNEUl9RU1BJICovCisjZGVmaW5lIE1DRl9HUElPX1BQRFNEUl9RU1BJX1BQRFNEUl9RU1BJMCAgICAgICAgICAoMHgwMSkKKyNkZWZpbmUgTUNGX0dQSU9fUFBEU0RSX1FTUElfUFBEU0RSX1FTUEkxICAgICAgICAgICgweDAyKQorI2RlZmluZSBNQ0ZfR1BJT19QUERTRFJfUVNQSV9QUERTRFJfUVNQSTIgICAgICAgICAgKDB4MDQpCisjZGVmaW5lIE1DRl9HUElPX1BQRFNEUl9RU1BJX1BQRFNEUl9RU1BJMyAgICAgICAgICAoMHgwOCkKKyNkZWZpbmUgTUNGX0dQSU9fUFBEU0RSX1FTUElfUFBEU0RSX1FTUEk0ICAgICAgICAgICgweDEwKQorI2RlZmluZSBNQ0ZfR1BJT19QUERTRFJfUVNQSV9QUERTRFJfUVNQSTUgICAgICAgICAgKDB4MjApCisKKy8qIEJpdCBkZWZpbml0aW9ucyBhbmQgbWFjcm9zIGZvciBNQ0ZfR1BJT19QUERTRFJfVElNRVIgKi8KKyNkZWZpbmUgTUNGX0dQSU9fUFBEU0RSX1RJTUVSX1BQRFNEUl9USU1FUjAgICAgICAgICgweDAxKQorI2RlZmluZSBNQ0ZfR1BJT19QUERTRFJfVElNRVJfUFBEU0RSX1RJTUVSMSAgICAgICAgKDB4MDIpCisjZGVmaW5lIE1DRl9HUElPX1BQRFNEUl9USU1FUl9QUERTRFJfVElNRVIyICAgICAgICAoMHgwNCkKKyNkZWZpbmUgTUNGX0dQSU9fUFBEU0RSX1RJTUVSX1BQRFNEUl9USU1FUjMgICAgICAgICgweDA4KQorCisvKiBCaXQgZGVmaW5pdGlvbnMgYW5kIG1hY3JvcyBmb3IgTUNGX0dQSU9fUFBEU0RSX0xDRERBVEFIICovCisjZGVmaW5lIE1DRl9HUElPX1BQRFNEUl9MQ0REQVRBSF9QUERTRFJfTENEREFUQUgwICAoMHgwMSkKKyNkZWZpbmUgTUNGX0dQSU9fUFBEU0RSX0xDRERBVEFIX1BQRFNEUl9MQ0REQVRBSDEgICgweDAyKQorCisvKiBCaXQgZGVmaW5pdGlvbnMgYW5kIG1hY3JvcyBmb3IgTUNGX0dQSU9fUFBEU0RSX0xDRERBVEFNICovCisjZGVmaW5lIE1DRl9HUElPX1BQRFNEUl9MQ0REQVRBTV9QUERTRFJfTENEREFUQU0wICAoMHgwMSkKKyNkZWZpbmUgTUNGX0dQSU9fUFBEU0RSX0xDRERBVEFNX1BQRFNEUl9MQ0REQVRBTTEgICgweDAyKQorI2RlZmluZSBNQ0ZfR1BJT19QUERTRFJfTENEREFUQU1fUFBEU0RSX0xDRERBVEFNMiAgKDB4MDQpCisjZGVmaW5lIE1DRl9HUElPX1BQRFNEUl9MQ0REQVRBTV9QUERTRFJfTENEREFUQU0zICAoMHgwOCkKKyNkZWZpbmUgTUNGX0dQSU9fUFBEU0RSX0xDRERBVEFNX1BQRFNEUl9MQ0REQVRBTTQgICgweDEwKQorI2RlZmluZSBNQ0ZfR1BJT19QUERTRFJfTENEREFUQU1fUFBEU0RSX0xDRERBVEFNNSAgKDB4MjApCisjZGVmaW5lIE1DRl9HUElPX1BQRFNEUl9MQ0REQVRBTV9QUERTRFJfTENEREFUQU02ICAoMHg0MCkKKyNkZWZpbmUgTUNGX0dQSU9fUFBEU0RSX0xDRERBVEFNX1BQRFNEUl9MQ0REQVRBTTcgICgweDgwKQorCisvKiBCaXQgZGVmaW5pdGlvbnMgYW5kIG1hY3JvcyBmb3IgTUNGX0dQSU9fUFBEU0RSX0xDRERBVEFMICovCisjZGVmaW5lIE1DRl9HUElPX1BQRFNEUl9MQ0REQVRBTF9QUERTRFJfTENEREFUQUwwICAoMHgwMSkKKyNkZWZpbmUgTUNGX0dQSU9fUFBEU0RSX0xDRERBVEFMX1BQRFNEUl9MQ0REQVRBTDEgICgweDAyKQorI2RlZmluZSBNQ0ZfR1BJT19QUERTRFJfTENEREFUQUxfUFBEU0RSX0xDRERBVEFMMiAgKDB4MDQpCisjZGVmaW5lIE1DRl9HUElPX1BQRFNEUl9MQ0REQVRBTF9QUERTRFJfTENEREFUQUwzICAoMHgwOCkKKyNkZWZpbmUgTUNGX0dQSU9fUFBEU0RSX0xDRERBVEFMX1BQRFNEUl9MQ0REQVRBTDQgICgweDEwKQorI2RlZmluZSBNQ0ZfR1BJT19QUERTRFJfTENEREFUQUxfUFBEU0RSX0xDRERBVEFMNSAgKDB4MjApCisjZGVmaW5lIE1DRl9HUElPX1BQRFNEUl9MQ0REQVRBTF9QUERTRFJfTENEREFUQUw2ICAoMHg0MCkKKyNkZWZpbmUgTUNGX0dQSU9fUFBEU0RSX0xDRERBVEFMX1BQRFNEUl9MQ0REQVRBTDcgICgweDgwKQorCisvKiBCaXQgZGVmaW5pdGlvbnMgYW5kIG1hY3JvcyBmb3IgTUNGX0dQSU9fUFBEU0RSX0xDRENUTEggKi8KKyNkZWZpbmUgTUNGX0dQSU9fUFBEU0RSX0xDRENUTEhfUFBEU0RSX0xDRENUTEgwICAgICgweDAxKQorCisvKiBCaXQgZGVmaW5pdGlvbnMgYW5kIG1hY3JvcyBmb3IgTUNGX0dQSU9fUFBEU0RSX0xDRENUTEwgKi8KKyNkZWZpbmUgTUNGX0dQSU9fUFBEU0RSX0xDRENUTExfUFBEU0RSX0xDRENUTEwwICAgICgweDAxKQorI2RlZmluZSBNQ0ZfR1BJT19QUERTRFJfTENEQ1RMTF9QUERTRFJfTENEQ1RMTDEgICAgKDB4MDIpCisjZGVmaW5lIE1DRl9HUElPX1BQRFNEUl9MQ0RDVExMX1BQRFNEUl9MQ0RDVExMMiAgICAoMHgwNCkKKyNkZWZpbmUgTUNGX0dQSU9fUFBEU0RSX0xDRENUTExfUFBEU0RSX0xDRENUTEwzICAgICgweDA4KQorI2RlZmluZSBNQ0ZfR1BJT19QUERTRFJfTENEQ1RMTF9QUERTRFJfTENEQ1RMTDQgICAgKDB4MTApCisjZGVmaW5lIE1DRl9HUElPX1BQRFNEUl9MQ0RDVExMX1BQRFNEUl9MQ0RDVExMNSAgICAoMHgyMCkKKyNkZWZpbmUgTUNGX0dQSU9fUFBEU0RSX0xDRENUTExfUFBEU0RSX0xDRENUTEw2ICAgICgweDQwKQorI2RlZmluZSBNQ0ZfR1BJT19QUERTRFJfTENEQ1RMTF9QUERTRFJfTENEQ1RMTDcgICAgKDB4ODApCisKKy8qIEJpdCBkZWZpbml0aW9ucyBhbmQgbWFjcm9zIGZvciBNQ0ZfR1BJT19QQ0xSUl9GRUNIICovCisjZGVmaW5lIE1DRl9HUElPX1BDTFJSX0ZFQ0hfUENMUlJfRkVDSDAgICAgICAgICAgICAoMHgwMSkKKyNkZWZpbmUgTUNGX0dQSU9fUENMUlJfRkVDSF9QQ0xSUl9GRUNIMSAgICAgICAgICAgICgweDAyKQorI2RlZmluZSBNQ0ZfR1BJT19QQ0xSUl9GRUNIX1BDTFJSX0ZFQ0gyICAgICAgICAgICAgKDB4MDQpCisjZGVmaW5lIE1DRl9HUElPX1BDTFJSX0ZFQ0hfUENMUlJfRkVDSDMgICAgICAgICAgICAoMHgwOCkKKyNkZWZpbmUgTUNGX0dQSU9fUENMUlJfRkVDSF9QQ0xSUl9GRUNINCAgICAgICAgICAgICgweDEwKQorI2RlZmluZSBNQ0ZfR1BJT19QQ0xSUl9GRUNIX1BDTFJSX0ZFQ0g1ICAgICAgICAgICAgKDB4MjApCisjZGVmaW5lIE1DRl9HUElPX1BDTFJSX0ZFQ0hfUENMUlJfRkVDSDYgICAgICAgICAgICAoMHg0MCkKKyNkZWZpbmUgTUNGX0dQSU9fUENMUlJfRkVDSF9QQ0xSUl9GRUNINyAgICAgICAgICAgICgweDgwKQorCisvKiBCaXQgZGVmaW5pdGlvbnMgYW5kIG1hY3JvcyBmb3IgTUNGX0dQSU9fUENMUlJfRkVDTCAqLworI2RlZmluZSBNQ0ZfR1BJT19QQ0xSUl9GRUNMX1BDTFJSX0ZFQ0wwICAgICAgICAgICAgKDB4MDEpCisjZGVmaW5lIE1DRl9HUElPX1BDTFJSX0ZFQ0xfUENMUlJfRkVDTDEgICAgICAgICAgICAoMHgwMikKKyNkZWZpbmUgTUNGX0dQSU9fUENMUlJfRkVDTF9QQ0xSUl9GRUNMMiAgICAgICAgICAgICgweDA0KQorI2RlZmluZSBNQ0ZfR1BJT19QQ0xSUl9GRUNMX1BDTFJSX0ZFQ0wzICAgICAgICAgICAgKDB4MDgpCisjZGVmaW5lIE1DRl9HUElPX1BDTFJSX0ZFQ0xfUENMUlJfRkVDTDQgICAgICAgICAgICAoMHgxMCkKKyNkZWZpbmUgTUNGX0dQSU9fUENMUlJfRkVDTF9QQ0xSUl9GRUNMNSAgICAgICAgICAgICgweDIwKQorI2RlZmluZSBNQ0ZfR1BJT19QQ0xSUl9GRUNMX1BDTFJSX0ZFQ0w2ICAgICAgICAgICAgKDB4NDApCisjZGVmaW5lIE1DRl9HUElPX1BDTFJSX0ZFQ0xfUENMUlJfRkVDTDcgICAgICAgICAgICAoMHg4MCkKKworLyogQml0IGRlZmluaXRpb25zIGFuZCBtYWNyb3MgZm9yIE1DRl9HUElPX1BDTFJSX1NTSSAqLworI2RlZmluZSBNQ0ZfR1BJT19QQ0xSUl9TU0lfUENMUlJfU1NJMCAgICAgICAgICAgICAgKDB4MDEpCisjZGVmaW5lIE1DRl9HUElPX1BDTFJSX1NTSV9QQ0xSUl9TU0kxICAgICAgICAgICAgICAoMHgwMikKKyNkZWZpbmUgTUNGX0dQSU9fUENMUlJfU1NJX1BDTFJSX1NTSTIgICAgICAgICAgICAgICgweDA0KQorI2RlZmluZSBNQ0ZfR1BJT19QQ0xSUl9TU0lfUENMUlJfU1NJMyAgICAgICAgICAgICAgKDB4MDgpCisjZGVmaW5lIE1DRl9HUElPX1BDTFJSX1NTSV9QQ0xSUl9TU0k0ICAgICAgICAgICAgICAoMHgxMCkKKworLyogQml0IGRlZmluaXRpb25zIGFuZCBtYWNyb3MgZm9yIE1DRl9HUElPX1BDTFJSX0JVU0NUTCAqLworI2RlZmluZSBNQ0ZfR1BJT19QQ0xSUl9CVVNDVExfUE9TRFJfQlVTQ1RMMCAgICAgICAgKDB4MDEpCisjZGVmaW5lIE1DRl9HUElPX1BDTFJSX0JVU0NUTF9QQ0xSUl9CVVNDVEwxICAgICAgICAoMHgwMikKKyNkZWZpbmUgTUNGX0dQSU9fUENMUlJfQlVTQ1RMX1BDTFJSX0JVU0NUTDIgICAgICAgICgweDA0KQorI2RlZmluZSBNQ0ZfR1BJT19QQ0xSUl9CVVNDVExfUENMUlJfQlVTQ1RMMyAgICAgICAgKDB4MDgpCisKKy8qIEJpdCBkZWZpbml0aW9ucyBhbmQgbWFjcm9zIGZvciBNQ0ZfR1BJT19QQ0xSUl9CRSAqLworI2RlZmluZSBNQ0ZfR1BJT19QQ0xSUl9CRV9QQ0xSUl9CRTAgICAgICAgICAgICAgICAgKDB4MDEpCisjZGVmaW5lIE1DRl9HUElPX1BDTFJSX0JFX1BDTFJSX0JFMSAgICAgICAgICAgICAgICAoMHgwMikKKyNkZWZpbmUgTUNGX0dQSU9fUENMUlJfQkVfUENMUlJfQkUyICAgICAgICAgICAgICAgICgweDA0KQorI2RlZmluZSBNQ0ZfR1BJT19QQ0xSUl9CRV9QQ0xSUl9CRTMgICAgICAgICAgICAgICAgKDB4MDgpCisKKy8qIEJpdCBkZWZpbml0aW9ucyBhbmQgbWFjcm9zIGZvciBNQ0ZfR1BJT19QQ0xSUl9DUyAqLworI2RlZmluZSBNQ0ZfR1BJT19QQ0xSUl9DU19QQ0xSUl9DUzEgICAgICAgICAgICAgICAgKDB4MDIpCisjZGVmaW5lIE1DRl9HUElPX1BDTFJSX0NTX1BDTFJSX0NTMiAgICAgICAgICAgICAgICAoMHgwNCkKKyNkZWZpbmUgTUNGX0dQSU9fUENMUlJfQ1NfUENMUlJfQ1MzICAgICAgICAgICAgICAgICgweDA4KQorI2RlZmluZSBNQ0ZfR1BJT19QQ0xSUl9DU19QQ0xSUl9DUzQgICAgICAgICAgICAgICAgKDB4MTApCisjZGVmaW5lIE1DRl9HUElPX1BDTFJSX0NTX1BDTFJSX0NTNSAgICAgICAgICAgICAgICAoMHgyMCkKKworLyogQml0IGRlZmluaXRpb25zIGFuZCBtYWNyb3MgZm9yIE1DRl9HUElPX1BDTFJSX1BXTSAqLworI2RlZmluZSBNQ0ZfR1BJT19QQ0xSUl9QV01fUENMUlJfUFdNMiAgICAgICAgICAgICAgKDB4MDQpCisjZGVmaW5lIE1DRl9HUElPX1BDTFJSX1BXTV9QQ0xSUl9QV00zICAgICAgICAgICAgICAoMHgwOCkKKyNkZWZpbmUgTUNGX0dQSU9fUENMUlJfUFdNX1BDTFJSX1BXTTQgICAgICAgICAgICAgICgweDEwKQorI2RlZmluZSBNQ0ZfR1BJT19QQ0xSUl9QV01fUENMUlJfUFdNNSAgICAgICAgICAgICAgKDB4MjApCisKKy8qIEJpdCBkZWZpbml0aW9ucyBhbmQgbWFjcm9zIGZvciBNQ0ZfR1BJT19QQ0xSUl9GRUNJMkMgKi8KKyNkZWZpbmUgTUNGX0dQSU9fUENMUlJfRkVDSTJDX1BDTFJSX0ZFQ0kyQzAgICAgICAgICgweDAxKQorI2RlZmluZSBNQ0ZfR1BJT19QQ0xSUl9GRUNJMkNfUENMUlJfRkVDSTJDMSAgICAgICAgKDB4MDIpCisjZGVmaW5lIE1DRl9HUElPX1BDTFJSX0ZFQ0kyQ19QQ0xSUl9GRUNJMkMyICAgICAgICAoMHgwNCkKKyNkZWZpbmUgTUNGX0dQSU9fUENMUlJfRkVDSTJDX1BDTFJSX0ZFQ0kyQzMgICAgICAgICgweDA4KQorCisvKiBCaXQgZGVmaW5pdGlvbnMgYW5kIG1hY3JvcyBmb3IgTUNGX0dQSU9fUENMUlJfVUFSVCAqLworI2RlZmluZSBNQ0ZfR1BJT19QQ0xSUl9VQVJUX1BDTFJSX1VBUlQwICAgICAgICAgICAgKDB4MDEpCisjZGVmaW5lIE1DRl9HUElPX1BDTFJSX1VBUlRfUENMUlJfVUFSVDEgICAgICAgICAgICAoMHgwMikKKyNkZWZpbmUgTUNGX0dQSU9fUENMUlJfVUFSVF9QQ0xSUl9VQVJUMiAgICAgICAgICAgICgweDA0KQorI2RlZmluZSBNQ0ZfR1BJT19QQ0xSUl9VQVJUX1BDTFJSX1VBUlQzICAgICAgICAgICAgKDB4MDgpCisjZGVmaW5lIE1DRl9HUElPX1BDTFJSX1VBUlRfUENMUlJfVUFSVDQgICAgICAgICAgICAoMHgxMCkKKyNkZWZpbmUgTUNGX0dQSU9fUENMUlJfVUFSVF9QQ0xSUl9VQVJUNSAgICAgICAgICAgICgweDIwKQorI2RlZmluZSBNQ0ZfR1BJT19QQ0xSUl9VQVJUX1BDTFJSX1VBUlQ2ICAgICAgICAgICAgKDB4NDApCisjZGVmaW5lIE1DRl9HUElPX1BDTFJSX1VBUlRfUENMUlJfVUFSVDcgICAgICAgICAgICAoMHg4MCkKKworLyogQml0IGRlZmluaXRpb25zIGFuZCBtYWNyb3MgZm9yIE1DRl9HUElPX1BDTFJSX1FTUEkgKi8KKyNkZWZpbmUgTUNGX0dQSU9fUENMUlJfUVNQSV9QQ0xSUl9RU1BJMCAgICAgICAgICAgICgweDAxKQorI2RlZmluZSBNQ0ZfR1BJT19QQ0xSUl9RU1BJX1BDTFJSX1FTUEkxICAgICAgICAgICAgKDB4MDIpCisjZGVmaW5lIE1DRl9HUElPX1BDTFJSX1FTUElfUENMUlJfUVNQSTIgICAgICAgICAgICAoMHgwNCkKKyNkZWZpbmUgTUNGX0dQSU9fUENMUlJfUVNQSV9QQ0xSUl9RU1BJMyAgICAgICAgICAgICgweDA4KQorI2RlZmluZSBNQ0ZfR1BJT19QQ0xSUl9RU1BJX1BDTFJSX1FTUEk0ICAgICAgICAgICAgKDB4MTApCisjZGVmaW5lIE1DRl9HUElPX1BDTFJSX1FTUElfUENMUlJfUVNQSTUgICAgICAgICAgICAoMHgyMCkKKworLyogQml0IGRlZmluaXRpb25zIGFuZCBtYWNyb3MgZm9yIE1DRl9HUElPX1BDTFJSX1RJTUVSICovCisjZGVmaW5lIE1DRl9HUElPX1BDTFJSX1RJTUVSX1BDTFJSX1RJTUVSMCAgICAgICAgICAoMHgwMSkKKyNkZWZpbmUgTUNGX0dQSU9fUENMUlJfVElNRVJfUENMUlJfVElNRVIxICAgICAgICAgICgweDAyKQorI2RlZmluZSBNQ0ZfR1BJT19QQ0xSUl9USU1FUl9QQ0xSUl9USU1FUjIgICAgICAgICAgKDB4MDQpCisjZGVmaW5lIE1DRl9HUElPX1BDTFJSX1RJTUVSX1BDTFJSX1RJTUVSMyAgICAgICAgICAoMHgwOCkKKworLyogQml0IGRlZmluaXRpb25zIGFuZCBtYWNyb3MgZm9yIE1DRl9HUElPX1BDTFJSX0xDRERBVEFIICovCisjZGVmaW5lIE1DRl9HUElPX1BDTFJSX0xDRERBVEFIX1BDTFJSX0xDRERBVEFIMCAgICAoMHgwMSkKKyNkZWZpbmUgTUNGX0dQSU9fUENMUlJfTENEREFUQUhfUENMUlJfTENEREFUQUgxICAgICgweDAyKQorCisvKiBCaXQgZGVmaW5pdGlvbnMgYW5kIG1hY3JvcyBmb3IgTUNGX0dQSU9fUENMUlJfTENEREFUQU0gKi8KKyNkZWZpbmUgTUNGX0dQSU9fUENMUlJfTENEREFUQU1fUENMUlJfTENEREFUQU0wICAgICgweDAxKQorI2RlZmluZSBNQ0ZfR1BJT19QQ0xSUl9MQ0REQVRBTV9QQ0xSUl9MQ0REQVRBTTEgICAgKDB4MDIpCisjZGVmaW5lIE1DRl9HUElPX1BDTFJSX0xDRERBVEFNX1BDTFJSX0xDRERBVEFNMiAgICAoMHgwNCkKKyNkZWZpbmUgTUNGX0dQSU9fUENMUlJfTENEREFUQU1fUENMUlJfTENEREFUQU0zICAgICgweDA4KQorI2RlZmluZSBNQ0ZfR1BJT19QQ0xSUl9MQ0REQVRBTV9QQ0xSUl9MQ0REQVRBTTQgICAgKDB4MTApCisjZGVmaW5lIE1DRl9HUElPX1BDTFJSX0xDRERBVEFNX1BDTFJSX0xDRERBVEFNNSAgICAoMHgyMCkKKyNkZWZpbmUgTUNGX0dQSU9fUENMUlJfTENEREFUQU1fUENMUlJfTENEREFUQU02ICAgICgweDQwKQorI2RlZmluZSBNQ0ZfR1BJT19QQ0xSUl9MQ0REQVRBTV9QQ0xSUl9MQ0REQVRBTTcgICAgKDB4ODApCisKKy8qIEJpdCBkZWZpbml0aW9ucyBhbmQgbWFjcm9zIGZvciBNQ0ZfR1BJT19QQ0xSUl9MQ0REQVRBTCAqLworI2RlZmluZSBNQ0ZfR1BJT19QQ0xSUl9MQ0REQVRBTF9QQ0xSUl9MQ0REQVRBTDAgICAgKDB4MDEpCisjZGVmaW5lIE1DRl9HUElPX1BDTFJSX0xDRERBVEFMX1BDTFJSX0xDRERBVEFMMSAgICAoMHgwMikKKyNkZWZpbmUgTUNGX0dQSU9fUENMUlJfTENEREFUQUxfUENMUlJfTENEREFUQUwyICAgICgweDA0KQorI2RlZmluZSBNQ0ZfR1BJT19QQ0xSUl9MQ0REQVRBTF9QQ0xSUl9MQ0REQVRBTDMgICAgKDB4MDgpCisjZGVmaW5lIE1DRl9HUElPX1BDTFJSX0xDRERBVEFMX1BDTFJSX0xDRERBVEFMNCAgICAoMHgxMCkKKyNkZWZpbmUgTUNGX0dQSU9fUENMUlJfTENEREFUQUxfUENMUlJfTENEREFUQUw1ICAgICgweDIwKQorI2RlZmluZSBNQ0ZfR1BJT19QQ0xSUl9MQ0REQVRBTF9QQ0xSUl9MQ0REQVRBTDYgICAgKDB4NDApCisjZGVmaW5lIE1DRl9HUElPX1BDTFJSX0xDRERBVEFMX1BDTFJSX0xDRERBVEFMNyAgICAoMHg4MCkKKworLyogQml0IGRlZmluaXRpb25zIGFuZCBtYWNyb3MgZm9yIE1DRl9HUElPX1BDTFJSX0xDRENUTEggKi8KKyNkZWZpbmUgTUNGX0dQSU9fUENMUlJfTENEQ1RMSF9QQ0xSUl9MQ0RDVExIMCAgICAgICgweDAxKQorCisvKiBCaXQgZGVmaW5pdGlvbnMgYW5kIG1hY3JvcyBmb3IgTUNGX0dQSU9fUENMUlJfTENEQ1RMTCAqLworI2RlZmluZSBNQ0ZfR1BJT19QQ0xSUl9MQ0RDVExMX1BDTFJSX0xDRENUTEwwICAgICAgKDB4MDEpCisjZGVmaW5lIE1DRl9HUElPX1BDTFJSX0xDRENUTExfUENMUlJfTENEQ1RMTDEgICAgICAoMHgwMikKKyNkZWZpbmUgTUNGX0dQSU9fUENMUlJfTENEQ1RMTF9QQ0xSUl9MQ0RDVExMMiAgICAgICgweDA0KQorI2RlZmluZSBNQ0ZfR1BJT19QQ0xSUl9MQ0RDVExMX1BDTFJSX0xDRENUTEwzICAgICAgKDB4MDgpCisjZGVmaW5lIE1DRl9HUElPX1BDTFJSX0xDRENUTExfUENMUlJfTENEQ1RMTDQgICAgICAoMHgxMCkKKyNkZWZpbmUgTUNGX0dQSU9fUENMUlJfTENEQ1RMTF9QQ0xSUl9MQ0RDVExMNSAgICAgICgweDIwKQorI2RlZmluZSBNQ0ZfR1BJT19QQ0xSUl9MQ0RDVExMX1BDTFJSX0xDRENUTEw2ICAgICAgKDB4NDApCisjZGVmaW5lIE1DRl9HUElPX1BDTFJSX0xDRENUTExfUENMUlJfTENEQ1RMTDcgICAgICAoMHg4MCkKKworLyogQml0IGRlZmluaXRpb25zIGFuZCBtYWNyb3MgZm9yIE1DRl9HUElPX1BBUl9GRUMgKi8KKyNkZWZpbmUgTUNGX0dQSU9fUEFSX0ZFQ19QQVJfRkVDX01JSSh4KSAgICAgICAgICAgICgoKHgpJjB4MDMpPDwwKQorI2RlZmluZSBNQ0ZfR1BJT19QQVJfRkVDX1BBUl9GRUNfN1coeCkgICAgICAgICAgICAgKCgoeCkmMHgwMyk8PDIpCisjZGVmaW5lIE1DRl9HUElPX1BBUl9GRUNfUEFSX0ZFQ183V19HUElPICAgICAgICAgICAoMHgwMCkKKyNkZWZpbmUgTUNGX0dQSU9fUEFSX0ZFQ19QQVJfRkVDXzdXX1VSVFMxICAgICAgICAgICgweDA0KQorI2RlZmluZSBNQ0ZfR1BJT19QQVJfRkVDX1BBUl9GRUNfN1dfRkVDICAgICAgICAgICAgKDB4MEMpCisjZGVmaW5lIE1DRl9HUElPX1BBUl9GRUNfUEFSX0ZFQ19NSUlfR1BJTyAgICAgICAgICAoMHgwMCkKKyNkZWZpbmUgTUNGX0dQSU9fUEFSX0ZFQ19QQVJfRkVDX01JSV9VQVJUICAgICAgICAgICgweDAxKQorI2RlZmluZSBNQ0ZfR1BJT19QQVJfRkVDX1BBUl9GRUNfTUlJX0ZFQyAgICAgICAgICAgKDB4MDMpCisKKy8qIEJpdCBkZWZpbml0aW9ucyBhbmQgbWFjcm9zIGZvciBNQ0ZfR1BJT19QQVJfUFdNICovCisjZGVmaW5lIE1DRl9HUElPX1BBUl9QV01fUEFSX1BXTTEoeCkgICAgICAgICAgICAgICAoKCh4KSYweDAzKTw8MCkKKyNkZWZpbmUgTUNGX0dQSU9fUEFSX1BXTV9QQVJfUFdNMyh4KSAgICAgICAgICAgICAgICgoKHgpJjB4MDMpPDwyKQorI2RlZmluZSBNQ0ZfR1BJT19QQVJfUFdNX1BBUl9QV001ICAgICAgICAgICAgICAgICAgKDB4MTApCisjZGVmaW5lIE1DRl9HUElPX1BBUl9QV01fUEFSX1BXTTcgICAgICAgICAgICAgICAgICAoMHgyMCkKKworLyogQml0IGRlZmluaXRpb25zIGFuZCBtYWNyb3MgZm9yIE1DRl9HUElPX1BBUl9CVVNDVEwgKi8KKyNkZWZpbmUgTUNGX0dQSU9fUEFSX0JVU0NUTF9QQVJfVFMoeCkgICAgICAgICAgICAgICgoKHgpJjB4MDMpPDwzKQorI2RlZmluZSBNQ0ZfR1BJT19QQVJfQlVTQ1RMX1BBUl9SV0IgICAgICAgICAgICAgICAgKDB4MjApCisjZGVmaW5lIE1DRl9HUElPX1BBUl9CVVNDVExfUEFSX1RBICAgICAgICAgICAgICAgICAoMHg0MCkKKyNkZWZpbmUgTUNGX0dQSU9fUEFSX0JVU0NUTF9QQVJfT0UgICAgICAgICAgICAgICAgICgweDgwKQorI2RlZmluZSBNQ0ZfR1BJT19QQVJfQlVTQ1RMX1BBUl9PRV9HUElPICAgICAgICAgICAgKDB4MDApCisjZGVmaW5lIE1DRl9HUElPX1BBUl9CVVNDVExfUEFSX09FX09FICAgICAgICAgICAgICAoMHg4MCkKKyNkZWZpbmUgTUNGX0dQSU9fUEFSX0JVU0NUTF9QQVJfVEFfR1BJTyAgICAgICAgICAgICgweDAwKQorI2RlZmluZSBNQ0ZfR1BJT19QQVJfQlVTQ1RMX1BBUl9UQV9UQSAgICAgICAgICAgICAgKDB4NDApCisjZGVmaW5lIE1DRl9HUElPX1BBUl9CVVNDVExfUEFSX1JXQl9HUElPICAgICAgICAgICAoMHgwMCkKKyNkZWZpbmUgTUNGX0dQSU9fUEFSX0JVU0NUTF9QQVJfUldCX1JXQiAgICAgICAgICAgICgweDIwKQorI2RlZmluZSBNQ0ZfR1BJT19QQVJfQlVTQ1RMX1BBUl9UU19HUElPICAgICAgICAgICAgKDB4MDApCisjZGVmaW5lIE1DRl9HUElPX1BBUl9CVVNDVExfUEFSX1RTX0RBQ0swICAgICAgICAgICAoMHgxMCkKKyNkZWZpbmUgTUNGX0dQSU9fUEFSX0JVU0NUTF9QQVJfVFNfVFMgICAgICAgICAgICAgICgweDE4KQorCisvKiBCaXQgZGVmaW5pdGlvbnMgYW5kIG1hY3JvcyBmb3IgTUNGX0dQSU9fUEFSX0ZFQ0kyQyAqLworI2RlZmluZSBNQ0ZfR1BJT19QQVJfRkVDSTJDX1BBUl9TREEoeCkgICAgICAgICAgICAgKCgoeCkmMHgwMyk8PDApCisjZGVmaW5lIE1DRl9HUElPX1BBUl9GRUNJMkNfUEFSX1NDTCh4KSAgICAgICAgICAgICAoKCh4KSYweDAzKTw8MikKKyNkZWZpbmUgTUNGX0dQSU9fUEFSX0ZFQ0kyQ19QQVJfTURJTyh4KSAgICAgICAgICAgICgoKHgpJjB4MDMpPDw0KQorI2RlZmluZSBNQ0ZfR1BJT19QQVJfRkVDSTJDX1BBUl9NREMoeCkgICAgICAgICAgICAgKCgoeCkmMHgwMyk8PDYpCisjZGVmaW5lIE1DRl9HUElPX1BBUl9GRUNJMkNfUEFSX01EQ19HUElPICAgICAgICAgICAoMHgwMCkKKyNkZWZpbmUgTUNGX0dQSU9fUEFSX0ZFQ0kyQ19QQVJfTURDX1VUWEQyICAgICAgICAgICgweDQwKQorI2RlZmluZSBNQ0ZfR1BJT19QQVJfRkVDSTJDX1BBUl9NRENfU0NMICAgICAgICAgICAgKDB4ODApCisjZGVmaW5lIE1DRl9HUElPX1BBUl9GRUNJMkNfUEFSX01EQ19FTURDICAgICAgICAgICAoMHhDMCkKKyNkZWZpbmUgTUNGX0dQSU9fUEFSX0ZFQ0kyQ19QQVJfTURJT19HUElPICAgICAgICAgICgweDAwKQorI2RlZmluZSBNQ0ZfR1BJT19QQVJfRkVDSTJDX1BBUl9NRElPX1VSWEQyICAgICAgICAgKDB4MTApCisjZGVmaW5lIE1DRl9HUElPX1BBUl9GRUNJMkNfUEFSX01ESU9fU0RBICAgICAgICAgICAoMHgyMCkKKyNkZWZpbmUgTUNGX0dQSU9fUEFSX0ZFQ0kyQ19QQVJfTURJT19FTURJTyAgICAgICAgICgweDMwKQorI2RlZmluZSBNQ0ZfR1BJT19QQVJfRkVDSTJDX1BBUl9TQ0xfR1BJTyAgICAgICAgICAgKDB4MDApCisjZGVmaW5lIE1DRl9HUElPX1BBUl9GRUNJMkNfUEFSX1NDTF9VVFhEMiAgICAgICAgICAoMHgwNCkKKyNkZWZpbmUgTUNGX0dQSU9fUEFSX0ZFQ0kyQ19QQVJfU0NMX1NDTCAgICAgICAgICAgICgweDBDKQorI2RlZmluZSBNQ0ZfR1BJT19QQVJfRkVDSTJDX1BBUl9TREFfR1BJTyAgICAgICAgICAgKDB4MDApCisjZGVmaW5lIE1DRl9HUElPX1BBUl9GRUNJMkNfUEFSX1NEQV9VUlhEMiAgICAgICAgICAoMHgwMikKKyNkZWZpbmUgTUNGX0dQSU9fUEFSX0ZFQ0kyQ19QQVJfU0RBX1NEQSAgICAgICAgICAgICgweDAzKQorCisvKiBCaXQgZGVmaW5pdGlvbnMgYW5kIG1hY3JvcyBmb3IgTUNGX0dQSU9fUEFSX0JFICovCisjZGVmaW5lIE1DRl9HUElPX1BBUl9CRV9QQVJfQkUwICAgICAgICAgICAgICAgICAgICAoMHgwMSkKKyNkZWZpbmUgTUNGX0dQSU9fUEFSX0JFX1BBUl9CRTEgICAgICAgICAgICAgICAgICAgICgweDAyKQorI2RlZmluZSBNQ0ZfR1BJT19QQVJfQkVfUEFSX0JFMiAgICAgICAgICAgICAgICAgICAgKDB4MDQpCisjZGVmaW5lIE1DRl9HUElPX1BBUl9CRV9QQVJfQkUzICAgICAgICAgICAgICAgICAgICAoMHgwOCkKKworLyogQml0IGRlZmluaXRpb25zIGFuZCBtYWNyb3MgZm9yIE1DRl9HUElPX1BBUl9DUyAqLworI2RlZmluZSBNQ0ZfR1BJT19QQVJfQ1NfUEFSX0NTMSAgICAgICAgICAgICAgICAgICAgKDB4MDIpCisjZGVmaW5lIE1DRl9HUElPX1BBUl9DU19QQVJfQ1MyICAgICAgICAgICAgICAgICAgICAoMHgwNCkKKyNkZWZpbmUgTUNGX0dQSU9fUEFSX0NTX1BBUl9DUzMgICAgICAgICAgICAgICAgICAgICgweDA4KQorI2RlZmluZSBNQ0ZfR1BJT19QQVJfQ1NfUEFSX0NTNCAgICAgICAgICAgICAgICAgICAgKDB4MTApCisjZGVmaW5lIE1DRl9HUElPX1BBUl9DU19QQVJfQ1M1ICAgICAgICAgICAgICAgICAgICAoMHgyMCkKKyNkZWZpbmUgTUNGX0dQSU9fUEFSX0NTX1BBUl9DU19DUzFfR1BJTyAgICAgICAgICAgICgweDAwKQorI2RlZmluZSBNQ0ZfR1BJT19QQVJfQ1NfUEFSX0NTX0NTMV9TRENTMSAgICAgICAgICAgKDB4MDEpCisjZGVmaW5lIE1DRl9HUElPX1BBUl9DU19QQVJfQ1NfQ1MxX0NTMSAgICAgICAgICAgICAoMHgwMykKKworLyogQml0IGRlZmluaXRpb25zIGFuZCBtYWNyb3MgZm9yIE1DRl9HUElPX1BBUl9TU0kgKi8KKyNkZWZpbmUgTUNGX0dQSU9fUEFSX1NTSV9QQVJfTUNMSyAgICAgICAgICAgICAgICAgICgweDAwODApCisjZGVmaW5lIE1DRl9HUElPX1BBUl9TU0lfUEFSX1RYRCh4KSAgICAgICAgICAgICAgICAoKCh4KSYweDAwMDMpPDw4KQorI2RlZmluZSBNQ0ZfR1BJT19QQVJfU1NJX1BBUl9SWEQoeCkgICAgICAgICAgICAgICAgKCgoeCkmMHgwMDAzKTw8MTApCisjZGVmaW5lIE1DRl9HUElPX1BBUl9TU0lfUEFSX0ZTKHgpICAgICAgICAgICAgICAgICAoKCh4KSYweDAwMDMpPDwxMikKKyNkZWZpbmUgTUNGX0dQSU9fUEFSX1NTSV9QQVJfQkNMSyh4KSAgICAgICAgICAgICAgICgoKHgpJjB4MDAwMyk8PDE0KQorCisvKiBCaXQgZGVmaW5pdGlvbnMgYW5kIG1hY3JvcyBmb3IgTUNGX0dQSU9fUEFSX1VBUlQgKi8KKyNkZWZpbmUgTUNGX0dQSU9fUEFSX1VBUlRfUEFSX1VUWEQwICAgICAgICAgICAgICAgICgweDAwMDEpCisjZGVmaW5lIE1DRl9HUElPX1BBUl9VQVJUX1BBUl9VUlhEMCAgICAgICAgICAgICAgICAoMHgwMDAyKQorI2RlZmluZSBNQ0ZfR1BJT19QQVJfVUFSVF9QQVJfVVJUUzAgICAgICAgICAgICAgICAgKDB4MDAwNCkKKyNkZWZpbmUgTUNGX0dQSU9fUEFSX1VBUlRfUEFSX1VDVFMwICAgICAgICAgICAgICAgICgweDAwMDgpCisjZGVmaW5lIE1DRl9HUElPX1BBUl9VQVJUX1BBUl9VVFhEMSh4KSAgICAgICAgICAgICAoKCh4KSYweDAwMDMpPDw0KQorI2RlZmluZSBNQ0ZfR1BJT19QQVJfVUFSVF9QQVJfVVJYRDEoeCkgICAgICAgICAgICAgKCgoeCkmMHgwMDAzKTw8NikKKyNkZWZpbmUgTUNGX0dQSU9fUEFSX1VBUlRfUEFSX1VSVFMxKHgpICAgICAgICAgICAgICgoKHgpJjB4MDAwMyk8PDgpCisjZGVmaW5lIE1DRl9HUElPX1BBUl9VQVJUX1BBUl9VQ1RTMSh4KSAgICAgICAgICAgICAoKCh4KSYweDAwMDMpPDwxMCkKKyNkZWZpbmUgTUNGX0dQSU9fUEFSX1VBUlRfUEFSX1VDVFMxX0dQSU8gICAgICAgICAgICgweDAwMDApCisjZGVmaW5lIE1DRl9HUElPX1BBUl9VQVJUX1BBUl9VQ1RTMV9TU0lfQkNMSyAgICAgICAoMHgwODAwKQorI2RlZmluZSBNQ0ZfR1BJT19QQVJfVUFSVF9QQVJfVUNUUzFfVUxQSV9ENyAgICAgICAgKDB4MDQwMCkKKyNkZWZpbmUgTUNGX0dQSU9fUEFSX1VBUlRfUEFSX1VDVFMxX1VDVFMxICAgICAgICAgICgweDBDMDApCisjZGVmaW5lIE1DRl9HUElPX1BBUl9VQVJUX1BBUl9VUlRTMV9HUElPICAgICAgICAgICAoMHgwMDAwKQorI2RlZmluZSBNQ0ZfR1BJT19QQVJfVUFSVF9QQVJfVVJUUzFfU1NJX0ZTICAgICAgICAgKDB4MDIwMCkKKyNkZWZpbmUgTUNGX0dQSU9fUEFSX1VBUlRfUEFSX1VSVFMxX1VMUElfRDYgICAgICAgICgweDAxMDApCisjZGVmaW5lIE1DRl9HUElPX1BBUl9VQVJUX1BBUl9VUlRTMV9VUlRTMSAgICAgICAgICAoMHgwMzAwKQorI2RlZmluZSBNQ0ZfR1BJT19QQVJfVUFSVF9QQVJfVVJYRDFfR1BJTyAgICAgICAgICAgKDB4MDAwMCkKKyNkZWZpbmUgTUNGX0dQSU9fUEFSX1VBUlRfUEFSX1VSWEQxX1NTSV9SWEQgICAgICAgICgweDAwODApCisjZGVmaW5lIE1DRl9HUElPX1BBUl9VQVJUX1BBUl9VUlhEMV9VTFBJX0Q1ICAgICAgICAoMHgwMDQwKQorI2RlZmluZSBNQ0ZfR1BJT19QQVJfVUFSVF9QQVJfVVJYRDFfVVJYRDEgICAgICAgICAgKDB4MDBDMCkKKyNkZWZpbmUgTUNGX0dQSU9fUEFSX1VBUlRfUEFSX1VUWEQxX0dQSU8gICAgICAgICAgICgweDAwMDApCisjZGVmaW5lIE1DRl9HUElPX1BBUl9VQVJUX1BBUl9VVFhEMV9TU0lfVFhEICAgICAgICAoMHgwMDIwKQorI2RlZmluZSBNQ0ZfR1BJT19QQVJfVUFSVF9QQVJfVVRYRDFfVUxQSV9ENCAgICAgICAgKDB4MDAxMCkKKyNkZWZpbmUgTUNGX0dQSU9fUEFSX1VBUlRfUEFSX1VUWEQxX1VUWEQxICAgICAgICAgICgweDAwMzApCisKKy8qIEJpdCBkZWZpbml0aW9ucyBhbmQgbWFjcm9zIGZvciBNQ0ZfR1BJT19QQVJfUVNQSSAqLworI2RlZmluZSBNQ0ZfR1BJT19QQVJfUVNQSV9QQVJfU0NLKHgpICAgICAgICAgICAgICAgKCgoeCkmMHgwMDAzKTw8NCkKKyNkZWZpbmUgTUNGX0dQSU9fUEFSX1FTUElfUEFSX0RPVVQoeCkgICAgICAgICAgICAgICgoKHgpJjB4MDAwMyk8PDYpCisjZGVmaW5lIE1DRl9HUElPX1BBUl9RU1BJX1BBUl9ESU4oeCkgICAgICAgICAgICAgICAoKCh4KSYweDAwMDMpPDw4KQorI2RlZmluZSBNQ0ZfR1BJT19QQVJfUVNQSV9QQVJfUENTMCh4KSAgICAgICAgICAgICAgKCgoeCkmMHgwMDAzKTw8MTApCisjZGVmaW5lIE1DRl9HUElPX1BBUl9RU1BJX1BBUl9QQ1MxKHgpICAgICAgICAgICAgICAoKCh4KSYweDAwMDMpPDwxMikKKyNkZWZpbmUgTUNGX0dQSU9fUEFSX1FTUElfUEFSX1BDUzIoeCkgICAgICAgICAgICAgICgoKHgpJjB4MDAwMyk8PDE0KQorCisvKiBCaXQgZGVmaW5pdGlvbnMgYW5kIG1hY3JvcyBmb3IgTUNGX0dQSU9fUEFSX1RJTUVSICovCisjZGVmaW5lIE1DRl9HUElPX1BBUl9USU1FUl9QQVJfVElOMCh4KSAgICAgICAgICAgICAoKCh4KSYweDAzKTw8MCkKKyNkZWZpbmUgTUNGX0dQSU9fUEFSX1RJTUVSX1BBUl9USU4xKHgpICAgICAgICAgICAgICgoKHgpJjB4MDMpPDwyKQorI2RlZmluZSBNQ0ZfR1BJT19QQVJfVElNRVJfUEFSX1RJTjIoeCkgICAgICAgICAgICAgKCgoeCkmMHgwMyk8PDQpCisjZGVmaW5lIE1DRl9HUElPX1BBUl9USU1FUl9QQVJfVElOMyh4KSAgICAgICAgICAgICAoKCh4KSYweDAzKTw8NikKKyNkZWZpbmUgTUNGX0dQSU9fUEFSX1RJTUVSX1BBUl9USU4zX0dQSU8gICAgICAgICAgICgweDAwKQorI2RlZmluZSBNQ0ZfR1BJT19QQVJfVElNRVJfUEFSX1RJTjNfVE9VVDMgICAgICAgICAgKDB4ODApCisjZGVmaW5lIE1DRl9HUElPX1BBUl9USU1FUl9QQVJfVElOM19VUlhEMiAgICAgICAgICAoMHg0MCkKKyNkZWZpbmUgTUNGX0dQSU9fUEFSX1RJTUVSX1BBUl9USU4zX1RJTjMgICAgICAgICAgICgweEMwKQorI2RlZmluZSBNQ0ZfR1BJT19QQVJfVElNRVJfUEFSX1RJTjJfR1BJTyAgICAgICAgICAgKDB4MDApCisjZGVmaW5lIE1DRl9HUElPX1BBUl9USU1FUl9QQVJfVElOMl9UT1VUMiAgICAgICAgICAoMHgyMCkKKyNkZWZpbmUgTUNGX0dQSU9fUEFSX1RJTUVSX1BBUl9USU4yX1VUWEQyICAgICAgICAgICgweDEwKQorI2RlZmluZSBNQ0ZfR1BJT19QQVJfVElNRVJfUEFSX1RJTjJfVElOMiAgICAgICAgICAgKDB4MzApCisjZGVmaW5lIE1DRl9HUElPX1BBUl9USU1FUl9QQVJfVElOMV9HUElPICAgICAgICAgICAoMHgwMCkKKyNkZWZpbmUgTUNGX0dQSU9fUEFSX1RJTUVSX1BBUl9USU4xX1RPVVQxICAgICAgICAgICgweDA4KQorI2RlZmluZSBNQ0ZfR1BJT19QQVJfVElNRVJfUEFSX1RJTjFfREFDSzEgICAgICAgICAgKDB4MDQpCisjZGVmaW5lIE1DRl9HUElPX1BBUl9USU1FUl9QQVJfVElOMV9USU4xICAgICAgICAgICAoMHgwQykKKyNkZWZpbmUgTUNGX0dQSU9fUEFSX1RJTUVSX1BBUl9USU4wX0dQSU8gICAgICAgICAgICgweDAwKQorI2RlZmluZSBNQ0ZfR1BJT19QQVJfVElNRVJfUEFSX1RJTjBfVE9VVDAgICAgICAgICAgKDB4MDIpCisjZGVmaW5lIE1DRl9HUElPX1BBUl9USU1FUl9QQVJfVElOMF9EUkVRMCAgICAgICAgICAoMHgwMSkKKyNkZWZpbmUgTUNGX0dQSU9fUEFSX1RJTUVSX1BBUl9USU4wX1RJTjAgICAgICAgICAgICgweDAzKQorCisvKiBCaXQgZGVmaW5pdGlvbnMgYW5kIG1hY3JvcyBmb3IgTUNGX0dQSU9fUEFSX0xDRERBVEEgKi8KKyNkZWZpbmUgTUNGX0dQSU9fUEFSX0xDRERBVEFfUEFSX0xEN18wKHgpICAgICAgICAgICgoKHgpJjB4MDMpPDwwKQorI2RlZmluZSBNQ0ZfR1BJT19QQVJfTENEREFUQV9QQVJfTEQxNV84KHgpICAgICAgICAgKCgoeCkmMHgwMyk8PDIpCisjZGVmaW5lIE1DRl9HUElPX1BBUl9MQ0REQVRBX1BBUl9MRDE2KHgpICAgICAgICAgICAoKCh4KSYweDAzKTw8NCkKKyNkZWZpbmUgTUNGX0dQSU9fUEFSX0xDRERBVEFfUEFSX0xEMTcoeCkgICAgICAgICAgICgoKHgpJjB4MDMpPDw2KQorCisvKiBCaXQgZGVmaW5pdGlvbnMgYW5kIG1hY3JvcyBmb3IgTUNGX0dQSU9fUEFSX0xDRENUTCAqLworI2RlZmluZSBNQ0ZfR1BJT19QQVJfTENEQ1RMX1BBUl9DTFMgICAgICAgICAgICAgICAgKDB4MDAwMSkKKyNkZWZpbmUgTUNGX0dQSU9fUEFSX0xDRENUTF9QQVJfUFMgICAgICAgICAgICAgICAgICgweDAwMDIpCisjZGVmaW5lIE1DRl9HUElPX1BBUl9MQ0RDVExfUEFSX1JFViAgICAgICAgICAgICAgICAoMHgwMDA0KQorI2RlZmluZSBNQ0ZfR1BJT19QQVJfTENEQ1RMX1BBUl9TUExfU1BSICAgICAgICAgICAgKDB4MDAwOCkKKyNkZWZpbmUgTUNGX0dQSU9fUEFSX0xDRENUTF9QQVJfQ09OVFJBU1QgICAgICAgICAgICgweDAwMTApCisjZGVmaW5lIE1DRl9HUElPX1BBUl9MQ0RDVExfUEFSX0xTQ0xLICAgICAgICAgICAgICAoMHgwMDIwKQorI2RlZmluZSBNQ0ZfR1BJT19QQVJfTENEQ1RMX1BBUl9MUF9IU1lOQyAgICAgICAgICAgKDB4MDA0MCkKKyNkZWZpbmUgTUNGX0dQSU9fUEFSX0xDRENUTF9QQVJfRkxNX1ZTWU5DICAgICAgICAgICgweDAwODApCisjZGVmaW5lIE1DRl9HUElPX1BBUl9MQ0RDVExfUEFSX0FDRF9PRSAgICAgICAgICAgICAoMHgwMTAwKQorCisvKiBCaXQgZGVmaW5pdGlvbnMgYW5kIG1hY3JvcyBmb3IgTUNGX0dQSU9fUEFSX0lSUSAqLworI2RlZmluZSBNQ0ZfR1BJT19QQVJfSVJRX1BBUl9JUlExKHgpICAgICAgICAgICAgICAgKCgoeCkmMHgwMDAzKTw8NCkKKyNkZWZpbmUgTUNGX0dQSU9fUEFSX0lSUV9QQVJfSVJRMih4KSAgICAgICAgICAgICAgICgoKHgpJjB4MDAwMyk8PDYpCisjZGVmaW5lIE1DRl9HUElPX1BBUl9JUlFfUEFSX0lSUTQoeCkgICAgICAgICAgICAgICAoKCh4KSYweDAwMDMpPDw4KQorI2RlZmluZSBNQ0ZfR1BJT19QQVJfSVJRX1BBUl9JUlE1KHgpICAgICAgICAgICAgICAgKCgoeCkmMHgwMDAzKTw8MTApCisjZGVmaW5lIE1DRl9HUElPX1BBUl9JUlFfUEFSX0lSUTYoeCkgICAgICAgICAgICAgICAoKCh4KSYweDAwMDMpPDwxMikKKworLyogQml0IGRlZmluaXRpb25zIGFuZCBtYWNyb3MgZm9yIE1DRl9HUElPX01TQ1JfRkxFWEJVUyAqLworI2RlZmluZSBNQ0ZfR1BJT19NU0NSX0ZMRVhCVVNfTVNDUl9BRERSQ1RMKHgpICAgICAgKCgoeCkmMHgwMyk8PDApCisjZGVmaW5lIE1DRl9HUElPX01TQ1JfRkxFWEJVU19NU0NSX0RMT1dFUih4KSAgICAgICAoKCh4KSYweDAzKTw8MikKKyNkZWZpbmUgTUNGX0dQSU9fTVNDUl9GTEVYQlVTX01TQ1JfRFVQUEVSKHgpICAgICAgICgoKHgpJjB4MDMpPDw0KQorCisvKiBCaXQgZGVmaW5pdGlvbnMgYW5kIG1hY3JvcyBmb3IgTUNGX0dQSU9fTVNDUl9TRFJBTSAqLworI2RlZmluZSBNQ0ZfR1BJT19NU0NSX1NEUkFNX01TQ1JfU0RSQU0oeCkgICAgICAgICAgKCgoeCkmMHgwMyk8PDApCisjZGVmaW5lIE1DRl9HUElPX01TQ1JfU0RSQU1fTVNDUl9TRENMSyh4KSAgICAgICAgICAoKCh4KSYweDAzKTw8MikKKyNkZWZpbmUgTUNGX0dQSU9fTVNDUl9TRFJBTV9NU0NSX1NEQ0xLQih4KSAgICAgICAgICgoKHgpJjB4MDMpPDw0KQorCisvKiBCaXQgZGVmaW5pdGlvbnMgYW5kIG1hY3JvcyBmb3IgTUNGX0dQSU9fRFNDUl9JMkMgKi8KKyNkZWZpbmUgTUNGX0dQSU9fRFNDUl9JMkNfSTJDX0RTRSh4KSAgICAgICAgICAgICAgICgoKHgpJjB4MDMpPDwwKQorCisvKiBCaXQgZGVmaW5pdGlvbnMgYW5kIG1hY3JvcyBmb3IgTUNGX0dQSU9fRFNDUl9QV00gKi8KKyNkZWZpbmUgTUNGX0dQSU9fRFNDUl9QV01fUFdNX0RTRSh4KSAgICAgICAgICAgICAgICgoKHgpJjB4MDMpPDwwKQorCisvKiBCaXQgZGVmaW5pdGlvbnMgYW5kIG1hY3JvcyBmb3IgTUNGX0dQSU9fRFNDUl9GRUMgKi8KKyNkZWZpbmUgTUNGX0dQSU9fRFNDUl9GRUNfRkVDX0RTRSh4KSAgICAgICAgICAgICAgICgoKHgpJjB4MDMpPDwwKQorCisvKiBCaXQgZGVmaW5pdGlvbnMgYW5kIG1hY3JvcyBmb3IgTUNGX0dQSU9fRFNDUl9VQVJUICovCisjZGVmaW5lIE1DRl9HUElPX0RTQ1JfVUFSVF9VQVJUMF9EU0UoeCkgICAgICAgICAgICAoKCh4KSYweDAzKTw8MCkKKyNkZWZpbmUgTUNGX0dQSU9fRFNDUl9VQVJUX1VBUlQxX0RTRSh4KSAgICAgICAgICAgICgoKHgpJjB4MDMpPDwyKQorCisvKiBCaXQgZGVmaW5pdGlvbnMgYW5kIG1hY3JvcyBmb3IgTUNGX0dQSU9fRFNDUl9RU1BJICovCisjZGVmaW5lIE1DRl9HUElPX0RTQ1JfUVNQSV9RU1BJX0RTRSh4KSAgICAgICAgICAgICAoKCh4KSYweDAzKTw8MCkKKworLyogQml0IGRlZmluaXRpb25zIGFuZCBtYWNyb3MgZm9yIE1DRl9HUElPX0RTQ1JfVElNRVIgKi8KKyNkZWZpbmUgTUNGX0dQSU9fRFNDUl9USU1FUl9USU1FUl9EU0UoeCkgICAgICAgICAgICgoKHgpJjB4MDMpPDwwKQorCisvKiBCaXQgZGVmaW5pdGlvbnMgYW5kIG1hY3JvcyBmb3IgTUNGX0dQSU9fRFNDUl9TU0kgKi8KKyNkZWZpbmUgTUNGX0dQSU9fRFNDUl9TU0lfU1NJX0RTRSh4KSAgICAgICAgICAgICAgICgoKHgpJjB4MDMpPDwwKQorCisvKiBCaXQgZGVmaW5pdGlvbnMgYW5kIG1hY3JvcyBmb3IgTUNGX0dQSU9fRFNDUl9MQ0QgKi8KKyNkZWZpbmUgTUNGX0dQSU9fRFNDUl9MQ0RfTENEX0RTRSh4KSAgICAgICAgICAgICAgICgoKHgpJjB4MDMpPDwwKQorCisvKiBCaXQgZGVmaW5pdGlvbnMgYW5kIG1hY3JvcyBmb3IgTUNGX0dQSU9fRFNDUl9ERUJVRyAqLworI2RlZmluZSBNQ0ZfR1BJT19EU0NSX0RFQlVHX0RFQlVHX0RTRSh4KSAgICAgICAgICAgKCgoeCkmMHgwMyk8PDApCisKKy8qIEJpdCBkZWZpbml0aW9ucyBhbmQgbWFjcm9zIGZvciBNQ0ZfR1BJT19EU0NSX0NMS1JTVCAqLworI2RlZmluZSBNQ0ZfR1BJT19EU0NSX0NMS1JTVF9DTEtSU1RfRFNFKHgpICAgICAgICAgKCgoeCkmMHgwMyk8PDApCisKKy8qIEJpdCBkZWZpbml0aW9ucyBhbmQgbWFjcm9zIGZvciBNQ0ZfR1BJT19EU0NSX0lSUSAqLworI2RlZmluZSBNQ0ZfR1BJT19EU0NSX0lSUV9JUlFfRFNFKHgpICAgICAgICAgICAgICAgKCgoeCkmMHgwMyk8PDApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBJbnRlcnJ1cHQgQ29udHJvbGxlciAoSU5UQykKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBSZWdpc3RlciByZWFkL3dyaXRlIG1hY3JvcyAqLworI2RlZmluZSBNQ0ZfSU5UQzBfSVBSSCAgICAgICAgICAgICBNQ0ZfUkVHMzIoMHhGQzA0ODAwMCkKKyNkZWZpbmUgTUNGX0lOVEMwX0lQUkwgICAgICAgICAgICAgTUNGX1JFRzMyKDB4RkMwNDgwMDQpCisjZGVmaW5lIE1DRl9JTlRDMF9JTVJIICAgICAgICAgICAgIE1DRl9SRUczMigweEZDMDQ4MDA4KQorI2RlZmluZSBNQ0ZfSU5UQzBfSU1STCAgICAgICAgICAgICBNQ0ZfUkVHMzIoMHhGQzA0ODAwQykKKyNkZWZpbmUgTUNGX0lOVEMwX0lOVEZSQ0ggICAgICAgICAgTUNGX1JFRzMyKDB4RkMwNDgwMTApCisjZGVmaW5lIE1DRl9JTlRDMF9JTlRGUkNMICAgICAgICAgIE1DRl9SRUczMigweEZDMDQ4MDE0KQorI2RlZmluZSBNQ0ZfSU5UQzBfSUNPTkZJRyAgICAgICAgICBNQ0ZfUkVHMTYoMHhGQzA0ODAxQSkKKyNkZWZpbmUgTUNGX0lOVEMwX1NJTVIgICAgICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNDgwMUMpCisjZGVmaW5lIE1DRl9JTlRDMF9DSU1SICAgICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDQ4MDFEKQorI2RlZmluZSBNQ0ZfSU5UQzBfQ0xNQVNLICAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0ODAxRSkKKyNkZWZpbmUgTUNGX0lOVEMwX1NMTUFTSyAgICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNDgwMUYpCisjZGVmaW5lIE1DRl9JTlRDMF9JQ1IwICAgICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDQ4MDQwKQorI2RlZmluZSBNQ0ZfSU5UQzBfSUNSMSAgICAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0ODA0MSkKKyNkZWZpbmUgTUNGX0lOVEMwX0lDUjIgICAgICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNDgwNDIpCisjZGVmaW5lIE1DRl9JTlRDMF9JQ1IzICAgICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDQ4MDQzKQorI2RlZmluZSBNQ0ZfSU5UQzBfSUNSNCAgICAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0ODA0NCkKKyNkZWZpbmUgTUNGX0lOVEMwX0lDUjUgICAgICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNDgwNDUpCisjZGVmaW5lIE1DRl9JTlRDMF9JQ1I2ICAgICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDQ4MDQ2KQorI2RlZmluZSBNQ0ZfSU5UQzBfSUNSNyAgICAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0ODA0NykKKyNkZWZpbmUgTUNGX0lOVEMwX0lDUjggICAgICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNDgwNDgpCisjZGVmaW5lIE1DRl9JTlRDMF9JQ1I5ICAgICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDQ4MDQ5KQorI2RlZmluZSBNQ0ZfSU5UQzBfSUNSMTAgICAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0ODA0QSkKKyNkZWZpbmUgTUNGX0lOVEMwX0lDUjExICAgICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNDgwNEIpCisjZGVmaW5lIE1DRl9JTlRDMF9JQ1IxMiAgICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDQ4MDRDKQorI2RlZmluZSBNQ0ZfSU5UQzBfSUNSMTMgICAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0ODA0RCkKKyNkZWZpbmUgTUNGX0lOVEMwX0lDUjE0ICAgICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNDgwNEUpCisjZGVmaW5lIE1DRl9JTlRDMF9JQ1IxNSAgICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDQ4MDRGKQorI2RlZmluZSBNQ0ZfSU5UQzBfSUNSMTYgICAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0ODA1MCkKKyNkZWZpbmUgTUNGX0lOVEMwX0lDUjE3ICAgICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNDgwNTEpCisjZGVmaW5lIE1DRl9JTlRDMF9JQ1IxOCAgICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDQ4MDUyKQorI2RlZmluZSBNQ0ZfSU5UQzBfSUNSMTkgICAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0ODA1MykKKyNkZWZpbmUgTUNGX0lOVEMwX0lDUjIwICAgICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNDgwNTQpCisjZGVmaW5lIE1DRl9JTlRDMF9JQ1IyMSAgICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDQ4MDU1KQorI2RlZmluZSBNQ0ZfSU5UQzBfSUNSMjIgICAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0ODA1NikKKyNkZWZpbmUgTUNGX0lOVEMwX0lDUjIzICAgICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNDgwNTcpCisjZGVmaW5lIE1DRl9JTlRDMF9JQ1IyNCAgICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDQ4MDU4KQorI2RlZmluZSBNQ0ZfSU5UQzBfSUNSMjUgICAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0ODA1OSkKKyNkZWZpbmUgTUNGX0lOVEMwX0lDUjI2ICAgICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNDgwNUEpCisjZGVmaW5lIE1DRl9JTlRDMF9JQ1IyNyAgICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDQ4MDVCKQorI2RlZmluZSBNQ0ZfSU5UQzBfSUNSMjggICAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0ODA1QykKKyNkZWZpbmUgTUNGX0lOVEMwX0lDUjI5ICAgICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNDgwNUQpCisjZGVmaW5lIE1DRl9JTlRDMF9JQ1IzMCAgICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDQ4MDVFKQorI2RlZmluZSBNQ0ZfSU5UQzBfSUNSMzEgICAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0ODA1RikKKyNkZWZpbmUgTUNGX0lOVEMwX0lDUjMyICAgICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNDgwNjApCisjZGVmaW5lIE1DRl9JTlRDMF9JQ1IzMyAgICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDQ4MDYxKQorI2RlZmluZSBNQ0ZfSU5UQzBfSUNSMzQgICAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0ODA2MikKKyNkZWZpbmUgTUNGX0lOVEMwX0lDUjM1ICAgICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNDgwNjMpCisjZGVmaW5lIE1DRl9JTlRDMF9JQ1IzNiAgICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDQ4MDY0KQorI2RlZmluZSBNQ0ZfSU5UQzBfSUNSMzcgICAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0ODA2NSkKKyNkZWZpbmUgTUNGX0lOVEMwX0lDUjM4ICAgICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNDgwNjYpCisjZGVmaW5lIE1DRl9JTlRDMF9JQ1IzOSAgICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDQ4MDY3KQorI2RlZmluZSBNQ0ZfSU5UQzBfSUNSNDAgICAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0ODA2OCkKKyNkZWZpbmUgTUNGX0lOVEMwX0lDUjQxICAgICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNDgwNjkpCisjZGVmaW5lIE1DRl9JTlRDMF9JQ1I0MiAgICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDQ4MDZBKQorI2RlZmluZSBNQ0ZfSU5UQzBfSUNSNDMgICAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0ODA2QikKKyNkZWZpbmUgTUNGX0lOVEMwX0lDUjQ0ICAgICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNDgwNkMpCisjZGVmaW5lIE1DRl9JTlRDMF9JQ1I0NSAgICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDQ4MDZEKQorI2RlZmluZSBNQ0ZfSU5UQzBfSUNSNDYgICAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0ODA2RSkKKyNkZWZpbmUgTUNGX0lOVEMwX0lDUjQ3ICAgICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNDgwNkYpCisjZGVmaW5lIE1DRl9JTlRDMF9JQ1I0OCAgICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDQ4MDcwKQorI2RlZmluZSBNQ0ZfSU5UQzBfSUNSNDkgICAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0ODA3MSkKKyNkZWZpbmUgTUNGX0lOVEMwX0lDUjUwICAgICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNDgwNzIpCisjZGVmaW5lIE1DRl9JTlRDMF9JQ1I1MSAgICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDQ4MDczKQorI2RlZmluZSBNQ0ZfSU5UQzBfSUNSNTIgICAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0ODA3NCkKKyNkZWZpbmUgTUNGX0lOVEMwX0lDUjUzICAgICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNDgwNzUpCisjZGVmaW5lIE1DRl9JTlRDMF9JQ1I1NCAgICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDQ4MDc2KQorI2RlZmluZSBNQ0ZfSU5UQzBfSUNSNTUgICAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0ODA3NykKKyNkZWZpbmUgTUNGX0lOVEMwX0lDUjU2ICAgICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNDgwNzgpCisjZGVmaW5lIE1DRl9JTlRDMF9JQ1I1NyAgICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDQ4MDc5KQorI2RlZmluZSBNQ0ZfSU5UQzBfSUNSNTggICAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0ODA3QSkKKyNkZWZpbmUgTUNGX0lOVEMwX0lDUjU5ICAgICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNDgwN0IpCisjZGVmaW5lIE1DRl9JTlRDMF9JQ1I2MCAgICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDQ4MDdDKQorI2RlZmluZSBNQ0ZfSU5UQzBfSUNSNjEgICAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0ODA3RCkKKyNkZWZpbmUgTUNGX0lOVEMwX0lDUjYyICAgICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNDgwN0UpCisjZGVmaW5lIE1DRl9JTlRDMF9JQ1I2MyAgICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDQ4MDdGKQorI2RlZmluZSBNQ0ZfSU5UQzBfSUNSKHgpICAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0ODA0MCsoKHgpKjB4MDAxKSkKKyNkZWZpbmUgTUNGX0lOVEMwX1NXSUFDSyAgICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNDgwRTApCisjZGVmaW5lIE1DRl9JTlRDMF9MMUlBQ0sgICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDQ4MEU0KQorI2RlZmluZSBNQ0ZfSU5UQzBfTDJJQUNLICAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0ODBFOCkKKyNkZWZpbmUgTUNGX0lOVEMwX0wzSUFDSyAgICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNDgwRUMpCisjZGVmaW5lIE1DRl9JTlRDMF9MNElBQ0sgICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDQ4MEYwKQorI2RlZmluZSBNQ0ZfSU5UQzBfTDVJQUNLICAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0ODBGNCkKKyNkZWZpbmUgTUNGX0lOVEMwX0w2SUFDSyAgICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNDgwRjgpCisjZGVmaW5lIE1DRl9JTlRDMF9MN0lBQ0sgICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDQ4MEZDKQorI2RlZmluZSBNQ0ZfSU5UQzBfTElBQ0soeCkgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0ODBFNCsoKHgpKjB4MDA0KSkKKyNkZWZpbmUgTUNGX0lOVEMxX0lQUkggICAgICAgICAgICAgTUNGX1JFRzMyKDB4RkMwNEMwMDApCisjZGVmaW5lIE1DRl9JTlRDMV9JUFJMICAgICAgICAgICAgIE1DRl9SRUczMigweEZDMDRDMDA0KQorI2RlZmluZSBNQ0ZfSU5UQzFfSU1SSCAgICAgICAgICAgICBNQ0ZfUkVHMzIoMHhGQzA0QzAwOCkKKyNkZWZpbmUgTUNGX0lOVEMxX0lNUkwgICAgICAgICAgICAgTUNGX1JFRzMyKDB4RkMwNEMwMEMpCisjZGVmaW5lIE1DRl9JTlRDMV9JTlRGUkNIICAgICAgICAgIE1DRl9SRUczMigweEZDMDRDMDEwKQorI2RlZmluZSBNQ0ZfSU5UQzFfSU5URlJDTCAgICAgICAgICBNQ0ZfUkVHMzIoMHhGQzA0QzAxNCkKKyNkZWZpbmUgTUNGX0lOVEMxX0lDT05GSUcgICAgICAgICAgTUNGX1JFRzE2KDB4RkMwNEMwMUEpCisjZGVmaW5lIE1DRl9JTlRDMV9TSU1SICAgICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDRDMDFDKQorI2RlZmluZSBNQ0ZfSU5UQzFfQ0lNUiAgICAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0QzAxRCkKKyNkZWZpbmUgTUNGX0lOVEMxX0NMTUFTSyAgICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNEMwMUUpCisjZGVmaW5lIE1DRl9JTlRDMV9TTE1BU0sgICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDRDMDFGKQorI2RlZmluZSBNQ0ZfSU5UQzFfSUNSMCAgICAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0QzA0MCkKKyNkZWZpbmUgTUNGX0lOVEMxX0lDUjEgICAgICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNEMwNDEpCisjZGVmaW5lIE1DRl9JTlRDMV9JQ1IyICAgICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDRDMDQyKQorI2RlZmluZSBNQ0ZfSU5UQzFfSUNSMyAgICAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0QzA0MykKKyNkZWZpbmUgTUNGX0lOVEMxX0lDUjQgICAgICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNEMwNDQpCisjZGVmaW5lIE1DRl9JTlRDMV9JQ1I1ICAgICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDRDMDQ1KQorI2RlZmluZSBNQ0ZfSU5UQzFfSUNSNiAgICAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0QzA0NikKKyNkZWZpbmUgTUNGX0lOVEMxX0lDUjcgICAgICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNEMwNDcpCisjZGVmaW5lIE1DRl9JTlRDMV9JQ1I4ICAgICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDRDMDQ4KQorI2RlZmluZSBNQ0ZfSU5UQzFfSUNSOSAgICAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0QzA0OSkKKyNkZWZpbmUgTUNGX0lOVEMxX0lDUjEwICAgICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNEMwNEEpCisjZGVmaW5lIE1DRl9JTlRDMV9JQ1IxMSAgICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDRDMDRCKQorI2RlZmluZSBNQ0ZfSU5UQzFfSUNSMTIgICAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0QzA0QykKKyNkZWZpbmUgTUNGX0lOVEMxX0lDUjEzICAgICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNEMwNEQpCisjZGVmaW5lIE1DRl9JTlRDMV9JQ1IxNCAgICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDRDMDRFKQorI2RlZmluZSBNQ0ZfSU5UQzFfSUNSMTUgICAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0QzA0RikKKyNkZWZpbmUgTUNGX0lOVEMxX0lDUjE2ICAgICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNEMwNTApCisjZGVmaW5lIE1DRl9JTlRDMV9JQ1IxNyAgICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDRDMDUxKQorI2RlZmluZSBNQ0ZfSU5UQzFfSUNSMTggICAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0QzA1MikKKyNkZWZpbmUgTUNGX0lOVEMxX0lDUjE5ICAgICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNEMwNTMpCisjZGVmaW5lIE1DRl9JTlRDMV9JQ1IyMCAgICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDRDMDU0KQorI2RlZmluZSBNQ0ZfSU5UQzFfSUNSMjEgICAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0QzA1NSkKKyNkZWZpbmUgTUNGX0lOVEMxX0lDUjIyICAgICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNEMwNTYpCisjZGVmaW5lIE1DRl9JTlRDMV9JQ1IyMyAgICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDRDMDU3KQorI2RlZmluZSBNQ0ZfSU5UQzFfSUNSMjQgICAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0QzA1OCkKKyNkZWZpbmUgTUNGX0lOVEMxX0lDUjI1ICAgICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNEMwNTkpCisjZGVmaW5lIE1DRl9JTlRDMV9JQ1IyNiAgICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDRDMDVBKQorI2RlZmluZSBNQ0ZfSU5UQzFfSUNSMjcgICAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0QzA1QikKKyNkZWZpbmUgTUNGX0lOVEMxX0lDUjI4ICAgICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNEMwNUMpCisjZGVmaW5lIE1DRl9JTlRDMV9JQ1IyOSAgICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDRDMDVEKQorI2RlZmluZSBNQ0ZfSU5UQzFfSUNSMzAgICAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0QzA1RSkKKyNkZWZpbmUgTUNGX0lOVEMxX0lDUjMxICAgICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNEMwNUYpCisjZGVmaW5lIE1DRl9JTlRDMV9JQ1IzMiAgICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDRDMDYwKQorI2RlZmluZSBNQ0ZfSU5UQzFfSUNSMzMgICAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0QzA2MSkKKyNkZWZpbmUgTUNGX0lOVEMxX0lDUjM0ICAgICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNEMwNjIpCisjZGVmaW5lIE1DRl9JTlRDMV9JQ1IzNSAgICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDRDMDYzKQorI2RlZmluZSBNQ0ZfSU5UQzFfSUNSMzYgICAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0QzA2NCkKKyNkZWZpbmUgTUNGX0lOVEMxX0lDUjM3ICAgICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNEMwNjUpCisjZGVmaW5lIE1DRl9JTlRDMV9JQ1IzOCAgICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDRDMDY2KQorI2RlZmluZSBNQ0ZfSU5UQzFfSUNSMzkgICAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0QzA2NykKKyNkZWZpbmUgTUNGX0lOVEMxX0lDUjQwICAgICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNEMwNjgpCisjZGVmaW5lIE1DRl9JTlRDMV9JQ1I0MSAgICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDRDMDY5KQorI2RlZmluZSBNQ0ZfSU5UQzFfSUNSNDIgICAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0QzA2QSkKKyNkZWZpbmUgTUNGX0lOVEMxX0lDUjQzICAgICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNEMwNkIpCisjZGVmaW5lIE1DRl9JTlRDMV9JQ1I0NCAgICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDRDMDZDKQorI2RlZmluZSBNQ0ZfSU5UQzFfSUNSNDUgICAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0QzA2RCkKKyNkZWZpbmUgTUNGX0lOVEMxX0lDUjQ2ICAgICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNEMwNkUpCisjZGVmaW5lIE1DRl9JTlRDMV9JQ1I0NyAgICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDRDMDZGKQorI2RlZmluZSBNQ0ZfSU5UQzFfSUNSNDggICAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0QzA3MCkKKyNkZWZpbmUgTUNGX0lOVEMxX0lDUjQ5ICAgICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNEMwNzEpCisjZGVmaW5lIE1DRl9JTlRDMV9JQ1I1MCAgICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDRDMDcyKQorI2RlZmluZSBNQ0ZfSU5UQzFfSUNSNTEgICAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0QzA3MykKKyNkZWZpbmUgTUNGX0lOVEMxX0lDUjUyICAgICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNEMwNzQpCisjZGVmaW5lIE1DRl9JTlRDMV9JQ1I1MyAgICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDRDMDc1KQorI2RlZmluZSBNQ0ZfSU5UQzFfSUNSNTQgICAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0QzA3NikKKyNkZWZpbmUgTUNGX0lOVEMxX0lDUjU1ICAgICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNEMwNzcpCisjZGVmaW5lIE1DRl9JTlRDMV9JQ1I1NiAgICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDRDMDc4KQorI2RlZmluZSBNQ0ZfSU5UQzFfSUNSNTcgICAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0QzA3OSkKKyNkZWZpbmUgTUNGX0lOVEMxX0lDUjU4ICAgICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNEMwN0EpCisjZGVmaW5lIE1DRl9JTlRDMV9JQ1I1OSAgICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDRDMDdCKQorI2RlZmluZSBNQ0ZfSU5UQzFfSUNSNjAgICAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0QzA3QykKKyNkZWZpbmUgTUNGX0lOVEMxX0lDUjYxICAgICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNEMwN0QpCisjZGVmaW5lIE1DRl9JTlRDMV9JQ1I2MiAgICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDRDMDdFKQorI2RlZmluZSBNQ0ZfSU5UQzFfSUNSNjMgICAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0QzA3RikKKyNkZWZpbmUgTUNGX0lOVEMxX0lDUih4KSAgICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNEMwNDArKCh4KSoweDAwMSkpCisjZGVmaW5lIE1DRl9JTlRDMV9TV0lBQ0sgICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDRDMEUwKQorI2RlZmluZSBNQ0ZfSU5UQzFfTDFJQUNLICAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0QzBFNCkKKyNkZWZpbmUgTUNGX0lOVEMxX0wySUFDSyAgICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNEMwRTgpCisjZGVmaW5lIE1DRl9JTlRDMV9MM0lBQ0sgICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDRDMEVDKQorI2RlZmluZSBNQ0ZfSU5UQzFfTDRJQUNLICAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0QzBGMCkKKyNkZWZpbmUgTUNGX0lOVEMxX0w1SUFDSyAgICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNEMwRjQpCisjZGVmaW5lIE1DRl9JTlRDMV9MNklBQ0sgICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDRDMEY4KQorI2RlZmluZSBNQ0ZfSU5UQzFfTDdJQUNLICAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0QzBGQykKKyNkZWZpbmUgTUNGX0lOVEMxX0xJQUNLKHgpICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNEMwRTQrKCh4KSoweDAwNCkpCisjZGVmaW5lIE1DRl9JTlRDX0lQUkgoeCkgICAgICAgICAgIE1DRl9SRUczMigweEZDMDQ4MDAwKygoeCkqMHg0MDAwKSkKKyNkZWZpbmUgTUNGX0lOVENfSVBSTCh4KSAgICAgICAgICAgTUNGX1JFRzMyKDB4RkMwNDgwMDQrKCh4KSoweDQwMDApKQorI2RlZmluZSBNQ0ZfSU5UQ19JTVJIKHgpICAgICAgICAgICBNQ0ZfUkVHMzIoMHhGQzA0ODAwOCsoKHgpKjB4NDAwMCkpCisjZGVmaW5lIE1DRl9JTlRDX0lNUkwoeCkgICAgICAgICAgIE1DRl9SRUczMigweEZDMDQ4MDBDKygoeCkqMHg0MDAwKSkKKyNkZWZpbmUgTUNGX0lOVENfSU5URlJDSCh4KSAgICAgICAgTUNGX1JFRzMyKDB4RkMwNDgwMTArKCh4KSoweDQwMDApKQorI2RlZmluZSBNQ0ZfSU5UQ19JTlRGUkNMKHgpICAgICAgICBNQ0ZfUkVHMzIoMHhGQzA0ODAxNCsoKHgpKjB4NDAwMCkpCisjZGVmaW5lIE1DRl9JTlRDX0lDT05GSUcoeCkgICAgICAgIE1DRl9SRUcxNigweEZDMDQ4MDFBKygoeCkqMHg0MDAwKSkKKyNkZWZpbmUgTUNGX0lOVENfU0lNUih4KSAgICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNDgwMUMrKCh4KSoweDQwMDApKQorI2RlZmluZSBNQ0ZfSU5UQ19DSU1SKHgpICAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0ODAxRCsoKHgpKjB4NDAwMCkpCisjZGVmaW5lIE1DRl9JTlRDX0NMTUFTSyh4KSAgICAgICAgIE1DRl9SRUcwOCgweEZDMDQ4MDFFKygoeCkqMHg0MDAwKSkKKyNkZWZpbmUgTUNGX0lOVENfU0xNQVNLKHgpICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNDgwMUYrKCh4KSoweDQwMDApKQorI2RlZmluZSBNQ0ZfSU5UQ19JQ1IwKHgpICAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0ODA0MCsoKHgpKjB4NDAwMCkpCisjZGVmaW5lIE1DRl9JTlRDX0lDUjEoeCkgICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDQ4MDQxKygoeCkqMHg0MDAwKSkKKyNkZWZpbmUgTUNGX0lOVENfSUNSMih4KSAgICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNDgwNDIrKCh4KSoweDQwMDApKQorI2RlZmluZSBNQ0ZfSU5UQ19JQ1IzKHgpICAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0ODA0MysoKHgpKjB4NDAwMCkpCisjZGVmaW5lIE1DRl9JTlRDX0lDUjQoeCkgICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDQ4MDQ0KygoeCkqMHg0MDAwKSkKKyNkZWZpbmUgTUNGX0lOVENfSUNSNSh4KSAgICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNDgwNDUrKCh4KSoweDQwMDApKQorI2RlZmluZSBNQ0ZfSU5UQ19JQ1I2KHgpICAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0ODA0NisoKHgpKjB4NDAwMCkpCisjZGVmaW5lIE1DRl9JTlRDX0lDUjcoeCkgICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDQ4MDQ3KygoeCkqMHg0MDAwKSkKKyNkZWZpbmUgTUNGX0lOVENfSUNSOCh4KSAgICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNDgwNDgrKCh4KSoweDQwMDApKQorI2RlZmluZSBNQ0ZfSU5UQ19JQ1I5KHgpICAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0ODA0OSsoKHgpKjB4NDAwMCkpCisjZGVmaW5lIE1DRl9JTlRDX0lDUjEwKHgpICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDQ4MDRBKygoeCkqMHg0MDAwKSkKKyNkZWZpbmUgTUNGX0lOVENfSUNSMTEoeCkgICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNDgwNEIrKCh4KSoweDQwMDApKQorI2RlZmluZSBNQ0ZfSU5UQ19JQ1IxMih4KSAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0ODA0QysoKHgpKjB4NDAwMCkpCisjZGVmaW5lIE1DRl9JTlRDX0lDUjEzKHgpICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDQ4MDREKygoeCkqMHg0MDAwKSkKKyNkZWZpbmUgTUNGX0lOVENfSUNSMTQoeCkgICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNDgwNEUrKCh4KSoweDQwMDApKQorI2RlZmluZSBNQ0ZfSU5UQ19JQ1IxNSh4KSAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0ODA0RisoKHgpKjB4NDAwMCkpCisjZGVmaW5lIE1DRl9JTlRDX0lDUjE2KHgpICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDQ4MDUwKygoeCkqMHg0MDAwKSkKKyNkZWZpbmUgTUNGX0lOVENfSUNSMTcoeCkgICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNDgwNTErKCh4KSoweDQwMDApKQorI2RlZmluZSBNQ0ZfSU5UQ19JQ1IxOCh4KSAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0ODA1MisoKHgpKjB4NDAwMCkpCisjZGVmaW5lIE1DRl9JTlRDX0lDUjE5KHgpICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDQ4MDUzKygoeCkqMHg0MDAwKSkKKyNkZWZpbmUgTUNGX0lOVENfSUNSMjAoeCkgICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNDgwNTQrKCh4KSoweDQwMDApKQorI2RlZmluZSBNQ0ZfSU5UQ19JQ1IyMSh4KSAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0ODA1NSsoKHgpKjB4NDAwMCkpCisjZGVmaW5lIE1DRl9JTlRDX0lDUjIyKHgpICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDQ4MDU2KygoeCkqMHg0MDAwKSkKKyNkZWZpbmUgTUNGX0lOVENfSUNSMjMoeCkgICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNDgwNTcrKCh4KSoweDQwMDApKQorI2RlZmluZSBNQ0ZfSU5UQ19JQ1IyNCh4KSAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0ODA1OCsoKHgpKjB4NDAwMCkpCisjZGVmaW5lIE1DRl9JTlRDX0lDUjI1KHgpICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDQ4MDU5KygoeCkqMHg0MDAwKSkKKyNkZWZpbmUgTUNGX0lOVENfSUNSMjYoeCkgICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNDgwNUErKCh4KSoweDQwMDApKQorI2RlZmluZSBNQ0ZfSU5UQ19JQ1IyNyh4KSAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0ODA1QisoKHgpKjB4NDAwMCkpCisjZGVmaW5lIE1DRl9JTlRDX0lDUjI4KHgpICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDQ4MDVDKygoeCkqMHg0MDAwKSkKKyNkZWZpbmUgTUNGX0lOVENfSUNSMjkoeCkgICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNDgwNUQrKCh4KSoweDQwMDApKQorI2RlZmluZSBNQ0ZfSU5UQ19JQ1IzMCh4KSAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0ODA1RSsoKHgpKjB4NDAwMCkpCisjZGVmaW5lIE1DRl9JTlRDX0lDUjMxKHgpICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDQ4MDVGKygoeCkqMHg0MDAwKSkKKyNkZWZpbmUgTUNGX0lOVENfSUNSMzIoeCkgICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNDgwNjArKCh4KSoweDQwMDApKQorI2RlZmluZSBNQ0ZfSU5UQ19JQ1IzMyh4KSAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0ODA2MSsoKHgpKjB4NDAwMCkpCisjZGVmaW5lIE1DRl9JTlRDX0lDUjM0KHgpICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDQ4MDYyKygoeCkqMHg0MDAwKSkKKyNkZWZpbmUgTUNGX0lOVENfSUNSMzUoeCkgICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNDgwNjMrKCh4KSoweDQwMDApKQorI2RlZmluZSBNQ0ZfSU5UQ19JQ1IzNih4KSAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0ODA2NCsoKHgpKjB4NDAwMCkpCisjZGVmaW5lIE1DRl9JTlRDX0lDUjM3KHgpICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDQ4MDY1KygoeCkqMHg0MDAwKSkKKyNkZWZpbmUgTUNGX0lOVENfSUNSMzgoeCkgICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNDgwNjYrKCh4KSoweDQwMDApKQorI2RlZmluZSBNQ0ZfSU5UQ19JQ1IzOSh4KSAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0ODA2NysoKHgpKjB4NDAwMCkpCisjZGVmaW5lIE1DRl9JTlRDX0lDUjQwKHgpICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDQ4MDY4KygoeCkqMHg0MDAwKSkKKyNkZWZpbmUgTUNGX0lOVENfSUNSNDEoeCkgICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNDgwNjkrKCh4KSoweDQwMDApKQorI2RlZmluZSBNQ0ZfSU5UQ19JQ1I0Mih4KSAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0ODA2QSsoKHgpKjB4NDAwMCkpCisjZGVmaW5lIE1DRl9JTlRDX0lDUjQzKHgpICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDQ4MDZCKygoeCkqMHg0MDAwKSkKKyNkZWZpbmUgTUNGX0lOVENfSUNSNDQoeCkgICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNDgwNkMrKCh4KSoweDQwMDApKQorI2RlZmluZSBNQ0ZfSU5UQ19JQ1I0NSh4KSAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0ODA2RCsoKHgpKjB4NDAwMCkpCisjZGVmaW5lIE1DRl9JTlRDX0lDUjQ2KHgpICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDQ4MDZFKygoeCkqMHg0MDAwKSkKKyNkZWZpbmUgTUNGX0lOVENfSUNSNDcoeCkgICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNDgwNkYrKCh4KSoweDQwMDApKQorI2RlZmluZSBNQ0ZfSU5UQ19JQ1I0OCh4KSAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0ODA3MCsoKHgpKjB4NDAwMCkpCisjZGVmaW5lIE1DRl9JTlRDX0lDUjQ5KHgpICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDQ4MDcxKygoeCkqMHg0MDAwKSkKKyNkZWZpbmUgTUNGX0lOVENfSUNSNTAoeCkgICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNDgwNzIrKCh4KSoweDQwMDApKQorI2RlZmluZSBNQ0ZfSU5UQ19JQ1I1MSh4KSAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0ODA3MysoKHgpKjB4NDAwMCkpCisjZGVmaW5lIE1DRl9JTlRDX0lDUjUyKHgpICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDQ4MDc0KygoeCkqMHg0MDAwKSkKKyNkZWZpbmUgTUNGX0lOVENfSUNSNTMoeCkgICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNDgwNzUrKCh4KSoweDQwMDApKQorI2RlZmluZSBNQ0ZfSU5UQ19JQ1I1NCh4KSAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0ODA3NisoKHgpKjB4NDAwMCkpCisjZGVmaW5lIE1DRl9JTlRDX0lDUjU1KHgpICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDQ4MDc3KygoeCkqMHg0MDAwKSkKKyNkZWZpbmUgTUNGX0lOVENfSUNSNTYoeCkgICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNDgwNzgrKCh4KSoweDQwMDApKQorI2RlZmluZSBNQ0ZfSU5UQ19JQ1I1Nyh4KSAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0ODA3OSsoKHgpKjB4NDAwMCkpCisjZGVmaW5lIE1DRl9JTlRDX0lDUjU4KHgpICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDQ4MDdBKygoeCkqMHg0MDAwKSkKKyNkZWZpbmUgTUNGX0lOVENfSUNSNTkoeCkgICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNDgwN0IrKCh4KSoweDQwMDApKQorI2RlZmluZSBNQ0ZfSU5UQ19JQ1I2MCh4KSAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0ODA3QysoKHgpKjB4NDAwMCkpCisjZGVmaW5lIE1DRl9JTlRDX0lDUjYxKHgpICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDQ4MDdEKygoeCkqMHg0MDAwKSkKKyNkZWZpbmUgTUNGX0lOVENfSUNSNjIoeCkgICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNDgwN0UrKCh4KSoweDQwMDApKQorI2RlZmluZSBNQ0ZfSU5UQ19JQ1I2Myh4KSAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0ODA3RisoKHgpKjB4NDAwMCkpCisjZGVmaW5lIE1DRl9JTlRDX1NXSUFDSyh4KSAgICAgICAgIE1DRl9SRUcwOCgweEZDMDQ4MEUwKygoeCkqMHg0MDAwKSkKKyNkZWZpbmUgTUNGX0lOVENfTDFJQUNLKHgpICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNDgwRTQrKCh4KSoweDQwMDApKQorI2RlZmluZSBNQ0ZfSU5UQ19MMklBQ0soeCkgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0ODBFOCsoKHgpKjB4NDAwMCkpCisjZGVmaW5lIE1DRl9JTlRDX0wzSUFDSyh4KSAgICAgICAgIE1DRl9SRUcwOCgweEZDMDQ4MEVDKygoeCkqMHg0MDAwKSkKKyNkZWZpbmUgTUNGX0lOVENfTDRJQUNLKHgpICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNDgwRjArKCh4KSoweDQwMDApKQorI2RlZmluZSBNQ0ZfSU5UQ19MNUlBQ0soeCkgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA0ODBGNCsoKHgpKjB4NDAwMCkpCisjZGVmaW5lIE1DRl9JTlRDX0w2SUFDSyh4KSAgICAgICAgIE1DRl9SRUcwOCgweEZDMDQ4MEY4KygoeCkqMHg0MDAwKSkKKyNkZWZpbmUgTUNGX0lOVENfTDdJQUNLKHgpICAgICAgICAgTUNGX1JFRzA4KDB4RkMwNDgwRkMrKCh4KSoweDQwMDApKQorCisvKiBCaXQgZGVmaW5pdGlvbnMgYW5kIG1hY3JvcyBmb3IgTUNGX0lOVENfSVBSSCAqLworI2RlZmluZSBNQ0ZfSU5UQ19JUFJIX0lOVDMyICAgICAgICAoMHgwMDAwMDAwMSkKKyNkZWZpbmUgTUNGX0lOVENfSVBSSF9JTlQzMyAgICAgICAgKDB4MDAwMDAwMDIpCisjZGVmaW5lIE1DRl9JTlRDX0lQUkhfSU5UMzQgICAgICAgICgweDAwMDAwMDA0KQorI2RlZmluZSBNQ0ZfSU5UQ19JUFJIX0lOVDM1ICAgICAgICAoMHgwMDAwMDAwOCkKKyNkZWZpbmUgTUNGX0lOVENfSVBSSF9JTlQzNiAgICAgICAgKDB4MDAwMDAwMTApCisjZGVmaW5lIE1DRl9JTlRDX0lQUkhfSU5UMzcgICAgICAgICgweDAwMDAwMDIwKQorI2RlZmluZSBNQ0ZfSU5UQ19JUFJIX0lOVDM4ICAgICAgICAoMHgwMDAwMDA0MCkKKyNkZWZpbmUgTUNGX0lOVENfSVBSSF9JTlQzOSAgICAgICAgKDB4MDAwMDAwODApCisjZGVmaW5lIE1DRl9JTlRDX0lQUkhfSU5UNDAgICAgICAgICgweDAwMDAwMTAwKQorI2RlZmluZSBNQ0ZfSU5UQ19JUFJIX0lOVDQxICAgICAgICAoMHgwMDAwMDIwMCkKKyNkZWZpbmUgTUNGX0lOVENfSVBSSF9JTlQ0MiAgICAgICAgKDB4MDAwMDA0MDApCisjZGVmaW5lIE1DRl9JTlRDX0lQUkhfSU5UNDMgICAgICAgICgweDAwMDAwODAwKQorI2RlZmluZSBNQ0ZfSU5UQ19JUFJIX0lOVDQ0ICAgICAgICAoMHgwMDAwMTAwMCkKKyNkZWZpbmUgTUNGX0lOVENfSVBSSF9JTlQ0NSAgICAgICAgKDB4MDAwMDIwMDApCisjZGVmaW5lIE1DRl9JTlRDX0lQUkhfSU5UNDYgICAgICAgICgweDAwMDA0MDAwKQorI2RlZmluZSBNQ0ZfSU5UQ19JUFJIX0lOVDQ3ICAgICAgICAoMHgwMDAwODAwMCkKKyNkZWZpbmUgTUNGX0lOVENfSVBSSF9JTlQ0OCAgICAgICAgKDB4MDAwMTAwMDApCisjZGVmaW5lIE1DRl9JTlRDX0lQUkhfSU5UNDkgICAgICAgICgweDAwMDIwMDAwKQorI2RlZmluZSBNQ0ZfSU5UQ19JUFJIX0lOVDUwICAgICAgICAoMHgwMDA0MDAwMCkKKyNkZWZpbmUgTUNGX0lOVENfSVBSSF9JTlQ1MSAgICAgICAgKDB4MDAwODAwMDApCisjZGVmaW5lIE1DRl9JTlRDX0lQUkhfSU5UNTIgICAgICAgICgweDAwMTAwMDAwKQorI2RlZmluZSBNQ0ZfSU5UQ19JUFJIX0lOVDUzICAgICAgICAoMHgwMDIwMDAwMCkKKyNkZWZpbmUgTUNGX0lOVENfSVBSSF9JTlQ1NCAgICAgICAgKDB4MDA0MDAwMDApCisjZGVmaW5lIE1DRl9JTlRDX0lQUkhfSU5UNTUgICAgICAgICgweDAwODAwMDAwKQorI2RlZmluZSBNQ0ZfSU5UQ19JUFJIX0lOVDU2ICAgICAgICAoMHgwMTAwMDAwMCkKKyNkZWZpbmUgTUNGX0lOVENfSVBSSF9JTlQ1NyAgICAgICAgKDB4MDIwMDAwMDApCisjZGVmaW5lIE1DRl9JTlRDX0lQUkhfSU5UNTggICAgICAgICgweDA0MDAwMDAwKQorI2RlZmluZSBNQ0ZfSU5UQ19JUFJIX0lOVDU5ICAgICAgICAoMHgwODAwMDAwMCkKKyNkZWZpbmUgTUNGX0lOVENfSVBSSF9JTlQ2MCAgICAgICAgKDB4MTAwMDAwMDApCisjZGVmaW5lIE1DRl9JTlRDX0lQUkhfSU5UNjEgICAgICAgICgweDIwMDAwMDAwKQorI2RlZmluZSBNQ0ZfSU5UQ19JUFJIX0lOVDYyICAgICAgICAoMHg0MDAwMDAwMCkKKyNkZWZpbmUgTUNGX0lOVENfSVBSSF9JTlQ2MyAgICAgICAgKDB4ODAwMDAwMDApCisKKy8qIEJpdCBkZWZpbml0aW9ucyBhbmQgbWFjcm9zIGZvciBNQ0ZfSU5UQ19JUFJMICovCisjZGVmaW5lIE1DRl9JTlRDX0lQUkxfSU5UMCAgICAgICAgICgweDAwMDAwMDAxKQorI2RlZmluZSBNQ0ZfSU5UQ19JUFJMX0lOVDEgICAgICAgICAoMHgwMDAwMDAwMikKKyNkZWZpbmUgTUNGX0lOVENfSVBSTF9JTlQyICAgICAgICAgKDB4MDAwMDAwMDQpCisjZGVmaW5lIE1DRl9JTlRDX0lQUkxfSU5UMyAgICAgICAgICgweDAwMDAwMDA4KQorI2RlZmluZSBNQ0ZfSU5UQ19JUFJMX0lOVDQgICAgICAgICAoMHgwMDAwMDAxMCkKKyNkZWZpbmUgTUNGX0lOVENfSVBSTF9JTlQ1ICAgICAgICAgKDB4MDAwMDAwMjApCisjZGVmaW5lIE1DRl9JTlRDX0lQUkxfSU5UNiAgICAgICAgICgweDAwMDAwMDQwKQorI2RlZmluZSBNQ0ZfSU5UQ19JUFJMX0lOVDcgICAgICAgICAoMHgwMDAwMDA4MCkKKyNkZWZpbmUgTUNGX0lOVENfSVBSTF9JTlQ4ICAgICAgICAgKDB4MDAwMDAxMDApCisjZGVmaW5lIE1DRl9JTlRDX0lQUkxfSU5UOSAgICAgICAgICgweDAwMDAwMjAwKQorI2RlZmluZSBNQ0ZfSU5UQ19JUFJMX0lOVDEwICAgICAgICAoMHgwMDAwMDQwMCkKKyNkZWZpbmUgTUNGX0lOVENfSVBSTF9JTlQxMSAgICAgICAgKDB4MDAwMDA4MDApCisjZGVmaW5lIE1DRl9JTlRDX0lQUkxfSU5UMTIgICAgICAgICgweDAwMDAxMDAwKQorI2RlZmluZSBNQ0ZfSU5UQ19JUFJMX0lOVDEzICAgICAgICAoMHgwMDAwMjAwMCkKKyNkZWZpbmUgTUNGX0lOVENfSVBSTF9JTlQxNCAgICAgICAgKDB4MDAwMDQwMDApCisjZGVmaW5lIE1DRl9JTlRDX0lQUkxfSU5UMTUgICAgICAgICgweDAwMDA4MDAwKQorI2RlZmluZSBNQ0ZfSU5UQ19JUFJMX0lOVDE2ICAgICAgICAoMHgwMDAxMDAwMCkKKyNkZWZpbmUgTUNGX0lOVENfSVBSTF9JTlQxNyAgICAgICAgKDB4MDAwMjAwMDApCisjZGVmaW5lIE1DRl9JTlRDX0lQUkxfSU5UMTggICAgICAgICgweDAwMDQwMDAwKQorI2RlZmluZSBNQ0ZfSU5UQ19JUFJMX0lOVDE5ICAgICAgICAoMHgwMDA4MDAwMCkKKyNkZWZpbmUgTUNGX0lOVENfSVBSTF9JTlQyMCAgICAgICAgKDB4MDAxMDAwMDApCisjZGVmaW5lIE1DRl9JTlRDX0lQUkxfSU5UMjEgICAgICAgICgweDAwMjAwMDAwKQorI2RlZmluZSBNQ0ZfSU5UQ19JUFJMX0lOVDIyICAgICAgICAoMHgwMDQwMDAwMCkKKyNkZWZpbmUgTUNGX0lOVENfSVBSTF9JTlQyMyAgICAgICAgKDB4MDA4MDAwMDApCisjZGVmaW5lIE1DRl9JTlRDX0lQUkxfSU5UMjQgICAgICAgICgweDAxMDAwMDAwKQorI2RlZmluZSBNQ0ZfSU5UQ19JUFJMX0lOVDI1ICAgICAgICAoMHgwMjAwMDAwMCkKKyNkZWZpbmUgTUNGX0lOVENfSVBSTF9JTlQyNiAgICAgICAgKDB4MDQwMDAwMDApCisjZGVmaW5lIE1DRl9JTlRDX0lQUkxfSU5UMjcgICAgICAgICgweDA4MDAwMDAwKQorI2RlZmluZSBNQ0ZfSU5UQ19JUFJMX0lOVDI4ICAgICAgICAoMHgxMDAwMDAwMCkKKyNkZWZpbmUgTUNGX0lOVENfSVBSTF9JTlQyOSAgICAgICAgKDB4MjAwMDAwMDApCisjZGVmaW5lIE1DRl9JTlRDX0lQUkxfSU5UMzAgICAgICAgICgweDQwMDAwMDAwKQorI2RlZmluZSBNQ0ZfSU5UQ19JUFJMX0lOVDMxICAgICAgICAoMHg4MDAwMDAwMCkKKworLyogQml0IGRlZmluaXRpb25zIGFuZCBtYWNyb3MgZm9yIE1DRl9JTlRDX0lNUkggKi8KKyNkZWZpbmUgTUNGX0lOVENfSU1SSF9JTlRfTUFTSzMyICAgKDB4MDAwMDAwMDEpCisjZGVmaW5lIE1DRl9JTlRDX0lNUkhfSU5UX01BU0szMyAgICgweDAwMDAwMDAyKQorI2RlZmluZSBNQ0ZfSU5UQ19JTVJIX0lOVF9NQVNLMzQgICAoMHgwMDAwMDAwNCkKKyNkZWZpbmUgTUNGX0lOVENfSU1SSF9JTlRfTUFTSzM1ICAgKDB4MDAwMDAwMDgpCisjZGVmaW5lIE1DRl9JTlRDX0lNUkhfSU5UX01BU0szNiAgICgweDAwMDAwMDEwKQorI2RlZmluZSBNQ0ZfSU5UQ19JTVJIX0lOVF9NQVNLMzcgICAoMHgwMDAwMDAyMCkKKyNkZWZpbmUgTUNGX0lOVENfSU1SSF9JTlRfTUFTSzM4ICAgKDB4MDAwMDAwNDApCisjZGVmaW5lIE1DRl9JTlRDX0lNUkhfSU5UX01BU0szOSAgICgweDAwMDAwMDgwKQorI2RlZmluZSBNQ0ZfSU5UQ19JTVJIX0lOVF9NQVNLNDAgICAoMHgwMDAwMDEwMCkKKyNkZWZpbmUgTUNGX0lOVENfSU1SSF9JTlRfTUFTSzQxICAgKDB4MDAwMDAyMDApCisjZGVmaW5lIE1DRl9JTlRDX0lNUkhfSU5UX01BU0s0MiAgICgweDAwMDAwNDAwKQorI2RlZmluZSBNQ0ZfSU5UQ19JTVJIX0lOVF9NQVNLNDMgICAoMHgwMDAwMDgwMCkKKyNkZWZpbmUgTUNGX0lOVENfSU1SSF9JTlRfTUFTSzQ0ICAgKDB4MDAwMDEwMDApCisjZGVmaW5lIE1DRl9JTlRDX0lNUkhfSU5UX01BU0s0NSAgICgweDAwMDAyMDAwKQorI2RlZmluZSBNQ0ZfSU5UQ19JTVJIX0lOVF9NQVNLNDYgICAoMHgwMDAwNDAwMCkKKyNkZWZpbmUgTUNGX0lOVENfSU1SSF9JTlRfTUFTSzQ3ICAgKDB4MDAwMDgwMDApCisjZGVmaW5lIE1DRl9JTlRDX0lNUkhfSU5UX01BU0s0OCAgICgweDAwMDEwMDAwKQorI2RlZmluZSBNQ0ZfSU5UQ19JTVJIX0lOVF9NQVNLNDkgICAoMHgwMDAyMDAwMCkKKyNkZWZpbmUgTUNGX0lOVENfSU1SSF9JTlRfTUFTSzUwICAgKDB4MDAwNDAwMDApCisjZGVmaW5lIE1DRl9JTlRDX0lNUkhfSU5UX01BU0s1MSAgICgweDAwMDgwMDAwKQorI2RlZmluZSBNQ0ZfSU5UQ19JTVJIX0lOVF9NQVNLNTIgICAoMHgwMDEwMDAwMCkKKyNkZWZpbmUgTUNGX0lOVENfSU1SSF9JTlRfTUFTSzUzICAgKDB4MDAyMDAwMDApCisjZGVmaW5lIE1DRl9JTlRDX0lNUkhfSU5UX01BU0s1NCAgICgweDAwNDAwMDAwKQorI2RlZmluZSBNQ0ZfSU5UQ19JTVJIX0lOVF9NQVNLNTUgICAoMHgwMDgwMDAwMCkKKyNkZWZpbmUgTUNGX0lOVENfSU1SSF9JTlRfTUFTSzU2ICAgKDB4MDEwMDAwMDApCisjZGVmaW5lIE1DRl9JTlRDX0lNUkhfSU5UX01BU0s1NyAgICgweDAyMDAwMDAwKQorI2RlZmluZSBNQ0ZfSU5UQ19JTVJIX0lOVF9NQVNLNTggICAoMHgwNDAwMDAwMCkKKyNkZWZpbmUgTUNGX0lOVENfSU1SSF9JTlRfTUFTSzU5ICAgKDB4MDgwMDAwMDApCisjZGVmaW5lIE1DRl9JTlRDX0lNUkhfSU5UX01BU0s2MCAgICgweDEwMDAwMDAwKQorI2RlZmluZSBNQ0ZfSU5UQ19JTVJIX0lOVF9NQVNLNjEgICAoMHgyMDAwMDAwMCkKKyNkZWZpbmUgTUNGX0lOVENfSU1SSF9JTlRfTUFTSzYyICAgKDB4NDAwMDAwMDApCisjZGVmaW5lIE1DRl9JTlRDX0lNUkhfSU5UX01BU0s2MyAgICgweDgwMDAwMDAwKQorCisvKiBCaXQgZGVmaW5pdGlvbnMgYW5kIG1hY3JvcyBmb3IgTUNGX0lOVENfSU1STCAqLworI2RlZmluZSBNQ0ZfSU5UQ19JTVJMX0lOVF9NQVNLMCAgICAoMHgwMDAwMDAwMSkKKyNkZWZpbmUgTUNGX0lOVENfSU1STF9JTlRfTUFTSzEgICAgKDB4MDAwMDAwMDIpCisjZGVmaW5lIE1DRl9JTlRDX0lNUkxfSU5UX01BU0syICAgICgweDAwMDAwMDA0KQorI2RlZmluZSBNQ0ZfSU5UQ19JTVJMX0lOVF9NQVNLMyAgICAoMHgwMDAwMDAwOCkKKyNkZWZpbmUgTUNGX0lOVENfSU1STF9JTlRfTUFTSzQgICAgKDB4MDAwMDAwMTApCisjZGVmaW5lIE1DRl9JTlRDX0lNUkxfSU5UX01BU0s1ICAgICgweDAwMDAwMDIwKQorI2RlZmluZSBNQ0ZfSU5UQ19JTVJMX0lOVF9NQVNLNiAgICAoMHgwMDAwMDA0MCkKKyNkZWZpbmUgTUNGX0lOVENfSU1STF9JTlRfTUFTSzcgICAgKDB4MDAwMDAwODApCisjZGVmaW5lIE1DRl9JTlRDX0lNUkxfSU5UX01BU0s4ICAgICgweDAwMDAwMTAwKQorI2RlZmluZSBNQ0ZfSU5UQ19JTVJMX0lOVF9NQVNLOSAgICAoMHgwMDAwMDIwMCkKKyNkZWZpbmUgTUNGX0lOVENfSU1STF9JTlRfTUFTSzEwICAgKDB4MDAwMDA0MDApCisjZGVmaW5lIE1DRl9JTlRDX0lNUkxfSU5UX01BU0sxMSAgICgweDAwMDAwODAwKQorI2RlZmluZSBNQ0ZfSU5UQ19JTVJMX0lOVF9NQVNLMTIgICAoMHgwMDAwMTAwMCkKKyNkZWZpbmUgTUNGX0lOVENfSU1STF9JTlRfTUFTSzEzICAgKDB4MDAwMDIwMDApCisjZGVmaW5lIE1DRl9JTlRDX0lNUkxfSU5UX01BU0sxNCAgICgweDAwMDA0MDAwKQorI2RlZmluZSBNQ0ZfSU5UQ19JTVJMX0lOVF9NQVNLMTUgICAoMHgwMDAwODAwMCkKKyNkZWZpbmUgTUNGX0lOVENfSU1STF9JTlRfTUFTSzE2ICAgKDB4MDAwMTAwMDApCisjZGVmaW5lIE1DRl9JTlRDX0lNUkxfSU5UX01BU0sxNyAgICgweDAwMDIwMDAwKQorI2RlZmluZSBNQ0ZfSU5UQ19JTVJMX0lOVF9NQVNLMTggICAoMHgwMDA0MDAwMCkKKyNkZWZpbmUgTUNGX0lOVENfSU1STF9JTlRfTUFTSzE5ICAgKDB4MDAwODAwMDApCisjZGVmaW5lIE1DRl9JTlRDX0lNUkxfSU5UX01BU0syMCAgICgweDAwMTAwMDAwKQorI2RlZmluZSBNQ0ZfSU5UQ19JTVJMX0lOVF9NQVNLMjEgICAoMHgwMDIwMDAwMCkKKyNkZWZpbmUgTUNGX0lOVENfSU1STF9JTlRfTUFTSzIyICAgKDB4MDA0MDAwMDApCisjZGVmaW5lIE1DRl9JTlRDX0lNUkxfSU5UX01BU0syMyAgICgweDAwODAwMDAwKQorI2RlZmluZSBNQ0ZfSU5UQ19JTVJMX0lOVF9NQVNLMjQgICAoMHgwMTAwMDAwMCkKKyNkZWZpbmUgTUNGX0lOVENfSU1STF9JTlRfTUFTSzI1ICAgKDB4MDIwMDAwMDApCisjZGVmaW5lIE1DRl9JTlRDX0lNUkxfSU5UX01BU0syNiAgICgweDA0MDAwMDAwKQorI2RlZmluZSBNQ0ZfSU5UQ19JTVJMX0lOVF9NQVNLMjcgICAoMHgwODAwMDAwMCkKKyNkZWZpbmUgTUNGX0lOVENfSU1STF9JTlRfTUFTSzI4ICAgKDB4MTAwMDAwMDApCisjZGVmaW5lIE1DRl9JTlRDX0lNUkxfSU5UX01BU0syOSAgICgweDIwMDAwMDAwKQorI2RlZmluZSBNQ0ZfSU5UQ19JTVJMX0lOVF9NQVNLMzAgICAoMHg0MDAwMDAwMCkKKyNkZWZpbmUgTUNGX0lOVENfSU1STF9JTlRfTUFTSzMxICAgKDB4ODAwMDAwMDApCisKKy8qIEJpdCBkZWZpbml0aW9ucyBhbmQgbWFjcm9zIGZvciBNQ0ZfSU5UQ19JTlRGUkNIICovCisjZGVmaW5lIE1DRl9JTlRDX0lOVEZSQ0hfSU5URlJDMzIgICgweDAwMDAwMDAxKQorI2RlZmluZSBNQ0ZfSU5UQ19JTlRGUkNIX0lOVEZSQzMzICAoMHgwMDAwMDAwMikKKyNkZWZpbmUgTUNGX0lOVENfSU5URlJDSF9JTlRGUkMzNCAgKDB4MDAwMDAwMDQpCisjZGVmaW5lIE1DRl9JTlRDX0lOVEZSQ0hfSU5URlJDMzUgICgweDAwMDAwMDA4KQorI2RlZmluZSBNQ0ZfSU5UQ19JTlRGUkNIX0lOVEZSQzM2ICAoMHgwMDAwMDAxMCkKKyNkZWZpbmUgTUNGX0lOVENfSU5URlJDSF9JTlRGUkMzNyAgKDB4MDAwMDAwMjApCisjZGVmaW5lIE1DRl9JTlRDX0lOVEZSQ0hfSU5URlJDMzggICgweDAwMDAwMDQwKQorI2RlZmluZSBNQ0ZfSU5UQ19JTlRGUkNIX0lOVEZSQzM5ICAoMHgwMDAwMDA4MCkKKyNkZWZpbmUgTUNGX0lOVENfSU5URlJDSF9JTlRGUkM0MCAgKDB4MDAwMDAxMDApCisjZGVmaW5lIE1DRl9JTlRDX0lOVEZSQ0hfSU5URlJDNDEgICgweDAwMDAwMjAwKQorI2RlZmluZSBNQ0ZfSU5UQ19JTlRGUkNIX0lOVEZSQzQyICAoMHgwMDAwMDQwMCkKKyNkZWZpbmUgTUNGX0lOVENfSU5URlJDSF9JTlRGUkM0MyAgKDB4MDAwMDA4MDApCisjZGVmaW5lIE1DRl9JTlRDX0lOVEZSQ0hfSU5URlJDNDQgICgweDAwMDAxMDAwKQorI2RlZmluZSBNQ0ZfSU5UQ19JTlRGUkNIX0lOVEZSQzQ1ICAoMHgwMDAwMjAwMCkKKyNkZWZpbmUgTUNGX0lOVENfSU5URlJDSF9JTlRGUkM0NiAgKDB4MDAwMDQwMDApCisjZGVmaW5lIE1DRl9JTlRDX0lOVEZSQ0hfSU5URlJDNDcgICgweDAwMDA4MDAwKQorI2RlZmluZSBNQ0ZfSU5UQ19JTlRGUkNIX0lOVEZSQzQ4ICAoMHgwMDAxMDAwMCkKKyNkZWZpbmUgTUNGX0lOVENfSU5URlJDSF9JTlRGUkM0OSAgKDB4MDAwMjAwMDApCisjZGVmaW5lIE1DRl9JTlRDX0lOVEZSQ0hfSU5URlJDNTAgICgweDAwMDQwMDAwKQorI2RlZmluZSBNQ0ZfSU5UQ19JTlRGUkNIX0lOVEZSQzUxICAoMHgwMDA4MDAwMCkKKyNkZWZpbmUgTUNGX0lOVENfSU5URlJDSF9JTlRGUkM1MiAgKDB4MDAxMDAwMDApCisjZGVmaW5lIE1DRl9JTlRDX0lOVEZSQ0hfSU5URlJDNTMgICgweDAwMjAwMDAwKQorI2RlZmluZSBNQ0ZfSU5UQ19JTlRGUkNIX0lOVEZSQzU0ICAoMHgwMDQwMDAwMCkKKyNkZWZpbmUgTUNGX0lOVENfSU5URlJDSF9JTlRGUkM1NSAgKDB4MDA4MDAwMDApCisjZGVmaW5lIE1DRl9JTlRDX0lOVEZSQ0hfSU5URlJDNTYgICgweDAxMDAwMDAwKQorI2RlZmluZSBNQ0ZfSU5UQ19JTlRGUkNIX0lOVEZSQzU3ICAoMHgwMjAwMDAwMCkKKyNkZWZpbmUgTUNGX0lOVENfSU5URlJDSF9JTlRGUkM1OCAgKDB4MDQwMDAwMDApCisjZGVmaW5lIE1DRl9JTlRDX0lOVEZSQ0hfSU5URlJDNTkgICgweDA4MDAwMDAwKQorI2RlZmluZSBNQ0ZfSU5UQ19JTlRGUkNIX0lOVEZSQzYwICAoMHgxMDAwMDAwMCkKKyNkZWZpbmUgTUNGX0lOVENfSU5URlJDSF9JTlRGUkM2MSAgKDB4MjAwMDAwMDApCisjZGVmaW5lIE1DRl9JTlRDX0lOVEZSQ0hfSU5URlJDNjIgICgweDQwMDAwMDAwKQorI2RlZmluZSBNQ0ZfSU5UQ19JTlRGUkNIX0lOVEZSQzYzICAoMHg4MDAwMDAwMCkKKworLyogQml0IGRlZmluaXRpb25zIGFuZCBtYWNyb3MgZm9yIE1DRl9JTlRDX0lOVEZSQ0wgKi8KKyNkZWZpbmUgTUNGX0lOVENfSU5URlJDTF9JTlRGUkMwICAgKDB4MDAwMDAwMDEpCisjZGVmaW5lIE1DRl9JTlRDX0lOVEZSQ0xfSU5URlJDMSAgICgweDAwMDAwMDAyKQorI2RlZmluZSBNQ0ZfSU5UQ19JTlRGUkNMX0lOVEZSQzIgICAoMHgwMDAwMDAwNCkKKyNkZWZpbmUgTUNGX0lOVENfSU5URlJDTF9JTlRGUkMzICAgKDB4MDAwMDAwMDgpCisjZGVmaW5lIE1DRl9JTlRDX0lOVEZSQ0xfSU5URlJDNCAgICgweDAwMDAwMDEwKQorI2RlZmluZSBNQ0ZfSU5UQ19JTlRGUkNMX0lOVEZSQzUgICAoMHgwMDAwMDAyMCkKKyNkZWZpbmUgTUNGX0lOVENfSU5URlJDTF9JTlRGUkM2ICAgKDB4MDAwMDAwNDApCisjZGVmaW5lIE1DRl9JTlRDX0lOVEZSQ0xfSU5URlJDNyAgICgweDAwMDAwMDgwKQorI2RlZmluZSBNQ0ZfSU5UQ19JTlRGUkNMX0lOVEZSQzggICAoMHgwMDAwMDEwMCkKKyNkZWZpbmUgTUNGX0lOVENfSU5URlJDTF9JTlRGUkM5ICAgKDB4MDAwMDAyMDApCisjZGVmaW5lIE1DRl9JTlRDX0lOVEZSQ0xfSU5URlJDMTAgICgweDAwMDAwNDAwKQorI2RlZmluZSBNQ0ZfSU5UQ19JTlRGUkNMX0lOVEZSQzExICAoMHgwMDAwMDgwMCkKKyNkZWZpbmUgTUNGX0lOVENfSU5URlJDTF9JTlRGUkMxMiAgKDB4MDAwMDEwMDApCisjZGVmaW5lIE1DRl9JTlRDX0lOVEZSQ0xfSU5URlJDMTMgICgweDAwMDAyMDAwKQorI2RlZmluZSBNQ0ZfSU5UQ19JTlRGUkNMX0lOVEZSQzE0ICAoMHgwMDAwNDAwMCkKKyNkZWZpbmUgTUNGX0lOVENfSU5URlJDTF9JTlRGUkMxNSAgKDB4MDAwMDgwMDApCisjZGVmaW5lIE1DRl9JTlRDX0lOVEZSQ0xfSU5URlJDMTYgICgweDAwMDEwMDAwKQorI2RlZmluZSBNQ0ZfSU5UQ19JTlRGUkNMX0lOVEZSQzE3ICAoMHgwMDAyMDAwMCkKKyNkZWZpbmUgTUNGX0lOVENfSU5URlJDTF9JTlRGUkMxOCAgKDB4MDAwNDAwMDApCisjZGVmaW5lIE1DRl9JTlRDX0lOVEZSQ0xfSU5URlJDMTkgICgweDAwMDgwMDAwKQorI2RlZmluZSBNQ0ZfSU5UQ19JTlRGUkNMX0lOVEZSQzIwICAoMHgwMDEwMDAwMCkKKyNkZWZpbmUgTUNGX0lOVENfSU5URlJDTF9JTlRGUkMyMSAgKDB4MDAyMDAwMDApCisjZGVmaW5lIE1DRl9JTlRDX0lOVEZSQ0xfSU5URlJDMjIgICgweDAwNDAwMDAwKQorI2RlZmluZSBNQ0ZfSU5UQ19JTlRGUkNMX0lOVEZSQzIzICAoMHgwMDgwMDAwMCkKKyNkZWZpbmUgTUNGX0lOVENfSU5URlJDTF9JTlRGUkMyNCAgKDB4MDEwMDAwMDApCisjZGVmaW5lIE1DRl9JTlRDX0lOVEZSQ0xfSU5URlJDMjUgICgweDAyMDAwMDAwKQorI2RlZmluZSBNQ0ZfSU5UQ19JTlRGUkNMX0lOVEZSQzI2ICAoMHgwNDAwMDAwMCkKKyNkZWZpbmUgTUNGX0lOVENfSU5URlJDTF9JTlRGUkMyNyAgKDB4MDgwMDAwMDApCisjZGVmaW5lIE1DRl9JTlRDX0lOVEZSQ0xfSU5URlJDMjggICgweDEwMDAwMDAwKQorI2RlZmluZSBNQ0ZfSU5UQ19JTlRGUkNMX0lOVEZSQzI5ICAoMHgyMDAwMDAwMCkKKyNkZWZpbmUgTUNGX0lOVENfSU5URlJDTF9JTlRGUkMzMCAgKDB4NDAwMDAwMDApCisjZGVmaW5lIE1DRl9JTlRDX0lOVEZSQ0xfSU5URlJDMzEgICgweDgwMDAwMDAwKQorCisvKiBCaXQgZGVmaW5pdGlvbnMgYW5kIG1hY3JvcyBmb3IgTUNGX0lOVENfSUNPTkZJRyAqLworI2RlZmluZSBNQ0ZfSU5UQ19JQ09ORklHX0VNQVNLICAgICAoMHgwMDIwKQorI2RlZmluZSBNQ0ZfSU5UQ19JQ09ORklHX0VMVkxQUkkxICAoMHgwMjAwKQorI2RlZmluZSBNQ0ZfSU5UQ19JQ09ORklHX0VMVkxQUkkyICAoMHgwNDAwKQorI2RlZmluZSBNQ0ZfSU5UQ19JQ09ORklHX0VMVkxQUkkzICAoMHgwODAwKQorI2RlZmluZSBNQ0ZfSU5UQ19JQ09ORklHX0VMVkxQUkk0ICAoMHgxMDAwKQorI2RlZmluZSBNQ0ZfSU5UQ19JQ09ORklHX0VMVkxQUkk1ICAoMHgyMDAwKQorI2RlZmluZSBNQ0ZfSU5UQ19JQ09ORklHX0VMVkxQUkk2ICAoMHg0MDAwKQorI2RlZmluZSBNQ0ZfSU5UQ19JQ09ORklHX0VMVkxQUkk3ICAoMHg4MDAwKQorCisvKiBCaXQgZGVmaW5pdGlvbnMgYW5kIG1hY3JvcyBmb3IgTUNGX0lOVENfU0lNUiAqLworI2RlZmluZSBNQ0ZfSU5UQ19TSU1SX1NJTVIoeCkgICAgICAoKCh4KSYweDdGKTw8MCkKKworLyogQml0IGRlZmluaXRpb25zIGFuZCBtYWNyb3MgZm9yIE1DRl9JTlRDX0NJTVIgKi8KKyNkZWZpbmUgTUNGX0lOVENfQ0lNUl9DSU1SKHgpICAgICAgKCgoeCkmMHg3Rik8PDApCisKKy8qIEJpdCBkZWZpbml0aW9ucyBhbmQgbWFjcm9zIGZvciBNQ0ZfSU5UQ19DTE1BU0sgKi8KKyNkZWZpbmUgTUNGX0lOVENfQ0xNQVNLX0NMTUFTSyh4KSAgKCgoeCkmMHgwRik8PDApCisKKy8qIEJpdCBkZWZpbml0aW9ucyBhbmQgbWFjcm9zIGZvciBNQ0ZfSU5UQ19TTE1BU0sgKi8KKyNkZWZpbmUgTUNGX0lOVENfU0xNQVNLX1NMTUFTSyh4KSAgKCgoeCkmMHgwRik8PDApCisKKy8qIEJpdCBkZWZpbml0aW9ucyBhbmQgbWFjcm9zIGZvciBNQ0ZfSU5UQ19JQ1IgKi8KKyNkZWZpbmUgTUNGX0lOVENfSUNSX0lMKHgpICAgICAgICAgKCgoeCkmMHgwNyk8PDApCisKKy8qIEJpdCBkZWZpbml0aW9ucyBhbmQgbWFjcm9zIGZvciBNQ0ZfSU5UQ19TV0lBQ0sgKi8KKyNkZWZpbmUgTUNGX0lOVENfU1dJQUNLX1ZFQ1RPUih4KSAgKCgoeCkmMHhGRik8PDApCisKKy8qIEJpdCBkZWZpbml0aW9ucyBhbmQgbWFjcm9zIGZvciBNQ0ZfSU5UQ19MSUFDSyAqLworI2RlZmluZSBNQ0ZfSU5UQ19MSUFDS19WRUNUT1IoeCkgICAoKCh4KSYweEZGKTw8MCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBMQ0QgQ29udHJvbGxlciAoTENEQykKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogUmVnaXN0ZXIgcmVhZC93cml0ZSBtYWNyb3MgKi8KKyNkZWZpbmUgTUNGX0xDRENfTFNTQVIgICAgICAgICAgICAgICAgICBNQ0ZfUkVHMzIoMHhGQzBBQzAwMCkKKyNkZWZpbmUgTUNGX0xDRENfTFNSICAgICAgICAgICAgICAgICAgICBNQ0ZfUkVHMzIoMHhGQzBBQzAwNCkKKyNkZWZpbmUgTUNGX0xDRENfTFZQV1IgICAgICAgICAgICAgICAgICBNQ0ZfUkVHMzIoMHhGQzBBQzAwOCkKKyNkZWZpbmUgTUNGX0xDRENfTENQUiAgICAgICAgICAgICAgICAgICBNQ0ZfUkVHMzIoMHhGQzBBQzAwQykKKyNkZWZpbmUgTUNGX0xDRENfTENXSEJSICAgICAgICAgICAgICAgICBNQ0ZfUkVHMzIoMHhGQzBBQzAxMCkKKyNkZWZpbmUgTUNGX0xDRENfTENDTVIgICAgICAgICAgICAgICAgICBNQ0ZfUkVHMzIoMHhGQzBBQzAxNCkKKyNkZWZpbmUgTUNGX0xDRENfTFBDUiAgICAgICAgICAgICAgICAgICBNQ0ZfUkVHMzIoMHhGQzBBQzAxOCkKKyNkZWZpbmUgTUNGX0xDRENfTEhDUiAgICAgICAgICAgICAgICAgICBNQ0ZfUkVHMzIoMHhGQzBBQzAxQykKKyNkZWZpbmUgTUNGX0xDRENfTFZDUiAgICAgICAgICAgICAgICAgICBNQ0ZfUkVHMzIoMHhGQzBBQzAyMCkKKyNkZWZpbmUgTUNGX0xDRENfTFBPUiAgICAgICAgICAgICAgICAgICBNQ0ZfUkVHMzIoMHhGQzBBQzAyNCkKKyNkZWZpbmUgTUNGX0xDRENfTFNDUiAgICAgICAgICAgICAgICAgICBNQ0ZfUkVHMzIoMHhGQzBBQzAyOCkKKyNkZWZpbmUgTUNGX0xDRENfTFBDQ1IgICAgICAgICAgICAgICAgICBNQ0ZfUkVHMzIoMHhGQzBBQzAyQykKKyNkZWZpbmUgTUNGX0xDRENfTERDUiAgICAgICAgICAgICAgICAgICBNQ0ZfUkVHMzIoMHhGQzBBQzAzMCkKKyNkZWZpbmUgTUNGX0xDRENfTFJNQ1IgICAgICAgICAgICAgICAgICBNQ0ZfUkVHMzIoMHhGQzBBQzAzNCkKKyNkZWZpbmUgTUNGX0xDRENfTElDUiAgICAgICAgICAgICAgICAgICBNQ0ZfUkVHMzIoMHhGQzBBQzAzOCkKKyNkZWZpbmUgTUNGX0xDRENfTElFUiAgICAgICAgICAgICAgICAgICBNQ0ZfUkVHMzIoMHhGQzBBQzAzQykKKyNkZWZpbmUgTUNGX0xDRENfTElTUiAgICAgICAgICAgICAgICAgICBNQ0ZfUkVHMzIoMHhGQzBBQzA0MCkKKyNkZWZpbmUgTUNGX0xDRENfTEdXU0FSICAgICAgICAgICAgICAgICBNQ0ZfUkVHMzIoMHhGQzBBQzA1MCkKKyNkZWZpbmUgTUNGX0xDRENfTEdXU1IgICAgICAgICAgICAgICAgICBNQ0ZfUkVHMzIoMHhGQzBBQzA1NCkKKyNkZWZpbmUgTUNGX0xDRENfTEdXVlBXUiAgICAgICAgICAgICAgICBNQ0ZfUkVHMzIoMHhGQzBBQzA1OCkKKyNkZWZpbmUgTUNGX0xDRENfTEdXUE9SICAgICAgICAgICAgICAgICBNQ0ZfUkVHMzIoMHhGQzBBQzA1QykKKyNkZWZpbmUgTUNGX0xDRENfTEdXUFIgICAgICAgICAgICAgICAgICBNQ0ZfUkVHMzIoMHhGQzBBQzA2MCkKKyNkZWZpbmUgTUNGX0xDRENfTEdXQ1IgICAgICAgICAgICAgICAgICBNQ0ZfUkVHMzIoMHhGQzBBQzA2NCkKKyNkZWZpbmUgTUNGX0xDRENfTEdXRENSICAgICAgICAgICAgICAgICBNQ0ZfUkVHMzIoMHhGQzBBQzA2OCkKKyNkZWZpbmUgTUNGX0xDRENfQlBMVVRfQkFTRSAgICAgICAgICAgICBNQ0ZfUkVHMzIoMHhGQzBBQzgwMCkKKyNkZWZpbmUgTUNGX0xDRENfR1dMVVRfQkFTRSAgICAgICAgICAgICBNQ0ZfUkVHMzIoMHhGQzBBQ0MwMCkKKworLyogQml0IGRlZmluaXRpb25zIGFuZCBtYWNyb3MgZm9yIE1DRl9MQ0RDX0xTU0FSICovCisjZGVmaW5lIE1DRl9MQ0RDX0xTU0FSX1NTQSh4KSAgICAgICAgICAgKCgoeCkmMHgzRkZGRkZGRik8PDIpCisKKy8qIEJpdCBkZWZpbml0aW9ucyBhbmQgbWFjcm9zIGZvciBNQ0ZfTENEQ19MU1IgKi8KKyNkZWZpbmUgTUNGX0xDRENfTFNSX1lNQVgoeCkgICAgICAgICAgICAoKCh4KSYweDAwMDAwM0ZGKTw8MCkKKyNkZWZpbmUgTUNGX0xDRENfTFNSX1hNQVgoeCkgICAgICAgICAgICAoKCh4KSYweDAwMDAwMDNGKTw8MjApCisKKy8qIEJpdCBkZWZpbml0aW9ucyBhbmQgbWFjcm9zIGZvciBNQ0ZfTENEQ19MVlBXUiAqLworI2RlZmluZSBNQ0ZfTENEQ19MVlBXUl9WUFcoeCkgICAgICAgICAgICgoKHgpJjB4MDAwMDAzRkYpPDwwKQorCisvKiBCaXQgZGVmaW5pdGlvbnMgYW5kIG1hY3JvcyBmb3IgTUNGX0xDRENfTENQUiAqLworI2RlZmluZSBNQ0ZfTENEQ19MQ1BSX0NZUCh4KSAgICAgICAgICAgICgoKHgpJjB4MDAwMDAzRkYpPDwwKQorI2RlZmluZSBNQ0ZfTENEQ19MQ1BSX0NYUCh4KSAgICAgICAgICAgICgoKHgpJjB4MDAwMDAzRkYpPDwxNikKKyNkZWZpbmUgTUNGX0xDRENfTENQUl9PUCAgICAgICAgICAgICAgICAoMHgxMDAwMDAwMCkKKyNkZWZpbmUgTUNGX0xDRENfTENQUl9DQyh4KSAgICAgICAgICAgICAoKCh4KSYweDAwMDAwMDAzKTw8MzApCisjZGVmaW5lIE1DRl9MQ0RDX0xDUFJfQ0NfVFJBTlNQQVJFTlQgICAgKDB4MDAwMDAwMDApCisjZGVmaW5lIE1DRl9MQ0RDX0xDUFJfQ0NfT1IgICAgICAgICAgICAgKDB4NDAwMDAwMDApCisjZGVmaW5lIE1DRl9MQ0RDX0xDUFJfQ0NfWE9SICAgICAgICAgICAgKDB4ODAwMDAwMDApCisjZGVmaW5lIE1DRl9MQ0RDX0xDUFJfQ0NfQU5EICAgICAgICAgICAgKDB4QzAwMDAwMDApCisjZGVmaW5lIE1DRl9MQ0RDX0xDUFJfT1BfT04gICAgICAgICAgICAgKDB4MTAwMDAwMDApCisjZGVmaW5lIE1DRl9MQ0RDX0xDUFJfT1BfT0ZGICAgICAgICAgICAgKDB4MDAwMDAwMDApCisKKy8qIEJpdCBkZWZpbml0aW9ucyBhbmQgbWFjcm9zIGZvciBNQ0ZfTENEQ19MQ1dIQlIgKi8KKyNkZWZpbmUgTUNGX0xDRENfTENXSEJSX0JEKHgpICAgICAgICAgICAoKCh4KSYweDAwMDAwMEZGKTw8MCkKKyNkZWZpbmUgTUNGX0xDRENfTENXSEJSX0NIKHgpICAgICAgICAgICAoKCh4KSYweDAwMDAwMDFGKTw8MTYpCisjZGVmaW5lIE1DRl9MQ0RDX0xDV0hCUl9DVyh4KSAgICAgICAgICAgKCgoeCkmMHgwMDAwMDAxRik8PDI0KQorI2RlZmluZSBNQ0ZfTENEQ19MQ1dIQlJfQktfRU4gICAgICAgICAgICgweDgwMDAwMDAwKQorI2RlZmluZSBNQ0ZfTENEQ19MQ1dIQlJfQktfRU5fT04gICAgICAgICgweDgwMDAwMDAwKQorI2RlZmluZSBNQ0ZfTENEQ19MQ1dIQlJfQktfRU5fT0ZGICAgICAgICgweDAwMDAwMDAwKQorCisvKiBCaXQgZGVmaW5pdGlvbnMgYW5kIG1hY3JvcyBmb3IgTUNGX0xDRENfTENDTVIgKi8KKyNkZWZpbmUgTUNGX0xDRENfTENDTVJfQ1VSX0NPTF9CKHgpICAgICAoKCh4KSYweDAwMDAwMDNGKTw8MCkKKyNkZWZpbmUgTUNGX0xDRENfTENDTVJfQ1VSX0NPTF9HKHgpICAgICAoKCh4KSYweDAwMDAwMDNGKTw8NikKKyNkZWZpbmUgTUNGX0xDRENfTENDTVJfQ1VSX0NPTF9SKHgpICAgICAoKCh4KSYweDAwMDAwMDNGKTw8MTIpCisKKy8qIEJpdCBkZWZpbml0aW9ucyBhbmQgbWFjcm9zIGZvciBNQ0ZfTENEQ19MUENSICovCisjZGVmaW5lIE1DRl9MQ0RDX0xQQ1JfUENEKHgpICAgICAgICAgICAgKCgoeCkmMHgwMDAwMDAzRik8PDApCisjZGVmaW5lIE1DRl9MQ0RDX0xQQ1JfU0hBUlAgICAgICAgICAgICAgKDB4MDAwMDAwNDApCisjZGVmaW5lIE1DRl9MQ0RDX0xQQ1JfU0NMS1NFTCAgICAgICAgICAgKDB4MDAwMDAwODApCisjZGVmaW5lIE1DRl9MQ0RDX0xQQ1JfQUNEKHgpICAgICAgICAgICAgKCgoeCkmMHgwMDAwMDA3Rik8PDgpCisjZGVmaW5lIE1DRl9MQ0RDX0xQQ1JfQUNEU0VMICAgICAgICAgICAgKDB4MDAwMDgwMDApCisjZGVmaW5lIE1DRl9MQ0RDX0xQQ1JfUkVWX1ZTICAgICAgICAgICAgKDB4MDAwMTAwMDApCisjZGVmaW5lIE1DRl9MQ0RDX0xQQ1JfU1dBUF9TRUwgICAgICAgICAgKDB4MDAwMjAwMDApCisjZGVmaW5lIE1DRl9MQ0RDX0xQQ1JfRU5EU0VMICAgICAgICAgICAgKDB4MDAwNDAwMDApCisjZGVmaW5lIE1DRl9MQ0RDX0xQQ1JfU0NMS0lETEUgICAgICAgICAgKDB4MDAwODAwMDApCisjZGVmaW5lIE1DRl9MQ0RDX0xQQ1JfT0VQT0wgICAgICAgICAgICAgKDB4MDAxMDAwMDApCisjZGVmaW5lIE1DRl9MQ0RDX0xQQ1JfQ0xLUE9MICAgICAgICAgICAgKDB4MDAyMDAwMDApCisjZGVmaW5lIE1DRl9MQ0RDX0xQQ1JfTFBQT0wgICAgICAgICAgICAgKDB4MDA0MDAwMDApCisjZGVmaW5lIE1DRl9MQ0RDX0xQQ1JfRkxNICAgICAgICAgICAgICAgKDB4MDA4MDAwMDApCisjZGVmaW5lIE1DRl9MQ0RDX0xQQ1JfUElYUE9MICAgICAgICAgICAgKDB4MDEwMDAwMDApCisjZGVmaW5lIE1DRl9MQ0RDX0xQQ1JfQlBJWCh4KSAgICAgICAgICAgKCgoeCkmMHgwMDAwMDAwNyk8PDI1KQorI2RlZmluZSBNQ0ZfTENEQ19MUENSX1BCU0laKHgpICAgICAgICAgICgoKHgpJjB4MDAwMDAwMDMpPDwyOCkKKyNkZWZpbmUgTUNGX0xDRENfTFBDUl9DT0xPUiAgICAgICAgICAgICAoMHg0MDAwMDAwMCkKKyNkZWZpbmUgTUNGX0xDRENfTFBDUl9URlQgICAgICAgICAgICAgICAoMHg4MDAwMDAwMCkKKyNkZWZpbmUgTUNGX0xDRENfTFBDUl9NT0RFX01PTk9DR1JPTUUgICAoMHgwMDAwMDAwMCkKKyNkZWZpbmUgTUNGX0xDRENfTFBDUl9NT0RFX0NTVE4gICAgICAgICAoMHg0MDAwMDAwMCkKKyNkZWZpbmUgTUNGX0xDRENfTFBDUl9NT0RFX1RGVCAgICAgICAgICAoMHhDMDAwMDAwMCkKKyNkZWZpbmUgTUNGX0xDRENfTFBDUl9QQlNJWl8xICAgICAgICAgICAoMHgwMDAwMDAwMCkKKyNkZWZpbmUgTUNGX0xDRENfTFBDUl9QQlNJWl8yICAgICAgICAgICAoMHgxMDAwMDAwMCkKKyNkZWZpbmUgTUNGX0xDRENfTFBDUl9QQlNJWl80ICAgICAgICAgICAoMHgyMDAwMDAwMCkKKyNkZWZpbmUgTUNGX0xDRENfTFBDUl9QQlNJWl84ICAgICAgICAgICAoMHgzMDAwMDAwMCkKKyNkZWZpbmUgTUNGX0xDRENfTFBDUl9CUElYXzFicHAgICAgICAgICAoMHgwMDAwMDAwMCkKKyNkZWZpbmUgTUNGX0xDRENfTFBDUl9CUElYXzJicHAgICAgICAgICAoMHgwMjAwMDAwMCkKKyNkZWZpbmUgTUNGX0xDRENfTFBDUl9CUElYXzRicHAgICAgICAgICAoMHgwNDAwMDAwMCkKKyNkZWZpbmUgTUNGX0xDRENfTFBDUl9CUElYXzhicHAgICAgICAgICAoMHgwNjAwMDAwMCkKKyNkZWZpbmUgTUNGX0xDRENfTFBDUl9CUElYXzEyYnBwICAgICAgICAoMHgwODAwMDAwMCkKKyNkZWZpbmUgTUNGX0xDRENfTFBDUl9CUElYXzE2YnBwICAgICAgICAoMHgwQTAwMDAwMCkKKyNkZWZpbmUgTUNGX0xDRENfTFBDUl9CUElYXzE4YnBwICAgICAgICAoMHgwQzAwMDAwMCkKKworI2RlZmluZSBNQ0ZfTENEQ19MUENSX1BBTkVMX1RZUEUoeCkgICAgICgoKHgpJjB4MDAwMDAwMDMpPDwzMCkgCisKKy8qIEJpdCBkZWZpbml0aW9ucyBhbmQgbWFjcm9zIGZvciBNQ0ZfTENEQ19MSENSICovCisjZGVmaW5lIE1DRl9MQ0RDX0xIQ1JfSF9XQUlUXzIoeCkgICAgICAgKCgoeCkmMHgwMDAwMDBGRik8PDApCisjZGVmaW5lIE1DRl9MQ0RDX0xIQ1JfSF9XQUlUXzEoeCkgICAgICAgKCgoeCkmMHgwMDAwMDBGRik8PDgpCisjZGVmaW5lIE1DRl9MQ0RDX0xIQ1JfSF9XSURUSCh4KSAgICAgICAgKCgoeCkmMHgwMDAwMDAzRik8PDI2KQorCisvKiBCaXQgZGVmaW5pdGlvbnMgYW5kIG1hY3JvcyBmb3IgTUNGX0xDRENfTFZDUiAqLworI2RlZmluZSBNQ0ZfTENEQ19MVkNSX1ZfV0FJVF8yKHgpICAgICAgICgoKHgpJjB4MDAwMDAwRkYpPDwwKQorI2RlZmluZSBNQ0ZfTENEQ19MVkNSX1ZfV0FJVF8xKHgpICAgICAgICgoKHgpJjB4MDAwMDAwRkYpPDw4KQorI2RlZmluZSBNQ0ZfTENEQ19MVkNSX1ZfV0lEVEgoeCkgICAgICAoKCh4KSYweDAwMDAwMDNGKTw8MjYpCisKKy8qIEJpdCBkZWZpbml0aW9ucyBhbmQgbWFjcm9zIGZvciBNQ0ZfTENEQ19MUE9SICovCisjZGVmaW5lIE1DRl9MQ0RDX0xQT1JfUE9TKHgpICAgICAgICAgICAgKCgoeCkmMHgwMDAwMDAxRik8PDApCisKKy8qIEJpdCBkZWZpbml0aW9ucyBhbmQgbWFjcm9zIGZvciBNQ0ZfTENEQ19MUENDUiAqLworI2RlZmluZSBNQ0ZfTENEQ19MUENDUl9QVyh4KSAgICAgICAgICAgICgoKHgpJjB4MDAwMDAwRkYpPDwwKQorI2RlZmluZSBNQ0ZfTENEQ19MUENDUl9DQ19FTiAgICAgICAgICAgICgweDAwMDAwMTAwKQorI2RlZmluZSBNQ0ZfTENEQ19MUENDUl9TQ1IoeCkgICAgICAgICAgICgoKHgpJjB4MDAwMDAwMDMpPDw5KQorI2RlZmluZSBNQ0ZfTENEQ19MUENDUl9MRE1TSyAgICAgICAgICAgICgweDAwMDA4MDAwKQorI2RlZmluZSBNQ0ZfTENEQ19MUENDUl9DTFNfSElfV0lEVEgoeCkgICgoKHgpJjB4MDAwMDAxRkYpPDwxNikKKyNkZWZpbmUgTUNGX0xDRENfTFBDQ1JfU0NSX0xJTkVQVUxTRSAgICAoMHgwMDAwMDAwMCkKKyNkZWZpbmUgTUNGX0xDRENfTFBDQ1JfU0NSX1BJWEVMQ0xLICAgICAoMHgwMDAwMjAwMCkKKyNkZWZpbmUgTUNGX0xDRENfTFBDQ1JfU0NSX0xDRENMT0NLICAgICAoMHgwMDAwNDAwMCkKKworLyogQml0IGRlZmluaXRpb25zIGFuZCBtYWNyb3MgZm9yIE1DRl9MQ0RDX0xEQ1IgKi8KKyNkZWZpbmUgTUNGX0xDRENfTERDUl9UTSh4KSAgICAgICAgICAgICAoKCh4KSYweDAwMDAwMDFGKTw8MCkKKyNkZWZpbmUgTUNGX0xDRENfTERDUl9ITSh4KSAgICAgICAgICAgICAoKCh4KSYweDAwMDAwMDFGKTw8MTYpCisjZGVmaW5lIE1DRl9MQ0RDX0xEQ1JfQlVSU1QgICAgICAgICAgICAgKDB4ODAwMDAwMDApCisKKy8qIEJpdCBkZWZpbml0aW9ucyBhbmQgbWFjcm9zIGZvciBNQ0ZfTENEQ19MUk1DUiAqLworI2RlZmluZSBNQ0ZfTENEQ19MUk1DUl9TRUxfUkVGICAgICAgICAgICgweDAwMDAwMDAxKQorCisvKiBCaXQgZGVmaW5pdGlvbnMgYW5kIG1hY3JvcyBmb3IgTUNGX0xDRENfTElDUiAqLworI2RlZmluZSBNQ0ZfTENEQ19MSUNSX0lOVENPTiAgICAgICAgICAgICgweDAwMDAwMDAxKQorI2RlZmluZSBNQ0ZfTENEQ19MSUNSX0lOVFNZTiAgICAgICAgICAgICgweDAwMDAwMDA0KQorI2RlZmluZSBNQ0ZfTENEQ19MSUNSX0dXX0lOVF9DT04gICAgICAgICgweDAwMDAwMDEwKQorCisvKiBCaXQgZGVmaW5pdGlvbnMgYW5kIG1hY3JvcyBmb3IgTUNGX0xDRENfTElFUiAqLworI2RlZmluZSBNQ0ZfTENEQ19MSUVSX0JPRl9FTiAgICAgICAgICAgICgweDAwMDAwMDAxKQorI2RlZmluZSBNQ0ZfTENEQ19MSUVSX0VPRl9FTiAgICAgICAgICAgICgweDAwMDAwMDAyKQorI2RlZmluZSBNQ0ZfTENEQ19MSUVSX0VSUl9SRVNfRU4gICAgICAgICgweDAwMDAwMDA0KQorI2RlZmluZSBNQ0ZfTENEQ19MSUVSX1VEUl9FUlJfRU4gICAgICAgICgweDAwMDAwMDA4KQorI2RlZmluZSBNQ0ZfTENEQ19MSUVSX0dXX0JPRl9FTiAgICAgICAgICgweDAwMDAwMDEwKQorI2RlZmluZSBNQ0ZfTENEQ19MSUVSX0dXX0VPRl9FTiAgICAgICAgICgweDAwMDAwMDIwKQorI2RlZmluZSBNQ0ZfTENEQ19MSUVSX0dXX0VSUl9SRVNfRU4gICAgICgweDAwMDAwMDQwKQorI2RlZmluZSBNQ0ZfTENEQ19MSUVSX0dXX1VEUl9FUlJfRU4gICAgICgweDAwMDAwMDgwKQorCisvKiBCaXQgZGVmaW5pdGlvbnMgYW5kIG1hY3JvcyBmb3IgTUNGX0xDRENfTElTUiAqLworI2RlZmluZSBNQ0ZfTENEQ19MSVNSX0JPRiAgICAgICAgICAgICAgICgweDAwMDAwMDAxKQorI2RlZmluZSBNQ0ZfTENEQ19MSVNSX0VPRiAgICAgICAgICAgICAgICgweDAwMDAwMDAyKQorI2RlZmluZSBNQ0ZfTENEQ19MSVNSX0VSUl9SRVMgICAgICAgICAgICgweDAwMDAwMDA0KQorI2RlZmluZSBNQ0ZfTENEQ19MSVNSX1VEUl9FUlIgICAgICAgICAgICgweDAwMDAwMDA4KQorI2RlZmluZSBNQ0ZfTENEQ19MSVNSX0dXX0JPRiAgICAgICAgICAgICgweDAwMDAwMDEwKQorI2RlZmluZSBNQ0ZfTENEQ19MSVNSX0dXX0VPRiAgICAgICAgICAgICgweDAwMDAwMDIwKQorI2RlZmluZSBNQ0ZfTENEQ19MSVNSX0dXX0VSUl9SRVMgICAgICAgICgweDAwMDAwMDQwKQorI2RlZmluZSBNQ0ZfTENEQ19MSVNSX0dXX1VEUl9FUlIgICAgICAgICgweDAwMDAwMDgwKQorCisvKiBCaXQgZGVmaW5pdGlvbnMgYW5kIG1hY3JvcyBmb3IgTUNGX0xDRENfTEdXU0FSICovCisjZGVmaW5lIE1DRl9MQ0RDX0xHV1NBUl9HV1NBKHgpICAgICAgICAgKCgoeCkmMHgzRkZGRkZGRik8PDIpCisKKy8qIEJpdCBkZWZpbml0aW9ucyBhbmQgbWFjcm9zIGZvciBNQ0ZfTENEQ19MR1dTUiAqLworI2RlZmluZSBNQ0ZfTENEQ19MR1dTUl9HV0goeCkgICAgICAgICAgICgoKHgpJjB4MDAwMDAzRkYpPDwwKQorI2RlZmluZSBNQ0ZfTENEQ19MR1dTUl9HV1coeCkgICAgICAgICAgICgoKHgpJjB4MDAwMDAwM0YpPDwyMCkKKworLyogQml0IGRlZmluaXRpb25zIGFuZCBtYWNyb3MgZm9yIE1DRl9MQ0RDX0xHV1ZQV1IgKi8KKyNkZWZpbmUgTUNGX0xDRENfTEdXVlBXUl9HV1ZQVyh4KSAgICAgICAoKCh4KSYweDAwMDAwM0ZGKTw8MCkKKworLyogQml0IGRlZmluaXRpb25zIGFuZCBtYWNyb3MgZm9yIE1DRl9MQ0RDX0xHV1BPUiAqLworI2RlZmluZSBNQ0ZfTENEQ19MR1dQT1JfR1dQTyh4KSAgICAgICAgICgoKHgpJjB4MDAwMDAwMUYpPDwwKQorCisvKiBCaXQgZGVmaW5pdGlvbnMgYW5kIG1hY3JvcyBmb3IgTUNGX0xDRENfTEdXUFIgKi8KKyNkZWZpbmUgTUNGX0xDRENfTEdXUFJfR1dZUCh4KSAgICAgICAgICAoKCh4KSYweDAwMDAwM0ZGKTw8MCkKKyNkZWZpbmUgTUNGX0xDRENfTEdXUFJfR1dYUCh4KSAgICAgICAgICAoKCh4KSYweDAwMDAwM0ZGKTw8MTYpCisKKy8qIEJpdCBkZWZpbml0aW9ucyBhbmQgbWFjcm9zIGZvciBNQ0ZfTENEQ19MR1dDUiAqLworI2RlZmluZSBNQ0ZfTENEQ19MR1dDUl9HV0NLQih4KSAgICAgICAgICgoKHgpJjB4MDAwMDAwM0YpPDwwKQorI2RlZmluZSBNQ0ZfTENEQ19MR1dDUl9HV0NLRyh4KSAgICAgICAgICgoKHgpJjB4MDAwMDAwM0YpPDw2KQorI2RlZmluZSBNQ0ZfTENEQ19MR1dDUl9HV0NLUih4KSAgICAgICAgICgoKHgpJjB4MDAwMDAwM0YpPDwxMikKKyNkZWZpbmUgTUNGX0xDRENfTEdXQ1JfR1dfUlZTICAgICAgICAgICAoMHgwMDIwMDAwMCkKKyNkZWZpbmUgTUNGX0xDRENfTEdXQ1JfR1dFICAgICAgICAgICAgICAoMHgwMDQwMDAwMCkKKyNkZWZpbmUgTUNGX0xDRENfTEdXQ1JfR1dDS0UgICAgICAgICAgICAoMHgwMDgwMDAwMCkKKyNkZWZpbmUgTUNGX0xDRENfTEdXQ1JfR1dBVih4KSAgICAgICAgICAoKCh4KSYweDAwMDAwMEZGKTw8MjQpCisKKy8qIEJpdCBkZWZpbml0aW9ucyBhbmQgbWFjcm9zIGZvciBNQ0ZfTENEQ19MR1dEQ1IgKi8KKyNkZWZpbmUgTUNGX0xDRENfTEdXRENSX0dXVE0oeCkgICAgICAgICAoKCh4KSYweDAwMDAwMDFGKTw8MCkKKyNkZWZpbmUgTUNGX0xDRENfTEdXRENSX0dXSE0oeCkgICAgICAgICAoKCh4KSYweDAwMDAwMDFGKTw8MTYpCisjZGVmaW5lIE1DRl9MQ0RDX0xHV0RDUl9HV0JUICAgICAgICAgICAgKDB4ODAwMDAwMDApCisKKy8qIEJpdCBkZWZpbml0aW9ucyBhbmQgbWFjcm9zIGZvciBNQ0ZfTENEQ19MU0NSICovCisjZGVmaW5lIE1DRl9MQ0RDX0xTQ1JfUFNfUklTRV9ERUxBWSh4KSAgICAoKCh4KSYweDAwMDAwMDNGKTw8MjYpCisjZGVmaW5lIE1DRl9MQ0RDX0xTQ1JfQ0xTX1JJU0VfREVMQVkoeCkgICAoKCh4KSYweDAwMDAwMEZGKTw8MTYpCisjZGVmaW5lIE1DRl9MQ0RDX0xTQ1JfUkVWX1RPR0dMRV9ERUxBWSh4KSAoKCh4KSYweDAwMDAwMDBGKTw8OCkKKyNkZWZpbmUgTUNGX0xDRENfTFNDUl9HUkFZXzIoeCkgIAkJICAoKCh4KSYweDAwMDAwMDBGKTw8NCkKKyNkZWZpbmUgTUNGX0xDRENfTFNDUl9HUkFZXzEoeCkgIAkJICAoKCh4KSYweDAwMDAwMDBGKTw8MCkKKworLyogQml0IGRlZmluaXRpb25zIGFuZCBtYWNyb3MgZm9yIE1DRl9MQ0RDX0JQTFVUX0JBU0UgKi8KKyNkZWZpbmUgTUNGX0xDRENfQlBMVVRfQkFTRV9CQVNFKHgpICAgICAoKCh4KSYweEZGRkZGRkZGKTw8MCkKKworLyogQml0IGRlZmluaXRpb25zIGFuZCBtYWNyb3MgZm9yIE1DRl9MQ0RDX0dXTFVUX0JBU0UgKi8KKyNkZWZpbmUgTUNGX0xDRENfR1dMVVRfQkFTRV9CQVNFKHgpICAgICAoKCh4KSYweEZGRkZGRkZGKTw8MCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFBoYXNlIExvY2tlZCBMb29wIChQTEwpCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogUmVnaXN0ZXIgcmVhZC93cml0ZSBtYWNyb3MgKi8KKyNkZWZpbmUgTUNGX1BMTF9QT0RSICAgICAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzBDMDAwMCkKKyNkZWZpbmUgTUNGX1BMTF9QTExDUiAgICAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzBDMDAwNCkKKyNkZWZpbmUgTUNGX1BMTF9QTURSICAgICAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzBDMDAwOCkKKyNkZWZpbmUgTUNGX1BMTF9QRkRSICAgICAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzBDMDAwQykKKworLyogQml0IGRlZmluaXRpb25zIGFuZCBtYWNyb3MgZm9yIE1DRl9QTExfUE9EUiAqLworI2RlZmluZSBNQ0ZfUExMX1BPRFJfQlVTRElWKHgpICAgICgoKHgpJjB4MEYpPDwwKQorI2RlZmluZSBNQ0ZfUExMX1BPRFJfQ1BVRElWKHgpICAgICgoKHgpJjB4MEYpPDw0KQorCisvKiBCaXQgZGVmaW5pdGlvbnMgYW5kIG1hY3JvcyBmb3IgTUNGX1BMTF9QTExDUiAqLworI2RlZmluZSBNQ0ZfUExMX1BMTENSX0RJVEhERVYoeCkgICgoKHgpJjB4MDcpPDwwKQorI2RlZmluZSBNQ0ZfUExMX1BMTENSX0RJVEhFTiAgICAgICgweDgwKQorCisvKiBCaXQgZGVmaW5pdGlvbnMgYW5kIG1hY3JvcyBmb3IgTUNGX1BMTF9QTURSICovCisjZGVmaW5lIE1DRl9QTExfUE1EUl9NT0RESVYoeCkgICAgKCgoeCkmMHhGRik8PDApCisKKy8qIEJpdCBkZWZpbml0aW9ucyBhbmQgbWFjcm9zIGZvciBNQ0ZfUExMX1BGRFIgKi8KKyNkZWZpbmUgTUNGX1BMTF9QRkRSX01GRCh4KSAgICAgICAoKCh4KSYweEZGKTw8MCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFN5c3RlbSBDb250cm9sIE1vZHVsZSBSZWdpc3RlcnMgKFNDTSkKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBSZWdpc3RlciByZWFkL3dyaXRlIG1hY3JvcyAqLworI2RlZmluZSBNQ0ZfU0NNX01QUgkJCU1DRl9SRUczMigweEZDMDAwMDAwKQorI2RlZmluZSBNQ0ZfU0NNX1BBQ1JBCQkJTUNGX1JFRzMyKDB4RkMwMDAwMjApCisjZGVmaW5lIE1DRl9TQ01fUEFDUkIJCQlNQ0ZfUkVHMzIoMHhGQzAwMDAyNCkKKyNkZWZpbmUgTUNGX1NDTV9QQUNSQwkJCU1DRl9SRUczMigweEZDMDAwMDI4KQorI2RlZmluZSBNQ0ZfU0NNX1BBQ1JECQkJTUNGX1JFRzMyKDB4RkMwMDAwMkMpCisjZGVmaW5lIE1DRl9TQ01fUEFDUkUJCQlNQ0ZfUkVHMzIoMHhGQzAwMDA0MCkKKyNkZWZpbmUgTUNGX1NDTV9QQUNSRgkJCU1DRl9SRUczMigweEZDMDAwMDQ0KQorCisjZGVmaW5lIE1DRl9TQ01fQkNSCQkJTUNGX1JFRzMyKDB4RkMwNDAwMjQpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBTRFJBTSBDb250cm9sbGVyIChTRFJBTUMpCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogUmVnaXN0ZXIgcmVhZC93cml0ZSBtYWNyb3MgKi8KKyNkZWZpbmUgTUNGX1NEUkFNQ19TRE1SCQkJTUNGX1JFRzMyKDB4RkMwQjgwMDApCisjZGVmaW5lIE1DRl9TRFJBTUNfU0RDUgkJCU1DRl9SRUczMigweEZDMEI4MDA0KQorI2RlZmluZSBNQ0ZfU0RSQU1DX1NEQ0ZHMQkJTUNGX1JFRzMyKDB4RkMwQjgwMDgpCisjZGVmaW5lIE1DRl9TRFJBTUNfU0RDRkcyCQlNQ0ZfUkVHMzIoMHhGQzBCODAwQykKKyNkZWZpbmUgTUNGX1NEUkFNQ19MSU1QX0ZJWAkJTUNGX1JFRzMyKDB4RkMwQjgwODApCisjZGVmaW5lIE1DRl9TRFJBTUNfU0REUwkJCU1DRl9SRUczMigweEZDMEI4MTAwKQorI2RlZmluZSBNQ0ZfU0RSQU1DX1NEQ1MwCQlNQ0ZfUkVHMzIoMHhGQzBCODExMCkKKyNkZWZpbmUgTUNGX1NEUkFNQ19TRENTMQkJTUNGX1JFRzMyKDB4RkMwQjgxMTQpCisjZGVmaW5lIE1DRl9TRFJBTUNfU0RDUzIJCU1DRl9SRUczMigweEZDMEI4MTE4KQorI2RlZmluZSBNQ0ZfU0RSQU1DX1NEQ1MzCQlNQ0ZfUkVHMzIoMHhGQzBCODExQykKKyNkZWZpbmUgTUNGX1NEUkFNQ19TRENTKHgpCQlNQ0ZfUkVHMzIoMHhGQzBCODExMCsoKHgpKjB4MDA0KSkKKworLyogQml0IGRlZmluaXRpb25zIGFuZCBtYWNyb3MgZm9yIE1DRl9TRFJBTUNfU0RNUiAqLworI2RlZmluZSBNQ0ZfU0RSQU1DX1NETVJfQ01ECQkoMHgwMDAxMDAwMCkKKyNkZWZpbmUgTUNGX1NEUkFNQ19TRE1SX0FEKHgpCQkoKCh4KSYweDAwMDAwRkZGKTw8MTgpCisjZGVmaW5lIE1DRl9TRFJBTUNfU0RNUl9CTktBRCh4KQkoKCh4KSYweDAwMDAwMDAzKTw8MzApCisjZGVmaW5lIE1DRl9TRFJBTUNfU0RNUl9CTktBRF9MTVIJKDB4MDAwMDAwMDApCisjZGVmaW5lIE1DRl9TRFJBTUNfU0RNUl9CTktBRF9MRU1SCSgweDQwMDAwMDAwKQorCisvKiBCaXQgZGVmaW5pdGlvbnMgYW5kIG1hY3JvcyBmb3IgTUNGX1NEUkFNQ19TRENSICovCisjZGVmaW5lIE1DRl9TRFJBTUNfU0RDUl9JUEFMTAkJKDB4MDAwMDAwMDIpCisjZGVmaW5lIE1DRl9TRFJBTUNfU0RDUl9JUkVGCQkoMHgwMDAwMDAwNCkKKyNkZWZpbmUgTUNGX1NEUkFNQ19TRENSX0RRU19PRSh4KQkoKCh4KSYweDAwMDAwMDBGKTw8OCkKKyNkZWZpbmUgTUNGX1NEUkFNQ19TRENSX1BTKHgpCQkoKCh4KSYweDAwMDAwMDAzKTw8MTIpCisjZGVmaW5lIE1DRl9TRFJBTUNfU0RDUl9SQ05UKHgpCQkoKCh4KSYweDAwMDAwMDNGKTw8MTYpCisjZGVmaW5lIE1DRl9TRFJBTUNfU0RDUl9PRV9SVUxFCQkoMHgwMDQwMDAwMCkKKyNkZWZpbmUgTUNGX1NEUkFNQ19TRENSX01VWCh4KQkJKCgoeCkmMHgwMDAwMDAwMyk8PDI0KQorI2RlZmluZSBNQ0ZfU0RSQU1DX1NEQ1JfUkVGCQkoMHgxMDAwMDAwMCkKKyNkZWZpbmUgTUNGX1NEUkFNQ19TRENSX0REUgkJKDB4MjAwMDAwMDApCisjZGVmaW5lIE1DRl9TRFJBTUNfU0RDUl9DS0UJCSgweDQwMDAwMDAwKQorI2RlZmluZSBNQ0ZfU0RSQU1DX1NEQ1JfTU9ERV9FTgkJKDB4ODAwMDAwMDApCisjZGVmaW5lIE1DRl9TRFJBTUNfU0RDUl9QU18xNgkJKDB4MDAwMDIwMDApCisjZGVmaW5lIE1DRl9TRFJBTUNfU0RDUl9QU18zMgkJKDB4MDAwMDAwMDApCisKKy8qIEJpdCBkZWZpbml0aW9ucyBhbmQgbWFjcm9zIGZvciBNQ0ZfU0RSQU1DX1NEQ0ZHMSAqLworI2RlZmluZSBNQ0ZfU0RSQU1DX1NEQ0ZHMV9XVExBVCh4KQkoKCh4KSYweDAwMDAwMDA3KTw8NCkKKyNkZWZpbmUgTUNGX1NEUkFNQ19TRENGRzFfUkVGMkFDVCh4KQkoKCh4KSYweDAwMDAwMDBGKTw8OCkKKyNkZWZpbmUgTUNGX1NEUkFNQ19TRENGRzFfUFJFMkFDVCh4KQkoKCh4KSYweDAwMDAwMDA3KTw8MTIpCisjZGVmaW5lIE1DRl9TRFJBTUNfU0RDRkcxX0FDVDJSVyh4KQkoKCh4KSYweDAwMDAwMDA3KTw8MTYpCisjZGVmaW5lIE1DRl9TRFJBTUNfU0RDRkcxX1JETEFUKHgpCSgoKHgpJjB4MDAwMDAwMEYpPDwyMCkKKyNkZWZpbmUgTUNGX1NEUkFNQ19TRENGRzFfU1dUMlJEKHgpCSgoKHgpJjB4MDAwMDAwMDcpPDwyNCkKKyNkZWZpbmUgTUNGX1NEUkFNQ19TRENGRzFfU1JEMlJXKHgpCSgoKHgpJjB4MDAwMDAwMEYpPDwyOCkKKworLyogQml0IGRlZmluaXRpb25zIGFuZCBtYWNyb3MgZm9yIE1DRl9TRFJBTUNfU0RDRkcyICovCisjZGVmaW5lIE1DRl9TRFJBTUNfU0RDRkcyX0JMKHgpCQkoKCh4KSYweDAwMDAwMDBGKTw8MTYpCisjZGVmaW5lIE1DRl9TRFJBTUNfU0RDRkcyX0JSRDJXVCh4KQkoKCh4KSYweDAwMDAwMDBGKTw8MjApCisjZGVmaW5lIE1DRl9TRFJBTUNfU0RDRkcyX0JXVDJSVyh4KQkoKCh4KSYweDAwMDAwMDBGKTw8MjQpCisjZGVmaW5lIE1DRl9TRFJBTUNfU0RDRkcyX0JSRDJQUkUoeCkJKCgoeCkmMHgwMDAwMDAwRik8PDI4KQorCisvKiBEZXZpY2UgRXJyYXRhIC0gTElNUCBtb2RlIHdvcmsgYXJvdW5kICovCisjZGVmaW5lIE1DRl9TRFJBTUNfUkVGUkVTSAkJKDB4NDAwMDAwMDApCisKKy8qIEJpdCBkZWZpbml0aW9ucyBhbmQgbWFjcm9zIGZvciBNQ0ZfU0RSQU1DX1NERFMgKi8KKyNkZWZpbmUgTUNGX1NEUkFNQ19TRERTX1NCX0QoeCkJCSgoKHgpJjB4MDAwMDAwMDMpPDwwKQorI2RlZmluZSBNQ0ZfU0RSQU1DX1NERFNfU0JfUyh4KQkJKCgoeCkmMHgwMDAwMDAwMyk8PDIpCisjZGVmaW5lIE1DRl9TRFJBTUNfU0REU19TQl9BKHgpCQkoKCh4KSYweDAwMDAwMDAzKTw8NCkKKyNkZWZpbmUgTUNGX1NEUkFNQ19TRERTX1NCX0MoeCkJCSgoKHgpJjB4MDAwMDAwMDMpPDw2KQorI2RlZmluZSBNQ0ZfU0RSQU1DX1NERFNfU0JfRSh4KQkJKCgoeCkmMHgwMDAwMDAwMyk8PDgpCisKKy8qIEJpdCBkZWZpbml0aW9ucyBhbmQgbWFjcm9zIGZvciBNQ0ZfU0RSQU1DX1NEQ1MgKi8KKyNkZWZpbmUgTUNGX1NEUkFNQ19TRENTX0NTU1ooeCkJCSgoKHgpJjB4MDAwMDAwMUYpPDwwKQorI2RlZmluZSBNQ0ZfU0RSQU1DX1NEQ1NfQkFTRSh4KQkJKCgoeCkmMHgwMDAwMEZGRik8PDIwKQorI2RlZmluZSBNQ0ZfU0RSQU1DX1NEQ1NfQkEoeCkJCSgoeCkmMHhGRkYwMDAwMCkKKyNkZWZpbmUgTUNGX1NEUkFNQ19TRENTX0NTU1pfRElBQkxFCSgweDAwMDAwMDAwKQorI2RlZmluZSBNQ0ZfU0RSQU1DX1NEQ1NfQ1NTWl8xTUJZVEUJKDB4MDAwMDAwMTMpCisjZGVmaW5lIE1DRl9TRFJBTUNfU0RDU19DU1NaXzJNQllURQkoMHgwMDAwMDAxNCkKKyNkZWZpbmUgTUNGX1NEUkFNQ19TRENTX0NTU1pfNE1CWVRFCSgweDAwMDAwMDE1KQorI2RlZmluZSBNQ0ZfU0RSQU1DX1NEQ1NfQ1NTWl84TUJZVEUJKDB4MDAwMDAwMTYpCisjZGVmaW5lIE1DRl9TRFJBTUNfU0RDU19DU1NaXzE2TUJZVEUJKDB4MDAwMDAwMTcpCisjZGVmaW5lIE1DRl9TRFJBTUNfU0RDU19DU1NaXzMyTUJZVEUJKDB4MDAwMDAwMTgpCisjZGVmaW5lIE1DRl9TRFJBTUNfU0RDU19DU1NaXzY0TUJZVEUJKDB4MDAwMDAwMTkpCisjZGVmaW5lIE1DRl9TRFJBTUNfU0RDU19DU1NaXzEyOE1CWVRFCSgweDAwMDAwMDFBKQorI2RlZmluZSBNQ0ZfU0RSQU1DX1NEQ1NfQ1NTWl8yNTZNQllURQkoMHgwMDAwMDAxQikKKyNkZWZpbmUgTUNGX1NEUkFNQ19TRENTX0NTU1pfNTEyTUJZVEUJKDB4MDAwMDAwMUMpCisjZGVmaW5lIE1DRl9TRFJBTUNfU0RDU19DU1NaXzFHQllURQkoMHgwMDAwMDAxRCkKKyNkZWZpbmUgTUNGX1NEUkFNQ19TRENTX0NTU1pfMkdCWVRFCSgweDAwMDAwMDFFKQorI2RlZmluZSBNQ0ZfU0RSQU1DX1NEQ1NfQ1NTWl80R0JZVEUJKDB4MDAwMDAwMUYpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgICAgIEZsZXhDQU4gbW9kdWxlIHJlZ2lzdGVycworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIE1DRl9GTEVYQ0FOX0JBU0VBRERSKHgpCQkoMHhGQzAyMDAwMCsoeCkqMHgwODAwKQorI2RlZmluZSBNQ0ZfRkxFWENBTl9DQU5NQ1IoeCkJCU1DRl9SRUczMigweEZDMDIwMDAwKyh4KSoweDA4MDArMHgwMCkKKyNkZWZpbmUgTUNGX0ZMRVhDQU5fQ0FOQ1RSTCh4KQkJTUNGX1JFRzMyKDB4RkMwMjAwMDArKHgpKjB4MDgwMCsweDA0KQorI2RlZmluZSBNQ0ZfRkxFWENBTl9USU1FUih4KQkJTUNGX1JFRzMyKDB4RkMwMjAwMDArKHgpKjB4MDgwMCsweDA4KQorI2RlZmluZSBNQ0ZfRkxFWENBTl9SWEdNQVNLKHgpCQlNQ0ZfUkVHMzIoMHhGQzAyMDAwMCsoeCkqMHgwODAwKzB4MTApCisjZGVmaW5lIE1DRl9GTEVYQ0FOX1JYMTRNQVNLKHgpCQlNQ0ZfUkVHMzIoMHhGQzAyMDAwMCsoeCkqMHgwODAwKzB4MTQpCisjZGVmaW5lIE1DRl9GTEVYQ0FOX1JYMTVNQVNLKHgpCQlNQ0ZfUkVHMzIoMHhGQzAyMDAwMCsoeCkqMHgwODAwKzB4MTgpCisjZGVmaW5lIE1DRl9GTEVYQ0FOX0VSUkNOVCh4KQkJTUNGX1JFRzMyKDB4RkMwMjAwMDArKHgpKjB4MDgwMCsweDFDKQorI2RlZmluZSBNQ0ZfRkxFWENBTl9FUlJTVEFUKHgpCQlNQ0ZfUkVHMzIoMHhGQzAyMDAwMCsoeCkqMHgwODAwKzB4MjApCisjZGVmaW5lIE1DRl9GTEVYQ0FOX0lNQVNLKHgpCQlNQ0ZfUkVHMzIoMHhGQzAyMDAwMCsoeCkqMHgwODAwKzB4MjgpCisjZGVmaW5lIE1DRl9GTEVYQ0FOX0lGTEFHKHgpCQlNQ0ZfUkVHMzIoMHhGQzAyMDAwMCsoeCkqMHgwODAwKzB4MzApCisKKyNkZWZpbmUgTUNGX0ZMRVhDQU5fTUJfQ05UKHgseSkJCU1DRl9SRUczMigweEZDMDIwMDgwKyh4KSoweDA4MDArKHkpKjB4MTArMHgwKQorI2RlZmluZSBNQ0ZfRkxFWENBTl9NQl9JRCh4LHkpCQlNQ0ZfUkVHMzIoMHhGQzAyMDA4MCsoeCkqMHgwODAwKyh5KSoweDEwKzB4NCkKKyNkZWZpbmUgTUNGX0ZMRVhDQU5fTUJfREIoeCx5LHopCU1DRl9SRUcwOCgweEZDMDIwMDgwKyh4KSoweDA4MDArKHkpKjB4MTArMHg4Kyh6KSoweDEpCisKKy8qCisgKiAgICAgIEZsZXhDQU4gTW9kdWxlIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIKKyAqLworI2RlZmluZSBDQU5NQ1JfTURJUwkJKDB4ODAwMDAwMDApCisjZGVmaW5lIENBTk1DUl9GUloJCSgweDQwMDAwMDAwKQorI2RlZmluZSBDQU5NQ1JfSEFMVAkJKDB4MTAwMDAwMDApCisjZGVmaW5lIENBTk1DUl9TT0ZUUlNUCQkoMHgwMjAwMDAwMCkKKyNkZWZpbmUgQ0FOTUNSX0ZSWkFDSwkJKDB4MDEwMDAwMDApCisjZGVmaW5lIENBTk1DUl9TVVBWCQkoMHgwMDgwMDAwMCkKKyNkZWZpbmUgQ0FOTUNSX01BWE1CKHgpICAgICAgICAgKCh4KSYweDBGKQorCisvKgorICogICAgICBGbGV4Q0FOIENvbnRyb2wgUmVnaXN0ZXIKKyAqLworI2RlZmluZSBDQU5DVFJMX1BSRVNESVYoeCkgICAgICAoKCh4KSYweEZGKTw8MjQpCisjZGVmaW5lIENBTkNUUkxfUkpXKHgpICAgICAgICAgICgoKHgpJjB4MDMpPDwyMikKKyNkZWZpbmUgQ0FOQ1RSTF9QU0VHMSh4KSAgICAgICAgKCgoeCkmMHgwNyk8PDE5KQorI2RlZmluZSBDQU5DVFJMX1BTRUcyKHgpICAgICAgICAoKCh4KSYweDA3KTw8MTYpCisjZGVmaW5lIENBTkNUUkxfQk9GRk1TSyAgICAgICAgICgweDAwMDA4MDAwKQorI2RlZmluZSBDQU5DVFJMX0VSUk1TSwkgICAgICAgICgweDAwMDA0MDAwKQorI2RlZmluZSBDQU5DVFJMX0NMS1NSQwkJKDB4MDAwMDIwMDApCisjZGVmaW5lIENBTkNUUkxfTFBCCSAgICAgICAgKDB4MDAwMDEwMDApCisjZGVmaW5lIENBTkNUUkxfU0FNUAkgICAgICAgICgweDAwMDAwMDgwKQorI2RlZmluZSBDQU5DVFJMX0JPRkZSRUMgICAgICAgICAoMHgwMDAwMDA0MCkKKyNkZWZpbmUgQ0FOQ1RSTF9UU1lOQyAgICAgICAgICAgKDB4MDAwMDAwMjApCisjZGVmaW5lIENBTkNUUkxfTEJVRiAgICAgICAgICAgICgweDAwMDAwMDEwKQorI2RlZmluZSBDQU5DVFJMX0xPTSAgICAgICAgICAgICAoMHgwMDAwMDAwOCkKKyNkZWZpbmUgQ0FOQ1RSTF9QUk9QU0VHKHgpICAgICAgKCh4KSYweDA3KQorCisvKgorICogICAgICBGbGV4Q0FOIEVycm9yIENvdW50ZXIgUmVnaXN0ZXIKKyAqLworI2RlZmluZSBFUlJDTlRfUlhFQ1RSKHgpICAgICAgICAoKCh4KSYweEZGKTw8OCkKKyNkZWZpbmUgRVJSQ05UX1RYRUNUUih4KSAgICAgICAgKCh4KSYweEZGKQorCisvKgorICogICAgICBGbGV4Q0FOIEVycm9yIGFuZCBTdGF0dXMgUmVnaXN0ZXIKKyAqLworI2RlZmluZSBFUlJTVEFUX0JJVEVSUih4KSAgICAgICAoKCh4KSYweDAzKTw8MTQpCisjZGVmaW5lIEVSUlNUQVRfQUNLRVJSICAgICAgICAgICAoMHgwMDAwMjAwMCkKKyNkZWZpbmUgRVJSU1RBVF9DUkNFUlIgICAgICAgICAgICgweDAwMDAxMDAwKQorI2RlZmluZSBFUlJTVEFUX0ZSTUVSUiAgICAgICAgICAgKDB4MDAwMDA4MDApCisjZGVmaW5lIEVSUlNUQVRfU1RGRVJSICAgICAgICAgICAoMHgwMDAwMDQwMCkKKyNkZWZpbmUgRVJSU1RBVF9UWFdSTiAgICAgICAgICAgICgweDAwMDAwMjAwKQorI2RlZmluZSBFUlJTVEFUX1JYV1JOICAgICAgICAgICAgKDB4MDAwMDAxMDApCisjZGVmaW5lIEVSUlNUQVRfSURMRSAgICAgICAgICAgICAoMHgwMDAwMDA4MCkKKyNkZWZpbmUgRVJSU1RBVF9UWFJYICAgICAgICAgICAgICgweDAwMDAwMDQwKQorI2RlZmluZSBFUlJTVEFUX0ZMVENPTkYoeCkgICAgICAgKCgoeCkmMHgwMyk8PDQpCisjZGVmaW5lIEVSUlNUQVRfQk9GRklOVCAgICAgICAgICAoMHgwMDAwMDAwNCkKKyNkZWZpbmUgRVJSU1RBVF9FUlJJTlQgICAgICAgICAgICgweDAwMDAwMDAyKQorCisvKgorICogICAgICBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlcgorICovCisjZGVmaW5lIElNQVNLX0JVRjE1TQkJKDB4ODAwMCkKKyNkZWZpbmUgSU1BU0tfQlVGMTRNCQkoMHg0MDAwKQorI2RlZmluZSBJTUFTS19CVUYxM00JCSgweDIwMDApCisjZGVmaW5lIElNQVNLX0JVRjEyTQkJKDB4MTAwMCkKKyNkZWZpbmUgSU1BU0tfQlVGMTFNCQkoMHgwODAwKQorI2RlZmluZSBJTUFTS19CVUYxME0JCSgweDA0MDApCisjZGVmaW5lIElNQVNLX0JVRjlNCQkoMHgwMjAwKQorI2RlZmluZSBJTUFTS19CVUY4TQkJKDB4MDEwMCkKKyNkZWZpbmUgSU1BU0tfQlVGN00JCSgweDAwODApCisjZGVmaW5lIElNQVNLX0JVRjZNCQkoMHgwMDQwKQorI2RlZmluZSBJTUFTS19CVUY1TQkJKDB4MDAyMCkKKyNkZWZpbmUgSU1BU0tfQlVGNE0JCSgweDAwMTApCisjZGVmaW5lIElNQVNLX0JVRjNNCQkoMHgwMDA4KQorI2RlZmluZSBJTUFTS19CVUYyTQkJKDB4MDAwNCkKKyNkZWZpbmUgSU1BU0tfQlVGMU0JCSgweDAwMDIpCisjZGVmaW5lIElNQVNLX0JVRjBNCQkoMHgwMDAxKQorI2RlZmluZSBJTUFTS19CVUZuTSh4KQkJKDB4MTw8KHgpKQorI2RlZmluZSBJTUFTS19CVUZGX0VOQUJMRV9BTEwJKDB4MTExMSkKKyNkZWZpbmUgSU1BU0tfQlVGRl9ESVNBQkxFX0FMTAkoMHgwMDAwKQorCisvKgorICogICAgICBJbnRlcnJ1cHQgRmxhZyBSZWdpc3RlcgorICovCisjZGVmaW5lIElGTEFHX0JVRjE1TQkJKDB4ODAwMCkKKyNkZWZpbmUgSUZMQUdfQlVGMTRNCQkoMHg0MDAwKQorI2RlZmluZSBJRkxBR19CVUYxM00JCSgweDIwMDApCisjZGVmaW5lIElGTEFHX0JVRjEyTQkJKDB4MTAwMCkKKyNkZWZpbmUgSUZMQUdfQlVGMTFNCQkoMHgwODAwKQorI2RlZmluZSBJRkxBR19CVUYxME0JCSgweDA0MDApCisjZGVmaW5lIElGTEFHX0JVRjlNCQkoMHgwMjAwKQorI2RlZmluZSBJRkxBR19CVUY4TQkJKDB4MDEwMCkKKyNkZWZpbmUgSUZMQUdfQlVGN00JCSgweDAwODApCisjZGVmaW5lIElGTEFHX0JVRjZNCQkoMHgwMDQwKQorI2RlZmluZSBJRkxBR19CVUY1TQkJKDB4MDAyMCkKKyNkZWZpbmUgSUZMQUdfQlVGNE0JCSgweDAwMTApCisjZGVmaW5lIElGTEFHX0JVRjNNCQkoMHgwMDA4KQorI2RlZmluZSBJRkxBR19CVUYyTQkJKDB4MDAwNCkKKyNkZWZpbmUgSUZMQUdfQlVGMU0JCSgweDAwMDIpCisjZGVmaW5lIElGTEFHX0JVRjBNCQkoMHgwMDAxKQorI2RlZmluZSBJRkxBR19CVUZGX1NFVF9BTEwJKDB4RkZGRikKKyNkZWZpbmUgSUZMQUdfQlVGRl9DTEVBUl9BTEwJKDB4MDAwMCkKKyNkZWZpbmUgSUZMQUdfQlVGbk0oeCkJCSgweDE8PCh4KSkKKworLyoKKyAqICAgICAgTWVzc2FnZSBCdWZmZXJzCisgKi8KKyNkZWZpbmUgTUJfQ05UX0NPREUoeCkJCSgoKHgpJjB4MEYpPDwyNCkKKyNkZWZpbmUgTUJfQ05UX1NSUgkJKDB4MDA0MDAwMDApCisjZGVmaW5lIE1CX0NOVF9JREUJCSgweDAwMjAwMDAwKQorI2RlZmluZSBNQl9DTlRfUlRSCQkoMHgwMDEwMDAwMCkKKyNkZWZpbmUgTUJfQ05UX0xFTkdUSCh4KQkoKCh4KSYweDBGKTw8MTYpCisjZGVmaW5lIE1CX0NOVF9USU1FU1RBTVAoeCkJKCh4KSYweEZGRkYpCisjZGVmaW5lIE1CX0lEX1NURCh4KQkJKCgoeCkmMHgwN0ZGKTw8MTgpCisjZGVmaW5lIE1CX0lEX0VYVCh4KQkJKCh4KSYweDNGRkZGKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRWRnZSBQb3J0IE1vZHVsZSAoRVBPUlQpCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogUmVnaXN0ZXIgcmVhZC93cml0ZSBtYWNyb3MgKi8KKyNkZWZpbmUgTUNGX0VQT1JUX0VQUEFSICAgICAgICAgICAgICAgIE1DRl9SRUcxNigweEZDMDk0MDAwKQorI2RlZmluZSBNQ0ZfRVBPUlRfRVBERFIgICAgICAgICAgICAgICAgTUNGX1JFRzA4KDB4RkMwOTQwMDIpCisjZGVmaW5lIE1DRl9FUE9SVF9FUElFUiAgICAgICAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA5NDAwMykKKyNkZWZpbmUgTUNGX0VQT1JUX0VQRFIgICAgICAgICAgICAgICAgIE1DRl9SRUcwOCgweEZDMDk0MDA0KQorI2RlZmluZSBNQ0ZfRVBPUlRfRVBQRFIgICAgICAgICAgICAgICAgTUNGX1JFRzA4KDB4RkMwOTQwMDUpCisjZGVmaW5lIE1DRl9FUE9SVF9FUEZSICAgICAgICAgICAgICAgICBNQ0ZfUkVHMDgoMHhGQzA5NDAwNikKKworLyogQml0IGRlZmluaXRpb25zIGFuZCBtYWNyb3MgZm9yIE1DRl9FUE9SVF9FUFBBUiAqLworI2RlZmluZSBNQ0ZfRVBPUlRfRVBQQVJfRVBQQTEoeCkgICAgICAgKCgoeCkmMHgwMDAzKTw8MikKKyNkZWZpbmUgTUNGX0VQT1JUX0VQUEFSX0VQUEEyKHgpICAgICAgICgoKHgpJjB4MDAwMyk8PDQpCisjZGVmaW5lIE1DRl9FUE9SVF9FUFBBUl9FUFBBMyh4KSAgICAgICAoKCh4KSYweDAwMDMpPDw2KQorI2RlZmluZSBNQ0ZfRVBPUlRfRVBQQVJfRVBQQTQoeCkgICAgICAgKCgoeCkmMHgwMDAzKTw8OCkKKyNkZWZpbmUgTUNGX0VQT1JUX0VQUEFSX0VQUEE1KHgpICAgICAgICgoKHgpJjB4MDAwMyk8PDEwKQorI2RlZmluZSBNQ0ZfRVBPUlRfRVBQQVJfRVBQQTYoeCkgICAgICAgKCgoeCkmMHgwMDAzKTw8MTIpCisjZGVmaW5lIE1DRl9FUE9SVF9FUFBBUl9FUFBBNyh4KSAgICAgICAoKCh4KSYweDAwMDMpPDwxNCkKKyNkZWZpbmUgTUNGX0VQT1JUX0VQUEFSX0xFVkVMICAgICAgICAgICgwKQorI2RlZmluZSBNQ0ZfRVBPUlRfRVBQQVJfUklTSU5HICAgICAgICAgKDEpCisjZGVmaW5lIE1DRl9FUE9SVF9FUFBBUl9GQUxMSU5HICAgICAgICAoMikKKyNkZWZpbmUgTUNGX0VQT1JUX0VQUEFSX0JPVEggICAgICAgICAgICgzKQorI2RlZmluZSBNQ0ZfRVBPUlRfRVBQQVJfRVBQQTdfTEVWRUwgICAgKDB4MDAwMCkKKyNkZWZpbmUgTUNGX0VQT1JUX0VQUEFSX0VQUEE3X1JJU0lORyAgICgweDQwMDApCisjZGVmaW5lIE1DRl9FUE9SVF9FUFBBUl9FUFBBN19GQUxMSU5HICAoMHg4MDAwKQorI2RlZmluZSBNQ0ZfRVBPUlRfRVBQQVJfRVBQQTdfQk9USCAgICAgKDB4QzAwMCkKKyNkZWZpbmUgTUNGX0VQT1JUX0VQUEFSX0VQUEE2X0xFVkVMICAgICgweDAwMDApCisjZGVmaW5lIE1DRl9FUE9SVF9FUFBBUl9FUFBBNl9SSVNJTkcgICAoMHgxMDAwKQorI2RlZmluZSBNQ0ZfRVBPUlRfRVBQQVJfRVBQQTZfRkFMTElORyAgKDB4MjAwMCkKKyNkZWZpbmUgTUNGX0VQT1JUX0VQUEFSX0VQUEE2X0JPVEggICAgICgweDMwMDApCisjZGVmaW5lIE1DRl9FUE9SVF9FUFBBUl9FUFBBNV9MRVZFTCAgICAoMHgwMDAwKQorI2RlZmluZSBNQ0ZfRVBPUlRfRVBQQVJfRVBQQTVfUklTSU5HICAgKDB4MDQwMCkKKyNkZWZpbmUgTUNGX0VQT1JUX0VQUEFSX0VQUEE1X0ZBTExJTkcgICgweDA4MDApCisjZGVmaW5lIE1DRl9FUE9SVF9FUFBBUl9FUFBBNV9CT1RIICAgICAoMHgwQzAwKQorI2RlZmluZSBNQ0ZfRVBPUlRfRVBQQVJfRVBQQTRfTEVWRUwgICAgKDB4MDAwMCkKKyNkZWZpbmUgTUNGX0VQT1JUX0VQUEFSX0VQUEE0X1JJU0lORyAgICgweDAxMDApCisjZGVmaW5lIE1DRl9FUE9SVF9FUFBBUl9FUFBBNF9GQUxMSU5HICAoMHgwMjAwKQorI2RlZmluZSBNQ0ZfRVBPUlRfRVBQQVJfRVBQQTRfQk9USCAgICAgKDB4MDMwMCkKKyNkZWZpbmUgTUNGX0VQT1JUX0VQUEFSX0VQUEEzX0xFVkVMICAgICgweDAwMDApCisjZGVmaW5lIE1DRl9FUE9SVF9FUFBBUl9FUFBBM19SSVNJTkcgICAoMHgwMDQwKQorI2RlZmluZSBNQ0ZfRVBPUlRfRVBQQVJfRVBQQTNfRkFMTElORyAgKDB4MDA4MCkKKyNkZWZpbmUgTUNGX0VQT1JUX0VQUEFSX0VQUEEzX0JPVEggICAgICgweDAwQzApCisjZGVmaW5lIE1DRl9FUE9SVF9FUFBBUl9FUFBBMl9MRVZFTCAgICAoMHgwMDAwKQorI2RlZmluZSBNQ0ZfRVBPUlRfRVBQQVJfRVBQQTJfUklTSU5HICAgKDB4MDAxMCkKKyNkZWZpbmUgTUNGX0VQT1JUX0VQUEFSX0VQUEEyX0ZBTExJTkcgICgweDAwMjApCisjZGVmaW5lIE1DRl9FUE9SVF9FUFBBUl9FUFBBMl9CT1RIICAgICAoMHgwMDMwKQorI2RlZmluZSBNQ0ZfRVBPUlRfRVBQQVJfRVBQQTFfTEVWRUwgICAgKDB4MDAwMCkKKyNkZWZpbmUgTUNGX0VQT1JUX0VQUEFSX0VQUEExX1JJU0lORyAgICgweDAwMDQpCisjZGVmaW5lIE1DRl9FUE9SVF9FUFBBUl9FUFBBMV9GQUxMSU5HICAoMHgwMDA4KQorI2RlZmluZSBNQ0ZfRVBPUlRfRVBQQVJfRVBQQTFfQk9USCAgICAgKDB4MDAwQykKKworLyogQml0IGRlZmluaXRpb25zIGFuZCBtYWNyb3MgZm9yIE1DRl9FUE9SVF9FUEREUiAqLworI2RlZmluZSBNQ0ZfRVBPUlRfRVBERFJfRVBERDEgICAgICAgICAgKDB4MDIpCisjZGVmaW5lIE1DRl9FUE9SVF9FUEREUl9FUEREMiAgICAgICAgICAoMHgwNCkKKyNkZWZpbmUgTUNGX0VQT1JUX0VQRERSX0VQREQzICAgICAgICAgICgweDA4KQorI2RlZmluZSBNQ0ZfRVBPUlRfRVBERFJfRVBERDQgICAgICAgICAgKDB4MTApCisjZGVmaW5lIE1DRl9FUE9SVF9FUEREUl9FUERENSAgICAgICAgICAoMHgyMCkKKyNkZWZpbmUgTUNGX0VQT1JUX0VQRERSX0VQREQ2ICAgICAgICAgICgweDQwKQorI2RlZmluZSBNQ0ZfRVBPUlRfRVBERFJfRVBERDcgICAgICAgICAgKDB4ODApCisKKy8qIEJpdCBkZWZpbml0aW9ucyBhbmQgbWFjcm9zIGZvciBNQ0ZfRVBPUlRfRVBJRVIgKi8KKyNkZWZpbmUgTUNGX0VQT1JUX0VQSUVSX0VQSUUxICAgICAgICAgICgweDAyKQorI2RlZmluZSBNQ0ZfRVBPUlRfRVBJRVJfRVBJRTIgICAgICAgICAgKDB4MDQpCisjZGVmaW5lIE1DRl9FUE9SVF9FUElFUl9FUElFMyAgICAgICAgICAoMHgwOCkKKyNkZWZpbmUgTUNGX0VQT1JUX0VQSUVSX0VQSUU0ICAgICAgICAgICgweDEwKQorI2RlZmluZSBNQ0ZfRVBPUlRfRVBJRVJfRVBJRTUgICAgICAgICAgKDB4MjApCisjZGVmaW5lIE1DRl9FUE9SVF9FUElFUl9FUElFNiAgICAgICAgICAoMHg0MCkKKyNkZWZpbmUgTUNGX0VQT1JUX0VQSUVSX0VQSUU3ICAgICAgICAgICgweDgwKQorCisvKiBCaXQgZGVmaW5pdGlvbnMgYW5kIG1hY3JvcyBmb3IgTUNGX0VQT1JUX0VQRFIgKi8KKyNkZWZpbmUgTUNGX0VQT1JUX0VQRFJfRVBEMSAgICAgICAgICAgICgweDAyKQorI2RlZmluZSBNQ0ZfRVBPUlRfRVBEUl9FUEQyICAgICAgICAgICAgKDB4MDQpCisjZGVmaW5lIE1DRl9FUE9SVF9FUERSX0VQRDMgICAgICAgICAgICAoMHgwOCkKKyNkZWZpbmUgTUNGX0VQT1JUX0VQRFJfRVBENCAgICAgICAgICAgICgweDEwKQorI2RlZmluZSBNQ0ZfRVBPUlRfRVBEUl9FUEQ1ICAgICAgICAgICAgKDB4MjApCisjZGVmaW5lIE1DRl9FUE9SVF9FUERSX0VQRDYgICAgICAgICAgICAoMHg0MCkKKyNkZWZpbmUgTUNGX0VQT1JUX0VQRFJfRVBENyAgICAgICAgICAgICgweDgwKQorCisvKiBCaXQgZGVmaW5pdGlvbnMgYW5kIG1hY3JvcyBmb3IgTUNGX0VQT1JUX0VQUERSICovCisjZGVmaW5lIE1DRl9FUE9SVF9FUFBEUl9FUFBEMSAgICAgICAgICAoMHgwMikKKyNkZWZpbmUgTUNGX0VQT1JUX0VQUERSX0VQUEQyICAgICAgICAgICgweDA0KQorI2RlZmluZSBNQ0ZfRVBPUlRfRVBQRFJfRVBQRDMgICAgICAgICAgKDB4MDgpCisjZGVmaW5lIE1DRl9FUE9SVF9FUFBEUl9FUFBENCAgICAgICAgICAoMHgxMCkKKyNkZWZpbmUgTUNGX0VQT1JUX0VQUERSX0VQUEQ1ICAgICAgICAgICgweDIwKQorI2RlZmluZSBNQ0ZfRVBPUlRfRVBQRFJfRVBQRDYgICAgICAgICAgKDB4NDApCisjZGVmaW5lIE1DRl9FUE9SVF9FUFBEUl9FUFBENyAgICAgICAgICAoMHg4MCkKKworLyogQml0IGRlZmluaXRpb25zIGFuZCBtYWNyb3MgZm9yIE1DRl9FUE9SVF9FUEZSICovCisjZGVmaW5lIE1DRl9FUE9SVF9FUEZSX0VQRjEgICAgICAgICAgICAoMHgwMikKKyNkZWZpbmUgTUNGX0VQT1JUX0VQRlJfRVBGMiAgICAgICAgICAgICgweDA0KQorI2RlZmluZSBNQ0ZfRVBPUlRfRVBGUl9FUEYzICAgICAgICAgICAgKDB4MDgpCisjZGVmaW5lIE1DRl9FUE9SVF9FUEZSX0VQRjQgICAgICAgICAgICAoMHgxMCkKKyNkZWZpbmUgTUNGX0VQT1JUX0VQRlJfRVBGNSAgICAgICAgICAgICgweDIwKQorI2RlZmluZSBNQ0ZfRVBPUlRfRVBGUl9FUEY2ICAgICAgICAgICAgKDB4NDApCisjZGVmaW5lIE1DRl9FUE9SVF9FUEZSX0VQRjcgICAgICAgICAgICAoMHg4MCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2VuZGlmCS8qIG01MzJ4c2ltX2ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGtub21tdS9tY2ZjYWNoZS5oIGIvaW5jbHVkZS9hc20tbTY4a25vbW11L21jZmNhY2hlLmgKaW5kZXggNDVkMWFjNS4uN2I2MWE4YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4a25vbW11L21jZmNhY2hlLmgKKysrIGIvaW5jbHVkZS9hc20tbTY4a25vbW11L21jZmNhY2hlLmgKQEAgLTkyLDYgKzkyLDIxIEBACiAuZW5kbQogI2VuZGlmIC8qIENPTkZJR19NNTI0OSB8fCBDT05GSUdfTTUzMDcgKi8KIAorI2lmIGRlZmluZWQoQ09ORklHX001MzJ4KQorLm1hY3JvIENBQ0hFX0VOQUJMRQorCW1vdmVsCSMweDAxMDAwMDAwLCVkMAkJLyogaW52YWxpZGF0ZSBjYWNoZSBjbWQgKi8KKwltb3ZlYwklZDAsJUNBQ1IJCS8qIGRvIGludmFsaWRhdGUgY2FjaGUgKi8KKwlub3AKKwltb3ZlbAkjMHg0MDAxQzAwMCwlZDAJCS8qIHNldCBTRFJBTSBjYWNoZWQgKHdyaXRlLXRocnUpICovCisJbW92ZWMJJWQwLCVBQ1IwCisJbW92ZWwJIzB4MDAwMDAwMDAsJWQwCQkvKiBubyBvdGhlciByZWdpb25zIGNhY2hlZCAqLworCW1vdmVjCSVkMCwlQUNSMQorCW1vdmVsCSMweDgwMDAwMjAwLCVkMAkJLyogc2V0dXAgY2FjaGUgbWFzayAqLworCW1vdmVjCSVkMCwlQ0FDUgkJLyogZW5hYmxlIGNhY2hlICovCisJbm9wCisuZW5kbQorI2VuZGlmIC8qIENPTkZJR19NNTMyeCAqLworCiAjaWYgZGVmaW5lZChDT05GSUdfTTU0MDcpCiAvKgogICoJVmVyc2lvbiA0IGNvcmVzIGhhdmUgYSB0cnVlIGhhcnZhcmQgc3R5bGUgc2VwYXJhdGUgaW5zdHJ1Y3Rpb24KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGtub21tdS9tY2ZwaXQuaCBiL2luY2x1ZGUvYXNtLW02OGtub21tdS9tY2ZwaXQuaAppbmRleCAwZDI2NzJkLi5mNTcwY2Y2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvbWNmcGl0LmgKKysrIGIvaW5jbHVkZS9hc20tbTY4a25vbW11L21jZnBpdC5oCkBAIC0yOCwxMSArMjgsOSBAQAogLyoKICAqCURlZmluZSB0aGUgUElUIHRpbWVyIHJlZ2lzdGVyIHNldCBhZGRyZXNzZXMuCiAgKi8KLXN0cnVjdCBtY2ZwaXQgewotCXVuc2lnbmVkIHNob3J0CXBjc3I7CQkJLyogUElUIGNvbnRyb2wgYW5kIHN0YXR1cyAqLwotCXVuc2lnbmVkIHNob3J0CXBtcjsJCQkvKiBQSVQgbW9kdWx1cyByZWdpc3RlciAqLwotCXVuc2lnbmVkIHNob3J0CXBjbnRyOwkJCS8qIFBJVCBjb3VudCByZWdpc3RlciAqLwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKyNkZWZpbmUJTUNGUElUX1BDU1IJCTB4MAkJLyogUElUIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJTUNGUElUX1BNUgkJMHgyCQkvKiBQSVQgbW9kdWx1cyByZWdpc3RlciAqLworI2RlZmluZQlNQ0ZQSVRfUENOVFIJCTB4NAkJLyogUElUIGNvdW50IHJlZ2lzdGVyICovCiAKIC8qCiAgKglCaXQgZGVmaW5pdGlvbnMgZm9yIHRoZSBQSVQgQ29udHJvbCBhbmQgU3RhdHVzIHJlZ2lzdGVyLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4a25vbW11L21jZnNpbS5oIGIvaW5jbHVkZS9hc20tbTY4a25vbW11L21jZnNpbS5oCmluZGV4IDk3YTBjMjcuLjEwNzRhZTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW02OGtub21tdS9tY2ZzaW0uaAorKysgYi9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvbWNmc2ltLmgKQEAgLTM1LDYgKzM1LDggQEAKICNpbmNsdWRlIDxhc20vbTUyOHhzaW0uaD4KICNlbGlmIGRlZmluZWQoQ09ORklHX001MzA3KQogI2luY2x1ZGUgPGFzbS9tNTMwN3NpbS5oPgorI2VsaWYgZGVmaW5lZChDT05GSUdfTTUzMngpCisjaW5jbHVkZSA8YXNtL201MzJ4c2ltLmg+CiAjZWxpZiBkZWZpbmVkKENPTkZJR19NNTQwNykKICNpbmNsdWRlIDxhc20vbTU0MDdzaW0uaD4KICNlbmRpZgpAQCAtMTAwLDYgKzEwMiw3IEBACiAjZGVmaW5lCU1DRlNJTV9JTVJfTUFTS0FMTAkweDNmZmUJCS8qIEFsbCBpbnRyIHNvdXJjZXMgKi8KICNlbmRpZgogCisKIC8qCiAgKglQSVQgaW50ZXJydXB0IHNldHRpbmdzLCBpZiBub3QgZm91bmQgaW4gbVhYWFhzaW0uaCBmaWxlLgogICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvbWNmdGltZXIuaCBiL2luY2x1ZGUvYXNtLW02OGtub21tdS9tY2Z0aW1lci5oCmluZGV4IDY4YmYzM2EuLjZmNGQ3OTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW02OGtub21tdS9tY2Z0aW1lci5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGtub21tdS9tY2Z0aW1lci5oCkBAIC0zLDcgKzMsNyBAQAogLyoKICAqCW1jZnRpbWVyLmggLS0gQ29sZEZpcmUgaW50ZXJuYWwgVElNRVIgc3VwcG9ydCBkZWZpbmVzLgogICoKLSAqCShDKSBDb3B5cmlnaHQgMTk5OS0yMDAyLCBHcmVnIFVuZ2VyZXIgKGdlcmdAc25hcGdlYXIuY29tKQorICoJKEMpIENvcHlyaWdodCAxOTk5LTIwMDYsIEdyZWcgVW5nZXJlciA8Z2VyZ0BzbmFwZ2Vhci5jb20+CiAgKiAJKEMpIENvcHlyaWdodCAyMDAwLCBMaW5lbyBJbmMuICh3d3cubGluZW8uY29tKSAKICAqLwogCkBAIC0yNyw2ICsyNywxMSBAQAogI2VsaWYgZGVmaW5lZChDT05GSUdfTTUyNDkpIHx8IGRlZmluZWQoQ09ORklHX001MzA3KSB8fCBkZWZpbmVkKENPTkZJR19NNTQwNykKICNkZWZpbmUgTUNGVElNRVJfQkFTRTEJCTB4MTQwICAgICAgICAgICAvKiBCYXNlIGFkZHJlc3Mgb2YgVElNRVIxICovCiAjZGVmaW5lIE1DRlRJTUVSX0JBU0UyCQkweDE4MCAgICAgICAgICAgLyogQmFzZSBhZGRyZXNzIG9mIFRJTUVSMiAqLworI2VsaWYgZGVmaW5lZChDT05GSUdfTTUzMngpCisjZGVmaW5lIE1DRlRJTUVSX0JBU0UxCQkweGZjMDcwMDAwCS8qIEJhc2UgYWRkcmVzcyBvZiBUSU1FUjEgKi8KKyNkZWZpbmUgTUNGVElNRVJfQkFTRTIJCTB4ZmMwNzQwMDAJLyogQmFzZSBhZGRyZXNzIG9mIFRJTUVSMiAqLworI2RlZmluZSBNQ0ZUSU1FUl9CQVNFMwkJMHhmYzA3ODAwMAkvKiBCYXNlIGFkZHJlc3Mgb2YgVElNRVIzICovCisjZGVmaW5lIE1DRlRJTUVSX0JBU0U0CQkweGZjMDdjMDAwCS8qIEJhc2UgYWRkcmVzcyBvZiBUSU1FUjQgKi8KICNlbmRpZgogCiAKQEAgLTM0LDIzICszOSwxNCBAQAogICoJRGVmaW5lIHRoZSBUSU1FUiByZWdpc3RlciBzZXQgYWRkcmVzc2VzLgogICovCiAjZGVmaW5lCU1DRlRJTUVSX1RNUgkJMHgwMAkJLyogVGltZXIgTW9kZSByZWcgKHIvdykgKi8KLSNkZWZpbmUJTUNGVElNRVJfVFJSCQkweDAyCQkvKiBUaW1lciBSZWZlcmVuY2UgKHIvdykgKi8KLSNkZWZpbmUJTUNGVElNRVJfVENSCQkweDA0CQkvKiBUaW1lciBDYXB0dXJlIHJlZyAoci93KSAqLwotI2RlZmluZQlNQ0ZUSU1FUl9UQ04JCTB4MDYJCS8qIFRpbWVyIENvdW50ZXIgcmVnIChyL3cpICovCisjZGVmaW5lCU1DRlRJTUVSX1RSUgkJMHgwNAkJLyogVGltZXIgUmVmZXJlbmNlIChyL3cpICovCisjZGVmaW5lCU1DRlRJTUVSX1RDUgkJMHgwOAkJLyogVGltZXIgQ2FwdHVyZSByZWcgKHIvdykgKi8KKyNkZWZpbmUJTUNGVElNRVJfVENOCQkweDBDCQkvKiBUaW1lciBDb3VudGVyIHJlZyAoci93KSAqLworI2lmIGRlZmluZWQoQ09ORklHX001MzJ4KQorI2RlZmluZQlNQ0ZUSU1FUl9URVIJCTB4MDMJCS8qIFRpbWVyIEV2ZW50IHJlZyAoci93KSAqLworI2Vsc2UKICNkZWZpbmUJTUNGVElNRVJfVEVSCQkweDExCQkvKiBUaW1lciBFdmVudCByZWcgKHIvdykgKi8KLQotc3RydWN0IG1jZnRpbWVyIHsKLQl1bnNpZ25lZCBzaG9ydAl0bXI7CQkJLyogVGltZXIgTW9kZSByZWcgKHIvdykgKi8KLQl1bnNpZ25lZCBzaG9ydAlyZXNlcnZlZDE7Ci0JdW5zaWduZWQgc2hvcnQJdHJyOwkJCS8qIFRpbWVyIFJlZmVyZW5jZSAoci93KSAqLwotCXVuc2lnbmVkIHNob3J0CXJlc2VydmVkMjsKLQl1bnNpZ25lZCBzaG9ydAl0Y3I7CQkJLyogVGltZXIgQ2FwdHVyZSByZWcgKHIvdykgKi8KLQl1bnNpZ25lZCBzaG9ydAlyZXNlcnZlZDM7Ci0JdW5zaWduZWQgc2hvcnQJdGNuOwkJCS8qIFRpbWVyIENvdW50ZXIgcmVnIChyL3cpICovCi0JdW5zaWduZWQgc2hvcnQJcmVzZXJ2ZWQ0OwotCXVuc2lnbmVkIGNoYXIJcmVzZXJ2ZWQ1OwotCXVuc2lnbmVkIGNoYXIJdGVyOwkJCS8qIFRpbWVyIEV2ZW50IHJlZyAoci93KSAqLwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKyNlbmRpZgogCiAvKgogICoJQml0IGRlZmluaXRpb25zIGZvciB0aGUgVGltZXIgTW9kZSBSZWdpc3RlciAoVE1SKS4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGtub21tdS9tY2Z1YXJ0LmggYi9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvbWNmdWFydC5oCmluZGV4IDgwNDBlNDMuLmRjMDE0NmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW02OGtub21tdS9tY2Z1YXJ0LmgKKysrIGIvaW5jbHVkZS9hc20tbTY4a25vbW11L21jZnVhcnQuaApAQCAtNDQsNiArNDQsMTAgQEAKICNkZWZpbmUgTUNGVUFSVF9CQVNFMQkJMHg2MDAwMAkJLyogQmFzZSBhZGRyZXNzIG9mIFVBUlQxICovCiAjZGVmaW5lIE1DRlVBUlRfQkFTRTIJCTB4NjQwMDAJCS8qIEJhc2UgYWRkcmVzcyBvZiBVQVJUMiAqLwogI2RlZmluZSBNQ0ZVQVJUX0JBU0UzCQkweDY4MDAwCQkvKiBCYXNlIGFkZHJlc3Mgb2YgVUFSVDIgKi8KKyNlbGlmIGRlZmluZWQoQ09ORklHX001MzJ4KQorI2RlZmluZSBNQ0ZVQVJUX0JBU0UxCQkweGZjMDYwMDAwCS8qIEJhc2UgYWRkcmVzcyBvZiBVQVJUMSAqLworI2RlZmluZSBNQ0ZVQVJUX0JBU0UyCQkweGZjMDY0MDAwCS8qIEJhc2UgYWRkcmVzcyBvZiBVQVJUMiAqLworI2RlZmluZSBNQ0ZVQVJUX0JBU0UzCQkweGZjMDY4MDAwCS8qIEJhc2UgYWRkcmVzcyBvZiBVQVJUMyAqLwogI2VuZGlmCiAKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4a25vbW11L3BhZ2Vfb2Zmc2V0LmggYi9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvcGFnZV9vZmZzZXQuaAppbmRleCA4ZWQ2ZDdiLi5kNGU3M2UwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvcGFnZV9vZmZzZXQuaAorKysgYi9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvcGFnZV9vZmZzZXQuaApAQCAtMSw0NiArMSw1IEBACiAKIAogLyogVGhpcyBoYW5kbGVzIHRoZSBtZW1vcnkgbWFwLi4gKi8KLQotI2lmZGVmIENPTkZJR19DT0xERklSRQotI2lmIGRlZmluZWQoQ09ORklHX1NNQUxMKQotI2RlZmluZSBQQUdFX09GRlNFVF9SQVcJCTB4MzAwMjAwMDAKLSNlbGlmIGRlZmluZWQoQ09ORklHX0NGVjI0MCkKLSNkZWZpbmUgUEFHRV9PRkZTRVRfUkFXCQkweDAyMDAwMDAwCi0jZWxzZQotI2RlZmluZSBQQUdFX09GRlNFVF9SQVcJCTB4MDAwMDAwMDAKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfTTY4MzYwCi0jZGVmaW5lIFBBR0VfT0ZGU0VUX1JBVyAgICAgMHgwMDAwMDAwMAotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfUElMT1QKLSNpZmRlZiBDT05GSUdfTTY4MzI4Ci0jZGVmaW5lIFBBR0VfT0ZGU0VUX1JBVwkJMHgxMDAwMDAwMAotI2VuZGlmCi0jaWZkZWYgQ09ORklHX002OEVaMzI4Ci0jZGVmaW5lIFBBR0VfT0ZGU0VUX1JBVwkJMHgwMDAwMDAwMAotI2VuZGlmCi0jZW5kaWYKLSNpZmRlZiBDT05GSUdfVUNTSU1NCi0jZGVmaW5lIFBBR0VfT0ZGU0VUX1JBVwkJMHgwMDAwMDAwMAotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKENPTkZJR19VQ0RJTU0pIHx8IGRlZmluZWQoQ09ORklHX0RSQUdFTjIpCi0jaWZkZWYgQ09ORklHX002OFZaMzI4IAotI2RlZmluZSBQQUdFX09GRlNFVF9SQVcJCTB4MDAwMDAwMDAKLSNlbmRpZiAvKiBDT05GSUdfTTY4VlozMjggKi8KLSNlbmRpZiAvKiBDT05GSUdfVUNESU1NICovCi0KLSNpZmRlZiBDT05GSUdfTTY4RVozMjhBRFMKLSNkZWZpbmUgUEFHRV9PRkZTRVRfUkFXCQkweDAwMDAwMDAwCi0jZW5kaWYKLSNpZmRlZiBDT05GSUdfQUxNQV9BTlMKLSNkZWZpbmUgUEFHRV9PRkZTRVRfUkFXCQkweDAwMDAwMDAwCi0jZW5kaWYKLSNpZmRlZiBDT05GSUdfTTY4RU4zMDIKLSNkZWZpbmUgUEFHRV9PRkZTRVRfUkFXCQkweDAwMDAwMDAwCi0jZW5kaWYKKyNkZWZpbmUJUEFHRV9PRkZTRVRfUkFXCQlDT05GSUdfUkFNQkFTRQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvcHJvY2Vzc29yLmggYi9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvcHJvY2Vzc29yLmgKaW5kZXggMjc4YjAwYi4uMGVlMTU4ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4a25vbW11L3Byb2Nlc3Nvci5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGtub21tdS9wcm9jZXNzb3IuaApAQCAtNzgsMTkgKzc4LDMxIEBACiB9CiAKIC8qCisgKiBDb2xkZmlyZSBzdGFja3MgbmVlZCB0byBiZSByZS1hbGlnbmVkIG9uIHRyYXAgZXhpdCwgY29udmVudGlvbmFsCisgKiA2OGsgY2FuIGhhbmRsZSB0aGlzIGNhc2UgY2xlYW5seS4KKyAqLworI2lmIGRlZmluZWQoQ09ORklHX0NPTERGSVJFKQorI2RlZmluZQlyZWZvcm1hdChfcmVncykJCWRvIHsgKF9yZWdzKS0+Zm9ybWF0ID0gMHg0OyB9IHdoaWxlKDApCisjZWxzZQorI2RlZmluZQlyZWZvcm1hdChfcmVncykJCWRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisvKgogICogRG8gbmVjZXNzYXJ5IHNldHVwIHRvIHN0YXJ0IHVwIGEgbmV3bHkgZXhlY3V0ZWQgdGhyZWFkLgogICoKICAqIHBhc3MgdGhlIGRhdGEgc2VnbWVudCBpbnRvIHVzZXIgcHJvZ3JhbXMgaWYgaXQgZXhpc3RzLAogICogaXQgY2FuJ3QgaHVydCBhbnl0aGluZyBhcyBmYXIgYXMgSSBjYW4gdGVsbAogICovCi0jZGVmaW5lIHN0YXJ0X3RocmVhZChfcmVncywgX3BjLCBfdXNwKSAgICAgICAgICAgXAotZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlzZXRfZnMoVVNFUl9EUyk7IC8qIHJlYWRzIGZyb20gdXNlciBzcGFjZSAqLyBcCi0JKF9yZWdzKS0+cGMgPSAoX3BjKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAotCWlmIChjdXJyZW50LT5tbSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJKF9yZWdzKS0+ZDUgPSBjdXJyZW50LT5tbS0+c3RhcnRfZGF0YTsgICBcCi0JKF9yZWdzKS0+c3IgJj0gfjB4MjAwMDsgICAgICAgICAgICAgICAgICAgICAgXAotCXdydXNwKF91c3ApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyNkZWZpbmUgc3RhcnRfdGhyZWFkKF9yZWdzLCBfcGMsIF91c3ApCQkJXAorZG8gewkJCQkJCQlcCisJc2V0X2ZzKFVTRVJfRFMpOyAvKiByZWFkcyBmcm9tIHVzZXIgc3BhY2UgKi8JXAorCShfcmVncyktPnBjID0gKF9wYyk7CQkJCVwKKwkoKHN0cnVjdCBzd2l0Y2hfc3RhY2sgKikoX3JlZ3MpKVstMV0uYTYgPSAwOwlcCisJcmVmb3JtYXQoX3JlZ3MpOwkJCQlcCisJaWYgKGN1cnJlbnQtPm1tKQkJCQlcCisJCShfcmVncyktPmQ1ID0gY3VycmVudC0+bW0tPnN0YXJ0X2RhdGE7CVwKKwkoX3JlZ3MpLT5zciAmPSB+MHgyMDAwOwkJCQlcCisJd3J1c3AoX3VzcCk7CQkJCQlcCiB9IHdoaWxlKDApCiAKIC8qIEZvcndhcmQgZGVjbGFyYXRpb24sIGEgc3RyYW5nZSBDIHRoaW5nICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2NvbXBhdC5oIGIvaW5jbHVkZS9hc20tbWlwcy9jb21wYXQuaAppbmRleCA5ODY1MTFkLi45MDBmNDcyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL2NvbXBhdC5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvY29tcGF0LmgKQEAgLTE0NSw4ICsxNDUsNSBAQAogCiAJcmV0dXJuICh2b2lkIF9fdXNlciAqKSAocmVncy0+cmVnc1syOV0gLSBsZW4pOwogfQotI2lmIGRlZmluZWQgKF9fTUlQU0VMX18pCi0jZGVmaW5lIF9fQ09NUEFUX0VORElBTl9TV0FQX18gCTEKLSNlbmRpZgogCiAjZW5kaWYgLyogX0FTTV9DT01QQVRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWdlbmVyaWMvZmxvcHB5LmggYi9pbmNsdWRlL2FzbS1taXBzL21hY2gtZ2VuZXJpYy9mbG9wcHkuaAppbmRleCA2ODJhNTg1Li44M2NkNjllIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtZ2VuZXJpYy9mbG9wcHkuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL21hY2gtZ2VuZXJpYy9mbG9wcHkuaApAQCAtOTgsNyArOTgsNyBAQAogc3RhdGljIGlubGluZSBpbnQgZmRfcmVxdWVzdF9pcnEodm9pZCkKIHsKIAlyZXR1cm4gcmVxdWVzdF9pcnEoRkxPUFBZX0lSUSwgZmxvcHB5X2ludGVycnVwdCwKLQkgICAgICAgICAgICAgICAgICAgU0FfSU5URVJSVVBUIHwgU0FfU0FNUExFX1JBTkRPTSwgImZsb3BweSIsIE5VTEwpOworCSAgICAgICAgICAgICAgICAgICBTQV9JTlRFUlJVUFQsICJmbG9wcHkiLCBOVUxMKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGZkX2ZyZWVfaXJxKHZvaWQpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtamF6ei9mbG9wcHkuaCBiL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1qYXp6L2Zsb3BweS5oCmluZGV4IGM5ZGFkOTkuLjk0MTMxMTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1qYXp6L2Zsb3BweS5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1qYXp6L2Zsb3BweS5oCkBAIC05MCw3ICs5MCw3IEBACiBzdGF0aWMgaW5saW5lIGludCBmZF9yZXF1ZXN0X2lycSh2b2lkKQogewogCXJldHVybiByZXF1ZXN0X2lycShGTE9QUFlfSVJRLCBmbG9wcHlfaW50ZXJydXB0LAotCSAgICAgICAgICAgICAgICAgICBTQV9JTlRFUlJVUFQgfCBTQV9TQU1QTEVfUkFORE9NLCAiZmxvcHB5IiwgTlVMTCk7CisJICAgICAgICAgICAgICAgICAgIFNBX0lOVEVSUlVQVCwgImZsb3BweSIsIE5VTEwpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgZmRfZnJlZV9pcnEodm9pZCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBhcmlzYy9mbG9wcHkuaCBiL2luY2x1ZGUvYXNtLXBhcmlzYy9mbG9wcHkuaAppbmRleCBjYTNhZWQ3Li40NThjZGIyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wYXJpc2MvZmxvcHB5LmgKKysrIGIvaW5jbHVkZS9hc20tcGFyaXNjL2Zsb3BweS5oCkBAIC0xNTksMTAgKzE1OSw4IEBACiAJCXJldHVybiByZXF1ZXN0X2lycShGTE9QUFlfSVJRLCBmbG9wcHlfaGFyZGludCxTQV9JTlRFUlJVUFQsCiAJCQkJCQkgICAiZmxvcHB5IiwgTlVMTCk7CiAJZWxzZQotCQlyZXR1cm4gcmVxdWVzdF9pcnEoRkxPUFBZX0lSUSwgZmxvcHB5X2ludGVycnVwdCwKLQkJCQkJCSAgIFNBX0lOVEVSUlVQVHxTQV9TQU1QTEVfUkFORE9NLAotCQkJCQkJICAgImZsb3BweSIsIE5VTEwpOwkKLQorCQlyZXR1cm4gcmVxdWVzdF9pcnEoRkxPUFBZX0lSUSwgZmxvcHB5X2ludGVycnVwdCwgU0FfSU5URVJSVVBULAorCQkJCSAgICJmbG9wcHkiLCBOVUxMKTsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgZG1hX21lbV9hbGxvYyh1bnNpZ25lZCBsb25nIHNpemUpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2JhY2tsaWdodC5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9iYWNrbGlnaHQuaAppbmRleCAxYmExZjI3Li5hNWU5ZTY1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2JhY2tsaWdodC5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvYmFja2xpZ2h0LmgKQEAgLTIsMzAgKzIsMzAgQEAKICAqIFJvdXRpbmVzIGZvciBoYW5kbGluZyBiYWNrbGlnaHQgY29udHJvbCBvbiBQb3dlckJvb2tzCiAgKgogICogRm9yIG5vdywgaW1wbGVtZW50YXRpb24gcmVzaWRlcyBpbgotICogYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9wbWFjX3N1cHBvcnQuYworICogYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9iYWNrbGlnaHQuYwogICoKICAqLwogI2lmbmRlZiBfX0FTTV9QT1dFUlBDX0JBQ0tMSUdIVF9ICiAjZGVmaW5lIF9fQVNNX1BPV0VSUENfQkFDS0xJR0hUX0gKICNpZmRlZiBfX0tFUk5FTF9fCiAKLS8qIEFic3RyYWN0IHZhbHVlcyAqLwotI2RlZmluZSBCQUNLTElHSFRfT0ZGCTAKLSNkZWZpbmUgQkFDS0xJR0hUX01JTgkxCi0jZGVmaW5lIEJBQ0tMSUdIVF9NQVgJMHhmCisjaW5jbHVkZSA8bGludXgvZmIuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogCi1zdHJ1Y3QgYmFja2xpZ2h0X2NvbnRyb2xsZXIgewotCWludCAoKnNldF9lbmFibGUpKGludCBlbmFibGUsIGludCBsZXZlbCwgdm9pZCAqZGF0YSk7Ci0JaW50ICgqc2V0X2xldmVsKShpbnQgbGV2ZWwsIHZvaWQgKmRhdGEpOwotfTsKKy8qIEZvciBsb2NraW5nIGluc3RydWN0aW9ucywgc2VlIHRoZSBpbXBsZW1lbnRhdGlvbiBmaWxlICovCitleHRlcm4gc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKnBtYWNfYmFja2xpZ2h0OworZXh0ZXJuIHN0cnVjdCBtdXRleCBwbWFjX2JhY2tsaWdodF9tdXRleDsKIAotZXh0ZXJuIHZvaWQgcmVnaXN0ZXJfYmFja2xpZ2h0X2NvbnRyb2xsZXIoc3RydWN0IGJhY2tsaWdodF9jb250cm9sbGVyICpjdHJsZXIsIHZvaWQgKmRhdGEsIGNoYXIgKnR5cGUpOwotZXh0ZXJuIHZvaWQgdW5yZWdpc3Rlcl9iYWNrbGlnaHRfY29udHJvbGxlcihzdHJ1Y3QgYmFja2xpZ2h0X2NvbnRyb2xsZXIgKmN0cmxlciwgdm9pZCAqZGF0YSk7CitleHRlcm4gdm9pZCBwbWFjX2JhY2tsaWdodF9jYWxjX2N1cnZlKHN0cnVjdCBmYl9pbmZvKik7CitleHRlcm4gaW50IHBtYWNfYmFja2xpZ2h0X2N1cnZlX2xvb2t1cChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgaW50IHZhbHVlKTsKIAotZXh0ZXJuIGludCBzZXRfYmFja2xpZ2h0X2VuYWJsZShpbnQgZW5hYmxlKTsKLWV4dGVybiBpbnQgZ2V0X2JhY2tsaWdodF9lbmFibGUodm9pZCk7Ci1leHRlcm4gaW50IHNldF9iYWNrbGlnaHRfbGV2ZWwoaW50IGxldmVsKTsKLWV4dGVybiBpbnQgZ2V0X2JhY2tsaWdodF9sZXZlbCh2b2lkKTsKK2V4dGVybiBpbnQgcG1hY19oYXNfYmFja2xpZ2h0X3R5cGUoY29uc3QgY2hhciAqdHlwZSk7CisKK2V4dGVybiB2b2lkIHBtYWNfYmFja2xpZ2h0X2tleV91cCh2b2lkKTsKK2V4dGVybiB2b2lkIHBtYWNfYmFja2xpZ2h0X2tleV9kb3duKHZvaWQpOworCitleHRlcm4gaW50IHBtYWNfYmFja2xpZ2h0X3NldF9sZWdhY3lfYnJpZ2h0bmVzcyhpbnQgYnJpZ2h0bmVzcyk7CitleHRlcm4gaW50IHBtYWNfYmFja2xpZ2h0X2dldF9sZWdhY3lfYnJpZ2h0bmVzcyh2b2lkKTsKIAogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9mbG9wcHkuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvZmxvcHB5LmgKaW5kZXggN2UyZDE2OS4uOWM4ZDkxYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9mbG9wcHkuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2Zsb3BweS5oCkBAIC0yNyw4ICsyNyw3IEBACiAjZGVmaW5lIGZkX2Rpc2FibGVfaXJxKCkgICAgICAgIGRpc2FibGVfaXJxKEZMT1BQWV9JUlEpCiAjZGVmaW5lIGZkX2NhY2hlZmx1c2goYWRkcixzaXplKSAvKiBub3RoaW5nICovCiAjZGVmaW5lIGZkX3JlcXVlc3RfaXJxKCkgICAgICAgIHJlcXVlc3RfaXJxKEZMT1BQWV9JUlEsIGZsb3BweV9pbnRlcnJ1cHQsIFwKLQkJCQkJICAgIFNBX0lOVEVSUlVQVHxTQV9TQU1QTEVfUkFORE9NLCBcCi0JCQkJICAgICAgICAgICAgImZsb3BweSIsIE5VTEwpCisJCQkJCSAgICBTQV9JTlRFUlJVUFQsICJmbG9wcHkiLCBOVUxMKQogI2RlZmluZSBmZF9mcmVlX2lycSgpICAgICAgICAgICBmcmVlX2lycShGTE9QUFlfSVJRLCBOVUxMKTsKIAogI2lmZGVmIENPTkZJR19QQ0kKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMva2RlYnVnLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2tkZWJ1Zy5oCmluZGV4IGMwMTc4NmEuLjUzMmJmZWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMva2RlYnVnLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9rZGVidWcuaApAQCAtMTgsNiArMTgsOCBAQAogCiBleHRlcm4gaW50IHJlZ2lzdGVyX2RpZV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKik7CiBleHRlcm4gaW50IHVucmVnaXN0ZXJfZGllX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqKTsKK2V4dGVybiBpbnQgcmVnaXN0ZXJfcGFnZV9mYXVsdF9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKik7CitleHRlcm4gaW50IHVucmVnaXN0ZXJfcGFnZV9mYXVsdF9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKik7CiBleHRlcm4gc3RydWN0IGF0b21pY19ub3RpZmllcl9oZWFkIHBvd2VycGNfZGllX2NoYWluOwogCiAvKiBHcm9zc2x5IG1pc25hbWVkLiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9rcHJvYmVzLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2twcm9iZXMuaAppbmRleCBmNDY2YmM4Li4yZDBhZjUyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2twcm9iZXMuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2twcm9iZXMuaApAQCAtNTAsNiArNTAsOCBAQAogCQkJSVNfVFdJKGluc3RyKSB8fCBJU19UREkoaW5zdHIpKQogCiAjZGVmaW5lIEFSQ0hfU1VQUE9SVFNfS1JFVFBST0JFUworI2RlZmluZSAgQVJDSF9JTkFDVElWRV9LUFJPQkVfQ09VTlQgMQorCiB2b2lkIGtyZXRwcm9iZV90cmFtcG9saW5lKHZvaWQpOwogZXh0ZXJuIHZvaWQgYXJjaF9yZW1vdmVfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3BlcmNwdS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wZXJjcHUuaAppbmRleCAxODRhN2E0Li5mYWExZmM3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3BlcmNwdS5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcGVyY3B1LmgKQEAgLTIyLDYgKzIyLDcgQEAKIC8qIHZhciBpcyBpbiBkaXNjYXJkZWQgcmVnaW9uOiBvZmZzZXQgdG8gcGFydGljdWxhciBjb3B5IHdlIHdhbnQgKi8KICNkZWZpbmUgcGVyX2NwdSh2YXIsIGNwdSkgKCpSRUxPQ19ISURFKCZwZXJfY3B1X18jI3ZhciwgX19wZXJfY3B1X29mZnNldChjcHUpKSkKICNkZWZpbmUgX19nZXRfY3B1X3Zhcih2YXIpICgqUkVMT0NfSElERSgmcGVyX2NwdV9fIyN2YXIsIF9fbXlfY3B1X29mZnNldCgpKSkKKyNkZWZpbmUgX19yYXdfZ2V0X2NwdV92YXIodmFyKSAoKlJFTE9DX0hJREUoJnBlcl9jcHVfXyMjdmFyLCBfX215X2NwdV9vZmZzZXQoKSkpCiAKIC8qIEEgbWFjcm8gdG8gYXZvaWQgI2luY2x1ZGUgaGVsbC4uLiAqLwogI2RlZmluZSBwZXJjcHVfbW9kY29weShwY3B1ZHN0LCBzcmMsIHNpemUpCQkJXApAQCAtNDEsNiArNDIsNyBAQAogCiAjZGVmaW5lIHBlcl9jcHUodmFyLCBjcHUpCQkJKCooKHZvaWQpKGNwdSksICZwZXJfY3B1X18jI3ZhcikpCiAjZGVmaW5lIF9fZ2V0X2NwdV92YXIodmFyKQkJCXBlcl9jcHVfXyMjdmFyCisjZGVmaW5lIF9fcmF3X2dldF9jcHVfdmFyKHZhcikJCQlwZXJfY3B1X18jI3ZhcgogCiAjZW5kaWYJLyogU01QICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYy9mbG9wcHkuaCBiL2luY2x1ZGUvYXNtLXBwYy9mbG9wcHkuaAppbmRleCA4Y2NkNGEyLi4yYmExOTFlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wcGMvZmxvcHB5LmgKKysrIGIvaW5jbHVkZS9hc20tcHBjL2Zsb3BweS5oCkBAIC05OSwxMCArOTksOCBAQAogCQlyZXR1cm4gcmVxdWVzdF9pcnEoRkxPUFBZX0lSUSwgZmxvcHB5X2hhcmRpbnQsU0FfSU5URVJSVVBULAogCQkJCQkJICAgImZsb3BweSIsIE5VTEwpOwogCWVsc2UKLQkJcmV0dXJuIHJlcXVlc3RfaXJxKEZMT1BQWV9JUlEsIGZsb3BweV9pbnRlcnJ1cHQsCi0JCQkJCQkgICBTQV9JTlRFUlJVUFR8U0FfU0FNUExFX1JBTkRPTSwKLQkJCQkJCSAgICJmbG9wcHkiLCBOVUxMKTsKLQorCQlyZXR1cm4gcmVxdWVzdF9pcnEoRkxPUFBZX0lSUSwgZmxvcHB5X2ludGVycnVwdCwgU0FfSU5URVJSVVBULAorCQkJCSAgICJmbG9wcHkiLCBOVUxMKTsKIH0KIAogc3RhdGljIGludCB2ZG1hX2RtYV9zZXR1cChjaGFyICphZGRyLCB1bnNpZ25lZCBsb25nIHNpemUsIGludCBtb2RlLCBpbnQgaW8pCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zMzkwL3BlcmNwdS5oIGIvaW5jbHVkZS9hc20tczM5MC9wZXJjcHUuaAppbmRleCA0MzZkMjE2Li5kOWE4Y2NhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zMzkwL3BlcmNwdS5oCisrKyBiL2luY2x1ZGUvYXNtLXMzOTAvcGVyY3B1LmgKQEAgLTQwLDYgKzQwLDcgQEAKICAgICBfX3R5cGVvZl9fKHR5cGUpIHBlcl9jcHVfXyMjbmFtZQogCiAjZGVmaW5lIF9fZ2V0X2NwdV92YXIodmFyKSBfX3JlbG9jX2hpZGUodmFyLFMzOTBfbG93Y29yZS5wZXJjcHVfb2Zmc2V0KQorI2RlZmluZSBfX3Jhd19nZXRfY3B1X3Zhcih2YXIpIF9fcmVsb2NfaGlkZSh2YXIsUzM5MF9sb3djb3JlLnBlcmNwdV9vZmZzZXQpCiAjZGVmaW5lIHBlcl9jcHUodmFyLGNwdSkgX19yZWxvY19oaWRlKHZhcixfX3Blcl9jcHVfb2Zmc2V0W2NwdV0pCiAKIC8qIEEgbWFjcm8gdG8gYXZvaWQgI2luY2x1ZGUgaGVsbC4uLiAqLwpAQCAtNTcsNiArNTgsNyBAQAogICAgIF9fdHlwZW9mX18odHlwZSkgcGVyX2NwdV9fIyNuYW1lCiAKICNkZWZpbmUgX19nZXRfY3B1X3Zhcih2YXIpIF9fcmVsb2NfaGlkZSh2YXIsMCkKKyNkZWZpbmUgX19yYXdfZ2V0X2NwdV92YXIodmFyKSBfX3JlbG9jX2hpZGUodmFyLDApCiAjZGVmaW5lIHBlcl9jcHUodmFyLGNwdSkgX19yZWxvY19oaWRlKHZhciwwKQogCiAjZW5kaWYgLyogU01QICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9mbG9wcHkuaCBiL2luY2x1ZGUvYXNtLXNoL2Zsb3BweS5oCmluZGV4IDM4ZDdhMjkuLjMwN2Q5Y2UgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL2Zsb3BweS5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL2Zsb3BweS5oCkBAIC0xNDcsMTEgKzE0NywxMCBAQAogewogCWlmKGNhbl91c2VfdmlydHVhbF9kbWEpCiAJCXJldHVybiByZXF1ZXN0X2lycShGTE9QUFlfSVJRLCBmbG9wcHlfaGFyZGludCxTQV9JTlRFUlJVUFQsCi0JCQkJCQkgICAiZmxvcHB5IiwgTlVMTCk7CisJCQkJICAgImZsb3BweSIsIE5VTEwpOwogCWVsc2UKLQkJcmV0dXJuIHJlcXVlc3RfaXJxKEZMT1BQWV9JUlEsIGZsb3BweV9pbnRlcnJ1cHQsCi0JCQkJCQkgICBTQV9JTlRFUlJVUFR8U0FfU0FNUExFX1JBTkRPTSwKLQkJCQkJCSAgICJmbG9wcHkiLCBOVUxMKTsJCisJCXJldHVybiByZXF1ZXN0X2lycShGTE9QUFlfSVJRLCBmbG9wcHlfaW50ZXJydXB0LCBTQV9JTlRFUlJVUFQsCisJCQkJICAgImZsb3BweSIsIE5VTEwpOwogCiB9CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjL2lvLmggYi9pbmNsdWRlL2FzbS1zcGFyYy9pby5oCmluZGV4IGE0MmRmMjAuLmNhYjBiODUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjL2lvLmgKKysrIGIvaW5jbHVkZS9hc20tc3BhcmMvaW8uaApAQCAtMjQ5LDYgKzI0OSwyMiBAQAogI2RlZmluZSBpb3JlbWFwX25vY2FjaGUoWCxZKQlpb3JlbWFwKChYKSwoWSkpCiBleHRlcm4gdm9pZCBpb3VubWFwKHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcik7CiAKKyNkZWZpbmUgaW9yZWFkOChYKQkJCXJlYWRiKFgpCisjZGVmaW5lIGlvcmVhZDE2KFgpCQkJcmVhZHcoWCkKKyNkZWZpbmUgaW9yZWFkMzIoWCkJCQlyZWFkbChYKQorI2RlZmluZSBpb3dyaXRlOCh2YWwsWCkJCQl3cml0ZWIodmFsLFgpCisjZGVmaW5lIGlvd3JpdGUxNih2YWwsWCkJCXdyaXRldyh2YWwsWCkKKyNkZWZpbmUgaW93cml0ZTMyKHZhbCxYKQkJd3JpdGVsKHZhbCxYKQorCisvKiBDcmVhdGUgYSB2aXJ0dWFsIG1hcHBpbmcgY29va2llIGZvciBhbiBJTyBwb3J0IHJhbmdlICovCitleHRlcm4gdm9pZCBfX2lvbWVtICppb3BvcnRfbWFwKHVuc2lnbmVkIGxvbmcgcG9ydCwgdW5zaWduZWQgaW50IG5yKTsKK2V4dGVybiB2b2lkIGlvcG9ydF91bm1hcCh2b2lkIF9faW9tZW0gKik7CisKKy8qIENyZWF0ZSBhIHZpcnR1YWwgbWFwcGluZyBjb29raWUgZm9yIGEgUENJIEJBUiAobWVtb3J5IG9yIElPKSAqLworc3RydWN0IHBjaV9kZXY7CitleHRlcm4gdm9pZCBfX2lvbWVtICpwY2lfaW9tYXAoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IGJhciwgdW5zaWduZWQgbG9uZyBtYXgpOworZXh0ZXJuIHZvaWQgcGNpX2lvdW5tYXAoc3RydWN0IHBjaV9kZXYgKmRldiwgdm9pZCBfX2lvbWVtICopOworCiAvKgogICogQnVzIG51bWJlciBtYXkgYmUgaW4gcmVzLT5mbGFncy4uLiBzb21ld2hlcmUuCiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjL3Byb20uaCBiL2luY2x1ZGUvYXNtLXNwYXJjL3Byb20uaAppbmRleCBjNWUzZDI2Li5mOWNmNDRjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYy9wcm9tLmgKKysrIGIvaW5jbHVkZS9hc20tc3BhcmMvcHJvbS5oCkBAIC0zNSw2ICszNSw4IEBACiAJaW50CWxlbmd0aDsKIAl2b2lkCSp2YWx1ZTsKIAlzdHJ1Y3QgcHJvcGVydHkgKm5leHQ7CisJdW5zaWduZWQgbG9uZyBfZmxhZ3M7CisJdW5zaWduZWQgaW50IHVuaXF1ZV9pZDsKIH07CiAKIHN0cnVjdCBkZXZpY2Vfbm9kZSB7CkBAIC01OCw4ICs2MCwxNSBAQAogCXN0cnVjdCAga3JlZiBrcmVmOwogCXVuc2lnbmVkIGxvbmcgX2ZsYWdzOwogCXZvaWQJKmRhdGE7CisJdW5zaWduZWQgaW50IHVuaXF1ZV9pZDsKIH07CiAKKy8qIGZsYWcgZGVzY3JpcHRpb25zICovCisjZGVmaW5lIE9GX0RZTkFNSUMgMSAvKiBub2RlIGFuZCBwcm9wZXJ0aWVzIHdlcmUgYWxsb2NhdGVkIHZpYSBrbWFsbG9jICovCisKKyNkZWZpbmUgT0ZfSVNfRFlOQU1JQyh4KSB0ZXN0X2JpdChPRl9EWU5BTUlDLCAmeC0+X2ZsYWdzKQorI2RlZmluZSBPRl9NQVJLX0RZTkFNSUMoeCkgc2V0X2JpdChPRl9EWU5BTUlDLCAmeC0+X2ZsYWdzKQorCiBzdGF0aWMgaW5saW5lIHZvaWQgc2V0X25vZGVfcHJvY19lbnRyeShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuLCBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRlKQogewogCWRuLT5wZGUgPSBkZTsKQEAgLTg4LDYgKzk3LDcgQEAKIGV4dGVybiBpbnQgb2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUoc3RydWN0IGRldmljZV9ub2RlICpkZXZpY2UsIGNvbnN0IGNoYXIgKik7CiBleHRlcm4gdm9pZCAqb2ZfZ2V0X3Byb3BlcnR5KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwgY29uc3QgY2hhciAqbmFtZSwKIAkJCSAgICAgaW50ICpsZW5wKTsKK2V4dGVybiBpbnQgb2Zfc2V0X3Byb3BlcnR5KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwgY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqdmFsLCBpbnQgbGVuKTsKIGV4dGVybiBpbnQgb2ZfZ2V0aW50cHJvcF9kZWZhdWx0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCiAJCQkJIGNvbnN0IGNoYXIgKm5hbWUsCiAJCQkJIGludCBkZWYpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9kbWEtbWFwcGluZy5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9kbWEtbWFwcGluZy5oCmluZGV4IDNjMmI1YmMuLjBmNWI4OWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvZG1hLW1hcHBpbmcuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L2RtYS1tYXBwaW5nLmgKQEAgLTE2Miw0ICsxNjIsNDcgQEAKIAogI2VuZGlmIC8qIFBDSSAqLwogCisKKy8qIE5vdyBmb3IgdGhlIEFQSSBleHRlbnNpb25zIG92ZXIgdGhlIHBjaV8gb25lICovCisKKyNkZWZpbmUgZG1hX2FsbG9jX25vbmNvaGVyZW50KGQsIHMsIGgsIGYpIGRtYV9hbGxvY19jb2hlcmVudChkLCBzLCBoLCBmKQorI2RlZmluZSBkbWFfZnJlZV9ub25jb2hlcmVudChkLCBzLCB2LCBoKSBkbWFfZnJlZV9jb2hlcmVudChkLCBzLCB2LCBoKQorI2RlZmluZSBkbWFfaXNfY29uc2lzdGVudChkKQkoMSkKKworc3RhdGljIGlubGluZSBpbnQKK2RtYV9nZXRfY2FjaGVfYWxpZ25tZW50KHZvaWQpCit7CisJLyogbm8gZWFzeSB3YXkgdG8gZ2V0IGNhY2hlIHNpemUgb24gYWxsIHByb2Nlc3NvcnMsIHNvIHJldHVybgorCSAqIHRoZSBtYXhpbXVtIHBvc3NpYmxlLCB0byBiZSBzYWZlICovCisJcmV0dXJuICgxIDw8IElOVEVSTk9ERV9DQUNIRV9TSElGVCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorZG1hX3N5bmNfc2luZ2xlX3JhbmdlX2Zvcl9jcHUoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGRtYV9oYW5kbGUsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIG9mZnNldCwgc2l6ZV90IHNpemUsCisJCQkgICAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCit7CisJLyoganVzdCBzeW5jIGV2ZXJ5dGhpbmcsIHRoYXQncyBhbGwgdGhlIHBjaSBBUEkgY2FuIGRvICovCisJZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoZGV2LCBkbWFfaGFuZGxlLCBvZmZzZXQrc2l6ZSwgZGlyZWN0aW9uKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitkbWFfc3luY19zaW5nbGVfcmFuZ2VfZm9yX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSwKKwkJCQkgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHNpemVfdCBzaXplLAorCQkJCSBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCit7CisJLyoganVzdCBzeW5jIGV2ZXJ5dGhpbmcsIHRoYXQncyBhbGwgdGhlIHBjaSBBUEkgY2FuIGRvICovCisJZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UoZGV2LCBkbWFfaGFuZGxlLCBvZmZzZXQrc2l6ZSwgZGlyZWN0aW9uKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitkbWFfY2FjaGVfc3luYyh2b2lkICp2YWRkciwgc2l6ZV90IHNpemUsCisJICAgICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKK3sKKwkvKiBjb3VsZCBkZWZpbmUgdGhpcyBpbiB0ZXJtcyBvZiB0aGUgZG1hX2NhY2hlIC4uLiBvcGVyYXRpb25zLAorCSAqIGJ1dCBpZiB5b3UgZ2V0IHRoaXMgb24gYSBwbGF0Zm9ybSwgeW91IHNob3VsZCBjb252ZXJ0IHRoZSBwbGF0Zm9ybQorCSAqIHRvIHVzaW5nIHRoZSBnZW5lcmljIGRldmljZSBETUEgQVBJICovCisJQlVHKCk7Cit9CisKICNlbmRpZiAvKiBfQVNNX1NQQVJDNjRfRE1BX01BUFBJTkdfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9mbG9wcHkuaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvZmxvcHB5LmgKaW5kZXggZjhkNTdiYi4uYjU5MWQwZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmM2NC9mbG9wcHkuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L2Zsb3BweS5oCkBAIC0yMDgsNyArMjA4LDU1IEBACiAJcGRtYV9hcmVhc2l6ZSA9IHBkbWFfc2l6ZTsKIH0KIAotZXh0ZXJuIGlycXJldHVybl90IHNwYXJjX2Zsb3BweV9pcnEoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopOworaXJxcmV0dXJuX3Qgc3BhcmNfZmxvcHB5X2lycShpbnQgaXJxLCB2b2lkICpkZXZfY29va2llLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpZiAobGlrZWx5KGRvaW5nX3BkbWEpKSB7CisJCXZvaWQgX19pb21lbSAqc3RhdCA9ICh2b2lkIF9faW9tZW0gKikgZmRjX3N0YXR1czsKKwkJdW5zaWduZWQgY2hhciAqdmFkZHIgPSBwZG1hX3ZhZGRyOworCQl1bnNpZ25lZCBsb25nIHNpemUgPSBwZG1hX3NpemU7CisJCXU4IHZhbDsKKworCQl3aGlsZSAoc2l6ZSkgeworCQkJdmFsID0gcmVhZGIoc3RhdCk7CisJCQlpZiAodW5saWtlbHkoISh2YWwgJiAweDgwKSkpIHsKKwkJCQlwZG1hX3ZhZGRyID0gdmFkZHI7CisJCQkJcGRtYV9zaXplID0gc2l6ZTsKKwkJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJCQl9CisJCQlpZiAodW5saWtlbHkoISh2YWwgJiAweDIwKSkpIHsKKwkJCQlwZG1hX3ZhZGRyID0gdmFkZHI7CisJCQkJcGRtYV9zaXplID0gc2l6ZTsKKwkJCQlkb2luZ19wZG1hID0gMDsKKwkJCQlnb3RvIG1haW5faW50ZXJydXB0OworCQkJfQorCQkJaWYgKHZhbCAmIDB4NDApIHsKKwkJCQkvKiByZWFkICovCisJCQkJKnZhZGRyKysgPSByZWFkYihzdGF0ICsgMSk7CisJCQl9IGVsc2UgeworCQkJCXVuc2lnbmVkIGNoYXIgZGF0YSA9ICp2YWRkcisrOworCisJCQkJLyogd3JpdGUgKi8KKwkJCQl3cml0ZWIoZGF0YSwgc3RhdCArIDEpOworCQkJfQorCQkJc2l6ZS0tOworCQl9CisKKwkJcGRtYV92YWRkciA9IHZhZGRyOworCQlwZG1hX3NpemUgPSBzaXplOworCisJCS8qIFNlbmQgVGVybWluYWwgQ291bnQgcHVsc2UgdG8gZmxvcHB5IGNvbnRyb2xsZXIuICovCisJCXZhbCA9IHJlYWRiKGF1eGlvX3JlZ2lzdGVyKTsKKwkJdmFsIHw9IEFVWElPX0FVWDFfRlRDTlQ7CisJCXdyaXRlYih2YWwsIGF1eGlvX3JlZ2lzdGVyKTsKKwkJdmFsICY9IH5BVVhJT19BVVgxX0ZUQ05UOworCQl3cml0ZWIodmFsLCBhdXhpb19yZWdpc3Rlcik7CisKKwkJZG9pbmdfcGRtYSA9IDA7CisJfQorCittYWluX2ludGVycnVwdDoKKwlyZXR1cm4gZmxvcHB5X2ludGVycnVwdChpcnEsIGRldl9jb29raWUsIHJlZ3MpOworfQogCiBzdGF0aWMgaW50IHN1bl9mZF9yZXF1ZXN0X2lycSh2b2lkKQogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9rZGVidWcuaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQva2RlYnVnLmgKaW5kZXggNDA0MGQxMi4uMTEyNTFiZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmM2NC9rZGVidWcuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L2tkZWJ1Zy5oCkBAIC0xNyw2ICsxNyw4IEBACiAKIGV4dGVybiBpbnQgcmVnaXN0ZXJfZGllX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqKTsKIGV4dGVybiBpbnQgdW5yZWdpc3Rlcl9kaWVfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICopOworZXh0ZXJuIGludCByZWdpc3Rlcl9wYWdlX2ZhdWx0X25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqKTsKK2V4dGVybiBpbnQgdW5yZWdpc3Rlcl9wYWdlX2ZhdWx0X25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqKTsKIGV4dGVybiBzdHJ1Y3QgYXRvbWljX25vdGlmaWVyX2hlYWQgc3BhcmM2NGRpZV9jaGFpbjsKIAogZXh0ZXJuIHZvaWQgYmFkX3RyYXAoc3RydWN0IHB0X3JlZ3MgKiwgbG9uZyk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L2twcm9iZXMuaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQva3Byb2Jlcy5oCmluZGV4IGU5YmIyNmYuLjE1MDY1YWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjNjQva3Byb2Jlcy5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQva3Byb2Jlcy5oCkBAIC0xMiw2ICsxMiw3IEBACiAKICNkZWZpbmUgSlBST0JFX0VOVFJZKHBlbnRyeSkJKGtwcm9iZV9vcGNvZGVfdCAqKXBlbnRyeQogI2RlZmluZSBhcmNoX3JlbW92ZV9rcHJvYmUocCkJZG8ge30gd2hpbGUgKDApCisjZGVmaW5lICBBUkNIX0lOQUNUSVZFX0tQUk9CRV9DT1VOVCAwCiAKIC8qIEFyY2hpdGVjdHVyZSBzcGVjaWZpYyBjb3B5IG9mIG9yaWdpbmFsIGluc3RydWN0aW9uKi8KIHN0cnVjdCBhcmNoX3NwZWNpZmljX2luc24gewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9wZXJjcHUuaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvcGVyY3B1LmgKaW5kZXggYmFlZjEzYi4uYTZlY2UwNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmM2NC9wZXJjcHUuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3BlcmNwdS5oCkBAIC0yMSw2ICsyMSw3IEBACiAvKiB2YXIgaXMgaW4gZGlzY2FyZGVkIHJlZ2lvbjogb2Zmc2V0IHRvIHBhcnRpY3VsYXIgY29weSB3ZSB3YW50ICovCiAjZGVmaW5lIHBlcl9jcHUodmFyLCBjcHUpICgqUkVMT0NfSElERSgmcGVyX2NwdV9fIyN2YXIsIF9fcGVyX2NwdV9vZmZzZXQoY3B1KSkpCiAjZGVmaW5lIF9fZ2V0X2NwdV92YXIodmFyKSAoKlJFTE9DX0hJREUoJnBlcl9jcHVfXyMjdmFyLCBfX2xvY2FsX3Blcl9jcHVfb2Zmc2V0KSkKKyNkZWZpbmUgX19yYXdfZ2V0X2NwdV92YXIodmFyKSAoKlJFTE9DX0hJREUoJnBlcl9jcHVfXyMjdmFyLCBfX2xvY2FsX3Blcl9jcHVfb2Zmc2V0KSkKIAogLyogQSBtYWNybyB0byBhdm9pZCAjaW5jbHVkZSBoZWxsLi4uICovCiAjZGVmaW5lIHBlcmNwdV9tb2Rjb3B5KHBjcHVkc3QsIHNyYywgc2l6ZSkJCQlcCkBAIC0zNyw2ICszOCw3IEBACiAKICNkZWZpbmUgcGVyX2NwdSh2YXIsIGNwdSkJCQkoKigodm9pZCljcHUsICZwZXJfY3B1X18jI3ZhcikpCiAjZGVmaW5lIF9fZ2V0X2NwdV92YXIodmFyKQkJCXBlcl9jcHVfXyMjdmFyCisjZGVmaW5lIF9fcmF3X2dldF9jcHVfdmFyKHZhcikJCQlwZXJfY3B1X18jI3ZhcgogCiAjZW5kaWYJLyogU01QICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvcHJvbS5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9wcm9tLmgKaW5kZXggNmQxNTU2Yy4uMjY1NjE0ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmM2NC9wcm9tLmgKKysrIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9wcm9tLmgKQEAgLTM1LDYgKzM1LDggQEAKIAlpbnQJbGVuZ3RoOwogCXZvaWQJKnZhbHVlOwogCXN0cnVjdCBwcm9wZXJ0eSAqbmV4dDsKKwl1bnNpZ25lZCBsb25nIF9mbGFnczsKKwl1bnNpZ25lZCBpbnQgdW5pcXVlX2lkOwogfTsKIAogc3RydWN0IGRldmljZV9ub2RlIHsKQEAgLTU4LDggKzYwLDE1IEBACiAJc3RydWN0ICBrcmVmIGtyZWY7CiAJdW5zaWduZWQgbG9uZyBfZmxhZ3M7CiAJdm9pZAkqZGF0YTsKKwl1bnNpZ25lZCBpbnQgdW5pcXVlX2lkOwogfTsKIAorLyogZmxhZyBkZXNjcmlwdGlvbnMgKi8KKyNkZWZpbmUgT0ZfRFlOQU1JQyAxIC8qIG5vZGUgYW5kIHByb3BlcnRpZXMgd2VyZSBhbGxvY2F0ZWQgdmlhIGttYWxsb2MgKi8KKworI2RlZmluZSBPRl9JU19EWU5BTUlDKHgpIHRlc3RfYml0KE9GX0RZTkFNSUMsICZ4LT5fZmxhZ3MpCisjZGVmaW5lIE9GX01BUktfRFlOQU1JQyh4KSBzZXRfYml0KE9GX0RZTkFNSUMsICZ4LT5fZmxhZ3MpCisKIHN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfbm9kZV9wcm9jX2VudHJ5KHN0cnVjdCBkZXZpY2Vfbm9kZSAqZG4sIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZGUpCiB7CiAJZG4tPnBkZSA9IGRlOwpAQCAtODgsNiArOTcsNyBAQAogZXh0ZXJuIGludCBvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldmljZSwgY29uc3QgY2hhciAqKTsKIGV4dGVybiB2b2lkICpvZl9nZXRfcHJvcGVydHkoc3RydWN0IGRldmljZV9ub2RlICpub2RlLCBjb25zdCBjaGFyICpuYW1lLAogCQkJICAgICBpbnQgKmxlbnApOworZXh0ZXJuIGludCBvZl9zZXRfcHJvcGVydHkoc3RydWN0IGRldmljZV9ub2RlICpub2RlLCBjb25zdCBjaGFyICpuYW1lLCB2b2lkICp2YWwsIGludCBsZW4pOwogZXh0ZXJuIGludCBvZl9nZXRpbnRwcm9wX2RlZmF1bHQoc3RydWN0IGRldmljZV9ub2RlICpucCwKIAkJCQkgY29uc3QgY2hhciAqbmFtZSwKIAkJCQkgaW50IGRlZik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvYWx0ZXJuYXRpdmUuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9hbHRlcm5hdGl2ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4N2M4ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvYWx0ZXJuYXRpdmUuaApAQCAtMCwwICsxLDE0NiBAQAorI2lmbmRlZiBfWDg2XzY0X0FMVEVSTkFUSVZFX0gKKyNkZWZpbmUgX1g4Nl82NF9BTFRFUk5BVElWRV9ICisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitzdHJ1Y3QgYWx0X2luc3RyIHsKKwl1OCAqaW5zdHI7IAkJLyogb3JpZ2luYWwgaW5zdHJ1Y3Rpb24gKi8KKwl1OCAqcmVwbGFjZW1lbnQ7CisJdTggIGNwdWlkOwkJLyogY3B1aWQgYml0IHNldCBmb3IgcmVwbGFjZW1lbnQgKi8KKwl1OCAgaW5zdHJsZW47CQkvKiBsZW5ndGggb2Ygb3JpZ2luYWwgaW5zdHJ1Y3Rpb24gKi8KKwl1OCAgcmVwbGFjZW1lbnRsZW47IAkvKiBsZW5ndGggb2YgbmV3IGluc3RydWN0aW9uLCA8PSBpbnN0cmxlbiAqLworCXU4ICBwYWRbNV07Cit9OworCitleHRlcm4gdm9pZCBhcHBseV9hbHRlcm5hdGl2ZXMoc3RydWN0IGFsdF9pbnN0ciAqc3RhcnQsIHN0cnVjdCBhbHRfaW5zdHIgKmVuZCk7CisKK3N0cnVjdCBtb2R1bGU7CitleHRlcm4gdm9pZCBhbHRlcm5hdGl2ZXNfc21wX21vZHVsZV9hZGQoc3RydWN0IG1vZHVsZSAqbW9kLCBjaGFyICpuYW1lLAorCQkJCQl2b2lkICpsb2Nrcywgdm9pZCAqbG9ja3NfZW5kLAorCQkJCQl2b2lkICp0ZXh0LCB2b2lkICp0ZXh0X2VuZCk7CitleHRlcm4gdm9pZCBhbHRlcm5hdGl2ZXNfc21wX21vZHVsZV9kZWwoc3RydWN0IG1vZHVsZSAqbW9kKTsKK2V4dGVybiB2b2lkIGFsdGVybmF0aXZlc19zbXBfc3dpdGNoKGludCBzbXApOworCisjZW5kaWYKKworLyoKKyAqIEFsdGVybmF0aXZlIGluc3RydWN0aW9ucyBmb3IgZGlmZmVyZW50IENQVSB0eXBlcyBvciBjYXBhYmlsaXRpZXMuCisgKgorICogVGhpcyBhbGxvd3MgdG8gdXNlIG9wdGltaXplZCBpbnN0cnVjdGlvbnMgZXZlbiBvbiBnZW5lcmljIGJpbmFyeQorICoga2VybmVscy4KKyAqCisgKiBsZW5ndGggb2Ygb2xkaW5zdHIgbXVzdCBiZSBsb25nZXIgb3IgZXF1YWwgdGhlIGxlbmd0aCBvZiBuZXdpbnN0cgorICogSXQgY2FuIGJlIHBhZGRlZCB3aXRoIG5vcHMgYXMgbmVlZGVkLgorICoKKyAqIEZvciBub24gYmFycmllciBsaWtlIGlubGluZXMgcGxlYXNlIGRlZmluZSBuZXcgdmFyaWFudHMKKyAqIHdpdGhvdXQgdm9sYXRpbGUgYW5kIG1lbW9yeSBjbG9iYmVyLgorICovCisjZGVmaW5lIGFsdGVybmF0aXZlKG9sZGluc3RyLCBuZXdpbnN0ciwgZmVhdHVyZSkgCVwKKwlhc20gdm9sYXRpbGUgKCI2NjE6XG5cdCIgb2xkaW5zdHIgIlxuNjYyOlxuIiAJCSAgICAgXAorCQkgICAgICAiLnNlY3Rpb24gLmFsdGluc3RydWN0aW9ucyxcImFcIlxuIiAgICAgCSAgICAgXAorCQkgICAgICAiICAuYWxpZ24gOFxuIgkJCQkgICAgICAgXAorCQkgICAgICAiICAucXVhZCA2NjFiXG4iICAgICAgICAgICAgLyogbGFiZWwgKi8gICAgICAgICAgXAorCQkgICAgICAiICAucXVhZCA2NjNmXG4iCQkgIC8qIG5ldyBpbnN0cnVjdGlvbiAqLyBcCisJCSAgICAgICIgIC5ieXRlICVjMFxuIiAgICAgICAgICAgICAvKiBmZWF0dXJlIGJpdCAqLyAgICBcCisJCSAgICAgICIgIC5ieXRlIDY2MmItNjYxYlxuIiAgICAgICAvKiBzb3VyY2VsZW4gKi8gICAgICBcCisJCSAgICAgICIgIC5ieXRlIDY2NGYtNjYzZlxuIiAgICAgICAvKiByZXBsYWNlbWVudGxlbiAqLyBcCisJCSAgICAgICIucHJldmlvdXNcbiIJCQkJCVwKKwkJICAgICAgIi5zZWN0aW9uIC5hbHRpbnN0cl9yZXBsYWNlbWVudCxcImF4XCJcbiIJCVwKKwkJICAgICAgIjY2Mzpcblx0IiBuZXdpbnN0ciAiXG42NjQ6XG4iICAgLyogcmVwbGFjZW1lbnQgKi8gXAorCQkgICAgICAiLnByZXZpb3VzIiA6OiAiaSIgKGZlYXR1cmUpIDogIm1lbW9yeSIpCisKKy8qCisgKiBBbHRlcm5hdGl2ZSBpbmxpbmUgYXNzZW1ibHkgd2l0aCBpbnB1dC4KKyAqCisgKiBQZWN1bGFyaXRpZXM6CisgKiBObyBtZW1vcnkgY2xvYmJlciBoZXJlLgorICogQXJndW1lbnQgbnVtYmVycyBzdGFydCB3aXRoIDEuCisgKiBCZXN0IGlzIHRvIHVzZSBjb25zdHJhaW50cyB0aGF0IGFyZSBmaXhlZCBzaXplIChsaWtlICglMSkgLi4uICJyIikKKyAqIElmIHlvdSB1c2UgdmFyaWFibGUgc2l6ZWQgY29uc3RyYWludHMgbGlrZSAibSIgb3IgImciIGluIHRoZQorICogcmVwbGFjZW1lbnQgbWFrZSBzdXJlIHRvIHBhZCB0byB0aGUgd29yc3QgY2FzZSBsZW5ndGguCisgKi8KKyNkZWZpbmUgYWx0ZXJuYXRpdmVfaW5wdXQob2xkaW5zdHIsIG5ld2luc3RyLCBmZWF0dXJlLCBpbnB1dC4uLikJXAorCWFzbSB2b2xhdGlsZSAoIjY2MTpcblx0IiBvbGRpbnN0ciAiXG42NjI6XG4iCQkJXAorCQkgICAgICAiLnNlY3Rpb24gLmFsdGluc3RydWN0aW9ucyxcImFcIlxuIgkJXAorCQkgICAgICAiICAuYWxpZ24gOFxuIgkJCQkJXAorCQkgICAgICAiICAucXVhZCA2NjFiXG4iICAgICAgICAgICAgLyogbGFiZWwgKi8JCVwKKwkJICAgICAgIiAgLnF1YWQgNjYzZlxuIgkJICAvKiBuZXcgaW5zdHJ1Y3Rpb24gKi8JXAorCQkgICAgICAiICAuYnl0ZSAlYzBcbiIgICAgICAgICAgICAgLyogZmVhdHVyZSBiaXQgKi8JXAorCQkgICAgICAiICAuYnl0ZSA2NjJiLTY2MWJcbiIgICAgICAgLyogc291cmNlbGVuICovCVwKKwkJICAgICAgIiAgLmJ5dGUgNjY0Zi02NjNmXG4iICAgICAgIC8qIHJlcGxhY2VtZW50bGVuICovCVwKKwkJICAgICAgIi5wcmV2aW91c1xuIgkJCQkJXAorCQkgICAgICAiLnNlY3Rpb24gLmFsdGluc3RyX3JlcGxhY2VtZW50LFwiYXhcIlxuIgkJXAorCQkgICAgICAiNjYzOlxuXHQiIG5ld2luc3RyICJcbjY2NDpcbiIgICAvKiByZXBsYWNlbWVudCAqLyBcCisJCSAgICAgICIucHJldmlvdXMiIDo6ICJpIiAoZmVhdHVyZSksICMjaW5wdXQpCisKKy8qIExpa2UgYWx0ZXJuYXRpdmVfaW5wdXQsIGJ1dCB3aXRoIGEgc2luZ2xlIG91dHB1dCBhcmd1bWVudCAqLworI2RlZmluZSBhbHRlcm5hdGl2ZV9pbyhvbGRpbnN0ciwgbmV3aW5zdHIsIGZlYXR1cmUsIG91dHB1dCwgaW5wdXQuLi4pIFwKKwlhc20gdm9sYXRpbGUgKCI2NjE6XG5cdCIgb2xkaW5zdHIgIlxuNjYyOlxuIgkJCVwKKwkJICAgICAgIi5zZWN0aW9uIC5hbHRpbnN0cnVjdGlvbnMsXCJhXCJcbiIJCVwKKwkJICAgICAgIiAgLmFsaWduIDhcbiIJCQkJCVwKKwkJICAgICAgIiAgLnF1YWQgNjYxYlxuIiAgICAgICAgICAgIC8qIGxhYmVsICovCQlcCisJCSAgICAgICIgIC5xdWFkIDY2M2ZcbiIJCSAgLyogbmV3IGluc3RydWN0aW9uICovCVwKKwkJICAgICAgIiAgLmJ5dGUgJWNbZmVhdF1cbiIgICAgICAgIC8qIGZlYXR1cmUgYml0ICovCVwKKwkJICAgICAgIiAgLmJ5dGUgNjYyYi02NjFiXG4iICAgICAgIC8qIHNvdXJjZWxlbiAqLwlcCisJCSAgICAgICIgIC5ieXRlIDY2NGYtNjYzZlxuIiAgICAgICAvKiByZXBsYWNlbWVudGxlbiAqLwlcCisJCSAgICAgICIucHJldmlvdXNcbiIJCQkJCVwKKwkJICAgICAgIi5zZWN0aW9uIC5hbHRpbnN0cl9yZXBsYWNlbWVudCxcImF4XCJcbiIJCVwKKwkJICAgICAgIjY2Mzpcblx0IiBuZXdpbnN0ciAiXG42NjQ6XG4iICAgLyogcmVwbGFjZW1lbnQgKi8gXAorCQkgICAgICAiLnByZXZpb3VzIiA6IG91dHB1dCA6IFtmZWF0XSAiaSIgKGZlYXR1cmUpLCAjI2lucHV0KQorCisvKgorICogQWx0ZXJuYXRpdmUgaW5saW5lIGFzc2VtYmx5IGZvciBTTVAuCisgKgorICogYWx0ZXJuYXRpdmVfc21wKCkgdGFrZXMgdHdvIHZlcnNpb25zIChTTVAgZmlyc3QsIFVQIHNlY29uZCkgYW5kIGlzCisgKiBmb3IgbW9yZSBjb21wbGV4IHN0dWZmIHN1Y2ggYXMgc3BpbmxvY2tzLgorICoKKyAqIFRoZSBMT0NLX1BSRUZJWCBtYWNybyBkZWZpbmVkIGhlcmUgcmVwbGFjZXMgdGhlIExPQ0sgYW5kCisgKiBMT0NLX1BSRUZJWCBtYWNyb3MgdXNlZCBldmVyeXdoZXJlIGluIHRoZSBzb3VyY2UgdHJlZS4KKyAqCisgKiBTTVAgYWx0ZXJuYXRpdmVzIHVzZSB0aGUgc2FtZSBkYXRhIHN0cnVjdHVyZXMgYXMgdGhlIG90aGVyCisgKiBhbHRlcm5hdGl2ZXMgYW5kIHRoZSBYODZfRkVBVFVSRV9VUCBmbGFnIHRvIGluZGljYXRlIHRoZSBjYXNlIG9mIGEKKyAqIFVQIHN5c3RlbSBydW5uaW5nIGEgU01QIGtlcm5lbC4gIFRoZSBleGlzdGluZyBhcHBseV9hbHRlcm5hdGl2ZXMoKQorICogd29ya3MgZmluZSBmb3IgcGF0Y2hpbmcgYSBTTVAga2VybmVsIGZvciBVUC4KKyAqCisgKiBUaGUgU01QIGFsdGVybmF0aXZlIHRhYmxlcyBjYW4gYmUga2VwdCBhZnRlciBib290IGFuZCBjb250YWluIGJvdGgKKyAqIFVQIGFuZCBTTVAgdmVyc2lvbnMgb2YgdGhlIGluc3RydWN0aW9ucyB0byBhbGxvdyBzd2l0Y2hpbmcgYmFjayB0bworICogU01QIGF0IHJ1bnRpbWUsIHdoZW4gaG90cGx1Z2dpbmcgaW4gYSBuZXcgQ1BVLCB3aGljaCBpcyBlc3BlY2lhbGx5CisgKiB1c2VmdWwgaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzLgorICoKKyAqIFRoZSB2ZXJ5IGNvbW1vbiBsb2NrIHByZWZpeCBpcyBoYW5kbGVkIGFzIHNwZWNpYWwgY2FzZSBpbiBhCisgKiBzZXBhcmF0ZSB0YWJsZSB3aGljaCBpcyBhIHB1cmUgYWRkcmVzcyBsaXN0IHdpdGhvdXQgcmVwbGFjZW1lbnQgcHRyCisgKiBhbmQgc2l6ZSBpbmZvcm1hdGlvbi4gIFRoYXQga2VlcHMgdGhlIHRhYmxlIHNpemVzIHNtYWxsLgorICovCisKKyNpZmRlZiBDT05GSUdfU01QCisjZGVmaW5lIGFsdGVybmF0aXZlX3NtcChzbXBpbnN0ciwgdXBpbnN0ciwgYXJncy4uLikJCQlcCisJYXNtIHZvbGF0aWxlICgiNjYxOlxuXHQiIHNtcGluc3RyICJcbjY2MjpcbiIJCQlcCisJCSAgICAgICIuc2VjdGlvbiAuc21wX2FsdGluc3RydWN0aW9ucyxcImFcIlxuIgkJXAorCQkgICAgICAiICAuYWxpZ24gOFxuIgkJCQkJXAorCQkgICAgICAiICAucXVhZCA2NjFiXG4iICAgICAgICAgICAgLyogbGFiZWwgKi8JCVwKKwkJICAgICAgIiAgLnF1YWQgNjYzZlxuIgkJICAvKiBuZXcgaW5zdHJ1Y3Rpb24gKi8JXAorCQkgICAgICAiICAuYnl0ZSAweDY2XG4iICAgICAgICAgICAgLyogWDg2X0ZFQVRVUkVfVVAgKi8JXAorCQkgICAgICAiICAuYnl0ZSA2NjJiLTY2MWJcbiIgICAgICAgLyogc291cmNlbGVuICovCVwKKwkJICAgICAgIiAgLmJ5dGUgNjY0Zi02NjNmXG4iICAgICAgIC8qIHJlcGxhY2VtZW50bGVuICovCVwKKwkJICAgICAgIi5wcmV2aW91c1xuIgkJCQkJXAorCQkgICAgICAiLnNlY3Rpb24gLnNtcF9hbHRpbnN0cl9yZXBsYWNlbWVudCxcImF3eFwiXG4iCVwKKwkJICAgICAgIjY2Mzpcblx0IiB1cGluc3RyICJcbiIgICAgIC8qIHJlcGxhY2VtZW50ICovCVwKKwkJICAgICAgIjY2NDpcblx0LmZpbGwgNjYyYi02NjFiLDEsMHg0MlxuIiAvKiBzcGFjZSBmb3Igb3JpZ2luYWwgKi8gXAorCQkgICAgICAiLnByZXZpb3VzIiA6IGFyZ3MpCisKKyNkZWZpbmUgTE9DS19QUkVGSVggXAorCQkiLnNlY3Rpb24gLnNtcF9sb2NrcyxcImFcIlxuIglcCisJCSIgIC5hbGlnbiA4XG4iCQkJXAorCQkiICAucXVhZCA2NjFmXG4iIC8qIGFkZHJlc3MgKi8JXAorCQkiLnByZXZpb3VzXG4iCQkJXAorCSAgICAgICAJIjY2MTpcblx0bG9jazsgIgorCisjZWxzZSAvKiAhIENPTkZJR19TTVAgKi8KKyNkZWZpbmUgYWx0ZXJuYXRpdmVfc21wKHNtcGluc3RyLCB1cGluc3RyLCBhcmdzLi4uKSBcCisJYXNtIHZvbGF0aWxlICh1cGluc3RyIDogYXJncykKKyNkZWZpbmUgTE9DS19QUkVGSVggIiIKKyNlbmRpZgorCisjZW5kaWYgLyogX1g4Nl82NF9BTFRFUk5BVElWRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvYXBpYy5oIGIvaW5jbHVkZS9hc20teDg2XzY0L2FwaWMuaAppbmRleCBhNzMxYmUyLi45Yzk2YTBhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvYXBpYy5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9hcGljLmgKQEAgLTQ5LDcgKzQ5LDggQEAKIAogc3RhdGljIF9faW5saW5lX18gdm9pZCBhcGljX3dhaXRfaWNyX2lkbGUodm9pZCkKIHsKLQl3aGlsZSAoIGFwaWNfcmVhZCggQVBJQ19JQ1IgKSAmIEFQSUNfSUNSX0JVU1kgKTsKKwl3aGlsZSAoYXBpY19yZWFkKCBBUElDX0lDUiApICYgQVBJQ19JQ1JfQlVTWSkKKwkJY3B1X3JlbGF4KCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBhY2tfQVBJQ19pcnEodm9pZCkKQEAgLTc5LDMwICs4MCwyMyBAQAogZXh0ZXJuIHZvaWQgc21wX2xvY2FsX3RpbWVyX2ludGVycnVwdCAoc3RydWN0IHB0X3JlZ3MgKiByZWdzKTsKIGV4dGVybiB2b2lkIHNldHVwX2Jvb3RfQVBJQ19jbG9jayAodm9pZCk7CiBleHRlcm4gdm9pZCBzZXR1cF9zZWNvbmRhcnlfQVBJQ19jbG9jayAodm9pZCk7Ci1leHRlcm4gdm9pZCBzZXR1cF9hcGljX25taV93YXRjaGRvZyAodm9pZCk7Ci1leHRlcm4gaW50IHJlc2VydmVfbGFwaWNfbm1pKHZvaWQpOwotZXh0ZXJuIHZvaWQgcmVsZWFzZV9sYXBpY19ubWkodm9pZCk7Ci1leHRlcm4gdm9pZCBkaXNhYmxlX3RpbWVyX25taV93YXRjaGRvZyh2b2lkKTsKLWV4dGVybiB2b2lkIGVuYWJsZV90aW1lcl9ubWlfd2F0Y2hkb2codm9pZCk7Ci1leHRlcm4gdm9pZCBubWlfd2F0Y2hkb2dfdGljayAoc3RydWN0IHB0X3JlZ3MgKiByZWdzLCB1bnNpZ25lZCByZWFzb24pOwogZXh0ZXJuIGludCBBUElDX2luaXRfdW5pcHJvY2Vzc29yICh2b2lkKTsKIGV4dGVybiB2b2lkIGRpc2FibGVfQVBJQ190aW1lcih2b2lkKTsKIGV4dGVybiB2b2lkIGVuYWJsZV9BUElDX3RpbWVyKHZvaWQpOwogZXh0ZXJuIHZvaWQgY2x1c3RlcmVkX2FwaWNfY2hlY2sodm9pZCk7CiAKLWV4dGVybiB2b2lkIG5taV93YXRjaGRvZ19kZWZhdWx0KHZvaWQpOwotZXh0ZXJuIGludCBzZXR1cF9ubWlfd2F0Y2hkb2coY2hhciAqKTsKK2V4dGVybiB2b2lkIHNldHVwX0FQSUNfZXh0ZW5lZF9sdnQodW5zaWduZWQgY2hhciBsdnRfb2ZmLCB1bnNpZ25lZCBjaGFyIHZlY3RvciwKKwkJCQkgICB1bnNpZ25lZCBjaGFyIG1zZ190eXBlLCB1bnNpZ25lZCBjaGFyIG1hc2spOwogCi1leHRlcm4gdW5zaWduZWQgaW50IG5taV93YXRjaGRvZzsKLSNkZWZpbmUgTk1JX0RFRkFVTFQJLTEKLSNkZWZpbmUgTk1JX05PTkUJMAotI2RlZmluZSBOTUlfSU9fQVBJQwkxCi0jZGVmaW5lIE5NSV9MT0NBTF9BUElDCTIKLSNkZWZpbmUgTk1JX0lOVkFMSUQJMworI2RlZmluZSBLOF9BUElDX0VYVF9MVlRfQkFTRSAgICAweDUwMAorI2RlZmluZSBLOF9BUElDX0VYVF9JTlRfTVNHX0ZJWCAweDAKKyNkZWZpbmUgSzhfQVBJQ19FWFRfSU5UX01TR19TTUkgMHgyCisjZGVmaW5lIEs4X0FQSUNfRVhUX0lOVF9NU0dfTk1JIDB4NAorI2RlZmluZSBLOF9BUElDX0VYVF9JTlRfTVNHX0VYVCAweDcKKyNkZWZpbmUgSzhfQVBJQ19FWFRfTFZUX0VOVFJZX1RIUkVTSE9MRCAgICAwCiAKIGV4dGVybiBpbnQgZGlzYWJsZV90aW1lcl9waW5fMTsKIAotZXh0ZXJuIHZvaWQgc2V0dXBfdGhyZXNob2xkX2x2dCh1bnNpZ25lZCBsb25nIGx2dF9vZmYpOwogCiB2b2lkIHNtcF9zZW5kX3RpbWVyX2Jyb2FkY2FzdF9pcGkodm9pZCk7CiB2b2lkIHN3aXRjaF9BUElDX3RpbWVyX3RvX2lwaSh2b2lkICpjcHVtYXNrKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9hdG9taWMuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9hdG9taWMuaAppbmRleCBiZDNmYTY3Li4wMDdlODhkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvYXRvbWljLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L2F0b21pYy5oCkBAIC0xLDcgKzEsNyBAQAogI2lmbmRlZiBfX0FSQ0hfWDg2XzY0X0FUT01JQ19fCiAjZGVmaW5lIF9fQVJDSF9YODZfNjRfQVRPTUlDX18KIAotI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9hbHRlcm5hdGl2ZS5oPgogCiAvKiBhdG9taWNfdCBzaG91bGQgYmUgMzIgYml0IHNpZ25lZCB0eXBlICovCiAKQEAgLTUyLDcgKzUyLDcgQEAKIHN0YXRpYyBfX2lubGluZV9fIHZvaWQgYXRvbWljX2FkZChpbnQgaSwgYXRvbWljX3QgKnYpCiB7CiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCUxPQ0sgImFkZGwgJTEsJTAiCisJCUxPQ0tfUFJFRklYICJhZGRsICUxLCUwIgogCQk6Ij1tIiAodi0+Y291bnRlcikKIAkJOiJpciIgKGkpLCAibSIgKHYtPmNvdW50ZXIpKTsKIH0KQEAgLTY3LDcgKzY3LDcgQEAKIHN0YXRpYyBfX2lubGluZV9fIHZvaWQgYXRvbWljX3N1YihpbnQgaSwgYXRvbWljX3QgKnYpCiB7CiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCUxPQ0sgInN1YmwgJTEsJTAiCisJCUxPQ0tfUFJFRklYICJzdWJsICUxLCUwIgogCQk6Ij1tIiAodi0+Y291bnRlcikKIAkJOiJpciIgKGkpLCAibSIgKHYtPmNvdW50ZXIpKTsKIH0KQEAgLTg2LDcgKzg2LDcgQEAKIAl1bnNpZ25lZCBjaGFyIGM7CiAKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkJTE9DSyAic3VibCAlMiwlMDsgc2V0ZSAlMSIKKwkJTE9DS19QUkVGSVggInN1YmwgJTIsJTA7IHNldGUgJTEiCiAJCToiPW0iICh2LT5jb3VudGVyKSwgIj1xbSIgKGMpCiAJCToiaXIiIChpKSwgIm0iICh2LT5jb3VudGVyKSA6ICJtZW1vcnkiKTsKIAlyZXR1cm4gYzsKQEAgLTEwMSw3ICsxMDEsNyBAQAogc3RhdGljIF9faW5saW5lX18gdm9pZCBhdG9taWNfaW5jKGF0b21pY190ICp2KQogewogCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQlMT0NLICJpbmNsICUwIgorCQlMT0NLX1BSRUZJWCAiaW5jbCAlMCIKIAkJOiI9bSIgKHYtPmNvdW50ZXIpCiAJCToibSIgKHYtPmNvdW50ZXIpKTsKIH0KQEAgLTExNSw3ICsxMTUsNyBAQAogc3RhdGljIF9faW5saW5lX18gdm9pZCBhdG9taWNfZGVjKGF0b21pY190ICp2KQogewogCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQlMT0NLICJkZWNsICUwIgorCQlMT0NLX1BSRUZJWCAiZGVjbCAlMCIKIAkJOiI9bSIgKHYtPmNvdW50ZXIpCiAJCToibSIgKHYtPmNvdW50ZXIpKTsKIH0KQEAgLTEzMyw3ICsxMzMsNyBAQAogCXVuc2lnbmVkIGNoYXIgYzsKIAogCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQlMT0NLICJkZWNsICUwOyBzZXRlICUxIgorCQlMT0NLX1BSRUZJWCAiZGVjbCAlMDsgc2V0ZSAlMSIKIAkJOiI9bSIgKHYtPmNvdW50ZXIpLCAiPXFtIiAoYykKIAkJOiJtIiAodi0+Y291bnRlcikgOiAibWVtb3J5Iik7CiAJcmV0dXJuIGMgIT0gMDsKQEAgLTE1Miw3ICsxNTIsNyBAQAogCXVuc2lnbmVkIGNoYXIgYzsKIAogCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQlMT0NLICJpbmNsICUwOyBzZXRlICUxIgorCQlMT0NLX1BSRUZJWCAiaW5jbCAlMDsgc2V0ZSAlMSIKIAkJOiI9bSIgKHYtPmNvdW50ZXIpLCAiPXFtIiAoYykKIAkJOiJtIiAodi0+Y291bnRlcikgOiAibWVtb3J5Iik7CiAJcmV0dXJuIGMgIT0gMDsKQEAgLTE3Miw3ICsxNzIsNyBAQAogCXVuc2lnbmVkIGNoYXIgYzsKIAogCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQlMT0NLICJhZGRsICUyLCUwOyBzZXRzICUxIgorCQlMT0NLX1BSRUZJWCAiYWRkbCAlMiwlMDsgc2V0cyAlMSIKIAkJOiI9bSIgKHYtPmNvdW50ZXIpLCAiPXFtIiAoYykKIAkJOiJpciIgKGkpLCAibSIgKHYtPmNvdW50ZXIpIDogIm1lbW9yeSIpOwogCXJldHVybiBjOwpAQCAtMTg5LDcgKzE4OSw3IEBACiB7CiAJaW50IF9faSA9IGk7CiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCUxPQ0sgInhhZGRsICUwLCAlMTsiCisJCUxPQ0tfUFJFRklYICJ4YWRkbCAlMCwgJTE7IgogCQk6Ij1yIihpKQogCQk6Im0iKHYtPmNvdW50ZXIpLCAiMCIoaSkpOwogCXJldHVybiBpICsgX19pOwpAQCAtMjM3LDcgKzIzNyw3IEBACiBzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGF0b21pYzY0X2FkZChsb25nIGksIGF0b21pYzY0X3QgKnYpCiB7CiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCUxPQ0sgImFkZHEgJTEsJTAiCisJCUxPQ0tfUFJFRklYICJhZGRxICUxLCUwIgogCQk6Ij1tIiAodi0+Y291bnRlcikKIAkJOiJpciIgKGkpLCAibSIgKHYtPmNvdW50ZXIpKTsKIH0KQEAgLTI1Miw3ICsyNTIsNyBAQAogc3RhdGljIF9faW5saW5lX18gdm9pZCBhdG9taWM2NF9zdWIobG9uZyBpLCBhdG9taWM2NF90ICp2KQogewogCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQlMT0NLICJzdWJxICUxLCUwIgorCQlMT0NLX1BSRUZJWCAic3VicSAlMSwlMCIKIAkJOiI9bSIgKHYtPmNvdW50ZXIpCiAJCToiaXIiIChpKSwgIm0iICh2LT5jb3VudGVyKSk7CiB9CkBAIC0yNzEsNyArMjcxLDcgQEAKIAl1bnNpZ25lZCBjaGFyIGM7CiAKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkJTE9DSyAic3VicSAlMiwlMDsgc2V0ZSAlMSIKKwkJTE9DS19QUkVGSVggInN1YnEgJTIsJTA7IHNldGUgJTEiCiAJCToiPW0iICh2LT5jb3VudGVyKSwgIj1xbSIgKGMpCiAJCToiaXIiIChpKSwgIm0iICh2LT5jb3VudGVyKSA6ICJtZW1vcnkiKTsKIAlyZXR1cm4gYzsKQEAgLTI4Niw3ICsyODYsNyBAQAogc3RhdGljIF9faW5saW5lX18gdm9pZCBhdG9taWM2NF9pbmMoYXRvbWljNjRfdCAqdikKIHsKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkJTE9DSyAiaW5jcSAlMCIKKwkJTE9DS19QUkVGSVggImluY3EgJTAiCiAJCToiPW0iICh2LT5jb3VudGVyKQogCQk6Im0iICh2LT5jb3VudGVyKSk7CiB9CkBAIC0zMDAsNyArMzAwLDcgQEAKIHN0YXRpYyBfX2lubGluZV9fIHZvaWQgYXRvbWljNjRfZGVjKGF0b21pYzY0X3QgKnYpCiB7CiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCUxPQ0sgImRlY3EgJTAiCisJCUxPQ0tfUFJFRklYICJkZWNxICUwIgogCQk6Ij1tIiAodi0+Y291bnRlcikKIAkJOiJtIiAodi0+Y291bnRlcikpOwogfQpAQCAtMzE4LDcgKzMxOCw3IEBACiAJdW5zaWduZWQgY2hhciBjOwogCiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCUxPQ0sgImRlY3EgJTA7IHNldGUgJTEiCisJCUxPQ0tfUFJFRklYICJkZWNxICUwOyBzZXRlICUxIgogCQk6Ij1tIiAodi0+Y291bnRlciksICI9cW0iIChjKQogCQk6Im0iICh2LT5jb3VudGVyKSA6ICJtZW1vcnkiKTsKIAlyZXR1cm4gYyAhPSAwOwpAQCAtMzM3LDcgKzMzNyw3IEBACiAJdW5zaWduZWQgY2hhciBjOwogCiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCUxPQ0sgImluY3EgJTA7IHNldGUgJTEiCisJCUxPQ0tfUFJFRklYICJpbmNxICUwOyBzZXRlICUxIgogCQk6Ij1tIiAodi0+Y291bnRlciksICI9cW0iIChjKQogCQk6Im0iICh2LT5jb3VudGVyKSA6ICJtZW1vcnkiKTsKIAlyZXR1cm4gYyAhPSAwOwpAQCAtMzU3LDcgKzM1Nyw3IEBACiAJdW5zaWduZWQgY2hhciBjOwogCiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCUxPQ0sgImFkZHEgJTIsJTA7IHNldHMgJTEiCisJCUxPQ0tfUFJFRklYICJhZGRxICUyLCUwOyBzZXRzICUxIgogCQk6Ij1tIiAodi0+Y291bnRlciksICI9cW0iIChjKQogCQk6ImlyIiAoaSksICJtIiAodi0+Y291bnRlcikgOiAibWVtb3J5Iik7CiAJcmV0dXJuIGM7CkBAIC0zNzQsNyArMzc0LDcgQEAKIHsKIAlsb25nIF9faSA9IGk7CiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCUxPQ0sgInhhZGRxICUwLCAlMTsiCisJCUxPQ0tfUFJFRklYICJ4YWRkcSAlMCwgJTE7IgogCQk6Ij1yIihpKQogCQk6Im0iKHYtPmNvdW50ZXIpLCAiMCIoaSkpOwogCXJldHVybiBpICsgX19pOwpAQCAtNDE4LDExICs0MTgsMTEgQEAKIAogLyogVGhlc2UgYXJlIHg4Ni1zcGVjaWZpYywgdXNlZCBieSBzb21lIGhlYWRlciBmaWxlcyAqLwogI2RlZmluZSBhdG9taWNfY2xlYXJfbWFzayhtYXNrLCBhZGRyKSBcCi1fX2FzbV9fIF9fdm9sYXRpbGVfXyhMT0NLICJhbmRsICUwLCUxIiBcCitfX2FzbV9fIF9fdm9sYXRpbGVfXyhMT0NLX1BSRUZJWCAiYW5kbCAlMCwlMSIgXAogOiA6ICJyIiAofihtYXNrKSksIm0iICgqYWRkcikgOiAibWVtb3J5IikKIAogI2RlZmluZSBhdG9taWNfc2V0X21hc2sobWFzaywgYWRkcikgXAotX19hc21fXyBfX3ZvbGF0aWxlX18oTE9DSyAib3JsICUwLCUxIiBcCitfX2FzbV9fIF9fdm9sYXRpbGVfXyhMT0NLX1BSRUZJWCAib3JsICUwLCUxIiBcCiA6IDogInIiICgodW5zaWduZWQpbWFzayksIm0iICgqKGFkZHIpKSA6ICJtZW1vcnkiKQogCiAvKiBBdG9taWMgb3BlcmF0aW9ucyBhcmUgYWxyZWFkeSBzZXJpYWxpemluZyBvbiB4ODYgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9iaXRvcHMuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9iaXRvcHMuaAppbmRleCBlOWJmOTMzLi5mN2JhNTdiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvYml0b3BzLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L2JpdG9wcy5oCkBAIC01LDEyICs1LDcgQEAKICAqIENvcHlyaWdodCAxOTkyLCBMaW51cyBUb3J2YWxkcy4KICAqLwogCi0KLSNpZmRlZiBDT05GSUdfU01QCi0jZGVmaW5lIExPQ0tfUFJFRklYICJsb2NrIDsgIgotI2Vsc2UKLSNkZWZpbmUgTE9DS19QUkVGSVggIiIKLSNlbmRpZgorI2luY2x1ZGUgPGFzbS9hbHRlcm5hdGl2ZS5oPgogCiAjZGVmaW5lIEFERFIgKCoodm9sYXRpbGUgbG9uZyAqKSBhZGRyKQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvY2FsZ2FyeS5oIGIvaW5jbHVkZS9hc20teDg2XzY0L2NhbGdhcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTE2NTRmCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L2NhbGdhcnkuaApAQCAtMCwwICsxLDY2IEBACisvKgorICogRGVyaXZlZCBmcm9tIGluY2x1ZGUvYXNtLXBvd2VycGMvaW9tbXUuaAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBKb24gTWFzb24gPGpkbWFzb25AdXMuaWJtLmNvbT4sIElCTSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDA2IE11bGkgQmVuLVllaHVkYSA8bXVsaUBpbC5pYm0uY29tPiwgSUJNIENvcnBvcmF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2lmbmRlZiBfQVNNX1g4Nl82NF9DQUxHQVJZX0gKKyNkZWZpbmUgX0FTTV9YODZfNjRfQ0FMR0FSWV9ICisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisKK3N0cnVjdCBpb21tdV90YWJsZSB7CisJdW5zaWduZWQgbG9uZyAgaXRfYmFzZTsgICAgICAvKiBtYXBwZWQgYWRkcmVzcyBvZiB0Y2UgdGFibGUgKi8KKwl1bnNpZ25lZCBsb25nICBpdF9oaW50OyAgICAgIC8qIEhpbnQgZm9yIG5leHQgYWxsb2MgKi8KKwl1bnNpZ25lZCBsb25nICppdF9tYXA7ICAgICAgIC8qIEEgc2ltcGxlIGFsbG9jYXRpb24gYml0bWFwIGZvciBub3cgKi8KKwlzcGlubG9ja190ICAgICBpdF9sb2NrOyAgICAgIC8qIFByb3RlY3RzIGl0X21hcCAqLworCXVuc2lnbmVkIGludCAgIGl0X3NpemU7ICAgICAgLyogU2l6ZSBvZiBpb21tdSB0YWJsZSBpbiBlbnRyaWVzICovCisJdW5zaWduZWQgY2hhciAgaXRfYnVzbm87ICAgICAvKiBCdXMgbnVtYmVyIHRoaXMgdGFibGUgYmVsb25ncyB0byAqLworCXZvaWQgX19pb21lbSAgKmJiYXI7CisJdTY0CSAgICAgICB0YXJfdmFsOworCXN0cnVjdCB0aW1lcl9saXN0IHdhdGNoZG9nX3RpbWVyOworfTsKKworI2RlZmluZSBUQ0VfVEFCTEVfU0laRV9VTlNQRUNJRklFRAl+MAorI2RlZmluZSBUQ0VfVEFCTEVfU0laRV82NEsJCTAKKyNkZWZpbmUgVENFX1RBQkxFX1NJWkVfMTI4SwkJMQorI2RlZmluZSBUQ0VfVEFCTEVfU0laRV8yNTZLCQkyCisjZGVmaW5lIFRDRV9UQUJMRV9TSVpFXzUxMksJCTMKKyNkZWZpbmUgVENFX1RBQkxFX1NJWkVfMU0JCTQKKyNkZWZpbmUgVENFX1RBQkxFX1NJWkVfMk0JCTUKKyNkZWZpbmUgVENFX1RBQkxFX1NJWkVfNE0JCTYKKyNkZWZpbmUgVENFX1RBQkxFX1NJWkVfOE0JCTcKKworI2lmZGVmIENPTkZJR19DQUxHQVJZX0lPTU1VCitleHRlcm4gaW50IGNhbGdhcnlfaW9tbXVfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIGRldGVjdF9jYWxnYXJ5KHZvaWQpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IGNhbGdhcnlfaW9tbXVfaW5pdCh2b2lkKSB7IHJldHVybiAxOyB9CitzdGF0aWMgaW5saW5lIHZvaWQgZGV0ZWN0X2NhbGdhcnkodm9pZCkgeyByZXR1cm47IH0KKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBidXNfdG9fcGhiKHVuc2lnbmVkIGNoYXIgYnVzbm8pCit7CisJcmV0dXJuICgoYnVzbm8gJSAxNSA9PSAwKSA/IDAgOiBidXNubyAvIDIgKyAxKTsKK30KKworI2VuZGlmIC8qIF9BU01fWDg2XzY0X0NBTEdBUllfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L2NwdWZlYXR1cmUuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9jcHVmZWF0dXJlLmgKaW5kZXggNjYyOTY0Yi4uZWU3OTJmYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L2NwdWZlYXR1cmUuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvY3B1ZmVhdHVyZS5oCkBAIC00Niw2ICs0Niw3IEBACiAjZGVmaW5lIFg4Nl9GRUFUVVJFX1NZU0NBTEwJKDEqMzIrMTEpIC8qIFNZU0NBTEwvU1lTUkVUICovCiAjZGVmaW5lIFg4Nl9GRUFUVVJFX01NWEVYVAkoMSozMisyMikgLyogQU1EIE1NWCBleHRlbnNpb25zICovCiAjZGVmaW5lIFg4Nl9GRUFUVVJFX0ZYU1JfT1BUCSgxKjMyKzI1KSAvKiBGWFNSIG9wdGltaXphdGlvbnMgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfUkRUU0NQCSgxKjMyKzI3KSAvKiBSRFRTQ1AgKi8KICNkZWZpbmUgWDg2X0ZFQVRVUkVfTE0JCSgxKjMyKzI5KSAvKiBMb25nIE1vZGUgKHg4Ni02NCkgKi8KICNkZWZpbmUgWDg2X0ZFQVRVUkVfM0ROT1dFWFQJKDEqMzIrMzApIC8qIEFNRCAzRE5vdyEgZXh0ZW5zaW9ucyAqLwogI2RlZmluZSBYODZfRkVBVFVSRV8zRE5PVwkoMSozMiszMSkgLyogM0ROb3chICovCkBAIC02NSw2ICs2Niw4IEBACiAjZGVmaW5lIFg4Nl9GRUFUVVJFX0NPTlNUQU5UX1RTQyAoMyozMis1KSAvKiBUU0MgcnVucyBhdCBjb25zdGFudCByYXRlICovCiAjZGVmaW5lIFg4Nl9GRUFUVVJFX1NZTkNfUkRUU0MgICgzKjMyKzYpICAvKiBSRFRTQyBzeW5jcyBDUFUgY29yZSAqLwogI2RlZmluZSBYODZfRkVBVFVSRV9GWFNBVkVfTEVBSyAoMyozMis3KSAgLyogRklQL0ZPUC9GRFAgbGVha3MgdGhyb3VnaCBGWFNBVkUgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfVVAJCSgzKjMyKzgpIC8qIFNNUCBrZXJuZWwgcnVubmluZyBvbiBVUCAqLworI2RlZmluZSBYODZfRkVBVFVSRV9BUkNIX1BFUkZNT04gKDMqMzIrOSkgLyogSW50ZWwgQXJjaGl0ZWN0dXJhbCBQZXJmTW9uICovCiAKIC8qIEludGVsLWRlZmluZWQgQ1BVIGZlYXR1cmVzLCBDUFVJRCBsZXZlbCAweDAwMDAwMDAxIChlY3gpLCB3b3JkIDQgKi8KICNkZWZpbmUgWDg2X0ZFQVRVUkVfWE1NMwkoNCozMisgMCkgLyogU3RyZWFtaW5nIFNJTUQgRXh0ZW5zaW9ucy0zICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvZG1hLW1hcHBpbmcuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9kbWEtbWFwcGluZy5oCmluZGV4IDQ5OGY2NmQuLmI2ZGE4M2QgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9kbWEtbWFwcGluZy5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9kbWEtbWFwcGluZy5oCkBAIC01NSw2ICs1NSwxMyBAQAogZXh0ZXJuIHN0cnVjdCBkbWFfbWFwcGluZ19vcHMqIGRtYV9vcHM7CiBleHRlcm4gaW50IGlvbW11X21lcmdlOwogCitzdGF0aWMgaW5saW5lIGludCB2YWxpZF9kbWFfZGlyZWN0aW9uKGludCBkbWFfZGlyZWN0aW9uKQoreworCXJldHVybiAoKGRtYV9kaXJlY3Rpb24gPT0gRE1BX0JJRElSRUNUSU9OQUwpIHx8CisJCShkbWFfZGlyZWN0aW9uID09IERNQV9UT19ERVZJQ0UpIHx8CisJCShkbWFfZGlyZWN0aW9uID09IERNQV9GUk9NX0RFVklDRSkpOworfQorCiBzdGF0aWMgaW5saW5lIGludCBkbWFfbWFwcGluZ19lcnJvcihkbWFfYWRkcl90IGRtYV9hZGRyKQogewogCWlmIChkbWFfb3BzLT5tYXBwaW5nX2Vycm9yKQpAQCAtNzIsNiArNzksNyBAQAogZG1hX21hcF9zaW5nbGUoc3RydWN0IGRldmljZSAqaHdkZXYsIHZvaWQgKnB0ciwgc2l6ZV90IHNpemUsCiAJICAgICAgIGludCBkaXJlY3Rpb24pCiB7CisJQlVHX09OKCF2YWxpZF9kbWFfZGlyZWN0aW9uKGRpcmVjdGlvbikpOwogCXJldHVybiBkbWFfb3BzLT5tYXBfc2luZ2xlKGh3ZGV2LCBwdHIsIHNpemUsIGRpcmVjdGlvbik7CiB9CiAKQEAgLTc5LDYgKzg3LDcgQEAKIGRtYV91bm1hcF9zaW5nbGUoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGFkZHIsc2l6ZV90IHNpemUsCiAJCSBpbnQgZGlyZWN0aW9uKQogeworCUJVR19PTighdmFsaWRfZG1hX2RpcmVjdGlvbihkaXJlY3Rpb24pKTsKIAlkbWFfb3BzLT51bm1hcF9zaW5nbGUoZGV2LCBhZGRyLCBzaXplLCBkaXJlY3Rpb24pOwogfQogCkBAIC05MSw2ICsxMDAsNyBAQAogZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoc3RydWN0IGRldmljZSAqaHdkZXYsIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSwKIAkJCXNpemVfdCBzaXplLCBpbnQgZGlyZWN0aW9uKQogeworCUJVR19PTighdmFsaWRfZG1hX2RpcmVjdGlvbihkaXJlY3Rpb24pKTsKIAlpZiAoZG1hX29wcy0+c3luY19zaW5nbGVfZm9yX2NwdSkKIAkJZG1hX29wcy0+c3luY19zaW5nbGVfZm9yX2NwdShod2RldiwgZG1hX2hhbmRsZSwgc2l6ZSwKIAkJCQkJICAgICBkaXJlY3Rpb24pOwpAQCAtMTAxLDYgKzExMSw3IEBACiBkbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShzdHJ1Y3QgZGV2aWNlICpod2RldiwgZG1hX2FkZHJfdCBkbWFfaGFuZGxlLAogCQkJICAgc2l6ZV90IHNpemUsIGludCBkaXJlY3Rpb24pCiB7CisJQlVHX09OKCF2YWxpZF9kbWFfZGlyZWN0aW9uKGRpcmVjdGlvbikpOwogCWlmIChkbWFfb3BzLT5zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKQogCQlkbWFfb3BzLT5zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKGh3ZGV2LCBkbWFfaGFuZGxlLCBzaXplLAogCQkJCQkJZGlyZWN0aW9uKTsKQEAgLTExMSw2ICsxMjIsNyBAQAogZG1hX3N5bmNfc2luZ2xlX3JhbmdlX2Zvcl9jcHUoc3RydWN0IGRldmljZSAqaHdkZXYsIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSwKIAkJCSAgICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgaW50IGRpcmVjdGlvbikKIHsKKwlCVUdfT04oIXZhbGlkX2RtYV9kaXJlY3Rpb24oZGlyZWN0aW9uKSk7CiAJaWYgKGRtYV9vcHMtPnN5bmNfc2luZ2xlX3JhbmdlX2Zvcl9jcHUpIHsKIAkJZG1hX29wcy0+c3luY19zaW5nbGVfcmFuZ2VfZm9yX2NwdShod2RldiwgZG1hX2hhbmRsZSwgb2Zmc2V0LCBzaXplLCBkaXJlY3Rpb24pOwogCX0KQEAgLTEyMiw2ICsxMzQsNyBAQAogZG1hX3N5bmNfc2luZ2xlX3JhbmdlX2Zvcl9kZXZpY2Uoc3RydWN0IGRldmljZSAqaHdkZXYsIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSwKIAkJCQkgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHNpemVfdCBzaXplLCBpbnQgZGlyZWN0aW9uKQogeworCUJVR19PTighdmFsaWRfZG1hX2RpcmVjdGlvbihkaXJlY3Rpb24pKTsKIAlpZiAoZG1hX29wcy0+c3luY19zaW5nbGVfcmFuZ2VfZm9yX2RldmljZSkKIAkJZG1hX29wcy0+c3luY19zaW5nbGVfcmFuZ2VfZm9yX2RldmljZShod2RldiwgZG1hX2hhbmRsZSwKIAkJCQkJCSAgICAgIG9mZnNldCwgc2l6ZSwgZGlyZWN0aW9uKTsKQEAgLTEzMyw2ICsxNDYsNyBAQAogZG1hX3N5bmNfc2dfZm9yX2NwdShzdHJ1Y3QgZGV2aWNlICpod2Rldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKIAkJICAgIGludCBuZWxlbXMsIGludCBkaXJlY3Rpb24pCiB7CisJQlVHX09OKCF2YWxpZF9kbWFfZGlyZWN0aW9uKGRpcmVjdGlvbikpOwogCWlmIChkbWFfb3BzLT5zeW5jX3NnX2Zvcl9jcHUpCiAJCWRtYV9vcHMtPnN5bmNfc2dfZm9yX2NwdShod2Rldiwgc2csIG5lbGVtcywgZGlyZWN0aW9uKTsKIAlmbHVzaF93cml0ZV9idWZmZXJzKCk7CkBAIC0xNDIsNiArMTU2LDcgQEAKIGRtYV9zeW5jX3NnX2Zvcl9kZXZpY2Uoc3RydWN0IGRldmljZSAqaHdkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCiAJCSAgICAgICBpbnQgbmVsZW1zLCBpbnQgZGlyZWN0aW9uKQogeworCUJVR19PTighdmFsaWRfZG1hX2RpcmVjdGlvbihkaXJlY3Rpb24pKTsKIAlpZiAoZG1hX29wcy0+c3luY19zZ19mb3JfZGV2aWNlKSB7CiAJCWRtYV9vcHMtPnN5bmNfc2dfZm9yX2RldmljZShod2Rldiwgc2csIG5lbGVtcywgZGlyZWN0aW9uKTsKIAl9CkBAIC0xNTIsNiArMTY3LDcgQEAKIHN0YXRpYyBpbmxpbmUgaW50CiBkbWFfbWFwX3NnKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCBpbnQgbmVudHMsIGludCBkaXJlY3Rpb24pCiB7CisJQlVHX09OKCF2YWxpZF9kbWFfZGlyZWN0aW9uKGRpcmVjdGlvbikpOwogCXJldHVybiBkbWFfb3BzLT5tYXBfc2coaHdkZXYsIHNnLCBuZW50cywgZGlyZWN0aW9uKTsKIH0KIApAQCAtMTU5LDYgKzE3NSw3IEBACiBkbWFfdW5tYXBfc2coc3RydWN0IGRldmljZSAqaHdkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBuZW50cywKIAkgICAgIGludCBkaXJlY3Rpb24pCiB7CisJQlVHX09OKCF2YWxpZF9kbWFfZGlyZWN0aW9uKGRpcmVjdGlvbikpOwogCWRtYV9vcHMtPnVubWFwX3NnKGh3ZGV2LCBzZywgbmVudHMsIGRpcmVjdGlvbik7CiB9CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9kbWEuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9kbWEuaAppbmRleCBjNTU2MjA4Li5hMzdjMTZmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvZG1hLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L2RtYS5oCkBAIC0xLDQgKzEsNCBAQAotLyogJElkOiBkbWEuaCx2IDEuMS4xLjEgMjAwMS8wNC8xOSAyMDowMDozOCBhayBFeHAgJAorLyoKICAqIGxpbnV4L2luY2x1ZGUvYXNtL2RtYS5oOiBEZWZpbmVzIGZvciB1c2luZyBhbmQgYWxsb2NhdGluZyBkbWEgY2hhbm5lbHMuCiAgKiBXcml0dGVuIGJ5IEhlbm51cyBCZXJnbWFuLCAxOTkyLgogICogSGlnaCBETUEgY2hhbm5lbCBzdXBwb3J0ICYgaW5mbyBieSBIYW5udSBTYXZvbGFpbmVuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvZmxvcHB5LmggYi9pbmNsdWRlL2FzbS14ODZfNjQvZmxvcHB5LmgKaW5kZXggNTI4MjVjZS4uMDA2MjkxZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L2Zsb3BweS5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9mbG9wcHkuaApAQCAtMTQ3LDEwICsxNDcsOCBAQAogCQlyZXR1cm4gcmVxdWVzdF9pcnEoRkxPUFBZX0lSUSwgZmxvcHB5X2hhcmRpbnQsU0FfSU5URVJSVVBULAogCQkJCQkJICAgImZsb3BweSIsIE5VTEwpOwogCWVsc2UKLQkJcmV0dXJuIHJlcXVlc3RfaXJxKEZMT1BQWV9JUlEsIGZsb3BweV9pbnRlcnJ1cHQsCi0JCQkJCQkgICBTQV9JTlRFUlJVUFR8U0FfU0FNUExFX1JBTkRPTSwKLQkJCQkJCSAgICJmbG9wcHkiLCBOVUxMKTsJCi0KKwkJcmV0dXJuIHJlcXVlc3RfaXJxKEZMT1BQWV9JUlEsIGZsb3BweV9pbnRlcnJ1cHQsIFNBX0lOVEVSUlVQVCwKKwkJCQkgICAiZmxvcHB5IiwgTlVMTCk7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGRtYV9tZW1fYWxsb2ModW5zaWduZWQgbG9uZyBzaXplKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L2dhcnQtbWFwcGluZy5oIGIvaW5jbHVkZS9hc20teDg2XzY0L2dhcnQtbWFwcGluZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGE0OTdiLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9nYXJ0LW1hcHBpbmcuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSNpZm5kZWYgX1g4NjY0X0dBUlRfTUFQUElOR19ICi0jZGVmaW5lIF9YODY2NF9HQVJUX01BUFBJTkdfSCAxCi0KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGFzbS90eXBlcy5oPgotCi1zdHJ1Y3QgZGV2aWNlOwotCi1leHRlcm4gdm9pZCoKLWdhcnRfYWxsb2NfY29oZXJlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwKLSAgICAgICAgZG1hX2FkZHJfdCAqZG1hX2hhbmRsZSwgZ2ZwX3QgZ2ZwKTsKLQotZXh0ZXJuIGludAotZ2FydF9kbWFfc3VwcG9ydGVkKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCB1NjQgbWFzayk7Ci0KLSNlbmRpZiAvKiBfWDg2NjRfR0FSVF9NQVBQSU5HX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9ocGV0LmggYi9pbmNsdWRlL2FzbS14ODZfNjQvaHBldC5oCmluZGV4IDE4ZmY3ZWUuLmIzOTA5ODQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9ocGV0LmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L2hwZXQuaApAQCAtNTUsNyArNTUsNyBAQAogCiBleHRlcm4gaW50IGlzX2hwZXRfZW5hYmxlZCh2b2lkKTsKIGV4dGVybiBpbnQgaHBldF9ydGNfdGltZXJfaW5pdCh2b2lkKTsKLWV4dGVybiBpbnQgb2VtX2ZvcmNlX2hwZXRfdGltZXIodm9pZCk7CitleHRlcm4gaW50IGFwaWNfaXNfY2x1c3RlcmVkX2JveCh2b2lkKTsKIAogZXh0ZXJuIGludCBocGV0X3VzZV90aW1lcjsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L2h3X2lycS5oIGIvaW5jbHVkZS9hc20teDg2XzY0L2h3X2lycS5oCmluZGV4IDNkZTk2ZmQuLjFiMmFjNTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9od19pcnEuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvaHdfaXJxLmgKQEAgLTEyLDggKzEyLDYgQEAKICAqCTx0b21zb2Z0QGluZm9ybWF0aWsudHUtY2hlbW5pdHouZGU+CiAgKgogICoJaGFja2VkIGJ5IEFuZGkgS2xlZW4gZm9yIHg4Ni02NC4KLSAqIAotICogICRJZDogaHdfaXJxLmgsdiAxLjI0IDIwMDEvMDkvMTQgMjA6NTU6MDMgdm9qdGVjaCBFeHAgJAogICovCiAKICNpZm5kZWYgX19BU1NFTUJMWV9fCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvaWEzMl91bmlzdGQuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9pYTMyX3VuaXN0ZC5oCmluZGV4IGI0ZjRiMTcuLjViNTJjZTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9pYTMyX3VuaXN0ZC5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9pYTMyX3VuaXN0ZC5oCkBAIC00LDMxNyArNCwxNSBAQAogLyoKICAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgc3lzdGVtIGNhbGwgbnVtYmVycyBvZiB0aGUgaWEzMiBwb3J0LAogICogdGhpcyBpcyBmb3IgdGhlIGtlcm5lbCBvbmx5LgorICogT25seSBhZGQgc3lzY2FsbHMgaGVyZSB3aGVyZSBzb21lIHBhcnQgb2YgdGhlIGtlcm5lbCBuZWVkcyB0byBrbm93CisgKiB0aGUgbnVtYmVyLiBUaGlzIHNob3VsZCBiZSBvdGhlcndpc2UgaW4gc3luYyB3aXRoIGFzbS1pMzg2L3VuaXN0ZC5oLiAtQUsKICAqLwogCiAjZGVmaW5lIF9fTlJfaWEzMl9yZXN0YXJ0X3N5c2NhbGwgMAogI2RlZmluZSBfX05SX2lhMzJfZXhpdAkJICAxCi0jZGVmaW5lIF9fTlJfaWEzMl9mb3JrCQkgIDIKICNkZWZpbmUgX19OUl9pYTMyX3JlYWQJCSAgMwogI2RlZmluZSBfX05SX2lhMzJfd3JpdGUJCSAgNAotI2RlZmluZSBfX05SX2lhMzJfb3BlbgkJICA1Ci0jZGVmaW5lIF9fTlJfaWEzMl9jbG9zZQkJICA2Ci0jZGVmaW5lIF9fTlJfaWEzMl93YWl0cGlkCQkgIDcKLSNkZWZpbmUgX19OUl9pYTMyX2NyZWF0CQkgIDgKLSNkZWZpbmUgX19OUl9pYTMyX2xpbmsJCSAgOQotI2RlZmluZSBfX05SX2lhMzJfdW5saW5rCQkgMTAKLSNkZWZpbmUgX19OUl9pYTMyX2V4ZWN2ZQkJIDExCi0jZGVmaW5lIF9fTlJfaWEzMl9jaGRpcgkJIDEyCi0jZGVmaW5lIF9fTlJfaWEzMl90aW1lCQkgMTMKLSNkZWZpbmUgX19OUl9pYTMyX21rbm9kCQkgMTQKLSNkZWZpbmUgX19OUl9pYTMyX2NobW9kCQkgMTUKLSNkZWZpbmUgX19OUl9pYTMyX2xjaG93bgkJIDE2Ci0jZGVmaW5lIF9fTlJfaWEzMl9icmVhawkJIDE3Ci0jZGVmaW5lIF9fTlJfaWEzMl9vbGRzdGF0CQkgMTgKLSNkZWZpbmUgX19OUl9pYTMyX2xzZWVrCQkgMTkKLSNkZWZpbmUgX19OUl9pYTMyX2dldHBpZAkJIDIwCi0jZGVmaW5lIF9fTlJfaWEzMl9tb3VudAkJIDIxCi0jZGVmaW5lIF9fTlJfaWEzMl91bW91bnQJCSAyMgotI2RlZmluZSBfX05SX2lhMzJfc2V0dWlkCQkgMjMKLSNkZWZpbmUgX19OUl9pYTMyX2dldHVpZAkJIDI0Ci0jZGVmaW5lIF9fTlJfaWEzMl9zdGltZQkJIDI1Ci0jZGVmaW5lIF9fTlJfaWEzMl9wdHJhY2UJCSAyNgotI2RlZmluZSBfX05SX2lhMzJfYWxhcm0JCSAyNwotI2RlZmluZSBfX05SX2lhMzJfb2xkZnN0YXQJCSAyOAotI2RlZmluZSBfX05SX2lhMzJfcGF1c2UJCSAyOQotI2RlZmluZSBfX05SX2lhMzJfdXRpbWUJCSAzMAotI2RlZmluZSBfX05SX2lhMzJfc3R0eQkJIDMxCi0jZGVmaW5lIF9fTlJfaWEzMl9ndHR5CQkgMzIKLSNkZWZpbmUgX19OUl9pYTMyX2FjY2VzcwkJIDMzCi0jZGVmaW5lIF9fTlJfaWEzMl9uaWNlCQkgMzQKLSNkZWZpbmUgX19OUl9pYTMyX2Z0aW1lCQkgMzUKLSNkZWZpbmUgX19OUl9pYTMyX3N5bmMJCSAzNgotI2RlZmluZSBfX05SX2lhMzJfa2lsbAkJIDM3Ci0jZGVmaW5lIF9fTlJfaWEzMl9yZW5hbWUJCSAzOAotI2RlZmluZSBfX05SX2lhMzJfbWtkaXIJCSAzOQotI2RlZmluZSBfX05SX2lhMzJfcm1kaXIJCSA0MAotI2RlZmluZSBfX05SX2lhMzJfZHVwCQkgNDEKLSNkZWZpbmUgX19OUl9pYTMyX3BpcGUJCSA0MgotI2RlZmluZSBfX05SX2lhMzJfdGltZXMJCSA0MwotI2RlZmluZSBfX05SX2lhMzJfcHJvZgkJIDQ0Ci0jZGVmaW5lIF9fTlJfaWEzMl9icmsJCSA0NQotI2RlZmluZSBfX05SX2lhMzJfc2V0Z2lkCQkgNDYKLSNkZWZpbmUgX19OUl9pYTMyX2dldGdpZAkJIDQ3Ci0jZGVmaW5lIF9fTlJfaWEzMl9zaWduYWwJCSA0OAotI2RlZmluZSBfX05SX2lhMzJfZ2V0ZXVpZAkJIDQ5Ci0jZGVmaW5lIF9fTlJfaWEzMl9nZXRlZ2lkCQkgNTAKLSNkZWZpbmUgX19OUl9pYTMyX2FjY3QJCSA1MQotI2RlZmluZSBfX05SX2lhMzJfdW1vdW50MgkJIDUyCi0jZGVmaW5lIF9fTlJfaWEzMl9sb2NrCQkgNTMKLSNkZWZpbmUgX19OUl9pYTMyX2lvY3RsCQkgNTQKLSNkZWZpbmUgX19OUl9pYTMyX2ZjbnRsCQkgNTUKLSNkZWZpbmUgX19OUl9pYTMyX21weAkJIDU2Ci0jZGVmaW5lIF9fTlJfaWEzMl9zZXRwZ2lkCQkgNTcKLSNkZWZpbmUgX19OUl9pYTMyX3VsaW1pdAkJIDU4Ci0jZGVmaW5lIF9fTlJfaWEzMl9vbGRvbGR1bmFtZQkgNTkKLSNkZWZpbmUgX19OUl9pYTMyX3VtYXNrCQkgNjAKLSNkZWZpbmUgX19OUl9pYTMyX2Nocm9vdAkJIDYxCi0jZGVmaW5lIF9fTlJfaWEzMl91c3RhdAkJIDYyCi0jZGVmaW5lIF9fTlJfaWEzMl9kdXAyCQkgNjMKLSNkZWZpbmUgX19OUl9pYTMyX2dldHBwaWQJCSA2NAotI2RlZmluZSBfX05SX2lhMzJfZ2V0cGdycAkJIDY1Ci0jZGVmaW5lIF9fTlJfaWEzMl9zZXRzaWQJCSA2NgotI2RlZmluZSBfX05SX2lhMzJfc2lnYWN0aW9uCQkgNjcKLSNkZWZpbmUgX19OUl9pYTMyX3NnZXRtYXNrCQkgNjgKLSNkZWZpbmUgX19OUl9pYTMyX3NzZXRtYXNrCQkgNjkKLSNkZWZpbmUgX19OUl9pYTMyX3NldHJldWlkCQkgNzAKLSNkZWZpbmUgX19OUl9pYTMyX3NldHJlZ2lkCQkgNzEKLSNkZWZpbmUgX19OUl9pYTMyX3NpZ3N1c3BlbmQJCSA3MgotI2RlZmluZSBfX05SX2lhMzJfc2lncGVuZGluZwkJIDczCi0jZGVmaW5lIF9fTlJfaWEzMl9zZXRob3N0bmFtZQkgNzQKLSNkZWZpbmUgX19OUl9pYTMyX3NldHJsaW1pdAkJIDc1Ci0jZGVmaW5lIF9fTlJfaWEzMl9nZXRybGltaXQJCSA3NgkvKiBCYWNrIGNvbXBhdGlibGUgMkdpZyBsaW1pdGVkIHJsaW1pdCAqLwotI2RlZmluZSBfX05SX2lhMzJfZ2V0cnVzYWdlCQkgNzcKLSNkZWZpbmUgX19OUl9pYTMyX2dldHRpbWVvZmRheQkgNzgKLSNkZWZpbmUgX19OUl9pYTMyX3NldHRpbWVvZmRheQkgNzkKLSNkZWZpbmUgX19OUl9pYTMyX2dldGdyb3VwcwkJIDgwCi0jZGVmaW5lIF9fTlJfaWEzMl9zZXRncm91cHMJCSA4MQotI2RlZmluZSBfX05SX2lhMzJfc2VsZWN0CQkgODIKLSNkZWZpbmUgX19OUl9pYTMyX3N5bWxpbmsJCSA4MwotI2RlZmluZSBfX05SX2lhMzJfb2xkbHN0YXQJCSA4NAotI2RlZmluZSBfX05SX2lhMzJfcmVhZGxpbmsJCSA4NQotI2RlZmluZSBfX05SX2lhMzJfdXNlbGliCQkgODYKLSNkZWZpbmUgX19OUl9pYTMyX3N3YXBvbgkJIDg3Ci0jZGVmaW5lIF9fTlJfaWEzMl9yZWJvb3QJCSA4OAotI2RlZmluZSBfX05SX2lhMzJfcmVhZGRpcgkJIDg5Ci0jZGVmaW5lIF9fTlJfaWEzMl9tbWFwCQkgOTAKLSNkZWZpbmUgX19OUl9pYTMyX211bm1hcAkJIDkxCi0jZGVmaW5lIF9fTlJfaWEzMl90cnVuY2F0ZQkJIDkyCi0jZGVmaW5lIF9fTlJfaWEzMl9mdHJ1bmNhdGUJCSA5MwotI2RlZmluZSBfX05SX2lhMzJfZmNobW9kCQkgOTQKLSNkZWZpbmUgX19OUl9pYTMyX2ZjaG93bgkJIDk1Ci0jZGVmaW5lIF9fTlJfaWEzMl9nZXRwcmlvcml0eQkgOTYKLSNkZWZpbmUgX19OUl9pYTMyX3NldHByaW9yaXR5CSA5NwotI2RlZmluZSBfX05SX2lhMzJfcHJvZmlsCQkgOTgKLSNkZWZpbmUgX19OUl9pYTMyX3N0YXRmcwkJIDk5Ci0jZGVmaW5lIF9fTlJfaWEzMl9mc3RhdGZzCQkxMDAKLSNkZWZpbmUgX19OUl9pYTMyX2lvcGVybQkJMTAxCi0jZGVmaW5lIF9fTlJfaWEzMl9zb2NrZXRjYWxsCQkxMDIKLSNkZWZpbmUgX19OUl9pYTMyX3N5c2xvZwkJMTAzCi0jZGVmaW5lIF9fTlJfaWEzMl9zZXRpdGltZXIJCTEwNAotI2RlZmluZSBfX05SX2lhMzJfZ2V0aXRpbWVyCQkxMDUKLSNkZWZpbmUgX19OUl9pYTMyX3N0YXQJCTEwNgotI2RlZmluZSBfX05SX2lhMzJfbHN0YXQJCTEwNwotI2RlZmluZSBfX05SX2lhMzJfZnN0YXQJCTEwOAotI2RlZmluZSBfX05SX2lhMzJfb2xkdW5hbWUJCTEwOQotI2RlZmluZSBfX05SX2lhMzJfaW9wbAkJMTEwCi0jZGVmaW5lIF9fTlJfaWEzMl92aGFuZ3VwCQkxMTEKLSNkZWZpbmUgX19OUl9pYTMyX2lkbGUJCTExMgotI2RlZmluZSBfX05SX2lhMzJfdm04Nm9sZAkJMTEzCi0jZGVmaW5lIF9fTlJfaWEzMl93YWl0NAkJMTE0Ci0jZGVmaW5lIF9fTlJfaWEzMl9zd2Fwb2ZmCQkxMTUKLSNkZWZpbmUgX19OUl9pYTMyX3N5c2luZm8JCTExNgotI2RlZmluZSBfX05SX2lhMzJfaXBjCQkxMTcKLSNkZWZpbmUgX19OUl9pYTMyX2ZzeW5jCQkxMTgKLSNkZWZpbmUgX19OUl9pYTMyX3NpZ3JldHVybgkJMTE5Ci0jZGVmaW5lIF9fTlJfaWEzMl9jbG9uZQkJMTIwCi0jZGVmaW5lIF9fTlJfaWEzMl9zZXRkb21haW5uYW1lCTEyMQotI2RlZmluZSBfX05SX2lhMzJfdW5hbWUJCTEyMgotI2RlZmluZSBfX05SX2lhMzJfbW9kaWZ5X2xkdAkJMTIzCi0jZGVmaW5lIF9fTlJfaWEzMl9hZGp0aW1leAkJMTI0Ci0jZGVmaW5lIF9fTlJfaWEzMl9tcHJvdGVjdAkJMTI1Ci0jZGVmaW5lIF9fTlJfaWEzMl9zaWdwcm9jbWFzawkxMjYKLSNkZWZpbmUgX19OUl9pYTMyX2NyZWF0ZV9tb2R1bGUJMTI3Ci0jZGVmaW5lIF9fTlJfaWEzMl9pbml0X21vZHVsZQkxMjgKLSNkZWZpbmUgX19OUl9pYTMyX2RlbGV0ZV9tb2R1bGUJMTI5Ci0jZGVmaW5lIF9fTlJfaWEzMl9nZXRfa2VybmVsX3N5bXMJMTMwCi0jZGVmaW5lIF9fTlJfaWEzMl9xdW90YWN0bAkJMTMxCi0jZGVmaW5lIF9fTlJfaWEzMl9nZXRwZ2lkCQkxMzIKLSNkZWZpbmUgX19OUl9pYTMyX2ZjaGRpcgkJMTMzCi0jZGVmaW5lIF9fTlJfaWEzMl9iZGZsdXNoCQkxMzQKLSNkZWZpbmUgX19OUl9pYTMyX3N5c2ZzCQkxMzUKLSNkZWZpbmUgX19OUl9pYTMyX3BlcnNvbmFsaXR5CTEzNgotI2RlZmluZSBfX05SX2lhMzJfYWZzX3N5c2NhbGwJMTM3IC8qIFN5c2NhbGwgZm9yIEFuZHJldyBGaWxlIFN5c3RlbSAqLwotI2RlZmluZSBfX05SX2lhMzJfc2V0ZnN1aWQJCTEzOAotI2RlZmluZSBfX05SX2lhMzJfc2V0ZnNnaWQJCTEzOQotI2RlZmluZSBfX05SX2lhMzJfX2xsc2VlawkJMTQwCi0jZGVmaW5lIF9fTlJfaWEzMl9nZXRkZW50cwkJMTQxCi0jZGVmaW5lIF9fTlJfaWEzMl9fbmV3c2VsZWN0CQkxNDIKLSNkZWZpbmUgX19OUl9pYTMyX2Zsb2NrCQkxNDMKLSNkZWZpbmUgX19OUl9pYTMyX21zeW5jCQkxNDQKLSNkZWZpbmUgX19OUl9pYTMyX3JlYWR2CQkxNDUKLSNkZWZpbmUgX19OUl9pYTMyX3dyaXRldgkJMTQ2Ci0jZGVmaW5lIF9fTlJfaWEzMl9nZXRzaWQJCTE0NwotI2RlZmluZSBfX05SX2lhMzJfZmRhdGFzeW5jCQkxNDgKLSNkZWZpbmUgX19OUl9pYTMyX19zeXNjdGwJCTE0OQotI2RlZmluZSBfX05SX2lhMzJfbWxvY2sJCTE1MAotI2RlZmluZSBfX05SX2lhMzJfbXVubG9jawkJMTUxCi0jZGVmaW5lIF9fTlJfaWEzMl9tbG9ja2FsbAkJMTUyCi0jZGVmaW5lIF9fTlJfaWEzMl9tdW5sb2NrYWxsCQkxNTMKLSNkZWZpbmUgX19OUl9pYTMyX3NjaGVkX3NldHBhcmFtCQkxNTQKLSNkZWZpbmUgX19OUl9pYTMyX3NjaGVkX2dldHBhcmFtCQkxNTUKLSNkZWZpbmUgX19OUl9pYTMyX3NjaGVkX3NldHNjaGVkdWxlcgkJMTU2Ci0jZGVmaW5lIF9fTlJfaWEzMl9zY2hlZF9nZXRzY2hlZHVsZXIJCTE1NwotI2RlZmluZSBfX05SX2lhMzJfc2NoZWRfeWllbGQJCTE1OAotI2RlZmluZSBfX05SX2lhMzJfc2NoZWRfZ2V0X3ByaW9yaXR5X21heAkxNTkKLSNkZWZpbmUgX19OUl9pYTMyX3NjaGVkX2dldF9wcmlvcml0eV9taW4JMTYwCi0jZGVmaW5lIF9fTlJfaWEzMl9zY2hlZF9ycl9nZXRfaW50ZXJ2YWwJMTYxCi0jZGVmaW5lIF9fTlJfaWEzMl9uYW5vc2xlZXAJCTE2MgotI2RlZmluZSBfX05SX2lhMzJfbXJlbWFwCQkxNjMKLSNkZWZpbmUgX19OUl9pYTMyX3NldHJlc3VpZAkJMTY0Ci0jZGVmaW5lIF9fTlJfaWEzMl9nZXRyZXN1aWQJCTE2NQotI2RlZmluZSBfX05SX2lhMzJfdm04NgkJMTY2Ci0jZGVmaW5lIF9fTlJfaWEzMl9xdWVyeV9tb2R1bGUJMTY3Ci0jZGVmaW5lIF9fTlJfaWEzMl9wb2xsCQkxNjgKLSNkZWZpbmUgX19OUl9pYTMyX25mc3NlcnZjdGwJCTE2OQotI2RlZmluZSBfX05SX2lhMzJfc2V0cmVzZ2lkCQkxNzAKLSNkZWZpbmUgX19OUl9pYTMyX2dldHJlc2dpZAkJMTcxCi0jZGVmaW5lIF9fTlJfaWEzMl9wcmN0bCAgICAgICAgICAgICAgMTcyCisjZGVmaW5lIF9fTlJfaWEzMl9zaWdyZXR1cm4JMTE5CiAjZGVmaW5lIF9fTlJfaWEzMl9ydF9zaWdyZXR1cm4JMTczCi0jZGVmaW5lIF9fTlJfaWEzMl9ydF9zaWdhY3Rpb24JMTc0Ci0jZGVmaW5lIF9fTlJfaWEzMl9ydF9zaWdwcm9jbWFzawkxNzUKLSNkZWZpbmUgX19OUl9pYTMyX3J0X3NpZ3BlbmRpbmcJMTc2Ci0jZGVmaW5lIF9fTlJfaWEzMl9ydF9zaWd0aW1lZHdhaXQJMTc3Ci0jZGVmaW5lIF9fTlJfaWEzMl9ydF9zaWdxdWV1ZWluZm8JMTc4Ci0jZGVmaW5lIF9fTlJfaWEzMl9ydF9zaWdzdXNwZW5kCTE3OQotI2RlZmluZSBfX05SX2lhMzJfcHJlYWQJCTE4MAotI2RlZmluZSBfX05SX2lhMzJfcHdyaXRlCQkxODEKLSNkZWZpbmUgX19OUl9pYTMyX2Nob3duCQkxODIKLSNkZWZpbmUgX19OUl9pYTMyX2dldGN3ZAkJMTgzCi0jZGVmaW5lIF9fTlJfaWEzMl9jYXBnZXQJCTE4NAotI2RlZmluZSBfX05SX2lhMzJfY2Fwc2V0CQkxODUKLSNkZWZpbmUgX19OUl9pYTMyX3NpZ2FsdHN0YWNrCTE4NgotI2RlZmluZSBfX05SX2lhMzJfc2VuZGZpbGUJCTE4NwotI2RlZmluZSBfX05SX2lhMzJfZ2V0cG1zZwkJMTg4CS8qIHNvbWUgcGVvcGxlIGFjdHVhbGx5IHdhbnQgc3RyZWFtcyAqLwotI2RlZmluZSBfX05SX2lhMzJfcHV0cG1zZwkJMTg5CS8qIHNvbWUgcGVvcGxlIGFjdHVhbGx5IHdhbnQgc3RyZWFtcyAqLwotI2RlZmluZSBfX05SX2lhMzJfdmZvcmsJCTE5MAotI2RlZmluZSBfX05SX2lhMzJfdWdldHJsaW1pdAkJMTkxCS8qIFN1UyBjb21wbGlhbnQgZ2V0cmxpbWl0ICovCi0jZGVmaW5lIF9fTlJfaWEzMl9tbWFwMgkJMTkyCi0jZGVmaW5lIF9fTlJfaWEzMl90cnVuY2F0ZTY0CQkxOTMKLSNkZWZpbmUgX19OUl9pYTMyX2Z0cnVuY2F0ZTY0CTE5NAotI2RlZmluZSBfX05SX2lhMzJfc3RhdDY0CQkxOTUKLSNkZWZpbmUgX19OUl9pYTMyX2xzdGF0NjQJCTE5NgotI2RlZmluZSBfX05SX2lhMzJfZnN0YXQ2NAkJMTk3Ci0jZGVmaW5lIF9fTlJfaWEzMl9sY2hvd24zMgkJMTk4Ci0jZGVmaW5lIF9fTlJfaWEzMl9nZXR1aWQzMgkJMTk5Ci0jZGVmaW5lIF9fTlJfaWEzMl9nZXRnaWQzMgkJMjAwCi0jZGVmaW5lIF9fTlJfaWEzMl9nZXRldWlkMzIJCTIwMQotI2RlZmluZSBfX05SX2lhMzJfZ2V0ZWdpZDMyCQkyMDIKLSNkZWZpbmUgX19OUl9pYTMyX3NldHJldWlkMzIJCTIwMwotI2RlZmluZSBfX05SX2lhMzJfc2V0cmVnaWQzMgkJMjA0Ci0jZGVmaW5lIF9fTlJfaWEzMl9nZXRncm91cHMzMgkyMDUKLSNkZWZpbmUgX19OUl9pYTMyX3NldGdyb3VwczMyCTIwNgotI2RlZmluZSBfX05SX2lhMzJfZmNob3duMzIJCTIwNwotI2RlZmluZSBfX05SX2lhMzJfc2V0cmVzdWlkMzIJMjA4Ci0jZGVmaW5lIF9fTlJfaWEzMl9nZXRyZXN1aWQzMgkyMDkKLSNkZWZpbmUgX19OUl9pYTMyX3NldHJlc2dpZDMyCTIxMAotI2RlZmluZSBfX05SX2lhMzJfZ2V0cmVzZ2lkMzIJMjExCi0jZGVmaW5lIF9fTlJfaWEzMl9jaG93bjMyCQkyMTIKLSNkZWZpbmUgX19OUl9pYTMyX3NldHVpZDMyCQkyMTMKLSNkZWZpbmUgX19OUl9pYTMyX3NldGdpZDMyCQkyMTQKLSNkZWZpbmUgX19OUl9pYTMyX3NldGZzdWlkMzIJCTIxNQotI2RlZmluZSBfX05SX2lhMzJfc2V0ZnNnaWQzMgkJMjE2Ci0jZGVmaW5lIF9fTlJfaWEzMl9waXZvdF9yb290CQkyMTcKLSNkZWZpbmUgX19OUl9pYTMyX21pbmNvcmUJCTIxOAotI2RlZmluZSBfX05SX2lhMzJfbWFkdmlzZQkJMjE5Ci0jZGVmaW5lIF9fTlJfaWEzMl9tYWR2aXNlMQkJMjE5CS8qIGRlbGV0ZSB3aGVuIEMgbGliIHN0dWIgaXMgcmVtb3ZlZCAqLwotI2RlZmluZSBfX05SX2lhMzJfZ2V0ZGVudHM2NAkJMjIwCi0jZGVmaW5lIF9fTlJfaWEzMl9mY250bDY0CQkyMjEKLSNkZWZpbmUgX19OUl9pYTMyX3R1eGNhbGwJCTIyMgotI2RlZmluZSBfX05SX2lhMzJfc2VjdXJpdHkJCTIyMwotI2RlZmluZSBfX05SX2lhMzJfZ2V0dGlkCQkyMjQKLSNkZWZpbmUgX19OUl9pYTMyX3JlYWRhaGVhZAkJMjI1Ci0jZGVmaW5lIF9fTlJfaWEzMl9zZXR4YXR0cgkJMjI2Ci0jZGVmaW5lIF9fTlJfaWEzMl9sc2V0eGF0dHIJCTIyNwotI2RlZmluZSBfX05SX2lhMzJfZnNldHhhdHRyCQkyMjgKLSNkZWZpbmUgX19OUl9pYTMyX2dldHhhdHRyCQkyMjkKLSNkZWZpbmUgX19OUl9pYTMyX2xnZXR4YXR0cgkJMjMwCi0jZGVmaW5lIF9fTlJfaWEzMl9mZ2V0eGF0dHIJCTIzMQotI2RlZmluZSBfX05SX2lhMzJfbGlzdHhhdHRyCQkyMzIKLSNkZWZpbmUgX19OUl9pYTMyX2xsaXN0eGF0dHIJCTIzMwotI2RlZmluZSBfX05SX2lhMzJfZmxpc3R4YXR0cgkJMjM0Ci0jZGVmaW5lIF9fTlJfaWEzMl9yZW1vdmV4YXR0cgkyMzUKLSNkZWZpbmUgX19OUl9pYTMyX2xyZW1vdmV4YXR0cgkyMzYKLSNkZWZpbmUgX19OUl9pYTMyX2ZyZW1vdmV4YXR0cgkyMzcKLSNkZWZpbmUgX19OUl9pYTMyX3RraWxsCQkyMzgKLSNkZWZpbmUgX19OUl9pYTMyX3NlbmRmaWxlNjQJCTIzOQotI2RlZmluZSBfX05SX2lhMzJfZnV0ZXgJCTI0MAotI2RlZmluZSBfX05SX2lhMzJfc2NoZWRfc2V0YWZmaW5pdHkJMjQxCi0jZGVmaW5lIF9fTlJfaWEzMl9zY2hlZF9nZXRhZmZpbml0eQkyNDIKLSNkZWZpbmUgX19OUl9pYTMyX3NldF90aHJlYWRfYXJlYSAgIDI0MwotI2RlZmluZSBfX05SX2lhMzJfZ2V0X3RocmVhZF9hcmVhCTI0NAotI2RlZmluZSBfX05SX2lhMzJfaW9fc2V0dXAJCTI0NQotI2RlZmluZSBfX05SX2lhMzJfaW9fZGVzdHJveQkJMjQ2Ci0jZGVmaW5lIF9fTlJfaWEzMl9pb19nZXRldmVudHMJMjQ3Ci0jZGVmaW5lIF9fTlJfaWEzMl9pb19zdWJtaXQJCTI0OAotI2RlZmluZSBfX05SX2lhMzJfaW9fY2FuY2VsCQkyNDkKLSNkZWZpbmUgX19OUl9pYTMyX2V4aXRfZ3JvdXAJCTI1MgotI2RlZmluZSBfX05SX2lhMzJfbG9va3VwX2Rjb29raWUJMjUzCi0jZGVmaW5lIF9fTlJfaWEzMl9zeXNfZXBvbGxfY3JlYXRlCTI1NAotI2RlZmluZSBfX05SX2lhMzJfc3lzX2Vwb2xsX2N0bAkyNTUKLSNkZWZpbmUgX19OUl9pYTMyX3N5c19lcG9sbF93YWl0CTI1NgotI2RlZmluZSBfX05SX2lhMzJfcmVtYXBfZmlsZV9wYWdlcwkyNTcKLSNkZWZpbmUgX19OUl9pYTMyX3NldF90aWRfYWRkcmVzcwkyNTgKLSNkZWZpbmUgX19OUl9pYTMyX3RpbWVyX2NyZWF0ZQkJMjU5Ci0jZGVmaW5lIF9fTlJfaWEzMl90aW1lcl9zZXR0aW1lCShfX05SX2lhMzJfdGltZXJfY3JlYXRlKzEpCi0jZGVmaW5lIF9fTlJfaWEzMl90aW1lcl9nZXR0aW1lCShfX05SX2lhMzJfdGltZXJfY3JlYXRlKzIpCi0jZGVmaW5lIF9fTlJfaWEzMl90aW1lcl9nZXRvdmVycnVuCShfX05SX2lhMzJfdGltZXJfY3JlYXRlKzMpCi0jZGVmaW5lIF9fTlJfaWEzMl90aW1lcl9kZWxldGUJKF9fTlJfaWEzMl90aW1lcl9jcmVhdGUrNCkKLSNkZWZpbmUgX19OUl9pYTMyX2Nsb2NrX3NldHRpbWUJKF9fTlJfaWEzMl90aW1lcl9jcmVhdGUrNSkKLSNkZWZpbmUgX19OUl9pYTMyX2Nsb2NrX2dldHRpbWUJKF9fTlJfaWEzMl90aW1lcl9jcmVhdGUrNikKLSNkZWZpbmUgX19OUl9pYTMyX2Nsb2NrX2dldHJlcwkoX19OUl9pYTMyX3RpbWVyX2NyZWF0ZSs3KQotI2RlZmluZSBfX05SX2lhMzJfY2xvY2tfbmFub3NsZWVwCShfX05SX2lhMzJfdGltZXJfY3JlYXRlKzgpCi0jZGVmaW5lIF9fTlJfaWEzMl9zdGF0ZnM2NAkJMjY4Ci0jZGVmaW5lIF9fTlJfaWEzMl9mc3RhdGZzNjQJCTI2OQotI2RlZmluZSBfX05SX2lhMzJfdGdraWxsCQkyNzAKLSNkZWZpbmUgX19OUl9pYTMyX3V0aW1lcwkJMjcxCi0jZGVmaW5lIF9fTlJfaWEzMl9mYWR2aXNlNjRfNjQJCTI3MgotI2RlZmluZSBfX05SX2lhMzJfdnNlcnZlcgkJMjczCi0jZGVmaW5lIF9fTlJfaWEzMl9tYmluZAkJMjc0Ci0jZGVmaW5lIF9fTlJfaWEzMl9nZXRfbWVtcG9saWN5CTI3NQotI2RlZmluZSBfX05SX2lhMzJfc2V0X21lbXBvbGljeQkyNzYKLSNkZWZpbmUgX19OUl9pYTMyX21xX29wZW4gCQkyNzcKLSNkZWZpbmUgX19OUl9pYTMyX21xX3VubGluawkJKF9fTlJfaWEzMl9tcV9vcGVuKzEpCi0jZGVmaW5lIF9fTlJfaWEzMl9tcV90aW1lZHNlbmQJKF9fTlJfaWEzMl9tcV9vcGVuKzIpCi0jZGVmaW5lIF9fTlJfaWEzMl9tcV90aW1lZHJlY2VpdmUJKF9fTlJfaWEzMl9tcV9vcGVuKzMpCi0jZGVmaW5lIF9fTlJfaWEzMl9tcV9ub3RpZnkJCShfX05SX2lhMzJfbXFfb3Blbis0KQotI2RlZmluZSBfX05SX2lhMzJfbXFfZ2V0c2V0YXR0cgkoX19OUl9pYTMyX21xX29wZW4rNSkKLSNkZWZpbmUgX19OUl9pYTMyX2tleGVjCQkyODMKLSNkZWZpbmUgX19OUl9pYTMyX3dhaXRpZAkJMjg0Ci0vKiAjZGVmaW5lIF9fTlJfc3lzX3NldGFsdHJvb3QJMjg1ICovCi0jZGVmaW5lIF9fTlJfaWEzMl9hZGRfa2V5CQkyODYKLSNkZWZpbmUgX19OUl9pYTMyX3JlcXVlc3Rfa2V5CTI4NwotI2RlZmluZSBfX05SX2lhMzJfa2V5Y3RsCQkyODgKLSNkZWZpbmUgX19OUl9pYTMyX2lvcHJpb19zZXQJCTI4OQotI2RlZmluZSBfX05SX2lhMzJfaW9wcmlvX2dldAkJMjkwCi0jZGVmaW5lIF9fTlJfaWEzMl9pbm90aWZ5X2luaXQJCTI5MQotI2RlZmluZSBfX05SX2lhMzJfaW5vdGlmeV9hZGRfd2F0Y2gJMjkyCi0jZGVmaW5lIF9fTlJfaWEzMl9pbm90aWZ5X3JtX3dhdGNoCTI5MwotI2RlZmluZSBfX05SX2lhMzJfbWlncmF0ZV9wYWdlcwkJMjk0Ci0jZGVmaW5lIF9fTlJfaWEzMl9vcGVuYXQJCTI5NQotI2RlZmluZSBfX05SX2lhMzJfbWtkaXJhdAkJMjk2Ci0jZGVmaW5lIF9fTlJfaWEzMl9ta25vZGF0CQkyOTcKLSNkZWZpbmUgX19OUl9pYTMyX2ZjaG93bmF0CQkyOTgKLSNkZWZpbmUgX19OUl9pYTMyX2Z1dGltZXNhdAkJMjk5Ci0jZGVmaW5lIF9fTlJfaWEzMl9mc3RhdGF0NjQJCTMwMAotI2RlZmluZSBfX05SX2lhMzJfdW5saW5rYXQJCTMwMQotI2RlZmluZSBfX05SX2lhMzJfcmVuYW1lYXQJCTMwMgotI2RlZmluZSBfX05SX2lhMzJfbGlua2F0CQkzMDMKLSNkZWZpbmUgX19OUl9pYTMyX3N5bWxpbmthdAkJMzA0Ci0jZGVmaW5lIF9fTlJfaWEzMl9yZWFkbGlua2F0CQkzMDUKLSNkZWZpbmUgX19OUl9pYTMyX2ZjaG1vZGF0CQkzMDYKLSNkZWZpbmUgX19OUl9pYTMyX2ZhY2Nlc3NhdAkJMzA3Ci0jZGVmaW5lIF9fTlJfaWEzMl9wc2VsZWN0NgkJMzA4Ci0jZGVmaW5lIF9fTlJfaWEzMl9wcG9sbAkJCTMwOQotI2RlZmluZSBfX05SX2lhMzJfdW5zaGFyZQkJMzEwCiAKICNlbmRpZiAvKiBfQVNNX1g4Nl82NF9JQTMyX1VOSVNURF9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L2ludGVsX2FyY2hfcGVyZm1vbi5oIGIvaW5jbHVkZS9hc20teDg2XzY0L2ludGVsX2FyY2hfcGVyZm1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5YzM5NjQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvaW50ZWxfYXJjaF9wZXJmbW9uLmgKQEAgLTAsMCArMSwxOSBAQAorI2lmbmRlZiBYODZfNjRfSU5URUxfQVJDSF9QRVJGTU9OX0gKKyNkZWZpbmUgWDg2XzY0X0lOVEVMX0FSQ0hfUEVSRk1PTl9IIDEKKworI2RlZmluZSBNU1JfQVJDSF9QRVJGTU9OX1BFUkZDVFIwCQkweGMxCisjZGVmaW5lIE1TUl9BUkNIX1BFUkZNT05fUEVSRkNUUjEJCTB4YzIKKworI2RlZmluZSBNU1JfQVJDSF9QRVJGTU9OX0VWRU5UU0VMMAkJMHgxODYKKyNkZWZpbmUgTVNSX0FSQ0hfUEVSRk1PTl9FVkVOVFNFTDEJCTB4MTg3CisKKyNkZWZpbmUgQVJDSF9QRVJGTU9OX0VWRU5UU0VMMF9FTkFCTEUgICAgICAoMSA8PCAyMikKKyNkZWZpbmUgQVJDSF9QRVJGTU9OX0VWRU5UU0VMX0lOVCAgICAgICAgICAoMSA8PCAyMCkKKyNkZWZpbmUgQVJDSF9QRVJGTU9OX0VWRU5UU0VMX09TICAgICAgICAgICAoMSA8PCAxNykKKyNkZWZpbmUgQVJDSF9QRVJGTU9OX0VWRU5UU0VMX1VTUiAgICAgICAgICAoMSA8PCAxNikKKworI2RlZmluZSBBUkNIX1BFUkZNT05fVU5IQUxURURfQ09SRV9DWUNMRVNfU0VMCSgweDNjKQorI2RlZmluZSBBUkNIX1BFUkZNT05fVU5IQUxURURfQ09SRV9DWUNMRVNfVU1BU0sJKDB4MDAgPDwgOCkKKyNkZWZpbmUgQVJDSF9QRVJGTU9OX1VOSEFMVEVEX0NPUkVfQ1lDTEVTX1BSRVNFTlQgKDEgPDwgMCkKKworI2VuZGlmCS8qIFg4Nl82NF9JTlRFTF9BUkNIX1BFUkZNT05fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L2s4LmggYi9pbmNsdWRlL2FzbS14ODZfNjQvazguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTlkZDY5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L2s4LmgKQEAgLTAsMCArMSwxNCBAQAorI2lmbmRlZiBfQVNNX0s4X0gKKyNkZWZpbmUgX0FTTV9LOF9IIDEKKworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorCitleHRlcm4gc3RydWN0IHBjaV9kZXZpY2VfaWQgazhfbmJfaWRzW107CisKK2V4dGVybiBpbnQgZWFybHlfaXNfazhfbmIodTMyIHZhbHVlKTsKK2V4dGVybiBzdHJ1Y3QgcGNpX2RldiAqKms4X25vcnRoYnJpZGdlczsKK2V4dGVybiBpbnQgbnVtX2s4X25vcnRoYnJpZGdlczsKK2V4dGVybiBpbnQgY2FjaGVfazhfbm9ydGhicmlkZ2VzKHZvaWQpOworZXh0ZXJuIHZvaWQgazhfZmx1c2hfZ2FydHModm9pZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L2tkZWJ1Zy5oIGIvaW5jbHVkZS9hc20teDg2XzY0L2tkZWJ1Zy5oCmluZGV4IGNmNzk1NjMuLmNkNTJjN2YgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9rZGVidWcuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQva2RlYnVnLmgKQEAgLTE1LDYgKzE1LDggQEAKIAogZXh0ZXJuIGludCByZWdpc3Rlcl9kaWVfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICopOwogZXh0ZXJuIGludCB1bnJlZ2lzdGVyX2RpZV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKik7CitleHRlcm4gaW50IHJlZ2lzdGVyX3BhZ2VfZmF1bHRfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICopOworZXh0ZXJuIGludCB1bnJlZ2lzdGVyX3BhZ2VfZmF1bHRfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICopOwogZXh0ZXJuIHN0cnVjdCBhdG9taWNfbm90aWZpZXJfaGVhZCBkaWVfY2hhaW47CiAKIC8qIEdyb3NzbHkgbWlzbmFtZWQuICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQva3Byb2Jlcy5oIGIvaW5jbHVkZS9hc20teDg2XzY0L2twcm9iZXMuaAppbmRleCA5OGExZTk1ZC4uZDM2ZmViZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L2twcm9iZXMuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQva3Byb2Jlcy5oCkBAIC00Myw2ICs0Myw3IEBACiAKICNkZWZpbmUgSlBST0JFX0VOVFJZKHBlbnRyeSkJKGtwcm9iZV9vcGNvZGVfdCAqKXBlbnRyeQogI2RlZmluZSBBUkNIX1NVUFBPUlRTX0tSRVRQUk9CRVMKKyNkZWZpbmUgIEFSQ0hfSU5BQ1RJVkVfS1BST0JFX0NPVU5UIDEKIAogdm9pZCBrcmV0cHJvYmVfdHJhbXBvbGluZSh2b2lkKTsKIGV4dGVybiB2b2lkIGFyY2hfcmVtb3ZlX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9sb2NhbC5oIGIvaW5jbHVkZS9hc20teDg2XzY0L2xvY2FsLmgKaW5kZXggY2QxNzk0NS4uZTc2OWU2MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L2xvY2FsLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L2xvY2FsLmgKQEAgLTU5LDEyICs1OSwyNiBAQAogICogVGhpcyBjb3VsZCBiZSBkb25lIGJldHRlciBpZiB3ZSBtb3ZlZCB0aGUgcGVyIGNwdSBkYXRhIGRpcmVjdGx5CiAgKiBhZnRlciBHUy4KICAqLwotI2RlZmluZSBjcHVfbG9jYWxfcmVhZCh2KQlsb2NhbF9yZWFkKCZfX2dldF9jcHVfdmFyKHYpKQotI2RlZmluZSBjcHVfbG9jYWxfc2V0KHYsIGkpCWxvY2FsX3NldCgmX19nZXRfY3B1X3Zhcih2KSwgKGkpKQotI2RlZmluZSBjcHVfbG9jYWxfaW5jKHYpCWxvY2FsX2luYygmX19nZXRfY3B1X3Zhcih2KSkKLSNkZWZpbmUgY3B1X2xvY2FsX2RlYyh2KQlsb2NhbF9kZWMoJl9fZ2V0X2NwdV92YXIodikpCi0jZGVmaW5lIGNwdV9sb2NhbF9hZGQoaSwgdikJbG9jYWxfYWRkKChpKSwgJl9fZ2V0X2NwdV92YXIodikpCi0jZGVmaW5lIGNwdV9sb2NhbF9zdWIoaSwgdikJbG9jYWxfc3ViKChpKSwgJl9fZ2V0X2NwdV92YXIodikpCisKKy8qIE5lZWQgdG8gZGlzYWJsZSBwcmVlbXB0aW9uIGZvciB0aGUgY3B1IGxvY2FsIGNvdW50ZXJzIG90aGVyd2lzZSB3ZSBjb3VsZAorICAgc3RpbGwgYWNjZXNzIGEgdmFyaWFibGUgb2YgYSBwcmV2aW91cyBDUFUgaW4gYSBub24gYXRvbWljIHdheS4gKi8KKyNkZWZpbmUgY3B1X2xvY2FsX3dyYXBfdih2KQkgCVwKKwkoeyBsb2NhbF90IHJlc19fOwkJXAorCSAgIHByZWVtcHRfZGlzYWJsZSgpOyAJCVwKKwkgICByZXNfXyA9ICh2KTsJCQlcCisJICAgcHJlZW1wdF9lbmFibGUoKTsJCVwKKwkgICByZXNfXzsgfSkKKyNkZWZpbmUgY3B1X2xvY2FsX3dyYXAodikJCVwKKwkoeyBwcmVlbXB0X2Rpc2FibGUoKTsJCVwKKwkgICB2OwkJCQlcCisJICAgcHJlZW1wdF9lbmFibGUoKTsgfSkJCVwKKworI2RlZmluZSBjcHVfbG9jYWxfcmVhZCh2KSAgICBjcHVfbG9jYWxfd3JhcF92KGxvY2FsX3JlYWQoJl9fZ2V0X2NwdV92YXIodikpKQorI2RlZmluZSBjcHVfbG9jYWxfc2V0KHYsIGkpICBjcHVfbG9jYWxfd3JhcChsb2NhbF9zZXQoJl9fZ2V0X2NwdV92YXIodiksIChpKSkpCisjZGVmaW5lIGNwdV9sb2NhbF9pbmModikgICAgIGNwdV9sb2NhbF93cmFwKGxvY2FsX2luYygmX19nZXRfY3B1X3Zhcih2KSkpCisjZGVmaW5lIGNwdV9sb2NhbF9kZWModikgICAgIGNwdV9sb2NhbF93cmFwKGxvY2FsX2RlYygmX19nZXRfY3B1X3Zhcih2KSkpCisjZGVmaW5lIGNwdV9sb2NhbF9hZGQoaSwgdikgIGNwdV9sb2NhbF93cmFwKGxvY2FsX2FkZCgoaSksICZfX2dldF9jcHVfdmFyKHYpKSkKKyNkZWZpbmUgY3B1X2xvY2FsX3N1YihpLCB2KSAgY3B1X2xvY2FsX3dyYXAobG9jYWxfc3ViKChpKSwgJl9fZ2V0X2NwdV92YXIodikpKQogCiAjZGVmaW5lIF9fY3B1X2xvY2FsX2luYyh2KQljcHVfbG9jYWxfaW5jKHYpCiAjZGVmaW5lIF9fY3B1X2xvY2FsX2RlYyh2KQljcHVfbG9jYWxfZGVjKHYpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvbWNlLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvbWNlLmgKaW5kZXggNzIyOTc4NS4uZDEzNjg3ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L21jZS5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9tY2UuaApAQCAtNjcsMTMgKzY3LDIyIEBACiAvKiBTb2Z0d2FyZSBkZWZpbmVkIGJhbmtzICovCiAjZGVmaW5lIE1DRV9FWFRFTkRFRF9CQU5LCTEyOAogI2RlZmluZSBNQ0VfVEhFUk1BTF9CQU5LCU1DRV9FWFRFTkRFRF9CQU5LICsgMAotI2RlZmluZSBNQ0VfVEhSRVNIT0xEX0JBU0UgICAgICBNQ0VfRVhURU5ERURfQkFOSyArIDEgLyogTUNFX0FNRCAqLwotI2RlZmluZSBNQ0VfVEhSRVNIT0xEX0RSQU1fRUNDICBNQ0VfVEhSRVNIT0xEX0JBU0UgKyA0CisKKyNkZWZpbmUgSzhfTUNFX1RIUkVTSE9MRF9CQVNFICAgICAgKE1DRV9FWFRFTkRFRF9CQU5LICsgMSkgICAgICAvKiBNQ0VfQU1EICovCisjZGVmaW5lIEs4X01DRV9USFJFU0hPTERfQkFOS18wICAgIChNQ0VfVEhSRVNIT0xEX0JBU0UgKyAwICogOSkKKyNkZWZpbmUgSzhfTUNFX1RIUkVTSE9MRF9CQU5LXzEgICAgKE1DRV9USFJFU0hPTERfQkFTRSArIDEgKiA5KQorI2RlZmluZSBLOF9NQ0VfVEhSRVNIT0xEX0JBTktfMiAgICAoTUNFX1RIUkVTSE9MRF9CQVNFICsgMiAqIDkpCisjZGVmaW5lIEs4X01DRV9USFJFU0hPTERfQkFOS18zICAgIChNQ0VfVEhSRVNIT0xEX0JBU0UgKyAzICogOSkKKyNkZWZpbmUgSzhfTUNFX1RIUkVTSE9MRF9CQU5LXzQgICAgKE1DRV9USFJFU0hPTERfQkFTRSArIDQgKiA5KQorI2RlZmluZSBLOF9NQ0VfVEhSRVNIT0xEX0JBTktfNSAgICAoTUNFX1RIUkVTSE9MRF9CQVNFICsgNSAqIDkpCisjZGVmaW5lIEs4X01DRV9USFJFU0hPTERfRFJBTV9FQ0MgIChNQ0VfVEhSRVNIT0xEX0JBTktfNCArIDApCiAKICNpZmRlZiBfX0tFUk5FTF9fCiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogCiB2b2lkIG1jZV9sb2coc3RydWN0IG1jZSAqbSk7CitERUNMQVJFX1BFUl9DUFUoc3RydWN0IHN5c19kZXZpY2UsIGRldmljZV9tY2UpOworCiAjaWZkZWYgQ09ORklHX1g4Nl9NQ0VfSU5URUwKIHZvaWQgbWNlX2ludGVsX2ZlYXR1cmVfaW5pdChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpOwogI2Vsc2UKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9tdXRleC5oIGIvaW5jbHVkZS9hc20teDg2XzY0L211dGV4LmgKaW5kZXggMTFmYmVlMi4uMDZmYWI2ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L211dGV4LmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L211dGV4LmgKQEAgLTI0LDcgKzI0LDcgQEAKIAl0eXBlY2hlY2tfZm4oZmFzdGNhbGwgdm9pZCAoKikoYXRvbWljX3QgKiksIGZhaWxfZm4pOwkJXAogCQkJCQkJCQkJXAogCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJCVwKLQkJTE9DSwkiICAgZGVjbCAoJSVyZGkpCVxuIgkJCVwKKwkJTE9DS19QUkVGSVggIiAgIGRlY2wgKCUlcmRpKQlcbiIJCQlcCiAJCQkiICAganMgMmYJCVxuIgkJCVwKIAkJCSIxOgkJCVxuIgkJCVwKIAkJCQkJCQkJCVwKQEAgLTc0LDcgKzc0LDcgQEAKIAl0eXBlY2hlY2tfZm4oZmFzdGNhbGwgdm9pZCAoKikoYXRvbWljX3QgKiksIGZhaWxfZm4pOwkJXAogCQkJCQkJCQkJXAogCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJCVwKLQkJTE9DSwkiICAgaW5jbCAoJSVyZGkpCVxuIgkJCVwKKwkJTE9DS19QUkVGSVggIiAgIGluY2wgKCUlcmRpKQlcbiIJCQlcCiAJCQkiICAgamxlIDJmCQlcbiIJCQlcCiAJCQkiMToJCQlcbiIJCQlcCiAJCQkJCQkJCQlcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvbm1pLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvbm1pLmgKaW5kZXggZDNhYmZjNi4uZWZiNDVjOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L25taS5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9ubWkuaApAQCAtNSwyNiArNSwyNyBAQAogI2RlZmluZSBBU01fTk1JX0gKIAogI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CiAgCiBzdHJ1Y3QgcHRfcmVnczsKLSAKKwogdHlwZWRlZiBpbnQgKCpubWlfY2FsbGJhY2tfdCkoc3RydWN0IHB0X3JlZ3MgKiByZWdzLCBpbnQgY3B1KTsKLSAKLS8qKiAKKworLyoqCiAgKiBzZXRfbm1pX2NhbGxiYWNrCiAgKgogICogU2V0IGEgaGFuZGxlciBmb3IgYW4gTk1JLiBPbmx5IG9uZSBoYW5kbGVyIG1heSBiZQogICogc2V0LiBSZXR1cm4gMSBpZiB0aGUgTk1JIHdhcyBoYW5kbGVkLgogICovCiB2b2lkIHNldF9ubWlfY2FsbGJhY2sobm1pX2NhbGxiYWNrX3QgY2FsbGJhY2spOwotIAotLyoqIAorCisvKioKICAqIHVuc2V0X25taV9jYWxsYmFjawogICoKICAqIFJlbW92ZSB0aGUgaGFuZGxlciBwcmV2aW91c2x5IHNldC4KICAqLwogdm9pZCB1bnNldF9ubWlfY2FsbGJhY2sodm9pZCk7Ci0gCisKICNpZmRlZiBDT05GSUdfUE0KICAKIC8qKiBSZXBsYWNlIHRoZSBQTSBjYWxsYmFjayByb3V0aW5lIGZvciBOTUkuICovCkBAIC01Niw0ICs1NywyMSBAQAogCiBleHRlcm4gaW50IGNoZWNrX25taV93YXRjaGRvZyh2b2lkKTsKICAKK2V4dGVybiB2b2lkIHNldHVwX2FwaWNfbm1pX3dhdGNoZG9nICh2b2lkKTsKK2V4dGVybiBpbnQgcmVzZXJ2ZV9sYXBpY19ubWkodm9pZCk7CitleHRlcm4gdm9pZCByZWxlYXNlX2xhcGljX25taSh2b2lkKTsKK2V4dGVybiB2b2lkIGRpc2FibGVfdGltZXJfbm1pX3dhdGNoZG9nKHZvaWQpOworZXh0ZXJuIHZvaWQgZW5hYmxlX3RpbWVyX25taV93YXRjaGRvZyh2b2lkKTsKK2V4dGVybiB2b2lkIG5taV93YXRjaGRvZ190aWNrIChzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsIHVuc2lnbmVkIHJlYXNvbik7CisKK2V4dGVybiB2b2lkIG5taV93YXRjaGRvZ19kZWZhdWx0KHZvaWQpOworZXh0ZXJuIGludCBzZXR1cF9ubWlfd2F0Y2hkb2coY2hhciAqKTsKKworZXh0ZXJuIHVuc2lnbmVkIGludCBubWlfd2F0Y2hkb2c7CisjZGVmaW5lIE5NSV9ERUZBVUxUCS0xCisjZGVmaW5lIE5NSV9OT05FCTAKKyNkZWZpbmUgTk1JX0lPX0FQSUMJMQorI2RlZmluZSBOTUlfTE9DQUxfQVBJQwkyCisjZGVmaW5lIE5NSV9JTlZBTElECTMKKwogI2VuZGlmIC8qIEFTTV9OTUlfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L3BjaS5oIGIvaW5jbHVkZS9hc20teDg2XzY0L3BjaS5oCmluZGV4IDJkYjA2MjAuLjQ5YzVlOTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9wY2kuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvcGNpLmgKQEAgLTM5LDggKzM5LDggQEAKICNpbmNsdWRlIDxhc20vc2NhdHRlcmxpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgotI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+IC8qIGZvciBoYXZlX2lvbW11ICovCiAKK2V4dGVybiB2b2lkIHBjaV9pb21tdV9hbGxvYyh2b2lkKTsKIGV4dGVybiBpbnQgaW9tbXVfc2V0dXAoY2hhciAqb3B0KTsKIAogLyogVGhlIFBDSSBhZGRyZXNzIHNwYWNlIGRvZXMgZXF1YWwgdGhlIHBoeXNpY2FsIG1lbW9yeQpAQCAtNTIsNyArNTIsNyBAQAogICovCiAjZGVmaW5lIFBDSV9ETUFfQlVTX0lTX1BIWVMgKGRtYV9vcHMtPmlzX3BoeXMpCiAKLSNpZmRlZiBDT05GSUdfR0FSVF9JT01NVQorI2lmIGRlZmluZWQoQ09ORklHX0lPTU1VKSB8fCBkZWZpbmVkKENPTkZJR19DQUxHQVJZX0lPTU1VKQogCiAvKgogICogeDg2LTY0IGFsd2F5cyBzdXBwb3J0cyBEQUMsIGJ1dCBzb21ldGltZXMgaXQgaXMgdXNlZnVsIHRvIGZvcmNlCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvcGVyY3B1LmggYi9pbmNsdWRlL2FzbS14ODZfNjQvcGVyY3B1LmgKaW5kZXggN2YzM2FhZi4uNTQ5ZWI5MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L3BlcmNwdS5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9wZXJjcHUuaApAQCAtMjEsNiArMjEsNyBAQAogLyogdmFyIGlzIGluIGRpc2NhcmRlZCByZWdpb246IG9mZnNldCB0byBwYXJ0aWN1bGFyIGNvcHkgd2Ugd2FudCAqLwogI2RlZmluZSBwZXJfY3B1KHZhciwgY3B1KSAoKlJFTE9DX0hJREUoJnBlcl9jcHVfXyMjdmFyLCBfX3Blcl9jcHVfb2Zmc2V0KGNwdSkpKQogI2RlZmluZSBfX2dldF9jcHVfdmFyKHZhcikgKCpSRUxPQ19ISURFKCZwZXJfY3B1X18jI3ZhciwgX19teV9jcHVfb2Zmc2V0KCkpKQorI2RlZmluZSBfX3Jhd19nZXRfY3B1X3Zhcih2YXIpICgqUkVMT0NfSElERSgmcGVyX2NwdV9fIyN2YXIsIF9fbXlfY3B1X29mZnNldCgpKSkKIAogLyogQSBtYWNybyB0byBhdm9pZCAjaW5jbHVkZSBoZWxsLi4uICovCiAjZGVmaW5lIHBlcmNwdV9tb2Rjb3B5KHBjcHVkc3QsIHNyYywgc2l6ZSkJCQlcCkBAIC00MCw2ICs0MSw3IEBACiAKICNkZWZpbmUgcGVyX2NwdSh2YXIsIGNwdSkJCQkoKigodm9pZCkoY3B1KSwgJnBlcl9jcHVfXyMjdmFyKSkKICNkZWZpbmUgX19nZXRfY3B1X3Zhcih2YXIpCQkJcGVyX2NwdV9fIyN2YXIKKyNkZWZpbmUgX19yYXdfZ2V0X2NwdV92YXIodmFyKQkJCXBlcl9jcHVfXyMjdmFyCiAKICNlbmRpZgkvKiBTTVAgKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L3BndGFibGUuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9wZ3RhYmxlLmgKaW5kZXggMzFlODNjMy4uYTMxYWI0ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L3BndGFibGUuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvcGd0YWJsZS5oCkBAIC0zMzcsMTQgKzMzNyw4IEBACiAvKiB0byBmaW5kIGFuIGVudHJ5IGluIGEgcGFnZS10YWJsZS1kaXJlY3RvcnkuICovCiAjZGVmaW5lIHB1ZF9pbmRleChhZGRyZXNzKSAoKChhZGRyZXNzKSA+PiBQVURfU0hJRlQpICYgKFBUUlNfUEVSX1BVRC0xKSkKICNkZWZpbmUgcHVkX29mZnNldChwZ2QsIGFkZHJlc3MpICgocHVkX3QgKikgcGdkX3BhZ2UoKihwZ2QpKSArIHB1ZF9pbmRleChhZGRyZXNzKSkKLSNkZWZpbmUgcHVkX29mZnNldF9rKHBnZCwgYWRkcikgcHVkX29mZnNldChwZ2QsIGFkZHIpCiAjZGVmaW5lIHB1ZF9wcmVzZW50KHB1ZCkgKHB1ZF92YWwocHVkKSAmIF9QQUdFX1BSRVNFTlQpCiAKLXN0YXRpYyBpbmxpbmUgcHVkX3QgKl9fcHVkX29mZnNldF9rKHB1ZF90ICpwdWQsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKLXsgCi0JcmV0dXJuIHB1ZCArIHB1ZF9pbmRleChhZGRyZXNzKTsKLX0gCi0KIC8qIFBNRCAgLSBMZXZlbCAyIGFjY2VzcyAqLwogI2RlZmluZSBwbWRfcGFnZV9rZXJuZWwocG1kKSAoKHVuc2lnbmVkIGxvbmcpIF9fdmEocG1kX3ZhbChwbWQpICYgUFRFX01BU0spKQogI2RlZmluZSBwbWRfcGFnZShwbWQpCQkocGZuX3RvX3BhZ2UocG1kX3ZhbChwbWQpID4+IFBBR0VfU0hJRlQpKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L3Byb2Nlc3Nvci5oIGIvaW5jbHVkZS9hc20teDg2XzY0L3Byb2Nlc3Nvci5oCmluZGV4IDMwNjFhMzguLjNiM2MxMjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9wcm9jZXNzb3IuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvcHJvY2Vzc29yLmgKQEAgLTY5LDcgKzY5LDExIEBACiAJY3B1bWFza190IGxsY19zaGFyZWRfbWFwOwkvKiBjcHVzIHNoYXJpbmcgdGhlIGxhc3QgbGV2ZWwgY2FjaGUgKi8KICNlbmRpZgogCV9fdTgJYXBpY2lkOworI2lmZGVmIENPTkZJR19TTVAKIAlfX3U4CWJvb3RlZF9jb3JlczsJLyogbnVtYmVyIG9mIGNvcmVzIGFzIHNlZW4gYnkgT1MgKi8KKwlfX3U4CXBoeXNfcHJvY19pZDsJLyogUGh5c2ljYWwgUHJvY2Vzc29yIGlkLiAqLworCV9fdTgJY3B1X2NvcmVfaWQ7CS8qIENvcmUgaWQuICovCisjZW5kaWYKIH0gX19fX2NhY2hlbGluZV9hbGlnbmVkOwogCiAjZGVmaW5lIFg4Nl9WRU5ET1JfSU5URUwgMApAQCAtOTYsNiArMTAwLDcgQEAKIGV4dGVybiB2b2lkIGlkZW50aWZ5X2NwdShzdHJ1Y3QgY3B1aW5mb194ODYgKik7CiBleHRlcm4gdm9pZCBwcmludF9jcHVfaW5mbyhzdHJ1Y3QgY3B1aW5mb194ODYgKik7CiBleHRlcm4gdW5zaWduZWQgaW50IGluaXRfaW50ZWxfY2FjaGVpbmZvKHN0cnVjdCBjcHVpbmZvX3g4NiAqYyk7CitleHRlcm4gdW5zaWduZWQgc2hvcnQgbnVtX2NhY2hlX2xlYXZlczsKIAogLyoKICAqIEVGTEFHUyBiaXRzCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvcHJvdG8uaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9wcm90by5oCmluZGV4IDhhYmYyYTQuLjAzOGZlMWY0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvcHJvdG8uaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvcHJvdG8uaApAQCAtMzcsNyArMzcsNiBAQAogCiBleHRlcm4gdm9pZCBjb25maWdfYWNwaV90YWJsZXModm9pZCk7CiBleHRlcm4gdm9pZCBpYTMyX3N5c2NhbGwodm9pZCk7Ci1leHRlcm4gdm9pZCBpb21tdV9ob2xlX2luaXQodm9pZCk7CiAKIGV4dGVybiBpbnQgcG10aW1lcl9tYXJrX29mZnNldCh2b2lkKTsKIGV4dGVybiB2b2lkIHBtdGltZXJfcmVzdW1lKHZvaWQpOwpAQCAtNzUsNyArNzQsNyBAQAogCiBleHRlcm4gdW5zaWduZWQgbG9uZyBlbmRfcGZuX21hcDsgCiAKLWV4dGVybiB2b2lkIHNob3dfdHJhY2UodW5zaWduZWQgbG9uZyAqIHJzcCk7CitleHRlcm4gdm9pZCBzaG93X3RyYWNlKHN0cnVjdCB0YXNrX3N0cnVjdCAqLCBzdHJ1Y3QgcHRfcmVncyAqLCB1bnNpZ25lZCBsb25nICogcnNwKTsKIGV4dGVybiB2b2lkIHNob3dfcmVnaXN0ZXJzKHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKIAogZXh0ZXJuIHZvaWQgZXhjZXB0aW9uX3RhYmxlX2NoZWNrKHZvaWQpOwpAQCAtMTAxLDEzICsxMDAsOSBAQAogCiBleHRlcm4gdm9pZCBzZWxlY3RfaWRsZV9yb3V0aW5lKGNvbnN0IHN0cnVjdCBjcHVpbmZvX3g4NiAqYyk7CiAKLWV4dGVybiB2b2lkIGdhcnRfcGFyc2Vfb3B0aW9ucyhjaGFyICopOwotZXh0ZXJuIHZvaWQgX19pbml0IG5vX2lvbW11X2luaXQodm9pZCk7Ci0KIGV4dGVybiB1bnNpZ25lZCBsb25nIHRhYmxlX3N0YXJ0LCB0YWJsZV9lbmQ7CiAKIGV4dGVybiBpbnQgZXhjZXB0aW9uX3RyYWNlOwotZXh0ZXJuIGludCBmb3JjZV9pb21tdSwgbm9faW9tbXU7CiBleHRlcm4gaW50IHVzaW5nX2FwaWNfdGltZXI7CiBleHRlcm4gaW50IGRpc2FibGVfYXBpYzsKIGV4dGVybiB1bnNpZ25lZCBjcHVfa2h6OwpAQCAtMTE2LDcgKzExMSwxMyBAQAogZXh0ZXJuIGludCBhY3BpX2h0OwogZXh0ZXJuIGludCBhY3BpX2Rpc2FibGVkOwogCi0jaWZkZWYgQ09ORklHX0dBUlRfSU9NTVUKK2V4dGVybiB2b2lkIG5vX2lvbW11X2luaXQodm9pZCk7CitleHRlcm4gaW50IGZvcmNlX2lvbW11LCBub19pb21tdTsKK2V4dGVybiBpbnQgaW9tbXVfZGV0ZWN0ZWQ7CisjaWZkZWYgQ09ORklHX0lPTU1VCitleHRlcm4gdm9pZCBnYXJ0X2lvbW11X2luaXQodm9pZCk7CitleHRlcm4gdm9pZCBnYXJ0X3BhcnNlX29wdGlvbnMoY2hhciAqKTsKK2V4dGVybiB2b2lkIGlvbW11X2hvbGVfaW5pdCh2b2lkKTsKIGV4dGVybiBpbnQgZmFsbGJhY2tfYXBlcl9vcmRlcjsKIGV4dGVybiBpbnQgZmFsbGJhY2tfYXBlcl9mb3JjZTsKIGV4dGVybiBpbnQgaW9tbXVfYXBlcnR1cmU7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvcndsb2NrLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvcndsb2NrLmgKaW5kZXggOTk0MmNjMy4uZGVhMGU5NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L3J3bG9jay5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9yd2xvY2suaApAQCAtMjQsNyArMjQsNyBAQAogI2RlZmluZSBSV19MT0NLX0JJQVNfU1RSCSIweDAxMDAwMDAwIgogCiAjZGVmaW5lIF9fYnVpbGRfcmVhZF9sb2NrX3B0cihydywgaGVscGVyKSAgIFwKLQlhc20gdm9sYXRpbGUoTE9DSyAic3VibCAkMSwoJTApXG5cdCIgXAorCWFzbSB2b2xhdGlsZShMT0NLX1BSRUZJWCAic3VibCAkMSwoJTApXG5cdCIgXAogCQkgICAgICJqcyAyZlxuIiBcCiAJCSAgICAgIjE6XG4iIFwKIAkJICAgIExPQ0tfU0VDVElPTl9TVEFSVCgiIikgXApAQCAtMzQsNyArMzQsNyBAQAogCQkgICAgIDo6ImEiIChydykgOiAibWVtb3J5IikKIAogI2RlZmluZSBfX2J1aWxkX3JlYWRfbG9ja19jb25zdChydywgaGVscGVyKSAgIFwKLQlhc20gdm9sYXRpbGUoTE9DSyAic3VibCAkMSwlMFxuXHQiIFwKKwlhc20gdm9sYXRpbGUoTE9DS19QUkVGSVggInN1YmwgJDEsJTBcblx0IiBcCiAJCSAgICAgImpzIDJmXG4iIFwKIAkJICAgICAiMTpcbiIgXAogCQkgICAgTE9DS19TRUNUSU9OX1NUQVJUKCIiKSBcCkBAIC01NCw3ICs1NCw3IEBACiAJCQkJCX0gd2hpbGUgKDApCiAKICNkZWZpbmUgX19idWlsZF93cml0ZV9sb2NrX3B0cihydywgaGVscGVyKSBcCi0JYXNtIHZvbGF0aWxlKExPQ0sgInN1YmwgJCIgUldfTE9DS19CSUFTX1NUUiAiLCglMClcblx0IiBcCisJYXNtIHZvbGF0aWxlKExPQ0tfUFJFRklYICJzdWJsICQiIFJXX0xPQ0tfQklBU19TVFIgIiwoJTApXG5cdCIgXAogCQkgICAgICJqbnogMmZcbiIgXAogCQkgICAgICIxOlxuIiBcCiAJCSAgICAgTE9DS19TRUNUSU9OX1NUQVJUKCIiKSBcCkBAIC02NCw3ICs2NCw3IEBACiAJCSAgICAgOjoiYSIgKHJ3KSA6ICJtZW1vcnkiKQogCiAjZGVmaW5lIF9fYnVpbGRfd3JpdGVfbG9ja19jb25zdChydywgaGVscGVyKSBcCi0JYXNtIHZvbGF0aWxlKExPQ0sgInN1YmwgJCIgUldfTE9DS19CSUFTX1NUUiAiLCUwXG5cdCIgXAorCWFzbSB2b2xhdGlsZShMT0NLX1BSRUZJWCAic3VibCAkIiBSV19MT0NLX0JJQVNfU1RSICIsJTBcblx0IiBcCiAJCSAgICAgImpueiAyZlxuIiBcCiAJCSAgICAgIjE6XG4iIFwKIAkJICAgIExPQ0tfU0VDVElPTl9TVEFSVCgiIikgXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L3NlbWFwaG9yZS5oIGIvaW5jbHVkZS9hc20teDg2XzY0L3NlbWFwaG9yZS5oCmluZGV4IGEzODlhYTYuLjA2NGRmMDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9zZW1hcGhvcmUuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvc2VtYXBob3JlLmgKQEAgLTEwNiw3ICsxMDYsNyBAQAogCiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCiAJCSIjIGF0b21pYyBkb3duIG9wZXJhdGlvblxuXHQiCi0JCUxPQ0sgImRlY2wgJTBcblx0IiAgICAgLyogLS1zZW0tPmNvdW50ICovCisJCUxPQ0tfUFJFRklYICJkZWNsICUwXG5cdCIgICAgIC8qIC0tc2VtLT5jb3VudCAqLwogCQkianMgMmZcbiIKIAkJIjE6XG4iCiAJCUxPQ0tfU0VDVElPTl9TVEFSVCgiIikKQEAgLTEzMCw3ICsxMzAsNyBAQAogCiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCiAJCSIjIGF0b21pYyBpbnRlcnJ1cHRpYmxlIGRvd24gb3BlcmF0aW9uXG5cdCIKLQkJTE9DSyAiZGVjbCAlMVxuXHQiICAgICAvKiAtLXNlbS0+Y291bnQgKi8KKwkJTE9DS19QUkVGSVggImRlY2wgJTFcblx0IiAgICAgLyogLS1zZW0tPmNvdW50ICovCiAJCSJqcyAyZlxuXHQiCiAJCSJ4b3JsICUwLCUwXG4iCiAJCSIxOlxuIgpAQCAtMTU0LDcgKzE1NCw3IEBACiAKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygKIAkJIiMgYXRvbWljIGludGVycnVwdGlibGUgZG93biBvcGVyYXRpb25cblx0IgotCQlMT0NLICJkZWNsICUxXG5cdCIgICAgIC8qIC0tc2VtLT5jb3VudCAqLworCQlMT0NLX1BSRUZJWCAiZGVjbCAlMVxuXHQiICAgICAvKiAtLXNlbS0+Y291bnQgKi8KIAkJImpzIDJmXG5cdCIKIAkJInhvcmwgJTAsJTBcbiIKIAkJIjE6XG4iCkBAIC0xNzgsNyArMTc4LDcgQEAKIHsKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygKIAkJIiMgYXRvbWljIHVwIG9wZXJhdGlvblxuXHQiCi0JCUxPQ0sgImluY2wgJTBcblx0IiAgICAgLyogKytzZW0tPmNvdW50ICovCisJCUxPQ0tfUFJFRklYICJpbmNsICUwXG5cdCIgICAgIC8qICsrc2VtLT5jb3VudCAqLwogCQkiamxlIDJmXG4iCiAJCSIxOlxuIgogCQlMT0NLX1NFQ1RJT05fU1RBUlQoIiIpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvc21wLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvc21wLmgKaW5kZXggNzY4NmI5Yi4uNjgwNWUxZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L3NtcC5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9zbXAuaApAQCAtNTMsOCArNTMsNiBAQAogCiBleHRlcm4gY3B1bWFza190IGNwdV9zaWJsaW5nX21hcFtOUl9DUFVTXTsKIGV4dGVybiBjcHVtYXNrX3QgY3B1X2NvcmVfbWFwW05SX0NQVVNdOwotZXh0ZXJuIHU4IHBoeXNfcHJvY19pZFtOUl9DUFVTXTsKLWV4dGVybiB1OCBjcHVfY29yZV9pZFtOUl9DUFVTXTsKIGV4dGVybiB1OCBjcHVfbGxjX2lkW05SX0NQVVNdOwogCiAjZGVmaW5lIFNNUF9UUkFNUE9MSU5FX0JBU0UgMHg2MDAwCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvc3BpbmxvY2suaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9zcGlubG9jay5oCmluZGV4IDVkOGE1ZTMuLjhkMzQyMTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9zcGlubG9jay5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9zcGlubG9jay5oCkBAIC0zMSwxNSArMzEsMTkgQEAKIAkiam1wIDFiXG4iIFwKIAlMT0NLX1NFQ1RJT05fRU5ECiAKKyNkZWZpbmUgX19yYXdfc3Bpbl9sb2NrX3N0cmluZ191cCBcCisJIlxuXHRkZWNsICUwIgorCiAjZGVmaW5lIF9fcmF3X3NwaW5fdW5sb2NrX3N0cmluZyBcCiAJIm1vdmwgJDEsJTAiIFwKIAkJOiI9bSIgKGxvY2stPnNsb2NrKSA6IDogIm1lbW9yeSIKIAogc3RhdGljIGlubGluZSB2b2lkIF9fcmF3X3NwaW5fbG9jayhyYXdfc3BpbmxvY2tfdCAqbG9jaykKIHsKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkJX19yYXdfc3Bpbl9sb2NrX3N0cmluZwotCQk6Ij1tIiAobG9jay0+c2xvY2spIDogOiAibWVtb3J5Iik7CisJYWx0ZXJuYXRpdmVfc21wKAorCQlfX3Jhd19zcGluX2xvY2tfc3RyaW5nLAorCQlfX3Jhd19zcGluX2xvY2tfc3RyaW5nX3VwLAorCQkiPW0iIChsb2NrLT5zbG9jaykgOiA6ICJtZW1vcnkiKTsKIH0KIAogI2RlZmluZSBfX3Jhd19zcGluX2xvY2tfZmxhZ3MobG9jaywgZmxhZ3MpIF9fcmF3X3NwaW5fbG9jayhsb2NrKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L3N0cmluZy5oIGIvaW5jbHVkZS9hc20teDg2XzY0L3N0cmluZy5oCmluZGV4IGVlNmJmMjcuLjk1MDVkOWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9zdHJpbmcuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvc3RyaW5nLmgKQEAgLTYsNyArNiw4IEBACiAvKiBXcml0dGVuIDIwMDIgYnkgQW5kaSBLbGVlbiAqLyAKIAogLyogT25seSB1c2VkIGZvciBzcGVjaWFsIGNpcmN1bXN0YW5jZXMuIFN0b2xlbiBmcm9tIGkzODYvc3RyaW5nLmggKi8gCi1zdGF0aWMgaW5saW5lIHZvaWQgKiBfX2lubGluZV9tZW1jcHkodm9pZCAqIHRvLCBjb25zdCB2b2lkICogZnJvbSwgc2l6ZV90IG4pCitzdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgKgorX19pbmxpbmVfbWVtY3B5KHZvaWQgKiB0bywgY29uc3Qgdm9pZCAqIGZyb20sIHNpemVfdCBuKQogewogdW5zaWduZWQgbG9uZyBkMCwgZDEsIGQyOwogX19hc21fXyBfX3ZvbGF0aWxlX18oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvc3lzdGVtLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvc3lzdGVtLmgKaW5kZXggZjQ4ZTBkYS4uNjhlNTU5ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L3N5c3RlbS5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9zeXN0ZW0uaApAQCAtMywxNSArMywxMCBAQAogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8YXNtL3NlZ21lbnQuaD4KKyNpbmNsdWRlIDxhc20vYWx0ZXJuYXRpdmUuaD4KIAogI2lmZGVmIF9fS0VSTkVMX18KIAotI2lmZGVmIENPTkZJR19TTVAKLSNkZWZpbmUgTE9DS19QUkVGSVggImxvY2sgOyAiCi0jZWxzZQotI2RlZmluZSBMT0NLX1BSRUZJWCAiIgotI2VuZGlmCi0KICNkZWZpbmUgX19TVFIoeCkgI3gKICNkZWZpbmUgU1RSKHgpIF9fU1RSKHgpCiAKQEAgLTM0LDcgKzI5LDcgQEAKIAkJICAgICAidGhyZWFkX3JldHVybjpcblx0IgkJCQkJICAgIFwKIAkJICAgICAibW92cSAlJWdzOiVQW3BkYV9wY3VycmVudF0sJSVyc2lcblx0IgkJCSAgXAogCQkgICAgICJtb3ZxICVQW3RocmVhZF9pbmZvXSglJXJzaSksJSVyOFxuXHQiCQkJICBcCi0JCSAgICAgTE9DSyAiYnRyICAlW3RpZl9mb3JrXSwlUFt0aV9mbGFnc10oJSVyOClcblx0IgkJICBcCisJCSAgICAgTE9DS19QUkVGSVggImJ0ciAgJVt0aWZfZm9ya10sJVBbdGlfZmxhZ3NdKCUlcjgpXG5cdCIJICBcCiAJCSAgICAgIm1vdnEgJSVyYXgsJSVyZGlcblx0IiAJCQkJCSAgXAogCQkgICAgICJqYyAgIHJldF9mcm9tX2Zvcmtcblx0IgkJCQkJICBcCiAJCSAgICAgUkVTVE9SRV9DT05URVhUCQkJCQkJICAgIFwKQEAgLTY5LDgyICs2NCw2IEBACiAJCSIucHJldmlvdXMiCQkJXAogCQk6IDoiciIgKHZhbHVlKSwgInIiICgwKSkKIAotI2lmZGVmIF9fS0VSTkVMX18KLXN0cnVjdCBhbHRfaW5zdHIgeyAKLQlfX3U4ICppbnN0cjsgCQkvKiBvcmlnaW5hbCBpbnN0cnVjdGlvbiAqLwotCV9fdTggKnJlcGxhY2VtZW50OwotCV9fdTggIGNwdWlkOwkJLyogY3B1aWQgYml0IHNldCBmb3IgcmVwbGFjZW1lbnQgKi8KLQlfX3U4ICBpbnN0cmxlbjsJCS8qIGxlbmd0aCBvZiBvcmlnaW5hbCBpbnN0cnVjdGlvbiAqLwotCV9fdTggIHJlcGxhY2VtZW50bGVuOyAJLyogbGVuZ3RoIG9mIG5ldyBpbnN0cnVjdGlvbiwgPD0gaW5zdHJsZW4gKi8gCi0JX191OCAgcGFkWzVdOwotfTsgCi0jZW5kaWYKLQotLyoKLSAqIEFsdGVybmF0aXZlIGluc3RydWN0aW9ucyBmb3IgZGlmZmVyZW50IENQVSB0eXBlcyBvciBjYXBhYmlsaXRpZXMuCi0gKiAKLSAqIFRoaXMgYWxsb3dzIHRvIHVzZSBvcHRpbWl6ZWQgaW5zdHJ1Y3Rpb25zIGV2ZW4gb24gZ2VuZXJpYyBiaW5hcnkKLSAqIGtlcm5lbHMuCi0gKiAKLSAqIGxlbmd0aCBvZiBvbGRpbnN0ciBtdXN0IGJlIGxvbmdlciBvciBlcXVhbCB0aGUgbGVuZ3RoIG9mIG5ld2luc3RyCi0gKiBJdCBjYW4gYmUgcGFkZGVkIHdpdGggbm9wcyBhcyBuZWVkZWQuCi0gKiAKLSAqIEZvciBub24gYmFycmllciBsaWtlIGlubGluZXMgcGxlYXNlIGRlZmluZSBuZXcgdmFyaWFudHMKLSAqIHdpdGhvdXQgdm9sYXRpbGUgYW5kIG1lbW9yeSBjbG9iYmVyLgotICovCi0jZGVmaW5lIGFsdGVybmF0aXZlKG9sZGluc3RyLCBuZXdpbnN0ciwgZmVhdHVyZSkgCVwKLQlhc20gdm9sYXRpbGUgKCI2NjE6XG5cdCIgb2xkaW5zdHIgIlxuNjYyOlxuIiAJCSAgICAgXAotCQkgICAgICAiLnNlY3Rpb24gLmFsdGluc3RydWN0aW9ucyxcImFcIlxuIiAgICAgCSAgICAgXAotCQkgICAgICAiICAuYWxpZ24gOFxuIgkJCQkgICAgICAgXAotCQkgICAgICAiICAucXVhZCA2NjFiXG4iICAgICAgICAgICAgLyogbGFiZWwgKi8gICAgICAgICAgXAotCQkgICAgICAiICAucXVhZCA2NjNmXG4iCQkgIC8qIG5ldyBpbnN0cnVjdGlvbiAqLyBcCi0JCSAgICAgICIgIC5ieXRlICVjMFxuIiAgICAgICAgICAgICAvKiBmZWF0dXJlIGJpdCAqLyAgICBcCi0JCSAgICAgICIgIC5ieXRlIDY2MmItNjYxYlxuIiAgICAgICAvKiBzb3VyY2VsZW4gKi8gICAgICBcCi0JCSAgICAgICIgIC5ieXRlIDY2NGYtNjYzZlxuIiAgICAgICAvKiByZXBsYWNlbWVudGxlbiAqLyBcCi0JCSAgICAgICIucHJldmlvdXNcbiIJCQkJCVwKLQkJICAgICAgIi5zZWN0aW9uIC5hbHRpbnN0cl9yZXBsYWNlbWVudCxcImF4XCJcbiIJCVwKLQkJICAgICAgIjY2Mzpcblx0IiBuZXdpbnN0ciAiXG42NjQ6XG4iICAgLyogcmVwbGFjZW1lbnQgKi8gXAotCQkgICAgICAiLnByZXZpb3VzIiA6OiAiaSIgKGZlYXR1cmUpIDogIm1lbW9yeSIpICAKLQotLyoKLSAqIEFsdGVybmF0aXZlIGlubGluZSBhc3NlbWJseSB3aXRoIGlucHV0LgotICogCi0gKiBQZWN1bGlhcml0aWVzOgotICogTm8gbWVtb3J5IGNsb2JiZXIgaGVyZS4gCi0gKiBBcmd1bWVudCBudW1iZXJzIHN0YXJ0IHdpdGggMS4KLSAqIEJlc3QgaXMgdG8gdXNlIGNvbnN0cmFpbnRzIHRoYXQgYXJlIGZpeGVkIHNpemUgKGxpa2UgKCUxKSAuLi4gInIiKQotICogSWYgeW91IHVzZSB2YXJpYWJsZSBzaXplZCBjb25zdHJhaW50cyBsaWtlICJtIiBvciAiZyIgaW4gdGhlIAotICogcmVwbGFjZW1lbnQgbWFrZSBzdXJlIHRvIHBhZCB0byB0aGUgd29yc3QgY2FzZSBsZW5ndGguCi0gKi8KLSNkZWZpbmUgYWx0ZXJuYXRpdmVfaW5wdXQob2xkaW5zdHIsIG5ld2luc3RyLCBmZWF0dXJlLCBpbnB1dC4uLikJXAotCWFzbSB2b2xhdGlsZSAoIjY2MTpcblx0IiBvbGRpbnN0ciAiXG42NjI6XG4iCQkJXAotCQkgICAgICAiLnNlY3Rpb24gLmFsdGluc3RydWN0aW9ucyxcImFcIlxuIgkJXAotCQkgICAgICAiICAuYWxpZ24gOFxuIgkJCQkJXAotCQkgICAgICAiICAucXVhZCA2NjFiXG4iICAgICAgICAgICAgLyogbGFiZWwgKi8JCVwKLQkJICAgICAgIiAgLnF1YWQgNjYzZlxuIgkJICAvKiBuZXcgaW5zdHJ1Y3Rpb24gKi8JXAotCQkgICAgICAiICAuYnl0ZSAlYzBcbiIgICAgICAgICAgICAgLyogZmVhdHVyZSBiaXQgKi8JXAotCQkgICAgICAiICAuYnl0ZSA2NjJiLTY2MWJcbiIgICAgICAgLyogc291cmNlbGVuICovCVwKLQkJICAgICAgIiAgLmJ5dGUgNjY0Zi02NjNmXG4iICAgICAgIC8qIHJlcGxhY2VtZW50bGVuICovCVwKLQkJICAgICAgIi5wcmV2aW91c1xuIgkJCQkJXAotCQkgICAgICAiLnNlY3Rpb24gLmFsdGluc3RyX3JlcGxhY2VtZW50LFwiYXhcIlxuIgkJXAotCQkgICAgICAiNjYzOlxuXHQiIG5ld2luc3RyICJcbjY2NDpcbiIgICAvKiByZXBsYWNlbWVudCAqLyBcCi0JCSAgICAgICIucHJldmlvdXMiIDo6ICJpIiAoZmVhdHVyZSksICMjaW5wdXQpCi0KLS8qIExpa2UgYWx0ZXJuYXRpdmVfaW5wdXQsIGJ1dCB3aXRoIGEgc2luZ2xlIG91dHB1dCBhcmd1bWVudCAqLwotI2RlZmluZSBhbHRlcm5hdGl2ZV9pbyhvbGRpbnN0ciwgbmV3aW5zdHIsIGZlYXR1cmUsIG91dHB1dCwgaW5wdXQuLi4pIFwKLQlhc20gdm9sYXRpbGUgKCI2NjE6XG5cdCIgb2xkaW5zdHIgIlxuNjYyOlxuIgkJCVwKLQkJICAgICAgIi5zZWN0aW9uIC5hbHRpbnN0cnVjdGlvbnMsXCJhXCJcbiIJCVwKLQkJICAgICAgIiAgLmFsaWduIDhcbiIJCQkJCVwKLQkJICAgICAgIiAgLnF1YWQgNjYxYlxuIiAgICAgICAgICAgIC8qIGxhYmVsICovCQlcCi0JCSAgICAgICIgIC5xdWFkIDY2M2ZcbiIJCSAgLyogbmV3IGluc3RydWN0aW9uICovCVwKLQkJICAgICAgIiAgLmJ5dGUgJWNbZmVhdF1cbiIgICAgICAgIC8qIGZlYXR1cmUgYml0ICovCVwKLQkJICAgICAgIiAgLmJ5dGUgNjYyYi02NjFiXG4iICAgICAgIC8qIHNvdXJjZWxlbiAqLwlcCi0JCSAgICAgICIgIC5ieXRlIDY2NGYtNjYzZlxuIiAgICAgICAvKiByZXBsYWNlbWVudGxlbiAqLwlcCi0JCSAgICAgICIucHJldmlvdXNcbiIJCQkJCVwKLQkJICAgICAgIi5zZWN0aW9uIC5hbHRpbnN0cl9yZXBsYWNlbWVudCxcImF4XCJcbiIJCVwKLQkJICAgICAgIjY2Mzpcblx0IiBuZXdpbnN0ciAiXG42NjQ6XG4iICAgLyogcmVwbGFjZW1lbnQgKi8gXAotCQkgICAgICAiLnByZXZpb3VzIiA6IG91dHB1dCA6IFtmZWF0XSAiaSIgKGZlYXR1cmUpLCAjI2lucHV0KQotCiAvKgogICogQ2xlYXIgYW5kIHNldCAnVFMnIGJpdCByZXNwZWN0aXZlbHkKICAqLwpAQCAtMzY2LDUgKzI4NSw2IEBACiB2b2lkIGNwdV9pZGxlX3dhaXQodm9pZCk7CiAKIGV4dGVybiB1bnNpZ25lZCBsb25nIGFyY2hfYWxpZ25fc3RhY2sodW5zaWduZWQgbG9uZyBzcCk7CitleHRlcm4gdm9pZCBmcmVlX2luaXRfcGFnZXMoY2hhciAqd2hhdCwgdW5zaWduZWQgbG9uZyBiZWdpbiwgdW5zaWduZWQgbG9uZyBlbmQpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC90Y2UuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC90Y2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTUxZDMxCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L3RjZS5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgTXVsaSBCZW4tWWVodWRhIDxtdWxpQGlsLmlibS5jb20+LCBJQk0gQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAwNiBKb24gTWFzb24gPGpkbWFzb25AdXMuaWJtLmNvbT4sIElCTSBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgZmlsZSBpcyBkZXJpdmVkIGZyb20gYXNtLXBvd2VycGMvdGNlLmguCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2lmbmRlZiBfQVNNX1g4Nl82NF9UQ0VfSAorI2RlZmluZSBfQVNNX1g4Nl82NF9UQ0VfSAorCitleHRlcm4gdm9pZCogdGNlX3RhYmxlX2t2YVtdOworZXh0ZXJuIHVuc2lnbmVkIGludCBzcGVjaWZpZWRfdGFibGVfc2l6ZTsKK3N0cnVjdCBpb21tdV90YWJsZTsKKworI2RlZmluZSBUQ0VfRU5UUllfU0laRSAgIDggICAvKiBpbiBieXRlcyAqLworCisjZGVmaW5lIFRDRV9SRUFEX1NISUZUICAgMAorI2RlZmluZSBUQ0VfV1JJVEVfU0hJRlQgIDEKKyNkZWZpbmUgVENFX0hVQklEX1NISUZUICAyICAgLyogdW51c2VkICovCisjZGVmaW5lIFRDRV9SU1ZEX1NISUZUICAgOCAgIC8qIHVudXNlZCAqLworI2RlZmluZSBUQ0VfUlBOX1NISUZUICAgIDEyCisjZGVmaW5lIFRDRV9VTlVTRURfU0hJRlQgNDggIC8qIHVudXNlZCAqLworCisjZGVmaW5lIFRDRV9SUE5fTUFTSyAgICAgMHgwMDAwZmZmZmZmZmZmMDAwVUxMCisKK2V4dGVybiB2b2lkIHRjZV9idWlsZChzdHJ1Y3QgaW9tbXVfdGFibGUgKnRibCwgdW5zaWduZWQgbG9uZyBpbmRleCwKKyAgICAgICAgdW5zaWduZWQgaW50IG5wYWdlcywgdW5zaWduZWQgbG9uZyB1YWRkciwgaW50IGRpcmVjdGlvbik7CitleHRlcm4gdm9pZCB0Y2VfZnJlZShzdHJ1Y3QgaW9tbXVfdGFibGUgKnRibCwgbG9uZyBpbmRleCwgdW5zaWduZWQgaW50IG5wYWdlcyk7CitleHRlcm4gdm9pZCogYWxsb2NfdGNlX3RhYmxlKHZvaWQpOworZXh0ZXJuIHZvaWQgZnJlZV90Y2VfdGFibGUodm9pZCAqdGJsKTsKK2V4dGVybiBpbnQgYnVpbGRfdGNlX3RhYmxlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHZvaWQgX19pb21lbSAqYmJhcik7CisKKyNlbmRpZiAvKiBfQVNNX1g4Nl82NF9UQ0VfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L3RocmVhZF9pbmZvLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvdGhyZWFkX2luZm8uaAppbmRleCA0YWMwZTBhLi4yMDI5YjAwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvdGhyZWFkX2luZm8uaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvdGhyZWFkX2luZm8uaApAQCAtNzMsOCArNzMsMjEgQEAKIH0KIAogLyogdGhyZWFkIGluZm9ybWF0aW9uIGFsbG9jYXRpb24gKi8KKyNpZmRlZiBDT05GSUdfREVCVUdfU1RBQ0tfVVNBR0UKKyNkZWZpbmUgYWxsb2NfdGhyZWFkX2luZm8odHNrKQkJCQkJXAorICAgICh7CQkJCQkJCQlcCisJc3RydWN0IHRocmVhZF9pbmZvICpyZXQ7CQkJCVwKKwkJCQkJCQkJXAorCXJldCA9ICgoc3RydWN0IHRocmVhZF9pbmZvICopIF9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCxUSFJFQURfT1JERVIpKTsgXAorCWlmIChyZXQpCQkJCQkJXAorCQltZW1zZXQocmV0LCAwLCBUSFJFQURfU0laRSk7CQkJXAorCXJldDsJCQkJCQkJXAorICAgIH0pCisjZWxzZQogI2RlZmluZSBhbGxvY190aHJlYWRfaW5mbyh0c2spIFwKIAkoKHN0cnVjdCB0aHJlYWRfaW5mbyAqKSBfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwsVEhSRUFEX09SREVSKSkKKyNlbmRpZgorCiAjZGVmaW5lIGZyZWVfdGhyZWFkX2luZm8odGkpIGZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpICh0aSksIFRIUkVBRF9PUkRFUikKIAogI2Vsc2UgLyogIV9fQVNTRU1CTFlfXyAqLwpAQCAtMTAxLDcgKzExNCw3IEBACiAjZGVmaW5lIFRJRl9JUkVUCQk1CS8qIGZvcmNlIElSRVQgKi8KICNkZWZpbmUgVElGX1NZU0NBTExfQVVESVQJNwkvKiBzeXNjYWxsIGF1ZGl0aW5nIGFjdGl2ZSAqLwogI2RlZmluZSBUSUZfU0VDQ09NUAkJOAkvKiBzZWN1cmUgY29tcHV0aW5nICovCi0jZGVmaW5lIFRJRl9QT0xMSU5HX05SRkxBRwkxNgkvKiB0cnVlIGlmIHBvbGxfaWRsZSgpIGlzIHBvbGxpbmcgVElGX05FRURfUkVTQ0hFRCAqLworLyogMTYgZnJlZSAqLwogI2RlZmluZSBUSUZfSUEzMgkJMTcJLyogMzJiaXQgcHJvY2VzcyAqLyAKICNkZWZpbmUgVElGX0ZPUksJCTE4CS8qIHJldF9mcm9tX2ZvcmsgKi8KICNkZWZpbmUgVElGX0FCSV9QRU5ESU5HCQkxOQpAQCAtMTE1LDcgKzEyOCw2IEBACiAjZGVmaW5lIF9USUZfSVJFVAkJKDE8PFRJRl9JUkVUKQogI2RlZmluZSBfVElGX1NZU0NBTExfQVVESVQJKDE8PFRJRl9TWVNDQUxMX0FVRElUKQogI2RlZmluZSBfVElGX1NFQ0NPTVAJCSgxPDxUSUZfU0VDQ09NUCkKLSNkZWZpbmUgX1RJRl9QT0xMSU5HX05SRkxBRwkoMTw8VElGX1BPTExJTkdfTlJGTEFHKQogI2RlZmluZSBfVElGX0lBMzIJCSgxPDxUSUZfSUEzMikKICNkZWZpbmUgX1RJRl9GT1JLCQkoMTw8VElGX0ZPUkspCiAjZGVmaW5lIF9USUZfQUJJX1BFTkRJTkcJKDE8PFRJRl9BQklfUEVORElORykKQEAgLTEzNyw2ICsxNDksOSBAQAogICovCiAjZGVmaW5lIFRTX1VTRURGUFUJCTB4MDAwMQkvKiBGUFUgd2FzIHVzZWQgYnkgdGhpcyB0YXNrIHRoaXMgcXVhbnR1bSAoU01QKSAqLwogI2RlZmluZSBUU19DT01QQVQJCTB4MDAwMgkvKiAzMmJpdCBzeXNjYWxsIGFjdGl2ZSAqLworI2RlZmluZSBUU19QT0xMSU5HCQkweDAwMDQJLyogdHJ1ZSBpZiBpbiBpZGxlIGxvb3AgYW5kIG5vdCBzbGVlcGluZyAqLworCisjZGVmaW5lIHRza19pc19wb2xsaW5nKHQpICgodCktPnRocmVhZF9pbmZvLT5zdGF0dXMgJiBUU19QT0xMSU5HKQogCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvdG9wb2xvZ3kuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC90b3BvbG9neS5oCmluZGV4IDgwYzRlNDQuLmM0ZTQ2ZTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC90b3BvbG9neS5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC90b3BvbG9neS5oCkBAIC03LDggKzcsNiBAQAogI2luY2x1ZGUgPGFzbS9tcHNwZWMuaD4KICNpbmNsdWRlIDxhc20vYml0b3BzLmg+CiAKLS8qIE1hcCB0aGUgSzggQ1BVIGxvY2FsIG1lbW9yeSBjb250cm9sbGVycyB0byBhIHNpbXBsZSAxOjEgQ1BVOk5PREUgdG9wb2xvZ3kgKi8KLQogZXh0ZXJuIGNwdW1hc2tfdCBjcHVfb25saW5lX21hcDsKIAogZXh0ZXJuIHVuc2lnbmVkIGNoYXIgY3B1X3RvX25vZGVbXTsKQEAgLTU3LDEwICs1NSw4IEBACiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19TTVAKLSNkZWZpbmUgdG9wb2xvZ3lfcGh5c2ljYWxfcGFja2FnZV9pZChjcHUpCQkJCVwKLQkocGh5c19wcm9jX2lkW2NwdV0gPT0gQkFEX0FQSUNJRCA/IC0xIDogcGh5c19wcm9jX2lkW2NwdV0pCi0jZGVmaW5lIHRvcG9sb2d5X2NvcmVfaWQoY3B1KQkJCQkJCVwKLQkoY3B1X2NvcmVfaWRbY3B1XSA9PSBCQURfQVBJQ0lEID8gMCA6IGNwdV9jb3JlX2lkW2NwdV0pCisjZGVmaW5lIHRvcG9sb2d5X3BoeXNpY2FsX3BhY2thZ2VfaWQoY3B1KQkoY3B1X2RhdGFbY3B1XS5waHlzX3Byb2NfaWQpCisjZGVmaW5lIHRvcG9sb2d5X2NvcmVfaWQoY3B1KQkJCShjcHVfZGF0YVtjcHVdLmNwdV9jb3JlX2lkKQogI2RlZmluZSB0b3BvbG9neV9jb3JlX3NpYmxpbmdzKGNwdSkJCShjcHVfY29yZV9tYXBbY3B1XSkKICNkZWZpbmUgdG9wb2xvZ3lfdGhyZWFkX3NpYmxpbmdzKGNwdSkJCShjcHVfc2libGluZ19tYXBbY3B1XSkKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L3Vud2luZC5oIGIvaW5jbHVkZS9hc20teDg2XzY0L3Vud2luZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzZTcxMjQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvdW53aW5kLmgKQEAgLTAsMCArMSwxMDYgQEAKKyNpZm5kZWYgX0FTTV9YODZfNjRfVU5XSU5EX0gKKyNkZWZpbmUgX0FTTV9YODZfNjRfVU5XSU5EX0gKKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMi0yMDA2IE5vdmVsbCwgSW5jLgorICoJSmFuIEJldWxpY2ggPGpiZXVsaWNoQG5vdmVsbC5jb20+CisgKiBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR1BMLgorICovCisKKyNpZmRlZiBDT05GSUdfU1RBQ0tfVU5XSU5ECisKKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS92c3lzY2FsbC5oPgorCitzdHJ1Y3QgdW53aW5kX2ZyYW1lX2luZm8KK3sKKwlzdHJ1Y3QgcHRfcmVncyByZWdzOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzazsKK307CisKKyNkZWZpbmUgVU5XX1BDKGZyYW1lKSAgICAgICAgKGZyYW1lKS0+cmVncy5yaXAKKyNkZWZpbmUgVU5XX1NQKGZyYW1lKSAgICAgICAgKGZyYW1lKS0+cmVncy5yc3AKKyNpZmRlZiBDT05GSUdfRlJBTUVfUE9JTlRFUgorI2RlZmluZSBVTldfRlAoZnJhbWUpICAgICAgICAoZnJhbWUpLT5yZWdzLnJicAorI2RlZmluZSBGUkFNRV9SRVRBRERSX09GRlNFVCA4CisjZGVmaW5lIEZSQU1FX0xJTktfT0ZGU0VUICAgIDAKKyNkZWZpbmUgU1RBQ0tfQk9UVE9NKHRzaykgICAgKCgodHNrKS0+dGhyZWFkLnJzcDAgLSAxKSAmIH4oVEhSRUFEX1NJWkUgLSAxKSkKKyNkZWZpbmUgU1RBQ0tfVE9QKHRzaykgICAgICAgKCh0c2spLT50aHJlYWQucnNwMCkKKyNlbmRpZgorLyogTWlnaHQgbmVlZCB0byBhY2NvdW50IGZvciB0aGUgc3BlY2lhbCBleGNlcHRpb24gYW5kIGludGVycnVwdCBoYW5kbGluZworICAgc3RhY2tzIGhlcmUsIHNpbmNlIG5vcm1hbGx5CisJRVhDRVBUSU9OX1NUQUNLX09SREVSIDwgVEhSRUFEX09SREVSIDwgSVJRU1RBQ0tfT1JERVIsCisgICBidXQgdGhlIGNvbnN0cnVjdCBpcyBuZWVkZWQgb25seSBmb3IgZ2V0dGluZyBhY3Jvc3MgdGhlIHN0YWNrIHN3aXRjaCB0bworICAgdGhlIGludGVycnVwdCBzdGFjayAtIHRodXMgY29uc2lkZXJpbmcgdGhlIElSUSBzdGFjayBpdHNlbGYgaXMgdW5uZWNlc3NhcnksCisgICBhbmQgdGhlIG92ZXJoZWFkIG9mIGNvbXBhcmluZyBhZ2FpbnN0IGFsbCBleGNlcHRpb24gaGFuZGxpbmcgc3RhY2tzIHNlZW1zCisgICBub3QgZGVzaXJhYmxlLiAqLworI2RlZmluZSBTVEFDS19MSU1JVChwdHIpICAgICAoKChwdHIpIC0gMSkgJiB+KFRIUkVBRF9TSVpFIC0gMSkpCisKKyNkZWZpbmUgVU5XX1JFR0lTVEVSX0lORk8gXAorCVBUUkVHU19JTkZPKHJheCksIFwKKwlQVFJFR1NfSU5GTyhyZHgpLCBcCisJUFRSRUdTX0lORk8ocmN4KSwgXAorCVBUUkVHU19JTkZPKHJieCksIFwKKwlQVFJFR1NfSU5GTyhyc2kpLCBcCisJUFRSRUdTX0lORk8ocmRpKSwgXAorCVBUUkVHU19JTkZPKHJicCksIFwKKwlQVFJFR1NfSU5GTyhyc3ApLCBcCisJUFRSRUdTX0lORk8ocjgpLCBcCisJUFRSRUdTX0lORk8ocjkpLCBcCisJUFRSRUdTX0lORk8ocjEwKSwgXAorCVBUUkVHU19JTkZPKHIxMSksIFwKKwlQVFJFR1NfSU5GTyhyMTIpLCBcCisJUFRSRUdTX0lORk8ocjEzKSwgXAorCVBUUkVHU19JTkZPKHIxNCksIFwKKwlQVFJFR1NfSU5GTyhyMTUpLCBcCisJUFRSRUdTX0lORk8ocmlwKQorCitzdGF0aWMgaW5saW5lIHZvaWQgYXJjaF91bndfaW5pdF9mcmFtZV9pbmZvKHN0cnVjdCB1bndpbmRfZnJhbWVfaW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypjb25zdCovIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWluZm8tPnJlZ3MgPSAqcmVnczsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFyY2hfdW53X2luaXRfYmxvY2tlZChzdHJ1Y3QgdW53aW5kX2ZyYW1lX2luZm8gKmluZm8pCit7CisJZXh0ZXJuIGNvbnN0IGNoYXIgdGhyZWFkX3JldHVybltdOworCisJbWVtc2V0KCZpbmZvLT5yZWdzLCAwLCBzaXplb2YoaW5mby0+cmVncykpOworCWluZm8tPnJlZ3MucmlwID0gKHVuc2lnbmVkIGxvbmcpdGhyZWFkX3JldHVybjsKKwlpbmZvLT5yZWdzLmNzID0gX19LRVJORUxfQ1M7CisJX19nZXRfdXNlcihpbmZvLT5yZWdzLnJicCwgKHVuc2lnbmVkIGxvbmcgKilpbmZvLT50YXNrLT50aHJlYWQucnNwKTsKKwlpbmZvLT5yZWdzLnJzcCA9IGluZm8tPnRhc2stPnRocmVhZC5yc3A7CisJaW5mby0+cmVncy5zcyA9IF9fS0VSTkVMX0RTOworfQorCitleHRlcm4gaW50IGFyY2hfdW53aW5kX2luaXRfcnVubmluZyhzdHJ1Y3QgdW53aW5kX2ZyYW1lX2luZm8gKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAoKmNhbGxiYWNrKShzdHJ1Y3QgdW53aW5kX2ZyYW1lX2luZm8gKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICphcmcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYXJnKTsKKworc3RhdGljIGlubGluZSBpbnQgYXJjaF91bndfdXNlcl9tb2RlKGNvbnN0IHN0cnVjdCB1bndpbmRfZnJhbWVfaW5mbyAqaW5mbykKK3sKKyNpZiAwIC8qIFRoaXMgY2FuIG9ubHkgd29yayB3aGVuIHNlbGVjdG9yIHJlZ2lzdGVyIHNhdmVzL3Jlc3RvcmVzCisgICAgICAgICBhcmUgcHJvcGVybHkgYW5ub3RhdGVkIChhbmQgdHJhY2tlZCBpbiBVTldfUkVHSVNURVJfSU5GTykuICovCisJcmV0dXJuIHVzZXJfbW9kZSgmaW5mby0+cmVncyk7CisjZWxzZQorCXJldHVybiAobG9uZylpbmZvLT5yZWdzLnJpcCA+PSAwCisJICAgICAgIHx8IChpbmZvLT5yZWdzLnJpcCA+PSBWU1lTQ0FMTF9TVEFSVCAmJiBpbmZvLT5yZWdzLnJpcCA8IFZTWVNDQUxMX0VORCkKKwkgICAgICAgfHwgKGxvbmcpaW5mby0+cmVncy5yc3AgPj0gMDsKKyNlbmRpZgorfQorCisjZWxzZQorCisjZGVmaW5lIFVOV19QQyhmcmFtZSkgKCh2b2lkKShmcmFtZSksIDApCisKK3N0YXRpYyBpbmxpbmUgaW50IGFyY2hfdW53X3VzZXJfbW9kZShjb25zdCB2b2lkICppbmZvKQoreworCXJldHVybiAwOworfQorCisjZW5kaWYKKworI2VuZGlmIC8qIF9BU01fWDg2XzY0X1VOV0lORF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2tleXMvdXNlci10eXBlLmggYi9pbmNsdWRlL2tleXMvdXNlci10eXBlLmgKaW5kZXggYTNkYWUxOC4uYzM3YzM0MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9rZXlzL3VzZXItdHlwZS5oCisrKyBiL2luY2x1ZGUva2V5cy91c2VyLXR5cGUuaApAQCAtMzcsNiArMzcsNyBAQAogZXh0ZXJuIGludCB1c2VyX2luc3RhbnRpYXRlKHN0cnVjdCBrZXkgKmtleSwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGRhdGFsZW4pOwogZXh0ZXJuIGludCB1c2VyX3VwZGF0ZShzdHJ1Y3Qga2V5ICprZXksIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBkYXRhbGVuKTsKIGV4dGVybiBpbnQgdXNlcl9tYXRjaChjb25zdCBzdHJ1Y3Qga2V5ICprZXksIGNvbnN0IHZvaWQgKmNyaXRlcmlvbik7CitleHRlcm4gdm9pZCB1c2VyX3Jldm9rZShzdHJ1Y3Qga2V5ICprZXkpOwogZXh0ZXJuIHZvaWQgdXNlcl9kZXN0cm95KHN0cnVjdCBrZXkgKmtleSk7CiBleHRlcm4gdm9pZCB1c2VyX2Rlc2NyaWJlKGNvbnN0IHN0cnVjdCBrZXkgKnVzZXIsIHN0cnVjdCBzZXFfZmlsZSAqbSk7CiBleHRlcm4gbG9uZyB1c2VyX3JlYWQoY29uc3Qgc3RydWN0IGtleSAqa2V5LApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9hY2N0LmggYi9pbmNsdWRlL2xpbnV4L2FjY3QuaAppbmRleCAzZDU0ZmJjLi5lODZiYWU3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2FjY3QuaAorKysgYi9pbmNsdWRlL2xpbnV4L2FjY3QuaApAQCAtMTIxLDEzICsxMjEsMTcgQEAKIHN0cnVjdCBzdXBlcl9ibG9jazsKIGV4dGVybiB2b2lkIGFjY3RfYXV0b19jbG9zZV9tbnQoc3RydWN0IHZmc21vdW50ICptKTsKIGV4dGVybiB2b2lkIGFjY3RfYXV0b19jbG9zZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKLWV4dGVybiB2b2lkIGFjY3RfcHJvY2Vzcyhsb25nIGV4aXRjb2RlKTsKK2V4dGVybiB2b2lkIGFjY3RfaW5pdF9wYWNjdChzdHJ1Y3QgcGFjY3Rfc3RydWN0ICpwYWNjdCk7CitleHRlcm4gdm9pZCBhY2N0X2NvbGxlY3QobG9uZyBleGl0Y29kZSwgaW50IGdyb3VwX2RlYWQpOworZXh0ZXJuIHZvaWQgYWNjdF9wcm9jZXNzKHZvaWQpOwogZXh0ZXJuIHZvaWQgYWNjdF91cGRhdGVfaW50ZWdyYWxzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKTsKIGV4dGVybiB2b2lkIGFjY3RfY2xlYXJfaW50ZWdyYWxzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKTsKICNlbHNlCiAjZGVmaW5lIGFjY3RfYXV0b19jbG9zZV9tbnQoeCkJZG8geyB9IHdoaWxlICgwKQogI2RlZmluZSBhY2N0X2F1dG9fY2xvc2UoeCkJZG8geyB9IHdoaWxlICgwKQotI2RlZmluZSBhY2N0X3Byb2Nlc3MoeCkJCWRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgYWNjdF9pbml0X3BhY2N0KHgpCWRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgYWNjdF9jb2xsZWN0KHgseSkJZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBhY2N0X3Byb2Nlc3MoKQkJZG8geyB9IHdoaWxlICgwKQogI2RlZmluZSBhY2N0X3VwZGF0ZV9pbnRlZ3JhbHMoeCkJCWRvIHsgfSB3aGlsZSAoMCkKICNkZWZpbmUgYWNjdF9jbGVhcl9pbnRlZ3JhbHModGFzaykJZG8geyB9IHdoaWxlICgwKQogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Jpby5oIGIvaW5jbHVkZS9saW51eC9iaW8uaAppbmRleCBiNjBmZmUzLi43NmJkYWVhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Jpby5oCisrKyBiL2luY2x1ZGUvbGludXgvYmlvLmgKQEAgLTQ3LDcgKzQ3LDcgQEAKICNkZWZpbmUgQklPX0JVR19PTgogI2VuZGlmCiAKLSNkZWZpbmUgQklPX01BWF9QQUdFUwkJKDI1NikKKyNkZWZpbmUgQklPX01BWF9QQUdFUwkJMjU2CiAjZGVmaW5lIEJJT19NQVhfU0laRQkJKEJJT19NQVhfUEFHRVMgPDwgUEFHRV9DQUNIRV9TSElGVCkKICNkZWZpbmUgQklPX01BWF9TRUNUT1JTCQkoQklPX01BWF9TSVpFID4+IDkpCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYml0bWFwLmggYi9pbmNsdWRlL2xpbnV4L2JpdG1hcC5oCmluZGV4IGQ5ZWQyNzkuLmRjYzVkZTdjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2JpdG1hcC5oCisrKyBiL2luY2x1ZGUvbGludXgvYml0bWFwLmgKQEAgLTI0LDYgKzI0LDkgQEAKICAqIFRoZSBhdmFpbGFibGUgYml0bWFwIG9wZXJhdGlvbnMgYW5kIHRoZWlyIHJvdWdoIG1lYW5pbmcgaW4gdGhlCiAgKiBjYXNlIHRoYXQgdGhlIGJpdG1hcCBpcyBhIHNpbmdsZSB1bnNpZ25lZCBsb25nIGFyZSB0aHVzOgogICoKKyAqIE5vdGUgdGhhdCBuYml0cyBzaG91bGQgYmUgYWx3YXlzIGEgY29tcGlsZSB0aW1lIGV2YWx1YWJsZSBjb25zdGFudC4KKyAqIE90aGVyd2lzZSBtYW55IGlubGluZXMgd2lsbCBnZW5lcmF0ZSBob3JyaWJsZSBjb2RlLgorICoKICAqIGJpdG1hcF96ZXJvKGRzdCwgbmJpdHMpCQkJKmRzdCA9IDBVTAogICogYml0bWFwX2ZpbGwoZHN0LCBuYml0cykJCQkqZHN0ID0gfjBVTAogICogYml0bWFwX2NvcHkoZHN0LCBzcmMsIG5iaXRzKQkJCSpkc3QgPSAqc3JjCkBAIC0yNDQsNiArMjQ3LDggQEAKIAogc3RhdGljIGlubGluZSBpbnQgYml0bWFwX3dlaWdodChjb25zdCB1bnNpZ25lZCBsb25nICpzcmMsIGludCBuYml0cykKIHsKKwlpZiAobmJpdHMgPD0gQklUU19QRVJfTE9ORykKKwkJcmV0dXJuIGh3ZWlnaHRfbG9uZygqc3JjICYgQklUTUFQX0xBU1RfV09SRF9NQVNLKG5iaXRzKSk7CiAJcmV0dXJuIF9fYml0bWFwX3dlaWdodChzcmMsIG5iaXRzKTsKIH0KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jbG9ja3NvdXJjZS5oIGIvaW5jbHVkZS9saW51eC9jbG9ja3NvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4NTIwMjQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L2Nsb2Nrc291cmNlLmgKQEAgLTAsMCArMSwxODUgQEAKKy8qICBsaW51eC9pbmNsdWRlL2xpbnV4L2Nsb2Nrc291cmNlLmgKKyAqCisgKiAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMgZm9yIGNsb2Nrc291cmNlcy4KKyAqCisgKiAgSWYgeW91IGFyZSBub3QgYSBjbG9ja3NvdXJjZSwgb3IgdGltZWtlZXBpbmcgY29kZSwgeW91IHNob3VsZAorICogIG5vdCBiZSBpbmNsdWRpbmcgdGhpcyBmaWxlIQorICovCisjaWZuZGVmIF9MSU5VWF9DTE9DS1NPVVJDRV9ICisjZGVmaW5lIF9MSU5VWF9DTE9DS1NPVVJDRV9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWV4Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxhc20vZGl2NjQuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworLyogY2xvY2tzb3VyY2UgY3ljbGUgYmFzZSB0eXBlICovCit0eXBlZGVmIHU2NCBjeWNsZV90OworCisvKioKKyAqIHN0cnVjdCBjbG9ja3NvdXJjZSAtIGhhcmR3YXJlIGFic3RyYWN0aW9uIGZvciBhIGZyZWUgcnVubmluZyBjb3VudGVyCisgKglQcm92aWRlcyBtb3N0bHkgc3RhdGUtZnJlZSBhY2Nlc3NvcnMgdG8gdGhlIHVuZGVybHlpbmcgaGFyZHdhcmUuCisgKgorICogQG5hbWU6CQlwdHIgdG8gY2xvY2tzb3VyY2UgbmFtZQorICogQGxpc3Q6CQlsaXN0IGhlYWQgZm9yIHJlZ2lzdHJhdGlvbgorICogQHJhdGluZzoJCXJhdGluZyB2YWx1ZSBmb3Igc2VsZWN0aW9uIChoaWdoZXIgaXMgYmV0dGVyKQorICoJCQlUbyBhdm9pZCByYXRpbmcgaW5mbGF0aW9uIHRoZSBmb2xsb3dpbmcKKyAqCQkJbGlzdCBzaG91bGQgZ2l2ZSB5b3UgYSBndWlkZSBhcyB0byBob3cKKyAqCQkJdG8gYXNzaWduIHlvdXIgY2xvY2tzb3VyY2UgYSByYXRpbmcKKyAqCQkJMS05OTogVW5maXQgZm9yIHJlYWwgdXNlCisgKgkJCQlPbmx5IGF2YWlsYWJsZSBmb3IgYm9vdHVwIGFuZCB0ZXN0aW5nIHB1cnBvc2VzLgorICoJCQkxMDAtMTk5OiBCYXNlIGxldmVsIHVzYWJpbGl0eS4KKyAqCQkJCUZ1bmN0aW9uYWwgZm9yIHJlYWwgdXNlLCBidXQgbm90IGRlc2lyZWQuCisgKgkJCTIwMC0yOTk6IEdvb2QuCisgKgkJCQlBIGNvcnJlY3QgYW5kIHVzYWJsZSBjbG9ja3NvdXJjZS4KKyAqCQkJMzAwLTM5OTogRGVzaXJlZC4KKyAqCQkJCUEgcmVhc29uYWJseSBmYXN0IGFuZCBhY2N1cmF0ZSBjbG9ja3NvdXJjZS4KKyAqCQkJNDAwLTQ5OTogUGVyZmVjdAorICoJCQkJVGhlIGlkZWFsIGNsb2Nrc291cmNlLiBBIG11c3QtdXNlIHdoZXJlCisgKgkJCQlhdmFpbGFibGUuCisgKiBAcmVhZDoJCXJldHVybnMgYSBjeWNsZSB2YWx1ZQorICogQG1hc2s6CQliaXRtYXNrIGZvciB0d28ncyBjb21wbGVtZW50CisgKgkJCXN1YnRyYWN0aW9uIG9mIG5vbiA2NCBiaXQgY291bnRlcnMKKyAqIEBtdWx0OgkJY3ljbGUgdG8gbmFub3NlY29uZCBtdWx0aXBsaWVyCisgKiBAc2hpZnQ6CQljeWNsZSB0byBuYW5vc2Vjb25kIGRpdmlzb3IgKHBvd2VyIG9mIHR3bykKKyAqIEB1cGRhdGVfY2FsbGJhY2s6CWNhbGxlZCB3aGVuIHNhZmUgdG8gYWx0ZXIgY2xvY2tzb3VyY2UgdmFsdWVzCisgKiBAaXNfY29udGludW91czoJZGVmaW5lcyBpZiBjbG9ja3NvdXJjZSBpcyBmcmVlLXJ1bm5pbmcuCisgKiBAY3ljbGVfaW50ZXJ2YWw6CVVzZWQgaW50ZXJuYWxseSBieSB0aW1la2VlcGluZyBjb3JlLCBwbGVhc2UgaWdub3JlLgorICogQHh0aW1lX2ludGVydmFsOglVc2VkIGludGVybmFsbHkgYnkgdGltZWtlZXBpbmcgY29yZSwgcGxlYXNlIGlnbm9yZS4KKyAqLworc3RydWN0IGNsb2Nrc291cmNlIHsKKwljaGFyICpuYW1lOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlpbnQgcmF0aW5nOworCWN5Y2xlX3QgKCpyZWFkKSh2b2lkKTsKKwljeWNsZV90IG1hc2s7CisJdTMyIG11bHQ7CisJdTMyIHNoaWZ0OworCWludCAoKnVwZGF0ZV9jYWxsYmFjaykodm9pZCk7CisJaW50IGlzX2NvbnRpbnVvdXM7CisKKwkvKiB0aW1la2VlcGluZyBzcGVjaWZpYyBkYXRhLCBpZ25vcmUgKi8KKwljeWNsZV90IGN5Y2xlX2xhc3QsIGN5Y2xlX2ludGVydmFsOworCXU2NCB4dGltZV9uc2VjLCB4dGltZV9pbnRlcnZhbDsKKwlzNjQgZXJyb3I7Cit9OworCisvKiBzaW1wbGlmeSBpbml0aWFsaXphdGlvbiBvZiBtYXNrIGZpZWxkICovCisjZGVmaW5lIENMT0NLU09VUkNFX01BU0soYml0cykgKGN5Y2xlX3QpKGJpdHM8NjQgPyAoKDFVTEw8PGJpdHMpLTEpIDogLTEpCisKKy8qKgorICogY2xvY2tzb3VyY2Vfa2h6Mm11bHQgLSBjYWxjdWxhdGVzIG11bHQgZnJvbSBraHogYW5kIHNoaWZ0CisgKiBAa2h6OgkJQ2xvY2tzb3VyY2UgZnJlcXVlbmN5IGluIEtIegorICogQHNoaWZ0X2NvbnN0YW50OglDbG9ja3NvdXJjZSBzaGlmdCBmYWN0b3IKKyAqCisgKiBIZWxwZXIgZnVuY3Rpb25zIHRoYXQgY29udmVydHMgYSBraHogY291bnRlciBmcmVxdWVuY3kgdG8gYSB0aW1zb3VyY2UKKyAqIG11bHRpcGxpZXIsIGdpdmVuIHRoZSBjbG9ja3NvdXJjZSBzaGlmdCB2YWx1ZQorICovCitzdGF0aWMgaW5saW5lIHUzMiBjbG9ja3NvdXJjZV9raHoybXVsdCh1MzIga2h6LCB1MzIgc2hpZnRfY29uc3RhbnQpCit7CisJLyogIGtoeiA9IGN5Yy8oTWlsbGlvbiBucykKKwkgKiAgbXVsdC8yXnNoaWZ0ICA9IG5zL2N5YworCSAqICBtdWx0ID0gbnMvY3ljICogMl5zaGlmdAorCSAqICBtdWx0ID0gMU1pbGxpb24va2h6ICogMl5zaGlmdAorCSAqICBtdWx0ID0gMTAwMDAwMCAqIDJec2hpZnQgLyBraHoKKwkgKiAgbXVsdCA9ICgxMDAwMDAwPDxzaGlmdCkgLyBraHoKKwkgKi8KKwl1NjQgdG1wID0gKCh1NjQpMTAwMDAwMCkgPDwgc2hpZnRfY29uc3RhbnQ7CisKKwl0bXAgKz0ga2h6LzI7IC8qIHJvdW5kIGZvciBkb19kaXYgKi8KKwlkb19kaXYodG1wLCBraHopOworCisJcmV0dXJuICh1MzIpdG1wOworfQorCisvKioKKyAqIGNsb2Nrc291cmNlX2h6Mm11bHQgLSBjYWxjdWxhdGVzIG11bHQgZnJvbSBoeiBhbmQgc2hpZnQKKyAqIEBoejoJCQlDbG9ja3NvdXJjZSBmcmVxdWVuY3kgaW4gSHoKKyAqIEBzaGlmdF9jb25zdGFudDoJQ2xvY2tzb3VyY2Ugc2hpZnQgZmFjdG9yCisgKgorICogSGVscGVyIGZ1bmN0aW9ucyB0aGF0IGNvbnZlcnRzIGEgaHogY291bnRlcgorICogZnJlcXVlbmN5IHRvIGEgdGltc291cmNlIG11bHRpcGxpZXIsIGdpdmVuIHRoZQorICogY2xvY2tzb3VyY2Ugc2hpZnQgdmFsdWUKKyAqLworc3RhdGljIGlubGluZSB1MzIgY2xvY2tzb3VyY2VfaHoybXVsdCh1MzIgaHosIHUzMiBzaGlmdF9jb25zdGFudCkKK3sKKwkvKiAgaHogPSBjeWMvKEJpbGxpb24gbnMpCisJICogIG11bHQvMl5zaGlmdCAgPSBucy9jeWMKKwkgKiAgbXVsdCA9IG5zL2N5YyAqIDJec2hpZnQKKwkgKiAgbXVsdCA9IDFCaWxsaW9uL2h6ICogMl5zaGlmdAorCSAqICBtdWx0ID0gMTAwMDAwMDAwMCAqIDJec2hpZnQgLyBoegorCSAqICBtdWx0ID0gKDEwMDAwMDAwMDA8PHNoaWZ0KSAvIGh6CisJICovCisJdTY0IHRtcCA9ICgodTY0KTEwMDAwMDAwMDApIDw8IHNoaWZ0X2NvbnN0YW50OworCisJdG1wICs9IGh6LzI7IC8qIHJvdW5kIGZvciBkb19kaXYgKi8KKwlkb19kaXYodG1wLCBoeik7CisKKwlyZXR1cm4gKHUzMil0bXA7Cit9CisKKy8qKgorICogY2xvY2tzb3VyY2VfcmVhZDogLSBBY2Nlc3MgdGhlIGNsb2Nrc291cmNlJ3MgY3VycmVudCBjeWNsZSB2YWx1ZQorICogQGNzOgkJcG9pbnRlciB0byBjbG9ja3NvdXJjZSBiZWluZyByZWFkCisgKgorICogVXNlcyB0aGUgY2xvY2tzb3VyY2UgdG8gcmV0dXJuIHRoZSBjdXJyZW50IGN5Y2xlX3QgdmFsdWUKKyAqLworc3RhdGljIGlubGluZSBjeWNsZV90IGNsb2Nrc291cmNlX3JlYWQoc3RydWN0IGNsb2Nrc291cmNlICpjcykKK3sKKwlyZXR1cm4gY3MtPnJlYWQoKTsKK30KKworLyoqCisgKiBjeWMybnMgLSBjb252ZXJ0cyBjbG9ja3NvdXJjZSBjeWNsZXMgdG8gbmFub3NlY29uZHMKKyAqIEBjczoJCVBvaW50ZXIgdG8gY2xvY2tzb3VyY2UKKyAqIEBjeWNsZXM6CUN5Y2xlcworICoKKyAqIFVzZXMgdGhlIGNsb2Nrc291cmNlIGFuZCBudHAgYWpkdXN0bWVudCB0byBjb252ZXJ0IGN5Y2xlX3RzIHRvIG5hbm9zZWNvbmRzLgorICoKKyAqIFhYWCAtIFRoaXMgY291bGQgdXNlIHNvbWUgbXVsdF9seGxfbGwoKSBhc20gb3B0aW1pemF0aW9uCisgKi8KK3N0YXRpYyBpbmxpbmUgczY0IGN5YzJucyhzdHJ1Y3QgY2xvY2tzb3VyY2UgKmNzLCBjeWNsZV90IGN5Y2xlcykKK3sKKwl1NjQgcmV0ID0gKHU2NCljeWNsZXM7CisJcmV0ID0gKHJldCAqIGNzLT5tdWx0KSA+PiBjcy0+c2hpZnQ7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBjbG9ja3NvdXJjZV9jYWxjdWxhdGVfaW50ZXJ2YWwgLSBDYWxjdWxhdGVzIGEgY2xvY2tzb3VyY2UgaW50ZXJ2YWwgc3RydWN0CisgKgorICogQGM6CQlQb2ludGVyIHRvIGNsb2Nrc291cmNlLgorICogQGxlbmd0aF9uc2VjOiBEZXNpcmVkIGludGVydmFsIGxlbmd0aCBpbiBuYW5vc2Vjb25kcy4KKyAqCisgKiBDYWxjdWxhdGVzIGEgZml4ZWQgY3ljbGUvbnNlYyBpbnRlcnZhbCBmb3IgYSBnaXZlbiBjbG9ja3NvdXJjZS9hZGp1c3RtZW50CisgKiBwYWlyIGFuZCBpbnRlcnZhbCByZXF1ZXN0LgorICoKKyAqIFVubGVzcyB5b3UncmUgdGhlIHRpbWVrZWVwaW5nIGNvZGUsIHlvdSBzaG91bGQgbm90IGJlIHVzaW5nIHRoaXMhCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBjbG9ja3NvdXJjZV9jYWxjdWxhdGVfaW50ZXJ2YWwoc3RydWN0IGNsb2Nrc291cmNlICpjLAorCQkJCQkJdW5zaWduZWQgbG9uZyBsZW5ndGhfbnNlYykKK3sKKwl1NjQgdG1wOworCisJLyogWFhYIC0gQWxsIG9mIHRoaXMgY291bGQgdXNlIGEgd2hvbGUgbG90IG9mIG9wdGltaXphdGlvbiAqLworCXRtcCA9IGxlbmd0aF9uc2VjOworCXRtcCA8PD0gYy0+c2hpZnQ7CisJdG1wICs9IGMtPm11bHQvMjsKKwlkb19kaXYodG1wLCBjLT5tdWx0KTsKKworCWMtPmN5Y2xlX2ludGVydmFsID0gKGN5Y2xlX3QpdG1wOworCWlmIChjLT5jeWNsZV9pbnRlcnZhbCA9PSAwKQorCQljLT5jeWNsZV9pbnRlcnZhbCA9IDE7CisKKwljLT54dGltZV9pbnRlcnZhbCA9ICh1NjQpYy0+Y3ljbGVfaW50ZXJ2YWwgKiBjLT5tdWx0OworfQorCisKKy8qIHVzZWQgdG8gaW5zdGFsbCBhIG5ldyBjbG9ja3NvdXJjZSAqLworaW50IGNsb2Nrc291cmNlX3JlZ2lzdGVyKHN0cnVjdCBjbG9ja3NvdXJjZSopOwordm9pZCBjbG9ja3NvdXJjZV9yZXNlbGVjdCh2b2lkKTsKK3N0cnVjdCBjbG9ja3NvdXJjZSogY2xvY2tzb3VyY2VfZ2V0X25leHQodm9pZCk7CisKKyNlbmRpZiAvKiBfTElOVVhfQ0xPQ0tTT1VSQ0VfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jb21wYXQuaCBiL2luY2x1ZGUvbGludXgvY29tcGF0LmgKaW5kZXggZGRhMTY5Ny4uOTc2MDc1MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jb21wYXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NvbXBhdC5oCkBAIC0yMjYsNSArMjI2LDcgQEAKIAogYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfYWRqdGltZXgoc3RydWN0IGNvbXBhdF90aW1leCBfX3VzZXIgKnV0cCk7CiAKK2V4dGVybiBpbnQgY29tcGF0X3ByaW50ayhjb25zdCBjaGFyICpmbXQsIC4uLik7CisKICNlbmRpZiAvKiBDT05GSUdfQ09NUEFUICovCiAjZW5kaWYgLyogX0xJTlVYX0NPTVBBVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NvbXBhdF9pb2N0bC5oIGIvaW5jbHVkZS9saW51eC9jb21wYXRfaW9jdGwuaAppbmRleCA4OWFiNjc3Li45MTdkNjJlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NvbXBhdF9pb2N0bC5oCisrKyBiL2luY2x1ZGUvbGludXgvY29tcGF0X2lvY3RsLmgKQEAgLTY3Myw2ICs2NzMsMTEgQEAKIENPTVBBVElCTEVfSU9DVEwoQ0FQSV9DTFJfRkxBR1MpCiBDT01QQVRJQkxFX0lPQ1RMKENBUElfTkNDSV9PUEVOQ09VTlQpCiBDT01QQVRJQkxFX0lPQ1RMKENBUElfTkNDSV9HRVRVTklUKQorLyogU2llbWVucyBHaWdhc2V0ICovCitDT01QQVRJQkxFX0lPQ1RMKEdJR0FTRVRfUkVESVIpCitDT01QQVRJQkxFX0lPQ1RMKEdJR0FTRVRfQ09ORklHKQorQ09NUEFUSUJMRV9JT0NUTChHSUdBU0VUX0JSS0NIQVJTKQorQ09NUEFUSUJMRV9JT0NUTChHSUdBU0VUX1ZFUlNJT04pCiAvKiBNaXNjLiAqLwogQ09NUEFUSUJMRV9JT0NUTCgweDQxNTQ1OTAwKQkJLyogQVRZSU9fQ0xLUiAqLwogQ09NUEFUSUJMRV9JT0NUTCgweDQxNTQ1OTAxKQkJLyogQVRZSU9fQ0xLVyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jb25zb2xlLmggYi9pbmNsdWRlL2xpbnV4L2NvbnNvbGUuaAppbmRleCAwODczNGU2Li4zYmRmMjE1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NvbnNvbGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NvbnNvbGUuaApAQCAtNjMsOSArNjMsMTEgQEAKIGV4dGVybiBjb25zdCBzdHJ1Y3QgY29uc3cgbmV3cG9ydF9jb247CS8qIFNHSSBOZXdwb3J0IGNvbnNvbGUgICovCiBleHRlcm4gY29uc3Qgc3RydWN0IGNvbnN3IHByb21fY29uOwkvKiBTUEFSQyBQUk9NIGNvbnNvbGUgKi8KIAoraW50IGNvbl9pc19ib3VuZChjb25zdCBzdHJ1Y3QgY29uc3cgKmNzdyk7CitpbnQgcmVnaXN0ZXJfY29uX2RyaXZlcihjb25zdCBzdHJ1Y3QgY29uc3cgKmNzdywgaW50IGZpcnN0LCBpbnQgbGFzdCk7CitpbnQgdW5yZWdpc3Rlcl9jb25fZHJpdmVyKGNvbnN0IHN0cnVjdCBjb25zdyAqY3N3KTsKIGludCB0YWtlX292ZXJfY29uc29sZShjb25zdCBzdHJ1Y3QgY29uc3cgKnN3LCBpbnQgZmlyc3QsIGludCBsYXN0LCBpbnQgZGVmbHQpOwogdm9pZCBnaXZlX3VwX2NvbnNvbGUoY29uc3Qgc3RydWN0IGNvbnN3ICpzdyk7Ci0KIC8qIHNjcm9sbCAqLwogI2RlZmluZSBTTV9VUCAgICAgICAoMSkKICNkZWZpbmUgU01fRE9XTiAgICAgKDIpCkBAIC04Nyw2ICs4OSw3IEBACiAjZGVmaW5lIENPTl9DT05TREVWCSgyKSAvKiBMYXN0IG9uIHRoZSBjb21tYW5kIGxpbmUgKi8KICNkZWZpbmUgQ09OX0VOQUJMRUQJKDQpCiAjZGVmaW5lIENPTl9CT09UCSg4KQorI2RlZmluZSBDT05fQU5ZVElNRQkoMTYpIC8qIFNhZmUgdG8gY2FsbCB3aGVuIGNwdSBpcyBvZmZsaW5lICovCiAKIHN0cnVjdCBjb25zb2xlCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NwdW1hc2suaCBiL2luY2x1ZGUvbGludXgvY3B1bWFzay5oCmluZGV4IDljYmI3ODEuLmIyNjhhM2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY3B1bWFzay5oCisrKyBiL2luY2x1ZGUvbGludXgvY3B1bWFzay5oCkBAIC0zMTcsNyArMzE3LDggQEAKIAkJKGNwdSkgPCBOUl9DUFVTOwkJXAogCQkoY3B1KSA9IG5leHRfY3B1KChjcHUpLCAobWFzaykpKQogI2Vsc2UgLyogTlJfQ1BVUyA9PSAxICovCi0jZGVmaW5lIGZvcl9lYWNoX2NwdV9tYXNrKGNwdSwgbWFzaykgZm9yICgoY3B1KSA9IDA7IChjcHUpIDwgMTsgKGNwdSkrKykKKyNkZWZpbmUgZm9yX2VhY2hfY3B1X21hc2soY3B1LCBtYXNrKQkJXAorCWZvciAoKGNwdSkgPSAwOyAoY3B1KSA8IDE7IChjcHUpKyssICh2b2lkKW1hc2spCiAjZW5kaWYgLyogTlJfQ1BVUyAqLwogCiAvKgpAQCAtNDA1LDcgKzQwNiw2IEBACiAjZGVmaW5lIGFueV9vbmxpbmVfY3B1KG1hc2spCQkwCiAjZW5kaWYKIAotI2RlZmluZSBmb3JfZWFjaF9jcHUoY3B1KSAgZm9yX2VhY2hfY3B1X21hc2soKGNwdSksIGNwdV9wb3NzaWJsZV9tYXApCiAjZGVmaW5lIGZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpICBmb3JfZWFjaF9jcHVfbWFzaygoY3B1KSwgY3B1X3Bvc3NpYmxlX21hcCkKICNkZWZpbmUgZm9yX2VhY2hfb25saW5lX2NwdShjcHUpICBmb3JfZWFjaF9jcHVfbWFzaygoY3B1KSwgY3B1X29ubGluZV9tYXApCiAjZGVmaW5lIGZvcl9lYWNoX3ByZXNlbnRfY3B1KGNwdSkgZm9yX2VhY2hfY3B1X21hc2soKGNwdSksIGNwdV9wcmVzZW50X21hcCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY3J5cHRvLmggYi9pbmNsdWRlL2xpbnV4L2NyeXB0by5oCmluZGV4IDVhMDQ3MGUuLjdmOTQ2MjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY3J5cHRvLmgKKysrIGIvaW5jbHVkZS9saW51eC9jcnlwdG8uaApAQCAtNjYsNyArNjYsNyBAQAogCiBzdHJ1Y3QgY2lwaGVyX2Rlc2MgewogCXN0cnVjdCBjcnlwdG9fdGZtICp0Zm07Ci0Jdm9pZCAoKmNyZm4pKHZvaWQgKmN0eCwgdTggKmRzdCwgY29uc3QgdTggKnNyYyk7CisJdm9pZCAoKmNyZm4pKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpOwogCXVuc2lnbmVkIGludCAoKnByZm4pKGNvbnN0IHN0cnVjdCBjaXBoZXJfZGVzYyAqZGVzYywgdTggKmRzdCwKIAkJCSAgICAgY29uc3QgdTggKnNyYywgdW5zaWduZWQgaW50IG5ieXRlcyk7CiAJdm9pZCAqaW5mbzsKQEAgLTc5LDEwICs3OSwxMCBAQAogc3RydWN0IGNpcGhlcl9hbGcgewogCXVuc2lnbmVkIGludCBjaWFfbWluX2tleXNpemU7CiAJdW5zaWduZWQgaW50IGNpYV9tYXhfa2V5c2l6ZTsKLQlpbnQgKCpjaWFfc2V0a2V5KSh2b2lkICpjdHgsIGNvbnN0IHU4ICprZXksCisJaW50ICgqY2lhX3NldGtleSkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgY29uc3QgdTggKmtleSwKIAkgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQga2V5bGVuLCB1MzIgKmZsYWdzKTsKLQl2b2lkICgqY2lhX2VuY3J5cHQpKHZvaWQgKmN0eCwgdTggKmRzdCwgY29uc3QgdTggKnNyYyk7Ci0Jdm9pZCAoKmNpYV9kZWNyeXB0KSh2b2lkICpjdHgsIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpOworCXZvaWQgKCpjaWFfZW5jcnlwdCkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKmRzdCwgY29uc3QgdTggKnNyYyk7CisJdm9pZCAoKmNpYV9kZWNyeXB0KShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqZHN0LCBjb25zdCB1OCAqc3JjKTsKIAogCXVuc2lnbmVkIGludCAoKmNpYV9lbmNyeXB0X2VjYikoY29uc3Qgc3RydWN0IGNpcGhlcl9kZXNjICpkZXNjLAogCQkJCQl1OCAqZHN0LCBjb25zdCB1OCAqc3JjLApAQCAtMTAwLDIwICsxMDAsMTkgQEAKIAogc3RydWN0IGRpZ2VzdF9hbGcgewogCXVuc2lnbmVkIGludCBkaWFfZGlnZXN0c2l6ZTsKLQl2b2lkICgqZGlhX2luaXQpKHZvaWQgKmN0eCk7Ci0Jdm9pZCAoKmRpYV91cGRhdGUpKHZvaWQgKmN0eCwgY29uc3QgdTggKmRhdGEsIHVuc2lnbmVkIGludCBsZW4pOwotCXZvaWQgKCpkaWFfZmluYWwpKHZvaWQgKmN0eCwgdTggKm91dCk7Ci0JaW50ICgqZGlhX3NldGtleSkodm9pZCAqY3R4LCBjb25zdCB1OCAqa2V5LAorCXZvaWQgKCpkaWFfaW5pdCkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSk7CisJdm9pZCAoKmRpYV91cGRhdGUpKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIGNvbnN0IHU4ICpkYXRhLAorCQkJICAgdW5zaWduZWQgaW50IGxlbik7CisJdm9pZCAoKmRpYV9maW5hbCkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKm91dCk7CisJaW50ICgqZGlhX3NldGtleSkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgY29uc3QgdTggKmtleSwKIAkgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQga2V5bGVuLCB1MzIgKmZsYWdzKTsKIH07CiAKIHN0cnVjdCBjb21wcmVzc19hbGcgewotCWludCAoKmNvYV9pbml0KSh2b2lkICpjdHgpOwotCXZvaWQgKCpjb2FfZXhpdCkodm9pZCAqY3R4KTsKLQlpbnQgKCpjb2FfY29tcHJlc3MpKHZvaWQgKmN0eCwgY29uc3QgdTggKnNyYywgdW5zaWduZWQgaW50IHNsZW4sCi0JICAgICAgICAgICAgICAgICAgICB1OCAqZHN0LCB1bnNpZ25lZCBpbnQgKmRsZW4pOwotCWludCAoKmNvYV9kZWNvbXByZXNzKSh2b2lkICpjdHgsIGNvbnN0IHU4ICpzcmMsIHVuc2lnbmVkIGludCBzbGVuLAotCSAgICAgICAgICAgICAgICAgICAgICB1OCAqZHN0LCB1bnNpZ25lZCBpbnQgKmRsZW4pOworCWludCAoKmNvYV9jb21wcmVzcykoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgY29uc3QgdTggKnNyYywKKwkJCSAgICB1bnNpZ25lZCBpbnQgc2xlbiwgdTggKmRzdCwgdW5zaWduZWQgaW50ICpkbGVuKTsKKwlpbnQgKCpjb2FfZGVjb21wcmVzcykoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgY29uc3QgdTggKnNyYywKKwkJCSAgICAgIHVuc2lnbmVkIGludCBzbGVuLCB1OCAqZHN0LCB1bnNpZ25lZCBpbnQgKmRsZW4pOwogfTsKIAogI2RlZmluZSBjcmFfY2lwaGVyCWNyYV91LmNpcGhlcgpAQCAtMTI5LDE0ICsxMjgsMTcgQEAKIAogCWludCBjcmFfcHJpb3JpdHk7CiAKLQljb25zdCBjaGFyIGNyYV9uYW1lW0NSWVBUT19NQVhfQUxHX05BTUVdOwotCWNvbnN0IGNoYXIgY3JhX2RyaXZlcl9uYW1lW0NSWVBUT19NQVhfQUxHX05BTUVdOworCWNoYXIgY3JhX25hbWVbQ1JZUFRPX01BWF9BTEdfTkFNRV07CisJY2hhciBjcmFfZHJpdmVyX25hbWVbQ1JZUFRPX01BWF9BTEdfTkFNRV07CiAKIAl1bmlvbiB7CiAJCXN0cnVjdCBjaXBoZXJfYWxnIGNpcGhlcjsKIAkJc3RydWN0IGRpZ2VzdF9hbGcgZGlnZXN0OwogCQlzdHJ1Y3QgY29tcHJlc3NfYWxnIGNvbXByZXNzOwogCX0gY3JhX3U7CisKKwlpbnQgKCpjcmFfaW5pdCkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSk7CisJdm9pZCAoKmNyYV9leGl0KShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKTsKIAkKIAlzdHJ1Y3QgbW9kdWxlICpjcmFfbW9kdWxlOwogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZGV2aWNlLW1hcHBlci5oIGIvaW5jbHVkZS9saW51eC9kZXZpY2UtbWFwcGVyLmgKaW5kZXggYWVlMTBiMi4uZTNkMWMzMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9kZXZpY2UtbWFwcGVyLmgKKysrIGIvaW5jbHVkZS9saW51eC9kZXZpY2UtbWFwcGVyLmgKQEAgLTgsOSArOCwxMiBAQAogI2lmbmRlZiBfTElOVVhfREVWSUNFX01BUFBFUl9ICiAjZGVmaW5lIF9MSU5VWF9ERVZJQ0VfTUFQUEVSX0gKIAorI2lmZGVmIF9fS0VSTkVMX18KKwogc3RydWN0IGRtX3RhcmdldDsKIHN0cnVjdCBkbV90YWJsZTsKIHN0cnVjdCBkbV9kZXY7CitzdHJ1Y3QgbWFwcGVkX2RldmljZTsKIAogdHlwZWRlZiBlbnVtIHsgU1RBVFVTVFlQRV9JTkZPLCBTVEFUVVNUWVBFX1RBQkxFIH0gc3RhdHVzX3R5cGVfdDsKIApAQCAtNzgsNyArODEsNyBAQAogc3RydWN0IHRhcmdldF90eXBlIHsKIAljb25zdCBjaGFyICpuYW1lOwogCXN0cnVjdCBtb2R1bGUgKm1vZHVsZTsKLSAgICAgICAgdW5zaWduZWQgdmVyc2lvblszXTsKKwl1bnNpZ25lZCB2ZXJzaW9uWzNdOwogCWRtX2N0cl9mbiBjdHI7CiAJZG1fZHRyX2ZuIGR0cjsKIAlkbV9tYXBfZm4gbWFwOwpAQCAtMTI4LDQgKzEzMSwxMDggQEAKIGludCBkbV9yZWdpc3Rlcl90YXJnZXQoc3RydWN0IHRhcmdldF90eXBlICp0KTsKIGludCBkbV91bnJlZ2lzdGVyX3RhcmdldChzdHJ1Y3QgdGFyZ2V0X3R5cGUgKnQpOwogCi0jZW5kaWYJCQkJLyogX0xJTlVYX0RFVklDRV9NQVBQRVJfSCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGdW5jdGlvbnMgZm9yIGNyZWF0aW5nIGFuZCBtYW5pcHVsYXRpbmcgbWFwcGVkIGRldmljZXMuCisgKiBEcm9wIHRoZSByZWZlcmVuY2Ugd2l0aCBkbV9wdXQgd2hlbiB5b3UgZmluaXNoIHdpdGggdGhlIG9iamVjdC4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIERNX0FOWV9NSU5PUiBjaG9vc2VzIHRoZSBuZXh0IGF2YWlsYWJsZSBtaW5vciBudW1iZXIuCisgKi8KKyNkZWZpbmUgRE1fQU5ZX01JTk9SICgtMSkKK2ludCBkbV9jcmVhdGUoaW50IG1pbm9yLCBzdHJ1Y3QgbWFwcGVkX2RldmljZSAqKm1kKTsKKworLyoKKyAqIFJlZmVyZW5jZSBjb3VudGluZyBmb3IgbWQuCisgKi8KK3N0cnVjdCBtYXBwZWRfZGV2aWNlICpkbV9nZXRfbWQoZGV2X3QgZGV2KTsKK3ZvaWQgZG1fZ2V0KHN0cnVjdCBtYXBwZWRfZGV2aWNlICptZCk7Cit2b2lkIGRtX3B1dChzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQpOworCisvKgorICogQW4gYXJiaXRyYXJ5IHBvaW50ZXIgbWF5IGJlIHN0b3JlZCBhbG9uZ3NpZGUgYSBtYXBwZWQgZGV2aWNlLgorICovCit2b2lkIGRtX3NldF9tZHB0cihzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQsIHZvaWQgKnB0cik7Cit2b2lkICpkbV9nZXRfbWRwdHIoc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kKTsKKworLyoKKyAqIEEgZGV2aWNlIGNhbiBzdGlsbCBiZSB1c2VkIHdoaWxlIHN1c3BlbmRlZCwgYnV0IEkvTyBpcyBkZWZlcnJlZC4KKyAqLworaW50IGRtX3N1c3BlbmQoc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kLCBpbnQgd2l0aF9sb2NrZnMpOworaW50IGRtX3Jlc3VtZShzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQpOworCisvKgorICogRXZlbnQgZnVuY3Rpb25zLgorICovCit1aW50MzJfdCBkbV9nZXRfZXZlbnRfbnIoc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kKTsKK2ludCBkbV93YWl0X2V2ZW50KHN0cnVjdCBtYXBwZWRfZGV2aWNlICptZCwgaW50IGV2ZW50X25yKTsKKworLyoKKyAqIEluZm8gZnVuY3Rpb25zLgorICovCitjb25zdCBjaGFyICpkbV9kZXZpY2VfbmFtZShzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQpOworc3RydWN0IGdlbmRpc2sgKmRtX2Rpc2soc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kKTsKK2ludCBkbV9zdXNwZW5kZWQoc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kKTsKKworLyoKKyAqIEdlb21ldHJ5IGZ1bmN0aW9ucy4KKyAqLworaW50IGRtX2dldF9nZW9tZXRyeShzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQsIHN0cnVjdCBoZF9nZW9tZXRyeSAqZ2VvKTsKK2ludCBkbV9zZXRfZ2VvbWV0cnkoc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kLCBzdHJ1Y3QgaGRfZ2VvbWV0cnkgKmdlbyk7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRnVuY3Rpb25zIGZvciBtYW5pcHVsYXRpbmcgZGV2aWNlLW1hcHBlciB0YWJsZXMuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBGaXJzdCBjcmVhdGUgYW4gZW1wdHkgdGFibGUuCisgKi8KK2ludCBkbV90YWJsZV9jcmVhdGUoc3RydWN0IGRtX3RhYmxlICoqcmVzdWx0LCBpbnQgbW9kZSwKKwkJICAgIHVuc2lnbmVkIG51bV90YXJnZXRzLCBzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQpOworCisvKgorICogVGhlbiBjYWxsIHRoaXMgb25jZSBmb3IgZWFjaCB0YXJnZXQuCisgKi8KK2ludCBkbV90YWJsZV9hZGRfdGFyZ2V0KHN0cnVjdCBkbV90YWJsZSAqdCwgY29uc3QgY2hhciAqdHlwZSwKKwkJCXNlY3Rvcl90IHN0YXJ0LCBzZWN0b3JfdCBsZW4sIGNoYXIgKnBhcmFtcyk7CisKKy8qCisgKiBGaW5hbGx5IGNhbGwgdGhpcyB0byBtYWtlIHRoZSB0YWJsZSByZWFkeSBmb3IgdXNlLgorICovCitpbnQgZG1fdGFibGVfY29tcGxldGUoc3RydWN0IGRtX3RhYmxlICp0KTsKKworLyoKKyAqIFRhYmxlIHJlZmVyZW5jZSBjb3VudGluZy4KKyAqLworc3RydWN0IGRtX3RhYmxlICpkbV9nZXRfdGFibGUoc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kKTsKK3ZvaWQgZG1fdGFibGVfZ2V0KHN0cnVjdCBkbV90YWJsZSAqdCk7Cit2b2lkIGRtX3RhYmxlX3B1dChzdHJ1Y3QgZG1fdGFibGUgKnQpOworCisvKgorICogUXVlcmllcworICovCitzZWN0b3JfdCBkbV90YWJsZV9nZXRfc2l6ZShzdHJ1Y3QgZG1fdGFibGUgKnQpOwordW5zaWduZWQgaW50IGRtX3RhYmxlX2dldF9udW1fdGFyZ2V0cyhzdHJ1Y3QgZG1fdGFibGUgKnQpOworaW50IGRtX3RhYmxlX2dldF9tb2RlKHN0cnVjdCBkbV90YWJsZSAqdCk7CitzdHJ1Y3QgbWFwcGVkX2RldmljZSAqZG1fdGFibGVfZ2V0X21kKHN0cnVjdCBkbV90YWJsZSAqdCk7CisKKy8qCisgKiBUcmlnZ2VyIGFuIGV2ZW50LgorICovCit2b2lkIGRtX3RhYmxlX2V2ZW50KHN0cnVjdCBkbV90YWJsZSAqdCk7CisKKy8qCisgKiBUaGUgZGV2aWNlIG11c3QgYmUgc3VzcGVuZGVkIGJlZm9yZSBjYWxsaW5nIHRoaXMgbWV0aG9kLgorICovCitpbnQgZG1fc3dhcF90YWJsZShzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQsIHN0cnVjdCBkbV90YWJsZSAqdCk7CisKKy8qCisgKiBQcmVwYXJlIGEgdGFibGUgZm9yIGEgZGV2aWNlIHRoYXQgd2lsbCBlcnJvciBhbGwgSS9PLgorICogVG8gbWFrZSBpdCBhY3RpdmUsIGNhbGwgZG1fc3VzcGVuZCgpLCBkbV9zd2FwX3RhYmxlKCkgdGhlbiBkbV9yZXN1bWUoKS4KKyAqLworaW50IGRtX2NyZWF0ZV9lcnJvcl90YWJsZShzdHJ1Y3QgZG1fdGFibGUgKipyZXN1bHQsIHN0cnVjdCBtYXBwZWRfZGV2aWNlICptZCk7CisKKyNlbmRpZgkvKiBfX0tFUk5FTF9fICovCisjZW5kaWYJLyogX0xJTlVYX0RFVklDRV9NQVBQRVJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kbS1pb2N0bC5oIGIvaW5jbHVkZS9saW51eC9kbS1pb2N0bC5oCmluZGV4IGM2N2M2NzguLjk2MjNiYjYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZG0taW9jdGwuaAorKysgYi9pbmNsdWRlL2xpbnV4L2RtLWlvY3RsLmgKQEAgLTI4NSw5ICsyODUsOSBAQAogI2RlZmluZSBETV9ERVZfU0VUX0dFT01FVFJZCV9JT1dSKERNX0lPQ1RMLCBETV9ERVZfU0VUX0dFT01FVFJZX0NNRCwgc3RydWN0IGRtX2lvY3RsKQogCiAjZGVmaW5lIERNX1ZFUlNJT05fTUFKT1IJNAotI2RlZmluZSBETV9WRVJTSU9OX01JTk9SCTYKKyNkZWZpbmUgRE1fVkVSU0lPTl9NSU5PUgk3CiAjZGVmaW5lIERNX1ZFUlNJT05fUEFUQ0hMRVZFTAkwCi0jZGVmaW5lIERNX1ZFUlNJT05fRVhUUkEJIi1pb2N0bCAoMjAwNi0wMi0xNykiCisjZGVmaW5lIERNX1ZFUlNJT05fRVhUUkEJIi1pb2N0bCAoMjAwNi0wNi0yNCkiCiAKIC8qIFN0YXR1cyBiaXRzICovCiAjZGVmaW5lIERNX1JFQURPTkxZX0ZMQUcJKDEgPDwgMCkgLyogSW4vT3V0ICovCkBAIC0zMTQsNyArMzE0LDcgQEAKICNkZWZpbmUgRE1fQlVGRkVSX0ZVTExfRkxBRwkoMSA8PCA4KSAvKiBPdXQgKi8KIAogLyoKLSAqIFNldCB0aGlzIHRvIGltcHJvdmUgcGVyZm9ybWFuY2Ugd2hlbiB5b3UgYXJlbid0IGdvaW5nIHRvIHVzZSBvcGVuX2NvdW50LgorICogVGhpcyBmbGFnIGlzIG5vdyBpZ25vcmVkLgogICovCiAjZGVmaW5lIERNX1NLSVBfQkRHRVRfRkxBRwkoMSA8PCA5KSAvKiBJbiAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2R2Yi9kbXguaCBiL2luY2x1ZGUvbGludXgvZHZiL2RteC5oCmluZGV4IDI3ODdiOGEuLmM2YTIzNTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZHZiL2RteC5oCisrKyBiL2luY2x1ZGUvbGludXgvZHZiL2RteC5oCkBAIC04OCwyMCArODgsNiBAQAogI2RlZmluZSBETVhfUEVTX1BDUiAgICAgIERNWF9QRVNfUENSMAogCiAKLXR5cGVkZWYgZW51bQotewotCURNWF9TQ1JBTUJMSU5HX0VWLAotCURNWF9GUk9OVEVORF9FVgotfSBkbXhfZXZlbnRfdDsKLQotCi10eXBlZGVmIGVudW0KLXsKLQlETVhfU0NSQU1CTElOR19PRkYsCi0JRE1YX1NDUkFNQkxJTkdfT04KLX0gZG14X3NjcmFtYmxpbmdfc3RhdHVzX3Q7Ci0KLQogdHlwZWRlZiBzdHJ1Y3QgZG14X2ZpbHRlcgogewogCV9fdTggIGZpbHRlcltETVhfRklMVEVSX1NJWkVdOwpAQCAtMTMyLDE3ICsxMTgsNiBAQAogCV9fdTMyICAgICAgICAgIGZsYWdzOwogfTsKIAotCi1zdHJ1Y3QgZG14X2V2ZW50Ci17Ci0JZG14X2V2ZW50X3QgICAgICAgICBldmVudDsKLQl0aW1lX3QgICAgICAgICAgICAgIHRpbWVTdGFtcDsKLQl1bmlvbgotCXsKLQkJZG14X3NjcmFtYmxpbmdfc3RhdHVzX3Qgc2NyYW1ibGluZzsKLQl9IHU7Ci19OwotCiB0eXBlZGVmIHN0cnVjdCBkbXhfY2FwcyB7CiAJX191MzIgY2FwczsKIAlpbnQgbnVtX2RlY29kZXJzOwpAQCAtMTcxLDcgKzE0Niw2IEBACiAjZGVmaW5lIERNWF9TRVRfRklMVEVSICAgICAgICAgICBfSU9XKCdvJywgNDMsIHN0cnVjdCBkbXhfc2N0X2ZpbHRlcl9wYXJhbXMpCiAjZGVmaW5lIERNWF9TRVRfUEVTX0ZJTFRFUiAgICAgICBfSU9XKCdvJywgNDQsIHN0cnVjdCBkbXhfcGVzX2ZpbHRlcl9wYXJhbXMpCiAjZGVmaW5lIERNWF9TRVRfQlVGRkVSX1NJWkUgICAgICBfSU8oJ28nLCA0NSkKLSNkZWZpbmUgRE1YX0dFVF9FVkVOVCAgICAgICAgICAgIF9JT1IoJ28nLCA0Niwgc3RydWN0IGRteF9ldmVudCkKICNkZWZpbmUgRE1YX0dFVF9QRVNfUElEUyAgICAgICAgIF9JT1IoJ28nLCA0NywgX191MTZbNV0pCiAjZGVmaW5lIERNWF9HRVRfQ0FQUyAgICAgICAgICAgICBfSU9SKCdvJywgNDgsIGRteF9jYXBzX3QpCiAjZGVmaW5lIERNWF9TRVRfU09VUkNFICAgICAgICAgICBfSU9XKCdvJywgNDksIGRteF9zb3VyY2VfdCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZXZlbnRwb2xsLmggYi9pbmNsdWRlL2xpbnV4L2V2ZW50cG9sbC5oCmluZGV4IDFlNGJkZmMuLjg0Y2ZhOGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZXZlbnRwb2xsLmgKKysrIGIvaW5jbHVkZS9saW51eC9ldmVudHBvbGwuaApAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKiAgaW5jbHVkZS9saW51eC9ldmVudHBvbGwuaCAoIEVmZmljZW50IGV2ZW50IHBvbGxpbmcgaW1wbGVtZW50YXRpb24gKQotICogIENvcHlyaWdodCAoQykgMjAwMSwuLi4sMjAwMwkgRGF2aWRlIExpYmVuemkKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDEsLi4uLDIwMDYJIERhdmlkZSBMaWJlbnppCiAgKgogICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZXh0M19mcy5oIGIvaW5jbHVkZS9saW51eC9leHQzX2ZzLmgKaW5kZXggNzU3ZDU0ZC4uNTYwN2U2NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9leHQzX2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9leHQzX2ZzLmgKQEAgLTcxMCw2ICs3MTAsMTQgQEAKIAlfX3UzMgkJbmV4dF9oYXNoOwogfTsKIAorLyogY2FsY3VsYXRlIHRoZSBmaXJzdCBibG9jayBudW1iZXIgb2YgdGhlIGdyb3VwICovCitzdGF0aWMgaW5saW5lIGV4dDNfZnNibGtfdAorZXh0M19ncm91cF9maXJzdF9ibG9ja19ubyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1bnNpZ25lZCBsb25nIGdyb3VwX25vKQoreworCXJldHVybiBncm91cF9ubyAqIChleHQzX2ZzYmxrX3QpRVhUM19CTE9DS1NfUEVSX0dST1VQKHNiKSArCisJCWxlMzJfdG9fY3B1KEVYVDNfU0Ioc2IpLT5zX2VzLT5zX2ZpcnN0X2RhdGFfYmxvY2spOworfQorCiAvKgogICogU3BlY2lhbCBlcnJvciByZXR1cm4gY29kZSBvbmx5IHVzZWQgYnkgZHhfcHJvYmUoKSBhbmQgaXRzIGNhbGxlcnMuCiAgKi8KQEAgLTczMCwxNCArNzM4LDE2IEBACiAvKiBiYWxsb2MuYyAqLwogZXh0ZXJuIGludCBleHQzX2JnX2hhc19zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgZ3JvdXApOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZXh0M19iZ19udW1fZ2RiKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBncm91cCk7Ci1leHRlcm4gaW50IGV4dDNfbmV3X2Jsb2NrIChoYW5kbGVfdCAqLCBzdHJ1Y3QgaW5vZGUgKiwgdW5zaWduZWQgbG9uZywgaW50ICopOwotZXh0ZXJuIGludCBleHQzX25ld19ibG9ja3MgKGhhbmRsZV90ICosIHN0cnVjdCBpbm9kZSAqLCB1bnNpZ25lZCBsb25nLAotCQkJdW5zaWduZWQgbG9uZyAqLCBpbnQgKik7Ci1leHRlcm4gdm9pZCBleHQzX2ZyZWVfYmxvY2tzIChoYW5kbGVfdCAqLCBzdHJ1Y3QgaW5vZGUgKiwgdW5zaWduZWQgbG9uZywKLQkJCSAgICAgIHVuc2lnbmVkIGxvbmcpOwotZXh0ZXJuIHZvaWQgZXh0M19mcmVlX2Jsb2Nrc19zYiAoaGFuZGxlX3QgKiwgc3RydWN0IHN1cGVyX2Jsb2NrICosCi0JCQkJIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIGludCAqKTsKLWV4dGVybiB1bnNpZ25lZCBsb25nIGV4dDNfY291bnRfZnJlZV9ibG9ja3MgKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKK2V4dGVybiBleHQzX2ZzYmxrX3QgZXh0M19uZXdfYmxvY2sgKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQlleHQzX2ZzYmxrX3QgZ29hbCwgaW50ICplcnJwKTsKK2V4dGVybiBleHQzX2ZzYmxrX3QgZXh0M19uZXdfYmxvY2tzIChoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJZXh0M19mc2Jsa190IGdvYWwsIHVuc2lnbmVkIGxvbmcgKmNvdW50LCBpbnQgKmVycnApOworZXh0ZXJuIHZvaWQgZXh0M19mcmVlX2Jsb2NrcyAoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCWV4dDNfZnNibGtfdCBibG9jaywgdW5zaWduZWQgbG9uZyBjb3VudCk7CitleHRlcm4gdm9pZCBleHQzX2ZyZWVfYmxvY2tzX3NiIChoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCSBleHQzX2ZzYmxrX3QgYmxvY2ssIHVuc2lnbmVkIGxvbmcgY291bnQsCisJCQkJdW5zaWduZWQgbG9uZyAqcGRxdW90X2ZyZWVkX2Jsb2Nrcyk7CitleHRlcm4gZXh0M19mc2Jsa190IGV4dDNfY291bnRfZnJlZV9ibG9ja3MgKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKIGV4dGVybiB2b2lkIGV4dDNfY2hlY2tfYmxvY2tzX2JpdG1hcCAoc3RydWN0IHN1cGVyX2Jsb2NrICopOwogZXh0ZXJuIHN0cnVjdCBleHQzX2dyb3VwX2Rlc2MgKiBleHQzX2dldF9ncm91cF9kZXNjKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLAogCQkJCQkJICAgIHVuc2lnbmVkIGludCBibG9ja19ncm91cCwKQEAgLTc3Myw3ICs3ODMsOCBAQAogCiAKIC8qIGlub2RlLmMgKi8KLWludCBleHQzX2ZvcmdldChoYW5kbGVfdCAqLCBpbnQsIHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiwgaW50KTsKK2ludCBleHQzX2ZvcmdldChoYW5kbGVfdCAqaGFuZGxlLCBpbnQgaXNfbWV0YWRhdGEsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGV4dDNfZnNibGtfdCBibG9ja25yKTsKIHN0cnVjdCBidWZmZXJfaGVhZCAqIGV4dDNfZ2V0YmxrIChoYW5kbGVfdCAqLCBzdHJ1Y3QgaW5vZGUgKiwgbG9uZywgaW50LCBpbnQgKik7CiBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBleHQzX2JyZWFkIChoYW5kbGVfdCAqLCBzdHJ1Y3QgaW5vZGUgKiwgaW50LCBpbnQsIGludCAqKTsKIGludCBleHQzX2dldF9ibG9ja3NfaGFuZGxlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCkBAIC04MDgsNyArODE5LDcgQEAKIAkJCQlzdHJ1Y3QgZXh0M19uZXdfZ3JvdXBfZGF0YSAqaW5wdXQpOwogZXh0ZXJuIGludCBleHQzX2dyb3VwX2V4dGVuZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAogCQkJCXN0cnVjdCBleHQzX3N1cGVyX2Jsb2NrICplcywKLQkJCQl1bnNpZ25lZCBsb25nIG5fYmxvY2tzX2NvdW50KTsKKwkJCQlleHQzX2ZzYmxrX3Qgbl9ibG9ja3NfY291bnQpOwogCiAvKiBzdXBlci5jICovCiBleHRlcm4gdm9pZCBleHQzX2Vycm9yIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIC4uLikKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZXh0M19mc19pLmggYi9pbmNsdWRlL2xpbnV4L2V4dDNfZnNfaS5oCmluZGV4IDdhYmY5MDEuLjJmMThiOTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZXh0M19mc19pLmgKKysrIGIvaW5jbHVkZS9saW51eC9leHQzX2ZzX2kuaApAQCAtMjEsOSArMjEsMTcgQEAKICNpbmNsdWRlIDxsaW51eC9zZXFsb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIAorLyogZGF0YSB0eXBlIGZvciBibG9jayBvZmZzZXQgb2YgYmxvY2sgZ3JvdXAgKi8KK3R5cGVkZWYgaW50IGV4dDNfZ3JwYmxrX3Q7CisKKy8qIGRhdGEgdHlwZSBmb3IgZmlsZXN5c3RlbS13aWRlIGJsb2NrcyBudW1iZXIgKi8KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBleHQzX2ZzYmxrX3Q7CisKKyNkZWZpbmUgRTNGU0JMSyAiJWx1IgorCiBzdHJ1Y3QgZXh0M19yZXNlcnZlX3dpbmRvdyB7Ci0JX191MzIJCQlfcnN2X3N0YXJ0OwkvKiBGaXJzdCBieXRlIHJlc2VydmVkICovCi0JX191MzIJCQlfcnN2X2VuZDsJLyogTGFzdCBieXRlIHJlc2VydmVkIG9yIDAgKi8KKwlleHQzX2ZzYmxrX3QJX3Jzdl9zdGFydDsJLyogRmlyc3QgYnl0ZSByZXNlcnZlZCAqLworCWV4dDNfZnNibGtfdAlfcnN2X2VuZDsJLyogTGFzdCBieXRlIHJlc2VydmVkIG9yIDAgKi8KIH07CiAKIHN0cnVjdCBleHQzX3Jlc2VydmVfd2luZG93X25vZGUgewpAQCAtNTAsNyArNTgsNyBAQAogCSAqIGFsbG9jYXRlZCB0byB0aGlzIGZpbGUuICBUaGlzIGdpdmUgdXMgdGhlIGdvYWwgKHRhcmdldCkgZm9yIHRoZSBuZXh0CiAJICogYWxsb2NhdGlvbiB3aGVuIHdlIGRldGVjdCBsaW5lYXJseSBhc2NlbmRpbmcgcmVxdWVzdHMuCiAJICovCi0JX191MzIgICAgICAgICAgICAgICAgICAgbGFzdF9hbGxvY19waHlzaWNhbF9ibG9jazsKKwlleHQzX2ZzYmxrX3QJCWxhc3RfYWxsb2NfcGh5c2ljYWxfYmxvY2s7CiB9OwogCiAjZGVmaW5lIHJzdl9zdGFydCByc3Zfd2luZG93Ll9yc3Zfc3RhcnQKQEAgLTY3LDcgKzc1LDcgQEAKIAlfX3U4CWlfZnJhZ19ubzsKIAlfX3U4CWlfZnJhZ19zaXplOwogI2VuZGlmCi0JX191MzIJaV9maWxlX2FjbDsKKwlleHQzX2ZzYmxrX3QJaV9maWxlX2FjbDsKIAlfX3UzMglpX2Rpcl9hY2w7CiAJX191MzIJaV9kdGltZTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mYi5oIGIvaW5jbHVkZS9saW51eC9mYi5oCmluZGV4IDMxNWQ4OTcuLjA3YTA4ZTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZmIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ZiLmgKQEAgLTEsNiArMSw3IEBACiAjaWZuZGVmIF9MSU5VWF9GQl9ICiAjZGVmaW5lIF9MSU5VWF9GQl9ICiAKKyNpbmNsdWRlIDxsaW51eC9iYWNrbGlnaHQuaD4KICNpbmNsdWRlIDxhc20vdHlwZXMuaD4KIAogLyogRGVmaW5pdGlvbnMgb2YgZnJhbWUgYnVmZmVycwkJCQkJCSovCkBAIC0zNjYsNiArMzY3LDEyIEBACiAJc3RydWN0IGZiX2ltYWdlCWltYWdlOwkvKiBDdXJzb3IgaW1hZ2UgKi8KIH07CiAKKyNpZmRlZiBDT05GSUdfRkJfQkFDS0xJR0hUCisvKiBTZXR0aW5ncyBmb3IgdGhlIGdlbmVyaWMgYmFja2xpZ2h0IGNvZGUgKi8KKyNkZWZpbmUgRkJfQkFDS0xJR0hUX0xFVkVMUwkxMjgKKyNkZWZpbmUgRkJfQkFDS0xJR0hUX01BWAkweEZGCisjZW5kaWYKKwogI2lmZGVmIF9fS0VSTkVMX18KIAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CkBAIC00OTcsMjMgKzUwNCwxOSBAQAogI2RlZmluZSBGQl9FVkVOVF9NT0RFX0RFTEVURSAgICAgICAgICAgIDB4MDQKIC8qICAgICAgQSBkcml2ZXIgcmVnaXN0ZXJlZCBpdHNlbGYgKi8KICNkZWZpbmUgRkJfRVZFTlRfRkJfUkVHSVNURVJFRCAgICAgICAgICAweDA1CisvKiAgICAgIEEgZHJpdmVyIHVucmVnaXN0ZXJlZCBpdHNlbGYgKi8KKyNkZWZpbmUgRkJfRVZFTlRfRkJfVU5SRUdJU1RFUkVEICAgICAgICAweDA2CiAvKiAgICAgIENPTlNPTEUtU1BFQ0lGSUM6IGdldCBjb25zb2xlIHRvIGZyYW1lYnVmZmVyIG1hcHBpbmcgKi8KLSNkZWZpbmUgRkJfRVZFTlRfR0VUX0NPTlNPTEVfTUFQICAgICAgICAweDA2CisjZGVmaW5lIEZCX0VWRU5UX0dFVF9DT05TT0xFX01BUCAgICAgICAgMHgwNwogLyogICAgICBDT05TT0xFLVNQRUNJRklDOiBzZXQgY29uc29sZSB0byBmcmFtZWJ1ZmZlciBtYXBwaW5nICovCi0jZGVmaW5lIEZCX0VWRU5UX1NFVF9DT05TT0xFX01BUCAgICAgICAgMHgwNworI2RlZmluZSBGQl9FVkVOVF9TRVRfQ09OU09MRV9NQVAgICAgICAgIDB4MDgKIC8qICAgICAgQSBkaXNwbGF5IGJsYW5rIGlzIHJlcXVlc3RlZCAgICAgICAqLwotI2RlZmluZSBGQl9FVkVOVF9CTEFOSyAgICAgICAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgRkJfRVZFTlRfQkxBTksgICAgICAgICAgICAgICAgICAweDA5CiAvKiAgICAgIFByaXZhdGUgbW9kZWxpc3QgaXMgdG8gYmUgcmVwbGFjZWQgKi8KLSNkZWZpbmUgRkJfRVZFTlRfTkVXX01PREVMSVNUICAgICAgICAgICAweDA5CisjZGVmaW5lIEZCX0VWRU5UX05FV19NT0RFTElTVCAgICAgICAgICAgMHgwQQogLyoJVGhlIHJlc29sdXRpb24gb2YgdGhlIHBhc3NlZCBpbiBmYl9pbmZvIGFib3V0IHRvIGNoYW5nZSBhbmQKICAgICAgICAgYWxsIHZjJ3Mgc2hvdWxkIGJlIGNoYW5nZWQgICAgICAgICAqLwotI2RlZmluZSBGQl9FVkVOVF9NT0RFX0NIQU5HRV9BTEwJMHgwQQotLyogICAgICBDT05TT0xFLVNQRUNJRklDOiBzZXQgY29uc29sZSByb3RhdGlvbiAqLwotI2RlZmluZSBGQl9FVkVOVF9TRVRfQ09OX1JPVEFURSAgICAgICAgIDB4MEIKLS8qICAgICAgQ09OU09MRS1TUEVDSUZJQzogZ2V0IGNvbnNvbGUgcm90YXRpb24gKi8KLSNkZWZpbmUgRkJfRVZFTlRfR0VUX0NPTl9ST1RBVEUgICAgICAgICAweDBDCi0vKiAgICAgIENPTlNPTEUtU1BFQ0lGSUM6IHJvdGF0ZSBhbGwgY29uc29sZXMgKi8KLSNkZWZpbmUgRkJfRVZFTlRfU0VUX0NPTl9ST1RBVEVfQUxMICAgICAweDBECisjZGVmaW5lIEZCX0VWRU5UX01PREVfQ0hBTkdFX0FMTAkweDBCCiAKIHN0cnVjdCBmYl9ldmVudCB7CiAJc3RydWN0IGZiX2luZm8gKmluZm87CkBAIC03NTYsNiArNzU5LDIxIEBACiAJc3RydWN0IGZiX2NtYXAgY21hcDsJCS8qIEN1cnJlbnQgY21hcCAqLwogCXN0cnVjdCBsaXN0X2hlYWQgbW9kZWxpc3Q7ICAgICAgLyogbW9kZSBsaXN0ICovCiAJc3RydWN0IGZiX3ZpZGVvbW9kZSAqbW9kZTsJLyogY3VycmVudCBtb2RlICovCisKKyNpZmRlZiBDT05GSUdfRkJfQkFDS0xJR0hUCisJLyogTG9jayBvcmRlcmluZzoKKwkgKiBibF9tdXRleCAocHJvdGVjdHMgYmxfZGV2IGFuZCBibF9jdXJ2ZSkKKwkgKiAgIGJsX2Rldi0+c2VtIChiYWNrbGlnaHQgY2xhc3MpCisJICovCisJc3RydWN0IG11dGV4IGJsX211dGV4OworCisJLyogYXNzaWduZWQgYmFja2xpZ2h0IGRldmljZSAqLworCXN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpibF9kZXY7CisKKwkvKiBCYWNrbGlnaHQgbGV2ZWwgY3VydmUgKi8KKwl1OCBibF9jdXJ2ZVtGQl9CQUNLTElHSFRfTEVWRUxTXTsKKyNlbmRpZgorCiAJc3RydWN0IGZiX29wcyAqZmJvcHM7CiAJc3RydWN0IGRldmljZSAqZGV2aWNlOwogCXN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldmljZTsgLyogc3lzZnMgcGVyIGRldmljZSBhdHRycyAqLwpAQCAtODcwLDcgKzg4OCw2IEBACiAJCQkgICAgICBzdHJ1Y3QgZmJfZml4X3NjcmVlbmluZm8gKmZpeCk7CiBleHRlcm4gaW50IGZiX2dldF9vcHRpb25zKGNoYXIgKm5hbWUsIGNoYXIgKipvcHRpb24pOwogZXh0ZXJuIGludCBmYl9uZXdfbW9kZWxpc3Qoc3RydWN0IGZiX2luZm8gKmluZm8pOwotZXh0ZXJuIGludCBmYl9jb25fZHVpdChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgaW50IGV2ZW50LCB2b2lkICpkYXRhKTsKIAogZXh0ZXJuIHN0cnVjdCBmYl9pbmZvICpyZWdpc3RlcmVkX2ZiW0ZCX01BWF07CiBleHRlcm4gaW50IG51bV9yZWdpc3RlcmVkX2ZiOwpAQCAtODk1LDYgKzkxMiw3IEBACiBleHRlcm4gdm9pZCBmcmFtZWJ1ZmZlcl9yZWxlYXNlKHN0cnVjdCBmYl9pbmZvICppbmZvKTsKIGV4dGVybiBpbnQgZmJfaW5pdF9jbGFzc19kZXZpY2Uoc3RydWN0IGZiX2luZm8gKmZiX2luZm8pOwogZXh0ZXJuIHZvaWQgZmJfY2xlYW51cF9jbGFzc19kZXZpY2Uoc3RydWN0IGZiX2luZm8gKmhlYWQpOworZXh0ZXJuIHZvaWQgZmJfYmxfZGVmYXVsdF9jdXJ2ZShzdHJ1Y3QgZmJfaW5mbyAqZmJfaW5mbywgdTggb2ZmLCB1OCBtaW4sIHU4IG1heCk7CiAKIC8qIGRyaXZlcnMvdmlkZW8vZmJtb24uYyAqLwogI2RlZmluZSBGQl9NQVhUSU1JTkdTCQkwCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ZjbnRsLmggYi9pbmNsdWRlL2xpbnV4L2ZjbnRsLmgKaW5kZXggYzUyYTYzNy4uOTk2ZjU2MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9mY250bC5oCisrKyBiL2luY2x1ZGUvbGludXgvZmNudGwuaApAQCAtMjksNiArMjksNyBAQAogI2RlZmluZSBBVF9TWU1MSU5LX05PRk9MTE9XCTB4MTAwICAgLyogRG8gbm90IGZvbGxvdyBzeW1ib2xpYyBsaW5rcy4gICovCiAjZGVmaW5lIEFUX1JFTU9WRURJUgkJMHgyMDAgICAvKiBSZW1vdmUgZGlyZWN0b3J5IGluc3RlYWQgb2YKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmxpbmtpbmcgZmlsZS4gICovCisjZGVmaW5lIEFUX1NZTUxJTktfRk9MTE9XCTB4NDAwICAgLyogRm9sbG93IHN5bWJvbGljIGxpbmtzLiAgKi8KIAogI2lmZGVmIF9fS0VSTkVMX18KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mcy5oIGIvaW5jbHVkZS9saW51eC9mcy5oCmluZGV4IGRiYTRjYmQuLjJkOGIzNDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ZzLmgKQEAgLTExMDAsNyArMTEwMCw3IEBACiAJaW50ICgqc3RhdGZzKSAoc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3Qga3N0YXRmcyAqKTsKIAlpbnQgKCpyZW1vdW50X2ZzKSAoc3RydWN0IHN1cGVyX2Jsb2NrICosIGludCAqLCBjaGFyICopOwogCXZvaWQgKCpjbGVhcl9pbm9kZSkgKHN0cnVjdCBpbm9kZSAqKTsKLQl2b2lkICgqdW1vdW50X2JlZ2luKSAoc3RydWN0IHN1cGVyX2Jsb2NrICopOworCXZvaWQgKCp1bW91bnRfYmVnaW4pIChzdHJ1Y3QgdmZzbW91bnQgKiwgaW50KTsKIAogCWludCAoKnNob3dfb3B0aW9ucykoc3RydWN0IHNlcV9maWxlICosIHN0cnVjdCB2ZnNtb3VudCAqKTsKIAlpbnQgKCpzaG93X3N0YXRzKShzdHJ1Y3Qgc2VxX2ZpbGUgKiwgc3RydWN0IHZmc21vdW50ICopOwpAQCAtMTc2Nyw3ICsxNzY3LDcgQEAKIHN0cnVjdCB0cmVlX2Rlc2NyIHsgY2hhciAqbmFtZTsgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqb3BzOyBpbnQgbW9kZTsgfTsKIHN0cnVjdCBkZW50cnkgKmRfYWxsb2NfbmFtZShzdHJ1Y3QgZGVudHJ5ICosIGNvbnN0IGNoYXIgKik7CiBleHRlcm4gaW50IHNpbXBsZV9maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBpbnQsIHN0cnVjdCB0cmVlX2Rlc2NyICopOwotZXh0ZXJuIGludCBzaW1wbGVfcGluX2ZzKGNoYXIgKm5hbWUsIHN0cnVjdCB2ZnNtb3VudCAqKm1vdW50LCBpbnQgKmNvdW50KTsKK2V4dGVybiBpbnQgc2ltcGxlX3Bpbl9mcyhzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqLCBzdHJ1Y3QgdmZzbW91bnQgKiptb3VudCwgaW50ICpjb3VudCk7CiBleHRlcm4gdm9pZCBzaW1wbGVfcmVsZWFzZV9mcyhzdHJ1Y3QgdmZzbW91bnQgKiptb3VudCwgaW50ICpjb3VudCk7CiAKIGV4dGVybiBzc2l6ZV90IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHZvaWQgX191c2VyICosIHNpemVfdCwgbG9mZl90ICosIGNvbnN0IHZvaWQgKiwgc2l6ZV90KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZnVzZS5oIGIvaW5jbHVkZS9saW51eC9mdXNlLmgKaW5kZXggNTQyNWI2MC4uOWZjNDhhNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9mdXNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9mdXNlLmgKQEAgLTEsNiArMSw2IEBACiAvKgogICAgIEZVU0U6IEZpbGVzeXN0ZW0gaW4gVXNlcnNwYWNlCi0gICAgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDUgIE1pa2xvcyBTemVyZWRpIDxtaWtsb3NAc3plcmVkaS5odT4KKyAgICBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNiAgTWlrbG9zIFN6ZXJlZGkgPG1pa2xvc0BzemVyZWRpLmh1PgogCiAgICAgVGhpcyBwcm9ncmFtIGNhbiBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwuCiAgICAgU2VlIHRoZSBmaWxlIENPUFlJTkcuCkBAIC05LDE4ICs5LDE5IEBACiAvKiBUaGlzIGZpbGUgZGVmaW5lcyB0aGUga2VybmVsIGludGVyZmFjZSBvZiBGVVNFICovCiAKICNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgogCiAvKiogVmVyc2lvbiBudW1iZXIgb2YgdGhpcyBpbnRlcmZhY2UgKi8KICNkZWZpbmUgRlVTRV9LRVJORUxfVkVSU0lPTiA3CiAKIC8qKiBNaW5vciB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIGludGVyZmFjZSAqLwotI2RlZmluZSBGVVNFX0tFUk5FTF9NSU5PUl9WRVJTSU9OIDYKKyNkZWZpbmUgRlVTRV9LRVJORUxfTUlOT1JfVkVSU0lPTiA3CiAKIC8qKiBUaGUgbm9kZSBJRCBvZiB0aGUgcm9vdCBpbm9kZSAqLwogI2RlZmluZSBGVVNFX1JPT1RfSUQgMQogCiAvKiogVGhlIG1ham9yIG51bWJlciBvZiB0aGUgZnVzZSBjaGFyYWN0ZXIgZGV2aWNlICovCi0jZGVmaW5lIEZVU0VfTUFKT1IgMTAKKyNkZWZpbmUgRlVTRV9NQUpPUiBNSVNDX01BSk9SCiAKIC8qKiBUaGUgbWlub3IgbnVtYmVyIG9mIHRoZSBmdXNlIGNoYXJhY3RlciBkZXZpY2UgKi8KICNkZWZpbmUgRlVTRV9NSU5PUiAyMjkKQEAgLTU4LDYgKzU5LDEzIEBACiAJX191MzIJc3BhcmVbNl07CiB9OwogCitzdHJ1Y3QgZnVzZV9maWxlX2xvY2sgeworCV9fdTY0CXN0YXJ0OworCV9fdTY0CWVuZDsKKwlfX3UzMgl0eXBlOworCV9fdTMyCXBpZDsgLyogdGdpZCAqLworfTsKKwogLyoqCiAgKiBCaXRtYXNrcyBmb3IgZnVzZV9zZXRhdHRyX2luLnZhbGlkCiAgKi8KQEAgLTgyLDYgKzkwLDcgQEAKICAqIElOSVQgcmVxdWVzdC9yZXBseSBmbGFncwogICovCiAjZGVmaW5lIEZVU0VfQVNZTkNfUkVBRAkJKDEgPDwgMCkKKyNkZWZpbmUgRlVTRV9QT1NJWF9MT0NLUwkoMSA8PCAxKQogCiBlbnVtIGZ1c2Vfb3Bjb2RlIHsKIAlGVVNFX0xPT0tVUAkgICA9IDEsCkBAIC0xMTIsOCArMTIxLDEyIEBACiAJRlVTRV9SRUFERElSICAgICAgID0gMjgsCiAJRlVTRV9SRUxFQVNFRElSICAgID0gMjksCiAJRlVTRV9GU1lOQ0RJUiAgICAgID0gMzAsCisJRlVTRV9HRVRMSyAgICAgICAgID0gMzEsCisJRlVTRV9TRVRMSyAgICAgICAgID0gMzIsCisJRlVTRV9TRVRMS1cgICAgICAgID0gMzMsCiAJRlVTRV9BQ0NFU1MgICAgICAgID0gMzQsCi0JRlVTRV9DUkVBVEUgICAgICAgID0gMzUKKwlGVVNFX0NSRUFURSAgICAgICAgPSAzNSwKKwlGVVNFX0lOVEVSUlVQVCAgICAgPSAzNiwKIH07CiAKIC8qIFRoZSByZWFkIGJ1ZmZlciBpcyByZXF1aXJlZCB0byBiZSBhdCBsZWFzdCA4aywgYnV0IG1heSBiZSBtdWNoIGxhcmdlciAqLwpAQCAtMTk5LDYgKzIxMiw3IEBACiAJX191NjQJZmg7CiAJX191MzIJZmx1c2hfZmxhZ3M7CiAJX191MzIJcGFkZGluZzsKKwlfX3U2NAlsb2NrX293bmVyOwogfTsKIAogc3RydWN0IGZ1c2VfcmVhZF9pbiB7CkBAIC0yNDcsNiArMjYxLDE2IEBACiAJX191MzIJcGFkZGluZzsKIH07CiAKK3N0cnVjdCBmdXNlX2xrX2luIHsKKwlfX3U2NAlmaDsKKwlfX3U2NAlvd25lcjsKKwlzdHJ1Y3QgZnVzZV9maWxlX2xvY2sgbGs7Cit9OworCitzdHJ1Y3QgZnVzZV9sa19vdXQgeworCXN0cnVjdCBmdXNlX2ZpbGVfbG9jayBsazsKK307CisKIHN0cnVjdCBmdXNlX2FjY2Vzc19pbiB7CiAJX191MzIJbWFzazsKIAlfX3UzMglwYWRkaW5nOwpAQCAtMjY4LDYgKzI5MiwxMCBAQAogCV9fdTMyCW1heF93cml0ZTsKIH07CiAKK3N0cnVjdCBmdXNlX2ludGVycnVwdF9pbiB7CisJX191NjQJdW5pcXVlOworfTsKKwogc3RydWN0IGZ1c2VfaW5faGVhZGVyIHsKIAlfX3UzMglsZW47CiAJX191MzIJb3Bjb2RlOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9ocnRpbWVyLmggYi9pbmNsdWRlL2xpbnV4L2hydGltZXIuaAppbmRleCA3ZDJhMWI5Li4wN2Q3MzA1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2hydGltZXIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2hydGltZXIuaApAQCAtNDAsNyArNDAsNiBAQAogCiAvKioKICAqIHN0cnVjdCBocnRpbWVyIC0gdGhlIGJhc2ljIGhydGltZXIgc3RydWN0dXJlCi0gKgogICogQG5vZGU6CXJlZCBibGFjayB0cmVlIG5vZGUgZm9yIHRpbWUgb3JkZXJlZCBpbnNlcnRpb24KICAqIEBleHBpcmVzOgl0aGUgYWJzb2x1dGUgZXhwaXJ5IHRpbWUgaW4gdGhlIGhydGltZXJzIGludGVybmFsCiAgKgkJcmVwcmVzZW50YXRpb24uIFRoZSB0aW1lIGlzIHJlbGF0ZWQgdG8gdGhlIGNsb2NrIG9uCkBAIC01OSw3ICs1OCw2IEBACiAKIC8qKgogICogc3RydWN0IGhydGltZXJfc2xlZXBlciAtIHNpbXBsZSBzbGVlcGVyIHN0cnVjdHVyZQotICoKICAqIEB0aW1lcjoJZW1iZWRkZWQgdGltZXIgc3RydWN0dXJlCiAgKiBAdGFzazoJdGFzayB0byB3YWtlIHVwCiAgKgpAQCAtNzIsNyArNzAsNiBAQAogCiAvKioKICAqIHN0cnVjdCBocnRpbWVyX2Jhc2UgLSB0aGUgdGltZXIgYmFzZSBmb3IgYSBzcGVjaWZpYyBjbG9jawotICoKICAqIEBpbmRleDoJCWNsb2NrIHR5cGUgaW5kZXggZm9yIHBlcl9jcHUgc3VwcG9ydCB3aGVuIG1vdmluZyBhIHRpbWVyCiAgKgkJCXRvIGEgYmFzZSBvbiBhbm90aGVyIGNwdS4KICAqIEBsb2NrOgkJbG9jayBwcm90ZWN0aW5nIHRoZSBiYXNlIGFuZCBhc3NvY2lhdGVkIHRpbWVycwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9od19yYW5kb20uaCBiL2luY2x1ZGUvbGludXgvaHdfcmFuZG9tLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFlYTc2MQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvaHdfcmFuZG9tLmgKQEAgLTAsMCArMSw1MCBAQAorLyoKKwlIYXJkd2FyZSBSYW5kb20gTnVtYmVyIEdlbmVyYXRvcgorCisJUGxlYXNlIHJlYWQgRG9jdW1lbnRhdGlvbi9od19yYW5kb20udHh0IGZvciBkZXRhaWxzIG9uIHVzZS4KKworCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisgICAgICAgIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisKKyAqLworCisjaWZuZGVmIExJTlVYX0hXUkFORE9NX0hfCisjZGVmaW5lIExJTlVYX0hXUkFORE9NX0hfCisjaWZkZWYgX19LRVJORUxfXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisKKy8qKgorICogc3RydWN0IGh3cm5nIC0gSGFyZHdhcmUgUmFuZG9tIE51bWJlciBHZW5lcmF0b3IgZHJpdmVyCisgKiBAbmFtZToJCVVuaXF1ZSBSTkcgbmFtZS4KKyAqIEBpbml0OgkJSW5pdGlhbGl6YXRpb24gY2FsbGJhY2sgKGNhbiBiZSBOVUxMKS4KKyAqIEBjbGVhbnVwOgkJQ2xlYW51cCBjYWxsYmFjayAoY2FuIGJlIE5VTEwpLgorICogQGRhdGFfcHJlc2VudDoJQ2FsbGJhY2sgdG8gZGV0ZXJtaW5lIGlmIGRhdGEgaXMgYXZhaWxhYmxlCisgKgkJCW9uIHRoZSBSTkcuIElmIE5VTEwsIGl0IGlzIGFzc3VtZWQgdGhhdAorICoJCQl0aGVyZSBpcyBhbHdheXMgZGF0YSBhdmFpbGFibGUuCisgKiBAZGF0YV9yZWFkOgkJUmVhZCBkYXRhIGZyb20gdGhlIFJORyBkZXZpY2UuCisgKgkJCVJldHVybnMgdGhlIG51bWJlciBvZiBsb3dlciByYW5kb20gYnl0ZXMgaW4gImRhdGEiLgorICoJCQlNdXN0IG5vdCBiZSBOVUxMLgorICogQHByaXY6CQlQcml2YXRlIGRhdGEsIGZvciB1c2UgYnkgdGhlIFJORyBkcml2ZXIuCisgKi8KK3N0cnVjdCBod3JuZyB7CisJY29uc3QgY2hhciAqbmFtZTsKKwlpbnQgKCppbml0KShzdHJ1Y3QgaHdybmcgKnJuZyk7CisJdm9pZCAoKmNsZWFudXApKHN0cnVjdCBod3JuZyAqcm5nKTsKKwlpbnQgKCpkYXRhX3ByZXNlbnQpKHN0cnVjdCBod3JuZyAqcm5nKTsKKwlpbnQgKCpkYXRhX3JlYWQpKHN0cnVjdCBod3JuZyAqcm5nLCB1MzIgKmRhdGEpOworCXVuc2lnbmVkIGxvbmcgcHJpdjsKKworCS8qIGludGVybmFsLiAqLworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKK307CisKKy8qKiBSZWdpc3RlciBhIG5ldyBIYXJkd2FyZSBSYW5kb20gTnVtYmVyIEdlbmVyYXRvciBkcml2ZXIuICovCitleHRlcm4gaW50IGh3cm5nX3JlZ2lzdGVyKHN0cnVjdCBod3JuZyAqcm5nKTsKKy8qKiBVbnJlZ2lzdGVyIGEgSGFyZHdhcmUgUmFuZG9tIE51bWJlciBHZW5lcmF0b3IgZHJpdmVyLiAqLworZXh0ZXJuIHZvaWQgaHdybmdfdW5yZWdpc3RlcihzdHJ1Y3QgaHdybmcgKnJuZyk7CisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisjZW5kaWYgLyogTElOVVhfSFdSQU5ET01fSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaTJjLWlkLmggYi9pbmNsdWRlL2xpbnV4L2kyYy1pZC5oCmluZGV4IGM4YjgxZjQuLjIxMzM4YmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaTJjLWlkLmgKKysrIGIvaW5jbHVkZS9saW51eC9pMmMtaWQuaApAQCAtMTEyLDYgKzExMiw5IEBACiAjZGVmaW5lIEkyQ19EUklWRVJJRF9YMTIwNQk4MgkvKiBYaWNvci9JbnRlcnNpbCBYMTIwNSBSVEMJKi8KICNkZWZpbmUgSTJDX0RSSVZFUklEX1BDRjg1NjMJODMJLyogUGhpbGlwcyBQQ0Y4NTYzIFJUQwkJKi8KICNkZWZpbmUgSTJDX0RSSVZFUklEX1JTNUMzNzIJODQJLyogUmljb2ggUlM1QzM3MiBSVEMJCSovCisjZGVmaW5lIEkyQ19EUklWRVJJRF9CVDg2Ngk4NQkvKiBDb25leGFudCBidDg2NiB2aWRlbyBlbmNvZGVyICovCisjZGVmaW5lIEkyQ19EUklWRVJJRF9LUzAxMjcJODYJLyogU2Ftc3VuZyBrczAxMjcgdmlkZW8gZGVjb2RlciAqLworI2RlZmluZSBJMkNfRFJJVkVSSURfVExWMzIwQUlDMjNCIDg3CS8qIFRJIFRMVjMyMEFJQzIzQiBhdWRpbyBjb2RlYyAgKi8KIAogI2RlZmluZSBJMkNfRFJJVkVSSURfSTJDREVWCTkwMAogI2RlZmluZSBJMkNfRFJJVkVSSURfQVJQICAgICAgICA5MDIgICAgLyogU01CdXMgQVJQIENsaWVudCAgICAgICAgICAgICAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaWRlLmggYi9pbmNsdWRlL2xpbnV4L2lkZS5oCmluZGV4IDc3ZTY2ZDAuLmVmN2JlZjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaWRlLmgKKysrIGIvaW5jbHVkZS9saW51eC9pZGUuaApAQCAtNjMwLDYgKzYzMCw3IEBACiAJdW5zaWduZWQgaW50CXVzYWdlOwkJLyogY3VycmVudCAib3BlbigpIiBjb3VudCBmb3IgZHJpdmUgKi8KIAl1bnNpZ25lZCBpbnQJZmFpbHVyZXM7CS8qIGN1cnJlbnQgZmFpbHVyZSBjb3VudCAqLwogCXVuc2lnbmVkIGludAltYXhfZmFpbHVyZXM7CS8qIG1heGltdW0gYWxsb3dlZCBmYWlsdXJlIGNvdW50ICovCisJdTY0CQlwcm9iZWRfY2FwYWNpdHk7LyogaW5pdGlhbCByZXBvcnRlZCBtZWRpYSBjYXBhY2l0eSAoaWRlLWNkIG9ubHkgY3VycmVudGx5KSAqLwogCiAJdTY0CQljYXBhY2l0eTY0OwkvKiB0b3RhbCBudW1iZXIgb2Ygc2VjdG9ycyAqLwogCkBAIC0xMDA1LDYgKzEwMDYsOCBAQAogZXh0ZXJuIGludCBub2F1dG9kbWE7CiAKIGV4dGVybiBpbnQgaWRlX2VuZF9yZXF1ZXN0IChpZGVfZHJpdmVfdCAqZHJpdmUsIGludCB1cHRvZGF0ZSwgaW50IG5yc2Vjcyk7CitpbnQgaWRlX2VuZF9kZXF1ZXVlZF9yZXF1ZXN0KGlkZV9kcml2ZV90ICpkcml2ZSwgc3RydWN0IHJlcXVlc3QgKnJxLAorCQkJICAgICBpbnQgdXB0b2RhdGUsIGludCBucl9zZWN0b3JzKTsKIAogLyoKICAqIFRoaXMgaXMgdXNlZCBvbiBleGl0IGZyb20gdGhlIGRyaXZlciB0byBkZXNpZ25hdGUgdGhlIG5leHQgaXJxIGhhbmRsZXIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaWRyLmggYi9pbmNsdWRlL2xpbnV4L2lkci5oCmluZGV4IGQzN2M4ZDguLmY1NTlhNzEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaWRyLmgKKysrIGIvaW5jbHVkZS9saW51eC9pZHIuaApAQCAtNzgsNiArNzgsNyBAQAogaW50IGlkcl9wcmVfZ2V0KHN0cnVjdCBpZHIgKmlkcCwgZ2ZwX3QgZ2ZwX21hc2spOwogaW50IGlkcl9nZXRfbmV3KHN0cnVjdCBpZHIgKmlkcCwgdm9pZCAqcHRyLCBpbnQgKmlkKTsKIGludCBpZHJfZ2V0X25ld19hYm92ZShzdHJ1Y3QgaWRyICppZHAsIHZvaWQgKnB0ciwgaW50IHN0YXJ0aW5nX2lkLCBpbnQgKmlkKTsKK3ZvaWQgKmlkcl9yZXBsYWNlKHN0cnVjdCBpZHIgKmlkcCwgdm9pZCAqcHRyLCBpbnQgaWQpOwogdm9pZCBpZHJfcmVtb3ZlKHN0cnVjdCBpZHIgKmlkcCwgaW50IGlkKTsKIHZvaWQgaWRyX2Rlc3Ryb3koc3RydWN0IGlkciAqaWRwKTsKIHZvaWQgaWRyX2luaXQoc3RydWN0IGlkciAqaWRwKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW5pdF90YXNrLmggYi9pbmNsdWRlL2xpbnV4L2luaXRfdGFzay5oCmluZGV4IDQxZWNiYjguLmUxMjdlZjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaW5pdF90YXNrLmgKKysrIGIvaW5jbHVkZS9saW51eC9pbml0X3Rhc2suaApAQCAtMTE5LDcgKzExOSw2IEBACiAJCS5zaWduYWwgPSB7ezB9fX0sCQkJCQlcCiAJLmJsb2NrZWQJPSB7ezB9fSwJCQkJCVwKIAkuYWxsb2NfbG9jawk9IFNQSU5fTE9DS19VTkxPQ0tFRCwJCQkJXAotCS5wcm9jX2xvY2sJPSBTUElOX0xPQ0tfVU5MT0NLRUQsCQkJCVwKIAkuam91cm5hbF9pbmZvCT0gTlVMTCwJCQkJCQlcCiAJLmNwdV90aW1lcnMJPSBJTklUX0NQVV9USU1FUlModHNrLmNwdV90aW1lcnMpLAkJXAogCS5mc19leGNsCT0gQVRPTUlDX0lOSVQoMCksCQkJCVwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW5wdXQuaCBiL2luY2x1ZGUvbGludXgvaW5wdXQuaAppbmRleCBiMzJjMmI2Li41NmYxZTBlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lucHV0LmgKKysrIGIvaW5jbHVkZS9saW51eC9pbnB1dC5oCkBAIC0yMzIsNyArMjMyLDggQEAKICNkZWZpbmUgS0VZX1BBVVNFCQkxMTkKIAogI2RlZmluZSBLRVlfS1BDT01NQQkJMTIxCi0jZGVmaW5lIEtFWV9IQU5HVUVMCQkxMjIKKyNkZWZpbmUgS0VZX0hBTkdFVUwJCTEyMgorI2RlZmluZSBLRVlfSEFOR1VFTAkJS0VZX0hBTkdFVUwKICNkZWZpbmUgS0VZX0hBTkpBCQkxMjMKICNkZWZpbmUgS0VZX1lFTgkJCTEyNAogI2RlZmluZSBLRVlfTEVGVE1FVEEJCTEyNQpAQCAtMTAwNSw2ICsxMDA2LDcgQEAKIH0KIAogc3RydWN0IGlucHV0X2RldiAqaW5wdXRfYWxsb2NhdGVfZGV2aWNlKHZvaWQpOwordm9pZCBpbnB1dF9mcmVlX2RldmljZShzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYpOwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2dldF9kZXZpY2Uoc3RydWN0IGlucHV0X2RldiAqZGV2KQogewpAQCAtMTAxNiwxMiArMTAxOCw2IEBACiAJY2xhc3NfZGV2aWNlX3B1dCgmZGV2LT5jZGV2KTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGlucHV0X2ZyZWVfZGV2aWNlKHN0cnVjdCBpbnB1dF9kZXYgKmRldikKLXsKLQlpZiAoZGV2KQotCQlpbnB1dF9wdXRfZGV2aWNlKGRldik7Ci19Ci0KIGludCBpbnB1dF9yZWdpc3Rlcl9kZXZpY2Uoc3RydWN0IGlucHV0X2RldiAqKTsKIHZvaWQgaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2Uoc3RydWN0IGlucHV0X2RldiAqKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9rZXJuZWwuaCBiL2luY2x1ZGUvbGludXgva2VybmVsLmgKaW5kZXggOGMyMWFhYS4uNWMxZWMxZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9rZXJuZWwuaAorKysgYi9pbmNsdWRlL2xpbnV4L2tlcm5lbC5oCkBAIC0zMiw2ICszMiw3IEBACiAKICNkZWZpbmUgQVJSQVlfU0laRSh4KSAoc2l6ZW9mKHgpIC8gc2l6ZW9mKCh4KVswXSkpCiAjZGVmaW5lIEFMSUdOKHgsYSkgKCgoeCkrKGEpLTEpJn4oKGEpLTEpKQorI2RlZmluZSBGSUVMRF9TSVpFT0YodCwgZikgKHNpemVvZigoKHQqKTApLT5mKSkKIAogI2RlZmluZQlLRVJOX0VNRVJHCSI8MD4iCS8qIHN5c3RlbSBpcyB1bnVzYWJsZQkJCSovCiAjZGVmaW5lCUtFUk5fQUxFUlQJIjwxPiIJLyogYWN0aW9uIG11c3QgYmUgdGFrZW4gaW1tZWRpYXRlbHkJKi8KQEAgLTExNyw2ICsxMTgsOCBAQAogCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMywgNCkpKTsKIGV4dGVybiBpbnQgdnNjbnByaW50ZihjaGFyICpidWYsIHNpemVfdCBzaXplLCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXJncykKIAlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDMsIDApKSk7CitleHRlcm4gY2hhciAqa2FzcHJpbnRmKGdmcF90IGdmcCwgY29uc3QgY2hhciAqZm10LCAuLi4pCisJX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOwogCiBleHRlcm4gaW50IHNzY2FuZihjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgLi4uKQogCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHNjYW5mLCAyLCAzKSkpOwpAQCAtMzM0LDYgKzMzNywxMiBAQAogLyogRm9yY2UgYSBjb21waWxhdGlvbiBlcnJvciBpZiBjb25kaXRpb24gaXMgdHJ1ZSAqLwogI2RlZmluZSBCVUlMRF9CVUdfT04oY29uZGl0aW9uKSAoKHZvaWQpc2l6ZW9mKGNoYXJbMSAtIDIqISEoY29uZGl0aW9uKV0pKQogCisvKiBGb3JjZSBhIGNvbXBpbGF0aW9uIGVycm9yIGlmIGNvbmRpdGlvbiBpcyB0cnVlLCBidXQgYWxzbyBwcm9kdWNlIGEKKyAgIHJlc3VsdCAob2YgdmFsdWUgMCBhbmQgdHlwZSBzaXplX3QpLCBzbyB0aGUgZXhwcmVzc2lvbiBjYW4gYmUgdXNlZAorICAgZS5nLiBpbiBhIHN0cnVjdHVyZSBpbml0aWFsaXplciAob3Igd2hlcmUtZXZlciBlbHNlIGNvbW1hIGV4cHJlc3Npb25zCisgICBhcmVuJ3QgcGVybWl0dGVkKS4gKi8KKyNkZWZpbmUgQlVJTERfQlVHX09OX1pFUk8oZSkgKHNpemVvZihjaGFyWzEgLSAyICogISEoZSldKSAtIDEpCisKIC8qIFRyYXAgcGFzdGVycyBvZiBfX0ZVTkNUSU9OX18gYXQgY29tcGlsZS10aW1lICovCiAjZGVmaW5lIF9fRlVOQ1RJT05fXyAoX19mdW5jX18pCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva2V5LmggYi9pbmNsdWRlL2xpbnV4L2tleS5oCmluZGV4IGU4MWViZjkuLmU2OTNlNzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgva2V5LmgKKysrIGIvaW5jbHVkZS9saW51eC9rZXkuaApAQCAtMjQ4LDcgKzI0OCwxNCBAQAogCQkJICAgICBjb25zdCBjaGFyICpkZXNjLAogCQkJICAgICB1aWRfdCB1aWQsIGdpZF90IGdpZCwKIAkJCSAgICAgc3RydWN0IHRhc2tfc3RydWN0ICpjdHgsCi0JCQkgICAgIGtleV9wZXJtX3QgcGVybSwgaW50IG5vdF9pbl9xdW90YSk7CisJCQkgICAgIGtleV9wZXJtX3QgcGVybSwKKwkJCSAgICAgdW5zaWduZWQgbG9uZyBmbGFncyk7CisKKworI2RlZmluZSBLRVlfQUxMT0NfSU5fUVVPVEEJMHgwMDAwCS8qIGFkZCB0byBxdW90YSwgcmVqZWN0IGlmIHdvdWxkIG92ZXJydW4gKi8KKyNkZWZpbmUgS0VZX0FMTE9DX1FVT1RBX09WRVJSVU4JMHgwMDAxCS8qIGFkZCB0byBxdW90YSwgcGVybWl0IGV2ZW4gaWYgb3ZlcnJ1biAqLworI2RlZmluZSBLRVlfQUxMT0NfTk9UX0lOX1FVT1RBCTB4MDAwMgkvKiBub3QgaW4gcXVvdGEgKi8KKwogZXh0ZXJuIGludCBrZXlfcGF5bG9hZF9yZXNlcnZlKHN0cnVjdCBrZXkgKmtleSwgc2l6ZV90IGRhdGFsZW4pOwogZXh0ZXJuIGludCBrZXlfaW5zdGFudGlhdGVfYW5kX2xpbmsoc3RydWN0IGtleSAqa2V5LAogCQkJCSAgICBjb25zdCB2b2lkICpkYXRhLApAQCAtMjg1LDcgKzI5Miw3IEBACiAJCQkJICAgICAgY29uc3QgY2hhciAqZGVzY3JpcHRpb24sCiAJCQkJICAgICAgY29uc3Qgdm9pZCAqcGF5bG9hZCwKIAkJCQkgICAgICBzaXplX3QgcGxlbiwKLQkJCQkgICAgICBpbnQgbm90X2luX3F1b3RhKTsKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzKTsKIAogZXh0ZXJuIGludCBrZXlfdXBkYXRlKGtleV9yZWZfdCBrZXksCiAJCSAgICAgIGNvbnN0IHZvaWQgKnBheWxvYWQsCkBAIC0yOTksNyArMzA2LDcgQEAKIAogZXh0ZXJuIHN0cnVjdCBrZXkgKmtleXJpbmdfYWxsb2MoY29uc3QgY2hhciAqZGVzY3JpcHRpb24sIHVpZF90IHVpZCwgZ2lkX3QgZ2lkLAogCQkJCSBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmN0eCwKLQkJCQkgaW50IG5vdF9pbl9xdW90YSwKKwkJCQkgdW5zaWduZWQgbG9uZyBmbGFncywKIAkJCQkgc3RydWN0IGtleSAqZGVzdCk7CiAKIGV4dGVybiBpbnQga2V5cmluZ19jbGVhcihzdHJ1Y3Qga2V5ICprZXlyaW5nKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva3RocmVhZC5oIGIvaW5jbHVkZS9saW51eC9rdGhyZWFkLmgKaW5kZXggZWJkZDQxZi4uN2NjZTVkZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9rdGhyZWFkLmgKKysrIGIvaW5jbHVkZS9saW51eC9rdGhyZWFkLmgKQEAgLTQsMzcgKzQsMTkgQEAKICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogCi0vKioKLSAqIGt0aHJlYWRfY3JlYXRlOiBjcmVhdGUgYSBrdGhyZWFkLgotICogQHRocmVhZGZuOiB0aGUgZnVuY3Rpb24gdG8gcnVuIHVudGlsIHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpLgotICogQGRhdGE6IGRhdGEgcHRyIGZvciBAdGhyZWFkZm4uCi0gKiBAbmFtZWZtdDogcHJpbnRmLXN0eWxlIG5hbWUgZm9yIHRoZSB0aHJlYWQuCi0gKgotICogRGVzY3JpcHRpb246IFRoaXMgaGVscGVyIGZ1bmN0aW9uIGNyZWF0ZXMgYW5kIG5hbWVzIGEga2VybmVsCi0gKiB0aHJlYWQuICBUaGUgdGhyZWFkIHdpbGwgYmUgc3RvcHBlZDogdXNlIHdha2VfdXBfcHJvY2VzcygpIHRvIHN0YXJ0Ci0gKiBpdC4gIFNlZSBhbHNvIGt0aHJlYWRfcnVuKCksIGt0aHJlYWRfY3JlYXRlX29uX2NwdSgpLgotICoKLSAqIFdoZW4gd29rZW4sIHRoZSB0aHJlYWQgd2lsbCBydW4gQHRocmVhZGZuKCkgd2l0aCBAZGF0YSBhcyBpdHMKLSAqIGFyZ3VtZW50LiBAdGhyZWFkZm4gY2FuIGVpdGhlciBjYWxsIGRvX2V4aXQoKSBkaXJlY3RseSBpZiBpdCBpcyBhCi0gKiBzdGFuZGFsb25lIHRocmVhZCBmb3Igd2hpY2ggbm9vbmUgd2lsbCBjYWxsIGt0aHJlYWRfc3RvcCgpLCBvcgotICogcmV0dXJuIHdoZW4gJ2t0aHJlYWRfc2hvdWxkX3N0b3AoKScgaXMgdHJ1ZSAod2hpY2ggbWVhbnMKLSAqIGt0aHJlYWRfc3RvcCgpIGhhcyBiZWVuIGNhbGxlZCkuICBUaGUgcmV0dXJuIHZhbHVlIHNob3VsZCBiZSB6ZXJvCi0gKiBvciBhIG5lZ2F0aXZlIGVycm9yIG51bWJlcjogaXQgd2lsbCBiZSBwYXNzZWQgdG8ga3RocmVhZF9zdG9wKCkuCi0gKgotICogUmV0dXJucyBhIHRhc2tfc3RydWN0IG9yIEVSUl9QVFIoLUVOT01FTSkuCi0gKi8KIHN0cnVjdCB0YXNrX3N0cnVjdCAqa3RocmVhZF9jcmVhdGUoaW50ICgqdGhyZWFkZm4pKHZvaWQgKmRhdGEpLAogCQkJCSAgIHZvaWQgKmRhdGEsCiAJCQkJICAgY29uc3QgY2hhciBuYW1lZm10W10sIC4uLik7CiAKIC8qKgotICoga3RocmVhZF9ydW46IGNyZWF0ZSBhbmQgd2FrZSBhIHRocmVhZC4KKyAqIGt0aHJlYWRfcnVuIC0gY3JlYXRlIGFuZCB3YWtlIGEgdGhyZWFkLgogICogQHRocmVhZGZuOiB0aGUgZnVuY3Rpb24gdG8gcnVuIHVudGlsIHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpLgogICogQGRhdGE6IGRhdGEgcHRyIGZvciBAdGhyZWFkZm4uCiAgKiBAbmFtZWZtdDogcHJpbnRmLXN0eWxlIG5hbWUgZm9yIHRoZSB0aHJlYWQuCiAgKgogICogRGVzY3JpcHRpb246IENvbnZlbmllbnQgd3JhcHBlciBmb3Iga3RocmVhZF9jcmVhdGUoKSBmb2xsb3dlZCBieQotICogd2FrZV91cF9wcm9jZXNzKCkuICBSZXR1cm5zIHRoZSBrdGhyZWFkLCBvciBFUlJfUFRSKC1FTk9NRU0pLiAqLworICogd2FrZV91cF9wcm9jZXNzKCkuICBSZXR1cm5zIHRoZSBrdGhyZWFkIG9yIEVSUl9QVFIoLUVOT01FTSkuCisgKi8KICNkZWZpbmUga3RocmVhZF9ydW4odGhyZWFkZm4sIGRhdGEsIG5hbWVmbXQsIC4uLikJCQkgICBcCiAoewkJCQkJCQkJCSAgIFwKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKl9fawkJCQkJCSAgIFwKQEAgLTQ0LDUwICsyNiw5IEBACiAJX19rOwkJCQkJCQkJICAgXAogfSkKIAotLyoqCi0gKiBrdGhyZWFkX2JpbmQ6IGJpbmQgYSBqdXN0LWNyZWF0ZWQga3RocmVhZCB0byBhIGNwdS4KLSAqIEBrOiB0aHJlYWQgY3JlYXRlZCBieSBrdGhyZWFkX2NyZWF0ZSgpLgotICogQGNwdTogY3B1IChtaWdodCBub3QgYmUgb25saW5lLCBtdXN0IGJlIHBvc3NpYmxlKSBmb3IgQGsgdG8gcnVuIG9uLgotICoKLSAqIERlc2NyaXB0aW9uOiBUaGlzIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gc2V0X2NwdXNfYWxsb3dlZCgpLAotICogZXhjZXB0IHRoYXQgQGNwdSBkb2Vzbid0IG5lZWQgdG8gYmUgb25saW5lLCBhbmQgdGhlIHRocmVhZCBtdXN0IGJlCi0gKiBzdG9wcGVkIChpZS4ganVzdCByZXR1cm5lZCBmcm9tIGt0aHJlYWRfY3JlYXRlKCkuCi0gKi8KIHZvaWQga3RocmVhZF9iaW5kKHN0cnVjdCB0YXNrX3N0cnVjdCAqaywgdW5zaWduZWQgaW50IGNwdSk7Ci0KLS8qKgotICoga3RocmVhZF9zdG9wOiBzdG9wIGEgdGhyZWFkIGNyZWF0ZWQgYnkga3RocmVhZF9jcmVhdGUoKS4KLSAqIEBrOiB0aHJlYWQgY3JlYXRlZCBieSBrdGhyZWFkX2NyZWF0ZSgpLgotICoKLSAqIFNldHMga3RocmVhZF9zaG91bGRfc3RvcCgpIGZvciBAayB0byByZXR1cm4gdHJ1ZSwgd2FrZXMgaXQsIGFuZAotICogd2FpdHMgZm9yIGl0IHRvIGV4aXQuICBZb3VyIHRocmVhZGZuKCkgbXVzdCBub3QgY2FsbCBkb19leGl0KCkKLSAqIGl0c2VsZiBpZiB5b3UgdXNlIHRoaXMgZnVuY3Rpb24hICBUaGlzIGNhbiBhbHNvIGJlIGNhbGxlZCBhZnRlcgotICoga3RocmVhZF9jcmVhdGUoKSBpbnN0ZWFkIG9mIGNhbGxpbmcgd2FrZV91cF9wcm9jZXNzKCk6IHRoZSB0aHJlYWQKLSAqIHdpbGwgZXhpdCB3aXRob3V0IGNhbGxpbmcgdGhyZWFkZm4oKS4KLSAqCi0gKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgdGhyZWFkZm4oKSwgb3IgLUVJTlRSIGlmIHdha2VfdXBfcHJvY2VzcygpCi0gKiB3YXMgbmV2ZXIgY2FsbGVkLiAqLwogaW50IGt0aHJlYWRfc3RvcChzdHJ1Y3QgdGFza19zdHJ1Y3QgKmspOwotCi0vKioKLSAqIGt0aHJlYWRfc3RvcF9zZW06IHN0b3AgYSB0aHJlYWQgY3JlYXRlZCBieSBrdGhyZWFkX2NyZWF0ZSgpLgotICogQGs6IHRocmVhZCBjcmVhdGVkIGJ5IGt0aHJlYWRfY3JlYXRlKCkuCi0gKiBAczogc2VtYXBob3JlIHRoYXQgQGsgd2FpdHMgb24gd2hpbGUgaWRsZS4KLSAqCi0gKiBEb2VzIGVzc2VudGlhbGx5IHRoZSBzYW1lIHRoaW5nIGFzIGt0aHJlYWRfc3RvcCgpIGFib3ZlLCBidXQgd2FrZXMKLSAqIEBrIGJ5IGNhbGxpbmcgdXAoQHMpLgotICoKLSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiB0aHJlYWRmbigpLCBvciAtRUlOVFIgaWYgd2FrZV91cF9wcm9jZXNzKCkKLSAqIHdhcyBuZXZlciBjYWxsZWQuICovCiBpbnQga3RocmVhZF9zdG9wX3NlbShzdHJ1Y3QgdGFza19zdHJ1Y3QgKmssIHN0cnVjdCBzZW1hcGhvcmUgKnMpOwotCi0vKioKLSAqIGt0aHJlYWRfc2hvdWxkX3N0b3A6IHNob3VsZCB0aGlzIGt0aHJlYWQgcmV0dXJuIG5vdz8KLSAqCi0gKiBXaGVuIHNvbWVvbmUgY2FsbHMga3RocmVhZF9zdG9wIG9uIHlvdXIga3RocmVhZCwgaXQgd2lsbCBiZSB3b2tlbgotICogYW5kIHRoaXMgd2lsbCByZXR1cm4gdHJ1ZS4gIFlvdSBzaG91bGQgdGhlbiByZXR1cm4sIGFuZCB5b3VyIHJldHVybgotICogdmFsdWUgd2lsbCBiZSBwYXNzZWQgdGhyb3VnaCB0byBrdGhyZWFkX3N0b3AoKS4KLSAqLwogaW50IGt0aHJlYWRfc2hvdWxkX3N0b3Aodm9pZCk7CiAKICNlbmRpZiAvKiBfTElOVVhfS1RIUkVBRF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2t0aW1lLmggYi9pbmNsdWRlL2xpbnV4L2t0aW1lLmgKaW5kZXggNjJiYzU3NS4uZWQzMzk2ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9rdGltZS5oCisrKyBiL2luY2x1ZGUvbGludXgva3RpbWUuaApAQCAtNjYsNyArNjYsNiBAQAogCiAvKioKICAqIGt0aW1lX3NldCAtIFNldCBhIGt0aW1lX3QgdmFyaWFibGUgZnJvbSBhIHNlY29uZHMvbmFub3NlY29uZHMgdmFsdWUKLSAqCiAgKiBAc2VjczoJc2Vjb25kcyB0byBzZXQKICAqIEBuc2VjczoJbmFub3NlY29uZHMgdG8gc2V0CiAgKgpAQCAtMTM4LDcgKzEzNyw2IEBACiAKIC8qKgogICoga3RpbWVfc3ViIC0gc3VidHJhY3QgdHdvIGt0aW1lX3QgdmFyaWFibGVzCi0gKgogICogQGxoczoJbWludWVuZAogICogQHJoczoJc3VidHJhaGVuZAogICoKQEAgLTE1Nyw3ICsxNTUsNiBAQAogCiAvKioKICAqIGt0aW1lX2FkZCAtIGFkZCB0d28ga3RpbWVfdCB2YXJpYWJsZXMKLSAqCiAgKiBAYWRkMToJYWRkZW5kMQogICogQGFkZDI6CWFkZGVuZDIKICAqCkBAIC0xODQsNyArMTgxLDYgQEAKIAogLyoqCiAgKiBrdGltZV9hZGRfbnMgLSBBZGQgYSBzY2FsYXIgbmFub3NlY29uZHMgdmFsdWUgdG8gYSBrdGltZV90IHZhcmlhYmxlCi0gKgogICogQGt0OgkJYWRkZW5kCiAgKiBAbnNlYzoJdGhlIHNjYWxhciBuc2VjIHZhbHVlIHRvIGFkZAogICoKQEAgLTE5NCw3ICsxOTAsNiBAQAogCiAvKioKICAqIHRpbWVzcGVjX3RvX2t0aW1lIC0gY29udmVydCBhIHRpbWVzcGVjIHRvIGt0aW1lX3QgZm9ybWF0Ci0gKgogICogQHRzOgkJdGhlIHRpbWVzcGVjIHZhcmlhYmxlIHRvIGNvbnZlcnQKICAqCiAgKiBSZXR1cm5zIGEga3RpbWVfdCB2YXJpYWJsZSB3aXRoIHRoZSBjb252ZXJ0ZWQgdGltZXNwZWMgdmFsdWUKQEAgLTIwNyw3ICsyMDIsNiBAQAogCiAvKioKICAqIHRpbWV2YWxfdG9fa3RpbWUgLSBjb252ZXJ0IGEgdGltZXZhbCB0byBrdGltZV90IGZvcm1hdAotICoKICAqIEB0djoJCXRoZSB0aW1ldmFsIHZhcmlhYmxlIHRvIGNvbnZlcnQKICAqCiAgKiBSZXR1cm5zIGEga3RpbWVfdCB2YXJpYWJsZSB3aXRoIHRoZSBjb252ZXJ0ZWQgdGltZXZhbCB2YWx1ZQpAQCAtMjIwLDcgKzIxNCw2IEBACiAKIC8qKgogICoga3RpbWVfdG9fdGltZXNwZWMgLSBjb252ZXJ0IGEga3RpbWVfdCB2YXJpYWJsZSB0byB0aW1lc3BlYyBmb3JtYXQKLSAqCiAgKiBAa3Q6CQl0aGUga3RpbWVfdCB2YXJpYWJsZSB0byBjb252ZXJ0CiAgKgogICogUmV0dXJucyB0aGUgdGltZXNwZWMgcmVwcmVzZW50YXRpb24gb2YgdGhlIGt0aW1lIHZhbHVlCkBAIC0yMzMsNyArMjI2LDYgQEAKIAogLyoqCiAgKiBrdGltZV90b190aW1ldmFsIC0gY29udmVydCBhIGt0aW1lX3QgdmFyaWFibGUgdG8gdGltZXZhbCBmb3JtYXQKLSAqCiAgKiBAa3Q6CQl0aGUga3RpbWVfdCB2YXJpYWJsZSB0byBjb252ZXJ0CiAgKgogICogUmV0dXJucyB0aGUgdGltZXZhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUga3RpbWUgdmFsdWUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbGljZW5zZS5oIGIvaW5jbHVkZS9saW51eC9saWNlbnNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVjZGJmNAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbGljZW5zZS5oCkBAIC0wLDAgKzEsMTQgQEAKKyNpZm5kZWYgX19MSUNFTlNFX0gKKyNkZWZpbmUgX19MSUNFTlNFX0gKKworc3RhdGljIGlubGluZSBpbnQgbGljZW5zZV9pc19ncGxfY29tcGF0aWJsZShjb25zdCBjaGFyICpsaWNlbnNlKQoreworCXJldHVybiAoc3RyY21wKGxpY2Vuc2UsICJHUEwiKSA9PSAwCisJCXx8IHN0cmNtcChsaWNlbnNlLCAiR1BMIHYyIikgPT0gMAorCQl8fCBzdHJjbXAobGljZW5zZSwgIkdQTCBhbmQgYWRkaXRpb25hbCByaWdodHMiKSA9PSAwCisJCXx8IHN0cmNtcChsaWNlbnNlLCAiRHVhbCBCU0QvR1BMIikgPT0gMAorCQl8fCBzdHJjbXAobGljZW5zZSwgIkR1YWwgTUlUL0dQTCIpID09IDAKKwkJfHwgc3RyY21wKGxpY2Vuc2UsICJEdWFsIE1QTC9HUEwiKSA9PSAwKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2xpc3QuaCBiL2luY2x1ZGUvbGludXgvbGlzdC5oCmluZGV4IGEwMjY0MmUuLjM3Y2EzMWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbGlzdC5oCisrKyBiL2luY2x1ZGUvbGludXgvbGlzdC5oCkBAIC0yODEsMTYgKzI4MSwxNyBAQAogfQogCiAvKioKLSAqIGxpc3RfZW1wdHlfY2FyZWZ1bCAtIHRlc3RzIHdoZXRoZXIgYSBsaXN0IGlzCi0gKiBlbXB0eSBfYW5kXyBjaGVja3MgdGhhdCBubyBvdGhlciBDUFUgbWlnaHQgYmUKLSAqIGluIHRoZSBwcm9jZXNzIG9mIHN0aWxsIG1vZGlmeWluZyBlaXRoZXIgbWVtYmVyCisgKiBsaXN0X2VtcHR5X2NhcmVmdWwgLSB0ZXN0cyB3aGV0aGVyIGEgbGlzdCBpcyBlbXB0eSBhbmQgbm90IGJlaW5nIG1vZGlmaWVkCisgKiBAaGVhZDogdGhlIGxpc3QgdG8gdGVzdAorICoKKyAqIERlc2NyaXB0aW9uOgorICogdGVzdHMgd2hldGhlciBhIGxpc3QgaXMgZW1wdHkgX2FuZF8gY2hlY2tzIHRoYXQgbm8gb3RoZXIgQ1BVIG1pZ2h0IGJlCisgKiBpbiB0aGUgcHJvY2VzcyBvZiBtb2RpZnlpbmcgZWl0aGVyIG1lbWJlciAobmV4dCBvciBwcmV2KQogICoKICAqIE5PVEU6IHVzaW5nIGxpc3RfZW1wdHlfY2FyZWZ1bCgpIHdpdGhvdXQgc3luY2hyb25pemF0aW9uCiAgKiBjYW4gb25seSBiZSBzYWZlIGlmIHRoZSBvbmx5IGFjdGl2aXR5IHRoYXQgY2FuIGhhcHBlbgogICogdG8gdGhlIGxpc3QgZW50cnkgaXMgbGlzdF9kZWxfaW5pdCgpLiBFZy4gaXQgY2Fubm90IGJlIHVzZWQKICAqIGlmIGFub3RoZXIgQ1BVIGNvdWxkIHJlLWxpc3RfYWRkKCkgaXQuCi0gKgotICogQGhlYWQ6IHRoZSBsaXN0IHRvIHRlc3QuCiAgKi8KIHN0YXRpYyBpbmxpbmUgaW50IGxpc3RfZW1wdHlfY2FyZWZ1bChjb25zdCBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQogewpAQCAtMzUwLDcgKzM1MSw3IEBACiAKIC8qKgogICogbGlzdF9mb3JfZWFjaAktCWl0ZXJhdGUgb3ZlciBhIGxpc3QKLSAqIEBwb3M6CXRoZSAmc3RydWN0IGxpc3RfaGVhZCB0byB1c2UgYXMgYSBsb29wIGNvdW50ZXIuCisgKiBAcG9zOgl0aGUgJnN0cnVjdCBsaXN0X2hlYWQgdG8gdXNlIGFzIGEgbG9vcCBjdXJzb3IuCiAgKiBAaGVhZDoJdGhlIGhlYWQgZm9yIHlvdXIgbGlzdC4KICAqLwogI2RlZmluZSBsaXN0X2Zvcl9lYWNoKHBvcywgaGVhZCkgXApAQCAtMzU5LDcgKzM2MCw3IEBACiAKIC8qKgogICogX19saXN0X2Zvcl9lYWNoCS0JaXRlcmF0ZSBvdmVyIGEgbGlzdAotICogQHBvczoJdGhlICZzdHJ1Y3QgbGlzdF9oZWFkIHRvIHVzZSBhcyBhIGxvb3AgY291bnRlci4KKyAqIEBwb3M6CXRoZSAmc3RydWN0IGxpc3RfaGVhZCB0byB1c2UgYXMgYSBsb29wIGN1cnNvci4KICAqIEBoZWFkOgl0aGUgaGVhZCBmb3IgeW91ciBsaXN0LgogICoKICAqIFRoaXMgdmFyaWFudCBkaWZmZXJzIGZyb20gbGlzdF9mb3JfZWFjaCgpIGluIHRoYXQgaXQncyB0aGUKQEAgLTM3Miw3ICszNzMsNyBAQAogCiAvKioKICAqIGxpc3RfZm9yX2VhY2hfcHJldgktCWl0ZXJhdGUgb3ZlciBhIGxpc3QgYmFja3dhcmRzCi0gKiBAcG9zOgl0aGUgJnN0cnVjdCBsaXN0X2hlYWQgdG8gdXNlIGFzIGEgbG9vcCBjb3VudGVyLgorICogQHBvczoJdGhlICZzdHJ1Y3QgbGlzdF9oZWFkIHRvIHVzZSBhcyBhIGxvb3AgY3Vyc29yLgogICogQGhlYWQ6CXRoZSBoZWFkIGZvciB5b3VyIGxpc3QuCiAgKi8KICNkZWZpbmUgbGlzdF9mb3JfZWFjaF9wcmV2KHBvcywgaGVhZCkgXApAQCAtMzgwLDggKzM4MSw4IEBACiAgICAgICAgIAlwb3MgPSBwb3MtPnByZXYpCiAKIC8qKgotICogbGlzdF9mb3JfZWFjaF9zYWZlCS0JaXRlcmF0ZSBvdmVyIGEgbGlzdCBzYWZlIGFnYWluc3QgcmVtb3ZhbCBvZiBsaXN0IGVudHJ5Ci0gKiBAcG9zOgl0aGUgJnN0cnVjdCBsaXN0X2hlYWQgdG8gdXNlIGFzIGEgbG9vcCBjb3VudGVyLgorICogbGlzdF9mb3JfZWFjaF9zYWZlIC0gaXRlcmF0ZSBvdmVyIGEgbGlzdCBzYWZlIGFnYWluc3QgcmVtb3ZhbCBvZiBsaXN0IGVudHJ5CisgKiBAcG9zOgl0aGUgJnN0cnVjdCBsaXN0X2hlYWQgdG8gdXNlIGFzIGEgbG9vcCBjdXJzb3IuCiAgKiBAbjoJCWFub3RoZXIgJnN0cnVjdCBsaXN0X2hlYWQgdG8gdXNlIGFzIHRlbXBvcmFyeSBzdG9yYWdlCiAgKiBAaGVhZDoJdGhlIGhlYWQgZm9yIHlvdXIgbGlzdC4KICAqLwpAQCAtMzkxLDcgKzM5Miw3IEBACiAKIC8qKgogICogbGlzdF9mb3JfZWFjaF9lbnRyeQktCWl0ZXJhdGUgb3ZlciBsaXN0IG9mIGdpdmVuIHR5cGUKLSAqIEBwb3M6CXRoZSB0eXBlICogdG8gdXNlIGFzIGEgbG9vcCBjb3VudGVyLgorICogQHBvczoJdGhlIHR5cGUgKiB0byB1c2UgYXMgYSBsb29wIGN1cnNvci4KICAqIEBoZWFkOgl0aGUgaGVhZCBmb3IgeW91ciBsaXN0LgogICogQG1lbWJlcjoJdGhlIG5hbWUgb2YgdGhlIGxpc3Rfc3RydWN0IHdpdGhpbiB0aGUgc3RydWN0LgogICovCkBAIC00MDIsNyArNDAzLDcgQEAKIAogLyoqCiAgKiBsaXN0X2Zvcl9lYWNoX2VudHJ5X3JldmVyc2UgLSBpdGVyYXRlIGJhY2t3YXJkcyBvdmVyIGxpc3Qgb2YgZ2l2ZW4gdHlwZS4KLSAqIEBwb3M6CXRoZSB0eXBlICogdG8gdXNlIGFzIGEgbG9vcCBjb3VudGVyLgorICogQHBvczoJdGhlIHR5cGUgKiB0byB1c2UgYXMgYSBsb29wIGN1cnNvci4KICAqIEBoZWFkOgl0aGUgaGVhZCBmb3IgeW91ciBsaXN0LgogICogQG1lbWJlcjoJdGhlIG5hbWUgb2YgdGhlIGxpc3Rfc3RydWN0IHdpdGhpbiB0aGUgc3RydWN0LgogICovCkBAIC00MTIsMjEgKzQxMywyNCBAQAogCSAgICAgcG9zID0gbGlzdF9lbnRyeShwb3MtPm1lbWJlci5wcmV2LCB0eXBlb2YoKnBvcyksIG1lbWJlcikpCiAKIC8qKgotICogbGlzdF9wcmVwYXJlX2VudHJ5IC0gcHJlcGFyZSBhIHBvcyBlbnRyeSBmb3IgdXNlIGFzIGEgc3RhcnQgcG9pbnQgaW4KLSAqCQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9jb250aW51ZQorICogbGlzdF9wcmVwYXJlX2VudHJ5IC0gcHJlcGFyZSBhIHBvcyBlbnRyeSBmb3IgdXNlIGluIGxpc3RfZm9yX2VhY2hfZW50cnlfY29udGludWUKICAqIEBwb3M6CXRoZSB0eXBlICogdG8gdXNlIGFzIGEgc3RhcnQgcG9pbnQKICAqIEBoZWFkOgl0aGUgaGVhZCBvZiB0aGUgbGlzdAogICogQG1lbWJlcjoJdGhlIG5hbWUgb2YgdGhlIGxpc3Rfc3RydWN0IHdpdGhpbiB0aGUgc3RydWN0LgorICoKKyAqIFByZXBhcmVzIGEgcG9zIGVudHJ5IGZvciB1c2UgYXMgYSBzdGFydCBwb2ludCBpbiBsaXN0X2Zvcl9lYWNoX2VudHJ5X2NvbnRpbnVlLgogICovCiAjZGVmaW5lIGxpc3RfcHJlcGFyZV9lbnRyeShwb3MsIGhlYWQsIG1lbWJlcikgXAogCSgocG9zKSA/IDogbGlzdF9lbnRyeShoZWFkLCB0eXBlb2YoKnBvcyksIG1lbWJlcikpCiAKIC8qKgotICogbGlzdF9mb3JfZWFjaF9lbnRyeV9jb250aW51ZSAtCWl0ZXJhdGUgb3ZlciBsaXN0IG9mIGdpdmVuIHR5cGUKLSAqCQkJY29udGludWluZyBhZnRlciBleGlzdGluZyBwb2ludAotICogQHBvczoJdGhlIHR5cGUgKiB0byB1c2UgYXMgYSBsb29wIGNvdW50ZXIuCisgKiBsaXN0X2Zvcl9lYWNoX2VudHJ5X2NvbnRpbnVlIC0gY29udGludWUgaXRlcmF0aW9uIG92ZXIgbGlzdCBvZiBnaXZlbiB0eXBlCisgKiBAcG9zOgl0aGUgdHlwZSAqIHRvIHVzZSBhcyBhIGxvb3AgY3Vyc29yLgogICogQGhlYWQ6CXRoZSBoZWFkIGZvciB5b3VyIGxpc3QuCiAgKiBAbWVtYmVyOgl0aGUgbmFtZSBvZiB0aGUgbGlzdF9zdHJ1Y3Qgd2l0aGluIHRoZSBzdHJ1Y3QuCisgKgorICogQ29udGludWUgdG8gaXRlcmF0ZSBvdmVyIGxpc3Qgb2YgZ2l2ZW4gdHlwZSwgY29udGludWluZyBhZnRlcgorICogdGhlIGN1cnJlbnQgcG9zaXRpb24uCiAgKi8KICNkZWZpbmUgbGlzdF9mb3JfZWFjaF9lbnRyeV9jb250aW51ZShwb3MsIGhlYWQsIG1lbWJlcikgCQlcCiAJZm9yIChwb3MgPSBsaXN0X2VudHJ5KHBvcy0+bWVtYmVyLm5leHQsIHR5cGVvZigqcG9zKSwgbWVtYmVyKTsJXApAQCAtNDM0LDExICs0MzgsMTIgQEAKIAkgICAgIHBvcyA9IGxpc3RfZW50cnkocG9zLT5tZW1iZXIubmV4dCwgdHlwZW9mKCpwb3MpLCBtZW1iZXIpKQogCiAvKioKLSAqIGxpc3RfZm9yX2VhY2hfZW50cnlfZnJvbSAtCWl0ZXJhdGUgb3ZlciBsaXN0IG9mIGdpdmVuIHR5cGUKLSAqCQkJY29udGludWluZyBmcm9tIGV4aXN0aW5nIHBvaW50Ci0gKiBAcG9zOgl0aGUgdHlwZSAqIHRvIHVzZSBhcyBhIGxvb3AgY291bnRlci4KKyAqIGxpc3RfZm9yX2VhY2hfZW50cnlfZnJvbSAtIGl0ZXJhdGUgb3ZlciBsaXN0IG9mIGdpdmVuIHR5cGUgZnJvbSB0aGUgY3VycmVudCBwb2ludAorICogQHBvczoJdGhlIHR5cGUgKiB0byB1c2UgYXMgYSBsb29wIGN1cnNvci4KICAqIEBoZWFkOgl0aGUgaGVhZCBmb3IgeW91ciBsaXN0LgogICogQG1lbWJlcjoJdGhlIG5hbWUgb2YgdGhlIGxpc3Rfc3RydWN0IHdpdGhpbiB0aGUgc3RydWN0LgorICoKKyAqIEl0ZXJhdGUgb3ZlciBsaXN0IG9mIGdpdmVuIHR5cGUsIGNvbnRpbnVpbmcgZnJvbSBjdXJyZW50IHBvc2l0aW9uLgogICovCiAjZGVmaW5lIGxpc3RfZm9yX2VhY2hfZW50cnlfZnJvbShwb3MsIGhlYWQsIG1lbWJlcikgCQkJXAogCWZvciAoOyBwcmVmZXRjaChwb3MtPm1lbWJlci5uZXh0KSwgJnBvcy0+bWVtYmVyICE9IChoZWFkKTsJXApAQCAtNDQ2LDcgKzQ1MSw3IEBACiAKIC8qKgogICogbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlIC0gaXRlcmF0ZSBvdmVyIGxpc3Qgb2YgZ2l2ZW4gdHlwZSBzYWZlIGFnYWluc3QgcmVtb3ZhbCBvZiBsaXN0IGVudHJ5Ci0gKiBAcG9zOgl0aGUgdHlwZSAqIHRvIHVzZSBhcyBhIGxvb3AgY291bnRlci4KKyAqIEBwb3M6CXRoZSB0eXBlICogdG8gdXNlIGFzIGEgbG9vcCBjdXJzb3IuCiAgKiBAbjoJCWFub3RoZXIgdHlwZSAqIHRvIHVzZSBhcyB0ZW1wb3Jhcnkgc3RvcmFnZQogICogQGhlYWQ6CXRoZSBoZWFkIGZvciB5b3VyIGxpc3QuCiAgKiBAbWVtYmVyOgl0aGUgbmFtZSBvZiB0aGUgbGlzdF9zdHJ1Y3Qgd2l0aGluIHRoZSBzdHJ1Y3QuCkBAIC00NTgsMTIgKzQ2MywxNCBAQAogCSAgICAgcG9zID0gbiwgbiA9IGxpc3RfZW50cnkobi0+bWVtYmVyLm5leHQsIHR5cGVvZigqbiksIG1lbWJlcikpCiAKIC8qKgotICogbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlX2NvbnRpbnVlIC0JaXRlcmF0ZSBvdmVyIGxpc3Qgb2YgZ2l2ZW4gdHlwZQotICoJCQljb250aW51aW5nIGFmdGVyIGV4aXN0aW5nIHBvaW50IHNhZmUgYWdhaW5zdCByZW1vdmFsIG9mIGxpc3QgZW50cnkKLSAqIEBwb3M6CXRoZSB0eXBlICogdG8gdXNlIGFzIGEgbG9vcCBjb3VudGVyLgorICogbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlX2NvbnRpbnVlCisgKiBAcG9zOgl0aGUgdHlwZSAqIHRvIHVzZSBhcyBhIGxvb3AgY3Vyc29yLgogICogQG46CQlhbm90aGVyIHR5cGUgKiB0byB1c2UgYXMgdGVtcG9yYXJ5IHN0b3JhZ2UKICAqIEBoZWFkOgl0aGUgaGVhZCBmb3IgeW91ciBsaXN0LgogICogQG1lbWJlcjoJdGhlIG5hbWUgb2YgdGhlIGxpc3Rfc3RydWN0IHdpdGhpbiB0aGUgc3RydWN0LgorICoKKyAqIEl0ZXJhdGUgb3ZlciBsaXN0IG9mIGdpdmVuIHR5cGUsIGNvbnRpbnVpbmcgYWZ0ZXIgY3VycmVudCBwb2ludCwKKyAqIHNhZmUgYWdhaW5zdCByZW1vdmFsIG9mIGxpc3QgZW50cnkuCiAgKi8KICNkZWZpbmUgbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlX2NvbnRpbnVlKHBvcywgbiwgaGVhZCwgbWVtYmVyKSAJCVwKIAlmb3IgKHBvcyA9IGxpc3RfZW50cnkocG9zLT5tZW1iZXIubmV4dCwgdHlwZW9mKCpwb3MpLCBtZW1iZXIpLCAJCVwKQEAgLTQ3MiwxMiArNDc5LDE0IEBACiAJICAgICBwb3MgPSBuLCBuID0gbGlzdF9lbnRyeShuLT5tZW1iZXIubmV4dCwgdHlwZW9mKCpuKSwgbWVtYmVyKSkKIAogLyoqCi0gKiBsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmVfZnJvbSAtIGl0ZXJhdGUgb3ZlciBsaXN0IG9mIGdpdmVuIHR5cGUKLSAqCQkJZnJvbSBleGlzdGluZyBwb2ludCBzYWZlIGFnYWluc3QgcmVtb3ZhbCBvZiBsaXN0IGVudHJ5Ci0gKiBAcG9zOgl0aGUgdHlwZSAqIHRvIHVzZSBhcyBhIGxvb3AgY291bnRlci4KKyAqIGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZV9mcm9tCisgKiBAcG9zOgl0aGUgdHlwZSAqIHRvIHVzZSBhcyBhIGxvb3AgY3Vyc29yLgogICogQG46CQlhbm90aGVyIHR5cGUgKiB0byB1c2UgYXMgdGVtcG9yYXJ5IHN0b3JhZ2UKICAqIEBoZWFkOgl0aGUgaGVhZCBmb3IgeW91ciBsaXN0LgogICogQG1lbWJlcjoJdGhlIG5hbWUgb2YgdGhlIGxpc3Rfc3RydWN0IHdpdGhpbiB0aGUgc3RydWN0LgorICoKKyAqIEl0ZXJhdGUgb3ZlciBsaXN0IG9mIGdpdmVuIHR5cGUgZnJvbSBjdXJyZW50IHBvaW50LCBzYWZlIGFnYWluc3QKKyAqIHJlbW92YWwgb2YgbGlzdCBlbnRyeS4KICAqLwogI2RlZmluZSBsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmVfZnJvbShwb3MsIG4sIGhlYWQsIG1lbWJlcikgCQkJXAogCWZvciAobiA9IGxpc3RfZW50cnkocG9zLT5tZW1iZXIubmV4dCwgdHlwZW9mKCpwb3MpLCBtZW1iZXIpOwkJXApAQCAtNDg1LDEyICs0OTQsMTQgQEAKIAkgICAgIHBvcyA9IG4sIG4gPSBsaXN0X2VudHJ5KG4tPm1lbWJlci5uZXh0LCB0eXBlb2YoKm4pLCBtZW1iZXIpKQogCiAvKioKLSAqIGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZV9yZXZlcnNlIC0gaXRlcmF0ZSBiYWNrd2FyZHMgb3ZlciBsaXN0IG9mIGdpdmVuIHR5cGUgc2FmZSBhZ2FpbnN0Ci0gKgkJCQkgICAgICByZW1vdmFsIG9mIGxpc3QgZW50cnkKLSAqIEBwb3M6CXRoZSB0eXBlICogdG8gdXNlIGFzIGEgbG9vcCBjb3VudGVyLgorICogbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlX3JldmVyc2UKKyAqIEBwb3M6CXRoZSB0eXBlICogdG8gdXNlIGFzIGEgbG9vcCBjdXJzb3IuCiAgKiBAbjoJCWFub3RoZXIgdHlwZSAqIHRvIHVzZSBhcyB0ZW1wb3Jhcnkgc3RvcmFnZQogICogQGhlYWQ6CXRoZSBoZWFkIGZvciB5b3VyIGxpc3QuCiAgKiBAbWVtYmVyOgl0aGUgbmFtZSBvZiB0aGUgbGlzdF9zdHJ1Y3Qgd2l0aGluIHRoZSBzdHJ1Y3QuCisgKgorICogSXRlcmF0ZSBiYWNrd2FyZHMgb3ZlciBsaXN0IG9mIGdpdmVuIHR5cGUsIHNhZmUgYWdhaW5zdCByZW1vdmFsCisgKiBvZiBsaXN0IGVudHJ5LgogICovCiAjZGVmaW5lIGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZV9yZXZlcnNlKHBvcywgbiwgaGVhZCwgbWVtYmVyKQkJXAogCWZvciAocG9zID0gbGlzdF9lbnRyeSgoaGVhZCktPnByZXYsIHR5cGVvZigqcG9zKSwgbWVtYmVyKSwJXApAQCAtNTAwLDcgKzUxMSw3IEBACiAKIC8qKgogICogbGlzdF9mb3JfZWFjaF9yY3UJLQlpdGVyYXRlIG92ZXIgYW4gcmN1LXByb3RlY3RlZCBsaXN0Ci0gKiBAcG9zOgl0aGUgJnN0cnVjdCBsaXN0X2hlYWQgdG8gdXNlIGFzIGEgbG9vcCBjb3VudGVyLgorICogQHBvczoJdGhlICZzdHJ1Y3QgbGlzdF9oZWFkIHRvIHVzZSBhcyBhIGxvb3AgY3Vyc29yLgogICogQGhlYWQ6CXRoZSBoZWFkIGZvciB5b3VyIGxpc3QuCiAgKgogICogVGhpcyBsaXN0LXRyYXZlcnNhbCBwcmltaXRpdmUgbWF5IHNhZmVseSBydW4gY29uY3VycmVudGx5IHdpdGgKQEAgLTUxOCwxMiArNTI5LDEzIEBACiAgICAgICAgIAlwb3MgPSBwb3MtPm5leHQpCiAKIC8qKgotICogbGlzdF9mb3JfZWFjaF9zYWZlX3JjdQktCWl0ZXJhdGUgb3ZlciBhbiByY3UtcHJvdGVjdGVkIGxpc3Qgc2FmZQotICoJCQkJCWFnYWluc3QgcmVtb3ZhbCBvZiBsaXN0IGVudHJ5Ci0gKiBAcG9zOgl0aGUgJnN0cnVjdCBsaXN0X2hlYWQgdG8gdXNlIGFzIGEgbG9vcCBjb3VudGVyLgorICogbGlzdF9mb3JfZWFjaF9zYWZlX3JjdQorICogQHBvczoJdGhlICZzdHJ1Y3QgbGlzdF9oZWFkIHRvIHVzZSBhcyBhIGxvb3AgY3Vyc29yLgogICogQG46CQlhbm90aGVyICZzdHJ1Y3QgbGlzdF9oZWFkIHRvIHVzZSBhcyB0ZW1wb3Jhcnkgc3RvcmFnZQogICogQGhlYWQ6CXRoZSBoZWFkIGZvciB5b3VyIGxpc3QuCiAgKgorICogSXRlcmF0ZSBvdmVyIGFuIHJjdS1wcm90ZWN0ZWQgbGlzdCwgc2FmZSBhZ2FpbnN0IHJlbW92YWwgb2YgbGlzdCBlbnRyeS4KKyAqCiAgKiBUaGlzIGxpc3QtdHJhdmVyc2FsIHByaW1pdGl2ZSBtYXkgc2FmZWx5IHJ1biBjb25jdXJyZW50bHkgd2l0aAogICogdGhlIF9yY3UgbGlzdC1tdXRhdGlvbiBwcmltaXRpdmVzIHN1Y2ggYXMgbGlzdF9hZGRfcmN1KCkKICAqIGFzIGxvbmcgYXMgdGhlIHRyYXZlcnNhbCBpcyBndWFyZGVkIGJ5IHJjdV9yZWFkX2xvY2soKS4KQEAgLTUzNSw3ICs1NDcsNyBAQAogCiAvKioKICAqIGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1CS0JaXRlcmF0ZSBvdmVyIHJjdSBsaXN0IG9mIGdpdmVuIHR5cGUKLSAqIEBwb3M6CXRoZSB0eXBlICogdG8gdXNlIGFzIGEgbG9vcCBjb3VudGVyLgorICogQHBvczoJdGhlIHR5cGUgKiB0byB1c2UgYXMgYSBsb29wIGN1cnNvci4KICAqIEBoZWFkOgl0aGUgaGVhZCBmb3IgeW91ciBsaXN0LgogICogQG1lbWJlcjoJdGhlIG5hbWUgb2YgdGhlIGxpc3Rfc3RydWN0IHdpdGhpbiB0aGUgc3RydWN0LgogICoKQEAgLTU1MSwxMSArNTYzLDEyIEBACiAKIAogLyoqCi0gKiBsaXN0X2Zvcl9lYWNoX2NvbnRpbnVlX3JjdQktCWl0ZXJhdGUgb3ZlciBhbiByY3UtcHJvdGVjdGVkIGxpc3QKLSAqCQkJY29udGludWluZyBhZnRlciBleGlzdGluZyBwb2ludC4KLSAqIEBwb3M6CXRoZSAmc3RydWN0IGxpc3RfaGVhZCB0byB1c2UgYXMgYSBsb29wIGNvdW50ZXIuCisgKiBsaXN0X2Zvcl9lYWNoX2NvbnRpbnVlX3JjdQorICogQHBvczoJdGhlICZzdHJ1Y3QgbGlzdF9oZWFkIHRvIHVzZSBhcyBhIGxvb3AgY3Vyc29yLgogICogQGhlYWQ6CXRoZSBoZWFkIGZvciB5b3VyIGxpc3QuCiAgKgorICogSXRlcmF0ZSBvdmVyIGFuIHJjdS1wcm90ZWN0ZWQgbGlzdCwgY29udGludWluZyBhZnRlciBjdXJyZW50IHBvaW50LgorICoKICAqIFRoaXMgbGlzdC10cmF2ZXJzYWwgcHJpbWl0aXZlIG1heSBzYWZlbHkgcnVuIGNvbmN1cnJlbnRseSB3aXRoCiAgKiB0aGUgX3JjdSBsaXN0LW11dGF0aW9uIHByaW1pdGl2ZXMgc3VjaCBhcyBsaXN0X2FkZF9yY3UoKQogICogYXMgbG9uZyBhcyB0aGUgdHJhdmVyc2FsIGlzIGd1YXJkZWQgYnkgcmN1X3JlYWRfbG9jaygpLgpAQCAtNjgxLDExICs2OTQsMTQgQEAKIAogCiAvKioKLSAqIGhsaXN0X2FkZF9oZWFkX3JjdSAtIGFkZHMgdGhlIHNwZWNpZmllZCBlbGVtZW50IHRvIHRoZSBzcGVjaWZpZWQgaGxpc3QsCi0gKiB3aGlsZSBwZXJtaXR0aW5nIHJhY2luZyB0cmF2ZXJzYWxzLgorICogaGxpc3RfYWRkX2hlYWRfcmN1CiAgKiBAbjogdGhlIGVsZW1lbnQgdG8gYWRkIHRvIHRoZSBoYXNoIGxpc3QuCiAgKiBAaDogdGhlIGxpc3QgdG8gYWRkIHRvLgogICoKKyAqIERlc2NyaXB0aW9uOgorICogQWRkcyB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgdG8gdGhlIHNwZWNpZmllZCBobGlzdCwKKyAqIHdoaWxlIHBlcm1pdHRpbmcgcmFjaW5nIHRyYXZlcnNhbHMuCisgKgogICogVGhlIGNhbGxlciBtdXN0IHRha2Ugd2hhdGV2ZXIgcHJlY2F1dGlvbnMgYXJlIG5lY2Vzc2FyeQogICogKHN1Y2ggYXMgaG9sZGluZyBhcHByb3ByaWF0ZSBsb2NrcykgdG8gYXZvaWQgcmFjaW5nCiAgKiB3aXRoIGFub3RoZXIgbGlzdC1tdXRhdGlvbiBwcmltaXRpdmUsIHN1Y2ggYXMgaGxpc3RfYWRkX2hlYWRfcmN1KCkKQEAgLTczMCwxMSArNzQ2LDE0IEBACiB9CiAKIC8qKgotICogaGxpc3RfYWRkX2JlZm9yZV9yY3UgLSBhZGRzIHRoZSBzcGVjaWZpZWQgZWxlbWVudCB0byB0aGUgc3BlY2lmaWVkIGhsaXN0Ci0gKiBiZWZvcmUgdGhlIHNwZWNpZmllZCBub2RlIHdoaWxlIHBlcm1pdHRpbmcgcmFjaW5nIHRyYXZlcnNhbHMuCisgKiBobGlzdF9hZGRfYmVmb3JlX3JjdQogICogQG46IHRoZSBuZXcgZWxlbWVudCB0byBhZGQgdG8gdGhlIGhhc2ggbGlzdC4KICAqIEBuZXh0OiB0aGUgZXhpc3RpbmcgZWxlbWVudCB0byBhZGQgdGhlIG5ldyBlbGVtZW50IGJlZm9yZS4KICAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIEFkZHMgdGhlIHNwZWNpZmllZCBlbGVtZW50IHRvIHRoZSBzcGVjaWZpZWQgaGxpc3QKKyAqIGJlZm9yZSB0aGUgc3BlY2lmaWVkIG5vZGUgd2hpbGUgcGVybWl0dGluZyByYWNpbmcgdHJhdmVyc2Fscy4KKyAqCiAgKiBUaGUgY2FsbGVyIG11c3QgdGFrZSB3aGF0ZXZlciBwcmVjYXV0aW9ucyBhcmUgbmVjZXNzYXJ5CiAgKiAoc3VjaCBhcyBob2xkaW5nIGFwcHJvcHJpYXRlIGxvY2tzKSB0byBhdm9pZCByYWNpbmcKICAqIHdpdGggYW5vdGhlciBsaXN0LW11dGF0aW9uIHByaW1pdGl2ZSwgc3VjaCBhcyBobGlzdF9hZGRfaGVhZF9yY3UoKQpAQCAtNzU1LDExICs3NzQsMTQgQEAKIH0KIAogLyoqCi0gKiBobGlzdF9hZGRfYWZ0ZXJfcmN1IC0gYWRkcyB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgdG8gdGhlIHNwZWNpZmllZCBobGlzdAotICogYWZ0ZXIgdGhlIHNwZWNpZmllZCBub2RlIHdoaWxlIHBlcm1pdHRpbmcgcmFjaW5nIHRyYXZlcnNhbHMuCisgKiBobGlzdF9hZGRfYWZ0ZXJfcmN1CiAgKiBAcHJldjogdGhlIGV4aXN0aW5nIGVsZW1lbnQgdG8gYWRkIHRoZSBuZXcgZWxlbWVudCBhZnRlci4KICAqIEBuOiB0aGUgbmV3IGVsZW1lbnQgdG8gYWRkIHRvIHRoZSBoYXNoIGxpc3QuCiAgKgorICogRGVzY3JpcHRpb246CisgKiBBZGRzIHRoZSBzcGVjaWZpZWQgZWxlbWVudCB0byB0aGUgc3BlY2lmaWVkIGhsaXN0CisgKiBhZnRlciB0aGUgc3BlY2lmaWVkIG5vZGUgd2hpbGUgcGVybWl0dGluZyByYWNpbmcgdHJhdmVyc2Fscy4KKyAqCiAgKiBUaGUgY2FsbGVyIG11c3QgdGFrZSB3aGF0ZXZlciBwcmVjYXV0aW9ucyBhcmUgbmVjZXNzYXJ5CiAgKiAoc3VjaCBhcyBob2xkaW5nIGFwcHJvcHJpYXRlIGxvY2tzKSB0byBhdm9pZCByYWNpbmcKICAqIHdpdGggYW5vdGhlciBsaXN0LW11dGF0aW9uIHByaW1pdGl2ZSwgc3VjaCBhcyBobGlzdF9hZGRfaGVhZF9yY3UoKQpAQCAtNzkyLDggKzgxNCw4IEBACiAKIC8qKgogICogaGxpc3RfZm9yX2VhY2hfZW50cnkJLSBpdGVyYXRlIG92ZXIgbGlzdCBvZiBnaXZlbiB0eXBlCi0gKiBAdHBvczoJdGhlIHR5cGUgKiB0byB1c2UgYXMgYSBsb29wIGNvdW50ZXIuCi0gKiBAcG9zOgl0aGUgJnN0cnVjdCBobGlzdF9ub2RlIHRvIHVzZSBhcyBhIGxvb3AgY291bnRlci4KKyAqIEB0cG9zOgl0aGUgdHlwZSAqIHRvIHVzZSBhcyBhIGxvb3AgY3Vyc29yLgorICogQHBvczoJdGhlICZzdHJ1Y3QgaGxpc3Rfbm9kZSB0byB1c2UgYXMgYSBsb29wIGN1cnNvci4KICAqIEBoZWFkOgl0aGUgaGVhZCBmb3IgeW91ciBsaXN0LgogICogQG1lbWJlcjoJdGhlIG5hbWUgb2YgdGhlIGhsaXN0X25vZGUgd2l0aGluIHRoZSBzdHJ1Y3QuCiAgKi8KQEAgLTgwNCw5ICs4MjYsOSBAQAogCSAgICAgcG9zID0gcG9zLT5uZXh0KQogCiAvKioKLSAqIGhsaXN0X2Zvcl9lYWNoX2VudHJ5X2NvbnRpbnVlIC0gaXRlcmF0ZSBvdmVyIGEgaGxpc3QgY29udGludWluZyBhZnRlciBleGlzdGluZyBwb2ludAotICogQHRwb3M6CXRoZSB0eXBlICogdG8gdXNlIGFzIGEgbG9vcCBjb3VudGVyLgotICogQHBvczoJdGhlICZzdHJ1Y3QgaGxpc3Rfbm9kZSB0byB1c2UgYXMgYSBsb29wIGNvdW50ZXIuCisgKiBobGlzdF9mb3JfZWFjaF9lbnRyeV9jb250aW51ZSAtIGl0ZXJhdGUgb3ZlciBhIGhsaXN0IGNvbnRpbnVpbmcgYWZ0ZXIgY3VycmVudCBwb2ludAorICogQHRwb3M6CXRoZSB0eXBlICogdG8gdXNlIGFzIGEgbG9vcCBjdXJzb3IuCisgKiBAcG9zOgl0aGUgJnN0cnVjdCBobGlzdF9ub2RlIHRvIHVzZSBhcyBhIGxvb3AgY3Vyc29yLgogICogQG1lbWJlcjoJdGhlIG5hbWUgb2YgdGhlIGhsaXN0X25vZGUgd2l0aGluIHRoZSBzdHJ1Y3QuCiAgKi8KICNkZWZpbmUgaGxpc3RfZm9yX2VhY2hfZW50cnlfY29udGludWUodHBvcywgcG9zLCBtZW1iZXIpCQkgXApAQCAtODE2LDkgKzgzOCw5IEBACiAJICAgICBwb3MgPSBwb3MtPm5leHQpCiAKIC8qKgotICogaGxpc3RfZm9yX2VhY2hfZW50cnlfZnJvbSAtIGl0ZXJhdGUgb3ZlciBhIGhsaXN0IGNvbnRpbnVpbmcgZnJvbSBleGlzdGluZyBwb2ludAotICogQHRwb3M6CXRoZSB0eXBlICogdG8gdXNlIGFzIGEgbG9vcCBjb3VudGVyLgotICogQHBvczoJdGhlICZzdHJ1Y3QgaGxpc3Rfbm9kZSB0byB1c2UgYXMgYSBsb29wIGNvdW50ZXIuCisgKiBobGlzdF9mb3JfZWFjaF9lbnRyeV9mcm9tIC0gaXRlcmF0ZSBvdmVyIGEgaGxpc3QgY29udGludWluZyBmcm9tIGN1cnJlbnQgcG9pbnQKKyAqIEB0cG9zOgl0aGUgdHlwZSAqIHRvIHVzZSBhcyBhIGxvb3AgY3Vyc29yLgorICogQHBvczoJdGhlICZzdHJ1Y3QgaGxpc3Rfbm9kZSB0byB1c2UgYXMgYSBsb29wIGN1cnNvci4KICAqIEBtZW1iZXI6CXRoZSBuYW1lIG9mIHRoZSBobGlzdF9ub2RlIHdpdGhpbiB0aGUgc3RydWN0LgogICovCiAjZGVmaW5lIGhsaXN0X2Zvcl9lYWNoX2VudHJ5X2Zyb20odHBvcywgcG9zLCBtZW1iZXIpCQkJIFwKQEAgLTgyOCw4ICs4NTAsOCBAQAogCiAvKioKICAqIGhsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUgLSBpdGVyYXRlIG92ZXIgbGlzdCBvZiBnaXZlbiB0eXBlIHNhZmUgYWdhaW5zdCByZW1vdmFsIG9mIGxpc3QgZW50cnkKLSAqIEB0cG9zOgl0aGUgdHlwZSAqIHRvIHVzZSBhcyBhIGxvb3AgY291bnRlci4KLSAqIEBwb3M6CXRoZSAmc3RydWN0IGhsaXN0X25vZGUgdG8gdXNlIGFzIGEgbG9vcCBjb3VudGVyLgorICogQHRwb3M6CXRoZSB0eXBlICogdG8gdXNlIGFzIGEgbG9vcCBjdXJzb3IuCisgKiBAcG9zOgl0aGUgJnN0cnVjdCBobGlzdF9ub2RlIHRvIHVzZSBhcyBhIGxvb3AgY3Vyc29yLgogICogQG46CQlhbm90aGVyICZzdHJ1Y3QgaGxpc3Rfbm9kZSB0byB1c2UgYXMgdGVtcG9yYXJ5IHN0b3JhZ2UKICAqIEBoZWFkOgl0aGUgaGVhZCBmb3IgeW91ciBsaXN0LgogICogQG1lbWJlcjoJdGhlIG5hbWUgb2YgdGhlIGhsaXN0X25vZGUgd2l0aGluIHRoZSBzdHJ1Y3QuCkBAIC04NDIsOCArODY0LDggQEAKIAogLyoqCiAgKiBobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UgLSBpdGVyYXRlIG92ZXIgcmN1IGxpc3Qgb2YgZ2l2ZW4gdHlwZQotICogQHRwb3M6CXRoZSB0eXBlICogdG8gdXNlIGFzIGEgbG9vcCBjb3VudGVyLgotICogQHBvczoJdGhlICZzdHJ1Y3QgaGxpc3Rfbm9kZSB0byB1c2UgYXMgYSBsb29wIGNvdW50ZXIuCisgKiBAdHBvczoJdGhlIHR5cGUgKiB0byB1c2UgYXMgYSBsb29wIGN1cnNvci4KKyAqIEBwb3M6CXRoZSAmc3RydWN0IGhsaXN0X25vZGUgdG8gdXNlIGFzIGEgbG9vcCBjdXJzb3IuCiAgKiBAaGVhZDoJdGhlIGhlYWQgZm9yIHlvdXIgbGlzdC4KICAqIEBtZW1iZXI6CXRoZSBuYW1lIG9mIHRoZSBobGlzdF9ub2RlIHdpdGhpbiB0aGUgc3RydWN0LgogICoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbG9ja2QvbG9ja2QuaCBiL2luY2x1ZGUvbGludXgvbG9ja2QvbG9ja2QuaAppbmRleCBhODg3NmJjLi5hYTRmZTkwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2xvY2tkL2xvY2tkLmgKKysrIGIvaW5jbHVkZS9saW51eC9sb2NrZC9sb2NrZC5oCkBAIC00OSwxMSArNDksMTIgQEAKIAkJCQloX2tpbGxlZCAgICAgOiAxLAogCQkJCWhfbW9uaXRvcmVkICA6IDE7CiAJd2FpdF9xdWV1ZV9oZWFkX3QJaF9ncmFjZXdhaXQ7CS8qIHdhaXQgd2hpbGUgcmVjbGFpbWluZyAqLworCXN0cnVjdCByd19zZW1hcGhvcmUJaF9yd3NlbTsJLyogUmVib290IHJlY292ZXJ5IGxvY2sgKi8KIAl1MzIJCQloX3N0YXRlOwkvKiBwc2V1ZG8tc3RhdGUgY291bnRlciAqLwogCXUzMgkJCWhfbnNtc3RhdGU7CS8qIHRydWUgcmVtb3RlIE5TTSBzdGF0ZSAqLwogCXUzMgkJCWhfcGlkY291bnQ7CS8qIFBzZXVkb3BpZHMgKi8KIAlhdG9taWNfdAkJaF9jb3VudDsJLyogcmVmZXJlbmNlIGNvdW50ICovCi0Jc3RydWN0IHNlbWFwaG9yZQloX3NlbWE7CQkvKiBtdXRleCBmb3IgcG1hcCBiaW5kaW5nICovCisJc3RydWN0IG11dGV4CQloX211dGV4OwkvKiBtdXRleCBmb3IgcG1hcCBiaW5kaW5nICovCiAJdW5zaWduZWQgbG9uZwkJaF9uZXh0cmViaW5kOwkvKiBuZXh0IHBvcnRtYXAgY2FsbCAqLwogCXVuc2lnbmVkIGxvbmcJCWhfZXhwaXJlczsJLyogZWxpZ2libGUgZm9yIEdDICovCiAJc3RydWN0IGxpc3RfaGVhZAloX2xvY2tvd25lcnM7CS8qIExvY2tvd25lcnMgZm9yIHRoZSBjbGllbnQgKi8KQEAgLTIxOSw2ICsyMjAsNyBAQAogbmxtX2NvbXBhcmVfbG9ja3MoY29uc3Qgc3RydWN0IGZpbGVfbG9jayAqZmwxLCBjb25zdCBzdHJ1Y3QgZmlsZV9sb2NrICpmbDIpCiB7CiAJcmV0dXJuCWZsMS0+ZmxfcGlkICAgPT0gZmwyLT5mbF9waWQKKwkgICAgICYmIGZsMS0+Zmxfb3duZXIgPT0gZmwyLT5mbF9vd25lcgogCSAgICAgJiYgZmwxLT5mbF9zdGFydCA9PSBmbDItPmZsX3N0YXJ0CiAJICAgICAmJiBmbDEtPmZsX2VuZCAgID09IGZsMi0+ZmxfZW5kCiAJICAgICAmJihmbDEtPmZsX3R5cGUgID09IGZsMi0+ZmxfdHlwZSB8fCBmbDItPmZsX3R5cGUgPT0gRl9VTkxDSyk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21pZ3JhdGUuaCBiL2luY2x1ZGUvbGludXgvbWlncmF0ZS5oCmluZGV4IDVkYmEyM2EuLjQ4MTQ4ZTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWlncmF0ZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbWlncmF0ZS5oCkBAIC0xNiw3ICsxNiw5IEBACiAJCQlzdHJ1Y3QgcGFnZSAqLCBzdHJ1Y3QgcGFnZSAqKTsKIAogZXh0ZXJuIGludCBtaWdyYXRlX3ByZXAodm9pZCk7Ci0KK2V4dGVybiBpbnQgbWlncmF0ZV92bWFzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAorCQljb25zdCBub2RlbWFza190ICpmcm9tLCBjb25zdCBub2RlbWFza190ICp0bywKKwkJdW5zaWduZWQgbG9uZyBmbGFncyk7CiAjZWxzZQogCiBzdGF0aWMgaW5saW5lIGludCBpc29sYXRlX2xydV9wYWdlKHN0cnVjdCBwYWdlICpwLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KQpAQCAtMzAsNiArMzIsMTMgQEAKIAogc3RhdGljIGlubGluZSBpbnQgbWlncmF0ZV9wcmVwKHZvaWQpIHsgcmV0dXJuIC1FTk9TWVM7IH0KIAorc3RhdGljIGlubGluZSBpbnQgbWlncmF0ZV92bWFzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAorCQljb25zdCBub2RlbWFza190ICpmcm9tLCBjb25zdCBub2RlbWFza190ICp0bywKKwkJdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlyZXR1cm4gLUVOT1NZUzsKK30KKwogLyogUG9zc2libGUgc2V0dGluZ3MgZm9yIHRoZSBtaWdyYXRlX3BhZ2UoKSBtZXRob2QgaW4gYWRkcmVzc19vcGVyYXRpb25zICovCiAjZGVmaW5lIG1pZ3JhdGVfcGFnZSBOVUxMCiAjZGVmaW5lIGZhaWxfbWlncmF0ZV9wYWdlIE5VTEwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW0uaCBiL2luY2x1ZGUvbGludXgvbW0uaAppbmRleCAzYjA5NDQ0Li5hOTI5ZWExIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21tLmgKKysrIGIvaW5jbHVkZS9saW51eC9tbS5oCkBAIC0xNDUsNyArMTQ1LDYgQEAKIAogI2RlZmluZSBWTV9HUk9XU0RPV04JMHgwMDAwMDEwMAkvKiBnZW5lcmFsIGluZm8gb24gdGhlIHNlZ21lbnQgKi8KICNkZWZpbmUgVk1fR1JPV1NVUAkweDAwMDAwMjAwCi0jZGVmaW5lIFZNX1NITQkJMHgwMDAwMDAwMAkvKiBNZWFucyBub3RoaW5nOiBkZWxldGUgaXQgbGF0ZXIgKi8KICNkZWZpbmUgVk1fUEZOTUFQCTB4MDAwMDA0MDAJLyogUGFnZS1yYW5nZXMgbWFuYWdlZCB3aXRob3V0ICJzdHJ1Y3QgcGFnZSIsIGp1c3QgcHVyZSBQRk4gKi8KICNkZWZpbmUgVk1fREVOWVdSSVRFCTB4MDAwMDA4MDAJLyogRVRYVEJTWSBvbiB3cml0ZSBhdHRlbXB0cy4uICovCiAKQEAgLTIwNyw2ICsyMDYsOCBAQAogCWludCAoKnNldF9wb2xpY3kpKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBzdHJ1Y3QgbWVtcG9saWN5ICpuZXcpOwogCXN0cnVjdCBtZW1wb2xpY3kgKigqZ2V0X3BvbGljeSkoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJCQkJCXVuc2lnbmVkIGxvbmcgYWRkcik7CisJaW50ICgqbWlncmF0ZSkoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIGNvbnN0IG5vZGVtYXNrX3QgKmZyb20sCisJCWNvbnN0IG5vZGVtYXNrX3QgKnRvLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKICNlbmRpZgogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tb2R1bGUuaCBiL2luY2x1ZGUvbGludXgvbW9kdWxlLmgKaW5kZXggMmQzNjYwOS4uOWViYmI3NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tb2R1bGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L21vZHVsZS5oCkBAIC0yODUsNiArMjg1LDkgQEAKIAkvKiBUaGUgc2l6ZSBvZiB0aGUgZXhlY3V0YWJsZSBjb2RlIGluIGVhY2ggc2VjdGlvbi4gICovCiAJdW5zaWduZWQgbG9uZyBpbml0X3RleHRfc2l6ZSwgY29yZV90ZXh0X3NpemU7CiAKKwkvKiBUaGUgaGFuZGxlIHJldHVybmVkIGZyb20gdW53aW5kX2FkZF90YWJsZS4gKi8KKwl2b2lkICp1bndpbmRfaW5mbzsKKwogCS8qIEFyY2gtc3BlY2lmaWMgbW9kdWxlIHZhbHVlcyAqLwogCXN0cnVjdCBtb2RfYXJjaF9zcGVjaWZpYyBhcmNoOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21vdW50LmggYi9pbmNsdWRlL2xpbnV4L21vdW50LmgKaW5kZXggNjA3MThmMS4uNDAzZDFhOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tb3VudC5oCisrKyBiL2luY2x1ZGUvbGludXgvbW91bnQuaApAQCAtMjgsNiArMjgsOCBAQAogI2RlZmluZSBNTlRfTk9BVElNRQkweDA4CiAjZGVmaW5lIE1OVF9OT0RJUkFUSU1FCTB4MTAKIAorI2RlZmluZSBNTlRfU0hSSU5LQUJMRQkweDEwMAorCiAjZGVmaW5lIE1OVF9TSEFSRUQJMHgxMDAwCS8qIGlmIHRoZSB2ZnNtb3VudCBpcyBhIHNoYXJlZCBtb3VudCAqLwogI2RlZmluZSBNTlRfVU5CSU5EQUJMRQkweDIwMDAJLyogaWYgdGhlIHZmc21vdW50IGlzIGEgdW5iaW5kYWJsZSBtb3VudCAqLwogI2RlZmluZSBNTlRfUE5PREVfTUFTSwkweDMwMDAJLyogcHJvcG9nYXRpb24gZmxhZyBtYXNrICovCkBAIC03OCwxMiArODAsMTggQEAKIGV4dGVybiBzdHJ1Y3QgdmZzbW91bnQgKmRvX2tlcm5fbW91bnQoY29uc3QgY2hhciAqZnN0eXBlLCBpbnQgZmxhZ3MsCiAJCQkJICAgICAgY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqZGF0YSk7CiAKK3N0cnVjdCBmaWxlX3N5c3RlbV90eXBlOworZXh0ZXJuIHN0cnVjdCB2ZnNtb3VudCAqdmZzX2tlcm5fbW91bnQoc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKnR5cGUsCisJCQkJICAgICAgaW50IGZsYWdzLCBjb25zdCBjaGFyICpuYW1lLAorCQkJCSAgICAgIHZvaWQgKmRhdGEpOworCiBzdHJ1Y3QgbmFtZWlkYXRhOwogCiBleHRlcm4gaW50IGRvX2FkZF9tb3VudChzdHJ1Y3QgdmZzbW91bnQgKm5ld21udCwgc3RydWN0IG5hbWVpZGF0YSAqbmQsCiAJCQlpbnQgbW50X2ZsYWdzLCBzdHJ1Y3QgbGlzdF9oZWFkICpmc2xpc3QpOwogCiBleHRlcm4gdm9pZCBtYXJrX21vdW50c19mb3JfZXhwaXJ5KHN0cnVjdCBsaXN0X2hlYWQgKm1vdW50cyk7CitleHRlcm4gdm9pZCBzaHJpbmtfc3VibW91bnRzKHN0cnVjdCB2ZnNtb3VudCAqbW91bnRwb2ludCwgc3RydWN0IGxpc3RfaGVhZCAqbW91bnRzKTsKIAogZXh0ZXJuIHNwaW5sb2NrX3QgdmZzbW91bnRfbG9jazsKIGV4dGVybiBkZXZfdCBuYW1lX3RvX2Rldl90KGNoYXIgKm5hbWUpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uYmQuaCBiL2luY2x1ZGUvbGludXgvbmJkLmgKaW5kZXggMWQ3Y2RkMi4uZTcxMmU3ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uYmQuaAorKysgYi9pbmNsdWRlL2xpbnV4L25iZC5oCkBAIC03NywxMSArNzcsMTEgQEAKICAqIHNlcnZlci4gQWxsIGRhdGEgYXJlIGluIG5ldHdvcmsgYnl0ZSBvcmRlci4KICAqLwogc3RydWN0IG5iZF9yZXF1ZXN0IHsKLQlfX3UzMiBtYWdpYzsKLQlfX3UzMiB0eXBlOwkvKiA9PSBSRUFEIHx8ID09IFdSSVRFIAkqLworCV9fYmUzMiBtYWdpYzsKKwlfX2JlMzIgdHlwZTsJLyogPT0gUkVBRCB8fCA9PSBXUklURSAJKi8KIAljaGFyIGhhbmRsZVs4XTsKLQlfX3U2NCBmcm9tOwotCV9fdTMyIGxlbjsKKwlfX2JlNjQgZnJvbTsKKwlfX2JlMzIgbGVuOwogfQogI2lmZGVmIF9fR05VQ19fCiAJX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpCkBAIC05Myw4ICs5Myw4IEBACiAgKiBpdCBoYXMgY29tcGxldGVkIGFuIEkvTyByZXF1ZXN0IChvciBhbiBlcnJvciBvY2N1cnMpLgogICovCiBzdHJ1Y3QgbmJkX3JlcGx5IHsKLQlfX3UzMiBtYWdpYzsKLQlfX3UzMiBlcnJvcjsJCS8qIDAgPSBvaywgZWxzZSBlcnJvcgkqLworCV9fYmUzMiBtYWdpYzsKKwlfX2JlMzIgZXJyb3I7CQkvKiAwID0gb2ssIGVsc2UgZXJyb3IJKi8KIAljaGFyIGhhbmRsZVs4XTsJCS8qIGhhbmRsZSB5b3UgZ290IGZyb20gcmVxdWVzdAkqLwogfTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRkZXZpY2UuaCBiL2luY2x1ZGUvbGludXgvbmV0ZGV2aWNlLmgKaW5kZXggYmM3NDdlNS4uMDNjZDc1NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRkZXZpY2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGRldmljZS5oCkBAIC02OTksNyArNjk5LDYgQEAKIAogZXh0ZXJuIHZvaWQJCWRldl9pbml0KHZvaWQpOwogCi1leHRlcm4gaW50CQluZXRkZXZfbml0OwogZXh0ZXJuIGludAkJbmV0ZGV2X2J1ZGdldDsKIAogLyogQ2FsbGVkIGJ5IHJ0bmV0bGluay5jOnJ0bmxfdW5sb2NrKCkgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0cG9sbC5oIGIvaW5jbHVkZS9saW51eC9uZXRwb2xsLmgKaW5kZXggY2E1YTg3My4uMWVmZTYwYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRwb2xsLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRwb2xsLmgKQEAgLTMxLDYgKzMxLDcgQEAKIAlpbnQgcnhfZmxhZ3M7CiAJc3BpbmxvY2tfdCByeF9sb2NrOwogCXN0cnVjdCBuZXRwb2xsICpyeF9ucDsgLyogbmV0cG9sbCB0aGF0IHJlZ2lzdGVyZWQgYW4gcnhfaG9vayAqLworCXN0cnVjdCBza19idWZmX2hlYWQgYXJwX3R4OyAvKiBsaXN0IG9mIGFycCByZXF1ZXN0cyB0byByZXBseSB0byAqLwogfTsKIAogdm9pZCBuZXRwb2xsX3BvbGwoc3RydWN0IG5ldHBvbGwgKm5wKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmZzNC5oIGIvaW5jbHVkZS9saW51eC9uZnM0LmgKaW5kZXggMTA1OWU2ZC4uNWY2ODFkNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZnM0LmgKKysrIGIvaW5jbHVkZS9saW51eC9uZnM0LmgKQEAgLTM4NCw2ICszODQsNyBAQAogCU5GU1BST0M0X0NMTlRfREVMRUdSRVRVUk4sCiAJTkZTUFJPQzRfQ0xOVF9HRVRBQ0wsCiAJTkZTUFJPQzRfQ0xOVF9TRVRBQ0wsCisJTkZTUFJPQzRfQ0xOVF9GU19MT0NBVElPTlMsCiB9OwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmZzX2ZzLmggYi9pbmNsdWRlL2xpbnV4L25mc19mcy5oCmluZGV4IDdlMDc5ZjguLjBhMTc0MGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmZzX2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZnNfZnMuaApAQCAtOSw2ICs5LDI3IEBACiAjaWZuZGVmIF9MSU5VWF9ORlNfRlNfSAogI2RlZmluZSBfTElOVVhfTkZTX0ZTX0gKIAorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvcndzZW0uaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvZGVidWcuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvYXV0aC5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9jbG50Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnMyLmg+CisjaW5jbHVkZSA8bGludXgvbmZzMy5oPgorI2luY2x1ZGUgPGxpbnV4L25mczQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNfeGRyLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZnNfZnNfc2IuaD4KKworI2luY2x1ZGUgPGxpbnV4L3J3c2VtLmg+CisjaW5jbHVkZSA8bGludXgvbWVtcG9vbC5oPgogCiAvKgogICogRW5hYmxlIGRlYnVnZ2luZyBzdXBwb3J0IGZvciBuZnMgY2xpZW50LgpAQCAtNDEsMjcgKzYyLDkgQEAKICNkZWZpbmUgRkxVU0hfTE9XUFJJCQk4CS8qIGxvdyBwcmlvcml0eSBiYWNrZ3JvdW5kIGZsdXNoICovCiAjZGVmaW5lIEZMVVNIX0hJR0hQUkkJCTE2CS8qIGhpZ2ggcHJpb3JpdHkgbWVtb3J5IHJlY2xhaW0gZmx1c2ggKi8KICNkZWZpbmUgRkxVU0hfTk9DT01NSVQJCTMyCS8qIERvbid0IHNlbmQgdGhlIE5GU3YzL3Y0IENPTU1JVCAqLworI2RlZmluZSBGTFVTSF9JTlZBTElEQVRFCTY0CS8qIEludmFsaWRhdGUgdGhlIHBhZ2UgY2FjaGUgKi8KIAogI2lmZGVmIF9fS0VSTkVMX18KLSNpbmNsdWRlIDxsaW51eC9pbi5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgotI2luY2x1ZGUgPGxpbnV4L3J3c2VtLmg+Ci0jaW5jbHVkZSA8bGludXgvd2FpdC5oPgotCi0jaW5jbHVkZSA8bGludXgvbmZzX2ZzX3NiLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9zdW5ycGMvZGVidWcuaD4KLSNpbmNsdWRlIDxsaW51eC9zdW5ycGMvYXV0aC5oPgotI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9jbG50Lmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9uZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9uZnMyLmg+Ci0jaW5jbHVkZSA8bGludXgvbmZzMy5oPgotI2luY2x1ZGUgPGxpbnV4L25mczQuaD4KLSNpbmNsdWRlIDxsaW51eC9uZnNfeGRyLmg+Ci0jaW5jbHVkZSA8bGludXgvcndzZW0uaD4KLSNpbmNsdWRlIDxsaW51eC9tZW1wb29sLmg+CiAKIC8qCiAgKiBORlN2My92NCBBY2Nlc3MgbW9kZSBjYWNoZSBlbnRyeQpAQCAtMjMzLDggKzIzNiwxMiBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgbmZzX21hcmtfZm9yX3JldmFsaWRhdGUoc3RydWN0IGlub2RlICppbm9kZSkKIHsKKwlzdHJ1Y3QgbmZzX2lub2RlICpuZnNpID0gTkZTX0koaW5vZGUpOworCiAJc3Bpbl9sb2NrKCZpbm9kZS0+aV9sb2NrKTsKLQlORlNfSShpbm9kZSktPmNhY2hlX3ZhbGlkaXR5IHw9IE5GU19JTk9fSU5WQUxJRF9BVFRSIHwgTkZTX0lOT19JTlZBTElEX0FDQ0VTUzsKKwluZnNpLT5jYWNoZV92YWxpZGl0eSB8PSBORlNfSU5PX0lOVkFMSURfQVRUUnxORlNfSU5PX0lOVkFMSURfQUNDRVNTOworCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKQorCQluZnNpLT5jYWNoZV92YWxpZGl0eSB8PSBORlNfSU5PX1JFVkFMX1BBR0VDQUNIRXxORlNfSU5PX0lOVkFMSURfREFUQTsKIAlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CiB9CiAKQEAgLTI5Niw3ICszMDMsNyBAQAogZXh0ZXJuIGludCBuZnNfYXR0cmlidXRlX3RpbWVvdXQoc3RydWN0IGlub2RlICppbm9kZSk7CiBleHRlcm4gaW50IG5mc19yZXZhbGlkYXRlX2lub2RlKHN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIsIHN0cnVjdCBpbm9kZSAqaW5vZGUpOwogZXh0ZXJuIGludCBfX25mc19yZXZhbGlkYXRlX2lub2RlKHN0cnVjdCBuZnNfc2VydmVyICosIHN0cnVjdCBpbm9kZSAqKTsKLWV4dGVybiB2b2lkIG5mc19yZXZhbGlkYXRlX21hcHBpbmcoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcpOworZXh0ZXJuIGludCBuZnNfcmV2YWxpZGF0ZV9tYXBwaW5nKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nKTsKIGV4dGVybiBpbnQgbmZzX3NldGF0dHIoc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3QgaWF0dHIgKik7CiBleHRlcm4gdm9pZCBuZnNfc2V0YXR0cl91cGRhdGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGlhdHRyICphdHRyKTsKIGV4dGVybiB2b2lkIG5mc19iZWdpbl9hdHRyX3VwZGF0ZShzdHJ1Y3QgaW5vZGUgKik7CkBAIC0zMDYsNiArMzEzLDEwIEBACiBleHRlcm4gc3RydWN0IG5mc19vcGVuX2NvbnRleHQgKmdldF9uZnNfb3Blbl9jb250ZXh0KHN0cnVjdCBuZnNfb3Blbl9jb250ZXh0ICpjdHgpOwogZXh0ZXJuIHZvaWQgcHV0X25mc19vcGVuX2NvbnRleHQoc3RydWN0IG5mc19vcGVuX2NvbnRleHQgKmN0eCk7CiBleHRlcm4gc3RydWN0IG5mc19vcGVuX2NvbnRleHQgKm5mc19maW5kX29wZW5fY29udGV4dChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgcnBjX2NyZWQgKmNyZWQsIGludCBtb2RlKTsKK2V4dGVybiBzdHJ1Y3QgdmZzbW91bnQgKm5mc19kb19zdWJtb3VudChjb25zdCBzdHJ1Y3QgdmZzbW91bnQgKm1udF9wYXJlbnQsCisJCQkJCWNvbnN0IHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkJCQkJc3RydWN0IG5mc19maCAqZmgsCisJCQkJCXN0cnVjdCBuZnNfZmF0dHIgKmZhdHRyKTsKIAogLyogbGludXgvbmV0L2lwdjQvaXBjb25maWcuYzogdHJpbXMgaXAgYWRkciBvZmYgZnJvbnQgb2YgbmFtZSwgdG9vLiAqLwogZXh0ZXJuIHUzMiByb290X25mc19wYXJzZV9hZGRyKGNoYXIgKm5hbWUpOyAvKl9faW5pdCovCkBAIC0zOTIsNiArNDAzLDE1IEBACiAjZW5kaWYKIAogLyoKKyAqIGxpbnV4L2ZzL25mcy9uYW1lc3BhY2UuYworICovCitleHRlcm4gc3RydWN0IGxpc3RfaGVhZCBuZnNfYXV0b21vdW50X2xpc3Q7CitleHRlcm4gc3RydWN0IGlub2RlX29wZXJhdGlvbnMgbmZzX21vdW50cG9pbnRfaW5vZGVfb3BlcmF0aW9uczsKK2V4dGVybiBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBuZnNfcmVmZXJyYWxfaW5vZGVfb3BlcmF0aW9uczsKK2V4dGVybiBpbnQgbmZzX21vdW50cG9pbnRfZXhwaXJ5X3RpbWVvdXQ7CitleHRlcm4gdm9pZCBuZnNfcmVsZWFzZV9hdXRvbW91bnRfdGltZXIodm9pZCk7CisKKy8qCiAgKiBsaW51eC9mcy9uZnMvdW5saW5rLmMKICAqLwogZXh0ZXJuIGludCAgbmZzX2FzeW5jX3VubGluayhzdHJ1Y3QgZGVudHJ5ICopOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZnNfZnNfc2IuaCBiL2luY2x1ZGUvbGludXgvbmZzX2ZzX3NiLmgKaW5kZXggNjVkZWMyMS4uNmI0YTEzYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZnNfZnNfc2IuaAorKysgYi9pbmNsdWRlL2xpbnV4L25mc19mc19zYi5oCkBAIC0zNSw2ICszNSw3IEBACiAJY2hhciAqCQkJaG9zdG5hbWU7CS8qIHJlbW90ZSBob3N0bmFtZSAqLwogCXN0cnVjdCBuZnNfZmgJCWZoOwogCXN0cnVjdCBzb2NrYWRkcl9pbglhZGRyOworCXN0cnVjdCBuZnNfZnNpZAkJZnNpZDsKIAl1bnNpZ25lZCBsb25nCQltb3VudF90aW1lOwkvKiB3aGVuIHRoaXMgZnMgd2FzIG1vdW50ZWQgKi8KICNpZmRlZiBDT05GSUdfTkZTX1Y0CiAJLyogT3VyIG93biBJUCBhZGRyZXNzLCBhcyBhIG51bGwtdGVybWluYXRlZCBzdHJpbmcuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25mc19wYWdlLmggYi9pbmNsdWRlL2xpbnV4L25mc19wYWdlLmgKaW5kZXggNjZlMmVkNi4uMWY3YmQyOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZnNfcGFnZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbmZzX3BhZ2UuaApAQCAtMTMsNyArMTMsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgotI2luY2x1ZGUgPGxpbnV4L25mc19mc19zYi5oPgogI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9hdXRoLmg+CiAjaW5jbHVkZSA8bGludXgvbmZzX3hkci5oPgogCkBAIC02Myw4ICs2Miw4IEBACiAKIGV4dGVybiAgaW50IG5mc19zY2FuX2xvY2tfZGlydHkoc3RydWN0IG5mc19pbm9kZSAqbmZzaSwgc3RydWN0IGxpc3RfaGVhZCAqZHN0LAogCQkJCXVuc2lnbmVkIGxvbmcgaWR4X3N0YXJ0LCB1bnNpZ25lZCBpbnQgbnBhZ2VzKTsKLWV4dGVybglpbnQgbmZzX3NjYW5fbGlzdChzdHJ1Y3QgbGlzdF9oZWFkICosIHN0cnVjdCBsaXN0X2hlYWQgKiwKLQkJCSAgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgaW50KTsKK2V4dGVybglpbnQgbmZzX3NjYW5fbGlzdChzdHJ1Y3QgbmZzX2lub2RlICpuZnNpLCBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkLCBzdHJ1Y3QgbGlzdF9oZWFkICpkc3QsCisJCQkgIHVuc2lnbmVkIGxvbmcgaWR4X3N0YXJ0LCB1bnNpZ25lZCBpbnQgbnBhZ2VzKTsKIGV4dGVybglpbnQgbmZzX2NvYWxlc2NlX3JlcXVlc3RzKHN0cnVjdCBsaXN0X2hlYWQgKiwgc3RydWN0IGxpc3RfaGVhZCAqLAogCQkJCSAgdW5zaWduZWQgaW50KTsKIGV4dGVybiAgaW50IG5mc193YWl0X29uX3JlcXVlc3Qoc3RydWN0IG5mc19wYWdlICopOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZnNfeGRyLmggYi9pbmNsdWRlL2xpbnV4L25mc194ZHIuaAppbmRleCA3ZmFmYzRjLi43YzczMjBmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25mc194ZHIuaAorKysgYi9pbmNsdWRlL2xpbnV4L25mc194ZHIuaApAQCAtMTQsMTEgKzE0LDE5IEBACiAjZGVmaW5lIE5GU19ERUZfRklMRV9JT19TSVpFCSg0MDk2VSkKICNkZWZpbmUgTkZTX01JTl9GSUxFX0lPX1NJWkUJKDEwMjRVKQogCi1zdHJ1Y3QgbmZzNF9mc2lkIHsKLQlfX3U2NCBtYWpvcjsKLQlfX3U2NCBtaW5vcjsKK3N0cnVjdCBuZnNfZnNpZCB7CisJdWludDY0X3QJCW1ham9yOworCXVpbnQ2NF90CQltaW5vcjsKIH07CiAKKy8qCisgKiBIZWxwZXIgZm9yIGNoZWNraW5nIGVxdWFsaXR5IGJldHdlZW4gMiBmc2lkcy4KKyAqLworc3RhdGljIGlubGluZSBpbnQgbmZzX2ZzaWRfZXF1YWwoY29uc3Qgc3RydWN0IG5mc19mc2lkICphLCBjb25zdCBzdHJ1Y3QgbmZzX2ZzaWQgKmIpCit7CisJcmV0dXJuIGEtPm1ham9yID09IGItPm1ham9yICYmIGEtPm1pbm9yID09IGItPm1pbm9yOworfQorCiBzdHJ1Y3QgbmZzX2ZhdHRyIHsKIAl1bnNpZ25lZCBzaG9ydAkJdmFsaWQ7CQkvKiB3aGljaCBmaWVsZHMgYXJlIHZhbGlkICovCiAJX191NjQJCQlwcmVfc2l6ZTsJLyogcHJlX29wX2F0dHIuc2l6ZQkgICovCkBAIC00MCwxMCArNDgsNyBAQAogCQl9IG5mczM7CiAJfSBkdTsKIAlkZXZfdAkJCXJkZXY7Ci0JdW5pb24gewotCQlfX3U2NAkJbmZzMzsJCS8qIGFsc28gbmZzMiAqLwotCQlzdHJ1Y3QgbmZzNF9mc2lkIG5mczQ7Ci0JfSBmc2lkX3U7CisJc3RydWN0IG5mc19mc2lkCQlmc2lkOwogCV9fdTY0CQkJZmlsZWlkOwogCXN0cnVjdCB0aW1lc3BlYwkJYXRpbWU7CiAJc3RydWN0IHRpbWVzcGVjCQltdGltZTsKQEAgLTU3LDggKzYyLDggQEAKICNkZWZpbmUgTkZTX0FUVFJfV0NDCQkweDAwMDEJCS8qIHByZS1vcCBXQ0MgZGF0YSAgICAqLwogI2RlZmluZSBORlNfQVRUUl9GQVRUUgkJMHgwMDAyCQkvKiBwb3N0LW9wIGF0dHJpYnV0ZXMgKi8KICNkZWZpbmUgTkZTX0FUVFJfRkFUVFJfVjMJMHgwMDA0CQkvKiBORlN2MyBhdHRyaWJ1dGVzICovCi0jZGVmaW5lIE5GU19BVFRSX0ZBVFRSX1Y0CTB4MDAwOAotI2RlZmluZSBORlNfQVRUUl9QUkVfQ0hBTkdFCTB4MDAxMAorI2RlZmluZSBORlNfQVRUUl9GQVRUUl9WNAkweDAwMDgJCS8qIE5GU3Y0IGNoYW5nZSBhdHRyaWJ1dGUgKi8KKyNkZWZpbmUgTkZTX0FUVFJfRkFUVFJfVjRfUkVGRVJSQUwJMHgwMDEwCQkvKiBORlN2NCByZWZlcnJhbCAqLwogCiAvKgogICogSW5mbyBvbiB0aGUgZmlsZSBzeXN0ZW0KQEAgLTY3NSw2ICs2ODAsNDAgQEAKIAl1MzIJCQkJaGFzX3N5bWxpbmtzOwogfTsKIAorc3RydWN0IG5mczRfc3RyaW5nIHsKKwl1bnNpZ25lZCBpbnQgbGVuOworCWNoYXIgKmRhdGE7Cit9OworCisjZGVmaW5lIE5GUzRfUEFUSE5BTUVfTUFYQ09NUE9ORU5UUyA1MTIKK3N0cnVjdCBuZnM0X3BhdGhuYW1lIHsKKwl1bnNpZ25lZCBpbnQgbmNvbXBvbmVudHM7CisJc3RydWN0IG5mczRfc3RyaW5nIGNvbXBvbmVudHNbTkZTNF9QQVRITkFNRV9NQVhDT01QT05FTlRTXTsKK307CisKKyNkZWZpbmUgTkZTNF9GU19MT0NBVElPTl9NQVhTRVJWRVJTIDEwCitzdHJ1Y3QgbmZzNF9mc19sb2NhdGlvbiB7CisJdW5zaWduZWQgaW50IG5zZXJ2ZXJzOworCXN0cnVjdCBuZnM0X3N0cmluZyBzZXJ2ZXJzW05GUzRfRlNfTE9DQVRJT05fTUFYU0VSVkVSU107CisJc3RydWN0IG5mczRfcGF0aG5hbWUgcm9vdHBhdGg7Cit9OworCisjZGVmaW5lIE5GUzRfRlNfTE9DQVRJT05TX01BWEVOVFJJRVMgMTAKK3N0cnVjdCBuZnM0X2ZzX2xvY2F0aW9ucyB7CisJc3RydWN0IG5mc19mYXR0ciBmYXR0cjsKKwljb25zdCBzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyOworCXN0cnVjdCBuZnM0X3BhdGhuYW1lIGZzX3BhdGg7CisJaW50IG5sb2NhdGlvbnM7CisJc3RydWN0IG5mczRfZnNfbG9jYXRpb24gbG9jYXRpb25zW05GUzRfRlNfTE9DQVRJT05TX01BWEVOVFJJRVNdOworfTsKKworc3RydWN0IG5mczRfZnNfbG9jYXRpb25zX2FyZyB7CisJY29uc3Qgc3RydWN0IG5mc19maCAqZGlyX2ZoOworCWNvbnN0IHN0cnVjdCBxc3RyICpuYW1lOworCXN0cnVjdCBwYWdlICpwYWdlOworCWNvbnN0IHUzMiAqYml0bWFzazsKK307CisKICNlbmRpZiAvKiBDT05GSUdfTkZTX1Y0ICovCiAKIHN0cnVjdCBuZnNfcGFnZTsKQEAgLTY5NSw3ICs3MzQsNyBAQAogI2lmZGVmIENPTkZJR19ORlNfVjQKIAl1bnNpZ25lZCBsb25nCQl0aW1lc3RhbXA7CS8qIEZvciBsZWFzZSByZW5ld2FsICovCiAjZW5kaWYKLQlzdHJ1Y3QgcGFnZQkJKnBhZ2VfYXJyYXlbTkZTX1BBR0VWRUNfU0laRSArIDFdOworCXN0cnVjdCBwYWdlCQkqcGFnZV9hcnJheVtORlNfUEFHRVZFQ19TSVpFXTsKIH07CiAKIHN0cnVjdCBuZnNfd3JpdGVfZGF0YSB7CkBAIC03MTMsNyArNzUyLDcgQEAKICNpZmRlZiBDT05GSUdfTkZTX1Y0CiAJdW5zaWduZWQgbG9uZwkJdGltZXN0YW1wOwkvKiBGb3IgbGVhc2UgcmVuZXdhbCAqLwogI2VuZGlmCi0Jc3RydWN0IHBhZ2UJCSpwYWdlX2FycmF5W05GU19QQUdFVkVDX1NJWkUgKyAxXTsKKwlzdHJ1Y3QgcGFnZQkJKnBhZ2VfYXJyYXlbTkZTX1BBR0VWRUNfU0laRV07CiB9OwogCiBzdHJ1Y3QgbmZzX2FjY2Vzc19lbnRyeTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGFycG9ydC5oIGIvaW5jbHVkZS9saW51eC9wYXJwb3J0LmgKaW5kZXggZDQyNzM3ZS4uNWJmMzIxZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wYXJwb3J0LmgKKysrIGIvaW5jbHVkZS9saW51eC9wYXJwb3J0LmgKQEAgLTEyNyw2ICsxMjcsMTAgQEAKICAgICAgICB1bnNpZ25lZCBjaGFyIHN0YXR1c2RpcjsvKiBjaWFiLmRkcmIgJiA3ICovCiB9OwogCitzdHJ1Y3QgYXg4ODc5Nl9wYXJwb3J0X3N0YXRlIHsKKwl1bnNpZ25lZCBjaGFyIGNwcjsKK307CisKIHN0cnVjdCBpcDMyX3BhcnBvcnRfc3RhdGUgewogCXVuc2lnbmVkIGludCBkY3I7CiAJdW5zaWduZWQgaW50IGVjcjsKQEAgLTEzOCw2ICsxNDIsNyBAQAogCQkvKiBBUkMgaGFzIG5vIHN0YXRlLiAqLwogCQlzdHJ1Y3QgYXhfcGFycG9ydF9zdGF0ZSBheDsKIAkJc3RydWN0IGFtaWdhX3BhcnBvcnRfc3RhdGUgYW1pZ2E7CisJCXN0cnVjdCBheDg4Nzk2X3BhcnBvcnRfc3RhdGUgYXg4ODc5NjsKIAkJLyogQXRhcmkgaGFzIG5vdCBzdGF0ZS4gKi8KIAkJc3RydWN0IGlwMzJfcGFycG9ydF9zdGF0ZSBpcDMyOwogCQl2b2lkICptaXNjOyAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcG11LmggYi9pbmNsdWRlL2xpbnV4L3BtdS5oCmluZGV4IGVjY2U1OTEuLjJlZDgwN2QgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcG11LmgKKysrIGIvaW5jbHVkZS9saW51eC9wbXUuaApAQCAtMjMwLDQgKzIzMCw4IEBACiBleHRlcm4gc3RydWN0IHBtdV9iYXR0ZXJ5X2luZm8gcG11X2JhdHRlcmllc1tQTVVfTUFYX0JBVFRFUklFU107CiBleHRlcm4gdW5zaWduZWQgaW50IHBtdV9wb3dlcl9mbGFnczsKIAorLyogQmFja2xpZ2h0ICovCitleHRlcm4gaW50IGRpc2FibGVfa2VybmVsX2JhY2tsaWdodDsKK2V4dGVybiB2b2lkIHBtdV9iYWNrbGlnaHRfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUqKTsKKwogI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcHJvY19mcy5oIGIvaW5jbHVkZS9saW51eC9wcm9jX2ZzLmgKaW5kZXggNTgxMGQyOC4uMTdlNzU3OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wcm9jX2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9wcm9jX2ZzLmgKQEAgLTk5LDkgKzk5LDggQEAKIAogc3RydWN0IG1tX3N0cnVjdDsKIAordm9pZCBwcm9jX2ZsdXNoX3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKTsKIHN0cnVjdCBkZW50cnkgKnByb2NfcGlkX2xvb2t1cChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqIGRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqKTsKLXN0cnVjdCBkZW50cnkgKnByb2NfcGlkX3VuaGFzaChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApOwotdm9pZCBwcm9jX3BpZF9mbHVzaChzdHJ1Y3QgZGVudHJ5ICpwcm9jX2RlbnRyeSk7CiBpbnQgcHJvY19waWRfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqIGZpbHAsIHZvaWQgKiBkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGlyKTsKIHVuc2lnbmVkIGxvbmcgdGFza192c2l6ZShzdHJ1Y3QgbW1fc3RydWN0ICopOwogaW50IHRhc2tfc3RhdG0oc3RydWN0IG1tX3N0cnVjdCAqLCBpbnQgKiwgaW50ICosIGludCAqLCBpbnQgKik7CkBAIC0yMTEsOCArMjEwLDcgQEAKICNkZWZpbmUgcHJvY19uZXRfY3JlYXRlKG5hbWUsIG1vZGUsIGluZm8pCSh7ICh2b2lkKShtb2RlKSwgTlVMTDsgfSkKIHN0YXRpYyBpbmxpbmUgdm9pZCBwcm9jX25ldF9yZW1vdmUoY29uc3QgY2hhciAqbmFtZSkge30KIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgZGVudHJ5ICpwcm9jX3BpZF91bmhhc2goc3RydWN0IHRhc2tfc3RydWN0ICpwKSB7IHJldHVybiBOVUxMOyB9Ci1zdGF0aWMgaW5saW5lIHZvaWQgcHJvY19waWRfZmx1c2goc3RydWN0IGRlbnRyeSAqcHJvY19kZW50cnkpIHsgfQorc3RhdGljIGlubGluZSB2b2lkIHByb2NfZmx1c2hfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spIHsgfQogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqY3JlYXRlX3Byb2NfZW50cnkoY29uc3QgY2hhciAqbmFtZSwKIAltb2RlX3QgbW9kZSwgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwYXJlbnQpIHsgcmV0dXJuIE5VTEw7IH0KQEAgLTI0OCw4ICsyNDYsOCBAQAogI2VuZGlmCiAKIHN0cnVjdCBwcm9jX2lub2RlIHsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7Ci0JaW50IHR5cGU7CisJc3RydWN0IHBpZCAqcGlkOworCWludCBmZDsKIAl1bmlvbiB7CiAJCWludCAoKnByb2NfZ2V0X2xpbmspKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZGVudHJ5ICoqLCBzdHJ1Y3QgdmZzbW91bnQgKiopOwogCQlpbnQgKCpwcm9jX3JlYWQpKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgY2hhciAqcGFnZSk7CkBAIC0yNjgsNCArMjY2LDEwIEBACiAJcmV0dXJuIFBST0NfSShpbm9kZSktPnBkZTsKIH0KIAorc3RydWN0IHByb2NfbWFwc19wcml2YXRlIHsKKwlzdHJ1Y3QgcGlkICpwaWQ7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrOworCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdGFpbF92bWE7Cit9OworCiAjZW5kaWYgLyogX0xJTlVYX1BST0NfRlNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wdHJhY2UuaCBiL2luY2x1ZGUvbGludXgvcHRyYWNlLmgKaW5kZXggZWU5MThiYy4uOGIyNzQ5YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wdHJhY2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L3B0cmFjZS5oCkBAIC04OCw3ICs4OCw2IEBACiBleHRlcm4gaW50IHB0cmFjZV93cml0ZWRhdGEoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIGNoYXIgX191c2VyICpzcmMsIHVuc2lnbmVkIGxvbmcgZHN0LCBpbnQgbGVuKTsKIGV4dGVybiBpbnQgcHRyYWNlX2F0dGFjaChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayk7CiBleHRlcm4gaW50IHB0cmFjZV9kZXRhY2goc3RydWN0IHRhc2tfc3RydWN0ICosIHVuc2lnbmVkIGludCk7Ci1leHRlcm4gdm9pZCBfX3B0cmFjZV9kZXRhY2goc3RydWN0IHRhc2tfc3RydWN0ICosIHVuc2lnbmVkIGludCk7CiBleHRlcm4gdm9pZCBwdHJhY2VfZGlzYWJsZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKik7CiBleHRlcm4gaW50IHB0cmFjZV9jaGVja19hdHRhY2goc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBpbnQga2lsbCk7CiBleHRlcm4gaW50IHB0cmFjZV9yZXF1ZXN0KHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsIGxvbmcgcmVxdWVzdCwgbG9uZyBhZGRyLCBsb25nIGRhdGEpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yYWlkL2JpdG1hcC5oIGIvaW5jbHVkZS9saW51eC9yYWlkL2JpdG1hcC5oCmluZGV4IDg5OTQzNzguLjYzZGY4OTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmFpZC9iaXRtYXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L3JhaWQvYml0bWFwLmgKQEAgLTE0MCw2ICsxNDAsNyBAQAogZW51bSBiaXRtYXBfc3RhdGUgewogCUJJVE1BUF9BQ1RJVkUgPSAweDAwMSwgLyogdGhlIGJpdG1hcCBpcyBpbiB1c2UgKi8KIAlCSVRNQVBfU1RBTEUgID0gMHgwMDIsICAvKiB0aGUgYml0bWFwIGZpbGUgaXMgb3V0IG9mIGRhdGUgb3IgaGFkIC1FSU8gKi8KKwlCSVRNQVBfV1JJVEVfRVJST1IgPSAweDAwNCwgLyogQSB3cml0ZSBlcnJvciBoYXMgb2NjdXJyZWQgKi8KIAlCSVRNQVBfSE9TVEVORElBTiA9IDB4ODAwMCwKIH07CiAKQEAgLTI0NCwxNSArMjQ1LDkgQEAKIAl1bnNpZ25lZCBsb25nIGRhZW1vbl9sYXN0cnVuOyAvKiBqaWZmaWVzIG9mIGxhc3QgcnVuICovCiAJdW5zaWduZWQgbG9uZyBkYWVtb25fc2xlZXA7IC8qIGhvdyBtYW55IHNlY29uZHMgYmV0d2VlbiB1cGRhdGVzPyAqLwogCi0JLyoKLQkgKiBiaXRtYXBfd3JpdGViYWNrX2RhZW1vbiB3YWl0cyBmb3IgZmlsZS1wYWdlcyB0aGF0IGhhdmUgYmVlbiB3cml0dGVuLAotCSAqIGFzIHRoZXJlIGlzIG5vIHdheSB0byBnZXQgYSBjYWxsLWJhY2sgd2hlbiBhIHBhZ2Ugd3JpdGUgY29tcGxldGVzLgotCSAqLwotCW1ka190aHJlYWRfdCAqd3JpdGViYWNrX2RhZW1vbjsKLQlzcGlubG9ja190IHdyaXRlX2xvY2s7CisJYXRvbWljX3QgcGVuZGluZ193cml0ZXM7IC8qIHBlbmRpbmcgd3JpdGVzIHRvIHRoZSBiaXRtYXAgZmlsZSAqLwogCXdhaXRfcXVldWVfaGVhZF90IHdyaXRlX3dhaXQ7Ci0Jc3RydWN0IGxpc3RfaGVhZCBjb21wbGV0ZV9wYWdlczsKLQltZW1wb29sX3QgKndyaXRlX3Bvb2w7CisKIH07CiAKIC8qIHRoZSBiaXRtYXAgQVBJICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JhaWQvbGluZWFyLmggYi9pbmNsdWRlL2xpbnV4L3JhaWQvbGluZWFyLmgKaW5kZXggN2VhZjI5MC4uYmExNTQ2OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yYWlkL2xpbmVhci5oCisrKyBiL2luY2x1ZGUvbGludXgvcmFpZC9saW5lYXIuaApAQCAtMTMsOCArMTMsMTAgQEAKIAogc3RydWN0IGxpbmVhcl9wcml2YXRlX2RhdGEKIHsKKwlzdHJ1Y3QgbGluZWFyX3ByaXZhdGVfZGF0YSAqcHJldjsJLyogZWFybGllciB2ZXJzaW9uICovCiAJZGV2X2luZm9fdAkJKipoYXNoX3RhYmxlOwogCXNlY3Rvcl90CQloYXNoX3NwYWNpbmc7CisJc2VjdG9yX3QJCWFycmF5X3NpemU7CiAJaW50CQkJcHJlc2hpZnQ7IC8qIHNoaWZ0IGJlZm9yZSBkaXZpZGluZyBieSBoYXNoX3NwYWNpbmcgKi8KIAlkZXZfaW5mb190CQlkaXNrc1swXTsKIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JhaWQvbWQuaCBiL2luY2x1ZGUvbGludXgvcmFpZC9tZC5oCmluZGV4IDY2YjQ0ZTUuLmViM2U1NDcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmFpZC9tZC5oCisrKyBiL2luY2x1ZGUvbGludXgvcmFpZC9tZC5oCkBAIC04NSw4ICs4NSw2IEBACiBleHRlcm4gdm9pZCBtZF9lcnJvciAobWRkZXZfdCAqbWRkZXYsIG1ka19yZGV2X3QgKnJkZXYpOwogZXh0ZXJuIHZvaWQgbWRfdW5wbHVnX21kZGV2KG1kZGV2X3QgKm1kZGV2KTsKIAotZXh0ZXJuIHZvaWQgbWRfcHJpbnRfZGV2aWNlcyAodm9pZCk7Ci0KIGV4dGVybiB2b2lkIG1kX3N1cGVyX3dyaXRlKG1kZGV2X3QgKm1kZGV2LCBtZGtfcmRldl90ICpyZGV2LAogCQkJICAgc2VjdG9yX3Qgc2VjdG9yLCBpbnQgc2l6ZSwgc3RydWN0IHBhZ2UgKnBhZ2UpOwogZXh0ZXJuIHZvaWQgbWRfc3VwZXJfd2FpdChtZGRldl90ICptZGRldik7CkBAIC05Nyw3ICs5NSw1IEBACiAKIGV4dGVybiB2b2lkIG1kX3VwZGF0ZV9zYihtZGRldl90ICogbWRkZXYpOwogCi0jZGVmaW5lIE1EX0JVRyh4Li4uKSB7IHByaW50aygibWQ6IGJ1ZyBpbiBmaWxlICVzLCBsaW5lICVkXG4iLCBfX0ZJTEVfXywgX19MSU5FX18pOyBtZF9wcmludF9kZXZpY2VzKCk7IH0KLQogI2VuZGlmIAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JhaWQvbWRfay5oIGIvaW5jbHVkZS9saW51eC9yYWlkL21kX2suaAppbmRleCBlMmRmNjFmLi5jMWUwYWM1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JhaWQvbWRfay5oCisrKyBiL2luY2x1ZGUvbGludXgvcmFpZC9tZF9rLmgKQEAgLTQwLDcgKzQwLDggQEAKICAqIG9wdGlvbnMgcGFzc2VkIGluIHJhaWRydW46CiAgKi8KIAotI2RlZmluZSBNQVhfQ0hVTktfU0laRSAoNDA5NioxMDI0KQorLyogQ3VycmVudGx5IHRoaXMgbXVzdCBmaXggaW4gYW4gJ2ludCcgKi8KKyNkZWZpbmUgTUFYX0NIVU5LX1NJWkUgKDE8PDMwKQogCiAvKgogICogTUQncyAnZXh0ZW5kZWQnIGRldmljZQpAQCAtNTcsNiArNTgsNyBAQAogCiAJc3RydWN0IHBhZ2UJKnNiX3BhZ2U7CiAJaW50CQlzYl9sb2FkZWQ7CisJX191NjQJCXNiX2V2ZW50czsKIAlzZWN0b3JfdAlkYXRhX29mZnNldDsJLyogc3RhcnQgb2YgZGF0YSBpbiBhcnJheSAqLwogCXNlY3Rvcl90CXNiX29mZnNldDsKIAlpbnQJCXNiX3NpemU7CS8qIGJ5dGVzIGluIHRoZSBzdXBlcmJsb2NrICovCkBAIC04Nyw2ICs4OSwxMCBAQAogCQkJCQkgKiBhcnJheSBhbmQgY291bGQgYWdhaW4gaWYgd2UgZGlkIGEgcGFydGlhbAogCQkJCQkgKiByZXN5bmMgZnJvbSB0aGUgYml0bWFwCiAJCQkJCSAqLworCXNlY3Rvcl90CXJlY292ZXJ5X29mZnNldDsvKiBJZiB0aGlzIGRldmljZSBoYXMgYmVlbiBwYXJ0aWFsbHkKKwkJCQkJICogcmVjb3ZlcmVkLCB0aGlzIGlzIHdoZXJlIHdlIHdlcmUKKwkJCQkJICogdXAgdG8uCisJCQkJCSAqLwogCiAJYXRvbWljX3QJbnJfcGVuZGluZzsJLyogbnVtYmVyIG9mIHBlbmRpbmcgcmVxdWVzdHMuCiAJCQkJCSAqIG9ubHkgbWFpbnRhaW5lZCBmb3IgYXJyYXlzIHRoYXQKQEAgLTE4Miw2ICsxODgsOCBAQAogI2RlZmluZQlNRF9SRUNPVkVSWV9SRVFVRVNURUQJNgogI2RlZmluZQlNRF9SRUNPVkVSWV9DSEVDSwk3CiAjZGVmaW5lIE1EX1JFQ09WRVJZX1JFU0hBUEUJOAorI2RlZmluZQlNRF9SRUNPVkVSWV9GUk9aRU4JOQorCiAJdW5zaWduZWQgbG9uZwkJCXJlY292ZXJ5OwogCiAJaW50CQkJCWluX3N5bmM7CS8qIGtub3cgdG8gbm90IG5lZWQgcmVzeW5jICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JhaWQvbWRfcC5oIGIvaW5jbHVkZS9saW51eC9yYWlkL21kX3AuaAppbmRleCBmMWZiYWU3Li5iNmViYzY5YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yYWlkL21kX3AuaAorKysgYi9pbmNsdWRlL2xpbnV4L3JhaWQvbWRfcC5oCkBAIC0yNjUsOSArMjY1LDEyIEBACiAKIC8qIGZlYXR1cmVfbWFwIGJpdHMgKi8KICNkZWZpbmUgTURfRkVBVFVSRV9CSVRNQVBfT0ZGU0VUCTEKKyNkZWZpbmUJTURfRkVBVFVSRV9SRUNPVkVSWV9PRkZTRVQJMiAvKiByZWNvdmVyeV9vZmZzZXQgaXMgcHJlc2VudCBhbmQKKwkJCQkJICAgKiBtdXN0IGJlIGhvbm91cmVkCisJCQkJCSAgICovCiAjZGVmaW5lCU1EX0ZFQVRVUkVfUkVTSEFQRV9BQ1RJVkUJNAogCi0jZGVmaW5lCU1EX0ZFQVRVUkVfQUxMCQkJNQorI2RlZmluZQlNRF9GRUFUVVJFX0FMTAkJCSgxfDJ8NCkKIAogI2VuZGlmIAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JhaWQvcmFpZDEwLmggYi9pbmNsdWRlL2xpbnV4L3JhaWQvcmFpZDEwLmgKaW5kZXggYjExMDMyOS4uYzQxZTU2YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yYWlkL3JhaWQxMC5oCisrKyBiL2luY2x1ZGUvbGludXgvcmFpZC9yYWlkMTAuaApAQCAtMjQsMTEgKzI0LDE2IEBACiAJaW50IAkJCWZhcl9jb3BpZXM7ICAgLyogbnVtYmVyIG9mIGNvcGllcyBsYXllZCBvdXQKIAkJCQkJICAgICAgICogYXQgbGFyZ2Ugc3RyaWRlcyBhY3Jvc3MgZHJpdmVzCiAJCQkJCSAgICAgICAqLworCWludAkJCWZhcl9vZmZzZXQ7ICAgLyogZmFyX2NvcGllcyBhcmUgb2Zmc2V0IGJ5IDEgc3RyaXBlCisJCQkJCSAgICAgICAqIGluc3RlYWQgb2YgbWFueQorCQkJCQkgICAgICAgKi8KIAlpbnQJCQljb3BpZXM7CSAgICAgIC8qIG5lYXJfY29waWVzICogZmFyX2NvcGllcy4KIAkJCQkJICAgICAgICogbXVzdCBiZSA8PSByYWlkX2Rpc2tzCiAJCQkJCSAgICAgICAqLwogCXNlY3Rvcl90CQlzdHJpZGU7CSAgICAgIC8qIGRpc3RhbmNlIGJldHdlZW4gZmFyIGNvcGllcy4KLQkJCQkJICAgICAgICogVGhpcyBpcyBzaXplIC8gZmFyX2NvcGllcworCQkJCQkgICAgICAgKiBUaGlzIGlzIHNpemUgLyBmYXJfY29waWVzIHVubGVzcworCQkJCQkgICAgICAgKiBmYXJfb2Zmc2V0LCBpbiB3aGljaCBjYXNlIGl0IGlzCisJCQkJCSAgICAgICAqIDEgc3RyaXBlLgogCQkJCQkgICAgICAgKi8KIAogCWludCBjaHVua19zaGlmdDsgLyogc2hpZnQgZnJvbSBjaHVua3MgdG8gc2VjdG9ycyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yYWlkL3JhaWQ1LmggYi9pbmNsdWRlL2xpbnV4L3JhaWQvcmFpZDUuaAppbmRleCA5MTRhZjY2Li4yMGVkNGM5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JhaWQvcmFpZDUuaAorKysgYi9pbmNsdWRlL2xpbnV4L3JhaWQvcmFpZDUuaApAQCAtMjEyLDYgKzIxMiw3IEBACiAJbWRkZXZfdAkJCSptZGRldjsKIAlzdHJ1Y3QgZGlza19pbmZvCSpzcGFyZTsKIAlpbnQJCQljaHVua19zaXplLCBsZXZlbCwgYWxnb3JpdGhtOworCWludAkJCW1heF9kZWdyYWRlZDsKIAlpbnQJCQlyYWlkX2Rpc2tzLCB3b3JraW5nX2Rpc2tzLCBmYWlsZWRfZGlza3M7CiAJaW50CQkJbWF4X25yX3N0cmlwZXM7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmVib290LmggYi9pbmNsdWRlL2xpbnV4L3JlYm9vdC5oCmluZGV4IDAxNTI5N2YuLjFkZDFjNzAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmVib290LmgKKysrIGIvaW5jbHVkZS9saW51eC9yZWJvb3QuaApAQCAtNTksMTMgKzU5LDEzIEBACiAgKiBBcmNoaXRlY3R1cmUgaW5kZXBlbmRlbnQgaW1wbGVtZW5hdGlvbnMgb2Ygc3lzX3JlYm9vdCBjb21tYW5kcy4KICAqLwogCi1leHRlcm4gdm9pZCBrZXJuZWxfcmVzdGFydF9wcmVwYXJlKGNoYXIgKmNtZCk7CiBleHRlcm4gdm9pZCBrZXJuZWxfc2h1dGRvd25fcHJlcGFyZShlbnVtIHN5c3RlbV9zdGF0ZXMgc3RhdGUpOwogCiBleHRlcm4gdm9pZCBrZXJuZWxfcmVzdGFydChjaGFyICpjbWQpOwogZXh0ZXJuIHZvaWQga2VybmVsX2hhbHQodm9pZCk7CiBleHRlcm4gdm9pZCBrZXJuZWxfcG93ZXJfb2ZmKHZvaWQpOwotZXh0ZXJuIHZvaWQga2VybmVsX2tleGVjKHZvaWQpOworCit2b2lkIGN0cmxfYWx0X2RlbCh2b2lkKTsKIAogLyoKICAqIEVtZXJnZW5jeSByZXN0YXJ0LCBjYWxsYWJsZSBmcm9tIGFuIGludGVycnVwdCBoYW5kbGVyLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yZXNvdXJjZS5oIGIvaW5jbHVkZS9saW51eC9yZXNvdXJjZS5oCmluZGV4IDIxYTg2Y2IuLmFlMTNkYjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmVzb3VyY2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L3Jlc291cmNlLmgKQEAgLTMsNiArMyw4IEBACiAKICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CiAKK3N0cnVjdCB0YXNrX3N0cnVjdDsKKwogLyoKICAqIFJlc291cmNlIGNvbnRyb2wvYWNjb3VudGluZyBoZWFkZXIgZmlsZSBmb3IgbGludXgKICAqLwpAQCAtNjcsNCArNjksNiBAQAogICovCiAjaW5jbHVkZSA8YXNtL3Jlc291cmNlLmg+CiAKK2ludCBnZXRydXNhZ2Uoc3RydWN0IHRhc2tfc3RydWN0ICpwLCBpbnQgd2hvLCBzdHJ1Y3QgcnVzYWdlIF9fdXNlciAqcnUpOworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcnRjLXYzMDIwLmggYi9pbmNsdWRlL2xpbnV4L3J0Yy12MzAyMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNzRlNjMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3J0Yy12MzAyMC5oCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiB2MzAyMC5oIC0gUmVnaXN0ZXJzIGRlZmluaXRpb24gYW5kIHBsYXRmb3JtIGRhdGEgc3RydWN0dXJlIGZvciB0aGUgdjMwMjAgUlRDLgorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiwgOEQgVGVjaG5vbG9naWVzIGluYy4KKyAqLworI2lmbmRlZiBfX0xJTlVYX1YzMDIwX0gKKyNkZWZpbmUgX19MSU5VWF9WMzAyMF9ICisKKy8qIFRoZSB2MzAyMCBoYXMgb25seSBvbmUgZGF0YSBwaW4gYnV0IHdoaWNoIG9uZQorICogaXMgdXNlZCBkZXBlbmRzIG9uIHRoZSBib2FyZC4gKi8KK3N0cnVjdCB2MzAyMF9wbGF0Zm9ybV9kYXRhIHsKKwlpbnQgbGVmdHNoaWZ0OyAvKiAoMTw8KGxlZnRzaGlmdCkpICYgcmVhZGwoKSAqLworfTsKKworI2RlZmluZSBWMzAyMF9TVEFUVVNfMAkweDAwCisjZGVmaW5lIFYzMDIwX1NUQVRVU18xCTB4MDEKKyNkZWZpbmUgVjMwMjBfU0VDT05EUwkweDAyCisjZGVmaW5lIFYzMDIwX01JTlVURVMJMHgwMworI2RlZmluZSBWMzAyMF9IT1VSUwkJMHgwNAorI2RlZmluZSBWMzAyMF9NT05USF9EQVkJMHgwNQorI2RlZmluZSBWMzAyMF9NT05USAkJMHgwNgorI2RlZmluZSBWMzAyMF9ZRUFSCQkweDA3CisjZGVmaW5lIFYzMDIwX1dFRUtfREFZCTB4MDgKKyNkZWZpbmUgVjMwMjBfV0VFSwkJMHgwOQorCisjZGVmaW5lIFYzMDIwX0lTX0NPTU1BTkQodmFsKSAoKHZhbCk+PTB4MEUpCisKKyNkZWZpbmUgVjMwMjBfQ01EX1JBTTJDTE9DSwkweDBFCisjZGVmaW5lIFYzMDIwX0NNRF9DTE9DSzJSQU0JMHgwRgorCisjZW5kaWYgLyogX19MSU5VWF9WMzAyMF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3J0Yy5oIGIvaW5jbHVkZS9saW51eC9ydGMuaAppbmRleCBhYjYxY2QxMS4uMzZlMmJmNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ydGMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3J0Yy5oCkBAIC0xMDIsNiArMTAyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KIAogZXh0ZXJuIGludCBydGNfbW9udGhfZGF5cyh1bnNpZ25lZCBpbnQgbW9udGgsIHVuc2lnbmVkIGludCB5ZWFyKTsKK2V4dGVybiBpbnQgcnRjX3llYXJfZGF5cyh1bnNpZ25lZCBpbnQgZGF5LCB1bnNpZ25lZCBpbnQgbW9udGgsIHVuc2lnbmVkIGludCB5ZWFyKTsKIGV4dGVybiBpbnQgcnRjX3ZhbGlkX3RtKHN0cnVjdCBydGNfdGltZSAqdG0pOwogZXh0ZXJuIGludCBydGNfdG1fdG9fdGltZShzdHJ1Y3QgcnRjX3RpbWUgKnRtLCB1bnNpZ25lZCBsb25nICp0aW1lKTsKIGV4dGVybiB2b2lkIHJ0Y190aW1lX3RvX3RtKHVuc2lnbmVkIGxvbmcgdGltZSwgc3RydWN0IHJ0Y190aW1lICp0bSk7CkBAIC0xNTUsNiArMTU2LDE3IEBACiAJc3RydWN0IHJ0Y190YXNrICppcnFfdGFzazsKIAlzcGlubG9ja190IGlycV90YXNrX2xvY2s7CiAJaW50IGlycV9mcmVxOworCWludCBtYXhfdXNlcl9mcmVxOworI2lmZGVmIENPTkZJR19SVENfSU5URl9ERVZfVUlFX0VNVUwKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgdWllX3Rhc2s7CisJc3RydWN0IHRpbWVyX2xpc3QgdWllX3RpbWVyOworCS8qIFRob3NlIGZpZWxkcyBhcmUgcHJvdGVjdGVkIGJ5IHJ0Yy0+aXJxX2xvY2sgKi8KKwl1bnNpZ25lZCBpbnQgb2xkc2VjczsKKwl1bnNpZ25lZCBpbnQgaXJxX2FjdGl2ZToxOworCXVuc2lnbmVkIGludCBzdG9wX3VpZV9wb2xsaW5nOjE7CisJdW5zaWduZWQgaW50IHVpZV90YXNrX2FjdGl2ZToxOworCXVuc2lnbmVkIGludCB1aWVfdGltZXJfYWN0aXZlOjE7CisjZW5kaWYKIH07CiAjZGVmaW5lIHRvX3J0Y19kZXZpY2UoZCkgY29udGFpbmVyX29mKGQsIHN0cnVjdCBydGNfZGV2aWNlLCBjbGFzc19kZXYpCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2NoZWQuaCBiL2luY2x1ZGUvbGludXgvc2NoZWQuaAppbmRleCAzOGI0NzkxZS4uMTIyYTI1YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zY2hlZC5oCisrKyBiL2luY2x1ZGUvbGludXgvc2NoZWQuaApAQCAtMzU4LDYgKzM1OCwxNCBAQAogCXNwaW5sb2NrX3QJCXNpZ2xvY2s7CiB9OwogCitzdHJ1Y3QgcGFjY3Rfc3RydWN0IHsKKwlpbnQJCQlhY19mbGFnOworCWxvbmcJCQlhY19leGl0Y29kZTsKKwl1bnNpZ25lZCBsb25nCQlhY19tZW07CisJY3B1dGltZV90CQlhY191dGltZSwgYWNfc3RpbWU7CisJdW5zaWduZWQgbG9uZwkJYWNfbWluZmx0LCBhY19tYWpmbHQ7Cit9OworCiAvKgogICogTk9URSEgInNpZ25hbF9zdHJ1Y3QiIGRvZXMgbm90IGhhdmUgaXQncyBvd24KICAqIGxvY2tpbmcsIGJlY2F1c2UgYSBzaGFyZWQgc2lnbmFsX3N0cnVjdCBhbHdheXMKQEAgLTQ0OSw2ICs0NTcsOSBAQAogCXN0cnVjdCBrZXkgKnNlc3Npb25fa2V5cmluZzsJLyoga2V5cmluZyBpbmhlcml0ZWQgb3ZlciBmb3JrICovCiAJc3RydWN0IGtleSAqcHJvY2Vzc19rZXlyaW5nOwkvKiBrZXlyaW5nIHByaXZhdGUgdG8gdGhpcyBwcm9jZXNzICovCiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfQlNEX1BST0NFU1NfQUNDVAorCXN0cnVjdCBwYWNjdF9zdHJ1Y3QgcGFjY3Q7CS8qIHBlci1wcm9jZXNzIGFjY291bnRpbmcgaW5mb3JtYXRpb24gKi8KKyNlbmRpZgogfTsKIAogLyogQ29udGV4dCBzd2l0Y2ggbXVzdCBiZSB1bmxvY2tlZCBpZiBpbnRlcnJ1cHRzIGFyZSB0byBiZSBlbmFibGVkICovCkBAIC04MzEsOCArODQyLDYgQEAKICAgIAl1MzIgc2VsZl9leGVjX2lkOwogLyogUHJvdGVjdGlvbiBvZiAoZGUtKWFsbG9jYXRpb246IG1tLCBmaWxlcywgZnMsIHR0eSwga2V5cmluZ3MgKi8KIAlzcGlubG9ja190IGFsbG9jX2xvY2s7Ci0vKiBQcm90ZWN0aW9uIG9mIHByb2NfZGVudHJ5OiBuZXN0aW5nIHByb2NfbG9jaywgZGNhY2hlX2xvY2ssIHdyaXRlX2xvY2tfaXJxKCZ0YXNrbGlzdF9sb2NrKTsgKi8KLQlzcGlubG9ja190IHByb2NfbG9jazsKIAogI2lmZGVmIENPTkZJR19ERUJVR19NVVRFWEVTCiAJLyogbXV0ZXggZGVhZGxvY2sgZGV0ZWN0aW9uICovCkBAIC04NDUsNyArODU0LDYgQEAKIC8qIFZNIHN0YXRlICovCiAJc3RydWN0IHJlY2xhaW1fc3RhdGUgKnJlY2xhaW1fc3RhdGU7CiAKLQlzdHJ1Y3QgZGVudHJ5ICpwcm9jX2RlbnRyeTsKIAlzdHJ1Y3QgYmFja2luZ19kZXZfaW5mbyAqYmFja2luZ19kZXZfaW5mbzsKIAogCXN0cnVjdCBpb19jb250ZXh0ICppb19jb250ZXh0OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zZWN1cml0eS5oIGIvaW5jbHVkZS9saW51eC9zZWN1cml0eS5oCmluZGV4IGQyYzE3YmQuLjUxODA1ODAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2VjdXJpdHkuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NlY3VyaXR5LmgKQEAgLTg2Miw2ICs4NjIsNyBAQAogICoJUGVybWl0IGFsbG9jYXRpb24gb2YgYSBrZXkgYW5kIGFzc2lnbiBzZWN1cml0eSBkYXRhLiBOb3RlIHRoYXQga2V5IGRvZXMKICAqCW5vdCBoYXZlIGEgc2VyaWFsIG51bWJlciBhc3NpZ25lZCBhdCB0aGlzIHBvaW50LgogICoJQGtleSBwb2ludHMgdG8gdGhlIGtleS4KKyAqCUBmbGFncyBpcyB0aGUgYWxsb2NhdGlvbiBmbGFncwogICoJUmV0dXJuIDAgaWYgcGVybWlzc2lvbiBpcyBncmFudGVkLCAtdmUgZXJyb3Igb3RoZXJ3aXNlLgogICogQGtleV9mcmVlOgogICoJTm90aWZpY2F0aW9uIG9mIGRlc3RydWN0aW9uOyBmcmVlIHNlY3VyaXR5IGRhdGEuCkBAIC0xMzI0LDcgKzEzMjUsNyBAQAogCiAJLyoga2V5IG1hbmFnZW1lbnQgc2VjdXJpdHkgaG9va3MgKi8KICNpZmRlZiBDT05GSUdfS0VZUwotCWludCAoKmtleV9hbGxvYykoc3RydWN0IGtleSAqa2V5LCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayk7CisJaW50ICgqa2V5X2FsbG9jKShzdHJ1Y3Qga2V5ICprZXksIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKIAl2b2lkICgqa2V5X2ZyZWUpKHN0cnVjdCBrZXkgKmtleSk7CiAJaW50ICgqa2V5X3Blcm1pc3Npb24pKGtleV9yZWZfdCBrZXlfcmVmLAogCQkJICAgICAgc3RydWN0IHRhc2tfc3RydWN0ICpjb250ZXh0LApAQCAtMzA0MCw5ICszMDQxLDEwIEBACiAjaWZkZWYgQ09ORklHX0tFWVMKICNpZmRlZiBDT05GSUdfU0VDVVJJVFkKIHN0YXRpYyBpbmxpbmUgaW50IHNlY3VyaXR5X2tleV9hbGxvYyhzdHJ1Y3Qga2V5ICprZXksCi0JCQkJICAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKKwkJCQkgICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLAorCQkJCSAgICAgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKLQlyZXR1cm4gc2VjdXJpdHlfb3BzLT5rZXlfYWxsb2Moa2V5LCB0c2spOworCXJldHVybiBzZWN1cml0eV9vcHMtPmtleV9hbGxvYyhrZXksIHRzaywgZmxhZ3MpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgc2VjdXJpdHlfa2V5X2ZyZWUoc3RydWN0IGtleSAqa2V5KQpAQCAtMzA2MCw3ICszMDYyLDggQEAKICNlbHNlCiAKIHN0YXRpYyBpbmxpbmUgaW50IHNlY3VyaXR5X2tleV9hbGxvYyhzdHJ1Y3Qga2V5ICprZXksCi0JCQkJICAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKKwkJCQkgICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLAorCQkJCSAgICAgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3VucnBjL2dzc19hcGkuaCBiL2luY2x1ZGUvbGludXgvc3VucnBjL2dzc19hcGkuaAppbmRleCA5YjhiY2YxLi42ZTExMmNjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N1bnJwYy9nc3NfYXBpLmgKKysrIGIvaW5jbHVkZS9saW51eC9zdW5ycGMvZ3NzX2FwaS5oCkBAIC0xMjYsNyArMTI2LDcgQEAKIC8qIEp1c3QgaW5jcmVtZW50cyB0aGUgbWVjaGFuaXNtJ3MgcmVmZXJlbmNlIGNvdW50IGFuZCByZXR1cm5zIGl0cyBpbnB1dDogKi8KIHN0cnVjdCBnc3NfYXBpX21lY2ggKiBnc3NfbWVjaF9nZXQoc3RydWN0IGdzc19hcGlfbWVjaCAqKTsKIAotLyogRm9yIGV2ZXJ5IHN1Y2Nlc2Z1bCBnc3NfbWVjaF9nZXQgb3IgZ3NzX21lY2hfZ2V0X2J5XyogY2FsbCB0aGVyZSBtdXN0IGJlIGEKKy8qIEZvciBldmVyeSBzdWNjZXNzZnVsIGdzc19tZWNoX2dldCBvciBnc3NfbWVjaF9nZXRfYnlfKiBjYWxsIHRoZXJlIG11c3QgYmUgYQogICogY29ycmVzcG9uZGluZyBjYWxsIHRvIGdzc19tZWNoX3B1dC4gKi8KIHZvaWQgZ3NzX21lY2hfcHV0KHN0cnVjdCBnc3NfYXBpX21lY2ggKik7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3VucnBjL3hkci5oIGIvaW5jbHVkZS9saW51eC9zdW5ycGMveGRyLmgKaW5kZXggODRjMzVkNC4uZTZkM2QzNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zdW5ycGMveGRyLmgKKysrIGIvaW5jbHVkZS9saW51eC9zdW5ycGMveGRyLmgKQEAgLTE5NCw2ICsxOTQsNyBAQAogZXh0ZXJuIHZvaWQgeGRyX2luaXRfZGVjb2RlKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCB4ZHJfYnVmICpidWYsIHVpbnQzMl90ICpwKTsKIGV4dGVybiB1aW50MzJfdCAqeGRyX2lubGluZV9kZWNvZGUoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc2l6ZV90IG5ieXRlcyk7CiBleHRlcm4gdm9pZCB4ZHJfcmVhZF9wYWdlcyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1bnNpZ25lZCBpbnQgbGVuKTsKK2V4dGVybiB2b2lkIHhkcl9lbnRlcl9wYWdlKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHVuc2lnbmVkIGludCBsZW4pOwogCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N1c3BlbmQuaCBiL2luY2x1ZGUvbGludXgvc3VzcGVuZC5oCmluZGV4IGU4MmNiMTAuLjk2ZTMxYWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3VzcGVuZC5oCisrKyBiL2luY2x1ZGUvbGludXgvc3VzcGVuZC5oCkBAIC03MSw3ICs3MSw2IEBACiB2b2lkIF9fc2F2ZV9wcm9jZXNzb3Jfc3RhdGUoc3RydWN0IHNhdmVkX2NvbnRleHQgKmN0eHQpOwogdm9pZCBfX3Jlc3RvcmVfcHJvY2Vzc29yX3N0YXRlKHN0cnVjdCBzYXZlZF9jb250ZXh0ICpjdHh0KTsKIHVuc2lnbmVkIGxvbmcgZ2V0X3NhZmVfcGFnZShnZnBfdCBnZnBfbWFzayk7Ci1pbnQgc3dzdXNwX2FkZF9hcmNoX3BhZ2VzKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKTsKIAogLyoKICAqIFhYWDogV2UgdHJ5IHRvIGtlZXAgc29tZSBtb3JlIHBhZ2VzIGZyZWUgc28gdGhhdCBJL08gb3BlcmF0aW9ucyBzdWNjZWVkCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N5bmNsaW5rLmggYi9pbmNsdWRlL2xpbnV4L3N5bmNsaW5rLmgKaW5kZXggMjk5MzMwMi4uMDU3N2Y1MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zeW5jbGluay5oCisrKyBiL2luY2x1ZGUvbGludXgvc3luY2xpbmsuaApAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBTeW5jTGluayBNdWx0aXByb3RvY29sIFNlcmlhbCBBZGFwdGVyIERyaXZlcgogICoKLSAqICRJZDogc3luY2xpbmsuaCx2IDMuMTEgMjAwNi8wMi8wNiAyMToyMDoyOSBwYXVsa2YgRXhwICQKKyAqICRJZDogc3luY2xpbmsuaCx2IDMuMTMgMjAwNi8wNS8yMyAxODoyNTowNiBwYXVsa2YgRXhwICQKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwMCBieSBNaWNyb2dhdGUgQ29ycG9yYXRpb24KICAqCkBAIC05Nyw2ICs5Nyw4IEBACiAjZGVmaW5lIEhETENfVFhJRExFX0FMVF9NQVJLX1NQQUNFCTQKICNkZWZpbmUgSERMQ19UWElETEVfU1BBQ0UJCTUKICNkZWZpbmUgSERMQ19UWElETEVfTUFSSwkJNgorI2RlZmluZSBIRExDX1RYSURMRV9DVVNUT01fOCAgICAgICAgICAgIDB4MTAwMDAwMDAKKyNkZWZpbmUgSERMQ19UWElETEVfQ1VTVE9NXzE2ICAgICAgICAgICAweDIwMDAwMDAwCiAKICNkZWZpbmUgSERMQ19FTkNPRElOR19OUloJCQkwCiAjZGVmaW5lIEhETENfRU5DT0RJTkdfTlJaQgkJCTEKQEAgLTE3MCw2ICsxNzIsNyBAQAogI2RlZmluZSBTWU5DTElOS19HVF9ERVZJQ0VfSUQgMHgwMDcwCiAjZGVmaW5lIFNZTkNMSU5LX0dUNF9ERVZJQ0VfSUQgMHgwMDgwCiAjZGVmaW5lIFNZTkNMSU5LX0FDX0RFVklDRV9JRCAgMHgwMDkwCisjZGVmaW5lIFNZTkNMSU5LX0dUMl9ERVZJQ0VfSUQgMHgwMEEwCiAjZGVmaW5lIE1HU0xfTUFYX1NFUklBTF9OVU1CRVIgMzAKIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3lzY3RsLmggYi9pbmNsdWRlL2xpbnV4L3N5c2N0bC5oCmluZGV4IGM3MTMyMDIuLjM0OWVmOTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3lzY3RsLmgKKysrIGIvaW5jbHVkZS9saW51eC9zeXNjdGwuaApAQCAtNTUsNyArNTUsNyBAQAogCUNUTF9LRVJOPTEsCQkvKiBHZW5lcmFsIGtlcm5lbCBpbmZvIGFuZCBjb250cm9sICovCiAJQ1RMX1ZNPTIsCQkvKiBWTSBtYW5hZ2VtZW50ICovCiAJQ1RMX05FVD0zLAkJLyogTmV0d29ya2luZyAqLwotCUNUTF9QUk9DPTQsCQkvKiBQcm9jZXNzIGluZm8gKi8KKwkvKiB3YXMgQ1RMX1BST0MgKi8KIAlDVExfRlM9NSwJCS8qIEZpbGVzeXN0ZW1zICovCiAJQ1RMX0RFQlVHPTYsCQkvKiBEZWJ1Z2dpbmcgKi8KIAlDVExfREVWPTcsCQkvKiBEZXZpY2VzICovCkBAIC0xNDgsOSArMTQ4LDExIEBACiAJS0VSTl9TUElOX1JFVFJZPTcwLAkvKiBpbnQ6IG51bWJlciBvZiBzcGlubG9jayByZXRyaWVzICovCiAJS0VSTl9BQ1BJX1ZJREVPX0ZMQUdTPTcxLCAvKiBpbnQ6IGZsYWdzIGZvciBzZXR0aW5nIHVwIHZpZGVvIGFmdGVyIEFDUEkgc2xlZXAgKi8KIAlLRVJOX0lBNjRfVU5BTElHTkVEPTcyLCAvKiBpbnQ6IGlhNjQgdW5hbGlnbmVkIHVzZXJsYW5kIHRyYXAgZW5hYmxlICovCisJS0VSTl9DT01QQVRfTE9HPTczLAkvKiBpbnQ6IHByaW50IGNvbXBhdCBsYXllciAgbWVzc2FnZXMgKi8KIH07CiAKIAorCiAvKiBDVExfVk0gbmFtZXM6ICovCiBlbnVtCiB7CkBAIC03NjcsOCArNzY5LDYgQEAKIAlORVRfQlJJREdFX05GX0ZJTFRFUl9WTEFOX1RBR0dFRCA9IDQsCiB9OwogCi0vKiBDVExfUFJPQyBuYW1lczogKi8KLQogLyogQ1RMX0ZTIG5hbWVzOiAqLwogZW51bQogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90aW1lLmggYi9pbmNsdWRlL2xpbnV4L3RpbWUuaAppbmRleCAwY2Q2OTZjLi5jMDVmOGJiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3RpbWUuaAorKysgYi9pbmNsdWRlL2xpbnV4L3RpbWUuaApAQCAtMjgsMTAgKzI4LDEzIEBACiAjaWZkZWYgX19LRVJORUxfXwogCiAvKiBQYXJhbWV0ZXJzIHVzZWQgdG8gY29udmVydCB0aGUgdGltZXNwZWMgdmFsdWVzOiAqLwotI2RlZmluZSBNU0VDX1BFUl9TRUMJCTEwMDBMCi0jZGVmaW5lIFVTRUNfUEVSX1NFQwkJMTAwMDAwMEwKLSNkZWZpbmUgTlNFQ19QRVJfU0VDCQkxMDAwMDAwMDAwTAotI2RlZmluZSBOU0VDX1BFUl9VU0VDCQkxMDAwTAorI2RlZmluZSBNU0VDX1BFUl9TRUMJMTAwMEwKKyNkZWZpbmUgVVNFQ19QRVJfTVNFQwkxMDAwTAorI2RlZmluZSBOU0VDX1BFUl9VU0VDCTEwMDBMCisjZGVmaW5lIE5TRUNfUEVSX01TRUMJMTAwMDAwMEwKKyNkZWZpbmUgVVNFQ19QRVJfU0VDCTEwMDAwMDBMCisjZGVmaW5lIE5TRUNfUEVSX1NFQwkxMDAwMDAwMDAwTAorI2RlZmluZSBGU0VDX1BFUl9TRUMJMTAwMDAwMDAwMDAwMDAwMEwKIAogc3RhdGljIGlubGluZSBpbnQgdGltZXNwZWNfZXF1YWwoc3RydWN0IHRpbWVzcGVjICphLCBzdHJ1Y3QgdGltZXNwZWMgKmIpCiB7CkBAIC03Nyw2ICs4MCw4IEBACiBleHRlcm4gc3RydWN0IHRpbWVzcGVjIHdhbGxfdG9fbW9ub3RvbmljOwogZXh0ZXJuIHNlcWxvY2tfdCB4dGltZV9sb2NrOwogCit2b2lkIHRpbWVrZWVwaW5nX2luaXQodm9pZCk7CisKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBnZXRfc2Vjb25kcyh2b2lkKQogewogCXJldHVybiB4dGltZS50dl9zZWM7CkBAIC0xMDAsNiArMTA1LDcgQEAKIGV4dGVybiB2b2lkIGdldG5zdGltZW9mZGF5KHN0cnVjdCB0aW1lc3BlYyAqdHYpOwogCiBleHRlcm4gc3RydWN0IHRpbWVzcGVjIHRpbWVzcGVjX3RydW5jKHN0cnVjdCB0aW1lc3BlYyB0LCB1bnNpZ25lZCBncmFuKTsKK2V4dGVybiBpbnQgdGltZWtlZXBpbmdfaXNfY29udGludW91cyh2b2lkKTsKIAogLyoqCiAgKiB0aW1lc3BlY190b19ucyAtIENvbnZlcnQgdGltZXNwZWMgdG8gbmFub3NlY29uZHMKQEAgLTE0Miw2ICsxNDgsMjAgQEAKICAqLwogZXh0ZXJuIHN0cnVjdCB0aW1ldmFsIG5zX3RvX3RpbWV2YWwoY29uc3QgczY0IG5zZWMpOwogCisvKioKKyAqIHRpbWVzcGVjX2FkZF9ucyAtIEFkZHMgbmFub3NlY29uZHMgdG8gYSB0aW1lc3BlYworICogQGE6CQlwb2ludGVyIHRvIHRpbWVzcGVjIHRvIGJlIGluY3JlbWVudGVkCisgKiBAbnM6CQl1bnNpZ25lZCBuYW5vc2Vjb25kcyB2YWx1ZSB0byBiZSBhZGRlZAorICovCitzdGF0aWMgaW5saW5lIHZvaWQgdGltZXNwZWNfYWRkX25zKHN0cnVjdCB0aW1lc3BlYyAqYSwgdTY0IG5zKQoreworCW5zICs9IGEtPnR2X25zZWM7CisJd2hpbGUodW5saWtlbHkobnMgPj0gTlNFQ19QRVJfU0VDKSkgeworCQlucyAtPSBOU0VDX1BFUl9TRUM7CisJCWEtPnR2X3NlYysrOworCX0KKwlhLT50dl9uc2VjID0gbnM7Cit9CiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogCiAjZGVmaW5lIE5GREJJVFMJCQlfX05GREJJVFMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdGltZXguaCBiL2luY2x1ZGUvbGludXgvdGltZXguaAppbmRleCAzNGQzY2NmLi4xOWJiNjUzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3RpbWV4LmgKKysrIGIvaW5jbHVkZS9saW51eC90aW1leC5oCkBAIC0zMDMsNiArMzAzLDggQEAKIAogI2VuZGlmIC8qICFDT05GSUdfVElNRV9JTlRFUlBPTEFUSU9OICovCiAKKyNkZWZpbmUgVElDS19MRU5HVEhfU0hJRlQJMzIKKwogLyogUmV0dXJucyBob3cgbG9uZyB0aWNrcyBhcmUgYXQgcHJlc2VudCwgaW4gbnMgLyAyXihTSElGVF9TQ0FMRS0xMCkuICovCiBleHRlcm4gdTY0IGN1cnJlbnRfdGlja19sZW5ndGgodm9pZCk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdWZzX2ZzLmggYi9pbmNsdWRlL2xpbnV4L3Vmc19mcy5oCmluZGV4IDg2YjViNDIuLjkxNGY5MTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdWZzX2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC91ZnNfZnMuaApAQCAtMjIwLDYgKzIyMCwxOSBAQAogICovCiAjZGVmaW5lIFVGU19NSU5GUkVFICAgICAgICAgNQogI2RlZmluZSBVRlNfREVGQVVMVE9QVCAgICAgIFVGU19PUFRUSU1FCisKKy8qCisgKiBEZWJ1ZyBjb2RlCisgKi8KKyNpZmRlZiBDT05GSUdfVUZTX0RFQlVHCisjCWRlZmluZSBVRlNEKGYsIGEuLi4pCXsJCQkJCVwKKwkJcHJpbnRrICgiVUZTRCAoJXMsICVkKTogJXM6IiwJCQkJXAorCQkJX19GSUxFX18sIF9fTElORV9fLCBfX0ZVTkNUSU9OX18pOwkJXAorCQlwcmludGsgKGYsICMjIGEpOwkJCQkJXAorCX0KKyNlbHNlCisjCWRlZmluZSBVRlNEKGYsIGEuLi4pCS8qKi8KKyNlbmRpZgogICAgICAgICAgICAgCiAvKgogICogVHVybiBmaWxlIHN5c3RlbSBibG9jayBudW1iZXJzIGludG8gZGlzayBibG9jayBhZGRyZXNzZXMuCkBAIC0zMzksNyArMzUyLDIyIEBACiB9OwogCiAvKgorICogRmlsZSBzeXN0ZW0gZmxhZ3MKKyAqLworI2RlZmluZSBVRlNfVU5DTEVBTiAgICAgIDB4MDEgICAgLyogZmlsZSBzeXN0ZW0gbm90IGNsZWFuIGF0IG1vdW50ICh1bnVzZWQpICovCisjZGVmaW5lIFVGU19ET1NPRlRERVAgICAgMHgwMiAgICAvKiBmaWxlIHN5c3RlbSB1c2luZyBzb2Z0IGRlcGVuZGVuY2llcyAqLworI2RlZmluZSBVRlNfTkVFRFNGU0NLICAgIDB4MDQgICAgLyogbmVlZHMgc3luYyBmc2NrIChGcmVlQlNEIGNvbXBhdCwgdW51c2VkKSAqLworI2RlZmluZSBVRlNfSU5ERVhESVJTICAgIDB4MDggICAgLyoga2VybmVsIHN1cHBvcnRzIGluZGV4ZWQgZGlyZWN0b3JpZXMgKi8KKyNkZWZpbmUgVUZTX0FDTFMgICAgICAgICAweDEwICAgIC8qIGZpbGUgc3lzdGVtIGhhcyBBQ0xzIGVuYWJsZWQgKi8KKyNkZWZpbmUgVUZTX01VTFRJTEFCRUwgICAweDIwICAgIC8qIGZpbGUgc3lzdGVtIGlzIE1BQyBtdWx0aS1sYWJlbCAqLworI2RlZmluZSBVRlNfRkxBR1NfVVBEQVRFRCAweDgwICAgLyogZmxhZ3MgaGF2ZSBiZWVuIG1vdmVkIHRvIG5ldyBsb2NhdGlvbiAqLworCisjaWYgMAorLyoKICAqIFRoaXMgaXMgdGhlIGFjdHVhbCBzdXBlcmJsb2NrLCBhcyBpdCBpcyBsYWlkIG91dCBvbiB0aGUgZGlzay4KKyAqIERvIE5PVCB1c2UgdGhpcyBzdHJ1Y3R1cmUsIGJlY2F1c2Ugb2Ygc2l6ZW9mKHVmc19zdXBlcl9ibG9jaykgPiA1MTIgYW5kCisgKiBpdCBtYXkgb2NjdXB5IHNldmVyYWwgYmxvY2tzLCB1c2UKKyAqIHN0cnVjdCB1ZnNfc3VwZXJfYmxvY2tfKGZpcnN0LHNlY29uZCx0aGlyZCkgaW5zdGVhZC4KICAqLwogc3RydWN0IHVmc19zdXBlcl9ibG9jayB7CiAJX19mczMyCWZzX2xpbms7CS8qIFVOVVNFRCAqLwpAQCAtNDE2LDcgKzQ0NCw3IEBACiAJX19zOAlmc19mbW9kOwkvKiBzdXBlciBibG9jayBtb2RpZmllZCBmbGFnICovCiAJX19zOAlmc19jbGVhbjsJLyogZmlsZSBzeXN0ZW0gaXMgY2xlYW4gZmxhZyAqLwogCV9fczgJZnNfcm9ubHk7CS8qIG1vdW50ZWQgcmVhZC1vbmx5IGZsYWcgKi8KLQlfX3M4CWZzX2ZsYWdzOwkvKiBjdXJyZW50bHkgdW51c2VkIGZsYWcgKi8KKwlfX3M4CWZzX2ZsYWdzOwogCXVuaW9uIHsKIAkJc3RydWN0IHsKIAkJCV9fczgJZnNfZnNtbnRbVUZTX01BWE1OVExFTl07LyogbmFtZSBtb3VudGVkIG9uICovCkBAIC00ODUsNiArNTEzLDcgQEAKIAlfX2ZzMzIJZnNfbWFnaWM7CQkvKiBtYWdpYyBudW1iZXIgKi8KIAlfX3U4CWZzX3NwYWNlWzFdOwkJLyogbGlzdCBvZiBibG9ja3MgZm9yIGVhY2ggcm90YXRpb24gKi8KIH07CisjZW5kaWYvKnN0cnVjdCB1ZnNfc3VwZXJfYmxvY2sqLwogCiAvKgogICogUHJlZmVyZW5jZSBmb3Igb3B0aW1pemF0aW9uLgpAQCAtNjY2LDcgKzY5NSw3IEBACiB9OwogCiBzdHJ1Y3QgdWZzX2NnX3ByaXZhdGVfaW5mbyB7Ci0Jc3RydWN0IHVmc19jeWxpbmRlcl9ncm91cCB1Y2c7CisJc3RydWN0IHVmc19idWZmZXJfaGVhZCBjX3ViaDsKIAlfX3UzMgljX2NneDsJCS8qIG51bWJlciBvZiBjeWxpZG5lciBncm91cCAqLwogCV9fdTE2CWNfbmN5bDsJCS8qIG51bWJlciBvZiBjeWwncyB0aGlzIGNnICovCiAJX191MTYJY19uaWJsazsJLyogbnVtYmVyIG9mIGlub2RlIGJsb2NrcyB0aGlzIGNnICovCkBAIC02ODYsNiArNzE1LDcgQEAKIAogc3RydWN0IHVmc19zYl9wcml2YXRlX2luZm8gewogCXN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgc191Ymg7IC8qIGJ1ZmZlciBjb250YWluaW5nIHN1cGVyIGJsb2NrICovCisJc3RydWN0IHVmczJfY3N1bV90b3RhbCBjc190b3RhbDsKIAlfX3UzMglzX3NibGtubzsJLyogb2Zmc2V0IG9mIHN1cGVyLWJsb2NrcyBpbiBmaWxlc3lzICovCiAJX191MzIJc19jYmxrbm87CS8qIG9mZnNldCBvZiBjZy1ibG9jayBpbiBmaWxlc3lzICovCiAJX191MzIJc19pYmxrbm87CS8qIG9mZnNldCBvZiBpbm9kZS1ibG9ja3MgaW4gZmlsZXN5cyAqLwpAQCAtODI0LDE2ICs4NTQsNTQgQEAKIH07CiAKIHN0cnVjdCB1ZnNfc3VwZXJfYmxvY2tfc2Vjb25kIHsKLQlfX3M4CWZzX2ZzbW50WzIxMl07Ci0JX19mczMyCWZzX2Nncm90b3I7Ci0JX19mczMyCWZzX2NzcFtVRlNfTUFYQ1NCVUZTXTsKLQlfX2ZzMzIJZnNfbWF4Y2x1c3RlcjsKLQlfX2ZzMzIJZnNfY3BjOwotCV9fZnMxNglmc19vcG9zdGJsWzgyXTsKLX07CQorCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCV9fczgJZnNfZnNtbnRbMjEyXTsKKwkJCV9fZnMzMglmc19jZ3JvdG9yOworCQkJX19mczMyCWZzX2NzcFtVRlNfTUFYQ1NCVUZTXTsKKwkJCV9fZnMzMglmc19tYXhjbHVzdGVyOworCQkJX19mczMyCWZzX2NwYzsKKwkJCV9fZnMxNglmc19vcG9zdGJsWzgyXTsKKwkJfSBmc191MTsKKwkJc3RydWN0IHsKKwkJCV9fczggIGZzX2ZzbW50W1VGUzJfTUFYTU5UTEVOIC0gVUZTX01BWE1OVExFTiArIDIxMl07CisJCQlfX3U4ICAgZnNfdm9sbmFtZVtVRlMyX01BWFZPTExFTl07CisJCQlfX2ZzNjQgIGZzX3N3dWlkOworCQkJX19mczMyICBmc19wYWQ7CisJCQlfX2ZzMzIgICBmc19jZ3JvdG9yOworCQkJX19mczMyICAgZnNfb2NzcFtVRlMyX05PQ1NQVFJTXTsKKwkJCV9fZnMzMiAgIGZzX2NvbnRpZ2RpcnM7CisJCQlfX2ZzMzIgICBmc19jc3A7CisJCQlfX2ZzMzIgICBmc19tYXhjbHVzdGVyOworCQkJX19mczMyICAgZnNfYWN0aXZlOworCQkJX19mczMyICAgZnNfb2xkX2NwYzsKKwkJCV9fZnMzMiAgIGZzX21heGJzaXplOworCQkJX19mczY0ICAgZnNfc3BhcmVjb242NFsxN107CisJCQlfX2ZzNjQgICBmc19zYmxvY2tsb2M7CisJCQlfX2ZzNjQJY3NfbmRpcjsKKwkJCV9fZnM2NAljc19uYmZyZWU7CisJCX0gZnNfdTI7CisJfSBmc191bjsKK307CiAKIHN0cnVjdCB1ZnNfc3VwZXJfYmxvY2tfdGhpcmQgewotCV9fZnMxNglmc19vcG9zdGJsWzQ2XTsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlfX2ZzMTYJZnNfb3Bvc3RibFs0Nl07CisJCX0gZnNfdTE7CisJCXN0cnVjdCB7CisJCQlfX2ZzNjQJY3NfbmlmcmVlOwkvKiBudW1iZXIgb2YgZnJlZSBpbm9kZXMgKi8KKwkJCV9fZnM2NAljc19uZmZyZWU7CS8qIG51bWJlciBvZiBmcmVlIGZyYWdzICovCisJCQlfX2ZzNjQgICBjc19udW1jbHVzdGVyczsJLyogbnVtYmVyIG9mIGZyZWUgY2x1c3RlcnMgKi8KKwkJCV9fZnM2NCAgIGNzX3NwYXJlWzNdOwkvKiBmdXR1cmUgZXhwYW5zaW9uICovCisJCQlzdHJ1Y3QgIHVmc190aW1ldmFsICAgIGZzX3RpbWU7CQkvKiBsYXN0IHRpbWUgd3JpdHRlbiAqLworCQkJX19mczY0ICAgIGZzX3NpemU7CQkvKiBudW1iZXIgb2YgYmxvY2tzIGluIGZzICovCisJCQlfX2ZzNjQgICAgZnNfZHNpemU7CS8qIG51bWJlciBvZiBkYXRhIGJsb2NrcyBpbiBmcyAqLworCQkJX19mczY0ICAgZnNfY3NhZGRyOwkvKiBibGsgYWRkciBvZiBjeWwgZ3JwIHN1bW1hcnkgYXJlYSAqLworCQkJX19mczY0ICAgIGZzX3BlbmRpbmdibG9ja3M7LyogYmxvY2tzIGluIHByb2Nlc3Mgb2YgYmVpbmcgZnJlZWQgKi8KKwkJCV9fZnMzMiAgICBmc19wZW5kaW5naW5vZGVzOy8qaW5vZGVzIGluIHByb2Nlc3Mgb2YgYmVpbmcgZnJlZWQgKi8KKwkJfSBmc191MjsKKwl9IGZzX3VuMTsKIAl1bmlvbiB7CiAJCXN0cnVjdCB7CiAJCQlfX2ZzMzIJZnNfc3BhcmVjb25bNTNdOy8qIHJlc2VydmVkIGZvciBmdXR1cmUgY29uc3RhbnRzICovCkBAIC04NjEsNyArOTI5LDcgQEAKIAkJCV9fZnMzMglmc19xZm1hc2tbMl07CS8qIH51c2JfZm1hc2sgKi8KIAkJCV9fZnMzMglmc19zdGF0ZTsJLyogZmlsZSBzeXN0ZW0gc3RhdGUgdGltZSBzdGFtcCAqLwogCQl9IGZzXzQ0OwotCX0gZnNfdTI7CisJfSBmc191bjI7CiAJX19mczMyCWZzX3Bvc3RibGZvcm1hdDsKIAlfX2ZzMzIJZnNfbnJwb3M7CiAJX19mczMyCWZzX3Bvc3RibG9mZjsKQEAgLTg3NSw3ICs5NDMsOCBAQAogLyogYmFsbG9jLmMgKi8KIGV4dGVybiB2b2lkIHVmc19mcmVlX2ZyYWdtZW50cyAoc3RydWN0IGlub2RlICosIHVuc2lnbmVkLCB1bnNpZ25lZCk7CiBleHRlcm4gdm9pZCB1ZnNfZnJlZV9ibG9ja3MgKHN0cnVjdCBpbm9kZSAqLCB1bnNpZ25lZCwgdW5zaWduZWQpOwotZXh0ZXJuIHVuc2lnbmVkIHVmc19uZXdfZnJhZ21lbnRzIChzdHJ1Y3QgaW5vZGUgKiwgX19mczMyICosIHVuc2lnbmVkLCB1bnNpZ25lZCwgdW5zaWduZWQsIGludCAqKTsKK2V4dGVybiB1bnNpZ25lZCB1ZnNfbmV3X2ZyYWdtZW50cyhzdHJ1Y3QgaW5vZGUgKiwgX19mczMyICosIHVuc2lnbmVkLCB1bnNpZ25lZCwKKwkJCQkgIHVuc2lnbmVkLCBpbnQgKiwgc3RydWN0IHBhZ2UgKik7CiAKIC8qIGN5bGluZGVyLmMgKi8KIGV4dGVybiBzdHJ1Y3QgdWZzX2NnX3ByaXZhdGVfaW5mbyAqIHVmc19sb2FkX2N5bGluZGVyIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgdW5zaWduZWQpOwpAQCAtODg2LDExICs5NTUsMTIgQEAKIGV4dGVybiBpbnQgdWZzX2FkZF9saW5rIChzdHJ1Y3QgZGVudHJ5ICosIHN0cnVjdCBpbm9kZSAqKTsKIGV4dGVybiBpbm9fdCB1ZnNfaW5vZGVfYnlfbmFtZShzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGRlbnRyeSAqKTsKIGV4dGVybiBpbnQgdWZzX21ha2VfZW1wdHkoc3RydWN0IGlub2RlICosIHN0cnVjdCBpbm9kZSAqKTsKLWV4dGVybiBzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqIHVmc19maW5kX2VudHJ5IChzdHJ1Y3QgZGVudHJ5ICosIHN0cnVjdCBidWZmZXJfaGVhZCAqKik7Ci1leHRlcm4gaW50IHVmc19kZWxldGVfZW50cnkgKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKik7CitleHRlcm4gc3RydWN0IHVmc19kaXJfZW50cnkgKnVmc19maW5kX2VudHJ5KHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZGVudHJ5ICosIHN0cnVjdCBwYWdlICoqKTsKK2V4dGVybiBpbnQgdWZzX2RlbGV0ZV9lbnRyeShzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IHVmc19kaXJfZW50cnkgKiwgc3RydWN0IHBhZ2UgKik7CiBleHRlcm4gaW50IHVmc19lbXB0eV9kaXIgKHN0cnVjdCBpbm9kZSAqKTsKLWV4dGVybiBzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqIHVmc19kb3Rkb3QgKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiopOwotZXh0ZXJuIHZvaWQgdWZzX3NldF9saW5rKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiwgc3RydWN0IGlub2RlICopOworZXh0ZXJuIHN0cnVjdCB1ZnNfZGlyX2VudHJ5ICp1ZnNfZG90ZG90KHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgcGFnZSAqKik7CitleHRlcm4gdm9pZCB1ZnNfc2V0X2xpbmsoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCB1ZnNfZGlyX2VudHJ5ICpkZSwKKwkJCSBzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IGlub2RlICppbm9kZSk7CiAKIC8qIGZpbGUuYyAqLwogZXh0ZXJuIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHVmc19maWxlX2lub2RlX29wZXJhdGlvbnM7CkBAIC05MDMsMTMgKzk3MywxMSBAQAogZXh0ZXJuIHN0cnVjdCBpbm9kZSAqIHVmc19uZXdfaW5vZGUgKHN0cnVjdCBpbm9kZSAqLCBpbnQpOwogCiAvKiBpbm9kZS5jICovCi1leHRlcm4gdTY0ICB1ZnNfZnJhZ19tYXAgKHN0cnVjdCBpbm9kZSAqLCBzZWN0b3JfdCk7CiBleHRlcm4gdm9pZCB1ZnNfcmVhZF9pbm9kZSAoc3RydWN0IGlub2RlICopOwogZXh0ZXJuIHZvaWQgdWZzX3B1dF9pbm9kZSAoc3RydWN0IGlub2RlICopOwogZXh0ZXJuIGludCB1ZnNfd3JpdGVfaW5vZGUgKHN0cnVjdCBpbm9kZSAqLCBpbnQpOwogZXh0ZXJuIGludCB1ZnNfc3luY19pbm9kZSAoc3RydWN0IGlub2RlICopOwogZXh0ZXJuIHZvaWQgdWZzX2RlbGV0ZV9pbm9kZSAoc3RydWN0IGlub2RlICopOwotZXh0ZXJuIHN0cnVjdCBidWZmZXJfaGVhZCAqIHVmc19nZXRmcmFnIChzdHJ1Y3QgaW5vZGUgKiwgdW5zaWduZWQsIGludCwgaW50ICopOwogZXh0ZXJuIHN0cnVjdCBidWZmZXJfaGVhZCAqIHVmc19icmVhZCAoc3RydWN0IGlub2RlICosIHVuc2lnbmVkLCBpbnQsIGludCAqKTsKIGV4dGVybiBpbnQgdWZzX2dldGZyYWdfYmxvY2sgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHNlY3Rvcl90IGZyYWdtZW50LCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoX3Jlc3VsdCwgaW50IGNyZWF0ZSk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdWZzX2ZzX2kuaCBiL2luY2x1ZGUvbGludXgvdWZzX2ZzX2kuaAppbmRleCAyMTY2NWE5Li5mNTBjZTNiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3Vmc19mc19pLmgKKysrIGIvaW5jbHVkZS9saW51eC91ZnNfZnNfaS5oCkBAIC0yNyw2ICsyNyw3IEBACiAJX191MzIJaV9vZWZ0ZmxhZzsKIAlfX3UxNglpX29zeW5jOwogCV9fdTMyCWlfbGFzdGZyYWc7CisJX191MzIgICBpX2Rpcl9zdGFydF9sb29rdXA7CiAJc3RydWN0IGlub2RlIHZmc19pbm9kZTsKIH07CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdW53aW5kLmggYi9pbmNsdWRlL2xpbnV4L3Vud2luZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNDhlMmMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3Vud2luZC5oCkBAIC0wLDAgKzEsMTI3IEBACisjaWZuZGVmIF9MSU5VWF9VTldJTkRfSAorI2RlZmluZSBfTElOVVhfVU5XSU5EX0gKKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMi0yMDA2IE5vdmVsbCwgSW5jLgorICoJSmFuIEJldWxpY2ggPGpiZXVsaWNoQG5vdmVsbC5jb20+CisgKiBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR1BMLgorICoKKyAqIEEgc2ltcGxlIEFQSSBmb3IgdW53aW5kaW5nIGtlcm5lbCBzdGFja3MuICBUaGlzIGlzIHVzZWQgZm9yCisgKiBkZWJ1Z2dpbmcgYW5kIGVycm9yIHJlcG9ydGluZyBwdXJwb3Nlcy4gIFRoZSBrZXJuZWwgZG9lc24ndCBuZWVkCisgKiBmdWxsLWJsb3duIHN0YWNrIHVud2luZGluZyB3aXRoIGFsbCB0aGUgYmVsbHMgYW5kIHdoaXN0bGVzLCBzbyB0aGVyZQorICogaXMgbm90IG11Y2ggcG9pbnQgaW4gaW1wbGVtZW50aW5nIHRoZSBmdWxsIER3YXJmMiB1bndpbmQgQVBJLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKworc3RydWN0IG1vZHVsZTsKKworI2lmZGVmIENPTkZJR19TVEFDS19VTldJTkQKKworI2luY2x1ZGUgPGFzbS91bndpbmQuaD4KKworI2lmbmRlZiBBUkNIX1VOV0lORF9TRUNUSU9OX05BTUUKKyNkZWZpbmUgQVJDSF9VTldJTkRfU0VDVElPTl9OQU1FICIuZWhfZnJhbWUiCisjZW5kaWYKKworLyoKKyAqIEluaXRpYWxpemUgdW53aW5kIHN1cHBvcnQuCisgKi8KK2V4dGVybiB2b2lkIHVud2luZF9pbml0KHZvaWQpOworCisjaWZkZWYgQ09ORklHX01PRFVMRVMKKworZXh0ZXJuIHZvaWQgKnVud2luZF9hZGRfdGFibGUoc3RydWN0IG1vZHVsZSAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqdGFibGVfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHRhYmxlX3NpemUpOworCitleHRlcm4gdm9pZCB1bndpbmRfcmVtb3ZlX3RhYmxlKHZvaWQgKmhhbmRsZSwgaW50IGluaXRfb25seSk7CisKKyNlbmRpZgorCitleHRlcm4gaW50IHVud2luZF9pbml0X2ZyYW1lX2luZm8oc3RydWN0IHVud2luZF9mcmFtZV9pbmZvICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRhc2tfc3RydWN0ICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypjb25zdCovIHN0cnVjdCBwdF9yZWdzICopOworCisvKgorICogUHJlcGFyZSB0byB1bndpbmQgYSBibG9ja2VkIHRhc2suCisgKi8KK2V4dGVybiBpbnQgdW53aW5kX2luaXRfYmxvY2tlZChzdHJ1Y3QgdW53aW5kX2ZyYW1lX2luZm8gKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKik7CisKKy8qCisgKiBQcmVwYXJlIHRvIHVud2luZCB0aGUgY3VycmVudGx5IHJ1bm5pbmcgdGhyZWFkLgorICovCitleHRlcm4gaW50IHVud2luZF9pbml0X3J1bm5pbmcoc3RydWN0IHVud2luZF9mcmFtZV9pbmZvICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNtbGlua2FnZSBpbnQgKCpjYWxsYmFjaykoc3RydWN0IHVud2luZF9mcmFtZV9pbmZvICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYXJnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICphcmcpOworCisvKgorICogVW53aW5kIHRvIHByZXZpb3VzIHRvIGZyYW1lLiAgUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwsIG5lZ2F0aXZlCisgKiBudW1iZXIgaW4gY2FzZSBvZiBhbiBlcnJvci4KKyAqLworZXh0ZXJuIGludCB1bndpbmQoc3RydWN0IHVud2luZF9mcmFtZV9pbmZvICopOworCisvKgorICogVW53aW5kIHVudGlsIHRoZSByZXR1cm4gcG9pbnRlciBpcyBpbiB1c2VyLWxhbmQgKG9yIHVudGlsIGFuIGVycm9yCisgKiBvY2N1cnMpLiAgUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwsIG5lZ2F0aXZlIG51bWJlciBpbiBjYXNlIG9mCisgKiBlcnJvci4KKyAqLworZXh0ZXJuIGludCB1bndpbmRfdG9fdXNlcihzdHJ1Y3QgdW53aW5kX2ZyYW1lX2luZm8gKik7CisKKyNlbHNlCisKK3N0cnVjdCB1bndpbmRfZnJhbWVfaW5mbyB7fTsKKworc3RhdGljIGlubGluZSB2b2lkIHVud2luZF9pbml0KHZvaWQpIHt9CisKKyNpZmRlZiBDT05GSUdfTU9EVUxFUworCitzdGF0aWMgaW5saW5lIHZvaWQgKnVud2luZF9hZGRfdGFibGUoc3RydWN0IG1vZHVsZSAqbW9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnRhYmxlX3N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgdGFibGVfc2l6ZSkKK3sKKwlyZXR1cm4gTlVMTDsKK30KKworI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgdm9pZCB1bndpbmRfcmVtb3ZlX3RhYmxlKHZvaWQgKmhhbmRsZSwgaW50IGluaXRfb25seSkKK3sKK30KKworc3RhdGljIGlubGluZSBpbnQgdW53aW5kX2luaXRfZnJhbWVfaW5mbyhzdHJ1Y3QgdW53aW5kX2ZyYW1lX2luZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlyZXR1cm4gLUVOT1NZUzsKK30KKworc3RhdGljIGlubGluZSBpbnQgdW53aW5kX2luaXRfYmxvY2tlZChzdHJ1Y3QgdW53aW5kX2ZyYW1lX2luZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQoreworCXJldHVybiAtRU5PU1lTOworfQorCitzdGF0aWMgaW5saW5lIGludCB1bndpbmRfaW5pdF9ydW5uaW5nKHN0cnVjdCB1bndpbmRfZnJhbWVfaW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNtbGlua2FnZSBpbnQgKCpjYikoc3RydWN0IHVud2luZF9mcmFtZV9pbmZvICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmFyZyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmFyZykKK3sKKwlyZXR1cm4gLUVOT1NZUzsKK30KKworc3RhdGljIGlubGluZSBpbnQgdW53aW5kKHN0cnVjdCB1bndpbmRfZnJhbWVfaW5mbyAqaW5mbykKK3sKKwlyZXR1cm4gLUVOT1NZUzsKK30KKworc3RhdGljIGlubGluZSBpbnQgdW53aW5kX3RvX3VzZXIoc3RydWN0IHVud2luZF9mcmFtZV9pbmZvICppbmZvKQoreworCXJldHVybiAtRU5PU1lTOworfQorCisjZW5kaWYKKworI2VuZGlmIC8qIF9MSU5VWF9VTldJTkRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC92aWRlb2Rldi5oIGIvaW5jbHVkZS9saW51eC92aWRlb2Rldi5oCmluZGV4IDkxMTQwMDkuLjQxYmM3ZTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdmlkZW9kZXYuaAorKysgYi9pbmNsdWRlL2xpbnV4L3ZpZGVvZGV2LmgKQEAgLTEsNDkgKzEsMjEgQEAKKy8qCisgKglWaWRlbyBmb3IgTGludXggdmVyc2lvbiAxIC0gT0JTT0xFVEUKKyAqCisgKglIZWFkZXIgZmlsZSBmb3IgdjRsMSBkcml2ZXJzIGFuZCBhcHBsaWNhdGlvbnMsIGZvcgorICoJTGludXgga2VybmVscyAyLjIueCBvciAyLjQueC4KKyAqCisgKglQcm92aWRlcyBoZWFkZXIgZm9yIGxlZ2FjeSBkcml2ZXJzIGFuZCBhcHBsaWNhdGlvbnMKKyAqCisgKglTZWUgaHR0cDovL2xpbnV4dHYub3JnIGZvciBtb3JlIGluZm8KKyAqCisgKi8KICNpZm5kZWYgX19MSU5VWF9WSURFT0RFVl9ICiAjZGVmaW5lIF9fTElOVVhfVklERU9ERVZfSAogCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLQogI2RlZmluZSBIQVZFX1Y0TDEgMQogCiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CiAKLSNpZmRlZiBfX0tFUk5FTF9fCi0KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotCi1leHRlcm4gc3RydWN0IHZpZGVvX2RldmljZSogdmlkZW9fZGV2ZGF0YShzdHJ1Y3QgZmlsZSopOwotCi0jZGVmaW5lIHRvX3ZpZGVvX2RldmljZShjZCkgY29udGFpbmVyX29mKGNkLCBzdHJ1Y3QgdmlkZW9fZGV2aWNlLCBjbGFzc19kZXYpCi1zdGF0aWMgaW5saW5lIHZvaWQKLXZpZGVvX2RldmljZV9jcmVhdGVfZmlsZShzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZmQsCi0JCQkgc3RydWN0IGNsYXNzX2RldmljZV9hdHRyaWJ1dGUgKmF0dHIpCi17Ci0JY2xhc3NfZGV2aWNlX2NyZWF0ZV9maWxlKCZ2ZmQtPmNsYXNzX2RldiwgYXR0cik7Ci19Ci1zdGF0aWMgaW5saW5lIHZvaWQKLXZpZGVvX2RldmljZV9yZW1vdmVfZmlsZShzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZmQsCi0JCQkgc3RydWN0IGNsYXNzX2RldmljZV9hdHRyaWJ1dGUgKmF0dHIpCi17Ci0JY2xhc3NfZGV2aWNlX3JlbW92ZV9maWxlKCZ2ZmQtPmNsYXNzX2RldiwgYXR0cik7Ci19Ci0KLSNpZiBPQlNPTEVURV9PV05FUiAvKiB0byBiZSByZW1vdmVkIGluIDIuNi4xNSAqLwotLyogaGVscGVyIGZ1bmN0aW9ucyB0byBhY2Nlc3MgZHJpdmVyIHByaXZhdGUgZGF0YS4gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCAqdmlkZW9fZ2V0X2RydmRhdGEoc3RydWN0IHZpZGVvX2RldmljZSAqZGV2KQotewotCXJldHVybiBkZXYtPnByaXY7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCB2aWRlb19zZXRfZHJ2ZGF0YShzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCi17Ci0JZGV2LT5wcml2ID0gZGF0YTsKLX0KLSNlbmRpZgotCi1leHRlcm4gaW50IHZpZGVvX2V4Y2x1c2l2ZV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKLWV4dGVybiBpbnQgdmlkZW9fZXhjbHVzaXZlX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOwotI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KLQogc3RydWN0IHZpZGVvX2NhcGFiaWxpdHkKIHsKIAljaGFyIG5hbWVbMzJdOwpAQCAtMzYzLDYgKzMzNSw3IEBACiAjZGVmaW5lIFZJRF9IQVJEV0FSRV9TQUE3MTE0SCAgIDM3CiAjZGVmaW5lIFZJRF9IQVJEV0FSRV9TTjlDMTAyCTM4CiAjZGVmaW5lIFZJRF9IQVJEV0FSRV9BUlYJMzkKKwogI2VuZGlmIC8qIF9fTElOVVhfVklERU9ERVZfSCAqLwogCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC92aWRlb2RldjIuaCBiL2luY2x1ZGUvbGludXgvdmlkZW9kZXYyLmgKaW5kZXggYWQ3ZmE5Yy4uYTYyNjczZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC92aWRlb2RldjIuaAorKysgYi9pbmNsdWRlL2xpbnV4L3ZpZGVvZGV2Mi5oCkBAIC0xLDM1ICsxLDMzIEBACi0jaWZuZGVmIF9fTElOVVhfVklERU9ERVYyX0gKLSNkZWZpbmUgX19MSU5VWF9WSURFT0RFVjJfSAogLyoKICAqCVZpZGVvIGZvciBMaW51eCBUd28KICAqCi0gKglIZWFkZXIgZmlsZSBmb3IgdjRsIG9yIFY0TDIgZHJpdmVycyBhbmQgYXBwbGljYXRpb25zLCBmb3IKLSAqCUxpbnV4IGtlcm5lbHMgMi4yLnggb3IgMi40LnguCisgKglIZWFkZXIgZmlsZSBmb3IgdjRsIG9yIFY0TDIgZHJpdmVycyBhbmQgYXBwbGljYXRpb25zCisgKiB3aXRoIHB1YmxpYyBBUEkuCisgKiBBbGwga2VybmVsLXNwZWNpZmljIHN0dWZmIHdlcmUgbW92ZWQgdG8gbWVkaWEvdjRsMi1kZXYuaCwgc28KKyAqIG5vICNpZiBfX0tFUk5FTCB0ZXN0cyBhcmUgYWxsb3dlZCBoZXJlCiAgKgotICoJU2VlIGh0dHA6Ly9ieXRlc2V4Lm9yZy92NGwvIGZvciBBUEkgc3BlY3MgYW5kIG90aGVyCi0gKgl2NGwyIGRvY3VtZW50YXRpb24uCisgKglTZWUgaHR0cDovL2xpbnV4dHYub3JnIGZvciBtb3JlIGluZm8KICAqCiAgKglBdXRob3I6IEJpbGwgRGlya3MgPGJkaXJrc0BwYWNiZWxsLm5ldD4KICAqCQlKdXN0aW4gU2Nob2VtYW4KICAqCQlldCBhbC4KICAqLworI2lmbmRlZiBfX0xJTlVYX1ZJREVPREVWMl9ICisjZGVmaW5lIF9fTElOVVhfVklERU9ERVYyX0gKICNpZmRlZiBfX0tFUk5FTF9fCi0jaW5jbHVkZSA8bGludXgvdGltZS5oPiAvKiBuZWVkIHN0cnVjdCB0aW1ldmFsICovCi0jaW5jbHVkZSA8bGludXgvcG9sbC5oPgotI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jZW5kaWYKKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+ICAgICAvKiBuZWVkIHN0cnVjdCB0aW1ldmFsICovCiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4gLyogbmVlZCBfX3VzZXIgKi8KKyNlbHNlCisjZGVmaW5lIF9fdXNlcgorI2VuZGlmCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAotCi0jZGVmaW5lIE9CU09MRVRFX09XTkVSIDEgLyogSXQgd2lsbCBiZSByZW1vdmVkIGZvciAyLjYuMTcgKi8KICNkZWZpbmUgSEFWRV9WNEwyIDEKIAogLyoKICAqIENvbW1vbiBzdHVmZiBmb3IgYm90aCBWNEwxIGFuZCBWNEwyCiAgKiBNb3ZlZCBmcm9tIHZpZGVvZGV2LmgKICAqLwotCiAjZGVmaW5lIFZJREVPX01BWF9GUkFNRSAgICAgICAgICAgICAgIDMyCiAKICNkZWZpbmUgVklEX1RZUEVfQ0FQVFVSRQkxCS8qIENhbiBjYXB0dXJlICovCkBAIC00Nyw3MSArNDUsNiBAQAogI2RlZmluZSBWSURfVFlQRV9NSlBFR19ERUNPREVSCTQwOTYJLyogQ2FuIGRlY29kZSBNSlBFRyBzdHJlYW1zICovCiAjZGVmaW5lIFZJRF9UWVBFX01KUEVHX0VOQ09ERVIJODE5MgkvKiBDYW4gZW5jb2RlIE1KUEVHIHN0cmVhbXMgKi8KIAotI2lmZGVmIF9fS0VSTkVMX18KLQotLyogTWlub3IgZGV2aWNlIGFsbG9jYXRpb24gKi8KLSNkZWZpbmUgTUlOT1JfVkZMX1RZUEVfR1JBQkJFUl9NSU4gICAwCi0jZGVmaW5lIE1JTk9SX1ZGTF9UWVBFX0dSQUJCRVJfTUFYICA2MwotI2RlZmluZSBNSU5PUl9WRkxfVFlQRV9SQURJT19NSU4gICAgNjQKLSNkZWZpbmUgTUlOT1JfVkZMX1RZUEVfUkFESU9fTUFYICAgMTI3Ci0jZGVmaW5lIE1JTk9SX1ZGTF9UWVBFX1ZUWF9NSU4gICAgIDE5MgotI2RlZmluZSBNSU5PUl9WRkxfVFlQRV9WVFhfTUFYICAgICAyMjMKLSNkZWZpbmUgTUlOT1JfVkZMX1RZUEVfVkJJX01JTiAgICAgMjI0Ci0jZGVmaW5lIE1JTk9SX1ZGTF9UWVBFX1ZCSV9NQVggICAgIDI1NQotCi0jZGVmaW5lIFZGTF9UWVBFX0dSQUJCRVIJMAotI2RlZmluZSBWRkxfVFlQRV9WQkkJCTEKLSNkZWZpbmUgVkZMX1RZUEVfUkFESU8JCTIKLSNkZWZpbmUgVkZMX1RZUEVfVlRYCQkzCi0KLXN0cnVjdCB2aWRlb19kZXZpY2UKLXsKLQkvKiBkZXZpY2UgaW5mbyAqLwotCXN0cnVjdCBkZXZpY2UgKmRldjsKLQljaGFyIG5hbWVbMzJdOwotCWludCB0eXBlOyAgICAgICAvKiB2NGwxICovCi0JaW50IHR5cGUyOyAgICAgIC8qIHY0bDIgKi8KLQlpbnQgaGFyZHdhcmU7Ci0JaW50IG1pbm9yOwotCi0JLyogZGV2aWNlIG9wcyArIGNhbGxiYWNrcyAqLwotCWNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKmZvcHM7Ci0Jdm9pZCAoKnJlbGVhc2UpKHN0cnVjdCB2aWRlb19kZXZpY2UgKnZmZCk7Ci0KLQotI2lmIE9CU09MRVRFX09XTkVSIC8qIHRvIGJlIHJlbW92ZWQgaW4gMi42LjE1ICovCi0JLyogb2Jzb2xldGUgLS0gZm9wcy0+b3duZXIgaXMgdXNlZCBpbnN0ZWFkICovCi0Jc3RydWN0IG1vZHVsZSAqb3duZXI7Ci0JLyogZGV2LT5kcml2ZXJfZGF0YSB3aWxsIGJlIHVzZWQgaW5zdGVhZCBzb21lIGRheS4KLQkgKiBVc2UgdGhlIHZpZGVvX3tnZXR8c2V0fV9kcnZkYXRhKCkgaGVscGVyIGZ1bmN0aW9ucywKLQkgKiBzbyB0aGUgc3dpdGNoIG92ZXIgd2lsbCBiZSB0cmFuc3BhcmVudCBmb3IgeW91LgotCSAqIE9yIHVzZSB7cGNpfHVzYn1fe2dldHxzZXR9X2RydmRhdGEoKSBkaXJlY3RseS4gKi8KLQl2b2lkICpwcml2OwotI2VuZGlmCi0KLQkvKiBmb3IgdmlkZW9kZXYuYyBpbnRlbmFsIHVzYWdlIC0tIHBsZWFzZSBkb24ndCB0b3VjaCAqLwotCWludCB1c2VyczsgICAgICAgICAgICAgICAgICAgICAvKiB2aWRlb19leGNsdXNpdmVfe29wZW58Y2xvc2V9IC4uLiAqLwotCXN0cnVjdCBtdXRleCBsb2NrOyAgICAgICAgICAgICAvKiAuLi4gaGVscGVyIGZ1bmN0aW9uIHVzZXMgdGhlc2UgICAqLwotCWNoYXIgZGV2ZnNfbmFtZVs2NF07ICAgICAgICAgICAvKiBkZXZmcyAqLwotCXN0cnVjdCBjbGFzc19kZXZpY2UgY2xhc3NfZGV2OyAvKiBzeXNmcyAqLwotfTsKLQotI2RlZmluZSBWSURFT19NQUpPUgk4MQotCi1leHRlcm4gaW50IHZpZGVvX3JlZ2lzdGVyX2RldmljZShzdHJ1Y3QgdmlkZW9fZGV2aWNlICosIGludCB0eXBlLCBpbnQgbnIpOwotZXh0ZXJuIHZvaWQgdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2Uoc3RydWN0IHZpZGVvX2RldmljZSAqKTsKLWV4dGVybiBpbnQgdmlkZW9fdXNlcmNvcHkoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnLAotCQkJICBpbnQgKCpmdW5jKShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQkgICAgICB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpKTsKLQotLyogaGVscGVyIGZ1bmN0aW9ucyB0byBhbGxvYyAvIHJlbGVhc2Ugc3RydWN0IHZpZGVvX2RldmljZSwgdGhlCi0gICBsYXRlciBjYW4gYmUgdXNlZCBmb3IgdmlkZW9fZGV2aWNlLT5yZWxlYXNlKCkgKi8KLXN0cnVjdCB2aWRlb19kZXZpY2UgKnZpZGVvX2RldmljZV9hbGxvYyh2b2lkKTsKLXZvaWQgdmlkZW9fZGV2aWNlX3JlbGVhc2Uoc3RydWN0IHZpZGVvX2RldmljZSAqdmZkKTsKLQotI2VuZGlmCi0KIC8qCiAgKglNIEkgUyBDIEUgTCBMIEEgTiBFIE8gVSBTCiAgKi8KQEAgLTE3Miw2ICsxMDUsOCBAQAogCVY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4JICAgICA9IDIsCiAJVjRMMl9DVFJMX1RZUEVfTUVOVQkgICAgID0gMywKIAlWNEwyX0NUUkxfVFlQRV9CVVRUT04JICAgICA9IDQsCisJVjRMMl9DVFJMX1RZUEVfSU5URUdFUjY0ICAgICA9IDUsCisJVjRMMl9DVFJMX1RZUEVfQ1RSTF9DTEFTUyAgICA9IDYsCiB9OwogCiBlbnVtIHY0bDJfdHVuZXJfdHlwZSB7CkBAIC0yNzAsNyArMjA1LDYgQEAKIC8qCiAgKglWIEkgRCBFIE8gICBJIE0gQSBHIEUgICBGIE8gUiBNIEEgVAogICovCi0KIHN0cnVjdCB2NGwyX3BpeF9mb3JtYXQKIHsKIAlfX3UzMiAgICAgICAgIAkJd2lkdGg7CkBAIC0yODMsNyArMjE3LDcgQEAKIAlfX3UzMgkJCXByaXY7CQkvKiBwcml2YXRlIGRhdGEsIGRlcGVuZHMgb24gcGl4ZWxmb3JtYXQgKi8KIH07CiAKLS8qICAgICAgICAgICBQaXhlbCBmb3JtYXQgICAgRk9VUkNDICAgICAgICAgICAgICAgICAgZGVwdGggIERlc2NyaXB0aW9uICAgKi8KKy8qICAgICAgUGl4ZWwgZm9ybWF0ICAgICAgICAgRk9VUkNDICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGggIERlc2NyaXB0aW9uICAqLwogI2RlZmluZSBWNEwyX1BJWF9GTVRfUkdCMzMyICB2NGwyX2ZvdXJjYygnUicsJ0cnLCdCJywnMScpIC8qICA4ICBSR0ItMy0zLTIgICAgICovCiAjZGVmaW5lIFY0TDJfUElYX0ZNVF9SR0I1NTUgIHY0bDJfZm91cmNjKCdSJywnRycsJ0InLCdPJykgLyogMTYgIFJHQi01LTUtNSAgICAgKi8KICNkZWZpbmUgVjRMMl9QSVhfRk1UX1JHQjU2NSAgdjRsMl9mb3VyY2MoJ1InLCdHJywnQicsJ1AnKSAvKiAxNiAgUkdCLTUtNi01ICAgICAqLwpAQCAtMzExLDYgKzI0NSw3IEBACiAjZGVmaW5lIFY0TDJfUElYX0ZNVF9ZVVY0MjAgIHY0bDJfZm91cmNjKCdZJywnVScsJzEnLCcyJykgLyogMTIgIFlVViA0OjI6MCAgICAgKi8KICNkZWZpbmUgVjRMMl9QSVhfRk1UX1lZVVYgICAgdjRsMl9mb3VyY2MoJ1knLCdZJywnVScsJ1YnKSAvKiAxNiAgWVVWIDQ6MjoyICAgICAqLwogI2RlZmluZSBWNEwyX1BJWF9GTVRfSEkyNDAgICB2NGwyX2ZvdXJjYygnSCcsJ0knLCcyJywnNCcpIC8qICA4ICA4LWJpdCBjb2xvciAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9ITTEyICAgIHY0bDJfZm91cmNjKCdIJywnTScsJzEnLCcyJykgLyogIDggIFlVViA0OjE6MSAxNngxNiBtYWNyb2Jsb2NrcyAqLwogCiAvKiBzZWUgaHR0cDovL3d3dy5zaWxpY29uaW1hZ2luZy5jb20vUkdCJTIwQmF5ZXIuaHRtICovCiAjZGVmaW5lIFY0TDJfUElYX0ZNVF9TQkdHUjggIHY0bDJfZm91cmNjKCdCJywnQScsJzgnLCcxJykgLyogIDggIEJHQkcuLiBHUkdSLi4gKi8KQEAgLTMxOSw3ICsyNTQsNyBAQAogI2RlZmluZSBWNEwyX1BJWF9GTVRfTUpQRUcgICAgdjRsMl9mb3VyY2MoJ00nLCdKJywnUCcsJ0cnKSAvKiBNb3Rpb24tSlBFRyAgICovCiAjZGVmaW5lIFY0TDJfUElYX0ZNVF9KUEVHICAgICB2NGwyX2ZvdXJjYygnSicsJ1AnLCdFJywnRycpIC8qIEpGSUYgSlBFRyAgICAgKi8KICNkZWZpbmUgVjRMMl9QSVhfRk1UX0RWICAgICAgIHY0bDJfZm91cmNjKCdkJywndicsJ3MnLCdkJykgLyogMTM5NCAgICAgICAgICAqLwotI2RlZmluZSBWNEwyX1BJWF9GTVRfTVBFRyAgICAgdjRsMl9mb3VyY2MoJ00nLCdQJywnRScsJ0cnKSAvKiBNUEVHICAgICAgICAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9NUEVHICAgICB2NGwyX2ZvdXJjYygnTScsJ1AnLCdFJywnRycpIC8qIE1QRUctMS8yLzQgICAgKi8KIAogLyogIFZlbmRvci1zcGVjaWZpYyBmb3JtYXRzICAgKi8KICNkZWZpbmUgVjRMMl9QSVhfRk1UX1dOVkEgICAgIHY0bDJfZm91cmNjKCdXJywnTicsJ1YnLCdBJykgLyogV2lubm92IGh3IGNvbXByZXNzICovCkBAIC0zNDMsNyArMjc4LDYgQEAKIAogI2RlZmluZSBWNEwyX0ZNVF9GTEFHX0NPTVBSRVNTRUQgMHgwMDAxCiAKLQogLyoKICAqCVQgSSBNIEUgQyBPIEQgRQogICovCkBAIC0zNzMsMTYgKzMwNywxNSBAQAogI2RlZmluZSBWNEwyX1RDX1VTRVJCSVRTXzhCSVRDSEFSUwkweDAwMDgKIC8qIFRoZSBhYm92ZSBpcyBiYXNlZCBvbiBTTVBURSB0aW1lY29kZXMgKi8KIAotCisjaWZkZWYgX19LRVJORUxfXwogLyoKICAqCU0gUCBFIEcgICBDIE8gTSBQIFIgRSBTIFMgSSBPIE4gICBQIEEgUiBBIE0gRSBUIEUgUiBTCiAgKgotICogICMjIyBXQVJOSU5HOiB0aGlzIGlzIHN0aWxsIHdvcmstaW4tcHJvZ3Jlc3MgcmlnaHQgbm93LCBtb3N0IGxpa2VseQotICogICMjIyAgICAgICAgICB0aGVyZSB3aWxsIGJlIHNvbWUgaW5jb21wYXRpYmxlIGNoYW5nZXMuCisgKiAgIyMjIFdBUk5JTkc6IFRoaXMgZXhwZXJpbWVudGFsIE1QRUcgY29tcHJlc3Npb24gQVBJIGlzIG9ic29sZXRlLgorICogICMjIyAgICAgICAgICBJdCBpcyByZXBsYWNlZCBieSB0aGUgTVBFRyBjb250cm9scyBBUEkuCisgKiAgIyMjICAgICAgICAgIFRoaXMgb2xkIEFQSSB3aWxsIGRpc2FwcGVhciBpbiB0aGUgbmVhciBmdXR1cmUhCiAgKgogICovCi0KLQogZW51bSB2NGwyX2JpdHJhdGVfbW9kZSB7CiAJVjRMMl9CSVRSQVRFX05PTkUgPSAwLAkvKiBub3Qgc3BlY2lmaWVkICovCiAJVjRMMl9CSVRSQVRFX0NCUiwJLyogY29uc3RhbnQgYml0cmF0ZSAqLwpAQCAtNDYwLDYgKzM5Myw3IEBACiAJLyogSSBkb24ndCBleHBlY3QgdGhlIGFib3ZlIGJlaW5nIHBlcmZlY3QgeWV0IDspICovCiAJX191MzIJCQkJcmVzZXJ2ZWRfNVs4XTsKIH07CisjZW5kaWYKIAogc3RydWN0IHY0bDJfanBlZ2NvbXByZXNzaW9uCiB7CkBAIC00OTEsNyArNDI1LDYgQEAKIAkJCQkJKiBhbGx3YXlzIHVzZSBBUFAwICovCiB9OwogCi0KIC8qCiAgKglNIEUgTSBPIFIgWSAtIE0gQSBQIFAgSSBOIEcgICBCIFUgRiBGIEUgUiBTCiAgKi8KQEAgLTU3Myw3ICs1MDYsNiBAQAogCXZvaWQJCQlfX3VzZXIgKmJpdG1hcDsKIH07CiAKLQogLyoKICAqCUMgQSBQIFQgVSBSIEUgICBQIEEgUiBBIE0gRSBUIEUgUiBTCiAgKi8KQEAgLTU4Niw2ICs1MTgsNyBAQAogCV9fdTMyICAgICAgICAgICAgICByZWFkYnVmZmVyczsgICAvKiAgIyBvZiBidWZmZXJzIGZvciByZWFkICovCiAJX191MzIJCSAgIHJlc2VydmVkWzRdOwogfTsKKwogLyogIEZsYWdzIGZvciAnY2FwYWJpbGl0eScgYW5kICdjYXB0dXJlbW9kZScgZmllbGRzICovCiAjZGVmaW5lIFY0TDJfTU9ERV9ISUdIUVVBTElUWQkweDAwMDEJLyogIEhpZ2ggcXVhbGl0eSBpbWFnaW5nIG1vZGUgKi8KICNkZWZpbmUgVjRMMl9DQVBfVElNRVBFUkZSQU1FCTB4MTAwMAkvKiAgdGltZXBlcmZyYW1lIGZpZWxkIGlzIHN1cHBvcnRlZCAqLwpAQCAtNjAzLDcgKzUzNiw2IEBACiAvKgogICoJSSBOIFAgVSBUICAgSSBNIEEgRyBFICAgQyBSIE8gUCBQIEkgTiBHCiAgKi8KLQogc3RydWN0IHY0bDJfY3JvcGNhcCB7CiAJZW51bSB2NGwyX2J1Zl90eXBlICAgICAgdHlwZTsKIAlzdHJ1Y3QgdjRsMl9yZWN0ICAgICAgICBib3VuZHM7CkBAIC03MTAsNyArNjQyLDYgQEAKIAlfX3UzMgkJICAgICByZXNlcnZlZFs0XTsKIH07CiAKLQogLyoKICAqCVYgSSBEIEUgTyAgIEkgTiBQIFUgVCBTCiAgKi8KQEAgLTcyNSw2ICs2NTYsNyBAQAogCV9fdTMyCSAgICAgc3RhdHVzOwogCV9fdTMyCSAgICAgcmVzZXJ2ZWRbNF07CiB9OworCiAvKiAgVmFsdWVzIGZvciB0aGUgJ3R5cGUnIGZpZWxkICovCiAjZGVmaW5lIFY0TDJfSU5QVVRfVFlQRV9UVU5FUgkJMQogI2RlZmluZSBWNEwyX0lOUFVUX1RZUEVfQ0FNRVJBCQkyCkBAIC03NzUsNiArNzA3LDM0IEBACiAJX19zMzIJCSAgICAgdmFsdWU7CiB9OwogCitzdHJ1Y3QgdjRsMl9leHRfY29udHJvbAoreworCV9fdTMyIGlkOworCV9fdTMyIHJlc2VydmVkMlsyXTsKKwl1bmlvbiB7CisJCV9fczMyIHZhbHVlOworCQlfX3M2NCB2YWx1ZTY0OworCQl2b2lkICpyZXNlcnZlZDsKKwl9OworfTsKKworc3RydWN0IHY0bDJfZXh0X2NvbnRyb2xzCit7CisJX191MzIgY3RybF9jbGFzczsKKwlfX3UzMiBjb3VudDsKKwlfX3UzMiBlcnJvcl9pZHg7CisJX191MzIgcmVzZXJ2ZWRbMl07CisJc3RydWN0IHY0bDJfZXh0X2NvbnRyb2wgKmNvbnRyb2xzOworfTsKKworLyogIFZhbHVlcyBmb3IgY3RybF9jbGFzcyBmaWVsZCAqLworI2RlZmluZSBWNEwyX0NUUkxfQ0xBU1NfVVNFUiAweDAwOTgwMDAwCS8qIE9sZC1zdHlsZSAndXNlcicgY29udHJvbHMgKi8KKyNkZWZpbmUgVjRMMl9DVFJMX0NMQVNTX01QRUcgMHgwMDk5MDAwMAkvKiBNUEVHLWNvbXByZXNzaW9uIGNvbnRyb2xzICovCisKKyNkZWZpbmUgVjRMMl9DVFJMX0lEX01BU0sgICAgICAJICAoMHgwZmZmZmZmZikKKyNkZWZpbmUgVjRMMl9DVFJMX0lEMkNMQVNTKGlkKSAgICAoKGlkKSAmIDB4MGZmZjAwMDBVTCkKKyNkZWZpbmUgVjRMMl9DVFJMX0RSSVZFUl9QUklWKGlkKSAoKChpZCkgJiAweGZmZmYpID49IDB4MTAwMCkKKwogLyogIFVzZWQgaW4gdGhlIFZJRElPQ19RVUVSWUNUUkwgaW9jdGwgZm9yIHF1ZXJ5aW5nIGNvbnRyb2xzICovCiBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwKIHsKQEAgLTgwMSwxMiArNzYxLDIxIEBACiAvKiAgQ29udHJvbCBmbGFncyAgKi8KICNkZWZpbmUgVjRMMl9DVFJMX0ZMQUdfRElTQUJMRUQJCTB4MDAwMQogI2RlZmluZSBWNEwyX0NUUkxfRkxBR19HUkFCQkVECQkweDAwMDIKKyNkZWZpbmUgVjRMMl9DVFJMX0ZMQUdfUkVBRF9PTkxZIAkweDAwMDQKKyNkZWZpbmUgVjRMMl9DVFJMX0ZMQUdfVVBEQVRFIAkJMHgwMDA4CisjZGVmaW5lIFY0TDJfQ1RSTF9GTEFHX0lOQUNUSVZFIAkweDAwMTAKKyNkZWZpbmUgVjRMMl9DVFJMX0ZMQUdfU0xJREVSIAkJMHgwMDIwCiAKLS8qICBDb250cm9sIElEcyBkZWZpbmVkIGJ5IFY0TDIgKi8KLSNkZWZpbmUgVjRMMl9DSURfQkFTRQkJCTB4MDA5ODA5MDAKKy8qICBRdWVyeSBmbGFnLCB0byBiZSBPUmVkIHdpdGggdGhlIGNvbnRyb2wgSUQgKi8KKyNkZWZpbmUgVjRMMl9DVFJMX0ZMQUdfTkVYVF9DVFJMCTB4ODAwMDAwMDAKKworLyogIFVzZXItY2xhc3MgY29udHJvbCBJRHMgZGVmaW5lZCBieSBWNEwyICovCisjZGVmaW5lIFY0TDJfQ0lEX0JBU0UJCQkoVjRMMl9DVFJMX0NMQVNTX1VTRVIgfCAweDkwMCkKKyNkZWZpbmUgVjRMMl9DSURfVVNFUl9CQVNFIAkJVjRMMl9DSURfQkFTRQogLyogIElEcyByZXNlcnZlZCBmb3IgZHJpdmVyIHNwZWNpZmljIGNvbnRyb2xzICovCiAjZGVmaW5lIFY0TDJfQ0lEX1BSSVZBVEVfQkFTRQkJMHgwODAwMDAwMAogCisjZGVmaW5lIFY0TDJfQ0lEX1VTRVJfQ0xBU1MgCQkoVjRMMl9DVFJMX0NMQVNTX1VTRVIgfCAxKQogI2RlZmluZSBWNEwyX0NJRF9CUklHSFRORVNTCQkoVjRMMl9DSURfQkFTRSswKQogI2RlZmluZSBWNEwyX0NJRF9DT05UUkFTVAkJKFY0TDJfQ0lEX0JBU0UrMSkKICNkZWZpbmUgVjRMMl9DSURfU0FUVVJBVElPTgkJKFY0TDJfQ0lEX0JBU0UrMikKQEAgLTgzMyw2ICs4MDIsMTg4IEBACiAjZGVmaW5lIFY0TDJfQ0lEX1ZDRU5URVIJCShWNEwyX0NJRF9CQVNFKzIzKQogI2RlZmluZSBWNEwyX0NJRF9MQVNUUDEJCQkoVjRMMl9DSURfQkFTRSsyNCkgLyogbGFzdCBDSUQgKyAxICovCiAKKy8qICBNUEVHLWNsYXNzIGNvbnRyb2wgSURzIGRlZmluZWQgYnkgVjRMMiAqLworI2RlZmluZSBWNEwyX0NJRF9NUEVHX0JBU0UgCQkJKFY0TDJfQ1RSTF9DTEFTU19NUEVHIHwgMHg5MDApCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQ0xBU1MgCQkJKFY0TDJfQ1RSTF9DTEFTU19NUEVHIHwgMSkKKworLyogIE1QRUcgc3RyZWFtcyAqLworI2RlZmluZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9UWVBFIAkJKFY0TDJfQ0lEX01QRUdfQkFTRSswKQorZW51bSB2NGwyX21wZWdfc3RyZWFtX3R5cGUgeworCVY0TDJfTVBFR19TVFJFQU1fVFlQRV9NUEVHMl9QUyAgID0gMCwgLyogTVBFRy0yIHByb2dyYW0gc3RyZWFtICovCisJVjRMMl9NUEVHX1NUUkVBTV9UWVBFX01QRUcyX1RTICAgPSAxLCAvKiBNUEVHLTIgdHJhbnNwb3J0IHN0cmVhbSAqLworCVY0TDJfTVBFR19TVFJFQU1fVFlQRV9NUEVHMV9TUyAgID0gMiwgLyogTVBFRy0xIHN5c3RlbSBzdHJlYW0gKi8KKwlWNEwyX01QRUdfU1RSRUFNX1RZUEVfTVBFRzJfRFZEICA9IDMsIC8qIE1QRUctMiBEVkQtY29tcGF0aWJsZSBzdHJlYW0gKi8KKwlWNEwyX01QRUdfU1RSRUFNX1RZUEVfTVBFRzFfVkNEICA9IDQsIC8qIE1QRUctMSBWQ0QtY29tcGF0aWJsZSBzdHJlYW0gKi8KKwlWNEwyX01QRUdfU1RSRUFNX1RZUEVfTVBFRzJfU1ZDRCA9IDUsIC8qIE1QRUctMiBTVkNELWNvbXBhdGlibGUgc3RyZWFtICovCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9QSURfUE1UIAkJKFY0TDJfQ0lEX01QRUdfQkFTRSsxKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9QSURfQVVESU8gCQkoVjRMMl9DSURfTVBFR19CQVNFKzIpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1BJRF9WSURFTyAJCShWNEwyX0NJRF9NUEVHX0JBU0UrMykKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19TVFJFQU1fUElEX1BDUiAJCShWNEwyX0NJRF9NUEVHX0JBU0UrNCkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19TVFJFQU1fUEVTX0lEX0FVRElPIAkoVjRMMl9DSURfTVBFR19CQVNFKzUpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1BFU19JRF9WSURFTyAJKFY0TDJfQ0lEX01QRUdfQkFTRSs2KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9WQklfRk1UIAkJKFY0TDJfQ0lEX01QRUdfQkFTRSs3KQorZW51bSB2NGwyX21wZWdfc3RyZWFtX3ZiaV9mbXQgeworCVY0TDJfTVBFR19TVFJFQU1fVkJJX0ZNVF9OT05FID0gMCwgIC8qIE5vIFZCSSBpbiB0aGUgTVBFRyBzdHJlYW0gKi8KKwlWNEwyX01QRUdfU1RSRUFNX1ZCSV9GTVRfSVZUViA9IDEsICAvKiBWQkkgaW4gcHJpdmF0ZSBwYWNrZXRzLCBJVlRWIGZvcm1hdCAqLworfTsKKworLyogIE1QRUcgYXVkaW8gKi8KKyNkZWZpbmUgVjRMMl9DSURfTVBFR19BVURJT19TQU1QTElOR19GUkVRIAkoVjRMMl9DSURfTVBFR19CQVNFKzEwMCkKK2VudW0gdjRsMl9tcGVnX2F1ZGlvX3NhbXBsaW5nX2ZyZXEgeworCVY0TDJfTVBFR19BVURJT19TQU1QTElOR19GUkVRXzQ0MTAwID0gMCwKKwlWNEwyX01QRUdfQVVESU9fU0FNUExJTkdfRlJFUV80ODAwMCA9IDEsCisJVjRMMl9NUEVHX0FVRElPX1NBTVBMSU5HX0ZSRVFfMzIwMDAgPSAyLAorfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19BVURJT19FTkNPRElORyAJCShWNEwyX0NJRF9NUEVHX0JBU0UrMTAxKQorZW51bSB2NGwyX21wZWdfYXVkaW9fZW5jb2RpbmcgeworCVY0TDJfTVBFR19BVURJT19FTkNPRElOR19MQVlFUl8xID0gMCwKKwlWNEwyX01QRUdfQVVESU9fRU5DT0RJTkdfTEFZRVJfMiA9IDEsCisJVjRMMl9NUEVHX0FVRElPX0VOQ09ESU5HX0xBWUVSXzMgPSAyLAorfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19BVURJT19MMV9CSVRSQVRFIAkJKFY0TDJfQ0lEX01QRUdfQkFTRSsxMDIpCitlbnVtIHY0bDJfbXBlZ19hdWRpb19sMV9iaXRyYXRlIHsKKwlWNEwyX01QRUdfQVVESU9fTDFfQklUUkFURV8zMksgID0gMCwKKwlWNEwyX01QRUdfQVVESU9fTDFfQklUUkFURV82NEsgID0gMSwKKwlWNEwyX01QRUdfQVVESU9fTDFfQklUUkFURV85NksgID0gMiwKKwlWNEwyX01QRUdfQVVESU9fTDFfQklUUkFURV8xMjhLID0gMywKKwlWNEwyX01QRUdfQVVESU9fTDFfQklUUkFURV8xNjBLID0gNCwKKwlWNEwyX01QRUdfQVVESU9fTDFfQklUUkFURV8xOTJLID0gNSwKKwlWNEwyX01QRUdfQVVESU9fTDFfQklUUkFURV8yMjRLID0gNiwKKwlWNEwyX01QRUdfQVVESU9fTDFfQklUUkFURV8yNTZLID0gNywKKwlWNEwyX01QRUdfQVVESU9fTDFfQklUUkFURV8yODhLID0gOCwKKwlWNEwyX01QRUdfQVVESU9fTDFfQklUUkFURV8zMjBLID0gOSwKKwlWNEwyX01QRUdfQVVESU9fTDFfQklUUkFURV8zNTJLID0gMTAsCisJVjRMMl9NUEVHX0FVRElPX0wxX0JJVFJBVEVfMzg0SyA9IDExLAorCVY0TDJfTVBFR19BVURJT19MMV9CSVRSQVRFXzQxNksgPSAxMiwKKwlWNEwyX01QRUdfQVVESU9fTDFfQklUUkFURV80NDhLID0gMTMsCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX0FVRElPX0wyX0JJVFJBVEUgCQkoVjRMMl9DSURfTVBFR19CQVNFKzEwMykKK2VudW0gdjRsMl9tcGVnX2F1ZGlvX2wyX2JpdHJhdGUgeworCVY0TDJfTVBFR19BVURJT19MMl9CSVRSQVRFXzMySyAgPSAwLAorCVY0TDJfTVBFR19BVURJT19MMl9CSVRSQVRFXzQ4SyAgPSAxLAorCVY0TDJfTVBFR19BVURJT19MMl9CSVRSQVRFXzU2SyAgPSAyLAorCVY0TDJfTVBFR19BVURJT19MMl9CSVRSQVRFXzY0SyAgPSAzLAorCVY0TDJfTVBFR19BVURJT19MMl9CSVRSQVRFXzgwSyAgPSA0LAorCVY0TDJfTVBFR19BVURJT19MMl9CSVRSQVRFXzk2SyAgPSA1LAorCVY0TDJfTVBFR19BVURJT19MMl9CSVRSQVRFXzExMksgPSA2LAorCVY0TDJfTVBFR19BVURJT19MMl9CSVRSQVRFXzEyOEsgPSA3LAorCVY0TDJfTVBFR19BVURJT19MMl9CSVRSQVRFXzE2MEsgPSA4LAorCVY0TDJfTVBFR19BVURJT19MMl9CSVRSQVRFXzE5MksgPSA5LAorCVY0TDJfTVBFR19BVURJT19MMl9CSVRSQVRFXzIyNEsgPSAxMCwKKwlWNEwyX01QRUdfQVVESU9fTDJfQklUUkFURV8yNTZLID0gMTEsCisJVjRMMl9NUEVHX0FVRElPX0wyX0JJVFJBVEVfMzIwSyA9IDEyLAorCVY0TDJfTVBFR19BVURJT19MMl9CSVRSQVRFXzM4NEsgPSAxMywKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQVVESU9fTDNfQklUUkFURSAJCShWNEwyX0NJRF9NUEVHX0JBU0UrMTA0KQorZW51bSB2NGwyX21wZWdfYXVkaW9fbDNfYml0cmF0ZSB7CisJVjRMMl9NUEVHX0FVRElPX0wzX0JJVFJBVEVfMzJLICA9IDAsCisJVjRMMl9NUEVHX0FVRElPX0wzX0JJVFJBVEVfNDBLICA9IDEsCisJVjRMMl9NUEVHX0FVRElPX0wzX0JJVFJBVEVfNDhLICA9IDIsCisJVjRMMl9NUEVHX0FVRElPX0wzX0JJVFJBVEVfNTZLICA9IDMsCisJVjRMMl9NUEVHX0FVRElPX0wzX0JJVFJBVEVfNjRLICA9IDQsCisJVjRMMl9NUEVHX0FVRElPX0wzX0JJVFJBVEVfODBLICA9IDUsCisJVjRMMl9NUEVHX0FVRElPX0wzX0JJVFJBVEVfOTZLICA9IDYsCisJVjRMMl9NUEVHX0FVRElPX0wzX0JJVFJBVEVfMTEySyA9IDcsCisJVjRMMl9NUEVHX0FVRElPX0wzX0JJVFJBVEVfMTI4SyA9IDgsCisJVjRMMl9NUEVHX0FVRElPX0wzX0JJVFJBVEVfMTYwSyA9IDksCisJVjRMMl9NUEVHX0FVRElPX0wzX0JJVFJBVEVfMTkySyA9IDEwLAorCVY0TDJfTVBFR19BVURJT19MM19CSVRSQVRFXzIyNEsgPSAxMSwKKwlWNEwyX01QRUdfQVVESU9fTDNfQklUUkFURV8yNTZLID0gMTIsCisJVjRMMl9NUEVHX0FVRElPX0wzX0JJVFJBVEVfMzIwSyA9IDEzLAorfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19BVURJT19NT0RFIAkJKFY0TDJfQ0lEX01QRUdfQkFTRSsxMDUpCitlbnVtIHY0bDJfbXBlZ19hdWRpb19tb2RlIHsKKwlWNEwyX01QRUdfQVVESU9fTU9ERV9TVEVSRU8gICAgICAgPSAwLAorCVY0TDJfTVBFR19BVURJT19NT0RFX0pPSU5UX1NURVJFTyA9IDEsCisJVjRMMl9NUEVHX0FVRElPX01PREVfRFVBTCAgICAgICAgID0gMiwKKwlWNEwyX01QRUdfQVVESU9fTU9ERV9NT05PICAgICAgICAgPSAzLAorfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19BVURJT19NT0RFX0VYVEVOU0lPTiAJKFY0TDJfQ0lEX01QRUdfQkFTRSsxMDYpCitlbnVtIHY0bDJfbXBlZ19hdWRpb19tb2RlX2V4dGVuc2lvbiB7CisJVjRMMl9NUEVHX0FVRElPX01PREVfRVhURU5TSU9OX0JPVU5EXzQgID0gMCwKKwlWNEwyX01QRUdfQVVESU9fTU9ERV9FWFRFTlNJT05fQk9VTkRfOCAgPSAxLAorCVY0TDJfTVBFR19BVURJT19NT0RFX0VYVEVOU0lPTl9CT1VORF8xMiA9IDIsCisJVjRMMl9NUEVHX0FVRElPX01PREVfRVhURU5TSU9OX0JPVU5EXzE2ID0gMywKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQVVESU9fRU1QSEFTSVMgCQkoVjRMMl9DSURfTVBFR19CQVNFKzEwNykKK2VudW0gdjRsMl9tcGVnX2F1ZGlvX2VtcGhhc2lzIHsKKwlWNEwyX01QRUdfQVVESU9fRU1QSEFTSVNfTk9ORSAgICAgICAgID0gMCwKKwlWNEwyX01QRUdfQVVESU9fRU1QSEFTSVNfNTBfRElWXzE1X3VTID0gMSwKKwlWNEwyX01QRUdfQVVESU9fRU1QSEFTSVNfQ0NJVFRfSjE3ICAgID0gMiwKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQVVESU9fQ1JDIAkJKFY0TDJfQ0lEX01QRUdfQkFTRSsxMDgpCitlbnVtIHY0bDJfbXBlZ19hdWRpb19jcmMgeworCVY0TDJfTVBFR19BVURJT19DUkNfTk9ORSAgPSAwLAorCVY0TDJfTVBFR19BVURJT19DUkNfQ1JDMTYgPSAxLAorfTsKKworLyogIE1QRUcgdmlkZW8gKi8KKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19FTkNPRElORyAJCShWNEwyX0NJRF9NUEVHX0JBU0UrMjAwKQorZW51bSB2NGwyX21wZWdfdmlkZW9fZW5jb2RpbmcgeworCVY0TDJfTVBFR19WSURFT19FTkNPRElOR19NUEVHXzEgPSAwLAorCVY0TDJfTVBFR19WSURFT19FTkNPRElOR19NUEVHXzIgPSAxLAorfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19BU1BFQ1QgCQkoVjRMMl9DSURfTVBFR19CQVNFKzIwMSkKK2VudW0gdjRsMl9tcGVnX3ZpZGVvX2FzcGVjdCB7CisJVjRMMl9NUEVHX1ZJREVPX0FTUEVDVF8xeDEgICAgID0gMCwKKwlWNEwyX01QRUdfVklERU9fQVNQRUNUXzR4MyAgICAgPSAxLAorCVY0TDJfTVBFR19WSURFT19BU1BFQ1RfMTZ4OSAgICA9IDIsCisJVjRMMl9NUEVHX1ZJREVPX0FTUEVDVF8yMjF4MTAwID0gMywKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fQl9GUkFNRVMgCQkoVjRMMl9DSURfTVBFR19CQVNFKzIwMikKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19HT1BfU0laRSAJCShWNEwyX0NJRF9NUEVHX0JBU0UrMjAzKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0dPUF9DTE9TVVJFIAkoVjRMMl9DSURfTVBFR19CQVNFKzIwNCkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19QVUxMRE9XTiAJCShWNEwyX0NJRF9NUEVHX0JBU0UrMjA1KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0JJVFJBVEVfTU9ERSAJKFY0TDJfQ0lEX01QRUdfQkFTRSsyMDYpCitlbnVtIHY0bDJfbXBlZ192aWRlb19iaXRyYXRlX21vZGUgeworCVY0TDJfTVBFR19WSURFT19CSVRSQVRFX01PREVfVkJSID0gMCwKKwlWNEwyX01QRUdfVklERU9fQklUUkFURV9NT0RFX0NCUiA9IDEsCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0JJVFJBVEUgCQkoVjRMMl9DSURfTVBFR19CQVNFKzIwNykKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19CSVRSQVRFX1BFQUsgCShWNEwyX0NJRF9NUEVHX0JBU0UrMjA4KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX1RFTVBPUkFMX0RFQ0lNQVRJT04gKFY0TDJfQ0lEX01QRUdfQkFTRSsyMDkpCisKKy8qICBNUEVHLWNsYXNzIGNvbnRyb2wgSURzIHNwZWNpZmljIHRvIHRoZSBDWDI1ODR4IGRyaXZlciBhcyBkZWZpbmVkIGJ5IFY0TDIgKi8KKyNkZWZpbmUgVjRMMl9DSURfTVBFR19DWDIzNDFYX0JBU0UgCQkJCShWNEwyX0NUUkxfQ0xBU1NfTVBFRyB8IDB4MTAwMCkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX1NQQVRJQUxfRklMVEVSX01PREUgCShWNEwyX0NJRF9NUEVHX0NYMjM0MVhfQkFTRSswKQorZW51bSB2NGwyX21wZWdfY3gyMzQxeF92aWRlb19zcGF0aWFsX2ZpbHRlcl9tb2RlIHsKKwlWNEwyX01QRUdfQ1gyMzQxWF9WSURFT19TUEFUSUFMX0ZJTFRFUl9NT0RFX01BTlVBTCA9IDAsCisJVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fU1BBVElBTF9GSUxURVJfTU9ERV9BVVRPICAgPSAxLAorfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX1NQQVRJQUxfRklMVEVSIAkJKFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9CQVNFKzEpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19MVU1BX1NQQVRJQUxfRklMVEVSX1RZUEUgCShWNEwyX0NJRF9NUEVHX0NYMjM0MVhfQkFTRSsyKQorZW51bSB2NGwyX21wZWdfY3gyMzQxeF92aWRlb19sdW1hX3NwYXRpYWxfZmlsdGVyX3R5cGUgeworCVY0TDJfTVBFR19DWDIzNDFYX1ZJREVPX0xVTUFfU1BBVElBTF9GSUxURVJfVFlQRV9PRkYgICAgICAgICAgICAgICAgICA9IDAsCisJVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fTFVNQV9TUEFUSUFMX0ZJTFRFUl9UWVBFXzFEX0hPUiAgICAgICAgICAgICAgID0gMSwKKwlWNEwyX01QRUdfQ1gyMzQxWF9WSURFT19MVU1BX1NQQVRJQUxfRklMVEVSX1RZUEVfMURfVkVSVCAgICAgICAgICAgICAgPSAyLAorCVY0TDJfTVBFR19DWDIzNDFYX1ZJREVPX0xVTUFfU1BBVElBTF9GSUxURVJfVFlQRV8yRF9IVl9TRVBBUkFCTEUgICAgICA9IDMsCisJVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fTFVNQV9TUEFUSUFMX0ZJTFRFUl9UWVBFXzJEX1NZTV9OT05fU0VQQVJBQkxFID0gNCwKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19DSFJPTUFfU1BBVElBTF9GSUxURVJfVFlQRSAJKFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9CQVNFKzMpCitlbnVtIHY0bDJfbXBlZ19jeDIzNDF4X3ZpZGVvX2Nocm9tYV9zcGF0aWFsX2ZpbHRlcl90eXBlIHsKKwlWNEwyX01QRUdfQ1gyMzQxWF9WSURFT19DSFJPTUFfU1BBVElBTF9GSUxURVJfVFlQRV9PRkYgICAgPSAwLAorCVY0TDJfTVBFR19DWDIzNDFYX1ZJREVPX0NIUk9NQV9TUEFUSUFMX0ZJTFRFUl9UWVBFXzFEX0hPUiA9IDEsCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fVEVNUE9SQUxfRklMVEVSX01PREUgCShWNEwyX0NJRF9NUEVHX0NYMjM0MVhfQkFTRSs0KQorZW51bSB2NGwyX21wZWdfY3gyMzQxeF92aWRlb190ZW1wb3JhbF9maWx0ZXJfbW9kZSB7CisJVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fVEVNUE9SQUxfRklMVEVSX01PREVfTUFOVUFMID0gMCwKKwlWNEwyX01QRUdfQ1gyMzQxWF9WSURFT19URU1QT1JBTF9GSUxURVJfTU9ERV9BVVRPICAgPSAxLAorfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX1RFTVBPUkFMX0ZJTFRFUiAJCShWNEwyX0NJRF9NUEVHX0NYMjM0MVhfQkFTRSs1KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fTUVESUFOX0ZJTFRFUl9UWVBFIAkJKFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9CQVNFKzYpCitlbnVtIHY0bDJfbXBlZ19jeDIzNDF4X3ZpZGVvX21lZGlhbl9maWx0ZXJfdHlwZSB7CisJVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fTUVESUFOX0ZJTFRFUl9UWVBFX09GRiAgICAgID0gMCwKKwlWNEwyX01QRUdfQ1gyMzQxWF9WSURFT19NRURJQU5fRklMVEVSX1RZUEVfSE9SICAgICAgPSAxLAorCVY0TDJfTVBFR19DWDIzNDFYX1ZJREVPX01FRElBTl9GSUxURVJfVFlQRV9WRVJUICAgICA9IDIsCisJVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fTUVESUFOX0ZJTFRFUl9UWVBFX0hPUl9WRVJUID0gMywKKwlWNEwyX01QRUdfQ1gyMzQxWF9WSURFT19NRURJQU5fRklMVEVSX1RZUEVfRElBRyAgICAgPSA0LAorfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX0xVTUFfTUVESUFOX0ZJTFRFUl9CT1RUT00gCShWNEwyX0NJRF9NUEVHX0NYMjM0MVhfQkFTRSs3KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fTFVNQV9NRURJQU5fRklMVEVSX1RPUCAJKFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9CQVNFKzgpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19DSFJPTUFfTUVESUFOX0ZJTFRFUl9CT1RUT00JKFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9CQVNFKzkpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19DSFJPTUFfTUVESUFOX0ZJTFRFUl9UT1AgCShWNEwyX0NJRF9NUEVHX0NYMjM0MVhfQkFTRSsxMCkKKwogLyoKICAqCVQgVSBOIEkgTiBHCiAgKi8KQEAgLTkwNCw2ICsxMDU1LDcgQEAKIAlfX3UzMgltb2RlOwogCV9fdTMyCXJlc2VydmVkWzJdOwogfTsKKwogLyogIEZsYWdzIGZvciB0aGUgJ2NhcGFiaWxpdHknIGZpZWxkICovCiAjZGVmaW5lIFY0TDJfQVVEQ0FQX1NURVJFTwkJMHgwMDAwMQogI2RlZmluZSBWNEwyX0FVRENBUF9BVkwJCQkweDAwMDAyCkBAIC05MjcsNyArMTA3OSw2IEBACiAgKi8KIAogLyogUmF3IFZCSSAqLwotCiBzdHJ1Y3QgdjRsMl92YmlfZm9ybWF0CiB7CiAJX191MzIJc2FtcGxpbmdfcmF0ZTsJCS8qIGluIDEgSHogKi8KQEAgLTEwMzQsOCArMTE4NSw2IEBACiAJfSBwYXJtOwogfTsKIAotCi0KIC8qCiAgKglJIE8gQyBUIEwgICBDIE8gRCBFIFMgICBGIE8gUiAgIFYgSSBEIEUgTyAgIEQgRSBWIEkgQyBFIFMKICAqCkBAIC0xMDQ1LDggKzExOTQsMTAgQEAKICNkZWZpbmUgVklESU9DX0VOVU1fRk1UICAgICAgICAgX0lPV1IgKCdWJywgIDIsIHN0cnVjdCB2NGwyX2ZtdGRlc2MpCiAjZGVmaW5lIFZJRElPQ19HX0ZNVAkJX0lPV1IgKCdWJywgIDQsIHN0cnVjdCB2NGwyX2Zvcm1hdCkKICNkZWZpbmUgVklESU9DX1NfRk1UCQlfSU9XUiAoJ1YnLCAgNSwgc3RydWN0IHY0bDJfZm9ybWF0KQorI2lmZGVmIF9fS0VSTkVMX18KICNkZWZpbmUgVklESU9DX0dfTVBFR0NPTVAgICAgICAgX0lPUiAgKCdWJywgIDYsIHN0cnVjdCB2NGwyX21wZWdfY29tcHJlc3Npb24pCiAjZGVmaW5lIFZJRElPQ19TX01QRUdDT01QICAgICAJX0lPVyAgKCdWJywgIDcsIHN0cnVjdCB2NGwyX21wZWdfY29tcHJlc3Npb24pCisjZW5kaWYKICNkZWZpbmUgVklESU9DX1JFUUJVRlMJCV9JT1dSICgnVicsICA4LCBzdHJ1Y3QgdjRsMl9yZXF1ZXN0YnVmZmVycykKICNkZWZpbmUgVklESU9DX1FVRVJZQlVGCQlfSU9XUiAoJ1YnLCAgOSwgc3RydWN0IHY0bDJfYnVmZmVyKQogI2RlZmluZSBWSURJT0NfR19GQlVGCQlfSU9SICAoJ1YnLCAxMCwgc3RydWN0IHY0bDJfZnJhbWVidWZmZXIpCkBAIC0xMDk2LDcgKzEyNDcsMTEgQEAKICNkZWZpbmUgVklESU9DX0dfU0xJQ0VEX1ZCSV9DQVAgX0lPUiAgKCdWJywgNjksIHN0cnVjdCB2NGwyX3NsaWNlZF92YmlfY2FwKQogI2VuZGlmCiAjZGVmaW5lIFZJRElPQ19MT0dfU1RBVFVTICAgICAgIF9JTyAgICgnVicsIDcwKQorI2RlZmluZSBWSURJT0NfR19FWFRfQ1RSTFMJX0lPV1IgKCdWJywgNzEsIHN0cnVjdCB2NGwyX2V4dF9jb250cm9scykKKyNkZWZpbmUgVklESU9DX1NfRVhUX0NUUkxTCV9JT1dSICgnVicsIDcyLCBzdHJ1Y3QgdjRsMl9leHRfY29udHJvbHMpCisjZGVmaW5lIFZJRElPQ19UUllfRVhUX0NUUkxTCV9JT1dSICgnVicsIDczLCBzdHJ1Y3QgdjRsMl9leHRfY29udHJvbHMpCiAKKyNpZmRlZiBfX09MRF9WSURJT0NfCiAvKiBmb3IgY29tcGF0aWJpbGl0eSwgd2lsbCBnbyBhd2F5IHNvbWUgZGF5ICovCiAjZGVmaW5lIFZJRElPQ19PVkVSTEFZX09MRCAgICAgCV9JT1dSICgnVicsIDE0LCBpbnQpCiAjZGVmaW5lIFZJRElPQ19TX1BBUk1fT0xEICAgICAgCV9JT1cgICgnVicsIDIyLCBzdHJ1Y3QgdjRsMl9zdHJlYW1wYXJtKQpAQCAtMTEwNCw1NyArMTI1OSwxMCBAQAogI2RlZmluZSBWSURJT0NfR19BVURJT19PTEQgICAgIAlfSU9XUiAoJ1YnLCAzMywgc3RydWN0IHY0bDJfYXVkaW8pCiAjZGVmaW5lIFZJRElPQ19HX0FVRE9VVF9PTEQgICAgCV9JT1dSICgnVicsIDQ5LCBzdHJ1Y3QgdjRsMl9hdWRpb291dCkKICNkZWZpbmUgVklESU9DX0NST1BDQVBfT0xEICAgICAJX0lPUiAgKCdWJywgNTgsIHN0cnVjdCB2NGwyX2Nyb3BjYXApCisjZW5kaWYKIAogI2RlZmluZSBCQVNFX1ZJRElPQ19QUklWQVRFCTE5MgkJLyogMTkyLTI1NSBhcmUgcHJpdmF0ZSAqLwogCi0KLSNpZmRlZiBfX0tFUk5FTF9fCi0vKgotICoKLSAqCVYgNCBMIDIgICBEIFIgSSBWIEUgUiAgIEggRSBMIFAgRSBSICAgQSBQIEkKLSAqCi0gKglTb21lIGNvbW1vbmx5IG5lZWRlZCBmdW5jdGlvbnMgZm9yIGRyaXZlcnMgKHY0bDItY29tbW9uLm8gbW9kdWxlKQotICovCi0jaW5jbHVkZSA8bGludXgvZnMuaD4KLQotLyogIFZpZGVvIHN0YW5kYXJkIGZ1bmN0aW9ucyAgKi8KLWV4dGVybiB1bnNpZ25lZCBpbnQgdjRsMl92aWRlb19zdGRfZnBzKHN0cnVjdCB2NGwyX3N0YW5kYXJkICp2cyk7Ci1leHRlcm4gaW50IHY0bDJfdmlkZW9fc3RkX2NvbnN0cnVjdChzdHJ1Y3QgdjRsMl9zdGFuZGFyZCAqdnMsCi0JCQkJICAgIGludCBpZCwgY2hhciAqbmFtZSk7Ci0KLS8qIHByb3JpdHkgaGFuZGxpbmcgKi8KLXN0cnVjdCB2NGwyX3ByaW9fc3RhdGUgewotCWF0b21pY190IHByaW9zWzRdOwotfTsKLWludCB2NGwyX3ByaW9faW5pdChzdHJ1Y3QgdjRsMl9wcmlvX3N0YXRlICpnbG9iYWwpOwotaW50IHY0bDJfcHJpb19jaGFuZ2Uoc3RydWN0IHY0bDJfcHJpb19zdGF0ZSAqZ2xvYmFsLCBlbnVtIHY0bDJfcHJpb3JpdHkgKmxvY2FsLAotCQkgICAgIGVudW0gdjRsMl9wcmlvcml0eSBuZXcpOwotaW50IHY0bDJfcHJpb19vcGVuKHN0cnVjdCB2NGwyX3ByaW9fc3RhdGUgKmdsb2JhbCwgZW51bSB2NGwyX3ByaW9yaXR5ICpsb2NhbCk7Ci1pbnQgdjRsMl9wcmlvX2Nsb3NlKHN0cnVjdCB2NGwyX3ByaW9fc3RhdGUgKmdsb2JhbCwgZW51bSB2NGwyX3ByaW9yaXR5ICpsb2NhbCk7Ci1lbnVtIHY0bDJfcHJpb3JpdHkgdjRsMl9wcmlvX21heChzdHJ1Y3QgdjRsMl9wcmlvX3N0YXRlICpnbG9iYWwpOwotaW50IHY0bDJfcHJpb19jaGVjayhzdHJ1Y3QgdjRsMl9wcmlvX3N0YXRlICpnbG9iYWwsIGVudW0gdjRsMl9wcmlvcml0eSAqbG9jYWwpOwotCi0vKiBuYW1lcyBmb3IgZmFuY3kgZGVidWcgb3V0cHV0ICovCi1leHRlcm4gY2hhciAqdjRsMl9maWVsZF9uYW1lc1tdOwotZXh0ZXJuIGNoYXIgKnY0bDJfdHlwZV9uYW1lc1tdOwotCi0vKiAgQ29tcGF0aWJpbGl0eSBsYXllciBpbnRlcmZhY2UgIC0tICB2NGwxLWNvbXBhdCBtb2R1bGUgKi8KLXR5cGVkZWYgaW50ICgqdjRsMl9raW9jdGwpKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAotCQkJICAgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKTsKLQotI2lmZGVmIENPTkZJR19WSURFT19WNEwxX0NPTVBBVAotaW50IHY0bF9jb21wYXRfdHJhbnNsYXRlX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAotCQkJICAgICAgIGludCBjbWQsIHZvaWQgKmFyZywgdjRsMl9raW9jdGwgZHJpdmVyX2lvY3RsKTsKLSNlbHNlCi0jZGVmaW5lIHY0bF9jb21wYXRfdHJhbnNsYXRlX2lvY3RsKGlub2RlLGZpbGUsY21kLGFyZyxpb2N0bCkgLUVJTlZBTAotI2VuZGlmCi0KLS8qIDMyIEJpdHMgY29tcGF0aWJpbGl0eSBsYXllciBmb3IgNjQgYml0cyBwcm9jZXNzb3JzICovCi1leHRlcm4gbG9uZyB2NGxfY29tcGF0X2lvY3RsMzIoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCi0JCQkJdW5zaWduZWQgbG9uZyBhcmcpOwotCi0KLSNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAjZW5kaWYgLyogX19MSU5VWF9WSURFT0RFVjJfSCAqLwogCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9jeDIzNDF4LmggYi9pbmNsdWRlL21lZGlhL2N4MjM0MXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzRjNDAwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9jeDIzNDF4LmgKQEAgLTAsMCArMSwxOTUgQEAKKy8qCisgICAgY3gyMzQxNS82IGhlYWRlciBjb250YWluaW5nIGNvbW1vbiBkZWZpbmVzLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpZm5kZWYgQ1gyMzQxWF9ICisjZGVmaW5lIENYMjM0MVhfSAorCitlbnVtIGN4MjM0MXhfcG9ydCB7CisJQ1gyMzQxWF9QT1JUX01FTU9SWSAgICA9IDAsCisJQ1gyMzQxWF9QT1JUX1NUUkVBTUlORyA9IDEsCisJQ1gyMzQxWF9QT1JUX1NFUklBTCAgICA9IDIKK307CisKK2VudW0gY3gyMzQxeF9jYXAgeworCUNYMjM0MVhfQ0FQX0hBU19TTElDRURfVkJJID0gMSA8PCAwLAorfTsKKworc3RydWN0IGN4MjM0MXhfbXBlZ19wYXJhbXMgeworCS8qIG1pc2MgKi8KKwl1MzIgY2FwYWJpbGl0aWVzOworCWVudW0gY3gyMzQxeF9wb3J0IHBvcnQ7CisJdTE2IHdpZHRoOworCXUxNiBoZWlnaHQ7CisJdTE2IGlzXzUwaHo7CisKKwkvKiBzdHJlYW0gKi8KKwllbnVtIHY0bDJfbXBlZ19zdHJlYW1fdHlwZSBzdHJlYW1fdHlwZTsKKwllbnVtIHY0bDJfbXBlZ19zdHJlYW1fdmJpX2ZtdCBzdHJlYW1fdmJpX2ZtdDsKKworCS8qIGF1ZGlvICovCisJZW51bSB2NGwyX21wZWdfYXVkaW9fc2FtcGxpbmdfZnJlcSBhdWRpb19zYW1wbGluZ19mcmVxOworCWVudW0gdjRsMl9tcGVnX2F1ZGlvX2VuY29kaW5nIGF1ZGlvX2VuY29kaW5nOworCWVudW0gdjRsMl9tcGVnX2F1ZGlvX2wyX2JpdHJhdGUgYXVkaW9fbDJfYml0cmF0ZTsKKwllbnVtIHY0bDJfbXBlZ19hdWRpb19tb2RlIGF1ZGlvX21vZGU7CisJZW51bSB2NGwyX21wZWdfYXVkaW9fbW9kZV9leHRlbnNpb24gYXVkaW9fbW9kZV9leHRlbnNpb247CisJZW51bSB2NGwyX21wZWdfYXVkaW9fZW1waGFzaXMgYXVkaW9fZW1waGFzaXM7CisJZW51bSB2NGwyX21wZWdfYXVkaW9fY3JjIGF1ZGlvX2NyYzsKKwl1OCBhdWRpb19wcm9wZXJ0aWVzOworCisJLyogdmlkZW8gKi8KKwllbnVtIHY0bDJfbXBlZ192aWRlb19lbmNvZGluZyB2aWRlb19lbmNvZGluZzsKKwllbnVtIHY0bDJfbXBlZ192aWRlb19hc3BlY3QgdmlkZW9fYXNwZWN0OworCXUxNiB2aWRlb19iX2ZyYW1lczsKKwl1MTYgdmlkZW9fZ29wX3NpemU7CisJdTE2IHZpZGVvX2dvcF9jbG9zdXJlOworCXUxNiB2aWRlb19wdWxsZG93bjsKKwllbnVtIHY0bDJfbXBlZ192aWRlb19iaXRyYXRlX21vZGUgdmlkZW9fYml0cmF0ZV9tb2RlOworCXUzMiB2aWRlb19iaXRyYXRlOworCXUzMiB2aWRlb19iaXRyYXRlX3BlYWs7CisJdTE2IHZpZGVvX3RlbXBvcmFsX2RlY2ltYXRpb247CisKKwkvKiBlbmNvZGluZyBmaWx0ZXJzICovCisJZW51bSB2NGwyX21wZWdfY3gyMzQxeF92aWRlb19zcGF0aWFsX2ZpbHRlcl9tb2RlIHZpZGVvX3NwYXRpYWxfZmlsdGVyX21vZGU7CisJdTE2IHZpZGVvX3NwYXRpYWxfZmlsdGVyOworCWVudW0gdjRsMl9tcGVnX2N4MjM0MXhfdmlkZW9fbHVtYV9zcGF0aWFsX2ZpbHRlcl90eXBlIHZpZGVvX2x1bWFfc3BhdGlhbF9maWx0ZXJfdHlwZTsKKwllbnVtIHY0bDJfbXBlZ19jeDIzNDF4X3ZpZGVvX2Nocm9tYV9zcGF0aWFsX2ZpbHRlcl90eXBlIHZpZGVvX2Nocm9tYV9zcGF0aWFsX2ZpbHRlcl90eXBlOworCWVudW0gdjRsMl9tcGVnX2N4MjM0MXhfdmlkZW9fdGVtcG9yYWxfZmlsdGVyX21vZGUgdmlkZW9fdGVtcG9yYWxfZmlsdGVyX21vZGU7CisJdTE2IHZpZGVvX3RlbXBvcmFsX2ZpbHRlcjsKKwllbnVtIHY0bDJfbXBlZ19jeDIzNDF4X3ZpZGVvX21lZGlhbl9maWx0ZXJfdHlwZSB2aWRlb19tZWRpYW5fZmlsdGVyX3R5cGU7CisJdTE2IHZpZGVvX2x1bWFfbWVkaWFuX2ZpbHRlcl90b3A7CisJdTE2IHZpZGVvX2x1bWFfbWVkaWFuX2ZpbHRlcl9ib3R0b207CisJdTE2IHZpZGVvX2Nocm9tYV9tZWRpYW5fZmlsdGVyX3RvcDsKKwl1MTYgdmlkZW9fY2hyb21hX21lZGlhbl9maWx0ZXJfYm90dG9tOworfTsKKworI2RlZmluZSBDWDIzNDFYX01CT1hfTUFYX0RBVEEgMTYKKworZXh0ZXJuIGNvbnN0IHUzMiBjeDIzNDF4X21wZWdfY3RybHNbXTsKK3R5cGVkZWYgaW50ICgqY3gyMzQxeF9tYm94X2Z1bmMpKHZvaWQgKnByaXYsIGludCBjbWQsIGludCBpbiwgaW50IG91dCwKKwkJdTMyIGRhdGFbQ1gyMzQxWF9NQk9YX01BWF9EQVRBXSk7CitpbnQgY3gyMzQxeF91cGRhdGUodm9pZCAqcHJpdiwgY3gyMzQxeF9tYm94X2Z1bmMgZnVuYywKKwkJY29uc3Qgc3RydWN0IGN4MjM0MXhfbXBlZ19wYXJhbXMgKm9sZCwKKwkJY29uc3Qgc3RydWN0IGN4MjM0MXhfbXBlZ19wYXJhbXMgKm5ldyk7CitpbnQgY3gyMzQxeF9jdHJsX3F1ZXJ5KHN0cnVjdCBjeDIzNDF4X21wZWdfcGFyYW1zICpwYXJhbXMsCisJCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWN0cmwpOworY29uc3QgY2hhciAqKmN4MjM0MXhfY3RybF9nZXRfbWVudSh1MzIgaWQpOworaW50IGN4MjM0MXhfZXh0X2N0cmxzKHN0cnVjdCBjeDIzNDF4X21wZWdfcGFyYW1zICpwYXJhbXMsCisJCXN0cnVjdCB2NGwyX2V4dF9jb250cm9scyAqY3RybHMsIGludCBjbWQpOwordm9pZCBjeDIzNDF4X2ZpbGxfZGVmYXVsdHMoc3RydWN0IGN4MjM0MXhfbXBlZ19wYXJhbXMgKnApOwordm9pZCBjeDIzNDF4X2xvZ19zdGF0dXMoc3RydWN0IGN4MjM0MXhfbXBlZ19wYXJhbXMgKnAsIGludCBjYXJkaWQpOworCisvKiBGaXJtd2FyZSBuYW1lcyAqLworI2RlZmluZSBDWDIzNDFYX0ZJUk1fRU5DX0ZJTEVOQU1FICJ2NGwtY3gyMzQxeC1lbmMuZnciCisvKiBEZWNvZGVyIGZpcm13YXJlIGZvciB0aGUgY3gyMzQxNSBvbmx5ICovCisjZGVmaW5lIENYMjM0MVhfRklSTV9ERUNfRklMRU5BTUUgInY0bC1jeDIzNDF4LWRlYy5mdyIKKworLyogRmlybXdhcmUgQVBJIGNvbW1hbmRzICovCisKKy8qIE1QRUcgZGVjb2RlciBBUEksIHNwZWNpZmljIHRvIHRoZSBjeDIzNDE1ICovCisjZGVmaW5lIENYMjM0MVhfREVDX1BJTkdfRlcgCQkJMHgwMAorI2RlZmluZSBDWDIzNDFYX0RFQ19TVEFSVF9QTEFZQkFDSyAJCTB4MDEKKyNkZWZpbmUgQ1gyMzQxWF9ERUNfU1RPUF9QTEFZQkFDSyAJCTB4MDIKKyNkZWZpbmUgQ1gyMzQxWF9ERUNfU0VUX1BMQVlCQUNLX1NQRUVEIAkJMHgwMworI2RlZmluZSBDWDIzNDFYX0RFQ19TVEVQX1ZJREVPIAkJCTB4MDUKKyNkZWZpbmUgQ1gyMzQxWF9ERUNfU0VUX0RNQV9CTE9DS19TSVpFIAkJMHgwOAorI2RlZmluZSBDWDIzNDFYX0RFQ19HRVRfWEZFUl9JTkZPCQkweDA5CisjZGVmaW5lIENYMjM0MVhfREVDX0dFVF9ETUFfU1RBVFVTCQkweDBhCisjZGVmaW5lIENYMjM0MVhfREVDX1NDSEVEX0RNQV9GUk9NX0hPU1QJCTB4MGIKKyNkZWZpbmUgQ1gyMzQxWF9ERUNfUEFVU0VfUExBWUJBQ0sgCQkweDBkCisjZGVmaW5lIENYMjM0MVhfREVDX0hBTFRfRlcgCQkJMHgwZQorI2RlZmluZSBDWDIzNDFYX0RFQ19TRVRfU1RBTkRBUkQgCQkweDEwCisjZGVmaW5lIENYMjM0MVhfREVDX0dFVF9WRVJTSU9OCQkJMHgxMQorI2RlZmluZSBDWDIzNDFYX0RFQ19TRVRfU1RSRUFNX0lOUFVUIAkJMHgxNAorI2RlZmluZSBDWDIzNDFYX0RFQ19HRVRfVElNSU5HX0lORk8gCQkweDE1CisjZGVmaW5lIENYMjM0MVhfREVDX1NFVF9BVURJT19NT0RFIAkJMHgxNgorI2RlZmluZSBDWDIzNDFYX0RFQ19TRVRfRVZFTlRfTk9USUZJQ0FUSU9OCTB4MTcKKyNkZWZpbmUgQ1gyMzQxWF9ERUNfU0VUX0RJU1BMQVlfQlVGRkVSUwkJMHgxOAorI2RlZmluZSBDWDIzNDFYX0RFQ19FWFRSQUNUX1ZCSSAJCTB4MTkKKyNkZWZpbmUgQ1gyMzQxWF9ERUNfU0VUX0RFQ09ERVJfU09VUkNFIAkJMHgxYQorI2RlZmluZSBDWDIzNDFYX0RFQ19TRVRfQVVESU9fT1VUUFVUIAkJMHgxYgorI2RlZmluZSBDWDIzNDFYX0RFQ19TRVRfQVZfREVMQVkgCQkweDFjCisjZGVmaW5lIENYMjM0MVhfREVDX1NFVF9QUkVCVUZGRVJJTkcJCTB4MWUKKworLyogTVBFRyBlbmNvZGVyIEFQSSAqLworI2RlZmluZSBDWDIzNDFYX0VOQ19QSU5HX0ZXIAkJCTB4ODAKKyNkZWZpbmUgQ1gyMzQxWF9FTkNfU1RBUlRfQ0FQVFVSRSAJCTB4ODEKKyNkZWZpbmUgQ1gyMzQxWF9FTkNfU1RPUF9DQVBUVVJFIAkJMHg4MgorI2RlZmluZSBDWDIzNDFYX0VOQ19TRVRfQVVESU9fSUQgCQkweDg5CisjZGVmaW5lIENYMjM0MVhfRU5DX1NFVF9WSURFT19JRCAJCTB4OGIKKyNkZWZpbmUgQ1gyMzQxWF9FTkNfU0VUX1BDUl9JRCAJCQkweDhkCisjZGVmaW5lIENYMjM0MVhfRU5DX1NFVF9GUkFNRV9SQVRFIAkJMHg4ZgorI2RlZmluZSBDWDIzNDFYX0VOQ19TRVRfRlJBTUVfU0laRSAJCTB4OTEKKyNkZWZpbmUgQ1gyMzQxWF9FTkNfU0VUX0JJVF9SQVRFIAkJMHg5NQorI2RlZmluZSBDWDIzNDFYX0VOQ19TRVRfR09QX1BST1BFUlRJRVMgCQkweDk3CisjZGVmaW5lIENYMjM0MVhfRU5DX1NFVF9BU1BFQ1RfUkFUSU8gCQkweDk5CisjZGVmaW5lIENYMjM0MVhfRU5DX1NFVF9ETlJfRklMVEVSX01PREUgCTB4OWIKKyNkZWZpbmUgQ1gyMzQxWF9FTkNfU0VUX0ROUl9GSUxURVJfUFJPUFMgCTB4OWQKKyNkZWZpbmUgQ1gyMzQxWF9FTkNfU0VUX0NPUklOR19MRVZFTFMgCQkweDlmCisjZGVmaW5lIENYMjM0MVhfRU5DX1NFVF9TUEFUSUFMX0ZJTFRFUl9UWVBFIAkweGExCisjZGVmaW5lIENYMjM0MVhfRU5DX1NFVF8zXzJfUFVMTERPV04gCQkweGIxCisjZGVmaW5lIENYMjM0MVhfRU5DX1NFVF9WQklfTElORSAJCTB4YjcKKyNkZWZpbmUgQ1gyMzQxWF9FTkNfU0VUX1NUUkVBTV9UWVBFIAkJMHhiOQorI2RlZmluZSBDWDIzNDFYX0VOQ19TRVRfT1VUUFVUX1BPUlQgCQkweGJiCisjZGVmaW5lIENYMjM0MVhfRU5DX1NFVF9BVURJT19QUk9QRVJUSUVTIAkweGJkCisjZGVmaW5lIENYMjM0MVhfRU5DX0hBTFRfRlcgCQkJMHhjMworI2RlZmluZSBDWDIzNDFYX0VOQ19HRVRfVkVSU0lPTgkJCTB4YzQKKyNkZWZpbmUgQ1gyMzQxWF9FTkNfU0VUX0dPUF9DTE9TVVJFIAkJMHhjNQorI2RlZmluZSBDWDIzNDFYX0VOQ19HRVRfU0VRX0VORCAJCTB4YzYKKyNkZWZpbmUgQ1gyMzQxWF9FTkNfU0VUX1BHTV9JTkRFWF9JTkZPIAkJMHhjNworI2RlZmluZSBDWDIzNDFYX0VOQ19TRVRfVkJJX0NPTkZJRwkJMHhjOAorI2RlZmluZSBDWDIzNDFYX0VOQ19TRVRfRE1BX0JMT0NLX1NJWkUgCQkweGM5CisjZGVmaW5lIENYMjM0MVhfRU5DX0dFVF9QUkVWX0RNQV9JTkZPX01CXzEwCTB4Y2EKKyNkZWZpbmUgQ1gyMzQxWF9FTkNfR0VUX1BSRVZfRE1BX0lORk9fTUJfOQkweGNiCisjZGVmaW5lIENYMjM0MVhfRU5DX1NDSEVEX0RNQV9UT19IT1NUIAkJMHhjYworI2RlZmluZSBDWDIzNDFYX0VOQ19JTklUSUFMSVpFX0lOUFVUIAkJMHhjZAorI2RlZmluZSBDWDIzNDFYX0VOQ19TRVRfRlJBTUVfRFJPUF9SQVRFIAkweGQwCisjZGVmaW5lIENYMjM0MVhfRU5DX1BBVVNFX0VOQ09ERVIgCQkweGQyCisjZGVmaW5lIENYMjM0MVhfRU5DX1JFRlJFU0hfSU5QVVQgCQkweGQzCisjZGVmaW5lIENYMjM0MVhfRU5DX1NFVF9DT1BZUklHSFQJCTB4ZDQKKyNkZWZpbmUgQ1gyMzQxWF9FTkNfU0VUX0VWRU5UX05PVElGSUNBVElPTiAJMHhkNQorI2RlZmluZSBDWDIzNDFYX0VOQ19TRVRfTlVNX1ZTWU5DX0xJTkVTIAkweGQ2CisjZGVmaW5lIENYMjM0MVhfRU5DX1NFVF9QTEFDRUhPTERFUiAJCTB4ZDcKKyNkZWZpbmUgQ1gyMzQxWF9FTkNfTVVURV9WSURFTyAJCQkweGQ5CisjZGVmaW5lIENYMjM0MVhfRU5DX01VVEVfQVVESU8gCQkJMHhkYQorI2RlZmluZSBDWDIzNDFYX0VOQ19VTktOT1dOCQkJMHhkYgorI2RlZmluZSBDWDIzNDFYX0VOQ19NSVNDIAkJCTB4ZGMKKworLyogT1NEIEFQSSwgc3BlY2lmaWMgdG8gdGhlIGN4MjM0MTUgKi8KKyNkZWZpbmUgQ1gyMzQxWF9PU0RfR0VUX0ZSQU1FQlVGRkVSIAkJMHg0MQorI2RlZmluZSBDWDIzNDFYX09TRF9HRVRfUElYRUxfRk9STUFUIAkJMHg0MgorI2RlZmluZSBDWDIzNDFYX09TRF9TRVRfUElYRUxfRk9STUFUIAkJMHg0MworI2RlZmluZSBDWDIzNDFYX09TRF9HRVRfU1RBVEUgCQkJMHg0NAorI2RlZmluZSBDWDIzNDFYX09TRF9TRVRfU1RBVEUgCQkJMHg0NQorI2RlZmluZSBDWDIzNDFYX09TRF9HRVRfT1NEX0NPT1JEUyAJCTB4NDYKKyNkZWZpbmUgQ1gyMzQxWF9PU0RfU0VUX09TRF9DT09SRFMgCQkweDQ3CisjZGVmaW5lIENYMjM0MVhfT1NEX0dFVF9TQ1JFRU5fQ09PUkRTIAkJMHg0OAorI2RlZmluZSBDWDIzNDFYX09TRF9TRVRfU0NSRUVOX0NPT1JEUyAJCTB4NDkKKyNkZWZpbmUgQ1gyMzQxWF9PU0RfR0VUX0dMT0JBTF9BTFBIQSAJCTB4NGEKKyNkZWZpbmUgQ1gyMzQxWF9PU0RfU0VUX0dMT0JBTF9BTFBIQSAJCTB4NGIKKyNkZWZpbmUgQ1gyMzQxWF9PU0RfU0VUX0JMRU5EX0NPT1JEUyAJCTB4NGMKKyNkZWZpbmUgQ1gyMzQxWF9PU0RfR0VUX0ZMSUNLRVJfU1RBVEUgCQkweDRmCisjZGVmaW5lIENYMjM0MVhfT1NEX1NFVF9GTElDS0VSX1NUQVRFIAkJMHg1MAorI2RlZmluZSBDWDIzNDFYX09TRF9CTFRfQ09QWSAJCQkweDUyCisjZGVmaW5lIENYMjM0MVhfT1NEX0JMVF9GSUxMIAkJCTB4NTMKKyNkZWZpbmUgQ1gyMzQxWF9PU0RfQkxUX1RFWFQgCQkJMHg1NAorI2RlZmluZSBDWDIzNDFYX09TRF9TRVRfRlJBTUVCVUZGRVJfV0lORE9XIAkweDU2CisjZGVmaW5lIENYMjM0MVhfT1NEX1NFVF9DSFJPTUFfS0VZIAkJMHg2MAorI2RlZmluZSBDWDIzNDFYX09TRF9HRVRfQUxQSEFfQ09OVEVOVF9JTkRFWCAJMHg2MQorI2RlZmluZSBDWDIzNDFYX09TRF9TRVRfQUxQSEFfQ09OVEVOVF9JTkRFWCAJMHg2MgorCisjZW5kaWYgLyogQ1gyMzQxWF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL2lyLWNvbW1vbi5oIGIvaW5jbHVkZS9tZWRpYS9pci1jb21tb24uaAppbmRleCAzMDJkNWIzLi43YmFiMDliIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL2lyLWNvbW1vbi5oCisrKyBiL2luY2x1ZGUvbWVkaWEvaXItY29tbW9uLmgKQEAgLTczLDcgKzczLDcgQEAKIGV4dGVybiBJUl9LRVlUQUJfVFlQRSBpcl9jb2Rlc19hdmVydHZfMzAzW0lSX0tFWVRBQl9TSVpFXTsKIGV4dGVybiBJUl9LRVlUQUJfVFlQRSBpcl9jb2Rlc19kbnR2X2xpdmVfZHZidF9wcm9bSVJfS0VZVEFCX1NJWkVdOwogZXh0ZXJuIElSX0tFWVRBQl9UWVBFIGlyX2NvZGVzX2VtX3RlcnJhdGVjW0lSX0tFWVRBQl9TSVpFXTsKLWV4dGVybiBJUl9LRVlUQUJfVFlQRSBpcl9jb2Rlc19lbV9waW5uYWNsZV91c2JbSVJfS0VZVEFCX1NJWkVdOworZXh0ZXJuIElSX0tFWVRBQl9UWVBFIGlyX2NvZGVzX3Bpbm5hY2xlX2dyZXlbSVJfS0VZVEFCX1NJWkVdOwogZXh0ZXJuIElSX0tFWVRBQl9UWVBFIGlyX2NvZGVzX2ZseXZpZGVvW0lSX0tFWVRBQl9TSVpFXTsKIGV4dGVybiBJUl9LRVlUQUJfVFlQRSBpcl9jb2Rlc19mbHlkdmJbSVJfS0VZVEFCX1NJWkVdOwogZXh0ZXJuIElSX0tFWVRBQl9UWVBFIGlyX2NvZGVzX2NpbmVyZ3lbSVJfS0VZVEFCX1NJWkVdOwpAQCAtODcsOCArODcsOSBAQAogZXh0ZXJuIElSX0tFWVRBQl9UWVBFIGlyX2NvZGVzX3B2OTUxW0lSX0tFWVRBQl9TSVpFXTsKIGV4dGVybiBJUl9LRVlUQUJfVFlQRSBpcl9jb2Rlc19yYzVfdHZbSVJfS0VZVEFCX1NJWkVdOwogZXh0ZXJuIElSX0tFWVRBQl9UWVBFIGlyX2NvZGVzX3dpbmZhc3RbSVJfS0VZVEFCX1NJWkVdOwotZXh0ZXJuIElSX0tFWVRBQl9UWVBFIGlyX2NvZGVzX3Bpbm5hY2xlW0lSX0tFWVRBQl9TSVpFXTsKK2V4dGVybiBJUl9LRVlUQUJfVFlQRSBpcl9jb2Rlc19waW5uYWNsZV9jb2xvcltJUl9LRVlUQUJfU0laRV07CiBleHRlcm4gSVJfS0VZVEFCX1RZUEUgaXJfY29kZXNfaGF1cHBhdWdlX25ld1tJUl9LRVlUQUJfU0laRV07CitleHRlcm4gSVJfS0VZVEFCX1RZUEUgaXJfY29kZXNfbnBndGVjaFtJUl9LRVlUQUJfU0laRV07CiAKICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL2lyLWtiZC1pMmMuaCBiL2luY2x1ZGUvbWVkaWEvaXIta2JkLWkyYy5oCmluZGV4IDczMGYyMWUuLmE0NTVmN2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvaXIta2JkLWkyYy5oCisrKyBiL2luY2x1ZGUvbWVkaWEvaXIta2JkLWkyYy5oCkBAIC0yMCw1ICsyMCw2IEBACiAJaW50ICAgICAgICAgICAgICAgICAgICAoKmdldF9rZXkpKHN0cnVjdCBJUl9pMmMqLCB1MzIqLCB1MzIqKTsKIH07CiAKLWludCBnZXRfa2V5X3Bpbm5hY2xlKHN0cnVjdCBJUl9pMmMgKmlyLCB1MzIgKmlyX2tleSwgdTMyICppcl9yYXcpOworaW50IGdldF9rZXlfcGlubmFjbGVfZ3JleShzdHJ1Y3QgSVJfaTJjICppciwgdTMyICppcl9rZXksIHUzMiAqaXJfcmF3KTsKK2ludCBnZXRfa2V5X3Bpbm5hY2xlX2NvbG9yKHN0cnVjdCBJUl9pMmMgKmlyLCB1MzIgKmlyX2tleSwgdTMyICppcl9yYXcpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL292Y2FtY2hpcC5oIGIvaW5jbHVkZS9tZWRpYS9vdmNhbWNoaXAuaAppbmRleCA4MTM4OTgzLi4wZjQzNDUxIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL292Y2FtY2hpcC5oCisrKyBiL2luY2x1ZGUvbWVkaWEvb3ZjYW1jaGlwLmgKQEAgLTE1LDYgKzE1LDcgQEAKICNkZWZpbmUgX19MSU5VWF9PVkNBTUNISVBfSAogCiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvcHdjLWlvY3RsLmggYi9pbmNsdWRlL21lZGlhL3B3Yy1pb2N0bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkYzEyNTQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL3B3Yy1pb2N0bC5oCkBAIC0wLDAgKzEsMzI1IEBACisjaWZuZGVmIFBXQ19JT0NUTF9ICisjZGVmaW5lIFBXQ19JT0NUTF9ICisKKy8qIChDKSAyMDAxLTIwMDQgTmVtb3NvZnQgVW52LgorICAgKEMpIDIwMDQtMjAwNiBMdWMgU2FpbGxhcmQgKGx1Y0BzYWlsbGFyZC5vcmcpCisKKyAgIE5PVEU6IHRoaXMgdmVyc2lvbiBvZiBwd2MgaXMgYW4gdW5vZmZpY2lhbCAobW9kaWZpZWQpIHJlbGVhc2Ugb2YgcHdjICYgcGN3eAorICAgZHJpdmVyIGFuZCB0aHVzIG1heSBoYXZlIGJ1Z3MgdGhhdCBhcmUgbm90IHByZXNlbnQgaW4gdGhlIG9yaWdpbmFsIHZlcnNpb24uCisgICBQbGVhc2Ugc2VuZCBidWcgcmVwb3J0cyBhbmQgc3VwcG9ydCByZXF1ZXN0cyB0byA8bHVjQHNhaWxsYXJkLm9yZz4uCisgICBUaGUgZGVjb21wcmVzc2lvbiByb3V0aW5lcyBoYXZlIGJlZW4gaW1wbGVtZW50ZWQgYnkgcmV2ZXJzZS1lbmdpbmVlcmluZyB0aGUKKyAgIE5lbW9zb2Z0IGJpbmFyeSBwd2N4IG1vZHVsZS4gQ2F2ZWF0IGVtcHRvci4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisqLworCisvKiBUaGlzIGlzIHB3Yy1pb2N0bC5oIGJlbG9uZ2luZyB0byBQV0MgMTAuMC4xMAorICAgSXQgY29udGFpbnMgc3RydWN0dXJlcyBhbmQgZGVmaW5lcyB0byBjb21tdW5pY2F0ZSBmcm9tIHVzZXIgc3BhY2UKKyAgIGRpcmVjdGx5IHRvIHRoZSBkcml2ZXIuCisgKi8KKworLyoKKyAgIENoYW5nZXMKKyAgIDIwMDEvMDgvMDMgIEFsdmFyYWRvICAgQWRkZWQgaW9jdGwgY29uc3RhbnRzIHRvIGFjY2VzcyBtZXRob2RzIGZvcgorCQkJICBjaGFuZ2luZyB3aGl0ZSBiYWxhbmNlIGFuZCByZWQvYmx1ZSBnYWlucworICAgMjAwMi8xMi8xNSAgRy4gSC4gRmVybmFuZGV6LVRvcmliaW8gICBWSURJT0NHUkVBTFNJWkUKKyAgIDIwMDMvMTIvMTMgIE5lbW9zZnQgVW52LiBTb21lIG1vZGlmaWNhdGlvbnMgdG8gbWFrZSBpbnRlcmZhY2luZyB0bworCSAgICAgICBQV0NYIGVhc2llcgorICAgMjAwNi8wMS8wMSAgTHVjIFNhaWxsYXJkIEFkZCByYXcgZm9ybWF0IGRlZmluaXRpb24KKyAqLworCisvKiBUaGVzZSBhcmUgcHJpdmF0ZSBpb2N0bCgpIGNvbW1hbmRzLCBzcGVjaWZpYyBmb3IgdGhlIFBoaWxpcHMgd2ViY2Ftcy4KKyAgIFRoZXkgY29udGFpbiBmdW5jdGlvbnMgbm90IGZvdW5kIGluIG90aGVyIHdlYmNhbXMsIGFuZCBzZXR0aW5ncyBub3QKKyAgIHNwZWNpZmllZCBpbiB0aGUgVmlkZW80TGludXggQVBJLgorCisgICBUaGUgI2RlZmluZSBuYW1lcyBhcmUgYnVpbHQgdXAgbGlrZSBmb2xsb3dzOgorICAgVklESU9DCQlWSURlbyBJT0N0bCBwcmVmaXgKKwkgUFdDCQlQaGlscHMgV2ViQ2FtCisJICAgIEcgICAgICAgICAgIG9wdGlvbmFsOiBHZXQKKwkgICAgUyAgICAgICAgICAgb3B0aW9uYWw6IFNldAorCSAgICAgLi4uIAl0aGUgZnVuY3Rpb24KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisKKworIC8qIEVudW1lcmF0aW9uIG9mIGltYWdlIHNpemVzICovCisjZGVmaW5lIFBTWl9TUUNJRgkweDAwCisjZGVmaW5lIFBTWl9RU0lGCTB4MDEKKyNkZWZpbmUgUFNaX1FDSUYJMHgwMgorI2RlZmluZSBQU1pfU0lGCQkweDAzCisjZGVmaW5lIFBTWl9DSUYJCTB4MDQKKyNkZWZpbmUgUFNaX1ZHQQkJMHgwNQorI2RlZmluZSBQU1pfTUFYCQk2CisKKworLyogVGhlIGZyYW1lIHJhdGUgaXMgZW5jb2RlZCBpbiB0aGUgdmlkZW9fd2luZG93LmZsYWdzIHBhcmFtZXRlciB1c2luZworICAgdGhlIHVwcGVyIDE2IGJpdHMsIHNpbmNlIHNvbWUgZmxhZ3MgYXJlIGRlZmluZWQgbm93YWRheXMuIFRoZSBmb2xsb3dpbmcKKyAgIGRlZmluZXMgcHJvdmlkZSBhIG1hc2sgYW5kIHNoaWZ0IHRvIGZpbHRlciBvdXQgdGhpcyB2YWx1ZS4KKyAgIFRoaXMgdmFsdWUgY2FuIGFsc28gYmUgcGFzc2luZyB1c2luZyB0aGUgcHJpdmF0ZSBmbGFnIHdoZW4gdXNpbmcgdjRsMiBhbmQKKyAgIFZJRElPQ19TX0ZNVCBpb2N0bC4KKworICAgSW4gJ1NuYXBzaG90JyBtb2RlIHRoZSBjYW1lcmEgZnJlZXplcyBpdHMgYXV0b21hdGljIGV4cG9zdXJlIGFuZCBjb2xvdXIKKyAgIGJhbGFuY2UgY29udHJvbHMuCisgKi8KKyNkZWZpbmUgUFdDX0ZQU19TSElGVAkJMTYKKyNkZWZpbmUgUFdDX0ZQU19NQVNLCQkweDAwRkYwMDAwCisjZGVmaW5lIFBXQ19GUFNfRlJNQVNLCQkweDAwM0YwMDAwCisjZGVmaW5lIFBXQ19GUFNfU05BUFNIT1QJMHgwMDQwMDAwMAorI2RlZmluZSBQV0NfUUxUX01BU0sJCTB4MDMwMDAwMDAKKyNkZWZpbmUgUFdDX1FMVF9TSElGVAkJMjQKKworCisvKiBzdHJ1Y3R1cmUgZm9yIHRyYW5zZmVycmluZyB4ICYgeSBjb29yZGluYXRlcyAqLworc3RydWN0IHB3Y19jb29yZAoreworCWludCB4LCB5OwkJLyogZ3Vlc3Mgd2hhdCAqLworCWludCBzaXplOwkJLyogc2l6ZSwgb3Igb2Zmc2V0ICovCit9OworCisKKy8qIFVzZWQgd2l0aCBWSURJT0NQV0NQUk9CRSAqLworc3RydWN0IHB3Y19wcm9iZQoreworCWNoYXIgbmFtZVszMl07CisJaW50IHR5cGU7Cit9OworCitzdHJ1Y3QgcHdjX3NlcmlhbAoreworCWNoYXIgc2VyaWFsWzMwXTsJLyogU3RyaW5nIHdpdGggc2VyaWFsIG51bWJlci4gQ29udGFpbnMgdGVybWluYXRpbmcgMCAqLworfTsKKworLyogcHdjX3doaXRlYmFsYW5jZS5tb2RlIHZhbHVlcyAqLworI2RlZmluZSBQV0NfV0JfSU5ET09SCQkwCisjZGVmaW5lIFBXQ19XQl9PVVRET09SCQkxCisjZGVmaW5lIFBXQ19XQl9GTAkJMgorI2RlZmluZSBQV0NfV0JfTUFOVUFMCQkzCisjZGVmaW5lIFBXQ19XQl9BVVRPCQk0CisKKy8qIFVzZWQgd2l0aCBWSURJT0NQV0NbU0ddQVdCIChBdXRvIFdoaXRlIEJhbGFuY2UpLgorICAgU2V0IG1vZGUgdG8gb25lIG9mIHRoZSBQV0NfV0JfKiB2YWx1ZXMgYWJvdmUuCisgICAqcmVkIGFuZCAqYmx1ZSBhcmUgdGhlIHJlc3BlY3RpdmUgZ2FpbnMgb2YgdGhlc2UgY29sb3VyIGNvbXBvbmVudHMgaW5zaWRlCisgICB0aGUgY2FtZXJhOyByYW5nZSAwLi42NTUzNQorICAgV2hlbiAnbW9kZScgPT0gUFdDX1dCX01BTlVBTCwgJ21hbnVhbF9yZWQnIGFuZCAnbWFudWFsX2JsdWUnIGFyZSBzZXQgb3IgcmVhZDsKKyAgIG90aGVyd2lzZSB1bmRlZmluZWQuCisgICAncmVhZF9yZWQnIGFuZCAncmVhZF9ibHVlJyBhcmUgcmVhZC1vbmx5LgorKi8KK3N0cnVjdCBwd2Nfd2hpdGViYWxhbmNlCit7CisJaW50IG1vZGU7CisJaW50IG1hbnVhbF9yZWQsIG1hbnVhbF9ibHVlOwkvKiBSL1cgKi8KKwlpbnQgcmVhZF9yZWQsIHJlYWRfYmx1ZTsJLyogUi9PICovCit9OworCisvKgorICAgJ2NvbnRyb2xfc3BlZWQnIGFuZCAnY29udHJvbF9kZWxheScgYXJlIHVzZWQgaW4gYXV0b21hdGljIHdoaXRlYmFsYW5jZSBtb2RlLAorICAgYW5kIHRlbGwgdGhlIGNhbWVyYSBob3cgZmFzdCBpdCBzaG91bGQgcmVhY3QgdG8gY2hhbmdlcyBpbiBsaWdodGluZywgYW5kCisgICB3aXRoIGhvdyBtdWNoIGRlbGF5LiBWYWxpZCB2YWx1ZXMgYXJlIDAuLjY1NTM1LgorKi8KK3N0cnVjdCBwd2Nfd2Jfc3BlZWQKK3sKKwlpbnQgY29udHJvbF9zcGVlZDsKKwlpbnQgY29udHJvbF9kZWxheTsKKworfTsKKworLyogVXNlZCB3aXRoIFZJRElPQ1BXQ1tTR11MRUQgKi8KK3N0cnVjdCBwd2NfbGVkcworeworCWludCBsZWRfb247CQkJLyogTGVkIG9uLXRpbWU7IHJhbmdlID0gMC4uMjUwMDAgKi8KKwlpbnQgbGVkX29mZjsJCQkvKiBMZWQgb2ZmLXRpbWU7IHJhbmdlID0gMC4uMjUwMDAgICovCit9OworCisvKiBJbWFnZSBzaXplICh1c2VkIHdpdGggR1JFQUxTSVpFKSAqLworc3RydWN0IHB3Y19pbWFnZXNpemUKK3sKKwlpbnQgd2lkdGg7CisJaW50IGhlaWdodDsKK307CisKKy8qIERlZmluZXMgYW5kIHN0cnVjdHVyZXMgZm9yIE1vdG9yaXplZCBQYW4gJiBUaWx0ICovCisjZGVmaW5lIFBXQ19NUFRfUEFOCQkweDAxCisjZGVmaW5lIFBXQ19NUFRfVElMVAkJMHgwMgorI2RlZmluZSBQV0NfTVBUX1RJTUVPVVQJCTB4MDQgLyogZm9yIHN0YXR1cyAqLworCisvKiBTZXQgYW5nbGVzOyB3aGVuIGFic29sdXRlICE9IDAsIHRoZSBhbmdsZSBpcyBhYnNvbHV0ZSBhbmQgdGhlCisgICBkcml2ZXIgY2FsY3VsYXRlcyB0aGUgcmVsYXRpdmUgb2Zmc2V0IGZvciB5b3UuIFRoaXMgY2FuIG9ubHkKKyAgIGJlIHVzZWQgd2l0aCBWSURJT0NQV0NTQU5HTEU7IFZJRElPQ1BXQ0dBTkdMRSBhbHdheXMgcmV0dXJucworICAgYWJzb2x1dGUgYW5nbGVzLgorICovCitzdHJ1Y3QgcHdjX21wdF9hbmdsZXMKK3sKKwlpbnQgYWJzb2x1dGU7CQkvKiB3cml0ZS1vbmx5ICovCisJaW50IHBhbjsJCS8qIGRlZ3JlZXMgKiAxMDAgKi8KKwlpbnQgdGlsdDsJCS8qIGRlZ3Jlc3MgKiAxMDAgKi8KK307CisKKy8qIFJhbmdlIG9mIGFuZ2xlcyBvZiB0aGUgY2FtZXJhLCBib3RoIGhvcml6b250YWxseSBhbmQgdmVydGljYWxseS4KKyAqLworc3RydWN0IHB3Y19tcHRfcmFuZ2UKK3sKKwlpbnQgcGFuX21pbiwgcGFuX21heDsJCS8qIGRlZ3JlZXMgKiAxMDAgKi8KKwlpbnQgdGlsdF9taW4sIHRpbHRfbWF4OworfTsKKworc3RydWN0IHB3Y19tcHRfc3RhdHVzCit7CisJaW50IHN0YXR1czsKKwlpbnQgdGltZV9wYW47CisJaW50IHRpbWVfdGlsdDsKK307CisKKworLyogVGhpcyBpcyB1c2VkIGZvciBvdXQtb2Yta2VybmVsIGRlY29tcHJlc3Npb24uIFdpdGggaXQsIHlvdSBjYW4gZ2V0CisgICBhbGwgdGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiB0byBpbml0aWFsaXplIGFuZCB1c2UgdGhlIGRlY29tcHJlc3NvcgorICAgcm91dGluZXMgaW4gc3RhbmRhbG9uZSBhcHBsaWNhdGlvbnMuCisgKi8KK3N0cnVjdCBwd2NfdmlkZW9fY29tbWFuZAoreworCWludCB0eXBlOwkJLyogY2FtZXJhIHR5cGUgKDY0NSwgNjc1LCA3MzAsIGV0Yy4pICovCisJaW50IHJlbGVhc2U7CQkvKiByZWxlYXNlIG51bWJlciAqLworCisJaW50IHNpemU7CQkvKiBvbmUgb2YgUFNaXyogKi8KKwlpbnQgYWx0ZXJuYXRlOworCWludCBjb21tYW5kX2xlbjsJLyogbGVuZ3RoIG9mIFVTQiB2aWRlbyBjb21tYW5kICovCisJdW5zaWduZWQgY2hhciBjb21tYW5kX2J1ZlsxM107CS8qIEFjdHVhbCBVU0IgdmlkZW8gY29tbWFuZCAqLworCWludCBiYW5kbGVuZ3RoOwkJLyogPjAgPSBjb21wcmVzc2VkICovCisJaW50IGZyYW1lX3NpemU7CQkvKiBTaXplIG9mIG9uZSAodW4pY29tcHJlc3NlZCBmcmFtZSAqLworfTsKKworLyogRmxhZ3MgZm9yIFBXQ1ggc3Vicm91dGluZXMuIE5vdCBhbGwgbW9kdWxlcyBob25vdXIgYWxsIGZsYWdzLiAqLworI2RlZmluZSBQV0NYX0ZMQUdfUExBTkFSCTB4MDAwMQorI2RlZmluZSBQV0NYX0ZMQUdfQkFZRVIJCTB4MDAwOAorCisKKy8qIElPQ1RMIGRlZmluaXRpb25zICovCisKKyAvKiBSZXN0b3JlIHVzZXIgc2V0dGluZ3MgKi8KKyNkZWZpbmUgVklESU9DUFdDUlVTRVIJCV9JTygndicsIDE5MikKKyAvKiBTYXZlIHVzZXIgc2V0dGluZ3MgKi8KKyNkZWZpbmUgVklESU9DUFdDU1VTRVIJCV9JTygndicsIDE5MykKKyAvKiBSZXN0b3JlIGZhY3Rvcnkgc2V0dGluZ3MgKi8KKyNkZWZpbmUgVklESU9DUFdDRkFDVE9SWQlfSU8oJ3YnLCAxOTQpCisKKyAvKiBZb3UgY2FuIG1hbmlwdWxhdGUgdGhlIGNvbXByZXNzaW9uIGZhY3Rvci4gQSBjb21wcmVzc2lvbiBwcmVmZXJlbmNlIG9mIDAKKyAgICBtZWFucyB1c2UgdW5jb21wcmVzc2VkIG1vZGVzIHdoZW4gYXZhaWxhYmxlOyAxIGlzIGxvdyBjb21wcmVzc2lvbiwgMiBpcworICAgIG1lZGl1bSBhbmQgMyBpcyBoaWdoIGNvbXByZXNzaW9uIHByZWZlcnJlZC4gT2YgY291cnNlLCB0aGUgaGlnaGVyIHRoZQorICAgIGNvbXByZXNzaW9uLCB0aGUgbG93ZXIgdGhlIGJhbmR3aWR0aCB1c2VkIGJ1dCBtb3JlIGNoYW5jZSBvZiBhcnRlZmFjdHMKKyAgICBpbiB0aGUgaW1hZ2UuIFRoZSBkcml2ZXIgYXV0b21hdGljYWxseSBjaG9vc2VzIGEgaGlnaGVyIGNvbXByZXNzaW9uIHdoZW4KKyAgICB0aGUgcHJlZmVycmVkIG1vZGUgaXMgbm90IGF2YWlsYWJsZS4KKyAgKi8KKyAvKiBTZXQgcHJlZmVycmVkIGNvbXByZXNzaW9uIHF1YWxpdHkgKDAgPSB1bmNvbXByZXNzZWQsIDMgPSBoaWdoZXN0IGNvbXByZXNzaW9uKSAqLworI2RlZmluZSBWSURJT0NQV0NTQ1FVQUwJCV9JT1coJ3YnLCAxOTUsIGludCkKKyAvKiBHZXQgcHJlZmVycmVkIGNvbXByZXNzaW9uIHF1YWxpdHkgKi8KKyNkZWZpbmUgVklESU9DUFdDR0NRVUFMCQlfSU9SKCd2JywgMTk1LCBpbnQpCisKKworLyogUmV0cmlldmUgc2VyaWFsIG51bWJlciBvZiBjYW1lcmEgKi8KKyNkZWZpbmUgVklESU9DUFdDR1NFUklBTAlfSU9SKCd2JywgMTk4LCBzdHJ1Y3QgcHdjX3NlcmlhbCkKKworIC8qIFRoaXMgaXMgYSBwcm9iZSBmdW5jdGlvbjsgc2luY2Ugc28gbWFueSBkZXZpY2VzIGFyZSBzdXBwb3J0ZWQsIGl0CisgICAgYmVjb21lcyBkaWZmaWN1bHQgdG8gaW5jbHVkZSBhbGwgdGhlIG5hbWVzIGluIHByb2dyYW1zIHRoYXQgd2FudCB0bworICAgIGNoZWNrIGZvciB0aGUgZW5oYW5jZWQgUGhpbGlwcyBzdHVmZi4gU28gaW4gc3RlYWQsIHRyeSB0aGlzIFBST0JFOworICAgIGl0IHJldHVybnMgYSBzdHJ1Y3R1cmUgd2l0aCB0aGUgb3JpZ2luYWwgbmFtZSwgYW5kIHRoZSBjb3JyZXNwb25kaW5nCisgICAgUGhpbGlwcyB0eXBlLgorICAgIFRvIHVzZSwgZmlsbCB0aGUgc3RydWN0dXJlIHdpdGggemVyb2VzLCBjYWxsIFBST0JFIGFuZCBpZiB0aGF0IHN1Y2NlZWRzLAorICAgIGNvbXBhcmUgdGhlIG5hbWUgd2l0aCB0aGF0IHJldHVybmVkIGZyb20gVklESU9DR0NBUDsgdGhleSBzaG91bGQgYmUgdGhlCisgICAgc2FtZS4gSWYgc28sIHlvdSBjYW4gYmUgYXNzdXJlZCBpdCBpcyBhIFBoaWxpcHMgKE9FTSkgY2FtIGFuZCB0aGUgdHlwZQorICAgIGlzIHZhbGlkLgorICovCisjZGVmaW5lIFZJRElPQ1BXQ1BST0JFCQlfSU9SKCd2JywgMTk5LCBzdHJ1Y3QgcHdjX3Byb2JlKQorCisgLyogU2V0IEFHQyAoQXV0b21hdGljIEdhaW4gQ29udHJvbCk7IGludCA8IDAgPSBhdXRvLCAwLi42NTUzNSA9IGZpeGVkICovCisjZGVmaW5lIFZJRElPQ1BXQ1NBR0MJCV9JT1coJ3YnLCAyMDAsIGludCkKKyAvKiBHZXQgQUdDOyBpbnQgPCAwID0gYXV0bzsgPj0gMCA9IGZpeGVkLCByYW5nZSAwLi42NTUzNSAqLworI2RlZmluZSBWSURJT0NQV0NHQUdDCQlfSU9SKCd2JywgMjAwLCBpbnQpCisgLyogU2V0IHNodXR0ZXIgc3BlZWQ7IGludCA8IDAgPSBhdXRvOyA+PSAwID0gZml4ZWQsIHJhbmdlIDAuLjY1NTM1ICovCisjZGVmaW5lIFZJRElPQ1BXQ1NTSFVUVEVSCV9JT1coJ3YnLCAyMDEsIGludCkKKworIC8qIENvbG9yIGNvbXBlbnNhdGlvbiAoQXV0byBXaGl0ZSBCYWxhbmNlKSAqLworI2RlZmluZSBWSURJT0NQV0NTQVdCICAgICAgICAgICBfSU9XKCd2JywgMjAyLCBzdHJ1Y3QgcHdjX3doaXRlYmFsYW5jZSkKKyNkZWZpbmUgVklESU9DUFdDR0FXQiAgICAgICAgICAgX0lPUigndicsIDIwMiwgc3RydWN0IHB3Y193aGl0ZWJhbGFuY2UpCisKKyAvKiBBdXRvIFdCIHNwZWVkICovCisjZGVmaW5lIFZJRElPQ1BXQ1NBV0JTUEVFRAlfSU9XKCd2JywgMjAzLCBzdHJ1Y3QgcHdjX3diX3NwZWVkKQorI2RlZmluZSBWSURJT0NQV0NHQVdCU1BFRUQJX0lPUigndicsIDIwMywgc3RydWN0IHB3Y193Yl9zcGVlZCkKKworIC8qIExFRHMgb24vb2ZmL2JsaW5rOyBpbnQgcmFuZ2UgMC4uNjU1MzUgKi8KKyNkZWZpbmUgVklESU9DUFdDU0xFRCAgICAgICAgICAgX0lPVygndicsIDIwNSwgc3RydWN0IHB3Y19sZWRzKQorI2RlZmluZSBWSURJT0NQV0NHTEVEICAgICAgICAgICBfSU9SKCd2JywgMjA1LCBzdHJ1Y3QgcHdjX2xlZHMpCisKKyAgLyogQ29udG91ciAoc2hhcnBuZXNzKTsgaW50IDwgMCA9IGF1dG8sIDAuLjY1NTM2ID0gZml4ZWQgKi8KKyNkZWZpbmUgVklESU9DUFdDU0NPTlRPVVIJX0lPVygndicsIDIwNiwgaW50KQorI2RlZmluZSBWSURJT0NQV0NHQ09OVE9VUglfSU9SKCd2JywgMjA2LCBpbnQpCisKKyAgLyogQmFja2xpZ2h0IGNvbXBlbnNhdGlvbjsgMCA9IG9mZiwgb3RoZXJ3aXNlIG9uICovCisjZGVmaW5lIFZJRElPQ1BXQ1NCQUNLTElHSFQJX0lPVygndicsIDIwNywgaW50KQorI2RlZmluZSBWSURJT0NQV0NHQkFDS0xJR0hUCV9JT1IoJ3YnLCAyMDcsIGludCkKKworICAvKiBGbGlja2VybGVzcyBtb2RlOyA9IDAgb2ZmLCBvdGhlcndpc2Ugb24gKi8KKyNkZWZpbmUgVklESU9DUFdDU0ZMSUNLRVIJX0lPVygndicsIDIwOCwgaW50KQorI2RlZmluZSBWSURJT0NQV0NHRkxJQ0tFUglfSU9SKCd2JywgMjA4LCBpbnQpCisKKyAgLyogRHluYW1pYyBub2lzZSByZWR1Y3Rpb247IDAgb2ZmLCAzID0gaGlnaCBub2lzZSByZWR1Y3Rpb24gKi8KKyNkZWZpbmUgVklESU9DUFdDU0RZTk5PSVNFCV9JT1coJ3YnLCAyMDksIGludCkKKyNkZWZpbmUgVklESU9DUFdDR0RZTk5PSVNFCV9JT1IoJ3YnLCAyMDksIGludCkKKworIC8qIFJlYWwgaW1hZ2Ugc2l6ZSBhcyB1c2VkIGJ5IHRoZSBjYW1lcmE7IHRlbGxzIHlvdSB3aGV0aGVyIG9yIG5vdCB0aGVyZSdzIGEgZ3JheSBib3JkZXIgYXJvdW5kIHRoZSBpbWFnZSAqLworI2RlZmluZSBWSURJT0NQV0NHUkVBTFNJWkUJX0lPUigndicsIDIxMCwgc3RydWN0IHB3Y19pbWFnZXNpemUpCisKKyAvKiBNb3Rvcml6ZWQgcGFuICYgdGlsdCBmdW5jdGlvbnMgKi8KKyNkZWZpbmUgVklESU9DUFdDTVBUUkVTRVQJX0lPVygndicsIDIxMSwgaW50KQorI2RlZmluZSBWSURJT0NQV0NNUFRHUkFOR0UJX0lPUigndicsIDIxMSwgc3RydWN0IHB3Y19tcHRfcmFuZ2UpCisjZGVmaW5lIFZJRElPQ1BXQ01QVFNBTkdMRQlfSU9XKCd2JywgMjEyLCBzdHJ1Y3QgcHdjX21wdF9hbmdsZXMpCisjZGVmaW5lIFZJRElPQ1BXQ01QVEdBTkdMRQlfSU9SKCd2JywgMjEyLCBzdHJ1Y3QgcHdjX21wdF9hbmdsZXMpCisjZGVmaW5lIFZJRElPQ1BXQ01QVFNUQVRVUwlfSU9SKCd2JywgMjEzLCBzdHJ1Y3QgcHdjX21wdF9zdGF0dXMpCisKKyAvKiBHZXQgdGhlIFVTQiBzZXQtdmlkZW8gY29tbWFuZDsgbmVlZGVkIGZvciBpbml0aWFsaXppbmcgbGlicHdjeCAqLworI2RlZmluZSBWSURJT0NQV0NHVklEQ01ECV9JT1IoJ3YnLCAyMTUsIHN0cnVjdCBwd2NfdmlkZW9fY29tbWFuZCkKK3N0cnVjdCBwd2NfdGFibGVfaW5pdF9idWZmZXIgeworICAgaW50IGxlbjsKKyAgIGNoYXIgKmJ1ZmZlcjsKKworfTsKKyNkZWZpbmUgVklESU9DUFdDR1ZJRFRBQkxFCV9JT1IoJ3YnLCAyMTYsIHN0cnVjdCBwd2NfdGFibGVfaW5pdF9idWZmZXIpCisKKy8qCisgKiBUaGlzIGlzIHByaXZhdGUgY29tbWFuZCB1c2VkIHdoZW4gY29tbXVuaWNhdGluZyB3aXRoIHY0bDIuCisgKiBJbiB0aGUgZnV0dXJlIGFsbCBwcml2YXRlIGlvY3RsIHdpbGwgYmUgcmVtb3ZlL3JlcGxhY2UgdG8KKyAqIHVzZSBpbnRlcmZhY2Ugb2ZmZXIgYnkgdjRsMi4KKyAqLworCisjZGVmaW5lIFY0TDJfQ0lEX1BSSVZBVEVfU0FWRV9VU0VSICAgICAgIChWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyAwKQorI2RlZmluZSBWNEwyX0NJRF9QUklWQVRFX1JFU1RPUkVfVVNFUiAgICAoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgMSkKKyNkZWZpbmUgVjRMMl9DSURfUFJJVkFURV9SRVNUT1JFX0ZBQ1RPUlkgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDIpCisjZGVmaW5lIFY0TDJfQ0lEX1BSSVZBVEVfQ09MT1VSX01PREUgICAgIChWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyAzKQorI2RlZmluZSBWNEwyX0NJRF9QUklWQVRFX0FVVE9DT05UT1VSICAgICAoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgNCkKKyNkZWZpbmUgVjRMMl9DSURfUFJJVkFURV9DT05UT1VSICAgICAgICAgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDUpCisjZGVmaW5lIFY0TDJfQ0lEX1BSSVZBVEVfQkFDS0xJR0hUICAgICAgIChWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyA2KQorI2RlZmluZSBWNEwyX0NJRF9QUklWQVRFX0ZMSUNLRVJMRVNTICAgICAoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgNykKKyNkZWZpbmUgVjRMMl9DSURfUFJJVkFURV9OT0lTRV9SRURVQ1RJT04gKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDgpCisKK3N0cnVjdCBwd2NfcmF3X2ZyYW1lIHsKKyAgIF9fbGUxNiB0eXBlOwkJLyogdHlwZSBvZiB0aGUgd2ViY2FtICovCisgICBfX2xlMTYgdmJhbmRsZW5ndGg7CS8qIFNpemUgb2YgNGxpbmVzIGNvbXByZXNzZWQgKHVzZWQgYnkgdGhlIGRlY29tcHJlc3NvcikgKi8KKyAgIF9fdTggICBjbWRbNF07CS8qIHRoZSBmb3VyIGJ5dGUgb2YgdGhlIGNvbW1hbmQgKGluIGNhc2Ugb2YgbmFsYSwKKwkJCSAgIG9ubHkgdGhlIGZpcnN0IDMgYnl0ZXMgaXMgZmlsbGVkKSAqLworICAgX191OCAgIHJhd2ZyYW1lWzBdOwkvKiBmcmFtZV9zaXplID0gSC80KnZiYW5kbGVuZ3RoICovCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc2FhNzExNS5oIGIvaW5jbHVkZS9tZWRpYS9zYWE3MTE1LmgKaW5kZXggNmI0ODM2Zi4uOWYwZTIyOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zYWE3MTE1LmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zYWE3MTE1LmgKQEAgLTEsNSArMSw1IEBACiAvKgotICAgIHNhYTcxMTUuaCAtIGRlZmluaXRpb24gZm9yIHNhYTcxMTMvNC81IGlucHV0cworICAgIHNhYTcxMTUuaCAtIGRlZmluaXRpb24gZm9yIHNhYTcxMTMvNC81IGlucHV0cyBhbmQgZnJlcXVlbmN5IGZsYWdzCiAKICAgICBDb3B5cmlnaHQgKEMpIDIwMDYgSGFucyBWZXJrdWlsIChodmVya3VpbEB4czRhbGwubmwpCiAKQEAgLTMzLDUgKzMzLDE0IEBACiAjZGVmaW5lIFNBQTcxMTVfU1ZJREVPMiAgICA4CiAjZGVmaW5lIFNBQTcxMTVfU1ZJREVPMyAgICA5CiAKKy8qIFNBQTcxMTUgdjRsMl9jcnlzdGFsX2ZyZXEgZnJlcXVlbmN5IHZhbHVlcyAqLworI2RlZmluZSBTQUE3MTE1X0ZSRVFfMzJfMTFfTUhaICAzMjExMDAwMCAgIC8qIDMyLjExIE1IeiBjcnlzdGFsLCBTQUE3MTE0LzUgb25seSAqLworI2RlZmluZSBTQUE3MTE1X0ZSRVFfMjRfNTc2X01IWiAyNDU3NjAwMCAgIC8qIDI0LjU3NiBNSHogY3J5c3RhbCAqLworCisvKiBTQUE3MTE1IHY0bDJfY3J5c3RhbF9mcmVxIGF1ZGlvIGNsb2NrIGNvbnRyb2wgZmxhZ3MgKi8KKyNkZWZpbmUgU0FBNzExNV9GUkVRX0ZMX1VDR0MgICAoMSA8PCAwKQkgICAvKiBTQSAzQVs3XSwgVUNHQywgU0FBNzExNSBvbmx5ICovCisjZGVmaW5lIFNBQTcxMTVfRlJFUV9GTF9DR0NESVYgKDEgPDwgMSkJICAgLyogU0EgM0FbNl0sIENHQ0RJViwgU0FBNzExNSBvbmx5ICovCisjZGVmaW5lIFNBQTcxMTVfRlJFUV9GTF9BUExMICAgKDEgPDwgMikJICAgLyogU0EgM0FbM10sIEFQTEwsIFNBQTcxMTQvNSBvbmx5ICovCisKICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3NhYTcxNDZfdnYuaCBiL2luY2x1ZGUvbWVkaWEvc2FhNzE0Nl92di5oCmluZGV4IDQ1MDdjYjYuLjgzZmUyZTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc2FhNzE0Nl92di5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc2FhNzE0Nl92di5oCkBAIC0yLDcgKzIsNyBAQAogI2RlZmluZSBfX1NBQTcxNDZfVlZfXwogCiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KLQorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CiAjaW5jbHVkZSA8bWVkaWEvc2FhNzE0Ni5oPgogI2luY2x1ZGUgPG1lZGlhL3ZpZGVvLWJ1Zi5oPgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3R1bmVyLmggYi9pbmNsdWRlL21lZGlhL3R1bmVyLmgKaW5kZXggMDE3ZmVkNy4uMmY3YjAwYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS90dW5lci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvdHVuZXIuaApAQCAtMjUsNiArMjUsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgogI2luY2x1ZGUgPG1lZGlhL3R1bmVyLXR5cGVzLmg+CiAKK2V4dGVybiBpbnQgdHVuZXJfZGVidWc7CisKICNkZWZpbmUgQUREUl9VTlNFVCAoMjU1KQogCiAjZGVmaW5lIFRVTkVSX1RFTUlDX1BBTAkJCTAgICAgICAgIC8qIDQwMDIgRkg1ICgzWCA3NzU2LCA5NDgzKSAqLwpAQCAtMTA4LDcgKzExMCw3IEBACiAjZGVmaW5lIFRVTkVSX1RFQTU3NjcJCQk2MgkvKiBPbmx5IEZNIFJhZGlvIFR1bmVyICovCiAjZGVmaW5lIFRVTkVSX1BISUxJUFNfRk1EMTIxNk1FX01LMwk2MwogCi0jZGVmaW5lIFRVTkVSX0xHX1REVlNfSDA2MkYJCTY0CS8qIERWaUNPIEZ1c2lvbkhEVFYgNSAqLworI2RlZmluZSBUVU5FUl9MR19URFZTX0gwNlhGCQk2NAkvKiBURFZTIEgwNjFGLCBIMDYyRiwgSDA2NEYgKi8KICNkZWZpbmUgVFVORVJfWU1FQ19UVkY2NlQ1X0JfREZGCTY1CS8qIEFjb3JwIFk4NzhGICovCiAjZGVmaW5lIFRVTkVSX0xHX1RBTE4JCQk2NgogI2RlZmluZSBUVU5FUl9QSElMSVBTX1REMTMxNgkJNjcKQEAgLTExOSw2ICsxMjEsOCBAQAogI2RlZmluZSBUVU5FUl9YQ0VJVkVfWEMzMDI4CQk3MQogCiAjZGVmaW5lIFRVTkVSX1RIT01TT05fRkU2NjAwCQk3MgkvKiBEVmlDTyBGdXNpb25IRFRWIERWQi1UIEh5YnJpZCAqLworI2RlZmluZSBUVU5FUl9TQU1TVU5HX1RDUEdfNjEyMVAzMEEgICAgIDczIAkvKiBIYXVwcGF1Z2UgUFZSLTUwMCBQQUwgKi8KKyNkZWZpbmUgVFVORVJfVERBOTg4NyAgICAgICAgICAgICAgICAgICA3NCAgICAgIC8qIFRoaXMgdHVuZXIgc2hvdWxkIGJlIHVzZWQgb25seSBpbnRlcm5hbGx5ICovCiAKIC8qIHR2IGNhcmQgc3BlY2lmaWMgKi8KICNkZWZpbmUgVERBOTg4N19QUkVTRU5UIAkJKDE8PDApCkBAIC0xOTAsNiArMTk0LDEwIEBACiAKIAlpbnQgICAgICAgICAgdXNpbmdfdjRsMjsKIAorCS8qIHVzZWQgYnkgdGRhOTg4NyAqLworCXVuc2lnbmVkIGludCAgICAgICB0ZGE5ODg3X2NvbmZpZzsKKwl1bnNpZ25lZCBjaGFyIAkgICB0ZGE5ODg3X2RhdGFbNF07CisKIAkvKiB1c2VkIGJ5IE1UMjAzMiAqLwogCXVuc2lnbmVkIGludCB4b2djOwogCXVuc2lnbmVkIGludCByYWRpb19pZjI7CkBAIC0yMDYsNiArMjE0LDggQEAKIAl2b2lkICgqc2V0X3JhZGlvX2ZyZXEpKHN0cnVjdCBpMmNfY2xpZW50ICpjLCB1bnNpZ25lZCBpbnQgZnJlcSk7CiAJaW50ICAoKmhhc19zaWduYWwpKHN0cnVjdCBpMmNfY2xpZW50ICpjKTsKIAlpbnQgICgqaXNfc3RlcmVvKShzdHJ1Y3QgaTJjX2NsaWVudCAqYyk7CisJaW50ICAoKmdldF9hZmMpKHN0cnVjdCBpMmNfY2xpZW50ICpjKTsKKwl2b2lkICgqdHVuZXJfc3RhdHVzKShzdHJ1Y3QgaTJjX2NsaWVudCAqYyk7CiAJdm9pZCAoKnN0YW5kYnkpKHN0cnVjdCBpMmNfY2xpZW50ICpjKTsKIH07CiAKQEAgLTIxOCw2ICsyMjgsNyBAQAogZXh0ZXJuIGludCB0ZWE1NzY3X3R1bmVyX2luaXQoc3RydWN0IGkyY19jbGllbnQgKmMpOwogZXh0ZXJuIGludCBkZWZhdWx0X3R1bmVyX2luaXQoc3RydWN0IGkyY19jbGllbnQgKmMpOwogZXh0ZXJuIGludCB0ZWE1NzY3X2F1dG9kZXRlY3Rpb24oc3RydWN0IGkyY19jbGllbnQgKmMpOworZXh0ZXJuIGludCB0ZGE5ODg3X3R1bmVyX2luaXQoc3RydWN0IGkyY19jbGllbnQgKmMpOwogCiAjZGVmaW5lIHR1bmVyX3dhcm4oZm10LCBhcmcuLi4pIGRvIHtcCiAJcHJpbnRrKEtFUk5fV0FSTklORyAiJXMgJWQtJTA0eDogIiBmbXQsIHQtPmkyYy5kcml2ZXItPmRyaXZlci5uYW1lLCBcCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3R2cDUxNTAuaCBiL2luY2x1ZGUvbWVkaWEvdHZwNTE1MC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyYmQyYTIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL3R2cDUxNTAuaApAQCAtMCwwICsxLDM0IEBACisvKgorICAgIHR2cDUxNTAuaCAtIGRlZmluaXRpb24gZm9yIHR2cDUxNTAgaW5wdXRzCisKKyAgICBDb3B5cmlnaHQgKEMpIDIwMDYgSGFucyBWZXJrdWlsIChodmVya3VpbEB4czRhbGwubmwpCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyovCisKKyNpZm5kZWYgX1RWUDUxNTBfSF8KKyNkZWZpbmUgX1RWUDUxNTBfSF8KKworLyogVFZQNTE1MCBIVyBpbnB1dHMgKi8KKyNkZWZpbmUgVFZQNTE1MF9DT01QT1NJVEUwIDAKKyNkZWZpbmUgVFZQNTE1MF9DT01QT1NJVEUxIDEKKyNkZWZpbmUgVFZQNTE1MF9TVklERU8gICAgIDIKKworLyogVFZQNTE1MCBIVyBvdXRwdXRzICovCisjZGVmaW5lIFRWUDUxNTBfTk9STUFMICAgICAgIDAKKyNkZWZpbmUgVFZQNTE1MF9CTEFDS19TQ1JFRU4gMQorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS92NGwyLWNvbW1vbi5oIGIvaW5jbHVkZS9tZWRpYS92NGwyLWNvbW1vbi5oCmluZGV4IDY0MjUyMGEuLjU1NjRkYjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvdjRsMi1jb21tb24uaAorKysgYi9pbmNsdWRlL21lZGlhL3Y0bDItY29tbW9uLmgKQEAgLTI2LDggKzI2LDE0IEBACiAjaWZuZGVmIFY0TDJfQ09NTU9OX0hfCiAjZGVmaW5lIFY0TDJfQ09NTU9OX0hfCiAKKyNpbmNsdWRlIDxtZWRpYS92NGwyLWRldi5oPgorCiAvKiB2NGwgZGVidWdnaW5nIGFuZCBkaWFnbm9zdGljcyAqLwogCisvKiBEZWJ1ZyBiaXRtYXNrIGZsYWdzIHRvIGJlIHVzZWQgb24gVjRMMiAqLworI2RlZmluZSBWNEwyX0RFQlVHX0lPQ1RMICAgICAweDAxCisjZGVmaW5lIFY0TDJfREVCVUdfSU9DVExfQVJHIDB4MDIKKwogLyogQ29tbW9uIHByaW50ayBjb25zdHVjdHMgZm9yIHY0bC1pMmMgZHJpdmVycy4gVGhlc2UgbWFjcm9zIGNyZWF0ZSBhIHVuaXF1ZQogICAgcHJlZml4IGNvbnNpc3Rpbmcgb2YgdGhlIGRyaXZlciBuYW1lLCB0aGUgYWRhcHRlciBudW1iZXIgYW5kIHRoZSBpMmMKICAgIGFkZHJlc3MuICovCkBAIC03OCw2ICs4NCwxOSBAQAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKKy8qIENvbnRyb2wgaGVscGVyIGZ1bmN0aW9ucyAqLworCitpbnQgdjRsMl9jdHJsX2NoZWNrKHN0cnVjdCB2NGwyX2V4dF9jb250cm9sICpjdHJsLCBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKnFjdHJsLAorCQljb25zdCBjaGFyICoqbWVudV9pdGVtcyk7Citjb25zdCBjaGFyICoqdjRsMl9jdHJsX2dldF9tZW51KHUzMiBpZCk7CitpbnQgdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwoc3RydWN0IHY0bDJfcXVlcnljdHJsICpxY3RybCwgczMyIG1pbiwgczMyIG1heCwgczMyIHN0ZXAsIHMzMiBkZWYpOworaW50IHY0bDJfY3RybF9xdWVyeV9maWxsX3N0ZChzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKnFjdHJsKTsKK2ludCB2NGwyX2N0cmxfcXVlcnlfbWVudShzdHJ1Y3QgdjRsMl9xdWVyeW1lbnUgKnFtZW51LAorCQlzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKnFjdHJsLCBjb25zdCBjaGFyICoqbWVudV9pdGVtcyk7Cit1MzIgdjRsMl9jdHJsX25leHQoY29uc3QgdTMyICogY29uc3QgKmN0cmxfY2xhc3NlcywgdTMyIGlkKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCiAvKiBJbnRlcm5hbCBpb2N0bHMgKi8KIAogLyogVklESU9DX0lOVF9HX1JFR0lTVEVSIGFuZCBWSURJT0NfSU5UX1NfUkVHSVNURVIgKi8KQEAgLTExMiw2ICsxMzEsOCBAQAogCVY0TDJfSURFTlRfU0FBNzEyOSA9IDE1OSwKIAogCS8qIG1vZHVsZSBjeDI1ODQwOiByZXNlcnZlZCByYW5nZSAyMDAtMjQ5ICovCisJVjRMMl9JREVOVF9DWDI1ODM2ID0gMjM2LAorCVY0TDJfSURFTlRfQ1gyNTgzNyA9IDIzNywKIAlWNEwyX0lERU5UX0NYMjU4NDAgPSAyNDAsCiAJVjRMMl9JREVOVF9DWDI1ODQxID0gMjQxLAogCVY0TDJfSURFTlRfQ1gyNTg0MiA9IDI0MiwKQEAgLTIxMSw0ICsyMzIsMTUgQEAKICNkZWZpbmUJVklESU9DX0lOVF9TX1ZJREVPX1JPVVRJTkcJX0lPVyAoJ2QnLCAxMTEsIHN0cnVjdCB2NGwyX3JvdXRpbmcpCiAjZGVmaW5lCVZJRElPQ19JTlRfR19WSURFT19ST1VUSU5HCV9JT1IgKCdkJywgMTEyLCBzdHJ1Y3QgdjRsMl9yb3V0aW5nKQogCitzdHJ1Y3QgdjRsMl9jcnlzdGFsX2ZyZXEgeworCXUzMiBmcmVxOwkvKiBmcmVxdWVuY3kgaW4gSHogb2YgdGhlIGNyeXN0YWwgKi8KKwl1MzIgZmxhZ3M7IAkvKiBkZXZpY2Ugc3BlY2lmaWMgZmxhZ3MgKi8KK307CisKKy8qIFNldHMgdGhlIGZyZXF1ZW5jeSBvZiB0aGUgY3J5c3RhbCB1c2VkIHRvIGdlbmVyYXRlIHRoZSBjbG9ja3MuCisgICBBbiBleHRyYSBmbGFncyBmaWVsZCBhbGxvd3MgZGV2aWNlIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gcmVnYXJkaW5nCisgICBjbG9jayBmcmVxdWVuY3kgZGl2aWRlcnMsIGV0Yy4gSWYgbm90IHVzZWQsIHRoZW4gc2V0IGZsYWdzIHRvIDAuCisgICBJZiB0aGUgZnJlcXVlbmN5IGlzIG5vdCBzdXBwb3J0ZWQsIHRoZW4gLUVJTlZBTCBpcyByZXR1cm5lZC4gKi8KKyNkZWZpbmUgVklESU9DX0lOVF9TX0NSWVNUQUxfRlJFUSAJX0lPVyAoJ2QnLCAxMTMsIHN0cnVjdCB2NGwyX2NyeXN0YWxfZnJlcSkKKwogI2VuZGlmIC8qIFY0TDJfQ09NTU9OX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3Y0bDItZGV2LmggYi9pbmNsdWRlL21lZGlhL3Y0bDItZGV2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFiNDczMQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvdjRsMi1kZXYuaApAQCAtMCwwICsxLDM3NSBAQAorLyoKKyAqCisgKglWIDQgTCAyICAgRCBSIEkgViBFIFIgICBIIEUgTCBQIEUgUiAgIEEgUCBJCisgKgorICogTW92ZWQgZnJvbSB2aWRlb2RldjIuaAorICoKKyAqCVNvbWUgY29tbW9ubHkgbmVlZGVkIGZ1bmN0aW9ucyBmb3IgZHJpdmVycyAodjRsMi1jb21tb24ubyBtb2R1bGUpCisgKi8KKyNpZm5kZWYgX1Y0TDJfREVWX0gKKyNkZWZpbmUgX1Y0TDJfREVWX0gKKworI2RlZmluZSBPQlNPTEVURV9PV05FUiAxIC8qIHRvIGJlIHJlbW92ZWQgc29vbiAqLworCisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPiAvKiBuZWVkIF9fdXNlciAqLworI2lmZGVmIENPTkZJR19WSURFT19WNEwxCisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KKyNlbHNlCisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisKKyNkZWZpbmUgVklERU9fTUFKT1IJODEKKy8qIE1pbm9yIGRldmljZSBhbGxvY2F0aW9uICovCisjZGVmaW5lIE1JTk9SX1ZGTF9UWVBFX0dSQUJCRVJfTUlOICAgMAorI2RlZmluZSBNSU5PUl9WRkxfVFlQRV9HUkFCQkVSX01BWCAgNjMKKyNkZWZpbmUgTUlOT1JfVkZMX1RZUEVfUkFESU9fTUlOICAgIDY0CisjZGVmaW5lIE1JTk9SX1ZGTF9UWVBFX1JBRElPX01BWCAgIDEyNworI2RlZmluZSBNSU5PUl9WRkxfVFlQRV9WVFhfTUlOICAgICAxOTIKKyNkZWZpbmUgTUlOT1JfVkZMX1RZUEVfVlRYX01BWCAgICAgMjIzCisjZGVmaW5lIE1JTk9SX1ZGTF9UWVBFX1ZCSV9NSU4gICAgIDIyNAorI2RlZmluZSBNSU5PUl9WRkxfVFlQRV9WQklfTUFYICAgICAyNTUKKworI2RlZmluZSBWRkxfVFlQRV9HUkFCQkVSCTAKKyNkZWZpbmUgVkZMX1RZUEVfVkJJCQkxCisjZGVmaW5lIFZGTF9UWVBFX1JBRElPCQkyCisjZGVmaW5lIFZGTF9UWVBFX1ZUWAkJMworCisvKiAgVmlkZW8gc3RhbmRhcmQgZnVuY3Rpb25zICAqLworZXh0ZXJuIHVuc2lnbmVkIGludCB2NGwyX3ZpZGVvX3N0ZF9mcHMoc3RydWN0IHY0bDJfc3RhbmRhcmQgKnZzKTsKK2V4dGVybiBpbnQgdjRsMl92aWRlb19zdGRfY29uc3RydWN0KHN0cnVjdCB2NGwyX3N0YW5kYXJkICp2cywKKwkJCQkgICAgaW50IGlkLCBjaGFyICpuYW1lKTsKKworLyogcHJvcml0eSBoYW5kbGluZyAqLworc3RydWN0IHY0bDJfcHJpb19zdGF0ZSB7CisJYXRvbWljX3QgcHJpb3NbNF07Cit9OworaW50IHY0bDJfcHJpb19pbml0KHN0cnVjdCB2NGwyX3ByaW9fc3RhdGUgKmdsb2JhbCk7CitpbnQgdjRsMl9wcmlvX2NoYW5nZShzdHJ1Y3QgdjRsMl9wcmlvX3N0YXRlICpnbG9iYWwsIGVudW0gdjRsMl9wcmlvcml0eSAqbG9jYWwsCisJCSAgICAgZW51bSB2NGwyX3ByaW9yaXR5IG5ldyk7CitpbnQgdjRsMl9wcmlvX29wZW4oc3RydWN0IHY0bDJfcHJpb19zdGF0ZSAqZ2xvYmFsLCBlbnVtIHY0bDJfcHJpb3JpdHkgKmxvY2FsKTsKK2ludCB2NGwyX3ByaW9fY2xvc2Uoc3RydWN0IHY0bDJfcHJpb19zdGF0ZSAqZ2xvYmFsLCBlbnVtIHY0bDJfcHJpb3JpdHkgKmxvY2FsKTsKK2VudW0gdjRsMl9wcmlvcml0eSB2NGwyX3ByaW9fbWF4KHN0cnVjdCB2NGwyX3ByaW9fc3RhdGUgKmdsb2JhbCk7CitpbnQgdjRsMl9wcmlvX2NoZWNrKHN0cnVjdCB2NGwyX3ByaW9fc3RhdGUgKmdsb2JhbCwgZW51bSB2NGwyX3ByaW9yaXR5ICpsb2NhbCk7CisKKy8qIG5hbWVzIGZvciBmYW5jeSBkZWJ1ZyBvdXRwdXQgKi8KK2V4dGVybiBjaGFyICp2NGwyX2ZpZWxkX25hbWVzW107CitleHRlcm4gY2hhciAqdjRsMl90eXBlX25hbWVzW107CisKKy8qICBDb21wYXRpYmlsaXR5IGxheWVyIGludGVyZmFjZSAgLS0gIHY0bDEtY29tcGF0IG1vZHVsZSAqLwordHlwZWRlZiBpbnQgKCp2NGwyX2tpb2N0bCkoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgICB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpOworI2lmZGVmIENPTkZJR19WSURFT19WNEwxX0NPTVBBVAoraW50IHY0bF9jb21wYXRfdHJhbnNsYXRlX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJICAgICAgIGludCBjbWQsIHZvaWQgKmFyZywgdjRsMl9raW9jdGwgZHJpdmVyX2lvY3RsKTsKKyNlbHNlCisjZGVmaW5lIHY0bF9jb21wYXRfdHJhbnNsYXRlX2lvY3RsKGlub2RlLGZpbGUsY21kLGFyZyxpb2N0bCkgLUVJTlZBTAorI2VuZGlmCisKKy8qIDMyIEJpdHMgY29tcGF0aWJpbGl0eSBsYXllciBmb3IgNjQgYml0cyBwcm9jZXNzb3JzICovCitleHRlcm4gbG9uZyB2NGxfY29tcGF0X2lvY3RsMzIoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkJdW5zaWduZWQgbG9uZyBhcmcpOworCisvKgorICogTmV3ZXIgdmVyc2lvbiBvZiB2aWRlb19kZXZpY2UsIGhhbmRsZWQgYnkgdmlkZW9kZXYyLmMKKyAqIAlUaGlzIHZlcnNpb24gbW92ZXMgcmVkdW5kYW50IGNvZGUgZnJvbSB2aWRlbyBkZXZpY2UgY29kZSB0bworICoJdGhlIGNvbW1vbiBoYW5kbGVyCisgKi8KK3N0cnVjdCB2NGwyX3R2bm9ybSB7CisJY2hhciAgICAgICAgICAqbmFtZTsKKwl2NGwyX3N0ZF9pZCAgIGlkOworCisJdm9pZCAgICAgICAgICAqcHJpdl9kYXRhOworfTsKKworc3RydWN0IHZpZGVvX2RldmljZQoreworCS8qIGRldmljZSBvcHMgKi8KKwljb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICpmb3BzOworCisJLyogZGV2aWNlIGluZm8gKi8KKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJY2hhciBuYW1lWzMyXTsKKwlpbnQgdHlwZTsgICAgICAgLyogdjRsMSAqLworCWludCB0eXBlMjsgICAgICAvKiB2NGwyICovCisJaW50IGhhcmR3YXJlOworCWludCBtaW5vcjsKKworCWludCBkZWJ1ZzsJLyogQWN0aXZhdGVzIGRlYnVnIGxldmVsKi8KKworCS8qIFZpZGVvIHN0YW5kYXJkIHZhcnMgKi8KKwlpbnQgdHZub3Jtc2l6ZTsJLyogU2l6ZSBvZiB0dm5vcm0gYXJyYXkgKi8KKwl2NGwyX3N0ZF9pZCBjdXJyZW50X25vcm07IC8qIEN1cnJlbnQgdHZub3JtICovCisJc3RydWN0IHY0bDJfdHZub3JtICp0dm5vcm1zOworCisJLyogY2FsbGJhY2tzICovCisJdm9pZCAoKnJlbGVhc2UpKHN0cnVjdCB2aWRlb19kZXZpY2UgKnZmZCk7CisKKwkvKiBpb2N0bCBjYWxsYmFja3MgKi8KKworCS8qIFZJRElPQ19RVUVSWUNBUCBoYW5kbGVyICovCisJaW50ICgqdmlkaW9jX3F1ZXJ5Y2FwKShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsIHN0cnVjdCB2NGwyX2NhcGFiaWxpdHkgKmNhcCk7CisKKwkvKiBQcmlvcml0eSBoYW5kbGluZyAqLworCWludCAoKnZpZGlvY19nX3ByaW9yaXR5KSAgIChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCisJCQkJICAgIGVudW0gdjRsMl9wcmlvcml0eSAqcCk7CisJaW50ICgqdmlkaW9jX3NfcHJpb3JpdHkpICAgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKKwkJCQkgICAgZW51bSB2NGwyX3ByaW9yaXR5IHApOworCisJLyogVklESU9DX0VOVU1fRk1UIGhhbmRsZXJzICovCisJaW50ICgqdmlkaW9jX2VudW1fZm10X2NhcCkgICAgICAgICAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAorCQkJCQkgICAgc3RydWN0IHY0bDJfZm10ZGVzYyAqZik7CisJaW50ICgqdmlkaW9jX2VudW1fZm10X292ZXJsYXkpICAgICAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAorCQkJCQkgICAgc3RydWN0IHY0bDJfZm10ZGVzYyAqZik7CisJaW50ICgqdmlkaW9jX2VudW1fZm10X3ZiaSkgICAgICAgICAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAorCQkJCQkgICAgc3RydWN0IHY0bDJfZm10ZGVzYyAqZik7CisJaW50ICgqdmlkaW9jX2VudW1fZm10X3ZiaV9jYXB0dXJlKSAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAorCQkJCQkgICAgc3RydWN0IHY0bDJfZm10ZGVzYyAqZik7CisJaW50ICgqdmlkaW9jX2VudW1fZm10X3ZpZGVvX291dHB1dCkoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAorCQkJCQkgICAgc3RydWN0IHY0bDJfZm10ZGVzYyAqZik7CisJaW50ICgqdmlkaW9jX2VudW1fZm10X3ZiaV9vdXRwdXQpICAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAorCQkJCQkgICAgc3RydWN0IHY0bDJfZm10ZGVzYyAqZik7CisJaW50ICgqdmlkaW9jX2VudW1fZm10X3R5cGVfcHJpdmF0ZSkoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAorCQkJCQkgICAgc3RydWN0IHY0bDJfZm10ZGVzYyAqZik7CisKKwkvKiBWSURJT0NfR19GTVQgaGFuZGxlcnMgKi8KKwlpbnQgKCp2aWRpb2NfZ19mbXRfY2FwKSAgICAgICAgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKKwkJCQkJc3RydWN0IHY0bDJfZm9ybWF0ICpmKTsKKwlpbnQgKCp2aWRpb2NfZ19mbXRfb3ZlcmxheSkgICAgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKKwkJCQkJc3RydWN0IHY0bDJfZm9ybWF0ICpmKTsKKwlpbnQgKCp2aWRpb2NfZ19mbXRfdmJpKSAgICAgICAgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKKwkJCQkJc3RydWN0IHY0bDJfZm9ybWF0ICpmKTsKKwlpbnQgKCp2aWRpb2NfZ19mbXRfdmJpX291dHB1dCkgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKKwkJCQkJc3RydWN0IHY0bDJfZm9ybWF0ICpmKTsKKwlpbnQgKCp2aWRpb2NfZ19mbXRfdmJpX2NhcHR1cmUpKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKKwkJCQkJc3RydWN0IHY0bDJfZm9ybWF0ICpmKTsKKwlpbnQgKCp2aWRpb2NfZ19mbXRfdmlkZW9fb3V0cHV0KShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCisJCQkJCXN0cnVjdCB2NGwyX2Zvcm1hdCAqZik7CisJaW50ICgqdmlkaW9jX2dfZm10X3R5cGVfcHJpdmF0ZSkoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAorCQkJCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpOworCisJLyogVklESU9DX1NfRk1UIGhhbmRsZXJzICovCisJaW50ICgqdmlkaW9jX3NfZm10X2NhcCkgICAgICAgIChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCisJCQkJCXN0cnVjdCB2NGwyX2Zvcm1hdCAqZik7CisKKwlpbnQgKCp2aWRpb2Nfc19mbXRfb3ZlcmxheSkgICAgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKKwkJCQkJc3RydWN0IHY0bDJfZm9ybWF0ICpmKTsKKwlpbnQgKCp2aWRpb2Nfc19mbXRfdmJpKSAgICAgICAgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKKwkJCQkJc3RydWN0IHY0bDJfZm9ybWF0ICpmKTsKKwlpbnQgKCp2aWRpb2Nfc19mbXRfdmJpX291dHB1dCkgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKKwkJCQkJc3RydWN0IHY0bDJfZm9ybWF0ICpmKTsKKwlpbnQgKCp2aWRpb2Nfc19mbXRfdmJpX2NhcHR1cmUpKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKKwkJCQkJc3RydWN0IHY0bDJfZm9ybWF0ICpmKTsKKwlpbnQgKCp2aWRpb2Nfc19mbXRfdmlkZW9fb3V0cHV0KShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCisJCQkJCXN0cnVjdCB2NGwyX2Zvcm1hdCAqZik7CisJaW50ICgqdmlkaW9jX3NfZm10X3R5cGVfcHJpdmF0ZSkoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAorCQkJCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpOworCisJLyogVklESU9DX1RSWV9GTVQgaGFuZGxlcnMgKi8KKwlpbnQgKCp2aWRpb2NfdHJ5X2ZtdF9jYXApICAgICAgICAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAorCQkJCQkgIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZik7CisJaW50ICgqdmlkaW9jX3RyeV9mbXRfb3ZlcmxheSkgICAgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKKwkJCQkJICBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpOworCWludCAoKnZpZGlvY190cnlfZm10X3ZiaSkgICAgICAgIChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCisJCQkJCSAgc3RydWN0IHY0bDJfZm9ybWF0ICpmKTsKKwlpbnQgKCp2aWRpb2NfdHJ5X2ZtdF92Ymlfb3V0cHV0KSAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAorCQkJCQkgIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZik7CisJaW50ICgqdmlkaW9jX3RyeV9mbXRfdmJpX2NhcHR1cmUpKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKKwkJCQkJICBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpOworCWludCAoKnZpZGlvY190cnlfZm10X3ZpZGVvX291dHB1dCkoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAorCQkJCQkgIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZik7CisJaW50ICgqdmlkaW9jX3RyeV9mbXRfdHlwZV9wcml2YXRlKShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCisJCQkJCSAgc3RydWN0IHY0bDJfZm9ybWF0ICpmKTsKKworCS8qIEJ1ZmZlciBoYW5kbGVycyAqLworCWludCAoKnZpZGlvY19yZXFidWZzKSAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLCBzdHJ1Y3QgdjRsMl9yZXF1ZXN0YnVmZmVycyAqYik7CisJaW50ICgqdmlkaW9jX3F1ZXJ5YnVmKShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsIHN0cnVjdCB2NGwyX2J1ZmZlciAqYik7CisJaW50ICgqdmlkaW9jX3FidWYpICAgIChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsIHN0cnVjdCB2NGwyX2J1ZmZlciAqYik7CisJaW50ICgqdmlkaW9jX2RxYnVmKSAgIChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsIHN0cnVjdCB2NGwyX2J1ZmZlciAqYik7CisKKworCWludCAoKnZpZGlvY19vdmVybGF5KSAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLCB1bnNpZ25lZCBpbnQgaSk7CisjaWZkZWYgSEFWRV9WNEwxCisJCQkvKiBidWZmZXIgdHlwZSBpcyBzdHJ1Y3QgdmlkaW9fbWJ1ZiAqICovCisJaW50ICgqdmlkaW9jZ21idWYpICAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLCBzdHJ1Y3QgdmlkZW9fbWJ1ZiAqcCk7CisjZW5kaWYKKwlpbnQgKCp2aWRpb2NfZ19mYnVmKSAgIChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCisJCQkJc3RydWN0IHY0bDJfZnJhbWVidWZmZXIgKmEpOworCWludCAoKnZpZGlvY19zX2ZidWYpICAgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKKwkJCQlzdHJ1Y3QgdjRsMl9mcmFtZWJ1ZmZlciAqYSk7CisKKwkJLyogU3RyZWFtIG9uL29mZiAqLworCWludCAoKnZpZGlvY19zdHJlYW1vbikgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwgZW51bSB2NGwyX2J1Zl90eXBlIGkpOworCWludCAoKnZpZGlvY19zdHJlYW1vZmYpKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwgZW51bSB2NGwyX2J1Zl90eXBlIGkpOworCisJCS8qIFN0YW5kYXJkIGhhbmRsaW5nCisJCQlHX1NURCBhbmQgRU5VTVNURCBhcmUgaGFuZGxlZCBieSB2aWRlb2Rldi5jCisJCSAqLworCWludCAoKnZpZGlvY19zX3N0ZCkgICAgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwgdjRsMl9zdGRfaWQgYSk7CisJaW50ICgqdmlkaW9jX3F1ZXJ5c3RkKSAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLCB2NGwyX3N0ZF9pZCAqYSk7CisKKwkJLyogSW5wdXQgaGFuZGxpbmcgKi8KKwlpbnQgKCp2aWRpb2NfZW51bV9pbnB1dCkoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAorCQkJCSBzdHJ1Y3QgdjRsMl9pbnB1dCAqaW5wKTsKKwlpbnQgKCp2aWRpb2NfZ19pbnB1dCkgICAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLCB1bnNpZ25lZCBpbnQgKmkpOworCWludCAoKnZpZGlvY19zX2lucHV0KSAgIChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsIHVuc2lnbmVkIGludCBpKTsKKworCQkvKiBPdXRwdXQgaGFuZGxpbmcgKi8KKwlpbnQgKCp2aWRpb2NfZW51bW91dHB1dCkgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKKwkJCQkgIHN0cnVjdCB2NGwyX291dHB1dCAqYSk7CisJaW50ICgqdmlkaW9jX2dfb3V0cHV0KSAgIChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsIHVuc2lnbmVkIGludCAqaSk7CisJaW50ICgqdmlkaW9jX3Nfb3V0cHV0KSAgIChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsIHVuc2lnbmVkIGludCBpKTsKKworCQkvKiBDb250cm9sIGhhbmRsaW5nICovCisJaW50ICgqdmlkaW9jX3F1ZXJ5Y3RybCkgICAgICAgIChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCisJCQkJCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqYSk7CisJaW50ICgqdmlkaW9jX2dfY3RybCkgICAgICAgICAgIChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCisJCQkJCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmEpOworCWludCAoKnZpZGlvY19zX2N0cmwpICAgICAgICAgICAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAorCQkJCQlzdHJ1Y3QgdjRsMl9jb250cm9sICphKTsKKwlpbnQgKCp2aWRpb2NfZ19leHRfY3RybHMpICAgICAgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKKwkJCQkJc3RydWN0IHY0bDJfZXh0X2NvbnRyb2xzICphKTsKKwlpbnQgKCp2aWRpb2Nfc19leHRfY3RybHMpICAgICAgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKKwkJCQkJc3RydWN0IHY0bDJfZXh0X2NvbnRyb2xzICphKTsKKwlpbnQgKCp2aWRpb2NfdHJ5X2V4dF9jdHJscykgICAgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKKwkJCQkJc3RydWN0IHY0bDJfZXh0X2NvbnRyb2xzICphKTsKKwlpbnQgKCp2aWRpb2NfcXVlcnltZW51KSAgICAgICAgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKKwkJCQkJc3RydWN0IHY0bDJfcXVlcnltZW51ICphKTsKKworCS8qIEF1ZGlvIGlvY3RscyAqLworCWludCAoKnZpZGlvY19lbnVtYXVkaW8pICAgICAgICAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAorCQkJCQlzdHJ1Y3QgdjRsMl9hdWRpbyAqYSk7CisJaW50ICgqdmlkaW9jX2dfYXVkaW8pICAgICAgICAgIChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCisJCQkJCXN0cnVjdCB2NGwyX2F1ZGlvICphKTsKKwlpbnQgKCp2aWRpb2Nfc19hdWRpbykgICAgICAgICAgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKKwkJCQkJc3RydWN0IHY0bDJfYXVkaW8gKmEpOworCisJLyogQXVkaW8gb3V0IGlvY3RscyAqLworCWludCAoKnZpZGlvY19lbnVtYXVkb3V0KSAgICAgICAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAorCQkJCQlzdHJ1Y3QgdjRsMl9hdWRpb291dCAqYSk7CisJaW50ICgqdmlkaW9jX2dfYXVkb3V0KSAgICAgICAgIChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCisJCQkJCXN0cnVjdCB2NGwyX2F1ZGlvb3V0ICphKTsKKwlpbnQgKCp2aWRpb2Nfc19hdWRvdXQpICAgICAgICAgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKKwkJCQkJc3RydWN0IHY0bDJfYXVkaW9vdXQgKmEpOworCWludCAoKnZpZGlvY19nX21vZHVsYXRvcikgICAgICAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAorCQkJCQlzdHJ1Y3QgdjRsMl9tb2R1bGF0b3IgKmEpOworCWludCAoKnZpZGlvY19zX21vZHVsYXRvcikgICAgICAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAorCQkJCQlzdHJ1Y3QgdjRsMl9tb2R1bGF0b3IgKmEpOworCS8qIENyb3AgaW9jdGxzICovCisJaW50ICgqdmlkaW9jX2Nyb3BjYXApICAgICAgICAgIChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCisJCQkJCXN0cnVjdCB2NGwyX2Nyb3BjYXAgKmEpOworCWludCAoKnZpZGlvY19nX2Nyb3ApICAgICAgICAgICAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAorCQkJCQlzdHJ1Y3QgdjRsMl9jcm9wICphKTsKKwlpbnQgKCp2aWRpb2Nfc19jcm9wKSAgICAgICAgICAgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKKwkJCQkJc3RydWN0IHY0bDJfY3JvcCAqYSk7CisJLyogQ29tcHJlc3Npb24gaW9jdGxzICovCisJaW50ICgqdmlkaW9jX2dfbXBlZ2NvbXApICAgICAgIChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCisJCQkJCXN0cnVjdCB2NGwyX21wZWdfY29tcHJlc3Npb24gKmEpOworCWludCAoKnZpZGlvY19zX21wZWdjb21wKSAgICAgICAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAorCQkJCQlzdHJ1Y3QgdjRsMl9tcGVnX2NvbXByZXNzaW9uICphKTsKKwlpbnQgKCp2aWRpb2NfZ19qcGVnY29tcCkgICAgICAgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKKwkJCQkJc3RydWN0IHY0bDJfanBlZ2NvbXByZXNzaW9uICphKTsKKwlpbnQgKCp2aWRpb2Nfc19qcGVnY29tcCkgICAgICAgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKKwkJCQkJc3RydWN0IHY0bDJfanBlZ2NvbXByZXNzaW9uICphKTsKKworCS8qIFN0cmVhbSB0eXBlLWRlcGVuZGVudCBwYXJhbWV0ZXIgaW9jdGxzICovCisJaW50ICgqdmlkaW9jX2dfcGFybSkgICAgICAgICAgIChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCisJCQkJCXN0cnVjdCB2NGwyX3N0cmVhbXBhcm0gKmEpOworCWludCAoKnZpZGlvY19zX3Bhcm0pICAgICAgICAgICAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAorCQkJCQlzdHJ1Y3QgdjRsMl9zdHJlYW1wYXJtICphKTsKKworCS8qIFR1bmVyIGlvY3RscyAqLworCWludCAoKnZpZGlvY19nX3R1bmVyKSAgICAgICAgICAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAorCQkJCQlzdHJ1Y3QgdjRsMl90dW5lciAqYSk7CisJaW50ICgqdmlkaW9jX3NfdHVuZXIpICAgICAgICAgIChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCisJCQkJCXN0cnVjdCB2NGwyX3R1bmVyICphKTsKKwlpbnQgKCp2aWRpb2NfZ19mcmVxdWVuY3kpICAgICAgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKKwkJCQkJc3RydWN0IHY0bDJfZnJlcXVlbmN5ICphKTsKKwlpbnQgKCp2aWRpb2Nfc19mcmVxdWVuY3kpICAgICAgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKKwkJCQkJc3RydWN0IHY0bDJfZnJlcXVlbmN5ICphKTsKKworCS8qIFNsaWNlZCBWQkkgY2FwICovCisJaW50ICgqdmlkaW9jX2dfc2xpY2VkX3ZiaV9jYXApIChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCisJCQkJCXN0cnVjdCB2NGwyX3NsaWNlZF92YmlfY2FwICphKTsKKworCS8qIExvZyBzdGF0dXMgaW9jdGwgKi8KKwlpbnQgKCp2aWRpb2NfbG9nX3N0YXR1cykgICAgICAgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCk7CisKKworI2lmZGVmIE9CU09MRVRFX09XTkVSIC8qIHRvIGJlIHJlbW92ZWQgc29vbiAqLworLyogb2Jzb2xldGUgLS0gZm9wcy0+b3duZXIgaXMgdXNlZCBpbnN0ZWFkICovCitzdHJ1Y3QgbW9kdWxlICpvd25lcjsKKy8qIGRldi0+ZHJpdmVyX2RhdGEgd2lsbCBiZSB1c2VkIGluc3RlYWQgc29tZSBkYXkuCisJKiBVc2UgdGhlIHZpZGVvX3tnZXR8c2V0fV9kcnZkYXRhKCkgaGVscGVyIGZ1bmN0aW9ucywKKwkqIHNvIHRoZSBzd2l0Y2ggb3ZlciB3aWxsIGJlIHRyYW5zcGFyZW50IGZvciB5b3UuCisJKiBPciB1c2Uge3BjaXx1c2J9X3tnZXR8c2V0fV9kcnZkYXRhKCkgZGlyZWN0bHkuICovCit2b2lkICpwcml2OworI2VuZGlmCisKKwkvKiBmb3IgdmlkZW9kZXYuYyBpbnRlbmFsIHVzYWdlIC0tIHBsZWFzZSBkb24ndCB0b3VjaCAqLworCWludCB1c2VyczsgICAgICAgICAgICAgICAgICAgICAvKiB2aWRlb19leGNsdXNpdmVfe29wZW58Y2xvc2V9IC4uLiAqLworCXN0cnVjdCBtdXRleCBsb2NrOyAgICAgICAgICAgICAvKiAuLi4gaGVscGVyIGZ1bmN0aW9uIHVzZXMgdGhlc2UgICAqLworCWNoYXIgZGV2ZnNfbmFtZVs2NF07ICAgICAgICAgICAvKiBkZXZmcyAqLworCXN0cnVjdCBjbGFzc19kZXZpY2UgY2xhc3NfZGV2OyAvKiBzeXNmcyAqLworfTsKKworLyogVmVyc2lvbiAyIGZ1bmN0aW9ucyAqLworZXh0ZXJuIGludCB2aWRlb19yZWdpc3Rlcl9kZXZpY2Uoc3RydWN0IHZpZGVvX2RldmljZSAqdmZkLCBpbnQgdHlwZSwgaW50IG5yKTsKK3ZvaWQgdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2Uoc3RydWN0IHZpZGVvX2RldmljZSAqKTsKK2V4dGVybiBpbnQgdmlkZW9faW9jdGwyKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CisKKy8qIGhlbHBlciBmdW5jdGlvbnMgdG8gYWxsb2MgLyByZWxlYXNlIHN0cnVjdCB2aWRlb19kZXZpY2UsIHRoZQorICAgbGF0ZXIgY2FuIGJlIHVzZWQgZm9yIHZpZGVvX2RldmljZS0+cmVsZWFzZSgpICovCitzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2aWRlb19kZXZpY2VfYWxsb2Modm9pZCk7Cit2b2lkIHZpZGVvX2RldmljZV9yZWxlYXNlKHN0cnVjdCB2aWRlb19kZXZpY2UgKnZmZCk7CisKKy8qIEluY2x1ZGUgc3VwcG9ydCBmb3Igb2Jzb2xldGVkIHN0dWZmICovCitleHRlcm4gaW50IHZpZGVvX3VzZXJjb3B5KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZywKKwkJCSAgaW50ICgqZnVuYykoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJICAgICAgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKSk7CisKKworI2lmZGVmIEhBVkVfVjRMMQorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisKK2V4dGVybiBzdHJ1Y3QgdmlkZW9fZGV2aWNlKiB2aWRlb19kZXZkYXRhKHN0cnVjdCBmaWxlKik7CisKKyNkZWZpbmUgdG9fdmlkZW9fZGV2aWNlKGNkKSBjb250YWluZXJfb2YoY2QsIHN0cnVjdCB2aWRlb19kZXZpY2UsIGNsYXNzX2RldikKK3N0YXRpYyBpbmxpbmUgdm9pZAordmlkZW9fZGV2aWNlX2NyZWF0ZV9maWxlKHN0cnVjdCB2aWRlb19kZXZpY2UgKnZmZCwKKwkJCSBzdHJ1Y3QgY2xhc3NfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0cikKK3sKKwljbGFzc19kZXZpY2VfY3JlYXRlX2ZpbGUoJnZmZC0+Y2xhc3NfZGV2LCBhdHRyKTsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZAordmlkZW9fZGV2aWNlX3JlbW92ZV9maWxlKHN0cnVjdCB2aWRlb19kZXZpY2UgKnZmZCwKKwkJCSBzdHJ1Y3QgY2xhc3NfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0cikKK3sKKwljbGFzc19kZXZpY2VfcmVtb3ZlX2ZpbGUoJnZmZC0+Y2xhc3NfZGV2LCBhdHRyKTsKK30KKworI2lmZGVmIE9CU09MRVRFX09XTkVSIC8qIHRvIGJlIHJlbW92ZWQgc29vbiAqLworLyogaGVscGVyIGZ1bmN0aW9ucyB0byBhY2Nlc3MgZHJpdmVyIHByaXZhdGUgZGF0YS4gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCAqdmlkZW9fZ2V0X2RydmRhdGEoc3RydWN0IHZpZGVvX2RldmljZSAqZGV2KQoreworCXJldHVybiBkZXYtPnByaXY7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB2aWRlb19zZXRfZHJ2ZGF0YShzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCit7CisJZGV2LT5wcml2ID0gZGF0YTsKK30KKyNlbmRpZgorCitleHRlcm4gaW50IHZpZGVvX2V4Y2x1c2l2ZV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKK2V4dGVybiBpbnQgdmlkZW9fZXhjbHVzaXZlX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOworI2VuZGlmIC8qIEhBVkVfVjRMMSAqLworCisjZW5kaWYgLyogX1Y0TDJfREVWX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvdmlkZW8tYnVmLWR2Yi5oIGIvaW5jbHVkZS9tZWRpYS92aWRlby1idWYtZHZiLmgKaW5kZXggYjc4ZDkwZi4uODIzM2NhZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS92aWRlby1idWYtZHZiLmgKKysrIGIvaW5jbHVkZS9tZWRpYS92aWRlby1idWYtZHZiLmgKQEAgLTI2LDcgKzI2LDggQEAKIAogaW50IHZpZGVvYnVmX2R2Yl9yZWdpc3RlcihzdHJ1Y3QgdmlkZW9idWZfZHZiICpkdmIsCiAJCQkgIHN0cnVjdCBtb2R1bGUgKm1vZHVsZSwKLQkJCSAgdm9pZCAqYWRhcHRlcl9wcml2KTsKKwkJCSAgdm9pZCAqYWRhcHRlcl9wcml2LAorCQkJICBzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpOwogdm9pZCB2aWRlb2J1Zl9kdmJfdW5yZWdpc3RlcihzdHJ1Y3QgdmlkZW9idWZfZHZiICpkdmIpOwogCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS92aWRlby1idWYuaCBiL2luY2x1ZGUvbWVkaWEvdmlkZW8tYnVmLmgKaW5kZXggZmZmM2ZkMC4uMTExNWEyNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS92aWRlby1idWYuaAorKysgYi9pbmNsdWRlL21lZGlhL3ZpZGVvLWJ1Zi5oCkBAIC0yMyw2ICsyMyw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KIAogI2RlZmluZSBVTlNFVCAoLTFVKQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC90aXBjL3RpcGNfYmVhcmVyLmggYi9pbmNsdWRlL25ldC90aXBjL3RpcGNfYmVhcmVyLmgKaW5kZXggMDk4NjA3Yy4uZTA3MTM2ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvdGlwYy90aXBjX2JlYXJlci5oCisrKyBiL2luY2x1ZGUvbmV0L3RpcGMvdGlwY19iZWFyZXIuaApAQCAtNDksMTAgKzQ5LDE4IEBACiAKICNkZWZpbmUgVElQQ19NRURJQV9UWVBFX0VUSAkxCiAKKy8qIAorICogRGVzdGluYXRpb24gYWRkcmVzcyBzdHJ1Y3R1cmUgdXNlZCBieSBUSVBDIGJlYXJlcnMgd2hlbiBzZW5kaW5nIG1lc3NhZ2VzCisgKiAKKyAqIElNUE9SVEFOVDogVGhlIGZpZWxkcyBvZiB0aGlzIHN0cnVjdHVyZSBNVVNUIGJlIHN0b3JlZCB1c2luZyB0aGUgc3BlY2lmaWVkCisgKiBieXRlIG9yZGVyIGluZGljYXRlZCBiZWxvdywgYXMgdGhlIHN0cnVjdHVyZSBpcyBleGNoYW5nZWQgYmV0d2VlbiBub2RlcworICogYXMgcGFydCBvZiBhIGxpbmsgc2V0dXAgcHJvY2Vzcy4KKyAqLworCiBzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyIHsKLQlfX3UzMiAgdHlwZTsKKwlfX3UzMiAgdHlwZTsJCQkvKiBiZWFyZXIgdHlwZSAobmV0d29yayBieXRlIG9yZGVyKSAqLwogCXVuaW9uIHsKLQkJX191OCAgIGV0aF9hZGRyWzZdOwkvKiBFdGhlcm5ldCBiZWFyZXIgKi8gCisJCV9fdTggICBldGhfYWRkcls2XTsJLyogNDggYml0IEV0aGVybmV0IGFkZHIgKGJ5dGUgYXJyYXkpICovIAogI2lmIDAKIAkJLyogUHJvdG90eXBlcyBmb3Igb3RoZXIgcG9zc2libGUgYmVhcmVyIHR5cGVzICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvdGVhNTc1eC10dW5lci5oIGIvaW5jbHVkZS9zb3VuZC90ZWE1NzV4LXR1bmVyLmgKaW5kZXggYTRmNTU0NTIuLmI1MDY3ZDMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvdGVhNTc1eC10dW5lci5oCisrKyBiL2luY2x1ZGUvc291bmQvdGVhNTc1eC10dW5lci5oCkBAIC0yMCw5ICsyMCwxMCBAQAogICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKICAqCi0gKi8gICAgICAKKyAqLwogCiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWRldi5oPgogCiBzdHJ1Y3Qgc25kX3RlYTU3NXg7CiAKZGlmZiAtLWdpdCBhL2luaXQvS2NvbmZpZyBiL2luaXQvS2NvbmZpZwppbmRleCBkZjg2NGEzLi5kZjU1YjM2IDEwMDY0NAotLS0gYS9pbml0L0tjb25maWcKKysrIGIvaW5pdC9LY29uZmlnCkBAIC0xLDMgKzEsMTEgQEAKK2NvbmZpZyBERUZDT05GSUdfTElTVAorCXN0cmluZworCW9wdGlvbiBkZWZjb25maWdfbGlzdAorCWRlZmF1bHQgIi9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgorCWRlZmF1bHQgIi9ldGMva2VybmVsLWNvbmZpZyIKKwlkZWZhdWx0ICIvYm9vdC9jb25maWctJFVOQU1FX1JFTEVBU0UiCisJZGVmYXVsdCAiYXJjaC8kQVJDSC9kZWZjb25maWciCisKIG1lbnUgIkNvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucyIKIAogY29uZmlnIEVYUEVSSU1FTlRBTApAQCAtMTUxLDcgKzE1OSw4IEBACiAJICBhdCA8aHR0cDovL3d3dy5waHlzaWszLnVuaS1yb3N0b2NrLmRlL3RpbS9rZXJuZWwvdXRpbHMvYWNjdC8+LgogCiBjb25maWcgU1lTQ1RMCi0JYm9vbCAiU3lzY3RsIHN1cHBvcnQiCisJYm9vbCAiU3lzY3RsIHN1cHBvcnQiIGlmIEVNQkVEREVECisJZGVmYXVsdCB5CiAJLS0taGVscC0tLQogCSAgVGhlIHN5c2N0bCBpbnRlcmZhY2UgcHJvdmlkZXMgYSBtZWFucyBvZiBkeW5hbWljYWxseSBjaGFuZ2luZwogCSAgY2VydGFpbiBrZXJuZWwgcGFyYW1ldGVycyBhbmQgdmFyaWFibGVzIG9uIHRoZSBmbHkgd2l0aG91dCByZXF1aXJpbmcKQEAgLTIzNSwxNiArMjQ0LDYgQEAKIAloZWxwCiAJICBUaGlzIGVuYWJsZXMgdGhlIGxlZ2FjeSAxNi1iaXQgVUlEIHN5c2NhbGwgd3JhcHBlcnMuCiAKLWNvbmZpZyBWTTg2Ci0JZGVwZW5kcyBYODYKLQlkZWZhdWx0IHkKLQlib29sICJFbmFibGUgVk04NiBzdXBwb3J0IiBpZiBFTUJFRERFRAotCWhlbHAKLSAgICAgICAgICBUaGlzIG9wdGlvbiBpcyByZXF1aXJlZCBieSBwcm9ncmFtcyBsaWtlIERPU0VNVSB0byBydW4gMTYtYml0IGxlZ2FjeQotCSAgY29kZSBvbiBYODYgcHJvY2Vzc29ycy4gSXQgYWxzbyBtYXkgYmUgbmVlZGVkIGJ5IHNvZnR3YXJlIGxpa2UKLSAgICAgICAgICBYRnJlZTg2IHRvIGluaXRpYWxpemUgc29tZSB2aWRlbyBjYXJkcyB2aWEgQklPUy4gRGlzYWJsaW5nIHRoaXMKLSAgICAgICAgICBvcHRpb24gc2F2ZXMgYWJvdXQgNmsuCi0KIGNvbmZpZyBDQ19PUFRJTUlaRV9GT1JfU0laRQogCWJvb2wgIk9wdGltaXplIGZvciBzaXplIChMb29rIG91dCBmb3IgYnJva2VuIGNvbXBpbGVycyEpIgogCWRlZmF1bHQgeQpkaWZmIC0tZ2l0IGEvaW5pdC9pbml0cmFtZnMuYyBiL2luaXQvaW5pdHJhbWZzLmMKaW5kZXggZjgxY2ZhNC4uZDI4YzEwOSAxMDA2NDQKLS0tIGEvaW5pdC9pbml0cmFtZnMuYworKysgYi9pbml0L2luaXRyYW1mcy5jCkBAIC0zMCw2ICszMCw3IEBACiAKIHN0YXRpYyBfX2luaXRkYXRhIHN0cnVjdCBoYXNoIHsKIAlpbnQgaW5vLCBtaW5vciwgbWFqb3I7CisJbW9kZV90IG1vZGU7CiAJc3RydWN0IGhhc2ggKm5leHQ7CiAJY2hhciBuYW1lW05fQUxJR04oUEFUSF9NQVgpXTsKIH0gKmhlYWRbMzJdOwpAQCAtNDEsNyArNDIsOCBAQAogCXJldHVybiB0bXAgJiAzMTsKIH0KIAotc3RhdGljIGNoYXIgX19pbml0ICpmaW5kX2xpbmsoaW50IG1ham9yLCBpbnQgbWlub3IsIGludCBpbm8sIGNoYXIgKm5hbWUpCitzdGF0aWMgY2hhciBfX2luaXQgKmZpbmRfbGluayhpbnQgbWFqb3IsIGludCBtaW5vciwgaW50IGlubywKKwkJCSAgICAgIG1vZGVfdCBtb2RlLCBjaGFyICpuYW1lKQogewogCXN0cnVjdCBoYXNoICoqcCwgKnE7CiAJZm9yIChwID0gaGVhZCArIGhhc2gobWFqb3IsIG1pbm9yLCBpbm8pOyAqcDsgcCA9ICYoKnApLT5uZXh0KSB7CkBAIC01MSwxNCArNTMsMTcgQEAKIAkJCWNvbnRpbnVlOwogCQlpZiAoKCpwKS0+bWFqb3IgIT0gbWFqb3IpCiAJCQljb250aW51ZTsKKwkJaWYgKCgoKnApLT5tb2RlIF4gbW9kZSkgJiBTX0lGTVQpCisJCQljb250aW51ZTsKIAkJcmV0dXJuICgqcCktPm5hbWU7CiAJfQogCXEgPSAoc3RydWN0IGhhc2ggKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBoYXNoKSk7CiAJaWYgKCFxKQogCQlwYW5pYygiY2FuJ3QgYWxsb2NhdGUgbGluayBoYXNoIGVudHJ5Iik7Ci0JcS0+aW5vID0gaW5vOwotCXEtPm1pbm9yID0gbWlub3I7CiAJcS0+bWFqb3IgPSBtYWpvcjsKKwlxLT5taW5vciA9IG1pbm9yOworCXEtPmlubyA9IGlubzsKKwlxLT5tb2RlID0gbW9kZTsKIAlzdHJjcHkocS0+bmFtZSwgbmFtZSk7CiAJcS0+bmV4dCA9IE5VTEw7CiAJKnAgPSBxOwpAQCAtMjI5LDEzICsyMzQsMjUgQEAKIHN0YXRpYyBpbnQgX19pbml0IG1heWJlX2xpbmsodm9pZCkKIHsKIAlpZiAobmxpbmsgPj0gMikgewotCQljaGFyICpvbGQgPSBmaW5kX2xpbmsobWFqb3IsIG1pbm9yLCBpbm8sIGNvbGxlY3RlZCk7CisJCWNoYXIgKm9sZCA9IGZpbmRfbGluayhtYWpvciwgbWlub3IsIGlubywgbW9kZSwgY29sbGVjdGVkKTsKIAkJaWYgKG9sZCkKIAkJCXJldHVybiAoc3lzX2xpbmsob2xkLCBjb2xsZWN0ZWQpIDwgMCkgPyAtMSA6IDE7CiAJfQogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBfX2luaXQgY2xlYW5fcGF0aChjaGFyICpwYXRoLCBtb2RlX3QgbW9kZSkKK3sKKwlzdHJ1Y3Qgc3RhdCBzdDsKKworCWlmICghc3lzX25ld2xzdGF0KHBhdGgsICZzdCkgJiYgKHN0LnN0X21vZGVebW9kZSkgJiBTX0lGTVQpIHsKKwkJaWYgKFNfSVNESVIoc3Quc3RfbW9kZSkpCisJCQlzeXNfcm1kaXIocGF0aCk7CisJCWVsc2UKKwkJCXN5c191bmxpbmsocGF0aCk7CisJfQorfQorCiBzdGF0aWMgX19pbml0ZGF0YSBpbnQgd2ZkOwogCiBzdGF0aWMgaW50IF9faW5pdCBkb19uYW1lKHZvaWQpCkBAIC0yNDgsOSArMjY1LDE1IEBACiAJfQogCWlmIChkcnlfcnVuKQogCQlyZXR1cm4gMDsKKwljbGVhbl9wYXRoKGNvbGxlY3RlZCwgbW9kZSk7CiAJaWYgKFNfSVNSRUcobW9kZSkpIHsKLQkJaWYgKG1heWJlX2xpbmsoKSA+PSAwKSB7Ci0JCQl3ZmQgPSBzeXNfb3Blbihjb2xsZWN0ZWQsIE9fV1JPTkxZfE9fQ1JFQVQsIG1vZGUpOworCQlpbnQgbWwgPSBtYXliZV9saW5rKCk7CisJCWlmIChtbCA+PSAwKSB7CisJCQlpbnQgb3BlbmZsYWdzID0gT19XUk9OTFl8T19DUkVBVDsKKwkJCWlmIChtbCAhPSAxKQorCQkJCW9wZW5mbGFncyB8PSBPX1RSVU5DOworCQkJd2ZkID0gc3lzX29wZW4oY29sbGVjdGVkLCBvcGVuZmxhZ3MsIG1vZGUpOworCiAJCQlpZiAod2ZkID49IDApIHsKIAkJCQlzeXNfZmNob3duKHdmZCwgdWlkLCBnaWQpOwogCQkJCXN5c19mY2htb2Qod2ZkLCBtb2RlKTsKQEAgLTI5MSw2ICszMTQsNyBAQAogc3RhdGljIGludCBfX2luaXQgZG9fc3ltbGluayh2b2lkKQogewogCWNvbGxlY3RlZFtOX0FMSUdOKG5hbWVfbGVuKSArIGJvZHlfbGVuXSA9ICdcMCc7CisJY2xlYW5fcGF0aChjb2xsZWN0ZWQsIDApOwogCXN5c19zeW1saW5rKGNvbGxlY3RlZCArIE5fQUxJR04obmFtZV9sZW4pLCBjb2xsZWN0ZWQpOwogCXN5c19sY2hvd24oY29sbGVjdGVkLCB1aWQsIGdpZCk7CiAJc3RhdGUgPSBTa2lwSXQ7CmRpZmYgLS1naXQgYS9pbml0L21haW4uYyBiL2luaXQvbWFpbi5jCmluZGV4IGY3MTViOWIuLjgwYWYxYTUgMTAwNjQ0Ci0tLSBhL2luaXQvbWFpbi5jCisrKyBiL2luaXQvbWFpbi5jCkBAIC00Nyw2ICs0Nyw3IEBACiAjaW5jbHVkZSA8bGludXgvcm1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L21lbXBvbGljeS5oPgogI2luY2x1ZGUgPGxpbnV4L2tleS5oPgorI2luY2x1ZGUgPGxpbnV4L3Vud2luZC5oPgogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2J1Z3MuaD4KQEAgLTQ4Miw2ICs0ODMsNyBAQAogCQkgICBfX3N0b3BfX19wYXJhbSAtIF9fc3RhcnRfX19wYXJhbSwKIAkJICAgJnVua25vd25fYm9vdG9wdGlvbik7CiAJc29ydF9tYWluX2V4dGFibGUoKTsKKwl1bndpbmRfaW5pdCgpOwogCXRyYXBfaW5pdCgpOwogCXJjdV9pbml0KCk7CiAJaW5pdF9JUlEoKTsKQEAgLTQ5MCw2ICs0OTIsNyBAQAogCWhydGltZXJzX2luaXQoKTsKIAlzb2Z0aXJxX2luaXQoKTsKIAl0aW1lX2luaXQoKTsKKwl0aW1la2VlcGluZ19pbml0KCk7CiAKIAkvKgogCSAqIEhBQ0sgQUxFUlQhIFRoaXMgaXMgZWFybHkuIFdlJ3JlIGVuYWJsaW5nIHRoZSBjb25zb2xlIGJlZm9yZQpkaWZmIC0tZ2l0IGEva2VybmVsL01ha2VmaWxlIGIva2VybmVsL01ha2VmaWxlCmluZGV4IGY2ZWYwMGYuLjc1MmJkN2QgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9NYWtlZmlsZQorKysgYi9rZXJuZWwvTWFrZWZpbGUKQEAgLTEwLDYgKzEwLDcgQEAKIAkgICAga3RocmVhZC5vIHdhaXQubyBrZmlmby5vIHN5c19uaS5vIHBvc2l4LWNwdS10aW1lcnMubyBtdXRleC5vIFwKIAkgICAgaHJ0aW1lci5vCiAKK29iai15ICs9IHRpbWUvCiBvYmotJChDT05GSUdfREVCVUdfTVVURVhFUykgKz0gbXV0ZXgtZGVidWcubwogb2JqLSQoQ09ORklHX0ZVVEVYKSArPSBmdXRleC5vCiBpZmVxICgkKENPTkZJR19DT01QQVQpLHkpCkBAIC0yMSw2ICsyMiw3IEBACiBvYmotJChDT05GSUdfVUlEMTYpICs9IHVpZDE2Lm8KIG9iai0kKENPTkZJR19NT0RVTEVTKSArPSBtb2R1bGUubwogb2JqLSQoQ09ORklHX0tBTExTWU1TKSArPSBrYWxsc3ltcy5vCitvYmotJChDT05GSUdfU1RBQ0tfVU5XSU5EKSArPSB1bndpbmQubwogb2JqLSQoQ09ORklHX1BNKSArPSBwb3dlci8KIG9iai0kKENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUKSArPSBhY2N0Lm8KIG9iai0kKENPTkZJR19LRVhFQykgKz0ga2V4ZWMubwpkaWZmIC0tZ2l0IGEva2VybmVsL2FjY3QuYyBiL2tlcm5lbC9hY2N0LmMKaW5kZXggNjgwMjAyMC4uMzY4YzRmMCAxMDA2NDQKLS0tIGEva2VybmVsL2FjY3QuYworKysgYi9rZXJuZWwvYWNjdC5jCkBAIC03NSw3ICs3NSw3IEBACiAvKgogICogRXh0ZXJuYWwgcmVmZXJlbmNlcyBhbmQgYWxsIG9mIHRoZSBnbG9iYWxzLgogICovCi1zdGF0aWMgdm9pZCBkb19hY2N0X3Byb2Nlc3MobG9uZywgc3RydWN0IGZpbGUgKik7CitzdGF0aWMgdm9pZCBkb19hY2N0X3Byb2Nlc3Moc3RydWN0IGZpbGUgKik7CiAKIC8qCiAgKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHNvIHRoYXQgYWxsIHRoZSBkYXRhIHByb3RlY3RlZCBieSBsb2NrCkBAIC0xOTYsNyArMTk2LDcgQEAKIAlpZiAob2xkX2FjY3QpIHsKIAkJbW50X3VucGluKG9sZF9hY2N0LT5mX3Zmc21udCk7CiAJCXNwaW5fdW5sb2NrKCZhY2N0X2dsb2JhbHMubG9jayk7Ci0JCWRvX2FjY3RfcHJvY2VzcygwLCBvbGRfYWNjdCk7CisJCWRvX2FjY3RfcHJvY2VzcyhvbGRfYWNjdCk7CiAJCWZpbHBfY2xvc2Uob2xkX2FjY3QsIE5VTEwpOwogCQlzcGluX2xvY2soJmFjY3RfZ2xvYmFscy5sb2NrKTsKIAl9CkBAIC00MTksMTYgKzQxOSwxNSBAQAogLyoKICAqICBkb19hY2N0X3Byb2Nlc3MgZG9lcyBhbGwgYWN0dWFsIHdvcmsuIENhbGxlciBob2xkcyB0aGUgcmVmZXJlbmNlIHRvIGZpbGUuCiAgKi8KLXN0YXRpYyB2b2lkIGRvX2FjY3RfcHJvY2Vzcyhsb25nIGV4aXRjb2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3N0YXRpYyB2b2lkIGRvX2FjY3RfcHJvY2VzcyhzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKKwlzdHJ1Y3QgcGFjY3Rfc3RydWN0ICpwYWNjdCA9ICZjdXJyZW50LT5zaWduYWwtPnBhY2N0OwogCWFjY3RfdCBhYzsKIAltbV9zZWdtZW50X3QgZnM7Ci0JdW5zaWduZWQgbG9uZyB2c2l6ZTsKIAl1bnNpZ25lZCBsb25nIGZsaW07CiAJdTY0IGVsYXBzZWQ7CiAJdTY0IHJ1bl90aW1lOwogCXN0cnVjdCB0aW1lc3BlYyB1cHRpbWU7Ci0JdW5zaWduZWQgbG9uZyBqaWZmaWVzOwogCiAJLyoKIAkgKiBGaXJzdCBjaGVjayB0byBzZWUgaWYgdGhlcmUgaXMgZW5vdWdoIGZyZWVfc3BhY2UgdG8gY29udGludWUKQEAgLTQ2OSwxMiArNDY4LDYgQEAKICNlbmRpZgogCWRvX2RpdihlbGFwc2VkLCBBSFopOwogCWFjLmFjX2J0aW1lID0geHRpbWUudHZfc2VjIC0gZWxhcHNlZDsKLQlqaWZmaWVzID0gY3B1dGltZV90b19qaWZmaWVzKGNwdXRpbWVfYWRkKGN1cnJlbnQtPnV0aW1lLAotCQkJCQkJIGN1cnJlbnQtPnNpZ25hbC0+dXRpbWUpKTsKLQlhYy5hY191dGltZSA9IGVuY29kZV9jb21wX3QoamlmZmllc190b19BSFooamlmZmllcykpOwotCWppZmZpZXMgPSBjcHV0aW1lX3RvX2ppZmZpZXMoY3B1dGltZV9hZGQoY3VycmVudC0+c3RpbWUsCi0JCQkJCQkgY3VycmVudC0+c2lnbmFsLT5zdGltZSkpOwotCWFjLmFjX3N0aW1lID0gZW5jb2RlX2NvbXBfdChqaWZmaWVzX3RvX0FIWihqaWZmaWVzKSk7CiAJLyogd2UgcmVhbGx5IG5lZWQgdG8gYml0ZSB0aGUgYnVsbGV0IGFuZCBjaGFuZ2UgbGF5b3V0ICovCiAJYWMuYWNfdWlkID0gY3VycmVudC0+dWlkOwogCWFjLmFjX2dpZCA9IGN1cnJlbnQtPmdpZDsKQEAgLTQ5NiwzNyArNDg5LDE4IEBACiAJCW9sZF9lbmNvZGVfZGV2KHR0eV9kZXZudW0oY3VycmVudC0+c2lnbmFsLT50dHkpKSA6IDA7CiAJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOwogCi0JYWMuYWNfZmxhZyA9IDA7Ci0JaWYgKGN1cnJlbnQtPmZsYWdzICYgUEZfRk9SS05PRVhFQykKLQkJYWMuYWNfZmxhZyB8PSBBRk9SSzsKLQlpZiAoY3VycmVudC0+ZmxhZ3MgJiBQRl9TVVBFUlBSSVYpCi0JCWFjLmFjX2ZsYWcgfD0gQVNVOwotCWlmIChjdXJyZW50LT5mbGFncyAmIFBGX0RVTVBDT1JFKQotCQlhYy5hY19mbGFnIHw9IEFDT1JFOwotCWlmIChjdXJyZW50LT5mbGFncyAmIFBGX1NJR05BTEVEKQotCQlhYy5hY19mbGFnIHw9IEFYU0lHOwotCi0JdnNpemUgPSAwOwotCWlmIChjdXJyZW50LT5tbSkgewotCQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKLQkJZG93bl9yZWFkKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwotCQl2bWEgPSBjdXJyZW50LT5tbS0+bW1hcDsKLQkJd2hpbGUgKHZtYSkgewotCQkJdnNpemUgKz0gdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0OwotCQkJdm1hID0gdm1hLT52bV9uZXh0OwotCQl9Ci0JCXVwX3JlYWQoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7Ci0JfQotCXZzaXplID0gdnNpemUgLyAxMDI0OwotCWFjLmFjX21lbSA9IGVuY29kZV9jb21wX3QodnNpemUpOworCXNwaW5fbG9jaygmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CisJYWMuYWNfdXRpbWUgPSBlbmNvZGVfY29tcF90KGppZmZpZXNfdG9fQUhaKGNwdXRpbWVfdG9famlmZmllcyhwYWNjdC0+YWNfdXRpbWUpKSk7CisJYWMuYWNfc3RpbWUgPSBlbmNvZGVfY29tcF90KGppZmZpZXNfdG9fQUhaKGNwdXRpbWVfdG9famlmZmllcyhwYWNjdC0+YWNfc3RpbWUpKSk7CisJYWMuYWNfZmxhZyA9IHBhY2N0LT5hY19mbGFnOworCWFjLmFjX21lbSA9IGVuY29kZV9jb21wX3QocGFjY3QtPmFjX21lbSk7CisJYWMuYWNfbWluZmx0ID0gZW5jb2RlX2NvbXBfdChwYWNjdC0+YWNfbWluZmx0KTsKKwlhYy5hY19tYWpmbHQgPSBlbmNvZGVfY29tcF90KHBhY2N0LT5hY19tYWpmbHQpOworCWFjLmFjX2V4aXRjb2RlID0gcGFjY3QtPmFjX2V4aXRjb2RlOworCXNwaW5fdW5sb2NrKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKIAlhYy5hY19pbyA9IGVuY29kZV9jb21wX3QoMCAvKiBjdXJyZW50LT5pb191c2FnZSAqLyk7CS8qICUlICovCiAJYWMuYWNfcncgPSBlbmNvZGVfY29tcF90KGFjLmFjX2lvIC8gMTAyNCk7Ci0JYWMuYWNfbWluZmx0ID0gZW5jb2RlX2NvbXBfdChjdXJyZW50LT5zaWduYWwtPm1pbl9mbHQgKwotCQkJCSAgICAgY3VycmVudC0+bWluX2ZsdCk7Ci0JYWMuYWNfbWFqZmx0ID0gZW5jb2RlX2NvbXBfdChjdXJyZW50LT5zaWduYWwtPm1hal9mbHQgKwotCQkJCSAgICAgY3VycmVudC0+bWFqX2ZsdCk7CiAJYWMuYWNfc3dhcHMgPSBlbmNvZGVfY29tcF90KDApOwotCWFjLmFjX2V4aXRjb2RlID0gZXhpdGNvZGU7CiAKIAkvKgogICAgICAgICAgKiBLZXJuZWwgc2VnbWVudCBvdmVycmlkZSB0byBkYXRhc2VnbWVudCBhbmQgd3JpdGUgaXQKQEAgLTU0NiwxMiArNTIwLDYzIEBACiB9CiAKIC8qKgorICogYWNjdF9pbml0X3BhY2N0IC0gaW5pdGlhbGl6ZSBhIG5ldyBwYWNjdF9zdHJ1Y3QKKyAqLwordm9pZCBhY2N0X2luaXRfcGFjY3Qoc3RydWN0IHBhY2N0X3N0cnVjdCAqcGFjY3QpCit7CisJbWVtc2V0KHBhY2N0LCAwLCBzaXplb2Yoc3RydWN0IHBhY2N0X3N0cnVjdCkpOworCXBhY2N0LT5hY191dGltZSA9IHBhY2N0LT5hY19zdGltZSA9IGNwdXRpbWVfemVybzsKK30KKworLyoqCisgKiBhY2N0X2NvbGxlY3QgLSBjb2xsZWN0IGFjY291bnRpbmcgaW5mb3JtYXRpb24gaW50byBwYWNjdF9zdHJ1Y3QKKyAqIEBleGl0Y29kZTogdGFzayBleGl0IGNvZGUKKyAqIEBncm91cF9kZWFkOiBub3QgMCwgaWYgdGhpcyB0aHJlYWQgaXMgdGhlIGxhc3Qgb25lIGluIHRoZSBwcm9jZXNzLgorICovCit2b2lkIGFjY3RfY29sbGVjdChsb25nIGV4aXRjb2RlLCBpbnQgZ3JvdXBfZGVhZCkKK3sKKwlzdHJ1Y3QgcGFjY3Rfc3RydWN0ICpwYWNjdCA9ICZjdXJyZW50LT5zaWduYWwtPnBhY2N0OworCXVuc2lnbmVkIGxvbmcgdnNpemUgPSAwOworCisJaWYgKGdyb3VwX2RlYWQgJiYgY3VycmVudC0+bW0pIHsKKwkJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7CisJCWRvd25fcmVhZCgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKwkJdm1hID0gY3VycmVudC0+bW0tPm1tYXA7CisJCXdoaWxlICh2bWEpIHsKKwkJCXZzaXplICs9IHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydDsKKwkJCXZtYSA9IHZtYS0+dm1fbmV4dDsKKwkJfQorCQl1cF9yZWFkKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCX0KKworCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCWlmIChncm91cF9kZWFkKQorCQlwYWNjdC0+YWNfbWVtID0gdnNpemUgLyAxMDI0OworCWlmICh0aHJlYWRfZ3JvdXBfbGVhZGVyKGN1cnJlbnQpKSB7CisJCXBhY2N0LT5hY19leGl0Y29kZSA9IGV4aXRjb2RlOworCQlpZiAoY3VycmVudC0+ZmxhZ3MgJiBQRl9GT1JLTk9FWEVDKQorCQkJcGFjY3QtPmFjX2ZsYWcgfD0gQUZPUks7CisJfQorCWlmIChjdXJyZW50LT5mbGFncyAmIFBGX1NVUEVSUFJJVikKKwkJcGFjY3QtPmFjX2ZsYWcgfD0gQVNVOworCWlmIChjdXJyZW50LT5mbGFncyAmIFBGX0RVTVBDT1JFKQorCQlwYWNjdC0+YWNfZmxhZyB8PSBBQ09SRTsKKwlpZiAoY3VycmVudC0+ZmxhZ3MgJiBQRl9TSUdOQUxFRCkKKwkJcGFjY3QtPmFjX2ZsYWcgfD0gQVhTSUc7CisJcGFjY3QtPmFjX3V0aW1lID0gY3B1dGltZV9hZGQocGFjY3QtPmFjX3V0aW1lLCBjdXJyZW50LT51dGltZSk7CisJcGFjY3QtPmFjX3N0aW1lID0gY3B1dGltZV9hZGQocGFjY3QtPmFjX3N0aW1lLCBjdXJyZW50LT5zdGltZSk7CisJcGFjY3QtPmFjX21pbmZsdCArPSBjdXJyZW50LT5taW5fZmx0OworCXBhY2N0LT5hY19tYWpmbHQgKz0gY3VycmVudC0+bWFqX2ZsdDsKKwlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworfQorCisvKioKICAqIGFjY3RfcHJvY2VzcyAtIG5vdyBqdXN0IGEgd3JhcHBlciBhcm91bmQgZG9fYWNjdF9wcm9jZXNzCiAgKiBAZXhpdGNvZGU6IHRhc2sgZXhpdCBjb2RlCiAgKgogICogaGFuZGxlcyBwcm9jZXNzIGFjY291bnRpbmcgZm9yIGFuIGV4aXRpbmcgdGFzawogICovCi12b2lkIGFjY3RfcHJvY2Vzcyhsb25nIGV4aXRjb2RlKQordm9pZCBhY2N0X3Byb2Nlc3MoKQogewogCXN0cnVjdCBmaWxlICpmaWxlID0gTlVMTDsKIApAQCAtNTcwLDcgKzU5NSw3IEBACiAJZ2V0X2ZpbGUoZmlsZSk7CiAJc3Bpbl91bmxvY2soJmFjY3RfZ2xvYmFscy5sb2NrKTsKIAotCWRvX2FjY3RfcHJvY2VzcyhleGl0Y29kZSwgZmlsZSk7CisJZG9fYWNjdF9wcm9jZXNzKGZpbGUpOwogCWZwdXQoZmlsZSk7CiB9CiAKQEAgLTU5OSw5ICs2MjQsNyBAQAogICovCiB2b2lkIGFjY3RfY2xlYXJfaW50ZWdyYWxzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQogewotCWlmICh0c2spIHsKLQkJdHNrLT5hY2N0X3N0aW1leHBkID0gMDsKLQkJdHNrLT5hY2N0X3Jzc19tZW0xID0gMDsKLQkJdHNrLT5hY2N0X3ZtX21lbTEgPSAwOwotCX0KKwl0c2stPmFjY3Rfc3RpbWV4cGQgPSAwOworCXRzay0+YWNjdF9yc3NfbWVtMSA9IDA7CisJdHNrLT5hY2N0X3ZtX21lbTEgPSAwOwogfQpkaWZmIC0tZ2l0IGEva2VybmVsL2NvbXBhdC5jIGIva2VybmVsL2NvbXBhdC5jCmluZGV4IDJmNjcyMzMuLjEyNmRlZTkgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9jb21wYXQuYworKysgYi9rZXJuZWwvY29tcGF0LmMKQEAgLTczMCwxNyArNzMwLDEwIEBACiBzaWdzZXRfZnJvbV9jb21wYXQgKHNpZ3NldF90ICpzZXQsIGNvbXBhdF9zaWdzZXRfdCAqY29tcGF0KQogewogCXN3aXRjaCAoX05TSUdfV09SRFMpIHsKLSNpZiBkZWZpbmVkIChfX0NPTVBBVF9FTkRJQU5fU1dBUF9fKQotCWNhc2UgNDogc2V0LT5zaWdbM10gPSBjb21wYXQtPnNpZ1s3XSB8ICgoKGxvbmcpY29tcGF0LT5zaWdbNl0pIDw8IDMyICk7Ci0JY2FzZSAzOiBzZXQtPnNpZ1syXSA9IGNvbXBhdC0+c2lnWzVdIHwgKCgobG9uZyljb21wYXQtPnNpZ1s0XSkgPDwgMzIgKTsKLQljYXNlIDI6IHNldC0+c2lnWzFdID0gY29tcGF0LT5zaWdbM10gfCAoKChsb25nKWNvbXBhdC0+c2lnWzJdKSA8PCAzMiApOwotCWNhc2UgMTogc2V0LT5zaWdbMF0gPSBjb21wYXQtPnNpZ1sxXSB8ICgoKGxvbmcpY29tcGF0LT5zaWdbMF0pIDw8IDMyICk7Ci0jZWxzZQogCWNhc2UgNDogc2V0LT5zaWdbM10gPSBjb21wYXQtPnNpZ1s2XSB8ICgoKGxvbmcpY29tcGF0LT5zaWdbN10pIDw8IDMyICk7CiAJY2FzZSAzOiBzZXQtPnNpZ1syXSA9IGNvbXBhdC0+c2lnWzRdIHwgKCgobG9uZyljb21wYXQtPnNpZ1s1XSkgPDwgMzIgKTsKIAljYXNlIDI6IHNldC0+c2lnWzFdID0gY29tcGF0LT5zaWdbMl0gfCAoKChsb25nKWNvbXBhdC0+c2lnWzNdKSA8PCAzMiApOwogCWNhc2UgMTogc2V0LT5zaWdbMF0gPSBjb21wYXQtPnNpZ1swXSB8ICgoKGxvbmcpY29tcGF0LT5zaWdbMV0pIDw8IDMyICk7Ci0jZW5kaWYKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9jcHUuYyBiL2tlcm5lbC9jcHUuYwppbmRleCBmZTJiOGQwLi4wM2RjZDk4IDEwMDY0NAotLS0gYS9rZXJuZWwvY3B1LmMKKysrIGIva2VybmVsL2NwdS5jCkBAIC0xMywxMCArMTMsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvc3RvcF9tYWNoaW5lLmg+Ci0jaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAKIC8qIFRoaXMgcHJvdGVjdHMgQ1BVcyBnb2luZyB1cCBhbmQgZG93bi4uLiAqLwotc3RhdGljIERFQ0xBUkVfTVVURVgoY3B1Y29udHJvbCk7CitzdGF0aWMgREVGSU5FX01VVEVYKGNwdWNvbnRyb2wpOwogCiBzdGF0aWMgQkxPQ0tJTkdfTk9USUZJRVJfSEVBRChjcHVfY2hhaW4pOwogCkBAIC0zMCw5ICszMCw5IEBACiAKIAlpZiAobG9ja19jcHVfaG90cGx1Z19vd25lciAhPSBjdXJyZW50KSB7CiAJCWlmIChpbnRlcnJ1cHRpYmxlKQotCQkJcmV0ID0gZG93bl9pbnRlcnJ1cHRpYmxlKCZjcHVjb250cm9sKTsKKwkJCXJldCA9IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmY3B1Y29udHJvbCk7CiAJCWVsc2UKLQkJCWRvd24oJmNwdWNvbnRyb2wpOworCQkJbXV0ZXhfbG9jaygmY3B1Y29udHJvbCk7CiAJfQogCiAJLyoKQEAgLTU2LDcgKzU2LDcgQEAKIHsKIAlpZiAoLS1sb2NrX2NwdV9ob3RwbHVnX2RlcHRoID09IDApIHsKIAkJbG9ja19jcHVfaG90cGx1Z19vd25lciA9IE5VTEw7Ci0JCXVwKCZjcHVjb250cm9sKTsKKwkJbXV0ZXhfdW5sb2NrKCZjcHVjb250cm9sKTsKIAl9CiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh1bmxvY2tfY3B1X2hvdHBsdWcpOwpkaWZmIC0tZ2l0IGEva2VybmVsL2NwdXNldC5jIGIva2VybmVsL2NwdXNldC5jCmluZGV4IGI2MDJmNzMuLjE1MzVhZjMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9jcHVzZXQuYworKysgYi9rZXJuZWwvY3B1c2V0LmMKQEAgLTI0NDIsMzEgKzI0NDIsNDMgQEAKICAqLwogc3RhdGljIGludCBwcm9jX2NwdXNldF9zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKIHsKKwlzdHJ1Y3QgcGlkICpwaWQ7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0c2s7CiAJY2hhciAqYnVmOwotCWludCByZXR2YWwgPSAwOworCWludCByZXR2YWw7CiAKKwlyZXR2YWwgPSAtRU5PTUVNOwogCWJ1ZiA9IGttYWxsb2MoUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWJ1ZikKLQkJcmV0dXJuIC1FTk9NRU07CisJCWdvdG8gb3V0OwogCi0JdHNrID0gbS0+cHJpdmF0ZTsKKwlyZXR2YWwgPSAtRVNSQ0g7CisJcGlkID0gbS0+cHJpdmF0ZTsKKwl0c2sgPSBnZXRfcGlkX3Rhc2socGlkLCBQSURUWVBFX1BJRCk7CisJaWYgKCF0c2spCisJCWdvdG8gb3V0X2ZyZWU7CisKKwlyZXR2YWwgPSAtRUlOVkFMOwogCW11dGV4X2xvY2soJm1hbmFnZV9tdXRleCk7CisKIAlyZXR2YWwgPSBjcHVzZXRfcGF0aCh0c2stPmNwdXNldCwgYnVmLCBQQUdFX1NJWkUpOwogCWlmIChyZXR2YWwgPCAwKQotCQlnb3RvIG91dDsKKwkJZ290byBvdXRfdW5sb2NrOwogCXNlcV9wdXRzKG0sIGJ1Zik7CiAJc2VxX3B1dGMobSwgJ1xuJyk7Ci1vdXQ6CitvdXRfdW5sb2NrOgogCW11dGV4X3VubG9jaygmbWFuYWdlX211dGV4KTsKKwlwdXRfdGFza19zdHJ1Y3QodHNrKTsKK291dF9mcmVlOgogCWtmcmVlKGJ1Zik7CitvdXQ6CiAJcmV0dXJuIHJldHZhbDsKIH0KIAogc3RhdGljIGludCBjcHVzZXRfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IFBST0NfSShpbm9kZSktPnRhc2s7Ci0JcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIHByb2NfY3B1c2V0X3Nob3csIHRzayk7CisJc3RydWN0IHBpZCAqcGlkID0gUFJPQ19JKGlub2RlKS0+cGlkOworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBwcm9jX2NwdXNldF9zaG93LCBwaWQpOwogfQogCiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfY3B1c2V0X29wZXJhdGlvbnMgPSB7CmRpZmYgLS1naXQgYS9rZXJuZWwvZXhpdC5jIGIva2VybmVsL2V4aXQuYwppbmRleCBhM2JhZjkyLi4zMDRlZjYzIDEwMDY0NAotLS0gYS9rZXJuZWwvZXhpdC5jCisrKyBiL2tlcm5lbC9leGl0LmMKQEAgLTM2LDYgKzM2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KICNpbmNsdWRlIDxsaW51eC9waXBlX2ZzX2kuaD4KICNpbmNsdWRlIDxsaW51eC9hdWRpdC5oPiAvKiBmb3IgYXVkaXRfZnJlZSgpICovCisjaW5jbHVkZSA8bGludXgvcmVzb3VyY2UuaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgpAQCAtNDUsOCArNDYsNiBAQAogZXh0ZXJuIHZvaWQgc2VtX2V4aXQgKHZvaWQpOwogZXh0ZXJuIHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGRfcmVhcGVyOwogCi1pbnQgZ2V0cnVzYWdlKHN0cnVjdCB0YXNrX3N0cnVjdCAqLCBpbnQsIHN0cnVjdCBydXNhZ2UgX191c2VyICopOwotCiBzdGF0aWMgdm9pZCBleGl0X21tKHN0cnVjdCB0YXNrX3N0cnVjdCAqIHRzayk7CiAKIHN0YXRpYyB2b2lkIF9fdW5oYXNoX3Byb2Nlc3Moc3RydWN0IHRhc2tfc3RydWN0ICpwKQpAQCAtMTM4LDEyICsxMzcsOCBAQAogewogCWludCB6YXBfbGVhZGVyOwogCXRhc2tfdCAqbGVhZGVyOwotCXN0cnVjdCBkZW50cnkgKnByb2NfZGVudHJ5OwotCiByZXBlYXQ6CiAJYXRvbWljX2RlYygmcC0+dXNlci0+cHJvY2Vzc2VzKTsKLQlzcGluX2xvY2soJnAtPnByb2NfbG9jayk7Ci0JcHJvY19kZW50cnkgPSBwcm9jX3BpZF91bmhhc2gocCk7CiAJd3JpdGVfbG9ja19pcnEoJnRhc2tsaXN0X2xvY2spOwogCXB0cmFjZV91bmxpbmsocCk7CiAJQlVHX09OKCFsaXN0X2VtcHR5KCZwLT5wdHJhY2VfbGlzdCkgfHwgIWxpc3RfZW1wdHkoJnAtPnB0cmFjZV9jaGlsZHJlbikpOwpAQCAtMTcyLDggKzE2Nyw3IEBACiAKIAlzY2hlZF9leGl0KHApOwogCXdyaXRlX3VubG9ja19pcnEoJnRhc2tsaXN0X2xvY2spOwotCXNwaW5fdW5sb2NrKCZwLT5wcm9jX2xvY2spOwotCXByb2NfcGlkX2ZsdXNoKHByb2NfZGVudHJ5KTsKKwlwcm9jX2ZsdXNoX3Rhc2socCk7CiAJcmVsZWFzZV90aHJlYWQocCk7CiAJY2FsbF9yY3UoJnAtPnJjdSwgZGVsYXllZF9wdXRfdGFza19zdHJ1Y3QpOwogCkBAIC04OTUsMTEgKzg4OSwxMSBAQAogCWlmIChncm91cF9kZWFkKSB7CiAgCQlocnRpbWVyX2NhbmNlbCgmdHNrLT5zaWduYWwtPnJlYWxfdGltZXIpOwogCQlleGl0X2l0aW1lcnModHNrLT5zaWduYWwpOwotCQlhY2N0X3Byb2Nlc3MoY29kZSk7CiAJfQorCWFjY3RfY29sbGVjdChjb2RlLCBncm91cF9kZWFkKTsKIAlpZiAodW5saWtlbHkodHNrLT5yb2J1c3RfbGlzdCkpCiAJCWV4aXRfcm9idXN0X2xpc3QodHNrKTsKLSNpZmRlZiBDT05GSUdfQ09NUEFUCisjaWYgZGVmaW5lZChDT05GSUdfRlVURVgpICYmIGRlZmluZWQoQ09ORklHX0NPTVBBVCkKIAlpZiAodW5saWtlbHkodHNrLT5jb21wYXRfcm9idXN0X2xpc3QpKQogCQljb21wYXRfZXhpdF9yb2J1c3RfbGlzdCh0c2spOwogI2VuZGlmCkBAIC05MDcsNiArOTAxLDggQEAKIAkJYXVkaXRfZnJlZSh0c2spOwogCWV4aXRfbW0odHNrKTsKIAorCWlmIChncm91cF9kZWFkKQorCQlhY2N0X3Byb2Nlc3MoKTsKIAlleGl0X3NlbSh0c2spOwogCV9fZXhpdF9maWxlcyh0c2spOwogCV9fZXhpdF9mcyh0c2spOwpkaWZmIC0tZ2l0IGEva2VybmVsL2ZvcmsuYyBiL2tlcm5lbC9mb3JrLmMKaW5kZXggNDlhZGMwZS4uOWI0ZTU0ZSAxMDA2NDQKLS0tIGEva2VybmVsL2ZvcmsuYworKysgYi9rZXJuZWwvZm9yay5jCkBAIC04NzQsNiArODc0LDcgQEAKIAkJdHNrLT5pdF9wcm9mX2V4cGlyZXMgPQogCQkJc2Vjc190b19jcHV0aW1lKHNpZy0+cmxpbVtSTElNSVRfQ1BVXS5ybGltX2N1cik7CiAJfQorCWFjY3RfaW5pdF9wYWNjdCgmc2lnLT5wYWNjdCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTk5MiwxMyArOTkzLDEwIEBACiAJCWlmIChwdXRfdXNlcihwLT5waWQsIHBhcmVudF90aWRwdHIpKQogCQkJZ290byBiYWRfZm9ya19jbGVhbnVwOwogCi0JcC0+cHJvY19kZW50cnkgPSBOVUxMOwotCiAJSU5JVF9MSVNUX0hFQUQoJnAtPmNoaWxkcmVuKTsKIAlJTklUX0xJU1RfSEVBRCgmcC0+c2libGluZyk7CiAJcC0+dmZvcmtfZG9uZSA9IE5VTEw7CiAJc3Bpbl9sb2NrX2luaXQoJnAtPmFsbG9jX2xvY2spOwotCXNwaW5fbG9ja19pbml0KCZwLT5wcm9jX2xvY2spOwogCiAJY2xlYXJfdHNrX3RocmVhZF9mbGFnKHAsIFRJRl9TSUdQRU5ESU5HKTsKIAlpbml0X3NpZ3BlbmRpbmcoJnAtPnBlbmRpbmcpOwpAQCAtMTE1OCwxOCArMTE1Niw2IEBACiAJfQogCiAJaWYgKGNsb25lX2ZsYWdzICYgQ0xPTkVfVEhSRUFEKSB7Ci0JCS8qCi0JCSAqIEltcG9ydGFudDogaWYgYW4gZXhpdC1hbGwgaGFzIGJlZW4gc3RhcnRlZCB0aGVuCi0JCSAqIGRvIG5vdCBjcmVhdGUgdGhpcyBuZXcgdGhyZWFkIC0gdGhlIHdob2xlIHRocmVhZAotCQkgKiBncm91cCBpcyBzdXBwb3NlZCB0byBleGl0IGFueXdheS4KLQkJICovCi0JCWlmIChjdXJyZW50LT5zaWduYWwtPmZsYWdzICYgU0lHTkFMX0dST1VQX0VYSVQpIHsKLQkJCXNwaW5fdW5sb2NrKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKLQkJCXdyaXRlX3VubG9ja19pcnEoJnRhc2tsaXN0X2xvY2spOwotCQkJcmV0dmFsID0gLUVBR0FJTjsKLQkJCWdvdG8gYmFkX2ZvcmtfY2xlYW51cF9uYW1lc3BhY2U7Ci0JCX0KLQogCQlwLT5ncm91cF9sZWFkZXIgPSBjdXJyZW50LT5ncm91cF9sZWFkZXI7CiAJCWxpc3RfYWRkX3RhaWxfcmN1KCZwLT50aHJlYWRfZ3JvdXAsICZwLT5ncm91cF9sZWFkZXItPnRocmVhZF9ncm91cCk7CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9ocnRpbWVyLmMgYi9rZXJuZWwvaHJ0aW1lci5jCmluZGV4IDE4MzI0MzAuLjU1NjAxYjMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9ocnRpbWVyLmMKKysrIGIva2VybmVsL2hydGltZXIuYwpAQCAtOTgsNyArOTgsNiBAQAogCiAvKioKICAqIGt0aW1lX2dldF90cyAtIGdldCB0aGUgbW9ub3RvbmljIGNsb2NrIGluIHRpbWVzcGVjIGZvcm1hdAotICoKICAqIEB0czoJCXBvaW50ZXIgdG8gdGltZXNwZWMgdmFyaWFibGUKICAqCiAgKiBUaGUgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgbW9ub3RvbmljIGNsb2NrIGZyb20gdGhlIHJlYWx0aW1lCkBAIC0yMzgsNyArMjM3LDYgQEAKICMgaWZuZGVmIENPTkZJR19LVElNRV9TQ0FMQVIKIC8qKgogICoga3RpbWVfYWRkX25zIC0gQWRkIGEgc2NhbGFyIG5hbm9zZWNvbmRzIHZhbHVlIHRvIGEga3RpbWVfdCB2YXJpYWJsZQotICoKICAqIEBrdDoJCWFkZGVuZAogICogQG5zZWM6CXRoZSBzY2FsYXIgbnNlYyB2YWx1ZSB0byBhZGQKICAqCkBAIC0yOTksNyArMjk3LDYgQEAKIAogLyoqCiAgKiBocnRpbWVyX2ZvcndhcmQgLSBmb3J3YXJkIHRoZSB0aW1lciBleHBpcnkKLSAqCiAgKiBAdGltZXI6CWhydGltZXIgdG8gZm9yd2FyZAogICogQG5vdzoJZm9yd2FyZCBwYXN0IHRoaXMgdGltZQogICogQGludGVydmFsOgl0aGUgaW50ZXJ2YWwgdG8gZm9yd2FyZApAQCAtNDExLDcgKzQwOCw2IEBACiAKIC8qKgogICogaHJ0aW1lcl9zdGFydCAtIChyZSlzdGFydCBhbiByZWxhdGl2ZSB0aW1lciBvbiB0aGUgY3VycmVudCBDUFUKLSAqCiAgKiBAdGltZXI6CXRoZSB0aW1lciB0byBiZSBhZGRlZAogICogQHRpbToJZXhwaXJ5IHRpbWUKICAqIEBtb2RlOglleHBpcnkgbW9kZTogYWJzb2x1dGUgKEhSVElNRVJfQUJTKSBvciByZWxhdGl2ZSAoSFJUSU1FUl9SRUwpCkBAIC00NjAsMTQgKzQ1NiwxMyBAQAogCiAvKioKICAqIGhydGltZXJfdHJ5X3RvX2NhbmNlbCAtIHRyeSB0byBkZWFjdGl2YXRlIGEgdGltZXIKLSAqCiAgKiBAdGltZXI6CWhydGltZXIgdG8gc3RvcAogICoKICAqIFJldHVybnM6CiAgKiAgMCB3aGVuIHRoZSB0aW1lciB3YXMgbm90IGFjdGl2ZQogICogIDEgd2hlbiB0aGUgdGltZXIgd2FzIGFjdGl2ZQogICogLTEgd2hlbiB0aGUgdGltZXIgaXMgY3VycmVudGx5IGV4Y3V0aW5nIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBhbmQKLSAqICAgIGNhbiBub3QgYmUgc3RvcHBlZAorICogICAgY2Fubm90IGJlIHN0b3BwZWQKICAqLwogaW50IGhydGltZXJfdHJ5X3RvX2NhbmNlbChzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpCiB7CkBAIC00ODksNyArNDg0LDYgQEAKIAogLyoqCiAgKiBocnRpbWVyX2NhbmNlbCAtIGNhbmNlbCBhIHRpbWVyIGFuZCB3YWl0IGZvciB0aGUgaGFuZGxlciB0byBmaW5pc2guCi0gKgogICogQHRpbWVyOgl0aGUgdGltZXIgdG8gYmUgY2FuY2VsbGVkCiAgKgogICogUmV0dXJuczoKQEAgLTUxMCw3ICs1MDQsNiBAQAogCiAvKioKICAqIGhydGltZXJfZ2V0X3JlbWFpbmluZyAtIGdldCByZW1haW5pbmcgdGltZSBmb3IgdGhlIHRpbWVyCi0gKgogICogQHRpbWVyOgl0aGUgdGltZXIgdG8gcmVhZAogICovCiBrdGltZV90IGhydGltZXJfZ2V0X3JlbWFpbmluZyhjb25zdCBzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpCkBAIC01NjQsNyArNTU3LDYgQEAKIAogLyoqCiAgKiBocnRpbWVyX2luaXQgLSBpbml0aWFsaXplIGEgdGltZXIgdG8gdGhlIGdpdmVuIGNsb2NrCi0gKgogICogQHRpbWVyOgl0aGUgdGltZXIgdG8gYmUgaW5pdGlhbGl6ZWQKICAqIEBjbG9ja19pZDoJdGhlIGNsb2NrIHRvIGJlIHVzZWQKICAqIEBtb2RlOgl0aW1lciBtb2RlIGFicy9yZWwKQEAgLTU3Niw3ICs1NjgsNyBAQAogCiAJbWVtc2V0KHRpbWVyLCAwLCBzaXplb2Yoc3RydWN0IGhydGltZXIpKTsKIAotCWJhc2VzID0gcGVyX2NwdShocnRpbWVyX2Jhc2VzLCByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwliYXNlcyA9IF9fcmF3X2dldF9jcHVfdmFyKGhydGltZXJfYmFzZXMpOwogCiAJaWYgKGNsb2NrX2lkID09IENMT0NLX1JFQUxUSU1FICYmIG1vZGUgIT0gSFJUSU1FUl9BQlMpCiAJCWNsb2NrX2lkID0gQ0xPQ0tfTU9OT1RPTklDOwpAQCAtNTg4LDcgKzU4MCw2IEBACiAKIC8qKgogICogaHJ0aW1lcl9nZXRfcmVzIC0gZ2V0IHRoZSB0aW1lciByZXNvbHV0aW9uIGZvciBhIGNsb2NrCi0gKgogICogQHdoaWNoX2Nsb2NrOiB3aGljaCBjbG9jayB0byBxdWVyeQogICogQHRwOgkJIHBvaW50ZXIgdG8gdGltZXNwZWMgdmFyaWFibGUgdG8gc3RvcmUgdGhlIHJlc29sdXRpb24KICAqCkBAIC01OTksNyArNTkwLDcgQEAKIHsKIAlzdHJ1Y3QgaHJ0aW1lcl9iYXNlICpiYXNlczsKIAotCWJhc2VzID0gcGVyX2NwdShocnRpbWVyX2Jhc2VzLCByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwliYXNlcyA9IF9fcmF3X2dldF9jcHVfdmFyKGhydGltZXJfYmFzZXMpOwogCSp0cCA9IGt0aW1lX3RvX3RpbWVzcGVjKGJhc2VzW3doaWNoX2Nsb2NrXS5yZXNvbHV0aW9uKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEva2VybmVsL2twcm9iZXMuYyBiL2tlcm5lbC9rcHJvYmVzLmMKaW5kZXggMWZiZjQ2Ni4uNjRhYWIwOCAxMDA2NDQKLS0tIGEva2VybmVsL2twcm9iZXMuYworKysgYi9rZXJuZWwva3Byb2Jlcy5jCkBAIC00NywxMSArNDcsMTcgQEAKIAogc3RhdGljIHN0cnVjdCBobGlzdF9oZWFkIGtwcm9iZV90YWJsZVtLUFJPQkVfVEFCTEVfU0laRV07CiBzdGF0aWMgc3RydWN0IGhsaXN0X2hlYWQga3JldHByb2JlX2luc3RfdGFibGVbS1BST0JFX1RBQkxFX1NJWkVdOworc3RhdGljIGF0b21pY190IGtwcm9iZV9jb3VudDsKIAogREVGSU5FX01VVEVYKGtwcm9iZV9tdXRleCk7CQkvKiBQcm90ZWN0cyBrcHJvYmVfdGFibGUgKi8KIERFRklORV9TUElOTE9DSyhrcmV0cHJvYmVfbG9jayk7CS8qIFByb3RlY3RzIGtyZXRwcm9iZV9pbnN0X3RhYmxlICovCiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGtwcm9iZSAqLCBrcHJvYmVfaW5zdGFuY2UpID0gTlVMTDsKIAorc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBrcHJvYmVfcGFnZV9mYXVsdF9uYiA9IHsKKwkubm90aWZpZXJfY2FsbCA9IGtwcm9iZV9leGNlcHRpb25zX25vdGlmeSwKKwkucHJpb3JpdHkgPSAweDdmZmZmZmZmIC8qIHdlIG5lZWQgdG8gbm90aWZpZWQgZmlyc3QgKi8KK307CisKICNpZmRlZiBfX0FSQ0hfV0FOVF9LUFJPQkVTX0lOU05fU0xPVAogLyoKICAqIGtwcm9iZS0+YWluc24uaW5zbiBwb2ludHMgdG8gdGhlIGNvcHkgb2YgdGhlIGluc3RydWN0aW9uIHRvIGJlCkBAIC0zNjgsMTYgKzM3NCwxNSBAQAogKi8KIHN0YXRpYyBpbnQgX19rcHJvYmVzIGFkZF9uZXdfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKm9sZF9wLCBzdHJ1Y3Qga3Byb2JlICpwKQogewotICAgICAgICBzdHJ1Y3Qga3Byb2JlICprcDsKLQogCWlmIChwLT5icmVha19oYW5kbGVyKSB7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGtwLCAmb2xkX3AtPmxpc3QsIGxpc3QpIHsKLQkJCWlmIChrcC0+YnJlYWtfaGFuZGxlcikKLQkJCQlyZXR1cm4gLUVFWElTVDsKLQkJfQorCQlpZiAob2xkX3AtPmJyZWFrX2hhbmRsZXIpCisJCQlyZXR1cm4gLUVFWElTVDsKIAkJbGlzdF9hZGRfdGFpbF9yY3UoJnAtPmxpc3QsICZvbGRfcC0+bGlzdCk7CisJCW9sZF9wLT5icmVha19oYW5kbGVyID0gYWdncl9icmVha19oYW5kbGVyOwogCX0gZWxzZQogCQlsaXN0X2FkZF9yY3UoJnAtPmxpc3QsICZvbGRfcC0+bGlzdCk7CisJaWYgKHAtPnBvc3RfaGFuZGxlciAmJiAhb2xkX3AtPnBvc3RfaGFuZGxlcikKKwkJb2xkX3AtPnBvc3RfaGFuZGxlciA9IGFnZ3JfcG9zdF9oYW5kbGVyOwogCXJldHVybiAwOwogfQogCkBAIC0zOTAsOSArMzk1LDExIEBACiAJY29weV9rcHJvYmUocCwgYXApOwogCWFwLT5hZGRyID0gcC0+YWRkcjsKIAlhcC0+cHJlX2hhbmRsZXIgPSBhZ2dyX3ByZV9oYW5kbGVyOwotCWFwLT5wb3N0X2hhbmRsZXIgPSBhZ2dyX3Bvc3RfaGFuZGxlcjsKIAlhcC0+ZmF1bHRfaGFuZGxlciA9IGFnZ3JfZmF1bHRfaGFuZGxlcjsKLQlhcC0+YnJlYWtfaGFuZGxlciA9IGFnZ3JfYnJlYWtfaGFuZGxlcjsKKwlpZiAocC0+cG9zdF9oYW5kbGVyKQorCQlhcC0+cG9zdF9oYW5kbGVyID0gYWdncl9wb3N0X2hhbmRsZXI7CisJaWYgKHAtPmJyZWFrX2hhbmRsZXIpCisJCWFwLT5icmVha19oYW5kbGVyID0gYWdncl9icmVha19oYW5kbGVyOwogCiAJSU5JVF9MSVNUX0hFQUQoJmFwLT5saXN0KTsKIAlsaXN0X2FkZF9yY3UoJnAtPmxpc3QsICZhcC0+bGlzdCk7CkBAIC00NjQsNiArNDcxLDggQEAKIAlvbGRfcCA9IGdldF9rcHJvYmUocC0+YWRkcik7CiAJaWYgKG9sZF9wKSB7CiAJCXJldCA9IHJlZ2lzdGVyX2FnZ3Jfa3Byb2JlKG9sZF9wLCBwKTsKKwkJaWYgKCFyZXQpCisJCQlhdG9taWNfaW5jKCZrcHJvYmVfY291bnQpOwogCQlnb3RvIG91dDsKIAl9CiAKQEAgLTQ3NCw2ICs0ODMsMTAgQEAKIAlobGlzdF9hZGRfaGVhZF9yY3UoJnAtPmhsaXN0LAogCQkgICAgICAgJmtwcm9iZV90YWJsZVtoYXNoX3B0cihwLT5hZGRyLCBLUFJPQkVfSEFTSF9CSVRTKV0pOwogCisJaWYgKGF0b21pY19hZGRfcmV0dXJuKDEsICZrcHJvYmVfY291bnQpID09IFwKKwkJCQkoQVJDSF9JTkFDVElWRV9LUFJPQkVfQ09VTlQgKyAxKSkKKwkJcmVnaXN0ZXJfcGFnZV9mYXVsdF9ub3RpZmllcigma3Byb2JlX3BhZ2VfZmF1bHRfbmIpOworCiAgIAlhcmNoX2FybV9rcHJvYmUocCk7CiAKIG91dDoKQEAgLTUzNiwxNCArNTQ5LDQwIEBACiAJCQlrZnJlZShvbGRfcCk7CiAJCX0KIAkJYXJjaF9yZW1vdmVfa3Byb2JlKHApOworCX0gZWxzZSB7CisJCW11dGV4X2xvY2soJmtwcm9iZV9tdXRleCk7CisJCWlmIChwLT5icmVha19oYW5kbGVyKQorCQkJb2xkX3AtPmJyZWFrX2hhbmRsZXIgPSBOVUxMOworCQlpZiAocC0+cG9zdF9oYW5kbGVyKXsKKwkJCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGxpc3RfcCwgJm9sZF9wLT5saXN0LCBsaXN0KXsKKwkJCQlpZiAobGlzdF9wLT5wb3N0X2hhbmRsZXIpeworCQkJCQljbGVhbnVwX3AgPSAyOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlpZiAoY2xlYW51cF9wID09IDApCisJCQkJb2xkX3AtPnBvc3RfaGFuZGxlciA9IE5VTEw7CisJCX0KKwkJbXV0ZXhfdW5sb2NrKCZrcHJvYmVfbXV0ZXgpOwogCX0KKworCS8qIENhbGwgdW5yZWdpc3Rlcl9wYWdlX2ZhdWx0X25vdGlmaWVyKCkKKwkgKiBpZiBubyBwcm9iZXMgYXJlIGFjdGl2ZQorCSAqLworCW11dGV4X2xvY2soJmtwcm9iZV9tdXRleCk7CisJaWYgKGF0b21pY19hZGRfcmV0dXJuKC0xLCAma3Byb2JlX2NvdW50KSA9PSBcCisJCQkJQVJDSF9JTkFDVElWRV9LUFJPQkVfQ09VTlQpCisJCXVucmVnaXN0ZXJfcGFnZV9mYXVsdF9ub3RpZmllcigma3Byb2JlX3BhZ2VfZmF1bHRfbmIpOworCW11dGV4X3VubG9jaygma3Byb2JlX211dGV4KTsKKwlyZXR1cm47CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sga3Byb2JlX2V4Y2VwdGlvbnNfbmIgPSB7CiAJLm5vdGlmaWVyX2NhbGwgPSBrcHJvYmVfZXhjZXB0aW9uc19ub3RpZnksCi0JLnByaW9yaXR5ID0gMHg3ZmZmZmZmZiAvKiB3ZSBuZWVkIHRvIG5vdGlmaWVkIGZpcnN0ICovCisJLnByaW9yaXR5ID0gMHg3ZmZmZmZmZiAvKiB3ZSBuZWVkIHRvIGJlIG5vdGlmaWVkIGZpcnN0ICovCiB9OwogCisKIGludCBfX2twcm9iZXMgcmVnaXN0ZXJfanByb2JlKHN0cnVjdCBqcHJvYmUgKmpwKQogewogCS8qIFRvZG86IFZlcmlmeSBwcm9iZXBvaW50IGlzIGEgZnVuY3Rpb24gZW50cnkgcG9pbnQgKi8KQEAgLTY1Miw2ICs2OTEsNyBAQAogCQlJTklUX0hMSVNUX0hFQUQoJmtwcm9iZV90YWJsZVtpXSk7CiAJCUlOSVRfSExJU1RfSEVBRCgma3JldHByb2JlX2luc3RfdGFibGVbaV0pOwogCX0KKwlhdG9taWNfc2V0KCZrcHJvYmVfY291bnQsIDApOwogCiAJZXJyID0gYXJjaF9pbml0X2twcm9iZXMoKTsKIAlpZiAoIWVycikKZGlmZiAtLWdpdCBhL2tlcm5lbC9rdGhyZWFkLmMgYi9rZXJuZWwva3RocmVhZC5jCmluZGV4IGM1ZjNjNjYuLjI0YmU3MTQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9rdGhyZWFkLmMKKysrIGIva2VybmVsL2t0aHJlYWQuYwpAQCAtNDUsNiArNDUsMTMgQEAKIHN0YXRpYyBERUZJTkVfTVVURVgoa3RocmVhZF9zdG9wX2xvY2spOwogc3RhdGljIHN0cnVjdCBrdGhyZWFkX3N0b3BfaW5mbyBrdGhyZWFkX3N0b3BfaW5mbzsKIAorLyoqCisgKiBrdGhyZWFkX3Nob3VsZF9zdG9wIC0gc2hvdWxkIHRoaXMga3RocmVhZCByZXR1cm4gbm93PworICoKKyAqIFdoZW4gc29tZW9uZSBjYWxscyBrdGhyZWFkX3N0b3Agb24geW91ciBrdGhyZWFkLCBpdCB3aWxsIGJlIHdva2VuCisgKiBhbmQgdGhpcyB3aWxsIHJldHVybiB0cnVlLiAgWW91IHNob3VsZCB0aGVuIHJldHVybiwgYW5kIHlvdXIgcmV0dXJuCisgKiB2YWx1ZSB3aWxsIGJlIHBhc3NlZCB0aHJvdWdoIHRvIGt0aHJlYWRfc3RvcCgpLgorICovCiBpbnQga3RocmVhZF9zaG91bGRfc3RvcCh2b2lkKQogewogCXJldHVybiAoa3RocmVhZF9zdG9wX2luZm8uayA9PSBjdXJyZW50KTsKQEAgLTEyMiw2ICsxMjksMjUgQEAKIAljb21wbGV0ZSgmY3JlYXRlLT5kb25lKTsKIH0KIAorLyoqCisgKiBrdGhyZWFkX2NyZWF0ZSAtIGNyZWF0ZSBhIGt0aHJlYWQuCisgKiBAdGhyZWFkZm46IHRoZSBmdW5jdGlvbiB0byBydW4gdW50aWwgc2lnbmFsX3BlbmRpbmcoY3VycmVudCkuCisgKiBAZGF0YTogZGF0YSBwdHIgZm9yIEB0aHJlYWRmbi4KKyAqIEBuYW1lZm10OiBwcmludGYtc3R5bGUgbmFtZSBmb3IgdGhlIHRocmVhZC4KKyAqCisgKiBEZXNjcmlwdGlvbjogVGhpcyBoZWxwZXIgZnVuY3Rpb24gY3JlYXRlcyBhbmQgbmFtZXMgYSBrZXJuZWwKKyAqIHRocmVhZC4gIFRoZSB0aHJlYWQgd2lsbCBiZSBzdG9wcGVkOiB1c2Ugd2FrZV91cF9wcm9jZXNzKCkgdG8gc3RhcnQKKyAqIGl0LiAgU2VlIGFsc28ga3RocmVhZF9ydW4oKSwga3RocmVhZF9jcmVhdGVfb25fY3B1KCkuCisgKgorICogV2hlbiB3b2tlbiwgdGhlIHRocmVhZCB3aWxsIHJ1biBAdGhyZWFkZm4oKSB3aXRoIEBkYXRhIGFzIGl0cworICogYXJndW1lbnQuIEB0aHJlYWRmbiBjYW4gZWl0aGVyIGNhbGwgZG9fZXhpdCgpIGRpcmVjdGx5IGlmIGl0IGlzIGEKKyAqIHN0YW5kYWxvbmUgdGhyZWFkIGZvciB3aGljaCBub29uZSB3aWxsIGNhbGwga3RocmVhZF9zdG9wKCksIG9yCisgKiByZXR1cm4gd2hlbiAna3RocmVhZF9zaG91bGRfc3RvcCgpJyBpcyB0cnVlICh3aGljaCBtZWFucworICoga3RocmVhZF9zdG9wKCkgaGFzIGJlZW4gY2FsbGVkKS4gIFRoZSByZXR1cm4gdmFsdWUgc2hvdWxkIGJlIHplcm8KKyAqIG9yIGEgbmVnYXRpdmUgZXJyb3IgbnVtYmVyOyBpdCB3aWxsIGJlIHBhc3NlZCB0byBrdGhyZWFkX3N0b3AoKS4KKyAqCisgKiBSZXR1cm5zIGEgdGFza19zdHJ1Y3Qgb3IgRVJSX1BUUigtRU5PTUVNKS4KKyAqLwogc3RydWN0IHRhc2tfc3RydWN0ICprdGhyZWFkX2NyZWF0ZShpbnQgKCp0aHJlYWRmbikodm9pZCAqZGF0YSksCiAJCQkJICAgdm9pZCAqZGF0YSwKIAkJCQkgICBjb25zdCBjaGFyIG5hbWVmbXRbXSwKQEAgLTE1Niw2ICsxODIsMTUgQEAKIH0KIEVYUE9SVF9TWU1CT0woa3RocmVhZF9jcmVhdGUpOwogCisvKioKKyAqIGt0aHJlYWRfYmluZCAtIGJpbmQgYSBqdXN0LWNyZWF0ZWQga3RocmVhZCB0byBhIGNwdS4KKyAqIEBrOiB0aHJlYWQgY3JlYXRlZCBieSBrdGhyZWFkX2NyZWF0ZSgpLgorICogQGNwdTogY3B1IChtaWdodCBub3QgYmUgb25saW5lLCBtdXN0IGJlIHBvc3NpYmxlKSBmb3IgQGsgdG8gcnVuIG9uLgorICoKKyAqIERlc2NyaXB0aW9uOiBUaGlzIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gc2V0X2NwdXNfYWxsb3dlZCgpLAorICogZXhjZXB0IHRoYXQgQGNwdSBkb2Vzbid0IG5lZWQgdG8gYmUgb25saW5lLCBhbmQgdGhlIHRocmVhZCBtdXN0IGJlCisgKiBzdG9wcGVkIChpLmUuLCBqdXN0IHJldHVybmVkIGZyb20ga3RocmVhZF9jcmVhdGUoKS4KKyAqLwogdm9pZCBrdGhyZWFkX2JpbmQoc3RydWN0IHRhc2tfc3RydWN0ICprLCB1bnNpZ25lZCBpbnQgY3B1KQogewogCUJVR19PTihrLT5zdGF0ZSAhPSBUQVNLX0lOVEVSUlVQVElCTEUpOwpAQCAtMTY2LDEyICsyMDEsMzYgQEAKIH0KIEVYUE9SVF9TWU1CT0woa3RocmVhZF9iaW5kKTsKIAorLyoqCisgKiBrdGhyZWFkX3N0b3AgLSBzdG9wIGEgdGhyZWFkIGNyZWF0ZWQgYnkga3RocmVhZF9jcmVhdGUoKS4KKyAqIEBrOiB0aHJlYWQgY3JlYXRlZCBieSBrdGhyZWFkX2NyZWF0ZSgpLgorICoKKyAqIFNldHMga3RocmVhZF9zaG91bGRfc3RvcCgpIGZvciBAayB0byByZXR1cm4gdHJ1ZSwgd2FrZXMgaXQsIGFuZAorICogd2FpdHMgZm9yIGl0IHRvIGV4aXQuICBZb3VyIHRocmVhZGZuKCkgbXVzdCBub3QgY2FsbCBkb19leGl0KCkKKyAqIGl0c2VsZiBpZiB5b3UgdXNlIHRoaXMgZnVuY3Rpb24hICBUaGlzIGNhbiBhbHNvIGJlIGNhbGxlZCBhZnRlcgorICoga3RocmVhZF9jcmVhdGUoKSBpbnN0ZWFkIG9mIGNhbGxpbmcgd2FrZV91cF9wcm9jZXNzKCk6IHRoZSB0aHJlYWQKKyAqIHdpbGwgZXhpdCB3aXRob3V0IGNhbGxpbmcgdGhyZWFkZm4oKS4KKyAqCisgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgdGhyZWFkZm4oKSwgb3IgJS1FSU5UUiBpZiB3YWtlX3VwX3Byb2Nlc3MoKQorICogd2FzIG5ldmVyIGNhbGxlZC4KKyAqLwogaW50IGt0aHJlYWRfc3RvcChzdHJ1Y3QgdGFza19zdHJ1Y3QgKmspCiB7CiAJcmV0dXJuIGt0aHJlYWRfc3RvcF9zZW0oaywgTlVMTCk7CiB9CiBFWFBPUlRfU1lNQk9MKGt0aHJlYWRfc3RvcCk7CiAKKy8qKgorICoga3RocmVhZF9zdG9wX3NlbSAtIHN0b3AgYSB0aHJlYWQgY3JlYXRlZCBieSBrdGhyZWFkX2NyZWF0ZSgpLgorICogQGs6IHRocmVhZCBjcmVhdGVkIGJ5IGt0aHJlYWRfY3JlYXRlKCkuCisgKiBAczogc2VtYXBob3JlIHRoYXQgQGsgd2FpdHMgb24gd2hpbGUgaWRsZS4KKyAqCisgKiBEb2VzIGVzc2VudGlhbGx5IHRoZSBzYW1lIHRoaW5nIGFzIGt0aHJlYWRfc3RvcCgpIGFib3ZlLCBidXQgd2FrZXMKKyAqIEBrIGJ5IGNhbGxpbmcgdXAoQHMpLgorICoKKyAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiB0aHJlYWRmbigpLCBvciAlLUVJTlRSIGlmIHdha2VfdXBfcHJvY2VzcygpCisgKiB3YXMgbmV2ZXIgY2FsbGVkLgorICovCiBpbnQga3RocmVhZF9zdG9wX3NlbShzdHJ1Y3QgdGFza19zdHJ1Y3QgKmssIHN0cnVjdCBzZW1hcGhvcmUgKnMpCiB7CiAJaW50IHJldDsKQEAgLTIxMCw1ICsyNjksNSBAQAogCiAJcmV0dXJuIDA7CiB9Ci1jb3JlX2luaXRjYWxsKGhlbHBlcl9pbml0KTsKIAorY29yZV9pbml0Y2FsbChoZWxwZXJfaW5pdCk7CmRpZmYgLS1naXQgYS9rZXJuZWwvbW9kdWxlLmMgYi9rZXJuZWwvbW9kdWxlLmMKaW5kZXggYmJlMDQ4Ni4uMTBlNWI4NyAxMDA2NDQKLS0tIGEva2VybmVsL21vZHVsZS5jCisrKyBiL2tlcm5lbC9tb2R1bGUuYwpAQCAtNDAsOSArNDAsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvdW53aW5kLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KKyNpbmNsdWRlIDxsaW51eC9saWNlbnNlLmg+CiAKICNpZiAwCiAjZGVmaW5lIERFQlVHUCBwcmludGsKQEAgLTEwNTEsNiArMTA1Myw4IEBACiAJcmVtb3ZlX3NlY3RfYXR0cnMobW9kKTsKIAltb2Rfa29iamVjdF9yZW1vdmUobW9kKTsKIAorCXVud2luZF9yZW1vdmVfdGFibGUobW9kLT51bndpbmRfaW5mbywgMCk7CisKIAkvKiBBcmNoLXNwZWNpZmljIGNsZWFudXAuICovCiAJbW9kdWxlX2FyY2hfY2xlYW51cChtb2QpOwogCkBAIC0xMjQ4LDE2ICsxMjUyLDYgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGxpY2Vuc2VfaXNfZ3BsX2NvbXBhdGlibGUoY29uc3QgY2hhciAqbGljZW5zZSkKLXsKLQlyZXR1cm4gKHN0cmNtcChsaWNlbnNlLCAiR1BMIikgPT0gMAotCQl8fCBzdHJjbXAobGljZW5zZSwgIkdQTCB2MiIpID09IDAKLQkJfHwgc3RyY21wKGxpY2Vuc2UsICJHUEwgYW5kIGFkZGl0aW9uYWwgcmlnaHRzIikgPT0gMAotCQl8fCBzdHJjbXAobGljZW5zZSwgIkR1YWwgQlNEL0dQTCIpID09IDAKLQkJfHwgc3RyY21wKGxpY2Vuc2UsICJEdWFsIE1JVC9HUEwiKSA9PSAwCi0JCXx8IHN0cmNtcChsaWNlbnNlLCAiRHVhbCBNUEwvR1BMIikgPT0gMCk7Ci19Ci0KIHN0YXRpYyB2b2lkIHNldF9saWNlbnNlKHN0cnVjdCBtb2R1bGUgKm1vZCwgY29uc3QgY2hhciAqbGljZW5zZSkKIHsKIAlpZiAoIWxpY2Vuc2UpCkBAIC0xMzI2LDcgKzEzMjAsNyBAQAogCWlmICghbW9kICYmIGxvb2t1cF9zeW1ib2wobmFtZSwgX19zdGFydF9fX2tzeW10YWIsIF9fc3RvcF9fX2tzeW10YWIpKQogCQlyZXR1cm4gMTsKIAllbHNlCi0JCWlmIChsb29rdXBfc3ltYm9sKG5hbWUsIG1vZC0+c3ltcywgbW9kLT5zeW1zICsgbW9kLT5udW1fc3ltcykpCisJCWlmIChtb2QgJiYgbG9va3VwX3N5bWJvbChuYW1lLCBtb2QtPnN5bXMsIG1vZC0+c3ltcyArIG1vZC0+bnVtX3N5bXMpKQogCQkJcmV0dXJuIDE7CiAJCWVsc2UKIAkJCXJldHVybiAwOwpAQCAtMTQxMiw3ICsxNDA2LDcgQEAKIAl1bnNpZ25lZCBpbnQgaSwgc3ltaW5kZXggPSAwLCBzdHJpbmRleCA9IDAsIHNldHVwaW5kZXgsIGV4aW5kZXgsCiAJCWV4cG9ydGluZGV4LCBtb2RpbmRleCwgb2JzcGFybWluZGV4LCBpbmZvaW5kZXgsIGdwbGluZGV4LAogCQljcmNpbmRleCwgZ3BsY3JjaW5kZXgsIHZlcnNpbmRleCwgcGNwdWluZGV4LCBncGxmdXR1cmVpbmRleCwKLQkJZ3BsZnV0dXJlY3JjaW5kZXg7CisJCWdwbGZ1dHVyZWNyY2luZGV4LCB1bndpbmRleCA9IDA7CiAJc3RydWN0IG1vZHVsZSAqbW9kOwogCWxvbmcgZXJyID0gMDsKIAl2b2lkICpwZXJjcHUgPSBOVUxMLCAqcHRyID0gTlVMTDsgLyogU3RvcHMgc3B1cmlvdXMgZ2NjIHdhcm5pbmcgKi8KQEAgLTE1MDIsNiArMTQ5Niw5IEBACiAJdmVyc2luZGV4ID0gZmluZF9zZWMoaGRyLCBzZWNoZHJzLCBzZWNzdHJpbmdzLCAiX192ZXJzaW9ucyIpOwogCWluZm9pbmRleCA9IGZpbmRfc2VjKGhkciwgc2VjaGRycywgc2Vjc3RyaW5ncywgIi5tb2RpbmZvIik7CiAJcGNwdWluZGV4ID0gZmluZF9wY3B1c2VjKGhkciwgc2VjaGRycywgc2Vjc3RyaW5ncyk7CisjaWZkZWYgQVJDSF9VTldJTkRfU0VDVElPTl9OQU1FCisJdW53aW5kZXggPSBmaW5kX3NlYyhoZHIsIHNlY2hkcnMsIHNlY3N0cmluZ3MsIEFSQ0hfVU5XSU5EX1NFQ1RJT05fTkFNRSk7CisjZW5kaWYKIAogCS8qIERvbid0IGtlZXAgbW9kaW5mbyBzZWN0aW9uICovCiAJc2VjaGRyc1tpbmZvaW5kZXhdLnNoX2ZsYWdzICY9IH4odW5zaWduZWQgbG9uZylTSEZfQUxMT0M7CkBAIC0xNTEwLDYgKzE1MDcsOCBAQAogCXNlY2hkcnNbc3ltaW5kZXhdLnNoX2ZsYWdzIHw9IFNIRl9BTExPQzsKIAlzZWNoZHJzW3N0cmluZGV4XS5zaF9mbGFncyB8PSBTSEZfQUxMT0M7CiAjZW5kaWYKKwlpZiAodW53aW5kZXgpCisJCXNlY2hkcnNbdW53aW5kZXhdLnNoX2ZsYWdzIHw9IFNIRl9BTExPQzsKIAogCS8qIENoZWNrIG1vZHVsZSBzdHJ1Y3QgdmVyc2lvbiBub3csIGJlZm9yZSB3ZSB0cnkgdG8gdXNlIG1vZHVsZS4gKi8KIAlpZiAoIWNoZWNrX21vZHN0cnVjdF92ZXJzaW9uKHNlY2hkcnMsIHZlcnNpbmRleCwgbW9kKSkgewpAQCAtMTczOCw2ICsxNzM3LDExIEBACiAJCWdvdG8gYXJjaF9jbGVhbnVwOwogCWFkZF9zZWN0X2F0dHJzKG1vZCwgaGRyLT5lX3NobnVtLCBzZWNzdHJpbmdzLCBzZWNoZHJzKTsKIAorCS8qIFNpemUgb2Ygc2VjdGlvbiAwIGlzIDAsIHNvIHRoaXMgd29ya3Mgd2VsbCBpZiBubyB1bndpbmQgaW5mby4gKi8KKwltb2QtPnVud2luZF9pbmZvID0gdW53aW5kX2FkZF90YWJsZShtb2QsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilzZWNoZHJzW3Vud2luZGV4XS5zaF9hZGRyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY2hkcnNbdW53aW5kZXhdLnNoX3NpemUpOworCiAJLyogR2V0IHJpZCBvZiB0ZW1wb3JhcnkgY29weSAqLwogCXZmcmVlKGhkcik7CiAKQEAgLTE4MzYsNiArMTg0MCw3IEBACiAJbW9kLT5zdGF0ZSA9IE1PRFVMRV9TVEFURV9MSVZFOwogCS8qIERyb3AgaW5pdGlhbCByZWZlcmVuY2UuICovCiAJbW9kdWxlX3B1dChtb2QpOworCXVud2luZF9yZW1vdmVfdGFibGUobW9kLT51bndpbmRfaW5mbywgMSk7CiAJbW9kdWxlX2ZyZWUobW9kLCBtb2QtPm1vZHVsZV9pbml0KTsKIAltb2QtPm1vZHVsZV9pbml0ID0gTlVMTDsKIAltb2QtPmluaXRfc2l6ZSA9IDA7CmRpZmYgLS1naXQgYS9rZXJuZWwvbXV0ZXgtZGVidWcuYyBiL2tlcm5lbC9tdXRleC1kZWJ1Zy5jCmluZGV4IGY0OTEzYzMuLjAzNmI2MjggMTAwNjQ0Ci0tLSBhL2tlcm5lbC9tdXRleC1kZWJ1Zy5jCisrKyBiL2tlcm5lbC9tdXRleC1kZWJ1Zy5jCkBAIC0xNTMsMTMgKzE1MywxMyBAQAogCQkJY29udGludWU7CiAJCWNvdW50Kys7CiAJCWN1cnNvciA9IGN1cnItPm5leHQ7Ci0JCWRlYnVnX3NwaW5fbG9ja19yZXN0b3JlKCZkZWJ1Z19tdXRleF9sb2NrLCBmbGFncyk7CisJCWRlYnVnX3NwaW5fdW5sb2NrX3Jlc3RvcmUoJmRlYnVnX211dGV4X2xvY2ssIGZsYWdzKTsKIAogCQlwcmludGsoIlxuIyUwM2Q6ICAgICAgICAgICAgIiwgY291bnQpOwogCQlwcmludGtfbG9jayhsb2NrLCBmaWx0ZXIgPyAwIDogMSk7CiAJCWdvdG8gbmV4dDsKIAl9Ci0JZGVidWdfc3Bpbl9sb2NrX3Jlc3RvcmUoJmRlYnVnX211dGV4X2xvY2ssIGZsYWdzKTsKKwlkZWJ1Z19zcGluX3VubG9ja19yZXN0b3JlKCZkZWJ1Z19tdXRleF9sb2NrLCBmbGFncyk7CiAJcHJpbnRrKCJcbiIpOwogfQogCkBAIC0zMTYsNyArMzE2LDcgQEAKIAkJCWNvbnRpbnVlOwogCQlsaXN0X2RlbF9pbml0KGN1cnIpOwogCQlERUJVR19PRkYoKTsKLQkJZGVidWdfc3Bpbl9sb2NrX3Jlc3RvcmUoJmRlYnVnX211dGV4X2xvY2ssIGZsYWdzKTsKKwkJZGVidWdfc3Bpbl91bmxvY2tfcmVzdG9yZSgmZGVidWdfbXV0ZXhfbG9jaywgZmxhZ3MpOwogCiAJCXByaW50aygiQlVHOiAlcy8lZCwgbG9jayBoZWxkIGF0IHRhc2sgZXhpdCB0aW1lIVxuIiwKIAkJCXRhc2stPmNvbW0sIHRhc2stPnBpZCk7CkBAIC0zMjUsNyArMzI1LDcgQEAKIAkJCXByaW50aygiZXhpdGluZyB0YXNrIGlzIG5vdCBldmVuIHRoZSBvd25lcj8/XG4iKTsKIAkJcmV0dXJuOwogCX0KLQlkZWJ1Z19zcGluX2xvY2tfcmVzdG9yZSgmZGVidWdfbXV0ZXhfbG9jaywgZmxhZ3MpOworCWRlYnVnX3NwaW5fdW5sb2NrX3Jlc3RvcmUoJmRlYnVnX211dGV4X2xvY2ssIGZsYWdzKTsKIH0KIAogLyoKQEAgLTM1Miw3ICszNTIsNyBAQAogCQkJY29udGludWU7CiAJCWxpc3RfZGVsX2luaXQoY3Vycik7CiAJCURFQlVHX09GRigpOwotCQlkZWJ1Z19zcGluX2xvY2tfcmVzdG9yZSgmZGVidWdfbXV0ZXhfbG9jaywgZmxhZ3MpOworCQlkZWJ1Z19zcGluX3VubG9ja19yZXN0b3JlKCZkZWJ1Z19tdXRleF9sb2NrLCBmbGFncyk7CiAKIAkJcHJpbnRrKCJCVUc6ICVzLyVkLCBhY3RpdmUgbG9jayBbJXAoJXAtJXApXSBmcmVlZCFcbiIsCiAJCQljdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQsIGxvY2ssIGZyb20sIHRvKTsKQEAgLTM2Miw3ICszNjIsNyBAQAogCQkJcHJpbnRrKCJmcmVlaW5nIHRhc2sgaXMgbm90IGV2ZW4gdGhlIG93bmVyPz9cbiIpOwogCQlyZXR1cm47CiAJfQotCWRlYnVnX3NwaW5fbG9ja19yZXN0b3JlKCZkZWJ1Z19tdXRleF9sb2NrLCBmbGFncyk7CisJZGVidWdfc3Bpbl91bmxvY2tfcmVzdG9yZSgmZGVidWdfbXV0ZXhfbG9jaywgZmxhZ3MpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEva2VybmVsL211dGV4LWRlYnVnLmggYi9rZXJuZWwvbXV0ZXgtZGVidWcuaAppbmRleCBmZDM4NDA1Li5hNTE5NmMzIDEwMDY0NAotLS0gYS9rZXJuZWwvbXV0ZXgtZGVidWcuaAorKysgYi9rZXJuZWwvbXV0ZXgtZGVidWcuaApAQCAtNDYsMjEgKzQ2LDYgQEAKIGV4dGVybiB2b2lkIGRlYnVnX211dGV4X3VubG9jayhzdHJ1Y3QgbXV0ZXggKmxvY2spOwogZXh0ZXJuIHZvaWQgZGVidWdfbXV0ZXhfaW5pdChzdHJ1Y3QgbXV0ZXggKmxvY2ssIGNvbnN0IGNoYXIgKm5hbWUpOwogCi0jZGVmaW5lIGRlYnVnX3NwaW5fbG9jayhsb2NrKQkJCQlcCi0JZG8gewkJCQkJCVwKLQkJbG9jYWxfaXJxX2Rpc2FibGUoKTsJCQlcCi0JCWlmIChkZWJ1Z19tdXRleF9vbikJCQlcCi0JCQlzcGluX2xvY2sobG9jayk7CQlcCi0JfSB3aGlsZSAoMCkKLQotI2RlZmluZSBkZWJ1Z19zcGluX3VubG9jayhsb2NrKQkJCQlcCi0JZG8gewkJCQkJCVwKLQkJaWYgKGRlYnVnX211dGV4X29uKQkJCVwKLQkJCXNwaW5fdW5sb2NrKGxvY2spOwkJXAotCQlsb2NhbF9pcnFfZW5hYmxlKCk7CQkJXAotCQlwcmVlbXB0X2NoZWNrX3Jlc2NoZWQoKTsJCVwKLQl9IHdoaWxlICgwKQotCiAjZGVmaW5lIGRlYnVnX3NwaW5fbG9ja19zYXZlKGxvY2ssIGZsYWdzKQkJXAogCWRvIHsJCQkJCQlcCiAJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsJCQlcCkBAIC02OCw3ICs1Myw3IEBACiAJCQlzcGluX2xvY2sobG9jayk7CQlcCiAJfSB3aGlsZSAoMCkKIAotI2RlZmluZSBkZWJ1Z19zcGluX2xvY2tfcmVzdG9yZShsb2NrLCBmbGFncykJCVwKKyNkZWZpbmUgZGVidWdfc3Bpbl91bmxvY2tfcmVzdG9yZShsb2NrLCBmbGFncykJCVwKIAlkbyB7CQkJCQkJXAogCQlpZiAoZGVidWdfbXV0ZXhfb24pCQkJXAogCQkJc3Bpbl91bmxvY2sobG9jayk7CQlcCkBAIC03NiwyMCArNjEsMjAgQEAKIAkJcHJlZW1wdF9jaGVja19yZXNjaGVkKCk7CQlcCiAJfSB3aGlsZSAoMCkKIAotI2RlZmluZSBzcGluX2xvY2tfbXV0ZXgobG9jaykJCQkJXAorI2RlZmluZSBzcGluX2xvY2tfbXV0ZXgobG9jaywgZmxhZ3MpCQkJXAogCWRvIHsJCQkJCQlcCiAJCXN0cnVjdCBtdXRleCAqbCA9IGNvbnRhaW5lcl9vZihsb2NrLCBzdHJ1Y3QgbXV0ZXgsIHdhaXRfbG9jayk7IFwKIAkJCQkJCQlcCiAJCURFQlVHX1dBUk5fT04oaW5faW50ZXJydXB0KCkpOwkJXAotCQlkZWJ1Z19zcGluX2xvY2soJmRlYnVnX211dGV4X2xvY2spOwlcCisJCWRlYnVnX3NwaW5fbG9ja19zYXZlKCZkZWJ1Z19tdXRleF9sb2NrLCBmbGFncyk7IFwKIAkJc3Bpbl9sb2NrKGxvY2spOwkJCVwKIAkJREVCVUdfV0FSTl9PTihsLT5tYWdpYyAhPSBsKTsJCVwKIAl9IHdoaWxlICgwKQogCi0jZGVmaW5lIHNwaW5fdW5sb2NrX211dGV4KGxvY2spCQkJCVwKKyNkZWZpbmUgc3Bpbl91bmxvY2tfbXV0ZXgobG9jaywgZmxhZ3MpCQkJXAogCWRvIHsJCQkJCQlcCiAJCXNwaW5fdW5sb2NrKGxvY2spOwkJCVwKLQkJZGVidWdfc3Bpbl91bmxvY2soJmRlYnVnX211dGV4X2xvY2spOwlcCisJCWRlYnVnX3NwaW5fdW5sb2NrX3Jlc3RvcmUoJmRlYnVnX211dGV4X2xvY2ssIGZsYWdzKTsJXAogCX0gd2hpbGUgKDApCiAKICNkZWZpbmUgREVCVUdfT0ZGKCkJCQkJCVwKZGlmZiAtLWdpdCBhL2tlcm5lbC9tdXRleC5jIGIva2VybmVsL211dGV4LmMKaW5kZXggNTQ0OWIyMS4uNzA0M2RiMiAxMDA2NDQKLS0tIGEva2VybmVsL211dGV4LmMKKysrIGIva2VybmVsL211dGV4LmMKQEAgLTEyNSwxMCArMTI1LDExIEBACiAJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrID0gY3VycmVudDsKIAlzdHJ1Y3QgbXV0ZXhfd2FpdGVyIHdhaXRlcjsKIAl1bnNpZ25lZCBpbnQgb2xkX3ZhbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJZGVidWdfbXV0ZXhfaW5pdF93YWl0ZXIoJndhaXRlcik7CiAKLQlzcGluX2xvY2tfbXV0ZXgoJmxvY2stPndhaXRfbG9jayk7CisJc3Bpbl9sb2NrX211dGV4KCZsb2NrLT53YWl0X2xvY2ssIGZsYWdzKTsKIAogCWRlYnVnX211dGV4X2FkZF93YWl0ZXIobG9jaywgJndhaXRlciwgdGFzay0+dGhyZWFkX2luZm8sIGlwKTsKIApAQCAtMTU3LDcgKzE1OCw3IEBACiAJCWlmICh1bmxpa2VseShzdGF0ZSA9PSBUQVNLX0lOVEVSUlVQVElCTEUgJiYKIAkJCQkJCXNpZ25hbF9wZW5kaW5nKHRhc2spKSkgewogCQkJbXV0ZXhfcmVtb3ZlX3dhaXRlcihsb2NrLCAmd2FpdGVyLCB0YXNrLT50aHJlYWRfaW5mbyk7Ci0JCQlzcGluX3VubG9ja19tdXRleCgmbG9jay0+d2FpdF9sb2NrKTsKKwkJCXNwaW5fdW5sb2NrX211dGV4KCZsb2NrLT53YWl0X2xvY2ssIGZsYWdzKTsKIAogCQkJZGVidWdfbXV0ZXhfZnJlZV93YWl0ZXIoJndhaXRlcik7CiAJCQlyZXR1cm4gLUVJTlRSOwpAQCAtMTY1LDkgKzE2Niw5IEBACiAJCV9fc2V0X3Rhc2tfc3RhdGUodGFzaywgc3RhdGUpOwogCiAJCS8qIGRpZG50IGdldCB0aGUgbG9jaywgZ28gdG8gc2xlZXA6ICovCi0JCXNwaW5fdW5sb2NrX211dGV4KCZsb2NrLT53YWl0X2xvY2spOworCQlzcGluX3VubG9ja19tdXRleCgmbG9jay0+d2FpdF9sb2NrLCBmbGFncyk7CiAJCXNjaGVkdWxlKCk7Ci0JCXNwaW5fbG9ja19tdXRleCgmbG9jay0+d2FpdF9sb2NrKTsKKwkJc3Bpbl9sb2NrX211dGV4KCZsb2NrLT53YWl0X2xvY2ssIGZsYWdzKTsKIAl9CiAKIAkvKiBnb3QgdGhlIGxvY2sgLSByZWpvaWNlISAqLwpAQCAtMTc4LDcgKzE3OSw3IEBACiAJaWYgKGxpa2VseShsaXN0X2VtcHR5KCZsb2NrLT53YWl0X2xpc3QpKSkKIAkJYXRvbWljX3NldCgmbG9jay0+Y291bnQsIDApOwogCi0Jc3Bpbl91bmxvY2tfbXV0ZXgoJmxvY2stPndhaXRfbG9jayk7CisJc3Bpbl91bmxvY2tfbXV0ZXgoJmxvY2stPndhaXRfbG9jaywgZmxhZ3MpOwogCiAJZGVidWdfbXV0ZXhfZnJlZV93YWl0ZXIoJndhaXRlcik7CiAKQEAgLTIwMywxMCArMjA0LDExIEBACiBfX211dGV4X3VubG9ja19zbG93cGF0aChhdG9taWNfdCAqbG9ja19jb3VudCBfX0lQX0RFQ0xfXykKIHsKIAlzdHJ1Y3QgbXV0ZXggKmxvY2sgPSBjb250YWluZXJfb2YobG9ja19jb3VudCwgc3RydWN0IG11dGV4LCBjb3VudCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCURFQlVHX1dBUk5fT04obG9jay0+b3duZXIgIT0gY3VycmVudF90aHJlYWRfaW5mbygpKTsKIAotCXNwaW5fbG9ja19tdXRleCgmbG9jay0+d2FpdF9sb2NrKTsKKwlzcGluX2xvY2tfbXV0ZXgoJmxvY2stPndhaXRfbG9jaywgZmxhZ3MpOwogCiAJLyoKIAkgKiBzb21lIGFyY2hpdGVjdHVyZXMgbGVhdmUgdGhlIGxvY2sgdW5sb2NrZWQgaW4gdGhlIGZhc3RwYXRoIGZhaWx1cmUKQEAgLTIzMSw3ICsyMzMsNyBAQAogCiAJZGVidWdfbXV0ZXhfY2xlYXJfb3duZXIobG9jayk7CiAKLQlzcGluX3VubG9ja19tdXRleCgmbG9jay0+d2FpdF9sb2NrKTsKKwlzcGluX3VubG9ja19tdXRleCgmbG9jay0+d2FpdF9sb2NrLCBmbGFncyk7CiB9CiAKIC8qCkBAIC0yNzYsOSArMjc4LDEwIEBACiBzdGF0aWMgaW5saW5lIGludCBfX211dGV4X3RyeWxvY2tfc2xvd3BhdGgoYXRvbWljX3QgKmxvY2tfY291bnQpCiB7CiAJc3RydWN0IG11dGV4ICpsb2NrID0gY29udGFpbmVyX29mKGxvY2tfY291bnQsIHN0cnVjdCBtdXRleCwgY291bnQpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHByZXY7CiAKLQlzcGluX2xvY2tfbXV0ZXgoJmxvY2stPndhaXRfbG9jayk7CisJc3Bpbl9sb2NrX211dGV4KCZsb2NrLT53YWl0X2xvY2ssIGZsYWdzKTsKIAogCXByZXYgPSBhdG9taWNfeGNoZygmbG9jay0+Y291bnQsIC0xKTsKIAlpZiAobGlrZWx5KHByZXYgPT0gMSkpCkBAIC0yODcsNyArMjkwLDcgQEAKIAlpZiAobGlrZWx5KGxpc3RfZW1wdHkoJmxvY2stPndhaXRfbGlzdCkpKQogCQlhdG9taWNfc2V0KCZsb2NrLT5jb3VudCwgMCk7CiAKLQlzcGluX3VubG9ja19tdXRleCgmbG9jay0+d2FpdF9sb2NrKTsKKwlzcGluX3VubG9ja19tdXRleCgmbG9jay0+d2FpdF9sb2NrLCBmbGFncyk7CiAKIAlyZXR1cm4gcHJldiA9PSAxOwogfQpkaWZmIC0tZ2l0IGEva2VybmVsL211dGV4LmggYi9rZXJuZWwvbXV0ZXguaAppbmRleCAwMGZlODRlLi4wNjkxODk5IDEwMDY0NAotLS0gYS9rZXJuZWwvbXV0ZXguaAorKysgYi9rZXJuZWwvbXV0ZXguaApAQCAtOSw4ICs5LDEwIEBACiAgKiAhQ09ORklHX0RFQlVHX01VVEVYRVMgY2FzZS4gTW9zdCBvZiB0aGVtIGFyZSBOT1BzOgogICovCiAKLSNkZWZpbmUgc3Bpbl9sb2NrX211dGV4KGxvY2spCQkJc3Bpbl9sb2NrKGxvY2spCi0jZGVmaW5lIHNwaW5fdW5sb2NrX211dGV4KGxvY2spCQkJc3Bpbl91bmxvY2sobG9jaykKKyNkZWZpbmUgc3Bpbl9sb2NrX211dGV4KGxvY2ssIGZsYWdzKSBcCisJCWRvIHsgc3Bpbl9sb2NrKGxvY2spOyAodm9pZCkoZmxhZ3MpOyB9IHdoaWxlICgwKQorI2RlZmluZSBzcGluX3VubG9ja19tdXRleChsb2NrLCBmbGFncykgXAorCQlkbyB7IHNwaW5fdW5sb2NrKGxvY2spOyAodm9pZCkoZmxhZ3MpOyB9IHdoaWxlICgwKQogI2RlZmluZSBtdXRleF9yZW1vdmVfd2FpdGVyKGxvY2ssIHdhaXRlciwgdGkpIFwKIAkJX19saXN0X2RlbCgod2FpdGVyKS0+bGlzdC5wcmV2LCAod2FpdGVyKS0+bGlzdC5uZXh0KQogCmRpZmYgLS1naXQgYS9rZXJuZWwvcG93ZXIvS2NvbmZpZyBiL2tlcm5lbC9wb3dlci9LY29uZmlnCmluZGV4IGNkZjMxNWUuLmZjMzExYTQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3dlci9LY29uZmlnCisrKyBiL2tlcm5lbC9wb3dlci9LY29uZmlnCkBAIC0zOCw3ICszOCw3IEBACiAKIGNvbmZpZyBQTV9UUkFDRQogCWJvb2wgIlN1c3BlbmQvcmVzdW1lIGV2ZW50IHRyYWNpbmciCi0JZGVwZW5kcyBvbiBQTSAmJiBQTV9ERUJVRyAmJiBYODYKKwlkZXBlbmRzIG9uIFBNICYmIFBNX0RFQlVHICYmIFg4Nl8zMgogCWRlZmF1bHQgeQogCS0tLWhlbHAtLS0KIAlUaGlzIGVuYWJsZXMgc29tZSBjaGVlc3kgY29kZSB0byBzYXZlIHRoZSBsYXN0IFBNIGV2ZW50IHBvaW50IGluIHRoZQpkaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL2Rpc2suYyBiL2tlcm5lbC9wb3dlci9kaXNrLmMKaW5kZXggODFkNGQ5OC4uZTEzZTc0MCAxMDA2NDQKLS0tIGEva2VybmVsL3Bvd2VyL2Rpc2suYworKysgYi9rZXJuZWwvcG93ZXIvZGlzay5jCkBAIC0yMzEsNyArMjMxLDcgQEAKIGxhdGVfaW5pdGNhbGwoc29mdHdhcmVfcmVzdW1lKTsKIAogCi1zdGF0aWMgY2hhciAqIHBtX2Rpc2tfbW9kZXNbXSA9IHsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcG1fZGlza19tb2Rlc1tdID0gewogCVtQTV9ESVNLX0ZJUk1XQVJFXQk9ICJmaXJtd2FyZSIsCiAJW1BNX0RJU0tfUExBVEZPUk1dCT0gInBsYXRmb3JtIiwKIAlbUE1fRElTS19TSFVURE9XTl0JPSAic2h1dGRvd24iLApkaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL21haW4uYyBiL2tlcm5lbC9wb3dlci9tYWluLmMKaW5kZXggY2RmMGYwNy4uNmQyOTVjNyAxMDA2NDQKLS0tIGEva2VybmVsL3Bvd2VyL21haW4uYworKysgYi9rZXJuZWwvcG93ZXIvbWFpbi5jCkBAIC0xNDUsNyArMTQ1LDcgQEAKIAogCiAKLXN0YXRpYyBjaGFyICpwbV9zdGF0ZXNbUE1fU1VTUEVORF9NQVhdID0geworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwbV9zdGF0ZXNbUE1fU1VTUEVORF9NQVhdID0gewogCVtQTV9TVVNQRU5EX1NUQU5EQlldCT0gInN0YW5kYnkiLAogCVtQTV9TVVNQRU5EX01FTV0JPSAibWVtIiwKICNpZmRlZiBDT05GSUdfU09GVFdBUkVfU1VTUEVORApAQCAtMjYyLDcgKzI2Miw3IEBACiBzdGF0aWMgc3NpemVfdCBzdGF0ZV9zdG9yZShzdHJ1Y3Qgc3Vic3lzdGVtICogc3Vic3lzLCBjb25zdCBjaGFyICogYnVmLCBzaXplX3QgbikKIHsKIAlzdXNwZW5kX3N0YXRlX3Qgc3RhdGUgPSBQTV9TVVNQRU5EX1NUQU5EQlk7Ci0JY2hhciAqKiBzOworCWNvbnN0IGNoYXIgKiBjb25zdCAqczsKIAljaGFyICpwOwogCWludCBlcnJvcjsKIAlpbnQgbGVuOwpkaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL3Bvd2VyLmggYi9rZXJuZWwvcG93ZXIvcG93ZXIuaAppbmRleCA5OGM0MTQyLi41N2E3OTI5IDEwMDY0NAotLS0gYS9rZXJuZWwvcG93ZXIvcG93ZXIuaAorKysgYi9rZXJuZWwvcG93ZXIvcG93ZXIuaApAQCAtMTA1LDEwICsxMDUsNiBAQAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgYWxsb2Nfc3dhcF9wYWdlKGludCBzd2FwLCBzdHJ1Y3QgYml0bWFwX3BhZ2UgKmJpdG1hcCk7CiBleHRlcm4gdm9pZCBmcmVlX2FsbF9zd2FwX3BhZ2VzKGludCBzd2FwLCBzdHJ1Y3QgYml0bWFwX3BhZ2UgKmJpdG1hcCk7CiAKLWV4dGVybiB1bnNpZ25lZCBpbnQgY291bnRfc3BlY2lhbF9wYWdlcyh2b2lkKTsKLWV4dGVybiBpbnQgc2F2ZV9zcGVjaWFsX21lbSh2b2lkKTsKLWV4dGVybiBpbnQgcmVzdG9yZV9zcGVjaWFsX21lbSh2b2lkKTsKLQogZXh0ZXJuIGludCBzd3N1c3BfY2hlY2sodm9pZCk7CiBleHRlcm4gaW50IHN3c3VzcF9zaHJpbmtfbWVtb3J5KHZvaWQpOwogZXh0ZXJuIHZvaWQgc3dzdXNwX2ZyZWUodm9pZCk7CmRpZmYgLS1naXQgYS9rZXJuZWwvcG93ZXIvc25hcHNob3QuYyBiL2tlcm5lbC9wb3dlci9zbmFwc2hvdC5jCmluZGV4IDNkOTI4NDEuLjI0Yzk2ZjMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3dlci9zbmFwc2hvdC5jCisrKyBiL2tlcm5lbC9wb3dlci9zbmFwc2hvdC5jCkBAIC0zOSw5MCArMzksOCBAQAogc3RhdGljIHVuc2lnbmVkIGludCBucl9tZXRhX3BhZ2VzOwogc3RhdGljIHVuc2lnbmVkIGxvbmcgKmJ1ZmZlcjsKIAotc3RydWN0IGFyY2hfc2F2ZWFibGVfcGFnZSB7Ci0JdW5zaWduZWQgbG9uZyBzdGFydDsKLQl1bnNpZ25lZCBsb25nIGVuZDsKLQljaGFyICpkYXRhOwotCXN0cnVjdCBhcmNoX3NhdmVhYmxlX3BhZ2UgKm5leHQ7Ci19Owotc3RhdGljIHN0cnVjdCBhcmNoX3NhdmVhYmxlX3BhZ2UgKmFyY2hfcGFnZXM7Ci0KLWludCBzd3N1c3BfYWRkX2FyY2hfcGFnZXModW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCi17Ci0Jc3RydWN0IGFyY2hfc2F2ZWFibGVfcGFnZSAqdG1wOwotCi0Jd2hpbGUgKHN0YXJ0IDwgZW5kKSB7Ci0JCXRtcCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhcmNoX3NhdmVhYmxlX3BhZ2UpLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCF0bXApCi0JCQlyZXR1cm4gLUVOT01FTTsKLQkJdG1wLT5zdGFydCA9IHN0YXJ0OwotCQl0bXAtPmVuZCA9ICgoc3RhcnQgPj4gUEFHRV9TSElGVCkgKyAxKSA8PCBQQUdFX1NISUZUOwotCQlpZiAodG1wLT5lbmQgPiBlbmQpCi0JCQl0bXAtPmVuZCA9IGVuZDsKLQkJdG1wLT5uZXh0ID0gYXJjaF9wYWdlczsKLQkJc3RhcnQgPSB0bXAtPmVuZDsKLQkJYXJjaF9wYWdlcyA9IHRtcDsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgY291bnRfYXJjaF9wYWdlcyh2b2lkKQotewotCXVuc2lnbmVkIGludCBjb3VudCA9IDA7Ci0Jc3RydWN0IGFyY2hfc2F2ZWFibGVfcGFnZSAqdG1wID0gYXJjaF9wYWdlczsKLQl3aGlsZSAodG1wKSB7Ci0JCWNvdW50Kys7Ci0JCXRtcCA9IHRtcC0+bmV4dDsKLQl9Ci0JcmV0dXJuIGNvdW50OwotfQotCi1zdGF0aWMgaW50IHNhdmVfYXJjaF9tZW0odm9pZCkKLXsKLQljaGFyICprYWRkcjsKLQlzdHJ1Y3QgYXJjaF9zYXZlYWJsZV9wYWdlICp0bXAgPSBhcmNoX3BhZ2VzOwotCWludCBvZmZzZXQ7Ci0KLQlwcl9kZWJ1Zygic3dzdXNwOiBTYXZpbmcgYXJjaCBzcGVjaWZpYyBtZW1vcnkiKTsKLQl3aGlsZSAodG1wKSB7Ci0JCXRtcC0+ZGF0YSA9IChjaGFyICopX19nZXRfZnJlZV9wYWdlKEdGUF9BVE9NSUMpOwotCQlpZiAoIXRtcC0+ZGF0YSkKLQkJCXJldHVybiAtRU5PTUVNOwotCQlvZmZzZXQgPSB0bXAtPnN0YXJ0IC0gKHRtcC0+c3RhcnQgJiBQQUdFX01BU0spOwotCQkvKiBhcmNoIHBhZ2VzIG1pZ2h0IGhhdmVuJ3QgYSAnc3RydWN0IHBhZ2UnICovCi0JCWthZGRyID0ga21hcF9hdG9taWNfcGZuKHRtcC0+c3RhcnQgPj4gUEFHRV9TSElGVCwgS01fVVNFUjApOwotCQltZW1jcHkodG1wLT5kYXRhICsgb2Zmc2V0LCBrYWRkciArIG9mZnNldCwKLQkJCXRtcC0+ZW5kIC0gdG1wLT5zdGFydCk7Ci0JCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKLQotCQl0bXAgPSB0bXAtPm5leHQ7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHJlc3RvcmVfYXJjaF9tZW0odm9pZCkKLXsKLQljaGFyICprYWRkcjsKLQlzdHJ1Y3QgYXJjaF9zYXZlYWJsZV9wYWdlICp0bXAgPSBhcmNoX3BhZ2VzOwotCWludCBvZmZzZXQ7Ci0KLQl3aGlsZSAodG1wKSB7Ci0JCWlmICghdG1wLT5kYXRhKQotCQkJY29udGludWU7Ci0JCW9mZnNldCA9IHRtcC0+c3RhcnQgLSAodG1wLT5zdGFydCAmIFBBR0VfTUFTSyk7Ci0JCWthZGRyID0ga21hcF9hdG9taWNfcGZuKHRtcC0+c3RhcnQgPj4gUEFHRV9TSElGVCwgS01fVVNFUjApOwotCQltZW1jcHkoa2FkZHIgKyBvZmZzZXQsIHRtcC0+ZGF0YSArIG9mZnNldCwKLQkJCXRtcC0+ZW5kIC0gdG1wLT5zdGFydCk7Ci0JCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKLQkJZnJlZV9wYWdlKChsb25nKXRtcC0+ZGF0YSk7Ci0JCXRtcC0+ZGF0YSA9IE5VTEw7Ci0JCXRtcCA9IHRtcC0+bmV4dDsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KICNpZmRlZiBDT05GSUdfSElHSE1FTQotc3RhdGljIHVuc2lnbmVkIGludCBjb3VudF9oaWdobWVtX3BhZ2VzKHZvaWQpCit1bnNpZ25lZCBpbnQgY291bnRfaGlnaG1lbV9wYWdlcyh2b2lkKQogewogCXN0cnVjdCB6b25lICp6b25lOwogCXVuc2lnbmVkIGxvbmcgem9uZV9wZm47CkBAIC0xOTksNyArMTE3LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBzYXZlX2hpZ2htZW0odm9pZCkKK2ludCBzYXZlX2hpZ2htZW0odm9pZCkKIHsKIAlzdHJ1Y3Qgem9uZSAqem9uZTsKIAlpbnQgcmVzID0gMDsKQEAgLTIxNiw3ICsxMzQsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHJlc3RvcmVfaGlnaG1lbSh2b2lkKQoraW50IHJlc3RvcmVfaGlnaG1lbSh2b2lkKQogewogCXByaW50aygic3dzdXNwOiBSZXN0b3JpbmcgSGlnaG1lbVxuIik7CiAJd2hpbGUgKGhpZ2htZW1fY29weSkgewpAQCAtMjM4LDI5ICsxNTYsNiBAQAogc3RhdGljIGlubGluZSBpbnQgcmVzdG9yZV9oaWdobWVtKHZvaWQpIHtyZXR1cm4gMDt9CiAjZW5kaWYKIAotdW5zaWduZWQgaW50IGNvdW50X3NwZWNpYWxfcGFnZXModm9pZCkKLXsKLQlyZXR1cm4gY291bnRfYXJjaF9wYWdlcygpICsgY291bnRfaGlnaG1lbV9wYWdlcygpOwotfQotCi1pbnQgc2F2ZV9zcGVjaWFsX21lbSh2b2lkKQotewotCWludCByZXQ7Ci0JcmV0ID0gc2F2ZV9hcmNoX21lbSgpOwotCWlmICghcmV0KQotCQlyZXQgPSBzYXZlX2hpZ2htZW0oKTsKLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgcmVzdG9yZV9zcGVjaWFsX21lbSh2b2lkKQotewotCWludCByZXQ7Ci0JcmV0ID0gcmVzdG9yZV9hcmNoX21lbSgpOwotCWlmICghcmV0KQotCQlyZXQgPSByZXN0b3JlX2hpZ2htZW0oKTsKLQlyZXR1cm4gcmV0OwotfQotCiBzdGF0aWMgaW50IHBmbl9pc19ub3NhdmUodW5zaWduZWQgbG9uZyBwZm4pCiB7CiAJdW5zaWduZWQgbG9uZyBub3NhdmVfYmVnaW5fcGZuID0gX19wYSgmX19ub3NhdmVfYmVnaW4pID4+IFBBR0VfU0hJRlQ7CkBAIC0yODYsNiArMTgxLDcgQEAKIAkJcmV0dXJuIDA7CiAKIAlwYWdlID0gcGZuX3RvX3BhZ2UocGZuKTsKKwlCVUdfT04oUGFnZVJlc2VydmVkKHBhZ2UpICYmIFBhZ2VOb3NhdmUocGFnZSkpOwogCWlmIChQYWdlTm9zYXZlKHBhZ2UpKQogCQlyZXR1cm4gMDsKIAlpZiAoUGFnZVJlc2VydmVkKHBhZ2UpICYmIHBmbl9pc19ub3NhdmUocGZuKSkKZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9zd3N1c3AuYyBiL2tlcm5lbC9wb3dlci9zd3N1c3AuYwppbmRleCBmMGVlNGU3Li4xN2Y2NjljIDEwMDY0NAotLS0gYS9rZXJuZWwvcG93ZXIvc3dzdXNwLmMKKysrIGIva2VybmVsL3Bvd2VyL3N3c3VzcC5jCkBAIC02Miw2ICs2MiwxNiBAQAogCiBpbnQgaW5fc3VzcGVuZCBfX25vc2F2ZWRhdGEgPSAwOwogCisjaWZkZWYgQ09ORklHX0hJR0hNRU0KK3Vuc2lnbmVkIGludCBjb3VudF9oaWdobWVtX3BhZ2VzKHZvaWQpOworaW50IHNhdmVfaGlnaG1lbSh2b2lkKTsKK2ludCByZXN0b3JlX2hpZ2htZW0odm9pZCk7CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgc2F2ZV9oaWdobWVtKHZvaWQpIHsgcmV0dXJuIDA7IH0KK3N0YXRpYyBpbmxpbmUgaW50IHJlc3RvcmVfaGlnaG1lbSh2b2lkKSB7IHJldHVybiAwOyB9CitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjb3VudF9oaWdobWVtX3BhZ2VzKHZvaWQpIHsgcmV0dXJuIDA7IH0KKyNlbmRpZgorCiAvKioKICAqCVRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSB1c2VkIGZvciB0cmFjaW5nIHRoZSBhbGxvY2F0ZWQKICAqCXN3YXAgcGFnZXMsIHNvIHRoYXQgdGhleSBjYW4gYmUgZnJlZWQgaW4gY2FzZSBvZiBhbiBlcnJvci4KQEAgLTE4Miw3ICsxOTIsNyBAQAogCiAJcHJpbnRrKCJTaHJpbmtpbmcgbWVtb3J5Li4uICAiKTsKIAlkbyB7Ci0JCXNpemUgPSAyICogY291bnRfc3BlY2lhbF9wYWdlcygpOworCQlzaXplID0gMiAqIGNvdW50X2hpZ2htZW1fcGFnZXMoKTsKIAkJc2l6ZSArPSBzaXplIC8gNTAgKyBjb3VudF9kYXRhX3BhZ2VzKCk7CiAJCXNpemUgKz0gKHNpemUgKyBQQkVTX1BFUl9QQUdFIC0gMSkgLyBQQkVTX1BFUl9QQUdFICsKIAkJCVBBR0VTX0ZPUl9JTzsKQEAgLTIyNiw3ICsyMzYsNyBAQAogCQlnb3RvIEVuYWJsZV9pcnFzOwogCX0KIAotCWlmICgoZXJyb3IgPSBzYXZlX3NwZWNpYWxfbWVtKCkpKSB7CisJaWYgKChlcnJvciA9IHNhdmVfaGlnaG1lbSgpKSkgewogCQlwcmludGsoS0VSTl9FUlIgInN3c3VzcDogTm90IGVub3VnaCBmcmVlIHBhZ2VzIGZvciBoaWdobWVtXG4iKTsKIAkJZ290byBSZXN0b3JlX2hpZ2htZW07CiAJfQpAQCAtMjM3LDcgKzI0Nyw3IEBACiAJLyogUmVzdG9yZSBjb250cm9sIGZsb3cgbWFnaWNhbGx5IGFwcGVhcnMgaGVyZSAqLwogCXJlc3RvcmVfcHJvY2Vzc29yX3N0YXRlKCk7CiBSZXN0b3JlX2hpZ2htZW06Ci0JcmVzdG9yZV9zcGVjaWFsX21lbSgpOworCXJlc3RvcmVfaGlnaG1lbSgpOwogCWRldmljZV9wb3dlcl91cCgpOwogRW5hYmxlX2lycXM6CiAJbG9jYWxfaXJxX2VuYWJsZSgpOwpAQCAtMjYzLDcgKzI3Myw3IEBACiAJICovCiAJc3dzdXNwX2ZyZWUoKTsKIAlyZXN0b3JlX3Byb2Nlc3Nvcl9zdGF0ZSgpOwotCXJlc3RvcmVfc3BlY2lhbF9tZW0oKTsKKwlyZXN0b3JlX2hpZ2htZW0oKTsKIAl0b3VjaF9zb2Z0bG9ja3VwX3dhdGNoZG9nKCk7CiAJZGV2aWNlX3Bvd2VyX3VwKCk7CiAJbG9jYWxfaXJxX2VuYWJsZSgpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3ByaW50ay5jIGIva2VybmVsL3ByaW50ay5jCmluZGV4IDE5YTk1NTYuLjk1YjdmZTEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wcmludGsuYworKysgYi9rZXJuZWwvcHJpbnRrLmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CQkJLyogRm9yIGluX2ludGVycnVwdCgpICovCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KQEAgLTMyNyw3ICszMjgsOSBAQAogCXN0cnVjdCBjb25zb2xlICpjb247CiAKIAlmb3IgKGNvbiA9IGNvbnNvbGVfZHJpdmVyczsgY29uOyBjb24gPSBjb24tPm5leHQpIHsKLQkJaWYgKChjb24tPmZsYWdzICYgQ09OX0VOQUJMRUQpICYmIGNvbi0+d3JpdGUpCisJCWlmICgoY29uLT5mbGFncyAmIENPTl9FTkFCTEVEKSAmJiBjb24tPndyaXRlICYmCisJCQkJKGNwdV9vbmxpbmUoc21wX3Byb2Nlc3Nvcl9pZCgpKSB8fAorCQkJCShjb24tPmZsYWdzICYgQ09OX0FOWVRJTUUpKSkKIAkJCWNvbi0+d3JpdGUoY29uLCAmTE9HX0JVRihzdGFydCksIGVuZCAtIHN0YXJ0KTsKIAl9CiB9CkBAIC00MzcsNiArNDQwLDcgQEAKICNlbHNlCiBzdGF0aWMgaW50IHByaW50a190aW1lID0gMDsKICNlbmRpZgorbW9kdWxlX3BhcmFtKHByaW50a190aW1lLCBpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKIAogc3RhdGljIGludCBfX2luaXQgcHJpbnRrX3RpbWVfc2V0dXAoY2hhciAqc3RyKQogewpAQCAtNDUzLDYgKzQ1NywxOCBAQAogCXJldHVybiBzY2hlZF9jbG9jaygpOwogfQogCisvKiBDaGVjayBpZiB3ZSBoYXZlIGFueSBjb25zb2xlIHJlZ2lzdGVyZWQgdGhhdCBjYW4gYmUgY2FsbGVkIGVhcmx5IGluIGJvb3QuICovCitzdGF0aWMgaW50IGhhdmVfY2FsbGFibGVfY29uc29sZSh2b2lkKQoreworCXN0cnVjdCBjb25zb2xlICpjb247CisKKwlmb3IgKGNvbiA9IGNvbnNvbGVfZHJpdmVyczsgY29uOyBjb24gPSBjb24tPm5leHQpCisJCWlmIChjb24tPmZsYWdzICYgQ09OX0FOWVRJTUUpCisJCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCiAvKioKICAqIHByaW50ayAtIHByaW50IGEga2VybmVsIG1lc3NhZ2UKICAqIEBmbXQ6IGZvcm1hdCBzdHJpbmcKQEAgLTU2NiwyNyArNTgyLDI5IEBACiAJCQlsb2dfbGV2ZWxfdW5rbm93biA9IDE7CiAJfQogCi0JaWYgKCFjcHVfb25saW5lKHNtcF9wcm9jZXNzb3JfaWQoKSkpIHsKLQkJLyoKLQkJICogU29tZSBjb25zb2xlIGRyaXZlcnMgbWF5IGFzc3VtZSB0aGF0IHBlci1jcHUgcmVzb3VyY2VzIGhhdmUKLQkJICogYmVlbiBhbGxvY2F0ZWQuICBTbyBkb24ndCBhbGxvdyB0aGVtIHRvIGJlIGNhbGxlZCBieSB0aGlzCi0JCSAqIENQVSB1bnRpbCBpdCBpcyBvZmZpY2lhbGx5IHVwLiAgV2Ugc2hvdWxkbid0IGJlIGNhbGxpbmcgaW50bwotCQkgKiByYW5kb20gY29uc29sZSBkcml2ZXJzIG9uIGEgQ1BVIHdoaWNoIGRvZXNuJ3QgZXhpc3QgeWV0Li4KLQkJICovCi0JCXByaW50a19jcHUgPSBVSU5UX01BWDsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9nYnVmX2xvY2ssIGZsYWdzKTsKLQkJZ290byBvdXQ7Ci0JfQogCWlmICghZG93bl90cnlsb2NrKCZjb25zb2xlX3NlbSkpIHsKLQkJY29uc29sZV9sb2NrZWQgPSAxOwogCQkvKgotCQkgKiBXZSBvd24gdGhlIGRyaXZlcnMuICBXZSBjYW4gZHJvcCB0aGUgc3BpbmxvY2sgYW5kIGxldAotCQkgKiByZWxlYXNlX2NvbnNvbGVfc2VtKCkgcHJpbnQgdGhlIHRleHQKKwkJICogV2Ugb3duIHRoZSBkcml2ZXJzLiAgV2UgY2FuIGRyb3AgdGhlIHNwaW5sb2NrIGFuZAorCQkgKiBsZXQgcmVsZWFzZV9jb25zb2xlX3NlbSgpIHByaW50IHRoZSB0ZXh0LCBtYXliZSAuLi4KIAkJICovCisJCWNvbnNvbGVfbG9ja2VkID0gMTsKIAkJcHJpbnRrX2NwdSA9IFVJTlRfTUFYOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2didWZfbG9jaywgZmxhZ3MpOwotCQljb25zb2xlX21heV9zY2hlZHVsZSA9IDA7Ci0JCXJlbGVhc2VfY29uc29sZV9zZW0oKTsKKworCQkvKgorCQkgKiBDb25zb2xlIGRyaXZlcnMgbWF5IGFzc3VtZSB0aGF0IHBlci1jcHUgcmVzb3VyY2VzIGhhdmUKKwkJICogYmVlbiBhbGxvY2F0ZWQuIFNvIHVubGVzcyB0aGV5J3JlIGV4cGxpY2l0bHkgbWFya2VkIGFzCisJCSAqIGJlaW5nIGFibGUgdG8gY29wZSAoQ09OX0FOWVRJTUUpIGRvbid0IGNhbGwgdGhlbSB1bnRpbAorCQkgKiB0aGlzIENQVSBpcyBvZmZpY2lhbGx5IHVwLgorCQkgKi8KKwkJaWYgKGNwdV9vbmxpbmUoc21wX3Byb2Nlc3Nvcl9pZCgpKSB8fCBoYXZlX2NhbGxhYmxlX2NvbnNvbGUoKSkgeworCQkJY29uc29sZV9tYXlfc2NoZWR1bGUgPSAwOworCQkJcmVsZWFzZV9jb25zb2xlX3NlbSgpOworCQl9IGVsc2UgeworCQkJLyogUmVsZWFzZSBieSBoYW5kIHRvIGF2b2lkIGZsdXNoaW5nIHRoZSBidWZmZXIuICovCisJCQljb25zb2xlX2xvY2tlZCA9IDA7CisJCQl1cCgmY29uc29sZV9zZW0pOworCQl9CiAJfSBlbHNlIHsKIAkJLyoKIAkJICogU29tZW9uZSBlbHNlIG93bnMgdGhlIGRyaXZlcnMuICBXZSBkcm9wIHRoZSBzcGlubG9jaywgd2hpY2gKQEAgLTU5Niw3ICs2MTQsNyBAQAogCQlwcmludGtfY3B1ID0gVUlOVF9NQVg7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvZ2J1Zl9sb2NrLCBmbGFncyk7CiAJfQotb3V0OgorCiAJcHJlZW1wdF9lbmFibGUoKTsKIAlyZXR1cm4gcHJpbnRlZF9sZW47CiB9CmRpZmYgLS1naXQgYS9rZXJuZWwvcHRyYWNlLmMgYi9rZXJuZWwvcHRyYWNlLmMKaW5kZXggOTIxYzIyYS4uMzM1YzViOSAxMDA2NDQKLS0tIGEva2VybmVsL3B0cmFjZS5jCisrKyBiL2tlcm5lbC9wdHJhY2UuYwpAQCAtMTIwLDggKzEyMCwxOCBAQAogCiBzdGF0aWMgaW50IG1heV9hdHRhY2goc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQogewotCWlmICghdGFzay0+bW0pCi0JCXJldHVybiAtRVBFUk07CisJLyogTWF5IHdlIGluc3BlY3QgdGhlIGdpdmVuIHRhc2s/CisJICogVGhpcyBjaGVjayBpcyB1c2VkIGJvdGggZm9yIGF0dGFjaGluZyB3aXRoIHB0cmFjZQorCSAqIGFuZCBmb3IgYWxsb3dpbmcgYWNjZXNzIHRvIHNlbnNpdGl2ZSBpbmZvcm1hdGlvbiBpbiAvcHJvYy4KKwkgKgorCSAqIHB0cmFjZV9hdHRhY2ggZGVuaWVzIHNldmVyYWwgY2FzZXMgdGhhdCAvcHJvYyBhbGxvd3MKKwkgKiBiZWNhdXNlIHNldHRpbmcgdXAgdGhlIG5lY2Vzc2FyeSBwYXJlbnQvY2hpbGQgcmVsYXRpb25zaGlwCisJICogb3IgaGFsdGluZyB0aGUgc3BlY2lmaWVkIHRhc2sgaXMgaW1wb3NzaWJsZS4KKwkgKi8KKwlpbnQgZHVtcGFibGUgPSAwOworCS8qIERvbid0IGxldCBzZWN1cml0eSBtb2R1bGVzIGRlbnkgaW50cm9zcGVjdGlvbiAqLworCWlmICh0YXNrID09IGN1cnJlbnQpCisJCXJldHVybiAwOwogCWlmICgoKGN1cnJlbnQtPnVpZCAhPSB0YXNrLT5ldWlkKSB8fAogCSAgICAgKGN1cnJlbnQtPnVpZCAhPSB0YXNrLT5zdWlkKSB8fAogCSAgICAgKGN1cnJlbnQtPnVpZCAhPSB0YXNrLT51aWQpIHx8CkBAIC0xMzAsNyArMTQwLDkgQEAKIAkgICAgIChjdXJyZW50LT5naWQgIT0gdGFzay0+Z2lkKSkgJiYgIWNhcGFibGUoQ0FQX1NZU19QVFJBQ0UpKQogCQlyZXR1cm4gLUVQRVJNOwogCXNtcF9ybWIoKTsKLQlpZiAoIXRhc2stPm1tLT5kdW1wYWJsZSAmJiAhY2FwYWJsZShDQVBfU1lTX1BUUkFDRSkpCisJaWYgKHRhc2stPm1tKQorCQlkdW1wYWJsZSA9IHRhc2stPm1tLT5kdW1wYWJsZTsKKwlpZiAoIWR1bXBhYmxlICYmICFjYXBhYmxlKENBUF9TWVNfUFRSQUNFKSkKIAkJcmV0dXJuIC1FUEVSTTsKIAogCXJldHVybiBzZWN1cml0eV9wdHJhY2UoY3VycmVudCwgdGFzayk7CkBAIC0xNzYsNiArMTg4LDggQEAKIAkJZ290byByZXBlYXQ7CiAJfQogCisJaWYgKCF0YXNrLT5tbSkKKwkJZ290byBiYWQ7CiAJLyogdGhlIHNhbWUgcHJvY2VzcyBjYW5ub3QgYmUgYXR0YWNoZWQgbWFueSB0aW1lcyAqLwogCWlmICh0YXNrLT5wdHJhY2UgJiBQVF9QVFJBQ0VEKQogCQlnb3RvIGJhZDsKQEAgLTIwMCw3ICsyMTQsNyBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKLXZvaWQgX19wdHJhY2VfZGV0YWNoKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsIHVuc2lnbmVkIGludCBkYXRhKQorc3RhdGljIGlubGluZSB2b2lkIF9fcHRyYWNlX2RldGFjaChzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkLCB1bnNpZ25lZCBpbnQgZGF0YSkKIHsKIAljaGlsZC0+ZXhpdF9jb2RlID0gZGF0YTsKIAkvKiAuLiByZS1wYXJlbnQgLi4gKi8KQEAgLTIxOSw2ICsyMzMsNyBAQAogCXB0cmFjZV9kaXNhYmxlKGNoaWxkKTsKIAogCXdyaXRlX2xvY2tfaXJxKCZ0YXNrbGlzdF9sb2NrKTsKKwkvKiBwcm90ZWN0IGFnYWluc3QgZGVfdGhyZWFkKCktPnJlbGVhc2VfdGFzaygpICovCiAJaWYgKGNoaWxkLT5wdHJhY2UpCiAJCV9fcHRyYWNlX2RldGFjaChjaGlsZCwgZGF0YSk7CiAJd3JpdGVfdW5sb2NrX2lycSgmdGFza2xpc3RfbG9jayk7CmRpZmYgLS1naXQgYS9rZXJuZWwvc2NoZWQuYyBiL2tlcm5lbC9zY2hlZC5jCmluZGV4IDVkYmM0MjYuLmE4NTYwNDAgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zY2hlZC5jCisrKyBiL2tlcm5lbC9zY2hlZC5jCkBAIC04MTgsNiArODE4LDExIEBACiAgKiB0aGUgdGFyZ2V0IENQVS4KICAqLwogI2lmZGVmIENPTkZJR19TTVAKKworI2lmbmRlZiB0c2tfaXNfcG9sbGluZworI2RlZmluZSB0c2tfaXNfcG9sbGluZyh0KSB0ZXN0X3Rza190aHJlYWRfZmxhZyh0LCBUSUZfUE9MTElOR19OUkZMQUcpCisjZW5kaWYKKwogc3RhdGljIHZvaWQgcmVzY2hlZF90YXNrKHRhc2tfdCAqcCkKIHsKIAlpbnQgY3B1OwpAQCAtODMzLDkgKzgzOCw5IEBACiAJaWYgKGNwdSA9PSBzbXBfcHJvY2Vzc29yX2lkKCkpCiAJCXJldHVybjsKIAotCS8qIE5FRURfUkVTQ0hFRCBtdXN0IGJlIHZpc2libGUgYmVmb3JlIHdlIHRlc3QgUE9MTElOR19OUkZMQUcgKi8KKwkvKiBORUVEX1JFU0NIRUQgbXVzdCBiZSB2aXNpYmxlIGJlZm9yZSB3ZSB0ZXN0IHBvbGxpbmcgKi8KIAlzbXBfbWIoKTsKLQlpZiAoIXRlc3RfdHNrX3RocmVhZF9mbGFnKHAsIFRJRl9QT0xMSU5HX05SRkxBRykpCisJaWYgKCF0c2tfaXNfcG9sbGluZyhwKSkKIAkJc21wX3NlbmRfcmVzY2hlZHVsZShjcHUpOwogfQogI2Vsc2UKQEAgLTQxNTIsNyArNDE1Nyw3IEBACiAgKi8KIHZvaWQgX19zY2hlZCBpb19zY2hlZHVsZSh2b2lkKQogewotCXN0cnVjdCBydW5xdWV1ZSAqcnEgPSAmcGVyX2NwdShydW5xdWV1ZXMsIHJhd19zbXBfcHJvY2Vzc29yX2lkKCkpOworCXN0cnVjdCBydW5xdWV1ZSAqcnEgPSAmX19yYXdfZ2V0X2NwdV92YXIocnVucXVldWVzKTsKIAogCWF0b21pY19pbmMoJnJxLT5ucl9pb3dhaXQpOwogCXNjaGVkdWxlKCk7CkBAIC00MTYzLDcgKzQxNjgsNyBAQAogCiBsb25nIF9fc2NoZWQgaW9fc2NoZWR1bGVfdGltZW91dChsb25nIHRpbWVvdXQpCiB7Ci0Jc3RydWN0IHJ1bnF1ZXVlICpycSA9ICZwZXJfY3B1KHJ1bnF1ZXVlcywgcmF3X3NtcF9wcm9jZXNzb3JfaWQoKSk7CisJc3RydWN0IHJ1bnF1ZXVlICpycSA9ICZfX3Jhd19nZXRfY3B1X3ZhcihydW5xdWV1ZXMpOwogCWxvbmcgcmV0OwogCiAJYXRvbWljX2luYygmcnEtPm5yX2lvd2FpdCk7CkBAIC00MjQ3LDcgKzQyNTIsNyBAQAogCWlmIChyZXR2YWwpCiAJCWdvdG8gb3V0X3VubG9jazsKIAotCWppZmZpZXNfdG9fdGltZXNwZWMocC0+cG9saWN5ICYgU0NIRURfRklGTyA/CisJamlmZmllc190b190aW1lc3BlYyhwLT5wb2xpY3kgPT0gU0NIRURfRklGTyA/CiAJCQkJMCA6IHRhc2tfdGltZXNsaWNlKHApLCAmdCk7CiAJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOwogCXJldHZhbCA9IGNvcHlfdG9fdXNlcihpbnRlcnZhbCwgJnQsIHNpemVvZih0KSkgPyAtRUZBVUxUIDogMDsKQEAgLTQ3NTYsNiArNDc2MSw4IEBACiAJCWJyZWFrOwogI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQogCWNhc2UgQ1BVX1VQX0NBTkNFTEVEOgorCQlpZiAoIWNwdV9ycShjcHUpLT5taWdyYXRpb25fdGhyZWFkKQorCQkJYnJlYWs7CiAJCS8qIFVuYmluZCBpdCBmcm9tIG9mZmxpbmUgY3B1IHNvIGl0IGNhbiBydW4uICBGYWxsIHRocnUuICovCiAJCWt0aHJlYWRfYmluZChjcHVfcnEoY3B1KS0+bWlncmF0aW9uX3RocmVhZCwKIAkJCSAgICAgYW55X29ubGluZV9jcHUoY3B1X29ubGluZV9tYXApKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9zaWduYWwuYyBiL2tlcm5lbC9zaWduYWwuYwppbmRleCAxYjNjOTIxLi41MmFkZjUzIDEwMDY0NAotLS0gYS9rZXJuZWwvc2lnbmFsLmMKKysrIGIva2VybmVsL3NpZ25hbC5jCkBAIC0xNTMxLDYgKzE1MzEsMzUgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzaWdoYW5kLT5zaWdsb2NrLCBmbGFncyk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IG1heV9wdHJhY2Vfc3RvcCh2b2lkKQoreworCWlmICghbGlrZWx5KGN1cnJlbnQtPnB0cmFjZSAmIFBUX1BUUkFDRUQpKQorCQlyZXR1cm4gMDsKKworCWlmICh1bmxpa2VseShjdXJyZW50LT5wYXJlbnQgPT0gY3VycmVudC0+cmVhbF9wYXJlbnQgJiYKKwkJICAgIChjdXJyZW50LT5wdHJhY2UgJiBQVF9BVFRBQ0hFRCkpKQorCQlyZXR1cm4gMDsKKworCWlmICh1bmxpa2VseShjdXJyZW50LT5zaWduYWwgPT0gY3VycmVudC0+cGFyZW50LT5zaWduYWwpICYmCisJICAgIHVubGlrZWx5KGN1cnJlbnQtPnNpZ25hbC0+ZmxhZ3MgJiBTSUdOQUxfR1JPVVBfRVhJVCkpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBBcmUgd2UgaW4gdGhlIG1pZGRsZSBvZiBkb19jb3JlZHVtcD8KKwkgKiBJZiBzbyBhbmQgb3VyIHRyYWNlciBpcyBhbHNvIHBhcnQgb2YgdGhlIGNvcmVkdW1wIHN0b3BwaW5nCisJICogaXMgYSBkZWFkbG9jayBzaXR1YXRpb24sIGFuZCBwb2ludGxlc3MgYmVjYXVzZSBvdXIgdHJhY2VyCisJICogaXMgZGVhZCBzbyBkb24ndCBhbGxvdyB1cyB0byBzdG9wLgorCSAqIElmIFNJR0tJTEwgd2FzIGFscmVhZHkgc2VudCBiZWZvcmUgdGhlIGNhbGxlciB1bmxvY2tlZAorCSAqIC0+c2lnbG9jayB3ZSBtdXN0IHNlZSAtPmNvcmVfd2FpdGVycyAhPSAwLiBPdGhlcndpc2UgaXQKKwkgKiBpcyBzYWZlIHRvIGVudGVyIHNjaGVkdWxlKCkuCisJICovCisJaWYgKHVubGlrZWx5KGN1cnJlbnQtPm1tLT5jb3JlX3dhaXRlcnMpICYmCisJICAgIHVubGlrZWx5KGN1cnJlbnQtPm1tID09IGN1cnJlbnQtPnBhcmVudC0+bW0pKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCiAvKgogICogVGhpcyBtdXN0IGJlIGNhbGxlZCB3aXRoIGN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2sgaGVsZC4KICAqCkBAIC0xNTU5LDExICsxNTg4LDcgQEAKIAlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwogCXRyeV90b19mcmVlemUoKTsKIAlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOwotCWlmIChsaWtlbHkoY3VycmVudC0+cHRyYWNlICYgUFRfUFRSQUNFRCkgJiYKLQkgICAgbGlrZWx5KGN1cnJlbnQtPnBhcmVudCAhPSBjdXJyZW50LT5yZWFsX3BhcmVudCB8fAotCQkgICAhKGN1cnJlbnQtPnB0cmFjZSAmIFBUX0FUVEFDSEVEKSkgJiYKLQkgICAgKGxpa2VseShjdXJyZW50LT5wYXJlbnQtPnNpZ25hbCAhPSBjdXJyZW50LT5zaWduYWwpIHx8Ci0JICAgICAhdW5saWtlbHkoY3VycmVudC0+c2lnbmFsLT5mbGFncyAmIFNJR05BTF9HUk9VUF9FWElUKSkpIHsKKwlpZiAobWF5X3B0cmFjZV9zdG9wKCkpIHsKIAkJZG9fbm90aWZ5X3BhcmVudF9jbGRzdG9wKGN1cnJlbnQsIENMRF9UUkFQUEVEKTsKIAkJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOwogCQlzY2hlZHVsZSgpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3NvZnRpcnEuYyBiL2tlcm5lbC9zb2Z0aXJxLmMKaW5kZXggMzM2ZjkyZC4uOWUyZjFjNiAxMDA2NDQKLS0tIGEva2VybmVsL3NvZnRpcnEuYworKysgYi9rZXJuZWwvc29mdGlycS5jCkBAIC00NzAsNiArNDcwLDggQEAKIAkJYnJlYWs7CiAjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCiAJY2FzZSBDUFVfVVBfQ0FOQ0VMRUQ6CisJCWlmICghcGVyX2NwdShrc29mdGlycWQsIGhvdGNwdSkpCisJCQlicmVhazsKIAkJLyogVW5iaW5kIHNvIGl0IGNhbiBydW4uICBGYWxsIHRocnUuICovCiAJCWt0aHJlYWRfYmluZChwZXJfY3B1KGtzb2Z0aXJxZCwgaG90Y3B1KSwKIAkJCSAgICAgYW55X29ubGluZV9jcHUoY3B1X29ubGluZV9tYXApKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9zb2Z0bG9ja3VwLmMgYi9rZXJuZWwvc29mdGxvY2t1cC5jCmluZGV4IDE0YzdmYWYuLmI1YzNiOTQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zb2Z0bG9ja3VwLmMKKysrIGIva2VybmVsL3NvZnRsb2NrdXAuYwpAQCAtMzYsNyArMzYsNyBAQAogCiB2b2lkIHRvdWNoX3NvZnRsb2NrdXBfd2F0Y2hkb2codm9pZCkKIHsKLQlwZXJfY3B1KHRvdWNoX3RpbWVzdGFtcCwgcmF3X3NtcF9wcm9jZXNzb3JfaWQoKSkgPSBqaWZmaWVzOworCV9fcmF3X2dldF9jcHVfdmFyKHRvdWNoX3RpbWVzdGFtcCkgPSBqaWZmaWVzOwogfQogRVhQT1JUX1NZTUJPTCh0b3VjaF9zb2Z0bG9ja3VwX3dhdGNoZG9nKTsKIApAQCAtMTI3LDYgKzEyNyw4IEBACiAJCWJyZWFrOwogI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQogCWNhc2UgQ1BVX1VQX0NBTkNFTEVEOgorCQlpZiAoIXBlcl9jcHUod2F0Y2hkb2dfdGFzaywgaG90Y3B1KSkKKwkJCWJyZWFrOwogCQkvKiBVbmJpbmQgc28gaXQgY2FuIHJ1bi4gIEZhbGwgdGhydS4gKi8KIAkJa3RocmVhZF9iaW5kKHBlcl9jcHUod2F0Y2hkb2dfdGFzaywgaG90Y3B1KSwKIAkJCSAgICAgYW55X29ubGluZV9jcHUoY3B1X29ubGluZV9tYXApKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9zdG9wX21hY2hpbmUuYyBiL2tlcm5lbC9zdG9wX21hY2hpbmUuYwppbmRleCBkY2ZiNWQ3Li4yYzBhYWNjIDEwMDY0NAotLS0gYS9rZXJuZWwvc3RvcF9tYWNoaW5lLmMKKysrIGIva2VybmVsL3N0b3BfbWFjaGluZS5jCkBAIC00LDYgKzQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KICNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KQEAgLTI1LDEzICsyNiwxMSBAQAogc3RhdGljIGF0b21pY190IHN0b3BtYWNoaW5lX3RocmVhZF9hY2s7CiBzdGF0aWMgREVDTEFSRV9NVVRFWChzdG9wbWFjaGluZV9tdXRleCk7CiAKLXN0YXRpYyBpbnQgc3RvcG1hY2hpbmUodm9pZCAqY3B1KQorc3RhdGljIGludCBzdG9wbWFjaGluZSh2b2lkICp1bnVzZWQpCiB7CiAJaW50IGlycXNfZGlzYWJsZWQgPSAwOwogCWludCBwcmVwYXJlZCA9IDA7CiAKLQlzZXRfY3B1c19hbGxvd2VkKGN1cnJlbnQsIGNwdW1hc2tfb2ZfY3B1KChpbnQpKGxvbmcpY3B1KSk7Ci0KIAkvKiBBY2s6IHdlIGFyZSBhbGl2ZSAqLwogCXNtcF9tYigpOyAvKiBUaGVvcmV0aWNhbGx5IHRoZSBhY2sgPSAwIG1pZ2h0IG5vdCBiZSBvbiB0aGlzIENQVSB5ZXQuICovCiAJYXRvbWljX2luYygmc3RvcG1hY2hpbmVfdGhyZWFkX2Fjayk7CkBAIC04NSw3ICs4NCw4IEBACiAKIHN0YXRpYyBpbnQgc3RvcF9tYWNoaW5lKHZvaWQpCiB7Ci0JaW50IGksIHJldCA9IDA7CisJaW50IHJldCA9IDA7CisJdW5zaWduZWQgaW50IGk7CiAJc3RydWN0IHNjaGVkX3BhcmFtIHBhcmFtID0geyAuc2NoZWRfcHJpb3JpdHkgPSBNQVhfUlRfUFJJTy0xIH07CiAKIAkvKiBPbmUgaGlnaC1wcmlvIHRocmVhZCBwZXIgY3B1LiAgV2UnbGwgZG8gdGhpcyBvbmUuICovCkBAIC05NiwxMSArOTYsMTYgQEAKIAlzdG9wbWFjaGluZV9zdGF0ZSA9IFNUT1BNQUNISU5FX1dBSVQ7CiAKIAlmb3JfZWFjaF9vbmxpbmVfY3B1KGkpIHsKKwkJc3RydWN0IHRhc2tfc3RydWN0ICp0c2s7CiAJCWlmIChpID09IHJhd19zbXBfcHJvY2Vzc29yX2lkKCkpCiAJCQljb250aW51ZTsKLQkJcmV0ID0ga2VybmVsX3RocmVhZChzdG9wbWFjaGluZSwgKHZvaWQgKikobG9uZylpLENMT05FX0tFUk5FTCk7Ci0JCWlmIChyZXQgPCAwKQorCQl0c2sgPSBrdGhyZWFkX2NyZWF0ZShzdG9wbWFjaGluZSwgTlVMTCwgInN0b3BtYWNoaW5lIik7CisJCWlmIChJU19FUlIodHNrKSkgeworCQkJcmV0ID0gUFRSX0VSUih0c2spOwogCQkJYnJlYWs7CisJCX0KKwkJa3RocmVhZF9iaW5kKHRzaywgaSk7CisJCXdha2VfdXBfcHJvY2Vzcyh0c2spOwogCQlzdG9wbWFjaGluZV9udW1fdGhyZWFkcysrOwogCX0KIApkaWZmIC0tZ2l0IGEva2VybmVsL3N5cy5jIGIva2VybmVsL3N5cy5jCmluZGV4IDkwOTMwYjIuLjJkNTE3OWMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zeXMuYworKysgYi9rZXJuZWwvc3lzLmMKQEAgLTEzNywxNCArMTM3LDE1IEBACiAJCXVuc2lnbmVkIGxvbmcgdmFsLCB2b2lkICp2KQogewogCWludCByZXQgPSBOT1RJRllfRE9ORTsKLQlzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iOworCXN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsICpuZXh0X25iOwogCiAJbmIgPSByY3VfZGVyZWZlcmVuY2UoKm5sKTsKIAl3aGlsZSAobmIpIHsKKwkJbmV4dF9uYiA9IHJjdV9kZXJlZmVyZW5jZShuYi0+bmV4dCk7CiAJCXJldCA9IG5iLT5ub3RpZmllcl9jYWxsKG5iLCB2YWwsIHYpOwogCQlpZiAoKHJldCAmIE5PVElGWV9TVE9QX01BU0spID09IE5PVElGWV9TVE9QX01BU0spCiAJCQlicmVhazsKLQkJbmIgPSByY3VfZGVyZWZlcmVuY2UobmItPm5leHQpOworCQluYiA9IG5leHRfbmI7CiAJfQogCXJldHVybiByZXQ7CiB9CkBAIC01ODgsNyArNTg5LDcgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGVtZXJnZW5jeV9yZXN0YXJ0KTsKIAotdm9pZCBrZXJuZWxfcmVzdGFydF9wcmVwYXJlKGNoYXIgKmNtZCkKK3N0YXRpYyB2b2lkIGtlcm5lbF9yZXN0YXJ0X3ByZXBhcmUoY2hhciAqY21kKQogewogCWJsb2NraW5nX25vdGlmaWVyX2NhbGxfY2hhaW4oJnJlYm9vdF9ub3RpZmllcl9saXN0LCBTWVNfUkVTVEFSVCwgY21kKTsKIAlzeXN0ZW1fc3RhdGUgPSBTWVNURU1fUkVTVEFSVDsKQEAgLTYyMiw3ICs2MjMsNyBAQAogICoJTW92ZSBpbnRvIHBsYWNlIGFuZCBzdGFydCBleGVjdXRpbmcgYSBwcmVsb2FkZWQgc3RhbmRhbG9uZQogICoJZXhlY3V0YWJsZS4gIElmIG5vdGhpbmcgd2FzIHByZWxvYWRlZCByZXR1cm4gYW4gZXJyb3IuCiAgKi8KLXZvaWQga2VybmVsX2tleGVjKHZvaWQpCitzdGF0aWMgdm9pZCBrZXJuZWxfa2V4ZWModm9pZCkKIHsKICNpZmRlZiBDT05GSUdfS0VYRUMKIAlzdHJ1Y3Qga2ltYWdlICppbWFnZTsKQEAgLTYzNiw3ICs2MzcsNiBAQAogCW1hY2hpbmVfa2V4ZWMoaW1hZ2UpOwogI2VuZGlmCiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChrZXJuZWxfa2V4ZWMpOwogCiB2b2lkIGtlcm5lbF9zaHV0ZG93bl9wcmVwYXJlKGVudW0gc3lzdGVtX3N0YXRlcyBzdGF0ZSkKIHsKZGlmZiAtLWdpdCBhL2tlcm5lbC9zeXNjdGwuYyBiL2tlcm5lbC9zeXNjdGwuYwppbmRleCBlYjhiZDIxLi5mMWE0ZWIxIDEwMDY0NAotLS0gYS9rZXJuZWwvc3lzY3RsLmMKKysrIGIva2VybmVsL3N5c2N0bC5jCkBAIC03Myw2ICs3Myw3IEBACiBleHRlcm4gaW50IHBpZF9tYXhfbWluLCBwaWRfbWF4X21heDsKIGV4dGVybiBpbnQgc3lzY3RsX2Ryb3BfY2FjaGVzOwogZXh0ZXJuIGludCBwZXJjcHVfcGFnZWxpc3RfZnJhY3Rpb247CitleHRlcm4gaW50IGNvbXBhdF9sb2c7CiAKICNpZiBkZWZpbmVkKENPTkZJR19YODZfTE9DQUxfQVBJQykgJiYgZGVmaW5lZChDT05GSUdfWDg2KQogaW50IHVua25vd25fbm1pX3BhbmljOwpAQCAtMTQzLDcgKzE0NCw2IEBACiAKIHN0YXRpYyBjdGxfdGFibGUga2Vybl90YWJsZVtdOwogc3RhdGljIGN0bF90YWJsZSB2bV90YWJsZVtdOwotc3RhdGljIGN0bF90YWJsZSBwcm9jX3RhYmxlW107CiBzdGF0aWMgY3RsX3RhYmxlIGZzX3RhYmxlW107CiBzdGF0aWMgY3RsX3RhYmxlIGRlYnVnX3RhYmxlW107CiBzdGF0aWMgY3RsX3RhYmxlIGRldl90YWJsZVtdOwpAQCAtMjAzLDEyICsyMDMsNiBAQAogCX0sCiAjZW5kaWYKIAl7Ci0JCS5jdGxfbmFtZQk9IENUTF9QUk9DLAotCQkucHJvY25hbWUJPSAicHJvYyIsCi0JCS5tb2RlCQk9IDA1NTUsCi0JCS5jaGlsZAkJPSBwcm9jX3RhYmxlLAotCX0sCi0JewogCQkuY3RsX25hbWUJPSBDVExfRlMsCiAJCS5wcm9jbmFtZQk9ICJmcyIsCiAJCS5tb2RlCQk9IDA1NTUsCkBAIC02ODQsNiArNjc4LDE2IEBACiAJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKIAl9LAogI2VuZGlmCisjaWZkZWYgQ09ORklHX0NPTVBBVAorCXsKKwkJLmN0bF9uYW1lCT0gS0VSTl9DT01QQVRfTE9HLAorCQkucHJvY25hbWUJPSAiY29tcGF0LWxvZyIsCisJCS5kYXRhCQk9ICZjb21wYXRfbG9nLAorCQkubWF4bGVuCQk9IHNpemVvZiAoaW50KSwKKwkgCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKKwl9LAorI2VuZGlmCiAJeyAuY3RsX25hbWUgPSAwIH0KIH07CiAKQEAgLTkyNywxMCArOTMxLDYgQEAKIAl7IC5jdGxfbmFtZSA9IDAgfQogfTsKIAotc3RhdGljIGN0bF90YWJsZSBwcm9jX3RhYmxlW10gPSB7Ci0JeyAuY3RsX25hbWUgPSAwIH0KLX07Ci0KIHN0YXRpYyBjdGxfdGFibGUgZnNfdGFibGVbXSA9IHsKIAl7CiAJCS5jdGxfbmFtZQk9IEZTX05SSU5PREUsCmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS5jIGIva2VybmVsL3RpbWUuYwppbmRleCBiMDBkZGM3Li41YmQ0ODk3IDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZS5jCisrKyBiL2tlcm5lbC90aW1lLmMKQEAgLTUyMyw2ICs1MjMsNyBAQAogCiAKICNlbHNlCisjaWZuZGVmIENPTkZJR19HRU5FUklDX1RJTUUKIC8qCiAgKiBTaW11bGF0ZSBnZXR0aW1lb2ZkYXkgdXNpbmcgZG9fZ2V0dGltZW9mZGF5IHdoaWNoIG9ubHkgYWxsb3dzIGEgdGltZXZhbAogICogYW5kIHRoZXJlZm9yZSBvbmx5IHlpZWxkcyB1c2VjIGFjY3VyYWN5CkBAIC01MzcsNiArNTM4LDcgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGdldG5zdGltZW9mZGF5KTsKICNlbmRpZgorI2VuZGlmCiAKIC8qIENvbnZlcnRzIEdyZWdvcmlhbiBkYXRlIHRvIHNlY29uZHMgc2luY2UgMTk3MC0wMS0wMSAwMDowMDowMC4KICAqIEFzc3VtZXMgaW5wdXQgaW4gbm9ybWFsIGRhdGUgZm9ybWF0LCBpLmUuIDE5ODAtMTItMzEgMjM6NTk6NTkKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lL01ha2VmaWxlIGIva2VybmVsL3RpbWUvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFkZmQ4ZQotLS0gL2Rldi9udWxsCisrKyBiL2tlcm5lbC90aW1lL01ha2VmaWxlCkBAIC0wLDAgKzEgQEAKK29iai15ICs9IGNsb2Nrc291cmNlLm8gamlmZmllcy5vCmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS9jbG9ja3NvdXJjZS5jIGIva2VybmVsL3RpbWUvY2xvY2tzb3VyY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGVjYTU5Ci0tLSAvZGV2L251bGwKKysrIGIva2VybmVsL3RpbWUvY2xvY2tzb3VyY2UuYwpAQCAtMCwwICsxLDM0OSBAQAorLyoKKyAqIGxpbnV4L2tlcm5lbC90aW1lL2Nsb2Nrc291cmNlLmMKKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGZ1bmN0aW9ucyB3aGljaCBtYW5hZ2UgY2xvY2tzb3VyY2UgZHJpdmVycy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUgSUJNLCBKb2huIFN0dWx0eiAoam9obnN0dWxAdXMuaWJtLmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKiBUT0RPIFdpc2hMaXN0OgorICogICBvIEFsbG93IGNsb2Nrc291cmNlIGRyaXZlcnMgdG8gYmUgdW5yZWdpc3RlcmVkCisgKiAgIG8gZ2V0IHJpZCBvZiBjbG9ja3NvdXJjZV9qaWZmaWVzIGV4dGVybgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jbG9ja3NvdXJjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworLyogWFhYIC0gV291bGQgbGlrZSBhIGJldHRlciB3YXkgZm9yIGluaXRpYWxpemluZyBjdXJyX2Nsb2Nrc291cmNlICovCitleHRlcm4gc3RydWN0IGNsb2Nrc291cmNlIGNsb2Nrc291cmNlX2ppZmZpZXM7CisKKy8qW0Nsb2Nrc291cmNlIGludGVybmFsIHZhcmlhYmxlc10tLS0tLS0tLS0KKyAqIGN1cnJfY2xvY2tzb3VyY2U6CisgKgljdXJyZW50bHkgc2VsZWN0ZWQgY2xvY2tzb3VyY2UuIEluaXRpYWxpemVkIHRvIGNsb2Nrc291cmNlX2ppZmZpZXMuCisgKiBuZXh0X2Nsb2Nrc291cmNlOgorICoJcGVuZGluZyBuZXh0IHNlbGVjdGVkIGNsb2Nrc291cmNlLgorICogY2xvY2tzb3VyY2VfbGlzdDoKKyAqCWxpbmtlZCBsaXN0IHdpdGggdGhlIHJlZ2lzdGVyZWQgY2xvY2tzb3VyY2VzCisgKiBjbG9ja3NvdXJjZV9sb2NrOgorICoJcHJvdGVjdHMgbWFuaXB1bGF0aW9ucyB0byBjdXJyX2Nsb2Nrc291cmNlIGFuZCBuZXh0X2Nsb2Nrc291cmNlCisgKglhbmQgdGhlIGNsb2Nrc291cmNlX2xpc3QKKyAqIG92ZXJyaWRlX25hbWU6CisgKglOYW1lIG9mIHRoZSB1c2VyLXNwZWNpZmllZCBjbG9ja3NvdXJjZS4KKyAqLworc3RhdGljIHN0cnVjdCBjbG9ja3NvdXJjZSAqY3Vycl9jbG9ja3NvdXJjZSA9ICZjbG9ja3NvdXJjZV9qaWZmaWVzOworc3RhdGljIHN0cnVjdCBjbG9ja3NvdXJjZSAqbmV4dF9jbG9ja3NvdXJjZTsKK3N0YXRpYyBMSVNUX0hFQUQoY2xvY2tzb3VyY2VfbGlzdCk7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGNsb2Nrc291cmNlX2xvY2spOworc3RhdGljIGNoYXIgb3ZlcnJpZGVfbmFtZVszMl07CitzdGF0aWMgaW50IGZpbmlzaGVkX2Jvb3Rpbmc7CisKKy8qIGNsb2Nrc291cmNlX2RvbmVfYm9vdGluZyAtIENhbGxlZCBuZWFyIHRoZSBlbmQgb2YgYm9vdHVwCisgKgorICogSGFjayB0byBhdm9pZCBsb3RzIG9mIGNsb2Nrc291cmNlIGNodXJuIGF0IGJvb3QgdGltZQorICovCitzdGF0aWMgaW50IF9faW5pdCBjbG9ja3NvdXJjZV9kb25lX2Jvb3Rpbmcodm9pZCkKK3sKKwlmaW5pc2hlZF9ib290aW5nID0gMTsKKwlyZXR1cm4gMDsKK30KKworbGF0ZV9pbml0Y2FsbChjbG9ja3NvdXJjZV9kb25lX2Jvb3RpbmcpOworCisvKioKKyAqIGNsb2Nrc291cmNlX2dldF9uZXh0IC0gUmV0dXJucyB0aGUgc2VsZWN0ZWQgY2xvY2tzb3VyY2UKKyAqCisgKi8KK3N0cnVjdCBjbG9ja3NvdXJjZSAqY2xvY2tzb3VyY2VfZ2V0X25leHQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNsb2Nrc291cmNlX2xvY2ssIGZsYWdzKTsKKwlpZiAobmV4dF9jbG9ja3NvdXJjZSAmJiBmaW5pc2hlZF9ib290aW5nKSB7CisJCWN1cnJfY2xvY2tzb3VyY2UgPSBuZXh0X2Nsb2Nrc291cmNlOworCQluZXh0X2Nsb2Nrc291cmNlID0gTlVMTDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2xvY2tzb3VyY2VfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIGN1cnJfY2xvY2tzb3VyY2U7Cit9CisKKy8qKgorICogc2VsZWN0X2Nsb2Nrc291cmNlIC0gRmluZHMgdGhlIGJlc3QgcmVnaXN0ZXJlZCBjbG9ja3NvdXJjZS4KKyAqCisgKiBQcml2YXRlIGZ1bmN0aW9uLiBNdXN0IGhvbGQgY2xvY2tzb3VyY2VfbG9jayB3aGVuIGNhbGxlZC4KKyAqCisgKiBMb29rcyB0aHJvdWdoIHRoZSBsaXN0IG9mIHJlZ2lzdGVyZWQgY2xvY2tzb3VyY2VzLCByZXR1cm5pbmcKKyAqIHRoZSBvbmUgd2l0aCB0aGUgaGlnaGVzdCByYXRpbmcgdmFsdWUuIElmIHRoZXJlIGlzIGEgY2xvY2tzb3VyY2UKKyAqIG5hbWUgdGhhdCBtYXRjaGVzIHRoZSBvdmVycmlkZSBzdHJpbmcsIGl0IHJldHVybnMgdGhhdCBjbG9ja3NvdXJjZS4KKyAqLworc3RhdGljIHN0cnVjdCBjbG9ja3NvdXJjZSAqc2VsZWN0X2Nsb2Nrc291cmNlKHZvaWQpCit7CisJc3RydWN0IGNsb2Nrc291cmNlICpiZXN0ID0gTlVMTDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CisKKwlsaXN0X2Zvcl9lYWNoKHRtcCwgJmNsb2Nrc291cmNlX2xpc3QpIHsKKwkJc3RydWN0IGNsb2Nrc291cmNlICpzcmM7CisKKwkJc3JjID0gbGlzdF9lbnRyeSh0bXAsIHN0cnVjdCBjbG9ja3NvdXJjZSwgbGlzdCk7CisJCWlmICghYmVzdCkKKwkJCWJlc3QgPSBzcmM7CisKKwkJLyogY2hlY2sgZm9yIG92ZXJyaWRlOiAqLworCQlpZiAoc3RybGVuKHNyYy0+bmFtZSkgPT0gc3RybGVuKG92ZXJyaWRlX25hbWUpICYmCisJCSAgICAhc3RyY21wKHNyYy0+bmFtZSwgb3ZlcnJpZGVfbmFtZSkpIHsKKwkJCWJlc3QgPSBzcmM7CisJCQlicmVhazsKKwkJfQorCQkvKiBwaWNrIHRoZSBoaWdoZXN0IHJhdGluZzogKi8KKwkJaWYgKHNyYy0+cmF0aW5nID4gYmVzdC0+cmF0aW5nKQorCQkgCWJlc3QgPSBzcmM7CisJfQorCisJcmV0dXJuIGJlc3Q7Cit9CisKKy8qKgorICogaXNfcmVnaXN0ZXJlZF9zb3VyY2UgLSBDaGVja3MgaWYgY2xvY2tzb3VyY2UgaXMgcmVnaXN0ZXJlZAorICogQGM6CQlwb2ludGVyIHRvIGEgY2xvY2tzb3VyY2UKKyAqCisgKiBQcml2YXRlIGhlbHBlciBmdW5jdGlvbi4gTXVzdCBob2xkIGNsb2Nrc291cmNlX2xvY2sgd2hlbiBjYWxsZWQuCisgKgorICogUmV0dXJucyBvbmUgaWYgdGhlIGNsb2Nrc291cmNlIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCwgemVybyBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbnQgaXNfcmVnaXN0ZXJlZF9zb3VyY2Uoc3RydWN0IGNsb2Nrc291cmNlICpjKQoreworCWludCBsZW4gPSBzdHJsZW4oYy0+bmFtZSk7CisJc3RydWN0IGxpc3RfaGVhZCAqdG1wOworCisJbGlzdF9mb3JfZWFjaCh0bXAsICZjbG9ja3NvdXJjZV9saXN0KSB7CisJCXN0cnVjdCBjbG9ja3NvdXJjZSAqc3JjOworCisJCXNyYyA9IGxpc3RfZW50cnkodG1wLCBzdHJ1Y3QgY2xvY2tzb3VyY2UsIGxpc3QpOworCQlpZiAoc3RybGVuKHNyYy0+bmFtZSkgPT0gbGVuICYmCSFzdHJjbXAoc3JjLT5uYW1lLCBjLT5uYW1lKSkKKwkJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIGNsb2Nrc291cmNlX3JlZ2lzdGVyIC0gVXNlZCB0byBpbnN0YWxsIG5ldyBjbG9ja3NvdXJjZXMKKyAqIEB0OgkJY2xvY2tzb3VyY2UgdG8gYmUgcmVnaXN0ZXJlZAorICoKKyAqIFJldHVybnMgLUVCVVNZIGlmIHJlZ2lzdHJhdGlvbiBmYWlscywgemVybyBvdGhlcndpc2UuCisgKi8KK2ludCBjbG9ja3NvdXJjZV9yZWdpc3RlcihzdHJ1Y3QgY2xvY2tzb3VyY2UgKmMpCit7CisJaW50IHJldCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjbG9ja3NvdXJjZV9sb2NrLCBmbGFncyk7CisJLyogY2hlY2sgaWYgY2xvY2tzb3VyY2UgaXMgYWxyZWFkeSByZWdpc3RlcmVkICovCisJaWYgKGlzX3JlZ2lzdGVyZWRfc291cmNlKGMpKSB7CisJCXByaW50aygicmVnaXN0ZXJfY2xvY2tzb3VyY2U6IENhbm5vdCByZWdpc3RlciAlcy4gIgorCQkJIkFscmVhZHkgcmVnaXN0ZXJlZCEiLCBjLT5uYW1lKTsKKwkJcmV0ID0gLUVCVVNZOworCX0gZWxzZSB7CisJCS8qIHJlZ2lzdGVyIGl0ICovCisgCQlsaXN0X2FkZCgmYy0+bGlzdCwgJmNsb2Nrc291cmNlX2xpc3QpOworCQkvKiBzY2FuIHRoZSByZWdpc3RlcmVkIGNsb2Nrc291cmNlcywgYW5kIHBpY2sgdGhlIGJlc3Qgb25lICovCisJCW5leHRfY2xvY2tzb3VyY2UgPSBzZWxlY3RfY2xvY2tzb3VyY2UoKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2xvY2tzb3VyY2VfbG9jaywgZmxhZ3MpOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKGNsb2Nrc291cmNlX3JlZ2lzdGVyKTsKKworLyoqCisgKiBjbG9ja3NvdXJjZV9yZXNlbGVjdCAtIFJlc2NhbiBsaXN0IGZvciBuZXh0IGNsb2Nrc291cmNlCisgKgorICogQSBxdWljayBoZWxwZXIgZnVuY3Rpb24gdG8gYmUgdXNlZCBpZiBhIGNsb2Nrc291cmNlIGNoYW5nZXMgaXRzCisgKiByYXRpbmcuIEZvcmNlcyB0aGUgY2xvY2tzb3VyY2UgbGlzdCB0byBiZSByZS1zY2FubmVkIGZvciB0aGUgYmVzdAorICogY2xvY2tzb3VyY2UuCisgKi8KK3ZvaWQgY2xvY2tzb3VyY2VfcmVzZWxlY3Qodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNsb2Nrc291cmNlX2xvY2ssIGZsYWdzKTsKKwluZXh0X2Nsb2Nrc291cmNlID0gc2VsZWN0X2Nsb2Nrc291cmNlKCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2xvY2tzb3VyY2VfbG9jaywgZmxhZ3MpOworfQorRVhQT1JUX1NZTUJPTChjbG9ja3NvdXJjZV9yZXNlbGVjdCk7CisKKy8qKgorICogc3lzZnNfc2hvd19jdXJyZW50X2Nsb2Nrc291cmNlcyAtIHN5c2ZzIGludGVyZmFjZSBmb3IgY3VycmVudCBjbG9ja3NvdXJjZQorICogQGRldjoJdW51c2VkCisgKiBAYnVmOgljaGFyIGJ1ZmZlciB0byBiZSBmaWxsZWQgd2l0aCBjbG9ja3NvdXJjZSBsaXN0CisgKgorICogUHJvdmlkZXMgc3lzZnMgaW50ZXJmYWNlIGZvciBsaXN0aW5nIGN1cnJlbnQgY2xvY2tzb3VyY2UuCisgKi8KK3N0YXRpYyBzc2l6ZV90CitzeXNmc19zaG93X2N1cnJlbnRfY2xvY2tzb3VyY2VzKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwljaGFyICpjdXJyID0gYnVmOworCisJc3Bpbl9sb2NrX2lycSgmY2xvY2tzb3VyY2VfbG9jayk7CisJY3VyciArPSBzcHJpbnRmKGN1cnIsICIlcyAiLCBjdXJyX2Nsb2Nrc291cmNlLT5uYW1lKTsKKwlzcGluX3VubG9ja19pcnEoJmNsb2Nrc291cmNlX2xvY2spOworCisJY3VyciArPSBzcHJpbnRmKGN1cnIsICJcbiIpOworCisJcmV0dXJuIGN1cnIgLSBidWY7Cit9CisKKy8qKgorICogc3lzZnNfb3ZlcnJpZGVfY2xvY2tzb3VyY2UgLSBpbnRlcmZhY2UgZm9yIG1hbnVhbGx5IG92ZXJyaWRpbmcgY2xvY2tzb3VyY2UKKyAqIEBkZXY6CXVudXNlZAorICogQGJ1ZjoJbmFtZSBvZiBvdmVycmlkZSBjbG9ja3NvdXJjZQorICogQGNvdW50OglsZW5ndGggb2YgYnVmZmVyCisgKgorICogVGFrZXMgaW5wdXQgZnJvbSBzeXNmcyBpbnRlcmZhY2UgZm9yIG1hbnVhbGx5IG92ZXJyaWRpbmcgdGhlIGRlZmF1bHQKKyAqIGNsb2Nrc291cmNlIHNlbGN0aW9uLgorICovCitzdGF0aWMgc3NpemVfdCBzeXNmc19vdmVycmlkZV9jbG9ja3NvdXJjZShzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2LAorCQkJCQkgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXNpemVfdCByZXQgPSBjb3VudDsKKwkvKiBzdHJpbmdzIGZyb20gc3lzZnMgd3JpdGUgYXJlIG5vdCAwIHRlcm1pbmF0ZWQhICovCisJaWYgKGNvdW50ID49IHNpemVvZihvdmVycmlkZV9uYW1lKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBzdHJpcCBvZiBcbjogKi8KKwlpZiAoYnVmW2NvdW50LTFdID09ICdcbicpCisJCWNvdW50LS07CisJaWYgKGNvdW50IDwgMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcGluX2xvY2tfaXJxKCZjbG9ja3NvdXJjZV9sb2NrKTsKKworCS8qIGNvcHkgdGhlIG5hbWUgZ2l2ZW46ICovCisJbWVtY3B5KG92ZXJyaWRlX25hbWUsIGJ1ZiwgY291bnQpOworCW92ZXJyaWRlX25hbWVbY291bnRdID0gMDsKKworCS8qIHRyeSB0byBzZWxlY3QgaXQ6ICovCisJbmV4dF9jbG9ja3NvdXJjZSA9IHNlbGVjdF9jbG9ja3NvdXJjZSgpOworCisJc3Bpbl91bmxvY2tfaXJxKCZjbG9ja3NvdXJjZV9sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogc3lzZnNfc2hvd19hdmFpbGFibGVfY2xvY2tzb3VyY2VzIC0gc3lzZnMgaW50ZXJmYWNlIGZvciBsaXN0aW5nIGNsb2Nrc291cmNlCisgKiBAZGV2Ogl1bnVzZWQKKyAqIEBidWY6CWNoYXIgYnVmZmVyIHRvIGJlIGZpbGxlZCB3aXRoIGNsb2Nrc291cmNlIGxpc3QKKyAqCisgKiBQcm92aWRlcyBzeXNmcyBpbnRlcmZhY2UgZm9yIGxpc3RpbmcgcmVnaXN0ZXJlZCBjbG9ja3NvdXJjZXMKKyAqLworc3RhdGljIHNzaXplX3QKK3N5c2ZzX3Nob3dfYXZhaWxhYmxlX2Nsb2Nrc291cmNlcyhzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqdG1wOworCWNoYXIgKmN1cnIgPSBidWY7CisKKwlzcGluX2xvY2tfaXJxKCZjbG9ja3NvdXJjZV9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoKHRtcCwgJmNsb2Nrc291cmNlX2xpc3QpIHsKKwkJc3RydWN0IGNsb2Nrc291cmNlICpzcmM7CisKKwkJc3JjID0gbGlzdF9lbnRyeSh0bXAsIHN0cnVjdCBjbG9ja3NvdXJjZSwgbGlzdCk7CisJCWN1cnIgKz0gc3ByaW50ZihjdXJyLCAiJXMgIiwgc3JjLT5uYW1lKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZjbG9ja3NvdXJjZV9sb2NrKTsKKworCWN1cnIgKz0gc3ByaW50ZihjdXJyLCAiXG4iKTsKKworCXJldHVybiBjdXJyIC0gYnVmOworfQorCisvKgorICogU3lzZnMgc2V0dXAgYml0czoKKyAqLworc3RhdGljIFNZU0RFVl9BVFRSKGN1cnJlbnRfY2xvY2tzb3VyY2UsIDA2MDAsIHN5c2ZzX3Nob3dfY3VycmVudF9jbG9ja3NvdXJjZXMsCisJCQlzeXNmc19vdmVycmlkZV9jbG9ja3NvdXJjZSk7CisKK3N0YXRpYyBTWVNERVZfQVRUUihhdmFpbGFibGVfY2xvY2tzb3VyY2UsIDA2MDAsCisJCQlzeXNmc19zaG93X2F2YWlsYWJsZV9jbG9ja3NvdXJjZXMsIE5VTEwpOworCitzdGF0aWMgc3RydWN0IHN5c2Rldl9jbGFzcyBjbG9ja3NvdXJjZV9zeXNjbGFzcyA9IHsKKwlzZXRfa3NldF9uYW1lKCJjbG9ja3NvdXJjZSIpLAorfTsKKworc3RhdGljIHN0cnVjdCBzeXNfZGV2aWNlIGRldmljZV9jbG9ja3NvdXJjZSA9IHsKKwkuaWQJPSAwLAorCS5jbHMJPSAmY2xvY2tzb3VyY2Vfc3lzY2xhc3MsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X2Nsb2Nrc291cmNlX3N5c2ZzKHZvaWQpCit7CisJaW50IGVycm9yID0gc3lzZGV2X2NsYXNzX3JlZ2lzdGVyKCZjbG9ja3NvdXJjZV9zeXNjbGFzcyk7CisKKwlpZiAoIWVycm9yKQorCQllcnJvciA9IHN5c2Rldl9yZWdpc3RlcigmZGV2aWNlX2Nsb2Nrc291cmNlKTsKKwlpZiAoIWVycm9yKQorCQllcnJvciA9IHN5c2Rldl9jcmVhdGVfZmlsZSgKKwkJCQkmZGV2aWNlX2Nsb2Nrc291cmNlLAorCQkJCSZhdHRyX2N1cnJlbnRfY2xvY2tzb3VyY2UpOworCWlmICghZXJyb3IpCisJCWVycm9yID0gc3lzZGV2X2NyZWF0ZV9maWxlKAorCQkJCSZkZXZpY2VfY2xvY2tzb3VyY2UsCisJCQkJJmF0dHJfYXZhaWxhYmxlX2Nsb2Nrc291cmNlKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK2RldmljZV9pbml0Y2FsbChpbml0X2Nsb2Nrc291cmNlX3N5c2ZzKTsKKworLyoqCisgKiBib290X292ZXJyaWRlX2Nsb2Nrc291cmNlIC0gYm9vdCBjbG9jayBvdmVycmlkZQorICogQHN0cjoJb3ZlcnJpZGUgbmFtZQorICoKKyAqIFRha2VzIGEgY2xvY2tzb3VyY2U9IGJvb3QgYXJndW1lbnQgYW5kIHVzZXMgaXQKKyAqIGFzIHRoZSBjbG9ja3NvdXJjZSBvdmVycmlkZSBuYW1lLgorICovCitzdGF0aWMgaW50IF9faW5pdCBib290X292ZXJyaWRlX2Nsb2Nrc291cmNlKGNoYXIqIHN0cikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXNwaW5fbG9ja19pcnFzYXZlKCZjbG9ja3NvdXJjZV9sb2NrLCBmbGFncyk7CisJaWYgKHN0cikKKwkJc3RybGNweShvdmVycmlkZV9uYW1lLCBzdHIsIHNpemVvZihvdmVycmlkZV9uYW1lKSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2xvY2tzb3VyY2VfbG9jaywgZmxhZ3MpOworCXJldHVybiAxOworfQorCitfX3NldHVwKCJjbG9ja3NvdXJjZT0iLCBib290X292ZXJyaWRlX2Nsb2Nrc291cmNlKTsKKworLyoqCisgKiBib290X292ZXJyaWRlX2Nsb2NrIC0gQ29tcGF0aWJpbGl0eSBsYXllciBmb3IgZGVwcmVjYXRlZCBib290IG9wdGlvbgorICogQHN0cjoJb3ZlcnJpZGUgbmFtZQorICoKKyAqIERFUFJFQ0FURUQhIFRha2VzIGEgY2xvY2s9IGJvb3QgYXJndW1lbnQgYW5kIHVzZXMgaXQKKyAqIGFzIHRoZSBjbG9ja3NvdXJjZSBvdmVycmlkZSBuYW1lCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGJvb3Rfb3ZlcnJpZGVfY2xvY2soY2hhciogc3RyKQoreworCWlmICghc3RyY21wKHN0ciwgInBtdG1yIikpIHsKKwkJcHJpbnRrKCJXYXJuaW5nOiBjbG9jaz1wbXRtciBpcyBkZXByZWNhdGVkLiAiCisJCQkiVXNlIGNsb2Nrc291cmNlPWFjcGlfcG0uXG4iKTsKKwkJcmV0dXJuIGJvb3Rfb3ZlcnJpZGVfY2xvY2tzb3VyY2UoImFjcGlfcG0iKTsKKwl9CisJcHJpbnRrKCJXYXJuaW5nISBjbG9jaz0gYm9vdCBvcHRpb24gaXMgZGVwcmVjYXRlZC4gIgorCQkiVXNlIGNsb2Nrc291cmNlPXh5elxuIik7CisJcmV0dXJuIGJvb3Rfb3ZlcnJpZGVfY2xvY2tzb3VyY2Uoc3RyKTsKK30KKworX19zZXR1cCgiY2xvY2s9IiwgYm9vdF9vdmVycmlkZV9jbG9jayk7CmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS9qaWZmaWVzLmMgYi9rZXJuZWwvdGltZS9qaWZmaWVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI2YmIzMAotLS0gL2Rldi9udWxsCisrKyBiL2tlcm5lbC90aW1lL2ppZmZpZXMuYwpAQCAtMCwwICsxLDczIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbGludXgva2VybmVsL3RpbWUvamlmZmllcy5jCisqCisqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgamlmZmllcyBiYXNlZCBjbG9ja3NvdXJjZS4KKyoKKyogQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1IElCTSwgSm9obiBTdHVsdHogKGpvaG5zdHVsQHVzLmlibS5jb20pCisqCisqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisqCisqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqCisqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgPGxpbnV4L2Nsb2Nrc291cmNlLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworLyogVGhlIEppZmZpZXMgYmFzZWQgY2xvY2tzb3VyY2UgaXMgdGhlIGxvd2VzdCBjb21tb24KKyAqIGRlbm9taW5hdG9yIGNsb2NrIHNvdXJjZSB3aGljaCBzaG91bGQgZnVuY3Rpb24gb24KKyAqIGFsbCBzeXN0ZW1zLiBJdCBoYXMgdGhlIHNhbWUgY29hcnNlIHJlc29sdXRpb24gYXMKKyAqIHRoZSB0aW1lciBpbnRlcnJ1cHQgZnJlcXVlbmN5IEhaIGFuZCBpdCBzdWZmZXJzCisgKiBpbmFjY3VyYWNpZXMgY2F1c2VkIGJ5IG1pc3NlZCBvciBsb3N0IHRpbWVyCisgKiBpbnRlcnJ1cHRzIGFuZCB0aGUgaW5hYmlsaXR5IGZvciB0aGUgdGltZXIKKyAqIGludGVycnVwdCBoYXJkd2FyZSB0byBhY2N1cmF0bHkgdGljayBhdCB0aGUKKyAqIHJlcXVlc3RlZCBIWiB2YWx1ZS4gSXQgaXMgYWxzbyBub3QgcmVjY29tZW5kZWQKKyAqIGZvciAidGljay1sZXNzIiBzeXN0ZW1zLgorICovCisjZGVmaW5lIE5TRUNfUEVSX0pJRkZZCSgodTMyKSgoKCh1NjQpTlNFQ19QRVJfU0VDKTw8OCkvQUNUSFopKQorCisvKiBTaW5jZSBqaWZmaWVzIHVzZXMgYSBzaW1wbGUgTlNFQ19QRVJfSklGRlkgbXVsdGlwbGllcgorICogY29udmVyc2lvbiwgdGhlIC5zaGlmdCB2YWx1ZSBjb3VsZCBiZSB6ZXJvLiBIb3dldmVyCisgKiB0aGlzIHdvdWxkIG1ha2UgTlRQIGFkanVzdG1lbnRzIGltcG9zc2libGUgYXMgdGhleSBhcmUKKyAqIGluIHVuaXRzIG9mIDEvMl4uc2hpZnQuIFRodXMgd2UgdXNlIEpJRkZJRVNfU0hJRlQgdG8KKyAqIHNoaWZ0IGJvdGggdGhlIG5vbWluYXRvciBhbmQgZGVub21pbmF0b3IgdGhlIHNhbWUKKyAqIGFtb3VudCwgYW5kIGdpdmUgbnRwIGFkanVzdG1lbnRzIGluIHVuaXRzIG9mIDEvMl44CisgKgorICogVGhlIHZhbHVlIDggaXMgc29tZXdoYXQgY2FyZWZ1bGx5IGNob3NlbiwgYXMgYW55dGhpbmcKKyAqIGxhcmdlciBjYW4gcmVzdWx0IGluIG92ZXJmbG93cy4gTlNFQ19QRVJfSklGRlkgZ3Jvd3MgYXMKKyAqIEhaIHNocmlua3MsIHNvIHZhbHVlcyBncmVhdGVyIHRoZW4gOCBvdmVyZmxvdyAzMmJpdHMgd2hlbgorICogSFo9MTAwLgorICovCisjZGVmaW5lIEpJRkZJRVNfU0hJRlQJOAorCitzdGF0aWMgY3ljbGVfdCBqaWZmaWVzX3JlYWQodm9pZCkKK3sKKwlyZXR1cm4gKGN5Y2xlX3QpIGppZmZpZXM7Cit9CisKK3N0cnVjdCBjbG9ja3NvdXJjZSBjbG9ja3NvdXJjZV9qaWZmaWVzID0geworCS5uYW1lCQk9ICJqaWZmaWVzIiwKKwkucmF0aW5nCQk9IDAsIC8qIGxvd2VzdCByYXRpbmcqLworCS5yZWFkCQk9IGppZmZpZXNfcmVhZCwKKwkubWFzawkJPSAweGZmZmZmZmZmLCAvKjMyYml0cyovCisJLm11bHQJCT0gTlNFQ19QRVJfSklGRlkgPDwgSklGRklFU19TSElGVCwgLyogZGV0YWlscyBhYm92ZSAqLworCS5zaGlmdAkJPSBKSUZGSUVTX1NISUZULAorCS5pc19jb250aW51b3VzCT0gMCwgLyogdGljayBiYXNlZCwgbm90IGZyZWUgcnVubmluZyAqLworfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9qaWZmaWVzX2Nsb2Nrc291cmNlKHZvaWQpCit7CisJcmV0dXJuIGNsb2Nrc291cmNlX3JlZ2lzdGVyKCZjbG9ja3NvdXJjZV9qaWZmaWVzKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9qaWZmaWVzX2Nsb2Nrc291cmNlKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lci5jIGIva2VybmVsL3RpbWVyLmMKaW5kZXggZjM1YjM5My4uNWJiNmI3OSAxMDA2NDQKLS0tIGEva2VybmVsL3RpbWVyLmMKKysrIGIva2VybmVsL3RpbWVyLmMKQEAgLTE0Niw3ICsxNDYsNyBAQAogdm9pZCBmYXN0Y2FsbCBpbml0X3RpbWVyKHN0cnVjdCB0aW1lcl9saXN0ICp0aW1lcikKIHsKIAl0aW1lci0+ZW50cnkubmV4dCA9IE5VTEw7Ci0JdGltZXItPmJhc2UgPSBwZXJfY3B1KHR2ZWNfYmFzZXMsIHJhd19zbXBfcHJvY2Vzc29yX2lkKCkpOworCXRpbWVyLT5iYXNlID0gX19yYXdfZ2V0X2NwdV92YXIodHZlY19iYXNlcyk7CiB9CiBFWFBPUlRfU1lNQk9MKGluaXRfdGltZXIpOwogCkBAIC01OTcsNyArNTk3LDYgQEAKIGxvbmcgdGltZV9wcmVjaXNpb24gPSAxOwkJLyogY2xvY2sgcHJlY2lzaW9uICh1cykJCSovCiBsb25nIHRpbWVfbWF4ZXJyb3IgPSBOVFBfUEhBU0VfTElNSVQ7CS8qIG1heGltdW0gZXJyb3IgKHVzKQkJKi8KIGxvbmcgdGltZV9lc3RlcnJvciA9IE5UUF9QSEFTRV9MSU1JVDsJLyogZXN0aW1hdGVkIGVycm9yICh1cykJCSovCi1zdGF0aWMgbG9uZyB0aW1lX3BoYXNlOwkJCS8qIHBoYXNlIG9mZnNldCAoc2NhbGVkIHVzKQkqLwogbG9uZyB0aW1lX2ZyZXEgPSAoKChOU0VDX1BFUl9TRUMgKyBIWi8yKSAlIEhaIC0gSFovMikgPDwgU0hJRlRfVVNFQykgLyBOU0VDX1BFUl9VU0VDOwogCQkJCQkvKiBmcmVxdWVuY3kgb2Zmc2V0IChzY2FsZWQgcHBtKSovCiBzdGF0aWMgbG9uZyB0aW1lX2FkajsJCQkvKiB0aWNrIGFkanVzdCAoc2NhbGVkIDEgLyBIWikJKi8KQEAgLTc0NywyNyArNzQ2LDE0IEBACiB9CiAKIC8qIGluIHRoZSBOVFAgcmVmZXJlbmNlIHRoaXMgaXMgY2FsbGVkICJoYXJkY2xvY2soKSIgKi8KLXN0YXRpYyB2b2lkIHVwZGF0ZV93YWxsX3RpbWVfb25lX3RpY2sodm9pZCkKK3N0YXRpYyB2b2lkIHVwZGF0ZV9udHBfb25lX3RpY2sodm9pZCkKIHsKLQlsb25nIHRpbWVfYWRqdXN0X3N0ZXAsIGRlbHRhX25zZWM7CisJbG9uZyB0aW1lX2FkanVzdF9zdGVwOwogCiAJdGltZV9hZGp1c3Rfc3RlcCA9IGFkanRpbWVfYWRqdXN0bWVudCgpOwogCWlmICh0aW1lX2FkanVzdF9zdGVwKQogCQkvKiBSZWR1Y2UgYnkgdGhpcyBzdGVwIHRoZSBhbW91bnQgb2YgdGltZSBsZWZ0ICAqLwogCQl0aW1lX2FkanVzdCAtPSB0aW1lX2FkanVzdF9zdGVwOwotCWRlbHRhX25zZWMgPSB0aWNrX25zZWMgKyB0aW1lX2FkanVzdF9zdGVwICogMTAwMDsKLQkvKgotCSAqIEFkdmFuY2UgdGhlIHBoYXNlLCBvbmNlIGl0IGdldHMgdG8gb25lIG1pY3Jvc2Vjb25kLCB0aGVuCi0JICogYWR2YW5jZSB0aGUgdGljayBtb3JlLgotCSAqLwotCXRpbWVfcGhhc2UgKz0gdGltZV9hZGo7Ci0JaWYgKCh0aW1lX3BoYXNlID49IEZJTkVOU0VDKSB8fCAodGltZV9waGFzZSA8PSAtRklORU5TRUMpKSB7Ci0JCWxvbmcgbHRlbXAgPSBzaGlmdF9yaWdodCh0aW1lX3BoYXNlLCAoU0hJRlRfU0NBTEUgLSAxMCkpOwotCQl0aW1lX3BoYXNlIC09IGx0ZW1wIDw8IChTSElGVF9TQ0FMRSAtIDEwKTsKLQkJZGVsdGFfbnNlYyArPSBsdGVtcDsKLQl9Ci0JeHRpbWUudHZfbnNlYyArPSBkZWx0YV9uc2VjOwotCXRpbWVfaW50ZXJwb2xhdG9yX3VwZGF0ZShkZWx0YV9uc2VjKTsKIAogCS8qIENoYW5nZXMgYnkgYWRqdGltZSgpIGRvIG5vdCB0YWtlIGVmZmVjdCB0aWxsIG5leHQgdGljay4gKi8KIAlpZiAodGltZV9uZXh0X2FkanVzdCAhPSAwKSB7CkBAIC03ODAsMzYgKzc2NiwzNzggQEAKICAqIFJldHVybiBob3cgbG9uZyB0aWNrcyBhcmUgYXQgdGhlIG1vbWVudCwgdGhhdCBpcywgaG93IG11Y2ggdGltZQogICogdXBkYXRlX3dhbGxfdGltZV9vbmVfdGljayB3aWxsIGFkZCB0byB4dGltZSBuZXh0IHRpbWUgd2UgY2FsbCBpdAogICogKGFzc3VtaW5nIG5vIGNhbGxzIHRvIGRvX2FkanRpbWV4IGluIHRoZSBtZWFudGltZSkuCi0gKiBUaGUgcmV0dXJuIHZhbHVlIGlzIGluIGZpeGVkLXBvaW50IG5hbm9zZWNvbmRzIHdpdGggU0hJRlRfU0NBTEUtMTAKLSAqIGJpdHMgdG8gdGhlIHJpZ2h0IG9mIHRoZSBiaW5hcnkgcG9pbnQuCisgKiBUaGUgcmV0dXJuIHZhbHVlIGlzIGluIGZpeGVkLXBvaW50IG5hbm9zZWNvbmRzIHNoaWZ0ZWQgYnkgdGhlCisgKiBzcGVjaWZpZWQgbnVtYmVyIG9mIGJpdHMgdG8gdGhlIHJpZ2h0IG9mIHRoZSBiaW5hcnkgcG9pbnQuCiAgKiBUaGlzIGZ1bmN0aW9uIGhhcyBubyBzaWRlLWVmZmVjdHMuCiAgKi8KIHU2NCBjdXJyZW50X3RpY2tfbGVuZ3RoKHZvaWQpCiB7CiAJbG9uZyBkZWx0YV9uc2VjOworCXU2NCByZXQ7CiAKKwkvKiBjYWxjdWxhdGUgdGhlIGZpbmVzdCBpbnRlcnZhbCBOVFAgd2lsbCBhbGxvdy4KKwkgKiAgICBpZTogbmFub3NlY29uZCB2YWx1ZSBzaGlmdGVkIGJ5IChTSElGVF9TQ0FMRSAtIDEwKQorCSAqLwogCWRlbHRhX25zZWMgPSB0aWNrX25zZWMgKyBhZGp0aW1lX2FkanVzdG1lbnQoKSAqIDEwMDA7Ci0JcmV0dXJuICgodTY0KSBkZWx0YV9uc2VjIDw8IChTSElGVF9TQ0FMRSAtIDEwKSkgKyB0aW1lX2FkajsKKwlyZXQgPSAodTY0KWRlbHRhX25zZWMgPDwgVElDS19MRU5HVEhfU0hJRlQ7CisJcmV0ICs9IChzNjQpdGltZV9hZGogPDwgKFRJQ0tfTEVOR1RIX1NISUZUIC0gKFNISUZUX1NDQUxFIC0gMTApKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIFhYWCAtIGFsbCBvZiB0aGlzIHRpbWVrZWVwaW5nIGNvZGUgc2hvdWxkIGJlIGxhdGVyIG1vdmVkIHRvIHRpbWUuYyAqLworI2luY2x1ZGUgPGxpbnV4L2Nsb2Nrc291cmNlLmg+CitzdGF0aWMgc3RydWN0IGNsb2Nrc291cmNlICpjbG9jazsgLyogcG9pbnRlciB0byBjdXJyZW50IGNsb2Nrc291cmNlICovCisKKyNpZmRlZiBDT05GSUdfR0VORVJJQ19USU1FCisvKioKKyAqIF9fZ2V0X25zZWNfb2Zmc2V0IC0gUmV0dXJucyBuYW5vc2Vjb25kcyBzaW5jZSBsYXN0IGNhbGwgdG8gcGVyaW9kaWNfaG9vaworICoKKyAqIHByaXZhdGUgZnVuY3Rpb24sIG11c3QgaG9sZCB4dGltZV9sb2NrIGxvY2sgd2hlbiBiZWluZworICogY2FsbGVkLiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgbmFub3NlY29uZHMgc2luY2UgdGhlCisgKiBsYXN0IGNhbGwgdG8gdXBkYXRlX3dhbGxfdGltZSgpIChhZGp1c3RlZCBieSBOVFAgc2NhbGluZykKKyAqLworc3RhdGljIGlubGluZSBzNjQgX19nZXRfbnNlY19vZmZzZXQodm9pZCkKK3sKKwljeWNsZV90IGN5Y2xlX25vdywgY3ljbGVfZGVsdGE7CisJczY0IG5zX29mZnNldDsKKworCS8qIHJlYWQgY2xvY2tzb3VyY2U6ICovCisJY3ljbGVfbm93ID0gY2xvY2tzb3VyY2VfcmVhZChjbG9jayk7CisKKwkvKiBjYWxjdWxhdGUgdGhlIGRlbHRhIHNpbmNlIHRoZSBsYXN0IHVwZGF0ZV93YWxsX3RpbWU6ICovCisJY3ljbGVfZGVsdGEgPSAoY3ljbGVfbm93IC0gY2xvY2stPmN5Y2xlX2xhc3QpICYgY2xvY2stPm1hc2s7CisKKwkvKiBjb252ZXJ0IHRvIG5hbm9zZWNvbmRzOiAqLworCW5zX29mZnNldCA9IGN5YzJucyhjbG9jaywgY3ljbGVfZGVsdGEpOworCisJcmV0dXJuIG5zX29mZnNldDsKK30KKworLyoqCisgKiBfX2dldF9yZWFsdGltZV9jbG9ja190cyAtIFJldHVybnMgdGhlIHRpbWUgb2YgZGF5IGluIGEgdGltZXNwZWMKKyAqIEB0czoJCXBvaW50ZXIgdG8gdGhlIHRpbWVzcGVjIHRvIGJlIHNldAorICoKKyAqIFJldHVybnMgdGhlIHRpbWUgb2YgZGF5IGluIGEgdGltZXNwZWMuIFVzZWQgYnkKKyAqIGRvX2dldHRpbWVvZmRheSgpIGFuZCBnZXRfcmVhbHRpbWVfY2xvY2tfdHMoKS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIF9fZ2V0X3JlYWx0aW1lX2Nsb2NrX3RzKHN0cnVjdCB0aW1lc3BlYyAqdHMpCit7CisJdW5zaWduZWQgbG9uZyBzZXE7CisJczY0IG5zZWNzOworCisJZG8geworCQlzZXEgPSByZWFkX3NlcWJlZ2luKCZ4dGltZV9sb2NrKTsKKworCQkqdHMgPSB4dGltZTsKKwkJbnNlY3MgPSBfX2dldF9uc2VjX29mZnNldCgpOworCisJfSB3aGlsZSAocmVhZF9zZXFyZXRyeSgmeHRpbWVfbG9jaywgc2VxKSk7CisKKwl0aW1lc3BlY19hZGRfbnModHMsIG5zZWNzKTsKK30KKworLyoqCisgKiBnZXRuc3RpbWVvZmRheSAtIFJldHVybnMgdGhlIHRpbWUgb2YgZGF5IGluIGEgdGltZXNwZWMKKyAqIEB0czoJCXBvaW50ZXIgdG8gdGhlIHRpbWVzcGVjIHRvIGJlIHNldAorICoKKyAqIFJldHVybnMgdGhlIHRpbWUgb2YgZGF5IGluIGEgdGltZXNwZWMuCisgKi8KK3ZvaWQgZ2V0bnN0aW1lb2ZkYXkoc3RydWN0IHRpbWVzcGVjICp0cykKK3sKKwlfX2dldF9yZWFsdGltZV9jbG9ja190cyh0cyk7Cit9CisKK0VYUE9SVF9TWU1CT0woZ2V0bnN0aW1lb2ZkYXkpOworCisvKioKKyAqIGRvX2dldHRpbWVvZmRheSAtIFJldHVybnMgdGhlIHRpbWUgb2YgZGF5IGluIGEgdGltZXZhbAorICogQHR2OgkJcG9pbnRlciB0byB0aGUgdGltZXZhbCB0byBiZSBzZXQKKyAqCisgKiBOT1RFOiBVc2VycyBzaG91bGQgYmUgY29udmVydGVkIHRvIHVzaW5nIGdldF9yZWFsdGltZV9jbG9ja190cygpCisgKi8KK3ZvaWQgZG9fZ2V0dGltZW9mZGF5KHN0cnVjdCB0aW1ldmFsICp0dikKK3sKKwlzdHJ1Y3QgdGltZXNwZWMgbm93OworCisJX19nZXRfcmVhbHRpbWVfY2xvY2tfdHMoJm5vdyk7CisJdHYtPnR2X3NlYyA9IG5vdy50dl9zZWM7CisJdHYtPnR2X3VzZWMgPSBub3cudHZfbnNlYy8xMDAwOworfQorCitFWFBPUlRfU1lNQk9MKGRvX2dldHRpbWVvZmRheSk7CisvKioKKyAqIGRvX3NldHRpbWVvZmRheSAtIFNldHMgdGhlIHRpbWUgb2YgZGF5CisgKiBAdHY6CQlwb2ludGVyIHRvIHRoZSB0aW1lc3BlYyB2YXJpYWJsZSBjb250YWluaW5nIHRoZSBuZXcgdGltZQorICoKKyAqIFNldHMgdGhlIHRpbWUgb2YgZGF5IHRvIHRoZSBuZXcgdGltZSBhbmQgdXBkYXRlIE5UUCBhbmQgbm90aWZ5IGhydGltZXJzCisgKi8KK2ludCBkb19zZXR0aW1lb2ZkYXkoc3RydWN0IHRpbWVzcGVjICp0dikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXRpbWVfdCB3dG1fc2VjLCBzZWMgPSB0di0+dHZfc2VjOworCWxvbmcgd3RtX25zZWMsIG5zZWMgPSB0di0+dHZfbnNlYzsKKworCWlmICgodW5zaWduZWQgbG9uZyl0di0+dHZfbnNlYyA+PSBOU0VDX1BFUl9TRUMpCisJCXJldHVybiAtRUlOVkFMOworCisJd3JpdGVfc2VxbG9ja19pcnFzYXZlKCZ4dGltZV9sb2NrLCBmbGFncyk7CisKKwluc2VjIC09IF9fZ2V0X25zZWNfb2Zmc2V0KCk7CisKKwl3dG1fc2VjICA9IHdhbGxfdG9fbW9ub3RvbmljLnR2X3NlYyArICh4dGltZS50dl9zZWMgLSBzZWMpOworCXd0bV9uc2VjID0gd2FsbF90b19tb25vdG9uaWMudHZfbnNlYyArICh4dGltZS50dl9uc2VjIC0gbnNlYyk7CisKKwlzZXRfbm9ybWFsaXplZF90aW1lc3BlYygmeHRpbWUsIHNlYywgbnNlYyk7CisJc2V0X25vcm1hbGl6ZWRfdGltZXNwZWMoJndhbGxfdG9fbW9ub3RvbmljLCB3dG1fc2VjLCB3dG1fbnNlYyk7CisKKwludHBfY2xlYXIoKTsKKworCXdyaXRlX3NlcXVubG9ja19pcnFyZXN0b3JlKCZ4dGltZV9sb2NrLCBmbGFncyk7CisKKwkvKiBzaWduYWwgaHJ0aW1lcnMgYWJvdXQgdGltZSBjaGFuZ2UgKi8KKwljbG9ja193YXNfc2V0KCk7CisKKwlyZXR1cm4gMDsKK30KKworRVhQT1JUX1NZTUJPTChkb19zZXR0aW1lb2ZkYXkpOworCisvKioKKyAqIGNoYW5nZV9jbG9ja3NvdXJjZSAtIFN3YXBzIGNsb2Nrc291cmNlcyBpZiBhIG5ldyBvbmUgaXMgYXZhaWxhYmxlCisgKgorICogQWNjdW11bGF0ZXMgY3VycmVudCB0aW1lIGludGVydmFsIGFuZCBpbml0aWFsaXplcyBuZXcgY2xvY2tzb3VyY2UKKyAqLworc3RhdGljIGludCBjaGFuZ2VfY2xvY2tzb3VyY2Uodm9pZCkKK3sKKwlzdHJ1Y3QgY2xvY2tzb3VyY2UgKm5ldzsKKwljeWNsZV90IG5vdzsKKwl1NjQgbnNlYzsKKwluZXcgPSBjbG9ja3NvdXJjZV9nZXRfbmV4dCgpOworCWlmIChjbG9jayAhPSBuZXcpIHsKKwkJbm93ID0gY2xvY2tzb3VyY2VfcmVhZChuZXcpOworCQluc2VjID0gIF9fZ2V0X25zZWNfb2Zmc2V0KCk7CisJCXRpbWVzcGVjX2FkZF9ucygmeHRpbWUsIG5zZWMpOworCisJCWNsb2NrID0gbmV3OworCQljbG9jay0+Y3ljbGVfbGFzdCA9IG5vdzsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiVGltZTogJXMgY2xvY2tzb3VyY2UgaGFzIGJlZW4gaW5zdGFsbGVkLlxuIiwKKwkJCQkJY2xvY2stPm5hbWUpOworCQlyZXR1cm4gMTsKKwl9IGVsc2UgaWYgKGNsb2NrLT51cGRhdGVfY2FsbGJhY2spIHsKKwkJcmV0dXJuIGNsb2NrLT51cGRhdGVfY2FsbGJhY2soKTsKKwl9CisJcmV0dXJuIDA7Cit9CisjZWxzZQorI2RlZmluZSBjaGFuZ2VfY2xvY2tzb3VyY2UoKSAoMCkKKyNlbmRpZgorCisvKioKKyAqIHRpbWVvZmRheV9pc19jb250aW51b3VzIC0gY2hlY2sgdG8gc2VlIGlmIHRpbWVrZWVwaW5nIGlzIGZyZWUgcnVubmluZworICovCitpbnQgdGltZWtlZXBpbmdfaXNfY29udGludW91cyh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgc2VxOworCWludCByZXQ7CisKKwlkbyB7CisJCXNlcSA9IHJlYWRfc2VxYmVnaW4oJnh0aW1lX2xvY2spOworCisJCXJldCA9IGNsb2NrLT5pc19jb250aW51b3VzOworCisJfSB3aGlsZSAocmVhZF9zZXFyZXRyeSgmeHRpbWVfbG9jaywgc2VxKSk7CisKKwlyZXR1cm4gcmV0OwogfQogCiAvKgotICogVXNpbmcgYSBsb29wIGxvb2tzIGluZWZmaWNpZW50LCBidXQgInRpY2tzIiBpcwotICogdXN1YWxseSBqdXN0IG9uZSAod2Ugc2hvdWxkbid0IGJlIGxvc2luZyB0aWNrcywKLSAqIHdlJ3JlIGRvaW5nIHRoaXMgdGhpcyB3YXkgbWFpbmx5IGZvciBpbnRlcnJ1cHQKLSAqIGxhdGVuY3kgcmVhc29ucywgbm90IGJlY2F1c2Ugd2UgdGhpbmsgd2UnbGwKLSAqIGhhdmUgbG90cyBvZiBsb3N0IHRpbWVyIHRpY2tzCisgKiB0aW1la2VlcGluZ19pbml0IC0gSW5pdGlhbGl6ZXMgdGhlIGNsb2Nrc291cmNlIGFuZCBjb21tb24gdGltZWtlZXBpbmcgdmFsdWVzCiAgKi8KLXN0YXRpYyB2b2lkIHVwZGF0ZV93YWxsX3RpbWUodW5zaWduZWQgbG9uZyB0aWNrcykKK3ZvaWQgX19pbml0IHRpbWVrZWVwaW5nX2luaXQodm9pZCkKIHsKLQlkbyB7Ci0JCXRpY2tzLS07Ci0JCXVwZGF0ZV93YWxsX3RpbWVfb25lX3RpY2soKTsKLQkJaWYgKHh0aW1lLnR2X25zZWMgPj0gMTAwMDAwMDAwMCkgewotCQkJeHRpbWUudHZfbnNlYyAtPSAxMDAwMDAwMDAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwl3cml0ZV9zZXFsb2NrX2lycXNhdmUoJnh0aW1lX2xvY2ssIGZsYWdzKTsKKwljbG9jayA9IGNsb2Nrc291cmNlX2dldF9uZXh0KCk7CisJY2xvY2tzb3VyY2VfY2FsY3VsYXRlX2ludGVydmFsKGNsb2NrLCB0aWNrX25zZWMpOworCWNsb2NrLT5jeWNsZV9sYXN0ID0gY2xvY2tzb3VyY2VfcmVhZChjbG9jayk7CisJbnRwX2NsZWFyKCk7CisJd3JpdGVfc2VxdW5sb2NrX2lycXJlc3RvcmUoJnh0aW1lX2xvY2ssIGZsYWdzKTsKK30KKworCisvKgorICogdGltZWtlZXBpbmdfcmVzdW1lIC0gUmVzdW1lcyB0aGUgZ2VuZXJpYyB0aW1la2VlcGluZyBzdWJzeXN0ZW0uCisgKiBAZGV2Ogl1bnVzZWQKKyAqCisgKiBUaGlzIGlzIGZvciB0aGUgZ2VuZXJpYyBjbG9ja3NvdXJjZSB0aW1la2VlcGluZy4KKyAqIHh0aW1lL3dhbGxfdG9fbW9ub3RvbmljL2ppZmZpZXMvd2FsbF9qaWZmaWVzL2V0YyBhcmUKKyAqIHN0aWxsIG1hbmFnZWQgYnkgYXJjaCBzcGVjaWZpYyBzdXNwZW5kL3Jlc3VtZSBjb2RlLgorICovCitzdGF0aWMgaW50IHRpbWVrZWVwaW5nX3Jlc3VtZShzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwl3cml0ZV9zZXFsb2NrX2lycXNhdmUoJnh0aW1lX2xvY2ssIGZsYWdzKTsKKwkvKiByZXN0YXJ0IHRoZSBsYXN0IGN5Y2xlIHZhbHVlICovCisJY2xvY2stPmN5Y2xlX2xhc3QgPSBjbG9ja3NvdXJjZV9yZWFkKGNsb2NrKTsKKwl3cml0ZV9zZXF1bmxvY2tfaXJxcmVzdG9yZSgmeHRpbWVfbG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCisvKiBzeXNmcyByZXN1bWUvc3VzcGVuZCBiaXRzIGZvciB0aW1la2VlcGluZyAqLworc3RhdGljIHN0cnVjdCBzeXNkZXZfY2xhc3MgdGltZWtlZXBpbmdfc3lzY2xhc3MgPSB7CisJLnJlc3VtZQkJPSB0aW1la2VlcGluZ19yZXN1bWUsCisJc2V0X2tzZXRfbmFtZSgidGltZWtlZXBpbmciKSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzX2RldmljZSBkZXZpY2VfdGltZXIgPSB7CisJLmlkCQk9IDAsCisJLmNscwkJPSAmdGltZWtlZXBpbmdfc3lzY2xhc3MsCit9OworCitzdGF0aWMgaW50IF9faW5pdCB0aW1la2VlcGluZ19pbml0X2RldmljZSh2b2lkKQoreworCWludCBlcnJvciA9IHN5c2Rldl9jbGFzc19yZWdpc3RlcigmdGltZWtlZXBpbmdfc3lzY2xhc3MpOworCWlmICghZXJyb3IpCisJCWVycm9yID0gc3lzZGV2X3JlZ2lzdGVyKCZkZXZpY2VfdGltZXIpOworCXJldHVybiBlcnJvcjsKK30KKworZGV2aWNlX2luaXRjYWxsKHRpbWVrZWVwaW5nX2luaXRfZGV2aWNlKTsKKworLyoKKyAqIElmIHRoZSBlcnJvciBpcyBhbHJlYWR5IGxhcmdlciwgd2UgbG9vayBhaGVhZCBhbm90aGVyIHRpY2ssCisgKiB0byBjb21wZW5zYXRlIGZvciBsYXRlIG9yIGxvc3QgYWRqdXN0bWVudHMuCisgKi8KK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgaW50IGNsb2Nrc291cmNlX2JpZ2FkanVzdChpbnQgc2lnbiwgczY0IGVycm9yLCBzNjQgKmludGVydmFsLCBzNjQgKm9mZnNldCkKK3sKKwlpbnQgYWRqOworCisJLyoKKwkgKiBBcyBzb29uIGFzIHRoZSBtYWNoaW5lIGlzIHN5bmNocm9uaXplZCB0byB0aGUgZXh0ZXJuYWwgdGltZQorCSAqIHNvdXJjZSB0aGlzIHNob3VsZCBiZSB0aGUgY29tbW9uIGNhc2UuCisJICovCisJZXJyb3IgPj49IDI7CisJaWYgKGxpa2VseShzaWduID4gMCA/IGVycm9yIDw9ICppbnRlcnZhbCA6IGVycm9yID49ICppbnRlcnZhbCkpCisJCXJldHVybiBzaWduOworCisJLyoKKwkgKiBBbiBleHRyYSBsb29rIGFoZWFkIGRhbXBlbnMgdGhlIGVmZmVjdCBvZiB0aGUgY3VycmVudCBlcnJvciwKKwkgKiB3aGljaCBjYW4gZ3JvdyBxdWl0ZSBsYXJnZSB3aXRoIGNvbnRpbm91c2x5IGxhdGUgdXBkYXRlcywgYXMKKwkgKiBpdCB3b3VsZCBkb21pbmF0ZSB0aGUgYWRqdXN0bWVudCB2YWx1ZSBhbmQgY2FuIGxlYWQgdG8KKwkgKiBvc2NpbGxhdGlvbi4KKwkgKi8KKwllcnJvciArPSBjdXJyZW50X3RpY2tfbGVuZ3RoKCkgPj4gKFRJQ0tfTEVOR1RIX1NISUZUIC0gY2xvY2stPnNoaWZ0ICsgMSk7CisJZXJyb3IgLT0gY2xvY2stPnh0aW1lX2ludGVydmFsID4+IDE7CisKKwlhZGogPSAwOworCXdoaWxlICgxKSB7CisJCWVycm9yID4+PSAxOworCQlpZiAoc2lnbiA+IDAgPyBlcnJvciA8PSAqaW50ZXJ2YWwgOiBlcnJvciA+PSAqaW50ZXJ2YWwpCisJCQlicmVhazsKKwkJYWRqKys7CisJfQorCisJLyoKKwkgKiBBZGQgdGhlIGN1cnJlbnQgYWRqdXN0bWVudHMgdG8gdGhlIGVycm9yIGFuZCB0YWtlIHRoZSBvZmZzZXQKKwkgKiBpbnRvIGFjY291bnQsIHRoZSBsYXR0ZXIgY2FuIGNhdXNlIHRoZSBlcnJvciB0byBiZSBoYXJkbHkKKwkgKiByZWR1Y2VkIGF0IHRoZSBuZXh0IHRpY2suIENoZWNrIHRoZSBlcnJvciBhZ2FpbiBpZiB0aGVyZSdzCisJICogcm9vbSBmb3IgYW5vdGhlciBhZGp1c3RtZW50LCB0aHVzIGZ1cnRoZXIgcmVkdWNpbmcgdGhlIGVycm9yCisJICogd2hpY2ggb3RoZXJ3aXNlIGhhZCB0byBiZSBjb3JyZWN0ZWQgYXQgdGhlIG5leHQgdXBkYXRlLgorCSAqLworCWVycm9yID0gKGVycm9yIDw8IDEpIC0gKmludGVydmFsICsgKm9mZnNldDsKKwlpZiAoc2lnbiA+IDAgPyBlcnJvciA+ICppbnRlcnZhbCA6IGVycm9yIDwgKmludGVydmFsKQorCQlhZGorKzsKKworCSppbnRlcnZhbCA8PD0gYWRqOworCSpvZmZzZXQgPDw9IGFkajsKKwlyZXR1cm4gc2lnbiA8PCBhZGo7Cit9CisKKy8qCisgKiBBZGp1c3QgdGhlIG11bHRpcGxpZXIgdG8gcmVkdWNlIHRoZSBlcnJvciB2YWx1ZSwKKyAqIHRoaXMgaXMgb3B0aW1pemVkIGZvciB0aGUgbW9zdCBjb21tb24gYWRqdXN0bWVudHMgb2YgLTEsMCwxLAorICogZm9yIG90aGVyIHZhbHVlcyB3ZSBjYW4gZG8gYSBiaXQgbW9yZSB3b3JrLgorICovCitzdGF0aWMgdm9pZCBjbG9ja3NvdXJjZV9hZGp1c3Qoc3RydWN0IGNsb2Nrc291cmNlICpjbG9jaywgczY0IG9mZnNldCkKK3sKKwlzNjQgZXJyb3IsIGludGVydmFsID0gY2xvY2stPmN5Y2xlX2ludGVydmFsOworCWludCBhZGo7CisKKwllcnJvciA9IGNsb2NrLT5lcnJvciA+PiAoVElDS19MRU5HVEhfU0hJRlQgLSBjbG9jay0+c2hpZnQgLSAxKTsKKwlpZiAoZXJyb3IgPiBpbnRlcnZhbCkgeworCQlhZGogPSBjbG9ja3NvdXJjZV9iaWdhZGp1c3QoMSwgZXJyb3IsICZpbnRlcnZhbCwgJm9mZnNldCk7CisJfSBlbHNlIGlmIChlcnJvciA8IC1pbnRlcnZhbCkgeworCQlpbnRlcnZhbCA9IC1pbnRlcnZhbDsKKwkJb2Zmc2V0ID0gLW9mZnNldDsKKwkJYWRqID0gY2xvY2tzb3VyY2VfYmlnYWRqdXN0KC0xLCBlcnJvciwgJmludGVydmFsLCAmb2Zmc2V0KTsKKwl9IGVsc2UKKwkJcmV0dXJuOworCisJY2xvY2stPm11bHQgKz0gYWRqOworCWNsb2NrLT54dGltZV9pbnRlcnZhbCArPSBpbnRlcnZhbDsKKwljbG9jay0+eHRpbWVfbnNlYyAtPSBvZmZzZXQ7CisJY2xvY2stPmVycm9yIC09IChpbnRlcnZhbCAtIG9mZnNldCkgPDwgKFRJQ0tfTEVOR1RIX1NISUZUIC0gY2xvY2stPnNoaWZ0KTsKK30KKworLyoKKyAqIHVwZGF0ZV93YWxsX3RpbWUgLSBVc2VzIHRoZSBjdXJyZW50IGNsb2Nrc291cmNlIHRvIGluY3JlbWVudCB0aGUgd2FsbCB0aW1lCisgKgorICogQ2FsbGVkIGZyb20gdGhlIHRpbWVyIGludGVycnVwdCwgbXVzdCBob2xkIGEgd3JpdGUgb24geHRpbWVfbG9jay4KKyAqLworc3RhdGljIHZvaWQgdXBkYXRlX3dhbGxfdGltZSh2b2lkKQoreworCWN5Y2xlX3Qgb2Zmc2V0OworCisJY2xvY2stPnh0aW1lX25zZWMgKz0gKHM2NCl4dGltZS50dl9uc2VjIDw8IGNsb2NrLT5zaGlmdDsKKworI2lmZGVmIENPTkZJR19HRU5FUklDX1RJTUUKKwlvZmZzZXQgPSAoY2xvY2tzb3VyY2VfcmVhZChjbG9jaykgLSBjbG9jay0+Y3ljbGVfbGFzdCkgJiBjbG9jay0+bWFzazsKKyNlbHNlCisJb2Zmc2V0ID0gY2xvY2stPmN5Y2xlX2ludGVydmFsOworI2VuZGlmCisKKwkvKiBub3JtYWxseSB0aGlzIGxvb3Agd2lsbCBydW4ganVzdCBvbmNlLCBob3dldmVyIGluIHRoZQorCSAqIGNhc2Ugb2YgbG9zdCBvciBsYXRlIHRpY2tzLCBpdCB3aWxsIGFjY3VtdWxhdGUgY29ycmVjdGx5LgorCSAqLworCXdoaWxlIChvZmZzZXQgPj0gY2xvY2stPmN5Y2xlX2ludGVydmFsKSB7CisJCS8qIGFjY3VtdWxhdGUgb25lIGludGVydmFsICovCisJCWNsb2NrLT54dGltZV9uc2VjICs9IGNsb2NrLT54dGltZV9pbnRlcnZhbDsKKwkJY2xvY2stPmN5Y2xlX2xhc3QgKz0gY2xvY2stPmN5Y2xlX2ludGVydmFsOworCQlvZmZzZXQgLT0gY2xvY2stPmN5Y2xlX2ludGVydmFsOworCisJCWlmIChjbG9jay0+eHRpbWVfbnNlYyA+PSAodTY0KU5TRUNfUEVSX1NFQyA8PCBjbG9jay0+c2hpZnQpIHsKKwkJCWNsb2NrLT54dGltZV9uc2VjIC09ICh1NjQpTlNFQ19QRVJfU0VDIDw8IGNsb2NrLT5zaGlmdDsKIAkJCXh0aW1lLnR2X3NlYysrOwogCQkJc2Vjb25kX292ZXJmbG93KCk7CiAJCX0KLQl9IHdoaWxlICh0aWNrcyk7CisKKwkJLyogaW50ZXJwb2xhdG9yIGJpdHMgKi8KKwkJdGltZV9pbnRlcnBvbGF0b3JfdXBkYXRlKGNsb2NrLT54dGltZV9pbnRlcnZhbAorCQkJCQkJPj4gY2xvY2stPnNoaWZ0KTsKKwkJLyogaW5jcmVtZW50IHRoZSBOVFAgc3RhdGUgbWFjaGluZSAqLworCQl1cGRhdGVfbnRwX29uZV90aWNrKCk7CisKKwkJLyogYWNjdW11bGF0ZSBlcnJvciBiZXR3ZWVuIE5UUCBhbmQgY2xvY2sgaW50ZXJ2YWwgKi8KKwkJY2xvY2stPmVycm9yICs9IGN1cnJlbnRfdGlja19sZW5ndGgoKTsKKwkJY2xvY2stPmVycm9yIC09IGNsb2NrLT54dGltZV9pbnRlcnZhbCA8PCAoVElDS19MRU5HVEhfU0hJRlQgLSBjbG9jay0+c2hpZnQpOworCX0KKworCS8qIGNvcnJlY3QgdGhlIGNsb2NrIHdoZW4gTlRQIGVycm9yIGlzIHRvbyBiaWcgKi8KKwljbG9ja3NvdXJjZV9hZGp1c3QoY2xvY2ssIG9mZnNldCk7CisKKwkvKiBzdG9yZSBmdWxsIG5hbm9zZWNvbmRzIGludG8geHRpbWUgKi8KKwl4dGltZS50dl9uc2VjID0gY2xvY2stPnh0aW1lX25zZWMgPj4gY2xvY2stPnNoaWZ0OworCWNsb2NrLT54dGltZV9uc2VjIC09IChzNjQpeHRpbWUudHZfbnNlYyA8PCBjbG9jay0+c2hpZnQ7CisKKwkvKiBjaGVjayB0byBzZWUgaWYgdGhlcmUgaXMgYSBuZXcgY2xvY2tzb3VyY2UgdG8gdXNlICovCisJaWYgKGNoYW5nZV9jbG9ja3NvdXJjZSgpKSB7CisJCWNsb2NrLT5lcnJvciA9IDA7CisJCWNsb2NrLT54dGltZV9uc2VjID0gMDsKKwkJY2xvY2tzb3VyY2VfY2FsY3VsYXRlX2ludGVydmFsKGNsb2NrLCB0aWNrX25zZWMpOworCX0KIH0KIAogLyoKQEAgLTkxNSwxMCArMTI0Myw4IEBACiAJdW5zaWduZWQgbG9uZyB0aWNrczsKIAogCXRpY2tzID0gamlmZmllcyAtIHdhbGxfamlmZmllczsKLQlpZiAodGlja3MpIHsKLQkJd2FsbF9qaWZmaWVzICs9IHRpY2tzOwotCQl1cGRhdGVfd2FsbF90aW1lKHRpY2tzKTsKLQl9CisJd2FsbF9qaWZmaWVzICs9IHRpY2tzOworCXVwZGF0ZV93YWxsX3RpbWUoKTsKIAljYWxjX2xvYWQodGlja3MpOwogfQogICAKZGlmZiAtLWdpdCBhL2tlcm5lbC91bndpbmQuYyBiL2tlcm5lbC91bndpbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjljODA0Ci0tLSAvZGV2L251bGwKKysrIGIva2VybmVsL3Vud2luZC5jCkBAIC0wLDAgKzEsOTE4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDYgTm92ZWxsLCBJbmMuCisgKglKYW4gQmV1bGljaCA8amJldWxpY2hAbm92ZWxsLmNvbT4KKyAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHUEwuCisgKgorICogQSBzaW1wbGUgQVBJIGZvciB1bndpbmRpbmcga2VybmVsIHN0YWNrcy4gIFRoaXMgaXMgdXNlZCBmb3IKKyAqIGRlYnVnZ2luZyBhbmQgZXJyb3IgcmVwb3J0aW5nIHB1cnBvc2VzLiAgVGhlIGtlcm5lbCBkb2Vzbid0IG5lZWQKKyAqIGZ1bGwtYmxvd24gc3RhY2sgdW53aW5kaW5nIHdpdGggYWxsIHRoZSBiZWxscyBhbmQgd2hpc3RsZXMsIHNvIHRoZXJlCisgKiBpcyBub3QgbXVjaCBwb2ludCBpbiBpbXBsZW1lbnRpbmcgdGhlIGZ1bGwgRHdhcmYyIHVud2luZCBBUEkuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3Vud2luZC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc3RvcF9tYWNoaW5lLmg+CisjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CisKK2V4dGVybiBjaGFyIF9fc3RhcnRfdW53aW5kW10sIF9fZW5kX3Vud2luZFtdOworCisjZGVmaW5lIE1BWF9TVEFDS19ERVBUSCA4CisKKyNkZWZpbmUgRVhUUkFfSU5GTyhmKSB7IFwKKwkJQlVJTERfQlVHX09OX1pFUk8ob2Zmc2V0b2Yoc3RydWN0IHVud2luZF9mcmFtZV9pbmZvLCBmKSBcCisJCSAgICAgICAgICAgICAgICAgICUgRklFTERfU0laRU9GKHN0cnVjdCB1bndpbmRfZnJhbWVfaW5mbywgZikpIFwKKwkJKyBvZmZzZXRvZihzdHJ1Y3QgdW53aW5kX2ZyYW1lX2luZm8sIGYpIFwKKwkJICAvIEZJRUxEX1NJWkVPRihzdHJ1Y3QgdW53aW5kX2ZyYW1lX2luZm8sIGYpLCBcCisJCUZJRUxEX1NJWkVPRihzdHJ1Y3QgdW53aW5kX2ZyYW1lX2luZm8sIGYpIFwKKwl9CisjZGVmaW5lIFBUUkVHU19JTkZPKGYpIEVYVFJBX0lORk8ocmVncy5mKQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKwl1bnNpZ25lZCBvZmZzOkJJVFNfUEVSX0xPTkcgLyAyOworCXVuc2lnbmVkIHdpZHRoOkJJVFNfUEVSX0xPTkcgLyAyOworfSByZWdfaW5mb1tdID0geworCVVOV19SRUdJU1RFUl9JTkZPCit9OworCisjdW5kZWYgUFRSRUdTX0lORk8KKyN1bmRlZiBFWFRSQV9JTkZPCisKKyNpZm5kZWYgUkVHX0lOVkFMSUQKKyNkZWZpbmUgUkVHX0lOVkFMSUQocikgKHJlZ19pbmZvW3JdLndpZHRoID09IDApCisjZW5kaWYKKworI2RlZmluZSBEV19DRkFfbm9wICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIERXX0NGQV9zZXRfbG9jICAgICAgICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgRFdfQ0ZBX2FkdmFuY2VfbG9jMSAgICAgICAgICAgICAgICAgMHgwMgorI2RlZmluZSBEV19DRkFfYWR2YW5jZV9sb2MyICAgICAgICAgICAgICAgICAweDAzCisjZGVmaW5lIERXX0NGQV9hZHZhbmNlX2xvYzQgICAgICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgRFdfQ0ZBX29mZnNldF9leHRlbmRlZCAgICAgICAgICAgICAgMHgwNQorI2RlZmluZSBEV19DRkFfcmVzdG9yZV9leHRlbmRlZCAgICAgICAgICAgICAweDA2CisjZGVmaW5lIERXX0NGQV91bmRlZmluZWQgICAgICAgICAgICAgICAgICAgIDB4MDcKKyNkZWZpbmUgRFdfQ0ZBX3NhbWVfdmFsdWUgICAgICAgICAgICAgICAgICAgMHgwOAorI2RlZmluZSBEV19DRkFfcmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAweDA5CisjZGVmaW5lIERXX0NGQV9yZW1lbWJlcl9zdGF0ZSAgICAgICAgICAgICAgIDB4MGEKKyNkZWZpbmUgRFdfQ0ZBX3Jlc3RvcmVfc3RhdGUgICAgICAgICAgICAgICAgMHgwYgorI2RlZmluZSBEV19DRkFfZGVmX2NmYSAgICAgICAgICAgICAgICAgICAgICAweDBjCisjZGVmaW5lIERXX0NGQV9kZWZfY2ZhX3JlZ2lzdGVyICAgICAgICAgICAgIDB4MGQKKyNkZWZpbmUgRFdfQ0ZBX2RlZl9jZmFfb2Zmc2V0ICAgICAgICAgICAgICAgMHgwZQorI2RlZmluZSBEV19DRkFfZGVmX2NmYV9leHByZXNzaW9uICAgICAgICAgICAweDBmCisjZGVmaW5lIERXX0NGQV9leHByZXNzaW9uICAgICAgICAgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgRFdfQ0ZBX29mZnNldF9leHRlbmRlZF9zZiAgICAgICAgICAgMHgxMQorI2RlZmluZSBEV19DRkFfZGVmX2NmYV9zZiAgICAgICAgICAgICAgICAgICAweDEyCisjZGVmaW5lIERXX0NGQV9kZWZfY2ZhX29mZnNldF9zZiAgICAgICAgICAgIDB4MTMKKyNkZWZpbmUgRFdfQ0ZBX3ZhbF9vZmZzZXQgICAgICAgICAgICAgICAgICAgMHgxNAorI2RlZmluZSBEV19DRkFfdmFsX29mZnNldF9zZiAgICAgICAgICAgICAgICAweDE1CisjZGVmaW5lIERXX0NGQV92YWxfZXhwcmVzc2lvbiAgICAgICAgICAgICAgIDB4MTYKKyNkZWZpbmUgRFdfQ0ZBX2xvX3VzZXIgICAgICAgICAgICAgICAgICAgICAgMHgxYworI2RlZmluZSBEV19DRkFfR05VX3dpbmRvd19zYXZlICAgICAgICAgICAgICAweDJkCisjZGVmaW5lIERXX0NGQV9HTlVfYXJnc19zaXplICAgICAgICAgICAgICAgIDB4MmUKKyNkZWZpbmUgRFdfQ0ZBX0dOVV9uZWdhdGl2ZV9vZmZzZXRfZXh0ZW5kZWQgMHgyZgorI2RlZmluZSBEV19DRkFfaGlfdXNlciAgICAgICAgICAgICAgICAgICAgICAweDNmCisKKyNkZWZpbmUgRFdfRUhfUEVfRk9STSAgICAgMHgwNworI2RlZmluZSBEV19FSF9QRV9uYXRpdmUgICAweDAwCisjZGVmaW5lIERXX0VIX1BFX2xlYjEyOCAgIDB4MDEKKyNkZWZpbmUgRFdfRUhfUEVfZGF0YTIgICAgMHgwMgorI2RlZmluZSBEV19FSF9QRV9kYXRhNCAgICAweDAzCisjZGVmaW5lIERXX0VIX1BFX2RhdGE4ICAgIDB4MDQKKyNkZWZpbmUgRFdfRUhfUEVfc2lnbmVkICAgMHgwOAorI2RlZmluZSBEV19FSF9QRV9BREpVU1QgICAweDcwCisjZGVmaW5lIERXX0VIX1BFX2FicyAgICAgIDB4MDAKKyNkZWZpbmUgRFdfRUhfUEVfcGNyZWwgICAgMHgxMAorI2RlZmluZSBEV19FSF9QRV90ZXh0cmVsICAweDIwCisjZGVmaW5lIERXX0VIX1BFX2RhdGFyZWwgIDB4MzAKKyNkZWZpbmUgRFdfRUhfUEVfZnVuY3JlbCAgMHg0MAorI2RlZmluZSBEV19FSF9QRV9hbGlnbmVkICAweDUwCisjZGVmaW5lIERXX0VIX1BFX2luZGlyZWN0IDB4ODAKKyNkZWZpbmUgRFdfRUhfUEVfb21pdCAgICAgMHhmZgorCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgdWxlYjEyOF90OwordHlwZWRlZiAgIHNpZ25lZCBsb25nIHNsZWIxMjhfdDsKKworc3RhdGljIHN0cnVjdCB1bndpbmRfdGFibGUgeworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGxvbmcgcGM7CisJCXVuc2lnbmVkIGxvbmcgcmFuZ2U7CisJfSBjb3JlLCBpbml0OworCWNvbnN0IHZvaWQgKmFkZHJlc3M7CisJdW5zaWduZWQgbG9uZyBzaXplOworCXN0cnVjdCB1bndpbmRfdGFibGUgKmxpbms7CisJY29uc3QgY2hhciAqbmFtZTsKK30gcm9vdF90YWJsZSwgKmxhc3RfdGFibGU7CisKK3N0cnVjdCB1bndpbmRfaXRlbSB7CisJZW51bSBpdGVtX2xvY2F0aW9uIHsKKwkJTm93aGVyZSwKKwkJTWVtb3J5LAorCQlSZWdpc3RlciwKKwkJVmFsdWUKKwl9IHdoZXJlOworCXVsZWIxMjhfdCB2YWx1ZTsKK307CisKK3N0cnVjdCB1bndpbmRfc3RhdGUgeworCXVsZWIxMjhfdCBsb2MsIG9yZzsKKwljb25zdCB1OCAqY2llU3RhcnQsICpjaWVFbmQ7CisJdWxlYjEyOF90IGNvZGVBbGlnbjsKKwlzbGViMTI4X3QgZGF0YUFsaWduOworCXN0cnVjdCBjZmEgeworCQl1bGViMTI4X3QgcmVnLCBvZmZzOworCX0gY2ZhOworCXN0cnVjdCB1bndpbmRfaXRlbSByZWdzW0FSUkFZX1NJWkUocmVnX2luZm8pXTsKKwl1bnNpZ25lZCBzdGFja0RlcHRoOjg7CisJdW5zaWduZWQgdmVyc2lvbjo4OworCWNvbnN0IHU4ICpsYWJlbDsKKwljb25zdCB1OCAqc3RhY2tbTUFYX1NUQUNLX0RFUFRIXTsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2ZhIGJhZENGQSA9IHsgQVJSQVlfU0laRShyZWdfaW5mbyksIDEgfTsKKworc3RhdGljIHN0cnVjdCB1bndpbmRfdGFibGUgKmZpbmRfdGFibGUodW5zaWduZWQgbG9uZyBwYykKK3sKKwlzdHJ1Y3QgdW53aW5kX3RhYmxlICp0YWJsZTsKKworCWZvciAodGFibGUgPSAmcm9vdF90YWJsZTsgdGFibGU7IHRhYmxlID0gdGFibGUtPmxpbmspCisJCWlmICgocGMgPj0gdGFibGUtPmNvcmUucGMKKwkJICAgICAmJiBwYyA8IHRhYmxlLT5jb3JlLnBjICsgdGFibGUtPmNvcmUucmFuZ2UpCisJCSAgICB8fCAocGMgPj0gdGFibGUtPmluaXQucGMKKwkJICAgICAgICAmJiBwYyA8IHRhYmxlLT5pbml0LnBjICsgdGFibGUtPmluaXQucmFuZ2UpKQorCQkJYnJlYWs7CisKKwlyZXR1cm4gdGFibGU7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfdW53aW5kX3RhYmxlKHN0cnVjdCB1bndpbmRfdGFibGUgKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmNvcmVfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGNvcmVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmluaXRfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGluaXRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnRhYmxlX3N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyB0YWJsZV9zaXplKQoreworCXRhYmxlLT5jb3JlLnBjID0gKHVuc2lnbmVkIGxvbmcpY29yZV9zdGFydDsKKwl0YWJsZS0+Y29yZS5yYW5nZSA9IGNvcmVfc2l6ZTsKKwl0YWJsZS0+aW5pdC5wYyA9ICh1bnNpZ25lZCBsb25nKWluaXRfc3RhcnQ7CisJdGFibGUtPmluaXQucmFuZ2UgPSBpbml0X3NpemU7CisJdGFibGUtPmFkZHJlc3MgPSB0YWJsZV9zdGFydDsKKwl0YWJsZS0+c2l6ZSA9IHRhYmxlX3NpemU7CisJdGFibGUtPmxpbmsgPSBOVUxMOworCXRhYmxlLT5uYW1lID0gbmFtZTsKK30KKwordm9pZCBfX2luaXQgdW53aW5kX2luaXQodm9pZCkKK3sKKwlpbml0X3Vud2luZF90YWJsZSgmcm9vdF90YWJsZSwgImtlcm5lbCIsCisJICAgICAgICAgICAgICAgICAgX3RleHQsIF9lbmQgLSBfdGV4dCwKKwkgICAgICAgICAgICAgICAgICBOVUxMLCAwLAorCSAgICAgICAgICAgICAgICAgIF9fc3RhcnRfdW53aW5kLCBfX2VuZF91bndpbmQgLSBfX3N0YXJ0X3Vud2luZCk7Cit9CisKKyNpZmRlZiBDT05GSUdfTU9EVUxFUworCisvKiBNdXN0IGJlIGNhbGxlZCB3aXRoIG1vZHVsZV9tdXRleCBoZWxkLiAqLwordm9pZCAqdW53aW5kX2FkZF90YWJsZShzdHJ1Y3QgbW9kdWxlICptb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnRhYmxlX3N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHRhYmxlX3NpemUpCit7CisJc3RydWN0IHVud2luZF90YWJsZSAqdGFibGU7CisKKwlpZiAodGFibGVfc2l6ZSA8PSAwKQorCQlyZXR1cm4gTlVMTDsKKworCXRhYmxlID0ga21hbGxvYyhzaXplb2YoKnRhYmxlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF0YWJsZSkKKwkJcmV0dXJuIE5VTEw7CisKKwlpbml0X3Vud2luZF90YWJsZSh0YWJsZSwgbW9kdWxlLT5uYW1lLAorCSAgICAgICAgICAgICAgICAgIG1vZHVsZS0+bW9kdWxlX2NvcmUsIG1vZHVsZS0+Y29yZV9zaXplLAorCSAgICAgICAgICAgICAgICAgIG1vZHVsZS0+bW9kdWxlX2luaXQsIG1vZHVsZS0+aW5pdF9zaXplLAorCSAgICAgICAgICAgICAgICAgIHRhYmxlX3N0YXJ0LCB0YWJsZV9zaXplKTsKKworCWlmIChsYXN0X3RhYmxlKQorCQlsYXN0X3RhYmxlLT5saW5rID0gdGFibGU7CisJZWxzZQorCQlyb290X3RhYmxlLmxpbmsgPSB0YWJsZTsKKwlsYXN0X3RhYmxlID0gdGFibGU7CisKKwlyZXR1cm4gdGFibGU7Cit9CisKK3N0cnVjdCB1bmxpbmtfdGFibGVfaW5mbworeworCXN0cnVjdCB1bndpbmRfdGFibGUgKnRhYmxlOworCWludCBpbml0X29ubHk7Cit9OworCitzdGF0aWMgaW50IHVubGlua190YWJsZSh2b2lkICphcmcpCit7CisJc3RydWN0IHVubGlua190YWJsZV9pbmZvICppbmZvID0gYXJnOworCXN0cnVjdCB1bndpbmRfdGFibGUgKnRhYmxlID0gaW5mby0+dGFibGUsICpwcmV2OworCisJZm9yIChwcmV2ID0gJnJvb3RfdGFibGU7IHByZXYtPmxpbmsgJiYgcHJldi0+bGluayAhPSB0YWJsZTsgcHJldiA9IHByZXYtPmxpbmspCisJCTsKKworCWlmIChwcmV2LT5saW5rKSB7CisJCWlmIChpbmZvLT5pbml0X29ubHkpIHsKKwkJCXRhYmxlLT5pbml0LnBjID0gMDsKKwkJCXRhYmxlLT5pbml0LnJhbmdlID0gMDsKKwkJCWluZm8tPnRhYmxlID0gTlVMTDsKKwkJfSBlbHNlIHsKKwkJCXByZXYtPmxpbmsgPSB0YWJsZS0+bGluazsKKwkJCWlmICghcHJldi0+bGluaykKKwkJCQlsYXN0X3RhYmxlID0gcHJldjsKKwkJfQorCX0gZWxzZQorCQlpbmZvLT50YWJsZSA9IE5VTEw7CisKKwlyZXR1cm4gMDsKK30KKworLyogTXVzdCBiZSBjYWxsZWQgd2l0aCBtb2R1bGVfbXV0ZXggaGVsZC4gKi8KK3ZvaWQgdW53aW5kX3JlbW92ZV90YWJsZSh2b2lkICpoYW5kbGUsIGludCBpbml0X29ubHkpCit7CisJc3RydWN0IHVud2luZF90YWJsZSAqdGFibGUgPSBoYW5kbGU7CisJc3RydWN0IHVubGlua190YWJsZV9pbmZvIGluZm87CisKKwlpZiAoIXRhYmxlIHx8IHRhYmxlID09ICZyb290X3RhYmxlKQorCQlyZXR1cm47CisKKwlpZiAoaW5pdF9vbmx5ICYmIHRhYmxlID09IGxhc3RfdGFibGUpIHsKKwkJdGFibGUtPmluaXQucGMgPSAwOworCQl0YWJsZS0+aW5pdC5yYW5nZSA9IDA7CisJCXJldHVybjsKKwl9CisKKwlpbmZvLnRhYmxlID0gdGFibGU7CisJaW5mby5pbml0X29ubHkgPSBpbml0X29ubHk7CisJc3RvcF9tYWNoaW5lX3J1bih1bmxpbmtfdGFibGUsICZpbmZvLCBOUl9DUFVTKTsKKworCWlmIChpbmZvLnRhYmxlKQorCQlrZnJlZSh0YWJsZSk7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfTU9EVUxFUyAqLworCitzdGF0aWMgdWxlYjEyOF90IGdldF91bGViMTI4KGNvbnN0IHU4ICoqcGN1ciwgY29uc3QgdTggKmVuZCkKK3sKKwljb25zdCB1OCAqY3VyID0gKnBjdXI7CisJdWxlYjEyOF90IHZhbHVlOworCXVuc2lnbmVkIHNoaWZ0OworCisJZm9yIChzaGlmdCA9IDAsIHZhbHVlID0gMDsgY3VyIDwgZW5kOyBzaGlmdCArPSA3KSB7CisJCWlmIChzaGlmdCArIDcgPiA4ICogc2l6ZW9mKHZhbHVlKQorCQkgICAgJiYgKCpjdXIgJiAweDdmVSkgPj0gKDFVIDw8ICg4ICogc2l6ZW9mKHZhbHVlKSAtIHNoaWZ0KSkpIHsKKwkJCWN1ciA9IGVuZCArIDE7CisJCQlicmVhazsKKwkJfQorCQl2YWx1ZSB8PSAodWxlYjEyOF90KSgqY3VyICYgMHg3ZikgPDwgc2hpZnQ7CisJCWlmICghKCpjdXIrKyAmIDB4ODApKQorCQkJYnJlYWs7CisJfQorCSpwY3VyID0gY3VyOworCisJcmV0dXJuIHZhbHVlOworfQorCitzdGF0aWMgc2xlYjEyOF90IGdldF9zbGViMTI4KGNvbnN0IHU4ICoqcGN1ciwgY29uc3QgdTggKmVuZCkKK3sKKwljb25zdCB1OCAqY3VyID0gKnBjdXI7CisJc2xlYjEyOF90IHZhbHVlOworCXVuc2lnbmVkIHNoaWZ0OworCisJZm9yIChzaGlmdCA9IDAsIHZhbHVlID0gMDsgY3VyIDwgZW5kOyBzaGlmdCArPSA3KSB7CisJCWlmIChzaGlmdCArIDcgPiA4ICogc2l6ZW9mKHZhbHVlKQorCQkgICAgJiYgKCpjdXIgJiAweDdmVSkgPj0gKDFVIDw8ICg4ICogc2l6ZW9mKHZhbHVlKSAtIHNoaWZ0KSkpIHsKKwkJCWN1ciA9IGVuZCArIDE7CisJCQlicmVhazsKKwkJfQorCQl2YWx1ZSB8PSAoc2xlYjEyOF90KSgqY3VyICYgMHg3ZikgPDwgc2hpZnQ7CisJCWlmICghKCpjdXIgJiAweDgwKSkgeworCQkJdmFsdWUgfD0gLSgqY3VyKysgJiAweDQwKSA8PCBzaGlmdDsKKwkJCWJyZWFrOworCQl9CisJfQorCSpwY3VyID0gY3VyOworCisJcmV0dXJuIHZhbHVlOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyByZWFkX3BvaW50ZXIoY29uc3QgdTggKipwTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduZWQgcHRyVHlwZSkKK3sKKwl1bnNpZ25lZCBsb25nIHZhbHVlID0gMDsKKwl1bmlvbiB7CisJCWNvbnN0IHU4ICpwODsKKwkJY29uc3QgdTE2ICpwMTZ1OworCQljb25zdCBzMTYgKnAxNnM7CisJCWNvbnN0IHUzMiAqcDMydTsKKwkJY29uc3QgczMyICpwMzJzOworCQljb25zdCB1bnNpZ25lZCBsb25nICpwdWw7CisJfSBwdHI7CisKKwlpZiAocHRyVHlwZSA8IDAgfHwgcHRyVHlwZSA9PSBEV19FSF9QRV9vbWl0KQorCQlyZXR1cm4gMDsKKwlwdHIucDggPSAqcExvYzsKKwlzd2l0Y2gocHRyVHlwZSAmIERXX0VIX1BFX0ZPUk0pIHsKKwljYXNlIERXX0VIX1BFX2RhdGEyOgorCQlpZiAoZW5kIDwgKGNvbnN0IHZvaWQgKikocHRyLnAxNnUgKyAxKSkKKwkJCXJldHVybiAwOworCQlpZihwdHJUeXBlICYgRFdfRUhfUEVfc2lnbmVkKQorCQkJdmFsdWUgPSBnZXRfdW5hbGlnbmVkKHB0ci5wMTZzKyspOworCQllbHNlCisJCQl2YWx1ZSA9IGdldF91bmFsaWduZWQocHRyLnAxNnUrKyk7CisJCWJyZWFrOworCWNhc2UgRFdfRUhfUEVfZGF0YTQ6CisjaWZkZWYgQ09ORklHXzY0QklUCisJCWlmIChlbmQgPCAoY29uc3Qgdm9pZCAqKShwdHIucDMydSArIDEpKQorCQkJcmV0dXJuIDA7CisJCWlmKHB0clR5cGUgJiBEV19FSF9QRV9zaWduZWQpCisJCQl2YWx1ZSA9IGdldF91bmFsaWduZWQocHRyLnAzMnMrKyk7CisJCWVsc2UKKwkJCXZhbHVlID0gZ2V0X3VuYWxpZ25lZChwdHIucDMydSsrKTsKKwkJYnJlYWs7CisJY2FzZSBEV19FSF9QRV9kYXRhODoKKwkJQlVJTERfQlVHX09OKHNpemVvZih1NjQpICE9IHNpemVvZih2YWx1ZSkpOworI2Vsc2UKKwkJQlVJTERfQlVHX09OKHNpemVvZih1MzIpICE9IHNpemVvZih2YWx1ZSkpOworI2VuZGlmCisJY2FzZSBEV19FSF9QRV9uYXRpdmU6CisJCWlmIChlbmQgPCAoY29uc3Qgdm9pZCAqKShwdHIucHVsICsgMSkpCisJCQlyZXR1cm4gMDsKKwkJdmFsdWUgPSBnZXRfdW5hbGlnbmVkKHB0ci5wdWwrKyk7CisJCWJyZWFrOworCWNhc2UgRFdfRUhfUEVfbGViMTI4OgorCQlCVUlMRF9CVUdfT04oc2l6ZW9mKHVsZWIxMjhfdCkgPiBzaXplb2YodmFsdWUpKTsKKwkJdmFsdWUgPSBwdHJUeXBlICYgRFdfRUhfUEVfc2lnbmVkCisJCSAgICAgICAgPyBnZXRfc2xlYjEyOCgmcHRyLnA4LCBlbmQpCisJCSAgICAgICAgOiBnZXRfdWxlYjEyOCgmcHRyLnA4LCBlbmQpOworCQlpZiAoKGNvbnN0IHZvaWQgKilwdHIucDggPiBlbmQpCisJCQlyZXR1cm4gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCXN3aXRjaChwdHJUeXBlICYgRFdfRUhfUEVfQURKVVNUKSB7CisJY2FzZSBEV19FSF9QRV9hYnM6CisJCWJyZWFrOworCWNhc2UgRFdfRUhfUEVfcGNyZWw6CisJCXZhbHVlICs9ICh1bnNpZ25lZCBsb25nKSpwTG9jOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9CisJaWYgKChwdHJUeXBlICYgRFdfRUhfUEVfaW5kaXJlY3QpCisJICAgICYmIF9fZ2V0X3VzZXIodmFsdWUsICh1bnNpZ25lZCBsb25nICopdmFsdWUpKQorCQlyZXR1cm4gMDsKKwkqcExvYyA9IHB0ci5wODsKKworCXJldHVybiB2YWx1ZTsKK30KKworc3RhdGljIHNpZ25lZCBmZGVfcG9pbnRlcl90eXBlKGNvbnN0IHUzMiAqY2llKQoreworCWNvbnN0IHU4ICpwdHIgPSAoY29uc3QgdTggKikoY2llICsgMik7CisJdW5zaWduZWQgdmVyc2lvbiA9ICpwdHI7CisKKwlpZiAodmVyc2lvbiAhPSAxKQorCQlyZXR1cm4gLTE7IC8qIHVuc3VwcG9ydGVkICovCisJaWYgKCorK3B0cikgeworCQljb25zdCBjaGFyICphdWc7CisJCWNvbnN0IHU4ICplbmQgPSAoY29uc3QgdTggKikoY2llICsgMSkgKyAqY2llOworCQl1bGViMTI4X3QgbGVuOworCisJCS8qIGNoZWNrIGlmIGF1Z21lbnRhdGlvbiBzaXplIGlzIGZpcnN0IChhbmQgdGh1cyBwcmVzZW50KSAqLworCQlpZiAoKnB0ciAhPSAneicpCisJCQlyZXR1cm4gLTE7CisJCS8qIGNoZWNrIGlmIGF1Z21lbnRhdGlvbiBzdHJpbmcgaXMgbnVsLXRlcm1pbmF0ZWQgKi8KKwkJaWYgKChwdHIgPSBtZW1jaHIoYXVnID0gKGNvbnN0IHZvaWQgKilwdHIsIDAsIGVuZCAtIHB0cikpID09IE5VTEwpCisJCQlyZXR1cm4gLTE7CisJCSsrcHRyOyAvKiBza2lwIHRlcm1pbmF0b3IgKi8KKwkJZ2V0X3VsZWIxMjgoJnB0ciwgZW5kKTsgLyogc2tpcCBjb2RlIGFsaWdubWVudCAqLworCQlnZXRfc2xlYjEyOCgmcHRyLCBlbmQpOyAvKiBza2lwIGRhdGEgYWxpZ25tZW50ICovCisJCS8qIHNraXAgcmV0dXJuIGFkZHJlc3MgY29sdW1uICovCisJCXZlcnNpb24gPD0gMSA/ICh2b2lkKSsrcHRyIDogKHZvaWQpZ2V0X3VsZWIxMjgoJnB0ciwgZW5kKTsKKwkJbGVuID0gZ2V0X3VsZWIxMjgoJnB0ciwgZW5kKTsgLyogYXVnbWVudGF0aW9uIGxlbmd0aCAqLworCQlpZiAocHRyICsgbGVuIDwgcHRyIHx8IHB0ciArIGxlbiA+IGVuZCkKKwkJCXJldHVybiAtMTsKKwkJZW5kID0gcHRyICsgbGVuOworCQl3aGlsZSAoKisrYXVnKSB7CisJCQlpZiAocHRyID49IGVuZCkKKwkJCQlyZXR1cm4gLTE7CisJCQlzd2l0Y2goKmF1ZykgeworCQkJY2FzZSAnTCc6CisJCQkJKytwdHI7CisJCQkJYnJlYWs7CisJCQljYXNlICdQJzogeworCQkJCQlzaWduZWQgcHRyVHlwZSA9ICpwdHIrKzsKKworCQkJCQlpZiAoIXJlYWRfcG9pbnRlcigmcHRyLCBlbmQsIHB0clR5cGUpIHx8IHB0ciA+IGVuZCkKKwkJCQkJCXJldHVybiAtMTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlICdSJzoKKwkJCQlyZXR1cm4gKnB0cjsKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9CisJfQorCXJldHVybiBEV19FSF9QRV9uYXRpdmV8RFdfRUhfUEVfYWJzOworfQorCitzdGF0aWMgaW50IGFkdmFuY2VfbG9jKHVuc2lnbmVkIGxvbmcgZGVsdGEsIHN0cnVjdCB1bndpbmRfc3RhdGUgKnN0YXRlKQoreworCXN0YXRlLT5sb2MgKz0gZGVsdGEgKiBzdGF0ZS0+Y29kZUFsaWduOworCisJcmV0dXJuIGRlbHRhID4gMDsKK30KKworc3RhdGljIHZvaWQgc2V0X3J1bGUodWxlYjEyOF90IHJlZywKKyAgICAgICAgICAgICAgICAgICAgIGVudW0gaXRlbV9sb2NhdGlvbiB3aGVyZSwKKyAgICAgICAgICAgICAgICAgICAgIHVsZWIxMjhfdCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB1bndpbmRfc3RhdGUgKnN0YXRlKQoreworCWlmIChyZWcgPCBBUlJBWV9TSVpFKHN0YXRlLT5yZWdzKSkgeworCQlzdGF0ZS0+cmVnc1tyZWddLndoZXJlID0gd2hlcmU7CisJCXN0YXRlLT5yZWdzW3JlZ10udmFsdWUgPSB2YWx1ZTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcHJvY2Vzc0NGSShjb25zdCB1OCAqc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdTggKmVuZCwKKyAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHRhcmdldExvYywKKyAgICAgICAgICAgICAgICAgICAgICBzaWduZWQgcHRyVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdW53aW5kX3N0YXRlICpzdGF0ZSkKK3sKKwl1bmlvbiB7CisJCWNvbnN0IHU4ICpwODsKKwkJY29uc3QgdTE2ICpwMTY7CisJCWNvbnN0IHUzMiAqcDMyOworCX0gcHRyOworCWludCByZXN1bHQgPSAxOworCisJaWYgKHN0YXJ0ICE9IHN0YXRlLT5jaWVTdGFydCkgeworCQlzdGF0ZS0+bG9jID0gc3RhdGUtPm9yZzsKKwkJcmVzdWx0ID0gcHJvY2Vzc0NGSShzdGF0ZS0+Y2llU3RhcnQsIHN0YXRlLT5jaWVFbmQsIDAsIHB0clR5cGUsIHN0YXRlKTsKKwkJaWYgKHRhcmdldExvYyA9PSAwICYmIHN0YXRlLT5sYWJlbCA9PSBOVUxMKQorCQkJcmV0dXJuIHJlc3VsdDsKKwl9CisJZm9yIChwdHIucDggPSBzdGFydDsgcmVzdWx0ICYmIHB0ci5wOCA8IGVuZDsgKSB7CisJCXN3aXRjaCgqcHRyLnA4ID4+IDYpIHsKKwkJCXVsZWIxMjhfdCB2YWx1ZTsKKworCQljYXNlIDA6CisJCQlzd2l0Y2goKnB0ci5wOCsrKSB7CisJCQljYXNlIERXX0NGQV9ub3A6CisJCQkJYnJlYWs7CisJCQljYXNlIERXX0NGQV9zZXRfbG9jOgorCQkJCWlmICgoc3RhdGUtPmxvYyA9IHJlYWRfcG9pbnRlcigmcHRyLnA4LCBlbmQsIHB0clR5cGUpKSA9PSAwKQorCQkJCQlyZXN1bHQgPSAwOworCQkJCWJyZWFrOworCQkJY2FzZSBEV19DRkFfYWR2YW5jZV9sb2MxOgorCQkJCXJlc3VsdCA9IHB0ci5wOCA8IGVuZCAmJiBhZHZhbmNlX2xvYygqcHRyLnA4KyssIHN0YXRlKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRFdfQ0ZBX2FkdmFuY2VfbG9jMjoKKwkJCQlyZXN1bHQgPSBwdHIucDggPD0gZW5kICsgMgorCQkJCSAgICAgICAgICYmIGFkdmFuY2VfbG9jKCpwdHIucDE2KyssIHN0YXRlKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRFdfQ0ZBX2FkdmFuY2VfbG9jNDoKKwkJCQlyZXN1bHQgPSBwdHIucDggPD0gZW5kICsgNAorCQkJCSAgICAgICAgICYmIGFkdmFuY2VfbG9jKCpwdHIucDMyKyssIHN0YXRlKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRFdfQ0ZBX29mZnNldF9leHRlbmRlZDoKKwkJCQl2YWx1ZSA9IGdldF91bGViMTI4KCZwdHIucDgsIGVuZCk7CisJCQkJc2V0X3J1bGUodmFsdWUsIE1lbW9yeSwgZ2V0X3VsZWIxMjgoJnB0ci5wOCwgZW5kKSwgc3RhdGUpOworCQkJCWJyZWFrOworCQkJY2FzZSBEV19DRkFfdmFsX29mZnNldDoKKwkJCQl2YWx1ZSA9IGdldF91bGViMTI4KCZwdHIucDgsIGVuZCk7CisJCQkJc2V0X3J1bGUodmFsdWUsIFZhbHVlLCBnZXRfdWxlYjEyOCgmcHRyLnA4LCBlbmQpLCBzdGF0ZSk7CisJCQkJYnJlYWs7CisJCQljYXNlIERXX0NGQV9vZmZzZXRfZXh0ZW5kZWRfc2Y6CisJCQkJdmFsdWUgPSBnZXRfdWxlYjEyOCgmcHRyLnA4LCBlbmQpOworCQkJCXNldF9ydWxlKHZhbHVlLCBNZW1vcnksIGdldF9zbGViMTI4KCZwdHIucDgsIGVuZCksIHN0YXRlKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRFdfQ0ZBX3ZhbF9vZmZzZXRfc2Y6CisJCQkJdmFsdWUgPSBnZXRfdWxlYjEyOCgmcHRyLnA4LCBlbmQpOworCQkJCXNldF9ydWxlKHZhbHVlLCBWYWx1ZSwgZ2V0X3NsZWIxMjgoJnB0ci5wOCwgZW5kKSwgc3RhdGUpOworCQkJCWJyZWFrOworCQkJY2FzZSBEV19DRkFfcmVzdG9yZV9leHRlbmRlZDoKKwkJCWNhc2UgRFdfQ0ZBX3VuZGVmaW5lZDoKKwkJCWNhc2UgRFdfQ0ZBX3NhbWVfdmFsdWU6CisJCQkJc2V0X3J1bGUoZ2V0X3VsZWIxMjgoJnB0ci5wOCwgZW5kKSwgTm93aGVyZSwgMCwgc3RhdGUpOworCQkJCWJyZWFrOworCQkJY2FzZSBEV19DRkFfcmVnaXN0ZXI6CisJCQkJdmFsdWUgPSBnZXRfdWxlYjEyOCgmcHRyLnA4LCBlbmQpOworCQkJCXNldF9ydWxlKHZhbHVlLAorCQkJCSAgICAgICAgIFJlZ2lzdGVyLAorCQkJCSAgICAgICAgIGdldF91bGViMTI4KCZwdHIucDgsIGVuZCksIHN0YXRlKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRFdfQ0ZBX3JlbWVtYmVyX3N0YXRlOgorCQkJCWlmIChwdHIucDggPT0gc3RhdGUtPmxhYmVsKSB7CisJCQkJCXN0YXRlLT5sYWJlbCA9IE5VTEw7CisJCQkJCXJldHVybiAxOworCQkJCX0KKwkJCQlpZiAoc3RhdGUtPnN0YWNrRGVwdGggPj0gTUFYX1NUQUNLX0RFUFRIKQorCQkJCQlyZXR1cm4gMDsKKwkJCQlzdGF0ZS0+c3RhY2tbc3RhdGUtPnN0YWNrRGVwdGgrK10gPSBwdHIucDg7CisJCQkJYnJlYWs7CisJCQljYXNlIERXX0NGQV9yZXN0b3JlX3N0YXRlOgorCQkJCWlmIChzdGF0ZS0+c3RhY2tEZXB0aCkgeworCQkJCQljb25zdCB1bGViMTI4X3QgbG9jID0gc3RhdGUtPmxvYzsKKwkJCQkJY29uc3QgdTggKmxhYmVsID0gc3RhdGUtPmxhYmVsOworCisJCQkJCXN0YXRlLT5sYWJlbCA9IHN0YXRlLT5zdGFja1tzdGF0ZS0+c3RhY2tEZXB0aCAtIDFdOworCQkJCQltZW1jcHkoJnN0YXRlLT5jZmEsICZiYWRDRkEsIHNpemVvZihzdGF0ZS0+Y2ZhKSk7CisJCQkJCW1lbXNldChzdGF0ZS0+cmVncywgMCwgc2l6ZW9mKHN0YXRlLT5yZWdzKSk7CisJCQkJCXN0YXRlLT5zdGFja0RlcHRoID0gMDsKKwkJCQkJcmVzdWx0ID0gcHJvY2Vzc0NGSShzdGFydCwgZW5kLCAwLCBwdHJUeXBlLCBzdGF0ZSk7CisJCQkJCXN0YXRlLT5sb2MgPSBsb2M7CisJCQkJCXN0YXRlLT5sYWJlbCA9IGxhYmVsOworCQkJCX0gZWxzZQorCQkJCQlyZXR1cm4gMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgRFdfQ0ZBX2RlZl9jZmE6CisJCQkJc3RhdGUtPmNmYS5yZWcgPSBnZXRfdWxlYjEyOCgmcHRyLnA4LCBlbmQpOworCQkJCS8qbm9icmVhayovCisJCQljYXNlIERXX0NGQV9kZWZfY2ZhX29mZnNldDoKKwkJCQlzdGF0ZS0+Y2ZhLm9mZnMgPSBnZXRfdWxlYjEyOCgmcHRyLnA4LCBlbmQpOworCQkJCWJyZWFrOworCQkJY2FzZSBEV19DRkFfZGVmX2NmYV9zZjoKKwkJCQlzdGF0ZS0+Y2ZhLnJlZyA9IGdldF91bGViMTI4KCZwdHIucDgsIGVuZCk7CisJCQkJLypub2JyZWFrKi8KKwkJCWNhc2UgRFdfQ0ZBX2RlZl9jZmFfb2Zmc2V0X3NmOgorCQkJCXN0YXRlLT5jZmEub2ZmcyA9IGdldF9zbGViMTI4KCZwdHIucDgsIGVuZCkKKwkJCQkgICAgICAgICAgICAgICAgICAqIHN0YXRlLT5kYXRhQWxpZ247CisJCQkJYnJlYWs7CisJCQljYXNlIERXX0NGQV9kZWZfY2ZhX3JlZ2lzdGVyOgorCQkJCXN0YXRlLT5jZmEucmVnID0gZ2V0X3VsZWIxMjgoJnB0ci5wOCwgZW5kKTsKKwkJCQlicmVhazsKKwkJCS8qdG9kbyBjYXNlIERXX0NGQV9kZWZfY2ZhX2V4cHJlc3Npb246ICovCisJCQkvKnRvZG8gY2FzZSBEV19DRkFfZXhwcmVzc2lvbjogKi8KKwkJCS8qdG9kbyBjYXNlIERXX0NGQV92YWxfZXhwcmVzc2lvbjogKi8KKwkJCWNhc2UgRFdfQ0ZBX0dOVV9hcmdzX3NpemU6CisJCQkJZ2V0X3VsZWIxMjgoJnB0ci5wOCwgZW5kKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRFdfQ0ZBX0dOVV9uZWdhdGl2ZV9vZmZzZXRfZXh0ZW5kZWQ6CisJCQkJdmFsdWUgPSBnZXRfdWxlYjEyOCgmcHRyLnA4LCBlbmQpOworCQkJCXNldF9ydWxlKHZhbHVlLAorCQkJCSAgICAgICAgIE1lbW9yeSwKKwkJCQkgICAgICAgICAodWxlYjEyOF90KTAgLSBnZXRfdWxlYjEyOCgmcHRyLnA4LCBlbmQpLCBzdGF0ZSk7CisJCQkJYnJlYWs7CisJCQljYXNlIERXX0NGQV9HTlVfd2luZG93X3NhdmU6CisJCQlkZWZhdWx0OgorCQkJCXJlc3VsdCA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJcmVzdWx0ID0gYWR2YW5jZV9sb2MoKnB0ci5wOCsrICYgMHgzZiwgc3RhdGUpOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCXZhbHVlID0gKnB0ci5wOCsrICYgMHgzZjsKKwkJCXNldF9ydWxlKHZhbHVlLCBNZW1vcnksIGdldF91bGViMTI4KCZwdHIucDgsIGVuZCksIHN0YXRlKTsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQlzZXRfcnVsZSgqcHRyLnA4KysgJiAweDNmLCBOb3doZXJlLCAwLCBzdGF0ZSk7CisJCQlicmVhazsKKwkJfQorCQlpZiAocHRyLnA4ID4gZW5kKQorCQkJcmVzdWx0ID0gMDsKKwkJaWYgKHJlc3VsdCAmJiB0YXJnZXRMb2MgIT0gMCAmJiB0YXJnZXRMb2MgPCBzdGF0ZS0+bG9jKQorCQkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIHJlc3VsdAorCSAgICYmIHB0ci5wOCA9PSBlbmQKKwkgICAmJiAodGFyZ2V0TG9jID09IDAKKwkgICAgfHwgKC8qdG9kbyBXaGlsZSBpbiB0aGVvcnkgdGhpcyBzaG91bGQgYXBwbHksIGdjYyBpbiBwcmFjdGljZSBvbWl0cworCSAgICAgICAgICBldmVyeXRoaW5nIHBhc3QgdGhlIGZ1bmN0aW9uIHByb2xvZywgYW5kIGhlbmNlIHRoZSBsb2NhdGlvbgorCSAgICAgICAgICBuZXZlciByZWFjaGVzIHRoZSBlbmQgb2YgdGhlIGZ1bmN0aW9uLgorCSAgICAgICAgdGFyZ2V0TG9jIDwgc3RhdGUtPmxvYyAmJiovIHN0YXRlLT5sYWJlbCA9PSBOVUxMKSk7Cit9CisKKy8qIFVud2luZCB0byBwcmV2aW91cyB0byBmcmFtZS4gIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLCBuZWdhdGl2ZQorICogbnVtYmVyIGluIGNhc2Ugb2YgYW4gZXJyb3IuICovCitpbnQgdW53aW5kKHN0cnVjdCB1bndpbmRfZnJhbWVfaW5mbyAqZnJhbWUpCit7CisjZGVmaW5lIEZSQU1FX1JFRyhyLCB0KSAoKCh0ICopZnJhbWUpW3JlZ19pbmZvW3JdLm9mZnNdKQorCWNvbnN0IHUzMiAqZmRlID0gTlVMTCwgKmNpZSA9IE5VTEw7CisJY29uc3QgdTggKnB0ciA9IE5VTEwsICplbmQgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgc3RhcnRMb2MgPSAwLCBlbmRMb2MgPSAwLCBjZmE7CisJdW5zaWduZWQgaTsKKwlzaWduZWQgcHRyVHlwZSA9IC0xOworCXVsZWIxMjhfdCByZXRBZGRyUmVnID0gMDsKKwlzdHJ1Y3QgdW53aW5kX3RhYmxlICp0YWJsZTsKKwlzdHJ1Y3QgdW53aW5kX3N0YXRlIHN0YXRlOworCisJaWYgKFVOV19QQyhmcmFtZSkgPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCh0YWJsZSA9IGZpbmRfdGFibGUoVU5XX1BDKGZyYW1lKSkpICE9IE5VTEwKKwkgICAgJiYgISh0YWJsZS0+c2l6ZSAmIChzaXplb2YoKmZkZSkgLSAxKSkpIHsKKwkJdW5zaWduZWQgbG9uZyB0YWJsZVNpemUgPSB0YWJsZS0+c2l6ZTsKKworCQlmb3IgKGZkZSA9IHRhYmxlLT5hZGRyZXNzOworCQkgICAgIHRhYmxlU2l6ZSA+IHNpemVvZigqZmRlKSAmJiB0YWJsZVNpemUgLSBzaXplb2YoKmZkZSkgPj0gKmZkZTsKKwkJICAgICB0YWJsZVNpemUgLT0gc2l6ZW9mKCpmZGUpICsgKmZkZSwKKwkJICAgICBmZGUgKz0gMSArICpmZGUgLyBzaXplb2YoKmZkZSkpIHsKKwkJCWlmICghKmZkZSB8fCAoKmZkZSAmIChzaXplb2YoKmZkZSkgLSAxKSkpCisJCQkJYnJlYWs7CisJCQlpZiAoIWZkZVsxXSkKKwkJCQljb250aW51ZTsgLyogdGhpcyBpcyBhIENJRSAqLworCQkJaWYgKChmZGVbMV0gJiAoc2l6ZW9mKCpmZGUpIC0gMSkpCisJCQkgICAgfHwgZmRlWzFdID4gKHVuc2lnbmVkIGxvbmcpKGZkZSArIDEpCisJCQkgICAgICAgICAgICAgICAgLSAodW5zaWduZWQgbG9uZyl0YWJsZS0+YWRkcmVzcykKKwkJCQljb250aW51ZTsgLyogdGhpcyBpcyBub3QgYSB2YWxpZCBGREUgKi8KKwkJCWNpZSA9IGZkZSArIDEgLSBmZGVbMV0gLyBzaXplb2YoKmZkZSk7CisJCQlpZiAoKmNpZSA8PSBzaXplb2YoKmNpZSkgKyA0CisJCQkgICAgfHwgKmNpZSA+PSBmZGVbMV0gLSBzaXplb2YoKmZkZSkKKwkJCSAgICB8fCAoKmNpZSAmIChzaXplb2YoKmNpZSkgLSAxKSkKKwkJCSAgICB8fCBjaWVbMV0KKwkJCSAgICB8fCAocHRyVHlwZSA9IGZkZV9wb2ludGVyX3R5cGUoY2llKSkgPCAwKSB7CisJCQkJY2llID0gTlVMTDsgLyogdGhpcyBpcyBub3QgYSAodmFsaWQpIENJRSAqLworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJcHRyID0gKGNvbnN0IHU4ICopKGZkZSArIDIpOworCQkJc3RhcnRMb2MgPSByZWFkX3BvaW50ZXIoJnB0ciwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1OCAqKShmZGUgKyAxKSArICpmZGUsCisJCQkgICAgICAgICAgICAgICAgICAgICAgICBwdHJUeXBlKTsKKwkJCWVuZExvYyA9IHN0YXJ0TG9jCisJCQkgICAgICAgICArIHJlYWRfcG9pbnRlcigmcHRyLAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHU4ICopKGZkZSArIDEpICsgKmZkZSwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgIHB0clR5cGUgJiBEV19FSF9QRV9pbmRpcmVjdAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgPyBwdHJUeXBlCisJCQkgICAgICAgICAgICAgICAgICAgICAgICA6IHB0clR5cGUgJiAoRFdfRUhfUEVfRk9STXxEV19FSF9QRV9zaWduZWQpKTsKKwkJCWlmIChVTldfUEMoZnJhbWUpID49IHN0YXJ0TG9jICYmIFVOV19QQyhmcmFtZSkgPCBlbmRMb2MpCisJCQkJYnJlYWs7CisJCQljaWUgPSBOVUxMOworCQl9CisJfQorCWlmIChjaWUgIT0gTlVMTCkgeworCQltZW1zZXQoJnN0YXRlLCAwLCBzaXplb2Yoc3RhdGUpKTsKKwkJc3RhdGUuY2llRW5kID0gcHRyOyAvKiBrZWVwIGhlcmUgdGVtcG9yYXJpbHkgKi8KKwkJcHRyID0gKGNvbnN0IHU4ICopKGNpZSArIDIpOworCQllbmQgPSAoY29uc3QgdTggKikoY2llICsgMSkgKyAqY2llOworCQlpZiAoKHN0YXRlLnZlcnNpb24gPSAqcHRyKSAhPSAxKQorCQkJY2llID0gTlVMTDsgLyogdW5zdXBwb3J0ZWQgdmVyc2lvbiAqLworCQllbHNlIGlmICgqKytwdHIpIHsKKwkJCS8qIGNoZWNrIGlmIGF1Z21lbnRhdGlvbiBzaXplIGlzIGZpcnN0IChhbmQgdGh1cyBwcmVzZW50KSAqLworCQkJaWYgKCpwdHIgPT0gJ3onKSB7CisJCQkJLyogY2hlY2sgZm9yIGlnbm9yYWJsZSAob3IgYWxyZWFkeSBoYW5kbGVkKQorCQkJCSAqIG51bC10ZXJtaW5hdGVkIGF1Z21lbnRhdGlvbiBzdHJpbmcgKi8KKwkJCQl3aGlsZSAoKytwdHIgPCBlbmQgJiYgKnB0cikKKwkJCQkJaWYgKHN0cmNocigiTFBSIiwgKnB0cikgPT0gTlVMTCkKKwkJCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKHB0ciA+PSBlbmQgfHwgKnB0cikKKwkJCQljaWUgPSBOVUxMOworCQl9CisJCSsrcHRyOworCX0KKwlpZiAoY2llICE9IE5VTEwpIHsKKwkJLyogZ2V0IGNvZGUgYWxpZ21lbnQgZmFjdG9yICovCisJCXN0YXRlLmNvZGVBbGlnbiA9IGdldF91bGViMTI4KCZwdHIsIGVuZCk7CisJCS8qIGdldCBkYXRhIGFsaWdtZW50IGZhY3RvciAqLworCQlzdGF0ZS5kYXRhQWxpZ24gPSBnZXRfc2xlYjEyOCgmcHRyLCBlbmQpOworCQlpZiAoc3RhdGUuY29kZUFsaWduID09IDAgfHwgc3RhdGUuZGF0YUFsaWduID09IDAgfHwgcHRyID49IGVuZCkKKwkJCWNpZSA9IE5VTEw7CisJCWVsc2UgeworCQkJcmV0QWRkclJlZyA9IHN0YXRlLnZlcnNpb24gPD0gMSA/ICpwdHIrKyA6IGdldF91bGViMTI4KCZwdHIsIGVuZCk7CisJCQkvKiBza2lwIGF1Z21lbnRhdGlvbiAqLworCQkJaWYgKCgoY29uc3QgY2hhciAqKShjaWUgKyAyKSlbMV0gPT0gJ3onKQorCQkJCXB0ciArPSBnZXRfdWxlYjEyOCgmcHRyLCBlbmQpOworCQkJaWYgKHB0ciA+IGVuZAorCQkJICAgfHwgcmV0QWRkclJlZyA+PSBBUlJBWV9TSVpFKHJlZ19pbmZvKQorCQkJICAgfHwgUkVHX0lOVkFMSUQocmV0QWRkclJlZykKKwkJCSAgIHx8IHJlZ19pbmZvW3JldEFkZHJSZWddLndpZHRoICE9IHNpemVvZih1bnNpZ25lZCBsb25nKSkKKwkJCQljaWUgPSBOVUxMOworCQl9CisJfQorCWlmIChjaWUgIT0gTlVMTCkgeworCQlzdGF0ZS5jaWVTdGFydCA9IHB0cjsKKwkJcHRyID0gc3RhdGUuY2llRW5kOworCQlzdGF0ZS5jaWVFbmQgPSBlbmQ7CisJCWVuZCA9IChjb25zdCB1OCAqKShmZGUgKyAxKSArICpmZGU7CisJCS8qIHNraXAgYXVnbWVudGF0aW9uICovCisJCWlmICgoKGNvbnN0IGNoYXIgKikoY2llICsgMikpWzFdID09ICd6JykgeworCQkJdWxlYjEyOF90IGF1Z1NpemUgPSBnZXRfdWxlYjEyOCgmcHRyLCBlbmQpOworCisJCQlpZiAoKHB0ciArPSBhdWdTaXplKSA+IGVuZCkKKwkJCQlmZGUgPSBOVUxMOworCQl9CisJfQorCWlmIChjaWUgPT0gTlVMTCB8fCBmZGUgPT0gTlVMTCkgeworI2lmZGVmIENPTkZJR19GUkFNRV9QT0lOVEVSCisJCXVuc2lnbmVkIGxvbmcgdG9wLCBib3R0b207CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19GUkFNRV9QT0lOVEVSCisJCXRvcCA9IFNUQUNLX1RPUChmcmFtZS0+dGFzayk7CisJCWJvdHRvbSA9IFNUQUNLX0JPVFRPTShmcmFtZS0+dGFzayk7CisjIGlmIEZSQU1FX1JFVEFERFJfT0ZGU0VUIDwgMAorCQlpZiAoVU5XX1NQKGZyYW1lKSA8IHRvcAorCQkgICAgJiYgVU5XX0ZQKGZyYW1lKSA8PSBVTldfU1AoZnJhbWUpCisJCSAgICAmJiBib3R0b20gPCBVTldfRlAoZnJhbWUpCisjIGVsc2UKKwkJaWYgKFVOV19TUChmcmFtZSkgPiB0b3AKKwkJICAgICYmIFVOV19GUChmcmFtZSkgPj0gVU5XX1NQKGZyYW1lKQorCQkgICAgJiYgYm90dG9tID4gVU5XX0ZQKGZyYW1lKQorIyBlbmRpZgorCQkgICAmJiAhKChVTldfU1AoZnJhbWUpIHwgVU5XX0ZQKGZyYW1lKSkKKwkJICAgICAgICAmIChzaXplb2YodW5zaWduZWQgbG9uZykgLSAxKSkpIHsKKwkJCXVuc2lnbmVkIGxvbmcgbGluazsKKworCQkJaWYgKCFfX2dldF91c2VyKGxpbmssCisJCQkgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgKikoVU5XX0ZQKGZyYW1lKQorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgRlJBTUVfTElOS19PRkZTRVQpKQorIyBpZiBGUkFNRV9SRVRBRERSX09GRlNFVCA8IDAKKwkJCSAgICYmIGxpbmsgPiBib3R0b20gJiYgbGluayA8IFVOV19GUChmcmFtZSkKKyMgZWxzZQorCQkJICAgJiYgbGluayA+IFVOV19GUChmcmFtZSkgJiYgbGluayA8IGJvdHRvbQorIyBlbmRpZgorCQkJICAgJiYgIShsaW5rICYgKHNpemVvZihsaW5rKSAtIDEpKQorCQkJICAgJiYgIV9fZ2V0X3VzZXIoVU5XX1BDKGZyYW1lKSwKKwkJCSAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nICopKFVOV19GUChmcmFtZSkKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgRlJBTUVfUkVUQUREUl9PRkZTRVQpKSkgeworCQkJCVVOV19TUChmcmFtZSkgPSBVTldfRlAoZnJhbWUpICsgRlJBTUVfUkVUQUREUl9PRkZTRVQKKyMgaWYgRlJBTUVfUkVUQUREUl9PRkZTRVQgPCAwCisJCQkJCS0KKyMgZWxzZQorCQkJCQkrCisjIGVuZGlmCisJCQkJCSAgc2l6ZW9mKFVOV19QQyhmcmFtZSkpOworCQkJCVVOV19GUChmcmFtZSkgPSBsaW5rOworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisjZW5kaWYKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisJc3RhdGUub3JnID0gc3RhcnRMb2M7CisJbWVtY3B5KCZzdGF0ZS5jZmEsICZiYWRDRkEsIHNpemVvZihzdGF0ZS5jZmEpKTsKKwkvKiBwcm9jZXNzIGluc3RydWN0aW9ucyAqLworCWlmICghcHJvY2Vzc0NGSShwdHIsIGVuZCwgVU5XX1BDKGZyYW1lKSwgcHRyVHlwZSwgJnN0YXRlKQorCSAgIHx8IHN0YXRlLmxvYyA+IGVuZExvYworCSAgIHx8IHN0YXRlLnJlZ3NbcmV0QWRkclJlZ10ud2hlcmUgPT0gTm93aGVyZQorCSAgIHx8IHN0YXRlLmNmYS5yZWcgPj0gQVJSQVlfU0laRShyZWdfaW5mbykKKwkgICB8fCByZWdfaW5mb1tzdGF0ZS5jZmEucmVnXS53aWR0aCAhPSBzaXplb2YodW5zaWduZWQgbG9uZykKKwkgICB8fCBzdGF0ZS5jZmEub2ZmcyAlIHNpemVvZih1bnNpZ25lZCBsb25nKSkKKwkJcmV0dXJuIC1FSU87CisJLyogdXBkYXRlIGZyYW1lICovCisJY2ZhID0gRlJBTUVfUkVHKHN0YXRlLmNmYS5yZWcsIHVuc2lnbmVkIGxvbmcpICsgc3RhdGUuY2ZhLm9mZnM7CisJc3RhcnRMb2MgPSBtaW4oKHVuc2lnbmVkIGxvbmcpVU5XX1NQKGZyYW1lKSwgY2ZhKTsKKwllbmRMb2MgPSBtYXgoKHVuc2lnbmVkIGxvbmcpVU5XX1NQKGZyYW1lKSwgY2ZhKTsKKwlpZiAoU1RBQ0tfTElNSVQoc3RhcnRMb2MpICE9IFNUQUNLX0xJTUlUKGVuZExvYykpIHsKKwkJc3RhcnRMb2MgPSBtaW4oU1RBQ0tfTElNSVQoY2ZhKSwgY2ZhKTsKKwkJZW5kTG9jID0gbWF4KFNUQUNLX0xJTUlUKGNmYSksIGNmYSk7CisJfQorI2lmbmRlZiBDT05GSUdfNjRCSVQKKyMgZGVmaW5lIENBU0VTIENBU0UoOCk7IENBU0UoMTYpOyBDQVNFKDMyKQorI2Vsc2UKKyMgZGVmaW5lIENBU0VTIENBU0UoOCk7IENBU0UoMTYpOyBDQVNFKDMyKTsgQ0FTRSg2NCkKKyNlbmRpZgorCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHN0YXRlLnJlZ3MpOyArK2kpIHsKKwkJaWYgKFJFR19JTlZBTElEKGkpKSB7CisJCQlpZiAoc3RhdGUucmVnc1tpXS53aGVyZSA9PSBOb3doZXJlKQorCQkJCWNvbnRpbnVlOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJc3dpdGNoKHN0YXRlLnJlZ3NbaV0ud2hlcmUpIHsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQljYXNlIFJlZ2lzdGVyOgorCQkJaWYgKHN0YXRlLnJlZ3NbaV0udmFsdWUgPj0gQVJSQVlfU0laRShyZWdfaW5mbykKKwkJCSAgIHx8IFJFR19JTlZBTElEKHN0YXRlLnJlZ3NbaV0udmFsdWUpCisJCQkgICB8fCByZWdfaW5mb1tpXS53aWR0aCA+IHJlZ19pbmZvW3N0YXRlLnJlZ3NbaV0udmFsdWVdLndpZHRoKQorCQkJCXJldHVybiAtRUlPOworCQkJc3dpdGNoKHJlZ19pbmZvW3N0YXRlLnJlZ3NbaV0udmFsdWVdLndpZHRoKSB7CisjZGVmaW5lIENBU0UobikgXAorCQkJY2FzZSBzaXplb2YodSMjbik6IFwKKwkJCQlzdGF0ZS5yZWdzW2ldLnZhbHVlID0gRlJBTUVfUkVHKHN0YXRlLnJlZ3NbaV0udmFsdWUsIFwKKwkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHUjI24pOyBcCisJCQkJYnJlYWsKKwkJCUNBU0VTOworI3VuZGVmIENBU0UKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIC1FSU87CisJCQl9CisJCQlicmVhazsKKwkJfQorCX0KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzdGF0ZS5yZWdzKTsgKytpKSB7CisJCWlmIChSRUdfSU5WQUxJRChpKSkKKwkJCWNvbnRpbnVlOworCQlzd2l0Y2goc3RhdGUucmVnc1tpXS53aGVyZSkgeworCQljYXNlIE5vd2hlcmU6CisJCQlpZiAocmVnX2luZm9baV0ud2lkdGggIT0gc2l6ZW9mKFVOV19TUChmcmFtZSkpCisJCQkgICB8fCAmRlJBTUVfUkVHKGksIF9fdHlwZW9mX18oVU5XX1NQKGZyYW1lKSkpCisJCQkgICAgICAhPSAmVU5XX1NQKGZyYW1lKSkKKwkJCQljb250aW51ZTsKKwkJCVVOV19TUChmcmFtZSkgPSBjZmE7CisJCQlicmVhazsKKwkJY2FzZSBSZWdpc3RlcjoKKwkJCXN3aXRjaChyZWdfaW5mb1tpXS53aWR0aCkgeworI2RlZmluZSBDQVNFKG4pIGNhc2Ugc2l6ZW9mKHUjI24pOiBcCisJCQkJRlJBTUVfUkVHKGksIHUjI24pID0gc3RhdGUucmVnc1tpXS52YWx1ZTsgXAorCQkJCWJyZWFrCisJCQlDQVNFUzsKKyN1bmRlZiBDQVNFCisJCQlkZWZhdWx0OgorCQkJCXJldHVybiAtRUlPOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVmFsdWU6CisJCQlpZiAocmVnX2luZm9baV0ud2lkdGggIT0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKQorCQkJCXJldHVybiAtRUlPOworCQkJRlJBTUVfUkVHKGksIHVuc2lnbmVkIGxvbmcpID0gY2ZhICsgc3RhdGUucmVnc1tpXS52YWx1ZQorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzdGF0ZS5kYXRhQWxpZ247CisJCQlicmVhazsKKwkJY2FzZSBNZW1vcnk6IHsKKwkJCQl1bnNpZ25lZCBsb25nIGFkZHIgPSBjZmEgKyBzdGF0ZS5yZWdzW2ldLnZhbHVlCisJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzdGF0ZS5kYXRhQWxpZ247CisKKwkJCQlpZiAoKHN0YXRlLnJlZ3NbaV0udmFsdWUgKiBzdGF0ZS5kYXRhQWxpZ24pCisJCQkJICAgICUgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpCisJCQkJICAgIHx8IGFkZHIgPCBzdGFydExvYworCQkJCSAgICB8fCBhZGRyICsgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpIDwgYWRkcgorCQkJCSAgICB8fCBhZGRyICsgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpID4gZW5kTG9jKQorCQkJCQlyZXR1cm4gLUVJTzsKKwkJCQlzd2l0Y2gocmVnX2luZm9baV0ud2lkdGgpIHsKKyNkZWZpbmUgQ0FTRShuKSAgICAgY2FzZSBzaXplb2YodSMjbik6IFwKKwkJCQkJX19nZXRfdXNlcihGUkFNRV9SRUcoaSwgdSMjbiksICh1IyNuICopYWRkcik7IFwKKwkJCQkJYnJlYWsKKwkJCQlDQVNFUzsKKyN1bmRlZiBDQVNFCisJCQkJZGVmYXVsdDoKKwkJCQkJcmV0dXJuIC1FSU87CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKKyN1bmRlZiBDQVNFUworI3VuZGVmIEZSQU1FX1JFRworfQorRVhQT1JUX1NZTUJPTCh1bndpbmQpOworCitpbnQgdW53aW5kX2luaXRfZnJhbWVfaW5mbyhzdHJ1Y3QgdW53aW5kX2ZyYW1lX2luZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qY29uc3QqLyBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpbmZvLT50YXNrID0gdHNrOworCWFyY2hfdW53X2luaXRfZnJhbWVfaW5mbyhpbmZvLCByZWdzKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTCh1bndpbmRfaW5pdF9mcmFtZV9pbmZvKTsKKworLyoKKyAqIFByZXBhcmUgdG8gdW53aW5kIGEgYmxvY2tlZCB0YXNrLgorICovCitpbnQgdW53aW5kX2luaXRfYmxvY2tlZChzdHJ1Y3QgdW53aW5kX2ZyYW1lX2luZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKK3sKKwlpbmZvLT50YXNrID0gdHNrOworCWFyY2hfdW53X2luaXRfYmxvY2tlZChpbmZvKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTCh1bndpbmRfaW5pdF9ibG9ja2VkKTsKKworLyoKKyAqIFByZXBhcmUgdG8gdW53aW5kIHRoZSBjdXJyZW50bHkgcnVubmluZyB0aHJlYWQuCisgKi8KK2ludCB1bndpbmRfaW5pdF9ydW5uaW5nKHN0cnVjdCB1bndpbmRfZnJhbWVfaW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzbWxpbmthZ2UgaW50ICgqY2FsbGJhY2spKHN0cnVjdCB1bndpbmRfZnJhbWVfaW5mbyAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYXJnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmFyZykKK3sKKwlpbmZvLT50YXNrID0gY3VycmVudDsKKworCXJldHVybiBhcmNoX3Vud2luZF9pbml0X3J1bm5pbmcoaW5mbywgY2FsbGJhY2ssIGFyZyk7Cit9CitFWFBPUlRfU1lNQk9MKHVud2luZF9pbml0X3J1bm5pbmcpOworCisvKgorICogVW53aW5kIHVudGlsIHRoZSByZXR1cm4gcG9pbnRlciBpcyBpbiB1c2VyLWxhbmQgKG9yIHVudGlsIGFuIGVycm9yCisgKiBvY2N1cnMpLiAgUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwsIG5lZ2F0aXZlIG51bWJlciBpbiBjYXNlIG9mCisgKiBlcnJvci4KKyAqLworaW50IHVud2luZF90b191c2VyKHN0cnVjdCB1bndpbmRfZnJhbWVfaW5mbyAqaW5mbykKK3sKKwl3aGlsZSAoIWFyY2hfdW53X3VzZXJfbW9kZShpbmZvKSkgeworCQlpbnQgZXJyID0gdW53aW5kKGluZm8pOworCisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wodW53aW5kX3RvX3VzZXIpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3dvcmtxdWV1ZS5jIGIva2VybmVsL3dvcmtxdWV1ZS5jCmluZGV4IDc0MGM1YWIuLjU2NWNmN2EgMTAwNjQ0Ci0tLSBhL2tlcm5lbC93b3JrcXVldWUuYworKysgYi9rZXJuZWwvd29ya3F1ZXVlLmMKQEAgLTQyOCwyMiArNDI4LDM0IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IHNjaGVkdWxlX29uX2VhY2hfY3B1KHZvaWQgKCpmdW5jKSAodm9pZCAqaW5mbyksIHZvaWQgKmluZm8pCisvKioKKyAqIHNjaGVkdWxlX29uX2VhY2hfY3B1IC0gY2FsbCBhIGZ1bmN0aW9uIG9uIGVhY2ggb25saW5lIENQVSBmcm9tIGtldmVudGQKKyAqIEBmdW5jOiB0aGUgZnVuY3Rpb24gdG8gY2FsbAorICogQGluZm86IGEgcG9pbnRlciB0byBwYXNzIHRvIGZ1bmMoKQorICoKKyAqIFJldHVybnMgemVybyBvbiBzdWNjZXNzLgorICogUmV0dXJucyAtdmUgZXJybm8gb24gZmFpbHVyZS4KKyAqCisgKiBBcHBlYXJzIHRvIGJlIHJhY3kgYWdhaW5zdCBDUFUgaG90cGx1Zy4KKyAqCisgKiBzY2hlZHVsZV9vbl9lYWNoX2NwdSgpIGlzIHZlcnkgc2xvdy4KKyAqLworaW50IHNjaGVkdWxlX29uX2VhY2hfY3B1KHZvaWQgKCpmdW5jKSh2b2lkICppbmZvKSwgdm9pZCAqaW5mbykKIHsKIAlpbnQgY3B1OwotCXN0cnVjdCB3b3JrX3N0cnVjdCAqd29yazsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmtzOwogCi0Jd29yayA9IGttYWxsb2MoTlJfQ1BVUyAqIHNpemVvZihzdHJ1Y3Qgd29ya19zdHJ1Y3QpLCBHRlBfS0VSTkVMKTsKLQotCWlmICghd29yaykKKwl3b3JrcyA9IGFsbG9jX3BlcmNwdShzdHJ1Y3Qgd29ya19zdHJ1Y3QpOworCWlmICghd29ya3MpCiAJCXJldHVybiAtRU5PTUVNOworCiAJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKLQkJSU5JVF9XT1JLKHdvcmsgKyBjcHUsIGZ1bmMsIGluZm8pOworCQlJTklUX1dPUksocGVyX2NwdV9wdHIod29ya3MsIGNwdSksIGZ1bmMsIGluZm8pOwogCQlfX3F1ZXVlX3dvcmsocGVyX2NwdV9wdHIoa2V2ZW50ZF93cS0+Y3B1X3dxLCBjcHUpLAotCQkJCXdvcmsgKyBjcHUpOworCQkJCXBlcl9jcHVfcHRyKHdvcmtzLCBjcHUpKTsKIAl9CiAJZmx1c2hfd29ya3F1ZXVlKGtldmVudGRfd3EpOwotCWtmcmVlKHdvcmspOworCWZyZWVfcGVyY3B1KHdvcmtzKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNTc4LDYgKzU5MCw4IEBACiAKIAljYXNlIENQVV9VUF9DQU5DRUxFRDoKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeSh3cSwgJndvcmtxdWV1ZXMsIGxpc3QpIHsKKwkJCWlmICghcGVyX2NwdV9wdHIod3EtPmNwdV93cSwgaG90Y3B1KS0+dGhyZWFkKQorCQkJCWNvbnRpbnVlOwogCQkJLyogVW5iaW5kIHNvIGl0IGNhbiBydW4uICovCiAJCQlrdGhyZWFkX2JpbmQocGVyX2NwdV9wdHIod3EtPmNwdV93cSwgaG90Y3B1KS0+dGhyZWFkLAogCQkJCSAgICAgYW55X29ubGluZV9jcHUoY3B1X29ubGluZV9tYXApKTsKZGlmZiAtLWdpdCBhL2xpYi9LY29uZmlnLmRlYnVnIGIvbGliL0tjb25maWcuZGVidWcKaW5kZXggY2NiMGMxZi4uOGJhYjAxMCAxMDA2NDQKLS0tIGEvbGliL0tjb25maWcuZGVidWcKKysrIGIvbGliL0tjb25maWcuZGVidWcKQEAgLTE4OCwxNCArMTg4LDIyIEBACiAKIGNvbmZpZyBVTldJTkRfSU5GTwogCWJvb2wgIkNvbXBpbGUgdGhlIGtlcm5lbCB3aXRoIGZyYW1lIHVud2luZCBpbmZvcm1hdGlvbiIKLQlkZXBlbmRzIG9uICFJQTY0Ci0JZGVwZW5kcyBvbiAhTU9EVUxFUyB8fCAhKE1JUFMgfHwgUEFSSVNDIHx8IFBQQyB8fCBTVVBFUkggfHwgVjg1MCkKKwlkZXBlbmRzIG9uICFJQTY0ICYmICFQQVJJU0MKKwlkZXBlbmRzIG9uICFNT0RVTEVTIHx8ICEoTUlQUyB8fCBQUEMgfHwgU1VQRVJIIHx8IFY4NTApCiAJaGVscAogCSAgSWYgeW91IHNheSBZIGhlcmUgdGhlIHJlc3VsdGluZyBrZXJuZWwgaW1hZ2Ugd2lsbCBiZSBzbGlnaHRseSBsYXJnZXIKIAkgIGJ1dCBub3Qgc2xvd2VyLCBhbmQgaXQgd2lsbCBnaXZlIHZlcnkgdXNlZnVsIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4KIAkgIElmIHlvdSBkb24ndCBkZWJ1ZyB0aGUga2VybmVsLCB5b3UgY2FuIHNheSBOLCBidXQgd2UgbWF5IG5vdCBiZSBhYmxlCiAJICB0byBzb2x2ZSBwcm9ibGVtcyB3aXRob3V0IGZyYW1lIHVud2luZCBpbmZvcm1hdGlvbiBvciBmcmFtZSBwb2ludGVycy4KIAorY29uZmlnIFNUQUNLX1VOV0lORAorCWJvb2wgIlN0YWNrIHVud2luZCBzdXBwb3J0IgorCWRlcGVuZHMgb24gVU5XSU5EX0lORk8KKwlkZXBlbmRzIG9uIFg4NgorCWhlbHAKKwkgIFRoaXMgZW5hYmxlcyBtb3JlIHByZWNpc2Ugc3RhY2sgdHJhY2VzLCBvbWl0dGluZyBhbGwgdW5yZWxhdGVkCisJICBvY2N1cnJlbmNlcyBvZiBwb2ludGVycyBpbnRvIGtlcm5lbCBjb2RlIGZyb20gdGhlIGR1bXAuCisKIGNvbmZpZyBGT1JDRURfSU5MSU5JTkcKIAlib29sICJGb3JjZSBnY2MgdG8gaW5saW5lIGZ1bmN0aW9ucyBtYXJrZWQgJ2lubGluZSciCiAJZGVwZW5kcyBvbiBERUJVR19LRVJORUwKZGlmZiAtLWdpdCBhL2xpYi9iaXRtYXAuYyBiL2xpYi9iaXRtYXAuYwppbmRleCBlZDJhZTNiLi5kNzFlMzhjIDEwMDY0NAotLS0gYS9saWIvYml0bWFwLmMKKysrIGIvbGliL2JpdG1hcC5jCkBAIC0zMTcsMTYgKzMxNywxNiBAQAogCiAvKioKICAqIGJpdG1hcF9wYXJzZSAtIGNvbnZlcnQgYW4gQVNDSUkgaGV4IHN0cmluZyBpbnRvIGEgYml0bWFwLgotICogQGJ1ZjogcG9pbnRlciB0byBidWZmZXIgaW4gdXNlciBzcGFjZSBjb250YWluaW5nIHN0cmluZy4KLSAqIEBidWZsZW46IGJ1ZmZlciBzaXplIGluIGJ5dGVzLiAgSWYgc3RyaW5nIGlzIHNtYWxsZXIgdGhhbiB0aGlzCisgKiBAdWJ1ZjogcG9pbnRlciB0byBidWZmZXIgaW4gdXNlciBzcGFjZSBjb250YWluaW5nIHN0cmluZy4KKyAqIEB1YnVmbGVuOiBidWZmZXIgc2l6ZSBpbiBieXRlcy4gIElmIHN0cmluZyBpcyBzbWFsbGVyIHRoYW4gdGhpcwogICogICAgdGhlbiBpdCBtdXN0IGJlIHRlcm1pbmF0ZWQgd2l0aCBhIFwwLgogICogQG1hc2twOiBwb2ludGVyIHRvIGJpdG1hcCBhcnJheSB0aGF0IHdpbGwgY29udGFpbiByZXN1bHQuCiAgKiBAbm1hc2tiaXRzOiBzaXplIG9mIGJpdG1hcCwgaW4gYml0cy4KICAqCiAgKiBDb21tYXMgZ3JvdXAgaGV4IGRpZ2l0cyBpbnRvIGNodW5rcy4gIEVhY2ggY2h1bmsgZGVmaW5lcyBleGFjdGx5IDMyCiAgKiBiaXRzIG9mIHRoZSByZXN1bHRhbnQgYml0bWFzay4gIE5vIGNodW5rIG1heSBzcGVjaWZ5IGEgdmFsdWUgbGFyZ2VyCi0gKiB0aGFuIDMyIGJpdHMgKC1FT1ZFUkZMT1cpLCBhbmQgaWYgYSBjaHVuayBzcGVjaWZpZXMgYSBzbWFsbGVyIHZhbHVlCi0gKiB0aGVuIGxlYWRpbmcgMC1iaXRzIGFyZSBwcmVwZW5kZWQuICAtRUlOVkFMIGlzIHJldHVybmVkIGZvciBpbGxlZ2FsCisgKiB0aGFuIDMyIGJpdHMgKCUtRU9WRVJGTE9XKSwgYW5kIGlmIGEgY2h1bmsgc3BlY2lmaWVzIGEgc21hbGxlciB2YWx1ZQorICogdGhlbiBsZWFkaW5nIDAtYml0cyBhcmUgcHJlcGVuZGVkLiAgJS1FSU5WQUwgaXMgcmV0dXJuZWQgZm9yIGlsbGVnYWwKICAqIGNoYXJhY3RlcnMgYW5kIGZvciBncm91cGluZyBlcnJvcnMgc3VjaCBhcyAiMSwsNSIsICIsNDQiLCAiLCIgYW5kICIiLgogICogTGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSBhY2NlcHRlZCwgYnV0IG5vdCBlbWJlZGRlZCB3aGl0ZXNwYWNlLgogICovCkBAIC00NTIsOCArNDUyLDggQEAKIAogLyoqCiAgKiBiaXRtYXBfcGFyc2VsaXN0IC0gY29udmVydCBsaXN0IGZvcm1hdCBBU0NJSSBzdHJpbmcgdG8gYml0bWFwCi0gKiBAYnVmOiByZWFkIG51bC10ZXJtaW5hdGVkIHVzZXIgc3RyaW5nIGZyb20gdGhpcyBidWZmZXIKLSAqIEBtYXNrOiB3cml0ZSByZXN1bHRpbmcgbWFzayBoZXJlCisgKiBAYnA6IHJlYWQgbnVsLXRlcm1pbmF0ZWQgdXNlciBzdHJpbmcgZnJvbSB0aGlzIGJ1ZmZlcgorICogQG1hc2twOiB3cml0ZSByZXN1bHRpbmcgbWFzayBoZXJlCiAgKiBAbm1hc2tiaXRzOiBudW1iZXIgb2YgYml0cyBpbiBtYXNrIHRvIGJlIHdyaXR0ZW4KICAqCiAgKiBJbnB1dCBmb3JtYXQgaXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBkZWNpbWFsIG51bWJlcnMgYW5kCkBAIC00NjEsMTAgKzQ2MSwxMSBAQAogICogZGVjaW1hbCBudW1iZXJzLCB0aGUgc21hbGxlc3QgYW5kIGxhcmdlc3QgYml0IG51bWJlcnMgc2V0IGluCiAgKiB0aGUgcmFuZ2UuCiAgKgotICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC1lcnJubyBvbiBpbnZhbGlkIGlucHV0IHN0cmluZ3M6Ci0gKiAgICAtRUlOVkFMOiAgIHNlY29uZCBudW1iZXIgaW4gcmFuZ2Ugc21hbGxlciB0aGFuIGZpcnN0Ci0gKiAgICAtRUlOVkFMOiAgIGludmFsaWQgY2hhcmFjdGVyIGluIHN0cmluZwotICogICAgLUVSQU5HRTogICBiaXQgbnVtYmVyIHNwZWNpZmllZCB0b28gbGFyZ2UgZm9yIG1hc2sKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtZXJybm8gb24gaW52YWxpZCBpbnB1dCBzdHJpbmdzLgorICogRXJyb3IgdmFsdWVzOgorICogICAgJS1FSU5WQUw6IHNlY29uZCBudW1iZXIgaW4gcmFuZ2Ugc21hbGxlciB0aGFuIGZpcnN0CisgKiAgICAlLUVJTlZBTDogaW52YWxpZCBjaGFyYWN0ZXIgaW4gc3RyaW5nCisgKiAgICAlLUVSQU5HRTogYml0IG51bWJlciBzcGVjaWZpZWQgdG9vIGxhcmdlIGZvciBtYXNrCiAgKi8KIGludCBiaXRtYXBfcGFyc2VsaXN0KGNvbnN0IGNoYXIgKmJwLCB1bnNpZ25lZCBsb25nICptYXNrcCwgaW50IG5tYXNrYml0cykKIHsKQEAgLTYyNSwxMCArNjI2LDEwIEBACiAKIC8qKgogICogYml0bWFwX2JpdHJlbWFwIC0gQXBwbHkgbWFwIGRlZmluZWQgYnkgYSBwYWlyIG9mIGJpdG1hcHMgdG8gYSBzaW5nbGUgYml0Ci0gKglAb2xkYml0IC0gYml0IHBvc2l0aW9uIHRvIGJlIG1hcHBlZAotICogICAgICBAb2xkOiBkZWZpbmVzIGRvbWFpbiBvZiBtYXAKLSAqICAgICAgQG5ldzogZGVmaW5lcyByYW5nZSBvZiBtYXAKLSAqICAgICAgQGJpdHM6IG51bWJlciBvZiBiaXRzIGluIGVhY2ggb2YgdGhlc2UgYml0bWFwcworICoJQG9sZGJpdDogYml0IHBvc2l0aW9uIHRvIGJlIG1hcHBlZAorICoJQG9sZDogZGVmaW5lcyBkb21haW4gb2YgbWFwCisgKglAbmV3OiBkZWZpbmVzIHJhbmdlIG9mIG1hcAorICoJQGJpdHM6IG51bWJlciBvZiBiaXRzIGluIGVhY2ggb2YgdGhlc2UgYml0bWFwcwogICoKICAqIExldCBAb2xkIGFuZCBAbmV3IGRlZmluZSBhIG1hcHBpbmcgb2YgYml0IHBvc2l0aW9ucywgc3VjaCB0aGF0CiAgKiB3aGF0ZXZlciBwb3NpdGlvbiBpcyBoZWxkIGJ5IHRoZSBuLXRoIHNldCBiaXQgaW4gQG9sZCBpcyBtYXBwZWQKQEAgLTc5MCw3ICs3OTEsNyBAQAogICoKICAqIEFsbG9jYXRlIChzZXQgYml0cyBpbikgYSBzcGVjaWZpZWQgcmVnaW9uIG9mIGEgYml0bWFwLgogICoKLSAqIFJldHVybiAwIG9uIHN1Y2Nlc3MsIG9yIC1FQlVTWSBpZiBzcGVjaWZpZWQgcmVnaW9uIHdhc24ndAorICogUmV0dXJuIDAgb24gc3VjY2Vzcywgb3IgJS1FQlVTWSBpZiBzcGVjaWZpZWQgcmVnaW9uIHdhc24ndAogICogZnJlZSAobm90IGFsbCBiaXRzIHdlcmUgemVybykuCiAgKi8KIGludCBiaXRtYXBfYWxsb2NhdGVfcmVnaW9uKHVuc2lnbmVkIGxvbmcgKmJpdG1hcCwgaW50IHBvcywgaW50IG9yZGVyKQpkaWZmIC0tZ2l0IGEvbGliL2NyYy1jY2l0dC5jIGIvbGliL2NyYy1jY2l0dC5jCmluZGV4IDExNWQxNDkuLjdmNmRkNjggMTAwNjQ0Ci0tLSBhL2xpYi9jcmMtY2NpdHQuYworKysgYi9saWIvY3JjLWNjaXR0LmMKQEAgLTUzLDkgKzUzLDkgQEAKIAogLyoqCiAgKgljcmNfY2NpdHQgLSByZWNvbXB1dGUgdGhlIENSQyBmb3IgdGhlIGRhdGEgYnVmZmVyCi0gKglAY3JjIC0gcHJldmlvdXMgQ1JDIHZhbHVlCi0gKglAYnVmZmVyIC0gZGF0YSBwb2ludGVyCi0gKglAbGVuIC0gbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBidWZmZXIKKyAqCUBjcmM6IHByZXZpb3VzIENSQyB2YWx1ZQorICoJQGJ1ZmZlcjogZGF0YSBwb2ludGVyCisgKglAbGVuOiBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGJ1ZmZlcgogICovCiB1MTYgY3JjX2NjaXR0KHUxNiBjcmMsIHU4IGNvbnN0ICpidWZmZXIsIHNpemVfdCBsZW4pCiB7CmRpZmYgLS1naXQgYS9saWIvY3JjMTYuYyBiL2xpYi9jcmMxNi5jCmluZGV4IDAxMWZlNTcuLjg3MzdiMDggMTAwNjQ0Ci0tLSBhL2xpYi9jcmMxNi5jCisrKyBiL2xpYi9jcmMxNi5jCkBAIC00NywxMiArNDcsMTIgQEAKIEVYUE9SVF9TWU1CT0woY3JjMTZfdGFibGUpOwogCiAvKioKLSAqIENvbXB1dGUgdGhlIENSQy0xNiBmb3IgdGhlIGRhdGEgYnVmZmVyCisgKiBjcmMxNiAtIGNvbXB1dGUgdGhlIENSQy0xNiBmb3IgdGhlIGRhdGEgYnVmZmVyCisgKiBAY3JjOglwcmV2aW91cyBDUkMgdmFsdWUKKyAqIEBidWZmZXI6CWRhdGEgcG9pbnRlcgorICogQGxlbjoJbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBidWZmZXIKICAqCi0gKiBAcGFyYW0gY3JjICAgICBwcmV2aW91cyBDUkMgdmFsdWUKLSAqIEBwYXJhbSBidWZmZXIgIGRhdGEgcG9pbnRlcgotICogQHBhcmFtIGxlbiAgICAgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBidWZmZXIKLSAqIEByZXR1cm4gICAgICAgIHRoZSB1cGRhdGVkIENSQyB2YWx1ZQorICogUmV0dXJucyB0aGUgdXBkYXRlZCBDUkMgdmFsdWUuCiAgKi8KIHUxNiBjcmMxNih1MTYgY3JjLCB1OCBjb25zdCAqYnVmZmVyLCBzaXplX3QgbGVuKQogewpkaWZmIC0tZ2l0IGEvbGliL2NyYzMyLmMgYi9saWIvY3JjMzIuYwppbmRleCAwNjUxOThmLi4yODVmZDliIDEwMDY0NAotLS0gYS9saWIvY3JjMzIuYworKysgYi9saWIvY3JjMzIuYwpAQCAtNDIsMjAgKzQyLDIxIEBACiBNT0RVTEVfREVTQ1JJUFRJT04oIkV0aGVybmV0IENSQzMyIGNhbGN1bGF0aW9ucyIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCisvKioKKyAqIGNyYzMyX2xlKCkgLSBDYWxjdWxhdGUgYml0d2lzZSBsaXR0bGUtZW5kaWFuIEV0aGVybmV0IEFVVE9ESU4gSUkgQ1JDMzIKKyAqIEBjcmM6IHNlZWQgdmFsdWUgZm9yIGNvbXB1dGF0aW9uLiAgfjAgZm9yIEV0aGVybmV0LCBzb21ldGltZXMgMCBmb3IKKyAqCW90aGVyIHVzZXMsIG9yIHRoZSBwcmV2aW91cyBjcmMzMiB2YWx1ZSBpZiBjb21wdXRpbmcgaW5jcmVtZW50YWxseS4KKyAqIEBwOiBwb2ludGVyIHRvIGJ1ZmZlciBvdmVyIHdoaWNoIENSQyBpcyBydW4KKyAqIEBsZW46IGxlbmd0aCBvZiBidWZmZXIgQHAKKyAqLwordTMyIF9fYXR0cmlidXRlX3B1cmVfXyBjcmMzMl9sZSh1MzIgY3JjLCB1bnNpZ25lZCBjaGFyIGNvbnN0ICpwLCBzaXplX3QgbGVuKTsKKwogI2lmIENSQ19MRV9CSVRTID09IDEKIC8qCiAgKiBJbiBmYWN0LCB0aGUgdGFibGUtYmFzZWQgY29kZSB3aWxsIHdvcmsgaW4gdGhpcyBjYXNlLCBidXQgaXQgY2FuIGJlCiAgKiBzaW1wbGlmaWVkIGJ5IGlubGluaW5nIHRoZSB0YWJsZSBpbiA/OiBmb3JtLgogICovCiAKLS8qKgotICogY3JjMzJfbGUoKSAtIENhbGN1bGF0ZSBiaXR3aXNlIGxpdHRsZS1lbmRpYW4gRXRoZXJuZXQgQVVUT0RJTiBJSSBDUkMzMgotICogQGNyYyAtIHNlZWQgdmFsdWUgZm9yIGNvbXB1dGF0aW9uLiAgfjAgZm9yIEV0aGVybmV0LCBzb21ldGltZXMgMCBmb3IKLSAqICAgICAgICBvdGhlciB1c2VzLCBvciB0aGUgcHJldmlvdXMgY3JjMzIgdmFsdWUgaWYgY29tcHV0aW5nIGluY3JlbWVudGFsbHkuCi0gKiBAcCAgIC0gcG9pbnRlciB0byBidWZmZXIgb3ZlciB3aGljaCBDUkMgaXMgcnVuCi0gKiBAbGVuIC0gbGVuZ3RoIG9mIGJ1ZmZlciBAcAotICogCi0gKi8KIHUzMiBfX2F0dHJpYnV0ZV9wdXJlX18gY3JjMzJfbGUodTMyIGNyYywgdW5zaWduZWQgY2hhciBjb25zdCAqcCwgc2l6ZV90IGxlbikKIHsKIAlpbnQgaTsKQEAgLTY4LDE0ICs2OSw2IEBACiB9CiAjZWxzZQkJCQkvKiBUYWJsZS1iYXNlZCBhcHByb2FjaCAqLwogCi0vKioKLSAqIGNyYzMyX2xlKCkgLSBDYWxjdWxhdGUgYml0d2lzZSBsaXR0bGUtZW5kaWFuIEV0aGVybmV0IEFVVE9ESU4gSUkgQ1JDMzIKLSAqIEBjcmMgLSBzZWVkIHZhbHVlIGZvciBjb21wdXRhdGlvbi4gIH4wIGZvciBFdGhlcm5ldCwgc29tZXRpbWVzIDAgZm9yCi0gKiAgICAgICAgb3RoZXIgdXNlcywgb3IgdGhlIHByZXZpb3VzIGNyYzMyIHZhbHVlIGlmIGNvbXB1dGluZyBpbmNyZW1lbnRhbGx5LgotICogQHAgICAtIHBvaW50ZXIgdG8gYnVmZmVyIG92ZXIgd2hpY2ggQ1JDIGlzIHJ1bgotICogQGxlbiAtIGxlbmd0aCBvZiBidWZmZXIgQHAKLSAqIAotICovCiB1MzIgX19hdHRyaWJ1dGVfcHVyZV9fIGNyYzMyX2xlKHUzMiBjcmMsIHVuc2lnbmVkIGNoYXIgY29uc3QgKnAsIHNpemVfdCBsZW4pCiB7CiAjIGlmIENSQ19MRV9CSVRTID09IDgKQEAgLTE0NSwyMCArMTM4LDIxIEBACiB9CiAjZW5kaWYKIAorLyoqCisgKiBjcmMzMl9iZSgpIC0gQ2FsY3VsYXRlIGJpdHdpc2UgYmlnLWVuZGlhbiBFdGhlcm5ldCBBVVRPRElOIElJIENSQzMyCisgKiBAY3JjOiBzZWVkIHZhbHVlIGZvciBjb21wdXRhdGlvbi4gIH4wIGZvciBFdGhlcm5ldCwgc29tZXRpbWVzIDAgZm9yCisgKglvdGhlciB1c2VzLCBvciB0aGUgcHJldmlvdXMgY3JjMzIgdmFsdWUgaWYgY29tcHV0aW5nIGluY3JlbWVudGFsbHkuCisgKiBAcDogcG9pbnRlciB0byBidWZmZXIgb3ZlciB3aGljaCBDUkMgaXMgcnVuCisgKiBAbGVuOiBsZW5ndGggb2YgYnVmZmVyIEBwCisgKi8KK3UzMiBfX2F0dHJpYnV0ZV9wdXJlX18gY3JjMzJfYmUodTMyIGNyYywgdW5zaWduZWQgY2hhciBjb25zdCAqcCwgc2l6ZV90IGxlbik7CisKICNpZiBDUkNfQkVfQklUUyA9PSAxCiAvKgogICogSW4gZmFjdCwgdGhlIHRhYmxlLWJhc2VkIGNvZGUgd2lsbCB3b3JrIGluIHRoaXMgY2FzZSwgYnV0IGl0IGNhbiBiZQogICogc2ltcGxpZmllZCBieSBpbmxpbmluZyB0aGUgdGFibGUgaW4gPzogZm9ybS4KICAqLwogCi0vKioKLSAqIGNyYzMyX2JlKCkgLSBDYWxjdWxhdGUgYml0d2lzZSBiaWctZW5kaWFuIEV0aGVybmV0IEFVVE9ESU4gSUkgQ1JDMzIKLSAqIEBjcmMgLSBzZWVkIHZhbHVlIGZvciBjb21wdXRhdGlvbi4gIH4wIGZvciBFdGhlcm5ldCwgc29tZXRpbWVzIDAgZm9yCi0gKiAgICAgICAgb3RoZXIgdXNlcywgb3IgdGhlIHByZXZpb3VzIGNyYzMyIHZhbHVlIGlmIGNvbXB1dGluZyBpbmNyZW1lbnRhbGx5LgotICogQHAgICAtIHBvaW50ZXIgdG8gYnVmZmVyIG92ZXIgd2hpY2ggQ1JDIGlzIHJ1bgotICogQGxlbiAtIGxlbmd0aCBvZiBidWZmZXIgQHAKLSAqIAotICovCiB1MzIgX19hdHRyaWJ1dGVfcHVyZV9fIGNyYzMyX2JlKHUzMiBjcmMsIHVuc2lnbmVkIGNoYXIgY29uc3QgKnAsIHNpemVfdCBsZW4pCiB7CiAJaW50IGk7CkBAIC0xNzMsMTQgKzE2Nyw2IEBACiB9CiAKICNlbHNlCQkJCS8qIFRhYmxlLWJhc2VkIGFwcHJvYWNoICovCi0vKioKLSAqIGNyYzMyX2JlKCkgLSBDYWxjdWxhdGUgYml0d2lzZSBiaWctZW5kaWFuIEV0aGVybmV0IEFVVE9ESU4gSUkgQ1JDMzIKLSAqIEBjcmMgLSBzZWVkIHZhbHVlIGZvciBjb21wdXRhdGlvbi4gIH4wIGZvciBFdGhlcm5ldCwgc29tZXRpbWVzIDAgZm9yCi0gKiAgICAgICAgb3RoZXIgdXNlcywgb3IgdGhlIHByZXZpb3VzIGNyYzMyIHZhbHVlIGlmIGNvbXB1dGluZyBpbmNyZW1lbnRhbGx5LgotICogQHAgICAtIHBvaW50ZXIgdG8gYnVmZmVyIG92ZXIgd2hpY2ggQ1JDIGlzIHJ1bgotICogQGxlbiAtIGxlbmd0aCBvZiBidWZmZXIgQHAKLSAqIAotICovCiB1MzIgX19hdHRyaWJ1dGVfcHVyZV9fIGNyYzMyX2JlKHUzMiBjcmMsIHVuc2lnbmVkIGNoYXIgY29uc3QgKnAsIHNpemVfdCBsZW4pCiB7CiAjIGlmIENSQ19CRV9CSVRTID09IDgKQEAgLTI0OSw2ICsyMzUsMTAgQEAKIH0KICNlbmRpZgogCisvKioKKyAqIGJpdHJldmVyc2UgLSByZXZlcnNlIHRoZSBvcmRlciBvZiBiaXRzIGluIGEgdTMyIHZhbHVlCisgKiBAeDogdmFsdWUgdG8gYmUgYml0LXJldmVyc2VkCisgKi8KIHUzMiBiaXRyZXZlcnNlKHUzMiB4KQogewogCXggPSAoeCA+PiAxNikgfCAoeCA8PCAxNik7CmRpZmYgLS1naXQgYS9saWIvaWRyLmMgYi9saWIvaWRyLmMKaW5kZXggZDIyNjI1OS4uNGQwOTY4MSAxMDA2NDQKLS0tIGEvbGliL2lkci5jCisrKyBiL2xpYi9pZHIuYwpAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNlbmRpZgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2lkci5oPgogCkBAIC00OCwxNSArNDksMjEgQEAKIAlyZXR1cm4ocCk7CiB9CiAKKy8qIG9ubHkgY2FsbGVkIHdoZW4gaWRwLT5sb2NrIGlzIGhlbGQgKi8KK3N0YXRpYyB2b2lkIF9fZnJlZV9sYXllcihzdHJ1Y3QgaWRyICppZHAsIHN0cnVjdCBpZHJfbGF5ZXIgKnApCit7CisJcC0+YXJ5WzBdID0gaWRwLT5pZF9mcmVlOworCWlkcC0+aWRfZnJlZSA9IHA7CisJaWRwLT5pZF9mcmVlX2NudCsrOworfQorCiBzdGF0aWMgdm9pZCBmcmVlX2xheWVyKHN0cnVjdCBpZHIgKmlkcCwgc3RydWN0IGlkcl9sYXllciAqcCkKIHsKIAkvKgogCSAqIERlcGVuZHMgb24gdGhlIHJldHVybiBlbGVtZW50IGJlaW5nIHplcm9lZC4KIAkgKi8KIAlzcGluX2xvY2soJmlkcC0+bG9jayk7Ci0JcC0+YXJ5WzBdID0gaWRwLT5pZF9mcmVlOwotCWlkcC0+aWRfZnJlZSA9IHA7Ci0JaWRwLT5pZF9mcmVlX2NudCsrOworCV9fZnJlZV9sYXllcihpZHAsIHApOwogCXNwaW5fdW5sb2NrKCZpZHAtPmxvY2spOwogfQogCkBAIC0xODQsMTIgKzE5MSwxNCBAQAogCQkJICogVGhlIGFsbG9jYXRpb24gZmFpbGVkLiAgSWYgd2UgYnVpbHQgcGFydCBvZgogCQkJICogdGhlIHN0cnVjdHVyZSB0ZWFyIGl0IGRvd24uCiAJCQkgKi8KKwkJCXNwaW5fbG9jaygmaWRwLT5sb2NrKTsKIAkJCWZvciAobmV3ID0gcDsgcCAmJiBwICE9IGlkcC0+dG9wOyBuZXcgPSBwKSB7CiAJCQkJcCA9IHAtPmFyeVswXTsKIAkJCQluZXctPmFyeVswXSA9IE5VTEw7CiAJCQkJbmV3LT5iaXRtYXAgPSBuZXctPmNvdW50ID0gMDsKLQkJCQlmcmVlX2xheWVyKGlkcCwgbmV3KTsKKwkJCQlfX2ZyZWVfbGF5ZXIoaWRwLCBuZXcpOwogCQkJfQorCQkJc3Bpbl91bmxvY2soJmlkcC0+bG9jayk7CiAJCQlyZXR1cm4gLTE7CiAJCX0KIAkJbmV3LT5hcnlbMF0gPSBwOwpAQCAtMzkwLDYgKzM5OSw0OCBAQAogfQogRVhQT1JUX1NZTUJPTChpZHJfZmluZCk7CiAKKy8qKgorICogaWRyX3JlcGxhY2UgLSByZXBsYWNlIHBvaW50ZXIgZm9yIGdpdmVuIGlkCisgKiBAaWRwOiBpZHIgaGFuZGxlCisgKiBAcHRyOiBwb2ludGVyIHlvdSB3YW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgaWQKKyAqIEBpZDogbG9va3VwIGtleQorICoKKyAqIFJlcGxhY2UgdGhlIHBvaW50ZXIgcmVnaXN0ZXJlZCB3aXRoIGFuIGlkIGFuZCByZXR1cm4gdGhlIG9sZCB2YWx1ZS4KKyAqIEEgLUVOT0VOVCByZXR1cm4gaW5kaWNhdGVzIHRoYXQgQGlkIHdhcyBub3QgZm91bmQuCisgKiBBIC1FSU5WQUwgcmV0dXJuIGluZGljYXRlcyB0aGF0IEBpZCB3YXMgbm90IHdpdGhpbiB2YWxpZCBjb25zdHJhaW50cy4KKyAqCisgKiBUaGUgY2FsbGVyIG11c3Qgc2VyaWFsaXplIHZzIGlkcl9maW5kKCksIGlkcl9nZXRfbmV3KCksIGFuZCBpZHJfcmVtb3ZlKCkuCisgKi8KK3ZvaWQgKmlkcl9yZXBsYWNlKHN0cnVjdCBpZHIgKmlkcCwgdm9pZCAqcHRyLCBpbnQgaWQpCit7CisJaW50IG47CisJc3RydWN0IGlkcl9sYXllciAqcCwgKm9sZF9wOworCisJbiA9IGlkcC0+bGF5ZXJzICogSURSX0JJVFM7CisJcCA9IGlkcC0+dG9wOworCisJaWQgJj0gTUFYX0lEX01BU0s7CisKKwlpZiAoaWQgPj0gKDEgPDwgbikpCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCisJbiAtPSBJRFJfQklUUzsKKwl3aGlsZSAoKG4gPiAwKSAmJiBwKSB7CisJCXAgPSBwLT5hcnlbKGlkID4+IG4pICYgSURSX01BU0tdOworCQluIC09IElEUl9CSVRTOworCX0KKworCW4gPSBpZCAmIElEUl9NQVNLOworCWlmICh1bmxpa2VseShwID09IE5VTEwgfHwgIXRlc3RfYml0KG4sICZwLT5iaXRtYXApKSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT0VOVCk7CisKKwlvbGRfcCA9IHAtPmFyeVtuXTsKKwlwLT5hcnlbbl0gPSBwdHI7CisKKwlyZXR1cm4gb2xkX3A7Cit9CitFWFBPUlRfU1lNQk9MKGlkcl9yZXBsYWNlKTsKKwogc3RhdGljIHZvaWQgaWRyX2NhY2hlX2N0b3Iodm9pZCAqIGlkcl9sYXllciwga21lbV9jYWNoZV90ICppZHJfbGF5ZXJfY2FjaGUsCiAJCXVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7CmRpZmYgLS1naXQgYS9saWIva2VybmVsX2xvY2suYyBiL2xpYi9rZXJuZWxfbG9jay5jCmluZGV4IGNiNTQ5MGUuLmU3MTNlODYgMTAwNjQ0Ci0tLSBhL2xpYi9rZXJuZWxfbG9jay5jCisrKyBiL2xpYi9rZXJuZWxfbG9jay5jCkBAIC0xNCw3ICsxNCw3IEBACiAgKiBUaGUgJ2JpZyBrZXJuZWwgc2VtYXBob3JlJwogICoKICAqIFRoaXMgbXV0ZXggaXMgdGFrZW4gYW5kIHJlbGVhc2VkIHJlY3Vyc2l2ZWx5IGJ5IGxvY2tfa2VybmVsKCkKLSAqIGFuZCB1bmxvY2tfa2VybmVsKCkuICBJdCBpcyB0cmFuc3BhcmVudGx5IGRyb3BwZWQgYW5kIHJlYXF1aXJlZAorICogYW5kIHVubG9ja19rZXJuZWwoKS4gIEl0IGlzIHRyYW5zcGFyZW50bHkgZHJvcHBlZCBhbmQgcmVhY3F1aXJlZAogICogb3ZlciBzY2hlZHVsZSgpLiAgSXQgaXMgdXNlZCB0byBwcm90ZWN0IGxlZ2FjeSBjb2RlIHRoYXQgaGFzbid0CiAgKiBiZWVuIG1pZ3JhdGVkIHRvIGEgcHJvcGVyIGxvY2tpbmcgZGVzaWduIHlldC4KICAqCkBAIC05Miw3ICs5Miw3IEBACiAgKiBUaGUgJ2JpZyBrZXJuZWwgbG9jaycKICAqCiAgKiBUaGlzIHNwaW5sb2NrIGlzIHRha2VuIGFuZCByZWxlYXNlZCByZWN1cnNpdmVseSBieSBsb2NrX2tlcm5lbCgpCi0gKiBhbmQgdW5sb2NrX2tlcm5lbCgpLiAgSXQgaXMgdHJhbnNwYXJlbnRseSBkcm9wcGVkIGFuZCByZWFxdWlyZWQKKyAqIGFuZCB1bmxvY2tfa2VybmVsKCkuICBJdCBpcyB0cmFuc3BhcmVudGx5IGRyb3BwZWQgYW5kIHJlYWNxdWlyZWQKICAqIG92ZXIgc2NoZWR1bGUoKS4gIEl0IGlzIHVzZWQgdG8gcHJvdGVjdCBsZWdhY3kgY29kZSB0aGF0IGhhc24ndAogICogYmVlbiBtaWdyYXRlZCB0byBhIHByb3BlciBsb2NraW5nIGRlc2lnbiB5ZXQuCiAgKgpkaWZmIC0tZ2l0IGEvbGliL2xpYmNyYzMyYy5jIGIvbGliL2xpYmNyYzMyYy5jCmluZGV4IDUyYjZkYzEuLjYwZjQ2ODAgMTAwNjQ0Ci0tLSBhL2xpYi9saWJjcmMzMmMuYworKysgYi9saWIvbGliY3JjMzJjLmMKQEAgLTg4LDcgKzg4LDcgQEAKICAqIHJlZmxlY3Qgb3V0cHV0IGJ5dGVzID0gdHJ1ZQogICovCiAKLXN0YXRpYyB1MzIgY3JjMzJjX3RhYmxlWzI1Nl0gPSB7CitzdGF0aWMgY29uc3QgdTMyIGNyYzMyY190YWJsZVsyNTZdID0gewogCTB4MDAwMDAwMDBMLCAweEYyNkI4MzAzTCwgMHhFMTNCNzBGN0wsIDB4MTM1MEYzRjRMLAogCTB4Qzc5QTk3MUZMLCAweDM1RjExNDFDTCwgMHgyNkExRTdFOEwsIDB4RDRDQTY0RUJMLAogCTB4OEFEOTU4Q0ZMLCAweDc4QjJEQkNDTCwgMHg2QkUyMjgzOEwsIDB4OTk4OUFCM0JMLApkaWZmIC0tZ2l0IGEvbGliL3JhZGl4LXRyZWUuYyBiL2xpYi9yYWRpeC10cmVlLmMKaW5kZXggYjMyZWZhZS4uNjM3ZDU1NiAxMDA2NDQKLS0tIGEvbGliL3JhZGl4LXRyZWUuYworKysgYi9saWIvcmFkaXgtdHJlZS5jCkBAIC01MzAsNyArNTMwLDcgQEAKIAkJCWludCByZXQgPSB0YWdfZ2V0KHNsb3QsIHRhZywgb2Zmc2V0KTsKIAogCQkJQlVHX09OKHJldCAmJiBzYXdfdW5zZXRfdGFnKTsKLQkJCXJldHVybiByZXQ7CisJCQlyZXR1cm4gISFyZXQ7CiAJCX0KIAkJc2xvdCA9IHNsb3QtPnNsb3RzW29mZnNldF07CiAJCXNoaWZ0IC09IFJBRElYX1RSRUVfTUFQX1NISUZUOwpkaWZmIC0tZ2l0IGEvbGliL3JlZWRfc29sb21vbi9yZWVkX3NvbG9tb24uYyBiL2xpYi9yZWVkX3NvbG9tb24vcmVlZF9zb2xvbW9uLmMKaW5kZXggZjhhYzlmYS4uMmNjMTFmYSAxMDA2NDQKLS0tIGEvbGliL3JlZWRfc29sb21vbi9yZWVkX3NvbG9tb24uYworKysgYi9saWIvcmVlZF9zb2xvbW9uL3JlZWRfc29sb21vbi5jCkBAIC01NCw3ICs1NCw2IEBACiAKIC8qKgogICogcnNfaW5pdCAtIEluaXRpYWxpemUgYSBSZWVkLVNvbG9tb24gY29kZWMKLSAqCiAgKiBAc3ltc2l6ZToJc3ltYm9sIHNpemUsIGJpdHMgKDEtOCkKICAqIEBnZnBvbHk6CUZpZWxkIGdlbmVyYXRvciBwb2x5bm9taWFsIGNvZWZmaWNpZW50cwogICogQGZjcjoJZmlyc3Qgcm9vdCBvZiBSUyBjb2RlIGdlbmVyYXRvciBwb2x5bm9taWFsLCBpbmRleCBmb3JtCkBAIC02Miw3ICs2MSw3IEBACiAgKiBAbnJvb3RzOglSUyBjb2RlIGdlbmVyYXRvciBwb2x5bm9taWFsIGRlZ3JlZSAobnVtYmVyIG9mIHJvb3RzKQogICoKICAqIEFsbG9jYXRlIGEgY29udHJvbCBzdHJ1Y3R1cmUgYW5kIHRoZSBwb2x5bm9tIGFycmF5cyBmb3IgZmFzdGVyCi0gKiBlbi9kZWNvZGluZy4gRmlsbCB0aGUgYXJyYXlzIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gcGFyYW1ldGVycworICogZW4vZGVjb2RpbmcuIEZpbGwgdGhlIGFycmF5cyBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIHBhcmFtZXRlcnMuCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgcnNfY29udHJvbCAqcnNfaW5pdChpbnQgc3ltc2l6ZSwgaW50IGdmcG9seSwgaW50IGZjciwKIAkJCQkgICBpbnQgcHJpbSwgaW50IG5yb290cykKQEAgLTE1NSw4ICsxNTQsNyBAQAogCiAKIC8qKgotICogIGZyZWVfcnMgLSBGcmVlIHRoZSBycyBjb250cm9sIHN0cnVjdHVyZSwgaWYgaXRzIG5vdCBsb25nZXIgdXNlZAotICoKKyAqICBmcmVlX3JzIC0gRnJlZSB0aGUgcnMgY29udHJvbCBzdHJ1Y3R1cmUsIGlmIGl0IGlzIG5vIGxvbmdlciB1c2VkCiAgKiAgQHJzOgl0aGUgY29udHJvbCBzdHJ1Y3R1cmUgd2hpY2ggaXMgbm90IGxvbmdlciB1c2VkIGJ5IHRoZQogICoJCWNhbGxlcgogICovCkBAIC0xNzYsNyArMTc0LDYgQEAKIAogLyoqCiAgKiBpbml0X3JzIC0gRmluZCBhIG1hdGNoaW5nIG9yIGFsbG9jYXRlIGEgbmV3IHJzIGNvbnRyb2wgc3RydWN0dXJlCi0gKgogICogIEBzeW1zaXplOgl0aGUgc3ltYm9sIHNpemUgKG51bWJlciBvZiBiaXRzKQogICogIEBnZnBvbHk6CXRoZSBleHRlbmRlZCBHYWxvaXMgZmllbGQgZ2VuZXJhdG9yIHBvbHlub21pYWwgY29lZmZpY2llbnRzLAogICoJCXdpdGggdGhlIDB0aCBjb2VmZmljaWVudCBpbiB0aGUgbG93IG9yZGVyIGJpdC4gVGhlIHBvbHlub21pYWwKQEAgLTIzNiw3ICsyMzMsNiBAQAogI2lmZGVmIENPTkZJR19SRUVEX1NPTE9NT05fRU5DOAogLyoqCiAgKiAgZW5jb2RlX3JzOCAtIENhbGN1bGF0ZSB0aGUgcGFyaXR5IGZvciBkYXRhIHZhbHVlcyAoOGJpdCBkYXRhIHdpZHRoKQotICoKICAqICBAcnM6CXRoZSBycyBjb250cm9sIHN0cnVjdHVyZQogICogIEBkYXRhOglkYXRhIGZpZWxkIG9mIGEgZ2l2ZW4gdHlwZQogICogIEBsZW46CWRhdGEgbGVuZ3RoCkBAIC0yNTgsNyArMjU0LDYgQEAKICNpZmRlZiBDT05GSUdfUkVFRF9TT0xPTU9OX0RFQzgKIC8qKgogICogIGRlY29kZV9yczggLSBEZWNvZGUgY29kZXdvcmQgKDhiaXQgZGF0YSB3aWR0aCkKLSAqCiAgKiAgQHJzOgl0aGUgcnMgY29udHJvbCBzdHJ1Y3R1cmUKICAqICBAZGF0YToJZGF0YSBmaWVsZCBvZiBhIGdpdmVuIHR5cGUKICAqICBAcGFyOglyZWNlaXZlZCBwYXJpdHkgZGF0YSBmaWVsZApAQCAtMjg1LDcgKzI4MCw2IEBACiAjaWZkZWYgQ09ORklHX1JFRURfU09MT01PTl9FTkMxNgogLyoqCiAgKiAgZW5jb2RlX3JzMTYgLSBDYWxjdWxhdGUgdGhlIHBhcml0eSBmb3IgZGF0YSB2YWx1ZXMgKDE2Yml0IGRhdGEgd2lkdGgpCi0gKgogICogIEByczoJdGhlIHJzIGNvbnRyb2wgc3RydWN0dXJlCiAgKiAgQGRhdGE6CWRhdGEgZmllbGQgb2YgYSBnaXZlbiB0eXBlCiAgKiAgQGxlbjoJZGF0YSBsZW5ndGgKQEAgLTMwNSw3ICsyOTksNiBAQAogI2lmZGVmIENPTkZJR19SRUVEX1NPTE9NT05fREVDMTYKIC8qKgogICogIGRlY29kZV9yczE2IC0gRGVjb2RlIGNvZGV3b3JkICgxNmJpdCBkYXRhIHdpZHRoKQotICoKICAqICBAcnM6CXRoZSBycyBjb250cm9sIHN0cnVjdHVyZQogICogIEBkYXRhOglkYXRhIGZpZWxkIG9mIGEgZ2l2ZW4gdHlwZQogICogIEBwYXI6CXJlY2VpdmVkIHBhcml0eSBkYXRhIGZpZWxkCmRpZmYgLS1naXQgYS9saWIvdnNwcmludGYuYyBiL2xpYi92c3ByaW50Zi5jCmluZGV4IGIwN2RiNWMuLjc5NzQyOGEgMTAwNjQ0Ci0tLSBhL2xpYi92c3ByaW50Zi5jCisrKyBiL2xpYi92c3ByaW50Zi5jCkBAIC0xODcsNDkgKzE4Nyw0OSBAQAogCXNpemUgLT0gcHJlY2lzaW9uOwogCWlmICghKHR5cGUmKFpFUk9QQUQrTEVGVCkpKSB7CiAJCXdoaWxlKHNpemUtLT4wKSB7Ci0JCQlpZiAoYnVmIDw9IGVuZCkKKwkJCWlmIChidWYgPCBlbmQpCiAJCQkJKmJ1ZiA9ICcgJzsKIAkJCSsrYnVmOwogCQl9CiAJfQogCWlmIChzaWduKSB7Ci0JCWlmIChidWYgPD0gZW5kKQorCQlpZiAoYnVmIDwgZW5kKQogCQkJKmJ1ZiA9IHNpZ247CiAJCSsrYnVmOwogCX0KIAlpZiAodHlwZSAmIFNQRUNJQUwpIHsKIAkJaWYgKGJhc2U9PTgpIHsKLQkJCWlmIChidWYgPD0gZW5kKQorCQkJaWYgKGJ1ZiA8IGVuZCkKIAkJCQkqYnVmID0gJzAnOwogCQkJKytidWY7CiAJCX0gZWxzZSBpZiAoYmFzZT09MTYpIHsKLQkJCWlmIChidWYgPD0gZW5kKQorCQkJaWYgKGJ1ZiA8IGVuZCkKIAkJCQkqYnVmID0gJzAnOwogCQkJKytidWY7Ci0JCQlpZiAoYnVmIDw9IGVuZCkKKwkJCWlmIChidWYgPCBlbmQpCiAJCQkJKmJ1ZiA9IGRpZ2l0c1szM107CiAJCQkrK2J1ZjsKIAkJfQogCX0KIAlpZiAoISh0eXBlICYgTEVGVCkpIHsKIAkJd2hpbGUgKHNpemUtLSA+IDApIHsKLQkJCWlmIChidWYgPD0gZW5kKQorCQkJaWYgKGJ1ZiA8IGVuZCkKIAkJCQkqYnVmID0gYzsKIAkJCSsrYnVmOwogCQl9CiAJfQogCXdoaWxlIChpIDwgcHJlY2lzaW9uLS0pIHsKLQkJaWYgKGJ1ZiA8PSBlbmQpCisJCWlmIChidWYgPCBlbmQpCiAJCQkqYnVmID0gJzAnOwogCQkrK2J1ZjsKIAl9CiAJd2hpbGUgKGktLSA+IDApIHsKLQkJaWYgKGJ1ZiA8PSBlbmQpCisJCWlmIChidWYgPCBlbmQpCiAJCQkqYnVmID0gdG1wW2ldOwogCQkrK2J1ZjsKIAl9CiAJd2hpbGUgKHNpemUtLSA+IDApIHsKLQkJaWYgKGJ1ZiA8PSBlbmQpCisJCWlmIChidWYgPCBlbmQpCiAJCQkqYnVmID0gJyAnOwogCQkrK2J1ZjsKIAl9CkBAIC0yNzIsNyArMjcyLDggQEAKIAkJCQkvKiAneicgY2hhbmdlZCB0byAnWicgLS1kYXZpZG0gMS8yNS85OSAqLwogCQkJCS8qICd0JyBhZGRlZCBmb3IgcHRyZGlmZl90ICovCiAKLQkvKiBSZWplY3Qgb3V0LW9mLXJhbmdlIHZhbHVlcyBlYXJseSAqLworCS8qIFJlamVjdCBvdXQtb2YtcmFuZ2UgdmFsdWVzIGVhcmx5LiAgTGFyZ2UgcG9zaXRpdmUgc2l6ZXMgYXJlCisJICAgdXNlZCBmb3IgdW5rbm93biBidWZmZXIgc2l6ZXMuICovCiAJaWYgKHVubGlrZWx5KChpbnQpIHNpemUgPCAwKSkgewogCQkvKiBUaGVyZSBjYW4gYmUgb25seSBvbmUuLiAqLwogCQlzdGF0aWMgaW50IHdhcm4gPSAxOwpAQCAtMjgyLDE2ICsyODMsMTcgQEAKIAl9CiAKIAlzdHIgPSBidWY7Ci0JZW5kID0gYnVmICsgc2l6ZSAtIDE7CisJZW5kID0gYnVmICsgc2l6ZTsKIAotCWlmIChlbmQgPCBidWYgLSAxKSB7Ci0JCWVuZCA9ICgodm9pZCAqKSAtMSk7Ci0JCXNpemUgPSBlbmQgLSBidWYgKyAxOworCS8qIE1ha2Ugc3VyZSBlbmQgaXMgYWx3YXlzID49IGJ1ZiAqLworCWlmIChlbmQgPCBidWYpIHsKKwkJZW5kID0gKCh2b2lkICopLTEpOworCQlzaXplID0gZW5kIC0gYnVmOwogCX0KIAogCWZvciAoOyAqZm10IDsgKytmbXQpIHsKIAkJaWYgKCpmbXQgIT0gJyUnKSB7Ci0JCQlpZiAoc3RyIDw9IGVuZCkKKwkJCWlmIChzdHIgPCBlbmQpCiAJCQkJKnN0ciA9ICpmbXQ7CiAJCQkrK3N0cjsKIAkJCWNvbnRpbnVlOwpAQCAtMzU3LDE3ICszNTksMTcgQEAKIAkJCWNhc2UgJ2MnOgogCQkJCWlmICghKGZsYWdzICYgTEVGVCkpIHsKIAkJCQkJd2hpbGUgKC0tZmllbGRfd2lkdGggPiAwKSB7Ci0JCQkJCQlpZiAoc3RyIDw9IGVuZCkKKwkJCQkJCWlmIChzdHIgPCBlbmQpCiAJCQkJCQkJKnN0ciA9ICcgJzsKIAkJCQkJCSsrc3RyOwogCQkJCQl9CiAJCQkJfQogCQkJCWMgPSAodW5zaWduZWQgY2hhcikgdmFfYXJnKGFyZ3MsIGludCk7Ci0JCQkJaWYgKHN0ciA8PSBlbmQpCisJCQkJaWYgKHN0ciA8IGVuZCkKIAkJCQkJKnN0ciA9IGM7CiAJCQkJKytzdHI7CiAJCQkJd2hpbGUgKC0tZmllbGRfd2lkdGggPiAwKSB7Ci0JCQkJCWlmIChzdHIgPD0gZW5kKQorCQkJCQlpZiAoc3RyIDwgZW5kKQogCQkJCQkJKnN0ciA9ICcgJzsKIAkJCQkJKytzdHI7CiAJCQkJfQpAQCAtMzgyLDE4ICszODQsMTggQEAKIAogCQkJCWlmICghKGZsYWdzICYgTEVGVCkpIHsKIAkJCQkJd2hpbGUgKGxlbiA8IGZpZWxkX3dpZHRoLS0pIHsKLQkJCQkJCWlmIChzdHIgPD0gZW5kKQorCQkJCQkJaWYgKHN0ciA8IGVuZCkKIAkJCQkJCQkqc3RyID0gJyAnOwogCQkJCQkJKytzdHI7CiAJCQkJCX0KIAkJCQl9CiAJCQkJZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7Ci0JCQkJCWlmIChzdHIgPD0gZW5kKQorCQkJCQlpZiAoc3RyIDwgZW5kKQogCQkJCQkJKnN0ciA9ICpzOwogCQkJCQkrK3N0cjsgKytzOwogCQkJCX0KIAkJCQl3aGlsZSAobGVuIDwgZmllbGRfd2lkdGgtLSkgewotCQkJCQlpZiAoc3RyIDw9IGVuZCkKKwkJCQkJaWYgKHN0ciA8IGVuZCkKIAkJCQkJCSpzdHIgPSAnICc7CiAJCQkJCSsrc3RyOwogCQkJCX0KQEAgLTQyNiw3ICs0MjgsNyBAQAogCQkJCWNvbnRpbnVlOwogCiAJCQljYXNlICclJzoKLQkJCQlpZiAoc3RyIDw9IGVuZCkKKwkJCQlpZiAoc3RyIDwgZW5kKQogCQkJCQkqc3RyID0gJyUnOwogCQkJCSsrc3RyOwogCQkJCWNvbnRpbnVlOwpAQCAtNDQ5LDExICs0NTEsMTEgQEAKIAkJCQlicmVhazsKIAogCQkJZGVmYXVsdDoKLQkJCQlpZiAoc3RyIDw9IGVuZCkKKwkJCQlpZiAoc3RyIDwgZW5kKQogCQkJCQkqc3RyID0gJyUnOwogCQkJCSsrc3RyOwogCQkJCWlmICgqZm10KSB7Ci0JCQkJCWlmIChzdHIgPD0gZW5kKQorCQkJCQlpZiAoc3RyIDwgZW5kKQogCQkJCQkJKnN0ciA9ICpmbXQ7CiAJCQkJCSsrc3RyOwogCQkJCX0gZWxzZSB7CkBAIC00ODMsMTQgKzQ4NSwxMyBAQAogCQlzdHIgPSBudW1iZXIoc3RyLCBlbmQsIG51bSwgYmFzZSwKIAkJCQlmaWVsZF93aWR0aCwgcHJlY2lzaW9uLCBmbGFncyk7CiAJfQotCWlmIChzdHIgPD0gZW5kKQotCQkqc3RyID0gJ1wwJzsKLQllbHNlIGlmIChzaXplID4gMCkKLQkJLyogZG9uJ3Qgd3JpdGUgb3V0IGEgbnVsbCBieXRlIGlmIHRoZSBidWYgc2l6ZSBpcyB6ZXJvICovCi0JCSplbmQgPSAnXDAnOwotCS8qIHRoZSB0cmFpbGluZyBudWxsIGJ5dGUgZG9lc24ndCBjb3VudCB0b3dhcmRzIHRoZSB0b3RhbAotCSogKytzdHI7Ci0JKi8KKwlpZiAoc2l6ZSA+IDApIHsKKwkJaWYgKHN0ciA8IGVuZCkKKwkJCSpzdHIgPSAnXDAnOworCQllbHNlCisJCQkqZW5kID0gJ1wwJzsKKwl9CisJLyogdGhlIHRyYWlsaW5nIG51bGwgYnl0ZSBkb2Vzbid0IGNvdW50IHRvd2FyZHMgdGhlIHRvdGFsICovCiAJcmV0dXJuIHN0ci1idWY7CiB9CiAKQEAgLTg0OCwzICs4NDksMjYgQEAKIH0KIAogRVhQT1JUX1NZTUJPTChzc2NhbmYpOworCisKKy8qIFNpbXBsaWZpZWQgYXNwcmludGYuICovCitjaGFyICprYXNwcmludGYoZ2ZwX3QgZ2ZwLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFwOworCXVuc2lnbmVkIGludCBsZW47CisJY2hhciAqcDsKKworCXZhX3N0YXJ0KGFwLCBmbXQpOworCWxlbiA9IHZzbnByaW50ZihOVUxMLCAwLCBmbXQsIGFwKTsKKwl2YV9lbmQoYXApOworCisJcCA9IGttYWxsb2MobGVuKzEsIGdmcCk7CisJaWYgKCFwKQorCQlyZXR1cm4gTlVMTDsKKwl2YV9zdGFydChhcCwgZm10KTsKKwl2c25wcmludGYocCwgbGVuKzEsIGZtdCwgYXApOworCXZhX2VuZChhcCk7CisJcmV0dXJuIHA7Cit9CisKK0VYUE9SVF9TWU1CT0woa2FzcHJpbnRmKTsKZGlmZiAtLWdpdCBhL2xpYi96bGliX2luZmxhdGUvaW5mdHJlZXMuYyBiL2xpYi96bGliX2luZmxhdGUvaW5mdHJlZXMuYwppbmRleCA2MjM0M2M1Li5kYTY2NWZiIDEwMDY0NAotLS0gYS9saWIvemxpYl9pbmZsYXRlL2luZnRyZWVzLmMKKysrIGIvbGliL3psaWJfaW5mbGF0ZS9pbmZ0cmVlcy5jCkBAIC04LDE1ICs4LDYgQEAKIAogI2RlZmluZSBNQVhCSVRTIDE1CiAKLWNvbnN0IGNoYXIgaW5mbGF0ZV9jb3B5cmlnaHRbXSA9Ci0gICAiIGluZmxhdGUgMS4yLjMgQ29weXJpZ2h0IDE5OTUtMjAwNSBNYXJrIEFkbGVyICI7Ci0vKgotICBJZiB5b3UgdXNlIHRoZSB6bGliIGxpYnJhcnkgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpcyB3ZWxjb21lCi0gIGluIHRoZSBkb2N1bWVudGF0aW9uIG9mIHlvdXIgcHJvZHVjdC4gSWYgZm9yIHNvbWUgcmVhc29uIHlvdSBjYW5ub3QKLSAgaW5jbHVkZSBzdWNoIGFuIGFja25vd2xlZGdtZW50LCBJIHdvdWxkIGFwcHJlY2lhdGUgdGhhdCB5b3Uga2VlcCB0aGlzCi0gIGNvcHlyaWdodCBzdHJpbmcgaW4gdGhlIGV4ZWN1dGFibGUgb2YgeW91ciBwcm9kdWN0LgotICovCi0KIC8qCiAgICBCdWlsZCBhIHNldCBvZiB0YWJsZXMgdG8gZGVjb2RlIHRoZSBwcm92aWRlZCBjYW5vbmljYWwgSHVmZm1hbiBjb2RlLgogICAgVGhlIGNvZGUgbGVuZ3RocyBhcmUgbGVuc1swLi5jb2Rlcy0xXS4gIFRoZSByZXN1bHQgc3RhcnRzIGF0ICp0YWJsZSwKZGlmZiAtLWdpdCBhL21tL2ZpbGVtYXAuYyBiL21tL2ZpbGVtYXAuYwppbmRleCA4MDdhNDYzZi4uOWM3MzM0YiAxMDA2NDQKLS0tIGEvbW0vZmlsZW1hcC5jCisrKyBiL21tL2ZpbGVtYXAuYwpAQCAtODI4LDYgKzgyOCwzMiBAQAogfQogRVhQT1JUX1NZTUJPTChncmFiX2NhY2hlX3BhZ2Vfbm93YWl0KTsKIAorLyoKKyAqIENEL0RWRHMgYXJlIGVycm9yIHByb25lLiBXaGVuIGEgbWVkaXVtIGVycm9yIG9jY3VycywgdGhlIGRyaXZlciBtYXkgZmFpbAorICogYSBfbGFyZ2VfIHBhcnQgb2YgdGhlIGkvbyByZXF1ZXN0LiBJbWFnaW5lIHRoZSB3b3JzdCBzY2VuYXJpbzoKKyAqCisgKiAgICAgIC0tLVJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19CX19fX19fX19fXworICogICAgICAgICBeIHJlYWRpbmcgaGVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXiBiYWQgYmxvY2soYXNzdW1lIDRrKQorICoKKyAqIHJlYWQoUikgPT4gbWlzcyA9PiByZWFkYWhlYWQoUi4uLkIpID0+IG1lZGlhIGVycm9yID0+IGZydXN0cmF0aW5nIHJldHJpZXMKKyAqID0+IGZhaWxpbmcgdGhlIHdob2xlIHJlcXVlc3QgPT4gcmVhZChSKSA9PiByZWFkKFIrMSkgPT4KKyAqIHJlYWRhaGVhZChSKzEuLi5CKzEpID0+IGJhbmcgPT4gcmVhZChSKzIpID0+IHJlYWQoUiszKSA9PgorICogcmVhZGFoZWFkKFIrMy4uLkIrMikgPT4gYmFuZyA9PiByZWFkKFIrMykgPT4gcmVhZChSKzQpID0+CisgKiByZWFkYWhlYWQoUis0Li4uQiszKSA9PiBiYW5nID0+IHJlYWQoUis0KSA9PiByZWFkKFIrNSkgPT4gLi4uLi4uCisgKgorICogSXQgaXMgZ29pbmcgaW5zYW5lLiBGaXggaXQgYnkgcXVpY2tseSBzY2FsaW5nIGRvd24gdGhlIHJlYWRhaGVhZCBzaXplLgorICovCitzdGF0aWMgdm9pZCBzaHJpbmtfcmVhZGFoZWFkX3NpemVfZWlvKHN0cnVjdCBmaWxlICpmaWxwLAorCQkJCQlzdHJ1Y3QgZmlsZV9yYV9zdGF0ZSAqcmEpCit7CisJaWYgKCFyYS0+cmFfcGFnZXMpCisJCXJldHVybjsKKworCXJhLT5yYV9wYWdlcyAvPSA0OworCXByaW50ayhLRVJOX1dBUk5JTkcgIlJlZHVjaW5nIHJlYWRhaGVhZCBzaXplIHRvICVsdUtcbiIsCisJCQlyYS0+cmFfcGFnZXMgPDwgKFBBR0VfQ0FDSEVfU0hJRlQgLSAxMCkpOworfQorCiAvKioKICAqIGRvX2dlbmVyaWNfbWFwcGluZ19yZWFkIC0gZ2VuZXJpYyBmaWxlIHJlYWQgcm91dGluZQogICogQG1hcHBpbmc6CWFkZHJlc3Nfc3BhY2UgdG8gYmUgcmVhZApAQCAtOTg1LDYgKzEwMTEsNyBAQAogCQkJCX0KIAkJCQl1bmxvY2tfcGFnZShwYWdlKTsKIAkJCQllcnJvciA9IC1FSU87CisJCQkJc2hyaW5rX3JlYWRhaGVhZF9zaXplX2VpbyhmaWxwLCAmcmEpOwogCQkJCWdvdG8gcmVhZHBhZ2VfZXJyb3I7CiAJCQl9CiAJCQl1bmxvY2tfcGFnZShwYWdlKTsKQEAgLTE1MjIsNiArMTU0OSw3IEBACiAJICogVGhpbmdzIGRpZG4ndCB3b3JrIG91dC4gUmV0dXJuIHplcm8gdG8gdGVsbCB0aGUKIAkgKiBtbSBsYXllciBzbywgcG9zc2libHkgZnJlZWluZyB0aGUgcGFnZSBjYWNoZSBwYWdlIGZpcnN0LgogCSAqLworCXNocmlua19yZWFkYWhlYWRfc2l6ZV9laW8oZmlsZSwgcmEpOwogCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKIAlyZXR1cm4gTlVMTDsKIH0KQEAgLTE4OTIsNyArMTkyMCw3IEBACiBFWFBPUlRfU1lNQk9MKHJlbW92ZV9zdWlkKTsKIAogc2l6ZV90Ci1fX2ZpbGVtYXBfY29weV9mcm9tX3VzZXJfaW92ZWMoY2hhciAqdmFkZHIsIAorX19maWxlbWFwX2NvcHlfZnJvbV91c2VyX2lvdmVjX2luYXRvbWljKGNoYXIgKnZhZGRyLAogCQkJY29uc3Qgc3RydWN0IGlvdmVjICppb3YsIHNpemVfdCBiYXNlLCBzaXplX3QgYnl0ZXMpCiB7CiAJc2l6ZV90IGNvcGllZCA9IDAsIGxlZnQgPSAwOwpAQCAtMTkwOCwxMiArMTkzNiw4IEBACiAJCXZhZGRyICs9IGNvcHk7CiAJCWlvdisrOwogCi0JCWlmICh1bmxpa2VseShsZWZ0KSkgewotCQkJLyogemVybyB0aGUgcmVzdCBvZiB0aGUgdGFyZ2V0IGxpa2UgX19jb3B5X2Zyb21fdXNlciAqLwotCQkJaWYgKGJ5dGVzKQotCQkJCW1lbXNldCh2YWRkciwgMCwgYnl0ZXMpOworCQlpZiAodW5saWtlbHkobGVmdCkpCiAJCQlicmVhazsKLQkJfQogCX0KIAlyZXR1cm4gY29waWVkIC0gbGVmdDsKIH0KZGlmZiAtLWdpdCBhL21tL2ZpbGVtYXAuaCBiL21tL2ZpbGVtYXAuaAppbmRleCA1NjgzY2RlLi41MzY5NzlmIDEwMDY0NAotLS0gYS9tbS9maWxlbWFwLmgKKysrIGIvbW0vZmlsZW1hcC5oCkBAIC0xNiwxNSArMTYsMjMgQEAKICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAKIHNpemVfdAotX19maWxlbWFwX2NvcHlfZnJvbV91c2VyX2lvdmVjKGNoYXIgKnZhZGRyLAotCQkJICAgICAgIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LAotCQkJICAgICAgIHNpemVfdCBiYXNlLAotCQkJICAgICAgIHNpemVfdCBieXRlcyk7CitfX2ZpbGVtYXBfY29weV9mcm9tX3VzZXJfaW92ZWNfaW5hdG9taWMoY2hhciAqdmFkZHIsCisJCQkJCWNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LAorCQkJCQlzaXplX3QgYmFzZSwKKwkJCQkJc2l6ZV90IGJ5dGVzKTsKIAogLyoKICAqIENvcHkgYXMgbXVjaCBhcyB3ZSBjYW4gaW50byB0aGUgcGFnZSBhbmQgcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgd2hpY2gKICAqIHdlcmUgc3VjZXNzZnVsbHkgY29waWVkLiAgSWYgYSBmYXVsdCBpcyBlbmNvdW50ZXJlZCB0aGVuIGNsZWFyIHRoZSBwYWdlCiAgKiBvdXQgdG8gKG9mZnNldCtieXRlcykgYW5kIHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdoaWNoIHdlcmUgY29waWVkLgorICoKKyAqIE5PVEU6IEZvciB0aGlzIHRvIHdvcmsgcmVsaWFibHkgd2UgcmVhbGx5IHdhbnQgY29weV9mcm9tX3VzZXJfaW5hdG9taWNfbm9jYWNoZQorICogdG8gKk5PVCogemVybyBhbnkgdGFpbCBvZiB0aGUgYnVmZmVyIHRoYXQgaXQgZmFpbGVkIHRvIGNvcHkuICBJZiBpdCBkb2VzLAorICogYW5kIGlmIHRoZSBmb2xsb3dpbmcgbm9uLWF0b21pYyBjb3B5IHN1Y2NlZWRzLCB0aGVuIHRoZXJlIGlzIGEgc21hbGwgd2luZG93CisgKiB3aGVyZSB0aGUgdGFyZ2V0IHBhZ2UgY29udGFpbnMgbmVpdGhlciB0aGUgZGF0YSBiZWZvcmUgdGhlIHdyaXRlLCBub3IgdGhlCisgKiBkYXRhIGFmdGVyIHRoZSB3cml0ZSAoaXQgY29udGFpbnMgemVybykuICBBIHJlYWQgYXQgdGhpcyB0aW1lIHdpbGwgc2VlCisgKiBkYXRhIHRoYXQgaXMgaW5jb25zaXN0ZW50IHdpdGggYW55IG9yZGVyaW5nIG9mIHRoZSByZWFkIGFuZCB0aGUgd3JpdGUuCisgKiAoVGhpcyBoYXMgYmVlbiBkZXRlY3RlZCBpbiBwcmFjdGljZSkuCiAgKi8KIHN0YXRpYyBpbmxpbmUgc2l6ZV90CiBmaWxlbWFwX2NvcHlfZnJvbV91c2VyKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIG9mZnNldCwKQEAgLTYwLDEzICs2OCwxNSBAQAogCXNpemVfdCBjb3BpZWQ7CiAKIAlrYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKLQljb3BpZWQgPSBfX2ZpbGVtYXBfY29weV9mcm9tX3VzZXJfaW92ZWMoa2FkZHIgKyBvZmZzZXQsIGlvdiwKLQkJCQkJCWJhc2UsIGJ5dGVzKTsKKwljb3BpZWQgPSBfX2ZpbGVtYXBfY29weV9mcm9tX3VzZXJfaW92ZWNfaW5hdG9taWMoa2FkZHIgKyBvZmZzZXQsIGlvdiwKKwkJCQkJCQkgYmFzZSwgYnl0ZXMpOwogCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKIAlpZiAoY29waWVkICE9IGJ5dGVzKSB7CiAJCWthZGRyID0ga21hcChwYWdlKTsKLQkJY29waWVkID0gX19maWxlbWFwX2NvcHlfZnJvbV91c2VyX2lvdmVjKGthZGRyICsgb2Zmc2V0LCBpb3YsCi0JCQkJCQkJYmFzZSwgYnl0ZXMpOworCQljb3BpZWQgPSBfX2ZpbGVtYXBfY29weV9mcm9tX3VzZXJfaW92ZWNfaW5hdG9taWMoa2FkZHIgKyBvZmZzZXQsIGlvdiwKKwkJCQkJCQkJIGJhc2UsIGJ5dGVzKTsKKwkJaWYgKGJ5dGVzIC0gY29waWVkKQorCQkJbWVtc2V0KGthZGRyICsgb2Zmc2V0ICsgY29waWVkLCAwLCBieXRlcyAtIGNvcGllZCk7CiAJCWt1bm1hcChwYWdlKTsKIAl9CiAJcmV0dXJuIGNvcGllZDsKZGlmZiAtLWdpdCBhL21tL21lbXBvbGljeS5jIGIvbW0vbWVtcG9saWN5LmMKaW5kZXggZWM0YTFhOS4uNmI5NzQwYiAxMDA2NDQKLS0tIGEvbW0vbWVtcG9saWN5LmMKKysrIGIvbW0vbWVtcG9saWN5LmMKQEAgLTYzMiw2ICs2MzIsMTAgQEAKIAogICAJZG93bl9yZWFkKCZtbS0+bW1hcF9zZW0pOwogCisJZXJyID0gbWlncmF0ZV92bWFzKG1tLCBmcm9tX25vZGVzLCB0b19ub2RlcywgZmxhZ3MpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCiAvKgogICogRmluZCBhICdzb3VyY2UnIGJpdCBzZXQgaW4gJ3RtcCcgd2hvc2UgY29ycmVzcG9uZGluZyAnZGVzdCcKICAqIGJpdCBpbiAndG8nIGlzIG5vdCBhbHNvIHNldCBpbiAndG1wJy4gIENsZWFyIHRoZSBmb3VuZCAnc291cmNlJwpAQCAtNjkxLDcgKzY5NSw3IEBACiAJCWlmIChlcnIgPCAwKQogCQkJYnJlYWs7CiAJfQotCitvdXQ6CiAJdXBfcmVhZCgmbW0tPm1tYXBfc2VtKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKQEAgLTE4MTcsNyArMTgyMSw3IEBACiAKIGludCBzaG93X251bWFfbWFwKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKIHsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgPSBtLT5wcml2YXRlOworCXN0cnVjdCBwcm9jX21hcHNfcHJpdmF0ZSAqcHJpdiA9IG0tPnByaXZhdGU7CiAJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEgPSB2OwogCXN0cnVjdCBudW1hX21hcHMgKm1kOwogCXN0cnVjdCBmaWxlICpmaWxlID0gdm1hLT52bV9maWxlOwpAQCAtMTgzMyw3ICsxODM3LDcgQEAKIAkJcmV0dXJuIDA7CiAKIAltcG9sX3RvX3N0cihidWZmZXIsIHNpemVvZihidWZmZXIpLAotCQkJZ2V0X3ZtYV9wb2xpY3kodGFzaywgdm1hLCB2bWEtPnZtX3N0YXJ0KSk7CisJCQkgICAgZ2V0X3ZtYV9wb2xpY3kocHJpdi0+dGFzaywgdm1hLCB2bWEtPnZtX3N0YXJ0KSk7CiAKIAlzZXFfcHJpbnRmKG0sICIlMDhseCAlcyIsIHZtYS0+dm1fc3RhcnQsIGJ1ZmZlcik7CiAKQEAgLTE4ODcsNyArMTg5MSw3IEBACiAJa2ZyZWUobWQpOwogCiAJaWYgKG0tPmNvdW50IDwgbS0+c2l6ZSkKLQkJbS0+dmVyc2lvbiA9ICh2bWEgIT0gZ2V0X2dhdGVfdm1hKHRhc2spKSA/IHZtYS0+dm1fc3RhcnQgOiAwOworCQltLT52ZXJzaW9uID0gKHZtYSAhPSBwcml2LT50YWlsX3ZtYSkgPyB2bWEtPnZtX3N0YXJ0IDogMDsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvbW0vbWlncmF0ZS5jIGIvbW0vbWlncmF0ZS5jCmluZGV4IDFjMmE3MWFhLi4zZjFlMGMyIDEwMDY0NAotLS0gYS9tbS9taWdyYXRlLmMKKysrIGIvbW0vbWlncmF0ZS5jCkBAIC02MTYsMTUgKzYxNiwxMyBAQAogCS8qCiAJICogRXN0YWJsaXNoIG1pZ3JhdGlvbiBwdGVzIG9yIHJlbW92ZSBwdGVzCiAJICovCi0JaWYgKHRyeV90b191bm1hcChwYWdlLCAxKSAhPSBTV0FQX0ZBSUwpIHsKLQkJaWYgKCFwYWdlX21hcHBlZChwYWdlKSkKLQkJCXJjID0gbW92ZV90b19uZXdfcGFnZShuZXdwYWdlLCBwYWdlKTsKLQl9IGVsc2UKLQkJLyogQSB2bWEgaGFzIFZNX0xPQ0tFRCBzZXQgLT4gcGVybWFuZW50IGZhaWx1cmUgKi8KLQkJcmMgPSAtRVBFUk07CisJdHJ5X3RvX3VubWFwKHBhZ2UsIDEpOworCWlmICghcGFnZV9tYXBwZWQocGFnZSkpCisJCXJjID0gbW92ZV90b19uZXdfcGFnZShuZXdwYWdlLCBwYWdlKTsKIAogCWlmIChyYykKIAkJcmVtb3ZlX21pZ3JhdGlvbl9wdGVzKHBhZ2UsIHBhZ2UpOworCiB1bmxvY2s6CiAJdW5sb2NrX3BhZ2UocGFnZSk7CiAKQEAgLTk3NiwzICs5NzQsMjMgQEAKIH0KICNlbmRpZgogCisvKgorICogQ2FsbCBtaWdyYXRpb24gZnVuY3Rpb25zIGluIHRoZSB2bWFfb3BzIHRoYXQgbWF5IHByZXBhcmUKKyAqIG1lbW9yeSBpbiBhIHZtIGZvciBtaWdyYXRpb24uIG1pZ3JhdGlvbiBmdW5jdGlvbnMgbWF5IHBlcmZvcm0KKyAqIHRoZSBtaWdyYXRpb24gZm9yIHZtYXMgdGhhdCBkbyBub3QgaGF2ZSBhbiB1bmRlcmx5aW5nIHBhZ2Ugc3RydWN0LgorICovCitpbnQgbWlncmF0ZV92bWFzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBjb25zdCBub2RlbWFza190ICp0bywKKwljb25zdCBub2RlbWFza190ICpmcm9tLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworIAlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKKyAJaW50IGVyciA9IDA7CisKKyAJZm9yKHZtYSA9IG1tLT5tbWFwOyB2bWEtPnZtX25leHQgJiYgIWVycjsgdm1hID0gdm1hLT52bV9uZXh0KSB7CisgCQlpZiAodm1hLT52bV9vcHMgJiYgdm1hLT52bV9vcHMtPm1pZ3JhdGUpIHsKKyAJCQllcnIgPSB2bWEtPnZtX29wcy0+bWlncmF0ZSh2bWEsIHRvLCBmcm9tLCBmbGFncyk7CisgCQkJaWYgKGVycikKKyAJCQkJYnJlYWs7CisgCQl9CisgCX0KKyAJcmV0dXJuIGVycjsKK30KZGlmZiAtLWdpdCBhL21tL3BhZ2VfYWxsb2MuYyBiL21tL3BhZ2VfYWxsb2MuYwppbmRleCA0MjNkYjBkLi45Zjg2MTkxIDEwMDY0NAotLS0gYS9tbS9wYWdlX2FsbG9jLmMKKysrIGIvbW0vcGFnZV9hbGxvYy5jCkBAIC0yNjYsNyArMjY2LDcgQEAKICAqIHNhdGlzZmllcyB0aGUgZm9sbG93aW5nIGVxdWF0aW9uOgogICogICAgIFAgPSBCICYgfigxIDw8IE8pCiAgKgotICogQXNzdW1wdGlvbjogKl9tZW1fbWFwIGlzIGNvbnRpZ2lvdXMgYXQgbGVhc3QgdXAgdG8gTUFYX09SREVSCisgKiBBc3N1bXB0aW9uOiAqX21lbV9tYXAgaXMgY29udGlndW91cyBhdCBsZWFzdCB1cCB0byBNQVhfT1JERVIKICAqLwogc3RhdGljIGlubGluZSBzdHJ1Y3QgcGFnZSAqCiBfX3BhZ2VfZmluZF9idWRkeShzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBwYWdlX2lkeCwgdW5zaWduZWQgaW50IG9yZGVyKQpAQCAtOTU3LDggKzk1Nyw3IEBACiAJCWdvdG8gZ290X3BnOwogCiAJZG8gewotCQlpZiAoY3B1c2V0X3pvbmVfYWxsb3dlZCgqeiwgZ2ZwX21hc2t8X19HRlBfSEFSRFdBTEwpKQotCQkJd2FrZXVwX2tzd2FwZCgqeiwgb3JkZXIpOworCQl3YWtldXBfa3N3YXBkKCp6LCBvcmRlcik7CiAJfSB3aGlsZSAoKigrK3opKTsKIAogCS8qCmRpZmYgLS1naXQgYS9tbS9wZGZsdXNoLmMgYi9tbS9wZGZsdXNoLmMKaW5kZXggZGY3ZTUwYi4uYjAyMTAyZiAxMDA2NDQKLS0tIGEvbW0vcGRmbHVzaC5jCisrKyBiL21tL3BkZmx1c2guYwpAQCAtMTA0LDIxICsxMDQsMjAgQEAKIAkJbGlzdF9tb3ZlKCZteV93b3JrLT5saXN0LCAmcGRmbHVzaF9saXN0KTsKIAkJbXlfd29yay0+d2hlbl9pX3dlbnRfdG9fc2xlZXAgPSBqaWZmaWVzOwogCQlzcGluX3VubG9ja19pcnEoJnBkZmx1c2hfbG9jayk7Ci0KIAkJc2NoZWR1bGUoKTsKLQkJaWYgKHRyeV90b19mcmVlemUoKSkgewotCQkJc3Bpbl9sb2NrX2lycSgmcGRmbHVzaF9sb2NrKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KKwkJdHJ5X3RvX2ZyZWV6ZSgpOwogCQlzcGluX2xvY2tfaXJxKCZwZGZsdXNoX2xvY2spOwogCQlpZiAoIWxpc3RfZW1wdHkoJm15X3dvcmstPmxpc3QpKSB7Ci0JCQlwcmludGsoInBkZmx1c2g6IGJvZ3VzIHdha2V1cCFcbiIpOworCQkJLyoKKwkJCSAqIFNvbWVvbmUgd29rZSB1cyB1cCwgYnV0IHdpdGhvdXQgcmVtb3Zpbmcgb3VyIGNvbnRyb2wKKwkJCSAqIHN0cnVjdHVyZSBmcm9tIHRoZSBnbG9iYWwgbGlzdC4gIHN3c3VzcCB3aWxsIGRvIHRoaXMKKwkJCSAqIGluIHRyeV90b19mcmVlemUoKS0+cmVmcmlnZXJhdG9yKCkuICBIYW5kbGUgaXQuCisJCQkgKi8KIAkJCW15X3dvcmstPmZuID0gTlVMTDsKIAkJCWNvbnRpbnVlOwogCQl9CiAJCWlmIChteV93b3JrLT5mbiA9PSBOVUxMKSB7Ci0JCQlwcmludGsoInBkZmx1c2g6IE5VTEwgd29yayBmdW5jdGlvblxuIik7CisJCQlwcmludGsoInBkZmx1c2g6IGJvZ3VzIHdha2V1cFxuIik7CiAJCQljb250aW51ZTsKIAkJfQogCQlzcGluX3VubG9ja19pcnEoJnBkZmx1c2hfbG9jayk7CmRpZmYgLS1naXQgYS9tbS9yZWFkYWhlYWQuYyBiL21tL3JlYWRhaGVhZC5jCmluZGV4IDBmMTQyYTQuLmFhN2VjNDIgMTAwNjQ0Ci0tLSBhL21tL3JlYWRhaGVhZC5jCisrKyBiL21tL3JlYWRhaGVhZC5jCkBAIC0xMTgsOCArMTE4LDcgQEAKICNkZWZpbmUgbGlzdF90b19wYWdlKGhlYWQpIChsaXN0X2VudHJ5KChoZWFkKS0+cHJldiwgc3RydWN0IHBhZ2UsIGxydSkpCiAKIC8qKgotICogcmVhZF9jYWNoZV9wYWdlcyAtIHBvcHVsYXRlIGFuIGFkZHJlc3Mgc3BhY2Ugd2l0aCBzb21lIHBhZ2VzLCBhbmQKLSAqIAkJCXN0YXJ0IHJlYWRzIGFnYWluc3QgdGhlbS4KKyAqIHJlYWRfY2FjaGVfcGFnZXMgLSBwb3B1bGF0ZSBhbiBhZGRyZXNzIHNwYWNlIHdpdGggc29tZSBwYWdlcyAmIHN0YXJ0IHJlYWRzIGFnYWluc3QgdGhlbQogICogQG1hcHBpbmc6IHRoZSBhZGRyZXNzX3NwYWNlCiAgKiBAcGFnZXM6IFRoZSBhZGRyZXNzIG9mIGEgbGlzdF9oZWFkIHdoaWNoIGNvbnRhaW5zIHRoZSB0YXJnZXQgcGFnZXMuICBUaGVzZQogICogICBwYWdlcyBoYXZlIHRoZWlyIC0+aW5kZXggcG9wdWxhdGVkIGFuZCBhcmUgb3RoZXJ3aXNlIHVuaW5pdGlhbGlzZWQuCkBAIC0xODIsMTQgKzE4MSwxMSBAQAogCQlsaXN0X2RlbCgmcGFnZS0+bHJ1KTsKIAkJaWYgKCFhZGRfdG9fcGFnZV9jYWNoZShwYWdlLCBtYXBwaW5nLAogCQkJCQlwYWdlLT5pbmRleCwgR0ZQX0tFUk5FTCkpIHsKLQkJCXJldCA9IG1hcHBpbmctPmFfb3BzLT5yZWFkcGFnZShmaWxwLCBwYWdlKTsKLQkJCWlmIChyZXQgIT0gQU9QX1RSVU5DQVRFRF9QQUdFKSB7Ci0JCQkJaWYgKCFwYWdldmVjX2FkZCgmbHJ1X3B2ZWMsIHBhZ2UpKQotCQkJCQlfX3BhZ2V2ZWNfbHJ1X2FkZCgmbHJ1X3B2ZWMpOwotCQkJCWNvbnRpbnVlOwotCQkJfSAvKiBlbHNlIGZhbGwgdGhyb3VnaCB0byByZWxlYXNlICovCi0JCX0KLQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCQkJbWFwcGluZy0+YV9vcHMtPnJlYWRwYWdlKGZpbHAsIHBhZ2UpOworCQkJaWYgKCFwYWdldmVjX2FkZCgmbHJ1X3B2ZWMsIHBhZ2UpKQorCQkJCV9fcGFnZXZlY19scnVfYWRkKCZscnVfcHZlYyk7CisJCX0gZWxzZQorCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwogCX0KIAlwYWdldmVjX2xydV9hZGQoJmxydV9wdmVjKTsKIAlyZXQgPSAwOwpAQCAtMzk0LDggKzM5MCw4IEBACiAgKiBSZWFkICducl90b19yZWFkJyBwYWdlcyBzdGFydGluZyBhdCBwYWdlICdvZmZzZXQnLiBJZiB0aGUgZmxhZyAnYmxvY2snCiAgKiBpcyBzZXQgd2FpdCB0aWxsIHRoZSByZWFkIGNvbXBsZXRlcy4gIE90aGVyd2lzZSBhdHRlbXB0IHRvIHJlYWQgd2l0aG91dAogICogYmxvY2tpbmcuCi0gKiBSZXR1cm5zIDEgbWVhbmluZyAnc3VjY2VzcycgaWYgcmVhZCBpcyBzdWNjZXNmdWxsIHdpdGhvdXQgc3dpdGNoaW5nIG9mZgotICogcmVhZGhhZWFkIG1vZGUuIE90aGVyd2lzZSByZXR1cm4gZmFpbHVyZS4KKyAqIFJldHVybnMgMSBtZWFuaW5nICdzdWNjZXNzJyBpZiByZWFkIGlzIHN1Y2Nlc3NmdWwgd2l0aG91dCBzd2l0Y2hpbmcgb2ZmCisgKiByZWFkYWhlYWQgbW9kZS4gT3RoZXJ3aXNlIHJldHVybiBmYWlsdXJlLgogICovCiBzdGF0aWMgaW50CiBibG9ja2FibGVfcGFnZV9jYWNoZV9yZWFkYWhlYWQoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIHN0cnVjdCBmaWxlICpmaWxwLApkaWZmIC0tZ2l0IGEvbW0vcm1hcC5jIGIvbW0vcm1hcC5jCmluZGV4IDg4MmE4NTguLmU3NjkwOWUgMTAwNjQ0Ci0tLSBhL21tL3JtYXAuYworKysgYi9tbS9ybWFwLmMKQEAgLTU2Miw5ICs1NjIsOCBAQAogCSAqIElmIGl0J3MgcmVjZW50bHkgcmVmZXJlbmNlZCAocGVyaGFwcyBwYWdlX3JlZmVyZW5jZWQKIAkgKiBza2lwcGVkIG92ZXIgdGhpcyBtbSkgdGhlbiB3ZSBzaG91bGQgcmVhY3RpdmF0ZSBpdC4KIAkgKi8KLQlpZiAoKHZtYS0+dm1fZmxhZ3MgJiBWTV9MT0NLRUQpIHx8Ci0JCQkocHRlcF9jbGVhcl9mbHVzaF95b3VuZyh2bWEsIGFkZHJlc3MsIHB0ZSkKLQkJCQkmJiAhbWlncmF0aW9uKSkgeworCWlmICghbWlncmF0aW9uICYmICgodm1hLT52bV9mbGFncyAmIFZNX0xPQ0tFRCkgfHwKKwkJCShwdGVwX2NsZWFyX2ZsdXNoX3lvdW5nKHZtYSwgYWRkcmVzcywgcHRlKSkpKSB7CiAJCXJldCA9IFNXQVBfRkFJTDsKIAkJZ290byBvdXRfdW5tYXA7CiAJfQpAQCAtNzcxLDcgKzc3MCw3IEBACiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZtYSwgJm1hcHBpbmctPmlfbW1hcF9ub25saW5lYXIsCiAJCQkJCQlzaGFyZWQudm1fc2V0Lmxpc3QpIHsKLQkJaWYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9MT0NLRUQpCisJCWlmICgodm1hLT52bV9mbGFncyAmIFZNX0xPQ0tFRCkgJiYgIW1pZ3JhdGlvbikKIAkJCWNvbnRpbnVlOwogCQljdXJzb3IgPSAodW5zaWduZWQgbG9uZykgdm1hLT52bV9wcml2YXRlX2RhdGE7CiAJCWlmIChjdXJzb3IgPiBtYXhfbmxfY3Vyc29yKQpAQCAtODA1LDcgKzgwNCw3IEBACiAJZG8gewogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZtYSwgJm1hcHBpbmctPmlfbW1hcF9ub25saW5lYXIsCiAJCQkJCQlzaGFyZWQudm1fc2V0Lmxpc3QpIHsKLQkJCWlmICh2bWEtPnZtX2ZsYWdzICYgVk1fTE9DS0VEKQorCQkJaWYgKCh2bWEtPnZtX2ZsYWdzICYgVk1fTE9DS0VEKSAmJiAhbWlncmF0aW9uKQogCQkJCWNvbnRpbnVlOwogCQkJY3Vyc29yID0gKHVuc2lnbmVkIGxvbmcpIHZtYS0+dm1fcHJpdmF0ZV9kYXRhOwogCQkJd2hpbGUgKCBjdXJzb3IgPCBtYXhfbmxfY3Vyc29yICYmCmRpZmYgLS1naXQgYS9tbS9zaG1lbS5jIGIvbW0vc2htZW0uYwppbmRleCA4NGI1Y2Y5Li4zOGJjMzMzIDEwMDY0NAotLS0gYS9tbS9zaG1lbS5jCisrKyBiL21tL3NobWVtLmMKQEAgLTIyNTUsNyArMjI1NSw3IEBACiAjaWZkZWYgQ09ORklHX1RNUEZTCiAJZGV2ZnNfbWtfZGlyKCJzaG0iKTsKICNlbmRpZgotCXNobV9tbnQgPSBkb19rZXJuX21vdW50KHRtcGZzX2ZzX3R5cGUubmFtZSwgTVNfTk9VU0VSLAorCXNobV9tbnQgPSB2ZnNfa2Vybl9tb3VudCgmdG1wZnNfZnNfdHlwZSwgTVNfTk9VU0VSLAogCQkJCXRtcGZzX2ZzX3R5cGUubmFtZSwgTlVMTCk7CiAJaWYgKElTX0VSUihzaG1fbW50KSkgewogCQllcnJvciA9IFBUUl9FUlIoc2htX21udCk7CmRpZmYgLS1naXQgYS9tbS9zd2FwLmMgYi9tbS9zd2FwLmMKaW5kZXggMDNhZTIwNy4uOTkwODY4YSAxMDA2NDQKLS0tIGEvbW0vc3dhcC5jCisrKyBiL21tL3N3YXAuYwpAQCAtODYsOCArODYsNyBAQAogCXpvbmUgPSBwYWdlX3pvbmUocGFnZSk7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJnpvbmUtPmxydV9sb2NrLCBmbGFncyk7CiAJaWYgKFBhZ2VMUlUocGFnZSkgJiYgIVBhZ2VBY3RpdmUocGFnZSkpIHsKLQkJbGlzdF9kZWwoJnBhZ2UtPmxydSk7Ci0JCWxpc3RfYWRkX3RhaWwoJnBhZ2UtPmxydSwgJnpvbmUtPmluYWN0aXZlX2xpc3QpOworCQlsaXN0X21vdmVfdGFpbCgmcGFnZS0+bHJ1LCAmem9uZS0+aW5hY3RpdmVfbGlzdCk7CiAJCWluY19wYWdlX3N0YXRlKHBncm90YXRlZCk7CiAJfQogCWlmICghdGVzdF9jbGVhcl9wYWdlX3dyaXRlYmFjayhwYWdlKSkKZGlmZiAtLWdpdCBhL25ldC9hdG0vbXBjLmMgYi9uZXQvYXRtL21wYy5jCmluZGV4IGE0OGE1ZDUuLjVmZTc3ZGYgMTAwNjQ0Ci0tLSBhL25ldC9hdG0vbXBjLmMKKysrIGIvbmV0L2F0bS9tcGMuYwpAQCAtMTExMywxMCArMTExMyw5IEBACiAKIHN0YXRpYyB2b2lkIE1QT0FfcmVzX3JlcGx5X3JjdmQoc3RydWN0IGtfbWVzc2FnZSAqbXNnLCBzdHJ1Y3QgbXBvYV9jbGllbnQgKm1wYykKIHsKLQl1bnNpZ25lZCBjaGFyICppcDsKLQogCXVpbnQzMl90IGRzdF9pcCA9IG1zZy0+Y29udGVudC5pbl9pbmZvLmluX2RzdF9pcDsKIAlpbl9jYWNoZV9lbnRyeSAqZW50cnkgPSBtcGMtPmluX29wcy0+Z2V0KGRzdF9pcCwgbXBjKTsKKwogCWRwcmludGsoIm1wb2E6ICglcykgTVBPQV9yZXNfcmVwbHlfcmN2ZDogaXAgJXUuJXUuJXUuJXVcbiIsIG1wYy0+ZGV2LT5uYW1lLCBOSVBRVUFEKGRzdF9pcCkpOwogCWRkcHJpbnRrKCJtcG9hOiAoJXMpIE1QT0FfcmVzX3JlcGx5X3JjdmQoKSBlbnRyeSA9ICVwIiwgbXBjLT5kZXYtPm5hbWUsIGVudHJ5KTsKIAlpZihlbnRyeSA9PSBOVUxMKXsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL2Rldi5jIGIvbmV0L2NvcmUvZGV2LmMKaW5kZXggZWEyNDY5My4uZjFjNTJjYiAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvZGV2LmMKKysrIGIvbmV0L2NvcmUvZGV2LmMKQEAgLTIzMCw3ICsyMzAsNyBAQAogICoJRm9yIGVmZmljaWVuY3kKICAqLwogCi1pbnQgbmV0ZGV2X25pdDsKK3N0YXRpYyBpbnQgbmV0ZGV2X25pdDsKIAogLyoKICAqCUFkZCBhIHByb3RvY29sIElEIHRvIHRoZSBsaXN0LiBOb3cgdGhhdCB0aGUgaW5wdXQgaGFuZGxlciBpcwpAQCAtMTMyNSw5ICsxMzI1LDEyIEBACiAJCW5za2ItPm5leHQgPSBOVUxMOwogCQlyYyA9IGRldi0+aGFyZF9zdGFydF94bWl0KG5za2IsIGRldik7CiAJCWlmICh1bmxpa2VseShyYykpIHsKKwkJCW5za2ItPm5leHQgPSBza2ItPm5leHQ7CiAJCQlza2ItPm5leHQgPSBuc2tiOwogCQkJcmV0dXJuIHJjOwogCQl9CisJCWlmICh1bmxpa2VseShuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikgJiYgc2tiLT5uZXh0KSkKKwkJCXJldHVybiBORVRERVZfVFhfQlVTWTsKIAl9IHdoaWxlIChza2ItPm5leHQpOwogCQogCXNrYi0+ZGVzdHJ1Y3RvciA9IERFVl9HU09fQ0Ioc2tiKS0+ZGVzdHJ1Y3RvcjsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL25ldHBvbGwuYyBiL25ldC9jb3JlL25ldHBvbGwuYwppbmRleCA5Y2I3ODE4Li40NzFkYTQ1IDEwMDY0NAotLS0gYS9uZXQvY29yZS9uZXRwb2xsLmMKKysrIGIvbmV0L2NvcmUvbmV0cG9sbC5jCkBAIC01NCw2ICs1NCw3IEBACiAJCQkJc2l6ZW9mKHN0cnVjdCBpcGhkcikgKyBzaXplb2Yoc3RydWN0IGV0aGhkcikpCiAKIHN0YXRpYyB2b2lkIHphcF9jb21wbGV0aW9uX3F1ZXVlKHZvaWQpOworc3RhdGljIHZvaWQgYXJwX3JlcGx5KHN0cnVjdCBza19idWZmICpza2IpOwogCiBzdGF0aWMgdm9pZCBxdWV1ZV9wcm9jZXNzKHZvaWQgKnApCiB7CkBAIC0xNTMsNiArMTU0LDIyIEBACiAJfQogfQogCitzdGF0aWMgdm9pZCBzZXJ2aWNlX2FycF9xdWV1ZShzdHJ1Y3QgbmV0cG9sbF9pbmZvICpucGkpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCWlmICh1bmxpa2VseSghbnBpKSkKKwkJcmV0dXJuOworCisJc2tiID0gc2tiX2RlcXVldWUoJm5waS0+YXJwX3R4KTsKKworCXdoaWxlIChza2IgIT0gTlVMTCkgeworCQlhcnBfcmVwbHkoc2tiKTsKKwkJc2tiID0gc2tiX2RlcXVldWUoJm5waS0+YXJwX3R4KTsKKwl9CisJcmV0dXJuOworfQorCiB2b2lkIG5ldHBvbGxfcG9sbChzdHJ1Y3QgbmV0cG9sbCAqbnApCiB7CiAJaWYoIW5wLT5kZXYgfHwgIW5ldGlmX3J1bm5pbmcobnAtPmRldikgfHwgIW5wLT5kZXYtPnBvbGxfY29udHJvbGxlcikKQEAgLTE2Myw2ICsxODAsOCBAQAogCWlmIChucC0+ZGV2LT5wb2xsKQogCQlwb2xsX25hcGkobnApOwogCisJc2VydmljZV9hcnBfcXVldWUobnAtPmRldi0+bnBpbmZvKTsKKwogCXphcF9jb21wbGV0aW9uX3F1ZXVlKCk7CiB9CiAKQEAgLTI3OSwxNCArMjk4LDEwIEBACiAJCSAqIG5ldHdvcmsgZHJpdmVycyBkbyBub3QgZXhwZWN0IHRvIGJlIGNhbGxlZCBpZiB0aGUgcXVldWUgaXMKIAkJICogc3RvcHBlZC4KIAkJICovCi0JCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKG5wLT5kZXYpKSB7Ci0JCQluZXRpZl90eF91bmxvY2sobnAtPmRldik7Ci0JCQluZXRwb2xsX3BvbGwobnApOwotCQkJdWRlbGF5KDUwKTsKLQkJCWNvbnRpbnVlOwotCQl9CisJCXN0YXR1cyA9IE5FVERFVl9UWF9CVVNZOworCQlpZiAoIW5ldGlmX3F1ZXVlX3N0b3BwZWQobnAtPmRldikpCisJCQlzdGF0dXMgPSBucC0+ZGV2LT5oYXJkX3N0YXJ0X3htaXQoc2tiLCBucC0+ZGV2KTsKIAotCQlzdGF0dXMgPSBucC0+ZGV2LT5oYXJkX3N0YXJ0X3htaXQoc2tiLCBucC0+ZGV2KTsKIAkJbmV0aWZfdHhfdW5sb2NrKG5wLT5kZXYpOwogCiAJCS8qIHN1Y2Nlc3MgKi8KQEAgLTQ0Niw3ICs0NjEsOSBAQAogCWludCBwcm90bywgbGVuLCB1bGVuOwogCXN0cnVjdCBpcGhkciAqaXBoOwogCXN0cnVjdCB1ZHBoZHIgKnVoOwotCXN0cnVjdCBuZXRwb2xsICpucCA9IHNrYi0+ZGV2LT5ucGluZm8tPnJ4X25wOworCXN0cnVjdCBuZXRwb2xsX2luZm8gKm5waSA9IHNrYi0+ZGV2LT5ucGluZm87CisJc3RydWN0IG5ldHBvbGwgKm5wID0gbnBpLT5yeF9ucDsKKwogCiAJaWYgKCFucCkKIAkJZ290byBvdXQ7CkBAIC00NTYsNyArNDczLDcgQEAKIAkvKiBjaGVjayBpZiBuZXRwb2xsIGNsaWVudHMgbmVlZCBBUlAgKi8KIAlpZiAoc2tiLT5wcm90b2NvbCA9PSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0FSUCkgJiYKIAkgICAgYXRvbWljX3JlYWQoJnRyYXBwZWQpKSB7Ci0JCWFycF9yZXBseShza2IpOworCQlza2JfcXVldWVfdGFpbCgmbnBpLT5hcnBfdHgsIHNrYik7CiAJCXJldHVybiAxOwogCX0KIApAQCAtNjUxLDYgKzY2OCw3IEBACiAJCW5waW5mby0+cG9sbF9vd25lciA9IC0xOwogCQlucGluZm8tPnRyaWVzID0gTUFYX1JFVFJJRVM7CiAJCXNwaW5fbG9ja19pbml0KCZucGluZm8tPnJ4X2xvY2spOworCQlza2JfcXVldWVfaGVhZF9pbml0KCZucGluZm8tPmFycF90eCk7CiAJfSBlbHNlCiAJCW5waW5mbyA9IG5kZXYtPm5waW5mbzsKIApkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvc2tidWZmLmMgYi9uZXQvY29yZS9za2J1ZmYuYwppbmRleCA4ZTUwNDRiLi42ZWRiYjkwIDEwMDY0NAotLS0gYS9uZXQvY29yZS9za2J1ZmYuYworKysgYi9uZXQvY29yZS9za2J1ZmYuYwpAQCAtMTczOSwxMiArMTczOSwxNSBAQAogCQkJICAgdW5zaWduZWQgaW50IHRvLCBzdHJ1Y3QgdHNfY29uZmlnICpjb25maWcsCiAJCQkgICBzdHJ1Y3QgdHNfc3RhdGUgKnN0YXRlKQogeworCXVuc2lnbmVkIGludCByZXQ7CisKIAljb25maWctPmdldF9uZXh0X2Jsb2NrID0gc2tiX3RzX2dldF9uZXh0X2Jsb2NrOwogCWNvbmZpZy0+ZmluaXNoID0gc2tiX3RzX2ZpbmlzaDsKIAogCXNrYl9wcmVwYXJlX3NlcV9yZWFkKHNrYiwgZnJvbSwgdG8sIFRTX1NLQl9DQihzdGF0ZSkpOwogCi0JcmV0dXJuIHRleHRzZWFyY2hfZmluZChjb25maWcsIHN0YXRlKTsKKwlyZXQgPSB0ZXh0c2VhcmNoX2ZpbmQoY29uZmlnLCBzdGF0ZSk7CisJcmV0dXJuIChyZXQgPD0gdG8gLSBmcm9tID8gcmV0IDogVUlOVF9NQVgpOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF90YWJsZXMuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF90YWJsZXMuYwppbmRleCBjZWUzMzk3Li43MDZjMDAyIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfdGFibGVzLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX3RhYmxlcy5jCkBAIC0xNzYxLDcgKzE3NjEsNyBAQAogCQlnb3RvIGZyZWVfbmV3aW5mbzsKIAogCS8qIEFuZCBvbmUgY29weSBmb3IgZXZlcnkgb3RoZXIgQ1BVICovCi0JZm9yX2VhY2hfY3B1KGkpCisJZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpCiAJCWlmIChuZXdpbmZvLT5lbnRyaWVzW2ldICYmIG5ld2luZm8tPmVudHJpZXNbaV0gIT0gZW50cnkxKQogCQkJbWVtY3B5KG5ld2luZm8tPmVudHJpZXNbaV0sIGVudHJ5MSwgbmV3aW5mby0+c2l6ZSk7CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3JvdXRlLmMgYi9uZXQvaXB2NC9yb3V0ZS5jCmluZGV4IGNjOTQyM2QuLjYwYjExYWUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3JvdXRlLmMKKysrIGIvbmV0L2lwdjQvcm91dGUuYwpAQCAtMjQ0LDcgKzI0NCw3IEBACiAKIHN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgcnRfY2FjaGVfc3RhdCwgcnRfY2FjaGVfc3RhdCk7CiAjZGVmaW5lIFJUX0NBQ0hFX1NUQVRfSU5DKGZpZWxkKSBcCi0JKHBlcl9jcHUocnRfY2FjaGVfc3RhdCwgcmF3X3NtcF9wcm9jZXNzb3JfaWQoKSkuZmllbGQrKykKKwkoX19yYXdfZ2V0X2NwdV92YXIocnRfY2FjaGVfc3RhdCkuZmllbGQrKykKIAogc3RhdGljIGludCBydF9pbnRlcm5faGFzaCh1bnNpZ25lZCBoYXNoLCBzdHJ1Y3QgcnRhYmxlICpydGgsCiAJCQkJc3RydWN0IHJ0YWJsZSAqKnJlcyk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3AuYyBiL25ldC9pcHY0L3RjcC5jCmluZGV4IDBlMDI5YzQuLmMwNDE3NmIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3RjcC5jCisrKyBiL25ldC9pcHY0L3RjcC5jCkBAIC0yMTY2LDcgKzIxNjYsNyBAQAogCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHRobGVuKSkKIAkJZ290byBvdXQ7CiAKLQlvbGRsZW4gPSB+aHRvbmwoc2tiLT5sZW4pOworCW9sZGxlbiA9ICh1MTYpfnNrYi0+bGVuOwogCV9fc2tiX3B1bGwoc2tiLCB0aGxlbik7CiAKIAlzZWdzID0gc2tiX3NlZ21lbnQoc2tiLCBzZyk7CkBAIC0yMTc0LDcgKzIxNzQsNyBAQAogCQlnb3RvIG91dDsKIAogCWxlbiA9IHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemU7Ci0JZGVsdGEgPSBjc3VtX2FkZChvbGRsZW4sIGh0b25sKHRobGVuICsgbGVuKSk7CisJZGVsdGEgPSBodG9ubChvbGRsZW4gKyAodGhsZW4gKyBsZW4pKTsKIAogCXNrYiA9IHNlZ3M7CiAJdGggPSBza2ItPmgudGg7CkBAIC0yMTgzLDEwICsyMTgzLDEwIEBACiAJZG8gewogCQl0aC0+ZmluID0gdGgtPnBzaCA9IDA7CiAKLQkJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX05PTkUpIHsKLQkJCXRoLT5jaGVjayA9IGNzdW1fZm9sZChjc3VtX3BhcnRpYWwoCi0JCQkJc2tiLT5oLnJhdywgdGhsZW4sIGNzdW1fYWRkKHNrYi0+Y3N1bSwgZGVsdGEpKSk7Ci0JCX0KKwkJdGgtPmNoZWNrID0gfmNzdW1fZm9sZCh0aC0+Y2hlY2sgKyBkZWx0YSk7CisJCWlmIChza2ItPmlwX3N1bW1lZCAhPSBDSEVDS1NVTV9IVykKKwkJCXRoLT5jaGVjayA9IGNzdW1fZm9sZChjc3VtX3BhcnRpYWwoc2tiLT5oLnJhdywgdGhsZW4sCisJCQkJCQkJICAgc2tiLT5jc3VtKSk7CiAKIAkJc2VxICs9IGxlbjsKIAkJc2tiID0gc2tiLT5uZXh0OwpAQCAtMjE5NiwxMSArMjE5NiwxMSBAQAogCQl0aC0+Y3dyID0gMDsKIAl9IHdoaWxlIChza2ItPm5leHQpOwogCi0JaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX05PTkUpIHsKLQkJZGVsdGEgPSBjc3VtX2FkZChvbGRsZW4sIGh0b25sKHNrYi0+dGFpbCAtIHNrYi0+aC5yYXcpKTsKLQkJdGgtPmNoZWNrID0gY3N1bV9mb2xkKGNzdW1fcGFydGlhbCgKLQkJCXNrYi0+aC5yYXcsIHRobGVuLCBjc3VtX2FkZChza2ItPmNzdW0sIGRlbHRhKSkpOwotCX0KKwlkZWx0YSA9IGh0b25sKG9sZGxlbiArIChza2ItPnRhaWwgLSBza2ItPmgucmF3KSArIHNrYi0+ZGF0YV9sZW4pOworCXRoLT5jaGVjayA9IH5jc3VtX2ZvbGQodGgtPmNoZWNrICsgZGVsdGEpOworCWlmIChza2ItPmlwX3N1bW1lZCAhPSBDSEVDS1NVTV9IVykKKwkJdGgtPmNoZWNrID0gY3N1bV9mb2xkKGNzdW1fcGFydGlhbChza2ItPmgucmF3LCB0aGxlbiwKKwkJCQkJCSAgIHNrYi0+Y3N1bSkpOwogCiBvdXQ6CiAJcmV0dXJuIHNlZ3M7CmRpZmYgLS1naXQgYS9uZXQvbmV0cm9tL25yX3JvdXRlLmMgYi9uZXQvbmV0cm9tL25yX3JvdXRlLmMKaW5kZXggYjNiOTA5Ny4uYzExNzM3ZiAxMDA2NDQKLS0tIGEvbmV0L25ldHJvbS9ucl9yb3V0ZS5jCisrKyBiL25ldC9uZXRyb20vbnJfcm91dGUuYwpAQCAtNzI1LDE1ICs3MjUsMTcgQEAKIAlzdHJ1Y3QgbnJfbm9kZSAgKm5yX25vZGUgPSBOVUxMOwogCiAJc3Bpbl9sb2NrX2JoKCZucl9uZWlnaF9saXN0X2xvY2spOwotCW5yX25laWdoX2Zvcl9lYWNoKHMsIG5vZGUsICZucl9uZWlnaF9saXN0KQorCW5yX25laWdoX2Zvcl9lYWNoKHMsIG5vZGUsICZucl9uZWlnaF9saXN0KSB7CiAJCWlmIChzLT5heDI1ID09IGF4MjUpIHsKIAkJCW5yX25laWdoX2hvbGQocyk7CiAJCQlucl9uZWlnaCA9IHM7CiAJCQlicmVhazsKIAkJfQorCX0KIAlzcGluX3VubG9ja19iaCgmbnJfbmVpZ2hfbGlzdF9sb2NrKTsKIAotCWlmIChucl9uZWlnaCA9PSBOVUxMKSByZXR1cm47CisJaWYgKG5yX25laWdoID09IE5VTEwpCisJCXJldHVybjsKIAogCW5yX25laWdoLT5heDI1ID0gTlVMTDsKIAlheDI1X2NiX3B1dChheDI1KTsKQEAgLTc0MywxMSArNzQ1LDEzIEBACiAJCXJldHVybjsKIAl9CiAJc3Bpbl9sb2NrX2JoKCZucl9ub2RlX2xpc3RfbG9jayk7Ci0JbnJfbm9kZV9mb3JfZWFjaChucl9ub2RlLCBub2RlLCAmbnJfbm9kZV9saXN0KQorCW5yX25vZGVfZm9yX2VhY2gobnJfbm9kZSwgbm9kZSwgJm5yX25vZGVfbGlzdCkgewogCQlucl9ub2RlX2xvY2sobnJfbm9kZSk7Ci0JCWlmIChucl9ub2RlLT53aGljaCA8IG5yX25vZGUtPmNvdW50ICYmIG5yX25vZGUtPnJvdXRlc1tucl9ub2RlLT53aGljaF0ubmVpZ2hib3VyID09IG5yX25laWdoKQorCQlpZiAobnJfbm9kZS0+d2hpY2ggPCBucl9ub2RlLT5jb3VudCAmJgorCQkgICAgbnJfbm9kZS0+cm91dGVzW25yX25vZGUtPndoaWNoXS5uZWlnaGJvdXIgPT0gbnJfbmVpZ2gpCiAJCQlucl9ub2RlLT53aGljaCsrOwogCQlucl9ub2RlX3VubG9jayhucl9ub2RlKTsKKwl9CiAJc3Bpbl91bmxvY2tfYmgoJm5yX25vZGVfbGlzdF9sb2NrKTsKIAlucl9uZWlnaF9wdXQobnJfbmVpZ2gpOwogfQpkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL2NhbGwuYyBiL25ldC9yeHJwYy9jYWxsLmMKaW5kZXggYzRhZWI3ZC4uZDA3MTIyYiAxMDA2NDQKLS0tIGEvbmV0L3J4cnBjL2NhbGwuYworKysgYi9uZXQvcnhycGMvY2FsbC5jCkBAIC0xMDk4LDggKzEwOTgsNyBAQAogCiAJCWNhbGwtPmFwcF9yZWFkeV9zZXEgPSBwbXNnLT5zZXE7CiAJCWNhbGwtPmFwcF9yZWFkeV9xdHkgKz0gcG1zZy0+ZHNpemU7Ci0JCWxpc3RfZGVsX2luaXQoJnBtc2ctPmxpbmspOwotCQlsaXN0X2FkZF90YWlsKCZwbXNnLT5saW5rLCAmY2FsbC0+YXBwX3JlYWR5cSk7CisJCWxpc3RfbW92ZV90YWlsKCZwbXNnLT5saW5rLCAmY2FsbC0+YXBwX3JlYWR5cSk7CiAJfQogCiAJLyogc2VlIGlmIHdlJ3ZlIGdvdCB0aGUgbGFzdCBwYWNrZXQgeWV0ICovCmRpZmYgLS1naXQgYS9uZXQvcnhycGMvY29ubmVjdGlvbi5jIGIvbmV0L3J4cnBjL2Nvbm5lY3Rpb24uYwppbmRleCAwZTBhNDU1Li41NzNiNTcyIDEwMDY0NAotLS0gYS9uZXQvcnhycGMvY29ubmVjdGlvbi5jCisrKyBiL25ldC9yeHJwYy9jb25uZWN0aW9uLmMKQEAgLTQwMiw4ICs0MDIsNyBAQAogCiAJLyogbW92ZSB0byBncmF2ZXlhcmQgcXVldWUgKi8KIAlfZGVidWcoImJ1cnlpbmcgY29ubmVjdGlvbjogeyUwOHh9IiwgbnRvaGwoY29ubi0+Y29ubl9pZCkpOwotCWxpc3RfZGVsKCZjb25uLT5saW5rKTsKLQlsaXN0X2FkZF90YWlsKCZjb25uLT5saW5rLCAmcGVlci0+Y29ubl9ncmF2ZXlhcmQpOworCWxpc3RfbW92ZV90YWlsKCZjb25uLT5saW5rLCAmcGVlci0+Y29ubl9ncmF2ZXlhcmQpOwogCiAJcnhycGNfa3J4dGltb2RfYWRkX3RpbWVyKCZjb25uLT50aW1lb3V0LCByeHJwY19jb25uX3RpbWVvdXQgKiBIWik7CiAKZGlmZiAtLWdpdCBhL25ldC9yeHJwYy9rcnhzZWNkLmMgYi9uZXQvcnhycGMva3J4c2VjZC5jCmluZGV4IDFhYWRkMDIuLmNlYTRlYjUgMTAwNjQ0Ci0tLSBhL25ldC9yeHJwYy9rcnhzZWNkLmMKKysrIGIvbmV0L3J4cnBjL2tyeHNlY2QuYwpAQCAtMTYwLDggKzE2MCw3IEBACiAJbGlzdF9mb3JfZWFjaF9zYWZlKF9wLCBfbiwgJnJ4cnBjX2tyeHNlY2RfaW5pdG1zZ3EpIHsKIAkJbXNnID0gbGlzdF9lbnRyeShfcCwgc3RydWN0IHJ4cnBjX21lc3NhZ2UsIGxpbmspOwogCQlpZiAobXNnLT50cmFucyA9PSB0cmFucykgewotCQkJbGlzdF9kZWwoJm1zZy0+bGluayk7Ci0JCQlsaXN0X2FkZF90YWlsKCZtc2ctPmxpbmssICZ0bXApOworCQkJbGlzdF9tb3ZlX3RhaWwoJm1zZy0+bGluaywgJnRtcCk7CiAJCQlhdG9taWNfZGVjKCZyeHJwY19rcnhzZWNkX3Fjb3VudCk7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL2F1dGhfZ3NzL2dzc19rcmI1X21lY2guYyBiL25ldC9zdW5ycGMvYXV0aF9nc3MvZ3NzX2tyYjVfbWVjaC5jCmluZGV4IDEyOWUyYmQuLmI4NzE0YTggMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMvYXV0aF9nc3MvZ3NzX2tyYjVfbWVjaC5jCisrKyBiL25ldC9zdW5ycGMvYXV0aF9nc3MvZ3NzX2tyYjVfbWVjaC5jCkBAIC0xNjksNyArMTY5LDcgQEAKIAl9CiAKIAljdHhfaWQtPmludGVybmFsX2N0eF9pZCA9IGN0eDsKLQlkcHJpbnRrKCJSUEM6ICAgICAgU3VjY2VzZnVsbHkgaW1wb3J0ZWQgbmV3IGNvbnRleHQuXG4iKTsKKwlkcHJpbnRrKCJSUEM6ICAgICAgU3VjY2Vzc2Z1bGx5IGltcG9ydGVkIG5ldyBjb250ZXh0LlxuIik7CiAJcmV0dXJuIDA7CiAKIG91dF9lcnJfZnJlZV9rZXkyOgpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9hdXRoX2dzcy9nc3Nfc3BrbTNfbWVjaC5jIGIvbmV0L3N1bnJwYy9hdXRoX2dzcy9nc3Nfc3BrbTNfbWVjaC5jCmluZGV4IDViZjExY2MuLjNkMDQzMmEgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMvYXV0aF9nc3MvZ3NzX3Nwa20zX21lY2guYworKysgYi9uZXQvc3VucnBjL2F1dGhfZ3NzL2dzc19zcGttM19tZWNoLmMKQEAgLTIwMSw3ICsyMDEsNyBAQAogCiAJY3R4X2lkLT5pbnRlcm5hbF9jdHhfaWQgPSBjdHg7CiAKLQlkcHJpbnRrKCJTdWNjZXNmdWxseSBpbXBvcnRlZCBuZXcgc3BrbSBjb250ZXh0LlxuIik7CisJZHByaW50aygiU3VjY2Vzc2Z1bGx5IGltcG9ydGVkIG5ldyBzcGttIGNvbnRleHQuXG4iKTsKIAlyZXR1cm4gMDsKIAogb3V0X2Vycl9mcmVlX2tleTI6CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL2F1dGhfbnVsbC5jIGIvbmV0L3N1bnJwYy9hdXRoX251bGwuYwppbmRleCBmNTY3NjdhLi4yZWNjZmZhIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL2F1dGhfbnVsbC5jCisrKyBiL25ldC9zdW5ycGMvYXV0aF9udWxsLmMKQEAgLTExOCw2ICsxMTgsOCBAQAogCS5hdV9jc2xhY2sJPSA0LAogCS5hdV9yc2xhY2sJPSAyLAogCS5hdV9vcHMJCT0gJmF1dGhudWxsX29wcywKKwkuYXVfZmxhdm9yCT0gUlBDX0FVVEhfTlVMTCwKKwkuYXVfY291bnQJPSBBVE9NSUNfSU5JVCgwKSwKIH07CiAKIHN0YXRpYwpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9hdXRoX3VuaXguYyBiL25ldC9zdW5ycGMvYXV0aF91bml4LmMKaW5kZXggZGYxNGI2Yi4uNzRjNzQwNiAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9hdXRoX3VuaXguYworKysgYi9uZXQvc3VucnBjL2F1dGhfdW5peC5jCkBAIC0yMjUsNiArMjI1LDcgQEAKIAkuYXVfY3NsYWNrCT0gVU5YX1dSSVRFU0xBQ0ssCiAJLmF1X3JzbGFjawk9IDIsCQkJLyogYXNzdW1lIEFVVEhfTlVMTCB2ZXJmICovCiAJLmF1X29wcwkJPSAmYXV0aHVuaXhfb3BzLAorCS5hdV9mbGF2b3IJPSBSUENfQVVUSF9VTklYLAogCS5hdV9jb3VudAk9IEFUT01JQ19JTklUKDApLAogCS5hdV9jcmVkY2FjaGUJPSAmdW5peF9jcmVkX2NhY2hlLAogfTsKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvcnBjX3BpcGUuYyBiL25ldC9zdW5ycGMvcnBjX3BpcGUuYwppbmRleCA4MjQxZmE3Li5kYWZlNzkzIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3JwY19waXBlLmMKKysrIGIvbmV0L3N1bnJwYy9ycGNfcGlwZS5jCkBAIC00MzksNyArNDM5LDcgQEAKIHsKIAlpbnQgZXJyOwogCi0JZXJyID0gc2ltcGxlX3Bpbl9mcygicnBjX3BpcGVmcyIsICZycGNfbW91bnQsICZycGNfbW91bnRfY291bnQpOworCWVyciA9IHNpbXBsZV9waW5fZnMoJnJwY19waXBlX2ZzX3R5cGUsICZycGNfbW91bnQsICZycGNfbW91bnRfY291bnQpOwogCWlmIChlcnIgIT0gMCkKIAkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKIAlyZXR1cm4gcnBjX21vdW50OwpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy94ZHIuYyBiL25ldC9zdW5ycGMveGRyLmMKaW5kZXggY2E0YmZhNS4uNDkxNzRmMCAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy94ZHIuYworKysgYi9uZXQvc3VucnBjL3hkci5jCkBAIC01NjgsOCArNTY4LDcgQEAKICAqCiAgKiBNb3ZlcyBkYXRhIGJleW9uZCB0aGUgY3VycmVudCBwb2ludGVyIHBvc2l0aW9uIGZyb20gdGhlIFhEUiBoZWFkW10gYnVmZmVyCiAgKiBpbnRvIHRoZSBwYWdlIGxpc3QuIEFueSBkYXRhIHRoYXQgbGllcyBiZXlvbmQgY3VycmVudCBwb3NpdGlvbiArICJsZW4iCi0gKiBieXRlcyBpcyBtb3ZlZCBpbnRvIHRoZSBYRFIgdGFpbFtdLiBUaGUgY3VycmVudCBwb2ludGVyIGlzIHRoZW4KLSAqIHJlcG9zaXRpb25lZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBYRFIgdGFpbC4KKyAqIGJ5dGVzIGlzIG1vdmVkIGludG8gdGhlIFhEUiB0YWlsW10uCiAgKi8KIHZvaWQgeGRyX3JlYWRfcGFnZXMoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdW5zaWduZWQgaW50IGxlbikKIHsKQEAgLTYwNiw2ICs2MDUsMzEgQEAKIH0KIEVYUE9SVF9TWU1CT0woeGRyX3JlYWRfcGFnZXMpOwogCisvKioKKyAqIHhkcl9lbnRlcl9wYWdlIC0gZGVjb2RlIGRhdGEgZnJvbSB0aGUgWERSIHBhZ2UKKyAqIEB4ZHI6IHBvaW50ZXIgdG8geGRyX3N0cmVhbSBzdHJ1Y3QKKyAqIEBsZW46IG51bWJlciBvZiBieXRlcyBvZiBwYWdlIGRhdGEKKyAqCisgKiBNb3ZlcyBkYXRhIGJleW9uZCB0aGUgY3VycmVudCBwb2ludGVyIHBvc2l0aW9uIGZyb20gdGhlIFhEUiBoZWFkW10gYnVmZmVyCisgKiBpbnRvIHRoZSBwYWdlIGxpc3QuIEFueSBkYXRhIHRoYXQgbGllcyBiZXlvbmQgY3VycmVudCBwb3NpdGlvbiArICJsZW4iCisgKiBieXRlcyBpcyBtb3ZlZCBpbnRvIHRoZSBYRFIgdGFpbFtdLiBUaGUgY3VycmVudCBwb2ludGVyIGlzIHRoZW4KKyAqIHJlcG9zaXRpb25lZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaXJzdCBYRFIgcGFnZS4KKyAqLwordm9pZCB4ZHJfZW50ZXJfcGFnZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCWNoYXIgKiBrYWRkciA9IHBhZ2VfYWRkcmVzcyh4ZHItPmJ1Zi0+cGFnZXNbMF0pOworCXhkcl9yZWFkX3BhZ2VzKHhkciwgbGVuKTsKKwkvKgorCSAqIFBvc2l0aW9uIGN1cnJlbnQgcG9pbnRlciBhdCBiZWdpbm5pbmcgb2YgdGFpbCwgYW5kCisJICogc2V0IHJlbWFpbmluZyBtZXNzYWdlIGxlbmd0aC4KKwkgKi8KKwlpZiAobGVuID4gUEFHRV9DQUNIRV9TSVpFIC0geGRyLT5idWYtPnBhZ2VfYmFzZSkKKwkJbGVuID0gUEFHRV9DQUNIRV9TSVpFIC0geGRyLT5idWYtPnBhZ2VfYmFzZTsKKwl4ZHItPnAgPSAodWludDMyX3QgKikoa2FkZHIgKyB4ZHItPmJ1Zi0+cGFnZV9iYXNlKTsKKwl4ZHItPmVuZCA9ICh1aW50MzJfdCAqKSgoY2hhciAqKXhkci0+cCArIGxlbik7Cit9CitFWFBPUlRfU1lNQk9MKHhkcl9lbnRlcl9wYWdlKTsKKwogc3RhdGljIHN0cnVjdCBrdmVjIGVtcHR5X2lvdiA9IHsuaW92X2Jhc2UgPSBOVUxMLCAuaW92X2xlbiA9IDB9OwogCiB2b2lkCmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3hwcnQuYyBiL25ldC9zdW5ycGMveHBydC5jCmluZGV4IDRkZDViM2MuLjAyMDYwZDAgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMveHBydC5jCisrKyBiL25ldC9zdW5ycGMveHBydC5jCkBAIC00MSw3ICs0MSw3IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KLSNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXQuaD4KIAogI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9jbG50Lmg+CiAjaW5jbHVkZSA8bGludXgvc3VucnBjL21ldHJpY3MuaD4KQEAgLTgzMCw3ICs4MzAsNyBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgeHBydF9pbml0X3hpZChzdHJ1Y3QgcnBjX3hwcnQgKnhwcnQpCiB7Ci0JZ2V0X3JhbmRvbV9ieXRlcygmeHBydC0+eGlkLCBzaXplb2YoeHBydC0+eGlkKSk7CisJeHBydC0+eGlkID0gbmV0X3JhbmRvbSgpOwogfQogCiBzdGF0aWMgdm9pZCB4cHJ0X3JlcXVlc3RfaW5pdChzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2ssIHN0cnVjdCBycGNfeHBydCAqeHBydCkKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMveHBydHNvY2suYyBiL25ldC9zdW5ycGMveHBydHNvY2suYwppbmRleCA0YjRlN2RmLi4yMTAwNmIxIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3hwcnRzb2NrLmMKKysrIGIvbmV0L3N1bnJwYy94cHJ0c29jay5jCkBAIC05MzAsNiArOTMwLDEzIEBACiAJeHBydF9hZGp1c3RfY3duZCh0YXNrLCAtRVRJTUVET1VUKTsKIH0KIAorc3RhdGljIHVuc2lnbmVkIHNob3J0IHhzX2dldF9yYW5kb21fcG9ydCh2b2lkKQoreworCXVuc2lnbmVkIHNob3J0IHJhbmdlID0geHBydF9tYXhfcmVzdnBvcnQgLSB4cHJ0X21pbl9yZXN2cG9ydDsKKwl1bnNpZ25lZCBzaG9ydCByYW5kID0gKHVuc2lnbmVkIHNob3J0KSBuZXRfcmFuZG9tKCkgJSByYW5nZTsKKwlyZXR1cm4gcmFuZCArIHhwcnRfbWluX3Jlc3Zwb3J0OworfQorCiAvKioKICAqIHhzX3NldF9wb3J0IC0gcmVzZXQgdGhlIHBvcnQgbnVtYmVyIGluIHRoZSByZW1vdGUgZW5kcG9pbnQgYWRkcmVzcwogICogQHhwcnQ6IGdlbmVyaWMgdHJhbnNwb3J0CkBAIC0xMjc1LDcgKzEyODIsNyBAQAogCW1lbXNldCh4cHJ0LT5zbG90LCAwLCBzbG90X3RhYmxlX3NpemUpOwogCiAJeHBydC0+cHJvdCA9IElQUFJPVE9fVURQOwotCXhwcnQtPnBvcnQgPSB4cHJ0X21heF9yZXN2cG9ydDsKKwl4cHJ0LT5wb3J0ID0geHNfZ2V0X3JhbmRvbV9wb3J0KCk7CiAJeHBydC0+dHNoX3NpemUgPSAwOwogCXhwcnQtPnJlc3Zwb3J0ID0gY2FwYWJsZShDQVBfTkVUX0JJTkRfU0VSVklDRSkgPyAxIDogMDsKIAkvKiBYWFg6IGhlYWRlciBzaXplIGNhbiB2YXJ5IGR1ZSB0byBhdXRoIHR5cGUsIElQdjYsIGV0Yy4gKi8KQEAgLTEzMTcsNyArMTMyNCw3IEBACiAJbWVtc2V0KHhwcnQtPnNsb3QsIDAsIHNsb3RfdGFibGVfc2l6ZSk7CiAKIAl4cHJ0LT5wcm90ID0gSVBQUk9UT19UQ1A7Ci0JeHBydC0+cG9ydCA9IHhwcnRfbWF4X3Jlc3Zwb3J0OworCXhwcnQtPnBvcnQgPSB4c19nZXRfcmFuZG9tX3BvcnQoKTsKIAl4cHJ0LT50c2hfc2l6ZSA9IHNpemVvZihycGNfZnJhZ2hkcikgLyBzaXplb2YodTMyKTsKIAl4cHJ0LT5yZXN2cG9ydCA9IGNhcGFibGUoQ0FQX05FVF9CSU5EX1NFUlZJQ0UpID8gMSA6IDA7CiAJeHBydC0+bWF4X3BheWxvYWQgPSBSUENfTUFYX0ZSQUdNRU5UX1NJWkU7CmRpZmYgLS1naXQgYS9uZXQvdGlwYy9iY2FzdC5jIGIvbmV0L3RpcGMvYmNhc3QuYwppbmRleCAyYzRlY2JlLi41NDEyODA0IDEwMDY0NAotLS0gYS9uZXQvdGlwYy9iY2FzdC5jCisrKyBiL25ldC90aXBjL2JjYXN0LmMKQEAgLTQ5LDEzICs0OSwxOSBAQAogI2luY2x1ZGUgIm5hbWVfdGFibGUuaCIKICNpbmNsdWRlICJiY2FzdC5oIgogCi0KICNkZWZpbmUgTUFYX1BLVF9ERUZBVUxUX01DQVNUIDE1MDAJLyogYmNhc3QgbGluayBtYXggcGFja2V0IHNpemUgKGZpeGVkKSAqLwogCiAjZGVmaW5lIEJDTElOS19XSU5fREVGQVVMVCAyMAkJLyogYmNhc3QgbGluayB3aW5kb3cgc2l6ZSAoZGVmYXVsdCkgKi8KIAogI2RlZmluZSBCQ0xJTktfTE9HX0JVRl9TSVpFIDAKIAorLyoKKyAqIExvc3MgcmF0ZSBmb3IgaW5jb21pbmcgYnJvYWRjYXN0IGZyYW1lczsgdXNlZCB0byB0ZXN0IHJldHJhbnNtaXNzaW9uIGNvZGUuCisgKiBTZXQgdG8gTiB0byBjYXVzZSBldmVyeSBOJ3RoIGZyYW1lIHRvIGJlIGRpc2NhcmRlZDsgMCA9PiBkb24ndCBkaXNjYXJkIGFueS4KKyAqLworIAorI2RlZmluZSBUSVBDX0JDQVNUX0xPU1NfUkFURSAwCisKIC8qKgogICogc3RydWN0IGJjYmVhcmVyX3BhaXIgLSBhIHBhaXIgb2YgYmVhcmVycyB1c2VkIGJ5IGJyb2FkY2FzdCBsaW5rCiAgKiBAcHJpbWFyeTogcG9pbnRlciB0byBwcmltYXJ5IGJlYXJlcgpAQCAtNzUsNyArODEsMTQgQEAKICAqIEBiZWFyZXI6IChub24tc3RhbmRhcmQpIGJyb2FkY2FzdCBiZWFyZXIgc3RydWN0dXJlCiAgKiBAbWVkaWE6IChub24tc3RhbmRhcmQpIGJyb2FkY2FzdCBtZWRpYSBzdHJ1Y3R1cmUKICAqIEBicGFpcnM6IGFycmF5IG9mIGJlYXJlciBwYWlycwotICogQGJwYWlyc190ZW1wOiBhcnJheSBvZiBiZWFyZXIgcGFpcnMgdXNlZCBkdXJpbmcgY3JlYXRpb24gb2YgImJwYWlycyIKKyAqIEBicGFpcnNfdGVtcDogdGVtcG9yYXJ5IGFycmF5IG9mIGJlYXJlciBwYWlycyB1c2VkIGJ5IHRpcGNfYmNiZWFyZXJfc29ydCgpCisgKiBAcmVtYWluczogdGVtcG9yYXJ5IG5vZGUgbWFwIHVzZWQgYnkgdGlwY19iY2JlYXJlcl9zZW5kKCkKKyAqIEByZW1haW5zX25ldzogdGVtcG9yYXJ5IG5vZGUgbWFwIHVzZWQgdGlwY19iY2JlYXJlcl9zZW5kKCkKKyAqIAorICogTm90ZTogVGhlIGZpZWxkcyBsYWJlbGxlZCAidGVtcG9yYXJ5IiBhcmUgaW5jb3Jwb3JhdGVkIGludG8gdGhlIGJlYXJlcgorICogdG8gYXZvaWQgY29uc3VtaW5nIHBvdGVudGlhbGx5IGxpbWl0ZWQgc3RhY2sgc3BhY2UgdGhyb3VnaCB0aGUgdXNlIG9mCisgKiBsYXJnZSBsb2NhbCB2YXJpYWJsZXMgd2l0aGluIG11bHRpY2FzdCByb3V0aW5lcy4gIENvbmN1cnJlbnQgYWNjZXNzIGlzCisgKiBwcmV2ZW50ZWQgdGhyb3VnaCB1c2Ugb2YgdGhlIHNwaW5sb2NrICJiY19sb2NrIi4KICAqLwogCiBzdHJ1Y3QgYmNiZWFyZXIgewpAQCAtODMsNiArOTYsOCBAQAogCXN0cnVjdCBtZWRpYSBtZWRpYTsKIAlzdHJ1Y3QgYmNiZWFyZXJfcGFpciBicGFpcnNbTUFYX0JFQVJFUlNdOwogCXN0cnVjdCBiY2JlYXJlcl9wYWlyIGJwYWlyc190ZW1wW1RJUENfTUFYX0xJTktfUFJJICsgMV07CisJc3RydWN0IG5vZGVfbWFwIHJlbWFpbnM7CisJc3RydWN0IG5vZGVfbWFwIHJlbWFpbnNfbmV3OwogfTsKIAogLyoqCkBAIC0xNjUsMjEgKzE4MCwxOCBAQAogICogQGFmdGVyOiBzZXF1ZW5jZSBudW1iZXIgb2YgbGFzdCBwYWNrZXQgdG8gKm5vdCogcmV0cmFuc21pdAogICogQHRvOiBzZXF1ZW5jZSBudW1iZXIgb2YgbGFzdCBwYWNrZXQgdG8gcmV0cmFuc21pdAogICogCi0gKiBDYWxsZWQgd2l0aCAnbm9kZScgbG9ja2VkLCBiY19sb2NrIHVubG9ja2VkCisgKiBDYWxsZWQgd2l0aCBiY19sb2NrIGxvY2tlZAogICovCiAKIHN0YXRpYyB2b2lkIGJjbGlua19yZXRyYW5zbWl0X3BrdCh1MzIgYWZ0ZXIsIHUzMiB0bykKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqYnVmOwogCi0Jc3Bpbl9sb2NrX2JoKCZiY19sb2NrKTsKIAlidWYgPSBiY2wtPmZpcnN0X291dDsKIAl3aGlsZSAoYnVmICYmIGxlc3NfZXEoYnVmX3NlcW5vKGJ1ZiksIGFmdGVyKSkgewogCQlidWYgPSBidWYtPm5leHQ7ICAgICAgICAgICAgICAgIAogCX0KLQlpZiAoYnVmICE9IE5VTEwpCi0JCXRpcGNfbGlua19yZXRyYW5zbWl0KGJjbCwgYnVmLCBtb2QodG8gLSBhZnRlcikpOwotCXNwaW5fdW5sb2NrX2JoKCZiY19sb2NrKTsgICAgICAgICAgICAgIAorCXRpcGNfbGlua19yZXRyYW5zbWl0KGJjbCwgYnVmLCBtb2QodG8gLSBhZnRlcikpOwogfQogCiAvKiogCkBAIC0zNDYsOCArMzU4LDEwIEBACiAJCWZvciAoOyBidWY7IGJ1ZiA9IGJ1Zi0+bmV4dCkgewogCQkJdTMyIHNlcW5vID0gYnVmX3NlcW5vKGJ1Zik7CiAKLQkJCWlmIChtb2Qoc2Vxbm8gLSBwcmV2KSAhPSAxKQorCQkJaWYgKG1vZChzZXFubyAtIHByZXYpICE9IDEpIHsKIAkJCQlidWYgPSBOVUxMOworCQkJCWJyZWFrOworCQkJfQogCQkJaWYgKHNlcW5vID09IGdhcF9hZnRlcikKIAkJCQlicmVhazsKIAkJCXByZXYgPSBzZXFubzsKQEAgLTM5OSw3ICs0MTMsMTAgQEAKICAqLwogCiB2b2lkIHRpcGNfYmNsaW5rX3JlY3ZfcGt0KHN0cnVjdCBza19idWZmICpidWYpCi17ICAgICAgICAKK3sKKyNpZiAoVElQQ19CQ0FTVF9MT1NTX1JBVEUpCisJc3RhdGljIGludCByeF9jb3VudCA9IDA7CisjZW5kaWYKIAlzdHJ1Y3QgdGlwY19tc2cgKm1zZyA9IGJ1Zl9tc2coYnVmKTsKIAlzdHJ1Y3Qgbm9kZSogbm9kZSA9IHRpcGNfbm9kZV9maW5kKG1zZ19wcmV2bm9kZShtc2cpKTsKIAl1MzIgbmV4dF9pbjsKQEAgLTQyMCw5ICs0MzcsMTMgQEAKIAkJCXRpcGNfbm9kZV9sb2NrKG5vZGUpOwogCQkJdGlwY19iY2xpbmtfYWNrbm93bGVkZ2Uobm9kZSwgbXNnX2JjYXN0X2Fjayhtc2cpKTsKIAkJCXRpcGNfbm9kZV91bmxvY2sobm9kZSk7CisJCQlzcGluX2xvY2tfYmgoJmJjX2xvY2spOwogCQkJYmNsLT5zdGF0cy5yZWN2X25hY2tzKys7CisJCQliY2wtPm93bmVyLT5uZXh0ID0gbm9kZTsgICAvKiByZW1lbWJlciByZXF1ZXN0b3IgKi8KIAkJCWJjbGlua19yZXRyYW5zbWl0X3BrdChtc2dfYmNnYXBfYWZ0ZXIobXNnKSwKIAkJCQkJICAgICAgbXNnX2JjZ2FwX3RvKG1zZykpOworCQkJYmNsLT5vd25lci0+bmV4dCA9IE5VTEw7CisJCQlzcGluX3VubG9ja19iaCgmYmNfbG9jayk7ICAgICAgICAgICAgICAKIAkJfSBlbHNlIHsKIAkJCXRpcGNfYmNsaW5rX3BlZWtfbmFjayhtc2dfZGVzdG5vZGUobXNnKSwKIAkJCQkJICAgICAgbXNnX2JjYXN0X3RhZyhtc2cpLApAQCAtNDMzLDYgKzQ1NCwxNCBAQAogCQlyZXR1cm47CiAJfQogCisjaWYgKFRJUENfQkNBU1RfTE9TU19SQVRFKQorCWlmICgrK3J4X2NvdW50ID09IFRJUENfQkNBU1RfTE9TU19SQVRFKSB7CisJCXJ4X2NvdW50ID0gMDsKKwkJYnVmX2Rpc2NhcmQoYnVmKTsKKwkJcmV0dXJuOworCX0KKyNlbmRpZgorCiAJdGlwY19ub2RlX2xvY2sobm9kZSk7CiByZWNlaXZlOgogCWRlZmVycmVkID0gbm9kZS0+YmNsaW5rLmRlZmVycmVkX2hlYWQ7CkBAIC01MzEsMTIgKzU2MCw4IEBACiB7CiAJc3RhdGljIGludCBzZW5kX2NvdW50ID0gMDsKIAotCXN0cnVjdCBub2RlX21hcCAqcmVtYWluczsKLQlzdHJ1Y3Qgbm9kZV9tYXAgKnJlbWFpbnNfbmV3OwotCXN0cnVjdCBub2RlX21hcCAqcmVtYWluc190bXA7CiAJaW50IGJwX2luZGV4OwogCWludCBzd2FwX3RpbWU7Ci0JaW50IGVycjsKIAogCS8qIFByZXBhcmUgYnVmZmVyIGZvciBicm9hZGNhc3RpbmcgKGlmIGZpcnN0IHRpbWUgdHJ5aW5nIHRvIHNlbmQgaXQpICovCiAKQEAgLTU1Nyw5ICs1ODIsNyBAQAogCiAJLyogU2VuZCBidWZmZXIgb3ZlciBiZWFyZXJzIHVudGlsIGFsbCB0YXJnZXRzIHJlYWNoZWQgKi8KIAkKLQlyZW1haW5zID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG5vZGVfbWFwKSwgR0ZQX0FUT01JQyk7Ci0JcmVtYWluc19uZXcgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgbm9kZV9tYXApLCBHRlBfQVRPTUlDKTsKLQkqcmVtYWlucyA9IHRpcGNfY2x0cl9iY2FzdF9ub2RlczsKKwliY2JlYXJlci0+cmVtYWlucyA9IHRpcGNfY2x0cl9iY2FzdF9ub2RlczsKIAogCWZvciAoYnBfaW5kZXggPSAwOyBicF9pbmRleCA8IE1BWF9CRUFSRVJTOyBicF9pbmRleCsrKSB7CiAJCXN0cnVjdCBiZWFyZXIgKnAgPSBiY2JlYXJlci0+YnBhaXJzW2JwX2luZGV4XS5wcmltYXJ5OwpAQCAtNTY4LDggKzU5MSw4IEBACiAJCWlmICghcCkKIAkJCWJyZWFrOwkvKiBubyBtb3JlIGJlYXJlcnMgdG8gdHJ5ICovCiAKLQkJdGlwY19ubWFwX2RpZmYocmVtYWlucywgJnAtPm5vZGVzLCByZW1haW5zX25ldyk7Ci0JCWlmIChyZW1haW5zX25ldy0+Y291bnQgPT0gcmVtYWlucy0+Y291bnQpCisJCXRpcGNfbm1hcF9kaWZmKCZiY2JlYXJlci0+cmVtYWlucywgJnAtPm5vZGVzLCAmYmNiZWFyZXItPnJlbWFpbnNfbmV3KTsKKwkJaWYgKGJjYmVhcmVyLT5yZW1haW5zX25ldy5jb3VudCA9PSBiY2JlYXJlci0+cmVtYWlucy5jb3VudCkKIAkJCWNvbnRpbnVlOwkvKiBiZWFyZXIgcGFpciBkb2Vzbid0IGFkZCBhbnl0aGluZyAqLwogCiAJCWlmICghcC0+cHVibC5ibG9ja2VkICYmCkBAIC01ODcsMjcgKzYxMCwxNyBAQAogCQliY2JlYXJlci0+YnBhaXJzW2JwX2luZGV4XS5wcmltYXJ5ID0gczsKIAkJYmNiZWFyZXItPmJwYWlyc1ticF9pbmRleF0uc2Vjb25kYXJ5ID0gcDsKIHVwZGF0ZToKLQkJaWYgKHJlbWFpbnNfbmV3LT5jb3VudCA9PSAwKSB7Ci0JCQllcnIgPSBUSVBDX09LOwotCQkJZ290byBvdXQ7Ci0JCX0KKwkJaWYgKGJjYmVhcmVyLT5yZW1haW5zX25ldy5jb3VudCA9PSAwKQorCQkJcmV0dXJuIFRJUENfT0s7CiAKLQkJLyogc3dhcCBtYXAgKi8KLQkJcmVtYWluc190bXAgPSByZW1haW5zOwotCQlyZW1haW5zID0gcmVtYWluc19uZXc7Ci0JCXJlbWFpbnNfbmV3ID0gcmVtYWluc190bXA7CisJCWJjYmVhcmVyLT5yZW1haW5zID0gYmNiZWFyZXItPnJlbWFpbnNfbmV3OwogCX0KIAkKIAkvKiBVbmFibGUgdG8gcmVhY2ggYWxsIHRhcmdldHMgKi8KIAogCWJjYmVhcmVyLT5iZWFyZXIucHVibC5ibG9ja2VkID0gMTsKIAliY2wtPnN0YXRzLmJlYXJlcl9jb25ncysrOwotCWVyciA9IH5USVBDX09LOwotCi0gb3V0OgotCWtmcmVlKHJlbWFpbnNfbmV3KTsKLQlrZnJlZShyZW1haW5zKTsKLQlyZXR1cm4gZXJyOworCXJldHVybiB+VElQQ19PSzsKIH0KIAogLyoqCkBAIC03NjUsNyArNzc4LDcgQEAKIAliY2xpbmsgPSBrbWFsbG9jKHNpemVvZigqYmNsaW5rKSwgR0ZQX0FUT01JQyk7CiAJaWYgKCFiY2JlYXJlciB8fCAhYmNsaW5rKSB7CiAgbm9tZW06Ci0JIAl3YXJuKCJNZW1vcnkgc3F1ZWV6ZTsgRmFpbGVkIHRvIGNyZWF0ZSBtdWx0aWNhc3QgbGlua1xuIik7CisJIAl3YXJuKCJNdWx0aWNhc3QgbGluayBjcmVhdGlvbiBmYWlsZWQsIG5vIG1lbW9yeVxuIik7CiAJCWtmcmVlKGJjYmVhcmVyKTsKIAkJYmNiZWFyZXIgPSBOVUxMOwogCQlrZnJlZShiY2xpbmspOwpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvYmNhc3QuaCBiL25ldC90aXBjL2JjYXN0LmgKaW5kZXggMGUzYmUyYS4uYjI0M2Q5ZCAxMDA2NDQKLS0tIGEvbmV0L3RpcGMvYmNhc3QuaAorKysgYi9uZXQvdGlwYy9iY2FzdC5oCkBAIC0xODAsNyArMTgwLDcgQEAKIAkJaWYgKCFpdGVtLT5uZXh0KSB7CiAJCQlpdGVtLT5uZXh0ID0ga21hbGxvYyhzaXplb2YoKml0ZW0pLCBHRlBfQVRPTUlDKTsKIAkJCWlmICghaXRlbS0+bmV4dCkgewotCQkJCXdhcm4oIk1lbW9yeSBzcXVlZXplOiBtdWx0aWNhc3QgZGVzdGluYXRpb24gcG9ydCBsaXN0IGlzIGluY29tcGxldGVcbiIpOworCQkJCXdhcm4oIkluY29tcGxldGUgbXVsdGljYXN0IGRlbGl2ZXJ5LCBubyBtZW1vcnlcbiIpOwogCQkJCXJldHVybjsKIAkJCX0KIAkJCWl0ZW0tPm5leHQtPm5leHQgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvYmVhcmVyLmMgYi9uZXQvdGlwYy9iZWFyZXIuYwppbmRleCBlMjEzYThlLi40ZmEyNGI1IDEwMDY0NAotLS0gYS9uZXQvdGlwYy9iZWFyZXIuYworKysgYi9uZXQvdGlwYy9iZWFyZXIuYwpAQCAtMTEyLDM5ICsxMTIsNDIgQEAKIAkJZ290byBleGl0OwogCiAJaWYgKCFtZWRpYV9uYW1lX3ZhbGlkKG5hbWUpKSB7Ci0JCXdhcm4oIk1lZGlhIHJlZ2lzdHJhdGlvbiBlcnJvcjogaWxsZWdhbCBuYW1lIDwlcz5cbiIsIG5hbWUpOworCQl3YXJuKCJNZWRpYSA8JXM+IHJlamVjdGVkLCBpbGxlZ2FsIG5hbWVcbiIsIG5hbWUpOwogCQlnb3RvIGV4aXQ7CiAJfQogCWlmICghYmNhc3RfYWRkcikgewotCQl3YXJuKCJNZWRpYSByZWdpc3RyYXRpb24gZXJyb3I6IG5vIGJyb2FkY2FzdCBhZGRyZXNzIHN1cHBsaWVkXG4iKTsKKwkJd2FybigiTWVkaWEgPCVzPiByZWplY3RlZCwgbm8gYnJvYWRjYXN0IGFkZHJlc3NcbiIsIG5hbWUpOwogCQlnb3RvIGV4aXQ7CiAJfQogCWlmICgoYmVhcmVyX3ByaW9yaXR5IDwgVElQQ19NSU5fTElOS19QUkkpICYmCiAJICAgIChiZWFyZXJfcHJpb3JpdHkgPiBUSVBDX01BWF9MSU5LX1BSSSkpIHsKLQkJd2FybigiTWVkaWEgcmVnaXN0cmF0aW9uIGVycm9yOiBwcmlvcml0eSAldVxuIiwgYmVhcmVyX3ByaW9yaXR5KTsKKwkJd2FybigiTWVkaWEgPCVzPiByZWplY3RlZCwgaWxsZWdhbCBwcmlvcml0eSAoJXUpXG4iLCBuYW1lLCAKKwkJICAgICBiZWFyZXJfcHJpb3JpdHkpOwogCQlnb3RvIGV4aXQ7CiAJfQogCWlmICgobGlua190b2xlcmFuY2UgPCBUSVBDX01JTl9MSU5LX1RPTCkgfHwgCiAJICAgIChsaW5rX3RvbGVyYW5jZSA+IFRJUENfTUFYX0xJTktfVE9MKSkgewotCQl3YXJuKCJNZWRpYSByZWdpc3RyYXRpb24gZXJyb3I6IHRvbGVyYW5jZSAldVxuIiwgbGlua190b2xlcmFuY2UpOworCQl3YXJuKCJNZWRpYSA8JXM+IHJlamVjdGVkLCBpbGxlZ2FsIHRvbGVyYW5jZSAoJXUpXG4iLCBuYW1lLAorCQkgICAgIGxpbmtfdG9sZXJhbmNlKTsKIAkJZ290byBleGl0OwogCX0KIAogCW1lZGlhX2lkID0gbWVkaWFfY291bnQrKzsKIAlpZiAobWVkaWFfaWQgPj0gTUFYX01FRElBKSB7Ci0JCXdhcm4oIkF0dGVtcHQgdG8gcmVnaXN0ZXIgbW9yZSB0aGFuICV1IG1lZGlhXG4iLCBNQVhfTUVESUEpOworCQl3YXJuKCJNZWRpYSA8JXM+IHJlamVjdGVkLCBtZWRpYSBsaW1pdCByZWFjaGVkICgldSlcbiIsIG5hbWUsCisJCSAgICAgTUFYX01FRElBKTsKIAkJbWVkaWFfY291bnQtLTsKIAkJZ290byBleGl0OwogCX0KIAlmb3IgKGkgPSAwOyBpIDwgbWVkaWFfaWQ7IGkrKykgewogCQlpZiAobWVkaWFfbGlzdFtpXS50eXBlX2lkID09IG1lZGlhX3R5cGUpIHsKLQkJCXdhcm4oIkF0dGVtcHQgdG8gcmVnaXN0ZXIgc2Vjb25kIG1lZGlhIHdpdGggdHlwZSAldVxuIiwgCisJCQl3YXJuKCJNZWRpYSA8JXM+IHJlamVjdGVkLCBkdXBsaWNhdGUgdHlwZSAoJXUpXG4iLCBuYW1lLAogCQkJICAgICBtZWRpYV90eXBlKTsKIAkJCW1lZGlhX2NvdW50LS07CiAJCQlnb3RvIGV4aXQ7CiAJCX0KIAkJaWYgKCFzdHJjbXAobmFtZSwgbWVkaWFfbGlzdFtpXS5uYW1lKSkgewotCQkJd2FybigiQXR0ZW1wdCB0byByZS1yZWdpc3RlciBtZWRpYSBuYW1lIDwlcz5cbiIsIG5hbWUpOworCQkJd2FybigiTWVkaWEgPCVzPiByZWplY3RlZCwgZHVwbGljYXRlIG5hbWVcbiIsIG5hbWUpOwogCQkJbWVkaWFfY291bnQtLTsKIAkJCWdvdG8gZXhpdDsKIAkJfQpAQCAtMjgzLDYgKzI4Niw5IEBACiAJc3RydWN0IGJlYXJlciAqYl9wdHI7CiAJdTMyIGk7CiAKKwlpZiAodGlwY19tb2RlICE9IFRJUENfTkVUX01PREUpCisJCXJldHVybiBOVUxMOworCiAJZm9yIChpID0gMCwgYl9wdHIgPSB0aXBjX2JlYXJlcnM7IGkgPCBNQVhfQkVBUkVSUzsgaSsrLCBiX3B0cisrKSB7CiAJCWlmIChiX3B0ci0+YWN0aXZlICYmICghc3RyY21wKGJfcHRyLT5wdWJsLm5hbWUsIG5hbWUpKSkKIAkJCXJldHVybiBiX3B0cjsKQEAgLTQ3NSwyNiArNDgxLDMzIEBACiAJdTMyIGk7CiAJaW50IHJlcyA9IC1FSU5WQUw7CiAKLQlpZiAodGlwY19tb2RlICE9IFRJUENfTkVUX01PREUpCisJaWYgKHRpcGNfbW9kZSAhPSBUSVBDX05FVF9NT0RFKSB7CisJCXdhcm4oIkJlYXJlciA8JXM+IHJlamVjdGVkLCBub3Qgc3VwcG9ydGVkIGluIHN0YW5kYWxvbmUgbW9kZVxuIiwKKwkJICAgICBuYW1lKTsKIAkJcmV0dXJuIC1FTk9QUk9UT09QVDsKLQotCWlmICghYmVhcmVyX25hbWVfdmFsaWRhdGUobmFtZSwgJmJfbmFtZSkgfHwKLQkgICAgIXRpcGNfYWRkcl9kb21haW5fdmFsaWQoYmNhc3Rfc2NvcGUpIHx8Ci0JICAgICFpbl9zY29wZShiY2FzdF9zY29wZSwgdGlwY19vd25fYWRkcikpCisJfQorCWlmICghYmVhcmVyX25hbWVfdmFsaWRhdGUobmFtZSwgJmJfbmFtZSkpIHsKKwkJd2FybigiQmVhcmVyIDwlcz4gcmVqZWN0ZWQsIGlsbGVnYWwgbmFtZVxuIiwgbmFtZSk7CiAJCXJldHVybiAtRUlOVkFMOwotCisJfQorCWlmICghdGlwY19hZGRyX2RvbWFpbl92YWxpZChiY2FzdF9zY29wZSkgfHwgCisJICAgICFpbl9zY29wZShiY2FzdF9zY29wZSwgdGlwY19vd25fYWRkcikpIHsKKwkJd2FybigiQmVhcmVyIDwlcz4gcmVqZWN0ZWQsIGlsbGVnYWwgYnJvYWRjYXN0IHNjb3BlXG4iLCBuYW1lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQogCWlmICgocHJpb3JpdHkgPCBUSVBDX01JTl9MSU5LX1BSSSB8fAogCSAgICAgcHJpb3JpdHkgPiBUSVBDX01BWF9MSU5LX1BSSSkgJiYKLQkgICAgKHByaW9yaXR5ICE9IFRJUENfTUVESUFfTElOS19QUkkpKQorCSAgICAocHJpb3JpdHkgIT0gVElQQ19NRURJQV9MSU5LX1BSSSkpIHsKKwkJd2FybigiQmVhcmVyIDwlcz4gcmVqZWN0ZWQsIGlsbGVnYWwgcHJpb3JpdHlcbiIsIG5hbWUpOwogCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAKIAl3cml0ZV9sb2NrX2JoKCZ0aXBjX25ldF9sb2NrKTsKLQlpZiAoIXRpcGNfYmVhcmVycykKLQkJZ290byBmYWlsZWQ7CiAKIAltX3B0ciA9IG1lZGlhX2ZpbmQoYl9uYW1lLm1lZGlhX25hbWUpOwogCWlmICghbV9wdHIpIHsKLQkJd2FybigiTm8gbWVkaWEgPCVzPlxuIiwgYl9uYW1lLm1lZGlhX25hbWUpOworCQl3YXJuKCJCZWFyZXIgPCVzPiByZWplY3RlZCwgbWVkaWEgPCVzPiBub3QgcmVnaXN0ZXJlZFxuIiwgbmFtZSwKKwkJICAgICBiX25hbWUubWVkaWFfbmFtZSk7CiAJCWdvdG8gZmFpbGVkOwogCX0KIApAQCAtNTEwLDIzICs1MjMsMjQgQEAKIAkJCWNvbnRpbnVlOwogCQl9CiAJCWlmICghc3RyY21wKG5hbWUsIHRpcGNfYmVhcmVyc1tpXS5wdWJsLm5hbWUpKSB7Ci0JCQl3YXJuKCJCZWFyZXIgPCVzPiBhbHJlYWR5IGVuYWJsZWRcbiIsIG5hbWUpOworCQkJd2FybigiQmVhcmVyIDwlcz4gcmVqZWN0ZWQsIGFscmVhZHkgZW5hYmxlZFxuIiwgbmFtZSk7CiAJCQlnb3RvIGZhaWxlZDsKIAkJfQogCQlpZiAoKHRpcGNfYmVhcmVyc1tpXS5wcmlvcml0eSA9PSBwcmlvcml0eSkgJiYKIAkJICAgICgrK3dpdGhfdGhpc19wcmlvID4gMikpIHsKIAkJCWlmIChwcmlvcml0eS0tID09IDApIHsKLQkJCQl3YXJuKCJUaGlyZCBiZWFyZXIgPCVzPiB3aXRoIHByaW9yaXR5ICV1LCB1bmFibGUgdG8gbG93ZXIgdG8gJXVcbiIsCi0JCQkJICAgICBuYW1lLCBwcmlvcml0eSArIDEsIHByaW9yaXR5KTsKKwkJCQl3YXJuKCJCZWFyZXIgPCVzPiByZWplY3RlZCwgZHVwbGljYXRlIHByaW9yaXR5XG4iLAorCQkJCSAgICAgbmFtZSk7CiAJCQkJZ290byBmYWlsZWQ7CiAJCQl9Ci0JCQl3YXJuKCJUaGlyZCBiZWFyZXIgPCVzPiB3aXRoIHByaW9yaXR5ICV1LCBsb3dlcmluZyB0byAldVxuIiwKKwkJCXdhcm4oIkJlYXJlciA8JXM+IHByaW9yaXR5IGFkanVzdG1lbnQgcmVxdWlyZWQgJXUtPiV1XG4iLAogCQkJICAgICBuYW1lLCBwcmlvcml0eSArIDEsIHByaW9yaXR5KTsKIAkJCWdvdG8gcmVzdGFydDsKIAkJfQogCX0KIAlpZiAoYmVhcmVyX2lkID49IE1BWF9CRUFSRVJTKSB7Ci0JCXdhcm4oIkF0dGVtcHQgdG8gZW5hYmxlIG1vcmUgdGhhbiAlZCBiZWFyZXJzXG4iLCBNQVhfQkVBUkVSUyk7CisJCXdhcm4oIkJlYXJlciA8JXM+IHJlamVjdGVkLCBiZWFyZXIgbGltaXQgcmVhY2hlZCAoJXUpXG4iLCAKKwkJICAgICBuYW1lLCBNQVhfQkVBUkVSUyk7CiAJCWdvdG8gZmFpbGVkOwogCX0KIApAQCAtNTM2LDcgKzU1MCw3IEBACiAJc3RyY3B5KGJfcHRyLT5wdWJsLm5hbWUsIG5hbWUpOwogCXJlcyA9IG1fcHRyLT5lbmFibGVfYmVhcmVyKCZiX3B0ci0+cHVibCk7CiAJaWYgKHJlcykgewotCQl3YXJuKCJGYWlsZWQgdG8gZW5hYmxlIGJlYXJlciA8JXM+XG4iLCBuYW1lKTsKKwkJd2FybigiQmVhcmVyIDwlcz4gcmVqZWN0ZWQsIGVuYWJsZSBmYWlsdXJlICglZClcbiIsIG5hbWUsIC1yZXMpOwogCQlnb3RvIGZhaWxlZDsKIAl9CiAKQEAgLTU3Myw5ICs1ODcsNiBAQAogCXN0cnVjdCBsaW5rICpsX3B0cjsKIAlzdHJ1Y3QgbGluayAqdGVtcF9sX3B0cjsKIAotCWlmICh0aXBjX21vZGUgIT0gVElQQ19ORVRfTU9ERSkKLQkJcmV0dXJuIC1FTk9QUk9UT09QVDsKLQogCXJlYWRfbG9ja19iaCgmdGlwY19uZXRfbG9jayk7CiAJYl9wdHIgPSBiZWFyZXJfZmluZChuYW1lKTsKIAlpZiAoIWJfcHRyKSB7CkBAIC01ODQsNiArNTk1LDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJaW5mbygiQmxvY2tpbmcgYmVhcmVyIDwlcz5cbiIsIG5hbWUpOwogCXNwaW5fbG9ja19iaCgmYl9wdHItPnB1YmwubG9jayk7CiAJYl9wdHItPnB1YmwuYmxvY2tlZCA9IDE7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGxfcHRyLCB0ZW1wX2xfcHRyLCAmYl9wdHItPmxpbmtzLCBsaW5rX2xpc3QpIHsKQEAgLTU5NSw3ICs2MDcsNiBAQAogCX0KIAlzcGluX3VubG9ja19iaCgmYl9wdHItPnB1YmwubG9jayk7CiAJcmVhZF91bmxvY2tfYmgoJnRpcGNfbmV0X2xvY2spOwotCWluZm8oIkJsb2NrZWQgYmVhcmVyIDwlcz5cbiIsIG5hbWUpOwogCXJldHVybiBUSVBDX09LOwogfQogCkBAIC02MTEsMTUgKzYyMiwxMyBAQAogCXN0cnVjdCBsaW5rICpsX3B0cjsKIAlzdHJ1Y3QgbGluayAqdGVtcF9sX3B0cjsKIAotCWlmICh0aXBjX21vZGUgIT0gVElQQ19ORVRfTU9ERSkKLQkJcmV0dXJuIC1FTk9QUk9UT09QVDsKLQogCWJfcHRyID0gYmVhcmVyX2ZpbmQobmFtZSk7CiAJaWYgKCFiX3B0cikgewogCQl3YXJuKCJBdHRlbXB0IHRvIGRpc2FibGUgdW5rbm93biBiZWFyZXIgPCVzPlxuIiwgbmFtZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCWluZm8oIkRpc2FibGluZyBiZWFyZXIgPCVzPlxuIiwgbmFtZSk7CiAJdGlwY19kaXNjX3N0b3BfbGlua19yZXEoYl9wdHItPmxpbmtfcmVxKTsKIAlzcGluX2xvY2tfYmgoJmJfcHRyLT5wdWJsLmxvY2spOwogCWJfcHRyLT5saW5rX3JlcSA9IE5VTEw7CkBAIC02MzUsNyArNjQ0LDYgQEAKIAkJdGlwY19saW5rX2RlbGV0ZShsX3B0cik7CiAJfQogCXNwaW5fdW5sb2NrX2JoKCZiX3B0ci0+cHVibC5sb2NrKTsKLQlpbmZvKCJEaXNhYmxlZCBiZWFyZXIgPCVzPlxuIiwgbmFtZSk7CiAJbWVtc2V0KGJfcHRyLCAwLCBzaXplb2Yoc3RydWN0IGJlYXJlcikpOwogCXJldHVybiBUSVBDX09LOwogfQpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvY2x1c3Rlci5jIGIvbmV0L3RpcGMvY2x1c3Rlci5jCmluZGV4IDFhZWQ4MTUuLjFkY2I2OTQgMTAwNjQ0Ci0tLSBhL25ldC90aXBjL2NsdXN0ZXIuYworKysgYi9uZXQvdGlwYy9jbHVzdGVyLmMKQEAgLTYwLDggKzYwLDEwIEBACiAJaW50IGFsbG9jOwogCiAJY19wdHIgPSAoc3RydWN0IGNsdXN0ZXIgKilrbWFsbG9jKHNpemVvZigqY19wdHIpLCBHRlBfQVRPTUlDKTsKLQlpZiAoY19wdHIgPT0gTlVMTCkKKwlpZiAoY19wdHIgPT0gTlVMTCkgeworCQl3YXJuKCJDbHVzdGVyIGNyZWF0aW9uIGZhaWx1cmUsIG5vIG1lbW9yeVxuIik7CiAJCXJldHVybiBOVUxMOworCX0KIAltZW1zZXQoY19wdHIsIDAsIHNpemVvZigqY19wdHIpKTsKIAogCWNfcHRyLT5hZGRyID0gdGlwY19hZGRyKHRpcGNfem9uZShhZGRyKSwgdGlwY19jbHVzdGVyKGFkZHIpLCAwKTsKQEAgLTcwLDMwICs3MiwzMiBAQAogCWVsc2UKIAkJbWF4X25vZGVzID0gdGlwY19tYXhfbm9kZXMgKyAxOwogCWFsbG9jID0gc2l6ZW9mKHZvaWQgKikgKiAobWF4X25vZGVzICsgMSk7CisKIAljX3B0ci0+bm9kZXMgPSAoc3RydWN0IG5vZGUgKiopa21hbGxvYyhhbGxvYywgR0ZQX0FUT01JQyk7CiAJaWYgKGNfcHRyLT5ub2RlcyA9PSBOVUxMKSB7CisJCXdhcm4oIkNsdXN0ZXIgY3JlYXRpb24gZmFpbHVyZSwgbm8gbWVtb3J5IGZvciBub2RlIGFyZWFcbiIpOwogCQlrZnJlZShjX3B0cik7CiAJCXJldHVybiBOVUxMOwogCX0KLQltZW1zZXQoY19wdHItPm5vZGVzLCAwLCBhbGxvYyk7ICAKKwltZW1zZXQoY19wdHItPm5vZGVzLCAwLCBhbGxvYyk7CisKIAlpZiAoaW5fb3duX2NsdXN0ZXIoYWRkcikpCiAJCXRpcGNfbG9jYWxfbm9kZXMgPSBjX3B0ci0+bm9kZXM7CiAJY19wdHItPmhpZ2hlc3Rfc2xhdmUgPSBMT1dFU1RfU0xBVkUgLSAxOwogCWNfcHRyLT5oaWdoZXN0X25vZGUgPSAwOwogCQogCXpfcHRyID0gdGlwY196b25lX2ZpbmQodGlwY196b25lKGFkZHIpKTsKLQlpZiAoel9wdHIgPT0gTlVMTCkgeworCWlmICghel9wdHIpIHsKIAkJel9wdHIgPSB0aXBjX3pvbmVfY3JlYXRlKGFkZHIpOwogCX0KLQlpZiAoel9wdHIgIT0gTlVMTCkgewotCQl0aXBjX3pvbmVfYXR0YWNoX2NsdXN0ZXIoel9wdHIsIGNfcHRyKTsKLQkJY19wdHItPm93bmVyID0gel9wdHI7Ci0JfQotCWVsc2UgeworCWlmICghel9wdHIpIHsKKwkJa2ZyZWUoY19wdHItPm5vZGVzKTsKIAkJa2ZyZWUoY19wdHIpOwotCQljX3B0ciA9IE5VTEw7CisJCXJldHVybiBOVUxMOwogCX0KIAorCXRpcGNfem9uZV9hdHRhY2hfY2x1c3Rlcih6X3B0ciwgY19wdHIpOworCWNfcHRyLT5vd25lciA9IHpfcHRyOwogCXJldHVybiBjX3B0cjsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvY29uZmlnLmMgYi9uZXQvdGlwYy9jb25maWcuYwppbmRleCA0OGI1ZGUyLi4zZWM1MDJmYSAxMDA2NDQKLS0tIGEvbmV0L3RpcGMvY29uZmlnLmMKKysrIGIvbmV0L3RpcGMvY29uZmlnLmMKQEAgLTI5MSwxMyArMjkxLDIyIEBACiAJaWYgKCF0aXBjX2FkZHJfbm9kZV92YWxpZChhZGRyKSkKIAkJcmV0dXJuIHRpcGNfY2ZnX3JlcGx5X2Vycm9yX3N0cmluZyhUSVBDX0NGR19JTlZBTElEX1ZBTFVFCiAJCQkJCQkgICAiIChub2RlIGFkZHJlc3MpIik7Ci0JaWYgKHRpcGNfb3duX2FkZHIpCisJaWYgKHRpcGNfbW9kZSA9PSBUSVBDX05FVF9NT0RFKQogCQlyZXR1cm4gdGlwY19jZmdfcmVwbHlfZXJyb3Jfc3RyaW5nKFRJUENfQ0ZHX05PVF9TVVBQT1JURUQKIAkJCQkJCSAgICIgKGNhbm5vdCBjaGFuZ2Ugbm9kZSBhZGRyZXNzIG9uY2UgYXNzaWduZWQpIik7CisJdGlwY19vd25fYWRkciA9IGFkZHI7CisKKwkvKiAKKwkgKiBNdXN0IHJlbGVhc2UgYWxsIHNwaW5sb2NrcyBiZWZvcmUgY2FsbGluZyBzdGFydF9uZXQoKSBiZWNhdXNlCisJICogTGludXggdmVyc2lvbiBvZiBUSVBDIGNhbGxzIGV0aF9tZWRpYV9zdGFydCgpIHdoaWNoIGNhbGxzCisJICogcmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCkgd2hpY2ggbWF5IGJsb2NrIQorCSAqCisJICogVGVtcG9yYXJpbHkgcmVsZWFzaW5nIHRoZSBsb2NrIHNob3VsZCBiZSBoYXJtbGVzcyBmb3Igbm9uLUxpbnV4IFRJUEMsCisJICogYnV0IExpbnV4IHZlcnNpb24gb2YgZXRoX21lZGlhX3N0YXJ0KCkgc2hvdWxkIHJlYWxseSBiZSByZXdvcmtlZAorCSAqIHNvIHRoYXQgaXQgY2FuIGJlIGNhbGxlZCB3aXRoIHNwaW5sb2NrcyBoZWxkLgorCSAqLwogCiAJc3Bpbl91bmxvY2tfYmgoJmNvbmZpZ19sb2NrKTsKLQl0aXBjX2NvcmVfc3RvcF9uZXQoKTsKLQl0aXBjX293bl9hZGRyID0gYWRkcjsKIAl0aXBjX2NvcmVfc3RhcnRfbmV0KCk7CiAJc3Bpbl9sb2NrX2JoKCZjb25maWdfbG9jayk7CiAJcmV0dXJuIHRpcGNfY2ZnX3JlcGx5X25vbmUoKTsKQEAgLTM1MCw1MCArMzU5LDIxIEBACiAKIHN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqY2ZnX3NldF9tYXhfcG9ydHModm9pZCkKIHsKLQlpbnQgb3JpZ19tb2RlOwogCXUzMiB2YWx1ZTsKIAogCWlmICghVExWX0NIRUNLKHJlcV90bHZfYXJlYSwgcmVxX3Rsdl9zcGFjZSwgVElQQ19UTFZfVU5TSUdORUQpKQogCQlyZXR1cm4gdGlwY19jZmdfcmVwbHlfZXJyb3Jfc3RyaW5nKFRJUENfQ0ZHX1RMVl9FUlJPUik7CiAJdmFsdWUgPSAqKHUzMiAqKVRMVl9EQVRBKHJlcV90bHZfYXJlYSk7CiAJdmFsdWUgPSBudG9obCh2YWx1ZSk7CisJaWYgKHZhbHVlID09IHRpcGNfbWF4X3BvcnRzKQorCQlyZXR1cm4gdGlwY19jZmdfcmVwbHlfbm9uZSgpOwogCWlmICh2YWx1ZSAhPSBkZWxpbWl0KHZhbHVlLCAxMjcsIDY1NTM1KSkKIAkJcmV0dXJuIHRpcGNfY2ZnX3JlcGx5X2Vycm9yX3N0cmluZyhUSVBDX0NGR19JTlZBTElEX1ZBTFVFCiAJCQkJCQkgICAiIChtYXggcG9ydHMgbXVzdCBiZSAxMjctNjU1MzUpIik7Ci0KLQlpZiAodmFsdWUgPT0gdGlwY19tYXhfcG9ydHMpCi0JCXJldHVybiB0aXBjX2NmZ19yZXBseV9ub25lKCk7Ci0KLQlpZiAoYXRvbWljX3JlYWQoJnRpcGNfdXNlcl9jb3VudCkgPiAyKQorCWlmICh0aXBjX21vZGUgIT0gVElQQ19OT1RfUlVOTklORykKIAkJcmV0dXJuIHRpcGNfY2ZnX3JlcGx5X2Vycm9yX3N0cmluZyhUSVBDX0NGR19OT1RfU1VQUE9SVEVECi0JCQkJCQkgICAiIChjYW5ub3QgY2hhbmdlIG1heCBwb3J0cyB3aGlsZSBUSVBDIHVzZXJzIGV4aXN0KSIpOwotCi0Jc3Bpbl91bmxvY2tfYmgoJmNvbmZpZ19sb2NrKTsKLQlvcmlnX21vZGUgPSB0aXBjX2dldF9tb2RlKCk7Ci0JaWYgKG9yaWdfbW9kZSA9PSBUSVBDX05FVF9NT0RFKQotCQl0aXBjX2NvcmVfc3RvcF9uZXQoKTsKLQl0aXBjX2NvcmVfc3RvcCgpOworCQkJIiAoY2Fubm90IGNoYW5nZSBtYXggcG9ydHMgd2hpbGUgVElQQyBpcyBhY3RpdmUpIik7CiAJdGlwY19tYXhfcG9ydHMgPSB2YWx1ZTsKLQl0aXBjX2NvcmVfc3RhcnQoKTsKLQlpZiAob3JpZ19tb2RlID09IFRJUENfTkVUX01PREUpCi0JCXRpcGNfY29yZV9zdGFydF9uZXQoKTsKLQlzcGluX2xvY2tfYmgoJmNvbmZpZ19sb2NrKTsKLQlyZXR1cm4gdGlwY19jZmdfcmVwbHlfbm9uZSgpOwotfQotCi1zdGF0aWMgc3RydWN0IHNrX2J1ZmYgKnNldF9uZXRfbWF4KGludCB2YWx1ZSwgaW50ICpwYXJhbWV0ZXIpCi17Ci0JaW50IG9yaWdfbW9kZTsKLQotCWlmICh2YWx1ZSAhPSAqcGFyYW1ldGVyKSB7Ci0JCW9yaWdfbW9kZSA9IHRpcGNfZ2V0X21vZGUoKTsKLQkJaWYgKG9yaWdfbW9kZSA9PSBUSVBDX05FVF9NT0RFKQotCQkJdGlwY19jb3JlX3N0b3BfbmV0KCk7Ci0JCSpwYXJhbWV0ZXIgPSB2YWx1ZTsKLQkJaWYgKG9yaWdfbW9kZSA9PSBUSVBDX05FVF9NT0RFKQotCQkJdGlwY19jb3JlX3N0YXJ0X25ldCgpOwotCX0KLQogCXJldHVybiB0aXBjX2NmZ19yZXBseV9ub25lKCk7CiB9CiAKQEAgLTQwNSwxMCArMzg1LDE2IEBACiAJCXJldHVybiB0aXBjX2NmZ19yZXBseV9lcnJvcl9zdHJpbmcoVElQQ19DRkdfVExWX0VSUk9SKTsKIAl2YWx1ZSA9ICoodTMyICopVExWX0RBVEEocmVxX3Rsdl9hcmVhKTsKIAl2YWx1ZSA9IG50b2hsKHZhbHVlKTsKKwlpZiAodmFsdWUgPT0gdGlwY19tYXhfem9uZXMpCisJCXJldHVybiB0aXBjX2NmZ19yZXBseV9ub25lKCk7CiAJaWYgKHZhbHVlICE9IGRlbGltaXQodmFsdWUsIDEsIDI1NSkpCiAJCXJldHVybiB0aXBjX2NmZ19yZXBseV9lcnJvcl9zdHJpbmcoVElQQ19DRkdfSU5WQUxJRF9WQUxVRQogCQkJCQkJICAgIiAobWF4IHpvbmVzIG11c3QgYmUgMS0yNTUpIik7Ci0JcmV0dXJuIHNldF9uZXRfbWF4KHZhbHVlLCAmdGlwY19tYXhfem9uZXMpOworCWlmICh0aXBjX21vZGUgPT0gVElQQ19ORVRfTU9ERSkKKwkJcmV0dXJuIHRpcGNfY2ZnX3JlcGx5X2Vycm9yX3N0cmluZyhUSVBDX0NGR19OT1RfU1VQUE9SVEVECisJCQkiIChjYW5ub3QgY2hhbmdlIG1heCB6b25lcyBvbmNlIFRJUEMgaGFzIGpvaW5lZCBhIG5ldHdvcmspIik7CisJdGlwY19tYXhfem9uZXMgPSB2YWx1ZTsKKwlyZXR1cm4gdGlwY19jZmdfcmVwbHlfbm9uZSgpOwogfQogCiBzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmNmZ19zZXRfbWF4X2NsdXN0ZXJzKHZvaWQpCkBAIC00MTksOCArNDA1LDggQEAKIAkJcmV0dXJuIHRpcGNfY2ZnX3JlcGx5X2Vycm9yX3N0cmluZyhUSVBDX0NGR19UTFZfRVJST1IpOwogCXZhbHVlID0gKih1MzIgKilUTFZfREFUQShyZXFfdGx2X2FyZWEpOwogCXZhbHVlID0gbnRvaGwodmFsdWUpOwotCWlmICh2YWx1ZSAhPSAxKQotCQlyZXR1cm4gdGlwY19jZmdfcmVwbHlfZXJyb3Jfc3RyaW5nKFRJUENfQ0ZHX05PVF9TVVBQT1JURUQKKwlpZiAodmFsdWUgIT0gZGVsaW1pdCh2YWx1ZSwgMSwgMSkpCisJCXJldHVybiB0aXBjX2NmZ19yZXBseV9lcnJvcl9zdHJpbmcoVElQQ19DRkdfSU5WQUxJRF9WQUxVRQogCQkJCQkJICAgIiAobWF4IGNsdXN0ZXJzIGZpeGVkIGF0IDEpIik7CiAJcmV0dXJuIHRpcGNfY2ZnX3JlcGx5X25vbmUoKTsKIH0KQEAgLTQzMywxMCArNDE5LDE2IEBACiAJCXJldHVybiB0aXBjX2NmZ19yZXBseV9lcnJvcl9zdHJpbmcoVElQQ19DRkdfVExWX0VSUk9SKTsKIAl2YWx1ZSA9ICoodTMyICopVExWX0RBVEEocmVxX3Rsdl9hcmVhKTsKIAl2YWx1ZSA9IG50b2hsKHZhbHVlKTsKKwlpZiAodmFsdWUgPT0gdGlwY19tYXhfbm9kZXMpCisJCXJldHVybiB0aXBjX2NmZ19yZXBseV9ub25lKCk7CiAJaWYgKHZhbHVlICE9IGRlbGltaXQodmFsdWUsIDgsIDIwNDcpKQogCQlyZXR1cm4gdGlwY19jZmdfcmVwbHlfZXJyb3Jfc3RyaW5nKFRJUENfQ0ZHX0lOVkFMSURfVkFMVUUKIAkJCQkJCSAgICIgKG1heCBub2RlcyBtdXN0IGJlIDgtMjA0NykiKTsKLQlyZXR1cm4gc2V0X25ldF9tYXgodmFsdWUsICZ0aXBjX21heF9ub2Rlcyk7CisJaWYgKHRpcGNfbW9kZSA9PSBUSVBDX05FVF9NT0RFKQorCQlyZXR1cm4gdGlwY19jZmdfcmVwbHlfZXJyb3Jfc3RyaW5nKFRJUENfQ0ZHX05PVF9TVVBQT1JURUQKKwkJCSIgKGNhbm5vdCBjaGFuZ2UgbWF4IG5vZGVzIG9uY2UgVElQQyBoYXMgam9pbmVkIGEgbmV0d29yaykiKTsKKwl0aXBjX21heF9ub2RlcyA9IHZhbHVlOworCXJldHVybiB0aXBjX2NmZ19yZXBseV9ub25lKCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqY2ZnX3NldF9tYXhfc2xhdmVzKHZvaWQpCkBAIC00NjEsMTUgKzQ1MywxNiBAQAogCQlyZXR1cm4gdGlwY19jZmdfcmVwbHlfZXJyb3Jfc3RyaW5nKFRJUENfQ0ZHX1RMVl9FUlJPUik7CiAJdmFsdWUgPSAqKHUzMiAqKVRMVl9EQVRBKHJlcV90bHZfYXJlYSk7CiAJdmFsdWUgPSBudG9obCh2YWx1ZSk7CisJaWYgKHZhbHVlID09IHRpcGNfbmV0X2lkKQorCQlyZXR1cm4gdGlwY19jZmdfcmVwbHlfbm9uZSgpOwogCWlmICh2YWx1ZSAhPSBkZWxpbWl0KHZhbHVlLCAxLCA5OTk5KSkKIAkJcmV0dXJuIHRpcGNfY2ZnX3JlcGx5X2Vycm9yX3N0cmluZyhUSVBDX0NGR19JTlZBTElEX1ZBTFVFCiAJCQkJCQkgICAiIChuZXR3b3JrIGlkIG11c3QgYmUgMS05OTk5KSIpOwotCi0JaWYgKHRpcGNfb3duX2FkZHIpCisJaWYgKHRpcGNfbW9kZSA9PSBUSVBDX05FVF9NT0RFKQogCQlyZXR1cm4gdGlwY19jZmdfcmVwbHlfZXJyb3Jfc3RyaW5nKFRJUENfQ0ZHX05PVF9TVVBQT1JURUQKLQkJCQkJCSAgICIgKGNhbm5vdCBjaGFuZ2UgbmV0d29yayBpZCBvbmNlIHBhcnQgb2YgbmV0d29yaykiKTsKLQkKLQlyZXR1cm4gc2V0X25ldF9tYXgodmFsdWUsICZ0aXBjX25ldF9pZCk7CisJCQkiIChjYW5ub3QgY2hhbmdlIG5ldHdvcmsgaWQgb25jZSBUSVBDIGhhcyBqb2luZWQgYSBuZXR3b3JrKSIpOworCXRpcGNfbmV0X2lkID0gdmFsdWU7CisJcmV0dXJuIHRpcGNfY2ZnX3JlcGx5X25vbmUoKTsKIH0KIAogc3RydWN0IHNrX2J1ZmYgKnRpcGNfY2ZnX2RvX2NtZCh1MzIgb3JpZ19ub2RlLCB1MTYgY21kLCBjb25zdCB2b2lkICpyZXF1ZXN0X2FyZWEsCkBAIC02NDksNyArNjQyLDcgQEAKIAlpZiAoKHNpemUgPCBzaXplb2YoKnJlcV9oZHIpKSB8fAogCSAgICAoc2l6ZSAhPSBUQ01fQUxJR04obnRvaGwocmVxX2hkci0+dGNtX2xlbikpKSB8fAogCSAgICAobnRvaHMocmVxX2hkci0+dGNtX2ZsYWdzKSAhPSBUQ01fRl9SRVFVRVNUKSkgewotCQl3YXJuKCJkaXNjYXJkZWQgaW52YWxpZCBjb25maWd1cmF0aW9uIG1lc3NhZ2VcbiIpOworCQl3YXJuKCJJbnZhbGlkIGNvbmZpZ3VyYXRpb24gbWVzc2FnZSBkaXNjYXJkZWRcbiIpOwogCQlyZXR1cm47CiAJfQogCmRpZmYgLS1naXQgYS9uZXQvdGlwYy9jb3JlLmMgYi9uZXQvdGlwYy9jb3JlLmMKaW5kZXggM2QwYThlZS4uNTAwM2FjYiAxMDA2NDQKLS0tIGEvbmV0L3RpcGMvY29yZS5jCisrKyBiL25ldC90aXBjL2NvcmUuYwpAQCAtMiw3ICsyLDcgQEAKICAqIG5ldC90aXBjL2NvcmUuYzogVElQQyBtb2R1bGUgY29kZQogICoKICAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA2LCBFcmljc3NvbiBBQgotICogQ29weXJpZ2h0IChjKSAyMDA1LCBXaW5kIFJpdmVyIFN5c3RlbXMKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA2LCBXaW5kIFJpdmVyIFN5c3RlbXMKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC01Nyw3ICs1Nyw3IEBACiBpbnQgIHRpcGNfbmV0bGlua19zdGFydCh2b2lkKTsKIHZvaWQgdGlwY19uZXRsaW5rX3N0b3Aodm9pZCk7CiAKLSNkZWZpbmUgTU9EX05BTUUgInRpcGNfc3RhcnQ6ICIKKyNkZWZpbmUgVElQQ19NT0RfVkVSICIxLjYuMSIKIAogI2lmbmRlZiBDT05GSUdfVElQQ19aT05FUwogI2RlZmluZSBDT05GSUdfVElQQ19aT05FUyAzCkBAIC0xOTgsNyArMTk4LDcgQEAKIAl0aXBjX21heF9wdWJsaWNhdGlvbnMgPSAxMDAwMDsKIAl0aXBjX21heF9zdWJzY3JpcHRpb25zID0gMjAwMDsKIAl0aXBjX21heF9wb3J0cyA9IGRlbGltaXQoQ09ORklHX1RJUENfUE9SVFMsIDEyNywgNjU1MzYpOwotCXRpcGNfbWF4X3pvbmVzID0gZGVsaW1pdChDT05GSUdfVElQQ19aT05FUywgMSwgNTExKTsKKwl0aXBjX21heF96b25lcyA9IGRlbGltaXQoQ09ORklHX1RJUENfWk9ORVMsIDEsIDI1NSk7CiAJdGlwY19tYXhfY2x1c3RlcnMgPSBkZWxpbWl0KENPTkZJR19USVBDX0NMVVNURVJTLCAxLCAxKTsKIAl0aXBjX21heF9ub2RlcyA9IGRlbGltaXQoQ09ORklHX1RJUENfTk9ERVMsIDgsIDIwNDcpOwogCXRpcGNfbWF4X3NsYXZlcyA9IGRlbGltaXQoQ09ORklHX1RJUENfU0xBVkVfTk9ERVMsIDAsIDIwNDcpOwpAQCAtMjI0LDYgKzIyNCw3IEBACiAKIE1PRFVMRV9ERVNDUklQVElPTigiVElQQzogVHJhbnNwYXJlbnQgSW50ZXIgUHJvY2VzcyBDb21tdW5pY2F0aW9uIik7CiBNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7CitNT0RVTEVfVkVSU0lPTihUSVBDX01PRF9WRVIpOwogCiAvKiBOYXRpdmUgVElQQyBBUEkgZm9yIGtlcm5lbC1zcGFjZSBhcHBsaWNhdGlvbnMgKHNlZSB0aXBjLmgpICovCiAKZGlmZiAtLWdpdCBhL25ldC90aXBjL2NvcmUuaCBiL25ldC90aXBjL2NvcmUuaAppbmRleCAxZjJlOGIyLi44NmY1NGYzIDEwMDY0NAotLS0gYS9uZXQvdGlwYy9jb3JlLmgKKysrIGIvbmV0L3RpcGMvY29yZS5oCkBAIC0yLDcgKzIsNyBAQAogICogbmV0L3RpcGMvY29yZS5oOiBJbmNsdWRlIGZpbGUgZm9yIFRJUEMgZ2xvYmFsIGRlY2xhcmF0aW9ucwogICogCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNiwgRXJpY3Nzb24gQUIKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgV2luZCBSaXZlciBTeXN0ZW1zCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNiwgV2luZCBSaXZlciBTeXN0ZW1zCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtMTExLDEwICsxMTEsNiBAQAogCiAjZWxzZQogCi0jaWZuZGVmIERCR19PVVRQVVQKLSNkZWZpbmUgREJHX09VVFBVVCBOVUxMCi0jZW5kaWYKLQogLyoKICAqIFRJUEMgZGVidWcgc3VwcG9ydCBub3QgaW5jbHVkZWQ6CiAgKiAtIHN5c3RlbSBtZXNzYWdlcyBhcmUgcHJpbnRlZCB0byBzeXN0ZW0gY29uc29sZQpAQCAtMTI5LDYgKzEyNSwxOSBAQAogI2RlZmluZSBtc2dfZGJnKG1zZyx0eHQpIGRvIHt9IHdoaWxlICgwKQogI2RlZmluZSBkdW1wKGZtdCxhcmcuLi4pIGRvIHt9IHdoaWxlICgwKQogCisKKy8qCQorICogVElQQ19PVVRQVVQgaXMgZGVmaW5lZCB0byBiZSB0aGUgc3lzdGVtIGNvbnNvbGUsIHdoaWxlIERCR19PVVRQVVQgaXMKKyAqIHRoZSBudWxsIHByaW50IGJ1ZmZlci4gIFRoZXMgZW5zdXJlcyB0aGF0IGFueSBzeXN0ZW0gb3IgZGVidWcgbWVzc2FnZXMgCisgKiB0aGF0IGFyZSBnZW5lcmF0ZWQgd2l0aG91dCB1c2luZyB0aGUgYWJvdmUgbWFjcm9zIGFyZSBoYW5kbGVkIGNvcnJlY3RseS4KKyAqLworCisjdW5kZWYgIFRJUENfT1VUUFVUCisjZGVmaW5lIFRJUENfT1VUUFVUIFRJUENfQ09OUworCisjdW5kZWYgIERCR19PVVRQVVQKKyNkZWZpbmUgREJHX09VVFBVVCBOVUxMCisKICNlbmRpZgkJCSAgCiAKIApAQCAtMzA5LDcgKzMxOCw3IEBACiAgKiBidWZfZGlzY2FyZCAtIGZyZWVzIGEgVElQQyBtZXNzYWdlIGJ1ZmZlcgogICogQHNrYjogbWVzc2FnZSBidWZmZXIKICAqCi0gKiBGcmVlcyBhIG5ldyBidWZmZXIuICBJZiBwYXNzZWQgTlVMTCwganVzdCByZXR1cm5zLgorICogRnJlZXMgYSBtZXNzYWdlIGJ1ZmZlci4gIElmIHBhc3NlZCBOVUxMLCBqdXN0IHJldHVybnMuCiAgKi8KIAogc3RhdGljIGlubGluZSB2b2lkIGJ1Zl9kaXNjYXJkKHN0cnVjdCBza19idWZmICpza2IpCmRpZmYgLS1naXQgYS9uZXQvdGlwYy9kaXNjb3Zlci5jIGIvbmV0L3RpcGMvZGlzY292ZXIuYwppbmRleCA5MjYwMTM4Li4yYjg0NDEyIDEwMDY0NAotLS0gYS9uZXQvdGlwYy9kaXNjb3Zlci5jCisrKyBiL25ldC90aXBjL2Rpc2NvdmVyLmMKQEAgLTIsNyArMiw3IEBACiAgKiBuZXQvdGlwYy9kaXNjb3Zlci5jCiAgKiAKICAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA2LCBFcmljc3NvbiBBQgotICogQ29weXJpZ2h0IChjKSAyMDA1LCBXaW5kIFJpdmVyIFN5c3RlbXMKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA2LCBXaW5kIFJpdmVyIFN5c3RlbXMKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC0xNzYsNyArMTc2LDYgQEAKIAkJCW5fcHRyID0gdGlwY19ub2RlX2NyZWF0ZShvcmlnKTsKIAkJfQogCQlpZiAobl9wdHIgPT0gTlVMTCkgewotCQkJd2FybigiTWVtb3J5IHNxdWVlemU7IEZhaWxlZCB0byBjcmVhdGUgbm9kZVxuIik7CiAJCQlyZXR1cm47CiAJCX0KIAkJc3Bpbl9sb2NrX2JoKCZuX3B0ci0+bG9jayk7CkBAIC0xOTEsMTAgKzE5MCw4IEBACiAJCX0KIAkJYWRkciA9ICZsaW5rLT5tZWRpYV9hZGRyOwogCQlpZiAobWVtY21wKGFkZHIsICZtZWRpYV9hZGRyLCBzaXplb2YoKmFkZHIpKSkgewotCQkJY2hhciBhZGRyX3N0cmluZ1sxNl07Ci0KLQkJCXdhcm4oIk5ldyBiZWFyZXIgYWRkcmVzcyBmb3IgJXNcbiIsIAotCQkJICAgICBhZGRyX3N0cmluZ19maWxsKGFkZHJfc3RyaW5nLCBvcmlnKSk7CisJCQl3YXJuKCJSZXNldHRpbmcgbGluayA8JXM+LCBwZWVyIGludGVyZmFjZSBhZGRyZXNzIGNoYW5nZWRcbiIsCisJCQkgICAgIGxpbmstPm5hbWUpOwogCQkJbWVtY3B5KGFkZHIsICZtZWRpYV9hZGRyLCBzaXplb2YoKmFkZHIpKTsKIAkJCXRpcGNfbGlua19yZXNldChsaW5rKTsgICAgIAogCQl9CkBAIC0yNzAsOCArMjY3LDggQEAKIAkJLyogbGVhdmUgdGltZXIgaW50ZXJ2YWwgImFzIGlzIiBpZiBhbHJlYWR5IGF0IGEgIm5vcm1hbCIgcmF0ZSAqLwogCX0gZWxzZSB7CiAJCXJlcS0+dGltZXJfaW50diAqPSAyOwotCQlpZiAocmVxLT50aW1lcl9pbnR2ID4gVElQQ19MSU5LX1JFUV9TTE9XKQotCQkJcmVxLT50aW1lcl9pbnR2ID0gVElQQ19MSU5LX1JFUV9TTE9XOworCQlpZiAocmVxLT50aW1lcl9pbnR2ID4gVElQQ19MSU5LX1JFUV9GQVNUKQorCQkJcmVxLT50aW1lcl9pbnR2ID0gVElQQ19MSU5LX1JFUV9GQVNUOwogCQlpZiAoKHJlcS0+dGltZXJfaW50diA9PSBUSVBDX0xJTktfUkVRX0ZBU1QpICYmIAogCQkgICAgKHJlcS0+YmVhcmVyLT5ub2Rlcy5jb3VudCkpCiAJCQlyZXEtPnRpbWVyX2ludHYgPSBUSVBDX0xJTktfUkVRX1NMT1c7CmRpZmYgLS1naXQgYS9uZXQvdGlwYy9ldGhfbWVkaWEuYyBiL25ldC90aXBjL2V0aF9tZWRpYS5jCmluZGV4IDdhMjUyNzguLjY4MmRhNGEgMTAwNjQ0Ci0tLSBhL25ldC90aXBjL2V0aF9tZWRpYS5jCisrKyBiL25ldC90aXBjL2V0aF9tZWRpYS5jCkBAIC0yLDcgKzIsNyBAQAogICogbmV0L3RpcGMvZXRoX21lZGlhLmM6IEV0aGVybmV0IGJlYXJlciBzdXBwb3J0IGZvciBUSVBDCiAgKiAKICAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA2LCBFcmljc3NvbiBBQgotICogQ29weXJpZ2h0IChjKSAyMDA1LCBXaW5kIFJpdmVyIFN5c3RlbXMKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA2LCBXaW5kIFJpdmVyIFN5c3RlbXMKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC05OCwxNyArOTgsMTkgQEAKIAl1MzIgc2l6ZTsKIAogCWlmIChsaWtlbHkoZWJfcHRyLT5iZWFyZXIpKSB7Ci0JCXNpemUgPSBtc2dfc2l6ZSgoc3RydWN0IHRpcGNfbXNnICopYnVmLT5kYXRhKTsKLQkJc2tiX3RyaW0oYnVmLCBzaXplKTsKLQkJaWYgKGxpa2VseShidWYtPmxlbiA9PSBzaXplKSkgewotCQkJYnVmLT5uZXh0ID0gTlVMTDsKLQkJCXRpcGNfcmVjdl9tc2coYnVmLCBlYl9wdHItPmJlYXJlcik7Ci0JCX0gZWxzZSB7Ci0JCQlrZnJlZV9za2IoYnVmKTsKKwkgICAgICAgaWYgKGxpa2VseSghZGV2LT5wcm9taXNjdWl0eSkgfHwKKwkgICAgICAgICAgICFtZW1jbXAoYnVmLT5tYWMucmF3LGRldi0+ZGV2X2FkZHIsRVRIX0FMRU4pIHx8CisJICAgICAgICAgICAhbWVtY21wKGJ1Zi0+bWFjLnJhdyxkZXYtPmJyb2FkY2FzdCxFVEhfQUxFTikpIHsKKwkJICAgICAgICBzaXplID0gbXNnX3NpemUoKHN0cnVjdCB0aXBjX21zZyAqKWJ1Zi0+ZGF0YSk7CisJICAgICAgICAgICAgICAgIHNrYl90cmltKGJ1Ziwgc2l6ZSk7CisJICAgICAgICAJaWYgKGxpa2VseShidWYtPmxlbiA9PSBzaXplKSkgeworCQkgICAgICAgIAlidWYtPm5leHQgPSBOVUxMOworCQkJICAgICAgICB0aXBjX3JlY3ZfbXNnKGJ1ZiwgZWJfcHRyLT5iZWFyZXIpOworCQkJICAgICAgICByZXR1cm4gVElQQ19PSzsKKwkJCX0KIAkJfQotCX0gZWxzZSB7Ci0JCWtmcmVlX3NrYihidWYpOwogCX0KKwlrZnJlZV9za2IoYnVmKTsKIAlyZXR1cm4gVElQQ19PSzsKIH0KIApAQCAtMTI1LDggKzEyNyw3IEBACiAKIAkvKiBGaW5kIGRldmljZSB3aXRoIHNwZWNpZmllZCBuYW1lICovCiAKLQl3aGlsZSAoZGV2ICYmIGRldi0+bmFtZSAmJgotCSAgICAgICAobWVtY21wKGRldi0+bmFtZSwgZHJpdmVyX25hbWUsIHN0cmxlbihkZXYtPm5hbWUpKSkpIHsKKwl3aGlsZSAoZGV2ICYmIGRldi0+bmFtZSAmJiBzdHJuY21wKGRldi0+bmFtZSwgZHJpdmVyX25hbWUsIElGTkFNU0laKSkgewkKIAkJZGV2ID0gZGV2LT5uZXh0OwogCX0KIAlpZiAoIWRldikKQEAgLTI1Miw3ICsyNTMsOSBAQAogCWlmIChldGhfc3RhcnRlZCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQltZW1zZXQoJmJjYXN0X2FkZHIsIDB4ZmYsIHNpemVvZihiY2FzdF9hZGRyKSk7CisJYmNhc3RfYWRkci50eXBlID0gaHRvbmwoVElQQ19NRURJQV9UWVBFX0VUSCk7CisJbWVtc2V0KCZiY2FzdF9hZGRyLmRldl9hZGRyLCAweGZmLCBFVEhfQUxFTik7CisKIAltZW1zZXQoZXRoX2JlYXJlcnMsIDAsIHNpemVvZihldGhfYmVhcmVycykpOwogCiAJcmVzID0gdGlwY19yZWdpc3Rlcl9tZWRpYShUSVBDX01FRElBX1RZUEVfRVRILCAiZXRoIiwKZGlmZiAtLWdpdCBhL25ldC90aXBjL2xpbmsuYyBiL25ldC90aXBjL2xpbmsuYwppbmRleCA3ODRiMjRiNi4uZDY0NjU4MCAxMDA2NDQKLS0tIGEvbmV0L3RpcGMvbGluay5jCisrKyBiL25ldC90aXBjL2xpbmsuYwpAQCAtNDE5LDcgKzQxOSw3IEBACiAKIAlsX3B0ciA9IChzdHJ1Y3QgbGluayAqKWttYWxsb2Moc2l6ZW9mKCpsX3B0ciksIEdGUF9BVE9NSUMpOwogCWlmICghbF9wdHIpIHsKLQkJd2FybigiTWVtb3J5IHNxdWVlemU7IEZhaWxlZCB0byBjcmVhdGUgbGlua1xuIik7CisJCXdhcm4oIkxpbmsgY3JlYXRpb24gZmFpbGVkLCBubyBtZW1vcnlcbiIpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAJbWVtc2V0KGxfcHRyLCAwLCBzaXplb2YoKmxfcHRyKSk7CkBAIC00NjksNyArNDY5LDcgQEAKIAogCQlpZiAoIXBiKSB7CiAJCQlrZnJlZShsX3B0cik7Ci0JCQl3YXJuKCJNZW1vcnkgc3F1ZWV6ZTsgRmFpbGVkIHRvIGNyZWF0ZSBsaW5rXG4iKTsKKwkJCXdhcm4oIkxpbmsgY3JlYXRpb24gZmFpbGVkLCBubyBtZW1vcnkgZm9yIHByaW50IGJ1ZmZlclxuIik7CiAJCQlyZXR1cm4gTlVMTDsKIAkJfQogCQl0aXBjX3ByaW50YnVmX2luaXQoJmxfcHRyLT5wcmludF9idWYsIHBiLCBMSU5LX0xPR19CVUZfU0laRSk7CkBAIC01NzQsNyArNTc0LDYgQEAKIAkJCWJyZWFrOwogCQlsaXN0X2RlbF9pbml0KCZwX3B0ci0+d2FpdF9saXN0KTsKIAkJcF9wdHItPmNvbmdlc3RlZF9saW5rID0gTlVMTDsKLQkJYXNzZXJ0KHBfcHRyLT53YWtldXApOwogCQlzcGluX2xvY2tfYmgocF9wdHItPnB1YmwubG9jayk7CiAJCXBfcHRyLT5wdWJsLmNvbmdlc3RlZCA9IDA7CiAJCXBfcHRyLT53YWtldXAoJnBfcHRyLT5wdWJsKTsKQEAgLTY5MSw2ICs2OTAsNyBAQAogCXN0cnVjdCBza19idWZmICpidWY7CiAJdTMyIHByZXZfc3RhdGUgPSBsX3B0ci0+c3RhdGU7CiAJdTMyIGNoZWNrcG9pbnQgPSBsX3B0ci0+bmV4dF9pbl9ubzsKKwlpbnQgd2FzX2FjdGl2ZV9saW5rID0gdGlwY19saW5rX2lzX2FjdGl2ZShsX3B0cik7CiAJCiAJbXNnX3NldF9zZXNzaW9uKGxfcHRyLT5wbXNnLCBtc2dfc2Vzc2lvbihsX3B0ci0+cG1zZykgKyAxKTsKIApAQCAtNzEyLDcgKzcxMiw3IEBACiAJdGlwY19wcmludGYoVElQQ19DT05TLCAiXG5SZXNldCBsaW5rIDwlcz5cbiIsIGxfcHRyLT5uYW1lKTsKIAlkYmdfbGlua19kdW1wKCk7CiAjZW5kaWYKLQlpZiAodGlwY19ub2RlX2hhc19hY3RpdmVfbGlua3MobF9wdHItPm93bmVyKSAmJgorCWlmICh3YXNfYWN0aXZlX2xpbmsgJiYgdGlwY19ub2RlX2hhc19hY3RpdmVfbGlua3MobF9wdHItPm93bmVyKSAmJgogCSAgICBsX3B0ci0+b3duZXItPnBlcm1pdF9jaGFuZ2VvdmVyKSB7CiAJCWxfcHRyLT5yZXNldF9jaGVja3BvaW50ID0gY2hlY2twb2ludDsKIAkJbF9wdHItPmV4cF9tc2dfY291bnQgPSBTVEFSVF9DSEFOR0VPVkVSOwpAQCAtNzU1LDcgKzc1NSw3IEBACiAKIHN0YXRpYyB2b2lkIGxpbmtfYWN0aXZhdGUoc3RydWN0IGxpbmsgKmxfcHRyKQogewotCWxfcHRyLT5uZXh0X2luX25vID0gMTsKKwlsX3B0ci0+bmV4dF9pbl9ubyA9IGxfcHRyLT5zdGF0cy5yZWN2X2luZm8gPSAxOwogCXRpcGNfbm9kZV9saW5rX3VwKGxfcHRyLT5vd25lciwgbF9wdHIpOwogCXRpcGNfYmVhcmVyX2FkZF9kZXN0KGxfcHRyLT5iX3B0ciwgbF9wdHItPmFkZHIpOwogCWxpbmtfc2VuZF9ldmVudCh0aXBjX2NmZ19saW5rX2V2ZW50LCBsX3B0ciwgMSk7CkBAIC04MjAsNiArODIwLDggQEAKIAkJCWJyZWFrOwogCQljYXNlIFJFU0VUX01TRzoKIAkJCWRiZ19saW5rKCJSRVMgLT4gUlJcbiIpOworCQkJaW5mbygiUmVzZXR0aW5nIGxpbmsgPCVzPiwgcmVxdWVzdGVkIGJ5IHBlZXJcbiIsIAorCQkJICAgICBsX3B0ci0+bmFtZSk7CiAJCQl0aXBjX2xpbmtfcmVzZXQobF9wdHIpOwogCQkJbF9wdHItPnN0YXRlID0gUkVTRVRfUkVTRVQ7CiAJCQlsX3B0ci0+ZnNtX21zZ19jbnQgPSAwOwpAQCAtODQ0LDYgKzg0Niw4IEBACiAJCQlicmVhazsKIAkJY2FzZSBSRVNFVF9NU0c6CiAJCQlkYmdfbGluaygiUkVTIC0+IFJSXG4iKTsKKwkJCWluZm8oIlJlc2V0dGluZyBsaW5rIDwlcz4sIHJlcXVlc3RlZCBieSBwZWVyICIKKwkJCSAgICAgIndoaWxlIHByb2JpbmdcbiIsIGxfcHRyLT5uYW1lKTsKIAkJCXRpcGNfbGlua19yZXNldChsX3B0cik7CiAJCQlsX3B0ci0+c3RhdGUgPSBSRVNFVF9SRVNFVDsKIAkJCWxfcHRyLT5mc21fbXNnX2NudCA9IDA7CkBAIC04NzUsNiArODc5LDggQEAKIAkJCX0gZWxzZSB7CS8qIExpbmsgaGFzIGZhaWxlZCAqLwogCQkJCWRiZ19saW5rKCItPiBSVSAoJXUgcHJvYmVzIHVuYW5zd2VyZWQpXG4iLAogCQkJCQkgbF9wdHItPmZzbV9tc2dfY250KTsKKwkJCQl3YXJuKCJSZXNldHRpbmcgbGluayA8JXM+LCBwZWVyIG5vdCByZXNwb25kaW5nXG4iLAorCQkJCSAgICAgbF9wdHItPm5hbWUpOwogCQkJCXRpcGNfbGlua19yZXNldChsX3B0cik7CiAJCQkJbF9wdHItPnN0YXRlID0gUkVTRVRfVU5LTk9XTjsKIAkJCQlsX3B0ci0+ZnNtX21zZ19jbnQgPSAwOwpAQCAtMTA1MCw3ICsxMDU2LDcgQEAKIAkJbXNnX2RiZyhtc2csICJUSVBDOiBDb25nZXN0aW9uLCB0aHJvd2luZyBhd2F5XG4iKTsKIAkJYnVmX2Rpc2NhcmQoYnVmKTsKIAkJaWYgKGltcCA+IENPTk5fTUFOQUdFUikgewotCQkJd2FybigiUmVzZXR0aW5nIDwlcz4sIHNlbmQgcXVldWUgZnVsbCIsIGxfcHRyLT5uYW1lKTsKKwkJCXdhcm4oIlJlc2V0dGluZyBsaW5rIDwlcz4sIHNlbmQgcXVldWUgZnVsbCIsIGxfcHRyLT5uYW1lKTsKIAkJCXRpcGNfbGlua19yZXNldChsX3B0cik7CiAJCX0KIAkJcmV0dXJuIGRzejsKQEAgLTExMzUsOSArMTE0MSwxMyBAQAogCWlmIChuX3B0cikgewogCQl0aXBjX25vZGVfbG9jayhuX3B0cik7CiAJCWxfcHRyID0gbl9wdHItPmFjdGl2ZV9saW5rc1tzZWxlY3RvciAmIDFdOwotCQlkYmcoInRpcGNfbGlua19zZW5kOiBmb3VuZCBsaW5rICV4IGZvciBkZXN0ICV4XG4iLCBsX3B0ciwgZGVzdCk7CiAJCWlmIChsX3B0cikgeworCQkJZGJnKCJ0aXBjX2xpbmtfc2VuZDogZm91bmQgbGluayAleCBmb3IgZGVzdCAleFxuIiwgbF9wdHIsIGRlc3QpOwogCQkJcmVzID0gdGlwY19saW5rX3NlbmRfYnVmKGxfcHRyLCBidWYpOworCQl9IGVsc2UgeworCQkJZGJnKCJBdHRlbXB0IHRvIHNlbmQgbXNnIHRvIHVucmVhY2hhYmxlIG5vZGU6XG4iKTsKKwkJCW1zZ19kYmcoYnVmX21zZyhidWYpLCI+Pj4iKTsKKwkJCWJ1Zl9kaXNjYXJkKGJ1Zik7CiAJCX0KIAkJdGlwY19ub2RlX3VubG9jayhuX3B0cik7CiAJfSBlbHNlIHsKQEAgLTEyNDIsOCArMTI1Miw2IEBACiAJaW50IHJlczsKIAl1MzIgc2VsZWN0b3IgPSBtc2dfb3JpZ3BvcnQoaGRyKSAmIDE7CiAKLQlhc3NlcnQoZGVzdGFkZHIgIT0gdGlwY19vd25fYWRkcik7Ci0KIGFnYWluOgogCS8qCiAJICogVHJ5IGJ1aWxkaW5nIG1lc3NhZ2UgdXNpbmcgcG9ydCdzIG1heF9wa3QgaGludC4KQEAgLTE2MDQsNDAgKzE2MTIsMTIxIEBACiAJCXRpcGNfYmVhcmVyX3NjaGVkdWxlKGxfcHRyLT5iX3B0ciwgbF9wdHIpOwogfQogCitzdGF0aWMgdm9pZCBsaW5rX3Jlc2V0X2FsbCh1bnNpZ25lZCBsb25nIGFkZHIpCit7CisJc3RydWN0IG5vZGUgKm5fcHRyOworCWNoYXIgYWRkcl9zdHJpbmdbMTZdOworCXUzMiBpOworCisJcmVhZF9sb2NrX2JoKCZ0aXBjX25ldF9sb2NrKTsKKwluX3B0ciA9IHRpcGNfbm9kZV9maW5kKCh1MzIpYWRkcik7CisJaWYgKCFuX3B0cikgeworCQlyZWFkX3VubG9ja19iaCgmdGlwY19uZXRfbG9jayk7CisJCXJldHVybjsJLyogbm9kZSBubyBsb25nZXIgZXhpc3RzICovCisJfQorCisJdGlwY19ub2RlX2xvY2sobl9wdHIpOworCisJd2FybigiUmVzZXR0aW5nIGFsbCBsaW5rcyB0byAlc1xuIiwgCisJICAgICBhZGRyX3N0cmluZ19maWxsKGFkZHJfc3RyaW5nLCBuX3B0ci0+YWRkcikpOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9CRUFSRVJTOyBpKyspIHsKKwkJaWYgKG5fcHRyLT5saW5rc1tpXSkgeworCQkJbGlua19wcmludChuX3B0ci0+bGlua3NbaV0sIFRJUENfT1VUUFVULCAKKwkJCQkgICAiUmVzZXR0aW5nIGxpbmtcbiIpOworCQkJdGlwY19saW5rX3Jlc2V0KG5fcHRyLT5saW5rc1tpXSk7CisJCX0KKwl9CisKKwl0aXBjX25vZGVfdW5sb2NrKG5fcHRyKTsKKwlyZWFkX3VubG9ja19iaCgmdGlwY19uZXRfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIGxpbmtfcmV0cmFuc21pdF9mYWlsdXJlKHN0cnVjdCBsaW5rICpsX3B0ciwgc3RydWN0IHNrX2J1ZmYgKmJ1ZikKK3sKKwlzdHJ1Y3QgdGlwY19tc2cgKm1zZyA9IGJ1Zl9tc2coYnVmKTsKKworCXdhcm4oIlJldHJhbnNtaXNzaW9uIGZhaWx1cmUgb24gbGluayA8JXM+XG4iLCBsX3B0ci0+bmFtZSk7CisJdGlwY19tc2dfcHJpbnQoVElQQ19PVVRQVVQsIG1zZywgIj5SRVRSLUZBSUw+Iik7CisKKwlpZiAobF9wdHItPmFkZHIpIHsKKworCQkvKiBIYW5kbGUgZmFpbHVyZSBvbiBzdGFuZGFyZCBsaW5rICovCisKKwkJbGlua19wcmludChsX3B0ciwgVElQQ19PVVRQVVQsICJSZXNldHRpbmcgbGlua1xuIik7CisJCXRpcGNfbGlua19yZXNldChsX3B0cik7CisKKwl9IGVsc2UgeworCisJCS8qIEhhbmRsZSBmYWlsdXJlIG9uIGJyb2FkY2FzdCBsaW5rICovCisKKwkJc3RydWN0IG5vZGUgKm5fcHRyOworCQljaGFyIGFkZHJfc3RyaW5nWzE2XTsKKworCQl0aXBjX3ByaW50ZihUSVBDX09VVFBVVCwgIk1zZyBzZXEgbnVtYmVyOiAldSwgICIsIG1zZ19zZXFubyhtc2cpKTsKKwkJdGlwY19wcmludGYoVElQQ19PVVRQVVQsICJPdXRzdGFuZGluZyBhY2tzOiAldVxuIiwgKHUzMilUSVBDX1NLQl9DQihidWYpLT5oYW5kbGUpOworCQkKKwkJbl9wdHIgPSBsX3B0ci0+b3duZXItPm5leHQ7CisJCXRpcGNfbm9kZV9sb2NrKG5fcHRyKTsKKworCQlhZGRyX3N0cmluZ19maWxsKGFkZHJfc3RyaW5nLCBuX3B0ci0+YWRkcik7CisJCXRpcGNfcHJpbnRmKFRJUENfT1VUUFVULCAiTXVsdGljYXN0IGxpbmsgaW5mbyBmb3IgJXNcbiIsIGFkZHJfc3RyaW5nKTsKKwkJdGlwY19wcmludGYoVElQQ19PVVRQVVQsICJTdXBwb3J0ZWQ6ICVkLCAgIiwgbl9wdHItPmJjbGluay5zdXBwb3J0ZWQpOworCQl0aXBjX3ByaW50ZihUSVBDX09VVFBVVCwgIkFja2VkOiAldVxuIiwgbl9wdHItPmJjbGluay5hY2tlZCk7CisJCXRpcGNfcHJpbnRmKFRJUENfT1VUUFVULCAiTGFzdCBpbjogJXUsICAiLCBuX3B0ci0+YmNsaW5rLmxhc3RfaW4pOworCQl0aXBjX3ByaW50ZihUSVBDX09VVFBVVCwgIkdhcCBhZnRlcjogJXUsICAiLCBuX3B0ci0+YmNsaW5rLmdhcF9hZnRlcik7CisJCXRpcGNfcHJpbnRmKFRJUENfT1VUUFVULCAiR2FwIHRvOiAldVxuIiwgbl9wdHItPmJjbGluay5nYXBfdG8pOworCQl0aXBjX3ByaW50ZihUSVBDX09VVFBVVCwgIk5hY2sgc3luYzogJXVcblxuIiwgbl9wdHItPmJjbGluay5uYWNrX3N5bmMpOworCisJCXRpcGNfa19zaWduYWwoKEhhbmRsZXIpbGlua19yZXNldF9hbGwsICh1bnNpZ25lZCBsb25nKW5fcHRyLT5hZGRyKTsKKworCQl0aXBjX25vZGVfdW5sb2NrKG5fcHRyKTsKKworCQlsX3B0ci0+c3RhbGVfY291bnQgPSAwOworCX0KK30KKwogdm9pZCB0aXBjX2xpbmtfcmV0cmFuc21pdChzdHJ1Y3QgbGluayAqbF9wdHIsIHN0cnVjdCBza19idWZmICpidWYsIAogCQkJICB1MzIgcmV0cmFuc21pdHMpCiB7CiAJc3RydWN0IHRpcGNfbXNnICptc2c7CiAKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuOworCisJbXNnID0gYnVmX21zZyhidWYpOworCQogCWRiZygiUmV0cmFuc21pdHRpbmcgJXUgaW4gbGluayAleFxuIiwgcmV0cmFuc21pdHMsIGxfcHRyKTsKIAotCWlmICh0aXBjX2JlYXJlcl9jb25nZXN0ZWQobF9wdHItPmJfcHRyLCBsX3B0cikgJiYgYnVmICYmICFza2JfY2xvbmVkKGJ1ZikpIHsKLQkJbXNnX2RiZyhidWZfbXNnKGJ1ZiksICI+Tk9fUkVUUi0+QkNPTkc+Iik7Ci0JCWRiZ19wcmludF9saW5rKGxfcHRyLCAiICAgIik7Ci0JCWxfcHRyLT5yZXRyYW5zbV9xdWV1ZV9oZWFkID0gbXNnX3NlcW5vKGJ1Zl9tc2coYnVmKSk7Ci0JCWxfcHRyLT5yZXRyYW5zbV9xdWV1ZV9zaXplID0gcmV0cmFuc21pdHM7Ci0JCXJldHVybjsKKwlpZiAodGlwY19iZWFyZXJfY29uZ2VzdGVkKGxfcHRyLT5iX3B0ciwgbF9wdHIpKSB7CisJCWlmICghc2tiX2Nsb25lZChidWYpKSB7CisJCQltc2dfZGJnKG1zZywgIj5OT19SRVRSLT5CQ09ORz4iKTsKKwkJCWRiZ19wcmludF9saW5rKGxfcHRyLCAiICAgIik7CisJCQlsX3B0ci0+cmV0cmFuc21fcXVldWVfaGVhZCA9IG1zZ19zZXFubyhtc2cpOworCQkJbF9wdHItPnJldHJhbnNtX3F1ZXVlX3NpemUgPSByZXRyYW5zbWl0czsKKwkJCXJldHVybjsKKwkJfSBlbHNlIHsKKwkJCS8qIERvbid0IHJldHJhbnNtaXQgaWYgZHJpdmVyIGFscmVhZHkgaGFzIHRoZSBidWZmZXIgKi8KKwkJfQorCX0gZWxzZSB7CisJCS8qIERldGVjdCByZXBlYXRlZCByZXRyYW5zbWl0IGZhaWx1cmVzIG9uIHVuY29uZ2VzdGVkIGJlYXJlciAqLworCisJCWlmIChsX3B0ci0+bGFzdF9yZXRyYW5zbWl0dGVkID09IG1zZ19zZXFubyhtc2cpKSB7CisJCQlpZiAoKytsX3B0ci0+c3RhbGVfY291bnQgPiAxMDApIHsKKwkJCQlsaW5rX3JldHJhbnNtaXRfZmFpbHVyZShsX3B0ciwgYnVmKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0gZWxzZSB7CisJCQlsX3B0ci0+bGFzdF9yZXRyYW5zbWl0dGVkID0gbXNnX3NlcW5vKG1zZyk7CisJCQlsX3B0ci0+c3RhbGVfY291bnQgPSAxOworCQl9CiAJfQorCiAJd2hpbGUgKHJldHJhbnNtaXRzICYmIChidWYgIT0gbF9wdHItPm5leHRfb3V0KSAmJiBidWYgJiYgIXNrYl9jbG9uZWQoYnVmKSkgewogCQltc2cgPSBidWZfbXNnKGJ1Zik7CiAJCW1zZ19zZXRfYWNrKG1zZywgbW9kKGxfcHRyLT5uZXh0X2luX25vIC0gMSkpOwogCQltc2dfc2V0X2JjYXN0X2Fjayhtc2csIGxfcHRyLT5vd25lci0+YmNsaW5rLmxhc3RfaW4pOyAKIAkJaWYgKHRpcGNfYmVhcmVyX3NlbmQobF9wdHItPmJfcHRyLCBidWYsICZsX3B0ci0+bWVkaWFfYWRkcikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIENhdGNoIGlmIHJldHJhbnNtaXNzaW9ucyBmYWlsIHJlcGVhdGVkbHk6ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobF9wdHItPmxhc3RfcmV0cmFuc21pdHRlZCA9PSBtc2dfc2Vxbm8obXNnKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKytsX3B0ci0+c3RhbGVfY291bnQgPiAxMDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXBjX21zZ19wcmludChUSVBDX0NPTlMsIGJ1Zl9tc2coYnVmKSwgIj5SRVRSPiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8oIi4uLlJldHJhbnNtaXR0ZWQgJXUgdGltZXNcbiIsCi0JCQkJCSAgICAgbF9wdHItPnN0YWxlX2NvdW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rX3ByaW50KGxfcHRyLCBUSVBDX0NPTlMsICJSZXNldHRpbmcgTGlua1xuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlwY19saW5rX3Jlc2V0KGxfcHRyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9wdHItPnN0YWxlX2NvdW50ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxfcHRyLT5sYXN0X3JldHJhbnNtaXR0ZWQgPSBtc2dfc2Vxbm8obXNnKTsKLQogCQkJbXNnX2RiZyhidWZfbXNnKGJ1ZiksICI+UkVUUj4iKTsKIAkJCWJ1ZiA9IGJ1Zi0+bmV4dDsKIAkJCXJldHJhbnNtaXRzLS07CkBAIC0xNjUwLDYgKzE3MzksNyBAQAogCQkJcmV0dXJuOwogCQl9CiAJfQorCiAJbF9wdHItPnJldHJhbnNtX3F1ZXVlX2hlYWQgPSBsX3B0ci0+cmV0cmFuc21fcXVldWVfc2l6ZSA9IDA7CiB9CiAKQEAgLTE3MjAsNiArMTgxMCwxMSBAQAogCQkJbGlua19yZWN2X25vbl9zZXEoYnVmKTsKIAkJCWNvbnRpbnVlOwogCQl9CisJCQorCQlpZiAodW5saWtlbHkoIW1zZ19zaG9ydChtc2cpICYmCisJCQkgICAgIChtc2dfZGVzdG5vZGUobXNnKSAhPSB0aXBjX293bl9hZGRyKSkpCisJCQlnb3RvIGNvbnQ7CisJCQogCQluX3B0ciA9IHRpcGNfbm9kZV9maW5kKG1zZ19wcmV2bm9kZShtc2cpKTsKIAkJaWYgKHVubGlrZWx5KCFuX3B0cikpCiAJCQlnb3RvIGNvbnQ7CkBAIC0yMTQwLDcgKzIyMzUsNyBAQAogCQkKIAkJaWYgKG1zZ19saW5rcHJpbyhtc2cpICYmIAogCQkgICAgKG1zZ19saW5rcHJpbyhtc2cpICE9IGxfcHRyLT5wcmlvcml0eSkpIHsKLQkJCXdhcm4oIkNoYW5naW5nIHByaW8gPCVzPjogJXUtPiV1XG4iLAorCQkJd2FybigiUmVzZXR0aW5nIGxpbmsgPCVzPiwgcHJpb3JpdHkgY2hhbmdlICV1LT4ldVxuIiwKIAkJCSAgICAgbF9wdHItPm5hbWUsIGxfcHRyLT5wcmlvcml0eSwgbXNnX2xpbmtwcmlvKG1zZykpOwogCQkJbF9wdHItPnByaW9yaXR5ID0gbXNnX2xpbmtwcmlvKG1zZyk7CiAJCQl0aXBjX2xpbmtfcmVzZXQobF9wdHIpOyAvKiBFbmZvcmNlIGNoYW5nZSB0byB0YWtlIGVmZmVjdCAqLwpAQCAtMjIwOSwxNyArMjMwNCwyMiBAQAogCXUzMiBsZW5ndGggPSBtc2dfc2l6ZShtc2cpOwogCiAJdHVubmVsID0gbF9wdHItPm93bmVyLT5hY3RpdmVfbGlua3Nbc2VsZWN0b3IgJiAxXTsKLQlpZiAoIXRpcGNfbGlua19pc191cCh0dW5uZWwpKQorCWlmICghdGlwY19saW5rX2lzX3VwKHR1bm5lbCkpIHsKKwkJd2FybigiTGluayBjaGFuZ2VvdmVyIGVycm9yLCAiCisJCSAgICAgInR1bm5lbCBsaW5rIG5vIGxvbmdlciBhdmFpbGFibGVcbiIpOwogCQlyZXR1cm47CisJfQogCW1zZ19zZXRfc2l6ZSh0dW5uZWxfaGRyLCBsZW5ndGggKyBJTlRfSF9TSVpFKTsKIAlidWYgPSBidWZfYWNxdWlyZShsZW5ndGggKyBJTlRfSF9TSVpFKTsKLQlpZiAoIWJ1ZikKKwlpZiAoIWJ1ZikgeworCQl3YXJuKCJMaW5rIGNoYW5nZW92ZXIgZXJyb3IsICIKKwkJICAgICAidW5hYmxlIHRvIHNlbmQgdHVubmVsIG1zZ1xuIik7CiAJCXJldHVybjsKKwl9CiAJbWVtY3B5KGJ1Zi0+ZGF0YSwgKHVuY2hhciAqKXR1bm5lbF9oZHIsIElOVF9IX1NJWkUpOwogCW1lbWNweShidWYtPmRhdGEgKyBJTlRfSF9TSVpFLCAodW5jaGFyICopbXNnLCBsZW5ndGgpOwogCWRiZygiJWMtPiVjOiIsIGxfcHRyLT5iX3B0ci0+bmV0X3BsYW5lLCB0dW5uZWwtPmJfcHRyLT5uZXRfcGxhbmUpOwogCW1zZ19kYmcoYnVmX21zZyhidWYpLCAiPlNFTkQ+Iik7Ci0JYXNzZXJ0KHR1bm5lbCk7CiAJdGlwY19saW5rX3NlbmRfYnVmKHR1bm5lbCwgYnVmKTsKIH0KIApAQCAtMjIzNSwyMyArMjMzNSwyNyBAQAogCXUzMiBtc2djb3VudCA9IGxfcHRyLT5vdXRfcXVldWVfc2l6ZTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqY3JzID0gbF9wdHItPmZpcnN0X291dDsKIAlzdHJ1Y3QgbGluayAqdHVubmVsID0gbF9wdHItPm93bmVyLT5hY3RpdmVfbGlua3NbMF07Ci0JaW50IHNwbGl0X2J1bmRsZXMgPSB0aXBjX25vZGVfaGFzX3JlZHVuZGFudF9saW5rcyhsX3B0ci0+b3duZXIpOwogCXN0cnVjdCB0aXBjX21zZyB0dW5uZWxfaGRyOworCWludCBzcGxpdF9idW5kbGVzOwogCiAJaWYgKCF0dW5uZWwpCiAJCXJldHVybjsKIAotCWlmICghbF9wdHItPm93bmVyLT5wZXJtaXRfY2hhbmdlb3ZlcikKKwlpZiAoIWxfcHRyLT5vd25lci0+cGVybWl0X2NoYW5nZW92ZXIpIHsKKwkJd2FybigiTGluayBjaGFuZ2VvdmVyIGVycm9yLCAiCisJCSAgICAgInBlZXIgZGlkIG5vdCBwZXJtaXQgY2hhbmdlb3ZlclxuIik7CiAJCXJldHVybjsKKwl9CiAKIAltc2dfaW5pdCgmdHVubmVsX2hkciwgQ0hBTkdFT1ZFUl9QUk9UT0NPTCwKIAkJIE9SSUdJTkFMX01TRywgVElQQ19PSywgSU5UX0hfU0laRSwgbF9wdHItPmFkZHIpOwogCW1zZ19zZXRfYmVhcmVyX2lkKCZ0dW5uZWxfaGRyLCBsX3B0ci0+cGVlcl9iZWFyZXJfaWQpOwogCW1zZ19zZXRfbXNnY250KCZ0dW5uZWxfaGRyLCBtc2djb3VudCk7CisJZGJnKCJMaW5rIGNoYW5nZW92ZXIgcmVxdWlyZXMgJXUgdHVubmVsIG1lc3NhZ2VzXG4iLCBtc2djb3VudCk7CisKIAlpZiAoIWxfcHRyLT5maXJzdF9vdXQpIHsKIAkJc3RydWN0IHNrX2J1ZmYgKmJ1ZjsKIAotCQlhc3NlcnQoIW1zZ2NvdW50KTsKIAkJYnVmID0gYnVmX2FjcXVpcmUoSU5UX0hfU0laRSk7CiAJCWlmIChidWYpIHsKIAkJCW1lbWNweShidWYtPmRhdGEsICh1bmNoYXIgKikmdHVubmVsX2hkciwgSU5UX0hfU0laRSk7CkBAIC0yMjYxLDEwICsyMzY1LDE1IEBACiAJCQltc2dfZGJnKCZ0dW5uZWxfaGRyLCAiRU1QVFk+U0VORD4iKTsKIAkJCXRpcGNfbGlua19zZW5kX2J1Zih0dW5uZWwsIGJ1Zik7CiAJCX0gZWxzZSB7Ci0JCQl3YXJuKCJNZW1vcnkgc3F1ZWV6ZTsgbGluayBjaGFuZ2VvdmVyIGZhaWxlZFxuIik7CisJCQl3YXJuKCJMaW5rIGNoYW5nZW92ZXIgZXJyb3IsICIKKwkJCSAgICAgInVuYWJsZSB0byBzZW5kIGNoYW5nZW92ZXIgbXNnXG4iKTsKIAkJfQogCQlyZXR1cm47CiAJfQorCisJc3BsaXRfYnVuZGxlcyA9IChsX3B0ci0+b3duZXItPmFjdGl2ZV9saW5rc1swXSAhPSAKKwkJCSBsX3B0ci0+b3duZXItPmFjdGl2ZV9saW5rc1sxXSk7CisKIAl3aGlsZSAoY3JzKSB7CiAJCXN0cnVjdCB0aXBjX21zZyAqbXNnID0gYnVmX21zZyhjcnMpOwogCkBAIC0yMzEwLDcgKzI0MTksOCBAQAogCQltc2dfc2V0X3NpemUoJnR1bm5lbF9oZHIsIGxlbmd0aCArIElOVF9IX1NJWkUpOwogCQlvdXRidWYgPSBidWZfYWNxdWlyZShsZW5ndGggKyBJTlRfSF9TSVpFKTsKIAkJaWYgKG91dGJ1ZiA9PSBOVUxMKSB7Ci0JCQl3YXJuKCJNZW1vcnkgc3F1ZWV6ZTsgYnVmZmVyIGR1cGxpY2F0aW9uIGZhaWxlZFxuIik7CisJCQl3YXJuKCJMaW5rIGNoYW5nZW92ZXIgZXJyb3IsICIKKwkJCSAgICAgInVuYWJsZSB0byBzZW5kIGR1cGxpY2F0ZSBtc2dcbiIpOwogCQkJcmV0dXJuOwogCQl9CiAJCW1lbWNweShvdXRidWYtPmRhdGEsICh1bmNoYXIgKikmdHVubmVsX2hkciwgSU5UX0hfU0laRSk7CkBAIC0yMzY0LDExICsyNDc0LDE1IEBACiAJdTMyIG1zZ19jb3VudCA9IG1zZ19tc2djbnQodHVubmVsX21zZyk7CiAKIAlkZXN0X2xpbmsgPSAoKmxfcHRyKS0+b3duZXItPmxpbmtzW21zZ19iZWFyZXJfaWQodHVubmVsX21zZyldOwotCWFzc2VydChkZXN0X2xpbmsgIT0gKmxfcHRyKTsKIAlpZiAoIWRlc3RfbGluaykgewogCQltc2dfZGJnKHR1bm5lbF9tc2csICJOT0xJTksvPFJFQzwiKTsKIAkJZ290byBleGl0OwogCX0KKwlpZiAoZGVzdF9saW5rID09ICpsX3B0cikgeworCQllcnIoIlVuZXhwZWN0ZWQgY2hhbmdlb3ZlciBtZXNzYWdlIG9uIGxpbmsgPCVzPlxuIiwgCisJCSAgICAoKmxfcHRyKS0+bmFtZSk7CisJCWdvdG8gZXhpdDsKKwl9CiAJZGJnKCIlYzwtJWM6IiwgZGVzdF9saW5rLT5iX3B0ci0+bmV0X3BsYW5lLAogCSAgICAoKmxfcHRyKS0+Yl9wdHItPm5ldF9wbGFuZSk7CiAJKmxfcHRyID0gZGVzdF9saW5rOwpAQCAtMjM4MSw3ICsyNDk1LDcgQEAKIAkJfQogCQkqYnVmID0gYnVmX2V4dHJhY3QodHVubmVsX2J1ZixJTlRfSF9TSVpFKTsKIAkJaWYgKCpidWYgPT0gTlVMTCkgewotCQkJd2FybigiTWVtb3J5IHNxdWVlemU7IGZhaWxlZCB0byBleHRyYWN0IG1zZ1xuIik7CisJCQl3YXJuKCJMaW5rIGNoYW5nZW92ZXIgZXJyb3IsIGR1cGxpY2F0ZSBtc2cgZHJvcHBlZFxuIik7CiAJCQlnb3RvIGV4aXQ7CiAJCX0KIAkJbXNnX2RiZyh0dW5uZWxfbXNnLCAiVE5MPFJFQzwiKTsKQEAgLTIzOTMsMTMgKzI1MDcsMTcgQEAKIAogCWlmICh0aXBjX2xpbmtfaXNfdXAoZGVzdF9saW5rKSkgewogCQltc2dfZGJnKHR1bm5lbF9tc2csICJVUC9GSVJTVC88UkVDPCIpOworCQlpbmZvKCJSZXNldHRpbmcgbGluayA8JXM+LCBjaGFuZ2VvdmVyIGluaXRpYXRlZCBieSBwZWVyXG4iLAorCQkgICAgIGRlc3RfbGluay0+bmFtZSk7CiAJCXRpcGNfbGlua19yZXNldChkZXN0X2xpbmspOwogCQlkZXN0X2xpbmstPmV4cF9tc2dfY291bnQgPSBtc2dfY291bnQ7CisJCWRiZygiRXhwZWN0aW5nICV1IHR1bm5lbGxlZCBtZXNzYWdlc1xuIiwgbXNnX2NvdW50KTsKIAkJaWYgKCFtc2dfY291bnQpCiAJCQlnb3RvIGV4aXQ7CiAJfSBlbHNlIGlmIChkZXN0X2xpbmstPmV4cF9tc2dfY291bnQgPT0gU1RBUlRfQ0hBTkdFT1ZFUikgewogCQltc2dfZGJnKHR1bm5lbF9tc2csICJCTEsvRklSU1QvPFJFQzwiKTsKIAkJZGVzdF9saW5rLT5leHBfbXNnX2NvdW50ID0gbXNnX2NvdW50OworCQlkYmcoIkV4cGVjdGluZyAldSB0dW5uZWxsZWQgbWVzc2FnZXNcbiIsIG1zZ19jb3VudCk7CiAJCWlmICghbXNnX2NvdW50KQogCQkJZ290byBleGl0OwogCX0KQEAgLTI0MDcsNiArMjUyNSw4IEBACiAJLyogUmVjZWl2ZSBvcmlnaW5hbCBtZXNzYWdlICovCiAKIAlpZiAoZGVzdF9saW5rLT5leHBfbXNnX2NvdW50ID09IDApIHsKKwkJd2FybigiTGluayBzd2l0Y2hvdmVyIGVycm9yLCAiCisJCSAgICAgImdvdCB0b28gbWFueSB0dW5uZWxsZWQgbWVzc2FnZXNcbiIpOwogCQltc2dfZGJnKHR1bm5lbF9tc2csICJPVkVSRFVFL0RST1AvPFJFQzwiKTsKIAkJZGJnX3ByaW50X2xpbmsoZGVzdF9saW5rLCAiTElOSzoiKTsKIAkJZ290byBleGl0OwpAQCAtMjQyMiw3ICsyNTQyLDcgQEAKIAkJCWJ1Zl9kaXNjYXJkKHR1bm5lbF9idWYpOwogCQkJcmV0dXJuIDE7CiAJCX0gZWxzZSB7Ci0JCQl3YXJuKCJNZW1vcnkgc3F1ZWV6ZTsgZHJvcHBlZCBpbmNvbWluZyBtc2dcbiIpOworCQkJd2FybigiTGluayBjaGFuZ2VvdmVyIGVycm9yLCBvcmlnaW5hbCBtc2cgZHJvcHBlZFxuIik7CiAJCX0KIAl9CiBleGl0OgpAQCAtMjQ0NCwxMyArMjU2NCw4IEBACiAJd2hpbGUgKG1zZ2NvdW50LS0pIHsKIAkJb2J1ZiA9IGJ1Zl9leHRyYWN0KGJ1ZiwgcG9zKTsKIAkJaWYgKG9idWYgPT0gTlVMTCkgewotCQkJY2hhciBhZGRyX3N0cmluZ1sxNl07Ci0KLQkJCXdhcm4oIkJ1ZmZlciBhbGxvY2F0aW9uIGZhaWx1cmU7XG4iKTsKLQkJCXdhcm4oIiAgaW5jb21pbmcgbWVzc2FnZShzKSBmcm9tICVzIGxvc3RcbiIsCi0JCQkgICAgIGFkZHJfc3RyaW5nX2ZpbGwoYWRkcl9zdHJpbmcsIAotCQkJCQkgICAgICBtc2dfb3JpZ25vZGUoYnVmX21zZyhidWYpKSkpOwotCQkJcmV0dXJuOworCQkJd2FybigiTGluayB1bmFibGUgdG8gdW5idW5kbGUgbWVzc2FnZShzKVxuIik7CisJCQlicmVhazsKIAkJfTsKIAkJcG9zICs9IGFsaWduKG1zZ19zaXplKGJ1Zl9tc2cob2J1ZikpKTsKIAkJbXNnX2RiZyhidWZfbXNnKG9idWYpLCAiICAgICAvIik7CkBAIC0yNTA4LDcgKzI2MjMsNyBAQAogCQl9CiAJCWZyYWdtID0gYnVmX2FjcXVpcmUoZnJhZ21fc3ogKyBJTlRfSF9TSVpFKTsKIAkJaWYgKGZyYWdtID09IE5VTEwpIHsKLQkJCXdhcm4oIk1lbW9yeSBzcXVlZXplOyBmYWlsZWQgdG8gZnJhZ21lbnQgbXNnXG4iKTsKKwkJCXdhcm4oIkxpbmsgdW5hYmxlIHRvIGZyYWdtZW50IG1lc3NhZ2VcbiIpOwogCQkJZHN6ID0gLUVOT01FTTsKIAkJCWdvdG8gZXhpdDsKIAkJfQpAQCAtMjYyMyw3ICsyNzM4LDcgQEAKIAkJCXNldF9mcmFnbV9zaXplKHBidWYsZnJhZ21fc3opOyAKIAkJCXNldF9leHBlY3RlZF9mcmFncyhwYnVmLGV4cF9mcmFnbV9jbnQgLSAxKTsgCiAJCX0gZWxzZSB7Ci0JCQl3YXJuKCJNZW1vcnkgc3F1ZWV6ZTsgZ290IG5vIGRlZnJhZ21lbnRpbmcgYnVmZmVyXG4iKTsKKwkJCXdhcm4oIkxpbmsgdW5hYmxlIHRvIHJlYXNzZW1ibGUgZnJhZ21lbnRlZCBtZXNzYWdlXG4iKTsKIAkJfQogCQlidWZfZGlzY2FyZChmYnVmKTsKIAkJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9uZXQvdGlwYy9uYW1lX2Rpc3RyLmMgYi9uZXQvdGlwYy9uYW1lX2Rpc3RyLmMKaW5kZXggYTNiYmM4OS4uZjBiMDYzYiAxMDA2NDQKLS0tIGEvbmV0L3RpcGMvbmFtZV9kaXN0ci5jCisrKyBiL25ldC90aXBjL25hbWVfZGlzdHIuYwpAQCAtMTI3LDcgKzEyNyw3IEBACiAKIAlidWYgPSBuYW1lZF9wcmVwYXJlX2J1ZihQVUJMSUNBVElPTiwgSVRFTV9TSVpFLCAwKTsKIAlpZiAoIWJ1ZikgewotCQl3YXJuKCJNZW1vcnkgc3F1ZWV6ZTsgZmFpbGVkIHRvIGRpc3RyaWJ1dGUgcHVibGljYXRpb25cbiIpOworCQl3YXJuKCJQdWJsaWNhdGlvbiBkaXN0cmlidXRpb24gZmFpbHVyZVxuIik7CiAJCXJldHVybjsKIAl9CiAKQEAgLTE1MSw3ICsxNTEsNyBAQAogCiAJYnVmID0gbmFtZWRfcHJlcGFyZV9idWYoV0lUSERSQVdBTCwgSVRFTV9TSVpFLCAwKTsKIAlpZiAoIWJ1ZikgewotCQl3YXJuKCJNZW1vcnkgc3F1ZWV6ZTsgZmFpbGVkIHRvIGRpc3RyaWJ1dGUgd2l0aGRyYXdhbFxuIik7CisJCXdhcm4oIldpdGhkcmF3bCBkaXN0cmlidXRpb24gZmFpbHVyZVxuIik7CiAJCXJldHVybjsKIAl9CiAKQEAgLTE3NCw3ICsxNzQsNiBAQAogCXUzMiByZXN0OwogCXUzMiBtYXhfaXRlbV9idWY7CiAKLQlhc3NlcnQoaW5fb3duX2NsdXN0ZXIobm9kZSkpOwogCXJlYWRfbG9ja19iaCgmdGlwY19uYW1ldGJsX2xvY2spOyAKIAltYXhfaXRlbV9idWYgPSBUSVBDX01BWF9VU0VSX01TR19TSVpFIC8gSVRFTV9TSVpFOwogCW1heF9pdGVtX2J1ZiAqPSBJVEVNX1NJWkU7CkBAIC0xODUsOCArMTg0LDggQEAKIAkJCWxlZnQgPSAocmVzdCA8PSBtYXhfaXRlbV9idWYpID8gcmVzdCA6IG1heF9pdGVtX2J1ZjsKIAkJCXJlc3QgLT0gbGVmdDsKIAkJCWJ1ZiA9IG5hbWVkX3ByZXBhcmVfYnVmKFBVQkxJQ0FUSU9OLCBsZWZ0LCBub2RlKTsgICAgICAgCi0JCQlpZiAoYnVmID09IE5VTEwpIHsKLQkJCQl3YXJuKCJNZW1vcnkgU3F1ZWV6ZTsgY291bGQgbm90IHNlbmQgcHVibGljYXRpb25cbiIpOworCQkJaWYgKCFidWYpIHsKKwkJCQl3YXJuKCJCdWxrIHB1YmxpY2F0aW9uIGRpc3RyaWJ1dGlvbiBmYWlsdXJlXG4iKTsKIAkJCQlnb3RvIGV4aXQ7CiAJCQl9CiAJCQlpdGVtID0gKHN0cnVjdCBkaXN0cl9pdGVtICopbXNnX2RhdGEoYnVmX21zZyhidWYpKTsKQEAgLTIyMSwxNSArMjIwLDI0IEBACiBzdGF0aWMgdm9pZCBub2RlX2lzX2Rvd24oc3RydWN0IHB1YmxpY2F0aW9uICpwdWJsKQogewogCXN0cnVjdCBwdWJsaWNhdGlvbiAqcDsKKwogICAgICAgICB3cml0ZV9sb2NrX2JoKCZ0aXBjX25hbWV0YmxfbG9jayk7CiAJZGJnKCJub2RlX2lzX2Rvd246IHdpdGhkcmF3aW5nICV1LCAldSwgJXVcbiIsIAogCSAgICBwdWJsLT50eXBlLCBwdWJsLT5sb3dlciwgcHVibC0+dXBwZXIpOwogICAgICAgICBwdWJsLT5rZXkgKz0gMTIyMjM0NTsKIAlwID0gdGlwY19uYW1ldGJsX3JlbW92ZV9wdWJsKHB1YmwtPnR5cGUsIHB1YmwtPmxvd2VyLCAKIAkJCQkgICAgIHB1YmwtPm5vZGUsIHB1YmwtPnJlZiwgcHVibC0+a2V5KTsKLSAgICAgICAgYXNzZXJ0KHAgPT0gcHVibCk7CiAJd3JpdGVfdW5sb2NrX2JoKCZ0aXBjX25hbWV0YmxfbG9jayk7Ci0Ja2ZyZWUocHVibCk7CisKKyAgICAgICAgaWYgKHAgIT0gcHVibCkgeworCQllcnIoIlVuYWJsZSB0byByZW1vdmUgcHVibGljYXRpb24gZnJvbSBmYWlsZWQgbm9kZVxuIgorCQkgICAgIih0eXBlPSV1LCBsb3dlcj0ldSwgbm9kZT0weCV4LCByZWY9JXUsIGtleT0ldSlcbiIsCisJCSAgICBwdWJsLT50eXBlLCBwdWJsLT5sb3dlciwgcHVibC0+bm9kZSwgcHVibC0+cmVmLCBwdWJsLT5rZXkpOworCX0KKworCWlmIChwKSB7CisJCWtmcmVlKHApOworCX0KIH0KIAogLyoqCkBAIC0yNzUsOSArMjgzLDE1IEBACiAJCQlpZiAocHVibCkgewogCQkJCXRpcGNfbm9kZXN1Yl91bnN1YnNjcmliZSgmcHVibC0+c3Vic2NyKTsKICAgICAgICAgCQkJa2ZyZWUocHVibCk7CisJCQl9IGVsc2UgeworCQkJCWVycigiVW5hYmxlIHRvIHJlbW92ZSBwdWJsaWNhdGlvbiBieSBub2RlIDB4JXhcbiIKKwkJCQkgICAgIih0eXBlPSV1LCBsb3dlcj0ldSwgcmVmPSV1LCBrZXk9JXUpXG4iLAorCQkJCSAgICBtc2dfb3JpZ25vZGUobXNnKSwKKwkJCQkgICAgbnRvaGwoaXRlbS0+dHlwZSksIG50b2hsKGl0ZW0tPmxvd2VyKSwKKwkJCQkgICAgbnRvaGwoaXRlbS0+cmVmKSwgbnRvaGwoaXRlbS0+a2V5KSk7CiAJCQl9CiAJCX0gZWxzZSB7Ci0JCQl3YXJuKCJ0aXBjX25hbWVkX3JlY3Y6IHVua25vd24gbXNnXG4iKTsKKwkJCXdhcm4oIlVucmVjb2duaXplZCBuYW1lIHRhYmxlIG1lc3NhZ2UgcmVjZWl2ZWRcbiIpOwogCQl9CiAJCWl0ZW0rKzsKIAl9CmRpZmYgLS1naXQgYS9uZXQvdGlwYy9uYW1lX3RhYmxlLmMgYi9uZXQvdGlwYy9uYW1lX3RhYmxlLmMKaW5kZXggZDEyOTQyMi4uMzg1NzEzMCAxMDA2NDQKLS0tIGEvbmV0L3RpcGMvbmFtZV90YWJsZS5jCisrKyBiL25ldC90aXBjL25hbWVfdGFibGUuYwpAQCAtNzEsNyArNzEsNyBAQAogICogQHNzZXE6IHBvaW50ZXIgdG8gZHluYW1pY2FsbHktc2l6ZWQgYXJyYXkgb2Ygc3ViLXNlcXVlbmNlcyBvZiB0aGlzICd0eXBlJzsKICAqICAgICAgICBzdWItc2VxdWVuY2VzIGFyZSBzb3J0ZWQgaW4gYXNjZW5kaW5nIG9yZGVyCiAgKiBAYWxsb2M6IG51bWJlciBvZiBzdWItc2VxdWVuY2VzIGN1cnJlbnRseSBpbiBhcnJheQotICogQGZpcnN0X2ZyZWU6IHVwcGVyIGJvdW5kIG9mIGhpZ2hlc3Qgc3ViLXNlcXVlbmNlICsgMQorICogQGZpcnN0X2ZyZWU6IGFycmF5IGluZGV4IG9mIGZpcnN0IHVudXNlZCBzdWItc2VxdWVuY2UgZW50cnkKICAqIEBuc19saXN0OiBsaW5rcyB0byBhZGphY2VudCBuYW1lIHNlcXVlbmNlcyBpbiBoYXNoIGNoYWluCiAgKiBAc3Vic2NyaXB0aW9uczogbGlzdCBvZiBzdWJzY3JpcHRpb25zIGZvciB0aGlzICd0eXBlJwogICogQGxvY2s6IHNwaW5sb2NrIGNvbnRyb2xsaW5nIGFjY2VzcyB0byBuYW1lIHNlcXVlbmNlIHN0cnVjdHVyZQpAQCAtMTIwLDcgKzEyMCw3IEBACiAJc3RydWN0IHB1YmxpY2F0aW9uICpwdWJsID0KIAkJKHN0cnVjdCBwdWJsaWNhdGlvbiAqKWttYWxsb2Moc2l6ZW9mKCpwdWJsKSwgR0ZQX0FUT01JQyk7CiAJaWYgKHB1YmwgPT0gTlVMTCkgewotCQl3YXJuKCJNZW1vcnkgc3F1ZWV6ZTsgZmFpbGVkIHRvIGNyZWF0ZSBwdWJsaWNhdGlvblxuIik7CisJCXdhcm4oIlB1YmxpY2F0aW9uIGNyZWF0aW9uIGZhaWx1cmUsIG5vIG1lbW9yeVxuIik7CiAJCXJldHVybiBOVUxMOwogCX0KIApAQCAtMTY1LDcgKzE2NSw3IEBACiAJc3RydWN0IHN1Yl9zZXEgKnNzZXEgPSB0aXBjX3N1YnNlcV9hbGxvYygxKTsKIAogCWlmICghbnNlcSB8fCAhc3NlcSkgewotCQl3YXJuKCJNZW1vcnkgc3F1ZWV6ZTsgZmFpbGVkIHRvIGNyZWF0ZSBuYW1lIHNlcXVlbmNlXG4iKTsKKwkJd2FybigiTmFtZSBzZXF1ZW5jZSBjcmVhdGlvbiBmYWlsZWQsIG5vIG1lbW9yeVxuIik7CiAJCWtmcmVlKG5zZXEpOwogCQlrZnJlZShzc2VxKTsKIAkJcmV0dXJuIE5VTEw7CkBAIC0xNzUsNyArMTc1LDcgQEAKIAluc2VxLT5sb2NrID0gU1BJTl9MT0NLX1VOTE9DS0VEOwogCW5zZXEtPnR5cGUgPSB0eXBlOwogCW5zZXEtPnNzZXFzID0gc3NlcTsKLQlkYmcoInRpcGNfbmFtZXNlcV9jcmVhdGUoKSBuc2VxID0gJXggdHlwZSAldSwgc3NzZXFzICV4LCBmZjogJXVcbiIsCisJZGJnKCJ0aXBjX25hbWVzZXFfY3JlYXRlKCk6IG5zZXEgPSAlcCwgdHlwZSAldSwgc3NzZXFzICVwLCBmZjogJXVcbiIsCiAJICAgIG5zZXEsIHR5cGUsIG5zZXEtPnNzZXFzLCBuc2VxLT5maXJzdF9mcmVlKTsKIAluc2VxLT5hbGxvYyA9IDE7CiAJSU5JVF9ITElTVF9OT0RFKCZuc2VxLT5uc19saXN0KTsKQEAgLTI1MywxNiArMjUzLDE2IEBACiAJc3RydWN0IHN1Yl9zZXEgKnNzZXE7CiAJaW50IGNyZWF0ZWRfc3Vic2VxID0gMDsKIAotCWFzc2VydChuc2VxLT5maXJzdF9mcmVlIDw9IG5zZXEtPmFsbG9jKTsKIAlzc2VxID0gbmFtZXNlcV9maW5kX3N1YnNlcShuc2VxLCBsb3dlcik7Ci0JZGJnKCJuYW1lc2VxX2luczogZm9yIHNlcSAleCw8JXUsJXU+LCBmb3VuZCBzc2VxICV4XG4iLAorCWRiZygibmFtZXNlcV9pbnM6IGZvciBzZXEgJXAsIHsldSwldX0sIGZvdW5kIHNzZXEgJXBcbiIsCiAJICAgIG5zZXEsIHR5cGUsIGxvd2VyLCBzc2VxKTsKIAlpZiAoc3NlcSkgewogCiAJCS8qIExvd2VyIGVuZCBvdmVybGFwcyBleGlzdGluZyBlbnRyeSA9PiBuZWVkIGFuIGV4YWN0IG1hdGNoICovCiAKIAkJaWYgKChzc2VxLT5sb3dlciAhPSBsb3dlcikgfHwgKHNzZXEtPnVwcGVyICE9IHVwcGVyKSkgewotCQkJd2FybigiT3ZlcmxhcHBpbmcgcHVibCA8JXUsJXUsJXU+XG4iLCB0eXBlLCBsb3dlciwgdXBwZXIpOworCQkJd2FybigiQ2Fubm90IHB1Ymxpc2ggeyV1LCV1LCV1fSwgb3ZlcmxhcCBlcnJvclxuIiwKKwkJCSAgICAgdHlwZSwgbG93ZXIsIHVwcGVyKTsKIAkJCXJldHVybiBOVUxMOwogCQl9CiAJfSBlbHNlIHsKQEAgLTI3NywyNSArMjc3LDI3IEBACiAKIAkJaWYgKChpbnNwb3MgPCBuc2VxLT5maXJzdF9mcmVlKSAmJgogCQkgICAgKHVwcGVyID49IG5zZXEtPnNzZXFzW2luc3Bvc10ubG93ZXIpKSB7Ci0JCQl3YXJuKCJPdmVybGFwcGluZyBwdWJsIDwldSwldSwldT5cbiIsIHR5cGUsIGxvd2VyLCB1cHBlcik7CisJCQl3YXJuKCJDYW5ub3QgcHVibGlzaCB7JXUsJXUsJXV9LCBvdmVybGFwIGVycm9yXG4iLAorCQkJICAgICB0eXBlLCBsb3dlciwgdXBwZXIpOwogCQkJcmV0dXJuIE5VTEw7CiAJCX0KIAogCQkvKiBFbnN1cmUgdGhlcmUgaXMgc3BhY2UgZm9yIG5ldyBzdWItc2VxdWVuY2UgKi8KIAogCQlpZiAobnNlcS0+Zmlyc3RfZnJlZSA9PSBuc2VxLT5hbGxvYykgewotCQkJc3RydWN0IHN1Yl9zZXEgKnNzZXFzID0gbnNlcS0+c3NlcXM7Ci0JCQluc2VxLT5zc2VxcyA9IHRpcGNfc3Vic2VxX2FsbG9jKG5zZXEtPmFsbG9jICogMik7Ci0JCQlpZiAobnNlcS0+c3NlcXMgIT0gTlVMTCkgewotCQkJCW1lbWNweShuc2VxLT5zc2Vxcywgc3NlcXMsCi0JCQkJICAgICAgIG5zZXEtPmFsbG9jICogc2l6ZW9mIChzdHJ1Y3Qgc3ViX3NlcSkpOwotCQkJCWtmcmVlKHNzZXFzKTsKLQkJCQlkYmcoIkFsbG9jYXRlZCAldSBzc2Vxc1xuIiwgbnNlcS0+YWxsb2MpOwotCQkJCW5zZXEtPmFsbG9jICo9IDI7Ci0JCQl9IGVsc2UgewotCQkJCXdhcm4oIk1lbW9yeSBzcXVlZXplOyBmYWlsZWQgdG8gY3JlYXRlIHN1Yi1zZXF1ZW5jZVxuIik7CisJCQlzdHJ1Y3Qgc3ViX3NlcSAqc3NlcXMgPSB0aXBjX3N1YnNlcV9hbGxvYyhuc2VxLT5hbGxvYyAqIDIpOworCisJCQlpZiAoIXNzZXFzKSB7CisJCQkJd2FybigiQ2Fubm90IHB1Ymxpc2ggeyV1LCV1LCV1fSwgbm8gbWVtb3J5XG4iLAorCQkJCSAgICAgdHlwZSwgbG93ZXIsIHVwcGVyKTsKIAkJCQlyZXR1cm4gTlVMTDsKIAkJCX0KKwkJCWRiZygiQWxsb2NhdGVkICV1IG1vcmUgc3NlcXNcbiIsIG5zZXEtPmFsbG9jKTsKKwkJCW1lbWNweShzc2VxcywgbnNlcS0+c3NlcXMsCisJCQkgICAgICAgbnNlcS0+YWxsb2MgKiBzaXplb2Yoc3RydWN0IHN1Yl9zZXEpKTsKKwkJCWtmcmVlKG5zZXEtPnNzZXFzKTsKKwkJCW5zZXEtPnNzZXFzID0gc3NlcXM7CisJCQluc2VxLT5hbGxvYyAqPSAyOwogCQl9CiAJCWRiZygiSGF2ZSAldSBzc2VxcyBmb3IgdHlwZSAldVxuIiwgbnNlcS0+YWxsb2MsIHR5cGUpOwogCkBAIC0zMTEsNyArMzEzLDcgQEAKIAkJc3NlcS0+dXBwZXIgPSB1cHBlcjsKIAkJY3JlYXRlZF9zdWJzZXEgPSAxOwogCX0KLQlkYmcoImluc2VydGluZyAoJXUgJXUgJXUpIGZyb20gJXg6JXUgaW50byBzc2VxICV4KCV1LCV1KSBvZiBzZXEgJXhcbiIsCisJZGJnKCJpbnNlcnRpbmcgeyV1LCV1LCV1fSBmcm9tIDwweCV4OiV1PiBpbnRvIHNzZXEgJXAoJXUsJXUpIG9mIHNlcSAlcFxuIiwKIAkgICAgdHlwZSwgbG93ZXIsIHVwcGVyLCBub2RlLCBwb3J0LCBzc2VxLAogCSAgICBzc2VxLT5sb3dlciwgc3NlcS0+dXBwZXIsIG5zZXEpOwogCkBAIC0zMjAsNyArMzIyLDcgQEAKIAlwdWJsID0gcHVibF9jcmVhdGUodHlwZSwgbG93ZXIsIHVwcGVyLCBzY29wZSwgbm9kZSwgcG9ydCwga2V5KTsKIAlpZiAoIXB1YmwpCiAJCXJldHVybiBOVUxMOwotCWRiZygiaW5zZXJ0aW5nIHB1YmwgJXgsIG5vZGU9JXggcHVibC0+bm9kZT0leCwgc3Vic2NyLT5ub2RlPSV4XG4iLAorCWRiZygiaW5zZXJ0aW5nIHB1YmwgJXAsIG5vZGU9MHgleCBwdWJsLT5ub2RlPTB4JXgsIHN1YnNjci0+bm9kZT0lcFxuIiwKIAkgICAgcHVibCwgbm9kZSwgcHVibC0+bm9kZSwgcHVibC0+c3Vic2NyLm5vZGUpOwogCiAJaWYgKCFzc2VxLT56b25lX2xpc3QpCkBAIC0zNjcsNDUgKzM2OSw0NyBAQAogCiAvKioKICAqIHRpcGNfbmFtZXNlcV9yZW1vdmVfcHVibCAtCisgKiAKKyAqIE5PVEU6IFRoZXJlIG1heSBiZSBjYXNlcyB3aGVyZSBUSVBDIGlzIGFza2VkIHRvIHJlbW92ZSBhIHB1YmxpY2F0aW9uCisgKiB0aGF0IGlzIG5vdCBpbiB0aGUgbmFtZSB0YWJsZS4gIEZvciBleGFtcGxlLCBpZiBhbm90aGVyIG5vZGUgaXNzdWVzIGEKKyAqIHB1YmxpY2F0aW9uIGZvciBhIG5hbWUgc2VxdWVuY2UgdGhhdCBvdmVybGFwcyBhbiBleGlzdGluZyBuYW1lIHNlcXVlbmNlCisgKiB0aGUgcHVibGljYXRpb24gd2lsbCBub3QgYmUgcmVjb3JkZWQsIHdoaWNoIG1lYW5zIHRoZSBwdWJsaWNhdGlvbiB3b24ndAorICogYmUgZm91bmQgd2hlbiB0aGUgbmFtZSBzZXF1ZW5jZSBpcyBsYXRlciB3aXRoZHJhd24gYnkgdGhhdCBub2RlLgorICogQSBmYWlsZWQgd2l0aGRyYXcgcmVxdWVzdCBzaW1wbHkgcmV0dXJucyBhIGZhaWx1cmUgaW5kaWNhdGlvbiBhbmQgbGV0cyB0aGUKKyAqIGNhbGxlciBpc3N1ZSBhbnkgZXJyb3Igb3Igd2FybmluZyBtZXNzYWdlcyBhc3NvY2lhdGVkIHdpdGggc3VjaCBhIHByb2JsZW0uCiAgKi8KIAogc3RhdGljIHN0cnVjdCBwdWJsaWNhdGlvbiAqdGlwY19uYW1lc2VxX3JlbW92ZV9wdWJsKHN0cnVjdCBuYW1lX3NlcSAqbnNlcSwgdTMyIGluc3QsCiAJCQkJCQkgICAgdTMyIG5vZGUsIHUzMiByZWYsIHUzMiBrZXkpCiB7CiAJc3RydWN0IHB1YmxpY2F0aW9uICpwdWJsOworCXN0cnVjdCBwdWJsaWNhdGlvbiAqY3VycjsKIAlzdHJ1Y3QgcHVibGljYXRpb24gKnByZXY7CiAJc3RydWN0IHN1Yl9zZXEgKnNzZXEgPSBuYW1lc2VxX2ZpbmRfc3Vic2VxKG5zZXEsIGluc3QpOwogCXN0cnVjdCBzdWJfc2VxICpmcmVlOwogCXN0cnVjdCBzdWJzY3JpcHRpb24gKnMsICpzdDsKIAlpbnQgcmVtb3ZlZF9zdWJzZXEgPSAwOwogCi0JYXNzZXJ0KG5zZXEpOwotCi0JaWYgKCFzc2VxKSB7Ci0JCWludCBpOwotCi0JCXdhcm4oIldpdGhkcmF3IHVua25vd24gPCV1LCV1Pj9cbiIsIG5zZXEtPnR5cGUsIGluc3QpOwotCQlhc3NlcnQobnNlcS0+c3NlcXMpOwotCQlkYmcoIkR1bXBpbmcgc3Vic2VxcyAleCBmb3IgJXgsIGFsbG9jID0gJXUsZmY9JXVcbiIsCi0JCSAgICBuc2VxLT5zc2VxcywgbnNlcSwgbnNlcS0+YWxsb2MsIAotCQkgICAgbnNlcS0+Zmlyc3RfZnJlZSk7Ci0JCWZvciAoaSA9IDA7IGkgPCBuc2VxLT5maXJzdF9mcmVlOyBpKyspIHsKLQkJCWRiZygiU3Vic2VxICV1KCV4KTogbG93ZXIgPSAldSx1cHBlciA9ICV1XG4iLAotCQkJICAgIGksICZuc2VxLT5zc2Vxc1tpXSwgbnNlcS0+c3NlcXNbaV0ubG93ZXIsCi0JCQkgICAgbnNlcS0+c3NlcXNbaV0udXBwZXIpOwotCQl9CisJaWYgKCFzc2VxKQogCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZGJnKCJuYW1lc2VxX3JlbW92ZTogc2VxOiAleCwgc3NlcSAleCwgPCV1LCV1PiBrZXkgJXVcbiIsCisKKwlkYmcoInRpcGNfbmFtZXNlcV9yZW1vdmVfcHVibDogc2VxOiAlcCwgc3NlcSAlcCwgeyV1LCV1fSwga2V5ICV1XG4iLAogCSAgICBuc2VxLCBzc2VxLCBuc2VxLT50eXBlLCBpbnN0LCBrZXkpOwogCisJLyogUmVtb3ZlIHB1YmxpY2F0aW9uIGZyb20gem9uZSBzY29wZSBsaXN0ICovCisKIAlwcmV2ID0gc3NlcS0+em9uZV9saXN0OwogCXB1YmwgPSBzc2VxLT56b25lX2xpc3QtPnpvbmVfbGlzdF9uZXh0OwogCXdoaWxlICgocHVibC0+a2V5ICE9IGtleSkgfHwgKHB1YmwtPnJlZiAhPSByZWYpIHx8IAogCSAgICAgICAocHVibC0+bm9kZSAmJiAocHVibC0+bm9kZSAhPSBub2RlKSkpIHsKIAkJcHJldiA9IHB1Ymw7CiAJCXB1YmwgPSBwdWJsLT56b25lX2xpc3RfbmV4dDsKLQkJYXNzZXJ0KHByZXYgIT0gc3NlcS0+em9uZV9saXN0KTsKKwkJaWYgKHByZXYgPT0gc3NlcS0+em9uZV9saXN0KSB7CisJCQkKKwkJCS8qIFByZXZlbnQgZW5kbGVzcyBsb29wIGlmIHB1YmxpY2F0aW9uIG5vdCBmb3VuZCAqLworCisJCQlyZXR1cm4gTlVMTDsKKwkJfQogCX0KIAlpZiAocHVibCAhPSBzc2VxLT56b25lX2xpc3QpCiAJCXByZXYtPnpvbmVfbGlzdF9uZXh0ID0gcHVibC0+em9uZV9saXN0X25leHQ7CkBAIC00MTYsMTQgKzQyMCwyNCBAQAogCQlzc2VxLT56b25lX2xpc3QgPSBOVUxMOwogCX0KIAorCS8qIFJlbW92ZSBwdWJsaWNhdGlvbiBmcm9tIGNsdXN0ZXIgc2NvcGUgbGlzdCwgaWYgcHJlc2VudCAqLworCiAJaWYgKGluX293bl9jbHVzdGVyKG5vZGUpKSB7CiAJCXByZXYgPSBzc2VxLT5jbHVzdGVyX2xpc3Q7Ci0JCXB1YmwgPSBzc2VxLT5jbHVzdGVyX2xpc3QtPmNsdXN0ZXJfbGlzdF9uZXh0OwotCQl3aGlsZSAoKHB1YmwtPmtleSAhPSBrZXkpIHx8IChwdWJsLT5yZWYgIT0gcmVmKSB8fCAKLQkJICAgICAgIChwdWJsLT5ub2RlICYmIChwdWJsLT5ub2RlICE9IG5vZGUpKSkgewotCQkJcHJldiA9IHB1Ymw7Ci0JCQlwdWJsID0gcHVibC0+Y2x1c3Rlcl9saXN0X25leHQ7Ci0JCQlhc3NlcnQocHJldiAhPSBzc2VxLT5jbHVzdGVyX2xpc3QpOworCQljdXJyID0gc3NlcS0+Y2x1c3Rlcl9saXN0LT5jbHVzdGVyX2xpc3RfbmV4dDsKKwkJd2hpbGUgKGN1cnIgIT0gcHVibCkgeworCQkJcHJldiA9IGN1cnI7CisJCQljdXJyID0gY3Vyci0+Y2x1c3Rlcl9saXN0X25leHQ7CisJCQlpZiAocHJldiA9PSBzc2VxLT5jbHVzdGVyX2xpc3QpIHsKKworCQkJCS8qIFByZXZlbnQgZW5kbGVzcyBsb29wIGZvciBtYWxmb3JtZWQgbGlzdCAqLworCisJCQkJZXJyKCJVbmFibGUgdG8gZGUtbGlzdCBjbHVzdGVyIHB1YmxpY2F0aW9uXG4iCisJCQkJICAgICJ7JXUldX0sIG5vZGU9MHgleCwgcmVmPSV1LCBrZXk9JXUpXG4iLAorCQkJCSAgICBwdWJsLT50eXBlLCBwdWJsLT5sb3dlciwgcHVibC0+bm9kZSwgCisJCQkJICAgIHB1YmwtPnJlZiwgcHVibC0+a2V5KTsKKwkJCQlnb3RvIGVuZF9jbHVzdGVyOworCQkJfQogCQl9CiAJCWlmIChwdWJsICE9IHNzZXEtPmNsdXN0ZXJfbGlzdCkKIAkJCXByZXYtPmNsdXN0ZXJfbGlzdF9uZXh0ID0gcHVibC0+Y2x1c3Rlcl9saXN0X25leHQ7CkBAIC00MzQsMTUgKzQ0OCwyNiBAQAogCQkJc3NlcS0+Y2x1c3Rlcl9saXN0ID0gTlVMTDsKIAkJfQogCX0KK2VuZF9jbHVzdGVyOgorCisJLyogUmVtb3ZlIHB1YmxpY2F0aW9uIGZyb20gbm9kZSBzY29wZSBsaXN0LCBpZiBwcmVzZW50ICovCiAKIAlpZiAobm9kZSA9PSB0aXBjX293bl9hZGRyKSB7CiAJCXByZXYgPSBzc2VxLT5ub2RlX2xpc3Q7Ci0JCXB1YmwgPSBzc2VxLT5ub2RlX2xpc3QtPm5vZGVfbGlzdF9uZXh0OwotCQl3aGlsZSAoKHB1YmwtPmtleSAhPSBrZXkpIHx8IChwdWJsLT5yZWYgIT0gcmVmKSB8fCAKLQkJICAgICAgIChwdWJsLT5ub2RlICYmIChwdWJsLT5ub2RlICE9IG5vZGUpKSkgewotCQkJcHJldiA9IHB1Ymw7Ci0JCQlwdWJsID0gcHVibC0+bm9kZV9saXN0X25leHQ7Ci0JCQlhc3NlcnQocHJldiAhPSBzc2VxLT5ub2RlX2xpc3QpOworCQljdXJyID0gc3NlcS0+bm9kZV9saXN0LT5ub2RlX2xpc3RfbmV4dDsKKwkJd2hpbGUgKGN1cnIgIT0gcHVibCkgeworCQkJcHJldiA9IGN1cnI7CisJCQljdXJyID0gY3Vyci0+bm9kZV9saXN0X25leHQ7CisJCQlpZiAocHJldiA9PSBzc2VxLT5ub2RlX2xpc3QpIHsKKworCQkJCS8qIFByZXZlbnQgZW5kbGVzcyBsb29wIGZvciBtYWxmb3JtZWQgbGlzdCAqLworCisJCQkJZXJyKCJVbmFibGUgdG8gZGUtbGlzdCBub2RlIHB1YmxpY2F0aW9uXG4iCisJCQkJICAgICJ7JXUldX0sIG5vZGU9MHgleCwgcmVmPSV1LCBrZXk9JXUpXG4iLAorCQkJCSAgICBwdWJsLT50eXBlLCBwdWJsLT5sb3dlciwgcHVibC0+bm9kZSwgCisJCQkJICAgIHB1YmwtPnJlZiwgcHVibC0+a2V5KTsKKwkJCQlnb3RvIGVuZF9ub2RlOworCQkJfQogCQl9CiAJCWlmIChwdWJsICE9IHNzZXEtPm5vZGVfbGlzdCkKIAkJCXByZXYtPm5vZGVfbGlzdF9uZXh0ID0gcHVibC0+bm9kZV9saXN0X25leHQ7CkBAIC00NTMsMjIgKzQ3OCwxOCBAQAogCQkJc3NlcS0+bm9kZV9saXN0ID0gTlVMTDsKIAkJfQogCX0KLQlhc3NlcnQoIXB1YmwtPm5vZGUgfHwgKHB1YmwtPm5vZGUgPT0gbm9kZSkpOwotCWFzc2VydChwdWJsLT5yZWYgPT0gcmVmKTsKLQlhc3NlcnQocHVibC0+a2V5ID09IGtleSk7CitlbmRfbm9kZToKIAotCS8qIAotCSAqIENvbnRyYWN0IHN1YnNlcSBsaXN0IGlmIG5vIG1vcmUgcHVibGljYXRpb25zOgotCSAqLwotCWlmICghc3NlcS0+bm9kZV9saXN0ICYmICFzc2VxLT5jbHVzdGVyX2xpc3QgJiYgIXNzZXEtPnpvbmVfbGlzdCkgeworCS8qIENvbnRyYWN0IHN1YnNlcSBsaXN0IGlmIG5vIG1vcmUgcHVibGljYXRpb25zIGZvciB0aGF0IHN1YnNlcSAqLworCisJaWYgKCFzc2VxLT56b25lX2xpc3QpIHsKIAkJZnJlZSA9ICZuc2VxLT5zc2Vxc1tuc2VxLT5maXJzdF9mcmVlLS1dOwogCQltZW1tb3ZlKHNzZXEsIHNzZXEgKyAxLCAoZnJlZSAtIChzc2VxICsgMSkpICogc2l6ZW9mICgqc3NlcSkpOwogCQlyZW1vdmVkX3N1YnNlcSA9IDE7CiAJfQogCi0JLyogCi0JICogQW55IHN1YnNjcmlwdGlvbnMgd2FpdGluZyA/IAotCSAqLworCS8qIE5vdGlmeSBhbnkgd2FpdGluZyBzdWJzY3JpcHRpb25zICovCisKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocywgc3QsICZuc2VxLT5zdWJzY3JpcHRpb25zLCBuYW1lc2VxX2xpc3QpIHsKIAkJdGlwY19zdWJzY3JfcmVwb3J0X292ZXJsYXAocywKIAkJCQkJICAgcHVibC0+bG93ZXIsCkBAIC00NzgsNiArNDk5LDcgQEAKIAkJCQkJICAgcHVibC0+bm9kZSwKIAkJCQkJICAgcmVtb3ZlZF9zdWJzZXEpOwogCX0KKwogCXJldHVybiBwdWJsOwogfQogCkBAIC01MzAsNyArNTUyLDcgQEAKIAlzZXFfaGVhZCA9ICZ0YWJsZS50eXBlc1toYXNoKHR5cGUpXTsKIAlobGlzdF9mb3JfZWFjaF9lbnRyeShucywgc2VxX25vZGUsIHNlcV9oZWFkLCBuc19saXN0KSB7CiAJCWlmIChucy0+dHlwZSA9PSB0eXBlKSB7Ci0JCQlkYmcoImZvdW5kICV4XG4iLCBucyk7CisJCQlkYmcoImZvdW5kICVwXG4iLCBucyk7CiAJCQlyZXR1cm4gbnM7CiAJCX0KIAl9CkBAIC01NDMsMjIgKzU2NSwyMSBAQAogewogCXN0cnVjdCBuYW1lX3NlcSAqc2VxID0gbmFtZXRibF9maW5kX3NlcSh0eXBlKTsKIAotCWRiZygiaW5zX3B1Ymw6IDwldSwleCwleD4gZm91bmQgJXhcbiIsIHR5cGUsIGxvd2VyLCB1cHBlciwgc2VxKTsKKwlkYmcoInRpcGNfbmFtZXRibF9pbnNlcnRfcHVibDogeyV1LCV1LCV1fSBmb3VuZCAlcFxuIiwgdHlwZSwgbG93ZXIsIHVwcGVyLCBzZXEpOwogCWlmIChsb3dlciA+IHVwcGVyKSB7Ci0JCXdhcm4oIkZhaWxlZCB0byBwdWJsaXNoIGlsbGVnYWwgPCV1LCV1LCV1PlxuIiwKKwkJd2FybigiRmFpbGVkIHRvIHB1Ymxpc2ggaWxsZWdhbCB7JXUsJXUsJXV9XG4iLAogCQkgICAgIHR5cGUsIGxvd2VyLCB1cHBlcik7CiAJCXJldHVybiBOVUxMOwogCX0KIAotCWRiZygiUHVibGlzaGluZyA8JXUsJXUsJXU+IGZyb20gJXhcbiIsIHR5cGUsIGxvd2VyLCB1cHBlciwgbm9kZSk7CisJZGJnKCJQdWJsaXNoaW5nIHsldSwldSwldX0gZnJvbSAweCV4XG4iLCB0eXBlLCBsb3dlciwgdXBwZXIsIG5vZGUpOwogCWlmICghc2VxKSB7CiAJCXNlcSA9IHRpcGNfbmFtZXNlcV9jcmVhdGUodHlwZSwgJnRhYmxlLnR5cGVzW2hhc2godHlwZSldKTsKLQkJZGJnKCJ0aXBjX25hbWV0YmxfaW5zZXJ0X3B1Ymw6IGNyZWF0ZWQgJXhcbiIsIHNlcSk7CisJCWRiZygidGlwY19uYW1ldGJsX2luc2VydF9wdWJsOiBjcmVhdGVkICVwXG4iLCBzZXEpOwogCX0KIAlpZiAoIXNlcSkKIAkJcmV0dXJuIE5VTEw7CiAKLQlhc3NlcnQoc2VxLT50eXBlID09IHR5cGUpOwogCXJldHVybiB0aXBjX25hbWVzZXFfaW5zZXJ0X3B1Ymwoc2VxLCB0eXBlLCBsb3dlciwgdXBwZXIsCiAJCQkJCXNjb3BlLCBub2RlLCBwb3J0LCBrZXkpOwogfQpAQCAtNTcyLDcgKzU5Myw3IEBACiAJaWYgKCFzZXEpCiAJCXJldHVybiBOVUxMOwogCi0JZGJnKCJXaXRoZHJhd2luZyA8JXUsJXU+IGZyb20gJXhcbiIsIHR5cGUsIGxvd2VyLCBub2RlKTsKKwlkYmcoIldpdGhkcmF3aW5nIHsldSwldX0gZnJvbSAweCV4XG4iLCB0eXBlLCBsb3dlciwgbm9kZSk7CiAJcHVibCA9IHRpcGNfbmFtZXNlcV9yZW1vdmVfcHVibChzZXEsIGxvd2VyLCBub2RlLCByZWYsIGtleSk7CiAKIAlpZiAoIXNlcS0+Zmlyc3RfZnJlZSAmJiBsaXN0X2VtcHR5KCZzZXEtPnN1YnNjcmlwdGlvbnMpKSB7CkBAIC03MzgsMTIgKzc1OSwxMiBAQAogCXN0cnVjdCBwdWJsaWNhdGlvbiAqcHVibDsKIAogCWlmICh0YWJsZS5sb2NhbF9wdWJsX2NvdW50ID49IHRpcGNfbWF4X3B1YmxpY2F0aW9ucykgewotCQl3YXJuKCJGYWlsZWQgcHVibGlzaDogbWF4ICV1IGxvY2FsIHB1YmxpY2F0aW9uXG4iLCAKKwkJd2FybigiUHVibGljYXRpb24gZmFpbGVkLCBsb2NhbCBwdWJsaWNhdGlvbiBsaW1pdCByZWFjaGVkICgldSlcbiIsIAogCQkgICAgIHRpcGNfbWF4X3B1YmxpY2F0aW9ucyk7CiAJCXJldHVybiBOVUxMOwogCX0KIAlpZiAoKHR5cGUgPCBUSVBDX1JFU0VSVkVEX1RZUEVTKSAmJiAhYXRvbWljX3JlYWQoJnJzdl9wdWJsX29rKSkgewotCQl3YXJuKCJGYWlsZWQgdG8gcHVibGlzaCByZXNlcnZlZCBuYW1lIDwldSwldSwldT5cbiIsCisJCXdhcm4oIlB1YmxpY2F0aW9uIGZhaWxlZCwgcmVzZXJ2ZWQgbmFtZSB7JXUsJXUsJXV9XG4iLAogCQkgICAgIHR5cGUsIGxvd2VyLCB1cHBlcik7CiAJCXJldHVybiBOVUxMOwogCX0KQEAgLTc2NywxMCArNzg4LDEwIEBACiB7CiAJc3RydWN0IHB1YmxpY2F0aW9uICpwdWJsOwogCi0JZGJnKCJ0aXBjX25hbWV0Ymxfd2l0aGRyYXc6PCVkLCVkLCVkPlxuIiwgdHlwZSwgbG93ZXIsIGtleSk7CisJZGJnKCJ0aXBjX25hbWV0Ymxfd2l0aGRyYXc6IHsldSwldX0sIGtleT0ldVxuIiwgdHlwZSwgbG93ZXIsIGtleSk7CiAJd3JpdGVfbG9ja19iaCgmdGlwY19uYW1ldGJsX2xvY2spOwogCXB1YmwgPSB0aXBjX25hbWV0YmxfcmVtb3ZlX3B1YmwodHlwZSwgbG93ZXIsIHRpcGNfb3duX2FkZHIsIHJlZiwga2V5KTsKLQlpZiAocHVibCkgeworCWlmIChsaWtlbHkocHVibCkpIHsKIAkJdGFibGUubG9jYWxfcHVibF9jb3VudC0tOwogCQlpZiAocHVibC0+c2NvcGUgIT0gVElQQ19OT0RFX1NDT1BFKQogCQkJdGlwY19uYW1lZF93aXRoZHJhdyhwdWJsKTsKQEAgLTc4MCw2ICs4MDEsOSBAQAogCQlyZXR1cm4gMTsKIAl9CiAJd3JpdGVfdW5sb2NrX2JoKCZ0aXBjX25hbWV0YmxfbG9jayk7CisJZXJyKCJVbmFibGUgdG8gcmVtb3ZlIGxvY2FsIHB1YmxpY2F0aW9uXG4iCisJICAgICIodHlwZT0ldSwgbG93ZXI9JXUsIHJlZj0ldSwga2V5PSV1KVxuIiwKKwkgICAgdHlwZSwgbG93ZXIsIHJlZiwga2V5KTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNzg3LDggKzgxMSw3IEBACiAgKiB0aXBjX25hbWV0Ymxfc3Vic2NyaWJlIC0gYWRkIGEgc3Vic2NyaXB0aW9uIG9iamVjdCB0byB0aGUgbmFtZSB0YWJsZQogICovCiAKLXZvaWQKLXRpcGNfbmFtZXRibF9zdWJzY3JpYmUoc3RydWN0IHN1YnNjcmlwdGlvbiAqcykKK3ZvaWQgdGlwY19uYW1ldGJsX3N1YnNjcmliZShzdHJ1Y3Qgc3Vic2NyaXB0aW9uICpzKQogewogCXUzMiB0eXBlID0gcy0+c2VxLnR5cGU7CiAJc3RydWN0IG5hbWVfc2VxICpzZXE7CkBAIC04MDAsMTEgKzgyMywxMyBAQAogCX0KICAgICAgICAgaWYgKHNlcSl7CiAgICAgICAgICAgICAgICAgc3Bpbl9sb2NrX2JoKCZzZXEtPmxvY2spOwotICAgICAgICAgICAgICAgIGRiZygidGlwY19uYW1ldGJsX3N1YnNjcmliZTpmb3VuZCAleCBmb3IgPCV1LCV1LCV1PlxuIiwKKyAgICAgICAgICAgICAgICBkYmcoInRpcGNfbmFtZXRibF9zdWJzY3JpYmU6Zm91bmQgJXAgZm9yIHsldSwldSwldX1cbiIsCiAgICAgICAgICAgICAgICAgICAgIHNlcSwgdHlwZSwgcy0+c2VxLmxvd2VyLCBzLT5zZXEudXBwZXIpOwotICAgICAgICAgICAgICAgIGFzc2VydChzZXEtPnR5cGUgPT0gdHlwZSk7CiAgICAgICAgICAgICAgICAgdGlwY19uYW1lc2VxX3N1YnNjcmliZShzZXEsIHMpOwogICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrX2JoKCZzZXEtPmxvY2spOworICAgICAgICB9IGVsc2UgeworCQl3YXJuKCJGYWlsZWQgdG8gY3JlYXRlIHN1YnNjcmlwdGlvbiBmb3IgeyV1LCV1LCV1fVxuIiwKKwkJICAgICBzLT5zZXEudHlwZSwgcy0+c2VxLmxvd2VyLCBzLT5zZXEudXBwZXIpOwogICAgICAgICB9CiAgICAgICAgIHdyaXRlX3VubG9ja19iaCgmdGlwY19uYW1ldGJsX2xvY2spOwogfQpAQCAtODEzLDggKzgzOCw3IEBACiAgKiB0aXBjX25hbWV0YmxfdW5zdWJzY3JpYmUgLSByZW1vdmUgYSBzdWJzY3JpcHRpb24gb2JqZWN0IGZyb20gbmFtZSB0YWJsZQogICovCiAKLXZvaWQKLXRpcGNfbmFtZXRibF91bnN1YnNjcmliZShzdHJ1Y3Qgc3Vic2NyaXB0aW9uICpzKQordm9pZCB0aXBjX25hbWV0YmxfdW5zdWJzY3JpYmUoc3RydWN0IHN1YnNjcmlwdGlvbiAqcykKIHsKIAlzdHJ1Y3QgbmFtZV9zZXEgKnNlcTsKIApAQCAtMTA0OSwzNSArMTA3MywyMCBAQAogCiB2b2lkIHRpcGNfbmFtZXRibF9zdG9wKHZvaWQpCiB7Ci0Jc3RydWN0IGhsaXN0X2hlYWQgKnNlcV9oZWFkOwotCXN0cnVjdCBobGlzdF9ub2RlICpzZXFfbm9kZTsKLQlzdHJ1Y3QgaGxpc3Rfbm9kZSAqdG1wOwotCXN0cnVjdCBuYW1lX3NlcSAqc2VxOwogCXUzMiBpOwogCiAJaWYgKCF0YWJsZS50eXBlcykKIAkJcmV0dXJuOwogCisJLyogVmVyaWZ5IG5hbWUgdGFibGUgaXMgZW1wdHksIHRoZW4gcmVsZWFzZSBpdCAqLworCiAJd3JpdGVfbG9ja19iaCgmdGlwY19uYW1ldGJsX2xvY2spOwogCWZvciAoaSA9IDA7IGkgPCB0aXBjX25hbWV0Ymxfc2l6ZTsgaSsrKSB7Ci0JCXNlcV9oZWFkID0gJnRhYmxlLnR5cGVzW2ldOwotCQlobGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHNlcSwgc2VxX25vZGUsIHRtcCwgc2VxX2hlYWQsIG5zX2xpc3QpIHsKLQkJCXN0cnVjdCBzdWJfc2VxICpzc2VxID0gc2VxLT5zc2VxczsKLQotCQkJZm9yICg7IHNzZXEgIT0gJnNlcS0+c3NlcXNbc2VxLT5maXJzdF9mcmVlXTsgc3NlcSsrKSB7Ci0JCQkJc3RydWN0IHB1YmxpY2F0aW9uICpwdWJsID0gc3NlcS0+em9uZV9saXN0OwotCQkJCWFzc2VydChwdWJsKTsKLQkJCQlkbyB7Ci0JCQkJCXN0cnVjdCBwdWJsaWNhdGlvbiAqbmV4dCA9Ci0JCQkJCQlwdWJsLT56b25lX2xpc3RfbmV4dDsKLQkJCQkJa2ZyZWUocHVibCk7Ci0JCQkJCXB1YmwgPSBuZXh0OwotCQkJCX0KLQkJCQl3aGlsZSAocHVibCAhPSBzc2VxLT56b25lX2xpc3QpOwotCQkJfQotCQl9CisJCWlmICghaGxpc3RfZW1wdHkoJnRhYmxlLnR5cGVzW2ldKSkKKwkJCWVycigidGlwY19uYW1ldGJsX3N0b3AoKTogaGFzaCBjaGFpbiAldSBpcyBub24tbnVsbFxuIiwgaSk7CiAJfQogCWtmcmVlKHRhYmxlLnR5cGVzKTsKIAl0YWJsZS50eXBlcyA9IE5VTEw7CiAJd3JpdGVfdW5sb2NrX2JoKCZ0aXBjX25hbWV0YmxfbG9jayk7CiB9CisKZGlmZiAtLWdpdCBhL25ldC90aXBjL25vZGUuYyBiL25ldC90aXBjL25vZGUuYwppbmRleCAwZDVkYjA2Li5jZTk2NzhlIDEwMDY0NAotLS0gYS9uZXQvdGlwYy9ub2RlLmMKKysrIGIvbmV0L3RpcGMvbm9kZS5jCkBAIC02MSwzNCArNjEsMzcgQEAKICAgICAgICAgc3RydWN0IG5vZGUgKipjdXJyX25vZGU7CiAKIAluX3B0ciA9IGttYWxsb2Moc2l6ZW9mKCpuX3B0ciksR0ZQX0FUT01JQyk7Ci0gICAgICAgIGlmIChuX3B0ciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgbWVtc2V0KG5fcHRyLCAwLCBzaXplb2YoKm5fcHRyKSk7Ci0gICAgICAgICAgICAgICAgbl9wdHItPmFkZHIgPSBhZGRyOwotICAgICAgICAgICAgICAgIG5fcHRyLT5sb2NrID0gIFNQSU5fTE9DS19VTkxPQ0tFRDsJCi0gICAgICAgICAgICAgICAgSU5JVF9MSVNUX0hFQUQoJm5fcHRyLT5uc3ViKTsKLQkKLQkJY19wdHIgPSB0aXBjX2NsdHJfZmluZChhZGRyKTsKLSAgICAgICAgICAgICAgICBpZiAoY19wdHIgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNfcHRyID0gdGlwY19jbHRyX2NyZWF0ZShhZGRyKTsKLSAgICAgICAgICAgICAgICBpZiAoY19wdHIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbl9wdHItPm93bmVyID0gY19wdHI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aXBjX2NsdHJfYXR0YWNoX25vZGUoY19wdHIsIG5fcHRyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5fcHRyLT5sYXN0X3JvdXRlciA9IC0xOworCWlmICghbl9wdHIpIHsKKwkJd2FybigiTm9kZSBjcmVhdGlvbiBmYWlsZWQsIG5vIG1lbW9yeVxuIik7CisJCXJldHVybiBOVUxMOworCX0KIAotICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5zZXJ0IG5vZGUgaW50byBvcmRlcmVkIGxpc3QgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY3Vycl9ub2RlID0gJnRpcGNfbm9kZXM7ICpjdXJyX25vZGU7IAotCQkJICAgICBjdXJyX25vZGUgPSAmKCpjdXJyX25vZGUpLT5uZXh0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZGRyIDwgKCpjdXJyX25vZGUpLT5hZGRyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbl9wdHItPm5leHQgPSAqY3Vycl9ub2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKmN1cnJfbm9kZSkgPSBuX3B0cjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAga2ZyZWUobl9wdHIpOwotICAgICAgICAgICAgICAgICAgICAgICAgbl9wdHIgPSBOVUxMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQorCWNfcHRyID0gdGlwY19jbHRyX2ZpbmQoYWRkcik7CisJaWYgKCFjX3B0cikgeworCQljX3B0ciA9IHRpcGNfY2x0cl9jcmVhdGUoYWRkcik7CisJfQorCWlmICghY19wdHIpIHsKKwkJa2ZyZWUobl9wdHIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJCQorCW1lbXNldChuX3B0ciwgMCwgc2l6ZW9mKCpuX3B0cikpOworCW5fcHRyLT5hZGRyID0gYWRkcjsKKwluX3B0ci0+bG9jayA9ICBTUElOX0xPQ0tfVU5MT0NLRUQ7CQorCUlOSVRfTElTVF9IRUFEKCZuX3B0ci0+bnN1Yik7CisJbl9wdHItPm93bmVyID0gY19wdHI7CisJdGlwY19jbHRyX2F0dGFjaF9ub2RlKGNfcHRyLCBuX3B0cik7CisJbl9wdHItPmxhc3Rfcm91dGVyID0gLTE7CisKKwkvKiBJbnNlcnQgbm9kZSBpbnRvIG9yZGVyZWQgbGlzdCAqLworCWZvciAoY3Vycl9ub2RlID0gJnRpcGNfbm9kZXM7ICpjdXJyX25vZGU7IAorCSAgICAgY3Vycl9ub2RlID0gJigqY3Vycl9ub2RlKS0+bmV4dCkgeworCQlpZiAoYWRkciA8ICgqY3Vycl9ub2RlKS0+YWRkcikgeworCQkJbl9wdHItPm5leHQgPSAqY3Vycl9ub2RlOworCQkJYnJlYWs7CisJCX0KKwl9CisJKCpjdXJyX25vZGUpID0gbl9wdHI7CiAJcmV0dXJuIG5fcHRyOwogfQogCkBAIC0xMjIsNiArMTI1LDggQEAKIHsKIAlzdHJ1Y3QgbGluayAqKmFjdGl2ZSA9ICZuX3B0ci0+YWN0aXZlX2xpbmtzWzBdOwogCisJbl9wdHItPndvcmtpbmdfbGlua3MrKzsKKwogCWluZm8oIkVzdGFibGlzaGVkIGxpbmsgPCVzPiBvbiBuZXR3b3JrIHBsYW5lICVjXG4iLAogCSAgICAgbF9wdHItPm5hbWUsIGxfcHRyLT5iX3B0ci0+bmV0X3BsYW5lKTsKIAkKQEAgLTEzMiw3ICsxMzcsNyBAQAogCQlyZXR1cm47CiAJfQogCWlmIChsX3B0ci0+cHJpb3JpdHkgPCBhY3RpdmVbMF0tPnByaW9yaXR5KSB7IAotCQlpbmZvKCJMaW5rIGlzIHN0YW5kYnlcbiIpOworCQlpbmZvKCJOZXcgbGluayA8JXM+IGJlY29tZXMgc3RhbmRieVxuIiwgbF9wdHItPm5hbWUpOwogCQlyZXR1cm47CiAJfQogCXRpcGNfbGlua19zZW5kX2R1cGxpY2F0ZShhY3RpdmVbMF0sIGxfcHRyKTsKQEAgLTE0MCw4ICsxNDUsOSBAQAogCQlhY3RpdmVbMF0gPSBsX3B0cjsKIAkJcmV0dXJuOwogCX0KLQlpbmZvKCJMaW5rIDwlcz4gb24gbmV0d29yayBwbGFuZSAlYyBiZWNvbWVzIHN0YW5kYnlcbiIsCi0JICAgICBhY3RpdmVbMF0tPm5hbWUsIGFjdGl2ZVswXS0+Yl9wdHItPm5ldF9wbGFuZSk7CisJaW5mbygiT2xkIGxpbmsgPCVzPiBiZWNvbWVzIHN0YW5kYnlcbiIsIGFjdGl2ZVswXS0+bmFtZSk7CisJaWYgKGFjdGl2ZVsxXSAhPSBhY3RpdmVbMF0pCisJCWluZm8oIk9sZCBsaW5rIDwlcz4gYmVjb21lcyBzdGFuZGJ5XG4iLCBhY3RpdmVbMV0tPm5hbWUpOwogCWFjdGl2ZVswXSA9IGFjdGl2ZVsxXSA9IGxfcHRyOwogfQogCkBAIC0xODEsNiArMTg3LDggQEAKIHsKIAlzdHJ1Y3QgbGluayAqKmFjdGl2ZTsKIAorCW5fcHRyLT53b3JraW5nX2xpbmtzLS07CisKIAlpZiAoIXRpcGNfbGlua19pc19hY3RpdmUobF9wdHIpKSB7CiAJCWluZm8oIkxvc3Qgc3RhbmRieSBsaW5rIDwlcz4gb24gbmV0d29yayBwbGFuZSAlY1xuIiwKIAkJICAgICBsX3B0ci0+bmFtZSwgbF9wdHItPmJfcHRyLT5uZXRfcGxhbmUpOwpAQCAtMjEwLDggKzIxOCw3IEBACiAKIGludCB0aXBjX25vZGVfaGFzX3JlZHVuZGFudF9saW5rcyhzdHJ1Y3Qgbm9kZSAqbl9wdHIpCiB7Ci0JcmV0dXJuICh0aXBjX25vZGVfaGFzX2FjdGl2ZV9saW5rcyhuX3B0cikgJiYKLQkJKG5fcHRyLT5hY3RpdmVfbGlua3NbMF0gIT0gbl9wdHItPmFjdGl2ZV9saW5rc1sxXSkpOworCXJldHVybiAobl9wdHItPndvcmtpbmdfbGlua3MgPiAxKTsKIH0KIAogc3RhdGljIGludCB0aXBjX25vZGVfaGFzX2FjdGl2ZV9yb3V0ZXMoc3RydWN0IG5vZGUgKm5fcHRyKQpAQCAtMjM0LDcgKzI0MSw2IEBACiAJCXUzMiBiZWFyZXJfaWQgPSBsX3B0ci0+Yl9wdHItPmlkZW50aXR5OwogCQljaGFyIGFkZHJfc3RyaW5nWzE2XTsKIAotICAgICAgICAgICAgICAgIGFzc2VydChiZWFyZXJfaWQgPCBNQVhfQkVBUkVSUyk7CiAgICAgICAgICAgICAgICAgaWYgKG5fcHRyLT5saW5rX2NudCA+PSAyKSB7CiAJCQljaGFyIGFkZHJfc3RyaW5nWzE2XTsKIApAQCAtMjQ5LDcgKzI1NSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBuX3B0ci0+bGlua19jbnQrKzsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuX3B0cjsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZXJyKCJBdHRlbXB0IHRvIGVzdGFibGlzaCBzZWNvbmQgbGluayBvbiA8JXM+IHRvIDwlcz4gXG4iLAorICAgICAgICAgICAgICAgIGVycigiQXR0ZW1wdCB0byBlc3RhYmxpc2ggc2Vjb25kIGxpbmsgb24gPCVzPiB0byAlcyBcbiIsCiAgICAgICAgICAgICAgICAgICAgIGxfcHRyLT5iX3B0ci0+cHVibC5uYW1lLCAKIAkJICAgIGFkZHJfc3RyaW5nX2ZpbGwoYWRkcl9zdHJpbmcsIGxfcHRyLT5hZGRyKSk7CiAgICAgICAgIH0KQEAgLTMxNCw3ICszMjAsNyBAQAogCXN0cnVjdCBjbHVzdGVyICpjX3B0cjsKIAogCWRiZygibm9kZV9lc3RhYmxpc2hlZF9jb250YWN0Oi0+ICV4XG4iLCBuX3B0ci0+YWRkcik7Ci0JaWYgKCF0aXBjX25vZGVfaGFzX2FjdGl2ZV9yb3V0ZXMobl9wdHIpKSB7IAorCWlmICghdGlwY19ub2RlX2hhc19hY3RpdmVfcm91dGVzKG5fcHRyKSAmJiBpbl9vd25fY2x1c3RlcihuX3B0ci0+YWRkcikpIHsgCiAJCXRpcGNfa19zaWduYWwoKEhhbmRsZXIpdGlwY19uYW1lZF9ub2RlX3VwLCBuX3B0ci0+YWRkcik7CiAJfQogCmRpZmYgLS1naXQgYS9uZXQvdGlwYy9ub2RlLmggYi9uZXQvdGlwYy9ub2RlLmgKaW5kZXggNzgxMTI2ZS4uYTA3Y2M3OSAxMDA2NDQKLS0tIGEvbmV0L3RpcGMvbm9kZS5oCisrKyBiL25ldC90aXBjL25vZGUuaApAQCAtNTEsNiArNTEsNyBAQAogICogQG5zdWI6IGxpc3Qgb2YgIm5vZGUgZG93biIgc3Vic2NyaXB0aW9ucyBtb25pdG9yaW5nIG5vZGUKICAqIEBhY3RpdmVfbGlua3M6IHBvaW50ZXJzIHRvIGFjdGl2ZSBsaW5rcyB0byBub2RlCiAgKiBAbGlua3M6IHBvaW50ZXJzIHRvIGFsbCBsaW5rcyB0byBub2RlCisgKiBAd29ya2luZ19saW5rczogbnVtYmVyIG9mIHdvcmtpbmcgbGlua3MgdG8gbm9kZSAoYm90aCBhY3RpdmUgYW5kIHN0YW5kYnkpCiAgKiBAbGlua19jbnQ6IG51bWJlciBvZiBsaW5rcyB0byBub2RlCiAgKiBAcGVybWl0X2NoYW5nZW92ZXI6IG5vbi16ZXJvIGlmIG5vZGUgaGFzIHJlZHVuZGFudCBsaW5rcyB0byB0aGlzIHN5c3RlbQogICogQHJvdXRlcnM6IGJpdG1hcCAodXNlZCBmb3IgbXVsdGljbHVzdGVyIGNvbW11bmljYXRpb24pCkBAIC03Niw2ICs3Nyw3IEBACiAJc3RydWN0IGxpbmsgKmFjdGl2ZV9saW5rc1syXTsKIAlzdHJ1Y3QgbGluayAqbGlua3NbTUFYX0JFQVJFUlNdOwogCWludCBsaW5rX2NudDsKKwlpbnQgd29ya2luZ19saW5rczsKIAlpbnQgcGVybWl0X2NoYW5nZW92ZXI7CiAJdTMyIHJvdXRlcnNbNTEyLzMyXTsKIAlpbnQgbGFzdF9yb3V0ZXI7CmRpZmYgLS1naXQgYS9uZXQvdGlwYy9ub2RlX3N1YnNjci5jIGIvbmV0L3RpcGMvbm9kZV9zdWJzY3IuYwppbmRleCBjZmY0MDY4Li5jYzNmZmYzIDEwMDY0NAotLS0gYS9uZXQvdGlwYy9ub2RlX3N1YnNjci5jCisrKyBiL25ldC90aXBjL25vZGVfc3Vic2NyLmMKQEAgLTQ3LDE4ICs0NywxOSBAQAogdm9pZCB0aXBjX25vZGVzdWJfc3Vic2NyaWJlKHN0cnVjdCBub2RlX3N1YnNjciAqbm9kZV9zdWIsIHUzMiBhZGRyLCAKIAkJICAgICAgIHZvaWQgKnVzcl9oYW5kbGUsIG5ldF9ldl9oYW5kbGVyIGhhbmRsZV9kb3duKQogewotCW5vZGVfc3ViLT5ub2RlID0gTlVMTDsKLQlpZiAoYWRkciA9PSB0aXBjX293bl9hZGRyKQotCQlyZXR1cm47Ci0JaWYgKCF0aXBjX2FkZHJfbm9kZV92YWxpZChhZGRyKSkgewotCQl3YXJuKCJub2RlX3N1YnNjciB3aXRoIGlsbGVnYWwgJXhcbiIsIGFkZHIpOworCWlmIChhZGRyID09IHRpcGNfb3duX2FkZHIpIHsKKwkJbm9kZV9zdWItPm5vZGUgPSBOVUxMOwogCQlyZXR1cm47CiAJfQotCisJCisJbm9kZV9zdWItPm5vZGUgPSB0aXBjX25vZGVfZmluZChhZGRyKTsKKwlpZiAoIW5vZGVfc3ViLT5ub2RlKSB7CisJCXdhcm4oIk5vZGUgc3Vic2NyaXB0aW9uIHJlamVjdGVkLCB1bmtub3duIG5vZGUgMHgleFxuIiwgYWRkcik7CisJCXJldHVybjsKKwl9CiAJbm9kZV9zdWItPmhhbmRsZV9ub2RlX2Rvd24gPSBoYW5kbGVfZG93bjsKIAlub2RlX3N1Yi0+dXNyX2hhbmRsZSA9IHVzcl9oYW5kbGU7Ci0Jbm9kZV9zdWItPm5vZGUgPSB0aXBjX25vZGVfZmluZChhZGRyKTsKLQlhc3NlcnQobm9kZV9zdWItPm5vZGUpOworCiAJdGlwY19ub2RlX2xvY2sobm9kZV9zdWItPm5vZGUpOwogCWxpc3RfYWRkX3RhaWwoJm5vZGVfc3ViLT5ub2Rlc3ViX2xpc3QsICZub2RlX3N1Yi0+bm9kZS0+bnN1Yik7CiAJdGlwY19ub2RlX3VubG9jayhub2RlX3N1Yi0+bm9kZSk7CmRpZmYgLS1naXQgYS9uZXQvdGlwYy9wb3J0LmMgYi9uZXQvdGlwYy9wb3J0LmMKaW5kZXggNjdlOTZjYi4uNDdkOTc0MCAxMDA2NDQKLS0tIGEvbmV0L3RpcGMvcG9ydC5jCisrKyBiL25ldC90aXBjL3BvcnQuYwpAQCAtMTY4LDcgKzE2OCw2IEBACiAJc3RydWN0IHBvcnRfbGlzdCAqaXRlbSA9IGRwOwogCWludCBjbnQgPSAwOwogCi0JYXNzZXJ0KGJ1Zik7CiAJbXNnID0gYnVmX21zZyhidWYpOwogCiAJLyogQ3JlYXRlIGRlc3RpbmF0aW9uIHBvcnQgbGlzdCwgaWYgb25lIHdhc24ndCBzdXBwbGllZCAqLwpAQCAtMTk2LDcgKzE5NSw3IEBACiAJCQlzdHJ1Y3Qgc2tfYnVmZiAqYiA9IHNrYl9jbG9uZShidWYsIEdGUF9BVE9NSUMpOwogCiAJCQlpZiAoYiA9PSBOVUxMKSB7Ci0JCQkJd2FybigiQnVmZmVyIGFsbG9jYXRpb24gZmFpbHVyZVxuIik7CisJCQkJd2FybigiVW5hYmxlIHRvIGRlbGl2ZXIgbXVsdGljYXN0IG1lc3NhZ2UocylcbiIpOwogCQkJCW1zZ19kYmcobXNnLCAiTE9TVDoiKTsKIAkJCQlnb3RvIGV4aXQ7CiAJCQl9CkBAIC0yMjgsMTQgKzIyNywxNCBAQAogCXUzMiByZWY7CiAKIAlwX3B0ciA9IGttYWxsb2Moc2l6ZW9mKCpwX3B0ciksIEdGUF9BVE9NSUMpOwotCWlmIChwX3B0ciA9PSBOVUxMKSB7Ci0JCXdhcm4oIk1lbW9yeSBzcXVlZXplOyBmYWlsZWQgdG8gY3JlYXRlIHBvcnRcbiIpOworCWlmICghcF9wdHIpIHsKKwkJd2FybigiUG9ydCBjcmVhdGlvbiBmYWlsZWQsIG5vIG1lbW9yeVxuIik7CiAJCXJldHVybiAwOwogCX0KIAltZW1zZXQocF9wdHIsIDAsIHNpemVvZigqcF9wdHIpKTsKIAlyZWYgPSB0aXBjX3JlZl9hY3F1aXJlKHBfcHRyLCAmcF9wdHItPnB1YmwubG9jayk7CiAJaWYgKCFyZWYpIHsKLQkJd2FybigiUmVmZXJlbmNlIFRhYmxlIEV4aGF1c3RlZFxuIik7CisJCXdhcm4oIlBvcnQgY3JlYXRpb24gZmFpbGVkLCByZWZlcmVuY2UgdGFibGUgZXhoYXVzdGVkXG4iKTsKIAkJa2ZyZWUocF9wdHIpOwogCQlyZXR1cm4gMDsKIAl9CkBAIC04MTAsMTggKzgwOSwyMCBAQAogCQl2b2lkICp1c3JfaGFuZGxlOwogCQlpbnQgY29ubmVjdGVkOwogCQlpbnQgcHVibGlzaGVkOworCQl1MzIgbWVzc2FnZV90eXBlOwogCiAJCXN0cnVjdCBza19idWZmICpuZXh0ID0gYnVmLT5uZXh0OwogCQlzdHJ1Y3QgdGlwY19tc2cgKm1zZyA9IGJ1Zl9tc2coYnVmKTsKIAkJdTMyIGRyZWYgPSBtc2dfZGVzdHBvcnQobXNnKTsKIAkJCisJCW1lc3NhZ2VfdHlwZSA9IG1zZ190eXBlKG1zZyk7CisJCWlmIChtZXNzYWdlX3R5cGUgPiBUSVBDX0RJUkVDVF9NU0cpCisJCQlnb3RvIHJlamVjdDsJLyogVW5zdXBwb3J0ZWQgbWVzc2FnZSB0eXBlICovCisKIAkJcF9wdHIgPSB0aXBjX3BvcnRfbG9jayhkcmVmKTsKLQkJaWYgKCFwX3B0cikgewotCQkJLyogUG9ydCBkZWxldGVkIHdoaWxlIG1zZyBpbiBxdWV1ZSAqLwotCQkJdGlwY19yZWplY3RfbXNnKGJ1ZiwgVElQQ19FUlJfTk9fUE9SVCk7Ci0JCQlidWYgPSBuZXh0OwotCQkJY29udGludWU7Ci0JCX0KKwkJaWYgKCFwX3B0cikKKwkJCWdvdG8gcmVqZWN0OwkvKiBQb3J0IGRlbGV0ZWQgd2hpbGUgbXNnIGluIHF1ZXVlICovCisKIAkJb3JpZy5yZWYgPSBtc2dfb3JpZ3BvcnQobXNnKTsKIAkJb3JpZy5ub2RlID0gbXNnX29yaWdub2RlKG1zZyk7CiAJCXVwX3B0ciA9IHBfcHRyLT51c2VyX3BvcnQ7CkBAIC04MzIsNyArODMzLDcgQEAKIAkJaWYgKHVubGlrZWx5KG1zZ19lcnJjb2RlKG1zZykpKQogCQkJZ290byBlcnI7CiAKLQkJc3dpdGNoIChtc2dfdHlwZShtc2cpKSB7CisJCXN3aXRjaCAobWVzc2FnZV90eXBlKSB7CiAJCQogCQljYXNlIFRJUENfQ09OTl9NU0c6ewogCQkJCXRpcGNfY29ubl9tc2dfZXZlbnQgY2IgPSB1cF9wdHItPmNvbm5fbXNnX2NiOwpAQCAtODc0LDYgKzg3NSw3IEBACiAJCQkJICAgJm9yaWcpOwogCQkJCWJyZWFrOwogCQkJfQorCQljYXNlIFRJUENfTUNBU1RfTVNHOgogCQljYXNlIFRJUENfTkFNRURfTVNHOnsKIAkJCQl0aXBjX25hbWVkX21zZ19ldmVudCBjYiA9IHVwX3B0ci0+bmFtZWRfbXNnX2NiOwogCkBAIC04ODYsNyArODg4LDggQEAKIAkJCQkJZ290byByZWplY3Q7CiAJCQkJZHNlcS50eXBlID0gIG1zZ19uYW1ldHlwZShtc2cpOwogCQkJCWRzZXEubG93ZXIgPSBtc2dfbmFtZWluc3QobXNnKTsKLQkJCQlkc2VxLnVwcGVyID0gZHNlcS5sb3dlcjsKKwkJCQlkc2VxLnVwcGVyID0gKG1lc3NhZ2VfdHlwZSA9PSBUSVBDX05BTUVEX01TRykKKwkJCQkJPyBkc2VxLmxvd2VyIDogbXNnX25hbWV1cHBlcihtc2cpOwogCQkJCXNrYl9wdWxsKGJ1ZiwgbXNnX2hkcl9zeihtc2cpKTsKIAkJCQljYih1c3JfaGFuZGxlLCBkcmVmLCAmYnVmLCBtc2dfZGF0YShtc2cpLCAKIAkJCQkgICBtc2dfZGF0YV9zeihtc2cpLCBtc2dfaW1wb3J0YW5jZShtc2cpLApAQCAtODk5LDcgKzkwMiw3IEBACiAJCWJ1ZiA9IG5leHQ7CiAJCWNvbnRpbnVlOwogZXJyOgotCQlzd2l0Y2ggKG1zZ190eXBlKG1zZykpIHsKKwkJc3dpdGNoIChtZXNzYWdlX3R5cGUpIHsKIAkJCiAJCWNhc2UgVElQQ19DT05OX01TRzp7CiAJCQkJdGlwY19jb25uX3NodXRkb3duX2V2ZW50IGNiID0gCkBAIC05MzEsNiArOTM0LDcgQEAKIAkJCQkgICBtc2dfZGF0YV9zeihtc2cpLCBtc2dfZXJyY29kZShtc2cpLCAmb3JpZyk7CiAJCQkJYnJlYWs7CiAJCQl9CisJCWNhc2UgVElQQ19NQ0FTVF9NU0c6CiAJCWNhc2UgVElQQ19OQU1FRF9NU0c6ewogCQkJCXRpcGNfbmFtZWRfbXNnX2Vycl9ldmVudCBjYiA9IAogCQkJCQl1cF9wdHItPm5hbWVkX2Vycl9jYjsKQEAgLTk0MCw3ICs5NDQsOCBAQAogCQkJCQlicmVhazsKIAkJCQlkc2VxLnR5cGUgPSAgbXNnX25hbWV0eXBlKG1zZyk7CiAJCQkJZHNlcS5sb3dlciA9IG1zZ19uYW1laW5zdChtc2cpOwotCQkJCWRzZXEudXBwZXIgPSBkc2VxLmxvd2VyOworCQkJCWRzZXEudXBwZXIgPSAobWVzc2FnZV90eXBlID09IFRJUENfTkFNRURfTVNHKQorCQkJCQk/IGRzZXEubG93ZXIgOiBtc2dfbmFtZXVwcGVyKG1zZyk7CiAJCQkJc2tiX3B1bGwoYnVmLCBtc2dfaGRyX3N6KG1zZykpOwogCQkJCWNiKHVzcl9oYW5kbGUsIGRyZWYsICZidWYsIG1zZ19kYXRhKG1zZyksIAogCQkJCSAgIG1zZ19kYXRhX3N6KG1zZyksIG1zZ19lcnJjb2RlKG1zZyksICZkc2VxKTsKQEAgLTEwNTQsNyArMTA1OSw4IEBACiAJdTMyIHJlZjsKIAogCXVwX3B0ciA9IChzdHJ1Y3QgdXNlcl9wb3J0ICopa21hbGxvYyhzaXplb2YoKnVwX3B0ciksIEdGUF9BVE9NSUMpOwotCWlmICh1cF9wdHIgPT0gTlVMTCkgeworCWlmICghdXBfcHRyKSB7CisJCXdhcm4oIlBvcnQgY3JlYXRpb24gZmFpbGVkLCBubyBtZW1vcnlcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJcmVmID0gdGlwY19jcmVhdGVwb3J0X3JhdyhOVUxMLCBwb3J0X2Rpc3BhdGNoZXIsIHBvcnRfd2FrZXVwLCBpbXBvcnRhbmNlKTsKQEAgLTExNjUsOCArMTE3MSw2IEBACiAJcF9wdHIgPSB0aXBjX3BvcnRfbG9jayhyZWYpOwogCWlmICghcF9wdHIpCiAJCXJldHVybiAtRUlOVkFMOwotCWlmICghcF9wdHItPnB1YmwucHVibGlzaGVkKQotCQlnb3RvIGV4aXQ7CiAJaWYgKCFzZXEpIHsKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHB1YmwsIHRwdWJsLCAKIAkJCQkJICZwX3B0ci0+cHVibGljYXRpb25zLCBwcG9ydF9saXN0KSB7CkBAIC0xMTkzLDcgKzExOTcsNiBAQAogCX0KIAlpZiAobGlzdF9lbXB0eSgmcF9wdHItPnB1YmxpY2F0aW9ucykpCiAJCXBfcHRyLT5wdWJsLnB1Ymxpc2hlZCA9IDA7Ci1leGl0OgogCXRpcGNfcG9ydF91bmxvY2socF9wdHIpOwogCXJldHVybiByZXM7CiB9CmRpZmYgLS1naXQgYS9uZXQvdGlwYy9yZWYuYyBiL25ldC90aXBjL3JlZi5jCmluZGV4IDMzYmJmNTAuLmQyZjBjY2UgMTAwNjQ0Ci0tLSBhL25ldC90aXBjL3JlZi5jCisrKyBiL25ldC90aXBjL3JlZi5jCkBAIC0xMjcsNyArMTI3LDE0IEBACiAJdTMyIG5leHRfcGx1c191cHBlcjsKIAl1MzIgcmVmZXJlbmNlID0gMDsKIAotCWFzc2VydCh0aXBjX3JlZl90YWJsZS5lbnRyaWVzICYmIG9iamVjdCk7CisJaWYgKCFvYmplY3QpIHsKKwkJZXJyKCJBdHRlbXB0IHRvIGFjcXVpcmUgcmVmZXJlbmNlIHRvIG5vbi1leGlzdGVudCBvYmplY3RcbiIpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCF0aXBjX3JlZl90YWJsZS5lbnRyaWVzKSB7CisJCWVycigiUmVmZXJlbmNlIHRhYmxlIG5vdCBmb3VuZCBkdXJpbmcgYWNxdWlzaXRpb24gYXR0ZW1wdFxuIik7CisJCXJldHVybiAwOworCX0KIAogCXdyaXRlX2xvY2tfYmgoJnJlZl90YWJsZV9sb2NrKTsKIAlpZiAodGlwY19yZWZfdGFibGUuZmlyc3RfZnJlZSkgewpAQCAtMTYyLDE1ICsxNjksMjggQEAKIAl1MzIgaW5kZXg7IAogCXUzMiBpbmRleF9tYXNrOwogCi0JYXNzZXJ0KHRpcGNfcmVmX3RhYmxlLmVudHJpZXMpOwotCWFzc2VydChyZWYgIT0gMCk7CisJaWYgKCFyZWYpIHsKKwkJZXJyKCJBdHRlbXB0IHRvIGRpc2NhcmQgcmVmZXJlbmNlIDBcbiIpOworCQlyZXR1cm47CisJfQorCWlmICghdGlwY19yZWZfdGFibGUuZW50cmllcykgeworCQllcnIoIlJlZmVyZW5jZSB0YWJsZSBub3QgZm91bmQgZHVyaW5nIGRpc2NhcmQgYXR0ZW1wdFxuIik7CisJCXJldHVybjsKKwl9CiAKIAl3cml0ZV9sb2NrX2JoKCZyZWZfdGFibGVfbG9jayk7CiAJaW5kZXhfbWFzayA9IHRpcGNfcmVmX3RhYmxlLmluZGV4X21hc2s7CiAJaW5kZXggPSByZWYgJiBpbmRleF9tYXNrOwogCWVudHJ5ID0gJih0aXBjX3JlZl90YWJsZS5lbnRyaWVzW2luZGV4XSk7Ci0JYXNzZXJ0KGVudHJ5LT5vYmplY3QgIT0gMCk7Ci0JYXNzZXJ0KGVudHJ5LT5kYXRhLnJlZmVyZW5jZSA9PSByZWYpOworCisJaWYgKCFlbnRyeS0+b2JqZWN0KSB7CisJCWVycigiQXR0ZW1wdCB0byBkaXNjYXJkIHJlZmVyZW5jZSB0byBub24tZXhpc3RlbnQgb2JqZWN0XG4iKTsKKwkJZ290byBleGl0OworCX0KKwlpZiAoZW50cnktPmRhdGEucmVmZXJlbmNlICE9IHJlZikgeworCQllcnIoIkF0dGVtcHQgdG8gZGlzY2FyZCBub24tZXhpc3RlbnQgcmVmZXJlbmNlXG4iKTsKKwkJZ290byBleGl0OworCX0KIAogCS8qIG1hcmsgZW50cnkgYXMgdW51c2VkICovCiAJZW50cnktPm9iamVjdCA9IE5VTEw7CkBAIC0xODQsNiArMjA0LDcgQEAKIAogCS8qIGluY3JlbWVudCB1cHBlciBiaXRzIG9mIGVudHJ5IHRvIGludmFsaWRhdGUgc3Vic2VxdWVudCByZWZlcmVuY2VzICovCiAJZW50cnktPmRhdGEubmV4dF9wbHVzX3VwcGVyID0gKHJlZiAmIH5pbmRleF9tYXNrKSArIChpbmRleF9tYXNrICsgMSk7CitleGl0OgogCXdyaXRlX3VubG9ja19iaCgmcmVmX3RhYmxlX2xvY2spOwogfQogCmRpZmYgLS1naXQgYS9uZXQvdGlwYy9zb2NrZXQuYyBiL25ldC90aXBjL3NvY2tldC5jCmluZGV4IDY0OGE3MzQuLjMyZDc3ODQgMTAwNjQ0Ci0tLSBhL25ldC90aXBjL3NvY2tldC5jCisrKyBiL25ldC90aXBjL3NvY2tldC5jCkBAIC0xNjksMTIgKzE2OSw2IEBACiAJc3RydWN0IHNvY2sgKnNrOwogICAgICAgICB1MzIgcmVmOwogCi0JaWYgKChzb2NrLT50eXBlICE9IFNPQ0tfU1RSRUFNKSAmJiAKLQkgICAgKHNvY2stPnR5cGUgIT0gU09DS19TRVFQQUNLRVQpICYmCi0JICAgIChzb2NrLT50eXBlICE9IFNPQ0tfREdSQU0pICYmCi0JICAgIChzb2NrLT50eXBlICE9IFNPQ0tfUkRNKSkKLQkJcmV0dXJuIC1FUFJPVE9UWVBFOwotCiAJaWYgKHVubGlrZWx5KHByb3RvY29sICE9IDApKQogCQlyZXR1cm4gLUVQUk9UT05PU1VQUE9SVDsKIApAQCAtMTk5LDYgKzE5Myw5IEBACiAJCXNvY2stPm9wcyA9ICZtc2dfb3BzOwogCQlzb2NrLT5zdGF0ZSA9IFNTX1JFQURZOwogCQlicmVhazsKKwlkZWZhdWx0OgorCQl0aXBjX2RlbGV0ZXBvcnQocmVmKTsKKwkJcmV0dXJuIC1FUFJPVE9UWVBFOwogCX0KIAogCXNrID0gc2tfYWxsb2MoQUZfVElQQywgR0ZQX0tFUk5FTCwgJnRpcGNfcHJvdG8sIDEpOwpAQCAtNDI2LDcgKzQyMyw3IEBACiAKICAgICAgICAgaWYgKGNvcHlfZnJvbV91c2VyKCZoZHIsIG0tPm1zZ19pb3ZbMF0uaW92X2Jhc2UsIHNpemVvZihoZHIpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7Ci0JaWYgKChudG9ocyhoZHIudGNtX3R5cGUpICYgMHhDMDAwKSAmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkpCisJaWYgKChudG9ocyhoZHIudGNtX3R5cGUpICYgMHhDMDAwKSAmJiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpKQogCQlyZXR1cm4gLUVBQ0NFUzsKICAgICAgICAgCiAJcmV0dXJuIDA7CkBAIC00MzcsNyArNDM0LDcgQEAKICAqIEBpb2NiOiAodW51c2VkKQogICogQHNvY2s6IHNvY2tldCBzdHJ1Y3R1cmUKICAqIEBtOiBtZXNzYWdlIHRvIHNlbmQKLSAqIEB0b3RhbF9sZW46ICh1bnVzZWQpCisgKiBAdG90YWxfbGVuOiBsZW5ndGggb2YgbWVzc2FnZQogICogCiAgKiBNZXNzYWdlIG11c3QgaGF2ZSBhbiBkZXN0aW5hdGlvbiBzcGVjaWZpZWQgZXhwbGljaXRseS4KICAqIFVzZWQgZm9yIFNPQ0tfUkRNIGFuZCBTT0NLX0RHUkFNIG1lc3NhZ2VzLCAKQEAgLTQ1OCw3ICs0NTUsOCBAQAogCiAJaWYgKHVubGlrZWx5KCFkZXN0KSkKIAkJcmV0dXJuIC1FREVTVEFERFJSRVE7Ci0JaWYgKHVubGlrZWx5KGRlc3QtPmZhbWlseSAhPSBBRl9USVBDKSkKKwlpZiAodW5saWtlbHkoKG0tPm1zZ19uYW1lbGVuIDwgc2l6ZW9mKCpkZXN0KSkgfHwKKwkJICAgICAoZGVzdC0+ZmFtaWx5ICE9IEFGX1RJUEMpKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAluZWVkc19jb25uID0gKHNvY2stPnN0YXRlICE9IFNTX1JFQURZKTsKQEAgLTQ3MCw2ICs0NjgsMTAgQEAKIAkJaWYgKCh0c29jay0+cC0+cHVibGlzaGVkKSB8fAogCQkgICAgKChzb2NrLT50eXBlID09IFNPQ0tfU1RSRUFNKSAmJiAodG90YWxfbGVuICE9IDApKSkKIAkJCXJldHVybiAtRU9QTk9UU1VQUDsKKwkJaWYgKGRlc3QtPmFkZHJ0eXBlID09IFRJUENfQUREUl9OQU1FKSB7CisJCQl0c29jay0+cC0+Y29ubl90eXBlID0gZGVzdC0+YWRkci5uYW1lLm5hbWUudHlwZTsKKwkJCXRzb2NrLT5wLT5jb25uX2luc3RhbmNlID0gZGVzdC0+YWRkci5uYW1lLm5hbWUuaW5zdGFuY2U7CisJCX0KIAl9CiAKIAlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZ0c29jay0+c2VtKSkKQEAgLTUzOCw3ICs1NDAsNyBAQAogICogQGlvY2I6ICh1bnVzZWQpCiAgKiBAc29jazogc29ja2V0IHN0cnVjdHVyZQogICogQG06IG1lc3NhZ2UgdG8gc2VuZAotICogQHRvdGFsX2xlbjogKHVudXNlZCkKKyAqIEB0b3RhbF9sZW46IGxlbmd0aCBvZiBtZXNzYWdlCiAgKiAKICAqIFVzZWQgZm9yIFNPQ0tfU0VRUEFDS0VUIG1lc3NhZ2VzIGFuZCBTT0NLX1NUUkVBTSBkYXRhLgogICogCkBAIC01NjEsMTUgKzU2MywxNSBAQAogCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKHVubGlrZWx5KHNvY2stPnN0YXRlICE9IFNTX0NPTk5FQ1RFRCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoc29jay0+c3RhdGUgPT0gU1NfRElTQ09OTkVDVElORykKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IC1FUElQRTsgICAKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICByZXMgPSAtRU5PVENPTk47Ci0gICAgICAgICAgICAgICAgZ290byBleGl0OwotICAgICAgICB9Ci0KICAgICAgICAgZG8geworCQlpZiAodW5saWtlbHkoc29jay0+c3RhdGUgIT0gU1NfQ09OTkVDVEVEKSkgeworCQkJaWYgKHNvY2stPnN0YXRlID09IFNTX0RJU0NPTk5FQ1RJTkcpCisJCQkJcmVzID0gLUVQSVBFOyAgIAorCQkJZWxzZQorCQkJCXJlcyA9IC1FTk9UQ09OTjsKKwkJCWdvdG8gZXhpdDsKKwkJfQorCiAgICAgICAgICAgICAgICAgcmVzID0gdGlwY19zZW5kKHRzb2NrLT5wLT5yZWYsIG0tPm1zZ19pb3ZsZW4sIG0tPm1zZ19pb3YpOwogICAgICAgICAgICAgICAgIGlmIChsaWtlbHkocmVzICE9IC1FTElOS0NPTkcpKSB7CiBleGl0OgpAQCAtNTk3LDcgKzU5OSw4IEBACiAgKiAKICAqIFVzZWQgZm9yIFNPQ0tfU1RSRUFNIGRhdGEuCiAgKiAKLSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBzZW50IG9uIHN1Y2Nlc3MsIG9yIGVycm5vIG90aGVyd2lzZQorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHNlbnQgb24gc3VjY2VzcyAob3IgcGFydGlhbCBzdWNjZXNzKSwgCisgKiBvciBlcnJubyBpZiBubyBkYXRhIHNlbnQKICAqLwogCiAKQEAgLTYxMSw2ICs2MTQsNyBAQAogCWNoYXIgX191c2VyICpjdXJyX3N0YXJ0OwogCWludCBjdXJyX2xlZnQ7CiAJaW50IGJ5dGVzX3RvX3NlbmQ7CisJaW50IGJ5dGVzX3NlbnQ7CiAJaW50IHJlczsKIAkKIAlpZiAobGlrZWx5KHRvdGFsX2xlbiA8PSBUSVBDX01BWF9VU0VSX01TR19TSVpFKSkKQEAgLTYzMywxMSArNjM3LDExIEBACiAJICogb2Ygc21hbGwgaW92ZWMgZW50cmllcyBpbnRvIHNlbmRfcGFja2V0KCkuCiAJICovCiAKLQlteV9tc2cgPSAqbTsKLQljdXJyX2lvdiA9IG15X21zZy5tc2dfaW92OwotCWN1cnJfaW92bGVuID0gbXlfbXNnLm1zZ19pb3ZsZW47CisJY3Vycl9pb3YgPSBtLT5tc2dfaW92OworCWN1cnJfaW92bGVuID0gbS0+bXNnX2lvdmxlbjsKIAlteV9tc2cubXNnX2lvdiA9ICZteV9pb3Y7CiAJbXlfbXNnLm1zZ19pb3ZsZW4gPSAxOworCWJ5dGVzX3NlbnQgPSAwOwogCiAJd2hpbGUgKGN1cnJfaW92bGVuLS0pIHsKIAkJY3Vycl9zdGFydCA9IGN1cnJfaW92LT5pb3ZfYmFzZTsKQEAgLTY0OCwxNiArNjUyLDE4IEBACiAJCQkJPyBjdXJyX2xlZnQgOiBUSVBDX01BWF9VU0VSX01TR19TSVpFOwogCQkJbXlfaW92Lmlvdl9iYXNlID0gY3Vycl9zdGFydDsKIAkJCW15X2lvdi5pb3ZfbGVuID0gYnl0ZXNfdG9fc2VuZDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocmVzID0gc2VuZF9wYWNrZXQoaW9jYiwgc29jaywgJm15X21zZywgMCkpIDwgMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocmVzID0gc2VuZF9wYWNrZXQoaW9jYiwgc29jaywgJm15X21zZywgMCkpIDwgMCkgeworCQkJCXJldHVybiBieXRlc19zZW50ID8gYnl0ZXNfc2VudCA6IHJlczsKKwkJCX0KIAkJCWN1cnJfbGVmdCAtPSBieXRlc190b19zZW5kOwogCQkJY3Vycl9zdGFydCArPSBieXRlc190b19zZW5kOworCQkJYnl0ZXNfc2VudCArPSBieXRlc190b19zZW5kOwogCQl9CiAKIAkJY3Vycl9pb3YrKzsKIAl9CiAKLQlyZXR1cm4gdG90YWxfbGVuOworCXJldHVybiBieXRlc19zZW50OwogfQogCiAvKioKQEAgLTcyNyw2ICs3MzMsNyBAQAogCXUzMiBhbmNfZGF0YVszXTsKIAl1MzIgZXJyOwogCXUzMiBkZXN0X3R5cGU7CisJaW50IGhhc19uYW1lOwogCWludCByZXM7CiAKIAlpZiAobGlrZWx5KG0tPm1zZ19jb250cm9sbGVuID09IDApKQpAQCAtNzM4LDEwICs3NDUsMTAgQEAKIAlpZiAodW5saWtlbHkoZXJyKSkgewogCQlhbmNfZGF0YVswXSA9IGVycjsKIAkJYW5jX2RhdGFbMV0gPSBtc2dfZGF0YV9zeihtc2cpOwotCQlpZiAoKHJlcyA9IHB1dF9jbXNnKG0sIFNPTF9TT0NLRVQsIFRJUENfRVJSSU5GTywgOCwgYW5jX2RhdGEpKSkKKwkJaWYgKChyZXMgPSBwdXRfY21zZyhtLCBTT0xfVElQQywgVElQQ19FUlJJTkZPLCA4LCBhbmNfZGF0YSkpKQogCQkJcmV0dXJuIHJlczsKIAkJaWYgKGFuY19kYXRhWzFdICYmCi0JCSAgICAocmVzID0gcHV0X2Ntc2cobSwgU09MX1NPQ0tFVCwgVElQQ19SRVREQVRBLCBhbmNfZGF0YVsxXSwgCisJCSAgICAocmVzID0gcHV0X2Ntc2cobSwgU09MX1RJUEMsIFRJUENfUkVUREFUQSwgYW5jX2RhdGFbMV0sIAogCQkJCSAgICBtc2dfZGF0YShtc2cpKSkpCiAJCQlyZXR1cm4gcmVzOwogCX0KQEAgLTc1MSwyNSArNzU4LDI4IEBACiAJZGVzdF90eXBlID0gbXNnID8gbXNnX3R5cGUobXNnKSA6IFRJUENfRElSRUNUX01TRzsKIAlzd2l0Y2ggKGRlc3RfdHlwZSkgewogCWNhc2UgVElQQ19OQU1FRF9NU0c6CisJCWhhc19uYW1lID0gMTsKIAkJYW5jX2RhdGFbMF0gPSBtc2dfbmFtZXR5cGUobXNnKTsKIAkJYW5jX2RhdGFbMV0gPSBtc2dfbmFtZWxvd2VyKG1zZyk7CiAJCWFuY19kYXRhWzJdID0gbXNnX25hbWVsb3dlcihtc2cpOwogCQlicmVhazsKIAljYXNlIFRJUENfTUNBU1RfTVNHOgorCQloYXNfbmFtZSA9IDE7CiAJCWFuY19kYXRhWzBdID0gbXNnX25hbWV0eXBlKG1zZyk7CiAJCWFuY19kYXRhWzFdID0gbXNnX25hbWVsb3dlcihtc2cpOwogCQlhbmNfZGF0YVsyXSA9IG1zZ19uYW1ldXBwZXIobXNnKTsKIAkJYnJlYWs7CiAJY2FzZSBUSVBDX0NPTk5fTVNHOgorCQloYXNfbmFtZSA9ICh0cG9ydC0+Y29ubl90eXBlICE9IDApOwogCQlhbmNfZGF0YVswXSA9IHRwb3J0LT5jb25uX3R5cGU7CiAJCWFuY19kYXRhWzFdID0gdHBvcnQtPmNvbm5faW5zdGFuY2U7CiAJCWFuY19kYXRhWzJdID0gdHBvcnQtPmNvbm5faW5zdGFuY2U7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWFuY19kYXRhWzBdID0gMDsKKwkJaGFzX25hbWUgPSAwOwogCX0KLQlpZiAoYW5jX2RhdGFbMF0gJiYKLQkgICAgKHJlcyA9IHB1dF9jbXNnKG0sIFNPTF9TT0NLRVQsIFRJUENfREVTVE5BTUUsIDEyLCBhbmNfZGF0YSkpKQorCWlmIChoYXNfbmFtZSAmJgorCSAgICAocmVzID0gcHV0X2Ntc2cobSwgU09MX1RJUEMsIFRJUENfREVTVE5BTUUsIDEyLCBhbmNfZGF0YSkpKQogCQlyZXR1cm4gcmVzOwogCiAJcmV0dXJuIDA7CkBAIC05NjAsNyArOTcwLDcgQEAKIHJlc3RhcnQ6CiAJaWYgKHVubGlrZWx5KChza2JfcXVldWVfbGVuKCZzb2NrLT5zay0+c2tfcmVjZWl2ZV9xdWV1ZSkgPT0gMCkgJiYKIAkJICAgICAoZmxhZ3MgJiBNU0dfRE9OVFdBSVQpKSkgewotCQlyZXMgPSAoc3pfY29waWVkID09IDApID8gLUVXT1VMREJMT0NLIDogMDsKKwkJcmVzID0gLUVXT1VMREJMT0NLOwogCQlnb3RvIGV4aXQ7CiAJfQogCkBAIC0xMDUxLDcgKzEwNjEsNyBAQAogCiBleGl0OgogCXVwKCZ0c29jay0+c2VtKTsKLQlyZXR1cm4gcmVzID8gcmVzIDogc3pfY29waWVkOworCXJldHVybiBzel9jb3BpZWQgPyBzel9jb3BpZWQgOiByZXM7CiB9CiAKIC8qKgpAQCAtMTIzNiw3ICsxMjQ2LDggQEAKICAgIGlmIChzb2NrLT5zdGF0ZSA9PSBTU19SRUFEWSkKIAkgICByZXR1cm4gLUVPUE5PVFNVUFA7CiAKLSAgIC8qIE1PVkUgVEhFIFJFU1QgT0YgVEhJUyBFUlJPUiBDSEVDS0lORyBUTyBzZW5kX21zZygpPyAqLworICAgLyogSXNzdWUgUG9zaXgtY29tcGxpYW50IGVycm9yIGNvZGUgaWYgc29ja2V0IGlzIGluIHRoZSB3cm9uZyBzdGF0ZSAqLworCiAgICBpZiAoc29jay0+c3RhdGUgPT0gU1NfTElTVEVOSU5HKQogCSAgIHJldHVybiAtRU9QTk9UU1VQUDsKICAgIGlmIChzb2NrLT5zdGF0ZSA9PSBTU19DT05ORUNUSU5HKQpAQCAtMTI0NCwxMyArMTI1NSwyMCBAQAogICAgaWYgKHNvY2stPnN0YXRlICE9IFNTX1VOQ09OTkVDVEVEKQogICAgICAgICAgICByZXR1cm4gLUVJU0NPTk47CiAKLSAgIGlmICgoZHN0LT5mYW1pbHkgIT0gQUZfVElQQykgfHwKLSAgICAgICAoKGRzdC0+YWRkcnR5cGUgIT0gVElQQ19BRERSX05BTUUpICYmIChkc3QtPmFkZHJ0eXBlICE9IFRJUENfQUREUl9JRCkpKQorICAgLyoKKyAgICAqIFJlamVjdCBjb25uZWN0aW9uIGF0dGVtcHQgdXNpbmcgbXVsdGljYXN0IGFkZHJlc3MKKyAgICAqCisgICAgKiBOb3RlOiBzZW5kX21zZygpIHZhbGlkYXRlcyB0aGUgcmVzdCBvZiB0aGUgYWRkcmVzcyBmaWVsZHMsCisgICAgKiAgICAgICBzbyB0aGVyZSdzIG5vIG5lZWQgdG8gZG8gaXQgaGVyZQorICAgICovCisKKyAgIGlmIChkc3QtPmFkZHJ0eXBlID09IFRJUENfQUREUl9NQ0FTVCkKICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAKICAgIC8qIFNlbmQgYSAnU1lOLScgdG8gZGVzdGluYXRpb24gKi8KIAogICAgbS5tc2dfbmFtZSA9IGRlc3Q7CisgICBtLm1zZ19uYW1lbGVuID0gZGVzdGxlbjsKICAgIGlmICgocmVzID0gc2VuZF9tc2coTlVMTCwgc29jaywgJm0sIDApKSA8IDApIHsKIAkgICBzb2NrLT5zdGF0ZSA9IFNTX0RJU0NPTk5FQ1RJTkc7CiAJICAgcmV0dXJuIHJlczsKQEAgLTEyNjksMTAgKzEyODcsNiBAQAogCSAgIG1zZyA9IGJ1Zl9tc2coYnVmKTsKICAgICAgICAgICAgcmVzID0gYXV0b19jb25uZWN0KHNvY2ssIHRzb2NrLCBtc2cpOwogICAgICAgICAgICBpZiAoIXJlcykgewotCQkgICBpZiAoZHN0LT5hZGRydHlwZSA9PSBUSVBDX0FERFJfTkFNRSkgewotCQkJICAgdHNvY2stPnAtPmNvbm5fdHlwZSA9IGRzdC0+YWRkci5uYW1lLm5hbWUudHlwZTsKLQkJCSAgIHRzb2NrLT5wLT5jb25uX2luc3RhbmNlID0gZHN0LT5hZGRyLm5hbWUubmFtZS5pbnN0YW5jZTsKLQkJICAgfQogCQkgICBpZiAoIW1zZ19kYXRhX3N6KG1zZykpCiAJCQkgICBhZHZhbmNlX3F1ZXVlKHRzb2NrKTsKIAkgICB9CkBAIC0xMzg2LDcgKzE0MDAsNyBAQAogLyoqCiAgKiBzaHV0ZG93biAtIHNodXRkb3duIHNvY2tldCBjb25uZWN0aW9uCiAgKiBAc29jazogc29ja2V0IHN0cnVjdHVyZQotICogQGhvdzogZGlyZWN0aW9uIHRvIGNsb3NlIChhbHdheXMgdHJlYXRlZCBhcyByZWFkICsgd3JpdGUpCisgKiBAaG93OiBkaXJlY3Rpb24gdG8gY2xvc2UgKHVudXNlZDsgYWx3YXlzIHRyZWF0ZWQgYXMgcmVhZCArIHdyaXRlKQogICoKICAqIFRlcm1pbmF0ZXMgY29ubmVjdGlvbiAoaWYgbmVjZXNzYXJ5KSwgdGhlbiBwdXJnZXMgc29ja2V0J3MgcmVjZWl2ZSBxdWV1ZS4KICAqIApAQCAtMTQ2OSw3ICsxNDgzLDggQEAKICAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBlcnJubyBvdGhlcndpc2UKICAqLwogCi1zdGF0aWMgaW50IHNldHNvY2tvcHQoc3RydWN0IHNvY2tldCAqc29jaywgaW50IGx2bCwgaW50IG9wdCwgY2hhciAqb3YsIGludCBvbCkKK3N0YXRpYyBpbnQgc2V0c29ja29wdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCAKKwkJICAgICAgaW50IGx2bCwgaW50IG9wdCwgY2hhciBfX3VzZXIgKm92LCBpbnQgb2wpCiB7CiAJc3RydWN0IHRpcGNfc29jayAqdHNvY2sgPSB0aXBjX3NrKHNvY2stPnNrKTsKIAl1MzIgdmFsdWU7CkBAIC0xNTI1LDcgKzE1NDAsOCBAQAogICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIGVycm5vIG90aGVyd2lzZQogICovCiAKLXN0YXRpYyBpbnQgZ2V0c29ja29wdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgbHZsLCBpbnQgb3B0LCBjaGFyICpvdiwgaW50ICpvbCkKK3N0YXRpYyBpbnQgZ2V0c29ja29wdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCAKKwkJICAgICAgaW50IGx2bCwgaW50IG9wdCwgY2hhciBfX3VzZXIgKm92LCBpbnQgKm9sKQogewogCXN0cnVjdCB0aXBjX3NvY2sgKnRzb2NrID0gdGlwY19zayhzb2NrLT5zayk7CiAgICAgICAgIGludCBsZW47CmRpZmYgLS1naXQgYS9uZXQvdGlwYy9zdWJzY3IuYyBiL25ldC90aXBjL3N1YnNjci5jCmluZGV4IGM1ZjAyNmMuLmZjMTcxODcgMTAwNjQ0Ci0tLSBhL25ldC90aXBjL3N1YnNjci5jCisrKyBiL25ldC90aXBjL3N1YnNjci5jCkBAIC0yNjYsNyArMjY2LDggQEAKIAkvKiBSZWZ1c2Ugc3Vic2NyaXB0aW9uIGlmIGdsb2JhbCBsaW1pdCBleGNlZWRlZCAqLwogCiAJaWYgKGF0b21pY19yZWFkKCZ0b3BzcnYuc3Vic2NyaXB0aW9uX2NvdW50KSA+PSB0aXBjX21heF9zdWJzY3JpcHRpb25zKSB7Ci0JCXdhcm4oIkZhaWxlZDogbWF4ICV1IHN1YnNjcmlwdGlvbnNcbiIsIHRpcGNfbWF4X3N1YnNjcmlwdGlvbnMpOworCQl3YXJuKCJTdWJzY3JpcHRpb24gcmVqZWN0ZWQsIHN1YnNjcmlwdGlvbiBsaW1pdCByZWFjaGVkICgldSlcbiIsCisJCSAgICAgdGlwY19tYXhfc3Vic2NyaXB0aW9ucyk7CiAJCXN1YnNjcl90ZXJtaW5hdGUoc3Vic2NyaWJlcik7CiAJCXJldHVybjsKIAl9CkBAIC0yNzQsOCArMjc1LDggQEAKIAkvKiBBbGxvY2F0ZSBzdWJzY3JpcHRpb24gb2JqZWN0ICovCiAKIAlzdWIgPSBrbWFsbG9jKHNpemVvZigqc3ViKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKHN1YiA9PSBOVUxMKSB7Ci0JCXdhcm4oIk1lbW9yeSBzcXVlZXplOyBpZ25vcmluZyBzdWJzY3JpcHRpb25cbiIpOworCWlmICghc3ViKSB7CisJCXdhcm4oIlN1YnNjcmlwdGlvbiByZWplY3RlZCwgbm8gbWVtb3J5XG4iKTsKIAkJc3Vic2NyX3Rlcm1pbmF0ZShzdWJzY3JpYmVyKTsKIAkJcmV0dXJuOwogCX0KQEAgLTI5OCw4ICsyOTksNyBAQAogCWlmICgoKChzdWItPmZpbHRlciAhPSBUSVBDX1NVQl9QT1JUUykgCiAJICAgICAgJiYgKHN1Yi0+ZmlsdGVyICE9IFRJUENfU1VCX1NFUlZJQ0UpKSkKIAkgICAgfHwgKHN1Yi0+c2VxLmxvd2VyID4gc3ViLT5zZXEudXBwZXIpKSB7Ci0JCXdhcm4oIlJlamVjdGluZyBpbGxlZ2FsIHN1YnNjcmlwdGlvbiAldSwldSwldVxuIiwKLQkJICAgICBzdWItPnNlcS50eXBlLCBzdWItPnNlcS5sb3dlciwgc3ViLT5zZXEudXBwZXIpOworCQl3YXJuKCJTdWJzY3JpcHRpb24gcmVqZWN0ZWQsIGlsbGVnYWwgcmVxdWVzdFxuIik7CiAJCWtmcmVlKHN1Yik7CiAJCXN1YnNjcl90ZXJtaW5hdGUoc3Vic2NyaWJlcik7CiAJCXJldHVybjsKQEAgLTM4Nyw3ICszODcsNyBAQAogCWRiZygic3Vic2NyX25hbWVkX21zZ19ldmVudDogb3JpZyA9ICV4IG93biA9ICV4LFxuIiwKIAkgICAgb3JpZy0+bm9kZSwgdGlwY19vd25fYWRkcik7CiAJaWYgKHNpemUgJiYgKHNpemUgIT0gc2l6ZW9mKHN0cnVjdCB0aXBjX3N1YnNjcikpKSB7Ci0JCXdhcm4oIlJlY2VpdmVkIHRpcGNfc3Vic2NyIG9mIGludmFsaWQgc2l6ZVxuIik7CisJCXdhcm4oIlN1YnNjcmliZXIgcmVqZWN0ZWQsIGludmFsaWQgc3Vic2NyaXB0aW9uIHNpemVcbiIpOwogCQlyZXR1cm47CiAJfQogCkBAIC0zOTUsNyArMzk1LDcgQEAKIAogCXN1YnNjcmliZXIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc3Vic2NyaWJlciksIEdGUF9BVE9NSUMpOwogCWlmIChzdWJzY3JpYmVyID09IE5VTEwpIHsKLQkJd2FybigiTWVtb3J5IHNxdWVlemU7IGlnbm9yaW5nIHN1YnNjcmliZXIgc2V0dXBcbiIpOworCQl3YXJuKCJTdWJzY3JpYmVyIHJlamVjdGVkLCBubyBtZW1vcnlcbiIpOwogCQlyZXR1cm47CiAJfQogCW1lbXNldChzdWJzY3JpYmVyLCAwLCBzaXplb2Yoc3RydWN0IHN1YnNjcmliZXIpKTsKQEAgLTQwMyw3ICs0MDMsNyBAQAogCUlOSVRfTElTVF9IRUFEKCZzdWJzY3JpYmVyLT5zdWJzY3JpYmVyX2xpc3QpOwogCXN1YnNjcmliZXItPnJlZiA9IHRpcGNfcmVmX2FjcXVpcmUoc3Vic2NyaWJlciwgJnN1YnNjcmliZXItPmxvY2spOwogCWlmIChzdWJzY3JpYmVyLT5yZWYgPT0gMCkgewotCQl3YXJuKCJGYWlsZWQgdG8gYWNxdWlyZSBzdWJzY3JpYmVyIHJlZmVyZW5jZVxuIik7CisJCXdhcm4oIlN1YnNjcmliZXIgcmVqZWN0ZWQsIHJlZmVyZW5jZSB0YWJsZSBleGhhdXN0ZWRcbiIpOwogCQlrZnJlZShzdWJzY3JpYmVyKTsKIAkJcmV0dXJuOwogCX0KQEAgLTQyMiw3ICs0MjIsNyBAQAogCQkJTlVMTCwKIAkJCSZzdWJzY3JpYmVyLT5wb3J0X3JlZik7CiAJaWYgKHN1YnNjcmliZXItPnBvcnRfcmVmID09IDApIHsKLQkJd2FybigiTWVtb3J5IHNxdWVlemU7IGZhaWxlZCB0byBjcmVhdGUgc3Vic2NyaXB0aW9uIHBvcnRcbiIpOworCQl3YXJuKCJTdWJzY3JpYmVyIHJlamVjdGVkLCB1bmFibGUgdG8gY3JlYXRlIHBvcnRcbiIpOwogCQl0aXBjX3JlZl9kaXNjYXJkKHN1YnNjcmliZXItPnJlZik7CiAJCWtmcmVlKHN1YnNjcmliZXIpOwogCQlyZXR1cm47CmRpZmYgLS1naXQgYS9uZXQvdGlwYy96b25lLmMgYi9uZXQvdGlwYy96b25lLmMKaW5kZXggMjgwM2UxYi4uMzE2YzQ4NyAxMDA2NDQKLS0tIGEvbmV0L3RpcGMvem9uZS5jCisrKyBiL25ldC90aXBjL3pvbmUuYwpAQCAtNDQsMTkgKzQ0LDI0IEBACiAKIHN0cnVjdCBfem9uZSAqdGlwY196b25lX2NyZWF0ZSh1MzIgYWRkcikKIHsKLQlzdHJ1Y3QgX3pvbmUgKnpfcHRyID0gTlVMTDsKKwlzdHJ1Y3QgX3pvbmUgKnpfcHRyOwogCXUzMiB6X251bTsKIAotCWlmICghdGlwY19hZGRyX2RvbWFpbl92YWxpZChhZGRyKSkKKwlpZiAoIXRpcGNfYWRkcl9kb21haW5fdmFsaWQoYWRkcikpIHsKKwkJZXJyKCJab25lIGNyZWF0aW9uIGZhaWxlZCwgaW52YWxpZCBkb21haW4gMHgleFxuIiwgYWRkcik7CiAJCXJldHVybiBOVUxMOworCX0KIAogCXpfcHRyID0gKHN0cnVjdCBfem9uZSAqKWttYWxsb2Moc2l6ZW9mKCp6X3B0ciksIEdGUF9BVE9NSUMpOwotCWlmICh6X3B0ciAhPSBOVUxMKSB7Ci0JCW1lbXNldCh6X3B0ciwgMCwgc2l6ZW9mKCp6X3B0cikpOwotCQl6X251bSA9IHRpcGNfem9uZShhZGRyKTsKLQkJel9wdHItPmFkZHIgPSB0aXBjX2FkZHIoel9udW0sIDAsIDApOwotCQl0aXBjX25ldC56b25lc1t6X251bV0gPSB6X3B0cjsKKwlpZiAoIXpfcHRyKSB7CisJCXdhcm4oIlpvbmUgY3JlYXRpb24gZmFpbGVkLCBpbnN1ZmZpY2llbnQgbWVtb3J5XG4iKTsKKwkJcmV0dXJuIE5VTEw7CiAJfQorCisJbWVtc2V0KHpfcHRyLCAwLCBzaXplb2YoKnpfcHRyKSk7CisJel9udW0gPSB0aXBjX3pvbmUoYWRkcik7CisJel9wdHItPmFkZHIgPSB0aXBjX2FkZHIoel9udW0sIDAsIDApOworCXRpcGNfbmV0LnpvbmVzW3pfbnVtXSA9IHpfcHRyOwogCXJldHVybiB6X3B0cjsKIH0KIApkaWZmIC0tZ2l0IGEvc2NyaXB0cy9LYnVpbGQuaW5jbHVkZSBiL3NjcmlwdHMvS2J1aWxkLmluY2x1ZGUKaW5kZXggYjBkMDY3Yi4uYWM1ZjI3NSAxMDA2NDQKLS0tIGEvc2NyaXB0cy9LYnVpbGQuaW5jbHVkZQorKysgYi9zY3JpcHRzL0tidWlsZC5pbmNsdWRlCkBAIC0xMyw2ICsxMywxMSBAQAogZGVwZmlsZSA9ICQoc3Vic3QgJChjb21tYSksXywkKEBEKS8uJChARikuZCkKIAogIyMjCisjIGJhc2V0YXJnZXQgZXF1YWxzIHRoZSBmaWxlbmFtZSBvZiB0aGUgdGFyZ2V0IHdpdGggbm8gZXh0ZW5zaW9uLgorIyBTbyAnZm9vL2Jhci5vJyBiZWNvbWVzICdiYXInCitiYXNldGFyZ2V0ID0gJChiYXNlbmFtZSAkKG5vdGRpciAkQCkpCisKKyMjIwogIyBFc2NhcGUgc2luZ2xlIHF1b3RlIGZvciB1c2UgaW4gZWNobyBzdGF0ZW1lbnRzCiBlc2NzcSA9ICQoc3Vic3QgJChzcXVvdGUpLCdcJChzcXVvdGUpJywkMSkKIApkaWZmIC0tZ2l0IGEvc2NyaXB0cy9NYWtlZmlsZS5idWlsZCBiL3NjcmlwdHMvTWFrZWZpbGUuYnVpbGQKaW5kZXggZTQ4ZTYwZC4uM2NiNDQ1YyAxMDA2NDQKLS0tIGEvc2NyaXB0cy9NYWtlZmlsZS5idWlsZAorKysgYi9zY3JpcHRzL01ha2VmaWxlLmJ1aWxkCkBAIC04LDcgKzgsNyBAQAogX19idWlsZDoKIAogIyBSZWFkIC5jb25maWcgaWYgaXQgZXhpc3QsIG90aGVyd2lzZSBpZ25vcmUKLS1pbmNsdWRlIC5jb25maWcKKy1pbmNsdWRlIGluY2x1ZGUvY29uZmlnL2F1dG8uY29uZgogCiBpbmNsdWRlIHNjcmlwdHMvS2J1aWxkLmluY2x1ZGUKIApAQCAtMTE3LDcgKzExNyw3IEBACiAkKG9iai1tKSAgICAgICAgICAgICAgOiBxdWlldF9tb2R0YWcgOj0gW01dCiAKICMgRGVmYXVsdCBmb3Igbm90IG11bHRpLXBhcnQgbW9kdWxlcwotbW9kbmFtZSA9ICQoKkYpCittb2RuYW1lID0gJChiYXNldGFyZ2V0KQogCiAkKG11bHRpLW9ianMtbSkgICAgICAgICA6IG1vZG5hbWUgPSAkKG1vZG5hbWUtbXVsdGkpCiAkKG11bHRpLW9ianMtbToubz0uaSkgICA6IG1vZG5hbWUgPSAkKG1vZG5hbWUtbXVsdGkpCkBAIC0xNDAsNiArMTQwLDE1IEBACiAlLmk6ICUuYyBGT1JDRQogCSQoY2FsbCBpZl9jaGFuZ2VkX2RlcCxjY19pX2MpCiAKK3F1aWV0X2NtZF9jY19zeW10eXBlc19jID0gU1lNICQocXVpZXRfbW9kdGFnKSAkQAorY21kX2NjX3N5bXR5cGVzX2MJICAgPSBcCisJCSQoQ1BQKSAtRF9fR0VOS1NZTVNfXyAkKGNfZmxhZ3MpICQ8CQkJXAorCQl8ICQoR0VOS1NZTVMpIC1UICRAID4vZGV2L251bGw7CQkJCVwKKwkJdGVzdCAtcyAkQCB8fCBybSAtZiAkQAorCislLnN5bXR5cGVzIDogJS5jIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWRfZGVwLGNjX3N5bXR5cGVzX2MpCisKICMgQyAoLmMpIGZpbGVzCiAjIFRoZSBDIGZpbGUgaXMgY29tcGlsZWQgYW5kIHVwZGF0ZWQgZGVwZW5kZW5jeSBpbmZvcm1hdGlvbiBpcyBnZW5lcmF0ZWQuCiAjIChTZWUgY21kX2NjX29fYyArIHJlbGV2YW50IHBhcnQgb2YgcnVsZV9jY19vX2MpCkBAIC0xNjYsNyArMTc1LDggQEAKIGNtZF9tb2R2ZXJzaW9ucyA9CQkJCQkJCVwKIAlpZiAkKE9CSkRVTVApIC1oICQoQEQpLy50bXBfJChARikgfCBncmVwIC1xIF9fa3N5bXRhYjsgdGhlbglcCiAJCSQoQ1BQKSAtRF9fR0VOS1NZTVNfXyAkKGNfZmxhZ3MpICQ8CQkJXAotCQl8ICQoR0VOS1NZTVMpIC1hICQoQVJDSCkJCQkJXAorCQl8ICQoR0VOS1NZTVMpICQoaWYgJChLQlVJTERfU1lNVFlQRVMpLAkJCVwKKwkJCSAgICAgIC1UICQoQEQpLyQoQEY6Lm89LnN5bXR5cGVzKSkgLWEgJChBUkNIKQlcCiAJCT4gJChARCkvLnRtcF8kKEBGOi5vPS52ZXIpOwkJCQlcCiAJCQkJCQkJCQlcCiAJCSQoTEQpICQoTERGTEFHUykgLXIgLW8gJEAgJChARCkvLnRtcF8kKEBGKSAJCVwKZGlmZiAtLWdpdCBhL3NjcmlwdHMvTWFrZWZpbGUuaG9zdCBiL3NjcmlwdHMvTWFrZWZpbGUuaG9zdAppbmRleCAyZDUxOTcwLi4xOGVjZDRkIDEwMDY0NAotLS0gYS9zY3JpcHRzL01ha2VmaWxlLmhvc3QKKysrIGIvc2NyaXB0cy9NYWtlZmlsZS5ob3N0CkBAIC0zMyw4ICszMyw4IEBACiBfX2hvc3Rwcm9ncyA6PSAkKHNvcnQgJChob3N0cHJvZ3MteSkkKGhvc3Rwcm9ncy1tKSkKIAogIyBob3N0cHJvZ3MteSA6PSB0b29scy9idWlsZCBtYXkgaGF2ZSBiZWVuIHNwZWNpZmllZC4gUmV0cmVpdmUgZGlyZWN0b3J5Ci1vYmotZGlycyArPSAkKGZvcmVhY2ggZiwkKF9faG9zdHByb2dzKSwgJChpZiAkKGRpciAkKGYpKSwkKGRpciAkKGYpKSkpCi1vYmotZGlycyA6PSAkKHN0cmlwICQoc29ydCAkKGZpbHRlci1vdXQgLi8sJChvYmotZGlycykpKSkKK2hvc3Qtb2JqZGlycyA6PSAkKGZvcmVhY2ggZiwkKF9faG9zdHByb2dzKSwgJChpZiAkKGRpciAkKGYpKSwkKGRpciAkKGYpKSkpCitob3N0LW9iamRpcnMgOj0gJChzdHJpcCAkKHNvcnQgJChmaWx0ZXItb3V0IC4vLCQoaG9zdC1vYmpkaXJzKSkpKQogCiAKICMgQyBjb2RlCkBAIC03MywxMyArNzMsMTcgQEAKIGhvc3QtY3h4b2Jqcwk6PSAkKGFkZHByZWZpeCAkKG9iaikvLCQoaG9zdC1jeHhvYmpzKSkKIGhvc3QtY3NobGliCTo9ICQoYWRkcHJlZml4ICQob2JqKS8sJChob3N0LWNzaGxpYikpCiBob3N0LWNzaG9ianMJOj0gJChhZGRwcmVmaXggJChvYmopLywkKGhvc3QtY3Nob2JqcykpCi1vYmotZGlycyAgICAgICAgOj0gJChhZGRwcmVmaXggJChvYmopLywkKG9iai1kaXJzKSkKK2hvc3Qtb2JqZGlycyAgICA6PSAkKGFkZHByZWZpeCAkKG9iaikvLCQoaG9zdC1vYmpkaXJzKSkKKworb2JqLWRpcnMgKz0gJChob3N0LW9iamRpcnMpCiAKICMjIyMjCiAjIEhhbmRsZSBvcHRpb25zIHRvIGdjYy4gU3VwcG9ydCBidWlsZGluZyB3aXRoIHNlcGFyYXRlIG91dHB1dCBkaXJlY3RvcnkKIAotX2hvc3RjX2ZsYWdzICAgPSAkKEhPU1RDRkxBR1MpICAgJChIT1NUX0VYVFJBQ0ZMQUdTKSAgICQoSE9TVENGTEFHU18kKCpGKS5vKQotX2hvc3RjeHhfZmxhZ3MgPSAkKEhPU1RDWFhGTEFHUykgJChIT1NUX0VYVFJBQ1hYRkxBR1MpICQoSE9TVENYWEZMQUdTXyQoKkYpLm8pCitfaG9zdGNfZmxhZ3MgICA9ICQoSE9TVENGTEFHUykgICAkKEhPU1RfRVhUUkFDRkxBR1MpICAgXAorICAgICAgICAgICAgICAgICAkKEhPU1RDRkxBR1NfJChiYXNldGFyZ2V0KS5vKQorX2hvc3RjeHhfZmxhZ3MgPSAkKEhPU1RDWFhGTEFHUykgJChIT1NUX0VYVFJBQ1hYRkxBR1MpIFwKKyAgICAgICAgICAgICAgICAgJChIT1NUQ1hYRkxBR1NfJChiYXNldGFyZ2V0KS5vKQogCiBpZmVxICgkKEtCVUlMRF9TUkMpLCkKIF9faG9zdGNfZmxhZ3MJPSAkKF9ob3N0Y19mbGFncykKZGlmZiAtLWdpdCBhL3NjcmlwdHMvTWFrZWZpbGUubGliIGIvc2NyaXB0cy9NYWtlZmlsZS5saWIKaW5kZXggMmNiNDkzNS4uZmM0OThmZSAxMDA2NDQKLS0tIGEvc2NyaXB0cy9NYWtlZmlsZS5saWIKKysrIGIvc2NyaXB0cy9NYWtlZmlsZS5saWIKQEAgLTgyLDEyICs4MiwxMiBAQAogIyAgICAgICB0aGFuIG9uZSBtb2R1bGUuIEluIHRoYXQgY2FzZSBLQlVJTERfTU9ETkFNRSB3aWxsIGJlIHNldCB0byBmb29fYmFyLAogIyAgICAgICB3aGVyZSBmb28gYW5kIGJhciBhcmUgdGhlIG5hbWUgb2YgdGhlIG1vZHVsZXMuCiBuYW1lLWZpeCA9ICQoc3Vic3QgJChjb21tYSksXywkKHN1YnN0IC0sXywkMSkpCi1iYXNlbmFtZV9mbGFncyA9IC1EIktCVUlMRF9CQVNFTkFNRT1LQlVJTERfU1RSKCQoY2FsbCBuYW1lLWZpeCwkKCpGKSkpIgorYmFzZW5hbWVfZmxhZ3MgPSAtRCJLQlVJTERfQkFTRU5BTUU9S0JVSUxEX1NUUigkKGNhbGwgbmFtZS1maXgsJChiYXNldGFyZ2V0KSkpIgogbW9kbmFtZV9mbGFncyAgPSAkKGlmICQoZmlsdGVyIDEsJCh3b3JkcyAkKG1vZG5hbWUpKSksXAogICAgICAgICAgICAgICAgICAtRCJLQlVJTERfTU9ETkFNRT1LQlVJTERfU1RSKCQoY2FsbCBuYW1lLWZpeCwkKG1vZG5hbWUpKSkiKQogCi1fY19mbGFncyAgICAgICA9ICQoQ0ZMQUdTKSAkKEVYVFJBX0NGTEFHUykgJChDRkxBR1NfJCgqRikubykKLV9hX2ZsYWdzICAgICAgID0gJChBRkxBR1MpICQoRVhUUkFfQUZMQUdTKSAkKEFGTEFHU18kKCpGKS5vKQorX2NfZmxhZ3MgICAgICAgPSAkKENGTEFHUykgJChFWFRSQV9DRkxBR1MpICQoQ0ZMQUdTXyQoYmFzZXRhcmdldCkubykKK19hX2ZsYWdzICAgICAgID0gJChBRkxBR1MpICQoRVhUUkFfQUZMQUdTKSAkKEFGTEFHU18kKGJhc2V0YXJnZXQpLm8pCiBfY3BwX2ZsYWdzICAgICA9ICQoQ1BQRkxBR1MpICQoRVhUUkFfQ1BQRkxBR1MpICQoQ1BQRkxBR1NfJChARikpCiAKICMgSWYgYnVpbGRpbmcgdGhlIGtlcm5lbCBpbiBhIHNlcGFyYXRlIG9ianRyZWUgZXhwYW5kIGFsbCBvY2N1cnJlbmNlcwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9NYWtlZmlsZS5tb2RpbnN0IGIvc2NyaXB0cy9NYWtlZmlsZS5tb2RpbnN0CmluZGV4IDI2ODZkZDUuLmYwZmYyNDggMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvTWFrZWZpbGUubW9kaW5zdAorKysgYi9zY3JpcHRzL01ha2VmaWxlLm1vZGluc3QKQEAgLTE3LDcgKzE3LDcgQEAKIAlAOgogCiBxdWlldF9jbWRfbW9kdWxlc19pbnN0YWxsID0gSU5TVEFMTCAkQAotICAgICAgY21kX21vZHVsZXNfaW5zdGFsbCA9IG1rZGlyIC1wICQoMik7IGNwICRAICQoMikKKyAgICAgIGNtZF9tb2R1bGVzX2luc3RhbGwgPSBta2RpciAtcCAkKDIpOyBjcCAkQCAkKDIpIDsgJChtb2Rfc3RyaXBfY21kKSAkKDIpLyQobm90ZGlyICRAKQogCiAjIE1vZHVsZXMgYnVpbHQgb3V0c2lkZSB0aGUga2VybmVsIHNvdXJjZSB0cmVlIGdvIGludG8gZXh0cmEgYnkgZGVmYXVsdAogSU5TVEFMTF9NT0RfRElSID89IGV4dHJhCmRpZmYgLS1naXQgYS9zY3JpcHRzL01ha2VmaWxlLm1vZHBvc3QgYi9zY3JpcHRzL01ha2VmaWxlLm1vZHBvc3QKaW5kZXggMGUwNTZjZi4uZTgzNjEzZSAxMDA2NDQKLS0tIGEvc2NyaXB0cy9NYWtlZmlsZS5tb2Rwb3N0CisrKyBiL3NjcmlwdHMvTWFrZWZpbGUubW9kcG9zdApAQCAtMzUsNyArMzUsNyBAQAogUEhPTlkgOj0gX21vZHBvc3QKIF9tb2Rwb3N0OiBfX21vZHBvc3QKIAotaW5jbHVkZSAuY29uZmlnCitpbmNsdWRlIGluY2x1ZGUvY29uZmlnL2F1dG8uY29uZgogaW5jbHVkZSBzY3JpcHRzL0tidWlsZC5pbmNsdWRlCiBpbmNsdWRlIHNjcmlwdHMvTWFrZWZpbGUubGliCiAKQEAgLTcyLDcgKzcyLDcgQEAKICMgU3RlcCA1KSwgY29tcGlsZSBhbGwgKi5tb2QuYyBmaWxlcwogCiAjIG1vZG5hbWUgaXMgc2V0IHRvIG1ha2UgY19mbGFncyBkZWZpbmUgS0JVSUxEX01PRE5BTUUKLW1vZG5hbWUgPSAkKCpGKQorbW9kbmFtZSA9ICQoYmFzZXRhcmdldCkKIAogcXVpZXRfY21kX2NjX29fYyA9IENDICAgICAgJEAKICAgICAgIGNtZF9jY19vX2MgPSAkKENDKSAkKGNfZmxhZ3MpICQoQ0ZMQUdTX01PRFVMRSkJXApkaWZmIC0tZ2l0IGEvc2NyaXB0cy9iYXNpYy9NYWtlZmlsZSBiL3NjcmlwdHMvYmFzaWMvTWFrZWZpbGUKaW5kZXggZjIyZTk0Yy4uMmY2MDA3MCAxMDA2NDQKLS0tIGEvc2NyaXB0cy9iYXNpYy9NYWtlZmlsZQorKysgYi9zY3JpcHRzL2Jhc2ljL01ha2VmaWxlCkBAIC0xLDE3ICsxLDE1IEBACiAjIyMKICMgTWFrZWZpbGUuYmFzaWMgbGlzdCB0aGUgbW9zdCBiYXNpYyBwcm9ncmFtcyB1c2VkIGR1cmluZyB0aGUgYnVpbGQgcHJvY2Vzcy4KICMgVGhlIHByb2dyYW1zIGxpc3RlZCBoZXJlaW4gaXMgd2hhdCBpcyBuZWVkZWQgdG8gZG8gdGhlIGJhc2ljIHN0dWZmLAotIyBzdWNoIGFzIHNwbGl0dGluZyAuY29uZmlnIGFuZCBmaXggZGVwZW5kZW5jeSBmaWxlLgorIyBzdWNoIGFzIGZpeCBkZXBlbmRlbmN5IGZpbGUuCiAjIFRoaXMgaW5pdGlhbCBzdGVwIGlzIG5lZWRlZCB0byBhdm9pZCBmaWxlcyB0byBiZSByZWNvbXBpbGVkCiAjIHdoZW4ga2VybmVsIGNvbmZpZ3VyYXRpb24gY2hhbmdlcyAod2hpY2ggaXMgd2hhdCBoYXBwZW5zIHdoZW4KICMgLmNvbmZpZyBpcyBpbmNsdWRlZCBieSBtYWluIE1ha2VmaWxlLgogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICMgZml4ZGVwOiAJIFVzZWQgdG8gZ2VuZXJhdGUgZGVwZW5kZW5jeSBpbmZvcm1hdGlvbiBkdXJpbmcgYnVpbGQgcHJvY2VzcwotIyBzcGxpdC1pbmNsdWRlOiBEaXZpZGUgYWxsIGNvbmZpZyBzeW1ib2xzIHVwIGluIGEgbnVtYmVyIG9mIGZpbGVzIGluCi0jICAgICAgICAgICAgICAgIGluY2x1ZGUvY29uZmlnLy4uLgogIyBkb2Nwcm9jOgkgVXNlZCBpbiBEb2N1bWVudGF0aW9uL2RvY2Jvb2sKIAotaG9zdHByb2dzLXkJOj0gZml4ZGVwIHNwbGl0LWluY2x1ZGUgZG9jcHJvYworaG9zdHByb2dzLXkJOj0gZml4ZGVwIGRvY3Byb2MKIGFsd2F5cwkJOj0gJChob3N0cHJvZ3MteSkKIAogIyBmaXhkZXAgaXMgbmVlZGVkIHRvIGNvbXBpbGUgb3RoZXIgaG9zdCBwcm9ncmFtcwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9iYXNpYy9zcGxpdC1pbmNsdWRlLmMgYi9zY3JpcHRzL2Jhc2ljL3NwbGl0LWluY2x1ZGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU5YzQ1MjcuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9iYXNpYy9zcGxpdC1pbmNsdWRlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjYgKzAsMCBAQAotLyoKLSAqIHNwbGl0LWluY2x1ZGUuYwotICoKLSAqIENvcHlyaWdodCBhYmFuZG9uZWQsIE1pY2hhZWwgQ2hhc3RhaW4sIDxtYWlsdG86bWVjQHNob3V0Lm5ldD4uCi0gKiBUaGlzIGlzIGEgQyB2ZXJzaW9uIG9mIHN5bmNkZXAucGwgYnkgV2VybmVyIEFsbWVzYmVyZ2VyLgotICoKLSAqIFRoaXMgcHJvZ3JhbSB0YWtlcyBhdXRvY29uZi5oIGFzIGlucHV0IGFuZCBvdXRwdXRzIGEgZGlyZWN0b3J5IGZ1bGwKLSAqIG9mIG9uZS1saW5lIGluY2x1ZGUgZmlsZXMsIG1lcmdpbmcgb250byB0aGUgb2xkIHZhbHVlcy4KLSAqCi0gKiBUaGluayBvZiB0aGUgY29uZmlndXJhdGlvbiBvcHRpb25zIGFzIGtleS12YWx1ZSBwYWlycy4gIFRoZW4gdGhlcmUKLSAqIGFyZSBmaXZlIGNhc2VzOgotICoKLSAqICAgIGtleSAgICAgIG9sZCB2YWx1ZSAgIG5ldyB2YWx1ZSAgIGFjdGlvbgotICoKLSAqICAgIEtFWS0xICAgIFZBTFVFLTEgICAgIFZBTFVFLTEgICAgIGxlYXZlIGZpbGUgYWxvbmUKLSAqICAgIEtFWS0yICAgIFZBTFVFLTJBICAgIFZBTFVFLTJCICAgIHdyaXRlIFZBTFVFLTJCIGludG8gZmlsZQotICogICAgS0VZLTMgICAgLSAgICAgICAgICAgVkFMVUUtMyAgICAgd3JpdGUgVkFMVUUtMyAgaW50byBmaWxlCi0gKiAgICBLRVktNCAgICBWQUxVRS00ICAgICAtICAgICAgICAgICB3cml0ZSBhbiBlbXB0eSBmaWxlCi0gKiAgICBLRVktNSAgICAoZW1wdHkpICAgICAtICAgICAgICAgICBsZWF2ZSBvbGQgZW1wdHkgZmlsZSBhbG9uZQotICovCi0KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2RlZmluZSBFUlJPUl9FWElUKHN0ckV4aXQpCQkJCQkJXAotICAgIHsJCQkJCQkJCQlcCi0JY29uc3QgaW50IGVycm5vU2F2ZSA9IGVycm5vOwkJCQkJXAotCWZwcmludGYoc3RkZXJyLCAiJXM6ICIsIHN0cl9teV9uYW1lKTsJCQkJXAotCWVycm5vID0gZXJybm9TYXZlOwkJCQkJCVwKLQlwZXJyb3IoKHN0ckV4aXQpKTsJCQkJCQlcCi0JZXhpdCgxKTsJCQkJCQkJXAotICAgIH0KLQotCi0KLWludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyICogYXJndiBbXSkKLXsKLSAgICBjb25zdCBjaGFyICogc3RyX215X25hbWU7Ci0gICAgY29uc3QgY2hhciAqIHN0cl9maWxlX2F1dG9jb25mOwotICAgIGNvbnN0IGNoYXIgKiBzdHJfZGlyX2NvbmZpZzsKLQotICAgIEZJTEUgKiBmcF9jb25maWc7Ci0gICAgRklMRSAqIGZwX3RhcmdldDsKLSAgICBGSUxFICogZnBfZmluZDsKLQotICAgIGludCBidWZmZXJfc2l6ZTsKLQotICAgIGNoYXIgKiBsaW5lOwotICAgIGNoYXIgKiBvbGRfbGluZTsKLSAgICBjaGFyICogbGlzdF90YXJnZXQ7Ci0gICAgY2hhciAqIHB0YXJnZXQ7Ci0KLSAgICBzdHJ1Y3Qgc3RhdCBzdGF0X2J1ZjsKLQotICAgIC8qIENoZWNrIGFyZyBjb3VudC4gKi8KLSAgICBpZiAoYXJnYyAhPSAzKQotICAgIHsKLQlmcHJpbnRmKHN0ZGVyciwgIiVzOiB3cm9uZyBudW1iZXIgb2YgYXJndW1lbnRzLlxuIiwgYXJndlswXSk7Ci0JZXhpdCgxKTsKLSAgICB9Ci0KLSAgICBzdHJfbXlfbmFtZSAgICAgICA9IGFyZ3ZbMF07Ci0gICAgc3RyX2ZpbGVfYXV0b2NvbmYgPSBhcmd2WzFdOwotICAgIHN0cl9kaXJfY29uZmlnICAgID0gYXJndlsyXTsKLQotICAgIC8qIEZpbmQgYSBidWZmZXIgc2l6ZS4gKi8KLSAgICBpZiAoc3RhdChzdHJfZmlsZV9hdXRvY29uZiwgJnN0YXRfYnVmKSAhPSAwKQotCUVSUk9SX0VYSVQoc3RyX2ZpbGVfYXV0b2NvbmYpOwotICAgIGJ1ZmZlcl9zaXplID0gMiAqIHN0YXRfYnVmLnN0X3NpemUgKyA0MDk2OwotCi0gICAgLyogQWxsb2NhdGUgYnVmZmVycy4gKi8KLSAgICBpZiAoIChsaW5lICAgICAgICA9IG1hbGxvYyhidWZmZXJfc2l6ZSkpID09IE5VTEwKLSAgICB8fCAgIChvbGRfbGluZSAgICA9IG1hbGxvYyhidWZmZXJfc2l6ZSkpID09IE5VTEwKLSAgICB8fCAgIChsaXN0X3RhcmdldCA9IG1hbGxvYyhidWZmZXJfc2l6ZSkpID09IE5VTEwgKQotCUVSUk9SX0VYSVQoc3RyX2ZpbGVfYXV0b2NvbmYpOwotCi0gICAgLyogT3BlbiBhdXRvY29uZmlnIGZpbGUuICovCi0gICAgaWYgKChmcF9jb25maWcgPSBmb3BlbihzdHJfZmlsZV9hdXRvY29uZiwgInIiKSkgPT0gTlVMTCkKLQlFUlJPUl9FWElUKHN0cl9maWxlX2F1dG9jb25mKTsKLQotICAgIC8qIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeSBpZiBuZWVkZWQuICovCi0gICAgaWYgKHN0YXQoc3RyX2Rpcl9jb25maWcsICZzdGF0X2J1ZikgIT0gMCkKLSAgICB7Ci0JaWYgKG1rZGlyKHN0cl9kaXJfY29uZmlnLCAwNzU1KSAhPSAwKQotCSAgICBFUlJPUl9FWElUKHN0cl9kaXJfY29uZmlnKTsKLSAgICB9Ci0KLSAgICAvKiBDaGFuZ2UgdG8gb3V0cHV0IGRpcmVjdG9yeS4gKi8KLSAgICBpZiAoY2hkaXIoc3RyX2Rpcl9jb25maWcpICE9IDApCi0JRVJST1JfRVhJVChzdHJfZGlyX2NvbmZpZyk7Ci0KLSAgICAvKiBQdXQgaW5pdGlhbCBzZXBhcmF0b3IgaW50byB0YXJnZXQgbGlzdC4gKi8KLSAgICBwdGFyZ2V0ID0gbGlzdF90YXJnZXQ7Ci0gICAgKnB0YXJnZXQrKyA9ICdcbic7Ci0KLSAgICAvKiBSZWFkIGNvbmZpZyBsaW5lcy4gKi8KLSAgICB3aGlsZSAoZmdldHMobGluZSwgYnVmZmVyX3NpemUsIGZwX2NvbmZpZykpCi0gICAgewotCWNvbnN0IGNoYXIgKiBzdHJfY29uZmlnOwotCWludCBpc19zYW1lOwotCWludCBpdGFyZ2V0OwotCi0JaWYgKGxpbmVbMF0gIT0gJyMnKQotCSAgICBjb250aW51ZTsKLQlpZiAoKHN0cl9jb25maWcgPSBzdHJzdHIobGluZSwgIkNPTkZJR18iKSkgPT0gTlVMTCkKLQkgICAgY29udGludWU7Ci0KLQkvKiBNYWtlIHRoZSBvdXRwdXQgZmlsZSBuYW1lLiAqLwotCXN0cl9jb25maWcgKz0gc2l6ZW9mKCJDT05GSUdfIikgLSAxOwotCWZvciAoaXRhcmdldCA9IDA7ICFpc3NwYWNlKHN0cl9jb25maWdbaXRhcmdldF0pOyBpdGFyZ2V0KyspCi0JewotCSAgICBpbnQgYyA9ICh1bnNpZ25lZCBjaGFyKSBzdHJfY29uZmlnW2l0YXJnZXRdOwotCSAgICBpZiAoaXN1cHBlcihjKSkgYyA9IHRvbG93ZXIoYyk7Ci0JICAgIGlmIChjID09ICdfJykgICBjID0gJy8nOwotCSAgICBwdGFyZ2V0W2l0YXJnZXRdID0gYzsKLQl9Ci0JcHRhcmdldFtpdGFyZ2V0KytdID0gJy4nOwotCXB0YXJnZXRbaXRhcmdldCsrXSA9ICdoJzsKLQlwdGFyZ2V0W2l0YXJnZXQrK10gPSAnXDAnOwotCi0JLyogQ2hlY2sgZm9yIGV4aXN0aW5nIGZpbGUuICovCi0JaXNfc2FtZSA9IDA7Ci0JaWYgKChmcF90YXJnZXQgPSBmb3BlbihwdGFyZ2V0LCAiciIpKSAhPSBOVUxMKQotCXsKLQkgICAgZmdldHMob2xkX2xpbmUsIGJ1ZmZlcl9zaXplLCBmcF90YXJnZXQpOwotCSAgICBpZiAoZmNsb3NlKGZwX3RhcmdldCkgIT0gMCkKLQkJRVJST1JfRVhJVChwdGFyZ2V0KTsKLQkgICAgaWYgKCFzdHJjbXAobGluZSwgb2xkX2xpbmUpKQotCQlpc19zYW1lID0gMTsKLQl9Ci0KLQlpZiAoIWlzX3NhbWUpCi0JewotCSAgICAvKiBBdXRvLWNyZWF0ZSBkaXJlY3Rvcmllcy4gKi8KLQkgICAgaW50IGlzbGFzaDsKLQkgICAgZm9yIChpc2xhc2ggPSAwOyBpc2xhc2ggPCBpdGFyZ2V0OyBpc2xhc2grKykKLQkgICAgewotCQlpZiAocHRhcmdldFtpc2xhc2hdID09ICcvJykKLQkJewotCQkgICAgcHRhcmdldFtpc2xhc2hdID0gJ1wwJzsKLQkJICAgIGlmIChzdGF0KHB0YXJnZXQsICZzdGF0X2J1ZikgIT0gMAotCQkgICAgJiYgIG1rZGlyKHB0YXJnZXQsIDA3NTUpICAgICAhPSAwKQotCQkJRVJST1JfRVhJVCggcHRhcmdldCApOwotCQkgICAgcHRhcmdldFtpc2xhc2hdID0gJy8nOwotCQl9Ci0JICAgIH0KLQotCSAgICAvKiBXcml0ZSB0aGUgZmlsZS4gKi8KLQkgICAgaWYgKChmcF90YXJnZXQgPSBmb3BlbihwdGFyZ2V0LCAidyIgKSkgPT0gTlVMTCkKLQkJRVJST1JfRVhJVChwdGFyZ2V0KTsKLQkgICAgZnB1dHMobGluZSwgZnBfdGFyZ2V0KTsKLQkgICAgaWYgKGZlcnJvcihmcF90YXJnZXQpIHx8IGZjbG9zZShmcF90YXJnZXQpICE9IDApCi0JCUVSUk9SX0VYSVQocHRhcmdldCk7Ci0JfQotCi0JLyogVXBkYXRlIHRhcmdldCBsaXN0ICovCi0JcHRhcmdldCArPSBpdGFyZ2V0OwotCSoocHRhcmdldC0xKSA9ICdcbic7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBDbG9zZSBhdXRvY29uZmlnIGZpbGUuCi0gICAgICogVGVybWluYXRlIHRoZSB0YXJnZXQgbGlzdC4KLSAgICAgKi8KLSAgICBpZiAoZmNsb3NlKGZwX2NvbmZpZykgIT0gMCkKLQlFUlJPUl9FWElUKHN0cl9maWxlX2F1dG9jb25mKTsKLSAgICAqcHRhcmdldCA9ICdcMCc7Ci0KLSAgICAvKgotICAgICAqIEZpeCB1cCBleGlzdGluZyBmaWxlcyB3aGljaCBoYXZlIG5vIG5ldyB2YWx1ZS4KLSAgICAgKiBUaGlzIGlzIENhc2UgNCBhbmQgQ2FzZSA1LgotICAgICAqCi0gICAgICogSSByZS1yZWFkIHRoZSB0cmVlIGFuZCBmaWx0ZXIgaXQgYWdhaW5zdCBsaXN0X3RhcmdldC4KLSAgICAgKiBUaGlzIGlzIGNydWRlLiAgQnV0IGl0IGF2b2lkcyBkYXRhIGNvcGllcy4gIEFsc28sIGxpc3RfdGFyZ2V0Ci0gICAgICogaXMgY29tcGFjdCBhbmQgY29udGlndW91cywgc28gaXQgZWFzaWx5IGZpdHMgaW50byBjYWNoZS4KLSAgICAgKgotICAgICAqIE5vdGljZSB0aGF0IGxpc3RfdGFyZ2V0IGNvbnRhaW5zIHN0cmluZ3Mgc2VwYXJhdGVkIGJ5IFxuLAotICAgICAqIHdpdGggYSBcbiBiZWZvcmUgdGhlIGZpcnN0IHN0cmluZyBhbmQgYWZ0ZXIgdGhlIGxhc3QuCi0gICAgICogZmdldHMgZ2l2ZXMgdGhlIGluY29taW5nIG5hbWVzIGEgdGVybWluYXRpbmcgXG4uCi0gICAgICogU28gYnkgaGF2aW5nIGFuIGluaXRpYWwgXG4sIHN0cnN0ciB3aWxsIGZpbmQgZXhhY3QgbWF0Y2hlcy4KLSAgICAgKi8KLQotICAgIGZwX2ZpbmQgPSBwb3BlbigiZmluZCAqIC10eXBlIGYgLW5hbWUgXCIqLmhcIiAtcHJpbnQiLCAiciIpOwotICAgIGlmIChmcF9maW5kID09IDApCi0JRVJST1JfRVhJVCggImZpbmQiICk7Ci0KLSAgICBsaW5lWzBdID0gJ1xuJzsKLSAgICB3aGlsZSAoZmdldHMobGluZSsxLCBidWZmZXJfc2l6ZSwgZnBfZmluZCkpCi0gICAgewotCWlmIChzdHJzdHIobGlzdF90YXJnZXQsIGxpbmUpID09IE5VTEwpCi0JewotCSAgICAvKgotCSAgICAgKiBUaGlzIGlzIGFuIG9sZCBmaWxlIHdpdGggbm8gQ09ORklHXyogZmxhZyBpbiBhdXRvY29uZi5oLgotCSAgICAgKi8KLQotCSAgICAvKiBGaXJzdCBzdHJpcCB0aGUgXG4uICovCi0JICAgIGxpbmVbc3RybGVuKGxpbmUpLTFdID0gJ1wwJzsKLQotCSAgICAvKiBHcmFiIHNpemUuICovCi0JICAgIGlmIChzdGF0KGxpbmUrMSwgJnN0YXRfYnVmKSAhPSAwKQotCQlFUlJPUl9FWElUKGxpbmUpOwotCi0JICAgIC8qIElmIGZpbGUgaXMgbm90IGVtcHR5LCBtYWtlIGl0IGVtcHR5IGFuZCBnaXZlIGl0IGEgZnJlc2ggZGF0ZS4gKi8KLQkgICAgaWYgKHN0YXRfYnVmLnN0X3NpemUgIT0gMCkKLQkgICAgewotCQlpZiAoKGZwX3RhcmdldCA9IGZvcGVuKGxpbmUrMSwgInciKSkgPT0gTlVMTCkKLQkJICAgIEVSUk9SX0VYSVQobGluZSk7Ci0JCWlmIChmY2xvc2UoZnBfdGFyZ2V0KSAhPSAwKQotCQkgICAgRVJST1JfRVhJVChsaW5lKTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgICBpZiAocGNsb3NlKGZwX2ZpbmQpICE9IDApCi0JRVJST1JfRVhJVCgiZmluZCIpOwotCi0gICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9zY3JpcHRzL2Jsb2F0LW8tbWV0ZXIgYi9zY3JpcHRzL2Jsb2F0LW8tbWV0ZXIKaW5kZXggNzVmMjFkOC4uY2U1OWZjMiAxMDA3NTUKLS0tIGEvc2NyaXB0cy9ibG9hdC1vLW1ldGVyCisrKyBiL3NjcmlwdHMvYmxvYXQtby1tZXRlcgpAQCAtMTgsNyArMTgsOCBAQAogICAgIGZvciBsIGluIG9zLnBvcGVuKCJubSAtLXNpemUtc29ydCAiICsgZmlsZSkucmVhZGxpbmVzKCk6CiAgICAgICAgIHNpemUsIHR5cGUsIG5hbWUgPSBsWzotMV0uc3BsaXQoKQogICAgICAgICBpZiB0eXBlIGluICJ0VGREYkIiOgotICAgICAgICAgICAgc3ltW25hbWVdID0gaW50KHNpemUsIDE2KQorICAgICAgICAgICAgaWYgIi4iIGluIG5hbWU6IG5hbWUgPSAic3RhdGljLiIgKyBuYW1lLnNwbGl0KCIuIilbMF0KKyAgICAgICAgICAgIHN5bVtuYW1lXSA9IHN5bS5nZXQobmFtZSwgMCkgKyBpbnQoc2l6ZSwgMTYpCiAgICAgcmV0dXJuIHN5bQogCiBvbGQgPSBnZXRzaXplcyhzeXMuYXJndlsxXSkKZGlmZiAtLWdpdCBhL3NjcmlwdHMvY2hlY2tzdGFjay5wbCBiL3NjcmlwdHMvY2hlY2tzdGFjay5wbAppbmRleCBkYWRmYTIwLi5iMzQ5MjQ2IDEwMDc1NQotLS0gYS9zY3JpcHRzL2NoZWNrc3RhY2sucGwKKysrIGIvc2NyaXB0cy9jaGVja3N0YWNrLnBsCkBAIC04OSwxMSArODksMjEgQEAKICMKIG15ICRmdW5jcmUgPSBxci9eJHgqIDwoLiopPjokLzsKIG15ICRmdW5jOworbXkgJGZpbGUsICRsYXN0c2xhc2g7CisKIHdoaWxlIChteSAkbGluZSA9IDxTVERJTj4pIHsKIAlpZiAoJGxpbmUgPX4gbS8kZnVuY3JlLykgewogCQkkZnVuYyA9ICQxOwogCX0KLQlpZiAoJGxpbmUgPX4gbS8kcmUvKSB7CisJZWxzaWYgKCRsaW5lID1+IG0vKC4qKTpccypmaWxlIGZvcm1hdC8pIHsKKwkJJGZpbGUgPSAkMTsKKwkJJGZpbGUgPX4gcy9cLmtvLy87CisJCSRsYXN0c2xhc2ggPSByaW5kZXgoJGZpbGUsICIvIik7CisJCWlmICgkbGFzdHNsYXNoICE9IC0xKSB7CisJCQkkZmlsZSA9IHN1YnN0cigkZmlsZSwgJGxhc3RzbGFzaCArIDEpOworCQl9CisJfQorCWVsc2lmICgkbGluZSA9fiBtLyRyZS8pIHsKIAkJbXkgJHNpemUgPSAkMTsKIAkJJHNpemUgPSBoZXgoJHNpemUpIGlmICgkc2l6ZSA9fiAvXjB4Lyk7CiAKQEAgLTEwOSw3ICsxMTksNyBAQAogCQkkYWRkciA9fiBzLyAvMC9nOwogCQkkYWRkciA9ICIweCRhZGRyIjsKIAotCQlteSAkaW50cm8gPSAiJGFkZHIgJGZ1bmM6IjsKKwkJbXkgJGludHJvID0gIiRhZGRyICRmdW5jIFskZmlsZV06IjsKIAkJbXkgJHBhZGxlbiA9IDU2IC0gbGVuZ3RoKCRpbnRybyk7CiAJCXdoaWxlICgkcGFkbGVuID4gMCkgewogCQkJJGludHJvIC49ICcJJzsKZGlmZiAtLWdpdCBhL3NjcmlwdHMvZXhwb3J0X3JlcG9ydC5wbCBiL3NjcmlwdHMvZXhwb3J0X3JlcG9ydC5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWQwMGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9leHBvcnRfcmVwb3J0LnBsCkBAIC0wLDAgKzEsMTY5IEBACisjIS91c3IvYmluL3BlcmwgLXcKKyMKKyMgKEMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwNi4KKyMJUmVsZWFzZWQgdW5kZXIgR1BMIHYyLgorIwlBdXRob3IgOiBSYW0gUGFpIChsaW51eHJhbUB1cy5pYm0uY29tKQorIworIyBVc2FnZTogZXhwb3J0X3JlcG9ydC5wbCAtayBNb2R1bGUuc3ltdmVycyBbLW8gcmVwb3J0X2ZpbGUgXSAtZiAqLm1vZC5jCisjCisKK3VzZSBHZXRvcHQ6OlN0ZDsKK3VzZSBzdHJpY3Q7CisKK3N1YiBudW1lcmljYWxseSB7CisJbXkgJG5vMSA9IChzcGxpdCAvXHMrLywgJGEpWzFdOworCW15ICRubzIgPSAoc3BsaXQgL1xzKy8sICRiKVsxXTsKKwlyZXR1cm4gJG5vMSA8PT4gJG5vMjsKK30KKworc3ViIGFscGhhYmV0aWNhbGx5IHsKKwlteSAoJG1vZHVsZTEsICR2YWx1ZTEpID0gQHskYX07CisJbXkgKCRtb2R1bGUyLCAkdmFsdWUyKSA9IEB7JGJ9OworCXJldHVybiAkdmFsdWUxIDw9PiAkdmFsdWUyIHx8ICRtb2R1bGUyIGNtcCAkbW9kdWxlMTsKK30KKworc3ViIHByaW50X2RlcGVuZHNfb24geworCW15ICgkaHJlZikgPSBAXzsKKwlwcmludCAiXG4iOworCXdoaWxlIChteSAoJG1vZCwgJGxpc3QpID0gZWFjaCAlJGhyZWYpIHsKKwkJcHJpbnQgIlx0JG1vZDpcbiI7CisJCWZvcmVhY2ggbXkgJHN5bSAoc29ydCBudW1lcmljYWxseSBAeyRsaXN0fSkgeworCQkJbXkgKCRzeW1ib2wsICRubykgPSBzcGxpdCAvXHMrLywgJHN5bTsKKwkJCXByaW50ZigiXHRcdCUtMjVzXHQlLTI1ZFxuIiwgJHN5bWJvbCwgJG5vKTsKKwkJfQorCQlwcmludCAiXG4iOworCX0KKwlwcmludCAiXG4iOworCXByaW50ICJ+Ing4MCAsICJcbiI7Cit9CisKK3N1YiB1c2FnZSB7CisgICAgICAgIHByaW50ICJVc2FnZTogQF8gLWggLWsgTW9kdWxlLnN5bXZlcnMgIFsgLW8gb3V0cHV0ZmlsZSBdIFxuIiwKKwkgICAgICAiXHQtZjogdHJlYXQgYWxsIHRoZSBub24tb3B0aW9uIGFyZ3VtZW50IGFzIC5tb2QuYyBmaWxlcy4gIiwKKwkgICAgICAiUmVjb21tZW5kIHVzaW5nIHRoaXMgYXMgdGhlIGxhc3Qgb3B0aW9uXG4iLAorCSAgICAgICJcdC1oOiBwcmludCBkZXRhaWxlZCBoZWxwXG4iLAorCSAgICAgICJcdC1rOiB0aGUgcGF0aCB0byBNb2R1bGUuc3ltdmVycyBmaWxlLiBCeSBkZWZhdWx0IHVzZXMgIiwKKwkgICAgICAidGhlIGZpbGUgZnJvbSB0aGUgY3VycmVudCBkaXJlY3RvcnlcbiIsCisJICAgICAgIlx0LW8gb3V0cHV0ZmlsZTogb3V0cHV0IHRoZSByZXBvcnQgdG8gb3V0cHV0ZmlsZVxuIjsKKwlleGl0IDA7Cit9CisKK3N1YiBjb2xsZWN0Y2ZpbGVzIHsKKyAgICAgICAgbXkgQGZpbGUgPSBgY2F0IC50bXBfdmVyc2lvbnMvKi5tb2QgfCBncmVwICcuKlwua29cJCdgOworICAgICAgICBAZmlsZSA9IGdyZXAge3MvXC5rby8ubW9kLmMvfSBAZmlsZTsKKwljaG9tcCBAZmlsZTsKKyAgICAgICAgcmV0dXJuIEBmaWxlOworfQorCitteSAoJVNZTUJPTCwgJU1PRFVMRSwgJW9wdCwgQGFsbGNmaWxlcyk7CisKK2lmIChub3QgZ2V0b3B0cygnaGs6bzpmJyxcJW9wdCkgb3IgZGVmaW5lZCAkb3B0eydoJ30pIHsKKyAgICAgICAgdXNhZ2UoJDApOworfQorCitpZiAoZGVmaW5lZCAkb3B0eydmJ30pIHsKKwlAYWxsY2ZpbGVzID0gQEFSR1Y7Cit9IGVsc2UgeworCUBhbGxjZmlsZXMgPSBjb2xsZWN0Y2ZpbGVzKCk7Cit9CisKK2lmIChub3QgZGVmaW5lZCAkb3B0eydrJ30pIHsKKwkkb3B0eydrJ30gPSAiTW9kdWxlLnN5bXZlcnMiOworfQorCit1bmxlc3MgKG9wZW4oTU9EVUxFX1NZTVZFUlMsICRvcHR7J2snfSkpIHsKKwlkaWUgIlNvcnJ5LCBjYW5ub3Qgb3BlbiAkb3B0eydrJ306ICQhXG4iOworfQorCitpZiAoZGVmaW5lZCAkb3B0eydvJ30pIHsKKwl1bmxlc3MgKG9wZW4oT1VUUFVUX0hBTkRMRSwgIj4kb3B0eydvJ30iKSkgeworCQlkaWUgIlNvcnJ5LCBjYW5ub3Qgb3BlbiAkb3B0eydvJ30gJCFcbiI7CisJfQorCXNlbGVjdCBPVVRQVVRfSEFORExFOworfQorIworIyBjb2xsZWN0IGFsbCB0aGUgc3ltYm9scyBhbmQgdGhlaXIgYXR0cmlidXRlcyBmcm9tIHRoZQorIyBNb2R1bGUuc3ltdmVycyBmaWxlCisjCit3aGlsZSAoIDxNT0RVTEVfU1lNVkVSUz4gKSB7CisJY2hvbXA7CisJbXkgKHVuZGVmLCAkc3ltYm9sLCAkbW9kdWxlLCAkZ3BsKSA9IHNwbGl0OworCSRTWU1CT0wgeyAkc3ltYm9sIH0gPSAgWyAkbW9kdWxlICwgIjAiICwgJHN5bWJvbCwgJGdwbF07Cit9CitjbG9zZShNT0RVTEVfU1lNVkVSUyk7CisKKyMKKyMgY29sbGVjdCB0aGUgdXNhZ2UgY291bnQgb2YgZWFjaCBzeW1ib2wuCisjCitmb3JlYWNoIG15ICR0aGlzbW9kIChAYWxsY2ZpbGVzKSB7CisJdW5sZXNzIChvcGVuKE1PRFVMRV9NT0RVTEUsICR0aGlzbW9kKSkgeworCQlwcmludCAiU29ycnksIGNhbm5vdCBvcGVuICR0aGlzbW9kOiAkIVxuIjsKKwkJbmV4dDsKKwl9CisJbXkgJHN0YXRlPTA7CisJd2hpbGUgKCA8TU9EVUxFX01PRFVMRT4gKSB7CisJCWNob21wOworCQlpZiAoJHN0YXRlIGVxIDApIHsKKwkJCSRzdGF0ZSA9IDEgaWYgKCRfID1+IC9zdGF0aWMgY29uc3Qgc3RydWN0IG1vZHZlcnNpb25faW5mby8pOworCQkJbmV4dDsKKwkJfQorCQlpZiAoJHN0YXRlIGVxIDEpIHsKKwkJCSRzdGF0ZSA9IDIgaWYgKCRfID1+IC9fX2F0dHJpYnV0ZV9fXChcKHNlY3Rpb25cKCJfX3ZlcnNpb25zIlwpXClcKS8pOworCQkJbmV4dDsKKwkJfQorCQlpZiAoJHN0YXRlIGVxIDIpIHsKKwkJCWlmICggJF8gIX4gLzB4WzAtOWEtZl17Nyw4fSwvICkgeworCQkJCW5leHQ7CisJCQl9CisJCQlteSAkc3ltID0gKHNwbGl0IC8oWywiXSkvLClbNF07CisJCQlteSAoJG1vZHVsZSwgJHZhbHVlLCAkc3ltYm9sLCAkZ3BsKSA9IEB7JFNZTUJPTHskc3ltfX07CisJCQkkU1lNQk9MeyAkc3ltIH0gPSAgWyAkbW9kdWxlLCAkdmFsdWUrMSwgJHN5bWJvbCwgJGdwbF07CisJCQlwdXNoKEB7JE1PRFVMRXskdGhpc21vZH19ICwgJHN5bSk7CisJCX0KKwl9CisJaWYgKCRzdGF0ZSBuZSAyKSB7CisJCXByaW50ICJXQVJOSU5HOiR0aGlzbW9kIGlzIG5vdCBidWlsdCB3aXRoIENPTkZJR19NT0RWRVJTSU9OIGVuYWJsZWRcbiI7CisJfQorCWNsb3NlKE1PRFVMRV9NT0RVTEUpOworfQorCitwcmludCAiXHRUaGlzIGZpbGUgcmVwb3J0cyB0aGUgZXhwb3J0ZWQgc3ltYm9scyB1c2FnZSBwYXR0ZXJucyBieSBpbi10cmVlXG4iLAorCSJcdFx0XHRcdG1vZHVsZXNcbiI7CitwcmludGYoIiVzXG5cblxuIiwieCJ4ODApOworcHJpbnRmKCJcdFx0XHRcdElOREVYXG5cblxuIik7CitwcmludGYoIlNFQ1RJT04gMTogVXNhZ2UgY291bnRzIG9mIGFsbCBleHBvcnRlZCBzeW1ib2xzXG4iKTsKK3ByaW50ZigiU0VDVElPTiAyOiBMaXN0IG9mIG1vZHVsZXMgYW5kIHRoZSBleHBvcnRlZCBzeW1ib2xzIHRoZXkgdXNlXG4iKTsKK3ByaW50ZigiJXNcblxuXG4iLCJ4Ing4MCk7CitwcmludGYoIlNFQ1RJT04gMTpcdFRoZSBleHBvcnRlZCBzeW1ib2xzIGFuZCB0aGVpciB1c2FnZSBjb3VudFxuXG4iKTsKK3ByaW50ZigiJS0yNXNcdCUtMjVzXHQlLTVzXHQlLTI1c1xuIiwgIlN5bWJvbCIsICJNb2R1bGUiLCAiVXNhZ2UgY291bnQiLAorCSJleHBvcnQgdHlwZSIpOworCisjCisjIHByaW50IHRoZSBsaXN0IG9mIHVudXNlZCBleHBvcnRlZCBzeW1ib2xzCisjCitmb3JlYWNoIG15ICRsaXN0IChzb3J0IGFscGhhYmV0aWNhbGx5IHZhbHVlcyglU1lNQk9MKSkgeworCW15ICgkbW9kdWxlLCAkdmFsdWUsICRzeW1ib2wsICRncGwpID0gQHskbGlzdH07CisJcHJpbnRmKCIlLTI1c1x0JS0yNXNcdCUtMTBzXHQiLCAkc3ltYm9sLCAkbW9kdWxlLCAkdmFsdWUpOworCWlmIChkZWZpbmVkICRncGwpIHsKKwkJcHJpbnRmKCIlLTI1c1xuIiwkZ3BsKTsKKwl9IGVsc2UgeworCQlwcmludGYoIlxuIik7CisJfQorfQorcHJpbnRmKCIlc1xuXG5cbiIsIngieDgwKTsKKworcHJpbnRmKCJTRUNUSU9OIDI6XG5cdFRoaXMgc2VjdGlvbiByZXBvcnRzIGV4cG9ydC1zeW1ib2wtdXNhZ2Ugb2YgaW4ta2VybmVsCittb2R1bGVzLiBFYWNoIG1vZHVsZSBsaXN0cyB0aGUgbW9kdWxlcywgYW5kIHRoZSBzeW1ib2xzIGZyb20gdGhhdCBtb2R1bGUgdGhhdAoraXQgdXNlcy4gIEVhY2ggbGlzdGVkIHN5bWJvbCByZXBvcnRzIHRoZSBudW1iZXIgb2YgbW9kdWxlcyB1c2luZyBpdFxuIik7CisKK3ByaW50ICJ+Ing4MCAsICJcbiI7Cit3aGlsZSAobXkgKCR0aGlzbW9kLCAkbGlzdCkgPSBlYWNoICVNT0RVTEUpIHsKKwlteSAlZGVwZW5kczsKKwkkdGhpc21vZCA9fiBzL1wubW9kXC5jLy5rby87CisJcHJpbnQgIlx0XHRcdCR0aGlzbW9kXG4iOworCWZvcmVhY2ggbXkgJHN5bWJvbCAoQHskbGlzdH0pIHsKKwkJbXkgKCRtb2R1bGUsICR2YWx1ZSwgdW5kZWYsICRncGwpID0gQHskU1lNQk9MeyRzeW1ib2x9fTsKKwkJcHVzaCAoQHskZGVwZW5kc3siJG1vZHVsZSJ9fSwgIiRzeW1ib2wgJHZhbHVlIik7CisJfQorCXByaW50X2RlcGVuZHNfb24oXCVkZXBlbmRzKTsKK30KZGlmZiAtLWdpdCBhL3NjcmlwdHMvZ2Vua3N5bXMvZ2Vua3N5bXMuYyBiL3NjcmlwdHMvZ2Vua3N5bXMvZ2Vua3N5bXMuYwppbmRleCA1YjAzNDRlLi5iMDM4MTgyIDEwMDY0NAotLS0gYS9zY3JpcHRzL2dlbmtzeW1zL2dlbmtzeW1zLmMKKysrIGIvc2NyaXB0cy9nZW5rc3ltcy9nZW5rc3ltcy5jCkBAIC00Miw3ICs0Miw3IEBACiBpbnQgY3VyX2xpbmUgPSAxOwogY2hhciAqY3VyX2ZpbGVuYW1lOwogCi1zdGF0aWMgaW50IGZsYWdfZGVidWcsIGZsYWdfZHVtcF9kZWZzLCBmbGFnX3dhcm5pbmdzOworc3RhdGljIGludCBmbGFnX2RlYnVnLCBmbGFnX2R1bXBfZGVmcywgZmxhZ19kdW1wX3R5cGVzLCBmbGFnX3dhcm5pbmdzOwogc3RhdGljIGNvbnN0IGNoYXIgKmFyY2ggPSAiIjsKIHN0YXRpYyBjb25zdCBjaGFyICptb2RfcHJlZml4ID0gIiI7CiAKQEAgLTUwLDYgKzUwLDcgQEAKIHN0YXRpYyBpbnQgbnN5bXM7CiAKIHN0YXRpYyBzdHJ1Y3Qgc3ltYm9sICpleHBhbnNpb25fdHJhaWw7CitzdGF0aWMgc3RydWN0IHN5bWJvbCAqdmlzaXRlZF9zeW1ib2xzOwogCiBzdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgc3ltYm9sX3R5cGVfbmFtZVtdID0gewogCSJub3JtYWwiLCAidHlwZWRlZiIsICJlbnVtIiwgInN0cnVjdCIsICJ1bmlvbiIKQEAgLTE3Niw2ICsxNzcsNyBAQAogCXN5bS0+dHlwZSA9IHR5cGU7CiAJc3ltLT5kZWZuID0gZGVmbjsKIAlzeW0tPmV4cGFuc2lvbl90cmFpbCA9IE5VTEw7CisJc3ltLT52aXNpdGVkID0gTlVMTDsKIAlzeW0tPmlzX2V4dGVybiA9IGlzX2V4dGVybjsKIAogCXN5bS0+aGFzaF9uZXh0ID0gc3ltdGFiW2hdOwpAQCAtMjM2LDI2ICsyMzgsMTEgQEAKIAogc3RhdGljIHZvaWQgcHJpbnRfbm9kZShGSUxFICogZiwgc3RydWN0IHN0cmluZ19saXN0ICpsaXN0KQogewotCXN3aXRjaCAobGlzdC0+dGFnKSB7Ci0JY2FzZSBTWU1fU1RSVUNUOgotCQlwdXRjKCdzJywgZik7Ci0JCWdvdG8gcHJpbnRpdDsKLQljYXNlIFNZTV9VTklPTjoKLQkJcHV0YygndScsIGYpOwotCQlnb3RvIHByaW50aXQ7Ci0JY2FzZSBTWU1fRU5VTToKLQkJcHV0YygnZScsIGYpOwotCQlnb3RvIHByaW50aXQ7Ci0JY2FzZSBTWU1fVFlQRURFRjoKLQkJcHV0YygndCcsIGYpOwotCQlnb3RvIHByaW50aXQ7Ci0KLQkgICAgICBwcmludGl0OgorCWlmIChsaXN0LT50YWcgIT0gU1lNX05PUk1BTCkgeworCQlwdXRjKHN5bWJvbF90eXBlX25hbWVbbGlzdC0+dGFnXVswXSwgZik7CiAJCXB1dGMoJyMnLCBmKTsKLQljYXNlIFNZTV9OT1JNQUw6Ci0JCWZwdXRzKGxpc3QtPnN0cmluZywgZik7Ci0JCWJyZWFrOwogCX0KKwlmcHV0cyhsaXN0LT5zdHJpbmcsIGYpOwogfQogCiBzdGF0aWMgdm9pZCBwcmludF9saXN0KEZJTEUgKiBmLCBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKmxpc3QpCkBAIC0yODcsOSArMjc0LDkgQEAKIAl9CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGV4cGFuZF9hbmRfY3JjX2xpc3Qoc3RydWN0IHN0cmluZ19saXN0ICpsaXN0LAotCQkJCQkgdW5zaWduZWQgbG9uZyBjcmMpCitzdGF0aWMgdW5zaWduZWQgbG9uZyBleHBhbmRfYW5kX2NyY19zeW0oc3RydWN0IHN5bWJvbCAqc3ltLCB1bnNpZ25lZCBsb25nIGNyYykKIHsKKwlzdHJ1Y3Qgc3RyaW5nX2xpc3QgKmxpc3QgPSBzeW0tPmRlZm47CiAJc3RydWN0IHN0cmluZ19saXN0ICoqZSwgKipiOwogCXN0cnVjdCBzdHJpbmdfbGlzdCAqdG1wLCAqKnRtcDI7CiAJaW50IGVsZW0gPSAxOwpAQCAtMzMyLDcgKzMxOSw3IEBACiAJCQl9IGVsc2UgewogCQkJCXN1YnN5bS0+ZXhwYW5zaW9uX3RyYWlsID0gZXhwYW5zaW9uX3RyYWlsOwogCQkJCWV4cGFuc2lvbl90cmFpbCA9IHN1YnN5bTsKLQkJCQljcmMgPSBleHBhbmRfYW5kX2NyY19saXN0KHN1YnN5bS0+ZGVmbiwgY3JjKTsKKwkJCQljcmMgPSBleHBhbmRfYW5kX2NyY19zeW0oc3Vic3ltLCBjcmMpOwogCQkJfQogCQkJYnJlYWs7CiAKQEAgLTM4MiwxMiArMzY5LDIyIEBACiAJCQl9IGVsc2UgewogCQkJCXN1YnN5bS0+ZXhwYW5zaW9uX3RyYWlsID0gZXhwYW5zaW9uX3RyYWlsOwogCQkJCWV4cGFuc2lvbl90cmFpbCA9IHN1YnN5bTsKLQkJCQljcmMgPSBleHBhbmRfYW5kX2NyY19saXN0KHN1YnN5bS0+ZGVmbiwgY3JjKTsKKwkJCQljcmMgPSBleHBhbmRfYW5kX2NyY19zeW0oc3Vic3ltLCBjcmMpOwogCQkJfQogCQkJYnJlYWs7CiAJCX0KIAl9CiAKKwl7CisJCXN0YXRpYyBzdHJ1Y3Qgc3ltYm9sICoqZW5kID0gJnZpc2l0ZWRfc3ltYm9sczsKKworCQlpZiAoIXN5bS0+dmlzaXRlZCkgeworCQkJKmVuZCA9IHN5bTsKKwkJCWVuZCA9ICZzeW0tPnZpc2l0ZWQ7CisJCQlzeW0tPnZpc2l0ZWQgPSAoc3RydWN0IHN5bWJvbCAqKS0xTDsKKwkJfQorCX0KKwogCXJldHVybiBjcmM7CiB9CiAKQEAgLTQwNiw3ICs0MDMsNyBAQAogCiAJCWV4cGFuc2lvbl90cmFpbCA9IChzdHJ1Y3Qgc3ltYm9sICopLTFMOwogCi0JCWNyYyA9IGV4cGFuZF9hbmRfY3JjX2xpc3Qoc3ltLT5kZWZuLCAweGZmZmZmZmZmKSBeIDB4ZmZmZmZmZmY7CisJCWNyYyA9IGV4cGFuZF9hbmRfY3JjX3N5bShzeW0sIDB4ZmZmZmZmZmYpIF4gMHhmZmZmZmZmZjsKIAogCQlzeW0gPSBleHBhbnNpb25fdHJhaWw7CiAJCXdoaWxlIChzeW0gIT0gKHN0cnVjdCBzeW1ib2wgKiktMUwpIHsKQEAgLTQ2NCw2ICs0NjEsNyBAQAogCiBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiB7CisJRklMRSAqZHVtcGZpbGUgPSBOVUxMOwogCWludCBvOwogCiAjaWZkZWYgX19HTlVfTElCUkFSWV9fCkBAIC00NzMsMTUgKzQ3MSwxNiBAQAogCQl7Indhcm5pbmdzIiwgMCwgMCwgJ3cnfSwKIAkJeyJxdWlldCIsIDAsIDAsICdxJ30sCiAJCXsiZHVtcCIsIDAsIDAsICdEJ30sCisJCXsiZHVtcC10eXBlcyIsIDEsIDAsICdUJ30sCiAJCXsidmVyc2lvbiIsIDAsIDAsICdWJ30sCiAJCXsiaGVscCIsIDAsIDAsICdoJ30sCiAJCXswLCAwLCAwLCAwfQogCX07CiAKLQl3aGlsZSAoKG8gPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCAiYTpkd3FWRGs6cDoiLAorCXdoaWxlICgobyA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICJhOmR3cVZEVDprOnA6IiwKIAkJCQkmbG9uZ19vcHRzWzBdLCBOVUxMKSkgIT0gRU9GKQogI2Vsc2UJCQkJLyogX19HTlVfTElCUkFSWV9fICovCi0Jd2hpbGUgKChvID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJhOmR3cVZEazpwOiIpKSAhPSBFT0YpCisJd2hpbGUgKChvID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJhOmR3cVZEVDprOnA6IikpICE9IEVPRikKICNlbmRpZgkJCQkvKiBfX0dOVV9MSUJSQVJZX18gKi8KIAkJc3dpdGNoIChvKSB7CiAJCWNhc2UgJ2EnOgpAQCAtNTAyLDYgKzUwMSwxNCBAQAogCQljYXNlICdEJzoKIAkJCWZsYWdfZHVtcF9kZWZzID0gMTsKIAkJCWJyZWFrOworCQljYXNlICdUJzoKKwkJCWZsYWdfZHVtcF90eXBlcyA9IDE7CisJCQlkdW1wZmlsZSA9IGZvcGVuKG9wdGFyZywgInciKTsKKwkJCWlmICghZHVtcGZpbGUpIHsKKwkJCQlwZXJyb3Iob3B0YXJnKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJCWJyZWFrOwogCQljYXNlICdoJzoKIAkJCWdlbmtzeW1zX3VzYWdlKCk7CiAJCQlyZXR1cm4gMDsKQEAgLTUyNCw2ICs1MzEsMjQgQEAKIAogCXl5cGFyc2UoKTsKIAorCWlmIChmbGFnX2R1bXBfdHlwZXMgJiYgdmlzaXRlZF9zeW1ib2xzKSB7CisJCXdoaWxlICh2aXNpdGVkX3N5bWJvbHMgIT0gKHN0cnVjdCBzeW1ib2wgKiktMUwpIHsKKwkJCXN0cnVjdCBzeW1ib2wgKnN5bSA9IHZpc2l0ZWRfc3ltYm9sczsKKworCQkJaWYgKHN5bS0+dHlwZSAhPSBTWU1fTk9STUFMKSB7CisJCQkJcHV0YyhzeW1ib2xfdHlwZV9uYW1lW3N5bS0+dHlwZV1bMF0sIGR1bXBmaWxlKTsKKwkJCQlwdXRjKCcjJywgZHVtcGZpbGUpOworCQkJfQorCQkJZnB1dHMoc3ltLT5uYW1lLCBkdW1wZmlsZSk7CisJCQlwdXRjKCcgJywgZHVtcGZpbGUpOworCQkJcHJpbnRfbGlzdChkdW1wZmlsZSwgc3ltLT5kZWZuKTsKKwkJCXB1dGMoJ1xuJywgZHVtcGZpbGUpOworCisJCQl2aXNpdGVkX3N5bWJvbHMgPSBzeW0tPnZpc2l0ZWQ7CisJCQlzeW0tPnZpc2l0ZWQgPSBOVUxMOworCQl9CisJfQorCiAJaWYgKGZsYWdfZGVidWcpIHsKIAkJZnByaW50ZihkZWJ1Z2ZpbGUsICJIYXNoIHRhYmxlIG9jY3VwYW5jeSAlZC8lZCA9ICVnXG4iLAogCQkJbnN5bXMsIEhBU0hfQlVDS0VUUywKZGlmZiAtLWdpdCBhL3NjcmlwdHMvZ2Vua3N5bXMvZ2Vua3N5bXMuaCBiL3NjcmlwdHMvZ2Vua3N5bXMvZ2Vua3N5bXMuaAppbmRleCBhYjZmMzRmLi4yNjY4Mjg3IDEwMDY0NAotLS0gYS9zY3JpcHRzL2dlbmtzeW1zL2dlbmtzeW1zLmgKKysrIGIvc2NyaXB0cy9nZW5rc3ltcy9nZW5rc3ltcy5oCkBAIC00MSw2ICs0MSw3IEBACiAJZW51bSBzeW1ib2xfdHlwZSB0eXBlOwogCXN0cnVjdCBzdHJpbmdfbGlzdCAqZGVmbjsKIAlzdHJ1Y3Qgc3ltYm9sICpleHBhbnNpb25fdHJhaWw7CisJc3RydWN0IHN5bWJvbCAqdmlzaXRlZDsKIAlpbnQgaXNfZXh0ZXJuOwogfTsKIApkaWZmIC0tZ2l0IGEvc2NyaXB0cy9nZW5rc3ltcy9sZXguY19zaGlwcGVkIGIvc2NyaXB0cy9nZW5rc3ltcy9sZXguY19zaGlwcGVkCmluZGV4IDEyMTgwNTMuLjM3YmE5ODIgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvZ2Vua3N5bXMvbGV4LmNfc2hpcHBlZAorKysgYi9zY3JpcHRzL2dlbmtzeW1zL2xleC5jX3NoaXBwZWQKQEAgLTIwMjMsNyArMjAyMyw3IEBACiAgICAgICBicmVhazsKIAogICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCgpOworICAgICAgZXhpdCgxKTsKICAgICB9CiBmaW5pOgogCmRpZmYgLS1naXQgYS9zY3JpcHRzL2dlbmtzeW1zL2xleC5sIGIvc2NyaXB0cy9nZW5rc3ltcy9sZXgubAppbmRleCBmZTBkZmVlLi41ZTU0NGEwIDEwMDY0NAotLS0gYS9zY3JpcHRzL2dlbmtzeW1zL2xleC5sCisrKyBiL3NjcmlwdHMvZ2Vua3N5bXMvbGV4LmwKQEAgLTM5Miw3ICszOTIsNyBAQAogICAgICAgYnJlYWs7CiAKICAgICBkZWZhdWx0OgotICAgICAgYWJvcnQoKTsKKyAgICAgIGV4aXQoMSk7CiAgICAgfQogZmluaToKIApkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL2NvbmYuYyBiL3NjcmlwdHMva2NvbmZpZy9jb25mLmMKaW5kZXggODAxMmQxMC4uNGRjYjg4NiAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL2NvbmYuYworKysgYi9zY3JpcHRzL2tjb25maWcvY29uZi5jCkBAIC01MzksNiArNTM5LDcgQEAKICAgCW5hbWUgPSBhdltpXTsKIAlpZiAoIW5hbWUpIHsKIAkJcHJpbnRmKF8oIiVzOiBLY29uZmlnIGZpbGUgbWlzc2luZ1xuIiksIGF2WzBdKTsKKwkJZXhpdCgxKTsKIAl9CiAJY29uZl9wYXJzZShuYW1lKTsKIAkvL3pjb25mZHVtcChzdGRvdXQpOwpAQCAtNTczLDcgKzU3NCw3IEBACiAJY2FzZSBzZXRfcmFuZG9tOgogCQluYW1lID0gZ2V0ZW52KCJLQ09ORklHX0FMTENPTkZJRyIpOwogCQlpZiAobmFtZSAmJiAhc3RhdChuYW1lLCAmdG1wc3RhdCkpIHsKLQkJCWNvbmZfcmVhZF9zaW1wbGUobmFtZSk7CisJCQljb25mX3JlYWRfc2ltcGxlKG5hbWUsIFNfREVGX1VTRVIpOwogCQkJYnJlYWs7CiAJCX0KIAkJc3dpdGNoIChpbnB1dF9tb2RlKSB7CkBAIC01ODQsOSArNTg1LDkgQEAKIAkJZGVmYXVsdDogYnJlYWs7CiAJCX0KIAkJaWYgKCFzdGF0KG5hbWUsICZ0bXBzdGF0KSkKLQkJCWNvbmZfcmVhZF9zaW1wbGUobmFtZSk7CisJCQljb25mX3JlYWRfc2ltcGxlKG5hbWUsIFNfREVGX1VTRVIpOwogCQllbHNlIGlmICghc3RhdCgiYWxsLmNvbmZpZyIsICZ0bXBzdGF0KSkKLQkJCWNvbmZfcmVhZF9zaW1wbGUoImFsbC5jb25maWciKTsKKwkJCWNvbmZfcmVhZF9zaW1wbGUoImFsbC5jb25maWciLCBTX0RFRl9VU0VSKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJYnJlYWs7CkBAIC01OTksNyArNjAwLDE1IEBACiAJCQlpbnB1dF9tb2RlID0gYXNrX3NpbGVudDsKIAkJCXZhbGlkX3N0ZGluID0gMTsKIAkJfQotCX0KKwl9IGVsc2UgaWYgKHN5bV9jaGFuZ2VfY291bnQpIHsKKwkJbmFtZSA9IGdldGVudigiS0NPTkZJR19OT1NJTEVOVFVQREFURSIpOworCQlpZiAobmFtZSAmJiAqbmFtZSkgeworCQkJZnByaW50ZihzdGRlcnIsIF8oIlxuKioqIEtlcm5lbCBjb25maWd1cmF0aW9uIHJlcXVpcmVzIGV4cGxpY2l0IHVwZGF0ZS5cblxuIikpOworCQkJcmV0dXJuIDE7CisJCX0KKwl9IGVsc2UKKwkJZ290byBza2lwX2NoZWNrOworCiAJZG8gewogCQljb25mX2NudCA9IDA7CiAJCWNoZWNrX2NvbmYoJnJvb3RtZW51KTsKQEAgLTYwOCw1ICs2MTcsMTEgQEAKIAkJZnByaW50ZihzdGRlcnIsIF8oIlxuKioqIEVycm9yIGR1cmluZyB3cml0aW5nIG9mIHRoZSBrZXJuZWwgY29uZmlndXJhdGlvbi5cblxuIikpOwogCQlyZXR1cm4gMTsKIAl9Citza2lwX2NoZWNrOgorCWlmIChpbnB1dF9tb2RlID09IGFza19zaWxlbnQgJiYgY29uZl93cml0ZV9hdXRvY29uZigpKSB7CisJCWZwcmludGYoc3RkZXJyLCBfKCJcbioqKiBFcnJvciBkdXJpbmcgd3JpdGluZyBvZiB0aGUga2VybmVsIGNvbmZpZ3VyYXRpb24uXG5cbiIpKTsKKwkJcmV0dXJuIDE7CisJfQorCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvY29uZmRhdGEuYyBiL3NjcmlwdHMva2NvbmZpZy9jb25mZGF0YS5jCmluZGV4IDFiNWRmNTguLjJlZTQ4YzMgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy9jb25mZGF0YS5jCisrKyBiL3NjcmlwdHMva2NvbmZpZy9jb25mZGF0YS5jCkBAIC01LDYgKzUsNyBAQAogCiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KQEAgLTIwLDE5ICsyMSw4IEBACiBzdGF0aWMgY29uc3QgY2hhciAqY29uZl9maWxlbmFtZTsKIHN0YXRpYyBpbnQgY29uZl9saW5lbm8sIGNvbmZfd2FybmluZ3MsIGNvbmZfdW5zYXZlZDsKIAotY29uc3QgY2hhciBjb25mX2RlZl9maWxlbmFtZVtdID0gIi5jb25maWciOwotCiBjb25zdCBjaGFyIGNvbmZfZGVmbmFtZVtdID0gImFyY2gvJEFSQ0gvZGVmY29uZmlnIjsKIAotY29uc3QgY2hhciAqY29uZl9jb25mbmFtZXNbXSA9IHsKLQkiLmNvbmZpZyIsCi0JIi9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIiwKLQkiL2V0Yy9rZXJuZWwtY29uZmlnIiwKLQkiL2Jvb3QvY29uZmlnLSRVTkFNRV9SRUxFQVNFIiwKLQljb25mX2RlZm5hbWUsCi0JTlVMTCwKLX07Ci0KIHN0YXRpYyB2b2lkIGNvbmZfd2FybmluZyhjb25zdCBjaGFyICpmbXQsIC4uLikKIHsKIAl2YV9saXN0IGFwOwpAQCAtNDQsNiArMzQsMTMgQEAKIAljb25mX3dhcm5pbmdzKys7CiB9CiAKK2NvbnN0IGNoYXIgKmNvbmZfZ2V0X2NvbmZpZ25hbWUodm9pZCkKK3sKKwljaGFyICpuYW1lID0gZ2V0ZW52KCJLQ09ORklHX0NPTkZJRyIpOworCisJcmV0dXJuIG5hbWUgPyBuYW1lIDogIi5jb25maWciOworfQorCiBzdGF0aWMgY2hhciAqY29uZl9leHBhbmRfdmFsdWUoY29uc3QgY2hhciAqaW4pCiB7CiAJc3RydWN0IHN5bWJvbCAqc3ltOwpAQCAtODYsNTEgKzgzLDY1IEBACiAJcmV0dXJuIG5hbWU7CiB9CiAKLWludCBjb25mX3JlYWRfc2ltcGxlKGNvbnN0IGNoYXIgKm5hbWUpCitpbnQgY29uZl9yZWFkX3NpbXBsZShjb25zdCBjaGFyICpuYW1lLCBpbnQgZGVmKQogewogCUZJTEUgKmluID0gTlVMTDsKIAljaGFyIGxpbmVbMTAyNF07CiAJY2hhciAqcCwgKnAyOwogCXN0cnVjdCBzeW1ib2wgKnN5bTsKLQlpbnQgaTsKKwlpbnQgaSwgZGVmX2ZsYWdzOwogCiAJaWYgKG5hbWUpIHsKIAkJaW4gPSB6Y29uZl9mb3BlbihuYW1lKTsKIAl9IGVsc2UgewotCQljb25zdCBjaGFyICoqbmFtZXMgPSBjb25mX2NvbmZuYW1lczsKLQkJd2hpbGUgKChuYW1lID0gKm5hbWVzKyspKSB7Ci0JCQluYW1lID0gY29uZl9leHBhbmRfdmFsdWUobmFtZSk7CisJCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKworCQluYW1lID0gY29uZl9nZXRfY29uZmlnbmFtZSgpOworCQlpbiA9IHpjb25mX2ZvcGVuKG5hbWUpOworCQlpZiAoaW4pCisJCQlnb3RvIGxvYWQ7CisJCXN5bV9jaGFuZ2VfY291bnQrKzsKKwkJaWYgKCFzeW1fZGVmY29uZmlnX2xpc3QpCisJCQlyZXR1cm4gMTsKKworCQlmb3JfYWxsX2RlZmF1bHRzKHN5bV9kZWZjb25maWdfbGlzdCwgcHJvcCkgeworCQkJaWYgKGV4cHJfY2FsY192YWx1ZShwcm9wLT52aXNpYmxlLmV4cHIpID09IG5vIHx8CisJCQkgICAgcHJvcC0+ZXhwci0+dHlwZSAhPSBFX1NZTUJPTCkKKwkJCQljb250aW51ZTsKKwkJCW5hbWUgPSBjb25mX2V4cGFuZF92YWx1ZShwcm9wLT5leHByLT5sZWZ0LnN5bS0+bmFtZSk7CiAJCQlpbiA9IHpjb25mX2ZvcGVuKG5hbWUpOwogCQkJaWYgKGluKSB7CiAJCQkJcHJpbnRmKF8oIiNcbiIKLQkJCQkgICAgICAgICAiIyB1c2luZyBkZWZhdWx0cyBmb3VuZCBpbiAlc1xuIgotCQkJCSAgICAgICAgICIjXG4iKSwgbmFtZSk7Ci0JCQkJYnJlYWs7CisJCQkJCSAiIyB1c2luZyBkZWZhdWx0cyBmb3VuZCBpbiAlc1xuIgorCQkJCQkgIiNcbiIpLCBuYW1lKTsKKwkJCQlnb3RvIGxvYWQ7CiAJCQl9CiAJCX0KIAl9CiAJaWYgKCFpbikKIAkJcmV0dXJuIDE7CiAKK2xvYWQ6CiAJY29uZl9maWxlbmFtZSA9IG5hbWU7CiAJY29uZl9saW5lbm8gPSAwOwogCWNvbmZfd2FybmluZ3MgPSAwOwogCWNvbmZfdW5zYXZlZCA9IDA7CiAKKwlkZWZfZmxhZ3MgPSBTWU1CT0xfREVGIDw8IGRlZjsKIAlmb3JfYWxsX3N5bWJvbHMoaSwgc3ltKSB7Ci0JCXN5bS0+ZmxhZ3MgfD0gU1lNQk9MX05FVyB8IFNZTUJPTF9DSEFOR0VEOworCQlzeW0tPmZsYWdzIHw9IFNZTUJPTF9DSEFOR0VEOworCQlzeW0tPmZsYWdzICY9IH4oZGVmX2ZsYWdzfFNZTUJPTF9WQUxJRCk7CiAJCWlmIChzeW1faXNfY2hvaWNlKHN5bSkpCi0JCQlzeW0tPmZsYWdzICY9IH5TWU1CT0xfTkVXOwotCQlzeW0tPmZsYWdzICY9IH5TWU1CT0xfVkFMSUQ7CisJCQlzeW0tPmZsYWdzIHw9IGRlZl9mbGFnczsKIAkJc3dpdGNoIChzeW0tPnR5cGUpIHsKIAkJY2FzZSBTX0lOVDoKIAkJY2FzZSBTX0hFWDoKIAkJY2FzZSBTX1NUUklORzoKLQkJCWlmIChzeW0tPnVzZXIudmFsKQotCQkJCWZyZWUoc3ltLT51c2VyLnZhbCk7CisJCQlpZiAoc3ltLT5kZWZbZGVmXS52YWwpCisJCQkJZnJlZShzeW0tPmRlZltkZWZdLnZhbCk7CiAJCWRlZmF1bHQ6Ci0JCQlzeW0tPnVzZXIudmFsID0gTlVMTDsKLQkJCXN5bS0+dXNlci50cmkgPSBubzsKKwkJCXN5bS0+ZGVmW2RlZl0udmFsID0gTlVMTDsKKwkJCXN5bS0+ZGVmW2RlZl0udHJpID0gbm87CiAJCX0KIAl9CiAKQEAgLTE0NywxOSArMTU4LDI2IEBACiAJCQkqcCsrID0gMDsKIAkJCWlmIChzdHJuY21wKHAsICJpcyBub3Qgc2V0IiwgMTApKQogCQkJCWNvbnRpbnVlOwotCQkJc3ltID0gc3ltX2ZpbmQobGluZSArIDkpOwotCQkJaWYgKCFzeW0pIHsKLQkJCQljb25mX3dhcm5pbmcoInRyeWluZyB0byBhc3NpZ24gbm9uZXhpc3RlbnQgc3ltYm9sICVzIiwgbGluZSArIDkpOwotCQkJCWJyZWFrOwotCQkJfSBlbHNlIGlmICghKHN5bS0+ZmxhZ3MgJiBTWU1CT0xfTkVXKSkgeworCQkJaWYgKGRlZiA9PSBTX0RFRl9VU0VSKSB7CisJCQkJc3ltID0gc3ltX2ZpbmQobGluZSArIDkpOworCQkJCWlmICghc3ltKSB7CisJCQkJCWNvbmZfd2FybmluZygidHJ5aW5nIHRvIGFzc2lnbiBub25leGlzdGVudCBzeW1ib2wgJXMiLCBsaW5lICsgOSk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJc3ltID0gc3ltX2xvb2t1cChsaW5lICsgOSwgMCk7CisJCQkJaWYgKHN5bS0+dHlwZSA9PSBTX1VOS05PV04pCisJCQkJCXN5bS0+dHlwZSA9IFNfQk9PTEVBTjsKKwkJCX0KKwkJCWlmIChzeW0tPmZsYWdzICYgZGVmX2ZsYWdzKSB7CiAJCQkJY29uZl93YXJuaW5nKCJ0cnlpbmcgdG8gcmVhc3NpZ24gc3ltYm9sICVzIiwgc3ltLT5uYW1lKTsKIAkJCQlicmVhazsKIAkJCX0KIAkJCXN3aXRjaCAoc3ltLT50eXBlKSB7CiAJCQljYXNlIFNfQk9PTEVBTjoKIAkJCWNhc2UgU19UUklTVEFURToKLQkJCQlzeW0tPnVzZXIudHJpID0gbm87Ci0JCQkJc3ltLT5mbGFncyAmPSB+U1lNQk9MX05FVzsKKwkJCQlzeW0tPmRlZltkZWZdLnRyaSA9IG5vOworCQkJCXN5bS0+ZmxhZ3MgfD0gZGVmX2ZsYWdzOwogCQkJCWJyZWFrOwogCQkJZGVmYXVsdDoKIAkJCQk7CkBAIC0xNzcsMzQgKzE5NSw0OCBAQAogCQkJcDIgPSBzdHJjaHIocCwgJ1xuJyk7CiAJCQlpZiAocDIpCiAJCQkJKnAyID0gMDsKLQkJCXN5bSA9IHN5bV9maW5kKGxpbmUgKyA3KTsKLQkJCWlmICghc3ltKSB7Ci0JCQkJY29uZl93YXJuaW5nKCJ0cnlpbmcgdG8gYXNzaWduIG5vbmV4aXN0ZW50IHN5bWJvbCAlcyIsIGxpbmUgKyA3KTsKLQkJCQlicmVhazsKLQkJCX0gZWxzZSBpZiAoIShzeW0tPmZsYWdzICYgU1lNQk9MX05FVykpIHsKKwkJCWlmIChkZWYgPT0gU19ERUZfVVNFUikgeworCQkJCXN5bSA9IHN5bV9maW5kKGxpbmUgKyA3KTsKKwkJCQlpZiAoIXN5bSkgeworCQkJCQljb25mX3dhcm5pbmcoInRyeWluZyB0byBhc3NpZ24gbm9uZXhpc3RlbnQgc3ltYm9sICVzIiwgbGluZSArIDcpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXN5bSA9IHN5bV9sb29rdXAobGluZSArIDcsIDApOworCQkJCWlmIChzeW0tPnR5cGUgPT0gU19VTktOT1dOKQorCQkJCQlzeW0tPnR5cGUgPSBTX09USEVSOworCQkJfQorCQkJaWYgKHN5bS0+ZmxhZ3MgJiBkZWZfZmxhZ3MpIHsKIAkJCQljb25mX3dhcm5pbmcoInRyeWluZyB0byByZWFzc2lnbiBzeW1ib2wgJXMiLCBzeW0tPm5hbWUpOwogCQkJCWJyZWFrOwogCQkJfQogCQkJc3dpdGNoIChzeW0tPnR5cGUpIHsKIAkJCWNhc2UgU19UUklTVEFURToKIAkJCQlpZiAocFswXSA9PSAnbScpIHsKLQkJCQkJc3ltLT51c2VyLnRyaSA9IG1vZDsKLQkJCQkJc3ltLT5mbGFncyAmPSB+U1lNQk9MX05FVzsKKwkJCQkJc3ltLT5kZWZbZGVmXS50cmkgPSBtb2Q7CisJCQkJCXN5bS0+ZmxhZ3MgfD0gZGVmX2ZsYWdzOwogCQkJCQlicmVhazsKIAkJCQl9CiAJCQljYXNlIFNfQk9PTEVBTjoKIAkJCQlpZiAocFswXSA9PSAneScpIHsKLQkJCQkJc3ltLT51c2VyLnRyaSA9IHllczsKLQkJCQkJc3ltLT5mbGFncyAmPSB+U1lNQk9MX05FVzsKKwkJCQkJc3ltLT5kZWZbZGVmXS50cmkgPSB5ZXM7CisJCQkJCXN5bS0+ZmxhZ3MgfD0gZGVmX2ZsYWdzOwogCQkJCQlicmVhazsKIAkJCQl9CiAJCQkJaWYgKHBbMF0gPT0gJ24nKSB7Ci0JCQkJCXN5bS0+dXNlci50cmkgPSBubzsKLQkJCQkJc3ltLT5mbGFncyAmPSB+U1lNQk9MX05FVzsKKwkJCQkJc3ltLT5kZWZbZGVmXS50cmkgPSBubzsKKwkJCQkJc3ltLT5mbGFncyB8PSBkZWZfZmxhZ3M7CiAJCQkJCWJyZWFrOwogCQkJCX0KIAkJCQljb25mX3dhcm5pbmcoInN5bWJvbCB2YWx1ZSAnJXMnIGludmFsaWQgZm9yICVzIiwgcCwgc3ltLT5uYW1lKTsKIAkJCQlicmVhazsKKwkJCWNhc2UgU19PVEhFUjoKKwkJCQlpZiAoKnAgIT0gJyInKSB7CisJCQkJCWZvciAocDIgPSBwOyAqcDIgJiYgIWlzc3BhY2UoKnAyKTsgcDIrKykKKwkJCQkJCTsKKwkJCQkJc3ltLT50eXBlID0gU19TVFJJTkc7CisJCQkJCWdvdG8gZG9uZTsKKwkJCQl9CiAJCQljYXNlIFNfU1RSSU5HOgogCQkJCWlmICgqcCsrICE9ICciJykKIAkJCQkJYnJlYWs7CkBAIC0yMjEsOSArMjUzLDEwIEBACiAJCQkJfQogCQkJY2FzZSBTX0lOVDoKIAkJCWNhc2UgU19IRVg6CisJCQlkb25lOgogCQkJCWlmIChzeW1fc3RyaW5nX3ZhbGlkKHN5bSwgcCkpIHsKLQkJCQkJc3ltLT51c2VyLnZhbCA9IHN0cmR1cChwKTsKLQkJCQkJc3ltLT5mbGFncyAmPSB+U1lNQk9MX05FVzsKKwkJCQkJc3ltLT5kZWZbZGVmXS52YWwgPSBzdHJkdXAocCk7CisJCQkJCXN5bS0+ZmxhZ3MgfD0gZGVmX2ZsYWdzOwogCQkJCX0gZWxzZSB7CiAJCQkJCWNvbmZfd2FybmluZygic3ltYm9sIHZhbHVlICclcycgaW52YWxpZCBmb3IgJXMiLCBwLCBzeW0tPm5hbWUpOwogCQkJCQljb250aW51ZTsKQEAgLTI0MSwyNCArMjc0LDI0IEBACiAJCX0KIAkJaWYgKHN5bSAmJiBzeW1faXNfY2hvaWNlX3ZhbHVlKHN5bSkpIHsKIAkJCXN0cnVjdCBzeW1ib2wgKmNzID0gcHJvcF9nZXRfc3ltYm9sKHN5bV9nZXRfY2hvaWNlX3Byb3Aoc3ltKSk7Ci0JCQlzd2l0Y2ggKHN5bS0+dXNlci50cmkpIHsKKwkJCXN3aXRjaCAoc3ltLT5kZWZbZGVmXS50cmkpIHsKIAkJCWNhc2Ugbm86CiAJCQkJYnJlYWs7CiAJCQljYXNlIG1vZDoKLQkJCQlpZiAoY3MtPnVzZXIudHJpID09IHllcykgeworCQkJCWlmIChjcy0+ZGVmW2RlZl0udHJpID09IHllcykgewogCQkJCQljb25mX3dhcm5pbmcoIiVzIGNyZWF0ZXMgaW5jb25zaXN0ZW50IGNob2ljZSBzdGF0ZSIsIHN5bS0+bmFtZSk7Ci0JCQkJCWNzLT5mbGFncyB8PSBTWU1CT0xfTkVXOworCQkJCQljcy0+ZmxhZ3MgJj0gfmRlZl9mbGFnczsKIAkJCQl9CiAJCQkJYnJlYWs7CiAJCQljYXNlIHllczoKLQkJCQlpZiAoY3MtPnVzZXIudHJpICE9IG5vKSB7CisJCQkJaWYgKGNzLT5kZWZbZGVmXS50cmkgIT0gbm8pIHsKIAkJCQkJY29uZl93YXJuaW5nKCIlcyBjcmVhdGVzIGluY29uc2lzdGVudCBjaG9pY2Ugc3RhdGUiLCBzeW0tPm5hbWUpOwotCQkJCQljcy0+ZmxhZ3MgfD0gU1lNQk9MX05FVzsKKwkJCQkJY3MtPmZsYWdzICY9IH5kZWZfZmxhZ3M7CiAJCQkJfSBlbHNlCi0JCQkJCWNzLT51c2VyLnZhbCA9IHN5bTsKKwkJCQkJY3MtPmRlZltkZWZdLnZhbCA9IHN5bTsKIAkJCQlicmVhazsKIAkJCX0KLQkJCWNzLT51c2VyLnRyaSA9IEVfT1IoY3MtPnVzZXIudHJpLCBzeW0tPnVzZXIudHJpKTsKKwkJCWNzLT5kZWZbZGVmXS50cmkgPSBFX09SKGNzLT5kZWZbZGVmXS50cmksIHN5bS0+ZGVmW2RlZl0udHJpKTsKIAkJfQogCX0KIAlmY2xvc2UoaW4pOwpAQCAtMjczLDkgKzMwNiwxMSBAQAogCXN0cnVjdCBzeW1ib2wgKnN5bTsKIAlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CiAJc3RydWN0IGV4cHIgKmU7Ci0JaW50IGk7CisJaW50IGksIGZsYWdzOwogCi0JaWYgKGNvbmZfcmVhZF9zaW1wbGUobmFtZSkpCisJc3ltX2NoYW5nZV9jb3VudCA9IDA7CisKKwlpZiAoY29uZl9yZWFkX3NpbXBsZShuYW1lLCBTX0RFRl9VU0VSKSkKIAkJcmV0dXJuIDE7CiAKIAlmb3JfYWxsX3N5bWJvbHMoaSwgc3ltKSB7CkBAIC0yODcsMTIgKzMyMiwxMiBAQAogCQkJc3dpdGNoIChzeW0tPnR5cGUpIHsKIAkJCWNhc2UgU19CT09MRUFOOgogCQkJY2FzZSBTX1RSSVNUQVRFOgotCQkJCWlmIChzeW0tPnVzZXIudHJpICE9IHN5bV9nZXRfdHJpc3RhdGVfdmFsdWUoc3ltKSkKKwkJCQlpZiAoc3ltLT5kZWZbU19ERUZfVVNFUl0udHJpICE9IHN5bV9nZXRfdHJpc3RhdGVfdmFsdWUoc3ltKSkKIAkJCQkJYnJlYWs7CiAJCQkJaWYgKCFzeW1faXNfY2hvaWNlKHN5bSkpCiAJCQkJCWdvdG8gc3ltX29rOwogCQkJZGVmYXVsdDoKLQkJCQlpZiAoIXN0cmNtcChzeW0tPmN1cnIudmFsLCBzeW0tPnVzZXIudmFsKSkKKwkJCQlpZiAoIXN0cmNtcChzeW0tPmN1cnIudmFsLCBzeW0tPmRlZltTX0RFRl9VU0VSXS52YWwpKQogCQkJCQlnb3RvIHN5bV9vazsKIAkJCQlicmVhazsKIAkJCX0KQEAgLTMwNCwxNSArMzM5LDEzIEBACiAJc3ltX29rOgogCQlpZiAoc3ltX2hhc192YWx1ZShzeW0pICYmICFzeW1faXNfY2hvaWNlX3ZhbHVlKHN5bSkpIHsKIAkJCWlmIChzeW0tPnZpc2libGUgPT0gbm8pCi0JCQkJc3ltLT5mbGFncyB8PSBTWU1CT0xfTkVXOworCQkJCXN5bS0+ZmxhZ3MgJj0gflNZTUJPTF9ERUZfVVNFUjsKIAkJCXN3aXRjaCAoc3ltLT50eXBlKSB7CiAJCQljYXNlIFNfU1RSSU5HOgogCQkJY2FzZSBTX0lOVDoKIAkJCWNhc2UgU19IRVg6Ci0JCQkJaWYgKCFzeW1fc3RyaW5nX3dpdGhpbl9yYW5nZShzeW0sIHN5bS0+dXNlci52YWwpKSB7Ci0JCQkJCXN5bS0+ZmxhZ3MgfD0gU1lNQk9MX05FVzsKLQkJCQkJc3ltLT5mbGFncyAmPSB+U1lNQk9MX1ZBTElEOwotCQkJCX0KKwkJCQlpZiAoIXN5bV9zdHJpbmdfd2l0aGluX3JhbmdlKHN5bSwgc3ltLT5kZWZbU19ERUZfVVNFUl0udmFsKSkKKwkJCQkJc3ltLT5mbGFncyAmPSB+KFNZTUJPTF9WQUxJRHxTWU1CT0xfREVGX1VTRVIpOwogCQkJZGVmYXVsdDoKIAkJCQlicmVhazsKIAkJCX0KQEAgLTMyMCwxOSArMzUzLDIxIEBACiAJCWlmICghc3ltX2lzX2Nob2ljZShzeW0pKQogCQkJY29udGludWU7CiAJCXByb3AgPSBzeW1fZ2V0X2Nob2ljZV9wcm9wKHN5bSk7CisJCWZsYWdzID0gc3ltLT5mbGFnczsKIAkJZm9yIChlID0gcHJvcC0+ZXhwcjsgZTsgZSA9IGUtPmxlZnQuZXhwcikKIAkJCWlmIChlLT5yaWdodC5zeW0tPnZpc2libGUgIT0gbm8pCi0JCQkJc3ltLT5mbGFncyB8PSBlLT5yaWdodC5zeW0tPmZsYWdzICYgU1lNQk9MX05FVzsKKwkJCQlmbGFncyAmPSBlLT5yaWdodC5zeW0tPmZsYWdzOworCQlzeW0tPmZsYWdzIHw9IGZsYWdzICYgU1lNQk9MX0RFRl9VU0VSOwogCX0KIAotCXN5bV9jaGFuZ2VfY291bnQgPSBjb25mX3dhcm5pbmdzIHx8IGNvbmZfdW5zYXZlZDsKKwlzeW1fY2hhbmdlX2NvdW50ICs9IGNvbmZfd2FybmluZ3MgfHwgY29uZl91bnNhdmVkOwogCiAJcmV0dXJuIDA7CiB9CiAKIGludCBjb25mX3dyaXRlKGNvbnN0IGNoYXIgKm5hbWUpCiB7Ci0JRklMRSAqb3V0LCAqb3V0X2g7CisJRklMRSAqb3V0OwogCXN0cnVjdCBzeW1ib2wgKnN5bTsKIAlzdHJ1Y3QgbWVudSAqbWVudTsKIAljb25zdCBjaGFyICpiYXNlbmFtZTsKQEAgLTM1MSw3ICszODYsNyBAQAogCQlpZiAoIXN0YXQobmFtZSwgJnN0KSAmJiBTX0lTRElSKHN0LnN0X21vZGUpKSB7CiAJCQlzdHJjcHkoZGlybmFtZSwgbmFtZSk7CiAJCQlzdHJjYXQoZGlybmFtZSwgIi8iKTsKLQkJCWJhc2VuYW1lID0gY29uZl9kZWZfZmlsZW5hbWU7CisJCQliYXNlbmFtZSA9IGNvbmZfZ2V0X2NvbmZpZ25hbWUoKTsKIAkJfSBlbHNlIGlmICgoc2xhc2ggPSBzdHJyY2hyKG5hbWUsICcvJykpKSB7CiAJCQlpbnQgc2l6ZSA9IHNsYXNoIC0gbmFtZSArIDE7CiAJCQltZW1jcHkoZGlybmFtZSwgbmFtZSwgc2l6ZSk7CkBAIC0zNTksMjMgKzM5NCwyNCBAQAogCQkJaWYgKHNsYXNoWzFdKQogCQkJCWJhc2VuYW1lID0gc2xhc2ggKyAxOwogCQkJZWxzZQotCQkJCWJhc2VuYW1lID0gY29uZl9kZWZfZmlsZW5hbWU7CisJCQkJYmFzZW5hbWUgPSBjb25mX2dldF9jb25maWduYW1lKCk7CiAJCX0gZWxzZQogCQkJYmFzZW5hbWUgPSBuYW1lOwogCX0gZWxzZQotCQliYXNlbmFtZSA9IGNvbmZfZGVmX2ZpbGVuYW1lOworCQliYXNlbmFtZSA9IGNvbmZfZ2V0X2NvbmZpZ25hbWUoKTsKIAotCXNwcmludGYobmV3bmFtZSwgIiVzLnRtcGNvbmZpZy4lZCIsIGRpcm5hbWUsIChpbnQpZ2V0cGlkKCkpOwotCW91dCA9IGZvcGVuKG5ld25hbWUsICJ3Iik7CisJc3ByaW50ZihuZXduYW1lLCAiJXMlcyIsIGRpcm5hbWUsIGJhc2VuYW1lKTsKKwllbnYgPSBnZXRlbnYoIktDT05GSUdfT1ZFUldSSVRFQ09ORklHIik7CisJaWYgKCFlbnYgfHwgISplbnYpIHsKKwkJc3ByaW50Zih0bXBuYW1lLCAiJXMudG1wY29uZmlnLiVkIiwgZGlybmFtZSwgKGludClnZXRwaWQoKSk7CisJCW91dCA9IGZvcGVuKHRtcG5hbWUsICJ3Iik7CisJfSBlbHNlIHsKKwkJKnRtcG5hbWUgPSAwOworCQlvdXQgPSBmb3BlbihuZXduYW1lLCAidyIpOworCX0KIAlpZiAoIW91dCkKIAkJcmV0dXJuIDE7Ci0Jb3V0X2ggPSBOVUxMOwotCWlmICghbmFtZSkgewotCQlvdXRfaCA9IGZvcGVuKCIudG1wY29uZmlnLmgiLCAidyIpOwotCQlpZiAoIW91dF9oKQotCQkJcmV0dXJuIDE7Ci0JCWZpbGVfd3JpdGVfZGVwKE5VTEwpOwotCX0KKwogCXN5bSA9IHN5bV9sb29rdXAoIktFUk5FTFZFUlNJT04iLCAwKTsKIAlzeW1fY2FsY192YWx1ZShzeW0pOwogCXRpbWUoJm5vdyk7CkBAIC0zOTEsMTYgKzQyNyw2IEBACiAJCSAgICAgc3ltX2dldF9zdHJpbmdfdmFsdWUoc3ltKSwKIAkJICAgICB1c2VfdGltZXN0YW1wID8gIiMgIiA6ICIiLAogCQkgICAgIHVzZV90aW1lc3RhbXAgPyBjdGltZSgmbm93KSA6ICIiKTsKLQlpZiAob3V0X2gpCi0JCWZwcmludGYob3V0X2gsICIvKlxuIgotCQkJICAgICAgICIgKiBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBDIGNvbmZpZzogZG9uJ3QgZWRpdFxuIgotCQkJICAgICAgICIgKiBMaW51eCBrZXJuZWwgdmVyc2lvbjogJXNcbiIKLQkJCSAgICAgICAiJXMlcyIKLQkJCSAgICAgICAiICovXG4iCi0JCQkgICAgICAgIiNkZWZpbmUgQVVUT0NPTkZfSU5DTFVERURcbiIsCi0JCQkgICAgICAgc3ltX2dldF9zdHJpbmdfdmFsdWUoc3ltKSwKLQkJCSAgICAgICB1c2VfdGltZXN0YW1wID8gIiAqICIgOiAiIiwKLQkJCSAgICAgICB1c2VfdGltZXN0YW1wID8gY3RpbWUoJm5vdykgOiAiIik7CiAKIAlpZiAoIXN5bV9jaGFuZ2VfY291bnQpCiAJCXN5bV9jbGVhcl9hbGxfdmFsaWQoKTsKQEAgLTQxNiwxMSArNDQyLDYgQEAKIAkJCQkgICAgICIjXG4iCiAJCQkJICAgICAiIyAlc1xuIgogCQkJCSAgICAgIiNcbiIsIHN0cik7Ci0JCQlpZiAob3V0X2gpCi0JCQkJZnByaW50ZihvdXRfaCwgIlxuIgotCQkJCQkgICAgICAgIi8qXG4iCi0JCQkJCSAgICAgICAiICogJXNcbiIKLQkJCQkJICAgICAgICIgKi9cbiIsIHN0cik7CiAJCX0gZWxzZSBpZiAoIShzeW0tPmZsYWdzICYgU1lNQk9MX0NIT0lDRSkpIHsKIAkJCXN5bV9jYWxjX3ZhbHVlKHN5bSk7CiAJCQlpZiAoIShzeW0tPmZsYWdzICYgU1lNQk9MX1dSSVRFKSkKQEAgLTQzOCw1OSArNDU5LDM5IEBACiAJCQkJc3dpdGNoIChzeW1fZ2V0X3RyaXN0YXRlX3ZhbHVlKHN5bSkpIHsKIAkJCQljYXNlIG5vOgogCQkJCQlmcHJpbnRmKG91dCwgIiMgQ09ORklHXyVzIGlzIG5vdCBzZXRcbiIsIHN5bS0+bmFtZSk7Ci0JCQkJCWlmIChvdXRfaCkKLQkJCQkJCWZwcmludGYob3V0X2gsICIjdW5kZWYgQ09ORklHXyVzXG4iLCBzeW0tPm5hbWUpOwogCQkJCQlicmVhazsKIAkJCQljYXNlIG1vZDoKIAkJCQkJZnByaW50ZihvdXQsICJDT05GSUdfJXM9bVxuIiwgc3ltLT5uYW1lKTsKLQkJCQkJaWYgKG91dF9oKQotCQkJCQkJZnByaW50ZihvdXRfaCwgIiNkZWZpbmUgQ09ORklHXyVzX01PRFVMRSAxXG4iLCBzeW0tPm5hbWUpOwogCQkJCQlicmVhazsKIAkJCQljYXNlIHllczoKIAkJCQkJZnByaW50ZihvdXQsICJDT05GSUdfJXM9eVxuIiwgc3ltLT5uYW1lKTsKLQkJCQkJaWYgKG91dF9oKQotCQkJCQkJZnByaW50ZihvdXRfaCwgIiNkZWZpbmUgQ09ORklHXyVzIDFcbiIsIHN5bS0+bmFtZSk7CiAJCQkJCWJyZWFrOwogCQkJCX0KIAkJCQlicmVhazsKIAkJCWNhc2UgU19TVFJJTkc6Ci0JCQkJLy8gZml4IG1lCiAJCQkJc3RyID0gc3ltX2dldF9zdHJpbmdfdmFsdWUoc3ltKTsKIAkJCQlmcHJpbnRmKG91dCwgIkNPTkZJR18lcz1cIiIsIHN5bS0+bmFtZSk7Ci0JCQkJaWYgKG91dF9oKQotCQkJCQlmcHJpbnRmKG91dF9oLCAiI2RlZmluZSBDT05GSUdfJXMgXCIiLCBzeW0tPm5hbWUpOwotCQkJCWRvIHsKKwkJCQl3aGlsZSAoMSkgewogCQkJCQlsID0gc3RyY3NwbihzdHIsICJcIlxcIik7CiAJCQkJCWlmIChsKSB7CiAJCQkJCQlmd3JpdGUoc3RyLCBsLCAxLCBvdXQpOwotCQkJCQkJaWYgKG91dF9oKQotCQkJCQkJCWZ3cml0ZShzdHIsIGwsIDEsIG91dF9oKTsKKwkJCQkJCXN0ciArPSBsOwogCQkJCQl9Ci0JCQkJCXN0ciArPSBsOwotCQkJCQl3aGlsZSAoKnN0ciA9PSAnXFwnIHx8ICpzdHIgPT0gJyInKSB7Ci0JCQkJCQlmcHJpbnRmKG91dCwgIlxcJWMiLCAqc3RyKTsKLQkJCQkJCWlmIChvdXRfaCkKLQkJCQkJCQlmcHJpbnRmKG91dF9oLCAiXFwlYyIsICpzdHIpOwotCQkJCQkJc3RyKys7Ci0JCQkJCX0KLQkJCQl9IHdoaWxlICgqc3RyKTsKKwkJCQkJaWYgKCEqc3RyKQorCQkJCQkJYnJlYWs7CisJCQkJCWZwcmludGYob3V0LCAiXFwlYyIsICpzdHIrKyk7CisJCQkJfQogCQkJCWZwdXRzKCJcIlxuIiwgb3V0KTsKLQkJCQlpZiAob3V0X2gpCi0JCQkJCWZwdXRzKCJcIlxuIiwgb3V0X2gpOwogCQkJCWJyZWFrOwogCQkJY2FzZSBTX0hFWDoKIAkJCQlzdHIgPSBzeW1fZ2V0X3N0cmluZ192YWx1ZShzeW0pOwogCQkJCWlmIChzdHJbMF0gIT0gJzAnIHx8IChzdHJbMV0gIT0gJ3gnICYmIHN0clsxXSAhPSAnWCcpKSB7CiAJCQkJCWZwcmludGYob3V0LCAiQ09ORklHXyVzPSVzXG4iLCBzeW0tPm5hbWUsIHN0cik7Ci0JCQkJCWlmIChvdXRfaCkKLQkJCQkJCWZwcmludGYob3V0X2gsICIjZGVmaW5lIENPTkZJR18lcyAweCVzXG4iLCBzeW0tPm5hbWUsIHN0cik7CiAJCQkJCWJyZWFrOwogCQkJCX0KIAkJCWNhc2UgU19JTlQ6CiAJCQkJc3RyID0gc3ltX2dldF9zdHJpbmdfdmFsdWUoc3ltKTsKIAkJCQlmcHJpbnRmKG91dCwgIkNPTkZJR18lcz0lc1xuIiwgc3ltLT5uYW1lLCBzdHIpOwotCQkJCWlmIChvdXRfaCkKLQkJCQkJZnByaW50ZihvdXRfaCwgIiNkZWZpbmUgQ09ORklHXyVzICVzXG4iLCBzeW0tPm5hbWUsIHN0cik7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0KQEAgLTUxMCwyMSArNTExLDI1MyBAQAogCQl9CiAJfQogCWZjbG9zZShvdXQpOwotCWlmIChvdXRfaCkgewotCQlmY2xvc2Uob3V0X2gpOwotCQlyZW5hbWUoIi50bXBjb25maWcuaCIsICJpbmNsdWRlL2xpbnV4L2F1dG9jb25mLmgiKTsKKworCWlmICgqdG1wbmFtZSkgeworCQlzdHJjYXQoZGlybmFtZSwgbmFtZSA/IG5hbWUgOiBjb25mX2dldF9jb25maWduYW1lKCkpOworCQlzdHJjYXQoZGlybmFtZSwgIi5vbGQiKTsKKwkJcmVuYW1lKG5ld25hbWUsIGRpcm5hbWUpOworCQlpZiAocmVuYW1lKHRtcG5hbWUsIG5ld25hbWUpKQorCQkJcmV0dXJuIDE7CiAJfQotCWlmICghbmFtZSB8fCBiYXNlbmFtZSAhPSBjb25mX2RlZl9maWxlbmFtZSkgewotCQlpZiAoIW5hbWUpCi0JCQluYW1lID0gY29uZl9kZWZfZmlsZW5hbWU7Ci0JCXNwcmludGYodG1wbmFtZSwgIiVzLm9sZCIsIG5hbWUpOwotCQlyZW5hbWUobmFtZSwgdG1wbmFtZSk7Ci0JfQotCXNwcmludGYodG1wbmFtZSwgIiVzJXMiLCBkaXJuYW1lLCBiYXNlbmFtZSk7Ci0JaWYgKHJlbmFtZShuZXduYW1lLCB0bXBuYW1lKSkKLQkJcmV0dXJuIDE7CisKKwlwcmludGYoXygiI1xuIgorCQkgIiMgY29uZmlndXJhdGlvbiB3cml0dGVuIHRvICVzXG4iCisJCSAiI1xuIiksIG5ld25hbWUpOwogCiAJc3ltX2NoYW5nZV9jb3VudCA9IDA7CiAKIAlyZXR1cm4gMDsKIH0KKworaW50IGNvbmZfc3BsaXRfY29uZmlnKHZvaWQpCit7CisJY2hhciAqbmFtZSwgcGF0aFsxMjhdOworCWNoYXIgKnMsICpkLCBjOworCXN0cnVjdCBzeW1ib2wgKnN5bTsKKwlzdHJ1Y3Qgc3RhdCBzYjsKKwlpbnQgcmVzLCBpLCBmZDsKKworCW5hbWUgPSBnZXRlbnYoIktDT05GSUdfQVVUT0NPTkZJRyIpOworCWlmICghbmFtZSkKKwkJbmFtZSA9ICJpbmNsdWRlL2NvbmZpZy9hdXRvLmNvbmYiOworCWNvbmZfcmVhZF9zaW1wbGUobmFtZSwgU19ERUZfQVVUTyk7CisKKwlpZiAoY2hkaXIoImluY2x1ZGUvY29uZmlnIikpCisJCXJldHVybiAxOworCisJcmVzID0gMDsKKwlmb3JfYWxsX3N5bWJvbHMoaSwgc3ltKSB7CisJCXN5bV9jYWxjX3ZhbHVlKHN5bSk7CisJCWlmICgoc3ltLT5mbGFncyAmIFNZTUJPTF9BVVRPKSB8fCAhc3ltLT5uYW1lKQorCQkJY29udGludWU7CisJCWlmIChzeW0tPmZsYWdzICYgU1lNQk9MX1dSSVRFKSB7CisJCQlpZiAoc3ltLT5mbGFncyAmIFNZTUJPTF9ERUZfQVVUTykgeworCQkJCS8qCisJCQkJICogc3ltYm9sIGhhcyBvbGQgYW5kIG5ldyB2YWx1ZSwKKwkJCQkgKiBzbyBjb21wYXJlIHRoZW0uLi4KKwkJCQkgKi8KKwkJCQlzd2l0Y2ggKHN5bS0+dHlwZSkgeworCQkJCWNhc2UgU19CT09MRUFOOgorCQkJCWNhc2UgU19UUklTVEFURToKKwkJCQkJaWYgKHN5bV9nZXRfdHJpc3RhdGVfdmFsdWUoc3ltKSA9PQorCQkJCQkgICAgc3ltLT5kZWZbU19ERUZfQVVUT10udHJpKQorCQkJCQkJY29udGludWU7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU19TVFJJTkc6CisJCQkJY2FzZSBTX0hFWDoKKwkJCQljYXNlIFNfSU5UOgorCQkJCQlpZiAoIXN0cmNtcChzeW1fZ2V0X3N0cmluZ192YWx1ZShzeW0pLAorCQkJCQkJICAgIHN5bS0+ZGVmW1NfREVGX0FVVE9dLnZhbCkpCisJCQkJCQljb250aW51ZTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQkvKgorCQkJCSAqIElmIHRoZXJlIGlzIG5vIG9sZCB2YWx1ZSwgb25seSAnbm8nICh1bnNldCkKKwkJCQkgKiBpcyBhbGxvd2VkIGFzIG5ldyB2YWx1ZS4KKwkJCQkgKi8KKwkJCQlzd2l0Y2ggKHN5bS0+dHlwZSkgeworCQkJCWNhc2UgU19CT09MRUFOOgorCQkJCWNhc2UgU19UUklTVEFURToKKwkJCQkJaWYgKHN5bV9nZXRfdHJpc3RhdGVfdmFsdWUoc3ltKSA9PSBubykKKwkJCQkJCWNvbnRpbnVlOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSBpZiAoIShzeW0tPmZsYWdzICYgU1lNQk9MX0RFRl9BVVRPKSkKKwkJCS8qIFRoZXJlIGlzIG5laXRoZXIgYW4gb2xkIG5vciBhIG5ldyB2YWx1ZS4gKi8KKwkJCWNvbnRpbnVlOworCQkvKiBlbHNlCisJCSAqCVRoZXJlIGlzIGFuIG9sZCB2YWx1ZSwgYnV0IG5vIG5ldyB2YWx1ZSAoJ25vJyAodW5zZXQpCisJCSAqCWlzbid0IHNhdmVkIGluIGF1dG8uY29uZiwgc28gdGhlIG9sZCB2YWx1ZSBpcyBhbHdheXMKKwkJICoJZGlmZmVyZW50IGZyb20gJ25vJykuCisJCSAqLworCisJCS8qIFJlcGxhY2UgYWxsICdfJyBhbmQgYXBwZW5kICIuaCIgKi8KKwkJcyA9IHN5bS0+bmFtZTsKKwkJZCA9IHBhdGg7CisJCXdoaWxlICgoYyA9ICpzKyspKSB7CisJCQljID0gdG9sb3dlcihjKTsKKwkJCSpkKysgPSAoYyA9PSAnXycpID8gJy8nIDogYzsKKwkJfQorCQlzdHJjcHkoZCwgIi5oIik7CisKKwkJLyogQXNzdW1lIGRpcmVjdG9yeSBwYXRoIGFscmVhZHkgZXhpc3RzLiAqLworCQlmZCA9IG9wZW4ocGF0aCwgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19UUlVOQywgMDY0NCk7CisJCWlmIChmZCA9PSAtMSkgeworCQkJaWYgKGVycm5vICE9IEVOT0VOVCkgeworCQkJCXJlcyA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKgorCQkJICogQ3JlYXRlIGRpcmVjdG9yeSBjb21wb25lbnRzLAorCQkJICogdW5sZXNzIHRoZXkgZXhpc3QgYWxyZWFkeS4KKwkJCSAqLworCQkJZCA9IHBhdGg7CisJCQl3aGlsZSAoKGQgPSBzdHJjaHIoZCwgJy8nKSkpIHsKKwkJCQkqZCA9IDA7CisJCQkJaWYgKHN0YXQocGF0aCwgJnNiKSAmJiBta2RpcihwYXRoLCAwNzU1KSkgeworCQkJCQlyZXMgPSAxOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQkJKmQrKyA9ICcvJzsKKwkJCX0KKwkJCS8qIFRyeSBpdCBhZ2Fpbi4gKi8KKwkJCWZkID0gb3BlbihwYXRoLCBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX1RSVU5DLCAwNjQ0KTsKKwkJCWlmIChmZCA9PSAtMSkgeworCQkJCXJlcyA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJY2xvc2UoZmQpOworCX0KK291dDoKKwlpZiAoY2hkaXIoIi4uLy4uIikpCisJCXJldHVybiAxOworCisJcmV0dXJuIHJlczsKK30KKworaW50IGNvbmZfd3JpdGVfYXV0b2NvbmYodm9pZCkKK3sKKwlzdHJ1Y3Qgc3ltYm9sICpzeW07CisJY29uc3QgY2hhciAqc3RyOworCWNoYXIgKm5hbWU7CisJRklMRSAqb3V0LCAqb3V0X2g7CisJdGltZV90IG5vdzsKKwlpbnQgaSwgbDsKKworCXN5bV9jbGVhcl9hbGxfdmFsaWQoKTsKKworCWZpbGVfd3JpdGVfZGVwKCJpbmNsdWRlL2NvbmZpZy9hdXRvLmNvbmYuY21kIik7CisKKwlpZiAoY29uZl9zcGxpdF9jb25maWcoKSkKKwkJcmV0dXJuIDE7CisKKwlvdXQgPSBmb3BlbigiLnRtcGNvbmZpZyIsICJ3Iik7CisJaWYgKCFvdXQpCisJCXJldHVybiAxOworCisJb3V0X2ggPSBmb3BlbigiLnRtcGNvbmZpZy5oIiwgInciKTsKKwlpZiAoIW91dF9oKSB7CisJCWZjbG9zZShvdXQpOworCQlyZXR1cm4gMTsKKwl9CisKKwlzeW0gPSBzeW1fbG9va3VwKCJLRVJORUxWRVJTSU9OIiwgMCk7CisJc3ltX2NhbGNfdmFsdWUoc3ltKTsKKwl0aW1lKCZub3cpOworCWZwcmludGYob3V0LCAiI1xuIgorCQkgICAgICIjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0XG4iCisJCSAgICAgIiMgTGludXgga2VybmVsIHZlcnNpb246ICVzXG4iCisJCSAgICAgIiMgJXMiCisJCSAgICAgIiNcbiIsCisJCSAgICAgc3ltX2dldF9zdHJpbmdfdmFsdWUoc3ltKSwgY3RpbWUoJm5vdykpOworCWZwcmludGYob3V0X2gsICIvKlxuIgorCQkgICAgICAgIiAqIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIEMgY29uZmlnOiBkb24ndCBlZGl0XG4iCisJCSAgICAgICAiICogTGludXgga2VybmVsIHZlcnNpb246ICVzXG4iCisJCSAgICAgICAiICogJXMiCisJCSAgICAgICAiICovXG4iCisJCSAgICAgICAiI2RlZmluZSBBVVRPQ09ORl9JTkNMVURFRFxuIiwKKwkJICAgICAgIHN5bV9nZXRfc3RyaW5nX3ZhbHVlKHN5bSksIGN0aW1lKCZub3cpKTsKKworCWZvcl9hbGxfc3ltYm9scyhpLCBzeW0pIHsKKwkJc3ltX2NhbGNfdmFsdWUoc3ltKTsKKwkJaWYgKCEoc3ltLT5mbGFncyAmIFNZTUJPTF9XUklURSkgfHwgIXN5bS0+bmFtZSkKKwkJCWNvbnRpbnVlOworCQlzd2l0Y2ggKHN5bS0+dHlwZSkgeworCQljYXNlIFNfQk9PTEVBTjoKKwkJY2FzZSBTX1RSSVNUQVRFOgorCQkJc3dpdGNoIChzeW1fZ2V0X3RyaXN0YXRlX3ZhbHVlKHN5bSkpIHsKKwkJCWNhc2Ugbm86CisJCQkJYnJlYWs7CisJCQljYXNlIG1vZDoKKwkJCQlmcHJpbnRmKG91dCwgIkNPTkZJR18lcz1tXG4iLCBzeW0tPm5hbWUpOworCQkJCWZwcmludGYob3V0X2gsICIjZGVmaW5lIENPTkZJR18lc19NT0RVTEUgMVxuIiwgc3ltLT5uYW1lKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgeWVzOgorCQkJCWZwcmludGYob3V0LCAiQ09ORklHXyVzPXlcbiIsIHN5bS0+bmFtZSk7CisJCQkJZnByaW50ZihvdXRfaCwgIiNkZWZpbmUgQ09ORklHXyVzIDFcbiIsIHN5bS0+bmFtZSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBTX1NUUklORzoKKwkJCXN0ciA9IHN5bV9nZXRfc3RyaW5nX3ZhbHVlKHN5bSk7CisJCQlmcHJpbnRmKG91dCwgIkNPTkZJR18lcz1cIiIsIHN5bS0+bmFtZSk7CisJCQlmcHJpbnRmKG91dF9oLCAiI2RlZmluZSBDT05GSUdfJXMgXCIiLCBzeW0tPm5hbWUpOworCQkJd2hpbGUgKDEpIHsKKwkJCQlsID0gc3RyY3NwbihzdHIsICJcIlxcIik7CisJCQkJaWYgKGwpIHsKKwkJCQkJZndyaXRlKHN0ciwgbCwgMSwgb3V0KTsKKwkJCQkJZndyaXRlKHN0ciwgbCwgMSwgb3V0X2gpOworCQkJCQlzdHIgKz0gbDsKKwkJCQl9CisJCQkJaWYgKCEqc3RyKQorCQkJCQlicmVhazsKKwkJCQlmcHJpbnRmKG91dCwgIlxcJWMiLCAqc3RyKTsKKwkJCQlmcHJpbnRmKG91dF9oLCAiXFwlYyIsICpzdHIpOworCQkJCXN0cisrOworCQkJfQorCQkJZnB1dHMoIlwiXG4iLCBvdXQpOworCQkJZnB1dHMoIlwiXG4iLCBvdXRfaCk7CisJCQlicmVhazsKKwkJY2FzZSBTX0hFWDoKKwkJCXN0ciA9IHN5bV9nZXRfc3RyaW5nX3ZhbHVlKHN5bSk7CisJCQlpZiAoc3RyWzBdICE9ICcwJyB8fCAoc3RyWzFdICE9ICd4JyAmJiBzdHJbMV0gIT0gJ1gnKSkgeworCQkJCWZwcmludGYob3V0LCAiQ09ORklHXyVzPSVzXG4iLCBzeW0tPm5hbWUsIHN0cik7CisJCQkJZnByaW50ZihvdXRfaCwgIiNkZWZpbmUgQ09ORklHXyVzIDB4JXNcbiIsIHN5bS0+bmFtZSwgc3RyKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJY2FzZSBTX0lOVDoKKwkJCXN0ciA9IHN5bV9nZXRfc3RyaW5nX3ZhbHVlKHN5bSk7CisJCQlmcHJpbnRmKG91dCwgIkNPTkZJR18lcz0lc1xuIiwgc3ltLT5uYW1lLCBzdHIpOworCQkJZnByaW50ZihvdXRfaCwgIiNkZWZpbmUgQ09ORklHXyVzICVzXG4iLCBzeW0tPm5hbWUsIHN0cik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfQorCWZjbG9zZShvdXQpOworCWZjbG9zZShvdXRfaCk7CisKKwluYW1lID0gZ2V0ZW52KCJLQ09ORklHX0FVVE9IRUFERVIiKTsKKwlpZiAoIW5hbWUpCisJCW5hbWUgPSAiaW5jbHVkZS9saW51eC9hdXRvY29uZi5oIjsKKwlpZiAocmVuYW1lKCIudG1wY29uZmlnLmgiLCBuYW1lKSkKKwkJcmV0dXJuIDE7CisJbmFtZSA9IGdldGVudigiS0NPTkZJR19BVVRPQ09ORklHIik7CisJaWYgKCFuYW1lKQorCQluYW1lID0gImluY2x1ZGUvY29uZmlnL2F1dG8uY29uZiI7CisJLyoKKwkgKiBUaGlzIG11c3QgYmUgdGhlIGxhc3Qgc3RlcCwga2J1aWxkIGhhcyBhIGRlcGVuZGVuY3kgb24gYXV0by5jb25mCisJICogYW5kIHRoaXMgbWFya3MgdGhlIHN1Y2Nlc3NmdWwgY29tcGxldGlvbiBvZiB0aGUgcHJldmlvdXMgc3RlcHMuCisJICovCisJaWYgKHJlbmFtZSgiLnRtcGNvbmZpZyIsIG5hbWUpKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL2V4cHIuYyBiL3NjcmlwdHMva2NvbmZpZy9leHByLmMKaW5kZXggMzBlNGY5ZC4uNmY5OGRiZiAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL2V4cHIuYworKysgYi9zY3JpcHRzL2tjb25maWcvZXhwci5jCkBAIC0xNDUsNyArMTQ1LDggQEAKIAkJcmV0dXJuOwogCX0KIAlpZiAoZTEtPnR5cGUgPT0gRV9TWU1CT0wgJiYgZTItPnR5cGUgPT0gRV9TWU1CT0wgJiYKLQkgICAgZTEtPmxlZnQuc3ltID09IGUyLT5sZWZ0LnN5bSAmJiAoZTEtPmxlZnQuc3ltLT5mbGFncyAmIChTWU1CT0xfWUVTfFNZTUJPTF9OTykpKQorCSAgICBlMS0+bGVmdC5zeW0gPT0gZTItPmxlZnQuc3ltICYmCisJICAgIChlMS0+bGVmdC5zeW0gPT0gJnN5bWJvbF95ZXMgfHwgZTEtPmxlZnQuc3ltID09ICZzeW1ib2xfbm8pKQogCQlyZXR1cm47CiAJaWYgKCFleHByX2VxKGUxLCBlMikpCiAJCXJldHVybjsKQEAgLTEwMTIsNzMgKzEwMTMsNzMgQEAKICNlbmRpZgogfQogCi12b2lkIGV4cHJfcHJpbnQoc3RydWN0IGV4cHIgKmUsIHZvaWQgKCpmbikodm9pZCAqLCBjb25zdCBjaGFyICopLCB2b2lkICpkYXRhLCBpbnQgcHJldnRva2VuKQordm9pZCBleHByX3ByaW50KHN0cnVjdCBleHByICplLCB2b2lkICgqZm4pKHZvaWQgKiwgc3RydWN0IHN5bWJvbCAqLCBjb25zdCBjaGFyICopLCB2b2lkICpkYXRhLCBpbnQgcHJldnRva2VuKQogewogCWlmICghZSkgewotCQlmbihkYXRhLCAieSIpOworCQlmbihkYXRhLCBOVUxMLCAieSIpOwogCQlyZXR1cm47CiAJfQogCiAJaWYgKGV4cHJfY29tcGFyZV90eXBlKHByZXZ0b2tlbiwgZS0+dHlwZSkgPiAwKQotCQlmbihkYXRhLCAiKCIpOworCQlmbihkYXRhLCBOVUxMLCAiKCIpOwogCXN3aXRjaCAoZS0+dHlwZSkgewogCWNhc2UgRV9TWU1CT0w6CiAJCWlmIChlLT5sZWZ0LnN5bS0+bmFtZSkKLQkJCWZuKGRhdGEsIGUtPmxlZnQuc3ltLT5uYW1lKTsKKwkJCWZuKGRhdGEsIGUtPmxlZnQuc3ltLCBlLT5sZWZ0LnN5bS0+bmFtZSk7CiAJCWVsc2UKLQkJCWZuKGRhdGEsICI8Y2hvaWNlPiIpOworCQkJZm4oZGF0YSwgTlVMTCwgIjxjaG9pY2U+Iik7CiAJCWJyZWFrOwogCWNhc2UgRV9OT1Q6Ci0JCWZuKGRhdGEsICIhIik7CisJCWZuKGRhdGEsIE5VTEwsICIhIik7CiAJCWV4cHJfcHJpbnQoZS0+bGVmdC5leHByLCBmbiwgZGF0YSwgRV9OT1QpOwogCQlicmVhazsKIAljYXNlIEVfRVFVQUw6Ci0JCWZuKGRhdGEsIGUtPmxlZnQuc3ltLT5uYW1lKTsKLQkJZm4oZGF0YSwgIj0iKTsKLQkJZm4oZGF0YSwgZS0+cmlnaHQuc3ltLT5uYW1lKTsKKwkJZm4oZGF0YSwgZS0+bGVmdC5zeW0sIGUtPmxlZnQuc3ltLT5uYW1lKTsKKwkJZm4oZGF0YSwgTlVMTCwgIj0iKTsKKwkJZm4oZGF0YSwgZS0+cmlnaHQuc3ltLCBlLT5yaWdodC5zeW0tPm5hbWUpOwogCQlicmVhazsKIAljYXNlIEVfVU5FUVVBTDoKLQkJZm4oZGF0YSwgZS0+bGVmdC5zeW0tPm5hbWUpOwotCQlmbihkYXRhLCAiIT0iKTsKLQkJZm4oZGF0YSwgZS0+cmlnaHQuc3ltLT5uYW1lKTsKKwkJZm4oZGF0YSwgZS0+bGVmdC5zeW0sIGUtPmxlZnQuc3ltLT5uYW1lKTsKKwkJZm4oZGF0YSwgTlVMTCwgIiE9Iik7CisJCWZuKGRhdGEsIGUtPnJpZ2h0LnN5bSwgZS0+cmlnaHQuc3ltLT5uYW1lKTsKIAkJYnJlYWs7CiAJY2FzZSBFX09SOgogCQlleHByX3ByaW50KGUtPmxlZnQuZXhwciwgZm4sIGRhdGEsIEVfT1IpOwotCQlmbihkYXRhLCAiIHx8ICIpOworCQlmbihkYXRhLCBOVUxMLCAiIHx8ICIpOwogCQlleHByX3ByaW50KGUtPnJpZ2h0LmV4cHIsIGZuLCBkYXRhLCBFX09SKTsKIAkJYnJlYWs7CiAJY2FzZSBFX0FORDoKIAkJZXhwcl9wcmludChlLT5sZWZ0LmV4cHIsIGZuLCBkYXRhLCBFX0FORCk7Ci0JCWZuKGRhdGEsICIgJiYgIik7CisJCWZuKGRhdGEsIE5VTEwsICIgJiYgIik7CiAJCWV4cHJfcHJpbnQoZS0+cmlnaHQuZXhwciwgZm4sIGRhdGEsIEVfQU5EKTsKIAkJYnJlYWs7CiAJY2FzZSBFX0NIT0lDRToKLQkJZm4oZGF0YSwgZS0+cmlnaHQuc3ltLT5uYW1lKTsKKwkJZm4oZGF0YSwgZS0+cmlnaHQuc3ltLCBlLT5yaWdodC5zeW0tPm5hbWUpOwogCQlpZiAoZS0+bGVmdC5leHByKSB7Ci0JCQlmbihkYXRhLCAiIF4gIik7CisJCQlmbihkYXRhLCBOVUxMLCAiIF4gIik7CiAJCQlleHByX3ByaW50KGUtPmxlZnQuZXhwciwgZm4sIGRhdGEsIEVfQ0hPSUNFKTsKIAkJfQogCQlicmVhazsKIAljYXNlIEVfUkFOR0U6Ci0JCWZuKGRhdGEsICJbIik7Ci0JCWZuKGRhdGEsIGUtPmxlZnQuc3ltLT5uYW1lKTsKLQkJZm4oZGF0YSwgIiAiKTsKLQkJZm4oZGF0YSwgZS0+cmlnaHQuc3ltLT5uYW1lKTsKLQkJZm4oZGF0YSwgIl0iKTsKKwkJZm4oZGF0YSwgTlVMTCwgIlsiKTsKKwkJZm4oZGF0YSwgZS0+bGVmdC5zeW0sIGUtPmxlZnQuc3ltLT5uYW1lKTsKKwkJZm4oZGF0YSwgTlVMTCwgIiAiKTsKKwkJZm4oZGF0YSwgZS0+cmlnaHQuc3ltLCBlLT5yaWdodC5zeW0tPm5hbWUpOworCQlmbihkYXRhLCBOVUxMLCAiXSIpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCSAgewogCQljaGFyIGJ1ZlszMl07CiAJCXNwcmludGYoYnVmLCAiPHVua25vd24gdHlwZSAlZD4iLCBlLT50eXBlKTsKLQkJZm4oZGF0YSwgYnVmKTsKKwkJZm4oZGF0YSwgTlVMTCwgYnVmKTsKIAkJYnJlYWs7CiAJICB9CiAJfQogCWlmIChleHByX2NvbXBhcmVfdHlwZShwcmV2dG9rZW4sIGUtPnR5cGUpID4gMCkKLQkJZm4oZGF0YSwgIikiKTsKKwkJZm4oZGF0YSwgTlVMTCwgIikiKTsKIH0KIAotc3RhdGljIHZvaWQgZXhwcl9wcmludF9maWxlX2hlbHBlcih2b2lkICpkYXRhLCBjb25zdCBjaGFyICpzdHIpCitzdGF0aWMgdm9pZCBleHByX3ByaW50X2ZpbGVfaGVscGVyKHZvaWQgKmRhdGEsIHN0cnVjdCBzeW1ib2wgKnN5bSwgY29uc3QgY2hhciAqc3RyKQogewogCWZ3cml0ZShzdHIsIHN0cmxlbihzdHIpLCAxLCBkYXRhKTsKIH0KQEAgLTEwODgsNyArMTA4OSw3IEBACiAJZXhwcl9wcmludChlLCBleHByX3ByaW50X2ZpbGVfaGVscGVyLCBvdXQsIEVfTk9ORSk7CiB9CiAKLXN0YXRpYyB2b2lkIGV4cHJfcHJpbnRfZ3N0cl9oZWxwZXIodm9pZCAqZGF0YSwgY29uc3QgY2hhciAqc3RyKQorc3RhdGljIHZvaWQgZXhwcl9wcmludF9nc3RyX2hlbHBlcih2b2lkICpkYXRhLCBzdHJ1Y3Qgc3ltYm9sICpzeW0sIGNvbnN0IGNoYXIgKnN0cikKIHsKIAlzdHJfYXBwZW5kKChzdHJ1Y3QgZ3N0ciopZGF0YSwgc3RyKTsKIH0KZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9leHByLmggYi9zY3JpcHRzL2tjb25maWcvZXhwci5oCmluZGV4IDFiMzZlZjEuLjYwODQ1MjUgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy9leHByLmgKKysrIGIvc2NyaXB0cy9rY29uZmlnL2V4cHIuaApAQCAtNjMsMTIgKzYzLDE4IEBACiAJU19VTktOT1dOLCBTX0JPT0xFQU4sIFNfVFJJU1RBVEUsIFNfSU5ULCBTX0hFWCwgU19TVFJJTkcsIFNfT1RIRVIKIH07CiAKK2VudW0geworCVNfREVGX1VTRVIsCQkvKiBtYWluIHVzZXIgdmFsdWUgKi8KKwlTX0RFRl9BVVRPLAorfTsKKwogc3RydWN0IHN5bWJvbCB7CiAJc3RydWN0IHN5bWJvbCAqbmV4dDsKIAljaGFyICpuYW1lOwogCWNoYXIgKmhlbHA7CiAJZW51bSBzeW1ib2xfdHlwZSB0eXBlOwotCXN0cnVjdCBzeW1ib2xfdmFsdWUgY3VyciwgdXNlcjsKKwlzdHJ1Y3Qgc3ltYm9sX3ZhbHVlIGN1cnI7CisJc3RydWN0IHN5bWJvbF92YWx1ZSBkZWZbNF07CiAJdHJpc3RhdGUgdmlzaWJsZTsKIAlpbnQgZmxhZ3M7CiAJc3RydWN0IHByb3BlcnR5ICpwcm9wOwpAQCAtNzgsMTAgKzg0LDcgQEAKIAogI2RlZmluZSBmb3JfYWxsX3N5bWJvbHMoaSwgc3ltKSBmb3IgKGkgPSAwOyBpIDwgMjU3OyBpKyspIGZvciAoc3ltID0gc3ltYm9sX2hhc2hbaV07IHN5bTsgc3ltID0gc3ltLT5uZXh0KSBpZiAoc3ltLT50eXBlICE9IFNfT1RIRVIpCiAKLSNkZWZpbmUgU1lNQk9MX1lFUwkJMHgwMDAxCi0jZGVmaW5lIFNZTUJPTF9NT0QJCTB4MDAwMgotI2RlZmluZSBTWU1CT0xfTk8JCTB4MDAwNAotI2RlZmluZSBTWU1CT0xfQ09OU1QJCTB4MDAwNworI2RlZmluZSBTWU1CT0xfQ09OU1QJCTB4MDAwMQogI2RlZmluZSBTWU1CT0xfQ0hFQ0sJCTB4MDAwOAogI2RlZmluZSBTWU1CT0xfQ0hPSUNFCQkweDAwMTAKICNkZWZpbmUgU1lNQk9MX0NIT0lDRVZBTAkweDAwMjAKQEAgLTkwLDEwICs5MywxNCBAQAogI2RlZmluZSBTWU1CT0xfT1BUSU9OQUwJCTB4MDEwMAogI2RlZmluZSBTWU1CT0xfV1JJVEUJCTB4MDIwMAogI2RlZmluZSBTWU1CT0xfQ0hBTkdFRAkJMHgwNDAwCi0jZGVmaW5lIFNZTUJPTF9ORVcJCTB4MDgwMAogI2RlZmluZSBTWU1CT0xfQVVUTwkJMHgxMDAwCiAjZGVmaW5lIFNZTUJPTF9DSEVDS0VECQkweDIwMDAKICNkZWZpbmUgU1lNQk9MX1dBUk5FRAkJMHg4MDAwCisjZGVmaW5lIFNZTUJPTF9ERUYJCTB4MTAwMDAKKyNkZWZpbmUgU1lNQk9MX0RFRl9VU0VSCQkweDEwMDAwCisjZGVmaW5lIFNZTUJPTF9ERUZfQVVUTwkJMHgyMDAwMAorI2RlZmluZSBTWU1CT0xfREVGMwkJMHg0MDAwMAorI2RlZmluZSBTWU1CT0xfREVGNAkJMHg4MDAwMAogCiAjZGVmaW5lIFNZTUJPTF9NQVhMRU5HVEgJMjU2CiAjZGVmaW5lIFNZTUJPTF9IQVNIU0laRQkJMjU3CkBAIC0xNDksNiArMTU2LDcgQEAKIAogZXh0ZXJuIHN0cnVjdCBzeW1ib2wgc3ltYm9sX3llcywgc3ltYm9sX25vLCBzeW1ib2xfbW9kOwogZXh0ZXJuIHN0cnVjdCBzeW1ib2wgKm1vZHVsZXNfc3ltOworZXh0ZXJuIHN0cnVjdCBzeW1ib2wgKnN5bV9kZWZjb25maWdfbGlzdDsKIGV4dGVybiBpbnQgY2RlYnVnOwogc3RydWN0IGV4cHIgKmV4cHJfYWxsb2Nfc3ltYm9sKHN0cnVjdCBzeW1ib2wgKnN5bSk7CiBzdHJ1Y3QgZXhwciAqZXhwcl9hbGxvY19vbmUoZW51bSBleHByX3R5cGUgdHlwZSwgc3RydWN0IGV4cHIgKmNlKTsKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9nY29uZi5jIGIvc2NyaXB0cy9rY29uZmlnL2djb25mLmMKaW5kZXggNjY1YmQ1My4uN2IwZDNhOSAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL2djb25mLmMKKysrIGIvc2NyaXB0cy9rY29uZmlnL2djb25mLmMKQEAgLTExNCwxMiArMTE0LDYgQEAKIAogCWJ6ZXJvKGJ1ZiwgMjU2KTsKIAotCWlmICh2YWwgJiBTWU1CT0xfWUVTKQotCQlzdHJjYXQoYnVmLCAieWVzLyIpOwotCWlmICh2YWwgJiBTWU1CT0xfTU9EKQotCQlzdHJjYXQoYnVmLCAibW9kLyIpOwotCWlmICh2YWwgJiBTWU1CT0xfTk8pCi0JCXN0cmNhdChidWYsICJuby8iKTsKIAlpZiAodmFsICYgU1lNQk9MX0NPTlNUKQogCQlzdHJjYXQoYnVmLCAiY29uc3QvIik7CiAJaWYgKHZhbCAmIFNZTUJPTF9DSEVDSykKQEAgLTEzOCw4ICsxMzIsNiBAQAogCQlzdHJjYXQoYnVmLCAid3JpdGUvIik7CiAJaWYgKHZhbCAmIFNZTUJPTF9DSEFOR0VEKQogCQlzdHJjYXQoYnVmLCAiY2hhbmdlZC8iKTsKLQlpZiAodmFsICYgU1lNQk9MX05FVykKLQkJc3RyY2F0KGJ1ZiwgIm5ldy8iKTsKIAlpZiAodmFsICYgU1lNQk9MX0FVVE8pCiAJCXN0cmNhdChidWYsICJhdXRvLyIpOwogCkBAIC0xMTkyLDkgKzExODQsNyBAQAogCiAJcm93W0NPTF9PUFRJT05dID0KIAkgICAgZ19zdHJkdXBfcHJpbnRmKCIlcyAlcyIsIG1lbnVfZ2V0X3Byb21wdChtZW51KSwKLQkJCSAgICBzeW0gPyAoc3ltLT4KLQkJCQkgICBmbGFncyAmIFNZTUJPTF9ORVcgPyAiKE5FVykiIDogIiIpIDoKLQkJCSAgICAiIik7CisJCQkgICAgc3ltICYmIHN5bV9oYXNfdmFsdWUoc3ltKSA/ICIoTkVXKSIgOiAiIik7CiAKIAlpZiAoc2hvd19hbGwgJiYgIW1lbnVfaXNfdmlzaWJsZShtZW51KSkKIAkJcm93W0NPTF9DT0xPUl0gPSBnX3N0cmR1cCgiRGFya0dyYXkiKTsKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9sZXguemNvbmYuY19zaGlwcGVkIGIvc2NyaXB0cy9rY29uZmlnL2xleC56Y29uZi5jX3NoaXBwZWQKaW5kZXggMjRlM2M4Yy4uODAwZjhjNyAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL2xleC56Y29uZi5jX3NoaXBwZWQKKysrIGIvc2NyaXB0cy9rY29uZmlnL2xleC56Y29uZi5jX3NoaXBwZWQKQEAgLTgsNyArOCw3IEBACiAjZGVmaW5lIEZMRVhfU0NBTk5FUgogI2RlZmluZSBZWV9GTEVYX01BSk9SX1ZFUlNJT04gMgogI2RlZmluZSBZWV9GTEVYX01JTk9SX1ZFUlNJT04gNQotI2RlZmluZSBZWV9GTEVYX1NVQk1JTk9SX1ZFUlNJT04gMzEKKyNkZWZpbmUgWVlfRkxFWF9TVUJNSU5PUl9WRVJTSU9OIDMzCiAjaWYgWVlfRkxFWF9TVUJNSU5PUl9WRVJTSU9OID4gMAogI2RlZmluZSBGTEVYX0JFVEEKICNlbmRpZgpAQCAtMzAsNyArMzAsMTUgQEAKIAogLyogQzk5IHN5c3RlbXMgaGF2ZSA8aW50dHlwZXMuaD4uIE5vbi1DOTkgc3lzdGVtcyBtYXkgb3IgbWF5IG5vdC4gKi8KIAotI2lmIGRlZmluZWQgX19TVERDX1ZFUlNJT05fXyAmJiBfX1NURENfVkVSU0lPTl9fID49IDE5OTkwMUwKKyNpZiBfX1NURENfVkVSU0lPTl9fID49IDE5OTkwMUwKKworLyogQzk5IHNheXMgdG8gZGVmaW5lIF9fU1REQ19MSU1JVF9NQUNST1MgYmVmb3JlIGluY2x1ZGluZyBzdGRpbnQuaCwKKyAqIGlmIHlvdSB3YW50IHRoZSBsaW1pdCAobWF4L21pbikgbWFjcm9zIGZvciBpbnQgdHlwZXMuCisgKi8KKyNpZm5kZWYgX19TVERDX0xJTUlUX01BQ1JPUworI2RlZmluZSBfX1NURENfTElNSVRfTUFDUk9TIDEKKyNlbmRpZgorCiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KIHR5cGVkZWYgaW50OF90IGZsZXhfaW50OF90OwogdHlwZWRlZiB1aW50OF90IGZsZXhfdWludDhfdDsKQEAgLTEzNCw2ICsxNDIsMTAgQEAKICNkZWZpbmUgWVlfQlVGX1NJWkUgMTYzODQKICNlbmRpZgogCisvKiBUaGUgc3RhdGUgYnVmIG11c3QgYmUgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgb25lIHN0YXRlIHBlciBjaGFyYWN0ZXIgaW4gdGhlIG1haW4gYnVmZmVyLgorICovCisjZGVmaW5lIFlZX1NUQVRFX0JVRl9TSVpFICAgKChZWV9CVUZfU0laRSArIDIpICogc2l6ZW9mKHl5X3N0YXRlX3R5cGUpKQorCiAjaWZuZGVmIFlZX1RZUEVERUZfWVlfQlVGRkVSX1NUQVRFCiAjZGVmaW5lIFlZX1RZUEVERUZfWVlfQlVGRkVSX1NUQVRFCiB0eXBlZGVmIHN0cnVjdCB5eV9idWZmZXJfc3RhdGUgKllZX0JVRkZFUl9TVEFURTsKQEAgLTI2Nyw3ICsyNzksNyBAQAogCiAvKiBQb2ludHMgdG8gY3VycmVudCBjaGFyYWN0ZXIgaW4gYnVmZmVyLiAqLwogc3RhdGljIGNoYXIgKnl5X2NfYnVmX3AgPSAoY2hhciAqKSAwOwotc3RhdGljIGludCB5eV9pbml0ID0gMTsJCS8qIHdoZXRoZXIgd2UgbmVlZCB0byBpbml0aWFsaXplICovCitzdGF0aWMgaW50IHl5X2luaXQgPSAwOwkJLyogd2hldGhlciB3ZSBuZWVkIHRvIGluaXRpYWxpemUgKi8KIHN0YXRpYyBpbnQgeXlfc3RhcnQgPSAwOwkvKiBzdGFydCBzdGF0ZSBudW1iZXIgKi8KIAogLyogRmxhZyB3aGljaCBpcyB1c2VkIHRvIGFsbG93IHpjb25md3JhcCgpJ3MgdG8gZG8gYnVmZmVyIHN3aXRjaGVzCkBAIC04MjAsNiArODMyLDggQEAKICNkZWZpbmUgWVlfRVhUUkFfVFlQRSB2b2lkICoKICNlbmRpZgogCitzdGF0aWMgaW50IHl5X2luaXRfZ2xvYmFscyAodm9pZCApOworCiAvKiBNYWNyb3MgYWZ0ZXIgdGhpcyBwb2ludCBjYW4gYWxsIGJlIG92ZXJyaWRkZW4gYnkgdXNlciBkZWZpbml0aW9ucyBpbgogICogc2VjdGlvbiAxLgogICovCkBAIC05NDIsOSArOTU2LDkgQEAKIAlpbnQgc3RyID0gMDsKIAlpbnQgdHMsIGk7CiAKLQlpZiAoICh5eV9pbml0KSApCisJaWYgKCAhKHl5X2luaXQpICkKIAkJewotCQkoeXlfaW5pdCkgPSAwOworCQkoeXlfaW5pdCkgPSAxOwogCiAjaWZkZWYgWVlfVVNFUl9JTklUCiAJCVlZX1VTRVJfSU5JVDsKQEAgLTE0NTIsNyArMTQ2Niw3IEBACiAKIAllbHNlCiAJCXsKLQkJCXNpemVfdCBudW1fdG9fcmVhZCA9CisJCQlpbnQgbnVtX3RvX3JlYWQgPQogCQkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9idWZfc2l6ZSAtIG51bWJlcl90b19tb3ZlIC0gMTsKIAogCQl3aGlsZSAoIG51bV90b19yZWFkIDw9IDAgKQpAQCAtMTk2OSwxNiArMTk4MywxNiBAQAogCiAvKiogU2V0dXAgdGhlIGlucHV0IGJ1ZmZlciBzdGF0ZSB0byBzY2FuIGEgc3RyaW5nLiBUaGUgbmV4dCBjYWxsIHRvIHpjb25mbGV4KCkgd2lsbAogICogc2NhbiBmcm9tIGEgQGUgY29weSBvZiBAYSBzdHIuCi0gKiBAcGFyYW0geXlfc3RyIGEgTlVMLXRlcm1pbmF0ZWQgc3RyaW5nIHRvIHNjYW4KKyAqIEBwYXJhbSB5eXN0ciBhIE5VTC10ZXJtaW5hdGVkIHN0cmluZyB0byBzY2FuCiAgKiAKICAqIEByZXR1cm4gdGhlIG5ld2x5IGFsbG9jYXRlZCBidWZmZXIgc3RhdGUgb2JqZWN0LgogICogQG5vdGUgSWYgeW91IHdhbnQgdG8gc2NhbiBieXRlcyB0aGF0IG1heSBjb250YWluIE5VTCB2YWx1ZXMsIHRoZW4gdXNlCiAgKiAgICAgICB6Y29uZl9zY2FuX2J5dGVzKCkgaW5zdGVhZC4KICAqLwotWVlfQlVGRkVSX1NUQVRFIHpjb25mX3NjYW5fc3RyaW5nICh5eWNvbnN0IGNoYXIgKiB5eV9zdHIgKQorWVlfQlVGRkVSX1NUQVRFIHpjb25mX3NjYW5fc3RyaW5nICh5eWNvbnN0IGNoYXIgKiB5eXN0ciApCiB7CiAgICAgCi0JcmV0dXJuIHpjb25mX3NjYW5fYnl0ZXMoeXlfc3RyLHN0cmxlbih5eV9zdHIpICk7CisJcmV0dXJuIHpjb25mX3NjYW5fYnl0ZXMoeXlzdHIsc3RybGVuKHl5c3RyKSApOwogfQogCiAvKiogU2V0dXAgdGhlIGlucHV0IGJ1ZmZlciBzdGF0ZSB0byBzY2FuIHRoZSBnaXZlbiBieXRlcy4gVGhlIG5leHQgY2FsbCB0byB6Y29uZmxleCgpIHdpbGwKQEAgLTE5ODgsNyArMjAwMiw3IEBACiAgKiAKICAqIEByZXR1cm4gdGhlIG5ld2x5IGFsbG9jYXRlZCBidWZmZXIgc3RhdGUgb2JqZWN0LgogICovCi1ZWV9CVUZGRVJfU1RBVEUgemNvbmZfc2Nhbl9ieXRlcyAgKHl5Y29uc3QgY2hhciAqIGJ5dGVzLCBpbnQgIGxlbiApCitZWV9CVUZGRVJfU1RBVEUgemNvbmZfc2Nhbl9ieXRlcyAgKHl5Y29uc3QgY2hhciAqIHl5Ynl0ZXMsIGludCAgX3l5Ynl0ZXNfbGVuICkKIHsKIAlZWV9CVUZGRVJfU1RBVEUgYjsKIAljaGFyICpidWY7CkBAIC0xOTk2LDE1ICsyMDEwLDE1IEBACiAJaW50IGk7CiAgICAgCiAJLyogR2V0IG1lbW9yeSBmb3IgZnVsbCBidWZmZXIsIGluY2x1ZGluZyBzcGFjZSBmb3IgdHJhaWxpbmcgRU9CJ3MuICovCi0JbiA9IGxlbiArIDI7CisJbiA9IF95eWJ5dGVzX2xlbiArIDI7CiAJYnVmID0gKGNoYXIgKikgemNvbmZhbGxvYyhuICApOwogCWlmICggISBidWYgKQogCQlZWV9GQVRBTF9FUlJPUiggIm91dCBvZiBkeW5hbWljIG1lbW9yeSBpbiB6Y29uZl9zY2FuX2J5dGVzKCkiICk7CiAKLQlmb3IgKCBpID0gMDsgaSA8IGxlbjsgKytpICkKLQkJYnVmW2ldID0gYnl0ZXNbaV07CisJZm9yICggaSA9IDA7IGkgPCBfeXlieXRlc19sZW47ICsraSApCisJCWJ1ZltpXSA9IHl5Ynl0ZXNbaV07CiAKLQlidWZbbGVuXSA9IGJ1ZltsZW4rMV0gPSBZWV9FTkRfT0ZfQlVGRkVSX0NIQVI7CisJYnVmW195eWJ5dGVzX2xlbl0gPSBidWZbX3l5Ynl0ZXNfbGVuKzFdID0gWVlfRU5EX09GX0JVRkZFUl9DSEFSOwogCiAJYiA9IHpjb25mX3NjYW5fYnVmZmVyKGJ1ZixuICk7CiAJaWYgKCAhIGIgKQpAQCAtMjEyNSw2ICsyMTM5LDM0IEBACiAgICAgICAgIHpjb25mX2ZsZXhfZGVidWcgPSBiZGVidWcgOwogfQogCitzdGF0aWMgaW50IHl5X2luaXRfZ2xvYmFscyAodm9pZCkKK3sKKyAgICAgICAgLyogSW5pdGlhbGl6YXRpb24gaXMgdGhlIHNhbWUgYXMgZm9yIHRoZSBub24tcmVlbnRyYW50IHNjYW5uZXIuCisgICAgICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSB6Y29uZmxleF9kZXN0cm95KCksIHNvIGRvbid0IGFsbG9jYXRlIGhlcmUuCisgICAgICovCisKKyAgICAoeXlfYnVmZmVyX3N0YWNrKSA9IDA7CisgICAgKHl5X2J1ZmZlcl9zdGFja190b3ApID0gMDsKKyAgICAoeXlfYnVmZmVyX3N0YWNrX21heCkgPSAwOworICAgICh5eV9jX2J1Zl9wKSA9IChjaGFyICopIDA7CisgICAgKHl5X2luaXQpID0gMDsKKyAgICAoeXlfc3RhcnQpID0gMDsKKworLyogRGVmaW5lZCBpbiBtYWluLmMgKi8KKyNpZmRlZiBZWV9TVERJTklUCisgICAgemNvbmZpbiA9IHN0ZGluOworICAgIHpjb25mb3V0ID0gc3Rkb3V0OworI2Vsc2UKKyAgICB6Y29uZmluID0gKEZJTEUgKikgMDsKKyAgICB6Y29uZm91dCA9IChGSUxFICopIDA7CisjZW5kaWYKKworICAgIC8qIEZvciBmdXR1cmUgcmVmZXJlbmNlOiBTZXQgZXJybm8gb24gZXJyb3IsIHNpbmNlIHdlIGFyZSBjYWxsZWQgYnkKKyAgICAgKiB6Y29uZmxleF9pbml0KCkKKyAgICAgKi8KKyAgICByZXR1cm4gMDsKK30KKwogLyogemNvbmZsZXhfZGVzdHJveSBpcyBmb3IgYm90aCByZWVudHJhbnQgYW5kIG5vbi1yZWVudHJhbnQgc2Nhbm5lcnMuICovCiBpbnQgemNvbmZsZXhfZGVzdHJveSAgKHZvaWQpCiB7CkBAIC0yMTQwLDYgKzIxODIsMTAgQEAKIAl6Y29uZmZyZWUoKHl5X2J1ZmZlcl9zdGFjaykgKTsKIAkoeXlfYnVmZmVyX3N0YWNrKSA9IE5VTEw7CiAKKyAgICAvKiBSZXNldCB0aGUgZ2xvYmFscy4gVGhpcyBpcyBpbXBvcnRhbnQgaW4gYSBub24tcmVlbnRyYW50IHNjYW5uZXIgc28gdGhlIG5leHQgdGltZQorICAgICAqIHpjb25mbGV4KCkgaXMgY2FsbGVkLCBpbml0aWFsaXphdGlvbiB3aWxsIG9jY3VyLiAqLworICAgIHl5X2luaXRfZ2xvYmFscyggKTsKKwogICAgIHJldHVybiAwOwogfQogCkBAIC0yMTUxLDcgKzIxOTcsNyBAQAogc3RhdGljIHZvaWQgeXlfZmxleF9zdHJuY3B5IChjaGFyKiBzMSwgeXljb25zdCBjaGFyICogczIsIGludCBuICkKIHsKIAlyZWdpc3RlciBpbnQgaTsKLSAgICAJZm9yICggaSA9IDA7IGkgPCBuOyArK2kgKQorCWZvciAoIGkgPSAwOyBpIDwgbjsgKytpICkKIAkJczFbaV0gPSBzMltpXTsKIH0KICNlbmRpZgpAQCAtMjE2MCw3ICsyMjA2LDcgQEAKIHN0YXRpYyBpbnQgeXlfZmxleF9zdHJsZW4gKHl5Y29uc3QgY2hhciAqIHMgKQogewogCXJlZ2lzdGVyIGludCBuOwotICAgIAlmb3IgKCBuID0gMDsgc1tuXTsgKytuICkKKwlmb3IgKCBuID0gMDsgc1tuXTsgKytuICkKIAkJOwogCiAJcmV0dXJuIG47CkBAIC0yMTkxLDE5ICsyMjM3LDYgQEAKIAogI2RlZmluZSBZWVRBQkxFU19OQU1FICJ5eXRhYmxlcyIKIAotI3VuZGVmIFlZX05FV19GSUxFCi0jdW5kZWYgWVlfRkxVU0hfQlVGRkVSCi0jdW5kZWYgeXlfc2V0X2JvbAotI3VuZGVmIHl5X25ld19idWZmZXIKLSN1bmRlZiB5eV9zZXRfaW50ZXJhY3RpdmUKLSN1bmRlZiB5eXRleHRfcHRyCi0jdW5kZWYgWVlfRE9fQkVGT1JFX0FDVElPTgotCi0jaWZkZWYgWVlfREVDTF9JU19PVVJTCi0jdW5kZWYgWVlfREVDTF9JU19PVVJTCi0jdW5kZWYgWVlfREVDTAotI2VuZGlmCi0KIHZvaWQgemNvbmZfc3RhcnRoZWxwKHZvaWQpCiB7CiAJbmV3X3N0cmluZygpOwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL2xrYy5oIGIvc2NyaXB0cy9rY29uZmlnL2xrYy5oCmluZGV4IDUyN2Y2MGMuLjI2MjgwMjMgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy9sa2MuaAorKysgYi9zY3JpcHRzL2tjb25maWcvbGtjLmgKQEAgLTQwLDYgKzQwLDEwIEBACiAKICNkZWZpbmUgVEZfQ09NTUFORAkweDAwMDEKICNkZWZpbmUgVEZfUEFSQU0JMHgwMDAyCisjZGVmaW5lIFRGX09QVElPTgkweDAwMDQKKworI2RlZmluZSBUX09QVF9NT0RVTEVTCQkxCisjZGVmaW5lIFRfT1BUX0RFRkNPTkZJR19MSVNUCTIKIAogc3RydWN0IGtjb25mX2lkIHsKIAlpbnQgbmFtZTsKQEAgLTYwLDggKzY0LDYgQEAKIGNoYXIgKnpjb25mX2N1cm5hbWUodm9pZCk7CiAKIC8qIGNvbmZkYXRhLmMgKi8KLWV4dGVybiBjb25zdCBjaGFyIGNvbmZfZGVmX2ZpbGVuYW1lW107Ci0KIGNoYXIgKmNvbmZfZ2V0X2RlZmF1bHRfY29uZm5hbWUodm9pZCk7CiAKIC8qIGtjb25maWdfbG9hZC5jICovCkBAIC03OCw2ICs4MCw3IEBACiBzdHJ1Y3QgcHJvcGVydHkgKm1lbnVfYWRkX3Byb21wdChlbnVtIHByb3BfdHlwZSB0eXBlLCBjaGFyICpwcm9tcHQsIHN0cnVjdCBleHByICpkZXApOwogdm9pZCBtZW51X2FkZF9leHByKGVudW0gcHJvcF90eXBlIHR5cGUsIHN0cnVjdCBleHByICpleHByLCBzdHJ1Y3QgZXhwciAqZGVwKTsKIHZvaWQgbWVudV9hZGRfc3ltYm9sKGVudW0gcHJvcF90eXBlIHR5cGUsIHN0cnVjdCBzeW1ib2wgKnN5bSwgc3RydWN0IGV4cHIgKmRlcCk7Cit2b2lkIG1lbnVfYWRkX29wdGlvbihpbnQgdG9rZW4sIGNoYXIgKmFyZyk7CiB2b2lkIG1lbnVfZmluYWxpemUoc3RydWN0IG1lbnUgKnBhcmVudCk7CiB2b2lkIG1lbnVfc2V0X3R5cGUoaW50IHR5cGUpOwogCkBAIC05OSw2ICsxMDIsNyBAQAogLyogc3ltYm9sLmMgKi8KIHZvaWQgc3ltX2luaXQodm9pZCk7CiB2b2lkIHN5bV9jbGVhcl9hbGxfdmFsaWQodm9pZCk7Cit2b2lkIHN5bV9zZXRfYWxsX2NoYW5nZWQodm9pZCk7CiB2b2lkIHN5bV9zZXRfY2hhbmdlZChzdHJ1Y3Qgc3ltYm9sICpzeW0pOwogc3RydWN0IHN5bWJvbCAqc3ltX2NoZWNrX2RlcHMoc3RydWN0IHN5bWJvbCAqc3ltKTsKIHN0cnVjdCBwcm9wZXJ0eSAqcHJvcF9hbGxvYyhlbnVtIHByb3BfdHlwZSB0eXBlLCBzdHJ1Y3Qgc3ltYm9sICpzeW0pOwpAQCAtMTM3LDcgKzE0MSw3IEBACiAKIHN0YXRpYyBpbmxpbmUgYm9vbCBzeW1faGFzX3ZhbHVlKHN0cnVjdCBzeW1ib2wgKnN5bSkKIHsKLQlyZXR1cm4gc3ltLT5mbGFncyAmIFNZTUJPTF9ORVcgPyBmYWxzZSA6IHRydWU7CisJcmV0dXJuIHN5bS0+ZmxhZ3MgJiBTWU1CT0xfREVGX1VTRVIgPyB0cnVlIDogZmFsc2U7CiB9CiAKICNpZmRlZiBfX2NwbHVzcGx1cwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL2xrY19wcm90by5oIGIvc2NyaXB0cy9rY29uZmlnL2xrY19wcm90by5oCmluZGV4IGI2YTM4OWMuLmEyNjM3NDYgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy9sa2NfcHJvdG8uaAorKysgYi9zY3JpcHRzL2tjb25maWcvbGtjX3Byb3RvLmgKQEAgLTIsOCArMiw5IEBACiAvKiBjb25mZGF0YS5jICovCiBQKGNvbmZfcGFyc2Usdm9pZCwoY29uc3QgY2hhciAqbmFtZSkpOwogUChjb25mX3JlYWQsaW50LChjb25zdCBjaGFyICpuYW1lKSk7Ci1QKGNvbmZfcmVhZF9zaW1wbGUsaW50LChjb25zdCBjaGFyICpuYW1lKSk7CitQKGNvbmZfcmVhZF9zaW1wbGUsaW50LChjb25zdCBjaGFyICpuYW1lLCBpbnQpKTsKIFAoY29uZl93cml0ZSxpbnQsKGNvbnN0IGNoYXIgKm5hbWUpKTsKK1AoY29uZl93cml0ZV9hdXRvY29uZixpbnQsKHZvaWQpKTsKIAogLyogbWVudS5jICovCiBQKHJvb3RtZW51LHN0cnVjdCBtZW51LCk7CkBAIC0zOCw0ICszOSw0IEBACiAKIC8qIGV4cHIuYyAqLwogUChleHByX2NvbXBhcmVfdHlwZSxpbnQsKGVudW0gZXhwcl90eXBlIHQxLCBlbnVtIGV4cHJfdHlwZSB0MikpOwotUChleHByX3ByaW50LHZvaWQsKHN0cnVjdCBleHByICplLCB2b2lkICgqZm4pKHZvaWQgKiwgY29uc3QgY2hhciAqKSwgdm9pZCAqZGF0YSwgaW50IHByZXZ0b2tlbikpOworUChleHByX3ByaW50LHZvaWQsKHN0cnVjdCBleHByICplLCB2b2lkICgqZm4pKHZvaWQgKiwgc3RydWN0IHN5bWJvbCAqLCBjb25zdCBjaGFyICopLCB2b2lkICpkYXRhLCBpbnQgcHJldnRva2VuKSk7CmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvbWVudS5jIGIvc2NyaXB0cy9rY29uZmlnL21lbnUuYwppbmRleCAwZmNlMjBjLi5jODZjMjdmIDEwMDY0NAotLS0gYS9zY3JpcHRzL2tjb25maWcvbWVudS5jCisrKyBiL3NjcmlwdHMva2NvbmZpZy9tZW51LmMKQEAgLTExNCw3ICsxMTQsNyBAQAogCQlzeW0tPnR5cGUgPSB0eXBlOwogCQlyZXR1cm47CiAJfQotCW1lbnVfd2FybihjdXJyZW50X2VudHJ5LCAidHlwZSBvZiAnJXMnIHJlZGVmaW5lZCBmcm9tICclcycgdG8gJyVzJ1xuIiwKKwltZW51X3dhcm4oY3VycmVudF9lbnRyeSwgInR5cGUgb2YgJyVzJyByZWRlZmluZWQgZnJvbSAnJXMnIHRvICclcyciLAogCSAgICBzeW0tPm5hbWUgPyBzeW0tPm5hbWUgOiAiPGNob2ljZT4iLAogCSAgICBzeW1fdHlwZV9uYW1lKHN5bS0+dHlwZSksIHN5bV90eXBlX25hbWUodHlwZSkpOwogfQpAQCAtMTI0LDE1ICsxMjQsMjAgQEAKIAlzdHJ1Y3QgcHJvcGVydHkgKnByb3AgPSBwcm9wX2FsbG9jKHR5cGUsIGN1cnJlbnRfZW50cnktPnN5bSk7CiAKIAlwcm9wLT5tZW51ID0gY3VycmVudF9lbnRyeTsKLQlwcm9wLT50ZXh0ID0gcHJvbXB0OwogCXByb3AtPmV4cHIgPSBleHByOwogCXByb3AtPnZpc2libGUuZXhwciA9IG1lbnVfY2hlY2tfZGVwKGRlcCk7CiAKIAlpZiAocHJvbXB0KSB7CisJCWlmIChpc3NwYWNlKCpwcm9tcHQpKSB7CisJCQlwcm9wX3dhcm4ocHJvcCwgImxlYWRpbmcgd2hpdGVzcGFjZSBpZ25vcmVkIik7CisJCQl3aGlsZSAoaXNzcGFjZSgqcHJvbXB0KSkKKwkJCQlwcm9tcHQrKzsKKwkJfQogCQlpZiAoY3VycmVudF9lbnRyeS0+cHJvbXB0KQotCQkJbWVudV93YXJuKGN1cnJlbnRfZW50cnksICJwcm9tcHQgcmVkZWZpbmVkXG4iKTsKKwkJCXByb3Bfd2Fybihwcm9wLCAicHJvbXB0IHJlZGVmaW5lZCIpOwogCQljdXJyZW50X2VudHJ5LT5wcm9tcHQgPSBwcm9wOwogCX0KKwlwcm9wLT50ZXh0ID0gcHJvbXB0OwogCiAJcmV0dXJuIHByb3A7CiB9CkBAIC0xNTIsNiArMTU3LDI0IEBACiAJbWVudV9hZGRfcHJvcCh0eXBlLCBOVUxMLCBleHByX2FsbG9jX3N5bWJvbChzeW0pLCBkZXApOwogfQogCit2b2lkIG1lbnVfYWRkX29wdGlvbihpbnQgdG9rZW4sIGNoYXIgKmFyZykKK3sKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisKKwlzd2l0Y2ggKHRva2VuKSB7CisJY2FzZSBUX09QVF9NT0RVTEVTOgorCQlwcm9wID0gcHJvcF9hbGxvYyhQX0RFRkFVTFQsIG1vZHVsZXNfc3ltKTsKKwkJcHJvcC0+ZXhwciA9IGV4cHJfYWxsb2Nfc3ltYm9sKGN1cnJlbnRfZW50cnktPnN5bSk7CisJCWJyZWFrOworCWNhc2UgVF9PUFRfREVGQ09ORklHX0xJU1Q6CisJCWlmICghc3ltX2RlZmNvbmZpZ19saXN0KQorCQkJc3ltX2RlZmNvbmZpZ19saXN0ID0gY3VycmVudF9lbnRyeS0+c3ltOworCQllbHNlIGlmIChzeW1fZGVmY29uZmlnX2xpc3QgIT0gY3VycmVudF9lbnRyeS0+c3ltKQorCQkJemNvbmZfZXJyb3IoInRyeWluZyB0byByZWRlZmluZSBkZWZjb25maWcgc3ltYm9sIik7CisJCWJyZWFrOworCX0KK30KKwogc3RhdGljIGludCBtZW51X3JhbmdlX3ZhbGlkX3N5bShzdHJ1Y3Qgc3ltYm9sICpzeW0sIHN0cnVjdCBzeW1ib2wgKnN5bTIpCiB7CiAJcmV0dXJuIHN5bTItPnR5cGUgPT0gU19JTlQgfHwgc3ltMi0+dHlwZSA9PSBTX0hFWCB8fApAQCAtMzI1LDExICszNDgsMTAgQEAKIAogCWlmIChzeW0gJiYgIShzeW0tPmZsYWdzICYgU1lNQk9MX1dBUk5FRCkpIHsKIAkJaWYgKHN5bS0+dHlwZSA9PSBTX1VOS05PV04pCi0JCQltZW51X3dhcm4ocGFyZW50LCAiY29uZmlnIHN5bWJvbCBkZWZpbmVkICIKLQkJCSAgICAid2l0aG91dCB0eXBlXG4iKTsKKwkJCW1lbnVfd2FybihwYXJlbnQsICJjb25maWcgc3ltYm9sIGRlZmluZWQgd2l0aG91dCB0eXBlIik7CiAKIAkJaWYgKHN5bV9pc19jaG9pY2Uoc3ltKSAmJiAhcGFyZW50LT5wcm9tcHQpCi0JCQltZW51X3dhcm4ocGFyZW50LCAiY2hvaWNlIG11c3QgaGF2ZSBhIHByb21wdFxuIik7CisJCQltZW51X3dhcm4ocGFyZW50LCAiY2hvaWNlIG11c3QgaGF2ZSBhIHByb21wdCIpOwogCiAJCS8qIENoZWNrIHByb3BlcnRpZXMgY29ubmVjdGVkIHRvIHRoaXMgc3ltYm9sICovCiAJCXN5bV9jaGVja19wcm9wKHN5bSk7CmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvcWNvbmYuY2MgYi9zY3JpcHRzL2tjb25maWcvcWNvbmYuY2MKaW5kZXggNDU5MGNkMy4uMzkzZjM3NCAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL3Fjb25mLmNjCisrKyBiL3NjcmlwdHMva2NvbmZpZy9xY29uZi5jYwpAQCAtNiwxNiArNiwyMCBAQAogI2luY2x1ZGUgPHFhcHBsaWNhdGlvbi5oPgogI2luY2x1ZGUgPHFtYWlud2luZG93Lmg+CiAjaW5jbHVkZSA8cXRvb2xiYXIuaD4KKyNpbmNsdWRlIDxxbGF5b3V0Lmg+CiAjaW5jbHVkZSA8cXZib3guaD4KICNpbmNsdWRlIDxxc3BsaXR0ZXIuaD4KICNpbmNsdWRlIDxxbGlzdHZpZXcuaD4KLSNpbmNsdWRlIDxxdGV4dHZpZXcuaD4KKyNpbmNsdWRlIDxxdGV4dGJyb3dzZXIuaD4KICNpbmNsdWRlIDxxbGluZWVkaXQuaD4KKyNpbmNsdWRlIDxxbGFiZWwuaD4KKyNpbmNsdWRlIDxxcHVzaGJ1dHRvbi5oPgogI2luY2x1ZGUgPHFtZW51YmFyLmg+CiAjaW5jbHVkZSA8cW1lc3NhZ2Vib3guaD4KICNpbmNsdWRlIDxxYWN0aW9uLmg+CiAjaW5jbHVkZSA8cWhlYWRlci5oPgogI2luY2x1ZGUgPHFmaWxlZGlhbG9nLmg+CisjaW5jbHVkZSA8cWRyYWdvYmplY3QuaD4KICNpbmNsdWRlIDxxcmVnZXhwLmg+CiAKICNpbmNsdWRlIDxzdGRsaWIuaD4KQEAgLTMyLDMyICszNiwxNiBAQAogI2VuZGlmCiAKIHN0YXRpYyBRQXBwbGljYXRpb24gKmNvbmZpZ0FwcDsKK3N0YXRpYyBDb25maWdTZXR0aW5ncyAqY29uZmlnU2V0dGluZ3M7CiAKIHN0YXRpYyBpbmxpbmUgUVN0cmluZyBxZ2V0dGV4dChjb25zdCBjaGFyKiBzdHIpCiB7Ci0gIHJldHVybiBRU3RyaW5nOjpmcm9tTG9jYWw4Qml0KGdldHRleHQoc3RyKSk7CisJcmV0dXJuIFFTdHJpbmc6OmZyb21Mb2NhbDhCaXQoZ2V0dGV4dChzdHIpKTsKIH0KIAogc3RhdGljIGlubGluZSBRU3RyaW5nIHFnZXR0ZXh0KGNvbnN0IFFTdHJpbmcmIHN0cikKIHsKLSAgcmV0dXJuIFFTdHJpbmc6OmZyb21Mb2NhbDhCaXQoZ2V0dGV4dChzdHIubGF0aW4xKCkpKTsKLX0KLQotQ29uZmlnU2V0dGluZ3M6OkNvbmZpZ1NldHRpbmdzKCkKLQk6IHNob3dBbGwoZmFsc2UpLCBzaG93TmFtZShmYWxzZSksIHNob3dSYW5nZShmYWxzZSksIHNob3dEYXRhKGZhbHNlKQotewotfQotCi0jaWYgUVRfVkVSU0lPTiA+PSAzMDAKLS8qKgotICogUmVhZHMgdGhlIGxpc3QgY29sdW1uIHNldHRpbmdzIGZyb20gdGhlIGFwcGxpY2F0aW9uIHNldHRpbmdzLgotICovCi12b2lkIENvbmZpZ1NldHRpbmdzOjpyZWFkTGlzdFNldHRpbmdzKCkKLXsKLQlzaG93QWxsID0gcmVhZEJvb2xFbnRyeSgiL2tjb25maWcvcWNvbmYvc2hvd0FsbCIsIGZhbHNlKTsKLQlzaG93TmFtZSA9IHJlYWRCb29sRW50cnkoIi9rY29uZmlnL3Fjb25mL3Nob3dOYW1lIiwgZmFsc2UpOwotCXNob3dSYW5nZSA9IHJlYWRCb29sRW50cnkoIi9rY29uZmlnL3Fjb25mL3Nob3dSYW5nZSIsIGZhbHNlKTsKLQlzaG93RGF0YSA9IHJlYWRCb29sRW50cnkoIi9rY29uZmlnL3Fjb25mL3Nob3dEYXRhIiwgZmFsc2UpOworCXJldHVybiBRU3RyaW5nOjpmcm9tTG9jYWw4Qml0KGdldHRleHQoc3RyLmxhdGluMSgpKSk7CiB9CiAKIC8qKgpAQCAtODgsNzcgKzc2LDggQEAKIAkJc3RyaW5nTGlzdC5wdXNoX2JhY2soUVN0cmluZzo6bnVtYmVyKCppdCkpOwogCXJldHVybiB3cml0ZUVudHJ5KGtleSwgc3RyaW5nTGlzdCk7CiB9Ci0jZW5kaWYKIAogCi0vKgotICogdXBkYXRlIGFsbCB0aGUgY2hpbGRyZW4gb2YgYSBtZW51IGVudHJ5Ci0gKiAgIHJlbW92ZXMvYWRkcyB0aGUgZW50cmllcyBmcm9tIHRoZSBwYXJlbnQgd2lkZ2V0IGFzIG5lY2Vzc2FyeQotICoKLSAqIHBhcmVudDogZWl0aGVyIHRoZSBtZW51IGxpc3Qgd2lkZ2V0IG9yIGEgbWVudSBlbnRyeSB3aWRnZXQKLSAqIG1lbnU6IGVudHJ5IHRvIGJlIHVwZGF0ZWQKLSAqLwotdGVtcGxhdGUgPGNsYXNzIFA+Ci12b2lkIENvbmZpZ0xpc3Q6OnVwZGF0ZU1lbnVMaXN0KFAqIHBhcmVudCwgc3RydWN0IG1lbnUqIG1lbnUpCi17Ci0Jc3RydWN0IG1lbnUqIGNoaWxkOwotCUNvbmZpZ0l0ZW0qIGl0ZW07Ci0JQ29uZmlnSXRlbSogbGFzdDsKLQlib29sIHZpc2libGU7Ci0JZW51bSBwcm9wX3R5cGUgdHlwZTsKLQotCWlmICghbWVudSkgewotCQl3aGlsZSAoKGl0ZW0gPSBwYXJlbnQtPmZpcnN0Q2hpbGQoKSkpCi0JCQlkZWxldGUgaXRlbTsKLQkJcmV0dXJuOwotCX0KLQotCWxhc3QgPSBwYXJlbnQtPmZpcnN0Q2hpbGQoKTsKLQlpZiAobGFzdCAmJiAhbGFzdC0+Z29QYXJlbnQpCi0JCWxhc3QgPSAwOwotCWZvciAoY2hpbGQgPSBtZW51LT5saXN0OyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+bmV4dCkgewotCQlpdGVtID0gbGFzdCA/IGxhc3QtPm5leHRTaWJsaW5nKCkgOiBwYXJlbnQtPmZpcnN0Q2hpbGQoKTsKLQkJdHlwZSA9IGNoaWxkLT5wcm9tcHQgPyBjaGlsZC0+cHJvbXB0LT50eXBlIDogUF9VTktOT1dOOwotCi0JCXN3aXRjaCAobW9kZSkgewotCQljYXNlIG1lbnVNb2RlOgotCQkJaWYgKCEoY2hpbGQtPmZsYWdzICYgTUVOVV9ST09UKSkKLQkJCQlnb3RvIGhpZGU7Ci0JCQlicmVhazsKLQkJY2FzZSBzeW1ib2xNb2RlOgotCQkJaWYgKGNoaWxkLT5mbGFncyAmIE1FTlVfUk9PVCkKLQkJCQlnb3RvIGhpZGU7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCQl9Ci0KLQkJdmlzaWJsZSA9IG1lbnVfaXNfdmlzaWJsZShjaGlsZCk7Ci0JCWlmIChzaG93QWxsIHx8IHZpc2libGUpIHsKLQkJCWlmICghaXRlbSB8fCBpdGVtLT5tZW51ICE9IGNoaWxkKQotCQkJCWl0ZW0gPSBuZXcgQ29uZmlnSXRlbShwYXJlbnQsIGxhc3QsIGNoaWxkLCB2aXNpYmxlKTsKLQkJCWVsc2UKLQkJCQlpdGVtLT50ZXN0VXBkYXRlTWVudSh2aXNpYmxlKTsKLQotCQkJaWYgKG1vZGUgPT0gZnVsbE1vZGUgfHwgbW9kZSA9PSBtZW51TW9kZSB8fCB0eXBlICE9IFBfTUVOVSkKLQkJCQl1cGRhdGVNZW51TGlzdChpdGVtLCBjaGlsZCk7Ci0JCQllbHNlCi0JCQkJdXBkYXRlTWVudUxpc3QoaXRlbSwgMCk7Ci0JCQlsYXN0ID0gaXRlbTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JaGlkZToKLQkJaWYgKGl0ZW0gJiYgaXRlbS0+bWVudSA9PSBjaGlsZCkgewotCQkJbGFzdCA9IHBhcmVudC0+Zmlyc3RDaGlsZCgpOwotCQkJaWYgKGxhc3QgPT0gaXRlbSkKLQkJCQlsYXN0ID0gMDsKLQkJCWVsc2Ugd2hpbGUgKGxhc3QtPm5leHRTaWJsaW5nKCkgIT0gaXRlbSkKLQkJCQlsYXN0ID0gbGFzdC0+bmV4dFNpYmxpbmcoKTsKLQkJCWRlbGV0ZSBpdGVtOwotCQl9Ci0JfQotfQotCiAjaWYgUVRfVkVSU0lPTiA+PSAzMDAKIC8qCiAgKiBzZXQgdGhlIG5ldyBkYXRhCkBAIC0zNTUsNiArMjc0LDEyIEBACiAJfQogfQogCitDb25maWdMaW5lRWRpdDo6Q29uZmlnTGluZUVkaXQoQ29uZmlnVmlldyogcGFyZW50KQorCTogUGFyZW50KHBhcmVudCkKK3sKKwljb25uZWN0KHRoaXMsIFNJR05BTChsb3N0Rm9jdXMoKSksIFNMT1QoaGlkZSgpKSk7Cit9CisKIHZvaWQgQ29uZmlnTGluZUVkaXQ6OnNob3coQ29uZmlnSXRlbSogaSkKIHsKIAlpdGVtID0gaTsKQEAgLTM4NSwxNCArMzEwLDE0IEBACiAJaGlkZSgpOwogfQogCi1Db25maWdMaXN0OjpDb25maWdMaXN0KENvbmZpZ1ZpZXcqIHAsIENvbmZpZ01haW5XaW5kb3cqIGN2LCBDb25maWdTZXR0aW5ncyogY29uZmlnU2V0dGluZ3MpCi0JOiBQYXJlbnQocCksIGN2aWV3KGN2KSwKK0NvbmZpZ0xpc3Q6OkNvbmZpZ0xpc3QoQ29uZmlnVmlldyogcCwgY29uc3QgY2hhciAqbmFtZSkKKwk6IFBhcmVudChwLCBuYW1lKSwKIAkgIHVwZGF0ZUFsbChmYWxzZSksCiAJICBzeW1ib2xZZXNQaXgoeHBtX3N5bWJvbF95ZXMpLCBzeW1ib2xNb2RQaXgoeHBtX3N5bWJvbF9tb2QpLCBzeW1ib2xOb1BpeCh4cG1fc3ltYm9sX25vKSwKIAkgIGNob2ljZVllc1BpeCh4cG1fY2hvaWNlX3llcyksIGNob2ljZU5vUGl4KHhwbV9jaG9pY2Vfbm8pLAogCSAgbWVudVBpeCh4cG1fbWVudSksIG1lbnVJbnZQaXgoeHBtX21lbnVfaW52KSwgbWVudUJhY2tQaXgoeHBtX21lbnViYWNrKSwgdm9pZFBpeCh4cG1fdm9pZCksCiAJICBzaG93QWxsKGZhbHNlKSwgc2hvd05hbWUoZmFsc2UpLCBzaG93UmFuZ2UoZmFsc2UpLCBzaG93RGF0YShmYWxzZSksCi0JICByb290RW50cnkoMCkKKwkgIHJvb3RFbnRyeSgwKSwgaGVhZGVyUG9wdXAoMCkKIHsKIAlpbnQgaTsKIApAQCAtNDA2LDExICszMzEsMTQgQEAKIAljb25uZWN0KHRoaXMsIFNJR05BTChzZWxlY3Rpb25DaGFuZ2VkKHZvaWQpKSwKIAkJU0xPVCh1cGRhdGVTZWxlY3Rpb24odm9pZCkpKTsKIAotCWlmIChjb25maWdTZXR0aW5ncykgewotCQlzaG93QWxsID0gY29uZmlnU2V0dGluZ3MtPnNob3dBbGw7Ci0JCXNob3dOYW1lID0gY29uZmlnU2V0dGluZ3MtPnNob3dOYW1lOwotCQlzaG93UmFuZ2UgPSBjb25maWdTZXR0aW5ncy0+c2hvd1JhbmdlOwotCQlzaG93RGF0YSA9IGNvbmZpZ1NldHRpbmdzLT5zaG93RGF0YTsKKwlpZiAobmFtZSkgeworCQljb25maWdTZXR0aW5ncy0+YmVnaW5Hcm91cChuYW1lKTsKKwkJc2hvd0FsbCA9IGNvbmZpZ1NldHRpbmdzLT5yZWFkQm9vbEVudHJ5KCIvc2hvd0FsbCIsIGZhbHNlKTsKKwkJc2hvd05hbWUgPSBjb25maWdTZXR0aW5ncy0+cmVhZEJvb2xFbnRyeSgiL3Nob3dOYW1lIiwgZmFsc2UpOworCQlzaG93UmFuZ2UgPSBjb25maWdTZXR0aW5ncy0+cmVhZEJvb2xFbnRyeSgiL3Nob3dSYW5nZSIsIGZhbHNlKTsKKwkJc2hvd0RhdGEgPSBjb25maWdTZXR0aW5ncy0+cmVhZEJvb2xFbnRyeSgiL3Nob3dEYXRhIiwgZmFsc2UpOworCQljb25maWdTZXR0aW5ncy0+ZW5kR3JvdXAoKTsKKwkJY29ubmVjdChjb25maWdBcHAsIFNJR05BTChhYm91dFRvUXVpdCgpKSwgU0xPVChzYXZlU2V0dGluZ3MoKSkpOwogCX0KIAogCWZvciAoaSA9IDA7IGkgPCBjb2xOcjsgaSsrKQpAQCAtNDQxLDYgKzM2OSwzMCBAQAogCXVwZGF0ZUxpc3RBbGwoKTsKIH0KIAordm9pZCBDb25maWdMaXN0OjpzYXZlU2V0dGluZ3Modm9pZCkKK3sKKwlpZiAobmFtZSgpKSB7CisJCWNvbmZpZ1NldHRpbmdzLT5iZWdpbkdyb3VwKG5hbWUoKSk7CisJCWNvbmZpZ1NldHRpbmdzLT53cml0ZUVudHJ5KCIvc2hvd05hbWUiLCBzaG93TmFtZSk7CisJCWNvbmZpZ1NldHRpbmdzLT53cml0ZUVudHJ5KCIvc2hvd1JhbmdlIiwgc2hvd1JhbmdlKTsKKwkJY29uZmlnU2V0dGluZ3MtPndyaXRlRW50cnkoIi9zaG93RGF0YSIsIHNob3dEYXRhKTsKKwkJY29uZmlnU2V0dGluZ3MtPndyaXRlRW50cnkoIi9zaG93QWxsIiwgc2hvd0FsbCk7CisJCWNvbmZpZ1NldHRpbmdzLT5lbmRHcm91cCgpOworCX0KK30KKworQ29uZmlnSXRlbSogQ29uZmlnTGlzdDo6ZmluZENvbmZpZ0l0ZW0oc3RydWN0IG1lbnUgKm1lbnUpCit7CisJQ29uZmlnSXRlbSogaXRlbSA9IChDb25maWdJdGVtKiltZW51LT5kYXRhOworCisJZm9yICg7IGl0ZW07IGl0ZW0gPSBpdGVtLT5uZXh0SXRlbSkgeworCQlpZiAodGhpcyA9PSBpdGVtLT5saXN0VmlldygpKQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIGl0ZW07Cit9CisKIHZvaWQgQ29uZmlnTGlzdDo6dXBkYXRlU2VsZWN0aW9uKHZvaWQpCiB7CiAJc3RydWN0IG1lbnUgKm1lbnU7CkBAIC00NTAsOSArNDAyLDggQEAKIAlpZiAoIWl0ZW0pCiAJCXJldHVybjsKIAotCWN2aWV3LT5zZXRIZWxwKGl0ZW0pOwotCiAJbWVudSA9IGl0ZW0tPm1lbnU7CisJZW1pdCBtZW51Q2hhbmdlZChtZW51KTsKIAlpZiAoIW1lbnUpCiAJCXJldHVybjsKIAl0eXBlID0gbWVudS0+cHJvbXB0ID8gbWVudS0+cHJvbXB0LT50eXBlIDogUF9VTktOT1dOOwpAQCAtNDY0LDggKzQxNSwyMCBAQAogewogCUNvbmZpZ0l0ZW0qIGxhc3QgPSAwOwogCi0JaWYgKCFyb290RW50cnkpCi0JCWdvdG8gdXBkYXRlOworCWlmICghcm9vdEVudHJ5KSB7CisJCWlmIChtb2RlICE9IGxpc3RNb2RlKQorCQkJZ290byB1cGRhdGU7CisJCVFMaXN0Vmlld0l0ZW1JdGVyYXRvciBpdCh0aGlzKTsKKwkJQ29uZmlnSXRlbSogaXRlbTsKKworCQlmb3IgKDsgaXQuY3VycmVudCgpOyArK2l0KSB7CisJCQlpdGVtID0gKENvbmZpZ0l0ZW0qKWl0LmN1cnJlbnQoKTsKKwkJCWlmICghaXRlbS0+bWVudSkKKwkJCQljb250aW51ZTsKKwkJCWl0ZW0tPnRlc3RVcGRhdGVNZW51KG1lbnVfaXNfdmlzaWJsZShpdGVtLT5tZW51KSk7CisJCX0KKwkJcmV0dXJuOworCX0KIAogCWlmIChyb290RW50cnkgIT0gJnJvb3RtZW51ICYmIChtb2RlID09IHNpbmdsZU1vZGUgfHwKIAkgICAgKG1vZGUgPT0gc3ltYm9sTW9kZSAmJiByb290RW50cnktPnBhcmVudCAhPSAmcm9vdG1lbnUpKSkgewpAQCAtNDkxLDE0ICs0NTQsNiBAQAogCXRyaWdnZXJVcGRhdGUoKTsKIH0KIAotdm9pZCBDb25maWdMaXN0OjpzZXRBbGxPcGVuKGJvb2wgb3BlbikKLXsKLQlRTGlzdFZpZXdJdGVtSXRlcmF0b3IgaXQodGhpcyk7Ci0KLQlmb3IgKDsgaXQuY3VycmVudCgpOyBpdCsrKQotCQlpdC5jdXJyZW50KCktPnNldE9wZW4ob3Blbik7Ci19Ci0KIHZvaWQgQ29uZmlnTGlzdDo6c2V0VmFsdWUoQ29uZmlnSXRlbSogaXRlbSwgdHJpc3RhdGUgdmFsKQogewogCXN0cnVjdCBzeW1ib2wqIHN5bTsKQEAgLTU4MSw2ICs1MzYsNyBAQAogCXJvb3RFbnRyeSA9IG1lbnU7CiAJdXBkYXRlTGlzdEFsbCgpOwogCXNldFNlbGVjdGVkKGN1cnJlbnRJdGVtKCksIGhhc0ZvY3VzKCkpOworCWVuc3VyZUl0ZW1WaXNpYmxlKGN1cnJlbnRJdGVtKCkpOwogfQogCiB2b2lkIENvbmZpZ0xpc3Q6OnNldFBhcmVudE1lbnUodm9pZCkKQEAgLTYwMyw2ICs1NTksNzQgQEAKIAl9CiB9CiAKKy8qCisgKiB1cGRhdGUgYWxsIHRoZSBjaGlsZHJlbiBvZiBhIG1lbnUgZW50cnkKKyAqICAgcmVtb3Zlcy9hZGRzIHRoZSBlbnRyaWVzIGZyb20gdGhlIHBhcmVudCB3aWRnZXQgYXMgbmVjZXNzYXJ5CisgKgorICogcGFyZW50OiBlaXRoZXIgdGhlIG1lbnUgbGlzdCB3aWRnZXQgb3IgYSBtZW51IGVudHJ5IHdpZGdldAorICogbWVudTogZW50cnkgdG8gYmUgdXBkYXRlZAorICovCit0ZW1wbGF0ZSA8Y2xhc3MgUD4KK3ZvaWQgQ29uZmlnTGlzdDo6dXBkYXRlTWVudUxpc3QoUCogcGFyZW50LCBzdHJ1Y3QgbWVudSogbWVudSkKK3sKKwlzdHJ1Y3QgbWVudSogY2hpbGQ7CisJQ29uZmlnSXRlbSogaXRlbTsKKwlDb25maWdJdGVtKiBsYXN0OworCWJvb2wgdmlzaWJsZTsKKwllbnVtIHByb3BfdHlwZSB0eXBlOworCisJaWYgKCFtZW51KSB7CisJCXdoaWxlICgoaXRlbSA9IHBhcmVudC0+Zmlyc3RDaGlsZCgpKSkKKwkJCWRlbGV0ZSBpdGVtOworCQlyZXR1cm47CisJfQorCisJbGFzdCA9IHBhcmVudC0+Zmlyc3RDaGlsZCgpOworCWlmIChsYXN0ICYmICFsYXN0LT5nb1BhcmVudCkKKwkJbGFzdCA9IDA7CisJZm9yIChjaGlsZCA9IG1lbnUtPmxpc3Q7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLT5uZXh0KSB7CisJCWl0ZW0gPSBsYXN0ID8gbGFzdC0+bmV4dFNpYmxpbmcoKSA6IHBhcmVudC0+Zmlyc3RDaGlsZCgpOworCQl0eXBlID0gY2hpbGQtPnByb21wdCA/IGNoaWxkLT5wcm9tcHQtPnR5cGUgOiBQX1VOS05PV047CisKKwkJc3dpdGNoIChtb2RlKSB7CisJCWNhc2UgbWVudU1vZGU6CisJCQlpZiAoIShjaGlsZC0+ZmxhZ3MgJiBNRU5VX1JPT1QpKQorCQkJCWdvdG8gaGlkZTsKKwkJCWJyZWFrOworCQljYXNlIHN5bWJvbE1vZGU6CisJCQlpZiAoY2hpbGQtPmZsYWdzICYgTUVOVV9ST09UKQorCQkJCWdvdG8gaGlkZTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKworCQl2aXNpYmxlID0gbWVudV9pc192aXNpYmxlKGNoaWxkKTsKKwkJaWYgKHNob3dBbGwgfHwgdmlzaWJsZSkgeworCQkJaWYgKCFpdGVtIHx8IGl0ZW0tPm1lbnUgIT0gY2hpbGQpCisJCQkJaXRlbSA9IG5ldyBDb25maWdJdGVtKHBhcmVudCwgbGFzdCwgY2hpbGQsIHZpc2libGUpOworCQkJZWxzZQorCQkJCWl0ZW0tPnRlc3RVcGRhdGVNZW51KHZpc2libGUpOworCisJCQlpZiAobW9kZSA9PSBmdWxsTW9kZSB8fCBtb2RlID09IG1lbnVNb2RlIHx8IHR5cGUgIT0gUF9NRU5VKQorCQkJCXVwZGF0ZU1lbnVMaXN0KGl0ZW0sIGNoaWxkKTsKKwkJCWVsc2UKKwkJCQl1cGRhdGVNZW51TGlzdChpdGVtLCAwKTsKKwkJCWxhc3QgPSBpdGVtOworCQkJY29udGludWU7CisJCX0KKwloaWRlOgorCQlpZiAoaXRlbSAmJiBpdGVtLT5tZW51ID09IGNoaWxkKSB7CisJCQlsYXN0ID0gcGFyZW50LT5maXJzdENoaWxkKCk7CisJCQlpZiAobGFzdCA9PSBpdGVtKQorCQkJCWxhc3QgPSAwOworCQkJZWxzZSB3aGlsZSAobGFzdC0+bmV4dFNpYmxpbmcoKSAhPSBpdGVtKQorCQkJCWxhc3QgPSBsYXN0LT5uZXh0U2libGluZygpOworCQkJZGVsZXRlIGl0ZW07CisJCX0KKwl9Cit9CisKIHZvaWQgQ29uZmlnTGlzdDo6a2V5UHJlc3NFdmVudChRS2V5RXZlbnQqIGV2KQogewogCVFMaXN0Vmlld0l0ZW0qIGkgPSBjdXJyZW50SXRlbSgpOwpAQCAtNjEwLDcgKzYzNCw3IEBACiAJc3RydWN0IG1lbnUgKm1lbnU7CiAJZW51bSBwcm9wX3R5cGUgdHlwZTsKIAotCWlmIChldi0+a2V5KCkgPT0gS2V5X0VzY2FwZSAmJiBtb2RlICE9IGZ1bGxNb2RlKSB7CisJaWYgKGV2LT5rZXkoKSA9PSBLZXlfRXNjYXBlICYmIG1vZGUgIT0gZnVsbE1vZGUgJiYgbW9kZSAhPSBsaXN0TW9kZSkgewogCQllbWl0IHBhcmVudFNlbGVjdGVkKCk7CiAJCWV2LT5hY2NlcHQoKTsKIAkJcmV0dXJuOwpAQCAtNzU1LDIzICs3NzksNjIgQEAKIAogdm9pZCBDb25maWdMaXN0Ojpmb2N1c0luRXZlbnQoUUZvY3VzRXZlbnQgKmUpCiB7CisJc3RydWN0IG1lbnUgKm1lbnUgPSBOVUxMOworCiAJUGFyZW50Ojpmb2N1c0luRXZlbnQoZSk7CiAKLQlRTGlzdFZpZXdJdGVtKiBpdGVtID0gY3VycmVudEl0ZW0oKTsKLQlpZiAoIWl0ZW0pCi0JCXJldHVybjsKKwlDb25maWdJdGVtKiBpdGVtID0gKENvbmZpZ0l0ZW0gKiljdXJyZW50SXRlbSgpOworCWlmIChpdGVtKSB7CisJCXNldFNlbGVjdGVkKGl0ZW0sIFRSVUUpOworCQltZW51ID0gaXRlbS0+bWVudTsKKwl9CisJZW1pdCBnb3RGb2N1cyhtZW51KTsKK30KIAotCXNldFNlbGVjdGVkKGl0ZW0sIFRSVUUpOwotCWVtaXQgZ290Rm9jdXMoKTsKK3ZvaWQgQ29uZmlnTGlzdDo6Y29udGV4dE1lbnVFdmVudChRQ29udGV4dE1lbnVFdmVudCAqZSkKK3sKKwlpZiAoZS0+eSgpIDw9IGhlYWRlcigpLT5nZW9tZXRyeSgpLmJvdHRvbSgpKSB7CisJCWlmICghaGVhZGVyUG9wdXApIHsKKwkJCVFBY3Rpb24gKmFjdGlvbjsKKworCQkJaGVhZGVyUG9wdXAgPSBuZXcgUVBvcHVwTWVudSh0aGlzKTsKKwkJCWFjdGlvbiA9IG5ldyBRQWN0aW9uKCJTaG93IE5hbWUiLCAwLCB0aGlzKTsKKwkJCSAgYWN0aW9uLT5zZXRUb2dnbGVBY3Rpb24oVFJVRSk7CisJCQkgIGNvbm5lY3QoYWN0aW9uLCBTSUdOQUwodG9nZ2xlZChib29sKSksCisJCQkJICBwYXJlbnQoKSwgU0xPVChzZXRTaG93TmFtZShib29sKSkpOworCQkJICBjb25uZWN0KHBhcmVudCgpLCBTSUdOQUwoc2hvd05hbWVDaGFuZ2VkKGJvb2wpKSwKKwkJCQkgIGFjdGlvbiwgU0xPVChzZXRPbihib29sKSkpOworCQkJICBhY3Rpb24tPnNldE9uKHNob3dOYW1lKTsKKwkJCSAgYWN0aW9uLT5hZGRUbyhoZWFkZXJQb3B1cCk7CisJCQlhY3Rpb24gPSBuZXcgUUFjdGlvbigiU2hvdyBSYW5nZSIsIDAsIHRoaXMpOworCQkJICBhY3Rpb24tPnNldFRvZ2dsZUFjdGlvbihUUlVFKTsKKwkJCSAgY29ubmVjdChhY3Rpb24sIFNJR05BTCh0b2dnbGVkKGJvb2wpKSwKKwkJCQkgIHBhcmVudCgpLCBTTE9UKHNldFNob3dSYW5nZShib29sKSkpOworCQkJICBjb25uZWN0KHBhcmVudCgpLCBTSUdOQUwoc2hvd1JhbmdlQ2hhbmdlZChib29sKSksCisJCQkJICBhY3Rpb24sIFNMT1Qoc2V0T24oYm9vbCkpKTsKKwkJCSAgYWN0aW9uLT5zZXRPbihzaG93UmFuZ2UpOworCQkJICBhY3Rpb24tPmFkZFRvKGhlYWRlclBvcHVwKTsKKwkJCWFjdGlvbiA9IG5ldyBRQWN0aW9uKCJTaG93IERhdGEiLCAwLCB0aGlzKTsKKwkJCSAgYWN0aW9uLT5zZXRUb2dnbGVBY3Rpb24oVFJVRSk7CisJCQkgIGNvbm5lY3QoYWN0aW9uLCBTSUdOQUwodG9nZ2xlZChib29sKSksCisJCQkJICBwYXJlbnQoKSwgU0xPVChzZXRTaG93RGF0YShib29sKSkpOworCQkJICBjb25uZWN0KHBhcmVudCgpLCBTSUdOQUwoc2hvd0RhdGFDaGFuZ2VkKGJvb2wpKSwKKwkJCQkgIGFjdGlvbiwgU0xPVChzZXRPbihib29sKSkpOworCQkJICBhY3Rpb24tPnNldE9uKHNob3dEYXRhKTsKKwkJCSAgYWN0aW9uLT5hZGRUbyhoZWFkZXJQb3B1cCk7CisJCX0KKwkJaGVhZGVyUG9wdXAtPmV4ZWMoZS0+Z2xvYmFsUG9zKCkpOworCQllLT5hY2NlcHQoKTsKKwl9IGVsc2UKKwkJZS0+aWdub3JlKCk7CiB9CiAKIENvbmZpZ1ZpZXcqIENvbmZpZ1ZpZXc6OnZpZXdMaXN0OwogCi1Db25maWdWaWV3OjpDb25maWdWaWV3KFFXaWRnZXQqIHBhcmVudCwgQ29uZmlnTWFpbldpbmRvdyogY3ZpZXcsCi0JCSAgICAgICBDb25maWdTZXR0aW5ncyAqY29uZmlnU2V0dGluZ3MpCi0JOiBQYXJlbnQocGFyZW50KQorQ29uZmlnVmlldzo6Q29uZmlnVmlldyhRV2lkZ2V0KiBwYXJlbnQsIGNvbnN0IGNoYXIgKm5hbWUpCisJOiBQYXJlbnQocGFyZW50LCBuYW1lKQogewotCWxpc3QgPSBuZXcgQ29uZmlnTGlzdCh0aGlzLCBjdmlldywgY29uZmlnU2V0dGluZ3MpOworCWxpc3QgPSBuZXcgQ29uZmlnTGlzdCh0aGlzLCBuYW1lKTsKIAlsaW5lRWRpdCA9IG5ldyBDb25maWdMaW5lRWRpdCh0aGlzKTsKIAlsaW5lRWRpdC0+aGlkZSgpOwogCkBAIC03OTEsNiArODU0LDUwIEBACiAJfQogfQogCit2b2lkIENvbmZpZ1ZpZXc6OnNldFNob3dBbGwoYm9vbCBiKQoreworCWlmIChsaXN0LT5zaG93QWxsICE9IGIpIHsKKwkJbGlzdC0+c2hvd0FsbCA9IGI7CisJCWxpc3QtPnVwZGF0ZUxpc3RBbGwoKTsKKwkJZW1pdCBzaG93QWxsQ2hhbmdlZChiKTsKKwl9Cit9CisKK3ZvaWQgQ29uZmlnVmlldzo6c2V0U2hvd05hbWUoYm9vbCBiKQoreworCWlmIChsaXN0LT5zaG93TmFtZSAhPSBiKSB7CisJCWxpc3QtPnNob3dOYW1lID0gYjsKKwkJbGlzdC0+cmVpbml0KCk7CisJCWVtaXQgc2hvd05hbWVDaGFuZ2VkKGIpOworCX0KK30KKwordm9pZCBDb25maWdWaWV3OjpzZXRTaG93UmFuZ2UoYm9vbCBiKQoreworCWlmIChsaXN0LT5zaG93UmFuZ2UgIT0gYikgeworCQlsaXN0LT5zaG93UmFuZ2UgPSBiOworCQlsaXN0LT5yZWluaXQoKTsKKwkJZW1pdCBzaG93UmFuZ2VDaGFuZ2VkKGIpOworCX0KK30KKwordm9pZCBDb25maWdWaWV3OjpzZXRTaG93RGF0YShib29sIGIpCit7CisJaWYgKGxpc3QtPnNob3dEYXRhICE9IGIpIHsKKwkJbGlzdC0+c2hvd0RhdGEgPSBiOworCQlsaXN0LT5yZWluaXQoKTsKKwkJZW1pdCBzaG93RGF0YUNoYW5nZWQoYik7CisJfQorfQorCit2b2lkIENvbmZpZ0xpc3Q6OnNldEFsbE9wZW4oYm9vbCBvcGVuKQoreworCVFMaXN0Vmlld0l0ZW1JdGVyYXRvciBpdCh0aGlzKTsKKworCWZvciAoOyBpdC5jdXJyZW50KCk7IGl0KyspCisJCWl0LmN1cnJlbnQoKS0+c2V0T3BlbihvcGVuKTsKK30KKwogdm9pZCBDb25maWdWaWV3Ojp1cGRhdGVMaXN0KENvbmZpZ0l0ZW0qIGl0ZW0pCiB7CiAJQ29uZmlnVmlldyogdjsKQEAgLTgwNywxNzcgKzkxNCwyMDcgQEAKIAkJdi0+bGlzdC0+dXBkYXRlTGlzdEFsbCgpOwogfQogCi0vKgotICogQ29uc3RydWN0IHRoZSBjb21wbGV0ZSBjb25maWcgd2lkZ2V0Ci0gKi8KLUNvbmZpZ01haW5XaW5kb3c6OkNvbmZpZ01haW5XaW5kb3codm9pZCkKK0NvbmZpZ0luZm9WaWV3OjpDb25maWdJbmZvVmlldyhRV2lkZ2V0KiBwYXJlbnQsIGNvbnN0IGNoYXIgKm5hbWUpCisJOiBQYXJlbnQocGFyZW50LCBuYW1lKSwgbWVudSgwKQogewotCVFNZW51QmFyKiBtZW51OwotCWJvb2wgb2s7Ci0JaW50IHgsIHksIHdpZHRoLCBoZWlnaHQ7Ci0KLQlRV2lkZ2V0ICpkID0gY29uZmlnQXBwLT5kZXNrdG9wKCk7Ci0KLQlDb25maWdTZXR0aW5ncyogY29uZmlnU2V0dGluZ3MgPSBuZXcgQ29uZmlnU2V0dGluZ3MoKTsKLSNpZiBRVF9WRVJTSU9OID49IDMwMAotCXdpZHRoID0gY29uZmlnU2V0dGluZ3MtPnJlYWROdW1FbnRyeSgiL2tjb25maWcvcWNvbmYvd2luZG93IHdpZHRoIiwgZC0+d2lkdGgoKSAtIDY0KTsKLQloZWlnaHQgPSBjb25maWdTZXR0aW5ncy0+cmVhZE51bUVudHJ5KCIva2NvbmZpZy9xY29uZi93aW5kb3cgaGVpZ2h0IiwgZC0+aGVpZ2h0KCkgLSA2NCk7Ci0JcmVzaXplKHdpZHRoLCBoZWlnaHQpOwotCXggPSBjb25maWdTZXR0aW5ncy0+cmVhZE51bUVudHJ5KCIva2NvbmZpZy9xY29uZi93aW5kb3cgeCIsIDAsICZvayk7Ci0JaWYgKG9rKQotCQl5ID0gY29uZmlnU2V0dGluZ3MtPnJlYWROdW1FbnRyeSgiL2tjb25maWcvcWNvbmYvd2luZG93IHkiLCAwLCAmb2spOwotCWlmIChvaykKLQkJbW92ZSh4LCB5KTsKLQlzaG93RGVidWcgPSBjb25maWdTZXR0aW5ncy0+cmVhZEJvb2xFbnRyeSgiL2tjb25maWcvcWNvbmYvc2hvd0RlYnVnIiwgZmFsc2UpOwotCi0JLy8gcmVhZCBsaXN0IHNldHRpbmdzIGludG8gY29uZmlnU2V0dGluZ3MsIHdpbGwgYmUgdXNlZCBsYXRlciBmb3IgQ29uZmlnTGlzdCBzZXR1cAotCWNvbmZpZ1NldHRpbmdzLT5yZWFkTGlzdFNldHRpbmdzKCk7Ci0jZWxzZQotCXdpZHRoID0gZC0+d2lkdGgoKSAtIDY0OwotCWhlaWdodCA9IGQtPmhlaWdodCgpIC0gNjQ7Ci0JcmVzaXplKHdpZHRoLCBoZWlnaHQpOwotCXNob3dEZWJ1ZyA9IGZhbHNlOwotI2VuZGlmCi0KLQlzcGxpdDEgPSBuZXcgUVNwbGl0dGVyKHRoaXMpOwotCXNwbGl0MS0+c2V0T3JpZW50YXRpb24oUVNwbGl0dGVyOjpIb3Jpem9udGFsKTsKLQlzZXRDZW50cmFsV2lkZ2V0KHNwbGl0MSk7Ci0KLQltZW51VmlldyA9IG5ldyBDb25maWdWaWV3KHNwbGl0MSwgdGhpcywgY29uZmlnU2V0dGluZ3MpOwotCW1lbnVMaXN0ID0gbWVudVZpZXctPmxpc3Q7Ci0KLQlzcGxpdDIgPSBuZXcgUVNwbGl0dGVyKHNwbGl0MSk7Ci0Jc3BsaXQyLT5zZXRPcmllbnRhdGlvbihRU3BsaXR0ZXI6OlZlcnRpY2FsKTsKLQotCS8vIGNyZWF0ZSBjb25maWcgdHJlZQotCWNvbmZpZ1ZpZXcgPSBuZXcgQ29uZmlnVmlldyhzcGxpdDIsIHRoaXMsIGNvbmZpZ1NldHRpbmdzKTsKLQljb25maWdMaXN0ID0gY29uZmlnVmlldy0+bGlzdDsKLQotCWhlbHBUZXh0ID0gbmV3IFFUZXh0VmlldyhzcGxpdDIpOwotCWhlbHBUZXh0LT5zZXRUZXh0Rm9ybWF0KFF0OjpSaWNoVGV4dCk7Ci0KLQlzZXRUYWJPcmRlcihjb25maWdMaXN0LCBoZWxwVGV4dCk7Ci0JY29uZmlnTGlzdC0+c2V0Rm9jdXMoKTsKLQotCW1lbnUgPSBtZW51QmFyKCk7Ci0JdG9vbEJhciA9IG5ldyBRVG9vbEJhcigiVG9vbHMiLCB0aGlzKTsKLQotCWJhY2tBY3Rpb24gPSBuZXcgUUFjdGlvbigiQmFjayIsIFFQaXhtYXAoeHBtX2JhY2spLCAiQmFjayIsIDAsIHRoaXMpOwotCSAgY29ubmVjdChiYWNrQWN0aW9uLCBTSUdOQUwoYWN0aXZhdGVkKCkpLCBTTE9UKGdvQmFjaygpKSk7Ci0JICBiYWNrQWN0aW9uLT5zZXRFbmFibGVkKEZBTFNFKTsKLQlRQWN0aW9uICpxdWl0QWN0aW9uID0gbmV3IFFBY3Rpb24oIlF1aXQiLCAiJlF1aXQiLCBDVFJMK0tleV9RLCB0aGlzKTsKLQkgIGNvbm5lY3QocXVpdEFjdGlvbiwgU0lHTkFMKGFjdGl2YXRlZCgpKSwgU0xPVChjbG9zZSgpKSk7Ci0JUUFjdGlvbiAqbG9hZEFjdGlvbiA9IG5ldyBRQWN0aW9uKCJMb2FkIiwgUVBpeG1hcCh4cG1fbG9hZCksICImTG9hZCIsIENUUkwrS2V5X0wsIHRoaXMpOwotCSAgY29ubmVjdChsb2FkQWN0aW9uLCBTSUdOQUwoYWN0aXZhdGVkKCkpLCBTTE9UKGxvYWRDb25maWcoKSkpOwotCVFBY3Rpb24gKnNhdmVBY3Rpb24gPSBuZXcgUUFjdGlvbigiU2F2ZSIsIFFQaXhtYXAoeHBtX3NhdmUpLCAiJlNhdmUiLCBDVFJMK0tleV9TLCB0aGlzKTsKLQkgIGNvbm5lY3Qoc2F2ZUFjdGlvbiwgU0lHTkFMKGFjdGl2YXRlZCgpKSwgU0xPVChzYXZlQ29uZmlnKCkpKTsKLQlRQWN0aW9uICpzYXZlQXNBY3Rpb24gPSBuZXcgUUFjdGlvbigiU2F2ZSBBcy4uLiIsICJTYXZlICZBcy4uLiIsIDAsIHRoaXMpOwotCSAgY29ubmVjdChzYXZlQXNBY3Rpb24sIFNJR05BTChhY3RpdmF0ZWQoKSksIFNMT1Qoc2F2ZUNvbmZpZ0FzKCkpKTsKLQlRQWN0aW9uICpzaW5nbGVWaWV3QWN0aW9uID0gbmV3IFFBY3Rpb24oIlNpbmdsZSBWaWV3IiwgUVBpeG1hcCh4cG1fc2luZ2xlX3ZpZXcpLCAiU3BsaXQgVmlldyIsIDAsIHRoaXMpOwotCSAgY29ubmVjdChzaW5nbGVWaWV3QWN0aW9uLCBTSUdOQUwoYWN0aXZhdGVkKCkpLCBTTE9UKHNob3dTaW5nbGVWaWV3KCkpKTsKLQlRQWN0aW9uICpzcGxpdFZpZXdBY3Rpb24gPSBuZXcgUUFjdGlvbigiU3BsaXQgVmlldyIsIFFQaXhtYXAoeHBtX3NwbGl0X3ZpZXcpLCAiU3BsaXQgVmlldyIsIDAsIHRoaXMpOwotCSAgY29ubmVjdChzcGxpdFZpZXdBY3Rpb24sIFNJR05BTChhY3RpdmF0ZWQoKSksIFNMT1Qoc2hvd1NwbGl0VmlldygpKSk7Ci0JUUFjdGlvbiAqZnVsbFZpZXdBY3Rpb24gPSBuZXcgUUFjdGlvbigiRnVsbCBWaWV3IiwgUVBpeG1hcCh4cG1fdHJlZV92aWV3KSwgIkZ1bGwgVmlldyIsIDAsIHRoaXMpOwotCSAgY29ubmVjdChmdWxsVmlld0FjdGlvbiwgU0lHTkFMKGFjdGl2YXRlZCgpKSwgU0xPVChzaG93RnVsbFZpZXcoKSkpOwotCi0JUUFjdGlvbiAqc2hvd05hbWVBY3Rpb24gPSBuZXcgUUFjdGlvbihOVUxMLCAiU2hvdyBOYW1lIiwgMCwgdGhpcyk7Ci0JICBzaG93TmFtZUFjdGlvbi0+c2V0VG9nZ2xlQWN0aW9uKFRSVUUpOwotCSAgc2hvd05hbWVBY3Rpb24tPnNldE9uKGNvbmZpZ0xpc3QtPnNob3dOYW1lKTsKLQkgIGNvbm5lY3Qoc2hvd05hbWVBY3Rpb24sIFNJR05BTCh0b2dnbGVkKGJvb2wpKSwgU0xPVChzZXRTaG93TmFtZShib29sKSkpOwotCVFBY3Rpb24gKnNob3dSYW5nZUFjdGlvbiA9IG5ldyBRQWN0aW9uKE5VTEwsICJTaG93IFJhbmdlIiwgMCwgdGhpcyk7Ci0JICBzaG93UmFuZ2VBY3Rpb24tPnNldFRvZ2dsZUFjdGlvbihUUlVFKTsKLQkgIHNob3dSYW5nZUFjdGlvbi0+c2V0T24oY29uZmlnTGlzdC0+c2hvd1JhbmdlKTsKLQkgIGNvbm5lY3Qoc2hvd1JhbmdlQWN0aW9uLCBTSUdOQUwodG9nZ2xlZChib29sKSksIFNMT1Qoc2V0U2hvd1JhbmdlKGJvb2wpKSk7Ci0JUUFjdGlvbiAqc2hvd0RhdGFBY3Rpb24gPSBuZXcgUUFjdGlvbihOVUxMLCAiU2hvdyBEYXRhIiwgMCwgdGhpcyk7Ci0JICBzaG93RGF0YUFjdGlvbi0+c2V0VG9nZ2xlQWN0aW9uKFRSVUUpOwotCSAgc2hvd0RhdGFBY3Rpb24tPnNldE9uKGNvbmZpZ0xpc3QtPnNob3dEYXRhKTsKLQkgIGNvbm5lY3Qoc2hvd0RhdGFBY3Rpb24sIFNJR05BTCh0b2dnbGVkKGJvb2wpKSwgU0xPVChzZXRTaG93RGF0YShib29sKSkpOwotCVFBY3Rpb24gKnNob3dBbGxBY3Rpb24gPSBuZXcgUUFjdGlvbihOVUxMLCAiU2hvdyBBbGwgT3B0aW9ucyIsIDAsIHRoaXMpOwotCSAgc2hvd0FsbEFjdGlvbi0+c2V0VG9nZ2xlQWN0aW9uKFRSVUUpOwotCSAgc2hvd0FsbEFjdGlvbi0+c2V0T24oY29uZmlnTGlzdC0+c2hvd0FsbCk7Ci0JICBjb25uZWN0KHNob3dBbGxBY3Rpb24sIFNJR05BTCh0b2dnbGVkKGJvb2wpKSwgU0xPVChzZXRTaG93QWxsKGJvb2wpKSk7Ci0JUUFjdGlvbiAqc2hvd0RlYnVnQWN0aW9uID0gbmV3IFFBY3Rpb24oTlVMTCwgIlNob3cgRGVidWcgSW5mbyIsIDAsIHRoaXMpOwotCSAgc2hvd0RlYnVnQWN0aW9uLT5zZXRUb2dnbGVBY3Rpb24oVFJVRSk7Ci0JICBzaG93RGVidWdBY3Rpb24tPnNldE9uKHNob3dEZWJ1Zyk7Ci0JICBjb25uZWN0KHNob3dEZWJ1Z0FjdGlvbiwgU0lHTkFMKHRvZ2dsZWQoYm9vbCkpLCBTTE9UKHNldFNob3dEZWJ1Zyhib29sKSkpOwotCi0JUUFjdGlvbiAqc2hvd0ludHJvQWN0aW9uID0gbmV3IFFBY3Rpb24oTlVMTCwgIkludHJvZHVjdGlvbiIsIDAsIHRoaXMpOwotCSAgY29ubmVjdChzaG93SW50cm9BY3Rpb24sIFNJR05BTChhY3RpdmF0ZWQoKSksIFNMT1Qoc2hvd0ludHJvKCkpKTsKLQlRQWN0aW9uICpzaG93QWJvdXRBY3Rpb24gPSBuZXcgUUFjdGlvbihOVUxMLCAiQWJvdXQiLCAwLCB0aGlzKTsKLQkgIGNvbm5lY3Qoc2hvd0Fib3V0QWN0aW9uLCBTSUdOQUwoYWN0aXZhdGVkKCkpLCBTTE9UKHNob3dBYm91dCgpKSk7Ci0KLQkvLyBpbml0IHRvb2wgYmFyCi0JYmFja0FjdGlvbi0+YWRkVG8odG9vbEJhcik7Ci0JdG9vbEJhci0+YWRkU2VwYXJhdG9yKCk7Ci0JbG9hZEFjdGlvbi0+YWRkVG8odG9vbEJhcik7Ci0Jc2F2ZUFjdGlvbi0+YWRkVG8odG9vbEJhcik7Ci0JdG9vbEJhci0+YWRkU2VwYXJhdG9yKCk7Ci0Jc2luZ2xlVmlld0FjdGlvbi0+YWRkVG8odG9vbEJhcik7Ci0Jc3BsaXRWaWV3QWN0aW9uLT5hZGRUbyh0b29sQmFyKTsKLQlmdWxsVmlld0FjdGlvbi0+YWRkVG8odG9vbEJhcik7Ci0KLQkvLyBjcmVhdGUgY29uZmlnIG1lbnUKLQlRUG9wdXBNZW51KiBjb25maWcgPSBuZXcgUVBvcHVwTWVudSh0aGlzKTsKLQltZW51LT5pbnNlcnRJdGVtKCImRmlsZSIsIGNvbmZpZyk7Ci0JbG9hZEFjdGlvbi0+YWRkVG8oY29uZmlnKTsKLQlzYXZlQWN0aW9uLT5hZGRUbyhjb25maWcpOwotCXNhdmVBc0FjdGlvbi0+YWRkVG8oY29uZmlnKTsKLQljb25maWctPmluc2VydFNlcGFyYXRvcigpOwotCXF1aXRBY3Rpb24tPmFkZFRvKGNvbmZpZyk7Ci0KLQkvLyBjcmVhdGUgb3B0aW9ucyBtZW51Ci0JUVBvcHVwTWVudSogb3B0aW9uTWVudSA9IG5ldyBRUG9wdXBNZW51KHRoaXMpOwotCW1lbnUtPmluc2VydEl0ZW0oIiZPcHRpb24iLCBvcHRpb25NZW51KTsKLQlzaG93TmFtZUFjdGlvbi0+YWRkVG8ob3B0aW9uTWVudSk7Ci0Jc2hvd1JhbmdlQWN0aW9uLT5hZGRUbyhvcHRpb25NZW51KTsKLQlzaG93RGF0YUFjdGlvbi0+YWRkVG8ob3B0aW9uTWVudSk7Ci0Jb3B0aW9uTWVudS0+aW5zZXJ0U2VwYXJhdG9yKCk7Ci0Jc2hvd0FsbEFjdGlvbi0+YWRkVG8ob3B0aW9uTWVudSk7Ci0Jc2hvd0RlYnVnQWN0aW9uLT5hZGRUbyhvcHRpb25NZW51KTsKLQotCS8vIGNyZWF0ZSBoZWxwIG1lbnUKLQlRUG9wdXBNZW51KiBoZWxwTWVudSA9IG5ldyBRUG9wdXBNZW51KHRoaXMpOwotCW1lbnUtPmluc2VydFNlcGFyYXRvcigpOwotCW1lbnUtPmluc2VydEl0ZW0oIiZIZWxwIiwgaGVscE1lbnUpOwotCXNob3dJbnRyb0FjdGlvbi0+YWRkVG8oaGVscE1lbnUpOwotCXNob3dBYm91dEFjdGlvbi0+YWRkVG8oaGVscE1lbnUpOwotCi0JY29ubmVjdChjb25maWdMaXN0LCBTSUdOQUwobWVudVNlbGVjdGVkKHN0cnVjdCBtZW51ICopKSwKLQkJU0xPVChjaGFuZ2VNZW51KHN0cnVjdCBtZW51ICopKSk7Ci0JY29ubmVjdChjb25maWdMaXN0LCBTSUdOQUwocGFyZW50U2VsZWN0ZWQoKSksCi0JCVNMT1QoZ29CYWNrKCkpKTsKLQljb25uZWN0KG1lbnVMaXN0LCBTSUdOQUwobWVudVNlbGVjdGVkKHN0cnVjdCBtZW51ICopKSwKLQkJU0xPVChjaGFuZ2VNZW51KHN0cnVjdCBtZW51ICopKSk7Ci0KLQljb25uZWN0KGNvbmZpZ0xpc3QsIFNJR05BTChnb3RGb2N1cyh2b2lkKSksCi0JCVNMT1QobGlzdEZvY3VzQ2hhbmdlZCh2b2lkKSkpOwotCWNvbm5lY3QobWVudUxpc3QsIFNJR05BTChnb3RGb2N1cyh2b2lkKSksCi0JCVNMT1QobGlzdEZvY3VzQ2hhbmdlZCh2b2lkKSkpOwotCi0jaWYgUVRfVkVSU0lPTiA+PSAzMDAKLQlRU3RyaW5nIGxpc3RNb2RlID0gY29uZmlnU2V0dGluZ3MtPnJlYWRFbnRyeSgiL2tjb25maWcvcWNvbmYvbGlzdE1vZGUiLCAic3ltYm9sIik7Ci0JaWYgKGxpc3RNb2RlID09ICJzaW5nbGUiKQotCQlzaG93U2luZ2xlVmlldygpOwotCWVsc2UgaWYgKGxpc3RNb2RlID09ICJmdWxsIikKLQkJc2hvd0Z1bGxWaWV3KCk7Ci0JZWxzZSAvKmlmIChsaXN0TW9kZSA9PSAic3BsaXQiKSovCi0JCXNob3dTcGxpdFZpZXcoKTsKLQotCS8vIFVJIHNldHVwIGRvbmUsIHJlc3RvcmUgc3BsaXR0ZXIgcG9zaXRpb25zCi0JUVZhbHVlTGlzdDxpbnQ+IHNpemVzID0gY29uZmlnU2V0dGluZ3MtPnJlYWRTaXplcygiL2tjb25maWcvcWNvbmYvc3BsaXQxIiwgJm9rKTsKLQlpZiAob2spCi0JCXNwbGl0MS0+c2V0U2l6ZXMoc2l6ZXMpOwotCi0Jc2l6ZXMgPSBjb25maWdTZXR0aW5ncy0+cmVhZFNpemVzKCIva2NvbmZpZy9xY29uZi9zcGxpdDIiLCAmb2spOwotCWlmIChvaykKLQkJc3BsaXQyLT5zZXRTaXplcyhzaXplcyk7Ci0jZWxzZQotCXNob3dTcGxpdFZpZXcoKTsKLSNlbmRpZgotCWRlbGV0ZSBjb25maWdTZXR0aW5nczsKKwlpZiAobmFtZSkgeworCQljb25maWdTZXR0aW5ncy0+YmVnaW5Hcm91cChuYW1lKTsKKwkJX3Nob3dEZWJ1ZyA9IGNvbmZpZ1NldHRpbmdzLT5yZWFkQm9vbEVudHJ5KCIvc2hvd0RlYnVnIiwgZmFsc2UpOworCQljb25maWdTZXR0aW5ncy0+ZW5kR3JvdXAoKTsKKwkJY29ubmVjdChjb25maWdBcHAsIFNJR05BTChhYm91dFRvUXVpdCgpKSwgU0xPVChzYXZlU2V0dGluZ3MoKSkpOworCX0KIH0KIAotc3RhdGljIFFTdHJpbmcgcHJpbnRfZmlsdGVyKGNvbnN0IFFTdHJpbmcgJnN0cikKK3ZvaWQgQ29uZmlnSW5mb1ZpZXc6OnNhdmVTZXR0aW5ncyh2b2lkKQoreworCWlmIChuYW1lKCkpIHsKKwkJY29uZmlnU2V0dGluZ3MtPmJlZ2luR3JvdXAobmFtZSgpKTsKKwkJY29uZmlnU2V0dGluZ3MtPndyaXRlRW50cnkoIi9zaG93RGVidWciLCBzaG93RGVidWcoKSk7CisJCWNvbmZpZ1NldHRpbmdzLT5lbmRHcm91cCgpOworCX0KK30KKwordm9pZCBDb25maWdJbmZvVmlldzo6c2V0U2hvd0RlYnVnKGJvb2wgYikKK3sKKwlpZiAoX3Nob3dEZWJ1ZyAhPSBiKSB7CisJCV9zaG93RGVidWcgPSBiOworCQlpZiAobWVudSkKKwkJCW1lbnVJbmZvKCk7CisJCWVsc2UgaWYgKHN5bSkKKwkJCXN5bWJvbEluZm8oKTsKKwkJZW1pdCBzaG93RGVidWdDaGFuZ2VkKGIpOworCX0KK30KKwordm9pZCBDb25maWdJbmZvVmlldzo6c2V0SW5mbyhzdHJ1Y3QgbWVudSAqbSkKK3sKKwlpZiAobWVudSA9PSBtKQorCQlyZXR1cm47CisJbWVudSA9IG07CisJaWYgKCFtZW51KQorCQljbGVhcigpOworCWVsc2UKKwkJbWVudUluZm8oKTsKK30KKwordm9pZCBDb25maWdJbmZvVmlldzo6c2V0U291cmNlKGNvbnN0IFFTdHJpbmcmIG5hbWUpCit7CisJY29uc3QgY2hhciAqcCA9IG5hbWUubGF0aW4xKCk7CisKKwltZW51ID0gTlVMTDsKKwlzeW0gPSBOVUxMOworCisJc3dpdGNoIChwWzBdKSB7CisJY2FzZSAnbSc6CisJCXN0cnVjdCBtZW51ICptOworCisJCWlmIChzc2NhbmYocCwgIm0lcCIsICZtKSA9PSAxICYmIG1lbnUgIT0gbSkgeworCQkJbWVudSA9IG07CisJCQltZW51SW5mbygpOworCQkJZW1pdCBtZW51U2VsZWN0ZWQobWVudSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSAncyc6CisJCXN0cnVjdCBzeW1ib2wgKnM7CisKKwkJaWYgKHNzY2FuZihwLCAicyVwIiwgJnMpID09IDEgJiYgc3ltICE9IHMpIHsKKwkJCXN5bSA9IHM7CisJCQlzeW1ib2xJbmZvKCk7CisJCX0KKwkJYnJlYWs7CisJfQorfQorCit2b2lkIENvbmZpZ0luZm9WaWV3OjpzeW1ib2xJbmZvKHZvaWQpCit7CisJUVN0cmluZyBzdHI7CisKKwlzdHIgKz0gIjxiaWc+U3ltYm9sOiA8Yj4iOworCXN0ciArPSBwcmludF9maWx0ZXIoc3ltLT5uYW1lKTsKKwlzdHIgKz0gIjwvYj48L2JpZz48YnI+PGJyPnZhbHVlOiAiOworCXN0ciArPSBwcmludF9maWx0ZXIoc3ltX2dldF9zdHJpbmdfdmFsdWUoc3ltKSk7CisJc3RyICs9ICI8YnI+dmlzaWJpbGl0eTogIjsKKwlzdHIgKz0gc3ltLT52aXNpYmxlID09IHllcyA/ICJ5IiA6IHN5bS0+dmlzaWJsZSA9PSBtb2QgPyAibSIgOiAibiI7CisJc3RyICs9ICI8YnI+IjsKKwlzdHIgKz0gZGVidWdfaW5mbyhzeW0pOworCisJc2V0VGV4dChzdHIpOworfQorCit2b2lkIENvbmZpZ0luZm9WaWV3OjptZW51SW5mbyh2b2lkKQoreworCXN0cnVjdCBzeW1ib2wqIHN5bTsKKwlRU3RyaW5nIGhlYWQsIGRlYnVnLCBoZWxwOworCisJc3ltID0gbWVudS0+c3ltOworCWlmIChzeW0pIHsKKwkJaWYgKG1lbnUtPnByb21wdCkgeworCQkJaGVhZCArPSAiPGJpZz48Yj4iOworCQkJaGVhZCArPSBwcmludF9maWx0ZXIoXyhtZW51LT5wcm9tcHQtPnRleHQpKTsKKwkJCWhlYWQgKz0gIjwvYj48L2JpZz4iOworCQkJaWYgKHN5bS0+bmFtZSkgeworCQkJCWhlYWQgKz0gIiAoIjsKKwkJCQlpZiAoc2hvd0RlYnVnKCkpCisJCQkJCWhlYWQgKz0gUVN0cmluZygpLnNwcmludGYoIjxhIGhyZWY9XCJzJXBcIj4iLCBzeW0pOworCQkJCWhlYWQgKz0gcHJpbnRfZmlsdGVyKHN5bS0+bmFtZSk7CisJCQkJaWYgKHNob3dEZWJ1ZygpKQorCQkJCQloZWFkICs9ICI8L2E+IjsKKwkJCQloZWFkICs9ICIpIjsKKwkJCX0KKwkJfSBlbHNlIGlmIChzeW0tPm5hbWUpIHsKKwkJCWhlYWQgKz0gIjxiaWc+PGI+IjsKKwkJCWlmIChzaG93RGVidWcoKSkKKwkJCQloZWFkICs9IFFTdHJpbmcoKS5zcHJpbnRmKCI8YSBocmVmPVwicyVwXCI+Iiwgc3ltKTsKKwkJCWhlYWQgKz0gcHJpbnRfZmlsdGVyKHN5bS0+bmFtZSk7CisJCQlpZiAoc2hvd0RlYnVnKCkpCisJCQkJaGVhZCArPSAiPC9hPiI7CisJCQloZWFkICs9ICI8L2I+PC9iaWc+IjsKKwkJfQorCQloZWFkICs9ICI8YnI+PGJyPiI7CisKKwkJaWYgKHNob3dEZWJ1ZygpKQorCQkJZGVidWcgPSBkZWJ1Z19pbmZvKHN5bSk7CisKKwkJaGVscCA9IHByaW50X2ZpbHRlcihfKHN5bS0+aGVscCkpOworCX0gZWxzZSBpZiAobWVudS0+cHJvbXB0KSB7CisJCWhlYWQgKz0gIjxiaWc+PGI+IjsKKwkJaGVhZCArPSBwcmludF9maWx0ZXIoXyhtZW51LT5wcm9tcHQtPnRleHQpKTsKKwkJaGVhZCArPSAiPC9iPjwvYmlnPjxicj48YnI+IjsKKwkJaWYgKHNob3dEZWJ1ZygpKSB7CisJCQlpZiAobWVudS0+cHJvbXB0LT52aXNpYmxlLmV4cHIpIHsKKwkJCQlkZWJ1ZyArPSAiJm5ic3A7Jm5ic3A7ZGVwOiAiOworCQkJCWV4cHJfcHJpbnQobWVudS0+cHJvbXB0LT52aXNpYmxlLmV4cHIsIGV4cHJfcHJpbnRfaGVscCwgJmRlYnVnLCBFX05PTkUpOworCQkJCWRlYnVnICs9ICI8YnI+PGJyPiI7CisJCQl9CisJCX0KKwl9CisJaWYgKHNob3dEZWJ1ZygpKQorCQlkZWJ1ZyArPSBRU3RyaW5nKCkuc3ByaW50ZigiZGVmaW5lZCBhdCAlczolZDxicj48YnI+IiwgbWVudS0+ZmlsZS0+bmFtZSwgbWVudS0+bGluZW5vKTsKKworCXNldFRleHQoaGVhZCArIGRlYnVnICsgaGVscCk7Cit9CisKK1FTdHJpbmcgQ29uZmlnSW5mb1ZpZXc6OmRlYnVnX2luZm8oc3RydWN0IHN5bWJvbCAqc3ltKQoreworCVFTdHJpbmcgZGVidWc7CisKKwlkZWJ1ZyArPSAidHlwZTogIjsKKwlkZWJ1ZyArPSBwcmludF9maWx0ZXIoc3ltX3R5cGVfbmFtZShzeW0tPnR5cGUpKTsKKwlpZiAoc3ltX2lzX2Nob2ljZShzeW0pKQorCQlkZWJ1ZyArPSAiIChjaG9pY2UpIjsKKwlkZWJ1ZyArPSAiPGJyPiI7CisJaWYgKHN5bS0+cmV2X2RlcC5leHByKSB7CisJCWRlYnVnICs9ICJyZXZlcnNlIGRlcDogIjsKKwkJZXhwcl9wcmludChzeW0tPnJldl9kZXAuZXhwciwgZXhwcl9wcmludF9oZWxwLCAmZGVidWcsIEVfTk9ORSk7CisJCWRlYnVnICs9ICI8YnI+IjsKKwl9CisJZm9yIChzdHJ1Y3QgcHJvcGVydHkgKnByb3AgPSBzeW0tPnByb3A7IHByb3A7IHByb3AgPSBwcm9wLT5uZXh0KSB7CisJCXN3aXRjaCAocHJvcC0+dHlwZSkgeworCQljYXNlIFBfUFJPTVBUOgorCQljYXNlIFBfTUVOVToKKwkJCWRlYnVnICs9IFFTdHJpbmcoKS5zcHJpbnRmKCJwcm9tcHQ6IDxhIGhyZWY9XCJtJXBcIj4iLCBwcm9wLT5tZW51KTsKKwkJCWRlYnVnICs9IHByaW50X2ZpbHRlcihfKHByb3AtPnRleHQpKTsKKwkJCWRlYnVnICs9ICI8L2E+PGJyPiI7CisJCQlicmVhazsKKwkJY2FzZSBQX0RFRkFVTFQ6CisJCQlkZWJ1ZyArPSAiZGVmYXVsdDogIjsKKwkJCWV4cHJfcHJpbnQocHJvcC0+ZXhwciwgZXhwcl9wcmludF9oZWxwLCAmZGVidWcsIEVfTk9ORSk7CisJCQlkZWJ1ZyArPSAiPGJyPiI7CisJCQlicmVhazsKKwkJY2FzZSBQX0NIT0lDRToKKwkJCWlmIChzeW1faXNfY2hvaWNlKHN5bSkpIHsKKwkJCQlkZWJ1ZyArPSAiY2hvaWNlOiAiOworCQkJCWV4cHJfcHJpbnQocHJvcC0+ZXhwciwgZXhwcl9wcmludF9oZWxwLCAmZGVidWcsIEVfTk9ORSk7CisJCQkJZGVidWcgKz0gIjxicj4iOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgUF9TRUxFQ1Q6CisJCQlkZWJ1ZyArPSAic2VsZWN0OiAiOworCQkJZXhwcl9wcmludChwcm9wLT5leHByLCBleHByX3ByaW50X2hlbHAsICZkZWJ1ZywgRV9OT05FKTsKKwkJCWRlYnVnICs9ICI8YnI+IjsKKwkJCWJyZWFrOworCQljYXNlIFBfUkFOR0U6CisJCQlkZWJ1ZyArPSAicmFuZ2U6ICI7CisJCQlleHByX3ByaW50KHByb3AtPmV4cHIsIGV4cHJfcHJpbnRfaGVscCwgJmRlYnVnLCBFX05PTkUpOworCQkJZGVidWcgKz0gIjxicj4iOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlkZWJ1ZyArPSAidW5rbm93biBwcm9wZXJ0eTogIjsKKwkJCWRlYnVnICs9IHByb3BfZ2V0X3R5cGVfbmFtZShwcm9wLT50eXBlKTsKKwkJCWRlYnVnICs9ICI8YnI+IjsKKwkJfQorCQlpZiAocHJvcC0+dmlzaWJsZS5leHByKSB7CisJCQlkZWJ1ZyArPSAiJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ZGVwOiAiOworCQkJZXhwcl9wcmludChwcm9wLT52aXNpYmxlLmV4cHIsIGV4cHJfcHJpbnRfaGVscCwgJmRlYnVnLCBFX05PTkUpOworCQkJZGVidWcgKz0gIjxicj4iOworCQl9CisJfQorCWRlYnVnICs9ICI8YnI+IjsKKworCXJldHVybiBkZWJ1ZzsKK30KKworUVN0cmluZyBDb25maWdJbmZvVmlldzo6cHJpbnRfZmlsdGVyKGNvbnN0IFFTdHJpbmcgJnN0cikKIHsKIAlRUmVnRXhwIHJlKCJbPD4mXCJcXG5dIik7CiAJUVN0cmluZyByZXMgPSBzdHI7CkBAIC0xMDA4LDExOCArMTE0NSwyODQgQEAKIAlyZXR1cm4gcmVzOwogfQogCi1zdGF0aWMgdm9pZCBleHByX3ByaW50X2hlbHAodm9pZCAqZGF0YSwgY29uc3QgY2hhciAqc3RyKQordm9pZCBDb25maWdJbmZvVmlldzo6ZXhwcl9wcmludF9oZWxwKHZvaWQgKmRhdGEsIHN0cnVjdCBzeW1ib2wgKnN5bSwgY29uc3QgY2hhciAqc3RyKQogewotCXJlaW50ZXJwcmV0X2Nhc3Q8UVN0cmluZyo+KGRhdGEpLT5hcHBlbmQocHJpbnRfZmlsdGVyKHN0cikpOworCVFTdHJpbmcqIHRleHQgPSByZWludGVycHJldF9jYXN0PFFTdHJpbmcqPihkYXRhKTsKKwlRU3RyaW5nIHN0cjIgPSBwcmludF9maWx0ZXIoc3RyKTsKKworCWlmIChzeW0gJiYgc3ltLT5uYW1lICYmICEoc3ltLT5mbGFncyAmIFNZTUJPTF9DT05TVCkpIHsKKwkJKnRleHQgKz0gUVN0cmluZygpLnNwcmludGYoIjxhIGhyZWY9XCJzJXBcIj4iLCBzeW0pOworCQkqdGV4dCArPSBzdHIyOworCQkqdGV4dCArPSAiPC9hPiI7CisJfSBlbHNlCisJCSp0ZXh0ICs9IHN0cjI7Cit9CisKK1FQb3B1cE1lbnUqIENvbmZpZ0luZm9WaWV3OjpjcmVhdGVQb3B1cE1lbnUoY29uc3QgUVBvaW50JiBwb3MpCit7CisJUVBvcHVwTWVudSogcG9wdXAgPSBQYXJlbnQ6OmNyZWF0ZVBvcHVwTWVudShwb3MpOworCVFBY3Rpb24qIGFjdGlvbiA9IG5ldyBRQWN0aW9uKCJTaG93IERlYnVnIEluZm8iLCAwLCBwb3B1cCk7CisJICBhY3Rpb24tPnNldFRvZ2dsZUFjdGlvbihUUlVFKTsKKwkgIGNvbm5lY3QoYWN0aW9uLCBTSUdOQUwodG9nZ2xlZChib29sKSksIFNMT1Qoc2V0U2hvd0RlYnVnKGJvb2wpKSk7CisJICBjb25uZWN0KHRoaXMsIFNJR05BTChzaG93RGVidWdDaGFuZ2VkKGJvb2wpKSwgYWN0aW9uLCBTTE9UKHNldE9uKGJvb2wpKSk7CisJICBhY3Rpb24tPnNldE9uKHNob3dEZWJ1ZygpKTsKKwlwb3B1cC0+aW5zZXJ0U2VwYXJhdG9yKCk7CisJYWN0aW9uLT5hZGRUbyhwb3B1cCk7CisJcmV0dXJuIHBvcHVwOworfQorCit2b2lkIENvbmZpZ0luZm9WaWV3Ojpjb250ZW50c0NvbnRleHRNZW51RXZlbnQoUUNvbnRleHRNZW51RXZlbnQgKmUpCit7CisJUGFyZW50Ojpjb250ZW50c0NvbnRleHRNZW51RXZlbnQoZSk7Cit9CisKK0NvbmZpZ1NlYXJjaFdpbmRvdzo6Q29uZmlnU2VhcmNoV2luZG93KFFXaWRnZXQqIHBhcmVudCwgY29uc3QgY2hhciAqbmFtZSkKKwk6IFBhcmVudChwYXJlbnQsIG5hbWUpLCByZXN1bHQoTlVMTCkKK3sKKwlzZXRDYXB0aW9uKCJTZWFyY2ggQ29uZmlnIik7CisKKwlRVkJveExheW91dCogbGF5b3V0MSA9IG5ldyBRVkJveExheW91dCh0aGlzLCAxMSwgNik7CisJUUhCb3hMYXlvdXQqIGxheW91dDIgPSBuZXcgUUhCb3hMYXlvdXQoMCwgMCwgNik7CisJbGF5b3V0Mi0+YWRkV2lkZ2V0KG5ldyBRTGFiZWwoIkZpbmQ6IiwgdGhpcykpOworCWVkaXRGaWVsZCA9IG5ldyBRTGluZUVkaXQodGhpcyk7CisJY29ubmVjdChlZGl0RmllbGQsIFNJR05BTChyZXR1cm5QcmVzc2VkKCkpLCBTTE9UKHNlYXJjaCgpKSk7CisJbGF5b3V0Mi0+YWRkV2lkZ2V0KGVkaXRGaWVsZCk7CisJc2VhcmNoQnV0dG9uID0gbmV3IFFQdXNoQnV0dG9uKCJTZWFyY2giLCB0aGlzKTsKKwlzZWFyY2hCdXR0b24tPnNldEF1dG9EZWZhdWx0KEZBTFNFKTsKKwljb25uZWN0KHNlYXJjaEJ1dHRvbiwgU0lHTkFMKGNsaWNrZWQoKSksIFNMT1Qoc2VhcmNoKCkpKTsKKwlsYXlvdXQyLT5hZGRXaWRnZXQoc2VhcmNoQnV0dG9uKTsKKwlsYXlvdXQxLT5hZGRMYXlvdXQobGF5b3V0Mik7CisKKwlzcGxpdCA9IG5ldyBRU3BsaXR0ZXIodGhpcyk7CisJc3BsaXQtPnNldE9yaWVudGF0aW9uKFFTcGxpdHRlcjo6VmVydGljYWwpOworCWxpc3QgPSBuZXcgQ29uZmlnVmlldyhzcGxpdCwgbmFtZSk7CisJbGlzdC0+bGlzdC0+bW9kZSA9IGxpc3RNb2RlOworCWluZm8gPSBuZXcgQ29uZmlnSW5mb1ZpZXcoc3BsaXQsIG5hbWUpOworCWNvbm5lY3QobGlzdC0+bGlzdCwgU0lHTkFMKG1lbnVDaGFuZ2VkKHN0cnVjdCBtZW51ICopKSwKKwkJaW5mbywgU0xPVChzZXRJbmZvKHN0cnVjdCBtZW51ICopKSk7CisJbGF5b3V0MS0+YWRkV2lkZ2V0KHNwbGl0KTsKKworCWlmIChuYW1lKSB7CisJCWludCB4LCB5LCB3aWR0aCwgaGVpZ2h0OworCQlib29sIG9rOworCisJCWNvbmZpZ1NldHRpbmdzLT5iZWdpbkdyb3VwKG5hbWUpOworCQl3aWR0aCA9IGNvbmZpZ1NldHRpbmdzLT5yZWFkTnVtRW50cnkoIi93aW5kb3cgd2lkdGgiLCBwYXJlbnQtPndpZHRoKCkgLyAyKTsKKwkJaGVpZ2h0ID0gY29uZmlnU2V0dGluZ3MtPnJlYWROdW1FbnRyeSgiL3dpbmRvdyBoZWlnaHQiLCBwYXJlbnQtPmhlaWdodCgpIC8gMik7CisJCXJlc2l6ZSh3aWR0aCwgaGVpZ2h0KTsKKwkJeCA9IGNvbmZpZ1NldHRpbmdzLT5yZWFkTnVtRW50cnkoIi93aW5kb3cgeCIsIDAsICZvayk7CisJCWlmIChvaykKKwkJCXkgPSBjb25maWdTZXR0aW5ncy0+cmVhZE51bUVudHJ5KCIvd2luZG93IHkiLCAwLCAmb2spOworCQlpZiAob2spCisJCQltb3ZlKHgsIHkpOworCQlRVmFsdWVMaXN0PGludD4gc2l6ZXMgPSBjb25maWdTZXR0aW5ncy0+cmVhZFNpemVzKCIvc3BsaXQiLCAmb2spOworCQlpZiAob2spCisJCQlzcGxpdC0+c2V0U2l6ZXMoc2l6ZXMpOworCQljb25maWdTZXR0aW5ncy0+ZW5kR3JvdXAoKTsKKwkJY29ubmVjdChjb25maWdBcHAsIFNJR05BTChhYm91dFRvUXVpdCgpKSwgU0xPVChzYXZlU2V0dGluZ3MoKSkpOworCX0KK30KKwordm9pZCBDb25maWdTZWFyY2hXaW5kb3c6OnNhdmVTZXR0aW5ncyh2b2lkKQoreworCWlmIChuYW1lKCkpIHsKKwkJY29uZmlnU2V0dGluZ3MtPmJlZ2luR3JvdXAobmFtZSgpKTsKKwkJY29uZmlnU2V0dGluZ3MtPndyaXRlRW50cnkoIi93aW5kb3cgeCIsIHBvcygpLngoKSk7CisJCWNvbmZpZ1NldHRpbmdzLT53cml0ZUVudHJ5KCIvd2luZG93IHkiLCBwb3MoKS55KCkpOworCQljb25maWdTZXR0aW5ncy0+d3JpdGVFbnRyeSgiL3dpbmRvdyB3aWR0aCIsIHNpemUoKS53aWR0aCgpKTsKKwkJY29uZmlnU2V0dGluZ3MtPndyaXRlRW50cnkoIi93aW5kb3cgaGVpZ2h0Iiwgc2l6ZSgpLmhlaWdodCgpKTsKKwkJY29uZmlnU2V0dGluZ3MtPndyaXRlU2l6ZXMoIi9zcGxpdCIsIHNwbGl0LT5zaXplcygpKTsKKwkJY29uZmlnU2V0dGluZ3MtPmVuZEdyb3VwKCk7CisJfQorfQorCit2b2lkIENvbmZpZ1NlYXJjaFdpbmRvdzo6c2VhcmNoKHZvaWQpCit7CisJc3RydWN0IHN5bWJvbCAqKnA7CisJc3RydWN0IHByb3BlcnR5ICpwcm9wOworCUNvbmZpZ0l0ZW0gKmxhc3RJdGVtID0gTlVMTDsKKworCWZyZWUocmVzdWx0KTsKKwlsaXN0LT5saXN0LT5jbGVhcigpOworCisJcmVzdWx0ID0gc3ltX3JlX3NlYXJjaChlZGl0RmllbGQtPnRleHQoKS5sYXRpbjEoKSk7CisJaWYgKCFyZXN1bHQpCisJCXJldHVybjsKKwlmb3IgKHAgPSByZXN1bHQ7ICpwOyBwKyspIHsKKwkJZm9yX2FsbF9wcm9tcHRzKCgqcCksIHByb3ApCisJCQlsYXN0SXRlbSA9IG5ldyBDb25maWdJdGVtKGxpc3QtPmxpc3QsIGxhc3RJdGVtLCBwcm9wLT5tZW51LAorCQkJCQkJICBtZW51X2lzX3Zpc2libGUocHJvcC0+bWVudSkpOworCX0KIH0KIAogLyoKLSAqIGRpc3BsYXkgYSBuZXcgaGVscCBlbnRyeSBhcyBzb29uIGFzIGEgbmV3IG1lbnUgZW50cnkgaXMgc2VsZWN0ZWQKKyAqIENvbnN0cnVjdCB0aGUgY29tcGxldGUgY29uZmlnIHdpZGdldAogICovCi12b2lkIENvbmZpZ01haW5XaW5kb3c6OnNldEhlbHAoUUxpc3RWaWV3SXRlbSogaXRlbSkKK0NvbmZpZ01haW5XaW5kb3c6OkNvbmZpZ01haW5XaW5kb3codm9pZCkKIHsKLQlzdHJ1Y3Qgc3ltYm9sKiBzeW07Ci0Jc3RydWN0IG1lbnUqIG1lbnUgPSAwOworCVFNZW51QmFyKiBtZW51OworCWJvb2wgb2s7CisJaW50IHgsIHksIHdpZHRoLCBoZWlnaHQ7CiAKLQljb25maWdMaXN0LT5wYXJlbnQoKS0+bGluZUVkaXQtPmhpZGUoKTsKLQlpZiAoaXRlbSkKLQkJbWVudSA9ICgoQ29uZmlnSXRlbSopaXRlbSktPm1lbnU7Ci0JaWYgKCFtZW51KSB7Ci0JCWhlbHBUZXh0LT5zZXRUZXh0KFFTdHJpbmc6Om51bGwpOwotCQlyZXR1cm47Ci0JfQorCVFXaWRnZXQgKmQgPSBjb25maWdBcHAtPmRlc2t0b3AoKTsKIAotCVFTdHJpbmcgaGVhZCwgZGVidWcsIGhlbHA7Ci0JbWVudSA9ICgoQ29uZmlnSXRlbSopaXRlbSktPm1lbnU7Ci0Jc3ltID0gbWVudS0+c3ltOwotCWlmIChzeW0pIHsKLQkJaWYgKG1lbnUtPnByb21wdCkgewotCQkJaGVhZCArPSAiPGJpZz48Yj4iOwotCQkJaGVhZCArPSBwcmludF9maWx0ZXIoXyhtZW51LT5wcm9tcHQtPnRleHQpKTsKLQkJCWhlYWQgKz0gIjwvYj48L2JpZz4iOwotCQkJaWYgKHN5bS0+bmFtZSkgewotCQkJCWhlYWQgKz0gIiAoIjsKLQkJCQloZWFkICs9IHByaW50X2ZpbHRlcihfKHN5bS0+bmFtZSkpOwotCQkJCWhlYWQgKz0gIikiOwotCQkJfQotCQl9IGVsc2UgaWYgKHN5bS0+bmFtZSkgewotCQkJaGVhZCArPSAiPGJpZz48Yj4iOwotCQkJaGVhZCArPSBwcmludF9maWx0ZXIoXyhzeW0tPm5hbWUpKTsKLQkJCWhlYWQgKz0gIjwvYj48L2JpZz4iOwotCQl9Ci0JCWhlYWQgKz0gIjxicj48YnI+IjsKKwl3aWR0aCA9IGNvbmZpZ1NldHRpbmdzLT5yZWFkTnVtRW50cnkoIi93aW5kb3cgd2lkdGgiLCBkLT53aWR0aCgpIC0gNjQpOworCWhlaWdodCA9IGNvbmZpZ1NldHRpbmdzLT5yZWFkTnVtRW50cnkoIi93aW5kb3cgaGVpZ2h0IiwgZC0+aGVpZ2h0KCkgLSA2NCk7CisJcmVzaXplKHdpZHRoLCBoZWlnaHQpOworCXggPSBjb25maWdTZXR0aW5ncy0+cmVhZE51bUVudHJ5KCIvd2luZG93IHgiLCAwLCAmb2spOworCWlmIChvaykKKwkJeSA9IGNvbmZpZ1NldHRpbmdzLT5yZWFkTnVtRW50cnkoIi93aW5kb3cgeSIsIDAsICZvayk7CisJaWYgKG9rKQorCQltb3ZlKHgsIHkpOwogCi0JCWlmIChzaG93RGVidWcpIHsKLQkJCWRlYnVnICs9ICJ0eXBlOiAiOwotCQkJZGVidWcgKz0gcHJpbnRfZmlsdGVyKHN5bV90eXBlX25hbWUoc3ltLT50eXBlKSk7Ci0JCQlpZiAoc3ltX2lzX2Nob2ljZShzeW0pKQotCQkJCWRlYnVnICs9ICIgKGNob2ljZSkiOwotCQkJZGVidWcgKz0gIjxicj4iOwotCQkJaWYgKHN5bS0+cmV2X2RlcC5leHByKSB7Ci0JCQkJZGVidWcgKz0gInJldmVyc2UgZGVwOiAiOwotCQkJCWV4cHJfcHJpbnQoc3ltLT5yZXZfZGVwLmV4cHIsIGV4cHJfcHJpbnRfaGVscCwgJmRlYnVnLCBFX05PTkUpOwotCQkJCWRlYnVnICs9ICI8YnI+IjsKLQkJCX0KLQkJCWZvciAoc3RydWN0IHByb3BlcnR5ICpwcm9wID0gc3ltLT5wcm9wOyBwcm9wOyBwcm9wID0gcHJvcC0+bmV4dCkgewotCQkJCXN3aXRjaCAocHJvcC0+dHlwZSkgewotCQkJCWNhc2UgUF9QUk9NUFQ6Ci0JCQkJY2FzZSBQX01FTlU6Ci0JCQkJCWRlYnVnICs9ICJwcm9tcHQ6ICI7Ci0JCQkJCWRlYnVnICs9IHByaW50X2ZpbHRlcihfKHByb3AtPnRleHQpKTsKLQkJCQkJZGVidWcgKz0gIjxicj4iOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFBfREVGQVVMVDoKLQkJCQkJZGVidWcgKz0gImRlZmF1bHQ6ICI7Ci0JCQkJCWV4cHJfcHJpbnQocHJvcC0+ZXhwciwgZXhwcl9wcmludF9oZWxwLCAmZGVidWcsIEVfTk9ORSk7Ci0JCQkJCWRlYnVnICs9ICI8YnI+IjsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBQX0NIT0lDRToKLQkJCQkJaWYgKHN5bV9pc19jaG9pY2Uoc3ltKSkgewotCQkJCQkJZGVidWcgKz0gImNob2ljZTogIjsKLQkJCQkJCWV4cHJfcHJpbnQocHJvcC0+ZXhwciwgZXhwcl9wcmludF9oZWxwLCAmZGVidWcsIEVfTk9ORSk7Ci0JCQkJCQlkZWJ1ZyArPSAiPGJyPiI7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBQX1NFTEVDVDoKLQkJCQkJZGVidWcgKz0gInNlbGVjdDogIjsKLQkJCQkJZXhwcl9wcmludChwcm9wLT5leHByLCBleHByX3ByaW50X2hlbHAsICZkZWJ1ZywgRV9OT05FKTsKLQkJCQkJZGVidWcgKz0gIjxicj4iOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFBfUkFOR0U6Ci0JCQkJCWRlYnVnICs9ICJyYW5nZTogIjsKLQkJCQkJZXhwcl9wcmludChwcm9wLT5leHByLCBleHByX3ByaW50X2hlbHAsICZkZWJ1ZywgRV9OT05FKTsKLQkJCQkJZGVidWcgKz0gIjxicj4iOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlkZWJ1ZyArPSAidW5rbm93biBwcm9wZXJ0eTogIjsKLQkJCQkJZGVidWcgKz0gcHJvcF9nZXRfdHlwZV9uYW1lKHByb3AtPnR5cGUpOwotCQkJCQlkZWJ1ZyArPSAiPGJyPiI7Ci0JCQkJfQotCQkJCWlmIChwcm9wLT52aXNpYmxlLmV4cHIpIHsKLQkJCQkJZGVidWcgKz0gIiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO2RlcDogIjsKLQkJCQkJZXhwcl9wcmludChwcm9wLT52aXNpYmxlLmV4cHIsIGV4cHJfcHJpbnRfaGVscCwgJmRlYnVnLCBFX05PTkUpOwotCQkJCQlkZWJ1ZyArPSAiPGJyPiI7Ci0JCQkJfQotCQkJfQotCQkJZGVidWcgKz0gIjxicj4iOwotCQl9CisJc3BsaXQxID0gbmV3IFFTcGxpdHRlcih0aGlzKTsKKwlzcGxpdDEtPnNldE9yaWVudGF0aW9uKFFTcGxpdHRlcjo6SG9yaXpvbnRhbCk7CisJc2V0Q2VudHJhbFdpZGdldChzcGxpdDEpOwogCi0JCWhlbHAgPSBwcmludF9maWx0ZXIoXyhzeW0tPmhlbHApKTsKLQl9IGVsc2UgaWYgKG1lbnUtPnByb21wdCkgewotCQloZWFkICs9ICI8YmlnPjxiPiI7Ci0JCWhlYWQgKz0gcHJpbnRfZmlsdGVyKF8obWVudS0+cHJvbXB0LT50ZXh0KSk7Ci0JCWhlYWQgKz0gIjwvYj48L2JpZz48YnI+PGJyPiI7Ci0JCWlmIChzaG93RGVidWcpIHsKLQkJCWlmIChtZW51LT5wcm9tcHQtPnZpc2libGUuZXhwcikgewotCQkJCWRlYnVnICs9ICImbmJzcDsmbmJzcDtkZXA6ICI7Ci0JCQkJZXhwcl9wcmludChtZW51LT5wcm9tcHQtPnZpc2libGUuZXhwciwgZXhwcl9wcmludF9oZWxwLCAmZGVidWcsIEVfTk9ORSk7Ci0JCQkJZGVidWcgKz0gIjxicj48YnI+IjsKLQkJCX0KLQkJfQotCX0KLQlpZiAoc2hvd0RlYnVnKQotCQlkZWJ1ZyArPSBRU3RyaW5nKCkuc3ByaW50ZigiZGVmaW5lZCBhdCAlczolZDxicj48YnI+IiwgbWVudS0+ZmlsZS0+bmFtZSwgbWVudS0+bGluZW5vKTsKLQloZWxwVGV4dC0+c2V0VGV4dChoZWFkICsgZGVidWcgKyBoZWxwKTsKKwltZW51VmlldyA9IG5ldyBDb25maWdWaWV3KHNwbGl0MSwgIm1lbnUiKTsKKwltZW51TGlzdCA9IG1lbnVWaWV3LT5saXN0OworCisJc3BsaXQyID0gbmV3IFFTcGxpdHRlcihzcGxpdDEpOworCXNwbGl0Mi0+c2V0T3JpZW50YXRpb24oUVNwbGl0dGVyOjpWZXJ0aWNhbCk7CisKKwkvLyBjcmVhdGUgY29uZmlnIHRyZWUKKwljb25maWdWaWV3ID0gbmV3IENvbmZpZ1ZpZXcoc3BsaXQyLCAiY29uZmlnIik7CisJY29uZmlnTGlzdCA9IGNvbmZpZ1ZpZXctPmxpc3Q7CisKKwloZWxwVGV4dCA9IG5ldyBDb25maWdJbmZvVmlldyhzcGxpdDIsICJoZWxwIik7CisJaGVscFRleHQtPnNldFRleHRGb3JtYXQoUXQ6OlJpY2hUZXh0KTsKKworCXNldFRhYk9yZGVyKGNvbmZpZ0xpc3QsIGhlbHBUZXh0KTsKKwljb25maWdMaXN0LT5zZXRGb2N1cygpOworCisJbWVudSA9IG1lbnVCYXIoKTsKKwl0b29sQmFyID0gbmV3IFFUb29sQmFyKCJUb29scyIsIHRoaXMpOworCisJYmFja0FjdGlvbiA9IG5ldyBRQWN0aW9uKCJCYWNrIiwgUVBpeG1hcCh4cG1fYmFjayksICJCYWNrIiwgMCwgdGhpcyk7CisJICBjb25uZWN0KGJhY2tBY3Rpb24sIFNJR05BTChhY3RpdmF0ZWQoKSksIFNMT1QoZ29CYWNrKCkpKTsKKwkgIGJhY2tBY3Rpb24tPnNldEVuYWJsZWQoRkFMU0UpOworCVFBY3Rpb24gKnF1aXRBY3Rpb24gPSBuZXcgUUFjdGlvbigiUXVpdCIsICImUXVpdCIsIENUUkwrS2V5X1EsIHRoaXMpOworCSAgY29ubmVjdChxdWl0QWN0aW9uLCBTSUdOQUwoYWN0aXZhdGVkKCkpLCBTTE9UKGNsb3NlKCkpKTsKKwlRQWN0aW9uICpsb2FkQWN0aW9uID0gbmV3IFFBY3Rpb24oIkxvYWQiLCBRUGl4bWFwKHhwbV9sb2FkKSwgIiZMb2FkIiwgQ1RSTCtLZXlfTCwgdGhpcyk7CisJICBjb25uZWN0KGxvYWRBY3Rpb24sIFNJR05BTChhY3RpdmF0ZWQoKSksIFNMT1QobG9hZENvbmZpZygpKSk7CisJUUFjdGlvbiAqc2F2ZUFjdGlvbiA9IG5ldyBRQWN0aW9uKCJTYXZlIiwgUVBpeG1hcCh4cG1fc2F2ZSksICImU2F2ZSIsIENUUkwrS2V5X1MsIHRoaXMpOworCSAgY29ubmVjdChzYXZlQWN0aW9uLCBTSUdOQUwoYWN0aXZhdGVkKCkpLCBTTE9UKHNhdmVDb25maWcoKSkpOworCVFBY3Rpb24gKnNhdmVBc0FjdGlvbiA9IG5ldyBRQWN0aW9uKCJTYXZlIEFzLi4uIiwgIlNhdmUgJkFzLi4uIiwgMCwgdGhpcyk7CisJICBjb25uZWN0KHNhdmVBc0FjdGlvbiwgU0lHTkFMKGFjdGl2YXRlZCgpKSwgU0xPVChzYXZlQ29uZmlnQXMoKSkpOworCVFBY3Rpb24gKnNlYXJjaEFjdGlvbiA9IG5ldyBRQWN0aW9uKCJTZWFyY2giLCAiJlNlYXJjaCIsIENUUkwrS2V5X0YsIHRoaXMpOworCSAgY29ubmVjdChzZWFyY2hBY3Rpb24sIFNJR05BTChhY3RpdmF0ZWQoKSksIFNMT1Qoc2VhcmNoQ29uZmlnKCkpKTsKKwlRQWN0aW9uICpzaW5nbGVWaWV3QWN0aW9uID0gbmV3IFFBY3Rpb24oIlNpbmdsZSBWaWV3IiwgUVBpeG1hcCh4cG1fc2luZ2xlX3ZpZXcpLCAiU3BsaXQgVmlldyIsIDAsIHRoaXMpOworCSAgY29ubmVjdChzaW5nbGVWaWV3QWN0aW9uLCBTSUdOQUwoYWN0aXZhdGVkKCkpLCBTTE9UKHNob3dTaW5nbGVWaWV3KCkpKTsKKwlRQWN0aW9uICpzcGxpdFZpZXdBY3Rpb24gPSBuZXcgUUFjdGlvbigiU3BsaXQgVmlldyIsIFFQaXhtYXAoeHBtX3NwbGl0X3ZpZXcpLCAiU3BsaXQgVmlldyIsIDAsIHRoaXMpOworCSAgY29ubmVjdChzcGxpdFZpZXdBY3Rpb24sIFNJR05BTChhY3RpdmF0ZWQoKSksIFNMT1Qoc2hvd1NwbGl0VmlldygpKSk7CisJUUFjdGlvbiAqZnVsbFZpZXdBY3Rpb24gPSBuZXcgUUFjdGlvbigiRnVsbCBWaWV3IiwgUVBpeG1hcCh4cG1fdHJlZV92aWV3KSwgIkZ1bGwgVmlldyIsIDAsIHRoaXMpOworCSAgY29ubmVjdChmdWxsVmlld0FjdGlvbiwgU0lHTkFMKGFjdGl2YXRlZCgpKSwgU0xPVChzaG93RnVsbFZpZXcoKSkpOworCisJUUFjdGlvbiAqc2hvd05hbWVBY3Rpb24gPSBuZXcgUUFjdGlvbihOVUxMLCAiU2hvdyBOYW1lIiwgMCwgdGhpcyk7CisJICBzaG93TmFtZUFjdGlvbi0+c2V0VG9nZ2xlQWN0aW9uKFRSVUUpOworCSAgY29ubmVjdChzaG93TmFtZUFjdGlvbiwgU0lHTkFMKHRvZ2dsZWQoYm9vbCkpLCBjb25maWdWaWV3LCBTTE9UKHNldFNob3dOYW1lKGJvb2wpKSk7CisJICBjb25uZWN0KGNvbmZpZ1ZpZXcsIFNJR05BTChzaG93TmFtZUNoYW5nZWQoYm9vbCkpLCBzaG93TmFtZUFjdGlvbiwgU0xPVChzZXRPbihib29sKSkpOworCSAgc2hvd05hbWVBY3Rpb24tPnNldE9uKGNvbmZpZ1ZpZXctPnNob3dOYW1lKCkpOworCVFBY3Rpb24gKnNob3dSYW5nZUFjdGlvbiA9IG5ldyBRQWN0aW9uKE5VTEwsICJTaG93IFJhbmdlIiwgMCwgdGhpcyk7CisJICBzaG93UmFuZ2VBY3Rpb24tPnNldFRvZ2dsZUFjdGlvbihUUlVFKTsKKwkgIGNvbm5lY3Qoc2hvd1JhbmdlQWN0aW9uLCBTSUdOQUwodG9nZ2xlZChib29sKSksIGNvbmZpZ1ZpZXcsIFNMT1Qoc2V0U2hvd1JhbmdlKGJvb2wpKSk7CisJICBjb25uZWN0KGNvbmZpZ1ZpZXcsIFNJR05BTChzaG93UmFuZ2VDaGFuZ2VkKGJvb2wpKSwgc2hvd1JhbmdlQWN0aW9uLCBTTE9UKHNldE9uKGJvb2wpKSk7CisJICBzaG93UmFuZ2VBY3Rpb24tPnNldE9uKGNvbmZpZ0xpc3QtPnNob3dSYW5nZSk7CisJUUFjdGlvbiAqc2hvd0RhdGFBY3Rpb24gPSBuZXcgUUFjdGlvbihOVUxMLCAiU2hvdyBEYXRhIiwgMCwgdGhpcyk7CisJICBzaG93RGF0YUFjdGlvbi0+c2V0VG9nZ2xlQWN0aW9uKFRSVUUpOworCSAgY29ubmVjdChzaG93RGF0YUFjdGlvbiwgU0lHTkFMKHRvZ2dsZWQoYm9vbCkpLCBjb25maWdWaWV3LCBTTE9UKHNldFNob3dEYXRhKGJvb2wpKSk7CisJICBjb25uZWN0KGNvbmZpZ1ZpZXcsIFNJR05BTChzaG93RGF0YUNoYW5nZWQoYm9vbCkpLCBzaG93RGF0YUFjdGlvbiwgU0xPVChzZXRPbihib29sKSkpOworCSAgc2hvd0RhdGFBY3Rpb24tPnNldE9uKGNvbmZpZ0xpc3QtPnNob3dEYXRhKTsKKwlRQWN0aW9uICpzaG93QWxsQWN0aW9uID0gbmV3IFFBY3Rpb24oTlVMTCwgIlNob3cgQWxsIE9wdGlvbnMiLCAwLCB0aGlzKTsKKwkgIHNob3dBbGxBY3Rpb24tPnNldFRvZ2dsZUFjdGlvbihUUlVFKTsKKwkgIGNvbm5lY3Qoc2hvd0FsbEFjdGlvbiwgU0lHTkFMKHRvZ2dsZWQoYm9vbCkpLCBjb25maWdWaWV3LCBTTE9UKHNldFNob3dBbGwoYm9vbCkpKTsKKwkgIGNvbm5lY3Qoc2hvd0FsbEFjdGlvbiwgU0lHTkFMKHRvZ2dsZWQoYm9vbCkpLCBtZW51VmlldywgU0xPVChzZXRTaG93QWxsKGJvb2wpKSk7CisJICBzaG93QWxsQWN0aW9uLT5zZXRPbihjb25maWdMaXN0LT5zaG93QWxsKTsKKwlRQWN0aW9uICpzaG93RGVidWdBY3Rpb24gPSBuZXcgUUFjdGlvbihOVUxMLCAiU2hvdyBEZWJ1ZyBJbmZvIiwgMCwgdGhpcyk7CisJICBzaG93RGVidWdBY3Rpb24tPnNldFRvZ2dsZUFjdGlvbihUUlVFKTsKKwkgIGNvbm5lY3Qoc2hvd0RlYnVnQWN0aW9uLCBTSUdOQUwodG9nZ2xlZChib29sKSksIGhlbHBUZXh0LCBTTE9UKHNldFNob3dEZWJ1Zyhib29sKSkpOworCSAgY29ubmVjdChoZWxwVGV4dCwgU0lHTkFMKHNob3dEZWJ1Z0NoYW5nZWQoYm9vbCkpLCBzaG93RGVidWdBY3Rpb24sIFNMT1Qoc2V0T24oYm9vbCkpKTsKKwkgIHNob3dEZWJ1Z0FjdGlvbi0+c2V0T24oaGVscFRleHQtPnNob3dEZWJ1ZygpKTsKKworCVFBY3Rpb24gKnNob3dJbnRyb0FjdGlvbiA9IG5ldyBRQWN0aW9uKE5VTEwsICJJbnRyb2R1Y3Rpb24iLCAwLCB0aGlzKTsKKwkgIGNvbm5lY3Qoc2hvd0ludHJvQWN0aW9uLCBTSUdOQUwoYWN0aXZhdGVkKCkpLCBTTE9UKHNob3dJbnRybygpKSk7CisJUUFjdGlvbiAqc2hvd0Fib3V0QWN0aW9uID0gbmV3IFFBY3Rpb24oTlVMTCwgIkFib3V0IiwgMCwgdGhpcyk7CisJICBjb25uZWN0KHNob3dBYm91dEFjdGlvbiwgU0lHTkFMKGFjdGl2YXRlZCgpKSwgU0xPVChzaG93QWJvdXQoKSkpOworCisJLy8gaW5pdCB0b29sIGJhcgorCWJhY2tBY3Rpb24tPmFkZFRvKHRvb2xCYXIpOworCXRvb2xCYXItPmFkZFNlcGFyYXRvcigpOworCWxvYWRBY3Rpb24tPmFkZFRvKHRvb2xCYXIpOworCXNhdmVBY3Rpb24tPmFkZFRvKHRvb2xCYXIpOworCXRvb2xCYXItPmFkZFNlcGFyYXRvcigpOworCXNpbmdsZVZpZXdBY3Rpb24tPmFkZFRvKHRvb2xCYXIpOworCXNwbGl0Vmlld0FjdGlvbi0+YWRkVG8odG9vbEJhcik7CisJZnVsbFZpZXdBY3Rpb24tPmFkZFRvKHRvb2xCYXIpOworCisJLy8gY3JlYXRlIGNvbmZpZyBtZW51CisJUVBvcHVwTWVudSogY29uZmlnID0gbmV3IFFQb3B1cE1lbnUodGhpcyk7CisJbWVudS0+aW5zZXJ0SXRlbSgiJkZpbGUiLCBjb25maWcpOworCWxvYWRBY3Rpb24tPmFkZFRvKGNvbmZpZyk7CisJc2F2ZUFjdGlvbi0+YWRkVG8oY29uZmlnKTsKKwlzYXZlQXNBY3Rpb24tPmFkZFRvKGNvbmZpZyk7CisJY29uZmlnLT5pbnNlcnRTZXBhcmF0b3IoKTsKKwlzZWFyY2hBY3Rpb24tPmFkZFRvKGNvbmZpZyk7CisJY29uZmlnLT5pbnNlcnRTZXBhcmF0b3IoKTsKKwlxdWl0QWN0aW9uLT5hZGRUbyhjb25maWcpOworCisJLy8gY3JlYXRlIG9wdGlvbnMgbWVudQorCVFQb3B1cE1lbnUqIG9wdGlvbk1lbnUgPSBuZXcgUVBvcHVwTWVudSh0aGlzKTsKKwltZW51LT5pbnNlcnRJdGVtKCImT3B0aW9uIiwgb3B0aW9uTWVudSk7CisJc2hvd05hbWVBY3Rpb24tPmFkZFRvKG9wdGlvbk1lbnUpOworCXNob3dSYW5nZUFjdGlvbi0+YWRkVG8ob3B0aW9uTWVudSk7CisJc2hvd0RhdGFBY3Rpb24tPmFkZFRvKG9wdGlvbk1lbnUpOworCW9wdGlvbk1lbnUtPmluc2VydFNlcGFyYXRvcigpOworCXNob3dBbGxBY3Rpb24tPmFkZFRvKG9wdGlvbk1lbnUpOworCXNob3dEZWJ1Z0FjdGlvbi0+YWRkVG8ob3B0aW9uTWVudSk7CisKKwkvLyBjcmVhdGUgaGVscCBtZW51CisJUVBvcHVwTWVudSogaGVscE1lbnUgPSBuZXcgUVBvcHVwTWVudSh0aGlzKTsKKwltZW51LT5pbnNlcnRTZXBhcmF0b3IoKTsKKwltZW51LT5pbnNlcnRJdGVtKCImSGVscCIsIGhlbHBNZW51KTsKKwlzaG93SW50cm9BY3Rpb24tPmFkZFRvKGhlbHBNZW51KTsKKwlzaG93QWJvdXRBY3Rpb24tPmFkZFRvKGhlbHBNZW51KTsKKworCWNvbm5lY3QoY29uZmlnTGlzdCwgU0lHTkFMKG1lbnVDaGFuZ2VkKHN0cnVjdCBtZW51ICopKSwKKwkJaGVscFRleHQsIFNMT1Qoc2V0SW5mbyhzdHJ1Y3QgbWVudSAqKSkpOworCWNvbm5lY3QoY29uZmlnTGlzdCwgU0lHTkFMKG1lbnVTZWxlY3RlZChzdHJ1Y3QgbWVudSAqKSksCisJCVNMT1QoY2hhbmdlTWVudShzdHJ1Y3QgbWVudSAqKSkpOworCWNvbm5lY3QoY29uZmlnTGlzdCwgU0lHTkFMKHBhcmVudFNlbGVjdGVkKCkpLAorCQlTTE9UKGdvQmFjaygpKSk7CisJY29ubmVjdChtZW51TGlzdCwgU0lHTkFMKG1lbnVDaGFuZ2VkKHN0cnVjdCBtZW51ICopKSwKKwkJaGVscFRleHQsIFNMT1Qoc2V0SW5mbyhzdHJ1Y3QgbWVudSAqKSkpOworCWNvbm5lY3QobWVudUxpc3QsIFNJR05BTChtZW51U2VsZWN0ZWQoc3RydWN0IG1lbnUgKikpLAorCQlTTE9UKGNoYW5nZU1lbnUoc3RydWN0IG1lbnUgKikpKTsKKworCWNvbm5lY3QoY29uZmlnTGlzdCwgU0lHTkFMKGdvdEZvY3VzKHN0cnVjdCBtZW51ICopKSwKKwkJaGVscFRleHQsIFNMT1Qoc2V0SW5mbyhzdHJ1Y3QgbWVudSAqKSkpOworCWNvbm5lY3QobWVudUxpc3QsIFNJR05BTChnb3RGb2N1cyhzdHJ1Y3QgbWVudSAqKSksCisJCWhlbHBUZXh0LCBTTE9UKHNldEluZm8oc3RydWN0IG1lbnUgKikpKTsKKwljb25uZWN0KG1lbnVMaXN0LCBTSUdOQUwoZ290Rm9jdXMoc3RydWN0IG1lbnUgKikpLAorCQlTTE9UKGxpc3RGb2N1c0NoYW5nZWQodm9pZCkpKTsKKwljb25uZWN0KGhlbHBUZXh0LCBTSUdOQUwobWVudVNlbGVjdGVkKHN0cnVjdCBtZW51ICopKSwKKwkJU0xPVChzZXRNZW51TGluayhzdHJ1Y3QgbWVudSAqKSkpOworCisJUVN0cmluZyBsaXN0TW9kZSA9IGNvbmZpZ1NldHRpbmdzLT5yZWFkRW50cnkoIi9saXN0TW9kZSIsICJzeW1ib2wiKTsKKwlpZiAobGlzdE1vZGUgPT0gInNpbmdsZSIpCisJCXNob3dTaW5nbGVWaWV3KCk7CisJZWxzZSBpZiAobGlzdE1vZGUgPT0gImZ1bGwiKQorCQlzaG93RnVsbFZpZXcoKTsKKwllbHNlIC8qaWYgKGxpc3RNb2RlID09ICJzcGxpdCIpKi8KKwkJc2hvd1NwbGl0VmlldygpOworCisJLy8gVUkgc2V0dXAgZG9uZSwgcmVzdG9yZSBzcGxpdHRlciBwb3NpdGlvbnMKKwlRVmFsdWVMaXN0PGludD4gc2l6ZXMgPSBjb25maWdTZXR0aW5ncy0+cmVhZFNpemVzKCIvc3BsaXQxIiwgJm9rKTsKKwlpZiAob2spCisJCXNwbGl0MS0+c2V0U2l6ZXMoc2l6ZXMpOworCisJc2l6ZXMgPSBjb25maWdTZXR0aW5ncy0+cmVhZFNpemVzKCIvc3BsaXQyIiwgJm9rKTsKKwlpZiAob2spCisJCXNwbGl0Mi0+c2V0U2l6ZXMoc2l6ZXMpOwogfQogCiB2b2lkIENvbmZpZ01haW5XaW5kb3c6OmxvYWRDb25maWcodm9pZCkKQEAgLTExNDcsMjEgKzE0NTAsNzMgQEAKIAkJUU1lc3NhZ2VCb3g6OmluZm9ybWF0aW9uKHRoaXMsICJxY29uZiIsICJVbmFibGUgdG8gc2F2ZSBjb25maWd1cmF0aW9uISIpOwogfQogCit2b2lkIENvbmZpZ01haW5XaW5kb3c6OnNlYXJjaENvbmZpZyh2b2lkKQoreworCWlmICghc2VhcmNoV2luZG93KQorCQlzZWFyY2hXaW5kb3cgPSBuZXcgQ29uZmlnU2VhcmNoV2luZG93KHRoaXMsICJzZWFyY2giKTsKKwlzZWFyY2hXaW5kb3ctPnNob3coKTsKK30KKwogdm9pZCBDb25maWdNYWluV2luZG93OjpjaGFuZ2VNZW51KHN0cnVjdCBtZW51ICptZW51KQogewogCWNvbmZpZ0xpc3QtPnNldFJvb3RNZW51KG1lbnUpOwogCWJhY2tBY3Rpb24tPnNldEVuYWJsZWQoVFJVRSk7CiB9CiAKK3ZvaWQgQ29uZmlnTWFpbldpbmRvdzo6c2V0TWVudUxpbmsoc3RydWN0IG1lbnUgKm1lbnUpCit7CisJc3RydWN0IG1lbnUgKnBhcmVudDsKKwlDb25maWdMaXN0KiBsaXN0ID0gTlVMTDsKKwlDb25maWdJdGVtKiBpdGVtOworCisJaWYgKCFtZW51X2lzX3Zpc2libGUobWVudSkgJiYgIWNvbmZpZ1ZpZXctPnNob3dBbGwoKSkKKwkJcmV0dXJuOworCisJc3dpdGNoIChjb25maWdMaXN0LT5tb2RlKSB7CisJY2FzZSBzaW5nbGVNb2RlOgorCQlsaXN0ID0gY29uZmlnTGlzdDsKKwkJcGFyZW50ID0gbWVudV9nZXRfcGFyZW50X21lbnUobWVudSk7CisJCWlmICghcGFyZW50KQorCQkJcmV0dXJuOworCQlsaXN0LT5zZXRSb290TWVudShwYXJlbnQpOworCQlicmVhazsKKwljYXNlIHN5bWJvbE1vZGU6CisJCWlmIChtZW51LT5mbGFncyAmIE1FTlVfUk9PVCkgeworCQkJY29uZmlnTGlzdC0+c2V0Um9vdE1lbnUobWVudSk7CisJCQljb25maWdMaXN0LT5jbGVhclNlbGVjdGlvbigpOworCQkJbGlzdCA9IG1lbnVMaXN0OworCQl9IGVsc2UgeworCQkJbGlzdCA9IGNvbmZpZ0xpc3Q7CisJCQlwYXJlbnQgPSBtZW51X2dldF9wYXJlbnRfbWVudShtZW51LT5wYXJlbnQpOworCQkJaWYgKCFwYXJlbnQpCisJCQkJcmV0dXJuOworCQkJaXRlbSA9IG1lbnVMaXN0LT5maW5kQ29uZmlnSXRlbShwYXJlbnQpOworCQkJaWYgKGl0ZW0pIHsKKwkJCQltZW51TGlzdC0+c2V0U2VsZWN0ZWQoaXRlbSwgVFJVRSk7CisJCQkJbWVudUxpc3QtPmVuc3VyZUl0ZW1WaXNpYmxlKGl0ZW0pOworCQkJfQorCQkJbGlzdC0+c2V0Um9vdE1lbnUocGFyZW50KTsKKwkJfQorCQlicmVhazsKKwljYXNlIGZ1bGxNb2RlOgorCQlsaXN0ID0gY29uZmlnTGlzdDsKKwkJYnJlYWs7CisJfQorCisJaWYgKGxpc3QpIHsKKwkJaXRlbSA9IGxpc3QtPmZpbmRDb25maWdJdGVtKG1lbnUpOworCQlpZiAoaXRlbSkgeworCQkJbGlzdC0+c2V0U2VsZWN0ZWQoaXRlbSwgVFJVRSk7CisJCQlsaXN0LT5lbnN1cmVJdGVtVmlzaWJsZShpdGVtKTsKKwkJCWxpc3QtPnNldEZvY3VzKCk7CisJCX0KKwl9Cit9CisKIHZvaWQgQ29uZmlnTWFpbldpbmRvdzo6bGlzdEZvY3VzQ2hhbmdlZCh2b2lkKQogewotCWlmIChtZW51TGlzdC0+aGFzRm9jdXMoKSkgewotCQlpZiAobWVudUxpc3QtPm1vZGUgPT0gbWVudU1vZGUpCi0JCQljb25maWdMaXN0LT5jbGVhclNlbGVjdGlvbigpOwotCQlzZXRIZWxwKG1lbnVMaXN0LT5zZWxlY3RlZEl0ZW0oKSk7Ci0JfSBlbHNlIGlmIChjb25maWdMaXN0LT5oYXNGb2N1cygpKSB7Ci0JCXNldEhlbHAoY29uZmlnTGlzdC0+c2VsZWN0ZWRJdGVtKCkpOwotCX0KKwlpZiAobWVudUxpc3QtPm1vZGUgPT0gbWVudU1vZGUpCisJCWNvbmZpZ0xpc3QtPmNsZWFyU2VsZWN0aW9uKCk7CiB9CiAKIHZvaWQgQ29uZmlnTWFpbldpbmRvdzo6Z29CYWNrKHZvaWQpCkBAIC0xMjIzLDUzICsxNTc4LDYgQEAKIAljb25maWdMaXN0LT5zZXRGb2N1cygpOwogfQogCi12b2lkIENvbmZpZ01haW5XaW5kb3c6OnNldFNob3dBbGwoYm9vbCBiKQotewotCWlmIChjb25maWdMaXN0LT5zaG93QWxsID09IGIpCi0JCXJldHVybjsKLQljb25maWdMaXN0LT5zaG93QWxsID0gYjsKLQljb25maWdMaXN0LT51cGRhdGVMaXN0QWxsKCk7Ci0JbWVudUxpc3QtPnNob3dBbGwgPSBiOwotCW1lbnVMaXN0LT51cGRhdGVMaXN0QWxsKCk7Ci19Ci0KLXZvaWQgQ29uZmlnTWFpbldpbmRvdzo6c2V0U2hvd0RlYnVnKGJvb2wgYikKLXsKLQlpZiAoc2hvd0RlYnVnID09IGIpCi0JCXJldHVybjsKLQlzaG93RGVidWcgPSBiOwotfQotCi12b2lkIENvbmZpZ01haW5XaW5kb3c6OnNldFNob3dOYW1lKGJvb2wgYikKLXsKLQlpZiAoY29uZmlnTGlzdC0+c2hvd05hbWUgPT0gYikKLQkJcmV0dXJuOwotCWNvbmZpZ0xpc3QtPnNob3dOYW1lID0gYjsKLQljb25maWdMaXN0LT5yZWluaXQoKTsKLQltZW51TGlzdC0+c2hvd05hbWUgPSBiOwotCW1lbnVMaXN0LT5yZWluaXQoKTsKLX0KLQotdm9pZCBDb25maWdNYWluV2luZG93OjpzZXRTaG93UmFuZ2UoYm9vbCBiKQotewotCWlmIChjb25maWdMaXN0LT5zaG93UmFuZ2UgPT0gYikKLQkJcmV0dXJuOwotCWNvbmZpZ0xpc3QtPnNob3dSYW5nZSA9IGI7Ci0JY29uZmlnTGlzdC0+cmVpbml0KCk7Ci0JbWVudUxpc3QtPnNob3dSYW5nZSA9IGI7Ci0JbWVudUxpc3QtPnJlaW5pdCgpOwotfQotCi12b2lkIENvbmZpZ01haW5XaW5kb3c6OnNldFNob3dEYXRhKGJvb2wgYikKLXsKLQlpZiAoY29uZmlnTGlzdC0+c2hvd0RhdGEgPT0gYikKLQkJcmV0dXJuOwotCWNvbmZpZ0xpc3QtPnNob3dEYXRhID0gYjsKLQljb25maWdMaXN0LT5yZWluaXQoKTsKLQltZW51TGlzdC0+c2hvd0RhdGEgPSBiOwotCW1lbnVMaXN0LT5yZWluaXQoKTsKLX0KLQogLyoKICAqIGFzayBmb3Igc2F2aW5nIGNvbmZpZ3VyYXRpb24gYmVmb3JlIHF1aXR0aW5nCiAgKiBUT0RPIGFzayBvbmx5IHdoZW4gc29tZXRoaW5nIGNoYW5nZWQKQEAgLTEzMjQsMTcgKzE2MzIsMTAgQEAKIAogdm9pZCBDb25maWdNYWluV2luZG93OjpzYXZlU2V0dGluZ3Modm9pZCkKIHsKLSNpZiBRVF9WRVJTSU9OID49IDMwMAotCUNvbmZpZ1NldHRpbmdzICpjb25maWdTZXR0aW5ncyA9IG5ldyBDb25maWdTZXR0aW5nczsKLQljb25maWdTZXR0aW5ncy0+d3JpdGVFbnRyeSgiL2tjb25maWcvcWNvbmYvd2luZG93IHgiLCBwb3MoKS54KCkpOwotCWNvbmZpZ1NldHRpbmdzLT53cml0ZUVudHJ5KCIva2NvbmZpZy9xY29uZi93aW5kb3cgeSIsIHBvcygpLnkoKSk7Ci0JY29uZmlnU2V0dGluZ3MtPndyaXRlRW50cnkoIi9rY29uZmlnL3Fjb25mL3dpbmRvdyB3aWR0aCIsIHNpemUoKS53aWR0aCgpKTsKLQljb25maWdTZXR0aW5ncy0+d3JpdGVFbnRyeSgiL2tjb25maWcvcWNvbmYvd2luZG93IGhlaWdodCIsIHNpemUoKS5oZWlnaHQoKSk7Ci0JY29uZmlnU2V0dGluZ3MtPndyaXRlRW50cnkoIi9rY29uZmlnL3Fjb25mL3Nob3dOYW1lIiwgY29uZmlnTGlzdC0+c2hvd05hbWUpOwotCWNvbmZpZ1NldHRpbmdzLT53cml0ZUVudHJ5KCIva2NvbmZpZy9xY29uZi9zaG93UmFuZ2UiLCBjb25maWdMaXN0LT5zaG93UmFuZ2UpOwotCWNvbmZpZ1NldHRpbmdzLT53cml0ZUVudHJ5KCIva2NvbmZpZy9xY29uZi9zaG93RGF0YSIsIGNvbmZpZ0xpc3QtPnNob3dEYXRhKTsKLQljb25maWdTZXR0aW5ncy0+d3JpdGVFbnRyeSgiL2tjb25maWcvcWNvbmYvc2hvd0FsbCIsIGNvbmZpZ0xpc3QtPnNob3dBbGwpOwotCWNvbmZpZ1NldHRpbmdzLT53cml0ZUVudHJ5KCIva2NvbmZpZy9xY29uZi9zaG93RGVidWciLCBzaG93RGVidWcpOworCWNvbmZpZ1NldHRpbmdzLT53cml0ZUVudHJ5KCIvd2luZG93IHgiLCBwb3MoKS54KCkpOworCWNvbmZpZ1NldHRpbmdzLT53cml0ZUVudHJ5KCIvd2luZG93IHkiLCBwb3MoKS55KCkpOworCWNvbmZpZ1NldHRpbmdzLT53cml0ZUVudHJ5KCIvd2luZG93IHdpZHRoIiwgc2l6ZSgpLndpZHRoKCkpOworCWNvbmZpZ1NldHRpbmdzLT53cml0ZUVudHJ5KCIvd2luZG93IGhlaWdodCIsIHNpemUoKS5oZWlnaHQoKSk7CiAKIAlRU3RyaW5nIGVudHJ5OwogCXN3aXRjaChjb25maWdMaXN0LT5tb2RlKSB7CkBAIC0xMzUwLDEzICsxNjUxLDEwIEBACiAJCWVudHJ5ID0gImZ1bGwiOwogCQlicmVhazsKIAl9Ci0JY29uZmlnU2V0dGluZ3MtPndyaXRlRW50cnkoIi9rY29uZmlnL3Fjb25mL2xpc3RNb2RlIiwgZW50cnkpOworCWNvbmZpZ1NldHRpbmdzLT53cml0ZUVudHJ5KCIvbGlzdE1vZGUiLCBlbnRyeSk7CiAKLQljb25maWdTZXR0aW5ncy0+d3JpdGVTaXplcygiL2tjb25maWcvcWNvbmYvc3BsaXQxIiwgc3BsaXQxLT5zaXplcygpKTsKLQljb25maWdTZXR0aW5ncy0+d3JpdGVTaXplcygiL2tjb25maWcvcWNvbmYvc3BsaXQyIiwgc3BsaXQyLT5zaXplcygpKTsKLQotCWRlbGV0ZSBjb25maWdTZXR0aW5nczsKLSNlbmRpZgorCWNvbmZpZ1NldHRpbmdzLT53cml0ZVNpemVzKCIvc3BsaXQxIiwgc3BsaXQxLT5zaXplcygpKTsKKwljb25maWdTZXR0aW5ncy0+d3JpdGVTaXplcygiL3NwbGl0MiIsIHNwbGl0Mi0+c2l6ZXMoKSk7CiB9CiAKIHZvaWQgZml4dXBfcm9vdG1lbnUoc3RydWN0IG1lbnUgKm1lbnUpCkBAIC0xNDE0LDEzICsxNzEyLDE5IEBACiAJY29uZl9yZWFkKE5VTEwpOwogCS8vemNvbmZkdW1wKHN0ZG91dCk7CiAKKwljb25maWdTZXR0aW5ncyA9IG5ldyBDb25maWdTZXR0aW5ncygpOworCWNvbmZpZ1NldHRpbmdzLT5iZWdpbkdyb3VwKCIva2NvbmZpZy9xY29uZiIpOwogCXYgPSBuZXcgQ29uZmlnTWFpbldpbmRvdygpOwogCiAJLy96Y29uZmR1bXAoc3Rkb3V0KTsKLQl2LT5zaG93KCk7CisJY29uZmlnQXBwLT5zZXRNYWluV2lkZ2V0KHYpOwogCWNvbmZpZ0FwcC0+Y29ubmVjdChjb25maWdBcHAsIFNJR05BTChsYXN0V2luZG93Q2xvc2VkKCkpLCBTTE9UKHF1aXQoKSkpOwogCWNvbmZpZ0FwcC0+Y29ubmVjdChjb25maWdBcHAsIFNJR05BTChhYm91dFRvUXVpdCgpKSwgdiwgU0xPVChzYXZlU2V0dGluZ3MoKSkpOworCXYtPnNob3coKTsKIAljb25maWdBcHAtPmV4ZWMoKTsKIAorCWNvbmZpZ1NldHRpbmdzLT5lbmRHcm91cCgpOworCWRlbGV0ZSBjb25maWdTZXR0aW5nczsKKwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL3Fjb25mLmggYi9zY3JpcHRzL2tjb25maWcvcWNvbmYuaAppbmRleCBlNTJmM2U5Li42YTllM2IxIDEwMDY0NAotLS0gYS9zY3JpcHRzL2tjb25maWcvcWNvbmYuaAorKysgYi9zY3JpcHRzL2tjb25maWcvcWNvbmYuaApAQCAtNyw5ICs3LDI1IEBACiAjaWYgUVRfVkVSU0lPTiA+PSAzMDAKICNpbmNsdWRlIDxxc2V0dGluZ3MuaD4KICNlbHNlCi1jbGFzcyBRU2V0dGluZ3MgeyB9OworY2xhc3MgUVNldHRpbmdzIHsKK3B1YmxpYzoKKwl2b2lkIGJlZ2luR3JvdXAoY29uc3QgUVN0cmluZyYgZ3JvdXApIHsgfQorCXZvaWQgZW5kR3JvdXAodm9pZCkgeyB9CisJYm9vbCByZWFkQm9vbEVudHJ5KGNvbnN0IFFTdHJpbmcmIGtleSwgYm9vbCBkZWYgPSBGQUxTRSwgYm9vbCogb2sgPSAwKSBjb25zdAorCXsgaWYgKG9rKSAqb2sgPSBGQUxTRTsgcmV0dXJuIGRlZjsgfQorCWludCByZWFkTnVtRW50cnkoY29uc3QgUVN0cmluZyYga2V5LCBpbnQgZGVmID0gMCwgYm9vbCogb2sgPSAwKSBjb25zdAorCXsgaWYgKG9rKSAqb2sgPSBGQUxTRTsgcmV0dXJuIGRlZjsgfQorCVFTdHJpbmcgcmVhZEVudHJ5KGNvbnN0IFFTdHJpbmcmIGtleSwgY29uc3QgUVN0cmluZyYgZGVmID0gUVN0cmluZzo6bnVsbCwgYm9vbCogb2sgPSAwKSBjb25zdAorCXsgaWYgKG9rKSAqb2sgPSBGQUxTRTsgcmV0dXJuIGRlZjsgfQorCVFTdHJpbmdMaXN0IHJlYWRMaXN0RW50cnkoY29uc3QgUVN0cmluZyYga2V5LCBib29sKiBvayA9IDApIGNvbnN0CisJeyBpZiAob2spICpvayA9IEZBTFNFOyByZXR1cm4gUVN0cmluZ0xpc3QoKTsgfQorCXRlbXBsYXRlIDxjbGFzcyB0PgorCWJvb2wgd3JpdGVFbnRyeShjb25zdCBRU3RyaW5nJiBrZXksIHQgdmFsdWUpCisJeyByZXR1cm4gVFJVRTsgfQorfTsKICNlbmRpZgogCitjbGFzcyBDb25maWdWaWV3OwogY2xhc3MgQ29uZmlnTGlzdDsKIGNsYXNzIENvbmZpZ0l0ZW07CiBjbGFzcyBDb25maWdMaW5lRWRpdDsKQEAgLTE4LDY0ICszNCwzOCBAQAogCiBjbGFzcyBDb25maWdTZXR0aW5ncyA6IHB1YmxpYyBRU2V0dGluZ3MgewogcHVibGljOgotCUNvbmZpZ1NldHRpbmdzKCk7Ci0KLSNpZiBRVF9WRVJTSU9OID49IDMwMAotCXZvaWQgcmVhZExpc3RTZXR0aW5ncygpOwogCVFWYWx1ZUxpc3Q8aW50PiByZWFkU2l6ZXMoY29uc3QgUVN0cmluZyYga2V5LCBib29sICpvayk7CiAJYm9vbCB3cml0ZVNpemVzKGNvbnN0IFFTdHJpbmcmIGtleSwgY29uc3QgUVZhbHVlTGlzdDxpbnQ+JiB2YWx1ZSk7Ci0jZW5kaWYKLQotCWJvb2wgc2hvd0FsbDsKLQlib29sIHNob3dOYW1lOwotCWJvb2wgc2hvd1JhbmdlOwotCWJvb2wgc2hvd0RhdGE7Ci19OwotCi1jbGFzcyBDb25maWdWaWV3IDogcHVibGljIFFWQm94IHsKLQlRX09CSkVDVAotCXR5cGVkZWYgY2xhc3MgUVZCb3ggUGFyZW50OwotcHVibGljOgotCUNvbmZpZ1ZpZXcoUVdpZGdldCogcGFyZW50LCBDb25maWdNYWluV2luZG93KiBjdmlldywgQ29uZmlnU2V0dGluZ3MqIGNvbmZpZ1NldHRpbmdzKTsKLQl+Q29uZmlnVmlldyh2b2lkKTsKLQlzdGF0aWMgdm9pZCB1cGRhdGVMaXN0KENvbmZpZ0l0ZW0qIGl0ZW0pOwotCXN0YXRpYyB2b2lkIHVwZGF0ZUxpc3RBbGwodm9pZCk7Ci0KLXB1YmxpYzoKLQlDb25maWdMaXN0KiBsaXN0OwotCUNvbmZpZ0xpbmVFZGl0KiBsaW5lRWRpdDsKLQotCXN0YXRpYyBDb25maWdWaWV3KiB2aWV3TGlzdDsKLQlDb25maWdWaWV3KiBuZXh0VmlldzsKIH07CiAKIGVudW0gY29sSWR4IHsKIAlwcm9tcHRDb2xJZHgsIG5hbWVDb2xJZHgsIG5vQ29sSWR4LCBtb2RDb2xJZHgsIHllc0NvbElkeCwgZGF0YUNvbElkeCwgY29sTnIKIH07CiBlbnVtIGxpc3RNb2RlIHsKLQlzaW5nbGVNb2RlLCBtZW51TW9kZSwgc3ltYm9sTW9kZSwgZnVsbE1vZGUKKwlzaW5nbGVNb2RlLCBtZW51TW9kZSwgc3ltYm9sTW9kZSwgZnVsbE1vZGUsIGxpc3RNb2RlCiB9OwogCiBjbGFzcyBDb25maWdMaXN0IDogcHVibGljIFFMaXN0VmlldyB7CiAJUV9PQkpFQ1QKIAl0eXBlZGVmIGNsYXNzIFFMaXN0VmlldyBQYXJlbnQ7CiBwdWJsaWM6Ci0JQ29uZmlnTGlzdChDb25maWdWaWV3KiBwLCBDb25maWdNYWluV2luZG93KiBjdmlldywgQ29uZmlnU2V0dGluZ3MgKmNvbmZpZ1NldHRpbmdzKTsKKwlDb25maWdMaXN0KENvbmZpZ1ZpZXcqIHAsIGNvbnN0IGNoYXIgKm5hbWUgPSAwKTsKIAl2b2lkIHJlaW5pdCh2b2lkKTsKIAlDb25maWdWaWV3KiBwYXJlbnQodm9pZCkgY29uc3QKIAl7CiAJCXJldHVybiAoQ29uZmlnVmlldyopUGFyZW50OjpwYXJlbnQoKTsKIAl9CisJQ29uZmlnSXRlbSogZmluZENvbmZpZ0l0ZW0oc3RydWN0IG1lbnUgKik7CiAKIHByb3RlY3RlZDoKLQlDb25maWdNYWluV2luZG93KiBjdmlldzsKLQogCXZvaWQga2V5UHJlc3NFdmVudChRS2V5RXZlbnQgKmUpOwogCXZvaWQgY29udGVudHNNb3VzZVByZXNzRXZlbnQoUU1vdXNlRXZlbnQgKmUpOwogCXZvaWQgY29udGVudHNNb3VzZVJlbGVhc2VFdmVudChRTW91c2VFdmVudCAqZSk7CiAJdm9pZCBjb250ZW50c01vdXNlTW92ZUV2ZW50KFFNb3VzZUV2ZW50ICplKTsKIAl2b2lkIGNvbnRlbnRzTW91c2VEb3VibGVDbGlja0V2ZW50KFFNb3VzZUV2ZW50ICplKTsKIAl2b2lkIGZvY3VzSW5FdmVudChRRm9jdXNFdmVudCAqZSk7CisJdm9pZCBjb250ZXh0TWVudUV2ZW50KFFDb250ZXh0TWVudUV2ZW50ICplKTsKKwogcHVibGljIHNsb3RzOgogCXZvaWQgc2V0Um9vdE1lbnUoc3RydWN0IG1lbnUgKm1lbnUpOwogCkBAIC04MywxMCArNzMsMTIgQEAKIAl2b2lkIHNldFZhbHVlKENvbmZpZ0l0ZW0qIGl0ZW0sIHRyaXN0YXRlIHZhbCk7CiAJdm9pZCBjaGFuZ2VWYWx1ZShDb25maWdJdGVtKiBpdGVtKTsKIAl2b2lkIHVwZGF0ZVNlbGVjdGlvbih2b2lkKTsKKwl2b2lkIHNhdmVTZXR0aW5ncyh2b2lkKTsKIHNpZ25hbHM6CisJdm9pZCBtZW51Q2hhbmdlZChzdHJ1Y3QgbWVudSAqbWVudSk7CiAJdm9pZCBtZW51U2VsZWN0ZWQoc3RydWN0IG1lbnUgKm1lbnUpOwogCXZvaWQgcGFyZW50U2VsZWN0ZWQodm9pZCk7Ci0Jdm9pZCBnb3RGb2N1cyh2b2lkKTsKKwl2b2lkIGdvdEZvY3VzKHN0cnVjdCBtZW51ICopOwogCiBwdWJsaWM6CiAJdm9pZCB1cGRhdGVMaXN0QWxsKHZvaWQpCkBAIC0xMzcsNiArMTI5LDcgQEAKIAlzdHJ1Y3QgbWVudSAqcm9vdEVudHJ5OwogCVFDb2xvckdyb3VwIGRpc2FibGVkQ29sb3JHcm91cDsKIAlRQ29sb3JHcm91cCBpbmFjdGl2ZWRDb2xvckdyb3VwOworCVFQb3B1cE1lbnUqIGhlYWRlclBvcHVwOwogCiBwcml2YXRlOgogCWludCBjb2xNYXBbY29sTnJdOwpAQCAtMjA4LDkgKzIwMSw3IEBACiAJUV9PQkpFQ1QKIAl0eXBlZGVmIGNsYXNzIFFMaW5lRWRpdCBQYXJlbnQ7CiBwdWJsaWM6Ci0JQ29uZmlnTGluZUVkaXQoQ29uZmlnVmlldyogcGFyZW50KQotCTogUGFyZW50KHBhcmVudCkKLQl7IH0KKwlDb25maWdMaW5lRWRpdChDb25maWdWaWV3KiBwYXJlbnQpOwogCUNvbmZpZ1ZpZXcqIHBhcmVudCh2b2lkKSBjb25zdAogCXsKIAkJcmV0dXJuIChDb25maWdWaWV3KilQYXJlbnQ6OnBhcmVudCgpOwpAQCAtMjIyLDI2ICsyMTMsMTA0IEBACiAJQ29uZmlnSXRlbSAqaXRlbTsKIH07CiAKK2NsYXNzIENvbmZpZ1ZpZXcgOiBwdWJsaWMgUVZCb3ggeworCVFfT0JKRUNUCisJdHlwZWRlZiBjbGFzcyBRVkJveCBQYXJlbnQ7CitwdWJsaWM6CisJQ29uZmlnVmlldyhRV2lkZ2V0KiBwYXJlbnQsIGNvbnN0IGNoYXIgKm5hbWUgPSAwKTsKKwl+Q29uZmlnVmlldyh2b2lkKTsKKwlzdGF0aWMgdm9pZCB1cGRhdGVMaXN0KENvbmZpZ0l0ZW0qIGl0ZW0pOworCXN0YXRpYyB2b2lkIHVwZGF0ZUxpc3RBbGwodm9pZCk7CisKKwlib29sIHNob3dBbGwodm9pZCkgY29uc3QgeyByZXR1cm4gbGlzdC0+c2hvd0FsbDsgfQorCWJvb2wgc2hvd05hbWUodm9pZCkgY29uc3QgeyByZXR1cm4gbGlzdC0+c2hvd05hbWU7IH0KKwlib29sIHNob3dSYW5nZSh2b2lkKSBjb25zdCB7IHJldHVybiBsaXN0LT5zaG93UmFuZ2U7IH0KKwlib29sIHNob3dEYXRhKHZvaWQpIGNvbnN0IHsgcmV0dXJuIGxpc3QtPnNob3dEYXRhOyB9CitwdWJsaWMgc2xvdHM6CisJdm9pZCBzZXRTaG93QWxsKGJvb2wpOworCXZvaWQgc2V0U2hvd05hbWUoYm9vbCk7CisJdm9pZCBzZXRTaG93UmFuZ2UoYm9vbCk7CisJdm9pZCBzZXRTaG93RGF0YShib29sKTsKK3NpZ25hbHM6CisJdm9pZCBzaG93QWxsQ2hhbmdlZChib29sKTsKKwl2b2lkIHNob3dOYW1lQ2hhbmdlZChib29sKTsKKwl2b2lkIHNob3dSYW5nZUNoYW5nZWQoYm9vbCk7CisJdm9pZCBzaG93RGF0YUNoYW5nZWQoYm9vbCk7CitwdWJsaWM6CisJQ29uZmlnTGlzdCogbGlzdDsKKwlDb25maWdMaW5lRWRpdCogbGluZUVkaXQ7CisKKwlzdGF0aWMgQ29uZmlnVmlldyogdmlld0xpc3Q7CisJQ29uZmlnVmlldyogbmV4dFZpZXc7Cit9OworCitjbGFzcyBDb25maWdJbmZvVmlldyA6IHB1YmxpYyBRVGV4dEJyb3dzZXIgeworCVFfT0JKRUNUCisJdHlwZWRlZiBjbGFzcyBRVGV4dEJyb3dzZXIgUGFyZW50OworcHVibGljOgorCUNvbmZpZ0luZm9WaWV3KFFXaWRnZXQqIHBhcmVudCwgY29uc3QgY2hhciAqbmFtZSA9IDApOworCWJvb2wgc2hvd0RlYnVnKHZvaWQpIGNvbnN0IHsgcmV0dXJuIF9zaG93RGVidWc7IH0KKworcHVibGljIHNsb3RzOgorCXZvaWQgc2V0SW5mbyhzdHJ1Y3QgbWVudSAqbWVudSk7CisJdm9pZCBzYXZlU2V0dGluZ3Modm9pZCk7CisJdm9pZCBzZXRTb3VyY2UoY29uc3QgUVN0cmluZyYgbmFtZSk7CisJdm9pZCBzZXRTaG93RGVidWcoYm9vbCk7CisKK3NpZ25hbHM6CisJdm9pZCBzaG93RGVidWdDaGFuZ2VkKGJvb2wpOworCXZvaWQgbWVudVNlbGVjdGVkKHN0cnVjdCBtZW51ICopOworCitwcm90ZWN0ZWQ6CisJdm9pZCBzeW1ib2xJbmZvKHZvaWQpOworCXZvaWQgbWVudUluZm8odm9pZCk7CisJUVN0cmluZyBkZWJ1Z19pbmZvKHN0cnVjdCBzeW1ib2wgKnN5bSk7CisJc3RhdGljIFFTdHJpbmcgcHJpbnRfZmlsdGVyKGNvbnN0IFFTdHJpbmcgJnN0cik7CisJc3RhdGljIHZvaWQgZXhwcl9wcmludF9oZWxwKHZvaWQgKmRhdGEsIHN0cnVjdCBzeW1ib2wgKnN5bSwgY29uc3QgY2hhciAqc3RyKTsKKwlRUG9wdXBNZW51KiBjcmVhdGVQb3B1cE1lbnUoY29uc3QgUVBvaW50JiBwb3MpOworCXZvaWQgY29udGVudHNDb250ZXh0TWVudUV2ZW50KFFDb250ZXh0TWVudUV2ZW50ICplKTsKKworCXN0cnVjdCBzeW1ib2wgKnN5bTsKKwlzdHJ1Y3QgbWVudSAqbWVudTsKKwlib29sIF9zaG93RGVidWc7Cit9OworCitjbGFzcyBDb25maWdTZWFyY2hXaW5kb3cgOiBwdWJsaWMgUURpYWxvZyB7CisJUV9PQkpFQ1QKKwl0eXBlZGVmIGNsYXNzIFFEaWFsb2cgUGFyZW50OworcHVibGljOgorCUNvbmZpZ1NlYXJjaFdpbmRvdyhRV2lkZ2V0KiBwYXJlbnQsIGNvbnN0IGNoYXIgKm5hbWUgPSAwKTsKKworcHVibGljIHNsb3RzOgorCXZvaWQgc2F2ZVNldHRpbmdzKHZvaWQpOworCXZvaWQgc2VhcmNoKHZvaWQpOworCitwcm90ZWN0ZWQ6CisJUUxpbmVFZGl0KiBlZGl0RmllbGQ7CisJUVB1c2hCdXR0b24qIHNlYXJjaEJ1dHRvbjsKKwlRU3BsaXR0ZXIqIHNwbGl0OworCUNvbmZpZ1ZpZXcqIGxpc3Q7CisJQ29uZmlnSW5mb1ZpZXcqIGluZm87CisKKwlzdHJ1Y3Qgc3ltYm9sICoqcmVzdWx0OworfTsKKwogY2xhc3MgQ29uZmlnTWFpbldpbmRvdyA6IHB1YmxpYyBRTWFpbldpbmRvdyB7CiAJUV9PQkpFQ1QKIHB1YmxpYzoKIAlDb25maWdNYWluV2luZG93KHZvaWQpOwogcHVibGljIHNsb3RzOgotCXZvaWQgc2V0SGVscChRTGlzdFZpZXdJdGVtKiBpdGVtKTsKIAl2b2lkIGNoYW5nZU1lbnUoc3RydWN0IG1lbnUgKik7CisJdm9pZCBzZXRNZW51TGluayhzdHJ1Y3QgbWVudSAqKTsKIAl2b2lkIGxpc3RGb2N1c0NoYW5nZWQodm9pZCk7CiAJdm9pZCBnb0JhY2sodm9pZCk7CiAJdm9pZCBsb2FkQ29uZmlnKHZvaWQpOwogCXZvaWQgc2F2ZUNvbmZpZyh2b2lkKTsKIAl2b2lkIHNhdmVDb25maWdBcyh2b2lkKTsKKwl2b2lkIHNlYXJjaENvbmZpZyh2b2lkKTsKIAl2b2lkIHNob3dTaW5nbGVWaWV3KHZvaWQpOwogCXZvaWQgc2hvd1NwbGl0Vmlldyh2b2lkKTsKIAl2b2lkIHNob3dGdWxsVmlldyh2b2lkKTsKLQl2b2lkIHNldFNob3dBbGwoYm9vbCk7Ci0Jdm9pZCBzZXRTaG93RGVidWcoYm9vbCk7Ci0Jdm9pZCBzZXRTaG93UmFuZ2UoYm9vbCk7Ci0Jdm9pZCBzZXRTaG93TmFtZShib29sKTsKLQl2b2lkIHNldFNob3dEYXRhKGJvb2wpOwogCXZvaWQgc2hvd0ludHJvKHZvaWQpOwogCXZvaWQgc2hvd0Fib3V0KHZvaWQpOwogCXZvaWQgc2F2ZVNldHRpbmdzKHZvaWQpOwpAQCAtMjQ5LDE1ICszMTgsMTQgQEAKIHByb3RlY3RlZDoKIAl2b2lkIGNsb3NlRXZlbnQoUUNsb3NlRXZlbnQgKmUpOwogCisJQ29uZmlnU2VhcmNoV2luZG93ICpzZWFyY2hXaW5kb3c7CiAJQ29uZmlnVmlldyAqbWVudVZpZXc7CiAJQ29uZmlnTGlzdCAqbWVudUxpc3Q7CiAJQ29uZmlnVmlldyAqY29uZmlnVmlldzsKIAlDb25maWdMaXN0ICpjb25maWdMaXN0OwotCVFUZXh0VmlldyAqaGVscFRleHQ7CisJQ29uZmlnSW5mb1ZpZXcgKmhlbHBUZXh0OwogCVFUb29sQmFyICp0b29sQmFyOwogCVFBY3Rpb24gKmJhY2tBY3Rpb247CiAJUVNwbGl0dGVyKiBzcGxpdDE7CiAJUVNwbGl0dGVyKiBzcGxpdDI7Ci0KLQlib29sIHNob3dEZWJ1ZzsKIH07CmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvc3ltYm9sLmMgYi9zY3JpcHRzL2tjb25maWcvc3ltYm9sLmMKaW5kZXggM2Q3ODc3YS4uZWUyMjVjZSAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL3N5bWJvbC5jCisrKyBiL3NjcmlwdHMva2NvbmZpZy9zeW1ib2wuYwpAQCAtMTUsMTUgKzE1LDE1IEBACiBzdHJ1Y3Qgc3ltYm9sIHN5bWJvbF95ZXMgPSB7CiAJLm5hbWUgPSAieSIsCiAJLmN1cnIgPSB7ICJ5IiwgeWVzIH0sCi0JLmZsYWdzID0gU1lNQk9MX1lFU3xTWU1CT0xfVkFMSUQsCisJLmZsYWdzID0gU1lNQk9MX0NPTlNUfFNZTUJPTF9WQUxJRCwKIH0sIHN5bWJvbF9tb2QgPSB7CiAJLm5hbWUgPSAibSIsCiAJLmN1cnIgPSB7ICJtIiwgbW9kIH0sCi0JLmZsYWdzID0gU1lNQk9MX01PRHxTWU1CT0xfVkFMSUQsCisJLmZsYWdzID0gU1lNQk9MX0NPTlNUfFNZTUJPTF9WQUxJRCwKIH0sIHN5bWJvbF9ubyA9IHsKIAkubmFtZSA9ICJuIiwKIAkuY3VyciA9IHsgIm4iLCBubyB9LAotCS5mbGFncyA9IFNZTUJPTF9OT3xTWU1CT0xfVkFMSUQsCisJLmZsYWdzID0gU1lNQk9MX0NPTlNUfFNZTUJPTF9WQUxJRCwKIH0sIHN5bWJvbF9lbXB0eSA9IHsKIAkubmFtZSA9ICIiLAogCS5jdXJyID0geyAiIiwgbm8gfSwKQEAgLTMxLDYgKzMxLDcgQEAKIH07CiAKIGludCBzeW1fY2hhbmdlX2NvdW50Oworc3RydWN0IHN5bWJvbCAqc3ltX2RlZmNvbmZpZ19saXN0Owogc3RydWN0IHN5bWJvbCAqbW9kdWxlc19zeW07CiB0cmlzdGF0ZSBtb2R1bGVzX3ZhbDsKIApAQCAtMjI3LDcgKzIyOCw3IEBACiAJc3RydWN0IGV4cHIgKmU7CiAKIAkvKiBpcyB0aGUgdXNlciBjaG9pY2UgdmlzaWJsZT8gKi8KLQlkZWZfc3ltID0gc3ltLT51c2VyLnZhbDsKKwlkZWZfc3ltID0gc3ltLT5kZWZbU19ERUZfVVNFUl0udmFsOwogCWlmIChkZWZfc3ltKSB7CiAJCXN5bV9jYWxjX3Zpc2liaWxpdHkoZGVmX3N5bSk7CiAJCWlmIChkZWZfc3ltLT52aXNpYmxlICE9IG5vKQpAQCAtMzA2LDcgKzMwNyw3IEBACiAJCX0gZWxzZSBpZiAoRV9PUihzeW0tPnZpc2libGUsIHN5bS0+cmV2X2RlcC50cmkpICE9IG5vKSB7CiAJCQlzeW0tPmZsYWdzIHw9IFNZTUJPTF9XUklURTsKIAkJCWlmIChzeW1faGFzX3ZhbHVlKHN5bSkpCi0JCQkJbmV3dmFsLnRyaSA9IHN5bS0+dXNlci50cmk7CisJCQkJbmV3dmFsLnRyaSA9IHN5bS0+ZGVmW1NfREVGX1VTRVJdLnRyaTsKIAkJCWVsc2UgaWYgKCFzeW1faXNfY2hvaWNlKHN5bSkpIHsKIAkJCQlwcm9wID0gc3ltX2dldF9kZWZhdWx0X3Byb3Aoc3ltKTsKIAkJCQlpZiAocHJvcCkKQEAgLTMyOSw3ICszMzAsNyBAQAogCQlpZiAoc3ltLT52aXNpYmxlICE9IG5vKSB7CiAJCQlzeW0tPmZsYWdzIHw9IFNZTUJPTF9XUklURTsKIAkJCWlmIChzeW1faGFzX3ZhbHVlKHN5bSkpIHsKLQkJCQluZXd2YWwudmFsID0gc3ltLT51c2VyLnZhbDsKKwkJCQluZXd2YWwudmFsID0gc3ltLT5kZWZbU19ERUZfVVNFUl0udmFsOwogCQkJCWJyZWFrOwogCQkJfQogCQl9CkBAIC0zNTIsMTAgKzM1MywxMyBAQAogCQlzeW0tPmN1cnIudmFsID0gc3ltX2NhbGNfY2hvaWNlKHN5bSk7CiAJc3ltX3ZhbGlkYXRlX3JhbmdlKHN5bSk7CiAKLQlpZiAobWVtY21wKCZvbGR2YWwsICZzeW0tPmN1cnIsIHNpemVvZihvbGR2YWwpKSkKKwlpZiAobWVtY21wKCZvbGR2YWwsICZzeW0tPmN1cnIsIHNpemVvZihvbGR2YWwpKSkgewogCQlzeW1fc2V0X2NoYW5nZWQoc3ltKTsKLQlpZiAobW9kdWxlc19zeW0gPT0gc3ltKQotCQltb2R1bGVzX3ZhbCA9IG1vZHVsZXNfc3ltLT5jdXJyLnRyaTsKKwkJaWYgKG1vZHVsZXNfc3ltID09IHN5bSkgeworCQkJc3ltX3NldF9hbGxfY2hhbmdlZCgpOworCQkJbW9kdWxlc192YWwgPSBtb2R1bGVzX3N5bS0+Y3Vyci50cmk7CisJCX0KKwl9CiAKIAlpZiAoc3ltX2lzX2Nob2ljZShzeW0pKSB7CiAJCWludCBmbGFncyA9IHN5bS0+ZmxhZ3MgJiAoU1lNQk9MX0NIQU5HRUQgfCBTWU1CT0xfV1JJVEUpOwpAQCAtNDI2LDggKzQzMCw4IEBACiAJaWYgKG9sZHZhbCAhPSB2YWwgJiYgIXN5bV90cmlzdGF0ZV93aXRoaW5fcmFuZ2Uoc3ltLCB2YWwpKQogCQlyZXR1cm4gZmFsc2U7CiAKLQlpZiAoc3ltLT5mbGFncyAmIFNZTUJPTF9ORVcpIHsKLQkJc3ltLT5mbGFncyAmPSB+U1lNQk9MX05FVzsKKwlpZiAoIShzeW0tPmZsYWdzICYgU1lNQk9MX0RFRl9VU0VSKSkgeworCQlzeW0tPmZsYWdzIHw9IFNZTUJPTF9ERUZfVVNFUjsKIAkJc3ltX3NldF9jaGFuZ2VkKHN5bSk7CiAJfQogCS8qCkBAIC00MzksMjEgKzQ0MywxOCBAQAogCQlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CiAJCXN0cnVjdCBleHByICplOwogCi0JCWNzLT51c2VyLnZhbCA9IHN5bTsKLQkJY3MtPmZsYWdzICY9IH5TWU1CT0xfTkVXOworCQljcy0+ZGVmW1NfREVGX1VTRVJdLnZhbCA9IHN5bTsKKwkJY3MtPmZsYWdzIHw9IFNZTUJPTF9ERUZfVVNFUjsKIAkJcHJvcCA9IHN5bV9nZXRfY2hvaWNlX3Byb3AoY3MpOwogCQlmb3IgKGUgPSBwcm9wLT5leHByOyBlOyBlID0gZS0+bGVmdC5leHByKSB7CiAJCQlpZiAoZS0+cmlnaHQuc3ltLT52aXNpYmxlICE9IG5vKQotCQkJCWUtPnJpZ2h0LnN5bS0+ZmxhZ3MgJj0gflNZTUJPTF9ORVc7CisJCQkJZS0+cmlnaHQuc3ltLT5mbGFncyB8PSBTWU1CT0xfREVGX1VTRVI7CiAJCX0KIAl9CiAKLQlzeW0tPnVzZXIudHJpID0gdmFsOwotCWlmIChvbGR2YWwgIT0gdmFsKSB7CisJc3ltLT5kZWZbU19ERUZfVVNFUl0udHJpID0gdmFsOworCWlmIChvbGR2YWwgIT0gdmFsKQogCQlzeW1fY2xlYXJfYWxsX3ZhbGlkKCk7Ci0JCWlmIChzeW0gPT0gbW9kdWxlc19zeW0pCi0JCQlzeW1fc2V0X2FsbF9jaGFuZ2VkKCk7Ci0JfQogCiAJcmV0dXJuIHRydWU7CiB9CkBAIC01OTEsMjAgKzU5MiwyMCBAQAogCWlmICghc3ltX3N0cmluZ193aXRoaW5fcmFuZ2Uoc3ltLCBuZXd2YWwpKQogCQlyZXR1cm4gZmFsc2U7CiAKLQlpZiAoc3ltLT5mbGFncyAmIFNZTUJPTF9ORVcpIHsKLQkJc3ltLT5mbGFncyAmPSB+U1lNQk9MX05FVzsKKwlpZiAoIShzeW0tPmZsYWdzICYgU1lNQk9MX0RFRl9VU0VSKSkgeworCQlzeW0tPmZsYWdzIHw9IFNZTUJPTF9ERUZfVVNFUjsKIAkJc3ltX3NldF9jaGFuZ2VkKHN5bSk7CiAJfQogCi0Jb2xkdmFsID0gc3ltLT51c2VyLnZhbDsKKwlvbGR2YWwgPSBzeW0tPmRlZltTX0RFRl9VU0VSXS52YWw7CiAJc2l6ZSA9IHN0cmxlbihuZXd2YWwpICsgMTsKIAlpZiAoc3ltLT50eXBlID09IFNfSEVYICYmIChuZXd2YWxbMF0gIT0gJzAnIHx8IChuZXd2YWxbMV0gIT0gJ3gnICYmIG5ld3ZhbFsxXSAhPSAnWCcpKSkgewogCQlzaXplICs9IDI7Ci0JCXN5bS0+dXNlci52YWwgPSB2YWwgPSBtYWxsb2Moc2l6ZSk7CisJCXN5bS0+ZGVmW1NfREVGX1VTRVJdLnZhbCA9IHZhbCA9IG1hbGxvYyhzaXplKTsKIAkJKnZhbCsrID0gJzAnOwogCQkqdmFsKysgPSAneCc7CiAJfSBlbHNlIGlmICghb2xkdmFsIHx8IHN0cmNtcChvbGR2YWwsIG5ld3ZhbCkpCi0JCXN5bS0+dXNlci52YWwgPSB2YWwgPSBtYWxsb2Moc2l6ZSk7CisJCXN5bS0+ZGVmW1NfREVGX1VTRVJdLnZhbCA9IHZhbCA9IG1hbGxvYyhzaXplKTsKIAllbHNlCiAJCXJldHVybiB0cnVlOwogCkBAIC02NzksNyArNjgwLDYgQEAKIAltZW1zZXQoc3ltYm9sLCAwLCBzaXplb2YoKnN5bWJvbCkpOwogCXN5bWJvbC0+bmFtZSA9IG5ld19uYW1lOwogCXN5bWJvbC0+dHlwZSA9IFNfVU5LTk9XTjsKLQlzeW1ib2wtPmZsYWdzID0gU1lNQk9MX05FVzsKIAlpZiAoaXNjb25zdCkKIAkJc3ltYm9sLT5mbGFncyB8PSBTWU1CT0xfQ09OU1Q7CiAKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy91dGlsLmMgYi9zY3JpcHRzL2tjb25maWcvdXRpbC5jCmluZGV4IDY1NmQyYzguLmUzZjI4YjkgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy91dGlsLmMKKysrIGIvc2NyaXB0cy9rY29uZmlnL3V0aWwuYwpAQCAtNDQsNyArNDQsOSBAQAogCQllbHNlCiAJCQlmcHJpbnRmKG91dCwgIlx0JXNcbiIsIGZpbGUtPm5hbWUpOwogCX0KLQlmcHJpbnRmKG91dCwgIlxuLmNvbmZpZyBpbmNsdWRlL2xpbnV4L2F1dG9jb25mLmg6ICQoZGVwc19jb25maWcpXG5cbiQoZGVwc19jb25maWcpOlxuIik7CisJZnByaW50ZihvdXQsICJcbmluY2x1ZGUvY29uZmlnL2F1dG8uY29uZjogXFxcbiIKKwkJICAgICAiXHQkKGRlcHNfY29uZmlnKVxuXG4iCisJCSAgICAgIiQoZGVwc19jb25maWcpOiA7XG4iKTsKIAlmY2xvc2Uob3V0KTsKIAlyZW5hbWUoIi4uY29uZmlnLnRtcCIsIG5hbWUpOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL3pjb25mLmdwZXJmIGIvc2NyaXB0cy9rY29uZmlnL3pjb25mLmdwZXJmCmluZGV4IGIwMzIyMDYuLjliNDRjODAgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy96Y29uZi5ncGVyZgorKysgYi9zY3JpcHRzL2tjb25maWcvemNvbmYuZ3BlcmYKQEAgLTM5LDUgKzM5LDggQEAKIHNlbGVjdCwJCVRfU0VMRUNULAlURl9DT01NQU5ECiBlbmFibGUsCQlUX1NFTEVDVCwJVEZfQ09NTUFORAogcmFuZ2UsCQlUX1JBTkdFLAlURl9DT01NQU5ECitvcHRpb24sCQlUX09QVElPTiwJVEZfQ09NTUFORAogb24sCQlUX09OLAkJVEZfUEFSQU0KK21vZHVsZXMsCVRfT1BUX01PRFVMRVMsCVRGX09QVElPTgorZGVmY29uZmlnX2xpc3QsCVRfT1BUX0RFRkNPTkZJR19MSVNULFRGX09QVElPTgogJSUKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy96Y29uZi5oYXNoLmNfc2hpcHBlZCBiL3NjcmlwdHMva2NvbmZpZy96Y29uZi5oYXNoLmNfc2hpcHBlZAppbmRleCAzNDVmMGZjLi40N2M4YjViIDEwMDY0NAotLS0gYS9zY3JpcHRzL2tjb25maWcvemNvbmYuaGFzaC5jX3NoaXBwZWQKKysrIGIvc2NyaXB0cy9rY29uZmlnL3pjb25mLmhhc2guY19zaGlwcGVkCkBAIC01MywxMCArNTMsMTAgQEAKICAgICAgIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LAogICAgICAgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsCiAgICAgICA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywKLSAgICAgIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCAyNSwgMTAsIDE1LAotICAgICAgIDAsICAwLCAgNSwgNDcsICAwLCAgMCwgNDcsIDQ3LCAgMCwgMTAsCi0gICAgICAgMCwgMjAsIDIwLCAyMCwgIDUsICAwLCAgMCwgMjAsIDQ3LCA0NywKLSAgICAgIDIwLCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LAorICAgICAgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDI1LCAzMCwgMTUsCisgICAgICAgMCwgMTUsICAwLCA0NywgIDUsIDE1LCA0NywgNDcsIDMwLCAyMCwKKyAgICAgICA1LCAgMCwgMjUsIDE1LCAgMCwgIDAsIDEwLCAzNSwgNDcsIDQ3LAorICAgICAgIDUsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsCiAgICAgICA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywKICAgICAgIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LAogICAgICAgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsCkBAIC04OCw2OSArODgsNzUgQEAKIAogc3RydWN0IGtjb25mX2lkX3N0cmluZ3NfdAogICB7Ci0gICAgY2hhciBrY29uZl9pZF9zdHJpbmdzX3N0cjJbc2l6ZW9mKCJpZiIpXTsKLSAgICBjaGFyIGtjb25mX2lkX3N0cmluZ3Nfc3RyM1tzaXplb2YoImludCIpXTsKLSAgICBjaGFyIGtjb25mX2lkX3N0cmluZ3Nfc3RyNFtzaXplb2YoImhlbHAiKV07Ci0gICAgY2hhciBrY29uZl9pZF9zdHJpbmdzX3N0cjVbc2l6ZW9mKCJlbmRpZiIpXTsKLSAgICBjaGFyIGtjb25mX2lkX3N0cmluZ3Nfc3RyNltzaXplb2YoInNlbGVjdCIpXTsKLSAgICBjaGFyIGtjb25mX2lkX3N0cmluZ3Nfc3RyN1tzaXplb2YoImVuZG1lbnUiKV07Ci0gICAgY2hhciBrY29uZl9pZF9zdHJpbmdzX3N0cjhbc2l6ZW9mKCJ0cmlzdGF0ZSIpXTsKLSAgICBjaGFyIGtjb25mX2lkX3N0cmluZ3Nfc3RyOVtzaXplb2YoImVuZGNob2ljZSIpXTsKKyAgICBjaGFyIGtjb25mX2lkX3N0cmluZ3Nfc3RyMltzaXplb2YoIm9uIildOworICAgIGNoYXIga2NvbmZfaWRfc3RyaW5nc19zdHI2W3NpemVvZigic3RyaW5nIildOworICAgIGNoYXIga2NvbmZfaWRfc3RyaW5nc19zdHI3W3NpemVvZigiZGVmYXVsdCIpXTsKKyAgICBjaGFyIGtjb25mX2lkX3N0cmluZ3Nfc3RyOFtzaXplb2YoImRlZl9ib29sIildOwogICAgIGNoYXIga2NvbmZfaWRfc3RyaW5nc19zdHIxMFtzaXplb2YoInJhbmdlIildOwotICAgIGNoYXIga2NvbmZfaWRfc3RyaW5nc19zdHIxMVtzaXplb2YoInN0cmluZyIpXTsKLSAgICBjaGFyIGtjb25mX2lkX3N0cmluZ3Nfc3RyMTJbc2l6ZW9mKCJkZWZhdWx0IildOwotICAgIGNoYXIga2NvbmZfaWRfc3RyaW5nc19zdHIxM1tzaXplb2YoImRlZl9ib29sIildOwotICAgIGNoYXIga2NvbmZfaWRfc3RyaW5nc19zdHIxNFtzaXplb2YoIm1lbnUiKV07Ci0gICAgY2hhciBrY29uZl9pZF9zdHJpbmdzX3N0cjE2W3NpemVvZigiZGVmX2Jvb2xlYW4iKV07Ci0gICAgY2hhciBrY29uZl9pZF9zdHJpbmdzX3N0cjE3W3NpemVvZigiZGVmX3RyaXN0YXRlIildOwotICAgIGNoYXIga2NvbmZfaWRfc3RyaW5nc19zdHIxOFtzaXplb2YoIm1haW5tZW51IildOwotICAgIGNoYXIga2NvbmZfaWRfc3RyaW5nc19zdHIyMFtzaXplb2YoIm1lbnVjb25maWciKV07Ci0gICAgY2hhciBrY29uZl9pZF9zdHJpbmdzX3N0cjIxW3NpemVvZigiY29uZmlnIildOwotICAgIGNoYXIga2NvbmZfaWRfc3RyaW5nc19zdHIyMltzaXplb2YoIm9uIildOwotICAgIGNoYXIga2NvbmZfaWRfc3RyaW5nc19zdHIyM1tzaXplb2YoImhleCIpXTsKLSAgICBjaGFyIGtjb25mX2lkX3N0cmluZ3Nfc3RyMjZbc2l6ZW9mKCJzb3VyY2UiKV07Ci0gICAgY2hhciBrY29uZl9pZF9zdHJpbmdzX3N0cjI3W3NpemVvZigiZGVwZW5kcyIpXTsKLSAgICBjaGFyIGtjb25mX2lkX3N0cmluZ3Nfc3RyMjhbc2l6ZW9mKCJvcHRpb25hbCIpXTsKLSAgICBjaGFyIGtjb25mX2lkX3N0cmluZ3Nfc3RyMzFbc2l6ZW9mKCJlbmFibGUiKV07Ci0gICAgY2hhciBrY29uZl9pZF9zdHJpbmdzX3N0cjMyW3NpemVvZigiY29tbWVudCIpXTsKLSAgICBjaGFyIGtjb25mX2lkX3N0cmluZ3Nfc3RyMzNbc2l6ZW9mKCJyZXF1aXJlcyIpXTsKKyAgICBjaGFyIGtjb25mX2lkX3N0cmluZ3Nfc3RyMTFbc2l6ZW9mKCJkZWZfYm9vbGVhbiIpXTsKKyAgICBjaGFyIGtjb25mX2lkX3N0cmluZ3Nfc3RyMTJbc2l6ZW9mKCJkZWZfdHJpc3RhdGUiKV07CisgICAgY2hhciBrY29uZl9pZF9zdHJpbmdzX3N0cjEzW3NpemVvZigiaGV4IildOworICAgIGNoYXIga2NvbmZfaWRfc3RyaW5nc19zdHIxNFtzaXplb2YoImRlZmNvbmZpZ19saXN0IildOworICAgIGNoYXIga2NvbmZfaWRfc3RyaW5nc19zdHIxNltzaXplb2YoIm9wdGlvbiIpXTsKKyAgICBjaGFyIGtjb25mX2lkX3N0cmluZ3Nfc3RyMTdbc2l6ZW9mKCJpZiIpXTsKKyAgICBjaGFyIGtjb25mX2lkX3N0cmluZ3Nfc3RyMThbc2l6ZW9mKCJvcHRpb25hbCIpXTsKKyAgICBjaGFyIGtjb25mX2lkX3N0cmluZ3Nfc3RyMjBbc2l6ZW9mKCJlbmRpZiIpXTsKKyAgICBjaGFyIGtjb25mX2lkX3N0cmluZ3Nfc3RyMjFbc2l6ZW9mKCJjaG9pY2UiKV07CisgICAgY2hhciBrY29uZl9pZF9zdHJpbmdzX3N0cjIyW3NpemVvZigiZW5kbWVudSIpXTsKKyAgICBjaGFyIGtjb25mX2lkX3N0cmluZ3Nfc3RyMjNbc2l6ZW9mKCJyZXF1aXJlcyIpXTsKKyAgICBjaGFyIGtjb25mX2lkX3N0cmluZ3Nfc3RyMjRbc2l6ZW9mKCJlbmRjaG9pY2UiKV07CisgICAgY2hhciBrY29uZl9pZF9zdHJpbmdzX3N0cjI2W3NpemVvZigiY29uZmlnIildOworICAgIGNoYXIga2NvbmZfaWRfc3RyaW5nc19zdHIyN1tzaXplb2YoIm1vZHVsZXMiKV07CisgICAgY2hhciBrY29uZl9pZF9zdHJpbmdzX3N0cjI4W3NpemVvZigiaW50IildOworICAgIGNoYXIga2NvbmZfaWRfc3RyaW5nc19zdHIyOVtzaXplb2YoIm1lbnUiKV07CisgICAgY2hhciBrY29uZl9pZF9zdHJpbmdzX3N0cjMxW3NpemVvZigicHJvbXB0IildOworICAgIGNoYXIga2NvbmZfaWRfc3RyaW5nc19zdHIzMltzaXplb2YoImRlcGVuZHMiKV07CisgICAgY2hhciBrY29uZl9pZF9zdHJpbmdzX3N0cjMzW3NpemVvZigidHJpc3RhdGUiKV07CiAgICAgY2hhciBrY29uZl9pZF9zdHJpbmdzX3N0cjM0W3NpemVvZigiYm9vbCIpXTsKKyAgICBjaGFyIGtjb25mX2lkX3N0cmluZ3Nfc3RyMzVbc2l6ZW9mKCJtZW51Y29uZmlnIildOworICAgIGNoYXIga2NvbmZfaWRfc3RyaW5nc19zdHIzNltzaXplb2YoInNlbGVjdCIpXTsKICAgICBjaGFyIGtjb25mX2lkX3N0cmluZ3Nfc3RyMzdbc2l6ZW9mKCJib29sZWFuIildOwotICAgIGNoYXIga2NvbmZfaWRfc3RyaW5nc19zdHI0MVtzaXplb2YoImNob2ljZSIpXTsKLSAgICBjaGFyIGtjb25mX2lkX3N0cmluZ3Nfc3RyNDZbc2l6ZW9mKCJwcm9tcHQiKV07CisgICAgY2hhciBrY29uZl9pZF9zdHJpbmdzX3N0cjM5W3NpemVvZigiaGVscCIpXTsKKyAgICBjaGFyIGtjb25mX2lkX3N0cmluZ3Nfc3RyNDFbc2l6ZW9mKCJzb3VyY2UiKV07CisgICAgY2hhciBrY29uZl9pZF9zdHJpbmdzX3N0cjQyW3NpemVvZigiY29tbWVudCIpXTsKKyAgICBjaGFyIGtjb25mX2lkX3N0cmluZ3Nfc3RyNDNbc2l6ZW9mKCJtYWlubWVudSIpXTsKKyAgICBjaGFyIGtjb25mX2lkX3N0cmluZ3Nfc3RyNDZbc2l6ZW9mKCJlbmFibGUiKV07CiAgIH07CiBzdGF0aWMgc3RydWN0IGtjb25mX2lkX3N0cmluZ3NfdCBrY29uZl9pZF9zdHJpbmdzX2NvbnRlbnRzID0KICAgewotICAgICJpZiIsCi0gICAgImludCIsCi0gICAgImhlbHAiLAotICAgICJlbmRpZiIsCi0gICAgInNlbGVjdCIsCi0gICAgImVuZG1lbnUiLAotICAgICJ0cmlzdGF0ZSIsCi0gICAgImVuZGNob2ljZSIsCi0gICAgInJhbmdlIiwKKyAgICAib24iLAogICAgICJzdHJpbmciLAogICAgICJkZWZhdWx0IiwKICAgICAiZGVmX2Jvb2wiLAotICAgICJtZW51IiwKKyAgICAicmFuZ2UiLAogICAgICJkZWZfYm9vbGVhbiIsCiAgICAgImRlZl90cmlzdGF0ZSIsCi0gICAgIm1haW5tZW51IiwKLSAgICAibWVudWNvbmZpZyIsCi0gICAgImNvbmZpZyIsCi0gICAgIm9uIiwKICAgICAiaGV4IiwKLSAgICAic291cmNlIiwKLSAgICAiZGVwZW5kcyIsCisgICAgImRlZmNvbmZpZ19saXN0IiwKKyAgICAib3B0aW9uIiwKKyAgICAiaWYiLAogICAgICJvcHRpb25hbCIsCi0gICAgImVuYWJsZSIsCi0gICAgImNvbW1lbnQiLAotICAgICJyZXF1aXJlcyIsCi0gICAgImJvb2wiLAotICAgICJib29sZWFuIiwKKyAgICAiZW5kaWYiLAogICAgICJjaG9pY2UiLAotICAgICJwcm9tcHQiCisgICAgImVuZG1lbnUiLAorICAgICJyZXF1aXJlcyIsCisgICAgImVuZGNob2ljZSIsCisgICAgImNvbmZpZyIsCisgICAgIm1vZHVsZXMiLAorICAgICJpbnQiLAorICAgICJtZW51IiwKKyAgICAicHJvbXB0IiwKKyAgICAiZGVwZW5kcyIsCisgICAgInRyaXN0YXRlIiwKKyAgICAiYm9vbCIsCisgICAgIm1lbnVjb25maWciLAorICAgICJzZWxlY3QiLAorICAgICJib29sZWFuIiwKKyAgICAiaGVscCIsCisgICAgInNvdXJjZSIsCisgICAgImNvbW1lbnQiLAorICAgICJtYWlubWVudSIsCisgICAgImVuYWJsZSIKICAgfTsKICNkZWZpbmUga2NvbmZfaWRfc3RyaW5ncyAoKGNvbnN0IGNoYXIgKikgJmtjb25mX2lkX3N0cmluZ3NfY29udGVudHMpCiAjaWZkZWYgX19HTlVDX18KQEAgLTE2MSw5ICsxNjcsOSBAQAogewogICBlbnVtCiAgICAgewotICAgICAgVE9UQUxfS0VZV09SRFMgPSAzMCwKKyAgICAgIFRPVEFMX0tFWVdPUkRTID0gMzMsCiAgICAgICBNSU5fV09SRF9MRU5HVEggPSAyLAotICAgICAgTUFYX1dPUkRfTEVOR1RIID0gMTIsCisgICAgICBNQVhfV09SRF9MRU5HVEggPSAxNCwKICAgICAgIE1JTl9IQVNIX1ZBTFVFID0gMiwKICAgICAgIE1BWF9IQVNIX1ZBTFVFID0gNDYKICAgICB9OwpAQCAtMTcxLDQzICsxNzcsNDggQEAKICAgc3RhdGljIHN0cnVjdCBrY29uZl9pZCB3b3JkbGlzdFtdID0KICAgICB7CiAgICAgICB7LTF9LCB7LTF9LAotICAgICAgeyhpbnQpKGxvbmcpJigoc3RydWN0IGtjb25mX2lkX3N0cmluZ3NfdCAqKTApLT5rY29uZl9pZF9zdHJpbmdzX3N0cjIsCQlUX0lGLAkJVEZfQ09NTUFORHxURl9QQVJBTX0sCi0gICAgICB7KGludCkobG9uZykmKChzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190ICopMCktPmtjb25mX2lkX3N0cmluZ3Nfc3RyMywJCVRfVFlQRSwJCVRGX0NPTU1BTkQsIFNfSU5UfSwKLSAgICAgIHsoaW50KShsb25nKSYoKHN0cnVjdCBrY29uZl9pZF9zdHJpbmdzX3QgKikwKS0+a2NvbmZfaWRfc3RyaW5nc19zdHI0LAkJVF9IRUxQLAkJVEZfQ09NTUFORH0sCi0gICAgICB7KGludCkobG9uZykmKChzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190ICopMCktPmtjb25mX2lkX3N0cmluZ3Nfc3RyNSwJCVRfRU5ESUYsCVRGX0NPTU1BTkR9LAotICAgICAgeyhpbnQpKGxvbmcpJigoc3RydWN0IGtjb25mX2lkX3N0cmluZ3NfdCAqKTApLT5rY29uZl9pZF9zdHJpbmdzX3N0cjYsCQlUX1NFTEVDVCwJVEZfQ09NTUFORH0sCi0gICAgICB7KGludCkobG9uZykmKChzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190ICopMCktPmtjb25mX2lkX3N0cmluZ3Nfc3RyNywJVF9FTkRNRU5VLAlURl9DT01NQU5EfSwKLSAgICAgIHsoaW50KShsb25nKSYoKHN0cnVjdCBrY29uZl9pZF9zdHJpbmdzX3QgKikwKS0+a2NvbmZfaWRfc3RyaW5nc19zdHI4LAlUX1RZUEUsCQlURl9DT01NQU5ELCBTX1RSSVNUQVRFfSwKLSAgICAgIHsoaW50KShsb25nKSYoKHN0cnVjdCBrY29uZl9pZF9zdHJpbmdzX3QgKikwKS0+a2NvbmZfaWRfc3RyaW5nc19zdHI5LAlUX0VORENIT0lDRSwJVEZfQ09NTUFORH0sCi0gICAgICB7KGludCkobG9uZykmKChzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190ICopMCktPmtjb25mX2lkX3N0cmluZ3Nfc3RyMTAsCQlUX1JBTkdFLAlURl9DT01NQU5EfSwKLSAgICAgIHsoaW50KShsb25nKSYoKHN0cnVjdCBrY29uZl9pZF9zdHJpbmdzX3QgKikwKS0+a2NvbmZfaWRfc3RyaW5nc19zdHIxMSwJCVRfVFlQRSwJCVRGX0NPTU1BTkQsIFNfU1RSSU5HfSwKLSAgICAgIHsoaW50KShsb25nKSYoKHN0cnVjdCBrY29uZl9pZF9zdHJpbmdzX3QgKikwKS0+a2NvbmZfaWRfc3RyaW5nc19zdHIxMiwJVF9ERUZBVUxULAlURl9DT01NQU5ELCBTX1VOS05PV059LAotICAgICAgeyhpbnQpKGxvbmcpJigoc3RydWN0IGtjb25mX2lkX3N0cmluZ3NfdCAqKTApLT5rY29uZl9pZF9zdHJpbmdzX3N0cjEzLAlUX0RFRkFVTFQsCVRGX0NPTU1BTkQsIFNfQk9PTEVBTn0sCi0gICAgICB7KGludCkobG9uZykmKChzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190ICopMCktPmtjb25mX2lkX3N0cmluZ3Nfc3RyMTQsCQlUX01FTlUsCQlURl9DT01NQU5EfSwKLSAgICAgIHstMX0sCi0gICAgICB7KGludCkobG9uZykmKChzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190ICopMCktPmtjb25mX2lkX3N0cmluZ3Nfc3RyMTYsCVRfREVGQVVMVCwJVEZfQ09NTUFORCwgU19CT09MRUFOfSwKLSAgICAgIHsoaW50KShsb25nKSYoKHN0cnVjdCBrY29uZl9pZF9zdHJpbmdzX3QgKikwKS0+a2NvbmZfaWRfc3RyaW5nc19zdHIxNywJVF9ERUZBVUxULAlURl9DT01NQU5ELCBTX1RSSVNUQVRFfSwKLSAgICAgIHsoaW50KShsb25nKSYoKHN0cnVjdCBrY29uZl9pZF9zdHJpbmdzX3QgKikwKS0+a2NvbmZfaWRfc3RyaW5nc19zdHIxOCwJVF9NQUlOTUVOVSwJVEZfQ09NTUFORH0sCi0gICAgICB7LTF9LAotICAgICAgeyhpbnQpKGxvbmcpJigoc3RydWN0IGtjb25mX2lkX3N0cmluZ3NfdCAqKTApLT5rY29uZl9pZF9zdHJpbmdzX3N0cjIwLAlUX01FTlVDT05GSUcsCVRGX0NPTU1BTkR9LAotICAgICAgeyhpbnQpKGxvbmcpJigoc3RydWN0IGtjb25mX2lkX3N0cmluZ3NfdCAqKTApLT5rY29uZl9pZF9zdHJpbmdzX3N0cjIxLAkJVF9DT05GSUcsCVRGX0NPTU1BTkR9LAotICAgICAgeyhpbnQpKGxvbmcpJigoc3RydWN0IGtjb25mX2lkX3N0cmluZ3NfdCAqKTApLT5rY29uZl9pZF9zdHJpbmdzX3N0cjIyLAkJVF9PTiwJCVRGX1BBUkFNfSwKLSAgICAgIHsoaW50KShsb25nKSYoKHN0cnVjdCBrY29uZl9pZF9zdHJpbmdzX3QgKikwKS0+a2NvbmZfaWRfc3RyaW5nc19zdHIyMywJCVRfVFlQRSwJCVRGX0NPTU1BTkQsIFNfSEVYfSwKLSAgICAgIHstMX0sIHstMX0sCi0gICAgICB7KGludCkobG9uZykmKChzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190ICopMCktPmtjb25mX2lkX3N0cmluZ3Nfc3RyMjYsCQlUX1NPVVJDRSwJVEZfQ09NTUFORH0sCi0gICAgICB7KGludCkobG9uZykmKChzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190ICopMCktPmtjb25mX2lkX3N0cmluZ3Nfc3RyMjcsCVRfREVQRU5EUywJVEZfQ09NTUFORH0sCi0gICAgICB7KGludCkobG9uZykmKChzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190ICopMCktPmtjb25mX2lkX3N0cmluZ3Nfc3RyMjgsCVRfT1BUSU9OQUwsCVRGX0NPTU1BTkR9LAotICAgICAgey0xfSwgey0xfSwKLSAgICAgIHsoaW50KShsb25nKSYoKHN0cnVjdCBrY29uZl9pZF9zdHJpbmdzX3QgKikwKS0+a2NvbmZfaWRfc3RyaW5nc19zdHIzMSwJCVRfU0VMRUNULAlURl9DT01NQU5EfSwKLSAgICAgIHsoaW50KShsb25nKSYoKHN0cnVjdCBrY29uZl9pZF9zdHJpbmdzX3QgKikwKS0+a2NvbmZfaWRfc3RyaW5nc19zdHIzMiwJVF9DT01NRU5ULAlURl9DT01NQU5EfSwKLSAgICAgIHsoaW50KShsb25nKSYoKHN0cnVjdCBrY29uZl9pZF9zdHJpbmdzX3QgKikwKS0+a2NvbmZfaWRfc3RyaW5nc19zdHIzMywJVF9SRVFVSVJFUywJVEZfQ09NTUFORH0sCi0gICAgICB7KGludCkobG9uZykmKChzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190ICopMCktPmtjb25mX2lkX3N0cmluZ3Nfc3RyMzQsCQlUX1RZUEUsCQlURl9DT01NQU5ELCBTX0JPT0xFQU59LAotICAgICAgey0xfSwgey0xfSwKLSAgICAgIHsoaW50KShsb25nKSYoKHN0cnVjdCBrY29uZl9pZF9zdHJpbmdzX3QgKikwKS0+a2NvbmZfaWRfc3RyaW5nc19zdHIzNywJVF9UWVBFLAkJVEZfQ09NTUFORCwgU19CT09MRUFOfSwKKyAgICAgIHsoaW50KShsb25nKSYoKHN0cnVjdCBrY29uZl9pZF9zdHJpbmdzX3QgKikwKS0+a2NvbmZfaWRfc3RyaW5nc19zdHIyLAkJVF9PTiwJCVRGX1BBUkFNfSwKICAgICAgIHstMX0sIHstMX0sIHstMX0sCi0gICAgICB7KGludCkobG9uZykmKChzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190ICopMCktPmtjb25mX2lkX3N0cmluZ3Nfc3RyNDEsCQlUX0NIT0lDRSwJVEZfQ09NTUFORH0sCi0gICAgICB7LTF9LCB7LTF9LCB7LTF9LCB7LTF9LAotICAgICAgeyhpbnQpKGxvbmcpJigoc3RydWN0IGtjb25mX2lkX3N0cmluZ3NfdCAqKTApLT5rY29uZl9pZF9zdHJpbmdzX3N0cjQ2LAkJVF9QUk9NUFQsCVRGX0NPTU1BTkR9CisgICAgICB7KGludCkobG9uZykmKChzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190ICopMCktPmtjb25mX2lkX3N0cmluZ3Nfc3RyNiwJCVRfVFlQRSwJCVRGX0NPTU1BTkQsIFNfU1RSSU5HfSwKKyAgICAgIHsoaW50KShsb25nKSYoKHN0cnVjdCBrY29uZl9pZF9zdHJpbmdzX3QgKikwKS0+a2NvbmZfaWRfc3RyaW5nc19zdHI3LAlUX0RFRkFVTFQsCVRGX0NPTU1BTkQsIFNfVU5LTk9XTn0sCisgICAgICB7KGludCkobG9uZykmKChzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190ICopMCktPmtjb25mX2lkX3N0cmluZ3Nfc3RyOCwJVF9ERUZBVUxULAlURl9DT01NQU5ELCBTX0JPT0xFQU59LAorICAgICAgey0xfSwKKyAgICAgIHsoaW50KShsb25nKSYoKHN0cnVjdCBrY29uZl9pZF9zdHJpbmdzX3QgKikwKS0+a2NvbmZfaWRfc3RyaW5nc19zdHIxMCwJCVRfUkFOR0UsCVRGX0NPTU1BTkR9LAorICAgICAgeyhpbnQpKGxvbmcpJigoc3RydWN0IGtjb25mX2lkX3N0cmluZ3NfdCAqKTApLT5rY29uZl9pZF9zdHJpbmdzX3N0cjExLAlUX0RFRkFVTFQsCVRGX0NPTU1BTkQsIFNfQk9PTEVBTn0sCisgICAgICB7KGludCkobG9uZykmKChzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190ICopMCktPmtjb25mX2lkX3N0cmluZ3Nfc3RyMTIsCVRfREVGQVVMVCwJVEZfQ09NTUFORCwgU19UUklTVEFURX0sCisgICAgICB7KGludCkobG9uZykmKChzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190ICopMCktPmtjb25mX2lkX3N0cmluZ3Nfc3RyMTMsCQlUX1RZUEUsCQlURl9DT01NQU5ELCBTX0hFWH0sCisgICAgICB7KGludCkobG9uZykmKChzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190ICopMCktPmtjb25mX2lkX3N0cmluZ3Nfc3RyMTQsCVRfT1BUX0RFRkNPTkZJR19MSVNULFRGX09QVElPTn0sCisgICAgICB7LTF9LAorICAgICAgeyhpbnQpKGxvbmcpJigoc3RydWN0IGtjb25mX2lkX3N0cmluZ3NfdCAqKTApLT5rY29uZl9pZF9zdHJpbmdzX3N0cjE2LAkJVF9PUFRJT04sCVRGX0NPTU1BTkR9LAorICAgICAgeyhpbnQpKGxvbmcpJigoc3RydWN0IGtjb25mX2lkX3N0cmluZ3NfdCAqKTApLT5rY29uZl9pZF9zdHJpbmdzX3N0cjE3LAkJVF9JRiwJCVRGX0NPTU1BTkR8VEZfUEFSQU19LAorICAgICAgeyhpbnQpKGxvbmcpJigoc3RydWN0IGtjb25mX2lkX3N0cmluZ3NfdCAqKTApLT5rY29uZl9pZF9zdHJpbmdzX3N0cjE4LAlUX09QVElPTkFMLAlURl9DT01NQU5EfSwKKyAgICAgIHstMX0sCisgICAgICB7KGludCkobG9uZykmKChzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190ICopMCktPmtjb25mX2lkX3N0cmluZ3Nfc3RyMjAsCQlUX0VORElGLAlURl9DT01NQU5EfSwKKyAgICAgIHsoaW50KShsb25nKSYoKHN0cnVjdCBrY29uZl9pZF9zdHJpbmdzX3QgKikwKS0+a2NvbmZfaWRfc3RyaW5nc19zdHIyMSwJCVRfQ0hPSUNFLAlURl9DT01NQU5EfSwKKyAgICAgIHsoaW50KShsb25nKSYoKHN0cnVjdCBrY29uZl9pZF9zdHJpbmdzX3QgKikwKS0+a2NvbmZfaWRfc3RyaW5nc19zdHIyMiwJVF9FTkRNRU5VLAlURl9DT01NQU5EfSwKKyAgICAgIHsoaW50KShsb25nKSYoKHN0cnVjdCBrY29uZl9pZF9zdHJpbmdzX3QgKikwKS0+a2NvbmZfaWRfc3RyaW5nc19zdHIyMywJVF9SRVFVSVJFUywJVEZfQ09NTUFORH0sCisgICAgICB7KGludCkobG9uZykmKChzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190ICopMCktPmtjb25mX2lkX3N0cmluZ3Nfc3RyMjQsCVRfRU5EQ0hPSUNFLAlURl9DT01NQU5EfSwKKyAgICAgIHstMX0sCisgICAgICB7KGludCkobG9uZykmKChzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190ICopMCktPmtjb25mX2lkX3N0cmluZ3Nfc3RyMjYsCQlUX0NPTkZJRywJVEZfQ09NTUFORH0sCisgICAgICB7KGludCkobG9uZykmKChzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190ICopMCktPmtjb25mX2lkX3N0cmluZ3Nfc3RyMjcsCVRfT1BUX01PRFVMRVMsCVRGX09QVElPTn0sCisgICAgICB7KGludCkobG9uZykmKChzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190ICopMCktPmtjb25mX2lkX3N0cmluZ3Nfc3RyMjgsCQlUX1RZUEUsCQlURl9DT01NQU5ELCBTX0lOVH0sCisgICAgICB7KGludCkobG9uZykmKChzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190ICopMCktPmtjb25mX2lkX3N0cmluZ3Nfc3RyMjksCQlUX01FTlUsCQlURl9DT01NQU5EfSwKKyAgICAgIHstMX0sCisgICAgICB7KGludCkobG9uZykmKChzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190ICopMCktPmtjb25mX2lkX3N0cmluZ3Nfc3RyMzEsCQlUX1BST01QVCwJVEZfQ09NTUFORH0sCisgICAgICB7KGludCkobG9uZykmKChzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190ICopMCktPmtjb25mX2lkX3N0cmluZ3Nfc3RyMzIsCVRfREVQRU5EUywJVEZfQ09NTUFORH0sCisgICAgICB7KGludCkobG9uZykmKChzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190ICopMCktPmtjb25mX2lkX3N0cmluZ3Nfc3RyMzMsCVRfVFlQRSwJCVRGX0NPTU1BTkQsIFNfVFJJU1RBVEV9LAorICAgICAgeyhpbnQpKGxvbmcpJigoc3RydWN0IGtjb25mX2lkX3N0cmluZ3NfdCAqKTApLT5rY29uZl9pZF9zdHJpbmdzX3N0cjM0LAkJVF9UWVBFLAkJVEZfQ09NTUFORCwgU19CT09MRUFOfSwKKyAgICAgIHsoaW50KShsb25nKSYoKHN0cnVjdCBrY29uZl9pZF9zdHJpbmdzX3QgKikwKS0+a2NvbmZfaWRfc3RyaW5nc19zdHIzNSwJVF9NRU5VQ09ORklHLAlURl9DT01NQU5EfSwKKyAgICAgIHsoaW50KShsb25nKSYoKHN0cnVjdCBrY29uZl9pZF9zdHJpbmdzX3QgKikwKS0+a2NvbmZfaWRfc3RyaW5nc19zdHIzNiwJCVRfU0VMRUNULAlURl9DT01NQU5EfSwKKyAgICAgIHsoaW50KShsb25nKSYoKHN0cnVjdCBrY29uZl9pZF9zdHJpbmdzX3QgKikwKS0+a2NvbmZfaWRfc3RyaW5nc19zdHIzNywJVF9UWVBFLAkJVEZfQ09NTUFORCwgU19CT09MRUFOfSwKKyAgICAgIHstMX0sCisgICAgICB7KGludCkobG9uZykmKChzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190ICopMCktPmtjb25mX2lkX3N0cmluZ3Nfc3RyMzksCQlUX0hFTFAsCQlURl9DT01NQU5EfSwKKyAgICAgIHstMX0sCisgICAgICB7KGludCkobG9uZykmKChzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190ICopMCktPmtjb25mX2lkX3N0cmluZ3Nfc3RyNDEsCQlUX1NPVVJDRSwJVEZfQ09NTUFORH0sCisgICAgICB7KGludCkobG9uZykmKChzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190ICopMCktPmtjb25mX2lkX3N0cmluZ3Nfc3RyNDIsCVRfQ09NTUVOVCwJVEZfQ09NTUFORH0sCisgICAgICB7KGludCkobG9uZykmKChzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190ICopMCktPmtjb25mX2lkX3N0cmluZ3Nfc3RyNDMsCVRfTUFJTk1FTlUsCVRGX0NPTU1BTkR9LAorICAgICAgey0xfSwgey0xfSwKKyAgICAgIHsoaW50KShsb25nKSYoKHN0cnVjdCBrY29uZl9pZF9zdHJpbmdzX3QgKikwKS0+a2NvbmZfaWRfc3RyaW5nc19zdHI0NiwJCVRfU0VMRUNULAlURl9DT01NQU5EfQogICAgIH07CiAKICAgaWYgKGxlbiA8PSBNQVhfV09SRF9MRU5HVEggJiYgbGVuID49IE1JTl9XT1JEX0xFTkdUSCkKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy96Y29uZi50YWIuY19zaGlwcGVkIGIvc2NyaXB0cy9rY29uZmlnL3pjb25mLnRhYi5jX3NoaXBwZWQKaW5kZXggZWE3NzU1ZC4uMmZiMGE0ZiAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL3pjb25mLnRhYi5jX3NoaXBwZWQKKysrIGIvc2NyaXB0cy9rY29uZmlnL3pjb25mLnRhYi5jX3NoaXBwZWQKQEAgLTEsNyArMSw3IEBACi0vKiBBIEJpc29uIHBhcnNlciwgbWFkZSBieSBHTlUgQmlzb24gMi4wLiAgKi8KKy8qIEEgQmlzb24gcGFyc2VyLCBtYWRlIGJ5IEdOVSBCaXNvbiAyLjEuICAqLwogCiAvKiBTa2VsZXRvbiBwYXJzZXIgZm9yIFlhY2MtbGlrZSBwYXJzaW5nIHdpdGggQmlzb24sCi0gICBDb3B5cmlnaHQgKEMpIDE5ODQsIDE5ODksIDE5OTAsIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb3B5cmlnaHQgKEMpIDE5ODQsIDE5ODksIDE5OTAsIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCiAKICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtMTUsOCArMTUsOCBAQAogCiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLSAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKyAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgICBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4gICovCiAKIC8qIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHdoZW4gdGhpcyBmaWxlIGlzIGNvcGllZCBieSBCaXNvbiBpbnRvIGEKICAgIEJpc29uIG91dHB1dCBmaWxlLCB5b3UgbWF5IHVzZSB0aGF0IG91dHB1dCBmaWxlIHdpdGhvdXQgcmVzdHJpY3Rpb24uCkBAIC0zNiw2ICszNiw5IEBACiAvKiBJZGVudGlmeSBCaXNvbiBvdXRwdXQuICAqLwogI2RlZmluZSBZWUJJU09OIDEKIAorLyogQmlzb24gdmVyc2lvbi4gICovCisjZGVmaW5lIFlZQklTT05fVkVSU0lPTiAiMi4xIgorCiAvKiBTa2VsZXRvbiBuYW1lLiAgKi8KICNkZWZpbmUgWVlTS0VMRVRPTl9OQU1FICJ5YWNjLmMiCiAKQEAgLTgyLDE5ICs4NSwyMSBAQAogICAgICBUX0RFRkFVTFQgPSAyNzYsCiAgICAgIFRfU0VMRUNUID0gMjc3LAogICAgICBUX1JBTkdFID0gMjc4LAotICAgICBUX09OID0gMjc5LAotICAgICBUX1dPUkQgPSAyODAsCi0gICAgIFRfV09SRF9RVU9URSA9IDI4MSwKLSAgICAgVF9VTkVRVUFMID0gMjgyLAotICAgICBUX0NMT1NFX1BBUkVOID0gMjgzLAotICAgICBUX09QRU5fUEFSRU4gPSAyODQsCi0gICAgIFRfRU9MID0gMjg1LAotICAgICBUX09SID0gMjg2LAotICAgICBUX0FORCA9IDI4NywKLSAgICAgVF9FUVVBTCA9IDI4OCwKLSAgICAgVF9OT1QgPSAyODkKKyAgICAgVF9PUFRJT04gPSAyNzksCisgICAgIFRfT04gPSAyODAsCisgICAgIFRfV09SRCA9IDI4MSwKKyAgICAgVF9XT1JEX1FVT1RFID0gMjgyLAorICAgICBUX1VORVFVQUwgPSAyODMsCisgICAgIFRfQ0xPU0VfUEFSRU4gPSAyODQsCisgICAgIFRfT1BFTl9QQVJFTiA9IDI4NSwKKyAgICAgVF9FT0wgPSAyODYsCisgICAgIFRfT1IgPSAyODcsCisgICAgIFRfQU5EID0gMjg4LAorICAgICBUX0VRVUFMID0gMjg5LAorICAgICBUX05PVCA9IDI5MAogICAgfTsKICNlbmRpZgorLyogVG9rZW5zLiAgKi8KICNkZWZpbmUgVF9NQUlOTUVOVSAyNTgKICNkZWZpbmUgVF9NRU5VIDI1OQogI2RlZmluZSBUX0VORE1FTlUgMjYwCkBAIC0xMTYsMTcgKzEyMSwxOCBAQAogI2RlZmluZSBUX0RFRkFVTFQgMjc2CiAjZGVmaW5lIFRfU0VMRUNUIDI3NwogI2RlZmluZSBUX1JBTkdFIDI3OAotI2RlZmluZSBUX09OIDI3OQotI2RlZmluZSBUX1dPUkQgMjgwCi0jZGVmaW5lIFRfV09SRF9RVU9URSAyODEKLSNkZWZpbmUgVF9VTkVRVUFMIDI4MgotI2RlZmluZSBUX0NMT1NFX1BBUkVOIDI4MwotI2RlZmluZSBUX09QRU5fUEFSRU4gMjg0Ci0jZGVmaW5lIFRfRU9MIDI4NQotI2RlZmluZSBUX09SIDI4NgotI2RlZmluZSBUX0FORCAyODcKLSNkZWZpbmUgVF9FUVVBTCAyODgKLSNkZWZpbmUgVF9OT1QgMjg5CisjZGVmaW5lIFRfT1BUSU9OIDI3OQorI2RlZmluZSBUX09OIDI4MAorI2RlZmluZSBUX1dPUkQgMjgxCisjZGVmaW5lIFRfV09SRF9RVU9URSAyODIKKyNkZWZpbmUgVF9VTkVRVUFMIDI4MworI2RlZmluZSBUX0NMT1NFX1BBUkVOIDI4NAorI2RlZmluZSBUX09QRU5fUEFSRU4gMjg1CisjZGVmaW5lIFRfRU9MIDI4NgorI2RlZmluZSBUX09SIDI4NworI2RlZmluZSBUX0FORCAyODgKKyNkZWZpbmUgVF9FUVVBTCAyODkKKyNkZWZpbmUgVF9OT1QgMjkwCiAKIAogCkBAIC0xODcsNiArMTkzLDExIEBACiAjIGRlZmluZSBZWUVSUk9SX1ZFUkJPU0UgMAogI2VuZGlmCiAKKy8qIEVuYWJsaW5nIHRoZSB0b2tlbiB0YWJsZS4gICovCisjaWZuZGVmIFlZVE9LRU5fVEFCTEUKKyMgZGVmaW5lIFlZVE9LRU5fVEFCTEUgMAorI2VuZGlmCisKICNpZiAhIGRlZmluZWQgKFlZU1RZUEUpICYmICEgZGVmaW5lZCAoWVlTVFlQRV9JU19ERUNMQVJFRCkKIAogdHlwZWRlZiB1bmlvbiBZWVNUWVBFIHsKQEAgLTE5Nyw3ICsyMDgsNyBAQAogCXN0cnVjdCBtZW51ICptZW51OwogCXN0cnVjdCBrY29uZl9pZCAqaWQ7CiB9IFlZU1RZUEU7Ci0vKiBMaW5lIDE5MCBvZiB5YWNjLmMuICAqLworLyogTGluZSAxOTYgb2YgeWFjYy5jLiAgKi8KIAogIyBkZWZpbmUgeXlzdHlwZSBZWVNUWVBFIC8qIG9ic29sZXNjZW50OyB3aWxsIGJlIHdpdGhkcmF3biAqLwogIyBkZWZpbmUgWVlTVFlQRV9JU19ERUNMQVJFRCAxCkBAIC0yMDksMTggKzIyMCwzNyBAQAogLyogQ29weSB0aGUgc2Vjb25kIHBhcnQgb2YgdXNlciBkZWNsYXJhdGlvbnMuICAqLwogCiAKLS8qIExpbmUgMjEzIG9mIHlhY2MuYy4gICovCisvKiBMaW5lIDIxOSBvZiB5YWNjLmMuICAqLwogCiAKKyNpZiAhIGRlZmluZWQgKFlZU0laRV9UKSAmJiBkZWZpbmVkIChfX1NJWkVfVFlQRV9fKQorIyBkZWZpbmUgWVlTSVpFX1QgX19TSVpFX1RZUEVfXworI2VuZGlmCisjaWYgISBkZWZpbmVkIChZWVNJWkVfVCkgJiYgZGVmaW5lZCAoc2l6ZV90KQorIyBkZWZpbmUgWVlTSVpFX1Qgc2l6ZV90CisjZW5kaWYKKyNpZiAhIGRlZmluZWQgKFlZU0laRV9UKSAmJiAoZGVmaW5lZCAoX19TVERDX18pIHx8IGRlZmluZWQgKF9fY3BsdXNwbHVzKSkKKyMgaW5jbHVkZSA8c3RkZGVmLmg+IC8qIElORlJJTkdFUyBPTiBVU0VSIE5BTUUgU1BBQ0UgKi8KKyMgZGVmaW5lIFlZU0laRV9UIHNpemVfdAorI2VuZGlmCisjaWYgISBkZWZpbmVkIChZWVNJWkVfVCkKKyMgZGVmaW5lIFlZU0laRV9UIHVuc2lnbmVkIGludAorI2VuZGlmCisKKyNpZm5kZWYgWVlfCisjIGlmIFlZRU5BQkxFX05MUworIyAgaWYgRU5BQkxFX05MUworIyAgIGluY2x1ZGUgPGxpYmludGwuaD4gLyogSU5GUklOR0VTIE9OIFVTRVIgTkFNRSBTUEFDRSAqLworIyAgIGRlZmluZSBZWV8obXNnaWQpIGRnZXR0ZXh0ICgiYmlzb24tcnVudGltZSIsIG1zZ2lkKQorIyAgZW5kaWYKKyMgZW5kaWYKKyMgaWZuZGVmIFlZXworIyAgZGVmaW5lIFlZXyhtc2dpZCkgbXNnaWQKKyMgZW5kaWYKKyNlbmRpZgorCiAjaWYgISBkZWZpbmVkICh5eW92ZXJmbG93KSB8fCBZWUVSUk9SX1ZFUkJPU0UKIAotIyBpZm5kZWYgWVlGUkVFCi0jICBkZWZpbmUgWVlGUkVFIGZyZWUKLSMgZW5kaWYKLSMgaWZuZGVmIFlZTUFMTE9DCi0jICBkZWZpbmUgWVlNQUxMT0MgbWFsbG9jCi0jIGVuZGlmCi0KIC8qIFRoZSBwYXJzZXIgaW52b2tlcyBhbGxvY2Egb3IgbWFsbG9jOyBkZWZpbmUgdGhlIG5lY2Vzc2FyeSBzeW1ib2xzLiAgKi8KIAogIyBpZmRlZiBZWVNUQUNLX1VTRV9BTExPQ0EKQEAgLTIyOSw2ICsyNTksMTAgQEAKICMgICAgZGVmaW5lIFlZU1RBQ0tfQUxMT0MgX19idWlsdGluX2FsbG9jYQogIyAgIGVsc2UKICMgICAgZGVmaW5lIFlZU1RBQ0tfQUxMT0MgYWxsb2NhCisjICAgIGlmIGRlZmluZWQgKF9fU1REQ19fKSB8fCBkZWZpbmVkIChfX2NwbHVzcGx1cykKKyMgICAgIGluY2x1ZGUgPHN0ZGxpYi5oPiAvKiBJTkZSSU5HRVMgT04gVVNFUiBOQU1FIFNQQUNFICovCisjICAgICBkZWZpbmUgWVlJTkNMVURFRF9TVERMSUJfSAorIyAgICBlbmRpZgogIyAgIGVuZGlmCiAjICBlbmRpZgogIyBlbmRpZgpAQCAtMjM2LDEzICsyNzAsMzkgQEAKICMgaWZkZWYgWVlTVEFDS19BTExPQwogICAgLyogUGFjaWZ5IEdDQydzIGBlbXB0eSBpZi1ib2R5JyB3YXJuaW5nLiAqLwogIyAgZGVmaW5lIFlZU1RBQ0tfRlJFRShQdHIpIGRvIHsgLyogZW1wdHkgKi87IH0gd2hpbGUgKDApCi0jIGVsc2UKLSMgIGlmIGRlZmluZWQgKF9fU1REQ19fKSB8fCBkZWZpbmVkIChfX2NwbHVzcGx1cykKLSMgICBpbmNsdWRlIDxzdGRsaWIuaD4gLyogSU5GUklOR0VTIE9OIFVTRVIgTkFNRSBTUEFDRSAqLwotIyAgIGRlZmluZSBZWVNJWkVfVCBzaXplX3QKKyMgIGlmbmRlZiBZWVNUQUNLX0FMTE9DX01BWElNVU0KKyAgICAvKiBUaGUgT1MgbWlnaHQgZ3VhcmFudGVlIG9ubHkgb25lIGd1YXJkIHBhZ2UgYXQgdGhlIGJvdHRvbSBvZiB0aGUgc3RhY2ssCisgICAgICAgYW5kIGEgcGFnZSBzaXplIGNhbiBiZSBhcyBzbWFsbCBhcyA0MDk2IGJ5dGVzLiAgU28gd2UgY2Fubm90IHNhZmVseQorICAgICAgIGludm9rZSBhbGxvY2EgKE4pIGlmIE4gZXhjZWVkcyA0MDk2LiAgVXNlIGEgc2xpZ2h0bHkgc21hbGxlciBudW1iZXIKKyAgICAgICB0byBhbGxvdyBmb3IgYSBmZXcgY29tcGlsZXItYWxsb2NhdGVkIHRlbXBvcmFyeSBzdGFjayBzbG90cy4gICovCisjICAgZGVmaW5lIFlZU1RBQ0tfQUxMT0NfTUFYSU1VTSA0MDMyIC8qIHJlYXNvbmFibGUgY2lyY2EgMjAwNSAqLwogIyAgZW5kaWYKKyMgZWxzZQogIyAgZGVmaW5lIFlZU1RBQ0tfQUxMT0MgWVlNQUxMT0MKICMgIGRlZmluZSBZWVNUQUNLX0ZSRUUgWVlGUkVFCisjICBpZm5kZWYgWVlTVEFDS19BTExPQ19NQVhJTVVNCisjICAgZGVmaW5lIFlZU1RBQ0tfQUxMT0NfTUFYSU1VTSAoKFlZU0laRV9UKSAtMSkKKyMgIGVuZGlmCisjICBpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjICBlbmRpZgorIyAgaWZuZGVmIFlZTUFMTE9DCisjICAgZGVmaW5lIFlZTUFMTE9DIG1hbGxvYworIyAgIGlmICghIGRlZmluZWQgKG1hbGxvYykgJiYgISBkZWZpbmVkIChZWUlOQ0xVREVEX1NURExJQl9IKSBcCisJJiYgKGRlZmluZWQgKF9fU1REQ19fKSB8fCBkZWZpbmVkIChfX2NwbHVzcGx1cykpKQordm9pZCAqbWFsbG9jIChZWVNJWkVfVCk7IC8qIElORlJJTkdFUyBPTiBVU0VSIE5BTUUgU1BBQ0UgKi8KKyMgICBlbmRpZgorIyAgZW5kaWYKKyMgIGlmbmRlZiBZWUZSRUUKKyMgICBkZWZpbmUgWVlGUkVFIGZyZWUKKyMgICBpZiAoISBkZWZpbmVkIChmcmVlKSAmJiAhIGRlZmluZWQgKFlZSU5DTFVERURfU1RETElCX0gpIFwKKwkmJiAoZGVmaW5lZCAoX19TVERDX18pIHx8IGRlZmluZWQgKF9fY3BsdXNwbHVzKSkpCit2b2lkIGZyZWUgKHZvaWQgKik7IC8qIElORlJJTkdFUyBPTiBVU0VSIE5BTUUgU1BBQ0UgKi8KKyMgICBlbmRpZgorIyAgZW5kaWYKKyMgIGlmZGVmIF9fY3BsdXNwbHVzCit9CisjICBlbmRpZgogIyBlbmRpZgogI2VuZGlmIC8qICEgZGVmaW5lZCAoeXlvdmVyZmxvdykgfHwgWVlFUlJPUl9WRVJCT1NFICovCiAKQEAgLTI3Nyw3ICszMzcsNyBAQAogIyAgIGRlZmluZSBZWUNPUFkoVG8sIEZyb20sIENvdW50KQkJXAogICAgICAgZG8JCQkJCVwKIAl7CQkJCQlcCi0JICByZWdpc3RlciBZWVNJWkVfVCB5eWk7CQlcCisJICBZWVNJWkVfVCB5eWk7CQkJCVwKIAkgIGZvciAoeXlpID0gMDsgeXlpIDwgKENvdW50KTsgeXlpKyspCVwKIAkgICAgKFRvKVt5eWldID0gKEZyb20pW3l5aV07CQlcCiAJfQkJCQkJXApAQCAtMzEyLDIyICszNzIsMjIgQEAKIC8qIFlZRklOQUwgLS0gU3RhdGUgbnVtYmVyIG9mIHRoZSB0ZXJtaW5hdGlvbiBzdGF0ZS4gKi8KICNkZWZpbmUgWVlGSU5BTCAgMwogLyogWVlMQVNUIC0tIExhc3QgaW5kZXggaW4gWVlUQUJMRS4gICovCi0jZGVmaW5lIFlZTEFTVCAgIDI2NAorI2RlZmluZSBZWUxBU1QgICAyNzUKIAogLyogWVlOVE9LRU5TIC0tIE51bWJlciBvZiB0ZXJtaW5hbHMuICovCi0jZGVmaW5lIFlZTlRPS0VOUyAgMzUKKyNkZWZpbmUgWVlOVE9LRU5TICAzNgogLyogWVlOTlRTIC0tIE51bWJlciBvZiBub250ZXJtaW5hbHMuICovCi0jZGVmaW5lIFlZTk5UUyAgNDIKKyNkZWZpbmUgWVlOTlRTICA0NQogLyogWVlOUlVMRVMgLS0gTnVtYmVyIG9mIHJ1bGVzLiAqLwotI2RlZmluZSBZWU5SVUxFUyAgMTA0CisjZGVmaW5lIFlZTlJVTEVTICAxMTAKIC8qIFlZTlJVTEVTIC0tIE51bWJlciBvZiBzdGF0ZXMuICovCi0jZGVmaW5lIFlZTlNUQVRFUyAgMTc1CisjZGVmaW5lIFlZTlNUQVRFUyAgMTgzCiAKIC8qIFlZVFJBTlNMQVRFKFlZTEVYKSAtLSBCaXNvbiBzeW1ib2wgbnVtYmVyIGNvcnJlc3BvbmRpbmcgdG8gWVlMRVguICAqLwogI2RlZmluZSBZWVVOREVGVE9LICAyCi0jZGVmaW5lIFlZTUFYVVRPSyAgIDI4OQorI2RlZmluZSBZWU1BWFVUT0sgICAyOTAKIAotI2RlZmluZSBZWVRSQU5TTEFURShZWVgpIAkJCQkJCVwKKyNkZWZpbmUgWVlUUkFOU0xBVEUoWVlYKQkJCQkJCVwKICAgKCh1bnNpZ25lZCBpbnQpIChZWVgpIDw9IFlZTUFYVVRPSyA/IHl5dHJhbnNsYXRlW1lZWF0gOiBZWVVOREVGVE9LKQogCiAvKiBZWVRSQU5TTEFURVtZWUxFWF0gLS0gQmlzb24gc3ltYm9sIG51bWJlciBjb3JyZXNwb25kaW5nIHRvIFlZTEVYLiAgKi8KQEAgLTM2MSw3ICs0MjEsOCBAQAogICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDEsICAgICAyLCAgICAgMywgICAgIDQsCiAgICAgICAgNSwgICAgIDYsICAgICA3LCAgICAgOCwgICAgIDksICAgIDEwLCAgICAxMSwgICAgMTIsICAgIDEzLCAgICAxNCwKICAgICAgIDE1LCAgICAxNiwgICAgMTcsICAgIDE4LCAgICAxOSwgICAgMjAsICAgIDIxLCAgICAyMiwgICAgMjMsICAgIDI0LAotICAgICAgMjUsICAgIDI2LCAgICAyNywgICAgMjgsICAgIDI5LCAgICAzMCwgICAgMzEsICAgIDMyLCAgICAzMywgICAgMzQKKyAgICAgIDI1LCAgICAyNiwgICAgMjcsICAgIDI4LCAgICAyOSwgICAgMzAsICAgIDMxLCAgICAzMiwgICAgMzMsICAgIDM0LAorICAgICAgMzUKIH07CiAKICNpZiBZWURFQlVHCkBAIC0zNzIsNzIgKzQzMyw3NSBAQAogICAgICAgIDAsICAgICAwLCAgICAgMywgICAgIDUsICAgICA2LCAgICAgOSwgICAgMTIsICAgIDE1LCAgICAyMCwgICAgMjMsCiAgICAgICAyOCwgICAgMzMsICAgIDM3LCAgICAzOSwgICAgNDEsICAgIDQzLCAgICA0NSwgICAgNDcsICAgIDQ5LCAgICA1MSwKICAgICAgIDUzLCAgICA1NSwgICAgNTcsICAgIDU5LCAgICA2MSwgICAgNjMsICAgIDY3LCAgICA3MCwgICAgNzQsICAgIDc3LAotICAgICAgODEsICAgIDg0LCAgICA4NSwgICAgODgsICAgIDkxLCAgICA5NCwgICAgOTcsICAgMTAwLCAgIDEwNCwgICAxMDksCi0gICAgIDExNCwgICAxMTksICAgMTI1LCAgIDEyOCwgICAxMzEsICAgMTMzLCAgIDEzNywgICAxMzgsICAgMTQxLCAgIDE0NCwKLSAgICAgMTQ3LCAgIDE1MCwgICAxNTMsICAgMTU4LCAgIDE2MiwgICAxNjUsICAgMTcwLCAgIDE3MSwgICAxNzQsICAgMTc4LAotICAgICAxODAsICAgMTg0LCAgIDE4NSwgICAxODgsICAgMTkxLCAgIDE5NCwgICAxOTgsICAgMjAxLCAgIDIwMywgICAyMDcsCi0gICAgIDIwOCwgICAyMTEsICAgMjE0LCAgIDIxNywgICAyMjEsICAgMjI1LCAgIDIyOCwgICAyMzEsICAgMjM0LCAgIDIzNSwKLSAgICAgMjM4LCAgIDI0MSwgICAyNDQsICAgMjQ5LCAgIDI1MywgICAyNTcsICAgMjU4LCAgIDI2MSwgICAyNjMsICAgMjY1LAotICAgICAyNjgsICAgMjcxLCAgIDI3NCwgICAyNzYsICAgMjc5LCAgIDI4MCwgICAyODMsICAgMjg1LCAgIDI4OSwgICAyOTMsCi0gICAgIDI5NywgICAzMDAsICAgMzA0LCAgIDMwOCwgICAzMTAKKyAgICAgIDgxLCAgICA4NCwgICAgODUsICAgIDg4LCAgICA5MSwgICAgOTQsICAgIDk3LCAgIDEwMCwgICAxMDMsICAgMTA3LAorICAgICAxMTIsICAgMTE3LCAgIDEyMiwgICAxMjgsICAgMTMyLCAgIDEzMywgICAxMzcsICAgMTM4LCAgIDE0MSwgICAxNDQsCisgICAgIDE0NywgICAxNDksICAgMTUzLCAgIDE1NCwgICAxNTcsICAgMTYwLCAgIDE2MywgICAxNjYsICAgMTY5LCAgIDE3NCwKKyAgICAgMTc4LCAgIDE4MSwgICAxODYsICAgMTg3LCAgIDE5MCwgICAxOTQsICAgMTk2LCAgIDIwMCwgICAyMDEsICAgMjA0LAorICAgICAyMDcsICAgMjEwLCAgIDIxNCwgICAyMTcsICAgMjE5LCAgIDIyMywgICAyMjQsICAgMjI3LCAgIDIzMCwgICAyMzMsCisgICAgIDIzNywgICAyNDEsICAgMjQ0LCAgIDI0NywgICAyNTAsICAgMjUxLCAgIDI1NCwgICAyNTcsICAgMjYwLCAgIDI2NSwKKyAgICAgMjY5LCAgIDI3MywgICAyNzQsICAgMjc3LCAgIDI3OSwgICAyODEsICAgMjg0LCAgIDI4NywgICAyOTAsICAgMjkyLAorICAgICAyOTUsICAgMjk2LCAgIDI5OSwgICAzMDEsICAgMzA1LCAgIDMwOSwgICAzMTMsICAgMzE2LCAgIDMyMCwgICAzMjQsCisgICAgIDMyNgogfTsKIAogLyogWVlSSFMgLS0gQSBgLTEnLXNlcGFyYXRlZCBsaXN0IG9mIHRoZSBydWxlcycgUkhTLiAqLwogc3RhdGljIGNvbnN0IHl5c2lnbmVkX2NoYXIgeXlyaHNbXSA9CiB7Ci0gICAgICAzNiwgICAgIDAsICAgIC0xLCAgICAzNywgICAgLTEsICAgIC0xLCAgICAzNywgICAgMzksICAgIC0xLCAgICAzNywKLSAgICAgIDUwLCAgICAtMSwgICAgMzcsICAgIDYxLCAgICAtMSwgICAgMzcsICAgICAzLCAgICA3MSwgICAgNzMsICAgIC0xLAotICAgICAgMzcsICAgIDcyLCAgICAtMSwgICAgMzcsICAgIDI1LCAgICAgMSwgICAgMzAsICAgIC0xLCAgICAzNywgICAgMzgsCi0gICAgICAgMSwgICAgMzAsICAgIC0xLCAgICAzNywgICAgIDEsICAgIDMwLCAgICAtMSwgICAgMTYsICAgIC0xLCAgICAxOSwKKyAgICAgIDM3LCAgICAgMCwgICAgLTEsICAgIDM4LCAgICAtMSwgICAgLTEsICAgIDM4LCAgICA0MCwgICAgLTEsICAgIDM4LAorICAgICAgNTQsICAgIC0xLCAgICAzOCwgICAgNjUsICAgIC0xLCAgICAzOCwgICAgIDMsICAgIDc1LCAgICA3NywgICAgLTEsCisgICAgICAzOCwgICAgNzYsICAgIC0xLCAgICAzOCwgICAgMjYsICAgICAxLCAgICAzMSwgICAgLTEsICAgIDM4LCAgICAzOSwKKyAgICAgICAxLCAgICAzMSwgICAgLTEsICAgIDM4LCAgICAgMSwgICAgMzEsICAgIC0xLCAgICAxNiwgICAgLTEsICAgIDE5LAogICAgICAgLTEsICAgIDIwLCAgICAtMSwgICAgMjIsICAgIC0xLCAgICAxOCwgICAgLTEsICAgIDIzLCAgICAtMSwgICAgMjEsCi0gICAgICAtMSwgICAgMzAsICAgIC0xLCAgICA1NiwgICAgLTEsICAgIDY1LCAgICAtMSwgICAgNDIsICAgIC0xLCAgICA0NCwKLSAgICAgIC0xLCAgICA2MywgICAgLTEsICAgIDI1LCAgICAgMSwgICAgMzAsICAgIC0xLCAgICAgMSwgICAgMzAsICAgIC0xLAotICAgICAgMTAsICAgIDI1LCAgICAzMCwgICAgLTEsICAgIDQxLCAgICA0NSwgICAgLTEsICAgIDExLCAgICAyNSwgICAgMzAsCi0gICAgICAtMSwgICAgNDMsICAgIDQ1LCAgICAtMSwgICAgLTEsICAgIDQ1LCAgICA0NiwgICAgLTEsICAgIDQ1LCAgICA2OSwKLSAgICAgIC0xLCAgICA0NSwgICAgNjcsICAgIC0xLCAgICA0NSwgICAgNDAsICAgIC0xLCAgICA0NSwgICAgMzAsICAgIC0xLAotICAgICAgMjAsICAgIDcwLCAgICAzMCwgICAgLTEsICAgIDE5LCAgICA3MSwgICAgNzQsICAgIDMwLCAgICAtMSwgICAgMjEsCi0gICAgICA3NSwgICAgNzQsICAgIDMwLCAgICAtMSwgICAgMjIsICAgIDI1LCAgICA3NCwgICAgMzAsICAgIC0xLCAgICAyMywKLSAgICAgIDc2LCAgICA3NiwgICAgNzQsICAgIDMwLCAgICAtMSwgICAgIDcsICAgIDMwLCAgICAtMSwgICAgNDcsICAgIDUxLAotICAgICAgLTEsICAgIDcyLCAgICAtMSwgICAgNDgsICAgIDUzLCAgICA0OSwgICAgLTEsICAgIC0xLCAgICA1MSwgICAgNTIsCi0gICAgICAtMSwgICAgNTEsICAgIDY5LCAgICAtMSwgICAgNTEsICAgIDY3LCAgICAtMSwgICAgNTEsICAgIDMwLCAgICAtMSwKLSAgICAgIDUxLCAgICA0MCwgICAgLTEsICAgIDE5LCAgICA3MSwgICAgNzQsICAgIDMwLCAgICAtMSwgICAgMjAsICAgIDcwLAotICAgICAgMzAsICAgIC0xLCAgICAxOCwgICAgMzAsICAgIC0xLCAgICAyMSwgICAgMjUsICAgIDc0LCAgICAzMCwgICAgLTEsCi0gICAgICAtMSwgICAgNTMsICAgIDM5LCAgICAtMSwgICAgMTQsICAgIDc1LCAgICA3MywgICAgLTEsICAgIDcyLCAgICAtMSwKLSAgICAgIDU0LCAgICA1NywgICAgNTUsICAgIC0xLCAgICAtMSwgICAgNTcsICAgIDM5LCAgICAtMSwgICAgNTcsICAgIDYxLAotICAgICAgLTEsICAgIDU3LCAgICA1MCwgICAgLTEsICAgICA0LCAgICA3MSwgICAgMzAsICAgIC0xLCAgICA1OCwgICAgNjgsCi0gICAgICAtMSwgICAgNzIsICAgIC0xLCAgICA1OSwgICAgNjIsICAgIDYwLCAgICAtMSwgICAgLTEsICAgIDYyLCAgICAzOSwKLSAgICAgIC0xLCAgICA2MiwgICAgNjEsICAgIC0xLCAgICA2MiwgICAgNTAsICAgIC0xLCAgICAgNiwgICAgNzEsICAgIDMwLAotICAgICAgLTEsICAgICA5LCAgICA3MSwgICAgMzAsICAgIC0xLCAgICA2NCwgICAgNjgsICAgIC0xLCAgICAxMiwgICAgMzAsCi0gICAgICAtMSwgICAgNjYsICAgIDEzLCAgICAtMSwgICAgLTEsICAgIDY4LCAgICA2OSwgICAgLTEsICAgIDY4LCAgICAzMCwKLSAgICAgIC0xLCAgICA2OCwgICAgNDAsICAgIC0xLCAgICAxNiwgICAgMjQsICAgIDc1LCAgICAzMCwgICAgLTEsICAgIDE2LAotICAgICAgNzUsICAgIDMwLCAgICAtMSwgICAgMTcsICAgIDc1LCAgICAzMCwgICAgLTEsICAgIC0xLCAgICA3MSwgICAgNzQsCi0gICAgICAtMSwgICAgMjUsICAgIC0xLCAgICAyNiwgICAgLTEsICAgICA1LCAgICAzMCwgICAgLTEsICAgICA4LCAgICAzMCwKLSAgICAgIC0xLCAgICAxNSwgICAgMzAsICAgIC0xLCAgICAzMCwgICAgLTEsICAgIDczLCAgICAzMCwgICAgLTEsICAgIC0xLAotICAgICAgMTQsICAgIDc1LCAgICAtMSwgICAgNzYsICAgIC0xLCAgICA3NiwgICAgMzMsICAgIDc2LCAgICAtMSwgICAgNzYsCi0gICAgICAyNywgICAgNzYsICAgIC0xLCAgICAyOSwgICAgNzUsICAgIDI4LCAgICAtMSwgICAgMzQsICAgIDc1LCAgICAtMSwKLSAgICAgIDc1LCAgICAzMSwgICAgNzUsICAgIC0xLCAgICA3NSwgICAgMzIsICAgIDc1LCAgICAtMSwgICAgMjUsICAgIC0xLAotICAgICAgMjYsICAgIC0xCisgICAgICAtMSwgICAgMzEsICAgIC0xLCAgICA2MCwgICAgLTEsICAgIDY5LCAgICAtMSwgICAgNDMsICAgIC0xLCAgICA0NSwKKyAgICAgIC0xLCAgICA2NywgICAgLTEsICAgIDI2LCAgICAgMSwgICAgMzEsICAgIC0xLCAgICAgMSwgICAgMzEsICAgIC0xLAorICAgICAgMTAsICAgIDI2LCAgICAzMSwgICAgLTEsICAgIDQyLCAgICA0NiwgICAgLTEsICAgIDExLCAgICAyNiwgICAgMzEsCisgICAgICAtMSwgICAgNDQsICAgIDQ2LCAgICAtMSwgICAgLTEsICAgIDQ2LCAgICA0NywgICAgLTEsICAgIDQ2LCAgICA0OCwKKyAgICAgIC0xLCAgICA0NiwgICAgNzMsICAgIC0xLCAgICA0NiwgICAgNzEsICAgIC0xLCAgICA0NiwgICAgNDEsICAgIC0xLAorICAgICAgNDYsICAgIDMxLCAgICAtMSwgICAgMjAsICAgIDc0LCAgICAzMSwgICAgLTEsICAgIDE5LCAgICA3NSwgICAgNzgsCisgICAgICAzMSwgICAgLTEsICAgIDIxLCAgICA3OSwgICAgNzgsICAgIDMxLCAgICAtMSwgICAgMjIsICAgIDI2LCAgICA3OCwKKyAgICAgIDMxLCAgICAtMSwgICAgMjMsICAgIDgwLCAgICA4MCwgICAgNzgsICAgIDMxLCAgICAtMSwgICAgMjQsICAgIDQ5LAorICAgICAgMzEsICAgIC0xLCAgICAtMSwgICAgNDksICAgIDI2LCAgICA1MCwgICAgLTEsICAgIC0xLCAgICAzNCwgICAgNzUsCisgICAgICAtMSwgICAgIDcsICAgIDMxLCAgICAtMSwgICAgNTEsICAgIDU1LCAgICAtMSwgICAgNzYsICAgIC0xLCAgICA1MiwKKyAgICAgIDU3LCAgICA1MywgICAgLTEsICAgIC0xLCAgICA1NSwgICAgNTYsICAgIC0xLCAgICA1NSwgICAgNzMsICAgIC0xLAorICAgICAgNTUsICAgIDcxLCAgICAtMSwgICAgNTUsICAgIDMxLCAgICAtMSwgICAgNTUsICAgIDQxLCAgICAtMSwgICAgMTksCisgICAgICA3NSwgICAgNzgsICAgIDMxLCAgICAtMSwgICAgMjAsICAgIDc0LCAgICAzMSwgICAgLTEsICAgIDE4LCAgICAzMSwKKyAgICAgIC0xLCAgICAyMSwgICAgMjYsICAgIDc4LCAgICAzMSwgICAgLTEsICAgIC0xLCAgICA1NywgICAgNDAsICAgIC0xLAorICAgICAgMTQsICAgIDc5LCAgICA3NywgICAgLTEsICAgIDc2LCAgICAtMSwgICAgNTgsICAgIDYxLCAgICA1OSwgICAgLTEsCisgICAgICAtMSwgICAgNjEsICAgIDQwLCAgICAtMSwgICAgNjEsICAgIDY1LCAgICAtMSwgICAgNjEsICAgIDU0LCAgICAtMSwKKyAgICAgICA0LCAgICA3NSwgICAgMzEsICAgIC0xLCAgICA2MiwgICAgNzIsICAgIC0xLCAgICA3NiwgICAgLTEsICAgIDYzLAorICAgICAgNjYsICAgIDY0LCAgICAtMSwgICAgLTEsICAgIDY2LCAgICA0MCwgICAgLTEsICAgIDY2LCAgICA2NSwgICAgLTEsCisgICAgICA2NiwgICAgNTQsICAgIC0xLCAgICAgNiwgICAgNzUsICAgIDMxLCAgICAtMSwgICAgIDksICAgIDc1LCAgICAzMSwKKyAgICAgIC0xLCAgICA2OCwgICAgNzIsICAgIC0xLCAgICAxMiwgICAgMzEsICAgIC0xLCAgICA3MCwgICAgMTMsICAgIC0xLAorICAgICAgLTEsICAgIDcyLCAgICA3MywgICAgLTEsICAgIDcyLCAgICAzMSwgICAgLTEsICAgIDcyLCAgICA0MSwgICAgLTEsCisgICAgICAxNiwgICAgMjUsICAgIDc5LCAgICAzMSwgICAgLTEsICAgIDE2LCAgICA3OSwgICAgMzEsICAgIC0xLCAgICAxNywKKyAgICAgIDc5LCAgICAzMSwgICAgLTEsICAgIC0xLCAgICA3NSwgICAgNzgsICAgIC0xLCAgICAyNiwgICAgLTEsICAgIDI3LAorICAgICAgLTEsICAgICA1LCAgICAzMSwgICAgLTEsICAgICA4LCAgICAzMSwgICAgLTEsICAgIDE1LCAgICAzMSwgICAgLTEsCisgICAgICAzMSwgICAgLTEsICAgIDc3LCAgICAzMSwgICAgLTEsICAgIC0xLCAgICAxNCwgICAgNzksICAgIC0xLCAgICA4MCwKKyAgICAgIC0xLCAgICA4MCwgICAgMzQsICAgIDgwLCAgICAtMSwgICAgODAsICAgIDI4LCAgICA4MCwgICAgLTEsICAgIDMwLAorICAgICAgNzksICAgIDI5LCAgICAtMSwgICAgMzUsICAgIDc5LCAgICAtMSwgICAgNzksICAgIDMyLCAgICA3OSwgICAgLTEsCisgICAgICA3OSwgICAgMzMsICAgIDc5LCAgICAtMSwgICAgMjYsICAgIC0xLCAgICAyNywgICAgLTEKIH07CiAKIC8qIFlZUkxJTkVbWVlOXSAtLSBzb3VyY2UgbGluZSB3aGVyZSBydWxlIG51bWJlciBZWU4gd2FzIGRlZmluZWQuICAqLwogc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IGludCB5eXJsaW5lW10gPQogewotICAgICAgIDAsICAgMTAzLCAgIDEwMywgICAxMDUsICAgMTA3LCAgIDEwOCwgICAxMDksICAgMTEwLCAgIDExMSwgICAxMTIsCi0gICAgIDExMywgICAxMTcsICAgMTIxLCAgIDEyMSwgICAxMjEsICAgMTIxLCAgIDEyMSwgICAxMjEsICAgMTIxLCAgIDEyNSwKLSAgICAgMTI2LCAgIDEyNywgICAxMjgsICAgMTI5LCAgIDEzMCwgICAxMzQsICAgMTM1LCAgIDE0MSwgICAxNDksICAgMTU1LAotICAgICAxNjMsICAgMTczLCAgIDE3NSwgICAxNzYsICAgMTc3LCAgIDE3OCwgICAxNzksICAgMTgyLCAgIDE5MCwgICAxOTYsCi0gICAgIDIwNiwgICAyMTIsICAgMjIwLCAgIDIyOSwgICAyMzQsICAgMjQyLCAgIDI0NSwgICAyNDcsICAgMjQ4LCAgIDI0OSwKLSAgICAgMjUwLCAgIDI1MSwgICAyNTQsICAgMjYwLCAgIDI3MSwgICAyNzcsICAgMjg3LCAgIDI4OSwgICAyOTQsICAgMzAyLAotICAgICAzMTAsICAgMzEzLCAgIDMxNSwgICAzMTYsICAgMzE3LCAgIDMyMiwgICAzMjksICAgMzM0LCAgIDM0MiwgICAzNDUsCi0gICAgIDM0NywgICAzNDgsICAgMzQ5LCAgIDM1MiwgICAzNjAsICAgMzY3LCAgIDM3NCwgICAzODAsICAgMzg3LCAgIDM4OSwKLSAgICAgMzkwLCAgIDM5MSwgICAzOTQsICAgMzk5LCAgIDQwNCwgICA0MTIsICAgNDE0LCAgIDQxOSwgICA0MjAsICAgNDIzLAotICAgICA0MjQsICAgNDI1LCAgIDQyOSwgICA0MzAsICAgNDMzLCAgIDQzNCwgICA0MzcsICAgNDM4LCAgIDQzOSwgICA0NDAsCi0gICAgIDQ0MSwgICA0NDIsICAgNDQzLCAgIDQ0NiwgICA0NDcKKyAgICAgICAwLCAgIDEwNSwgICAxMDUsICAgMTA3LCAgIDEwOSwgICAxMTAsICAgMTExLCAgIDExMiwgICAxMTMsICAgMTE0LAorICAgICAxMTUsICAgMTE5LCAgIDEyMywgICAxMjMsICAgMTIzLCAgIDEyMywgICAxMjMsICAgMTIzLCAgIDEyMywgICAxMjcsCisgICAgIDEyOCwgICAxMjksICAgMTMwLCAgIDEzMSwgICAxMzIsICAgMTM2LCAgIDEzNywgICAxNDMsICAgMTUxLCAgIDE1NywKKyAgICAgMTY1LCAgIDE3NSwgICAxNzcsICAgMTc4LCAgIDE3OSwgICAxODAsICAgMTgxLCAgIDE4MiwgICAxODUsICAgMTkzLAorICAgICAxOTksICAgMjA5LCAgIDIxNSwgICAyMjEsICAgMjI0LCAgIDIyNiwgICAyMzcsICAgMjM4LCAgIDI0MywgICAyNTIsCisgICAgIDI1NywgICAyNjUsICAgMjY4LCAgIDI3MCwgICAyNzEsICAgMjcyLCAgIDI3MywgICAyNzQsICAgMjc3LCAgIDI4MywKKyAgICAgMjk0LCAgIDMwMCwgICAzMTAsICAgMzEyLCAgIDMxNywgICAzMjUsICAgMzMzLCAgIDMzNiwgICAzMzgsICAgMzM5LAorICAgICAzNDAsICAgMzQ1LCAgIDM1MiwgICAzNTcsICAgMzY1LCAgIDM2OCwgICAzNzAsICAgMzcxLCAgIDM3MiwgICAzNzUsCisgICAgIDM4MywgICAzOTAsICAgMzk3LCAgIDQwMywgICA0MTAsICAgNDEyLCAgIDQxMywgICA0MTQsICAgNDE3LCAgIDQyMiwKKyAgICAgNDI3LCAgIDQzNSwgICA0MzcsICAgNDQyLCAgIDQ0MywgICA0NDYsICAgNDQ3LCAgIDQ0OCwgICA0NTIsICAgNDUzLAorICAgICA0NTYsICAgNDU3LCAgIDQ2MCwgICA0NjEsICAgNDYyLCAgIDQ2MywgICA0NjQsICAgNDY1LCAgIDQ2NiwgICA0NjksCisgICAgIDQ3MAogfTsKICNlbmRpZgogCi0jaWYgWVlERUJVRyB8fCBZWUVSUk9SX1ZFUkJPU0UKLS8qIFlZVE5NRVtTWU1CT0wtTlVNXSAtLSBTdHJpbmcgbmFtZSBvZiB0aGUgc3ltYm9sIFNZTUJPTC1OVU0uCisjaWYgWVlERUJVRyB8fCBZWUVSUk9SX1ZFUkJPU0UgfHwgWVlUT0tFTl9UQUJMRQorLyogWVlUTkFNRVtTWU1CT0wtTlVNXSAtLSBTdHJpbmcgbmFtZSBvZiB0aGUgc3ltYm9sIFNZTUJPTC1OVU0uCiAgICBGaXJzdCwgdGhlIHRlcm1pbmFscywgdGhlbiwgc3RhcnRpbmcgYXQgWVlOVE9LRU5TLCBub250ZXJtaW5hbHMuICovCiBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgeXl0bmFtZVtdID0KIHsKQEAgLTQ0NSwxNyArNTA5LDE4IEBACiAgICJUX1NPVVJDRSIsICJUX0NIT0lDRSIsICJUX0VORENIT0lDRSIsICJUX0NPTU1FTlQiLCAiVF9DT05GSUciLAogICAiVF9NRU5VQ09ORklHIiwgIlRfSEVMUCIsICJUX0hFTFBURVhUIiwgIlRfSUYiLCAiVF9FTkRJRiIsICJUX0RFUEVORFMiLAogICAiVF9SRVFVSVJFUyIsICJUX09QVElPTkFMIiwgIlRfUFJPTVBUIiwgIlRfVFlQRSIsICJUX0RFRkFVTFQiLAotICAiVF9TRUxFQ1QiLCAiVF9SQU5HRSIsICJUX09OIiwgIlRfV09SRCIsICJUX1dPUkRfUVVPVEUiLCAiVF9VTkVRVUFMIiwKLSAgIlRfQ0xPU0VfUEFSRU4iLCAiVF9PUEVOX1BBUkVOIiwgIlRfRU9MIiwgIlRfT1IiLCAiVF9BTkQiLCAiVF9FUVVBTCIsCi0gICJUX05PVCIsICIkYWNjZXB0IiwgImlucHV0IiwgInN0bXRfbGlzdCIsICJvcHRpb25fbmFtZSIsICJjb21tb25fc3RtdCIsCi0gICJvcHRpb25fZXJyb3IiLCAiY29uZmlnX2VudHJ5X3N0YXJ0IiwgImNvbmZpZ19zdG10IiwKKyAgIlRfU0VMRUNUIiwgIlRfUkFOR0UiLCAiVF9PUFRJT04iLCAiVF9PTiIsICJUX1dPUkQiLCAiVF9XT1JEX1FVT1RFIiwKKyAgIlRfVU5FUVVBTCIsICJUX0NMT1NFX1BBUkVOIiwgIlRfT1BFTl9QQVJFTiIsICJUX0VPTCIsICJUX09SIiwgIlRfQU5EIiwKKyAgIlRfRVFVQUwiLCAiVF9OT1QiLCAiJGFjY2VwdCIsICJpbnB1dCIsICJzdG10X2xpc3QiLCAib3B0aW9uX25hbWUiLAorICAiY29tbW9uX3N0bXQiLCAib3B0aW9uX2Vycm9yIiwgImNvbmZpZ19lbnRyeV9zdGFydCIsICJjb25maWdfc3RtdCIsCiAgICJtZW51Y29uZmlnX2VudHJ5X3N0YXJ0IiwgIm1lbnVjb25maWdfc3RtdCIsICJjb25maWdfb3B0aW9uX2xpc3QiLAotICAiY29uZmlnX29wdGlvbiIsICJjaG9pY2UiLCAiY2hvaWNlX2VudHJ5IiwgImNob2ljZV9lbmQiLCAiY2hvaWNlX3N0bXQiLAotICAiY2hvaWNlX29wdGlvbl9saXN0IiwgImNob2ljZV9vcHRpb24iLCAiY2hvaWNlX2Jsb2NrIiwgImlmX2VudHJ5IiwKLSAgImlmX2VuZCIsICJpZl9zdG10IiwgImlmX2Jsb2NrIiwgIm1lbnUiLCAibWVudV9lbnRyeSIsICJtZW51X2VuZCIsCi0gICJtZW51X3N0bXQiLCAibWVudV9ibG9jayIsICJzb3VyY2Vfc3RtdCIsICJjb21tZW50IiwgImNvbW1lbnRfc3RtdCIsCi0gICJoZWxwX3N0YXJ0IiwgImhlbHAiLCAiZGVwZW5kc19saXN0IiwgImRlcGVuZHMiLCAicHJvbXB0X3N0bXRfb3B0IiwKLSAgInByb21wdCIsICJlbmQiLCAibmwiLCAiaWZfZXhwciIsICJleHByIiwgInN5bWJvbCIsIDAKKyAgImNvbmZpZ19vcHRpb24iLCAic3ltYm9sX29wdGlvbiIsICJzeW1ib2xfb3B0aW9uX2xpc3QiLAorICAic3ltYm9sX29wdGlvbl9hcmciLCAiY2hvaWNlIiwgImNob2ljZV9lbnRyeSIsICJjaG9pY2VfZW5kIiwKKyAgImNob2ljZV9zdG10IiwgImNob2ljZV9vcHRpb25fbGlzdCIsICJjaG9pY2Vfb3B0aW9uIiwgImNob2ljZV9ibG9jayIsCisgICJpZl9lbnRyeSIsICJpZl9lbmQiLCAiaWZfc3RtdCIsICJpZl9ibG9jayIsICJtZW51IiwgIm1lbnVfZW50cnkiLAorICAibWVudV9lbmQiLCAibWVudV9zdG10IiwgIm1lbnVfYmxvY2siLCAic291cmNlX3N0bXQiLCAiY29tbWVudCIsCisgICJjb21tZW50X3N0bXQiLCAiaGVscF9zdGFydCIsICJoZWxwIiwgImRlcGVuZHNfbGlzdCIsICJkZXBlbmRzIiwKKyAgInByb21wdF9zdG10X29wdCIsICJwcm9tcHQiLCAiZW5kIiwgIm5sIiwgImlmX2V4cHIiLCAiZXhwciIsICJzeW1ib2wiLCAwCiB9OwogI2VuZGlmCiAKQEAgLTQ2NywyNCArNTMyLDI1IEBACiAgICAgICAgMCwgICAyNTYsICAgMjU3LCAgIDI1OCwgICAyNTksICAgMjYwLCAgIDI2MSwgICAyNjIsICAgMjYzLCAgIDI2NCwKICAgICAgMjY1LCAgIDI2NiwgICAyNjcsICAgMjY4LCAgIDI2OSwgICAyNzAsICAgMjcxLCAgIDI3MiwgICAyNzMsICAgMjc0LAogICAgICAyNzUsICAgMjc2LCAgIDI3NywgICAyNzgsICAgMjc5LCAgIDI4MCwgICAyODEsICAgMjgyLCAgIDI4MywgICAyODQsCi0gICAgIDI4NSwgICAyODYsICAgMjg3LCAgIDI4OCwgICAyODkKKyAgICAgMjg1LCAgIDI4NiwgICAyODcsICAgMjg4LCAgIDI4OSwgICAyOTAKIH07CiAjIGVuZGlmCiAKIC8qIFlZUjFbWVlOXSAtLSBTeW1ib2wgbnVtYmVyIG9mIHN5bWJvbCB0aGF0IHJ1bGUgWVlOIGRlcml2ZXMuICAqLwogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgeXlyMVtdID0KIHsKLSAgICAgICAwLCAgICAzNSwgICAgMzYsICAgIDM3LCAgICAzNywgICAgMzcsICAgIDM3LCAgICAzNywgICAgMzcsICAgIDM3LAotICAgICAgMzcsICAgIDM3LCAgICAzOCwgICAgMzgsICAgIDM4LCAgICAzOCwgICAgMzgsICAgIDM4LCAgICAzOCwgICAgMzksCi0gICAgICAzOSwgICAgMzksICAgIDM5LCAgICAzOSwgICAgMzksICAgIDQwLCAgICA0MCwgICAgNDEsICAgIDQyLCAgICA0MywKLSAgICAgIDQ0LCAgICA0NSwgICAgNDUsICAgIDQ1LCAgICA0NSwgICAgNDUsICAgIDQ1LCAgICA0NiwgICAgNDYsICAgIDQ2LAotICAgICAgNDYsICAgIDQ2LCAgICA0NywgICAgNDgsICAgIDQ5LCAgICA1MCwgICAgNTEsICAgIDUxLCAgICA1MSwgICAgNTEsCi0gICAgICA1MSwgICAgNTEsICAgIDUyLCAgICA1MiwgICAgNTIsICAgIDUyLCAgICA1MywgICAgNTMsICAgIDU0LCAgICA1NSwKLSAgICAgIDU2LCAgICA1NywgICAgNTcsICAgIDU3LCAgICA1NywgICAgNTgsICAgIDU5LCAgICA2MCwgICAgNjEsICAgIDYyLAotICAgICAgNjIsICAgIDYyLCAgICA2MiwgICAgNjMsICAgIDY0LCAgICA2NSwgICAgNjYsICAgIDY3LCAgICA2OCwgICAgNjgsCi0gICAgICA2OCwgICAgNjgsICAgIDY5LCAgICA2OSwgICAgNjksICAgIDcwLCAgICA3MCwgICAgNzEsICAgIDcxLCAgICA3MiwKLSAgICAgIDcyLCAgICA3MiwgICAgNzMsICAgIDczLCAgICA3NCwgICAgNzQsICAgIDc1LCAgICA3NSwgICAgNzUsICAgIDc1LAotICAgICAgNzUsICAgIDc1LCAgICA3NSwgICAgNzYsICAgIDc2CisgICAgICAgMCwgICAgMzYsICAgIDM3LCAgICAzOCwgICAgMzgsICAgIDM4LCAgICAzOCwgICAgMzgsICAgIDM4LCAgICAzOCwKKyAgICAgIDM4LCAgICAzOCwgICAgMzksICAgIDM5LCAgICAzOSwgICAgMzksICAgIDM5LCAgICAzOSwgICAgMzksICAgIDQwLAorICAgICAgNDAsICAgIDQwLCAgICA0MCwgICAgNDAsICAgIDQwLCAgICA0MSwgICAgNDEsICAgIDQyLCAgICA0MywgICAgNDQsCisgICAgICA0NSwgICAgNDYsICAgIDQ2LCAgICA0NiwgICAgNDYsICAgIDQ2LCAgICA0NiwgICAgNDYsICAgIDQ3LCAgICA0NywKKyAgICAgIDQ3LCAgICA0NywgICAgNDcsICAgIDQ4LCAgICA0OSwgICAgNDksICAgIDUwLCAgICA1MCwgICAgNTEsICAgIDUyLAorICAgICAgNTMsICAgIDU0LCAgICA1NSwgICAgNTUsICAgIDU1LCAgICA1NSwgICAgNTUsICAgIDU1LCAgICA1NiwgICAgNTYsCisgICAgICA1NiwgICAgNTYsICAgIDU3LCAgICA1NywgICAgNTgsICAgIDU5LCAgICA2MCwgICAgNjEsICAgIDYxLCAgICA2MSwKKyAgICAgIDYxLCAgICA2MiwgICAgNjMsICAgIDY0LCAgICA2NSwgICAgNjYsICAgIDY2LCAgICA2NiwgICAgNjYsICAgIDY3LAorICAgICAgNjgsICAgIDY5LCAgICA3MCwgICAgNzEsICAgIDcyLCAgICA3MiwgICAgNzIsICAgIDcyLCAgICA3MywgICAgNzMsCisgICAgICA3MywgICAgNzQsICAgIDc0LCAgICA3NSwgICAgNzUsICAgIDc2LCAgICA3NiwgICAgNzYsICAgIDc3LCAgICA3NywKKyAgICAgIDc4LCAgICA3OCwgICAgNzksICAgIDc5LCAgICA3OSwgICAgNzksICAgIDc5LCAgICA3OSwgICAgNzksICAgIDgwLAorICAgICAgODAKIH07CiAKIC8qIFlZUjJbWVlOXSAtLSBOdW1iZXIgb2Ygc3ltYm9scyBjb21wb3NpbmcgcmlnaHQgaGFuZCBzaWRlIG9mIHJ1bGUgWVlOLiAgKi8KQEAgLTQ5MywxNCArNTU5LDE1IEBACiAgICAgICAgMCwgICAgIDIsICAgICAxLCAgICAgMCwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDQsICAgICAyLCAgICAgNCwKICAgICAgICA0LCAgICAgMywgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLAogICAgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMywgICAgIDIsICAgICAzLCAgICAgMiwgICAgIDMsCi0gICAgICAgMiwgICAgIDAsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDMsICAgICA0LCAgICAgNCwKLSAgICAgICA0LCAgICAgNSwgICAgIDIsICAgICAyLCAgICAgMSwgICAgIDMsICAgICAwLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAgIDIsICAgICAyLCAgICAgNCwgICAgIDMsICAgICAyLCAgICAgNCwgICAgIDAsICAgICAyLCAgICAgMywgICAgIDEsCi0gICAgICAgMywgICAgIDAsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAzLCAgICAgMiwgICAgIDEsICAgICAzLCAgICAgMCwKLSAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAzLCAgICAgMywgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDAsICAgICAyLAotICAgICAgIDIsICAgICAyLCAgICAgNCwgICAgIDMsICAgICAzLCAgICAgMCwgICAgIDIsICAgICAxLCAgICAgMSwgICAgIDIsCi0gICAgICAgMiwgICAgIDIsICAgICAxLCAgICAgMiwgICAgIDAsICAgICAyLCAgICAgMSwgICAgIDMsICAgICAzLCAgICAgMywKLSAgICAgICAyLCAgICAgMywgICAgIDMsICAgICAxLCAgICAgMQorICAgICAgIDIsICAgICAwLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMywgICAgIDQsCisgICAgICAgNCwgICAgIDQsICAgICA1LCAgICAgMywgICAgIDAsICAgICAzLCAgICAgMCwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAxLCAgICAgMywgICAgIDAsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDQsICAgICAzLAorICAgICAgIDIsICAgICA0LCAgICAgMCwgICAgIDIsICAgICAzLCAgICAgMSwgICAgIDMsICAgICAwLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDMsICAgICAyLCAgICAgMSwgICAgIDMsICAgICAwLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMywKKyAgICAgICAzLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMCwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDQsICAgICAzLAorICAgICAgIDMsICAgICAwLCAgICAgMiwgICAgIDEsICAgICAxLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMSwgICAgIDIsCisgICAgICAgMCwgICAgIDIsICAgICAxLCAgICAgMywgICAgIDMsICAgICAzLCAgICAgMiwgICAgIDMsICAgICAzLCAgICAgMSwKKyAgICAgICAxCiB9OwogCiAvKiBZWURFRkFDVFtTVEFURS1OQU1FXSAtLSBEZWZhdWx0IHJ1bGUgdG8gcmVkdWNlIHdpdGggaW4gc3RhdGUKQEAgLTUxMSwxNzUgKzU3OCwxNjQgQEAKICAgICAgICAzLCAgICAgMCwgICAgIDAsICAgICAxLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLAogICAgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgMTIsICAgIDE2LCAgICAxMywgICAgMTQsCiAgICAgICAxOCwgICAgMTUsICAgIDE3LCAgICAgMCwgICAgMTksICAgICAwLCAgICAgNCwgICAgMzEsICAgIDIyLCAgICAzMSwKLSAgICAgIDIzLCAgICA0NiwgICAgNTYsICAgICA1LCAgICA2MSwgICAgMjAsICAgIDc4LCAgICA2OSwgICAgIDYsICAgIDI0LAotICAgICAgNzgsICAgIDIxLCAgICAgOCwgICAgMTEsICAgIDg3LCAgICA4OCwgICAgIDAsICAgICAwLCAgICA4OSwgICAgIDAsCi0gICAgICA0MiwgICAgOTAsICAgICAwLCAgICAgMCwgICAgIDAsICAgMTAzLCAgIDEwNCwgICAgIDAsICAgICAwLCAgICAgMCwKLSAgICAgIDk2LCAgICA5MSwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLAotICAgICAgIDAsICAgICAwLCAgICA5MiwgICAgIDcsICAgIDY1LCAgICA3MywgICAgNzQsICAgIDI3LCAgICAyOSwgICAgIDAsCi0gICAgIDEwMCwgICAgIDAsICAgICAwLCAgICA1OCwgICAgIDAsICAgICAwLCAgICAgOSwgICAgMTAsICAgICAwLCAgICAgMCwKLSAgICAgICAwLCAgICAgMCwgICAgIDAsICAgIDg1LCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgMzYsICAgIDM1LAotICAgICAgMzIsICAgICAwLCAgICAzNCwgICAgMzMsICAgICAwLCAgICAgMCwgICAgODUsICAgICAwLCAgICA1MCwgICAgNTEsCi0gICAgICA0NywgICAgNDksICAgIDQ4LCAgICA1NywgICAgNDUsICAgIDQ0LCAgICA2MiwgICAgNjQsICAgIDYwLCAgICA2MywKLSAgICAgIDU5LCAgICA4MCwgICAgODEsICAgIDc5LCAgICA3MCwgICAgNzIsICAgIDY4LCAgICA3MSwgICAgNjcsICAgIDkzLAotICAgICAgOTksICAgMTAxLCAgIDEwMiwgICAgOTgsICAgIDk3LCAgICAyNiwgICAgNzYsICAgICAwLCAgICAgMCwgICAgIDAsCi0gICAgICA5NCwgICAgIDAsICAgIDk0LCAgICA5NCwgICAgOTQsICAgICAwLCAgICAgMCwgICAgNzcsICAgIDU0LCAgICA5NCwKLSAgICAgICAwLCAgICA5NCwgICAgIDAsICAgIDgzLCAgICA4NCwgICAgIDAsICAgICAwLCAgICAzNywgICAgODYsICAgICAwLAotICAgICAgIDAsICAgIDk0LCAgICAyNSwgICAgIDAsICAgIDUzLCAgICAgMCwgICAgODIsICAgIDk1LCAgICAzOCwgICAgMzksCi0gICAgICA0MCwgICAgIDAsICAgIDUyLCAgICA1NSwgICAgNDEKKyAgICAgIDIzLCAgICA1MiwgICAgNjIsICAgICA1LCAgICA2NywgICAgMjAsICAgIDg0LCAgICA3NSwgICAgIDYsICAgIDI0LAorICAgICAgODQsICAgIDIxLCAgICAgOCwgICAgMTEsICAgIDkzLCAgICA5NCwgICAgIDAsICAgICAwLCAgICA5NSwgICAgIDAsCisgICAgICA0OCwgICAgOTYsICAgICAwLCAgICAgMCwgICAgIDAsICAgMTA5LCAgIDExMCwgICAgIDAsICAgICAwLCAgICAgMCwKKyAgICAgMTAyLCAgICA5NywgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLAorICAgICAgIDAsICAgICAwLCAgICA5OCwgICAgIDcsICAgIDcxLCAgICA3OSwgICAgODAsICAgIDI3LCAgICAyOSwgICAgIDAsCisgICAgIDEwNiwgICAgIDAsICAgICAwLCAgICA2NCwgICAgIDAsICAgICAwLCAgICAgOSwgICAgMTAsICAgICAwLCAgICAgMCwKKyAgICAgICAwLCAgICAgMCwgICAgIDAsICAgIDkxLCAgICAgMCwgICAgIDAsICAgICAwLCAgICA0NCwgICAgIDAsICAgIDM3LAorICAgICAgMzYsICAgIDMyLCAgICAzMywgICAgIDAsICAgIDM1LCAgICAzNCwgICAgIDAsICAgICAwLCAgICA5MSwgICAgIDAsCisgICAgICA1NiwgICAgNTcsICAgIDUzLCAgICA1NSwgICAgNTQsICAgIDYzLCAgICA1MSwgICAgNTAsICAgIDY4LCAgICA3MCwKKyAgICAgIDY2LCAgICA2OSwgICAgNjUsICAgIDg2LCAgICA4NywgICAgODUsICAgIDc2LCAgICA3OCwgICAgNzQsICAgIDc3LAorICAgICAgNzMsICAgIDk5LCAgIDEwNSwgICAxMDcsICAgMTA4LCAgIDEwNCwgICAxMDMsICAgIDI2LCAgICA4MiwgICAgIDAsCisgICAgICAgMCwgICAgIDAsICAgMTAwLCAgICAgMCwgICAxMDAsICAgMTAwLCAgIDEwMCwgICAgIDAsICAgICAwLCAgICAgMCwKKyAgICAgIDgzLCAgICA2MCwgICAxMDAsICAgICAwLCAgIDEwMCwgICAgIDAsICAgIDg5LCAgICA5MCwgICAgIDAsICAgICAwLAorICAgICAgMzgsICAgIDkyLCAgICAgMCwgICAgIDAsICAgMTAwLCAgICA0NiwgICAgNDMsICAgIDI1LCAgICAgMCwgICAgNTksCisgICAgICAgMCwgICAgODgsICAgMTAxLCAgICAzOSwgICAgNDAsICAgIDQxLCAgICAgMCwgICAgIDAsICAgIDQ1LCAgICA1OCwKKyAgICAgIDYxLCAgICA0MiwgICAgNDcKIH07CiAKIC8qIFlZREVGR09UT1tOVEVSTS1OVU1dLiAqLwogc3RhdGljIGNvbnN0IHNob3J0IGludCB5eWRlZmdvdG9bXSA9CiB7Ci0gICAgICAtMSwgICAgIDEsICAgICAyLCAgICAyNSwgICAgMjYsICAgIDk5LCAgICAyNywgICAgMjgsICAgIDI5LCAgICAzMCwKLSAgICAgIDY0LCAgIDEwMCwgICAgMzEsICAgIDMyLCAgIDExNCwgICAgMzMsICAgIDY2LCAgIDExMCwgICAgNjcsICAgIDM0LAotICAgICAxMTgsICAgIDM1LCAgICA2OCwgICAgMzYsICAgIDM3LCAgIDEyNiwgICAgMzgsICAgIDcwLCAgICAzOSwgICAgNDAsCi0gICAgICA0MSwgICAxMDEsICAgMTAyLCAgICA2OSwgICAxMDMsICAgMTQxLCAgIDE0MiwgICAgNDIsICAgIDczLCAgIDE1NiwKLSAgICAgIDU5LCAgICA2MAorICAgICAgLTEsICAgICAxLCAgICAgMiwgICAgMjUsICAgIDI2LCAgIDEwMCwgICAgMjcsICAgIDI4LCAgICAyOSwgICAgMzAsCisgICAgICA2NCwgICAxMDEsICAgMTAyLCAgIDE0OCwgICAxNzgsICAgIDMxLCAgICAzMiwgICAxMTYsICAgIDMzLCAgICA2NiwKKyAgICAgMTEyLCAgICA2NywgICAgMzQsICAgMTIwLCAgICAzNSwgICAgNjgsICAgIDM2LCAgICAzNywgICAxMjgsICAgIDM4LAorICAgICAgNzAsICAgIDM5LCAgICA0MCwgICAgNDEsICAgMTAzLCAgIDEwNCwgICAgNjksICAgMTA1LCAgIDE0MywgICAxNDQsCisgICAgICA0MiwgICAgNzMsICAgMTU5LCAgICA1OSwgICAgNjAKIH07CiAKIC8qIFlZUEFDVFtTVEFURS1OVU1dIC0tIEluZGV4IGluIFlZVEFCTEUgb2YgdGhlIHBvcnRpb24gZGVzY3JpYmluZwogICAgU1RBVEUtTlVNLiAgKi8KLSNkZWZpbmUgWVlQQUNUX05JTkYgLTc4CisjZGVmaW5lIFlZUEFDVF9OSU5GIC0xMzUKIHN0YXRpYyBjb25zdCBzaG9ydCBpbnQgeXlwYWN0W10gPQogewotICAgICAtNzgsICAgICAyLCAgIDE1OSwgICAtNzgsICAgLTIxLCAgICAgMCwgICAgIDAsICAgLTEyLCAgICAgMCwgICAgIDEsCi0gICAgICAgNCwgICAgIDAsICAgIDI3LCAgICAzOCwgICAgNjAsICAgIDU4LCAgIC03OCwgICAtNzgsICAgLTc4LCAgIC03OCwKLSAgICAgLTc4LCAgIC03OCwgICAtNzgsICAgMTAwLCAgIC03OCwgICAxMDQsICAgLTc4LCAgIC03OCwgICAtNzgsICAgLTc4LAotICAgICAtNzgsICAgLTc4LCAgIC03OCwgICAtNzgsICAgLTc4LCAgIC03OCwgICAtNzgsICAgLTc4LCAgIC03OCwgICAtNzgsCi0gICAgIC03OCwgICAtNzgsICAgLTc4LCAgIC03OCwgICAtNzgsICAgLTc4LCAgICA4NiwgICAxMTMsICAgLTc4LCAgIDExNCwKLSAgICAgLTc4LCAgIC03OCwgICAxMjUsICAgMTI3LCAgIDEyOCwgICAtNzgsICAgLTc4LCAgICA2MCwgICAgNjAsICAgMjEwLAotICAgICAgNjUsICAgLTc4LCAgIDE0MSwgICAxNDIsICAgIDM5LCAgIDEwMywgICAxODIsICAgMjAwLCAgICAgNiwgICAgNjYsCi0gICAgICAgNiwgICAxMzEsICAgLTc4LCAgIDE0NiwgICAtNzgsICAgLTc4LCAgIC03OCwgICAtNzgsICAgLTc4LCAgIDE5NiwKLSAgICAgLTc4LCAgICA2MCwgICAgNjAsICAgMTQ2LCAgICA0MCwgICAgNDAsICAgLTc4LCAgIC03OCwgICAxNTUsICAgMTU2LAotICAgICAgLTIsICAgIDYwLCAgICAgMCwgICAgIDAsICAgIDYwLCAgIDEwNSwgICAgNDAsICAgMTk0LCAgIC03OCwgICAtNzgsCi0gICAgIC03OCwgICAyMDYsICAgLTc4LCAgIC03OCwgICAxODMsICAgICAwLCAgICAgMCwgICAxOTUsICAgLTc4LCAgIC03OCwKLSAgICAgLTc4LCAgIC03OCwgICAtNzgsICAgLTc4LCAgIC03OCwgICAtNzgsICAgLTc4LCAgIC03OCwgICAtNzgsICAgLTc4LAotICAgICAtNzgsICAgLTc4LCAgIC03OCwgICAtNzgsICAgLTc4LCAgIC03OCwgICAtNzgsICAgLTc4LCAgIC03OCwgICAtNzgsCi0gICAgIC03OCwgICAxOTcsICAgLTc4LCAgIC03OCwgICAtNzgsICAgLTc4LCAgIC03OCwgICAgNjAsICAgMjEzLCAgIDIxNiwKLSAgICAgMjEyLCAgIDIwMywgICAyMTIsICAgMTkwLCAgIDIxMiwgICAgNDAsICAgMjA4LCAgIC03OCwgICAtNzgsICAgMjEyLAotICAgICAyMjIsICAgMjEyLCAgIDIxOSwgICAtNzgsICAgLTc4LCAgICA2MCwgICAyMjMsICAgLTc4LCAgIC03OCwgICAyMjQsCi0gICAgIDIyNSwgICAyMTIsICAgLTc4LCAgIDIyNiwgICAtNzgsICAgMjI3LCAgIC03OCwgICAgNDcsICAgLTc4LCAgIC03OCwKLSAgICAgLTc4LCAgIDIyOCwgICAtNzgsICAgLTc4LCAgIC03OAorICAgIC0xMzUsICAgICAyLCAgIDE3MCwgIC0xMzUsICAgLTE0LCAgICA1NiwgICAgNTYsICAgIC04LCAgICA1NiwgICAgMjQsCisgICAgICA2NywgICAgNTYsICAgICA3LCAgICAxNCwgICAgNjIsICAgIDk3LCAgLTEzNSwgIC0xMzUsICAtMTM1LCAgLTEzNSwKKyAgICAtMTM1LCAgLTEzNSwgIC0xMzUsICAgMTU2LCAgLTEzNSwgICAxNjYsICAtMTM1LCAgLTEzNSwgIC0xMzUsICAtMTM1LAorICAgIC0xMzUsICAtMTM1LCAgLTEzNSwgIC0xMzUsICAtMTM1LCAgLTEzNSwgIC0xMzUsICAtMTM1LCAgLTEzNSwgIC0xMzUsCisgICAgLTEzNSwgIC0xMzUsICAtMTM1LCAgLTEzNSwgIC0xMzUsICAtMTM1LCAgIDEzOCwgICAxNTEsICAtMTM1LCAgIDE1MiwKKyAgICAtMTM1LCAgLTEzNSwgICAxNjMsICAgMTY3LCAgIDE3NiwgIC0xMzUsICAtMTM1LCAgICA2MiwgICAgNjIsICAgMTg1LAorICAgICAtMTksICAtMTM1LCAgIDE4OCwgICAxOTAsICAgIDQyLCAgIDEwMywgICAxOTQsICAgIDg1LCAgICA3MCwgICAyMjIsCisgICAgICA3MCwgICAxMzIsICAtMTM1LCAgIDE5MSwgIC0xMzUsICAtMTM1LCAgLTEzNSwgIC0xMzUsICAtMTM1LCAgIDEyNywKKyAgICAtMTM1LCAgICA2MiwgICAgNjIsICAgMTkxLCAgIDEwNCwgICAxMDQsICAtMTM1LCAgLTEzNSwgICAxOTMsICAgMjAzLAorICAgICAgIDksICAgIDYyLCAgICA1NiwgICAgNTYsICAgIDYyLCAgIDE2MSwgICAxMDQsICAtMTM1LCAgIDE5NiwgIC0xMzUsCisgICAgLTEzNSwgIC0xMzUsICAtMTM1LCAgIDIzMywgIC0xMzUsICAtMTM1LCAgIDIwNCwgICAgNTYsICAgIDU2LCAgIDIyMSwKKyAgICAtMTM1LCAgLTEzNSwgIC0xMzUsICAtMTM1LCAgLTEzNSwgIC0xMzUsICAtMTM1LCAgLTEzNSwgIC0xMzUsICAtMTM1LAorICAgIC0xMzUsICAtMTM1LCAgLTEzNSwgIC0xMzUsICAtMTM1LCAgLTEzNSwgIC0xMzUsICAtMTM1LCAgLTEzNSwgIC0xMzUsCisgICAgLTEzNSwgIC0xMzUsICAtMTM1LCAgIDIxOSwgIC0xMzUsICAtMTM1LCAgLTEzNSwgIC0xMzUsICAtMTM1LCAgICA2MiwKKyAgICAgMjA5LCAgIDIxMiwgICAyNDAsICAgMjI0LCAgIDI0MCwgICAgLTEsICAgMjQwLCAgIDEwNCwgICAgNDEsICAgMjI1LAorICAgIC0xMzUsICAtMTM1LCAgIDI0MCwgICAyMjYsICAgMjQwLCAgIDIxOCwgIC0xMzUsICAtMTM1LCAgICA2MiwgICAyMjcsCisgICAgLTEzNSwgIC0xMzUsICAgMjI4LCAgIDIyOSwgICAyNDAsICAgMjMwLCAgLTEzNSwgIC0xMzUsICAgMjMxLCAgLTEzNSwKKyAgICAgMjMyLCAgLTEzNSwgICAxMTIsICAtMTM1LCAgLTEzNSwgIC0xMzUsICAgMjM0LCAgICA1NiwgIC0xMzUsICAtMTM1LAorICAgIC0xMzUsICAtMTM1LCAgLTEzNQogfTsKIAogLyogWVlQR09UT1tOVEVSTS1OVU1dLiAgKi8KIHN0YXRpYyBjb25zdCBzaG9ydCBpbnQgeXlwZ290b1tdID0KIHsKLSAgICAgLTc4LCAgIC03OCwgICAtNzgsICAgLTc4LCAgIDE2NCwgICAtMzYsICAgLTc4LCAgIC03OCwgICAtNzgsICAgLTc4LAotICAgICAyMzAsICAgLTc4LCAgIC03OCwgICAtNzgsICAgLTc4LCAgICAyOSwgICAtNzgsICAgLTc4LCAgIC03OCwgICAtNzgsCi0gICAgIC03OCwgICAtNzgsICAgLTc4LCAgIC03OCwgICAtNzgsICAgLTc4LCAgICA1OSwgICAtNzgsICAgLTc4LCAgIC03OCwKLSAgICAgLTc4LCAgIC03OCwgICAxOTgsICAgMjIwLCAgICAyNCwgICAxNTcsICAgIC01LCAgIDE2OSwgICAyMDIsICAgIDc0LAotICAgICAtNTMsICAgLTc3CisgICAgLTEzNSwgIC0xMzUsICAtMTM1LCAgLTEzNSwgICAgOTQsICAgLTQ1LCAgLTEzNSwgIC0xMzUsICAtMTM1LCAgLTEzNSwKKyAgICAgMjM3LCAgLTEzNSwgIC0xMzUsICAtMTM1LCAgLTEzNSwgIC0xMzUsICAtMTM1LCAgLTEzNSwgICAtNTQsICAtMTM1LAorICAgIC0xMzUsICAtMTM1LCAgLTEzNSwgIC0xMzUsICAtMTM1LCAgLTEzNSwgIC0xMzUsICAtMTM1LCAgLTEzNSwgICAgIDEsCisgICAgLTEzNSwgIC0xMzUsICAtMTM1LCAgLTEzNSwgIC0xMzUsICAgMTk1LCAgIDIzNSwgICAtNDQsICAgMTU5LCAgICAtNSwKKyAgICAgIDk4LCAgIDIxMCwgIC0xMzQsICAgLTUzLCAgIC03NwogfTsKIAogLyogWVlUQUJMRVtZWVBBQ1RbU1RBVEUtTlVNXV0uICBXaGF0IHRvIGRvIGluIHN0YXRlIFNUQVRFLU5VTS4gIElmCiAgICBwb3NpdGl2ZSwgc2hpZnQgdGhhdCB0b2tlbi4gIElmIG5lZ2F0aXZlLCByZWR1Y2UgdGhlIHJ1bGUgd2hpY2gKICAgIG51bWJlciBpcyB0aGUgb3Bwb3NpdGUuICBJZiB6ZXJvLCBkbyB3aGF0IFlZREVGQUNUIHNheXMuCiAgICBJZiBZWVRBQkxFX05JTkYsIHN5bnRheCBlcnJvci4gICovCi0jZGVmaW5lIFlZVEFCTEVfTklORiAtNzYKKyNkZWZpbmUgWVlUQUJMRV9OSU5GIC04Mgogc3RhdGljIGNvbnN0IHNob3J0IGludCB5eXRhYmxlW10gPQogewotICAgICAgNDYsICAgIDQ3LCAgICAgMywgICAgNDksICAgIDc5LCAgICA4MCwgICAgNTIsICAgMTMzLCAgIDEzNCwgICAgNDMsCi0gICAgICAgNiwgICAgIDcsICAgICA4LCAgICAgOSwgICAgMTAsICAgIDExLCAgICAxMiwgICAgMTMsICAgIDQ4LCAgIDE0NSwKLSAgICAgIDE0LCAgICAxNSwgICAxMzcsICAgIDU1LCAgICA1NiwgICAgNDQsICAgIDQ1LCAgICA1NywgICAxMzEsICAgMTMyLAotICAgICAxMDksICAgIDUwLCAgICA1OCwgICAxMjIsICAgIDUxLCAgIDEyMiwgICAgMjQsICAgMTM4LCAgIDEzOSwgICAtMjgsCi0gICAgICA4OCwgICAxNDMsICAgLTI4LCAgIC0yOCwgICAtMjgsICAgLTI4LCAgIC0yOCwgICAtMjgsICAgLTI4LCAgIC0yOCwKLSAgICAgLTI4LCAgICA4OSwgICAgNTMsICAgLTI4LCAgIC0yOCwgICAgOTAsICAgIDkxLCAgIC0yOCwgICAgOTIsICAgIDkzLAotICAgICAgOTQsICAgIDk1LCAgICA5NiwgICAgNTQsICAgIDk3LCAgICA1NSwgICAgNTYsICAgIDg4LCAgIDE2MSwgICAgOTgsCi0gICAgIC02NiwgICAtNjYsICAgLTY2LCAgIC02NiwgICAtNjYsICAgLTY2LCAgIC02NiwgICAtNjYsICAgIDgxLCAgICA4MiwKLSAgICAgLTY2LCAgIC02NiwgICAgOTAsICAgIDkxLCAgIDE1MiwgICAgNTUsICAgIDU2LCAgIDE0MCwgICAgNjEsICAgIDU3LAotICAgICAxMTIsICAgIDk3LCAgICA4NCwgICAxMjMsICAgIDU4LCAgIDEyMywgICAxMjEsICAgMTE3LCAgICA4NSwgICAxMjUsCi0gICAgIDE0OSwgICAgNjIsICAgMTY3LCAgIC0zMCwgICAgODgsICAgIDYzLCAgIC0zMCwgICAtMzAsICAgLTMwLCAgIC0zMCwKLSAgICAgLTMwLCAgIC0zMCwgICAtMzAsICAgLTMwLCAgIC0zMCwgICAgODksICAgIDcyLCAgIC0zMCwgICAtMzAsICAgIDkwLAotICAgICAgOTEsICAgLTMwLCAgICA5MiwgICAgOTMsICAgIDk0LCAgICA5NSwgICAgOTYsICAgMTE5LCAgICA5NywgICAxMjcsCi0gICAgIDE0NCwgICAtNzUsICAgIDg4LCAgICA5OCwgICAtNzUsICAgLTc1LCAgIC03NSwgICAtNzUsICAgLTc1LCAgIC03NSwKLSAgICAgLTc1LCAgIC03NSwgICAtNzUsICAgIDc0LCAgICA3NSwgICAtNzUsICAgLTc1LCAgICA5MCwgICAgOTEsICAgLTc1LAotICAgICAtNzUsICAgLTc1LCAgIC03NSwgICAtNzUsICAgLTc1LCAgICA3NiwgICAgOTcsICAgIDc3LCAgICA3OCwgICAgLTIsCi0gICAgICAgNCwgICAxMjEsICAgICA1LCAgICAgNiwgICAgIDcsICAgICA4LCAgICAgOSwgICAgMTAsICAgIDExLCAgICAxMiwKLSAgICAgIDEzLCAgICA4NiwgICAgODcsICAgIDE0LCAgICAxNSwgICAgMTYsICAgMTI5LCAgICAxNywgICAgMTgsICAgIDE5LAotICAgICAgMjAsICAgIDIxLCAgICAyMiwgICAgODgsICAgIDIzLCAgIDEzNSwgICAxMzYsICAgLTQzLCAgIC00MywgICAgMjQsCi0gICAgIC00MywgICAtNDMsICAgLTQzLCAgIC00MywgICAgODksICAgMTQ2LCAgIC00MywgICAtNDMsICAgIDkwLCAgICA5MSwKLSAgICAgMTA0LCAgIDEwNSwgICAxMDYsICAgMTA3LCAgIDE1NSwgICAgIDcsICAgICA4LCAgICA5NywgICAgMTAsICAgIDExLAotICAgICAgMTIsICAgIDEzLCAgIDEwOCwgICAxNDgsICAgIDE0LCAgICAxNSwgICAxNTgsICAgMTU5LCAgIDE2MCwgICAxNDcsCi0gICAgIDE1MSwgICAgODEsICAgIDgyLCAgIDE2MywgICAxMzAsICAgMTY1LCAgIDE1NSwgICAgODEsICAgIDgyLCAgICA4MiwKLSAgICAgIDI0LCAgIDExMywgICAxMTYsICAgMTU3LCAgIDEyNCwgICAxNzEsICAgMTE1LCAgIDEyMCwgICAxNjIsICAgMTI4LAotICAgICAgNzIsICAgIDgxLCAgICA4MiwgICAxNTMsICAgIDgxLCAgICA4MiwgICAxNTQsICAgIDgxLCAgICA4MiwgICAxNjYsCi0gICAgICA4MSwgICAgODIsICAgMTY0LCAgIDE2OCwgICAxNjksICAgMTcwLCAgIDE3MiwgICAxNzMsICAgMTc0LCAgICA2NSwKLSAgICAgIDcxLCAgICA4MywgICAgIDAsICAgMTUwLCAgIDExMQorICAgICAgNDYsICAgIDQ3LCAgICAgMywgICAgNDksICAgIDc5LCAgICA4MCwgICAgNTIsICAgMTM1LCAgIDEzNiwgICAgODQsCisgICAgIDE2MSwgICAxNjIsICAgMTYzLCAgIDE1OCwgICAxMTksICAgIDg1LCAgIDEyNywgICAgNDMsICAgMTY4LCAgIDE0NywKKyAgICAgMTcwLCAgIDExMSwgICAxMTQsICAgIDQ4LCAgIDEyNCwgICAxMjUsICAgMTI0LCAgIDEyNSwgICAxMzMsICAgMTM0LAorICAgICAxNzYsICAgIDgxLCAgICA4MiwgICAgNTMsICAgMTM5LCAgICA1NSwgICAgNTYsICAgMTQwLCAgIDE0MSwgICAgNTcsCisgICAgICA1NCwgICAxNDUsICAgLTI4LCAgICA4OCwgICAgNTgsICAgLTI4LCAgIC0yOCwgICAtMjgsICAgLTI4LCAgIC0yOCwKKyAgICAgLTI4LCAgIC0yOCwgICAtMjgsICAgLTI4LCAgICA4OSwgICAgNTAsICAgLTI4LCAgIC0yOCwgICAgOTAsICAgIDkxLAorICAgICAtMjgsICAgIDkyLCAgICA5MywgICAgOTQsICAgIDk1LCAgICA5NiwgICAgOTcsICAgMTY1LCAgICA5OCwgICAxMjEsCisgICAgIDE2NCwgICAxMjksICAgMTY2LCAgICA5OSwgICAgIDYsICAgICA3LCAgICAgOCwgICAgIDksICAgIDEwLCAgICAxMSwKKyAgICAgIDEyLCAgICAxMywgICAgNDQsICAgIDQ1LCAgICAxNCwgICAgMTUsICAgMTU1LCAgIDE0MiwgICAgNTUsICAgIDU2LAorICAgICAgIDcsICAgICA4LCAgICA1NywgICAgMTAsICAgIDExLCAgICAxMiwgICAgMTMsICAgIDU4LCAgICA1MSwgICAgMTQsCisgICAgICAxNSwgICAgMjQsICAgMTUyLCAgIC0zMCwgICAgODgsICAgMTcyLCAgIC0zMCwgICAtMzAsICAgLTMwLCAgIC0zMCwKKyAgICAgLTMwLCAgIC0zMCwgICAtMzAsICAgLTMwLCAgIC0zMCwgICAgODksICAgIDI0LCAgIC0zMCwgICAtMzAsICAgIDkwLAorICAgICAgOTEsICAgLTMwLCAgICA5MiwgICAgOTMsICAgIDk0LCAgICA5NSwgICAgOTYsICAgIDk3LCAgICA2MSwgICAgOTgsCisgICAgICA1NSwgICAgNTYsICAgLTgxLCAgICA4OCwgICAgOTksICAgLTgxLCAgIC04MSwgICAtODEsICAgLTgxLCAgIC04MSwKKyAgICAgLTgxLCAgIC04MSwgICAtODEsICAgLTgxLCAgICA4MSwgICAgODIsICAgLTgxLCAgIC04MSwgICAgOTAsICAgIDkxLAorICAgICAtODEsICAgLTgxLCAgIC04MSwgICAtODEsICAgLTgxLCAgIC04MSwgICAxMzIsICAgIDYyLCAgICA5OCwgICAgODEsCisgICAgICA4MiwgICAxMTUsICAgMTE4LCAgIDEyMywgICAxMjYsICAgMTE3LCAgIDEyMiwgICAgNjMsICAgMTMwLCAgICA3MiwKKyAgICAgIC0yLCAgICAgNCwgICAxODIsICAgICA1LCAgICAgNiwgICAgIDcsICAgICA4LCAgICAgOSwgICAgMTAsICAgIDExLAorICAgICAgMTIsICAgIDEzLCAgICA3NCwgICAgNzUsICAgIDE0LCAgICAxNSwgICAgMTYsICAgMTQ2LCAgICAxNywgICAgMTgsCisgICAgICAxOSwgICAgMjAsICAgIDIxLCAgICAyMiwgICAgNzYsICAgIDg4LCAgICAyMywgICAxNDksICAgIDc3LCAgIC00OSwKKyAgICAgLTQ5LCAgICAyNCwgICAtNDksICAgLTQ5LCAgIC00OSwgICAtNDksICAgIDg5LCAgICA3OCwgICAtNDksICAgLTQ5LAorICAgICAgOTAsICAgIDkxLCAgIDEwNiwgICAxMDcsICAgMTA4LCAgIDEwOSwgICAgNzIsICAgIDgxLCAgICA4MiwgICAgODYsCisgICAgICA5OCwgICAgODcsICAgMTMxLCAgICA4OCwgICAxMzcsICAgMTEwLCAgIC03MiwgICAtNzIsICAgLTcyLCAgIC03MiwKKyAgICAgLTcyLCAgIC03MiwgICAtNzIsICAgLTcyLCAgIDEzOCwgICAxNTEsICAgLTcyLCAgIC03MiwgICAgOTAsICAgIDkxLAorICAgICAxNTYsICAgIDgxLCAgICA4MiwgICAxNTcsICAgIDgxLCAgICA4MiwgICAxNTAsICAgMTU0LCAgICA5OCwgICAxNzEsCisgICAgICA4MSwgICAgODIsICAgIDgyLCAgIDEyMywgICAxNTgsICAgMTYwLCAgIDE2NywgICAxNjksICAgMTczLCAgIDE3NCwKKyAgICAgMTc1LCAgIDExMywgICAxNzksICAgMTgwLCAgIDE3NywgICAxODEsICAgIDY1LCAgIDE1MywgICAgIDAsICAgIDgzLAorICAgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICA3MQogfTsKIAogc3RhdGljIGNvbnN0IHNob3J0IGludCB5eWNoZWNrW10gPQogewotICAgICAgIDUsICAgICA2LCAgICAgMCwgICAgIDgsICAgIDU3LCAgICA1OCwgICAgMTEsICAgIDg0LCAgICA4NSwgICAgMzAsCi0gICAgICAgNCwgICAgIDUsICAgICA2LCAgICAgNywgICAgIDgsICAgICA5LCAgICAxMCwgICAgMTEsICAgIDMwLCAgICA5NiwKLSAgICAgIDE0LCAgICAxNSwgICAgMjQsICAgIDI1LCAgICAyNiwgICAgMjUsICAgIDI2LCAgICAyOSwgICAgODEsICAgIDgyLAotICAgICAgNjYsICAgIDMwLCAgICAzNCwgICAgNjksICAgIDMwLCAgICA3MSwgICAgMzAsICAgIDkwLCAgICA5MSwgICAgIDAsCi0gICAgICAgMSwgICAgOTQsICAgICAzLCAgICAgNCwgICAgIDUsICAgICA2LCAgICAgNywgICAgIDgsICAgICA5LCAgICAxMCwKLSAgICAgIDExLCAgICAxMiwgICAgMjUsICAgIDE0LCAgICAxNSwgICAgMTYsICAgIDE3LCAgICAxOCwgICAgMTksICAgIDIwLAotICAgICAgMjEsICAgIDIyLCAgICAyMywgICAgMjUsICAgIDI1LCAgICAyNSwgICAgMjYsICAgICAxLCAgIDE0NSwgICAgMzAsCi0gICAgICAgNCwgICAgIDUsICAgICA2LCAgICAgNywgICAgIDgsICAgICA5LCAgICAxMCwgICAgMTEsICAgIDMxLCAgICAzMiwKLSAgICAgIDE0LCAgICAxNSwgICAgMTYsICAgIDE3LCAgIDEzNywgICAgMjUsICAgIDI2LCAgICA5MiwgICAgMzAsICAgIDI5LAotICAgICAgNjYsICAgIDI1LCAgICAyNywgICAgNjksICAgIDM0LCAgICA3MSwgICAgMzAsICAgIDY4LCAgICAzMywgICAgNzAsCi0gICAgIDEwNSwgICAgIDEsICAgMTU1LCAgICAgMCwgICAgIDEsICAgICAxLCAgICAgMywgICAgIDQsICAgICA1LCAgICAgNiwKLSAgICAgICA3LCAgICAgOCwgICAgIDksICAgIDEwLCAgICAxMSwgICAgMTIsICAgIDMwLCAgICAxNCwgICAgMTUsICAgIDE2LAotICAgICAgMTcsICAgIDE4LCAgICAxOSwgICAgMjAsICAgIDIxLCAgICAyMiwgICAgMjMsICAgIDY4LCAgICAyNSwgICAgNzAsCi0gICAgICAyNSwgICAgIDAsICAgICAxLCAgICAzMCwgICAgIDMsICAgICA0LCAgICAgNSwgICAgIDYsICAgICA3LCAgICAgOCwKLSAgICAgICA5LCAgICAxMCwgICAgMTEsICAgIDMwLCAgICAzMCwgICAgMTQsICAgIDE1LCAgICAxNiwgICAgMTcsICAgIDE4LAotICAgICAgMTksICAgIDIwLCAgICAyMSwgICAgMjIsICAgIDIzLCAgICAzMCwgICAgMjUsICAgIDMwLCAgICAzMCwgICAgIDAsCi0gICAgICAgMSwgICAgMzAsICAgICAzLCAgICAgNCwgICAgIDUsICAgICA2LCAgICAgNywgICAgIDgsICAgICA5LCAgICAxMCwKLSAgICAgIDExLCAgICAzMCwgICAgMzAsICAgIDE0LCAgICAxNSwgICAgMTYsICAgIDMwLCAgICAxOCwgICAgMTksICAgIDIwLAotICAgICAgMjEsICAgIDIyLCAgICAyMywgICAgIDEsICAgIDI1LCAgICAzMCwgICAgMzAsICAgICA1LCAgICAgNiwgICAgMzAsCi0gICAgICAgOCwgICAgIDksICAgIDEwLCAgICAxMSwgICAgMTIsICAgICAxLCAgICAxNCwgICAgMTUsICAgIDE2LCAgICAxNywKLSAgICAgIDE4LCAgICAxOSwgICAgMjAsICAgIDIxLCAgICAxNCwgICAgIDUsICAgICA2LCAgICAyNSwgICAgIDgsICAgICA5LAotICAgICAgMTAsICAgIDExLCAgICAzMCwgICAgMzAsICAgIDE0LCAgICAxNSwgICAxNDIsICAgMTQzLCAgIDE0NCwgICAgMTMsCi0gICAgICAyNSwgICAgMzEsICAgIDMyLCAgIDE0OSwgICAgMjgsICAgMTUxLCAgICAxNCwgICAgMzEsICAgIDMyLCAgICAzMiwKLSAgICAgIDMwLCAgICA2NywgICAgNjgsICAgIDMwLCAgICA3MCwgICAxNjEsICAgIDY3LCAgICA2OCwgICAgMzAsICAgIDcwLAotICAgICAgMzAsICAgIDMxLCAgICAzMiwgICAgMzAsICAgIDMxLCAgICAzMiwgICAgMzAsICAgIDMxLCAgICAzMiwgICAgMzAsCi0gICAgICAzMSwgICAgMzIsICAgIDMwLCAgICAzMCwgICAgMzAsICAgIDMwLCAgICAzMCwgICAgMzAsICAgIDMwLCAgICAyOSwKLSAgICAgIDQwLCAgICA1OSwgICAgLTEsICAgMTA2LCAgICA2NgorICAgICAgIDUsICAgICA2LCAgICAgMCwgICAgIDgsICAgIDU3LCAgICA1OCwgICAgMTEsICAgIDg0LCAgICA4NSwgICAgMjgsCisgICAgIDE0NCwgICAxNDUsICAgMTQ2LCAgICAxNCwgICAgNjgsICAgIDM0LCAgICA3MCwgICAgMzEsICAgMTUyLCAgICA5NiwKKyAgICAgMTU0LCAgICA2NiwgICAgNjYsICAgIDMxLCAgICA2OSwgICAgNjksICAgIDcxLCAgICA3MSwgICAgODEsICAgIDgyLAorICAgICAxNjQsICAgIDMyLCAgICAzMywgICAgMjYsICAgIDI1LCAgICAyNiwgICAgMjcsICAgIDkwLCAgICA5MSwgICAgMzAsCisgICAgICAyNiwgICAgOTQsICAgICAwLCAgICAgMSwgICAgMzUsICAgICAzLCAgICAgNCwgICAgIDUsICAgICA2LCAgICAgNywKKyAgICAgICA4LCAgICAgOSwgICAgMTAsICAgIDExLCAgICAxMiwgICAgMzEsICAgIDE0LCAgICAxNSwgICAgMTYsICAgIDE3LAorICAgICAgMTgsICAgIDE5LCAgICAyMCwgICAgMjEsICAgIDIyLCAgICAyMywgICAgMjQsICAgIDI2LCAgICAyNiwgICAgNjgsCisgICAgIDE0NywgICAgNzAsICAgIDMxLCAgICAzMSwgICAgIDQsICAgICA1LCAgICAgNiwgICAgIDcsICAgICA4LCAgICAgOSwKKyAgICAgIDEwLCAgICAxMSwgICAgMjYsICAgIDI3LCAgICAxNCwgICAgMTUsICAgMTM5LCAgICA5MiwgICAgMjYsICAgIDI3LAorICAgICAgIDUsICAgICA2LCAgICAzMCwgICAgIDgsICAgICA5LCAgICAxMCwgICAgMTEsICAgIDM1LCAgICAzMSwgICAgMTQsCisgICAgICAxNSwgICAgMzEsICAgMTA3LCAgICAgMCwgICAgIDEsICAgMTU4LCAgICAgMywgICAgIDQsICAgICA1LCAgICAgNiwKKyAgICAgICA3LCAgICAgOCwgICAgIDksICAgIDEwLCAgICAxMSwgICAgMTIsICAgIDMxLCAgICAxNCwgICAgMTUsICAgIDE2LAorICAgICAgMTcsICAgIDE4LCAgICAxOSwgICAgMjAsICAgIDIxLCAgICAyMiwgICAgMjMsICAgIDI0LCAgICAzMSwgICAgMjYsCisgICAgICAyNiwgICAgMjcsICAgICAwLCAgICAgMSwgICAgMzEsICAgICAzLCAgICAgNCwgICAgIDUsICAgICA2LCAgICAgNywKKyAgICAgICA4LCAgICAgOSwgICAgMTAsICAgIDExLCAgICAzMiwgICAgMzMsICAgIDE0LCAgICAxNSwgICAgMTYsICAgIDE3LAorICAgICAgMTgsICAgIDE5LCAgICAyMCwgICAgMjEsICAgIDIyLCAgICAyMywgICAgMjksICAgICAxLCAgICAyNiwgICAgMzIsCisgICAgICAzMywgICAgNjcsICAgIDY4LCAgICAzMSwgICAgNzAsICAgIDY3LCAgICA2OCwgICAgIDEsICAgIDcwLCAgICAzMSwKKyAgICAgICAwLCAgICAgMSwgICAxNzcsICAgICAzLCAgICAgNCwgICAgIDUsICAgICA2LCAgICAgNywgICAgIDgsICAgICA5LAorICAgICAgMTAsICAgIDExLCAgICAzMSwgICAgMzEsICAgIDE0LCAgICAxNSwgICAgMTYsICAgIDI2LCAgICAxOCwgICAgMTksCisgICAgICAyMCwgICAgMjEsICAgIDIyLCAgICAyMywgICAgMzEsICAgICAxLCAgICAyNiwgICAgIDEsICAgIDMxLCAgICAgNSwKKyAgICAgICA2LCAgICAzMSwgICAgIDgsICAgICA5LCAgICAxMCwgICAgMTEsICAgIDEyLCAgICAzMSwgICAgMTQsICAgIDE1LAorICAgICAgMTYsICAgIDE3LCAgICAxOCwgICAgMTksICAgIDIwLCAgICAyMSwgICAgMzEsICAgIDMyLCAgICAzMywgICAgMzEsCisgICAgICAyNiwgICAgMzEsICAgIDMxLCAgICAgMSwgICAgMzEsICAgIDMxLCAgICAgNCwgICAgIDUsICAgICA2LCAgICAgNywKKyAgICAgICA4LCAgICAgOSwgICAgMTAsICAgIDExLCAgICAzMSwgICAgMzEsICAgIDE0LCAgICAxNSwgICAgMTYsICAgIDE3LAorICAgICAgMzEsICAgIDMyLCAgICAzMywgICAgMzEsICAgIDMyLCAgICAzMywgICAgMTMsICAgIDI2LCAgICAyNiwgICAgMzEsCisgICAgICAzMiwgICAgMzMsICAgIDMzLCAgICAzMSwgICAgMTQsICAgIDMxLCAgICAzMSwgICAgMzEsICAgIDMxLCAgICAzMSwKKyAgICAgIDMxLCAgICA2NiwgICAgMzEsICAgIDMxLCAgICAzNCwgICAgMzEsICAgIDI5LCAgIDEwOCwgICAgLTEsICAgIDU5LAorICAgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICA0MAogfTsKIAogLyogWVlTVE9TW1NUQVRFLU5VTV0gLS0gVGhlIChpbnRlcm5hbCBudW1iZXIgb2YgdGhlKSBhY2Nlc3NpbmcKICAgIHN5bWJvbCBvZiBzdGF0ZSBTVEFURS1OVU0uICAqLwogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgeXlzdG9zW10gPQogewotICAgICAgIDAsICAgIDM2LCAgICAzNywgICAgIDAsICAgICAxLCAgICAgMywgICAgIDQsICAgICA1LCAgICAgNiwgICAgIDcsCisgICAgICAgMCwgICAgMzcsICAgIDM4LCAgICAgMCwgICAgIDEsICAgICAzLCAgICAgNCwgICAgIDUsICAgICA2LCAgICAgNywKICAgICAgICA4LCAgICAgOSwgICAgMTAsICAgIDExLCAgICAxNCwgICAgMTUsICAgIDE2LCAgICAxOCwgICAgMTksICAgIDIwLAotICAgICAgMjEsICAgIDIyLCAgICAyMywgICAgMjUsICAgIDMwLCAgICAzOCwgICAgMzksICAgIDQxLCAgICA0MiwgICAgNDMsCi0gICAgICA0NCwgICAgNDcsICAgIDQ4LCAgICA1MCwgICAgNTQsICAgIDU2LCAgICA1OCwgICAgNTksICAgIDYxLCAgICA2MywKLSAgICAgIDY0LCAgICA2NSwgICAgNzIsICAgIDMwLCAgICAyNSwgICAgMjYsICAgIDcxLCAgICA3MSwgICAgMzAsICAgIDcxLAotICAgICAgMzAsICAgIDMwLCAgICA3MSwgICAgMjUsICAgIDI1LCAgICAyNSwgICAgMjYsICAgIDI5LCAgICAzNCwgICAgNzUsCi0gICAgICA3NiwgICAgMzAsICAgICAxLCAgICAgMSwgICAgNDUsICAgIDQ1LCAgICA1MSwgICAgNTMsICAgIDU3LCAgICA2OCwKLSAgICAgIDYyLCAgICA2OCwgICAgMzAsICAgIDczLCAgICAzMCwgICAgMzAsICAgIDMwLCAgICAzMCwgICAgMzAsICAgIDc1LAotICAgICAgNzUsICAgIDMxLCAgICAzMiwgICAgNzMsICAgIDI3LCAgICAzMywgICAgMzAsICAgIDMwLCAgICAgMSwgICAgMTIsCi0gICAgICAxNiwgICAgMTcsICAgIDE5LCAgICAyMCwgICAgMjEsICAgIDIyLCAgICAyMywgICAgMjUsICAgIDMwLCAgICA0MCwKLSAgICAgIDQ2LCAgICA2NiwgICAgNjcsICAgIDY5LCAgICAxOCwgICAgMTksICAgIDIwLCAgICAyMSwgICAgMzAsICAgIDQwLAotICAgICAgNTIsICAgIDY3LCAgICA2OSwgICAgMzksICAgIDQ5LCAgICA3MiwgICAgMzksICAgIDUwLCAgICA1NSwgICAgNjEsCi0gICAgICA3MiwgICAgMzAsICAgIDQwLCAgICA2OSwgICAgMzksICAgIDUwLCAgICA2MCwgICAgNjEsICAgIDcyLCAgICAzMCwKLSAgICAgIDI4LCAgICA3NSwgICAgNzUsICAgIDc2LCAgICA3NiwgICAgMzAsICAgIDMwLCAgICAyNCwgICAgNzUsICAgIDc1LAotICAgICAgNzEsICAgIDcwLCAgICA3MSwgICAgNzUsICAgIDI1LCAgICA3NiwgICAgIDEsICAgIDEzLCAgICAzMCwgICAgNzEsCi0gICAgICA3MCwgICAgMjUsICAgIDc1LCAgICAzMCwgICAgMzAsICAgIDE0LCAgICA3NCwgICAgMzAsICAgIDc0LCAgICA3NCwKLSAgICAgIDc0LCAgICA3NiwgICAgMzAsICAgIDc0LCAgICAzMCwgICAgNzQsICAgIDMwLCAgICA3NSwgICAgMzAsICAgIDMwLAotICAgICAgMzAsICAgIDc0LCAgICAzMCwgICAgMzAsICAgIDMwCisgICAgICAyMSwgICAgMjIsICAgIDIzLCAgICAyNiwgICAgMzEsICAgIDM5LCAgICA0MCwgICAgNDIsICAgIDQzLCAgICA0NCwKKyAgICAgIDQ1LCAgICA1MSwgICAgNTIsICAgIDU0LCAgICA1OCwgICAgNjAsICAgIDYyLCAgICA2MywgICAgNjUsICAgIDY3LAorICAgICAgNjgsICAgIDY5LCAgICA3NiwgICAgMzEsICAgIDI2LCAgICAyNywgICAgNzUsICAgIDc1LCAgICAzMSwgICAgNzUsCisgICAgICAzMSwgICAgMzEsICAgIDc1LCAgICAyNiwgICAgMjYsICAgIDI2LCAgICAyNywgICAgMzAsICAgIDM1LCAgICA3OSwKKyAgICAgIDgwLCAgICAzMSwgICAgIDEsICAgICAxLCAgICA0NiwgICAgNDYsICAgIDU1LCAgICA1NywgICAgNjEsICAgIDcyLAorICAgICAgNjYsICAgIDcyLCAgICAzMSwgICAgNzcsICAgIDMxLCAgICAzMSwgICAgMzEsICAgIDMxLCAgICAzMSwgICAgNzksCisgICAgICA3OSwgICAgMzIsICAgIDMzLCAgICA3NywgICAgMjgsICAgIDM0LCAgICAzMSwgICAgMzEsICAgICAxLCAgICAxMiwKKyAgICAgIDE2LCAgICAxNywgICAgMTksICAgIDIwLCAgICAyMSwgICAgMjIsICAgIDIzLCAgICAyNCwgICAgMjYsICAgIDMxLAorICAgICAgNDEsICAgIDQ3LCAgICA0OCwgICAgNzAsICAgIDcxLCAgICA3MywgICAgMTgsICAgIDE5LCAgICAyMCwgICAgMjEsCisgICAgICAzMSwgICAgNDEsICAgIDU2LCAgICA3MSwgICAgNzMsICAgIDQwLCAgICA1MywgICAgNzYsICAgIDQwLCAgICA1NCwKKyAgICAgIDU5LCAgICA2NSwgICAgNzYsICAgIDMxLCAgICA0MSwgICAgNzMsICAgIDQwLCAgICA1NCwgICAgNjQsICAgIDY1LAorICAgICAgNzYsICAgIDMxLCAgICAyOSwgICAgNzksICAgIDc5LCAgICA4MCwgICAgODAsICAgIDMxLCAgICAzMSwgICAgMjUsCisgICAgICA3OSwgICAgNzksICAgIDc1LCAgICA3NCwgICAgNzUsICAgIDc5LCAgICAyNiwgICAgODAsICAgIDQ5LCAgICAgMSwKKyAgICAgIDEzLCAgICAzMSwgICAgNzUsICAgIDc0LCAgICAyNiwgICAgNzksICAgIDMxLCAgICAzMSwgICAgMTQsICAgIDc4LAorICAgICAgMzEsICAgIDc4LCAgICA3OCwgICAgNzgsICAgIDgwLCAgICAyNiwgICAgMzEsICAgIDMxLCAgICA3OCwgICAgMzEsCisgICAgICA3OCwgICAgMzEsICAgIDc5LCAgICAzMSwgICAgMzEsICAgIDMxLCAgICA3OCwgICAgMzQsICAgIDUwLCAgICAzMSwKKyAgICAgIDMxLCAgICAzMSwgICAgNzUKIH07CiAKLSNpZiAhIGRlZmluZWQgKFlZU0laRV9UKSAmJiBkZWZpbmVkIChfX1NJWkVfVFlQRV9fKQotIyBkZWZpbmUgWVlTSVpFX1QgX19TSVpFX1RZUEVfXwotI2VuZGlmCi0jaWYgISBkZWZpbmVkIChZWVNJWkVfVCkgJiYgZGVmaW5lZCAoc2l6ZV90KQotIyBkZWZpbmUgWVlTSVpFX1Qgc2l6ZV90Ci0jZW5kaWYKLSNpZiAhIGRlZmluZWQgKFlZU0laRV9UKQotIyBpZiBkZWZpbmVkIChfX1NURENfXykgfHwgZGVmaW5lZCAoX19jcGx1c3BsdXMpCi0jICBpbmNsdWRlIDxzdGRkZWYuaD4gLyogSU5GUklOR0VTIE9OIFVTRVIgTkFNRSBTUEFDRSAqLwotIyAgZGVmaW5lIFlZU0laRV9UIHNpemVfdAotIyBlbmRpZgotI2VuZGlmCi0jaWYgISBkZWZpbmVkIChZWVNJWkVfVCkKLSMgZGVmaW5lIFlZU0laRV9UIHVuc2lnbmVkIGludAotI2VuZGlmCi0KICNkZWZpbmUgeXllcnJvawkJKHl5ZXJyc3RhdHVzID0gMCkKICNkZWZpbmUgeXljbGVhcmluCSh5eWNoYXIgPSBZWUVNUFRZKQogI2RlZmluZSBZWUVNUFRZCQkoLTIpCkBAIC03MDksOCArNzY1LDggQEAKICAgICAgIGdvdG8geXliYWNrdXA7CQkJCQkJXAogICAgIH0JCQkJCQkJCVwKICAgZWxzZQkJCQkJCQkJXAotICAgIHsgCQkJCQkJCQlcCi0gICAgICB5eWVycm9yICgic3ludGF4IGVycm9yOiBjYW5ub3QgYmFjayB1cCIpO1wKKyAgICB7CQkJCQkJCQlcCisgICAgICB5eWVycm9yIChZWV8oInN5bnRheCBlcnJvcjogY2Fubm90IGJhY2sgdXAiKSk7IFwKICAgICAgIFlZRVJST1I7CQkJCQkJCVwKICAgICB9CQkJCQkJCQlcCiB3aGlsZSAoMCkKQEAgLTc4OSw3ICs4NDUsNyBAQAogICBpZiAoeXlkZWJ1ZykJCQkJCQkJXAogICAgIHsJCQkJCQkJCVwKICAgICAgIFlZRlBSSU5URiAoc3RkZXJyLCAiJXMgIiwgVGl0bGUpOwkJCQlcCi0gICAgICB5eXN5bXByaW50IChzdGRlcnIsIAkJCQkJXAorICAgICAgeXlzeW1wcmludCAoc3RkZXJyLAkJCQkJXAogICAgICAgICAgICAgICAgICAgVHlwZSwgVmFsdWUpOwlcCiAgICAgICBZWUZQUklOVEYgKHN0ZGVyciwgIlxuIik7CQkJCQlcCiAgICAgfQkJCQkJCQkJXApAQCAtODM3LDEzICs4OTMsMTMgQEAKICNlbmRpZgogewogICBpbnQgeXlpOwotICB1bnNpZ25lZCBpbnQgeXlsbm8gPSB5eXJsaW5lW3l5cnVsZV07Ci0gIFlZRlBSSU5URiAoc3RkZXJyLCAiUmVkdWNpbmcgc3RhY2sgYnkgcnVsZSAlZCAobGluZSAldSksICIsCisgIHVuc2lnbmVkIGxvbmcgaW50IHl5bG5vID0geXlybGluZVt5eXJ1bGVdOworICBZWUZQUklOVEYgKHN0ZGVyciwgIlJlZHVjaW5nIHN0YWNrIGJ5IHJ1bGUgJWQgKGxpbmUgJWx1KSwgIiwKICAgICAgICAgICAgICB5eXJ1bGUgLSAxLCB5eWxubyk7CiAgIC8qIFByaW50IHRoZSBzeW1ib2xzIGJlaW5nIHJlZHVjZWQsIGFuZCB0aGVpciByZXN1bHQuICAqLwogICBmb3IgKHl5aSA9IHl5cHJoc1t5eXJ1bGVdOyAwIDw9IHl5cmhzW3l5aV07IHl5aSsrKQotICAgIFlZRlBSSU5URiAoc3RkZXJyLCAiJXMgIiwgeXl0bmFtZSBbeXlyaHNbeXlpXV0pOwotICBZWUZQUklOVEYgKHN0ZGVyciwgIi0+ICVzXG4iLCB5eXRuYW1lIFt5eXIxW3l5cnVsZV1dKTsKKyAgICBZWUZQUklOVEYgKHN0ZGVyciwgIiVzICIsIHl5dG5hbWVbeXlyaHNbeXlpXV0pOworICBZWUZQUklOVEYgKHN0ZGVyciwgIi0+ICVzXG4iLCB5eXRuYW1lW3l5cjFbeXlydWxlXV0pOwogfQogCiAjIGRlZmluZSBZWV9SRURVQ0VfUFJJTlQoUnVsZSkJCVwKQEAgLTg3Miw3ICs5MjgsNyBAQAogICAgaWYgdGhlIGJ1aWx0LWluIHN0YWNrIGV4dGVuc2lvbiBtZXRob2QgaXMgdXNlZCkuCiAKICAgIERvIG5vdCBtYWtlIHRoaXMgdmFsdWUgdG9vIGxhcmdlOyB0aGUgcmVzdWx0cyBhcmUgdW5kZWZpbmVkIGlmCi0gICBTSVpFX01BWCA8IFlZU1RBQ0tfQllURVMgKFlZTUFYREVQVEgpCisgICBZWVNUQUNLX0FMTE9DX01BWElNVU0gPCBZWVNUQUNLX0JZVEVTIChZWU1BWERFUFRIKQogICAgZXZhbHVhdGVkIHdpdGggaW5maW5pdGUtcHJlY2lzaW9uIGludGVnZXIgYXJpdGhtZXRpYy4gICovCiAKICNpZm5kZWYgWVlNQVhERVBUSApAQCAtODk2LDcgKzk1Miw3IEBACiAgICAgIGNvbnN0IGNoYXIgKnl5c3RyOwogIyAgIGVuZGlmCiB7Ci0gIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnl5cyA9IHl5c3RyOworICBjb25zdCBjaGFyICp5eXMgPSB5eXN0cjsKIAogICB3aGlsZSAoKnl5cysrICE9ICdcMCcpCiAgICAgY29udGludWU7CkBAIC05MjEsOCArOTc3LDggQEAKICAgICAgY29uc3QgY2hhciAqeXlzcmM7CiAjICAgZW5kaWYKIHsKLSAgcmVnaXN0ZXIgY2hhciAqeXlkID0geXlkZXN0OwotICByZWdpc3RlciBjb25zdCBjaGFyICp5eXMgPSB5eXNyYzsKKyAgY2hhciAqeXlkID0geXlkZXN0OworICBjb25zdCBjaGFyICp5eXMgPSB5eXNyYzsKIAogICB3aGlsZSAoKCp5eWQrKyA9ICp5eXMrKykgIT0gJ1wwJykKICAgICBjb250aW51ZTsKQEAgLTkzMiw3ICs5ODgsNTUgQEAKICMgIGVuZGlmCiAjIGVuZGlmCiAKLSNlbmRpZiAvKiAhWVlFUlJPUl9WRVJCT1NFICovCisjIGlmbmRlZiB5eXRuYW1lcnIKKy8qIENvcHkgdG8gWVlSRVMgdGhlIGNvbnRlbnRzIG9mIFlZU1RSIGFmdGVyIHN0cmlwcGluZyBhd2F5IHVubmVjZXNzYXJ5CisgICBxdW90ZXMgYW5kIGJhY2tzbGFzaGVzLCBzbyB0aGF0IGl0J3Mgc3VpdGFibGUgZm9yIHl5ZXJyb3IuICBUaGUKKyAgIGhldXJpc3RpYyBpcyB0aGF0IGRvdWJsZS1xdW90aW5nIGlzIHVubmVjZXNzYXJ5IHVubGVzcyB0aGUgc3RyaW5nCisgICBjb250YWlucyBhbiBhcG9zdHJvcGhlLCBhIGNvbW1hLCBvciBiYWNrc2xhc2ggKG90aGVyIHRoYW4KKyAgIGJhY2tzbGFzaC1iYWNrc2xhc2gpLiAgWVlTVFIgaXMgdGFrZW4gZnJvbSB5eXRuYW1lLiAgSWYgWVlSRVMgaXMKKyAgIG51bGwsIGRvIG5vdCBjb3B5OyBpbnN0ZWFkLCByZXR1cm4gdGhlIGxlbmd0aCBvZiB3aGF0IHRoZSByZXN1bHQKKyAgIHdvdWxkIGhhdmUgYmVlbi4gICovCitzdGF0aWMgWVlTSVpFX1QKK3l5dG5hbWVyciAoY2hhciAqeXlyZXMsIGNvbnN0IGNoYXIgKnl5c3RyKQoreworICBpZiAoKnl5c3RyID09ICciJykKKyAgICB7CisgICAgICBzaXplX3QgeXluID0gMDsKKyAgICAgIGNoYXIgY29uc3QgKnl5cCA9IHl5c3RyOworCisgICAgICBmb3IgKDs7KQorCXN3aXRjaCAoKisreXlwKQorCSAgeworCSAgY2FzZSAnXCcnOgorCSAgY2FzZSAnLCc6CisJICAgIGdvdG8gZG9fbm90X3N0cmlwX3F1b3RlczsKKworCSAgY2FzZSAnXFwnOgorCSAgICBpZiAoKisreXlwICE9ICdcXCcpCisJICAgICAgZ290byBkb19ub3Rfc3RyaXBfcXVvdGVzOworCSAgICAvKiBGYWxsIHRocm91Z2guICAqLworCSAgZGVmYXVsdDoKKwkgICAgaWYgKHl5cmVzKQorCSAgICAgIHl5cmVzW3l5bl0gPSAqeXlwOworCSAgICB5eW4rKzsKKwkgICAgYnJlYWs7CisKKwkgIGNhc2UgJyInOgorCSAgICBpZiAoeXlyZXMpCisJICAgICAgeXlyZXNbeXluXSA9ICdcMCc7CisJICAgIHJldHVybiB5eW47CisJICB9CisgICAgZG9fbm90X3N0cmlwX3F1b3RlczogOworICAgIH0KKworICBpZiAoISB5eXJlcykKKyAgICByZXR1cm4geXlzdHJsZW4gKHl5c3RyKTsKKworICByZXR1cm4geXlzdHBjcHkgKHl5cmVzLCB5eXN0cikgLSB5eXJlczsKK30KKyMgZW5kaWYKKworI2VuZGlmIC8qIFlZRVJST1JfVkVSQk9TRSAqLwogCiAMCiAKQEAgLTk5OCw3ICsxMTAyLDcgQEAKIAogICBzd2l0Y2ggKHl5dHlwZSkKICAgICB7Ci0gICAgICBjYXNlIDQ4OiAvKiBjaG9pY2VfZW50cnkgKi8KKyAgICAgIGNhc2UgNTI6IC8qICJjaG9pY2VfZW50cnkiICovCiAKICAgICAgICAgewogCWZwcmludGYoc3RkZXJyLCAiJXM6JWQ6IG1pc3NpbmcgZW5kIHN0YXRlbWVudCBmb3IgdGhpcyBlbnRyeVxuIiwKQEAgLTEwMDgsNyArMTExMiw3IEBACiB9OwogCiAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSA1NDogLyogaWZfZW50cnkgKi8KKyAgICAgIGNhc2UgNTg6IC8qICJpZl9lbnRyeSIgKi8KIAogICAgICAgICB7CiAJZnByaW50ZihzdGRlcnIsICIlczolZDogbWlzc2luZyBlbmQgc3RhdGVtZW50IGZvciB0aGlzIGVudHJ5XG4iLApAQCAtMTAxOCw3ICsxMTIyLDcgQEAKIH07CiAKICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDU5OiAvKiBtZW51X2VudHJ5ICovCisgICAgICBjYXNlIDYzOiAvKiAibWVudV9lbnRyeSIgKi8KIAogICAgICAgICB7CiAJZnByaW50ZihzdGRlcnIsICIlczolZDogbWlzc2luZyBlbmQgc3RhdGVtZW50IGZvciB0aGlzIGVudHJ5XG4iLApAQCAtMTA4MiwxMyArMTE4NiwxMyBAQAogI2Vsc2UKIGludAogeXlwYXJzZSAoKQotCisgICAgOwogI2VuZGlmCiAjZW5kaWYKIHsKICAgCi0gIHJlZ2lzdGVyIGludCB5eXN0YXRlOwotICByZWdpc3RlciBpbnQgeXluOworICBpbnQgeXlzdGF0ZTsKKyAgaW50IHl5bjsKICAgaW50IHl5cmVzdWx0OwogICAvKiBOdW1iZXIgb2YgdG9rZW5zIHRvIHNoaWZ0IGJlZm9yZSBlcnJvciBtZXNzYWdlcyBlbmFibGVkLiAgKi8KICAgaW50IHl5ZXJyc3RhdHVzOwpAQCAtMTEwNiwxMiArMTIxMCwxMiBAQAogICAvKiBUaGUgc3RhdGUgc3RhY2suICAqLwogICBzaG9ydCBpbnQgeXlzc2FbWVlJTklUREVQVEhdOwogICBzaG9ydCBpbnQgKnl5c3MgPSB5eXNzYTsKLSAgcmVnaXN0ZXIgc2hvcnQgaW50ICp5eXNzcDsKKyAgc2hvcnQgaW50ICp5eXNzcDsKIAogICAvKiBUaGUgc2VtYW50aWMgdmFsdWUgc3RhY2suICAqLwogICBZWVNUWVBFIHl5dnNhW1lZSU5JVERFUFRIXTsKICAgWVlTVFlQRSAqeXl2cyA9IHl5dnNhOwotICByZWdpc3RlciBZWVNUWVBFICp5eXZzcDsKKyAgWVlTVFlQRSAqeXl2c3A7CiAKIAogCkBAIC0xMTQzLDkgKzEyNDcsNiBAQAogICB5eXNzcCA9IHl5c3M7CiAgIHl5dnNwID0geXl2czsKIAotCi0gIHl5dnNwWzBdID0geXlsdmFsOwotCiAgIGdvdG8geXlzZXRzdGF0ZTsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCkBAIC0xMTc4LDcgKzEyNzksNyBAQAogCSAgIGRhdGEgaW4gdXNlIGluIHRoYXQgc3RhY2ssIGluIGJ5dGVzLiAgVGhpcyB1c2VkIHRvIGJlIGEKIAkgICBjb25kaXRpb25hbCBhcm91bmQganVzdCB0aGUgdHdvIGV4dHJhIGFyZ3MsIGJ1dCB0aGF0IG1pZ2h0CiAJICAgYmUgdW5kZWZpbmVkIGlmIHl5b3ZlcmZsb3cgaXMgYSBtYWNyby4gICovCi0JeXlvdmVyZmxvdyAoInBhcnNlciBzdGFjayBvdmVyZmxvdyIsCisJeXlvdmVyZmxvdyAoWVlfKCJtZW1vcnkgZXhoYXVzdGVkIiksCiAJCSAgICAmeXlzczEsIHl5c2l6ZSAqIHNpemVvZiAoKnl5c3NwKSwKIAkJICAgICZ5eXZzMSwgeXlzaXplICogc2l6ZW9mICgqeXl2c3ApLAogCkBAIC0xMTg5LDExICsxMjkwLDExIEBACiAgICAgICB9CiAjZWxzZSAvKiBubyB5eW92ZXJmbG93ICovCiAjIGlmbmRlZiBZWVNUQUNLX1JFTE9DQVRFCi0gICAgICBnb3RvIHl5b3ZlcmZsb3dsYWI7CisgICAgICBnb3RvIHl5ZXhoYXVzdGVkbGFiOwogIyBlbHNlCiAgICAgICAvKiBFeHRlbmQgdGhlIHN0YWNrIG91ciBvd24gd2F5LiAgKi8KICAgICAgIGlmIChZWU1BWERFUFRIIDw9IHl5c3RhY2tzaXplKQotCWdvdG8geXlvdmVyZmxvd2xhYjsKKwlnb3RvIHl5ZXhoYXVzdGVkbGFiOwogICAgICAgeXlzdGFja3NpemUgKj0gMjsKICAgICAgIGlmIChZWU1BWERFUFRIIDwgeXlzdGFja3NpemUpCiAJeXlzdGFja3NpemUgPSBZWU1BWERFUFRIOwpAQCAtMTIwMyw3ICsxMzA0LDcgQEAKIAl1bmlvbiB5eWFsbG9jICp5eXB0ciA9CiAJICAodW5pb24geXlhbGxvYyAqKSBZWVNUQUNLX0FMTE9DIChZWVNUQUNLX0JZVEVTICh5eXN0YWNrc2l6ZSkpOwogCWlmICghIHl5cHRyKQotCSAgZ290byB5eW92ZXJmbG93bGFiOworCSAgZ290byB5eWV4aGF1c3RlZGxhYjsKIAlZWVNUQUNLX1JFTE9DQVRFICh5eXNzKTsKIAlZWVNUQUNLX1JFTE9DQVRFICh5eXZzKTsKIApAQCAtMTQwMyw3ICsxNTA0LDcgQEAKIDt9CiAgICAgYnJlYWs7CiAKLSAgY2FzZSAzNzoKKyAgY2FzZSAzODoKIAogICAgIHsKIAltZW51X3NldF90eXBlKCh5eXZzcFstMl0uaWQpLT5zdHlwZSk7CkBAIC0xNDEzLDcgKzE1MTQsNyBAQAogO30KICAgICBicmVhazsKIAotICBjYXNlIDM4OgorICBjYXNlIDM5OgogCiAgICAgewogCW1lbnVfYWRkX3Byb21wdChQX1BST01QVCwgKHl5dnNwWy0yXS5zdHJpbmcpLCAoeXl2c3BbLTFdLmV4cHIpKTsKQEAgLTE0MjEsNyArMTUyMiw3IEBACiA7fQogICAgIGJyZWFrOwogCi0gIGNhc2UgMzk6CisgIGNhc2UgNDA6CiAKICAgICB7CiAJbWVudV9hZGRfZXhwcihQX0RFRkFVTFQsICh5eXZzcFstMl0uZXhwciksICh5eXZzcFstMV0uZXhwcikpOwpAQCAtMTQzMyw3ICsxNTM0LDcgQEAKIDt9CiAgICAgYnJlYWs7CiAKLSAgY2FzZSA0MDoKKyAgY2FzZSA0MToKIAogICAgIHsKIAltZW51X2FkZF9zeW1ib2woUF9TRUxFQ1QsIHN5bV9sb29rdXAoKHl5dnNwWy0yXS5zdHJpbmcpLCAwKSwgKHl5dnNwWy0xXS5leHByKSk7CkBAIC0xNDQxLDcgKzE1NDIsNyBAQAogO30KICAgICBicmVhazsKIAotICBjYXNlIDQxOgorICBjYXNlIDQyOgogCiAgICAgewogCW1lbnVfYWRkX2V4cHIoUF9SQU5HRSwgZXhwcl9hbGxvY19jb21wKEVfUkFOR0UsKHl5dnNwWy0zXS5zeW1ib2wpLCAoeXl2c3BbLTJdLnN5bWJvbCkpLCAoeXl2c3BbLTFdLmV4cHIpKTsKQEAgLTE0NDksNyArMTU1MCwyOSBAQAogO30KICAgICBicmVhazsKIAotICBjYXNlIDQyOgorICBjYXNlIDQ1OgorCisgICAgeworCXN0cnVjdCBrY29uZl9pZCAqaWQgPSBrY29uZl9pZF9sb29rdXAoKHl5dnNwWy0xXS5zdHJpbmcpLCBzdHJsZW4oKHl5dnNwWy0xXS5zdHJpbmcpKSk7CisJaWYgKGlkICYmIGlkLT5mbGFncyAmIFRGX09QVElPTikKKwkJbWVudV9hZGRfb3B0aW9uKGlkLT50b2tlbiwgKHl5dnNwWzBdLnN0cmluZykpOworCWVsc2UKKwkJemNvbmZwcmludCgid2FybmluZzogaWdub3JpbmcgdW5rbm93biBvcHRpb24gJXMiLCAoeXl2c3BbLTFdLnN0cmluZykpOworCWZyZWUoKHl5dnNwWy0xXS5zdHJpbmcpKTsKKzt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA0NjoKKworICAgIHsgKHl5dmFsLnN0cmluZykgPSBOVUxMOyA7fQorICAgIGJyZWFrOworCisgIGNhc2UgNDc6CisKKyAgICB7ICh5eXZhbC5zdHJpbmcpID0gKHl5dnNwWzBdLnN0cmluZyk7IDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA0ODoKIAogICAgIHsKIAlzdHJ1Y3Qgc3ltYm9sICpzeW0gPSBzeW1fbG9va3VwKE5VTEwsIDApOwpAQCAtMTQ2MCwxNCArMTU4MywxNCBAQAogO30KICAgICBicmVhazsKIAotICBjYXNlIDQzOgorICBjYXNlIDQ5OgogCiAgICAgewogCSh5eXZhbC5tZW51KSA9IG1lbnVfYWRkX21lbnUoKTsKIDt9CiAgICAgYnJlYWs7CiAKLSAgY2FzZSA0NDoKKyAgY2FzZSA1MDoKIAogICAgIHsKIAlpZiAoemNvbmZfZW5kdG9rZW4oKHl5dnNwWzBdLmlkKSwgVF9DSE9JQ0UsIFRfRU5EQ0hPSUNFKSkgewpAQCAtMTQ3Nyw3ICsxNjAwLDcgQEAKIDt9CiAgICAgYnJlYWs7CiAKLSAgY2FzZSA1MjoKKyAgY2FzZSA1ODoKIAogICAgIHsKIAltZW51X2FkZF9wcm9tcHQoUF9QUk9NUFQsICh5eXZzcFstMl0uc3RyaW5nKSwgKHl5dnNwWy0xXS5leHByKSk7CkBAIC0xNDg1LDcgKzE2MDgsNyBAQAogO30KICAgICBicmVhazsKIAotICBjYXNlIDUzOgorICBjYXNlIDU5OgogCiAgICAgewogCWlmICgoeXl2c3BbLTJdLmlkKS0+c3R5cGUgPT0gU19CT09MRUFOIHx8ICh5eXZzcFstMl0uaWQpLT5zdHlwZSA9PSBTX1RSSVNUQVRFKSB7CkBAIC0xNDk4LDcgKzE2MjEsNyBAQAogO30KICAgICBicmVhazsKIAotICBjYXNlIDU0OgorICBjYXNlIDYwOgogCiAgICAgewogCWN1cnJlbnRfZW50cnktPnN5bS0+ZmxhZ3MgfD0gU1lNQk9MX09QVElPTkFMOwpAQCAtMTUwNiw3ICsxNjI5LDcgQEAKIDt9CiAgICAgYnJlYWs7CiAKLSAgY2FzZSA1NToKKyAgY2FzZSA2MToKIAogICAgIHsKIAlpZiAoKHl5dnNwWy0zXS5pZCktPnN0eXBlID09IFNfVU5LTk9XTikgewpAQCAtMTUxOCw3ICsxNjQxLDcgQEAKIDt9CiAgICAgYnJlYWs7CiAKLSAgY2FzZSA1ODoKKyAgY2FzZSA2NDoKIAogICAgIHsKIAlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDppZlxuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7CkBAIC0xNTI4LDcgKzE2NTEsNyBAQAogO30KICAgICBicmVhazsKIAotICBjYXNlIDU5OgorICBjYXNlIDY1OgogCiAgICAgewogCWlmICh6Y29uZl9lbmR0b2tlbigoeXl2c3BbMF0uaWQpLCBUX0lGLCBUX0VORElGKSkgewpAQCAtMTUzOCw3ICsxNjYxLDcgQEAKIDt9CiAgICAgYnJlYWs7CiAKLSAgY2FzZSA2NToKKyAgY2FzZSA3MToKIAogICAgIHsKIAltZW51X2FkZF9lbnRyeShOVUxMKTsKQEAgLTE1NDcsMTQgKzE2NzAsMTQgQEAKIDt9CiAgICAgYnJlYWs7CiAKLSAgY2FzZSA2NjoKKyAgY2FzZSA3MjoKIAogICAgIHsKIAkoeXl2YWwubWVudSkgPSBtZW51X2FkZF9tZW51KCk7CiA7fQogICAgIGJyZWFrOwogCi0gIGNhc2UgNjc6CisgIGNhc2UgNzM6CiAKICAgICB7CiAJaWYgKHpjb25mX2VuZHRva2VuKCh5eXZzcFswXS5pZCksIFRfTUVOVSwgVF9FTkRNRU5VKSkgewpAQCAtMTU2NCw3ICsxNjg3LDcgQEAKIDt9CiAgICAgYnJlYWs7CiAKLSAgY2FzZSA3MzoKKyAgY2FzZSA3OToKIAogICAgIHsKIAlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDpzb3VyY2UgJXNcbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCksICh5eXZzcFstMV0uc3RyaW5nKSk7CkBAIC0xNTcyLDcgKzE2OTUsNyBAQAogO30KICAgICBicmVhazsKIAotICBjYXNlIDc0OgorICBjYXNlIDgwOgogCiAgICAgewogCW1lbnVfYWRkX2VudHJ5KE5VTEwpOwpAQCAtMTU4MSwxNCArMTcwNCwxNCBAQAogO30KICAgICBicmVhazsKIAotICBjYXNlIDc1OgorICBjYXNlIDgxOgogCiAgICAgewogCW1lbnVfZW5kX2VudHJ5KCk7CiA7fQogICAgIGJyZWFrOwogCi0gIGNhc2UgNzY6CisgIGNhc2UgODI6CiAKICAgICB7CiAJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6aGVscFxuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7CkBAIC0xNTk2LDE0ICsxNzE5LDE0IEBACiA7fQogICAgIGJyZWFrOwogCi0gIGNhc2UgNzc6CisgIGNhc2UgODM6CiAKICAgICB7CiAJY3VycmVudF9lbnRyeS0+c3ltLT5oZWxwID0gKHl5dnNwWzBdLnN0cmluZyk7CiA7fQogICAgIGJyZWFrOwogCi0gIGNhc2UgODI6CisgIGNhc2UgODg6CiAKICAgICB7CiAJbWVudV9hZGRfZGVwKCh5eXZzcFstMV0uZXhwcikpOwpAQCAtMTYxMSw3ICsxNzM0LDcgQEAKIDt9CiAgICAgYnJlYWs7CiAKLSAgY2FzZSA4MzoKKyAgY2FzZSA4OToKIAogICAgIHsKIAltZW51X2FkZF9kZXAoKHl5dnNwWy0xXS5leHByKSk7CkBAIC0xNjE5LDcgKzE3NDIsNyBAQAogO30KICAgICBicmVhazsKIAotICBjYXNlIDg0OgorICBjYXNlIDkwOgogCiAgICAgewogCW1lbnVfYWRkX2RlcCgoeXl2c3BbLTFdLmV4cHIpKTsKQEAgLTE2MjcsODcgKzE3NTAsODggQEAKIDt9CiAgICAgYnJlYWs7CiAKLSAgY2FzZSA4NjoKKyAgY2FzZSA5MjoKIAogICAgIHsKIAltZW51X2FkZF9wcm9tcHQoUF9QUk9NUFQsICh5eXZzcFstMV0uc3RyaW5nKSwgKHl5dnNwWzBdLmV4cHIpKTsKIDt9CiAgICAgYnJlYWs7CiAKLSAgY2FzZSA4OToKLQotICAgIHsgKHl5dmFsLmlkKSA9ICh5eXZzcFstMV0uaWQpOyA7fQotICAgIGJyZWFrOwotCi0gIGNhc2UgOTA6Ci0KLSAgICB7ICh5eXZhbC5pZCkgPSAoeXl2c3BbLTFdLmlkKTsgO30KLSAgICBicmVhazsKLQotICBjYXNlIDkxOgotCi0gICAgeyAoeXl2YWwuaWQpID0gKHl5dnNwWy0xXS5pZCk7IDt9Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSA5NDoKLQotICAgIHsgKHl5dmFsLmV4cHIpID0gTlVMTDsgO30KLSAgICBicmVhazsKLQogICBjYXNlIDk1OgogCi0gICAgeyAoeXl2YWwuZXhwcikgPSAoeXl2c3BbMF0uZXhwcik7IDt9CisgICAgeyAoeXl2YWwuaWQpID0gKHl5dnNwWy0xXS5pZCk7IDt9CiAgICAgYnJlYWs7CiAKICAgY2FzZSA5NjoKIAotICAgIHsgKHl5dmFsLmV4cHIpID0gZXhwcl9hbGxvY19zeW1ib2woKHl5dnNwWzBdLnN5bWJvbCkpOyA7fQorICAgIHsgKHl5dmFsLmlkKSA9ICh5eXZzcFstMV0uaWQpOyA7fQogICAgIGJyZWFrOwogCiAgIGNhc2UgOTc6CiAKLSAgICB7ICh5eXZhbC5leHByKSA9IGV4cHJfYWxsb2NfY29tcChFX0VRVUFMLCAoeXl2c3BbLTJdLnN5bWJvbCksICh5eXZzcFswXS5zeW1ib2wpKTsgO30KLSAgICBicmVhazsKLQotICBjYXNlIDk4OgotCi0gICAgeyAoeXl2YWwuZXhwcikgPSBleHByX2FsbG9jX2NvbXAoRV9VTkVRVUFMLCAoeXl2c3BbLTJdLnN5bWJvbCksICh5eXZzcFswXS5zeW1ib2wpKTsgO30KLSAgICBicmVhazsKLQotICBjYXNlIDk5OgotCi0gICAgeyAoeXl2YWwuZXhwcikgPSAoeXl2c3BbLTFdLmV4cHIpOyA7fQorICAgIHsgKHl5dmFsLmlkKSA9ICh5eXZzcFstMV0uaWQpOyA7fQogICAgIGJyZWFrOwogCiAgIGNhc2UgMTAwOgogCi0gICAgeyAoeXl2YWwuZXhwcikgPSBleHByX2FsbG9jX29uZShFX05PVCwgKHl5dnNwWzBdLmV4cHIpKTsgO30KKyAgICB7ICh5eXZhbC5leHByKSA9IE5VTEw7IDt9CiAgICAgYnJlYWs7CiAKICAgY2FzZSAxMDE6CiAKLSAgICB7ICh5eXZhbC5leHByKSA9IGV4cHJfYWxsb2NfdHdvKEVfT1IsICh5eXZzcFstMl0uZXhwciksICh5eXZzcFswXS5leHByKSk7IDt9CisgICAgeyAoeXl2YWwuZXhwcikgPSAoeXl2c3BbMF0uZXhwcik7IDt9CiAgICAgYnJlYWs7CiAKICAgY2FzZSAxMDI6CiAKLSAgICB7ICh5eXZhbC5leHByKSA9IGV4cHJfYWxsb2NfdHdvKEVfQU5ELCAoeXl2c3BbLTJdLmV4cHIpLCAoeXl2c3BbMF0uZXhwcikpOyA7fQorICAgIHsgKHl5dmFsLmV4cHIpID0gZXhwcl9hbGxvY19zeW1ib2woKHl5dnNwWzBdLnN5bWJvbCkpOyA7fQogICAgIGJyZWFrOwogCiAgIGNhc2UgMTAzOgogCi0gICAgeyAoeXl2YWwuc3ltYm9sKSA9IHN5bV9sb29rdXAoKHl5dnNwWzBdLnN0cmluZyksIDApOyBmcmVlKCh5eXZzcFswXS5zdHJpbmcpKTsgO30KKyAgICB7ICh5eXZhbC5leHByKSA9IGV4cHJfYWxsb2NfY29tcChFX0VRVUFMLCAoeXl2c3BbLTJdLnN5bWJvbCksICh5eXZzcFswXS5zeW1ib2wpKTsgO30KICAgICBicmVhazsKIAogICBjYXNlIDEwNDoKIAorICAgIHsgKHl5dmFsLmV4cHIpID0gZXhwcl9hbGxvY19jb21wKEVfVU5FUVVBTCwgKHl5dnNwWy0yXS5zeW1ib2wpLCAoeXl2c3BbMF0uc3ltYm9sKSk7IDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxMDU6CisKKyAgICB7ICh5eXZhbC5leHByKSA9ICh5eXZzcFstMV0uZXhwcik7IDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxMDY6CisKKyAgICB7ICh5eXZhbC5leHByKSA9IGV4cHJfYWxsb2Nfb25lKEVfTk9ULCAoeXl2c3BbMF0uZXhwcikpOyA7fQorICAgIGJyZWFrOworCisgIGNhc2UgMTA3OgorCisgICAgeyAoeXl2YWwuZXhwcikgPSBleHByX2FsbG9jX3R3byhFX09SLCAoeXl2c3BbLTJdLmV4cHIpLCAoeXl2c3BbMF0uZXhwcikpOyA7fQorICAgIGJyZWFrOworCisgIGNhc2UgMTA4OgorCisgICAgeyAoeXl2YWwuZXhwcikgPSBleHByX2FsbG9jX3R3byhFX0FORCwgKHl5dnNwWy0yXS5leHByKSwgKHl5dnNwWzBdLmV4cHIpKTsgO30KKyAgICBicmVhazsKKworICBjYXNlIDEwOToKKworICAgIHsgKHl5dmFsLnN5bWJvbCkgPSBzeW1fbG9va3VwKCh5eXZzcFswXS5zdHJpbmcpLCAwKTsgZnJlZSgoeXl2c3BbMF0uc3RyaW5nKSk7IDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxMTA6CisKICAgICB7ICh5eXZhbC5zeW1ib2wpID0gc3ltX2xvb2t1cCgoeXl2c3BbMF0uc3RyaW5nKSwgMSk7IGZyZWUoKHl5dnNwWzBdLnN0cmluZykpOyA7fQogICAgIGJyZWFrOwogCiAKKyAgICAgIGRlZmF1bHQ6IGJyZWFrOwogICAgIH0KIAotLyogTGluZSAxMDM3IG9mIHlhY2MuYy4gICovCisvKiBMaW5lIDExMjYgb2YgeWFjYy5jLiAgKi8KIAogDAogICB5eXZzcCAtPSB5eWxlbjsKQEAgLTE3NDcsMTIgKzE4NzEsMzYgQEAKIAogICAgICAgaWYgKFlZUEFDVF9OSU5GIDwgeXluICYmIHl5biA8IFlZTEFTVCkKIAl7Ci0JICBZWVNJWkVfVCB5eXNpemUgPSAwOwogCSAgaW50IHl5dHlwZSA9IFlZVFJBTlNMQVRFICh5eWNoYXIpOwotCSAgY29uc3QgY2hhciogeXlwcmVmaXg7Ci0JICBjaGFyICp5eW1zZzsKKwkgIFlZU0laRV9UIHl5c2l6ZTAgPSB5eXRuYW1lcnIgKDAsIHl5dG5hbWVbeXl0eXBlXSk7CisJICBZWVNJWkVfVCB5eXNpemUgPSB5eXNpemUwOworCSAgWVlTSVpFX1QgeXlzaXplMTsKKwkgIGludCB5eXNpemVfb3ZlcmZsb3cgPSAwOworCSAgY2hhciAqeXltc2cgPSAwOworIwkgIGRlZmluZSBZWUVSUk9SX1ZFUkJPU0VfQVJHU19NQVhJTVVNIDUKKwkgIGNoYXIgY29uc3QgKnl5YXJnW1lZRVJST1JfVkVSQk9TRV9BUkdTX01BWElNVU1dOwogCSAgaW50IHl5eDsKIAorI2lmIDAKKwkgIC8qIFRoaXMgaXMgc28geGdldHRleHQgc2VlcyB0aGUgdHJhbnNsYXRhYmxlIGZvcm1hdHMgdGhhdCBhcmUKKwkgICAgIGNvbnN0cnVjdGVkIG9uIHRoZSBmbHkuICAqLworCSAgWVlfKCJzeW50YXggZXJyb3IsIHVuZXhwZWN0ZWQgJXMiKTsKKwkgIFlZXygic3ludGF4IGVycm9yLCB1bmV4cGVjdGVkICVzLCBleHBlY3RpbmcgJXMiKTsKKwkgIFlZXygic3ludGF4IGVycm9yLCB1bmV4cGVjdGVkICVzLCBleHBlY3RpbmcgJXMgb3IgJXMiKTsKKwkgIFlZXygic3ludGF4IGVycm9yLCB1bmV4cGVjdGVkICVzLCBleHBlY3RpbmcgJXMgb3IgJXMgb3IgJXMiKTsKKwkgIFlZXygic3ludGF4IGVycm9yLCB1bmV4cGVjdGVkICVzLCBleHBlY3RpbmcgJXMgb3IgJXMgb3IgJXMgb3IgJXMiKTsKKyNlbmRpZgorCSAgY2hhciAqeXlmbXQ7CisJICBjaGFyIGNvbnN0ICp5eWY7CisJICBzdGF0aWMgY2hhciBjb25zdCB5eXVuZXhwZWN0ZWRbXSA9ICJzeW50YXggZXJyb3IsIHVuZXhwZWN0ZWQgJXMiOworCSAgc3RhdGljIGNoYXIgY29uc3QgeXlleHBlY3RpbmdbXSA9ICIsIGV4cGVjdGluZyAlcyI7CisJICBzdGF0aWMgY2hhciBjb25zdCB5eW9yW10gPSAiIG9yICVzIjsKKwkgIGNoYXIgeXlmb3JtYXRbc2l6ZW9mIHl5dW5leHBlY3RlZAorCQkJKyBzaXplb2YgeXlleHBlY3RpbmcgLSAxCisJCQkrICgoWVlFUlJPUl9WRVJCT1NFX0FSR1NfTUFYSU1VTSAtIDIpCisJCQkgICAqIChzaXplb2YgeXlvciAtIDEpKV07CisJICBjaGFyIGNvbnN0ICp5eXByZWZpeCA9IHl5ZXhwZWN0aW5nOworCiAJICAvKiBTdGFydCBZWVggYXQgLVlZTiBpZiBuZWdhdGl2ZSB0byBhdm9pZCBuZWdhdGl2ZSBpbmRleGVzIGluCiAJICAgICBZWUNIRUNLLiAgKi8KIAkgIGludCB5eXhiZWdpbiA9IHl5biA8IDAgPyAteXluIDogMDsKQEAgLTE3NjAsNDggKzE5MDgsNjggQEAKIAkgIC8qIFN0YXkgd2l0aGluIGJvdW5kcyBvZiBib3RoIHl5Y2hlY2sgYW5kIHl5dG5hbWUuICAqLwogCSAgaW50IHl5Y2hlY2tsaW0gPSBZWUxBU1QgLSB5eW47CiAJICBpbnQgeXl4ZW5kID0geXljaGVja2xpbSA8IFlZTlRPS0VOUyA/IHl5Y2hlY2tsaW0gOiBZWU5UT0tFTlM7Ci0JICBpbnQgeXljb3VudCA9IDA7CisJICBpbnQgeXljb3VudCA9IDE7CiAKLQkgIHl5cHJlZml4ID0gIiwgZXhwZWN0aW5nICI7CisJICB5eWFyZ1swXSA9IHl5dG5hbWVbeXl0eXBlXTsKKwkgIHl5Zm10ID0geXlzdHBjcHkgKHl5Zm9ybWF0LCB5eXVuZXhwZWN0ZWQpOworCiAJICBmb3IgKHl5eCA9IHl5eGJlZ2luOyB5eXggPCB5eXhlbmQ7ICsreXl4KQogCSAgICBpZiAoeXljaGVja1t5eXggKyB5eW5dID09IHl5eCAmJiB5eXggIT0gWVlURVJST1IpCiAJICAgICAgewotCQl5eXNpemUgKz0geXlzdHJsZW4gKHl5cHJlZml4KSArIHl5c3RybGVuICh5eXRuYW1lIFt5eXhdKTsKLQkJeXljb3VudCArPSAxOwotCQlpZiAoeXljb3VudCA9PSA1KQorCQlpZiAoeXljb3VudCA9PSBZWUVSUk9SX1ZFUkJPU0VfQVJHU19NQVhJTVVNKQogCQkgIHsKLQkJICAgIHl5c2l6ZSA9IDA7CisJCSAgICB5eWNvdW50ID0gMTsKKwkJICAgIHl5c2l6ZSA9IHl5c2l6ZTA7CisJCSAgICB5eWZvcm1hdFtzaXplb2YgeXl1bmV4cGVjdGVkIC0gMV0gPSAnXDAnOwogCQkgICAgYnJlYWs7CiAJCSAgfQorCQl5eWFyZ1t5eWNvdW50KytdID0geXl0bmFtZVt5eXhdOworCQl5eXNpemUxID0geXlzaXplICsgeXl0bmFtZXJyICgwLCB5eXRuYW1lW3l5eF0pOworCQl5eXNpemVfb3ZlcmZsb3cgfD0geXlzaXplMSA8IHl5c2l6ZTsKKwkJeXlzaXplID0geXlzaXplMTsKKwkJeXlmbXQgPSB5eXN0cGNweSAoeXlmbXQsIHl5cHJlZml4KTsKKwkJeXlwcmVmaXggPSB5eW9yOwogCSAgICAgIH0KLQkgIHl5c2l6ZSArPSAoc2l6ZW9mICgic3ludGF4IGVycm9yLCB1bmV4cGVjdGVkICIpCi0JCSAgICAgKyB5eXN0cmxlbiAoeXl0bmFtZVt5eXR5cGVdKSk7Ci0JICB5eW1zZyA9IChjaGFyICopIFlZU1RBQ0tfQUxMT0MgKHl5c2l6ZSk7Ci0JICBpZiAoeXltc2cgIT0gMCkKLQkgICAgewotCSAgICAgIGNoYXIgKnl5cCA9IHl5c3RwY3B5ICh5eW1zZywgInN5bnRheCBlcnJvciwgdW5leHBlY3RlZCAiKTsKLQkgICAgICB5eXAgPSB5eXN0cGNweSAoeXlwLCB5eXRuYW1lW3l5dHlwZV0pOwogCi0JICAgICAgaWYgKHl5Y291bnQgPCA1KQorCSAgeXlmID0gWVlfKHl5Zm9ybWF0KTsKKwkgIHl5c2l6ZTEgPSB5eXNpemUgKyB5eXN0cmxlbiAoeXlmKTsKKwkgIHl5c2l6ZV9vdmVyZmxvdyB8PSB5eXNpemUxIDwgeXlzaXplOworCSAgeXlzaXplID0geXlzaXplMTsKKworCSAgaWYgKCF5eXNpemVfb3ZlcmZsb3cgJiYgeXlzaXplIDw9IFlZU1RBQ0tfQUxMT0NfTUFYSU1VTSkKKwkgICAgeXltc2cgPSAoY2hhciAqKSBZWVNUQUNLX0FMTE9DICh5eXNpemUpOworCSAgaWYgKHl5bXNnKQorCSAgICB7CisJICAgICAgLyogQXZvaWQgc3ByaW50ZiwgYXMgdGhhdCBpbmZyaW5nZXMgb24gdGhlIHVzZXIncyBuYW1lIHNwYWNlLgorCQkgRG9uJ3QgaGF2ZSB1bmRlZmluZWQgYmVoYXZpb3IgZXZlbiBpZiB0aGUgdHJhbnNsYXRpb24KKwkJIHByb2R1Y2VkIGEgc3RyaW5nIHdpdGggdGhlIHdyb25nIG51bWJlciBvZiAiJXMicy4gICovCisJICAgICAgY2hhciAqeXlwID0geXltc2c7CisJICAgICAgaW50IHl5aSA9IDA7CisJICAgICAgd2hpbGUgKCgqeXlwID0gKnl5ZikpCiAJCXsKLQkJICB5eXByZWZpeCA9ICIsIGV4cGVjdGluZyAiOwotCQkgIGZvciAoeXl4ID0geXl4YmVnaW47IHl5eCA8IHl5eGVuZDsgKyt5eXgpCi0JCSAgICBpZiAoeXljaGVja1t5eXggKyB5eW5dID09IHl5eCAmJiB5eXggIT0gWVlURVJST1IpCi0JCSAgICAgIHsKLQkJCXl5cCA9IHl5c3RwY3B5ICh5eXAsIHl5cHJlZml4KTsKLQkJCXl5cCA9IHl5c3RwY3B5ICh5eXAsIHl5dG5hbWVbeXl4XSk7Ci0JCQl5eXByZWZpeCA9ICIgb3IgIjsKLQkJICAgICAgfQorCQkgIGlmICgqeXlwID09ICclJyAmJiB5eWZbMV0gPT0gJ3MnICYmIHl5aSA8IHl5Y291bnQpCisJCSAgICB7CisJCSAgICAgIHl5cCArPSB5eXRuYW1lcnIgKHl5cCwgeXlhcmdbeXlpKytdKTsKKwkJICAgICAgeXlmICs9IDI7CisJCSAgICB9CisJCSAgZWxzZQorCQkgICAgeworCQkgICAgICB5eXArKzsKKwkJICAgICAgeXlmKys7CisJCSAgICB9CiAJCX0KIAkgICAgICB5eWVycm9yICh5eW1zZyk7CiAJICAgICAgWVlTVEFDS19GUkVFICh5eW1zZyk7CiAJICAgIH0KIAkgIGVsc2UKLQkgICAgeXllcnJvciAoInN5bnRheCBlcnJvcjsgYWxzbyB2aXJ0dWFsIG1lbW9yeSBleGhhdXN0ZWQiKTsKKwkgICAgeworCSAgICAgIHl5ZXJyb3IgKFlZXygic3ludGF4IGVycm9yIikpOworCSAgICAgIGdvdG8geXlleGhhdXN0ZWRsYWI7CisJICAgIH0KIAl9CiAgICAgICBlbHNlCiAjZW5kaWYgLyogWVlFUlJPUl9WRVJCT1NFICovCi0JeXllcnJvciAoInN5bnRheCBlcnJvciIpOworCXl5ZXJyb3IgKFlZXygic3ludGF4IGVycm9yIikpOwogICAgIH0KIAogCkBAIC0xODEzLDE4ICsxOTgxLDkgQEAKIAogICAgICAgaWYgKHl5Y2hhciA8PSBZWUVPRikKICAgICAgICAgewotICAgICAgICAgIC8qIElmIGF0IGVuZCBvZiBpbnB1dCwgcG9wIHRoZSBlcnJvciB0b2tlbiwKLQkgICAgIHRoZW4gdGhlIHJlc3Qgb2YgdGhlIHN0YWNrLCB0aGVuIHJldHVybiBmYWlsdXJlLiAgKi8KKwkgIC8qIFJldHVybiBmYWlsdXJlIGlmIGF0IGVuZCBvZiBpbnB1dC4gICovCiAJICBpZiAoeXljaGFyID09IFlZRU9GKQotCSAgICAgZm9yICg7OykKLQkgICAgICAgewotCi0JCSBZWVBPUFNUQUNLOwotCQkgaWYgKHl5c3NwID09IHl5c3MpCi0JCSAgIFlZQUJPUlQ7Ci0JCSB5eWRlc3RydWN0ICgiRXJyb3I6IHBvcHBpbmciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5eXN0b3NbKnl5c3NwXSwgeXl2c3ApOwotCSAgICAgICB9CisJICAgIFlZQUJPUlQ7CiAgICAgICAgIH0KICAgICAgIGVsc2UKIAl7CkBAIC0xODQzLDEyICsyMDAyLDExIEBACiBgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHl5ZXJyb3JsYWI6CiAKLSNpZmRlZiBfX0dOVUNfXwotICAvKiBQYWNpZnkgR0NDIHdoZW4gdGhlIHVzZXIgY29kZSBuZXZlciBpbnZva2VzIFlZRVJST1IgYW5kIHRoZSBsYWJlbAotICAgICB5eWVycm9ybGFiIHRoZXJlZm9yZSBuZXZlciBhcHBlYXJzIGluIHVzZXIgY29kZS4gICovCisgIC8qIFBhY2lmeSBjb21waWxlcnMgbGlrZSBHQ0Mgd2hlbiB0aGUgdXNlciBjb2RlIG5ldmVyIGludm9rZXMKKyAgICAgWVlFUlJPUiBhbmQgdGhlIGxhYmVsIHl5ZXJyb3JsYWIgdGhlcmVmb3JlIG5ldmVyIGFwcGVhcnMgaW4gdXNlcgorICAgICBjb2RlLiAgKi8KICAgaWYgKDApCiAgICAgIGdvdG8geXllcnJvcmxhYjsKLSNlbmRpZgogCiB5eXZzcCAtPSB5eWxlbjsKICAgeXlzc3AgLT0geXlsZW47CkBAIC0xOTExLDIzICsyMDY5LDI5IEBACiB8IHl5YWJvcnRsYWIgLS0gWVlBQk9SVCBjb21lcyBoZXJlLiAgfAogYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHl5YWJvcnRsYWI6Ci0gIHl5ZGVzdHJ1Y3QgKCJFcnJvcjogZGlzY2FyZGluZyBsb29rYWhlYWQiLAotICAgICAgICAgICAgICB5eXRva2VuLCAmeXlsdmFsKTsKLSAgeXljaGFyID0gWVlFTVBUWTsKICAgeXlyZXN1bHQgPSAxOwogICBnb3RvIHl5cmV0dXJuOwogCiAjaWZuZGVmIHl5b3ZlcmZsb3cKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KLXwgeXlvdmVyZmxvd2xhYiAtLSBwYXJzZXIgb3ZlcmZsb3cgY29tZXMgaGVyZS4gIHwKLWAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXl5b3ZlcmZsb3dsYWI6Ci0gIHl5ZXJyb3IgKCJwYXJzZXIgc3RhY2sgb3ZlcmZsb3ciKTsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK3wgeXlleGhhdXN0ZWRsYWIgLS0gbWVtb3J5IGV4aGF1c3Rpb24gY29tZXMgaGVyZS4gIHwKK2AtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3l5ZXhoYXVzdGVkbGFiOgorICB5eWVycm9yIChZWV8oIm1lbW9yeSBleGhhdXN0ZWQiKSk7CiAgIHl5cmVzdWx0ID0gMjsKICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KICNlbmRpZgogCiB5eXJldHVybjoKKyAgaWYgKHl5Y2hhciAhPSBZWUVPRiAmJiB5eWNoYXIgIT0gWVlFTVBUWSkKKyAgICAgeXlkZXN0cnVjdCAoIkNsZWFudXA6IGRpc2NhcmRpbmcgbG9va2FoZWFkIiwKKwkJIHl5dG9rZW4sICZ5eWx2YWwpOworICB3aGlsZSAoeXlzc3AgIT0geXlzcykKKyAgICB7CisgICAgICB5eWRlc3RydWN0ICgiQ2xlYW51cDogcG9wcGluZyIsCisJCSAgeXlzdG9zWyp5eXNzcF0sIHl5dnNwKTsKKyAgICAgIFlZUE9QU1RBQ0s7CisgICAgfQogI2lmbmRlZiB5eW92ZXJmbG93CiAgIGlmICh5eXNzICE9IHl5c3NhKQogICAgIFlZU1RBQ0tfRlJFRSAoeXlzcyk7CkBAIC0xOTQ4LDcgKzIxMTIsOSBAQAogCiAJc3ltX2luaXQoKTsKIAltZW51X2luaXQoKTsKLQltb2R1bGVzX3N5bSA9IHN5bV9sb29rdXAoIk1PRFVMRVMiLCAwKTsKKwltb2R1bGVzX3N5bSA9IHN5bV9sb29rdXAoTlVMTCwgMCk7CisJbW9kdWxlc19zeW0tPnR5cGUgPSBTX0JPT0xFQU47CisJbW9kdWxlc19zeW0tPmZsYWdzIHw9IFNZTUJPTF9BVVRPOwogCXJvb3RtZW51LnByb21wdCA9IG1lbnVfYWRkX3Byb21wdChQX01FTlUsICJMaW51eCBLZXJuZWwgQ29uZmlndXJhdGlvbiIsIE5VTEwpOwogCiAjaWYgWVlERUJVRwpAQCAtMTk1OCw2ICsyMTI0LDEyIEBACiAJemNvbmZwYXJzZSgpOwogCWlmICh6Y29uZm5lcnJzKQogCQlleGl0KDEpOworCWlmICghbW9kdWxlc19zeW0tPnByb3ApIHsKKwkJc3RydWN0IHByb3BlcnR5ICpwcm9wOworCisJCXByb3AgPSBwcm9wX2FsbG9jKFBfREVGQVVMVCwgbW9kdWxlc19zeW0pOworCQlwcm9wLT5leHByID0gZXhwcl9hbGxvY19zeW1ib2woc3ltX2xvb2t1cCgiTU9EVUxFUyIsIDApKTsKKwl9CiAJbWVudV9maW5hbGl6ZSgmcm9vdG1lbnUpOwogCWZvcl9hbGxfc3ltYm9scyhpLCBzeW0pIHsKIAkJc3ltX2NoZWNrX2RlcHMoc3ltKTsKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy96Y29uZi55IGIvc2NyaXB0cy9rY29uZmlnL3pjb25mLnkKaW5kZXggMWY2MWZiYS4uYWI0NGZlYiAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL3pjb25mLnkKKysrIGIvc2NyaXB0cy9rY29uZmlnL3pjb25mLnkKQEAgLTcxLDYgKzcxLDcgQEAKICV0b2tlbiA8aWQ+VF9ERUZBVUxUCiAldG9rZW4gPGlkPlRfU0VMRUNUCiAldG9rZW4gPGlkPlRfUkFOR0UKKyV0b2tlbiA8aWQ+VF9PUFRJT04KICV0b2tlbiA8aWQ+VF9PTgogJXRva2VuIDxzdHJpbmc+IFRfV09SRAogJXRva2VuIDxzdHJpbmc+IFRfV09SRF9RVU9URQpAQCAtOTEsNiArOTIsNyBAQAogJXR5cGUgPGlkPiBlbmQKICV0eXBlIDxpZD4gb3B0aW9uX25hbWUKICV0eXBlIDxtZW51PiBpZl9lbnRyeSBtZW51X2VudHJ5IGNob2ljZV9lbnRyeQorJXR5cGUgPHN0cmluZz4gc3ltYm9sX29wdGlvbl9hcmcKIAogJWRlc3RydWN0b3IgewogCWZwcmludGYoc3RkZXJyLCAiJXM6JWQ6IG1pc3NpbmcgZW5kIHN0YXRlbWVudCBmb3IgdGhpcyBlbnRyeVxuIiwKQEAgLTE3Myw2ICsxNzUsNyBAQAogY29uZmlnX29wdGlvbl9saXN0OgogCSAgLyogZW1wdHkgKi8KIAl8IGNvbmZpZ19vcHRpb25fbGlzdCBjb25maWdfb3B0aW9uCisJfCBjb25maWdfb3B0aW9uX2xpc3Qgc3ltYm9sX29wdGlvbgogCXwgY29uZmlnX29wdGlvbl9saXN0IGRlcGVuZHMKIAl8IGNvbmZpZ19vcHRpb25fbGlzdCBoZWxwCiAJfCBjb25maWdfb3B0aW9uX2xpc3Qgb3B0aW9uX2Vycm9yCkBAIC0yMTUsNiArMjE4LDI2IEBACiAJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6cmFuZ2VcbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCkpOwogfTsKIAorc3ltYm9sX29wdGlvbjogVF9PUFRJT04gc3ltYm9sX29wdGlvbl9saXN0IFRfRU9MCis7CisKK3N5bWJvbF9vcHRpb25fbGlzdDoKKwkgIC8qIGVtcHR5ICovCisJfCBzeW1ib2xfb3B0aW9uX2xpc3QgVF9XT1JEIHN5bWJvbF9vcHRpb25fYXJnCit7CisJc3RydWN0IGtjb25mX2lkICppZCA9IGtjb25mX2lkX2xvb2t1cCgkMiwgc3RybGVuKCQyKSk7CisJaWYgKGlkICYmIGlkLT5mbGFncyAmIFRGX09QVElPTikKKwkJbWVudV9hZGRfb3B0aW9uKGlkLT50b2tlbiwgJDMpOworCWVsc2UKKwkJemNvbmZwcmludCgid2FybmluZzogaWdub3JpbmcgdW5rbm93biBvcHRpb24gJXMiLCAkMik7CisJZnJlZSgkMik7Cit9OworCitzeW1ib2xfb3B0aW9uX2FyZzoKKwkgIC8qIGVtcHR5ICovCQl7ICQkID0gTlVMTDsgfQorCXwgVF9FUVVBTCBwcm9tcHQJeyAkJCA9ICQyOyB9Cis7CisKIC8qIGNob2ljZSBlbnRyeSAqLwogCiBjaG9pY2U6IFRfQ0hPSUNFIFRfRU9MCkBAIC00NTgsNyArNDgxLDkgQEAKIAogCXN5bV9pbml0KCk7CiAJbWVudV9pbml0KCk7Ci0JbW9kdWxlc19zeW0gPSBzeW1fbG9va3VwKCJNT0RVTEVTIiwgMCk7CisJbW9kdWxlc19zeW0gPSBzeW1fbG9va3VwKE5VTEwsIDApOworCW1vZHVsZXNfc3ltLT50eXBlID0gU19CT09MRUFOOworCW1vZHVsZXNfc3ltLT5mbGFncyB8PSBTWU1CT0xfQVVUTzsKIAlyb290bWVudS5wcm9tcHQgPSBtZW51X2FkZF9wcm9tcHQoUF9NRU5VLCAiTGludXggS2VybmVsIENvbmZpZ3VyYXRpb24iLCBOVUxMKTsKIAogI2lmIFlZREVCVUcKQEAgLTQ2OCw2ICs0OTMsMTIgQEAKIAl6Y29uZnBhcnNlKCk7CiAJaWYgKHpjb25mbmVycnMpCiAJCWV4aXQoMSk7CisJaWYgKCFtb2R1bGVzX3N5bS0+cHJvcCkgeworCQlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisKKwkJcHJvcCA9IHByb3BfYWxsb2MoUF9ERUZBVUxULCBtb2R1bGVzX3N5bSk7CisJCXByb3AtPmV4cHIgPSBleHByX2FsbG9jX3N5bWJvbChzeW1fbG9va3VwKCJNT0RVTEVTIiwgMCkpOworCX0KIAltZW51X2ZpbmFsaXplKCZyb290bWVudSk7CiAJZm9yX2FsbF9zeW1ib2xzKGksIHN5bSkgewogCQlzeW1fY2hlY2tfZGVwcyhzeW0pOwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rZXJuZWwtZG9jIGIvc2NyaXB0cy9rZXJuZWwtZG9jCmluZGV4IDk5ZmU0YjcuLjAwZTIxMjkgMTAwNzU1Ci0tLSBhL3NjcmlwdHMva2VybmVsLWRvYworKysgYi9zY3JpcHRzL2tlcm5lbC1kb2MKQEAgLTI1Myw2ICsyNTMsNyBAQAogIyAzIC0gc2Nhbm5pbmcgcHJvdG90eXBlLgogIyA0IC0gZG9jdW1lbnRhdGlvbiBibG9jawogbXkgJHN0YXRlOworbXkgJGluX2RvY19zZWN0OwogCiAjZGVjbGFyYXRpb24gdHlwZXM6IGNhbiBiZQogIyAnZnVuY3Rpb24nLCAnc3RydWN0JywgJ3VuaW9uJywgJ2VudW0nLCAndHlwZWRlZicKQEAgLTEwNjQsNyArMTA2NSw3IEBACiAgICAgfQogICAgIHByaW50ICJ9O1xuLmJyXG4iOwogCi0gICAgcHJpbnQgIi5TSCBBcmd1bWVudHNcbiI7CisgICAgcHJpbnQgIi5TSCBNZW1iZXJzXG4iOwogICAgIGZvcmVhY2ggJHBhcmFtZXRlciAoQHskYXJnc3sncGFyYW1ldGVybGlzdCd9fSkgewogCSgkcGFyYW1ldGVyID1+IC9eIy8pICYmIG5leHQ7CiAKQEAgLTE2NzMsNiArMTY3NCw5IEBACiAjIHJlcGxhY2UgPCwgPiwgYW5kICYKIHN1YiB4bWxfZXNjYXBlKCQpIHsKIAlteSAkdGV4dCA9IHNoaWZ0OworCWlmICgoJG91dHB1dF9tb2RlIGVxICJ0ZXh0IikgfHwgKCRvdXRwdXRfbW9kZSBlcSAibWFuIikpIHsKKwkJcmV0dXJuICR0ZXh0OworCX0KIAkkdGV4dCA9fiBzL1wmL1xcXFxcXGFtcDsvZzsKIAkkdGV4dCA9fiBzL1w8L1xcXFxcXGx0Oy9nOwogCSR0ZXh0ID1+IHMvXD4vXFxcXFxcZ3Q7L2c7CkBAIC0xNzA2LDYgKzE3MTAsNyBAQAogCWlmICgkc3RhdGUgPT0gMCkgewogCSAgICBpZiAoLyRkb2Nfc3RhcnQvbykgewogCQkkc3RhdGUgPSAxOwkJIyBuZXh0IGxpbmUgaXMgYWx3YXlzIHRoZSBmdW5jdGlvbiBuYW1lCisJCSRpbl9kb2Nfc2VjdCA9IDA7CiAJICAgIH0KIAl9IGVsc2lmICgkc3RhdGUgPT0gMSkgewkjIHRoaXMgbGluZSBpcyB0aGUgZnVuY3Rpb24gbmFtZSAoYWx3YXlzKQogCSAgICBpZiAoLyRkb2NfYmxvY2svbykgewpAQCAtMTc1NiwxMiArMTc2MSwyMCBAQAogCQkkbmV3Y29udGVudHMgPSAkMjsKIAogCQlpZiAoJGNvbnRlbnRzIG5lICIiKSB7CisJCSAgICBpZiAoISRpbl9kb2Nfc2VjdCAmJiAkdmVyYm9zZSkgeworCQkJcHJpbnQgU1RERVJSICJXYXJuaW5nKCR7ZmlsZX06JC4pOiBjb250ZW50cyBiZWZvcmUgc2VjdGlvbnNcbiI7CisJCQkrKyR3YXJuaW5nczsKKwkJICAgIH0KIAkJICAgIGR1bXBfc2VjdGlvbigkc2VjdGlvbiwgeG1sX2VzY2FwZSgkY29udGVudHMpKTsKIAkJICAgICRzZWN0aW9uID0gJHNlY3Rpb25fZGVmYXVsdDsKIAkJfQogCisJCSRpbl9kb2Nfc2VjdCA9IDE7CiAJCSRjb250ZW50cyA9ICRuZXdjb250ZW50czsKIAkJaWYgKCRjb250ZW50cyBuZSAiIikgeworCQkgICAgaWYgKHN1YnN0cigkY29udGVudHMsIDAsIDEpIGVxICIgIikgeworCQkJJGNvbnRlbnRzID0gc3Vic3RyKCRjb250ZW50cywgMSk7CisJCSAgICB9CiAJCSAgICAkY29udGVudHMgLj0gIlxuIjsKIAkJfQogCQkkc2VjdGlvbiA9ICRuZXdzZWN0aW9uOwpAQCAtMTc3Niw3ICsxNzg5LDcgQEAKIAkJJHByb3RvdHlwZSA9ICIiOwogCQkkc3RhdGUgPSAzOwogCQkkYnJjb3VudCA9IDA7Ci0jCSAgICBwcmludCBTVERFUlIgImVuZCBvZiBkb2MgY29tbWVudCwgbG9va2luZyBmb3IgcHJvdG90eXBlXG4iOworIwkJcHJpbnQgU1RERVJSICJlbmQgb2YgZG9jIGNvbW1lbnQsIGxvb2tpbmcgZm9yIHByb3RvdHlwZVxuIjsKIAkgICAgfSBlbHNpZiAoLyRkb2NfY29udGVudC8pIHsKIAkJIyBtaWd1ZWwtc3R5bGUgY29tbWVudCBrbHVkZ2UsIGxvb2sgZm9yIGJsYW5rIGxpbmVzIGFmdGVyCiAJCSMgQHBhcmFtZXRlciBsaW5lIHRvIHNpZ25pZnkgc3RhcnQgb2YgZGVzY3JpcHRpb24KQEAgLTE3OTMsNyArMTgwNiw3IEBACiAJCXByaW50IFNUREVSUiAiV2FybmluZygke2ZpbGV9OiQuKTogYmFkIGxpbmU6ICRfIjsKIAkJKyskd2FybmluZ3M7CiAJICAgIH0KLQl9IGVsc2lmICgkc3RhdGUgPT0gMykgewkjIHNjYW5uaW5nIGZvciBmdW5jdGlvbiB7IChlbmQgb2YgcHJvdG90eXBlKQorCX0gZWxzaWYgKCRzdGF0ZSA9PSAzKSB7CSMgc2Nhbm5pbmcgZm9yIGZ1bmN0aW9uICd7JyAoZW5kIG9mIHByb3RvdHlwZSkKIAkgICAgaWYgKCRkZWNsX3R5cGUgZXEgJ2Z1bmN0aW9uJykgewogCSAgICAgICAgcHJvY2Vzc19zdGF0ZTNfZnVuY3Rpb24oJF8sICRmaWxlKTsKIAkgICAgfSBlbHNlIHsKZGlmZiAtLWdpdCBhL3NjcmlwdHMvbW9kL21rX2VsZmNvbmZpZy5jIGIvc2NyaXB0cy9tb2QvbWtfZWxmY29uZmlnLmMKaW5kZXggM2M5MmM4My4uNzI1ZDYxYyAxMDA2NDQKLS0tIGEvc2NyaXB0cy9tb2QvbWtfZWxmY29uZmlnLmMKKysrIGIvc2NyaXB0cy9tb2QvbWtfZWxmY29uZmlnLmMKQEAgLTI4LDcgKzI4LDcgQEAKIAkJcHJpbnRmKCIjZGVmaW5lIEtFUk5FTF9FTEZDTEFTUyBFTEZDTEFTUzY0XG4iKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJYWJvcnQoKTsKKwkJZXhpdCgxKTsKIAl9CiAJc3dpdGNoIChlaVtFSV9EQVRBXSkgewogCWNhc2UgRUxGREFUQTJMU0I6CkBAIC0zOCw3ICszOCw3IEBACiAJCXByaW50ZigiI2RlZmluZSBLRVJORUxfRUxGREFUQSBFTEZEQVRBMk1TQlxuIik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWFib3J0KCk7CisJCWV4aXQoMSk7CiAJfQogCiAJaWYgKHNpemVvZih1bnNpZ25lZCBsb25nKSA9PSA0KSB7CkBAIC01Myw3ICs1Myw3IEBACiAJZWxzZSBpZiAobWVtY21wKGVuZGlhbl90ZXN0LmMsICJceDAyXHgwMSIsIDIpID09IDApCiAJCXByaW50ZigiI2RlZmluZSBIT1NUX0VMRkRBVEEgRUxGREFUQTJMU0JcbiIpOwogCWVsc2UKLQkJYWJvcnQoKTsKKwkJZXhpdCgxKTsKIAogCWlmICgoc3RyY21wKGFyZ3ZbMV0sICJ2ODUwIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzFdLCAiaDgzMDAiKSA9PSAwKSkKIAkJcHJpbnRmKCIjZGVmaW5lIE1PRFVMRV9TWU1CT0xfUFJFRklYIFwiX1wiXG4iKTsKZGlmZiAtLWdpdCBhL3NjcmlwdHMvbW9kL21vZHBvc3QuYyBiL3NjcmlwdHMvbW9kL21vZHBvc3QuYwppbmRleCBkMGY4NmVkLi4wZGQxNjE3IDEwMDY0NAotLS0gYS9zY3JpcHRzL21vZC9tb2Rwb3N0LmMKKysrIGIvc2NyaXB0cy9tb2QvbW9kcG9zdC5jCkBAIC0xMyw2ICsxMyw3IEBACiAKICNpbmNsdWRlIDxjdHlwZS5oPgogI2luY2x1ZGUgIm1vZHBvc3QuaCIKKyNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2xpbnV4L2xpY2Vuc2UuaCIKIAogLyogQXJlIHdlIHVzaW5nIENPTkZJR19NT0RWRVJTSU9OUz8gKi8KIGludCBtb2R2ZXJzaW9ucyA9IDA7CkBAIC0yMiw2ICsyMyw4IEBACiBzdGF0aWMgaW50IGFsbF92ZXJzaW9ucyA9IDA7CiAvKiBJZiB3ZSBhcmUgbW9kcG9zdGluZyBleHRlcm5hbCBtb2R1bGUgc2V0IHRvIDEgKi8KIHN0YXRpYyBpbnQgZXh0ZXJuYWxfbW9kdWxlID0gMDsKKy8qIEhvdyBhIHN5bWJvbCBpcyBleHBvcnRlZCAqLworZW51bSBleHBvcnQge2V4cG9ydF9wbGFpbiwgZXhwb3J0X2dwbCwgZXhwb3J0X2dwbF9mdXR1cmUsIGV4cG9ydF91bmtub3dufTsKIAogdm9pZCBmYXRhbChjb25zdCBjaGFyICpmbXQsIC4uLikKIHsKQEAgLTk3LDYgKzEwMCw3IEBACiAKIAkvKiBhZGQgdG8gbGlzdCAqLwogCW1vZC0+bmFtZSA9IHA7CisJbW9kLT5ncGxfY29tcGF0aWJsZSA9IC0xOwogCW1vZC0+bmV4dCA9IG1vZHVsZXM7CiAJbW9kdWxlcyA9IG1vZDsKIApAQCAtMTE4LDYgKzEyMiw3IEBACiAJdW5zaWduZWQgaW50IGtlcm5lbDoxOyAgICAgLyogMSBpZiBzeW1ib2wgaXMgZnJvbSBrZXJuZWwKIAkJCQkgICAgKiAgKG9ubHkgZm9yIGV4dGVybmFsIG1vZHVsZXMpICoqLwogCXVuc2lnbmVkIGludCBwcmVsb2FkZWQ6MTsgIC8qIDEgaWYgc3ltYm9sIGZyb20gTW9kdWxlLnN5bXZlcnMgKi8KKwllbnVtIGV4cG9ydCAgZXhwb3J0OyAgICAgICAvKiBUeXBlIG9mIGV4cG9ydCAqLwogCWNoYXIgbmFtZVswXTsKIH07CiAKQEAgLTE1Myw3ICsxNTgsOCBAQAogfQogCiAvKiBGb3IgdGhlIGhhc2ggb2YgZXhwb3J0ZWQgc3ltYm9scyAqLwotc3RhdGljIHN0cnVjdCBzeW1ib2wgKm5ld19zeW1ib2woY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IG1vZHVsZSAqbW9kdWxlKQorc3RhdGljIHN0cnVjdCBzeW1ib2wgKm5ld19zeW1ib2woY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IG1vZHVsZSAqbW9kdWxlLAorCQkJCSBlbnVtIGV4cG9ydCBleHBvcnQpCiB7CiAJdW5zaWduZWQgaW50IGhhc2g7CiAJc3RydWN0IHN5bWJvbCAqbmV3OwpAQCAtMTYxLDYgKzE2Nyw3IEBACiAJaGFzaCA9IHRkYl9oYXNoKG5hbWUpICUgU1lNQk9MX0hBU0hfU0laRTsKIAluZXcgPSBzeW1ib2xoYXNoW2hhc2hdID0gYWxsb2Nfc3ltYm9sKG5hbWUsIDAsIHN5bWJvbGhhc2hbaGFzaF0pOwogCW5ldy0+bW9kdWxlID0gbW9kdWxlOworCW5ldy0+ZXhwb3J0ID0gZXhwb3J0OwogCXJldHVybiBuZXc7CiB9CiAKQEAgLTE3OSwxNiArMTg2LDU1IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgeworCWNvbnN0IGNoYXIgKnN0cjsKKwllbnVtIGV4cG9ydCBleHBvcnQ7Cit9IGV4cG9ydF9saXN0W10gPSB7CisJeyAuc3RyID0gIkVYUE9SVF9TWU1CT0wiLCAgICAgICAgICAgIC5leHBvcnQgPSBleHBvcnRfcGxhaW4gfSwKKwl7IC5zdHIgPSAiRVhQT1JUX1NZTUJPTF9HUEwiLCAgICAgICAgLmV4cG9ydCA9IGV4cG9ydF9ncGwgfSwKKwl7IC5zdHIgPSAiRVhQT1JUX1NZTUJPTF9HUExfRlVUVVJFIiwgLmV4cG9ydCA9IGV4cG9ydF9ncGxfZnV0dXJlIH0sCisJeyAuc3RyID0gIih1bmtub3duKSIsICAgICAgICAgICAgICAgIC5leHBvcnQgPSBleHBvcnRfdW5rbm93biB9LAorfTsKKworCitzdGF0aWMgY29uc3QgY2hhciAqZXhwb3J0X3N0cihlbnVtIGV4cG9ydCBleCkKK3sKKwlyZXR1cm4gZXhwb3J0X2xpc3RbZXhdLnN0cjsKK30KKworc3RhdGljIGVudW0gZXhwb3J0IGV4cG9ydF9ubyhjb25zdCBjaGFyICogcykKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBleHBvcnRfbGlzdFtpXS5leHBvcnQgIT0gZXhwb3J0X3Vua25vd247IGkrKykgeworCQlpZiAoc3RyY21wKGV4cG9ydF9saXN0W2ldLnN0ciwgcykgPT0gMCkKKwkJCXJldHVybiBleHBvcnRfbGlzdFtpXS5leHBvcnQ7CisJfQorCXJldHVybiBleHBvcnRfdW5rbm93bjsKK30KKworc3RhdGljIGVudW0gZXhwb3J0IGV4cG9ydF9mcm9tX3NlYyhzdHJ1Y3QgZWxmX2luZm8gKmVsZiwgRWxmX1NlY3Rpb24gc2VjKQoreworCWlmIChzZWMgPT0gZWxmLT5leHBvcnRfc2VjKQorCQlyZXR1cm4gZXhwb3J0X3BsYWluOworCWVsc2UgaWYgKHNlYyA9PSBlbGYtPmV4cG9ydF9ncGxfc2VjKQorCQlyZXR1cm4gZXhwb3J0X2dwbDsKKwllbHNlIGlmIChzZWMgPT0gZWxmLT5leHBvcnRfZ3BsX2Z1dHVyZV9zZWMpCisJCXJldHVybiBleHBvcnRfZ3BsX2Z1dHVyZTsKKwllbHNlCisJCXJldHVybiBleHBvcnRfdW5rbm93bjsKK30KKwogLyoqCiAgKiBBZGQgYW4gZXhwb3J0ZWQgc3ltYm9sIC0gaXQgbWF5IGhhdmUgYWxyZWFkeSBiZWVuIGFkZGVkIHdpdGhvdXQgYQogICogQ1JDLCBpbiB0aGlzIGNhc2UganVzdCB1cGRhdGUgdGhlIENSQwogICoqLwotc3RhdGljIHN0cnVjdCBzeW1ib2wgKnN5bV9hZGRfZXhwb3J0ZWQoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IG1vZHVsZSAqbW9kKQorc3RhdGljIHN0cnVjdCBzeW1ib2wgKnN5bV9hZGRfZXhwb3J0ZWQoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IG1vZHVsZSAqbW9kLAorCQkJCSAgICAgICBlbnVtIGV4cG9ydCBleHBvcnQpCiB7CiAJc3RydWN0IHN5bWJvbCAqcyA9IGZpbmRfc3ltYm9sKG5hbWUpOwogCiAJaWYgKCFzKSB7Ci0JCXMgPSBuZXdfc3ltYm9sKG5hbWUsIG1vZCk7CisJCXMgPSBuZXdfc3ltYm9sKG5hbWUsIG1vZCwgZXhwb3J0KTsKIAl9IGVsc2UgewogCQlpZiAoIXMtPnByZWxvYWRlZCkgewogCQkJd2FybigiJXM6ICclcycgZXhwb3J0ZWQgdHdpY2UuIFByZXZpb3VzIGV4cG9ydCAiCkBAIC0yMDAsMTYgKzI0NiwxNyBAQAogCXMtPnByZWxvYWRlZCA9IDA7CiAJcy0+dm1saW51eCAgID0gaXNfdm1saW51eChtb2QtPm5hbWUpOwogCXMtPmtlcm5lbCAgICA9IDA7CisJcy0+ZXhwb3J0ICAgID0gZXhwb3J0OwogCXJldHVybiBzOwogfQogCiBzdGF0aWMgdm9pZCBzeW1fdXBkYXRlX2NyYyhjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgbW9kdWxlICptb2QsCi0JCQkgICB1bnNpZ25lZCBpbnQgY3JjKQorCQkJICAgdW5zaWduZWQgaW50IGNyYywgZW51bSBleHBvcnQgZXhwb3J0KQogewogCXN0cnVjdCBzeW1ib2wgKnMgPSBmaW5kX3N5bWJvbChuYW1lKTsKIAogCWlmICghcykKLQkJcyA9IG5ld19zeW1ib2wobmFtZSwgbW9kKTsKKwkJcyA9IG5ld19zeW1ib2wobmFtZSwgbW9kLCBleHBvcnQpOwogCXMtPmNyYyA9IGNyYzsKIAlzLT5jcmNfdmFsaWQgPSAxOwogfQpAQCAtMjgzLDcgKzMzMCw3IEBACiAJaGRyID0gZ3JhYl9maWxlKGZpbGVuYW1lLCAmaW5mby0+c2l6ZSk7CiAJaWYgKCFoZHIpIHsKIAkJcGVycm9yKGZpbGVuYW1lKTsKLQkJYWJvcnQoKTsKKwkJZXhpdCgxKTsKIAl9CiAJaW5mby0+aGRyID0gaGRyOwogCWlmIChpbmZvLT5zaXplIDwgc2l6ZW9mKCpoZHIpKQpAQCAtMzA5LDEzICszNTYsMjEgQEAKIAlmb3IgKGkgPSAxOyBpIDwgaGRyLT5lX3NobnVtOyBpKyspIHsKIAkJY29uc3QgY2hhciAqc2Vjc3RyaW5ncwogCQkJPSAodm9pZCAqKWhkciArIHNlY2hkcnNbaGRyLT5lX3Noc3RybmR4XS5zaF9vZmZzZXQ7CisJCWNvbnN0IGNoYXIgKnNlY25hbWU7CiAKIAkJaWYgKHNlY2hkcnNbaV0uc2hfb2Zmc2V0ID4gaW5mby0+c2l6ZSkKIAkJCWdvdG8gdHJ1bmNhdGVkOwotCQlpZiAoc3RyY21wKHNlY3N0cmluZ3Mrc2VjaGRyc1tpXS5zaF9uYW1lLCAiLm1vZGluZm8iKSA9PSAwKSB7CisJCXNlY25hbWUgPSBzZWNzdHJpbmdzICsgc2VjaGRyc1tpXS5zaF9uYW1lOworCQlpZiAoc3RyY21wKHNlY25hbWUsICIubW9kaW5mbyIpID09IDApIHsKIAkJCWluZm8tPm1vZGluZm8gPSAodm9pZCAqKWhkciArIHNlY2hkcnNbaV0uc2hfb2Zmc2V0OwogCQkJaW5mby0+bW9kaW5mb19sZW4gPSBzZWNoZHJzW2ldLnNoX3NpemU7Ci0JCX0KKwkJfSBlbHNlIGlmIChzdHJjbXAoc2VjbmFtZSwgIl9fa3N5bXRhYiIpID09IDApCisJCQlpbmZvLT5leHBvcnRfc2VjID0gaTsKKwkJZWxzZSBpZiAoc3RyY21wKHNlY25hbWUsICJfX2tzeW10YWJfZ3BsIikgPT0gMCkKKwkJCWluZm8tPmV4cG9ydF9ncGxfc2VjID0gaTsKKwkJZWxzZSBpZiAoc3RyY21wKHNlY25hbWUsICJfX2tzeW10YWJfZ3BsX2Z1dHVyZSIpID09IDApCisJCQlpbmZvLT5leHBvcnRfZ3BsX2Z1dHVyZV9zZWMgPSBpOworCiAJCWlmIChzZWNoZHJzW2ldLnNoX3R5cGUgIT0gU0hUX1NZTVRBQikKIAkJCWNvbnRpbnVlOwogCkBAIC0zNTMsNiArNDA4LDcgQEAKIAkJCSAgICAgICBFbGZfU3ltICpzeW0sIGNvbnN0IGNoYXIgKnN5bW5hbWUpCiB7CiAJdW5zaWduZWQgaW50IGNyYzsKKwllbnVtIGV4cG9ydCBleHBvcnQgPSBleHBvcnRfZnJvbV9zZWMoaW5mbywgc3ltLT5zdF9zaG5keCk7CiAKIAlzd2l0Y2ggKHN5bS0+c3Rfc2huZHgpIHsKIAljYXNlIFNITl9DT01NT046CkBAIC0zNjIsNyArNDE4LDggQEAKIAkJLyogQ1JDJ2Qgc3ltYm9sICovCiAJCWlmIChtZW1jbXAoc3ltbmFtZSwgQ1JDX1BGWCwgc3RybGVuKENSQ19QRlgpKSA9PSAwKSB7CiAJCQljcmMgPSAodW5zaWduZWQgaW50KSBzeW0tPnN0X3ZhbHVlOwotCQkJc3ltX3VwZGF0ZV9jcmMoc3ltbmFtZSArIHN0cmxlbihDUkNfUEZYKSwgbW9kLCBjcmMpOworCQkJc3ltX3VwZGF0ZV9jcmMoc3ltbmFtZSArIHN0cmxlbihDUkNfUEZYKSwgbW9kLCBjcmMsCisJCQkJCWV4cG9ydCk7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBTSE5fVU5ERUY6CkBAIC00MDYsNyArNDYzLDggQEAKIAlkZWZhdWx0OgogCQkvKiBBbGwgZXhwb3J0ZWQgc3ltYm9scyAqLwogCQlpZiAobWVtY21wKHN5bW5hbWUsIEtTWU1UQUJfUEZYLCBzdHJsZW4oS1NZTVRBQl9QRlgpKSA9PSAwKSB7Ci0JCQlzeW1fYWRkX2V4cG9ydGVkKHN5bW5hbWUgKyBzdHJsZW4oS1NZTVRBQl9QRlgpLCBtb2QpOworCQkJc3ltX2FkZF9leHBvcnRlZChzeW1uYW1lICsgc3RybGVuKEtTWU1UQUJfUEZYKSwgbW9kLAorCQkJCQlleHBvcnQpOwogCQl9CiAJCWlmIChzdHJjbXAoc3ltbmFtZSwgTU9EVUxFX1NZTUJPTF9QUkVGSVggImluaXRfbW9kdWxlIikgPT0gMCkKIAkJCW1vZC0+aGFzX2luaXQgPSAxOwpAQCAtNDM3LDEzICs0OTUsMTggQEAKIAlyZXR1cm4gc3RyaW5nOwogfQogCi1zdGF0aWMgY2hhciAqZ2V0X21vZGluZm8odm9pZCAqbW9kaW5mbywgdW5zaWduZWQgbG9uZyBtb2RpbmZvX2xlbiwKLQkJCSBjb25zdCBjaGFyICp0YWcpCitzdGF0aWMgY2hhciAqZ2V0X25leHRfbW9kaW5mbyh2b2lkICptb2RpbmZvLCB1bnNpZ25lZCBsb25nIG1vZGluZm9fbGVuLAorCQkJICAgICAgY29uc3QgY2hhciAqdGFnLCBjaGFyICppbmZvKQogewogCWNoYXIgKnA7CiAJdW5zaWduZWQgaW50IHRhZ2xlbiA9IHN0cmxlbih0YWcpOwogCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IG1vZGluZm9fbGVuOwogCisJaWYgKGluZm8pIHsKKwkJc2l6ZSAtPSBpbmZvIC0gKGNoYXIgKiltb2RpbmZvOworCQltb2RpbmZvID0gbmV4dF9zdHJpbmcoaW5mbywgJnNpemUpOworCX0KKwogCWZvciAocCA9IG1vZGluZm87IHA7IHAgPSBuZXh0X3N0cmluZyhwLCAmc2l6ZSkpIHsKIAkJaWYgKHN0cm5jbXAocCwgdGFnLCB0YWdsZW4pID09IDAgJiYgcFt0YWdsZW5dID09ICc9JykKIAkJCXJldHVybiBwICsgdGFnbGVuICsgMTsKQEAgLTQ1MSw2ICs1MTQsMTMgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAorc3RhdGljIGNoYXIgKmdldF9tb2RpbmZvKHZvaWQgKm1vZGluZm8sIHVuc2lnbmVkIGxvbmcgbW9kaW5mb19sZW4sCisJCQkgY29uc3QgY2hhciAqdGFnKQorCit7CisJcmV0dXJuIGdldF9uZXh0X21vZGluZm8obW9kaW5mbywgbW9kaW5mb19sZW4sIHRhZywgTlVMTCk7Cit9CisKIC8qKgogICogVGVzdCBpZiBzdHJpbmcgcyBlbmRzIGluIHN0cmluZyBzdWIKICAqIHJldHVybiAwIGlmIG1hdGNoCkBAIC04MjEsNiArODkxLDEwIEBACiAJCSIucGNpX2ZpeHVwX2ZpbmFsIiwKIAkJIi5wZHIiLAogCQkiX19wYXJhbSIsCisJCSJfX2V4X3RhYmxlIiwKKwkJIi5maXh1cCIsCisJCSIuc21wX2xvY2tzIiwKKwkJIi5wbHQiLCAgLyogc2VlbiBvbiBBUkNIPXVtIGJ1aWxkIG9uIHg4Nl82NC4gSGFybWxlc3MgKi8KIAkJTlVMTAogCX07CiAJLyogU3RhcnQgb2Ygc2VjdGlvbiBuYW1lcyAqLwpAQCAtODQ2LDYgKzkyMCw4IEBACiAJZm9yIChzID0gbmFtZWxpc3QzOyAqczsgcysrKQogCQlpZiAoc3Ryc3RyKG5hbWUsICpzKSAhPSBOVUxMKQogCQkJcmV0dXJuIDE7CisJaWYgKHN0cnJjbXAobmFtZSwgIi5pbml0IikgPT0gMCkKKwkJcmV0dXJuIDE7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTg5Miw2ICs5NjgsMTAgQEAKIAkJIi5leGl0Y2FsbC5leGl0IiwKIAkJIi5laF9mcmFtZSIsCiAJCSIuc3RhYiIsCisJCSJfX2V4X3RhYmxlIiwKKwkJIi5maXh1cCIsCisJCSIuc21wX2xvY2tzIiwKKwkJIi5wbHQiLCAgLyogc2VlbiBvbiBBUkNIPXVtIGJ1aWxkIG9uIHg4Nl82NC4gSGFybWxlc3MgKi8KIAkJTlVMTAogCX07CiAJLyogU3RhcnQgb2Ygc2VjdGlvbiBuYW1lcyAqLwpAQCAtOTIxLDYgKzEwMDEsNyBAQAogewogCWNvbnN0IGNoYXIgKnN5bW5hbWU7CiAJY2hhciAqdmVyc2lvbjsKKwljaGFyICpsaWNlbnNlOwogCXN0cnVjdCBtb2R1bGUgKm1vZDsKIAlzdHJ1Y3QgZWxmX2luZm8gaW5mbyA9IHsgfTsKIAlFbGZfU3ltICpzeW07CkBAIC05MzYsNiArMTAxNywxOCBAQAogCQltb2QtPnNraXAgPSAxOwogCX0KIAorCWxpY2Vuc2UgPSBnZXRfbW9kaW5mbyhpbmZvLm1vZGluZm8sIGluZm8ubW9kaW5mb19sZW4sICJsaWNlbnNlIik7CisJd2hpbGUgKGxpY2Vuc2UpIHsKKwkJaWYgKGxpY2Vuc2VfaXNfZ3BsX2NvbXBhdGlibGUobGljZW5zZSkpCisJCQltb2QtPmdwbF9jb21wYXRpYmxlID0gMTsKKwkJZWxzZSB7CisJCQltb2QtPmdwbF9jb21wYXRpYmxlID0gMDsKKwkJCWJyZWFrOworCQl9CisJCWxpY2Vuc2UgPSBnZXRfbmV4dF9tb2RpbmZvKGluZm8ubW9kaW5mbywgaW5mby5tb2RpbmZvX2xlbiwKKwkJCQkJICAgImxpY2Vuc2UiLCBsaWNlbnNlKTsKKwl9CisKIAlmb3IgKHN5bSA9IGluZm8uc3ltdGFiX3N0YXJ0OyBzeW0gPCBpbmZvLnN5bXRhYl9zdG9wOyBzeW0rKykgewogCQlzeW1uYW1lID0gaW5mby5zdHJ0YWIgKyBzeW0tPnN0X25hbWU7CiAKQEAgLTk5Miw2ICsxMDg1LDQxIEBACiAJYnVmLT5wb3MgKz0gbGVuOwogfQogCit2b2lkIGNoZWNrX2xpY2Vuc2Uoc3RydWN0IG1vZHVsZSAqbW9kKQoreworCXN0cnVjdCBzeW1ib2wgKnMsICpleHA7CisKKwlmb3IgKHMgPSBtb2QtPnVucmVzOyBzOyBzID0gcy0+bmV4dCkgeworCQljb25zdCBjaGFyICpiYXNlbmFtZTsKKwkJaWYgKG1vZC0+Z3BsX2NvbXBhdGlibGUgPT0gMSkgeworCQkJLyogR1BMLWNvbXBhdGlibGUgbW9kdWxlcyBtYXkgdXNlIGFsbCBzeW1ib2xzICovCisJCQljb250aW51ZTsKKwkJfQorCQlleHAgPSBmaW5kX3N5bWJvbChzLT5uYW1lKTsKKwkJaWYgKCFleHAgfHwgZXhwLT5tb2R1bGUgPT0gbW9kKQorCQkJY29udGludWU7CisJCWJhc2VuYW1lID0gc3RycmNocihtb2QtPm5hbWUsICcvJyk7CisJCWlmIChiYXNlbmFtZSkKKwkJCWJhc2VuYW1lKys7CisJCXN3aXRjaCAoZXhwLT5leHBvcnQpIHsKKwkJCWNhc2UgZXhwb3J0X2dwbDoKKwkJCQlmYXRhbCgibW9kcG9zdDogR1BMLWluY29tcGF0aWJsZSBtb2R1bGUgJXMgIgorCQkJCSAgICAgICJ1c2VzIEdQTC1vbmx5IHN5bWJvbCAnJXMnXG4iLAorCQkJCSBiYXNlbmFtZSA/IGJhc2VuYW1lIDogbW9kLT5uYW1lLAorCQkJCWV4cC0+bmFtZSk7CisJCQkJYnJlYWs7CisJCQljYXNlIGV4cG9ydF9ncGxfZnV0dXJlOgorCQkJCXdhcm4oIm1vZHBvc3Q6IEdQTC1pbmNvbXBhdGlibGUgbW9kdWxlICVzICIKKwkJCQkgICAgICAidXNlcyBmdXR1cmUgR1BMLW9ubHkgc3ltYm9sICclcydcbiIsCisJCQkJICAgICAgYmFzZW5hbWUgPyBiYXNlbmFtZSA6IG1vZC0+bmFtZSwKKwkJCQkgICAgICBleHAtPm5hbWUpOworCQkJCWJyZWFrOworCQkJY2FzZSBleHBvcnRfcGxhaW46IC8qIGlnbm9yZSAqLyBicmVhazsKKwkJCWNhc2UgZXhwb3J0X3Vua25vd246IC8qIGlnbm9yZSAqLyBicmVhazsKKwkJfQorICAgICAgICB9Cit9CisKIC8qKgogICogSGVhZGVyIGZvciB0aGUgZ2VuZXJhdGVkIGZpbGUKICAqKi8KQEAgLTExNDIsNiArMTI3MCw5IEBACiAJZmNsb3NlKGZpbGUpOwogfQogCisvKiBwYXJzZSBNb2R1bGUuc3ltdmVycyBmaWxlLiBsaW5lIGZvcm1hdDoKKyAqIDB4MTIzNDU2Nzg8dGFiPnN5bWJvbDx0YWI+bW9kdWxlWzx0YWI+ZXhwb3J0XQorICoqLwogc3RhdGljIHZvaWQgcmVhZF9kdW1wKGNvbnN0IGNoYXIgKmZuYW1lLCB1bnNpZ25lZCBpbnQga2VybmVsKQogewogCXVuc2lnbmVkIGxvbmcgc2l6ZSwgcG9zID0gMDsKQEAgLTExNTMsNyArMTI4NCw3IEBACiAJCXJldHVybjsKIAogCXdoaWxlICgobGluZSA9IGdldF9uZXh0X2xpbmUoJnBvcywgZmlsZSwgc2l6ZSkpKSB7Ci0JCWNoYXIgKnN5bW5hbWUsICptb2RuYW1lLCAqZDsKKwkJY2hhciAqc3ltbmFtZSwgKm1vZG5hbWUsICpkLCAqZXhwb3J0OwogCQl1bnNpZ25lZCBpbnQgY3JjOwogCQlzdHJ1Y3QgbW9kdWxlICptb2Q7CiAJCXN0cnVjdCBzeW1ib2wgKnM7CkBAIC0xMTY0LDggKzEyOTUsOSBAQAogCQlpZiAoIShtb2RuYW1lID0gc3RyY2hyKHN5bW5hbWUsICdcdCcpKSkKIAkJCWdvdG8gZmFpbDsKIAkJKm1vZG5hbWUrKyA9ICdcMCc7Ci0JCWlmIChzdHJjaHIobW9kbmFtZSwgJ1x0JykpCi0JCQlnb3RvIGZhaWw7CisJCWlmICgoZXhwb3J0ID0gc3RyY2hyKG1vZG5hbWUsICdcdCcpKSAhPSBOVUxMKQorCQkJKmV4cG9ydCsrID0gJ1wwJzsKKwogCQljcmMgPSBzdHJ0b3VsKGxpbmUsICZkLCAxNik7CiAJCWlmICgqc3ltbmFtZSA9PSAnXDAnIHx8ICptb2RuYW1lID09ICdcMCcgfHwgKmQgIT0gJ1wwJykKIAkJCWdvdG8gZmFpbDsKQEAgLTExNzcsMTAgKzEzMDksMTAgQEAKIAkJCW1vZCA9IG5ld19tb2R1bGUoTk9GQUlMKHN0cmR1cChtb2RuYW1lKSkpOwogCQkJbW9kLT5za2lwID0gMTsKIAkJfQotCQlzID0gc3ltX2FkZF9leHBvcnRlZChzeW1uYW1lLCBtb2QpOworCQlzID0gc3ltX2FkZF9leHBvcnRlZChzeW1uYW1lLCBtb2QsIGV4cG9ydF9ubyhleHBvcnQpKTsKIAkJcy0+a2VybmVsICAgID0ga2VybmVsOwogCQlzLT5wcmVsb2FkZWQgPSAxOwotCQlzeW1fdXBkYXRlX2NyYyhzeW1uYW1lLCBtb2QsIGNyYyk7CisJCXN5bV91cGRhdGVfY3JjKHN5bW5hbWUsIG1vZCwgY3JjLCBleHBvcnRfbm8oZXhwb3J0KSk7CiAJfQogCXJldHVybjsKIGZhaWw6CkBAIC0xMjEwLDkgKzEzNDIsMTAgQEAKIAkJc3ltYm9sID0gc3ltYm9saGFzaFtuXTsKIAkJd2hpbGUgKHN5bWJvbCkgewogCQkJaWYgKGR1bXBfc3ltKHN5bWJvbCkpCi0JCQkJYnVmX3ByaW50ZigmYnVmLCAiMHglMDh4XHQlc1x0JXNcbiIsCisJCQkJYnVmX3ByaW50ZigmYnVmLCAiMHglMDh4XHQlc1x0JXNcdCVzXG4iLAogCQkJCQlzeW1ib2wtPmNyYywgc3ltYm9sLT5uYW1lLAotCQkJCQlzeW1ib2wtPm1vZHVsZS0+bmFtZSk7CisJCQkJCXN5bWJvbC0+bW9kdWxlLT5uYW1lLAorCQkJCQlleHBvcnRfc3RyKHN5bWJvbC0+ZXhwb3J0KSk7CiAJCQlzeW1ib2wgPSBzeW1ib2wtPm5leHQ7CiAJCX0KIAl9CkBAIC0xMjYzLDYgKzEzOTYsMTIgQEAKIAlmb3IgKG1vZCA9IG1vZHVsZXM7IG1vZDsgbW9kID0gbW9kLT5uZXh0KSB7CiAJCWlmIChtb2QtPnNraXApCiAJCQljb250aW51ZTsKKwkJY2hlY2tfbGljZW5zZShtb2QpOworCX0KKworCWZvciAobW9kID0gbW9kdWxlczsgbW9kOyBtb2QgPSBtb2QtPm5leHQpIHsKKwkJaWYgKG1vZC0+c2tpcCkKKwkJCWNvbnRpbnVlOwogCiAJCWJ1Zi5wb3MgPSAwOwogCmRpZmYgLS1naXQgYS9zY3JpcHRzL21vZC9tb2Rwb3N0LmggYi9zY3JpcHRzL21vZC9tb2Rwb3N0LmgKaW5kZXggODYxZDg2Ni4uMmIwMGM2MCAxMDA2NDQKLS0tIGEvc2NyaXB0cy9tb2QvbW9kcG9zdC5oCisrKyBiL3NjcmlwdHMvbW9kL21vZHBvc3QuaApAQCAtMTAwLDYgKzEwMCw3IEBACiBzdHJ1Y3QgbW9kdWxlIHsKIAlzdHJ1Y3QgbW9kdWxlICpuZXh0OwogCWNvbnN0IGNoYXIgKm5hbWU7CisJaW50IGdwbF9jb21wYXRpYmxlOwogCXN0cnVjdCBzeW1ib2wgKnVucmVzOwogCWludCBzZWVuOwogCWludCBza2lwOwpAQCAtMTE1LDYgKzExNiw5IEBACiAJRWxmX1NoZHIgICAgICpzZWNoZHJzOwogCUVsZl9TeW0gICAgICAqc3ltdGFiX3N0YXJ0OwogCUVsZl9TeW0gICAgICAqc3ltdGFiX3N0b3A7CisJRWxmX1NlY3Rpb24gIGV4cG9ydF9zZWM7CisJRWxmX1NlY3Rpb24gIGV4cG9ydF9ncGxfc2VjOworCUVsZl9TZWN0aW9uICBleHBvcnRfZ3BsX2Z1dHVyZV9zZWM7CiAJY29uc3QgY2hhciAgICpzdHJ0YWI7CiAJY2hhcgkgICAgICptb2RpbmZvOwogCXVuc2lnbmVkIGludCBtb2RpbmZvX2xlbjsKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGFja2FnZS9ta3NwZWMgYi9zY3JpcHRzL3BhY2thZ2UvbWtzcGVjCmluZGV4IDBiMTAzODcuLmRmODkyODQgMTAwNzU1Ci0tLSBhL3NjcmlwdHMvcGFja2FnZS9ta3NwZWMKKysrIGIvc2NyaXB0cy9wYWNrYWdlL21rc3BlYwpAQCAtNzMsOCArNzMsMTMgQEAKIGVjaG8gJ2NwICRLQlVJTERfSU1BR0UgJFJQTV9CVUlMRF9ST09UJyIvYm9vdC9lZmkvdm1saW51ei0kS0VSTkVMUkVMRUFTRSIKIGVjaG8gJ2xuIC1zICciZWZpL3ZtbGludXotJEtFUk5FTFJFTEVBU0UiICckUlBNX0JVSUxEX1JPT1QnIi9ib290LyIKIGVjaG8gIiVlbHNlIgorZWNobyAiJWlmYXJjaCBwcGM2NCIKK2VjaG8gImNwIHZtbGludXggYXJjaC9wb3dlcnBjL2Jvb3QiCitlY2hvICJjcCBhcmNoL3Bvd2VycGMvYm9vdC8iJyRLQlVJTERfSU1BR0UgJFJQTV9CVUlMRF9ST09UJyIvYm9vdC92bWxpbnV6LSRLRVJORUxSRUxFQVNFIgorZWNobyAiJWVsc2UiCiBlY2hvICdjcCAkS0JVSUxEX0lNQUdFICRSUE1fQlVJTERfUk9PVCciL2Jvb3Qvdm1saW51ei0kS0VSTkVMUkVMRUFTRSIKIGVjaG8gIiVlbmRpZiIKK2VjaG8gIiVlbmRpZiIKIAogZWNobyAnY3AgU3lzdGVtLm1hcCAkUlBNX0JVSUxEX1JPT1QnIi9ib290L1N5c3RlbS5tYXAtJEtFUk5FTFJFTEVBU0UiCiAKZGlmZiAtLWdpdCBhL3NjcmlwdHMvc2V0bG9jYWx2ZXJzaW9uIGIvc2NyaXB0cy9zZXRsb2NhbHZlcnNpb24KaW5kZXggOWEyMzgyNS4uODJlNDk5MyAxMDA2NDQKLS0tIGEvc2NyaXB0cy9zZXRsb2NhbHZlcnNpb24KKysrIGIvc2NyaXB0cy9zZXRsb2NhbHZlcnNpb24KQEAgLTExLDEyICsxMSwxMiBAQAogIyBDaGVjayBmb3IgZ2l0IGFuZCBhIGdpdCByZXBvLgogaWYgaGVhZD1gZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSBIRUFEIDI+L2Rldi9udWxsYDsgdGhlbgogCSMgRG8gd2UgaGF2ZSBhbiB1bnRhZ2dlZCB2ZXJzaW9uPwotCWlmICBbICJgZ2l0IG5hbWUtcmV2IC0tdGFncyBIRUFEYCIgPSAiSEVBRCB1bmRlZmluZWQiIF07IHRoZW4KKwlpZiBnaXQgbmFtZS1yZXYgLS10YWdzIEhFQUQgfCBncmVwIC1FICdeSEVBRFtbOnNwYWNlOl1dKyguKn5bMC05XSp8dW5kZWZpbmVkKSQnID4gL2Rldi9udWxsOyB0aGVuCiAJCXByaW50ZiAnJXMlcycgLWcgYGVjaG8gIiRoZWFkIiB8IGN1dCAtYzEtOGAKIAlmaQogCiAJIyBBcmUgdGhlcmUgdW5jb21taXR0ZWQgY2hhbmdlcz8KLQlpZiBnaXQgZGlmZi1maWxlcyB8IHJlYWQgZHVtbXk7IHRoZW4KKwlpZiBnaXQgZGlmZi1pbmRleCBIRUFEIHwgcmVhZCBkdW1teTsgdGhlbgogCQlwcmludGYgJyVzJyAtZGlydHkKIAlmaQogZmkKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L0tjb25maWcgYi9zZWN1cml0eS9LY29uZmlnCmluZGV4IDM0ZjU5MzQuLjY3Nzg1ZGYgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L0tjb25maWcKKysrIGIvc2VjdXJpdHkvS2NvbmZpZwpAQCAtMjIsMTYgKzIyLDIyIEBACiAJICBJZiB5b3UgYXJlIHVuc3VyZSBhcyB0byB3aGV0aGVyIHRoaXMgaXMgcmVxdWlyZWQsIGFuc3dlciBOLgogCiBjb25maWcgS0VZU19ERUJVR19QUk9DX0tFWVMKLQlib29sICJFbmFibGUgdGhlIC9wcm9jL2tleXMgZmlsZSBieSB3aGljaCBhbGwga2V5cyBtYXkgYmUgdmlld2VkIgorCWJvb2wgIkVuYWJsZSB0aGUgL3Byb2Mva2V5cyBmaWxlIGJ5IHdoaWNoIGtleXMgbWF5IGJlIHZpZXdlZCIKIAlkZXBlbmRzIG9uIEtFWVMKIAloZWxwCi0JICBUaGlzIG9wdGlvbiB0dXJucyBvbiBzdXBwb3J0IGZvciB0aGUgL3Byb2Mva2V5cyBmaWxlIHRocm91Z2ggd2hpY2gKLQkgIGFsbCB0aGUga2V5cyBvbiB0aGUgc3lzdGVtIGNhbiBiZSBsaXN0ZWQuCisJICBUaGlzIG9wdGlvbiB0dXJucyBvbiBzdXBwb3J0IGZvciB0aGUgL3Byb2Mva2V5cyBmaWxlIC0gdGhyb3VnaCB3aGljaAorCSAgY2FuIGJlIGxpc3RlZCBhbGwgdGhlIGtleXMgb24gdGhlIHN5c3RlbSB0aGF0IGFyZSB2aWV3YWJsZSBieSB0aGUKKwkgIHJlYWRpbmcgcHJvY2Vzcy4KIAotCSAgVGhpcyBvcHRpb24gaXMgYSBzbGlnaHQgc2VjdXJpdHkgcmlzayBpbiB0aGF0IGl0IG1ha2VzIGl0IHBvc3NpYmxlCi0JICBmb3IgYW55b25lIHRvIHNlZSBhbGwgdGhlIGtleXMgb24gdGhlIHN5c3RlbS4gTm9ybWFsbHkgdGhlIG1hbmFnZXIKLQkgIHByZXRlbmRzIGtleXMgdGhhdCBhcmUgaW5hY2Nlc3NpYmxlIHRvIGEgcHJvY2VzcyBkb24ndCBleGlzdCBhcyBmYXIKLQkgIGFzIHRoYXQgcHJvY2VzcyBpcyBjb25jZXJuZWQuCisJICBUaGUgb25seSBrZXlzIGluY2x1ZGVkIGluIHRoZSBsaXN0IGFyZSB0aG9zZSB0aGF0IGdyYW50IFZpZXcKKwkgIHBlcm1pc3Npb24gdG8gdGhlIHJlYWRpbmcgcHJvY2VzcyB3aGV0aGVyIG9yIG5vdCBpdCBwb3NzZXNzZXMgdGhlbS4KKwkgIE5vdGUgdGhhdCBMU00gc2VjdXJpdHkgY2hlY2tzIGFyZSBzdGlsbCBwZXJmb3JtZWQsIGFuZCBtYXkgZnVydGhlcgorCSAgZmlsdGVyIG91dCBrZXlzIHRoYXQgdGhlIGN1cnJlbnQgcHJvY2VzcyBpcyBub3QgYXV0aG9yaXNlZCB0byB2aWV3LgorCisJICBPbmx5IGtleSBhdHRyaWJ1dGVzIGFyZSBsaXN0ZWQgaGVyZTsga2V5IHBheWxvYWRzIGFyZSBub3QgaW5jbHVkZWQgaW4KKwkgIHRoZSByZXN1bHRpbmcgdGFibGUuCisKKwkgIElmIHlvdSBhcmUgdW5zdXJlIGFzIHRvIHdoZXRoZXIgdGhpcyBpcyByZXF1aXJlZCwgYW5zd2VyIE4uCiAKIGNvbmZpZyBTRUNVUklUWQogCWJvb2wgIkVuYWJsZSBkaWZmZXJlbnQgc2VjdXJpdHkgbW9kZWxzIgpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvZHVtbXkuYyBiL3NlY3VyaXR5L2R1bW15LmMKaW5kZXggYzNjNTQ5My4uMzEwZmNkZjcgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L2R1bW15LmMKKysrIGIvc2VjdXJpdHkvZHVtbXkuYwpAQCAtODcwLDcgKzg3MCw4IEBACiB9CiAKICNpZmRlZiBDT05GSUdfS0VZUwotc3RhdGljIGlubGluZSBpbnQgZHVtbXlfa2V5X2FsbG9jKHN0cnVjdCBrZXkgKmtleSwgc3RydWN0IHRhc2tfc3RydWN0ICpjdHgpCitzdGF0aWMgaW5saW5lIGludCBkdW1teV9rZXlfYWxsb2Moc3RydWN0IGtleSAqa2V5LCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmN0eCwKKwkJCQkgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9pbm9kZS5jIGIvc2VjdXJpdHkvaW5vZGUuYwppbmRleCBlNmZjMjlhLi45OGEwZGY1IDEwMDY0NAotLS0gYS9zZWN1cml0eS9pbm9kZS5jCisrKyBiL3NlY3VyaXR5L2lub2RlLmMKQEAgLTIyNCw3ICsyMjQsNyBAQAogCiAJcHJfZGVidWcoInNlY3VyaXR5ZnM6IGNyZWF0aW5nIGZpbGUgJyVzJ1xuIixuYW1lKTsKIAotCWVycm9yID0gc2ltcGxlX3Bpbl9mcygic2VjdXJpdHlmcyIsICZtb3VudCwgJm1vdW50X2NvdW50KTsKKwllcnJvciA9IHNpbXBsZV9waW5fZnMoJmZzX3R5cGUsICZtb3VudCwgJm1vdW50X2NvdW50KTsKIAlpZiAoZXJyb3IpIHsKIAkJZGVudHJ5ID0gRVJSX1BUUihlcnJvcik7CiAJCWdvdG8gZXhpdDsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2tleXMvaW50ZXJuYWwuaCBiL3NlY3VyaXR5L2tleXMvaW50ZXJuYWwuaAppbmRleCBlMDY2ZTYwLi4zYzI4NzdmIDEwMDY0NAotLS0gYS9zZWN1cml0eS9rZXlzL2ludGVybmFsLmgKKysrIGIvc2VjdXJpdHkva2V5cy9pbnRlcm5hbC5oCkBAIC05OSw3ICs5OSw4IEBACiBleHRlcm4gc3RydWN0IGtleSAqcmVxdWVzdF9rZXlfYW5kX2xpbmsoc3RydWN0IGtleV90eXBlICp0eXBlLAogCQkJCQljb25zdCBjaGFyICpkZXNjcmlwdGlvbiwKIAkJCQkJY29uc3QgY2hhciAqY2FsbG91dF9pbmZvLAotCQkJCQlzdHJ1Y3Qga2V5ICpkZXN0X2tleXJpbmcpOworCQkJCQlzdHJ1Y3Qga2V5ICpkZXN0X2tleXJpbmcsCisJCQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3MpOwogCiAvKgogICogcmVxdWVzdF9rZXkgYXV0aG9yaXNhdGlvbgpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkva2V5cy9rZXkuYyBiL3NlY3VyaXR5L2tleXMva2V5LmMKaW5kZXggNTFmODUxNS4uNDMyOTVjYSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkva2V5cy9rZXkuYworKysgYi9zZWN1cml0eS9rZXlzL2tleS5jCkBAIC0xNSwxMSArMTUsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlICJpbnRlcm5hbC5oIgogCiBzdGF0aWMga21lbV9jYWNoZV90CSprZXlfamFyOwotc3RhdGljIGtleV9zZXJpYWxfdAlrZXlfc2VyaWFsX25leHQgPSAzOwogc3RydWN0IHJiX3Jvb3QJCWtleV9zZXJpYWxfdHJlZTsgLyogdHJlZSBvZiBrZXlzIGluZGV4ZWQgYnkgc2VyaWFsICovCiBERUZJTkVfU1BJTkxPQ0soa2V5X3NlcmlhbF9sb2NrKTsKIApAQCAtMTY5LDIyICsxNjksMjMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCiAgKiBhc3NpZ24gYSBrZXkgdGhlIG5leHQgdW5pcXVlIHNlcmlhbCBudW1iZXIKLSAqIC0gd2Ugd29yayB0aHJvdWdoIGFsbCB0aGUgc2VyaWFsIG51bWJlcnMgYmV0d2VlbiAyIGFuZCAyXjMxLTEgaW4gdHVybiBhbmQKLSAqICAgdGhlbiB3cmFwCisgKiAtIHRoZXNlIGFyZSBhc3NpZ25lZCByYW5kb21seSB0byBhdm9pZCBzZWN1cml0eSBpc3N1ZXMgdGhyb3VnaCBjb3ZlcnQKKyAqICAgY2hhbm5lbCBwcm9ibGVtcwogICovCiBzdGF0aWMgaW5saW5lIHZvaWQga2V5X2FsbG9jX3NlcmlhbChzdHJ1Y3Qga2V5ICprZXkpCiB7CiAJc3RydWN0IHJiX25vZGUgKnBhcmVudCwgKipwOwogCXN0cnVjdCBrZXkgKnhrZXk7CiAKLQlzcGluX2xvY2soJmtleV9zZXJpYWxfbG9jayk7Ci0KLQkvKiBwcm9wb3NlIGEgbGlrZWx5IHNlcmlhbCBudW1iZXIgYW5kIGxvb2sgZm9yIGEgaG9sZSBmb3IgaXQgaW4gdGhlCisJLyogcHJvcG9zZSBhIHJhbmRvbSBzZXJpYWwgbnVtYmVyIGFuZCBsb29rIGZvciBhIGhvbGUgZm9yIGl0IGluIHRoZQogCSAqIHNlcmlhbCBudW1iZXIgdHJlZSAqLwotCWtleS0+c2VyaWFsID0ga2V5X3NlcmlhbF9uZXh0OwotCWlmIChrZXktPnNlcmlhbCA8IDMpCi0JCWtleS0+c2VyaWFsID0gMzsKLQlrZXlfc2VyaWFsX25leHQgPSBrZXktPnNlcmlhbCArIDE7CisJZG8geworCQlnZXRfcmFuZG9tX2J5dGVzKCZrZXktPnNlcmlhbCwgc2l6ZW9mKGtleS0+c2VyaWFsKSk7CisKKwkJa2V5LT5zZXJpYWwgPj49IDE7IC8qIG5lZ2F0aXZlIG51bWJlcnMgYXJlIG5vdCBwZXJtaXR0ZWQgKi8KKwl9IHdoaWxlIChrZXktPnNlcmlhbCA8IDMpOworCisJc3Bpbl9sb2NrKCZrZXlfc2VyaWFsX2xvY2spOwogCiAJcGFyZW50ID0gTlVMTDsKIAlwID0gJmtleV9zZXJpYWxfdHJlZS5yYl9ub2RlOwpAQCAtMjA0LDEyICsyMDUsMTEgQEAKIAogCS8qIHdlIGZvdW5kIGEga2V5IHdpdGggdGhlIHByb3Bvc2VkIHNlcmlhbCBudW1iZXIgLSB3YWxrIHRoZSB0cmVlIGZyb20KIAkgKiB0aGF0IHBvaW50IGxvb2tpbmcgZm9yIHRoZSBuZXh0IHVudXNlZCBzZXJpYWwgbnVtYmVyICovCi0gc2VyaWFsX2V4aXN0czoKK3NlcmlhbF9leGlzdHM6CiAJZm9yICg7OykgewotCQlrZXktPnNlcmlhbCA9IGtleV9zZXJpYWxfbmV4dDsKKwkJa2V5LT5zZXJpYWwrKzsKIAkJaWYgKGtleS0+c2VyaWFsIDwgMikKIAkJCWtleS0+c2VyaWFsID0gMjsKLQkJa2V5X3NlcmlhbF9uZXh0ID0ga2V5LT5zZXJpYWwgKyAxOwogCiAJCWlmICghcmJfcGFyZW50KHBhcmVudCkpCiAJCQlwID0gJmtleV9zZXJpYWxfdHJlZS5yYl9ub2RlOwpAQCAtMjI4LDcgKzIyOCw3IEBACiAJfQogCiAJLyogd2UndmUgZm91bmQgYSBzdWl0YWJsZSBob2xlIC0gYXJyYW5nZSBmb3IgdGhpcyBrZXkgdG8gb2NjdXB5IGl0ICovCi0gaW5zZXJ0X2hlcmU6CitpbnNlcnRfaGVyZToKIAlyYl9saW5rX25vZGUoJmtleS0+c2VyaWFsX25vZGUsIHBhcmVudCwgcCk7CiAJcmJfaW5zZXJ0X2NvbG9yKCZrZXktPnNlcmlhbF9ub2RlLCAma2V5X3NlcmlhbF90cmVlKTsKIApAQCAtMjQ4LDcgKzI0OCw3IEBACiAgKi8KIHN0cnVjdCBrZXkgKmtleV9hbGxvYyhzdHJ1Y3Qga2V5X3R5cGUgKnR5cGUsIGNvbnN0IGNoYXIgKmRlc2MsCiAJCSAgICAgIHVpZF90IHVpZCwgZ2lkX3QgZ2lkLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmN0eCwKLQkJICAgICAga2V5X3Blcm1fdCBwZXJtLCBpbnQgbm90X2luX3F1b3RhKQorCQkgICAgICBrZXlfcGVybV90IHBlcm0sIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7CiAJc3RydWN0IGtleV91c2VyICp1c2VyID0gTlVMTDsKIAlzdHJ1Y3Qga2V5ICprZXk7CkBAIC0yNjksMTIgKzI2OSwxNCBAQAogCiAJLyogY2hlY2sgdGhhdCB0aGUgdXNlcidzIHF1b3RhIHBlcm1pdHMgYWxsb2NhdGlvbiBvZiBhbm90aGVyIGtleSBhbmQKIAkgKiBpdHMgZGVzY3JpcHRpb24gKi8KLQlpZiAoIW5vdF9pbl9xdW90YSkgeworCWlmICghKGZsYWdzICYgS0VZX0FMTE9DX05PVF9JTl9RVU9UQSkpIHsKIAkJc3Bpbl9sb2NrKCZ1c2VyLT5sb2NrKTsKLQkJaWYgKHVzZXItPnFua2V5cyArIDEgPj0gS0VZUVVPVEFfTUFYX0tFWVMgfHwKLQkJICAgIHVzZXItPnFuYnl0ZXMgKyBxdW90YWxlbiA+PSBLRVlRVU9UQV9NQVhfQllURVMKLQkJICAgICkKLQkJCWdvdG8gbm9fcXVvdGE7CisJCWlmICghKGZsYWdzICYgS0VZX0FMTE9DX1FVT1RBX09WRVJSVU4pKSB7CisJCQlpZiAodXNlci0+cW5rZXlzICsgMSA+PSBLRVlRVU9UQV9NQVhfS0VZUyB8fAorCQkJICAgIHVzZXItPnFuYnl0ZXMgKyBxdW90YWxlbiA+PSBLRVlRVU9UQV9NQVhfQllURVMKKwkJCSAgICApCisJCQkJZ290byBub19xdW90YTsKKwkJfQogCiAJCXVzZXItPnFua2V5cysrOwogCQl1c2VyLT5xbmJ5dGVzICs9IHF1b3RhbGVuOwpAQCAtMzA4LDcgKzMxMCw3IEBACiAJa2V5LT5wYXlsb2FkLmRhdGEgPSBOVUxMOwogCWtleS0+c2VjdXJpdHkgPSBOVUxMOwogCi0JaWYgKCFub3RfaW5fcXVvdGEpCisJaWYgKCEoZmxhZ3MgJiBLRVlfQUxMT0NfTk9UX0lOX1FVT1RBKSkKIAkJa2V5LT5mbGFncyB8PSAxIDw8IEtFWV9GTEFHX0lOX1FVT1RBOwogCiAJbWVtc2V0KCZrZXktPnR5cGVfZGF0YSwgMCwgc2l6ZW9mKGtleS0+dHlwZV9kYXRhKSk7CkBAIC0zMTgsNyArMzIwLDcgQEAKICNlbmRpZgogCiAJLyogbGV0IHRoZSBzZWN1cml0eSBtb2R1bGUga25vdyBhYm91dCB0aGUga2V5ICovCi0JcmV0ID0gc2VjdXJpdHlfa2V5X2FsbG9jKGtleSwgY3R4KTsKKwlyZXQgPSBzZWN1cml0eV9rZXlfYWxsb2Moa2V5LCBjdHgsIGZsYWdzKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBzZWN1cml0eV9lcnJvcjsKIApAQCAtMzMyLDcgKzMzNCw3IEBACiBzZWN1cml0eV9lcnJvcjoKIAlrZnJlZShrZXktPmRlc2NyaXB0aW9uKTsKIAlrbWVtX2NhY2hlX2ZyZWUoa2V5X2phciwga2V5KTsKLQlpZiAoIW5vdF9pbl9xdW90YSkgeworCWlmICghKGZsYWdzICYgS0VZX0FMTE9DX05PVF9JTl9RVU9UQSkpIHsKIAkJc3Bpbl9sb2NrKCZ1c2VyLT5sb2NrKTsKIAkJdXNlci0+cW5rZXlzLS07CiAJCXVzZXItPnFuYnl0ZXMgLT0gcXVvdGFsZW47CkBAIC0zNDUsNyArMzQ3LDcgQEAKIG5vX21lbW9yeV8zOgogCWttZW1fY2FjaGVfZnJlZShrZXlfamFyLCBrZXkpOwogbm9fbWVtb3J5XzI6Ci0JaWYgKCFub3RfaW5fcXVvdGEpIHsKKwlpZiAoIShmbGFncyAmIEtFWV9BTExPQ19OT1RfSU5fUVVPVEEpKSB7CiAJCXNwaW5fbG9jaygmdXNlci0+bG9jayk7CiAJCXVzZXItPnFua2V5cy0tOwogCQl1c2VyLT5xbmJ5dGVzIC09IHF1b3RhbGVuOwpAQCAtNzYxLDcgKzc2Myw3IEBACiAJCQkgICAgICAgY29uc3QgY2hhciAqZGVzY3JpcHRpb24sCiAJCQkgICAgICAgY29uc3Qgdm9pZCAqcGF5bG9hZCwKIAkJCSAgICAgICBzaXplX3QgcGxlbiwKLQkJCSAgICAgICBpbnQgbm90X2luX3F1b3RhKQorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7CiAJc3RydWN0IGtleV90eXBlICprdHlwZTsKIAlzdHJ1Y3Qga2V5ICprZXlyaW5nLCAqa2V5ID0gTlVMTDsKQEAgLTgyMiw3ICs4MjQsNyBAQAogCiAJLyogYWxsb2NhdGUgYSBuZXcga2V5ICovCiAJa2V5ID0ga2V5X2FsbG9jKGt0eXBlLCBkZXNjcmlwdGlvbiwgY3VycmVudC0+ZnN1aWQsIGN1cnJlbnQtPmZzZ2lkLAotCQkJY3VycmVudCwgcGVybSwgbm90X2luX3F1b3RhKTsKKwkJCWN1cnJlbnQsIHBlcm0sIGZsYWdzKTsKIAlpZiAoSVNfRVJSKGtleSkpIHsKIAkJa2V5X3JlZiA9IEVSUl9QVFIoUFRSX0VSUihrZXkpKTsKIAkJZ290byBlcnJvcl8zOwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkva2V5cy9rZXljdGwuYyBiL3NlY3VyaXR5L2tleXMva2V5Y3RsLmMKaW5kZXggZWQ3MWQ4Ni4uMzI5NDExYyAxMDA2NDQKLS0tIGEvc2VjdXJpdHkva2V5cy9rZXljdGwuYworKysgYi9zZWN1cml0eS9rZXlzL2tleWN0bC5jCkBAIC0xMDIsNyArMTAyLDcgQEAKIAkvKiBjcmVhdGUgb3IgdXBkYXRlIHRoZSByZXF1ZXN0ZWQga2V5IGFuZCBhZGQgaXQgdG8gdGhlIHRhcmdldAogCSAqIGtleXJpbmcgKi8KIAlrZXlfcmVmID0ga2V5X2NyZWF0ZV9vcl91cGRhdGUoa2V5cmluZ19yZWYsIHR5cGUsIGRlc2NyaXB0aW9uLAotCQkJCSAgICAgICBwYXlsb2FkLCBwbGVuLCAwKTsKKwkJCQkgICAgICAgcGF5bG9hZCwgcGxlbiwgS0VZX0FMTE9DX0lOX1FVT1RBKTsKIAlpZiAoIUlTX0VSUihrZXlfcmVmKSkgewogCQlyZXQgPSBrZXlfcmVmX3RvX3B0cihrZXlfcmVmKS0+c2VyaWFsOwogCQlrZXlfcmVmX3B1dChrZXlfcmVmKTsKQEAgLTE4NCw3ICsxODQsOCBAQAogCiAJLyogZG8gdGhlIHNlYXJjaCAqLwogCWtleSA9IHJlcXVlc3Rfa2V5X2FuZF9saW5rKGt0eXBlLCBkZXNjcmlwdGlvbiwgY2FsbG91dF9pbmZvLAotCQkJCSAgIGtleV9yZWZfdG9fcHRyKGRlc3RfcmVmKSk7CisJCQkJICAga2V5X3JlZl90b19wdHIoZGVzdF9yZWYpLAorCQkJCSAgIEtFWV9BTExPQ19JTl9RVU9UQSk7CiAJaWYgKElTX0VSUihrZXkpKSB7CiAJCXJldCA9IFBUUl9FUlIoa2V5KTsKIAkJZ290byBlcnJvcjU7CkBAIC02NzIsNiArNjczLDcgQEAKICAqLwogbG9uZyBrZXljdGxfY2hvd25fa2V5KGtleV9zZXJpYWxfdCBpZCwgdWlkX3QgdWlkLCBnaWRfdCBnaWQpCiB7CisJc3RydWN0IGtleV91c2VyICpuZXdvd25lciwgKnphcG93bmVyID0gTlVMTDsKIAlzdHJ1Y3Qga2V5ICprZXk7CiAJa2V5X3JlZl90IGtleV9yZWY7CiAJbG9uZyByZXQ7CkBAIC02OTUsMTkgKzY5Nyw1MCBAQAogCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkgewogCQkvKiBvbmx5IHRoZSBzeXNhZG1pbiBjYW4gY2hvd24gYSBrZXkgdG8gc29tZSBvdGhlciBVSUQgKi8KIAkJaWYgKHVpZCAhPSAodWlkX3QpIC0xICYmIGtleS0+dWlkICE9IHVpZCkKLQkJCWdvdG8gbm9fYWNjZXNzOworCQkJZ290byBlcnJvcl9wdXQ7CiAKIAkJLyogb25seSB0aGUgc3lzYWRtaW4gY2FuIHNldCB0aGUga2V5J3MgR0lEIHRvIGEgZ3JvdXAgb3RoZXIKIAkJICogdGhhbiBvbmUgb2YgdGhvc2UgdGhhdCB0aGUgY3VycmVudCBwcm9jZXNzIHN1YnNjcmliZXMgdG8gKi8KIAkJaWYgKGdpZCAhPSAoZ2lkX3QpIC0xICYmIGdpZCAhPSBrZXktPmdpZCAmJiAhaW5fZ3JvdXBfcChnaWQpKQotCQkJZ290byBub19hY2Nlc3M7CisJCQlnb3RvIGVycm9yX3B1dDsKIAl9CiAKLQkvKiBjaGFuZ2UgdGhlIFVJRCAoaGF2ZSB0byB1cGRhdGUgdGhlIHF1b3RhcykgKi8KKwkvKiBjaGFuZ2UgdGhlIFVJRCAqLwogCWlmICh1aWQgIT0gKHVpZF90KSAtMSAmJiB1aWQgIT0ga2V5LT51aWQpIHsKLQkJLyogZG9uJ3Qgc3VwcG9ydCBVSUQgY2hhbmdpbmcgeWV0ICovCi0JCXJldCA9IC1FT1BOT1RTVVBQOwotCQlnb3RvIG5vX2FjY2VzczsKKwkJcmV0ID0gLUVOT01FTTsKKwkJbmV3b3duZXIgPSBrZXlfdXNlcl9sb29rdXAodWlkKTsKKwkJaWYgKCFuZXdvd25lcikKKwkJCWdvdG8gZXJyb3JfcHV0OworCisJCS8qIHRyYW5zZmVyIHRoZSBxdW90YSBidXJkZW4gdG8gdGhlIG5ldyB1c2VyICovCisJCWlmICh0ZXN0X2JpdChLRVlfRkxBR19JTl9RVU9UQSwgJmtleS0+ZmxhZ3MpKSB7CisJCQlzcGluX2xvY2soJm5ld293bmVyLT5sb2NrKTsKKwkJCWlmIChuZXdvd25lci0+cW5rZXlzICsgMSA+PSBLRVlRVU9UQV9NQVhfS0VZUyB8fAorCQkJICAgIG5ld293bmVyLT5xbmJ5dGVzICsga2V5LT5xdW90YWxlbiA+PQorCQkJICAgIEtFWVFVT1RBX01BWF9CWVRFUykKKwkJCQlnb3RvIHF1b3RhX292ZXJydW47CisKKwkJCW5ld293bmVyLT5xbmtleXMrKzsKKwkJCW5ld293bmVyLT5xbmJ5dGVzICs9IGtleS0+cXVvdGFsZW47CisJCQlzcGluX3VubG9jaygmbmV3b3duZXItPmxvY2spOworCisJCQlzcGluX2xvY2soJmtleS0+dXNlci0+bG9jayk7CisJCQlrZXktPnVzZXItPnFua2V5cy0tOworCQkJa2V5LT51c2VyLT5xbmJ5dGVzIC09IGtleS0+cXVvdGFsZW47CisJCQlzcGluX3VubG9jaygma2V5LT51c2VyLT5sb2NrKTsKKwkJfQorCisJCWF0b21pY19kZWMoJmtleS0+dXNlci0+bmtleXMpOworCQlhdG9taWNfaW5jKCZuZXdvd25lci0+bmtleXMpOworCisJCWlmICh0ZXN0X2JpdChLRVlfRkxBR19JTlNUQU5USUFURUQsICZrZXktPmZsYWdzKSkgeworCQkJYXRvbWljX2RlYygma2V5LT51c2VyLT5uaWtleXMpOworCQkJYXRvbWljX2luYygmbmV3b3duZXItPm5pa2V5cyk7CisJCX0KKworCQl6YXBvd25lciA9IGtleS0+dXNlcjsKKwkJa2V5LT51c2VyID0gbmV3b3duZXI7CisJCWtleS0+dWlkID0gdWlkOwogCX0KIAogCS8qIGNoYW5nZSB0aGUgR0lEICovCkBAIC03MTYsMTIgKzc0OSwyMCBAQAogCiAJcmV0ID0gMDsKIAotIG5vX2FjY2VzczoKK2Vycm9yX3B1dDoKIAl1cF93cml0ZSgma2V5LT5zZW0pOwogCWtleV9wdXQoa2V5KTsKLSBlcnJvcjoKKwlpZiAoemFwb3duZXIpCisJCWtleV91c2VyX3B1dCh6YXBvd25lcik7CitlcnJvcjoKIAlyZXR1cm4gcmV0OwogCitxdW90YV9vdmVycnVuOgorCXNwaW5fdW5sb2NrKCZuZXdvd25lci0+bG9jayk7CisJemFwb3duZXIgPSBuZXdvd25lcjsKKwlyZXQgPSAtRURRVU9UOworCWdvdG8gZXJyb3JfcHV0OworCiB9IC8qIGVuZCBrZXljdGxfY2hvd25fa2V5KCkgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkva2V5cy9rZXlyaW5nLmMgYi9zZWN1cml0eS9rZXlzL2tleXJpbmcuYwppbmRleCAxMzU3MjA3Li5lOGQwMmFjIDEwMDY0NAotLS0gYS9zZWN1cml0eS9rZXlzL2tleXJpbmcuYworKysgYi9zZWN1cml0eS9rZXlzL2tleXJpbmcuYwpAQCAtNDksNiArNDksNyBAQAogc3RhdGljIGludCBrZXlyaW5nX2luc3RhbnRpYXRlKHN0cnVjdCBrZXkgKmtleXJpbmcsCiAJCQkgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGRhdGFsZW4pOwogc3RhdGljIGludCBrZXlyaW5nX21hdGNoKGNvbnN0IHN0cnVjdCBrZXkgKmtleXJpbmcsIGNvbnN0IHZvaWQgKmNyaXRlcmlvbik7CitzdGF0aWMgdm9pZCBrZXlyaW5nX3Jldm9rZShzdHJ1Y3Qga2V5ICprZXlyaW5nKTsKIHN0YXRpYyB2b2lkIGtleXJpbmdfZGVzdHJveShzdHJ1Y3Qga2V5ICprZXlyaW5nKTsKIHN0YXRpYyB2b2lkIGtleXJpbmdfZGVzY3JpYmUoY29uc3Qgc3RydWN0IGtleSAqa2V5cmluZywgc3RydWN0IHNlcV9maWxlICptKTsKIHN0YXRpYyBsb25nIGtleXJpbmdfcmVhZChjb25zdCBzdHJ1Y3Qga2V5ICprZXlyaW5nLApAQCAtNTksNiArNjAsNyBAQAogCS5kZWZfZGF0YWxlbgk9IHNpemVvZihzdHJ1Y3Qga2V5cmluZ19saXN0KSwKIAkuaW5zdGFudGlhdGUJPSBrZXlyaW5nX2luc3RhbnRpYXRlLAogCS5tYXRjaAkJPSBrZXlyaW5nX21hdGNoLAorCS5yZXZva2UJCT0ga2V5cmluZ19yZXZva2UsCiAJLmRlc3Ryb3kJPSBrZXlyaW5nX2Rlc3Ryb3ksCiAJLmRlc2NyaWJlCT0ga2V5cmluZ19kZXNjcmliZSwKIAkucmVhZAkJPSBrZXlyaW5nX3JlYWQsCkBAIC0yNDAsNyArMjQyLDcgQEAKICAqIGFsbG9jYXRlIGEga2V5cmluZyBhbmQgbGluayBpbnRvIHRoZSBkZXN0aW5hdGlvbiBrZXlyaW5nCiAgKi8KIHN0cnVjdCBrZXkgKmtleXJpbmdfYWxsb2MoY29uc3QgY2hhciAqZGVzY3JpcHRpb24sIHVpZF90IHVpZCwgZ2lkX3QgZ2lkLAotCQkJICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmN0eCwgaW50IG5vdF9pbl9xdW90YSwKKwkJCSAgc3RydWN0IHRhc2tfc3RydWN0ICpjdHgsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCiAJCQkgIHN0cnVjdCBrZXkgKmRlc3QpCiB7CiAJc3RydWN0IGtleSAqa2V5cmluZzsKQEAgLTI0OSw3ICsyNTEsNyBAQAogCWtleXJpbmcgPSBrZXlfYWxsb2MoJmtleV90eXBlX2tleXJpbmcsIGRlc2NyaXB0aW9uLAogCQkJICAgIHVpZCwgZ2lkLCBjdHgsCiAJCQkgICAgKEtFWV9QT1NfQUxMICYgfktFWV9QT1NfU0VUQVRUUikgfCBLRVlfVVNSX0FMTCwKLQkJCSAgICBub3RfaW5fcXVvdGEpOworCQkJICAgIGZsYWdzKTsKIAogCWlmICghSVNfRVJSKGtleXJpbmcpKSB7CiAJCXJldCA9IGtleV9pbnN0YW50aWF0ZV9hbmRfbGluayhrZXlyaW5nLCBOVUxMLCAwLCBkZXN0LCBOVUxMKTsKQEAgLTk1MywzICs5NTUsMjIgQEAKIH0gLyogZW5kIGtleXJpbmdfY2xlYXIoKSAqLwogCiBFWFBPUlRfU1lNQk9MKGtleXJpbmdfY2xlYXIpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogZGlzcG9zZSBvZiB0aGUgbGlua3MgZnJvbSBhIHJldm9rZWQga2V5cmluZworICogLSBjYWxsZWQgd2l0aCB0aGUga2V5IHNlbSB3cml0ZS1sb2NrZWQKKyAqLworc3RhdGljIHZvaWQga2V5cmluZ19yZXZva2Uoc3RydWN0IGtleSAqa2V5cmluZykKK3sKKwlzdHJ1Y3Qga2V5cmluZ19saXN0ICprbGlzdCA9IGtleXJpbmctPnBheWxvYWQuc3Vic2NyaXB0aW9uczsKKworCS8qIGFkanVzdCB0aGUgcXVvdGEgKi8KKwlrZXlfcGF5bG9hZF9yZXNlcnZlKGtleXJpbmcsIDApOworCisJaWYgKGtsaXN0KSB7CisJCXJjdV9hc3NpZ25fcG9pbnRlcihrZXlyaW5nLT5wYXlsb2FkLnN1YnNjcmlwdGlvbnMsIE5VTEwpOworCQljYWxsX3JjdSgma2xpc3QtPnJjdSwga2V5cmluZ19jbGVhcl9yY3VfZGlzcG9zYWwpOworCX0KKworfSAvKiBlbmQga2V5cmluZ19yZXZva2UoKSAqLwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkva2V5cy9wcm9jLmMgYi9zZWN1cml0eS9rZXlzL3Byb2MuYwppbmRleCAxMmI3NTBlLi42ODZhOWVlIDEwMDY0NAotLS0gYS9zZWN1cml0eS9rZXlzL3Byb2MuYworKysgYi9zZWN1cml0eS9rZXlzL3Byb2MuYwpAQCAtMTM3LDYgKzEzNywxMyBAQAogCXN0cnVjdCB0aW1lc3BlYyBub3c7CiAJdW5zaWduZWQgbG9uZyB0aW1vOwogCWNoYXIgeGJ1ZlsxMl07CisJaW50IHJjOworCisJLyogY2hlY2sgd2hldGhlciB0aGUgY3VycmVudCB0YXNrIGlzIGFsbG93ZWQgdG8gdmlldyB0aGUga2V5IChhc3N1bWluZworCSAqIG5vbi1wb3NzZXNzaW9uKSAqLworCXJjID0ga2V5X3Rhc2tfcGVybWlzc2lvbihtYWtlX2tleV9yZWYoa2V5LCAwKSwgY3VycmVudCwgS0VZX1ZJRVcpOworCWlmIChyYyA8IDApCisJCXJldHVybiAwOwogCiAJbm93ID0gY3VycmVudF9rZXJuZWxfdGltZSgpOwogCmRpZmYgLS1naXQgYS9zZWN1cml0eS9rZXlzL3Byb2Nlc3Nfa2V5cy5jIGIvc2VjdXJpdHkva2V5cy9wcm9jZXNzX2tleXMuYwppbmRleCA0ZDk4MjVmLi4zMjE1MGNmIDEwMDY0NAotLS0gYS9zZWN1cml0eS9rZXlzL3Byb2Nlc3Nfa2V5cy5jCisrKyBiL3NlY3VyaXR5L2tleXMvcHJvY2Vzc19rZXlzLmMKQEAgLTc3LDcgKzc3LDggQEAKIAkvKiBjb25jb2N0IGEgZGVmYXVsdCBzZXNzaW9uIGtleXJpbmcgKi8KIAlzcHJpbnRmKGJ1ZiwgIl91aWRfc2VzLiV1IiwgdXNlci0+dWlkKTsKIAotCXNlc3Npb25fa2V5cmluZyA9IGtleXJpbmdfYWxsb2MoYnVmLCB1c2VyLT51aWQsIChnaWRfdCkgLTEsIGN0eCwgMCwgTlVMTCk7CisJc2Vzc2lvbl9rZXlyaW5nID0ga2V5cmluZ19hbGxvYyhidWYsIHVzZXItPnVpZCwgKGdpZF90KSAtMSwgY3R4LAorCQkJCQlLRVlfQUxMT0NfSU5fUVVPVEEsIE5VTEwpOwogCWlmIChJU19FUlIoc2Vzc2lvbl9rZXlyaW5nKSkgewogCQlyZXQgPSBQVFJfRVJSKHNlc3Npb25fa2V5cmluZyk7CiAJCWdvdG8gZXJyb3I7CkBAIC04Nyw4ICs4OCw4IEBACiAJICoga2V5cmluZyAqLwogCXNwcmludGYoYnVmLCAiX3VpZC4ldSIsIHVzZXItPnVpZCk7CiAKLQl1aWRfa2V5cmluZyA9IGtleXJpbmdfYWxsb2MoYnVmLCB1c2VyLT51aWQsIChnaWRfdCkgLTEsIGN0eCwgMCwKLQkJCQkgICAgc2Vzc2lvbl9rZXlyaW5nKTsKKwl1aWRfa2V5cmluZyA9IGtleXJpbmdfYWxsb2MoYnVmLCB1c2VyLT51aWQsIChnaWRfdCkgLTEsIGN0eCwKKwkJCQkgICAgS0VZX0FMTE9DX0lOX1FVT1RBLCBzZXNzaW9uX2tleXJpbmcpOwogCWlmIChJU19FUlIodWlkX2tleXJpbmcpKSB7CiAJCWtleV9wdXQoc2Vzc2lvbl9rZXlyaW5nKTsKIAkJcmV0ID0gUFRSX0VSUih1aWRfa2V5cmluZyk7CkBAIC0xNDQsNyArMTQ1LDggQEAKIAogCXNwcmludGYoYnVmLCAiX3RpZC4ldSIsIHRzay0+cGlkKTsKIAotCWtleXJpbmcgPSBrZXlyaW5nX2FsbG9jKGJ1ZiwgdHNrLT51aWQsIHRzay0+Z2lkLCB0c2ssIDEsIE5VTEwpOworCWtleXJpbmcgPSBrZXlyaW5nX2FsbG9jKGJ1ZiwgdHNrLT51aWQsIHRzay0+Z2lkLCB0c2ssCisJCQkJS0VZX0FMTE9DX1FVT1RBX09WRVJSVU4sIE5VTEwpOwogCWlmIChJU19FUlIoa2V5cmluZykpIHsKIAkJcmV0ID0gUFRSX0VSUihrZXlyaW5nKTsKIAkJZ290byBlcnJvcjsKQEAgLTE3OCw3ICsxODAsOCBAQAogCWlmICghdHNrLT5zaWduYWwtPnByb2Nlc3Nfa2V5cmluZykgewogCQlzcHJpbnRmKGJ1ZiwgIl9waWQuJXUiLCB0c2stPnRnaWQpOwogCi0JCWtleXJpbmcgPSBrZXlyaW5nX2FsbG9jKGJ1ZiwgdHNrLT51aWQsIHRzay0+Z2lkLCB0c2ssIDEsIE5VTEwpOworCQlrZXlyaW5nID0ga2V5cmluZ19hbGxvYyhidWYsIHRzay0+dWlkLCB0c2stPmdpZCwgdHNrLAorCQkJCQlLRVlfQUxMT0NfUVVPVEFfT1ZFUlJVTiwgTlVMTCk7CiAJCWlmIChJU19FUlIoa2V5cmluZykpIHsKIAkJCXJldCA9IFBUUl9FUlIoa2V5cmluZyk7CiAJCQlnb3RvIGVycm9yOwpAQCAtMjA5LDYgKzIxMiw3IEBACiBzdGF0aWMgaW50IGluc3RhbGxfc2Vzc2lvbl9rZXlyaW5nKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLAogCQkJCSAgIHN0cnVjdCBrZXkgKmtleXJpbmcpCiB7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3Qga2V5ICpvbGQ7CiAJY2hhciBidWZbMjBdOwogCkBAIC0yMTgsNyArMjIyLDEyIEBACiAJaWYgKCFrZXlyaW5nKSB7CiAJCXNwcmludGYoYnVmLCAiX3Nlcy4ldSIsIHRzay0+dGdpZCk7CiAKLQkJa2V5cmluZyA9IGtleXJpbmdfYWxsb2MoYnVmLCB0c2stPnVpZCwgdHNrLT5naWQsIHRzaywgMSwgTlVMTCk7CisJCWZsYWdzID0gS0VZX0FMTE9DX1FVT1RBX09WRVJSVU47CisJCWlmICh0c2stPnNpZ25hbC0+c2Vzc2lvbl9rZXlyaW5nKQorCQkJZmxhZ3MgPSBLRVlfQUxMT0NfSU5fUVVPVEE7CisKKwkJa2V5cmluZyA9IGtleXJpbmdfYWxsb2MoYnVmLCB0c2stPnVpZCwgdHNrLT5naWQsIHRzaywKKwkJCQkJZmxhZ3MsIE5VTEwpOwogCQlpZiAoSVNfRVJSKGtleXJpbmcpKQogCQkJcmV0dXJuIFBUUl9FUlIoa2V5cmluZyk7CiAJfQpAQCAtNzI4LDcgKzczNyw4IEBACiAJa2V5cmluZyA9IGZpbmRfa2V5cmluZ19ieV9uYW1lKG5hbWUsIDApOwogCWlmIChQVFJfRVJSKGtleXJpbmcpID09IC1FTk9LRVkpIHsKIAkJLyogbm90IGZvdW5kIC0gdHJ5IGFuZCBjcmVhdGUgYSBuZXcgb25lICovCi0JCWtleXJpbmcgPSBrZXlyaW5nX2FsbG9jKG5hbWUsIHRzay0+dWlkLCB0c2stPmdpZCwgdHNrLCAwLCBOVUxMKTsKKwkJa2V5cmluZyA9IGtleXJpbmdfYWxsb2MobmFtZSwgdHNrLT51aWQsIHRzay0+Z2lkLCB0c2ssCisJCQkJCUtFWV9BTExPQ19JTl9RVU9UQSwgTlVMTCk7CiAJCWlmIChJU19FUlIoa2V5cmluZykpIHsKIAkJCXJldCA9IFBUUl9FUlIoa2V5cmluZyk7CiAJCQlnb3RvIGVycm9yMjsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2tleXMvcmVxdWVzdF9rZXkuYyBiL3NlY3VyaXR5L2tleXMvcmVxdWVzdF9rZXkuYwppbmRleCBlYWI2NmEwLi41OGQxZWZkIDEwMDY0NAotLS0gYS9zZWN1cml0eS9rZXlzL3JlcXVlc3Rfa2V5LmMKKysrIGIvc2VjdXJpdHkva2V5cy9yZXF1ZXN0X2tleS5jCkBAIC00OCw4ICs0OCw4IEBACiAJLyogYWxsb2NhdGUgYSBuZXcgc2Vzc2lvbiBrZXlyaW5nICovCiAJc3ByaW50ZihkZXNjLCAiX3JlcS4ldSIsIGtleS0+c2VyaWFsKTsKIAotCWtleXJpbmcgPSBrZXlyaW5nX2FsbG9jKGRlc2MsIGN1cnJlbnQtPmZzdWlkLCBjdXJyZW50LT5mc2dpZCwKLQkJCQljdXJyZW50LCAxLCBOVUxMKTsKKwlrZXlyaW5nID0ga2V5cmluZ19hbGxvYyhkZXNjLCBjdXJyZW50LT5mc3VpZCwgY3VycmVudC0+ZnNnaWQsIGN1cnJlbnQsCisJCQkJS0VZX0FMTE9DX1FVT1RBX09WRVJSVU4sIE5VTEwpOwogCWlmIChJU19FUlIoa2V5cmluZykpIHsKIAkJcmV0ID0gUFRSX0VSUihrZXlyaW5nKTsKIAkJZ290byBlcnJvcl9hbGxvYzsKQEAgLTEyNiw3ICsxMjYsOCBAQAogICovCiBzdGF0aWMgc3RydWN0IGtleSAqX19yZXF1ZXN0X2tleV9jb25zdHJ1Y3Rpb24oc3RydWN0IGtleV90eXBlICp0eXBlLAogCQkJCQkgICAgICBjb25zdCBjaGFyICpkZXNjcmlwdGlvbiwKLQkJCQkJICAgICAgY29uc3QgY2hhciAqY2FsbG91dF9pbmZvKQorCQkJCQkgICAgICBjb25zdCBjaGFyICpjYWxsb3V0X2luZm8sCisJCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7CiAJcmVxdWVzdF9rZXlfYWN0b3JfdCBhY3RvcjsKIAlzdHJ1Y3Qga2V5X2NvbnN0cnVjdGlvbiBjb25zOwpAQCAtMTM0LDEyICsxMzUsMTIgQEAKIAlzdHJ1Y3Qga2V5ICprZXksICphdXRoa2V5OwogCWludCByZXQsIG5lZ2F0ZWQ7CiAKLQlrZW50ZXIoIiVzLCVzLCVzIiwgdHlwZS0+bmFtZSwgZGVzY3JpcHRpb24sIGNhbGxvdXRfaW5mbyk7CisJa2VudGVyKCIlcywlcywlcywlbHgiLCB0eXBlLT5uYW1lLCBkZXNjcmlwdGlvbiwgY2FsbG91dF9pbmZvLCBmbGFncyk7CiAKIAkvKiBjcmVhdGUgYSBrZXkgYW5kIGFkZCBpdCB0byB0aGUgcXVldWUgKi8KIAlrZXkgPSBrZXlfYWxsb2ModHlwZSwgZGVzY3JpcHRpb24sCi0JCQljdXJyZW50LT5mc3VpZCwgY3VycmVudC0+ZnNnaWQsCi0JCQljdXJyZW50LCBLRVlfUE9TX0FMTCwgMCk7CisJCQljdXJyZW50LT5mc3VpZCwgY3VycmVudC0+ZnNnaWQsIGN1cnJlbnQsIEtFWV9QT1NfQUxMLAorCQkJZmxhZ3MpOwogCWlmIChJU19FUlIoa2V5KSkKIAkJZ290byBhbGxvY19mYWlsZWQ7CiAKQEAgLTI1OCwxNSArMjU5LDE2IEBACiBzdGF0aWMgc3RydWN0IGtleSAqcmVxdWVzdF9rZXlfY29uc3RydWN0aW9uKHN0cnVjdCBrZXlfdHlwZSAqdHlwZSwKIAkJCQkJICAgIGNvbnN0IGNoYXIgKmRlc2NyaXB0aW9uLAogCQkJCQkgICAgc3RydWN0IGtleV91c2VyICp1c2VyLAotCQkJCQkgICAgY29uc3QgY2hhciAqY2FsbG91dF9pbmZvKQorCQkJCQkgICAgY29uc3QgY2hhciAqY2FsbG91dF9pbmZvLAorCQkJCQkgICAgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKIAlzdHJ1Y3Qga2V5X2NvbnN0cnVjdGlvbiAqcGNvbnM7CiAJc3RydWN0IGtleSAqa2V5LCAqY2tleTsKIAogCURFQ0xBUkVfV0FJVFFVRVVFKG15c2VsZiwgY3VycmVudCk7CiAKLQlrZW50ZXIoIiVzLCVzLHslZH0sJXMiLAotCSAgICAgICB0eXBlLT5uYW1lLCBkZXNjcmlwdGlvbiwgdXNlci0+dWlkLCBjYWxsb3V0X2luZm8pOworCWtlbnRlcigiJXMsJXMseyVkfSwlcywlbHgiLAorCSAgICAgICB0eXBlLT5uYW1lLCBkZXNjcmlwdGlvbiwgdXNlci0+dWlkLCBjYWxsb3V0X2luZm8sIGZsYWdzKTsKIAogCS8qIHNlZSBpZiB0aGVyZSdzIHN1Y2ggYSBrZXkgdW5kZXIgY29uc3RydWN0aW9uIGFscmVhZHkgKi8KIAlkb3duX3dyaXRlKCZrZXlfY29uc3RydWN0aW9uX3NlbSk7CkBAIC0yODIsNyArMjg0LDggQEAKIAl9CiAKIAkvKiBzZWUgYWJvdXQgZ2V0dGluZyB1c2Vyc3BhY2UgdG8gY29uc3RydWN0IHRoZSBrZXkgKi8KLQlrZXkgPSBfX3JlcXVlc3Rfa2V5X2NvbnN0cnVjdGlvbih0eXBlLCBkZXNjcmlwdGlvbiwgY2FsbG91dF9pbmZvKTsKKwlrZXkgPSBfX3JlcXVlc3Rfa2V5X2NvbnN0cnVjdGlvbih0eXBlLCBkZXNjcmlwdGlvbiwgY2FsbG91dF9pbmZvLAorCQkJCQkgZmxhZ3MpOwogIGVycm9yOgogCWtsZWF2ZSgiID0gJXAiLCBrZXkpOwogCXJldHVybiBrZXk7CkBAIC0zODksMTQgKzM5MiwxNSBAQAogc3RydWN0IGtleSAqcmVxdWVzdF9rZXlfYW5kX2xpbmsoc3RydWN0IGtleV90eXBlICp0eXBlLAogCQkJCSBjb25zdCBjaGFyICpkZXNjcmlwdGlvbiwKIAkJCQkgY29uc3QgY2hhciAqY2FsbG91dF9pbmZvLAotCQkJCSBzdHJ1Y3Qga2V5ICpkZXN0X2tleXJpbmcpCisJCQkJIHN0cnVjdCBrZXkgKmRlc3Rfa2V5cmluZywKKwkJCQkgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKIAlzdHJ1Y3Qga2V5X3VzZXIgKnVzZXI7CiAJc3RydWN0IGtleSAqa2V5OwogCWtleV9yZWZfdCBrZXlfcmVmOwogCi0Ja2VudGVyKCIlcywlcywlcywlcCIsCi0JICAgICAgIHR5cGUtPm5hbWUsIGRlc2NyaXB0aW9uLCBjYWxsb3V0X2luZm8sIGRlc3Rfa2V5cmluZyk7CisJa2VudGVyKCIlcywlcywlcywlcCwlbHgiLAorCSAgICAgICB0eXBlLT5uYW1lLCBkZXNjcmlwdGlvbiwgY2FsbG91dF9pbmZvLCBkZXN0X2tleXJpbmcsIGZsYWdzKTsKIAogCS8qIHNlYXJjaCBhbGwgdGhlIHByb2Nlc3Mga2V5cmluZ3MgZm9yIGEga2V5ICovCiAJa2V5X3JlZiA9IHNlYXJjaF9wcm9jZXNzX2tleXJpbmdzKHR5cGUsIGRlc2NyaXB0aW9uLCB0eXBlLT5tYXRjaCwKQEAgLTQyOSw3ICs0MzMsOCBAQAogCQkJLyogYXNrIHVzZXJzcGFjZSAocmV0dXJucyBOVUxMIGlmIGl0IHdhaXRlZCBvbiBhIGtleQogCQkJICogYmVpbmcgY29uc3RydWN0ZWQpICovCiAJCQlrZXkgPSByZXF1ZXN0X2tleV9jb25zdHJ1Y3Rpb24odHlwZSwgZGVzY3JpcHRpb24sCi0JCQkJCQkgICAgICAgdXNlciwgY2FsbG91dF9pbmZvKTsKKwkJCQkJCSAgICAgICB1c2VyLCBjYWxsb3V0X2luZm8sCisJCQkJCQkgICAgICAgZmxhZ3MpOwogCQkJaWYgKGtleSkKIAkJCQlicmVhazsKIApAQCAtNDg1LDcgKzQ5MCw4IEBACiAJCQljb25zdCBjaGFyICpkZXNjcmlwdGlvbiwKIAkJCWNvbnN0IGNoYXIgKmNhbGxvdXRfaW5mbykKIHsKLQlyZXR1cm4gcmVxdWVzdF9rZXlfYW5kX2xpbmsodHlwZSwgZGVzY3JpcHRpb24sIGNhbGxvdXRfaW5mbywgTlVMTCk7CisJcmV0dXJuIHJlcXVlc3Rfa2V5X2FuZF9saW5rKHR5cGUsIGRlc2NyaXB0aW9uLCBjYWxsb3V0X2luZm8sIE5VTEwsCisJCQkJICAgIEtFWV9BTExPQ19JTl9RVU9UQSk7CiAKIH0gLyogZW5kIHJlcXVlc3Rfa2V5KCkgKi8KIApkaWZmIC0tZ2l0IGEvc2VjdXJpdHkva2V5cy9yZXF1ZXN0X2tleV9hdXRoLmMgYi9zZWN1cml0eS9rZXlzL3JlcXVlc3Rfa2V5X2F1dGguYwppbmRleCBjYjk4MTdjLi5jYmY1OGE5IDEwMDY0NAotLS0gYS9zZWN1cml0eS9rZXlzL3JlcXVlc3Rfa2V5X2F1dGguYworKysgYi9zZWN1cml0eS9rZXlzL3JlcXVlc3Rfa2V5X2F1dGguYwpAQCAtMTg3LDcgKzE4Nyw3IEBACiAJYXV0aGtleSA9IGtleV9hbGxvYygma2V5X3R5cGVfcmVxdWVzdF9rZXlfYXV0aCwgZGVzYywKIAkJCSAgICBjdXJyZW50LT5mc3VpZCwgY3VycmVudC0+ZnNnaWQsIGN1cnJlbnQsCiAJCQkgICAgS0VZX1BPU19WSUVXIHwgS0VZX1BPU19SRUFEIHwgS0VZX1BPU19TRUFSQ0ggfAotCQkJICAgIEtFWV9VU1JfVklFVywgMSk7CisJCQkgICAgS0VZX1VTUl9WSUVXLCBLRVlfQUxMT0NfTk9UX0lOX1FVT1RBKTsKIAlpZiAoSVNfRVJSKGF1dGhrZXkpKSB7CiAJCXJldCA9IFBUUl9FUlIoYXV0aGtleSk7CiAJCWdvdG8gZXJyb3JfYWxsb2M7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9rZXlzL3VzZXJfZGVmaW5lZC5jIGIvc2VjdXJpdHkva2V5cy91c2VyX2RlZmluZWQuYwppbmRleCA4ZTcxODk1Li41YmJmZGViIDEwMDY0NAotLS0gYS9zZWN1cml0eS9rZXlzL3VzZXJfZGVmaW5lZC5jCisrKyBiL3NlY3VyaXR5L2tleXMvdXNlcl9kZWZpbmVkLmMKQEAgLTI4LDYgKzI4LDcgQEAKIAkuaW5zdGFudGlhdGUJPSB1c2VyX2luc3RhbnRpYXRlLAogCS51cGRhdGUJCT0gdXNlcl91cGRhdGUsCiAJLm1hdGNoCQk9IHVzZXJfbWF0Y2gsCisJLnJldm9rZQkJPSB1c2VyX3Jldm9rZSwKIAkuZGVzdHJveQk9IHVzZXJfZGVzdHJveSwKIAkuZGVzY3JpYmUJPSB1c2VyX2Rlc2NyaWJlLAogCS5yZWFkCQk9IHVzZXJfcmVhZCwKQEAgLTY3LDYgKzY4LDcgQEAKIAlyZXR1cm4gcmV0OwogCiB9IC8qIGVuZCB1c2VyX2luc3RhbnRpYXRlKCkgKi8KKwogRVhQT1JUX1NZTUJPTF9HUEwodXNlcl9pbnN0YW50aWF0ZSk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTE0MSw3ICsxNDMsMjggQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKLSAqIGRpc3Bvc2Ugb2YgdGhlIGRhdGEgZGFuZ2xpbmcgZnJvbSB0aGUgY29ycHNlIG9mIGEgdXNlcgorICogZGlzcG9zZSBvZiB0aGUgbGlua3MgZnJvbSBhIHJldm9rZWQga2V5cmluZworICogLSBjYWxsZWQgd2l0aCB0aGUga2V5IHNlbSB3cml0ZS1sb2NrZWQKKyAqLwordm9pZCB1c2VyX3Jldm9rZShzdHJ1Y3Qga2V5ICprZXkpCit7CisJc3RydWN0IHVzZXJfa2V5X3BheWxvYWQgKnVwYXlsb2FkID0ga2V5LT5wYXlsb2FkLmRhdGE7CisKKwkvKiBjbGVhciB0aGUgcXVvdGEgKi8KKwlrZXlfcGF5bG9hZF9yZXNlcnZlKGtleSwgMCk7CisKKwlpZiAodXBheWxvYWQpIHsKKwkJcmN1X2Fzc2lnbl9wb2ludGVyKGtleS0+cGF5bG9hZC5kYXRhLCBOVUxMKTsKKwkJY2FsbF9yY3UoJnVwYXlsb2FkLT5yY3UsIHVzZXJfdXBkYXRlX3JjdV9kaXNwb3NhbCk7CisJfQorCit9IC8qIGVuZCB1c2VyX3Jldm9rZSgpICovCisKK0VYUE9SVF9TWU1CT0wodXNlcl9yZXZva2UpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogZGlzcG9zZSBvZiB0aGUgZGF0YSBkYW5nbGluZyBmcm9tIHRoZSBjb3Jwc2Ugb2YgYSB1c2VyIGtleQogICovCiB2b2lkIHVzZXJfZGVzdHJveShzdHJ1Y3Qga2V5ICprZXkpCiB7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L2hvb2tzLmMgYi9zZWN1cml0eS9zZWxpbnV4L2hvb2tzLmMKaW5kZXggNzljMTZlMy4uYWM3ZjJiMiAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9ob29rcy5jCisrKyBiL3NlY3VyaXR5L3NlbGludXgvaG9va3MuYwpAQCAtMTA5OSw2ICsxMDk5LDE3IEBACiAJCQkgICAgRklMRVNZU1RFTV9fQVNTT0NJQVRFLCAmYWQpOwogfQogCisvKiBDaGVjayB3aGV0aGVyIGEgdGFzayBjYW4gY3JlYXRlIGEga2V5LiAqLworc3RhdGljIGludCBtYXlfY3JlYXRlX2tleSh1MzIga3NpZCwKKwkJCSAgc3RydWN0IHRhc2tfc3RydWN0ICpjdHgpCit7CisJc3RydWN0IHRhc2tfc2VjdXJpdHlfc3RydWN0ICp0c2VjOworCisJdHNlYyA9IGN0eC0+c2VjdXJpdHk7CisKKwlyZXR1cm4gYXZjX2hhc19wZXJtKHRzZWMtPnNpZCwga3NpZCwgU0VDQ0xBU1NfS0VZLCBLRVlfX0NSRUFURSwgTlVMTCk7Cit9CisKICNkZWZpbmUgTUFZX0xJTksgICAwCiAjZGVmaW5lIE1BWV9VTkxJTksgMQogI2RlZmluZSBNQVlfUk1ESVIgIDIKQEAgLTE1MjEsOCArMTUzMiw5IEBACiAJLyogRGVmYXVsdCB0byB0aGUgY3VycmVudCB0YXNrIFNJRC4gKi8KIAlic2VjLT5zaWQgPSB0c2VjLT5zaWQ7CiAKLQkvKiBSZXNldCBjcmVhdGUgU0lEIG9uIGV4ZWN2ZS4gKi8KKwkvKiBSZXNldCBjcmVhdGUgYW5kIHNvY2tjcmVhdGUgU0lEIG9uIGV4ZWN2ZS4gKi8KIAl0c2VjLT5jcmVhdGVfc2lkID0gMDsKKwl0c2VjLT5zb2NrY3JlYXRlX3NpZCA9IDA7CiAKIAlpZiAodHNlYy0+ZXhlY19zaWQpIHsKIAkJbmV3c2lkID0gdHNlYy0+ZXhlY19zaWQ7CkBAIC0yNTc0LDkgKzI1ODYsMTAgQEAKIAl0c2VjMi0+b3NpZCA9IHRzZWMxLT5vc2lkOwogCXRzZWMyLT5zaWQgPSB0c2VjMS0+c2lkOwogCi0JLyogUmV0YWluIHRoZSBleGVjIGFuZCBjcmVhdGUgU0lEcyBhY3Jvc3MgZm9yayAqLworCS8qIFJldGFpbiB0aGUgZXhlYywgY3JlYXRlLCBhbmQgc29jayBTSURzIGFjcm9zcyBmb3JrICovCiAJdHNlYzItPmV4ZWNfc2lkID0gdHNlYzEtPmV4ZWNfc2lkOwogCXRzZWMyLT5jcmVhdGVfc2lkID0gdHNlYzEtPmNyZWF0ZV9zaWQ7CisJdHNlYzItPnNvY2tjcmVhdGVfc2lkID0gdHNlYzEtPnNvY2tjcmVhdGVfc2lkOwogCiAJLyogUmV0YWluIHB0cmFjZXIgU0lEIGFjcm9zcyBmb3JrLCBpZiBhbnkuCiAJICAgVGhpcyB3aWxsIGJlIHJlc2V0IGJ5IHRoZSBwdHJhY2UgaG9vayB1cG9uIGFueQpAQCAtMjkyNiwxMiArMjkzOSwxNCBAQAogewogCWludCBlcnIgPSAwOwogCXN0cnVjdCB0YXNrX3NlY3VyaXR5X3N0cnVjdCAqdHNlYzsKKwl1MzIgbmV3c2lkOwogCiAJaWYgKGtlcm4pCiAJCWdvdG8gb3V0OwogCiAJdHNlYyA9IGN1cnJlbnQtPnNlY3VyaXR5OwotCWVyciA9IGF2Y19oYXNfcGVybSh0c2VjLT5zaWQsIHRzZWMtPnNpZCwKKwluZXdzaWQgPSB0c2VjLT5zb2NrY3JlYXRlX3NpZCA/IDogdHNlYy0+c2lkOworCWVyciA9IGF2Y19oYXNfcGVybSh0c2VjLT5zaWQsIG5ld3NpZCwKIAkJCSAgIHNvY2tldF90eXBlX3RvX3NlY3VyaXR5X2NsYXNzKGZhbWlseSwgdHlwZSwKIAkJCSAgIHByb3RvY29sKSwgU09DS0VUX19DUkVBVEUsIE5VTEwpOwogCkBAIC0yOTQ0LDEyICsyOTU5LDE0IEBACiB7CiAJc3RydWN0IGlub2RlX3NlY3VyaXR5X3N0cnVjdCAqaXNlYzsKIAlzdHJ1Y3QgdGFza19zZWN1cml0eV9zdHJ1Y3QgKnRzZWM7CisJdTMyIG5ld3NpZDsKIAogCWlzZWMgPSBTT0NLX0lOT0RFKHNvY2spLT5pX3NlY3VyaXR5OwogCiAJdHNlYyA9IGN1cnJlbnQtPnNlY3VyaXR5OworCW5ld3NpZCA9IHRzZWMtPnNvY2tjcmVhdGVfc2lkID8gOiB0c2VjLT5zaWQ7CiAJaXNlYy0+c2NsYXNzID0gc29ja2V0X3R5cGVfdG9fc2VjdXJpdHlfY2xhc3MoZmFtaWx5LCB0eXBlLCBwcm90b2NvbCk7Ci0JaXNlYy0+c2lkID0ga2VybiA/IFNFQ0lOSVRTSURfS0VSTkVMIDogdHNlYy0+c2lkOworCWlzZWMtPnNpZCA9IGtlcm4gPyBTRUNJTklUU0lEX0tFUk5FTCA6IG5ld3NpZDsKIAlpc2VjLT5pbml0aWFsaXplZCA9IDE7CiAKIAlyZXR1cm47CkBAIC00MTUwLDYgKzQxNjcsMTAgQEAKIAkJc2lkID0gdHNlYy0+ZXhlY19zaWQ7CiAJZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiZnNjcmVhdGUiKSkKIAkJc2lkID0gdHNlYy0+Y3JlYXRlX3NpZDsKKwllbHNlIGlmICghc3RyY21wKG5hbWUsICJrZXljcmVhdGUiKSkKKwkJc2lkID0gdHNlYy0+a2V5Y3JlYXRlX3NpZDsKKwllbHNlIGlmICghc3RyY21wKG5hbWUsICJzb2NrY3JlYXRlIikpCisJCXNpZCA9IHRzZWMtPnNvY2tjcmVhdGVfc2lkOwogCWVsc2UKIAkJcmV0dXJuIC1FSU5WQUw7CiAKQEAgLTQxODIsNiArNDIwMywxMCBAQAogCQllcnJvciA9IHRhc2tfaGFzX3Blcm0oY3VycmVudCwgcCwgUFJPQ0VTU19fU0VURVhFQyk7CiAJZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiZnNjcmVhdGUiKSkKIAkJZXJyb3IgPSB0YXNrX2hhc19wZXJtKGN1cnJlbnQsIHAsIFBST0NFU1NfX1NFVEZTQ1JFQVRFKTsKKwllbHNlIGlmICghc3RyY21wKG5hbWUsICJrZXljcmVhdGUiKSkKKwkJZXJyb3IgPSB0YXNrX2hhc19wZXJtKGN1cnJlbnQsIHAsIFBST0NFU1NfX1NFVEtFWUNSRUFURSk7CisJZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAic29ja2NyZWF0ZSIpKQorCQllcnJvciA9IHRhc2tfaGFzX3Blcm0oY3VycmVudCwgcCwgUFJPQ0VTU19fU0VUU09DS0NSRUFURSk7CiAJZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiY3VycmVudCIpKQogCQllcnJvciA9IHRhc2tfaGFzX3Blcm0oY3VycmVudCwgcCwgUFJPQ0VTU19fU0VUQ1VSUkVOVCk7CiAJZWxzZQpAQCAtNDIxMSw2ICs0MjM2LDEzIEBACiAJCXRzZWMtPmV4ZWNfc2lkID0gc2lkOwogCWVsc2UgaWYgKCFzdHJjbXAobmFtZSwgImZzY3JlYXRlIikpCiAJCXRzZWMtPmNyZWF0ZV9zaWQgPSBzaWQ7CisJZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAia2V5Y3JlYXRlIikpIHsKKwkJZXJyb3IgPSBtYXlfY3JlYXRlX2tleShzaWQsIHApOworCQlpZiAoZXJyb3IpCisJCQlyZXR1cm4gZXJyb3I7CisJCXRzZWMtPmtleWNyZWF0ZV9zaWQgPSBzaWQ7CisJfSBlbHNlIGlmICghc3RyY21wKG5hbWUsICJzb2NrY3JlYXRlIikpCisJCXRzZWMtPnNvY2tjcmVhdGVfc2lkID0gc2lkOwogCWVsc2UgaWYgKCFzdHJjbXAobmFtZSwgImN1cnJlbnQiKSkgewogCQlzdHJ1Y3QgYXZfZGVjaXNpb24gYXZkOwogCkBAIC00MjY0LDcgKzQyOTYsOCBAQAogCiAjaWZkZWYgQ09ORklHX0tFWVMKIAotc3RhdGljIGludCBzZWxpbnV4X2tleV9hbGxvYyhzdHJ1Y3Qga2V5ICprLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKK3N0YXRpYyBpbnQgc2VsaW51eF9rZXlfYWxsb2Moc3RydWN0IGtleSAqaywgc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7CiAJc3RydWN0IHRhc2tfc2VjdXJpdHlfc3RydWN0ICp0c2VjID0gdHNrLT5zZWN1cml0eTsKIAlzdHJ1Y3Qga2V5X3NlY3VyaXR5X3N0cnVjdCAqa3NlYzsKQEAgLTQyNzQsNyArNDMwNywxMCBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCWtzZWMtPm9iaiA9IGs7Ci0Ja3NlYy0+c2lkID0gdHNlYy0+c2lkOworCWlmICh0c2VjLT5rZXljcmVhdGVfc2lkKQorCQlrc2VjLT5zaWQgPSB0c2VjLT5rZXljcmVhdGVfc2lkOworCWVsc2UKKwkJa3NlYy0+c2lkID0gdHNlYy0+c2lkOwogCWstPnNlY3VyaXR5ID0ga3NlYzsKIAogCXJldHVybiAwOwpAQCAtNDUxMyw4ICs0NTQ5LDEwIEBACiAKICNpZmRlZiBDT05GSUdfS0VZUwogCS8qIEFkZCBzZWN1cml0eSBpbmZvcm1hdGlvbiB0byBpbml0aWFsIGtleXJpbmdzICovCi0Jc2VjdXJpdHlfa2V5X2FsbG9jKCZyb290X3VzZXJfa2V5cmluZywgY3VycmVudCk7Ci0Jc2VjdXJpdHlfa2V5X2FsbG9jKCZyb290X3Nlc3Npb25fa2V5cmluZywgY3VycmVudCk7CisJc2VsaW51eF9rZXlfYWxsb2MoJnJvb3RfdXNlcl9rZXlyaW5nLCBjdXJyZW50LAorCQkJICBLRVlfQUxMT0NfTk9UX0lOX1FVT1RBKTsKKwlzZWxpbnV4X2tleV9hbGxvYygmcm9vdF9zZXNzaW9uX2tleXJpbmcsIGN1cnJlbnQsCisJCQkgIEtFWV9BTExPQ19OT1RfSU5fUVVPVEEpOwogI2VuZGlmCiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9hdl9wZXJtX3RvX3N0cmluZy5oIGIvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL2F2X3Blcm1fdG9fc3RyaW5nLmgKaW5kZXggYmMwMjBiZC4uN2M5YjU4MyAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL2F2X3Blcm1fdG9fc3RyaW5nLmgKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL2F2X3Blcm1fdG9fc3RyaW5nLmgKQEAgLTcyLDYgKzcyLDggQEAKICAgIFNfKFNFQ0NMQVNTX1BST0NFU1MsIFBST0NFU1NfX0VYRUNNRU0sICJleGVjbWVtIikKICAgIFNfKFNFQ0NMQVNTX1BST0NFU1MsIFBST0NFU1NfX0VYRUNTVEFDSywgImV4ZWNzdGFjayIpCiAgICBTXyhTRUNDTEFTU19QUk9DRVNTLCBQUk9DRVNTX19FWEVDSEVBUCwgImV4ZWNoZWFwIikKKyAgIFNfKFNFQ0NMQVNTX1BST0NFU1MsIFBST0NFU1NfX1NFVEtFWUNSRUFURSwgInNldGtleWNyZWF0ZSIpCisgICBTXyhTRUNDTEFTU19QUk9DRVNTLCBQUk9DRVNTX19TRVRTT0NLQ1JFQVRFLCAic2V0c29ja2NyZWF0ZSIpCiAgICBTXyhTRUNDTEFTU19NU0dRLCBNU0dRX19FTlFVRVVFLCAiZW5xdWV1ZSIpCiAgICBTXyhTRUNDTEFTU19NU0csIE1TR19fU0VORCwgInNlbmQiKQogICAgU18oU0VDQ0xBU1NfTVNHLCBNU0dfX1JFQ0VJVkUsICJyZWNlaXZlIikKQEAgLTI0OCwzICsyNTAsNCBAQAogICAgU18oU0VDQ0xBU1NfS0VZLCBLRVlfX1NFQVJDSCwgInNlYXJjaCIpCiAgICBTXyhTRUNDTEFTU19LRVksIEtFWV9fTElOSywgImxpbmsiKQogICAgU18oU0VDQ0xBU1NfS0VZLCBLRVlfX1NFVEFUVFIsICJzZXRhdHRyIikKKyAgIFNfKFNFQ0NMQVNTX0tFWSwgS0VZX19DUkVBVEUsICJjcmVhdGUiKQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL2F2X3Blcm1pc3Npb25zLmggYi9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvYXZfcGVybWlzc2lvbnMuaAppbmRleCAxMjA1MjI3Li42OWZkNGI0IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvYXZfcGVybWlzc2lvbnMuaAorKysgYi9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvYXZfcGVybWlzc2lvbnMuaApAQCAtNDY3LDYgKzQ2Nyw4IEBACiAjZGVmaW5lIFBST0NFU1NfX0VYRUNNRU0gICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMDAwMDBVTAogI2RlZmluZSBQUk9DRVNTX19FWEVDU1RBQ0sgICAgICAgICAgICAgICAgICAgICAgICAweDA0MDAwMDAwVUwKICNkZWZpbmUgUFJPQ0VTU19fRVhFQ0hFQVAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAwMDAwMFVMCisjZGVmaW5lIFBST0NFU1NfX1NFVEtFWUNSRUFURSAgICAgICAgICAgICAgICAgICAgIDB4MTAwMDAwMDBVTAorI2RlZmluZSBQUk9DRVNTX19TRVRTT0NLQ1JFQVRFICAgICAgICAgICAgICAgICAgICAweDIwMDAwMDAwVUwKIAogI2RlZmluZSBJUENfX0NSRUFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxVUwKICNkZWZpbmUgSVBDX19ERVNUUk9ZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMlVMCkBAIC05NjYsNCArOTY4LDQgQEAKICNkZWZpbmUgS0VZX19TRUFSQ0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOFVMCiAjZGVmaW5lIEtFWV9fTElOSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTBVTAogI2RlZmluZSBLRVlfX1NFVEFUVFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwVUwKLQorI2RlZmluZSBLRVlfX0NSRUFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwVUwKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9vYmpzZWMuaCBiL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9vYmpzZWMuaAppbmRleCA4ZjU1NDdhLi5jZjU0YTMwIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvb2Jqc2VjLmgKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL29ianNlYy5oCkBAIC0zMiw2ICszMiw4IEBACiAJdTMyIHNpZDsgICAgICAgICAgICAgLyogY3VycmVudCBTSUQgKi8KIAl1MzIgZXhlY19zaWQ7ICAgICAgICAvKiBleGVjIFNJRCAqLwogCXUzMiBjcmVhdGVfc2lkOyAgICAgIC8qIGZzY3JlYXRlIFNJRCAqLworCXUzMiBrZXljcmVhdGVfc2lkOyAgIC8qIGtleWNyZWF0ZSBTSUQgKi8KKwl1MzIgc29ja2NyZWF0ZV9zaWQ7ICAvKiBmc2NyZWF0ZSBTSUQgKi8KIAl1MzIgcHRyYWNlX3NpZDsgICAgICAvKiBTSUQgb2YgcHRyYWNlIHBhcmVudCAqLwogfTsKIApkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9zZXEvc2VxX21lbW9yeS5oIGIvc291bmQvY29yZS9zZXEvc2VxX21lbW9yeS5oCmluZGV4IDM5YzYwZDkuLjYzZTkxNDMgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvc2VxL3NlcV9tZW1vcnkuaAorKysgYi9zb3VuZC9jb3JlL3NlcS9zZXFfbWVtb3J5LmgKQEAgLTMxLDcgKzMxLDcgQEAKIAlzdHJ1Y3Qgc25kX3NlcV9ldmVudF9jZWxsICpuZXh0OwkvKiBuZXh0IGNlbGwgKi8KIH07CiAKLS8qIGRlc2lnbiBub3RlOiB0aGUgcG9vbCBpcyBhIGNvbnRpZ2lvdXMgYmxvY2sgb2YgbWVtb3J5LCBpZiB3ZSBkeW5hbWljbHkKKy8qIGRlc2lnbiBub3RlOiB0aGUgcG9vbCBpcyBhIGNvbnRpZ3VvdXMgYmxvY2sgb2YgbWVtb3J5LCBpZiB3ZSBkeW5hbWljbHkKICAgIHdhbnQgdG8gYWRkIGFkZGl0aW9uYWwgY2VsbHMgdG8gdGhlIHBvb2wgYmUgYmV0dGVyIHN0b3JlIHRoaXMgaW4gYW5vdGhlcgogICAgcG9vbCBhcyB3ZSBuZWVkIHRvIGtub3cgdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgcG9vbCB3aGVuIHJlbGVhc2luZwogICAgbWVtb3J5LiAqLwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL0tjb25maWcgYi9zb3VuZC9vc3MvS2NvbmZpZwppbmRleCAwODBhYjAzLi4zYjhjZGJjIDEwMDY0NAotLS0gYS9zb3VuZC9vc3MvS2NvbmZpZworKysgYi9zb3VuZC9vc3MvS2NvbmZpZwpAQCAtMTE0LDggKzExNCw5IEBACiAJICB3aXRoIHRoZSBBQzk3IGNvZGVjLgogCiBjb25maWcgU09VTkRfQVUxNTUwX0FDOTcKLQl0cmlzdGF0ZSAiQXUxNTUwIEFDOTcgU291bmQiCi0JZGVwZW5kcyBvbiBTT1VORF9QUklNRSAmJiBTT0NfQVUxNTUwCisJdHJpc3RhdGUgIkF1MTU1MC9BdTEyMDAgQUM5NyBTb3VuZCIKKwlzZWxlY3QgU05EX0FDOTdfQ09ERUMKKwlkZXBlbmRzIG9uIFNPVU5EX1BSSU1FICYmIChTT0NfQVUxNTUwIHx8IFNPQ19BVTEyMDApCiAKIGNvbmZpZyBTT1VORF9UUklERU5UCiAJdHJpc3RhdGUgIlRyaWRlbnQgNERXYXZlIERYL05YLCBTaVMgNzAxOCBvciBBTGkgNTQ1MSBQQ0kgQXVkaW8gQ29yZSIKQEAgLTgzOCw2ICs4MzksNiBAQAogCWRlcGVuZHMgb24gU09VTkRfUFJJTUUgJiYgQ1BVX1NIMwogCiBjb25maWcgU09VTkRfU0hfREFDX0FVRElPX0NIQU5ORUwKLQlpbnQgIiAgICBEQUMgY2hhbm5lbCIKKwlpbnQgIkRBQyBjaGFubmVsIgogCWRlZmF1bHQgIjEiCiAJZGVwZW5kcyBvbiBTT1VORF9TSF9EQUNfQVVESU8KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9hdTE1NTBfYWM5Ny5jIGIvc291bmQvb3NzL2F1MTU1MF9hYzk3LmMKaW5kZXggOTAxMWFiZS4uNGNkYjg2MiAxMDA2NDQKLS0tIGEvc291bmQvb3NzL2F1MTU1MF9hYzk3LmMKKysrIGIvc291bmQvb3NzL2F1MTU1MF9hYzk3LmMKQEAgLTIxMyw3ICsyMTMsOCBAQAogCX0KIAlpZiAoaSA9PSBQT0xMX0NPVU5UKSB7CiAJCWVycigicmRjb2RlYzogcmVhZCBwb2xsIGV4cGlyZWQhIik7Ci0JCXJldHVybiAwOworCQlkYXRhID0gMDsKKwkJZ290byBvdXQ7CiAJfQogCiAJLyogd2FpdCBmb3IgY29tbWFuZCBkb25lPwpAQCAtMjI2LDcgKzIyNyw4IEBACiAJfQogCWlmIChpID09IFBPTExfQ09VTlQpIHsKIAkJZXJyKCJyZGNvZGVjOiByZWFkIGNtZHdhaXQgZXhwaXJlZCEiKTsKLQkJcmV0dXJuIDA7CisJCWRhdGEgPSAwOworCQlnb3RvIG91dDsKIAl9CiAKIAlkYXRhID0gYXVfcmVhZGwoUFNDX0FDOTdDREMpICYgMHhmZmZmOwpAQCAtMjM3LDYgKzIzOSw3IEBACiAJYXVfd3JpdGVsKFBTQ19BQzk3RVZOVF9DRCwgUFNDX0FDOTdFVk5UKTsKIAlhdV9zeW5jKCk7CiAKKyBvdXQ6CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOwogCiAJcmV0dXJuIGRhdGE7CkBAIC0xODkyLDYgKzE4OTUsOCBAQAogCiBNT0RVTEVfQVVUSE9SKCJBZHZhbmNlZCBNaWNybyBEZXZpY2VzIChBTUQpLCBkYW5AZW1iZWRkZWRlZGdlLmNvbSIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJBdTE1NTAgQUM5NyBBdWRpbyBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKwogCiBzdGF0aWMgaW50IF9fZGV2aW5pdAogYXUxNTUwX3Byb2JlKHZvaWQpCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS9taWRpLmMgYi9zb3VuZC9vc3MvZW11MTBrMS9taWRpLmMKaW5kZXggMjVhZThlNC4uOGFjNzdkZiAxMDA2NDQKLS0tIGEvc291bmQvb3NzL2VtdTEwazEvbWlkaS5jCisrKyBiL3NvdW5kL29zcy9lbXUxMGsxL21pZGkuYwpAQCAtNDUsNyArNDUsNyBAQAogI2luY2x1ZGUgIi4uL3NvdW5kX2NvbmZpZy5oIgogI2VuZGlmCiAKLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0sobWlkaV9zcGlubG9jayBfX2F0dHJpYnV0ZSgodW51c2VkKSkpOworc3RhdGljIERFRklORV9TUElOTE9DSyhtaWRpX3NwaW5sb2NrKTsKIAogc3RhdGljIHZvaWQgaW5pdF9taWRpX2hkcihzdHJ1Y3QgbWlkaV9oZHIgKm1pZGloZHIpCiB7CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvbXNuZC5jIGIvc291bmQvb3NzL21zbmQuYwppbmRleCA1ZGJmYzBmLi5iYTM4ZDYyIDEwMDY0NAotLS0gYS9zb3VuZC9vc3MvbXNuZC5jCisrKyBiL3NvdW5kL29zcy9tc25kLmMKQEAgLTQ3LDcgKzQ3LDcgQEAKIHN0YXRpYyBtdWx0aXNvdW5kX2Rldl90CQkqZGV2c1tNU05EX01BWF9ERVZTXTsKIHN0YXRpYyBpbnQJCQludW1fZGV2czsKIAotaW50IF9faW5pdCBtc25kX3JlZ2lzdGVyKG11bHRpc291bmRfZGV2X3QgKmRldikKK2ludCBtc25kX3JlZ2lzdGVyKG11bHRpc291bmRfZGV2X3QgKmRldikKIHsKIAlpbnQgaTsKIApkaWZmIC0tZ2l0IGEvc291bmQvb3NzL3NiX2Vzcy5jIGIvc291bmQvb3NzL3NiX2Vzcy5jCmluZGV4IGZhZTA1ZmUuLjE4MGU5NWMgMTAwNjQ0Ci0tLSBhL3NvdW5kL29zcy9zYl9lc3MuYworKysgYi9zb3VuZC9vc3Mvc2JfZXNzLmMKQEAgLTk3LDE5ICs5NywxOSBAQAogICoKICAqIFRoZSBkb2N1bWVudGF0aW9uIGlzIGFuIGFkdmVudHVyZTogaXQncyBjbG9zZSBidXQgbm90IGZ1bGx5IGFjY3VyYXRlLiBJCiAgKiBmb3VuZCBvdXQgdGhhdCBhZnRlciBhIHJlc2V0IHNvbWUgcmVnaXN0ZXJzIGFyZSAqTk9UKiByZXNldCwgdGhvdWdoIHRoZQotICogZG9jcyBzYXkgdGhlIHdvdWxkIGJlLiBJbnRlcnJlc3Rpbmcgb25lcyBhcmUgMHg3ZiwgMHg3ZCBhbmQgMHg3YS4gVGhleSBhcmUKLSAqIHJlbGF0ZWQgdG8gdGhlIEF1ZGlvIDIgY2hhbm5lbC4gSSBhbHNvIHdhcyBzdXByaXNlZCBhYm91dCB0aGUgY29uc2VxdWVuc2VzCisgKiBkb2NzIHNheSB0aGUgd291bGQgYmUuIEludGVyZXN0aW5nIG9uZXMgYXJlIDB4N2YsIDB4N2QgYW5kIDB4N2EuIFRoZXkgYXJlCisgKiByZWxhdGVkIHRvIHRoZSBBdWRpbyAyIGNoYW5uZWwuIEkgYWxzbyB3YXMgc3VycHJpc2VkIGFib3V0IHRoZSBjb25zZXF1ZW5jZXMKICAqIG9mIHdyaXRpbmcgMHgwMCB0byAweDdmICh3aGljaCBzaG91bGQgYmUgZG9uZSBieSByZXNldCk6IFRoZSBFUzE4ODcgbW92ZXMKICAqIGludG8gRVMxODg4IG1vZGUuIFRoaXMgbWVhbnMgdGhhdCBpdCBjbGFpbXMgSVJRIDExLCB3aGljaCBoYXBwZW5zIHRvIGJlIG15CiAgKiBJU0ROIGFkYXB0ZXIuIE5lZWRsZXNzIHRvIHNheSBpdCBubyBsb25nZXIgd29ya2VkLiBJIG5vdyB1bmRlcnN0YW5kIHdoeQogICogYWZ0ZXIgcmVib290aW5nIDB4N2YgYWxyZWFkeSB3YXMgMHgwNSwgdGhlIHZhbHVlIG9mIG15IGNob2ljZTogdGhlIEJJT1MKICAqIGRpZCBpdC4KICAqCi0gKiBPaCwgYW5kIHRoaXMgaXMgYW5vdGhlciB0cmFwOiBpbiBFUzE4ODcgZG9jcyBtaXhlciByZWdpc3RlciAweDcwIGlzIGRlY3JpYmVkCi0gKiBhcyBpZiBpdCdzIGV4YWN0bHkgdGhlIHNhbWUgYXMgcmVnaXN0ZXIgMHhhMS4gVGhpcyBpcyAqTk9UKiB0cnVlLiBUaGUKLSAqIGRlc2NyaXB0aW9uIG9mIDB4NzAgaW4gRVMxODY5IGRvY3MgaXMgYWNjdXJhdGUgaG93ZXZlci4KKyAqIE9oLCBhbmQgdGhpcyBpcyBhbm90aGVyIHRyYXA6IGluIEVTMTg4NyBkb2NzIG1peGVyIHJlZ2lzdGVyIDB4NzAgaXMKKyAqIGRlc2NyaWJlZCBhcyBpZiBpdCdzIGV4YWN0bHkgdGhlIHNhbWUgYXMgcmVnaXN0ZXIgMHhhMS4gVGhpcyBpcyAqTk9UKiB0cnVlLgorICogVGhlIGRlc2NyaXB0aW9uIG9mIDB4NzAgaW4gRVMxODY5IGRvY3MgaXMgYWNjdXJhdGUgaG93ZXZlci4KICAqIFdlbGwsIHRoZSBhc3N1bXB0aW9uIGFib3V0IEVTMTg2OSB3YXMgd3Jvbmc6IHJlZ2lzdGVyIDB4NzAgaXMgdmVyeSBtdWNoCi0gKiBsaWtlIHJlZ2lzdGVyIDB4YTEsIGV4Y2VwdCB0aGF0IGJpdCA3IGlzIGFsbHdheXMgMSwgd2hhdGV2ZXIgeW91IHdhbnQKKyAqIGxpa2UgcmVnaXN0ZXIgMHhhMSwgZXhjZXB0IHRoYXQgYml0IDcgaXMgYWx3YXlzIDEsIHdoYXRldmVyIHlvdSB3YW50CiAgKiBpdCB0byBiZS4KICAqCiAgKiBXaGVuIHVzaW5nIGF1ZGlvIDIgbWl4ZXIgcmVnaXN0ZXIgMHg3MiBzZWVtcyB0ZSBiZSBtZWFuaW5nbGVzcy4gT25seSAweGEyCkBAIC0xMTcsMTAgKzExNywxMCBAQAogICoKICAqIFNvZnR3YXJlIHJlc2V0IG5vdCBiZWluZyBhYmxlIHRvIHJlc2V0IGFsbCByZWdpc3RlcnMgaXMgZ3JlYXQhIEVzcGVjaWFsbHkKICAqIHRoZSBmYWN0IHRoYXQgcmVnaXN0ZXIgMHg3OCBpc24ndCByZXNldCBpcyBncmVhdCB3aGVuIHlvdSB3YW5uYSBjaGFuZ2UgYmFjawotICogdG8gc2luZ2xlIGRtYSBvcGVyYXRpb24gKHNpbXBsZXgpOiBhdWRpbyAyIGlzIHN0aWxsIG9wZXJhdGlvbiwgYW5kIHVzZXMgdGhlCi0gKiBzYW1lIGRtYSBhcyBhdWRpbyAxOiB5b3VyIGVzcyBjaGFuZ2VzIGludG8gYSBmdW5ueSBlY2hvIG1hY2hpbmUuCisgKiB0byBzaW5nbGUgZG1hIG9wZXJhdGlvbiAoc2ltcGxleCk6IGF1ZGlvIDIgaXMgc3RpbGwgb3BlcmF0aW9uYWwsIGFuZCB1c2VzCisgKiB0aGUgc2FtZSBkbWEgYXMgYXVkaW8gMTogeW91ciBlc3MgY2hhbmdlcyBpbnRvIGEgZnVubnkgZWNobyBtYWNoaW5lLgogICoKLSAqIFJlY2VpdmVkIHRoZSBuZXcgdGhhdCBFUzE2ODggaXMgZGV0ZWN0ZWQgYXMgYSBFUzE3ODguIERpZCBzb21lIHRoaW5raW5nOgorICogUmVjZWl2ZWQgdGhlIG5ld3MgdGhhdCBFUzE2ODggaXMgZGV0ZWN0ZWQgYXMgYSBFUzE3ODguIERpZCBzb21lIHRoaW5raW5nOgogICogdGhlIEVTMTg4NyBkZXRlY3Rpb24gc2NoZW1lIHN1Z2dlc3RzIGluIHN0ZXAgMiB0byB0cnkgaWYgYml0IDMgb2YgcmVnaXN0ZXIKICAqIDB4NjQgY2FuIGJlIGNoYW5nZWQuIFRoaXMgaXMgaW5hY2N1cmF0ZSwgZmlyc3QgSSBpbnZlcnRlZCB0aGUgKiBjaGVjazogIklmCiAgKiBjYW4gYmUgbW9kaWZpZWQsIGl0J3MgYSAxNjg4Iiwgd2hpY2ggbGVhZCB0byBhIGNvcnJlY3QgZGV0ZWN0aW9uCkBAIC0xMzUsNyArMTM1LDcgQEAKICAqIEFib3V0IHJlY29nbml0aW9uIG9mIEVTUyBjaGlwcwogICoKICAqIFRoZSBkaXN0aW5jdGlvbiBvZiBFUzY4OCwgRVMxNjg4LCBFUzE3ODgsIEVTMTg4NyBhbmQgRVMxODg4IGlzIGRlc2NyaWJlZCBpbgotICogYSAocHJlbGltaW5hcnkgPz8pIGRhdGFzaGVldCBvbiBFUzE4ODcuIEl0J3MgYWltIGlzIHRvIGlkZW50aWZ5IEVTMTg4NywgYnV0CisgKiBhIChwcmVsaW1pbmFyeSA/PykgZGF0YXNoZWV0IG9uIEVTMTg4Ny4gSXRzIGFpbSBpcyB0byBpZGVudGlmeSBFUzE4ODcsIGJ1dAogICogZHVyaW5nIGRldGVjdGlvbiB0aGUgdGV4dCBjbGFpbXMgdGhhdCAidGhpcyBjaGlwIG1heSBiZSAuLi4iIHdoZW4gYSBzdGVwCiAgKiBmYWlscy4gVGhpcyBzY2hlbWUgaXMgdXNlZCB0byBkaXN0aW5jdCBiZXR3ZWVuIHRoZSBhYm92ZSBjaGlwcy4KICAqIEl0IGFwcGVhcnMgaG93ZXZlciB0aGF0IHNvbWUgUG5QIGNoaXBzIGxpa2UgRVMxODY4IGFyZSByZWNvZ25pemVkIGFzIEVTMTc4OApAQCAtMTU2LDkgKzE1Niw5IEBACiAgKgogICogVGhlIGV4aXN0aW5nIEVTMTY4OCBzdXBwb3J0IGRpZG4ndCB0YWtlIGNhcmUgb2YgdGhlIEVTMTY4OCsgcmVjb3JkaW5nCiAgKiBsZXZlbHMgdmVyeSB3ZWxsLiBXaGVuZXZlciBhIGRldmljZSB3YXMgc2VsZWN0ZWQgKHJlY21hc2spIGZvciByZWNvcmRpbmcKLSAqIGl0J3MgcmVjb3JkaW5nIGxldmVsIHdhcyBsb3VkLCBhbmQgaXQgY291bGRuJ3QgYmUgY2hhbmdlZC4gVGhlIGZhY3QgdGhhdAorICogaXRzIHJlY29yZGluZyBsZXZlbCB3YXMgbG91ZCwgYW5kIGl0IGNvdWxkbid0IGJlIGNoYW5nZWQuIFRoZSBmYWN0IHRoYXQKICAqIGludGVybmFsIHJlZ2lzdGVyIDB4YjQgY291bGQgdGFrZSBjYXJlIG9mIFJFQ0xFViwgZGlkbid0IHdvcmsgbWVhbmluZyB1bnRpbAotICogaXQncyB2YWx1ZSB3YXMgcmVzdG9yZWQgZXZlcnkgdGltZSB0aGUgY2hpcCB3YXMgcmVzZXQ7IHRoaXMgcmVzZXQgdGhlCisgKiBpdHMgdmFsdWUgd2FzIHJlc3RvcmVkIGV2ZXJ5IHRpbWUgdGhlIGNoaXAgd2FzIHJlc2V0OyB0aGlzIHJlc2V0IHRoZQogICogdmFsdWUgb2YgMHhiNCB0b28uIEkgZ3Vlc3MgdGhhdCdzIHdoYXQgNGZyb250IGFsc28gaGFkIChoYXZlPykgdHJvdWJsZSB3aXRoLgogICoKICAqIEFib3V0IEVTMTg4NyBzdXBwb3J0OgpAQCAtMTY5LDkgKzE2OSw5IEBACiAgKiB0aGUgbGF0dGVyIGNhc2UgdGhlIHJlY29yZGluZyB2b2x1bWVzIGFyZSAwLgogICogTm93IHJlY29yZGluZyBsZXZlbHMgb2YgaW5wdXRzIGNhbiBiZSBjb250cm9sbGVkLCBieSBjaGFuZ2luZyB0aGUgcGxheWJhY2sKICAqIGxldmVscy4gRnV0aGVybW9yZSBzZXZlcmFsIGRldmljZXMgY2FuIGJlIHJlY29yZGVkIHRvZ2V0aGVyICh3aGljaCBpcyBub3QKLSAqIHBvc3NpYmxlIHdpdGggdGhlIEVTMTY4OC4KKyAqIHBvc3NpYmxlIHdpdGggdGhlIEVTMTY4OCkuCiAgKiBCZXNpZGVzIHRoZSBzZXBhcmF0ZSByZWNvcmRpbmcgbGV2ZWwgY29udHJvbCBmb3IgZWFjaCBpbnB1dCwgdGhlIGNvbW1vbgotICogcmVjb3JkaWcgbGV2ZWwgY2FuIGFsc28gYmUgY29udHJvbGxlZCBieSBSRUNMRVYgYXMgZGVzY3JpYmVkIGFib3ZlLgorICogcmVjb3JkaW5nIGxldmVsIGNhbiBhbHNvIGJlIGNvbnRyb2xsZWQgYnkgUkVDTEVWIGFzIGRlc2NyaWJlZCBhYm92ZS4KICAqCiAgKiBOb3Qgb25seSBFUzE4ODcgaGF2ZSB0aGlzIHJlY29yZGluZyBtaXhlci4gSSBrbm93IHRoZSBmb2xsb3dpbmcgZnJvbSB0aGUKICAqIGRvY3VtZW50YXRpb246CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvY3M1NTM1YXVkaW8vY3M1NTM1YXVkaW9fcGNtLmMgYi9zb3VuZC9wY2kvY3M1NTM1YXVkaW8vY3M1NTM1YXVkaW9fcGNtLmMKaW5kZXggZjBhNDg2OS4uNTQ1MGE5ZSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2NzNTUzNWF1ZGlvL2NzNTUzNWF1ZGlvX3BjbS5jCisrKyBiL3NvdW5kL3BjaS9jczU1MzVhdWRpby9jczU1MzVhdWRpb19wY20uYwpAQCAtMTQzLDcgKzE0Myw3IEBACiAJaWYgKGRtYS0+cGVyaW9kcyA9PSBwZXJpb2RzICYmIGRtYS0+cGVyaW9kX2J5dGVzID09IHBlcmlvZF9ieXRlcykKIAkJcmV0dXJuIDA7CiAKLQkvKiB0aGUgdTMyIGNhc3QgaXMgb2theSBiZWNhdXNlIGluIHNuZCpjcmVhdGUgd2Ugc3VjY2VzZnVsbHkgdG9sZAorCS8qIHRoZSB1MzIgY2FzdCBpcyBva2F5IGJlY2F1c2UgaW4gc25kKmNyZWF0ZSB3ZSBzdWNjZXNzZnVsbHkgdG9sZAogICAgCSAgIHBjaSBhbGxvYyB0aGF0IHdlJ3JlIG9ubHkgMzIgYml0IGNhcGFibGUgc28gdGhlIHVwcHBlciB3aWxsIGJlIDAgKi8KIAlhZGRyID0gKHUzMikgc3Vic3RyZWFtLT5ydW50aW1lLT5kbWFfYWRkcjsKIAlkZXNjX2FkZHIgPSAodTMyKSBkbWEtPmRlc2NfYnVmLmFkZHI7CmRpZmYgLS1naXQgYS91c3IvTWFrZWZpbGUgYi91c3IvTWFrZWZpbGUKaW5kZXggMTlkNzRlNi4uZTkzODI0MiAxMDA2NDQKLS0tIGEvdXNyL01ha2VmaWxlCisrKyBiL3Vzci9NYWtlZmlsZQpAQCAtMjEsOCArMjEsNyBAQAogICAgICAgICAgICAgICAgICAgICAkKENPTkZJR19JTklUUkFNRlNfU09VUkNFKSwtZCkKIHJhbWZzLWFyZ3MgIDo9IFwKICAgICAgICAgJChpZiAkKENPTkZJR19JTklUUkFNRlNfUk9PVF9VSUQpLCAtdSAkKENPTkZJR19JTklUUkFNRlNfUk9PVF9VSUQpKSBcCi0gICAgICAgICQoaWYgJChDT05GSUdfSU5JVFJBTUZTX1JPT1RfR0lEKSwgLWcgJChDT05GSUdfSU5JVFJBTUZTX1JPT1RfR0lEKSkgXAotICAgICAgICAkKHJhbWZzLWlucHV0KQorICAgICAgICAkKGlmICQoQ09ORklHX0lOSVRSQU1GU19ST09UX0dJRCksIC1nICQoQ09ORklHX0lOSVRSQU1GU19ST09UX0dJRCkpCiAKICMgLmluaXRyYW1mc19kYXRhLmNwaW8uZ3ouZCBpcyB1c2VkIHRvIGlkZW50aWZ5IGFsbCBmaWxlcyBpbmNsdWRlZAogIyBpbiBpbml0cmFtZnMgYW5kIHRvIGRldGVjdCBpZiBhbnkgZmlsZXMgYXJlIGFkZGVkL3JlbW92ZWQuCg==